glpk-5.0/0000755000062000006210000000000013766377270011513 5ustar maomkpasswdglpk-5.0/aclocal.m40000644000062000006210000010422713766346220013350 0ustar maomkpasswd# generated automatically by aclocal 1.12.5 -*- Autoconf -*- # Copyright (C) 1996-2012 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.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # Copyright (C) 2002-2012 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.12' 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.12.5], [], [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.12.5])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-2012 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-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # 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"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each '.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. # 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], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated. For more info, see: http://www.gnu.org/software/automake/manual/automake.html#Modernize-AM_INIT_AUTOMAKE-invocation]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl dnl Support for Objective C++ was only introduced in Autoconf 2.65, dnl but we still cater to Autoconf 2.62. m4_ifdef([AC_PROG_OBJCXX], [AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])])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-2012 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-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it 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 ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2001-2012 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-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} 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([m4/libtool.m4]) m4_include([m4/ltoptions.m4]) m4_include([m4/ltsugar.m4]) m4_include([m4/ltversion.m4]) m4_include([m4/lt~obsolete.m4]) glpk-5.0/AUTHORS0000644000062000006210000000313513766346220012554 0ustar maomkpasswdThe GLPK package was developed and programmed by Andrew Makhorin, Department for Applied Informatics, Moscow Aviation Institute, Moscow, Russia. E-mail: Paper mail: 125871, Russia, Moscow, Volokolamskoye sh., 4, Moscow Aviation Institute, Andrew O. Makhorin -----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1.2.2 (MingW32) mQGiBD8UdT8RBAC6yWYxoa1b7U973J0jBuQpgZnhXlGJJpMZgAW9efDBD17vhkJm hPVOQBKRUeOOLcW3/a7NMoNLMdmF1Rgz1FPVy3RgBDsYj4Sp4RBCsX/o0xXh+jxe gncr4bdN0Ruk03pezVtLi9oYygdxfI51SsjZ2vwYP6BhMwv+xrIgcnc4qwCgoCit 26mTd0FoGOmsQuipo6X5LaUD/1l7NqFIjiGdWthyG3TqsiK5Ew7xF3fLEABXKPjb PMRTMucX8XXHmW8RUD1vP1uGDnEn6s+fjc3/RtaqKjqGMdLt4XgHQkImaVguNpSS IxN3LaK600BgAbwSd1bomRqWNlczAM7469VvGG9ASpCBveUUrqwerHZcUbvngL62 pIcqA/41dO0xYrOTqMRhuguYMgHL2xbwB2Aj2TqRwBm697DIS25B9nE+8UsbjGRx q3EmeuHeZ5kN5RbESXkGUB8whIcYxvH16HRNmM1ZjmFoBVL2Z6S2gpa2ZUqsq7BZ s+hriElm3dfOQCt79/o852uKWu5bSjw2yiemVA2T8tG4OoN6DrQjQW5kcmV3IE1h a2hvcmluIDxtYW9AbWFpMi5yY25ldC5ydT6IWwQTEQIAGwUCPxR1PwYLCQgHAwID FQIDAxYCAQIeAQIXgAAKCRDRe/IwWYHoGKpHAJ44MmzWKr8OiTc0Bb6/RD56aekp 3wCdGznQMCfWFkehQPbeNaB5yFIs+8a5AQ0EPxR1UBAEAO3U3H5M0iYv06C4kKty 6ReWyYH4CzMAfp2lPVUKzRSjPtoAJ6SkrBSKMT+U+DahxZ4K4HbinvHq3uvlwWax xw0wKxJl4oY6EGE1Jqn3B//Ak47RaNMnrs9V739WT1YNRpQvh4wOCeMekBzksf43 hm4dSV4PMQkLmrEeG2+BYaZnAAMFA/4tVHhjGRkxzcTcfHCB+Yo3PXeIQMuIs00c VKCrNReLni/3BWZC0w9tFzZSdz+URXefPWDGuAC16vLCVOD06NcIQGutPe189dUn Kf9Bl6qc9DyWsxSTdF/PbLqcLfEe9g7fHhIwdY+w/hSq2n3NEURMzHiMT1U3CvHd As5IzV/yD4hGBBgRAgAGBQI/FHVQAAoJENF78jBZgegYRZEAmwReJkMSrbs0EQs2 wjyTCMd5KDh3AKCR2/RvVad9RT3ShYnUiPPYTL2/Nw== =OfLQ -----END PGP PUBLIC KEY BLOCK----- glpk-5.0/autogen.sh0000700000062000006210000000126313766346220013473 0ustar maomkpasswd#!/bin/sh ######################################################################## # Run this script on the top level of GLPK directory to regenerate the # configure script and the Makefiles from templates. # # NOTE: You need to have GNU autotools installed. ######################################################################## set -e test -f configure.ac || { echo "You should run this script on the top level of GLPK directory." exit } echo "Executing libtoolize..." libtoolize -c -f echo "Executing aclocal..." aclocal -I m4 echo "Executing autoconf..." autoconf echo "Executing automake..." automake -c -a echo "Done." echo "See file INSTALL for installation instructions." glpk-5.0/ChangeLog0000644000062000006210000041514213766346220013263 0ustar maomkpasswdWed Dec 16 10:00:00 2020 Andrew Makhorin * GLPK 5.0 (43:1:3) has been released. The copyright was transferred to the Free Software Foundation. To fix some licensing problems the routines in the following files were disabled by replacing with dummy ones that print an error message: * src/api/gridgen.c * src/api/netgen.c * src/api/rmfgen.c * src/misc/qmd.c * src/misc/relax4.c Note that this change does not affect the main faunctionality of the package. *src/draft/glpios01.c:1395 A bug was fixed for the case n = 0. The following modules were renamed to simplify maintenance. * src/draft/glphbm.h RENAMED -> src/misc/hbm.h * src/draft/glphbm.c RENAMED -> src/misc/hbm.c * src/draft/glprgr.h RENAMED -> src/misc/rgr.h * src/draft/glprgr.c RENAMED -> src/misc/rgr.c * src/draft/glpspm.h RENAMED -> src/misc/spm.h * src/draft/glpspm.c RENAMED -> src/misc/spm.c Thu Feb 16 10:00:00 2018 Andrew Makhorin * GLPK 4.65 (43:0:3) has been released. * src/glpk.h, src/api/npp.c New API routines for LP/MIP preprocessing were added: glp_npp_alloc_wksp allocate the preprocessor workspace glp_npp_load_prob load original problem instance glp_npp_preprocess1 perform basic LP/MIP preprocessing glp_npp_build_prob build resultant problem instance glp_npp_postprocess postprocess solution to resultant problem glp_npp_obtain_sol obtain solution to original problem glp_npp_free_wksp free the preprocessor workspace See doc/npp.txt for detailed description of these API routines. * examples/nppsamp.c An example program to demonstrate using of LP/MIP preprocessor was added. The following modules were renamed to simplify maintenance. * src/draft/glpnpp.h RENAMED -> src/npp/npp.h * src/draft/glpnpp01.c RENAMED -> src/npp/npp1.c * src/draft/glpnpp02.c RENAMED -> src/npp/npp2.c * src/draft/glpnpp03.c RENAMED -> src/npp/npp3.c * src/draft/glpnpp04.c RENAMED -> src/npp/npp4.c * src/draft/glpnpp05.c RENAMED -> src/npp/npp5.c * src/draft/glpnpp06.c RENAMED -> src/npp/npp6.c * src/bflib/fvs.h RENAMED -> src/misc/fvs.h * src/bflib/fvs.c RENAMED -> src/misc/fvs.c * src/draft/glpios.h RENAMED -> src/draft/ios.h * src/cglib/ RENAMED -> src/intopt/ * src/draft/glpios10.c RENAMED -> src/intopt/fpump.c * src/glpk.h, src/intopt/covgen.c A new, more robust implementation of locally valid simple cover cuts was included in the MIP solver. * src/draft/ios.h, src/draft/glpios01.c, src/draft/glpios03.c These modules were changed to use the new cover cut generator. * src/misc/ks.c, src/misc/ks.h Routines to solve 0-1 knapsack problem (used by the new cover cut generator) were added. * src/misc/mt1.c, src/misc/mt1.h, src/misc/mt1.f Routines to solve 0-1 knapsack problem with Martello & Toth algorithm (used by the new cover cut generator) were added. (The original Fortran 77 code mt1.f is included for reference purposes only.) * src/draft/glpapi09.c The API routine glp_init_iocp was changed to enable long-step dual simplex by default. * src/api/cplex.c The internal routine col_name routine was changed to construct a fake column name depending on the column's attributes. * examples/glpsol.c A new option --hide was added. This option removes all symbolic names from the model being processed. * src/env/stdc.h CDECL macro was added. (This macro is defined by config.h only on building the GLPK DLL with MSVC.) The following modules affected by this change were changed: * src/api/cpxbas.c * src/draft/glpios11.c * src/intopt/cfg1.c * src/intopt/fpump.c * src/intopt/gmigen.c * src/intopt/mirgen.c * src/misc/wclique1.c * src/simplex/spxchuzr.c * src/simplex/spychuzc.c Sat Dec 02 12:00:00 2017 Andrew Makhorin * GLPK 4.64 (42:3:2) has been released. * src/simplex/spydual.c The internal routine play_coef of the dual simplex solver was changed to perform more aggressive perturbation to prevent dual degeneracy and avoid stalling even if the current dual basic solution is strongly feasible (mainly if the objective is zero, so all reduced costs are always zero). Thanks to David Monniaux for bug report. * src/draft/glpssx.h, glpssx02.c, glpapi07.c The exact simplex solver routines were changed to perform terminal output according to the verbosity level (specified by the control parameter smcp.msg_lev). Thanks to Jeroen Demeyer for bug report. * src/simplex/spxchuzr.c The directive #include was added. Thanks to Heinrich Schuchardt for bug report. * examples/graceful.mod An example model in MathProg was added. Thanks to Mike Appleby for contribution. * examples/powpl25h.mod powplant.mod wolfra6d.lp wolfra6d.mod Three example models in MathProg and one in Cplex LP format were added. Thanks to Peter Naszvadi for contribution. Tue Jul 25 12:00:00 2017 Andrew Makhorin * GLPK 4.63 (42:2:2) has been released. * src/simplex/spxchuzr.h, src/simplex/spxchuzr.c An experimental feature (phase I long-step ratio test) was included in the primal simplex solver. * src/simplex/spxprim.c, src/simplex/spydual.c An internal scaling of the objective coefficients was added to the primal and dual simplex solvers. * src/simplex/spxprim.c A minor bug was fixed (correction of flags of fixed non-basic variables after removing the perturbation). * src/glpk.h, src/glpapi06.c New smcp parameters were added (not documented yet): int excl (default: GLP_ON) Internal simplex solver option: GLP_ON - exclude fixed non-basic variables from the working LP; GLP_OFF - keep original variables in the working LP. int shift (default: GLP_ON) Internal simplex solver option: GLP_ON - shift bounds of variables in the working LP tow. zero; GLP_OFF - keep original bounds of variables in the working LP. int aorn (default: GLP_USE_NT) Internal simplex solver option: GLP_USE_AT - use A matrix in sparse row-wise format; GLP_USE_NT - use N matrix in sparse row-wise format. Parameter out_frq was changed to specify the output frequency in milliseconds rather than in simplex iterations. src/env/time.c The Posix version of glp_time was replaced by new one, which doesn't use gmtime functions to improve portability. Thanks to Rob Schroeder for bug report. src/spv.c, src/spv.h These files were moved to src/cglib/, since they are used only in the MIR cuts generator. examples/life_goe.mod, examples/tiling.mod, examples/toto.mod Three new example models in MathProg were added. Thanks to Peter Naszvadi for contribution. Wed Jun 14 12:00:00 2017 Andrew Makhorin * GLPK 4.62 (42:1:2) has been released. * src/simplex/spxprim.c An experimental feature (bound perturbation) to improve numerical stabilty and avoid cycling was included in the primal simplex solver. Currently it is enabled by default. * src/simplex/spxprim.c Some dense vectors were replaced by sparse ones in full-vector storage (FVS) format. * src/simplex/spxprim.c, src/simplex/spydual.c Assertions trow[q] != 0.0 and tcol[p] != 0.0 were replaced by setting an error code to prevent abnormal termination. Thanks to Chris Matrakidis for patch. * src/simplex/spydual.c Removing perturbation was added if the perturbed problem is dual infeasible while the original one is dual feasible. Thanks to Chris Matrakidis for patch. * src/api/mps.c A range bug was fixed. Thanks to Chris Matrakidis for patch. * src/minisat/minisat.c Changes were made to provide 64-bit portability. Thanks to Chris Matrakidis for patch. * src/api/minisat1.c Changes related to the minisat solver were made. Thanks to Chris Matrakidis for patch. * src/api/intfeas1.c Changes were made to skip objective integrality check when no objective bound is specified. Thanks to Chris Matrakidis for patch. * src/glphbm.c, src/glprgr.c, src/env/stream.c, src/env/time.c, * src/mpl/mpl5.c, src/mpl/mpl6.c, src/mpl/mplsql.c Calls to non-thread-safe functions gmtime, strerror, and strtok were replaced by calls to corresponding thread-safe equivalents (gmtime_r, strerror_r, and strtok_r for GNU/Linux). * w32/*.def, w64/*.def glp_config symbol was added. Thanks to Heinrich Schuchardt for bug report. * examples/pbn/pbn.mod A bug was fixed (model didn't work for odd number of rows or columns). Thanks to Chris Matrakidis for bug report and patch provided. Sun Jan 22 12:00:00 2017 Andrew Makhorin * GLPK 4.61 (42:0:2) has been released. The following modules were renamed to simplify maintenance. * src/prob.h RENAMED -> src/api/prob.h * src/glpapi01.c RENAMED -> src/api/prob1.c * src/glpapi02.c RENAMED -> src/api/prob2.c * src/glpapi03.c RENAMED -> src/api/prob3.c * src/glpapi04.c RENAMED -> src/api/prob4.c * src/glpapi05.c RENAMED -> src/api/prob5.c * src/env/tls.c TLS (thread local storage class specifier) option was added; see comments in tls.c for details. * configure.ac, config.h.in Test for TLS was added. Thanks to David Monniaux for suggestion and Chris Matrakidis for patch. * src/env/tls.c Dll support was added. Thanks to Heinrich Schuchardt for contribution. The following modules were changed to add __cdecl specifier for functions passed to qsort (this is needed only on compiling GLPK with MSVC to run under MS Windows). * src/api/cpxbas.c * src/cglib/cfg1.c * src/cglib/gmigen.c * src/cglib/mirgen.c * src/misc/wclique1.c * src/simplex/spychuzc.c * src/glpios10.c * src/glpios11.c * examples/glpsol.c * src/glpk.h, src/env/env.c The API routine glp_version was changed to avoid initialization of the GLPK environment. The new API routine glp_config was added (but not documented yet). Thanks to Heinrich Schuchardt for suggestion. * INSTALL Description of the configure option '--with-zlib' was removed. Thanks to Balaco Baco for bug report. Fri Apr 01 12:00:00 2016 Andrew Makhorin * GLPK 4.60 (41:0:1) has been released. * src/glpk.h Declarations of all non-documented API routines were hidden by #ifdef GLP_UNDOC / #endif. src/simplex/spydual.c An experimental feature (objective coefficient perturbation) to improve numerical stabilty and avoid cycling was included in the dual simplex solver. This release also includes all the changes made in 4.59.2 and 4.59.1 non-official test releases (see below). Fri Mar 18 12:00:00 2016 Andrew Makhorin * GLPK 4.59.2 (40:1:0) has been released. NOTE: THIS IS A NON-OFFICIAL TEST RELEASE. src/simplex/spxprim.c Improvements were made in the internal routine choose_pivot to prevent choosing a too small pivot in the primal simplex. src/simplex/spydual.c Improvements were made in the internal routine choose_pivot to prevent choosing a too small pivot in the dual simplex. src/simplex/spychuzc.c The internal routine spy_eval_bp was added to determine break- points of the dual objective function. src/simplex/spydual.c An experimental feature (long-step ratio test) was included in the dual simplex. src/glpk.h, src/glpapi06.c The GLP_RT_FLIP option (long-step ratio test) was added to the simplex solver. Currently it affects only the dual simplex. For the primal simplex it is equivalent to GLP_RT_HAR. src/examples/glpsol.c The '--flip' command-line option was added to glpsol (long-step dual ratio test). src/proxy/proxy1.c Additional check was added to reject wrong solutions somwtimes reported by the PROXY heuristic. src/glpios10.c A bug (memory leak) was fixed in the FPUMP heuristic routine. Thanks to for bug report. Tue Mar 15 12:00:00 2016 Andrew Makhorin * GLPK 4.59.1 (40:1:0) has been released. NOTE: THIS IS A NON-OFFICIAL BUG-FIX RELEASE. * src/simplex/mpl6.c, src/simplex/sql.c, src/simplex/sql.h The header sql.h was renamed to avoid conflicts with standard ODBC headers. Thanks to Noli Sicad for bug report. * src/simplex/spychuzc.c, src/simplex/spychuzc.h Minor changes were made. Fri Mar 11 12:00:00 2016 Andrew Makhorin * GLPK 4.59 (40:0:0) has been released. * src/sgf.c, src/sgf.h The routines sgf_reduce_nuc and sgf_factorize were changed to correctly report structural singularity. * src/glpios01.c The routine ios_solve_node was changed to retry solving node problem in case of the simplex solver failure. Thanks to Chris Matrakidis for patch. * src/glpios03.c The routine ios_driver was changed to correctly process the root node. Thanks to Chris Matrakidis for patch. * src/glpios06.c Some improvements were made in the MIR cut generation routines. Thanks to Chris Matrakidis for patch. The following source modules were splitted/renamed to simplify maintenance. * src/glpios04.c RENAMED -> src/spv.c * src/glpios05.c glp_gmi_cut (new) -> src/cglib/gmicut.c * src/glpios05.c glp_gmi_gen (new) -> src/cglib/gmigen.c * src/glpios05.c REMOVED * src/glpios06.c glp_mir_init (new) -> src/cglib/mirgen.c * src/glpios06.c glp_mir_gen (new) -> src/cglib/mirgen.c * src/glpios06.c glp_mir_free (new) -> src/cglib/mirgen.c * src/glpios06.c REMOVED * src/glpios08.c glp_cfg_init (new) -> src/cglib/cfg2.c * src/glpios08.c glp_cfg_free (new) -> src/cglib/cfg2.c * src/glpios08.c glp_clq_cut (new) -> src/cglib/clqcut.c * src/glpios08.c REMOVED * src/glpmpl.h RENAMED -> src/mpl/mpl.h * src/glpmpl01.c RENAMED -> src/mpl/mpl1.c * src/glpmpl02.c RENAMED -> src/mpl/mpl2.c * src/glpmpl03.c RENAMED -> src/mpl/mpl3.c * src/glpmpl04.c RENAMED -> src/mpl/mpl4.c * src/glpmpl05.c RENAMED -> src/mpl/mpl5.c * src/glpmpl06.c RENAMED -> src/mpl/mpl6.c * src/glpsql.h RENAMED -> src/mpl/sql.h * src/glpsql.c RENAMED -> src/mpl/sql.c * src/proxy/proxy.c Minor bug was fixed in the PROXY heuristic routine. Thanks to Chris Matrakidis for bug report. * src/cglib/gmicut.c, src/glpk.h New API routine glp_gmi_cut was added (not documented yet). * src/cglib/gmigen.c, src/glpk.h New API routine glp_gmi_gen was added (not documented yet). * src/cglib/mirgen.c, src/glpk.h New API routines glp_mir_init, glp_mir_gen, and glp_mir_free were added (not documented yet). * src/cglib/cfg2.c, src/glpk.h New API routines glp_cfg_init and glp_cfg_free were added (not documented yet). * src/cglib/clqcut.c, src/glpk.h New API routine glp_clq_cut was added (not documented yet). * src/api/rdcc.c, src/api/wrcc.c API routines glp_read_graph and glp_write_graph were changed due to changes in the data format. For details see the document "GLPK: Graph and Network Routines". * src/api/rdgr.c, src/api/wrgr.c, src/glpsdf.c, src/glpsdf.h Old versions of API routines glp_read_graph and glp_write_graph were removed. * doc/gmpl_pt-BR.tex, doc/gmpl_pt-BR.pdf Translation of the document "Modeling Language GNU MathProg" to Brazilian Portuguese (pt-BR) was included (in LaTeX and pdf formats). Thanks to Joao Flavio de Freitas Almeida for contribution. Thu Feb 18 12:00:00 2016 Andrew Makhorin * GLPK 4.58 (39:0:0) has been released. * src/misc/dimacs.c, src/misc/dimacs.h Routines to read data files in DIMACS format were implemented as a separate module. The following source modules were splitted/renamed to simplify maintenance. * src/glpapi11.c glp_print_sol -> src/api/prsol.c * src/glpapi11.c glp_read_sol -> src/api/rdsol.c * src/glpapi11.c glp_write_sol -> src/api/wrsol.c * src/glpapi11.c glp_print_ipt -> src/api/pript.c * src/glpapi11.c glp_read_ipt -> src/api/rdipt.c * src/glpapi11.c glp_write_ipt -> src/api/wript.c * src/glpapi11.c glp_print_mip -> src/api/prmip.c * src/glpapi11.c glp_read_mip -> src/api/rdmip.c * src/glpapi11.c glp_write_mip -> src/api/wrmip.c * src/glpapi11.c glp_print_ranges -> src/api/prrngs.c * src/glpapi11.c REMOVED * src/glpapi14.c RENAMED -> src/api/mpl.c * src/glpapi15.c glp_read_graph -> src/api/rdgr.c * src/glpapi15.c glp_write_graph -> src/api/wrgr.c * src/glpapi15.c REMOVED * src/glpapi16.c glp_weak_comp -> src/api/weak.c * src/glpapi16.c glp_strong_comp -> src/api/strong.c * src/glpapi16.c glp_top_sort -> src/api/topsort.c * src/glpapi16.c REMOVED * src/glpapi17.c glp_mincost_lp -> src/api/mcflp.c * src/glpapi17.c glp_mincost_okalg -> src/api/mcfokalg.c * src/glpapi17.c glp_mincost_relax4 -> src/api/mcfrelax.c * src/glpapi17.c glp_maxflow_lp -> src/api/maxflp.c * src/glpapi17.c glp_maxflow_ffalg -> src/api/maxffalg.c * src/glpapi17.c glp_check_asnprob -> src/api/ckasn.c * src/glpapi17.c glp_asnprob_lp -> src/api/asnlp.c * src/glpapi17.c glp_asnprob_okalg -> src/api/asnokalg.c * src/glpapi17.c glp_asnprob_hall -> src/api/asnhall.c * src/glpapi17.c glp_cpp -> src/api/cpp.c * src/glpapi17.c REMOVED * src/glpapi18.c glp_wclique_exact -> src/api/wcliqex.c * src/glpapi18.c REMOVED * src/glpapi19.c RENAMED -> src/api/minisat1.c * src/glpapi20.c RENAMED -> src/api/intfeas1.c * src/glpapi21.c RENAMED -> examples/glpsol.c * src/glpcpx.c RENAMED -> src/api/cplex.c * src/glpdmx.c glp_read_mincost -> src/api/rdmcf.c * src/glpdmx.c glp_write_mincost -> src/api/wrmcf.c * src/glpdmx.c glp_read_maxflow -> src/api/rdmaxf.c * src/glpdmx.c glp_write_maxflow -> src/api/wrmaxf.c * src/glpdmx.c glp_read_asnprob -> src/api/rdasn.c * src/glpdmx.c glp_write_asnprob -> src/api/wrasn.c * src/glpdmx.c glp_read_ccdata -> src/api/rdcc.c * src/glpdmx.c glp_write_ccdata -> src/api/wrcc.c * src/glpdmx.c glp_read_prob -> src/api/rdprob.c * src/glpdmx.c glp_write_prob -> src/api/wrprob.c * src/glpdmx.c glp_read_cnfsat -> src/api/rdcnf.c * src/glpdmx.c glp_write_cnfsat -> src/api/wrcnf.c * src/glpdmx.c glp_check_cnfsat -> src/api/ckcnf.c * src/glpdmx.c REMOVED * src/glpgmp.c RENAMED -> src/misc/mygmp.c * src/glpini01.c RENAMED -> src/api/advbas.c * src/glpini02.c RENAMED -> src/api/cpxbas.c * src/glpmps.c RENAMED -> src/api/mps.c * src/glpnet03.c RENAMED -> src/api/netgen.c * src/glpnet04.c RENAMED -> src/api/gridgen.c * src/glpnet05.c RENAMED -> src/api/rmfgen.c The following source modules were changed due to changes in the data formats: * src/api/rdsol.c * src/api/wrsol.c * src/api/rdipt.c * src/api/wript.c * src/api/rdmip.c * src/api/wrmip.c * src/glpk.h New API routines were added: glp_mpl_init_rand (not documented yet), glp_time, glp_difftime. The API routine glp_main (glpsol main routine) was removed. * src/glpmpl.h, src/glpmpl01.c, src/glpmpl03.c The function tan (trigonometric tangent) was added to MathProg. Thanks to Chris Matrakidis for patch. * src/simplex/spydual.c A minor typo in dual simplex (GLP_EITLIM instead of GLP_ETMLIM) was fixed. Thanks to Chris Matrakidis for patch. * src/glpapi09.c, src/glpios01.c, src/glpios03.c A time limit problem was fixed. Thanks to Chris Matrakidis for patch. * doc/gmpl_es.tex, doc/gmpl_es.pdf A new version of the document "Modeling Language GNU MathProg" in Spanish was included (in LaTeX and pdf formats). Thanks to Pablo Yapura for contribution. * configure.ac A check to determine if libtool needs '-no-undefined' flag to build shared libraries on some platforms was added. Thanks to Marco Atzeri and Heinrich Schuchardt for suggestion. * autogen.sh A script to regenerate the configure script and the Makefiles was added. Thanks to Heinrich Schuchardt . * w32/glpk.def, w64/glpk.def 'glp_at_error' symbol was added to the export list. Thanks to Heinrich Schuchardt for bug report. Sun Nov 08 12:00:00 2015 Andrew Makhorin * GLPK 4.57 (38:0:2) has been released. * src/simplex/spy*.* New, more efficient implementation of the dual simplex method was included in the package. * src/simplex/spxprim.c Incorrect directive #ifdef USE_AT was changed to #if USE_AT. * src/simplex/simplex.h New header for simplex-based drivers was added. * src/glpspx02.c Old implementation of the dual simplex method was removed from the package. * src/glpspx.h Old header for simplex-based drivers was removed. * src/glpapi06.c Call to spx_dual was changed to spy_dual. tol_piv = 1e-10 in glp_init_smcp was changed to 1e-9 (this new tolerance seems to be more adequate for new implementations of the primal and dual simplex methods). * src/glpk.h, src/glpapi09.c, src/glpios03.c Option iocp.sr_heur to enable/disable simple rounding heuristic was added. Thanks to Chris Matrakidis for suggestion. * src/env/env.h src/env/error.c API routine glp_at_error was added and documented. Thanks to Jeroen Demeyer for suggestion. * src/glpapi19.c Translation of MiniSat solver (src/minisat) from C++ to C is made by a non-skilled programmer who converts pointers to ints and vice versa, so MiniSat works on 32-bit platforms only. Fixing this portability issue would require rewriting the code, so currently to prevent crashing the API routine glp_minisat1 was changed just to report failure if 64-bit version of GLPK is used. Thanks to Heinrich Schuchardt for bug report. * doc/glpk.tex, doc/gmpl.tex Some material was added according to changes in GLPK API. Also some minor typos were corrected. Thanks to Anton Voropaev for typo report. * w32/makefiles, w64/makefiles Option /Zi was added to pass to MSVC compiler. examples/tsp/*.* An example application program TSPSOL was added. This program is intended to solve the Symmetric Traveling Salesman Problem. For more details see examples/tsp/README. Thu Oct 01 12:00:00 2015 Andrew Makhorin * GLPK 4.56 (37:3:1) has been released. * src/simplex/*.c, *.h New, more efficient and robust implementation of the primal simplex method was included in the package. * src/glpspx01.c Old implementation of the primal simplex method was removed from the package. * src/bflib/sgf.c A bug was fixed in routine sgf_reduce_nuc. (The bug appeared if the basis matrix was structurally singular.) Thanks to Martin Jacob for bug report. * w32/*.*, w64/*.* Scripts to build GLPK with Microsoft Visual Studio 2015 were added. Thanks to Xypron for contribution and testing. Fri Aug 22 12:00:00 2014 Andrew Makhorin * GLPK 4.55 (37:2:1) has been released. * src/bflib/luf.c, src/bflib/luf.h Two routines luf_vt_solve1 and luf_estimate_norm were added to estimate 1-norm of matrix inverse. * src/bflib/btf.c, src/bflib/btf.h Two routines btf_at_solve1 and btf_estimate_norm were added to estimate 1-norm of block triangular matrix inverse. * src/bflib/fhvint.c, src/bflib/fhvint.h The routine fhvint_estimate was added to estimate 1-norm of the basis matrix inverse (FHV-factorization). * src/bflib/scfint.c, src/bflib/scfint.h The routine scfint_estimate was added to estimate 1-norm of the basis matrix inverse (Schur-complement-based factorization). * src/bfd.c, src/bfd.c The routine bfd_condest was added to estimate the condition of the basis matrix. * src/bflib/scfint.h The prefix '_glp' was added to keep the namespace clean. * src/env/stream.c Two open modes "a" and "ab" were added. Thanks to Pedro P. Wong for bug report. * src/glpapi21.c (glpsol) Minor bug was fixed (command-line options --btf, --cbg, --cgr didn't work properly). * src/bflib/sgf.c A serious bug was fixed in a basis factorization routine used on the dense phase. (The bug might appear only if the number of rows exceeded sqrt(2**31) ~= 46,340 and caused access violtaion exception because of integer overflow.) Thanks to Mark Meketon for bug report. * doc/glpk.tex Two API routines glp_alloc and glp_realloc were documented. Thanks to Brian Gladman for suggestion. * doc/gmpl_es.tex, doc/gmpl_es.pdf Translation of the document "Modeling Language GNU MathProg" to Spanish was included (in LaTeX and pdf formats). Thanks to Pablo Yapura for contribution. Fri Mar 28 12:00:00 2014 Andrew Makhorin * GLPK 4.54 (37:1:1) has been released. * src/bflib/fhvint.h, fhvint.c Some technical changes were made. * src/bflib/btf.h, btf.c, btfint.h, btfint.c The module BTF was added to the package. It implements sparse block triangular factorization of a square non-singular matrix and is based on LU-factorization (see the LUF module). * src/bflib/scf.h, scf.c, scfint.h, scfint.c The module SCF was added to the package. It implements sparse factorization of a square non-singular matrix based on Schur complement and LU-factorization (plain or block triangular; see the LUF and BTF modules). * src/bfd.c LP basis factorization driver was changed to use most recent versions of the FHV and SCF modules. * src/glplpf.h, glplpf.c Old version of the Schur-complement-based factorization module was removed from the package. * src/glpk.h New flags GLP_BF_LUF, GLP_BF_BTF were added for glp_bfcp. * src/glpapi12.c The API routines glp_get_bfcp, glp_set_bfcp were replaced due to new version of the BFD module. * src/glpapi21.c New command-line options --luf, --btf, --ft, --cbg, and --cgr were added for the glpsol solver. * src/* According to a new version of the GNU Coding Standards in all messages a grave accent character (`) was replaced by a single apostrophe character ('). * src/glpapi09.c mip status bug was fixed. Thanks to Remy Roy for bug report. * doc/glpk.tex Some comments about invalidating the basis factorization were added. Thanks to Xypron for suggestion. * configure.ac "iodbc-config --cflags" was added to detect iodbc flags. Thanks to Sebastien Villemot for patch. Thu Feb 13 12:00:00 2014 Andrew Makhorin * GLPK 4.53 (37:0:1) has been released. * src/glpmps.c (glp_read_mps) The code was changed to remove free rows at the end. * src/glpcpx.c (glp_read_lp) A bug was fixed (explicit bounds for binaries not set). Thanks to Gabriel Hackebeil for bug report. * src/glpenv07.c (z_fgetc) A bug was fixed (Z_STREAM_END -> Z_OK). Thanks to Achim Gaedke for bug report. * src/glpenv07.c Replaced by src/env/stream.c. * src/glpenv08.c Replaced by src/env/dlsup.c. * src/bflib/ifu.h, src/bflib/ifu.c Re-implemented. * src/glpscf.h, src/glpscf.c Replaced by IFU. * src/glplpf.h, src/glplpf.c Changed due to IFU. * src/glpbfd.c Changed due to LPF. * src/glpapi06.c Two API routines glp_get_it_cnt and glp_set_it_cnt were added. Thanks to Joey Rios for suggestion. * src/glplpx.h, src/glplpx01.c, src/glplpx02.c, src/glplpx03.c All obsolete API routines were completely removed. * examples/oldapi/lpx.h, examples/oldapi/lpx.c A set of routines that simulate the old GLPK API (as defined in 4.48) were added. Thanks to Jan Engelhardt for suggestion. * src/zlib/* zlib 1.2.7 was downgraded to zlib 1.2.5 (from glpk 4.50) due to bugs detected in zlib 1.2.7 on some 64-bit platforms. Thanks to Carlo Baldassi for bug report. * src/glpsql.c Alignment bug was fixed. Thanks to Xypron for suggestion. * src/glpsql.c #include and #include were commented out to fix a namespace bug on compiling with MariaDB. Thanks to Xypron for suggestion. Sun Jul 28 12:00:00 2013 Andrew Makhorin * GLPK 4.52.1 (36:1:0) has been released. * src/Makefile.am Version information bug was fixed. Thanks to Sebastien Villemot for bug report. * src/proxy/proxy.c A minor bug (incorrect use of glp_term_out) was fixed. * src/glpios03.c The simple rounding heuristic routine was changed to check only global constraints. * src/glpcpx.c The code was changed to issue the warning message 'lower/upper bound redefined' only once. Thu Jul 18 12:00:00 2013 Andrew Makhorin * GLPK 4.52 (36:0:1) has been released. * src/misc/wclique1.h, src/misc/wclique1.c Greedy heuristic to find maximum weight clique was implemented. * src/cglib/cfg.h, src/cglib/cfg.c, src/cglib/cfg1.c Conflict graph routines (used to generate clique cuts) were implemented. * src/glpios08.c New version of the clique cut generator was implemented. Now it is able to efficiently process very large and/or dense conflict graphs. Old rudimentary version was removed from the package. * examples/misp1.dat, examples/misp2.dat Two data files for the maximum independent set problem (MISP) were added to illustrate efficiency of using the clique cuts. * src/glpios03.c Simple rounding heuristic applied for every node subproblem was implemented. * proxy/proxy.c Some bugs were fixed in the proximity search heuristic routine. Thanks to Giorgio Sartor <0gioker0@gmail.com>. * src/glpapi21.c New command-line option '--proxy [nnn]' was added to glpsol to enable using the proximity search heuristic. * src/glpspx02.c A feature was added to switch to the primal simplex in case of stalling due to dual degeneracy (for GLP_DUALP only). * src/glpmps.c A bug (incorrect processing of LI column indicator) was fixed in the mps format reading routine. Thanks to Charles Brixko for bug report. Wed Jun 19 12:00:00 2013 Andrew Makhorin * GLPK 4.51 (36:0:0) has been released. * src/bflib/sgf.c, src/bflib/sgf.h Singleton and dense phases of sparse Gaussian factorizer were implemented. * src/bflib/lufint.c, src/bflib/lufint.h Interface routines to LU-factorization were added. * src/bflib/fhvint.c, src/bflib/fhvint.h Interface routines to FHV-factorization were changed to use lufint.c routines. * src/glplpf.c, src/glplpf.h Routines implementing Schur-complement version of the LP basis factorization were changed to use lufint.c routines. * src/glpbfd.c, src/glpbfd.h Interface routines to the LP basis factorization were changed due to changes in glplpf.c routines. * src/glpluf.c, src/glpluf.c Old version of LU-factorization was removed from the package. (This old version was used for 10 years since 3.0.6.) * src/misc/triang.c, src/misc/triang.h Routine to find maximal triangular part of rectangular matrix was added. * src/glpini01.c The API routine glp_adv_basis that constructs advanced initial LP basis was replaced by an improved version, which (unlike the old version) takes into account numerical values of constraint coefficients. * src/proxy/* Routines that implement the proximity search heuristic for MIP were added. Thanks to Giorgio Sartor <0gioker0@gmail.com> for contribution. * src/glpk.h iocp.ps_heur was added to enable/disable proxy heuristic. * glpsol --proxy command-line option was added. * src/zlib/*.* zlib general purpose compression library, version 1.2.7, was ANSIfied and modified according to GLPK requirements and included in the distribution as an external software module. This version replaced the old one (1.2.5). For details please see src/zlib/README. * src/glpk.h, src/env/time.c The API routine glp_time was changed to return double rather than glp_long. * src/glplib02.c Routines that implement glp_long type (64-bit arithmetic) were removed from the package. * src/glpk.h, src/env/alloc.c New API routine glp_alloc was added. It makes obsolete two API routines glp_malloc and glp_calloc which were replaced by macros to use glp_alloc (hence 36:0:0). * src/glpios10.c A bug was fixed that caused numerical instability in the FPUMP heuristic (the bug was introduced in glpk 4.40). Fri May 24 12:00:00 2013 Andrew Makhorin * GLPK 4.50 (35:0:0) has been released * src/Makefile.am Though API was not changed since 4.49, symbols _glp_lpx_* were removed from the export list, hence 35:0:0. * src/glpfhv.h, src/glpfhv.c Old routines for FHV-factorization were removed. * src/bflib/*.h, src/bflib/*.c New version of basis factorization routines, including routines for FHV-factorization, were added. * src/glpbfd.c LP basis factorization driver was changed according to the new routines for FHV-factorization. * doc/glpk.tex Some clarifications about using the name index routines were added. Thanks to Xypron for suggestion. * doc/gmpl.tex Some typos were corrected. Thanks to Jeffrey Kantor for report. * src/glprlx.c A serious bug was *tentatively* fixed. This bug is inherited from the original Fortran version of the RELAX-IV code. Unfortunately, the code is very intricate, so this bug is still under investigation. Thanks to Sylvain Fournier for bug report. RELAX-IV bug details -------------------- In the original RELAX-IV code there are four similar fragments in subroutines ascnt1 and ascnt2 like this: C C DECREASE THE PRICES OF THE SCANNED NODES BY DELPRC. C ADJUST FLOW TO MAINTAIN COMPLEMENTARY SLACKNESS WITH C THE PRICES. C NB = 0 DO 6 I=1,NSAVE . . . IF (RC(ARC).EQ.0) THEN DELX=DELX+U(ARC) NB = NB + 1 PRDCSR(NB) = ARC END IF . . . On some instances the variable NB becomes greater than N (the number of nodes) that leads to indexing error, because the array PRDCSR is declared as array of N elements (more precisely, as array of MAXNN elements, however, NB becomes even much greater than MAXNN). Tue Apr 16 12:00:00 2013 Andrew Makhorin * GLPK 4.49 (34:0:0) has been released * glprlx.c, glprlx.h C version of the Fortran code RELAX-IV (relaxation method of Bertsekas and Tseng) was added. * glpapi17.c API routine glp_mincost_relax4, which is a driver to RELAX-IV code, was added and documented. * glpnet03.c API routine glp_netgen_prob (Klingman's standard network problems) was added and documented. * glpapi12.c A bug (wrong dual feasibility test) was fixed in API routine glp_warm_up. Thanks to David T. Price for bug report. * glpapi10.c Obsolete API routine lpx_check_kkt was replaced by API routine glp_check_kkt. * glpk.h All old API routines whose names begin with 'lpx_' were removed from API and no more available. * glpk.tex, graphs.tex These documents were essentially reformatted. Mon Jan 28 12:00:00 2013 Andrew Makhorin * GLPK 4.48 (33:0:0) has been released * src/glpmps.c A bug in glp_write_mps was fixed. Thanks to Raniere Gaia Costa da Silva for bug report. * glpk.h glp_prob declaration changed (now it is incomplete struct); glp_tree declaration changed (now it is incomplete struct); glp_tran declaration changed (now it is incomplete struct); glp_long declaration removed; glp_time declaration removed; glp_difftime removed from API; glp_data removed from API; glp_sdf_* removed from API; glp_mem_usage declaration changed (glp_long -> size_t); glp_realloc declaration added (not documented yet). * glpenv.h, glpenv05.c Dynamic memory allocation routines were reimplemented. * glpk.h, glpnet03.c Routine glp_netgen_prob was added (not documented yet). * configure.ac Check for gmp.h was added. Thanks to Heinrich Schuchardt for suggestion. * w32/glpk.def, w64/glpk.def Changes were made to export only API symbols. Fri Sep 09 12:00:00 2011 Andrew Makhorin * GLPK 4.47 (32:0:32) has been released * src/glpapi20.c New API routine glp_infeas1 to solve 0-1 feasibility problem was added and documented (see doc/cnfsat.pdf). * src/glpnpp06.c Some new preprocessor routines for SAT-CNF encoding, which are used by the routine glp_intfeas1, were added. * src/glpnpp.h The header was modified due to additions. * src/glpapi21.c The glpsol solver was modified to bypass model postprocessing if the solution reported is neither optimal nor feasible. * src/glpapi21.c New glpsol options (--minisat and --objbnd) were added. * examples/pbn/*.* The paint-by-numbers puzzle model (pbn.mod) was modified to print solution in PostScript format and to check for multiple solutions. Some benchmark examples from encoded in MathProg were included in the distribution. For more details see examples/pbn/README and examples/pbn/pbn.pdf. * examples/Makefile.am A minor bug was fixed to correctly build glpk in a separate directory. Thanks to Marco Atzeri for bug report. Tue Aug 09 12:00:00 2011 Andrew Makhorin * GLPK 4.46 (31:0:31) has been released * src/glpk.h, src/Makefile glpk.h was relocated from 'include' to 'src', and 'include' subdir was removed; src/Makefile.am was changed appropriately. * src/zlib/*.* zlib general purpose compression library, version 1.2.5, was ANSIfied and modified according to GLPK requirements and included in the distribution as an external software module. For details see src/zlib/README. * src/glpdmx.c The following new API routines were added: glp_read_cnfsat - read CNF-SAT problem data in DIMACS format glp_check_cnfsat - check for CNF-SAT problem instance glp_write_cnfsat - write CNF-SAT problem data in DIMACS format * src/minisat/*.* MiniSat, a CNF-SAT solver, version 1.14.1, was ANSIfied and modified according to GLPK requirements and included in the distribution as an external software module. For details see minisat/README and minisat/LICENSE. * src/glpapi19.c The API routine glp_minisat1, which is a driver to the MiniSat solver, was included in the package. * doc/satcnf.* The document "CNF Satisfiability Problem" was included in the package. It is a supplement to the GLPK Reference Manual. * src/glpapi20.c New glpsol options (--cnf, --wcnf, and --minisat) was added. * glpsql.c Some bugs were fixed. Thanks to Xypron . Sun Dec 05 12:00:00 2010 Andrew Makhorin * GLPK 4.45 (30:0:30) has been released * glplpx01.c A bug (it_cnt) in routine reset_parms was fixed. Thanks to Ali Baharev for report. * glpmpl03.c A bug (print "text\") was fixed. Thanks to Xypron for report. * glpsql.c A precision bug was fixed. Thanks to Xypron . * glpk.tex Some typos were corrected. Thanks to Robbie Morrison . Thu Jun 03 12:00:00 2010 Andrew Makhorin * GLPK 4.44 (29:0:29) has been released * glpapi14.c glpmpl.h glpmpl01.c glpmpl03.c glpmpl04.c Implemented suffixes for variables and constraints. * glpmpl06.c Made changes to allow comment records in CSV files. * glpapi17.c Added and documented new API routine glp_cpp to solve Critical Path Problem. Sat Feb 20 12:00:00 2010 Andrew Makhorin * GLPK 4.43 (28:0:28) has been released * glplib.h, glplib.c, glpenv.h, glpenv.c The module glpenv was split into two modules glpenv and glplib. * glpenv01.c, glpenv03.c, glpenv04.c, glpenv06.c The following new API routines were added and documented: glp_init_env, glp_free_env, glp_open_tee, glp_close_tee, glp_error (macro), glp_difftime. * glpapi16.c New API routine glp_top_sort (topological sorting of ayclic digraph) was added and documented. * glpapi17.c A serious bug was fixed in the routine glp_asn_prob_hall. * glpnpp05.c A bug was fixed in the LP/MIP preprocessor (hidden covering inequalities). * glpsql.c Some improvements were made in the table driver (NULL data). Thanks to Xypron for contribution. * configure.ac Changes were made to use .dylib rather than .so under Mac OS. Thanks to Noli Sicad for testing Wed Jan 13 12:00:00 2010 Andrew Makhorin * GLPK 4.42 (27:0:27) has been released * glpapi01.c, glpapi11.c, glpapi12.c, glpdmx.c The following new API routines were added and documented: glp_check_dup (check for duplicate elements in sparse matrix); glp_sort_matrix (sort elements of the constraint matrix); glp_read_prob (read problem data in GLPK format); glp_write_prob (write problem data in GLPK format); glp_analyze_bound (analyze active bound of non-basic variable); glp_analyze_coef (analyze obj. coefficient at basic variable); glp_print_ranges (print sensitivity analysis report; replaces lpx_print_sens_bnds). * glpapi20.c New command-line options were added to glpsol: --glp (read problem data in GLPK format); --wglp (write problem data in GLPK format); --lp (replaces --cpxlp); --wlp (replaces --wcpxlp); --ranges (print sensitivity analysis report). * glpapi06.c In the routine glp_init_smcp default value of the parameter out_frq was changed to 500 (it was 200). * glpipp.h, glpipp01.c, glpipp02.c The old MIP preprocessor module was removed. * glpapi09.c Now the MIP solver uses the new MIP preprocessor (NPP). * glplpx03.c lpx_write_opb was disabled due to replacing IPP with NPP. * glpnet09.c Kellerman's heuristic to cover edges by cliques was added. * glplib08.c Recognition of special filenames "/dev/stdin", "/dev/stdout", and "/dev/stderr" was added. * glpk.tex Chapter "Graph and network routines" was carried out from the reference manual as a separate document. Mon Dec 21 12:00:00 2009 Andrew Makhorin * GLPK 4.41 (26:0:26) has been released * glpapi12.c The following new API routines were added: glp_transform_row (replaces lpx_transform_row); glp_transform_col (replaces lpx_transform_col); glp_prim_rtest (replaces lpx_prim_ratio_test); glp_dual_rtest (replaces lpx_dual_ratio_test). Note that values returned by glp_prim_rtest and glp_dual_rtest differ from the ones retutned by the deprecated routines. * glpnpp*.* The LP/MIP preprocessor was essentially re-implemented. * glpios03.c The feature to remove inactive cuts from the active subproblem was implemented. * glpios11.c The feature processing cuts stored in the cut pool was improved (now it uses estimation of objective degradation). * glpscg.* Obsolete implemetation of the conflict graph was removed. * glpmpl.h, glpmpl03.c, glpmpl04.c FILE was replaced by XFILE to allow using GLPK I/O routines. * glpsql.c, examples/sql, doc/tables.tex The SQL table driver was changed to allow multiple arguments separated by semicolon in SQL statements. Thanks to Xypron . * glpk.h, glpapi14.c New API routine glp_time was added (not documented yet). * glpapi20.c Two new options were added to glpsol: --seed value (initialize pseudo-random number generator used in MathProg model with specified seed value), and --ini filename (use as initial basis previously saved with -w option). * examples/xyacfs.mod Thanks to Nigel Galloway for contribution. * examples/dbf/*.* Thanks to Noli Sicad for contribution. * w32/*.*, w64/*.* Scripts to build GLPK with Microsoft Visual Studio 2010 were added. Thanks to Xypron for contribution and testing. Tue Nov 03 12:00:00 2009 Andrew Makhorin * GLPK 4.40 (25:0:25) has been released * glpdmx.c Two new API routines were added: glp_read_ccdata (read graph in DIMACS clique/coloring format); glp_write_ccdata (write graph in DIMACS clique/coloring format). Also an example file examples/sample.col was added. * glpapi19.c, glpnet08.c New API routine glp_wclique_exact was added. It is intended to find a maximum weight clique with the exact algorithm developed by Prof. P. Ostergard. * glpnpp02.c A bug was fixed in the LP preprocessor (routine npp_empty_col). Thanks to Stefan Vigerske for the bug report. * glpios10.c A bug was fixed and some improvements were made in the FPUMP heuristic module. Thanks to Xypron . * glpapi12.c A bug was fixed in the API routine glp_warm_up (dual feasibility test was incorrect in maximization case). Thanks to Uday Venkatadri for the bug report. * glpapi16.c Two new API routines were added: glp_del_vertices (remove vertices from graph); glp_del_arc (remove arc from graph). * glpios09.c The hybrid pseudocost branching heuristic was included in the MIP solver. It is available on API level (iocp.br_tech should be set to GLP_BR_PCH) and in the stand-alone solver glpsol (via the command-line option --pcost). This heuristic may be useful on solving hard MIP instances. * glpios03.c The branching heuristic by Driebeck and Tomlin (used in the MIP solver by default) was changed to switch to branching on most fractional variable if an lower bound of degradation of the objective is close to zero for all branching candidates. Sun Jul 26 12:00:00 2009 Andrew Makhorin * GLPK 4.39 (24:0:24) has been released * glpsdf.c New API routines to read plain data files were added. * glpcpx.h, glpini.h, glpscl.h These headers were removed. * glpcpx.c API routines glp_read_lp and glp_write_lp to read/write files in CPLEX LP format were re-implemented. Now glp_write_lp correctly writes double-bounded (ranged) rows by introducing slack variables rather than by duplicating the rows. The data structure glp_cpxcp and routine glp_init_cpxcp were added. * amd/* The 'xfree(NULL)' bug was fixed in the AMD routines. Thanks to Niels Klitgord for the bug report. * glpapi16.c New API routines glp_set_vertex_name, glp_create_v_index, glp_find_vertex, and glp_delete_v_index were added. * glpdmx.c New API routines glp_read_asnprob, glp_write_asnprob, glp_read_ccformat, and glp_write_ccformat were added (the two latter routines are not documented yet). * glpapi18.c New API routines glp_check_asnprob, glp_asnprob_lp, glp_asnprob_okalg, and glp_asnprob_hall were added. * glpini01.c, glpini02.c The message "Crashing..." was changed to "Constructing initial basis..." due to suggestion by Thomas Kahle . * glpapi14.c New API routines glp_printf, glp_vprintf, glp_malloc, glp_calloc, glp_free, and glp_assert were added. * glplpp.h, glplpp01.c, glplpp02.c Old LP presolver routines were removed. Now glp_simplex uses new preprocessing routines (see glpnpp). * glpapi12.c New API routine glp_warm_up was added; it replaces the routine lpx_warm_up. Sat May 02 12:00:00 2009 Andrew Makhorin * GLPK 4.38 (23:0:23) has been released * glpmps.c API routines to read/write MPS files were re-implemented. * glpspx02.c Some improvements were made in the dual simplex routine. * glpk.h New structure glp_iptcp was added. * glpnpp.h, glpnpp01.c, glpnpp02.c New LP/MIP preprocessor. Currently it includes only some basic routines and used only in the interior-point solver. * glpapi08.c API routine glp_interior was replaced by an improved version (new LP/MIP preprocessor, new ordering algorithms). New API routine glp_init_iptcp was added. API routine glp_ipt_status may return two new statuses due to changes in glp_interior. * glpsol.c New command-line options were added (ordering algorithm used in the interior-point solver). * amd/*.*, colamd/*.* Two external software modules AMD and COLAMD/SYMAMD used in the interior-point solver were included in the distribution. For details see amd/README and colamd/README. * glpnet03.c, glpnet04.c, glpnet05.c A minor bug was fixed (_G => G_). Thanks to Nelson H. F. Beebe for bug report. Sun Mar 29 12:00:00 2009 Andrew Makhorin * GLPK 4.37 (22:0:22) has been released * glpk.h iocp.fp_heur was added to enable/disable fpump heuristic. * glpios10.c ios_feas_pump was added (feasibility pump heuristic). * glpsol.c --fpump command-line option was added. * glpsds.c Plain data set routines were added to facilitate reading plain data in application programs. Currently these routines are not in API, though declared in glpk.h. * glpapi08.c A bug was fixed in the internal routine restore. (Due to this bug dual solution components were computed incorrectly if the problem was scaled.) * glpapi10.c, glpapi11.c The following new API routines were added: glp_print_sol (replaces lpx_print_sol); glp_print_ipt (replaces lpx_print_ips); glp_print_mip (replaces lpx_print_mip); _glp_check_kkt (replaces lpx_check_kkt, lpx_check_int). Now the routine lpx_print_prob (deprecated) is equivalent to the routine glp_write_lp. * glpapi18.c, glpapi19.c The following new API routines were added: glp_read_graph (read graph from plain text file); glp_write_graph (write graph to plain text file); glp_weak_comp (find all weakly connected components); glp_strong_comp (find all strongly connected components). * configure.ac, Makefile.am Changes were made: (a) to allow using autoreconf/autoheader; (b) to allow building glpk in a directory other than its source directory. Thanks to Marco Atzeri for bug report. * examples/shiftcover.mod An example model in MathProg was added. Thanks to Larry D'Agostino for contribution. Fri Feb 06 12:00:00 2009 Andrew Makhorin * GLPK 4.36 (21:0:21) has been released * glpnet06.c, glpnet07.c, glpapi19.c The following new API routines were added: glp_mincost_okalg find minimum-cost flow with out-of-kilter algorithm glp_maxflow_ffalg find maximal flow with Ford-Fulkerson algorithm * glpsol.c Two new command-line options were added: --mincost read min-cost flow data in DIMACS format --maxflow read maximum flow data in DIMACS format * doc/glpk.* New edition of the reference manual was included. * glpk.h Duplicate symbols were removed to allow using swig. Thanks to Kelly Westbrooks and Nigel Galloway for suggestion. * glpcpx.c A minor defect was fixed in the routine glp_write_lp. Thanks to Sebastien Briais for bug report. * glpsql.c A minor bug was fixed. Thanks to Xypron for patch. * examples/hashi.mod, examples/shikaku.mod Two example models in MathProg were added. Thanks to Sebastian Nowozin for contribution. * examples/qfit.mod, examples/yacfs.mod Two example models in MathProg were added. Thanks to Nigel Galloway for contribution. Fri Jan 09 12:00:00 2009 Andrew Makhorin * GLPK 4.35 (20:0:20) has been released * glpk.h, glpapi.c, glpnet.c The following new API routines were added: glp_create_graph create graph glp_set_graph_name assign (change) graph name glp_add_vertices add new vertices to graph glp_add_arc add new arc to graph glp_erase_graph erase graph content glp_delete_graph delete graph glp_read_mincost read minimum cost flow problem data in DIMACS format glp_write_mincost write minimum cost flow problem data in DIMACS format glp_mincost_lp convert minimum cost flow problem to LP glp_netgen Klingman's network problem generator glp_gridgen grid-like network problem generator glp_read_maxflow read maximum flow problem data in DIMACS format glp_write_maxflow write maximum flow problem data in DIMACS format glp_maxflow_lp convert maximum flow problem to LP glp_rmfgen Goldfarb's maximum flow problem generator * doc/glpk.* New edition of the reference manual was included. * examples/sample.min, examples/sample.max Two example data files in DIMACS format were added. * glplib04.c The statement "if (c = '\n') fflush(stdout)" was added to the internal routine xputc to provide "real-time" terminal output. Thanks to Luiz Bettoni for suggestion. * glpmpl05.c A minor bug was fixed in the internal routine mpl_fn_time2str. Thanks to Stefan Vigerske for bug report. * w32/makefile, w64/makefile The flag -O2 (/O2) was added to some makefiles. Thu Dec 04 12:00:00 2008 Andrew Makhorin * GLPK 4.34 (19:0:19) has been released * src/glpios03.c A bug was fixed in the internal routine branch_on. Thanks to Nigel Galloway for bug report. * src/glpmpl05.c Three new MathProg functions were included: gmtime obtaining current calendar time str2time converting character string to calendar time time2str converting calendar time to character string Thanks to Xypron . * doc/glpk.*, doc/gmpl.* A new edition of the GLPK reference manual and GNU MathProg language description were included. Thu Oct 30 12:00:00 2008 Andrew Makhorin * GLPK 4.33 (18:0:18) has been released * glpapi*.* The following new API routines were added: glp_copy_prob copy problem object content glp_exact solve LP in exact arithmetic (makes lpx_exact deprecated) glp_get_unbnd_ray determine variable causing unboundedness (makes lpx_get_ray_info deprecated) glp_interior solve LP with interior-point method (makes lpx_interior deprecated) * glpapi*.* The following new API routines for processing models written in the GNU Mathprog language were added to the package: glp_mpl_alloc_wksp allocate the translator workspace glp_mpl_read_model read and translate model section glp_mpl_read_data read and translate data section glp_mpl_generate generate the model glp_mpl_build_prob build LP/MIP instance from the model glp_mpl_postsolve postsolve the model glp_mpl_free_wksp deallocate the translator workspace (These routines make lpx_read_model deprecated.) * src/glpapi17.c, examples/glpsol.c The stand-alone solver glpsol was re-implemented with new API routines. * src/glpsql.c Some bugs were fixed in the SQL table driver. Thanks to Xypron . * examples/cplex/*.* A crude implementation of CPLEX-like interface to GLPK API was added to the package. See examples/cplex/README. Fri Oct 03 12:00:00 2008 Andrew Makhorin * GLPK 4.32 (17:0:17) has been released * glpmpl01.c A bug was fixed. Due to this bug iterated expressions having an indexing expression whose dummy indices are bound to some values, i.e. like sum{(i+1,j,k-1) in E} x[i,j,k] are evaluated incorrectly. Namely, current value of such expressions is not invalidated when corresponding dummy indices (like i and k in the example above) are changed, that erroneously results in the same value evaluated for the first time. * glpios03.c Euclidean reduction of the local objective bound was added in the routine glpios03.c. * glpapi11.c The following new branch-and-cut API routines were added: glp_ios_row_attr determine additional row attributes; glp_ios_pool_size determine current size of the cut pool; glp_ios_add_row add constraint to the cut pool; glp_ios_del_row delete constraint from the cut pool; glp_ios_clear_pool delete all constraints from the cut pool. * glpapi08.c The following new features were included in the branch-and-cut solver (the API routine glp_intopt): MIP presolver; mixed cover cut generator; clique cut generator. Due to the MIP presolver glp_intopt may additionally return GLP_ENOPFS and GLP_ENODFS, if primal or dual infeasibility of LP relaxation is detected by the presolver. Also the return code GLP_EMIPGAP was introduced to correctly indicate that the mip gap tolerance is reached. * glplpx01.c Now the obsolete API routines lpx_integer and lpx_intopt are completely superseded by the API routine glp_intopt that makes them deprecated. * glpmpl05.c Now the table driver name "iODBC" can be specified as "ODBC". * glpmpl03.c A bug fixed in the routine free_dca. Thanks to Xypron . * glpsql.c A bug was fixed in the SQL table driver. Thanks to Xypron . * examples/glpsol.c Changes were made to allow multiple MathProg data files. * doc/glpk.* A new edition of the GLPK reference manual was included. * doc/tables.* A new edition of the supplement "Using data tables in the GNU MathProg language" was included. Tue Sep 02 12:00:00 2008 Andrew Makhorin * GLPK 4.31 (16:0:16) has been released * glpspx.h, glpspx01.c, glpspx02.c, glpapi06.c The dual simplex solver (spx_dual_opt) was replaced by a new implementation of the two-phase dual simplex method (spx_dual). Old simplex method routines (spx_prim_opt, spx_prim_feas, and spx_dual_opt) were removed from the package. * glpk.h, glpscl.h, glpscl.c, glpapi04.c New API routine glp_scale_prob was added. It replaces routine lpx_scale_prob which is deprecated. * glpk.h, glpini.h, glpini01.c, glpini02.c, glpapi05.c New API routines glp_std_basis, glp_adv_basis, glp_cpx_basis were added. They replace routines lpx_std_basis, lpx_adv_basis, lpx_cpx_basis which are deprecated. * glpdmp.c 8-byte data alignment was added to the module (sufficient for both ILP32 and LP64 environments). * glplib07.c 16-byte data alignment was added to the module to provide compatibility with LP64 environment (8-byte is not sufficient due to jmp_buf; thanks to Xypron for investigation). * glplpx16.c New version of the routine lpx_write_pb was added. Thanks to Oscar Gustafsson for the contribution. * w32/VC9, w64/VC9 Makefiles and batch files were added to build GLPK under 32- and 64-bit Windows with Microsoft Visual Studio Express 2008. Thanks to Heinrich Schuchardt for the contribution and testing. * w32/DM, w32/OWC Makefiles and batch files were added to build GLPK with Digital Mars C/C++ 8.50 and Open Watcom C/C++ 1.6 (32-bit Windows). Wed Aug 13 12:00:00 2008 Andrew Makhorin * GLPK 4.30 (15:0:15) has been released * glpspx.h, glpspx03.c, glpapi06.c The primal simplex solver (spx_prim_opt, spx_prim_feas) was replaced by a new implementation (spx_primal), which currently provides the same features as the old version. * glpmpl01.c, glpmpl03.c Some changes were made in the MathProg translator to allow <, <=, >=, and > on comparing symbolic values. Thanks to Heinrich Schuchardt for patches. * glplpx10.c Internal routine set_d_eps in the exact LP solver was changed to prevent approximation errors in case of integral data. Thanks to Markus Pilz for bug report. XXX XXX XX 12:00:00 2008 Andrew Makhorin * GLPK 4.29 (14:0:14) has been released * configure.ac The configure script was changed to disable optional features by default. For details see file INSTALL. * glpipp02.c A bug was fixed in the internal routine reduce_bounds. Thanks to Anne-Laurence Putz for the bug report. * glpapi01.c New API routine glp_erase_prob was added. * glpapi13.c New API routines glp_read_mps and glp_write_mps were added. They replace API routines lpx_read_mps, lpx_read_freemps, lpx_write_mps, and lpx_write_freemps, which are deprecated. * glpapi14.c New API routines glp_read_lp and glp_write_lp were added. They replace API routines lpx_read_cpxlp and lpx_write_cpxlp, which are deprecated. * glpsql.c Minor bug was fixed. Thanks to Xypron for the bug report. Tue Mar 25 12:00:00 2008 Andrew Makhorin * GLPK 4.28 (13:0:13) has been released * glplib.h, glplib.c Three wrapper routines xdlopen, xdlsym, and xdlclose, which provide the shared library support, were added. A particular version of these routines depends on the option --enable-dl passed to the configure script (see file INSTALL for details). Thanks to Rafael Laboissiere for useful advices concerning the shared library support. * glpsql.c A static linking to iODBC and MySQL libraries used in the MathProg table drivers was replaced by a dynamic linking to corresponding shared libraries. Many thanks to Heinrich Schuchardt for the contribution and to Vijay Patil for testing this feature under Windows XP. * glpgmp.h, glpgmp.c A bug (which appeared only on 64-bit platforms) was fixed. Thanks to Axel Simon for the bug report. * glpapi.c A bug was fixed in the api routine glp_add_cols. (If the basis is valid, adding column keeps it valid, however, col->bind was set to -1 rather to 0.) Thanks to Cedric[FR] for the bug report. * glplib.c 64-bit unsigned int type glp_ulong and corresponding routines were replaced by 64-bit signed int type xlong_t. * glpk.h, glpapi.c The type glp_ulong was replaced by glp_long. This affects only the api routine glp_mem_usage. * glplib.c Compressed data file support was added. This feature requires the zlib data compression libraries and allows compressing and decompressing .gz files "on the fly". * glpcli.h, glpcli.c Command-line interface routines were added. (This feature is incomplete so far.) Sun Mar 02 12:00:00 2008 Andrew Makhorin * GLPK 4.27 (12:0:12) has been released * glpsql.h, glpsql.c Two MathProg table drivers for iODBC and MySQL contributed by Heinrich Schuchardt were added to the package. * glpmpl05.c Mathprog table driver for xBASE was added to the package. * glpmpl03.c A minor was fixed in the MathProg translator (if some field specified in the table statement is missing in corresponding input table, the bug causes abnormal termination). Thanks to Heinrich Schuchardt for the bug report. * glpmpl.h, glpmpl.c STRING data type was replaced by plain character strings. Sun Feb 17 12:00:00 2008 Andrew Makhorin * GLPK 4.26 (11:0:11) has been released * glpmpl.h, glpmpl01.c, glpmpl03.c, glpmpl05.c The table statement was implemented. Description of this new feature is given in file doc/tables.txt. * glpios03.c A bug causing zero divide error on computing euclidean norm of the cut coefficient vector was fixed. Wed Dec 19 12:00:00 2007 Andrew Makhorin * GLPK 4.25 (10:0:10) has been released * glpapi10.c Routines lpx_eval_tab_row and lpx_eval_tab_col were replaced by glp_eval_tab_row and glp_eval_tab_col. * glpios03.c, glpios05.c Gomory's mixed integer cuts were implemented. * glpscs.h, glpscs.c Segmented character string routines are no longer used and were removed from the package. Wed Nov 21 12:00:00 2007 Andrew Makhorin * GLPK 4.24 (9:0:9) has been released * src/glplpx16.c A bug was fixed in the routine lpx_write_cpxlp. If a variable x has upper bound and no lower bound, it should appear in the bounds section as "-inf <= x <= u", not as "x <= u". Thanks to Enric Rodriguez for the bug report. * src/glpios03.c, src/glpios04.c, src/glpios05.c MIR (mixed integer rounding) cuts were implemented. Sun Oct 28 12:00:00 2007 Andrew Makhorin * GLPK 4.23 (8:0:8) has been released * src/glplib05.c, configure.ac Check for vsnprintf was added. * include/glppds.h, src/glppds.c A module to scan plain data was added. * src/glpapi09.c The following new API routines were added: glp_read_sol read basic solution from text file; glp_write_sol write basic solution to text file; glp_read_ipt read interior-point solution from text file; glp_write_ipt write interior-point solution to text file; glp_read_mip read MIP solution from text file; glp_write_mip write MIP solution to text file. * src/glpapi12.c Advanced API routine glp_free_env was added. * examples/glpsol.c The following three command-line options were added: --mipgap tol set relative MIP gap tolerance -r filename read solution from filename -w filename write solution to filename Wed Sep 19 12:00:00 2007 Andrew Makhorin * GLPK 4.22 (7:0:7) has been released * src/glpios02.c A bug was fixed in the MIP preprocessor (ios_preprocess_node). Thanks to Roberto Bagnara (Department of Mathematics, University of Parma, Italy) for the bug report. * src/glpios02.c A bug was fixed in the MIP preprocessor (col_implied_bounds), due to which constraint coefficients with small magnitude could lead to wrong implied bounds of structural variables. * src/glpipp02.c A similar bug was fixed in the routine reduce_bounds. * src/glpapi01.c A bug was fixed in the routines glp_set_mat_row and glp_set_mat_col. (The bug appeared due to incorrect removing zero elements from the row/column lists.) * src/glplpx14.c A bug was fixed in the API routines lpx_read_mps and lpx_read_freemps, due to which bounds of type LI specified in BOUNDS section were incorrectly processed. * src/glplib05.c A call to standard function vsprintf was replaced by a call to vsnprintf for security reasons. Many thanks to Peter T. Breuer and Rafael Laboissiere . Tue Aug 28 12:00:00 2007 Andrew Makhorin * GLPK 4.21 (6:0:6) has been released * glpscg.h, glpscg.c Routines to maintain sparse cliqued graph were added. * glpios02.c MIP preprocessing routines were added. * glpk.h, glpios.h, glpios03.c New reasons for calling the callback routine were introduced in the MIP solver. * glpapi08.c Default backtracking strategy was changed to best local bound. * glpapi11.c New API routine glp_term_out to enable/disable terminal output was added. * glprng.h, glprng02.c Two routines to generate uniformly distributed pseudo-random floating-point numbers were added. Thu Jul 26 12:00:00 2007 Andrew Makhorin * GLPK 4.20 (5:0:5) has been released * glpk.h, glpapi08.c The routine lpx_integer was replaced by an equivalent routine glp_intopt. Also new API routine glp_init_iocp was added. * glpiet.h, glpiet.c Routines implementing the implicit enumeration tree are no longer used and therefore were removed from the package. * glpios.h, glpios01.c, glpios02, glpios03 Routines implementing the integer optimization suite being replaced by a new version were removed from the package. * glpmip.h, glpmip01.c, glpmip02.c Routines implementing the B&B method being replaced by a new version were removed from the package. * glpios.h, glpios01.c, glpios02.c Routines implementing a new version of the integer optimization suite (IOS) based on the B&B method were added to the package. * glpk.h, glpapi10.c Branch-and-bound interface routines were added to the package. * examples/tspsol.c The TSP solver based on old version of the integer optimization suite is no more supported and was removed from the package. * glpipp02.c An error in the routine reduce_bounds was fixed; thanks to Graham Rockwell for the bug report. * glpk.latex A new edition of the reference manual was included. Thu Jul 05 12:00:00 2007 Andrew Makhorin * GLPK 4.19 (4:0:4) has been released The principal change is upgrading to GPLv3. * glpapi01.c A serious bug in the routine glp_del_cols was fixed; thanks to Cedric[FR] for the bug report. The bug appeared because on deleting non-basic columns the basis header remained valid, however, contained invalid (old) column ordinal numbers. * glpapi10.c A new advanced API routine glp_mem_limit was added. * glplpx01.c The case GLP_EBOUND was added to the routine lpx_simplex. Thanks to Cameron Kellough for the bug report. * glplpx19.c An API routine lpx_write_pb to write the problem instance in OPB (pseudo boolean) format format was added. Thanks to Oscar Gustafsson for the contribution. * glpsol.c Two new options --wpb and --wnpb were added to glpsol to write the problem instance in OPB format. Mon Jun 25 12:00:00 2007 Andrew Makhorin * GLPK 4.18 (3:0:3) has been released * glplib.h Type names ulong_t and uldiv_t were changed to glp_ulong and glp_uldiv to avoid conflicts with standard type names on some platforms. Thanks to Boris Wirtz for the bug report. * glpbfd.*, glpfhv.*, glplpf.* LP basis factorization routines were made tidy. * glpk.h, glpapi04.c The following API routines were added: glp_set_rii, glp_set_sjj, glp_get_rii, glp_get_sjj. * glpk.h, glpapi06.c The routine lpx_simplex was replaced by an equivalent routine glp_simplex. Also new API routine glp_init_smcp was added. * glpk.h, glpapi09.c The following advanced API routines were added: glp_bf_exists, glp_factorize, glp_bf_updated, glp_get_bfcp, glp_set_bfcp, glp_get_bhead, glp_get_row_bind, glp_get_col_bind, glp_ftran, glp_btran. * glpk.latex A new edition of the reference manual was included. * examples/dea.mod, examples/food.mod, examples/food2.mod Three examples in the MathProg language were added. Thanks to Sebastian Nowozin . Sat May 26 12:00:00 2007 Andrew Makhorin * GLPK 4.17 (2:0:2) has been released * glpdmp.h, glpdmp.c Memory pool routines were replaced by a new version. * glpscs.h, glpscs.c Segmented string routines were replaced by a new version. * glplpx08.c, glplpx09.c Now the MIP problem may have no integer columns. * glpapi01.c The routines glp_set_mat_row, glp_set_mat_col, and glp_load_mat were modified to allow zero elements (which are not stored in the constraint matrix). * glpscf.h, glpscf.c Schur complement factorization routines were implemented. * glplpf.h, glplpf.c LP basis factorization routines based on LU-factorization and Schur complement were implemented. * glplpx02.c, glplpx03.c New control parameter LPX_K_BFTYPE was introduced to choose the basis factorization type used by the simplex method routines. * glpsol.c Three new command-line options were added to choose the basis factorization type used by the simplex method routines: --luf, --cbg, and --cgr. * glpk.latex A new edition of the reference manual was included. Sat May 05 12:00:00 2007 Andrew Makhorin * GLPK 4.16 (1:0:1) has been released * glpk.h, glpapi.c, glplpx01.c, glplpx02.c Names of a number basic api routines were changed and now have the prefix 'glp_'. To keep backward compatibility these routines are also available via their old names prefixed with 'lpx_'. * glplpx19.c Three new api routines were added: glp_version, glp_term_hook, and glp_mem_usage. * glpk.latex, gmpl.texi A new edition of the reference manuals was included. * lpglpk40.c This example program is no longer supported and therefore was removed from the package. Sun Feb 18 12:00:00 2007 Andrew Makhorin * GLPK 4.15 (0:0:0) has been released * configure.ac, Makefile.am Autotools specification files were changed to use GNU Libtool that allows building the static as well as shared GLPK library. Thanks to Rafael Laboissiere . Mon Feb 05 08:00:00 2007 Andrew Makhorin * GLPK 4.14 has been released Now GLPK conforms to ILP32, LLP64, and LP64 programming models (the latter seems to be the ultimate choice regarding 64-bit architectures). Note that GLPK itself is a 32-bit application, and the conformity only means that the package works correctly on all these arenae. Nevertheless, on 64-bit platforms it is possible to use more than 4GB of memory, if necessary. * Makefile Starting from this release only the header glpk.h is needed to be installed. * glplib01.c Two routines bigmul and bigdiv which performs multiplication and division of unsigned integers of arbitrary precision were added. * glplib02.c A set of 64-bit arithmetic routines were added. * glplib04.c Some low-level library routines were improved and renamed. * glpcfg.h The macro GLP_TM_SPEC were introduced to specify a version of the time routine depending on the host environment. Mon Nov 13 12:00:00 2006 Andrew Makhorin * GLPK 4.13 has been released * configure.in '-lm' bug was fixed. * glpbfx.h, glpbfx.c Basis factorization interface routines based on exact (bignum) arithmetic were implemented. * glpssx.h, glpssx1.c, glpssx2.c Simplex method routines based on exact (bignum) arithmetic were implemented. * glplpx6e.c The routine lpx_exact, which is an easy-to-use driver to the exact simplex method, was added. * glpsol.c Two command-line options were added: '--exact' and '--xcheck'. Wed Nov 08 12:00:00 2006 Andrew Makhorin * GLPK 4.12 has been released * glpcfg.h The package configuration file was added. * glplib2.c Alternative version of the routines umalloc, ucalloc, and ufree was provided. It does not limit the amount of allocated memory to INT_MAX bytes and therefore can be used on platforms where sizeof(void *) > sizeof(int). To enable this version one should define the preprocessor variable GLP_HUGE_MEM. * glprng.c The routine rng_create_rand was changed to initialize the generator using seed = 1, not 0, to conform ISO C requirements. * glpgmp.h, glpgmp.c A set of bignum arithmetic routines implementing operations on integers and rationals was added. These routines are compatible with the GNU MP library. NOTE: To attain a much better performance it is recommended to use, if possible, the original GNU MP library rather than the GLPK version, by defining the preprocessor variable GLP_USE_GMP. * glplux.h, glplux.c A tentative implementation of sparse LU-factorization based on exact (bignum) arithmetic was added. * glpssx.h, glpssx.c A tentative implementation of some simplex method routines based on exact (bignum) arithmetic was added. * glplpx6f.c A preliminary implementation of the routine lpx_exact_check was added. This routine checks the current basis for primal and dual feasibility using exact (bignum) arithmetic. * examples/glpsol.c The command-line option '--xcheck' was introduced to check the current basis for feasibility using exact (bignum) arithmetic. Tue Jul 25 12:00:00 2006 Andrew Makhorin * GLPK 4.11 has been released. * include/glpbfi.h, src/glpbfi.c Basis factorization interface routines were added. * include/glpluf.h, src/glpluf1.c Hypersparse solution routines were added. * include/glpinv.h, src/glpinv1.c Hypersparse solution routines (fake version) were added. * include/glpmpl.h, src/glpmpl.c Built-in functions card, length, and substr were implemented. Output redirection in the printf statement was implemented. * examples/graph.mod, examples/crypto.mod Two example models illustrating new features of the modeling language were included. Thu May 11 12:00:00 2006 Andrew Makhorin * GLPK 4.10 has been released. * src/glplpx8a.c A fragment was added to the routines lpx_read_mps and lpx_read_freemps to accept LI bound type (it is similar to LO, however, additionally marks the column as integer). * include/glpbfi.h, src/glpbfi.c The module glpbfi which implements the basis factorization interface (BFI) was added. * src/glplpx7a.c The routine lpx_cover_cut to generate mixed cover cuts was added. * src/glplpx7b.c The routine lpx_clique_cut to generate clique cuts and related routines to maintain the conflict graph were added. * include/glplpx.h, src/glplpx5.c The routine lpx_cpx_basis implementing Bixby's algorithm to construct an initial LP basis was added. * examples/glpsol.c Command-line option '--bib' was added which allows building an initial LP basis using Bixby's algorithm. Default command-line option '--mps' was changed to '--freemps'. * examples/cf12a.mod, examples/cf12b.mod Two examples in MathProg (curve fitting problem) were added. Thanks to Dr. Harley Mackenzie . Tue Jan 17 12:00:00 2006 Andrew Makhorin * GLPK 4.9 has been released. * glpipp.h, glpipp1.c, glpipp2.c A MIP presolver were implemented (currently incomplete). It is used internally in the routine lpx_intopt (see below). * glplpx6d.c, glplpx7a.c An advanced branch-and-bound solver (the routine lpx_intopt) were implemented. * glplpx6c.c The routine lpx_check_int to check MIP feasibility conditions was added. * glplpx8a.c The routine lpx_print_mip was changed to print MIP feasibility conditions. * glpmpl.h, glpmpl1.c, glpmpl3.c The built-in functions sin, cos, atan, and atan2 were added to the MathProg language. * doc/lang.* Some typos were fixed. Thanks to Minh Ha Duong (CIRED, CNRS). Wed Jan 12 12:00:00 2005 Andrew Makhorin * GLPK 4.8 has been released. * glpspx.h, glpspx1.c, glpspx2.c, glplpx6a.c Simplex method routines were changed due to a new format of the constraint matrix. * glpmat.h, glpmat.c Sparse matrix routines were re-implemented using storage-by-rows format. * glpipm.h, glpipm.c, glplpx6b.c Interior-point method routines were changed due to a new format of sparse matrices. * glpchol.h, glpchol.c Old version of Cholesky factorization routines being replaced by a new one (see glpmat.c) was removed from the package. * glplpx8c.c Minor bug was fixed in api routine lpx_read_cpxlp. Mon Aug 23 12:00:00 2004 Andrew Makhorin * GLPK 4.7 has been released. * glplpx.h, glplpx1.c New core API routines were added (but not documented yet): lpx_order_matrix, lpx_create_index, lpx_find_row, lpx_find_col, lpx_delete_index. * glplpx8a.c API routine lpx_read_mps was re-implemented, and two new API routines lpx_read_freemps and lpx_write_freemps were added to support free MPS format. * glplpx8c.c Two API routines lpx_read_cpxlp and lpx_write_cpxlp (formerly named lpx_read_lpt and lpx_write_lpt) were re-implemented. * glpmps.h, glpmps.c This module formerly used in lpx_read_mps was removed from the package. * glplpt.h, glplpt.c This module formerly used in lpx_read_lpt was removed from the package. * glpmip.h, glpmip1.h, glpmip2.h New MIP routines mip_best_node and mip_relative_gap were added due to suggestion of Brady Hunsaker . * glpsol.c The following new command-options were added: --freemps to read problem data in free MPS format --wfreemps to write problem data in free MPS format --cpxlp to read problem data in CPLEX LP format --wcpxlp to write problem data in CPLEX LP format --bas to read LP basis from a text file in MPS format --wbas to write LP basis to a text file in MPS format --mostf to use "most fractional" branching heuristic --bestb to use "best bound" backtracking heuristic * contrib/deli/*.* GLPK Delphi interface module was temporarily removed from the distribution due to licensing problems. * contrib/glpkmex/*.* GLPK Matlab interface module was temporarily removed from the distribution due to licensing problems. * contrib/jni/*.* GLPK Java interface module was temporarily removed from the distribution due to licensing problems. Wed Aug 04 12:00:00 2004 Andrew Makhorin * GLPK 4.6 has been released. * glpmpl.h, glpmpl1.c, glpmpl2.c, glpmpl3.c, glpmpl4.c Three new statements were implemented in the GNU MathProg language: solve, printf, and for. Also some bugs were fixed. * glplpx.h, glplpx8e.c Two API routines were added: lpx_read_prob and lpx_write_prob, which allow reading and writing problem data in GNU LP format. * glpsol.c Three new command-line options were added: --glp (to read problem data in GNU LP format), --wglp (to write problem data in GNU LP format), and --name (to change problem name). * glprng.h, glprng.c A portable pseudo-random number generator was implemented as a separate module. * glplib4.c The old implementation of a pseudo-random number generator was removed from the package. * doc/lang.*, doc/refman.* New edition of the GLPK documentation was included. * contrib/glpkmex/*.* A new version of GLPKMEX was included in the distribution. For more details see contrib/glpkmex/ChangeLog. Mon Jul 19 12:00:00 2004 Andrew Makhorin * GLPK 4.5 has been released. * glpmip.h, glpmip1.c, glpmip2.c, glplpx6c.c New implementation of the branch-and-bound method was added. It replaces the old implementation, which was removed from the package. * glpies.h, glpies1.c, glpies2.c, glpies3.c Modules used in the old implementation of the branch-and-bound method were removed from the package. * glplib2.c Now if the preprocessor variable GLPHUGEMEM is defined, other version of the routines umalloc, ucalloc, and ufree is used on compiling the package. This allows avoiding memory allocation problems on platforms where sizeof(void *) > sizeof(int), for example, where addresses are 64-bit while integers are 32-bit. The modification was made due to a bug report provided by Karel Zimmermann and Christophe Caron . Sat Jan 17 12:00:00 2004 Andrew Makhorin * GLPK 4.4 has been released. * glplpx.h, glplpx*.c All API routines were re-implemented using new data structures. Some new API routines were added and some existing API routines became obsolete as shown below: Obsolete API routine Equivalent new API routine lpx_check_name (no more supported) lpx_set_obj_c0 lpx_set_obj_coef lpx_set_row_coef (no more supported) lpx_set_col_coef lpx_set_obj_coef lpx_load_mat (no more supported) lpx_load_mat3 lpx_load_matrix lpx_unmark_all (no more supported) lpx_mark_row (no more supported) lpx_mark_col (no more supported) lpx_clear_mat (no more supported) lpx_del_items lpx_del_rows, lpx_del_cols lpx_get_row_bnds lpx_get_row_type, lpx_get_row_lb, lpx_get_row_ub lpx_get_col_bnds lpx_get_col_type, lpx_get_col_lb, lpx_get_col_ub lpx_get_obj_c0 lpx_get_obj_coef lpx_get_row_coef (no more supported) lpx_get_col_coef lpx_get_obj_coef lpx_get_row_mark (no more supported) lpx_get_col_mark (no more supported) lpx_get_row_info lpx_get_row_stat, lpx_get_row_prim, lpx_get_row_dual lpx_get_col_info lpx_get_col_stat, lpx_get_col_prim, lpx_get_col_dual lpx_get_ips_stat lpx_ipt_status lpx_get_ips_row lpx_ipt_row_prim, lpx_ipt_row_dual lpx_get_ips_col lpx_ipt_col_prim, lpx_ipt_col_dual lpx_get_ips_obj lpx_ipt_obj_val lpx_get_mip_stat lpx_mip_status lpx_get_mip_row lpx_mip_row_val lpx_get_mip_col lpx_mip_col_val lpx_get_mip_obj lpx_mip_obj_val Obsolete API routines were kept for backward compatibility, however, they will be removed in the future. * doc/refman.* New edition of the GLPK reference manual containing description of all new API routines was included. * contrib/glpkmex/*.* GLPKMEX, a Matlab MEX interface to GLPK package, contributed by Nicolo Giorgetti was included. * doc/GLPK_FAQ.txt GLPK FAQ contributed by Harley Mackenzie was included. Fri Dec 12 12:00:00 2003 Andrew Makhorin * GLPK 4.3 has been released. * configure.in The bug, due to which the standard math library is not linked on some platforms, was fixed. * glpmpl3.c The bug (0 ** y) was fixed in the routine fp_power. * glpmpl.h, glpmpl1.c, glpmpl3.c Some new built-in functions (round, trunc, Irand224, Uniform01, Uniform, Normal01, Normal) were added to the MathProg language. * glpmpl1.c The MathProg syntax was changed to allow writing 'subj to'. * glplpx.h, glplpx1.c, glplpx2.c The new api routine lpx_get_ray_info was added. * glplpx8a.c The api routine lpx_print_sol was changed to print the number of non-basic variable, which causes primal unboundness. * glpmps.c The code was changed to avoid errors on compiling the package on Mac OS X. Thanks to Andre Girard for the bug report. * doc/lang.*, doc/refman.* Several typos were fixed and some new material was added in the glpk documentation. Fri Nov 14 12:00:00 2003 Andrew Makhorin * GLPK 4.2 has been released. * glpiet.h, glpiet.c, glpios.h, glpios1.c, glpios2.c, glpios3.c A preliminary implementation of the Integer Optimization Suite (IOS) was included in the package. Eventually IOS will replace the Implicit Enumeration Suite (IES). * glplpx.h, glplpx6d.c A dummy version of the integer optimization routine lpx_intopt was included in the package. Later this routine will replace the routine lpx_integer. * examples/glpsol.c A new command-line option --int-opt was added to the solver to call lpx_intopt rather than lpx_integer. * glpbcs.h, glpbcs1.c, glpbcs2.c Being replaced by IOS routines (see above) the Branch-and-Cut Framework (BCS) routines were removed from the package. * examples/tspsol.c Stand-alone Symmetric TSP solver was completely re-programmed using IOS routines. * glplib.h, glplib2.c, glplib4.c The random-number generator was implemented. It is based on the module GB_FLIB from the Stanford GraphBase originally developed by Donald Knuth. * glphbsm.c, glplpx8a.c, glpmps.c All calls to fopen/fclose were replaced by corresponding calls to ufopen/ufclose due to bug reports provided by Morten Welinder and . * glpmps.c The code was made re-entrant. * glplpx8b.c API routine lpx_print_sens_bnds for bounds sensitivity analysis contributed by Brady Hunsaker was added to the package. This feature is also available in glpsol via the command-line option --bounds. * contrib/jni/*.* New version of GLPK JNI (Java Native Interface) contributed by Chris Rosebrugh was added to the package. * contrib/deli/*.* GLPK DELI (Delphi Interface) contributed by Ivo van Baren was added to the package. * glplpx3.c Default method to scale the problem was changed to equilibration scaling (lp->scale = 1 in lpx_reset_parms). * glplpx6a.c Two minor (non-critical) typos were fixed due to report provided by Andrew Hamilton-Wright . * glplpp2.c An untested case (line 941) had been tested due to bug report provided by Jiri Spitz . * w32bc5.mak, w32vc6.mak, w32vc6d.mak, d32dmc.mak Several makefiles were added to allow building GLPK library for some non-GNU 32-bit platforms. Sat Aug 23 12:00:00 2003 Andrew Makhorin * GLPK 4.1 has been released. * glpmpl1.c, glpmpl3.c Some bugs were fixed in the MathProg translator due to the bug reports provided by Giles Thompson : conditional set expressions were incorrectly parsed; dimen attribute was not set by default when a set was used recursively in its own declaration; logical expressions ... in if ... then ... else ... did not work; displaying set expressions did not free memory allocated for temporary results. * glpmpl3.c (reduce_terms) Implementation of summation of linear forms over domain was improved to reduce complexity of that operation from O(n*n) to O(n*log n). The improvement was made due to a report provided by Sebastien de Menten . * glplpx6a.c (line 1056), glpmip1.c (line 641) Two minor bugs were fixed due to the bug report provided by Kendall Demaree . * glplpx.h, glplpx6a.c The method of one artificial variable implemented in the routine lpx_prim_art and used on the phase I in the glpk simplex solver has a serious defect: for some lp instances it erroneously reports that the problem has no primal feasible solution. This error appears when the column of the artificial variable, which enters the basis to make it primal feasible, has large constraint coefficients, that leads to small reduced costs of non-basic variables and premature termination of the search, i.e. to wrong conclusion that the problem has no primal feasible solution. To avoid this defect the routine lpx_prim_feas was included. It implements the method of implicit artifical variables (based on minimization of the sum of infeasibilities), which is a bit slower but much more robust. The routine lpx_prim_feas having the same functionality now is used instead the routine lpx_prim_art. * glpinv.h, glpinv.c The test used in the routine inv_update to detect low accuracy after updating LU-factorization of the basis matrix was replaced by a new, more robust test. * glplpx6c.c Selecting an active node to be solved next in the routine btrack_bestp was changed. Now, if any integer feasible solution has not been found yet, the routine chooses an active node which has the minimal sum of integer infeasibilities. * glpmip.h, glpmip1.c The additional flag int_obj was included in the structure MIPTREE used by the branch-and-bound. This flag is set in the routine mip_create_tree and used in the routine is_better. It means that the objective is integral, i.e. depends only on integer variables with integer objective coefficients. The test used in the routine check_integrality was also replaced by a new, more reasonable one. * glplpx1.c A minor bug was fixed in the routine lpx_check_name. * glpmpl.h, glpmpl4.c, glplpx8d.c The flag skip_data was added to the parameter list of the routine mpl_read_model. If this flag is set, the data section in the model file is ignored. Corresponding change was made in the routine lpx_read_model. Now, if both model and data files are specified, the data section in the model file is ignored. * glplpx8c.c A minor bug (wrong format used for writing free columns) in the routine lpx_write_lpt was fixed due to the bug report provided by Bernhard Schmidt * sample/glpsol.c The command-line parameter --tmlim, which allows limiting the solution time, was added. * doc/lang.*, doc/refman.* New edition of the GLPK documentation was included. * java-binding/*.* New version of the GLPK JNI (Java Native Interface) package was included in the distribution. * sample/lpglpk40.c A non-trivial example was added. It allows using GLPK as a base LP solver for Concorde, a program for solving Traveling Salesman Problem (TSP). For details see comments in lpglpk40.c. * sample/*.mod Some examples of LP and MIP models written in GNU MathProg were added. Tue May 06 12:00:00 2003 Andrew Makhorin * GLPK 4.0 has been released. * glpmpl.h, glpmpl1.c, glpmpl2.c, glpmpl3.c, glpmpl4.c The model translator for the GNU MathProg modeling language was implemented and included in the package. * glplpx.h, glplpx8d.c The api routine lpx_read_model, which is an interface to the MathProg translator, was included in the package. * glplpx.h, glplpx8a.c The api routine lpx_print_prob for writing LP/MIP problem data in plain text format was included in the package. * sample/glpsol.c New version of the GLPK stand-alone LP/MIP solver that supports the GNU MathProg modeling language was implemented. * doc/lang.latex, doc/lang.dvi, doc/lang.ps The document "GLPK: Modeling Language GNU MathProg" was included in the package. * doc/refman.latex, doc/refman.dvi, doc/refman.ps New edition of the GLPK Reference Manual was included in the package. * glplpx8c.c A bug in the api routine lpx_write_lpt was fixed. Due to that bug an addressing error occured in the routine if the objective function has the non-zero constant term. * glplan.h, glplan1.c, glplan2.c, glplan3.c, glplan4.c, * glplan5.c, glplan6.c, glplan7.c, glplan8.c, glplpx8b.c All modules of the translator for the GLPK/L modeling language were removed from the package, because GLPK/L being completely superseded by GNU MathProg is no more supported. Tue Mar 25 12:00:00 2003 Andrew Makhorin * GLPK 3.3 has been released. * glplpp.h, glplpp1.c, glplpp2.c An implementation of the built-in LP presolver was added to the package. * glplpx.h The flag presol was added to the structure LPX. This flag tells the lpx_simplex whether the built-in LP presolver should be used or not. By default this flag is off. Also three macros (namely LPX_E_NOPFS, LPX_E_NODFS, and LPX_K_PRESOL) that concern using the LP presolver were introduced. * glplpx3.c, glplpx6a.c These modules was changed to use the built-in LP presolver. * sample/glpsol.c Command line options --presol and --nopresol that concern using the LP presolver were added to the stand-alone LP/MIP solver. * glplan1.c This module was changed to allow declaring sets like A[1:10] in the models written in the GLPK/L modeling language. * doc/refman.latex, doc/lang.latex New editions of the documents "GLPK User's Guide" and "GLPK/L Modeling Language" were included in the distribution. * java-binding/*.* The package GLPK JNI (Java Native Interface) implementing Java binding for GLPK was included in the distribution. This package was developed and programmed by Yuri Victorovich . Tue Feb 18 12:00:00 2003 Andrew Makhorin * GLPK 3.2.4 has been released. * glplpx6b.c The code was changed to allow auxiliary variables have non-zero objective coefficients. Also a minor bug was fixed (the constant term was not considered on displaying the objective function value). * sample/glpsol.c The code was changed to fix a bug (the command-line option 'bfs' was not recognized). The bug was fixed due to report provided by Olivier . * glplpt.c The code was changed to fix a bug (binary variables were treated erroneously as integer ones). * glplpx6b.c The code was changed to fix a bug (variables that have no lower bounds were incorrectly processed on converting to the standard formulation). The bug was fixed due to report kindly provided by Kjell Eikland . Mon Nov 11 12:00:00 2002 Andrew Makhorin * GLPK 3.2.3 has been released. * glpmip.h, glpmip1.c A preliminary implementation of the branch-and-bound driver based on the implicit enumeration suite (glpies) was added to the package. This module is not documented yet. * glplpx6c.c A new implementation of the api routine lpx_integer which now is based on the b&b driver (see glpmip above) was included in the package. This new implementation has exactly the same functionality as the old version and therefore all changes are transparent to the api user. * glpbbm.h, glpbbm.c * glprsm.h, glprsm1.c, glprsm2.c * glplp.h, glplp.c These modules were removed from the package, because they were used only in the old version of the routine lpx_integer, which was replaced by the new version (see glplpx6c above). * glplpx.h, glplpx6a.c The api routine lpx_check_kkt was included in the package and its description was added in the reference manual. This routine allows checking Karush-Kuhn-Tucker optimality conditions for an LP solution. * glplpx.h, glplpx8a.c Now the api routine lpx_print_sol also prints information about "solution quality" obtained via the api routine lpx_check_kkt. * glplpx.h, glplpx8a.c New api routines lpx_read_bas and lpx_write_bas were included in the package and documented. The routine lpx_write_bas allows writing a current basis from an LP object to a text file in the MPS format. The routine lpx_read_bas allows reading a basis prepared in the MPS format from a text file into an LP object. * glplpt.c The parsing routine which reads LP problem data prepared in the CPLEX LP format was modified to allow specifying lower bounds of variables also in the form 'variable >= lower bound' (in the bounds section). This modification was made due to a notice provided by Ivan Luzzi . * glplpx.h, glplpx8c.c The api routine lpx_write_lpt which allows writing LP problem data from an LP object to a text file using the CPLEX LP format was included in the package and documented. * glplpx.h, glplpx3.c The control parameter LPX_K_LPTORIG that affects the behavior of the api routine lpx_write_lpt was introduced. * glplan6.c The semantics of the language GLPK/L was changed to allow selection in case when not all mute letters of a predicate (the operand that follows the keyword 'where') are presented in a parameter (the operand that precedes the keyword 'where'), i.e. to allow writing something like this: y[j] := sum(i, x[i] where p[i,j]); The paragraph "Selection" in the langauge description (page 25) was also correspondingly changed. This change of the language semantics was undertaken due to a notice provided by Peter Lee . * sample/hwd.lpm A nice example of LP model written in GLPK/L and contributed by Peter Lee was included in the package. * glplpx6b.c The api routine lpx_interior was modified: a) to compute dual values for all structural as well as auxiliary variables; b) to allow specifying non-zero objective coefficients at auxiliary variables. * sample/glpsol.c Three new command-line options were added to the solver, which are: --plain, --orig, and --wrlpt. Mon Oct 14 12:00:00 2002 Andrew Makhorin * GLPK 3.2.2 has been released. * glplpt.h, glplpt.c A module that reads LP/MIP problem data in CPLEX LP format was implemented. * glplpx8c.c An api routine lpx_read_lpt that reads LP/MIP problem data in CPLEX LP format was implemented. * sample/glpsol.c, sample/plan.lpt A new command-line option '--lpt' that allows reading LP/MIP problem data in CPLEX LP format was added to the solver. * doc/refman.latex, doc/refman.dvi, doc/refman.ps A new edition of the Reference Manual was included. * source/*.c Casting to (unsigned char) was added in some calls to the classification functions (isalpha, etc.). The bug was fixed due to report provided by Morten Welinder . * glplpx8a.c The local routine mps_numb used in the routine lpx_write_mps was modified to correctly format floating-point numbers that have two digits in the decimal exponent. The bug was fixed due to report provided by Vlahos Kiriakos . * glplan.h, glplan1.c, ..., glplan8.c Several serious bugs were fixed in the language processor due to reports provided by : (a) a static search tree used to find sparse array elements was sometimes overwritten that caused the message 'assertion failed' to appear; the bug was fixed by creating separate search trees in parsing routines; (b) a variable declared using the predicate-controlled variable declaration statement had wrong order of domain sets, because the variable array was built as a copy of the predicate array; the bug was fixed by using the internal routine transpose that coordinates mute letters (and therefore domain sets) on copying sparse arrays; (c) sometimes assignment statements like x[#a,#b,#c] := ... was incorrectly processed; the bug was fixed by including an appropriate check into the internal routine assign_stmt. * glp_simplex.c An additional check to see if all lower bounds are not greater than corresponding upper bounds was included in the routine to prevent wrong results to appear. Such incorrectness sometimes was not detected, namely, when variables with such bounds were non-basic and never entered the basis. * glpspx1.c Maximal number of simplex iterations before reinversion was decreased from 100 to 50. This allowed to improve accuracy and, that is more important, to reduce the solution time for many serial lp problems approximately 1.5--2 times. * glpspx2.c A check to see if all elements in the column chosen to enter the basis are close to zero in the routine spx_prim_chuzr was temporarily removed because this check gave wrong conclusion in case when the corresponding non-basic variable had zero column in the constraint matrix. An analogous check to see if all elements in the row chosen to leave the basis are close to zero in the routine spx_dual_chuzc was also temporarily removed on the same reason. The bug was fixed due to reports provided by Flavio Keidi Miyazawa and Vlahos Kiriakos . Mon Aug 12 12:00:00 2002 Andrew Makhorin * GLPK 3.2.1 has been released. * glpbcs.h, glpbcs1.c, glpbcs2.c * glpies.h, glpies1.c, glpies2.c, glpies3.c A preliminary implementation of the branch-and-cut framework was included in the package. * doc/brcut.txt The document "GLPK: A Preliminary Implementation of the Branch-And-Cut Framework" was included in the distribution. * sample/tspsol.c An illustrative program for solving symmetric TSP based on the branch-and-cut method was included in the package. * glpdmp.h, glpdmp.c A new, re-enterable version of routines for managing dynamic memory pools was included in the package. * glpavl.h, glpavl.c A new, re-enterable version of routines for managing AVL search trees was included in the package. * glplib.h, glplib2.c Two new low-level routines ufopen and ufclose were included in the package. * glplpx.h, glplpx7.c The following new api routines were added: lpx_eval_activity, lpx_eval_red_cost, lpx_reduce_form, lpx_mixed_gomory. * glptsp.h, glptsp.c A module for reading TSP data using TSPLIB format was included in the package. Mon Jul 15 12:00:00 2002 Andrew Makhorin * GLPK 3.2 has been released. * glplpx.h, glplpx1.c, glplpx2.c The identifier 'class' (used as a member name in the structure LPX and as an argument name in the routine lpx_set_class) was changed to 'clss' in order to avoid conflicts with C++ reserved words. * glpk.h, glplpx.h, glplpx1.c, glplpx2.c, glplpx6a.c, * glplpx6b.c, glplpx6c.c, glplpx7.c, glplpx8.c The following new api routines were added: lpx_set_obj_name, lpx_get_obj_name, lpx_get_row_mark, lpx_get_col_mark, lpx_transform_row, lpx_transform_col, lpx_prim_ratio_test, lpx_dual_ratio_test, lpx_interior, lpx_get_ips_stat, lpx_get_ips_row, lpx_get_ips_col, lpx_get_ips_obj, lpx_read_lpm, lpx_write_mps, lpx_print_ips. * glpsol.c The solver was completely re-programmed using new api routines. * lang.latex, lang.dvi, lang.ps New edition of the document "GLPK: Modeling Language GLPK/L" was included in the distribution. * refman.latex, refman.dvi, refman.ps New edition of the document "GLPK: Reference Manual" (which contains descriptions of all new api routines) was included in the distribution. * glpapi.h, glpapi1.c, glpapi2.c, glpapi3.c, glpapi4.c These files (which contain old api routines) were removed from the package. * glpipm1.c, glpipm2.c The file glpipm1.c was renamed to glpipm.c. The file glpipm2.c was used only by old api routines and therefore was removed from the package. * language.texinfo Old version of the document "GLPK: Modeling Language GLPK/L" was removed from the distribution. Mon May 27 12:00:00 2002 Andrew Makhorin * GLPK 3.1 has been released. * glplpx.h, glplpx1.c, glplpx2.c, glplpx3.c, glplpx4.c, * glplpx5.c, glplpx6.c, glplpx7.c, glplpx8.c A preliminary implementation of new API routines was completed. * refman.latex, refman.dvi, refman.ps A draft edition of the document "GLPK Reference Manual", which describes new API routines, was included. * glplib3.c A bug in measuring long time intervals was fixed up. * glprsm3.c This module contains some obsolete routines not longer used and therefore it was removed from the package (into the subdirectory 'oldsrc'). * glprsm.h Some declarations related to the module 'glprsm3.c' (see above) were removed. * guide.texinfo The document "GLPK User's Guide" describing old API routines was removed from the package (into the subdirectory 'oldsrc'). * newapi.txt The document "New GLPK API Routines" was removed at all, because it is superseded by the new reference manual (see above). Mon May 13 12:00:00 2002 Andrew Makhorin * GLPK 3.0.8 has been released. * glplpx.h, glplpx1.c, glplpx2.c, glplpx3.c, glplpx4.c, * glplpx5.c, glplpx6.c, glplpx7.c A preliminary (currently incomplete) implementation of new api routines was included. * sample/newsamp.c A sample program for the new api routines was included. * newapi.txt A draft of the document "New GLPK API Routines" was included. * glpapi2.c, glpapi5.c, glpapi6.c These modules (which contain the api routines glp_call_rsm1, glp_simplex1, glp_pivot_in, glp_pivot_out) were removed from the package (to the subdirectory 'oldsrc') since these routines are functionally superseded by the new api routines. * glpk.h, glpapi2.c, glpapi3.c, glpapi4.c The api routines glp_simplex2, glp_call_ipm1, glp_call_bbm1 were renamed to glp_simplex, glp_interior, glp_integer, respectively. * sample/glpsol.c Some command-line options (which got obsolete due to the recent changes in api) were excluded. * doc/guide.texinfo New edition of the document "GLPK User's Guide" was included in the distribution to reflect the changes in some api routines. * doc/libref.texinfo This document was removed from the package (to the subdirectory 'oldsrc') since it describes the library routines, most of which got obsolete and no longer used. * Makefile.in A minor bug was fixed up due to bug report from Hans Schwengeler . Mon Apr 22 12:00:00 2002 Andrew Makhorin * GLPK 3.0.7 has been released. * glpduff.h, glpduff.c, glpspx.h, glpspx1.c, glpspx2.c, * glpapi7.c These modules were replaced by a new implementation of the simplex method and therefore they were removed from the package (however they still can be found in the subdirectory 'oldsrc'). * glprsm1.c The routine crash_aa was replaced by a new implementation and therefore it was removed from the file 'glprsm1.c'. * glplpx.h, glplpx.c, glpspx.h, glpspx1.c, glpspx2.c, glpspx3.c, * glpspx4.c, glpapi7.c New (currently incomplete) implementation of the simplex method components was included in the package. Thu Mar 28 12:00:00 2002 Andrew Makhorin * GLPK 3.0.6 has been released. * glpluf.h, glpluf.c, glpinv.h, glpinv.c New version of LU-factorization and basis maintenance routines (based on Forrest-Tomlin updating technique) was implemented. * glpeta.h, glpeta.c, glpfhv.h, glpfhv.c, glpgel.h, glpgel.c, * glppfi.h, glppfi.c, glprfi.h, glprfi.c These routines implement some other forms of the basis matrix. Now they became obsolete being functionally superseded by the new version of basis maintenance routines (see above) and were removed from the package (however they still can be found in the subdirectory 'oldsrc'). * glpbbm.c, glprsm.h, glprsm1.h, glprsm2.h, glpspx.h, glpspx2.c, * glprsm2.c, glpsol.c Necessary changes were made in order to use the new version of basis maintenance routines. Tue Jan 29 12:00:00 2002 Andrew Makhorin * GLPK 3.0.5 has been released. Structure of the package was re-organized in order to simplify its maintenance. * doc/guide.texinfo New edition of the document "GLPK User's Guide" was included in the distribution. Now the document includes descriptions of some additional API routines recently added to the package. * doc/newapi.txt The document "Additional GLPK API Routines" was removed from the distribution, because the corresponding material was included in the user's guide (see above). Mon Dec 10 12:00:00 2001 Andrew Makhorin * GLPK 3.0.4 has been released. * glpspx.h, glpspx1.c, glpspx2.c, glpapi/glp_simplex2.h A new, more efficient version of the two-phase primal simplex method was implemented (advanced initial basis, projected steepest edge, recursive computations of solution components). * glpapi/glp_call_bbm1.c Now LP relaxation can be solved either using rsm1_driver(), or using glp_simplex2(). The choice is controlled by the parameter 'meth' (a member of struct bbm1). * sample/glpsol.c The new implementation of the simplex method is now used by default. The old version is available via --old-sim option. * glpmat/gm_scaling.c Now this routine displays only two lines: an initial "quality" and a final "quality". * glplp/prepro_lp.c Identifiers 'fmin' and 'fmax' renamed to 'f_min' and 'f_max' in order to avoid conflict with . The bug was fixed due to report provided by Sami Farin . Wed Oct 03 12:00:00 2001 Andrew Makhorin * GLPK 3.0.3 has been released. * glprsm/harris_row.c, glprsm/harris_col.c The relative tolerance used on the first pass of the two-pass ratio test was replaced by the absolute tolerance. * glprsm/rsm_primal.c, glprsm/rsm_feas.c, glprsm/rsm_dual.c The absolute tolerance passed to the two-pass ratio test routine was decaresed (for both primal and dual simplex). These changes were made in order to improve numerical stability of the simplex method. * glprsm/glp_call_rsm1.c, glprsm/glp_call_bbm1.c, * glprsm/glp_simplex1, glprsm/glp_pivoting.c Default form of the inverse was changed from RFI to AFI. Mon Sep 24 12:00:00 2001 Andrew Makhorin * GLPK 3.0.2 has been released. * glpfhv.h, glpfhv.c New version of the basis maintaining routines was implemented. These routines, which are based on so called FHV-factorization (a variety of LU-factorization) and Gustavson's data structures, perform the main operations on the basis matrix faster at the expense of some worsening numerical accuracy. * glprsm.h, glprsm/afi.c The routines, which implement AFI (Advanced Form of the Inverse) based on FHV-factorization, were added to the package. This new form is available via the parameter form = 3 (on API level) or via the option --afi (in GLPSOL solver). * EFI was renamed to PFI In order to correct terminology the acronym EFI (Elimination Form of the Inverse) was replaced by PFI (Product Form of the Inverse) everywhere in the source code and the documentation. * glpset/umalloc.c, glpset/ucalloc.c * glpset/get_atom.c, glpset/get_atomv.c These memory management routines were changed in order *not* to clear allocated memory blocks by binary zeros. Wed Aug 01 12:00:00 2001 Andrew Makhorin * GLPK 3.0.1 has been released. * glpapi/old_api.c, glplp/extract_lp.c, store_lpsol.c Old API routines were deleted from the package. * include/glpk.h, include/glpapi.h, include/glplp.h Specifications of old API routines and data structures were removed from the headers. * sample/glpsol.c New version of the stand-alone solver GLPSOL that now uses new API routines was implemented. * glpapi/glp_set_row_fctr.c, glpapi/glp_set_col_fctr.c, * glpapi/glp_get_row_fctr.c, glpapi/glp_get_col_fctr.c, * glpapi/glp_scale_prob.c Scaling routines were added. * glpapi/glp_write_mps.c The routine for writing problem data in MPS format was added. * glpapi/glp_simplex1.c Comprehensive driver to the simplex method was added. * glpapi/glp_pivoting.c The routines glp_pivot_in() and glp_pivot_out() intended for basis maintaining were added. * glprsm/create_rsm.c, glprsm/delete_rsm.c, glprsm/scale_rsm.c, * glprsm/build_basis.c Additional low level routines related to the simplex method were added. * glpk.h, glpapi.h, glprsm.h Additional specifications for new routines and data structures were added. * sample/lpglpk30.c A non-trivial example was added. It allows using GLPK as a base LP solver for Concorde, a program for solving Traveling Salesman Problem (TSP). For details see comments in 'lpglpk30.c'. * doc/newapi.txt The document "Additional GLPK API Routines" that describes some new API routines was included. Thu Jul 19 12:00:00 2001 Andrew Makhorin * GLPK 3.0 has been released. Now GLPK is provided with new API, which is intended for using the package in more complex algorithmic schemes. * glpapi/old_api.c All routines related to old API were gathered in one file named 'old_api.c'. * glpapi/*.c These routines that implement new API were added to the package. * include/glpk.h, include/glpapi.h Specifications of new API routines and data structures were added to these headers. Specifications of old API routines and data structures were locked by #ifdef GLP_OLD_API directive. * doc/guide.texinfo New edition of the document "GLPK User's Guide" that correspond to new API was included. Thu Jun 14 12:00:00 2001 Andrew Makhorin * GLPK 2.4.1 has been released. * doc/glpk_ml.texinfo The new document "Modeling Language GLPK/L" was included. * doc/glpk_ug.texinfo New edition of the document "GLPK User's Guide" was included. * doc/language.txt The preliminary document "GLPK/L Modeling Language: A Brief description" was removed from the distribution, because it has been replaced by the new document "Modeling Language GLPK/L". * glplang/l_spar.c The routine comparison() was re-programmed in order to implement the relation operation as specified in the language description. * glpmip.h, glpmip/*.c The partition 'glpmip' was renamed to 'glpbbm'. Thu May 10 12:00:00 2001 Andrew Makhorin * GLPK 2.4 has been released. Now GLPK includes an implementation of a preliminary version of the GLPK/L modeling language. * glplang.h, glplang/*.c The header 'glplang.h' and a set of routines that implements the GLPK/L language processor (the partition 'glplang') were added to the package. * doc/language.txt The document "GLPK/L Modeling Language: A Brief Description (Supplement to GLPK User's Guide)" in plain text format was included in the package (see the file 'language.txt' in the subdirectory 'doc' of the distribution). * ex/model1.lpm, ex/model2.lpm Two examples of model descriptions written in GLPK/L were added to the package. * sample/glpsol.c This program was modified in order: a) to allow processing model description written in GLPK/L; b) to allow solving pure LP problem using the interior point method. * sample/glpipm.c This program was removed from the package, because its function was passed to the GLPSOL solver. * Makefile.in This file was changed in order to install the GLPSOL solver executable. Mon Apr 09 12:00:00 2001 Andrew Makhorin * GLPK 2.3 has been released. * glpmip.h, glpmip/*.c These routines (that implement the branch-and-bound method) were re-programmed in order to improve robustness of implementation. In particular, heuristic routines were carried out from the main driver routine. Additional GLPK API routines were documented. New edition of the document "GLPK User's Guide" was included in the package. The preliminary document "Mixed Integer Programming Using GLPK Version 2.2 (Supplement to GLPK User's Guide)" was removed from the package, because this material was included in GLPK User's Guide. Thu Mar 15 12:00:00 2001 Andrew Makhorin * GLPK 2.2 has been released. Now GLPK includes a tentative implementation of the branch-and-bound procedure based on the dual simplex method for mixed integer linear programming (MIP). The preliminary document "Mixed Integer Programming Using GLPK Version 2.2 (Supplement to GLPK User's Guide)" was included into the package in plain text format (see the file 'mip.txt' in the subdirectory 'doc' of the distribution). * glpmip.h, glpmip/*.c, glpapi/glp_integer.c These routines (that implement the branch-and-bound method) were added to the package. * sample/glpsol.c This program was modified in order to allow solving LP and MIP problems. * glprsm/rsm_primal.c, glprsm/rsm_dual.c, glprsm/rsm_feas.c, * glprsm/rsm1_driver.c These routines (which are drivers to basic components of the revised simplex method) were added to the package. Mon Feb 19 12:00:00 2001 Andrew Makhorin * GLPK 2.1 has been released. * glprsm.h, glprsm/*.c These routines (that implement components of the revised simplex method) were re-programmed and documented. The document "GLPK Implementation of the Revised Simplex Method" was included into the package. Thu Jan 25 12:00:00 2001 Andrew Makhorin * GLPK 2.0 has been released. Now GLPK includes a tentative implementation of the primal-dual interior point method for large-scale linear programming (for more details see the file `NEWS' in the distribution). A number of routines related to the interior point method were added to the package. * insist.c The routine `insist' and the macro of the same name were introduced into the package in order to replace the standard macro `assert'. Some routines require the expression specified in the `assert' macro to be evaluated, but compiling the package with NDEBUG option prevents from that. This bug was fixed due to bug report provided by Peter A. Huegler . * Makefile.in Minor bug was fixed due to a patch provided by Alexandre Oliva . Wed Jan 10 12:00:00 2001 Andrew Makhorin * GLPK 1.1.2 has been released. * umalloc.c, ufree.c, create_pool.c, get_atom.c, get_atomv.c These routines were changed in order to fix a bug due to report provided by Andrew Hood . Because of this bug data alignment error occured on the Sparc computer. Tue Dec 14 12:00:00 2000 Andrew Makhorin * GLPK 1.1.1 has been released. Minor bug was fixed in `Makefile.in'. GLPK Library Reference was included. Mon Nov 27 12:00:00 2000 Andrew Makhorin * GLPK 1.1 has been released. Minor changes were made in order to co-ordinate GLPK routines and their descriptions. GLPK User's Guide was included. Fri Oct 20 12:00:00 2000 Andrew Makhorin * GLPK 1.0 has been released. glpk-5.0/config.guess0000755000062000006210000012760713766346220014037 0ustar maomkpasswd#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, # 2011, 2012 Free Software Foundation, Inc. timestamp='2012-09-25' # 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, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner. Please send patches (context # diff format) to and include a 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. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD 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, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW64*:*) echo ${UNAME_MACHINE}-pc-mingw64 exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-gnu else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-gnueabi else echo ${UNAME_MACHINE}-unknown-linux-gnueabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-gnu exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-gnu exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:Linux:*:*) LIBC=gnu eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; or32:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; padre:Linux:*:*) echo sparc-unknown-linux-gnu exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-gnu exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; x86_64:Haiku:*:*) echo x86_64-unknown-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in i386) eval $set_cc_for_build if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then UNAME_PROCESSOR="x86_64" fi fi ;; unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; esac eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: glpk-5.0/config.h.in0000644000062000006210000000142713766346220013531 0ustar maomkpasswd/* config.h.in (GLPK configuration template file) */ #undef HAVE_SYS_TIME_H /* defined if the header can be used */ #undef HAVE_GETTIMEOFDAY /* defined if the gettimeofday function can be used */ #undef HAVE_GMP /* defined if the GNU MP bignum library is available */ /* requires and -lgmp */ #undef HAVE_LTDL /* defined if the GNU Libtool shared library support is enabled */ /* requires and -lltdl */ #undef HAVE_DLFCN /* defined if the POSIX shared library support is enabled */ /* requires */ #undef ODBC_DLNAME /* ODBC shared library name if this feature is enabled */ #undef MYSQL_DLNAME /* MySQL shared library name if this feature is enabled */ #undef TLS /* thread local storage-class specifier for re-entrancy (if any) */ /* eof */ glpk-5.0/config.sub0000755000062000006210000010556213766346220013476 0ustar maomkpasswd#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, # 2011, 2012 Free Software Foundation, Inc. timestamp='2012-10-10' # 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, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . Submit a context # diff and a properly formatted GNU 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. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze*) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -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 \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ | avr | avr32 \ | be32 | be64 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | epiphany \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 \ | ns16k | ns32k \ | open8 \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze*) basic_machine=microblaze-xilinx ;; mingw64) basic_machine=x86_64-pc os=-mingw64 ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i386-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; 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 ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; 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 ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -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* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -bitrig* | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) 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 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: glpk-5.0/configure0000755000062000006210000144766713766346220013442 0ustar maomkpasswd#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for GLPK 5.0. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and bug-glpk@gnu.org $0: about your system, including any error possibly output $0: before this message. Then install a modern shell, or $0: manually run the script under such a shell if you do $0: have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" SHELL=${CONFIG_SHELL-/bin/sh} test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='GLPK' PACKAGE_TARNAME='glpk' PACKAGE_VERSION='5.0' PACKAGE_STRING='GLPK 5.0' PACKAGE_BUGREPORT='bug-glpk@gnu.org' PACKAGE_URL='' ac_unique_file="src/glpk.h" # 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 NOUNDEFINED CPP OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL MANIFEST_TOOL RANLIB ac_ct_AR AR DLLTOOL OBJDUMP LN_S NM ac_ct_DUMPBIN DUMPBIN LD FGREP EGREP GREP SED host_os host_vendor host_cpu host build_os build_vendor build_cpu build LIBTOOL am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking with_gmp enable_dl enable_odbc enable_mysql enable_reentrant enable_dependency_tracking enable_shared enable_static with_pic enable_fast_install with_gnu_ld with_sysroot enable_libtool_lock ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures GLPK 5.0 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/glpk] --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 GLPK 5.0:";; 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-dl enable shared library support [[default=no]] --enable-odbc enable MathProg ODBC support [[default=no]] --enable-mysql enable MathProg MySQL support [[default=no]] --enable-reentrant enable reentrancy support [[default=yes]] --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --enable-shared[=PKGS] build shared libraries [default=yes] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --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-gmp use GNU MP bignum library [[default=no]] --with-pic try to use only PIC/non-PIC objects [default=use both] --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot=DIR Search for dependent libraries within DIR (or the compiler's sysroot if not specified). 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 (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor 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 GLPK configure 5.0 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_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; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## ------------------------------- ## ## Report this to bug-glpk@gnu.org ## ## ------------------------------- ##" ) | 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 eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel 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 GLPK $as_me 5.0, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version='1.12' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --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 ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null 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='glpk' VERSION='5.0' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' ac_config_headers="$ac_config_headers config.h" # Check whether --with-gmp was given. if test "${with_gmp+set}" = set; then : withval=$with_gmp; case $withval in yes | no) ;; *) as_fn_error $? "invalid value \`$withval' for --with-gmp" "$LINENO" 5;; esac else with_gmp=no fi # Check whether --enable-dl was given. if test "${enable_dl+set}" = set; then : enableval=$enable_dl; case $enableval in yes | ltdl | dlfcn | no) ;; *) as_fn_error $? "invalid value \`$enableval' for --enable-dl" "$LINENO" 5;; esac else enable_dl=no fi # Check whether --enable-odbc was given. if test "${enable_odbc+set}" = set; then : enableval=$enable_odbc; case $enableval in yes | unix | no) ;; *) as_fn_error $? "invalid value \`$enableval' for --enable-odbc" "$LINENO" 5;; esac else enable_odbc=no fi # Check whether --enable-mysql was given. if test "${enable_mysql+set}" = set; then : enableval=$enable_mysql; case $enableval in yes | no) ;; *) as_fn_error $? "invalid value \`$enableval' for --enable-mysql" "$LINENO" 5;; esac else enable_mysql=no fi # Check whether --enable-reentrant was given. if test "${enable_reentrant+set}" = set; then : enableval=$enable_reentrant; case $enableval in yes | no) ;; *) as_fn_error $? "invalid value \`$enableval' for --enable-reentrant" "$LINENO" 5;; esac else enable_reentrant=yes fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi case `pwd` in *\ * | *\ *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 $as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac macro_version='2.4' macro_revision='1.3294' ltmain="$ac_aux_dir/ltmain.sh" # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac # Backslashify metacharacters that are still active within # double-quoted strings. 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 delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 $as_echo_n "checking how to print strings... " >&6; } # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "" } case "$ECHO" in printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 $as_echo "printf" >&6; } ;; print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 $as_echo "print -r" >&6; } ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 $as_echo "cat" >&6; } ;; esac { $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 ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_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 do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_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 '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "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_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_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_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 $as_echo_n "checking for fgrep... " >&6; } if ${ac_cv_path_FGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then ac_path_FGREP_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 fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_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 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "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_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_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_FGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 $as_echo "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" test -z "$GREP" && GREP=grep # 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 ${lt_cv_path_LD+:} false; 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 variants of GNU ld 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 ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds 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 BSD- or MS-compatible name lister (nm)" >&5 $as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if ${lt_cv_path_NM+:} false; 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_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_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" done : ${lt_cv_path_NM=no} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 $as_echo "$lt_cv_path_NM" >&6; } if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else if test -n "$ac_tool_prefix"; then for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DUMPBIN="$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 DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 $as_echo "$DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$DUMPBIN" && break done fi if test -z "$DUMPBIN"; then ac_ct_DUMPBIN=$DUMPBIN for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DUMPBIN="$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_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 $as_echo "$ac_ct_DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_DUMPBIN" && break done if test "x$ac_ct_DUMPBIN" = x; then DUMPBIN=":" 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 DUMPBIN=$ac_ct_DUMPBIN fi fi case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm { $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 $as_echo_n "checking the name lister ($NM) interface... " >&6; } if ${lt_cv_nm_interface+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 $as_echo "$lt_cv_nm_interface" >&6; } { $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 # 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 ${lt_cv_sys_max_cmd_len+:} false; 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* | cegcc*) # 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; ;; mint*) # On MiNT this can take a long time and run out of memory. 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; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # 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"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` 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` fi ;; 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 max_cmd_len=$lt_cv_sys_max_cmd_len : ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 $as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 $as_echo "$xsi_shell" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 $as_echo_n "checking whether the shell understands \"+=\"... " >&6; } lt_shell_append=no ( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 $as_echo "$lt_shell_append" >&6; } if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 $as_echo_n "checking how to convert $build file names to $host format... " >&6; } if ${lt_cv_to_host_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 $as_echo "$lt_cv_to_host_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 $as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } if ${lt_cv_to_tool_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 $as_echo "$lt_cv_to_tool_file_cmd" >&6; } { $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 ${lt_cv_ld_reload_flag+:} false; 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' case $host_os in cygwin* | mingw* | pw32* | cegcc*) if test "$GCC" != yes; then reload_cmds=false fi ;; darwin*) if test "$GCC" = yes; then reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $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 OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $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_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="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 OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi test -z "$OBJDUMP" && OBJDUMP=objdump { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 $as_echo_n "checking how to recognize dependent libraries... " >&6; } if ${lt_cv_deplibs_check_method+:} false; 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 aix[4-9]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) 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', # unless we find 'file', for example because we are cross-compiling. # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) 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|DragonFly)/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 ;; haiku*) 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])(-bit)?( [LM]SB)? 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 ;; interix[3-9]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; 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* | k*bsd*-gnu | kopensolaris*-gnu) 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=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) 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 ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) 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_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` fi ;; esac fi 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 test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $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 DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $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_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="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 DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi test -z "$DLLTOOL" && DLLTOOL=dlltool { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 $as_echo_n "checking how to associate runtime and link libraries... " >&6; } if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 $as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO if test -n "$ac_tool_prefix"; then for ac_prog in ar do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$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 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 test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$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_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 test -n "$ac_ct_AR" && break done 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 fi : ${AR=ar} : ${AR_FLAGS=cru} { $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 $as_echo_n "checking for archiver @FILE support... " >&6; } if ${lt_cv_ar_at_file+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 $as_echo "$lt_cv_ar_at_file" >&6; } if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file 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 ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi test -z "$RANLIB" && RANLIB=: # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # 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 ${lt_cv_sys_global_symbol_pipe+:} false; 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]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[ABCDGISTW]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[ABCDEGRST]' fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; 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 # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \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\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # 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 # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF 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 # 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 <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_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_globsym_save_LIBS CFLAGS=$lt_globsym_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 -rf 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 # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then nm_file_list_spec='@' fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 $as_echo_n "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. if test "${with_sysroot+set}" = set; then : withval=$with_sysroot; else with_sysroot=no fi lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 $as_echo "${with_sysroot}" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 $as_echo "${lt_sysroot:-no}" >&6; } # 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 '$LINENO' "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-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|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-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; 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-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) 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 ${lt_cv_cc_needs_belf+:} false; 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 ;; sparc*-*solaris*) # 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 *64-bit*) case $lt_cv_prog_gnu_ld in yes*) LD="${LD-ld} -m elf64_sparc" ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. set dummy ${ac_tool_prefix}mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" $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 MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 $as_echo "$MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_MANIFEST_TOOL"; then ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL # Extract the first word of "mt", so it can be a program name with args. set dummy mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" $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_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 $as_echo "$ac_ct_MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then MANIFEST_TOOL=":" 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 MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL fi else MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" fi test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 $as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } if ${lt_cv_path_mainfest_tool+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&5 if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 $as_echo "$lt_cv_path_mainfest_tool" >&6; } if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" $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 DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 $as_echo "$DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" $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_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 $as_echo "$ac_ct_DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" 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 DSYMUTIL=$ac_ct_DSYMUTIL fi else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" $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 NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 $as_echo "$NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_NMEDIT="nmedit" $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_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 $as_echo "$ac_ct_NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" 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 NMEDIT=$ac_ct_NMEDIT fi else NMEDIT="$ac_cv_prog_NMEDIT" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" $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 LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 $as_echo "$LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_LIPO="lipo" $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_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 $as_echo "$ac_ct_LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then LIPO=":" 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 LIPO=$ac_ct_LIPO fi else LIPO="$ac_cv_prog_LIPO" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" $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 OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 $as_echo "$OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL="otool" $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_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 $as_echo "$ac_ct_OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then OTOOL=":" 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 OTOOL=$ac_ct_OTOOL fi else OTOOL="$ac_cv_prog_OTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" $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 OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 $as_echo "$OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL64="otool64" $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_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 $as_echo "$ac_ct_OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then OTOOL64=":" 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 OTOOL64=$ac_ct_OTOOL64 fi else OTOOL64="$ac_cv_prog_OTOOL64" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 $as_echo_n "checking for -single_module linker flag... " >&6; } if ${lt_cv_apple_cc_single_mod+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&5 $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 fi rm -rf libconftest.dylib* rm -f conftest.* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 $as_echo "$lt_cv_apple_cc_single_mod" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } if ${lt_cv_ld_exported_symbols_list+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" 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_ld_exported_symbols_list=yes else lt_cv_ld_exported_symbols_list=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 $as_echo_n "checking for -force_load linker flag... " >&6; } if ${lt_cv_ld_force_load+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 echo "$AR cru libconftest.a conftest.o" >&5 $AR cru libconftest.a conftest.o 2>&5 echo "$RANLIB libconftest.a" >&5 $RANLIB libconftest.a 2>&5 cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -f conftest && test ! -s conftest.err && test $_lt_result = 0 && $GREP forced_load conftest 2>&1 >/dev/null; then lt_cv_ld_force_load=yes else cat conftest.err >&5 fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 $as_echo "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[91]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[012]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in dlfcn.h do : ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " if test "x$ac_cv_header_dlfcn_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLFCN_H 1 _ACEOF fi done # Set options enable_dlopen=no enable_win32_dll=no # 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=yes 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 --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 # 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 # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' test -z "$LN_S" && LN_S="ln -s" if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 $as_echo_n "checking for objdir... " >&6; } if ${lt_cv_objdir+:} false; 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 cat >>confdefs.h <<_ACEOF #define LT_OBJDIR "$lt_cv_objdir/" _ACEOF 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 # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file 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 ${lt_cv_path_MAGIC_CMD+:} false; 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 <<_LT_EOF 1>&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 _LT_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 ${lt_cv_path_MAGIC_CMD+:} false; 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 <<_LT_EOF 1>&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 _LT_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 # Use C for the default configuration in the libtool script 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;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ## 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... if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test "$GCC" = yes; then case $cc_basename in nvcc*) lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; *) lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; esac { $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 ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$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}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $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 other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; 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= 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*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic='-fPIC' ;; m68k) # 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' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # 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). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries 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' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; 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 ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; *) lt_prog_compiler_pic='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl='-Xlinker ' lt_prog_compiler_pic='-Xcompiler -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* | cygwin* | pw32* | os2* | cegcc*) # 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' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ F* | *Sun*Fortran*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) 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 ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac 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 for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic=$lt_prog_compiler_pic fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 $as_echo "$lt_cv_prog_compiler_pic" >&6; } lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # 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 ${lt_cv_prog_compiler_pic_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$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}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $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 other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; } if test x"$lt_cv_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 # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker 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 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 $as_echo "$lt_cv_prog_compiler_static_works" >&6; } if test x"$lt_cv_prog_compiler_static_works" = xyes; then : else lt_prog_compiler_static= fi { $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 ${lt_cv_prog_compiler_c_o+:} false; 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 echo "$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}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $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 $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $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 .. $RM -r 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; } { $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 ${lt_cv_prog_compiler_c_o+:} false; 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 echo "$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}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $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 $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $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 .. $RM -r 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= always_export_symbols=no archive_cmds= archive_expsym_cmds= compiler_needs_object=no enable_shared_with_static_runtimes=no export_dynamic_flag_spec= export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic=no hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= hardcode_libdir_flag_spec_ld= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported inherit_rpath=no link_all_deplibs=unknown module_cmds= module_expsym_cmds= old_archive_from_new_cmds= old_archive_from_expsyms_cmds= thread_safe_flag_spec= whole_archive_flag_spec= # 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_|_GLOBAL__F[ID]_.*' # 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. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # 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 ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. 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 supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [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 # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, 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 install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) 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 ;; esac ;; 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* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' export_dynamic_flag_spec='${wl}--export-all-symbols' 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 '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $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}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; haiku*) archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs=yes ;; interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; 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 '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec= hardcode_libdir_flag_spec_ld='-rpath $libdir' archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; 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~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac 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 $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <<_LT_EOF 1>&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. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' 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 ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $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" = no; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= 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 "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) 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 # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". 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") || (\$ 2 == "W")) && (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].*|aix[5-9]*) 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_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes file_list_spec='${wl}-f,' 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 : 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' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi 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 export_dynamic_flag_spec='${wl}-bexpall' # 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. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${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 '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ 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' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' fi archive_cmds_need_lc=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) 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 ;; esac ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # 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. case $cc_basename in cl*) # Native MSVC hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported always_export_symbols=yes file_list_spec='@' # 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 $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, )='true' enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds='chmod 644 $oldlib' postlink_cmds='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper 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 `func_echo_all "$deplibs" | $SED '\''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' enable_shared_with_static_runtimes=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec='' fi link_all_deplibs=yes allow_undefined_flag="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" 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* | dragonfly*) archive_cmds='$CC -shared $pic_flag -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 $pic_flag ${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*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_flag_spec_ld='+b $libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=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 fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 $as_echo_n "checking if $CC understands -b... " >&6; } if ${lt_cv_prog_compiler__b+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler__b=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -b" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker 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 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler__b=yes fi else lt_cv_prog_compiler__b=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 $as_echo "$lt_cv_prog_compiler__b" >&6; } if test x"$lt_cv_prog_compiler__b" = xyes; then archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes hardcode_direct_absolute=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 $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if ${lt_cv_irix_exported_symbol+:} false; then : $as_echo_n "(cached) " >&6 else save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo (void) { return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_irix_exported_symbol=yes else lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 $as_echo "$lt_cv_irix_exported_symbol" >&6; } if test "$lt_cv_irix_exported_symbol" = yes; then archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: inherit_rpath=yes 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 ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no hardcode_direct_absolute=yes 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' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' 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 else ld_shlibs=no 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" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi archive_cmds_need_lc='no' 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} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${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='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-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; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi archive_cmds_need_lc='no' hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${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 $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' 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' ;; *) wlarc='${wl}' archive_cmds='$CC -G${allow_undefined_flag} -h $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 -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; 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*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag='${wl}-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='${wl}-z,text' allow_undefined_flag='${wl}-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-R,$libdir' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; 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 if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec='${wl}-Blargedynsym' ;; esac fi 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 with_gnu_ld=$with_gnu_ld # # 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; } if ${lt_cv_archive_cmds_need_lc+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$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 pic_flag=$lt_prog_compiler_pic 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 lt_cv_archive_cmds_need_lc=no else lt_cv_archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 $as_echo "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # 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. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([A-Za-z]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi 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" 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' ;; aix[4-9]*) 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*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) 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=`func_echo_all "$lib" | $SED '\''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' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) 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* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc 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~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' 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="$sys_lib_search_path_spec /usr/lib/w32api" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; 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 dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. 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 # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # 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 dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # 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}${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`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" 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 ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[123]*) objformat=aout ;; *) objformat=elf ;; esac fi 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 ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes 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 ;; haiku*) version_type=linux need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" 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=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' 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' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) 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' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; 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* | k*bsd*-gnu | kopensolaris*-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' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # 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 # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $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' ;; 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=qnx 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='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac 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" ;; rdos*) dynamic_linker=no ;; 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.3*) 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 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 ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/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}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; 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 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 if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $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-existent 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_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 || test "$inherit_rpath" = yes; 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 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* | cegcc*) 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 ${ac_cv_lib_dl_dlopen+:} false; 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" = xyes; 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" = xyes; 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 ${ac_cv_lib_dld_shl_load+:} false; 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" = xyes; then : lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" else ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes; 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 ${ac_cv_lib_dl_dlopen+:} false; 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" = xyes; 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 ${ac_cv_lib_svld_dlopen+:} false; 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" = xyes; 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 ${ac_cv_lib_dld_dld_link+:} false; 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" = xyes; then : lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" 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" wl=$lt_prog_compiler_wl 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 ${lt_cv_dlopen_self+:} false; 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 <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #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 /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 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; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_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; ) >&5 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_dlunknown|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 wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { $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 ${lt_cv_dlopen_self_static+:} false; 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 <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #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 /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 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; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_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; ) >&5 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_dlunknown|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 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" old_striplib="$STRIP -S" { $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 # Report which library types will 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 ;; aix[4-9]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=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; } 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" ac_config_commands="$ac_config_commands libtool" # Only expand once: { $as_echo "$as_me:${as_lineno-$LINENO}: checking for exp in -lm" >&5 $as_echo_n "checking for exp in -lm... " >&6; } if ${ac_cv_lib_m_exp+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char exp (); int main () { return exp (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_exp=yes else ac_cv_lib_m_exp=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_m_exp" >&5 $as_echo "$ac_cv_lib_m_exp" >&6; } if test "x$ac_cv_lib_m_exp" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBM 1 _ACEOF LIBS="-lm $LIBS" fi ac_fn_c_check_header_mongrel "$LINENO" "sys/time.h" "ac_cv_header_sys_time_h" "$ac_includes_default" if test "x$ac_cv_header_sys_time_h" = xyes; then : $as_echo "#define HAVE_SYS_TIME_H 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "gettimeofday" "ac_cv_func_gettimeofday" if test "x$ac_cv_func_gettimeofday" = xyes; then : $as_echo "#define HAVE_GETTIMEOFDAY 1" >>confdefs.h fi if test "$with_gmp" = "yes"; then ac_fn_c_check_header_mongrel "$LINENO" "gmp.h" "ac_cv_header_gmp_h" "$ac_includes_default" if test "x$ac_cv_header_gmp_h" = xyes; then : else as_fn_error $? "gmp.h header not found" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use GNU MP bignum library" >&5 $as_echo_n "checking whether to use GNU MP bignum library... " >&6; } if test "$with_gmp" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define HAVE_GMP 1" >>confdefs.h LIBS="-lgmp $LIBS" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable shared library support" >&5 $as_echo_n "checking whether to enable shared library support... " >&6; } if test "$enable_dl" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: ltdl" >&5 $as_echo "ltdl" >&6; } $as_echo "#define HAVE_LTDL 1" >>confdefs.h LIBS="-lltdl $LIBS" elif test "$enable_dl" = "ltdl"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: ltdl" >&5 $as_echo "ltdl" >&6; } $as_echo "#define HAVE_LTDL 1" >>confdefs.h LIBS="-lltdl $LIBS" elif test "$enable_dl" = "dlfcn"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: dlfcn" >&5 $as_echo "dlfcn" >&6; } $as_echo "#define HAVE_DLFCN 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi case $host_os in darwin* | macosx*) LIBIODBC="libiodbc.dylib" LIBODBC="libodbc.dylib" LIBMYSQL="libmysqlclient.dylib" ;; *) LIBIODBC="libiodbc.so" LIBODBC="libodbc.so" LIBMYSQL="libmysqlclient.so" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable MathProg ODBC support" >&5 $as_echo_n "checking whether to enable MathProg ODBC support... " >&6; } if test "$enable_odbc" = "yes"; then if test "$enable_dl" = "no"; then as_fn_error $? "--enable-odbc requires --enable-dl" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CFLAGS="$(iodbc-config --cflags) $CFLAGS" cat >>confdefs.h <<_ACEOF #define ODBC_DLNAME "$LIBIODBC" _ACEOF elif test "$enable_odbc" = "unix"; then if test "$enable_dl" = "no"; then as_fn_error $? "--enable-odbc requires --enable-dl" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: unix" >&5 $as_echo "unix" >&6; } cat >>confdefs.h <<_ACEOF #define ODBC_DLNAME "$LIBODBC" _ACEOF else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable MathProg MySQL support" >&5 $as_echo_n "checking whether to enable MathProg MySQL support... " >&6; } if test "$enable_mysql" = "yes"; then if test "$enable_dl" = "no"; then as_fn_error $? "--enable-mysql requires --enable-dl" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CPPFLAGS="-I/usr/include/mysql $CPPFLAGS" cat >>confdefs.h <<_ACEOF #define MYSQL_DLNAME "$LIBMYSQL" _ACEOF else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable reentrancy support" >&5 $as_echo_n "checking whether to enable reentrancy support... " >&6; } if test "$enable_reentrant" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for thread local storage (TLS) class specifier" >&5 $as_echo_n "checking for thread local storage (TLS) class specifier... " >&6; } keywords="_Thread_local __thread __declspec(thread)" tls=none for tls_keyword in $keywords; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include static void foo(void) { static $tls_keyword int bar; exit(1); } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tls=$tls_keyword; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tls" >&5 $as_echo "$tls" >&6; } if test "$tls" != "none"; then cat >>confdefs.h <<_ACEOF #define TLS $tls _ACEOF else as_fn_error $? "Reentrancy needs complier support for TLS" "$LINENO" 5 fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool needs -no-undefined flag to build shared libraries" >&5 $as_echo_n "checking if libtool needs -no-undefined flag to build shared libraries... " >&6; } case "${host}" in *-*-cygwin* | *-*-mingw* | *-*-aix*) ## Add in the -no-undefined flag to LDFLAGS for libtool. { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } NOUNDEFINED=" -no-undefined" ;; *) ## Don't add in anything. { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac ac_config_files="$ac_config_files src/Makefile examples/Makefile 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 if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__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 : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by GLPK $as_me 5.0, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ GLPK config.status 5.0 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_ld='`$ECHO "$hardcode_libdir_flag_spec_ld" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } # Quote evaled strings. for var in SHELL \ ECHO \ SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ OBJDUMP \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ DLLTOOL \ sharedlib_from_linklib_cmd \ AR \ AR_FLAGS \ archiver_list_spec \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ nm_file_list_spec \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_pic \ lt_prog_compiler_wl \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ MANIFEST_TOOL \ DSYMUTIL \ NMEDIT \ LIPO \ OTOOL \ OTOOL64 \ shrext_cmds \ export_dynamic_flag_spec \ whole_archive_flag_spec \ compiler_needs_object \ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ hardcode_libdir_flag_spec_ld \ hardcode_libdir_separator \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ install_override_mode \ finish_eval \ old_striplib \ striplib; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in reload_cmds \ old_postinstall_cmds \ old_postuninstall_cmds \ old_archive_cmds \ extract_expsyms_cmds \ old_archive_from_new_cmds \ old_archive_from_expsyms_cmds \ archive_cmds \ archive_expsym_cmds \ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ postlink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ sys_lib_dlsearch_path_spec; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done ac_aux_dir='$ac_aux_dir' xsi_shell='$xsi_shell' lt_shell_append='$lt_shell_append' # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile' _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 "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "examples/Makefile") CONFIG_FILES="$CONFIG_FILES examples/Makefile" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # 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"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "libtool":C) # 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 cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010 Free Software Foundation, # Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # The names of the tagged configurations supported by this script. available_tags="" # ### BEGIN LIBTOOL CONFIG # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that protects backslashes. ECHO=$lt_ECHO # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # 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 1s/^X//" # A grep program that handles long lines. GREP=$lt_GREP # An ERE matcher. EGREP=$lt_EGREP # A literal string matcher. FGREP=$lt_FGREP # A BSD- or MS-compatible name lister. NM=$lt_NM # Whether we need soft or hard links. LN_S=$lt_LN_S # What is the maximum length of a command? max_cmd_len=$max_cmd_len # Object file suffix (normally "o"). objext=$ac_objext # Executable file suffix (normally ""). exeext=$exeext # whether the shell understands "unset". lt_unset=$lt_unset # turn spaces into newlines. SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP # convert \$build file names to \$host format. to_host_file_cmd=$lt_cv_to_host_file_cmd # convert \$build files to toolchain format. to_tool_file_cmd=$lt_cv_to_tool_file_cmd # An object symbol dumper. OBJDUMP=$lt_OBJDUMP # 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 # How to find potential files when deplibs_check_method = "file_magic". file_magic_glob=$lt_file_magic_glob # Find potential files using nocaseglob when deplibs_check_method = "file_magic". want_nocaseglob=$lt_want_nocaseglob # DLL creation program. DLLTOOL=$lt_DLLTOOL # Command to associate shared and link libraries. sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd # The archiver. AR=$lt_AR # Flags to create an archive. AR_FLAGS=$lt_AR_FLAGS # How to feed a file listing to the archiver. archiver_list_spec=$lt_archiver_list_spec # A symbol stripping program. STRIP=$lt_STRIP # Commands used to install an old-style archive. RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Whether to use a lock for old archive extraction. lock_old_archive_extraction=$lock_old_archive_extraction # A C compiler. LTCC=$lt_CC # LTCC compiler flags. LTCFLAGS=$lt_CFLAGS # 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 # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix # Specify filename containing input files for \$NM. nm_file_list_spec=$lt_nm_file_list_spec # The root where to search for dependent libraries,and in which our libraries should be installed. lt_sysroot=$lt_sysroot # The name of the directory that contains temporary libtool files. objdir=$objdir # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks # Manifest tool. MANIFEST_TOOL=$lt_MANIFEST_TOOL # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL # Tool to change global to local symbols on Mac OS X. NMEDIT=$lt_NMEDIT # Tool to manipulate fat objects and archives on Mac OS X. LIPO=$lt_LIPO # ldd/readelf like tool for Mach-O binaries on Mac OS X. OTOOL=$lt_OTOOL # ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. OTOOL64=$lt_OTOOL64 # Old archive suffix (normally "a"). libext=$libext # Shared library suffix (normally ".so"). shrext_cmds=$lt_shrext_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink=$lt_variables_saved_for_relink # 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 # Library versioning type. version_type=$version_type # Shared library runtime path variable. runpath_var=$runpath_var # Shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # 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 # Permission mode override for installation of shared libraries. install_override_mode=$lt_install_override_mode # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds # Command to use after uninstallation of a shared archive. postuninstall_cmds=$lt_postuninstall_cmds # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # 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 # 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 # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds # A language specific compiler. CC=$lt_compiler # Is the compiler the GNU compiler? with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # 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 # 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 # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object # 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 a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # 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 DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute # 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 # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # 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 # 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 # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds # Specify filename containing input files. file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_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 _LT_EOF ;; esac ltmain="$ac_aux_dir/ltmain.sh" # 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) if test x"$xsi_shell" = xyes; then sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ func_dirname ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ } # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_basename ()$/,/^} # func_basename /c\ func_basename ()\ {\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ func_dirname_and_basename ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ func_stripname ()\ {\ \ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ \ # positional parameters, so assign one to ordinary parameter first.\ \ func_stripname_result=${3}\ \ func_stripname_result=${func_stripname_result#"${1}"}\ \ func_stripname_result=${func_stripname_result%"${2}"}\ } # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ func_split_long_opt ()\ {\ \ func_split_long_opt_name=${1%%=*}\ \ func_split_long_opt_arg=${1#*=}\ } # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ func_split_short_opt ()\ {\ \ func_split_short_opt_arg=${1#??}\ \ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ } # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ func_lo2o ()\ {\ \ case ${1} in\ \ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ \ *) func_lo2o_result=${1} ;;\ \ esac\ } # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_xform ()$/,/^} # func_xform /c\ func_xform ()\ {\ func_xform_result=${1%.*}.lo\ } # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_arith ()$/,/^} # func_arith /c\ func_arith ()\ {\ func_arith_result=$(( $* ))\ } # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_len ()$/,/^} # func_len /c\ func_len ()\ {\ func_len_result=${#1}\ } # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$lt_shell_append" = xyes; then sed -e '/^func_append ()$/,/^} # func_append /c\ func_append ()\ {\ eval "${1}+=\\${2}"\ } # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ func_append_quoted ()\ {\ \ func_quote_for_eval "${2}"\ \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ } # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 $as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} fi mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi glpk-5.0/configure.ac0000644000062000006210000001212113766346220013765 0ustar maomkpasswddnl Process this file with autoconf to produce a configure script AC_INIT([GLPK], [5.0], [bug-glpk@gnu.org]) AC_CONFIG_SRCDIR([src/glpk.h]) AC_CONFIG_MACRO_DIR([m4]) AM_INIT_AUTOMAKE AC_CONFIG_HEADERS([config.h]) AC_ARG_WITH(gmp, AC_HELP_STRING([--with-gmp], [use GNU MP bignum library [[default=no]]]), [case $withval in yes | no) ;; *) AC_MSG_ERROR([invalid value `$withval' for --with-gmp]);; esac], [with_gmp=no]) AC_ARG_ENABLE(dl, AC_HELP_STRING([--enable-dl], [enable shared library support [[default=no]]]), [case $enableval in yes | ltdl | dlfcn | no) ;; *) AC_MSG_ERROR([invalid value `$enableval' for --enable-dl]);; esac], [enable_dl=no]) AC_ARG_ENABLE(odbc, AC_HELP_STRING([--enable-odbc], [enable MathProg ODBC support [[default=no]]]), [case $enableval in yes | unix | no) ;; *) AC_MSG_ERROR([invalid value `$enableval' for --enable-odbc]);; esac], [enable_odbc=no]) AC_ARG_ENABLE(mysql, AC_HELP_STRING([--enable-mysql], [enable MathProg MySQL support [[default=no]]]), [case $enableval in yes | no) ;; *) AC_MSG_ERROR([invalid value `$enableval' for --enable-mysql]);; esac], [enable_mysql=no]) AC_ARG_ENABLE(reentrant, AC_HELP_STRING([--enable-reentrant], [enable reentrancy support [[default=yes]]]), [case $enableval in yes | no) ;; *) AC_MSG_ERROR( [invalid value `$enableval' for --enable-reentrant]);; esac], [enable_reentrant=yes]) dnl Disable unnecessary libtool tests define([AC_LIBTOOL_LANG_CXX_CONFIG], [:]) define([AC_LIBTOOL_LANG_F77_CONFIG], [:]) define([AC_LIBTOOL_LANG_GCJ_CONFIG], [:]) dnl Check for programs AC_PROG_CC AC_PROG_INSTALL AC_PROG_LIBTOOL dnl Check for math library AC_CHECK_LIB([m], [exp]) dnl Check for header AC_CHECK_HEADER([sys/time.h], AC_DEFINE([HAVE_SYS_TIME_H], [1], [N/A])) dnl Check for gettimeofday function AC_CHECK_FUNC([gettimeofday], AC_DEFINE([HAVE_GETTIMEOFDAY], [1], [N/A])) dnl Check for header if test "$with_gmp" = "yes"; then AC_CHECK_HEADER([gmp.h], [], [AC_MSG_ERROR([gmp.h header not found])]) fi AC_MSG_CHECKING([whether to use GNU MP bignum library]) if test "$with_gmp" = "yes"; then AC_MSG_RESULT([yes]) AC_DEFINE([HAVE_GMP], [1], [N/A]) LIBS="-lgmp $LIBS" else AC_MSG_RESULT([no]) fi AC_MSG_CHECKING([whether to enable shared library support]) if test "$enable_dl" = "yes"; then AC_MSG_RESULT([ltdl]) AC_DEFINE([HAVE_LTDL], [1], [N/A]) LIBS="-lltdl $LIBS" elif test "$enable_dl" = "ltdl"; then AC_MSG_RESULT([ltdl]) AC_DEFINE([HAVE_LTDL], [1], [N/A]) LIBS="-lltdl $LIBS" elif test "$enable_dl" = "dlfcn"; then AC_MSG_RESULT([dlfcn]) AC_DEFINE([HAVE_DLFCN], [1], [N/A]) else AC_MSG_RESULT([no]) fi case $host_os in darwin* | macosx*) LIBIODBC="libiodbc.dylib" LIBODBC="libodbc.dylib" LIBMYSQL="libmysqlclient.dylib" ;; *) LIBIODBC="libiodbc.so" LIBODBC="libodbc.so" LIBMYSQL="libmysqlclient.so" ;; esac AC_MSG_CHECKING([whether to enable MathProg ODBC support]) if test "$enable_odbc" = "yes"; then if test "$enable_dl" = "no"; then AC_MSG_ERROR([--enable-odbc requires --enable-dl]) fi AC_MSG_RESULT([yes]) CFLAGS="$(iodbc-config --cflags) $CFLAGS" AC_DEFINE_UNQUOTED([ODBC_DLNAME], ["$LIBIODBC"], [N/A]) elif test "$enable_odbc" = "unix"; then if test "$enable_dl" = "no"; then AC_MSG_ERROR([--enable-odbc requires --enable-dl]) fi AC_MSG_RESULT([unix]) AC_DEFINE_UNQUOTED([ODBC_DLNAME], ["$LIBODBC"], [N/A]) else AC_MSG_RESULT([no]) fi AC_MSG_CHECKING([whether to enable MathProg MySQL support]) if test "$enable_mysql" = "yes"; then if test "$enable_dl" = "no"; then AC_MSG_ERROR([--enable-mysql requires --enable-dl]) fi AC_MSG_RESULT([yes]) CPPFLAGS="-I/usr/include/mysql $CPPFLAGS" AC_DEFINE_UNQUOTED([MYSQL_DLNAME], ["$LIBMYSQL"], [N/A]) else AC_MSG_RESULT([no]) fi AC_MSG_CHECKING([whether to enable reentrancy support]) if test "$enable_reentrant" = "yes"; then AC_MSG_RESULT([yes]) AC_MSG_CHECKING([for thread local storage (TLS) class specifier]) keywords="_Thread_local __thread __declspec(thread)" tls=none for tls_keyword in $keywords; do AC_COMPILE_IFELSE([AC_LANG_SOURCE([ #include static void foo(void) { static ] $tls_keyword [ int bar; exit(1); }])], [tls=$tls_keyword; break], []) done AC_MSG_RESULT($tls) if test "$tls" != "none"; then AC_DEFINE_UNQUOTED([TLS], $tls, [N/A]) else AC_MSG_ERROR([Reentrancy needs complier support for TLS]) fi else AC_MSG_RESULT([no]) fi AC_MSG_CHECKING( [if libtool needs -no-undefined flag to build shared libraries]) case "${host}" in *-*-cygwin* | *-*-mingw* | *-*-aix*) ## Add in the -no-undefined flag to LDFLAGS for libtool. AC_MSG_RESULT([yes]) NOUNDEFINED=" -no-undefined" ;; *) ## Don't add in anything. AC_MSG_RESULT([no]) ;; esac AC_SUBST([NOUNDEFINED]) AC_CONFIG_FILES( [src/Makefile examples/Makefile Makefile]) AC_OUTPUT dnl eof glpk-5.0/COPYING0000644000062000006210000010451313766346220012541 0ustar maomkpasswd GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . glpk-5.0/depcomp0000755000062000006210000005654613766346220013077 0ustar maomkpasswd#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2012-07-12.20; # UTC # Copyright (C) 1999-2012 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # A tabulation character. tab=' ' # A newline character. nl=' ' if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Avoid interferences from the environment. gccflag= dashmflag= # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. ## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). Also, it might not be ## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -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 ' ' "$nl" < "$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. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -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 ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else # 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" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. 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 tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then # 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,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$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 anf tcc (Tiny C Compiler) understand '-MD -MF file'. # However on # $CC -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 ... \ # ... # tcc 0.9.26 (FIXME still under development at the moment of writing) # will emit a similar output, but also prepend the continuation lines # with horizontal tabulation characters. "$@" -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 -e "s/^[ $tab][ $tab]*/ /" -e "s,^[^:]*:,$object :," \ < "$tmpdepfile" > "$depfile" sed ' s/[ '"$tab"'][ '"$tab"']*/ /g s/^ *// s/ *\\*$// s/^[^:]*: *// /^$/d /:$/d s/$/ :/ ' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; ## The order of this option in the case statement is important, since the ## shell code in configure will try each of these formats in the order ## listed in this file. A plain '-MD' option would be understood by many ## compilers, so we must ensure this comes after the gcc and icc options. pgcc) # Portland's C compiler understands '-MD'. # Will always output deps to 'file.d' where file is the root name of the # source file under compilation, even if file resides in a subdirectory. # The object file name does not affect the name of the '.d' file. # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= # Use the source, not the object, to determine the base name, since # that's sadly what pgcc will do too. base=`echo "$source" | sed -e 's|^.*/||' -e 's/\.[-_a-zA-Z0-9]*$//'` tmpdepfile="$base.d" # For projects that build the same source file twice into different object # files, the pgcc approach of using the *source* file root name can cause # problems in parallel builds. Use a locking strategy to avoid stomping on # the same $tmpdepfile. lockdir="$base.d-lock" trap "echo '$0: caught signal, cleaning up...' >&2; rm -rf $lockdir" 1 2 13 15 numtries=100 i=$numtries while test $i -gt 0 ; do # mkdir is a portable test-and-set. if mkdir $lockdir 2>/dev/null; then # This process acquired the lock. "$@" -MD stat=$? # Release the lock. rm -rf $lockdir break else ## the lock is being held by a different process, ## wait until the winning process is done or we timeout while test -d $lockdir && test $i -gt 0; do sleep 1 i=`expr $i - 1` done fi i=`expr $i - 1` done trap - 1 2 13 15 if test $i -le 0; then echo "$0: failed to acquire lock after $numtries attempts" >&2 echo "$0: check lockdir '$lockdir'" >&2 exit 1 fi if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. 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 tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. 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 # With Tru64 cc, shared objects can also be used to make a # static library. This mechanism is used in libtool 1.4 series to # handle both shared and static libraries in a single compilation. # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. # # With libtool 1.5 this exception was removed, and libtool now # generates 2 separate objects for the 2 libraries. These two # compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 tmpdepfile2=$dir$base.o.d # libtool 1.5 tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.o.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d tmpdepfile4=$dir$base.d "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test "$stat" = 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed 's:^['"$tab"' ]*[^:'"$tab"' ][^:][^:]*\:['"$tab"' ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' "$nl" < "$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 "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' "$nl" | \ ## 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 "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: glpk-5.0/doc/0000755000062000006210000000000013766346220012247 5ustar maomkpasswdglpk-5.0/doc/cnfsat.pdf0000666000062000006210000016502613766346220014236 0ustar maomkpasswd%PDF-1.5 %äðíø 14 0 obj <> stream xÚÍÛnã¸õ½_á§BFc–7‰T¦[t¶èl·@gw1ykŠBc+‰vyÖ’“Éß÷R¢lÚq&³E‘´x97ž;g¿ÎČߘ ÿ|¶¼Ÿ}{5ûã;1†I‘Ï®nfBX¦Ål‘kV”³«Õ¿²¿¾7_(“gª¾é®¹ÐÕÇfÝôsų'\ÑÙÛÍÇu}?ÿ÷Õ?œ ¬Ì8Y°²œ-TΔö¶]mëG8%‹ìŸÕ/w›mÓúc*:V=HÅ#º¯6¹mwl³½ýsÅBsVØÙB–LkB²»Ýu=!‘\HÏ„fJî̳Re%S¹;%æ !¤Î¾o‘³~»<[í–}³ 4æ3ÁYÉK'©Ü´Šx»º«ý¶"Ú&%+´geO‚O$×·óœg$A7q}x;7Evu=Oá’¥ð›Žä2«pPÙr]u]³ô›û¹4ÙǦ­zsµ¦­Ÿè²Ø|‘s•}×<ÌALuÁ‘Ù·À¼´Ùf]W-»Ùl´Ýºr4-„1ÌÀÕ ÅràæÆSkbj%Óá&“RäL”~ýažçY”}] –Ÿ*Fy“€X°-UðbyĺiÞµ]fï/9Wž½Cá!nÅI4-ÉBŒî"à®z¢ñxꦓ@bO2QF1cc™PPC:Å}sÌS Ž9X4„]7¸Ü‰Ù*&lDf®gD¨ýqššÐ¢³UÓÅ´¨4-¢(YPxÐŒ4S€% c8õUÎŒ8º@²‰CŒ'hëÅ* f"ÖÞû¶¾­™`‡pÇVâ1güõçêþÓº&—':LE4Ë¿<©D<„£?ÿOÒ›s1È„§!-H›ý3ò4¡IFþ2A$tö¥$½˜é!=ØÕ9(RŠ$3¢@¨gr£ÿÿ,~{ŸÅõIÛHe 3Y~¥¢)e5}`MtÛÖ«‹”Ú ËÇH|™®PÊ`Y!0Ðïu¶ÞÜ6Kˆ:‰èîbPºvÓ§kÉ!m»ž§éäXIó‰qž&“t[Y’øÖ¦!Ù'i‡„OOç#åaýf#Ê¡ .}D¶=Alðsšœ<ƒ]‹TtšªL"‡0‡]pýÐÖqå³LÄ¢÷Ó>©‚9J'aê ¾U\0=I=1”.ä.¯8¤WLatc¶»N%ùºˆ²^:Å´Ô§RÀÅÐu˜—ø??µ.žÖõMR_™=¿@I{-Îõ2M£>›ÆHSDJ1vŽù?øÐèô`TóIè‰Ôü ê È=ríRŽ÷Úôd®.¨æ¾æ¡†§ja(e+‹IywTáÄP/ta²ï±²×Âåõ0Lk?pÏ.ï‡ô·ðCNíe­1›ÂfðBëz•*y>:¢]ûœmçfôÕ„Þ»@2ÄMJbqNœncM?NŠSZ×kŒûcÇôÎu¼[÷툪ÞW4R”o¤¨±&š4R|“Â2kãÅÛ/Ì÷¬Ê®hbhñè‚ä[úáÝ }ÔU׬Ÿèw¿±­«+v÷½¡±¢/ý°·Ûêþ¾io‡‰€Ç@*@“7›õzƒ’~ Äûvî(»·°“ï·Bq&f=•€ãåNGÌ"dËsd>î åª^;fÝ2Š‚àNã5¶u·O ŠÜ¦¦¥]mh«~çJbœ{Ä[Àh³§Ë¤«Q£w?Â@”ç ø {çŽpRmDâTû8ì£9A¡guÛ¬%uµeˆÜåI“À&Gùl,£©"G¥aPÑ{UgºÑ8œãÛFÔ§ çXz/–/A F<™ä—‚øM-zZK]Š=îkûLêhŸ©Ã“Ut(Zľ]ûìGzAy&ûà Ô3±Nª¡ÍޝŠÀW;d8]0{ŒîÇQØùM^£ V¥'XœG°T(Ô™.£”Y»dÝ‹'x_’1—®?ÚgäÉt“ç=RA“=º”›úM .£Š¼‹r¯*ä Ëiû¤AÙS€è~û¤¿ ê) ||a;aRbbSyʤÄW‘Bbpõ|$ûOÚ© 3S ‘LæÉæï˜w¦,2]²i‰ýZ6­Úôûƒ.“…"Ô'k ª`?×øzèê<êBÝD1Š¥8îHgq¦ ÃÚ²ê\Ö‰Á^ãÈå„ë'úUÑpƒ…½x”n³ÞØÚº^y ½'34OBÝÍf×®(E“J8e#† ~¼’¿]Í~úÝŒE؉ endstream endobj 25 0 obj <> stream xÚíÛnÛÈõ½_Aô¥TcN9rÈ‹"Í6 §ÝEv㇪bËH”Ä@"’Jâv?¾çÌ^=–lÇ(Z °Î Ïœûò>zÜ á{ZÀè­ÞŸ®¼?¼Ž<²4L½«Ç#–*/À…Ø»ZÿͽH¤_Õ‹@Jéç_²Ãõ>¿ §v—ÓdSÕ‡…ÐþqŸÑÂÒçL,ô°ÊJš¼_"ñÍ;Êoë¬löY›¯-°jTÐý¾B¨Ÿ‹r‹KÂ_Ueï%.·ÍóÅ߯ÞþzŒ¿T,æ^ ãÚðÅžJ<ÍRgb&DKs€Ûc6áõûÏ׈ˆéxyçrt°x8F4LËá–e(""\0.ìE„h€$‚ad‘¢w{¦WŒÞ]†aèbÌø):ˆQjBÇ?e‰°ˆX‘;YžçA‘Ž{&õpϳ^Í\tƒìEtžîû’­îC¶ Í’¤ÇâÞÂM’^¸Ñ9áʧ#’ß—HÀ¯SüG†‹³Sé‰Ñ÷åÛ‰€«%ÊxÁæ´ƒtâÅ"àqì€Ä9 ‡½Ï@©G€’O‡•rë¨ÖÞñ@hío\,¹v6åÒµˆ©Nì/œª”D3Mð€×»ý­ãuD ïDÈBa޽ÊêúÆD! @[šdû=ML¬€È#bßl ¿ÍëCC›l̈ÁFå×Åvg‚J°ËÊ5oеÝÝŸp3ohcUÕuÞ\›hV•ë‰0à4¹®«mvGáÂû}~0”…cã.ÊY(Eœ×Y½kÖ:ã0$&P«äñ&>w«Ž‹F¶vÖs;#]ÌÓs6 ’ù)RC¦“‰k¼Ãï=å'æŠrij 9Ó;ž‚uŸk€÷:‡ (!Y¢ï!…ó+¢ÏLmžý§Øsš)¡3Ü„@,cбûÿáæ?Ü òaA~ ^Zãßæe^g{|À²¦ÉiÖ•2EUÒBµ¡1£áÕ¯ƒw/±Žº"8]80»JŽû¶¡‡ÂB0ñ'³*ß6aFÍ %¶xëMÓ^Ô0–q¥$X ëS¤Ÿí©´—i ¨–ŠXD1æCˆ÷gäåŠ["w|~Ó½*a5?n¶Áúd¼³p®†‰úÆ’M¸tú™8†pÈ’xbyé]ÕØgŒBqj±Þ£ÍX†ü€g©ïæ˜~j†Ew1lŒæCy†®õ4ÏÔ9ži¦øùú•³Hœ2EÑdTƘ 냳²Gåžñf`«fÌ>JçœÉ<0Fce0fÌ, +%³†ïÂC²Pö®'àè g«s:÷ :ºÄéóyŒØ…cßú=bÚÓþÁÅbÅÑ­†³jq|KÊâ®|î€0")êkÙI„ ¸LÐ쮜33uReF!ý¿Êÿß DüÁ%bÙ××ß)O áÒÅ„#sŸF±•p "È~¨¤"þ¼ËëÜ¥ñ†vzÛ‰žÄ´‡ö dq¤)€ÅQâ›^Ýñ°€Z ûPEÕtƒ$ø´ˆ"?«‹ "Usáb Jep@<ìÏîG~BxêþÕ>;6¹}m 8ÿxÌöE‹xßÐê¬ï¸\\8m„+äç}ßÜJ’&NêÙã<$½‘\ø]°#J·ˆÕ‰NÉÈ ›|$Teé‰d*:Œ(&&/ S¿9¾oò––LÊk3m€<RŸ]eR-8rÁ ¬¡ÃEéì3rL~à §¶Ðw¨‚vGpI 꺢µ²jia—¡Ü?-¨ym¶ò­I÷,‚Ø2p:Í„EÚ¥O· Îòx®t6nƒé]?ïÿfZÑ?}V$˜Ä Z!ZC§8G­À´BµB¤Q§¸=h°Ü­<.>D+n§»ÚN:Ù7SÛ]Ö:eäk…–¦ zö—-âH=ŽYÓô1D0‡“Of)Ð-ç’|•s YdÔˆ¢üré 5úT‡”#C"¢ˆD.uŽmxµųԲó,¼£Kܽ }Á¦?èˆp‘¹—r0» å5¸{°CQ*Lå%S&ã.·á\Dþw}û¸YGþË·—4ù©:¶ešŽ&”¤è!6Ø)ÜãÊvmNÿùÊûè1 eÛgO¥X À•Æ{¼Hb>Þ=ï½wÞôyorÁè”&ŸSçÙúpbm0O@}Ó³ÀG§,ðU¹iÐ.î_i0÷™™­‹SSK=´IÍî:k3š™&)Œß^~ÿr!CÿÕ;:NÝÑŽÉØõZL†BìÝMY]7EÏôtÒKE³ VF¶d*åˆøþ âû ѱ4 ˆ%mÿþíML‚`§»¬¶»›2;äËÅ '†·.ý6oVuqmº΄ؔöýñ+Ó1Ž…_“:¹‹Cw¶:#Åå’ÌÃ^)‚O­éxhc#®˜Ä»V\ð¦®ìZFC›iikrµ·àŒTa4R… R¥&F35‰šV΄ÊÐtç%öVŽm«Å ,ú†–úOÊ}6˜‹7Ûø—æëÀí¾ìZørÞ· –XÓ¦Á>ý*¿ÝÐÇ/ßPCý GÈ´É[Ü!<,Ìà’¢—K|Z¡7!¼ufV}Q`IÉW²˜À;ˆ1òÂ7Ú M¾jñC¾P–+Bj±BQì&¯óŽ+bΕà W‚4EjG¬ivÕqÒS:~  4÷›¶ªó5[ äÚ?T­]¦ˆŠ3{ôÀn¡zR? Hºô†Ý_A¼”­Ó}` æ “nÑäœã׆¾<6E†M´`G8Žâ« ÑæFñuÖt¿hø\`AáÜ~Ý9a«> stream xÚXK“ã¶¾çW°r¢ªVXàtN³“ÙªI9Nì‘}ñæQ†1EjIÊãɯO7ºÁ‡†ëÝ’ªðj4úñ¡ÑÍàsüâ —ð‚ò|Øï?Æ:ˆ#QDE°;ÂúY°;üþd‡k×ô›ÿìþtéŒ,NE‘©©r¤ÇÍV%q8<[ìȰ½l¶R‡¶3CÕ64÷²‘yhzDa-KÛ÷Çký'’ik×^‡ªñ–Á þg»Vl¶IV„ÿòî¥ê-ï®"¹tUƒÇ = dølÛumGSg8Öœ¬Skë5Q"M&¦9™R³“aд͖N'c¼1Úh‰¿?þón£âðþ vjÞÿðqût·)ÒpG—®Ý×öŒƒ$<¶ÝÙ ÌT¹(rä(£Hè,PÞñŠàÌD2ØJ)’Â‘íœ ó„„ ‘«°j.W4Pž†Ÿ¢8©-õ«žZCÍ¥6UCÝ»§ûGp`>Òx°,öƒRðÂ#O–-ö÷$A dîí‘ÚÞþŽD‰šh¾^Ü9žø`û²«ö4wø‚x¹n‘Á ʺރ,vSÏií`»sÕ˜ÁhüR ÏÔsàÈ¢Ð6‡m{ÜN[Kdül:SÂfæÿ±²õY:3Ak Q›i¿é¸ÓÛ pÞ;‰šÝÍ«­éB\ëxAg_›æ7êöSÚ¯Cð¾=Ÿmƒ ÈýÎbCE$R ³]èFØ%'‚î§Š\G ÏØ¿žM³í¬9˜½ƒ“85gºð0aö.´{0¦+.g Þtáºó|NMÛy瓈 ç³ ó ïÒ©3ç]àñ*d¤x6¡0Kçlè˜ #Î`<È5¢9¾@@±´­bR’:èá”tz朴åÂl|&í"íí‰/EB¬øžÐ¼qQs[šÞù_.±è}_ÌX™°Ë'§"W¼,Ööou.òb ë¯ö|k¨!8}W ¹s3¶ÿ#_^¸mk̵ВÅݱKdA—YEþZD³0ªÆ›tþÙ¡ùƒ õF&‰â8ùe&gôïÕÝD`F€Ñ  d¿Ø™Þ8̽`I™cËÚ\{¾Ì|AŠ„‚§‚ëdø‘!¸AçØÖŒ†ª9ù)¼Yß­ùï/ì¥æH_î~z¼ûðýà ￿ûù kOÊ-+g©D«èL´þ::c™‰GT!EÁ‡6+Be¨-¿C^Þ8 Ï7öÅI¶ÆÛ#´RþÉ étÀß0k‰ ¨í¤iq«iŽâ8ˆ(¸A‹šñ­ÿU¾”/Žæi¨2£l­é€e÷ŸªOw…TéYZ¨9»ÕËRUš”/F”^ï<Œ]¬Ÿ›ºúÍWi0溆6Qbàq—{“U°fr–Ó~z˜YnLK­ÿ4B[9P«d‘àNó²šPM¯”«ÉãSQõó4—ØŸók¶x& œ9"ÎÅ}ÍL­‹Œ×z¨.õ2ïþZåüð‡9_êÕº$-„òüà?=€åUR•’¨Œ.ƒÊÜÛ€,ñ£Iw ¡%$C‡ªìùÔ÷¸àsô 'wßpðo\+ÛÜFa³m.5t¬ÛézGœÔ3gúüO¹ÏQjþ9 ¬ù)Œ…ü´ñúË@^d™·“û3ˆIØ“µ|æ»øxX®M¹]+eeCíh.´\½8s¹ºÅ‰¾£Á(6œ!¿t\ÅÌÑž÷\‘-Å7I}!6c5•P£ÞRÆD)‰ šñ· Q¬ìÝJZŠV–˜o²Â÷k¶¶-¹æa|„*tð‚t)~UÑÁ9ˆ¡ö—㸞‚ù«°‚VäšJ8¬a€hÕâ{¤Œ'€$"†'Y s~…ÞÍãÜô ?úåP–Ѭ ÷PB¨‹×69åÉ‹™ÊxúôEM·Ä쫺8È ÷§ëédûÁóú¸Ñôî_!¸èH…/Ï•»HïÏ¿\÷uUÖ¯42HÒ±ª¦ÔÄM+7aCZTÌýú< —ïÞ¿?TgSö¢»h÷®ïWìCš¯Š›2Ë×U»"Le""[*ïÃÿòo ê endstream endobj 34 0 obj <> stream xÚµXY“Ü4~çWø ›Z ëðU<…T€„„ž*x=š³{°<ÙlàÇÓ­–Ùq² µ[%©ÝR·úøº5ÞŸ÷"øã^*à?òʽ÷íÊûúO=ÎYÇÞj ßC±<ñV›_}ÁDr.bÿº>¿­¾÷ž®¼?=&óÌ»õTÎdjÙÓÄÛ{±dŠËÚ»ô^/?19e ¹¿Óv¸9‘%ŒËID1ž>$bbD4[SôA(SåÿCŒR£Iªý²m;úöøå³ðòQKE_]{Uë=}­ÓM©­ª 9óPP”£äЉ1‹S+úò®i¦2w>ãæ)ƒÝ!ÏX¬,sÕ€’1ûM Úݼ!Õ×HY¯ß "ÄñÕ«uðÍ¢ ³S¥=õ‰6eWúªm܆x®DÌr5g_ít*û]{ì«F/iž¦2ˆä¿¯ë‚ŒÚæyþâBëãËT÷#&œÕ  `eö9X)ϱÒ*<Çʤ¼  ¤¹q{Ê]ѹ¯Û¦ØëÿK…âÃÒ8COLX:¿Ë–*&RÇ^û¬[•E]ß‘ ¾+S=ƒP‚2'穈ìáð3Øk2ü2GŽ''92ƒ6- û–FŒ5aE’šC%,NÏ#àƒ‰5†¡(Éïot!8Ê#,Ä¥~×;í൦U3ÇBº‹Y(K6få€7”ýË.•Yì °—îu·äÔ4f©úHùÉY>ø¼2t^?<ÁãI³è•û·»ŠŠ(2(ßìÚc½!æÉÇÛ;:« Áº9NÜ|O&±«r<?òy½½#%åºP&#@Ku?ά¨fVT¡«€)K´¤%™¾Cõ–@°-ÌjwÁ´RL¶µIÇ GKçÊ»Ÿ –(t!˜@¶޽«-G@ãY[úzE'"Fk¯„‰HÀ¶Žåi:Á•å“B"Æ¿14»­úΠ–awòŽ¿/›àŠ»«³ë÷Ke8¾„€Iê "žòTN~aÌqoшxi$Ž—FbÙî6FoÜyVu¨ ªP¹_ÆíŽÕ©ÎU“q&vù ¿uiØ=)´[ŒsÛÙ ™cY‚ÖÛc9­Ô´uê_p1ö/° †$TIîÿ4ô/nwÕËòÅô0 '[w}Úib‹ë5>»`§I2,>¡®R¶Rë†4Ð-c7äÖtCÈ•q+°«‚ÒÈOžs¦­ßbÛ¡‰ú‰/8jvl†áìœ|9´Bã‰Ýbg0tiŸûÐ[h^† 7.ÿ}[2G_™ô‰/ÙdÖ–Œf???ÇŸT3™YŒ›®z‹`±È6îL}1Ul žv@°>° @»7š–uëÀbC|WH½£ùËꦶyó§H_GB*…4h\Ø+k·ðŽq?m–þåš§i  â»«1¦m.¨=x¼+ê½î Ë/Måt4‡öw‰¶4®ð5FïÝ]ÓÖíõ]UûÂɰ° 7X3È®™—²<µuŒçLåž„L ì:Ë(Ƚ 5\bÞ²pXϳIzàþ4³ŽRÈ”'Vp/cy’ ¼nbÈê!ßV6Méíd»íQw¸@îcÙ»gé‘Ú-éù Ä$€KŽ¿ÌDî±Õ/èÀ • -'ÔÚNýîÇW?\éÊ–i’dÇ£±QK‰íø‰æKìaÊú¸XmG£†B “M…]ÅB>IX é/é÷%5¸æõÿrt endstream endobj 37 0 obj <> stream xÚíYK“ã¶¾çWð(¥Vñ AfO“x7µ){½Îè–IMq(hD—DÊ$µã±óãÓHPÑÆeS»U£ 4úñõc¢Ÿ"ÅðGZÀÿ8*ÑßÖÑ_>&YçÑzñ„å*ZáB­7ÿ^|ê—+«EÕÑoÑu§ƒÙФß½tÇåJd SVw1WžðØ6{s Ió°\%éâGSöËÿ¬ÿ ð<`AàYÅë¿8ŠÇœÅÊm—M½zÑUmù“‹‚îˆW Þü؇CU?ΰŸõE]{ËJ$1Ërx½dIbϯj “Ò=Û¦=Ø7Kµ¸[p–Ü-ÅßônIE½>i "6uÙ€dôbc:Z)ˆîïŸ?®no–™X¬qA ®gY½v2–HÒÎv¹RZJËñcœ ¯³³]ÑÑà4djšv§²4]·=í÷Ïn¥ÙE±¢öìé ­·˜zótgãRÛœúª6s •™dR:=î÷ Œª+z>£Û•Ìs&t¨ƒÖô§Öªä3¸N©Å§š„Øï*·S™(K]≧ SbÂÓñ¤ÕŸº®à™'. gNŒ49uÆë½¡Ë7¦7í¯ŸZ¸jÿtå_ý©œ¥)Ú!ãÊ^ößyÞ™L7ÿø–<äÃ:ú)b2Ï¢§H·˜µ"À• D¢é™8l¨%’msBÏÀ- .s øÖ<M²Øš¢«À|‡œ è£Ípƒ÷«É…eÓ¶Æ¢^4õýÝ Uq&&>íN’Ã…nbgΞÀ@«1¬ŽÞÓY$ù•Qf¿[?è@Ûƒ‚ÜüІ*#hþüýÇ7·3ZRÉÏ´¤c¯%ÍuC+¡§Ó,²@°g~®º¾£Ò†=sÔ¬“6`0£ »ŽÂ'Y&KE¨—7èäTO´B ‡ƒ€(À-­ÁïÔÆ€™à…"_ÄO( DIœXƒ”§ ^“¯ñ×e8¾?™Žo¶tìCUísHÓVȰ#+=w„àG€sme<ð’½9¼dôTõ»3<¹ràÍBa\Ùìï¿û9 Â.óÇe!6óT3ž„ñç_›_ž†Z‰™à–,¶ÚCèÚòÖðݧ/4cLÝÃ̆- ¸šWuÓÏã ô8X›Ò™´ÔàÁ<Ô0ª·q•së‹4"WTÜGnpßâ}û•gKW Ó†‡Á4'9ZYœ|rˆM‰ãxè uo‹jjÍ %qÎr«“’ã³L –,!‹Áõ…¸ —“ .)>ü% l>ÌCq…7TRúD‚×¢ëcI£$ð“ã2¶¨V–.ö‘,ª}ÕãÏ´è}ÞÝÝL]vsû\7Ç®êf“Y ªÌ-!aÜÃÄ2|ggx)íýùË; Ô ˜ûj'Íôq·|?Î9øÆte[­¹Ì@öyí䢸AS(³ ‚úwÍœ¯ÓÞ|)è[âaÝd†ô•w_Ü­GPŸ׸ÈfMTK›ÃXº0KÃ…@³°ñL‹;ÆpYtCuÅ$.y‡z­:BHy‚ˆ±ñˆ*Wûìì;(ën‹þ½ó+㪰ÛÓCp:8±`ʃÐl=+òÜå‘08P¼c%5›ßÄLk'òÁŽæEaÂ=ªFäÙâÓ6ï°  Ç˼!ØIgЖܦm°˜:ƒâpKx.ŠúyÅŠiÊ ŒxeúkGÀ‹c[LzyÒ q†ô.É.RÙ u‚>ˆÀÕÓŸ›~(T}cl~œ×Ø|³"“q0zªW®çQ=ÖP+l.u3†¦B|Mû‘É[´ŸªÇSë¦^9õ+¡ÇÛõãdª~ä Õo·l¿[Š1=ƒ™×ä;ŸË§g…h˜*àc!¸a€¯6Æ1ZÐÏPeÐáÄï9àú¨$ÇÃlÈlÚÎQ¾ëÙ® š±Ï‚0ž“/dj¨ ¥î ^Õ`yH×°ÚÎþ9& ˨âЀµb"0ô ñdƒD^Cs IOæÖÀ=FpûG®-Û÷.¨ä’M0`çKĺñýʼnÝȉÝÈ vS•i#uºØ¹Äw8ÌeJAHÅý×BªÐPâê1z½e¬˜‚š&!I¶­áX£ý«¢ ÈÒôš(…åk*çjìÎk\0r©ü³ÁU.²ßÀeåÚN>móÅ€)ÓÖDM‚»Ä³úßþk$‚` endstream endobj 40 0 obj <> stream xÚ­XmoÛF þ¾_¡o“±úª{ÑIê°i—Š®m¼a@StŠ-Ûêd)‘ä¤ù÷#wz‰•¸[‹ð‰âñȇ/GÊ»ö¸À÷"ÿ·ÜyÏÞÓ³ÐãK‚Ä[¬=²Dys$ho±úà¿ZÏæJH?-é7/gBûm¶Éj$¥M~Ydø¤ü¦*öm^YæÛ™ˆü´¡‡uµ/WO`­´¿¬ê:k®fsûU¹ÊË ñÜÌÂÐO‹}f÷T뎮ü´ÎS8¨¡s/@H±ß•ÍÅŒŽ^:/ØlöqñXb ’, AuÖÖyvƒše«Ù\JáßæíWÒo·.”_W`FI2žžñd‘Ð,Ò$JÛWŸvùÕ'ÐåÓMZXþ!¢1(À-7sòâÃ\pÁt:Æ,”†ï&Ý "±ôßT-X|(ÖÙÕíYÕU0ö”‰UW›:Ýí ÊRq$Ž;z°^È–ùEÀ•¨—ˆÏ lä«Äd-È€E$ bkèÛ ¦”}Ýl«}±"¡MÚæÍúŽŽm+ûKGrš¢¨P—[ÔÞxT Å”»ôzŸ×Ù.+‘³mžFÈFŒ88›Íà ðOŠ‚MÖ’F…„NKÙÇ”yÈ ^\å_æeZß9 “À(®"Ë_¾&hNÞµÇd{·žÐšÅ“N0%¼'¢€‰°#Þ¹÷ŽRu,xÀ¦…ÿüÏ©PáL…ö|g[U[•Áç_( ÁZ"æ„£‹ aÓÒŸ§ åRö‰1e¨)†*iR阡C6kèÙ_ª;C)Ù°Ü0± XÈÍ+1 †BpY•M[§6qˆ––+ZTàúPûŸ³e›SÕp›($A½Ì]èÑ;9‰É$9ø0B9Íó~7déuÓ±š_“ ¸¨ÓrC "\Ó>8w4$ ¤#‚©ÒÄTb9„}{K"|bÐHw Hn¢Ñ~`w ÊÁ°•¼ÐR øîÓfFï ÖGþ°“šGÂ8^ʇ±Ú'Æ,R8„AÛÉ»çg°ž+!\O=YœL¸,„V4EšŒ&†o¤öñ'cš?B3ae†˜1@ ½¤‘JiìÚÌh²ü"oZw*¸ÅŸtS§WÛCWüí>NHûqâGö(ââ(â Lu|€8=C¸bJãÓ÷'o^žü#X‰{߯€0ì#Á a…Ë[÷‘^BûŽ )ssI¿Pk˦ÄÍ—+e'\ô£ƒs)R;—ÞŠ~Súyñæl~~2‹…¿˜Œ|Üø‡Bã ÖalŸ`Œ\š.ŠÓ³“W¯¿&ªÍ‡“î# >QîÆ]îÊaîJ_öÙ;úÖ²L÷ˆŸ1éÛÁ ]ͰNóœD(ñÐNBhA£0ï~øÍN:÷ endstream endobj 46 0 obj <> stream xÚ•W XS×¶>1sDŒŠ…¶&PÇ:ê“ê­µŠâˆâˆÔA@&™E‘1@’•€Ì2"CQˆ½ˆZm«ÖÚ:Üzõs¨¨¶rqÜÜ÷½`'ß}÷½÷…¾d﬽׿þõ¯µDŒ…#‰¤Ë—,sݲtª«û¢ÍÎ3MßÌÙD²Þ°ˆìK±^g„7DÂØA‚L,Œ²Ë0¢í#LO‹aôÉ<nzN¡Qõ6Œ…HÄÅă“Ó¬NN3]ÃvÇEúDÙOÞñ–½óܹ.Óìg:9͵_â¸Cjﮌ ð QFÑÁöëÃvúEÅÙO~' *j÷60*À~_¤_DŒŸ¯½[Xh”ýjeˆŸýÀ­g üs ÙåaïæëJï9Ìš™.r¶XȸŠÜDË™•bfÝ %daÇÄÓˇ0RfcÃŒdF1<3šy“ÏL`&1“™)Ì4f:3ƒqdœ™YÌlæ?˜EŒ+³˜Y¸1K™eÌrf³ŠqgV3kf-³žÙÀld61žÌff £af bDŒ“Èä0ǘˆv ²´vÐÏb_ñ#‹yY–“-},’L’´³KÙRn÷Ý`çÁ­Vc­TVŸ!µV[ÿ<Ôe襡/¤™Òža«‡n7üì‹Þ#NÚ¬·¹aó½ –öY‚_œ¹Ö•QOúöˆñ©°Ï 㟲h‰VùÇeÐ ±ÁÉ ‘Îí¬‹l6®n=·íÂD"!ÓÉPÙąЛ䅛‚­Öuu_@µõx£¾À%lm¶6@Nn½º&Ì`¥¸ø±¨»ÄxóI—#ýê àxÑ]/Æ=×ù¶]¾¾»‚}| ÁÇŽÛdRá"…L㉠îGK1>écùz É®$bˆn¢\rº²äú«ˆ\Á¶ëÿ½ÐNO%cY“´ÂËh×iG;ôÀQbAA¼R¢ŽQyÄ'§ªæCñž«æorõQk›œˆãö o›NM<~ ehsä.Žjo}…ƒÐÄX„wy´€q^ÛÀ0òXžéÕlÌ+n„®-´ÞGªt|º‡áܯ¿}*ƒÓ?Ǻu_s·\/9±˜ë1ïýcûÕ)§7ªNnöÎioû ²{n!rÉØä®ñÓ$jcµš45¨ ƒÛ› ˆ¢Ä(¬ ~‰"±°ùnãa¡¤V›!‹£N$Æ“îþ5¶ +ß^©Š NÚ÷ˆúêdöUØÖ7—W•iDBhÒUqD×ÿÜVµ4aêu†‰Jq É!ýGP_wÃLY6ü ¬ 3ôú¬.m‹•’KÄÉrºBÒ¤ï†Ö¦_ –n›Æ’ûÂ>9ÒfIöK¤}]‰Fô¬À•èc}‚‚®]Ü—Ü7›¯†ÌhÙ{®ëO-«Yv$•Ì ÈNâƒo‘·PƒnÈ¢­JÓtñòdHmR ™FxOgX³ÊÖ_ h :(ƒŸŠotœ¿|ëiþ)¸8TÙ@ëSò ¸jÐ×È¥}ÏhÊtE8G oàâÖ¾E¼¢·¿ÛA!ÌeqN¦äÚ…1d#râñÏ1¼ÐSØûðyàQÏzŸò-@x ƒã=¼¶.Ûå IOŠd=ý;e²k‹³¨OV}óùþ‡Ôòc…¤^8ÚõN›òÎëϱ?æn_$oÇ¥dQêö©² Xã$8 j‘¡\»Dú‚£Py›œfRâô%ã^þ+£$RcA«—Ãjëñ t˜ÀB „툈MNVRÎL.r¿á{2òc@kxVúùÉ®ÿ eÿ=îò«ðuq[WsЇ‘™ÀB~‰\*Ìy á8—÷¡)k”øk&R9 üMw²èï& ¶EÿÚÛŸB‹Ék VúÂâ7ðmÅB 0ÇÜv° /÷!ØÙ5 l ™Ô[5ÚCÉœ–í·"×-ñn¯‘ ¥nûûÛC(]7GŒ¦ÞshiyõôÜÅ>{€~¤I¯ÎJ‡ »¤--S°Múï µá{3kw³!ã@r ™Ë®ÒÇa5U<•Û>2“,ΞFÜÎ(Ù¢™ ›vÉï ¨g^þrR‡ÐƒVb¡GòD%I©L¡°#tïU DkµáqšXmpQ Iµþ+8|økó5¢ØÝ4Ë#3C³´:¨â„s:kûŸHÊN.»RÈÎ?P€ }ƒlu¦C%uúhnî1 ŒƒÐÝk$l ¤@J '}!þÕ!­CŒÆ¾9|rVK5;üÿ}+¤öW¨Ó»È®– ·Y¨Òée•é+te”6FI”f>„…½Q•j¶ôP£®ÏÐi!šëŸÃJûòh2·b×@’a‡IØëñïJð/ßÝ{†Ì´{d®¼Ú¦’?‘ÅׄnaîÒåàBåDŽ]T7¾I4Äñ¨[Œ6f³­è02^8„ßñøz‹á:œåž¾y—¸Ëú-3ÛCÍþã%7޲#OãÉqhJ¬ o¤Š¶Œ¾|:ÏÜÑV÷KᣢÒÔÌùЪ´ éïÇ„ÁJP]M}ÌŒOëRÝ$Œ#<Œ-ÔºdÎõØ MþBEÅ2ÑØÇ}òo<cŽ°ŠŸ\¥¾E\§áb·¬î{W’1™1 -®2«åèÁ–CN¼LjmJ²b‹mDåûǦИ[àLDrXÖâ]´ÿŒçá´ž¨§Ñ…šª˜ƒ õa°™SļC,d³€ÈRq¢¶ 2i c@E•ŠVU±,tºü¼‚‚¼ƒµµ¶ÞIø8tú´·Wß»?"¢ZJýjJ™gDø•‰ú¾Tùÿ9IK’-Û%y(ʽ‡ã»Ýÿ€LUH¾Ñ?ƒæÿߘxªðà–.æºä‘A&…Œiô©ÃÙQ3ŠÑÇT/x†¼èâ°žX¥»(›âêê+[eP®*Û[`È«ŠÀgm~så;Xšk³¶±r±×ä_ÂéöŠÜNPü,ë”TæBͦýòU:(¡•‘ˆÎóÓ]â‚¶øhQÿ™ÆŸPG,Ó ÂkÜØijÕ ÐZŒ¾}+x²0ÕRÁ~’¾òþŸÛÙÒòÒò’ŠÎMç’ŽS(d½wqŽþˆBðÞãÄðâœ:SÖNW‡¹\Û`]äÎ`/ïä X ;Oí¯â¤‚:­EÓ"jEk\jÊúÌ&A²lhµé‰ª=»—9Òø9N;yQ‡cpLÎEMºœ.j5Zµ:!"8eóÞÚÊÖƒw›½‘¸-!aÉ?8â$tnD.GöG—L'eSHñ©©B øC¶±ÑåÛëÝèAoNœEìɸ'sÐN~:Ê8Oݲ-¬» ŽÉ¶"ýxåêÍ þtÿpÀ‘ŸÊ¡þZÕÚxþbv5´Á‰8ÃvêZ~Z ®¯Çw ¢FzfÊc±°Ãùêl¨•CƒêÖÖeûúƒk© §9ˆ ±æ„SqêÉÞÒâxH“SÿÕi á+–ÇxÑ-´øúyy½…¾Mw¬²¥¼éH•žC±Ö½ÏIñGSwmÄHƒ-{"'ÆaO.2䙤çÓm®õÚlM|rÊ^ˆáv4Ūj)>Ñæß¾Ø‰ˆý'›ð{o} ×߆JÍÙ¦^‹lm™o5aB³¨ñFöfßãh\ÁŸ ?O;-ús_~.‡ÎЖÄüú’š¬R½:¶6 \LÑžC‡ŠÊ+kâš”2øÄÄÄùÔøæm¦ÞÈ6¼»DÁù>í{÷Ä€?(ªwVî‹Ls‚uœÇ•e¸ çÝ={KÖÖGzÕ¬„Y´ƒÚé:ENb+%{®®¸à ‡C²ùÙpíƒàÚýûà¶u+¸Í–Ÿ'^üÏ<ÖÒNÚÖÿ|ëåKP,7Ï ‚•™4«D¸Í”W‡ñ"ÿƒÏi2H6¶,ÞÂiñ'É™~ÁŒÉu*í7^Î,2ßt]>Z¹@Fê^]6OF:¦#†#ûÄæÃ'8Ðϯ1°Í7¹u‡/›qw¦Rä ÕË”…b¼‡m~)Ì/È»f*êášXؾÞ\-ØÂuª2Ò24²‚L´ì÷Ú¯»öÒ‡×Ø’ÂâƒUe8”8Ùæ¤Òb¥å’ca?­ë5úO¡®³È<ʰû ’tû332“hq7y&tw¸òŠ$\xuø¢%}¾ñ¸·¼Å}÷(ä}ÏP½ÞK÷í»·´x%LO÷/ ÿ ™ÿ›Õ—м¿èö™KG«¢çÿ øÿ—eöWüK ¸‚{@à{ÿ·;ü[ ©ª½6÷…T?…: £õÔñ q&.³Ç‘ÑdÌãéèŒ.÷Ÿ ŒèÉZžŒ|Ç,$å-UÇO–éÓ²»4¬Â<Á‹{¨ªñ&%#›Œ8Á`ÍêB¶Iž©¼nÔFŸˆ0¦±ÏÿŽQ6ã!yªñæØAÜ™?1"÷ÏwvÚø£§ºJŽwå¢Íš ®›WÊ ¨ î B¶}²žžg&iñÅhÞƒ³p°l’j/>} {kk ¥mž‡½dï@ Û~%Q,!o¿ ⟵e eûQëg¸ï3±0TXÀ›‹w¥c|J†:I•®+Ù™Me6„L2ZoâðèÆôºtCZO9Jî]'ˆ‘m†U%aÝiZÝÞ_ë6ûkÝÖCEÉ¡rÛ“g6ZçpD!•v8nˆ-óiÌÞ˜¿²`Mœâ®<„JŠ!{‰>B—kjæÍ=…TXN£ÉqA…èŠøÐv1ú›ä•Öîñ¸^)ÑNöšÚUAfvNeä#âm®EU¦N†ñÙEY¹—M÷ Ôdüî»®Ãt?µ:M«¦¾°%£°Áä{$=4,ÔÃìûeÝû'¤'îMO´‹Ùä¶2 ’²õº†Bhå ‘•!Á‘1Þ'”ÉîÀÙ›´’¾èÃ^âð†ÿv±ÒÄBÁ#·WäJÈÖÖh…¢!ÍyÖÖ(ª¶*³²p©°¬³– CFý#>'É endstream endobj 48 0 obj <> stream xÚ­U{XTu>‡9'C2õ”3îº•Ê êªY>º‚‰P¡–š’ Ãp†aÔ p˜™o†ËpŸ ×.i0$¨˜ yÊr+×¶m7˲ìò;øcŸgÏ`ùWûßþq¾ç9çùÎû½ßíýH"0 IrfìÆ¸¸M›GÇ'.]æÿ°"WÞQN–ñü<’,€gEüÃù؃‚%~yÀo¯ÏòÛ? f†m6H’tþ>Sdäò%‘‘Ë¢J­*C–®–<¹w¡déêÕ«Â%Ë"#WKÖçHU{“å’øduº4'Y-¼dK¶(öfHÕZÉ“kÒÕjåÓfIrNÞ…J¶va¸D“¡N—$Jó¤ªiªd£B®–$$çH%Óœ—LÛhEŽ2_-UIâ©R•\à:#2`=O$©¤, ‹“*‘F ü 1›˜CüXBDωMÄf"–ˆ#ž'^ ¶[‰mÄKÄvbnAD q|š ˆ ø@” ê ¬ z(H&&Å:ñuêYê6½‚®¿/†7†ðº×ä#.rpÕLˆø­èo \3|*›H¹ݺ^„ ò´§qúxÀ,ªŽ:¼a`Ý¥¼“ð8qÒ{æðGÖoá ÷à+LÄ: Y|&àø ®4Ÿmyï­ž#ÐgÔÎ ‰°b`¬+N(Äq…é@ ÑÁËû¼C.).‰Ðà$ôEÃæ)w¤-ZNµÁ 8ÕIO9(™±h9›-wYoB_ß7мÀ›M-7Öæü0¢;7P—¹2¯‰ø8´†É÷•nÕï/+I„ q¼¸«íü;í(INŸ„ïhDE~ŒiLÇ<¹bûT¸;›z=…N[&0šïúúÉ ¬Ü¹>ñ9œ„ Bóx’ ™Tíñò\$ÿðdS^oªÒLFÃ~,ú:T—¢È}Î,$pÞj…>ÏqèèRÉ•gÇgç\äЇ(e|¢UÄ?„\ ŒïÕôÞ¤ÆW^·-VîÔµµ·´´Êà×öæq‡è£g¥K¹½Þm\· ÖÒkþ­:Ͼ Ã>çñÊ]=²#@»Ï4~ÂÎßB%æ•ê¤0ÚÄÆŽ0 £2÷ìL9|œŠÖÖ¶ ãäÓ»øÊð‘‡&ã¢N®cäÔû5e;9œKx÷JªD?±ÏÅs¾^ˆ¸ :Ñè¤7Rh¾=ÈKÅ”VpüÏTìÔF(¾Q—Ÿ—ž"ßt.&ìè%.×ûZû\=¾žp%Ù÷×ïÚ§‚Çè[‘Ò‰¢]d÷*½ âç L«œßo»gbñòxýa¡û‡á®2TäJÁd0rWmR'ü¸­çœ”ÅÉÔ ¥_8<ð Táù– ÿ¦àd7Úvês7²ºÉó—Pô¥mfŽeû è/ß{ÿcºJû³z|ÇÀ•þǤ/7衘ÖÙ‹šk¶V‡Î“ξ ©Yº9mé R —nŠYËAâ¡4{IÑ­RáÅCªÃî×vËàezãDôºÿ»ÑXè(;û|Ïöΰ  ´N½½Ä nh©j±7Òßé™åð}lérz»ín ¿€ÇÕœPÇ”}ÊBy޾è.Œ˜ÅQ#osPcèïlm¬Ô‚¾†‚à//¬Û!,³OЄyÓMDÄ8Ú;.â_Då |u¯|`WU†o¬.›6£Ę+úµÁSn*©b§G~ <Þ±»#ÿ\ s(úéÒé ·'°¸èwýv€ ÌÝtjâÓ>4ç&‰Ha„¢ø)¦³ M‘›_ Ìi/lïqt¶²˜Å Â`½S{P¬Žßð<Öãà­;¯Oïn¹m€ã©¾A÷¢<ù£€×‡ XÊjÀÇjj.²¸-´—Ò˜r!'w;¨ƒÈ©s} ì§5­™ÅijƒøêwsõÇìî>ž{¹þL½súÌ6Tƒ.L«3nÖè:b…#~7%dƒbþ­Ôÿ³Î‹@úT©†6ßãy÷BãöÿK™Éhå—MïJ·px^E™ bÞô88|>žçÞZŒÄhÆÍoÑlgâ$& ’šå#ÊaóYxS¸)ç{†=G†šÁ¼©íJíÙ q韻KñÊîB©ÿºÌº›Þ¹*BÏ sÓ÷¯Ù°B¥¹´|ÿAPÒò¶âf—«¡«[éÙîyÄÁBa®DbüÈï$챞‚Ä(Sÿö<$hÎJÙ7Œ´Ã"ô)ÿ 㛞-…Âü²’ìŽìª,AqfÊ6oå ÒûÓ{¯—-9UÜ`ìÐ84䃂ޣze9»^éÏ¿Uî‹Ùbª,#ÐÅ`Ðrx¥ƒµÅÒâ¶Uƒµ©¹×´ýÓÉ3W9Ëì-©•õ(«6×çTE5Â9ºÇ}ôK‘PµÄšm)­†  ëÀæÈΊþˆ=å"o£y­"´†œAó½x>ŠË›ÿ,[i¤5×q…EWÔ£û.\fßÎßJEË“Scà«ö®Æ>zo7ÑÛ|Ô=…¡V&møëjñQýÂóý%œã2/¢ dÝ™í¹ƒEo Ô{áu¯·­¹ý¡wOy/×—õnþQ/é˜\&â@ÿdZ/Y[ü¢2i![n‚mþ 6Õ+¡ÌPV®ÀM¡O Ã†z¡µaž7ÀÍz)…)äY&Øâ÷î‡SÝk¶ƒõ™Õš•ØºuüƒÖ5NÖ½” Äù½ß{y]šï„ G²¬jÁVak¾…úCoá~Û~›±Âê ¢º²Ž)póÑMHa¯q‹qrå1~¿«68x¼9x&;#p•+ø>tuîôç½ endstream endobj 50 0 obj <> stream xÚ•’LSWÇߣ¥<qêÞs¼W³8¬§8¦D¨ba&DŠèh‘þ J‘_Â) ­PAlEq¨A‹ËÔR'³Úi4hæÆ6“©s..˼o¹ÿì!KÔlÿ,¹ùÞ{î=÷œÏ9÷’„PH$´5%a½L'MK[5µ³¢WpÝ%ùs îM’ õã÷º0” È ¹¼hΔÞ{eJòâ?>’$U\ÉòH‰$*N§7Ô¹*£8,;\¼,:zåq”D-^§QÔÙ ­Xª0ª”…‘7òÅ©ºlµÒh‡Å¨ŒFýê¥KM&S¤BS©3ä® _"6©*±LY¨4+sÄñ:­Q¼Y¡QЧ¡#§§8F_dTÄR]ŽÒ åigD1ÄâCBAä?QÄÏ!B –XHĉÍÄ"…H%¶~IøñÛ…ÄOúü¬‚0ÁAÁ„ð}aW É‘¿]sÓz—v—Á°KÓSp|Àu¬ ëæ2ºÈ‹\˜€ÛÄUÐ-¶Öf褺͎2¦¾¡¦¡ªjBðw8§²¶¶ *CÀÜZkÿÝÅÊ`[Ýr¨öNG7 KK• Ž6¿1õÒ›­ÐYe«iÂw‘2¸vMs5PeæÊb–gi©EÃ89céžÚ* ˜CŠ;+Û™F«ÝÚ­ö ‹ç¢ä…vÿäFëÜ.”3Ñ z b’V`!žé[}ëÜÃa´ö 3^‡ƒñüNÄQ F¡o_võ`[u°§Z§¬R%~‘hZüøßÙ>8[åÜD%á´ü„e¡½éÓSNg{ |Ô=äËå±;ÂÙ ð [ò¼QSCÀ¥#7}p9£õnýÇ–ö¢ÓÛ!òµ5Õ 'ŠÁ ”FT^Z­úYì ØUį{ µõð=3B>‹’&ÏôÚU ® (Õó.Çx—›ÿËå¶G^”Æ¿ï{h”~,f`‡²´„:mÙLâ4ÊTú!ìËzn¡w¦ãL½`Jýê¾àqäɼ;+࿽DS?ê{éñ¢n>_ʧÑ\Éo˜À„$ ÏÅóîG<}zÿšÇàíx'øåÁ•«×¯_IŒŒ~÷ ×ç!Q„%ß |´•F³&oüÀ4A345ìËíÝkÊy¨ãȰâP:»dy*u& ßÒ¢fÞ~Ž>}k_(¤á9â[Ï_h ÷ýìöKmЈ¢Š2c`°ŸA®€Ÿ;DK¿ÒÝf.Ãé£]T® :˜«/µ¡ÒÁÅ@k"l¶xfzgy½³™™B³.p×úêߪ¼´§ endstream endobj 51 0 obj <> stream xÚ]PÁj„0½ç+渥”¨…žD躕 Ýv»îB{ŒÉh5 c<ø÷5QöÐC†™É{÷†—õ¡6Ú?‘• zè´Q„£H"´ØkÃÒ ”–~›b•ƒpŒ—GáÞÅ€À_¿¿>Oo÷åñœ&×K•>ÂnE\f‡ms}hæÑãP›ÎBž3~^GO3ìž•mñ.ì>H!iÓÃîZ6qÓLÎýâ€ÆCŠ"Ê¥«%iŽNH$azdy’WUÁШÙÊh;ù#hAîr¿–þeí#oC…õ–TND‹‡x˜.Ño'sÖV|^o¸ endstream endobj 53 0 obj <> stream xÚ­YTT×Ö¾ÃÈÜkÃÈx°ÜÁ»{L4¶ÄÞ{¥ˆém¤Ã SöÌÐ{FfQÁ‚Æ–hxÑÄÞ –—MŒæ\<¼¼ÿ Eó¯——?ëýÏåºk1sîÙ{gïoûŒ€êÖ½nÚ¸jåÒ1ó–­žàhù`ŠÖ½’·Æ[ó(~ €dÅsBþnƒ(JÚ—<©ßúXžß¾ey¾KCÚRÝF©rtœ4ÞÑqâ¼€Àˆàž^¡#ÝF9L˜>}ÚX‡‰ŽŽÓæø¹ïtsõwXæêåîçJþðuXà¶Ó=4Âaä ¯ÐÐÀÞ{/,,l¼«_Èø€`ÏFuÛêå°Ú=Ä=x—û‡ùþ¡Ë]ýÜÚ}ßþœà( uvX°Ã=ØŸøjÓS(¦†PÃ…c„Ž¢3©9Ì2á«-V.ãÈ×=(?Ê_Ð“Š¡Â(šb¨îTªÕ›²¡úP})[JLõ£Xêmêj5âÈNC©aÔ»Ôpj5’E¦ÆSïQŽÔj25…šJÍ vRQs¨¹Ô<êcêj>µ€ZH-¢SK¨¥Ô2j9µ‚ZI­¢VSk¨µÔ:j=µÚHm¢6S[¨JE%P‹­(Õ:+Ø)ø§Õ ¡ƒ°²›¬Û߬G['Y_õ-£mh93‚‰í>±ûéî¯zlê‘ßs`ÏÂ^ƒzÉ{½êíiCÛØ<êÙço­|«¡oXßG¶Ûl£ÄŒx¸8´ÛOÏÒlûÏ·=ÞÙøÎU»1v:ûaöÛúÛ÷/`5 e`Ÿ1ƒ& Štƒ[Èñ’½8¤;”;sø…WÚð·ÀÌ[›QŠAð²y4?¾/ä×òÃXD›qĈZŽ4æty‰qŠˆXfBóÃJËóô%Õ^ûÖp+ÁÙ=Iá_³&%˜±˜Ù€) Í𽉯ÓN2XÈùÒ•šZ£ñ¨ª¦×03½P‡%è:òxó}­¦Q[V×uäû]ôUVµW —,²¦ŸÜ©ÿ‚; eá`Ôt¤*,@® .WÆB<Ä1˜¦mø¦ö|"º¥Ú`K¢Xúhq³øºKÂhH‹Ý.Á{þ½/¼Æ¶ñQjòìÅwUjÄCB·=½W÷9·ªwëC·«äÅx›b‹öìÉß{vmýœñ¸çF,àþB°¯]D ½¬ÝAÏfñ^LÜû³ùßhO¹µø¶Ô…Ö'w;È€‚k†þ„iäif±7 ãñµ†+\”BY|¼"j7ADztœ±i½ò¸G•~u`w\ÆÿòÁۡܬH€- {ñ7Ô_›«Ý"¢C«\õ›€‡»(ÿRÞxþQ/ê úÙýÚ³\ T%•ìPŇ@H³£ “^ɧ¡•´-ò=[{±iéYÍFFpÑ “)ä¸gWamY+)Þ…š¿´­D½¤†+–‡ø74Ž¿Çž 9ìâTXÍé!735U£ÕhH¢j!F!ŸÄyK—ÅÅ ”LbŠ"%ëî5ÔƒCëßþÏ^´i-”šùf”oÔßÝ 0¢seÂÖ¥¨7«œ±ÄÛ ÖÁ†ã>ûNÔ}Ùp³¶¹¸ªEØiÕ:µ\6MØk˜/Ý` –Àî¤Dµríh§.ëcó° rFôÉs_^ƒf¦!êîÇËæ¬Ìk꼪‰Ž£íœ¶Â:fò¥O¹oáìÁšÊ‹+ÎFkpþ´öӿް·”gÀÌ|SWQu†ª8XôÁä ÆåCÖ°5Ïïಢ€ê 5KV/K æýÐ''%p{_õÉ&Æí}ï½vhy´ý?†Ö†·ÃºâWkô‚§g„èœÈ‚´‘¸/²õA«4w?š‹ú ¾9Ù “¦ÐɹÝ0aÁJ,Þˆ­â°¦ÁÌ,ÜûSl}÷¹·8˜Ôd]šäÍÞ(Šl^t,Ü¡Þk‘õ ÔgÊ»‘+r (AUñãÈÓx`wÀ³<ðÇø-lÛá¬ÀøÒz²U“‰iË£=•q8_Q•î>ÔÕ݇*Â>ôeVIJÍuôâÅOfÛc/óÃ`#AO|}ù9"îÜIxfDnal=罉kŽ® *û€)ÂäÅ%XNW½ç‹“5g€yxðƒéøpÓŒµËðZìm'“‘oCñ ž•¡¹ÖÁ¢$¿DçÝщ ‹@Úî½´ì+Ä a{PŸ>7ÚÖ£nSF>šõ\Œ)t½`¹Dà¹3éÔ˜á³VÌò6„—›õ†òc[!š3mΩæÀ§Ò ˆS­ röÛ²S¬NP‡¨!A¨†ÝŒ¸M&KƒîèNÍ‚Qxà|g‰ Ì.ð:[•d6À~¦:Pïâãìøx ›‡æˆq¸³ôÆÐâ|Q3ïJn¼NFÓÙÉ´§J6‡Ûå+: k‚úúpàMû¾ÿÌ<‚ßB`OââIM$Äásm;í|id$ô¬!%ßݺ=pdõ#Zj@ïܵ=öt‹…·ˆåסm,ê9ý¦¸-àåéÅ  ´^^™X êséaNª2%Q¢&¨&)Ãâ7‡-7Ø–¶µ8A§"Ÿ1»!!J‚ÒË¥V—œš•_sò64q[zD¾‡vlbįÀ V„¸†ìðÚsaõ‰È³:µNLe±¤$Òè㕸mÊÅѨ›Dü+b~þ‰%í>óCöÜ}XGêÚñhñq²C·Ù¥¢·ª“¦S/7ìd¢ÝÀÉ·$Ú¿7£öœó‘÷q?<³8H"~…õˆùø1~ÿwò¦xâXȉÛ€Çư- ꉯ²KÁïœ[­ '.}ä[.ʽ:O½G©QC8ÓVô'®Ð)Iu²œÛöÄ.#N£N&ÒŠ$üQºŸ“|òRoVy{oÖZ£ŸÃÖ@IÛ,Ú2P˜Z§™$!Ÿ [ÝÑ#¹à1„_ãxžŒ·“\Ñ|´A“‡¿Åß±cpÿïP.ÊFÿ¼{ ýgàBÞ4oç³RÖ]uRyA]­ÎL ↉…Ä ÞJGBbmZhtºÊæ<[ˆfé~ëGd%_†g‹îLÓ“zó zuz1šS#¨6¢ô”n¶Žoζ!Q8–ZE¹hJ^%…`‚LU±‚Lþ¡ Ak'Ä áÜ,šëghhxÞ®¹Üè!»Ï’j@f¥Âä,m)y9Ï;OiçŸx‚Ö;ÅÝj&4‡¢XÒTV¨'r';©r›¦´êhÉGOï˜(ñ ÅOlT~¢\ê7{gðpf>x|ž#Vš¡¡®¨‘IDï³#è±óv:mÞ^uŒƒOëï¢é©Dí7É ²b~¨yÔÛ¾¼ˆòÑl¾7‹.Ñx˜ÌÚ—¾”ž¸YÒöØHk4é¹¥Œøh^hý¦+$Ó{þò#b‘xÔS,"ýe&¸lŠ`t8ŸEÛi’”š¬üÚSŸ¦—Àa¨*q7m×­†íà¡Záï´Ë×Ý{8gIHML1™Ü ‰'+eFTù¨Æh»ï.Úð(Æ2uGþ,šv§þ—çÕUžÛ•r?ˆe‚ ÃÊLú‚½_Ϊý÷}°Ä[œøî÷t$™¬úW ^™™»AI†•B%÷¿8΃ˆ~ý¤ƒhФ=bi=oß11•‘tç·>eÑhD–µ™þ$!í¨D|”ÿå÷ñc_Ú¿ÚÅ´ÎrÝ5dQöâG"KÔàð>cƒŠ»aW"@%‹ôÛâ$u±g Ùt@y@ö\ùábóþÊ“PõÑf§¬H¢®#:ƒö+Fs ¶ewQ|sûÚ ¥°©hÔ7Æ}À<ÏÄvHpü.Ë%AÅO×=Á}1óÞ0ÜWBbîÿb4¢‘Ía$,ÊLÐ&Yb–«¼†M€Ý° Üö†Öøf¨&£Ã™Ž[ÉÉߤ¨[ó£ûB4ŸÇ"†þîÈ‘C|ë[ãQ¹þ“©ës˜þ_·up‹‹®"‘ÙRêxû´úÌ7{ì±-k »Šæ^­jr>#þU†‚Ñlv2<Û#RMEž1={OY0÷aD¨Õ>ÑÁ q¡ndf ɰ§@_p@YÌ㋯K &ª&xOõ¾ê”BRo) SËI2ˆc"sâò3‹ÒöÄUì Eê,wÝîZéª#óöøùó?’€³Áݸ+6:¼q+¾9îæ°‘>.àÆÌ{ºÙ ¿¿ÁAUÌñeëËVÁrHÔø$ï29Ýaø";|þñhØ_sHÇœÝCÝ`ʺ7’t\÷¶§“Y]Dî…ÈêÛ T•渶ÔÔ¤Ú÷æÚr)ýËW§.œÏZ·šÃ1ô­Û@Ì«÷2h ÷Àì[Sà­_ÓÀyE¤;ƒžÿ>1-!9ÖzÔû¥íÕ—Ÿ4‹£Oøå,v°¬ø"CNR×Ðe£BsR[RUÕac‘"¥–Œ Éü~¶"¸8ÀWh2—‹+EžÁ®†üïøö}Ý5½XÜ,~…<,;µì|=ÃB ´Sü”%\ÑVA9yÉú\(eLú€€ˆ°  §N_ýüÂCR˜­ãÿ`&åK:Ò1¨^ð²Yøò5`•$³Ê÷Ö©ë^öœ¾ðéõÁõk Â>ðix Â/éôf´‘ˆŽNt›ë3/ø÷ÖùÓRÚÝÑZü$¶lûù-L9d4~÷}21ÄñKpà ¡œÑ!_¦Á'"@㸘¹Ë[H§èyéî•[õ“×ÀtúËæ—÷Ä×чè[YÑXò:ãŇßäÀ1þxúi}Ë5˵hÕJuX1ÅцBcvE…o¹ '¾><Ƹ`9™ŸZd[i >‚"Œ¡GÄ-hZÏw¢`³ÑËm&7 'ÙEú$‹ªNîZÝî›b½¦}æ8ÙÊld‹µK‰Ñ%X|Ó¦¦äþ„ªí~Æ5É2ËGö9 k÷·³Ó²yÕ¡8vïþýGKLæêy¯ƒT~ê ¿õÚXËÎŪôXˆ‚¨Ý±Iòe3ífþŸI¼Hµ‡¼¼ }ûjõ"UÔ®­¿±]ºqÅSÌÚÃ=·¬Z©Úö¾´IkÖ˜ÊëU%–ª•êsˆ²2”W~öõµv鲜(‚I||t å*s¯æ”ÖPZ«ÞkYº"´¡åíÄàj(ü†—’#ýFÈO"›Î×äC׉FlÕJ-æÍêüH²»Õª¤¸áXm‡…È ÈT%ÔL5PÄuxÙu¢Gˆ(ÏõB£ÛvI±1ÞòXéÚ€ùKÀҾà ÍÉéÈgLáù¡aÒX?§zÏcÜy8pºä´E¥‚‘ïgÔÑçF!ߟ—ÍȲ““¾,’á)dMý¹¨†”ƒD"\ÑÖ;Þò[H’}LqÝ ÖÁ¢xÜc—3f,BZDH1 ¼BÈ+P:khSHi›WÑí¾Š¾Š²|ø[”´}‚l~&xþìñ3!ræÿÉ–„™ü¤Ò€ƒ´l¯ÞT¡uo—I ~aA!!ú ½eCg#5ðó VªA„·gÓæ{2zõº¨ïÕ›ëÑmš¾Wwt¯ßÿW0Ÿ endstream endobj 55 0 obj <> stream xÚ­X TSgÚN†‹RZ¡™ µs/¥NÕÖ«¿u©m­ £ÁŠR•‘E-„% !!!{Þ$d!a_"a‹È"Š  X…âr\¦ýÛN©•Ú™ÚÎùgþi§ýnzùÏÿ€i;3çLÏÌáär¹߽Ï÷<Ïû¼ï›åïÏb³ÙÁQÛ¢â·E?·5:nçêÈ™¿¼˜ÁX¾¡}åóèE,úI6ý3?šäÐ?õ'?ÞåÿA~?c±Ø[Î\‰Gñ•õùc3×§ð%¤.„åÏfÅ¥¹fedäó[óafzFaøÒ£ËÂWoØðÂòðç##7„oÉIfMÎ N.ÌHËI.Ä_²Ã÷åÍL+”„/}1£°P°qÕ*‘H´29§`ež0ý¥eËÃE™…ᯧ¤ ‹ÓRÃwäå†ïIÎI ŸÃ¾rî×Ö¼AQaš0<:/5M˜‹q±–²W°¶°¶²v°ö°bYûØÉó2ÙÙ¡¿CÏa²æ³‚Y¬Å¬%¬U¬Õ¬µ¬ÿ`½ŠïÞÆÚŽWD±v±v³¢ñʘ™µ¬8Ö~ÖV<ë‹ôc±Yþ¬O؛ؕìk~ ~SœÿDÿ?λƵ¬¸E¬!þ˜HÏ·- ÔÕ=rà‘îàÈàGW=úà±Ä…|ZL3ÉîÆÉwÜt˜==Ùáf ï£Oß½ÏAôbJàneú:dazŽ] {¡ÙSëmè«3áTš,£QS$Û'~-ˆ|h«¡Àuöö÷ÐU¾Éf¶âû\j(!·áÓ¦ßW_GÁÖçõab9¤‚‘WŠ[Ýí }ï2óAH2lI0OIVðwqK .«„:êwãSR*;¦Î—H€¼¡ÓZÓM„[â” …¢Œ„sânò·p=ÓŽ~NÓËKó7ûšØhùµ0j˜Á¬vî¿§š‚»€ž§%ÕÔ˜L`!ì:‹†T°q-Áø1;³™8‡ØÊ×z~1°·[E…úÎs§F8t}ãå×%#Â[Ic2 4:†Â våå Žu°˜'c§5“$“ 'ÔzéðáüÐN/Šƒ¯‰`s…ý1²qÐUÃk+XªÌ6›*ˆªr’L®ÏÊÊÌŠÐÊA¬¨4VR— †QnPTŒßôn>C×kꌦbcrgßí€FûePÍ@3è• º/‹;&ÿ¥P)Œ’r›ÞNuž²xOv{çP¥6•Q¯› ­P °UÔ!]ÅGYÓŸYKM†ÃD`&1Þ˜þ¾VtÝËöý亅îðÐ*. A‹þ„ïGÝ`Ø3úÞ6(¡@ŒY4Ýÿ7üô±œî?s:(Â>cC5ˆö‚£rŽœ…у¼Ê;tñ1÷îÅü݈J—¥%f¤Ç`‡…pqÔaKF¶³ÑáÛ(ñ6Ç7ÿ®Ôâ+WÙÇO½µÍ$ÂkeØø@A¼ûÀ˜À¦wkjuÃ2þ¥R‡¾^â’¹Š ˆÜ¼äùW^éù’„Ö6‹ Ì&óLÞ•ƒç¢Á +gÒøØgzì3Ug#í`2;œ®ªÖ“ÎêÞý7J/á 'Pê3ù'…Þ2Ëòv±5»Rkά-9 gˆ{ïÿfê³ö¨-$äÕº"£Œÿ}£'‚—fzÙ>E/‡¦ÏÞé0;LsÔñå Y4¸š•±ÅL(ò™ÅÕ`¶X:Q6<Ι‡3íÄ£$–‰âcÍÜ®˜I Ì´Åb6›LÎÖóè©öfÄâ÷.} Ô†rƒ»ú¿<£\¹«6ÜU`¥.ŽZ.^º|qÖ×M.%”R¥\)d›õgÑV@ 6ÑŒ‚Á´Cá¦5Ü!ˆu½<ú>úÓ8Ïu¨·¸þù¦syø58ä­Ds‰UIf:Ó¨%BÅYuYXT3ŸYÎ<³nhû»Tèû=p®¹˜¸Œì¼f¯*+zc„%¨Æ;)ñ¢À†³ž‰¡‘3@œóÄ'ã@7j Œ4 #]áFÇβQÀU$¸ÅAW|«y&‹ÙáUj,*RJ£Þ¸TÅ/3*Œ &N¨¹`V+IÐëq¦,¦øF½2ÒˆÎF½ƒüQ z-ù:f8†LƒÌâÌ,B?Ìo~—‚s•݈kosmSGß©> ¯gQ,`äî.&mæP¡¾Ýläw%Oqè(úÞA ¤` ¥.鉶wßpRïnæ1†‡»Û3KÇw~‚ÿèµV•KEê0¡*å–ÏëJ€Ø/£`´íÏ­znŽt‚  µ)Ez¸õY•8ôå·õ½Œœ_ê´%ÿ@‹9%~”ܵ¶"¶…§ÊÞ³)ˆ¿UÍ'Œ yN©3Ä 7ê¾Õ Üh¦‰{iû8H…¤¼N¸e¹ÐøÁI¸ vbèØéÝÌÓÏ0ÛW_X÷ù? h—âW§)èsÚÛ››7€ÖaqÑBù³ŽSÁhn´¢Å^´â×ͳƒÕ5” ¶(j0(î%¿„3蘽Ïãs"†}‚¿rþÍä{¡4ºžæÍR-Á¥ª\Ás{PÉLm´VwU÷Þ@/óXçFâÍ4ϱ™Ì2­r.HL¸€+»Z?ÂåÒ⦨ÈU‹sÖóåÇËð,M‡ñ©-)—>ëBÏV¡¿ÑÒ…<È!+ˆò„Mªš¦öÆrޱÊIÚ5‹-ã>Êx+á£Ði܏߯«¨ƒâ|ÎÀ¾¥˜%ꇯ“­Îs½ÿŽQ¹HBT/ÖI—O/äˤnŽ ÈS·Ër'Buyc¾$[–z¬·øùLÞlž"B¿@Oø6ðÚ‹le‚‚¹SÔÒâq{0luï,û³·~ty3 §õ|£N+‚Rbvh¶jO}wÍ GŽ{“Vf0K5߉O‡·íóÙøÔçãøT d©ùÛó·@<±v,÷29 §:[:öhÄ,ô—I…"'j® ÕÃZIñºË¼¹…ÂÂBävµMÝ’oÉÂ…“—ÀT0û#]$Œ|Ðö¶µÎVûO£Í^'Š"òFî8zqýo+LK˜äÚÑÉ!7½¸IáùÃTîDí•Я¯•—ÆlØ’ˆ~‡e}V »Ðd7y­UmPG4K]’²T;ø3™oâŽõ__xþðß49÷„ð|žú{uîјØÇ¡_ ·¥ºš.rÓ[]¨À\çæ2É®ïüÛ Ü•AAä|ÿš‚‘ïñÿ_&$ endstream endobj 57 0 obj <> stream xÚ¥“klSeÆÏiKy…:”PQΩ(ˆ(0äBŒ@fœ"›0`2FÙ:ÚÎ^vzÖÛnmwi·ÛµëeëØÚ¶›»06˜ˆH” ‹pÔF?!èÄ5ø(FÏ@ˆ&~óËÿä}OÞä÷<ÿç! ‰„ I2k˦]y[ŸÍÍÏmuÎÌÍ‹ÿ­Ã7]³øÇþq’_$â)1ÿ¨„º²Yò§L´ˆ Èy “¸5ofþøÐÌ|ZÒcó I"s ää¬Y™“ó|®Áhc4Õ¬bYé3ŠÕëÖ­}Nñ|NÎ:Å&ŠÑ”*õŠ|%«V锬px[±ÝPªQ±6ŲÕ,k\¿j•ÅbY©Ô™V˜ƒ/=óœÂ¢aÕŠB•IŘUeŠW zVQ Ô©wÙWÞýätÆ*VÅ(ò e*F/ÐÎ^On&Ê ©#YÂ*ÀÎ#$ž%òˆÍÄëDñ±“ØMÌ$!!Zâ*Ù zD÷JŠ%—gµðž,<7È+7ÄxÇ„|À”ÒëM&½>eH¥(áofg/ÞxƒÄ¯qb\â•O1ÇÊ´Æ`LT¦: ³-öû¼^/ ¯·µ–†Mê7´Z‡ZÀƒî@ô›¯ðTÿQw‹xûù%‰ù£üïòÐa_ø  CQˆ‡›ü 4Sàa´ëµ²Å®z°8BÐG'!é–”§ÝµÐÔÒØÒ™}»$Û´<¯hTBQ¤ú´¿µ|€Žõ #vÛžú¼ü‰½_ÓÓðÛTúg”Å×f”\ü*oÂK®õpäÄ4þlZÌ‹ù§äW¤‰$¢N°Ó/H{±´­7öy°ca8ÞÝÕ mÐq[‰Û©†ÄöÔÇû¸£'‹“( l±é–5™=NSf>zEju€µ> qzJºñ6m[nÏÙ ÝÀ€µç¤?< ](ië°Vê«TûN˜Þ¥ÎÀø'=G‡/$ñƒÞv”…rpü ?rüæÜ{çÄxìæ,y¢ök4V­1{*9˜¤6Ü–É;Àé%1ˆ£÷+Æv¯Pe–¸œðQðú‡ú¯Ž uC æF³ÛÙP¹/ƒª÷;+ë´`F{GÔ§®á%ሠ<”ÀÓ\cÛ¢-x½1’¤!Œ%Ï –­,‹|ËûïPÕMcý1ÿ„€¯í6±:Vg‰U'ûûûú©LñkåÖ on‡&¨[x°½«è#ndô惥ãU§¨ËðÃDúçi^”H@ ühRyd÷’Â{ìaðzCñôù“ç…,ÄzÜJXÃmGY·Dw¬!oÎ;×uQ|õ¹§¦‰…fd‹¹º„èõ„Ú^_ÇÁ4÷]v rd[whÀÛÖ54ñý€Þ—ki` :Ce[6¸-. 4/¼ó|‚éÐpìì^>æïœÀ2Lz/ª9HC¡2#µ¹LnXÐÞ#êÓ–†þaZMQÅË;î›N…¹øéãX “èÓÒã©ðfIyQk§gÄbz+ ¬†=¯ÛÙæIåà>(k™ËfS×mro{Þ ×ýyâԨІ®•°=£n—°‰»á ñ­ÿá@þžÌ‚êý.¶µÿ)Ç’§Ý¾çßr&Žc‘ çÒþñ\êoø³†ŠïÀ;mÕšÚ­àþøD´N{ÿ!À/¹ òâ1> 4îú½ÆÙè5ÒQ¼XDu×Gì” ­.uYfMö ©Å)* úª473涃 í<ªúø—ÉìpS.hõ4;ö?YdÒ2;;Óòµ·u †}æà:¯aåµNŽ˜Æ—¦Åø[|FìKN_†¤ ·ÎÐlaÀ„ª£Ö~n¸güôÖ˜†Úê¢z–™ÚÑz²0#gf´Ñ!ðû|á‘Si¡Vñ#®m4¼mµ<£¨ÎW+K„ȳ`îL¸^xõW…jtLeEñ‡–ÔŒ^ö;ÊGËÎúuËÓ3vÓ.hq·4jy¦ @eÕÃ#4K‹ž@YUŸvb'Í(£³©9’µ Ùí²9^ÙÜ¡9_ÌMe2|eÁ_C™- endstream endobj 59 0 obj <> stream xÚ%kHSaÇßãæÙI—¥¹²Û9§L*:0C´²ì*Zõ!šëè¼ÌùÎY²VY4}J*Ó˜sÃ[z(‹¤‹E&T`´E1 “ ¢ë{ìø¡¾üà÷åù?ü(¤T"Š¢Ô»3³²röoJËÈÙð-ùrÍß¾¹³ÁÒJ$­¢¤ÕA«–)W#„¾†øaQ€‹Œñ#ècRRƒË/èt›cuº„4³å„µ ߈ù †||RR¢–OÐé’ø&ÁZ`ЗðzlLzì—bþ€ÙP àü†d#Æ–mqqv»=Vo*5[óS6jy{6ò9B©`-ŽóéæÌgêMx96€4³Éb•Ï0¬%QA›P¼!5Š@KP$Ò :QH‰²P=BÕR3’+ln0º‰¼zD^{(iÅ#…´—Ø5ä1íö‚Ïg'?&=´¼ƒÍÁÊ=rÊaŒ½àæˆßhØ|>ðºÙ0© D©S|ࡈsLAçÂ5­U-l®áP©˜BU+<‡Vf¾N•çrjYc!}¿æ=<|8 ÷ÕëD£JëºÞÅÎLo¿¾ˆTï/‚?+ÈmrLÓØÐ-6º_ö¿èƒ†„®•Ãeu².áȽs†»Ïƒ“ml~ÌlOr"Ñ;Såy¡!/rž†*°2G·“=ÁÅ´Ë^yØY~¾2*€‘ÓiÿfÙ­a¢ w ´Po¿“ÜŸ r…LkÆžf¯•ÃwåâÂv±—¹Óì;±¯Èb>iÐ~Ï 4Y>ûé“ûFb¼cm/ÞÀ83ßÍoËNÍk®héðxÛYè*rÛ.v÷Öܦe¤r»KôŽ S1®Ê¼P^]Y §Ç5¸ñ¿!Y&JGý‡Þ)$vn¥Æµeì)¨®>ã‡æ Q…äöVÁÓ),.¤§j.Aÿ%˜òĪW}7ù[\£Ú.kæƒå«ª°²&)­˜ëj›hY_¯CFBÛ.«Õ#ê…lˆ2Ñ£^@þDþ5'Mð endstream endobj 61 0 obj <> stream xÚ]‘mhSgÇŸ›D}V³ìͰŒÍ{ï¾lj¥FÓ8H`ÃŽÔ¨ºZÐ4½kRÌKon^j’†˜¶Iz®i“ô&1Ú.&M²ÔN×±Mæ´›Ý Â`T„±0ÊBÙðÃ÷Ö«liÁ/ãÀsΧßù©Tˆ ˆ'æƒfãÛ­F“éÀžÕÅ>œz°¼rfô"’^"¤Í ‰TJϫȥvÕ¿jÅf„ôÌ*ï?µÊ{O¯òÕ&”¶g‘Š °÷tR¯­M¯ßet¹X{¯£·X·Ò; †ÝÛé]z½Þï`X»Õâ¤MÎÆ8,\s8EqYí 7@oÙgã8÷Þ;ü~›Åáis±½onÝNûíœ>ÌxÖÇôÐo¹œÝaq0ôšzÛ.‡ÛË1,mrõ0¬!BÙŽìD³A­¨½ƒ¢u D Š›ˆ Šn)¡‘~ñÕoþ#ùg‰»¢R)Ý’þÖN\>›ýð¹Lñ£…05 ƒ‰VàÀ Ã|„?ÎG‡ ÎA…â¡ ÓÉZ2‡ÄGGƒ2~Èèü†‡Ìàƒ#ißWøvêûñº·Èy,³iáøoÔ2ˆèÇéûX#>ŠÖ%ª.jï¿/ÎÞVŠó+*íÅày®ßéqxÏËÕ* R~å¡RûžLŽ„F"pú…ιÞoþüL¤ B,5DF 9”ˆrotw[G"ã5 *™ÉÂŒPj¹ÚÌ]ÝD9?ð ëåcÛ,2=x&Ï’àÓ)¡¾üe­ÑùÃ瀫iÖKÁÀH Ö—Œ…Ìñðò6]<4ÌBsS±9 Å|&ŸJg?/a¯$…\Nt—ÖË'… d‹j÷‡ê'2ê^½ñR˯ëcjµ¸´é?séŽ[ endstream endobj 63 0 obj <> stream xÚuSmlSU¾g-íÝ(…òu{A#La”.#q$:Àp˜R~Œön¥mi»µëÛuëÇJ¨í$ 2ÂW1£ÁÀ/üÑ„ÄüÁ¿sÆ)Ó3’˜›ûž›ó>ïyž÷9ïEœZÍ!„jßoÞѺ»ùímÍ-{ך¦v69'?yòxâÄ ²Œ#Ëy½Š¼¡" ÔƒÔÿ誖rÚ3g*n}m*®žÍ"÷& 3Üs¹„fÍ_^·aóvåÊ/n©Ý.ñtðH²]òx¤ÃÝf»Õ-™eÉýì[²KÉ)ÛœlÃ#Yd›ËiwYm³Ýå6™ÖÕ›L Û\]>·ÍÚ!‹+-uâÚ¦¦ÆUbƒÉÔ$nuHn†tŠÍf¹Cr˜å©2±Åe±I²O\¹©C–»6®YãõzëÍO½ËmÝ\·JôÚäñcÉ#¹{¤ƒâ—Sw›’Xi¿¾²ls9ºº™$±ÙuPr;Y“Õ7—›‡¸Ü§Üg\;:Äz>ƒ¢(†úQœ;Ž%Xf?ׯéª8Ä©¹:n©‘Ý­ÒVí­:§zOuW5IbµìWЫ&V`¿þdŠEøå‹¿¼Þœ42]ªàz…DTaHòpIG5ô=º˜.  t¨¿kÄ£šé|QÃ2*\ x Ö°g‘¦ŸîÔ¿8Ÿ¦ÑϹJäB±"«‘ü¥Ï e†à8Ÿ gB„¢Ñþòu:bð‡cC(é%×iÞ @ø\6›3B6šògÊE7TÙ[ÜGåqÍÑžWZ›¦{ßפRiÈÂp4õyº|ç _¤£Ð|  !éËõ‘Q †r‘‚7CïÂ`6”’0ù4O.жÿ£«·(Ìðgž§"—ÿcù&Íq¼káeÀcÓK6h躄ΧëézÌV¼Åˆ^Ê›4tPí£^Ä3Š?Kø€‚ÈEE0þM>–ìÊþéû$Ý´Eã_±…‚À ºK䦂n*Ä9UBfëñ*ºú6ÃWn§+„²JûŽ'µø-Ü8vW¸ ·B?Øî·Â.èâéSí+'Þ+¢›ä†Š<&?êSùÄ ñ¹P6(ƒÞHä( ”Oh€œ ˆÀÂ`hÊÚ~èOð@ùgCÆŸŠf!Étj„¯%1š,‘öSÄVDØ~G…ÇÉS=(§Å(=”„›  +À´'¾•§G´p:-‡:œRw¼/B/KÁpüvôª5ך 2*+O[µ`†Î«Ò%Çíà%67`s3Ì ‰[Ǿ¼˲çq»®„OvŽõ”œÃ®Ìï__Ÿž«ê([©¢ÊN«õ`9¼‹¢H…“æ +ü ¯%îñ˜©ºcÊù g/Œ&*º+l;÷¯År6¦ê{ÛwÑrnǰ øP˜5ÏÔߊ^ëÌïI†*Ꙫ¶Œ¬³ÔsöØ7á&ÙÚñµø[¦êI 3j¦¢Âë&öë PðzÁç&׿tIžS[د»8§jÔE]uZW“ÐÍTj”™Ê ޽³ðƒyÿGQ–Ù endstream endobj 64 0 obj <> stream xÚ]PÁjÃ0 ½û+tìÃI c)ÒŽÙ=ôèØJfXlã8‡üýj7ô°ƒzzOÒmºSgMúœâa4V\Ü€“±¤¬@÷*g5KOhÓK–3½qÑ ñÚôüöñvmùÇCl¡ÚëîÄ·%âÜÙÑc€~ß.1lpøÔnÀ—„]‚Æ`ì‡kÃ3ÂWïqF¡ uÇ•“”Ó¸x©0H;!aEQkÛš Õÿz»bÕ „³*ŽUæîhR%{Owj á¾7ÿ ;JËÅ盼óI•ã¶mI endstream endobj 66 0 obj <> stream xÚcd`aa`ddä ñ Ñvö Ž´ Øæþó—aYøs>ëY†rŒ?ä™~(0ÿg‘{èÅòŸ‡I–‘UH2üã‘ß@¤:Hø–##¯HcÛÔ‚¢ÌÜÔÔœÔÜÔ¼c=#çü‚Ê¢ÌôŒdMCKKs#KÇÜÔ¢ÌäÄ<ßÄ’ŒÔÜÄ 'G!8?93µ¤RAÃ&£¤¤ÀJ_¿¼¼\/1·X/¿(ÝNSG¡<³$C!(µ8µ¨,5EÁ-?¯DÁ/17Uì=0霟[PZ’Z¤à›Ÿ’Z”t"3ƒƒÐÁËÛ;XY4³Ïýèàûyî{ùNÆ'?¥™ú/½°{Ñ¢Òîjù?ÙªK»KJvÏ–çû¾eË‚…óW}ogþ>÷Gžè„ý“º§r¬É]˜/—ÜÝÑ^û[ø³D{}wGwWwÓÄΩs›{»{»ûº'vOšÃÁ÷3Â{ç÷Nb|²‹ùÇM«‚Øf|—ÿÎñõ»N7ÇwK6¸Äo¶ß¿U+üvúíü]í·üwwùï6Hò–l¿uºs|­û.ÏÁW¼ø§ý¶ßrÓÙ帘§©þçáœÄÃÕÃý“k'÷ι<<@Ìûý¡€ÓÄT endstream endobj 67 0 obj <> stream xÚ]P±jÄ0 Ýý¯”’8ÐÒÁJ®)®)uŽvul%g¸ØÆq†ü}c_¸¡ƒzzOÒSV5ÇÆèÙ—·’c€Aåq¶‹—=ŽÚZ€Ò2ìUÊrŽdÕI¸O1!d¼ýi?ºÇêôþKó§sWÓP8Ü(ÝêнnŽ|N,0F²ïmâü ‡7e{|ˆXëzmF8œ+ž¾8wÅ M€œ”eGo7I«pvB¢fDÂò¼V×%A£þõvE?È‹ð„=¿nÌ¢ 4qw4ª¢¿»=¹x¿íMOHŽârmðþ'g]T¥øñmZ endstream endobj 69 0 obj <> stream xÚcd`aa`ddä ö÷wÑvöu04‰˜Ë|)a]÷s놲Œ?ä˜~È3ÿg‘e``ø+"ñƒÈo RH0ö1°22 J´õÌ..ÍÍM,ÉÌÏKÉ,.ÈI¬400Ö300rÎ/¨,ÊLÏ(QÐHÖT0´´4×Q020°TpÌM-ÊLNÌSðM,ÉHiMNÌQÎOÎL-©TаÉ())°Ò×///×KÌ-ÖË/J·ÓÔQ(Ï,ÉPJ-N-*KMQpËÏ+QðKÌMU€øCB9çç”–¤)øæ§¤åÝÉ$Ú˜Yº~tðɰ.‘ùÕñH†åãnF–O@¶èwÞïWX‹ØR”ݳ疵iþéæøóžíÇÄ/'Mîíëž ÙÝÛÝ×2õOÚOA‰;ؾKu?«Òy°ùQÕ­È%ÕçãÖZq,aûÍû}-«Ìï$¶’î®®ŽÖ®ŽîŠî†KÿfHü™õçsc}w[w—dÔî¹r|åóÙd~WÎgßŵ‹{ó$ æ•ãb©ÌçáüþPó|˜ü endstream endobj 71 0 obj <> stream xÚÎ_HSQÇñs¶ëÝÍnšæèŸÞE››ÅdöÚ´YÊzé!ÈánÛÂëÝ®7—ФEby¨ ÐZ³Ø¬ehD½)¸‡‚¢‚Í—A°ò%(8ÇNy_>ð}ùñƒ€ã„PìíóxüCí^Ÿße´+În4r¹ËUt/ 6™¨d¦;¹&Àza¥Ö°¼Ý°e“¹p ú…‡c¿ÝáèòªÑI- ë¨u¤ 9ÝîîÔåp¸ÑQEÖ"#1ä èaY è›1ŠNª#YŸD­‡ÂºíéìŒÇãö€2nWµÐ‘¶èaä—ÇemB¢c꘎NŸí^U‰ž×e ùÔ ¬MíÀ A=Ø8€€CàéÕš¿™mü\!ëiH}+fš$º•ùTg³NØX‘”øÎÄbXKH¬ÄŠ–„†c± NÙH‘•øÖ²YœII5”à> stream xÚcd`aa`ddäpu òÒvöõõ4 ØNûÝ'Ãrógëi†2Œ?d™~È1ÿg‘{èÅòŸ‡I–á½ ˆ|Ã"_€Hu Á8Qˆ…‘‘£´ªÓÀÀXÏÀÀÈ9¿ ²(3=£DA#YSÁÐÒÒ\GÁÈÀÀRÁ17µ(391OÁ7±$#57±ÈÉQÎOÎL-©TаÉ())°Ò×///×KÌ-ÖË/J·ÓÔQ(Ï,ÉPJ-N-*KMQpËÏ+QðKÌMU»]L:çç”–¤)øæ§¤åŘ tž##ËÜ|?Wÿ_ý]dÁÁùŒß%n,»ÎüýÃOÑÅ•³K ò óŠæÖ,\½då9ÿßEû§NYÜ?¥oJÿÔî9‡#WEªFý–(mëoš)7³»obß”åo,ZÞÍ1R]‰|wykMgKøo‰ú¼îκ̺ܶºî*Žˆé‡>ìý.±°·kz¥\mwW[kEuD’D7GeÓôÅòÝó'Κ±Šƒ¯lÁç©Ó¦}/XÀö;a*»‹ù|ÎI<\=<Üë¸p¯ëçáùþPEÌ¢5 endstream endobj 75 0 obj <> stream xÚcd`aa`ddäõ ð ÷Ðvö Ž4 ضÿóa5ü¹Œõ‡4ÃÆ²L?䘈³È=ôbùÏÃ$ËÀÀð^D¾á‘/@¤:`”b`adä(­ê400Ö300rÎ/¨,ÊLÏ(QÐHÖT0´´4×Q020°TpÌM-ÊLNÌSðM,ÉHÍM,rr‚ó“3SK*4l2JJ ¬ôõËËËõs‹õò‹Òí4uÊ3K2‚R‹S‹ÊRSÜòóJüsSÀnדÎù¹¥%©E ¾ù)©Ey@G1]ǰŒ‰‘‘EëG߯°ï%û¿ þŒaþ¹á{‰èì%ÝK—uWËÿåb«.ê.,\Ò=[ž¯xñOû%l¿§³Ëq1OSýÏÃ9‰‡«‡‡{?×~îý xx€˜÷ûCe endstream endobj 76 0 obj <> stream xÚ]PÁj„0½ç+æ¸K)FK{a„Ú–º~@LFX“0ƃ_ÍÊz˜yóÞ̼ID]ÖÖH¾É© ÆjÂÙ-¤zeiÚ¨pT1«Iz–ˆFúO9!$¢ûMùÔ´ïMÊŸ»k•¾ÆáN¹®!;êºl×9àTÛÁAž3€äg›8ZátÑ®ÇóŽ}‘F2v„S'Úˆ´‹÷7œÐà¬(â¸ô~“rg/’´#²œóòª*Zý¯w(úAýJbùKµ1³Œ¿FîîªÝßÞZˆ¶½ñ ÑѾÜX|üÉ;¿«büž#m@ endstream endobj 78 0 obj <> stream xÚcd`aa`ddäsõqöuÑö vò54‰˜…ü±áTÿ¥ÃúC†á‡,ã9¦òÌ?ÄYd^ ‚Èçü ò±ˆTŒ‹„X9êZ:Ss J*‹SK Œõ Œœó *‹2Ó3J4’5 --ÍuŒ ,sS‹2“ó|K2RsK€œ…àüäÌÔ’J ›Œ’’+}ýòòr½ÄÜb½ü¢t;M…òÌ’ … ÔâÔ¢²Ô·ü¼¿ÄÜTˆóõ ”kiNjÐUŒö@¢‰‘‘eó¾Ÿs;7ÿèßÌø D2ÿ ÿ±Ytæôî‰Ýýó*{:åZº;:+«í<$Ê:žúÍÒÍñÛä·ÔoáßVòݺ›BæçU×tuD”Wvvv7qÔOnž.7©»·{ç%¦4^uø.ÐÍñÝî»Àw¹ïúòÝ/’V,ëé™8¡¿ŸãOØïç¢Qºw/äø®òý;Ów9¹oÝÇý¦6p,Ë]?'²;ˆã·ÊoößL¿åäºýO4Nãà+ŸÿÓqÛï¤é웹6s¯›ÀÃļr\,æóy8¿©¤ÿ endstream endobj 80 0 obj <> stream xÚ•WiT×¶®¶éªB¡Mh+‚IºÑ8 ¨¯Þ8¨áŠ8€6™EE¡{W£L N ‚e*8G1fÅa]ñún”¼¥‰&†û’]í!ï½ÓÍË[o½µòƒÓ«éS{çÛß·÷)cgÇ( uˆOà’WMð ð žìeûÏûA¤ø;Ñš«’ßfäwò»ƒd­Rf÷.Ã(|ß´­ÌPº2=oØVwº }èÄØ)|F6xyMèå5Å7iSVJ\LlšëøH7×É3fL÷pâå5Ãu^BtJ\dD¢k@DZltBDý²Ñ5()2.:-Ëuü±ii›fNš”™™91"!ubRJÌl7×̸´X×ÀèÔ蔌è(×I‰i®K"¢]POøðMJØ”žâ’Hq:z*æ1¾Ê™Å2&P1(zP³Ñ.EiP0ŒšÊŒbF3c˜±Ì8Æ™ÈLb&3Sofó>ãÃø2ó™ÌBfãÏ0K˜¥Ì2f9Ĭ`V2«˜f 3j¥ÂŽÎLgŽ)ܹРš>(Y©TîQöÚU©–«jÙl÷WÀýÄ/±w³7Ø<ðGC† ‡•öc¿o4¿ä` Sá‹ÎNøâñcX‹¦êˆz‡Ð•zÖXO‹0úâý›:RNdï?¾¿Æ¼G4s!ŸO9ÕÐpàÐáºÍ-¡ÚlЭ‹ÍÚQ3žvôŠY´lë«×7¥ñ+“›¿2 {×šÖømE>°˜¾8õèwÿÊMªÄ¼Ï5] €ú Äu¥9'á TìÚWRÆ_#+Ú¼Q1Q+É[ÄaMW×ÕÏ Jg»Iøâbz9ÝG/2ÍL“W ÄÇ&¼+6á‘k ô\£Ømn?~Öh#0€Ó¼¨¿NÇ4G¼º@µ[šOkûÃÉ=È#£Ä4«¿ð?|†Æi¢w¦ŽŽ.c3³€ÎÍÀþü1'ª|#þ4ÝôSú¯šOžºbj¯é†vhßR[+`-ï „!z§u"«$i‘#[_7˜¸ ÿ!À!Q¬ªjm;WR ü—–'2Òoµ¿n+mar*A„Cü,»ŽØÓ;lSÁý§þ†ãõ”ŒÖÍ…UÓ²xͳîß{T´®OüßgçÔrå±ß[akoÌϨ¦4®ÃoTqdækqô“úG—úrš{7ëQý£ÖdÊÚ‰üú¦ÌcÇšjZϯ<¶Z«éôƒÈ´Å´Í„ä[ä·›œN¶GÜÂít¡Ç $ü½ÔHüµ'pH{N&î^!f‹¯æé×ã´ŒeH®Œ-‰>ÐkìpDVoªÞÜ{2ÿÞV^ÓcÉ¿» –ñs'Aºv$$ßÙÞQPU[_ÍPÅÀ -3Ôì£w¥}Åæ®øsP |#N«ƒŽÌ–Ø£´ìQÇâKfURÀA´/þ—„sª½´ƒ%e¯˜[Ÿš´®×iñ}'!c1Hϙƭ?¾ˆáúÇFÌyªÏßÕiýo ³8ô+QI\ÀN8¥ÓtÊTiûä nFð*ŸÙEõ´øô¿lå\¤ÿ Õà6tݧ {û;ª¢V¾ªÄÐD[¾UYURú\$.Ö¸ÚTbN¢ƒ–«‚½Æ½; óÁXX8ÝÓÙ 9U«Ä&›ããÃÌè–[m.‹Ép2n³!Ö‚ ­µùœ¸»þ²±Úöò”eØ]B_ž@,-{† gDÞREéÙñSó‰¦Nã ºg>UR/Ñ[äËrJ¹XvJ«ŠK¯/q©ÆSJJ˜9ÆÇÜ Ûu`*Üa2ÑÉer&¬S]Ø ÆÉôÂf¶Ý'®s¸´odÚÚôµñ çƒËV0ŠyÅå»êª …?‘z8.)Ñ,­¿ª½—¯ù„Wçì‘—•cXMÅ–„–rÒ`d‡´–:8 {ÔÁQ;Ønzµƒ½è –5ÃþŒºå endstream endobj 82 0 obj <> stream xÚX Xg·ž°LFAâ(´þ3tQ[W\«Ö_ŵZ±¶*Z놊¬ IX#ȇEAÖ$È*H¡nUq©V .5*õÖ[í¢ØÚj«VûŸi?î}îƒWïòUïzYr#—ÿ‰Ÿc.o ܨ¿â[“;€Óï*-¡$./=SU2·~s!2gÝ ¶ïÚe\Ô¬Hß™Y•™— Æ=ꃂ (A€ÐÌyY› sÞM——IÀEl‰Š!2?yWʹfQ\Ò–dˆpO…Ð}ö½–¾9c„º'@P}=ÔÓðk2.¥WrND4h±„¸\q%~ÿ‚B†l>Ö{eL\êÖ´¨ˆàb‹¢Kê6¦ Ÿ­Y¯VûÕ¨ê…\Øž¹=‹st‘ÑG]lñF ߨ¬ öS…„l¬Ý\×T±gà&ÉÉô˜&5…&õ‚tƒ/† ¥ Éq)q~–ÅG¦ÇdhÓ!ŒS•¦ e°?÷P×>ÙS!Ê (1‡-ª€Ú=á#z²‡±7ºàÒoìÜmwëÃ!^L ÉHMz{rø:à<Çÿ‰CñíÛ¶‰çàÔªÂÉÙÑY1µÀ5€A/Zʯ3Én™±Ôl{NB¾Ë×"ÑØ®Ó°ÏV¸ŽÅwÐÇã¸ñ8”¸‹DÞ~„—t÷åhš¸Žôú8[‹EÔ˜pÉõ˜?7¯4+þ~`â•Vc’ÈÖoÏ«Ûäe` m„0‡èåŠvÔàù:ˆiØ Æ2á^×í˜u€k0݇Í^‹ßB«|OòÎ@¡½kɶÅjmGÉ‚,Ùc3¤GÛâ4¬æq ûR›1³_bÓÅêi}».¨GFZ¾Œ¥…±&zUÀÞP4"7$[“Ÿ¬ïæ‡['?Â!%:Q¹®aiÁjÊÛéS&ˆðÞáyß…sŠ{9Ô…i\+ÍènF·nn¸½„A‰‰Aâ ù³;'ѽ]·Lþ šèõßx/Q\7c¼…ôÔl-[\ÑM{¾È/¬Ç¼eË|æŸø—€¿ÔÊ)^¶ëw–8ßõðáíŸÑYpJ4H{M²R)¶Óö§†®gu>b€q*9»Å'rZÒZ÷ 6¥!µ$¡q¨äîÖðÂÎOiÂÚKvúC ¸WAä5vç¥IZm‹‡ðßy´Gµ½ÑŠÏ7:Yåâ,2x*¶×[ZšªóV·Óå,: mû%ö+êžtš µø3úüN|ìÕšçoYNP³N ©õ²3Òp[ì÷×(>egb‰†J¤Øè(s¶f'ã÷ÿ1×mÛÖÑF*¿ŠJJEØ‘º3-—s~EvZò´•& ç  ¡!âDr• €€€(’MKL8ÚôÐäzʼ¶ ½Í ­dSÇCŽf4WmìŠÅ¶nKÌæ0D~ué÷ä͵ƒ`†Ò³[(‚ê¼ÌFØ‘™©Ï*ÌÜyÀýÛ‰Y¢â™Fœ?†aÜœóó m#´l?²‡‹Ç…ü;rJí†(ÿèÕœ÷º½Ÿ‰Ðüc#Êá,Mhß1sÍŠXœ,¹ñ8¿~3¬êàóö\6´´­ë+Eó~߃ u”)²¿¢Çüöš¨ˆýVG†päc»VùÙ3'Ï}fƸa³çÏþgÀ£= ¿1ÉZÍÞf+mD_ ÉB lMOŠHÞ¹Ò ¸ 3¯üt´åøªá3H3ÊtT]ï6”Ô´¾«ÉôÈÀ±Äñ—AèŠâÞßJºz¹ÃÿO»üÿûïº}Bk7îuâj)—}!2†U4Õ¬+^KY*6œ(Hß»Cÿ¤aœ†UÕ5ÛÍ’/^=qꬮ¶Ý¿rñÊ…æÅK:Âxû™d§Ì¸›rl .æ eЈìû¿‘þÄaت4œ FJè#w+,AŠQ˜–©Y¾4!Œ6ïéÇb~ä2Ïñ…­gO]ªÎTyovôðºÐ)·Àüà¶-æJ,NVn§#쯠VHÍÛР//®>÷.ļ;uÕ8Ágˆ¼#, ”‘–Á=Æèn+²Sñu½¾Z³f™8:€ÏNoR7÷së5Úkj¢« »sveæn*OÚ \IyAMy䞥b<¬ÈX“P¶ ¸³¦Óž·¶$¨(’S&>&AJ(TåÅy­†¹Ïºûa¿§-?ÐulyÕ–í¾ÆÑÀÍfa $fÅB2ÄÆfè! r² svrè@ÎóC¦<$Bi^]¾¢8ZkC{¿fúÚ!Ú® –)¸„Vfæ-?8ExVFFr¸ð%¨Ö­é¡€Ç²…–t©hº×àlöá×MÇO†} ˆ )®²ìÑcÛY·›]Ñïá3<-Ò+|Ç1äõ…°'-¤O¡{ÔZ˜×YÅ#)Ý®Zc ÓhÂÂŒšêj£±Zp"‘&Úm©é£m8Àbü©d÷ÌøöYͱû¢ÁosÀ&¿ÊöPˆËŠÍÊ̦¹ÛÎU«K´jMtè´ß`?ú/ÐW關׉@Š@*‹öáQnßÐCŠì¡´X2 ·Ç§IoKÍíºÖUO]ºâ&ûí×´£:ßu:œïm5Â>¯¿z>ÖŽõ§B‘ï±¾Õƒ!ý»ª±Ääzò4:X>Š›(“ñéµ\°uø¹¿¶«¢w:]ÐÒ—1œ+W4·í?²¿¼0z¾@tòÈî²_nÓÿ¹%…JNdÇJX·%lCìÞ°Ò à7ƒA© ×pÏü쀪âÚuûñuP´þùÕò¿€SñùÿžËv0@ñMººð—f¬  ñǪGþN_ÕìF¾E\ˆâ×áhƒ6¿ÞGWø’ñ¼—÷õ{?]¼xõÚ…ùž#½§{‰NDeÂQ¦-éž7©Þ,á_hød°ÝK¦D׌P<¨I/ô{žŠÕÿS´Ö²â3ι­øUt²ýrö>ö2ÃK"*€3ê‹«ôq&ŠËáý¨% 8Å7{;Il¬X¼IZ&÷@fadÛ²©q½fÂ8SˆIñS¨s"²UÛBsæÀg\eÝž_…ï P™½93:+zO—ð3wë¾T]zÒȤå]õ$F=þYGu_sâ·[À‡Û¸1ÈSX ‹óU7RJSó7w‰Ð¡4Š3 ›ýO¦WÓœ©ûxOoÞÖQ¸Ë¦?ô2K ÆPz¨,óabôO¼Å>{c4Î:î4vØeÿÖ¯ol+C@P†6ZÈðþh«¸©p¢¢kжtƒ1ÿ®ã3ƒ P \Ï!J©öâ ¤8=9.x Ô× Xþbƒ%yì0sx« ˆÜûw6VsN©'ðºI¶[Úd+Í 1Ôö¡—µ8Õ,‘‘ëD†×í«ŸÛñ¬Õ²('÷ 髸—A9ä×Sãô2£­IV,ÅÛJ«,ö-Ê3¢D"g£Â;Ôc™ØÌ~LŽÛg°©•[Çí:Ÿ–[iÝâ5iIë‰Áe°Ëð¸}sçß4jˆ|ö¸jÅs¤-G»Ü÷Av^©©âNfa¶‘Ëd·-k$½r ¢K¡!»8ÇØÅuY³÷w¼‡ÿÅô´7—p{5){ •UáWb–œ\$ÍÚˆŒ4ˆv4B™ 9³Æ\ÐCwÆú¿„1Êâó¥™y8-Ÿ%QÛå¦Þf“££Ù±ÐÛ.*̱—dì÷_Ù[ò| endstream endobj 84 0 obj <> stream xÚ¥W Pgîf†žAm4&é&‰ºžˆ¢I<¢o"‚žxàpÌpÌÀÜ —(¼ÑAA˜„‘CE1xFC5êÄ{â‘d“h4jŒ«nmþÎþlíö0èŒkv«¶¶ª««þéîÿÿÞ÷¾÷½7$!$Iö [´d΂Ó‚-š`ûaüzœÅø}ž+ÿ:Á¿Aòoºð¬ˆï/~“ È^Âø{oÛýOÛý-áæ™Ñ‡“$­M/òóó÷õó;M™˜¦’ÇÈ4>C¥Ã|ÆL˜ðÞHŸ±~~|¢Tri„Â'8B#‹JˆÐ‹xŸ…J©ó"¢|º0ûvݧ)µš(•O°22J¥°º’L$ˆiäLbL.$#èx±J”*€ö zž„чèKô#âuâmb1˜ø1œð%FãˆñD 1˜NÌ f³ˆÙÂAD01!B‰ùÄBbF,&–C\’p>NdgÉä—×]²]ÚE£De¢ûâÅâ*×\S2ê3ÉdI•„§¥ô±\ÛnKÝöº=îYÜóïî“Ü÷ôrëUÛ럑÷<ékòsÞOÄ¿‡LLé~hÝ ë8|ʉ‚è¨V(ã<õ%Ñ ÔW„ncZãâ¢ã㢛›[ššY÷M¿kŒä)~¤ˆ_õ»;³m'è`+]›Z‘ƪ!/µ0ßüGà€ü (†ZSYÅÖ¡ª¤”öȱð`!YQ‹UÄ'¢S š7õÇbì:ÄAxÞS܉‘ë4±8뙂‘„_üåêÕ‹Ãñ <8÷ø@Àhá)ËS#‰ ¬"t¿ÁT@C›ùyë³ãgH¥3‹µE@§”®«cÛà€©ÖHwŽ+ÉH‚ظ¨àP UÑÍ-IÁ¥læXÈ“÷Ñ«èÂY&¿  2騨ɢ;T‹aÛn·¤j££!9‘ÅZêÓ#HüÓ®ÚÖ}W/Àcõz{â“&½+mέ0ÖW6²`ÊßZXRyèPý  ¿±®ÏÁŒ°i¬´Á‚–XÈk÷»(CŸ0ÏÍX:wAèx. ¦êeÇ@·Iº-Ø´i»N›@OïJ1%©5™rÿ ò¾}ï! ßnºvrëWÐ@ߘúvŽç,Ÿ•P“¶k—ÉXÏ‚aciáÖ– lúòáèµ(³×Fª’ÒÓŠÃ7F¥Ø(‚¬`žYxZ`ôêÑ~L^6A2­Ðgíg‘nP•¥„¸Ø.æfSåf¹DÈäBžY‹ô”Ú“o± J닳“iìßI1(=pÅ$6a¡qñ¢WÕ…¿¿ª8°<°ð^FÒÌËDè ÿg¦ 1× :—’Cn~AO<éH|…ÅÈŸÁ^T=’´ _ýZGmÒl_¡+x.×6+:z]ħ>טÖ¯ËkªW5„½±¿gãÙÈ¿‰ ן~x¸'r¹BH€¢¤|Üëí¢ ÇLøMPñ°žýÈÕÀ÷yÕØS¯ÚÛ€n…Úê.5k-ä7V´Ý*:Í#&ÓNõNÎÔ©M¦^¬”Býï ·Ð84n<Ž_ã°¸³áµ÷$ˆ:)”Óó±»mCi»È¿X‘·u¿ ±@TÏ o* R[mg²»ÅœÅbo‰ èTÐØŸÝ´ääl§'•‘(fHkîÔÆ9Vh U¾[ P)$})Õ i…cNòí "Oq;•¥àw}Etj1á´nwzx¾ÍÅ3ÈtF„Žño2ÙÒìµëãébjýîܦœ– ´b@îî+‡À‡Šš´ºM[ޱæÍU`úÖ‘ØyžT„„Ã0zê¥àGl\‡ŽuòhÚlËq¢Ày&$CêV:àH–¦Ä¤¯‚ @‡®miãàø“=ÈSGÛN>oA.ò鄘&ó_1]ALuXã¡N Rì‘Ù¦„i‡E¢>¨çø'XÌ…CDºLAã¾âÓ§yéô¬qcƒfNüö$k;à‚…¼bEñ÷E|4"S¦AËfCäi 2Ó#fýîÌK·O4ý†úq•P^¬c‘®X—·YÞ+Pß`46|=ÂqÀ<üº?öøu(êÞiz\Á9°ïéÂÎþv<’ÒVKk :½pï»ÃÁ†öÊ}ûèxHÿ˜½î0ûÕTòfÂVMüpfèÅÛ?Y.\;óÉ’°®(˜ó¨—¡›h»`œÑ|ÆXûô f°ÇÈÁ¸'öüëPÔ <|·Î#—ÙBŒêȦ÷ö¤<¤uç™êïÎø.ÃÁ•[?´Uê° wÁg‚ò ¼ ƒz8ÐàG¨k_êÙ͉¦ ÐÕõåÍg'@攉kFsËFHº¬Ëå#Ü1ÄÉ‚v;Ä5„òÀ©çÑÄ/OœG‹Ï“+ µ6Ÿ¡˜sL¾€/s† ‰œ²<ÃÆ°ôPVbhÈlÊkúõÚ[‘˜ÓëkÊ*6•ë¶$™òË®­®ªkÐ6-æ4°z}´BY%/ªmT@ ?Ñ;âªÔy¹I&妢Yƒ„‰Ãÿo!B—ìóÛ™;è<ìr$a–®iïèho?q¢}MXØš5K9žÎÜE$¼/±fȰÀƒí´6<¡ï¢éôs•†Ú23—žÀ†ÃÊô¨X}$yU´ÚÕNÝý]§£ê×ë{/W‡²XçT•Õ`Oέ§$ÊrcáO1fM­R©Ñ(•µ³¹¶ÖÌâìíèkÈw`§C;yxÝ º ¾ÜWº‹ßuòWo¡¡x;­o;üVøÝŽŠ³¢já<9Šgç¨Ç¸è:j¨0·z>. Þâ‡'‹¥Ø ¹v÷§óg/]>€ËÞM5P¸ncATõrH\pZ¦Ÿ’ƒÅmê²ü=ÉæÂgõneÃ2:^!ÁΩ)åtqC©²»ƒúÙh”oÝfþDv Œë~> ôø&u…t—ªdTEÄ–9¥ÐJ×7›ï±÷`³\§Ý¤lpŒ‚…6ŠŸ cøkWäZ›Ñù;ÿ·”}rÓ¤°“ÞwÛ÷8“zçªìÊ—ÎX÷&A›)EÅqE+¤ZaT€ŽºîÍ_ˆŽíz@4õÞ”uò)°»‰E5¯ZÖS£.$Ý`÷B[I{£>ÁU@_Õ Hô1R1ˆDƒ\ÛœŠ²§½¼ê`7Ûwæ}×:{Î|ñÄVÆm”`ƒ„.1ÆUJ9þ¯õ´ï£w ÑßaÚ5IýoÏlgH)œR~Ú6ôa)…S·H,nÖžww«{/ÖMœ¦tïÁ×ôû…mîì endstream endobj 86 0 obj <> stream xÚW TTW¶}eA½Å"Š/bÿä½jœ jPckhEqŒ8àZ2KA12 ÈPU§ŠIÆb* (Fgí˜|ýv›ÄŸ8´~cì$vYëßÂ!öZIþ_©Uë®õÖºçÞ}ö9gŸsE”“%‰\ü·¬Ø¶bítïu›¼ßó‚qþ¿LƒYÎÂPÂë"áa'Æ:½AQ¢¥£ÈJ º:Öÿ~Õ±N"˨ÏGSN"£JÊóôœ;ËÓsŽ·2&9.",\%›4U6ÛËkÁ ÙOO/Ùò¨¸ˆ y´l\%W‘…ÌO¢J–MY®RÅ,zóÍÄÄÄYò¨øYʸ°¥SgÈ#Tá²M!ñ!qûC‚e+•Ñ*ÙzyTˆÌy–cñVFÅ$¨Bâdë”Á!qÑéHj<5ƒšE­­¶‘òí¢äŒÂ)Î9™€Ž¢©‘”+5™šBöÌ$»fSoQó¨êÊ›ú3µ‚ZIùP«¨Õ”/µŽZOm 6RïR~Ôfj µ•ÚFùS;¨ Ã(åDÕˆ&ˆDi¢ÿ–*þ£8ÞérÅdç2Éë’nú-ú3ŽIa¾|¥søìášágG¤ŽøÉeË‘kFJß–š\]]ß{ÕOÐH…Ë`œíhÔWÍfÑã+hß1º%¬dSuäZÒ€ÁR4LòýWí\Î1Ççå( ƒ‰jLi°šjm›{OÆ.[dv^¢ø ÿPÃjNA÷jõ½}Õº~—‰vzµzyô74î+JßËãú_ß% £¥B©ð† -C”5#o³y 7ÙK±]ò𤘘˜Ú˜v®* ÊJ ½^Œr²xXµ~g V«Ñ@.“[”]\zó¯È…C»^û}†Rtoy†Â—@ð­baxýÉ;/ò@7´³ìÆu4ü“ØÎàçÇ›F½ÃˆÕD‰‘ÿY¶)ÞÕßÜÜØØÌIç€õÙQo›Éî¢6±ðõàöÉ{ŠÉuƒ:”RK‡jÕK9•BÒ“ÿ!ô½í„¡HÚ3¯¼“GÚ»ôòÈù¼ Õ(%óÕ‘Ó¸Ù¨PÒf(îãÐh š f¿*Ì16‰t°/ÁŽÒíÂD»hà‘àsW<¸lp1[ %\6h49YþËÜ#í›Î{@oÅ ñ<ˆ÷ ø-äÏW;lýÕ1á¥À”AI–ÑG /svÚW£†­Áó Üe¢¢…¾ŸŸʯ¥±Ï€t/¼±u¢ä{æ îøaY#žoH×çVS…&^:xìƒ"»Ãuâ·p‡½øþ‡új=c§£5Û!Sª$§Ò61’à æ`n6¾…?pGŸÐ†²ë\ƒ]¨ñƒ€?pll ŸRVÿeç¡·÷<ôÊTôRm¡ìO4’"g´×R—õ¸è`H& x<ÿ$ôXŽÂ)G®…´’È^œŽnºK_{ݵ‹…¨ŒUJÔix4öæ-É.mq/Øè΂ò{\‹]®ñ„ €u¿ŒIh’HÿµüÙ‰“ìBÇ ñ`à ÇêuÎO.¿~!ÿ2‹®ÁÅŸ õÏÆK$û!²“±êÉ%w¬.¬Ób`^ò"mréØ9‰¸uÎP©ï?aÔu¸5 NXy¡…Öë‘î'ª0½ «Æ•AaIA #Ü@r±Ã†.`ãï¢ ÄÂt™E²G·¿þfâmÌó¿8ÿ·9Π5è$;”†_KàadÁ‹xèi \B7.‰Q¢0Ÿ]\{ Ž3—Ï^ú’C,œž^鑟¤Ï-¦ŠM<ÚB×Á!G¦êtÙéÉ¥û¶¥Ôm;9“$ë+ <'ñðvßÎÂÜžÝ5¹h„òFR‰¶5B¯k …ŒÏŽežÜRÀ|ËAä¥3BQ:0ip0‘Ç[èD8X΃^_\^Q“™Þzúà Ÿeöƒ¤7¾}ÌÃÀþãñÍ{Ζù ;)D"q§¨ÓŽÊî¢R»£~¼ØŸhI"Np¶I*‘W]šµÐ¥Úš<}&Ä1„¥80ž VH:òÑ0èî&Ká)˜Æ6GHÁ¢/©+(5X¡ˆy]t%ör”+¾×…–׉Ðì§Â×"lb­IÖp.ÒóÔYZ­Cš-•ððQó'z †ü|(d sг3ç/Ã.k,ò®öZ«Õ!|¿Ï P›ÛQ˜¹é«vóèîOwÞG‹¯]µ¹íT£WÙBySX70æ‹ÆÏùóÊÍ´¶‡…Á‰*yÓ0mÇB[w·³`…|”b±ÖÖYºwêx«åDI0§Bæòûh7 µE»,wU¤wxÂ6b¼Æ\æÈ_Àás•6&ëvÚ²¨Ý»v·äà£ÿD3‹’CjsšI™Qh×hұ̷ÜZÑjt•%ЗUµõöW†n8o‘[ö6B$ìÊÙ”¹W±!¤1¾3Íz¨e²6³öÝ'•gIØG a_£±hÔ”ï° ï»Âãc·]è2§¨ôÇ%Ù;ø'÷m¤-íRÛPǽ&›¨íÚ}_,PÂìþ¼Ä4ˆfbë-SµýÇçâ1Óexf¿ŸŠ†#¾,)Wƒ†ShsRT+ýbýYãuMAžŸ÷]à+ଶ3î™sváµ!çÈ æ+n­Â8äÂB2hìW$ÁjŒíŠíÖ¾-ÐWtÆr´¾å˜ý tÁÑýÖòTÐA“ÿ›[xæmR'®²©˜Å£¾õ@#øÿ‚žîñm ¦—9ÛiŸ¬â~^øþeG¥Bq2¼-5‹šn!ÍÇba"Jfë ÁôO¿x v™9¿ŠÇþ0™è©´ÿqCqnQŸ šl]^Ĥ9Ú°öZUmûúu ‹Ñ7²%hÖÝ*œƒ r=ÃHѳ©Ã`!ç+÷ÿ.Fg„‰¬@Îô½þžn®””Ri^f^j)¦ØÚd³µ¦Ör8¤uóÛ^'s˜þ·1㌡Bêh£Î!™‰ô;‡]sLx¯­½ø¹e[EMçÑëmçÅhòaÍ©ö½À<¸úñg<ô+ÛÒ+vôA9ä’FÉŒº8©¡²ªÔT›fâ¢!PS\)f†·Ïü›ÃªhµÊp€ˆª0k²jP(ìbþüÍ&4¹þpæ:Ç’Ž‡6úµ¿ 3 ‘äàACtQ’•Ä«ªÐXRÁ<ÊcçÀ?êy°ÚªuV£ ˜»0M¥‚i³ù^¼”mA®ºE›–Μº¼ï\UéG·ø§³ÚPjˆÓ5zMŒÖ ú²/§hÕËCÕ‰º3?^¾ô=}ñýŠ8œú‹ûü!tvm¦á hR¶«l!ÛaìWø1:‰c¦!aëB.ˆý¢–_q»Ö ëY<ÑàRIΛžŸÜc0éWuÁÐXç›Wx„wû._8Ì6Ç7F)TqÑÑ qö§£ãØAQ—#Ähíoyôïc¢tðáP¥™G;øsüÝúÑzTÎ"êÓ“ÎÕ¯ø5WŸSòn|‰“Û`Û×¹¿1¨<¼a‡\¹5ãý Ž°vlÛÀ¸ÝÐýC‚'½@Žë~ýâçc÷3ä¡×Üz†`ÿ¾Í‚=+Ó”$@n×Òÿo¥j›0m¨À;n‰…$Á¢±¾Ç®ØÍCFj|Ô÷S+rûî;äÊáDìÏn¹Yu$¶Kwz¡ÌÇšO4v¹?YÑ ×ûƒBáݸÝÊ€€DR+ÄI¼ÕŽf˜…×ì)¶Ñ¯¡ú[DSW£¿³mï«ëæÓ ³1…%>sñD˜-ñíéu` Âìãd‰mÛ÷ÑϺS«+E9{ø'á¿å¥Çsž_y|‡°¼’Ù±24I8­Õ}‰gbL) ¦csKTs ·ärÕº!2‰(Žÿ2An¤ÂTµYð¬µBé§Äè¡°èé€ ZHÏÐj³²rrõŠ¢"ÇîûÞñç!²2¶!¡Mq8ûTÖ©ÌjM}JéAs„0s= ›±73ÎjJuEC3K2ÇÐ)UΑ™¥¦¶ ¨¬¢°°ko¯ÆLHrí¾z™‡žDkBCDkXñòÊØÂw*`€iièºÇ! ŠâôS14SÕ´HìÝìhaèÇkè61útH~'¡µJZ· |â4 w7ÑØé†êÌåöKW¸åz¹",lÜ©áP3ý¼S9w½È`A†³s¶¯ñ^˜Û}–C_Òxºƒ½ë ™Ããi4ø‚¼7¼)ñXöQ8 ý M·$ýB šò¢ !ôÌæY:¢6 °‹ê­­BˆÕi‹ ˜±t@-yìѪt»Ã£!ÌñRè#Ýߊ<0r/J=¤)8d(®F¯£î¦Síå펷E”&´J…^é°hÒV€XÈÔióÔp!™öSž]7ø®xpºÍÖp¬Àä° Òha_H9ìºu•1DÒ3µ9šì7q¾»²’wM>䳨 ‚+@³RÑéØÝuº²´uEh@›«NpŸ*rŒ$Õ ÆY ù@| Ú ›P¡-@,þѽ0#?ÓF((+(}„ZÝÿ‰[ 2 ÔFg„üÒ‚RRdG°Ü\õ¥ "Ào’*ú‘Í©„B00–60‘£whurÍ&vݵÚò4ç í·1ak´/Œ‹ƒ” áÞvÚKR•*.95&°+ô4÷è~¯ñZ-,v/³Ô»d \DjþœÃ^-„‘‡°štêƒ8Ë]šP/xW£è²¢z Þ[NÛ‡_a.rq¹Vå2’î´ Îåô`Ìÿmƒ’Æ endstream endobj 88 0 obj <> stream xÚ%MLӆۭΊsþ1~"t%HÆÄD2üIt‚A(8¢`u…±FÇÜ€ ð!ƒc.CH`1°`<E êAbBÄ‹zá&ŒMkzÐ /Oò~‡7Ïû¡†!(Šî+*»QTr帮øz‘6v8ˈ)XëŸÎ]ÂDHA…T‰@H…DŒØ¼Œý•KRù}0Æûcü~ Æ´($ƒ‡ Eq«£W£9©ÖhrulƒÝRk`82³:‹<¡Õæe“¹–iQéjƒ^èÆí¾Žqb<±Ï”ïõ€o(ì_œqÍ.‡BããáðÀ‡ëŒ*¸vGŒsTÞ¯ëí‚f\¿È.m/ðFà"Ú ¯§«¹ÃÀæëàìŸQAht~(è±ÄKaÿX) tPQÕhì|y÷ u`±Ù馭\¸Ó ƒÄ8€Û|Z˜|b¤³^Í]}.\!<þ¯ÎK7øÉ ©àçg•Û¥ŸrÄÃb¢˜&S¿½°Å'ðñ|:ŸFˆ^ѧdªBßT üЬ…W_Í?üùSÃ%0÷DYe¡ñæ-#¸‚ߊö&ÌñºÊË?Hy¿pT¹)›ô‚¬ZT§eÑyn<wò¤ÓÛB4@»Õå¨5I§dŽv°;G`BõEvQŒ@_·Z“+çn¿û¹Â§xÐC8c?ic (}à펇 =\a :/ÏõOe"åÝ=·¾wzP.'â°¼€| ÿ*T endstream endobj 16 0 obj <> stream xÚµZ[o7}ï¯à[–x¿E€øîÔ·ÚNì$̓j«‰€$6l¹È÷ï¿3ä®–»K)›¤‚ ].Éž99+ Ã8“– ˜LYÜ 3Â1å™5†iÁµ±À5Cu°ŽIÇWœi…{PLI&„!i&¤ÐLÜcJ£ÚUð 7jÑ|`Ú0a%Z¡sËt`R ËŒdRãÙh&}‹$îž)³œ)­³PQo SΣí>8æÐ ïÐÉ @ÁÈ*Î\ »gÑR9æ pÃ<ŒuÐë3 ¤ÀcœÅ ÌÐH €Á$²€RÖÀ¬ÕÌZA¤1KˆaœõÈhR=æÉÏ0FMŠ9Ë=…Îɸ{<@¥çÒ3»ð ›sæ%´€U¯Cp³œ`w§hÚ$ó^c* ó@ó0Gw¨‡NAs|ž£Â Jà6 †I4>šá*ŠŒÓUpª6˜ÎßïÞ~™Ó „ÃÛÎÆ»’™T?© ë&*cHŒИ ¤1•QK¨ÖTDŠÏŸOïo¯Ï§ówãÓíÝñÅôë||ðyòaº•n›évðþùó_2x‹¡ #æãHš€.ŽzpMH*jšŠT44 ©h‰þ¶Ùp–ºäi.R1Ð,ü„E™®…q™MµúÌâÌN —¾gŒá§0­´´ ´0<Š’Üí¿˜ïlô ÓÂkÄk'£¼1¹™’·UоÐÙôáöñþzú€]üïn:>E\î§_æ©©~ ÈñøðND¸=qi—ˆ«¶¸4Eq%†‰+ž‰/z? Ã#zËè?f7©¦ª8ð@³UÙlå—ˆëŽxyt-†‰ëï7[Å ¡w…¤­úÆ®‰kÚºãS2x|4½™M6o¿¾#–ö¡ +u[÷ÓÉüöþ »˜^±ÛÇùÝ#°p¡F\„ýMhÁŸ’;Þ<^OïŸÜü;»»ùçóWö×tâ\Iÿ×Ó§IÉìöËöd>}²ýÉs-, óðŒ«_9ÿõi/"¯Œ¶lMæ“O·ÐüÎFÏú¹r889JšŒ¥Ò²kYƒ×!¶ù¨Å£'‘ê¸Å]6>é¹¼ç#œ œÑži݈öã0¢YsÖ'%* – s^ŽôRØF[(¡~Û}¼c‰0D‚Kµµi&P}z ÊU­M?@4d†Žòºéå|K /„4ïy§=Áϯ«¸vj™A8±äÀkÆ1pX­L”LµT#=ãÐQA½2*ÎòR©l¢ÛÇù‚EFè•VÔíÝûÏ}ºZÊÏùµÝ+–½''0ÆP¿xõJE¬ôðoàX´;çÀŒWå=œ-];-Q{*'éeßô‘™l­©ÎäÜC›“sã¬"Ç Yœí刻zäb?eÅHTróœj“¶$m‰öWÚLneŸPÉ‚¦.Éi­±üò²â‘ÕEŠT+»ãÕ,z§È\F”€D}‘ϼ5aMåt­Pp:€óÅÑD[9xÁô§Óµ ‚¦™ˆo}œNå„©ˆNÓSî… §r¿„¸‘*/šXÜŽ¾Í“â4Éi,ÕÏ2¹¸pUÌ“•L´RÕÉJ¤QÔ¦HŠô¥0bâ’i»äŠ¥aôèG·›,ühÒ¢2æ\–óÖ\æî´mDÖKÛÚ ŒädÝk |ž1hK´‘9*Î1‹@í Û¹a~âZ |¨Tùc­]àXU÷sºûóÀ½£0 ëøH„ɪ`ˆ1EŒ(„j§[€®¯´ëäÎÁªz¢pWq?P" „ímêéEQï«â¨ª\XcÕî)x h!òä|jðéT¡håyz÷²UªžõÊ¥À'‘>G+®ŸJÁPL©¤\=½B"ˆÚÄ«¦EݲxÐßøúbvÿ0ßú8¹gBŽ'‹²oN¦Qü`gëíÞ³­£Í+ô¡ªíéÃõýì(½‘/?Z#6íÈïö§³‘ñz;~ñpMÙ² zL}¨¼!ðp€drvýâˇOSÆÇçóéç×ÔÆ»Ÿ&è ‡†GÍ›”oÅ6¤HFþ>¶íÎ>MÉ.TO>OÛè;8—0ã:ÌhŸ1#BÃÌËÝÃÃý}è>ëøpbÔwcMÅ‹Í(AN) Þ÷ñmFrÔà ]BlNˆkùótoûì ª/. ŒˆÁŒ±`Å#RÊáŒô+X Õä„Þ&¤…z5#·¯¾Ì®oo¦X²QIE‘‘ÝÕ$òÕ”Q´ÿæêÏÓÃÈ>ï1$׿3¡Àæä31©é-#£Úå°9Ñ+ã‹hÙÛÞ»Ü>"ú ”¨ÿš’ $é\×¼øŠ—Çe*b{Ę61-ôرfL_$o˜9|qy¼w ÝG%fôZ™q²ÈŒ¬]F÷âŒqmfZè‡1ã»F5ÌÙ³s|rrö’¼Ñ÷h1ëZCΖ⮭ q¼GHh’¡D‡å:œÎãnæ([§'§[{‘ê>!v½~R\AR×+Hôh±¢MK~/Ý`Ë3Z¸ÍbíÑîÛcZ›ço ëÇý/|Á _N‰æEJÛ6R‚<εv$Û¶9ð¡;’ÕùŽdÍr’Læ:oÎ/°ïÅ¡ú®ã×F‘-FlH~ÕÞ€¢Ð¢¨s®ËqfȵêFŸÅa”Ÿ\žìÑP;W7|æßb¨4ÚM\QÑ´¡ÿOÈ9HÓB<7e0492b2c59c3990526f6040dd441244>]/Size 110/W[1 2 2]/Filter/FlateDecode/Length 289>> stream xÚ-ÎÉ.CaÅñïÔÔkj¹fWѪ±Æª™jÖU%6â¬l ‘Ø#"Äð öxIcaã)Ô=9wóËÿÜáËgŒÉå|&h‚$@ I”t.ÒCzI?$q’ £0cXÙmU'“dš$ÉY ‹°²úÄO–É*ì½ð‘b²'¬gy¤K3Ÿ”"æhrb‘2R¸÷o%R•ô·{ÝLZ³ ›Gªjì«jpUÕâd_U‡ÓOU=ίÜ.5pùâÎëÍFÜÚ*w~UîÏT!<ܸ?zÇ7ãÉ»U žwU­xýS…ñ–PEðñ®jÃ×–ªt’n#}d€ ‘a2BÆÈ™"3d–Ì“Y"+dlà7dÌ?(œ/M endstream endobj startxref 59422 %%EOF glpk-5.0/doc/cnfsat.tex0000644000062000006210000003311413766346220014251 0ustar maomkpasswd%* cnfsat.tex *% \documentclass[11pt,draft]{article} \usepackage{amssymb} \usepackage{indentfirst} \setlength{\textwidth}{6.5in} \setlength{\textheight}{8.5in} \setlength{\oddsidemargin}{0in} \setlength{\topmargin}{0in} \setlength{\headheight}{0in} \setlength{\headsep}{0in} \setlength{\footskip}{0.5in} \setlength{\parindent}{16pt} \setlength{\parskip}{5pt} \setlength{\topsep}{0pt} \setlength{\partopsep}{0pt} \setlength{\itemsep}{\parskip} \setlength{\parsep}{0pt} \setlength{\leftmargini}{\parindent} \renewcommand{\labelitemi}{---} \def\para#1{\noindent{\bf#1}} \def\synopsis{\para{Synopsis}} \def\description{\para{Description}} \def\returns{\para{Returns}} \newenvironment{retlist} { \def\arraystretch{1.5} \noindent \begin{tabular}{@{}p{1in}@{}p{5.5in}@{}} } {\end{tabular}} \begin{document} \title{\bf CNF Satisfiability Problem} \author{Andrew Makhorin {\tt}} \date{August 2011} \maketitle \section{Introduction} The {\it Satisfiability Problem (SAT)} is a classic combinatorial problem. Given a Boolean formula of $n$ variables $$f(x_1,x_2,\dots,x_n),\eqno(1.1)$$ this problem is to find such values of the variables, on which the formula takes on the value {\it true}. The {\it CNF Satisfiability Problem (CNF-SAT)} is a version of the Satisfiability Problem, where the Boolean formula (1.1) is specified in the {\it Conjunctive Normal Form (CNF)}, that means that it is a conjunction of {\it clauses}, where a clause is a disjunction of {\it literals}, and a literal is a variable or its negation. For example: $$(x_1\vee x_2)\;\&\;(\neg x_2\vee x_3\vee\neg x_4)\;\&\;(\neg x_1\vee x_4).\eqno(1.2)$$ Here $x_1$, $x_2$, $x_3$, $x_4$ are Boolean variables to be assigned, $\neg$ means negation (logical {\it not}), $\vee$ means disjunction (logical {\it or}), and $\&$ means conjunction (logical {\it and}). One may note that the formula (1.2) is {\it satisfiable}, because on $x_1$ = {\it true}, $x_2$ = {\it false}, $x_3$ = {\it false}, and $x_4$ = {\it true} it takes on the value {\it true}. If a formula is not satisfiable, it is called {\it unsatisfiable}, that means that it takes on the value {\it false} on any values of its variables. Any CNF-SAT problem can be easily translated to a 0-1 programming problem as follows.\linebreak A Boolean variable $x$ can be modeled by a binary variable in a natural way: $x=1$ means that $x$ takes on the value {\it true}, and $x=0$ means that $x$ takes on the value {\it false}. Then, if a literal is a negated variable, i.e. $t=\neg x$, it can be expressed as $t=1-x$. Since a formula in CNF is a conjunction of clauses, to provide its satisfiability we should require all its clauses to take on the value {\it true}. A particular clause is a disjunction of literals: $$t\vee t'\vee t''\dots ,\eqno(1.3)$$ so it takes on the value {\it true} iff at least one of its literals takes on the value {\it true}, that can be expressed as the following inequality constraint: $$t+t'+t''+\dots\geq 1.\eqno(1.4)$$ Note that no objective function is used in this case, because only a feasible solution needs to be found. For example, the formula (1.2) can be translated to the following constraints: $$\begin{array}{c@{\ }c@{\ }c@{\ }c@{\ }c@{\ }c@{\ }c@{\ }c@{\ }c} x_1&+&x_2&&&&&\geq&1\\ &&(1-x_2)&+&x_3&+&(1-x_4)&\geq&1\\ (1-x_1)&&&&&+&x_4&\geq&1\\ \end{array}$$ $$x_1, x_2, x_3, x_4\in\{0,1\}$$ Carrying out all constant terms to the right-hand side gives corresponding 0-1 programming problem in the standard format: $$\begin{array}{r@{\ }c@{\ }c@{\ }c@{\ }c@{\ }c@{\ }c@{\ }c@{\ }r} x_1&+&x_2&&&&&\geq&1\\ &-&x_2&+&x_3&-&x_4&\geq&-1\\ -x_1&&&&&+&x_4&\geq&0\\ \end{array}$$ $$x_1, x_2, x_3, x_4\in\{0,1\}$$ In general case translation of a CNF-SAT problem results in the following 0-1 programming problem: $$\sum_{j\in J^+_i}x_j-\sum_{j\in J^-_i}x_j\geq 1-|J^-_i|, \ \ \ i=1,\dots,m\eqno(1.5)$$ $$x_j\in\{0,1\},\ \ \ j=1,\dots,n\eqno(1.6)$$ where $n$ is the number of variables, $m$ is the number of clauses (inequality constraints),\linebreak $J^+_i\subseteq\{1,\dots,n\}$ is a subset of variables, whose literals in $i$-th clause do not have negation, and $J^-_i\subseteq\{1,\dots,n\}$ is a subset of variables, whose literals in $i$-th clause are negations of that variables. It is assumed that $J^+_i\cap J^-_i=\varnothing$ for all $i$. \section{GLPK API Routines} \subsection{glp\_read\_cnfsat --- read CNF-SAT problem data in DIMACS format} \synopsis \begin{verbatim} int glp_read_cnfsat(glp_prob *P, const char *fname); \end{verbatim} \description The routine \verb|glp_read_cnfsat| reads the CNF-SAT problem data from a text file in DIMACS format and automatically translates the data to corresponding 0-1 programming problem instance (1.5)--(1.6). The parameter \verb|P| specifies the problem object, to which the 0-1 programming problem instance should be stored. Note that before reading data the current content of the problem object is completely erased with the routine \verb|glp_erase_prob|. The character string \verb|fname| specifies the name of a text file to be read in. (If the file name ends with the suffix `\verb|.gz|', the file is assumed to be compressed, in which case the routine decompresses it ``on the fly''.) \newpage \returns If the operation was successful, the routine returns zero. Otherwise, it prints an error message and returns non-zero. \para{DIMACS CNF-SAT problem format}\footnote{This material is based on the paper ``Satisfiability Suggested Format'', which is publicly available at {\tt http://dimacs.rutgers.edu/}.} The DIMACS input file is a plain ASCII text file. It contains lines of several types described below. A line is terminated with an end-of-line character. Fields in each line are separated by at least one blank space. \para{Comment lines.} Comment lines give human-readable information about the file and are ignored by programs. Comment lines can appear anywhere in the file. Each comment line begins with a lower-case character \verb|c|. \begin{verbatim} c This is a comment line \end{verbatim} \para{Problem line.} There is one problem line per data file. The problem line must appear before any clause lines. It has the following format: \begin{verbatim} p cnf VARIABLES CLAUSES \end{verbatim} \noindent The lower-case character \verb|p| signifies that this is a problem line. The three character problem designator \verb|cnf| identifies the file as containing specification information for the CNF-SAT problem. The \verb|VARIABLES| field contains an integer value specifying $n$, the number of variables in the instance. The \verb|CLAUSES| field contains an integer value specifying $m$, the number of clauses in the instance. \para{Clauses.} The clauses appear immediately after the problem line. The variables are assumed to be numbered from 1 up to $n$. It is not necessary that every variable appears in the instance. Each clause is represented by a sequence of numbers separated by either a space, tab, or new-line character. The non-negated version of a variable $j$ is represented by $j$; the negated version is represented by $-j$. Each clause is terminated by the value 0. Unlike many formats that represent the end of a clause by a new-line character, this format allows clauses to be on multiple lines. \para{Example.} Below here is an example of the data file in DIMACS format corresponding to the CNF-SAT problem (1.2). \begin{footnotesize} \begin{verbatim} c sample.cnf c c This is an example of the CNF-SAT problem data c in DIMACS format. c p cnf 4 3 1 2 0 -4 3 -2 0 -1 4 0 c c eof \end{verbatim} \end{footnotesize} \newpage \subsection{glp\_check\_cnfsat --- check for CNF-SAT problem instance} \synopsis \begin{verbatim} int glp_check_cnfsat(glp\_prob *P); \end{verbatim} \description The routine \verb|glp_check_cnfsat| checks if the specified problem object \verb|P| contains a 0-1 programming problem instance in the format (1.5)--(1.6) and therefore encodes a CNF-SAT problem instance. \returns If the specified problem object has the format (1.5)--(1.6), the routine returns zero, otherwise non-zero. \subsection{glp\_write\_cnfsat --- write CNF-SAT problem data in DIMACS format} \synopsis \begin{verbatim} int glp_write_cnfsat(glp_prob *P, const char *fname); \end{verbatim} \description The routine \verb|glp_write_cnfsat| automatically translates the specified 0-1 programming problem instance (1.5)--(1.6) to a CNF-SAT problem instance and writes the problem data to a text file in DIMACS format. The parameter \verb|P| is the problem object, which should specify a 0-1 programming problem instance in the format (1.5)--(1.6). The character string \verb|fname| specifies a name of the output text file to be written. (If the file name ends with suffix `\verb|.gz|', the file is assumed to be compressed, in which case the routine performs automatic compression on writing that file.) \returns If the operation was successful, the routine returns zero. Otherwise, it prints an error message and returns non-zero. \subsection{glp\_minisat1 --- solve CNF-SAT problem instance with MiniSat solver} \synopsis \begin{verbatim} int glp_minisat1(glp_prob *P); \end{verbatim} \description The routine \verb|glp_minisat1| is a driver to MiniSat, a CNF-SAT solver developed by Niklas E\'en and Niklas S\"orensson, Chalmers University of Technology, Sweden.\footnote{The MiniSat software module is {\it not} part of GLPK, but is used with GLPK and included in the distribution.} \newpage It is assumed that the specified problem object \verb|P| contains a 0-1 programming problem instance in the format (1.5)--(1.6) and therefore encodes a CNF-SAT problem instance. If the problem instance has been successfully solved to the end, the routine \verb|glp_minisat1| returns 0. In this case the routine \verb|glp_mip_status| can be used to determine the solution status: \begin{itemize} \item {\tt GLP\_OPT} means that the solver found an integer feasible solution and therefore the corresponding CNF-SAT instance is satisfiable; \item {\tt GLP\_NOFEAS} means that no integer feasible solution exists and therefore the corresponding CNF-SAT instance is unsatisfiable. \end{itemize} If an integer feasible solution was found, corresponding values of binary variables can be retrieved with the routine \verb|glp_mip_col_val|. \returns \begin{retlist} 0 & The MIP problem instance has been successfully solved. (This code does {\it not} necessarily mean that the solver has found feasible solution. It only means that the solution process was successful.)\\ {\tt GLP\_EDATA} & The specified problem object contains a MIP instance which does {\it not} have the format (1.5)--(1.6).\\ {\tt GLP\_EFAIL} & The solution process was unsuccessful because of the solver failure.\\ \end{retlist} \subsection{glp\_intfeas1 --- solve integer feasibility problem} \synopsis \begin{verbatim} int glp_intfeas1(glp_prob *P, int use_bound, int obj_bound); \end{verbatim} \description The routine \verb|glp_intfeas1| is a tentative implementation of an integer feasibility solver based on a CNF-SAT solver (currently it is MiniSat; see Subsection 2.4). If the parameter \verb|use_bound| is zero, the routine searches for {\it any} integer feasibile solution to the specified integer programming problem. Note that in this case the objective function is ignored. If the parameter \verb|use_bound| is non-zero, the routine searches for an integer feasible solution, which provides a value of the objective function not worse than \verb|obj_bound|. In other word, the parameter \verb|obj_bound| specifies an upper (in case of minimization) or lower (in case of maximization) bound to the objective function. If the specified problem has been successfully solved to the end, the routine \verb|glp_intfeas1| returns 0. In this case the routine \verb|glp_mip_status| can be used to determine the solution status: \begin{itemize} \item {\tt GLP\_FEAS} means that the solver found an integer feasible solution; \item {\tt GLP\_NOFEAS} means that the problem has no integer feasible solution (if {\tt use\_bound} is zero) or it has no integer feasible solution, which is not worse than {\tt obj\_bound} (if {\tt use\_bound} is non-zero). \end{itemize} \newpage If an integer feasible solution was found, corresponding values of variables (columns) can be retrieved with the routine \verb|glp_mip_col_val|. \para{Usage Notes} The integer programming problem specified by the parameter \verb|P| should satisfy to the following requirements: \begin{enumerate} \item All variables (columns) should be either binary ({\tt GLP\_BV}) or fixed at integer values ({\tt GLP\_FX}). \item All constraint and objective coefficients should be integer numbers in the range\linebreak $[-2^{31},\ +2^{31}-1]$. \end{enumerate} Though there are no special requirements to the constraints, currently the routine \verb|glp_intfeas1| is efficient mainly for problems, where most constraints (rows) fall into the following three classes: \begin{enumerate} \item Covering inequalities $$\sum_{j}t_j\geq 1,$$ where $t_j=x_j$ or $t_j=1-x_j$, $x_j$ is a binary variable. \item Packing inequalities $$\sum_{j}t_j\leq 1.$$ \item Partitioning equalities (SOS1 constraints) $$\sum_{j}t_j=1.$$ \end{enumerate} \returns \begin{retlist} 0 & The problem has been successfully solved. (This code does {\it not} necessarily mean that the solver has found an integer feasible solution. It only means that the solution process was successful.) \\ {\tt GLP\_EDATA} & The specified problem object does not satisfy to the requirements listed in Paragraph `Usage Notes'. \\ {\tt GLP\_ERANGE} & An integer overflow occured on translating the specified problem to a CNF-SAT problem. \\ {\tt GLP\_EFAIL} & The solution process was unsuccessful because of the solver failure. \\ \end{retlist} \end{document} glpk-5.0/doc/glpk.pdf0000666000062000006210000170323513766346220013716 0ustar maomkpasswd%PDF-1.5 %äðíø 8 0 obj <> stream xÚePËNÃ0¼ó{´Þz½±ã\´R¨ ” åŠ[E"©ðÿlœ"UBöÁž™ |•CP:¹ÜÖ0›aå=ÔGöK¨ß_ÔF¿ÖKàŠ1F™ŒÐ:C÷õ¤tà,†À£2F´ †BTeîâa§ ‡ ÖmŸÍV Ó;œOCÓumR­Úïì;›3P‰Žr–è°ãKÉ–ýžÒ1 ©?$«MÓÿ4YgÈ!Ü=gîñ¬]Èû„¹XoWÓëY;¯ÒðÕžûpÊ£½l.€ ä"Œ›¼øÚn¯îÒ!uoÚ¸Rô¢wgÝë‹üºDC]:²Å8…_þïrõ×åãÍ/p«b¢ endstream endobj 14 0 obj <> stream xÚ}TË’Ó0¼ó:ÊUXÑÃòƒË#°P¡0\€ƒb+¶ÙIJÌÖþ=’GY’¢’ƒ<Ýš™žýB Q÷c(ãîOQu@/J´ZKÄ()hʃc™J"*ëo¸lu !ð›ÛÍ{8Uñ ßERbÕÌ0Çݸ€ÆúS‚‡Dì)ÃÇ/€lÌÅîòO]®Ñ{­F]qêkm]N°ÒÍRbIìò‘èGùÎwÌr"ÅÜðËáè»{0]ÓF<Çv¦È„ð œjŽ­Öé™ìX*P¼P¾S&ë|8,!Rº‚žÂ)¥1§œB;ë(NHûyØYßǽïA™0%Çáxpú”í†þ)ßöèˆÝسâ\ÌÍdÛÁ<‹â$IðM_}é?¨;tý!Lp’óÐc{EƒEàƒž7½ïs"ƒi®dK)²ÀîþŸ,ˆàTúYŸ©ØøÚºqtªç½73‘)nŒrõSl½ù°UðÑOÕ *ÉS\w£5Ýv²ÚS2¬úz5 Ü57éºÛ=@À¶K‰ j:èYª…pØ2àêpp]ŽÜoÙ‚-K&¼ù^¬2£`(˜N üêßJ³ÍÀ¼í*ÝÚ{Î$þêei3ž`F¼ ÁV=ÈŸï•Õ!þ†ù÷æqÚî»±_÷¸]®¹3¼=ÛtO»y¡oÞåÓž‚±¯ËËolö:Í2’ðV,äOOþô! endstream endobj 54 0 obj <> stream xÚí[[sÛ¸~ï¯à#õ`”¸›íN:éLvë>5} %Úf#‘ZJÞd;ûã÷€¸êr;Î¥šx"A>ø…ï;€tñK‹ þáBø©Šå¦xu[üù/² ÉZ·÷ðëU!!ŠÛÕ?Ëï‡~ßöûÝâ_·»ºÀR•²v‚!Š';¼¸Q„—¯ûÅå~7ðºzZŸæþpk=ÿü£}3>ß1&IZÜ`Î’² ÓõL;‰G“°@TÀQ#NÌÕ ¸\R¾y WBi¹‡»u»YÜðZ”^ªêúrú2Ï?`Š ÎV=Ÿ©š JZ¦ˆeêo¯©’_Yù¯8âÁ»ƒõ®²IR NÔ’ô]×?šö­~ÃÊm³\Y¾_pQ6ð¡’øJÑ¥E«¦ˆaÄ öH¥vqD§œ‡+_]{o¸i?6›í8aÀЕŒL2âuÍ'ƒ$±'ƒX2¾6Ûn=E Ãòÿ=ƒ1¥žÇH´¸4›*žjyÓõï'>jò¢ßú[ ”h…ÏÓrÔ0Q!iÒ1ã«f×-!YÕ´üîíkóæçáißõíî’Æ‘sÃyp€Yn©#’!bâøÎñǶoÇfmŠÝºX"Ê_¤.Û^ÿ¯ÛhHÖ×¼š-—°Îä¸(®%ª‰#ǹ7ÝÝØŒ¿™2÷Ø6«v„Ž‘ó+ iŠæÓ@+È¡>F|yûa‡Ñ’Ðô+Sè$Ä𵦥hˆVô0lŒC4¸švû8BvÍ}»×9£üÚddÖöBHXˆ f ùn]1¦EÊ®_µ§Øµº6i*ªæ—qÊ`›ëbÃ+¼u§ ºŒwpI¢üw»Ü¤þ&WûY ŽyvÀ@§Æ]À_Ï#ž …µÝfÉxbR\«ù a=/ AÀׇНæºß¡€uír³ k‹E6!5A"D…«ë¯§mǾ»a¼Ù.`{SùÌ–šø7š žÁAXN,³9P°›ÅžWÊíÁôQH&®!‘MGXÙ :l9g•BRX:è¹r¾„¦wo¤Y Ûóñf€@©ËUwÿ›?­Ý‘ÀTüÛ\åhÁp+zF¨»‡G¢3ä‡õÖ!üR ªêâC¡0âÂÌÀ¸ØŠ¡šùñºø{ñÓ©›ÈȺ™XkOÐ1a¨Â<&‘:…[Yú’aý÷H'íÑÝ%-™©ä¶$B}ý«p¨@µ4ß ÌIfIÀŒnv°A=ῪQ­"lŒ¡;)ðØÊ¢OüŸÀS¦Q"x*‘¢IøÈÊÂ÷ͦä‰g·ëzóÑ»rºöØôí»…©Ñ’3³…ä_œtÂ7¼@:¼B,dš!˜AâìaÆ é7³ÒqØ^³à±•Ew áLvªõÑeä‚Â÷I^le]ɇžÊGÊ'Ú´v¿jqµæóû§Þ<^1Í4°õ¹½Rö¾õ¢ ßëÑŠTÈ7,C40CÆùÆŒ¢ nfEã°½fÁc+‹žwáä0ï"²².VÝx ý…>-˜í¾Ûtÿi‚8`zëµÂÊwæ>§ìs&œðõ°ÊÖŽ”ˆ‡„Ã3´3hœpÌ8¡à¦Y­N‰ÅT?P°±îY“ౕEÑv†9—Vö(·o?¸ö5˜Ñr?œô2Gg[\Ñ/¼Q Kpù@i‡È _Uº¨òÍ8A~p3K¾Ãö´Î‚+¾Ö»ÃR°²[K<Ó&O›þÓ¼õ°ŠÒ/Žéð}ó™ætk!Ìeši=ƒEanÇóLGnæJ„ÇvÉ<¶a~¦+­ôYQäB¥’"+ñ̶Â]Ò40³%Å_Å.'VGöó9ך'©:CRXê$eÆ I7³’rØ^,³àÁÊ£Cf8Óp„yŒNb$‰î­<úÅr2‰*îE‰"_¸Œ"EäËš32“Ê‘nçâÌdÆ 7³2rØ^ ³à±•ÌÌLÞƒË9ó"+ëá®_íò›×ƒ´t7ä OB]©¯é(&J¾ºwTM§q•>hžW̨â$eÆ u7³êrØ^7³à±ÉHRÝ¥ŸyôÈÊ¢_¦¬8C‹ÊÏñäß3‰g+Š—AP8-(˜ âteÆ Ay/³zrÐ^)³Ø±U·Óì:á!²ª­`A²tÏOŸÕÕÁñp}>#ÜùÌÒ܆ha·-–]¸—ªwè£ëîûݾ‰³oGèë ¯ÿ÷ù(!_<DÃzHZ=0‚;¨ÇŒê nfåã°½0fÁc+‹¾iΠƒâ ×ŵL‚GVü rýînzáŒívÝ,½j´µpÖÃýÑßTL›.–\üØ}„.—-d‘H¶rjŽTM &ÈH7Ó0!ïcV5ØËa96RIÉ8d§…YäÈHùÚx¦x±S­Ä•k°™ÉJ…ž‘ õR!Ï{ó tçKD)ýê5ÂÒ$N.fœPIp³šsÇ91cØH‘B­˜Ï.ÓªG·†&ç€õÃú“\†°g5Ù°èÉþ“ i ”' nuàÓ çét–ú!üÇÖþéÙi?€5wÞ¾¹ÌIÂC02.VOÛÃÛÈSKÙNžßÛ{0ƒ=—Ûu·´w™YÙ®[÷¨ÈÎ=j+¶wía˜JÎ^†SOO>¡Ð¬ó(HEšS˜A£ µã«ÁÍn÷gÏ\e Ž1|£$zlÅ?¤ÔxœÞÓF+óAˆŠãÅÁŸqÇs•ýü²`°ÏüÊ4¿TAªôNûÞǪ=³¬ ÑЬk°L;|æ> ÓÞZ÷ÜÇá”ûqؤî¡ÔJ|Ù' uiº ô,z‡$¤Ôm‘žå“ÀOúDÉ’û endstream endobj 105 0 obj <> stream xÚíœKsÛ8Çïû)t[ù`,ñ&¯©Úݪ­=Ì#·=0í0kIŠJ2©ùð nY49[™©™* qãßú‡Æ“\üº ‹ÊüGš™ÿ«Åj³xõzñ·È­HS5‹×7 A‰‹kûjñzýŸ%#œÐúêZ ±¼½»¿úïë-þþzñë‚ð¦^|X4”H5UÐj±Y4‚Ô"ï?/~<õ6ÞǺ»;Ñ¥UCaJÑa°ñ«ÝÝþêšs¾üÝý0žº±³Ÿ…ýåa³õ¿¿v÷é~ؽ¹ë6Îf÷æêZÊå»n5^] Y/‰)WÕ×ýá›ÂÅê§úÃíL´¤&æ—€ê¶æí£!f‚H !n²!68…»b:Äàcµ»¿bõò·Ó8Smu¢:e‘uFy}µ£HO•qhJ •» *Tg»½bz9vîÇÕ5Óük…X4Í? ¥, ?¯I=œUÙðsMjÔÃ]1~ðÑ í¾›‰}CiÊMF;Eñ“Ø;oS> ¼ŒG¯màuE¿Iÿ܈£èG\R¢ Ã3š¸© P‡wÅtÄÁ‡Ï´'!gœp Ú”)¢râÈH=ÒÝqbOtöZ>Cx¿lèQó¡§ŠpI% ]\™á‚±å¸•†núî}¿½uM8ìc¿íÌਙxaMöÌíÚR•v=]›y‰o~b:¥éžgì%êy®˜îyÑÅm7Î$ÚŠTt)åÓ ›FF:݉4—¤¦Hš7S3¥¥ÁÈIoÛMçFêß=€H›»“!\xûº¾(r€‚bpF˜Œä°<9¦B%WL“>Rèá@ERyé0ôÎ fžÏ>gD59}0òú 8 <èhôïßÛ¹¡ëæ°5ÿbf“•ªøK£¡PŒ­LçŒøð<>¶ÂÑ2Îs˸à#…Od$•±Q]†OÔ÷d¤õ‘‘Ó_÷CŽžû±ßôŸZ ÅÔé8¿TT¶vø”üå-#å蘹9‡Ô# Ø15(Ê=¾œ¡Ü$ñ Ú¤8¶òêÓDÿ°™¿Ì¢±3·¦2ëYyÃÎ.">ì3 …?ÄØ¾±+M³Zñ„Ýø*;›œ¬Ž®Ù%o™rÎL_l"f²3n7y€²©˜,úH2æ…#<)elÔ”ä9IydÔme%fH[ËMŠ,Øñò2ˆ8t1PBÙŸ(U@”©Ápârå Sà& UÐŽÀ$ű•€´¢—f¸¢„iìÁ€&³>¶Ås§ðG8Î&û†ë/¶åõl|!VÊSU¤KÐ%3ø\S1Ö÷ËËFbRºÑÈ ›D03“Ò„#]^©sºÁÈëäržk‹F_în@„¡͉„üTdjpœŸ\9øIb´#"Iql% óSô2OÚ²òFëà·{3¤ù5›(LTPqú}Ó°ïe CTN^­ à5àÕÊ ¿ÀÝTÌ`}$©ó§”2é,rA>°””FAþîÍ9£á/Äù›f_õrwØ® tŠ^"_€J]| XUDAb£ù#%[C ÄæË™3Ep“B,j|ÒâØJ•%6ðà Êx@VÞÃá,Ð÷÷WaV)üíÒ'ærO8·DÄ”cFa@YþËT@ˆ™B†¯¨ŸÄkÔ<®ŠL¼lbòåUý¬*¥ &^õÁXW<{PO~íÝ«o¼!åT™h”¼X+SCâäåʸÀM’® éIŠc+¯ž‚,ŠˆÒâÈÊ‹gH Xç3—dµÇ…9)‡ËüäÀ/¸jCÉÑU[Ì]µ >’`yáHLJñ,UA9à’TFF¼l(ÄH¥FB­Ùe€L4ÅÉ)Ö$‘ÉÔP8I¹r%p“d)hGN’âØÊ«gOuÀ…?±É¸@VÞÅjçF¶›ÌºñÁá ÂÎÕÿ¥¢jÕwÓëèæc»!ÞÛ-þÍØ &¿6Cˆ‡rˆTmZ ’yˆL ŠÖ¾œÜ$! Ú¤8¶âeûîàÁï©g< «àáÓço¼D†¶÷ #Y5&Ëüjo`àòYò¢œ¥š’%$•gÉÔÐx>îÊ–ÀM’¥ )IŠc+¯¾igÔí9Äê\‘ŠeÕ‘•W?ZÍ= “?þó9Æ4¾—–’Äì_=ôÍç/¿‘úŽå5ÒÞéŒé?Dà\§`8äòä˹"û„àÃ÷?#ø&)ÑØõJî%r.í°ÁwåLðÁ™% Ó›OS6'J#yj’C#sú`øÛ;Gá÷Nñ­œ°Áo7ÍÜç~Üc.¤ß[z€F⬘ÑØ¥X ¤àê¡­!pzpå !à&GH±Oêc+u4ìÆ©¦0oÐsGŽpÔÝÐËß]E-rŠ £à6¡­Qá„áÊÀMæù“(ž-Iëc+ïàt´ÀÏ ÄÙÖÉh¡½ààÃ÷/~˜¨iEtÈjîñ“ýª½›yöDÐæ{~ö䳃íÊyqOl*ÂCOTqÞöªæÄÿ»übÍ.¢í¾Þݲ'Äš¶<¢â¤Ž£d*ek(4Púr:3"7û¹¥oUÛ_ƒ¶}”šªœ8¶òêCß%EëÍM¦–nÕÕno»_®`¯#îˆØ$à³çM»íöªäìr»'j”3p Ú>öp(˜7Ù ”¾œÁÜ$qÚ1ÐIqlÔß½+Çáh™~JƒÍóåˆ'ÄZáŒøsó/uŒÁDÉÖÐè‚©/gânR;aQ;ìq¥Å±•W˜2w\f¢^£ÛÃgcò" ]xñ{„DBF(xBÂÖàáÊ"ÀM’ˆ cÇVr>#¤z#€ ê‚hˆ35© )<Ò`ÝÕ8)¸rpãš}î]æ¨SFí£y°Šú'Ïï£8=è»nÇÖ>À_gswÔgp )Q >°5N®œáܶ`2Eò”»euZ[y' §orp((Ý\pÔá‹DÝ/ŸE- ½_ûåó¿ð›Mí¾ßã£ÁÃjô+iŽVÒ´ªä}¹ŒÚ‘¿4E45Ñ¡Ëé?—Ë_2дüŒ—Ø0{lâQ°\¶5ª¿Æf*çÞcݤÖGQ;¬|ÒâØÊ«?~ÉÜ$X†=ØÜÙd= «ð÷íøÔ¹©z0Ù£ì"_”Ûà ¾˜$5ô÷‚õ·­¡Ðë˾ÀM’¯ ÉIŠc«:ucSMWœ@Ý_·Ë¨#«ð·ŸÅÖѼޣ%+~QLÁwçŸKÞ9«`MokPœ³\9øÙëÙEÒÓÒLç´±•Sô®=?óˆ±Ý®Ûaí¦%ý¶ûÖßXy0m{©†ï{F %# $‚¥º­¡qòpåL ÁM»~?hfß‘ Úö,³ÊŠc+¯ž´u/Ųݮºµ?ð<¶:Z4/.ÌðeϳRD@.XŽÛ ÷gW΄ܬ¦—g~œ 5%µDú”š9.Ï9ÀV¢°S¿ê?º[݇ãÌÇûuýÎ8ŸpøÊ\—®Àd]‘*ôëÚ¯À~î7÷wáxÓoÝ}ÞõÃCL¦ÅŸ‡˜‰€@ÛòâjdÃíó#> %—Ïl Ž{ +gz ¸Ùãh‡ÉÎî_º ÙîhÓâC?¾}pì~è7¡ß„gÖ÷/âØÑVª©?«¡áËð⋹ªÒvº`¹¥*E íËé†Fnºíj<»™{?­ŒµÍ 4˜¦7 دL>’/öm’ðÍEñ"E±ÊÞi Q)X¤Ø½5É—3Q76Ù?:úDñ0®¤Õ±•—ßȯcî—þ“ßF½BCXW¸«ÌC¸}ß­‰|7Ø)fó,7šÑ—Å Å…}rˆkÁBÁÖ¨posåL\ÁMê¨'j‡Cœ´8¶òêa‘wtGÊ>eFFW¼í¶Ý`{èWd|°ŠU ûÁ½n¯©ô³Ä¾Ù1šhè«k[Câ¾êÊ™˜‚›dLƒvŒVR[éðØ~îY+5m €<Ÿ. æä‘•—?ÙQˆÇƒñ}§˜©ŽÑT< 2ðÍ aþÍJëps$žüø—ÿÍ’*¢ endstream endobj 155 0 obj <> stream xÚí\Ko$·¾çWÌqtÝ|7Ià›ØÀÚÞâZ3½R{çåyxc#?>dóQ5šÉÙh•‘Ø€Dmñ«&ë«"Y¬îÉO:iìt¢™ý¿™Ì–“?¼›|ñ'9¡ 1™¼{?”9¹uP“wó¿Oi‰º¹¥Tˆéýbsówž|ùnòÓ„pÓN>N %R´š,'FVÄæbòýäÛS tÜ÷û\jÿ¹L)'œ‘P€žºÅ)6Dj„Íuù©‘PÀÞí»ýÍ-ç|ú/ÿcÛï·Cÿó SÓÞý…"‡ÿ×õ{÷SøGÿr×톙ÿu·^öÃzusË´œ’›[Ù4Ïö#Œßÿ»¯Â/Ûû3æ—šØßÐ …†î®çý“œavRiâŒ.sÆv°ÆJœñÍØ¦¦ísSåå(óQO1Þ’ÂR[¦˜óY–|3O1Б£XŽìÉ"'¡½];‹~<™(aÁ»HUzð$”àŸŽLF<=ÁQ˜’œ^ ¡þSzÁdÔÓKR¢ ‚™2½l"˜oæé:rôŠÀ‘9Yd$ KôJð9yx ð›í°¼„^NÞÇ;ƒŸ _Bâð%Œ¹nFÁøë¥$¡°hss«òŒRÂ-¼‰Q¾™gèÈ1*G²d‘“P‚.1*Á²äá£P‚‡=Q£¢üŸ´Q¯0PÁ$ˆ¶–VÚU´È*+/QœòÍ<«’Š©"näK yäÙúÌÖœiÂ0oÆz„tíògu–«°÷«_«¯`½óaðr¥Á׳È0Â$Јid;4hä›yŽ"p¤H è ‘ràH„rÅJ‡™ ?Ú§¿l`ºœ<0àzöÐF’ØÃ‹ìqŽR®YJDù†Ó µ%ö$ä@Œ<2jkW5ÌGÜáR¿¦Õ “¨!"Q¦’íAQ$ í™@M–M;1% Ž¥úaå |·šŸêÜm‹¡ +KÛÓ_ŽØ5ï÷ýv9¬zL¢íÐÝ-Bê`ÖvÃêÞoœÂSº„Ót}XÍûùªß¹UP©Ï͆0E’PE¸›2Έ q'³†±é›qvÐÃz{»ñ#üßü,ûýÃzüû<¤YÖ‡½ ;L£øuu_ÐWӔʦÚW…r?ƒ­È Û ûªo|Ô8ƒ¶ÁÈGtß­8’~ý6®ÁkKø°jöÞòû‡ 7\D&Í F,iµ5T“LÁ*L! Î`‰±Y0DÐ0¬†s!“’V.¥ö,à ÀI("oö³Í‘a®¡[ ¿ÖZ,1aâÜzårðûí:$Y7ݶ[ºè8¦âåç6e™”ÕvÔœHð*^aJÛƒc¯òí‚1AõSs6-i¦”ZÂFB_zœ_šà¶Ã¹f”gZ½â` ã¿Àî­&4™]T˜½U6dƒÕÇfÁèIGÖæ8Z3œd"pæÂ¤%Œ"tnÇÝ–à“PĶ “–™W̰4õcMCYq)g{XB»p-jr$KØAyl$°] °=›„lÜ©ás±xQ’R•ç}6>„:ÍlÚ¤j_ÕULÀÔ¢‚°Ä¬ŠÛÑÊ6 œJøYJ ‘*Oƒ‚D-rÉGŠdA$@ýHtöÜoý/uÓ$HUM$¦‰†US8`{H£|»À'P“%TÄŽŒÉb#!ËE*?; ›™ñP[GRú9ó‘/Ì­O ŒøÙŸ<Ѩ­©?¡ä¨þÄ5Kõ'QG–C8²#Œdx™@82#‹Œ„ø³å#Å+[ÚÒà+ˆRMLŽÆöLrw¶’±é7Ã?û9œGí鲿çÍÍv}o˜Ë[ã(ͤXû?”QB3'ëëÆTkiž¦›”¯3]ŠŽA¡]p]P³ëŸð]ƒ°GÇT%p,Пr`*1z,%Ë£#©€þaXÍÓ`}È‚ü09^>t«ûþ‡›˜ wö=¯ŠQ0ò ÕRbÀIùfÓõÐx{êÛFšl5bÄN•†Yp,Ð37TnŸ àH*€Ÿ*¿(xq)ùëV0PËH"P°*_{º +ß.P Ôd©±i²àX* iÔÃòl‰t«±Þú–×€¤‚†¿/P,>‡õWRýWMŸYt=)]Ñ¢®,ªx NÁ¸ë9Å㬙8U¾ÿän±Bá*´ …­ &[Ù±SÕj¤z‰S !°¥ !I% wê Ù’ã“…è¶¿øî@%A¯§€†+«¯Ò9cD¢ð$ËT²=8 O¡] ¨ î½Þìs—sß¼©¼»Ûv«™ëøpۭ淳ùK¹ÖðÏUF…FvÁ¬s»»C¬Ê³Î¥[{`Ö}»0ë &{—ÀãU[¤ÞOõѽœxò^î>ùÖf?,í?oã¶Á œ½†L¿¬;Áè¯6¬0îÝdX]6¬í!°;ùvÁ° f9lÎØ•¥6µU#KàX* ÃÍ\ oæÎ¼°”œ½¤dèµÖýÃh/°³â®À&Ù¹-ÛÙöh°ûvÁΠ&kçˆ,˜ÇRýé 9ÎÇì6¨°ná²×H*¨8½“;÷þ[|p'§Ð\¬Úæí+¾õErÛ´"ESf›í!qTñíÛ@M–m;ñ( Ž¥úÓW)‚¬ÀmäÚ¢$d¹vþœí6ô¿^Ïý\tƒ9Q¢šnÆSQpsÍÒks¶ ¾­ íß@O–o;1) Ž¥x&ÂmŽÑ-ù\éAIqqÙpJ_üJöÜ,yù˜sQA²3 wéÓ@2ês濟Ï·_ˆ×Tü¶ª/_À.hŠUõ-½ šžìR‘\w=òýÐÎû>R3s‹ÁC?â>œI[RWý Z¨{˜•Ô`© çÇã§O~÷£úÞ{ß÷Ýn¸ö¬dæ—/ÆóI›©VГÔÕó+xõ ñ 3·¨Wc;XS^p;&§Ýcætdkñí÷ òÀüsµGÏ%=“@ª®Ú;ûXÂÇbaW¶ýçæÝ¾‹Iœn>¬î¿ø¸µö8½IÏÿ]„«ôr˜±ŠiŽ^®ZbLœæšªl×C£eh¼Ô8cYâÕ˜IHà®Ò¿Ž„ør³{”.îBýþæuÆL„?©¾ýÞÿáýz»tï Á¯ÕÎ0Ü ìÜ2÷âl´sEÉ·ëÁq4÷í‚AsÆþŒ¡ûR  S6 ðX*à?6µ×÷8U(NlÍ£­E²µ”âêŒ ÕÕ¯X3{D#Wƒ #]h#ûvÁÈ &ïÌ<úi< %ðÅæÓ|ùo¿þòoǯvDKë–?÷¦ùl C¬·­l QàÀß®‡@Ú…L€š¼'ôèšyx,ð™·Þ“}ʼn}+òûŸó;08]ý&Ž´3CÁi+ ­íÉ-`Xß.Ôd6̃'¡îl÷inûÕ×oÿrlMö¹|Ÿ`bé&æÊUVDWT<»û®oL j ¾Ñ“Wfá±TÀ?±r½÷F3Ãò˾ûÂuuÙŸ”«lðöeá¬ò]:J''pÄžÎúÝ.U¾éöölZK/1ï® P™ßæqMš®ÿÎ’â±LÐÎt:®¼‰oíÙ‰SÓùaæïšŒÑÿOUÛ¦ö{h‹ìœ=*Ž®®À íBd5ËÍâÉqÂŽ©ß<8– èÝb.°Ïä‰mðdX‰WÆ’$”|ü°;¾­¢¨¬a¿íV»E·¯0tL_o-D7³"JÓ+ Œ­­ßК1ï©SqXq=p©eh¨j²Ô‰Ø‰Yp,ÐÏVpÿÙ€çþƒ x$à- æÙw7»þ0_ß:¹uX|Ÿ,»ïWýÖsÊÈÏýÑ4ˆzv¨F¸W9#;*Ž;®C輻vá h &ÇŽ„ížÇRýüž›·£™ÞŽ^Ò"<’Š*œúðm³G{o> ì)žô÷±&<¬’›+øÂŒðêЖ4X*TŠjÒrDß.PÔd©±)²à •ÐóÔIð‘yø$•àa‡^Mè’èÂ5¿ºÏãÁÛ꣚âv‚ îTÕ\ŽãŽoÈj²ä‰Ø‰Yp,%ãׯÆHßUná?rØjàX ©yõ;Z4 @Œ5‘ï”*!Üú†¾¼9¶ 5YDìdÚ,8H%ô»Ã°8÷9)ŠŸÕ…Ûƒñ“T™€D.¯ð´dwXíöÝjö·ï·ëe†~‚‹—¥ ¨‚*,~ºÔî{ÃÅfºoýöwÿUšÐÄ endstream endobj 204 0 obj <> stream xÚí\Ksã6¾ï¯`íI:!ž™T65»Ù*gâ=íä@Ë´ÍIT(j<“Ê@<’%rfl9ëš©’ 7¾ðu7€FSÙ¯ÎrõgQÿól¾ÌÞ\fßüƒg8Ge^f—7Èñl¦?Ùåõ'$§3Œ›Ü.ÖÓ_.ÿ™}™ýš!ZÊì>+1âbèPˆl™• Iæš‹ìç짇:@ÆêX®p1¦HŒ±@% Bz=‘bÒnúM»ø8UoëéŒR2ù]¿°áÏòÀŸû»á ,ÛAâº^LgR”4ñ<ö;[†Îw?Ø7ÝíByÔ»`J$îºçíQ+ qì­ Œ[ê@1XiŽ[è³ìE„,ôMW×±)CeM%Â2 BúþÃf½cRƒ®Áv¼õ]µÚ,ª¾íŒÈ½¶´¶S=«¹ᜟ©ÑÀ0ŒFÍ:U6 f(w¡ƒ*“É ™\tíÕ¢^šÙP®¶í›ve梫«ëfuûÍ}×ôêÕˆt­’XÕõÍ ?Ÿû²S Ó$iª?rŒ„óGŠpÜUø£iŽû#èXwÍjªb_À+%’à1!Ó~ d(C0tÿn^´ X¹ª6ÍÜHh.tÒØWóåŠI_)Ã2ݴݲ꧳Ëç§F™N¯à{ÏA$N¯`:¦{zMsœ^Сï³b É!c\¢²“ñÈû¼š.=­ô ­lòÃÿÚc³,ÎÍua¤éÜžZ§VÉóÀsMsœZ¯ÂøÑCjK½sòȘP”Ç ¡âOû¬#—yr)=»¸ìG*E*·%A„{rYœ\Õ!ç@®iŽ“ :âaÙÁ»ˆ;ŠYͺ?F±¹u×´ÝÌn­ígǽÚkÁš€0ü4¼ÂøÒ‰Å9GÒËSNA휂t3v r:F²C¶Áv9‘…€!”$‡iFžéTãÆx«jz(ø«H UõÀÃÚv„XP3=º ¶ãð¡ýZû0TsŠŸ–Yž”ÉÔRuLõÌ ̪E@ìÐŒðêuÄ#±ƒwAv?2 –Íú¯ÿ~{ñÈí± g°=†1Ê2™\&ô«c7%)¥zÐoM;Â/¨ÈÜ…ÛQð@È‚ï“ AÙr›¾G.ðÙ푃žÀ°È=½ Ù&ÌKüÝ¡!×jˆDd ìCí²²ÐwÚ‡AWy>ŒÚñ•85„ µirË\*hjò±³vÝ7ËÊž&ªUµø¼i6ûéÊ_Dúç)¦&³LNàbY —0b) #,…ŠËàRC3âR^GÂzháýR7†BNAW­nëÍŽwù…ÎnWëÕ¦é›M¯ÏŸÍ‡{ÆUÛ¤§·­âlùö£>B· :åÙŒàAÝA¹ZIøäÛëS¡]k^ë…E’É·oõ:yçlü{ÉïÅÍè)ej$ „#lFcÌPG‚7Õ\3÷áV¹ûJ}C^࿤¯?[ò&ý¦¨DšтÔLýxžMÛC†ÓW†Ne#Áv&ç,ùVŽDC)A]wÈÃk9ÓŽÜËy-W7ãy®„ÊçRçD#С”Á®?5›~7¢Aᮞë•äƒÝ Ýì]¨†xSÍû¶k~«`?å@9+ÏŽq?òSÜ3žp1 {ðààcÛÆA›Ôz—™v¹Þö»—› ¸ û\0É^†ÂÀOa¥(õ¤$¤ôu‡Ð ‡f„¯cÌ -®÷®1àPÈ oMVèºê‡m‚£›}G¼«¬a\ ;®º¶ŸoÍÌ©Äâ«1ëG‰sžLlIôfÕ1›Ï×=Dèn¦áÔÜÖ‡¶Ìùp¬ôغ‚âx(eѯnæû™†¾kj(w¡#>lüÞdï;s÷C&몫–u_w½ƒ–Oë¬0°8¥¹@ÌSšÉ×0jšã„‚ŽÍ!>•ãiouÀ“ÁG‘C!v˜Lã¥ú`”Leᩤ;TJÉŸ”JΓ³÷—º¸ÇQ™½×=ŠÀ;m;B&¨óNíün<”²èWw6ï7âžÃ­Š­ª[ݹ[“0hæåù¬¬Á8•ý'SL)†²øº š~½ŽQz-°çm 9²ùãV“x ò #Rð”!ûâ¡5f³÷ †°­ÄëOþÞïèBî,‹çü9MÇçÉ dÊ }ÕíL'ኀ2¡—°Óލµ‡í-c¤<ú¼=PI e$8Í/¢à^ʃ'˜Ò¿]ú,µµ¸‰‹K’=ñb;Å`DŽ|¶#åÎAw`¹ ͈µx7ºt7}i6ÆŽßþNg(­ºë x4ˆï„Ó˜ê€I8…‚é‹pŸêȧ3¡§ zÁ~L;B¨¹J`èÊæ-ïõÁè(M/ƒ¼Š[ÉÌÈ–I Äà81ªCÈËÐŒÐâuØ™^ˆ…Ølª-:&Üì—ÇàC¡ÂÊß¿·¸tÇÕ¿›7ûyЂýÅ’0%)¶`SÆ,Ç®´ŠùŠïŸ›åzáÖ‹¡ ¡ÚîgŽ)—¯ÙáãdóŠ1NõL†*JÇFJzX÷ŠÖLsÜ5%j¿Àù¤:üè†zãá1.ôpÆñC!«@Ï 4Õ‰sÀ¦•4†Yìí±K{…YÎ@€NÚýìص<^€ÁÊò|L †~ŠI‰(ó&•Ö=p°M²íˆQš¸Q9Þ`F5„RVŨYytg2ãè”EŸï”IïU¸«66ÅØTAø¹&'ÆÉµŒ kµ³¢„„¹î!‚jÛŽX¨ñ[²‡D+¡ÁŒœ̸1Q¡”<A‚­ ¡¶þ´^4ó¦_|¶U]vK9oÞ瘹¤»RË'=ŽaˆÊç’9ÖE)Rçº #…iG85 ; ž½Q¡;äÌ{üÒ=~Ù~ÓsùœY•`TŠ™dZ…D%¸nBú\÷(B×5í­ fÝ5UQ¼ä¸ÞþC¥,|××›>rÌÓ_Á•§uúPgõгdâ%î(a0N¾;a’èÄ£c?!ã®{ÐЩM;Â>¨¹Þ\úÂöP ^ÄÀC)‹žBþð ÌqÅQO-õÅÂÄ“ÏÜ ÆxŒâ½Ê\Î ]°¡{pS™ûFm çSŠ'w³ju=ûnÛú\V¿LhSk_jhçÛº4îësߺRS´Û2‚\¾Ö{~IƒòSŸÂ— s%kŠ0¿ügcB#H(Ì«ÅÂ]Yì,ÇÊM(ÿÿv˜ÁSæ]JDJ?ï.T‡&Â:ô|kG¨·m×ôwKéØ3¤Ïd®aÖ0I¾c9Öë–›k—0ºt…§›ºêLõ“ýͦá‡w˜,_ƒN”‘`n1INá ÌÕFÁ3âÒ;ßm»®6%‚ö)œíÕÚýâO!wIöB|âS“xÊÔutgàûÎ`CŽ;Ëš-”Î[Éœ¿®ÅÉÜÀ,c’þ»=Œ ná$ïêjÓ®6þ‰NXŽýï\ù"úýEšÀ"]böòçf(e^‰­Eá’Ð>IñÓßþ>Ç™\ endstream endobj 10 0 obj <> stream xÚÍ\ËŽ¹¼û+êh_8Ì$™L û€Œ|X¬ö&ì¡{42 Ã’!È€ý÷ލ‡-ˆµ#»àÃLWqº‘¬d$U=cÉ‹´eà·/bu‘±¨ù¢y)]•¥v[T—æyѲ˜×EëÒoi‹¼Å–1𖾈d¼Ýh.‹ŽEJnKAÏ5¥p¤,E#})e‘Žî ]•h¼¹ «Œ“Ò^q ­8¯Òò‚&œ¶¥ 4_*˜.ÝúRÁÏÁÑÑqn à8¤8Î@»‚R}A—èñŠeœ+ ç ê™Fh¾âócøBHA|m:ûb T—a¤*ÆTªƒ!­Á(;‚14È¡AcÝ`6מ .K«è¡´†7u@~õ *ç äŽs\ „jyà] xö à‰Ëf<]@AdÁP˜!'\e\Oãø{Œ¿(`ü1TãÏ®9þ>@ƒ…Léÿ! €à1”Ý¡;‚L @©áàjtj®øð €?2g¼ed~Ü2[èÂÐç5\ÏÅŸGVþÉqàü …é+äTÁ'GÍlQ°Èl) !l©àÁ™ò®laö*[:©0[Wa>b.€ AøÖ\Ö#‚W ˆ`RHnm…ÌÛ͹ÛÈÍm it¶­s¤³ÍÉÓÙ6H”‘¬Ø…¡p®He,œ-‚ë‹£BŽáŒÁGÑׯQØfäÈ0oÀ‘Ü g¢sÙ×Aå{0À±²Mɱ²­#f‚`‘~¯‘d»`&#%‚ï-bl#3ílã|/È:áˆ”Š¼ö„\fÛÊq°­ã`[%3FÔŒÌx¥ø8Z{aïÂ^8šUÙ‹‘Ya/FÞ•½`Š€Y®›xÕžÙÖÈLØÆž¯#æ˜ñú`2ÇÝVfO^VÖ#êTåˆu2k L;pd„Œ´u2ï+[²D’ƒ-Ñ1Á–½v_UŽmÄQþæÕ¶Âˆ0À3 ÊG¶«ú²å5_cv&0³ÂÇ™ÂüTgþ f&82396½0ãØS¯Ì$L1p\UUÉ‘W~Ps;#âvçu$b¼>œŒžÛÈlcfž+ÇŽcíkIX™UĪœµÞœmJŽÎ¶BŽà¡+o¦2W}ÿêä¸ö2È‘½0ª¡ì…s~öœ•ÕsÇZ È,³Qq(¦/˜ ÛØ;g€ «g€²–eå‘’G¨¹¶‘EcQr4̃o¾yzýñÃg¾@ÎQ~z ýÝ ˜Ûޝ^=ýôéãó›—ÏoŸ~úáõÓ//ÿüüôãßn~ù~{ùn{ùñ×W¯~÷EÏœP[GœPÿKO¿üëï/Oß~øðñóÓ›Ü?óìOùð×§ï>~z÷òémFŸù×§ïßÊvð->òæéùøôÃïó€öóËóç·È÷Ô1$ÍZʅ奧kÊ&8òNM(e(c’*.óŠÓÇSæÑŽÓ4õ6pÆŒS4±œ¬8±ELÓÛ #žlËêª-…\œûŒ’!:¾‰N&Ñk‰·vV ®I¬E­'†ô¶ :=¬¡«g†¶+²;‹F+Bèê‰áǽí@&V„ÐÕË z—ÃóÃv%$Î,?¬ç÷+¤ˆ-åÄïÃbžOi­0ØMô¡su.DÂÅ|ßÅŒÐr„ÎÕ3¿[Õ݆ÃV¥… ݉ßÇ}ߕޟä;ñû°¢oº‹†­J :ñû¸¢ï»±X]Éí¿+úª»±X°_i:×Nü>®èû„-Å¹ÐæZ„}Ùg+­¿Ò"d®Í¥ˆëùý–7örÇ»Ø}Ø«è¦q[•ÿÜðþú—+í½v•½×®²÷ÚUö^»ÊÞkWÙ{í*{¯]eﵫì½v•½×®²÷ÚUö^»ÀÞ³«ì=»ÊÞ³«ì=»ÊÞ³«ì=»ÊÞ³«ì=»ÊÞ³«ì=»ÊÞ³«ì=»ÆÞ³‹ì=»ÊÞ³«ì=»ÊÞëWÙ{ý*{¯_eïõ2=°¬nɇëu º~bïô§ífX‡þx„þô{ÒóáºA]K„þô{¯p× ‚sâî!ÑÆñœ´5$·OÌ=èv±Ãvƒþ„]'¶›%—Ãvƒ¸Öýé'þ”[w¡H·Žý9ñ÷l¤.‡íf|ä.èÄ߃t‹¶ô'&Nü½ª‰ßØÜl7¨kŒÐø{|µÃv3´…|1ãÄß“–šìv˜B]k„Ðù‰¿—% ;|7ç#w@s1rOu¿A+(ä.†Ï¥¨W,öíËŸñ›_-;µ»Òór‘çõ"ÎÛEœÛEœ÷‹8÷‹89p~»ÈóûEœ?_äÀù»‹8y¼çï/ràF¾È2íEªe­‡1õéê3ôăúìß¿h,×!27¾,E%Y±×ûøÃƒú„Èܨ_ñ?Ž@}ÆaŒ!ºï_Œ6A¸u—¹j| B}†Í@ê3cŒOD¨Ïè3²OêaŒñ‰€ Ÿê3vcLùD@ÈwvÇ á>ÜXèvÈ Ùq›`Š[ÚŠÈJˆüÜg˜ùi‡/6ø× ç¨Tóá‹A\ctîÝ T[òvøbš<äNÃx™ Ü%¾ØH¥„èÜûIçŠxêíðÅZê!O ÝòQnI÷Ü.¢üÎkL@:$Y;{ód!wn:=Ä€»•è!Üm®E1àns-zˆw›KÑ# ¸Û\ˆcÀÝæBôîöe!’´þ›!Hwi‡/ý ¹y»Mú#H3χ/Öø¯K"€æb$nm»/éÖ¡›‹‘I=¾˜óŸ—D½›‡Ò-íðÅ ?!7 o/3P®Év¡º†Ü€¼ÍÅÊwƒpçÛ÷¹õžZÞ}1(kùÿòÅî2Ëc|±û\Òã‹Ýç’ö_ì>—´Çøb÷¹¤=Æ»Ï5í1¾Ø}®jñÅîsU{Œ/vŸ·WñÅîóë1¾Ø}®jñÅîsU ÷Åîóîê1¾Ø}Þ]=Æ»¿ŸòdÚó\ÒódÚó¼»ú'Óþ |5D+ endstream endobj 254 0 obj <> stream xÚå\KsÜÆ¾çWìqy Œy8Ú©Ä¥$®’]RIà$ak+Ù)ÿøÌ`ÝØg•$.’ªÈYö|½3ß7¯ž6?oÈ&UÿÈ&£êºÙí7ß½Û|óg±!iR¤ÅæÝÆȄÉÍ­þ@nÞÝÿs+z£Š”n¿+ûzwsËÛvíi¨U¯J…Ø&7·"M_ð/Š—ÿ“ÿ~÷—ÍŸÞÙîþé{ûK÷xÙá\DrÜã„J¨¯«ÎÕ" ›[ÊAM QDηÍÑü¼IX‘o>n ’9V`d³ß<ɹ+6›¿o~¼ô6ÖGÝö¸$Íš0!Ê‘ˆ ## ÝUeߌ¸~3?î«¡êöJeºÈ'mg~Ù•MSÅðTÁ§wåî†fÛ÷½ÞÜùRBcVÈò$õãliY–ä4Å0à#D vÜ‘½‘‡~¬†Kh*“L h–&)A;#}ìÚ;¤ ¾-w»ªïÍGžtmÕT{c¡+±ýOµnn%}U4|…Žt]˜X\GªG)†u>B:rÀN"Addd¡»VÛ3Z*ôðxF“,Áƒ‘…/‡¡ Í2åý}=Ôí¡lÜÄa¾ÎXЕë»Ó ×=*ÄÕ(šGh¶T1R$fWŒäzòŠ1ŰbÀGH1؉!ˆì<ô¾¾üÊza‚f,‘2íŒ<ôcyœˆe×îŠ~· 5åPÐú?¡ÛÞ¼5vc=Á²×4í@«Wˆ(Ë“ÌkHÄ5¤ìšuL1¬!ï"$!‡ëÔFFùЪñœ©©`FGJ0 á«É™’>üûr(': Xy<6õ®Ô“Îm¯dCómµ«ÿ•n÷Ú¦v&ŠkSŒo¡ùRÁj“#¼bd\1ªB*@1¦V øIÆ;5‘‘‘…î«Fo..“'Œ!tÕn÷6ô8N4V4Ö£ùýt7Ùï ­› z>R{Ý¥£Su¶Gꫲ·ÅOJP<û:2v­Ð IE’{dqè hu2ŰNÀGH'ØI ˆŒ ôSuêfTÂ|+Íò¤6Ê4†Œ vß6“iå¨w+rû¡¾· ’28é‰ÅšN‡{£—;-‚_‘þ†u?è£}¦Nù×svÍT[¿Å²!EÂ`~ÉèFÕ h‚±åˆrÀMP:ÛË"Ž­,ú®<Ìì„Õâ“atF|uleÑïºòভ{¼2U;=…¼7©ìŸJ«¥iU¶=Ç)ËHo§ YuoŒ>ܨMsÙÕ¥š¸”0¤üÒ‚¦®Ñ:4^BÅ éSRÐXŒÈûêÇ{a„±QqNï…ÎÇ­®÷À³qŸö€ŒŒ‡“¡ù,p³Ó“Г^Ãä¶íí"6å^kʬYüB…”æÅõÌG¾Õk´Ä¥þété:‚„ŤjP<™rDNà&¨'‡íµÇVÝœ•Ë¡š>ùÅá¦Ë^4±fëË—â¾>ÑÐ\uŒŒ2íæ2µ43.w¶ë’NàCWÙ¿T¿›¶óLˆª4»²€ö×èxÛ…j¥Z<¾2¦%j;~I\×`x|™rd|›àørØ~äÁ±•E¥1ÌàÃë@E…GV¾¯ÿ[…¢_ð÷öartà“£ˆ¸È®OEÐÜ5Bʳ„x-ˆÃ“\ªåd4#*ò>‚"²À^!d0rлS7wÞ f¹wØ6¬ÆöFû`&ðû †ô¨Ì)Ô(¥Üá(Ùôì*‹ì%¥â[¶B)4M S΂P»®ÁÑ”cË‘[7p¼vsØþJ-Ž­,ú¡úe˜= ŠáÕáST#ðÈJÎÄ2ü ÎD3Ì|Å"]H‹…¨£ÄËÏ/¨mkTCxB½hDÛU¤UˆÈÅãÕ2‚z<ŠL,챫>ÌËDx\ž^§B¸`bqéC;¯ÛS×HÎ䋈·Gk‚fúzÔ‰bAø\×x&1åˆ4ÀMPÛsÇVý4s£ÓW¿È(6e¡ˆè¹JÊqá‘náÁºÈRù5sI>AAÐØ5R?™W\’ÿA’Iþ‡.Æò?œpþ‡†ÔŽ26b ¯`¼{»v€ŒŒƒFM_:"Õ<¿w¹ «•²±RÆÄuŸž ©kô#FŽ€ÄÙu ‰§ SŽHÜ5ä°½>‚àØÊ¢/‘÷á$ö¬¬;é´±ôç–¬©”ض±Á—Xpg‚\#Šì%…M[£™ë­žS΂H»®AБɖ#Ê7Aå8l¯‰ 8¶²è†ÕªfOþþ„‰„F€­¬ù½ŽŽ;-…ÎJºü±ž°~ô÷Ê+gÅÓ4Ní—ÆÊh®zÔÍ:ü<\¶; ¦clØ ·æ"DÆÉk‘}Á ]­fÀŃ»P¼¸ÁÍ啪nSŽ npÜÛÛ 8¶²èörÊè©™á4É v¤Ž)iu„¬¬#@£Ï¬ gÁЏÙqÀÐ8¿½ÚË~¾déOP´v…¢XZ$©ò‹]û9:Ûr$ÕÜs]¶Ïc ‚ƒ•G/ïïgS³ º:§qtoåÑQÖ¡W’öèr<ú¡+k,#—ÿ1ÌN¢Hú·,»ò},ê†5ú¢40c-ˆÊé ÍX¶Ñ¸ êËa{åÁ±•E¿¯šÙtj"0ºœŽ¦DБ•E¿ÔÛvÕ~ü'4ÎIí¡k÷KÅÆéõ$ɢ櫭Ùb]©9žÀ¼µ pÇÔ¾¯Àó–)Gtn‚ºrØ^1Ap°ò軦*»ÙÑÄß0sÕÁ÷VnÏXÙ4s“Z¿^j2ûÊr‚6«}À¬œrT-U5dš˜[©/xÅö‡ºßUMS*ÚÌÙöÛ·oÌ/?¹}nø›aœ ɱÅÏÒ-9˸ž[Æo7î÷ô–üû¿½ý«½¨>˜Ä²®=ì«1·ÐÆØÐƒ`ôïÇãA¿OPté"üA™ÍªU<,Ùyë (cб‚œúPÏxÕ´‘ @&D$„E ±‘Á6:ù0‰·iuÙøM¯Sßš]ñ™Âh‘½Â3tÁ ÞyJ\š¬&~ÁY×À©Ñ¶¦¹1ñЮ¯CÏݱmSßue÷«ËâÒs·­“QñêÏǨ?ÖEx’ž¬»M]¥'›b„*pò0›B¨þ»‡&j*O³66²àsãôÁ§(EFhVׯè Âg¨sš'Œ{ ,ØêøV×–#*7ÇΤõ®>vµËÇ{h»}9 •ÍòVkóñt~B4¹zjÇ” rå¼@Ó×ð¢~æ06ܪêm9 ¸ùð™‰a”]91Ðö5Äu‚‚³à²R× xÀ˜r„p£»tfÚT‡À UK¡c+ ß: s›dÜüÍ}Ý»$ç «ˆw.Ù«ØÂ¢Æ¶8é™Ë<)`.¸TÔ52<M9B4¸ íÀ=…AtleáŸìyöýäÞÆžU«nWíihžm)_åªí_Ã}Nƒ|Áµ ®Áð 7å÷à¦5‘€jæA’&M-/b.°•pÉ4å±ÊÎÆ!vÊ¿~–Ê&qO5À`¦Ï_ùÐvÂÓÅäã…ˆ#Á£3¼z%òM9B>¸Ù5ú“Ù‘Ÿ#ôqL‹*Hò/ýX1jÔF%siv#£<Ψª!ñH4å£àFõ«éóÝôíYþc¿öí«}kB¼l{çRÉì|+{ oïû¡§_œ÷(²Ìe¼4Š8ªÎ{´åফž!ÿa•üs<q%³*ôÏòŠT_X{òdœ> stream xÚíš]Sã6†ïû+|iÏ4ÂGß¾ !Ðm ¤›0m§í…I ën°©“,K}%ËŠ `gùÜx`ÆŽ3Ž4ï£#÷HÞ¿x¡úO`õz“ owìíì3B…‘7>ó€#½Ž~À½ñôO¿‹ èý½<À¿ÊfyR—0|™ ¢'û±¿Ç?{ýq%Ûǃê¦8¿+e€8]W(uïëWÏï•SÄ ’¹O²Ëx¢ÿÜHlÉøKêó—æš;ùhN$ í'Fó^žý=_·5§¾¥(ãsõóèMÝWfâäÊê2ÑïÚ8 –ÉÅe:«Áƒ…ìMëç@Ý‹S(¯‹…36TX…åSrßìäÈ0C¾'4¯1Ne ¢.!‘¨ÈpCæC6_¨¥ FÄDÀ[,bY)Ü€J„fa×ó´6* %r?§î}HäÚ[¡ÊÉaf½]µpKðÑÒ^R?ˆ˜Ÿñ⑎¬ÿ$¥yãwʺƒHˆ° ô]\KPÝH¿&S3,L×ÔÍ~ qÕµ%xëBõ›3q§s:” Y‹—tIü"I„ù¶Úœ“ShT›új8Ãé¨;è4i6M'ñ"/ÌÇI\¨èŠBÒâx‡XX‡POlØPƒã£^ÕŽ,ýߪˆ™'ãY#&ß{îýÚ˜œàM0IЍf0õŽOG· ÑW%ôN™8u›0‰”U¶¡Ã«Ðùé·7y½¡0Ú€•SÔ.Ô fãGT¬ºGýÛ¸†-¨?¬û@ÞÆk©<@Åé ŒÔ¦Â”‹¶&4Tr+*£Ked¤ŸLÒ³ëU™"?Õütü| 0÷K„ý³ef“9Œ[ÅJÔ&$8C‚Y`Pô¿Æ—³Êqæg7œ'õõ.…þ’oaos8Ng`õ·æD„ˆ…ƒ œÁ‡¡r–Ä‹e‘ÌÕ¤Fi»ª< ¥•ÞÀxâ fúë™]¹Þð°ÿ».ïÿpøe¾µ€Õ.$P>Ú,–½²Ì§Él9U+…hÈóí=:é›#!’Õ@*+ªõãG¿r?>Ñr–š'†¼Ý6 œ¤Àj—öU6ÚF1 zy6_qšé´q17œÛÚIS6Neോ„ {¾¥WÖùTë»ù2›ÎoÙ,Aà;ö¯ÈI ¼v…‚°‡aze…Oµ~dIÏ~´«Œ¡ä<)ª'qVí=¦Y\\ß 9׸¶Jv' p\ÿ4³ç]zeOµÞ·²~Ö‚'×Wú’kG+ßBuè{¨‚¯É¼¶ã"‘´§`zeOúk¸è*“$U&©®Öz IÚéê 'ê}(neî oO{Yéj*êijTÜvF J|‚B›Ò>.¿xmßG¥D`c†ùi–Žô¹±Mµç—æ¤oŒ…€„j€ý7KOõ-[/| ØÁÕYXæz…ÓoT‹¤q(æÃpy:K'UN’lžl°€®5âq‹ ,¼ɨ|m5 ýáü®E endstream endobj 300 0 obj <> stream xÚåËrܸñž¯`åÄ©õ ă )Wë­dËYgË[Öžvr G”ć”IŽ%ï×§ r@æ!YV*›²ÊC¼úÝFÁ§€üãA"à/ Ö›àÍeð—¿‹@DLk\^Ãð2ÃFpyõ[øÃm~×íb)µùâ_—ÿ€ÙI KÒÄÎŽ¡‘™Ùoë¾m`n^m×}ÙÔvAðˆeQ† xÌ2‹R&iÑïÞÿ´XªH†«ðG³ào—Á§€)©ƒû Ž ZŠ(fÐÞZÁÀØ®‚Á/Ä‚‹cœ$Yª ’ŸE*|·‡ ™pàg‚EâüqÒ¿¬‹¼%.Þï¡à \X¸CÂEÂâ“Xv³F4msÓæ›MYß®Ÿöq¥‹µ‹+KY¤NâgíXêW ÂRv$¼œ~º¢§þæš:ÚfÛƒì¬û¶ìû¢¦FYÓÔþ¶ Žïþð–¾~ ‘;âii8YtpÉb"Ã2+“°Êë›m~SP+¯¯ð# ›ö&¯Ëß‹+ê7á—0ÂøuÓn¨ËЋKi`WUþ±²ðªòc›·_©Ùb™Äqø¶·;šÀ-ê+Â¥4 uMõyG'ò'±áäÎÕž”hïïÞ¯¯¨±),~"" ˆnŒãIá[ùÏ·ÃRE¢Àî˜né³-ª¼'€ ן›Ž æbôŸ\1©´uc‘DLKrÆKÎøË{€Ä„Ãþ,2&¥ãÏHCÞuÛ š6Œ>˜ë¦ª”ä½eGŠ g 4cÔ f®w -¼Br–݈%¾ˆ£]PÆ P»ˆyØà7æs” ’Ô}œɸ° -Ãd– pEž²XfYnÀêˆUØ´ÄÝ&0ý#ÎÝÀ!ÆÅbn üî!Pd–ˆ¿ú`pŽ«iÂz˜áœe& C0FB™&÷á>0G㔇aŠh&¤d³&aj ò;àøÎË |ωxNÄ3pr®£úÑá…ße¸P7—‹tåâ²Tû Ä 6órQçËÅ·>¼¯öq¤ŸUû‘OŽ ÈÔA³ò[{Æt6êfŠd‘´ÃÜzíR£kízj·ý¸X¦ðïbÝÛ¸ÔЯ ÷Æû×MÝõmnwŠÎK@Õ,!ÖÄzª±o´râÃ.Õ šÐ8Ã(ÔÎÌò}$1K‰Wv)Nçó/ùÕ‘B±`%9Ÿq€}Šu>+⩬DLž)&ÑqÁ“³‰8”<Ë?ž?Nj^âæ øÂ><Ílš˜àx¶~–ÔVÌS[…GQ#¤¡z .d­Í¶¾ê(›NàŸøæm‰ÅoNËc8´¢XÁ{S:‘ï D2¡=S=Ý¢c'„òbKÙ€ý™€:lH«3ð8–´õ"ŠO´!B²4¦HÌÏŒxÁˆ—Œ7ô,cp±ÔŒgsѳ=F€åÆîSí;–œ"Šcf3ÇÔϵçèeÎÞ_GãÖKcü ëÞ™ŠM€‹Ÿ'ÀÉ1ÀáÕ$$f8r[´Å…ºL˜G=FžQJs -¯iãòÀCÇ+€“Õ¬}`ó=Ñ´^ÓǸ$ÄàÄ£¹i¥/_Æ)y[P->ß>”U‰UpÓ„¸¯Æ¸ÿÚ_‹Tè’ÑóÖçåN)KXN$œ>¾Ôw2W£"Žk }æ4Ë‘#éÑ^×·Ûu¿móê|õe;7õÕ¢3<ÒpÙY÷ÒÓ‰…©²Ÿè°Ù•ÈÊÏx…QÐåÁõ¶6·h»Œîéõì}¿ñÀÊ(Kù:œ[€§B+L`¿D;­[U6JôÈ0 mÿº1ÙY±Š¸^—ÝЪP[ITž¨¬¦x~gàÒ0*Ú”9s*rÚ¡/Ùðk®VÝmyÝÿ¯ K×öˆ&ƒ×¦3ËiF\ë)×"MOXN”!…§òêŒçDÝ`°Bsš8Ú1ãɽá#r1müû'ÞÕMÍ9-@}0±+zdÚ<°RÆŸà‹óÐݵ/!ÄKôoŒS|û0ÓC…ö†s!ÒodQ îñŠü!M°>ãøƒ÷ÀåUáäh®ž ¦Ä ¶Dþì1sëß5³o˜qfL¤óx ¢ÞÞÝ‘wØœc‡àÝnÊìk3åÞ ï$Péüàlºh·Æªkè ß!W¾;nž˜Ë"bªÅîæ¾óði´¦½‚H*"ÃØÞ:ßv![CÞRµmÑßyF½¥¦%Ë5ä z2£·Ê,Àй qæÚñ&ïÛòä–áu{É ç8ãà ìÚ §áÇmYõÔm$Ù—ø1f2³û`ê3¼h[-,†妬ò¶2ï8@Š‹I^„`gZA¨d0f´²÷rã°†ääTÛMíÓ‘„x—ít4\v:²o¾ 7‰3açp帶Xœwjx`!÷ņ¯KŒÈ­ÙâÙ[»fûf°÷4&pð;—t­óš>,áÔM¨ºìm+·sïMþW¡ÈÁ|†Þ²f£¾¢(|StåUѽ"cÀ¨©wQÓ¬4¼ÃRrÔa` Á!ÜR§­ ÖEéyÊN—ŧ­1ç·È×(ª[ç §” /oͳ”îÕä ‹ÜÃcØübƒI7}Â2‰ôbd @ÄUÓu% ^Lèijç.rJ$,¥Â]6LþåOÿÓ'Z] endstream endobj 303 0 obj <> stream xÚÕX[“ã4~çWø §˜htõ……‡Ú`((^6C{tü0¬3Q*ò”f R‘²Ó¿Ì‰ÊD F K> K¦à §‚²OÂ|2‘`ó0­f~n”°.Ì¿\d&n‹‚M^Å}¿"|qGŠÍjsáux™½ÌrôuŽdWç¡“ÿ§Æ+wr%µÓÛ©tðaèDhóAáüâ| eÄú¾<ìÙªAÌï:‹‹–'q2Ú€µp Ÿ¡þÅer®‹û2‚¬ŸÝ—9=ÔŒHò“¢w×ß"hy| Ûÿ×ýÿGÓÔË1\à×?_wßÏÿŒ°œ’éR+@OƒÀT$š–Û0âó4>ìüaè ŸÆ÷`Çßè"„v,œ¦’¸Û1ÇÔ<ô_ðÛ›E¸Jñ{Äû»»ª\‡3‡ên»CÛ¯}ë«°.¨¾'!UÄtÓ_ùþ¡¬Jß¾%Wå8D&¶ šWNäÖdÂñ¥{ƒ¢ln㮩Àà Æ!áa!/øú;nïÚ$íy°Š•P«ÅoؼÇðcÙa›q´H* „Aý®_£#;Î_õEÇcÄWyô“–Ð@‘~3ux9x4ïõ³@k»rží>Gá7¨¸ó‡²Û¾å0"€¡%‹9>àKUÖ…o¹¿nj°Ô—5Š?tÃU¯„^-ž2åŒF X„Ä[ÖAó®(ÏX·ãî+DÃnQ–Thw{p¥è0ÚÞÚw÷(ȡݗu¹/4ššRœk¹­|{{&ÄÎ ñgBŽ»Î?–"²ó›Ù°à¿ÅúP8¾íë5 æQˆE1d¦”l9Xal‚døh› Bas ãUÚÆß|¡mÒSh&’cªb›tÂèçßÕ,œŠ‘nThxK7%|ÀðÀ"*Ù 'áŒáš–&öð-O®Ð€g&Aʇèxôt.é”aëklOOÕÜrèÓ¹Ãa×ì î=b2å05Óüq#üfS"àBá|´Åë¾lÒN “_ÁÁZRÂ{(š ôóÅ×ßýÂUî®ë÷Ä0`RÆíÕ#çðëÎ<Ýyô ?m›vjûÊs„°tn›vSÖÈ4ZÅw}[y¢9ø:Ž…óˆ|Ä{x3QˆÔ4Ÿ×U¿¡»!ÍFdÅC$1“>âz˜8#-9Ú9üÉÞÓµ„ 2|óf°†/˜è&£D7%Ê|NÇp:Gsg÷ĈdÀ‰T›øË!k†ÇJZ0ÊÚŒÂÊ‚">ïØ#æ†6ìT2Ú)ø9Ç›%c'ñfµ;¹„󯆺v .œ¢ë$,Éâ o\`µŽovp2μ;E.z ÇŒWýÒš<Þ¾îx:„ô<7l7q.%wásáÃæÌP†¶PÔ†“Ëô ™,Þ›iš7>ò)”ÄCVÄ1ÜOžƒê¦Æ3ˆ½¼ŽÆý~¨3á.'oi Z1б!’Ø5}pÍ]?”AO'žd8öá†cpfɲ¯î"7 / vêŠþ¥¬7"0â.·R‹4P¹ TþcÇœšºpQ#«Ã éc¢c[LD*‹IhŽAÂ2"@¨P$ÖÅ/ڲز´âÁïïf÷m¸"œpœ~…“LnÈ-É1Œ-&ýmw`&€(£ 3mè!Ác»m›=¯b—ðç]Ñ~¦I ë&ÀˆÔ¡ÅxyR=üxÛ ÛÈX¡ŒòèÓ9×!#â^…ÍÉ“ÉE2áðpÑÏÖ- NB¢Ç2-7ª`4Vò©‚ûXšè³Ò$±Ÿ R¡°4 +>eZÅɬå‰0É;uÙ‘.=¯Ë=Ò¥c{IWzµ_fF¤7eà¦9-ëúSît<‡sÊøC-’+UW8ûÞ^ê+vï½·ÍÌ< L== <~½Šd%9X—¹f’4ÍG1öÔÕ&ª¿0²ôu'FÇî> Ïr‘MžGôœ…îôfø.Í“À›1ú}€7O?Ñõ^TežÞ\ ¼€×ÆásÑlpü´r¿+Úðšx,g’‚cå[7õ².ný±À›ó.‹ZrÌaþØÁ™ú™&“sOø)Ÿ£¿ÅJ9g $,©ž9[ˆ9óQ¦W™£&æ@š™bN wàú{H­4ôù&&ë5Îm,çЫtCB*í©À$ìu‡•]f9e𧘠ù6LSH½GõšÀ<Ùr©@ók_Ÿôeñ¥T¨ð]I)¯„¿© î½J2è‡ ¬mÈîM¿9–š0¿õR­'“‰ £ô-oСZ#¡Bv·iËÛ’ÊV ¥’¯ÊÃH´Ä!— ¸Ìųóéø²uÚ |ÚòõLMßã›Ëͯ’ø.Ã&¢Ý§“tÛMÒ8zŠY&i*²||SÂêï?úÄ endstream endobj 310 0 obj <> stream xÚ½XmoÛ6þ¾_!d_ä6bù"RÒÒ芮è–béšê"m%V¦G’·ûó;Š”,Ë”£fYР¢ÈãsϽèȳuc Ã?byþ°5O­_έg¿r‹`àÀ:¿´X€„k9rBXç‹Ovnâ4þM>Ÿÿ²„t„‰Ë  Íçµô7-Ö…ô÷A­\~1q¨çÙ›Ð(E.Ó‚›F˜¢À“ËQª`µ1hòV+ñ”Qb #s˜8¨Ëíè¢f]¼§‹Úî.o´]Ì Ë¡.–ñ%µX¹žMÎíëh^MƘ]åæ¹ˆ ØI‘ŠçÊhK@Ú™"COGXàÞW{ë?„Ľ3$w(ñF[ÂLNÀå E¤×¤Ø‘‹:I¹1ôîÚÉø°®uñÿÓѤëèÂìh¾u´|è#ú™>¢ŸÅÃùy·¸@Í÷¤”‡hP‹…ÙBÕ”™¬×v¾Î¥œpíüR-|™@í ‹8œ%Q©AE—ðò|À&û5æcL†Ê~™çê|X)F¸9¦˜ºK QxƒD0ž@¹¤ÂÆ0(Šž·¶ëÙÚøãh“ZZ‘ç”›ÒûÔ@ÔGnSF”Gt»gîxÏúm©Ú‰U€|2Þ³By– zÖ÷Ô³ôQ=ËîçY¯­M=ÏšÒlȳL{Öòlð ŽeäØ^¹+‘¥!_U¥ÛeTï—ŒÈH(¬Õ øFÈ`RO¿˜ ¦N„[—«p½‰“8,¾ª*¶[½`ŠÚS»È'P-nËéäXMÉ*h¬¸b{]ºûîhÌWÜVDcÀ"uù¼ã[0÷>`ÌxWgð·þ+«b=¯ÖE˜˜Ê=5µçy²N3ðRßå>¢¾´r…w¾”x”ÛÑ&LW‰~y¥«"¿*ÂT½”Kˆ†gßfòÕ­Ï!ߎ5©æÖe­„ßœžý®F/ÏÞªA‘¯«8SÂŽ35›‹¨PC¸-+EyòE‚F ´ZÆôô¬¥5stà(p»õ!‰ReëësÝYýùFŠ+Õ[uü—C1C0µMŒz§ÜÔÈsˆA „Ü åá+ÁJþÙ¸ðŲvšË7n?yVÃàú¨Õפãlž¬‘’^V‹8GËŸÁmo·/˜Ä³1’WÉêT­HÆY¥DÒ0Φö—<^L'ûpÿ@<HÎ…t°¶%\ÊR_}C­¼†åv~"OálÇŸÕÄu;q²¯f‘¯gI¤â·ó›~nH3 Í€è ÞòP/ÉOðyqϵ“•’}¡Òy…UTÛ3µ§Ÿ’6Û¥|UµðE¦Ñµú#á#3ëCä³ë‹E\tà{¸x÷ò£y¿ÛÝ.E5o»™™·ñ¾ZØÖ'Þ8òh5À]˜@fp¹4€H#þ:Ó/p÷k–áôÀftoÅ&ÄG7ýéaŠb˜b0‚"k(}ŠMb‰‚ÝàGv˜#æHH^föBhŸìL‘ a&˜IrúÇžuö¹}pùõÌóèÒN†aøSÛTÛÐ!SÅSé}MõF˜Ú€‹A„¥mÆnØPÊ#,e÷´”â–6àî J›öòŒù¼SÝIç°1¯ÈÓe»B0Ç6ܶNÔŒ:¹Aè9Þ“êã]J´C‰Rê­Ð-%:ŠýJ¬C‰ Rê­°-%6ŠûJn‡’köÅõÞJ'pýl DûLJ(ñ%nöÅõÞJ‡ïÙO ”Ø^.ÑC”D‡’ô’Ì%ÑSæ½ÔÏ%w‡\vo,Äߺ•ô\¨µR‹ø¢í{b}°ÞëÛ°°àÎíùuû=7\ÆôÞÔÛ½A+Yo{s&ñ@ÊŠæç§·ò‡+îÚ_'ÐHäkõr½.+5Ê¢HþäÅucÀ›ÆÀ¯¨Ûxæ…Z~÷VOÄYY…Ù<’M#÷wñÓP¾}U/·E\Ejs\5{5ØÙ‡]ôWg§¯?ªa£ø2/Ò°Rsê÷9.Û•HC@7¤ù/#Ý­(ls@µIÔlÉxá„IžÁ&àmT(é9ŸÏªP’”ã°…Ö*ÏÐÄqY-l˜äBóL¥Íë¹ü©Ð G,5nœFÎ<ÏÊugWJ¾Z†Zƒî·KêWêqWK5ªMÙKrÕý¹´íþÐN‚ìüHW{hâáyÈW?z’6Þÿð/›u“ endstream endobj 314 0 obj <> stream xÚ¥ZmÛÆþÞ_!(B:šûFrôC4ŠKê €/¸ò$ÞÏ”¨”}6šÿž™]rI­NJ &¹/ó>óÌ®¼øuÁ üa‹ŒÃßd±Þ.¾¿Y¼ù©Eë4]Ü<ÀôKàcq³yu<ûv ßRGUñ.ûey¥¸ŠþB±¢çóÑ ·3EëϰD%“ïhäÍ7vÑ;±âóUôùÍ›å/7ÿ˜‹”{"åaÆÏG3b)Ÿ1S‘øJÌW½&’öDÒ'­¤OФgÌÒ •æ"¥¯ˆ$'Òc½¿«›bs·-ú¶z¹ê½e¬í³*‘n—ßùT•¥Ê|ª]µÝ×¥Oñ§Ÿ¯¯g;<Üíü<1Òy,û»æþùîCQ#­„#ð‚ÖM}·o«­';AJ¤ø¥¤ø Rj %.%%NJ)X¿ën£¯nowSkýùцÅÌã8?1.fã@ú«•‘BòXd¾$Ÿœx¬Q÷2ˆ~u´«™›².ûToî}Ÿò<æÒßÖ–ý¡ÝùÄÒöQÜýæÌÅY¬¹¢¼QÙÈ01b¹²y6Ñ$=ˆ‚ñX§lÖ²±§ú_0PÌsw: A’ Is^Ín)Ï2å9¡Mî0`‘)7NM™rƒL¹E1Xâ ^MÂÚ™rwb€ÁP? ó™`E7˜Žš/ü ^mØY…Â$ùX•_Äõ%ÏÕFË84Êó œÏAØIâø4©ä…C²cxš‰nuK«zG fÓ—â#ÌÔN\BhyAÈf¹w~åìË#V‡+«t^Ú·åžÂäÛ5»«Ïe‹Ñ**k¯á4óX5qÆÞY`Nﺾ-ª!™a];ÒümTÅ%6·\Ï×Òu…”1ŸxÕ6ó ‹¦º]bökýÛ–Á+!1§6ÕÚ„¸JH6©£²Xã’'û5ê@{HW‰BMk’S%”p0FzÁKѶrþÎçÎIUq&Ê1¢ÔXÜ‘ú(·aˆ¢ž§´Ãë‚W%”Yœ¸ ý\œmÄ͹ŒBŽNÆZ‡mÙVë¢&f–€éE} F—Î^ø\7m[v{JPÊ\p1=æÌÎ<-™¶¸¾P)!Ó™ŠöŒÙ Z˜•Ç„:tþè ÙpñÓ‰Ç1»U⮤ñ<íV)Ó1÷.•¼›ûÐ¥’sÛ´'p®yª\À#KÜßÓj¸ºµ÷H8ðÐ6ÛA°ÎŠfb|%óC}ìÜ)TÅ“ä´¹ÛØK—Ë®óŽÊáOCc¥­1ÆDmо ·'#ÄÓêàˆ²º4®„O[J $ RÑÀ´…O}¹R_.Sä” SÎÚle· ûφ„W5ô¨âÔ)DN"Ãí²XúXùj¬À_Iÿ’~ °É%©šD VÎŽž>t´im§ÖÒ0ZÒ> stream xÚµXKsÛF ¾÷WèÐÕ„+trp:ãÖÓV9Õ -­$Æ©T÷×Xì’”LÇv'µ=Ã}` ðèÉÇ ŸðË'±€¿`²ØN~šOfg<œ$,¢É|Û>`2™/ÿò~˜ú"Ê ^L}Æ¡W]ø”S?¡÷Ò®,p?úYØÕ¼\é¬y@7¯¼àj:ý{þ˸jñ5Õ1“î.ßHõåÛùùo'(£¼?//ÞÍÏ/ßЉ³Ëwo^¹‚³”›ÿìKŠ¥D»~¤ÙÞY‚Úë6ÅÁf±(Šb·)6£wvNÐÔ Åhñ¥ lOX¨Œ%gy™Åí4‘Þs8ÆS¯Ý詯`Þ´Y«·ºœŠØkí]<^Æ%KSx3¼¨‘ñˆ>!˜ ­Ä5xµèuÔÕ¾ÍK=v{²0±G×ÅîýRºÕïwuu=¢¤Sn¥ñEDà}Þä ´}C:WµÖV=Bê;;¶z[Õ·æ^_ É’œ$“@¾xÅð ­^N})•×Vø´Wà +ô–vÁF? ½zÑ2sëÏs›: ÜÆÒ0t¹ b£…3É’bwZmwy‘—ëûc(À?tpnLP±÷úâí¯4ÚeæÕo¦`D¶6Û‘·AãnëT%„F‰·ÑÙR×´zpUŒÆDpÅ8ïƒrÃ6#JÅdÔÇB†| ´¤ÙTûbIÚÀS"ñ¬AÙTDÞ§iyY^dàO’¯J²rѹÅJ›€‰H1Å)`¡ÑzJ!¹òªšF§ÏžAæº8­ëÌÆißÐe°n£“·ç´kÑÙP¹#–óˆ ‹f@MïD['¼¡µ¼„œ* !3=:¿Ô«l_´41Kr9¼þX0TÙoý<Û7õ¬¨ Çfy¹(öK=†œ@² DjP§|U!Ê!FŸÉ%hNow9ÜjS<¥COCD¶YiB)¼mfà„ã*ÀÏÚʘ¼'…R£*ô{’ÊT.¯@Pɶ»ÂNNéÑÇP¡×šE_›%-ÒËhZœœ€Ã¼ÝX;Üý¯ß¼£3§]e¾Y¿8Ìáƒ"3˜ûBèéÐ÷T~׋ |ûlÌ{°ÅH`|ÎÄ1´F .RÎCÙ—²À•\ž©WV*%9\ Â äpÒW9€ÄA…ª—\Tu­›ùµ\˜òªVO+F„‘å%‰€¶¼¥§K{”sð0¸Káã·H”Œ7%sEZøHÕ—]›ê.RnRw½õa*XìrÀ?¯¯]’T;ë Ô±rÕÄBò¨ˆ•kî â|¶ªªÙuVÏ0”>Ö°KÝÿŽ›’,ÌJ—‰à³EÖè#¯‘»¨´˜-À !±¼¿Å< ›E†Íla½Ÿ!TÂb×áÕˆáPºažNRÄXrAJKyyó$z WáƒÔ+òë:CÄⲩΰ˜Ñ¡°'îOBìڸΤc6bNȱ‹po Ѐ–.K«ë¶«!eÄ‘‘áÈ öšýngr¤ª[+½ÉjSà@˜Þ ×ÖvlmsIˆˆ©è0™`èË2¸hl“Qä;°ô Oéºé0R­ŽZçÆ11KŽýÓŒA!Œ™pˆa¶½ö…J™àÇd+\=ÂAC=Æ KSÚîuåÎÜð ÃBsÖÁtÀ° z¬ 0ç;rqÐë="Wó"r…ÙQ)1-TÓm<"Š–\12¶:B‹tc‹Ö³JÇ| Õ3k_Gº£;Ì k©6/Ó1+Üš­3t> YšÁÊÃ5SÁS‰ÑšÙª‚Ê·¤U¸?±¤Æ]IÀQ'œÞäŽ7q¡<:Øó&ž yS½dÏ›IÏ›xÀ7Øo¢Vúìò]çÙa¡ëŸÁ±P¸‡7åÝÏ„V¢Lñ5Ê<PæÅÿK™*JX Ç)óâ.e~#`¼ÒÔØh ôHe[ˆ òÀz_w|)l-ì’IŒ|qInœÜÝ7È®Þà>@Ä€žä°©†cµþ¸Ï]¥¿ r½©'Š÷Å(¢ÞO@Ã;øC1êµÄn8 œ:¼‰a_D ÂôþK»6@Ê·Uw»³Ë! S î<$!D.RO®ëíîI¨8êé¼­j›:K YZ4–8m=Ü·®³ºƒeӌҨ|yŽ€œ¯­ÞÛ H¿8Ñ?èþxmõš¼vÐl÷‰JðõD'ýq<9vÐnzîŒ\ë§hWÐÀjçJ=¬>5qpì°Q<ü7S‚9àG1t¶Y”Nú÷ïþ’#Ir endstream endobj 322 0 obj <> stream xÚWÛŽÛ6}ïWè‹ ¬U‘Ôµ( $Elië·¦\›^ +K.)eã¿ÏÜèKÖHƒ,¢áp8œž9¤“ÿ•äðO%µ†¿’Ì$¿Ì!VÕ«J²ÅXM‘nǾ1Øçðã5Ì.«® 4 ”(o3Åó½g±,l?ñIüüU šÂdæ T-@}ã=¥Š0 õÝðø-@½ßbÞõ©Í©¼t%ElÜe ¼ÌÁ®ƒçÀs\ì|ôXmYBˆGé`C`$4D?û!ø¢Ò}·¶Ø¯t{Øm{¼ÚiÐ Åé0.”?. ‘ÇnÁsÕZÌ{çé¸uѤܞŽ>O¢·ømSï¦ÙC2ºÌ‰â6.`–ªNW;òàôtÅœ€v£§&Ãå˜~ÞAPÒ8„6ɾކeA¦XZ\~UZ^L ó¬0Ö‹´ÎI4év³n‚¶FàÞq§_²šxÇ&aæ¿õDÈ6R~øFb¤Á©'îxáÓþvŒžàˆ{>°–.‰»æã…Q±š¬4”ÇßÂȦÑé0æ¼ì%B HOÝ vxX¦1ÔÆžU'ò Q\2s×â’àÞfrÐDDžüé«þ‡¡ô?H§þoLDßíÞæ~©¾$„ª½è—Nõ~‹å¬k``Ïóî“Ð;Q‹ŸöK?Í8‹µ¬&¥œA™T‘ _ ˆŽ\ç{‹ééxÍ£´õãž%;ð·óÄâé6ÅÌ1š8†n»+7 9Z}$m$G(qÀ œ©Žß£'þFŸ Q0z™R…‘£6q'æ0[é‘gDþ8_¥¦ˆ \žx°|Ƀ¬†“ó‹wØ»Ø_hÜ„`¦îøK¥C!NiΊ@"kwi,P}$ú޽M\ð¼8̽廠VÌŽDW ޵VÜI£„»@yÁ]ŠÜ]Ÿny^¸©&ˆÖxåŒñçˆR—wxaÂÃÁõéVù|­ÌScÖ¹ä »õnxœv·üV%ü’‹¨¾í6þ^ˆyždz-×øç \W]¡¬ä²ªë¬á߉ªˆÖ~÷ªßC endstream endobj 327 0 obj <> stream xÚ•X[ë¶~ï¯ð£œ¬‘¢n-úMpÚئûv|PÐw­T]RÎÙ òã;Ã!eiW{vl€÷™á\¾jó¿ ߤðã›RÀ?Ý4§Íßî6ßýoxÊê´ÞÜÝÃòÅæ®ý˜(kÕV”ÉÓv—É: ´yš8sÒØãÉ?Ýþ“澿ý@SÖ\ÆnÐ78’ÉxÔ´Þ«qÔ–¶èÇóv'ªD7££Õß ¥qcN¸¥LÌ ‡­(¿q&ÂÐàÜ«F·D»?ãw4jìÌà¶ŸîþåÕ³›f,ÏýM?òOaÓ\B°•†[nÖˆ¬(ÃúãGñ‰‰Â.˲„mw¼(M±N]”¬ª&òÃÛzújh©CÊÏ$)£ ÊXcTUŒ_¥«Œ ÔmŒ=©¾"6£v0#u.N·Ì“؉T°´MW,ÏüÙ»m•%(ÜÝ;—·½éZšê†V?vÃŽÀÀÖëÂÊHs£öd\˜iŒ÷ '†=¦JÆÀbhŸo·ºïÔ¡×4 µ­nzeãä1t®°¢µ¬ÎY.¢ÚVtV±"ªL…[Ü›¬?»?û¿£ \Pæ%ÚcWp–—þxk.^â\äè«ßŸþ²ÂoÎ]µí ]Áß诡ƒùFrÌøUÖpÅì…„ß<’t‹c´65/6<ÒÊ_©iPÔfŸÀ]ohÆu¿ks¿œöÛýö\ÞRÒ‡°ƒ@ÅŒG6ÊiG]€¡]#8tÅaÖ܃ç%+ê7£ª”aK˜Yí´%D  6ÕH=5Ù&@ŸrÎG JÀ–/p›%ZO M¸šLfs-zEw‰}Q=u?c¤) °' d¶ðzÃ%ËdàUÀ=Kî &ç¸É­5`½P+óĀʋ,ù E9g#ŸEjkÃâÐÒâI ê!ÎvÃ.T' Ë¬ Ø¡ëC:Pe#—D±ï½;„=ØóØ# 9a(¦¹£­RÏç¾ ÂŸ¸ª VÝÑ\ú–M€oiu”¯l¼"9]`Ó`ÝËìçu.^Õ9D—ïR¹Œ5å,RpÛY°°×ˆê…éé*0IЋ³f <€0®Råo"æ`q'Eê—ApX=ó(ÎG‰7vnµbý£.ÖÐbA&߬Awz-¡Ûæ9xÒE»ý6@–”ˆ;kužR –P•ºÎ!Æ= gò *× §ü¨¤Nl¤s¾ ð%×Ù‘›WO”‹Hø®ý“q:cwáÖ]“€XR™Þ3rrNnʳc˺œ’sV£Å|á KxWU±p`Ü—ù²tÄ2pö/”P W“ÑÖ2¾¸bö2ჳ8Ÿî‘Í‹Š³,¾™ü ®¥ Ým1%C"ìº#AÔ5¤Çï¼D]ù,„ZKóy…€+±nã÷utÖ?Pêø&©««àê=<ÅÄ%@‡,´„´>àZÊiÆ÷Û?°ÍAiÒéà”ÿïÕ,‡¾üòcèØ‡—ß xNšƒÆIÓÀáz®* Nœº‰eŃþæuÁ¤˜Ó©ßd-RŽêÙŒtˆrÄí•0‰eLÓ_ZížU!ˆ‹)ˆEütQ…O×X†À §| öZÒ}¢.#eɪš"4»ÿõ§ÿ)€ endstream endobj 334 0 obj <> stream xÚ½Yß“£¸~Ï_áG\µæîžrU¹Ô¦R¹änò߃kl6À;3©üñé›™Ý}¹š©B –Ôj}ýu·¼ùÏFlø›\²©šÍ›ï~Ê6"‰Ë¤Ü< ‡ï„ÖÑ÷øÈù1½ýÀfe…4 é¦Ä©Ä¢(…¸=™_ÖM‚=t@ØøJHp¼ì÷³@»f$ÎË¥žOÖíÍjig‹kÖ5ÑŒ«;žEÖÔ:`MÒ(Pïj Lªjƒc§j¬?ã¹Øóë¶PÑöîñ䈥ºöàt(ܳrˆìÇž+f¿Á·‰&œßðKÝòìn™4ºôpYãf‚‰3}ÝViÁ³îD ¿¾"ˆ¨;×L¡€Lc×X!/â" Y!9NO¬ ͬÀ]ÐlÌXwŒbQD—kÏ„× i@¥eôp²¯<Àœ‡Žå*Óò'æf·Öuà5Šyyè°J…gœUhRygÒ¯³ÑÃ6×’ÀLÌîÂO„±h”{Hu¬=²èŒ“,TÞö‘¹¾ÔçÚôh„DcÉÀ¼µ3ö[–âÕ 1#D÷Ñ0ö×j¼ödß7ÓYAþ\ΦníÁS¨ŒuÚʸøƒGúyë {„…¬Û¯ú޽èO.Êÿòg×è÷q¾„V«dy\ZFÄbCWF‰DÅ¥X sÑùbŽö–i'éb¢òË«+«r1h¿]ÅÊNHæ =ªB pŒÎr£×СÓ8— ‡[;ƒƒ{>ïÁ}ίÜËÀ‡NL(ÜÞÒÆ„qµ¤ O13;u-ÀÇÔ!A·öõ otÇêû8;4ˆËŒñ‚©ÓÈï8÷š?%eœçÞ ?YtäNÔDAqmgPÝ9P‘º‘u[¯r@XËqé”IåÐï20¡-ãsæDäkN+%:³ ä{ºªS<—%;)dœ-ØßLYbfŽ”Ï'`O~ré%ΩZ;,l‡pë¦þ¯7!œÂ¡îG¹L·Ž-£RQS·7 y™z<.ïIký0¤Œ}8%œ °u;r"Á(X?Ô‡þ÷ñݬFÜÝf´uˆK?Ñ>IVÓ 4‘½µ§4mhÚãõlÐBºð[ ¯õyäÏ„xÞaÄÞ@ÃÚîT§S~ì%ÒMŽDG R®á$b­ØRŸÖ‚i,óÍ$‚(‚3£hN<Á,Ä„ZÆ4†×a¤ B"í¾=XãÂär¿4Cˆ% ð¿âežR2ކɾšâe‘㠣Р¢üV†‡!qš…ó|™àÁÅÁ ‚!èF`ð܆ &™06ñß rŸèÔ.Gñ¬·s“ÎÇuŸ™eÄB¿‡ÅéxZùî¹ìjô ÓŽÏ™›‡7Øàç¶² Ðävˆš™#Yìd†E fÝn«ÞšÑR©,“y2s¹@鹊g?ö¦áɦ|ÎT•Üļ-44{Þ¡~zeqCäþêÒ·•ɪU×pþݵg߇¸Ef Ó›E6îiÓ?Öà”€á,ýÁº’DÈ Ù¨Äõ©°†Ç©ä )†?¨tÄ“Í@8É3¿XŠ×+ÔÅ[’–6ïq5,êh†ÒL7¿0?¾ãkók¨q‹ í”ÇfjLF‘…^‚?ü›â£½ ,\‡!?ôöŒÇïæìxÐ4·¯xtDÓ©èT®Xhðâ<±Ï>Ú08×£/p8οŽdw ÒûÛƒ•”Ç9ÇhFȦ޹IqÚ‘°Óîk‡rVDçµ ë¶þ{t}L.fÿfÄ÷³¼ƒ,-ŠþÝ3;4[R L ®qÖ„o’58ÃrÚ‡b¢@µr‘ÉR‰*¾ÑZ² UB™06Üoǧµm7~s.«ó™ ñÄÈWò<ô•¼|¼Pœ¨› ·7«@Öt?vé놪¼pk¼ÁÆá Õ{“C>21÷áúÅ©3gÁUb |V"™ÇA† !!~Ân ŒLãÅUÀP7—³}A§"˜$Dà\=õüÞqJ‘ø”" SŠÄg‰^dI>Ïs ”KÑéºáΜ¸ï™Gœw&3“œª1wCï°åéÂs é2:x>Y¥)¡)0à…r'–šíä5TŸI§6t¹ƒ’Ҹ܉/þ‡¹6æï¦qãžüÜævÖ:Ø — Ëx‰z×KÔ\HÝ„­,á°…OR0KÔäI³xATƒªŽÑ°åW¢ Jº¹h¸g¥ §«—JÏ¡é¯ÿ\[WA*æv‹ a1ƒ+à–pÍÞP“¥¡)—±Y뉲 ûYb5éÝG{Ücíx;Ûœh휞JLOu>Q™Êœt~—Zh=Ût9tq§’ÊÓ[¿U¹ üvàî÷å’½ËÈCÁ­Zl9¬.‡²Èhû¦n!n¡ÔdÚÁw@c.£Püi¼öNΜÏÞ•ï¶±¬¼1!9ôÖ]šðK©_4Õ3ÛàWó4’–iæATYäPYàrh¸gï~½JñZÔ Í>p¾ÌÃ2íqZšf^±ÿô«WÖ|;½È®ç‹'á.žòpÀ¥Á• 9'Â"›îÃ3g6G&BEþWCt*ºÂ3 4üû¸#Óñå;^"›ó«« 2olN¸Û昘ßL9—¿uN©¯ƒ¡ûjBÛŽU쯬|yµ¸]§ê<‹’ï´—þÇþàíóõ endstream endobj 337 0 obj <> stream xÚ¥VMÛ6½÷WèH1+R¢>rlÑ)Ú"|«{ ez-D–\}d ?¾3œ¡,9ΦI± ˜ßoÞ ý©(†?åþ㨺D?ì¢ï6‘Še—Ñî)#Ë4Ú¢!‹vÇ?Åîì6í~7/üt"`èrؘXØ¡®6Û4IÅÐ5ÓXw-~e¢ÂÉîrÝ%ºÖµãÀp«¨º”Z3\ÝVÍtt°\åâÚ×Ûึ=â ljL…x¿1©°ÍärïNd·MX3}¨›ÚöÙ †±Ÿªqê·³UY!‚ßDã·ÐFؾ¶‡Ñ“D‹S×ã #ƒD\ºa¤Qï*×nt.Ææ#YºÃhëÖéë@á0$}èŸv”•FJÉ£Ÿ€‰­)dî7¢¥–Éf«”6âM»I”]_wýö pÀm ¶Xà6r ß=]ðLÙÕFšâÅìj›9s8ã£a$ØÊàð£=Œ2a„ª#b€ R—`zÃ| øè؆åBCøU¡~¼S‹gb^áÙx>©0q¸,\å“À¶œæ4“º\¦™¢ø´Œvœ<0|x¡à Ó>I€8Z %‚ô® ;,¸ÀM— @7¹½¬ •@zô¬”µñÛ›·¨3k@ý_ ¤¡$ Ú_Hz–I“Ù t®iе¡2æ:"\Ïrç¾ÀÁ·išÂ–hù¬gRÌ)^SB‹B–˜O¨ÞÄÇý2’i¦ 'ö]Ý!¯è?p7qÝ(ó_¹žE[°háœÖÆ íµ åã[''M :Î#ös™…¢=º}¬Ò›¨V\%VIªcæ;¦Öb/jé€ö<.WšÄ¹•&÷³½£ÙPÄO®çß\?‡+¨úâL–ŲúBk@¬BLÝÄ…kè‹²ÛØñï9D"µ1ÈMð6ñë[æšÏ2SÝ»Æ~°¸€¥º¸â}ÿÂ;tœ œ%æëƲð5í ¦™wXq½6ueoÎÿÔÛËgHýq‚³.^t*@)¼•l:œŸèÏøí)E7’áçu$GŸenH¬ãÛE4âÁVCžè—ט=ÑÏv ƒ¿oœ A\©[ …ôê3d×,Äʶ´a|¨H¸ÄhKÜŸC—/³êÂn³<—EéáU¼ÿøî_)¹Sº endstream endobj 340 0 obj <> stream xÚíVMÛ6½÷W=ÉÅš¿ôÞŠ6@‹ H÷T,Ó¶¶äål ôÇwÈ¡$jWk%䨀8ÔÌ›á#ç‰ÁC@ƒ~4Hü£ 8?­‚W¯³€ ÂE¬vðzI#’ÁxûWÈ_,)e"|ÛÔ›£:-–<‘aѨ¼-«=ZyµÅÁ©†' ·åîÚ¿lê x*½ø{õ[ðË óQPJ2)]B‘8ëjSÊpëò ›~MØËTŒ?`A(ýÁ˜XŽ]‡ër»^ü8™¡hJ$·X?+]4å¹-ëÊùK?³$™ðÝWX³`¼;.fTnÌ`ÿ»:½Â&ð³ÈGÞj„ÏñQ©G3ÅÆ°+—–â;˜qøx(‹K†•UÙ–ùñxEÿÒ®×êtnßõ{(Ã’(bëZÒ8%ŽåÄ(èCçPEϦ6±n[E}¼œ*M&øŽ|îþPí¥©ô'ÓÌ3ÑÓ äwöMŽóbÉÒ°.+SZ«ôlk|Ûv8Hî Ë_Üóe>&\êËÑ9olsÑ$Ä2lâ«‹»l´z¸(,ÆñêÖÖÓZ›’“P5¹9t–L(©B.ÛCéèõŠ$7…†±ˆ0Ú+ ›WÑAjœ=£5^­ÚgØ)%\zØ©$<Åö¼vß)#úFè™g³ð¾›Ã¯ò“)Y®u¹¯p¼‹àäW{µ^ ÛHÝlô”®t‰>_ÖX ß)fcŒp¡¨é–­n|0I×OUïí 8C­òƽµ!_P9‹nI ´Dz*8ZÊTøL¥± À 1mÀ¨msȵ/?šžRšúz2æÆvR}„æ(‚BÍIê@_HÌb"¨sY‡Ñ/gÌmUl&%N FäM^€Òh{@à5ºQ+6¶åÁ ɨçµëù¢\GTX áþÉšê÷gÄÿº3y¤5‡g¨ä¤ŒèM¬ú1ó‹ïH/õ$…°-™óøýÏ7o^IœKÝ`…ýgMÝ6pwº3F:T?H; †ZitÏ+7÷O©Ý ,»å±Ýò·ÜN»v6s»îCFɈ|Ìßæû%}åÀ$ëå•ÏË+ ÚjŒaÜÐUury tpq öBÆÂû‰»¡$¬‡¦QFØ ¶çãÀ?[M½ë!´4§¡ ß]ªÂ*Ðm™uü™Ãé 2[oî¿J••éÍ‹&Ü“'*Û­dê² ¤‰g )r|ø æ§i,|X›•™”4V&¨±ÅŠ§ÌœÆÂĄƂ;º¥žÆR8 Ùè^5ÜŠÝB°Ñ½“eÚ~×]´Šð7iþ¤ùɿŏy¬ß¼±DÉRƒ¶Œ“ÄbPiÚy¿ûî?˜æ; endstream endobj 343 0 obj <> stream xÚµXÝoÛ6ß_!ìI"V$E}¬O+ÖÖ¢]ó0`Ŧu¶äJr“ûãwÇ;É’-ÇéCÐ&OÇû ï~÷k½/žôBø#½DÁßÐ[l¼W—Þ‹72ò¤™1Þå ¾2Yì].ÿö•Ð"šR*ã߬·³.÷^_z_<¡³Ô»óL&ÒÈHboãÅZ¤I·]{Ÿ¼öJ줱í‘áT mö†S#tzÎð^‰ W׳ Vþç#ë24B ÌË0ê¬ý;Xõ,ÐIäÿ‡?Æeâs1Ó¡›—7v>#jÛ›â[ÞUIZpÜ.öÛy(M~ã‚}ñ&õÐM˜¡ã ó¬Œ0‰óü顬¶MÑt©Q´ÃC2°Œ!ùZËY`è%¯ Ô«êúóÄ0w‚m×…ŸúpA‹¢liJ³—“‘‘™ £—_m³¨‹­ËŠôÍ0(#²h¨~ykgJ¿®vmQZ>3ÊŠ,TP—¨ú„‹´#ÖÍÍÇîATLÒà‹ °íœŸ%ƒ§Á-? ­ýBX1 "•ùóycËÆþÈfVô‹v1°@Ƙ¬X?\ÆøŸÑò×™J|p¯µöW»Òùr•û¼¡ßf‹ö|»(Àd—$½ÆDp­(nó:ߨÖÖS¨t,RÃw2}kôޤñó”@éTÀrðv¿ýñáêÝÛ÷Ö"-ÍÖ66/9ŸMQö×ürÒ <ôñË_ßá#¿ï}z…#£ï«–¯­½ÍÛþVºUí/í*ß­ÛN¥»bhµÝà&ò‹‰”ĸA53"Ú£ªyªÂ 5„UÚŸÃÕ½Ÿ|¹<ÖXÈx`; …ÌÎÚh±íºB€»kFø‡Ý¢´w´@5Ù«µI÷W ‡ÒÚuŰk„¾ôû O鬃ËÉ? Ê«ººkÎã^Y7ω{: ýX"tïq¯‹{Â~¢DÚµ/¨5“(‹°kHlŠ‚¡ÛiÀÃAC¸‡ƒ(>«²ië¼(QÜ:ÅîESÉ]‚ Ì‚Ïû‡ÍF æ{(Ì,¡ÁÜcæ ŽXúyn ZòõÊóøzp&îüÁgVÜá#lÉ_£G_ØI×EÓ^`YB"‡&ªzY”ùš¤%‚ðnƒî!„òš£ àñlåÍÈËaeE5S^ ª›TK‚”£êyeáHê.i\ÚœNÒε .úqƒ¸å~Ë¢-òõú¶«ÚZ\EðÒ;÷Ä”Uµ+Á<>¶óU²§Û¼!m»Ù¶ œ‘¤ë# ¼Tp·‡‚qýðks^ûÌ+ºK(xQX®µ—ðºOW›˜˜nìÞjìš‹±ÚX¼zƒã~ʪ òá6ÈPz]”ðÎ7®ÀAq÷½# W‡Ó«kËÅ_9 ìow_¬‹¼~8‘òׄ™×EýA3FK“¬þ×E·$yÇ ®ó¦Xœ¸“·«ƒ¡…ÊloùVõž€j®Ñæ‚YÇ’£]®™¹OŽQ¹  h×Å2oÝ…â‡VLäahÚvW—ÍÓIa”=J S¡žˆRDù©9'!Ó?pÓw6J]žãΦŽÝ6\RW(íÛ ¥ÜÎ[up¼ÃDª‹æ[v‚,>N,"HP©žXÄ牞FÝ ÞŸ!?‹Þ6Ïí3¶Zl{Q­"'I¨ì6%kæê8ô<ÎÈIN‘?S,ž•SD@·ãJÈCNán|¢oàŸþú<§0ï€Ä¦9Eš±Fÿn$`K[ïÐØy(p‰:(t¸ijüHƒðÆal2$(5“ CÊ“ÍlS:Êè,Sfx0ƒôˆ_d¦ç]Æÿ‚Dñ ¸ñŸuƒ¡·OB¦‘”D/†öô¤ ÔôöÀjh=HA½æA€LÃAûÓÙE${vKÇ.bÇ.¢ÙE¤úôPÅ‘‹HȈñîÉ L±–„ßl]±¤dÄ*@2dà‹YEDÜ 5©œ÷çc*fV¡â¤O…˜&Êh@Çn@£> stream xÚåYmoãDþίðGšÅûæ¸ûrE  ªœÄm}Jâ`;×ñã™ÙY¿5›¸íUHÝI±×³3³ÏÌ<³»õþô¸À?îEþÞbí½:÷¾>ÕX$Þù¥Ç5K”7ÅÐ;_þîÿx9™J)ýú:£‡yZå>*ÿ2]ÔE™ÿ•Öy±¡¯Ùm^ÕÕ ½ä5É•Ù:Í7 ~šhí§«|É&œÿæãžùic?fZûï²zWÂ\’u¹ÚŠž£‹*ˆý²ØÕù&³sxß@ÈY(µÚ^¤ËåÅ¢X¹ôG’ñF´´^õ5ÙIü¢\æ›tE/›‰ˆüÝz"b>™ÂsVZ©Ë{ÓfWeUÛiÙ =€»õ†DÁ«lIÃua¯i=€PÀbø‘LkãÛ¶,æ«lMè`ðý˜-jÂ÷ûs 2Wç,Á9—°¨i¢YDL²h2å\h„¤™õ§Çd{7žNX¬Ìzk/”,Žš×•÷Þ{ë0Ð Y#UVï)Ž9“ºSk&ã1ÅU\ø7{Êy±¨§ƒŽhT}OÊêߤkLüHûÓOZUùÕ†žgþ­_§›«l6Á1eâày1³]iníð&6vÞßmŠ-VÖ hýI<Â|„À'ˆ-ÎùTä%šâv_”ÅÍÚœ™Ì úþå›zÈ7µ}°‹bSÙ¡ÅuZZq£cò­ÓuëF[v¯³jQæ[íR)ŽV)¤\"{UÚ_šÃDK+Ná©ÈDJ?Wù§‰ý £…YÝ­±V©J‹U¾p¹ÀyÂx£ô€]2m%f>'[»-ýbÝJ‘øBkX  €0pfVV&[À<ˆ¹ŒK ©Æxî° éÙà3­¯‰”V,ûÌ©&0¥ÓÝm¾ÊÓò®%bå§ež{w@¨²½ò+X8Ÿ-rd-$%ü¼O9aröBnz¤i¶Ã:\‹ZÕ(ð*lੜI&Vâçgg#JŠ’ËÖÛ1»#‡«ºÌ7W'6T÷MâÒŒ2­²ŠžÓÃ&I‰et­«|à‡fÁ±`Kä¢.ØÖÚã/”d¢åøxœãqBÀ;’·ï#,ß™9Âò­jËà#ª{R¤Ú£ƒã eO7B†£Êûbâi,ßtkü~ä3'yGLò$¶Hòÿk$ß,íGòŸLòm&ϱv Ø«â®ôq$ I^=…ä•¶Zñá8Ékà±XçxÁD<Âñ=%ÈñèWã•Ç«XuηofXŽÇgäx3Ör<„ÄòŽàø(é²×ë6Gc}œôU z¤ŸŒ“>Lè_Fè¾3p„îI©eñcJ;«tlCOš› ô1Õ=«{¾YVšÇ±·bQHuÕF>µ÷—ÅʺR}3hœƒu&§Z…‰ç ÃqbÈ™h¦¯lz‹„Kÿ»b½†}§À²¸ÏS œ€©´X$€ªdD Ò¦B›Cȹ€)cñ‡³7§ïlŒÂž¨ê¥Ã,îÜ€„‡„^0·ôóÂuâ”íž÷+‡EÃÒô™»ó7n’ætcð²æb·éíÊÂlIU9Ü©ºRB+Ù`7„ˆœýâZ­Ž° Û PâÏË€2i/xgP.M°Çl7fGw1ςدˆXƒƒAí&7§~0ÝÖÝ.ãÇ®RÚ‡7ÏšFûºŽ$C–3}”{¤)”qPúÜaþ@ñD^¿ú7Óh_‡¹Ò}F¼^›½È´ƒ¢ijý~øpxN{<ú> stream xÚ½YmoãÆþž_Aä•Z[î;Ù&r¹^Ñâ€\'P%Qg2飨ó¹ÈÏ̾Ki%ÙÍ!°‘ËÙÙÙgfg†“ M2ø£‰fðŸ%«ûäÕuò×72¡)²"¹Þ$T’B$sPÉõú?é¿6³9ÏuÚßVx‘§];c:}´£·åÎŽ6­ýݺ§,O«ÎÊ,gs¸k÷Íúj6U=”]y_õ øßëƒ!4,aL‘¼{ÑŠíÒ‰تr'P;;ê÷MÛUk2›«L;ãóç¿x[µ³<ŸXŽËϙ̉¤'Ršu­f)ÏïES"¤³tb+œ‡[ãV$ÍìV`tX·¢ÌV¤æ”ý­>ìËmݣē•XµÍ®ïʺAz;¶HkRýtÔ»j»®Ú=Ø­7ëºyïTï?ÕÛºìž,¹":‘ø8C¡®.—[ÔÄ™5Š‹´EÓ9OŸªµ½éÑŽ'‡÷bvåD›í“{nì‹óAB5ìBÐX°k¿³Fˆôñ¶ÞV/YòÀQ§<™“ùèIƒWpƒ@âFèUe!¹r½ài­…£Y] ÀÞÛ›"Sªô®Zõv *Wˆç­½£<ðBÝÔ}]n=¾›®ª®œy&„€ëwï8©] ®2¢= ÿ|ûîæÍP¸ \9!‹Â?®mî¡"¡”C˜†Ê1 ÍfsJ™Lßoü´ áEž<&J©Ì ™'÷‰ÎÈp·M~J~ˆ,0ȸ5vU¤6ÏI¦Gµ#”^Ò; 9Å«v{¤˜fárÔLáìðâ’ê@Êé^6kô’éoø#Í.ÌÅ"]Íxy­yGÊÊ€%ûûÆ>‡¨áÔä3ïËЕs¿“h.õÓSÓ>ìâž÷•bäm Á+Oy‹a „|!ˆ*`÷J’<îÃ݇‹RP NºŒêÎ5¡ÅEÝ”Ó÷h(§YNÄeí¡˜SŽ[DÁ¡24ŸB•üò ˜[“„uÁWï®ìEÝôöâîp z¨Üغݛ¬×Ûedp¿\Ìþoį«Ýª«úºmâéq5×&ÁAêÚ}_7U,Ôd1vß ÄÀ øêf9r¸F!‰/ ¹³êñlÀ9;s8˜/¦¦ b¥Ä|§R7T6k{1v;;õ,vrð–[ö.b•$Ú[5ïo­¦ápÂõ"…ú¼_õû®ÜúBAMˆ×X³Èﶺ•ÂÕîjUcÁõåTý°é8îVå0š4$Kߨ`ÏhÿJ;vcÓrlˆ îr·këVuÙ{{MÄÇö_è±]ˆ·Q”NÚ(PfÛ(÷zÍ41a+ƒÌÉ@;á…ïºðÚp@xþz‘eÍGMç¹ !‰Ð¸‰œÀ¢Ê€Àú…¶ÉÃB¡5a“6b¬UW:)»@{ÀËÌÐ,œ¢=Ø$F@å¸QHG`ÑqÅ¡ùEQ7¥uB#UƒGý˜ˆ¢Pßyg@ç¢/±‰G;0L‘Rp‰ù!€òÅÜQQ\&©ª)sTäDÑwÄèÀÁ¥áŽóo74èýaÔôþÒsG0pG,ð sÔÌ©#ƒë:-ÿ«º}ÃF>‰:> M:|¿b'ø$éJ‡tÒ¯ À׍?nÖ“‚éSÃôå 9¶Îù*;OD žMG&Š^f¢p $oOE¹Ûó\T°Ì2jÐ숦 ª)§®˜K¨æg…+PzÙôAÆi_µ†Xª6–fz-å ²/@ð´òt•U1¦V5¼†ð̰Õ8¥³ê “]†OàÀÝÇ -eÙ,}Ìf ~Ÿä9å}.´ 9=&µ ñÐ.ïnVmµ1LÎÍs—H13OP)vñ?Ȥ(}ŽIA¶V0)~Cq&EÉ)•¢´¥RtH¥(å’ÊÃüâ^m­ÀÊ6£gÝwxTöÑ”Qô 0*`‰cTæŽMцE ¿ÝLº–€X1ÙK¤ßÚgMõ¶6Û}/Cöñƒà©äü@œ òXø¬ä°ÊÙ# Pýç §†„Œ+,Â~µ8hš¸ôŸýä…ou9¿ÄÝEH5ýº¥Ó ‹…ã>jÍ 6©#¼Tã$Ÿ ü7-msy¶H‹Ým½é¿´Ór×]› x0ô˜§Fæ¦ß™0o›}³ÂƒHN’.¦ï„9 š.GÇ2ê¥øâw„HÈ endstream endobj 352 0 obj <> stream xÚíXßoÛ6~ß_¡GyˆYñ—DaoÛZ`CQ¬kö²&(YMTÈV*ÉI[ìß”h[¶³¢À^Š0E»÷%úñ(<ÊüO¢rý|={ÁUÄ9˵Ž.ßÃú’',O£ËÕÛX0ɸX,9:¾mî×—¿GÏ/£“¹‰£4e:µ;²4ZGYÂÆ¯&z½ž10Ê8}5¨5†%Ù¤6Œósz'!§x]*æ\3“Oš9ÏY.Ï©¤œî®]H?.–2Sñ?ø£íAìà*îªû¦(««M tâ¥Û÷49ÜU4(ÛM?tE½A¡„À÷®þdÝöÂDh8ÉÑ•¥÷Eh¦3ë˛ϛö¾¯{Xò?ÜÄ3ßK­ñVqËC[¯KMA}Ž¿ƒïºöñÊNÜwí -ÿøÇ êÍàûMµqSö ûâ›ÕÛë ë UÉ´²nVíö¦©hüP4o¯¯?Í_fLiø5^ɯU_võýP··A‡G×,W$.­ø%^»Ð‚²êMåöìÜ—6LB! øÞýÌX€\M3'ÝmWõ¨_MYÐcàÌàMù"‡ ~L<ô4 ‰1ã × 3Âé¯gìk–yg—Ã?ÛBd˜pNoh^ B  ·”b* esVJ—³0èïa›‰«²¾J¸ªV4‹yÓTkü€<ÇÒñ‡ªÅ iý¥m¶ë H¥ó¤.ñêð£Ø¬h`=Ü®«®.‹†¦ ´h¶$+¬k:Uñ¦z$ñì¸Z;]¶“ïïÚmãÔßÐ!èÃÆjå½!¥M Y\˜]ý\x–þTã]aÆóë™@IÅdê"£À4hMSúÉüÏÅœU¯}€¨º9,Â81¼Å9M‚%>a°ÒŽúš…¾f;N¦g}U…#¾*=%¶³Åãk¨0ŽUóya¤_¼«:—Jò8qÓ°V¸ÀçˆT^%BÍ”˜n<›Q#8KÕŒ¾«Þ’™ÅÎîãՓ˶zp€¹j+M2JíºÅ"V: ð 4¬ SÙ 8øp ´ñ%q1«O±ôô9´ÏŽÑ9@o¹íºÊ£®¸zET»±•Su$‰UjwØ’wz°ÊprÔ7â‡ÝâÇÒp?ß)f¥Óø±†#Ú›ä `öÎUÖ+ça‡äÊYÇq:Žä€'˜U8»i7Ó@탥GvyL¦ÅÈc¨wB cœÇ¨DMM~Œˆ£GBT∌™Øˆ#2©Î‘Áõ]hA…NÇÁVËÁ%\&"XÕ“UOdpl¯'ùNd¾™ƒ@ ¨†ñ¯¢ŽÈàÜÀU"2‘æ{Fhþm•žMwŠá}…2!aˆkK¿YsŒg ·å°í°Òp‰^é®.°«›g0‡ì¤§4®‡]–²{¯÷/Ó,Ã>Þ2á¥_ÿð/dN|8 endstream endobj 355 0 obj <> stream xÚå]“£Æñ=¿‚G”¬ææÈV^œØUI¹\v¼yÉjëŠEÜ-{È€în]ùñéž`@#Éw>ûŵ[3Ót÷ôw·‚Ÿ‚(àðI ÿ<(öÁWwÁ«o"DË” îÞÀù:â,ÓÁÝö>Œ™`‘\­£(VáÛÝaõp÷¯àë»à§€‰, >Z3¥Í‰öAÂÙ¸Ú??xŒ0–Ʈɷ'x3ÅÒd›e,‹®!ž€,æ}Þ·ÕÇÕZ$2ü>3o›°-»¼(7+ÚèŸJzùðÔììkÑÔ]ßæU½<ì “ÅŠ¿ú& ÏþÚ2+¦ÃÀ/usèªn¸ñì~% Ök¥§OÞ70¨Hܯ‘Ý×Dpc6móHÇþþ†^ªº§—º´;†ëÅa•ß?Ü>¢˜³e+˜’†¦þÙÀ/Ñm›ã#Êßóöþa³ºõ " “ žé@âeW´Õ¡¯šÚ~ \)(–IüÎèBdaÛûª.í73Ñi΢Ìá²òH3¦c á'¥Kîh:NŒ¦áp´8?ä]Wné€Ìsü8oÛ¿{é|ŒÆœ(²´«ÜwÿˆImn¼we‰²çÏ×OQ˜×[/3)ãÒBæ­ÕZ*ðiåÚ‡Jˆµ¶·ÖIØVë8 Ë¢ÚðHáÀ.Zè®ÜÓ«ŸË¢gð&uøUù¦i-ÔCU¿¥Åˆ¶8¶m µQÕú¸™†}G»Í|¦ÎwK ШA8·nÈéfÊÜl[Â'Qâ.·Œ\di_àŽµzt}¸¼.ª’Ž:<“\JÁ|Ƨa8Öê„a<´¾¾¢U÷Ôw[‚~$jöàDô¸›w (»²·«Mè³ Q@d£QÞ¿{ðØ‹–—ìr-µdYâŠôùsq%ˆa0Ìë8LØÎÒÌiÀ¹ ƒ;¼ó¹ DÀÏßMªÃȇ ðÜB‹ú+>zŒ«[zŒqÊ¥%L&]SFLÙzCšÈX]щˆY6ê­#d.Ñ–>ÐnUoË^Q§šES<9O'=G§hvÇ}Mï– ÜL :Æ…k&çTŒdÅŒ¬sz˜˜pÜ—mUàF¾_)0úݱ¤¥‰™æ €TÛcö"³Nœ¸N aB•Ž¥MBtÈÛ|_öeëÕ™Ž0Ç^ €h2FoËÖà¸q†rÅïÖ’C ¡\9õMŸï ¼Ýð}Üc z$,-˜‹ÃsÖM½þ¹lã fQwLîŠUÂË"q³¡çkpQãZJÐ#/ƒÌ®êŸ,‘­%ZÄ|‚VR¥'ç­ ‡ucb î¬Û¼–qþ®5ÄÍsW ØNÜ Ûiø4ìÁÞ›“Öž€<^(,C*ìzHY[ÚDùÅCôGqeez&—üµ%„Õ€¸b^iÄÒôŠuñY<ŒüfFBN$¼J–2¡e}¢õ§Ô'À„ŠW÷ÊR0®/•(î•‹¼&|“ÍÂÂSš Iÿíã)|÷Ÿo¿õå {a¾‚¢:FTGËß5}ùK*ÝkxÌ;R£ ßäX^õsnÊfsZ~¬º¾Õ;@66¬´#¨´UÄHt†j›÷¥µŽªgó†dÑþÅÐ|ÅÙÔÿ©ëý~@»¼Ü:dŠ•ˆÂ§Ò<ÞЈ¸`"vˆD°#HJá¤ïê,ÔùæpäÆß.ûÂ¥Œ™O P±CK= ‹P@Ø©qíÊgÙ@Y(aõ¢8•?´N2u°gÆ®aw Ä(üÍtýIûúýìÙcl_Ï4§–±I´ŸÓ›J¥.ö¦1Ó™Ó›Á¾6Ög8Æeç“SC¤1–ˆ„KÄåÔ)óJ…íFÿ”÷tZatPÑÎs?‚Q‚†þn‘ MéAˆ¤›™mÊ6µ† ‚ò!ÄZ«rª!ΆÞÊ¥1ÌÙ$Þ´PŸ‘Á&ÜPÉ›TŽq_2skö$eñ0÷>ƒú‡ä2U«³Ö³tñYD6ôËrs…cù }oõ5Uî^V©4¹S®Î”tœšE°=Fnr&mSýݬ‘-—VRÇïnf4…£æAHz.$=˜á†ÇÊŸÒGKå^Z€$ŠrÔ39ªô:g¶D†RâÄ,”P§ew­"ÃþãR¥§¶jaÂá”–¥i£4<@¥ásc{,úc Uè úùÌÖæ´š{'âG5âÉHg¡F>S#¦9íªq¼ÕL’%Ù'èÑÊN…v…üõ¢P¶ç¦¦±3jwSBãËÂ?¶ö¸£'M{»šæ3gÛ’KÅi6ÙȽƒ˜4ï›hƇÏ®|nÛügPOæg:=ù…x¡No$LÊ ¨ÀÞÕ4áÀÇ?áÐ8¾9;áŸ0á0­ ;ᘠÅA÷ï¤McV•5ØÜ†iFíŽãL3/f&.a%¦&é‚8¹ã ð™³sÒ®œ&/&©³ÖeU²pY*SDz¥LÂ[¦œr4nÓ…¸Ç¦KŠ,<š9nÚÊÔ.8`oh+§%”;Úú'ûù>cx'è×gýŸª/ CzWÐäºj/PëXúÃÞ‘ò©ˆZ”)ËŸb§Ú‘41YvŸ41!€§Ü꯶n[çnðµ–ÜÕé¿KÈ)µ¯pͳ8¢0n’ÁÆË¸eZ[ J±”s073D+ú[ORYc¯ããØæÎ}–žb×pÁÒÅäéîphé/\âß6`×áb(I_) ÝÁijùaã\H¿h t /à!¶ß·Sƒ6¯ß–·6i§¦Ór4ó—_©Ç6I4þ-å4¹ÿÃehÇeFÏžW惤Ôü¶¦“󄱈ú‡?ý¿fߣ endstream endobj 358 0 obj <> stream xÚÅX_ä¶ ï§ð£§ØQ,É’%èCÑHQ$ ²oÙÃÁëñ캱÷lÏí]Ð_R”lyÖ3»È]RÜâ¬?$E‘Éß$ždð'…€¿,©ŽÉ_o“o¾ãyÂ9³J%·{ØßòŒYÜî~I“ŒëÍ–s¡Ò‡ÃÓæÝí?’¿ß&&­Iž­™ÒŽ£ÐÉ1)26ÍÉÏÉO+L4þŒ¡ëÇrmçÎr­aܾ&x&ò’åØ7Ÿ6[Y¨ô¿ôq‡¹Q}¨u»‘<\ÉÓnO;ãcMƒªk‡±/ ÊÒ‘ˆ¼LÔ÷›ïL‚‡eOßúã…bªpÇÿü¹íž†f—#c^0˜o•b±|ìšÝf«ÈØïQÙ÷tà[xê»{Úþó¿î6ß®iáErÔt"ÿVUßм!©îTÏ´Z¶;§á–k‰Q²å’að€jUw8[p²”é¡iÿƒ\õçæÃ80ÇùÂ`?"ÚOÍH£}ßiD‘ƒ`ÌåêùýpmŠY7}ÛÎoVHøX¶õîf³Í¹Hávn'LZtÿ÷~gi_iuÚ´‹óÍd²ˆ¿Ød…€ÍïÑši]uG/©ëwuO„fr 2•CU·äÜšŒ ãÖ«zpêæÎ3nyÒ.\@û þI,.Rï“ÑUrR\»TfÕÝ®WƱê0â'^w¶|ÚçiÔ@*˜Óhñ†4 rN£nöJÎØÕ‡ba…šÅZÁ óšÜˆˆÃÅ!I>û$éó(œV>M"A6øè‡uÌVàCš`âÒ2ýw]«É“Ný ÉSË4_Éž âû¾{^¦Î4íHƒ¶ü’{‘ç»§ã/ï~Ïl+áµ^˶–)eÛp¯ù…`àË,Äxhâ]ðú™w—þ%Á`x‚w§jî2ž»ç«³aâì§œ¼YiÒ{xå¶]ª91Ý“¬~ðŒ{Ÿaò‚éEÎÔ‚,;v‹'Jº†{žy:šd*YH½¡ åû=á1îŠô¾ÄöέíËj„-Éü¸ p zv*¬Ž Rq|ó»ô¾qúÝf†|˜w7ÔVc  5µüéåéSshÊþ3±|Ü(ÌÐM õÁÃѲ¿TFŽe¿€‡å”PÛ-Þªº™: Ñ ó¡Ù•ÔŽ!|¯#‡œ[&Ä ÌëÐY21a?½¢c® ‡I²ïÑ_QyÙ€Ò†Å01x ç÷¯añ;`‡\K&Åì€j¿;TÿWì ´yå—ÍϰƒsÇ vàL«sì t1{Ï"áh Ç;è`b耫“qr„œ¡nOé¥péE»ôâ!ƒf"~z¡£™ÃSõKàÇÀA~uà Ål×?8T_8T_ 8äPH¡j½ÀÒ¡Y5&Já8›ÝgÌè€ìKè€+s“c.ÄÛqa‚_‚/ŽŒk:i°žé]ç< gœœ!k 9¸­ Úps ÚpÒ¿“üÊðHYœ¸ZíS­Æ™hg1å°]bÂP w‰°ž 3~ ™“ë†{úÎ)·hÑÁ·;ÿ*é~>dšàEð!ÓÁp{î½¼f>„™¡Di‡~ÙŸmµÎ…šÃõiµËíµ~ª`"¼Á«ìB¿‘½_godVÙ9#û¸–æŸ>.±‡Vô´– 2&‹%)¢ðÇÉ…®v\×h,uðuÄf„A`®üWû/a`$,rÝéBçs%»àuóÇx}X…1ÊYÀÊ¥Pïr»óÀ›|6°NÀ†E cDø­\,Sž¸nÀ"gF^\ù _yûiÕ€f‰bD£¸¡‡£¸Ž³‚e‹&¹¯¥g°æEöýþ ,zPƒíĨ¡ßP<¨™1 °ÒᆕÞfÂj!Ä ¡hÜàM¶º€.ÂŽÈõOúT§R endstream endobj 361 0 obj <> stream xÚ½VmÛ6 þ¾_áöpVõbÙ2ömØnØ0l-šo»áà&ÊÅCb§¶Û,À~|IQŽ•ÄM¶.8½Q|H‘|Ìè}$""*$üx´ÜEß.¢W"‹„`¥ÖÑb ç©à¬Ì£Åê·X2ÅD™¤BH¿l÷É¢ïÑûˆ©ÒD‡(Ï™ÎÝ"vQÁÙiµÞFofN2cÙî%âã•îÒ05©ŒÉî)¤¼ú}×¾KRUdñ_8hÂã€ç6ñxkwt„’¹Œÿ°Ëa”mPv° š88_=šÕóÓQj¦ ‡øöØ´û¾îG‡ÈÊð’(¬S­§+Ûz•¤šù,<>£aOnIàá×+Û“`p‚SR7Mšjgû§ä›Y³Éa˜V΄ïl¿ìêýPƒË$¯C‹5+³P|±±I*3w퇡n¬¿sæ¦6LP(æ× @öä^äjÛ£ú"F …Ì](¤P¸ÓvM‡'©S8qáGS8g̦D§ø”&×fATsáE†ö_€¥ JÅHxBÅ0UAsR²r„dî<ÍYY\=~–•ñ¾ê Æƒíæ ñIµWäRaL5ã@Æ:¥ šÇO\èê…%iQªøÇ5mÖÉÔý¢)˜øùõó¯¿ÌAfL‘~ mîEQý˜LnQmû–ÎÇ„ Ý-Múã.‘E ÏÿÛm½¤mç)¥<Æ…™,|ó ºCÝ[@VJÅõÚƒçýR,+C¿gË8ãåä˜R2nZ³9[¢â¦UgIÔùºbçäqIЮN -ùß`h¸R艢iy‡£'ÛU½½Ò-¸`\ÊJÓwÕ‡bàŠ¦ ÑM¯9Z]r´¸ÃÑ„‡mþGK‘3žÏ´³ož¥_ÿ—œ«åMÎÍ3&Ë€s'3gŒžÐ ö¤®HWK"]-ËIªßC^›Ø.kàŒÌ®h÷5\¸·É]Ô€Q‡êÉ»N©\äª(Âr]»(g&s 8GS¸ãQ»Ê½ŸÛψP`ÒC…ѬòGµS¤'‘“NiÀâNì€uÛ~Ø®p©\& ¯ì¸wE‹C=l.Ào„‰‡^bœH×gU21~ªeépœ©xÙÙÊ‚ÛUc4#“¼(Mn˜$JΔ ?×Në­ÜÛq1‡×6Û#Ùhÿ\Ú½´Ê5ó´œÑ§ÕEypØTÃ8óŒ¸'Ö¬}*vD­C{)vb Ø=‹#žvvWÕ'Û‰†wÚÖwhVÉ"l„¥¸O³x%è„ýò6Í0”3<›3©íâe~O(ö¹vØCÞ&Ú92󺿠ïU…œo|ƒ"øI5ƒ\¹Eª’å!©Þ.V¨#3¶½$ÙBEÃD8Z‡‰ŠÍÉãÃÚHxd=² ^»ÕëI¥™©Ü§ç…ã9ËäØìNvïÚªÎL ìÅC›ß©`TžŠwv×vGª38mG.‰‘œà©T랤¯ÏKð¼6h@šC#kJ*C=J¿ùêv’Å— endstream endobj 364 0 obj <> stream xÚ½˜moÛ6ÇßïS{% +ŠE®¯6`ݲ"m=`À<Š£Ø "É•äzöá{GRV¬¬(‚‘Hÿwä‘?‘q>8Ô à‡:q¿³ÍWÎË×Ê¡œ0.œÕ4û4 ÞoÿrCÂ=ŸÒ»×UyóæžÏâÈ­Ò¦ÊÒY±³åòØdEZ{¯~s~ZQÊJ‰Š"«Ê"T«J¨ÖÜÝáíõÁ!LIçäDŠH®;påäŽ`DÆmñÁyï¼qÐY'»´9–!‰ã^X "—t;+{€y8Ó¥0}CaJ%‘tIz`eÅ‹$OqF¹ûßh¢=¸¶á0̃¶Ç`^¾–f-P(ì·ÊaD"©•ß*ÊCM24ìDce_rbzlË¢nD1íà]Ú«¢¶¶Ñ0”ˆ(>4]íaô!SíB³}FñG1Q Ö™Îý4Ê'Jȱ¯l(ÚG¸xH·Ì /ŒÝ&­LcSšÖ¤0Ï®¹HŒÅÍqP–V/ )÷´Ï¶h²7­0«ºC’µîêO9ÖÀôÁßò¬1V˜.F¤2‚«¥_Œ¹åy6{]Ñ- âùœs÷—O„K^u0Œ…nöHGS»OjóR”¦5©ëlW¤·¶ü¿˜ôoó¡k«QBGÉá¡"!µ³ýæ««™„„!ؘ‹$¡B‘ŽO$\& và=ILq$½“ $i… %.ëö6FwŒÝûsš‚Ñ‹S˜£Å¨Fâ©,Ñ0÷>Ý6ÔÓ¶þîX@ ¬ÔÈh_À˜uLŸ@™òæþ¹!#ùEÈHü2Ž!Ó9Çø,ð3Æ€‹Ä0„YzÇ|S•§úùðÁ)_À‡œÐ£qÀÅhŠôÐWp²;VUjÎ$XW |?vg¡³€–˜œ>7X!8 ¹[›ƒSºÍ<?þXÛ^fºû“TC¢ ã­7þªK´÷.@ûß ÑZ¿ýæ3 Yþ endstream endobj 367 0 obj <> stream xÚÝWÛnÛF}ïWð‘*Ì ÷F.›· u‹ÂhD Ô…!K´Eƒ"^¢ÈÇg†³¼H¢EiÑ¢Hà%¹³gÎ^ÎѬóÑáŽÿ¸ øï;ËófäÊáœEZ;ó{è÷¸Ï¢À™¯þtSLÏ<Î…vÒíì¯ù¯ÎOsç£Ãddœ£#fT3 œHfÂö5uÞ;oGôA6ÉC\Á°63S¸]Œ…ÍfÒwëÍ4çžzlÎC¦Äú Êâ/ó´œy2ÔîjЏ*’ø¦ñ‹B )Àß;øß Í社z“• ÇW—ÆAt?Â|^›Ph¦Ã&áû§,ß–IÙΈHÁx÷´f> I²jæiÚ¼[XçÛ¬ÞÜ"ñ›æË¶Èï¨ÿûë›ÙëQÉ Ó²|WuÑQÖÃìšEj:_Ã:#Ü"¯«$‹í˜=ÊÚ°HÀ¡kÂÉ‘‘ba^X&MŠŠrIwYEœÍDèVÔÓ<Ã&ƒ›Ï¸ ‰›€í&4“ŒÚªå^n±uãerãs¯¨W.épy<ˆ˜ÆE’  Pk–U»ñ²bûÛu(5¡Z­gh Fá@lô>¥¶>Ï)¹µØVK§¡û ‹\äxöwÇŠó#Ƈð(A1‰?ˆ² ²Å&žràÀô‡ñ£ÚjQZæeÒâF²ÈXýg¥U×r½(¬ŽÚ3\ä»[L,´ z褙ücÊò¤òBÈ嵬ǕçGʃ jH&yBÒk4&@–¹ ʨÅEJw5èJÆ,‹PÚÝ­“%"¬©¹Á[$”NP:å–Oì Eç) ²Rlf5¢=38”eò¡‚ñ ˜,ŠiŽÍ2YÝÛW­ Žpر™§”r¡7´8˜ø§†qɽͼŽûAsV¥p׋’¾f9¶ê€.Nãbo¼ê6—ÀöNÇÞ¤¤’Lµ{÷Û‡««‘‰ Á"nCN[– MgYá´eáXÕβìû„e òœ°¬›Ühº [§#vG] ¹o˜? > ³ðgýúPï³~Õ"¿Ü°$ÌDgð8Ó°ÿC†Õ²þÿ@@ÏVÙY>žcX€DGý ê›güJò+LÜøM7ŽžÉ®à¡±+h÷ɶv¥¢~xoWJŸ²+/â,äÃ%ùfÏRð&TçYfÚ³p„¯zϲïž5Ès³:l²£ è>È"O•Y¼-s&ðQ6A…øO[º±¼¤ÞÚø·^ .5R_j°j©ž¶ÿf­¥N[W F -¤<æ[úз¿¢D¸Ì X\f¼ÌPÜeFÒF!ÞtOV3rh4‹Æ.°šc1øDÈõTö¦k™ÃÝ«¤®<[%Ù™œÈž¢õç$MÅ/Ÿfp[ZÉ.UmµFí}ž¦D©üalŽGûñóÕõí廑Ùʶ°ûb‘‹ØÖN7n ̹ÎVñêfÖQS-µ×£v%Íaú«ßÏH?œ3}Ù%mI™L¹ O=·sY|¸þFõÖÞ}Ì‹(üøæ «¼†ä^ÞÖ¼Cnçf¼ü㌌x“ÿ<ÈÒmðþ¯ÈþoÁ³ëp”m=%Â6úíw_¹AÏo endstream endobj 370 0 obj <> stream xÚÅ—]oÛ6†ï÷+tio+’âW{µ ËŠ!ÅÒÖ ,…áÄJ¢B±\YJ ?~‡’(Y–œlÅ)ò})ñ9GÁ×üá@ø‚«»àd¼<Åq€1RŒ‹k¸â),ÖÏŠ‘š‡6»É¶óÏ‹?‚ßÁ×Q%ƒ‡€)$c3Aðà.àIQ7³àcð~À äLn’rOX$D+,9’SºÍ'[äsÍö¤q¤ö´1¦ˆL‰·ƒœzv9©`³ïö§HÊ"Mîµc¢{bcÁÞ42 ô$…íÒóñ,¯6káËShõHi»Ðù†˜0~7ùv—îêåØý9X h‡Œ¡ÈNYçÕeÑ0ûð–°ÏË"Xf—¦½-òK{÷çóö"Ý”îâbþz0.k‚%bÔ˜|HʪØìÜXæÇÊý¡‹[&f¶¦*ÓMâætÁ âÞAó^tbp aê.0ˆgeíûN8ì;‘fßu,™»ïfl~=¦ñØi§Þ Á!²·ÃòÖJÁ#éØËXÒYŠ4eÄëpÌk ôÑûá„4œBxô6WyQ$»­ ³N77VaU}K³tU<ÚæýTVEº‚goüÉì­· ÷ÖÜÄHféµT¶ÆF 2»]ílï&?°Ä‹ß-»ì?eÛè¼&­Žì"c»—oNΖï~ý4°ã1C²ÞrÔ=}~Å Å´ŽFÆ9bÜN!h "Ô6Ñ älw•§¬¨>SÒÞ(§]ƒdcpÀ¤o€±BjÚÁæ,ªKˤQ˜E5̪íÖ°Ë’ŒM’ÌÚi”ɧ¡ «æ½8IJêegl¹`Y5Ȳ²We„¸ãFf×ëƒGzà€ö!ŽIÄå8Çh‡càéq,fŽcÇýX„‹%î2µÅ@ Ç“£¢1hö & õÖc§1î “lxpÑBŒr1è5ƒßÎFB» ÞèQ_§&˜nLÌ®ð—ÿ‚`D ¤pK0>j&9^TeJu·±wKÝßÌD—ózzF)A±§®æP͈aY>n“ir}ùQ䢘‘ Êú½*¬ŽzÀC1]ªôà¥-ÊÚ«ÔòÑACw‰¼RD?|+õå\iqûLaï(‰­bªF̹67A àÈ€‹p¥KKïXïÊ¢º‚¥­2˜IM™ÅjB½°]4ú÷:Ï\¡·{5Èäþ#ùýì|yúa`µ´&÷w§\$‰½º˜UmÑÂ+Y_Ì›Ðx¾ ¤²oöçöþšmÏCj¥ýÒVwµ±Å_çÿ2 ŸíuòI!¼99"[„­z²ÞíXÇÓOG8^D8þæ¹xÙq,°ˆi„7y„Lç=…¨&¸æxñlFòH£ì2Ä„´7Êiå‘F¼†ö„º?ÌÉgSU°Ÿ<žñEÿìd Rgê`¬É|Ì7ýË&l4›ðHWñûÙ$;PGb/—°:—0±G¸çןzÈ¡Z˜ JŸ’\˜Ÿ\t¥i’ «Ká‘hd oªa¢ ÇSÕ0Ū›l°ì—Ã1•m9,ürØdÀk+âòŸl_[¸6Õ°¾««aÝÑû¤×I±óIO ®•T[ë™ÇÄÏú¤÷G"µVȅмf²ýþ§Ñ+E endstream endobj 373 0 obj <> stream xÚÅXmoÛ6þ¾_!쓼Ŭø¦ìÓŠ®Ø†nX× b˱ [r%9Y‹ýøÝñE¢lÚJ; CƒZ$wGÞ= >4ˆà Q°Ü/¯ƒ¯©(%™”ÁõÆç4"Y\¯nBF¡|6§”Éða»ŸÝ^ÿüp|ÏÒà)ˆc"c5#‰ƒ]D¤omƒwÁ[^ÆØx(ºµiFD6¨Í8‘|Jï d/ëí‰bŠ:’A3¥‚¤tJµ#etîgsžˆðoü‘aStMY<ÎxzŒv•=ì÷ðAâÑmœËÂúP­”/^§jŽ2´5·Æ˜$2QÆÞ}¬ê}[¶v5ÚAwM´çR’HOYÕ‡û-¸"uÜî`“ïÀ¥»ÃýBµ÷M}¯G¿ùíJ”U§?Þ/fßyÓFhŠûŒF~/ºCSµFVºþH’ WôzƒûÂDØÔ‡®¬ 3g´™‘”Cþ©¤ùì±r’P#Ü?”ÎZR»ÎR½ëІõ²Dïºj×kŸ”sÂR£ø½Ç°$‰urÞm´*ì+lÄaI 2› A?Û•9ËR÷ÊÒäpÓí^ËW«²z˜¡TØvÍa «Î·ØNÂÇ™aÞ”9D­C¶ýXÏ`Òþ™©¬£‡˵V¢üÃÙ6Y±s“·º³ªu‡ë<öß«:¯ÔÉA­šÖŒ’c´Ç‘^¡P+üöÕË7w¿|ÿ§g«…$)3{MÆÉÌX’ÁÊÏ ,˜ÂØÀYº9AZƒ™K¬e5[Fº¬Ú‘2ºš13Ù7f/_Ž ˜„IS&\1ccYkJZkJ:ËcÖ—bÙ•c~Óó—eQáPg¦š[ÖUÛåîHW4;?åiÿ¾€òh–XŽñq^}ÿ8¤Xÿ¬ÇRz‘õR’‘žuÚc"ÚC 5¥VÛ€!øu? QÜ †:ìŠÂ¼ó2a,K.3!s™­Œx)eÈKÒò’–X ÛÌ5ßqž! 8|4´˜i¬ŸìæO룥îó&ßT>÷ÓãvÞû”ØÑÒlat…ÌÅýŸÁJ|»Íú6Så¸[„‹E»)×Ý׋™‰ÍZL+ ׇ zêê2ëñ("©S¨ÉiÖÃ)ñP©™æeÖsÌ\`½^³á³ ÕŽ”Ñ DA!þ§¤Ç ’Ô1@®uÒ‚+fM|š¨ÚYà iQ_²Õk‡Óš¼tYÍK…­—KŒKÈséçñ‚dš{ʲ|QvwÕ§SŠûÏê8¨!.×q<9¢4í¢¿ŽÙIŒ %.ˆ Ó¥G¬c*&(PWóOESëV±-vÈn1Æ@i*+=Òk‚¨a‹B»rá/MKT"98¬¤,q«>ZS-Kº(Vº÷¬cCœÀ}íË(,Ã+IâxÅ8J‹bÓ¼ŒbÇÌ÷š >'T;RF÷.ï}‚âÍãò:3wÜ–$\ ëLÍSŽ*I¸)I¸}j‰©'¢LÇC¼x…I ˆdø¼„]qPñ¢öêá’p6äí=ÒHkßôCrTzˆ {s/g¤ œàFÛ¯¼yã1ÈÉè€4WVZçÓX öt£»—yk\ÞÂÒá-Œã¸®›]ÞŸeï .qµ:>UÝ™©uE> stream xÚ•VKoÜ6¾÷Wð(͇HJè-Hs(‚¢i¶'¯aÈZÚ+C¤µ›¢?>C %íÚtœÀH‘3ßÌp¾™Yò…pÂà#àŸ‘²!ï6äòO ç4WŠlîà>áŒæšlvW‘ )å&N8*º¯ñõæòû†|!Tæy"ZS¥' £IC £ËWM>“O‹Œ·qoǰYNÓ|…Í%Uò-ÜUÈ7ÅK`Î •|Eæ‚S©Þ‚>‘òØeWlj4iô¿[TÔÛ±¯ìc,Ydñ$ŽM‹·Ý®ãÞâ¦ìÚa싪u #*€»}õïäñ凌8[,wÖ“Ù¼PT™Éüç¯mwªaŽ]>U‚8á;QŠ2T©Z°£07ðæ7`ïœÜN‡¾»Åë_ÿºÀÍ¢ððü jwW×þp×ok‹ûÇ¢¾ºÞÆ¿c@xæ’äüyo‡²¯cÕµ^^º¯hžžŠo¦§KMÔwDZj­×9‹Y3÷L YueÀpÌxá¡,ÚÁÁgÑ6j»6ùÏöÝ6Æ[ÛÆ¶±0Ñ8  ΀u.sʤG|TÔÌ×ɸG¨…%`hb ¬Èج,qÆQ¡)’ :‘޲ޓ@{5NôIdn VDʳh8Ä `زÚ2žÚžº¤Cp^Çå_G¶ñ h½Ø0v½ĪÇmßÅBGOîC;JT% e³¦‰&Çí«c¥¢¢>¢¤ŽÆ5jX\8: ¡×eiê¹¼»â×'–)•Ú¿1T²<¢Ð½´ÁEÏ_!¬ôqjÛ†l¤9ås]¤!$F³Ì‹¸¢ø)_õ™Ë?૳𚯊fâÔFj"ðº«G— [39ß?ímïXÃdÄ<¢>e934M=ä–‰4X œ*îeÀ³ ¼þ Jêb}åj@—‘ñ°ñÔ‹!Ð[ä~u“2Pã§u3U‹”Ï ] `AÈ/»Yñ½:çü¬Îëü"§2jòï…)×§šÂ”s˜2ætA¥S•šèi =—,ÔXHоhìèßéYF üÐkm„Ü„WIײ¸ì‚8RQ)VÞ¾‚33Ú2úv‹Œu*Zø»43wZÛFf`†{´?ÿùø1`PšóµFœ¹ªȨ=4.x¾=—Åà](»~©£Z_{çU{×õM± 5ÈHêð Ûæ¶Ýˆ›©½îh`h²Ó<ýmÇc¿ôƘ•ú­Yi²Ÿ™•ùœ¶Þ;æY(ó{ {ÀRÎÖ¬Í@½ø­²v)ó„Zh*=±°PÝLtÐHuíç¦~1ºõ³Ñ½äÃœç£ v0±ëWf¹×8=ûMvN´ÌM´14Ë']ÉféO¿|µ%ãl endstream endobj 379 0 obj <> stream xÚ•ɒܶõî¯à‘¨!‚¸8·Tì²s‘ÍÍ­RqHÎ e.-.jM•?>ïá 8ÍiÉ%•Þ¾BÁç€üáAÃß((»àßwÁÛŸó€K&dÜ=Àñ‘G,‡uõG3u8rËðÃADáåp© ‹¾Â… Ë¡]ºžÖS]Œ%=5ý#ÁÃ27}=>ÜýȨ1G9’áŠå28Æ9B“z?tõÜt|±›e؇8 ŸióþpŒ³°¦¾.ëi*Ægœú=E\jödq^4ʹ~;ŒEŒOôqŸêf4 à ‹ijûº¢ïK3?9x-ÝÑÄSJ ôBxžyÒKÁ¸U#Üc{þ8ÕóÇq¸|D’;Êʦ¸GÝï`Œc&_b!_ÅÈY" øéÀÇ4SáÝÓ°<‚\R¦aA?çbœ›ri‹‘¾Q£ixyk /e–EO‡Ö Vï‘§ÈÈ—°{A[×*SVå+uìy¹—*þįšŽÐ¯A«µ)üb…ד,3¦(”î™À ÀÐkŒ ´`Ûg:ëj)k\+íÄíñ% ‘ ˆ ‹ó¹mJc„9ÃãXttêÁ“r¬‹ù% cëAû±C® Aযê¯`B©òðòÔ¬ÌÁÑD¿…a¤X¾6m£~VÅ\©æq)çe´(Ñ£ºšÔ¡McÙ³.Ä:ƒ´HF»ozD¾cYÉÒ+ÃbLIþôEÛR³k'DŽ.¸9ŒÓLò •3žø @/E'T i§QÊù‰k‡Çb„¼Ô’è"?º |娸X±‘iqÕ×u¥îôë²(¬ üÙ¦Ü6©€x9…ƒÙ&»žZ²MtØ 3IAg‰±4®—)¹§Û$cÂæµw;ºÏXÛ<†*°8 À±<Õ•0`¥A@]ÓvÉ “¤Û˘Le.a"ÇFèdè4ò6ÏâÛ<‹¿Çs¿CHCXžOp†8WFõXï!”Š¥ÖÙ÷TÀcçç^ÚH±$7 ý®‡a¬ ?c=™Yk÷Ô~βtH}XVÀÍG:À¬Ê_k;ú“îHðØvªA‰D‰<¤*`ýî!ÐǤÀ…?ÕåL©Õ&&—Z ²™Ìow¦ô<Î&¿ü&_÷Ã\[ŠÅü£ ‡C\&®ß!cÈ?æLª~™}X¬l‚è›tjÚÿ‚é>v[•°(õzÊÓ‘ÆžÍ"Æmˆ9ô¦V3:AÓæÁÑö¾«{ Ž Üct ?ÿi–ªW¬¥Ý‘·(—E;èº/Á=×6â‡Ál#¸ª¡: ”™¨¢àš „ÌjÒ%MÜ&•ë=ËÄ •‹$bR\«œ¸ÝшH&69…»$‹¥‡¶ªÛúÚë®/ÏÂ_tÉþB…PEV[ºdA/ãô…TÅUl 4l…ãÒÜ,Ý7ãÖ º€aëa¼ÃˆOÑÓWH^Çl®X–ù‚_G¨º¡Â÷ ¹B‡+S01Ô"E1)צh{Ë88¬¬ƒä~‰ŠcÁrñ}ùþÕŒ>Š”Åé­ÄË™5Û?÷®ÃJðiwS` K’ý²éÆ’ë²£6—еêì‹ãyåkâðoÉó½â|À‡ópŒ¹fó;‘ÍFôGèö¨Å‰t‹CM—Ôl\%š¯oŸ©ù`FxC›ºñEýµÀÆò A|Z&S Ї¹7Hå«U‡6twX˜ s;Jãí¿êY&7dä†©Ü ›õ×fšõ@$9) 6©”åÐ>ÏCµ§„IꙎ–³.½%ÚY=t#¹ÆRÙ!¬ç+Ø)èóÅè¸ßøÛºjÇí·Ôðý#ª¦LØ Ä…’Gål6І7ŠM“¬ç'¿IÆs7F]éVùºå‘‘;aeu þW Ô¦Lô‰•NƒhkU+†Í…ŒÞmeÐÛ«%Í´+i~óQAd»Æµ<{ø¬°[`òsާú×"–Ê—HÁ†{q™an P4–ˆÂwÀùxi&êõr=«Å9he1n✇¾âàŽû—EÆÕZ´¦™¦E×l8 V÷ý0vEK n Å#ˆ¸¦5­_íhYΤ‘VjþˆöM¨,—ñÊ4ñZ4å~Ë@E32î Ùø±‰lÜ ®AZ‹âÖ­F-ÉY”_—÷Wµ ·i'fÊQ1õ:Ê׎›“ ÓÈÅ!ɼf ¯Ù}™!`Ëê"±íéð§;zXä“}ަŸJd¬t©¡§EÆõã¢BÙìµÏy\‰3I7Ò4è‚D°,ußmð>ø}‡†e蘤þ= Öå~AÕß$àƒ 6 ¤2üË<‹ÚB’Ú˜OmŠ+¿=óí}´È·"ÜïŸûá<™¾ÃiÕ¿ÄSßG &Œ2}çËÐ@„(Òë¦Ó<éí>úü¿ÿÚe„®¹ð?õTŽÍÙÔîc®÷¥…NnŽ!Чêû[bè ]E ‘˜--£àdmÙ’Ô”gÌôœu©ŸÅtaKü >6sàQ™¢C+™ˆ¯ßª„ÌÖJ›QÈÀ/æ;!sÿm ·ém Wîm c údzãJôLž††KÛÆÀŽî^á÷óBb¶÷ɼöÈ,7ÒÃæ¶îIªÜÛG |÷ð#„­Ø=DÒ£¿ðßÎ…ð^r×·saÞÎ_ɧwO¬wè ž‘×1Âî¶­> 3K¸‘Lº€Ã$“ëB½;¥Äþ”R´à=Õ3í»<'3ïžÇ—)ìYhj®ß²H;ÓâÿxlŸÚÌúÊ1IS–å4¤p ýûÿ༩ endstream endobj 382 0 obj <> stream xÚÍ–QoÛ6Çß÷)ø(+Ф$boC[ {ZW¿-C HrL@–\Q®c`~Giɉ§CÐQ¼»ÿ‘Çmò0’‡‘"ƒoJê-ùmEÞb‚0F•”dµ†ù„¥TådÕüeTÒ,NËdôÐíâ¿W¿“+òP®Jr RÑR¸€"'[’sZaØ‘¯äËÙɋܦLôͳÜeAS5çVŒ2~-÷ìäsCÌYtˆ^ˆèûAÏÙv> ó÷Ö>¢­'ƒ}µm]mï?•Ä&†¢@)ñR™¤²pR_ý°3Ú„…`uËVP'RÒCt?ʼnĽ½[ë¾¹‡Ã­íÆáçÞýqƒF=ôÆû×›jô³¶¾Ûø×K%z=VRÉÞŸí´{ã}å²4I•Xº®6-¬Ÿ¥°CûI÷a ÎÖÝ—ë¿\Á…üEF󮣯"ᩊ¦ 3Œî«}œåÑ~g%4%ÉŠ¨½×ŸU(.†ÉÃñè°Ñµ Ü`jm¼¯1ú¡oÍ3×Úˆ`ÂDaš0Ní‘‚rÍqkEly4t qa+pÖ·81Ë-È2ª‚ !DôÙ®†ó¨ìSDf_[)[?ÏÂâÐ¥}Ôf278À5€šã¢ç}…™”žŸÃ§ˆse) Œó70y±€Ç×(Ÿu®`Ò„_O¿ðòéë¡{‘r˜Ûo{´ÿ+äåAÎJNUùåPÏÿˆr¡Äk”C'¥xJ¹Ýí ” ʲ§” å¬Õ9Q.”´”Ï(w^k|VøÀöÙýS¾€ÜfÖÆ»ž ·#«‡8KNó3šŸRàÍŒ/2^ªŸÏøédÂÌOF<ËKZ”'ÄÅuÄmœóâ~|ñ…NÓvíÔ>K¯”=osz–B;ò«ù—nE@©iY¹—t6îYÀÙYp‰šüÇÑæ,£¥r1ßÝÌlc-wNó9ßoÅ÷CkêQï&=ôoFXŠ×4_"¼,ô‚†r?颥%&Ô l_ùŽXs7¶ßõ°7Ýê±­&K˜¼·Ìº Ò¼Z2ìKI™\¢k+Çœ/W?áòÊÝþÀÉzl[sF•ˆ¶ívø²ê:`.¡ËuŽCpÿ" ¢Ú?êNW!¨©¦ -3û°lǤP”óó¹KŠ«™e!RPëѸwâ§·]çn1p¯&|W¹‹òˆ/'½¥¤Èñj±óx»‚m±–o‹ hpqv œÏ೺ën‘çs†³ çH—âÑ;5Rmtÿp~ _‡¥õMò¢Äð,xùå_D0" endstream endobj 387 0 obj <> stream xÚµYmÛ6þ~¿BåC̈â«Rô€mŠ^‡´ÙoÝ¢Pdí®6¶äHröÜï ‡”d‡¶ Š5Eg8oÏ ¹ÉÇ„'üÇ“ÿ,©vÉw7ÉË7EÂ%R'7w°¼æ+`¼ù-Í™^­9Ïeú¶ïÞoëÝj-ŒJ‡ªÜ6í=}ôÝalÚzXý~óïä‡âÈeÂ9+”ò,eÆtX2ô»²Z ž~¸íÆ1xùF%(?+p'W¬É:WLY·û§vµÎ‹<ýñ?oÆ‘HLJÚoäÙb§Ö,ËA2nª•â)ùKB²ÂxÊ]]¶I(‰=lªËž¦ÆVïº~WŽM×Òz¹ßo›zã ºùLnPuí»šv•›tÄ9žÂî¾ùŸ'ôšÝ¾ïæÓ*·))&Ò¬ð+ڎ׌p8!Dêøvu߀'p*OÁ˜Áî~lêwÃýÑú{ï ˆÔŒV6ÉÚ(fÉí|ÞŒûü–ˆc ËíUÆ£íP[7ª?Àæ#õ3Í4þøc ¾ë¶[Ð[§Oà›WÁÅRPá"\L  ÉÝ|A¶Î1Bàÿ†4x &ÎrîýmŒ ¨3¿®Ö&}ý,š~ᕃS„ö´·icW`ÈÅ«XܱLøe~»"—K52 ^\yz¨û¨Â‚ÏÜÏ(+Õ¤,YÇŒ* ž ŒÊ@ ¦àPÌ@h€0Iø‘eX®“‰tY–³á—œ-MÚõÍ}Óºx…éÓÔÀ9JÑcjƒ' Ή*¬Å³në¿Ô  _jÛDéSm#2 S!Òþ?« §ÈPuå­evЛ¦¼ï¼­Ì¸rmœa;ZE4ö‘CBf4ÌR¬µ2ÇŽJ“ÔHý·!Q¤ i*•/Ö85µø8‹‰“¡ÁÄÃÍ­QœÕ=¤Öö3Îúµ›‰]_uƒ ô¾ì}rÄÔ#á·=[­-çÐW6ƒo‡= Mhæ›uj(Kéo>_¿ý‰Rc[ÂÖ¾Mö­§t2ˆ´Ü>!E‰­÷gÏpSPèLÇÚ9Ídº)Çò R¾óµ¡°é]Y]?DCj´zF+"η"0Ò|ÞÓê­8fÊõ‹Ý“b³”V•-éøž¢?Št¨Gšízš .Û{g8X(=Aé‚­€øivžAÝ`ÐɦéëÊ… ®L@+äFä‚÷¯Š.d&‚n3'2Tˆû¾Ä ‘YªCð[ÒÏ\=àcðñ]5€“²¢É$:3’>$²p ]‚Á¼ö¨Z¨¹ ºßîÿýÑÇ{K=ß*Þ<â¶h½³á1毩Æ&d-¸ Ÿdv¶$¨3t»Ð/dŠiµÌ0ŸDbV®q>åÛM¨9w]È¥ÃØáõ¸¢O"ìâÛ€Âð8ûÇP.lû˜0ðuò”¨‚YI;À¹;P{¾ð½MÞ%¿Dd,¨¼ŒÒSÞ–£—fÞ¼f¯ò^PyÞèY÷0òÿXâ2¸æ{%2Ê×9‰í¹àcî#ô”@K¸áºtÿÚ Ä'Chó¹íöCsòþ²Üà ãxF+Ðz¸çS×€çY9Äã­ûÀŒ ¥¾}Aƒ¦ýÀOlºÃ{<)Žqãê›ØI½XÄE’ú}=T}³Ÿr5ú¤0è{RÈM¢/– p_¶ú¹©•M7‘Rr›9Ÿ|Ð)(o ‚½CðÈ!ÇmŠLæ_ä d½;#Hc—á›ýhÕŸ.•k(2kÇ飻#]fýŽÏ½bÁrÀD üñ6é •>2_Îk©-âIÈkq=¯q‡Ts^ûï+y½s!¯'Þ>®ð^PÞ²ÏÎkºί¥cZ+>]¿Lk8ôõ´~Œ¤5n¼šÖâ/§µäæRZk>ßå¯9Ô>JkdíÒZ/ÒZòÐ^r‚à i­…öym“=×6Yq=¹ Ó!¹c\Ôüxá’µ A†Š`nãï¬äinS: WçE_ÜŸE4·§D‚”Ö¹ÆøÜÁ%îDÓ÷2‰t‚ý—õšKp½‚åâøa™h \‡ ­=¸©i ËäôÔ/T–î°Q´®]¯ª\‚4㾡sìibþë„{EX¼Hȸ}˜Ö¨{ƒÁâÊlݕىõÏ?0v>@7wºþ„Žc[á³ Þ`¿¥ Qb5\c¤åpŸ¨úº&Ñø’Oí*éŽ&L\ð¼yxé_åEÞ¿ ç‘øäþÁýÙ` …ªÛí£k‰‡#&ôç×NKžîܵ ÷#¾UƒùÑcwn1ZÖÚféî(D þå G“¸ endstream endobj 390 0 obj <> stream xÚµXÛnã6}ïW}’‹˜+’¢(uŸZtwÑë^â}jŠ@–åD©,9’¼F€||gx‘d›±’Å.`ñ6s83gfïÞ£^ÿ¨'ü¼lãý¼ðÞ¼§¡G)I„ðkXŸÓ€$‘·Xýí3‘p6§” ÿ¦ÜÎþYüæ½[x÷áIìí=‘8Tdäm¼ˆ“XÚaé]zŸ †MFÉMÞŽ‘rG$ž’Ûï1b›¢˜Í¹þ£þiò®)òo3ø9΄~SÏ8õ÷zÐfi™ëë4ëêFazó>öPd Š¹ÖÁRé¸|¨êm[´¿F5>B%ñ\è#«z·DEB›ôn P¯Ô`ÛÔK½ôç ýQTù¸š½ua2hLW¾äÝ®©Z³WŒÁ’„ã­‹[¼rÄÁ»®¨rsæàQ@¢ÂB¹jìE$‘fgc@€tæg»¦É«‹üNOXcƒæcS:FËC­8»{•ÀrHw!‘¾Š|1îõ{ÖO(’$`F‘K ǰÓËóîÖlƤЏN½ÆßÐï¬9ÛílÎb?ÏŠ«€†ùJÏ¢wË|£4Ì9à8ÁøÙÊõ¿˳ŽÔ1?9Mz‚ŠgNDɈ¡züñéúòýõ‡?Ý]dMþ¨õZ|†8BoPo°hgeކÂ/㎷.s-úǻϯőßX‚宯GÀþzí™áñÀm?Û¿Ôz½ÊÓ&o;=©‘›þQÝÁ¸~mõ+õË€_þþë§çAoÿ-¶r°Ð…V]¬â)<${anµÇËËÒÈ»¯4ûO¡é›¢HB9EF˜Í…ÈÅbH–:àRbÙÖZ¡£‡Ù´u’2h³²±æO_]Ö´iêB ,*ý»¿Àï­•¥­¹¸¶% ±EAÍê½µ‚^·yk N‚pœ;zf÷¹Mg “˜ÐG}HËòasÿ|G"à.æ-ЉœîHD`Ñw$f<Ñ‘Œôì*wOBI8)  …‹I ý¶AÅI[bu>¿1±R_Ñ™š8:ƒâ‰ÞdhCÄÂ’ÑÄ+=¿ÒÇŠ:½öÐXÄCcŠôinR÷ø;2£4½îV½Né`•NîŽë2 %?ŠÎöÔ'¥êêê«ö=–_¦ŠªÏð"Ï·eš™òÏmm?úã é¸KÀšŠ•+o]O &ƒ!+|q5€+½^Ç*í’fE\º1üÉdèL(8„È{”æji§¿ 'ÉòÒ&&‰ˆ¦“G>á'—1(x¡ˆy$¥}¦óÐîþüÝ?' endstream endobj 396 0 obj <> stream xÚÍYYoä¸~ϯУ:psÅKGöiÉ,&,fcç) º›¶µ££GRûöǧŠEêhkÇö.3@Sd±ªX¬ã+:úñ(<ÊüO¢]½¿ˆ¾ûPD\1©Òèâ–·l¿ù×Å_£¿\s®"ÎY¡µç®–;㎿Žß›ÝFòøË-ðhöŽÁwt„ª$îäš*Ú Ítîv_lr·›­Êó¸L7Ðp¸³8(âÞšn·Y|‡ßÙl¡¬•}$òÚwÀDäñžVk÷=­š¹ßh›ªÜÓlÙ”Ci*úpæ`›mÁ“øcCô?|úü·]¼ÕÜv²ÎÖŸ‡K†–óìZTk°Õ3çñÞ^&\5vŸ"¾Æ£ø%CS½hÐÞxƒñdn1U0 Gæ` áØû›YVq&”'3}_ÞŽ"‡v­ÎPcOfÐI\­ßWžy²ËØ˪4Ýq6ÍžNBtìLu¹¡%°¶ŠMWšëÊög0WÈøáÎv–Ì&R‰Î9³›3²”ÒŸ‘Ƶ æ‚k¸ß,vT*nOFs¿~¿ŠoÚªjqÛ8ôŸÂÑóç>Ès¦¥“ W}õþ|åô2÷GÿÅ«°£áü€ß¯I3œÊøñÓ+d4m³ý98#â;g”{ Wø6º÷‘Æ~ÝŸ~Á`»ÉtyŒ!ùjUÿñßPõx88Í~‡žÞ®çMgíï¸Äó·KÄðèâñD(£pXJ¹pù òóÍIC‰ ùÞå¶çª 1¦ˆC¥y\ÞOÊk"ŸË©ÍЕŽP@À–cê…Ÿ@cæ¤^ÓcY 4Ýzî»¶:ÖM¿œEšãmmd>ؽO¥ gZ,s)–&S&–l”*! _ÆÁ(|vàB0NüѤ³õœ©Ñ~ÓÀ'I’5N [êIß­˜6gV¦ƒº”&xE9R5Du€rYîæÌ›P¤,Y”£ÚšÆ%S¶7CY8ÃkL>»v´@Y•O /ÕÅ©$®1”ý@_³ü<Ñ›ÚLÿ\zúMée2/Íz¾ÿе K펞ÌÝ;Pög»ÀxJ)𔬰åºí|µØÛÁ”•/7}È ç°³l›€mýý?èn -êd–³œW(Í„SB11íÇ­k»ÀW³t¾ëŒ8˜[ûéB(–çs>ëï:3×°o¶¼R ÆÅØó ß󂛆m_#&‹ë¿/ãJ¿3Í­uØ)SN! ¹ßRˆ-’rƒoäøçOM{9b¼½üÉ¡jEÊ©vßâK€¦û[ÔŠK7ƒà‚ÖÿøùŒe3øÁé„Û¶ù~U[’O%& 9ß[îJl¿Bº`Žo¤¦¾TžžCIìK¦˜õ&«ð«O[ŽH"ÿMµù² Àz¦óh)œq:Þãê9令ÂbÙø–È'^oÕÛÞ1^£ö¢M~£ê¯WüÅW V“î ÊÔ¤†24­3Ýñc¦;~:`†—âpPú_,P*TNœ Wjwpšzõت,ñ ºZ NI°ôm8*àìÛ#ÄÖÂA+VÈ9Ì›¸[WŸ%ò åtþØ*£ýz,ýc)F|N—³wÄef…J¢üeçÜßTO¡4ûÛ%x Õì1/(è³Þ¯]1/ &²gþùšG¡éÁÑw¨3ÇŠ€™Iú?; ä$ýMoPÿodÏ`ªTfx0y†xÜÏ1F …¢€‚Î&˜‚ê˜*…Eu“‰6‹ ˜Ó”ÊÓÒfÞTJN ‹íjÑŒ pFÖtîx°XÞ¦£iÀ·P$jzÑÅþ©lí·ÓK8 Â{ š¹³Ç®ì—ã” ¸ª–pÐ*Ä]êÿHá´Á«áóó.KPŽp›B@æt`©õOøežµv endstream endobj 399 0 obj <> stream xÚÕXÝo¤6ï_úÄV·>0LóÔS›ªÕ©ºS¶OÝ*"àM¸²°ÇG>ªþññØÀ.\¶¹öªD²±Ç3ãû7?¯óÑñþ|'æðï9ÙÞy³q^_ú¡ãû,ÂÙì`~í{,‰œMþ›ËYÌ‚ÕÚ÷¹poËÃê÷ÍÏÎç£Ã‚D:ŽH˜ õ‚8röN0ÛÏÒ¹rÞ/…Œ‘Vu3ÅÒgKÁyNñ(dgu9Sì{œEÁ¨Ù÷"EçTO¤¬Ó]Ú­ÖA,Ü¿¨Á]èÎÖÍVçÞ¥Õ­Ú®p,DOú}eaeßjÇ^_JUz Y[+\0k+WOU}h‹Önƒ<›.òcßk!˜GKîë"_­%켺ã×ht«GM}Cóß¼{E¢ê¨óát@/[],:K†}ÉD  ¯Ú¬)]QWF^Lý, §â›;ñÜmê¾+*eÖm.òY?ÝŒñOuí’1²P˜•˜S>Zé»YܬoU¡@G3&=z²Þ-yå În´X0/X˜éuwG»Nô·`¤é³®oR: ë ò˜á 8LãJ7mŠô¦¤Sp7E·‚Ðm«58¬²bëù¡Êiô7ñD’´=<¤MºWj7"%‹£:¦ó­pتMÁ·K:Ö~"XO3ûãÛw×o®”Áí$Mxe‚Àݧ ÏêÄç!T r“¶Ev±h8§Fyûß­êjý2ÿ.NOFÛ¡àÛ¡0g‡­mì¶I&­r×ð‚´]mZ«¥?à±.äZßèCR÷U~—Ň•»£þ‘]ÀcŸŽ" ¦'2¯{8‹ëQ­Ê_Q캻¢¥È —ú…9­êc_Ði.ñ¢I}Ñ`6°]îsD&l瓺uëª|2+“Ê´U4÷—LÝYg ØŒ˜vœZpðYz/ÿÁ¹2' bŽzi»d$™÷o6  g ÎmÐZ?ÝàÕÿpƒì¸(žpF¶""‰ Ï“ $&‹1ßghÌÄNÛåslCNtˈù:§{t#$´Ä% ßÈꊪÈÀ*ª'Ðڳݴ,iUÚ?e‘6O4xZv¢E!øÜâX!ΫQa†µ"L¨ MTGS.du‹Q·Ù…,>NËXàöHͰÎ!OèňyÄyä ÷ËÉûÉ|ŸAž‰4¿Ÿ#°Ðd¢[‚-~V÷ 5èG|yÐxä´Ê4„z!úÉÏ@à0Ì_zõ€KŸBŸÓήLoÛ/úĉâgŸ8ðîŒ'4¸¾I’…Ñ$¡‰¯w$u6ðþ˜lDÑ$0­³â6«ÐÕ„suw†@zÔ⹑C?¹’çhcoà³`‘}qèä,‘θ ÚÀ T«š{M¯sâö´1¸Î½åƒ–_ ¬×ðX2£‘ _c}Û‘–Š…¡>óÈ Òퟪ©™‰^39Ã_Dê&WÍÀ€ÍÛc¼PS¢¥s¹gÆ\´Î%>ü,pM–Ú§òšÞ‹í î견1b‚ôºó¦.û]‹*+û\µÇ<{Ð3q€P&‡1FC&>*ÈÅÜ6§Ê'¶©œU`>-¥©i÷iežÂ(p䈮¯“zƒ'µŒKÐdŠDÛ0GCô€S]6pùà ”Œ´ºíË´ùDÑ‚ó¸?}—¨Y ©ö\,_¡à32r€‹{ß:ckëšp µó™Ì˜WrmKçþP*«èØ›çð; c ØD Üоì°o°G~:á M* Ý¥V‰iwêfƤÂèiãÈ,³$¢®Ê,3nÈER0z²œÏ%–0‚c’pü›ŠDë(¦L(¯‘•~ÿÕß?DŸf endstream endobj 403 0 obj <> stream xÚ…TÛnÛ0 }ßW{™<Ôªu—·§uk‡»´I°—e(ÇM<$–k»m ìã'šNœ`† HR$erO8IÂ+Â?!Ù†œMÈéW„s–jM&wÁ󄥆L?©`–™(æ\hº\WѯÉ9Ÿ{ÂdêÈÑ)sª °†lˆ‘ÌÙº&cróB‚Ô'ɪHrºý‡Ü)æô@îséÿÈPO>Ÿ5EÅÒ*ú„¦™/›¶~ÈZTÏŠí<’ }~Óʲh‹Ù½_®Q" TxzáÐ')ä‹û„B3m»„ãçÒW;p¸ÖxÃ- z¬5K0äÑ‹(ÖØãÛ¬ÚÞvé¦ZÕ~ŽÎ·×ÓèýK5ô„Ü1-;ÂOy“ÕEÕ¾ìñú0¿f©:„OVy §iíÚ¢Ìû˜£¢µci–ðGU¾ÀZhb÷Ýn0Ŭi†.ƒÒ üw¾F[‹EÚTAZšgÅ4á*_ Ú²Î7¨tÒôwCÃSÑ®¨0æZ0Ø&É`SBe³õÒ×8¤”@‰õ äÓ< yŸá,èˆT¸.ÙIÊvCÆg5úÜêe?öðÎXj±é‡”pž ‡h\›Þ Ƴ!ÜY&öúáÞi]Ç.˜ #5RB’#rÄZægL‡ D)` L°#è_¸y^Ã›àœž3”xY—5ôl–N§—›*t>/ÁÖe öçAãü[T¾æíÊwä‹wQ¬Çe×åþA&Øö †~? ùÊ?Ôå–¹“ý¦‚=]öýˆœ¢~Í XSuÒϯ9| ¾y@hC%Ä)IyšŠî(hUu>K…±qøî5ïpµ…p°?± ;î°{ÒîÐ7¯þ©JU¿ endstream endobj 406 0 obj <> stream xÚí]Û¸ñ½¿ÂZ4fʼnT}h€¢×»CòÖíƒbËkåli#ÉÙìá~|烒([önÒ½æ‡]@üÎ ‡Ãáp†^¼[ÈE raüÇ‹Õ~ñâõâ/ßg i„6éâõº—2”×ÿŽ”pWK)•‰^•ûÛ]ñáj©mí‹n[CQEknhêCWVE{õŸ×ÿ|ÉQÄⓉÈÌb©2¡5á|½-<˜Œ8¥„Q@AÚXâ<±$Z§Øm*LâG•- Ð:Êùsw¥lTìvXSÑ/U}¥Òè®âjqËtUu<€Ê‡}Ñ”«Üºm`šÊE«b}h ëpæÚDm½{O$ôŸ?q7 y³+ö­ n—™΂HHxú?&òŽÞr­ìŠ&ïÊÚwv #(èQØêÅü¬¹·kòªÝÔ;=V7åMYá,°¹½o»bï{6žü»C^îÊ…rM2ZÕU K– ¯åÒ/ŸÔ"IˆÿëH u}“MeÔ(…²ºá*Ðß÷%P‰›-WÖ%H[Í(í4ŽÚ¢ÃõJ±„`﯒$Ê›2ùµ D²¼bàºd°"s2?C„…ÅÛë93 åF{m!Yi7Š˜¦ëA‚ùvÈÎŒæ©D¤©Çu çÕokX¤r?ì„ } “NÈ'vªëL,‘Q~˜!™Å žäÕ3Ö»»m¹ÂEÜru›û]À@O7õnW£àïxUæyÏ¡ (,"uUR˜Œèü:·éDæ<Ã"-Žf€a!³Ø ‚s a‘‚3Œ°z1@\GsTŒPÆùÐ÷ëHнH„§ñ¯"NÄv1@€JŸpjz$ç9µB&#§>#ŽäÑÒP_4Ô'J#ZzNŸÃá’¦ü±Ñó¹ÓȤŸ×£…«CáÚ€åj†B‚ŸK¸úœpç8]*Ø–h›¤ÈäSqûbv•{Š‘Žr·a¼=‹u&EýŸLŠú䜈äsš”ôA‘$_¿IQߘI™Þ!¤µ|gŒ 7e;ùü/3Vͤ"UÓKë%¦?ѪØ~N½b |<`Ö 4£`!ëfè*ÜɾýWŒš÷dòúœw²¯Ò>Fü¡=ÜÏ™<ؽRn”Œ•€EQNXå™UsÜfH§ó)-âþ О“¥I:hƉ”méݶh X#ã32ÑÙ™zZ»öà>=Z›p‹|7»‰\2„о,¿óâL¦;dü¤³³TÁ,¾ðƒÈ¹qš9¼Uj¢7y[®°˜LC´ßa(Úž™R–¢íú,‡ÅgUÂ'5ã§„Cí“•ð 0¥N$êD“¨ª«å ‡õÐz8ç…j0œ2ô/Å^õà ¤C±Ïà‚‰©G#;³†ô™‰iªLd* 4 áQ2€1ûÓëêðÙ£UÝvóÂË¤Ðæq= ÌMÐôwÆÉlçñeì°øÔ£ñ]’Þ¼óŒe@lÞû°¸œ§\qnš?ôé7έé> gÂìæÜŽ€[ ¨îuôCŽ#﹫ª;N1-•N„›æŸ¶9&¹dæ3:*²{ØL‰Ghõ‰G®`–N^_ý†_MÙ:€ÌwmÍÝœ% qbJÈcßxh®Žù)Ç9`âIivDzÄ;Ƭâ®ìJŸÿŠÃ‰ä}•“†”:]s>jÌjØÖ‡å®Ì›{†ž9Â[•>+9dU¿¿r€¸Þ3k~V:Ú•U‘7\ùÜ4ù~ÏY0eª&*ÐYvÜF9d¨SºØrº˜Ò" à†sßSßvåž–BQJøÀI\êÚL¸1~¥†ñ…ëd錔Qñ¡„Í ’7Z³Fb¦³âB¾£dwŽÑû–G¼a=åÊ]Sv]á¡ËŠYM¥òk%ð[‘¦§ãW;û‹C'ö—}Ѽm‹îtñI&ŽdQâz8ã¬պ徻m¹+¸ñï”v>EìLŸ´5Q £A/Þ«®²ð€cs¨V~.Òš›=ë#ê1Ë ØY3¡o]tE BzI,òõœ‡ÓâóiU7 Í·0 S\û« ÷)1ñ&eÇ]¥Ëp¤ØLáo€;II¨T@LøõYp’‚"·[ÞŠП–P$1`!> stream xÚÝYoãÆù½¿BèU¬ÎðFŸâl6pà=Òõö¥*‚19²ØP¤ÂcmùñýŽr(i]õµØ4Ç7ß}Ò«ßWbÀ?±J%üVÅaus¿úî]¼Ÿùê~×Ü$«ûò^Ó®7aœzî«~PM¡qŸy»®=ðêAõUÁ@_×qä©®Rµîýõ&©·õÞ«µL½iÚAójØ«1T ÿ{ƒ¼Và;+T¯O®ï>ñï±kÐáöªçSæ8óÊQÕëÞÿLò„~“<; ìÂ+€ C¯oëq¨ÚÆß® ôÇ{V‡ˆVBø9¾!}Ä™ŸÒség¾Xo„±÷Xí£ßW~˜g«§UœûYDðñê°JB?KÍ®^}^ýrû Ãúêp¬õ3ð'2ïüɑͯë0ð4Ÿ’üp<ˇOÕ°çcÖÝWЭێI+Œt&”{=ìQoÂ+I¦ïÞeŽGl “2ö㌸üüÒ´Gðˆ¥ÖÜ7"õaž*ô¦jÀÞ1+îWC}K„¯þòé /жé]ðCq4GÕ¶ë¿^bÓÒ}‡Dò­î‹®:¢‰ ¼ëè"öóÈ¿GÍEqîu-¸E£Í›…\‰ôÓ|áA. O2?4µ‰’ÀSüSvÕW tr¤7´|N¦ÃšÉò ›.ù DZ¾™ ŠcPxZB f ¸û½1×FD‰ŸÆnTXy7Q@¨]¥lâéž&OÃM©#& àŠ™€Ef’™§‹jˆˆx…Sç½ðÈÖ±÷/] hlðÝBÕuŠÈ•¨’ŠÜss¼×çA>ÄxÕpÞzÃ[Õ”&ö‡¶CùÂ0Âì6ÖCÏ펋öp…ÎcÀT¤ÃÄ´*B¾pÇQÏâ‘+«O|~Ãç‚È1_/¥‡KÊnx¡ °xÌâ/Ä Â][3„‰'Ð&âòáß×™ôT=’MÀ¾,„"™P„ CC5¼x`o2ÍÚW=9i˜'œÚá—µ‹~èÆb»‹±%W*Üà°?¬(ö3Y`ÖHïiE¸Ç˜Ç3½I†Ëô„Ÿ&æ• ´dêËЂÜmÅªî © †‡ ¦< §¥TU[5”'yhKWkl¬r”+`5«Š·š9‰ôØ©ãžÏ·Û–¶ÏÃý™ŒÁêážß$ónô®í Î9lw/Uóh(¶C»8§°9»Ù[Â(5&ˆ2OuUPñDðàM¿oǺäuÕTC¥êêßæå„âU¯ ƒÜ¯ñšÜO,؃mI€ÑRïD?S‚&¶Q‚—” Pˆº6–ƒ/–[(S7¸{R)&‡)K¼RaD =†#jå[2hØ-»È‚L£Ÿf¢zÈB`„í ŠLEài8m´.µÉà,±Œ.« qÄÚ3yði >£:LòaJù¬üPÕÕ€¡ø²Î" Ï$²X¨»¹(ä¦9ý„¹·¯ó¡]ã"àJŒHu|Ûè'à”-ÊX€óŒÈ«Ž´pæ+Óot}_v–Ö©¼–€ÒhvÉo埵Π”€©MÀ\ÈÎJ.Õ¹þÁ\úÒbûðåîîAéçbN®\Bù×M²à-¦5Ÿý-ZÔ-v}[bç(C–õÞÿØû—º8“Ž2ÿ¦ÁdMY0™ |É f@©5 WVA¨™쀇¶-à+®¯bÊ”ºa¨~, Ý÷»±®_`’ûªrûÖÄ^-=/ Ö’;0=™"pÓ„ÕÄ+ŒE—Tð*Ûk6ºØ˜ ”&è5ޝ‡0u‡„Pà:š ÏL‘O i á>bg„0-*ð|‘°‹½[ƒ°m˜\HäzK…é…—Û2‹jê“HY¨_ã^Șêm¾²š·ÃÙ‰+o@yhüPòŸî>ýúãÍ÷oo.eI«æ/âÙOæ¦qƒ¶yPÝ`ŽØá  ¥¸ý>x`Cšü…'¬)ZŒ‡áÞà8K™›PržÏí"ÜR»˜P»x®>FL™SÒ¬@UªÊ? *H†x>0)~;¾àŽvÕa¹õÔø ™ZuX!3š¾x®µª½Ó ×D3ÖÌ/ú--&&zÈv缫þ´0Y^Ó)g›Žyg $õ*ý2]Ùe_á*Ÿo?üt«D Mš=dn]%²®Bg®«D±~xûÿ¬Åª®7bü¥Ë7¬ÍÊ×ÔBÁÊC|#gÄ'¿–ÁÁNúj×½ùøå:­ÓW3ó9̦¹ùCÚ‰ÖÃ$µ¾°U NaªìçDº›Âx½,Î'°?¨ç cbu€µfÛ\tšgŠ=ßYpc†VrŠÎŠ—\¶`a§0¬Ž™Çó )uÑá'_b À¶F&XšO¡ØãLŸB±ûÎG¤+Ý ¬óå ë+Kë×:âÄ:p°´Î<Ã[ëØ¦a/[G¸ÖÝÂ:°ôÕóXëØ®KëÀ[£È:Þ[ÓÀ’M#²éÃ’kêÀÓˆl2ó•:[~ÿMs{wûþ¿š&ÂLŦ¡É&ŠÓ9ôq³0 }­uMåÁétÛb;_ÙqSÁKó©]áÍÞŒkËzÄ•C›š¢Ÿ ϯ–ÿþý5ò‡R.]Sº®)O] —®)O§{±˜a’0+ëÒF½”î´…Û¥„öÏ Ëá4Cíl’4ÅÑ…s ýËŸþÄG6ü endstream endobj 412 0 obj <> stream xÚYYsä¶~ϯP%á¤< Ið\WìćR®ÝMYo™”q0zyÈ07¿Ý„7ü…7YÿÁMÙÜ|{wó×ïÃü& ü"(nîN0¿c?R7wÇ{?üôþ—ïÞ¾{ÿýÏ»ÿÜýH‡v ˆêîlv{•ÆÞOïùûØw÷µi¸SµÃ¨ÛRHÎzàFÛYÚªÑ5·OF¬äÞÐÕÓXu-÷^×Ö/ØN¼êÄcãõÁV}ÜE™gzbÅQ~’£ž­”7 æxØù"ÓJü=Hµ_E.ÿø’ŒùHrè8 Ã|‰-G| tć¹Y|ÜðÄßñúXW|š‘¯`X‹%}Xø)~;Uõ¸¯…\ñ)𵧨Ђ¼†%Lü"†mr?Q<°r¨šÇÚ •÷Ž|nÃÈá|;P8@W3r,;äú˜¬tÓ˜Hº#Úi¦¬O¯œÄÕ¥Ò†J3OdÀ17Ф0AFÿAÖw<:ŸQv=œÂzëÚ#[5-{e¿î´ìàÈ“,Ž/—™Ý®ã#™ö=KÇ'&bá‰\nèwx(GŠ#Å8õF¦N<(á ôú8lÍVx‹¢Ü/lØz¨±—óÚk¦JÈPàxèàöÖ°}4'=Õ#3PkÞÕ€–s»‰‹Â»euïUùyºêˆ*Å©á×´š"alý!6Ȫȓ­L!VáBw€¬¿ïjžyÔàÎÍ8G†5YêVPÙÖl€‘̘l8wS}äÍgO‰Gfœ…Ø8+ýÐByÅ»·©Âr!:ÀŽÌÌ>Ž ?[Å ÕãCá_ îr|ø#Ó³5y—'¾ÏA°2=$ÃP²3Êan=MË-ñž…ë= 'ç¡Þð©‹Æ^…£ md…:©~e´j0 Ä*÷~dþi1lM4Ì<º•è{Åñ¢kàEnu—¨©~×rÝÃ.½ pdõŒÓKD„Îb×WÙIw¢ÅL‰îsä+!õD£è®à¹2ÐØ¹#¹ ‘½Øøæý-/Mô<„IƒCl›v0vL<¨ëš‡ZSšaÐý 3K™‡ƒ68î­Dë¼9ÍW¸’ÞRÔ41lzpN|!‘#lj¿€Uš gZ¬|h!>´°^¸pýfZ¸ÅDJ,;´NÑ»‘#f—”æË6W#ß4Ä9Ût#-JÑỦ6*i”œ‰÷ª²k§Ñ&oÇ xˆ@Õød²qLY8eÞu1‹W èm7’G)DqÈ5ƒÆ•ï£ëESâ1‘ºã/ÕY¸˜œ œ¦û€8cÇ*e@·µÔíIvåÏ"-î±hçÖ ÃiÝ’.¡\¿˜gÈá—a~ ÁÙ*»6“ˆÍ$Ë2×f×f¯ÔmÛÈi_YsÈveœûdœ½»7Ü… Ò,ÊêojUK¡.Í"ÆÈ^ÐV» ;Pðc7ëxá‡V\Ík´ùW°Bz†Ë¥–©+9m—‘`ßû[ûüJ¹%ÇúÒ(Ç*µ® Ö~p]I+¸+ áE_L ‚—¬éKŠÇŸç¬(‹½Z÷†›‹Š³åïm–8Å Z–þ°g\èáFÝ ‚CÊßÉÐYˆWHdBÄ.ûQNâÔ™Y@¯È¡eû2h6>ö‘µ]h”SO~?¥Š-ŠgW%³ ‹h*NÕIùŠTKÁ£”ÖºŒ‚=y£ÈÖQQ²bšøuÂ]{êêš\îÓfñÄëßÐÄwwïIaæCÒ~HúØøÚöÍnP²w÷¿BM ‡ü?ÏÏÏ2ÃV¼š|yyáÆÁk§æ°ãNÙnYÑ^N]Ìè ï/œ›æ¹÷ß­ì,ýØ&^Àâ–iž…Pü„Úˆ.]"hÅ V ¦8qœ”:5è_Äó`ªçé6¡R Æ6ù©eâžâ$Æ:,¿ž wÑy®8O ¶¶¤ñÓÔ–‹0ö5(¥øû((|¥VOKíPêšbb $ì«4È»Ót†ê¡=ì¾ælk$òS+.ÀgÁ}ɺëÔðT„oÌ SÃ3GçÇzþÊÃ\ fŸZÕ×ò8Íp,ç<,:ßþ´˜‹'”D9¡»³³ÂΟ¢,—t‡9dc‹Òdl|¬â Í€¾j¾‡Ãî+ôЯØx”ø´'F|N<‰RTæ›+û‚ Ê>~¸f.|Ÿ˜A /ÉÁËf”oP[yÃx‘à`Gô¬“y·èp”´NL{u ¯[Â'_Á(ó#‹À¶w¹p¸U%çÉV¶ NÅü¤0ðÐI—#ä/\—Ø«Õbœ­ ¦ŠßÝh]ëARÓq ¯brxýT}¢ÀÉ/ r)a©æAH >‘wˆÀ>*®gÃî†g:ÈÙJ=’ ë¬¸˜µ1?[8',ï„ÐY¿&<*àþ¯„WLÁø–7›¯È— |[ëöÃVýú*Ý6F·çSûlo6ÖɘŽݳȒ¶¤RÛÂÜìfð&/™q¶zí‡Þ4Ìkçóܵî«Í>ƒM\$:IÜN¶!ž ‡–CÕêª)ùÐÅÀbg¥ùõ¡ûÍÖR [Ç‘eóÇf$Fq˜à/[O1þü» ùàÍ*Š8×Rf-uÝE>kºT”¼o󲕑l°SìfÍõ'€‚”ÅVHý¨‡ó†-©ôs(ÅBð§m”ÔçQr4½F)ºD)½FI¹(ý_Æä¯ÒÆä⬊) ‰–ú_ø䵿ô endstream endobj 415 0 obj <> stream xÚŘYÛ6€ßû+„¾TjVIíSÚ\-’fãuŸºÅBkÓ¶Yr$*ÐßeË»ô•Å. ‘r†Ão8Cyï¼Ð à/ô’þo¶ö~z?=M½0`YyÓü<ÆFìMçû¿ÕÕˆ‡¾nêr4æiäoò&_+­švôÏô*CCÉ2ÃS&¹>]-Œ‹hܲÉ7+jÎU;kŠ»Ñ8J}eEò²¤—(â^i•’@×4ŠdÊO$ÒµjN?=õJá ÷Ûb½)ÕGêmëòý(J|Õ°ÑXˆÀ¿þ´Æ6š’øuYÌ̺ÆýR8“Ò,¥ P=ç~½ §±3é턎=;¡7Š^¶ƒÅ`0¬¡ÝÔÕ¼¨–Ô¿V{¶3™EÁhZt´ºéfº´ áp y–°· _–›Ûv=Û8öKH–öbÌ5ÑXD ©7æ>P®¨ôh,#é¯Û¥òdê½óÏRïƒ'cdÎ8÷Ö^°PöÍÒ»ö^n{:vB22JõÞak°4²¶Þ?‹¼+õÏ.£aU0!I>{qõÀÈPp–e;+Ckä§ÌHY;_^?{8w,L§,9=õNÊNýèÅ Wx%,ÌzŒ,§qÆ@ó æ^ª¶Í—ô%rdüEÝXŽT³.ªÜr[wzÓ¹ÐÔ¢÷æ-¬úöÕÓ§óâ˜Åš÷/é«j ½Qð‹16X@¯åÉdržÕ4ýºòjNKú€ËΛjWÆ-}Wå§ Íyõç¹knÖäØÏ\·{óš]¹§‡–v!:+»Ý‰RT 4IuÕÛÕ;ãfÄŽÙæŠz¥W®“$cBžñ±èŒR&BðK3c ñ¥rÛq0ˆb1%¯«Éï/¹|Éãñý@’‹’á~\oó†ÁG¯jsX[Àê :ôXÌìvõ !pöeápS9&2zÑH°Á¸oV9uC"mŠu·6³àËÌ}Ï’Ç}¶éÐîÏ»/³âê™ñ£M½t¿°ù¶°á±È‹²ý‘~k?z†ó®È·º¾—eÎfÇ–‰“í L1ÃP<Ñ_šÑ$‹Q{È‚Äd´Œ|Ûq8¥íÄ}2SGJ Y˜ gV'gˆõ³_?9ÖÒiMR4o¹¹²~$m[U¼ëÔ™18½½ž>>ºV>y3ïÔ›­>jªVé¨ß~3º€xÐî^¼Cû¦RúoÔL+Kq«•ÚPIØjêRó¥ºÆæÁî9¢“&ˆØÚPŠl›‡¶v'Ä©8Öh•£f‹±zþ*„óÔœÎ[;Cžaè@ÊZ:q.9KÅpn™°(==ù@ÌÎþüÑä\ÀeŠÅÞ“ fèïV6è“ÿtÐîv‚Cûó¼iŠöGºËÛ–Näfß)'y§je^ww¥"ä5\Îîï8ÚPÿ xDX¥'°bÛ>´Ý)AUúä÷E%¼¸ Õ8qM±ìH¡Beùt”B=Rª&¯f˜¸„ì¯Ã"¦œOâqJý·$dR#Š˜t/wy ÷_ó ÷ä j™[<<·ùÞ ¤ÁÍxN#Xêc«©ªõPe^-­Qzµ§¿(?¸lÓŠ /¯ê¾ + 9[YH»j·bäÖfHñÚVõ›®±êV1ë¯AkTíÎÆóX‘\²$Û±bÛ'XA©Ìªyãþ^dŸGP ï³"žÀÃ/2û¬ˆ ÿt‚oÈŠ¢+ ²"‚À°‚?VPÖ²‚};V°…{ŒT™aÏ€”Xd–üÁ‚²3ü–cIAmD Š&E^L ïIß’”,ÅËÅŽjŸ"¤$ÝZ6Åû¯yªd—Ÿ*nRÀk–¬kzÒÆaªˆÑ•Ø)}UKã)”Àåà¡® X·”j­èÃî±ýž†ãˆ-¬vú›—Q•:‰H{t —ÐAÃC'3è¸YÙ±DŸ¡#Ž ã>d³µûNNMìŰÅ)$Â^úõwÿhvgž endstream endobj 418 0 obj <> stream xÚÕWkoÛ6ý¾_ÁV±âKîÓŠ-C‡¬iQ° ƒbѳ =Kj7`?~—=#ÛÍlbÄ"y/yxÏᡌîEüQ1øh[¢—ôüŠÆˆ$ ´Ù!*I"¯;B´É~ÁYÝÝÊó%“¸¾ûàýºù}¿A÷ˆð$FŸPÄIb⣕(Š}³@ïÐÛ•5Æ ·FQ˜iŸ_É9xLÀ-ÎÔ.íŠö… œÍ'$¡ÒEúß½¼~€‘†”ÐhDICABz æ$Êáüé۟׀FòPÏø4”$–ðÉÍÈuí±òXŒÕÑó9Kp‘—y <ÀõNSÜî•븃’KüAmÛü£ÇB¬lή« §®ˆç Áñ« wyt™a7_Ÿg[G•nõà^5vÚvŸ7vhEqZe¶o yÝæ•†ßA’Ý¤Ó 'RZ­¨-ÌÜäÕïÏt"ïaqÜÔ…EstêXæUÚšõg*=nõ~÷n‡·ø}£2;˜øbŒÎº´pyyy(Ôv¼®Š?½˜câèX×8ˆˆ¡qøÏù¨qÛ¼ q’̬Ñ=Æ¿>§ñe¯Þó0'Qç—hüýáàù=ËŒZ‚G#pÖ­;VÎæ§VàÐ=Ï ŸäÙ¨…ÀY/ð9(+pxø\çÕÿMà‰ÃÝZuÃΗ‘¦œ› G "øÐ>%œ!*Ô 6&ž—+Âa‰Ù£þêõæ¡ÀyLX4J%ÑE CÔô Ì `Pø»‘` HN{SuÂ"k[ V¹hË“\Ä‚$tÂ…m_â"† Ò—‹h_åó@‡¨èqaOr8š8åy©&d<³§%w•yQä‚Þ5çxŠç<ÕÝÊ¡ ¼EùŒÃÍÀ`ÿa  Ö·O툄Z·Ý('j™,kÉàvЦµ¼éÚC§]‘JÀ¤î;UmÃèÒØ–ÊQòv/žàõU:¤Ç´T­1@h6ú*€wm~P¡\ÐÞ½ACô ç?3}Öùt¾1ÔÐ* 4 Xs ª]}ôOXt99‘éÁP›-ܺëÃ>ksmmUÓ8ÿ­ ÎÎ ò8»='$Ôá£tlû’t *´‹dP²§’Κp$‰øR7z§tM7,d°X‘j.{ݰHÝè±ùÑó£N9zp¢Ý|¨Ý;(‡…µ>ñºÛ0d²&zÑ!;îŠl‰Ì”´eœºãA]ÿ­Št8*½;µBRÄM÷×oZº¤„ƒ.¹LH µ¥Ãµ¿ŽúŽ“ž> c¶‚7WWŸkê2œýFzcëä6<¾O1\t¥_œpíq ØÚo7¯W–|Ôó_vU¥æµ_?w»DºÄ:œoÖ øvö%ŽÕ:¬Éòæ !=‡†”™ °X«ÙáWHlÝB°>úíWØ€ endstream endobj 422 0 obj <> stream xÚ•W[“Ú6~ï¯ð¤1iºZvÒv¦¹N²,iJgÇ bqê ±lÓéï‘%ÛmwwÖº|ç¢sÓ‘÷Ù#†_âI Ø[dÞ³™7zz£GÞlÛC3 ¼Ùò7ÿå}œmR5²ùdðûìg@‹4(â@"ÁjŠÙМþªHÓb@¥¿Oò;»¤nf’ÅInFÒß”Å]gv¹Tñ²²ëã©]‚ýÛTev1É+ç ÕÌ,dŽ ¿WK»ønzݨPf±¶‹«²Èjý‡Ê Q«lˆA+{8rh "Á"EÅjÇ%Ê6Õ 3‰¨tÀÇõþË™3õ‡×nPÞYc°=Ф!“Éвᰦå­!s‡’ÂaéÁ‘æ5É¢‹”Û…«1Êý87_áÇËÝ@Àlµ´;Ižè$Níä6®’ê±~U¤»|UÍ‚ùÚøÐðèŒmHö‰^Ûuààš$³…_%ƹ÷ÖÈNÍÎÈ™Òëb0„x0Ú0îÏý[šõ—joS=•µl_&ºÖ‹5zÁÞê¤È-Dvõ¼)8ŽÓcGê{}Æ‘ÇQã ë6á…ËI›ˆ= Ø¢ÚÜWß-Ì\øF5=`)A­±ß&ù"Ý.•¥ø¾Òˤ@ë ÑCœ¦ÉíWÈàò.Ýüq€ëD'¹¶“xsW$Ëù Ïî/ðQ(àscÏeú´†ÒQ~ŸÚýìÇ- ƒµªiçþ|ð´/ Lšß@.ÍýécKûz<½Ì½yñòù[·tõq váÚA´¯Ð¢EC çúâ®Ã?èé¼JK•ªÖÓ“°Rém™;uíþ°gç¿ûmâN«£€û—ýL¹²lo­J—TIeÓ©ZÛýÜ\ÒAš©2Kò:Û]lõf«í¸®­³N\®¶µÞL\…¿˜P4bÈjøb£¾3D]a\ñ7'\Æ:¶#+ÒŒv‘ñ!Ô·ïÔrxbùQñê.û¨Éí'µÐÉN9Ü ?}XH©Ý/‹}åIìhu)ËÛuB¨´Ã¼È‡_TYT}ŽAD"ÇR-ŠÒ\~†b_ûÅŒLªôƒr’»Œ_•ª{GW iVìÔ²/ôysi´vn/CW'ÑIc^'_œÜ&êt™ÄùÝ6K;ßÄ¥¶£ÄiÚgéþÖ2ºv÷Flt’ŒÒÙpÇ‘§Ü@þ»0OžpC/Éð +n?µe ¸ _"ˆČFX}‡™;^¾:FQD¸€}a—ç>ÅÜ•Øa„89%0vÖFP’ ¤ÀŒŸºKû´ÆUyß^’“ âx€¹ŒXpAœ75$¼‡iÔuU! Ù¡H¨N`ùÌÏÚ5B”b0^å¼]9e‡²9£ÇÒ2£,Î  e  úð ‚ Â$Á¬³qxÁÈ`záÄ`GÌ8§8 c,`·‚Y#W\’+è%¹$ä" Ãÿ#Ÿj&ÓÙ›w?m<]p=œ½™\ÙÙ«ÉÇ«}Ê_¡™k+Ž)2®Uêú¹º¢Ç•.ض²ÃåñÙC, ½½a0‰õ2܉h;O½kï½»en@è²Í]‘ pî?î·-Vv7 ˆ zõȽlLA£GoêÞ æÛ¾Ahó¡,lß fq;(tU4òýªØæËCV¡½sÍ•ÒÐ÷Ù±±tÍVæª*ò§¦Ÿ†nXµMïÁ•Êà´Œ»Vv¥7OF#øòš#*Ê»Qº™ µéŽNÏàøäd|Ø\P(¡ÐßxÈ„ÖJœ5è÷ßüWžH endstream endobj 425 0 obj <> stream xÚVmoÛ6þ¾_a´À*w1ÃQ”’m@»$CW7ögû0lѱ:½x’ìößwÔQ~©d¯qQäsÏsGÞÕû»Çz~¬§8üÓÞ<í½ôÎoü£$ Ao²€åyñz“èçú9LW‰î„/Þÿsò  åšI¸`á)j‹ÉÐ.óEž$yŸ+ç)ÎqJ7l. œ4Œ3œ^ùc¦8]æÉÆX髥ŗaj™‡cœ»Y¢SœŒ³² ³¹‡%>‰ë}eVÇ1h\DÊÚõpÖ€rí4úp î,1Ž>‡p¡°+qežÂY—Æ_!\ô×LEë0ÁQíg\OutF':Ù§e<7¤K¤„0ŠÊ’-Šœ¥gV‹_Çzþº?ÜuÊÕ3l슓¹y—ÎëóÚ°œ‘€×Ø—q6OÖ‘F‹ïË*Šs²ü±î²¥ LâÙHÙ…|LVíávÒqV!ÄdËÔÙäq4í·…ÿ õ<&+l,ãËÊ}ÂÝ}¸•é|…°UX¤—mÎ1®þ€c2/tXéZ`êLû6 è!]•Sg|†¶?ÇÆwW×?½·S·÷á¾àr±q“GIÍ9×.Oo¿@³@L~xnÔ¯îß /Û§Pï&çÎÛãü¸»p$P¤;ƒ&€ê¹:@¤½Ý»q'¬Ðպȓâú utÿ¶s¤Ie/røÕ[mÛ“­q]Ø ‹mñ•¶ì3Ø „ ×EgMÑåëjµ¶] )WÓEìzžy±îd ʈ§j?B*ÕÍÓ„·ív&Ä(¬B¡¦½Ú%Ò+BHGF#Ãòqyó›«Ú¨Ñ쓞WñF[ÜG m˜Ï9®ùSi3IÅp4Ï“ušmçã ‡Yž >ë"/ÛÙè,°”zžQ‰OõÁ˜‘©¬3ÛE…n€ù“µ ËÆ4Í7ºÃªã=šß5]ÚàG«*NãÏuŸ7ï—HÕµ ìë7º°›ÐÊqzQÏÞs_c\l‹€p.ôw”ãôÔq™mŒp¡yD²}B.}K‰KG8¡Óæ5œ(ë!onLIÄ«/kSב”^ 4Ÿ}Ú±RI$T1î+êSpXàjKœCy*—8ø¡<ýR˜ºp—ÓÊŒÉ}WøJœPö‰+ù¾² [eyBùH̆RÁ5+}(¡vgÔq†pÄ ìnCöD§°<æô¸0¡ (‡‚{„„Y#ÌÕ»Ç#æ'"†Ä®RúØ aHhe¶Zl…ýŠ­æžÇ…%e¾+}ß?!,ˆOù‰Ô>ì(ãÉ»o†XÙCûp7ÞOÞnñíft{Õ¶ü½€Ï±¦a›Ï1ûU÷床s{¹UùaÆ‹sÛ°›KaÿêâÐ!àuà)Eü rÝýë7ÿ¹ôª endstream endobj 428 0 obj <> stream xÚXIÛ6¾÷Wè(#E")ÉBOI³`Šiš4ΩS ™³Õâh™Èï[HY^052ˆ¸<¾åãÛhï»{ü‹½LÀ_䕵÷få½z+/ŽÃÃCªPfsÝàŽ›õ9n"ÃjÀ”C}»ð\¾ÀHæó§›þ 3ðp…"&²ˆ2‡#åmgTêT¼Ü—:\4PIŠ¦Ô¼9’ßÈ£µn˜ªËR÷ýf¬Èy€€Ê(â)ÍSȃ«­±§K›P-×uËqí4£9ও®M{ΑcèrG¡ËÀf© n-ž;hQGF{ÚGÒŬ±ËÂÒ¤~Çl8 6˜˜¦…ÒH¥×áÀˆY ­M$§tX¶ÑÔ(®wRXž$y'ȱbÿ†Û °_^yDÅŠž]l|õå\|xxùRó7ŸîÞ½yýöÍ'˜¿6x9Õ)#â¢ì×RXÓEW¢6Û+^° º,ÆÞ’L´¦1ƒ¡Â  drYœui a*Ì!H@Öüø¾ÿ‚]jxRÿmóÚaï¹ps¶}XaQ™õ©8SPxƒÓü’´+yxëã“©LÑ=ãBN!M;.©q]ÇE5 ±s:Ø/ú-wN‰ÒÖ©î…½bK&÷ºf¤kjuUVW …€z{Î4Gç÷°á„-!ØÂK]åËõÇ—¸Š4¹UÉ«(ç*´6w•ˆ#W9 µÞC(ÙyâqÙv&w¶®YCaµçÚ£óÎÕNàÜNúîKűzæI> stream xÚ½WÛnÜ6}ïWèQ[d‘%ªyj`»hÑ:N½}ª CÞåÚ*tÙˆRœùøÎð¢‹Wöú6°r8g8CžyŸ<êðG½„Áà­KïýÊ{{B#R’rî­¶°¾¤IcoµùÛgDp±¤”qÿºØ-þYý毼O SáÝz<%"Ò’Ø+½8$"qbá{g% ’Wy»gYDDðÁ²D¤‡,JÖ²*×»Å2L"ÿ;þp •gEþMYåå®_¬PŸaàËÆìY׊mSfb—5Y)[Ù(íîÛá!V"øÒ¢3Nx¢ÑÏ¿VõNåÊÍ8<ÞCò’s$6íbÉM°/ÑÙK<Â…ÍapñGp¤¼X¼›óš¤‚ðP›<’jÝä»6‡Ó}>ö€“4«¯n 4,¦~Swm^I»gâ6$Šá¢ þÄÑ€$!!µºCô•ÁÀ³ÄF'†¿‰$öooò5ªÜ˜õ¬±ÞuJnpÄü+\þŠcH•qž yE]WC^ßh—”S’Pø ^ðì6o! C#·YW´Fø¼à‘ŸTDï܋֑Ófa‚ÚÜh¹Þ⯰^ÁÄô¸01ºPZ6ǃ-ª­}@˜Ì+3—Í¥‚A.åâž4D2§¦Ú¦[·]#1Æ<™Ä8Œ»bðnx2Fx<"ÞÊh£‚ÞaVý:7qPeæ·5™>‘»t” ÔóQô>‚ ’‘1Ò€s-g‰‘$Ù1MJÖ²j³¶S†p,)m0Æ%¾5-^ËJ6ÃI#u¼Oø{•©~¹.ºÑËžò‘†F:O£#FcÄû|A¹4þBÚ5õ•%¤³Ç²ÑŸ.^¥ÍD¼Û˜(fèépûg°¤„V¹‘ö*6x #¼®? .þ8ÆøO4×]ÓHs•q¢Ï *õ™ÑšÛº1Ük8\oFÏGä:¿h„¯? ¡æ@ Y>ÒñŽýåÚT¦Ìï¶.йU?ÍÅi/¸¿ü~vùál5¥FŽ)¾ëÃYPÊ-f 5¥ÌŠw³ì`¬Ü<9þùü%ˆ[ ñ…h<ò×Ó—‚æÕ3`O?<v’á—Ѫ6ùwàSŸàÊ_§ïO^âIWañ¼ÂZê×]µq7óY¾Ÿ¼$¯£’S3öqþ¨±ˆ†,@^ÍòB» ä±nÊÌÚ„‰ìÊ0@×Y?kôœ c͹Œöœ‹Ëƒg ­3;0Ö¬‰F¶M.M×ø4u-ÆÈ›š  {²=?8~Û5y©InŽDƬÚÌö tÚ. ÁM—÷L¡}sûp•Ž¢ˆPÖWi~¸JGQHR6Ti+¨Ò#œªtoÛTÁ¦Roc¼gšBJ8Ù¦4Õ-ÐëƒZo_G{üaâ. ~~˜…¹ÊneÅ“ºþŒ> ‚/Î÷ý%üÿZ–¤>JÄÝVàá§ -ñ´`Â}J¤ËNêŽæúE—\´ Ñ{zŠÀ]ü‡m0£K½•zÓ$縣Þ+þ¼/þÑËŠÿ¨¸¿u÷Ðr4¦åWi{ðÊ­Áa^½M0 ÁÔ•qsÝqL~ÉU«¦œ=ù,c¯Ù2†/t‘j¤(vÚøÅb³K endstream endobj 434 0 obj <> stream xÚÅX[oÛ6~߯à£4L¬H‰­O+– Ь]ܧy0[N8’«Kœýñ;¼É´-[qÑnH‰Òá÷}<ä¹Èè"(†?‚…ÿ-Ñ› zuMRDÎC“¼HŒ3Ž&Ë¿Š%æaDeÁýzþ3ù]MÐ'„“L¢-b–©ž 8zD<ÁR¸áÝ¢÷;#KrŸ·GÀ’b!vÀ’c9†ÛÛXØe7_áÂJ°LvÀ„À,>íYYð¦·a”|1—:oë" “8ÈÕ“T›ty[­ÌUkÒwwó¦X˜Û¦ZwmQ•Zì«k‰Mœ)âÈ1S†™ÐÌ·ŸËjÓ[šQëO"Ã8b ÇfJQ‚Vf¶pÞž)3¥oªmêêÎüøn¾Ôa0‰Ä,јåmW—µe>=ÃYê›N>*0Ô¬³Ìíœ=Í<Æ)ƒ³§ÏáÊ!’˜`jíë|FTUÝ*w³$hc¿ðPï<ë_ÚÍ€Wn3Ô ·z´ªêCDÅ%ƒ|QLc’æK­ Ü#0Ëàš`ub@”òé:„I P+÷²à!_¨C“¤Á¼1/VÕz]… }Ûü<ä–#_þööÝìÃͯW×>fÄúä‹Á·K„;o]0*££+—¹ZG™/_ñGó@ÀõÕ/·ß†•ƒçÁOÿ~óíè‹ò+Üüùreu(Äû²òç¢i¼Ù¹™Â˲>9‹ñä¬fˆl—íx$={Näxœ¨„íâÄŽGâÄã9'=¶ è‘E®+u(·a8><“OGñ=+Kð‚vFi  Áïm£BcET$"Á)nXêj{¢_ùÉÜô3Šï%œD 4ûQâTpd óô(L¸èÃDè0ξ…—ó¦)î¡V›Q[ 1êu÷\¬‹yýÙ !À Ó¨‹¹)7` ó«Èu,'©ß±,Šy«¡!ƶEûqh•ŒãLXÙÅÀ².UD€`S‹npLÐ4>üTã¥\ùó ô¾*»‰Ü¯¹®™ƒ[ßÃ>‘Gåýí 8ʪŒNð˜uöFk[ Ûæ…ªw¬Íî$+èÁ^¬íÃwÑÖmLm„¥Z˜¸LØõåÂVun3úúPu/×¼ùr-¦J\¸…·—«Q]ð³;þ¾ÏΗÆ€€öe&/3j|÷eÆŽGÊŒÇs¦Ìôئ‚Œ@ïŒ,òX™éám’Á÷¬,Á¦./)3ÊÞ}0C/FÎôb}Õ¹ô+2qLO6c*…+ÿgáÙÙÂCŽÛ3§z¸ðyTx„ÜùZÆ{­°›_/2[hàÆ/40Ð¥ù$H…³~ÿÿú—Ê+ endstream endobj 437 0 obj <> stream xÚÅX]oÛ6}߯à£4L¬(’’ؾX ÅÐ.ÞÓ<Š­¤ ÉÕGÜýñ»ü’i[–ìA‘"­Ës¯yxI£/ˆ þJ"øÑú ½] W7„!B°à-îá}@B,b´ØüëE8Å$ôB"î=”[ÿ¿Å{ôç}A˜ŠíPc«IŒžPâ¡W¢[ôi„`ˆ1yw› ÌÄVPÌéî>È7µO‰·;'„ãÔA'D`1 ïDüMŸ•~@æ}—î5y×ù³OC/×/¤„$¨ŽçÞ³G^Vö¹Òöê&E5’'°DÇa_®ryh_«zܾ0üؾ°ª×}Óä•îé4§Éµjƒ³Š‡JY B»Ú<µ¼B›~ XjˆäVËÙ`V PÖ· F¸¾ÝÛ•žµ+±°Ó|¼È®t¿r µúy_—e-g¹k_ñ,–ÉùÞ}ø¸z{;BIm¿k軬-Öºé&àÍ( M9þúpGUWÁ½EÕf¾E×êýÏÌÖR/ot ¬aèÕ}µ¹XÛ?/¢­ßnÕ~­…1%,¹NØÍõÂî›<×­¥×WrG—¼±âÍ7ª ·à\¬æöz5˰¯võ»9›®24&²U&š¯2rHD‡*cºÓUÆ¡™¨2²©3ÐN”Ážª2¸ÝâgÐÝ0¿mЧ+ªŒ wNdâÔøÃE‡…0†=6Ê\Êø•u‡Î!í§uGåz´îÐè¤îÅlzxp¤‰>R{&¤â°ÎУC¡bŽ€©SSÒ³5E!™[‰®«,ÓeÖlïP:ïP9`¬CMwÚ¡Í„Cdã½h'Ê`O9t·~˜Awà ü×:ס·ºñ'§ 3>éÏË®u/çOBfÎ…œøóüµ.d'þ “jhéâ¤ÝIÂýµNîõâ†k‰´…á3maøàÀÂèá½.4—Ÿ¾×=^x¯³³;&ŠR©%ˆ“Dþˆ!DzÔFúíˆm|! endstream endobj 440 0 obj <> stream xÚÅVKÛ6¾÷WèHµ+†¤HJBo =Mã[\,´2½fW–6zÄ»@|gHJ–½ªÓœ Ão¾y’ÑçˆG ~<ÊüYT£Ÿ6Ñ»÷\FœÓB©h³‡ý„3Zèh³ûDÍ)—q¹Pä±~ŽÿÜüý¼‰>G4-òèiM•v'2£ŒÑyVG£+ f™ ãÑ o`ó‚Êâ [¤T¥_Ã= ౉SNšÝxžršŠ3>OM¿J|!4t%jx“4“äoü(²3ƒé޶1~ú%Öœ”-jãåªrìmóè·G˜pÒŽÍÎìÓ÷Žð»÷y„ªXÊ“I»PTeNûÇצ}îm?™ç/ñŒÂ> stream xÚí[ßsܶ~ï_q}ãML”t&îLÛIí‡tª>U} N”ÄøŽTHÊ–“üñÝÅ‚ xÞ,ÕSg2öøø\ì~»‹ý¸„W?­ø*?|• ø›¬6»ÕŸ/Vúk±â)“©^]ÜÀí˜'¬€ãëG‚ë˜s‘Fß7k™DCÕÕm߯c8ikº'Yíªá®…C]ãuíÃP7U¿þÏÅßaó‚ܤÀI¸bEºŠEÁ¤4}ß8ÑŠ£d*œT¸t=ÊQ¾˜$gJ‚Ê(â2*·=h R½oÚµÐÑÇOyT•È8ƒzø ç(»®®ºÙÄIxâL29>z¹¦9Ë®¢ƒ]KGŽPXt]u ](›kŠ<%³è#þSu7[R¶Áó‡À±)·fîXèœ #™RfR‹6 ïnF7mGÛ²»­â®ð‚Œ¶à…ÒÞ¼ïÚÛ®Üíêæ–­c%uôχ Nx‡÷…“›;¹Æ,<¨ú{3aµ©Ëíö“½x™p½©+£ô@ó9M>eŸèr_v}e J|SÞý÷¥DÕ®¶Õ®§3ƒ””0ÿvka‚Sõíö(OƒzÔ]ÝáÖ\ÀÎÀèlƒû7e? {ñîpW6$¸«¬°zw¿­íǪ́l#–›€£ˆ¥‘W37¯F© ýÛ»ÞÒ¥šqy'míв¡¤™ ph»÷#ö÷¦qè™ÃÐ)óÆI»~ØW‰æÉÜpœX¦ ÷¨Ëçõ"r&òIEµƒ?ŠÚ¥ë°Â¡êvt¯½¡_ p¼0·Š9à‚ ¤ÉS[ jñýÝ,ôžº9Ã0yrŸ­TÚ®g¾£Gü\[…àx‚“9¨æjÇùï¡ÇS@觤€‡Íç‘‚8Õ Køì=¸³í鮾½3æÇw¶ž‹¨¯¯«~á3Á¿z÷µ‚l3´¶ï>qìÊ¡«Gn0”yý^û~ü,`¥ ט‡’ÂÒËõ¯ø‹ÕÁ<¶)ǯä8:ùØÕÃPÙï ÁòÁµb|Öt_h¤ç§éâĺ4–²‹àÊÊJÙA ´>—Ÿ¿ìè¹ ÿc(§² †]¦Õ9vXF®JK>òlºYº°¿‹T žSß<†íq<ï¤[¯Bæˆ$Á/—/dN¾dŽ„õTú-äÇ€ÿ &°/Á{Ï+^Œëû\/Á{'É^ºG}öŠ{æü ëª-ÃI?aušBý\Ä¥G#̺¤¬Õ¡ÙŠ ÖP©ÒÓën<[DA¢)éšÏ¹Y°.ðB¹ÏÍöX…~*6§)Ö6ù>6ü6ú|lò î° r7ÀnC;¼²®¡¬Áã ì—Ï7áÔÉ„_z|§;:u¿ %œ‰$ÔÇ|¶w"´¶ ·2$âTù8忞`EÞ§UæZÇ‚õC°}v3ÇÆwƒÈ²%7Ðê –D N\©(ÃåäP{!Šs–ëÒ.¸.¹ºïÓ$B0=żb¡¾|yÜëmÙ=ôw¿¼}¸k~¹XçÒlÉ£÷þ6ˆö~¨wå¶ðâ'ç«ëÚ#a´¡ÅÛ \+³œ«9—£ˆŽ³MÔ X[˜\AÁÈĨüPS/n±2eç&ž,Õa•05§‡¡ep”ìq›’’c&IÏü°¿Pî W+Ooþ‚ ¹Èó—•/’›‘óÈgά(Ëì™R6_<’…%¼ÈŽÑ <Ÿìz6.b1ØåÎ%}¦ƒèIÒ³ÆÀ$é­Ì£ 3SØüx!håÄ0ËÕy3õ}859H“SS1üuÁÕ˧¥ ST–DïÊÛ®ln+:£ý~Û¡¾ßÖU×ÓÐËèúw²á€CÄE˜¥ïV?=xUoíï/±Á´Ëu#Å™6ÛÓ&¦±Û`GáI'¢¾À6Ò<:'F¬sîÁƒgðàÐp¸!¡Üÿdá@ á`[_¹ï•sPன °À˜7øµ=g<¸ï°ÓñMUöõU=ùŸpÕùö6¨›ÅÓµx5Ûæjç•Ä%Rêiú»"CøÏ©ÊBÿé%¤è$8Šv]•t„¡’Ž ¼`Í#cðNM¤tÚ¾ªiûªF›Bxe­ôžž¼*ûÊ^jíĸ3ÔÅްJØ­ÐŽÛib&ˆF»Þ3M%„A_nL¯Z–5«p{s‘ÓþÒ|lù—³„KåvKcìáMò \§P˜"êè: ”øÉkùýÛ¼8'¶¯a ?º´B çNB,‹léE¿¤Ç‹‘ž”Ål5Ò>ÞÕnO5¤Cף߬Á¹ ÿ10ëñˆ½ë,c9}êTÉ8úø/cs– endstream endobj 447 0 obj <> stream xÚåYK“ܶ¾çWLåN²CŸå“e[®Mmd9Úø’I¹8$v—#>v¥”|ºÑ Ü¥ÆJ®)«<Ðèn4úñ5v÷a'vü'v‰„Á®hv¯nw_½Žv"ð³ ÛÝÞÁòñî¶ü§7vûƒ /¯kü^w«&¯«q/ï-][VcÕµÑ=é‹à¸ÿÍ|¨ãÞßB¥¼O¸é±ê¦¡þ´O•wµÿ×í_A¼Ž|e~„z¢üLá*ûRñò¡èšóþ\»V·{{#Œ²ÌëîH•a*Pæ)Ф©×U-Î47>ÀFZí;äðX•z .ykÄdùIvQ~ÁlØçºzÂãÓȘ 4~„ÞJëú÷U{Ò»yK hž„Í”¡•P˜ˆü E¥~¤Œ¨[´òÌ`G ¶¤oâ‹.Yä±5*k •)³eg¡@º|fgð‰ÄÏ6s¸SÖŽA ¶¸„~¢v‡™ìëýAÄ1P+ñ’£~ÿï,e´ÉRŠM–Ñšcèp<îÉ.lÁÈc‡Ð}ÕõÇ‚‰µ`£Ç‡Î8?GÝœÇö|=à¸K?»¡áÓääK"~’¬| }5 <ýaÊmÁpEò¸¿BfÒ{z¨fŸN2¯2äÂ+ênÐ%m­Zú%àcÐí ‰n|ÈÇg«æ¤Sƒÿ?Á!cO÷Dk5{ÜG‘—÷U~ª!4¶® ¼6~æJB¹®7*ü˜<ú×Í+Rén¦ØL ‰¯lZpük-F:bª 1ê™°¨€0/·äÂPáÝ«rœp%WÅ¿s¼ òà"BFdÁÍ+Uä:Ò彦ùyç7<5sÅ=5“u›)6N|™²-› u…Ĉ¡õ¿ ßgžÜÌ!‰D×n¦j0-C HÂÔûnb½1fPùxдuv{ÊŠüí ˜0rê â€5^‡ +þm»öPW­Î{¼ñ8@e‚‘~‹¼¥“ rMƒ9œ1¬¢Ì{ªÆZÉéçqonj Ü™²ÃV \§ %&s²Ãý4¹¤÷']Ê.Qà•&Låܙ •˜ E¤‡PÆ~»f!%Ã$öò’ k|Æý„Ñk>ñ“Ä{oާÏ8²>ËÅÔ÷s9Å•ç…çP&ä3ïdÂÛLˆ´]igÙ º±"=ÜXÕ£qtbPaT–xÄ€’ÁE¶úîøqA PQWD)oÏJ*±y]Q,1 ¾k “ ¥ÍŠÒ)«0xQVM‚Þ ‰(ÅóÿZVÁòŒv2FÓ_Áð®›ÚòÊ-09Ç—r Ýßu}ÃlÈë€ çç2Öçíp`xi(T®Ÿàî9m¦ìïiîVÆ#f´Xtà탅‘¥iH¼À:Yäê)"ºê¾¢à‚b:ü=çƒ)Û[Üâ仾kÇÛ)”ó󹮊|–ÿ÷}ÞWKØ]„x]î!ðž~, €•¾€{2òîë³Ýöaç«,Ý=íi§!íÅ®ÙÅÊO“y\ïÞí~ÚáP±¸!%?!* ½ßð'¢«À$T˜5ÀÓIß’hhÀYÕæü@~ƒÇ`Ðñ1b<BmÊLÝÂÍÊÈ£à»Omw¸–̆Kו Æ©À©í¡@XD–ûF›£¡þ´öç·WôhpéÏcqf’sÞ7Çý×[вÔ짇¢‡Íxåeùy"»¥òh®Új÷®8ð-lrO²Á>‘¾-ú¦rªÄ:`_öÕ¥*æ'±=NÂ-MÌÎ ø)'Pª0´V{ Vô˜_åD}Tr†vS? Ý@·À<ñJl2ÃLBº³M` òǾÒt^_¼e>æDIA‰_¬)ÎJE… hµ 2:Dìýª‹ñŠf (1,‰‰u¶Ã…îeÔ»M„²õˆ‚ߊ ÁTØCͺ¢5ýL+:v=/„#S=rE4 ~±ažÆ$Ù)7íÄ{Çö^÷°+áÊ=ëçzV“ñâàrgº«§±)!A¬0‹i&ÄàšÙÞw5-@xx@ ¾÷3Öõ¼žôàîä[øìg|žùN > “tÁ‡8˜s=¶aLÀH(ƒ›è§bœú͘43ÒJ“/^†d$ÐÓÛ­D"rû?zeË!6‘"‹J0!mÈ’)6)L²ºªÏÖ¡…ù¼6O=Í–zÌ«ÚRILºŽíJ'¥BA]e(${3³ØÊ, ZÓ< ÞùæÇoW7'Ü›û#ÑðÕ(?¾1¨øJ °ÌéhËwŸ¨Ôãd×lÔßµŸ+?1Çfˆu¥Æ®Ô´:Œ ÌÌ3Ìbà>‘“ódÏÓMn[4ù™4ïiµÕOL¦ç÷Ì—¬= Ûò¢S…Ð:fÿe¢|iä‹„o Å¥,”„ˆ/'¡xF]90]ºr,qÅXaC¹!0“Ømqãý››-’Å’a‘WÅb)ÓÆæ¥ ›Ì|ÐÏžv×õ\BØâkŽTÖ#Âýàoa@©Œ’Ž1ÿ®áÊÚaCY¸\pci¨³>¿àRÉ܉`„Ú’“/ÐY1—3ÝÕ0…†» ›cC°<`*Í _d€…‹?‰2×’€ØòB¸z‰âåµ¹íÆ-t ÝÈü˜¤ nîT£Ó8N æ}e4„¼ÙhS›Å/›N^Vkt tð€{Q¢™û|“…¹çÃÓFÊ»f†]Kâ”7g’§>{«¿ àÓ  íËÞe2Ë@޳XÞ‡6zÓ`<¼{E.òÃÍÛ_¾ýÍõÍ&Œw]âz£ö>ÚŽq"ÕÊá«4nÚÙK·åËEþ›¿ýù‡K $¦{~¤jÓ{?ÍO6N[¯éF®ÀßÒ¶fí‹•º¾½¹þÛ%¥®!99=u]5‡©þX˜Ràé\¿ywûÍ«KÂÞL `ßÂþ¥È„¡S=Œ%HJ&ü7"ÅÏ„•Í€ôعnü×Y,E¿´“`¡èHXêŸþðñîGe endstream endobj 452 0 obj <> stream xÚÍYÛrã6}߯ÐÛB KHz*³—¤6—M²ã}ŠR[´Yôð¢!){&•ßn4H‘e;[NÕ”]%h4}ºqY|XˆEbIø›rñ×›Å_¾Š"àI,n¶Ð¼Â³¸É~f«ËÒVK%X×.¹ùdõHVhž„ s­œüÍÎ.WÒ$¬©]^YßGŒÐ17†Aù»bÿß¼êl“×ÍŒþHpyѼÜ‘ãFI+øfÓöÕ<,¥a¶i󺢊zK"³ û&/Ób•Ò‚$ò û «=Ö±Úב@i»]Yæl\‰ÐpiàWq­q·ik³åJ)Åp`üýÞkÒ?·ôÝÙ êÜUù‡ƒåNÑ?nürüûk_hîhA¬O"‡q˜p/V*áAìÓÇÎØÏw™Y#¸Ž\—ÕE3`N»´£ÒæÐ4ÎâViI©ˆ}ýÝß’TNGt"B'bõiëâ?mC2‚ʶ¤©ª»^Ѧ8dÞŠ2u*>ù¦Ò+nº´UomÚÛ^yؽ· ¨çê}ÚtùæP¤Íµ“ô4dZ^+ðº,ÇÙÚìÍ1jYhÆD‹0ö´€‚§”-P$³DÐ|‹@…‘Çšê}‡•> æÎ µd»|ƒÈî¨Ã¦†°Ó¸`c;`P÷dTF=àÔ‡'Vs[ªŒ{POóÛ1_-ÍÈ3 ÏÆC·?t/Éu ÖàÎ’ë8ú*9rGüy$Óô½ ™ô•’DQ“2yi¯¨ØÖ¾jç…)ÜnÖXeÓµ}—Ò[’WÛº)Éç]EzKqÖOð5ëC9Ú È<üQÚœþ«ß“ÐCB“e ܰæ-àúHá´@Ÿ±[¡%8ûİ֎ísn•_bú0P@D1 cwßoŠTP|÷ÝÖEQ#ö¸ì@gÖØíPÉu?šû‰ûIò€Ä«ªº†,"CVßÞcA³/ég»Ý¾¡R³Ï'-ûý¾oɦ-Y–ù–»t?i¹»»›qé w¶±×s6exÔoØÀàE°*ªß¦!j‘9z~q~ žJ>h›«¹±Øì¯ ˜K&“Áú …~OCQÌxXjÍÒâàÛ]®w¨ÁmؽÝtùCÏIè·=T›£õkÚjLFJ]Ò…Æzë}!Šy2M(ó2ÿuàŸ¢H ¿Cî~l<é!IçwÕz9 Š€\УË?‡ pJŽQ9¦*5ÞéQEc‹t4_¬|ðÆôQAÂnóQ v"k¶Ùb"5%Áz¹^öcƶ(Ü©®dÈt½ŸË’š‡ý”Þit%x(ŽéqÍΨœîýy78µ®—3FÂ^ŒRë:‚Ù\%áõÜΨaâ‰@ú *³x„E QÿJAœ åBš#žÿ.ï?G: d`{`(: ÜÁöÅÌð@ß(>áÊ/2ÿtú†'1`ÒÉãÍ\^D· frNMÂûSÜõŒp—~!E8,Ö„«PKk€%à*t¢ìþбö¾c˜3„Äq‰ÂÀ⫗Р­3{Ę‹ä|8Q`¸™ø±çd0èJÏpiªódR§dÒ—ÉôÅsLZRÏY ¬ù¬¿™¥L$/2^Äs%füÊG —r¨x‚óÏøqÔ›÷J¤Ñ NºC¾’>¹Lz ”¯EzýÒSJßÇü>ÒO.€°Âm–°pšáäEnG·M#nßÏyœãæÜ™Ý2<Ëí±Ë~œãŒTŸg–œÌÔ|&QìÉÉ*l¸?'w¢ÐÁ? 'ŽÜUö—ÈzsÀ£‘»ŸÃÿïTB? µ™÷©uüq8à WÃ÷6n¸ðr2W¯‚Œ·ôs$D°-­ðf7ìç¹! Äý —±|UŸ=qÓç?aÌ ‰á•÷/²f.݃5òÕù¬/òù\ÄÀ߈þT/NòHøû”|\WWó}‚GщÓ}QÐ[¸êv4ÞÉ•É)9ÍY¸>¹ì]þK<}†l>ÇÇ縢‹{ÏfSúLwùÌþÃ{Àõè'š%#@‡¾^Έ¨´p‹å- ”¦×J+¤ëèð½©ûG…êøfJÍR¼¥9Þ0V ôÖÁ!|“6»Zb°vwoØcr5„=Ûኛ;/æ<*”Ç;&?Lë;òŽ.Tñ«®hH¼Uj¨ð·¸%ÁùÓWŽ–fbÝå%‡³G”6pÒ4¸ß°ƒ”Ã÷(#A°ÕÀ›˜ü–‡îy¯m&/J$Á¹#1ÆÇa ¨†£]{ºÒñ} >#°*: P8¾×ŬëÁƒ~xƒ¿)‰MvcX?¾sÄé™!c:Hõor1Ëаwÿ|û=µ}ãÏgýˆ?àÍ4ÇE5 “kâ5‹ûØï¹¿»¡i>u¤D·°`HÙß%ÏõÉÔ<‹£Š0é ìª"¿¤·–°  #ÉZ‡ÜGüÃ<–QÅ æáèq‚¦ÓÀ…ZÏúÐÉœïŽÊZ¼€Çzü¦¯¹P¾ o¿2K«`«Ì/)鄲7lËþËAÙæ¿ZˆÖPVt©uu“¹ël¨¢w8f"ty=¥¢ßÑ ƒøÏ'O"ŠŒ‘B+G¯˜Ž2ZöÒ?ýéJ£9 endstream endobj 456 0 obj <> stream xÚ½WYoÛF~ï¯ Ò*ˆV$—gÒp'@ëC>úPT…Áˆ+‰¯,I=þ{g8»"S–S …“»œ{g¾™5>¶aÁŸmü,c™?^³÷¡a[,²"ãzŸ§¸ðëä7ómYL¸m6²Ì&S:fË8õä÷럀Õ°Ú‹\`™Ç;öëMZO¦ŽÇ;¾µŒ« .]3õR¦ašB‘ÄYF— Ô ”Rͬ”A+¥ šì·³­EBÓ‚žÍF7l8¾ Üi)§ìùf©öˆ·.³[\ É&S×öÍ«‡|Ú¹7ÕqæyGhr`–YºDÞÈ,À°š^Ë=¿0?üÂüÈŒ¥x‚\««.0e‘¤Åšös‘£PR¿•D¾FÚ×ȬÙ.›ÐéØÃ“uÁ —ã#묺I«fYœ£g3ÏUtlLÒÔu#fqcÊ-æ†]Z@4=Ç3ózݱ_Ÿ ƣи3<ŸAÆMÎ87r÷˜íéef\”†;:z"Ïé4dâvÄVÇb¡£l]@^­â6k^ºï¡@¢üp2d¤írE½•¶`¸˜9 Rvž^}x,Û÷ˆöCÝS)ÑG''ce0;Ò!˜¨Äõ#šµx*ê:^CžpλXb"aUsÇ\•_\¬’<-⌨ʶ©Úñ`Z$ÚÕѼ¯oÎß¿1Ï×)÷WQå¾Í, ­%_^>)YHI.Œ ½Ü¡‡±,ºœ"P+#ŠìákL8?;à›Ìwãö5ÂǶ—¾j³Ùô¾€ª[fm²õ0-VhF“–ê Ý­Ó‹ ÛkÏH—2ÙWÅvä3×ïËX­Ô1RùÔTâlý¿òÖP]£,’)SÏ/ßí«å^º*ÓCÒdJúÑé»]Îç2ަBZÊ´Ùä´¤nˆÇ_a×£ÍFUßÛM™‰úÓ¬âe¬tIóT©÷ A¹9;?;±=„ÃuÒ‚¤±ˆ¡%éâX@n¥kp®3¡T®Œ ‰1áb4z;|nË&U“! [ÚuÒV…*k)„6 d.&_iÇÑa;⪒%j½O¡:ųL9z–)îŽ)W¿žþGÖäDv쌶!ŒßÇy•‰çˆ Ã·9ô ,+q »ë²·ò߯4.azÌi[Š8©iª_ÿ˜‰œiQ7q±zEÏ…e»÷X¸8_i­ˆ—´¹’eÞÓf£3Ôã‰ÐñV·y56{s÷WIh¿ü ^äZ¡Ìä, f",ƒØˆÐó"›âØé!óàÙ-¤C ±60©á9fÚP¹ÝN(DØÝ7ºéGä€FdU6¼—%_‘0ÕeAÀŽn©[y@Þ"ž¨¡BÏþ¨rnã8i ÚÜ7ÊtP(|žµÅWÅýû ÒÍ^bOƒL¨šò’-©Å½œuü@ëØ:ÎßRCÄð]Ý$iÉ6?hÂþbô˜0K?>‡æîO:Tm[¯Ûeý¼-ÓD¡ÿޏ?ñT8¿cÖ+_æ„NÈwH>§ïßÓ™–P>èx¦F˜H…5v9½0篈·UæW7ïŽßþ¬¶Î~99Q¯/ú2x±W(¸Ø¥X/%ì%‡ÞU4xIéé_ôɱ_M"2±õp>J&t¤‚dZô}ú(v?>$Jïkƒ$ÎUâÌ!äëv= |€$;Lt˜ Š}×EÞ)w¢ ú̶}æEHàˆ3¸có`€{´¢ç÷pÑážÃÃ-îáæ2V¤x»ŒLÅ¿*Û"Š Õ56ÎD“u·wxGî¤~‹%Vý±­õAirð–ëË媩^ÏfðŸDVÊõ,«fIÜÄ3Í<ôžƒûöhùp”€ÎS?  (y\S_|óÀWÆ endstream endobj 459 0 obj <> stream xÚ˜ÛrÛ6†ïû¼‹œV,°ÀâN/œ´î¤£Dnª´ugJ[´ÌDU’ŠÝ<}A‚V(XÅòŒ@.vÿ $ÿ&J".yëÌ2®­–_~m K§@µ«)é­v ½…–êbì%?uI}´¢²þ6BS)r‰Â­©'ôÅcôÕfÆÐ¤ÏåÀJÏã\B¹#]&]B\Ðyãºg.ˆs9"á/:E7°¤…qá«—ˆs1mJrN+ŸQ\~KVq®XeŒ Smb»âS\¶‹#Æ3(.#ƹ”ÒÎeRpZ_’âò›T” ý&àRÖ‡•¦ãˆ—O8×=F¸tœ sù¨@Ñq´‡òQP\^_0^Y¹!¸„펅d±›±ŠŸ&Ú0›¸¾xÄ_–àÐÒí’@Ç(.Ù ÛÄ—ünÿ UÁŬE'~r‡Ô¿t\÷†â‚N!.NqIwþÒâÄ©(.ì¸,ÇP\€Z :Å‘€þb—Ïfà$—KHÎÉ8šnÆ–<Üóèoí·©—¤¸¸1hí‰uBþ"¸üù-Ä…4—3)Iëë+¸8}žP.EsI…Òžæâ4Ð\z¼®‚>Á…î4}š h.As™€¿Ì).c‘æÂÁÀ.IsÙÃQúèÒd~¹xýæ|ÖßlÍgï¯ço}û‹ùû·?nôª¢\å4yU”Õ´»Æñíêr½ÿrÇԔǷ°ÍCs¸…}¼çÞF˜1™*­Sã¯{Q>Öþí›ÿ˜ :Í endstream endobj 462 0 obj <> stream xÚ½WmoÛ6þ¾_¡ò³¢$¾¨ý´!ɰaHÓÅû´†bË Ùr))nŠþøñxÔ‹mÅJ dHóÈãÝÃãÝ££÷Å£^`þ¨'Bóx‹µ÷ëÌ{wIcR’0æÍVf}J’po¶üÇIBÂÉ”ÒùÿæÛÉçÙÞÅÌûâ‘(‘ÞÎc ‘±Ý ¸·öxD¤hÄÜ»ñ> 8蔜µQÕ‘eÉ:ËR™ŒYî”ËÛj±L#ûßá‡Y_*ÍÕ·¬‘'QàW™V…ž‚jàn÷•Eþb¦Q^f•ú•.rœØ¦:]gÆBiÏðîRz HÑÔA aÂBºyÚÛR•Íñý=T#O#pñ1XÞÀ0·çºEË?(ëÛɇ!Î(•„EÖèyV.´Ù¬ÌyPŸõ10’Ä}õÙ½ XÈ#_u¥6™Û³œmÈ0Ð߇:àAF$àN¹»”@Cá‚ ]ÏÌ„þî^-@å×SmáÅ~]fKœº›„Ü‚qèW÷nY¡ÝöºP¸9‹qJ™€CLiD § 8›F!ÓÆu…þNU÷0Šüe¶Jë%ŠýÇ c~š×YI¬©£ž7Ú± £6ÊÅ -ÒXJ w!ˆ%ïç™U°G†AY csûÛš)+]/ªZ^XG„'ý{æ²…h Þ$ï_@ƒÛ06åh3­ ` |0gBÐÅõ€ówÎ÷¯¬Äk¨ ²_M‡t&@jù,zŸ™‚õ å1Fëü˜@3š Lس-¡lÔvOËÙ.«´ªK¤/ÇjKïÊÒŠ&ek[Ø(¡þ9¡m 'ù:r )‡ò=f§m5GÈN[]Ü9rº~)3ý•™|Ý”/f¥ˆ&'Y)!"ÚÏñù^HX‰ §¬3—mÚ&Z`UÁ ½ã*æR·ÔÅÞ,®Šz³Ä…;HÙ'œ®Ü ‹¼ã#ŽÉÍíç‡JÇ>ÜwÕcøÉ$pÜ/¯ÔUÁªÈó|ìÊ÷Cq8 Þo^Ïÿ¾:¿¸ˆ7£†Ê¿£ýSÔiy±wrC‡ÊÁ2çÏno²å‡!XStu€ëãõìMQæÃ·NóW úýêòâ—›7¥6«,-Õ]ž½×ÕÇ—ãÚ.Uœ”¶B1]ÖiŽxúè"?ûªÊª<Ͱ¦"‰l6gXØ!dǰNaØžŸ ÛÚvü6b»§ålg™®ááÈ LSF{h`ÜE_Íùxœi¾×œê¬Ò*{„þ2Ë$ò²E¥° Åy·»ÎÕyû^©ÙšØ=Ë¢¶)Ò§öâîaþ˜æÿ·‡œuœü€ÛÆ!r7½8mÉXm3†"0zÈyÓ52{ Œ7·½ ίêÍ ÔW…ÆÁÉò‡}M.ª8 €ê›¢bãE;Œ•¶¨œµJñ›eŒ¥ei¾e¡y&©´‚Ç¨Ù‡ÙЇ“ŠZì^Ó¤†9]Ÿ8m^x;ªýBÝ{œ„Òfú°™±FûÓOÿ«©sÓ endstream endobj 465 0 obj <> stream xÚµ–]o›0†ï÷+| Óp±±Ñî&­»Z×Ü-SDºR‘òѬÒ~üޱMœ†›VµRl8~Ïë“óô=!‚Bø!HPø Ñz‹>-ÐÕ5‰!8á-îá}@BœÄh±ùîQœàØ¡ÜûYìý‹/èó=!̉ˆ'XFÝ£-Š–Ân t‹nƒL’|ßœ K‚ = KŽ Ÿ>áªôñgâ$˜;ê4ø¤¼eô7mZøÜû­?ª¬©òìYeÍÔ“¨³‚…nsŒöcâ¥E›uÞ®®%Rªa¢ò6嘋.ÑíË®Ü×ymo¢Í¹‡ˆÀ°8Ç¡>²)Û»LpýÍ­ È«ª<¬”‡e÷d_•wúýû¯ô"ß5f±ô?ZÓiˆÄœui¾eM[íjË]G'‘ºxP5‰$Ô¤mò½úÉ5â3-¨â_»È‘p1^'] SiX=ûœëJÃVxK/ÇöƒH&pbÓ®³Ž[—u³ôõº¼×Ÿuœ¶¿ò"O«W³ÊSUaå êB°PÅÔ7§ì¤u]úÞ:O›. ‹¼CÞ< ][ÄX$æùÀ=9öš(€UEcï€O{â5É,Q°Y”Å ”áD,–õ~ æcž1š­¶%u\Û‰2Úë²€™b×7 cÕSân˜QßWùvg0Ðnwú­ ŸÇ³I¥x–Ç3‘ 'ò"Ð`g¥lLýøf@³) ¡ì§@[×Ã@3z4¤è‹ÍN‘fBÓÊ,­,ñê¦j×pö4ÞàÚ1pJNyÎîÈeûq¢ÌtË8¡4–XÈžP9M¨:}Ôjö„:yFíµ {ÚN”Ñ!´×îywÃŒúŒë:wÞþ;ŸŒP,“Q>ç Ü·ã“1>¡§8àóòÀ £3>!…)5¬€¶ÈÒIÂãÀU'ú qýÀ%T# Ï4Âðàá^ôtâ†êžÿcâ>Μ¸C8»g(•Ýÿm±¶)xl£oÞýuÇߣ endstream endobj 468 0 obj <> stream xÚíWMoã6½÷Wè(W$EQìÞ¶í-Úb· ziŠ@±[»¶äÕGÒûã;á>ì(Q|è­HKÔð½!g8oè}ñ¸Á÷´€ÿÈ[í½wWÞ›÷Æã1“qâ]ÝÁçGÌÀóú/_0!ç"ö+þÉ×A(µò‹2‘ßæ›¼ÆØ?ÔÕ¦Îöû¢ÜE]umQæMð÷Õ/ÞWÄÂcsf”r4qÄ3Ð0n‰”¿Ùúi_<&Mê=xIÂTbgÄÆÛ{föo;ïÒû8C0Ø8Ž&oŸÀ¦)‹ôkÀ¾„;9àUµ{Ì#ä‘9—ðe zbå°?åš¶ø+m,®Â>\û+ Â6+7ùu@6àI·/黉n½yŸzÐÈ EØsÅTj9.ËêÐ'±šNâšÁ{˜ÆŒfÜWx¥(V7àÒ 0ß ãµt¸¥ïß~¸ ‡¢léáÓ逼õ•xyÊ”´Ä?äͪ.mQ•Î^MÝTÌÄSó«m›!yŸŽnÎÑÚ”aÆ@6¢ýéjf8Œb"væ`Ú>Ch Fc£ƒmÏî‚OÕÝœ ô,•ôÓ ©bºÿ¶[‚bmé›¶îVmWg;¹”ò³ºÈnwyïOFe$/„DÀ´Ã…‚ÜÏWÅuÄc{Êeìßâ’ñYôk‘þ!ƒsž·pðç"á çé3(3Ü™|7~i“8þô뇛ïÿœ“©CúJÞ­ /Àiˆu R¿«º†Æ§Ûñv–T¦§„?¿†° >W a£€)>—éÝk˜n‹2«‡å $Ìõõ2o[[‹…‘~F?}Âûm5çšIXÜçöó~i¬Äd´…”²Ø6=¸ä ¡RIæ«–Æ{ÃâÎýºñܾ¼vslq³x³þqmXšLœ(™vF=›£ßUÈ÷€ÉÃ!(TðVuxDñ}ðˆ¶5‰×GgÅ`BtA¿nÇ‚§;,(åÄ1¾‹Æ·m9{Q5…ÒLèQ6Ųlâй^7ÝëËÂ9¡ÙÌ)§A!‘ÄÜ[‚žX9ìYñ„Ui=çФ|}jæàŸèg·u‘ߣtæçˆf|¶hʈ3IsÉCÙœ§š¯UÈ?rP²yµ:ŠT¼¨Ž)3b¢Ž›uŒ™îÍk牥 ‘J|š×BÙP/K¡˜J!‚• P¥GN¥gdέ»j‡%!ñšy- ÿ_‹ÎÑ¢gÛ}‘2!ÇÂ%_ÑïÔHŽ ?½.tü#Í …k@v%izbå°á Äýnÿ´x‰ˆî=ÜW‹ S3GQXŽv¡~Ù»8‡òèR¦ð€ ·5>½­Ñyifë‰ó >¯ÐÅZ0)ç ]Ùío`ðiû¯Êšäf¡é:êg(0eN‹PS,"ß<œó[ê¤kú`C–ýŽÛÁ“nF¦%®ØXá?l ºUFÖ÷$†\<®Ç÷…ÉÂDk–Ò¥XéÞúã7ÿ½Ø2 endstream endobj 471 0 obj <> stream xÚ•XYsãÈ ~ϯPå‰J¸ìƒWåm²;©IfÇÞO^âÔT‹jYÌR¤–Çx¼• æaieoÙUê  À€«_WbÁŸX¥þ£Uq\½½[}÷Nè•aÇ«»=ìoDæÉên÷ï@†0Öë2ªÓú?wÿXýp·úuª<[=®’$Œw"MVÇU…ã¬Z}ZýtAÀHÃ2lÆ6ËCOlsÆê%¾3®×JÃñŒ¹Q(ÄÄ]HŠø%ö3*æ¿-ëõF¥:øþÄAkû¶´_×* ,mÔ8 @-¬ÀzK¤Íž~…iŸh\4Õp¬;§îwï² Šr½ñ²eÆ©“ýé©nN]ÙùË‘¾óC" a¾‰ã0¢#eݯ71Ùñ <ú—z8~îÝ©m¶´ý—Ûûõ_/jAE†ïŒ¶ýÐŽÇsáq˜ë9éÝŸDäAÛ }Y[>³Ð8ÎÃTÿ9§XêxAº·¬‡Ð;I2‚Ç—)>¾Ìðñaì6Üã¥p·xt};ÀÈT´òuÇiK³­lw¿~ƒ«2x<”2>ÓÒU6"q½à…±ÓêhÚ_Òî€TÉÀ $¥Àk™½}púàF½£ÇCÓ¡òJUƒGQyO†—È‚fðÔeG¤¿Ù¶¡•‘Ñp:9b:ªùþþ¨æ£*hj.=è9¨<ÌÒ âW@IÒ húLbJµ}sê±Õ5Õ<°~|Këè¶•=Òä±ì4"'ÀkM] ÇÃ^gS Ìöhû¾š v—\ÔÂpËþX¸‰L…yvo0+‡ÚMÝÍ©›âÄ'Ó_ßÛ®hËS_6õ«cR q-&±ŒIºÇîH3!ºò5ô³k˯kŽ?-"0.þJ28kâÀYyF¹5FnÁ•Üïxˆ, ‘4³,žaË‚÷ïÞph‚wi9Íyƒ øp0ÜzÚ¶%®Ã Œ"’˜²ÄePÍ¢Tç| C§ÊÔ–Ögšuvg&y¢dÑ-e.À¿íüQpµÅ­]Ù!4íhøeýÓš‡Öœ¼sÿ·Æaaß6±@ ÐÆ¶ÝŸ‰†Q' ØÉ®D^ß.¡€ÇŠûufJUpÚDzó¢Ë=]]噺«ëÉÜ'Ï|~ŠP Žè\þ gÀ~™ ë†j[Ø®ÃÊ*“ÁY¨é ýd®}p@B4Œ‹4¸àö¡PuófO Å2®Ô,®àö²Î¿PS ¶#–þ$GŽ¾Æ‚e˜š(9Dir2"#ÁÛ`Ú§Px^o[c_Ù\´n¾˜#<æžsËê8Ì$“½A¤Uó¸Sy2‰»wû3_¸ar» K¦¡Œ/ðÜÍxßÂéÝ:ƒ*¦¥Õßw€ˆZìfÉÐ-8wÏÂy|#¡fS‹Ä0½F©Š“!§ © ÛMeùR‘†Ã’ 9ÔWèà­…ˆtxpð÷·ÿ¤Ñ³ú—z)8´ÐBs²Æph˜—oF÷T³)ým•LâÏ .Á³ L3ò'öŒ ·á€~YúÓY>¤P©LûàW˜Š‡ÔBºØèz¸˜e/¦’iêZkºÆk…_¹i^¶cÑ뾌™lŽ,r©woòâTøöVÌÛ[1*J3Wà€£ÐÖ4톋ŸýPUO¼âëšÖd1‘F¸YpGÂ\w4µ£;GóB0†Äì+<´îÅšYùšª° Ãvš`äÍlâʳ²rYAž—®; ®q>R˦0â² {ê½f¬±qÝר˜sc¼g†MMâ”×y)$~–W©”Ëu.Léuð}9DQ1ú°#g/Þ¯/öB`i´¾"'ÈúòÃۛϿ¿”k¼S|ö¾—jî zzÓöϾttÓ®ÒÖµ|pQŽÌh× Àt3}Rr8$‹^D{p9aŒÀªhÚ‚ù¼™šb"M,›¿¥Ó÷/u&–F™ »,›zsöåì>Ø·Æ¥YSÁ“ÏÀÚi^5‚œŒðóÍÍÝkl %¡’–Úۇ䪸6·ÖÉ3 Éä©“}羕Àºƒp]FlñwÞ:">åƒpatS|½rç"^BŽŸ'fš¥|É)?ó)_qÐ8˜Ü?+!ÎÚ45~HñŸ&^Šƒ™ >Þܾûôª8)ÅÈÆ8€!©…k‹8Ñó8×\ÃÜ!Ìy‹ÙœÌpfs¡¯îæZný¡gÛC")Ýp6)l½¨­ „”£poa \ !]¹§ßÞ7¶£¦–¶äŽ–ûhoÿEsY˜dx›MU/4êx«8óÔ?ýéÿðÄñX endstream endobj 474 0 obj <> stream xÚ¥koÛFòûý ¡@Q xärùJ@Ò&… §q/¾OçCWŠ”Iª¶ï×ß¼–‹Ž+b„û˜™·7 áÁ?+øóëýâõåâïoýdá{nê¥‹Ë ì¯|íª`q™ÿËùåüâ7¿½ÿùí‡å¿/Ðp X<‚úg•]—f¹ üØéjü&NÛeMÇÃngdÍdÍz©bg÷”ç\/W*qÌ:;¶r~Á߯”Ù]ÖuÅózó×»3<45\¾çIQÁ½ÕZ`vYKd#K†Dl…êÄÉYÉ£ÉÚ‚€Y[—G¼×]®t’:g/×psƒÃÔ¹Eê&G&BH*Z†Y×ÄO.˜ö&«d§ÛeŠ #aF´p¬'hÖD32²Riâ •¦N $˰® M±G–p<°„§,KH°9E×ÊÑC7±@<+äÂcµT½SäÔÇ*7¹ ikÜðù9‘5=’JÂá‘T 70 nàk¹@æÖŠ ¥Ü™-JwF,%ј%•†Â¬_^-iÏçèä)µôŒAàd%2‡£#áBîcáµB‡pÍå΂_¦û ÏÜ ªÃƒâã‚þJÙ"E€/+l´ý‰§IÓ%iÇå.0Äf8±ØâJyn0²Ù·¯ÎÎ?g²—;!w°I¾òß;ky$í³îª)Dw¦ÙUÖ™œ Ë‚¦«pó•MV”€Èý,j`Tç—WO³ày–…ˆX€9Ù'±“) ž?b49~è„d'´É®`>ݾ8ðÖ6“AW—¦ŸÓYŸÃdLŲiLÆ"G}z¦<.ߟ½{ZJM_Tù#qÀd*€žŠCé‡â@‹¬HFe±/:îµ²‰I˜š»µ1ùSŽTöÃåû§ß[ESqÞ3ˆ“ ƒ¸0VY@&›'îy–Å:³îäc wG†{Ö“ƒaã.ö©K™98„üÏe¨Ô—œ ãÄæÉãÕ›ŒtªwàŽÚ±8‘§Ÿº_ûúX”ݪÀ—H •0°&ðñ¶SQû¡›jÀ“¸a0Ò)`÷5œD¾Êª|µ>âãG¾1ñÑ ýðÜÞ±ç*-ïx="N[âÐý-CÏ!ç‰óB7I¼V\œuL !ãi{¼†€³m²=Ï%ú@|´›ºÙ·v‡£<¥r½hütuSlAo(:úÉR5Šd°ÚÄXŠ+Ïפa)½ }éÑltF95ØI:ͺ°š¿YÅÐææX°’”`K€¾›Ð£{!ÞnWXç§R´4"-MûüêT/1–R`´âÀAHYT[žÜÝŽGÌ æ”ìM·«Ér{‚xŸI3¢(/ööv™€H„s—í¥Á˜'ÃÙi`<áeQŠ€[Ý×Ôûk­`-‡¸±MñÒº†$±ÉÄÎZ^†p –|S`ÀmQÄíow5ùBØîS ᕎ¦e²F >UDÈm%DMÔ<†à—Áœâ4ÛcZd@¹¢ua8±á-äkmsº”¦[“MÎ{E‘u:c­7‚˜. FÉ3LØ““‹<9L{áSˆˆÒñ/3±6Ly: ¹&ή3RàOììl&±®ÀÎ’««œóáYÍuÁØÁŠÆ9ñÇ1èĽ]0ùŒ:ñÙ$l‰øÅÇ®Ì Ÿ"[þò½0hj ª2sÁN¾Zϵ-U¨g|\»*@”uªEÕÇ-$47›ìXv¼QدPŸ-g‹ àÎ8Ó_¡Ý8z¸œývÊB‡¯±•\ìÙWN­¶¤Ãs£Ã'Å‹ ÀÁ¬H?›åAa–6]ï̧2I<ׄUÁkf$¢S7±£ÝÕÇ2gR¬g£Ik:!¹ž»+ñ]‹÷¿ÍÜ$n Ð ”° áþx+ˆ,‡«ÛÕÕO¾1i¶|·_±JöWÖ(¸Û«¥;À½±^¾‚$£™$ ‰$ ¶ù­+œÙ$ṑ\ëÏêi¤\­ž£¦èû˜•ÈWâܶŒ¿ã‹(Yix„ʅ߉†L`%²DãÈ¢µ?Éìñ€µ²¶%Ë•+è½|í¹:žø ¾#žäYZG˜+à2’¹ÊÑÅê ¥­±Ž¦®9EÿÄÀ"50©JÈ>háÖ¾nä†ÜtPä´r1Œì§]vèøÒÔåõ4ˆþĬFΫ‹³Sú¾¶ýêI•¹\BÌ™®¸+8z8vÏÑ}ÜGßÇ©Üǹ ¬ÉìtÙ' ´8“sema±ð‚3êXg©’i΋‡#~¾á:!ö[TA¤DÚØÙñ\\AÛ‰ {½û`ÜçÛ?(¸ƒò§q®Ýáö´¼í áRúC7`B.Z?GÕñÙMM6$õAϼ$Þ\Îwåtä»QL,}[UÕKpïP®QAªÐù?www<ø¾ÙÕ?òðþþžT´âàÊ9ßñøææ¦¯)ÂÇôëvgWFànÿ3ç<´ï*〺9½‹]ßB|Ãb+ZV~1ÒÈi LïØX ²÷è=Ž{t6âQäÀSóù1u1ù>”Ê3(ŠzŠ2þôÓ‹Q)ëé%ó}›7Çj=P¾±¾b(70®Å3-ìƒé e¥HiuL»a¸0tÃzȉ´ö°¶áuìuâ÷‹Ž“Ââò¨këÊViçžXíÀ‚4äçóú„n=)þt$~䳕¸*7 gü8”æ®ãÑü½‘›özXw¬âB:Ù‚™ó‰ +ÚûÍÕ’ôÊ{D¯×â û=& ‘Øõqˆ½Fòãs·ø#Š‘æÞ'¡\g­UÐ ¯€³*öÅÉœ°-JÚÜ|†? \ß^ðý_£€ŸÔÁã'Ýgw#š¾Ãnº~D‰Û„Ù“BÐ}´üÍø³-ëk.ÜâqõEs2P@ºîä¸ôa¶Üö¸ôD À­KulÙvþó1LÒÐMÒÓ4Ð\rS‹òZ£Ž8|íO ™ÄÖðÚ¦©÷¼8ÿ˜Aä*õ%¾QqÐKæQ*Põü'á÷ÕÙTìz6EÇõ,òXV½<’‡ÝZwka R¸OEŠq_’¯%Îs:€¿áì!mâæu…\ÜmS*vS5~8Œã)fIO‡¾•µ£hjG¡•äǹë×;cc Êw={ÕçysH`”Xk½'bñLæf(ŠmyŠ¢9Ϻ:ìk©üzhþ û#ðqžÙývVÝ< ¾ ðóës›uÝ, L·àû ÀèêØÃÅB,ìB¹ø°ø}&Iƒ¥¬o.>œÏVœP©x}Źœa2r#5<ª?Ϧ•‚ïy_£Êúýg„ªƒ!AÛÒÓÏj«¢Êy#ÏÙ6&ë¸?íKsGišÎ]”@ÉlÅÿr®Ô^7ýú£¢F øRäæ_ lî’£ áNF¤ôjgÊèHvŸ¨=ÎþñË3I'oP`õl¯K$9JpŒ"ãÜ0¢ÜÐó²h)sòɤ¤0±¥ ’óçPî åÁ_¡œ+!üY…sÔD»þ$GÝeÒ^åÎK0ý͇~9MÉï¹ðÙdÝ®æ–#nUy_5fCE3ÿÖ7m‘ü&bÙЦÍçá7ÙÉϘ}×5F~k´åÔDÉU‚<­¢8ÆŒ¼…©…þýoÿ˜~ú endstream endobj 477 0 obj <> stream xÚ½XÙnã6}ïWèQ~0«…ÔÒyª'ñL‹,žD˜—¦0d™ŽÕh %e`>¾Ü$Ó1É™ H“òå=‡ä9פŒGÃ6,úg¾Cÿ-#ÉYdü> Û¡ц~=eψÖÿ˜ŸËbâÚfCÊl2uǬbç¸Á¤žüýM‡"e¨@©ƒòùðh›Ö“)tl>îžÄÕVt׸NHºšLßÄ2$Î2ÑH(¨ãIPèX*¨h Á4Æ7›ìY„´5^‹/ÓB|6[,—-D£.³'60™ú–oÞ>ç¬/h”Yšð9Må4l ħQPt íº®YnÄ'çèw C¨Y?&X4úÁPLù×… ̲X§Å½xžc…OŸ‰MˆæbꆴIÓR±¶º}nèm3#~ŸUË´L*Í^A‚. èÑ%ó èv@,CZ4“)r™×÷|Äyd<À ã‡<@E5õàFnx°Q×ÍŒ[ã›PÚÄ.!ÃOªŽGR½£ÒÙÄmÖü¡ãL'EŠÈ/‹’6tAîXÚNÑ¢©DIž—·_s{¸Jj/þpê]”LýçÅ…ÎY>°Ãn &R¦^(òÔ¦c]A ×u|/UÂ֒ɈëÓ17%‘2Â$O‹Xʶl›ªÕ/¦¥¦¦«¹¤³^^Ïçzž<(éýxE)5Ï>i&†iPÎonÆ¡`BºyÅÅZLé›vL ÅV|Y:Ùó‰t®¯ÆÎ™äbaß8oýæk6m¶‡#¦vG-šdí® ¤Å†QjÒ²èxu‹q7¯q£¦‡á¾ëWäÐô·“†9Tôr£Èþ1Ñ+Q´d0Œ'[ñ=€à»¿gÚyz€ª&¹În³£ýâ)Ù=Xöpv%Lf?‹¾±p`¤ªhFâ"aâßJ8laùƒ"}le](+&‡qŽŸÝ,çóï:IÒ–­J’ŠÏ²!©¥7$Nvªsͧ ¢%i¼ÊðOðŒ‡øcñ³ø]À¡ ~9;¼¬äý¤+Dâë²-Ö'â/¾¾ ¿"”Bæ˜×Ã_t{Us;¤ƒ\´³»ìøE¡6|Ï´óòU5Lr],Žz~—]Úy(»&³¿{¼f{ÉŒ`¾ãÔú =bJÓÃÃÈi¦_,–W×WçãNÅë´f?³¸ê¡ãöæú:+.ò˜°³ö ì‹ÁîÝ-D|ÊK=4ex)ûÛÛi¤G_ Ná,_hd™r±ô(µúÔD}ô<‡½rêM,û&FT¶xQЎ˜¸gÚ¹s€ê.¬çª½NÚ6€è¥Ë #ÞDõÛ|›æU&ò„Õòþª·w„'yLˇN×w÷ <.:wQ5TUö܃÷*®‡ùé-à^Ó¾lÐ0SŒÿ+Ô@·ë|÷tÄ^‚Ñzçù>„ª=«‹þöÛÿ´ÞHÛ endstream endobj 481 0 obj <> stream xÚÅX]oÛ6}߯àÛd`fEŠ¢¨ímÃ\dXÖ´õÛ2 ²,ÛDôáHrRcûñ»ü,Õr/iÜîÕáå!ïá%itrá €ÂÅúyŽÞ͈@ÄÅ¡¢ù ‡ M•ƒ£ùòOGæõdêSßYm'ÍC¿ÎÑ=Â^(Ð#òjpÀQ†|†™×˜)úŒ>tpÙ6ɮԑßÍüŽrì3 « ·Î2YE»´þÑ{™‰o‘ï¿9bI˜×£IXð ž”%úa6àI í,ωL ˜ðØ÷ô—ÙDxNUr!SYO¨pö“©çyÎv—mÍ›šYÕ26f±­e‘ØíF†ÿýáb0êÀ³Äþ51“ͳEµD_¢î›²PÙø"³Ž¶©S%QO(w6Æ>(Ü”£OïíK¹¶L¡>á00<],|è‹̉îLZ«†¶M4 1¥ª‘ý@7zb5M‰ça*¾ášÚž9=—Z[ÏäùV›xîj#‚ât6cí&ÂÃÄȣΎBs®dp¸Ø%£¡[T:•ÙÐR…’³—2wáßP4X[ltÁÍefS™ªdý`Þenò˜É4•Uù²²ŸVEùBQšæ·°¢Åd  ~P’Û >±] Üu&5À1œM¦Ô#8ô QÜUÖØ§Õ¢(&fzâ]](ºþ+ݰϔø >Jõk¹žQw•Ø{ ÈŠrÿ}eR“É/ɲd¦NÖ‰Í:LÈÛœ*ÖIž”QÝÖ–.E¦óòÍ‹Û8…sÏ™,OIÕÆ.9HÕÚ#RU(JÞVª-ÓFƒ#T»0ËõR½>)Nê”Å._Út1íõÕ'ˆsY݇ J¶×û¹{k\<œR+svÅA­ÖQ«BQñ¶jm™62¡Ú…Y®¯£ÖXï’f;¿˜²We[áÙ1-z¥ŽS:[¾éýIù†®JòA¾Æ“/ <þÆòm˜¶º|šjæñ—Ê÷—TÞï’ Wи%q¡"ú5|”-7‡+"×»¢0mínž8òá2*ôìSÌ`¦9¥˜ý˨ÁHàsQ… ËUÝÒ‡vuôfÜwf²ŠÕZÙ$u-ÿ¹.ò(–æKÿ"ªC¹r6‡ò@Ê•}ëDøGx2àlíÕ®©>w®eб¬ÔîDéº(e½ÉŒÙ¸‹Uäæ5޶fJ_=§Œ¶r™î­ÜÌÀTb|³t3}—΃ž{ÀS=|ûcŠFæTEºS4ßTlåÌãúêÆø!´ÈŒ÷¸÷BæQ¹7Þ‡‰C)¥" iyÎUmÃ¥©žÇÊ0© Óþ~Wàx—î͇bQGÒr©vê.#ôÉ¢Ô:-]S1Üþo¢ +—¥B_Øװ®Œÿq#›tyŒ8ut§¬ÄZŠQ÷&Ý0-´^¡Q-›`ua< Lš¾Òey£À–só{˜àîi²Wèàv •nʃ sÈå¤Aüî?~Ê|e endstream endobj 484 0 obj <> stream xÚµXYÛ6~ï¯ú$1+‘”(·Oé±EŠ4IÛ-P . Ù¢wÕÈ’£cs ?¾3œ‘,Ù2v7H‘E¬!‡Ã!盋Þ[/ôøzFÂ_àm÷Þ·×ÞWWaâ…X+ïzç…‘Xio‰±wýégU·)ìbÉÈo«bñ×õOÞ×Þ[O¨Uâ½óŒ+Çoboï#”îÉÂûÍûef#ï‘—­“ûÕU4b“HPeäXû™Ý¥]Ñ~ÍŒ:aÌœ¡]FsÂ$¨É²n~F~)7ólÓTE×Âiuâim–[&»Æfø%a‚F¶ iü[ë~ÞàPàç;šªm¾O âwBóªìÅòï­¥émW×¶D!- yñš&j[¤ïÓãʼ¡ñœ˜í­û“Ñ”ˆ"wM›Ì&`Öp{ßæJ)¿¬ZüЬ{ZÞX¤áL·(Yiîm ²㻼½­º–æ2Û¦y÷€TWf¶nÚ´Ìòò†¸ó¶—ÒÕ‡ÅR&~ÕXÁ7>5<jð¿RG¨yÔ€)’njóÏ焚ùT¨ý ¶mó;´ Œ&p ãnn‚FÀd1Á-qpƒ)7˜",ÁGµë‹üìv*üni?-:&ó’Ù˜1‚éh×Aô¦À0Gß·±"ÜÆ >k”DÕZ2h‰Ì[ö#–6E¶i‰|SV¨Â»#ûà 0 ä“”þHà‰êý'XÅ—J~€ëూñ‰&>¡.û„>÷ õ©>±:ó‰}~¸~õJh=Š¿D߀+Ön››ôðÙÜ"ÁŒ¬ÐXqâZã ÜâÍ.W‘Ãpìóž>b§«<Ãİç;bhIH|b. ‰ý]UÓÇßÅâv`‹ØäJ¡ˆ &ØCö{ónqô/ Á|—ECŸ,· dÓÅc9NCOŽ>L€<:ZÍŒ¶ÞçeÚÚ~áÀhÓšp.È•¯á íÊtµ0—ù /ìHµ>LœùÅä 0Ýߟ¸áä°†ïïpZâì¡®`ážG9_ñÎy‹êàT•¾qÇn˜¬HG’RTƒà|ÀxHÞÁòƒ’ÎþÌ¿ p¯ÀÁ¤ŒðÌ{/ÒB«¾ä`#.C7Uäû &ì`s>y}¦g¨—aEC s¯¢#.Vôçg<Ø{%!|ðÞßhPX°y¥³Ùn oŸ2JÛçE‘7v[•Y3k«` ;aì=3T, ®…¼!ÅÀùã/¬§/Äe •NõÛÏf¨(‚ Bxz™J‰`5¾ÌW]{À£•¥ìÛΖÛ‹DúO)S¹L©’“;\šÈ°ãÂQâBÞ†òÝæë Ô–™nûÀ3Újˆƒ8FÉ>Æ!ÇÑ6½îòBëžË4vÊÁ¤Oœìùj9¸ò`kŽ}0p¤+ăRèC`£\aÃô=°A.E 4ƒ»ú\° ƒ ¸I0]Ÿâ&Á-fp##$@´àF!n¤¡ÚçNp£eØç˜áÉsÜà耇x¥+¡,¯rh‰)AKES‘jFS– ¦S(é9(É(É ‚¤_í&x9é°p;,üWªHcaw²¶É÷‡Â¾'®ä–ÒMvL>öÇAó®Ê3ÂæÚ²Ýœ¡3NDáY­Vcš EöäÅâîÈD›ìºr»^¬ý›â¼| ¥‰>îJ#drßc.Ú£­­+Rµÿ?ŸÒ¡ŽÇ{‚&JÞIfQ‘Pñ£}äåï/^<0´ªPãkÄÈE~ ,ÔXP€GpQž11ÖpèÃèÇêefÿ¥+öar åÓ&íû䪒y9_wH%ïÑ߈ ×oSW9™¸×ÂøiF”ƒ)?ÉÈÚ—dõ.ݲêÜÑÀ!u¡CŒæçåºM~,¸ÂSq=·¯j.ϨÍáN¦±‰¿»MÃSÁzý-ª®XB´ü®÷Ïg¯Ÿÿ¯t?Í—õYïBC†dˆÇ‚؉$英ûÈ¥Í^ælã5ýÀœi0NÃ69ÛåàR¡ƒfì·}•}H›¦„i¹ð’#Cpö~ ø«a-¶›¿12Ì誕0j8ø`ë”Úv×Ýá#„]/fÍå¤Âªr¦Âž±"WØQbL*l¦ï©°‘‹÷hòö‚õ£­8—~£Ñ­ôDĆg ¬ ŒïܰÛã=ñs/H(;ƒ}ßÖ) ­ýî@ƒÎšð+£öp“—&]W‡3®csõtz±¸ÖÉL©ÏC*ï¦TÅÑÆÜ@âÀfê­lÞ®d©ÓY« -mËñÐq8ùÖåÒå´\Øò;IÚ¦b^q©·­-,è¶´¢EÑ›ÑÙeìØccDBxŠeÏýËÿ~p…7 endstream endobj 487 0 obj <> stream xÚ½WmÛ6 þ¾_áöÐx–å×õÓŠö† ÛõºfŸ–áà$Jã±R¿Üá†ýø‘"íȉ{i‡a¸dIùˆ"2Î'G8ü ' á?p6çÕÒùîFdŽü<ÈåαŸGÎg¹ýÃ-ëÎ[Äaì®ËºhÊ¿”÷çòg8[‡ÒЗ ¨Fù•»U»¢¯ºïYp¢>Š}³ä¿Ü‘7Kç“ãËœcœžXˆf~,Íò+ºeÑ•ºöRJWOß+·oÕ¿#W×Õ­–;»½¢­c£Z]=xaꪗB·lIFÕźRÛ•7ëžÀ†þ¹{;sHú©äküMju¬Š¢ÉU«¦¨\0:õH÷Á‹cîˆ8ÔEž¨yf¾˜®Uûrç‚ œƒuú Ú­¦±Ö}€WÉskËýþôà‘#„ŸÇñà§B"2ZC¬%ÞBÓÕñ"ª’Ä7¯ GàüÁIA|œÚAeÛ8 ±™².» Õ¹ðãÌRÇ~"®ê¶¤åèánŽ0¤±q h²,*Ì:ž{23Lp`»¡ý *hé]Ñþ±hŠƒêTÓòËL^‘a„1ÞQ¼ªõ±-۩糋Zˆ(ò³ØœyÐå–\ˆïK½9®hªñF¸ù-@9¬¼—s8¥c4½Ví¦))ñfÒ˜9j_bâ…2vÝwe­æB6Ný,ç0œã³ÔB–==AK6ÐǘQÆÇ¸pòñ X€äzÜ—Ùã~¹fÐ%ÌxdH8Üîö¼½nŠšÎ-Šz»ØôÝÀPúz!$†b:‘Ë JÚDzÛsjùR6QªW½j)—.÷zejIÓ\ïpÌ€éùÍS;ºÌœoš¹m§ºkŠ1kÖŠ¹W ãÌ…ý,ó/e~4ˆµ]Óoº¾QÆÝéÔÝÉ7;¡›e0†D £W1@gL‡ iˆe0¤™S[r~§Ÿgª0¦J¯3‰£‘©xúÔN(ñ} ¼ˆ™Í‡Eãq Èñ(38Þ,ït_oés,þ‘jˆ¨VÛù–…Tž·,wËÿÄúY—Ra.ª¯€róæ‡÷óX’ÔÂ"BÆ"„Ep‹‰ã ˆíTÑ–Ðía±‰»§WòÂÌUVÐ^t¬‚ÑC¿Ã±ZVyôUëzaI$î4Ó°¸û!<Ò„œ1:ÆVò +v d$Úx0hê¼h]5ûâÈþÝöÜÛvz8§Ú'²»öóž¼UECeâåGçíÛÏ?Êy€ µTê@ôw¸Ÿ‰áMÜ$¨Vg^¹lÒO·Óså=_…¢4Ã_VcÊ®W!<"± ñôù*d™y¦ š™ò¯¨¶¤X7Òxº/@§Â² B(]×MØblãÁ 7Ò\êÕ5%d táŠ;pF¢6]i¯óé^Ͷö/J] }KD·º7dW;½þxÿPTÿc¹“×Ê] ÏÊcœ«wù©×jˆ xèM#ò&±ëŽÓ~@`Ă»¾ÞœkgLF—l>ÍIûfˆi‘¤æ"Kä ýî›r†lî endstream endobj 490 0 obj <> stream xÚµ”YoÚ@…ßû+æÑ®ê›Ùõ­R#µR¥¤á­©ÃÒ82˜xFêïl€!&Ї $Ï0gι¾3è„í‡ Eí£É}¡«kÂ!`„@£¹]Ï#Ñhú#¡àÆiFɯr•þ}EŸGè3m” ¤ß¡$Z …a7+ѺØibÆ¢xmkhº·5 ´8ç»EãºJN6¯Ì Å@{î„r gí{ªè¿N%Mò2͘âÉ÷I=këb¶vÁ³°°­ÂOâ–n拺ºÖÈÙaã²m ”O¸{YV«¦h¶¯ªêo" ì<pØ2­º‡ÒF‹p`cÛÝq]mÆë¼¼÷?¬êê!,¿¿ùŲƒûôã`e!…ḩ|Ÿµ]½l¢Vô `x_:ztà¶5U×Ë훼…´bìÍsú£¢"´©£ºŽ…ø„u*D讟Vóðl·äÝï¢,òúÅMe”×EîæMS¥UɤÈÛÙ4È6Eû8T4•˜ˆuu P,.gÖ"6!µöáNfœQ0Æ6‹»cV7¯j«c,ùöå& šª´m«–pxމe´Ú#KðÌ*æºí÷Hå UÀèn~Û½*& K0Á{æsú¬{_í'U9€.  ;{ ‹–çí{²h½¶ˆn± «gà ^ýoðÍÀè“ôÚ.£÷éÑË•y“^{ŸØ½±èCÀͽ.ÁâÈ#½\iO/×8ÐëM[w«wgææ‡ø:‡ˆ¯Þáëd'ñU0…<Ç7+8`Ù'vwA,«—ÒÛO¡T;«LZ¾´ñ–’oÕ·ïþìáèØ endstream endobj 493 0 obj <> stream xÚåYKsÛF¾ï¯@í ÌšcÌHN«µ½å8©(±j/Ë” "! +Ð’’üøtO$‡”ìÊmË®â<Ý=_?g}Šx”À?Yÿ“h¹ŽÎ.¢×ﲈ+&•‰.®a{ΖÁxõßX0ÎgsÎ…Šÿ¹Z•]Yoòj6—VÇM½íÊMÑÎ~½ø>z{AŒ¸Š8g™Öž“J˜ÉNŒxéø¦ºï?û1™¥ÑCd ÓÆ}¡²hYø²ŸUÑÇè瀀ÆËXÎ$o ÷sw €'’I1Jà‰eR?'cBå¥ÜÝu„Àô³+–T|]ämyUVe7“Iüôº¾ïÊuî¦<~"še½!@ Á×ïÒqO2”:ïÅ ÍtêÄ~|ÚÔ÷mÙSó)9×,Sð‘d¨4®ËÕl®A-˜Þ6cFF³4í§S¦"F¢TØpäC3ÍÄÈ9K™QÏq‰—ܰŒO]i<2ÀÕêÀmÊ4|‘IÆ-%åÎi~Ô(#•´G'4gÒŒâ„VÌfω›PyqpäÅì»Pèõ´Î%훢]6å=«ÿ@‚o ¿¸¸DfûŠX1¡!C"=¸ú¥‹¦KL-‡¬e–{Ú¼ªê™H㇖Dt5þ¦„„uIöîhk’„`oš„€æ‰h&Iȱ¹®tý–Û¦)6È¡£…¶ž“«p-X6õ”jëš iâ¶«›bEãÒ­YÏ7ïá7‹e¹H¸"2뢲*ÖDâÔÄÿ+–›Íñ"~7KEì”:¾‚Ã-éÃ|3 B=‹¦¬›9ʰq]º£àštli µñØËÆ Kæà†s)e|·©‘Ùç"·\œL¥a¼·ì‡¼Ù¶·¿ØÞn~¿˜Yo—w@jЬ7ÖÔ<Þ¯ S7PlÏ™-fd¡-kç~jt?T÷>oòup„к”CÌ– <–»kIÀÃmI~GÓ]?»­·ÕŠÆWô5Mà3º*®¯¾ i8‡Z‚Ù~ ¬ÿp~ùñ§º*ɬôºþáe’ƒLû.(†¾ÝóþüâebNúzÉWÿñýùË„¯ËÇbµ«Çó¯‰\F~r èËÝc$ä'=oâ'v×OÔ®Ÿˆ1Öh÷”£øœfO; O8ÆÜŠ>\\ž¿ (l,q;@î¥OKƒáIãâÓ6ïóèp†¶krDòHK‹‹d²ó·caÙÕ“‡Ô<ûKÔ$ôêíÆ£9QÒî+yöÅJ¾9‚¥JG%E&K‘ŒW[TQdjIG¾¯$.’’oIFß]Ü–í@?)YÐGç ¾ã•ØO2´Qoª'Šk(½ õË¿½ÔAKê0Ì …¹yQ˜´¦AÃ7O uaßð°D˜J-ÜÁmov-frè™CQO? êæˆ(’ŒÑˆ«;*xD¥«Y¢–%ú«=–8)@ø¦èò²êÓ_ñx_囼?ʹ&9¾Èûx s_ØU|S~FÁ…/ìþÜU{Z+}¶ÂlyÓä÷¾æ-g9%¨›-ðw6ôƒ¦?¡ƒjðýDz£uB0è;D7q=S»Gq]W^rsƒK˜ê×uî›-$®é·ªâËÇô°×Ò+>õ$ÿ¯–ŠC°}÷Y\B›pY¸‡@SND¯Â…î8™:0+ƒåYffÜo^¦Ñ\&Úõ‰nÂâ•m`wD';ÖÁE\^÷½ðº ~y,¢nZúö<§©sëmUÑ"Y¤À©‡Ði{s¡£:sù®¹æÀµî|'÷ât[j¿³o_”Ž›5Ý­?UÞÜmç£çÊE¨­¢iê&\Q€Ë®°£ólRJtæq[c¶¡$çð… naˆ¢:è±ü¾"ª%è·ÞåXQüfíY}žA<äM™»[î„Ï™'ìó&ÍÊî–P×pã”Sл¾£: “:ÓUš¯²JSTà*”ξÐ2Íÿ™eŽ@u¤Þü2T›"ùö®Öyƒý`š ®º×B¢#ë021¦X æ¾ðÀg®ªÀ/)ƒ&ßÜø!÷[uo:¾“´’1!­6ËðÝpL‡.¼hŠ/ÈCª ±­ðû®g˜*tÜpõ7¡%LÊgRüÐF*ßp²÷`tü/ï:¸»€D×l—ݶq½Jv|ÆÙA}µ%j²ƒâd•ŒJôvPduÌ25£B¯CÏ7ÚA‰vHÙÚÁ‡¦„ 3µƒW˜îwгtŠgØ0Öaà—b°¥‰À F+Xÿ£{+h+ãÿÌR9Æ&>ƒ»føeøšP éQ†!÷[A”U"˜=颟öiÿ!œ£»½ØL©™˜ î΂¥»ïë“pw‘RúQv Øáô>$VñgÂ0ÃU¼ï,ö àÎCû>âà =áþ—+J<Ò`b> stream xÚÍZÝsÛ6¿¿‚Ô$⠾ش9ÏôfîÚ‡öê·ó=0m³–(‡¤û¿¿],@ôa7M;ÉD¸À~Øý!ɧ„%9üa‰æð7Oëäê:ùû?MÂò¬ÌËäú>ϱ£’ëåÓ«j1+Xúp×m¶írö¿ëµ ¨™ÌJ3L& ;ãú¾žÍ‹¢Hor&º~ ÎbÓ.›¡Ù´ØébÆuz_ÃIðŸzItñà ¶y:ø•€÷д5Mmz¿ÞnV«ÍŒ«ôsÓÞ}ãDd,”ÑYBr‘If…|ödE¢³R#‘Ê8ê‘©ÒRüÇQ¨`2+@uOq“çy”´ÐÌHó#&2ÁN¿F¬Zf0a¤øn6çZ§qn —%n¢þÉ3ã¾ß¤?þx[„—4ˆè›È"`¾Â}þù‡›™¥˜ aPÑÀªŸï뮎­_€*^ˆS¦7ÓË©QÁ#‰ !]•ö[9O6–æ£ï›[ú\mŸ›USu/Ô}šI™V]S}\Õn¥ˆ2\ás3{µ+1ÄO)QJĽjôQ$頎蟇n»¶]µŠ)a] S™Îå‹Íj»ni%¥Ô˜Ñy¦¸ûŽÒŠ\“´Ø€ UM‹VpL¥ëjèšçl6WJÂAàç›»õócW÷}½¿bWÚ6]½®Ã%‡ûj ÏÕjEÇ®Yƒ¬ÆJ£ˆVaiåÜwm†»ßlWx¾Àܾšþö…:Õó~}é‡zMƒÖì(í§mµj.Ázæ0×1ñän-˜ß5wMkÃ?ýL£Ý[ƒ‰D¡Òµ4º¨z',ƒzå¡Jõsµpcî×õÐ,¨?Xc+°1v?£¼¤6«s *úfm€§s½¤[ 5n`›´NM;§ê=›b×þ€B²ôžv þSS´vï°„ÃÙ±'…°…vÁ_8¿­ÚÝàE!7 S{7Ä“.Ý8ÓÂI3/˜´6çNí‚•“{…tµ½ zšèµßªÅ6ÏPÓDò4\4Ñt§'}iú‘Æ ,ëG²d»ìU±Mé8-^¨g#£ÌÓŠº]Ñïb¼rÜ<™ñ‚=Ú¿§1ÚWÔÞöö®D“ÆìfõÍúqU;Z°˜^¾Ç½S¤öP²Q”y¤óð©YÒÝ̃»9¸}Ýþ¯»fÓ…î³g2d–ËaÆ03 ˜Ë&‰A˜ˆiQÐm–Ùû(I„é&ëÇíP÷{4O6xÝ! L¬õqnÝ7KØðý‘D‚ãi\yw‘cÓdÊßßEWa8;ÿË&"“ETÆvœb Æœ+•å*4JÕºlnYC`¬ÁýÎ66m½‹‘ÂY¿ðûZSÿ~ Ú5:p’_Æ1\ø¬ªî®¦œS¤ÕG»Ÿ] ŒBuõ ¶Ýž59¿îºM·ó¸™x\ef’äT”áüp|J²¢4Éç„• Á-Ä%XJ%ë„ç¼|¿E“Å]²yw¸¾Ì¸ Ùb"¡šÌ/L2Rœcñ!æõ9ƒ6ƒ˜.4&ÆH×EÜn€cØL£Û±ÎÞ~à˜ÛC²R~Q·Ë¿¨Û¹É@^8pdñ{/Î:>Œ-òäZà/.àæA³ÛTvi)3mÆÀ]'¸Y¥Ê„ßUsYÁ»ˆp©io‡ßNR7iÌ6íÕ 'ç5œD»«av¸ˆð‹œÜBå™-«`ŠòhÑve¨.¤ŒÈq‚ ôõb<»ÿ\h€KÜcÁù¾:´X‘q…ÓT¸=D,fpïáyÃÍÿEùl£|d„œÂ y±ctëó$,Ââ¾ñqû­|!CÈC0ƒ3æL)ˆ,øÑô3öÜ·ul‡©Ýzw.+jc MYîNÝSˆ »0¹ u!`Â3qj8á¿9¶g,„Aã ‹„˜æxGç§ŒcŸ Sh ýŠ5ÖQäxçÌH~ŒBü ¡R$Æ@›L¨ @€‘Ã;ŒÊ"jÎð^ùóíâê“‘Í2ám£Wƒ{}šIáÑ’8>TdÚ3½üd<‰Õ"O·ßo;°€MÀ¥sÚÌ…Ìñ. êZW<Øê¢¡2cõ‚(û JˆÜÀCO*W:H“n]ùßQŸ`DÆñ摚 éËqh„Ž*.‚‚¯½öÎV\ P‘/VÛ%\x$B1= ã¥kZDÚf¨Ô¸™e³¹dšÐ;uŽht`Âk*'xv­îØ8Àó ‡r…~¶x6<ƒí=øg |·tŸGøÎ2ÚÐïN|êO‘I·J XsЫc«cz‚Õ•„Õ1í±:æœ ¿(Ã…BÉiˆvÓÎGª%q"D¬cºª6ãAn³éÜ’cЪó‘Ðt#Ær‰x¢< gmA‹yÀyŠb×*WP~[×6®qŠ[ˆXÔÔ‰gjF¸lÉΰ¾Î@¶iqãñ#®ßîÄ‹ Q¥ÃäqgdèÝW.ëë·ÕjÑÔº|Åã[Àç½Ï›>šyö.쉮±Ð.Œ‡¼okPéc3Âpnü!¨ÖÕkP­êwaZ…°ºÐ™¡dþ>z ™3ÇÐ43¯r/-å˜Û0"2ÞÏef¸ùÞÀÅ¢/¡u¾ã¥ô5Ë!Ñ%KÇR9(Z•I é­…Úd&ä‰G8QÕõ푬ÔÈ îY}¶2Ð_¤ù’|N]èS>“%æ L_*ÚSò•¹ð$¡ÅéAÍt-}u¢³,¸ˆ?y,7ÇÁåéÀd‰éFü–Ê­UþóŸYln ½äñ5}pyøZ@š]~]|O>ˆ¨Ä4…§VHn k`^ \c9.03=RŽ‹ÝSu´ºgx*Žõ¸€Ë1^C)|i9®ãå¸ÅzO-Ö,ø‚e4%ã¨{ø¸€}÷¸ Ýã=Í IOH@?¶Â›)Ü#³]dïuÁNÜЯ]°i1ã9¢_AŽrî½'9õÞE«Ò“Ucï ¹.¥VX®a@Ø]êŽÏ™;y/ž/ôä¹ø"ÈóClúø_ŽN7{Us  E(÷Â/ʺZ ¯ŸQ·s˜õåi“:z`½õµÂ 8‰•K£Ž> stream xÚ½ZK“Û¸¾çWðÈ©µ`¼ž¤*›Ê:µCv=§dràPœ‰“”g|ÉoO7’ JËe—EGýn:ú±ˆÂiiT좿ÝDoß'£$£Yts±„d2ZညnÖÿŽo6åÕJ÷›ª]ÛÇ¢©×U_55¾Ê¸¸â:Þ”ð“ÆÿÅJGw‡_ð™Ãr·OÛìûª.íÒª{wõŸ›_àØÔœË%I˜9÷¡Í×fêí{Ƽ O ¤ù—#˜1ÀOÜü_BAÂAØ@=­_q­ãÛØÞ1%JFœh ÌÿB›¯8ISü×ý8 %l`àöjØDÀ¹™ÆiàOF# 7¡SQ,Z4·T°À9¡ÂóCxbŽ`}Ø`ÅSI$ó¥ò´)Û2´™ Dž’ %z½êVУøÐÜ]­,‹¾úŒ*cÆu|¿¯ Ô²7a1j’ˆ“räléD{JÑ7­»Áýé› ü‚^ßR¦Šª¬qªïÞÀ Ì&õ ø÷Ñ1šgP𠳑b`>·?»¼o«g‡G›×Ý£a­éJkn+¡$»b‚$ÒìÐ7 òü˜×k´r NÝÁN•EÇÔpŠÁöÓ)â’\‚K²ˆ Z6Zæ¡j$“ ÿì”7Ÿ5L¼WD邫ЃŠ-H*%ÔÒŒd£,­4›©©²’ÒJª’êø·|cýàd±Cªý¶¯·UÙºúMÞÂiÛrqíDÌ…@ƒ6"NFËLÅå§}¾­ú+Øã Ž$¾taßÎâUdæ4š¶z¨ê|kß~û§ý}l›»m¹ "ÃPS=¸Ÿ°¸}ûÅÛåv[n3ƒoGÀ ©Æb )áÚÇ`‚J¨`sÀPeÁ½§JßÙÁ{{#çÛ­]~çûçj[åí73l«÷E¿oó-¹¡ý|•$qÞV9`æ6´œÑg:Ù!ÎÈ õ¹p˜“«•Îdü²Ù•`ŠÜo {™ÐeÂü€Ž3`߀Dgná¯hA=ª¶Ü•ƒ©KpV×ft»—T‘aÄ‘]ÙxÝdîu˜åàÿñÅݦÙo×vÆJ£Ü6õƒD1™ß[Û´ý¦yh T8Q4»Ç­wsCsoçrûº…¬$oÝaû»î1/Jû¶FÇ/k“ÖÀë˜ÖÐ,ÌÐhE†L2åÄÎÀ {<âÄL¯˜>471Rè¸"%T‹3h³Áö`Ëm+ØÔØ 3.)Æpp@Â;P"'oæ &ë¦ÝåÛî˜!cT¸3©8òù’òxc¼Úø‘öq›×¥¹?g.m0+=#…·®ñŒ4ä(Rpçì´_A’¼ç ãç wÑ{pÕy;²i¼÷v h#xr8Û(ÊS¢ÜË yâò^›n§rm©·Ï‡0€ÀƒHcç<°ßÌð‡ <¦\ù*xäOJ¨µ8 $‚ùð„÷áßž#S>ÁbMPa|‰Ð„Y+iÚ7Α@ضÙÅ}$þ €ŸyÄê˜Ta‘ÚK¦Ã%3’Úÿ||íwÁ¢Ð\}Ü·+TϪåa—€CHÂ}Ž—¥¯ÑE2>rôd ÃìÛ¹2u²IàUËÐËsÐ_Œü‡àÛYàyø YÍy…ß‘ä]°—¡À½¢Q„‰¡³åBf{}Õc_êakå¹X+)VògcíÀÞ} IÀüÌ,Û® 5Ÿ"­Ë®šƒðß•…)Oðù 3»MŽjó|œÚä8÷Ùôã‚Ö Êe²iîœT³a>Ôj0J6„«q9¥—¯š©ä#Åb­>iêåÖ›,/eœs° óf ‚QÊ_ljfå.â½ØBæÌ±Þ´¶M”4¦KmÖAk¯ƒ[Žåùmüë¯AĽæFÈ(Åäøÿþ“ëuA¹˜^ÖqäSYð•QÍœ“©šäPÆJS^Ù>L:¶„«eaº-×ûkB\T4) `ÜÎÓYå/Ë{ ¸ÛOxêÚGP–bfùlìb‰GjyT!m£5¡³2fäZh1p¦˜†ß©¯ïòm$¹…uÛý®^⚃hùå!,Ú‰çå‚pl~QÁÓÞ9X5õÆðÍD2ÜïÐb¡ËìÚU)zYOyµµJâ±½7m7dw0/çj84 @ľ ð%GA-´ìaê¥IÉÅɃִ¶OWZÓx›ÃÖ´lܯÑ^x8hCŒ=-}¨Æ}©ë¨Q6t2f5Êlç~§.š’*þ¹¶£EÞ•ómÊç¼èí#@×ove_–*èÎ-óºkðú„—µ½,¤»³-;×Aøï0»nü¬ cÚ‹ÄõÐâI|—wx¤€‘Ì Ï¹Æ×4Þ4hÚOF ­2š‚«ÚndÂ'£›fƱ„ƒ·˜S$MŽyÑÊ Ãa1OŸ¸~cµl›Í½¾^nã|Ý1cn;j  EJiƒœða½71r\âƒéÐ3¤¥3ˆzÝÙKÌÜÞÅ»ÔðLmÿ¢?Ç®§3»! s²ö®Â âncï;ÇŒ£}w⨌» »‘Ï–ÐÛXË_»zÍÈÝVïÚ0úhƒÆçj}ò '¨²­švåºÚc¿)½s/hFÍ?òÎ:è™|€˜ˆ>Ïu½O¿Âtd÷½‰ ØU:J·Í{\Yvj@÷.œ†+’&~Ö°–"ã‡ãÅÃì¤wËŽ¿Ë†’av:–ß)f¯Š  û,é0³é°8‘³×¦Ãüû¤Ã~½8}e]¨[ú-ãÝT?åCQ¶.Áêv èݤéîÜÔgÚí|æ¼µëL'ï‡Mæòì´3ÎmÞ>”¶ˆoqg<¤3³ñVm¹ÍM‚0ŒeÛBn2ZT:k)"•oQ¹Mº‰>EDdiô±,5%u"%ɲhq  Çmô!úÝþ“ÙæY‚6eCôscNg_|“$õ%n-w¥ K¼¶ÚÛ÷œÎ¿šu:—ÇZ£H’Ž…– ’f—.¯Š­0åï÷1˜ëOÅÐ>´?—F©ål5SXa”Z^tÆuHì+ÆS¼$6…vùþ±ÜÇù*Áf–¹3•˜”Ë ,ÉÝ'KÔ¹³ åÎÏÊ]œ\vRîé¥ËCr—€8¼K¤z­äÅYÉûV`Äñq®Ðc®‘T€Àd*rð6ð,£Ø&´»®Èñ% mЇH.ûß 4¾Ä«ÏþïLrÆŠ “˜ŒÈ‹@ÉB:ËËùnÔWórGHÏxcšÈÔkÒ€êt!ÅÜv¥´FWˆÄJÔ¿ÿéÿX­Ø} endstream endobj 502 0 obj <> stream xÚåZY“ܸ ~ϯPåIS»ÍˆiíäasÕÆ©Tmí¼mçAÓ­žÖZÝëðØû뤎nö\Ž3•¤Õr›zÚæïIg‰%\ñ¶Š KÓ¥e–Rp–'E}.Ø^Y)ÌB Â8ó TØLá³j&d` UÍÿ‚UŸ¡OõÈN2ü:>TÇêPýZ`X_…¤[ Í”ó ñLÏÓ=ofóÇe,>ʸâ*a*›KõZQD_ "Oñë!è×ê±h¥ÃHòæBÍ¿J8ù7õYŽ—¾Îáxžã½(H¾@·/ ’ÿçN;_%G),tÍtÜì®V’ó¸8z´+uÜU·$W šŠhA‘žâwﮃòå,ñ{¡ŸY°ùÓ÷Þ«¤4ÌD+1†¤Ú5íÕJ(uZ%M÷lÂ{L|Ú$/Œ¹½4>{7 3\4]Œ¿¼¡ÁCh?’©ô$.ÖÈ™÷›c0?*é^‹‚&ñý¾lËàž!—š/²<. o5Œ·åvØ`Ńc›¦ëixÿ½¸m‹ãmIÏôŽ¡î«»º*[°Ÿ¥Gç±¼†OU]íg?™œ/ÊŘ•.œ7Δ81°^X=…‡&‡ @ s,ü>ZçŠÓN™"ïúvØôC[ÔäNë8xÄåäw¡%áÎ䣳¬8O‚‚\˳gìî‚‚ô*h)mеÇpuÁ·Õ\Á ¶Wè%mUÜÔA‡8 ùƒá<}ÄÇ—Q–APƒ*ü¯es(û¶Ú@8ùL’ô{{L6oàcùé®-»®ì<]Iãmùa¨ÚòPÚÙ“£ˆ„3>÷“~_ô˜?sd NSTDÞÑ ”T&¾Qmu[Ñ«pø®m@1z £Ö9vëõ¾©·¿¥šŽ@¶,nÜ"ôÄÿˆ(h÷Õñ–Æ++2nðõGÛâ88*")êÆR; }™>C_­ $l«iªÁ³^a4¶):”ÎPNÁë Ø±TàñmF–æI,—Ø„XîNX67W+C¿”›¾"•œoi77ȤÀ¾•uŽá¸í ·HÌç ¾‘Èc £€OV_8avpÜæxf³´}>–å¶#ÊÞ1¢%ütlx6Ðð…Íæ–Cs\y-ÀøR g»iŽ a–â!Ö’Ç? ysçü2Iâí`Ï MÁ§}ѹáap½™y › „ñåŒjáÊÅ|9o "ƒ=5ñìÛÌ9ŒO+ïJØÎ $½ÞÃ& #Ë_8C^Væ€u*3D¶S‰r5®A¹èHÎûrÙ¼L¶šu"å¼O‰>Ü }麕Q3mz{"a {ŒpfÙU¸Ñî»`ò†Á8äF’ añxG†«yG&Ð*%,  áNi £x¹ó†*ç®Ò Ât©hhþö€-\ùÌkî0L3ÏjR‘7[ãµ-˜‰Fd¾ÌúîÏʳ_‚PráOQ_̲—Öè ª<EÞ·.Ë™I+!ajNy¢¨¥ôÅd†üC«sÛá‹™‰ EÈT!¼9/>ô¢1áÄàG„€ˆ’=¹‘$™ã–ö¾-û²…üm³=-™ÏÈ$q°Š$@ùä\¤fF çkl½Yœ¾2,U‹F¬HF‰}Žs´?GÎc±ó>4]§O~8ÐLMâo‚sO«½p>(Áǽ=®žždž®Ò“pµ0+ØJ*0C*|ÖiN£3¨±T°Ä Ï¥œ¸è332÷åè¿ÁgÄcÓó¯ä3‚zXÒCÿœ×±% ‘{€^4ZM`=DiΜ3k/„›ˆÆx묄Á0€ Ç"üe¹ü±m”uÖM’Ç>ôlÎ×Sˆ/?„!%xFv­D.lOá'}?ýGƒÙ@dÜeº³CÂæ«ºô]ÙÓ°mXÁÀ»¢ºýêݰ?®y‹x˜U/-Ñ4w}u(&„c#úîèPrCœ«ã¦¶ew""r×ï¿õ]tBý³¢’–ÊblP”£“¹j$Ëô¨•ÄvcP¾÷¶Ý–fIÜAáø2µíèrGå«„>Ñz0÷S­âû}EE‰3녤ʷàæ´b‰]ë^ûk Å‘»-+˜ìºk‚SºLêX7©ø®EEÓ=Ô†ê¡NQ¦§œõ²NQÎäÌïmõ“K×%|‡pe }–í]Ñöa€%§/mËËY[*ϡޒ$c‘TšªIΩʧçíD]‚­ø'y·&ŽÆƒ®Æ­ƾ·ê©x ·¦úiFæ:·Z¢Êg¾õÇÀ&Ù¯v?âYÔÕ®?–ú.ÀéƒR÷ëì^¸â«rGœÂ!ÐÏ{ö̧‰ó¸/2 µ1,Ë­l:óÔ?þæ_!âf endstream endobj 507 0 obj <> stream xÚ•WYsÛ6~ï¯àô¥TÇD€gó”ÃɤuS'VžªŽË’ÍŽx¤*;“ß], Q2Çq&™°Ü{¿Ý…½Ï÷BøÇ½TÀÿÐ+ïåÒ{öFx"dI"½å>9^¼eõ§ÿê¶èG¥L_.þZþ Ü©'"–f©åŽá’îOc½©Ç… ý{’xqùŽºÛŽu«£á|IVsGLF‰Õ#ÂŒ aIÆç"ò/u÷ÏF5 %ýª :iUTu{ól§kÐ{c‰sFxäqÎò8vVd 7gÅÚ‰ý›MïÄ>{Læ™·óâœeI¤±×x‰d´»o¼+ïÃŒ —µƒÎ>P9–b¢<‡TÄßT>á²Ê›~ è¿2C§~>uuK¿¿_^ÑaÝé¦mm3‡,s48k1‹3cìê¾íú¡>ÉðT†§ îÈ Bu;.‚˜R|Þ]ƒË+sCéÛÏ—gtØs¯›Ñ’Ê®&*@ºì­T_èæÌ8“§L&^À%‹)/©ò¶ÐV`ÝZ-žÏEË1Ô›g,–FÇk5”ºîǺk­@< 5fùûòV-‚(âˆVæ(?‰€ú‘šý©DwÂ=„R¾/k [V$cY‘bÊŠ[VC\ë®!jA„QÝDX…<Ú(¶Ò$÷W.Òƒ><æЇÔ:ÍRJ¿è·2©‚jŠÌW•ý†H“‘ÿ¢‡z‰ÔWmUß9èÐúøÖô é8Á)‹0"Ü`xyGÉ9¡$6œ‘;}q£¾Ç:BêH²oš¦$=c«…Í$hLåÄo€‰“v3iÄnm1˜Þ™ãz*BYci•­Ïè,QÛCU¦UüoåÑÝ +¶î6›?î†_æ\ ò˜EbÒÛ‹Ëk°qýúüÕos اäéW²nÞ9̬ü¢-kÕ.Dâ8 ç³´>?Ÿõ„4ÏxòæÝÅùÓ¸Ø ŸëÆj$S@Ó»S…5S»0!;+"x åÓ©»«ÇÛfζ Üá%ñÿžËKœ11»ù2·»Ìš&ŽŸ`>FÂÂõ;ßP=âiÅ0lÄ1n$îãFbÙ5= sP•ÑG0ĻۚŠJBe1X;Ö`òؾ”BâëòI 3yÎÄѪªÔÞ-Û@µy«•›u¶M"Œ;¾ÿÑëëý}7"c†™2ƒ3£ œ ìÔøì£+³¡"©Üjm§$¾S09£¢"üMÅo9 šGSìÿ«Jë…¨bÝÀÀÙÜ]iÈuåÖ8…s‚§£ÝðH ÏE4)ƒQM¸‡…ȺØìS+á'k㣂ÕOyfQ/%®—R¿³K#-0 í0›f‹ç°-K€Àz»Á§€¢D,”‰ä‰O5qXÛHŒå/Jwfäþ`TïêA8XznF:Þš€Õ*³iÅ”ÖnÖ7>g¦#]NLšÛ® Èüô±~<˜3T$iÊ2ú .É÷‡þ‹6›Ÿ endstream endobj 514 0 obj <> stream xÚíXYoÛF~ï¯ úRª°6ä<š§&q‚´nê$.P *\–¢l©TíùñÙÙ%—cÉE ؃;ÇεßÈûà…^¡sø¼|ã=»òž¼ ¥†,UÊ»ZÁ÷y°4ò®–¿ù‚…ŒÏæaÈ•³ÞÎ~¿úÁ;¿ò>xL¤‰wç©”%RÄ‘·ñ"Á’Ø.×Þ{ïí„€ár×”]qÀ:•,MÖiÊ~ŒõpȰÞlÛÙ\ÄÊÿL‰ÒÓmSÿ¹.6´Xf]F³²¢ñ§Ë÷4YÕÍ&ë´zO^&òR67Ò¸b*ÖÒÞ¬êm[¶ö.¤ KÆ Ös¥X@$eÕÍæŠ¬{­µ»z‰ÒÇo/ÏhÒ_m:³•×Uëðê|k¨¶Y³9ÓÊ„`ZS0%µ`‡,¿ÍC±ª²M±˜=ºnÈÆÑq‰åñ¢hó¦Üve]åÞU±TÒq¡_Ý‚é¥Jý¦ÞueUš‘"ÎâbÏL2! N™ŒÌY}®%ö½gqAžÅzGíYœÏÎeø]M{ælWÜw4[¡\l6O8÷æ@€\P¥y¨íÓÁ´–¯Â/[—ÚTàNžøÅÒ|ÃPÒÿ~ ã±_TËòÞÆ%ê»WfÒÜP4 3©@r˜2εèg9RNEŠÔˆÎHmvS_íº]cæYµ¤¯ím½[&oi±@Ë>"&nÁ“ë.éøæ—‹‹©kp–Ú››É’TMû9Þ v–£á`+ôÛ®)«›)ñaâeRkû„|ÁHŽEM¯gõj”5ÜÔKœQ½4»5Žù¸®Ô]aò(­RJˆ¨×+Ce™º¬zÝç¡Ô•C×[¥•†º Šrx¿îÊî–fí¨£{Zü1`ÉàvóiêƒÇÚžøŠ$—)‡<­r8/ø¬mw \àåqì/Ïõc½ÙBˆ¶ÅRó‹u,jÍoKò,.¥Ÿg­¡è>ðhò4Á—ù´Ws.Rm9Ç€æùi0o[Šþl×Õà”ö“Õ»/€µÉ!”„ÁG‰ÕÙZ>†Éï H¶ª=0興S0©Mx6YGšÀÞšM×cX´»<5W»5>ji8>d¾³Ÿ :@;¹Šð©hjˆe•ÿgÚÜ•m¡•À.0&p7hÛã¹"<‘óMcËÖîƒ/ó¸: ¢a·ª«9‰Ï=T/¸@lea½8ë‘B%®7ë#ÀÞ‘ÓÙòØLp‡9}¡Ž2wNæ · íµ¬SýóË‹ó_izqyã“XÄøÉ!Æß/·ûì¢ûC#G,F;D1‹R4r k¾Y»väáT’~ÙÈ ˜I9Ì]ËŽ1wNæëíbRù^-.JØ‘à3"&ÚœqOs œóTß^8‡7,9~=÷˜žoï©]’¶]ÚWàÄîÈòœÿ¯º#©ŽtGÒíŽÐõׯ@cöxè/S>È{hà-3­Ìtk$ûÔÀ-L û& >¯šÚ:Ó&I5´IqbÛ$óZGŒ'n‰³éuK§_©°o˜„i˜’G7L<„”t…F']Ž÷+\bæ;4gHÙ-qµ'ÚÆãÂcèÚ#—ªï•8ô~!ÿVÿ°ZB/•cC5Àj‰òX-ÀðEX-O]X»°Z"h¡`5ÎVãØY­L~Á–…›úsMco> ê”Ú ü8 jØ!j„„¨QqQã9BÔ)>PhE3ÅOª´U®é–E¯Rka±iš=›‘xgõñk›Õo›ZÿZ™`Ré™P?¡ùWЪFθ“˜Æ·ò]Ó˜ pÁ<¡Ð‚ÚÔ-K6 (ØÕ/´òÿ*r£…. Èb³þHûÍÁ6¬è:½i(–F?·<àÈq.hÖô£è¡ ôúÈb“¿^FáÞ/1mD”-m09hDÀ8C#¢Ä^#–ôá>¦atÚû¹ï»í@3Û†ɸ ‰L¢¤iC"lC´®YeÞ””ãïænx¸ n"¿Ð†Œkr¢[Ï(îXØÓo¿úç5£ endstream endobj 520 0 obj <> stream xÚ¥Ymoä¶þÞ_!ôKå"K‹¤(RiQàêÜN}©»@º¸*Z­­F»ÚHÚÚòã3Ã!%î®ìõ5°QÔpf8¯¹ÑOøã‘ðŸDå:úëmtþ§ç,W*º]Á÷OXžE·ËÅ’q–ž-8*¾o¶gÿ¾ý&zý1™›è1R93©] ³he’í_›è&únFÀDä„–^>#XmŠuuwö§¹Øð¬ÑßÒ²þªêË®Þu»q Ô|xùíDlšÉ¸kwC½©æb*¸»ÄÒƒU>Y‡ræÙç¯%ÓÆ‘Z²ž¸ù€/”i–Ú|À—8Ä|ÀO.ìÜÐÒÓ­ª'÷á.áiS±³…‘*¾³›A\ ¦0½%ÃÔe|ÆI’€O/AJP¤§¹¥µD…0qµ¤9›´ð|·ÝÒüfY?ùРŠ÷ý×nÐÝ“ÿC›Y†eC±Ì2Ój\8·F¤L™½E_ "Þ÷ÕçW‡Â¹2§Åƒ“lo»;#Û ¥G1„‚P†Pªn.ŠtŠ‘J¡1?="êE$Þ#]ÕWÝÿ΄ý~£Á®¯BA`xEV»a×¹q±YÒ×þ¡Ý5އó0½ôίeñäųõUÎ`D:~û««¹mØ2F$ŒŒ–‚!±jMÄ%î ²½(Ñp0Åã~èêÍýlyO86âm ÃŒ|)˜ÈÍÁÞz’YÐî·£vE›¼V”c8¢s³-=ó ›çCå’ª¤cš¦Ž—+·Ê3 Yº/xš3!Âd… E…2ñc=<à(û¬Îžèå?³–3î=Ãîž«~z¢øä„9)‡<½r(¶îi®èûÝ_póøqÜ=Qö»²5W»ËŸH¦¥¯XO$zJ€S K`C'ÒÎíÄJþ¹êZŒd™Ç¡ÝcÝWVf!’-d)ºx°KTW!sŤ٠è®óEk ÛÁÖ&ˆlÚ͂Ļ:= £€Ž,q´:£qEšN@Ú½Ÿ@Òœ®*–ÇH:aRÌYKu’y@å˜ à´•ö4ýõÕõßN‚h/Ûêˆmlª…Ao¦Õ–þ„ê}BÍ,Dý4&GòUSÜ÷ÿ7Æszü6ˆ'¹x-e B” 2fÜÜ\Êè "]OÜ''qñpdÄ}g:ç-Ž@ìüãå5G0†ã®ul Z⚟ŸCyb0̳»øÃ™bÖQY†²™uÐæ¤W>Êì!CUE®ì7-Ö§G__°öç€!/´q} †ÒC44n2CC2@C´5;êÑ}Nu ÀaÆŒ™‰´äÓÀÔk˜ÆV“˜&‘!¦Ñ{˜†sŠî1 H´Î†y| #> ³˜æ&L/®öÀçzc»€öx&d8± åZôâab/@ ÏHÍ'<#µ˜Ç3€³UöYxFß u¶`lÄŽx'íÆuæ€bÏH#\‘å!ž‘:qxƲñ_Ã3#o-/€g¬¹«-«Q­Þ#zÞݵ‡Øö­žÿb~~ÛÚ;ƒ+lŽåãR©¢ ÔPйZÓ$¦Ê]×UÔûqñÔCa0>hÒ`¸l*‘0kÛ…Šÿ[•N ë$d{m p4Ï4èÜáKmç0 ÂšöŠàð"ÒÀ–õKŽ0ÉØlcÊ8KÅoÁ‚:÷á“cA˜›° Î°`Χ¥¯aA.ð´úÆÎfðÖà ‚8u æ E"äA`ÐzJBuÌö¢¸puy ¦³`P€ÁWp¸ke&è«Fî#¢7À„$õŒ’ '&jꉉ»-gAŸ¾ºüø·~q³hêÏ\1Iü;q]îÑ,×þÞ!—`¢œIN×§/+Œ´÷zRb¿ÜÛÊX‡L{¯þ´%u¸¥mSxúw7—62/º'q“_}[IöÚŠ¯À‡* Ì5¤}Øœ -VÔÍ»¢qí_Ÿ]‡sÄG·R0wG°Geñ»IŽë^Ž´áu½)ZÍ}Ùàãʶ­E»Z4>‘Ú#󽆎™-àC]5üél„âU15‰ÔëߋΠú q顱òõ3Q[WIS½¶wŸþCSl~t¶EYYxü¾ ňhçŒs_S«±ï‚&áæÈ eqt cÑc}6óÉJ—ýKWåëÕóÞǸa$ÝÈŽM ?ÃÛ.ƒ—׎«ã{x`Ê"HRmlº U ¤*½S ôôòhS·s¤KŒLaÛ1ð¹L£Ëð²ƒî2Àªh[Û9¾N` ¡[ Žìc+ì5„ik~ ¡ûÂÌür]p7ò»)ëjSú #Úßô;Ì]°/èû ™:tÏUQÖM=¶ë§P}ŸJ$|(6¶î¦îî+ 0)`0©”Æ#…¢#EŠAÝôôgƒ/}ÓQ“ý…†ã¸k#~†í—ççËz]”=ëvÃ}Õõ¬ZîÎ/Ц©@þü/žKèE¨3c7Ú¿ Ø¿l4-ex,Ë-±Cã»ßý Èȼ endstream endobj 523 0 obj <> stream xÚÍZmã¶þÞ_áoÕ¢kE©·kú¡½&MÚÃ]r·@€v ”+Ók%¶äHrv7èï g(Q6}6‚^Üâ;gæy8Žoñã"^Dð/^ä üE‹j·øÓÝâ³/ÓE…eT.îÖ‹8 K¹XbC¶¸[ý#¸Û蛥ÈÒà>Še×XÉ‚mÝh*µkúnX©AM3¶Üº»Iòà@ÓÓàáf™>š¹ïÚ‡­ÞÑi‡û@?WzÏ;·û¡nµ¥ZÕîvºÁµ‡iZ å\O›ºÂ®ÍÍ?ïþ :±j"LS£ÚNaï ŽRØ\Wz¥©B"E®H)}Þ,¥HÙ.تŒVÑh”ˆYÕ`A6 4F‰fF‰\£¸3u³šVç½ßAo7µö¼«ƒÊF®žëv»m±ï Š$¨üŠ@uõЩ- dÐv+ÝÝR׆ǣ@?a‘{’`uØoëJ šÚýa¾ê¸­iÞÀì›ñ:«ÐˆöÙ—…Ã7´Sa}MhŠÑ”yA«Ûi.MKÊ&;³` œçV&,>Ö$=Ö2 sØ©fÙiµR[n¯›uÛ틦)¢=ðŠ Œ#6YÍpĻцk$ŸƒAýØ´F(Ó9ÐêiüåÍ7ÃRt°é»La­×3j§£Z8´R µ©ýžX£:êQfÆËDÓƒ6ô£R«v‘¼ßŠ‹é² ˜xJ(&: Ìœ}¬›žžêaC%Úx±u¸Ô-+ÕkbR…«oT§ªØLÇ.7â2¡P®<,HÃ\p7‘ä‹;òhóeÌ*àÒ’0Ix­ešà®{*Ù/š¿úYíöˆ.Vð0ã—L2PŘà”ÎK»ÙÈéo¬‘2å3|ªH‡"aMîº"Gÿ±(2Ç?@HX Ûª´Ž¢pÜU‘[” ÙP `c)]#2ð dl¶ss×G–o¹á›!:Iîpãúá@1üÌH¼eÏ5÷£‡æ¹GwÇ :gÆ=)žÉ$Ž«›GÛ„gúÕeb¤IXX{÷õ›?~ø@Å?ýž ïß}ÇM¯ß½áÒÛwoÿîAs‡‰t9pg¥ôh×ù3‰0¶žnïó„¡È¹»glªQµF6j°Æª¹­îÎèD¶xÈwfœ„ir¬‹GÎlhLæ;U$a–ñ#ááÌÊ`¥±J0C•‚Ò‘*‚ .Z@<€ùA,´ä«”¡zæ­™iîz?àýbì·O‘ˆ0²Ýú a„´NéÞZßiNÐXMFeXæÇS1ñA«ÇNív#QYÍûª¶~"¤ùäívµO²$š0%ƒCG’œwõ³æ3TÓ!Óú¢\– _G†ÔÈ+j™žP<¤Ki1(`Ø·«æ;ZHˆ3kˆØl5†®ÚD€²p¦ƒ[‚Ëö{œa#l_g^7½60È”I«!ÉŒþiyt©Öå–u`é‘uîÙúÁì÷QÖÅ\F>‚Û\ ®˜À8q´‘Iž#“” ó~êùî§žý˜$"ŠÃò*’ˆéçê‘! Kqë[NÄèsÐ)ûWˆÇ%–2!çáެçŒ_Oò0-ç¤Å0SDs"HÀ¹i›e£•a[fâÏÄÜÃè¤èÈaÃO7)\Ûƒ W¡Þs4WÕë8†(1 èôèÙízpó’XDNz$&qž@F¬Ã©ÇsGæ…ߎtD44hÒÛ€Cƒ'©Àky{Øàsƒ1¯WíÐIf&¼uÒûŸFOHŠe_uõ~h;ÿ©œn Q–‰Q–±Q– Ã@ß]KÝ ‡•ÐÔ¯Gh6¦NKA¸Áb4p˜ ¥ñÕ[š¸ŒÆiEO†™Èï§’ta?f&½Ã¥°1«ô9<¬Öׯ‹ýå€Q€·Î);RÁ!Ö§„=²åúWܱÒ;öàë_w5ŽÇRryZ?ßâÉÖŸ,’íÜLÇŒ«¿4²uÄF«yFŒø3eé¸óQ’ÃQEî±*12¨MZ {ƒF6¦üÇpE(m”û¦GSHú{ØËDda‘¹o¯‚œÛµ­‡1á"Nc/ Nø2ü—uOâÝGIêËVM þ– ovd§ýÊG‘âÛé2 äEdŸŠÙY8v˜ O'äÁc(fŤ ¼: Ò´Õáÿ†´üo#]^ƒtyiqiqiqiql‡O‡4mµº éU{€;lÙ×+ÊÛHöÉö¯¼"ÌË#âd4•Ñ`2Uì5ø`¯©Ê÷xqÿü×ÿyã%^†Àƒfq†$yб˜C’þ*’\r¯ü8ŘÍûU•žêçPŠ?~JËÙïEË8Ñ®ËhŽ©&ÿS qršÜžå†zjQôQi ­K "ÛÉuC¯›y€êQfˆ9±;q&´võãÆ,´ÜPB&…—øüšÏh(2“†±?12†÷g²h˜šÀ€Ð‰âÇgèI2M§É´¨> stream xÚíYK“ã¶¾çW°r¢*B€›ä¯íªu6vO9‡L‰Ú¡M‘c>¼³.ÿxw ¤ ´q.©Ôn•@ Ñh|ýDOðCÀƒþñ ð? vÇà“»àŸgXåÁÝ–·ø‘wû…¯Ûz<6›­âi¸/û]W= m׳Ϳタ}ÊÙÇg\ÂvÜw÷Xvåf+U7" Ç~€/™‡›­ÈBZ*"i{µ -íè`ϛﺲTQ 4±/†ÂŒî#.k=ËÃìD·$ã–ÇL)-hYìP¾ÇÍ6r:5Ixþ¸Q2,ºªx¨Ëû à p¸YÕ#"1ô±èÍ µ3íÁÐhÁpâÐÖu‹'½¯šwf ¤:íÜ—O™fOÈmÅä©kA”£ùØÕEßëkEî…z䓆å®BÊ=ÇRÇ1±‚ÁÌ Vñ&¯4+®XŽø¤LešÝÛ¿úù4§LpÒóßÞœ¬vü°8Ï‚÷–ÊY‘)Æcú¬ƒo‚¯õq×ühK’3•ë#¾ë^õÖ §R¬IþúæËO]â-Q;0­·ÔæçØxûÕ®+Î?êœñæsöÓ>Ä-Gžg°8]zÙôuËÕ®ex™OMY"l1ÆGžµAÿé¶»¢·óå0”1[ZY3®&‰NËYœÒòÊ£zëI½Ð{`®ê^æÄ˜t£˜œŽ \0%à7c*ž®æ[Å<•[Àˆ´´5[žKHA‚Âò$(ŒÛBPQ›FGï#Bû`8t¿Ç•8,ˆ¼Ò$Cù®Ä‹ÉȆøt[ÊÆ¬p³£höörÜ= à˜„oiuö³…ÝŸ±Á±õy‚¤ù£÷(ÍÅ9©ºê¤¥•O¿îˆ‡«Žx¯ë>œÂyïTE€Î1®¨k3èÊcQ5¦x ²ÒÓ\„!\ó¡+I†ûpÔZ5.ÝŽÍapÕkÏLÜÐ!K“ÉÏ¢ˆûú«eBþiøŒ?|J &lØþçLˆfv™û£Yn£ß"±ˆ3õ•fÕ$¡r=ù–ŒwÂð•.ctpÃûÙs܉tÂT(/>'?Ÿô1“éExªËZ„ñ?a|" wÈ.!°ë/0zó£P—Èbå.û«Ø·#¤„í|C›G–^²6NX’®Ô•,³ù÷—!Kn`q2y²œ³h‘™ú« à÷l__`ÄruGå¿ãŸ_º O2xqY“™ŠÍ ŸVW”`,VEþš^ÓRžTy4åeHHȳ<,p#•j È×ï¶Æ{ZJ¬†Ê¼¸ë±4ŸTcçÞò5ç”Mò¹[€“³•‹=áêÜõâD°,žïç ¬P‘r ¿Sµ.KaiæT‹ÓKé„ÙTÞ:Ù9O \‰† 'ÔE˜`y‚©7ßs®=|€=PK.  ˜æ‡êG¬¡êËâP¯Oè¥'á8š²ÖQDÑ%Ù§ÞŠ¹žÃTþ¾>ÎÂo ´–˜¯uÛ¼¨o¥MÍ!,§±ƒ‚ƒE—ˆÞW´Òš+aÓfP<‘UtBE•«3Ö‰©¹Ý°†AF,µõàM»?I»ÀÒñ­² LDhPy†¢‹Iôk¼(vtNl!A=·‹Mý–ìBÏM¬¯Â #Ëir§W+gzUIjzUI´zÅ«|ݫʨW+Üì8Ó«Y6—|G¯±ÂKcîU%ÉÅ^U–^`…ȸ­*•Ï`LW6¯ØÄäiXÐ1}F‹öU¦†Šd1÷&k§W|¯êÿ]Êÿí.¥.΢éÙobü<TÊRùRlPéåBHòì²UñÙéæ[FÂ}˜‰k:A50JNÕbäk\ٛ鎗…–È òÙѬ݇÷÷ýcu~‹%δ‡%0 -ðö…çéÜ¡Öådï±™–´ÔÀ¢›òu#Îíõ&¹8f6œûs?¢}âÄ2’«Ç뾍Ǯìó–rŸó.48WzAi¯Ð'ÔnÁA‚`m¿îóÈl3Å®g5q–S€L ¯3¶’ »ÚòØV hD†û¶Iš²Ìü3-õ׿ùŠkÝð endstream endobj 529 0 obj <> stream xÚ¥WßoÛ6~ß_¡GˆXQ$E©{ÊŠtèÖ%Ûj`À–=(2+°%W’›¦Ø¿#ïdS¶œx€y¼ßw<žƒÏbøãNà?ÊuðÃq•2ž“SÀfëÜÑä”@©²È¢ÇqÝt4kj:Õ=»sV<¼}òFdcZáÛг{\Ò¢Á¹æñàa$­®/êÒ\àgF• MÙW_¬„ëý¶†•¦&1S”6}–¸Ù6Vò‰È=ÈÑÛÙnõbêpÙ¬¶ëÚΜý2ëE[àáíŒÍ")S´êð¨ Ô†û-]B‚.BPæ…\V«ÆZ}ªê»”X¨ÖEß½uú®æxMGÉÈ5ƒï(ËXª!pS%*Üàp}ùËÕ±3$óí ™ ‡ßoþ8Cø‡w7„Ç™q–H?µçÃÕ ømm1mTݰnúÊÌÄeä±`|¸jõ„±œ MÛ®è]-èü1Í%Ì*Z«ºn\ºk*xCº‹]º‹ƒt—Þ½Ž8O˜J&ã­Í×þ ríGž ‘;™ƒZF>>-ÁÈí%p·#u·ƒN-›íjsïvC²w]õPÊø‚¤Oúv ÿØk3JøÿsTÿöwûû)å‘;ìøv–[ tHXâ<[ÕY¶ZâíD]9ÏÔãY¦öUHNT!—j‡ŠçTaH¼;coöÄÆ™’$1<…‘Èó©„UwOd{pÀjÓ.ªºXáŽCdÜ6@Ñ•<…¢‹šypùçI®ÇÊm­šw8¶\SxÜs^Ø¢8\úõ$¶*£mòáɽ‡Sºr–ÉTA ̇ýÊCÃÑ!%g<Ê#Ư½SflUÔ¡Qï0Ü$èe^%ª'm¥ž fGÜK>U?eB¾I¾ÏO˜ï¨·ÓÔ )õVbL½Üõzý¾(:êa‡ã‰SÔ'š%â…ç Ýç5ùpšúŒIþ‚*˜%©O½äcêuþŸ¨Güº¡.žîåÿ`~ öÄÓ «>¦>³uÍ1•ÍEªÚ³ÉCb'hV‰{Z¬ ù¼5à4~Ý·Íg‡¾Á1Q 'E{WA-mm“/óð¡-6ËAûå§wœÁwª,íÚØ¾-üJ0mw×Éñ0˦m åvS/¨ùõ™Súè廲£äñ¨Ÿ÷UŠI}Ð|+íÿÂQ~ó [û_8JSר`Óu¨°Bý4Ì\ª¨Y}K–Ãø)¾kQGg½æìªîEK‚n8Ä1 q´5ê£Å¾í}½Ë}½É™f™óÛJ)§ÛJùZ[9¼fò‘Ùé®RÊ¡«”»®fÕnüB2åÐ-FRëðÒ]´g8åà‘ÂSµÇ®¶¦4í¬aû™À/ÉÄg î@Óš]KhÍ!?~üõgd©m¶½ýÎF¤Œ*¨}Qª5Ër§WËAú·ïþ$?+ï endstream endobj 532 0 obj <> stream xÚ•™]oÛ6†ï÷+„]9fùuøq™vi‘ÍÉRÄP4»pgu`Æi“¢Å~ý¨CY‘hª‡CP–Þç%ùŠ”íæK#ÿDceüçÍMh^/›Wo]#8óÜ7Ë»øö¼}ašåíÇÙÉUxÜ®æÊ©Ùî.µ·«çU:ºæB§wõlóν[\ü‘ޝÎN/Ò»w»¯aõ|ô÷ò÷ˆƒNó:"…ÈåçVl¼d»ÝI3û¾yø§=efëÞ¸d'¶«Ôt®âQï*£«Øv®âQï è Ï?=Í¥›­o6íõë§töùs'ô´ ë½@ºøñëîÓv°Oó}7Àn¬Z¥’Ø^~ûô´¾yÞìº×××/c«têL<}vqÙ½ø•¡üÉ2Í“€ÆÅ©18pÜ2ÍÜrfÓdÅ€Ô³-¶0 -º=p©±©Ñ%GÓü®ì.¼XŸOÖü›jþ:^\mR‘HEw“*›T jÄd*zJäœS²ÝNO¿MʪTô-5†íêߎŒÂPQí³»àÍÕ¤IIjR±«?;ŸT4#EE*võgï&»\m»nÝïîŠãŤfÙÛn>ïíòÃÑkwW^žjßÂÙió>V“®ïGa}}z.&µeQhqÙ‹ËIq5×¼“w´ºêÕÕ¤º©‹½º¥Õu¯®gç~äñÀˆŠ^¨R³ÕÕUj÷)Yœ¾ù³p³¬R5Í>ãØ-Ñ š—̸MR4Á ój€Kx'¸bFxŠä Ëœð:Phf ä&füÔÈF· ä±Z%0ó!÷@!…`Θ5 ¼’˜ù› ˜R2' LU3´ 3r3V[W`ÖÄViÌ|ÈMPL­™Õfͯ3r€Vó?"d0ò!÷@!a LY±Ú*×F>ä(¤µÌˆjä1ò!ó@!c0Y›¬$j޹ éýþ»æ1²X;½¥h¹ ‚©ãÇJí ÌþÞœÞQ´Ä¼‡Ü…”‚i( uM7U›÷{ J2- H¨è¥Æ¸‡ÌEÔŠ©R|úíÄÿ$?€q¹Š š©Q~\ýb  æ=ä&(¦&])+¶jm1ð!7A1­aR˜5AÚcàCn‚b:Ëd™§SBÇÀ‡Ü…ôŽ S`Öl' 0ñ!7A0ûØ“³æ)$f>ä&(¦l'¬À´· (Ì|ÈMPL%âƒ2׉¹þ2T$iLzÈÑÒðçC)]û‹ÛÜXüò¤%½,kïùù\3F endstream endobj 535 0 obj <> stream xÚ…UßÛ6 ~ß_!ìeÊPë,ÉòômØnèÖ¢×^Þš¡õ9Jb ±SÉ^ÚbüHQ¾¸wÅ`J¤ÈäG†}d’¥ð'Y¡à?e͉ý²f7·2cRŠÊ¶Þ>‘©¨r¶Þ¾ãZH‘¯)•áûãyõ×úöÛš}dBW%»0S‰2 ŠœX®EYLÇ#»go\b‹kû×U&ªê꺪Dª¾çúj]Ÿ]ÿ°Jtaø?ô¡XADÝÑžè°­‡š¤¶£ïï/ïþ$i×»S=€7·%Cïi…á’OaŠïþsן}ë§lâü ”ב’yÛ «Ä¨ kû>@{¨6áLØ Tþç»g$D{€t¬÷>^6}çãus¨]|²ëê“ݬž/ÀÆ—ÂèáWëמ‡¶ï¢©™™J#ªln¾>@õ²¢ä®‡¶³ñÍW)BƒeQÐþëÄ"”FdÑ6ØyrÿØ¿µ08z[S&È »†„>’ÔÕqùÀÝk& ~lÀºPd]ÉëÓ'j¨¤RÍ6¾ƒmöÅ+Ý43.¦Ð'¦Ôü5Du—ÖÛ"…âÀ·La7BÏí@Ù'†=7óÞÕ±¶Ö9ZAšŸ Ÿz÷È㦹††C×wÉu‡L¿ÛsÔJ•8=I^¢¬B¨"Ÿ¬ßüð/ynÞ endstream endobj 539 0 obj <> stream xÚ•YY“ܶ~ϯ`å‰S¥¡¼ü&W"E‰ä¬åõ“7•â±;´9äˆ uüûô³³ÞJiK£»¿>€ >*ˆáŸ òþâàp ~¼ ^¿-e"m²àö†÷*ŽJh׿…:Jv{¥~ê§±é¬Ûíuž†ýÀóÐC# Ö¹¦{dâÇj<Þ ½ôNÈ¡ÂÚ¶n÷ŸÛ¿åM• ”ŠÊ4•]Me¥ß5R´o¾ïv0y¤mâ°žcÓw´Îë·i€'K\@¥Qi‚}’FiA‹¼ûpó¯ôMè¦óZyØ£cÒx´²†ŠW‹”iT$pšÿÓ¯À[‘f—Æa¿KUøˆTR„"©‘¯­ºÇ©z´×—%Q¡dáÈkMñé4†GÑ Ø&*sœ—äy”{˜­ÍM–¹8Mf¬·JŠ,*J˜“EINsވ̆©µ¯P1Y&)Ø24öuhÆÑvÜiä;[·Þûõ•ŽÐr°~5X°.B×·_v f[sÿk3¹…ê¦Eë2üpóúãû™8V]½¯Ú¾³<8¯4x+k3¶fm>¶gྡྷs]Dq&Lw¡³r‚7„…"´]Ý|cÒßîv¼-œ‚)uÏß®y¤³ ɯãd#|‡çüŽHÏЇêtGȽ õææ=7ñ£h·OaÊ?zœÿu‡'úBÿ`]äÞÅŠðË.MAÉM?9Þf°•ë;Çë±j¡19;pëTí’ÌŸ‰NΜ=Éea'tY’)f ´ø®LBrAêf°‡±ýÎ=„ˆ)Òðظ×G܉ÕùÜ6‡Šü”¢+M”̬›žóˆ]*gyàh_»£´QR/²Lž•¹:8[bX”NáÄî04÷lêši¸3~G8.¶2@…°…g¾=Zgy`»j Žñ¥©-ªn^裪ƒ ‘–i“«FgeûHà#‹š#‹NKˆuYªÎµÕØW QªôÈ~Ũ4™Á±&:oúã|‹Ëôþ¿è Ò\ ’£ApdøÖñð ½¹WEÏÃUÇßYA]ÕúÉDÏXó|ÐW·YÉçÁŽî©¡ïBûÍ&8û­ž ª—Õ9ÈJRPE”jš{ËÞb6N0ç-T ~+æYddò±C`&JO“^ÓÚ©öéÒY gU˳ÜhÏŽ=]놎ýÔÖÜü²½0³"8©øúáÄ7‚qí#®†0Ò¶cXL õCm‡®+HE×PËlŒ¸7;ÈÊ `´¥x@ì‚»óò±ßZ…_ûáw¦Qâ±ÑµÔ˜è(ók³yb3ƒb ô+¥=0 ‰‡™SŒž˜Ûa/ðBTj\²‡Ææ€:Öa]¹q€rbfýBí° îpjQ™¨ÎÁ 7Ý;ûyBŸÊBJ õà%/êõ©ˆ´U“.M–-UvG¤pŽYWt©Ê(+Öº4©ÚèÒ¤ ¦ÚñÐáØ—xÈ|àš¯0ÞBt:#dÿ¾ƒ0LÄXôˆŒ~–hQEi¶ÖâÃП°Ìɯàã$š»XR±B}¹…ÔÖʔίÂõVVmØTef‚ •_Z^eëà°7Ôß?0gg1 TH— tZ•lpÚ†B‹*ȺL#ÉŸ„¥Yw9o!.¼ÓHóØõƒ­Ÿ‰þÿa¢¡:L§Ù!PôÜ힃É\Þzoݸô&Ø”º 2vê¹æKüÎzÆŽL£#ý©µq7´ö ˜lSP²ýéøâu¸áÚx Zçôƒ§’ôÄýñ¢òB†0/Zàíì°Žy¹G]¾rØëŠ—ÌÍŠOõVñPoûìÆ½Ñ³ ̽(i²N¥ÄÙ3#ä¬öÛ ôÄŒ²†¢_ à(d=6„KÊ&Áˆ/ÅÛLý °ûLNÞVžæ†Ñ×1ŸƒN5T% …ã{ŸrhªûÖ2ÎA¹«yªÄÙ6£mN¨Ž\9 ÿÝ1‡w×xv×x®Ä6ÞÊJžýÕ×nróõÀÇþjœÁ&LþvâÃ>(ú$™àT¥/¢êÇ©iÙ¡S%{aãÌå!èèÄ„þþwòþÃxa¶Ü¸vo†ýþ~;îPJK!.aèM‡u…”ñH`—¦õŽ>eq¤7¾»ÉņXÌ«ðEtÜ–äóݯ„Ê2;+s3á¦UÒn±¿ñ\¼f\sm‡ÓÝœ…öÚíÒ((¥Õr»ü/žéŠªÍê­ÀÇÙ½1&Ê˵å³-ÿ ÀIŠ'/ÎÉð1þª¡ãx)›.ѯfô{E«µj•Z;0Ð6ÒäÔ·™i¿ÈísµtúÍΕãB 'õ‚ \SÕ…óÐ=Ügu$oòãî"”/ç§p¸9ØM~ÀŠ“¸r3ºyÇÙÓ¡¤®(Pý!«÷¾½Ùe¢gü:Ѻ7½·°I¤2ÇÆ ©€´©ä ÐÝTr1†ËsƒâÒ3™•¸Hf§Ý0Ì""uã'8Šñì’2|RûO}™–rÃÖ:ù ¸Ý^dd˜»Ic…¯–9Å&à¦Å*àJ“Ä¿žbýÈïñVíG–'èÚÝ’ŠB­·)úÇJàÔ džÍpšW—°mm¥é} “Œ”1]ž;ßÎºí¥–/‹ÔBWX¼ˆÀ·;|3šËF+Uc¶¨Ä_Ôâ?½¨)(ì·EãSÁëýO®J+ß:Y¨¿Ï£rµùêîÒ7@“«’<2 üÔô.TJvà’ÊxóœUnF×7hÇ$4/²Úa .húaàâ–ž°ðy’šž3?š‚‡Dº 2_"»÷<’?sŸ¨šVª¾»°ž,×ö mÃrL£[~š.…ֻ݂‚/ó×p|:\¿Ç!ó’(at~nÀåìpj:)¯½‘àjìX&|ìçó=½ qŽók÷çJ…"øŠœY1%N*ò(™ûmðKð³<‚g¨'/ø‰€,ži%Éöœy󠀺:ã—ö(Å×oGñúÉ'SòRÕKM–¬TÇ2i~ɧ¹!L«¸K7ÿ‘I\2Ÿ¤ ñæãÍòkD\¶½Ý)_Ÿ`ŒSS†¿‰@!Öþa2¿YžÅP™’GkYŸ1Ãâ-?ÐH$9L«xh Rºûˆå"–I‹XF‹:€ìÕñÞæó ®OöÁ2í_™YÞµj%è`XÞ÷T7PÉ7÷ÓòVá͵ùµ")3û,ÏñWJ©¹çþù/ÿL^ endstream endobj 543 0 obj <> stream xÚV]oÛ6}߯ಹ˜Q$õ±¬V -º¥E»zOÓ`(í‘%•’›Cÿ{/y)[Ž (l@¤xyî!y¯È'ÂH?FÒþYïÈ‹%¹|™Ñ<ÊÉráí$dYý\)w]­!ÏxÀÿ.ÿ´œ ™¤¹FF%wŒ×Í"q u-5Î!â^+|Û™vkÊvŒ*«»v£R5ö˦BLU%¶zµtÛxÂÆ´~Ýtû_°$êeÓðxÊ©L J+Vmÿëºk+‡¼^zwþzåf‹þ0°‹æ©å ÁhÇrŒ˜É–ç)S“„Œ¨ˆ“S‘;ŽÊ²Âqˆ*é†îÄÆóÝâ9CW2tÅö‡Ÿí~p1Ûöã13Éiö æ®?³›RÒŒyœnpÚQ^Ä›wü«ÖìÊqUØ?þ{×9•ª©ô àE± 8øÖ+îÛzow{U„q”Ó$Úйc Œ]KUtôØy3’à åþ¸f’ŠÌ‘.Ÿ-B‹Î[‡ŽÑµíËàÙ¥ã6æ4gû“nÖõ¾RÈøµ*ÝÒ¿@Æh.Öúö29‡ÜÖÝÝw\Z7ƒ×Yê¦>·º*óéþ @Á<+¸.·>–º»rXÎ(ϦB-n0eãq¶y5ŸÕ/.áÒ WóhëGŸãÃι†ë9('¡ŠÅ™9«Nh° «²®Ûõêþ®ïfL\Dœ%ÚŒ°‚‹©êÂÍþ3_nì…¤78Zøñù0—V³HFÁ¦3àÏõP)cÆU¯i ¶[¨Õ×å ›-¾@±Es1 ‚Ô˜äSQÛÖ^[‹íï´ßÄp‚B)_çÑÝd«÷à°Kɶ±Ñµš:Š”FéT•5øL;£y6µûËi½¹“Ä’̆T‡$0³÷p™÷ÆËŒ¼ŽÙd_çùpL۪ݜäkÈ÷ŸåyFî-!á)•1Ù–¥4>ôkò¼÷u:!ð=’f®èÅT@N„ ,=-ÔˆMIš‡M¨Ì-ª> stream xÚÅVÛŽÛ6}ïW°Û9ˆ¸%Jb·íCmv$­ûT†lÑ6aYt$9 È¿w†¤,y­Ý,Š¢… ˆ—3·3CrÈ’~!Iü²Ú“çäú§Œ„ ó5lû8IȼüûýT앜ùQylöçüg@ó:äTÄÄgœòÔH¼®œ†^·U-Ž˜'O:̲´«‡FošboWY”½×3Ÿe^)+»ÕÊU§tm7×vyÆ Ó:Žýg§Aa 7í±Ô»#ÝëÒ@oç.þ__¹A³± „@)*ˆxF™ ~Ä(ÏŒ–xF9'2¦!JR4êG å‘‘Q›Z7ªÞXwË¢+ÎãA~/F”s+†‘ ÖÓ#éË™é‰(yEÕɦ.:õqÆRY';°=ð&N¼´Mòg4â缺‰œó”²Ô_­®¬­õæÜ€4/+錫ºíŠz%í¬¨KÇBÀiÂÆ,ж5ª¢È©‚Ø8º`¶ÖG‡aì-‹ÚÞá ˜Óvõ$7TíóhòÇB" Î#WôÒÍŒõë3Ÿ³Øƒªm¡t]áœ{/®<`YD…Å~£êUu,¥•ø®íJ¥éö‡†TðG€•Z>@&SÈMuØph:t¥Ò9? UçÞG­Ê|viø/ˆ>èY`6\,{u¸1à(¤Q6¶À®)jÄáÍ¥ZgCIv7—A€z»ý½ý ÒTo'¹—Ï&”fGb†EQUzµ¸ßµ‡ Ik¼˜Ä³€ã/«Ühi·¯†‹áÊ-…“©µÝÍ _;Á9ÛIÏvðÀ[àðwë܃D˦éÍÞ6nìX»HÑ«¶‚sŒw.XoóúªwîØDŒÚh,rĶ»>þe]ù|Í“,áÝ1Il\M’þ|rø¿EŽqrš›äYÜðKnž® ¬eu{FÍÛßïîþ§zqþüåÒS°<ªªtçvDœñɲ@±Vá›ÿ)GЗ8C<¯ÝàO'ê Ûß!ùÐI7zu÷nñæõ»ZÉ´>?e½gçÌ¡HÇaª¾µ÷{ຑÒÝ`/;ºÀ>A¿<ݵ% b=6ÎÇÀ9r¡íóåËÓ?R¯Ï^FxY?‰ŒÜ£@¥Ø íI˜AÇpšWä7òÞu] þ1ÍL'Éh dÇ4|ÐvYlJ2p<1Xh³b¡g;7ýK2Ï~…‡/ Kƒ¡ýÄÅqw‰óû­2½Ãö\Ö½Àe?³_ÓQà*髼Tmר¥ëKŒÙJc–rÕmûÅ¡WË> stream xÚµXYoÛF~ï¯à#UXîÁ }jÑmiüV-ÑŠT¸TTýñÙ™åa3’S4ˆî5ÇîÌ|ß®‚÷ "ø'ƒTÁ_löÁw×Á«×ÒRŠ<Žƒë{˜_ËHäIp½ý3ÔB µZK©âð¡>¬þºþ9øá:xgÁ)ˆs‘'&Á>H´ÈRß­ƒ·Á›ã"6²?ÔÏg©ˆòQq.…Ô—‹XqQ×íj­e¸y¦_Ê\Dj4 •QrÉÂd›8½³0‘šðüÄ›E_ÒP¿ó®hl]ômGýÓJGaÛŠbS:_½ÎT{skoOÅ"N½·M{°•õ"§B2Ð_DZˆHâv‹–Wë¢ø5váÄoÑÑÍ-ú~h«íÍê›EHÌD¬ºïK»éªC_µ ¯§Öc‘›éòkܼÑIصǾjü6g.'d9$ž÷vîÞ’•(YÂtâ*u'nÑXJGŽ_Š~÷{×>Óàìi¥’!bµNcÞ„¿¶=ûÜïŠÞ™‡ %”Z`*`Ö®Àä±î«CáÕ*¬ÛÍ}ÐZ‡í=~ ‡N(1„Û í {$ù;ØEò ï*s»Ú^Ñ`Å*›¬Ø¢{\e:7«…ÀEÓ üQöÇ®±/Ž—ÖÙ/èäaÇ \§ ÏÁz[5xˆ}‰9'ßÒ,ï:ŸïúŠÇvÕ¥v$cwí±ÞÒÔäòðhK+Î+8°Ç;[¾?– ªïi²=pW¬9j¼»!h˜µVÌ‹ç)øå‘0Ù€~úè*›Àõ/áßhçzÝÜÎ랬bÝUSõ è§„”íR&Bš‹ê§ËX?TÔ–ÐŒ VE]}dÐ;Øò¸m׸®ÝÓPƒ¸wܯ(ç+Kć²àay.!G0Ì> •6"Î B!¡GtøÝ»y •ؼ¢vÕôÔ°eùe¡2¾•@Þs¨6°ˆ”Â1 Œ¡±d¨ Ï“™8 ]YÆaE&.D81†Èu©BQÉô#¶‰ñ6¥ˆä´G@F@™î´+;F@FŠ®Ø—ˆ0 ¢€ ò”7ˆÁY8• uZ‚ˆ›âj·µ4d3E3Ábj„kj<ÌKu„#k…œÅý[8ƒÈ`eLî@Ñ}]„¡q&ÂŽÛâÏ ±òdè¡Tû}¹­€>êGrè¾ER}¨?¸ã=Í>ËÓµ‚ƒâit_ÈÞ±ÖM¢$ü‘ýBøþàþÇŒ0à„­Ì–,%FÍÐïÊÒÈHR0ì[WqEíT§áO,Uõ4M˲°iywï(ÖD’³¦Ë›Hêr3 QB“ïSJñôn!I™»íœ®eò›ÌòLÕï“!‘B'/Ïn`Ä¢æòié+ÏÓNb¼{º3—éN'Fdj¤;î_ »‰3t7èf"» {X5èîÊb»@w©«ÐA»TR$ò¢úqÙè;]î·e=#=g–îÿž=´1 >´Z#/<¹õ“Ùÿ@t&ÊñDìû9Ï¡·û<8Gt¸ ±àfWt¼à¾ä~F…ïªÃ—¤B5)ð…Ú€tŒôœ÷¸ˆ;‰PžBìʹó¾íö ©’%±ˆ/„ñ)5?¹=Ô×žß ºT€Ð Ð8š÷O)\÷Î^=Yháúámü¾˜¼Úª}8CO‘O½ëm?‘Ðx>w™IµÐÆ£=T×Ò™‚fîBÔYÐbÀzŠYO¥ y©Ü½üpìiŒ’ƒ†¡ÞÝM§¨§Íx‰!·'`EÖðÜHµw€,Ó¨kÚfý±ìÚ+Nz8õŒ7Un¼™ÜLÌä1éAGÓØ ŒÅ©‚§_±ßÓ¥‡FŠ%Ù³&h'¹+ì;á¢kÜ…CåoøÊ~(纊®ÜâY¨_ïš#Ú —Àš¶tƒDÿé*3IÎÁ£›ÐÂ;ÞÍQY»¼ÇÑ2Š™[%þ—ç>9é.G¹ÿ ãš3žw®ììqƒ¿;Ük¬f)G©ñ†áÇÁÀ‹¼ø~ÃÝœ*[ÒÌ’p2ž®“w·r7^v? §¯zÚĦYYO~³0C6Î/C³Â´‚Ô\')ܿ魘E~õ›¯þs*†G endstream endobj 553 0 obj <> stream xÚåXÝÛDç¯ð£ƒÈÖkïúC¼!¨ªJ¡Ç‡N޳¹˜:vj;M‹øã™Ù™Í:979Ðäý˜ïßl‚÷ "ø“AÃT»à›»àÅK©)E¡up·ý¥ŒD‘wë_ÃDÄB/–RÆ:|lö‹ßî~¾» Þ")òàèBäÊ2di° ÒDä™›6ÁÛà§žˆ•ìöÍÁy&¢Â .¤É-Ážˆ÷¦\?‘,e&tîEËXŠTÞ’=¡báër,Ë$ÓáŸô±Úì¨ly0öe;4åhhêYSu×Zã^¼Ì þ‚¢¥Ók¡3«éí§¶Ûõà\!ë¦LàÌ—Z‹ˆXêv\,5ÚÄ÷{@ý÷v #‚/qø«®˜¯Ú–=lÚrgî_ÏKŠe.tbk†ª¯÷çôÔN- 5%¿ÛbhröÝa¬[ùH5|y•Õh ²‰JÂaìëöqÎe ŠÙþ7c¬˜MT:Ü/–qš~Óõ»t¸ $w• » mp4`´j:ËgM7°,Êa`Æ®7Nšus­\ÖÃZÍNDNw×S0àNË”b¡¬ÙGÔØõï†}Y±X*`úíK’°5•†²ÿ´Ècë_ƒdïħ‹%Ý•(çMVàK"«Ê¦1k¦7h4n1ùq¿kQïÓ¼Ž(GÉÊŸÍxèÛá9él/4‡;wçL‘†Ã¡B7‡ÜSRz.ïNX½åùÃô*M¢ðG ïµÍIØ™cNÃ=dg´ü*´ŽÃºé{w*ΉS†î0î+Jx3ðpºvI¦œ•¤ ‰#%¢ä„#ém‰#À†Ä Ïo ÉDÏ(9Éf˜¸!ûDu’ýhZ]÷œJA6-9\µ²åmvÄZ‰p•‹6>,4Tã¾.Wl¥HèûÒÝm^¥» ¼A†¿#Ì}@’£ùhªÃèP'šZOÈeà“‡ï¨Þòå謇}ã«l ‘‚˜ïŒ×UḭIÑì{(ák®Ät30Æ]C&] ‚FK÷aÍPÄ\sÙ‰ë4ëûUŸÏôÒZŠXì WfW WF‘ÐÅ ÌMb!%Ó \Ú«Û‹ “ü”…ë`d¾¶öâü0î#¹×€‘ï5b@‚Ž)¢©(X?åÜ÷„Úë™3RÙ–`°«É‘]œarq†|ÛîЬ=’æI}=ަµ ­çfBG…(²Û!ŒM=ÌŸ„—òú—W¯æzŸXrÒû¸{ŠƒS&‰ã²†I» H]Ý–Í\+w62þ6êy zfC bèNý@v»ß àäF'à\iH(cð5¡ž„…®u3ó „[;¹à‘ÈÓë‚'4,nó꬯ Uvˆ{ÙѤ†Â_B×J3~»<¿ópšÿAë¡ïiy>tõú¼÷°æ> ¥×ºÜ!OíΛõQ©ó«ÊpÞrx'f_•®&u«_ Ó Ë¿WìzÝâ#Ì]rØç£‚-:*øŽÂ’¸þÁ½ó_ˆ¶ÐFîy¥þyc‹—øméKšè«˜Õ'œô ³µ]Eþ¹ùf&>Zd o ’øº³£dËS6ôÃŒ95=Þ`hN}È6®„û-ö'd"téH²i„ºÍEi÷>âs}Ôä#5\¾ îx¬Ç홫?N@g+’d’HVÔç’(„,NQšÞ¸stËÑŸešA_\Xâ\:ꟾø ºQ-A endstream endobj 556 0 obj <> stream xÚµVKoÜ6¾÷WèÈ-,F”D=š[Ѧp‘"N½·º0d-׫FR›ƒüø9ÔË«fCá,’ßÌ|œÇûè1/€?æ¥!ü¯l¼Ÿ·Þ«7,ö£9çÞvç> hžxÛÝ_$¢!Í6>c!'u·ù{û»÷ëÖûèÑ(ϼ“ÇsšÅV M¼ÆK"š¥Ã²ön½÷+&3Òtõ™â,¥A>)ÎeÑ%ÅÈ)î6~ĈԽ–õ§ | ØHcòÕüãö8\9î´ˆ@~¯ÞdžQÄÀšïÌ…œòÔš»}je§+=\ÎeXJaísN©Ú~ãstî=øá¾stÄÝêUÑ"àGóy5;%ÜÉÛ•‚»Íë5ÎŽË(,_„.UÕõ•lžÏùršÇsøÖº&dDÉc_µÂÉ,. 9‘fFv­5#A`JÙUB£ ŒCšû-C»Ú+ÙàW?°ÑÊ0#¢¬î‹ÕÂa­·8ùG”ýéb掄õí9Ñ0¡qè ½´?æ59Q“ƒæÀrJbâ¥ë¢—ʬ9m”HõAwEi <'E»Ã3jñK|å±·E]ÜQ¢)ª¶jqßd(\Üd¨=Ö}Ñ‹”… éõ•ÙLÈéP•Æø1{Y×Ò¬OŽè£à5b{ [€1f¡&½)é©…Ïr#žåFž‘®PE#z¡Ö&4ˆœÁÈš›™É6‡0MÇÀ·äùâB`o–fuÇz‡ÀL <°©å\ÁW?²³vçÙ‚09Ámà™ñÕÜcÏã ^+ ß(<‘Ð?­ùäÌ•¿½½¹¿}÷vÅ9qDÓÁ9_QûC¡ÁösðÄë5+>ÊΪ٘¹¾Ù¾ÌL…Áª’ÊǰH·çräûÿq}ó2ãMõÙ†nÆãQ¨¥]ºÖð %éÜ쟢?ªV¿¤Ù]ïMÌù"œH×fT1¤4]›“ ÑDzZï5T]ÌØ$5´J\8óVæ‹P’nü$ È;€«S¥ž¬ '¢îòV>&E‹ûB)©\ZºKŒý¨RÅ£@ßaÉF“V¶>RY<\φ‚Þ»t òËCàÓP€Ë CÁdäCÁ xx€¿©xBÅ{%Ä™fSÍ›T3x(3~I÷…ÊOLÇšÍÖšý§ŠÅÃëÓâ?6޵G{0“Fö}“Fqs/#óIV»å¬a¸ÝÆ«³Æÿ:Aá… "âÏ&ˆ‘ìLIâ P£ |>ƒaP€F4R=§øz–ð¶íдù šÁ‚õ¢ËCíÆPL×½«½.ËçÅWÔZº'À±2EhYAÝISóC=jyTÐ@®p=ገr¬û ¥#rÔØcxåù„Í‰ÃæD|YÖ‹—6Ì S?I!ÁrË8 ôûþN°,, endstream endobj 560 0 obj <> stream xÚÍX[oì¶~ϯòRm`Ñ©kZ8qrç‚:±ßê"¥%®WˆVÚ#iãã ?¾3œ¡¤õªö)úRØ€x™;gæ#×ûàE^‘—Iø½rï}}ç]¾/¼(*N½»-lQ( Wÿð•P› ŠdìßôÝCcö›@e‰?tÍq¬»–f½ÑUÝ>^>õõ_^쀢5ÃæŸwß{ßÞ‘ž(ö¢HIŠâP¤…S$"«*ñ›ƒãúà UäÞ“—"-C\x{/U"ÏÜ´ñn½ŸWÌD¬äÐ×íFEþx&¾P"‹fñE&²ø-ñ3‹‡¨ïÒãahø ‡º\‹]ÍßÉ4 QÆ¥Øßvý^“©—ïs%,PqÀše"’Üj¾}n»ÃP¿ö’'Ễ<ÄQ·ã&H(Ø¿¢òñW0ìž§Ým~qsAƒ²kf(wºçÝm«÷æ~ó×5Ya”‹DYߘ¡ìëƒuè“¥}‰(â%ùݧ¹K$æ9q*•¢( þÄ´/¦økÊ¢B¤)3ŽNQyì{Ónd ùaøÐâ´XnŒ­ê–¾?ÞÐ÷@5‚1 •ÿ´n™ù;bâÓ ¢|,à«ææÍa)ëû0ŠMôaê? ï3޶‘2÷;ÈØM¿•‚˜EìÝÍŠû‰Èo_°üŽÄkúŒæãH#4¨1H…ñÜuÛO#pëÔÄ#9¢K´–b{ì +¶Ê$œÐ¦Óн2i¼0X*[66=‡Â–/(a¶Œ/’°ÛgyvÝÒ6U¤RÐÍ8ÈýˆGKî(plý´tÿ9/£ÌVæZbž{—å"tÀ`¢lw¾mE&H¯ë¶aÀ`ÄþïõpÔ -êV7ÏÐÄZ1Ê>Zºý‹};|J%^oAdwÛÑ×ô}×£¡Yèw6sK[:Õ®! t²”=+´;˜¾P%‰òÿäýS=0Ï:ótÌÌ…7™BýýÈ9à|˜R@·•;]gLÚ® È”×@J&RÈ¥äÛ(…á¦xþN-ô ¢žcT(”\/²“7…/¨ä:LYeŸ†Rßýxó^'§ð¿'Y¤">G'´ïÿœõ8¥É¢87ÖZ€iƤH6p‡?I¼ÄØØöÝžFš¶¹aÃ5lÛ&‰»ÎZ:>\r-1È¡=ßûï7¹„†çŠR%]VOµˆŽ-œn{Ò §»Š]Œqmû¨i:,Ý'q¿YïÀ6˜2•>¡å„2^A@Ñ,~8T„÷·pÙ|ÙTŽN7ŽÐ7™ªy‹‚‹#\»ÚÙa7M¨”p»n"UÁ½Þ¾Ð5‹Q ½ÐìÝ !NEt‚`Oõ¸#˜ŽÀ~$ôû×Z`’\8t¬e³M~¢ø C;£w2çÏÚõ0÷îZBW…Ä.c~·?ôЀ-,ñyy¦RæÅuá• Rnåŧ•P ŠBÈì4k'³¬r†~îòxÊ_p;yþÜ¥èi·ÿÜŒRVe~Ç)ػ۬=atô@”ñ,ÁÜí±A(•áÌúJ”d˜a¹~Z£‘óÑÏHšcUÌ€lmˆ(h‘»j¥„ÁQ‚l³U‰Pù2ð•!À•ùŠrÂñ ~%ô >ùÔq¸À©\¢ÒÛ\%…“š†“T.¤Âljn@noh°¦éóÍõOïð¯nƒ¦þmCtË;'`½ºùŽý#£ <ÃE‘Ùd¥ÅÍ8Kñ‹6&3722Ïiƒ“ðž â®Ñ©_®ÑÊšwÎüW\:4pÕ¤£eñóɾ»½º¶ýî˽ï` ×£‡‘–:ÇÿÐèö7–pÐ¥±&äþ·çêÎ|alz¬]­‘ï¶È[¼€]\†¨×3WÆØôm­ø\oŸé]2=‡ÈaT2ZÇøM+^Ãü,·yÓ£Ï8!8² ìÞ¸0W¤ã² ${Tw$Ù KH¶Ê],ÔÜûæci¬¾³7ÌF¤ðØJdmSš¢,®­¿7öÚ=CümÇ”¦24¡€Ù§«ûA &(û~c;pÂ5Œ«6Ü>ìÕ+t¨+=jZšJÆsTÔ¬O8íÇ,uÛî?¯,Ý9˰m×pR:Ô ¬º¨Ç^÷Ï”]_™þ‚¶vLq¸ æêxhêR‹Œâ¼µ5D/6†pmõ¦,§g¯%03•©H2x)E9@ä4_¾”RN.Ë-DHæ žxê´ÿmæå¢Hío¤QjÂIU&Âx™Ð #Bˆ@sê´MÈÚžI+ôß6²ÃÔßpÝu™Å.…Sÿ s1÷éfLrYa ÒŒLö“ü9£d•tq,ì€ÜÐÎÜŽŽ“¼Û²6méÞÏä óýÂ/¸$*¦0~·º¬›z¤s‹–îtk?¦+5~ç”2Ì[Lº$ÃçGâÛ^D•àhšÀ[âKwéIæøË,îmõ·Ý8¾¼¼¬ê½.ÑÇGÓÂTÇË«¤‰3†Ë¯œ”å)æ Ýä»òÉaŸüü$sL÷ Í2‘Ó:WŽúçÏþ 6¿ endstream endobj 564 0 obj <> stream xÚ½Y[³Û¶~ï¯à£4c¢$ÞÒ§Üšiz2vluúÐÓ˜¢$d$P&©Ÿ™þøîb”`[NœŒ=#×Å^¾ý'z¥QÿÒ¨Ìà5§è›Mô׿WQš°:©£Í†cü(¢Íö?«o»Ó©Õkž®ÆuÌóduTºØú¿›aYî-«–ÁZoQV™EIN‹°Y¬öê×uV®Z8`ûr’:î[¹•o¶_é]ןä¨:Mòí:†ýºËHÛŒ‡–Cw¼ÌÓ“TíˆÔ[Ûè[#olDŒSÎòÜÈ©öºë[œ•—«·ë¬X=c»XýððêŸØªV=œH7Žó´šnV’:Êéf0µ‘šúäùl„meO#Ò¬x~:´}KS”¦º4¶r”4DW°ç}/\z ¡Æž×7JüË $0ó©ªÝ+=PǓԢó¸X;Ü÷ mÔöq#ÓŸ­Üý {ÙŒmo­œúÞ‘Ö%ƒ2tðƒœ•Ü“›|¿![ncv‰ó‚åµÝ*γ|µ9¨Z¿í{y:£mñ£ÛÑ/id¤£È?*¶g¥˹9ëÍì3Em–…º,OíM6ÖtY²:¡†.ÃH_¨kòæ,E›ñøL¶½ž‡Â—5´”í!›ÜLœü@ˆÔªe¹þdbÇ â;qvßs+*–õë–døÄèÉIœOÔö}ÓžGên¾ïÏã6Ö qv¥õ4¾ÚuGëlJï]ÆöWŸôŽ4)!`Qvë o¥m¼~ùï7Ôúöåƒm½z³¡Æw®ñò›vS– ß6NÔpP@;~(ÎÒÜ:ÉBEÆK7|&4 Më47äè4¦lŸ®¢Õó «wrØ8M3–g·—ÉsXÜ·m¼ŒgXlP·m€A9vˆvÎa/€Ú¿½a–²¤°3ÔÖ:È|E#‰iBg8×ø ü6­J“À¹Él]á¬[Xë ä†Ê†L¿!³ª¶¶7¶¤±–†Î½:É#uícçö⺦¨"K&+Jß’ Îñ2¼ íÎöà¼3¶à _áãÚ—0D:üømëØÐð¢·-jN·Û¿…‹ÍFÞa»ßqØ®ð׺ï$õ;NªûYgé»ÎÒâö¾•€CrWÃh¹üÍ1ÃÔÑ»pzÍÌH G'­$ýÀ¬¼,Óû˜\¹SÍN$SH[ Ì!0å¹F(W¬ˆù¥m `®úØ]tãj‡aH´t%ȼ‹ÑP^!Wõ •ÍOžbY€&¾Z_wXK=áÖ Â—d˜‰›^!ë«TdL”K>šÜ£Y‘Í|‡&>Š†â”ž"?|pÎ,}ÙÄ–Ò´Øè;®°ƒ„ó³€ËõÄ÷¬ÇÍå "ŠÅ9÷×Yãqm¨¯pÔ—ó©ÂŽeò/Â2yY±²²qìØ%5‘|õú?Ynù¯¯þLN©þ0N¹Ðþ|70Åâ§g8­N—@}‰c.n€¢®CÑ\»¤–$žàÐÛõ[¥M>ƒM¯ >R@ÂiaŠHœ±¤H°ÞÎ)$ðÔVÓHJ?^ÂO=á9:³Â)h¤‰X¨üíU³J|d+ªÚ+OÆ P²´ð#/ 2«!p6î0e“鯸•øB”Y¸,dC°Qzczà 9‚[ØB±Hz1ËùÛT™ºèEF·\ȧ£ÂK ü ý©a"z€{ýƒmô{ MYT²ºDí€J@øXžšÍŠy%.Ú‡ Œ #*[©ÝÅ p¯‚ õ{|9ÞyVûx§§'‡ëÓlà§h|–°Þ©Æ!ðpEsÜÓ ¾“^þ\‰/糆ÂåýâÞGc¯M¹ƒêŸZÀœñ´vK…Ø÷?ü¦ã¯u—ùºRõÙ¬³txarq¸z¾Í&Pä\A VBôó1Ú ÃŒ–ÆbÙ¯H~@+¨\õ…Ã3~@¯+Åp`ªË­ ó’yĨ§È™XPNáïiº 3’_og$÷•½Êþ„t곦p\Ì[¸ŽŽSnNã-5&…ã¡Tæb·Gìqàq^ð ÷½Ô{%--2|‚ñôMäú8ªóQ9¸™ØìuäÏ8ä´ ˜ý.b¼®¢',ЬBÆyŠÒ 6Ý÷1zýlA½ˆÀ@ÈFÓ!‰‚© .XÅ—‰€æ–QÅê¢0sÍ;:Ì­X!<*ˆîWÆ ácÊbÐ6TB8_|1hm˜()3ˆ'%Gó7•—÷ê¨dÿLs@Ñ…{ÈY¾ý/_B*To\”%«èñ¿nöÏù?Lݶ endstream endobj 567 0 obj <> stream xÚµXIãD¾ó+,NŽ„ ×^5œ†a@@èašÍÁIœn;ØÎ,?žW›Sv„ºÕ®õÕWß[«“¿œäðƒIà7O6ûäû‡äÛU‚s¤s<ì`:3‘*µS<-?›¡þì:mãG7iŸ˜Þ ë×UØSùÃsi¡eM†)âÜBŠ/CÓdzºtí‘ge±1`ŸMŒ8ìòôʳ´èªb]—+´Ê£pͪ7 ˜‡b–>½k,vn×Öu»"2ýX5ON6¹/†ëë§ëKýŒQ”3 ÿý*ã„§¯~»swî{ÿûÏo\ë‡?^Þ-è%È0ø«§A7 µ2 é²MчñrÊ΋š¢Ê)ÂÜëøýÂaQé§û¨D¦å¦2\—#)ÅàXpþ³p#ŽÈ¹â 2§Ÿ¢²ð`ÄF+ÛØ¹¯·‚so MFŽfÆ­£õA€õ °df,@#3ïŠáèTNG§HȘø‘ÂuÑW›©[½Xtó9ŸëeWÊÿg&ž™hÉC´ünéˆÌnލo:¢i›ìÂ1.°>&‚m5ô³`ìŽxkÍÖ-dT}° nƒ|üŸ!¼Ÿ\À+nÅ»û¼»®,C<6æðrû¸r#qN¼ Bÿ%Œ|*·ã™#>òϹìý,x·Íš _Ÿ™z@Kň·Åʘ׶&”‹tp«.Ä<6æAê¼]çÉ2ŠnÓ¡«ö6§Œ<ÔÇ@SHËÛXP!\¨€}΂ÄsdnY€‰ ʱ - °j™‰ /± ±gAF©ÚÛ£åZÎþ€wÌãiý]‘9ZG’ÆÁð©+š§ªðÙeo‘ÕCu¨«v¡¸8Ńy¼0 ãm^Gô¿6^ÊJ”)Ëœ›’{R.S¡<"S.S!Oå²™ËeÓq ÈŒÚp _‚BËæNø:: QBûÚJXÎT(a£ýz†¡a¨èüÂÂM©SʱwYJ9q]¸ÀÅÎJdz^"Ó›KdŠ5rO—òöêÒåbõË®U¿Á/ÊÅ@ÆÔåâ—±(Åûâ×díizg^Ÿ,Ô¶“2}i=è3ìr%E\-œ¨ëg•ÈDÒxš+– „‹Éó¨zjÚ.Ùµ=ÎYýOw÷¿:µu-QSö×mÿS±?X­+_ ©I!¯"»P¾Ôƒ1’:U09ÝæŒb¹r;/3–˹i™¡2àc¹²øÌ`ầóL/À4 *?æ`šó|›‡iG6³bðÚÃ`ƒºS‹¿Å¨•…ŠÍ{N;{3ÝÝŸ•Ét,“C*oýø»ãº/7Ñkøñ¤2X ò7÷ïb/þM‘'`DBú™FššçjŽrâ3="H€§P„✠M1Ã1P·aí>ŠÂ´ä¹Î '2÷×Ë/îf“ÓÙ ?gŒå ­¹(€OŽ‡Ø§EN”R¹‚ÑkÇ · ö»y ^rkŹçP]” '0IPÁRþNÕ*ù˜Æí³®ˆh²?õ¡ ¡<©“wÉÛs»"V©‰aù„à ŽèT€h¦$ÌÓ¸ƒ1óxÝÏp]ƒÁ€à u(7àaT¢cu,¢€ÄIHŒÂÁºƒcãnŒ©Q2mˆ0æÈ&D\…!„I¥û9®k0Ô’:†Á¦0±R.(–â:2:‹a8\×`HŠaðeÛ€ 68 vˆRÇ8°k8C Ç8Ä„ðk$¨ÒJc1ãºV`}>1Q ë øJ£ÓˆA ÖH)°¤Dqr ÇÖñösTWPð\˜ºÛUJöˆ6Dü8…L^P’@ÖËí­Jñ°úíWÿ¨š3 endstream endobj 570 0 obj <> stream xÚÍXÝoÛ6ß_!ôeòP³â‡H {¶Ý,mó¶ "+‰[r%yiŠýñ»ã‘m+±Óí¡pñãxßÇ/ÑLjG üxdü%Q¹‰~¸Œ^½æ*âœåi]ÞÀþ’',×ÑåêX2ø-–œ‹4¾]o^þýt}Œ˜Ì³è>Js–){ÀèhiÉ2ã§ëè}ôvFÀDä„ÜwõP±ÎËó‰už³Dœb=9Ö}»^,¥IãèC¢ìðºèë’†@µê¶¡Yí¾?ÿvñ+nÚnS VÃW¯³Ù'9Ê[:"e©±ß?4í¶¯{oéžá†Á|™¦,¡#u3,–)9øƒUð(te§Û®½¦Íï.^Ò l›Þ(ïŠÎíÞ4ŦºZ|?§¤“È3–J+ñǪ/»zkM&ú4T0e¹ É/ïÀe"Óqׂ›šÊÙ³ !ÁìBú=;fÃÒÌÑZºžØ$ÇÄå®ëªf!L<ÐŽ‹§X!åÐÒjá¦Õ'wâ*ájíØÕžØÛA‘Å%Š,³J.y*Ðä%— Ó ´»Š_/2·àe)y¼ ü "nohÃrÆ—30òéà ½€Ö%íTîÜûÝu_•ã««wU±¢p”¨^(ZîÊêîL{qµ°{ATÕUiò¸DGC&åP¡¡&‹û¡«›Û¹8ó|¤]ðlÒÍX fŒ£é·àiWe!ÁP£ÌÁ ·–2KÈ—áG>˜vµ¥ï50v‹˜ECÕ0(† œ¿9är•†€s&Lè´ªY¡†RÆ÷õpG£~§õ'œ¨ø¯9§dœiåìe·ŸçjÊ– Q|û’øº¤‘O••Ö g–U6Ñ–ífÛU}_9kê¾/(wFá =“>¼`.Kn¡d˜2ïªa×5ý9wÆQÚ-¬+üM aÃÌ+\Jô»²ovkôOΧ£OøGpÁ¸8ßA©wPçL±>W]ksGÆ¿ƒÔî¾î+«DBŽƒìÜBAØ ‰¬_ÊD3†©S8ÏV]G÷…Œ7`Oqë¢\4+òø$V›¶Y’ø=À8d!5ã|Ddu‘…„ˆð ’Ýü&r¬Áxµ³d†rÃŒ:)a¤%ÀEú6;ÑUW·Ý&­WÔ#ˆM:'ñP\S±«§ Û)ô|èY„8Æn?|³¾6ì–\žÀn”ÐhÆóž˜L¼ih»öøÒU.ÌÝP­héE<œ}ܤÓ;ñdbàW{Ð#£ÓIoŠºY;nè–Vñßu¿+Öþ’.Öp°Y4ÔP(<¬®ç¢†×GK_ àécÓª´µ³z§žÐÏRNØ¡'ØJØ¢ùÆÙM[^^zÄrE6Œå L~ „)e6<„¥§! O¤„¹ù  ätø„>B¯„I0‡6S¦'™Tf½:z¯9xÕn’ÂƳ0Kåœe3˜…j•eÌ“ïâ°×ô6Ì] S)Ó¡§þÆß >DþR'<2z/DY|Óµôñ­‰ ‹ÌE2óW3†4;è3UÎLöhŸ)ûLåúÌàÚœšHå›Hé[¢u‹†Ü³ãÆ/lçµ8Ä¡ù“gø\:Ñ÷q¦ò°ï˾E^6AŽÐ6¡å´åšxM¼&pE²kj'iBE‡Û56Jp×üíÉšØÈ@®mõ\<àMjÂxPó§’tjþT¢ç›¿4còY½ŸŠtCþ^7d¸…kEßï6Y¸ˆvãâØïââØÞ­,? uvczÙCeÑ;9Nà“ÿÑ^öùy…ï†|ìÉi«êÿé:“ÿ‚°\û·¨9n9amj9r¿åÉtô©–31L賯Ÿ1ôf‚dÝJæû'$°uZ»g&O­m¶Š> stream xÚ½YYoäÆ~ϯ˜G°C‘lžë ÀZöëh±ë•?Dyh‘­ÆrLr¬Ÿª®êfsÈ=۰Ϫ®ª¯ŽîÙüº 7ü…›,‚ÿ`S7ßÞm®^ç›0ð‹ ØÜ=Âô;éæ®ú§÷ÃÍû¿ow"^ÝnE誯»~w‚±Ðëx DÞÐ5ç±îZìÅÞc×å¸ý×Ý@>qȇ‰_ÄÀ"÷¡YÜl‰…áÇÈ+J^ÐéxŒ–:¼bË‹¶ô•ôùîÍÛWÛ(ó®owMýË6Ê=fF{|}ÀïïX+~àF¿'½„ &¿ÈðÜ"ü4Ûì¢Ä<›6ã>ÞâÊ*Ø[ ?.\Ycï>ãFYiõw<˜Ã_„lvL+~’hZ(a{§FjÐ|u{ý”•{o°Ÿ€?Ž4cÙÁh jŒ°­n÷8&¼¦nÕ@ÓÝ#mÔo¸Lõ²¡»Ïh h¬RCÙך©ªhŒ{M‡ëŸüí.ŽCïÍ!bS30ò±nåH»ï©ZàÀ•uÔzKOµÕ®{Ü1$õJär½,0KÂÐ{]«¦h^ë¾JÒJ"3í—=7u*tè>hiiµ6îRriº3ûÙþÂN²Tú‘÷ý’ÝB¨Rå¾nñ¬"&Ù¡%´má\v3i´^ïAg÷ÇŽ¾u¥ÈIêG<¹ˆXoBÅ… ÿë.e¹ÆM2c‡h` 1e‘ÇÉÍ®FÑ’#²;‰Ì`ƒ–­î.6÷žúXª³ïN¸ш«ÊîxTd"­!üÚEà=jV¿v#ŸÕüQë‰wêU©*ERXÂh÷Ш#uöý¡,öa%4ð<µ´÷À—é$^%GICÖ¡=i×X­ÌvÔ'êÌûÌöÓèÀÔXœÂ»†Ýà áÕ?Ôc/ûg‚D×WªAS^âð‚6WçSS—à!¢·äC0Öv#3Ð|S¦Sùœ.ÓŒÜ5Y““Iu%}Á^gp`=:*Ù×txš8hue»ë•¬äCÃãuK‘–2 H2EwgÆHÝ„Ë\SJc&Ô‚†›>¢cðÕ®§¸‚jy¦€Á /ɽ8’Ä=r+YFêȬd°´”-ÉÓ‰p#{š‘zÇó@DÑ ~¹ Ÿ¹A#L‘ÌÏV™u-̶¤b-Œ $ ք/á„/;ï4õ»RаT"uÔÈÊ¡‹Ž°È| C—+8HüLð´M┲gd4•]˜~!˜Ö.‰Ð‰1%œˆð‹jůú('4nÂÉ0Ñ9U2RÇFó9 w†™Eõíš´`7^J’e¾Y”;¶]`ˆH9D@svB['ØÙ0LIÞi3Ü먪¦Æ{ùExD"0ð6 8±­?¼ûù–Z×ïn¸u{{Gwßþ¸bÏ]èG+. ²ê 0®ÆO¹A ü0ap káЙ™æœ^ÖhR£±ñ «aËK¬† 7uÁúö9s†‘ŸD ab½¹W‹ê'&bñ¼VYuóÔc•¾”0 ý¸8Ϭˆ±#S•‹ƒr ±ËjWÏñÙjšš®]32|ŒØ ÜsM™ÂË‚ðæ=)tª4›a”mù¹bkE5QäËj®h&õs£tŒ5"¡›(ª¼NÅdT­U.sWu”ڮݵjùÒ&WJ2Z‹{Åyè·-ÖÌÍ™2Vf 3ÇŽ’ T73é|s>¢u9€05]Qé©g0À~–¸–¹ÇóPÕðy†û-E3J°ÝÑÔÚ÷|̾Ærs•Ó«áä¿ 5¦\ú“̵c@Y1L°0Œ‘ÃÚe°÷n<^xö"*FSÊæ9™¢Ð"l¬…'ìÎ41ž‡—kƒÇ]ÄÅn=ž¥,ó– bºð2p”Í7«œ4‡Qý;A‰·¾Ìýu¼Ú¯âÕvl¦½¦Kõ±Æá븞‡„ç¶RhÚÖÔé Ᶎphj°õTN–†ZùÂX=ÛKRÒA€i÷;Š6 ëÂ{=JèB]rÉ>ŋש‡ûÀïÿ­JÅRsEx<·¥)ðSŒ ±aæž0QÑJ@7³¼°H%³+1½Ž}ñ*ô¡Ãk^Ø‚Y©DüÚr‚\ºz5 cˆ)Ù¼’ŒRá^ÁÓhª$qÊV’ØÑQ—ô|wƒŽ{\3ú|YOu2Õ›éVŸ:h£€M‡s¶¹DQ¥Æ Ÿn"ÐëÝËëe€§ y›¢uöÊÁõ¡øCêÃ8ëdJLYH÷Þ¼¥Öwÿxuóÿ¬ë?­œi}“\óëûÝ—Jŵ°áz\-ù’x6ŠbÍ· ~…ŠƒÀ98Œv}Uë×"œiéÀãã0¥ZVÌ«ØÏëÆéCµ4ÒÇ)¹B÷ÍAc¬p\5RbJ2>ÝØ×h~†8Sa«gGÚ pŸóÃÙ‹ñŠæe;þ0-²ÀøƒªZS³jßY/H—ÖOŠË¤#’>ŸK0mŦ÷Ç”ÄNã ÐZVÂÀÂé X0zê±ò  [êòA¦-ÓŒ6FšàOŽ-.*5¬êz¬=éümeƒº˜ìM5×1ìýO}aðö‰…?i\*<)<5 „ÎÒ‘È?§pÜ·Š3ÜG Ç%K…Ó¼¢†U82­ÎúÑWänZƉûiÃÜ÷²Ý×’ÓMañì>ùê35c}jj‚}4eé"òÌ+`[mCzøuã‹"ß_žÎ–ÞmY+ˆœ%H¼éÆ{G.}c‹#ºVÃ÷Q–uSôäcµRâÂZÑ íEð",ÃGN, àêùz›'ž¶rŒå ¹¨3(e¯)ɤþ( ­/üõ0ާ—WWø{9øýy„ä0øª:_]dÓ(8Æpõ7CÅ5b.P̵çÉ™ßE9Âs—f™Fn‘ñÓ_þ •¹¼v endstream endobj 577 0 obj <> stream xÚYÛ’ÛÆ}ÏW°ôb0%Næ~Iž_RNÖeYZ?eSÄÅîBE4z%W>>=Ó= ˆwWV™sCÏ™ÓÝÓÝ£Õo+±âðŸX9 ùj»_ýýzõ—ïýJpxX]ßÁô&vìêúößÅ7íî¸oÖ¥BÑC{¨[êÝVý¶«CÛõlýŸë‚3‘"¬dR‚°(åú¡êªõF]ì×ÒÇ~ˆ=U|„_¤)STŸËí°û‚¶¡Ñ-!ˆí‚Ø;!Àþ®ÎßÔ´bx¨´ ¡ÙÅŒI¦‡QÅ zWaû.Ê‹ªÜF°±'GiyñûÚè¢ìêò㮺Y³õFkǬû¸@”¸ô¡ì±±¤¹»v·k×Òus²aË}9ü5aýîU"¦:ŽA£ã:Áÿ´ÞiŠo~ºÂÆ»÷?üˆ­oùújAÁ¤†ÿ{fTÖ #0먈n³-û<^ CÕ‘¨s4\1aH·Ÿ6 L9šî  WTÛ:r\d”²1gª¨çDM?W×Tó™nFš’9?èÂ!$¬2ÒøôZ´ aßÝÂnZ,IK‚ Ó#lh·ÝmÝ”;ì4‘çã>ý%toãŒ*JZ^§%Cu_Ńižýc Á'Uƒ3¿(›Û|81®¤cRøfál–MÓ„á1ùè’,Ï´xF´¤¥ù¤C€5:žÖ‚¹0u¼P©íþ"äHusfª8t-¸Ü>ÏöCÙlI÷° _§yo¦ä7 ª·î\÷ ª¨¬¡,J„«L[àÒ46*Ó®ºpj=z‚B³òO=¥šÒ‚ºzŸ¬ Æá&2E¹;fО÷:|6 w°ž²àÄœÇ 01cÁ# .±«–Yp"³àÄ N nâ\о=& …·1p€ÛÜœÖ_•¤ÅæÔÔﻲ¹¯K²¯}B¶êîFÕÈ@òv¨OÞ‡è•í±¹W?ò6 #ý߇n´T“Kêœecb°= ”ÊzB¥²î(ãÔ(c'Ê47Š >ÐJÞ¿H4&ר õ xísðš|fÊé¦ìha‰Si£Ä2žeÂòh¾Ó[&¤@ì<8ª§ÁQ½:8Š ™wi×êõPëå¨_ €Ù1ªÅø§ýåø§G¯×cüƒV=Î.T¨Îám£+¾N.ô¾Jôh5uâ®ÏSK’ÆÝ0^J¸/Î2£ú¾i»Šî»i;4û\½ûê­kÁŠšªÙø?—ûCR»§ ÞŸÅr?1 O·=ŒÑNЂÅ!"vuÛÅ+:-År& me)H-ņfnqq¨Ê¨c'¢ÖÂÆ.vOûÅÁ >ÎÔ4†ài$…ó >G…tÎ…™ > yz Ƨ|–Ž3*­= ¤ÓÏï+ÝTÒÔ?Kæ®ÞáÀkQ(ÆZ\r×µ4þáø±¯¶Y›Qéqa¤/ÿøîÍ'ÊÞ°s6+0CkSÔ)SÜ0éч0³…„îì§Å,“ÂZn½š«$ÿ¬–©q¡ õœsÆã8\v8º1¡L0Ög%xÊeA,‰ï’(é¥õR .µwæ¢ZîŒ;ÖFx‘Ñxæ Bk#¹¯@ÀEQš$è7Üêñ`FkÍ5 ‚C9k/Ê1Äȱ\zoƒÒÊñ\p áûÜÞ{Ì#=•²±¦[Ï„MËsš-}(úФe±Ð¿¹y_•· òÇe<Æ|ǧϕùëT@ÑÑßܬ/¿\›„b…‚EBÁo%PÃ]¬TËÒ˜t’$ã]0%OFµPœÂžCÞÂ×ö3²úß%R¼`6¿s±û?–|3¹2®øêíìAâ÷´[…׺§?­Ý¶ûCWõ}~â«ÉhÞ´Íì<>§}yÃÈJf7Ô MÙy_ Ç®é_s÷<Ñ@KÕfWæ+;àssI&Ñ·[@|wÜE~‚8}ú ?RȘø¼š “ êè(iƒ?ª®M¶£ŠŸ`×î±î«‚#q`‡ŽœÞ4·Ìš©æg¾ªëò¿îìá<åýüEê´5Œ6m³Áí§‘çì…Tú¸Å²8æCÚÊû¼úç?ýI¼Ñ endstream endobj 581 0 obj <> stream xÚÍXÝoäÆ ï_!ä¥Úâ4ÖÌè3- \/¹Àm½Ä~«‹t,Íz…h¥¤ÏAÿø’Cޤ]/l})l`çƒCr8$¤‚ŸÄð'ƒ\ÁTûà/·ÁÕG™RŠ2MƒÛ-ìG2eÜÖÿ µÐ"ßDRª4|h›Ýþ5øö6ø9º,‚Ç -E‘¸yìƒL‹"÷Ó6¸ ¾¿ `!b!‡¡é6Z†Ó3ö%H— û2yòû…ˆÙï›Ã&Òyþ‡~‡f²4ütý™cß§¦ïhÖð﬘¹o݉$ÜöÃÞ¢W‹¥Ä%ŠX®JEš;¹7O]›ÑߊT]Ÿ‘¹€y”¦"¦#M7m¢”lý#JŸ~íïxÚßÓæ>¿£AÕw#¨vfàÝmgöönóÇKJ²DYˆT;‰ßرšƒ»;ѧkSQ&kòÛÚ¡ŒÃ¡{u–ÏœÜ*“BàFHr ò˜hÝ»ŒÄ~"92¬ŽÃ`»ÊÁ;ÜÎꥮ'2C?ôž°ŽÆjíì”Äð⻦B;ÚlXÈ~¡ŠÐVÍ],[;ý" ÏQjøÕ »Ç³OpF+VLëÎö éf‡K–È%² Û}¾pûT@ Òö;âêî¿xß/- †­eªÇ]?Z¢À·¦Ew+d±ã-º²L…ê9íÇ Þâá’ª*QF¤Œó  úªBdÉ©Â.TÐ[‚C–(TY¤‹8[»ÒuGô–@?X¶é0Á[¸¥Åòz±ü ®'sˆ¾ßà{ó½ñüsv5© Â½iºöi¾™ö—f<š–Ÿª3턹¸o*+E&××þÁNÇ¡ßl×[•a×Ó¯†~@Eó8„%P´ráQã[ä%[½…åÀÝίvèä‰T‡ÿòá±ùÌåÃó³òyÓ­T¡áÞŽ£y°>xès옮ö¯ëÕ€I×w©r’Ï`HÅ¥ˆåŒCÅë8¤âBr"ž¿‚D+9ƒ5õsŠ…V+æe"tú*ó™jf~DNØ[p軿þ^€çà7ÁJµê9þ zÿð“dÙ‹ð£ðÐ’ü5.exŸ€‘l$æî5’,_½ζC¿'C ”qDÙ™Æ “O^Wz=Ç3bT$ix~ܲ%òuäÔ+Ó¸ é·g‰Áe¤ÑZŸ2¦µ=†í£¸Û8ö—-©2uŽ*“/ DY`ó2Hh)ŸVÏv$‘“—Mà…#¼›Êô²E¶Å‘·­[í‰ìÞe?K #Ün:°m¢$Øöz{&ka£Wr!Ñlÿ$òä›iGõÃx„ÓÙœdá¿/&-„æ;‹‡_/¹²ó|¢ø=–%*aþ³û{D"\3ãxÜ#á"Þùqi±ê÷‡’¯Ëÿ‰",ÆU¹ƒ‡*3²øbøh5wù¶ø*ªêÌkgµ<¤ró•÷ã¹@k§O_y=Mñÿ‚™2c!2{vÁÁW°öˆÖ1#QŽÇªu·ÇaTÅËѬ¤â\¨ìYF-O¿  Hf0Nt¹€±ÓA’Ñ€„ð7#ü•)â¯óVU¦BkÃ{D{Dæòä9'gü‚éz QFÁ`…Q…>E¤7ô¹œáLyÜ“'¸§–ÄcW™åTáÃô›ëOïñõ>ÜDmóÓ†¢÷×Õ& õ¹?|ǃáñ_QæÎÑcé*ÒDkß~Ëi<ÈgN“›E‰‡rŸ]ËG±Óšo2í¼þÏï¤èN2<´Pcr™Ìü—w}óáÚe»k ò؃Œæ¬þPLÕwÓaêŽY†-øîH¤˜^ñw´¿ CK4:׆HzbN55­¡Ê&Êã$|O{­«qÔŒ^Çaßtfò§9“‚ž[xÑøÄu»:ê·óIòSLBaE~llë:aˆM@3ç9Xõç‹Ð Ìh´àBzÀºo'p ß×ZkƉ–zþ¾5ÝOÌá`*ëT(ÂoŸ‹[Ý%á^Ñ!ÓCã#î>÷t¥DÏZ3VoÀf>ˆ}'ØÔ–2@³=oAé®Ot;lqŽøÉ ñóÂùÍ€wÆ ñÀ‘ƒ`ßEà“þ”ÃO Ù£¸#±ÈPB²‹§Ë•˜»Ð~©ìÅ÷®¾AoD*€ŽýÜì#kçÂtë ªwt¿½ñÍbŒ_nlekK2Xœù¯4AÞw—Sb\uÞà÷iä ¯Øc 0¬ÍdhiŽy/VÑk¨>9i]6fî,Ûåþeudn|gѲí[Crߛᾙ3<‘KôCmnÒwL qxG‡ëã¡m*3­<ŠýÖÅõj àÆÉ͘Oý*t| ×tö"R¢˜ÛäuV…Ë—á|$°W&yhHyÚØ9sïM!öòg‡›¦õw¬¤è)ÌO#[ƒÎªÃ㟠­àÜÍ©¸zˆÕ~pßRŒÌ¢8öÕ¾N _>ŒØoËb¾}ÉJóùf@Z¹¾ÖÌËl§pǸOà"–HÜ{§i8`oL}Âò–l…[>´2þÊzâR>‘Ì݃O_z•¾æ²­]yÓQu‰¾T!÷9©]ú:S®Šàêò÷°¹Š~ý«i‘‹$c^®õ¼u`‹#ÿ‹fÅ_ûÅìø¸8Áp¦öM ìœÍ×?)cüö,Aœšçë¦?½Ë¼pª)‘@RÊb÷Ýú¤¤ Ú<(D™eŽ6i‰´¹HÕ:C§\ä€ËÜМz¤ žIk h‡Ì‡°qÝCÊŸ“³ðG–kôˆ/ lòíÄdŸ œÀªX¤ Ü Áëaƒ2vŠN}8ÎünªÆv•ÿD÷[¾Ãß­î5¤jèðwkª¦m&JD‰FŒ@Âé\›P‡ˆ¿K2t}Ì¢ààÐL§¡O ª-TBíHh¿öî˜.öWøu–½íO»i:|}uU7{Sb8Nv…­Wv÷,¨1^ýÙsY¿b¡ñš—œöäË©*0Ø¢,ϱ¾sžQzêï÷_œ>©ý endstream endobj 584 0 obj <> stream xÚÅXYÛ6~ï¯ð£ DªxèJŸ’ -š¦Hš,Ú‡n´2½«À–\I›èï g(S6½»E7-ÖXñ’s~3äâÏ…X$ð'¹„_²¨w‹ç‹o¿/"‰Ë¤\\l`:ÂN¶¸Xÿ¾|ßmoǦkW‘ÊÊå¶iM¼úãâ,I½%y+ÜW\ܘ޹L–»•Ì–·ÃH½«U$ó¥Kó¹ªÇíêt-‡Ó ‡§Q«á‘ñ&Hx™½Æ"­œß Çë‘üÀHµß+ÅÒT½•%"ö#¡â4µ20«›ÎJ¢ô²jqdWÉelôØTöˆHÌçÚìG®»ÝÎØ%ã‚­ÖÔ¸©x%I#›n»ípÕ§¦½vCý®ŸZ>_^±„o-‘ÇдŠmy‡MS™.wÍžïÞüöžZ/Þ¼æÖû÷ÔxóüUÀœ‘ˆ¥†ÿEœ*gS–ƒØ[¡öú¨®7nÆÑô¼Õœ¿DÅ"e߇•±ÊÝôžô^7hQ§°ñ¦¢k¦96ç¬nòÓH§òD-2XÜÕ(ÑMÕƒ?¢UµH½Ílm†æº­Æ.,_™Æ™•~*¡1„Q4kö‹ID«´í­Ÿ¾fp _¶]µæº›+ÆmˆÊ\Û¨…uW)¨p{k= ØÃ`f`d¨›Í!ƒFkÁl‡®ÏðÀ»uúöƒó;穯ûKäwûŠù.W„'"Ô`Î]˨pÉlöM–â'DÝ›a?!š¦…Z¾~Kc^íÔŽx0Lrb'ÇdŽSBxllŽ÷óädrd$ƒÌ *„PÃÕ92€&ÆÛáiH`ÄÐ9ìua¸ÊXæ¿NÐ2ͳÆ~lvÕö»àÑvWïäÍcž¼1ÕÐ\mó+Œæærõ0~ÚñÓv“[žçà˜mó¹ÆáalÜþ µÜ¶kƒÒš5§†ãÝÏ‚P|B8_B ¤§dÇ#}€*í¦Ú눧k¦r!IÏ`M’9¯‡Ö©&¯O2öú$_v°Ðラ-f açÍm[³n€F[ ¤É¦=ìb5”‚nÊ`þp:vÕàq9)õ]·R‚6ž•m‰ÄÄZ÷Íë**…ÊçU¥Ì”WÌÉLªJœšªJìXÌAæ Y™ÏÒX >•ŒØjZZl5ŠÓB‚wb·wNÝ\µQÃTT^P3ÅÄq:¸\ÙV»V9nЉ¹VTR+‚%â$§rdª©ñë³×ÿe=Ø|µzp¦êy ðmޤ÷‹!Lð„@勾TŸ`BY†F©LqíúuÓV[š±n2…'\)¶D1Ç]XÏt#ù?žjZšôñª2á1¯ÐS¦¢6h¤ÔUmÌÃ' ¡½Ê¸ÐwlTºùÆÓ†5\èb‘ùaм²àhÈôGÒãTFPU3ÃáxÛgå±íµ8.Œp¤¢Ïù§ƒBk¡9äÔ­p”/^<àèTÿòáŽLù A iuJǰ=2qv¡¨» RËT×®‹(¨ªþ€Kˆn÷dжúÅ%å,bË{E&c)E©½çY*«¸Â&Š2õt(Q@£f°íå èÍòô9O””3ñ;©ˆ¹ñt4‡Ÿóy"£,9Û„®œ$Ô”$ô”$ÔI’×PÐÄÈÿ‡éùàI¾Z’ðõürЉÃÕ6\7žÀ„Ò"$’æJ§'¶¡=eì„3„ÒÊf¤˜g¸¨7.›!`FЊsBæ±t(ºd‡ôÇ<œÏE¬Å[AKf~†Ðbž!òòeˆÙ5ûä í%ýWç3âáWçj‚³7ëðÁ „P†8 S‚v”–!jx‰Zª³ïÃiŠïÉó÷á¬ðŸe³üÐ8ux†½à¨})ƒ´¬ý2÷Naöb== §ºp é­/x🆉°¢){݉¬,ž¿Mžã#;¿é> stream xÚ–ßoÛ6Çß÷Wy©AÔ«0Üvígœüñê5vª¶éã‚ê®ìâìº)7~µøéT”ÒR…÷Ü/¾¯ºzöŒö*PQ'SóåݨXQd] :5>®9ÚTƒàPA£ýÑ>NŒ¡FFÛ`×£û9,«v]ç›7Ù€3˜*˜IR£¡Åé2ý×{«‚Éû謞Œ'ï1±°KCˆ9ƒÝæLL·ç*»\X‘µ °Ð,»I$ƒ0±[ÝB'º…)Œ>%ÑÂ(–Q0é}\u½ûÜûê`´Z}ðå ö£ñÈOÝ$Àé=ÞÇ÷t±Z„¹3É4.«F}¡€Êjðã&Íú¡«›ÛSée§JÇœ…Z;‘WxŸŒ‰6=;ðï«zÌEÈ00‡ <ä¨c:³½}ǯ-¶p¸ÍâDZxßP8¤ËÞ>ö•zØ ™f”›T4ßÜŒ ‘=ÔÃöú¬Ö_ÇÌþ9%ŠeTOuLo¿Ÿ:Jáä¡Å«×胃Î3§Ik ž&{°­ÚͶó}ïãnêÛ‹P;¸•Qß.h¬’G—"-™~ØuMÿ’«âIÚ-&¬+§Ò6V^K¢ßUD¼ÞÝú8vXúŒ>œqÊøËR“@]ÜJ|÷]jGdµ{¨{‚(P8¨Î-ˆpáîáÖÐT«´tʨ¬ïºpW@wû)oc–Ëæ? ákÓ69âÓ‡"šÃ~¼Àmiñw£c“õûþ!wÍ endstream endobj 590 0 obj <> stream xÚ¥YëoÛÈÿÞ¿Bè'êjm¸/>pè‡+z®È5¹‹û)ZZÙ¼R¤BR±ôïÌάHJ´œà`äîgçñ›Ç®Ÿrß\¤ þãÅz·øÇõâÕë|!Ð&Y\oay%c‘ÃûæC¤…Y®¤T&z·ÔqÔtýªÙ÷宨–+š¨¨‹ê©+;Ù¨m}Y»nùñú_‹Ÿ¯‰·4 )En-37±HòÀ\HÏÞFwÕ>|õy!tž-6™ñ˜|±[$ZdiV‹÷‹ßf6ˆx“}[ÖK-£þŒ}®E*öy*RóûˆÙ·E}çXýÿÑcØÑ›¨suWöå—²G >ÍÚÍíáEFMKR¾z-ÐqŽ{®xSe…Íü¦ïŸêf_±SK+r –™°Ú—5bŸ3q" «Ìˆ- iy4¶À˜ÿ@“í{nÛ,&;òÍ•Èå |šldØ›Y©¥½—™½´Þ—øˆ‚àÍ-ÆD?¼»" MU¹š§ÖMÝõ§«e×øxúͶ*îº+/ëJ|°—Ôa›Ù˜h}_´ôÅۺع›åsN—>ûñŸ®[·%_S3½½äöë{˜²yÊ9¬€/ÌHvþä}ù‰!}¾GL˜«ÒȵۦÝ!Š“x tXz¢ÝG@‡Q³%Òõ¡m]d=/“ ¬Þ]¹¦ù®©GW2UBNìZÔ$WÑC[ö‡øÞ£ê*×£ÍqÚG™Ê|”ù Sÿ¼_ª$:ìŠzÕºbSÜVþs¡nÓö ³ä¡{ìiâ&–¦rÇÑÃ}Ó9¢@×Ey*ÖëÞµ^³x¬S׃î‚¿â‘tp–ÎŒ‡T&òœiÄreŒ‰n8}QV ¥µ‰6#Á„&ŸÀÓ‹‡d§”ì„ ÐaÝZG„Þ™ð¼+¿ áœç£¢[o\W5¨Ýƒ¸Y’ÏŒ±=&|¿ ì\0Á‰ª©  Ñ8‡øTØ”):†ãºDwø| r÷a'`p×ßÕ-¶$ð«5@mÇ6Á$?ä%ˆ™Sù•‰£¢m BúŒüÈW³|rq   lÉ…)Þè#I&)=Ž£Ù-Œ‰ùIgƒ\Äú2ð5¦z¢øÒ$ªÞW¡™g]åW¶m³#³Kš<°rRLb¡C¦ßÍ+!ƒZ·E$Ž¸Ñ hò1$61O¦šÀ©“t€˜ËÎË+^îYA3¡.É©„ ÈùâX£â¸ñ¼âœ“3¿9äÕYßÅš©áP? K”ŠcõŠšÄ‡{׺ù] "Ì%95¶Šñ±DÎðPrHŸÏI4)ZÇ"µ®Û‹+êZ1ƒ’»cà¥ÈÝÆÐ7½Ï™™s*.XJ[™§­ÌpÚÊì(me–*uf¹„fÖ7o•Û1'ìãlô‡[÷˜Â`§ßÜõ2ÏbÏ9·hŸÙäØ>œ•è³YÖ“"ª£Î—\ˆ{7ÃdÑ©žhqÛT\0©ˆžð1£"ãׇÂtÖðý‚¢Ä•gxž3XM﫜Ðâ|To¶O³‹s‘x€'eÍç¢LÈ­þŽ,Ó(FxH6 Èñp_RÃCÃu¾‘Ž ÌÅB*u"Œ~!§¦܃úuÃö8t¤|­P×°zšY,ä±Lá £>1ã Ûsö¸ œÎìÿþÏ›7s½™?à7Ë+F„O„cà„vÝ{Ÿ9vÙzÜÓâ'U5ig: ó7ôg[¾c8ùU §„ÃÉx"òôϵp`H Ç£9³X!Ç®C\çÚ/¨5­jPóÐ…&ô4P¶‡¡C=Zuç“O×O:TÐs'"ô«k›Ðæþš`Ðþ-v.PIøÓ>áN8í%— / `0ê;N^!™¿š¢pC>7áëñÜäG;ß:v=}7´d°t”ØÎÓœ£© Öž¤n´öíö“mÎÔ€Zê©‚H ú¡!m`ÉÒ)Wx9±Nm2oGCŸ†ðÅoèb™ßí=ó(™€tÂmŽì/è¤áô§#QÜ :1ªMb(¨‡´Õ D&KØÎø† ÓŒ_J£7ïhb°%M×®ë0<=}GO¯5Òcò½¢{Æ -Òà€ŒÂ;qgš¥a¯$êÊݾrCTˆL*Xœe Lbî‡veß䩺û–+œ_n6f<ÀKêAÀÌ‘4 ºÃݱ=Tˆ´$ ŸÊKöR±ú{’‘:=ö°¤ß’¦?^¼…Û‡²s^¹énÜÈ¡‚‰žÞè]Û6Ü6í@¥ânšÛͰ5ÎÖM½röÔñئ? å3Ó|ñª¸ƒ ÷X V¾Å;?!žãá_Yq’@›óK1\j8Ž&÷RøMX€s´¯å¼‘ ØÞ ´¿„òSÔB"ZÚƒ½:<B_|}O ÍD»UPhtGÙb{Om½ —(ÍIƒrÔ×7·ÜI`^ð ÁÐH„«&îú7ÓFùýᶃãV77?ÏñýõÝ{^÷×l}Ñ¿ïGwUw:Y>›´O™™øÿ\þz‰,ñ¸`ÁEhkqÔ†.^Y ]½Ÿ\ñ0EÉ«¨úr3¬”ÿáá¥k¥<ç4»JÜ‹‚0Å ô‹ôàDåÄñ¯ë†âµ(k¼”ôêݹڵÐiP«`5¶y#•5]œRŠJ,›#±ãûØÄŽé0K¤ùø¨ Äç;Fü$p$½ ¿u}ÑÂâ–žŽ3Ä1‰Ø‘‹C^ä¡gŽTTµ %Qcª„q²åYz·ÀoÍüe–eUØFâðËB¶hK¼†ÆC‚šž F|Ý烿9Q|¬S\;‘¦å£Ÿ ;‹ö™¨G¨åÓ¾> stream xÚ¥WÛnG }ïW죄b'Cν@äÖ ÔÊŠcÉŒ¦²#j,Éäýûr–³«ÙKê´• HâpfÉUñg…¤?(Ò¿,î¶Åɦ­/J«}´Æï%/T^µO’ÏÙ²xõLáE°¶XÞ¤PŽöI¦bùñ·Ñ›Ùå¯ãÒ i¡1~2£’ßçóÅt9}?]Þ°a2ŸÌnÓ»:¿|{µÿ¾ü¥0èFñÄËÕÃz\‚qfÕj™–K}ûÛÇõö‡q‰2„Ñål2¯\%ak ½½ýc}wÜ|^“HFï'³ës¾üG~Ã`édk¥5lø0º˜Î7Ûçí‡qu hÈ7Cuè|/8Ü«ýÞ²[m /Úñ‘7Ä"‡3‰6Ç¿ª/…Ä´°x\Ý}JÎö_Ö>îvÿ¼ûÈÇ †Ž±&‘u” èn¿¾YÛÌèóêñyÍWG~Ÿm¶›ãf÷ÀÔ¢DJ[ÎÚÅêð°Ù­²ë§§dF «€ÃjG «aµŒñ=º=¬WŸøˆ§ýfw¬¡6+J"ãÐD4êGY½8´2{%‰5ïK/™*ŽþÓή©J•Cvd¹EGtÕù:[$±ÔÚ#oI€N†ŠcïÖt–ÓÝ}eÕNÈZY‚@ºÈôî(AÈøâ#T½ *‹BL²\pá”J‚@›G!z»¿F‘£öAhÕuÏåÚ©Ñ€P˜Wuj7ÓóÙϽ˜æ‹ÄR`YxoÅá¹ÞÉ;Ò®G‚Òz«y»Õ™œæ,;^Õ}ál:W©bÀvÒ] ÊÊÔ‹:ÒI’´-•vÕÂû36NJ4äU]øÓuÊ ¡Õw ůûÒšóEÝÇ&“•%`‹©<»Æ WjŒðA‚åäUªO•’V8ªt¢Š@wŠ…±U·]´af!Y6ç{ õA‰<Òz º›-å!VQ&2Ýâ·S™]ú¼"äÎ@/åP*Ôa˜–.‰A ïµuý:Ä4AÐ’j™Œ°®LN¸~a怔_)x¨8T?ÿÚéTªê¾.ø†>SÓgsîL Ù ÒÓÿSz*>P(õÒ;µÀ®ôªÔh­ uƒ0³4зúøù ¦©>‘(6}åÙ¼jm¢îÍ·È(kVbèÉŽ°ªààÛd‡ä 5º^¦ñà‚_‡@Õ§¬Vª jå©ÝY¡›}-Å4>öb¥"uQ߬:9ÁXƒm½w4—ªa2ëkn–&=Žü‹‰y§‰ ½!Ö4šÓÃMC,É‹&F#7jGвßîÑý åMƒó“O¢K4EÈò¦ùA¥?4œÐÆÚÐSW6˜§T»‹é0OÕi¦E“¤ç–Zq¦3³Úž „o¯ŠyöúULÂ0(³–,ƒ|‰«Ó¦(‰Ö½ù09méÔðsFÍ—–~÷Ø_çËâÿœ1E¼Z†øsÑ cè'‘s4åR«nü¿ûkÈý endstream endobj 596 0 obj <> stream xÚVßo"G ~ï_±DÕÎy<öü8©äD+ZBÒƒœtêõäHD Eäªþ÷õìÌn–eI“’HËz<ö7Ÿí)þ*tò§ ‡òÅíºx¶‘õEiÉGk|/ÓBåUû”Ñ)ûœÏ‹w?j.¼ Öó»‚5(ãd_1ó¯¿ ~š\ýrV2Ò€aüƃ2=f£él<Ï?'Ãp:œ|žgéíãèêòãüì÷ùÏ£SĈW‹ûåY©Ùñ«Õ2/—¨UÀä³ÛÞ<,×ïÏJ„W“á´rÁÖ@»¼ùcy»_}[Š› ƒOÃÉõ(%ÿ!=0X‰l-XN†/ƒ‹ñtµ~Z9«jRSf]nU:î‡íÃÓz“vmë³}Ú§"Ó‰†ÅjÿOµbY…l€iÿívy—<Ùþ½Ü%ëÍöió5E3V±>M†£:\„Ó¤ø¶xxZ¦¯‹}zNVëÕ~µ¹O$# °ÍßÅbw¿Ú,2²ëÇÇd ÊR°[l¤tC&c Aƒ›Ýrñg ñ¸]mö5´Ýj!åL8H(Gjã(«O:ZÙúäfkž=Kÿeª8ú_;»¦ <Ŧ ]'ÇóñTWNتË5T&r \6©£š*0Ðå4ù±UT[JôÊ#9NiX™:B©•ÉDÞË0j€Q¢]§\ºB®·Ñ@DË­^ì• ìíKê…!‰ºyÛê•&Ñæ‹Îäúât{aRšØÇí…úUêe7ZçúÚË{Ï5c>(/̆ÖËíÕþÙ¨Î_׸†±x×£Z( ±¥ZàDkN¨V꯼:OÆ.§§é’‰SìœÅºÌëÄ^Ë@£ƒ`zèq¯E­°êb7tDäM„èçñîê¿L µ®áË*›ÞÛ|„ê:ñLÙHn]Õ5h{—\wËÇí.Ý8Góâ×tcç"â”—»è°b–[¿sʇ*H Æÿ»Ò¦»l endstream endobj 599 0 obj <> stream xÚ•Y[sã¶~ï¯ð#5µXxižšN·“Nºd§¨´YÌR¤CRvÜéï¹$@Ñ®2ëYázpÎw®ï~½w üw¹„¿än¾ûöáîOŸŒ%q™”wG˜ßb'»{8üýÝ´¦¯÷›mªó¨n]®Æºk7ÿ~øn,¼BÇ¥‚ÍE¬SÚü¹‹í:í-“iœ)8WÔP.d4ž 7ún#³è;"êzüM£}×\Î-/èúCÝV O´™G—óFÑãf mÓóªºåÝç¾{lÌ™G;X¬uô‹Ù1´JýÈÇ|nÕ›wé›<ö¥&HÆmZƺéÓXk’mìHÂ)ei¥?¯ CTxúè§ITµn0 ƒ%¡ñ0ey„–€Y¾ÇR‘Ç"µ‡¶+Þàã r½Yƒs#ZVn\`µÇYN.²ò•[¾Aâ Ñjl&‡€Ë¡V’wQwq‘tæä›ÛꉟÖ1UÒÃû¦zS­Þia Ëó3±J€BŸÍg@aÌ ­P »s‘”U… ÕÙÐ4» PŸ)²ÌMõûѼÑw–~3a›!¶ OÊÙ“Ò+O’>.„ýf,ï.|ÞæZŸÖO}Ƴ$d\—Ple±†ŒQ žËoÙ.º´^V¤Ía·áUSÀ×€Ã.zàÐ ›öÕ`xÉÙT­OÕȃö`È…=¶§©o.Ú˜iMàpá8©¢ƒyÂʼM Ý¢î¿ õø¶^U”EP‘'s弃’%Á¡8~Ù É7Ãë(Ì<Ï—ßꦮú7y_WPñˆg–DÏ`C—ýx鹺§­ÊßšÀV†ÝŠŒED)}ØåX\Ôꉱ©ö_WЕù{¹1@ ŽôÑBv>L—œˆÝ¯ì0¾üë®Á¬x<ÿëñ®ö9®kZéuÞ•-òóÌà±Ù¾6~¾\È£‚L¿ 5 #¾D»ÍºLÌ¢'Ó?«þ‰®|+âqV%tE”³æpÙsÁ†!j±…\±áhÅ>Ai5&Ñ/¼n¢ã4vC«”Ù q 4þúâ_meVqðlá·é÷Ý+æTù#¥‚•ºdpßÚõ^õ`óЏNv©pÕn½–wvÛ ¥ C wŒÒÞ1 {·TXÞãø ¢]ȲèÙ>ƒà›…IëÚæ[GÒ,wï"÷Ã^OP'A8á¬âg¨µcÚp°WZ'aøª¢¦“•;~Õ¬\@>ð>Ãb™}uÁr ç!Gø…8íxÀA=ŸxMš;¶Ÿèh²OʈÒ$¾ ³·Ø{÷•2?m w#‘yA UIiX4…×Pžïl$[&T¯ º®±å²øJ]™–âc”B­qd«~´¯.T@àxÂȺÒèJ"3*=SaÈÈ4•cnlp<ñð¡î±Æèø½DX3ÏØ«{NÔÖ 3å1d‰)Át<Ó€–>I»Åp6Kº~ä}×ã!²3àzKê`ö½àÚ§ûkÝrïeêÐ Ø–lFl­›:þ­[w÷I¾™h¢©sÏs'QF_€„Yp²(G¦mf:‡ÂÄÌáZ. T¥g5è[If¯œeX¡õÚyŽ9Æ€´ºr“ÞK¹ äjÊR„¡]%:›Á± @ÈdânZ劥Zá טê@O$‚¸QùbÍ pfzíÀ4ç9#ÎÙ'ßùÐÝp­>&h\r°vh˜ Ù25Ò 6fŸ½Rï¿hEÁ¾’*0¶ ÛtãV9É0ð\oÎö1:|!áö ƒ*ì“¶"kê Ä]/½KÌ'XŒNï®À=$ÄkÍ]Và-8c½›tWè.ÍὬÁþ<}G´æJÁ¢ÑlÓ×FVƒ-<ÐË4¢ Bѳ®¦-ð›ŠÓ'U9i©¦ï£Ö§—–Lµw·ì±Î4ø_õ•&€' KkÏýZÆrª}I”ÏÝhÜqoùÛ,«æ¡Úfy%(µ[ýÃþA×[ endstream endobj 602 0 obj <> stream xÚ½ZYoÜÈ~ϯÐÛrMöÁcƒJ·¬cÒ0Ë|=8Få³—j@ÓK…¾Ž‚SÑ0¡¸\YÖvï G"îLf® )®<×opÄpSÆÊñ‘x<>Ònß@óž³>µü†‹ªé·v¢8Œå Zy¼m7˜«•ÆÌåØ[R'¡Î…ê;ŒT˜ÇB"a =ú1Éq–\:‹óᡲ¥è ÞíKqyA׫rÐaЗçrðr:ìî3v÷8PȵâE¿’·¼?PÜMƒ®E=}æm~ºeúª—uüsn¯`tǾ:“7ÈH½ýÐ~Oç!<›˜°‰%A¹rî|Rt>&²>Lä¹uöÞ&2s»’û «žžé©ŸÙJH'3àh G;ò-ØšpÕ›l)[³}Iû2T—¢æNßÖWöØóC®)?]!Fvú}.×€c¤t4;Ö1© qƒ‚§œŒî ¨…̸˜_­{l;¦ž™EL÷‰»y|ãàg¥­³ÚØ7É4 •óßoج#-ÓZei¼Í$T©ýiƒ‡ 3÷~”Ý#N&ßõ)¢$Jõ/£’œâ.eÑÈY‡g :o)™ûCoNPEÁ[¹ ÎxûØs&°c23+`‹C³»„¾c– 2)5A¿=Ø"k'§ªl(¯@¯"ÉL¤ƒU¯#ŠÜ¼KÛ¤ˆ à*úQJ¼˜7´ž¤JqB†¿l-8°qEÈëÔò};¡é5 Ç—üãÛ¡ˆ 3+·÷§k5È®}…˜ÑÉÆZ\û= ¥hœ[çA ub\™'ޓ¾ZIÊtñ²’@OòF§#¦xDœªËâÜ ›–¹€Ó¨Øhj$Íé|{ë‰*òÖLb£5¯ŒtfÙ¾»?ìø£b8+ùTÝw‹ë—ª® î*Dì«é™À¼ƒSà]ïAºúzi˜NÍ_ŒZ\,c it- ¡¦tl‹nè;*gLP×WË,ßt€&Êv¯ ¦¤å~òÝsÕ•ä_0x¥¨vß8Çî[žš°»HÞ=%o8Gîtëë™#j>nÿ»£Dvߟ[—¨Ú„ël€ÚJî5Ü‚bvÏ+Ÿ‹ ¥óÈoe×2ŸíÝvžqṘ¸Ê®Ãrá¢CGKÌG™¤1+øÁFŒž› „m§ ¨p™o¤›Õ»Tªw™W½£ÄAÂÎŒ{än°&›û:[pá8=¦Npu¦µ&a0°Ð=ÃM£¼ÈÉ@œ®DÅìJ˜(õˆWÙˆ‚³o/â(‡À ºØ£8¿Àp°=ïéÀÙÆ¹Æú Jã°¦a“\„‡ÇÖ žœ´1$]ÏM.÷¡‹¬eÀáÕy麾¤=¢öÔJjƒ,¯p.ä 4a¹aùê gu ^6{)èñ‘”öŸv'H¯ô镃ôJ{§„ŽÀhýJζ|Ay”’Ò&Œ÷ÕSCéGŒáMAÄD¤¸ÉÚ;„+£Ghò9zÆ0‰ŸE‚y+Ó¾ï¹=&Ø™[®&›7®.`òíÀovÝ-NÝ3äÅÅMý¶àçÓ¯aç*Aq  ]Ï—ò¼ên=/ËŽ{D4&Žæl¸TKÔs—êç`¿ÈhÍj¢z[l)g7½ãY+rzÅ?8¬#Ÿ3êÌz¹f6VÞqÆDžW3F8ÁV•ùÕçl§ú¬TÚdYx=µåãÿX‚ލ†8ß~3ËìžEÑTÑH"åa:ÓÎTV¤/!RVÄöTV¤2«²¢_öðªÑHLÅ¿t¿ø§’lª°þ—²Ÿù=e?óõªßnÑOë,4jñESQ;Rõs…%Áò#"Äíª.dÈdÿ[uå¢$Œ‘@²Â• •‹/ºÊVÊÕ/9£Ù`TMóà–¡±Û¯Ñìx˜ªd)حŇ”ºªŸ±^l5ÖÅV#ÀÝ8ànüŠŒz?b Ve4‹(nmàV¤A?½(–˜|^,!w/;…Ÿ©€ã•èdlä¤Ëgü§Ùh<‘ÏÓòw»¦|*œ I+˜â>×þÝú“#Í”øs*ªù®j2‰hØØL²èsí¶Ç´ˆf^ë{L÷­Ç à[Í”ó˜8×U]ss:f¦=ç‰;T8!Ú*4ÚéÒWꌱ+T&³P¡vÏý>Š¢­´=šŠüß(Ùèú3þdÛ W~ÝáèdŽubÌè:¹LjÆ(]5çêTpÜ¡îâ›øÌÅnÆ85ßt6j4MÃôÿV¨ù¦" ¹oöî/!^p$Un¸HküÊ z#ªè#mÉï·sT^kÉöÎöÉyv<ágûL8eûÈvžÞ;G¸íªÇ|³(—ïc{;1÷rS[‚S·m¼ Sôe9Ëüôž>:yé=~Ñsé=§t…û²5é'é=!²ZyJõ±:¥úÜã_©Q&›Çщ•6Ç2ê,½§ñEz+çé=Žpz?î¶,¤&;ЊÓ{kÔv`S}Ƀp©05üT_Ã%Hª¯³L§G> stream xÚZÝoܸï_aô¥ZÔVDŠ©ëÓ]Ñ.îr(à·ó•w¹±’]i+icûþúÎp†¥ÕƇY~9Ãß|*7ÿ»7ü7ZÂßìf{¼ùéáæÃÇâFdi•U7{˜¾ÃNyó°û-ù¶)Фî›úé`‡ts§J‘<<ÛÍ]žWÉöÜ÷¶ÝHŒ8`’§zhšëí±nZîìÎõZ{ K€õêvGñÙövßõ<ÞÆæè·¼<7~}owç­å=Ûn‘¾Ê’nÏô‡Íïÿv,äiQ8Ú®½Ã‹ma(æáJûºµ§‘”ã´–¤…õx5DÔs}:ÑuÚA2óSª¦¸ Õ¢H+º§~S0üSE­Éá~E†×W[ˆT*ÞŠJ Œ|êFKgÏõè[¶çÁšp”'X§'@üWZ4Éð‚«¢gÂéCö"Œ¦ÍéL§RÄ áÄ®2–f‰ÒT…0ÁÓ|p»ÃG/àÈís–ìì¶Ç7EŒâ8bÇ 98€-çÅq‡Qc´¤6Õ3*ç]¹Â  N-Qrò9ÜdâG3?y¡?øÛ´?Øw:‡óNçp`MçÙƒ—/ÀjÿlÇïS)gT–RÁ©‚Í^Il  V1A÷$Ø8ÎΛeÞûI8®FòòÓD9Ü@ËŸˆžŒlt`³û%~à´¡>ZÚ5=2Õ…58ÖäÊÚ¶zÓBŒÓrÁûõLÍÌHž+fDåš‘–æé¨,ö‚Yð‚ÛÕx]lß³"òRØ‹;݇ý Z¼oôX¯XÛfü+Lë³­+Ú[œ¯µuä´¿LG7ÑÅÂÿæZŠa†áçžkÚ_„˜I£/<êm Å†›.pkHŒ,Ý[–ÍtÌèä`kì} n¼×2SàMw_X9Ð#Ó§ž#3$95‡Æ™Ç·QhWËL'÷#­žÉ ¹3èI¨snw¢R-RS^ÆâÆ3÷4òB*}ÁsðÆ–b 2¹ZÎ=£‹:ˆ=œC5Á_vHÐräk´Ïo´Ú¾ÖÛñðF³Î+h9÷–šÎPžœöbßÅ¥œú»#v_êmP7¾¯]Q·—æp à:GŒ!Z†ÎKƒ'Gfé ®\3”` ƒar±ªY!¸³Ñ+‹›s1,ÖEê!.Ž~®W¥èQr2ªÈy€™L&¿¶4ÄÞ(÷¡ îHìœ×ÊÝkãPXdMQLù¨i"&cC­ ¸p4>lbjZÅÉWPŠáŽSa¶M,ݲ š^ JahaÀp5ß‘Ð^I`ÔÚùË’5†Q*Ì8kZrP‚±' óÆÏóYÔœ=Ùµp•d‘ƒ|Ûúðö‡ÝaܨÇW*W|c\‚nwŒá±iÃ^Žl/ FBh­" ugŠð~I‡/3ÑxÇr’W¬) §ö¹…<Å9i 6Я³J89RŸ¬Sï÷Òä¾·–¦ÁÔá 6 h÷v.„¹8·´èæÔ·uÛvÜžYð™³Ï—›a:v„Ì X6˜ä!Ë÷-Ø`þ ‚è-kt?Ò†°Ú3J[)vFºµ>w2 +c¦sÖO$²¨ñAゆ‡¦1—мó¬†4$Æg.²‰[²>/xÕ!‹Â±©†‘…šo$ŒÀrð‡ìØ] c(™\*—[ç¡ó_ŸÔ˜(1ÉU™–>ÿþõé Ib0d÷Ôê»LhL–ŠŠ·ýÍ…XeòO ¥ïHJ–©‘1ا›$¢¼ISàj)¤E8N÷^‹aáþÜú R)z'å/çþ°»È~pAæfÐÁ­ìRT'A€h¾ÉÎe®É\©4Î|’?dN«ò1Uj)þod±‰¼á/_›§+9¦ÈuªJÿ&–R%ÃÛ12_È’Úšl{Ášâ2°YbÇ)™E¿°,rª…™™‘õ T©Š…Àx ÙaÄáÕ›X1É :«ò@W0?‡«R}¯\Té4Ÿ £ !ç \Ћ/ xâÂj:5éqî ;BÅâº#g;œyÃÕà¥âj’34`Á¬.¡ÍM>’g€’­°¯Ë7-Y ÁzÁm݆ÒËdKT¯Ý#²$êŠ%Á‡a)ÿˆ ÛŒoô4ß3"ffDTr¿ŸN&K’‹¥°VCIsÕ”ãTÝr)”zK½®ÿÀ8¨|é‚gέºÝA0Á>¶ôYªˆ «¸jXe*ʹf«?iXƒL<_ôþÎ!¬ÆV¦ùLçîîÛý q Š ™80þ¡ëW¯®§›ÿý !™V^ 1Þ•.'LÁÀÉb ¦yŒ)dÀÇškœ ÀÅe8ƒy©[Ç´ÚŽ~¹H­¨D«…g˜msxMûÚ¸²¼rªÑ¤Ö]]!É÷³nÈ‹©æ¬µO™ª)m«¦±¨<­Í²Ü ›Èpá2ìu=ýNÃíÀ7®™q‚XÍ ˜Áë7…«xü]xœu,¦Y¾¢˜„åq¡èU59Ÿkè+14z}eªÞ_¨¥r)S¦…Žą̃µ(y L «>ž¨Ê\2ëšÚGëz¾`ƒâlÍÞ•ÐÐ[ú5Œýy;ž{*iëEDOÇm»ÃùØ¢ÍÅ?ÝÊi†² ’+UÊPÆ‹£I6zñw©à³¨ë?|©*KeY<š+%|¸“q %_/¿Ò­õBcnˆ8ÐHh÷.Ÿ¾Â­“»n‰ñ;MÜ9À ÀTÁ›ä†mæ~ËÜ{WjšÊѨ´_ýŸ¿üÎĈn endstream endobj 610 0 obj <> stream xÚÍYKoã6¾÷W½TÂÖ¬ø)eÑC¶è]ô°MÜS݃b+±ZKr%9Iƒþø9”-Åô3Ù Ø`E…CÎã›~T¼¿=ê…ðzŠÁOèM ïÃØûî#óXH¤äÞø¦G‰~ñƳßýæé²Íê`Ä¥ôEðÇøH+ ¢be¥#xIŒôåì>-§Ù Å/?ÿ¬Ê¿ªVm^fYþãU&„ i7aaL3»Bƒ¥LøÒiÀCÿ¯»ºZ•3«=òhH’0Ñ iD‹¹Yû[“—w 5¤þ}À”ŸMÛJ[†~ZÎp¢HÛ:Ôcæ—U›¶yU68ÕÎ3üòŸËººYd O|Jè$øW?ù$@‰‰ßdvÑ5hƒ½:71ÒW?ÙA}‡Ž÷íç*&Šƒ\‘(2€ŠÍz­kYÂ4@ýeßjb™Þe'è$n”Ô. Ü’uÁ˜¦%n‚‹}4eÔ- ¼“o ê&M8÷ÓŸ·ÕbQiÌš ³ŽÃ*—Æ$Bp‹¼Ì‹üIG›k4 ²\ æ÷`¦¥ý‘”À¨§ýÉ‘I $wõô÷Î](‰˜˜vÜS$1e%Àà?ÜìÚ@ˆs'ñ¸½ƒ$L;K$–ÒµÛFæ­%Þ9Í„}n&š©•#ºJ*æ$ÞZfâs—¢D›z.»ÀÜNS ËH’&kC=iÒ`yEþŸP8˜m…Ïô‹ÔÂ;…òlë4/ur´Ómõ1ÞáØH\9ÌNHyk‰ƒ‰péÐ]MО4;ÕFÑ‹cÌ\1ÆnŠmêKR7ÒãZÝb¬ï€ ­ó:;º2$\G7$ ^lûÍ€.;»èÊarFr“À“ §:FháÃ…òJŠVNE.[Œ ¹h´)‰å‘‘¹~«È\¿Udœ)C$вDô:)Î×)ÅD™Ñ fæY]8Ý@z°9AŽO'WWHlW1¥À¡•|Žë+ã½þK][@îµß÷@…€K]ôª{Ø9‡S*Uõ¯@6éµù›AnOcdBÐ%4 Úv á§«Ç|‘§õ?Ž&òÞY*1°¦ø44®hPö4ø.4Šm¼”Îa\ÿŽî8 8s£¥‰sjZññ†¸‰ºÙÒ±ˆ³?i8|WÓvU§‹£¡¦¡Äcõ“ÉÎìgÆp¿ÒÌ@f£ahÔíª4$Û­×ìh´Š潊ÖLïÈäÙG¥øÞR6çÇ&‡ƒY²X6ŠöÌϸڰ°^¬9/?›„TNó ø—þ厼Tú`é~8d¡“ârµñd++ L‘Ú©¬.p4ñ'“fžß¶_wèü{aR© “¾k—®óŽFOM«t;F0ÛG›:ó RBž”W©³é„´§©p%¸NgïSt‰È0{ÍÞqf7m’_æ`^l‡}ÍÑøáƒ™{0;œb¦‘÷¢¾ç`>³ší%:Ð÷ïÚIýùžC\èìŠ1@îxâü È­œ”J¼:r«}‡ôCnµ\bõß󿏱p/s+=¡à^‘{í»ñ—s¯£Û » O°ãlêõµì i‡²"Qϲ⼻ޙY±ÚCÿß2+v{òÿM‹£ÅÞœ xŸ6\}p/ûÄܯ+Í«db­Q¡ßäÅr‘=âo‹¬W&gß4v˜Ù «6L@Æz‡Úî‘[Ù²Âmf9KÓåÔJØ/Çí&ñ³eû]O¿š[FïÚItÈÞú×ߌT¬üñ\›"p#óÙYúæ]—)ôëM^š?%è_ˆOš ‡Ã¯ff'û…²Â·ª\KnPÔí> stream xÚÕZÝsÛ¸ï_¡Gy±ÄAðnúÌ´t®™^â·ºŒDÛ¼“H‡¤ÎÉýõÝÅ.HP‚$;ñ]ÛIÆ¢@Øïßb‹O ±HáŸXäþ§‹õnñæzñ§¿f ‘&EZ,®oªHŒ^¬pÀ,®7ÿZîê¦ÞÕ¿VW+¥äòfÙvø¤—»ò³¿¹ºú÷õßa!‚eD&“TÂ:*É2·Î¯<-ÜÌ&™‚ðõŸ¯V2Ïaý”ç™`žÔ‰ÍxâO±íLb ¿_GöÑI®øõD®ZäI‘Ók©áO&ÜŒë,Vã”ÏQ^Fþ•<‰… hÈQ\‰QnFÙAä 'sn–*¶(°à}¾‹¬¢’ÔËB³0VZ8êW2E¥á«~ÿñj•eËŸªõ€úVË¡¥ÏmÝT%ÛÀºmú¡+ëæJæË¡w‹ [¡æo–12Aè^¥o#*/iG¯¤ÓKÓ4*XÑÔ×QÅ{¤üJ4Oˆ)(ÉçFJdˆ" VþV]d1]žËfCÎ*‘vÙî›MOòooI'¿\ªÊ®.?n«>*£\$V‡JÙFdn/Ç›Têè:]`.+—Õ¹%$ÏÙǬĪ^Jªf”jfaÕÀÀï«®ú.º’EÁI=Ã(âV‹åÙÀ‚ÈcÐôÐë 7ã}D¤ð”™Å8åTøËÏn¢‚M>DØ1 |Ž3@hάj6³á¾¢ž ¶åý`Ó(@xjhl¢ÔezôàÕ/l ,Iv ĕۭ'}æß“ %‘…š£ 8‰RÐ&?6r 8$•—¤þjI~£³KbTË¿q¿¦9ô~ݺèSݤ¬ëŠC>‰ö/לX¼ÿ?tw”Z'AÇ\ ²Ž 1ýxwœŽxg49:ÜY4ÑçѤø-ÐäH¹¼b†£›~RîïvU3TWYºÜDVÏTb½Žçà£5‰æbbæÌʘ9sQ¬¿µ=îÊ¡«??Çž ~ ¶¡P ¸ŒŒÚS<ºg‰a‹ÁÝç|Û㸫0ÃyÑàßÄ|Cpÿ¿IÛ_<º·]4RãÜt \ ©­BPØÇáÞ>î÷Q$~a‹Ø_Ì)â! B>íóÿ>Úï:"ö+ " ÒZÀ›/0Û˜åÁN7õP· ”M,Â[‰ð?üfZ ô@ˆ/ûz_óeßn÷n™¢˜¤ðNtWµ» âàhf"œZpkú ®[ 0–-kG]ΚƒIýC¹æG'üùvK =ŠàŒå ’a Ö»g‰XÆœ¹ðÀûW]y‚OÎ2‡Ï{|ùIE}Ø–MÅ ¬Û®«zf¢ÙÔÍ/Œ§Ë ³Ž\FO˜OB¥V´«‰ u1ÛPÊ ”ÀL¢ R̆ôòÚ3îE›ë‘[m®æ¢%Qú'QÞ—N¡©×$5äýdó³Nšäâ¼»À"yb~5QWݶ]å¿£fŒðÎÀ4÷`§4þ‘Ü ²‘»^YL_I4=tX9Z6B»Îóodþ÷ð¤}\,NŒ:MĬ‚u`‹`åwíàâ¥É•CœŠø ÄcYŸ‹eÏÁIF1Ìr¤«ÈuTÎ.àmÝl*ŽŒð4F ˜W}Ú—[ˆeÎá{Ù1ÝåÖ©ªDí|ñ/Gi¼â˜8©²P=„ºjä"91¨ÒÓYê„Dq¬>q‰ˆB9‹h èÕöUÃ(Ñ<ôò¶kw‡Á¿9^^9I››+††Ì(dx ksÁʦd‘-1pW›H2)FI´ÍjˆÈ â¯Ü2Ëú–6¨‡žh¸™Ò"BAlùsBG´ ¹Çï5/ÃB7ËŠ7j1<Ö}Åó†ùüÓ Jk§ƒp'Nq'eb½¹³ 5Ø ÄíÀº>ÔÍÚ‘„ ÐS("3í ôú²ÞÐpɼá[ 1ü»ê3p†óI#±*rÖ0ÇÈøÑ[@h`9†,èÙáöû~ )“u"öÎäó€]:ÛûB Œ4ŸRC™½0—xvää¼Xkyèűãb–èâËpœ´¡…AZ‹dsCX•Œ;‹ ì™`§ŸÞÚ"kn °pŠ­Z+Š­Ä'}Üv3>wFGÚcþÌE œD*ôR, LØ)ŽìÂÖ&ÕË×Ûá¾ÝßÝsò¶çì¾Í(ÉÒabÓÒgŒ‚ÆušN` P³µuó3¡›á_‰’xØÔ€  YWÓâ°Ö€ÆGÎï¢,2Œñ uŒ¦‡,6Õ]9±³„øÅÀ) ZÃ=½eØÐ¡‰¸ódãÏ“þ ±.û*áìQQõ¯1ÒןÊß·Äš{åÛ› ’Í]ÝøÍ·íªŽ¶—¬•í¾êçgGJÎSšsë{Y%ͽcÑ0'sÞ!“Q®##?TÜ ¹IÓ,D†&WåÃC×>Àþ¿ðšÇP²Ã]T ™—øÇSYÛ± NØ¥ueÎßåÈŽ9vÙ1ËìÑAÉ ªa°«‡©Ö^ÌŽß™@¨ƒODZîÈ]6ÑØ‹‹ÅtZèMô¼o£VÂb/ÕËiw1Âm’æ éªuL´ŠGÔÔ8攊–L%²ªt½‘iúiY`!õ‚,BÞGe‘!ùeÊôCŒjƒ=¡¯”E>“ÅÌ‹dìi|[Ï8(|¡FQ~Ð(RcÿûqD߃ŕ“ÊS[;oNˆ$› 1.njî®Ýyiª}èŒbŒûÀ¤NóÑ’”@Ïyjwè]œN{Dg6£ÓÄè ‚hÍ.Ð é‘g{±aa¶(N—áŠâÉ,Ÿ(Ãåâbîéêb]V»z"Èbvàₚۅa¬3ëŒ:Â:˜C)§ši»ú®nÊ­ÿ¨‚µ€•·ãTª=)‡ä?ï¿ôCµãóþãÕ;]9žc’“*fÐÙUˆƒÇ–’óŠÛvËGŸž¼ÚMáô -*öÅšDâl“H?µI¸É>„IJóÑ¥“ìä“Sq2Øë9·欫°t;³7p. ÷M´•hóÄ+<ï¢|æèÇ…^žúyÐy)0Ï ¬/˜FÄmÓàþ$©(n¦*)^ 7í1nªì7En“üi7‚~? r®àÓ±x°ù¿.._Q;©6‘ãÑû›_ŒŠ×2Qx_)þ¾ú_b)“zCoâµÔÛ.b¶Â÷­\öŸöTê€!Ì+úº¹ÛombòF<°çãÀˆ=îÖŽ‹sÏbº»È½k8>g†Çg$Öó±nwÜöè« ñDµIz¹ÝpНý}°-n|{K÷¨ƒ‹™âðºÀJçéxÄçXçÇñ€­ó±ŽC]²•…¯oyIÇLç: -qââC¡ÑhÇ‚ +w:•§,z /ªÑoÚÎwl>-ÚxĬ!+2Ä¢ÝBØ<‘ã÷íâÃâGn™$€xÇ„DgRÉž1Þ9¡©9x_qƒ"' L5þ>Á‡ýG¬¦@¾ULù­„¸ë>&‰(ÑžF]ÁBó=šüàt¦ïÑXʰ¶5ðçþs½­Ëî -ú0]Ë9“àöx±)Ç¿³{'yã}î_X_cSV/7ûŠ3ðdõœ  j6¨KHìlÕ\|<„'@̃x ;ñt¶’D8™‡ÓG3ËekàNÎà½g–YÜ7õà«°göCVèî¥ÕS[Œ¾rÉ’ѽKºá©+›Ÿï°–nš§ÈkÊ¥A·»ªl\¥MsÍ ÆÊn¨×Îø«BKÈ n­‚~Ì R`ÔUa hi,œ‘…r;È.o½c¼°®›ulVì;£Y©‹f¥ lçp§äx󒘵ú'K°“¥¸ÚyÑ2ÄDåñ¼¾ ýG¹zžæzž¥zJù°uÞXó/> stream xÚÝZY“ÛÆ~ϯà#X'˜©ò`§b—"%e'ûæõ–—°I`:\úñéžrWÚTR.m 0èééãëcfñnA)ü£‹ŒÁ_ºXßÝ,þü½\Дäi¾¸ÙÂëþP‹›ÍÏIWöŸ–+NUrÜ•Ë_nþÃiŒ—œp_á𻥤IÑUÒeŒp7Œ,W‚ëäű­>zš4+IýàFhQNuïa2`/K {iËõ±¨ïû}ÑÆ(g¡Ê}ypTH™åWs›¦,Fî¤tcêwj|½:˜5¾ÞXš|ØUë%Ë’¨ç|Ý–+xÞtåÆ>Ú¶ÍÁ¿Ü÷‡Úl¶öêU±b\“\ƒÆ8Ή3ýý¡¬q–£!ƨ»c[Tö)>ã‰åËÞ¯›¶-;dA'M½©ê{ûüØØkÝÔ«;ÐêŠäýRʤh«ân_vÄðA%Ép¡‰ä†‹ï—š'v @à6áDß.íÊq°möû9úйévÅñeTÞHt²Èï–+™&ƒéðEFòÌ •$U0’¨Ü ÉHÌÕ»P‰Ëå]ÆßÙ—–-å)ª¤{(ÖîÖx›<´Õ¡ØÛ¥¨ip{aÙµ8¢l#€¯cÕm}Ø st~#¦ÎÔ|yòzëj¡d˜Æ¿Þ£ŒËÖw’ï](MC³G&EйÃÞÞxŸ„Ûi†Gcøƒ¤ÁGGóõ íïi™äˆ b¹…B&¬èìØó’é„£ ·c…QU‘õ8@à(§c´ U"RÈÐ,ŒvjJ5ñŒ"Í)VÙ~¨ºxõ€ÏÌTÕWæ‚È5AЯ„š¡”k4ð Ò-Û¥õ­‘ׯ¾qžw…‘8ZP–O-PãrƒéÁ£Az¡ $n~ f ¹‘¯d娒÷D×¾Le¾L-êÍø,`¦ÐµÀ ~û£½‚°›ö“½ï ³0$Ÿ ¿`4†íô›]ÑÙ›æáˆkw_»õÏ ¶nß&žÞdän›º4+mo!ž>…yš(pzÖè¬Û[OM„åÝ”ãëYò­á8F‚Ó>áQ]ûÖ¬~|ÀÏ ÄOSâa)ãv%Ú²ýQØË½Ëpkˬ]ô™«Mm£r ÅùsëÓûc8j4ž¾+‡ Û¾yS´}·ûü¦ßÕŸo°ãѯq¿†ZÛ|qs€öœÛ†Ì¦Bv.¶OÂ'><Í ‡rŽÅËÿ¡üÆ,ÒHoàõ&6ƒ"ŠuÔmÊiT΃4®vônS&c -Ç+M´L"1ßF|ù<¶Ai=½ MðÅ0b®5æ­§ÛÎPRþAêÐ,±Í“ÆJi5¤·„¸v¼‘®#óˆÀÈ­þIÀa*Ôÿ×úŠŒû1¸ 50ÖËûˆ@ êµ¯›‚®åǸoe áÅÖG«¦+×g5'\0{†Orœ©Ô¨' #gÅI„ä+mú_1†¨i˜šu±@rFér¥ÖGT‡ê÷£¦“ƒ<#×Ï¥lVKéÀ@¯èC_Õ‡¾¶úgÖ‡¸ªqÍBÎõQ|<×ÔýÏæz®Š, âZp½.„N( ™$Ô\6 гyB÷çóXÁ>e1Kßÿ5Ñ+:' Öm¼2$™>N8—}íB0/ €æ¥È>:ü/+Ò MŒ0£Ø ž$ÛôKvZƒœ‡Íàž¹¡*‹²—Ì_^Ù‡‡˜w«"¾ù¢óL—_Ú2(Û2¾'Z²Î&æÃq ßpNfèeÊFR“ Æ‚(2¿é2 yu®5ÑN6™*€£CÛ8WL‡06"ÖrÚY(¢vœ¡ÌÒY’ù˜•¯lWt}ôMÓ …ëÛâ¾-ê{WÌÞêþX=쫲ílQ¿õß”ïúIã!Úöb¾wý*šuP@IÎ¦Š¾ÓôlL›fÎáž1‡`÷áIiN,ˆêìegØûU65˜V LBìúÚtáé+ås+­£À¬Ä¸Ð_cÐ eó¸ ]Û¥óÍœA‹sƒÎN ší:QvÃ`ÜÒÎ\ÉÍZ¸šµpðv­oá'YìIáHÐáÝ ×K.ĵäBü1 üé ýßÛ·|NÀîÜ.r{z^ã ¾Õ©qû<3Fkþ«ïñŽMbÓ0œö¸göó1GöVj÷ebè#Ðî½ 4mu_ÕnÕ~›{ìÛxdbóK“ãÒ„"ŠÍ,MdnifVdÂ[È.,MG6}ta`Û¹OJü2p"³ ¤§ËÀ7'ðC [UÒž/€ñ-î-·f2sy| ²©†N~8ÁpΓʜ°É±»ŒCÊä×28ãÃrlûzí´¦fï‚幃ÉÒ>,ì³}U—Ekï×AÞ;PœýI!ø²nZP|g˜Ý¤¼+탇}Q—î¥ßºÞøY­dØ™‚Ãü:§Û½Î&›Ãéw Âs½ø€ß(P”Ès–† ¿÷‹/~r; Ü?Çøhê>0וâP/ˆé¡;6 Ï•rµ‚Ìq,X‚t~Ægó‹õ¾%X°S–û2áŽÑ ÆüðöÇ7ö‘9!ã7qŒä‰·Õ€á•ÀÌi•áÿ“”Yv…ÄúÁíOšm+q²Ùƒ¿‹Úòsgv£Š‡‡Êó YwhìK ¿_7MmNŠãJû¤°?ýF¤÷hÉd ÓcℬT–»Óª©þÓŸþÈ{B‡ endstream endobj 225 0 obj <> stream xÚí\M¹½çWð˜\8,’U$…ý€ƒrX¬÷fìÁž‘‚ ˆ, ù÷y¯»%µ‡’g<¢äYc¶(N‹U¬WÅj’1f\Œæ$(>‹‹ÂïÕ%á÷ærÄ÷œF|Oâ,ñ{t%%|&W~“²k9âS1NfeOq•=ÕI2ö4'ÙГƒ-èÉâÄ {¢“RÙ“œÔjhd'­64@=´Œz¥±‡ƒöTŽÅüSA‚E“雋%²ƒÖÈpÝ{Ô¥@ÞÁ\ÁƒŠIGÁðÚ\B c—2dƒÁ\ÒÄžè’%ö$—JfOv©’)ÀÍ\Êžâ²y©#~ òLøKp9ôqY {¢ËVÙ“\.•=ÙåÚØ£.·Æs*=úì©|±§9Íd¾BUJæ«852j!ó]+™¯Ùi#óU2Y›ùZœE20Qö4g³Œ-8S2ß`VØ“œL=U! 裄@Ñš+=@´®Pê´§’*…]\ɘS’ꊂ»+†QSL®”©‡[âŸÌÕKI0É*Pu‚ýÕYEヰ¡+W3øI4Çi@ØaµÊ‡ñ«*T#®a‚EµÀì§Ñè¸l1²‘Lƒ ƒ9SŸ Ó´áaè½þ ½­òWDk0¶ Jih ©A?è5 ÒÆ(H¾ÑðÓJ/Q/E %à·£TþýBJ0w&$»B‹Þ•ÀŒ™Ì!L.#ÁïE,€A]çÀç*¸ÍÂçh>v"po¶àž1BG^‚VÃoa3 1™*ŸË˜mô¡Âùœz†´VƸ‚U€ÆäÜ–™éË ì£^RŒlñ¯ æ‘!0`üÊ猼@ê!²…ñ`!|ܧ3ÍpÉ¿ÂÐjìWyâÙˆ% †™á>‚AA –|!]8‡d:i¦rºá?´œ S À[¦T(IjA#%IÙ+ 3SâJ.É·¨i3t_ ¥ ÿ ®,à·ŠY‰A tV´,äLŒÖ Bh‘K¥>LéŒð 1ƒæz6þ–£ÀTÑÂ,áU KhÓQïRˆ9ŠYI!þ)ìM GP8‚84ZàªèC©#8q‚Ï5þ‚€[‰UJmU!€©‰t©·š1¥¶ªBƒüG³Â,©£Z”pÓˆÖxZÏ5üE©­&ðÿÂs°-i´¥Ï4‚ € -àZ|Î [|®bþJ½µ~éÕÀÂ#žD Xb#˜§­_"ù ÛÂÂð†¹ÄP m#v†:µŒñ$²Uó¦âƒPo´ø( YFlú³1°Àˆ& DKÁ16B5@Qè=bêÀJŒ„Ù¶A©­o¾¹ùåÿÞÜ|ûîÝû7¯þóö¿ýíïþyóÝûßî6¿½ˆÂá×›ï_ËÜø?yuó×÷¿¼¿ùáÏ·ñ//^Üü¼¹ýðZcòœlÛ“.u Kö%é¯/^üé\B©'dêe2ÉÉ<”?‚Pî ©xje"¤•}#é=BF°ò&JBY}¨CY?£˜=±`"”ÄÃG*=! aj&$Å#aA¨v„}<àt¢²Ïy™Ö“©É×Ù€í¾6AçÍŠŽÀŽ#ûgðœ™y„¶„Þv&‡xí+# iôµ¦„n{ɥ虃M„Ró) QÑ]OH€?ºŠÀŸ:6=¡ >.@—$zd(#m;BÈj½-@ðgÐÝ…ž IßLÐ-C€îNzBüѰÎðˆ—#õÁË, C²ãC?w}0ÂjÒçè°4ôy>E|¶çÄû6‰î´'Üæk¢ÜNC€î®DÈ–|•èb¸æ@w×G"$Žžkä)Åtc…8‚P‰{fts.k¾ ‰Ew},BîãÅf CïeŒ1¼é åè§Œ„ró–G êÝÛžPl>Ø tX‚ùІ]Œ°:õÓj„„bôš‡]Œ°ÜôX9Ì„BõXìŽ ´é†RÐÍðS­{˜{ùþÝ~p=Œ‘~¾yɵ[á§ßÞß¾Ú|x}óÓ/o~Ùü÷ÃÍÿzó÷Í÷óÇwóÇ#îƒZ Ðõ’±®Ë„ÙôAÍšgÇ/ºŽ#fÓ5«Ðužß*t]F Ì&v9›Yõ¬ÅL„ fG8þ&õ„4g„15õB¹'”€<#ŒeÌ.!Ô¯°,òŒ0–²/eÂl¬óG¬ç= •!Sáø›ÒÍH+ÂMš aáï‹È<6µ'„X&u†e0âF­§cˆ6³Í)B©@æÍ›ž YX2)e$Cð§_aiB¬É3þàÓk"¸ÛžL¯-@§Œ¤qþÜõ„ÈòtŠHšËüÙôõüi‹-0’Žº>e@7+×sÍ ø3è¶áHÍ øÓv5+Ì.ŽÀŸ­ô¢tÇè2 ;–~´íƒQÎÁ³ø>׬0»8è¶©CÔŒ$oè&B‘Éü ÛöÁ(#I°…’”!îºÕ#¥¤æeI€€[†$@[ëK²ªö™òZã8G]ÛýÊÖO0pÔ¯ê {áFX~â>¤½4nF3ŸøB_xÉðW´lÊ´ °µ´{´Ž¸ßJvÌ—£ äJÒâT<Ÿ¶‚ •ŒCrÖ•Y}L²§%{n»¹-¾b5àYž² ùÝ®*ÝÝèîci5.dW´øzå¥#¶q"® yžÎwý”Ï÷€ìRŠ`ÇÄ“cÊÅ)ôIÑ) >®¶ê9AíÀϱlæòýrtO¸ÇÞŒ¯ËÃóµÝ¯ÌŸ…¯ÃéÚÓ¼{+´#Ì??Ÿ·ä:TBëHÁ22?ChÑ# Äwä,¥=ÎO„ÞµL›KÕ>½B]Ke%«±k¶'¢òÏkê©Ô5ø )Nõ}ž±ì‹Öé%C²ëmMŒ ^9ƒp<ϨŒ#&áP"nJÖâ‘^r—:MéfÄ÷/Оf‚k×?dWFúåîº  «µf_0OÕ;tb)’o¶“ÏñZcÀP¡¶uÕÜÃBÎñŠÚÙc(h}ŠïëZº­À¦y¹³<Ëš=0t,fCW±ú´8î™ÕÅêŒG¹ØS»J$¼âJä O_3ŽXW­ôá2û…°tE'Ò²IO¼Ã8&¶ëbMYEUñZl‡5|VåÔœGëð; YÄyG ‡Iñ"ÜVƒÏXζéú*‡wçIâðš]¦3!<®}(Ó)l¯|^Š¢Ïâ¿ °e…ž«WÌ®˜ÐÅû±iÞyŽûæcã}nDŽ‚…šy$ÕëþÍå§Ew¹åÆPÿ9Îûï¢ì4ÌCG”ûŽÚñÃáê¼”jìëUcÓ™­«cr7€£½‡wŽzuñ=+9\&ãxÆK¶ó¼âvåÍo½Ò²xEò5!*wþÕa¯ ׆ñ ª «áX…ðd©µìy “buÂûɬQ0玣<¯9¯v’&žhwV Oƒºœ²ç­xп×ËÎø:Èó†ÃƒT”•·&ÏäJõÓ=U¹"3.ƒ œgIBÂêÍŠDŸ+/iËÓîõh€Ë¨g„ÄËU4>‹‹¯5ÄÉa—k–è­¤=Âóh` åsþT$[Kòbx÷4}~± ÚW’¦Êbå12™+õ|‡@¬>û”ûñ’qÔäwVÛ;µ¶yêæYŒubÛÑȶpìWSn©ú2g;2Öæi®»™á³7›®æ1ѱ´xšZ´ø¢Õä©G•ü® ;Év]p^U_x}dâu¥>6sôÓ5¬5 ïKCˆ¶òVÂËtw†Už2~ºÜ”÷ÄŒ9A#‡]o9$?m¡,^§†‹¯Â[q‘ÔÇ9> stream xÚÝ\K“ÛÆ¾çW°r–EóÀ [‡È§”8Jœ('¯Ú…ÍÇ µ’}ºç…p@`—´b§¤*`cú1=ßô4ºwñ~Aü# Iá¶Xm/ß,¾ü6_,-³rñæÝ‚äiÉK¼!on~H¾Ùmoš®Ùm¯–Œ±ä:a)×Wú[³Ç+Oº»Z߸o›Mµ¶¤»¶¹m¶ÕZ“ódÿißÕýëî¾¾½ZÒ"Ù¶7úûj·ÝwmÕl¯¨H:5>U\izõ㛿‚KR¤9OZñPÍYÝ/œØ†zUíký»•fS}l6Í/Ž8ªäÍÁªØ+Äç($A¡ H¡e-wRjîp¹ã“_~K2¾Isãá@««œ$»ÍýºÞÔÛ®j?Á£¤\W«Ÿ·õG⩲ıÔc. òT3dzµä¬L^uZš¶~hÚzÿ ¾R’¼Sö…ûuµBõî´¬vÞ­>Õác³^*VKZ¢v >Kó\±h” ´`j¶h~Òµ‡Uwhµçà/®ò<©Ú¦z»vf ¾Ì´HËÜÈüÑR°…LK‰¿‹”2à™ÊBQüQ;O ]8 P$«W–©n`Z-Mƒ~‰7¯“õõ~¸‚)·¿îÌõp¯\¡n­¾kàã|ö°ïú_eR럪U×|ÀŸk#‰õ—ºÝiM¯FS–%˜¼á„%ùîŸÓŸ:|@yèoÐÁï5Õˆ¥A5&l%>Ç—hlGQá—›‚Tl–Ø‚Ÿšb²p[&ŠÝ&ΈÝ69á3 .Kéi¨ã„º™JË#6|Êíñå& ‰ [¤ÜÎÃWWK"Dò/R_Ü·¯ôes‘vˆ/¢f®vju¼m¶õ^€fãÞ™°e[û«Ô.¢çqåaU£O@¤;œZ© i†±QôáQôOヷÇçM*Ê”¡×ƒ÷ íöû](L« †@6¾ÚˆêGÀÝÏ´äš´Œ‹Ms\ù¿… %Û HaZ¬7iТeZ§98 *Ä¡fÒ\YÔQX äÃUGÕñZÌTüý®Â»®¬+ó䦹ΫÛZïÐúæ¾¹Ýî 7ãÓùpW§jû=‹gšÌ\Ê@Sæ«C6­9ü6Ïô§Ã¶y¨×ŸLz ±8œ·õqÊ;C4¡ÏdJÛŽámÆÅEðÿÙ냗½¹ ¢Â} ³,ñùø¼—¤Ÿwm¾@ —ð€ÏJ¸zçPõý8ƒÃ…Ÿ˜’ÊÒzy|RáµRO3|yh›®«·æ ’‚éƒíà” ;Ø %³ßÙ|Ú9£iÞïÉ××íaƒåFɼÐnõÇXÃRj÷újo%X›McÿÜ"àûEÊÊbñ°È…ž¸'ÕdY/.è‚9Éj ChioœÖ’SÏþ–'óh¡ñK.´_ݦj§f°Kï²< Ö7F¨aó ~¼„ÇKîϺðu*”ÞTДŲ,‹&4)ŽWÛðk £ŠØq¨ôéD¦)Ìé}Ë4\˜aêS#p›û ãqƒ5…H„¶ãžæ-L¶1ß²o?ÁARLîÌca·GÇÂÛ@Cá4Á Ã)‘ ™{-"¢ºÝŠêï'ãÖ W)è9ÖpHmYøX>΂ˆøL& HOÎHiÆçüIÉîlG¬¨>2ˆQd%c3@Š1½ŠL%eÕ\“Ù¹P'1ª“o2²à×Ç|X,]óVÉŒàŸ]ó½’ž€C@²YÊxง1…=ûiôÓc:K§E™RúÈ7,1}<ãc¬Â‡(Ÿ‰ƒº…«ät&âŠ^Éé¸Âqe Å,Žô,ž´:¤8ö!èLbLÀ~"vÖT>c¬ЙŠGfL”ƒ Ëb,#åp$j¨ù‹ÓAŠc‚Î$ÆÌ˜(ù؉ʟŽ1VèÄ1M]øqŒ~zLg!Õ¹–a"Ižˆ/ÄÅ1æ÷€eΘp;/yÆ<+^깇À7s!û§ã\Ï>¾1ö¥TU-û±ÓrÿN Ë„‘…FDšÅ.—£Çe‹ŽÎüœÉÎ ‹œŽý[' ô\W´ÈÙ³±uŒ=“ÇìOøñ!;ÓØ”3ȧ¦N,;k z‘ACæE}æé)Du=£®&DÊS09öÏ`r[3Ày‹{3ž‡ÅŽ{ÎSX°?‹ûœ§°Øgÿ„ÅÖpžÂâ3'Ãa±e?ç),>Ó;ö!8OañL_ø½a±µÆœÇ±8¨õ±Ã©®Áa€8p¨×eø6Þ4Ðlw]­{gt?~òÊz¸×÷ÄU7?YÀ-ULöÈlbÇpÐtw•éìi:óÁìðdµ;躂º½¯Ú.ܪô(;7K^½H¦À‡%šUmÍ‚} í¾Â–"™ëÒOõKåªetc….ðÑ5lÕýýú“ëUqe>¦N‘ñózÀtSROªXˤ^u¶+ÄÖÙF.>(¯RDÕ¾o“×W®Â»¼—XþF­ß€ýhüe‡I-Ðg¼ÕD/c-…ªí·.Äœ7yzQ¾ŽI§`¹ ,-X±8X)ÈSäü\â9lùQ¶h 5 µ+w=»„š K¨©°Ý‹wu]„Œ¦ÙÌZË"˜Œi’‰.ЖI¥/×I¡½®ÆëE{ýã;Ký¶Ú7«Yô¥d‘ÒbQN¨"qG1ÒBÅc,ö:f1НÕ/n1 Dj\iàv·]Z;26]C ѽ,g›ñu3Ù«gš´JªJ¾ú Ï—Øï(©­UØ…m~E–‹S©ûdñjôÀ°Â‘°£EýÖlýoüiÐúÌ´Xî,½¾V[³ßá#ŽºõÁë k ʳì뤷™M6¦¶C§ðgô×Á(]#§¶S䦆È`£ë¢ñ{cˆl»1nÐÕÞ~ÜW·šM™bs.bÛY;<ìëßâçv·lÜñöiU œÛÈÛ¡ƒcá·0…ßz+ 2ÓÉ ‚4'‹tl½Ë«HÜYö ù“©›€9:¼ï!ûSüxlG-‰áó#Å›x 5dŽæ:c$Gg§[áTylvêìQöKÖ”2\'YÄ8”ãVj­—Xºc>gè’&‰Æ<ÇHøBq=Š#6ƒ¹ž”°ëï“ó~¿_ÿÊAsSïÃ?r€Î­†WoíÑžÝT]Û|4TQ)Š[ƒà¦|œä>ò éH‘—W 4âôåguú<Ûå­¼cgVN9?÷}_;ÆüŸyž1æÿâ,ÿÏ'­Ó'æºD—ò}ó}­>Œë?ÅQZOnº£† ö•>k¦ë?¿ëòÓ®[>œŽºº{l2HúÈ^EV~F½üuâet”‘O*g=OSüKƒãLÙ‡í3§aùeÄ<(±˜¹_GeqݰO߉7Fû³æ#Œz‰¯Õ‹K©äªô> stream xÚÍ[K㸾çW9ÉØ¶"¾$jsÈÙ A0À&SœƒÚfOk#[=’¼=½ØŸ*>$ʦlu,f0–HЬ*V}õ 'ú‘(…?$Ê)üM£í>úþ>úÃ""iR¤EtÿÝk|É¢ûÝ¿â—'ÕªÕ¿ïÿ ƒñF±4É$ŒÅA[7€EyRäØÍXaM’¬Ð#¾·#üuà)…w7¤êVk*X\â^Ñ,VÛ¾iMsóhÚ›‡ÕZˆø'èª`L+Ó¿màWÆj“’l[©võnÊÞ|ûPvÕÖMÿ”mU>Ôª» 1H¹L_ÌáÇ0‡’_â0Ÿå0[Ì!.»fi‘ä°D½òÌ‹ÍamùÆ× ßÉjÍ9‹?68ÕËѺ¾ê}uødZ61K(߬î¼Wb_a²ÃÎk›•y« }×dž)jUî:óØ7ßj' cÑšòDÍÁ&m Rì¦8¥Ê|‘Ó„g¶ÿ§Ð÷Y’å¶?´eERÛ œ6Šh ð~fh=2‘2\&u\|»JÉ ·Dà¶ZzR*Î)Ê–i5”ó2' CæÄ’]['÷Ö ÉN&i6.³\|SÁdÌßNžÏ 'ÏèeÉë’É/2#–üªXøu­"ž\¾ ¡ Éî  .4M‘8^¾ ÌÀ’”ÙnšYB×\ÐD c˜YœÁ÷myèž5(5Ý€¦¡²pRí”5u8D ™ŠOä<)ûák׫½#“>§YŽÀºÒé, ñ+QDký¯¯žìe")0nÝ]Pöë"aVËô?žO£qã|šât 8•ä™-²¬1¹AB22ªíM3'!N= ]1þ1N¤”¡5® Id¶¯¦nsB»¶ÊÉN%5ÕwÄOR‚r ‰ ‹äº?ÊayH3OXá áú<3ºRð°NuEøÂ§IQÜ òSX€8¹P‚ °dmø4Þ–¬U¿´Uß«ƒ ¬Í?6umb.lïÒÉL:-eÁMïføµön°v3c€ðDÅ©žC–ùî‹A²ñÝÅTÅO"ôÍ¡øTosf`gPÜå÷¿ÝÀÑ¢°çcrϹ•è.¬’ñp„Q~ “gŽÜz®ûþV~—û M‰‹xÒ±î«çºRmd/¥ˆ‘éeG"imr>Ú*äùT“=¡FZFUQ@ªa„x™MÛ*Iäq££ hÔ©üªÏDz®z„‡WÃø¶9t{TCއT7a9L‚éëcÓ*»Æ$xx*ñ[< 0Á÷åÁ¬ EO˜öõ^:ÕUŸ:]âñýSeq«`˼Mýó ¡ dl¼ízz˜_éÐÆŠl†$MPtÿtoø¿ÿÙ>´ŸL zì6‚a$ˆ[!!Ú0ª“_ã‡î›É3ž0* _» šS™Œ*R‚Ò›&i4B°‹&7iš†TI8—Ê\Žu9OoÆÄìÄb‡>•ä,ÊúJŒÏaã½¥V&çùÊWd’®|†$9&aٳ벗'²§"_ÇõD¾ß\îÍÔ(˜«_PvÍuÂîyŒ#°r«¬%fdš™5œæ0ÀLhUŽû”.õÕm³÷Ъ×zÆ NmŸ¢õxõl*ˆ?FuÀÐį-IUfx8‹©²³¬a±¡…ƒ¥ìæ•¢+FòÎ*%IȵÓô[ðzÁšÉ Ì™¼=•½€LkJé‚òÜráŸT xñ6?óÛÞ¿Jõ¾s3wx¹ ÂK ŸÓ.Kç÷ÞA]]BVÛú…+ól“`>›kðÔ#Øc>IR@ÊÚ „pvÈB+ÓX©{Sæ:$,HÆGÁÏ ÑžÓÑúÛ 5vAž“„ÝL¥È¼J™7›6€ÔŒŽL‹£DTûçZ}±­x˜SGí”묄nVñ ÆA£¸»àvædiÐÿn,·€BqU©Fú„Èï>eoñËï>¢'Ύ̘«)]/í;Ùf\F5øZ[£ó¶Vž9øG²~rÞ5ÎëZ 6”Nv¢]R»)`½ ñî¸] jŸa‘ƒX ³éú.”×r¬7˜IÜÚ“\}p-¼\S®Àó,ËD˜‚ñL1Ãé¡Êޤ²§Â/ØaŠ 4îÊÊè<•¶JQd¸Â VrÇs䮩Mv:9Dz‰¼Aåsªÿ:+Nï† ]JÈÇ¿±ó;³;ç vA‡3ä{®’ã$ïUtlÃ$©B׸3}‘ˆÜßUnPY !-Òá+Ó£ï@«ú|¬ŒªÔxS@ƽéïû«§‚ÃTШ†.¢aªþöêêÐ)×VöÃD¯¦ÍªüáëNé¨ENRî•ÕZ‡~M¡Œ2bT~íÙ¢WèË Y,£ÖhaT÷\n•ÿ!³ÓÁ´Lî;•5ÍQÊg:3-7 Y2ª_&'g@SWöU÷øj kÌÒ@`çHÔBÆû‚ñ_í,û¦UÍXˆlm³Ý·£%xöT0_R†OT›ǰ¸Îpq™XvÔÁFèäîÎ&®…Üñ4n€žÚj¶ÐM©€ã‚‰ñÐ]`*OÆÂÊX×w«Ö4ÙsçãaXú´JœqPbçN‘D¼Ù´ÇZ9™s,ëŸÊ¼`ºÜýþ»ÕšCZhb­Â¹Âcæ±´$ÙÏ¢#1žæãð“Ò·‰ø‹j jõ›öY¿àŠÀÉ`8g…«ƒ?*t<0íC­B—#fY"¬ž¿T ­sêÓwOBV 9æ4WVË< Æ²:«@ã'¹aÈ6RµÆ+td(Éé±^ ÆŽÞ ^ìòðô¨ìÂz¸'?èÕgjì<ÚŽ á\iHîÁ¢YÓH}mxðø×ãrWÌÚÄ.ŠÐíÒ+–i»-;52öå—j_ýR"±Î 8|Љˆè̆Ì_ñúÕ> stream xÚÕWMs›0½÷Wp„iQõ RfzÉLsèÁ3úV÷€m9&cC 8Iûë»’ƒ­˜4é¥cHhµÚ}û´Z?`ø‘ ¥ðÇÁj\σ7" )¬‚ù†cÓI‚ùú{øí°¬›¼94yqý˜YB E‚Ã#ûÔ ° E*µÃˆ2P‡e%®[‰ár¦•½È¦*÷Q̘ !C„,"×Ë‹ˆ&aSš^jÇëÆ#š†ÚµWYáz—ïó"kÚïˬÎW¦©Â‡Hˆ0«òl¹ÓµÓ—k7¦Ÿî+]×nN³m'—Ë(Ix§WMþà3ŽÄ©B)ÿÂZ_»_f ƒ¹Uy¸ÝºNQqop僕p…8*áiôþö§Q-òŸ¼:("´X‡†#àëâ<·úÔh}.V)¢æPgÔ"lE’G´ãÃcì3L".[‘n bg—D’íê Z‰Nñ­ÀmXz%³-}ü$ "r@ЙÇi‰ð€Ÿ†s”Òð½òôhØ+ ŸùÑ‚å{̧÷ØÌ¿ÇÄÑ¿éÐ:µœ-wkp+½ÜH“ —pŒŒ‰ v&ňÑvÀ;c#Ä’iüÄ~ÉØ/® ~ü"'M‹¼~åkŸÎn·ð Th}–êj‚êÌR]<}e‡;özuЗçð7ð‹\$}Á E*îÆþ ÁÎ]=çÓ1¼€O³ó…lHN2ÁéÉŠ’A »ÀžóDÉ|ìyÁ"~D¦p ù8?z”PñWÞúYȧY8 Í›hÈ&iÈF4äa:ÎsGòúÜGùŸá4ޮ癩¹òB.ÂF “]EÁ|š ÊjMñia³v˜ñ–~1IÄŽO‡ÕM$YèŠKåŠK+m{ycÞ*Ìk÷®µ.ÜH³ÍÚ±J¯+½vUY7^Ø”Dôr„Ó¿î¼åÔ.½D½-# níÌ1½êÝÖ6ížòÔ~ß øRþL( gã Õe—8ÖúJPZ¬[xʽMYëàfRš( *á¾Ü•£r·+í½ç%5^OŸCr²T“—RŸ €Sâ$òbt§ue=à±´¨”ÄÄ6à)ÃöQnNn«CUiw…q7Ž>u¹;˜0}€.ÇaŽ4Šbžàðq›wˆ]VT»((å¼cæNfŒ¯ô>ˋڈ@cö6+nõÙŸçç×?J…ÙŽq’¦Hº A0ëÄ¿¾ûã=Ty endstream endobj 647 0 obj <> stream xÚÙ’Û¸ñ=_ÁG*YÁÄAŒ+»I¼å+ñîÌ[”Ú¢4œ®yÈ$åñlåãÓH¢4ã”TEœFßÝ><ˆàǃDÀ? uðÃmðæ]pŤÒÁí=LoyÄ2hßý;TLl¶œ ~ø¸ÙÊ$÷y_öÔìÚÓP6E¿ùÏíOÁßo Wç,‹c KELgãZ>TG·ësÀd–OAœ±T™ * ê@K–&®[7ÁÏ+L‹ì!ûû3¸‰fBOpÓˆ‰ì%¸Ó" ·øZöƒ½÷ésØÈ(|,à#ÂO8¤Âòž¦†ÇâŒZ÷ùah»ò÷|(Û††,PDøÍ»4@²G¿µç‹˜Å©9ÿæ¹ikFkOô·©b´£l†Í6&Zÿº¿ÿ•Û™î±k÷4ùÇ»ÍÛ5 ,8ž²Xx¿ék¶±rÌ2å/}dPIJdÀ†%ƒJ²%pö¾íhn\8u]ÑlD i˜÷}»Ù XTæCqGƒOåð¸€ÑͪâPî"®ÜB¼yUÔ´Ö!+ƒ¹ÖÖÝD2í PÉ›;jÀ]HÔ-Ý<âûeó²ÊáÖöv0uhëãi0÷¡˜[daΪ’%2Ò,MBtf¬\áD’1ÎíÚÎòËÀoÚfû{ѵŒî)Ó˜iî_ô_x©§²G¹•Ò 04bÔq ¥Tán.9‘/ më)᪯’œ0\ÆÚ"‘aØ1 ÓÄ03ðh‰ŽŒvÄãþ ÁBXŠÔkHfÏR¬E`Ox?d"°{¢ÒhiC³슴ó‡¶:ÕMÏi.Ã÷ áüã‡ÿ˜.iˆ|ܨ=ÁØo@NœIÃ:ºòëbš3åää‡5ÄKì´ççôé?ŸòŽ0Ù*®Y2S¾lNU‚,ÀØY -ÃöžÆ ¿Ì@wWt«¬ˆÚáˬȦKƒzˆX†Om_|KJ:ãЂy°úÝ¢V ZšDSq ¡]˜Ÿ¾–U™wÏ4<}ÓvÔî‡îtyÎ«ÝÆj?0Ý´¹+Q›‘J’CD€sW }iÐÀ`w¿ƶ˜´è¾­*. $ ÕyÙP«òWå€ÓÏvöÜô/?ÚF÷`->øm–%H.§,’à#"PzòÖ<š¶ãN»i&IÊô,2aZ˜]»pUΙP iÒsiõæ·UqdÚÍÿs•Ù£ù·"I¿à'½€ŽxYÚð~Ÿ ý¥Cg+wQ­›»›}¿‚YŠ~Ïa@bDޤÇËK  Éí…ëƒ2ÙoWŽÙÕÆÃ XÅͲ'ô+kÀ$gzq÷9-¥ò5[¦NòÒðÔXÉ¢®S]l£êÎÖ^Q]³^¯ºRfNu쨺ÔY¨®Á ¥Mž¶âðLûÞ®J…RL‰+Ì„ˆ.õ¬™8 Q]⫹u6tåCÙäõਇõTzX% 4e² ÌBM¸“K%±„ñ+E#–4½%ö!‰u<’XG‰ ÚKà!1¬œ¬/h >F\ÒÀ,šh¹®‚qâ© ðóŠ fòµ*è˜&Y¢}¦QW6àÃF~zÀXyeŒ±J}&8vð,@XrPœsp!dѸä’1¯!Þº "ã /ÈÈnãIÉäCeìK‰Z“e¥VæUE3jflT´ådŒ>?fþt+E„²¥FÙ¢¡¥#„!ãáK|Ãí)¡éQBÁ„dÅXc3j˜ßœöÚP¿«´±if4xêž¾ÞI ž’šE× 0$‘W96F¾Žco„+t/E/D ²Ô+ž”K̽,6dÊ4Äï‡!·‘Ü `È’øº*Œ>ÿŠ1“ú[­™â|”S@s’SÓYÊ) 9…/Ʀ6ÞÃî\ZaÀÆ{$°¹cN}Qb![Ä{¸ï,Ey·I1ÊE R£ˆ·§žº"ï[ƒ;Èk9зΠ†ÎÜÐH \ 8}OøÂœ¹|û¶ú²q«TXA–wv깊Ú@i/ºœH°œÑµÄ e©³-&ÄÑàéì#fE:üRÞYd†GçHeš°t–EÍÝÚ¾/÷e5‘Ëç¢1ûVY!±³i¾SÙ(¦ÈØŒ•†æbv‹1ï”îuåØ89vM+ÚûUHÐ-~=9âÉh‡Ç| À%fê’ àHm/ÐGH‡öÖ’B%,Jg1Ý'—PŠ™H‰h 1 S¤+ÃùŽtÊ@—œ!à+wRh¢¶Œ ¡sãnüc,/% YŒ>q–.«X+ÂJæE‚1XúGPO Õ#O¹§$–Â×òºèlØ%LĪûX²t‘6 ¯4 ýÒs*[¤s·F %’ày“*ƒ¢p…ËuÐ\–ë„r qϨÛ|Ôá¶~‡´YƒÈÚó|’Àü'£êÅÑ‚'«Á­cPw_¼]äß˯cQù¦¥u²5Ðqõ)=Õ§(7í¨Ñb ˆš~©ê‚¼ylO¦Þ`švÀ4 ˜Ñlå¥ . Û‚ëÁ8ðn´Þny‰ï>X P3!Âí9¤Üfûåø'ŒÍµE Œ‚= m‹RDET0Y/ú8‚ƒÈ4ìØ6…øæô!«ø„Äx$Ç…(§|~Yf·ºŸÛÙxÀxú"x5 F—)R–¨6±Ô—鄯"yJ9_X”-Jù`mºV ¶Û`Gq«’ä «ò.ŠyV™z"õ\¤±áÍçö–Q©Pñl$›$;ß|O [p4¨D–ïÚh f³½}mˆVøì×|ŽÒËUåq2?+0¤Ù8Ò÷Ðå5u(ˆì‚Y矬'Æ^ê,Œ,±tçäkuÜòô×Öq•i]Ì€¬›ò˵K«…å%÷r& ¹7t#_$š}f„3 jÅ\zÌY|ï/¿÷à)§ÛáÅÇ;Çݹ˜¿Î‘~í{ÌÊ ˆ= ß`’o{ƒ‰c‰ÑÿÙ+̈éÿÿ ó·¢?tåñ‚÷=³Ò·æâYvM0±pœx‚9ÑsE0½`ÑR¸§w’{ª‰¢3i„Yz ‰¢iýì­Ç€Íå[µ×cÌROûŠpþúƒ£SÄBíyöú²+ׂŤ#2Ot&øâ˲ë(ã šLop—ÅØ÷å[À·$¥¸¾[-"¬Íkº´6%™Ö„ €°X¹Ä$¦ÄlxMº­°> te²~ˆK ;zsÚ÷pq'FW®î)”Чã«çÙ &å´ç;Bä˜?ßrrc¡m„’¥/œ)¬JŽ[Ü[•Oí-Â…5 eñ‚•©©„ž”Ë> stream xÚ­XYÜ6~ϯò¤^¸Ô…}ZÇqàÅÂNÖ“§t`p$ö RòÌùñ[Å"%õ‘žÙ ðÀÍ£T¬›_1ø-ˆƒþÅA‘À_Ô]ðú&øæmÄ«¢*¸ÙqÆ*lq!nšŸÃ›{¹Ù¦qÞ £ £p/êqÐêw1ª¡§]ÚŠÃzèÓ(šíõÐÑh·3µc½Iòðþkb#¿l’"”=ÍÔÞqéW>*3šW8ÉB3Ðâ襇C«ê•=ÜiÑm~¹ù7ˆï´HY–Y-:G=iž†“A&9wÜ` ‡iT½´ó6.׉"–$`6ds×>Ýî?‘hŽzm½‚3ž9Z”¼AûÆŽRp}ª·( O- K¢ÕR4O4YŒŒúatœú­EÛ.¼É J^¬MpEÇ´`y¼RÑK#/©X2­=?MÁö³+“2DáÒÇ_}Ô‚èhп2’±ªX‘ƒˆ%ËÒ%Öx\^“5YY^‘5ŽÖÂV,ò¾k†M1ç Úð\9ÎY‘:zÉ(Pa'›-(7ô¨dކ$öô;zÑÑ©5+Úv"âÆ.TL²Í6¯*0˜êDKVH¢˜eGž‚!{5“hiôe“aDLÒì6Ì ¾¶J´6ãå8éþR|FxK,Ud÷ oÊs8ÊG% O£–î…!·ÞZsHéÖÍT×Ò˜ýÔ¶O´â+»äÅ-œ‹¢¤$ñ÷ÿùáÓw¯ÿõæõ¥€;–/yÃ3ÈëQ«Gû5eËÀbÊf/¬¼¡µ ì:ÊCXú©Ãÿ‘*¥¦ t.þ:ŸâpŠéQµJè'Z gÁÀŒzªÁð¢Ým¬ù”[áI­Äm+ %ˆr–¤t‹ÞFt’ö„9Ùº,+PZY@¸÷à¾SýÉ÷P&A‚Î},@¬Ï²_ì¥ïÞÿ¼—ŽãhöJä´6ª¿›Z¡]ePãý‰¬|.@Iƒ:S+±x]Úd‘öÛïßüÒª¶ÝÖCß(Ìic wmBsŒ¹Ñø¨wDϸˆ%Ë ÍÀw’”ûî†.ç˜qÌ*, ”¿1Ô4òg K7Û8N2,…þ³ß–Veðd+9~Q²2 º OYYÌó6øüxጙj>çvƺÈY’¯X—PUªgYÏT3ë逷wØ‚ EþA?õ&Â{ ?qø+.qº? Ÿ·E6û †§• –¨R!™=‚*LŽ<¯¤[/dƲÒÊøñ©xÒ‘[Ž0BÁ`îMYLé®zÈéŒü‚ˆa:ØóvvŽ9H»ÿøa·ùç%!Ç—ÔtufÒw{*“ãY½<ǰDv♯ÖN0ý<™‘(V˜Y¦ƒÑ‚é Àt¶ÎæKU½Š7N.ñÅBܦeÁÊäË8klÓŠ‡¿K=འóN×ÊÈWxç:LYù©Îã¤òqReG7ZEqŠùЄ1Òo+…qá¯é¬x9Ã+n…Ó+¿Ekú¡ß’äÏÜæß]2AÈÎóãœùÿ§Ã&³ñuóÆÉYéÁ¡–h™w;)zCC¨À6lMFr„븅 çZî¢8ƒ…–)8D'åxº£³åhî*¯C‡yŠlm±·›2…ë+%à¸GÑZùŠfTncßQØ»9©@6©gì»+2òLwòx¤ÝNŽ÷¹œÌÐ9º€\÷gLêIk‡ ia¾J¢ÕU…êBhyhEM¥¯‚t=JQ†ˆ˜Ë(ìåíÍ"Àx¼·‘ÛwŠ6ËG°O•‹$°6KbyÄÆãÙ†®W ·pÞò—4ÍgnÖ EDŽlY™„ïús…à·¾„FPéFë€I¼ããÅññyÌ%á={Ž>9‘†GÑÂ!qU é«’[³@jÅ-¾VžŽ4úú¡†âAúÁLmCøÅU˜K7ÿ¨:‰ÃLXjI8[§ö×SÍiÀ‚‡C¬cÔi¶ª%­Î”sTž_©+v¥-vk|ÂmH¥3D–ÚâàÝ[Ô£d-­úÏ“†Ì¼Ü‰cãþDÁpÈVø¦½ ~×"Ãøy=ÇÂÛÐÈVØuMè  ä8sßöÍv€B”Ò‚ÔzзEÂói á%‰Eùh‚5ÿKWh½=uW+6ß(_Ø[ΑÒÐÊÖ|?‚®×6¸7‡,R†,ìî,&¦}¯Ý©) ßü¥Müê‚ÄI]UÁS@¡ßi¨baiÆ+c¥;ÔMê3¾ÌØ|FÀ=~J¡B‘¸} øý•4Ýg÷añ䪖i‹‡2e…£%•Jꋸ%\ i$~âgWpàó†§ùK’ä4Àt•G ­ˆÑ'BÅøˆñ0l6¸|M—ÔMé!ÌášÆKg,–ž†Ðõ"ãœEñÜBðç[ˆŒ§s áæÏ´«sîäxÆ»„ ¾Xñ.˜<ËÚÍœo÷õá¨sÄ¥ Ô8\ï èZp¥‡–ÈBCÿ ña.¶V€¿ÐdeÉbjM¿ ªYÚ°Í'Ôâ¼9xµî!PM» òu/mÞH u°Ú¾ u ¸ò*xç¦Ù*½ø—ËLäŸÓ¼[\á%·–ÇZn- ‹å­æú÷Š"š¤¶f—9¾à6´dᬬALñUÆ¥]Š«´[p½«]|y¹öö…1ÆÝpJÌ)HUúøùÆ»ZÁ Ä=áêå%=yñ‘³6_Q†}O^@ÿSYáã(óä?~õ?,¥^¢ endstream endobj 653 0 obj <> stream xÚ­XÛŽÛF }ïW}(ä`=Ñ\%#èKÒ¤@ â>u‹@–Çkµ²¥Jò:[ôãKG²ä•½[´HÏ…"9òðL‚?Dð‡±€¿Qí‚×Ëàå;ðˆ-¢E°Ü\³… æ¸`‚åú×ðÍ¡®í~&â°Í…áýLë0-¶¡y¹Á_¶[Kƒ¬q¶uYD•Öéζ¶nH ­½dÓ–µ]Ó8ßûÍÙoËŸÀ)ž ¼:aq ¾£GwEõeµÉ*/8ô^%LtbM[²öPÛP¬txÜæcKNõîöÞMžK!Ø"€H¦µÓ ò» ÓÂ0+™®@s–9… N-U¶%›ÍÕB„ïf D­¦ÕáÚ¶i^`,hÖdu^µ9DÒ-`Œñ×9ƒþpÓÑ‚K|N´ÌÈ.ZÖ’CY¹ÛÙ3ÇÏŒ×å¡Í÷v:^R0)†ñBÛ^r"yãÀÒß öök‹#H•ê±F„y%#³¤eΦ%¥-Cr<Æc«]š÷òK:¤Ã¡ÆëK²q+Ú_uç××ÎÏáø‰„þîêÉÕ¢;yãm`à34?ß”ÅS&ŽÃwyÝ´7tyK¢iQ”XgG÷©<¹—VU‘gi—=:¬êòrܹ)Ï™X /¨\AîíóýØâÂÇ(xռⱋ‡â ªóØ×9 ë &4î¬ÐÑú<'t°õ>-håÇ÷¦/|d8ªRѰdgå®:´÷hx‚t¿¦|9ÐÕ­ÓÖžeÒ*m\Œ!•6i¸“ÿ•ž²i:|IW¢vSW\($¦*Ç•.7Ü„•« § .ñ8÷ùÚ \ €>Nr®(°)ýÜ6鸸²Åº9w ó÷0Ì»sŽŠó2:(=]˜€ñiã{ÜÚóÍqÒ¹]úš¶kY`‰.9Ýß9"lÊ]gg˜c¸uÊ1º¹·Kêa\œ³kã’Ã$X]è¼b‚éÙœs¡ñ¼ÝgL²½`‰¢/ 0v‘,‰ûy|>MØHy;rt'œI=Ðh&“'u¤¼nwGsëðoúÉf2êC«>¿ak”ß^º$(¤0ÆjXªhêí ÍtâÌ~Ø—…||1ãø ŒxÃ}™CÙhŠyßnÝ òaE{/>ÞÐ(@ðŸÔ£B¿' ,™@ik󚂾¶›ôP´49Uñëþ ám[¡‹FœÀÚáœ4¼c FžÔðñAA€` Õ2òZ;‰b<~v?1‰õºÅ¹2ŽCz°—ðA<¢öžuE¼G3 ¥[Û¶Îí= •FQÏù r~\Â'ÎÝ>¥û}£G>JŒÂ’>, J®£ÝËa‘1`£zÞ» p¡i3¢¿Ë­ç&0KzHT§§•ˆï¤FʉVãâ*uwÿÇÿMkÜv/›]^åEÞRË…»ëÒ¢«È,=¸š¾h„ïjNûÁaZ·Xûå]Ú·ï¯Ñ5H›Ö´»ÇÎåÄ óÁÆŠ¶kï=á=öúâUU“â_µ*¶yl˜‰Gݵtï*ŽÇJ[‘ßüîJwnb oô\ä‘éÄ?}óTÖ× endstream endobj 656 0 obj <> stream xÚÍZY“ܶ~ϯ˜GNEà ÀCqò°‰V%—œÄÑê)Jmq9ØZ¾nîêÊ­ø­bÿ‚U^­.®VºLV,ðÓ ]]ÝÂò¢ÕÕö?Þßšz2¯o›r½ îí³6«T¯Únýß«ïáU9{•I?ðzâËP¿~µ+:xO„ú½»6ÛïðQx[Õåmq³ÞðÄSÍeeI´7YW˜¹Û,ï›¶ø”õœDOå0à±=’amޤŸó¡mÐD^_>à÷†NméíÂpéwŠû,Gvï7Zž!ô¥Ô"dwÊ_od{o*¤ÄCÇ^S90«aóކÍ-ýê#Föˆòàˆ@µêàe9{Žßíµjšz[Ôw4_©Ùö#'-¼MòÀD×·CÞ°Ý;¼ÛQ²»r}s›ï)¤Ÿp F2ßÅhÃS?IàGø’i²¢îAMNò°W.–©/¤aùîÿ6Êþ¹‹7lÎ"Cùòõ¿4É‹«Õ‡•¦Éê~Åxâ ¶Ú$ðƪZ±ù‰4åêÍêG²éÏ‘ˆùtÜ‹Ëc¾"ôÓtâ+b_„çøZ"Ë÷õÛKTƒðþHÚp ¦~ñ ôÙ™},Í#Çç`º\L\Á £ä[Kdù^^¹ÜšÍ®nM~™ðY:÷õ ãµaxäµ0Õ£í>ìÉxŸŸ²Í‘¨íúâòÚhSδ‰ÓîS‚IFÂóW»[\–/-Áë·ks©wéà„FºgtüË5Ä>í˜ý/Wë\½* #Ú@¾ºÍzõg§¯°(ñãøéâ]¼üÖâ½Ñ1p‡ÿZœâ†ª}©*EÁöM^dm¯Êî——M9Üà”øúÒ¿ü÷ÿ«ô/‹Ÿ1¬«º£ç¶égþ劸¸ú½Ìà3—wÚOhCÇŒoh øÓUðlá÷TÁ“ Â7àâHüW@+béåY§p! phN†~¦œx2ÊÈCC§!2Ÿ„&0Nã^Ù~_ˆŒp²oh²Êú¶øèTkÄ'îo»'Ó½€†$cÞý®(í¦5ñGQ;šrËšøKY®0—5«·Nƒ2 ¨ç1Ë’€<’¹ö®‘&l–µ‡¦ÚÓyξ†6¡ %'lÈ«ÂT'ñ Wm›áUˆ^±{;Lû1€¤ÝÇöãØÅø|*ïϨ’˜Ä¨êð`2»§ƒ¶Àg‹÷ÓÁàzx¼¬ ÇîšÕÊ-1¢íž`0̼ó~ÈÚ÷zu{_ôŸ€›^T›Õ¹B÷䡸ŒËh¥ß¹D¸“Z+€ý¯'Õ,ZÉwnÔ4²aæD¦³ê Á™¶‰AKçr¸@úÑ”Ó{D~` 6#ê2¥Œ`©§sÛ§ØÄ#ªTxdÊœ05ÎQ€¢GÀù^Lë<¡LýÀ:á`)ÂUì§1®GÚš™Ñí?¹„{gKCGöhÒ±È ÌQ»áÆÄ¨…($¾û= [pSÒÊð.`¢ïÌ £*Si›Ñ"ñ‚Ù½èÍá tÈDQ 5fàÇrq *¢Ø„Š(’-»)Ê‚ 2­Aq Õ"^7Z7ÅùÉ%oøEW2ß"F¯Iœ›DX8Ð&u¦aã/N'ã>““×HP’,0Sá‡X%Â#û|²›QɃ¸¶PaŠÕ ½ñ€¹rÛÈWe< œ1þõ®ÁPð`¤àXag GaÅñ5I÷0aöu?C$ÚtÑÖÐtÑ u^ƒßºéiœ®5&ÙUÔ AÊúÀ‚«ì®.úa«Lq(¹Fdó‚òsÕP¼ÕÒPMÁÅ4A¨a9I—UfÔ6Hx‡gÜû»Ê[1Ërí©Ó¯Ž½Z¨2ëVÀ¾TÙÖlÐвi§ô†Ä„÷»É᥌"ߢw2¦yõ‘à`@3£û8ð«å*ðâ<+ bÈó¡Íò‡uZ¨‰ÀE~.rÀ0eÛeN„`TŽÆ‹Ë#q BR7"jÍã)'‰"Ó(‹ê6àOÆÖÛ„ÛÕÂC`€b²ãV¢`Áü‚ñÑNSnÅ&9ÁÎåÖ$öƒô\r’+åPÕ%^4nC8ö59‡6AáX_1v¦ý‘&AèÙÙµm«¤Øç™ ­ÊjcŠ\ðEòÇXL1a áÕJmõ0¤Ü…½Ô1wag´©»b«ZT>k4€óªêlç5äSÈ.£ÕƒMÕ¼ rÜv(±™4Á§Éz¡‹cì²ÑKwZSC8„÷ÊY1 ² [ÊE1Àc2ªQ»s†¡ôv:XX°¸ÞèOéš.šiðM˜@ ‘*Ì´ Ÿ"º}«À&†Vé–4¬‚ýVEm·ž1êTÖšÚAŸîn"9ŠD&€u=Q™N\3ÔÛÏŒ#ݰ+¿IW@!/ç-\3q®‰‹dl‘ý?ÿq¢_¸û0>(< ç…ƒ iZ˜€‚ÚOP¹”X.:POEë”›ÌÛò 'Pk(‡äw¡ÈGa¾S½y©qz‹'Ạe ‡"A@)p¦‚ ]VÛ‰Sw1' ù#wa5Rô¦*ô‚/N¬ê *\”3‰uQý@Ò%‰Ñ n›²lÐ)î͸‡Ú¢ëñ3 RìÛÆ|3¡kƒ©9ïÛ{[AÀððçXßpÂï@›ÑOÞ”CUÓ¸¹=8Ä¢6S!rä•»Lƒ)@ì ˆšÅ]¡ y|š…T$šÂiÌ@2a ™¹Tþp-C9® ‘‹’–-¾Àp•9PF VPcÄ/UßÔˆ­ μªšòP(RÛà e0/†ßï(•uDgrИEtðBQ™¦+}~X¾mZšœ«˜LÑ8¡ù§Â»ÒÍxZß]Fj]œef´àˆœ“Û»n|jˆÂ[ìZMÙHˆÉôzV -`Ö 2b|3¼cËÞ<´â¬ǃËDÏéñð€MÊwŠË§†…ØAÖ1£~—ÕÎ0ûqâ¼Ò4>³f¤+ؘM¢µ1^dPhÆß‘¨­Ú—Y®¶¦]Dײx&½?‚(ž|Rmó™À®¾íNˆ2ðO>Æ Ñ<Ÿ)e£-{$ÿ{È‚àD¤JÏ¢º²E¥ëmÛûÄöÏ&pR;dÛmO/$¶Ç°)‹÷k*›Š¬®£‡wžùÛ’¶Ð)E†› H£úŒf°Î+Õ»µ»P A"k²p7×î>“§4óH¼‹V³þòb¾bé3æÖ;Ex瘯8X#hDÃ'tÎÆåh2ñ9ÿb”QÙÌ­ïã„E¹ñT6ãØÒOß_úÅi¶¦¦4š˜Áà{+Ó‡úÐ~¨Gò^‘FêâÃ`?ÉÅÂçÉ\¦,ˆù¢,€G;mÊ55s4Òx2"®Ûfú œE\ ÕÏWÞìûíA4xÂQ׆×bM¨gq™Óé¶Li¬†ͱT4AAûùò‹þ; MÙ9IoÆ–üÇ?üÈuš endstream endobj 663 0 obj <> stream xÚÅZÝsã¶ï_¡Gªµâ“`Ò<$m¯M§_9;Ou熖h›wéPT|×öï. A ²äKf:wcàX,öã· .~\°EÿØ"çð?[¬w‹oo_¼Q –¥EV,nîáõ zq³ùgò¼äyÒvêæa¹Â$eוØ÷iŸ.WR³ä›=¾(’’~ºÃ¶º‚G™%U¹FÊGxxZ®¸I6e_¹›Ú6®«©žéá¾\÷mGÏ·Éc»äY1Iõ“ýÛ]Ñ»}»sCƒéݬ;âÓÏ\mÜS»ü×ÍŸí.Eª”Ý%°R÷uÛÜ.í¼æ¥ßþ±ÞÓÓSÙ•»ª¯,S2ÙÖ»ºß{¢Šdó°C9ÞÄGa÷x艓Ü[\Ý{¡ç6c²Û÷®·Þƒßv•ÛmkõcMغ´‚  83L&J”h€xKúñ‰†Ña¢‘ËY¢(ѰÇîº(ÑÀYÈÀ!Ú—°§ŠöEÏ”~äcú‘»ôÃx`‚3F,êÖÓàɦGGÞ¸,ãDú!O¥"H?ä$ýÈ_H?äœI虥æ\únš|¯DÄRà>lÂÈÁµÌn ¢Sª—à‰Á»?lŸŽ½{‘I#r†î]¤&ڡרÜ:U4·áˆSƹNÍÙ©G"7óÝcU:Eø¯Ó’ \œ½È’Š”„¯œƒÁGfEÏuv²#c"Ë›DD·¦JEéëOMû„M„lfчh“f|CAÊï@ï,ß·¶ùÔµwôò×ÿ¸¢‡üÃíò«On…1tý¾Ú¯»ú)؃:N=Gòë&!ïïÚ¸Ó*œ”}Ò„íÈwî àÐ5{šŸü±3èó²ÇîPöö¥uYø¦÷,Zé*›®£ÏÅ8T³wîª.{g¶+D—âÃ$ÿß“ç©Ö5ºD*8€éÂY@ˆ ƒ³Ç¢’÷ÕºO#‡…}ë6}쿳žÙm¬ñ‘%?-a²«K[À—èžÄ #0½'1Œ¢jˆT–âÛØA¥öà):F¬kó jUÔJW´Ë5€rDñ\FcàMþD.ÒL]0…×Ô]„ßM7 ™­÷Ñyò1ñ©£X|ÈœV¤P ‡õ¶.»Otnp’28IŽ%±¨d  ë×쫎LØ»øåDã"ó6Âç`wÖM4|ºH™ÔÁy„˜Ž±˜Ô-þËvÏõÞ…¼Hj4“ü”%èbÜûÿÑ ¬Ž '´Š¥ÂÌÒÌ™5±‰VÁ¦÷}wXƒ¼1·ÀöL­ôIµâbÌËOê“¡÷‘ILw]0E,à耋¥;P†³@­ò3j¥ œV^à‚û¨ó›¢ggDϽ_¯’?Uq„.ªË ¬@ºì§rj:žÅjsÁ¿1™D€‡`7º½|ÌÍ¢q?©ŽTÀc<È¡î2WjÔÍ Á¡RP¨Ô'C¥ÍµÕ°ü®Ýa&†î梨y ðó[ÆP¾¢“òéi[¯‡ˆF¾Scö8†î°³ìùÐ¸Û Û flž~¨mv­ÛÐÓÛ…7Ùh«cù›˜Î}ßÊ ³„ñ[›Ê0—„ÁoI4õOÈEùŒxÂùк&höÁ`Õ±§ñöÄ™?2xØ—;Oì•ØqIsÇÏÄ8¬<<ø¤9–a¥©ïÊÚ§Õ¨°>G݈;ð‚…­ï¢aŸ> ?Ç[OžSåAÑ7U2“Òeo”¾qÒNú˜áÑ•~NÒ„‚+"g rH, Ïí<Â'{†-eÔði”šáåÞ¸?“-TÍÚ½ðŒl*¶MåvWºîû3|ë[¾ô ]3¾ý£{è\NÇPÈÁ“æèÑ,X³U&>ŽÆ~Lq\;ZIH ÷…G‘m*±Ä_§CºŒ„ôÉ,+EËèõ…Ðàož¢˜pÙ „R#<Ó"~ikí‚2ïќsTT›•[áä§ejrNáÞFe¡PægeÊô:ƵF•ÅìVAˆPW'$ÀÙ/%ù I@|¾^« 㺠ð+Þ³QÇu,šæœ¨äë”åçŽü|Ù:[VEõUDžà­´Å ršîùñ:cHòs²DŠc6@ÕÔÌ—MÛ[>úÎAԘë)D«ýlvC§_NZbž_=šWóÉ’¦mVS^Õ^sŽ%¶ì•h>s5ãU^µã•àrf0M …½i‘"D^Øœp]ÜG5¼ °ÕÐe¯º¥ ÒuG#¢£Ö‹Ã—Ç@-ð¢n¥D6A‚“°ÁÏ“©4gåi&~h&Ï/<I½öçÅ2ž= ÀK/Ì%¥”3ñÑW…J3‡XéJn„ $P­(B<'P£@íèJ‚ÂY¯g{-Ÿ@[RӕݺÍ>zÜq~‘øvr{…‹OgÁk}†ë$³{æÆ ú ™aÖI½üvIp+R%µLî퉠ŠÞ¡D­Tc¥årøò™ s²"aR=^(M)Aœa,]ÌïÛh’_ðËøÕòdi(Gœ?Rœª  ·ègÊKTAQù¤.gzgwœÃØXÀÆézÏxj.cÃ-A—TxMø²êðñ»¡ÏVüìQ¨³ª£Š™î/èÎåÑá:ª<ìUºó>Êðy݉TaÎT‚\i—O‹pBe݂ՠT*^Ö!w/’ب ñšV–—•´§Q“IùË%­áŒëýl¿g XbVÀª›Ùx_=rá'³ßœ‘~õÞ‚'×à«5~p ~iâÛᵡQ¨Ë¨'·5·åÂiòJ´9Z;Í+bwÜHüfi°„è…%;¼Á‡'̯û²ÞZPªR¹ÞëÃݘö×p/‹pM©ñ3ÆpQ™²8´‡)cí,vEì<•ÕkÖ7Ê~ LT˜óËÒâó`ÔðIQ üÎd9~£3M'…/r„#c½Å5„â5Ü£ƒ¸‡Ï½ëY1´ÁŠu€qhí~Ã’ PÞù”¿±|lF6+(üí|ç¦"®ÂJ~²¡O³¡Íày¸/*ì¾ÇO¹‰{Ƀ¬t5Xé­H†5XÄ{h3fj3GŒsNI±FTZ¸/¦†³þþWÿök[ endstream endobj 666 0 obj <> stream xÚíYI“Û¸¾çWðHMZbk*‡xW*‡ÌÖ7·Ë¥–Ø=ÙCRÝí©ùñyÀ¸¨!Q²sI*e—ÅxøÞþ=:ù-¡Ih¢üÍ’õ>ys›|û–Š„R’K™Ü>Àû%ÍH®’ÛÍ»TFôbI)“éÇÝãâýí?“¿ß&¿%„ç&yNdNŒp´Jö‰âÄèp»K~I~Š0,ò‡|,ºW‚ œ«ÁF3'·_ãÅ6õ‚géó+Ñ4Ë ɦ”6'|Xä¥ß—Õf±äZ¦àOStMY<Ù3 ûD8¸X^¼àʲÂßn[àÅýª-[¼Ü«MÑ8Ìß¾5‰=/Ë-€¥GÀ$‘Ú!øåsU?Ú^A=ÞC5û¥”$Ã-eÕ-–}ùÌþ¡©Ÿ?XMîܓǦ¾Ç÷ßüxƒýŽònñ]žA ‘ÜñsÑšªõkåŽ$¹/½uÖR‡®¬ ¿g¢ƒÊ3”.PŽPGÎÈ%xÙ/o<w[Hïm…øaÒoý5&šè¤~@¡Öqkû´2]5åê~畺K£§@êÅô0x¢I®º„q0Q¹[ñ&‚C[ƒô+@ÖZ;Û :¥Œ$”%ýŠ‹X§Ô/TS§É€÷.c"¦¤ T”©åÔÄrL]!b5>D}6û¼Ó3•nÝê¥àœ(Pš›°6ÖÛç˜àÅ2r':ÄÀ²Û.–‚ªtux)wåªùloõ‘§•àén»êðmÙ>Á5ÜEÛ×uÓíãbÉLZW›²úˆ+»:¦ÜÖÜëT€RÄÀdw .æi©‰asnâ$ãGgeÂ/0ãhÓ;=«„kçZᢠrZ§ëX°²*vø&TT¸\µmíL».W]±ñÁSZËLdxëò.£ªÔ–Ä]±Ç%®:ªôS±îlJè.Û¢)â^ÒCÞÄômxH „ª•:U{û/ A-<à¯÷gKÐDª¤Ñãèÿ.XXžÜ¿…ÌYZ>ÄðöÙu"¢Ô8¢8ç㨶·Gåž8¥à·ª«¥«“7xJò¡è»§C­†›ß‹¦&±f£\uïëým¶›é8bè8 žë8ÂÚòòŽ£m)i¥¯*ü-#½ýÛ²v…ó¢”>öfÐP9jν¥ ±Ö ˆ¹ÿÝb©”ò•ɱ•IÑlãŠÌØ:=ʳkŽ‹w;1´Ô!µEE•޶$ð v‡®6 ‹˜h9TŠ™ ½‰º™¨k¼ —Ï©*FªTUE±Ù¸dשªÏ05eŸä+GN!ÉžÊu2ÌQ¸"SÂxÄý:°k ÿfžüÛÜ ìßßÏÐÿÑ9gø/ÉýŒèa‘—¼®wú/H&G¢)Ä}6/|¼Ì‹¿`‡}xÿ׎Âõ3SÀ&>Æ ‡€OóC€ø¢!€éì\”†(u”¬u,Y‘¯†{D‡gÑ3CD'?“jÆR‘a°Bý`ÅN» }yb€ÄÊ/Ìì`þ£C3<>¢.zÂ2u…ˆYnèÀâ a€ÏOpþ¥`Â’Î=útÊ–cÒ¶kk ÕïÁÁbLstÏýí[×a¹ÈÇÉ/Ø#ÿvå)ò\8DÎ¥J` rÜß‚‹9XCˆy﨣“§ÔŸ]"!ø·Šö1)ÿÏý/åþ7ÑX= Ä, WÂŒÈÜ#Pt@`T†à †×úQCOF K}¢£50%ŠkbŽœ$ÜÍ2G5àÍdÞPÁ°*Í ã˜m-YƱ)õ6;5d_6|ð¯>ÎuºÿÅáCþw Ñ üçhÀ½,.]ÎÅÈ.1lTßcÑPì+G6]øWŒ.‚kûé+Œ.ùüèbwÀö~tñ÷3£Ë蜇®YU“: „¢y¨›=>«g;¬š ÎvOk߯:›•±ï~Fºžç C‰AlOu¹ˆ¾Cz’áoêƒ+¤öúåÝûK¿õÿ­h×Mù8Rc¾Šì|q„w,GäÀÄ}—²6mñgthžÎè"{etx¦ ÞÞþü×áWQØT’‚ØÂóA‡+Úz‡ÁçÅvAƒösÛûh¦jØ„m¾Ãf=Ñ?*;"¤Þ_N}¯Tá>"@ õßÑ}†–;.d'G ʆ²‚œ€ùæ)yOªàX°)_ðñk‚ <Á’|ØÞz<ܸ˜”ž`Å྾ò¼Ä9MfNáG/®»ºñÄúÍ„%9nµæPýZ!¡Á¯‘Ì2qW<›u½<€ÆQ¨Ô²tzÆk@€ØéðYt‚ÔÝ`MùqëXîrëK$KÛrS„oÀªËÇéöC…CˆgÇø©6G}ÆCÊ@ŒàiñZ|?Ù±-”gPµ;¯|pS»­» Š¿G ŽG´ ¼ð/ñgéÎGšKà6JW%4dËË;ú>r:cƒkÜ@DS‚ÝŽ ;ð?ÑÆËŒýtäïçå¿b0ØNç(³ÿU{vrèç49†z¿v‚·Ã çAX0ü¯ÁRƒñ‹[î&¢†€§Î­_; “õÂý^: ·äçӸװšÀ$«}ámJÝÄ:²© ÂcÊäQ|(ÏJkûÆn¥Y–ÿô§¸Ž5¸ endstream endobj 669 0 obj <> stream xÚ­W[oœF~ï¯@}b+3anÀªêCÜ\Ô*Êuß²Q„YlÓ°°a vªþøž™sØ5µ­*Š•fΜûåÛàkÀƒþñ ðÅ>8ßO^ppÎÖZ›K¸xÌÖI°Ù} ŒÇ«ˆs¡Ã«ú°ú´ù3x¾ ¾L®³à&H¦÷"M‚}ÆlüªƒÁ»# ɸ軼YE2Uá?vÑá–ÝeÛíñä"/V2¿Ü¬à"ïvHnK”÷UÛ8Ýž¼ÈË:^[QÊšéÔÉúð½i¦2ÞÔnþ„§ ¾#­YŒO¾µˆÓhÿg§ìÖm]{¿¼=ÃÍ®.ê÷·?mW¿.)E"xÆ´t"ž•¦èªÃÌ=×H³µš“o®A„”ë°k‡¾jJzsdF3žB,-ý¨÷s°S(¢·‹ŒÜnP‚õ»H­ßáô»ÌNýI‡Ûð|óþéëíê _V¬d«H%2¬z¤0mýͲ)‰wïÍ0ßM_î½üÈU’3©íÊlò€’çžN)[§–*c™¤O§Í£„%<ˆFšÛ%7CÒzOü¶Ä$âíÅÂkÅ’Œ®ÁJªðæºìÊ%>*f‚í£­9Ò”3 Ÿ¬tŽWanBTºê÷.R6®iØšrG‡-­6öáEnÇøxAmÁ‹Õ‰ÞGjI*¼ÏiÔ¢Ê{/÷¦ê¯Q IÖ¡¡œ+ªmÌZ¶‘k¦0è 3J­.m/2tU§Ã¿Ê¢?[R4…B¤ÇR ×,ó•QdI©(CLТo;û-ÂöÒ®*š/Mkïnƒ7Ö‰öæÂ™YâGÑîØ»¨—ˆS¦Ä=9”1)§˜$ÅdØUW×öª®óf‡g¦Ú•†¡+E–1¾Æî¾|Ó`Õ•{×}§jl±JûÓæâNKð>= êE|ÉLÃ%ã¡'ï È\·C½£„ùA˜—tQQß©[GQ¸Vd–Z!WP/‰OˆüÓ‚t!ØšOõ+¡{ñ$Á%õËÙ’‘±Xü÷ów‘Q‰²?ËòÿìRØa„¯÷Ë•7¶.—9§¸d"tQö+påj‡.‚@ÐabCÆD:Ë0?฼u{ÎjJ 8uÁ0D{œY<2§·üô0‡´¼§ha7ZØ©šäû’| ­1UóqQSÂô`Çsÿö¬×6#îáÀ=kh×z>øùò™ÄœÙßaÏcèîÙŒ?!Éă&²QÆp8ÂVÛíER9"+èl‡ŸñâÕ[µ<>:…-Äû )¡$㚢×OhêÔø<î⩎œÔ„œ¤Ì}ÈI21GN¤ãû$cÂ÷ëV¨°Ü!'+ÁùUù °ë`»úi ÛKÛΕÏe{rg ºÓqþÙÙüÃÁTÍW0cŽšJ1t•&.Óçý`J00¨««›ª¢¡&Ç–@4~°m=ì:Ý‚Òyï*sFóŠäÃmUW95q0}7ýÐåµkn»*óÌv…õ¹6œ‡:l=FõÈS&QE=ìР„F°uˆû¼ÌmË©þžÑãäÒ~Ò%> v뱓ÝoÃê’$ô¸îpÖ”¤LÓÒ9´JÓòM­Eƒ ™p̨™„˜V{ï†Ñ?»J8im3¼bœüVëiYÖ¾³Sne_vûª!™j‚þ…ŠM ¶Pqñ¼ØÞ—¹qÆêc2áP­%‹Aê‡ýÆË¼;^ç”M4çK¯ÑP¥1—C]S hvÙŸåŽ-Un” § (+øå«·ŸŸŸ?}¶„UO´S#–jÐvïÏ*HWæuµs!õµÈ¡ ŽàžÆ.R%8váÂÅOé1~°ÝÕ `a3ÕËvå̈çà աêÁìÀDV>7gÒMI¬ÆSp¹¬+PŽ(ó¨TÍÉû> stream xÚÅÉ’Û6ö>_¡ËTQ !€S9Ø3Éa®IÜ7ËåbK´›¶DvHªíNÍÇÏ{XHP jIìLuW‰Äòððö…‹ßt‘Â]Hÿéb³_¼¼Y|ÿ³^PA¸È7ïazES¢áyû&ÑåŠR&’×Õþ~W~Y®¸Ì’¾¸Ý•ÅÁ¾´Í¡¯ê²[¾½ù÷â§ ‘Š¥Dg™)R’k’P4K>ìîý®ß„kµø¼È4QÂlz±_äœ(é_w‹×‹_"Œ‹Ü!åÃ2gI±{]I"èšqú¸ÈA‡ë?La}ÆFÈ”f$ËÏV9Øm³ä4ùŒ¤É-…7ÍþþЗžÜKžúÍ{Ç»rÊDïûŸÕY™j ;>TõöÍ[7¸m€·}¨oÞ®—?Dï`ñ¡ŠdÜ ô¯²Û´Õ}_5µ[Ÿ…ègD‹pù¡„Öí™Ü0 ³¸þøš‘3tFRé–;FuöŒÂµdÒ0 ^ ègzPT;ýÌ^ðö„æO #N£OKÅH—Ùr’zlVýU¾T»ªhí±áY¥¢ÞÚ9 hìT®È©;¢-Ônþ;–F9B5áò r~#Ž ¶jÀ6Jd¢üuê(³l`©Q]‘ ¢e(Ò–ÉJ L†G ¼˜¬$2Ù̬“YfËÄPDÄHÓbpz™x®—VbŸ®o›þЂóõ˜‡"#Rðnwe[FOÌÒÓG‘”Ÿ÷Èe¬èÁX:ðB`ÍÀ|À„¶F8£æö¡àF–bô3ÏBx’:‚ƒå¦ „©›VÊ`%-V /3@›fwØ×ÆN pŠvpPtgtC£ £èhwåÞî1>7K>‚C hÛ2çæœ™èìãûbÓ7mõ{a¼†ÙhB×[E.¿TÀkÌøMƒ¬ñpѵ!¦w#y¾åvŽ»Î`ÍDÄšmK·Çú¼°#RÝÔ«a+ŸèXùo5¨@ äæV_ü¾¨ƒF?^œH5k&¡ðêWüˆ<•sZ˜éµìÄa.ô{9L¢4 +À?"<a%2jt] +~~BzõÚ΃X狜Py u‰3*4A܈Jˆ•;b¥Ð½Ed9ÑWQ©Ž‡Œ™‘(€#à1 8ÿ‰_žôÁ€}‰q–ø0¤‚8Û[ˆã­u­æ>³®GA^ª/ö=3’›_høÅr`X0³Áþ*ëÏ¿ŠÐœ¸ „‘T|úó9úÇm\ž=‘>„N6lM3,Saëú8õò¼1À7Õ£˜­;A F‡Ê‹yé $År >Û8ŸÖ†ªŸ0'Û“*DU°ãF‹û²ÅHP@iÚ<Ô,³ný{ êcÞ¼J£n-§8ìR²4 ãß”ñ/L™ÐuÓnÁðº5Ý}Ñvn7bŠÞŽû廯Ügcâò.VbR™+VÍèÛ£¹ <ª©5F«»£¢Þˆž×0–¢ä!†H±@œ³ãÂâ‘’£;ö0^ţߡ§#LÈ“‡,N—³¦æškòØ5oæ9ÜrŽ7×¢ÙÒ”Á§Ðxµ\e|¦ú ‘‹ËªÏlŒLN]ŒŸp¹‹Z3ÆÇÌ_a{4O`û [ã—XÀ¶)D9Ë’×]gÍ‘c¡Áô+¨0½RÔ§ÚB¸¯Õ=–i<Ä8r6äÞqÖ‡íZèG‰OÌÕžJs†Æ~Ñù§¶ß5ü6Ád^[È¢ãmx O—{`Gžñ,ž?åôÖ~Î Î ÜÀÇküàQu?€©¦wû÷1Ö~{Ö¯Púc<drpx¦ÀOã„ÇÓÓYIãGA,Þ…Ù°}ÚÄr;'“:.¬’Ì?Û¥,ø) Š Ó£ÿ›û*n¬­œ‹œ›‹Aß©`™­+à˜ L£'¤£YŸ W†r F²Ú² $ xÆÚŒi™Åã8‰@ŒÐÑàlPMÂ×édXZŒ6,—(¶²qu]ËûcTÃà…Ì},wcëµùL‚‹3>gÀg›àšjsgG WÞÚ‘âCQ¹-–†(:ÐÞNž¨‚2 þë”8Éñû5+9ù”Oùø9˜©F;<š¶úPÕX‘Ä%M»5/¶>¥8~®rú‹³núÉÙ¤µ'b­½ÈUdò™øÄü0ÓeYåRbBiJýò_þö?€¹- endstream endobj 675 0 obj <> stream xÚÕZK“Û¸¾çWèH%/’àníÁ›¬9¸²ë¹Y.GâxhKä,IÍc+?>Ýx RšLÅvj¦Š´F£_sñÇ‚-(ü±EÊáŸ.6ûÅ/W‹Þ0¹`Œdq¼¸ºñ£$KWÛ÷‘$‚ðåŠ1GŸvwËWÿ\üzµøcAD¦‹8#Jê¤Éb¿HQ©{Ü-Þ-~ L0ÙIŠûe£|wÂ]¥DzÜ3FäYî‘åÞå×'ŒÐÇ|àÌXLâäkÊòÞÔ»åJ¤2ú7^bxÞߺÂ=ìûÊÜ×7æÚÝÚAjWä-ÙoÔyÒ gY¹i8\R=Í»§ª¾kË֭Èæÿˆ¥žWqL¨ùIYuËUlvícqŸï>ÂŒA¤µ~s×Ô×fü¯ÿzenú_|9~QVÛ÷ìËm}ÁÍ=p}ÿa½ü)¸#S$Z í¦)ﺲ®,}ìË“LúäW¨(I“¨©]Yö7£E'Œ$ìé—˜#KP9ÔnœÞ¨ÖÌ‘›‹Û0¼Ç ÃkgäH£Í¡iŠjÉÓ¨ÃqÔ–û»]ñhÉìvjÒuÔVúw‡ë•"H"à*ZÈЭ•Œ“HFèXª$º©›=NtØ¡`q a˜¯—륦H£‡Ûrƒ·n܈¾^â3ÈZƒ¬íÝr$uµmÍ]m®m½/Ì]UW«ë¼^úñ~Ë(oÊ\ï02Ö‚–ãAËøÆìãai‰šW”°Ã«îÖlA~x,weÞ<õsõ;jÅÊ«­õ&4ëJ€Û‘Ê·ÓÐrAeÊ¥¿G£,¸;œ£?£YqºÌÑî0ÂÅ3xœ7ÄŒÒ1¨‚ºeôÛ+·Ž!ãC$޶WÆ·W¬£°è ɲ™õgDð~ù”NIŸ^fœë¥¶”§íšÃ¦;4xµœGÆ"?S4EpÆX1§p‰ñÕŒ›õiW(%E<Ó~õNOCA¯®,Q™¸ צ^ò$zhñ)Õ6ò, ÂûÌ&žPÈØd¸©p‚9Œ‹Õ?Ë $ýüÄSj2 ³»boaÄM¢Ïàö hDräíÇ t“oººqAƒ*“§ôš*ÿÌMÐBD&J´>ñ¨x,[àŒ? ‡SÈ}\àCù²lHQ`¤½tœAh©‘ùƒ³ö?ñí»5£Û„šB‡$ÒµsÓÔÃÞÑA¢Qü ù&·¬^ŽL,R’¥æ¤rŒ²xœ§§" ÅÏ(»š:1&„tf2”‡$™¦xœ ’Žž"ô 阘ˆú9ÀÒpµè)~4{ j F‰ÉùÂKöñì „·‚_“§„«Ð øÔ XP "VðsP׆½ÈÏ’Ä\R»à“Œ‘ų.îXï8 ‰¦±·†^¸-“ê—ßÞ€0ˆzúŸR˜`ý'Aý¯OÞ;ßÞþŒ³ã3ö'¾Gû‹ý|û߉ý‰óö'þ{ûCUêYŒ'†,VÂ\¤÷2Ñ{7\N_†ì:!I|‘YËÿ‰YOêuÖ+Œ~v-¦ìz?aêå¶+¾†í*,H_fºG&Æ3¨‹0­Ë°ÆM&Ú‚#œõâ(&æ½H6„†W!)R¢øs„à/b%…Šˆ1SbTiŸ‚ ŠpÓEF)gŒ2!R Rä Vp ÒVÈá-öƒµ K <Älþ7„omñÇR›aëõdVÎÁÕpöíS4Ð8Ú‚)‘Á¥ôPÚW’˜_*ñ„Ñ̬FHÜöKcäÄjÎû™Ø7¿0H˱õ™rjm9*]Í$Tð |¡ñ!¤WÞ#,ˆC£Òm®P”Tô¸+< ¯º1`©p¥8>p„†Ë‘fj$ðG…øcY}2¶Ì/ –P'ÑîàxÔÕ`*Mm~vtüz:9@ '•¡WçR¯ÎeÔ”îðîPÕͼîÖ¼nïò¦-̰yç‘ÃuWëw£Ëï6Gó4Å añ…jûž}ì2›H(I0ydªÇnn<‘‰7î¨BsÈŒ8wíA%#Fpç¢<Âø“¢¦¾¨âHF+xPÔ•”mßÛœhJâxˆ0¯ Ý#Ø“ߣÍ»§%äwvÜ„L8Ö,¢AØPpC5Æ Ý†`Aó<òØGþ Œ+:¹ƒ˜hûJï À3>@‡Æ‰WË‘;C×g‚snÚUý4øƒJ[<¸‡"ålôë0#È'Óá¼s©ŒWØš{”¯Z.3ð3Mnz!½'ž‡´–å¼[Íæ•T!ì @¾·³µEÕÚ—yë$ÚSˆ«Ì.ë@€­ñ$ŽJR dÇ’±˜]sÌ™` É<&ÍÛ¢ª;çîxÞ¶ùž©^=Ü–˜pà­0fé‚‘ÎVªÏ2ŽKD®á%Bršœã§ÎÔ±šGlû­°:ÒâøÐµU‰©›pùÎŽ‚½hÏβîú8Ë#tT^Öº»u_Ö‡v÷d@V/ô^ã鵯·âšU‰Áa½$Ž(õÏÕïú ¶7BEJg¡»ð—7Bãa››‘$#®Bvâ㓦óÒÌoL¢ÌÔ†kçúaÀ4È™çñðíØã‰Äï)"?‡˜˜Žûª.ÇM²©8ÞöI€½ëÂ÷¥õƒFH!×ó”m†°û‚èªÎ`6äü÷ùnB»nšAc‚ãÅ|[ù{½Gua@¸È¶^ƒOë;æ^Gר<ó >6p«ƒϼD ßæ­¹ÞÔ»i @¢¹JîµkÃÏJÓv¯†¾f5¤œ(”6£bƒ¦ò¥uBåÝ ^8ñ듯#϶”@ ³Mˆi=…éæŒšƒ(†IÎáæÐj÷Ã¥ë ÉÈvHlë¿sm`¹hS>ª5¥±½‹Iuj\jsÝb×}¯•(Ì—á(b¸«Ç‚`f¸¾quH†6ë·í¼Õ‰ãÖ§©N‚}:'ö+á:òrȹq`‰v`:ŸU2­õu¸ ñ#{‘ňÔõÄy8ß'œÄ„‘KÆÀ{Y¿j¼2=ÝDZ@‡o(>OIå}hp<³öݾí M€RéŒÁ|ÅòÊu˜¿C¥U8t73_=I3×í–§ZÔÀÁüÆB‘Äü^è#q­^‘ÔmZq:]Lès§ ~³3=|5ä¤aà´Ca@Íœ°àžyÅŽ ƒ©&·ÞA¥X1xT*Î/™ÿ.ùd­ »»§K=b⻉ŸBx.TÆhžíNã¹bÈ™æÌmŽÎL ±Gógh©Dt€äÕ~Ë…Ÿ·˜‚?Eâ­ ’—BÎéõ«/£Ïe”E‰T.›’¾ÄN™üW†ÉýJe2zWæ&{Q>`.˜#’d–†HZ’>ß\ýþú-:Cj7ämM^µúû¿`µ•á‹”žâ§F=…™Ôeç0»—9Ó!sfž³g^™I‰ÈÔ¹Ù£#¿|ö»‹‹šLåçXV¸4A/Ì"¤Ô%a?Á›GÕ?\Ãy«$MÇÑþ™qGþÛ_þì19ü endstream endobj 678 0 obj <> stream xÚÕYKsã6¾ï¯àmåd„O’“Êek“CÉfãÛxjŠ–8#NI¤‡¤b{küv£”AIÞ$‡”]%l ŸèþL¾$ínÞßþ˜|›|I˜,òä1ÑË•]™äÉòÌ÷ɯÉ/‘c2teÓl»Ã‹í¹Lèi. Å%•ãе7’¯oÖ2S«ÿâ¸Úaõô°¯7õ°¦qÿ¿|Umê»”«jK³¸Q ¡ ßü'È"-éÚsšéÌrýõ¹iúº÷j‘¤á"ž1¯µf)-©›áf­ÉØF ?tíãzèÚ{"øê_oèa\²¯šÓ©ºÙ¾{ï&·íñ~_ÑóoåþÝû»›o£zL:mk¡ý)=LxO~Ý„3í£«ô!Y‘Ù`eú•e)xl Å2™Œ$^.ÇM 7¨`“ÃK6S…âk;h’ejâñuT“t:'—5ÿ¯&òzMÄ‚&úš¼…dÌôMBÜç“ë #CØ@§&¶…Æ·œabëµ{…ßF“L:œ’Ð®êªØn2e*wìb‡&gþmmÓ¦^•û=>Õûºìžqh }h˜ëêÒV̯pZéÕ°ók]~{õɘgFí爰Jÿdš²«ˆë¦¥ ÙÉlêªÁ¼4¸"Ð~$W ̘opóM\V¨\£—þÜx…žýÐ7ñ+÷vÍZ¥ EP‹B'õ iþg,O ¡Æ&eô¯,q<¸W€'êMÕÓ l¶ô`釪«7 ]üԪ܉–¬mIÛfýŸªkidý“‡þÉÐ?±hU5ºöŽt6™ŽäqPE‰”²b [²ªÌàpͬÚC Û©RzªmJ™ÕþÜT[z®úÝ“² Húæà*géxêºñ÷=$`rãˆÚ)@´ 3cF?ÆÞÄXÀ©/tÀ0cŒ‡N™ñqˆnŽ$Á”r$'¯“UÎdE¾(+rXUi–‹9YÒ ·T)Æ ÑÂv‘Ý@­TO‰Ž“I Žwþt ÍWðĹT q¾ˆ¶,²Ë'xjǾrÓ³ðÐ?÷Cu gË~«/Çr_˜éðüæ˜7ÊÚŸ.;Ig7Ülsì:—!‰ä¾ì½ –I·µŠâºÖñ{zèªÞÊë2ÚÉî®RÖ •f.=¸š-×3âLuâé„·]g‘¤eä8f£>^ât ê´E˜2"QÜYŠ/ëô;Ê?CßøfìøöÑ"hrÐ,çÔ~Žf(·[\'0á`(¾ìÀvt{ô"ls§WŸÓ„õÓŒ>¬¾0œU߈%…Ø–¤gÀ±òñ>ªa%µ¶º»#%S±ªYgUaw²sà÷ã~(}ÌØ)oìl¿å’¬µŒÈ8žÕÀ2ËÀ^'F\@öæ²÷at—Êôe9V\ȸ×DLw«8jú TPXŠŸ¢Õ)µå‰(înb’ºbYRèÜÍ$éE |•EÄ_Æ"â÷[$ì4²ßßi„–KŽU!õ/Xý)–K>Û•Ès] åpüS–Š ] g—_z€ÐóS\@k üêcÕlì„\¨Ê6ߥ 6çÐXÞ=×åÿ!VµŠA‰CïæÅBúj"ƒ†°3³rm}„ ÐiMÆ™ [ÆBL™_)(CâUŠúŽžTÝÌ.ÌäT6ñmP6Ïô6Bã-o=Е1m&”…³ýÐvðylvŠL§_4;BÏ›ÛÖR›âÂW4;&gêºr.DøI¿h­ƒâ‰ú›Â7}4ÝJº¢ÉS¦_ÙÅÈŒ¿¢3Ðˉyó÷h£§ò¿ÔÆpTöumŒÌÄI¯u®å …umL\Ø@gJ“`u½òA` c>õq"T´§S߆I‹‘$dÅOXËð4zÃvF… ÔW„t¼”{,œ]8^–Ò¶àÂuû8q]•Ó­µT‹õÞÃÓ6®t[(Ÿ6Àó7«ŸÚ¡ò<ÊÁs¥üú¥¡f6Ã)¦kžt$8eÓÑ–žíùSþÊBaÿÔ•ÔçÅüŽŸL‚3kuSL’D±i¡[êéÓJk{C¥©ÇFmWª{µcGÛi`-8w’Ý+¶zý[×ëÜ„&™.– ·s—ëÛ(ÞÈ'Üsˆ_.—‰‡ªtu#(„ôÉcnjéj£ý®¸í4Â33}·Š2#4%ÅyM¤dR^·Ùœ¹pÚxñÂÁM!ÛÆ_ž|”Â`9Jè¿í™è¯ÿXg?L¾â OSĘ´ ›‰2¿4Ê&£b¦_ñŒ–³hÏøž¶ˆÅ3½°á ¸0¸ØÑâs‘Óy:¯ð`“ÎÚi¸3¼*ñµØ~ ¾Ê) Hy „|€ü´p¥È§þ~1 ä—‹¤JXÌ=ö£1Q°Ù÷î¹åí]ÝÚdË s.=ù/û¹ endstream endobj 681 0 obj <> stream xÚíZKÛF¾çWðicušý"é`/Án{ؼæfG¢= (rLR±'Ø¿U]M²)5%ù‚€l²ºëÑÕUõ½âˆÃ_%þy´;DßßEßþ«(ŽY¦ut÷ÞobÎ2Ýí_¬“L­7q,ôêMõ¸~y÷ŸèßwÑÛˆÉ,ÞE:c©²"#Yš Ã*ú5ú9À`"rLú6¯»×M{8[>‚ =­ ÃDvGå8ìšj½‘‰Zý/Úãh‡ÅûǪܕ}õDãî®ñªØ•[«bOOa‘ã¡¶2~ûCáê*ëý‹—îá¾9ÞWÝÿžW/^n×ßõ ™â”iieúWÑíÚò±/›Aoí« Y¦|ò»`"¤\µÍ±/ëÂ͙魖jp2¤?Ó4À$ËX;zØ‘¬ŠÉ;âÔKµêòƒcÞ Y d¹•Û>Ë;¢êoPpÁLâ‰X€Í^õùý‚„à†IôhÉÐaÖ»²§>Åû]Aö³Ãþ!oÔàVô°¡ë=i@£…¬#Â[p+{휢ž›ZŽž3ÃôÜQçä¼íÜÊ¿¯Ñœ»¾i™Õ+¼¡*‰g‹ªDXãÓA¼?䏸MõÁAÿÐß<¬…Yõø€[ qJÙÓõ«uäù~?¬æ±WK¬š¶|SÖyå„zêúâ@³š×V£Í Ò¸5ÅÛc^'NJ”ºîÀÆeÏúîùà±ïêÒ0Œ(àv•÷R–%6¬1!‚2]:0öíHòÏ '¾DΗŸsÑ,I|.qh‰GšQV¹$ëáœOÂTæ¤ø&¨ŠÂØ:®ðMPΤ[ã9äcè’¬ž‡Ôjà¸d˜ôvÜ+­Piš_‡hfÔg´Zh¾ÎN˜E:&’ký8øK(–ÈS-áÄÛ%¼crÝÁÅqpñ·ƒ/æoŸlpÝÁ¡P•ÚwpØ)C6^’ÙåSZž"eFKuÕâjfñà™RΔ``¥³Ißl&À%¼¯KQCM2Ü®ÈÇ8õÅXMÞnµ:\àŸÏ2}¨Ôe=/{GÐ_h³s-çU°P„ë2ðÒVÁXÄV“1eü‚Å”'Pà&‹'yr¬%V’Ç÷eUæ-Vv&ƒúVCýÛ–9 ŸîYÐ4°ÂÜ,ʧlÞo5Ò€ 7”£Ç]lóŠÔšé$éj»zl‹®¨mmKxXÖDOØn3VÅ>êÕoPðo×AkØ:@§¡:`îréÀËpá n0t‚S± 8Æ¡Â?§x%Œj””Z$S7ã°7qqº É `¤ÙÌ®,fpFèÃ"eüÔÅ|îÖÇè5Á°’Ãb?"ªâ€Ãˆ!:8Û‡ïhˆ¿Ü¡à ¯3q±²އ¢-w'Á;Ú•ê8ÐV²×º©7mC4 ga¦H{=À„w ñbÿ á<îàf2ƒ›\ø ™Ô†ñØ÷Ü`f…”J{øS™Õc•ïìp'¯)»³-ƒ.ÔˆlãPš`s%~ÐC*&‡½~†HTÁžÚ Å(_¹Ñ³ ØõL{ª¢ñМ™!¨à6‡Z‚©aC°ás›¬r&ë(òUY‘¬J³TÌy̲‚¿¤âè/D ËVµ¸ž"ñ[ãm¼óø5ìç½kÑùD·ÂëäçYB~¾Ø±/Hvpì ÷˜ÂÜ Í¼·Œá:öŒí=¤g½zhÏîl±Ý±m]¬'’û¼±A™´{«hêÚH© ­$º…Nˆ;]|\Ý9|€«ïèÖà=êZÛÀqƒ‚ΪúÝÄ1g£vjPå°wfhüm©GË–¯OøÎºcV›¡ /ÇNäYÂbã›Àõ–üÖÛØ—›r'ºÎ”;]W­ÞÏèåu…ŸÚŠWÒêÔ܃þj·d»vÐBÙjWœ8…«vqK™•YŠïƒaY¤ÑH±]Ÿ—?jXär×K\k ÄL‹?Jo¹ä!¹oj•ðò¬èMvü=ú¤H¯nDzëFˆ¿èFˆ[76æ¸D™Ÿì!D÷Xú8ý &y¾‡—»âZ7à3ï¡ý=ôåNÒÏ€ E"1žaXñ ±ÔÜ&“\,:ƒîr*û…P¡ÐÇ¢ÞÙ’*„į /áÉlª¼.5–ÝüdË%e¼Ýú@%´ÙßLYü˾š%ð0~Ú A—L*ï!úަÅTl%¶Ø2XlQŠâ’eÂ?ŸCùå@KGÉÍ–/><Ï»ÆæÝ…Š ‘‘0ø… ?áÉfÄT¢áÓ®oZ¬`ðň”ðÙΜ!%a†"†ŽQK:V¸Â %“±«G)¹ê¶Âs[É׺èŽUŸ»zŽÀQ®>‹•c‘S‰×ë(³MÔ„@òaOæèë 2XÆ@<ûP ôÑÂ: 6ž"¬cB Ì®Vƒ˜9ÄóB®PA@*X–žÁ%ÁGW¢¯ùrø DˆMI›‘Ägu’FdŠ¥S¦f½n‹NtêŽ5Ü„Q¼°a &T¦³…˜‹ï þÚs—·4ãWuX«- "Ö¶Ð×ÈÝ}úªi °Û:ÎVÿmúb`áš:Ü?=Sü€ð` \Çø¬Nûu†møÙÓk”¯.ˆbxnÝ×òàÏ óú¡MX|×–sí’†²‚¶ØÆŠ:~.§Ñ~XÏ·çD¿@3u#„aÉì³JÉЈJ©ÉHÇcä›`i0~1I&†Óp(òš‡ßë=i5‚x.·ÁÂ4*ˆpÖk"PSrA)§ye±ðWñ'.u¸"ˆÓýÏ{­M]¸®Åɯz¤HP:/gþbDwûOz²ìâOz²±~¸å=1瘼hB;e^Al9¸¯Ã ¡Ñr¸çܸC<š^؀ùplÛ pDæúêCÓolÀÙ¸3 !¹Î:^$’böûž! à~•õI¢€Y=…ûà°ÉÅ0 øÔk[ʉ1VÖcÆ mN2ù›ýzmnwÛ×Û8ºiæ~‰¢òŸ¿ú?GZÑ£ endstream endobj 684 0 obj <> stream xÚÕYYoäÆ~ϯà[8±†fŸ$×È‹“H` >ôf-§%Ñæ1&9+)ÈOUW7©¥‘à;Xayt³ªºÎ¯j¢_#¥ðE‡¿4ªÚèëËèËo˜ŒK ¥¢ËXß³4)ttyø)–‰HÔnÏWñmsÜ}¼üWôËè×(EÝGªHri?ÈtÔFZ$yæ›èÇèûƒe“crêöå‚'ªX(:Ñüåe“£"igï‘ØLžŸ·<Ï´·<÷–·w§±îné¶ìhŸy86uUOÍ#½‘A›ª¾J™4z[õÍ©¥Ãï™Ê’¼X빿‚Á›±nypoKÐxB&ZT%Uá¦ê4 ¦ÛÁÑн¯Ë±®ðVÆ#0·º·;Ëqì­ˆU]N(¾¼¯§;Ú<ËðíwtE÷kLK«ÖUü³©&Zmw\ƒZFúÌÚBo5)tÐ$¾uš´÷Vop%™ñ“Yo@Ïêͽ¿ëQ5÷#­à“ŽïñA-{Áíç’q9ÔHaôîÇV%Ó4ΣüeI‘ÙŒ–p4S¢s»ãë׳„ƒCû-ã³;—H!Ðí—(ògÀ±o†»¾ÛÏv©CB3ÁP¾­Ôk™ Ìô|ßß]èŽL[žçD®Ð™ÊŒ#°³ö²ö6£sAïVu÷ı_r¦«Ý+ÔöÐ\&L;9‚êGýž×~ñ¢ö3§|ÚqµóDøLDz"h,lBÈüó–¿uÎŨ n‚÷ÙKQ”Ø´û‹ 9•ˆÜ›(iHî, ÈýD}™\äyÂ>—XÎVÞ÷G1ÿ?5«!öZ'R®UrjW[qŸ=…Ï€9ŒñûÙP¼dÃöbCž0°áZî,Ƚ¡{‹3ÁÄ¡âs°‡¢—/EOJ>—3)…M±x] ß &R|Õw´ó+T¶áY<õ´<91#&¢×yzå0:~{Ê)Ùí³LÄÿu‡%wÙÌ}‚zžÛ2ŽÉɃe¯Tj†! 2»ÔµTL€Ôü%o+®SåÌ6…óUw#„Qˆ@±V£€N Ö,&VŽMY·`‹œ«qð b7†À)“i’{x€ œ} ˆ  —òåöIë8!o^_t|bÁ³%4!R!¤ßð¸¿3ƒ;]ïí³ý3«Àc-0º€¯1…Æ&&}1®÷ ºÜ´ EPy\žê¦.Ñ¡ñqãF(°ÀÚhqWaw ÈÇŽôe1 äsšØs‘Û‹ð‰Ál©~3½pK}7ì‡ÒD*·¾VÕ8 §j: ¤'º_Q,·yÅ(8j’¯´ê¡A döÝÁö1¢ÐCþÇ Øäˆ®I—€¸uU»lÔ+Ë zô{²gŒålÉsj… ã… ¡Bx÷–(„í%Ä>÷-Q({O8“X8¼! œ8=JŠóÙÊRå0”èÜÁS¡;«%ðÜxºp+ç[¹¡ù`‹Üçˆ fƒý¡Û´AÙÝÐÇÆå‘îg°ïŠõ|û¬ ~æI›¶†òT¶f‚|5ˆ£\4ÔCXTßο}ˈý=¸ |-†m€‘]í®«‡®ñÅ÷ë¸ z~žcÿþZ5Ç‘¸x!\h™ kþXfGÀ5’«ø æÂ9Í‘èÊKZSv£ï²ªûëîÖ;©^?2L¿>NÓ44I¤?smýBý`<õÅEöÌR¥g ™aOG\Ìq 2§÷ì‘(â”Å^¯íÃòAØÓ˜¡ì*Çö*Û²ihÍe¸±žêϨb‹{ŠPuÃhÏÓx¤`ÛåÂÆVÄÌ눧s.ã I ?H\ir…ù5â;:AÊ÷÷ É-̃»kÅÞOs†H¡`l2ÄŒòloÝ»±À/õ1ˆO!€Ä¹<ÉÓ»yÇŸkÜßõ£“¢-o»z: µö~Z•iô#€² fi%ìk~AãRŸ>­N¸Ð¡l"„Z+B½±…Ç‘ž7C µ Éô6êíâU\¶½-“°<ù£†&|¸¡žN@v×Å[ ^¡4ñN$X¨÷!A‡™÷R?1A¤“~¬Âr²7´ÑÐ —…† ¯Þ]OG§“}·&ëO„ÝàsPÕ`Ç„ó¢^ÄЋ²sŽo‰‚ç;ºÞ>J?k0΢-Bd!ú”®ã;»`ch°l.æ¹ã|ÔmX7µIàón™^ÎU̦ãõ8K"µ®¢ïüÞà/<ú;Íy& ÌÌ73Ñ à¼n|ó°\ÈW‡å:MxñŽaùìOƒ“Ã2˜<'ð2óôżH„Ï5GÈ¿¯Ç2Iæ¤Õ…¾>€wªâšOð2òš‰°óœ™_;•u]¸³d©Õ~5Ñ{Ó˜vÓà Š6È-ø;ŽÈòy`§7H Å<™M¹ &R¾t„‹îõÔÇßA2ÉÙl¼WJÄÿ¼¡ÃºQz—‡Ÿ±ÄÁ7ùɰkõs<ÙØBEùÏOöKªÓ˜BÌáÂ¥}¯`°Üæx|FY‡/僾® ¡Óªìf»ù¹¢-æâÉo ›B»lÁ–élÿ­oÑÚ‚-=Ô«±Œz”ž¿„R³ðããYdÊ¡–²W)Þekˆ%ÔÓ±=ò·ƒ£µø[íuã{|Xï8étÙ_wÇÓD·ó€ èUΉ¥»s³¤ôIU} ß[iÓoS}ÉÒ‡›Wrjɘì Ä÷§©¼þ’„ÀºÑö¯ÿq*@÷õˆî€Ø±žˆ+‰ï<Óú}û„Ýs¨Þ|svyp;â¤î%™³/$›Ÿ™·pÚ–ü½ÎìïÝ3å·ÿ§ÿÎ{ýÏ endstream endobj 687 0 obj <> stream xÚÕËŽä¶ñž¯Ð-êx›¢$¹äa AØñÜÜ‹…VÒìh­–Ú’zgÖÈǧŠEJT§{FÁ¶ù(Vë]TôKÄ£þñ(ð—DÕ1úÓ]ôõw\Eœ³"M£»{Øßó„:º«Š“Lïöœ‹4þÐvoïþýõ.ú%b²È£Ç(-X®ÌLGÇHK–gnÚE?F?¬@–H}.»g˜ó‚+âB²BÞB¼YÄãÜLón/³4þýœà‡ÇÍx?ŒGZ1ÄÍh,çv ¡9‡}ý]!¾¤@{KA¤,Í …?÷Ãij'Ç>1åŸáƒù>MYBGÚXJIžïú;ÃæÁÌOãðžvÿðý,ð]ÓÛ¥jè§ùb·íëŸÞ>߯‡óû®¡ñ§²Cd•'9ËÈJ²Tùl©¸nÇ7ÏÏ6§é°û6$.4ü—;<i¦jlO ÊÞB§¾4RV(—üîÈ\ÇãpžÛ¾±g6"Ôœñìá·B PÈS”-2«ì ©dñìÈYµÃ’S;,ZsÅóÔöh±ìi©y:umÕÎÝgšO}Õ®šÚbv°øHG‡{ÃàžÃ RéK›ø2žÚã©kžh2— oF Z¥<@@d´@â 0‘^Áo ¨.À©P78…L¤WN¿ JFüK$"þo$"~»D¾JHkúÉüÈoÜÝë‹,_p(‹¦¸y[Àê"`ù’€ûC"Ûˤ`™2UU½T‘øI&&¶'6ñæ›|»´p׆Ãñ3-Ï-Ï+Jª3ÌjÛ;”å8YÌåÌv{­Óø_cÝö˜ÜÊ`>CÌMúÃÒb²Äï-Ä1og ¬HÒì%íH®û‡º­>}S}©§¾A$"_µÙòÜÕÄöšÿÓ<>ueÕØ )®u¶ôÀꪟBeW’‰Ì^ËWþ6À‚„Äq¨K%ä%FnÈÈ íÏ› ‘£äW PB‡h¨”å|Kãñ¡ºÑàl¯µØ‰@“ à§0¸Pj”ÈJæÛÂ1>Ë\¥[7÷1‡PÉŸÚ®-ѨE¡¶f„ 'ÊÔš6vqd7ÀŸö´s3¨ÁÕØö ;¼0’_X‚ÕˆWã ÊÄ©®æöÅAVIAÕ6çj>NQ©(hÿ0¼ÿ”®=¥T×¶ úšš€"1Žýk34«È¶ˆ?ºjmÄ Ê•gœ)ýºx/¯¸¡6 UnÝ8±qˆ&‹Âظ!ü¾Æ !î:Ua‹ø¢f«‹¨D^øŸuʰLù®¸¡ÃøËåª*%Ǧà+DZDÁÞJ –{ž &’•Z¹@lùæLð•ï[HFÛ™zÝ´j¦˜/ûÔ|a×.ø™ÆKûe3µLû¬À'Žg2 ‚U›¹C¬f Åcý¡ì.s‘B'"ç / öv[ûëu%E|Ãú­Ö‡œ%êjï³DÝUR†JçH¤kŒ’?‘'úä1ÏNPŠ)%⯸shÁ¹‰²MÙc[#5µ}¡E­%ÙSÐûÈß,FÓ(IÈy³]èl½‚²i‰åpîkp3=¹hlê³ñ[œTvظ°m5®ú¢6}›¤rÈüöÕˆ]7 ç‡øØöí±ýÕ¸¼Mü{-±(÷3`[,Ïõ¸—OÞq÷æ£7!Ã4z.ª%IPjÊõ½œ(YU ‘—T¡‹ë£Å«=] JSÿ#V\8Ÿ¬‘Û‹n¡)í ±*WI#T æH¯½õe‡žüLôf%/*¾¢,ôFÒ×~TšÜðÓÊdšÓòÁœ•›J0âÓ–ù}oŽ  ½kƲ¯,ÙC<Ë®£=›§vn?a,CU„Ê ržÄÅè].MÚÈŠ˜;kÉ’„¯TGÒ=Üz6å5tš¥Î¤ŠpÛ ‚[qìˆÿódTšb²4¬˜ñ¼$–¢TîkuéÌ“Ü`ßé~nO!‹ÍŒ_}A?÷1ȹôÊìßOö¥îa˜,ÇòCßÎ纱–d! ¤±#p¨>˜ÜS‰h¯Ù=P»¬»Xz é$Y…£¡æ¬ÑÁäÑqîe „õÞpê¿ÑÊ!.ºNfº.âyÞááj¼¡Ì½4òÚ.B_Ô-×Ë0ñŸé¼èy£™X•0@YJ6»÷:Œ ‚»|&)Ÿe^¥< ²C€ú7ød‡‡íÃ+ìÓÃ+4 3•¹2ŒP®D¬Êód)™€'ý€‡ x¸QŠÔhŸùöt%ïúKírˆ±*v‘n ±v´7Ò‹ñ´×{vvlkÔê<Ú…{3ËÞú,VL]‰µ˜‚]TùÏ¿Rl^¢ÿÝ@ƒÐO¯ÿ<ÉâÚç‰dM†·?O@|rl´|³£¦Õ<í,]ºXs‚ø{Ý—QýÊVq+~}£n†~%-nÕÍË ^®›¥ºU7/H=×™Ó­Ù¡pmBÃ/ ]sD÷Ò±] 3†¸‚_Î$/–gQ}Ñåk *H9ZÆ¥ìõöJú5X „4X¬=’yü·û‹[—õGhôü{:W€Mï§"QòÌ X9÷.KgÆS›ÚĉdÑå^$Ù¥Üñ1Ä9®\½ßŠ·­Ü¼ì—ÞgóèXÖÍ›ÍaµM³«+ÀCÊM'þópD]C;?¿Ê“µó­™i½ÍL$_€ã×ËR!½Ú é\|šÁ%ãŠZ¯,˜oð»~xƒ‰÷á E–©¾íO癆ëwF@\•ó*t­ÄÀ«UŽ­µ¯Uú˜ Ë®D¹"[0Ê5àØïæòý»qx õv|­;¾…Üšd6~?¶šB5ä*CÕ°ƒ…}³êØ73Çlö*fAï>&{·Ežg(k'|ß}‰él­Øæ“þ¶¦t¨¡æÎéy•síÀøÝl?h¢ endstream endobj 690 0 obj <> stream xÚíYYoÜ6~ï¯Ð£6±ñÐA}hæ¡H‹¤quÈkm¬fWr$­ýñá!R^î‘èCƒXQšŽæø8ú½h”Â? þ§Ñr==ž<—„‹<:_ÁㄦDÂõÕŸ± b‘PÊDürÁÓ¸Ƥ»›Mµ^$¼qÕVëû¡p•Å}·›¶ÿýt®mSQJd–ã"%¹´Æ Uæ³øíúÆj½—ete’”B)m¢œ“²°Ëuô:zØÀ ™M”‡ëã4- -œuð‚0z̼'eì_«Ӹ۶W:ÿè»­^,ÇævbµŽê0O§[éß¶k“Ëjh–zy»ÈY\õMu¹Öþ?y^F˜›T¢/‰u†e$+•3¯ïÛîÓ1K€¯D ë¤DkÜv 8‘é ¼1^¿¹Dß.Ô­›¾»Ô^žé‹¦õÅ;sãªÛ¢‹ZjÝlš‘>}t[õpý¢œ’‚ƒûœ`PÁ §/Œ> 鳋Å÷Á8ˆ’Hˆ-IÆ•Ágõ°ì(Ô®5 ™ƒŒHዟ_Ãæ‚MltfËI3¨_”ß Uh“”i#9è-F½W×)åõrÔ+,ü½]dP/ý}Ó¾ÉÛ"BE\«"b¥)"g!‹‡õ ^6°¨µo -$‘Òº_lœÛU±§p˜²ÒWÅ%¨Š©NáN# à“_à®ÏYßkÉÑÚ¼©újSuoƒO½`2hkIM<ߢ“)ÜP9B¦ñÝuÝÓÔ(äžBéFã"e"´+Ī6õm,pþ 66¡2$+ìóºjMàªí‡fÝ@èìq [Í²ç§ È4ˆp/»¾¯Uà‹¸k¯T!áý¾Ã°ßiéj*Ú¹»yIòâ¿6ÌaÆ‚±¥=J2v ¶ÒuÛ)&ޏÒN]EA"E œ%ÛdûírÜöêÔm#æy¸€ ¬·›öb¡Û(aâá÷ѯÝXkíñºíUmÒ·…ôµ˜ªQÛóztà Ӕä…¶ƒÓ¦Í}¦+uθM¸²9è‡+À•®o>VÖ0Ÿæqý¡Fý*©ÿ¿ÕÃv=š°èâó^à àöu…&½&'WVÝz­+ÓT*WᆠÁðÌ…Ûj½­i y¼ ™ínôIªwÄ‹MÓêºÀ .SõL2'lP·ˆ€CÝ3¼!cL jÜ]C–@îZËML¨ñr›µÙ¶¯7UÓšû7½õ‡Å«äíyŸdœˆÒo{/•:I¦÷u¾ƒ+%¶•’gO_¼ùåÇ?!ƒ"…ùo§Þw*”Ï"WyfšQÉ6ºm§kÁäWe¿×Ô!t7¡ŒYÌÓ܇’ cOYúI.Œ“¬€ˆô€|*¨pWµÓV•5:›+7ðJ7üV­ù`W¹xÓf»à©”¦„K‰s™±…õK[ôqDoÚ¡€cï ÄÁZ:@¦)Õ³=s5¶žj/`ÞHÍëtþ¾ðý3ëÌlp>Î*Üï£<…F©ôç'–Ӹͅ_v eœ0z-|XÙ»#Žvà@ƒªòýpµíñ¹V¹ª—=6¢Ñ4¶¼zG 7¾TGm=)šyïÊaæôrÍ*Tò451Ûg6)?õ™ÎºCý↤ЈëŽþ}-—ÏqUJµÓîé¾¾æêkå|³0| :ëìÒv¶Œ7Õ—°ðá„t?K+\Îsk« ¾S ß á—¿›…o¸´ð |Ãý ¾áz¾yöáûñßÛ3Å&v³oØý?ÄnPŸc7ÑÀ 3…µÃîÂŒ«¦ <ì.¸Ãn¸vØ *Mëa·+%þ ÿÙÎÆfjžƒØ-NÆnöEØýø«a7ûBìžµpÿ,÷>Ô‡LÞGO3Ax~øeè‘sˆ¹·}èÑÄ|’ûP̆t©p(/݇Ëel¾Ã=ïVÃ>¤·9þõ÷/޾·Ú®iµÍÙÜT‚;ƒÉ—ãJäÓ¼‚b×úõm?¿švÕõï{Ð~*¶Ýh?‚»ÞöÈ^š—Kd>,ÏËNày¹B(Gôêõ1¦×ís”êµL,îá|1³Å²Sto½ÚOö"] Sàßµ&}SKúZU(„|ÙÀ'>< ‹>jÕÏä~‹Oã~E 'ÓòwÙÕ«“¸_E²Ü/¢Œ†öÁ»¼±†‹³Ý¡yÇf˜Þks?mÌU<¾Œ6æ´é§”Z.ïÁÁ1§ɬÀ?ò|#’¿&‘ çÏ¿1ÉŸÉ$Û3q>P©Á:É ÕÅè ¥…õÝ¿0ã1 endstream endobj 693 0 obj <> stream xÚíYÝoä4ç¯ØÇ¬Ú ±c;ÉœéPAB,EÈÍzosì&K’íÇýõÌxìÄi³½è$ÐUŒÇã™ß|µ‹?l‘À?¶È8ü$‹ò°xµ^|þ Ë,‰‹¤X¬· &ãB,V¸ ëÍ/QÙ˜-[þºþ(e@˜¦1Ï€ÒTÝr%¸ˆúÁŒU]ôž&·K)#½?"j¶´<77ËP¼5e_Ý.y9²Y®x™ë„©²25nõ—°'²H÷Ds·«Ê%WѧéÈóFw$”Œº¾Ú;IZsÐUíÖ7'ßµE̼9¥´ïÙ8~³^išFºÞРߡ§ŽfͱÇ7ÆN7S-òÜ©fõÕ««ß¾ûòç µB:²ƒÑuçoÁÇ¥©S§½jª!Ùu>¯!ÚÚéŽ˜Ô ñØ7¸{·DúÖ-U‡ªŸ•Å‹%ê$ej%¼Õí ¸Šó<€AªœR¦n7U0À‰•îtÀÿá9øˆÖQmé«k÷=ÝWûJ·4½Ž úÆ‹ÊB°÷jœ‘°ˆ¥ÇéõÒËEß®oOej½ˆ×ÑÜ ™Š‹ç.`|à^&øó§ây‘_:ð›aÀXÌQ:Ä3f ONÚV`‰ð¬ìšÎ-ÇÙœJ³¡õ²éz¿¬K´çÎX°©¨ê;ÚygÚ†¨o,D›SíNVEëh¿ iÍ òz ‹ÍŽÆÛS‹ûtdcÊݳ~3œ´oJÂ×Ì…D¼u˜,tå†ä4Ž/z½Þ?¼3›Žˆ^ogý<lxt”|Œ”_ÌG‹˜ñÄ çžìrŽŠ•¿ç¼·Jz+<´3½ < EŒd>$ðB`¼š„ê³/ÎcÅÃkò&\À©uzøR¬(’ˆÐi‡DJX$ª2(¼qhVÕ~Õ}7ou9FC<éSGâSF†)·¬|phƒ µç áÓzбT“ÜÐì](í,‹®P\a fã5‡…3ñ·W¢©Å>ò2)ò 2)á*4Ï34Ðó˜ä`!ÄäneC’^AZÛèxöÝE´ÞŠ>«”©˜e¡–\êaäCäp1?•#õwç|2Wvó «gž.2´Öó.Àã‚…Ñø;ß/›ƒqYÓV”ª«áCV zyj[oK«ž%±˜¨Ã•#©Jß+øXWLЂ«`´mڒȘϪI¨*wÚ«J=ñY[ÃŽ‘²n2² dkÍq¯KdDTá Úbm@è@t)ï³b€¦¿É踷7¯¾µµGçw™¯Ô€%Åïï6b›#[WJ˜LÕA^õ°ÌE`Ì‹~Ü5§ý†Î×MÿD†¦~š%6´†ºä¹S1¦„烖p3´7í )ÎQ º~Ü+ צŠ›AŠ1¸ÙYëdªÞÔM;¬vĸÚ>}V…bk=,² Ͷ­±#¾sª}–Y±ÍÆÆ€B=)æ¦-b ÑA× `[Ë*gYº‡Þ\8lˆ„äúÚÑ´KñH¹ÓÇ#=½¦]²Žjw'¹!Ž'|òÜGÑ>å¢!N˜ûªë»KrT›'`1ÌXèÎ̦epcņhr6×Mò)÷ù4¬þB®‚ÅiúaÍ”«sâ¥qêÓýÅ˪†ùÄž ŽÉ Hì˜5ø|Ï7žÖiwŽ ƒƒ¾wŽ “°çcäb›!Õ£žÏö|)£žÎæÃ#OI`è{>Ž=L&=_’ýC=ßŧÒó¼ƒýņÿßðýg>ɇ†OAÙW¶ÙeM¿n±E‰È]Ã;®áÅ´áƒùØðÁDûÕi܆†O&AÔU4|tòjøøßmø.>ZÃÇÿ†oöÅYÌ‚[¸da¿ÇÁ¤¶$’¾$‚/‰Ò¡$’J"9)‰`†yœ^uív§ÕšL†~«Aa?;dç>}ÿÓÕÕ{¥¶×YYàŒ”–xgO³Å¸ ÝÐfuTÀ4õfˆÓÐ7íAد†ªÇ!·ë±Q"´~½¦?rLå³u¥²,Î {-c¹'ÿá³?“­mp endstream endobj 697 0 obj <> stream xÚ•W[¯Û6 ~߯0ú08E£Y¶äK‹=¬ÝVœmÚžìiG96Û©í4í¿/’í\Ö­HK2ù‰"©´÷Ñ“^?é%!ü¯¨½—+ï‡_C/ DGÞj¯—N¼Õö/ÿU™Ó-–Qûzñ÷ê7N¼P‰$M¬´†IFÒ/»¼)ÊeÞl—¯Ž+ýôö‰ÿ¾=UczùeÅgžT"R±… ƒT„!ai!K)Cåß5‹(ð‡®œÀß‹¡j›3©<)E¦µƒ‰˜9 ¤ý?ûªyDûCixPäûý&/‘ô?àŠò;¶ÓžU{2Y!²Ô"S€®…N |E(2ö_ÿñöw½¹{‹ƒÄïÛý§E˜øä<©ýMÞ›-Ë€õ$28õ ú …ÙwùÖk3”pjx±e 0¶E¹SÏ ^ûªÈÉ3¤zèÚÇ.¯y2´tš¥=€Œ„fï pàÛ=H†™7ƒùG‹®9 óÃÔ/Lß‹ÅR©Î^õ,ÊOéçÃ㶼ºAà/<®MÞXávÇO»‘ô½é–[³¤u]Pá¯Ø > stream xÚµX[oÛ6~߯0ö2¹‹Y‰]: C[´]¶¬Í¿ÍC&;Š­U–<]’¶ÃþûÎá!-Ù¦ÝE‘¢ÄCžÛw¾CzôÏ(ùðŒ"ÿþh±=›Ž¿T£Àg‰ŸŒ¦·£@±DŽ&ø!Moþð¦«l<‘AàÕYÚT%ÕxÂcï&kÎàƒ¼ûU¾óÈ[á¼óu5-T•7´¨­ðɽ»±R^ZçU×ÐÊE^•—cz-íPÝšE¤ž{ó:-IÅ$-o&‹Î¦Å²ªóvµ&ù|½)²ÉøÏé/à„ñE0¥´/ë¬ÄÚ ,‘ð@#<%)ÁÁoç—4hªâE³±{µˆBŸu>×&Ó>r»ÏU7o²E›W%ÉÎfouК¾­j,Ò¢ÈËåžrü:OµïȾºêڼ̾ÕîøCOŒþ¢Bé{¦¬»1S‚R7Ã!è"¸,ËJ»p­MJ„1 ¾Qvu:ýФ3ÄtââÔ®,«–›š°ÈšFG¾ÍÑ–´‚œ2º´S¡v ¦ŒSFSÞ’!Íªê ³QƒIüp$‡uÖv5ÆW(ýÔÚ`@ùÃüá;÷n*Š7L+xa _Jïå8æ^e¤²÷)Âç‰VýbJÕăò€$Ä1 #mÊ]•ƒÅŠcf«ëyZϼe±¹në,ÃÏÊ{4=£•„Oyy[ÍÆ‡ýâÂVŒä¶’‰p(ÜÜçíbE"¤4¯škÊáÌ›ÎÆG4¾‚âLcß«‹ËëógoŸ¾~þó“­¢ˆÖH½†‘;Ö씾ûÁä*bA2œÜÓtõââÅó)i:ý2M7ÙmÚ푽?¢Ím &t à€‘™amëVçìñikQ£Éÿå ¶ƒáá7–³‚²ªˆÉꪠTJ ò;Ã@ð6¬Sú’šç½.Â,·_uEÁ³š·inö(3\Öè\¯Ó^ÇVõÁ¶¦ÖÑqºe áuf ˇ0p1>J>½<'³{Co=1ÇD̉!f½g®¥ ízÃtÓf5@-Zz®íØtð©¡al±fm•ãâ¥Vµ¹":úˤu‡BTÄx;àR[¹ŽôKÅbnľc»Œ$GAÀT¯I¨˜ ”T,`ê<Ø>Óñƒæ<Œ_$ó(è¸b*6í_GÎ`m;›/½eNôjæR#BÑÍ úDYÙô+uŒ}‹ÿHšqϾ±ë׆ÄuÃÀ§Q­¾nì¡nìûP#Ë˽N„ôëÑžÁlÞüSõ` }ï¼ÌÛ<-òT‡AõiYr•µv÷`¸{Ìb‹Š Wb|¦3ÿäG#$ c#pëÒ ˜ Íü¥‡s K"œEþb!9æ;¶—,£­ÄÒaá`<3I§ˆ¬Î\¦ˆ˜ÉS¾,°ó:ÍÒ׉s$…',±U’>ï0½¡ôмi]E•0ñ™—³L§02°­Ó#SP¬wEpeôÞts Õ9`®™Ïœ©ŒToÿC=4‚£úP@†Õ9PMZÒ¥ÏO†P7xÖÜfJÒ’ÕâoNŸ«°`ýh€Ó¬ƒ@áHØ Äû™3°¯€¿¬(¬‹¼ïä‚ùÂè \{Iˆ>µPïé^Ÿ@p„ùäIè­ó2_›Z…SÍÕN/¡Mûñ×qÓY¿Ê‚fæû¾ËGÎYÈâcú~àãåÑj  #©“nª7å7'Rq–Äút¦,v]D —˜ò.Ýöô½¬Ä ¼»´è2ÇöQÔƒ/Ü7‚E)^LÁÉnC—N<Çáûì ßøµ2³æúd/ PK¸`'x$¸,ª9TœÓ £êôµÖ§+”‹ã ªòè¡HU'p8‹…Ž2nS͇7A¶m öÉ×h©~SUèý…™²×p<tæõˆòûŠsÐïqá"2Ý3zØ;»ê$×¾ÊM_½B¦+`àä{ Š½ZSK‘¾O˜+Û]~pèËÉžƒzŽñd±ÅúÅGáˆÔ„ óà·3õ†ž¦×½ù8•ÕÂg§‚÷è1À bèâñçÕ‹Ûoþ)¿CƒÞïUj\,+{R±¤%½[¸yç€%­þ6K§w„Ýj^lœ Íøtqä“ u>°ç=È)sñÜ»f øX«}>æQÃÇGJ¬Ç_–ˆ=š qéÊç ááA wïPr´™Ï•SÓ€ì¾äH…C‡ÈgîxÇÑWðVóv_Ó ÑîŸ35ÎÜî&LF;îÒéï ýl Æþ¤°{ÊÔ?=LB8qÅ ¸¹oÅÿæ%ì  endstream endobj 705 0 obj <> stream xÚÅZYsãÆ~ϯ`å ¬¬Ì=pJ±§ìÚd7±òdæ"¡ PÚÝ_Ÿî9€4 ©Ã•ZÕÇ`Žî¯¿>fV¿®È*ƒd¥(üe«íÝêÛ«Õ¿'ð,Kó,_]ݬˆHs¾ºÀruµû9áéú‚Ë,ùóZd·«êOë &T²Ù싯_~7:Ù®E–4u׷ت¨ê¾[ÿçêGè\}gЯN3ý¾/{ׄpü<Zb“Ï®U+•æ _Ë”²ós{ÿ12 ‘)Y] m®×T%%Ì“±¤¿5ÞÆ•mL$¹}øËD"ô(¾ ’AC¯‰ŒˆÄ9»rž­ŠÏÞ¹3>Äîg,χêOßPnvgFž¾2UK-'ÄFµ sȈ|u†Y_öbFÓ#œÜ¦®<|(~2öfdwheRÔv-CzbSd|µy&lè§–¬ðùf&yÛjF¥ölÓdà !Ó fLÏÆZ¿ a­Ú޵þÉQ5n*ª™ËÀªØF'ÍÆ„5¦éuã\†ÀþZçGƒ“NøØ}¶Y#Sç bœ¼™ätð`Ç Bæ³Ýs.‚º"9ÇÂRYwîÒÖ4ðª©÷_ÜëÐsãÛ:8\÷ménZ;¦·gYDâ{¬í‹]§`9&`QL±”xo‹Ú{½-ÂÐ×5ñÂn¾ƒÂíAÎaÂjãŒ1<:¬40ü£éK_Ë·U}>VõÀ•‹BžTõ]5K §rxP—۲늶BO6F B³:2ù¥ Ã2ÉÂS.xkߺjEfWe«@m¹/>3‰&Ää¬s…âœýelXÍãWá*nÚO+wáëÕË6-8Çc§âÔO߈ú… ¨ÿÒÖÿqH`Úƒ·!±®‚R„ó ’zWƃHòÔ…JšÄ+¦ÆXêmW-Æ –¸É²,¶D É2_\"qK¤')s÷€ë\œ¡ÜüqAœŽ:xÁÁNSgZÜf[87…¿îT¦sÀ?ÀkÏÇ,ù€çW«ÎÔ¹çrYuÑõc‡£Ïñíg`ÚÙ7Î,.„B•ŒÕõå½ („K0»ÙölL:=údO{¶ÿ=º!x|D4(QVKOé"Ü4åöèyÑŸ9%üÁ¾x¤Cºº|E()ÎOº<7BöÏ“Ÿ®>|ε¥Ê¿^ÙƒðÓ¢ R©TÛ B‰oþÏßýþ䃿 endstream endobj 711 0 obj <> stream xÚÕYm“ܶ þÞ_¡oÑÎxU‘ßÒW;±'mc·×Ou§ÑíêîÔîJIëëÍôÇ (‰Òj}{~›ÉøÆ"A$àÈ~ŽX”Â?ii´ÙGÏ.¢_¿à6²‰U"º¸Š¸4I–Ek–&:ºØþ#~ùâù·+ž¦iüǧϾY1­?üþw¿]1-c¿þÍêŸ߃Æ"˜dS‹bdbt´‰NÈSÏ#Òq¥5c:á ¸²„[騲D(ÜŃ4~ŠO~˜¼¥¹ü1s?p/ŸE¥5äÖCèİhͳ$UŽlyÍ•E"fF”H´KD³4ý,Î#"KU’YÓ‰%Çû;1ƒ4ìãˆç0ê/´Žùe¬£?í:SL[3É ¬…IÒlD5f­}$ªI Ú³%Tã>6a´ÔÛ4UŽ\Ñ‚+füL²~ 3‘Ù92A ¦I#¶ÍÆ z€8ÆÔ‡Ì>"N Æ2F5xÜ“ƒT˜ƒ¾Y²–d ÌY –(âj=”qß#˜Ïa'Âtš™rHvDU‹ÔÏÂûü"ú9G7Ñh&œF íG|­ŽvÑߢ7T\‡ 2ð~Ì ŒóDÌ&Àï‘fΩu3“X@ÞLžv™Ê ²$ñÛ‰ÊYu`ù`0çÁ:ÏÝ'uYÙö¦“Þ ËE%—ÉêQÜç $kŒK²v†—ÎáfŰKˆGD¤ÉO5yj“‚{C~µU éÀ"/N´Ì¨âgFž³É'f^ˆiÈûÖR)46p?L;Ê~KŒü ³PtÎV2gÇ"”£I^.·tµÈ¥Cðþø¬Q‹\ç§„‡¤šl&õCöJà 3¼mJ±‰àm¼‚À/÷ˆõ– G-²s–¹ßv’Ž£2”>NIwkgì sJAÌL  õO(ØKúƒdç“2tÉTb\…nºòJ/Kk&±~ħ)ó¸ji²& M©«uþ¾uÏÒê¼ø÷!l"ðpûÇ¿+#â¼»©÷Ŷwýc“d0dÍ1OÑô‹ò:Y­³,‹™ÿ>­VȲ¸øo¾¿ÝØq}EßѶț ª|ƒ}wMQ$“uܪ Àg†«(ÅÒQô‹`$bµfŒËøÂIÔÒKÌIÔ™“¸ 7ËÙ§îÝ~M¿5_6y[SñMY]#IÇmWÜÒ )b¸A‘u^m×›CGâòÝuÝ”ÝÍ~Æ¿ \Ø1¶‡ËÛ¦¾Üž³lé»-ß•[°iFMՉ׉þ¦ÃÑ»7qÝŸ!ýšð×—¾Ñ\ûSåÉxŒpŠÜÙÏa|œŒó®r~е>\¥(ITÅìÐÊ@ö 8ãq[Ó©nX¨£†;Døæ»'ÓœM^ÑÈåj ZyMqÛ­?=w4ÀZV³e®êf?[ÇO‡ Á̺ó¾öÚç>»ÒÆw7åàŸRUdÛíÜÊÐÆ}"ICc͓ҫO±’iœ7+ÉãÍÍR ÏY7‹Â&\â¸),w#W»Ä^}¨¶ RÆ·‡tP bS¦ŠbS†± wJ^טÄ&èî"Éô§ÐÞÔ w•?GÉ釩á kX(ƒ°öð-„ñøyÞ‹Î V«ÚÙw[n%ëa áVŸ¶‚,›⨽%‹VÛÖO¬i^î§~…>)óIèŠfßRó§a3_‘°ÜmjöÓ(ó+´}޼'ýF-Å/Ø}U;·½ßׇvw`Kp×Ç2dF_"U4ùåŸ^ÿ@­"‘R„Gv´úMŽfy·ê·'ZyÀ!°€0Ùíj‡æth¨Õvy»o¿`ØßÿÝTŽ.‡®YTîRãŽ!¶Kh ˜0Lóøø˜#‚´èfš÷Hªân7=ýA¡Û†¦lŠLAéx­->®?F#·‘âAe¤Â>TF8èUvE~53ßê‡8ã¾t Í›ÜË@§F!—ÎÙýá,«Æó8Õª¾üxX=(Ö”XRï”RªOîƒ&Þ>Eµd?÷’2hB;ï–¾,ñJZ¸ÏèG)é SnV“ÏRs°Ýyjz‰•G†^9Bƒ5·»Ná@÷é Û¼ÃíhÈš]sØt‡ÆL²#…@8o‚ê8@¨-4Ðú­(n[*¡êÊ ±†º›!8ݤ×xÑ¥NÔ)'#ºõÅãÕ¦þE´;uÄý)>¡É¥÷œÞ~M±¯GdÜÒâWM½'öý™@ËŸ2BwÊ'ðúÁM¦ÒxÓ¹«K2ÅÔΠœ ºD3(a’èp€´PäÈÛ¶¼®Hzê·%FµéˆxëÖ¨Ûrì-õ\}”Bo0íì|cSûÃîÜprwÆÔƒN…z·ÚæÍ–ÈApP¡×¿ºšLÒä88mÒGZãWðËS“jav‚‹±ËN¸ÇöèÇKˆ…oÑŸ„¡àC?|¸U¾Dzr7/%R|îœ\â‰WG&±ø ˜»ðÃ]x3| ì‹ ªíëÆ!†Š¯‹ªh`䉶h©é!H înœ» 9.`4Rã‹vJ’QÏ7Tù–Ô°q=_É• œÅßÕOA¹½Ál"'Û„†‚‹Ôgîí‘2Ú°7¼‚ÜMµTF!2áÍ•’ódÉÉ—2À„¥¸ÒPÐÑOPŒ¦yó«ÿµŽ¹ endstream endobj 714 0 obj <> stream xÚÕYIo举çWÔQ¸I¤6䔞‰“ÎŒã8È! UËÖX%Õh±»ÿ}ÞF‰’ewN‚nX\É·|ï#kóë&Üð/ܤü6‡óæ÷›ßþoÂÀσ|s‚îV’Íýñ_^ÿl¶;^Ó–Oe]TX ½KÛì+sæJ³ßîâÄûÅzé-ºÎ¹Ü7òeA¡×6C_Öfûïû?ÃÂa欩Ôp‡¸òSuy,ë¾¹ô2ÔÝcœúQ*‡rc¯Ú·²3WXW^)›);þµÔëm”z½iå0Áx\fåÚ2Pòã˜äÓñb{<¥¼ýPVTÔÞe}Ãr$'„Æ¿ÞÜòÀKkº¦zÅ1¦õI~û¹é™+’þSÓÃ4Ç0¿èm‰š’IÍØ:S36àÉð;²q¼ÝŽÎõ$„¶ƒã¦½ðˆ²ïLuâAÇ¡-ë§Åò0lÕÔÜ ›Ùî¢Ì;˜®c]ÙÃŒª:5(ZgÞë4V´e3tÜpÚ Ín:#MäZçÓÆ°šz_n¹¹5UñµÀ t`S¦ã…ç85gnØ·E}@Ïp œx¦?ø[ªd`ý#¯jx¥škå‰çó‘¡•…g ÜcÍìˆKç¤û( ¼ºé¹€F€µ¢\\=ÊBï0´­awãY‡Fœ>™'3›eÚäÜëZÎ…+Çò!m j§¶‘Y`Z™>†-mh¾¾ÿþ¨?l3å‘Uà™¯ÅùRa@iØ”Vá´¬vÜÇÇoלIBD3R˜!òÈr 7_ 纛6‘ð&’ÉÞ³Ù Šú íñî|è Ð0ñnbðÌ¢íËÃP-G¢Èý°£3OçÑz*Ni§øå@Ç©# bï ¡áЀõ;ñz:.Mnx.¯’:NÎíïqÈ9ަãtÃ^6§‚ibÝ‘=ÄañXà{´@‚Q ¡Äî‚%^ ]i8à •Ór¡Äqaì¥M»r&ͤá@Sdø‚zú¦ðzg&Ò’RìÇXpÒÔº¾èÍ€zO ¾€Ÿ}_”ê e ètMëLËñ±ÄÑ… o¡2Ç[wXq¹TåÁóžÚâÌ Mñ;X9õت½ßßÞ|€ ’»+ÖÐÛsÉþÌ®yløK¨£í8;w°ån=CÅÞ?:xœ…ËÓ¨ÙjÑrµ¹p›àGMXq¬»o¥ØMÝ–‡žhÔ­»¾¼@ìI;¨€üÀ–½¾gnêMú9 $rÚ™Ä~èÇÛ]Bþ¿gß‹!`z.@è!¾ðßj…Eˆö£ØSöç‘—./‰ü4¶ÁÒ3ÌA18þ6ŽÖeëÐc™CJH¯À YO¾ ³ã¤Þ¥*j#íùú=#N„œ a0ð%­%SÞDzX)“X1.ÙÅ:önd}ÞW*K{FUòÍ4÷³bÉ0ÿÇ/·ÁR"ڀ“©Mka †XÏâ^Âp,Œ±c8ˆLÙƒv£c»d29lC‡•Ò8”ÞPZXõ aÍE}€’]È!!D‰¯"aÔÂ`ñ ‰ £¹°"æ¢öÉ\)™KG˜¡[ˆŒêÛ\C‰K¤õ’Hφ¹Ç_¡'V*›£R`y„W,Ã9K©[¸ÀFTL«2 ØSR4D=åI<‡hí)-àÔ¢3 i³Ìó*fÍKg‚o<=¯ï!sö«sgý¬ ?É¡œÒ4€yÔ\q+» L3vŒ5V%~B8¥\„û™d¡0‘)dº3E×ÔƒQd‚©¢ª8èSëçÒº/[€¬lÑ‹ûÒð•ðE;¶R@)/||+…N7E!ôLQ(-~·™›Yɹ&bKU1ácR Mør÷î·{—Èï̯d D[+ ã‘:¹ƒ‹U9Ü€öäo¡ h™ 0Ê0RGˆ§èŸ¹Ô[)|n<°Ë×/¶Zû¹½Øz>ÞüýúËõïWöœ$¾óƉבÓù…{fÚ1[ËÕLE©¯Ü°Žlj¶ã  · ˆæ$ ¡¹*LL"®n$Q϶.âRÑUbF@’ ãIq'©jÌY »àèÑ.P™À [^R*]¨äjêBr“tZ¤±÷Mì¨ÊNİ’Œ^0¸„ ôªfN ú`˜<Ü gÌ4¢k t—ÔFº˜93sÇ|ï•$u_Išî‘•ñX7ÇU¤2?³þwÅC9VrIlFýƒý²oéxÁ ì½²¤KÁÀißÉÞ)Úêç™;Ä(³ŒÍ>ax£Õ– ˆ©Ëf÷ä×7'Hn© *L¼ãh–ìÂY|ævï2ŽØâjoKèeƒÂIÞ‰ :ó $£êåEpàÔ°Êë N¤É›†sþ0Øj»m*î+,ð^ì³pD~feß?ÂÚÏk|5ðËq9€x¤k+¥ñy©%´Ýf£$° çAX–†;ÍrTm‘³ã±ÄŠ]±ÓãÎtÇÑ…/2®5æa»˜³=w|̳”8tfÁF:»¢à0P>4Ìã±6_?‰FŠˆ7kúQ¸xiÍëGsÀútf»EnUxƒI¾Ÿ\azåCe:‚¥ÿ«¬z{w}{÷óÿ0«þ2töQ˜á‹ó«¥%6¿ Þ)=¡Ç, @ß+JOÉx|ü ·"ôB÷­h–“eêIGú ³ÿ$!GÀ9%!§’#ËG#‡²I#‡R÷˜±gz•mÏÜÍiKÖ³äý˜Ûéñs¶àüÍTÏŒªò…Âz ÷%Ü-øs„ÛÙ›#1ú“…ð³¸}°.`¡ñÉÉ’Ö3ÑØ×äéwòpÒº‹‰ ©åõp-Pƒï‡((îo\qnÝÿmœFù’eE¹Ã²°›Þ¶ez–9N£\®lØd㔆~§jÊ-§w?ÿóÇëŸÖã4rãe£÷óz“÷c½‘~ÙPþî¥Zü–3w¦œ"› ÈXr«nHEiFlÛ›K_ž‹ªìÇúH¿ô"Ö¹ÑÑŽ#ÁÝ Ð«Aªe7[›ïרÀ¯\2³1v»/5ß±VÞì/]OÌP"ï+áð#¡_wæwÚxöîD/Úì’4õ³œd†‘²Ãÿö›ÿGÿ–3 endstream endobj 719 0 obj <> stream xÚíZ[Û6~ß_!ì“ Äª$R·Ç´HÓ,ºmšN±;‹lËc%²èHr¦Ó_¿çF‰²5“´o»D¼’ß¹:ÞG/òBøyY Co{ô¾½ñ¾ù>ñ¢0(»Ù{QÚ[ã@êÝìþí¿iWkh¿«úÓjç¾iûЇ†ƒ4¶eÓlÊí*Ný8¢üΜ‡º•éc‰3nÏ]WµÈmàsêcÙðlo8i¹göüýñ-»ª)/qK’Ø?÷u{Ïs/ß¾"¾ŸžDüæû(wž@ikx(ö¾9ÝÁ•ÝuæÁ»Ï•æA¦„ôųµNuPdîù‘e_ Èò®-ÕÛ" RýÛ4È GBËnÓîú'ØMR®•Ö~Ùî–øÆy]ð=–Ä{m/ÍÙJàkÁ!”Ž ˆYœ 'V:ÆGü„UÇý‡ºi¸Å0¯º5ãG…:g¸7Ý@ÅðÖkBFýGÉ€ÀA~Ld¬Öiùoˆ€d!ÄMi­áïRì9:ìñ*ýF£þe¤Q4êž teïæÜW¥”ÿþÜÜêªáÜxHnõ%EK~2ì“¢öÊ[  æh­A5*&’àá‘`Tœ§Ã_¼üN÷ÃÔÛR7üÂp3ÀùñB°÷P¦F•ZÖóçtL'vv@3›÷wŸ@äÏm]arÁõáÔÕÇ¿¢^OñÛå›ë×òÛšæËä[gêI}ÊùÚõÿgäµü™Ÿqe 3}W}ºº'£Ší.¦†]˜àÖ¯ƒ ¬ 3ûiž¾làY™–A…LÞy † ÍöyEW—À¯¿6mdwá 3)pàCÝ¢ 1³0´ïÊ-Þ_Ùpü 56çûƒ° 8˜ úpÿ}Ô|L¢h»]’ã%Í0ðÖø"h̸%Kå¢Ì8þ,>¬yh…›xþê„Îeª îO˜m Ü”Ê.7¥rÁ‰º¿rÁ1pS dêyQy:5Œìñ- ½,sÕR±½Çïmév'«ZþÎkÇ#.Ût{f¶r¯n$ }÷ZÝ=‡´D¸ö ©ƒGiFÄDM‹qÝýuŒJšÀš8D%Ä5N@¡Ã¾ò˜òàah<ŒäÁ¡!  ‡®ûà°(†:åH;´Á Ííy¤?o·UßÛ*K7óú05EÝÐÁÇÃÈ–.Rä\ä@Ñ6áè<†J*žŸÈ…ö$ÀR6Ž‚ÆdD`ÖQØw¶ÂM.Cß( Bå8ªÚôw§;â¯8æôú“Z,{’íYFî«¶êÊ?åEââR‘âÂQ$œF¸X24¨Øf/bpÈz"}Þ‹¨ ,\/òÝo7¯_ý´”!@2‘8~y£áý&?‚}#ó"P±äG’ Îg@úêGþÿýˆNÓ«@*ù26.LR¦:Ö ÊŸ`àŒ"'ÁyèâòÛ½ÆUùU;,àœãÐð “ÈýÖ^ÖžK q=ð—Ó>$²Ù†à\¡åwq~¬RBëÄ?Ÿø»Ã—‹Áx#¬q`Ó•-›SЀە ÊñcL|w;Ò wë ŒRã(a&cJdN4WLœ*& צÀÜgùxmÃÀ;f™jJbÍí*AïʱJ ­Ûa)uQ1Ë-J nº >„­)@Ë€ÏWì Fó?©ŒÐØL©N|SÛÚ rÛwæ8s!Úÿç›·â}‘Íã`$m¾<2Pp6t*ƒÐ9ôg#Q•Á· 5/åACã]cGîšÆ¯jXiâ”ÅÒdÊui¥T PQ¨cµ¨á@Z¾ÂSóÊäRâÀc&1“ø³Ý÷‰yN¸ô“¾Q£ÇµÊþ‰˜‹œ¤m½/LF?…ƒÏú©" ²ÌuSï~þ×n* t,”·~_U̽ä{!Óö ÏQ±#¾f™é1zrĽ ”´(‘FöLØVvž‹‹r#)é€s%[Ó‰9°¶;‰qĹ)5á€0Ê8Àù+ ¾wu*Þ< ÆÍ…¾¸>Xâ5kÝž°ØœÛæ`'°Â„Í d‡pŽ|-|i?  º,6&ÙóÃ4~%»³ú)ûAœM†oá–MùbP§²@¹ÕBˆCJÞ­¯ÞŽ|üó²ÚêŠ1ãE¾3E¤4GúR`Òj* ã<Iåˤ ™ˆÁBÙ’oXSRE.Z΃jI´Mº°1+.#÷A×YR°ËUèëI_)QëŠyåž„8Ï¥‚Çm6˜ØbÇ’_ŧ¹ŸºtÓ ™ª1ŒñÀæ(QÇÑÍœ;¾,6ÄóšæG“}ÕÀuôLQGH·õhÜľâÕù¬·‚+¹@²Î”¨.΃,Gi™qi8W 8Éû&6Úßuæ$|De.¶L-1þ-·\s½O^‰—ò”ðó *¢Àâ+7ùöÝËŸ¾ûáknò57y67Ñ&7ÑS+ ¯j\™”_pnþã$–I§й ÑR !öËr’Ç‚–û8¼ ?׃íE¢¬0<ËxÈÂ"I²Ùë]Æ\|0w'ôX"‰}Fà ¶#¶mÙ&NGdS9Næd\ººƒl1:ßL—’Q\”-x(*ø>•}Ï-Â6L‰ Úê|\ xäw9˜ ÉÓÐÖ¶Ãùw`}m‰É¥y¦ÄN(ˆò‹½×áî|Z.û„y»?4J8®Òh–ù Ï°~z¿â³ QÏœ, SK¼”̦8Ùe؇«Ü’WHB¡ßEvÅâÌ´B˜ók s܈¹Ïæ ¶7﫲ãc!bÓ˜~²Ä PdÉ>z*rïß;cïèEyÄÜi¼_½_$ßJ=7d£x‘q 5RäAšÌK±L›yyP¤)ѦA×—Bü¦Çÿ‰€¿ŠåÕ‘k*´ÎÚLWß À Ç)#þ¼;º~nÍ ËÌìâér_(.ãîùÙÖ:ˆoῳTòÉ“Ÿ„”i­Ûm5JßKó:à†3“uGñ ô!·µtògD1’>2ídÿ4—ª _ö¿oÌl§Ð•½üNNºÇ¿•G2ª8N,ÈÖ>2Ø(H*šzÌ.ÂÕ«vŽˆÉ² çd:ŠÇ{ûåoÿÃJ¬ endstream endobj 722 0 obj <> stream xÚWKoã8 ¾ï¯ÈÑ&®-˯ãv1St1Ûvö°YŠ£4š:VÆfòï‡iÇi3EÑ–(’"?¾”Ù÷Y4 á/šeþÃY¹›]/fW_’YEXÌ8žã&-Öÿy¥/2okM©ý¹HbÏ´ø•ÞN­5­V¾H½#v[&–ªªVÊ ?ÓQcûÎÔúì²èÄØÚê¹tCl}«ù…ŸÄ[5ª&#LýÄ·h"Ôæ{Ïfµ{øæž.Í2Œ¤^¿gš­Qºklåÿ¿øÓ¹IâÜÝ«FítÖàÑÕ—(Ÿ“ˆö¡c\5`Æ–Ù¦ðÉ0€q|>Õ2/D 2¸4’Øq]ëoœÇ9à[û1À£Ÿˆ  l†ô6¶¯×.’ S t7ŽãW‘ˆc1D‚Ž1ž†ëƒé¶¸’’­Zg²Z‡5ÄÿFB¦h¹óõáñöúöîæþ‚É)¬˜ÏlHóׇá¶JýPì5ì-Ÿ³9þi4…ÑižÇ"âlɶ_í»ªôD² rÁ%ˆK"ÜS⥞s:K½Îâ7÷ì¾3;U™µ‰×„ß%†à€Ð`1p‰.=èÀŸ'ÀúâC×,ê\€™ïïš¾ìúFUt@Q î$ó&A yÍ&TS£EÂhG‘ŸxH9P0¢¦&6‰Èe›g‚ûê§Ô—>Ô Út-Q,À˜¤Þ7]v†ê–裻l³3èœÞ@è¶jbÆït¶…ù¹¶xÇ¡¦Ä=÷òa?ì†J¡¢{S÷X.ãpRUÊ­´;ê¶æ¬j‰mcâÀÌÄï43¤â{J»êTØšv¦&ex$´ÐbhuÀ|R>H‰Gµt0^<À4ü±úpI&Å©m¹Šüçþß›Ïw—J2 RÉœK¯Õ ¬¢°X4öÕK?`«Â"Èó)Ì–c™–‘p #.bI¯Ö¢üuû@”IT¢˜±ä´™` ­ é¿?܉Û[{ Š8ƒH°‡OÕþqgövõíñEUðÈóˆ¹?]Ò7—© г¾3hmìáCZÁæÌÚ¥fZ‰|emi«wôŽsgžÊÌ»³v7ä0Â]%¹èQ ¾JÊM†‘·ÆòÅöBü6$tUöŽ#ôžt­›!ýC— ç§£ N¦HìÔÐB¡vÇúp µ^TâÚö{—Z‡v,óónêã8 Nè…îFŸ o,¬K—<áØ H*]¯»CtÖ`GhÔ`Ö`ïº$.J S©:ÉÚõU¤s~¿ÖkÚ_T6EDänà¸/=^òûÂÎ=•€XªVÓªµ;>ŸNØ x†A§-éŽ38*Džº`Ó[ 6[yJ³i“—νÓhÝ1~kèA‡Û„ç,ÊʶšXÜtR­áÔ N<ÀÔò4çPdËj\“眧9çîÏðþJ* §^¥xx¡=j0§ø›áÕö£ůç9¤î,Ž¢¨²ã‡ØùÐ& ’pz7Ñ¥FÁ¥ÞŸ¹üÐk Þ¶CSÂéj“êµk·@±u…ƒJÆ< $Ú9©†rFÒ¾o¸Zc™aêÓY7Ø<¾KS|—:/ø]JE§A^œÁ»µ}Å/ÔÚ2j;|fsü`ÓÑfvzK\Âùóâío"!’ ³yšehÚ‰d`ÿû·ŸþT endstream endobj 725 0 obj <> stream xÚ¥XÛrÛ6}ïWð‘êTqã¥~ª]Åq'uY™>Ô%A2‰”I0Ïôã»À‚$+²M2C\{9»Ø9x hÁ?$ þGÁdœ‚wï³€ ÂEŒf°Ý§É`<ý;”„õú”2žçM1éõy"újuQª¦÷Ïè`0BT”’LJ§CD$Î:„Z-2œ/Vݩǀð, ž™‘TØ" –AÌIštÓEp|Þc`#äŒUóBq *<Å© "}MñFÈ)®UÞT¥ \„ÿaüS¥U½k Ϊ“|±(Ê9NôƒÚ¬ŽóIGáWTé°´¾¿{Ÿú(3žô+L™ZWnŸËjÕ;¸ûghB`nN≢Խ¾DÜï¢{ôõÎÎu­îþ<ºëísÁé£)‘Ü**ÝÖeãd¥oZ’Lø¢#´ˆÙNˆ[þÆÌ¤>²òÛ.î±B!q'\;?À sóáá¤êõYÙùæ™ Ÿ `a᥊rZLr­ôêé¡Çâð÷tçkÛ¨º?Uw¥šâZ—4ÿjÝêÓXˆÂ—S5ÆcŸsB†ìw þ¤¡Â2€¹Q¤¦¿îâz—oî¯n£=PÄ1‰;ÜLQr@Y=¶ªÑf"\‚ɦ¯êj¼PK7W 5ÑEUžíó¢zwݸn†ŸNqcU+pÃÂ1QMˆcøé¯ËÁõ)öÁ6ÂNæªTu~,_†§¸ð Úºh´í¡&Õ¢=Ö…‹/£q˜´ú ·¿]_|8Åq—x)¬ó«ëË7– »vš4Z/JcQ«9.°5øèÓ¬jË)9Hf,Ëgk6c¯³™9AÙ†ÎÜü>óì ´µîŽ!ëö¤œî¹Ò/tÓˆžzÊi”A_Õî‹9õ¦ã ß9ÂÌ'æÖïpá¦/ÁÄ€Vû/4§½<Ô.LŽãB.8lÍ0è›%½Žp »üã¬ø»j&u±²%õVfäq|#’Ä;ÌØ9ºÇF&IÜqã$/Q½»f’8òÁñ¬®–(‚Ù€¥]âëŽXâKìk%–ÍÁ¶®ð벋̘0¹ό.ßÂÏ·°ù–ÒæØš§[lÍÇ¡ ~M±DÆf÷w×Jÿ¼ºÁ\éoF@Õ4CdWuŠÖGªº˜e¾øžW1V!îæ³/L¸&Äèep=”I)IBýL–ºZé}­,2łŠõ:Ì  ÒM¬(dC„­²Ò80 Á²° õSÑ85…“èŽØR1s×"k”n€mÌ3 K}(Æm±ÐÝ»Çe Z-ÀŶßdϵŠNyg²äpR§GÜ&Ad¶ûÒ4&rü¬ìŪ֠™ÕÈÞ³«Ñ!¶Ð¬z»XÙf«ÃË*éÛ„›ÝèÁ[4#Œú€\TË¥*{> stream xÚµXëoÜ6ÿÞ¿Bè—Óö²ŒHêÙ¢Ú4 \8—×Þá. í.m«ÕJIkŸýão†CJ”M{… ,%ç7oÎ(øð ‚?dþ£`³ ~\Ï_ñ8àœI¬.`É#V¤ÁjûŸ0a‚ÉÅ’s‘„—õ~ñËêçàå*ø0YäÁM,õ, vA*YžÙÇ:ø¼÷LD¤jû{ŒóˆÅãÞ6í¾¯FS‘€î!ž1x^& ‹èÈu[mË„|wf>ïÚ›s>Óo†N)ÚÿfõŒU3˜Å³é$é©éôáÅw^‘ žç,‘þ'Õoºj0ô‰+mŠØ%_]¡ÙòÌtІtf¦bÊ™¢HW'F‘`¨y§ÀÞêz!²L@ÙÜ?ì¸D?·Vî žFgĵò JŒ"Ú^WV'¾!\à«_¤qn]§¤ˆ¢?¬—šóRÊŒ 4«d†ÀsßµëZí€Pʰl¶´è‡¶ÓrËùšíª¡_B‚­~è›áÐy­+"XrǼ˜5³ CöŒn®ª ÊêJañd¸/»r‡YáÃãQÎòÄ0zK¤,‰ É~±ˆ”i8ôªeÆRiz'WVŠGµN &ž¢tÁbëÖ«²ŸÙU†m]“‹«æ’;‹x¬êmÿ­âéÿþ×Ó ü1È_= Ñqn<9WÞg{\û[ Éñ$ÏŠ\‡°ÀZ<Ü裰”ÐQÐvû¬nMÂs•¡+éG‹zØ- ÖºÜcâã†ÍT\­ù%pùX¦Jìàî´ P[°mðè–笰Ôeo$z Wu[ʼó_ήe{ÓAéLŠ '\剽äãÉ@XU=í–ô390Ÿˆïg¤mStÕ’5nÝÒÖˆÕ·õ5¢)4º,RÒAs$ÏàrW:G±'™QÍÈUpvÅ}ûH•¸ǯߜ<-Ž_·»¶»ý‹icvÕÕvìcÐêR_TÎ>/—Þœ|xš #j|U_ÍvL´Ï–áÅÛ|¶ mòk̇/ÖýÅéû'Ö‘ºútP£vl>kÜ™㌳XŽcb||LÄоs¢y>2(:8LŠ#o3áíPÞ»jï3–9¼90Èâ£Ì]2Ãý²ÜÏ&ÅM»ÛàaæBUÃ¥~á"ª7'ïh ÏyÇCBø’ñ²Ô„Ƕ=@1ŸÁ çz@ü3§>ñøÔá%wJ¸‘ÓWÂÚ6êÆÌ=A #–18VH|“‘ÁŒbÚQHs–ußÒËMY×jkE‹f#S¤mﶇ²®,¨< ýÂ%œ¥¶'†VK#ÝTÃÕ$ ]/‚3þ`ñ¥d½h»¾,ëòjÛr6=V4Í?ß›ýtÖê2dL_½w,‹ìT¾Výp/„:\èWE ‰$`¬‹ÄøÂM¤Y—íA’»i:—‘̺ü,Š"ÿ°9Ͷ~!¡’©#d.Ñ·G…tÈŒëfëR§J䘑àaÐÂZ“g,^>ɸ~} üföÙŸ±´‡ Á$ÿâ1ã ñáˆ.@ØXŒ/ÔÝ!3ø8t/fºßÉ Û ÿë1ïýôãé}Ò\O“™`Q~\‡Ì(ðòÝǓӷó¹´ÔR&n`0õ·ûéÉäç“]fzÃíeɰ'„ħ2…‹µ Ñ_úqÖŽà‹ Uö•®àø=ßAW]ÚÃV—"Ä*¦_•Ð z‡yŽŸ"Y§øýRYñþh×emÆI¼ËÜrFÝ&Šˆ℺eèmšvjøR·õštÕtF]±U?Ç!Tc?Êìø{«kýà×?Kñ[kôx¿xU¬WƒùÔú¸‚Q¥œ"öüÍÿô}UÒ5‡¨æíÖ ^è/nËJL^hb.2Kþþ«ÿìüÕ endstream endobj 731 0 obj <> stream xÚÅXmoÛ6þ¾_¡/ä!fEJÔ †}Y×¶¡]ýmY¦¡²äJrÓûñ»ã‘e+vZl@|9òŽÇ»çÚûèq/€?î%þ¯Øy?®¼¯S, 2oµ…é%vboµùÓÿCõ‡¶î­~1éˆqɲDS&C-ººS‹e†~Ûú²Vf w÷Ž„ åo«ýMÙt7»rs›ïgT¤“ÒH·ÆÐ üžTE0Zå}ùi!_ÑÔooÞÒlÉÌž®KK&…køËf·Sõ"ä~ÿ%O´ÇV{ŒÚ±‘øeG‡Nm¨Õ74³SywhÍBs¢ÄÿxÈ«²Ç-p@úÍ–&z«u½XŠÔW]oÔ(Ü«[ÕÒ‚-ì[®+³_×TpMMk·Í¡Þè3.í±Bô1«C»¬ÏÛ+l¥Z­ÈÁx±fB£Ù÷å.¯¨ãè€Þ§…”~^†àŽ3EÀOÌ> Ä„e ÎK´&´Ñwá\\0‘yËAjÛ´dùh][Þ–µ5.û¶¿ì¨“W÷è¸|}èhƒªTÍ–õäÀÒoóúv6¤—QÄ ›–"b’k{Öx7(ùjå}ôX˜¥Þ½Ç³¥1¦VÄ"îí` a<*ï½÷Ž’q²½+›ý;xO<Ë7޽D4ç}Î1ôÏ;8†ã|WOÂ8†#5ªJŸP5ë‘$LHÇ!" (1Ï;Ä3™‰’¥•oFß* T‘w«(»BØ¢.wåcŽa|E¢£ ¦ì¢tž ž:2Qá3"A†,n$ÐÀÅH±Xü?Š„g¿Ößw‡+fÜ1&Æ×ÇAþyˆ*§ð¿HA 1þ¼oU×a'£ÁÆPb_‘œ† œÒuh~÷„±mñ¦£Ã^#šêq*ƒXJprKŽVœ)¿a3.Ÿ]—a*4Ý"qת ùÊ"ã8ÓCÕ—{Ñ Õbk¶y|ËìåÓmFn¬I‡ˆtޣɓ‹%ç¼`æIÌÈŒ¥­1dT2ô݈qu8RFÿdo–ÈÝ;éôâÞŽ”Ù»ÆrÊý:pg;*8O ‹.©p¤ŒŠMÞç $‰ü¿ñqR:u{7Qè@^vHFTòò:àQAzõA2z­æýCÝ컲›ÞÞøÇÓ§©Í°OM A áþ¾³qV7uƒJ¯uèõ­RFbuE²î©±¿^|?késñ'Õm¹×äãÙÌ-8›#[’¥È`úœ’ `IdäUÕ`"Üw¤§· ÛÀ°ÌU•õ­™§ÑÚ5íµ×U£±¡À,ú€b)íY[é,9¤?ÄèÈîI¶ö–’w‡õH~ íßß•Zzgqo œbšØy1BNŽeÑÌz]/®hðþ®±ˆÚª­jU]˜®F·Ãn1ÒJ»O7WŸÂ$dAl¼:‡M’E™™&XY†±@Bp|Ý(qW>êV¬q^Z¾SkëP<ÈCÎŽB…é¢ÑVjâM.B‘a}Ñn·M…‘¿ÏÛ|§zÕΗÈÒ1XŠõ6ìôp‘\sø¼ëÈ©ŸŽõñ¹8XpÐá\÷ÀÝç e8<º”IfÒ%IOœ&æas@œúÞ,:QØ¢>­!Jt<Ãø£j³F'|‹VAJèÀ^ÓB1ÝkMM½ÆÇàÅ(Ë wì†lvNXö©ìyÕqv´4ß:j÷=Eôn°¬&Ë㤉üû²ªf*_ 9‹ûQ*˜Ò·m›ÝmDÀ{ŠRX•S˜˜æeèlnÁž¶9 h˜^“}+7æ4}ÓKŒró¦˜@‹ÞS §ò"„ãŽùwõñ¡¾ø§ƒ˜_øé –_„Ëœ…üä×P‚ÇŒ…o;Ÿ[šÔîÂ/™$FCû$@¼å®˜ºWGD¬Ý·´8 4ÛÚÁ­ð–Œüß›~¸æ¼§›(·³Ü:ˆYrLB|Ÿ’Ô´q`ž8ýñO6& ‡ŸZ"?àéI‘c×'vÐ4Å»ø2±‹Ò„¥ÙHìLÿ±sôœ!vÃÞ†²]Ø{öîT¥Š™g“”;ûsÁÝÃ> stream xÚµ]Û6òý~…å"fEQ¤¤ëÓåÚ^{(Ò4Ù‰&Ϙ†æ÷º+Ûêd¤'xé³(YžøàW{ gQØ6 ±ZÛ33¹dƲ œá—’¬ÐÈ–Z貨;½oã4Ô4)‹ÃAïh|×6GõŽ“¡Óív§¯#žÔ Üå|˜ók¶+K¦ÕÝ G!¨‘DÙr•3ÃW0t'`ªoÀþBA´ºèFmÍ$WŠqieùß//o~þé‡7¯VD“s§!‡صN ¨ ü³°Þë{ÝÒÂЯŒ­qæù.îYß èŽ¡ïŠ8,êXh{tgf$„oë—:á2|ØH‡Aw8OÂæÎÉyreuGráIÉÃ5‹sÅâÄ‚â¶*@ ‹ûÜú0ëîzCÄ­P8tB!œ1.N‘i¦Ý¾#<š×ÂE©íº~qµ²@vN(¾ŒíÔ÷ˆO+2HŠô–¿ƒðLâ(dUJåfÏÖˆ$œÅ¹= ýÚyÁ"·_¯—Î/ o<÷ºÕ«¬Äó_Ç…#·_¡É¢Øš"¡ñÕḥÛniÆ@ZÓÒ¢1‚¼i«ûª6N™¯8Lø¤ ßë²E*‡/š^»óEOG¹3dº˜“ÕÃ뙌%R¦ø2ܵ.eíÈt·q”ÓdÓ¯é2cù˜üPu{]¢î>,ãÕE}u¨ú1®I«³ÜägƒÄÏ);æ*b’S˜“^ÞtU}ð2µh`à¡Ù©è:Œ!3c²hѶq´âK<+dgüFÜ9îˆrÌÕ8)›ãiè17 ù1áT‘ü°<5^"—T›X…ðn¨KÈj!·Ò÷ŽŸ„,a‚çoˆÉÜFâ8H0Åñxcõ½ÉÒ1ÞO&O(G¼±qú¡6Öy¬-¦ùuy¼<XœIžáTLH'eШ,”2òs–ŸÀñF ÏI†OàSEkj‘Žqé:$/z4ùØÜ&îŠéú¦u`p㮹 rdÄnjMZªzæºÉíÆ±';²•:&òï©WºÚ1wŸ-_Œ•…3 Ôv~„ЖÏ>'ó·(K}êõîMÇóg’J,¢§ÕArº[+’áèwÝ6ò’$ ÂícÕiËGE×ðV@ÒŽÔ¬jqa)a¼0PÕ¹ª•m%ôÌ2ù—ù‚\ßÔ[âmVâ.:”8UX­»%»Ü¢à éõ(v~¡IñèœéRFܶ¹€Ûƒ²¸±Dý¢O‰Ì…0!çQοˆÝ³èoÛ¢.±éØSÓa;–û¼`çíTwv«°mËòèpœº®+]ØÔe…•²¶ ÎÃFÅ.ÞWûÇâÓûÈGؽ­66ÀôáwÿÕÖf<óþ¯¶2OËk·Ÿ"ðýZÙθ«¶=jYÍ&­¸òÕdK˜“`0Ö¢8èF…‘iTbí‡5Îcc?Óš`D¦.çÀ)"•‘jŠH{¢qÙÂ&‰kL/G\Þ$Š˜ÊÇàÍ//žHò)xíüBðztÎïˆÛ†åÜ”Åí…È1 .|<Ï¿,€f© i.ðf!Œ¶†Ú¢Ó+ág¢ÖxÃÍÑ,š ÒµP°Lü(…[…¥Ä÷CSíæaJ!z3œšú/Äér¡Ó‡òB¨³×/Ô¹*YܾžS¾2ýƒ‚b™jcrgð†TdÐfÚs @»£ÞO¯5ŠV~IüÕj[Æ;‡ ÉЧâìµ{H"lǰw¹ëa­©ŸimVc¿¬ð¢%°Ç}åÒt"¬pý\)˜Aá³l0§;pµ/J§âqÌñÈæxÒT0¹X&t[¿•îùhò_1Þ:"Ÿf·Žðnº¾z î©h‹£î­Ù§Tœ/AX‹ƒÜ{E 7¯T€ÂG÷´DÖÁQU者 FpnœÎÄ@a7ÜÚŽÂ\Ä€Á½ øQ+¸¡¦ô¥­ZêÝgjí)°lèM[¶,ô² ×EKÌü{5&—:ŸüþÅÍóW_ ̘ ÷Œð‡£€Óx×`>Ö[«ƒ,Ü·FvKxtß¼ü»t‡“£¨žDñůO¡8tV©÷ºÖ­{¼$>ÆWÏ^“ºëêã çÍÌçà~Ìâ`«Ò©ÀÍéÀûןJ3ˆ¸ endstream endobj 737 0 obj <> stream xÚÅXÛŽÛ6}ïWèQ.b–Q¤Zä¡·-zI¿u‹@¶¸kµ²äHr¼ ôã;á,É«Mtb©çrx8rô>‡? ÿ<Ú¢ï6ÑW¯l$8ËxmnA¼ÆImŠ?âï›ÃÁÕ+%â¾[ý¹ùtõDWh–% o™V^ÿ÷zµV<‹·m^ïVÒÄû²¾£WýÞÑ kª+™Æ®Å¹[whP^ÚØuWÚ»SÛ‚ ß“z¾ë˨?˜;mm³­Üæ·mƒ#Áƒ ̗ظ*»>Hê"lÓº¼wãzK1­}X=.>£ ªË¸vg¨ÉîInâ'Á§‰âKRÈ-Z+šs½^ȦÌ$A[°#9³6¨œŽëm»Òtw{·T2a‚öÍêEzÞ—Tò7o]…+(¨¾ O*‚Š]$ÍíL"‡Ô¦”ZáSËVëDéø·¦w”O ‘z–Ð}Hx(R+‹Í@fv,zˆeG T¢‚^nWkDËmÓ†å;>-ú æD€Ü•R•w=¦Ø@ÃS8¡ü\V–£ÛŸF5Ûšyù£²ñ.hãã5/NSB"¾ŸÁãà¥mXUxLÜ—»¼"V Eœ¶—#cðÈ Æ,&Ð<—ýžFî~çŽ}ÙÔƒ _ܧ~ê(øÊk9ú?­ .§ã‘RÖҜ؜<˜`` Ó£bE€ìý V‘a™AaʤoXJÉükô SYtÑ@ÐcŽÈ'$£5d³Ì!ø`…°Û7«iîÁÞ^Š0D©½Iëa‰ï[w¬ò+†Aç!¸•NO®–,ÍBdÛ¥Àf“«È¢'‘'‘xù†sõ8;Fø˜¥&í`ØàTÉÝbò¬>¼ $i‚Ö'ñ¹³Q⟔^›ÍÁ‹¯Ì(«š ‹zDÀº-¥”*ˈ0äò?²TŽ ð¥³vZ:ØüÉÒ •+ž¨œþhåÔóVÎ}ªr@QêäZ·ä®Ê˜NŸió|ƒÞÅß!ß OaçÕÉD–Ën$3æ9«( (’ebŠè(ð€tªR‹íɉgž àùËkz¶®ÊïóQî/Ät-½"_•š ù½¨“,~µ²À}-IÝ}~8V9Åë.&B™tl ž`óTk^ öÜQi¬ùÙ°t`诗ºÆU‹ÄÇ•ŽÙÁ¾‰Š $U 7'±«'©æW…|ꪀ¼dú£I#m&NØÍ*4GÐ_Ûis÷mQ”È yU=„nbh† ]«¶¹Ñß$jà™:ˆ9Ý>^Ò¹Êíz8èÕ¨š´È8åÄ!Z>êx±á _AZÎúýÑ!1ý [îô¨óUZ¤&ôœ5Á³¶, îæíÐó®5´F?Ý’FÝÔA¥¹½Z3oqQT†'ï ÄBNúw®vm^MUˆƒAÖ;²T—ïßF߇®ýq³Þ¹‚zô7ô,’H`S*Ï ¨¬™d‚¯ÖBHßUÇaÝûxÓFç(MñNõKx°g§Uô6z³°Ç¨¶)›î‘ekð#n´œ &?iyT –{×ʾŸ0+:þ‡WoCuôô„\_øµï\7œãéë°™fÚø½Þ>Ôͱ+»yríüÁƒ#-gŠüûДÀ'š²ûòðîâÛշΑ—››Õ7K~«ãqüÁu»¶¤ï›ÏøñbC¿d—“Øfº‰Î˜ZÑGž.mÂùØÖw®G ëQ Ýp¡ó;—ußt=ý^"²ð-F£àׯ?½¦Áì'0×í›SUìØºCÞŸ Qy®ÉùÇ÷¤êj nLÏñ´tÓx$”ÙBµSĘ­*>¨¿ùâ_Œ3œ endstream endobj 740 0 obj <> stream xÚ½XKÛ6¾÷Wè(kF|èÕœ´AÛ[߲űéX€,9’6› úã;ä %J–åm»€Dj8ïÇG_DðǃTÀìNÁÛMðê]pŤJ‚Í>¯yÄrxß c&WkÎ… 7G½ZË4[½mv+…G³Va×hú¢¿Ëº)ªÏ¸lêÇ®¨t»úsó{ðË%qpÎò8&Q*bIîD1n…ÅáçòìN} ˜Ì³à)ˆs–){@åÁ)H$ËR·,ƒÁû )êö‚q,<Æ™b*»Åx "ÆÖ SÎ<ʘÈÖ`“âoŠ˜·ÅwÎþ ]»×nNà\ }Ãú€Ïn1ZFÏWï²ÀÄ9Ê̵*bgVè‡çª>·Å$|þ!ž2X¯Áxâk]ìWëã÷®~0ÒŒv÷v SÅü¸¹Ã—¢êhgû°«º‹Ýjv·3»÷«×³– VöˆY®|r›èBöùKgF–Ç)ËrH_CaëŒÛ÷m³ÝAVØTÀóîôcÓhv[ÛЋéØ‰3^F`oÅa¥[7L‰N€p7áæ\Œ çCò]7õrýK@©ìë_Þ®s‚Ü×?­oÔ¿'g¡þ{ÞTÙ7x{TÄ»ÒߺËú‡hwéjbwƒ½Oæø›úç7êß*aߨðùK åý‹ÂWJšà̾QçJáOï>çÿ XÀ²€—~軞À½ã„ÊÚó ûŒåþv&Çí Í M'ì¿ðЕ¦“fÓ®ã¤ü®cöç‘('ôÏÕ€$ÖxdßG\5m79ð{D<¾Úq$uø;8§z ©OçÎ^e2¤Fe|9¦B‹—1žï‹›Á—ƒË'ÑÅÎǕ悶NÖÑÖ[@IIïŠÃóàçË©kR}€±r5÷ûô(™äEÐiû×h³ÜmííB¸Ë L–¡mÃîYÂác»;(K{q»P\Ð/3þAjA°5²@¨i‰!‰ÒQÁQH"cc4º¥A¡ñe¤¢”!™‹‰KÉUM²³¦šKAùÒ|c€µÊýÝâ†cžVŒyñ‡ºÊ3+–¾4DR7{0p ¼6uU—õçbWa(eŠ%V]ýs%.Ûú(ëa1é®(oæZŒZÒ¹Ñ;½§ß5×J¤¦$|L¿( UæzÕÛ9IpEH\…æ8ðhIQnp0~·]g뮩pìÜm”nǸ|ÌIȹ àu³AƺŒnl0#l¤öÇ2CÌ%wäïø·5Å´ endstream endobj 743 0 obj <> stream xÚÅXI¯Û6¾÷Wè(Ï W‰BO Рí-o}Ń9 KŽ$'HÑß%Q¶žõR-²ˆËlœ~3tô)‡?"J%üåÑþ½ÙD¯Þ  Á2c¢Íöׂ³,‰6‡?bÃÓ«µÒÄÊóêÏÍoÑÏ›èSÄTf£/‘ɘՎ!M¢S”(fÓ~ZFï£w3 F"¯¤¨ÛÁ–3¶ši»$x$ò‚ÏMþùF²¢…0ÌÈ%Ù•^Õ«µñ!‡Ojâ¿ésÈ»¼9•_E ŠúÒÒl»ïŠÏ+Åc·«ãö²;7õ®ÌOÎÊWom„òy†×½J ŸÔ©|ÿµªÏm1x‹Ì ™DÊ`¾6†qb)ªnµ6½'pôZôTÕ‡üÑ-uMžÁ› ,çÇÕO³†‘a™QNÉïywiªÖÓšÐÃ2’þzD¯©¸û˜Óà¼m¶'tšç"`·‚Ié‚9#Þ²Ìï-‰û+oêÚQES_:ŒˆWž%“,éÜxhî<²Äz†Æ;<†ÕcÞäÕÞ+¯V2/§•´ñnµ†1œÔmÔG¢GFT´–YFù«æ((·-„B)å3¹q.ƒÌa«µÖ&þ¥ÆÝ/¨rÿoˆµ8Ò— Ä ¹Ršœ+ùéÜ!ûוUñi@GN©è¸ù9s—"«—#kîGV\…¶ª;ĸðK'çeç- lÏàipÁ¾8~|ý\tô¶>yÒIPÉ‚ŠŸà aøŠ D&*þò±Ø¯d¤é~Ûæ8òVá ÏPšôi…Ä#Éh8N+xm8n áÆ‚pæO‘Ä9‘MIŠëDJ]"áù8MÓÑÆ¤j|ZQšhÂE˜Ðw“À¡^Ï]M²TÇeÑv>ƒûTu<›ŠdÝ버ÃdY ¥¥Tƒ_§¡?tfZ¿Óx’º9À!4¡@6uU—õ‡b¿-K¸4/Ñ<.XnÌ´¼…öIöC%bJûü~=‡3jÄ%pä>?䯣¯F‹ûªŒe¶¬7sš$ÓIÓŽs¿g¨`Vú}—4[ð}“o;ôNvtu“ÏiÈðyí¨ƒMkßUã"¡4;t.f¹sAeÇÖÅÏz—@Ïæeí“Ù•—}¹5 ”ÄQ¶àšÉdQxH楿¬kPaËÒ½¨eéµ|{Ë"Á;ß³\Î߯cÑßÚ±l"ñô~=K5ãún=³}¹s Mµ ¤^Õ*X!ävR«`}òqÃÕ* ÷µ V§x‹4ž¶¨FÄ{\áZ2©d®´J:¬”²*¬hTÉR¬d˜ TÉTšx›ap§×‚«ˆr<ÔäÝÓøçC;㱌ߴY£¢À90/ä°áœŒE×Òe4Pt´V@êø³3@ØùæJ&‰«ƒÒ_ma0†ó‘ ø' ŸT;¤Â:°ñ °a‡ƒë®ˆÃò –’GÛêàt§T{RýüãÖKÅ‹ßñ¤ÞÚA\%xôµ¯»÷ñV¥À™ x›,ã-r¨lÄ[?_ÀÛ@ϼd{$]PyÙ#"Þ>–ÉQ…@]TPy%$¨ÈKºAó ;iŽ`î˜82Í>޹¾I6¹x)Ÿ@o^þ×ïD¢®¹(Rúúñ6Ú=ûzKFŽ1Õy+€…¥ozKZ'híñ›k¬”‰uëy'xmfñš ðø±“nºí»¦Öó%ÅàÏ´¶XAMt*{”ñ®ÙVÔ±®7Öh â¥:x:*ô«&P16=S€E8&£$˜ÁAèªTÄÜ! ®¬p„É@HˆŒ„ôæ¤ED3ïž;Ö”nÞ íÕ‹6TO×Ú?Nò•žB>œË‹ß©«œA¼‡qìáfÀ¸tã d3Tûãü|ã=w0níÑkAö@5È^ƸA…G–Õ bç4ôif^ rd<©hHù®¨gÎz¨/ øv¨öÿ>•Þ><œ¾]à®kàKÓàS}³ ƒ’n=¹æôdóA„ùÑuÊ^÷–*‰û¡·L}o©’™_I¬šJí›JBP÷Óˆ *øíŒÌI¨©£Ÿ¤æSZ–¾ 0§mMH$!¥àµ¹NÒ”Y*ŽBÉžüÝÿ¶Éï\ endstream endobj 746 0 obj <> stream xÚÛ®ã4ð¯ÈcÔäâ$Žxb Ý…eû€DÑQÚº­!±»IzΞÏŒÇIÓìE¨•ì±Çs¿%x$A ¿$(SøÇÁ® ž­ƒož‹ ‰YWÁú×+Š`½ÿ3üÞ´­ÔQ–„Cýµþps7ÉYÅ_°<³øë“ŒVYQ…‰Viîêà2·4½'ø`:Bì/Ûsg¶lý$™1¨X–ƒLHü¼ AÅòÔ]«)аÖÄD–Q*BÙÑÕ&l•V­z_ÊèMD"XQàÁå|¶RJvýî5¤ ŠÊs&X3–çV«[Z–¡Ò(Á Ò¡9ªE“àmoš &h0£þ±¯?ç,Ëœ‚ÃI-9!Y<¢xÖ´ 7¡6n2 Fè"ܘN•¥qÏ6‹V<-À“hO¼ñ&­Ü¹u± ;mÉ È\ø!–{©{·N5 Vå¡ÑÍ£»ž¤ïéJéYNC'%Ýv$€äžn‰"íÅ^.…TZ¬È>R‚•îvWk2Ð<ÕXåÞFždÎ.r¬wÝ]L¬{ê]²8G_zv# gã&›~õy^„»NBê#A5-¾«Þ„û‹¤-ºÚ®'w°íj½ÃXÉNY»#xèL{¥DAàt™t=פt€49d)VaãVmxÿHÀQ´¡ð@Ì~茶ÆÅsmyé ¨ÿ¡„·\ÄYø<)¥8pµAä)viϘxm-‚ß"ˆèYõŒ}mÊXG ªn¬ØöV“Lx)î×[‘0Á]À­~xöâîåw,D%‡J—8´…2–a>/’,ß}õqòWêOË^&œ¿P òêÙ‚ÍÐè”î¾î'< …´LÌêAGÍÁ?ãá‹ßpÍÂN6õ»šJ"Â'"ÅÑ%ñå˜6äøýòæ”rUÚÉOzÔÂÊy^÷RËìûºSÍãŒTy-ç6NdÀßr7(Bî>Ê¡25bn"úÎtìÏ…zoóÏÁOˆ“Ñ&ëÖ?®©w'mè’\|’¶‡åhƒUaúýpÃ!‰A|C¶òÔù ÍñÀ~Löè¢2ÿ¥e'œÆ¨VÖ©(Â|^/àþA 'Ú¡¼©•ׂ ‘vsPîÔ™êÇ|ôZ²¥ ZiE{ó¨Í¹WýÜåþ£¤d¯Ò¬bôDià“ËïÀ5w[æN›½ÜØ#j ˆðåz}»(ѼfÔïr¸túóGÀ´*!Ë¡¹i¹T” ðÒ•›)—˜Ä1+Æ*Ö9Y,78=Hè0;ÚVsi±0m§¡/ÌÖéaíå+R¼ºöë{vøp2½+eI™?™õü9—“§a aÛ1˱“Ú°ÀãM¨˜„%`Ìì¡„4#bìjœ”p‡ãê×|wÓÑÚÔÝñsÌÊ:󕘟¼‰™jz‡6€xV*½Tú 6SáN¹"-Ûó@ý[d¡{6¡±`1'âÍ{Ù¶ƒ1ÅÿÿŸ!<‡u²MZÍç›´š{ `ë-XñÂá§Åõ‚§KŸˆh=‘Í?!¾í¥KlíƒåïMËcÔµå€í®_Ö%Æ­'gçë€Ç/vmÖE÷¼‹Ì>( üˆ4XeÉUÈ$ËFô×_üW¿ endstream endobj 750 0 obj <> stream xÚåY뤸ÿž¿‚t4íà Ü*_rɲYÝsNŠr³Z1ÝÌ4zÞÉœòǧÊeƒ¡=Kò-ÚÑv¹\®Ç¯ªÜѧˆG üãQ&à/‰vÇè×Ñ_WL*]ßÁô–'¬€÷ý/qÊÔf˹Pñõ¡Úle–Æ»óH/'xˆ¸ƒÿyÜ54Öwç±n«aóþúmôçkâÎUÄ9+ÒÔ²W Ó…cϸ٠[õ)b²È£‡(-X®ÌUDÇHK–g~Š~l0ÙMên¸`œ q®˜Ê_b<YÆ':ºSÀzÎ å´ ƒÞ_ØÅ£²Û õ¯Võÿ¢Ç¾«þjvéûªÝÈ$6†QނcÐx+Ù¿ø:ÐòIrl "einùé±íNC½2®¿ˆg ¾· )ZQ·°]JÆývøpêºæÊwc†Æ¾ªˆà÷×7›7A1ˆ%ÏY* Ï«ñÜ·ƒ¥MýÝSV(ŸÔú¬pni×,DÖ ËsðJ¤¿2´I™vAoe1›Œn7k‘‘AÄda ² 54  À "ƒ\Á`Žd¥eQÓ] èø|Üý­Y[õF\ÐXÎêA2t)Óì*%nj¸§SSÂñ®ƾ¬ Ë#§h‰®Üï«=½Ž=ë‘=ë\l‚&^Žu\ æX§Ïb}Þä™XwŒm?ÏØ#"ÆpôËO4˲™3ü‹œ="âÜwˆÁ ]á¸Åëd™9¼ê_jñdP›Ýÿƒ˜àNG5ˆû¡ï.cúŠ^Ì)ìë¡ìíl[+K0qüGSÃzð®)ïa%‚Üw퉨©ÚËݦٺÝÿòþr~ßo+íç²™H¦uããÉÉ8Óª¸? OÀÀ6¼yô§jØõõi¬»öõõÀ]KSšcé¬çÁò„¿°`‹ÞžÇjÉz_X3œëá@ö#êÁ”•Ù!›Ê‹‹än‰²©%¢>JÁ^`.YyMöKh˜j˜Ú!ºhùñûÒßÛÚZLÈ•4Þlz¤y1®³K£‚n)YUM/vøgêé°g HÝŸ˜B¥ílø‚qö.öì‹ç‚°bvA˜B·sˆ S¾¯ï\¶T"ØÙ8#ÂO8¾HDr× z›q4fs>¶DjÓ4dßP=@¹e5ð1Pâ˜QWÝ2ͰB>WOpì¡lÂF¡D¶8¨z«ÊýÍÙÎm'S¾ê¹ì®;Yéàh¦¸Í“UKpQPÏü nºýÐ92( ôYY€i'Š©JÏ Ï+@N¹ñ"x¯[z6Ti(SW óŒÍ×ÐÛñ÷!†ðr‡@Ä,x ÁÍC»¯«Ð¢`<õv€þ2´41…ö,àÁšà•‘g5ì5_#rÊ‹ÈPÍfn1îð”È)Ë…¿G[Â~p¬?£?Võ¹tó‹zaˆ$Å»&bû…rµ`.%þ!R\1¾Š¸eHνîÛÀòìbõÒ …_Õ)wk‚/š'4Ìâî…BHeêÙ"bK˜žp¶sħ/¿Z(Uà…ÕZ§>Á—.|ÅÅÑ„ì¢çkÚ÷_¾Šñ #xˤ_;çî ÷:ŸEM‘Û¶)W›Í2iÀ[~ê;€ô£]R'…0HAâ¯Âˆf.J ä¡uPª“¡ ÀÚ ÄY¾ÄQJ¦<:9Lm½­mÚƒw“`ŠŠ½­mÿNU•|ªQ¢Œ8q[1¹¢éC7W+tÑ_Mv¥ë‚ ^ízW±>}‘ôê²ïº^¨µõêâÂçâ~º(SÍÙu®Ö¦§½“_­ÄSÿTß¼ûþûïBÀé0æX•íàìX}:—M=·â2/âEW’è`)ÓüÖ,¸¾~É_º~Q&KŒS|æ1Ý«\Öés®š[É7Am D•l­íŸ¿ÿ×¶úŸhÛÿáš-3Ôò1âx‰3}û¿h8r‘åsFØj({x±ìˆ6ƒTWhóû-×x´tGöÕl‚œ:{îZº×1K„¦k9ur’nì/~& Ø#‰DÕdíiêÎt—0^ôWšïuÕ|¯ ã÷U[õåØõÃòǤeaÊ–­Î2–“¸TŽü‡ßý®± endstream endobj 754 0 obj <> stream xÚYÝsã6¿¿Bo•{1W”¨¯öî¡··—ÞM&×n³O›ÅflveÉ•äxÓé_€%YV>¦“Œ%‚  ø#äýæI/€?é¥!üÞjçýëÆ{óŸØ“ÈƒÜ»¹÷d,rå-‘x7ëþÍV/–Qùû¢)vºÓÍâÓÍÿ`”ÌFÃR%”Ž#šmË,cÁa 2ÇÑîË0óõÊÜRé–&èÜLÙlaâwËmQ­‘ú­Yk7±ë%"ÎXîÝ̼ ˜ë¶{ -e&âÈvüP–0KªüÕ¡ëLµÁFìïË¢Òôºª«¶k S-ÂÔïZb†–í$½‘ëÐñH»¼š~K¢æak]ÙÕÑâ×D½CÉôMC£êfmª‚EØÙ»H½Ù©¯›–zä<³Øù)K™¤'Ä¿˜³ßÒ9<qLÎ1¿/–*òõŒ1e.b6&ÎB[ÝÌ:&ÊD–8[‘jVd 1ŸÁåÄ9[4 À¢M£ÉèÔ’4½Õ÷ÄB¼@ ëåÔú°ø8Œük}d‘g®Œ3vôåé…õ†ë\¯­—p²z¢ †ø´A•I‘æc3ZýÆQMúáF:Ñï±aLÚ ÷ÁïÐ×û=µ~OØï‘ê'Ù7úÁÔ‡¶|¤¶SXÎ× âi½Ð[Õ¬Ô »a»môZ°—Æû;o—÷º;4ÕÜ&wÁÔ³ÚìªÄoêì,=—;âLH›rÿÙÔígXÀç¦>ÎL‘ìÜeVfàmªt°Î;³g¨M‡ÏÎiØï}lðÞ·ôÒ\Ö¾´Ÿ`k…"IÆ®?n ™“ŒmNóÝÆ"P8šá©^Œ–}óîk±Û—dçw7”ßå”[)Rvó-nåot¥›¢ÓØS6"¡äVolXÃ|gÅËTÈl¼î¯Í'âú;=¾~üuJøÂ„ü“ž’ß¾acNe ÒO-?3¸€KXù­ÓÛ9®ãŽzÊpàž}Yz¤ÇÉ ¦Z”ŸhÖÚ\Ðó¡(¹+v]RßÏËOeü:’>/Cõ2¢S_F2¢×è1Ù_·àj­/Hæõ‡«+–wóþ¿?\_^½ûüöà “~Füm†Éùíòê§Ï~ºè¸]|ÿR¼¾­w;Èð‘ÄÜôŠ„òÖ£‚#Šw)¾ž¥9¥B—±oŸ[7o…Lk¤Ùüˆ/,Ò< {Awaz©¦¬+LÇÓÉ9ÏžÁxî-b ÇK7c8ZƒÔ­‡»}Sß•z‡'‡Êü(Êk­¦×‘m: …­ŠŠz9-RcSÖwEih-=8P[„É©%Ùl5ð?,bè. !K•…þ5ZïˆÉW?Øß†µ3¡íž§åŒV_Àè =K¼H³–ħuc±ræF ­©‰yía‡ôÆÅ#©ÛL3Qަäу‡ƒ :dN‡ô¥ apʦ;ß„k½'›Wk 1à¯èÉ`Fˇ…=­¾±, Z™ÖÔÕwhÚÄ7÷DîGœ:išµÞñ „\Ô°(lh@ ÉʰîwLG†Gî¬É}kšô¾©w…ó§hþ³5ÛùOáÐÚáaxÉx&os4-°zEª?N[ãuSïùNÁðÎ>ºë¼¿ä—fç!\~DžZì™æBj‹ÂDPŽM†Á8nóä ‚Xd¹s]7;»²Q± íè<Üÿä ³³¡âҼஹ+,LøBL!ÙnÓlw`õºa"Å|äNmˆ ;¯‰w,çÛb®wûŽ® 9_ŽÎRÑÿ!4ÃÜá¤<%·Ð+^ÏÐYº‡È¥q¦kuyO}6çàË7e@^ÐåWžžçtd¾õKóeA Û—õ®n¿iY9Ölg¾êõÜ1Lé|ƒÚ!6£WkºñèjogOÐzÄä«Ñ&HÇ÷>èܸ!iºa÷!¬¯«åŒ zÔ¦<)EŽšÛ3SA 6ÂeÄB‰.uŽY8Ñݰß<å™wôâ\dàDä"Ͻ—D"Kûvéýâý<3‡ãæ¤p&; „ËΔPÙ‹²× {­Ë3Ù2(„Ë ±Øúé=Û ¾©QàéBýÝ’ ¹ Æþðm|ˆ1`ïˆÆéí©«= ®é·œA7K§Lcauù屪÷­iŸå {U Àœ’ÊCmÏ:È#Ȇ„mŒXoz@ÆhÖÌî[÷Xêߺ]5fùãÕw9%Ÿ½Ë%Rdñä.ÇŠÏL‘C,¹péN·³¥„D¤}‰`‰ÔIYÂ=šu$èa·CŠQ²O1øzšbnÄO€ý”P‘Ñ&T™N:¾†A&RuzÔ &$«œŒ«RpU©Û T³•­p²äñøT„ékÇÿåêËP„€ÆL‚¹N 1g’i“é˜iZ™Y@ƒcŸ«Jý¥iN4ÉErR¼yÝ5ül‡\×x¤E€| WFYDqM' ´ zœ™†pÖ±ƒ5³XÈ]YZ© 3º_X~WÄáùÆu¤,zª~˜qùÙíÙ>f I S*PøMøÌLœý’ɉˆ×€¥T‹ƒÞQ•ËV7“í ‡Š##©“Yg4sõV|i[³©æÐý„"d:ì(r¦è&U›º1§-¶ú±®v3£FÄhõ©BlËØ¿ÒC‹ðISç¢/ ¹z»¬­å¾> ôIå™3;+MEà²C1³¡b‘¦}™wf|2ì^(¹¿4|53<†\^f†k"|nÌÕEâº1"Ô÷”5î)¤œ•aÃLÁ2o‹áîC”¡¸ùÅÉòB~F4§ýœ/Šéî¿…t†p³»HÐ.ÄÏ'©‰¾ˆÈöG/“d2c¯,}þ \À]IWœù °#)fÅÎFç´Ý(ELÀôâ¾³±ÐV’ny¼k_¥v¤"z!N“çMeÏÚ¨îüt åÙ3–‹ Uþ Ž£ðÄe.ìwÕßQöSOåf`“|‰‘¿ˆE¶g¿–=Bâ _CÆH¤Â½Ð‚"ìÛcd€]ó4# aÁ~vHÒÓ 2ñ¦`ÄÐ.òR¤&¡…úÈ{9“Œ©8±Å!lÎ\îˆx(mn­Û„±­Û‡9Õ €DvH2®½áF/­æñ”K¡Ÿï«HJ ö; Àù;úh”÷0ä9…Ûà Û[jÝë¢;4¬cù%¯yøZJi^…>'ôŽÇ¨(qVOáž¡# )sAAF±cÿùo9Í–? endstream endobj 757 0 obj <> stream xÚ…UMoÛ0 ½ïW;ÙÅ¢Z–?1`‡aÝa·¢¾-Cà%jkÔ¶\ÉIÚa?~$%§n’®H1ùøH‘{d‚Eð,á±uǾVìò{ÊDÄ˨dÕ-)/¶ÀŒU›ŸA2ÐáBfI°ŒDÒoPNƒñ^9a­{;šºéÃ8F§8jwö;\ÄEà7ªU£:67z;6½ U?€Š(f\b)y,1ò¸k‡U£í PVFï½þœzQò¢ôÚ[«¬ç¼´]mÆÎ[ ®jãd ÒIß"´…”%2^ò4%‹qˆ"hF¿"¨(£ÖºëT¿¡pà€¦ƒN#ä.ôq‹|ž ,­Û„dX;»¾·¦nÝž6ر”±I›ògu¿™&wºñ[Mç !ÛÅÍ£#RX `êåÄyâ>Éó;A€‚§’®žênhÝÝ]U®˜Ä‘vžr“öåE¸Hã$xPj@) ncG'ŠÈ­‡da¢pIâJC[o2hÝ:‰’F¾óz, Q9V³ÀOœ\\º 8ÑÜß7­r´—‡DÇ+ÛüQË`4J-CòeŠ6κ=*agýÉY½‰½ ?¿Îo„à%BºÛHÊ©USžð$\áð&³GÆeY°=K¡Ag‘g¬c™äE~øß²v}ÆÇLËûž'ØEÄ“9vTŠw±gZ{Ýb£ H¢Ègð’¿ ?Óòðö3øÅvËÓà¯[¨kd½gØpyÔ­×yéa8¤†Ó[Cí’OÓ,÷ʼn:Š_6Ò“‹SžÄíæ¹×ƒmìÛí4UT™ð('›5ý¼€(TF®`±Š|‘WS-3ñ°‡¾þ¦ìÚ4ÃØèþÌœžˆƒzEÑ‹ø³j/ÍFù Õs^¢Œ'Ó8ïêš„4<…O78téa ‡Ò Zt¯°§ºaÄ‘ûìŒèùñ1ö7‹ZO}Ù648÷ÞÏС›E> stream xÚ•VÛnÜ6}ïWy)·ˆX‘/BŸzG›¶ÈeÔE*k¹^º…’6Ý¢ßáE¶v-Û l`IqæÌ̙ᑒ I2ø#‰¤ðŸ%U“|³M¾ü&4ÃB°d»‡ã´p›d»û}{(ûQÛMÊ„@bóÇög°– ͱT2ZsØÞúW3Tº®ËVwÓ|¾~ù“[Hôº›FÓêÁc|¿ q‹„ä˜å""ÑLaJ=”Àd“Bsôã//_„äH·–¡£±]Û¸5A£;È‘]Ã&yB.8ŸÁ™„Ý á9º©ûÙíC‚Y¡’ /°Êƒ‡äI“†¡Úy_'o’W+1V1ŽiÍx\åXñ¸RXO‚/¬"x`àø70äš²6ÿè°˜;ŠÆØM• Yᢤs޹òQޜڮ̵K"1ìSª(ÎD,ú·ï]Jïu{¼BÇÎì®6_­…DaÎ<Äwz¨¬éGӵў/Cr\äKóíÁ\°y¢ÏYž‚`Æaœý2±|ÉpF£é¥n¢‹!Öí`BT ”Š;r©B#Þ¤ø­³MY×§ ײïkS•¾<ÿ ·]êI Ï0#ðË0¾±e.Ó®ÛÏÈgWªíƸÐzVc~+ŸL4Ü<q ªrt87m¶w3n9]ùV±xäS÷¢ÿUFr;Œ÷ˆ)•@ŒD'_e¶¬/H»m^™lÙí×zœl;¬4Îk ’ùsy¯3ëp˜ªJÃ~ªÃT¦`íXˆCδ/à¬Ë†Âtµ¶ºÜöÝÜì.ÀCzôéôö¥ €õX P,*ÃA£›Îžæ{u„}j ‚ô½ÎŽós˜N7„ioB¥D‰vº¾ÚàGU7Wsy«ºôiÕuLÞ©nÜ?¡º‹8G§‹Ú¡Ä;qÜix“5Nü¶6×¶´§°9:uŒ>+ú4K;ŸcüoYÄ"øT];Da¬¥ «/œCäO“ȇoÁºÜZDY'Ë !îÕzf'Ф}H Q3 zö¿{¶B"UXäÑÆ 2QP™¶1…?×p¡&¥¢ËÛHhËÜÀÏcÊÃEi °Ïú«³á…ejœ¶]û6jë³+@½wäF$,çäÞ=•œïQ.r\Èe‚Œ²˜®“6ÓúLApÎ3Í} S0Ýx+ÿ]6} ﻵ&eÌ}áÄ&嘈µ.1ø8Ñè\æÎz W\ì )ÝÇ“s09›¿úì?¯Üõ endstream endobj 763 0 obj <> stream xÚíXKãD¾ó+|tЦ×ýòCÜX IJscÐÈã8³Žµ; ƒøñTuµvÆ™ ‡•8 Éý¨®ª®×WàSÀƒþxø‚b|}¼½á*àœeZ·kØ_òˆeqp»ú-Œgr±ä\èð±Þ-~¿ý!øö6ø0™¥Á1ÐK•=ÄÁ6ˆ%K“aZ‚÷3NDNȺ+ËgœÓ˜ùÈ9‹˜Î®q>9Îe³<<,–2QáßøÑ$ÍŽ¾ûé—i„tQx¨º¶ÙÒcz{“È-ÊýÒñšéÄòÿðÔ´»¾êíI%ÿ OÌ—Z³ˆŽTY,5™óu¹/›Ã]xh«ÕÝâ«9©ŽO™––Å7e_tÕÎTmãèµ/Q³Lùä·¸¯<ìÚ½©šÒ™¨s4Ydé}Åfø'’IáH‘¬Gæ"ÌëÚI)ûvßÃú¾/W4zXˆ$|ÂqäL«N)G}nËmÛ=«‡º],ExòcÿV• KS°»…ÕlÉ5gBÀWb´ JÇMeÉ7àY juèl)ÃbßuàZ‡¦~¢½ÞT¨4îV ~jË,çgVü¹í¶pG<šŠÐ MqïvuUäÖva×µ]¾¥ÉŠôÇÛá´i”h˨¥oaíG¬+GîL×–™óYVE:Ò¾‹ßÔ3¢3 é>Ú$¯h’| ž9ÓF$™Çá¾A*rnŒžd`x™…ß·¸D.å‡e‡ºñ4¬ÖÄÌ‚<'f“Y`âN7D»É{Z^•uiá£Vpò¡.·öjÝJÙ[µ`­Ã?ÊÂôNoýÍex$ßÂÈ'*ìÍs»+ÆxÃͳx#‚!J`tr¹ÓS†ë¶£MwwKpÜ”]“; êê¡ËIˆ´¾'‹¦áÍœG @P»-ý[’ïº2ïÛÆ9í’}µo_ns—j¨×c>oÐk†V\Ü ¿ö<\ôÝaRNv¢ü nEnãNT†úM»¯m\ϜɯTœ8e‰t‡² (K²iz—èf“å”Ó.µp«S%L‰WÖ>ÁdâHÉ͇…ëÖÕ "¢w%‡Ä©1r­l­1E+­œUª±©°ü³ê ›Å‚4B[xÿµ4û®ég”‹ˆ nÉ"K ÷„èÜVÍ? L¿/ Ñûõ¾& Z)‡Rô|z¼¤»xéB .aƒn¼ SQªÑÎ]H5È]žJ¡­¼•©À€•€l ¤gm‰È8‹åØ—¨ë} žPòÔ˜¸ù•ÎÄ“³ë*jÖ“âØUÆ5kÄCå¦Pˆw{Cc›]ø%c×sDBK‘þ»–BJͪ„Ø<œš ÔÙ¬ïÂʆë5ŠMÞÑèËõÖ¼¡!cìsv"Ë^ê8ÀCÒK:Rz.ù#¬÷DÐÔc*„QäÌOc¸°­¼][Uo€ëãœt®$ÙÐÅlÍŒ`~5´DèIdèK«lÃ`—Cáàêœny³¢ %“a­ã=º‚”“ÂB1D¤‘ [Ó†âæBéB“rk«·€˜,“8sšvå®Î‹rKYlh¯]Ó׊BªÞÀEònE³w´»Þ7…› ¨Ób¨ý)“S µ–B¶Ôs œ¡I‰¢BŠ‹XVõI£#?7* š‚a~‡¶Å•ø”„vFFÖœS¸âêUµßµhBÕØ¢ª¶âœ d.y]\sƇð¢Bø‚{ˆ(w“}G—iÄ¥ŒeÓP!;lÒÙ”ˆmJÔ˜ T¤òlÁv <ìžÌfzjjús×ãË(õ®œïáÀ ½˜cǶθmÚöã;uJÓ—áCÅ€Éú:|¨¼™œàÃͯÀ‡'çðÆ +"ÁÃkäß×Õ@‘wŸM¤WÐ$õ#æp9ïbäëã ²6ƒŒ±ÂÃx‚'¸ðž(üMà ž$ÜÓsi”•0ðñD x²`þCUTwWåÊU(a:ö«ÀP:1ÅGÀ°š3˜@§¸,ìçõM…_¨m] H›‚ÒÀ¦uä ÀÔ€-5”²xÁ”ð Þü´h[zü> stream xÚµX_oÛ6ߧУTÔ I‰µ`/Ú¡[Эkö4…j˱P[ò$»Y·î»ïŽGJ”¢8É€¡AERÇû¿;9ø#‡"È$üñ`µ¾½ .®DÁr¥‚› ¼_Îò4¸Yÿ¦L°4Z!Ux»;D¿ßü¼º þXœëà.P9Ó‰¹¥Á>Hc¦3·Ýï‚·3"+äX¶û{œsÉ25pÎS–éÇ8D–ss:F‹8Sáz”uñaW^¬«Ÿt†Ò«ºØÑnàjsq¥dÅsä½°Ì¥b*3Ìß}®›CWuNuÒÇ¿#2û…RŒÓ•ª}ùò= ~ò–ÃñfWÜ.£Ë9ñ–—ÐLņ×we·j«Ã±jjK¯|ÑŠåɘü-d.XWõ-,uÂMó5Õz‰Û¦ùèaâ2|±9Õ«e´ôˆ_Tõ¦yIëUSw–vµ-ZKÐ-#û~rëÂWS ‰ÎÏ–BÌ5-4w®rŒ.·m£;»d}’sJo\œº²]¬KÈå¤FœÃ3 2 ·NºØÐB$}ÈQiàni\ì ¶ Hlã•[ý"BœÕ#œG8 àõ#•žÃY*¸yßÉ4õúõ÷=3áÐ3bÆi2fÒ‘t¶ ¬*té#ifÛ,¦ÎÃ3ãÒie9­Àgîâ¦mö´*jKå|L= mkí¶_ò®0xçy×J|‰óðn[­ðƶ‚ƒsºÍÀµ %<«£ÝG2 ï"Tx>xrèm|Ô©³ÁSXsΔL»f^ÔëY6’q—Ðs #a‰^LM¨LŒ5gB­S–ê§kWY¯ÖmQwÎ3”¤M;4d)“Âwý$]0°Â†@sÕ´mÙY^n‚ÂsS8H‰ÁJ0887'qÍôSq 0ã3I™ £¨}QÿŒ…gŠ‘Þ@r¯ÇjaòÐI×ì-U±^Wo®Ú¥†òQ¾SÐ÷í¾0Þ6ﬕ¸ðJ·Cɤ™vÁ–çƒ-È"q&‹4ô´Q¤EZÜ®W½’24¯OâDqG™@¶B/Bã(V}zHÅ'3ew„ò½}‰9Âý”*!DPª¯ùzm¼oŒ÷áÍØÜµÕˆhC‰M5 ºˆ:"_o&ï}ŒRÃ4N73áæ¯²m¬¾ýå{ÄÉÆÄG€l±QKD›ØÍþ±Î¬æ‚($LòlûŠF›cœé[oàiXsø,èå©;¹7w¨{a:Ì%Å®í]ÕÈ䀇›‰Æž»ð|dbë ºàÎF¯›za}ˆ­nž«©ÉUÝ\[|¨åE:-ËSmüd|õu÷flû=cÚüqkçâîçaÐ.{´uæù#h/3Ceî¾êºmsÚõc-ÜXõ O‹nö#Œ§L»êóëõõ¼Ð\ômff¶KâœÐ^»Tõg±?ìÊñ ªiÒÔŽÿI*5ç3d2Ì¥4¦>s$틎#¦!ï¿ÓïÕëëW–nÓ4´ú†ȘfV©™Lü86}Ý2ì¬\¸éÆÛÑÏ8”éD#.ÚOxýãîQ){¿W$ÐjªšŒÛž±á•Qô{Ü&øÿØ<³¾xA϶\Wm¹²Þªw®:F÷}ÿ\U0ÿ¬*¸œÑ¥;as}Ž&;塹|—€bZÐu3¦ésOĹ#ûÕ¿Ó‰0| endstream endobj 769 0 obj <> stream xÚÅVKoÜ6¾÷Wð¨-²ŒH‘”„ÞŠ6‡ÞÒì­[´–¶è‰²³@|‡êå]¯›AaËÇÇ™á73ŸH¾Fbøc$åð“¢&?ÈûLÆh.%9ÜÃþžÅ4Wäpú#R”Ñl·gŒËè¡êv~#¿ÈB“<#ÏDæ4þ@ªHMTB³tšVäùxÅÁ NÚn·OXdš ó9§™ZÌçŠfù[æP0oû©ŒþŸÁêÞâ°×àù\6nA¶¯ËFW¸Ý޶­êý‡Œ8“qî|ìƒ.©L½“Oç¦í†r˜®€q­Ï°”Â|/%ñHÙ@‰ýÜv¦ù ‘!¦fÅ£îqôã}£ksÜýt-˜`™eT&Þò/f(ú²³eÛ¼\"i.Öðã#xèáÂec™Môè<‡Úpøu¼Wì§œ&"@=×Zwds5‘Ä‘®Ï ìÀŠ~XôãN‹kºÁù²ÇÍ×€:ÆLTæ.??¶Æ·g"£ÜÕ\B]‘@`ŽNK¢rÀߪg‘)JgÅœpõnÇÓèŒãfnr£ 8œ¶½»×æÔŠšøði¼ÂϨJ†^Ë1‡Ró7˜³ö»±cß WŒAó˜rŠý>ô{<·Änzí‹BÑ0…†û±ÂêÚÚHÐÛZðYLç,òMÎ’U^Ä̬®z£ODà¬|ru`^xÃ[ñ­·±ÑwU`KØkÖ\ºÃäÓm¾P6žÒYÙò·•Í‹²áô e[œÕT‚/TMªÅ4Ô‡Ìß2½¥¯¨š—Ñÿ(j2ˆZöm¢Æ• »T5”µ§¶<}Oýâ*¿©_ÙÒ„›È® XJýÐø¦ðÝ‚Ü.üò4žKÒ]É.З›^¶Ü6V.®v½y*Ûq¨ÎAº$Ô@¶–®©‡Cû. 5 ©¸ÅDžÒœýs%WSßa¡çj‹£uÓ]¤5þ¿%kOcö­ªõì€z@XÓ†Uÿ!3§Ûê"àBŒÏòÂâú¢”Ç•ƒ YËô5 Åéû¶Ç.:p*‡®Ò;ø¼žq}†È¨ÎôCÐ Ýœp¨°aÝ|5Ÿj½MN1€ñìRPŽ1;%X$‡÷ê«§¶ïpH)ýžê! ónô {ÌW=ƒœ^—ð©Oî•uW™ú ʺ…€^w•å¼iü©uÑ·ÇNîÛ¾Ö6ÊiÐÁC£6%?gш}è¶ì;ž Š‘H÷˜X)ëcèÛjªæ×^+*¥éüX©í5=߈ð/-=÷¥5¾cä$A*„dñ!µ®=jÀs VÁ Ö&ZkÂÒ]ã VÕysÂùõ·Î„kœÕ¥ç×Z×·Àà¶u7/¨ç Î*~xÕ{ñÿøÃßökoW endstream endobj 772 0 obj <> stream xÚµXYã6~ϯУÄŒHݘ·=²H2rtžâ`À–ä¶2:IžI/öǧŠU”(·ìž,tæQ¬*ÖõåýîI/€?é¥ þ¯h½‰ÓôÓêbèMÎÂäÌ,t‹;nv‡™ŽgJÌ¢ÆâI‚äR½@¨­âPSR‘ænmAÓBb.ÖZÃ%ÐÙ›#寕Zð*•ÉÈH)J8 GŠŠ„Ù.Lp˜óè°ƒLŠl©Ä½9÷pR"TÌ*שîžÞÀ,I–ä3,bƒ›Vsý4¡23ßÞQL1>ãïQ7˜Á8<ø³V*bVNa&ç¡&/›ó‰©~¸Îe‡sEÅ  2_?výÐT<ÓÕj(@¬È,î<ôOƒn©–l±Ñ2uQ+M|»¨i:TP±‹9"i¯?Ò/I*¨]©‡’fÿ¤Ýã¥+¦1¢’L(Åp35 ðÂÔ™ë[Ä`’c£UAé1Í .R!7ªÓµ¨¦@ã#ñæn³ÃµÊ ZbËÑĤ‘ £ÌG8ŸH.N¨ë#­Æfî™pÞ4A&ER…–l9ZÈ™afÔ-ët¾ gÓ­ôcu@Âl¶‚ðuÁ#a<Oïˆ#féõ\Þ2€WKä0—A$ÒìUö. À¶È´}% RÜTÑäŠÄøßÐ ’AÕ™!Φr‚ÝÀ2«Ìÿf‘JE’l ™1—iÝÎÎÁÿ“ê°s?¯»#Õœ½Xÿ0Œ_ÀUx/WÚ~Ì,f°ÏF’`:þd£ÓOÖ~âö[ '·q.dââ\ä¸87dçîéॗ¥n ¯ß¬  , ÐjÈ|ì™·ìfÂÞ ·…†@aIFÊ`‹Ë# ˜¬¤k3àšcœÎž}žÄþ×­ÖÌ©à'ŽéÅÙÂÿîPã|ýƸóˆSÖýü†‚ÚÅ/™ùIÓèi²O ‚îîk:Ú›Þæ3¦Yo©D4믹­ŠvdŠ6»žÔuïfŠ9iû„)ôÅà{¦ÿà÷¨' #3 H€¶&.pñn\¨ ùòÇ~+0 â2K2’6šXOƒîÆzb9ÜOTöùV‡ÄuǬ–E?@7ÇÈ­M÷dßÊ”ìïˆ:þ„åU`¿.Ü턳\Èä“ A€•‰ˆß kHá‰dµÚv§0Yžå œZ‚E/ –GZ{0B#C”°÷èêÁª ,w¶8„‚ÓŸ¬ñ°ËàíÆ"ºi\p^•¨Õ“Ðy(Îa2nƉÌçoJ· H‚Q»ôI›\–WÆ­hs¸Œ§þҔ˞L J_Õ§’»¡MÍeˆÌrüîç·oo¼懀±34û"L®ëQÌVÅcÕ(Žœf?žÚØÍgó‘«~ éæ~ wÍã"^#Ñ’R; bô¹BŸG1dÝP}Øñ—;l9J®¾Ã,hQ—ÑvV‹C/‚¦Ä\)¥+…Ò¹Rè>NØþÆ2ÑjÚxjúG+æ·K{¦ÍˈùìÊ œn)îµé›ýMß=ýÖž7œ9PÏß4êÎ~;ª©¿æ^[Û¯sô_uÒÑìÖ'X}BTKŒ¶—qÚãÈ*S¼ÌÈ;… _zN:Uõ®ê>luä™HÕ*lm—·ŽíXdÊÛ'i*²ÜËHZò>û¢‘n endstream endobj 775 0 obj <> stream xÚÍXßoã6 ~ß_á½9ÃEgý°doo»ílÅa·ËžÖap¥1–Ø9ÛiÑÃþø‘¢d;‰›fÃpZÔ6EQÔ'’â×ècÄ£~xdü&Ñr}»ˆ^¿å*âœåi-Ö0>ç Ëu´XýkÆW³9ç"ï·ûÙï‹£ïÑLjÉ<‹#­YªÝ ££]dÖm£Ñû‰z¿F±ÝÖ³¹Lâ%ü5iü=¼XÄË¢³$ÚÙ]Ý<Ñûå0 fþéüzý6‹Ðl’ã2sZG¤,5nOU½oË6ì<Oá†Á÷^@â¶¿“ ·Ú9*g*€qëjèñÅ7d÷^Ê*®Äp•=³¨,*_bõÄØn7õa»:»Ñ”K6vÜ´ô«"çÌ ýjúr¿Š3Ò¾_¥¯Ëýê°FcŸéXûÿ¢gÍþYÏ*eÊ2>Õ´’WжŽäû®9m]?{/«¸¾¿š³lœÍ~桌Ow³n{ÚÏ¢´À‡éÏE§™‡²“J°")V7ƒJÿÔÍÇÈC€ÖS˜8IãÕ†ÇMéßøæD ¦Å8Ûq´ÀJ‘á]nÊúк8ËB¹1}—²¾›ÉŒÏhx¹€9vêZ]w)ãõÜ€víY£˜™\™|€¢¨ã»rtØw€Þ]ƒH¡èñ1 {·ÍQ}žª~ÙÐrO´~©9k§U"BûK3覠gijO8u(ßáâýW7Ã\,\Sàhy8òw¿ÞܼPY¤\Á5ì#½8~àÞ°Âgtú€NÄy@ƒ¬l§]°D_&hòe‚–]æ/PäWççݶoEOÔà2ð!!ÇDí¬Œô4P¯»Í5d-wÅõNÖRÁÌWSÀžcà“ŽÉÚé1#éòCy2çÖÃóE©cJRã9g ¦± •†¸ƒ‰}÷޳Ç,¿‘eà“XÆ4±´ƒzßi–¡žcò*–ܳ÷?œPRÛç°9af=æ» 5î‡×ð"Ë0Š%Yßn>WQ•dúˆf ]¢ŽZ‡2 >Íì­gR²#ráÚu¥ÓeàG_#´ž`™â¾ä€êË@ýže8C…w ?žcІfúºk<pê=ï‚+Žhн˜ Á£¨Àõ0ÏQ„‚Aý+Ò!róéW¶)š uJ;Ð:²Ü<› "÷Ä?Ï<Í͇ž…gÿ_ÈÏ"‰‡Œk2AÄßèFž0åÿeÄ™’c¤û„»„ˆ†Vû:⡯$’ˆ‡ú¬ÄCNc[ÐqC¦ „xN’Aýý†.+ endstream endobj 778 0 obj <> stream xÚµXYoÛF~ï¯ ´  kÃå$ѧIÑ6Ä}ªŠ€–h›0…¤ì:èïÌÎ.¹´iYiSØ€ö˜ùvvŽO ><ˆàI ÿQ°­ƒïσ¯¸ 8g™RÁù%ì¯yÄ2œïþ5ãŒëÕšóX…WÕ~õçù/ÁËóàCÀD–wÖLis"ÑA$gUð.x»``”±6.»¢X­E"ÿñC *¬‹ºíîi|Qµ0àáv%¢ðÆyñ* PO”¡Þ5)ŽS‰Qüî¾i÷}Ù;ÐÅ?ÂóµR,¢#·m¹[­]ö=Ùxkßì‡n³úvɶÕÄS¦„ÑôcÑo»r?”mcå•oX±Lúâç×pe)Dص‡¡l {f†VÇ,ð>(ïà-èVG“Ø®È+ô[œ„Û|(z´!Ü>œwql¼§à]½!({³Ò– ® ÅŽV‡ÖžÀÕû%œ1¼5ç¸léþÆ]$qúTÞ]—`\‡×dæÕç½EÒ·e{è+²·*aÿ ¼**™]‘òØ!„qÆ¿œó/9ÜspZ· ð5Ç'Á¶³Š«Ó _ÂÅ %ÓÊÃ@jA¸X`«µNÒðM;Ø;×ùàF…õX9“Ç$=Œq×øºÝ‘0}ü!㈥N¢FM‡L ÞGW`"C°Ü®”‚7ÂD½¼ÙÑúüHÓ´|a°-;Â;q7óûë×K b–ñÑ9æþ1‡RSÆI›qPŒY÷fB‹sÄìû*ßuAn¢Åö’>̓â àFy·££?Ðâå¡Ùzé?O‘D2é >‘DZF¨$bƒ¯Šó/E–€šøÓëß~%Ûö.öf—mgŸ®Ÿfþóï†Œ3§Æ:‹÷¢ÐCpI)©>áÓäû}UÒÉï»öªËk«(Ǿ±.U¤Ø eLfLºÃ{ýÖã"ìóÚŽö‡Îª¾`óRÿ°­¥Ð¦¶–œÐÖR„:¶53{¦­6À§ÔfHOjy$X–=§Ø—"Õ‡>¿š·Ì«bxÜ1G1– ¸°Î½pœw/kâ_ôÎ8ΰFê6"erÖm·m×ö`ÛìÊæ YOîs¨´ßžæ›°Gò‹CÛ@œ¹Û¬~’eáw£ŠOÇéÈ6o¦³Ø@ͤ§˜óðâjÞ/w|¨ŒêôözF8Jk×'q*<ýÈ?$‹´xKÁ3O(ð®#ì€Þ‰-³ƒÉLgáÂÑO§~l-Æ¿ÃLÐ:,:²Km_„Û '>PÍ›æH?…G¯qN¯ûEìk‘Αc[D>Q>±Ôö©á ™ï‚ ª¸«3¼Á‚á ºuÄ_“Uà¤æ"×ûÔæfkð IÙ”C™{ 6}¸–¸ÀVU^t9u®(Dïêð¶\Ûª•qÏ‹VãÙ‰a`:É'… ×­Á)ˆ[—!‰64)çá{Õ™O EH:EˆøÏ2<! Ëbÿ^Ð2é^×t21s! öD„hüº=ãJÏê™Ób6SsyNåSo!> stream xÚ­WÛnÜ6}ïWè­\ K‹ÝÒ¾¤m¸- ·Ø ’•w©]Õ’¨P’çë;áöf§IІ9$‡Ãùœ‘£÷‘ˆbøQ&á7ŽÖmôã*ºx.#ó4UѪ‚íe“hµyÞöýb©bfºMý¤4cOïV¿À™,’šgyÎ$0)ü™Ën˦©»-HÙ‹ß®~¥£¶£ñõ¢ÌNŽö²m?Æy»ÏV„¨ˆ„æJ§ÁºŒs.%Aâb±Bjö³]´»®±å†nË4w…„mêatõõ4ÖþZXKw Àþ$1/âo /4ÜRp¥ü%+´¢³ü̊Ί½?±UX$ý‚µvé¤3kÓ-dÊüÏÔ ¤ý£µC”ûñ?5ÈP\'æN|ÂsøöK³ŒçdOh=«ÿñÍ?ÛDœÐ endstream endobj 790 0 obj <> stream xÚÅYmoÜÆþÞ_qèS€Hq—Kò˜ j'6œÚ‰“(h‚ª@WäÞcyå‹eýûÎìÌòEâÉv¢.÷evfö™gfy›oÄ&„?±I%ü‡›ü¸y~½¹z™m„ "•l®w0ì‹0È ]üÃûk]øBHå½hê›P¨ýЖõþÂÒØë†'_D¡÷þ"‘žÞ›‹^Bã Ê 3*â S_fA‘à]oÚ _¥Êj\/Su¬ÒÈÓuáÆtkÇå‡qÔî«`ßWoÞýæe×·åíЗMM=÷¸ªhEwh†ŠEæ£!†:Xœ²fÈ̈4ãÒÚá³ê" âØª^&€Jyz蛣îË\WÕ=¸"݆)¯ì©g×´Ô`øíT醎ÝÅm² bòÏ0d¥n#ïr±_ähü1t=û\lçN—I°•p (0/Ö4¡oØ{ªÐè†Û _nÁ·­Éû¦½_Û#‹™²„}uzïÿü¾²‘Ê@M³‡‹´Cý`ËÅÙ »¼-O=;À{òÖw×Û¥µiï~v›à ¤íJ+ë±B¾äÂáׄ‚Èûך™àÉlë<ù„ØX JhÞ3”‡'eªŠFÖ0ÄûÞO}Çnè¹LÇ]yÓ¢ßi凋8öt£$Ô‚jhËfà‘î¾Á~aNöðL]˜Cñ3¨tŽf'@ßVV¸½¡3µ Žv%ès<•Zˆ0€’&ÞëžF`>¯ìMg¨s¡15ôÌ[£{ž£é±êqyEìÊ·ú½Ù•ÕšÇUlÅÌã ¯¬i+C´r`[0ÞÚé"®›À,Ù2¡áhÉZ²Ç ÕÖZ%ØÖ54Lêèñ[š²j˜HÃ@Æ ,‡3†ÉÉ0»QCG©ËšH•dáO݉'žÕ3õ ƒ*Õ%\gmȼ—eMä"=f9)’ \ùKÉx²NLM‡il:LC{Ý^‘[µ´·ëu€}lt ðœÇÄ,£YüD騖®©×²6J~ŸCc7ôDòØÙðl3PÆÓÔ|€`›Ç‰€@‘ÙÜ7ٸą©uH8º Ïz(•-½ëü°é9;y”ÏNéF-?\`lwnwnM7T=÷"œ±³tpˆÔÌÈÐÕ1IØx‡þáDýà¥yºw™‘+æ>©\Óct†Gch‰¥ªf¿F¤é”WžÉa‰~Û‡¤d8§6C8íÞ -톊òȹ=&äÂÜû=ËRgˆ"þR濹 D…ØzØjV?Œ×·TÈä—ç”×ë÷ù–‹B¨O(7Ö'¡^|KëÈ¡·u Xþ÷CiO ÆJžZvôlI]ÌÀȬ< åð ¹ïhç®9: 5Ò‘]1p ºLÀ9BšJÅÅʡ۶,¯D@QSµ£Rïnœ`5€á’— h‡fd¡÷zG}‹¥ES?ã5wØ´.qÛ5ôìŒqš˜ÎÐl§"šK.V`Êú™i*úÌCSã¡Fd ê½+ûAÔ¯-Æzˆ5Ý® V)³suÜ: m[xûÂ|¸ª‡ªúTîùš*Nå™úxªÌåÛ¤1Öbá£:Ìá&ñ|ÄÞÕû‹HÌ(pŒ¥8PÛy,=‡ˆ–pT…Ùi >x‰C1Ä1L5eNC–®°Ñtk¸ýQaÚÓ#.!æÄ˫ؠ{¶ªò¶Õ-o{W"X§= u3'ˆJ‘ÂÅi¬›h2ˆ_¿XPá!&õ°M;–÷ôf³6n)×SXBš«Ýü88rs0@1*³‘éórwOô#ÂiÃ35¯œÆ÷!æ±FôY¹Ç‡–‰ Qs>ʼæDfG\žÝ+N0³|aø|õÉË€L!,å ãϱÈg1â,ʼn“Å€ûM7•\6Aשm@òƒWDÞíPV{ÝÝv 1‚ÉöRCBÚz<Óù”úi.ù×’sê@˜ë¡ãa&e1Ý6©æ ç¨+˜/ê¦w÷¾¥i]Ã#D?ãÑtg.®×ôQ@qÐDî^=ÕÑØyÝÑ(+ -²FWô¶ƒ2 «£O \ð­ 0†VÖwXÒ&‰å¹_´Í&ô©¢3å †Ùãhdt|׿Æb¹!*45ŽÌ*ŸQê£û,”•zM]ŒeËxÅÝäG±_t×-I]½)G\‡«¤ÿðŒ|3Œ¿?žÖ¸WÈ©ÿnf©æ\W?üJ·ïhä¶ÜSqq$W9Œs`E/Ђ‰\Æéä@|s£Ãµƒ‰câ-æž¼§9]‰Yè#¿4ó8½£¿ðiCÁv¸a5ÆjŒ"çã^Nc8nËà[ô¸¢äÊ!—Oò¹ ÖØµŽ¤Xh‰Œ/Ò8— Eеð,¼›ŠR±Œ J*í¬I²|Q¤‚úÈ­ÝPçu`§ èÖ+D1?ëé«ÔÊ’QS{éj~r sD݆çöc‡­)ÌI^òì µ¼Äm§â.‹^ºódã3z€Ï9c ³(»•Œæ–Ô=yá~½K=ô9õçWÜh÷+É(жXÀ„x©AS}úêê "šv5 DY,fQ“)È…Õ`·e’L–áN„åÕ§âýzüøGèî‰B/I‘%¸Í7U¿º–Ñ¢ú}¨½L­yëÚŸ{–²'®ûs9î±rs±ªÔcÞš+UT»¼þŸiõîÇ_^ÿÆz­(òbúpaï·Áo#ZSR‚²›:!ËÒEZ5Üû­ж –XÒH,i`‡ôŠûZ±€ÆYUYÓGúi‰ò~üöù jÑçòöþ—ŸÞP߬¸zÌc1á¬#p™ãÝ}ú<%(TÕQ‚’KJÀAþÔÔ€ w ØÁÐ1¤t ¶ÇðâQÊQèŠÄ!#Ä™-,c™àçØ#ÜÝÝûz˜(Áws'¯uÍ®¿ݯ@ë¾iª+Pù4…ˆ(µð‰U„ò êl± ø¦¸Íÿ˪‚ü<m9å@‹ÕîÈÒ]ÁìòŒó¯Ág‚@ý๰훡.?þÿ OJû…ÈOÒ4ØÒïmBÅnúOú«aú endstream endobj 793 0 obj <> stream xÚ½Y[oÛÆ~ï¯ú 0i’»¼ÈCb'­ 'u•(E­$Ö©ð×ÿþÌììò"¯ìÈ(À{ãìÜç›ÕìëÌ›¹ðÏ›E>üwgÙnö~1;ÿèÅ3Ïu7™-Ö3/p>³q!œ-Vÿµl[”é²öî±ùZÌÿXü Ÿã/<ßáÆÓäٹͳº&/78äÖ§ÇÛ߯iµ¬êüÛÜ,QÓüÎRä§…±“xŠ~‘/ñÁ'öÕ±»¹<`3?r€˜íÅNÀäÎb›7s\·Ö"m»ZÐ$-Š YyP›m–Í.o[VVi›Òh9·ýØ­‡¹Ï­‹j·Ï‡Q „…Á>ÍæÌµîç¡oǦ8"Ñý®D?WõüòõxF>¢ÏUé=K•F3y§Òêµìòb0Ö6“ €ÍîçA($–¸ôHcéÏû^¹ý—@~žúÓDS«( }Íû.½7Éh{‡ñxÕÒ%µHWÊQþ4Y‘3‡ëèþÄ×(ðóIà ‘ÛˆRÔi+V4‹l¼)âN = «Êu¾ÁxxzUà9Ÿ^EñŒÊ¦Q¯Á„ Ù,I{¥ÈDÓ¤õ#Mÿª–*’m/IPȱvÖ»? `{¸¡=£¥Ñ>üBf4•aë|¥lÞÛõOs¶ _gÛ#Vôý!!+É¿Í!³¥uNñn  Ú꿹øxýîç[a¦õŽŠ4ñ½·ëËcTÀU"Ö׋{)¿=o^vcþ&lP€øâù­ý›Osuý[»1º¹ãOr²Ì…¿XŒ¢5Ñù! á ‹2eÂß”þ¬ò;×c¢²oÂa±†‚RIwJBk]W»ÒU)h¼•u ¤(Ÿjª®Î„fQ¥Zp/îy½{™Sôw»øáa Â#™æ‘§ý¯’Fª5í›Ýrjœä~H«Ý¦-°@Qm«±Ê½(ö@ù÷Í»Å/¦‹b'äÓ‹Æ~Ê \7f(â–¤KÕ¥²¸H»Ñ b:s;øbñ³•¡ M+¬ÒŠ£«mu''8cp,îºÖÃV ,ÀaŸmä:NT6¢éR8€'”€‡À}¹Ä8‘É’»ž%þY×*¤ TôwSÑuҵꮤ•þ £BX”8~tz G‚MVçûV%dÎ\'öÆJ1ßç¸ì;o™E€º¶ÚÜËd‡%n‘3‰ zµ#P&á\¤k2œê£5bC´ÒT&Hc6XgIcO˜…8ú¯®n¦,è4I$v¢€IAq”`H1½G;ÎG±Á¡ÀÊZ IY.`Õj'hࢩž½ÐÑkÓ³2f¤¿G%Ø0×¢$rxrr-¢úrŒˆ‘-ÈSŠ•ÊƒôSMªñÓP<}轸0=~$C¯w1y¬)¢U)œ[‹eˆuÚ*êóç^â°”õh%Ë^Fç¶Ï"DP㧮Ϸ‹w××/ˆtCÜëèQS(É7æ¦íÚT·)% Œ’2ÎÒÐÏ îã¤ö}“]×q“iæÍ׆œû4éç­‚ô~ì;Œý¥¯­òF<óp Ž×c¥ý÷™À s¢ðèÏ*lQŇaKï£ÇÔ‰*Ù8l‡×>¼þ›³SM$BŠÕjjÞ8¸k¨¤ÿ@è±b¬6߬—>Þ¾®}s§ð³D³x:ø E¾ 작܋ܡQ±/×UEµÕ¾\¦µ©¯ \qã…!ý‰ôìX8Ç2'ŒäEìô‚¼×ù²‡Ò¿i#c§ :*(gF÷?úŒ š6¹] ‚ÿŸà÷LQ‚üÑÁ£q$áñPÿý‡ÿêêvä endstream endobj 796 0 obj <> stream xÚ­WYã6 ~ï¯ÈÛÚÀFc]–] ³Eï[ }(ºêq”Œw;õ1³ù÷%E9ã$öf-À:Ié#ù‘Zü³à‹~|aü£E¾[¼[-n¾M\1©âÅjÓK±Úë?ƒ[¦Ã%çB_ßÛ<”QðPTÛp) º{‹ ì3š cd[þµúdêЉR”É5KÕb)R&¥“» Ô°]ò … PºH@ E^´N4Ì>„Z£è·4]0ËÂ¥Rp†šÖ5}EÂÚzg©ÕÙ¶ki¶¨ò²_Û5Mz%|FÉ!qP÷ÔÉ3/¿oíÙîM]–5®}BdðîK].™Öîºy½ÛeÕúK7ýÍŠ@çÉ!à¿4‚Iã¶ì²P …rÀæádç¹¹8gFz{ÅÞ^?Tm—•¥·–ž²–x©µ~­›È: Ñ:Ò/L§Æ&*øîç÷?Ñж„݇Z´÷u_®i_‡‡}¸„=‘)Ïpv[_ +×)Óé®ÃÑ/XÛ¦ wИš`m7Y_v‚â2øÛï=Qs¦0Ì^ª,NÐx´þ iy*¢Ðz†:4Î@}ƒnžÆÁ‡ˆ«Ò¶ÃNúNž‘Ç`[¯³o››²Î³òæö\žÏ(¦ôp>wq1#T²øBfYÜ]—é‚Fp§Qc»Â<‰Òà0Îa”V‹ ®ÞzGÉ‹ÍF†[ÖµÙ7áùD½ l¨ÙÝ›&/%à¨&ñG½9ÞkâNÚ0‘<ÛOzçÜ™ÚÛâÑùí¬&¸¾0ÉëjSlûf*:5G|Nô c†J±$cXï É“iµ2fÉà®Ë%À´)>}õþvõý5³1z[v¶©²Î>Óƒà£çÆ“'¬]#iðHšú>nQ]µEÛ٠Ǻò@+Ô°Ñç1„geoiߦnhœ¢cöš<~8;Ýrâ‚h5>bëÝR±ÔŒ!}ta×Ù]éùìéÞVD`'Ìæ“Ò Op­Q\žG–òQì¡0˶ì*á i˜<£ o[çÄÛªw2¢ñÅæ—^åK&Ô˜.o7Æ—é°ËYQPZ%„pÒyŽ6vWãÄ#–&AqrßÔÛ&ÛQH °G–ð?-®ïàqðÑæÍÉ;›¦Þ më¾É}{]4°¯n^¹åt*÷)мr.–}!ÎrWi³j†9Ì(¬40ìÊ1©8Ç()è1éCȬ£Ö´ËAJO_Ê1j”“@`ÞXòµW:-_ âkoŠrJºÒ,c¯ŽùlF‰ÔÉq8S×·ÿ)¥|}$}ìÛΗuÇäŒa‘¼Èíkà­9Û&ÆãѶäSŠ£ÁGñ²B¯T|°&¶g27ü…ÔW _´ô…*vMJ°ŽÃ/™—f'§ú˜Ý_“@Ü1 B;£Ï1¢jðåá8×™2ë»pͯ ŽâTaå ‘nȤf:9I•Ë4`ïÊÒûJZïÅf‚ÓŸ°KC$vþ!à+aˆÒìg}R˜¾Šáóš}ë _éR!œ¬²Ox6¤ZÔøH–>,«7ŸË?"aQüjT?ó‘±ÁtEïãß!¿WÅÿø9¾ 8qõ\›¡:††|_'ÇX'ÇÃÃ.1þõ¨A‚3¬» X˜»”;Uu›1ÃJ4'ÛÚT5~p_f¹mßΤ–Gó/N9¼8ÕÅKÈ_Bòå/!…XŠ3{Fr¼ý´q^°ŒzHqe†å¿}ñ/ÄÒ!î endstream endobj 803 0 obj <> stream xÚ•YëoܸÿÞ¿bq(m›eć(é¾%×øàörÍ5þV¨¼ÒÚBôØ“´gðßyzxå8E‚ˆKÎ ‡3¿yÙü¾‘›þÈM¬ào¸Ù×›W›wj£Ba­Þ\`y—âÍUþïàýñ¸Ýé0(š¼|€‘ƒÛÿ\ýxâ2"NbÇÁ”x>}þ‚”6¸Øª4h·Z] ÄöñŠ7L7Òm¬cVa"”"îBnwR*\”E’âȉ„ÁÅ6UA;Š{wmd(Ò0EA2©a©Ðšd]ÝÛ±†ùqph窰-þõ³t·¬œ㈔&ÃPÈdj-">žœ¸‘Ññ,ôS‘S,¢ˆ˜Êž÷/›­Šƒ̉Gsñ`ßnw* ò²¹å‰_>¿ûtùÇQpìÚ›ª¨y!φLlw‰Nà„^²;Qg}ª ·0€PãWKj¯ò >§*ʶk°î¿zÜ^k3m ×òzû„_}½õ“}Q0ñ—bOÒ¾mä¹ÁT‹$ƒE ™,^7³J%BnÆõ–u9f·Åÿ±»VZ¤r.'}uo ³sžë­p”áŒp§ÁÜFÕéY|DqpJS+@6Káˆ˜ÜÆ¤¦¹ðÄdl’à׬ơ•¡êH¿ž¨TÜ8HúÙ— Ô&ba¹¼ÿ³™¥3LÕÝPî¡þtlÚsé oëb‰ ž¯3Ja $ L×±e•m0böµ+xpê=ð–Ò¼`S•'¿k)öoù'‡WﲯËKfTU ;ÂÖëX Ǹ­Z¤¹÷…c¡æûª¼‚K¸ žYjt-CLž£xkž‘;{¹,àÛ¦”Ãà ÚÝzeÿª)ßWÕ4Φ|uä³íKÚ;gjüž01s$L+4#dí¾lNC±‡Ôý]{ªÜÔ2=Áâ¡kkI¦8Ýf-O'ü3ënʡ˺G'‡rWÖe{ʧëø:(öÅÍ£¦­»¶r èGHŒ2¸<ð2ÚØ†BGdSX8VÙžL£œÏ”q¦QsŸ)JQø!ÃZ„–CÏ HÜõèŽÕÁ©™åPvà‹Ðóü0â&o+‘àQ"þëû›džÃ"¡ŒkUþ¼ÒÊD"Önùàú~yXt4Î>«]KKq”™I=ž]1ò¶i»"w­t"¡^+5¼uÑA Ñ”„X ·¨N bxh­ÂUa‘ @5Ýö9JçÙȨ±±_FÃL<µáζrÞdêïal½þáaÍþY#ß*~\P^bßBÆ\¹:Yá7¢ 4ÐQ]±ªU"Œwi¿"*‰™÷®î¤ä¸2Î1w¬NØ…/À Ê|â÷×uxùÓ½a1Ô€….טÐ5ß¹xõŠíÔpï¾k ‹·ëN^Òè±g–†;ód–±¦]ˆÄ R,ÓSÁE’ûr¸sçt‰™åqkþ·5bi]§µª¥ÃJïE„E´‹H$Éseþú«ì­¯õ&„ ÁÜ·£R:N!“:µš‚õ‚l%2xßø*'Ó¹¹°tnäƒ+ Ÿ•ࢌD”ñዽ.ò³Û²Sô¡hLp«8'O­=*š4iëúóC«ö:…Tç°×p=wùní$d¼½ç¨/Ýð žf&΀p~æÇjÎ?/Ù å£Xþ¬B že_«gÙ7öµèÆì‹2»•2²ÈÄg—Râ0ãkó`D÷$í#—Hzð[Ùå_«+áî®}æúË+õ‡åjB5m3^•`o‰§ ¡9¦wœ™ä¤ozh»"÷j2¥?Q[ד‡p½ñ%JW£FÃ}(P®o*ËÃJ7ÇÅ^Ÿ{­¾Ùþij%4§G,—ѼÍÓß.ýfÝöø²aåwÖ~ß)SÖgýÀµróRïÔá(’©Ð‹þlêMκÚÂ?øç¬éZ:öý G¢rþ™Á/Ï©ÕÔæ/9¿â;hª…Jà(!¨ñ÷ì (-X&…2HøÆ Q*R½|^dÚêij­«Pêw6¤WŽñ}SG‰RJÆW@¥üÚCgŠðŽÀ7’ªu 9h€Q¦6|ÓóÜ 2>òüå‡O<ÈzÏp< ç›Ñ3&N‚J7„Å»þqP»ö¶Ëêšo6@Ò?BŒ×. ø|ˆëÊÞiB³p©½Ú&QàZ©Ìihdì ½tFÀÁø cªZ’xàgÝöná<_=ò˜/€KVH’ `£GdÑ36þ›óÊ+Y8öãgÇEióãú49žîˆï'Iðu ÞÉn ¬OÄò‹®ŠlÝeŠßÞq ²Ã¾+oH—‘µ CE[§E6œº‘àÀßq™ EttÚ·ˆÅ¢Š\” QY«ÂÚ ·BØ,dþüËçðÒ‘ß…ü¹ÆWÑsÔCQŒ–¯…/b^[ÿ€péÒ÷Xȼ ÿп‰òx‚¿¯6Ô&±Íi’RÌ&án^ާ†¨î|‚§×1L`R Q¤ iœ†;Â>bÃÃm~èR|¿RÜôÿ(r⛑óú7ù6 g®XŒÚãÿÙ]CÏ1›L˜E²Ì]¶¯¯+zõÄ1ûs~T6Þ€?ˆÞ”‚–ÒšÅ'{÷"&ñä¿ýéб¨û endstream endobj 809 0 obj <> stream xÚµÙnÜ6ð½_¡‡Õ^E”¨«}²;I›ØIì Ý>Ƚªc#ic»èÇw†3Ô±»>P °±$‡3äÜ3”õÕ– Š<øw­¬²N®¬Wg%\'qëêÆ“Hk‰€ÐºÊÿ´?|¼\,}ß·W®¥¢ywÛlËçÒΚzáEvŸ5<;KÛ¼#<I»¿e›¦,D¿+ê5š6WíÏ‹¿®~Þ–"v__üïb)CaŸ85‡åE–öMKK¼æ—GÉ>ã% /¶ÿ¸$¶fäòò<íÓñ–¦Û,–p ÊŠ›‡ýÄ í»Ž.Y¡:º¾Ee RºÕâñK~½xÿåÃùåÿîåìeM¹­êŽd^ÙÀÚ6ë·mZÒö·E í´-ÒëR¯$DZç†x*‹Ñ-àaV(ó C¼ý¾¶Åú-Ð/o™oÏîŠ\1Ms3xéÔ,Oð{|þæô;³œÖkÅ&¹1‡çÍl°¼ÖøÍ¶ÎÕA#<ÁùÉÅ—ó×ß—ó5ý€;¡m$¼ed}G÷œ.œnÆ–œ²uzþE>^ľ}µˆ%Ì“Íч¼:î$•ÍD½T‹@ØY_@¶"ÜiÖócÇ €1 ä^ƒ4¬Ûf»¡©–F£%œ‚qŠ®'MPÒšÆ)¯LixÂÊŸÛm³L©|8¶¿5\áK-Á2ð$}£7sQ±R–Hì3ÔŸ«û´Ú”êVaÀi9ˆw³% vŠt¥·YÊŽVZFŸ žŠô$6ÌHl˜°Ø¼Ù NÂZíÑÌÿ¤N¶P;:²·©Uƒ‘¯L™aîÙ!=÷Çs!Ñlð㲌+í*E(ÏÇ‚ªè{Å®xzE¥5±„t|²?ú~èÄd¬Ç[,…ð$(ñìVá1‘äzF»UiȹYv/q|’ýl…v‹N®èÜEði ï䤩ëÇM=_Dä¼0Õ†þ m«ó‘qÁßväÐþèä0ézP™V+Ý9Ü«\—O0ažôvÖ¬P¦L9£Œ, Ê¥>æóž´kR·€ÆÆI"”K†¾ãE òÐs<¡åóGj$\ïw?h¢(q ?Büó¦×FI@4Í'ÌÒ²¤I†\ÝšLÅÔëÀÆ ›21¦LFA‘®©3Õ2nS—èJ±ËÊÓûÚï9öç†08brw[”c<19V D{5¦ù‚ch˺´R;õˆußߎÝß½ÊwR>˪s:«öŠYöŸ\¤du<Ãï@5Ò|4Î4±¥;ëæpKs„g­Ê“Y^ä1ž”NàY@™ •ÏzŒY8ôH'Ö4C†® ÂÎÙŠ i{]@9oˆËRÕkÔ1Î놅+ È%Š%êc—Ò¾¹q4,»b›f=XÒ~xöY¡J,'Ò%Sàh”ã ÊÑ`d2ä£íº¡M«rìôdMÜx6uMWèü ™Tz®]8JßÊ>â!ÑÈ@¥o`‘9È×EM›fLkRÜžãR%à;ÈÁÕ}¦6:¤Ü9OGC¨dx5zq˜ØÞ°ízZ]S…!Šë2­ÿ>¢P#ÿà>~lð;µk+áò¦m*š©”ìA4@ªåLå@p­öå4¡W5¦i¦Ð¢Jÿ[*~ÚLd¬öh'ÄF­ësFm¸£KÛéãl –Cà7“q›g°'‰à¥!}ù 9!u7%XdéCm«á:<<áÃaœð+ÝËMl_¦y€€†±'þÄ8°S6—[Ú€ÜͧÇ4ÌÃååùÁ ?õ0r\ªÁ³ùÁu{¶”€(A°3û :šžù›<¨uÄ›3FOQƒB¡ç¹ÉËÆ]Zá|[©Vë|‘Þ}å–Š—ËÅË þôÀá ì×Teʧó…G㎚5ÎpÒDt“èH3û–€Á4ñTkÄ7(äIÉ/¨Êb+î÷EÚ ûö$t¡»3õRr¶äx0±¹í°ÙÓ‘y\OšBñ¾Ü DzX×áÜ)Î^)ï0QÇÜJáOhQM¸˜i”@ ˜Ü ‹Ð\Ë'pY‰c»V™ê:xx•ã霤a団˜2À† éŠn‡«¼)Ë”9è@B[Ù?®ªè6é°¥öÜTÆÉsš‹ÌdµµIUÍÎ÷$e:óÖDñZ-t¥†Ve‰8r¼a]Z—Ö'ΡÒG±î×=G‚Bhün”p#+v’P?Dè âŽðøaƒ6ð@ɦÂùª2ÕØ@S—Q6üpÊžèÈFd­2Œå·Ö=&ÂP{8Š$qâ›L¹ÂÃß| „”7Óš×%X±NûÂtúªfçÊñA€à¡‚à–® ÁÈiHãGHêJ¥g_À«¬*þI¹ÒÃÃær{ /tx+Âx_\Sw…›+ûâòýj1|Ø7Häˆ`Þêisxrß>¤}j ?/ Á‚g¸΀9˜ææ’‰%áy~]ÕÄ ÷ÌÒTO™÷Äf¬£ ù8ìrYP¥Òš¿ xh ºpÆk,„/Ô¼A Áï!ÞÄÞÆâ‹·ã!%.=?vüh¢ÆàY¯–Tß¼ÿø; ¢? Çô åÅv!6jlÚé›®šU!lú@ÃéP½ @†M:ã)o³.Þ œc8‚Ö?Ñü ™ôO?üGà   endstream endobj 812 0 obj <> stream xÚíZYoÛF~ï¯úR±¶{ñJÒ‡¤pS‰Ý:.úP(#­-éTœýñÙƒ‡D©]7æž3;×ÇáŽ'o'lBá‡M"¿t2_Mž_N¾þ.™0I„ '—W0=e”$Ð^üê='Ÿ2Æ¥wöìÕ©?QàeÅ"›§MY™î<­þo—?™`‚;i‚dX@9™ò„¡I].nà-%>¤Ä %ݪ—å:×má½ñ§<ò”é4ŽÈŒ2YÕÍæÆ¬0O»Nx¯~|ÝmÈÝfO½Ÿ«»»¼i²²Hs³a^®Vªðe£¥šZA˜ A Anõ ž*ôn—Ù×.¡2o•bçƒéÜTj®Êtôxè¤ÇÒ™ùÄŸJNA;YÝ ›–Ó‚-Í™R”°Gy·>½²µ‹{Fˆ`R<·æ¼m((²K6ˆ#Û|½*j£ ‘$„÷5Áþ’ 4!¼´X˜†Ñ;4nªòM®VØ‘^‘®ì°¶O·Nj³¨Üî¨ XWR-顪p¤g¹î²³‚\»OìYzå*kµ ZžÓËÎYï—Öû/|A½s_0ïíOÒ«Õ™ïùATà\çøGS â–ÊT„´ózl7iÕ˜æmÖ,Í~£5êtÑeN°9pHÜÑs›zƒÆ-Nìò›$"4´Nqq§ñ›Ä¢ç7H‰kW‘"ÁÙ~ÔXOÒvÇ16pÁ“Àèê4mزH›[Qâ¡ ñÈ…x¸©UØÖi¦ëãóLûZmv—…Ý]•¸óÖtf¨°º©0ÊPm3ß,¯6xZÇ Àžåy;_«°aeé5€˜æR»ê;ß"œà]]•ynΖ×n¨Z¥ÍÍý>jHBÛð±!„¾›þj4@E?@¥ÇÌØJ¥Î’Í2mÌ\»£Ó(Ò³ë®*åzk­\ƒëåºX(€ÁÇötaïtxXÄ ðŒ3J)sb²¾/r"¹ä)Ò¼÷n˜D$‰t`F$ @e$”ÆkG4±„ÝŠoƘ1FÇ,Ýæ¢át› ãí NâØî•F¢UZ#‚„„Ë‹Õ6‹ˆÈIJxÄÆ0JHv<Ê -¶WÎð œîüää÷ çcÀ{@Qýˆ¼ÇãèÎÇòÔVŒÑˆÑÃîO3cû7»ãaØàé˜zQðh$xc"7<Ø¡¥'6½¾x!zQEÇ@ÚËÿÒôKÉÍrU×nGj¹éw3<ÕÛµIP`²üÒrÐùÉIlÇ/æ¨Üc‘O|ò‰ƒÈ'ö#;ùÄOvg÷{Ñcqäw áãåä '¿9ùjÛ‹|÷¤™£o[aÔñŸQ.›m’„ñhD$Ÿ‰™AÀà(|ñ‰ àu¥ÒFUwÁ¡/l¢à¸ª“U‡;í“î{á~ÐO@Å!9åg} ÝL{º+udûSÇäcSÇÎÓO8ÿ2& ª¨‡Œ‡?îð±Ëþå]yèSGÜýc78â#ðžÄä æÿæ[7º—o݃š öâU|DÂ'ï˜ð%cþÁ†_Ü1z2¢n€1J¢¸×·KU©Qjàpòˆ twðÇDô‚‘I¬æUÙõë Ít©¯Õq¬ÎŠøÓ˜Rï¬l”Yo§Þ܆xs‹½á=ª[¦C&󲪔½ž-‹…¾æÄélu“gó&ÿ`º …¨[¨…½Z6n–Óõû,ÏÒ Ë.‰ðÞùôÒ*Kß`¹‡'Xîõ»„ÄGä{ûÐ3è4µ÷™¨ƒw>^8Ï|¼“§ ŒXÖª¸|mO¦k>‰D…àfƒvÖ¼%pØTc1ª0\g…J+³ïˆ5_}•\)è+³Ê½‰Ìõ4å$sºûX{—1wYü „‚†G¨”­Ù¤vµYÔnïÞqõº½ÑÇå±°Û7ÖŽ{m]=á±°¼…épóؾÜÇÑÔ<ÚW/¹­ñX‚;ô«v±µB<M“±ãFÿ±liXÓtS;L÷å¯ “`1p· zé‡Õ°81ª—'¦œlÂBÛ¯ìö¢´ÙɺnÍç*wmñÉÚÒ$¤§V7&!ñAs@Ú?ÜÙz¥ªl®³Î;ÆCrfÜ€£Ü.(Êbú§Ûèžš¨Ü‚F¨G/»¼Q’;¡^H’.f[™içäpª ·Z˜Q rW¢™.¾m×·'ŽpS+[â¡@”ÝŠ2•kœ¸5å߈٠’Þ¢\ƒ'L»hÒÌ%–Mª´¸ÆR öùÀÖf°Hö£VÚ8‰I›ÞJ—ÞBãâÙÙ‹Ó×–V+“æîd¢û¥ÙSX µšÂj` «ßž¿üùÕÙFÝîèš* {hÔ;3vœ2°mË©4råTêªy4”SiÔ–S·H¡ßj¸p£œ #-}ex éCâjìîÀ#ï ß/ÉÀ]¶>@6ʨÑÁ2ª¤±-=JFm[HŸš²¤I§Hm©;Cç©Í¨® êFe)´E¿5·r=fh¥pžá?Z„è½c3ƒXO.ÿÿÒì—˜alA±`ØO"ò‰%ž=neºXÏ5’Á¢¿mjPc‰³Æ‰Å¢ô?0б¥ ‰õ¼YW'¡ßþ·‰Ä¢KlY7mÙ™Ù²14±lìÒ ‰ÛÊû <·JÈ|PBvq:¨êsH¯@3aaõN¶Ô-ÿé‹¿ýÌÃ% endstream endobj 819 0 obj <> stream xÚÝÙŽãÆñ=_AøIvÚddÓo±³>ñÎ~Èä+õ¬H¢LR³;?>U]Õì¦Dycc`ÕÕuu]Ê~Ί,‡¿"«$üçÙæ}þ}ú¥ÉŠ\Ôy=Ñ—­/fɪ u|ñ÷ÿîû{š°G¤É¡¡ˆâÏm‘CpSì˜á¡›¯xòTD§=ÿVç|eÎ_\تÔÕ û£=쥮/#Ë–V‘©-GBLRÁÉ$õîWñ ´À3á°îàß®ï½KôY=ÙÁ²#lx¼ËÄ£´¢"8©(Ñ«îÐŽ£÷ZÊü†únÇpœç;ð‚ýÀù-¡ùz÷á´o7í¸¹ ÀO/“ª¤Œ×”‚ÕY¡…Ò%†й4%Ì<[Ÿ ðÂE!õêÍרÎÊL2¼Ž>,Y •:zSÓa]æQ~ @ cÓ´ü¾w4"‡ƒΦñ­#0f(Üj™7¿û@+/-°íYmB¹ÎsQ{‘Økæ¤EÍÞ©1noZYQ-x5VXñ‹ºåÌ›‰ú¢âL5ç`8òw²,a%ʲ¨R„펎¶½äËäw:‚è[°2”ØÝŽ/¬ácSc…,Yo¯S-J›¦(‹Jmb†òL0…÷‰Y]R©ðæ+ôﮋ­Aè%ä*E%*Ãæª#<»t¬ÔHnzìk‘w’$¹yç~EÁi˜U!H½…É?NO!¬L=®Ñçh½ú³{Ê…ÁÍÓtíM„íkçÝ öÁ?uÁYL™>x1HÈ á­ k?žÍÿï*.›¤ê8ÁŠËÊûÆÍ†>\ Y •¸Bî.í[ÚÜÛ7í>âk¼Ïü6#ôÛ*/ädñ ^´AÓ!“.?ªp%s!kIÆ{Ú!¿Õ½OƒùãUQ%¶L€ßYH+ S‹Ü2å_-ÐU «y;Š¡„Üq‰ ÓbÑO, >­]nHœ™)gV«/“¬ú$"éÛEŠU)¶“âˆbLd{NRãÿbÄóÚ˜Ð?Qr":}ª³~Cª¶uHÖ^/ÓX^IÕÓ(þ{Ï.KHø@zP¼ 0GDV}Ôµ³«ÃD¢üã¶:.êÝ'S~q³³AU„7…‹n J~€yº­Œ·É*v©ø¶Ð$ÅÁ¼`Â¥0xFõlž Vý»ÂÕ´'à7ZŸzÊ$=i‹€£]ÜÐÿ.fËÌ ÿÿš?gBÕ6{z-sðiev÷[ 9Í÷Ù}ö#;Ï2>+ë¡8. (jŠy^L°ä/ué;E)L°F€ÿ%¯šÔO®Ï^Àu`Í’Iž»D'؈g´NËÏ®„F5ó 6؉nH»á2âgÿ£ïþvO¡mí±‡Zæ&¾ÐڿК^¨ÎÉeÔ“Ë@TÝþ™£:mŠ’âï^§¾{»wÜ™kèš~l7ç}í»ÔcØÉ­éÄ­qƒ¶^ñƒÝ &‚üÆuV‰ÂÌÃÝM©Jä”RQå~€²”âYŒã¸J…K™Äs‘AŽT‡éû°Ÿ\æÓ¸Ì8€ßW +e„•RØËLQšÈ¢ÂîèëY¦˜ÞfD%³ €éž5Ÿ†×›¸=B¦†Ù7‹Áõ‡‰å¹`âï(õô; ìÛ£CÍ" VèÞÇØÕ=ë—ÁÅ9_îU D/Dz82%PÎì'T*&©}ä>Aí{õÚO-b‚ÁÊþx‡Ìl¡¦›7 çÍ0ã›eU¡À©ÕQðÿô×¥‘ endstream endobj 823 0 obj <> stream xÚ½]“Û¸í½¿ÂÓ'yóÄOI›éÃešËµ“^î²›¹‡ºŠ­ÝUǶö$ùö¶“_€ %ʦ×ÙtÓI&¦H€ø `f¿Íø,…?|– ø›ÎVÛÙë«Ùw?3®˜Tfvu Ë ž²Æë&¯Y6_p.TòáûŸÞ¾¹œ/d¦“®Zõu³›ÿëêgŸˆÌ5+Ôl! &¥Ýàê¶!G|{|ú¸mö›µ÷eÛÓð¾îoiÔÓ*©wëzUöMKó«²]¿Ä¡NîoëÕ\d‰ÅÉ ö&éËz×ÑLïÙ¸G°¦];Þy0¯RÍÒ€Œ;~E”Ë T“Jç¬à 8É´¶+DP—Íf¿µlÀÿl˜Åpzâ9Ó¤§7å(€JÖe_âÈX!iTïHV'Š 4jBÂÇÝ|{U«z™rUu4Ûìé6B>ò¤¡‰¶ÜÝ´N® Ê$ëfÿiS-ºzíÐA¹]ß‚j‘ß¾{Ið ¨YÅæ ¥”Ûʪb‚I“ýmÙÓ¨lÊšküU£{DxpRu±£ã…tGò.rd`Æ-—»èÑ Î„p oÏìÐ{Æw]¹õ|ÖÛêÂoÏô)ãÜŒô³ñpr–±"³–Å„PfiÐA˜`#Ãìë!–©P1rœ3Í»Ó1L¨}’Î_Î)‰h–e" !XîÇ(–©‘‡¸2 ±=&‘1å]õ…+9¡ñ"*gŠ®ýƒÚv±= :ŠgÔL _ûÕ]ÄÛrf²§yÛ>Ê£ŽH¸…d2 ½Šè{!µ@äþ¶‚ˆÛcN 3Ä<éþK­â„ Õ%ýl Çöâ¨\dÿ¡®‘ýný2zŽ#Îy =Ê0´£ßýÝe€ØQ–̲c¯ |¿Ù A»sÁÚݱŽw¬Ûñ¶DÙ~Ç,˜Ãüu³q’×»?ÕnËž¹O&ïô+j¯a›ã`@D½ »ÆÝ'û®ZÓÞQt³øÔhP±Û°ÚÞÙÛûaž«„è§Ç”µ(Ç ŸÎ)+H`u¡M²£Ë &ì-¬}¾¡]z@P¤ ¦bHûÍ•K+?¼uƒö†Ë0 *Bè­&c~"›ùˆˆ' Ö{tï_/RvyÒФ ™3‰¢Ÿˆ¡ÁlI?^÷Ý ío³3n3>¼¶ÇÁC±BžIf xè Œƒ8–°7mà /!Ç%¾œŸ9W_Î Òå°Æ£«\HŸ_Ò×ýmÓ¹¯hgƒÇzX»xQÔb˜2ï¬jzâÙ‡2…‡¢*KM?6–àÀ¸oL²qÐÜá‘–p§\KëN8 ´ 10˜:UÁªM8¶åVfË-â¤t0¬¬iꮬ[š].½]Æ ÔßçÁ:äh‚î‰\%4ïÐ'ôfïQÁ!áp Õá· Z"wΫ}ÛV$.L°Ç‚ß^G8·]˜zíšhЭUÍŠ&Î3&=c°ª?úö)&ZY(Q$?—9-¶pÖ¢ÈüÎVËUë†×¸–úÈb™É­Ýâì€á+S•)BlKŠÅmÒK¿5ÕÉ6ž0ÌYÂ05ö‘è´óø0–¹0&¦aìÈ~ÀÂÚüVc9ÚžÖÀ ìi%K@G^n!-[þœp0Tí°8Ví°PÛŠfó«\ºŒ ?Ètò0ñêNþPU¯«¾j·õ÷Ën’×@ ë.ü}|tóâ-$iÒp†3Ø iÃûH…UCZ˜ä²¾Ù }$²j¬¹ ì§³BVÊ1-|w˜˜Š@?Ž©“T1T —ý·“E>»:Y™5¦ÜÛ™4†¥r˜ØÌ.g¿¸4gÒ‹¶C„2–ª“-H‡¸JÒS)B„fÊ×Ë4McªÔ’¥¾?ñ)¦J“GT9ÝÂ`÷a€ùò]B™4˃4ýEDš°,üw¼Jå£F!"<˜H-%§4ÂZ²œÀMÞ}ã’üÑ*ÎȺŲdBˆ¸A®B} -N,FGù£›øǃทm„ÆÌ d75 *ç<'ê Ì_=q—˜ù«onþêìÁ©'™ÿ›˜ÁZ?x8^ çÍZ3kõœfýdí|YŸ6ƒ…6P ÔÅþÒ¹^Mödš7<;èŒ(*²Tž´õÍ­MQ·”BÀ’ËbTËX`Öf,Êå8øð㥃ÒØz™ÔÑ[](ˆtÏ.Qæú$®mQŸBúD|yxLÑ@ÒÖ‹UºI¦ÀBhúÿ©Úf9ö­dŠnò¿d('úV®>÷ÕŠ J`ªhŽ Û2:Jq}.)Õ4¹õ)ÜÁ»žÊ Ë ÷°—»‡½×ï?þôׯ}Øãň/ÒÀB`a|ØKLJ½Ô?ìq߇©ÉÃ^:>ì‰ÉÃ`•fîƒû¹}Ú:ù°7ÜäŽßøÃžþ–{iáÛ@œû6Œì±Â¯%5 “Fy¬¡àô°Ë˱tÈ(ÁM ªh`q¬lOfÆ.)}_{ÐaC¨qö«~ß–›Å™m[ûö‰H/ËùW·^‡.ç—¶^O·ÌBʵºbÙxKm@ +Š£Êç"f}“†Ù»÷qçJý;ÄçG›ìt^¯¢·:íÐúøó—ÑÚŸ¬‰^E Œp­åPñ<ƒPï¿ÃrÈÀµ^d9UCLÁá)ñ­fÒõ%Øl.f õúð¾ØÌNWÔÝÍTr]•`‰}”Þ좷XØwVe}C3ö8 <Îë7ã冰}ÎTÐq;[“ÉôHÁ5›`ôŸ]ÔD;Ùàk·ÖÂ6Tò±¡RPC®Dým›ÍïdÐ9)aü?wmî…g%èb—É„Ózµß”-M{”tä:Ù°4„aE,‰\! ö-.Iÿj›Ï8³5­}«Õƒÿò§ÿx`d endstream endobj 827 0 obj <> stream xÚÕYYoäÆ~ϯ òÄA4t_¼œ'ml'ìeK ˆòÀá¬hpÈY’ÖðOUW7Ù=Ñ%¬°$»««¿®»k‚/üãA*à›}ðê:øæžœE9˃ë]Àã(WÁ’àzû¯ð‡ŸWÿ¾þ'Å>¼0MðÛj-¥ oWå–>îV± ‹®*>Õ%Žˆð&¬Û•HÃû•Ȳ#²¢1ôãá°Z;ŸôW;6ÛÞPvš Ë/cQ߬þj@yØ×kͳ(–þ§§ßueyyÓž z2‚·¯Ÿ†Àî1I)5ÂζFÒO!ªŒànnöU³I8öDX5¨©¦põ×??ù Þ<ï çUjOáS(M‘NÊ9¡Í»ƒ>Ñè#êîõ-ª§Ú.ËzKYØ›7•žíi² GSìK"kw42Üš!|ßi l†¶Ó(¾¿6öÓßÍK÷Ù¸x\”§(2¡d”‹`ñFj>/Æuf‰+f¡²(I` œ2Ók¢ÕZÉ,|½# ÃmÕ/—á û©{•ÉðÇrÿP“b`‘s¨YZÈ—Qk»®Ý“bˆjh¿/·U1”õW8t妄¡æ3©u[ ÍlŠÎ³Vp¼¾a9)Õ†¢#šXC‡„IKµNSO§ÈÐìÔÖã¾1JúE$¥6&´ªÆ;Š ÿöþÍÇ·ï®h´‘TmCÐØ‚©å,ÁBESƒÑ‚x¢‡a>qXÔc©Õ›“zaœÁËñÒª99ñÔ§p×x¨8=¶ˆF–£Õ¸dÆ¢81þýæýRà‘²K,’(fþã‡3 â‰>f…N"bk–“’ÇJ[¬Jºc±“N²^T¾gcJ+Ó ªÕç¦íJ37%±}A>æÄccHí¾†'›µÙ$>bŸe¦L¤í­6tö·íhýÃA"ýH°`Ë—u „ñQ¨‹óY\ˆ.NÃqf/›±ëJj"ñŒ5ÎüÀóÈ8s@Æ'áÙ'KwÀå¿‘BÍZô“54å€&ùXfø}‡Ñ`Ñ9 ÿáäÜ;*bÀ^ElLFÈ8l»-æ2\Ž©‡(ðôô6†“Ó‚Wï?¾ûîŠM|¡‰É”pÆ:+}QÈE"ÃF™}­.§Ãi ¨˜ |h Vmø29ü˜‚9¯<=l ƒ/Î&Ö>òãÒN)_s6ÊÆw¶fÿþ±MNÎT ›rî×ðí'1nt/&Íñ°7i]ÌÉFoÂjçqn½uâ¤lS 7ƒ9BaŠ0.§éi€œØ•‡ºÚTƒNŠˆæÈÄm!s^á»Üc=`ˆTàèÚMaxÒ­Tx˜~èÆÍ0vEM#äTÍBÍJkÌ6m³nÊÏ rrÍ ®"’4¼ÕfHÖNk-»–ÞP.‰#Åü˜Œl _ð;d„¯F&:Æá›#é3¬Çmvà^ðÏ£ÔÿÚȩ꒑ÀÂ%J”¦øe!}¨HBº±ZX°éšÉ¨Ë08¢…1žÂH"¿†!‚íum ϾÕfͳÖàÝ:¿çÖëÎŒPw^[œXlÔ¥Ä}&lúK_²49˜Ø¾úÕ6`d[uScDQ›ÎÛívÙüÈñ©œîM¦»7)uo¤°e¶8½s†RÐÅ/vcmHõuFLçM`÷0ÍUºªK-ú‰?âézËËàÑ L£ã¸ùš°¹·únA‰9Ö44=è{ÑÜv0‚ý÷Õ¶ì,Ò‚âñZ&xav[+Ô™˜‘ÁG»;ê†h}ƾ>u¿eÒ§éªPA¦g—&´”yK l·o3ßµ²ù®…­•ñ¡ª«¢3 ÷w»›ÕÅiçˆ"PŠH:ÑÒí%07˰(±÷ù}Õ q–«˜‡K±\AZ<É#_(¾³àÁ$,’`ð,„ý¬ƒ«àGó+QdžfÚCÁýÁœ®S¡÷3ѦóD‡  ‰s ,b‰É"ZŽ î]Y #uLSlµh)÷fÒônS4dÝ+M(‘ÂSK<·>­GlÛS·`õ'Maû¯‰Óß5ìõMyÒ6‰íÁÁ›N7¸óì¥y:{iîöXm¯7Ÿ›¿Àª­ïÈÌHó¯×‡®ƒÀߨ0ÌPóìPtCµ뢣aïJø}jÅgSQÒâ B²§¶/?”{u¯ˆ±úX'ie9Õ ±´ä?þé?—¶Ö! endstream endobj 830 0 obj <> stream xÚíZÝs£6ï_Á#ÌUŸnÚ‡^'—¶—ë¤ûT÷ØäLdžpré_ßOåoð;7ÉŒ¬vú±Z-Ò:;ÄÁðGIá;“…ófä|óV8£GÎèÁ!EÜñÕÀMÿp¯onßy> B7ž—¹jEКç•îs©Ÿ”žOC7™¤/iöÁég“<+«8óhàVêŽt«¤Xh‘üAÿV³Äܸ÷|!Ü¿’I•>©.‰îò°ÌàNžÍeÇBä釙BSù³8›Dé4imü9úFdÆõÀ´QÆaQ$fy6Õ€û…£º nªl3¾êõÛwºQ&54T›¹iJ#‡pÄx (ÅŽ0j:ß B<ŸÊÝ«ñâq®ÔI¡©€ß÷·wº1Æ„ÃC¥Ôú†húk•#/dn®Á¤óù²¬Š¸2(Ÿgq¥[87àÎC^,š§iùµ~ª^pW¬uR²Í+oéIZøpQÇߛ[­æ±ÈïçÉâuŸb„ >D‚Õˆi–.ÒšÑÒžDR #ýšž@¡ƒ×ƒÝ¥`‚J`YIgUI FàµEC˜™Ç˜Ypå4Zâ<ÁˆÀ,B‘4Q#D~%ÄbE"—Ä+«hí 4ì((‘½eÃ¥G ;@¹hÐ#PÑ P18PJv…im p 0§B`§ 7ejÑ VÄ"†ˆ–[®Ö&sëæi–ÄE³–d*üÿjA*­ÆA3(ˆëá¥pi¢#ÜÔàåè[D@h Ÿhˆxt†ð²—pwtú¶ÃÏdGo'Ü5µä¶©ÕÕ`f†Ïx½pû$@T»ì[È`Xè^ã«,Æ':í„l§³³~cÞ P: #ÄywYínF;nð­f£>0ˆÚƒ®f­ÎF6Àë* ¶±*°òžY¥G³Ú±DÅ&Z™Ž GѪvEi»+z «ê¥7gAD9+Q´r+N𢾉e}¸k8„»ÖÁQ»ýt‚»ò†W‚Ïà°ë{6^Ù¾¼Êy½>WvÆ0°þY|8«K¤ @d€Öx$ö¡êÄciÆ ŸåÀ±”@ù¡pÒ.߯¬Ãi_±÷–íYŽ¥{§aÖUI,¶ÜŠ”ÉU®³j¸ªO"¢Ø¿môâ¸]ÿ 6${„[¶5784ØB"DBj4‘ rB`P•Ât¨=   U颪ÿT¡ºª‹ UÔ-B›»Ï³t¢ê`fê’vªD•d_u‡i\źõº_5KÍöÆP]è›Ü-gº1ÓjuZ˜Ì›jMuo¬+•´²U”•VQi•F¶£X$ºXgC™¨ªî1ùfcXW„NâbjŠA—tó2Uu åØ[/] a0Cêø„,72óž7â¿~õ/0/ë~ endstream endobj 833 0 obj <> stream xÚÅ—M³Ú †÷ýYjg¤àYFÖN$·×ØN§ÓU;ÝuÑÿ¿)òA0ÆxÇ)º0¼ðæœ'$Éßj?(f¿4ùù'YWɇ`¢I*eRý¶ò ¨½Hª_ßï©oÐ6Ö6Þ6Ñ6l›”ËÕ§ã¥Ò)…ù¿b;“óºW"I­té{)2S÷­êÎÞè×òë©VQàt6K{!ÒÅ—¬8çñ]r/;äÅ6– /ïòqms׎憶µ½×²b|Þéàt™:}Sç£q@ÍûÖã E¨ò8;& g¾—PnkÂÞ •èq±ÅAÒf&ºp\  5aÁÓØ]qì\=2E¤oëSÞ·óà YgçIìØ˜‡Ø)ÚÙyÀ£vLРÞ£¥ËŸA—Š)º8‹®˜¢ËgÑÅ)ºò6]~/]PÓÅqºlŠ®žE:;+´ÓtÌÎÓ»RQn4c„§xânxìÿ”&{tá_…§p<`·ááÝðð)ð&+OÆÙâvM˜³®õ›vMËñx/]O¡ StgáHÕ¸ãt(›Òøù_–Þ‚?çïƒODîRs‘£œ½>F‡ŽVˆ]Ð(‰hòºÔ‰ÛE±k’WüIÃÄ8Á ÿ%&/˜ú%£®Øß4z®œSj¥¿ií‡ÇVÞÛ]‹Ú'Ó>3 MãòxÍÌ>mö1è&ð. Så@t°Û•g³ž¢t~Y®‰ÅÚl¡Ám{¶ì1ba:ñÖj¯ø°¸0`|YöÏÅå5'>ŒH<Qä£Ç}ðF> stream xÚåZKsܸ¾çWÌm9µ,ñ"È­äï:.'~­-ç(j†–ÏZ’³^måǧ ‡£‘eÅ©TJ*Ðht÷×€Zü¼à‹~øÂøëÝâÉùâ»?e ®˜TÉâü ¯xÌ2hoþ=a\,Wœ ½|þf¹’FGмÛ7E»üÇùŸV/pzœ!-×,S‹•Ș”–þüº")£—oÞQãCÝìòÛ*ºiê¥0Ñ/åVƒuøþ ÿÔÔaÛùR¤ÑmÛ/@²Â±ÖXÁs³_—ÕÕ0’D]qU4´Ê/K­£¼)óËmÑŽ¨›Žöi·svÌ ‡ªH™Eá2ºˆ¹jÚŽ^‚ýQGÙÒsWû)WEU4ù–^òjƒ ]æm±¡¾º¢ç¾%  ÙÞ€PiT¬KO¸Ë›(•‰‹h7Çêù«ó×oqÏh¨çO_ýH²¬œm¸dZ{Z)™,ž ‹' ´VPãf›¯íŽ¡]Vô$µÁ?¼~ñþå«wÔÛ뮬+¶\i™8½%j¼M A&~¹M¹Î;kè=w!ìí3×h®(ˆ…Hê„¡ <õal Fº9#Xš3â}“_ŸÁXÅŠ9¬ÂUz’³œA«§¹X:—U±f\ÏÚqRl½®ø©O¸M’¡‘87ެª;jì)úà˜ŸÛ^×û­k_Rø¡—bwÓSŒÃ¦èEÐò᪠‹ÈY} ® `ÑC) k—NƪÇÒÈ/F;|"÷ß©¼ÇNûAÉ Âe?0YþŒb±–Èë›—|û—§o¿™I“*ckiÚ„“õv¿qÉ tB¡ÒGSß@ˆîÑ „d*;Ð3ˆ£„ˆ4=¼8؉ƒE 54ØùU>¡Zˆ&8xGæE³¡üÙœh:fJ̉† E£Ø”>ÚJHv“±X‡¡#Åå‹O×åÅ»†Wm<"®Ê ‘£S‹2=ä è±1žã<¡ŸÎ(ÿØJ¦‘ñ¡q—ñEš2•‚|qÄøfVC¸Ç9 a?jÈ*BÊ”‰PÝ]Ú……PA0yªä„ AÉ*Ƽ^Û`m‹•¾î‘Õ=ŠG_[š2Ô=Ð}¹ï¨wW7n9 ÊÄ%Žª,*ltnµŠÈÚzçgC½ÔbPH’è¹[+ßnk\âSKT$AtkhʦXo!ïƒ~ç‹ 1ŒñÀ—´¯È b ±éšùfSb>²² G´ÖQZ„™Ô±ÞƒÊÑi62Sh†™CÉg½yC½VÆCCä‚>ffóèA‘äT_;ôvòúý«ß¹øç²ì—g_¾úP,Õ.ŸÎƒàd6"{XZ3-F q-Nó7œ¥ãm_,¿Ÿóõr{É‹çóç!îC¿œÔF£ÁqÅÜø¬‡~Óã‡ÞíÉbÍDìàXB ¥¶ÜBïëºc›‹0• :¶!Om°{×ì×pÀ#ÏÎN+€8 CxaIM%´Bp×­ á‰Ë× ö‰²`Ï!±—R’ sXI\OÇ=)"ÜMNvJèè#ã 4#àäê®=Æ jånl¢}¢j™4ŒS<+TÛ¡/yUÝU/Íxrï{j\z(ïmÛ’òE艟*'‰+çç’O’2éKН@ч[.!¦|¹q€øÄXŸÿ~ñ 3Ù€x•B½qú@…§YrÁrÜq,„;¾OàŽ]­{àn'Z¸SËMœƒ;õ“ ±=‚;á[PýÞ›<<:Zœc¦q8‡lÜ×¥)¥@y°ÃMÒdÀ¡SžÙžtX›&Ðáp®tfqŽ]ݵ§òèH-α‡t^qžçó¿ ò÷o¾ ÈŸüuäB —Pt–•=Šc£&øÃ}yUÁ¹`z#±³:¸¢Õ<0¥Þ•]WlŽœX~¨«¶Üøû­~ê­ÃQS\üšïn¶ExS&ÝM÷pL% †s[ÈdWVå®ü­ð„"Ë0@ÿÛ\áLøhöÎDrn1ˆ6™qó~õÄÂ`/ C,BáYBÛâ3œ Þ"õ3¾^pÖ6GxÉ»yÉ€—p3’1¯dàuÇñ,hñ{ó‘ó2%¡L÷d.a¹Ð°r× \°µ™1eì@»ÜÚÿ ‡ §šžÛ²*òƹ ®krç×í,$ …gW?¸rs(¶b™8iJc±lÄÃ`#gx=À”épƹ?d>×”'™¨¼$G}à¨0ÿïÏGÍ-±â"e)Þæ¢5[ú´VLZú‹µÂÿƒZypTÐGü5™Û‡fJ6NBõåð8Lr âä®g|^?žÏßå‹ !~4-õÅøikÌ!\fxÝò˜Ž¯f¸€1Î^Á#¥ÐÛãC‚ê+€ñçB›ý¦¸]Cª£Þ\_ÄbWñgf€ÑãÀðûùÊ¢gòíÝûœÃ€E)7¹˜M>f1„:!¨Â»i?ëR.í…ò¾Þã-:ÝþŠ ¿ÏuYú5¬(þëV_Êâ1¬¨½ƒ3Òqóé¯a>ùÿá„ò1ÌÇï0ŸÒLs²ž:ÊñÅR£”0'–º¯XééØ"@<ŽÿûdP‚ÑÇæÙ{÷ùúPá™Wേ%úèáýÙpœm¿÷ß6f¾©h–šcXš¹O!‰ŸþÓïþ ðU° endstream endobj 843 0 obj <> stream xÚíVMSÛ0½÷Wè†}°ÐêÓê-)Ò’„Óvèô`H(L ¡!Pø÷•%9ØÄv¦í “,íêíÓ[iµèDÌ¢æOÐɵ´¹ ÅXK‰’ScŽ€˜J†ß‚^«Û ¿'XS6wÐêìlÁ}Ðÿr`-+(á„fÀupd­¥;Þ4€¢M”m´as\‡|×ß;ìöˆq̊Ư.W˜(¿-?68ÌOQLˆ!9 ³\0V™ ŽA/ƒg ðb´ˆÎêÑ»­ÁGBx6²qg°á0¤ <ÆÆn/évœ%ò¦"MZ«Á$§åI´®”!zÐkÌõ²‹:°&TƒÊl•$ÂBAa9g/«Ø‹:ü£juœ¾Ta¨È])OÞV}žøSódVä;å BòUÒMiz8ʤ“–ŠÂûšKh °j2 p¼. Äk"TßU‡ –¥m´û‡½­ÇeÏ Ãý0”íÞ–‹"!“ž‹D1ÊnCÁƒtzž_Œ¼ E4Å{EïrÓg`­2³Ä4 „¥“‹Vhc¦ÐÜ#µ´Íðò~2jVÑ+«ž'Ùþì\×§Ú”EÑÈŸø³ þöHÍ=ÞZNRÙb1IqÌ{,úÚcý½ëµ5ªiä³´F/×ш׎æe:ù/w4»ÏÐѸ““= Ë:šÈÍýOÍKþ Ÿ+JŽMl©޵;˜BåîŸÞüHɶ endstream endobj 850 0 obj <> stream xÚ•XYsÛ6~ï¯à[¡™%^}K3I'M:u?t¦î%Á IÕv§?¾»ØIYvÒŽ=ÆÀØãÃÂÑçHE1ü¨(ÓðGÛ&úá:úîŽt,ÓÔD×·°¼.ð#ºÞý.^«µ‰…kwÕ=Pi&^­þ¸þ x²H[™åó$ðQxžWWï_ÿ†{SñþŠxÞ¬@F‡ú¦½€×פºˆ”•Ʀ,FǹԚäHµZ+¥­¸ê]}Ú9VœD*–E\ ‡Jda«Æx¦ëƒ[­­ÖÁ $Ñ o»¥vrį?2ÑïÉž‘…?•2Zš ¤#:›š¹‘‘yÎ,²Jf ™2™$ž©HÕ®t&Fð¥ÛáŒB‹0bÛ­Ö°¶«Ú=M¼¿úîç·l÷±ï6µkècWŽ¥\­3¥ÅÛ‘åÄSÒgß¡š»u×WŽ5î¼Ùë`›2Á4vÉÚ#ÆC Êa85nÓ ë÷¢¸S]ŽU×â¤Ý--{‘c²?n„’êfõŽæfE»oÄà­t[/íËQYzØ™ÌRðp’)*òëq± ξdzÁÆ–{÷?”[kd®—rН«¶…ÔgºoV’"b!µ s×*—‰9«e¨z`¼‰•­ÑkKŽuYa$”…(ß—ûïúj„Œcf/tXNH,k2ñºÜ®t*¸¤‚ëªe±>ì “#4+µ¢)1O8é¨DçœÛv”•dyšˆÓ‘Pbì5t’ÐÄ÷ʾ܎®þOáfÞ«:+˜èÿP¸ZƘV¹‘*÷LàŽÄñC]¶ŸÈ"ôÀ@V–½£¹jßv½ÛùÍV¼½åå™&Çf TY@lÈߟ†º䓳£‡ê%gOÞ†Ät™mR[8!®·O f"kcÎB¬@ Ž¢ŽÅ=¨…`¢lw´æþB›\ÿÛ¦pŽ1¨Û®® xâ«ü‚':vUÓ4Zû+…6ø\‚ vPäZ4§k‡jçzÇ[K6³ ËMƒ®$Xâ³Èt´z舚‚…ûCjNÅ÷2R'±¯ ¨Ö)©‘Fá mÂï åºçó‡ÃÉÓ€î#Ê; I^|•Š;Z³…p˜|”á{¨ÂX‹OÞÝw+‹®ß , É2<4¸mƒ_¢««- oK@l¿%Þã€à=,>[ƒÃXRd†å;WWM…•ÆÐÈî³bƒ0HÎ&_^À³ ßÅp«E»á‰ôC( éyw¨(ÍI@ ¯— ¾#À›H`_JŒ_f?°Hé3_]f‘œàðïÏú(õÅÕ­T˜ܰ„MÕ‚Sþ¦+¢P2 Æû…Sãçsp‚šçÙç™oNoÊûgdáÂS²Êûçd §ÍŸpsæèó±Èá´=ࢥ},y#…3ÉðjâÉ0§d2ÉáÊÒyê]3[°éN-‡x©ØOs5úéËÞµ®/ë ž.Ì„…çPµ£Û34.eñü¥,XxNÖ¦jËþáò(8]¹KQ›ê fÝBbŒOØu{áK=Xï(%⥠Ç^û¹0­çDóýrªÒµ›êˆ©&@LÔ¥šŸ\zD ©mFÀß´PòÈÜ»àä}Õ¶¨ŒJ?623ËHPÓOM(Â,5ˆ€¼gàõs$M‘GwþuX€Œ¨‰Tx>ëècôQ8…ƤÈrïM--HÇÒ$ç¯.Ú›E¹,RÿbT)úöZ©Òùhâljrô>qzíísÜ÷q Wß_˜U®îŽäémòÞsöOœqÓ„wŒªÈãoÚµA$qÒž‹_Ž#¾4½ ùm»õÙž°`I4O#ñ-­Å‡"!Ó…ÎËýÔ¬H CÙ ±}_6 ·lôÃèTwôËz?_}¤úbªõéTË„·±yü¦-ü›Ö¯`›éÇÆ¦C„±±¥†;Gˆ‚öª­e¨·¢‡·ßä5í&M`ÏÁÁŸj •ßræAR<öK¬3éÒ§¦lÁéÉ!É2º#'—ÿ_ÊÅ‘wnØö=Xصޛ6T(Lݺr<õ´ŸßÖÌË!r–‘9Bä`nÙrYÅh {ªæÈ hN®ÅÍ>ûgáZüøþêMñÅ’$'Þ½›ZÃË2hLÎ_`ϱ¥WWÐðä»¶œžvz‰ÞaÖL.(ûM5öxÓ×îǃ> stream xÚµYY“ã¶~ϯ`œÄK•G0 ^àxwcob»œ¸;ž§dR1G‚$Æ<´¤´3ã¿ÝÝè šÙT*µS G£Ñç×÷Ö ½þ…^&á/ðVµ÷æÆûø‹Æ‘¹w³ñÂDä±·ÄÔ»YÿÕÿþ±¾[$¡ßVåj±Œeî7E­ûÅßnþ{“ÉVÁ¸«è4,CÿØë5ö¤h©-׺YÈÌ?”›GZsØišjïË$ñÿ¡W‡òÝB¦¾üͱ‘¶¹‚ÏHú«¶é]Q™žˆÜú]‹ß÷ýí¬ ü¢á£ß-’X*‹»Š9_æ©È2¸g$’Äp| d«cÝÀv»TâVU‹eg~ÿX#e`þ'9à0ÉÁtÍu±³*zîõºéËñQœ?8WHï‘Fá6æx3pÜÓ*¶aʇTû]Ñ ½c­;â¶ãæ]Ñ«¥¹Y0½ÔAwtßÏoX÷þ’;Ý–µÆ òÌè>)È$ŠEhvGãVÜŦ*—©ÀZ"%‚”¥È†ªÉ²XÈØ†Ãp‘Y»ÍE aÐ@˜f³&…9i™ •ñ柞£íØŸâ•iþ3÷v9e-ú/YS¼ù/ÿkÁÿ‘µüiÖnD¼è©½G{ÓÆ5&£Æ…±³i«ªE½/›-)s´P4ÇkkTd}S®Àð¢Ô[&©Hrsö/á Aøpû+nÍío¸ý[°>î,¸ó1·WÜ n?áö·Ü~Êíß¹ýÛÜþ“Ûsû/nÿãÞ’ï*‘Dæ÷åaGâÑ+½ÇPfÅV¨× ³G±3Öà4Äê­Š†VâåëmÉ´ÆC Z°.·%So»ÙÌÞP‡ÒkamÄ• †[|3„ ØXÀí1ÍÁ• r)T8M¬§d€=Û …\ÐxvÖiŒB&åH QœÃ&Ãm¦«’3K‘D~Wnw¸ö°ÜqìÍýòOÏ47” Â@‰,™ÆÍ“ s5‹ß ‹¾=6란’i!Ñ$C¢Á4’)ÿf§i–³DBLgpy¦G‘?a/‚Šu]t<½i»Új(œúK¢ŠHÈ.G¥ˆmùÜEcEzd3…´t®ÍbÑ$Ö@2ºßi¸‹)%âü”§ZÒ—ÒÈ/欰Œ“PÄ3EtºÀH£BߨâΡØ9tGl÷ÐkgÙ k½*kû±'±B¯\ŒË Á —I ™Mù²5}¹m¨w!ÿ)%¼õ#'eeEžêRc4ÆëåsñÚy»0‰U!ê9që9i<»#º ¶ÒgÙé- >˜ X?°ˆöAŠ)Ë@EOU:„‘8TähÅÈMÀÏàg‹î®ÏìxžáÐÜ*p=Ò˜%pÉ4ÏÑ%iöŒk:d_tZP¦òÁ´Ä9ƺ±©¯Ò‡ƒæ@ûƒK‹I,uâŒ2ú‹Y°l°§ð= ðm“°óP•‹ÐÚž~Út^`Äoüj3Kê1ٷèRð˜ü 1aubM˜‰ê¤´fIJ¯Ž=a狾ûpg¤¥+Ô4'ý^W%P´0÷äjRä–½1ÓŽà{.×Ȧ'蕜cXóõ·ÔBš‰+– …søÉ øyè„*9Aíës»úè|h†ðc3ô€H’%þËWÜyõò|ßkž{=,z}¾èÕ{A™‰ÀÁV¤¿ålŒîC@äÔˆBxg"·fžE…ÞìUeÃ=*¨~{,©f«Ð/F“e–Iv\XZë¢1?Œ¯Ã¶øzÆ$B#īسú>»=D‚ ‚Œ5^ÇÚ|?|ô¦*š]v¥cb¡;¾f‰~U¢I­Šô@xZ¡Dg1 œ’`î ÖŒ3\l¡¿é´®x½)¼¡-ë}7S .îÊ âHÔ4 ÂÜDqÈËy:—ñ‡,eÀ„o´WèÛ ,‰–A1¼kÕš¶Œ.ìrÐ3ˆ—jˆ¾Åçu¥k=¤ÙtmÍswújÙŽºå†IŒb¨–¼ÛÀìaõ™˜â¦@‹{¤ÚåÀ°|Ýžö[„e4©Šz_iŽi^:¹ üшþñh;66¾’ÅçÎ"ꉺ,ð&g9d&8É&&ƒT‘Ÿær`+ûçãZ0=ª¡8 O1zfãª}¾¡¯5bõ¸)qä“‹´ÎÞxŒôêé],昹žÛ±ÕîŠêjˆûãða~ŒecP©ÖPå3nÇ4]ì O袛&’h [p‹QÈíâ2[Ú{b0â|h¹·µa[Ÿà§*¬ ûÕ±?És' žßQÌÒXî…âÃpçT¨ÿNHÈ,¡Œý? ÒÈÚ@£ÇS€ü3µ7 EK–¹ˆ&–+~!Lç&†ã#yüš‘‡È¦zè4?SàòŽfI(8HéD‘`;;•Kÿ+^ÍgaM9Ûä(X©Ød/bÎÜ;{ë™Å•Iº?dHëò§bâWeG*{6¸JéH>á¦täî}{°V½¶é2Ÿê4Ìë"T¤RR¥DÒ‰X|.•}ªËoêÈÙuñ0Μ'BIOJÆö°ÈYEXñ V"EêpÙc0bèk'ŸêXFŸ@Ôz¯éIîšžä®iÃǰÒ¿d €„&3Aï«—Ën¸)spáóÚ•râ'ÊÊ©M,0ÌNÐ3CY,ŒD‚ã+½«ºUÈäÉêzö( (eÙiñ1+ªc!Ÿ¬©sù\M‡ïWS;o”!2¦ù•³ö¨ŸHœ_2ø-ME³"˜«æ4F{œ¾äÀƒžÌl¹Ä¾y)õr©8yK/<„™Â³øáÆýH‘s Wžy³d×OŽÒË[OD¹òîÑÅÓ(Ãú¦öB•’íwå}ï}ÇåT úÉ3e߸À…$‹0ŸÿpAk3TFšòã„XKÎþå×ßþ_  %˜H¦üûž¾Í”}éãß|äø›OáÐ`iŠ|PâÐÏ6Œÿ`©LX!¡ œŸò6û1Eš˜µL³ ߃¿0Éíòï~ñ3Â"õ endstream endobj 857 0 obj <> stream xÚ­]oä¶ñ½¿bßN‹Üò$’¢$_ =$È(‚ ~j] ²–k+ч#isëþúÎpH‰ÒÒÆ(¼0)r83œoÎî÷]²‹á/Ùe~ñ®jw»Û}ø!Ý%1+âbwwÚ%)+äî€ jwwüwôù´?ðBE®ô8–ÃË>çÑûýAÄ"šž4möûCª¢_u5Õìy™õ4:;Xé;üÊ¢£¾ÙÕËJUv„Îó<²Ø*Øæ*šjò謄Ì*GkKöB»“¾L´ßÔ¶ Š”ÇzÐG¶ÿÏÝßA‡$g©0×»3WPEÔ•­õ''·en—ηS†O•û·¨z´ÐϸV6ôUvGš´%Êå…N.×Åm=MÚ‚ÝGSÿ¨ô@ß_êéiÃΨۺê ‹·98 –¦æJÓS ’BD§¾iz$ûeÄÕÓýžíR¦ÑçŽ`¦§z¤YUŽg’HáÒQŸÊsc±‘„pÿCùÃIîYç’IÒEú‡_-Ìʸ2–â!uÄËq¬;”‚aªß0R^È©€4{àu3j¤ ³œfÁ[›Ô—²}nœ}¬Gn]Ðò!¼(Hc‰ñ7†ïï(ˬ‚F‚•\0. [ÿ¨»º1žFÿ¢á†† —„Æohàv•¯€@Xv]¬ %+ŠL‹Ë}$ï÷«KºþTîÓˆÏ2:ëà’­È±8¹ä«{»D2Ð>^R –&æè',% —ѧ¾§¡„'âhB5dâ:É1`©¤C^0áe-)R´0‹íl¤E‡> KâÎCn-¾'B¤‚Ú5fí"”¯]TYšDŸ§Õ–鳤a|'Ý*°¨pÂÒ¿ŸË¦žœã@?ùÐÛðÙÜí+·¿¹ö+–~çÂîœPÌBBÛ~*ÇM¤¶‚R€»G›kú¡}äyœ2¡@Kwè^ãùåI†b½ÅÞ¡Ø—CµOãȰºÁ»sÜ…zŠhðL0,N(aYè*QІ,b!NIÁ ñuìˆWÙiƒì¤‚Ÿ0ŠT.D‚Ô]N²_A?3ôIåu(&@Qä#É¢ù™¹Q¿ÅX›Íò]§>C5öÑÝhoV_ih?hɘÉb•9:© Êaª«3D÷×ÌWl<‘ü r¬|ø¾¬ð2Ž}4 ÑàÚº$—1§’'s*ãdÎdă)Éñ¸;„)Éã!Ê{8³%¹:—ä%‹èGò5¬÷õæÿE‚L`âîŽW²#ëKáJ‹ØMÄ/›Fk³[D½K:ý…&È5Íô¥ÒÏÍ)DÀÄ«$éRIÂÖ×pµýSíôƒ(y÷>Ù¦|â³p·-)çªÜ²k*©MîþͰúbäÛG²¶`ŸäÅâ^“Kó­8ÍwžðÎá"fyîÛá§@üõÅaÙ}*QM¤~š/°ä­@8Þzg qª_!XœúC°:Í•e<ˆj/5×üä†ÄÊĦ³õ{\ÜBZ¼…‡7KY–Ãc s"ÏÎ –S°þv¶‚Â…Õ›ª –AÒA6Í©ÛkãùŽÖ8^Õ[¾ ñÊ*vAòÂÀWlÝ^³õ1,~–¤ ãÂp(#)ƒ ÉSÑ*#$ëŒ ]•>|Åã‹Såà/Æíу”{/ðùËm‰ £…_;íûpà/˜”o>ç²åÆ{\úZ”œ¹GÔ7„P»ëõCÐaÅqy(ËœøÞ‡í<ÍÞ|ÄñWÄK™ Õ Öeåì㜻Nö5EÃÖ–ÄžE–¯×iÁ÷hX9Xw‹7|>(×R›qÇÀÓÒëx¸×tŒúÂ0/)s‚{?Žyˆ õã“ÉЇ'z.b±Zµ‹®™B‡Ø–¹2§—pˆ™Tb<~Ý…`–:«Å‹".¬ßóüJ#2WѽM\ʰ€@àiňYrèì"=>öÝÑDsCï|©›Û‹Ì0>×,#<1uöb=KÇMÆ‚ÞØ2–KÇ W½jF,7[úmøEý6éš›¸´ôÛÞ5ÎVí5¬iê Ë™T™æÁZŠM - ê³¹í« }Õs³æÑÔ¿y¯î`ò.F]«hÖu¡·$÷B”íÁ•ƒ~« wî‹cÈEǹáa¦¸~{)nªSÈ*JÙ!ÍŠ¥ ´¢“-/VÕ5%[XÜB^ß\%™=¾#¸ifLŸfSäb8³¾®(Î)~”ßÖr°B/H˜èKYMÍËBŒ”ÁÓÂ×ò8‡–V—-j\å&‰[¿Ì[š³ý¶£ùZ'ÏoÌÈ-ËØûËvŠ'÷0ÆLõö‰ƒê¿žŒ!‹Ø6D¬ÃÜèØl÷Ý6Ã8Ão«9>ꦯÔÃèp›ÔÀ5D‰ªœŒøH®ôb\µíöÒ÷@tÎýÃ@nU2ÒÇ`¹u%‰ooC±4_ò-jÖ:ï/碼´  ‡¤þ‡ó¹w!ÚBëÿîÏt9¹vòÿ‡þŸ!Àï:(«ÈÄ¡ú„º]e™«B;ðŸÿò?ktÎ endstream endobj 861 0 obj <> stream xÚ½Y_Û6¿O¡·“ј'R%%m¶HÛ»æ!mö¡Àå€ÓÚÚµYr%;»î§ï g(‹6×ÛÞÁ.@‰Î?3CG¿F2JàOF¹‚ÿ$Zm£¯o¢|›E2eRF7w‘ÌD©£%N˜èfýïøfS/–išÆCs¿Y¨<Þ㫊7U·Æ'ͺ^üçæ_ÀIÊ«2eòË-ÌE"Uü¹IFEC‡rÛzhV4±ê»q_u3ñÍ~Ãk:R£ß훾«Zš›ûNX¡`‹ª„±YjÅ}_lÔ$˜™ÔÕv×òÇþŽÆ=¹@“CÕ"#i2Ö+üÒ {}C.•Åܧ¹€÷¥.D¢¬üw‡Û_`Õb™©,¾éíJ&’©È2KÔwõK¢8J?£!¥¡âÙ%¿*ïõ–†/¿ QŠÌJIæŽÊãËoUz6Ô®Ò×Ä-¼åÅÂýCO4Î8}Í8žeš* ýœ…~&/M*9f«ìš»˜SrÉHŠœõ5¾ÛM{žçW·#p0>µš‡é»Mhñ%EÜõûšžö›jOOG·»ÅRq?ŽÍmëÈ{ëÇÝPL9TÝ}m9— Nò¸éœ0fóÍÛ7¯¦Ç7oi¼ë‡mµ‹¥NMüºZ-”‰7¼ëŒ"à>Mኙt’‹Ï¾\žÃsˆ·ÖÚQÚ·µ[Y8jX+hqˆ¥¥rHô€Sô¥Y!LàǶéêj ÏhÏHŒVÚßÚún¿$ÈÃy„¼—AG¾—™EUšøa74=ÒþÔ«æ}"u=ÒlE´mÏæäq•š½Ð¬X ©ÜCŠ ´zMÎ!fÆއËb2VÍLª‘i8ÀÞXÜDºi‡à‹ïNqiïW+‚(i5¯p7Ž>¶ÚL­S‘Ï€ çñú°bTeÐÛÊúêÁêº?@ /O.¨9Ý|\dೡ©àó+¢…óàû…‡Û^\€áh¹çl ´)&6¡õð$™`XoN¥Ñxrçé3>JaN ÂW¡¤¡ )i‘|²ólKçÇæ™|Ê3kÄÃ"áu2ÞÚòz´oÉìxÒ;¡&<\0Éz¢þ™‰ÿyGy´Ö眱ð}f–d³’¸ß"J8­ª¶¥Ïs`gÊj¨/³N5ŽÐ¬ýäâÁP×wË®¾¯öÍG›Niö}܈Ë­]•âSÍùjS!ñÇʼnÏoõÀì§äLõ$‘Mµ-ÄÚI'Δ‚s^ g¾y¿ (w7U|S³åGfÇÉ‘VÓqRžfN›Øt÷njØ^iJTRRW’(Q¦ß’<…dFìùŸã½™4©"Ûì!Æhd €¡s,u!@{ ÇQÒÖép–¡!EH‡¥,E©žS$}R‘]P‘L‹ÄÐ*fŸJ”›üÉ9±üÂÙL€Ó&’Wdÿ‡pA â§ ùDÆš€™¹½$oÎCßòxÊ&©:ܑ着æC[=üs‡¸¶;Uä†)º_W®Nö¡Âd¾OíÌË5©‰¾¾oø«£ªhèêzÀ’Þ…=]wüô? ÷|Náª4ž<9µæú´WÝ_Þ¨Ì 1,*…¡Ý«WõŽÕ¤# zô GšFÛ2%ó½4ýÔ8PùÅ2O±^‘[ðÒ¢;»´«-ƒ„õŒWšMøñÁ*{¤fjàMý¯‹³sܘ·^$éSýôw¥¬Óç î‘rKµ²-Y{¤rà¼3<0ÍÉÜfÜŠºÓÎu ›ÇbŽgéuvÇ¡ƒ/]òrQ‰qO¶CÃ:«™HÜ™nÞƒ:-uß/{ÆÙ±<ëÑôYl$/M†3 ¤6dA.¤«à>Ö‚Pµ®S!Í'²à¹=xÞ‚Ãÿ¶~óVû ?ñœ{ ÿ¿<çT]uê.b5ÒT=í£ñ¯Ùä …å „BM˜6˜ƒÿ@âÔ£ÿÐê¿Fñ»¡®ºevÚ×t³ íÓ¼³p·®°·ÚÞ¾uYÖÌ5N‘gWNr)’|V(“Ðe´GÛHpoñ®§;›oðÉ^5éèçõý‹p@j¡Ó+¸MyXïœð0PY9]&tE†êM? ’øƒÍSo€O®³›„QKÜÜù ö#ÿtÉWw&e_èÓ¢·iD2„BE"”º(]6Ý]À/ Êw’öi¼­«ÎÝ”ò¤/?óåoܽj×ó¥ç5³‚;¨ÒôÔû‚Ñ$ý-Li µ·…œ‚‹èÛ“æx—¼TÊ–Ü{½‹~äTm ¦.±ž§)¡!ü Tâ²ôë:¢Í£:Ã…sV"m1kÁ´Š¿{óözjðNqËwÇiZbçÊ÷ZD7ÖTƒ öG(­ü:O_1@bûW=ï_áe×V«š×0Å Lp=§éòÚ¿.ñ‚¢¢@Oå¹(È ÒHGþãß~¡‚åG endstream endobj 865 0 obj <> stream xÚ­Ù’Û6ì½_¡·h'kV$un’‡¦“¦é5I»oMgªµi[Yr$핯/@€’h+ÇCgwF$78øÈ ‚?d þ£`}^^ßÿ”2ET×[8^á& ®7‡ë¶é‡²¹PY8\¬T.ÃûjØãJ…¶ßö8TmSÖ´ë«…ëpØ—Á6æ}$ãÆô>áíñˆ‹Ðt´¿±»ö¶ÙðÅ[ú{C7Þ]$IXvUyS’¦í.þ¹þ4ùL¦5E žVÍ–qæZªD£8Aex0eÓϤGº•.”¢•Ô"I˜Øk£@ñ$–:Ü—=.’°ié;W÷¨df•¼t¢Ë™\2•"Êœ` ‚gB»ãª')Jæˆ^º=˜®ZÜwBÈyˆŒ>Àïä<<'ç!œl‚«™ó,!a"ìÁlÈB2ÍEÏ-DžªoÑ*š<©ŭӾ'…½D‚CðŠ\$Ú^ñòñb§ðß–·õ€ WÖ´˜[$‹“v†Îš¶Y5fWÕên.\¨°Àj•d_"œ‰ö“éZ"®[ßÛ³Ž$˜\ÆB¸EÃ4sã~"l Vn´ÏõÞtfÛvl¶q…¾è D&Ã84½!ë–@ø”,L°¶.4âÎ4í¡ð“E©šñÎ Õ»¤7k”á3.ùÙ8+Æw<ÍCy8ÖæLô¹D#›Ø±¹²l^]SòRXföP‰2¡(ˆÜÊÅg£5W˜ã«D%áóô-¥¿—QdI# ¡>™:ǺùâM±ÅyPtÈ8O¥Ò"NÒóË4al;c<å‹@ÆBÇ)W`…;Kñ£H.VRª8|mÓ•5D³Îô¥ŽÂÁìLg!1…%ÝTMÙ=Òš-Ý/Tv¯*„Ö.(!~•w#§8N‘Væ„J@tœbOœì %#€u³1L4´ôu……ÉÛs?Mm/Fï_¶³™¸\ÿÏŒ%ƒBns^†?ØÊ©Î …Ë™Ècý€ÅT-Ø* ‹ÆÒQšú‘V˜Sø]—îV üþþæ--Ž] ªz+‰ ßlGA'Îg¡Ò)ךÉl.ÇúHéu°õ¾¨ÄnÛKW ¥ËîÇRû¹çú`£3ú4ië Gç§;W“Ë“jnš®dï|S)±î˜ñ›Þí*Dá­§ ›fé×uÏ }y`½ ê¸x1›ª~R‘ŠyÇÅB¥˜/¹ˆÈE¹óZ!ri!ÏG?"¥ÚpµÔ¡Ài7Š”Ú,Öý<ª†‚ý¼*‘øê¹œq½ND^XÄâLÆç2>[jE ñ¹¶hÝõàР{E†H©PèWw‘\¨3+Æ‘¢  dšÒ' Åo¿h: ý9¶—Ø*°/T[r‹v¯î;-‘Wônh‘eã÷\di0bŒÏ#ߣÍU~kÛŸ¸cÒ½˜ó¶h¹=L"‘9I—ä(D”òñ d—.9i3QµˆoÝqEî¸òvÏè³d_x7œ Üå(Š<Ÿgù«rŠcÏ©³e3ä£r¯¢e\¸ÌŽº(aü-™ÌÜÓ¢®šñ-¥éæÏ×¼èvœÈSÀ*Ù¨Ž£TdÉD„»ó™HÅ (£3ksH®29—*N™í‘»žq¾ªüý¾š Û9²*óö:dƉÙ0z©ØYÛxÅn¬ï¬¬Ðé‚i» ÕË—Š•Ì‹)=æ¥Ê7žÈTOøUY¾O ˜?£³÷õëÚŽd_¼VMCŸWç—jh«\~<á°ÕÊ&Ã,lñ…Öyj#-ÏNÆN{àþ²ë b}¸d^X8;ÙS+÷tJ=Uê}6XQVáW|{Ù÷0Ømø’–¾SŸï³Ë¼6i¹=òç¯U ’UÆ$Tº8µí¯4NT á’ZŸæB{e¤’ôt:i@«QáZ•…»üºˆ¹ËÓ\ªìÏ ïæ¼QÔɉ:¹ß·¶cÓé4óñ§ï·ܣ܈ʃ¢vM0,¼éöÞ¸{GÚ6(q–¨ð}øG;0o´-‹íD?6l–ÊóÁãÄKw±ZFÔ?æSÿHPë2ø’Ëßo‘nlaCMá{”°XàíGÈ;XŒ^8]Ò ÕПûñØ™»ª½íkîy”ZjqËqNÝ50doÄû‹ÿw¢õâ ç7O´ ” ˆÞ7³Ú7›iɳŸäÂ,úI-õø€} „†^çRxè@Ë”oœ¡Ý¾þ Þ±xiöÀGÐÖdü'c! ÿU$Ü Zœ"M¹yH ÄÍ\ch'G«ðõoo¥U…Ö;²SÉÛ_p¸×&¼ÞÜQÞÙâ…|(sçSz(Œ¥%¡AˆR„ÌùX—k€@¼œ»ðNz„¢ð4óÞy}3Ú*Ë\ÿ,SåÐß}÷lgÇ endstream endobj 870 0 obj <> stream xÚÝWßoÛ6~ß_¡·ÉmÍñ§(i¥ÈÖ Э~0˜b3¶Yòl¹mö×ïÈeʲœ5À^† yÇïî¾»#EGE,¢ðÇ"ÍáŸF‹Mt=‹¾ù.‹˜$B&ÑìÔSFIóåoñ’L¦ŒqßTËÉThßOÍç‰`q½[N~ŸýTdA4³˜"™Œ¦<#B8+³µ,•€å‰ÃòÔaðÖK‰&i±X¸©ÎzÑ„ù_£¥boGՄ븜i}45jŒc“Ƈôî= æ”ÉÒÉT ÿРpcíö n½L!n³óN[·cŽê½Ù滼1(,‹ªåÞgÕQƒóc™f„rQ É–fc0~ËF±x›Ï ³µA(/êÓ'íƒê¶Ì«{œZïûùÄ.DȶßÕeY[ü'\ V”Åߖͺ>¬Öh¡Y»lüÞÂ{E5*y\o›¢®òò…]j0æxÑ‘Û*D¼ovuµ*pµ3ÈKW"E¬åaiPX4íX¡ËW6}٬כÙH7'D˶µoçÏùf[léúÇ7ïßÝüŠSg_û¶¸Üähû­Ù9žeްs€'x¾€“ã[•ulGïôÖ±µŽÝ¼Yç·µÛ™ýÖ5b]-÷ˆ±©Ã}- çdU|tÇ®²ËÔ¥ÒŠ?˜…-ÏÞ ¿|ßNv+ÌeHÙæRf$ÁC}M;‚-î „3’èìÖm›¯Ì¸V‚è¬g‡)ù¨wM S=T¿Q@™ÂM×5ŠfDa1çógp( O¶p¦H¹µ ?›Ï}{±Œ»­?U±)þF6ÐxŒ‡èǼ<˜—'Tà䶨Ξ{MÚix_Ãt§'Þiä‰Fuå56:ÁI¦Âèoã€(7}¢h_”Å¢m“©Ô„êü‡ÃíŸÐG˜«Y}>…)—žœr÷>ˆD$=nІ^{”$¤Â%µTðóñ .ªhÌ)¥H”gŒ¤ ™2·çÎV‘38mazOË(ÇÊHùXŒÅ> stream xÚ­WÛŽÛ6}ïWèQVŠ®–Œ>ÛÍi³‹u€ÙÎ\V­yWP©v ·µVu#¶ )1R˜BEAèÇ€Va¶¼–‚Ÿ'~œ¡Ò øŒ÷yÇ4€ Á¤Y‰YäoxÐóV‡À[™ÒÆŸyI¼z`®¢zQúz/Œý4Õá,v/¢kRáiæE¹K͆UʸÌ]ñ]ýO uº›FhÃ̤B{e Ð̆³ ·Â¬ %xf+0®^T4wS4%i5›`ÌCvª|§hZ…/Ž`ûƒ’#}³*µqŒù™+zêÄ\#ƒÜö C=¶­DCâ\1ÎeˆÉš“ÃUI’ÔÞö‘•}é(¹?#IOèÇ ºÞÑi> stream xÚ­W[oÛ6~߯úR›\IŽl}jÒ&»¤[†xÀ€¦”DYD(Q!)_öëG‰¤,["å´E˜¤Èï;çðÜè¼8¾ã‰?ßYâßsâܹ^9ïný¥ã{Ó+ïÊY¥Ž¿˜Š¹[/ÌUòeâº9*.¾®~›fS±Ék–Å"ÊÑ€#"¿ºê³ëϦa¨‚ÝÀQ°;ã(‹†ýÃrÙ ƒpRRa˜ËÉÓ$)¨0º0cÄ€š‰R.4&Tu4E ‡¿È©ë’Š—?þØen0.Œ-E\±1‚«Æ0ÍŒŸ€Ë*´d¨à Ò‚¦„æ€åÜäìÅ ¿KL ôÃ?KX—‚b Ù«Å‚CmßËP¼gHQXÊGd®I¼.þ°™•×1”—îä”xoó?žc¤üµ(‚J|E|ÐÀH ¨Å®Ï+•cR$̃ð|V°TG ݈s¸ÑžC uœÁøùœh#xsmÊ;%€º™6šÀÁÁà–po¯µF•3?\Ô°µw d‘à ­n{²ç"ròòÔC%~Ç#àíq’¢LäðóÃc/LNÉS a_€Ñy@‚Á,ÛÏcB*\ž"¾ç}£7÷Ÿþ•Ãû‡Qƒ¬ûÜßqw÷ŒRÆEú)?þöùÃ2ôÍŸ·îã‡Õ˜˜¬Çì“R…0Iu¦¢|¬V;uª'_Ÿ2k G…ÁûÁ˜Hø:id:õ6›•¶R6¹By=Ü!sEØ´¼HYs8˜×É Ë'Œ½¦@»Ý7Lòî¶Û÷¸ºñYNÃYÃX{Ül9›D ©õ01'T·.Í)ë±ÌŸVæ†j^Mçí­Uißp2yÿº†c¾³ûœˆàG˜è\Ê) °Â€ÚøŒð)ï£ßJ!ãj£d­J‘©¡–›Â— Q]Ó#¼Wù|\£8Z÷9㬢ÚÉë2œÃB9òÏòçP1sïD5Ž„23­é·0Ý¡è=T›AxçÆ:„§.xÓ`Ñõ¹¿”75®ÅDÀÌ‚ ŒÑ“ç_Ær±ŽÐæ7ƒõàòЀ4GD!½˜ùHGò2+¾RZ´8¹È=½+Öf±fƒ¬ÖÝ–ç,L*+xóùÚü*à‰ˆqæ€&:шVP#«(î¦A€5+ñ³¥ÉÆB*¾‚"†#¤çÅ-Š,D×híß2#Vì,˜]ø’ "Ã*Í2°ÑúnÏTDo ¯›§:G×M%;.åµiü¨Í$ŒCXZ¯\|‰G%÷D·uÆY^*øºçá([×ÁÞÔÏ™ˆç7mĨX[5=ˆ[ø_¥ˆ½Ul‰[¦sJQ´jŒ¿J«1Z»V§ÌF"yŸÖ$¢.üDú÷Ú Y•êCç Þï&íÊš¤è=:Ä2¨Œ6 vSbyF’6ˆt¤èz ±¤^¢KËÄv›©w†GTçi”š¹NÐV¬öÅJ]!ÂN‚pº w¾XL—W ™?õö¿ú€É endstream endobj 883 0 obj <> stream xÚ­X[oÛ6~߯0ö2˜T]-¹»mÚÝ’ÎK<`@ÝJ¢m6’¨PT›ô×ïð&K‘­8ÁР)žóó IOî&îÄî$òàÏ™¤Åäíjòê<ž¸Ž½p“Õ>[b0Ÿ¬²OÓ¿*NhYÏ,?ö§uOoŠS²vÜ U“œêç‹—`JÊ™ïN9f„2KH¸SªçÄoZÓü«b6û¼úcò~¥lp»F¸‘ cË[ØÁBbY%e™p߆UŽœoj€ ½pZ"Þ0”«ÁzJÙ’å뙚a°¨ÜJ –Va¹¾†Zÿ]1¦þ®¡œà’«QAJR4…dxË0> ªbôžˆãS‘´ÃÞ &çàïQèú¡øßÑ…²~þX®çØ^ÏØý—fÑÕ‡¥^~z¶¸Nd{m¶¤ºš‚L×þæ:_HÉñÖÌ~EŒ $ǵ^¤Ÿ ÊIÙЦ–j.·k¡Š~Ó+…Émd¤#]=UÃ4‰—˱hm«ùЃ„¡2Ýé(”ê©–÷ä8HŽNÅ+Ÿhˆ‚Ö|s†Xª=b(9c úiO2Æi1ÓÔmTv¸a¤æ$UÃäA=ß1‚œÞꈕ™zYÑ"‡v ì'T]•Ò§8îö0¢a«7M[R½žHÛà¡qPÕ›FÓ·¡:\;Ä2Åšƒ¸³=ÛÔ,Gé-‡øÜŒÏpÅwƒ”¬1bàéQäy Ã({ ®yõ Ù‹»Úã,óqDFa“çÀ–4Ӹ߈qsoANSS mÊì…I 5L+>²´m«bXô3Sï'i/é1ý5NrãøqÀãœÂÎÎÈw<ÔÏp•£T«Üâ·G‚±oÊ_ê}0= ÷}`}]7…4DŽöñª)äìµ¹†Ú`T“„ä„?˜-$NM0±ek¹OeY~žYÞ\íåF¿ÚÔ[íºP·РùÒ.rRh:s¡£ëHÇ RݰMfõ/¦ÈTé+œ;clmiA!ºT,͹äB®ú©6§”{œˆrÚðú8RAØS0W®ÛV{ƒ‰"„Ú5çÌqÌ”š¼Aí@©õ§(ÎÉ]ƒŸÒ¬W¢Ï|ÑÖžžäb5•€Ác”W[¤3›Ó|Pc, 爓¯-#Z¨+ŊͰ¯ôzIjt )A.ë¼õ«ßam2 £èãž}<·nÞ¬†Í¸=BÈ–¦õóÇíý ,»A¼³’?OÑäKb´ª-Àò\Ç™¢¬ÍO|× ½Å  ^~ý­'eŽøä;›Úþ²t¤Ì[U¿T…îª CGIPÖ#xÐouu yuönN`û~÷æq>ƒ+„8üø¾í¨N©Ôö-&èF=խÇ[ÇòFÍÀ©ï5Ö_ßT}^4ÅPñ÷æ6¢îÓ×ú…mÕý¤k—zvìM¬0íH9ùv/.$ ÍÁHWègeO…¶ø9è ÏžG=En?‰ï; Ûñ{b¶JJo¡Óâ¥,Ÿ-/ßÿ«æ.—ù ß¾æ;~>ßq`/0}Ø^,-<{šï…Ò^èe|ûÞÝ Oà;pm¿'¥éö½Ðöç‡éŽæèŽbEwiºá¥ ’Å çòŒ)¦rTná–)Â÷"±<¦A¢§PyåÌ›Ë_nk½¾RöºâéeO×ÅÇÔËâ;Kw±P²/ñ%£Û×3+‚®4P}7˜ahë?ªT eš7™Ø ÅWR>J¤‹ËåŸ:éàÃHÒotÈZàÇ}Ö!Y¤n1ñîÃÕ›¸zv£>@ã±ÔULŒÖŽRÁÌ71ŽöMKˆšdïr}¢YЉ¦è©Œ@åaÖZ ?ŒöÆ:~¡‰_¨ã›øE2~¡ˆŸ`ìµZsÁPµS¯ÒH¡à#ì¿Òø²[%uMV8 ÿ¨wb2&a¼‡–14õa|Ì9½„T58";V¿û¹ó¹Yþ÷ÿ$@˜2 endstream endobj 887 0 obj <> stream xÚXYsÛ6~ï¯Ðô‰š±h’àÙ<)‰í¸uW’›ÉÔ} )È„‡ RvÜ_ß=Š:<í´-‹½ðí.àÑß#äÁþ( àoTT£÷‹Ñùe0 <7ŽÅh±‚åI†£ÅòOgºÙŒ'Âsd½T?€Šçbü×âWØ“Œ‚ÐMÒÄì‰à#£=?:©ë¼DñØ™7«ndÎËXøNŽÿhÉ+÷­\²Ê뚯nî~3Ú£‘ï¹™—¡v?r³,¤®` $ï‡N·–LÐF¢6y1çû8Šœü‰–Êi#™39[¶¬¶©Ì¢ÜyN|ô<σÔîN©ÚÎîT½ªe­”/°OùrÇ“PdÎmÓI+—wßÄ„ä 7 )$p±E)!ŒÝdh¸Hpj|o›4u³ò:ê¦;•½Ä&׫kVü‹™;còqKkáΦÉP/ª[ó¢I5zT›EUåvÉ¢&)B˜Ãb Ó ´«¦vÉÁ‹Ã.ù¡+ÂØ@(ˆb7át\¸þxâûAèL?<Jg® R™ÈØã4p¤nÁ37Àà~š æôU«§5æ•3å‡ÂÓ‘UTKñÀÒD¸žM¬ÈƒçG§’ºaf’x^‚FSç‘L²+ U5Ãcê²ÐǙϪ=ãï;üÌ!cúù…gFxZɶkXK*³…Oˆëœ²ÔÜj߂ǵ¨‹\ßÀ.âÔ•%ÒŒò’8YΠਟþr隀Óý`Eœ”²-´Úà¿]¾;q:¯ ¨´ø …Ê?­ì˜@pâ¯n4µ4R«F3±ÑrÒè¥Ôª~2;ØX>HW”;»i£•Ýy£ß릔í÷WcˬÞÜ+yÑ5Zý“c4gGÕÊiÛ¶dzæùf£éd~(pÁ0+U« ™ÛŠóº”OZJ®”] ´¿|»ÝºúÏtß@xu+ÿOªÜ™²úÖ£Î5b/ËffΊ}ê°é¼ÃÞåÊ€×lYE‘×,¬e_Ó’—TÇ+€ÄsÌ(Òæ;…ò_Y« okˆ›Yœ=$¤®ŒSÔšÌÚéô_ÝÂa èð7²mIÐW²–šz7|ÜmK( 2颼åß ´kjZðùˆHG7#;U€y‰í„3ìùq[.É4áåαȑ '+yÆ=¦'a4Þ0Ûܰ÷h2NŸY¤0÷S¯èp³ÕŒª†jïal³–JÀ¢Ù=p…1ö\‚0ØÁ%×i8èä˜6”Ânƒ ä6ëÆÌ?ËGIEÇ;^vä<:Œ LšÕ¶„hƒØãA„ܯ׋O_îü1½ýÆ*¾Ž}ßs¦³ÙôvñíÝÁÕÐ@ó„#9rD¯˜{Ð~ªM© óBmWkLŽÓ¨AžÎ$>_ÌûáØÅæ;}}s½øf„4ë¼¼^Ü^Ìç¼ãå¿ÌXbÊw´u†ÿ.®?Üßy‹»ûÙÝ—ù…ËÇ6—òŒÀEdöø‡ÿ(ÔãVJU£MZÊ.Weû$¾¡§ØB¸¶ÓrÉô:G”=ùÃÛB!•™Ìɹ‹fø2ó‰\  UÚpˆiÃÁ.ôáàB^6Ø?‘ÏWdÒuì4, ¬©»ÐÏË@/ô¡¸¡£jϧq‹ì&0íºÓq;@áýv@Jc¸®®Ñù½.áÖ¾—XB¸sn]¸T+ ¥Ê†ª©Ñ´–:ï˜þf*í!æó”OÕ  6€ï™¾r?Ÿ¾q®wÜ *ÕšëRóXS¯ËýÝ%Lœ'ª ¸P±sƒ‚[‚„*X “æÞú̽Öa4‚’Êì2ýH†4j4ýu­ÖîÀ¹¹º»yk$›áû¬è"¤¡m>idÚG·À3¾ˆ°£(±ë»t1©—¦Ïô²Peþ¨Jhj ä•ÍÑ¥e( ÓüIÑk¿†s€ä­EåWKcèÔ”Èé’-²«dë2xï¹ò½äA[l+ÉÇDàÃ5ß4¯`0<¬GžÌÒ6Dš*@Áy¶–§ZktO˜™Ä*ìG=\6Cî¨Á~Ä;_ÄIÝGAó­©57‚Ê2È“^ NåN;J f¨Ú1ax|„°}ÀJóÉïáß©¨ÐÖòÍœ³äþŒ§"Ëê(,º„Âã·âÊæËQÛ¸`eoüdG€°;‡W¯^Ó0÷'”PFà— 9ÆBF„'éaÙ ëÈÉbI2›`è<“ßoýÛ°ŸY§³Ž7”ºéo\I¶&Î^š9/ðl Ø+‘1î!VØÉnÞ5ÇH\ŠÃ‡ìQË ïL!zy~¹õ ¡”lÃö7|J—ô`‰ ƒ·É;þ,S¯… aaF~ÿ&<Ú{£zÿ…09~f=c1È8xöjŸßüW Ù•!ô?Èýƒ7G&n¶u×m~9?yyq ÕJw»*]¹Üžkx(æºXŸóì<¯–;#¨ß¨>S‚ rÓÔ'‰›òŸtü8±Û~ÿé_çüç™ endstream endobj 891 0 obj <> stream xÚ­XYoã8~ß_aì“ ´ݲfžÜé$“sŒíÌL°ÙE¢m":2’œLö×o]tä ÝÀ.:h“Åb±XÇW%þ¸þ¹ƒØƒ?g•ƒ¯‹ÁÙe2pÛ¢Áb Ë#×±çÿ².lo8r]/°Î煉›ogóÇøþ{ñ+l Èé$²ÍKlß§m»Ì#ÏK¬ß‡cÏRM«ëŠ žQèZçõëЋ­F¯ÖColu$ÞsÛñFd&gF½3G¾íøƒ‘ayrÜðˆf®oè‡,n’ŒGžãðÑŽµÐeÝ­étÖjbïïXßR$¾éV'EÁ 3R2¶º–7ÌT«š7¤¨Ü–ÓÇ}É\0êØYÏoªÍýÚ¡)ލÚIÐgÏê"-󟆣0r¬¬ç'®•¾¾6õЋ¬¿u™v ‰ŽUêJ—¨Ê¦d®\­¥x b6¥ì®›\5ºZá̳ÒbU7º[—p×À‰¬eÝ0Ûô—iÖÇRR™öÔKR}d´õí0$mÛ²T]£3aƒ¢/´6ÕÞh c…ö ‚±õÛŒÉ;GÉZ¡Ò¶ãåö¯MÚl7éŠ<Wác|ëœ2¶jY“T·®‰ž·r°£öN_ñBW*Å‹û ¦©WMZ–l"&<ªÄƒ}?/äL‡àQ²§Q8"gÃÏqàR°»4JBri&Æ¥ñÖ¥A8Þu)ŒKqǧi¿q#3’‘~¾® Õ¾|ðlÏ—$æ|‰74.;æNÿz“ X¼i$¸kÅy”ÊJ2Ј~;Z…A&”©îZU,ec#Äy§–hK_KOÓ2ÜpÛpðý´gò“•ïÒNôÑ­²78¶Ê7OÃ/',øPiƾ± ½DtAü½,Ày §Çãä¾+ƒØzGiËk¹b‰EÁްÃLºâuÈó"}æc%A5Ã@tâ%zƒ-äùž…˜J<5܈¼ Vó£ÐRZP„l£_jÝN@y¶+0ºä_>ã‚•–(«bŸ(ÿp]CtP€jéÓÐĤ¹ ,!&Ëîž*'`™ÃÅ ¼Ïpñßb¢o}z=g.L9\`˜‚ÁÚ䤡^ ˆŽw¼kê#€"yÇ“M«–›[ (ñpSÿ¸^ür÷°àÉäö‘Eü1t]èGf³Éíâñç!‚É^£ßñ- Œ^Ç;¥Ë×BSCLÓ ñ°chD~ò pÜ\Ìzþ œK@ðõzz½x¦†e^^/n/æsÞq‰üw3æ˜0ƒÁøq}þ0…á!Î<Ìîïæ6»m®Ô^ppüeÿ0þŒàØÆ?2mã&ÜÚ$åªKuqªR?¢¦ˆ ~ 6-r¯SŒ²·!;1ð2…h1$cµ`ɤ¿e"A?Pé:8 ë Hs"šëà‚¹.l¯ƒ iQSõºÀ;MÝž kB7ÔÄq¬ª&ðw!¹¡è hÔ«y‘ÕBá™wငFÖu•Ù"?t·² aJ«—‚ª–ƒÅ[X.õ’.‚\E-ÅÖÆÖ׺íPìAÄÜLØ—Ž¹tGpåa>9á×{ƒR·üE?\ ­ðRÏ& ^®(+°ÑÌ™€¶AÆ …U0æð‡ò4cÈëÖF¢ô“²Kð†ÒA¼Å”µÜ[ãpÊôê~zªÑÖñMçNãÀ€´ O08øÐBÄIQ9>q×£Î4ß“0ybÑÐaèbÛÑàqÔ²õY¡Yi*ô8ë×â7'6˜~•’ƒŽU‰!!¬«±û¤à}àÌrÎ…6Û”ŠÝd>S „¼¼^MpÜ~3É€HUFàÏÖÐtkÝaf ã"ÛR aÀˆêíÞøSÿ¨ìƒKsÏŸ=舌ÒÒKb1/ ŽùòS:rôj¨˜¹08t!¬nö<ОžÀÐ9 49t©s&ì¢Wüý´:¸fŽEl±Xš#/2÷Š¢N¦¬ ÌÎ~뵕Էý!døåDŽ0‘1Âãñ~Úà9F‘£É'ÆÀÀ±5p¬i…¥fù'¬Ž Z]—F œÉ‰ý&;åeØ'›¸%ê•Ç~ÄúþçÇv©>§"rê*+6¹yÆèAfÐ{ÔVÙ’m-ŸÄdÇañ% 9Ý€ñÊU©¹mÁÖ3ŸÔY-É›u¬êBêÿ7.´Zn°4ÍàNÝÞ{s9€{0ä÷Ì‚>hãÅB^ÄfW2hVü&æî}€Il'c’¶îº×ŸÎÎÞßßmþ\øxÖ¨V¥M¶>k_Ó¦Ugüróy±:úâú±yź°}yr»oÿyÚ}ï±MØFçÒæº6ˆv%vv£8–·57ˆíÈý¼­ü¶æ9N(§Þê—"•™C§Uµ­iº<•Ø®÷?¼Ž#AƒàRX®GüÐãI :uO@ÁžWQˆ¶u7RSf6ºÖù:… û£B¿P?ÇÔù„ÚVž´u!Ïóç”p…°Pé´i€B¨SªAdG݉¾’µËwÍßfH[ƒÖ;-, èU G_Ïï÷Þ¥²"ݘž·€˜¬ä%+Ø‚8ІœC¿ê¬3ÛÓâ£Õ’S²ª}ó{^hÁ]QÛㄟT£±aÿíÿ0¹ñ endstream endobj 896 0 obj <> stream xÚ­Û’ªHò}¿Â8/ƒŠ@âì“mc7³^z•ž³'¶÷¡TvPÀãôìÏofeâ-âlÄFwUy¯¼T&­ß[fË€?³Õ·àßhÅ»ÖSØê½–iècÐ ×îâÂm…É?µIó}ÉÛÿ 4§f:úÀTOw˜@}k[}»´,Ó|ßîÚ†«¥%>=mË ¾Bø'®ûÚ¦ˆö¸¬xÒËÑÖçË×D#Â6*6\¢T9ˆô“$Ú]˱%‰ô´|UEé>Ýoˆ[$™å‡‘Qm•‚e¾®áÔnQAw•Lwac´OÚ]6°´¨,s!9N#07™–ȭ㎓uQ%N‚ LíÃ0팗„ø’9½~Y^IþòÑîêh¯`Ë£Œ¤¦{Ú©©¯‰ í”VÛüXJÁ˪HcÔ¤#¬2š¥û8;&â´ñ™YºKk,WJ@‘n¶Â>4DzIQ@8–è*ú¸=¦u¸ÃÃékIº†]«Þåä_$:WYZnå*IQïÕ±RàÁ"ïØŽéå 2[+y–Ѩ‘Š3‡wô9cŽ´6®Ï®CÛäb&­‚ƒÐ»ºÜ€+%ÏœHNÛ|'‰IŠsÏCŒ‰¼@èúXìÁd~!ÒÆ@º±°Ì;D çÐî:ŽöoWM2ð²Î³,oÃñžÈ³Ì‚£Ø')ú²üYð¾IßpË)9¢•°OÐG­Å¾Sû”¼ÉCÛû¼¯ÈdóC*±ÎùyQÎ4®Vn#t¾®W–™e¸‚¨„×g8•—„@ÑÑ ½Èq]6F×ýS]†ßÛ.Ó¢4‹ViøýSÐø¡ìÄ/ò¥ØP/f^1ƒ£Ò]2k[U‡Ÿ{½Óé¤Ç¥Cå„û³ÔKÞ•½/yTÄÛÞ8/vQ6åp•'eo ÍÐ2ªÎBQž5h™¶ÎlWIXºa I¾n·»¦ —ûŸYººÓþ t‘•GœÎwj©Ôc”›º¥;òjÝÜ ¢œÚ¦n°–âKanCX—!FW¡@/åÜëHmt¿!PÌÁÀùe˜iñ öÝ,?H‘pHöIËûžiÓ¨øÀÃ$ãÅ=×B]µPFÃÁϼŒ‹ô º¤h’åI6µpFôØð=/Äݰñ×SÉ œD•DŒóÝz:y€ ‹¨M•Ž5ôý¡z!Á.‘Ü”ìj[ð(!”2ZsAïP+p)u1U=¸\ ï×´¥{|“„ã&ÙŒoJU± Á¥ðåÝæã*>‹±(D%­>´ÿý=-!®éî‡ê›ïD× ½GùÑ&\sà¥ÑÁÂKJßKˆÒR5èäÄë$<[¬cä«WTwkËü¨ó’燭ýþn_w% q7ˆ{Â1`üPM‰8‡õQ¦a`5…Y?$lógz¸”s7AØâ]$Èÿ0A†[ê‹ûrs/ºæ¾¦ ‡‚šÓ4¡Æ¹¯ý•Ý´üIÔ¯1Å0šE,1æjü‘;¡yÁÓÒÝ!K‰“‡¡-Ä|ŠЦ[¤–Óׂ=¡íszr*xYèrJiüðDl=˜# a!ÛκíÅÅ–g²ei´Êd#º&]ÙyöÅ J¢]´QóMT¤¥ìöÁG "^öXòë.7•¤åµ¹7¾#“îáÆ@O‘qŽ]+ŒÅl©÷8Á©„Hr\€­›9\ìR–;ììLѬ’Ø3nÙ¹ºÔTe—“%M€ œ‚ŸÇÔKüž‘Õ“.8‹Æ6·ÛØõØf«±­ßÛÓû£ÁÍÄÐô²jÛˆët#¾Ø9ö¤³mï^jÙ}m×ó{E+˜ÏˆŒFAÉ_pÌ®\ýWÀ$ú‰ËüHüw¸œ<ÅÉÓâ,JwJ—Hn^žŠ¼z”/T¥-KÚ†÷$®n·Û‡Æ,X¸fo[¦ 6ËRÁvIÞ—ÁˆâfhD,6âî<ÆF™-bš0Ä'ªß ü”ñd³«+§Z{âÕ¼n›Ö„€·Ÿ FNd Õë²d@¼þq´:VÍÏ Lz Ü)íƒ ·D•ƒÎCž¸9pJÇ"–_3íü‚Ñp7J>ëåhpù>“•w‡ÝK#I_é;_‡–2³œf@¶4À¹p’Iù Œd8Ëì²ÏLÎa%¾°\ÅŃÓb:…ƒº¶Xý]yï¢F¥®pN(áHwúÊ"]«¾bEg4ëyã:³®açïeàR˜õ™Î.îâ‹6˜©6q-¦›ƒ&ªê†uÃ÷îzÛ´tÛû?O;.ó”·Ó6RúžW½»cL³©°,G÷,àÓ‡Fd@Ò(²¿ÿå¿ Äó} endstream endobj 900 0 obj <> stream xÚ…YYã¸~ϯðÛÈ@Û­û˜²ÉÎbÍ,¦“E΃Z¢mbtx%ª=FþüÖEJ>‹n@<Šd±øÕéÕo«`åÃ_°ÊBø÷WU»úîyõø)[…ñ6˳Õó¦7E²MãÕsý_ÿµÞDiêý :5” v2ïóôÚèŠÛOºRݨÖÿ{þiõý3o«|[¤)ndù6ÎV› ¶qD›þ{]äžFÝw°GyÑ~/,ð{?M’ßÏ.¶²yë0Û†¸sl£”vþ{\‡¹wôþ€ Ckãd›Ç+¤EšŠÆ?…ѼÓ&Ü&éjcI^ü ªåyA¸ ’c›(½Oë<ö… Ç÷¥ß™u˜y§uXxå MâõSW—.ýÀƒ?vÕÖž’,N‰‹m.§üå`ÌñãããnÜmûaÿø×?”ElÜÖ~ÿ†PÃ?= 4L==â7÷Žë ͶÚUó˜éù[‰±—yeWs£Ö£ôëd“Éþ¯p§–)`¡V#·ûlzÐ2ÒRh¸î‰jjU‡ò2(l/LàÛënÏë5¿&à3ðáÚtIÚdÙõ¸,޼²iz\y"æj+à|…kü‚›e&Û‚6ù<¨²]G÷Ú¨{Ït1?Hÿ|geí€Sgí€Q§0ñäî Ì,ðÈŸ€F @ϼs£v†q4 )û鯻èâºÞ”P~Õ]-ÇÑKÀÐ WöÃ×qëäxu¥Â;r†FÛÈXaYÈ—,À<³ Ë4CY]‘XŠ_Ç®?/­Õ¨÷a¨ƒ0jʯô‚²½{Ò=ógºÐ4pÅY÷­,ï…ÛËxï}O"5 Œ‹jä3ËÛõ& Bï»3W`¸ÚC9"nã8Ÿ×&¨a1‹ l;L`1A_ÞQu5J‚¸èyf?•C)³Âà|q칋ǢÃ8È¿Ñ~§¬À;göÎØ½Fî[­Fã<òáfJþ‡~?”íÿIÄÐoç—âq"yø6üT[jÚ+çGâÖG¹€!Ëpx˜åGY:Àb)y[h°–‡ÉBËaÔi9´g-‡_¢3°ma*X…Æõåÿ ш ¦Ëã±C fì…#ù2β·(Œ[¸òÄ UŽª¾½·˜dkœJÁÀ«ÝÍ•ªr2‡žd'™÷–𮲛,»uÌDÈ5Û¤SûëÜÃ&, fUa;÷Fô^…§J¼ªï“|‘FÐåû7†Oó³Å&b»°1¨v3°”Øö=¡•¹8ᢀ›ý“.ƒ32 c‘{?ÍæÔ·6ÎæÝ7H,¹„U‹Æž¨VŒÐ, ·Ø¹OLp(‘ú ¯,KÃ@7ÇXpß ‡}羡ÍN#µ"Ó{ '¼Xï“Z3:ìeJ¼i’œ¬wwØ>éñð²&Ðåh·éxGy,¡kô%"ðJÃ:môl£ú—-µ+Ù‘{l bŽï;ƒ›QBµI£ppY»¦¸É0õì´°ÇN ·´›ã1êŒëñæAÂ!„™Ô½2ïHN"óÅaƒl8o)$ân`W 8•Ä.cSxegiSŽuÒb°u-›È›G›‘9Ãxæ™Óåz-)ÛŒìÀ]ÐþC¬[ÓÛì‰2k¸#ë&"ÉQ°ÁÑ)6>?qÃÙ[ì,‚¯(]°Àý“6ÙÏé}ÏS£QÇñ#Š-'¼¬™ æˆÛ6kå]ÙUÂJªêÌ,æ7)㿟½x!‡Zþâ'µÑ2lQìÓ2WÞë7å._9ôµ·ºØ™¡Õ£¡bÉ­¶øçñ9Ì«x„,=ïNÎåì<àk£Zq'Ý4W5¬™ÄšèI©Jß©~mºeq+BµÙñ FLˆ¹·¼ë; ýÒ·®.ó¦9-B[­ ïVkB޶8q„•ô†²®‚-ÆKbÀ¢áô:[€qœ:n¸xÂ= ²óq„u¦zjY—Ê®êRp–®…MùÃ;H-Þ´?\@ SR9íÊÊ€#ÄîQTq“Ÿ^ýÌ6)âºNí°¼ÐŠ†[Ÿeº«úöñ–iÄšâ Kª«Â]6r‘4Û7 ˜•%w1Ò-òÉ´¸LL0¨¦c2ÿž–&pËg7_Я/¶Ávˆ±ž¿à—Á¡Uæ¼e‘Õä¨2·?Cå¶@›‹UÌó{…) '(ÀìžKs›ã4Hj×£¿:& ûÓS.èÍgU¡f)“u/äÂp–°„°çïœÅ÷ºf"©SKùÖV 1·p®ÑDS]Ñ›üàJžXK¤q-t=KþØ:h¸À&Pòl˜²ÍE{_êÎ0ª(Ø«Áº@x¡’g´2å@h”â§-ñw‹Â ¿1¯I´¾µõ0Ɔ 913ïÙ/[¤Z€ÐU£îÇHÓx­ƒR™¹TÁY¨¹}·A9½WÀ𑧏Iü\U 4¬Öf¶RöŒ\zîú:CÙ]ÂËØ´*3e»Þ*ÖöâÇßdñ‹f&Û<\mÒ,Ûæü›fù–ü—?ý^XŸ endstream endobj 903 0 obj <> stream xÚÙrã¸ñ=_áòKè*ÛËS¤gÏLjwv“qž¢<À$$!æ¡åa¯÷ëÓ' ZòdÊ®"ŽF7Ðèºúý*º á/ºÊcø¯ÊæêÛ‡«o~,®¢ð~n¯ö0}‡ÍÕCõïàá‡þòùæ.)’àçï¹ñݯŸ¾ÿøðñ×OŸoþóðw„£ûmLðáýÍ]EÁ÷vFiëF×µÃ=Á}óc”_€xƒT¢ì~›%úàÊÝîáè ÆÁÏ®´í`¯±—½ÝÛ^fÆŽÇžoâ"€Q@Ï w{;ZøéÓ¿xä'ÛÚÞÔ<úÛôX»rEì^ãoé»î„„^{w8ÞÄÛ`¼æ5¦d#5­ì­Dàܾ«Ýí磠68ý2po<š‘Q˜Ó©~]¯ƒý÷Ü|rm%øpIð‚H»þi¸åña*qä({èÁ6®ìÚj*ÇNp5fx.ôùoãà·¾;ô¦¹æž²Û¸7üš–X‚èüÌæ±¶<õ‚°KîÕÌåŠqLm…ç#´tëØš/â.MÃࣇò–Ë&u…©ªÞ3V#ûÝ+Ñž®ù¬w*l³XïvBÌz£mÅ<Úíz[º“³tÌQç#§ÆÎ#БkM¸÷ìª dB®I¸ÝõÓº?§gRÿpSd06Ý@¹!•Û¿^ãØ60üYx‰€"sYÒ¥ @)‚ʽ}ß5ܽžÊœF^bêz=w2½L¡€áiÏ9]×ΛBè½ޤ8ÖÛß'×»öàíÇ—‹w.âÄœì7 .£@gñ,þYˆjÒjËr£1ODÛ¤ðU û‡)GnÎ,£LåEð (@j¦zœ±¨Bá½mIºp E‹ðóÇ»"´o:ëY£kÆ¡ûš7mM_;8”êp #ø´Uvb¢çi:îv†„ [1³©S4­7÷ŽÜ}PŒe‡€ÏxG¶WÜJVe±qÖ-–I£6Ÿs,›’µR˜õöØÎÇ¥iß ,¬Ö¬;›r껓9˜½Fº)Hsà³p{rl’æÀ·’¯˜50G$ÀóÎÊsn”5`³oYøq²›dü\Š „HOuÅè@lñЖ{¯<ÉÊÍÑ ¶®GY‹öÜôŽÜE‘‚Uds‹í=q8âÚ=ê¡mÄ‚ñ´X\l¢¿qå²ò\W9Y¼TÉm ŠUÚ“ÌØ?l9‰ö A¦«ƒ¾Q´Íi•¨îŽ$¥ ‡ZìHïÂÓcG¾aèØ0øìì · – ÁHa)8fä[/aÙÄYðqž·Ü˜Õu qœ ðÔÄ‚G„T ®‰[JFäa‹®¯i 'µÓ÷DyÅíùé/§ƒFóU"?Ýz£±§79Ý5Ädn´ï‘¼L6KØì¨™ùQíUÙÃÚ6§yÿ›êV "Úi$Õ‚ÏÝÔ‹°º€·•ýªªç­€ƒ Á^)nƒAì“`­KákA\Ì> 'FÅw¢Ô—"bAÐ0ÞŽÌ^ž ¸fJàš9èY¢ˆA°t áFLQL…ìâˆÿZLdb }x5æ²ÕóâsÓª"Á¶]{§\Á‹áCœ9Ÿ¯Jò¶öy4’£ƒ¾|_3ÌDl5ì‹Iòp޼|üäñ¼°nmJG5˜VÄ+.0Yé>ΡHÄqK„Bw€ü[Atýð9©Á¡8“¬FŒ¡FÌŠ°- /!oñC±>,il ’”Kv„9z×{ àاœjÓ«© ¼§áM„i“9XÙL×ZÝ 1‰‹My£KÎÍH%tšîRÀ]Y6´u‡ÛÌ)µ%³PðÐ"ÌvÀH@¢[z/Ƥ2ÕT>¿dO°÷³{ì Æ²×ܧª cË_N/8ˆN½`/Öha^2'm·’=±@¥¼ÑV[ ®bÁ…¶1MSÊqòØÕövIõdóA¿M7¼TÒ¦Ó±Ì89‰1‚ëã8U%Œ¥V #'®t=Qöp`vǬ›ðùŰ9 qèï ö$í4Î!çº )gˆ—£›@œ°TÄF½^Z¼ƒùFadM-yZ>Ç`+YÚȪ¸!WíY®îw-J$¶ØäE’ðØ4Xdë©u W–:” š°p  þ–±/[.dË9mË‚ °lÀ5§ÚË’qÊðg±s÷qíÇã|«V>òx}žÉ’K=2°•9’{ɳ‹©#Lsú“‰Aã¤5ëP¥ÉFƒ7”98¿gÒ$ãÇY•¨u^AG4$é0­æ %š5&É…ûç×qŠB…rÁ”7 eb0a¦X[…%"!´vN îrHL~¼á*î»fÐÃQXº .êw¸¤xi{î­Ü+WÞë1`¿Öf˜[%–b*†j}/ íÕ:6+¡D8¢’$›'ýÁñ‹|v¶aá ì²nCc8~E 1§Qä)VNhT¯­i\)¢b1¤e‡'Ãô¸H|jê®ê8¡Dþ¸r•jx$€ÛîÐêÎH£ÃBíìW×½äRœƒk¸#•—ÕP•¡u¥Yª¬êؤ¶'†$¥ÛÍfï¾¼¯.eUk[­2°ÞÒ«·Ï¥T«;~uUÊÙË],´SÖqÒ*0.þŒjhð½ÒI¹‹l`/@¥‚Wšò«Ÿpëq$ÄÒ3>R:.âäÁbP¯Q~ßÑ3é©­]ãf¢o^c}“·• j±¤[õ½Xž»»ÒŠ;Ž!Z™Ÿ¢Á?¦Rz„ánOèp±ÍJ‰- Ôrò#úœ=¶Ç–yõĊTkà3¨V¹°-¿›Йo´γ1¶Úów\ï“ábäñ¬²ãLW‚~.ìßž‡w1ŒnœFr«1ÕÛÒ8>ßq‡~±Ù&rÙ=oš0PxôÔvHó¥¶ÕAq/Ø|MÃ>Å,€lo\Ï­IQv2 å h¢³ãGåz>ˆ`Äe Xã¿Yðˆ0üL*Ê·¿ Ózºl>~xàßÖež1Šã쾈¯î6y~_l¹žG þ¿üהŚ endstream endobj 906 0 obj <> stream xÚ•ZIsãÆ¾çW¨|¨J’±ã“3‰«œ;N¬Ä•ŠrhM²3 @cYÿ>om4Hjl×L ½/oýÞkÞü|“ÜÄð/¹)SøßÔÇ›?=Þ|ùMRÞTÛ¢¸yÜÝ$›‡m~sŸÄÐpóØü'ú÷mµ‰úùö>OòèhnÓ*zÕÊG¬Ù;¨fi4Ì·›®ÁÂ&: ýÉìÍd¹Z÷8üÍ,É¢—Û´ŒúáãÈs§ƒ™¸ôJ3jz^¢ë']«[{½­ŠHNñâ¦C?Ë0ªq“뻑g²LÛw{9«ô¼âBý<Üþ÷ñ¯pûs"´®¶Ý÷H·yÔO;¼8­öhî€×áwíú¡¶°v#sºIºÍˆ‚%R+g·6M[¡6TÂêÔ'ýŽÜm\ûÖrßiNP‚ŽÒÒïxÌúÉ!=dò‘KÊ]¢HãØÓZ{Š“¼6BßlGö—ºG÷ Ok[¸PVmù`Ù6Q#£â$ÒV>Bcy¼g- Á†H€ÇÉ“€æy’05°p©àñv¥à±H^ôZ¼ùÄ5ÖöDÔ5 Īb±Â#ô_‡5—ZŸI4íÁ´;d;”箱õ¡lÂËbµ’z´D‰[]ƒr>OUŒò EìàžÝ¤í¨Kؾú#· a©Õtb ²w=±hC‰  ~g&‚ô’Óš^d Æod]‚•ànàâ`[VÕƒ;ñH‘gèÂ<Ð5ÕøÑ¯úÞ‹ìÖ‹l¾QÂfyÞDŒ·×n¨çã8™®æ»‘“/Û# ¢›ä",²PVgmÃåsŽ'€…ý\d<¯%|AË[Ñó3[n94mݳòU@É¿Ðu›¯¸uTQÁJ3ÙÔDŠ(ßA7,Üw4Ã+Z~¦ê—ßT7¸[¼E/ ¢”&iE[g¨ x? ý„ÛÐY«,úçÆý—?Ø=1Öûò?µÃm«4úæì9 Ô¾în³8šÜý{¢ý-¸ÄOøÇvøWîã>\ãEw xø ̶¼tMبú͵ñÀ– ŠÂ¬€³°öÈ3ªèd†‰K$èð5O±àQ2${nš •]ßö{WYþhÍ8²¼J ¯Å™Ó À<·2®%w÷»¹EÖ¶jê.¥¢ùÙ{—.BE¸…«iá´ˆ’„éF©Ê,4üôí㦵ýåÓ`Á|È‘qÙ¦?±TãrÏMc®ÿ‹l%(4ÈîÛmq‡ÅŠÝ*4îèZ#Gm t¼Ðro¥Î,|á-< ñ`Çip* ì¬Ë‹ïè^'Ôf³÷S`³„Iã–姃ÅéE8à¢` ¬‚öÊm†Ç]Š ô©" Êt½õÇ3d)o­ ÒŠbÁÚ'X6 ìÃx¢-ì×õì9Çg¨Sˆ…Èn¹–]èV²¼!u´á"D8ÀɲSb~‘+"2Ôô,JÉgn²¸¸ˆ(ËZÌEèì/v¨˜Ièc-ÙÆ„b_(¾Ò‚o "ÎçÚ‘) {É”óûx à¹˜¯Ý] %ùf„f k¾5n¬[ãŽÜµpºÓ`E |=mA9&.örÖÁÈ0ldyè2\d»Ë…¬ÉÛ¨†G· ëDÛa€äl Q„Ó²ê%ø”Þ‰³™Ñ9Ü]à ý ¾ß ‚ÐâºxÇ*ò *”éùëEý·+þ5Q¿°W½`IÌÅ "ÚÏÄNKÐø«¡—³Ã3páÈ.ñ=!¦ßäÀ| ‹æÁG`X¹05e¦V·*³œ•ÎJ ³°Üö~0GbL‰Q× ¡ŸÎ#á"4Vr°‰Í z/ÑÐÖvñw%Âdk•pÈ€Ó¼Gƒ¹àEÝ|”Ò”>¤)‹^·*^wò˜B„ñä깟GÔ€ºC8MÜQNVûN¤ÆW1Ã×µB¼âIs1{tZtY‹.Bð ¬ÉW0'ÑG¢†=q—販e( \ŠçŒ—º‚¸'©'>2KÂÈ,©Ä¸$!rHJX¼»WÓpt£FÜ©à'5LûDB¼î\×ý mb¡´ H¨”2ùt"¼‹‡ëõr¬ZŒ%z0ÔD¢à ‰-åÒZ¶ (VA… i?žGÛ‘¤z->‹IØwƒa•Ç?¯‚‡™h0a¿†Á³Â‡ÚÎtÞ‰ÀrF쉔pca´,ÌÁópªf®ÈRU½7ÐÅ’¹JÓ s–[3ì-×ý­ó•ÊÕÔžq¸ ß®çoÐÅq,Ì%- ÀC+/ZjdˆÃåKÓ7’WJÕ‹áÞ`áézòâr®q> h¦ðÄé%ëðL×íÂIÂ5è;u FêÖþj³ù¼ñþŽ€8RξdÑj(!¦ë>"Ðþ= x›%aNM,zÂ7á\£zi˜õlFÖÜŒav¢‚•ä*Xw¬ÐD¥;{+†ùËžG e¦!s-sp$>äËrëÝ\w¶0äøV|¢¨[i™g‹áતÕ÷É‹Å,nå,ÎüKž¹ŽŠ‘Þ½ÄÄÖN+[°²<£?£Fò¼®»æé–'=ê™æaÎk”0ÂZ ’þê|t>óÊ .¾ ‰™VJ0‹¸íE\suËd"ÓçÔ8Ÿd±Ÿn7cpˆ x¿o§ýŸñŽ)D¥œ±ÝwÄæåŽX“;bñìŽé¶\îˆËø;b…ïˆÓÜÄ-nä:–u[ENxŠù°ä½ ¤bK»\%eh9ÄëâÈâJÞJÌ×ÕÅ !žÝ`+F®ù2ž u8¥RÒ»îšx ÷ì>=-€· |+û-d!òoø›ù‰™EŸðÇÊÂE¬ù‡„UâTã”Áò¨  Åü#?RÅÏË¡oíev“¹†¥«MzÍo²‘D ëŒÁJšóÏ9›9Kì x6àlQÅÂÙKp¸|:¹„RêƒKGŠŒÀÆÓ³ÎFqÏA€¥Åm'Å*Õƒã’Ü-oÑ„†EÕè¦hi‡Bn\*S*&3·ñ…ËÏGfkó«Øä w#0 㘠_öfhZ «dMwü=ôš¡b #IUC™.ZƒÀËÇÛ \goÊtÆ^sò>å*À²ˆO¾ W±q’Î6\@´+_™ß …äJÂ:M+!ð(P[Ÿgñ#š5mX¹U­%› üÿD÷m]C„O4qÍþå`ê’/Z`Œ;lH8"ƒÞö¿¡ò ©<ÜêÛYzª"H‹æ ÅRahí²ƒá,'%¥pÆóX*}îbØ06@® À¾eÂàà¹jO­‡·°É׫  ${ŒÅïÙ†Œßl*’6MuKØ+ºàB×¹ Ä(_P“êü‚8b}-nÓØLÞ° …ÙŽ ᥰgu)lД8 –KQ 4 Ó!É&ÌOã²eÌWêNgñ9ú†òhÃGºŒ,û7ákTÔž]+™¢¼`µÎ B ø¹|!+Ò@µ¨Ææ ‹aQET£0¡@Ýh¬©PR¿'k–þñs›†ï‡ØMæWàu(h6{åÕˆúÍ„Iöë@iÉQŸ×cïĄƗÙZqnUèÜôÝÈùfÔÊ›?9)ìè£K‰+HÈŠ`Ë’~¦ìÃúÀ˜‘tèJ[Œå=ðäQ8:V§¾nX?7šK¡ vöí|¤`†½¥ñÿÔfo¹B¡ç.§Á”Üdµ$vò8æœm… ¯mõµÚÈÀ§'³ß£û˜ìÜâvúž-»¬ÄØ)abt’•;έ¾5U—‹Wì;¹ Bß™ D5œ—ì|5±Zh"£ t{¹B®ã4ë^­SÍ…Po™¿ºÌ»Ño\^ýÛŽ ‰š™1+‰ÁYy%›…ökNfý*¹ÚpÈFf1SÓ„+›™qæ“WY °B„ÏJŸI šøêx\ñÅP$²¾„æÏô«©ÚâóÑþ÷}w¿÷>P‚!¤õ;#{€}K®6Û\æj3~ÊŠ+ÏBYBÏ‚"êAbKü_'˜}>^ÎJ±8R£•…H…œ= šÒšË¹H¡¾¹ʯCél£Î/ ¿p&†Ò×ííEj# Ž’ëx?XÓÈ£' yßò&C*â£_Ï#z³–È,»’%øL–î΃4×Ù0æÏ–˜…?õãï½ÞŸ±:×|VäŸyybÕuéÕvç‘e¿ÁR&ƒSöYt"cô:ò Fž¤’ÊÙb*gâ1O0 Bãü¯Èøs¢Œö27;3óØÂfþéöî còøx2ÓÇMÿLW讲̘g)ŒÁ ù]¥—wVÃÕfD> ²¾rVläò 8³?šÁ‘})Joõ ÉøÃÝ䤸‰ñÝ_ZTÉÀv{û zÖ`úýÙoäЯ{€q& qøâ‚Uæ.Ybn8…Ê‹B² 6ÖìÄg3QˆÏE!ç–«¹ç¢ÿ>QHÄ=û´ úaà€¿Ÿé¸_rè“1>cÑïÊ\Ãä÷€'þbògâ‰Óa°–[ÉYÿ*L5ç“®WKuµ” ­ÖsÂ)“– ¥†»û´5ŽO$#X‡D§—^8Ë?ÅüË#ÿDuø¢4Ý> stream xÚ•َܸñ=_1ð“˜ñªÙºúÑdÄÙ 2yàHìÅ:::<î|}ꤨnõ" ·X,‹dݤïþ}·»‹áÏî.7ð7¾+Û»Ÿî~øi—ßYv÷t„îÇ] »§êÑ8ŸN÷¦ˆúaºÜïöѱðÃDÓ›Ðiè §šK´pÍÑÔó ×úÛ½É#‡­]d;lœïÍ!ê;Çïo‚Šó|þÕ9OпÜ?¦yô/Ç3š¨ì ½’~Wª0úížïlùÄý‘;…¸‰~߃eþ®ª»×û>ýq½1¿öóP"þ>‘-Ù§‘mþ`Rð1öÇévâ×hPwh;H]V¾ê‘a…€ñ ÿqƒ«¸^t@uzcÔ$ú¹.]7:Üû}K`¨e:Õ<Ø—F'~Czç±.mÃX­«ê¹•)çqê[;ÔÍùz摘HtýðÁ«ÍÃÕ&´Z˜crC‰¿o¶{%Ε¥$%Öó4Ô´§ézµ½’é¸ïŒt`ÿ>8;ö, Úe?NŒG‹dƒE6gÑ~»Xhñ€i€ì !Ñü† qçM `ê’ +â¡Ì’9Ù² f0©ÀLv"^¯PÁ#¸6 qúVóOç 뇯”XÑž‚„ ‘{î/±óͯî#­l—~<$°:úÁÕ•È~²ßOÝ"wg„Åp¢Uý­®f”™dOúT£Š">n ÂhQU•±Å8póT•1­§FçÅs]Ñ{êirCûçx·ÇEbî.Q›åº’!~ì Í~ÔåÃá¦z„Q‡4zb±HQÁAŒ;;Õ¼ \:›ÞK?éûŽ$¿hÕeiÇÄ•1ÍÀ f×weß¶ &5õI„B['(Y@¬>òï'ìgl &”NìkÅ–,œ|e/ÔrW‚ÍBR4³œˆ u"ã¼çŒSw^Ìû¡b˜RØ…—æ¬{ÁÊ^nÈ[Eêg,o^óÆËˆó‹e %lzs§Ê&+ôy=„oQ"„òOåÆú–6f<5¶šÏÑë'.#IÁ‘‚~X°(Ôóýƒ8:6£BŠˆîß3œ|ãØ0^‰ ƒò›¶ôK‚l̦¥HÌb)Of5h´­|½#··µÌ † ýüúvcÀ^÷hJ𷞎óÀ¾¡]yÌIô÷û"%ÅY:‡û‹ôº~º¼÷†}dŒÂ\ƒUá-Fæ~ó K/oi7Á_ BÜô )EºoÒ»–/šI 4é>ú|\ˆ½ ˆùù îˆvqI{[IÚ2ö‹ðC&>M<ÙÄ£CyË•§,Ûv#÷û£[«,1™Õ|mÆCМG±æ¹¤@Î Sÿ(+[ZÇÁvc[MÀv'Iq!É8©—dlԻ„šì`’‘Û"x4ÇŠgÞmoµ’f YvÙ¶H‚·E€Ã X®º’±{bC-N$àCÌ”ÐÈÔ¯²Úæ¢r™W×=jzšAæJánb„NFHb^‹ásWqò˜¯èʪ‡ÿ ˜Ë аa,ˆØôfŠ krQZ„†Þç<àï3âQpGÙµ7Q#ð×}/›™[èà—ŸoëDþk@Û 1˼þz'×Þ8ùŸë—Ágôó(²›çtCôö……W”¸Sò\%’ûÉÑÚ€Ò€Eä ùN²>|½}> DÄÏÏIòáûKu@ÇòØ¥õÂõü´J˜ç–1ÖéûTÆíw­Á3­³ÐÖªÁ'H‡kìR'Š m# ¡×\u Æ]¾·™Tž“|çìøE?”8MùÀ ÔѶµÏ@(‡ä·(¼õ9̓øHî”22BM5F4K{?O† ý&…ÛÊ‹R=á£RQéuŒÂQ‹A|ò†ßÀ#2qT‘ qMsb(Z¢ÏG¡•ƒ$’~1³¨`NÍaÌãwr¤©È`‰†Ùé\ “5úùe:Π[*b!îøFu"üôj Ðʾañ¯dÊŽÖ§D½° fäjé¾BDq…àɾˆ~¢|À©(ª3ENV]Τ½Z.B4™dn¢ñÜoéÈj@GÑ“®êƒ’>’·Áï©ç_!È"~ârNÔ eLÉ„2)þØÚŽÌã4‹1Ž9ìÙèÖ•J4V1úö% QÙ^ÂÇ8Ùi™äUçj =“q!:CHÏ,CV¹öà)S©t*½pkˆnÊi¦Þ*ΑB漃I"ñ]¬K‰ÁB¨'É^c¦œqa×LÕD$Ç1t…{ ’–ƒ»øÄȺÌ`¹èÎ5:@Â3A|ª|QÔ”CÑ«u_Rtë# 'ŸØöN5E ‹W\Èw°´5Ó …ô ¬Î<.l#D¶Í„Ó4ÍR3!QøàN àKn’h ‚“p]GƒYÄ„+)…Óë%¶k·§eÈy¼xÇîï çøüü¹ƒÍi5±EæÃE sÊV¹àc„ñ¤ðõe}„Q„NP€»—B\ªgVº "~…Ú‡ú?ž£Cô•CÆ`“†`Že·ƒ“zYª{¢¡|Å5" ct'´zJÝ&}på<9Fie…t::^Ò¤Q2@@£Ý¹Øoí¡O#›%ÉA¼¯øõe-ÎÑÊ•Ÿá’¯+y x„Nø’x¹P¼6"ܧÙ>ŽžHïãx½¥H§Å f,ºc÷8#Y)Èd?àW³9Äç…R¯Ò”rû„nÔ‰¬€sG¡·çˆY¿¡ûªË ]Gë‹¢ ‘Ô(ÔÈíèÕÇñÊ5FÅq)†ýr»q”^×?ûƱnM_J+ªjÖgWª”BÇ›æ­2Æ ¼µÕ­‚=V¦L±[rnSÄ׌`É‹š‹¼£XÕå±¹H)Ž’”;ø–>3BpÝ‘çOÄeó.¬@0@Œ¬X¢IØižÑ]³Üf¥À¯/k'N8]¥¼¹p¹ÊÉ}Ö£Uù™Èu4õ¡RÔ*c³’HaâmË%£«å7ÉMžkÂÞ¬~}«p%§‘3ÞozZ¼ü ûàg/r²Z[Ý0 $A 'ä¶"eÉ“/J­ âZWìɦ¹ž|‰¼A•;á˜ïWwTœúÎiyŒªÑ x娱3ÿò ®oUák·ÞiâjäÍסϋp•ÔܳeMÿ×Ô {±à‹½„¯ &P ÌÙ"þRL<¼iO¶«™Z±ÜP,… ÌLBçËod?rìóã<1……‰‹²wW,n¼^/gãDŸ§¥¬à‹$uþÆ<+ÂjmޤŒê|É8(ÚŠ¦h©£{,•ŽÜz!ö V]4r½ð»¸^Àº6áÙE‡„&<“ûí¬Ð¹rõŸÙ…†\×P—:¡ûnÛS£·¸:™°&e• µÊ{]‚ºœZŒõ/8øÏz¾¿a±É£š$[#•ØM¡‰Iòõe&b¯…Q>‡Q &;"Já…ö˜\ŒæÄNnv¬åžµTëòz-²am¹æ1„pœ ƒ%¿/âYŸtÓé@f<3ÕÊNMµ8œïMè¬öF# üâ#3fudÆlš1~ºð<)I×Û­îÊf^°+Ìi‘H³v^÷>” ®]É!§ª7æÔ´üVƒÍ«ØipzXVC†ÄDŸä^ûè$ìÚàçê)Òñ7Eȉ7nˆ^9¶ḵ2#yëa½ÇÝGÓ蚣 Y4áÛI,âhy*¹m9˜BÕ~K¾—t?¸‡ªÕ0ð G±£ë'™Üìf¨i}#‚ŽæFaÂÜ' úF:JSKÒš®ö¡2^ý¿¶Òkæní§"iðT$Ýôiòà†–®‡ aÊ”¤«k…ÿ¤~³àÒ?õAïòŒ& Ü$47™„wŽI*ôðFp;xcŽðš3Så†HŠf—öI2ZɉÌjÒHs¬HòªGxÍ3~Ô€´Ðü«'ÕÅcÿÆS.‰£y BKÆjµa¡Ï‚.\-Æu6ã³*ô%ËÕxb$GÙGrü®”j–ŠÆQL¡¤"êྒ/®ÇæîdÉÐ|’êýàìòòHõN›ª©Èë?wÈl|7ƒf÷ñ`ˆó/!JûTUõTs%{_죧ûäÔC;*…ðÕáFIb5Þ¾R-—^ã¾`çë!ÎÁÚQ/ÝÙä’š0D2ªÓëd#Œ®àKÑq·¿Ë6h¿òþºmq'½6zß²÷é(n¸ByÚ–É ÄÌpFŽ€UšÈÒ^&ë½ÌÌÕ^0T– _VIc¨ö‡7“h™^«@v¦Öà ^Ûr§”ª¼ÀÈÜéí­Ü±Òìô„d+Ï8óC¦w©ƒð¤à(¥Is=ø ^1fòº"Uƒ÷}ZN5õvQdBÞ†m = ¨å!•Æôi¾Þ h7äîÞéé×ß{ V¸ÿ©¿4]öÿÚyqŒMeêN¿Ø[øä²l°Ðô²ÿêLí´”Úµµ¾Ÿ/7ØÃ×;ækÈÉñÄÅ’¾ãîðubq­Q2éË<)ª †B0¹õ„§•àŒÆk¿¸Ÿ¡ÓâˆW¥ÄxOamë¼eÉ›>ÌËú @_ À‹Ýðž£heï‚T'Þ]ÔfµK%b‹«|Ag°P®òí|HúÀYm0Q¼¾—ý|åf`hÒ¢%šä6˜A¦î> stream xÚ•Z[oì¶~ï¯0ú$ÇŽVw5O§M‚´Hƒ6ðKQ÷AÖr½l´ÒI{ç×wf¾!Eí%'… ˆ’Crî3Ü»Ow›»˜þ6weBÿñ]{¸ûóÓÝWßmÊ»ê±.Š»§ ?lbêÜ=mÿ½ím{ŸTÑþþ!Í’èÛà }ýÏ÷I@†‘¿iÔ6=¯–†K o¢æx‡ãh›Ùè¼áÈ(ÞGûºçÆŒyÇûÆ9ì4Ù¡¼ÿÏÓßî6ùcÑÑäÃGûq˜yÍ›÷ÓÜô[Û¿Òº”¶éyÏwt†yoFn&mΟ-#ÕÑÓhÞÛ “~°­é'ózyí†tf:x‡Iž Üi¶[4æAXÒJžŠ®b¶ØðMVŽ?+þцöÎýY=[sš÷Ãh%L‡GÏ£¡!N·ECH[:ÒÖ -ñlè¶fœ”];°aÞ7:ì®ù|‘ét)À\ž"r ÒÉWÛk[s¥•`RZ±¢—µ‹ÁãÂå³ùƒptëÊ@ÏqSÂSL'g–êsË@ˆ°€à‡füYl’ת©^ ×9¡ü¤æ[…úL•n*ä­†ïòöløa¥ÔïÉ™•Óþã饳-ë{éääx¡#Ãdδ¹oç NôtXýäÂÆ™µ±üÚ/ºÐnãMši;/¢©¸ ñ#œ•:>kê*ÅOýÖèQæ±Ùá,œpæMiïèà)ã ×p0Áz4åþÔT9´¤Þ ²ñ!¢,23ýÆ5i·²Š`Éʵ%+HÀh‡^äºõ¦¬TSV®HO³aT ¾Ð>˜ìlQ±²E%[p¾Î½û'2ô³ßö&ª½€0Š`×¹r”F×HŸÝ]/5êR[³8”p &jh+ØY,µà ¹å,ר´ó EM*6G5Â<Ëa8óhv̤$wñ]šäãúõ‹}ì™d¥Y>§0—&;/OÍf4ÀE×ìÁ˜ƒR«@0‰»–) ûhVÀ>¶uä6ß™*’Íäå}cî!8>&,»ðÎ÷yœ ¿‚ ;õ’í yL{ âg ‘KGdÆ|vÚ *'gŒuDq-‰ãhwq1œCø»X> ¬Þ*çbâØ…­ÔZ’ 4®‚$…æg4¨#©,ðmo‘hÉVH}è"7‡Ç›ZZw!,4ð‚“k’Qú¤JœåðxüU¤AÏ _ð‚%¾Š—œp+š'Ý&]Ĉ;+fð´-|™Ð%UÁÄéDÔ .fž€Qrƒ+œ¿`Ú s(fc³ Ã&wêÈÄÍߟ Fñº7Q f÷ؼɊ¶FE]|Ðaj©cº §TµÅOušfô(ÂoNsÈAê G¡¡¤§Œ\ª'K¦á4Šù¡©ìq;‰_2 P¯;h6RaÞšÀ§©úKn¬\¨K9¢ë<‰`6 )h‡A8/j.‡IS͈RÑþ8£Ék)²­ÚM{#yR-ãç·:#mO •»3Þò‰Á}²TÙÊUIÅ %W@ÄE¤·œçȦ7޼ħ¼N½Å†ÂÍÔég*é-¸šþ„VòB´°{øm´óltyç­Ÿüf æv–`A£óKkŽ|}V¬hpê@Þ]ÚÃÁª c×¥U‚ä“­µ”ª"¾ú®ºãSŵVÏ’ÍcÈ+ö$³O÷e2]{ €Ýº°êvÁÍÝW9œ“–†SG, 78«n^‘U{ñK–àt÷@ƒÏEAJÑ+;÷@?]5ák~á„xrZ°¶˜ q.$uæ ]êhŸ.™&VSÐx#’€îÍJZˆréÜ5)KäÓ>À®ã® à0„'H=ú"ƃÝr<\U/yüÍrÉ3(ÐÈ‘–uÝ;g啞A™l™G¾X©;èõå°(#–KD#àgÒŒ¶;I…ò2ÄéƒêƱ™WYµªÂt–-Bì×ù¡/_íí¨u)Ö1ZsÜ_­fiíjó|Þ|? ÇdeQ©aŒ )Mrâ´”ƒë,jM#f‘S0‰Î öÙÏù4®3'&Y",æ@Îô˜±<­Ó ¬¢%Zi I ÐÚöÔ5£äJé“À(}b ¶çrŒí¾d_Šœ8ˆâdQ¬«È"2d Ø”Ìræ!‘)X>„g¶*0Šàëâ7ŽIãþ˜4…TOê¢{!NñWîzyÕ½êÆÅž¦eàÚã…Ó¯|u£ÊÖÅ+ês ¦;G;è9°y1ú[WÞºTÊÝìl¾÷ -±60ßêò÷a4íbqü[ÔÿÊE’¹INŠJâf„’Ìà+´Mˆs޶¼D NQ‰$;‰TÎáƒZò–;|µù»vavI©cº¡,KŽ ±x’«¨ó3GÀCî:ò\ðg‡<äYÂC)ŸºŠ:Cñ pó±FŽ-¹3[‡-8PvöRÅ—4£š n—hÛ¸ÀÙ¹s^Ns3q}ÖÊ [)ÿU§ÞÝJ=ˆú*µ/_·_‰·_’“eêÇB,+OT&®¤•¬-0ÃUxD<+Ò_¯ 854 YÙb>±Pî8cP$ÜT¼¡!OÒ,aB„塞04t²«# bŒÅ‘Q'Hø«ARúòÔŦiºr­ŸJtÃ耨¦xé ÂF>ßJ~B\³7ÕC,éѪÀë-·–ZuÜmEK嶤¦KD•Ó‘¤ðPT+S_\à÷‚*FQHðN·?KË=u¶X Þ¡RúQãº!‘Ëx“#®%4ä4Jü¸Ð %£úéÔt°ÿA1<(d!¼éÍ[X#taÐnXÇâž–sÈàéCW †NJF!ÉË&Y05> ظIüŽ'-”HÝŒóàRa‘ž<“ô“þA!¾+ ®îàÆÀÎâÍ y C´ e¦Z’ežãÜ)•Ñ,ˆD岨%aíRN¢ÎÙ¯2”z­ Ò3îºc˜ŠÞÎ|²¸¾LNèxN7.ò:zÂ˄Զ܃hø€îâ*2_XRC8QÆÚ®+¿ÒHÃ_i¨Hg¨•âñð‹6¤0“.‰†ü!¨Aû >‹¾Ø8¾‘× `ïù“{µâòÁï3”ß6þ7I”#æKË@\¼~é¬Á¼6 Ó…È4Ùçe±~US4ëŠÎrf`Zíµ¤®ÔQw_ºÇ¢2Éýìa¤¸÷º¥•5Ûg9hµ®€ð\85ÂòPåkšeþ‰1L' Èšÿ—\$& Qò/ ‚òíKmª¬ôù¬R%’Ù Æ‚ßÓ“.’¦§f á(Yó”劔ެú¯ I¥?.ºò»›[…R±áuôü¬®õ?)"¨ØzØyå‹Q-HP×¥O0!ìŒsEIìßxÆ¡R<Ê3¬|‡ñµéí¯{J2Ĉ4Dìàß³‰¼Y•0Â€š £˜&3ë‰Ú¡7˜oŸðƒ¾<ÐØ$É«äî¡(ËǪ†Þ–™›þÏ?ü2¾ endstream endobj 915 0 obj <> stream xÚËŽä¶ñž¯ìÅ`gÝzKÇ$ðNœÄ÷¤sàHìiÁj©MI;}êIQÝ'˜Z$‹EV±ÞäÃ/ñÃþâ‡2ÿÃCsyøÓ—‡o?ÇåCõ©.Ї/'~ŠÐxøÒþ;ÝãSv¨£iy~|Jª¨í¾vm7¼p¯à7>Ô‹ºßÌÜÃGèJržCë^<|7}z|*ò"úþÄ€W7^Í ðIáŸf|LÊèëcRGÖÙ;«èûF÷3·œ–~žþäÆËv—vx ænFoÿùò—-­³3Ãd%"-"k\àŒó‹èjÜŒÍ7l–Ñ<â/ <›YzV<ôzgÛ}ÅÉvbd†šñ $’ÑÙ ‚•>è6ý4ò×-¾–2³ýŠZÇ=}רaâñ*Ø­½§üçÑ2ióêi•ÁUôöÍÄ#W`<¬›‰Ñv³lH#h_ì¼…xíæsH}NÔ;k¦q0Ï=®”%‘=âtt3h&ÂÆù§:xúAø=V × Ãá]ŒÈ-6†žu—+™‰q²ÜaˆB«¢Óâ€,Ç ¤Ùu¤,âÖà“Žzþ«uMǨ*æ;ôÊpµžúÄmág+3d)„îÂݵ8Zª“Å`maÒŸ”v/)Ÿ‰vÔ¬,ƒ}™Ëµ·h$ʇ:ºàPº²áˆ-Y–oÙ‚†DE¹q²ŠÑŒù׳>VE„£E-»€Ý0/ñ“­”q/–wqR˜•ƒ4ãÄ¿!ãpŸÌ¸’‡Â!ü$Ý)Žp e¶»4 g™Kìs•h°„H7ts¦Š[=4ÔæcûãM¿ˆâA‡áŸÆ?5½éP·Ê˜ÆEuHGaµnfÇQoäuZºùøÈ¦ïí‹_…M8ÍxÓw_aσÚP] >I„24†'(IÌ ûYÉÏbàÅÏ0ò‘á–iýžlßk l%j u¼/=G˜ ‰öiËŠÃìáY5`ðG7¡^¶3”6ÚÑ:™x`'A<³|û¹z@úµDIü©Nˆq Î;ãèÇÇ4Žˆ3)XïI'†áÄù#.“GÇc3²Ô¹îy™G÷û3á&9Hü! šx€:=+1€—¥)Ë|]÷› ™XK5>+TãáëU>l0ñ¹r°9XsÝÓê•q+Ì?ÜF×àÏï˜ýÃáÝ€´˜É¶ÀÕ,/£/ ™†ž%CïˆÍE&ˆíh·2Ø `·7ÒpÃhòæ w'ÀÝì›zÌïx<²ØÅ[âÉ‚·²<Ô™ž;EJ:@h“þLÄ€8+}Ϩ·à…€ó7YÇ×È,s1庛QXc^K=Z¬ü¶Q¯À¸¿ž-ÔýÃ3=xË0%9æ—¥£[¸~R"˜lÍiFA }RbbŽ•‚!„ã¸ÚòX`BxŒ·ŸäU4˽3 Ö ^Öcë.Ý<ïMcyGÜ«ÍÆy(ðŒŒ-ÓÁóVª<0‹‹\­7:ò»ðq/EEI(:q0H`áÛ‘Ù' &²ùV°éI¹Úeøb•ã°{¦ñôÕîBsú7þ2‚Æø}Nö—ÅLÜ‘½Æ(9$/£$=`—³Fý ¹È5Tη2…šT‡š„š]VFd‘_ç‰ñ1ÞƒZ)øj1*ËÐi2#óDõ¶"QÿÀ`ÂÂI§Ë¶B«‰ý#ÿúHé>(¼õsø­‰Yq†›,Œb|€ÁÝ´O¡çÖ9KšqkÄ8õ:Ù†dw6è;#Ör¼â^±Ó“I)a¹†'Ø0ü3ŒÃ“ý˜7u,²”¿zÓÛ·¯]«}—UŒ…â2È"ŸNÎZ^-4YØ^ƒ;XF#ªƒ„·Ø·c>qžžÞ1B“f°dTÓ£šªîH&A‡ Ih8ÉáGn.¶¥i³ÀJà!Ì(u¬`¤óÁ…¡¯¥&· ‚“”§å9½ÝLÑTßn²¯õ‘¦Om?a£eò"w«wIh{Þžï)SR™L1Òê{:ÝWÉùpŒŽ?}ʼe‹ýÇãö¼WþÀã$Éð»F^b…”nÒ‘Xä²AÁÜGÒ.`ÔuŒƸ‡6IJ-„gµv/Ý{’3À6[2©˜]o âÈpâd¡aøgCWŽù´¨¾aÛˆÁ¢”qx¢rŽ-+òIœw³©”Õ®+$ûËyCE<€þ°è3˜Õ®hBàAyÒÉ w‚¤>ã"Ë)öÊ¢/”èñ)>3úÀ=T ÊíæÓ «#áȈèkIEtÓša E]Ù·¡ nD“n¥F¢ Ò¡PjxŒyÅkÜqb=ýŒë)Yzç@Y»aš5 µ ¥´ËÞS4rhuæµ*-«)râ£C7U>ìÔ0¸H£Ÿ¯©½Ìv¶“ÀäÀy^+Ê­(Wz<9’`£”kY¦¯5 j­€¯êÿƒI>Rß׿NBWIƒ1»!2!Ø7]/%ˆQOÌjÝ„ö ƒ$!e±Ö ¹&BHÁ^'ÒÎ(( àdÉÑ Ÿ •ZcÂàtuÚÎ7 =A®_aHæÆåå¬TÄ•b: &­Ú’v'sƒÅŒÕ’Þ@X3Y'·YS­sà'ÆàŸ9˜Î«bóÚ¤Kdã(Ö¸7<VÿB‚ -Û­˜QL¥S(Îsuð±/é*<òï3Gäܘv4îŽA’×\®Jª ö’à^ðÓ80@x„ؘGþmíÕI°‚>®qàÐOÜCÑ}%±~ȦŠ&gî» Õ±xC†ƒ'ÝždïÀ’/½‘Í‹‰ž2 '½¡çãžAæ@Ãð+Óú>¬ÔŠ&Š ¯öÂJ_­õ•¾´å§Xl;qƒ/I{7@~ŸõvŸ¢$´©´*c7…΋ #ÿJÎYç+¿©]Ü$‰rÇ‚¿w1"D9†‡ÄƒæSYFáõ"!YñµæGÃwŠŸmâÊÚ á´€«¨ò ´¨²ð¼°¹wiL/<¦é{Ñ[ö:¾`;ŠêQ4Kë¶ZM}~2gÉM嘃?î¦S”š ¥ú?l«ÿ»5ß»dgãKÉwÁãÛnj\wé ñÝÛ‡ðn³ò×’-¾W-iJÔÅÓkpà/E'f(¤‡\x•;ú\$øxÆŠ8Ö8ö«R ô ô\ˆâˆz¦ñ4û‚ D–&]Ÿ<äÁ­+0nXK¦ÛDÿEªcÙŒ‹•yá3$šªì•\YUÙ:‹ì7_©§H3 ±¿à„¿v+Îô¦‚žï¸D~û'ú¦% ³„Œ^´Ü¯%RY™²™*Äáçæ1N”zééÎAÞ»—žØà÷5éŠÐûC^uô;Ôègéc:‰Í~nMïïŹ‡TŸ†¼ë@qˆ9Ô<ø6“7æö: h#CIë!gi=dÛÈ úEhäJ”b/ïA¥†o}È!Ûl>Û‰t.]/Ù¡ü0©Ý=OüFj0y†Ì<8_áMBɯGê\@¹`N†ºÑ3Ñ À _Œãš@­õ“ZË@Œ!Tc _Sï…§ðÕÏÒÍ­s¿z3^®·ëÃÚ±™÷èäƒ3´ °Ò"Þávo‹\X¦é¹žZ$᳊X_±­åѨ‹ð•Yrk/ç}!Ü6ñ‹+$Žà{´8|`#Ø€ýáÈ3’êž3Î9ˆ1’á|'ÊøûˆÞMFÅÏ8ð—½TVÖ;{ìžÎ(᧯¹`ë³[è1KÍ¥jì¦[žÖ#§K¢CèK7ûÞÕ\TtéIQË#ëuNÍõiB"opà³µ'}nW´ÒºS ¼)<ßæo뫼 îV$Q“ü,Ý)³IÝMèß?À´+ÐÔ(ü}©WÞÊüï' ‰<ùûÈ®à§Å9«~mõ ÿ@¦o¸óó#è³¶/ÿ×S¬c%ɇYWÊ(8Àÿ†\Ñþõ:ƒóþvŸÆüý8¡^ðJ‹ëo-]«§x;è+ìœki9 ÁôP¨¨UëPüò·Q¦í™Æi*ïE™ü4TÄ=K¯YJÖú!ZyÊÌbŒ_*zààú-V³¼)-6Ì\î,‹tËZèÞàmÌà¿þüóÖbçÑn\lkå;AÏ[a©l"Oláwk;a†HŽË¸ýl;.SOýE« ÔøÜËË2Á¥áER*¥IØ“DrïŒRx q­ª8è[ 0^2nÖ£Ê*I%CRÌn ¾G¨B;>°,4Ò.ªÛ‚ R:…oÚ¬"ê&„÷þÕ"‚­¯ñ>€‚îíšK=²9¯üÕ@Qy—Q+Áv…ÎkðN£;⟽wÈ•ï¾ð+ô<06I’ª’ÀòSU³É)sÿçþ Ò"½î endstream endobj 918 0 obj <> stream xÚ•Z[sÚÈ~?¿Âµ/GTÙº‹G ²­³ âuŸDP­@¬$âõþúÓ·‘p’ÝJ*Ìôôôôôåë™Q.þ¸0/úðǼð-øÛ¿Xn/næŸnMÿ"¸xÞÅ| ÃWf:óÕuYõ®l»o¬U³É¨cËr׳ãþ“½ç»¯@¶ƺ*·ÌÐlÊ:ã‰Mɤ· ö÷žååç(E @”LÙÈÜǪüZ¥ÛKìÙŠlå®Î7œ›âÜ÷VvÀ²¡³,ÅŠ›uÚäõúç¿ö®`FÙlÔr¢,èUÛº÷¿ùŽ­îPŒck^cË6&ù2ÛÑ4 ¿ñŽh1GÉ—1Ú?L¨²u•æ;îdd¿&¯2Ú °‰í ul6.--Å(פæ§ÛàõìÄu–y=°HiÓ¾î]¹¦i,HÍÀ6ÞrÚr L8ÆÝtÁ”áKß´³ªäÞ]¶Ëª´`žÇÃk‘/y@¶­×ãÆt¯X~PiÙà.qÕºòV@HJ|çN)a íayÜy^çåNF×<$†‡–h€11p5ó&í 'Á¢Õ6¯•L‡=¸F‘ï~gJ) ,ÁÀÿšïd~J~M—e'¾ÊVbSr}õ;äJÙ<â’ Ää6F)ý´üÐó@ÚÌŠÇ»g­âÃ*¢4pÚL'{ØÊ_ Í0Þ9†ZB»‹[èääÎP5 ŒüTƒfU«€ú_Ê®(3P¡ò°+~yŽ@^œˆ¨ýÒ à\:ФUþ®QlZƒqÛ©2é%åºÛ~Zé<%d¶ìËÆ6üÃÎ=U£Qû}&zãTÈ­OˆLØÞeoÌ!'›A´™¾TM䥸 F0¬"Ú¼ÁUžSôb‡6ù6Ó1Ó! ÚŒ˜º±EAØë±‚\v81]*ŒÂæ:ßæEZñH.Ø\ïó*oNÖäœs¡>dµTN–¬¡$Õ[Ò xÑÆ-r¯rΔãµVY“æÅñZéj‹ÔÅöG*©×"ÛJhRåpÚü©9€ÎB&L[[9ÝDL (tûÆ×œ‡„œ2u•׈“ˆÎO·RœÀ È8l1öÄÊøÉñF´filF·=Uq§C!0‘“‰"Í&mŽt€Í5|zÎkQ®¹Gáù˜¢põ=QÇWÌ×Ì×j–¯×,è¼¼Í}_;F€¸"m2¡k:üƒˆ<9íÍ—r¿yƒ1xÚXOκ¢å^ É—: ¿ë²(èXðÆ®Ñùx˜ èè»Ê•'°^®ŽBA¨r´¸–=8§ à¨ô[)Ú1&h-õÑD#%øµ=§©G £’õ| õ ið1uu޽(¸—êTM{¢\Eþ|ÿ7*c»ì%Âm¦iOi<Ìçr@šå2ÛÃeg)™.§ï$NquAIw"¯¶®‘à^Z命mO»5à:²³1KŠp¹Äzí.üÇÛZÕ®6žŽn–gA2Ü8êÚÂÇ¥«½P‘©¦ùdlèuÙ(¶„äI8£•"^•ë®Ö³¡ºÊA¥½òL˸/Û˜ÏäjÎtú K;^’ù5U¸ Ëb®|'ùv¯²y%õ~Ç6ëjžSÉU§‚=qT9˜A­†É›²à;ž‡k‘¥ðBÄ$ §5—’y0ò2`ËaÚÒj‘¨Åà ïC;5üü,íÊYzœ×Ë"…s_¥_Émã©G¶«À6QÏ6AÝgü½3ô}‡ì§(Á_ߘθÿÔ3MÛÆñp:fÒ-n|s¦rã1ÆíÌîâჸ|>;bñð·y8 {?Dóy8æ¡›gþ>>N¢Ñðf~'&CPÈ1ž®ñ¦ä€HTf>Îù>õtN±å3ÜóFIÈÜÉ1z؃c­Œ´hÊ¿Oq4¦wÜ!•±1š=>ÇÑÝýœ…ÞÏ&ã0Nxl8B3`›W;ËêGZ/¦£0Ad°•¥0¿D㉴¢å;ºyäåe˜ðP”ü§h~?[Ì¥sì!œ2»å¡áô™¿FÓñ%6]#ŒHU"‡¿=Æa’€)Î4ÇY®eDà&co:š,Æ`&êÛÆ )Ó™4&¸m‹Ãó™ÌãÝuâxø‰ÜÚ³u€ƒt‡ß‡ 1º‡A´ßð&šD°Á³Ã ¸Ÿ o£ùv#¤ØòOë ¼1ZL†±¹ æfqŒZͦ?ÇEOpq÷×F½Vh¸8ÉÓ×¼Èÿ! (x.¡ þ†_¸lÏ3Ó ãðóBdÌ#ˆaHÕ0ŒúYíÔ£M"úâ.y¶Ãñt^ÚÓðˆOÙȘÒ#£Ux˜¡ê’;„ÖéD`À&û€1ŠF@Ñó?ÌÆÑ-¥&r*ÀÑÑlú%|–Fx”¥…ÜYè ©´ÇÐ@bÏp… •ªpzŒØ„ÈÃ¥dÀá‰É)ž1ÆÎðaˆ}&—ÌÒb•,C[ï#Ç4Œ‡áJÃQ„½3ua> ó”KZ_ ¬»OÀ÷ˆ4cº’*ÁüCÀ )*`sKd¥„QfÃÆ‚ ŽˆühªàŽg'|8ó¼Øèˆá¸ñrd¯Ïpí¸†k¤´pT²2üNfà8Œš"…-L!BXÌT²?8êÞ„¼.4ãp ±¨–Ͳ_cùh³J±7\óP#²)´“…”ñhʹpæÁ…68ÉÐÂQ> stream xÚ­koÛ8òûý £_*±bËïmQÀ-ÒÖ‹\’K‚õGË´ETµ”¯ÿýÍ‹²üH÷{ˆ’3CÎp8O5~otmøë4†üÚxÓø5¶ß>ñ<Ô¶L¬«ŽŒ:á¸Ã¾Ha¦v‘D€Up†QeÑä^î1 ã„BNŽCFý: këx¾±K³ÚŸ_ÍÓJ49RsÉ™©~Ÿ ÷íîY&:ÓN¥¼x Íó[°Š¬ðã/‹E¢å™$ªX|­tð$:8—*Áù®  ìá_µc·ÄE÷ áE4Ùn/˜þ<ð¶±§¼ (Æd'"'6¯¼àÔlw&ý/„R(8èÕù½€Süs:û~ÿ<ãÅäîE “ÇÇÉÝìåƒ?¬×ïЯúT(³ÉSãEÞQÜ+÷•ÎϘÿýæñËw8~òyz;½TÚçWÎînžždqÿ(’‰]MgÓ/Ï·?Ü?Ý„âxOº!jlûÄö4ÕÕÁe¼Å-u©LZ\x×ïŽ>vÓ[)±œŽ5„¯ã ¡zÿ—½êL¹*µ˜žý³ùƒOÌÎkl*œ!x‹^‡“²Ì¹¾Þívá:Û†Ö­¯SæZ\ /Ÿá(ª×“´Ì¡–R¼˜ Ôº!§eŒ•‚'áÒâ¸ÒŠ-'%K‘u¨ba±ÀÅ^Ê©òµ³ªç¨ZÊW–\"añfÒêýNË䪘ìܳۗ" KK^b<4¾ RV‰¤äXÔíêEb_ŠDØ N”oKÞ§ãReP˜§æ¼_ŠQ ‡œ _ÙE•`਌äõA6©nߪ~èŠKÈ/’­»ín8’t-Zò‰ïÿ–r½0c»ÑÅ©•O>?Ýß>Ïnn%¤ÜÝ_Œf•c‹;‹‹ì}`ý7<ÉNÎ~þL¤·³ôÕIR¥ë*{ítŠ—8®q.æð3j9:Öîy¥dKƒ6X|øÉâ÷—ÕpÉ£[òæµÞ$Š nÅ2 ZBp0]òˆÝv³›¼BÖÞ·aßî=ì¡~Èø‰‡àªæyíöQ«l"w†ËrÀäâ €£J<ò ¸*’"ÔGRœK$½ðÐ÷+éÊ õS•€DBt\µ ”)«›c¬¡œÛcŠW­C{¹4Ôd8ðf¸{ù›Dzܪ˜êÛóÔÇMq䕊Y’“`¸ãi ›Bß*‰³ó¹bþ”Çâbÿx÷F§øB"°ˆ ½÷/As­(´ãl­± ;|pL¬¡$° %ú"t˜o«„Ç­,¼ûÁ+¬‰/EÅí0˜ Â:ÆÜ@Y¶A(s`T¸÷Úã #M$î3ëìˆÅ…¶‰àqª ð~÷Fܤë;lh89|;锡TE¡ÉÙwÜî_›£^ÀûÛRe éQŽD€1 ȱä=«|ÏÀ "PñG&šzÂCû~"/Õ¸ûÛÃíÎ"ª$ÔâÿQ1õóêàRqÐë„Q‡àîP´õÃht^¢Ñ€¥¢‰÷[\x¿FÃC±†þŒA—IyÂÍ-æk˜,¶NZ^:¦O?¸5m󹆷ïÙ !B&oEdüˆãŠòB¿•ã× ý>w¯Þ0Š{\r®<1©-lžì¯wɾÞJ×y&å&½äoQ·úGþ拺~í‹u.ˆUû`8 Gc"î ‡žüûd÷/‚ endstream endobj 628 0 obj <> stream xÚí\Ën9–ÝÏWÄ2µaòMÞA£€îjT£Ð݃FUõʨE¦”~ mËdÔÌ|ýœCÞTR®Hè‘!ÙhÌÂΩ ïå9÷A2™}™ì”ƒ›œãg˜‚øŒStüLSòŸµÝ“£›j(ø “$ÁgœœÍ:(òä|Íêä‚ „¾“ QÂÍÅR(“«Ž‚LN"Ze;y˳›¼c‡ÙOÞ—!N>TØËäSA‡7 %L¾z˜VòäEp3, 3„@]5M!æ¡N!;ô,n …=ø ìG2š*öa*ø}®ÕDHS:1ÁO1üÉ¥)V^0’(…B’­¼’ aJÁGyJè‚L ›JðS"6…— ¥9‰MSÊÙ‰x³ÃPJÄH¼P Ä`¦p‰='Œ­€Å’0¤`j¢Ý`±° gÑ*Óh.ÀŠñÍè¬Ã’"¿AK2S ¿-*š×JÁOÕbp´²:(,@µz¡P¦ÚÆxk¢ö*SÍlœk…C [8XË? ~mí„¿Pp“G=~’|*¾•ä)äIr»Ík»¹N"¡B±³ÖÓªÉaä°’§rW´ v¢¯9›Ð¾bpX\W϶®ÂÁôU'€ÚÁ—ƒCç‰þåšG×$0×ÀûP%ÞÎåh[X  ­-*m ðo'9#„…Ø•!ãÇÓBÅ7 m}äÐ5>ôä|†••äé8˜Á?¨°ÂkùWÆl¢/:8=´!x\ˆŽ´…Dº`… Y(±EE4Vb¤×ÑÒRD˜CSÜpÑà *\ÂÅç©ðn#¢§V¶H½À=\Ìn¶%©xA"jp —lÀwÄ&{ÁàF´£w)’AXæR³nâ#O,S¹ËûØ Xt™ý‘1—>$à¨à:ä<{è°èrÀh„ü"/ÑÕØJàklÁ”&ä(3P…9,Ó„Ìdjbü@©0{áA6qÅo!~-°þ‘ÀÐ"Tb¦Ä¶ 쉰-³%óCôÑG-¡kbÔ±D† £–&âOˆ&[ 6R¤WÏ/¬OI“¥—Ö@k-]þF Ûµø„ˆ¶ð&²³L^,ª–ÜÃbM¼!³‡‡åŸÄ¶àÆè·b‡Åi´x¶@0Aì6jé6p€´•šHQdQrm":æ†Ä柎ƒ—F˜óT,ôÐ=r  Ô[Gtà¸}j" ˆ ø"*‡–% @¬ì,±‡Ä±ÐÛ=œ¿‰(%¶$6+ì¬e°C‘”[ˆR›ˆ\·z4ö-Þ!zâKôŽ~±BŒ¤éïΆµ‰l–[Ô{ÁB§F ¤<ÿð‡õ/ÿói·þãÇ—7ëŸ?ooxõ·wÿµþÓåÕÅîê•E!·¿®¿åºðG4ùyý—Ë_.×^Áسï¾[ÿ´;¿yB0HÅ™ðB(&ÀRÉ&÷ëwßýšþpùñ†´ þ´þLy ®Ë0QŠÊÕWeŒ<7™ G¿EY®û–(¶VïËÁjKN3œÞwF¹SõÍ5M°ÿW—ç?ïn^­ÿñçÖ¿ìþûfýã‡Í›Ý÷ýãOýãGÁixɯZM„IÈX¦â3ˆ7œº œŒd·ˆ¶Í­6“iáQMËÅÕOx­±ËèÚFæ’i™@•Á LålT6ãGÈ?BøàHY1æwœâŽ#`vfœâà8uЧŒæŽÕ·£yYw<Â×fù䬩Èë!À=at™Rdm·Ú|ˆ&µ(†S^½iÙÏGƒ™ÉÚÄ”9 %±Ä‹Úï1Rß&v¦,2°QUBÒCMÛ«ÊÙ¤ú¥®½³ Ï#]wþãAFaÚû {o9âY£·Ï'ÉÁ÷îxÜlÂ\Àï›Gë†QÝŽuYms #³ÚrжC¿GFùˆHÙèÞü²Ãu¨OÎ5Pl8göß»e¢ûõK’i®*M[ˆÑxNÖ$.¤m.ºƒТÑ-‚ñæg nÕ¤Á}GÕ=ñ¸¢0Ÿ†0¿ôT§rBšÕ׳ᩚÈÌóx~ÖòÒ}˶Ýq鿵m÷.—þ½m[0dŸ Ï=^´ø{;¬ýP¡B™"f¡m“nÍE›MørRê'E®ì…#È#Ãb¬vGÖä§OÉŽT×qÚwdWaH}cº+ÜÛV™ûÜî$?tÏ{Ú¨ïþ¤r¨ò/ëAîÖƒjÅpŠKÃÌé7×£ÇÂPÊ—î#YýýˆƒÅ÷¿Ù€ÎÈ݈ÈÈã½¾õ2þ´Ï)/ËÆaêœ7|n•l0t ç²á¦v²Õ$ïц}ªÒ´Lw¹!ÄA›ŸBqÈ*é±K³cܾŸOåí¤óâµvõÔ‚ö˜•ï¸pR×ÉkýGá0›ôý6«ï_̬ÿj³—uËE)8¶ý5›¹_6GÇÃ^AÄÜÊò$A01ñŒ5)T\#GKXˆÎqùlŸïÞÉÏ2©÷4àÒ¡Ü$g"W`š‘`bHÉT©¦„øè]–Â#[¥#à@/X–H“ž¶íjõâuàäÅÆ·:¶—Ð6Ä‹ê}:kÍCvr“Ûç¡þô#ÿ­ÞÞÜ|úÏõúõÍ'óæãgsyõfÏõ›÷Ÿþµ¾ÍP…GµøL›Gȼ ×íw\„×° Xo*“©(0&YÒ Eâ·ß~»µãÓÕîS3ìí͇÷‡B'Öˆ‡-Éã3Á†hh޹]?&MÝ÷ék¸Â›ŸÞ¿Û¶ñß9:kO^H1,É ¹ÒcyýLð__¾¾ùmsµ[Þ›ËË÷뛟7ﳂ3_ ¡&sUóëôýØÉË—Í_wÎ$ö·$àkµIä‰ëÄ™³Ë ®UüÆ6Xvwà„=žÎì¹Õ%¾}ÃÓ™ñaÏ4ÇÑÝ‹…y,÷L[,£º#ïO~Ò;øùSÿ'%¶2¯j ͘ ° 1ÖÜçÚ +Ãl’Qt«Lb0Û¤2ë—8صάaÕÀ¼†¼mxD©šo~qa™m\VWð¥GU]!ò ¹4]®ž”žÙëŽi{Ùìr8úÇ3Þ<#·_x‹‚‹yâs¬?bÆD!ÖQ9>ÇúƒÇ «;èÂì´ _PW°ŠÒKx¾4ç1]I¼ä"hõÇܶÞs<_? áü´Gй¦öè™0­ã;—Ɔú°ÓÇΨ Ñ3Žg;XyÊ8V.œùJ§C‚’'7šâäyÌ·Í(ðÉg]%ÈŇM@g—.…âpÚáà‚˜owb\Æ·Å,&X&:TìTNò‹#/Â|[`¼vã&`*Ö„¼íð W+‹$ÎAó˜å×z«ËEîø¦,ÚðèB~ò³£ßçæ{žþœe¶ß¯2MÍCŽˆ†oô¾ Ï ÞðýpWÝRkýAWƘ/–î•UÖ ß”a‘¼„Ë…/ö ùF1\1—û@s0niUrWUDb |ÿ³ÔóѳK<ª\ê±Áù»ëùüú½Ù]|^_í®w›«ó·ëëO›«ëÝzóábÌbþzó¥/nªíò16¿Aw(/s}“Àœ_¾ÿïÄðMg¾jÕ¢]?$Ã}£ã¿6ço7ï?ì®® Füý5†ª üpyõaóþï»›·—×ë¿¿ûøîçÍÍÝDZ±?ƒDÅåOoð¤ø°°…ÿËw7wmñÉ_uÅr'EþÊ/yŒnÆ7Ÿšûo£óŽ*2³ó|ûÞóÝõäé…b&ï zO>"1ôµœ­ÿßëóô:ïKìšýí݇w7ׯVölå¬=ûuý_›»vÍ€±f»Ä/“Š”[-ø¢#g»J‡®ø –ôÚÎC•Ù«r„ìTNýlß™}oƾ3îÝ›W ïí«³Ê¹¨¼\gûÞ²ï×cßÛ3‰{ûÎÏ8Uèòd¯ò²…Æüí“ß÷m÷=ÿõÝÅõ+i?æôSûu“þ)ý3¦9»§óƒY@3êhÈHTdÛ÷Š,î—dg{ 쮌݅¤£q`!éhXHЬÊI‘EcI³Ì»zÖ^ú ioXH{ûÀBVdPΊ,KžeÞ]œµwp†¾ÁBÞÛòÞ>°•yÀ*´•\Üzîì$×ÙHÊRV–²Ì5ö­uìÂ7Rt<ÅÖç¢Ø¢”8Û_:kOn‡þÀCÙ<”ý€ÀCQl=p.Š-KåÞoÎÚ“‹¡oðP÷ö‡º·> stream xÚXM¹ ½çWôÑ}©ÕI‰Àbÿ@‚ö”ÄðÁvw ìæ²ÉÿÏ{¬ž)UuiâƒÇœ¢HQä5¹ÔzI—\$]zçÿù’[v)R h¹ÔÂ%Ú/’‚ÉE<½h§ÐÒÅ´R°K«pQz¹ô°‚WÏ!`aJ”\!ÁI® K3 kjÜ“Ræ–H Ò%»dÕ|qÅ'u8W|±â¶Y‚€Ì±¿än<,Ü gÜö=Þtiü„ï½qtž„ŸàÊ+×ãˆ9ÌSƒ3wFŽ_Kâ)S£$X Wà$—¤—’饔‰GJ8CÉá¥ó!O¦”܈D‚$ÜÍ)ÑKÆYKX¼B¢—Œ””ÊSfÅnµÇ:ì&9´ÌRçÜVZ@ŒmŹpFFc´ OŽc#·\–ðÉráɰ¿ !ä'¢€ý/È3à…ÇÒ ?eJDœÇX3¬KG’¼!Ú.Äë{ %¾9`ñ†°½. ¼sæ7(íRS‰jHJ…Ä JE0XÖ ÔÃ!µPòÎé(áZV””n±ªôø)J*£~jÆ\jmÔªÖ(oä½J‰u°å Jg£v«F?$XheÓ OU¥œ`«°¶œ8:¢‹5Sg¨G4µEÎ ”M¸ ÎâHjí 鬵#íŽb©P9Š£vúFV/pä0úgåUV’XV©±q%Ê/Ab6‰%š™1#w‚ŸüF‰"7z”)¤‚<;Ž€^ S´A]8šFЇ¥]¤F„U52f0¬Qëá.ðIˆ6àÔ‚‡x,ƒ©m&IØãpS ´¹©%®Ã†b•̈Ĵ¯Ä!DßI@Š’ƒD:CÉAŠÝ˜4⬽0óHz—Sâ© Ò!žÃþ\Âþ<°«ü$†¤k¢—d4ÑKÂbRMØ\Ùp ¤ äX³=À";mÑñº+êZ i„k "FGi(Ru I ɺ@…ôX€® [/wJˆ# U²oBàh{žgSUƇúVeo€¡/ºRê[ƒPM¨éÄOŰÖiÙ¢3PûÚpn<ÚzòV`É ¼´§ûNvMtÚ:úò€Ž.< Ã)Aé,6¿Xb“W\,DÏq©XB:2odU҇劲Â?ËI…{šŒm…5]qãÍåµA`=‚[.¾À§AâS…D´ ´I K¸•Zx’6@†Ä››óg^}ÂÖCfL‹Ú(ÖŒÌ*Óî0³¸ ¥9ÓÈÓµTÇ ^~þù§¿ýöÇoÿùóó§ï×OßëõËOÿúÇ=~{$]~ýô=]ÃKÈù~B.×ðr¥\(ùå—¿Œ~ŽûàX¸RW+½í…l”Û*7ÊÏÝ;e?ñü­==ÿõ·ÛŸŸb„·§ÃƯë¸q™Ãþû™c')ë®_¯Ñæ!»FÛ†L\DϼݮŸniðvãÊçyçyP^Ñä]Á¼dÍ'ŽoŽus|c t íÆèÚ)ÐØAÖØAÖvæÙàùëà™)ÐghL=cc lMô Ù Ò Y@žŸ©{&B˛П‚ÉYdß`"c ìy¦ÀV`oDÐV`oÙÎ åö¸~º—ÁSÐÖóШ­Ç¹3möNÛ ì ·³œß+·Íñ)hkhw¦ ­¡Ý™‚¶{'È}öNûYÒڼ3ýSП±1}Mú õ¤;Aêmmx~¦¦¥g"Ú[Žú[Žz?‹ uþêüÎøó²¯À>²¯ÀÂ6ø÷Ä3êü1Ô9~Z«v >¹_ƒ‘CökprÈ_¯ÁÊ'žæã1xþÆ•ÏØ¾S~Æj^AzÜ)¯ Ár™ÁüØÒäº&…o˜§ðd9¾`ÎÉq´—7r4}Ë®¿ÙÙX—ó•JÜäÏåÙÞ–¿wÂg[)÷§üó_xÎ- ·þû¿¿ÿþåLÝu¦ïj;ªË‚„¿©×ëdPc,_²~ O²àz›ê½.¸*ßÔòjnÃöÕ7=Â\ѹñÔ°vYl jå½CÐh´wã>7äá\#ž$þ\Y‹/ùý¤uH”ËßPRžm¸7«@oÿ Ä ¸Ô8Æ gÑ÷JÔ¾;ÆÒeフÄF¿e±<ñ ]ô½N[j¯Tc[¯×Ø -YÆñsb‡'ôâ27ímÑMÝÓí‘å€CmC÷4é1ßÁ1®§E|âÏ­¥½WXÓ3R“ Å>m¾½ãp˜và¢K+›ò…ÒJ [ú¬BÛPGÍKÊRebˆçÕÀû=éɽÑgƵ•¡Ìl¯Ô:’w+2‹wÊcª÷šãV;Z6÷}}©õ¬X6òëA™[[Ò–ÈuVØŽW¢<(%÷¡Á^QÝq«zWчÖPèY>Ì–ìKïCË}D¯³É^ýZ%ié[É‹¾ØÒçêÝyûKÔþ!Zi!…a•6½>ÓiÔdQ›(1²/uGöá0tH­ÓÑÁ÷•d#íÍ´ -ï†û»ÚPö9O %”z´ÄTÕf[fÜòþΙÝêGÉÐ=}í¯Q9‰}˜0ŸÏœÿ?ZMˆï…4ÍŽíÐÓmXMóæË?FNsC„u» ÔÌ,÷a.;9†0GŸ)VMQ\“gíý¼B·Yòåäƒe+Èv¿FÔTv–ûJÁˆêïÍÒë Ðz˜QƒÛd{PŠøpI”l¾ ýmÆ›í6QJÕáÚ=(ñ]’L.Ç}+Ô6½é÷f‚9I† ·MÍÚž˜t`­¶§44é†ËAW¤£Ì”ÑnÙƒ²ÖñèfÓÀ½¾›e?àÕ2 ày:óç˜~¯¬–—^'Êý+©Ö8Ц4·7S\6±Ú?ö†Uu÷LØWŒµ!ƒU¦e¿×¨ä¥êDÉrÒíRÚ§Â`¹•ýA)2l¢«à™¶=Ù_ÇÔý_ú‡ãÍøW†íÖjgÏúÍzS—ô¡µøÙP¦gÓÏ ¾sëz6E¡åmª•ÂêjÇÊVÍ?ijïI_ðfH~6ÄL‚ÑwçÃëበ6V8¼{ö~˜ Ä|‚Òžƒ=/V'ÊJ¾ì“gȾOJ±q¶:(é6m·Þ´©;”:QVî’ÿÕ¼àû endstream endobj 1317 0 obj <> stream xÚ•YYãÆ~ϯèGûÁܾÀXÀGbp‚…ã9,85#¯F(ÍîŽ}¾jdQì¶ò2Ûêb×Wç×E®ÒF )”6Nè$”ÔV¸Hÿzý‹?ÊÓ»ÖÑ‹…‘BKI -t>l¬Ðù4i‹ùdF,‚ÆjZha‚¢…–Ž“2KÚUpÂ::¼°ÑÓ" §è”•ÂÙ|* È`‡”DòAx-6Â;²Ëb'’]Έ =9D€‘Jz+‚W´EÈþ<ªüL‘ ” ;d Æ¯˜èhMšb»’£`;ÅŒEÈä t„˜8EH$púô¬R9Œ¤CeOI‰2ä|$§ Á)úIVjCÏ(ÕÏè¤hE´¤ž3ÖŸì2ÔEü±ÒÒ {–Î+rѺD+J=¢H“#M*A‰3Ëœ§H¡r)‡Ǽ"k)bÞZ :ö§ð“ñÇQü ÚÑ Ï—톂ÉRe¤0"¹¦‘2ؘ¥Ä”ƒ ‰\ÓHŸJ®)¸)ÐYüD©e V96Ò’´H‰j“ä F¦4j„öV–ÐkM¥…½ˆ:•„æ›+ÀÑ^ f@# Hs#ÇY"V:Ç™ ×9Î?/BÃd<—ôù¬Eã¹@Ze¬r¶P¼:œ²Íá”-h‰¤E!Q:R©]Ñ…TL„N’²˜êdröñ\¢ä©D½©J#O9Xe-H£‘hÖ„8I)WÉPWKl),à|B᪶;Œ††3 å-ÑèHƒ (¬ .ƒúÃPñ&äaTxÈÊ~$Æ €mXå@ Œ£ü¬²à8œBO@è‰Q`V¹O>ãóQäÉ„@GQ«&º¼ç…I†zLg22§ö²ðV ¼DMjðÇ ìÇ ‘ÃJ k©Äáh‹:N ëC~T2†!.#‡à©°ÉäçŒpReÍ 3•÷ˆá4QœÁT IUç$…§ÎS?ÄÕ…ÛߪS:'þà ܧ\>Á‹!ï%áM~ﲦùS\s Ÿ¨\X2ë4OÐÙdÕ—÷À¦ŽšÑ ÄƒÏ „!kÎÌJãhS~—Ž×ä 1æb7(ĉ/‘GâcÂÀŸ$S^¡œ2s„$Q*°¢ZÍ6ƒÜ“£»*YÈY%9[O)ÇÀçÏžšŽÁä;„¼ÀRå{…¬ˆ™â©ç Q“ôÄï&_1;–)$åèå;L˜|Raó5•¥|·Ñ³äŽr¹h#µ¶'b1¹·cñŸ`é¢þùÍ?ÿõo¤„ˆ¬'m_6›ÿþ B7¢1ÔâYHA }ru¡ó¡A÷Ì ­ö ü˜‚Íø{ú±0À¯y‰K¾I¶ ´>6hÊy¡Ñ¡AI\…©èyà|ж!î„5t2N¹F»‚—W3tšn¨A¹VÝè«Þ»’\âTlP±ÐØQh&'A§ãü#ì¤läÕ¢§RMIbImAl¬ThÒ÷ãµke)’g·@#¯‘´¶ˆæxáF߸¡p%×)M†6Rì$º ¶ ´26Q‚‰Q°‰ÃɍБV•ãBÞcÄëca Iƒ°T‰Uf¬S•¸`"ÁuÚ¨+¿ ˆ Çpðc¶‘n¦â1&ÁÙ¨+aÅĩ΢I†~ª\Ÿ>”ìô¸a Ü-%‰)JŠaäIsL‡0–Œp®Ô©®ÃàyAj;Ša¥‚œHh6dHš4\lÅàN$ÖÚft*O1‰sjÄÌ!Þ?š0˜éøe e“JB †ö§ë»MÍ}Ðw!Þca‰ÝÌ„K­µâä˜ÓºqªpÃv£u!ñc@§î+ º‹…c#‹8ÊÙ"Ú$íªq]ºP›ÜZ\h@¤2„x u‘)6ßD‚‘¿Iº Ä;G“BA¨qån î!Þ3FƒÜ„>¦Ã£¼¹»®Bg‹·Åd®²ãd"Ą߄árºHf|ä2zÔ»!Þ]¯¡+êä÷ŒuƸI2ø0‰7eÿš)/CeX+ξȮãk4FªÝdF•á‹5Nîpp¸¸­šˆqA¤çF/ƒ8Ì]/3V¹½Åº1ƒ8LÅJb¼ê2¤©\›Æƒ½º9»j`×9UÅ5¡xC‡TbÂhK•ƒ¾o–çûÆÂ„V¸„÷ë¯ß|ߎúÿö-íý²>nº/~z'öýîaÓ=ùæìþýÍ»_vo¾ÿB}ùöí›wmßm§Oð·îóñô©d¢æ¯?–ôè9=ïúîãéãËX«™jý¶_w+Ñ}nŸ÷›n¢×r½†irSMßíž÷ëÍzû8Ñâæ´\¬³LçmèÖÛ·}Mã]ÿ8@ƒ8>ubß.>´S/ iû˺?ƒ~jƒAo¾Û½é+SŒñM®~ÜûÝòeq\ï¶8Éàƒ38•X˜Âm˜ú¶O]»ìú `âÑŠcUFNUý¹ïw½xj·Ë™T¶sª.A`65UüËSëÄ¡]uÇ׉އŠ^ÃÚÂÜ„ú›¾o_Åz»ì>ß¼¨)¾1ñ‡nÛõíF,vÛ8Ü&ú"K^'ïdÙ%yv„˜7øîÔÓâÐ=>ãıcÖƒæ¦Ö¿mëCAÓjNÓ%¬Ÿ©ç®_ïú¯ö»5ŽÏ(YCp !̱[A­ª©õ¥pî~ëS]Ëqþ ëõóå[ÌߥÌyÿÄ)üãfÿ~J?vů¯ƒ§ {Ï›¦ w“áX9‡sèŽäý¶}îNHíá°~ÜŠ_¿X …»_¿¼‚Ò3SH;y‰,ëg«JÀ™*þÉÙõÇN¬^¶™gMqS,£«k¦,×ýÉl03öÇõóú÷6€‡º“)«M;å åk¦°ëÔš9SÚåò}¿ût8Gd¹Ûî“È;ÇÝA¨ak†mKØ‹Ýf‚—çíð±ϸǺRàhµ Ÿ­€TÃfüd} ŽV±O˜…okðŒ¼l¨¹þ°]f+ü~»,§—Šz¨A{kž¡ÏnÏ£/jèìî:½ –:o±Ã 9ÛzW GVëÅš 0eàž=[¬q¹ÜÌÆËšYŒ]‘ŸÛœ“±U}·ß´‹K>v«<fCú–®6éן§Æt5cQ:U3‰˜7朡{íYUìqŒ-Ý,[nvíòýIõÉÚ`‘Ÿžv›?6FËš1Œ/Ý,_.žºÅ‡÷Ë—ýù²¤Ÿb…úÀÖf½ ›³eAýsž8ìÛþÐlQ5[ºYþ<ìú# m ðwæG뚌GÝ,.»Íè Á¯AÈ«~÷\'qmjàŒH/wÈür…Ü_›*cR7ˤ‹Ýþu<<áç‘p¼umˆpŒHÝ,‘bú?Œç¶üûNìÚÔàºTˆzdžÆsàë±®Í ·>^fã<Ò[1^óÄón¹^½Ò¯~÷‚Ýîæ†Ðljfo=ç/íç©Y«ÒØÌ_\ü,c?ÞŽ³}‡îê>vµ)VóÁÁ3úóº„ÄçÖ+Ð}ãªnç0ϾzÆyÞÔ,¸Ž«ƒwªú¡f#;oKFl_žGLsµÛ]O|GÂ)ð¢Ì3íjÀËÌŸgн¬a3vó¾„ÍGÔ+va2Õ] ’š%H>™^!Ë©^ÕP™ùXsôøºŸs”¶§_Âd ’q˜O5ÈÍà àf÷ ‰Í3èWÕpÙ¬d ÷e÷e¿/áê.낪%v&ÄçÄÎEÙTPc¯ k¨7Q>cVmkÐŒ¶‚©A¿ +±v5hFVÁÖsx͘áìÿãÃøšAŒÄB•Ķ¿W(ì:'Ž,›Rš 5K¥…"¥±WVÿwά&Ö¬`,BÍŠë;δ8î5$Õ )~ï;£Uæ;Þzöé=°¯*çÎFµÏù“4ûþGÞç; ‹¦nóÛ<0 8K{+è’N¿N^Åï*3wŠYÌa\BË/ª"â5Áñòm¡ º¬€FÆwQW&ãQ<Ï£q=ž] öÆ»Ÿ¸vpçеýâ©RL¦S`CqÔw}Jæ“j¼ý¯¹vñᱟáRËïéÈÈ*–?Ì­×ÅS‡E‹WýU»8î¦ÿdÕÚ%ŒžbñÃÜá·ßj_¦jðºÏx)yéê:cƪ©¡²é+§¯«ÓS&¬Û0›Áâüç8Ò=z> stream xÚ¥\mÛ¶²þ~¿8ÁŠ”(JÀA4M{‹“¤AÒàÞƒ¶Ø#Ëô®n¼–!Û»Ùþú;3¤lDr·9_Ö²$óyHÎ<3|[™×¹È„ÌëBH•ãE)TQã…¹¡‹JèŒ.¤(¼Wd™0e…Rԙ ø“©¯ é«yV╆?þÁ¯º¢_! ¾\dðr¥2¼‚êïÉL¨¬D,)…’])¡r‰ïÉ8æX|] ¥5âJ-T œá jPOi„ªÄ«JäY¸²¹’ˆyž#?%E^hü­R"×1(D^Öô\U9=ÕŠ®JuÁ)# L*¥E®èªEQâUž‰¢Ä ¹…!´\‰¢"´<Em4½Î =ÕB+…%Cu?“9`èBcÍsè ×~y-´ãWdB»ö+¤Ð5v^Q(°t/‡NË͈2WÊuEYP«¥(¯àiIœ‹J”õÈÀMF½ª¥0®?´š¯raü¢Fk,Oka •¢Ka*…  Ò¦ÖX7]‰*«èª•"Ë)3QåÄ ”¢Òd4¥UI Ê\T†,B¢ª ÝÓ`~ÄÔÒµn)jåJ1¢FS…«®¨M&jMvf¦¥Àƒ@ð þdÚmaàO&ÉFÛÆ¿öP†& —P¡LS§ —¬$;C‡É u ¶VVV ,ûNÊœ.ÑST‰?Ãöt>X`£Hc¹U‰®¤éø.ÆjUP®¬Ü»€¦2ê‚ è(© +¯ ¢+t¸4å•|½t—/É|ñ25£)×ÄàóRÕdI5j9‘ÆVSÊñ 4/ЯQrjŽ—øš&0hÇ„žW†J ]ÀšŒj€—yZCMNƒT5ù¼&4jú²ÀÂ$õ"v‹&w®I[dAô=*Ý_ø£jº hºpÔ‘©Æ6Ó/ ñEO°eu­é.¼Eï3p)jx>…?F—-ѾàÐJ¢ÑìË[Y+üY%éø8’ÂŽ7A4l"°HüH„4yF—ðÈ ŽÀ%ÔÍy—• ÁŒÅ˜ [Y£H™šê‚>NŒ@Ǭ$Ú¶©©¥ŸaU¨öØpéšm´*±²ÔÞ•AL]àÝÊÐ%W¤Yû¼vM‚šXK4sýX+´JTçô3lCç‚} D_À¦¯ QÇZÕ† ÿ–uE|Q+꺤wAÕÁ^/ȈßÄÖbÀˆ$‰Êr¬€.1zd Ð*#³Ñ %SÈ ½A鮯 zSQYM=T"ZM¦ 2¢À‘©0@7¤»€†žCf—9Q7¬ º Ф\4T[A×c ï:4°\ld\ + ZŠ 4¨–ã%u4§wC§‚n‚+ŒSø‰Ö ˜ ƒV¸DO×€QÊV•‹»/ÁÀ°-sE6UáeŽÖå‘€2©ÜPÇÚ¨¼*ˆ]¨³øÇ?®~íŽ[ûÍÍv}°Ç롸>›£øZ]Àñû7ím³»±¿+à¡À‡§Ã·W/᧯~êí¯~ø¦¨¿ý÷Í`wG—\dâÃÕûÁÞã7EßÞÙ/G—œÀ·ï¾û¯tÛoãÐððt·‹ 7)ôœ¡—AôãúzÕºƒƒnûÝá8œÚ#ÂíÖͰÝ®;vÍV¼y/èÅ9ƒUŠAÁ˜ƒf}fš]kŸfЦ”ŒAbÐî¿„|ß}Y=þíð$uŠÀ¢Òc) nwv‚O»(Û`Ù?vÃáx±§7ÍáR›«Wý p_”ÊLTÜ ê twû­ýâí¯ßÞ[¬ì~èW[{'ºã­8ÞZ¸ÑÝA;ôƒXŸàsüÕ=Þöë9ó o•zÂ3î û¥iÝN¸ÇÍl±kg€: ºFÀj ¯BðØÍׇ»vï(ø^ïþ´çŠ«;î8ô[±o†˜ØaÞkZ¦¨HF%Q¹Qp︬åìCÜØºÖËè7dL-Rêws&*ÅD1&EŒ vûDŸ{: Ýsáà #M%OQÉ£‚v—¦B–™&R¤ˆŒH#Ò¯þïú8 ¸kÁŸá žìX§€561`¦ÎÈÑ¥ËhÉ@«(öqÔw}°¾&mt‚¦>]BÓí p•®¦À2‹ó |N…c]§p™J™Â ´µÇM5w“@—L¥J¡šÛ£Ç[|•ÂfŠ'£ŠwÚ­vëë¡yœ‹Þ=ˆ~a@´Íé€ÑÞ„¨·¶kˆ˜‹NhSTÿÈ‚X4ÛI£‰‹Ã¾Bc–E,×¼Šp ‚:w`ŸˆÄã{/ö=\†#°¶Ó†ð€gø2»ý1gˆÏ…›‰±7˜æÉ æ›H(å=ì‹e–fº'«ðר|)SÀLõdþ:Á-U šéžÊRÐUpË<Ì„OÉðW _Y$Ð>¥Rè_!|¥Na/êúsÈoc¢£×SÑñÎâEÇUd*ª9¼íóÔôs·[§F ø|^{á}ùg4 2´y[‡pªÎØÊLØT4eÛîP_g pwB™#*Ü iÒXèI¢À„L™… ebàY3<Æ4)LÑT .ýž °Þþˆ-«ÆÝ·/`üÿ¢=EbK¹Jqa"§êx¤é#»¨vwpãA¦lSl˜îåAÝ»ëö± sX`[EFå:…Ï\0—1ü¯Š56œ3åËU ÿ>¨÷AÈM ’¥8yƒD¸imÕd)ÔEÕÞv_hâÈYXø XÎ]bž¥,§RëÅKmÎó»,¢µ³+æwí­m?_þì½¾Š…áêªÛvÇÇ+²ú/Ñì×ZÛœ¬áa~‰ôrí~-©¯‘Óúæ,´øoc}cÕ]“ïiÔýòýÏâCu:™åýr-èUNøœ‡ó<(öƒmÖ×wûÃh^Íú,rëæØà\ÒÛ÷Ŧîšãœ"ç9“²<(eCw´<úúËàhÙL»Š,ZÛí>QÙWïß¼þ_F„ ˜&^…Œ×d®þª…‚õx¡¢m€˜‰VøéÍûFàë<“´"·À?Ü MŠÀ¢Æï§c]AØ®3!p¦`Ï|¯ÈÃÉÞ½Îu/ÙìЯq{ ÉÓÆ"è¶0¿n¶Û¾½~ø|ðÖDßhLLLŽ˜¶Í†Çýï4í"N¬C°cK²,­01”›Öz‘›ìö´î_à³þnÌÛhJY͹ØÞ´UŒ‹Ó²~m·ÓFjccXážl°6)LÜŠ:ÉŒ-F†TYŠÓ7Åø&¶ŽÀùÕ~Ž)S˜LÒ´Œa®NÝv**ô}²+d­›,!JD%ˆh&lZňìûÃÑ¥ëÄãò5Šš§P™žé<†º¬8"~}®VE QÏ1Y@mÄömí&ùÞ6Ç[ºWÇ… ­¦‚V° F3A«‚67fÿ:˜°íÈ"¯¡½§ÊΗPÛé5š¢ |Ѽfj¨ãIÌ—|n )• !Ž}À„P›xL{²â UŠ“?]Å›¾G¬ŽÁròÙ}P§øpS¨£=r¦C=’`“h˜&E„)b™Å»æù “ ²JQaBYÊxÁnJe:R~NÇ´ %É2žý9PÇÌ)$š`BgbY&’¿'š oSøÑÜï\ø3ó¿JOåR3¹,Ÿ'—<‡+r9àÄ¡ÑÈ vàwãÚÆ¥¸b°û~˜·GÍó…%Ì{ˆ/ü0yRV¤Ú›iµK^íÈ8wVíe\øt¤±:tcévÎÒmÃpÙP·ˆŽt™$•år´Ý~¾plÞ‚<é(™Ô–A©]m®í—òŠé´D·qÓ´YeÓ´ò»?2:÷ò—‡ý’)™ *ÙXª·ÞÜíO>¯ ÀÎñtoô&^FFj}ÚCêj×Ϭöms+kwÂÿlN¨L2LÈLtvµi÷³y±•'çDk“"ÃtÍD—.dÜbÀWR©RTØ&Ý„²ºE]ç sé'|C±nç46`,uŠ[·0:µaµ\·À©R¸k¿ ÒÏ9Íy4)LaM™Z?YE×OžMe•¢ÂRDL78ð*oly q¸kF ѾhSÀL®LX®–À+PÃg ¯SÈLpMx®¯î@4ö¿ÿ_A þö·ØÞÀÚ¦«èÞÀHX©YXñçÊ#˜A#À¨Œ¬šUP—í}³½†” -žK3ÞèBRJלf¿+&{•J¢µãhcDó”!@_ÙŠ ]º³Å\j{¾‘n¿íZx÷Qö¶í6ÅõÚ‡9 •"Á$®*Ò$Îð ×6syŠ“¹JG8h‡£=¹ùå÷½Jàã9p‘fºVuvö€iå=«S°:¶ÙÇ[RÔÍXÖèmÈ»™c˜,yË~ªðÖgL^ÿ´×´—ÉÏwº[¢qk~î ˜ÿ®ß½pƒïq/Ô¼!x¸¯¸“×)ø¶·Ž~YtÄg0=,µ9Š4…*Daì‹ê?Êã¶>W±éëŠ ŸŠõÈRé^Ž;ÌKV5[(+Y"ïkøD"?›E¯4>Ñl \Ûl·ÈÆV˜7Ø|?Y½\ŽãëøÍö¦§½ÓóRÛP©ž;;ÁP,O0ü ¬¶Ú[+» ¼NÍÔ¨^øê«Ó@¿;œV~Òu^ºM•Î$gyø‰c«ìû~>}ÚlRå²¼h¹»ÿƒmýÎÍebw>³kWY ³ü /M35XvbÀÓ hWÍ¢tø˜D×p¦j7ß#áïþÕ*óYOSgYŒ‚Û>NÊ7-Îûà nfĉ×,í[3h­=¤ÿÍñ8ÌëßL—Û¾Ò­ }™kɪˆ“Ðì„‚ŽœP¸}â¦Ùϲ2»mH¯qÞ žÎu X2à<¼ë×v² ä[¾ÙcjB¹ö Ÿ›´´4§P¦((F¡ˆQ8Ø-t-17ªá‰DˆcOãÑnwrÃC'Ns2&E&gdtŒÌ­= —ùqÀ¿ïÖ“M© Ý«Gïu‡åy•U•"Q0eŒDÛì®Ý~­Ù<ð¹`|‚{dÏyc$z¯êÍ蘇xMˆžOß&¸¡{&¬æš…’QˆJ”sÊóZáå+YÃØ;~™iN`•"`Âû]"ËŠ%õt¨æÙvB< wÍ:Zg\«;œ§Ñ&»×ðž=ÅÃôŠ…iÍ*h•ÃôÄ/¨­Ü>‰ð• áúæf´Œêá^²ÀOSؤ(°æ—QeÜÃëA ø ëO‡'i´YŠSGUÇÓ>L¢I§Q­La31”:¶ö~ܦ01Á‹6Óó9ºJ¡3”e}2Š £÷-ž L˜·yŠ“>—>œNÚƒÓs‹nw›lñÕ"E§|"§ÉHôãKA«v¢L£Ÿye’&¼­|.L,Y“Q1Æì:(L£DL*’Ž·,sÐìƒVÑ<’²Ë||ñÇm\‚(”4!À±ý™8ª¨8®íö?Ø»žÓgç]#1U‚Û©UTÛ-˜õ£iù„Êái.uŠ‹L¬b&Øjf‚,8ò“ EÄÑp2Þ}ø‰A}S³Ø,™TÏÔ³U5>XAûÈìî~±ŒVƒáA7ô»;(}Þ:lD®Ùù>ßpo‡C·™m;ȶ†GáÏqÖ!œ±c™î…4Сsi‹ÐSU³)HÞ¦ñM!›éR»›ëÇE<èl ‘w»¬oaÉ›ºaèÁdëþ?‚_g)x¦kác Xî5À8|»Ã”újÝ\jíA=9¶La3Q Q lÈæ?Ö 7Z»?>…«¸ì„‚ŸPè÷vàã€ïØ GP¯ý#Í2¤¡ó4ËíÂ'Ú-Œ]¦Øýþ¹ÐE šåsásvÆC Ð¿ûmó(Ü­;µ47Öí¿1‡4)H¦c¹‰¶63n¨DIºþ|1öfµCßžÛ>À¦J±a—%Žö<϶?ßAè_Á×Ïs¼:…ÇD-ík» ú/Oa6)L¦dáC +.Q#µJA1á O€²¯Oä3~óðq„swã{ÖmšKÐác ½íîºÉ?öaÐôlš ÊËÎãm4ãšn—ƒ»Oy –qÉj‚ž/OVZ»Ý6;‹ãÚDŽÕ6 °`)^9aÄs¬š7ñ‚ËýÃnÛÓö7Ê_A)ÝÌ+fB(V`ÊóÖå@Á$°XHà§Ý¾i?ÿ…òm*ì=¦~ËC¯úݦ»9 #bƒ™Ì!d ‚©ÝòˆÃ«þnßmŸP)&`Ës ¯P±Ÿ(?O•Ïky&ág'ÍO )&OË3Ÿvݳ0t #Å›\,è_ýi¯Ü þ|oÎzúÿ&FÃñÞãÏ xï1ïÑì0¶^žsø‘ÎHâ¹´CûR-ªìØ€^øe<^X*ÌÕ,Zn·|÷òíkÜÔ„Ë ´Ä4ÌgLl*ž·ÃÂÇ?üò?#gWl“*—yórÿ«_Þ|zû.Zô*U4óâåþüÿ-¶MË|w¹éþÃËw?½Ž–¼N•̼v¹}þû_>½û!Z²M•̼u¹þõ»^þúò óؤX ±Üåþ‘N(ç¿l‹Øœv¡šl²ÛÉ®—;»_ips 5ÇâÝb‰f#SÅ3]nUÇ•Ámާaª7*UîòpuÔ˧›4F·ö¢Å÷˜KS-‘»¿»=­-ÿd®¹Ü:ýË¢#ÅÚnh‚fÙ§:TôØ8ÌQË@¸½L³…S¦Šg»Üºý=ÎGK6©’™Ã– ‡ý‰ŽØmÿ>ž¡ÿ; 8ý¿§ðx 3ªR€Ì—»Á_CñŸíãC¿ðÞM*–yïr›÷Ä©.GžÕ$0–dÏEÝ`3ݤ©Ù™ÏðÉØÍ£ír³øGüïœ/šm¿Ãu…¾ý‘þ!Óœ ÿ·\„{ÉrøË·?Ì‹ã1€m›ÖËmÓ¡Œ«ÿz(ʆŠ[œ3+—ƒ]÷qÙî›T‘ÌS—û™ÿÜv«Yy2ËR–K[ƒ<§„>ö›ãüJ|:@†õ³;ý3'Ëa Kð̳ö•i¶s^/7ÿôî“ð~,ÞŸVÛ®oºÖîvQQ™0“©aœÿw[42Ó)s©Ü«ìòÛÖ„+í×ǽˆ{iÐjw‚Æ€BþFÅü1ÿ¹_€{ÆïÝr¡/àüþÁS“:÷úg·>üFµn©ú›[®„«©pË­M—Z 7Œn0-ÜìµpÓÈÂMç 7³*ÜD§p“ŽÂM 7ÿ&Üœ˜póTÂM 7o#ÜTŠpÓÂM97 ܨ]¸€)ÜA¸ñŸp£4áSÂx„”7|Nb„‹ÒÂ%Éð–×ñ–ÏyË»\ø«—»]<¸ÜìŒæ7— —Ç —m — —³—b—"'KÂé¦p!P¸x%\Nõ…fá4U8wÎ\…ó(áÜ^8gα„³Wá6Ì ·/T8›Φ„« pÕn#±p[…Ûö)Ü&TávŸ 7W!ÜZ’pÛî„Ûâ(Ü^Dá¶ ·›O¸½x­¤ ·?ÿo¿ÿ”þSùOo¦n_ЬŸ¤ß󌎒n'Ï´§FÙ†gÞò3OFz2Ò“‘žŒ}¦ðŸÚ–þÓøO_žw%é}Izg’Þ›¤w'éýIz‡’Þ£¤w)é}Jz§’Þ«¤w+éýJzÇ’Þ³¤w-é}Kzç’Þ»¤w/éýKz“Þäw1é}Lz'“Þˤw3éýLzG“ÞÓ¤w5é}Mj_žv¦~~gêEgNƒÒ\ó°ú^Ó¾2n›“SBï´Ò{­ôn+½ßJï¸Ò{®ô®+½ïJï¼Ò{¯ôî+½ÿJïÀÒ{°ô.,½KïÄÒ{±ôn,½KïÈÒ{²ô®,½/KïÌÒ{³ôî,½?KïÐÒ{´ô.-½OKïÔÒ{µôn-½_KïØÒ{¶ô®-½oËz %c,ñÁÄ{·òÞ­²úª,.¿†‚Êú;fÿ¡ÒJo endstream endobj 1590 0 obj <> stream xÚ[ÍÎå¶ Ýç)ü#‰?’€ @Ñe7EÐ݇,ŠvPt3 2“Eß¾‡2}¯¯l”»˜k}¶|DR)y²´¾¥­$ݨ¦-KÏ mEt«$¸ÑêÖrÛJç­µ¶Q*[{ÐiË©ÜÁ_‰ŠÝÂOÎã­ŒV“2nmöP·Ld·¬1p ]™0tAwý(z6˜Ñ«oYÕz¡QÓ²¢…‡„—1Œ5𬗴cÀ¡³&ÓK·d+¹XzdhH’·R¤Y'´¨ }-HDx¥p…ªRÁ^F/0¢P…˜Z¥¸SP¬´4 ð^«Ðnt¡Q{Íî¦jz$#€ífj£ª¨˜¢š*ôèÐØ4Kv ˜ÇÃbbCSŒ™š“ [Ý$k« ©[/û j2þQÏÖ€ ½gö—ÚOÛ8vüá‡7.jÊcP&Ø—sݘ!n ZP“Á8sµº‹ŽghiÂFÍzÒЭ6@@4 2áN§Ñ½:zaŒM†00ªä‚Û0ªä>d@«ža^€_¡ápa˜¸™^KDÍ @•0*¬*ÊÖh›TCIí£@›BêÇ6 xƒo ;P È• ŠC>L V*¡1tÓM‰ZÆZ -¼hô(ƒn†‘Uê``SåÑ èÕ8‡õ´Â¶ÔÆÆ †ë6™ŒLí͸Ë5 ´‡…*&Ë[-Ã&d-5B@d%ü)ðÈJZb÷Ä&œ 7GÓP›Ç¹b 1×Īoß7,0jk bDÙ׈\Rb6kŽI´’!°…í\ Õ?…` 52pÌc“Œ‹ŒIekb1Ñfà¦ß´¥ÚËf¿R«i;†iÔöw馸q[lUQ–‘jVÃZ0:âuʘ fKÛÏX¯š_û~Ê~Í~-~%¿²_ůêWÇËŽ—¯8^q¼âxÅñŠãÇ)ŽS§899999¹\äxäxäxäxìxìxìxìxìxìxìxìxìxìxâxâxâx2ð~ùáÇ?ýüùë¯üþ¯Ï_qw ~úÇÿ~ûüéïÿüýüþùË·=û±'ýõË7Üøú|`|úË—/¿~ûj=ƈ?ýôž¹0∠£.Œº0ê¨+§®œºrêÊ©ã©ã©ãUÇ«ŽW¯:^u¼êxÕñªãUÇ«Ž×¯9^s¼æxÍñšã5ÇkŽ×¯9^w¼žïÈî´Lv/Ù;"Èäà+ÞøtBý>ýí¿ÿþú‘³$[Æõ—å)2µH°]ާ`˜É¯CÐñA»dQ”×åÙÃÄ™(úóDYŠoYŠ¿_å¤å%çL:óíþ3ÒwoTo¸E/Äåpv™uå'qæhs3{°[í3úË ‰Ÿš“Ggʇ•ÐõûäúTÊS˲Ï;*·n²‡æ5Ð:kÙŽàEÑÉ#:yD'º‹˜D²<(ͳ÷5ß|¡Ö,òŠö…èJ1Elè>gÏ‚Õ{ÎËÄæuúÞ$‹èðõ”|ý$æÕ¾>Þ ’gA§•´EhBÊ;txZ@žоìÿùȵDž‡?ìõôF7 u£Y7 ú:Dûžbåôf9Ñ#>i$ðø=!¹€'4 Ae‚ˆ¶Q×¼ä•ÏÃÈó.ÒÀãkæu£ ò:uBߢÃc‡§T÷lqÐY 4Z†h§…oO8çµ§µu°iÁÓ½Îú“Dy¾LžSã·¢‹Ïæ‡??,ùüJ\]±Oºöô$®»‡]¿%²×upˆÜ3Î…8ÔNDz@AÈ)ô´<¯ýái¼ë—ŒWÁØsñ“vå©Ý²®C.OÉ3A{>6¶j÷ëý”äE³ =€ eˆ˜+ë:„¼Aûnûîg Ð̳ íé7å®>åBË`¥Ì~#·~Stò-¢¼bßÞáòn„êœñÃ’I#Hæ'ä¾<ŠÁ|¤T WŽF»7g‰ÍÙfº*Ë”SªdgÜ7ƘR @˜å> xu\Ê\!î;ŽK™ ÄK)ó=Ç{¡Á÷ûØë¦ ÚÄQI³ @´uˆúœä¾Èr;ÙãÊä*ód/k›Q¯„ùÆ&{ÅÂ|ZÇDnE RfçUºÐm<Ò´TiBË;žå5 ûf*ëjI§¾,yHóðÃã–}Hz£[®‹Ìº ´öuˆÕ’®œ*^ö=cÖ`æ×0–)IæšY‡BXmë«%Ý ¾ξõÍÏJèƒ÷¥mžN-&fÚ¹â}é:O§v;š¬CDÅ5Íâ=¢vïgß’åv_pp\p”yÅèÁÒ×y"ˆõqer…ÐwèðJ„»‡ã.ïE—rp~`vØë!éE7‰‹š‹ˆAÐ*„¤²]蔲×!òÜô’ø½»]hI¡S™Eš‹r:V©ñóNñüS|G]òÝ.´„§×A3σòsÐꃸÖ~0 Vòò`%̓ÉZªp6‚ø.xR.Á©‚”p¾‘΂QQ×!)(­CôÅ)ûB‡U‹O9 R¡xrL¡T¨º!ÏBw§PÂi¬Ï~ÓÞð?Á?ƒªïÅ6:j@: 6:‚ÜòC¸Üj:%O‰µð¼ûÂù15ù6ØÄ¥À|6\Ö6®èTÅŠ– |Ÿî‰„±§‘@ð:D0‹ãJá ±ºj¾Òà‘È¿¦99¿ÜM‰™v>Dç Éòp½ ÿñ™Ã|ÿ¬w©œÄgWÈú…^Έ"Á„Äg6¢¸¾µ¥åuê#¥|Ä߇ »-në‰ë™s·Ký!·ÛÒ×WH^Lå¼¢xñàßs\5®^d<í¾^•¸î¸@u‡ÄuÇbñÐý•ÿîÉ?ùÚ¢Y$®^d"ý~úk\$\!zA«šÊ;tøa¹D²E'äÇ©Ü 2 ò\P|wxó=éiiÎË óÇQ*Gìÿ8¶·}w{ó üy°’Ö›S8YšÀ)/ƒÓlGÍk©œœŽJ|×vÓgóáèæ5áæåÚEÔ0Êi™E³N½ÝˆÕxþùÜŸÿ8–²c%óLiÓÛlYy]îK¶¬¼è½gн^ðÅpÓàã$³f§U5kœ5_!(€¨ë«Yó ž5ûê½½Ì<ÿDØçÉæ.½¹efKj¬íTc»Ã-Yo=Pë:d°VÕ´Ñß!Ðsf·Çøäÿ½hxœèQÐê±}ê.¢:‡§xyÕuYÌÎôL®Á&¼Öð,¢¦Y€û=“Ö D ²€8I½B𢗼Òàk¥Í®A²ªq²Zó,È}²ªq²z’U“Õ+½C‡'«êɪ>“U Þ®=&f^'ú¼NÔÛõ­Æ9è YÓýô©qöx…wˆò4V÷> stream xÚí\»ŽäD­–Køì/`¦ga–,- 1D|ÀBH°+ˆ]+B>‰ZðâLVA©ÌôÛ{«Nõ^Dk5§­ã{Ï=uêáë¹ß<ÿèysÛlîšÍ³æþö¾¹{qß|·Y¿^òâãÇn›»OŸ~~õÃúåÃúæÛæñ§õÍ—Û_Ö7_5?¾ùéûõÍ˯?k6ë‡Ï›arõÕ u©R É©N Êrù‰QåU+Õ+±ü¬Uº¼BÖƒª¯°€‚Z—Ô‚”Y W8˜µ /”W$Ç ñ BÕrCð‡ê%¡Ú+„²OP¸‰>A=Aý'PõÔÿ%6¥Úª¼B¨þJ¡ÄVÈîJ¡Ä6&^JlçD¡Äv©¢P-_]•åš…Òj{­r j.\•‰ÅÍú…çÈØ¨Uç«{/(?B‚G)mXz …®PHÃê'H¨;R.Ôìê.¶;‡ª.Ï‹ @mãyšáâ¾ePh†‹AHf¸9ŠººKäîH¨ƒ*#BÏRéLî^Ñ×3¡Ea3Çálúš,ϵ¦u3bL–ÓL‚7ótYw_+ä(k¼twKa» e…eˆR\YcaQ• ø0 ‹^mY˜÷‘°,ÉH€EÎw1ê±°HOÕáÞ˜w}|`_°zy7Çêš§ãÝ)z ã½?ÆþgäLïÀ*9€¼ vú {ò®Óò  Ï€ƒ•Ð4ôØÐéVBР¡"jØÙƒŒvß!j(‘ç!%4 ,á ª3»ChðP =Dd¤2##WÂ^®„ŠÝ‚4TB%Ähðbf„Ç>ÈÅyò rˆ$vèÄ+!t ‹ÉÏA+#…=°€JÍãHq,¨™öï­ïÐ áò^Iñ 5Œw¤ÎïÛê`v‹m|¡³“âëf‚xÇz¬°iNWb¼›RŒw¬KNCK#è(ËbK#ìÌ +@ÂòYØÙ-´¬Óˆ°0‘šj©…Îêâ¤=$¬€å±3R mÁP¤i²°ãVˆ,ÝŠ‘ej1²l…’•>'À^U8`:ìeL¶D|£¨ÓžÀ× Yà+"dÿˆÙÌn³-c3ôyíE6m¶{ðÕœOËÁ¡/2Ór@…µ•C%#¬íØ)d„µ“C'#¬­ja¢ÂÚÅÉ ÈÖVð…Œ°Ò¼q!™¡nÅ24uN†ÀüuȰ˜¿®æ/$CŸÑÆ‘È0C Ô˽Ëlfï4µ„Íì½´°™ýlãÃæ´¥é(ñ.§,.-ŸÕµ%>dµZʼnÏꊯÛ!øRÀfŠW2jØ_½ÿ¤“ÔCžvVS‹¨a§‡•ˆözhEÔ°sÀBD Ѱln{/–Ëí~åÃòÙlX!» “+¿w’ +W ‘°x58îÍ9û=2ß Ã…Å©!Ö²eè‘è Î0ùæ(Æ h5ØxÏcº£Ùˆ¶’ÑvjÚhztŠ=9ùØš¼1ÑÃGN>„€Æ;G»TC´R‚«StXb^±aQÌÏÕ`À6E¢3b¦†@¶´øf)öu‚t®mË.RtUŠt®çGÏIœèÀ4OªHqª†žƒªèåÈ4s¬Û·ef7³„™×¶q}Æ:1ý´"ãZŠžf¦E¾LJ!Ò{gƹ‡bFUI: ·ÒÖã€ßN©j)WŽtŽŸb&Tµ¼ò+Ô#Ö¹„3ŸÛ˜GX§=?0 `£v8ñâ«3UUdã—´ás(ÏTÅ}¾ˆm4vÜ'T”l –h½¯‹9Aw‰™¬ˆnù±Ý™"5éÇŽÜèú s«à9ÎP–r¸ãïÌ?yð„7È,Þ¹oWÄ!QÅhPõ!Ñxm€¯AÅv¿cþô_b»0ŒùSÝtR~‰ݹ?;±³IUñÜQV©Í|Âæ¢&ždŠŠšÆjfq”ªZ>ª 'é!=Õ"èsÒ9ûàøš6d¼…6•´&f°X)ffRó`c °žpÐ9ˆCV&=¶µÀâÒf<%–ï²N¢ºÿ9÷Ô_rÉýÇP‹AùV ÊubP½Òð—ÔïrP¿ÈAU×(« '+/'+'Çú?rP_¥BÿƒúUJN¡ƒœB‡ßä Ö_<¬¿ù;¡wù endstream endobj 1723 0 obj <> stream xÚí\ÍŽä4®(‡H}É#$OÀLÏÂ,{Š´€ÄàÄG 8'ˆG^Ɉ¯aÄ „›–ÃÌjº;?.×çî’h­&·Õd?W}þ\U¶+}¿ýÁëö¶ÝßµûWíýí}{÷æ¾ýv¿ûa÷Ñ›ÿpÛÞ}üêùÏß|¿{û°»ùº}üÓîæó§¿ìn¾húñçïv7o¿ü¤Ýï>m§³_NZ£N k¨Ô FRƒòŠR­eôæp,åÐ_!ïškœBE½+ªÁè©ÁÒ5.èQO£ŠÑOÊëÉ]ªÖ[ÏŠPÕû¥®ªx‚¡èêJ*¼@ýP^ªx¿¡Ü•B•W5jBUWe5¡ÔjQ£ ¥V·šP]ÎÚ§Ä,Q”¥wOÏBõ™HÜà‡òt|ú ³Äp‚*. ¢#Ížú"(Z<ýáÊ-¡Ê ÂÕ°„Š1~…á v µ5 ]͉f«yã_Ä,p5ÛTqÞ"P+#ÀubH«¹Åî¢PK‡ÀŠÁÄ¡ê3ľ&ÛEˆÇ²`$RÙ ñXê:Å—}U¶BMŒg¿„“ÄÕ·[xˆEöÕÑ;¾ªÌ¢Ýmˆ:Ml¦¬,ìüÌCLV†Í23-a²âŒzb±È’•çSߣ[Ýq¼eyñ`K€deãÓ÷lVy4½Y¯YÍõÓQÖÙ!í´Ô:¯™p`¡Yodj0Â,4ë%ÀB‡E˜qM B(¶lJ€Ð›À ´Ä&°­¡ ,&- Ä4L „¼å<"…'B¡ æÆ‚X#„VÈx¡Ðx Ò!­GÆ«•&ÐC¦[p1÷Jl 2žs­ÅZ @Úƒê¯aaš@‡¼„Ê+å B;hÙ@2î•XŸ@ÖK„ÐR‹u²ÕÆë#XõB›-Ö¡Æ—@Ðæf€Ö´ÑS´;m´X÷XpDXw¤ÆúX¨±n¡r:µ2Py Bv>¡È¡NX±“OZ\¡%Ðãf=A¡sc[#T! ²áU;€*ìà_¥*U¾P£Ê!'Uc,@ì6B1–Ð+ñµ½ä—µHi!KTÉâ8ôdqœGz2Ä䑞 1.ô” åµÉñéÆg’žÐB¦ZD™­m¬,å¶„&ºÑ2»Y-Œ”Û̦›l£&WiÅj!ß(N gÅiá £-œc£…sŒŠ#Ì5¦š5ãZˆ’ –ÓXÇWñHVL LH ¡YsèÑ`HhÖ$4x:š5CM3eÒ½¸‹-ÄÓ̺ׯD´•Núüžk0!l7f™.Âyµ%a£…8çVl?Üj!Þoe\½SnÝ«ã«XêûôÕÆ½b5%~µ˜-×( 4X.µÀ¸ï]{hú•%SÐÈë¥ÏTYÌ3«XMS7M ÖÎ'Ðq™a䡿ÿ½^Rrɇ{fNÍ ¶´eŸÓ¬Ù~>tÏÕÛ±ø²îÿ3ó÷;¶´·ë.É*fH [os!oNÖa1'B"xÎ#·¯–6|i›X+§»æ0n“8åsÖì^`ìžg¢Kì¼RñütaožYåwDɸ9ïÖýÅóm¦1£ºˆèºÙ˜©­IÉýØMAÂÎj¾R˜}k.íöÄO:=|@ØWYɽéôƒ¶Î儊êôK"é p#ÌÞÒ³”Y.™ÕOVjsyçÍÿL†…Ü›ï9ËA÷æ¦w$€î-*4Cr@OÊÏÎRM)é ½$f 0òåAÄ+Ñ6½YX{ñbaÝ:1NÔ"®Q°Š¼÷kų:Ò;ÓAuôyKÔØ•u‰à‰Ó¯bq8ý!i<ã(&YLeð9‡”9j¸è Ô¤÷CQÓozPêAý­5êA9=aùë–"ÔïzPéAý£õïujTÊëÉ=èÉ}R„êwŸ=ì¾ús1xª endstream endobj 1724 0 obj <> stream xÚ훽ŽäD…]rPR'~û ˜™e™…ÈÒ AÄ!bòJ…xB¼@‘UP*3ÝÓžnÛõsªu­Õt´Ûã>¾÷ÔwoÙÝ×÷woÞ{ÓÝvw¯º»îþö¾{õáëî›»Ý÷»>zýøþíãï?ýõëïvov7_uÙÝ|¶ÿÃîæáóîÇ~úvwóö‹»»ÝÃ'ÝD{ <©ž¦äyRŽ— åYexRÿð¤þæIýÉ“ú'ÕòåI9ìv¸FBÿâIýÁ“ú•'Õ\#V6ˆÕX=½Š˜3[¬TuþÂ¥tZèñ%P©ßWeT^ ¿,«‚/ - ”0-׬•š²Œw¾^k±<ÉúÄ‚_{,ô^T&±Èõµ4fë‡*áË×§ôê)Ã}ÚzÛœ>•ªEÀ.Ý>/Xð8_Áõ¨fbÑ[8ÅyYLô„z¡o:NÌyÄ S4ÇUÓ‰…STòTjm”âQB'éó¨îxŽL}i ®çuË Ôâ(N‡¦ö“MÑÏÁäñË¥hæ7v™Ê_†È`œßSÇÀ°ªíúÍo™þHb†UoЛS²íŒO †Õ¬ƒ’Ëm'¥¥S»¬:ýî¥c\˯w³~Y¥ÃºÃ'´T\k±úê¼÷‘"«"~-¡<í†q&Æíöß?÷ S*¦]xô­*V—§çHð)K'—goLc½U¬>Ò#<„)×ëñ¬I5¬\©!B%©ÛõgŒ‡m™fSqÎÃâP'7ç0uäâ(™¢©€kñ*ð¡äaíè°µ¸Î·­Ðþ¢úÀÊ·PXCìšmÖ&v+CË%°65æê EC6¬íç¼Â]gÙ \…k®Ï ¬¯!è±H7ˆàÅjêM¦ÜLÙHS=0¼9YéçM\+r‰áêX?½/ã¯V汰蛆™†ž–j'VXº™XaY9±Ârbb…嫉VôZ»<¬±_Ò Ñq ‡°ê²¯m£‡»Òoý¬HÝóJ ±Íç›OC¡á€© ÐðÄCO¡¡˜“X%Wf¼MÙQf¼«Ò_ˆ°†‰e|òX]DüØNiã94Œo)4¢e뉕¡K/wI†>}VS’aº6|I†c:U¡jhj9±24™“dh3Åoð:tÕÄÊÐç:åˆwšÜfÀÚסà€uÈp €uè4 ¬ýÕCÍëp5Éë|ÏkCÃk¼à€U€C¬=Xw0Ùº°híØzb™åò‡)Ð,ŸРfåÏèP³Æ<˨Yª¥™¥šY¦žXfYÀ°g9 )¬gyÀRö,à( ö¬|›Ù—aÍi3ûžAªj RœÐbÚ Yfl°‰óÝ#±ƒ"ÌÌ÷QÒ|W‚æ»Fl!ß bæ»ElÀ|wÈ:ÈwØà±>•=æûˆù. z–ïô½Gh,ßè;v‰å;dƒ®°Zm >1#Y¥c@h±¼Øu%Xøh ¡mµÛ¢!HQÒb7Û9û†]Bì’[B‰,atÝ `›/<ÚŒ€3*t kZ3VÚ‚=ÈÐ=È£Á@B4Xl¶¡ÁWÉ }AAOé1m]BƒJM¢Ï·² :5+<ßöc4ØÔ”ö.FƒKÌ÷šgìþ$><îOg€h8ŽÃˆ 2ðϬï°Î¯B – |/Ÿc@Àò‘¡¯Å{»[ƒSmv±yìnU…‡Ü*gìÛ‘³ë”G,·hÒ›Q" ¬i=ge3WX±¡Îféô‘†'1°"cŠò‚û¡È|hÁýPxâQlÖa48Ûn"ï/ÌPli/̰݃I¹ü“hý-fÌ>‡fÐ_ùln Å}ä°°”Éa:|ŽcÌŒaH¹Ì¦/øÝ^§Ç0}ÉüŒN?ÇV4Šã’ÏÅNy¥×…(Õ²¤SŠöè®fJI–”¹R©š%e¯TJ\¡”{÷¥*–”‘ú?¤¦©©ÿDJ¼HÁRõJy¦”|×¥h×¢Ž)Õ^¡”åÝã¥LÙ31i)Z5kž”âµ+ÅkW#­'^ÝxfÝaçz•,0_…ÅÌcØ÷6Ï#ï>}Ø}ù/b7xA endstream endobj 1725 0 obj <> stream xÚ휽ŽäDÇÛr`i?‚ç ØÝãØƒ¨¥$6@‚ˆBÄnD@È#Ñ'ƒF¼€É:°ÚÌÞÍìø£»ê_{%1:­£e>ÊUÿþÕGûz¸½yñÞ‹ýõþæÙþf{}»öáóý77»ïw|ôüðúõá…÷ß¼ûõw»—w»«¯ö‡wvWŸÝ¿±»ºû|ÿã?}»»zùÅÇû›ÝÝ'ûß'µËê™êôLý¦gêO=Sè™úGÏÔ¿z¦¢ž©±W3•ôMŠŒ¶z¦~½HFÿÖ35(2ªÖx™`5z¦~}Ú¯¬Â¯p;Þ̯íû5ÌúÚ€…ÑLæZ%p„–0šìµ\³±}¼¥µ­æ–š‡eX|ûg>#Š®ø¥^^ªx¿ôw¦uà²ÐQĹé¡ñ´Õ±>+ÑH$ÏT¼sˆ©Õgó霢xÞuù»=Äå,^SúÐÉBhù¢òú**áOÊ5ž-3Üü{«ð^Vd³Hx†\ç£[¦Eà$I>¹åk ‹+&Oíñî=Ÿ{–I {ü£cë¹>d‘Ôl‘b1¶'«=³z5S9ÚПHli8 §ÜNüÙð¦r€NØ­ÏѶd5·T º_³ÔÌ^¡ªyEY²Ëè–¶îUa©_Uõ°‚6–f½&ιÑ`~Ç~ÓÓ¹Šdºy_¤Àfú²3å«)VÅs«©©á‰!aX>o€±l©. ù×[f#HXÝb1,ø¢©’P‹ÿîËIG“0¬tì¬Y a\ßa5+8œ·Îʱ¦Ê ABØø[~š.Uê•€ë̓$¸í ¼åê*¿zë¥p==sæJ9>ÌD×ó¼S>ójfnœŠ¹EÍĹUe5Ï|¯e't i~­ãš{“-¼åFŽìÛ¹>æ¸AÈfAèr‡™; „m2ol”Ì©j\ª ¥3ûú ~Vrjòâ(%§ÈÌ©ÉôZN%£æÔXi9E° uŠÜÊœ’²@8%e!Û% ‰ØÃ Y§„,”G[rç]¨eEX9j .ba,ÎÛb¹±@îæE, än^Ä‚#H8¬n­%ºˆZôÉ·J¢Âï$¤“Â+OŠ~`¡—”êÃ&> L|ÓÐhÅ'h7ó´IPb<ó\/1‰~X(ao4jñÅJ+>¼ÝD.>¼Ä°ñá%†ã/1||p‰ Lþ °rl|(V#÷Çj Ö‹°ò†ÅŠEÆjäQ@± ,ê0V< (V‰GÅ*ò(  ‘ ì\ŽGì\ @ì\‘­ pç `c‘ Ž!©°’ +1"Vb< Xb©°3 –˜H@°Ä| +1ÎÈ ( U¨1@Åñ “kµMˆçÕk„=«¥zD°ÂTS¸¡¯´TŸ\­¥zBôLH=, ô!Dõû¢z@° ˜êÈý Õ'¤ M êµ–êË-LõVKuGPP¤8"*Œˆ XÚDD…Ñ`×Z ©Õ1¼ÆëP£LXcÆÆd "hïW#*TTÒzˆh (h‡è‰%30ú0™{@l‘ 6ª÷ ˜Ì ‚V[$>¤¤!OŒÁ¦^Þuo XÒ øA2ÿEÇ× XxEñ -à Å èh0ÕÏ,7ëž?»b¡´ëHT}ÆBa½uú°ÀBÈ®RNìžjZ•ùsã¶¹©É‰4!'’O7]üöÀf—R}qZ7óy9qý€U·h+M.<¨Â,L¿^uœ(ŸÝ¶_…Ól„‚*̺Ä,WËqÇcKXÍ jf£€.°šrÇua©X-cPÞ·DüP+»oAÏæµÙìü$àìD?åùæOJS„–ÜêAS…ª"ŽoÌ|.<*¾Å/‡ŠnAñ­aŸ5c!Ÿ÷ßjJÝX”ÅMúÿ¤ƒßï±Råý¾.ߺ²çR?Páʧф–¨§QÝ”ÿùË㮤jJÉ2ã¦*-SQÓT}¦MSÍš jª}·MyMSÝ“©ÿÔ}2õdJÝTx2%胗iJ­ÈÄwÝÔ¨iJ­¥¦‹45éÍWš¦œÚ„\ú><Ê”ÚÆ;ø‚–†I/ {½Ì±z¸wzŒêeŽÓÃ=Ô—HƒâjꮘЊ¼kV¿ámÄÚ}z·ûò?D…w endstream endobj 1730 0 obj <> stream xÚX XS×¶>iðä8‡z4´šCÕVhqž[´¨×ygDEæ$B’’ 2 gqëµÖkK¯­¶Ÿ•ªµÚw«vZ‡»ùî÷vzË{Þï=ørIÎZëÿ÷¿Öþw$Œ—#‘HzÌ\>-xöÔ÷§Ï]¼xZÈð@÷k£ƒˆåŸßµ”wßbÄ~±ÿk¢B*ööêÏ0’=Ý×NÝé•yÜÃ}}^ø#½/‰„ÛªµŽ  1=.>%qSd”Ò×/Üßwøøñc‡øŽ ï;5&"qSxX¬ïÜ0eTDL˜’þ³Åwq\ø¦eНߤ(¥2~°aÉÉÉa1Iq‰‘øñMÞ¤Œò]‘‘¨ŽØà;3.Vé;/,&Â÷EÙ/žL‹‰W)#}çÆmˆHŒ¥µ¾>”Æ ï4•ÅÌ‘.`I–2!’0n‹W¢Œa¼™L/æ ¦7Ã3}˜¾Ìf 3ˆy‡y—Ìø1ï1C˜¡L€û~f$3ŠÃŒg&0Ó˜éL3ƒ™É|Ä3³˜ÙÌ\f3ŸYÀ,d3K˜¥Ì2f9„2+˜á¯1Æ‹ÛÀ•L–Üymòk'¥“¤u^‚—Åë~§ÙJÙ7ÙØýì}™Rv“{‡³uÛÙÐ¥K—„.O»®èz½Ûän{_ïýúCï o‹÷Éîu¯ìþ¸ÇÊ»{NïÙЫk¯°^ߨøÆcÑàK›$.‹«ªÖ–î:|8ùøp€°>*¿cÈ7äë Œúœì4¥2Š )û:ap ޾ÿ-ŽAù’¡ŠDHÊMÊjgÿ~ú=œÀ8JA ¢Ò‚*0G%8ã)y9 äðÈA@\˜&| 'w>qörþ%¸Í]œG–+–@ø–ø…¶‡æŠ’C{¾ú¬ v@µ¡*Ý®·mÀ¹ÀU"€Ö‹ü$íÃæ»U_}ñ ùùCðÁ»%2ܧYœU&c[^s4–êŒÉ&C,hÖ‘ÈÖgr}:U¦ž‹ßÅŠzvìƒâCQ*ǽlíû®({òIð9ÏpôE\+#¾Ë—+jpÔsfÖ–F‡ò ©•“Ö±³›0²Yò¾çP¢Ð2›ÌÐnZŸ´Ë¿†ý;þ¥g €o¡bcþ£òsg)b &› LA†’ÓÆÙÐÀT¢YH‘–²/µNJqî)ö6Ü1Ü®®N ÙǺÒõŠÖþ¬'ù#Orqˆ§QŠe'•°Y±BŒË!™RÜý†T ûcè¯/²œåQó§, =ÊÞ‚¯ ·€«ýs–×;f9ãIB;ógô}‚µO%ÅÁ‡i‹-Ýj(ÈR06[gÌ‚d9¶Ü|Åw¤7›•L§/%bÉoàY“±”ßÃê+K,‹ÉBõe³æìx.7ÛÌùY¶˜Ò©û}éçw o‘DØ—Hi“üO÷ï®ä¼ñ.”·¼]&yä“Ýò&ßVlÛa9^Öjõ|øì#Ç‹þ”_W!äƒÕ§<ÒóØTÚêdr‹\’ãòMƒÕz‚á$JC%9Wª.àó [^ {è&ô5<?/k§÷/‘½ª&|ê‰S «4íZ­ðþgċں‹'°»T<‹ßðêò£8›U¿þgõ9ÒoÊSGC pã:†«ñD‹Í²Â5lj´jr¤A¾c]ÔÒß*Øq{ã ¹³ê<ö³WsæÖbÏT}qãO•cÙDH4¦®oSùË‚$´ ¼Ø2€WŠq€W'¯0ËpwëÞòð½P>?vŒÏFd¦G ­&™wË"ªB¸ƒÅî&ŒÛÝ" ËyÂâðǟѾzßÿ: ˆå• ‰ÝÄK<ö-š?#X;‡¼)o,f=A6¡ÊÓ™e4¨˜Œ_ò×Jž4öà0”ÄÀÑuŒy²=f)Je8Ž*N*„ ð¹Â–m‡½BëüGö‘!W¾zÖ‚´¥¤;]cúŠD¬ü…Nœž´ðžR¬çò*ÛÜJºÍÝ»—W«¸§ÓO­,Õ˜MV*/›ÅRRò½<ÏA7] 8LæÄ¢ º¶àFaj2_€ «w&ŸYÞ˜y;åbz…¾"Ù™Y®†nèhÃfÅX˜Vz<Ãe„\ºë f”ÜHw ºOª´o¨Ï«Ã÷ßÀat zûn0mŽ«ªYü£MŠxûI[F½hðöÅ+ó§CÒ›p[®ü¢ÇuTê(‰Ä ëñ dqZ-Æ(Úö·&ö·øKŢ뱾Àe¦˧REh m TШI_2_NÞ¹©•é ŸqlšT­ÞèÌÀ8r@N´ävV†‰Ú0eÝvn±ûÁšïÚ£1Kމ®DUên«»lQ%T`×;rmÜË °‘Þ–ù- Þj³P‹×–~«†-áO|åQ¡[ãS#5û’÷$ï&pŒ\¹_åˆn›¦¥:‹>?‹[;ËIê %Ô9˜*ó+´Møì3É>j&RæÄ x“Çdˆ9T± BsƒãÔYzhA—¿ÐœmαéítpYèÏÑã§+þ ÜùÒÍ „(Y)1’Á3.N½/ÔÂ-gãM.ÙãjxTGúýÎ CX|}ƒþ‚}·™éË4ûƒ& £Nûá"Z.{±t;Ê÷Ke æƒ'BÏPÉá&À%§O." „ñº:+“³„ðE®½•'€{æL…!ÄKƒÄ]ÚbšJ£½woK¸A®>ÍCaî cg1:3¹T`™™©šUëÇ7ž}ú­í»çÂu¨ÙVãÒæÑÝÓ yfkžÃy‘¢§6Õ±²"Æ9ƒŽkÿ€d:™Ð<ßjàóÚÝ%T&ÎàhR\Š>R1÷ßàÚtI’ekŽ†Ú·Ð@k,Y±ÈR\!£®£'¸Å™µw;_óTqY±É‰Û”Æ àÞ…G·nÁcôö@Mf…š&tЄCÏa¿&ºœÇ[®–Ýú¾’…–Ét;z墤 §7Iš)0Œûð'Ù—§•”°Õpèºâc(Ë*ÛjÏnsoEà,NÈ ÊdÞdÍWS'ËM!ÝRÉ{ÂD™Ú}¸¨¥@~ð,x»r܇õMØ%'šp~“Ä=Þ-Ï¥¸êI]|š+ךZÕ`7ç™ó®@9pGp$àx.«ê² ·CÖZv£8‡-ß.€U_etæVA^ í¢ÐŒåª}Ë­ë€ ##Ðû C6Ço„  ‡­ù›Ëã59ËS`l)Y~-öR S#pWp1PŸHyKÈÅ.ü CÃ… –ƒŸn‰X²Ä°a†pž$óßI‹ &,D‡ûÂçû ’ºL¹ëÖ&ŒO¨0&¹iÀÛü/k¿£ «g¦Åq&j_Ýž!ž ûþòá³'ÊÙíé´ö·¼ÑAÃ.{ŠýiSùHŸ·ÌáÛ,ÿjY´3ý€â,{Êéc¥p˜4th5ò¯ŽÌ»#¹g;ÌìËnùÃêF¤Éž‡´¥ñ¬ X²9rÖ¶ŸÆXÂ`+„ÁšÍ[”ÉÑ: g:Ív0^ÿçë §Nª—¹qþ?ßzÁð+èk>Lÿ¿³þGvÅF:G¸;¬F»C— ŠÇq›ÉX2ñƒd4Û< ‡ãðï›pœ‚ä’±ZåÌü_S´tY±Ö^mNn yÈ@VTÄÔ$ÕEÔ]ÒîÑŸÉ‚µÜª º е°¸hÕE½Í`ÉñœÀsŒi‹èÓ”¿+ͦ ©‡a;pg°—ýhm~´¶¦&”–IîSû‹±t2=ø÷dq׃l‹Ù8¥L»±ýk•2’Ͼ[¿î¦¢ŽÁÙÒí¶Ë;èÆl1ÚsÊõeÆü,: L¦œmv¼* ¸$ÍöÏÜ먽*ÊÿÜÈb@çA2e³¢-Î)>§À²ö·<ív@æ{9æWE |÷¸„¦·hhkcIµ¸X*F‰Ãx[±ÛTq»A£P³a ÕdÅù‘ r?¼ +×U¬Ÿ$V“q5KF[vmí$/ÛGÐÜ—ž£îj+4ž¨U-s¤-áâ4Þ°Û=WA†!m¹êƒµ$P³h ž“çTè*WÓù¬„4e–f-™E:OÄzyf­¶p=pÉìVêv q¿·ö–­®†]ÀífÁQRx¨òn=]‰³f³<Ñ12¢hUa¤mëiàþƧËY˽DV%.“âyÌäñœét¹©>ÉÝ:62 M£×Ï•ªŒ<µ\kV·–MW¹Ý•Žži³ñ},'#Èò]®²}Tnwu”º«î‚ýºš»yc¿Ân¯‹¯õþoØ endstream endobj 1732 0 obj <> stream xÚ=”PSWÇï#ÉËcÐÕGôM¢e(*b,k©(Rò#Aº¬:C„h²T‘â ð«¢Ô­Í ÔZª°a ?´Dù¡°JGÔ»Ýn»Ó=/½aº™ÙΛwÏ9ßó9ç¼w$#†aäÉÚˆ¨Ä¨eÚ¸ÄÄ•A3'«H寡Î2‰ð*^c„×Ý¥HxEü:BŒfþŒ•xR‹&çÍØeÔ°~‡Ä ÃíÙ‡5šÀæ-­yW¾Å˜žaUûé—¨W®^ä¯~K£Y­Ë2XŒúÔlu\ª5Õj¥/;Õ‰f½Ñ`ÍWû­Í°Zw¯X‘——š•`¶¤¯[â¯Î3Z3Ô› 9ËCš:ÒœmUoHÍ2¨g¡fZsÖ®\«Á¢Ž3§,Ù”s^Ò U( źţM(¥"=20F´e3&—â{¢ùÈ ù!´ •(¡p"i–Å¡(%¢$šëå†$F<Âè;&„ÉfŽ0?»º¹5‹”"“¨W,ûŠ×Š-âVñw’hIpX§ñ8ót\ëÆù5kÆY¹`ÚkúìÌ•Q( ZçqWÙ/;î‹©ÛŠ£p‚>+63ú`$^Œµ•Më¾z{pÏ׸÷4^¼|ïØ~Ê‘r™ÅÖÇ](l+½Ç¨ÛñIç§ýWë¯àaüYXÕî3É8'p˜l%s•3U{áŽBû™¡!Hš¯ð„‡Ò~r×%¹Ãž½ö…íæZÚôDJ<#ÒßWÅâø/wwd&*Z#FÌ=˜îÙ¿@žÁ/–ª2°±0;‡“;¥Å í…ö3½ð‚vc‡¯y²%<‰†M; /Öcލߥ°=?xMu7ç|£¯WÄ\Úqú]êN&î$‚D“wÁƒè`£ÊÎöÚ¨¸×9Õ2“”õ'!ˆ‡ h,cÉ#ò›~ šÖM@®æ‚7ä’_%Ïé`âá—Ù„Ó|!.,+Ä\²ÓƒÆ óX¹³gVñéaϘHø‹àÎo!‹Šwï .Éô.c×–Ôím?x±ÈVÔ@ü„wÄ}Z÷@p–³¸ì¯؉®¹ŠaæÀdÕ§ç†N^ö>qñÜð± \¹‹Œ9u„£ ßã:¨ë†ë·˜'¡mLᲞƒ åSÄKE fЯ±°~âkÚºŽÈTÄ ®SŸ©ÀM;T¿¸E1•0ÆW”ƒ¦£þÄûŲgÄGI¬Óº‡à€7YXO’ Öå/Èy¨†W¤° E›°YJ*¹S<Û±NÂ’0—õÐþ+^¶[|%óɇ7 ÛÁ]ÈBÕ´N2I’‹í°¨”g®ÁFºU4ñSÑ+•à-ÅI™ÇbçÎ6_¸‡¹v[ZœÊ %¿?ôæ6¼–Ûq.ø‘ò þGEw3÷§ai((xœs²òwh*ݹcÃev€æ¸­œ“ «Šûà~ÓH+ðÂ<>¾­¶ðˆéT*>@? ¯"!,‘=öwÕ|£þËÏKn+¶›Rò7c.äß>¿×øìGU'¶hÝùRËÁÿµ3ï‚õ¶HxÌd>Yð½?ˆ€úæ)‰žòºînsÏÀ­4L¢Û£’ÃeVÕ3#i y<5Ø7YA;Œ-Û˜™þ>7áZ?Óš‹VïalXãÁˆ áã¶Uda.âm‹¯ û‚[îÅ’ÖƒíE8…{O‹ ”zœt2¥©0ZÑeê,j¥·Š§m¤K…ošÿ|Æôyaåê÷Wüñ$náºúði徚w~Ýn^q7¸jÿ? !œ%ذÍY›bJê¿R‚#”ŒHCΕ—ðýªŽ6.…Òí­ÂO©¦¾†%ÛOH•â|³Ìý¸Ì£\6Çî1:çÖQ™l´J6n/üËQL endstream endobj 1734 0 obj <> stream xÚ]QmL›U½/-í tݘ¼ÙF_'$ H)5ˆL !0ä« FùXâ”/-íJ)C·0æ–¬†Ó:·)PYÐmüCW@¾‚Ãn˜ˆ:-SYÔD|^v!ñÅý01¹97ÏIÎyÎ=—!R)aF™§ÏÞ³;#,Q—“©]g¢tÔñ¨t¥ÙSØJ„mŒ°ÝC”OJ·ÂxûŠH–7®ãýMë&‚4r3‘2 k? ͳjF›h¶ÔY+ÊÊm|HñN>2&&:œ×j41|‚Éh­(6Tñ:ƒ­Üh2ØÄá>Ç\\a´Õñ!±å6›eWDDmm­Ú`ªV›­eñ;ÃùÚ [9¿×Xm´Ú%|²¹ÊÆgLFþqhõã+Ñl²ÔØŒV^g.1Z«Ä´l£!Z’D0Fb"V1®ñ&¾ä LE>™d’âãA"‰× 2éL+ãöÐz´y¸%„F¥°‰:ºéÏ3÷\|gåGCi€‘š4H 0˜r¬SVÒŸy¯=-?5<7à¿0hjŒýOŽvQ/£C1à,ŒL*ÂŒ»GöiÙh\õ¼¤íPƒè4(E'êØÂœ“¹êÂv—DÐã<SwΡ4î½`ýq ·áÆT$jU¤ŸÐíc[3¹®Ëý ;úõ~êK·ÄeªÌp¨£îíêî“]Ð)>÷ņ1|8Æô‰ý#áö—Êöùܹ¥ïÜ¿«¦àòkƒUg'ü³{+Û³€¥qTIeÔoq*TC0röÖœjìivüëåÄÄaT8™¾Áã·%BÖp0xrôå›fv·W‰rù ÝBý BVu n½%ª=ÐÚÜÒô.8²öe7A<¤Î4-³§‡¹Î©ë7oCÌé|Z¬ñt ^Næ® ÖdE‡ÃÜLÝõ |^Ê:\S7®ïʇ(Ê{ÕÎÎ$­æº°U>yqþÎâ¥ôúÿG¹¿=#×[+E3¸&na§äšæ¼> stream xÚ]P±jÃ0Ýõ7¦”"Û…NÆP;xHRâºÊÒÙÔ’åÁ_I6:è¸;½÷xïhÓ[­<ÐogD‡¥¥ÃÙ,N ô8*Mò¤~ŸR·„6'nÏ|B —ŸšÙksºæÙÛýÆò8lˆÛjŠ}nÝ:{œZ=(K@¯Apön…ç4=¾ÄÝÅItJp¸7]Út‹µ¿8¡ö‘ªJrùfI‰³å×#’2Ë*(«jùï¯Øý Üd‘u „þkëßoGD…õ™T,Îé)]4¢4>Of¬ôþôÁo• endstream endobj 1737 0 obj <> stream xÚ­zXT×ÖöæœÅÈä$˜3X{Q5vcÁ‚t”^F: e˜²f†ÞË00´)T°ÆDã1jl1ÑØnb411ûà&ùþ}5ÿýòßç~ŸÏøpØg¯µÞµÖ»ÖÚ{D”•%‰®Ú4ÑÇ‹Æ.X¹vò$áÁ4lx¢ìJ²æ9Š—‰x‡~üP1ÿºÕ[%:0Xøì7ˆ|R÷_>ß&ã¯ØR´H$¶î?8>9sÓöÕÛ·û¸Mš4u¤ISG…n÷ñ wå1ÚaòÌ™ÓÇ9L™4i¦Ã¼¯Ðín+ÝÂ}½ÜÂÉ/þŽA۽£FÍò ~âĈˆˆ na‚B}>=Î!b{¸¯ÃZ¯0¯Ð^ž‹‚Ã>v ðrèÑBÏç‚ €`y¸W¨ÃÊ O¯Ð@¢q«~/‹‡ŠFˆFöûÊljî[ۆēÇ*‘Z¤õ§¨@ÑËT?*‚²¦$C½Dõ§P)jõ 5˜²¥¤Ô«K½F½NÙQöÔÔ›ÔŠ£†RèáÔêmêj$5ŠM¡ÆRã¨ñÔj"5‰šLM¡¦RïRÓ¨÷¨éÔ j&õ>õ5‹ÚN}HÍ£æS ¨…ÔGÔ"j1µ„ZJ-£–S+¨•ÔÇÔ*j5µ†ZK9Rë¨õÔj#µ‰ÚLm¡œ¨ JC%P[ûQ"ÊŠRSDëú½Öo¿x•ÕB+½µ½õ7‹„§×ÑM4f29ÓüÒ„—ä/Ýïoèûå‚c¤t¸wàO6+l ƒ<Ý~Åû•;ƒ?|Ìv’íY©—´éÕA¯¶±ýÙ’×^ {íÚë%víY{¥=~ÃïÍ·Þ¼:ÄuÈþ!_¿åùVÒ[g¹˰•¨·jC’㔊 ÿ,‰‚u’“œ¯©ÕìeB%|ª`C7á;¡x®¹ÝÙd–Øt%…ÿs— ¹…:o‰ù.þۨϽÄUXþ˜ã_!¹¤WøÈºËhâC.Ì_Ò`¸»w_„†#,aô‡šÜFÿêìþâïVØtyCÿ»EÔ%­ó ºÂfç@è!]•®NÃnè Š‘ Ùpȧ O!v!¹uw§$Lá2¤Çâ$\‘¨ ¨í9PÈñ’j¤ &GáãÉÄ܉ •ØbmAé&Ñã3Èû̽›b~?‚E´÷GŒäÖö}œ ¡0%A¡LxQDUM¡±¢Ñw—#·\½RUMŽéÁÀŒÃÌFLɰd–ÿ|‰vQÀΟ®×Ö›Í5MÄ6z‰öÉÐ%äýüïͺv}uK;´¿ï¤ç ¶ã:ô˜EÖôýoÚ>çBu¤-­‰ˆ‡ PêB«’Ôñ ¦i¾³Çÿ=ˆ¾Õh²%V¬¸»ìŒôºNÌØŸï.Ãåÿ½.¼˜Æ¶I1Zòì¥×5Z Ädú#kɃ-ŸqµÐ˜h w×(ƒ †ÙQ_Z^^Tûɺ¶yðË›°ˆû7Œ}¦"R= úœ‘Þç¥D½¿{‘ÿ“öQZK¯©@«Séý ÜAÌ0,rþï L# ‹w3î}½ÿ— UP”¤ŠI„ˆÊŠ-V26]žw·¾O¯^ì:ü¯ÿ&xžê-ªdpRÙK¿¥þ}𸩰Ö#*6¼Á͸˜ñø%å¿7>ÿ«—öýðfó'\4¤Vyj’ äy1%©Œ ª…Ç×ÊøX£íÇ‹k¥<¼ØfÞÙº>¸$$$8j×Üí¤‹Õ%ç}ÒuÅL3žÄÖ„U†…V„ÕÔTTÔp6¼š—•íDCÛÖ£rÓáCú'Ïß`O†íÛæRÜÈ¡ '#C§×éHë!N%¿”+V&$¹É¤|νþ5êÏ¡ ¯ýg/]ËÌÄÜE†»¿ÔVmÕt ©I;j¥F%è4‹„fŽ0Xâ´dV"ã:XÜAOMwîˆÿ,M›¥M¦ª´´ªzgI¨ÒC³ESODƒ“Ë~ú·ìó÷à\wéHÊöØë“í”ÇHÿ(Cåôwª®…Ž*F—LHDT¿9¶Ì°GwP÷—žÇVÌ>ÿ­4'.™ “`Q“SIônÏ]ÉñÌ]+<¨RuŒp²ý³«YB4:š6 L7M¢cŸ¡µfô¾ð)îš×åÌfdë Áä&e+¸DHMQ¦l^¼$x>|+Íë:#‹wú3gátüøÕûÏ¿…¬dPí;;?÷>”Ú_C‡%#M§µë^ÿÇä¤xH !Ƥ.ôiY¹Œ™ŸÀF,ÍGï£>Ï/;Ü1o¦6.Ø(ãWu|ዞ\}sáÿ#–#Qö,8nôÄÜÿ㸰áí°¡ì‰£Qôà„}‹SX0€>ºF¶~h  ñ€æïFóÑ 48?T“©2( J“¯ÆÒM¸_Ãt˜‹ÅÖ'ñ Ër€ÉH3dÊžïbÈæmÈÀÂe¸Y¯Bƒ¦}NܪT©”2Pƒ¦4ê§QÇñTÀ^€çxã…ølß«¬2M•Ap¼ýÅ'$äP¿<$†o‰KKf”¡}-h¿QÄ[·ˆùñ(šEu’‚R0#!N ùzI”FD@d‡ëq= ¥P Cä7IDPZ Š×÷ZF}©PW{:¬ÕãžE—‘“¥×ÛétÚ8,úØÕY©$´®êÁ2ïÊD“Vå¢1ªA«Ø¸d ÝC ¢ÅhÝáæy@Çø×Åü2‰éùþ½‘ªDu"þçŸóíRãEvR.Wi9††¼,7uÙ™DÍ×QÖu1¿ gájêUß [œYä«`~ˆû¿E©³á˜›6¹uΞ÷ÏG„#ðuÙÞêΦ_†+ öÁçYOXmŽúQqî’fæ4œÉ:RŠ^¾˜m†z8U:*ÇæÀ ˜ ‹ËcÇ­ pA6¡÷&Ë^âÚà bÔÞõ*[úpnåò©@RÅŸ6’­:+™îBÚG0™óÚ›ÐÒr³§ ñ£'«s›dÂ6—Ðo¿ýl±=ôr½j&ÐK/±¡Iˆ;yÚ#É䫨[Ï›8ÅñŠòZ+£*}¹d!4´åŸi:Ì=ïÏ”Á›g­[‰×áv ¡3 c¤¿ñ4iKæ“¶$5 Å516%y©Ð‰ ÈUŸC QŽúÿü™Ù¶ Y½÷ úàîœGRL¡=è7ö›ª_x¾™zlì;sVÍÙaЬ±M5‡œ!–³<“ßLëQùd$hÖ„¸8mW‡j“µašHÖ¦h!‘‘v+™PÌí•|Ó´x4²(ÐU¶ æû~Òj1Án¦1Øæç:éÞR$B6wîüÂáðÍŠËÃËzñEoXx7pû%0šÉ¾+ttó¸þ’VC'´µ†Öç]Í͇–‘¼=#†K"±’œ€Ovo·ó§‘™T-µ©ù—¬{ Gý~B+Lèõ붇8YPä-éïüz´•E/Ï|ˆ)Î ¶Åøø2h#mTÖ§Ô‘&wЗwò3Ôé)2-A5U‘´%b xÀÖLç²dƒ†˜Ìf ÌXÆ`•Û€&_UJºûØÌ †¢ìSùy™—!Ÿ@é!QÄÌÂ"ùŽÉøÍXoè\öï‡}9\ G G³Ž¤•ÜØûYoŒ¢GÅÄêCá{QåÞðCÒûh:¿•ÝZ«ÚÅ̧Ÿ·;zãÖz:­òeL±ìWM;á swÊñI#ߟ7ƒ(½K›snBS¨9š‘>Z8ÍF1CYò²þáúï4*öyµE–Åä,oaFº±hÐìêÈöøØ~ÞÜ3§-øì:'êN×Þ«OãÝoËù‚–ÝEž·IàˆÑ9ÖÆñ÷®á¢a½>x³7«¦ØV( Hò\rÄý;RÉlÐäG¼€L˜þb ·¶Dmsqw wƒ¹ üýhRÕ¤¿ ­må'üʇl lÿSQMp¾j/kª:´;¿8¤~{±Kž_Ú ØÊÌØ>f*×ï(¨by›åX|Ùê_y·‡ñÑ\áMÒªEš¤?¿øeé½Èn1Kæ‚ÙËç¥$?/_]ELæÂúgõ!ø_§ËÔåê³2…Ú„ì[Єѱ®ñâ®è*[ø´,uÿ(é+C…2þ¼í+X±²îJbŸ(²ƒÂ„^2¡ÓÆSÂÿ$ÔuœE”YÌGb \« ç¢%1¤Wfn=µ±À˜ã&`[lûÄG²#p ¦¶-gcgän`¾/xô;ŠÇs=ž†—ã1x*v«‡?DβN8yº°2 h€"&'m…LÏcBØxÒr/ï¡Éh1rDÃÑÛhz ÍÁý°rbÊ䥾ÐQ([´Ÿ…(PÅít]±IÌ‚U7‰?¹q^Vbó# #E1=³-Úlá—Eu]óÄü°®lj¾&3b@­LÃÝ?ØEmòˆ]¯%%¤\·GßhéÔÔ =øæPs¥ º~?zÝä0OF%¨ì!˜ôì†/a÷žýÚ6²>Š^q™Šz›ø2íáËÖXN†ëMD3&Ôl±E²ëèÄýùIÅ åû±HK×ë3Û9ôŠä~Ã{–o™ŽÅ²;IìýÒ³§ássâ7ø5®»ß³¼‚–þÖ7`óC$Èþö­ÊàæÌ‹XœÇ¬ÄWXÆ›v¡‰ÓN´q×§Á­IFüŽ>ÔÀ¡L†ébÈTp*Púß<ÏλqÓ¡±ÀHïáUÄñSñ6"? ,]"‹q7xéCqC×Ö¿‚~jÒSƒúIÐ,Ä¡Qh5Z‹ßD“ñ~õ¶Ç"~w/R%ŸÁYyÇÂ=«³§ÁlÀâÈU>["‚×®y‡Pd×,ôI ªï=ÈØbFcͳ ¹Ì>rAÒ†rIiÅÂçã¹$Îìû 3Þ¦ïçú½'3£’PÉ4…ÿn2J‘ôº‡•Ž´j]–==•8ùÔ'6]Dh»íïºÎŒ†“l¹Ò5‹íÞÿ““ËÐÜzI¼ì ÇA~ƒ ioÐ?æ<==qÇXnÊè=@‚Æ€Ù±sŒpNc–[’Œ(Ô¿ÝãÎ÷nù6HcùÛ§Ø|y‹©iÙU(Cóéæ´ôÏ9 í­]§ ðx|Œð¯£o޲崴[aiRÐ2¼¥ußn®?Éýw&ñÈ¿u­_Ýú#£dã÷ðì†Ýлx*Z+“Æž‡«•»>é˵Ï,h—å/GI¿<=J’øªç—×\ð%êôŽÇ(žþ›ÏCäE‡J¨uâ¿=vBô…ß[b$Ô1ä^á*a³ÀËsV°JúŠ¡O˜Z1‹ ¶º»›¯ôlBÏR [ñ9rÓ dÅï´ˆZ‘}CŒŽ¢QìÄÍŽ8%,ŸLg^mec1H¾=ÎuÞ¹U·d¿Àù/s/ê²YïbøÕtkœ"®qÕxiݦ‚ÞHÿñ¾?×”ÁOgÑ4/+ëpÇ5½…QûA°ÏZØNÞ [´á1‰‰É)ø î´Cçþ . IcÚ-ÅeIÙñ`à „ÝvkØÝÃnôzØ™°—8Ùš8ÙÃÈs½NþNw”ˆJoÇáÁx!03{sН¥wAÁ\½E⣞îž³_¬_"±y2ªÏt‡j¾âš)»F³I&5ÖÏ~–Gj:œGŠéêëëj#èÐ^%ãu4RþÑ/=>=)ìsÁ•–‹´]ítÝç$Oo2|ÍÍÿ€¦¿\V<Ï–„hS¢pP÷I»ž`îõF5?³ZŒb»¦°IyZ]$QéCÿI!µ…ÚrµN ‘LwéߨVL§§ê´iJ~\÷}»ì6˜È,•ñé*hDÂÁW»E³cǽýœƒeÝshòÊ®é•"’ê®Ä]^è.‹¶á±„¹—áÅx<~»“,œ€'¡Eh‹¦"‡¿gÇâ7¾G(½óÅõ›høBœKð[Ó'ÊzIrw%:%ðñ-ÔþHŒ"ÐYÍ– ˆºöð§Qßã·døñ_ŠÎßD޳¨¼—›oIÐTºÅ0…§ ÁŒ7<:kFƒL|ÙöØC4΄F¶>zj‘þ….±ëØê< hå#‡kwï£!Óp³ðС³åÇü­f“ÿ6wçGê4 š˜ÃnôS‘ajSòþš²úfÒr˜Ür×0­‘,êø;ô* ±Ì¿ 䂯žZÆY !£&›‘þ©(W0ñ0¿”"ûŽÈUÈ’€LR‰ÊõnÛÀBw…&q.7¬›P'©ÜÜ ¤EÖsýXIZÊpá47†rÈ3rô5`æ6²Rá·…½GÉƳ÷+. —™±ä[<’Ãÿxž†s$ÏõÔ‚§™˜hZúG´AÃöÝ>àK`x´zµúUÖs¹ø›ê È—‘R¤MQ.ô %“BrGܽø«vQ§·Ô¯+%ms')ø“ªmU†œF_œÞP)=~áíXüªee¡ç8aÿå‘O/sè0á.:%(IíȇôRÚÚKú) Õ¦$ø®µ ¨qoB"^<}êPÌ8<ÿrp®ª#áKÒÚß«J©M©ö. ÉÙ;˜…›LçaNú†ƒkލOkµ9ɤcâ!%J†éhHÉ%sšNŸ™ :ƒ¡þ°eûiŸ[d>yéêO¨ŸLz.ýfº‘® ,üÌ24¯IÔhFY·P–YÜ5A¸A’H,'óMšVXÆB TBަL g°Û!nç!Œª¿ÀþýzFUz천8© $-W_¥$L pGžÖST“Z¯÷’Y—E ³óÁ8gÜߌÖrüà¿eÖ4ŠL^ç ·ï#‰ÁÙРót=ì²ÛGë¤Ùîë¤÷y–݂Բ®¡Qi—“¸KÄÃ4UÕ|¡c,´¿ÆC°F",îÔ–…LV+5J¼¼{§väõÊRLôö5ÇÁ,l®^^NÛz7ÿœWà…b»ŸØeF¦«ó¡ôééŒÍ“¼^y%OÂÄO†y%Ç÷ä4‘ ñ×.ï•÷­qD‚RLäév·ÃïòñÚ4M¤Ûמ€Êy‹ ÛôîÂúãPy>¦ì°¬{žÆ+Èl †®½i©yÞȹ»ËÎdHÌbFfZ>šÉ§Û¡÷»3zÚ÷>ežñoE×Z1ÿÿKf€­¦º]u·„jè©uÖ„z8Go54É J‰MŠKðl;Ì¢õCj¤Ù“-Þ#à꫞^þ+uÞäRú(”¦”¡Øb‡gàÔ¸ˆ€­ï€=ièumúú¦£=IIoÕEW‘(Ë6¤eæ¢aÈÛMÁÉz•Aj{HGoF†ÃyØÝÖ;DÒagúNËsíÑ·7Äüïü·lÓ§Ÿ¤ÕAŸƒýûüÛZ!…2^¥Ä3q™^Фä—böeæ´}=ÎO·­:7²¼„þ²E!Èÿ`‡7¾IÂéÕ9Í2´ž¶áìâÿ´ˆÎšù•¤Jïí É™L‘’Ô÷îuEO>e"ëÚkhÉÅÉ’nûnœ¢-$ÛG§CÇ»IŠ‘‘´ÌÉX9¯$T0C"̲†–'ãZD¨‹eaÛ2æÉ¸û-ø­?ciá&{<uFm ëËÑ€ ‡ôOdæÙÊè*.â•J­F¸¤b4P&ƒºÌ¯N}–×wÚ›š–ª˜1÷_Uá²§¡¤ªR¸JøÏ^ü‹ª/U§v%±ø-ûŽãÞ y¦êW=Jòd(ÿO•$†+LÑägª¼=ùî~“mÛ%§»húÙófiÀatãk6ͣʭ˜²O ®ÉŽ…:ÒkB•Šª}ér¦ å7û4y6o.r"Ô"ç¥ÆèÊê#™@óRë·êªæ’ø9xÜsŠÌ›–î9¼Iý‘zEÀÜí¡Á•yÿ~è)ŽH9û[JÛ™4ƒI[°Ýe‹{Ã!޶]G33„Ê 0)Êøá&äÝfûø,*º.Esù,ú’Æ#Öþô—Y)[dÝ÷Ì´N—UPÕÎH†·m¾@bãå_B,’Ž~€%¤åŸ Ûœc¢.b‘;MXG—[Ô|ìhVìƒÆ ¯JwÃZpoͪ@—þ^;Öƒ øT„5Å•Jˆ&«fT·Él»ë:Úx7N8…} ²hú7m‡¹l8¥mðqW+ ž )‰¨®4×~1§ùC ûv™ëTf…Ýhˆ":ÀÉE¾M0®2lwH«ú8´B“þd;2Ëîú#Ðm±—ÜhÐg=F”¡ù&Ûêë(éLÏÙ³Jg3ÐèoÍ»€y”ƒßô”á¤Âµ‚ÉeÖß'=53q,#6¿ñÛD#›}H\š“¬OlVj’}GL†DØ µáMà 426èDï í»ßf™DÈêÌÝ›b´€_À"†þþÀ½/¾oò®ßðÑ{†r˜þ¿n._p£."‰EHuì^ŽÖžø¶A¹mugÄE4ÿbC§ë éï Šæ²ïÂÃrTéê ÍYyåÕ-ÀÜ„‘ᤧÓúņ&'„yOÒ ¼ØØÔª.æÞÙ³—dÐÓZÞ¸«1½DàC0hªT$0Ñù E9¥™åÅ už$I]•nînõnÒNX´èC¸š¼Ì;ãc£v€/#í¢À?ß˱*Úox0 ¬C6¨ÿ¯—9hˆëØT½¡z | ¡° Rt~i;-@¼;ŸeßYÔqXûw7í50ŸHn +˜¶~áæÑ²Þ«ïžp¡~g‘×Y1ê÷5ÛTƒ®C_UÙ©Ùõü wýë¹c§Oå®_Ëá8úEë6ñÚZ9Òp,þqÅ;Œk`:¸®ŠöbУ¿¦pôHÜÚ†>¶½øø£3Ò{è#þc;+>ÏV’Ð5=•Q§;¢¯hh蕱T•Þ,“þœÆïfëBË‚üåÁ!Á¦Kµ¹¬ŽPä ìf*úžëÙ×ãnçoËÎ.×[Øyœ°ó¥lh—¤i˹TRiCò ÓŒPÅTFƒ‚¢"B6 :~ñ³ÓwHbvMxÁá'_ÑŽ!m¢ÇgÄŸVO"«¦¶EÛò °Gô飗†¶9B”}d´*’¬©Ö}¢/«©ÑÖk¼A^‡±-¶ÓêS3™¤;™“uª£M_&Tù@u<ù¬ÔÇ ÕµT›£€xˆˆK SòPlcLJÿ š]"âHñ1ú¨kûW,þïïåû¾iÐ&7ÙöÆù‘$ô}—Ñÿ“Xøßˆ™¸›ór]`>8o ZÉH¯ýFTÁ*éÁ^£{¿»ñ\wé¾ÿ Å_¬ÐS%.=Sb_Ÿj…™Ÿd¬½.æýн:ò1ˆÁ"Byì¯cI=øóOHÊáìÌnײàý¡{áSh„f8R±·j{Y ì…=òÊm•Û` x¬—»Ê]\7 W&xƒ…4 ¼}[¨¹¯ÚÝ'Õn{¦/ Îe*]eÒkݾOMÚ¥ëÔWVuôヲϢ³éô˜¶õ_?/c`+™ôþlps“XÈ¢0º¦ã`M0ç?Š­ñÀ¦Ï“y€—1¸•<±†¯èÓfŒ™4½•èÿʧ,^üßKçËi¯IÖÒûñÕî§>˜rØü|ÿÄÅ¿„Ö=¦Æ€üY<”¿¨ yX|œ_°30ó?¾E*ÅË_^¿pµíÝ ð7Ÿzýñ™Ç7¤—Ðè;õ£±ìYÄK÷=1þúAÛ­¯…»6ÐkÕÚˆa‚ÊbM%漺:ÿšmœôÒ|ðY·Ë)Lü{¥¶õæÐ(Ê~@z y¢ ¬IõM ,`6ùzÌæ¦ƒÏñÈïÔùڴħS¢]:]i©žˆ))Ýë¶O[F §÷ÿã+¨MÈÛQç™å–E‚Ê1wI>œ`*[op¨¤OÖûë’²‰z½³ìϽ£l*©½ñ jUb’JíUí±F¯%Ž2ð- ª’3Ò[u!ÕʯâˆÖv¤<4¢ šaýz½a£yÂwdž[ðp´"T¢à0ZÅÈ¿Ã54t/¡ñ\õ¹ÓÜñÐuô¼/ï%p§˜{ÚqX·=ͯHþÍ+ìdxÞoìCˆÆ#Ÿ÷‹èwÏŸ®jïäÐw}¹ ê)2<†ž “Ð8Ny öV×—t¤ƒ{ƒLŽ|œ˜Ý`³Ë‹÷œ¸/\¨ Ûª¸¯I›N&¹$J¥xgÙa+T§Ìï+›¡„LZGMx°‡.@X~ Ò”ùþ¤ô!»Œ8}j>äCZvZŽ0Ž÷Š+.Oþ ÝbKYòqr"Nè¢ÞoÔš¢ ” IŸ„³íF¡:UžV˜cªšÁH¤j7iÂ{¥5A‘&'>]™9 §ÚCÆT¡«N{ººG7Õ]ÏP{òÔy~Èÿn—gHtÓg¤üŒí~ÁMi á‘}>zôí«4¢<^'F-(­Ý½û`E¥¥±µ°]Ð:D@Æë úxaç2MV<Ä@Lb|ªrål»Ù?' ³W†=f{Vk—jbv:ë‚…Õ_‚NÛ¾êfíÆã—Ö¬Öì&ÆJ½EWYÓ¦©²VnHÉ'•©¦þÓ¯¾i—¥È!˜$%Å £b­î˜ÞTÕ¬­í=OÒ‡×ôƒ›©ä[^N\ú­˜ŸJ ®<Õ¡+‚§rÖËñmQ4aÙD­&5ᬵÃbdRåhÒj•MPÊõjýÔ£„£_4¦[d—·C/_´h9å;²Ä’–e‚"¦2²(> stream xÚ]‘Qkƒ0Çßó)î±c cºÖ "X]AX·1[Xû¦Éé„CÔ‡~û™DúЇ„ßýsw¹üã¥y–ËvïK÷¼ÀêV C?iŽPaÓJâ3-—Èî¼+ñÒc©>ÊÁ»\®Éûsz,.>}9ŸþÖ.åtSl‰ó¬¸ #v¹¬{ˆ"à}χQß`•ˆ¾Â'£}jº• ¬Îia•bRê;”#PǶïfâ½ÀA•u)$¥1D‡CLPЇ³ÐUT5ÿ-õœ™Í™ŒfYL¢-3¼¦‰áµã½áWÇ;ÃÇ¡ááàÍê¡c«ï 3¶™9°= ì,Ë­f*ãßÝ>>i=¿Ëšl3k%ÞÿAõÊTÙõ]j€ª endstream endobj 1740 0 obj <> stream xÚuU lS×¾×Nìajpèj›VãÑÑ`-¥c%!…•WE -$!)¶1‰±ãÇÄ8„øb'ñã÷ÛŽ„¤v¤ð&(­ TÕ ¬[ËŠÖdžPiµ®R¥‰ëÃv®Í«š&Ëç>Îÿøþï|ÿi*/¢iº¨²jSUÙš_”¯­¨œ§äß,1ÞÛ0þCz_>7‡âž§¹7WÈMÍ“Ý\•÷ŸBÁÓ%È{‚¬ô'“ùõÜOÈJÍ Ë„?¥$Ц&QS¨g¨9Ôbj9µ–Ú@URjÊ@Y(¢’Ô05J¤ô úΤ1h5;¬&³AÛܬmÚ©2Ô™´*³Ö”½W™L“®®Þœ½Ûª6üèAÝh®×·éŒ:³UkÐ6hæF]£q›¡±ÑdÐn3go².­Î 3Öñ/ïßæ"ëÔ&•F¯5ó;ž²›j•‰$1ªÔ•R¹ D©œ_ÎCå·³4³ó/^4G1_©\¬(kКt•Q±Ve®×6¨ÌäÁ ¨hÔè´f«bÖ’z³yÇËsçZ,–UCsI£©î•Ùs¹^±^Û¬5µh·*V4ÍŠ×U ZEî0Jr—òƆ; !е[µ&#¡|"%˜D=IO§f’çÑÕ”ºÀH™È) “u„vÒ.ÚM{h ½´öÓ:H‡è0¡6Sµt”î¦jèõ+:Nó§•G¬¤®ÑÏѽF°C0.|/¯*ïBþäü²üæüáü"£8O\)>*¾ÎLc62ïp®¢ôjMÑ_qH˜ž‰Z%ýHX¡Už9!jµ‚Å2ýò"tUÞ¡oÞ¢ È/i2››Æ¡æ‘‘¡¡ Mrk4šÉY„\1:,Á›Qµ-îö9 xï^;+‡Ÿ;Ƣ͸FŠÉ²n7t³ÝönY|¾xU£j)Ò`Ïî Aq<ÉÁWÐãà мʋh5Z- †úz‚!¯/€0sDm28,Ë·aC*ýmŠK¥Ï¥„㯨¨×"îÂn’Uƒã¸ÕbêBn´iP\–Y—yE‚Íx%ZXd')Ö¡&dF+ñzÌb;^×á&9)?B%IîX"ÇÕ"î¶$Œ!žÑv§Ó¹€{¥­W8Àêèíä.àiO‡üÀÄ¢|EQg¨5’I ” e,9¾[ Mž9.jkyÀ÷ÿ¤{Ýô†BaˆB·3´;œ9‡z¤{ÂNpcsðüÚ"]±.nƒ4“À`±{ÐYÌFí1™Ÿ°Øf¸c¸æÿ¤oã506>A˜þ ÑÀÕµ£½v…c x["²~ „ìÿþƒ¿¡ü³ñ€ßawúÝÞ·ûñ¤ Z´Ä÷ø[qØÀ&wtÍé× #õ¿Ñ3ww‹¬9 dó“²Rtz;ú\rºîbÓ‘¶ºÝUMêzæîdQë®ûx¸[¢êš  a{ Dô†@$yâÝß]¹üñ‡×†Û×òz}>ŸøÒÈÏãsù¤n¯Ç»+„ŸJͼ]ño6áñ5ížßÌdnåýÎýŠsHP˜J.]9ô)D˜8 vY€ÇnQÏ-›‹§Vìéty ƒìöº}$AÂŽ5_¾x3{À&ƒ¸" Ÿ®¿Âp6ÑúU ËÀÁØb•õx£‰Sß\ÿMë ù½¤Œ,V·ÏãµD±àìâ¿oBŒ3êôÚ€±³ÿùû¿Ž·6ÕŽY/ƒ >CT€ÄeHˆÅr,†—”U¿dê$§>¹þÊæÎûÏΛýÚË äo@íé–¤iØ|øõ¿2+¶HÔåe301˜þ濾þþÚ·ä—áŒ*Ùr`Ç~ÇK˜¢t‰&E4•-§„Ü™M–%¢8š†Äß¡é‚RôpÏá¥øgx ^ˆ"rEKåhþcûJžXü MãSìLq—¤Û9cJÈ!î ™ÅV« ßãçð"}©¬ÖDß:úÊyø†tWüÐ$#ã9èù•è 4Íúš)+âÖaj¼”Œ±e$àì—ô%ï· .WŠr¾-m²{ Åú€sôqkJˆÓµ’G6J\*ζXúäh¹hÔï?"Ïz$Ç—¦îçHW=–ãU‘ÞéÔËIô6hI$``@6®?æò É—_/ÃËE—ÞSŠ:q.âÁmât™ášçîJ uð#D‡ƒ^29Cdh+› ÊMž2ïÃVÐk¶×µîž.Ó °7Ýž«Îsu±*?KZ ŽÁUbPþœödÃUö$h ­›˜zתFÛ/º¢DáÇ´M gýúÑ–¤±»1òåþãgá2sU}’Ó%s¨ ¸@š¦Õ˜îÈådX¾qþ ßž÷~Æ ‚ê$Œ¦Ž9áôæpç²­ TgÏ»b¹lÕi­>¡9¼¢[—í$ÒóYôpž×÷lòÛsè ªšHë¨>Ù2²÷]Çbs] ¼APIyv+Qd¢/Ò›%A>p‰Ù£¬Ì]V\žy[êîtu^\àÚ.>‹È»lï…âÜd'è+†—s[¥‚Žñ1¢=’`øo'θœÛÒÙßb¡˜µóã›Ê¢å™­R¼<£îâ ïÊïtºò ~t"‘Á‚‡Z#Z&б‚õñÃÏÚISh.1-Mo‘ìËšî$²œ/ÞÓÉ>Ú8þÙIòAvËî½Dvø ƒ}㦠¹ŸãIpOpoσ˜/ÿc¼TÚÙï ·“+ÂÍSC:óúöd:ïÏt:™ž-ñùýd|3a×,»»Bdöx:äàôwø\è뻋¤ávg?ôƒ?îaðt¾„;+ÂÙ÷ò‹š‡ÒKEø©˜X6!oQ¢° \8Á[815!51µ¯°ü'¡›OþÀC:B endstream endobj 1741 0 obj <> stream xÚ]PÁj„0½ç+æ¸K)Q =‰PÝJ…»°ô“Ñ Ô$Äxðï›DÙCf&ï=ÞZ5‡FIôÛjÞ¢ƒ^*aqÒ³åR‘4!¹Û¦XùÈ ¡Õ‘™èGûyþ9=UÇò–&Ï×K¾‚À~…\ƒmssh—ÉáØ¨^CžzöŠ“³ ìÞ„îpv_V •j€Ýµjã¦ùÅ•ƒ„E”KWO\ œ ãh™äIR@^×A%þýe+£ëùY,²ôß¿¯ýKämˆ ²>¢òÙZï!$¦ F¤ÂÇÍŒ6ß{Àoû endstream endobj 1743 0 obj <> stream xÚ•Yy\W¶®¶¡ªÜPi+‚K7ÑWMÜÅ]dYeA »O7ûª"«Š ´¬B‰û5qâ£/NŒ‰&1ÑÑq¢§È%ï½[š1“÷Þ¼?ìþY}ëžïlßùîEÁXY1 …Âæ£e \Ö.9k¡ÓêqŽò“÷–‘Ô¾VÆÖk©#õUHý:Hj¥ÔÓªÃ(¶ö ŸŒÔMþ|Ð]þA?4gl+…‚ˆGÇwÇ8:ŽŸºÑ×/Ìa˜×p‡q“'Oå0ÞÑq²ÃÌŸÐ^ =Âü|<Âè6;, òÚèí0lŠ_XXðcÇFFFŽñØ2&(ÔwÚðQ‘Ãü\|¶ø„Føx;Ì sXäàãÐŽzLû׬ €àð0ŸP‡…AÞ>¡mÇÎ f(3ºËL~¾µ çÁûwc˜Eg†gl˜nLw¦c˨˜žŒÀ¼Ãôbì{¦73€È b3Cè»Ã˜áÌf3šÃŒe™qÌ»Ìf"ó3‰yŸ™Ì|À81³˜ÙŒ33‡™Ë|Ä|ÌÌc0 ™EÌbf ³”qa–1Ë™ÌJf³šYìeÖ1NcÅT*&vèÔaI¯‰N)+7+¿µÒ[ݱŽcmÙ­ÇeñV||Ç×vlèÔ­Ssç½;·vy¿Ëå®®]/Û ±ù¬[R·/º/ênî1»ÇcÛõ¶ÏT~ª+=çõll…'︼SÒkD¯u½^ÚyÚ·Ÿf¸·Mï“}”}¼ûœë«íû´ßæ~'%Mëxñ¹ˆÁfÅ dp2ßc7¥T!õ°£Hº=c‘»—V¨Î‚4C†!6>1 ¢x÷ê¨}«Šë7ªöƒ¥ÉÚêe<±!}H'ÍÐÚ[äù-We«ù^] %I¹):}p,l€˜ÌˆÂ8¾?gÓjkA©=wU{Ͷ2ÒùØk 2ªã’š¾\–~ò—?Ú“Frdv’ÁÐÛ«¾&CŸ°÷þR󃺊“K·Ç$Ç€ï]b>RQ^rýÒt'ƒ¼IGõÿ„Ÿ³ùÕå ”ž…íP|‡s"¾ÕõßÅsù7©?§K6ºu^ŽŒð#]ÿçðúþ)hˆ xÂ>¼]õ•ºÊtûc7lOÜ QŸx0†·Áø¸8ŸGt´½‹3|Í* ¤óB±r^“¢KÑÁN~GT|ƒŸo8»Ôu³Ÿ»×~Ÿê(ÊÚ½‹îâôX‘ç•x„ÇäüŽn 訸‹ŽJÜqGhô«vw÷ósw¯ökl¬®nTÛH7Hjñ¯ËŠW$¥dj]"¤çAù¢­¹ÛÔ¼-i[[·ÿc—I`à#wÇPÒó3¨=éF¼YúÞ¬hž…=•Ò>¼!<6`"I"I’0|˜‘lÅ$Üi˜§j’LDÁ–•l¿™pþgà|šu2ïÁµœ28õQ{×ïÙýa2,Ç«¶Y°-d# JIâÑ"Æag%¾lU %¢Ž=$ìœæ2HNL¤¶ˆÝ gŒöòmD£åަ¾€––p”¦€8pò6ØÏaÿQqᤔZ€¡‚–ÕE&Ìß¶3>il¥Êе'›!{ïŠ?ñÈ ü‚ô']G/·äXlYU]Éq5œôØ›VQV“kþ~óܘã3×y6q%vÛã(°H>Zš)[o¬ÂÑh]{ûÕÔÚÃѤ+jPýè÷haðüEø¼øæ9¸Ïßž~‰Zêý^MmÙÀûdpe{ŒQ!JÎ4È7±‡RZŠŽÂcq„4™Ý¯O¢u`0ÄÅ’¿·}l§Åz¢ VZ®&õ{h¬ûªi€Gp„¥o`ð²µÅíO°/2?Äî¶ç°÷û§pP½¤w›ò#¦„•:­?vÜä\ýaàqÈh]ž©ÏÓèh‡Æ§¸„¯Lr‡é°roHvBªÁ¨~ÄoÕ&.¶—¨óÁ”–™UÛ|:§øðî‡Õ¯N0”tQoéç̦Š2êü)÷][bW%,zïÎ{Ø]­z‰ž7Ãîûą̈qöpÀ¾ª6\€? {9@¶¸1sW™xÚü Âa]i˜ort0ðKƒjkËöÕ\ò¸ÜŸô%“'’tµêW˜’ýaýqú—[®Qg4?ÿ{£Ã›”.Tmá´¨=¦ó¿ËÂ*®Mܽµ nB!=N‹g~‚C‡ÀÌ!r;ÆKØCqEü«œ‡&éG!'LPÍw6 ÈÐômii†l}¯eýH¦µÈæ|™ŸŸfÊ͸ {¨Ù©ìòy#‰Õ,ÒÈ0{ç³±[LÿLÝÌÁ±Ôc™böÕâ Õõ–Öm”îR·ï¯¸…{n­¸¯ºë¤-ÂÖì =p˜¿ö0³îÞqϹjX²q} 4T¸f®< çù¿;6–hœ§ŒTÃúÂwÖóª“6¬w™<­hf5-¯ w¿Ãj@f’¸öO¦Ïª£Åà3›†‰€uü¤Ñ[]†»œ¸£†;§«‹Ú±c3¾óÐ×6êbìG«¥7žÂ9pJX»1ÆÛÝmDƒ¯) (/õH4ñ‡Ãx{o ñ™{•øŽ»‡Ù4WóÈ2`ؤ7Qÿmv£I¯1³æO”žÂ(¸õô |õRsJW¦íÈÛKa#¿ dð$µMk+í„!¢4¯HQߺ_)¶Nâ÷ÅA AJâÎhblû›]R¬.q:ðZ¶†}eíY8B›€ÓO€| SsŒÆãØÕ‹Ù‹dˆõ(º*õ'Ú*ß½n•G’¿€,©´&Q¬Mëj°ÉŒ{D[нð4 ¥ô_)upÎãžNq¶ná ²12{?½·ù&|E&ªÛæh‘i{Àª~!ŒVòfñƒ{ß=ÑÀϯ’ÎÙüDrE ° W²E Âa÷C´ ãù8 =É êìõxQúUT\ÁÑ’®EÙšÙ:NØ ÙÑêÐëw~¼Änáñ çRR4‘Ñd8ñ ”¿†£‰¦Ç»!W´Ó£Ù `ˆÙIcÝuј “ÊV}¢=w ÂÙTd.öégßæž¤å?M/!ªÔ(£¾ø}FÓ>ͯ֔܈ êz_©UâÐV•Ðö@öf‡kp5³ ƒÉÈZM›“–E]ÛAz€C¸Ïàë¨çêÕYsa EÜJ·usßݺˆÖÕjsNÉ[À‰¢²Õ÷S²'ê ñd!õiVŸaÎqŸ©ñ°–™à>B½sp‹aŸÓnÒ•Ù͘dý›Bò×S«-M˜/ݺTÄ’W[±ÝÝ®uŠÐö÷× iÊŸÁÑÊÆ–ùÓKs?g¿1•HM­ÁtM•NÛE:RS6¿ö}‹Ñ[”:‰¶rNFà€µ-ªØÖþ§„Êà‹!™À@þ. º~%r~º à½t ¬è2H‹ƒ†p*‘ª‰@ï°Xÿ$˜+Ö^r?³ý:|hUtþHKÝñÛG~†—ÿšôçÞNºÓùY9«h€ d,J¼È:LÆb®F{ž›Ž_âm~µ£1¨1OlÁ8@Ùº“f‘õÑ w÷áà##cHùóèsîíç–Ó!òŸ@%kñ Rû¯ÏéýèM Pbƒl‰YOº£«ëpð”wd鎬–«§o67?zùM–ÊEûzSŠ–& ¸µ%… pì÷ˆ¬—Î’}f/݃ˇ"(OÞgÌÖµ±ä’†ÿò Üӯѓ”¥'>5É>:1ü€—á<„¦ºÏ-È­]ZÜnZžs…iõô²Ôfâœ2žÐ~Dë»È®×¬]?äŸ KרO_¾z}Ø)é7yL4¢@vJûâËãé!Àž„Ê«/²n0é¶èô”¼øP¹(ÏAmÃIKlBé1F›é\…^–·=ÉŽÌKÎû"ÈÚ•–U±3Z̲æÔ¡¾þ‘åÄ@ŠIñÚ^í’RN)ñtëD!>Ï`”%sôÿL'%·}g4ìûý]ª‘nqPb4H-K5ÁàËå:soU–ì—s…°ÇP¨¯Ð η §G–Ä×·²õr›‰£•­uøƒ€›É`J°¡$šhÈ0²x¡ˆ‘CÇÿ`ôP·Y‘O„%àtÀóËM—¯Ã}¸’úÍÑ¿Ôrµü\σê>®™Ÿ6 æ‚sÊx9nNÎá+d¾ÙO"«[^å”j>Z¦xF@g–Ê=þvÄþ!hÚ&¾Î$û‡"§"ºE ½±û°8¦Ïš ÓÈHMëóxs¨ˆ•f¬´Ìˆ¾˜€#pô÷ÇU[ÑŒ¿ X‰8œhšºh¼O&kpd„€üÁŸÂgü3ÒáY¢nëþƪ™Zmhxò*‘XÉ©ŽcG¶ŽBåÆ*?J"Nð1¬½¶ñhø¥*«^æ?Ü]² vh¨ÜaØž¬ €Åp=¹AŸ›ø¹!}Ûµå•îrMÛÒaòŸ¶WšÜãç§5©nJC¤ñ˜^ÙËÃ'ö.=UÏ6–’¾i[@_ |¤—jp~;%R•¿Ãm½ÝÒæyÙëd†ž5r€ær-oY{x'*¶ðª¿‹Ú£+‰Ø[®üº9ÕÓŒ*JÄá†BH§Gà-¦!ó¸(H(TgƒÉ”•ÙÜl÷ÙÚ“¨;8ùZ?Ó¨n*?¸ë¸—â®§¥{ç¼¢A¤Ä0i7†µN~›ÈF$*¯²Ñ:ç.þvÛ2ZËžNE%\¸@?NË-Ýù’Ãóaa-,ÎÓ8 ÛÉ´ŽAE<™Ñ¶ÌŽ8KnÖ?Ë&FSS,&îsõ²vþåÏÿ)2¶¦í(ûrHËÉØNÒJ;tj[ùÖSÞ"Ødæ9ÜÚ ”¢ä[“)’[`4V§Ú—¥fÈñ®YÝZºù´v`…P Õñ}r’^GìÈ,;Êk¬¿–çÉ(póš`ð„ÃPr‘¸‘„8½Þ_g©0D¨eR[ ±ö¶¥ƒ(qyƒ_®Ñ”žaJÅÉD1Ò²y_ËÖSÑ×ôê|$ÓÑ+œRì+×Ä ÙYP’ºÇTh¤º½˜N"ƒ«>È{l1–Â~Ø·CŸ%YLØ‘õxÜúãŠqÜkŒ¦6…5‰”’¥¯ngFÒ¡y6É ââƒ8Úl[…§Q]=YU„Ôé¶°\ÿ¡>ÆåAYévØ®Yd¤Y.å©x0ûS2܅ؤ¼»¾:jeUqƒÒ¦3Ȩ2æ«Úcºf#³u$3È`~$vþ\­Šø Äú’>Ç £¸‘c·‡®öª>*p|ÁñT™"( b©Ÿ—ž±},¦cOU,n’ ØÌçDk-w)¼5mE®å¬µª%+±eÅڵß?¤4j?úLeˆ¬ ÜÉgʯiÜþêcgè ]5 …å!Þž®ñþà Þ§wÈ÷YIuR·:E ¥X':/±M)DoÕG@ÿÚÇû„ÏXJæÎ$á‰ý£Q8ß;ˆ|få>u4ÐjÙ²`]ÔjJKÀ¡Íg8M5ìÑåë^¹&JJ‹k²tèXé½Fa-‡ó3¬EnáN¨ÕH¿ü³›d§jYS»*cÝuÈ€wéáßî‡Q8Œºø +«,çñ²Iå¶G{.Ÿ.ßív½¦¡muz_mEƒ˜S ç Î¿$zX–T‡ áfE5žø“RòÄ@¡$ök 2éæšãÌ+ çÐ=&LDzÞOGàDßøbOa$kbä2Û±ÎÅ]Ò߀ö'4‡¬LµÆ†âCûêêò*;‚‰ô2úñ6ø7–”w˜ØM‰¥%«1ö­«E|ŽœHº>ã°Ã—ÙåêtH‡Lý.1|›¦'Œ±¶\G¹šqÔÏ×ÍVo[õÈ™žëfSªýÎù¾êeŸy€Ž¶wБtBFõ#†I+â$/º`©ºKtÏJc‹©áà ½œ¥…œêYŽtU8ê{Øãõí`ƒùðQšŽçí¹^uF¾œVÒ“ØAr}«SÓÍŽE“ùÈ1ËfsPÅU”fe<#¶vÙq»#AÇ'DÃvµ–;húÖ˜n>l¯Ec8w*†·ï&SÑ×ßyV›yìé Ñ…BHð#“ÈûŽƒ‰=éþÝPü§|ûŒJ’EDE û[ 4Á‰=‡÷i(nhØZâW¼–Ã:~†¨¨Ü°%+Eìo–g¼êÞ°ù] Æ¿ °×h,(¨«?™QüÕ³‹ˆ-éï¼jžfeg·Óñù`„½üT«F¿£;dM6âïvw|DifÀÊÍaѼêqËïeæ£i3þÑw:Þž¿н.²è ç>–¦à¢Aáµdu|ð ŸG{ð…xñËcSÖh  ~-Ë.–9wÐxzèÿlj4-ÐTÐ\GFVýÑ–ôÈ“š  iËÇËåÑż@šµõøP@kŽ|ð;¥_úã_Wp§º}­mžª †è­È{VEVTT×ZQ±J­jr¯5a (‡¯I2K}ªlk<®cý ùôEQØ9/DþÒ°W} jÓ—cɯÅóWíÚ™ ðŽ É÷Ëð>€ŒÒK^EÁE1u~5I··ñªæ¤[Ûa ?c,„«ûCÈ͸Æä‚dØöZ0+Ús&˜ x=…íJ55ûŸ¤b¾ÇÑ@cdµßZeÞþSó)àetèü—ˆÓ‹Ïiú;‰ÊçT‘ýœÃ·á׿l:wS}J»š›ë¿%h)\)UcÉ\¦å Cצã}9ËÜô=EÛá÷fˆ’æÝ¦rèüfjªš$ZØóò2nòê•NÓtå§Õøè­_¶qwÃÿ¦VEíƒÐ|‡‚|žR,u§ªX:¡”R¥.BFAZæY¬†ê ¡¡n¦™höVè5ôü¡OI ó?ÕŽ¨pŸõi‘ݤG­n&Y¨_ápV[—¼Ð|ª”ì÷@NjN1ü×Û÷/o-–e]!=?-낼˜>À°%Xk ·ˆîC¼tº$ƒnɶ#,²>+²þ†UúÓVºæW¼†fÑ@¥9]5…,·€¹ò"O½§ÁsózÓFË"ÝÖ)3æÎÜóóì^¼·žñ¯©[Q"]TâßÐ@羓_‘ùµL²~úU†äÐ5¦ [äéóv¦$>%eÒh»áÈY׉lˆaÞßßÍ´‰.¹ÎÑa²€ô"Cc¢|aØÓ74¦—Ÿ×YDpTz††6µ13ë1*ì°yÇÚ[Ëî3~b:TÕ¤?D×̶4¬Ö,§˜kÏEfAj{.¶ÐX½É…©I> Rv Tä\”þI.·õ[¾Îîl°ßzcbjvZiT󇶔m Œò^-z^T߆ó—öŸ“5 ÔIV” %'¥´‚*ά\“ ²ùâm­nS²qd=ìe<¯4?þ–Tµ1 –¿0Ù‡çÓÆ“º³…èf­e†l]D쀟ÈÚÄçJK²Ñ­8'—%®™œØ ÙÎu™]º { KWu'«IE]:»ØHªžÿ r‰¹¾ endstream endobj 1744 0 obj <> stream xÚ]P=o„0 Ýó+<^UU*uBH½PT†ëwRש$‘ ÿ¾$‡nè`K~~Ïö3mÝZ€SŒÕ„³[H!ô8Ëò´Qa¯RV“ôŒ‹“ôorB௵Ÿâ^œŽßyñp97ùh®”óêнnënN­”%à_ÛÄ9Ð ‡gíz¼‹Ø;i$cG8\D—nñþ'´2VUi\~½I9³— IÚY™e”MS1´ú_oWôƒú‘´1_"ó˜=&îŽFUôw³§¢mozBr—‹·?yç£*Å‘KmI endstream endobj 1746 0 obj <> stream xÚ•YXçÖžuÙë(˜8 Vì½–cÅŠQ± Xé)R–»‡é½#RÖ *‹Q£D51±Ä{½Fcn4z£Ñ3ø‘üÿ7‹é·ä>àò0óqúyÏ{>eŒ™#“É,—,tpXí0ÁÁiËÔW¤'3Ö“ì—ͺ’âKŒø²LÞKäâ`³á #ƒô“ù±Ÿôy§¿ô9ž~¨®dÌd2."ìí§M¶·Å!(8:ÔÇË;ÜÆnû8›©³gÏœhóнýl›ùž¡>ÛÝmœÜ½=ÜÂé/þ6ÎAÛ}<ãmì^ó~uÊ”ÈÈÈÉna“ƒB½^7Ñ&Ò'ÜÛfg˜gh„§‡cP`¸ÍJ·O›«'÷üp ÞîjãäáH­µ°è5‚ÛkbßùÜrÅù†^›·~¡\,5;€ ”õa"Žé͘3}K¦ÓŸÀ d1ƒž e¬kf3‚ÉŒbF3c˜±Œ3ŽÏLd&1“™)Œ=3•™ÆLgþÂÌ`f1³™WfãÀ,d1ŽÌbf ³”YÆ,gV0NÌJæMf³šqfÖ2ë˜õÌÆ…ÙÈlb\-³¸#cÌÌLvº×ô^¡½.ȧÊå‰òùf‹ÌÒÍ~P)î(“Y36œ}Æ…r_õvê}Þ|¤y¬ù…>¾}.Yôµ(¶¸ØWÝ÷±å6ËCýÖôgú/í|ÀÊ_ txlÐkƒ÷œ<ø[~ÉACb†œj7ôèÐûV«;Öó¬ 3v`ØÓ—œ^jzyáˇ;ß;ü˜˜aÙ¥#>?q-ª ²'OÐ㉉kùt2ê‹ 4/8(B+4Eú'ƇA·£!lŸaomÛÉ­ï!J2чôÆÌWFž;ªÙZýEhh¸µ£ŒŽø±õ9:o¹òûwâdö…j#†ý¤X,ïZÆ'é6¤§Ch!1+8Ï€#ý‰­'é­ú·j<þø”%ÄÑü#öá—usÞÖ¥  ]FFBBzÄB*„WÅrd0kù|.5â‡c—±_Å 3$KºÆþÙs`Eü:·ŽÕM-Uñ4 ÿ“¥ÿ%L?ôN¢nܹ²ïšP-چ耤Ø€ˆ¼¨Ên k)^E±çã(YN¿ŠÓå8[¼Àkçú:9oMJÖé K*JÌ)ùî&Zì{Òy[°¯‡W½×¡*Jóò8Lòç[âG?i»)©òúŸTYŠKIvõóµU2dîÉEs’ÌC6è£*ˆš©q!Hßá 4CEQQf&dsEH’h9„DQ„]LVYdŧd1Ž Üžz(nw©~%>ឯ£ž\ላÉäBjhE—¦ ÒA[fÄÌH‚ô½q™ÄB£1y¡)‚ÝB>èaO5ŽBö\¸Drž¬ÿÉy{9n¯äuAi³f/JIÕj!Íä{ñÛ8ì\À©µ¿ñ=;›þñÂ{²"ì”Ó.äï‘Nš:üL²FÉ1êÈ·ÙÃÃ×ßÝÝàà€¡ù`)ž&YÕÏ«dgÄ¥r1©k-Oý¤ã*â â…(HפÆu[ü8ÝŠzE]â¢K‹…JÈ.Ì)¥±>­1ˆ ²´À8´‹%x‰¿˜JH"”ñ€h021ö¡@çý ¬8²:´>¦ Pà\Þ‰’‡—rk ÎÄ–ÌÌwWa%„ظ€€ÈÈàÄ0Ô€QÌ2vРǡBŽ»X¾Q ~ÂüåD;‹RW*߂ΜƒÅ\w Q©Ùvý÷päÈSh§N†³’4Çsh}Ü(;…Ö¸ ËE=úñnÊŒˆ”U±‰É)siÏrdв­å«¿–¢ü‹OŽÃ}Ím.+¢¿|âzclmskõÛ´ûWûg|»3»¸{o8¨`îzw5 ‘V‰REs»ÄY’VÍÁ(àÀ·nâàöVÙUì…Nh+ǼɣŒtÝ ¶„QEÀÒ,×}ÆüÒfhâ6º»ºMy´ûáìÏ¿z$À±ÐoÈ”†/><ŸsWÎ1›½êÕbö4¾UI-ªMÜ·9·ýÐ'Üp PA@ú?÷Ÿ­§V£‹Ô¥kS3 …–Ý®¨LE¥Q\FCú7”ÉÅE8•`/ÎWÖë²C…hê„&–<è~ÓJû)ËÔl£þ!´î{ 4¦ãY"ƒxr‘@›qN2ü“¶”ÔxocZÉq²XÆïKn€R¨ƒ÷àü¡æÊ‡¡–Û EA'¡oÚ–˜M ΰ\ 7—§è3ôÀi q—Št°QP%€>3¯ ¨¤µã 5LzÍF’~ª°¢Äç=®³ø`MkHÃŽßèÍÓ?Ÿ‰}pòƒ;Ø-gÝ&ÃUÛÁ5Yíg*ÒƒH ï¢ùÞVÙäÑ ÉqþÈÇYgö¾[Ó~üÀGP ­u¡žé1AÌy5„·ì1”w|°ýÃd™;—”P<(ÅD´úö*Ú ÍøÏH!–ÃöÊÈür}7=/Î× ŸÃ~'N?„9cí`ÎH)ØšjÚæRhœÑ\.Äû|>u ñR¦·[£ÍÖj 87¥/E»2³ ïBya~ÎP.UŽØÆÇø¯ZE¸¤©°‰[rò„z()ÎÍ-.ƒ"èœT‚fg¯ô8,Þ¡¾^îɞ¢ÿΞSûá*÷xJ‘ë…óÆ °®áÍÏ<ˆbc”#làûÈ­Ðîö5ä@Ù_ޏìåÈ’Ç|daP-5óÚ3}í­£[— à­^ãË‘ÞáQxÍe ë9sBìœ;?àòá·6ôXP‡æ' ø£òAè-õÛP|‹_Da•Ø þà•QÖ˜S] -\kp­_ˆï®m‹Nº<¦g'…ç‹I ÆÍ!Éêþh!´Ã;¥-9¢\ÏÛÁõoïÃm”©ÎAíšì„‚½ør‹íf –]wiiÛ›J[ÜÚ5›O©ÐîƒPЦ¥D“ÌîgV)1  ÊÍH—#Z­Ü£ÿ.›¦!»»‡Xaµò,±WLR+[ô ­å;¨§Ç&²ä¶Ã#G)HœÒ²ë ÕùŽk2M»öïø²ü@×^ý´û­Ztaqöõ;÷UðͬOIß|Õ°÷áîͼF¦ dù˜ÇZ\Ê>®ž»q‘‡e!dù‚ÇwЕÅÞå„ÙºÂçUª,»:5FÜP…˪ÑÝ(;ƒ¶bf»¼+±k:_ Y;…7œ.©›Ö$™L&£ÉâŽãÈ8Ô¢#²h‰æå©™±ªD:¢t Id"á7L…e0­Âù¬w›ßI@¾-½|äÔ¹+ ŽÂÀ¾nMd¡>)ŸVW ú:jÀc Ĩ“£pø2u²í'g³¸í¨ó¾A&b?²JEVý0”àxö6\ðÙ¿¡Ñ½rHïØ Þ›½·,ñJѽ+‚¯ÝˆeG%¹V8›ú´k)4Gq;æ’–í±ý´ò~ûçh\âÀž¼Bq®+wñWÊ0­ ø­\ +-F©Ñv4 ´=42Þ?ÑBœ]‰ÓeÃaZÀãò ‡;ÿ}œ1ýÏ U‡ÏKuîó{/, ¸"((SY>—So±ÂØãí5ɲ°®¡üS£2ZæåeÔ²§¤‚\ʧFö7O¥Rˆ­­Ï ‘ÆÃã5rø÷O)ÜÏxQ#%ŒßK5 ™Qé¥ nncÁKrÞ¬û1S³­úGÐÞþZ¥ðšQ"lösùXÉEñU“pkqa~Þ°6²oR†³5`.„Rl Ôéö$r:¶Ûœ\RàÍ?a¯/ûøKô$-úŒì4H·NØ;5Û¢ÿÚšþajï`v¤ïN,¡E7óW¦tq¦rKqŒ!¯PâÇÙКµ6*7i_õ;ˆò…âûÔ‰/þrìñ‰„æM8ˆ')â[IÕI4ãÖćž=¯„:]Hz´6RG9{¸ZY«¿ {÷~n2#œ ¦Ó/,+0[— 5œx2“Åúîg»rËÁºr vbSW/«LI©²Aÿöí{b¼¶âƒ§FâÃF@$Ep¦¬÷øqDL="Gc× >±P—I›&ä6ÄÀŠÉÝ_j2uÅ`]9µ*ñ: 5™™{²+ôU™´>Êpí\ z ÂiTjÙ:Æê2Ó3u°“ëžAW®[š¶®þ­¦îXFÉNW-~Í£7p %aÏÇ/â…6Äƒé— Ú¢—@ºÉy~¬hö|ÏõrÚ?à2Í7}ÒqáRýi¸¨·î_]äcÁ.aÖFÇPŸµê¹väÓ¢/mÃÎLÂ#»jÄ÷y|]‰s¾¾õ™‰·ÈlU÷Äž*[Ë8L|À㘽x)Ì$STD…7®i FÜoÀVã@“Ø6´+î‘y©Õp Þå¸Iœ„nÅÏbŸP±ß¿(Äýì cØGyZ45!M>tÎ,¡_îÇ}NxßÐÕ÷]ÑÝ’òä¬xUèRtñiý#‚(—H9Ÿ|›Ú™òa(5°­âIol¥’pfÖìUkuÓÉŠÁ ±‹=(;s/ß•c®¸‚·«É¸%ÜqÃ鸽¹š ÍŠ]%pÕU«ÂUl%äÆ )¡KJTo² ­Þx`<-‘ó¦™ –´n.‰;±aoê“ðG;‹´5ÅñAà©#^#fÂ4 ª¦d£«€,ZUNÒ³”R!23 ò ó‹ëëßßr#þJUì?~úTÿpºKdõ4Aµ´>¿”£»´'©ñoÁbëLÌÓfºµD745V· P™R±«Ð_G÷î“Cž³UÛY:K¦m#r{ä"?Uý ޵Wup;@ýOḲ:jè´ˆS­È¤ô¾–#²Sü¤™Ñ~›Ü t™û ™æowÓl+R â0®;.ÝÒý=º–ñd~²BÍžÉU÷?ÛÙòÊòʲªãëO&¤Ý'<½IèðIwé´ 6G¹ûq»]ù·Žž¨h§oû´T[aMØ×͉~°v«¡¾f¤¶ŠC[emt“_,M5oìÍ%@¢:]š&%*xÉ ¶€ŸÎÄ¡84÷´6¾N§ÕedÄÇB(ç¶oW}u[ñ‘„ÍYGÑ…%/3ÇâÔfär…_»$iÊ¡!ÅG‡ìñ‡lewVnkt¤ŠFŒ™FlÈȇ3ÐZuŽT0pXtÌQY§8 Eº‚vßåÝVºÄ{I÷w€ƒ>VÁx§¦­ùÔéœZ8цmÔµ‚ÔVtnÄ× ²fª3éž\tÁ¾6êUДreË·vçâÕËœ1š $6íqN8ü´¼4RUÔÿŒÔøeK#\é‘Ñ:|锪ÑL(ó@ukeË[5FxùÄ"s#g‰÷¾mDÅ“;ÈÉ1@ÍÓE›ôy¬|òq™A(½.G›˜´ "¸í-Ñ{jZK;yµ/´'rO £¹Õ»{¯C-þéÒŽM¶´à+÷®´`ü>Yó {šsCŽCp4äݰiêOþí‚ Ž¶j Ëê²Ëõitljç"J¢öì)©¬®‹nqÔàí^ç‘ïB½Ö¾¾Hþîí>»¢¢½Á Ôµ;ªcÂRÂa ·ê£%¸_½ùî¾\ÝZäZ·¦ÑUj¤eªs5m´Øó2K ‹9ì“ÃO‡Oß~>½}·lÇéªSÄ•¿|!~ƒ·÷jbE¬¼Nµ; ¥*Ó¬hnªÚU2Ü*õÕ^<Íã~ŒôÆÀ¦…qœ¿UþºÒß7Åä¥.—_Üiú°È\ë<·¿:lž@~ÿÚtóeDñø?q”” 9†uÉM÷_îþ>žžÍ>‡L÷_d!YJ«ï´©ú.˜„| {Ï™âî$RlÃûd³Aoü9þc¡‰§)vëA—"é´ƒ(QœòL%3§$CÈÐ{“p*μý’ ¢'«y2°÷ \U¶Ö<\a„÷ 5¸<¨Ê 6€+7 (vò^’õFm ù u!Go‘ ¼#®UÖïì•×ðg_à&ß!/QÌw‰ÜîÇøMEäýÖfGñ¿ÿhgÙà>:½Šöæh—å*5¨küP¸ÜÖ²'OKæ;yC.NÃÞB\BÊ.ˆæÜ »êë 凎oØë*¼>Žqn4ˆr%™õû þÁÞ¤ÐoÓ$kûc>‘n¥æñ&VšJË16)=#!%-#¨lGó2ÈŒÀþ;›ÓÒ ©Ùp0é`(¸q¯ÛC„à+Ê‚¤Vé2wýDHÙŸ©ªÊöTZö~('<‰Šè£!†È ÷}>9ë –¾YG¹î@µ€rÈY¤͌ϓvoY¶—Òl²FœW%ûŽF¼o»ô?Ä))…ÎnJ«]ç{4³¶7Â/}Öqê3¡Óm»4 ÐÿM8_ûbÊq¿‚7|*®üyƹ°ó¶®œûFzýIï³Äñ—¨%²cÏ>êà30^ç2_Uâü_æ™iÕ"Oé_²hÉç–fç•Ø¨e£îÁ”‘JØÐP“–"±Q]Z"éM ¬û'%^¸‚WC=t–Å…Ýó£ôiµ`]yúü*J6:{dS^Ý—Ï-ÏÊ}_’¨/÷xÓVÏæƒx“ìôĤ؊°Ø¦xOºöXÁ.ZØHÏœf³’wS¬ËJ-ƒ4Ðf¤è2æ‘ÕV„ÁJél¸v1û¹B€é,Nê-1ÜBš€¼ª§XAxYþNéW‰ çäVp?a£ ï"ðÈ¡uaq~Þ,:S×}Õ$™WY-¹®MKÑj§³²Ã¾Šö Ö™N\dÑž¬¡í8V—’2 ¬Õìz=47¶Ã^ þ¢"vçª 2só¡Â åä%…›ZY§?{›:MgIIæÁGFY'Éb?>§$;ïœ-mú/™È<"E+##U—A3±ÛŠ Æ&)aÔ¢ ÀU¦LœcÑ©{tš&.0Mc±ÕÏq¤ƒrô™MEÐÆªüÃ"|6w¸} Ü€w?£’R5hûP¸gËÅâx>Ÿ’ Èá*!J ?*Èt»Êù¦¦ƒ–7wWIš»Ù¤Úe)Ö‘ùP%ˆ}”å¸Iá¦L¶ÝéLg¯´|Þ……<åÏE,ä ?о¬¥¦H\•Ûª Š”dK.k4GYŸ}ù(«µè+˜›Í¬²èia)öüÿìýÛÉ endstream endobj 1747 0 obj <> stream xÚ]PMkÃ0 ½ûWèØ1†v -mÀ”î+Iwvl%34¶qœCþýb7ô°ƒzzOÒ-ù€~z+k Ðk£> stream xÚµz xTU¶nÅÒQ …±Ï aV@ED&!až3ÏcQ™SIÍóªªÔ\™+•9•„ $̃ £‚bÊ`k«íí{Û¡÷‰'ïÞ·+[m}O_÷ûòqò‘×ZÿZÿú×Þ‡Í=šÅf³ýwlÞ¹zÃögWmܶnáß_^N`Lßуò1ôý4›þý(šäÐOŽ&ï¯ý?~£~Ïb±uOø®ÜÇð•õÅã¾ëT|y–7‘5šÍ&² `Á‚Eó,x~Uº O˜Ÿ4;zNÐÂ¥K—Ì z~Á‚¥A+Rc…‰Ñ‘iA#3bS#3ñR‚¶¦G'ÆfæÍ~9!3S°ì¹çrrræG¦fÌOÆ¿2gnPNbfBЖ،XavlLÐéi™A›"ScƒFlŸ?òkUzª +3V´1=&V˜†íüߨ`Ö¬QóØ ‰œ78ÆláìbïcE>&Çb¥²ÒØX9,‚5Ž5žåÏzŒ5‘ÀšÄâ±&³ždñY¬§XÁ¬i¬é¬¬Y¬Ù¬9¬gXsYóXóYϱ°²±^`ýµ˜µ”µŒ•ÈZÉZÅzµšõk k-kk=këMÖFÖ&V+”µ™µ•µµµƒµ“µ‹µ›µ‡µ—•ÎZ9ŠÅff}̾ËYÎéá0£·Žn} {L>÷î§cÑÄ7ã*Ç?7þØ„ _ûåøýõwÇýE=öîã=O¬˜0ñlÀô€®I6^êäç'¿÷äU¾%p|`×SëŸ:8E0åöÓ™¿ê÷·È ŠE=Ú?5<ø©`á´g§µN_4½eFøŒ;3g%Ïž>ûîœÑ´ÖŸ`"=•·oxè@/šv»ÑÃÞEŸ;u—ƒéé<´»ŠéÔk4"( Üq0î(ÙUµ¥ÞŠW? ‡”¤ôzUVáÖÜ78õ%X¡ÌÚp½Å7XŒf|ŸS ù$£àV|æþKñEä pD[+ —C è ±=·ÎÓPÑñ>3„$CÀŠ35o=7_ ¹;”Q¸o0ƒ²=Ò=’=Êâñ ƒ W4™KjÀMxò"¡0'aßáÜ6ò8Œf6 „?}÷îÍ»åö¹G:Çô\Ä3Z E`ò9!" ¸Ù>7rå |=úÚ˜r¡3Ù$æ%ȕ̬$~dËjæäû¥û¥aŠñÎxPC–ARþS[zs[É?A/šV‚/ |”õÿM‚‰Ewx®‹¥•vUœ8YÒ 6è…ÚÜJqäY²2Ò åÅfaàF0¯ñÿn ö½âÎCh?®†öÙ»èõ»h©`úŽà„#ÀEÜ6´Û~M¸ ué‘rý#x+½e]ï1¿ƒ4r¬UìÝ”£Œ2“FÃmEKÁh¯v;V܉êþ±SõÕžæ³+{If D¾’3#o.7_yb”c$^bÉÃäa’°@y‚xOh! šû{r’c$‚Ьóè]>Òp×1‘„hóò·*„Ê, ))d BK«²ÈSõà 2³’w ˆºÉ;p溣¤ã|ÂNãÌrÒTU6:9õÛ‰(ɨ¹æ»ü7ê§¿æICb__·],ÑëAChMJk%zM@ãªÔÝÑ„´äjYYv‡ƒ@&ÿ–ÛýÑÀ?.^“FûkúÓsSÕw[Ýl4÷8Õ0JÁ¨tlÿPq®zz€‹”(¢¤Ä`À%bÕ˜T¤˜±Ë^`‚™Q̺fA¨ý͊ݵk{6—a)*²P?xï½ãz"½›ò‹yÇ…ïDô¡ÒhT.\Uvz©m1¬æéС±Œ’‰(,Ćk e‘ÖB:½ó£Qhmƒ¿c¯Cβï# ½…Bx•`“Ëh±x ˆpÉqù2;¹9ø½±N¥Î5“£‚Ä¡‚oÙh bsð"Ï#ªJONJM:P‘_×êmi"ýixét/b»ÙtØ g0m8™mª"©ÂI/)xeúješV­—ê!Ÿ¸ ˆ,…c–#mÌø¡4¾"Y![„b„œPDõôšz÷ö ¶C¥K"JÁC¾AlÈ2© ¸*,F»¡‡ß–uÍêA.:äa£¥MÈσ¦½ËAsßã¿£Ë[æ?øô Æ.?½œ™½” [Ÿc‰è½Õü:*ämb•Z­"}‘4è,’"1Hˆ´¸©›$2sÃå÷Q(òï:"x‘fÆ Kf‡† "3"w®^"]‹Qæ3é£Ñä´5Tl‚fhȩͯËófu^®­túªžòU½FT³v-¤CŒMTo‹±§€ä:~ØÏ×·ÑïŠó°¿ðÞhzà¹vÝs·ÑW¼|9dË|%ÚÀ­ì×-£ O>{gHzâ~aì†ÝMº÷z4ÅíPJ”IË2wéBòÖ ¹‡&¢‰ß ?*57^mûº­ÿS¸IÜ[l93afðâ„Ê´öö¾¶ã•R¯dÄ­A‡ãª·Š¡€HLNOËQUVÜúôó/Ûæ­ɘPf©dfGZÔTÕDßt³Ó+9ôB´“WTŠ3ÞDÔe´d*¨hòµ²Xæ½je]—8ÍçÌÇD"ÁëQ52õ£›` ªòÍ22 T™JAóD8ã÷:C¼ÌLz~µF«Ô&烈ÐXÅ6Ò¥.§Ín³[ ÜÐ&-V×È<Š8f_SàËS"»\í +¡Øi©nG3ù½ ,@4\..3«\r  2MžR¨É%h@mx"î£-DÞdÿÝ‹º®sP7}†grp•°?m¥²ZçÆ8Žúø£R«Ê¨¥´ Ñ«ua9aЇGZ™Ê¤1jð[u*­ôUæ-¾^«W€ŽYuÒ F“ÕzâÜ{#]î„ílK ÎŽ_šñ°É­ÿÒ¤7âú#Z+«Ýâ’̪Ðä•=ëî£Iè)4ͽ~ój?DåÇ¥ØL{¾¸ÝYËF~—‘ézC Ù-¼PÉ…Æ[}(R%àò »Äž)°?y:'æÀ¾Èˆ­@d û¼êOjÞîð:uô<¾¯Eãˆ'öª£”…¶¼ºÖІŽãq!ÔRX¸eՌŌ_³V¸iÏöLD˜Bž9.ø–Cn‚ðˆÔðaƒªèZÏ‘kl4Îâ gè­<•f\6°bê1Ь:˜g”åéeieêr(ƒÒ¢ëLf™^—´n³>7£˜U!-'½ÙÖêE~Ý( =~î»ÚÐc/ö1ª¯ªH5FP£-ÈáÇm‹ŽÂy¥-Õ¶j:4MQ €=ŠÍ۪㛠„CjL³z½²p$tƒÕ²¿<~ñ ze ´—COEC¼¿íÞ#nnè^ÍŒš5} ñ%é±EaÐ÷F3¯¼œ;ˆ%×vøj —3KB³¼9§^eiÍtÓ>æå•Ê£yôÏ~Ð -¸"Çsï:Ö¤,~eÃ¥>%ËyÈ¿þ½ûðq=ôÃ&™K\‘¯‘Ø Ò[ù–2:M!3e¨“ð_ŠD•b ¢G}ÄÅÉáýš‚Öö­²Ls‹Ç<ÎM“•‹Éa°\C­|ô÷3Ë<óÒ4f[x–wpž—žyÀ<1¸œg(2Xp5êm2R‡e¬\úæ ~ÄÕÍe»`¢˜d&‹‘0/þ}:"ÑNÄFIG}9J©0}h»˜åÌ^bÉ¢³(˜‚ µhám4êÊŸÿÜ÷ß|ö ¨“qWn:N0ŠÊ ÿA xÙ^öàÚ8èµ¼rímF[Q"ÊBÓ–ýáQÌ埋 qk²½ÍjÀ±ý’{çVó$¡iLÈâY{¶¼ùÓ ¼l†çˆõµ²_i砫輸—í ò5"H§Ôk°­¾F>l«¹ò ðq€Ì8•Ð’bÐkÕyy¯‹„ØéåÜKÈekñˆÆqÿîIyƒ‚ m®6S/⿤ EÆŠj´šoªSA6C{G”«Üý S ¥¦€yj¨…ÿà àÅ©ÎnSgß‘^¿`» + ,q(w%ØŠ)(cQ)v§$Ë‹ ½ôŒ‡`®E±I¤ LŽÕ‹}aðùIºÀßJ÷ë<¾]‹@&ðg©~Ò‹_¸5V¦#R}žÜ¢µRM­&os›w¤¹” µÅ¨«ƒR0aÈËP ÝÀ7pÏ}eÄB±‹Álµ8éqƒlügfêÐÅŸ&lû!SGGWû/$¬¯Gc&}‡Wv鬩Ñ@˜\†òJIÒ&''¦ø«G2ÇNÔÙr0¹ÉuJ‚5´Ï„Ðåª2½!ûùÄ÷~ZOƒÂGx:­ŒáÕó ·Å‰÷ÿz?y´‹’‡>7t%ˆéó3¶×šU7¸¤ŽfBÇÞã 6Ò¡<ôâŒ/™‰L$¥BóìçAèi´Åáv¢"‡f ½É[°õC4‚¾t ùŸúüÓ€øãõæ) Å3;¬g8χ¾xe˜ :êÐEܯ&ÌAï «<ô‹«)Cãî®Á›bNýbãþ-$C`0{É…ûÜk'l  §`NlxBÌîÜ̧±ÈHÍò`‹NyÐI/›ÎCìÖO|U0ij6ÙŒVüÓŒU+qé?`*ÍüíÛSÓvgb frQH!¼òn·^½Êùâݦomx°ûz§Z+ÉßššœDª¶¾™‚:S©ÎTm> Up6¡{W&̬O4°ÑÞ+(ü gpüO$Š‹c¹4l+?æ× 98$1lüo,;=;ú­GUª9VÈ?Y`Ó–ç9 YO,X>ëù×^;ø5 Õæz“ŒŸ2wʱ2ÇÊ_§)ØÉÄòq÷×âö¦2k|SÁhs8]uÍŽâöí— Nbù6q|3Ê®ÍB¯Ä4·!לbWKó›¡‹øðƒ?Ýû¼aÍ 蕚,}!ÿǪ'¼4ÓΔ¶sèc¸ø³lÆz(âëêÂ7se¡:©o¬'ľ‡ñ a2U4¡5¸Ïâ™ëáfǃ›ƒ±Rå…2kø¸}·K}²µb2ƒ£îšÚP…xxNãVc­JR'ש°ÖhåËä²EÜ‘} ˜©§L'Nž>1¬6ÜNP\¤µnRA .B_‚bzÀð<‰GØû?O©IÚ”ä¤_¢‡çšŸÌð¦.˜ÄÎm­ŸRà17›=ÿIÏäÿ–¦ÿìÐd¾"Q2‚ñ»»æsFgr=õ;1XÊ¡¥t-A!.GM]{×Ms ÓਠìJ“ŠLOÕ¦%Æ%á%$öš(«¾Q‡'2…Vš—ÍÌf^á¯D{Á q€!¬îÊvavÊGì‹ÖÆ$&$=´Ï%Ôi(’Ù²¾bšùL # ]³U›¤ |8ŒhŒ Ùà55¶lÁÃH ¸RƒŽJ5áÁÒ©Ìau`Ô†øx”Iÿ˜Q4F5nŠ Ë΋ǹ)×B1<›øJqø5ßÏ&ÛAãTVþÃu6øg0Ž~‡wä­Žª£EvŸÓ•„2C ¦$§~ï´…*×—¨ð8“Ÿ)Ði™tÆÍŸ‹Na—ñ<XÝc(v:G¤ 9ìqÜ=>¥5ó[æߨ6ª|»QÌ"u®x›^»BOþˆ;º;°Á#’%7EåØ\G­®£öG·¹ŒVÛðž*ùíTt2Ç=Õ×d 1×|—€ÿF'è,žó\Ç»oŸ.v ¸LZ«2—yœ™ÀŒË6GötÖ¶56g:²É|È“Ëd¾=Õßr;m¥zŠ[癈XWЫç>@à9÷´g·Á¯ß¿‚UbQ Žœyd£(”‰z5Лۓ\–ŒÉŠÃŒgæ23÷­~Ÿ øà ®êf³"yã²m¸O1ÐDÁq/WÑ]{¾ïx‡kwFR Ó«u*li¶tžÅu³ÑØ·à:;¸ðÑÎ¥]eRZéµúÙ ¾Ä·m™KH1VGJ Z-fáÙC_¯•EA,±¤{Í 4CÏ Y9BÆBbvb2¡òç “ªÞ§à°½­q­5`,u7vv´vÑëØ’LA¤€™¶A"ŒX½ F¬B·z=l4ꊼǡ×пãíVA¦&‘ST]_ãé8ѾcÀÃóþÌÙë>F“>úÏR³Â© 58  ÙŠyÏkòØ.ìí§àTý7uG^>ÞÖ NèÕ•F=é¡ëÃ(qèÓ¿ÍõÍŒ˜_àÔGþ‹$~Ü¥–"´†§HÙôÒ6 þ5Të+Ò"Gä‚V¯y„xÐK8LÜ«HÝÁA $â5Á;¦£•·šá2X‰¾¸C‚™i3™Õ .þâB´^úî! :½ÖzÂâáõ ¿29€è¬$Ne–BåFŽõè\/š÷Ç‘“Ÿ w9¨‰žÎû[îx(O—sKÞ3U”^³µ;OÄ&WéŠE©ê È>z©­u·õDUG‘s@ÈLV&f3£øë|’!ǵ”ºÀ]94N²Q¥ÊT$úNÁdk’–þäì%¬'»üºPœõ /Ø0ן{h.·SwW¾AŸžâe/‘ìVe§'FC œn›« Ï,ÅòÊy)…1ÑíywÉoàæÛ•7›^ÏÞÃ-)6 d*4iDÀ…‚† ðhf,æð©‹¬ÁÅöÍ èér¹ˆË¨„ƬW$oZŽ‹m»î&žŽ6¡qUGjOî=Ä9ûõ£T»w¶âüo.2föо^§—ûZ³½ ’¬‚âr“³¨´M¶6˜=–*³Ç~Ð`¬hv7÷\¼†‹Ü–MÁÆpfBa´8Q+‡l"¼!þèg­hŽy8 Å€[_B ˜³ƒúRœ…µŽ:[ûT ýćÛ<{ȵ’ê;#±?ðÎD4éì‘3‘Ðè.šÆûá«ÒÏâW) õXŠ··_B¯òØÇJâLlmܼDfŽZ6"C ¸ýÛ[ê>ëÂéTgR!MS榾È'IðOa¬gSuòóôLð'5ɫͱf rÒ…nE‰»¡²‘ÉKûmÚ9l[Â]”pnßGCè*ºŽÃ[T%đԞ­³w0³”—ƒ¥¬öbç,ÂjYyˆ´¹ÑÜ¡'øâ1Ë7BÚt†6§©óî£L‰kÏ>LÞ„Û—«î_¡§—ò²,aFF†Ø‘SSSë©%Gê1­þÚâ¤\¸÷¯#ÝÖ£ý ç·«/eÃfßþ½¶px_F¬:"l'ƒ§ÅYéé(9?rúüˆbÄ»rׄ!ÐU»)¨¶6Ìæ*<˜ÕÕõoÚ«Kªªê½'õÇß*5è#•êP|z^—×FÈÄè-ëD¢„|œ8yÝìÏÏýv¿žÒòõuÖÃçÂà®/®-o+¹ôÈj5¨@«V ùù«s#ÓÌþƒýÃ)ÈFñçѦóh®¡|´Š7’úÅÇÀèªj<ÞÓˆ>ØU@@™¦“¯gŠù:• Bj+p“.(·Z+;Ñ ü_|î_(™»›ÝûÈÕ°;<5\quge„Àž¤ÄýÊc‰M9™¢ÔÜhq¨ïläaÌžŠk•Ǽ@ÔAšôa*¾Æœú£}³Ì?"°ñÇîŸCycIMïû7ÿ]•¿ö†ˆsÿm¦ÛšŽ»¹ë‡¶ /ï‹Ð«/”‹2(Ük]QÙA4“oͯò dl4ÍFs|º…Úñi‰’þ0—ð×y¯2ÈäÙZ/Ü:ó³¢f³ìžÂÃ.løRiºz«›=÷Q'êµԋx÷ñTÖî©6ÙwìŒK±Â[rèäzgùÄïeIOÅT&ý `:i¶`®ÔóÖm4ÿÊqÏÄ›÷”gÑÄ·öÝøÚÍ;,ë•Áv"YðÒt2 6›E'N˜¡z¥¸8;3=?lSü»è™äßGƒåQv"àÛtK¼ zˆšª+·Ézh—9c’5 æ(©%¿¦¼ÎÕÓuh3.êÙdÀwðÊåÂ,aÐ=éðç$«Ü8ü˜Tб ¸7²ñæÛ£~‰ÛŽfHàÀá®,Äó‹¦ †YÄ_üÏgnÿà““Ý-Ñ'ÿëÄ£T—èyy{£_Û‚yjË}üâO·<ÌÈçΣ…Xù9è)¾ïw̘‹œŠÒ20(V2½|uèäâÜô´TÌ¥aòÃ-œoù¤öŠ­ Ï]•Äñ$oÄüf¶êÍæ­ÿb¸³iàÎ&ÆX}`ì$^èO;Mž‚Ö¦š¦Ší=ªÊß0 |/ÕÙhÁù’³há1-£ýxmoZ¦03“±UiQÖ0%ãŠOßÇ1c·K·Ðßü þº¹ÌRú«­MYœûˆ—ÒÐË}èÕ‘þƒs.¾ð<š%ãÕG/ó”éúl($¤)/îX ï“pºî=ï‡ÖJó¯_l7ó4ÀSr¢-±.£9½W[ÍÐVÜt¢4®S0ç »«éݦ+‡Ð|8Eü¬·œ•µ39j?»E]ÝØ 5ÎÃÝèe¾ÅãèÄ’nÓ4P t Èh©§ä6:p»ÄÃ>u¿Ë¡ÓègxÑ2ˆ{øu‘¯æNlv¥‘Û i,7ëÜ›ˆYÛ™'3}¾P>a.«¿òP'•™ÑØÉyœ4J¯‘î­Ï~)´ù%M6{-”uÙ±P˜ÓÙG…–Žò&÷–cÒ: ¾:žrÿ„Z$øÃî> stream xÚ]PÁjÃ0 ½û+tl#qÆv2’,[™›Ý[I mç¿_ì†v@OïIzʪæÜ »x+9´Qg»x‰Ð㨠¡(-Ã^¥,'áHVµÂ}‰ !ûýìNüòRµmCó×îZÓP8<(×Õ!{Ýœù:œ3X`Œd?ÛÄ9ø'e{> stream xÚ¥Yy\SgÖNŒÆ«"vKºä¢Ö;jÕÎèh­ÖÒºÔ]ë."²È"a °e_Oö• „%@AqÁÔj­uëØvjkít™v:v:ï¥/3󽵎_ç›?¸üHrß{ÎyÎóœç6kèP›ÍŽ\·tíü5+»lÙâiSïÌÉÀæï[ûÚÅD³™±C˜qæ‘¡‚›¯ýgÄ'X,¶ôþðõ¡1äÊê¿/|}š\Æé`Qlöð£Æ<¬2xw&dnOJ§e§å¦fM›:õ¹)S§NÍÊ–ä¦íHEÇ$NŒž6kÖÌIÑÓ§N=?397-1A½,A”šœ™ "ìŒ^“•˜–,’DÇÌI‰²g?ûlaaᔄ̼)Y¹;æNœ]˜&J^œ—œ[œ½ K(Š^ž™=˜Í”Á_±Y™Ùù¢äÜèeYIɹBù(‹ÏžÀš=tþˆ¥CWs6±FgsÅCXl-[ÇÖ³ ¬1¬Ñ¬'X÷±hÖ8ÖxÖ“¬ ¬§XO³bXYϰ~Ś̚Âz–5•5õë׬߰f°žg½ÄŠe½Ìz…µ€µµˆµ˜õ*k k)kk9kkk5k ë5ÖZÖ:ÖzÖFÖ&ÖfÖ ò4ÖP– Cž²wÈeΣœ N§o¨qØÔa‡¹ †O¦FR¿ñîÈå#ÏŒÚ1-â÷£çŽþ0òÜã}«îr¿âgØû ýà…‡f=ô¯äáé÷>²Œ?…ï‰ò>ºî±ky|ÖãGŸ˜öÄç‚T:šþ0º‚ÑE2ï•ÕôM©fw3 êC]¼½ããÉ•¢Ê| p]F£ Ì`Ö›t¹[]¡ªÆÛ˜ ü‚Þµå[€Ò”LéÐéVµ]]¿ðK\ÏÇM8(•ªÕPUä•V *Áév¸¨Hf1N0;ÞJ'—ÞjvݱÆ÷>j®;ÉASÐifÇæO†°9˜eÒµ¤;µog¡Ñ[øä*R"IæNA<¤×Éj‹Á¨J©Wi¥Ý;N½¾¯÷ ‡S|2k©5­¼ÌZè(tØWÔñ·ú2›`ìÝóÑû:Êš¡¨æsªßfJ¢% „iNƒ¶üpªýúÛ¾üZ¨ªþ<„âItäAކÒ9õv¨¯µLG#Æ;4V•ât(´•µÑ™ Ÿ‡¹âK8”M¡‰¨‰WI>è†6°|¥N®‰1HAæ¤^À ¼Z[<»È[O*µrmˆ@)Λ²ôÏ^6úøù˜<4Œ›ŽcÛ`”@¶#ÍOjTu¯š˜Ô^áx¡Û~Â}œB\ny;´Õ€˜Æ·¸ù ñ[R“râ@C@á8Àd±9Ž\ï…j z¸xôZ<:aª²ô ¢Ä•ÊrA38=Þƒ`*?J"òâØÞïÌäûZ3²5ºÂA~Á«ZrhÛy PzGO·¸ç%úyˆy%?¤•­À90ÚàÛ‚"Pmé˜Àf¨0È”F5¨Ý@9m–º#ñðô´8x“ì®ý3…šÁËØ^û> çšþÜpp北õ­@u´ÐðšÍÞ”¾tsF2P‘¨¾cßüŽƒ^ëæ5åÕ …yyBa]^SS]]“€¼‹×Ö ¿c£ÅŠ7ò.äîIJ/ÌÍÊ®Îix ÜâršMF£(£ÑPJÃüÔéé2)‚ŽRYµV÷{×ÑAdŸ/©†i«fß`§o&£áylv+¸)·Â)èȧËTýǰ—/Ó(5]©CãÖ0áÊU&BÊítºip«¬R[ù‘Œ›k¾_SÍ>Å<Âa–ômáYËÁÆÁU ÒéÔøÏÿXÆ'„Ò‚’9nA9˜í¶*ê'Ñ 1ÏmuXÁ¥Ufí?†¼ü2;I(™B!£AaU{ULùýäRªÒ¨A5p ™ Qn'* „âBÌ+Õl´ ç%.J*×I 1¥¶j‚`ÈÜØº«%bœ­ün…QE‹Ly¨Ííðþ=ÄG®©À‹9•¹^WX*‡B™L‚½ûÍ{ëÏÕ“;=Pí–C½ À®kZÞ7Œ¯¯KƒV¥–SXÜ¿˜‡6¢-øÆ°È> éBí ±™¿~ÆA¿~‡'OÒ+çU>Ù >õqÑt4ü WVõ>ãþÖÿ×kðGêÚâó8B€?æŠ?é§M„ÓUzŸÞiRNƒN'¥ª°‰÷:2:w™Ìû! ñ¸·jVÆ?÷›I8’Ækð-^)Um”uFÒ’¤NVß[¨…Vq¿ðÏß3ý<’ŽìÛšê›bû„Ógì[Â3ëí Ò ƒLöÊ\¾Â÷6æ…óp>ÎÁ%x‰Ùh2ýü®³ûàgïW}fÊ%½@ ½^©Š^^°jÁš¥Eëš6ö8šJCO šñg4âìåÏ~ Ô_NÏÅ ‰:©²Ü ÒáЂ!ÔDZû¶}ÄAÏýP+ˆ¥á  ¸(‰wÊBcg ¡ø:\ Á·«érð<†J½M²ÛzßÀ,õ7îŸn¬Ã|6âßÎÀC„)sæá1$±aܯ ¥€ w&„ZÛØ}P)Ïd5ÛÁDÁ%(@¯Ö«_Å1)‹ð©MŸK“Y ÕeëË´èg"/ûE‘{ÀL7]37µÞhçô<À¡6©¹ž<$ÈY&¡Ygò°:[*HrÁü* 1~qs?‡8x8šA€.g{ÅÑj?LÎ܆PV“ÙH›L®ÝÖÿu¾¥ÊZe©rwM=FÊê6úí‹’­Ô‰v¾°3bœBJòq@€6BÔêtVá¬B¶Už’…‡à‡e©@ýj\¡„\hÖ_ÑÃ'.~yö«ÿÈ+©×C¨ÐÃÂ|Ãs¶›\Wjp=’ŽÎŠÕe _FŒSÊî­z]Ù ¬ãã^îi$u¶›]W ê—ßMÈ„ío»ƒˆD1(Œt#\670è‰q„%Râ”,"o`3Y¶‹(ÈG½Ü<[4I["Ï–UòßA†÷’Ay`Fäov½ TüÂvZ8_'Ì|)3bœªl0ƒ}AâHWèõ üX;_‘¢““ÈEƒO%½tÕÜÔ|­9by–ߣ„|âž4Ph*0i-Äë8L*̱üÀ)4„) ±¯¢!f7ó7ž£Õä< T¥üNµYIç.×å¦ÏN¿ {] .¨××éì:(µ^¥Wâáýñü¼g®[9°ÎU|Ül zÔž†¶æ–lW‘d“tá²î-ïҟ·ê¿"xϹ›ì_Âɺ?'>o0Y >K—>˜¬ôÁuwÚ0‰Ü:0‚­ê]´“o 3ÙHYt„ ÂdUqÚ³ñ˜‹ç‡Uè^¢øýÖÁ˜¾Ÿ~»ßªÖ90‹hÌçæ€¤â~vÿ›ü˜sºZ=É5 ?ñŸ?ØoãË‹2fy(3H6ƒnÙenmk'4'v"ÜŸ*zµQVM|¬Ýh5»ÑãÌ>¾‘{óï,“ÔH ŒrƒÍmµ31}£ÉËx|ÿ¥Á¬£îÊFãEsãÞý{æþÚÊr›YnOó6ÏÕé ½g¦¬£Ÿh}žªKOK%تÕvƒî1¸ ˆÜèô%Ú¿Šs¿Òg0ŠH®r ƒˆXÏ‚c0˜\”Zf/ö“ä\ £Œ^eRˆLŽÏÔó-jÐ[åÈÔ“o/2ë¤ÃêKB5ç7ôý¶ž}ô3Æò1§OÌ,â¡ßŒE,<ïÄÙ¸—âÙhèSèI”ŠòÈT úç÷¿Ì‹yå÷ˆL¾^ô1‚o}û§ã„9ïÿa žHCl6žƒÇl^>kåLâDû&2³»#õˆ!Žåz‹‡ærÑ8D‹†^_| ?BãëÿÑ÷Ý]þâöò§8z”éº3°¿àÞèÎ&N9©ð7I;6n]¡Œ'B=–Ùùcw'ìhz¯í33Šùžg«3»üf§±%¼ \Fˆ¡!­xARRNκŒiäÞ¡\”\Æû:€F]‚¯©›ÓÎãGx÷]À~±â]276^nП&pùøh÷ßšTJ”;Õ"U–" )ÌBPþᮯ½„¿†ðÄWéU¹ó·‰€JWö9`;fi1yM~ðÂõE¡ìðnÙGœÙÔFâf/¡’Kœ¾¨;LC˜´tój~Ρõõ¯’ÔÄx8MÃìî¸c%Ëâw(N–À,jڬɗ`NÝ'€:kÑf´-ÁD¹TF 9EO’Ôj×`1™Íj+™òVb <Þ#=üý«.–ö’…èqâL£Ð}4¼•ÖVâÕ–X¦×æÛv¸¦lgZtS¿ïÃ?Þ8» @†VêÁ½ÌF³…x|æ÷bp›™Ç|˳7Zl³ÓÔ^Y¿îÒ¾@J¤MÒæ´zi8€As@d·"ˆ^â“H]Äf„¥EМ›GRV‰Wà—ù½†hSØÐÛÃϱÚ*O g|(†ˆ)·´Jˆ›"Ü|´?}Y4P;Ô¤‰LÐAh4jl2666#Æ5A³¾(WJ%äйúb#”f¨$:i°s „دsúÆ„%b¯¯ù'‘––òs1 ÷ñÓð£xø¯ŸjáÚ7i"º-î_2Qüÿr†«e jQþs|EÒf¼J+Ve‘%º„‘Ÿ¼òWzÐ}hX+⇆6æ„ÀI}OóŒ“l”“Œ6Aÿì:ªÅ¯áE|âîT¤ŽÄhxN0ÙMæÝhäñ h*}&·ÿÔ߇A[ º(…|faxpmþË(‡`C̰…"308´ª‚xüøæX<—´âÈ9d«´;$© ‰„m\‚V4~2æìÊ+ôi8tÈå6øÓ¥ÛÉ*©H‹ bH7f9›î¨¢*eþìü IâöŽÂ/è~¸òNÅJŒÖóÔ9¢Ü|qd§DHà*9ÞIÃá&42x,xdç> .xgkˆÍ&piIˆWï6ºy¦â<uþgFé ñ„þ«Ú³%ªÖ8•Pé±zý¿ãþ` ØÖÚ(“ÍÑj´™¡SmÁ@eÈO¼Á~wÚÖ&cvÞr¥HCt—Ú²+õÐçè)Çí¦¤d]ÆË¯¢rÕÒPï¬s*÷w¡QÐK½‘¸ïEÁRؼ3%ŽŠD_FýðÇì÷Îì?ÃA}ÃxÕ¥•¢ììœl±·¨®¶¹¶Y0¯?‚çi“+訶zÁOuetlœœŒ'(ä.0…G‘ÉZü¼³¹¬/UACª@+WælÅTñ6yNY:P[ÚR“('8¥diúò w£´ykÏ’B>K°v}Ę¢*û Ïq˜±$,iUž(S”Yè-® ‚÷÷™<ñ¼Í«×€šÌ‰³ÙNúºzÐ\aÁŽÄÎüÂKðYwýWŸ2CøÖjâ/ÌTO®V߉ÝI”Ýá¯?{ð,Yk¼>mYÛu2mÑ Z 3ð BºÿÍÞÏþ–C…Óæ±:»Ð2[}›îýbX *Ðêäz)™ü2jegâqA3+õÜ'ÿUD _m ÎO\æn§¡ÊRk©´Tʹà¥M3Ü!_KKmÝáîƒû€ l“Á£7†¿0€Á¤§6ëI ¥ŠÝâ !åžfQëVAÄ)cŸOKNJL.!Ø“úxûØÏqû‰‰)2Ñ+Êpbôët2½ Š£VH=$h…úêªvßnOïO…O¼’P0Z¼DøŒV«ŸìNC‡bߘ0/næéJÔ"ÐP¯¢BàŸÃ^m4yÙêà6¾¥ÊÑd´T„º?ù#P]ΔtrUYÊÌ,Lñ çi i ‰¸=¶zG‹÷içsy7Š@ì;$Y€¹…ëyZÙ/&‰ÿø>bŸ{Iò"lˆOYg(×µeÕåÖdXsalZR$Òô$4o…8')$’Ô²•ÄÁÝáѨº\}¸¬ÈÊd¬l=é¥Aš±Ñ÷ÿC–mÂoSˆ áÆ¹W:… Ó×lú×tº÷¡!$7·uÆ nj{(n x¹¤8­t%hï|µ»,ý‡à¯ ¡I 03®pºp$O™¦W‘Ö”UW†7»`“¹±µ­åöÚ*‡Ò`w’™³Í´×— SkE¡ûÑSèéÏW_˜Go„Í;Ò“ä'¶Õ¤Ü©dZÙŠ{V²Ê®ä +ÏËxö`°ÑW±+Ôd¯ª³.uåw‘öÊæô —ݰ…¦Éì!±¯þ!öðÌßÀÄò,:›J ƒÄÄ"aþ‰¤Ê 20Fâ18O˜xzÙUz?ì©koW¤¦ãÇt e–R»Æ@•É¡¸ÅòŸ¬çr(Þ<§Ýd39)L£Çy+´×«æ»j_èÚñ}{Ãc}¶ŠŒõ×p–N[’µfɲl2ëe5èìÇå¤'¾øìÞa²´¡Ç->G«ï’-h)o8.ˆd.Ê壄pû6}ŠÞü”ƒ>B'y¶†ÚO/ê ¦,KS˜ yÝhñu_éM¬‚ÔuRQî…µ.â§Æ¯Æ¼Üð£i˜M&gÛwê‰}ðïR¬¢agÑ¢]¼,5!žŒv”×[5¤¯‚ùŽ’ÌÜœŒ¸£…ÂÕ¸d¶yRÚ“ÎõMâÕ‡¡¢ÄåéUéÑ óµ“Š[ÚT¶€û)[±ûníûæLs?Ïâ%za„ŽpZ­(Ñk”;µUŽ*[½•lŒÚ’m¯,jƒìÁð`Õëm·*÷ZÜÄkÜ ÃqB¹ò•8q¬d5l¡¦ŸË<-ØmUe륛×å¤% ãÈ®³Õ\´§ÊÁëq9]åœP¶E.J/Þ´ñ@Êë‚oà›OѰ•àMGyŽ7 MoðNô6Õ·‡Àøzw{û? &[!©€^ "û·F‘¹¹ 8ò@ZQR%®-ªNêŸ)³ÚI“­×j²ùöP~U­²³ÄM„eǶ™±ââi3ù ¥®&»×@V0™lîÚ]ÍÁ¨—¢^XUà+&}òU/z0hÕZ•ôÀÿqT¢W—ˆÓ¡$¶{Zy‰¥€¡bPè¨Èüëv—£Ì'¸‡ FY1Â1Ò1*4òʨz[DºùÐÿ±Ö0e endstream endobj 1754 0 obj <> stream xÚE”yPwÇ»˜i  í‰=£’x!‚[–Dz’HDŒâj¼QPÄár˜Ah. 7Â̼a¹ïpTˆ⭉Ǣ‰j¢«Æ„`Œ)]õ5ù¹UÛ˜?¶ºê[õþyýÞç÷ý>𲶦hš¶Û´nÍ–µ[æzû}¹x¤^JŒžΰ¦P‚3-Lµ8‰0Áz*EÑöŽ¢R¿}4¢FôcQ˜[N”5M3|BŽ»ûßÜÜÝxk¢£ÃCÃxŬàÙ %K¹*¸»/Q|©ŒR+ü‚ø0ed/*ÅMp¸’OTÌò ãù¨¥óçÇÇÇ»EƸi¢C—ÍvUćóaŠ/•1Êè8å…FÍ+ÖE*##»ˆ·&2*–WF+ü4{”ÑjqRé,z.å>j7¥¤bhŠEÙRv”#åD¥ÆQ,5žš@M¤&Q“)oʇÚHm¢œ¬(š²¦ü©“´B_²Zbu^ÂJú¬7ZwÙøØôKWJ[eÛdU‚Ö^ð ÆÚ?7ÔЯ¯Kð 1²%P"‡<½!¥”LE6×ÎìÀÑ8åtwY©Á&Æ”“ŸÎ%Á¶­™d2Qhˆ/; üñEç¹Ìÿ»¢Vl{,`ÿ°#{HgˆâvoŽq&BvÎÁ¥CÌû"Yˆ6Õ• ‹vŸ@W×Sè°s±„É\µ%mò‘6ñ7¿[è³o.Á£¸‹­(ï´T”]¹xù<üÂàè™÷ˆ#±ót_à"«¬¶µüø™mÊ5ßîo<̯½ž‹ä0c¹±%cˆ?15 tÍri3®´QIµñ™ÛRdzA0ÄG:‚­å6JðøëKMôW¸û?<ˆOÙ}ë§ÇÏC6ËÅ}kÂÎ2Çë-‡ùú½QšýÁ®¯üPŠ“~üCV |\÷À|ùüÀüàqq†béz¯Æ¤¦ÖšºfÚö–Å:Ïß3VÓ4é"‡ê ä¤H¯[›“ ÏÔC “\•܆8Á"ŠoÝ•Üð¶ â¸ÐëÓ“É­÷Á#ðèb‘`Ú2Ž>6æÂÅ‹¹ðX$ÈË–i‹ÛäÞZ¦É>lØ÷6$_öa·7/ÑÇŒìã’úuƒT—ÙÒœöôN`Ðqà§òâ,c¶\'bÊÈÞóU@ê&ñiýËU%é&èI´D9é–%BjWÆçÐLKr5†Ì|m>0_-ÞdôVaŒ‹)°@çV ®¦³8ÛBfã•Tï¾ÛÕMËh~&M22êçÄîþöoîrT›d>ª¥/<©àìÅy—£¦¨ VJ‚ŠeÛÑf“Ý@…ÝÎÖzQÝ(|7î¢U2 endstream endobj 1756 0 obj <> stream xÚ­V{pSUNh ZŠ‹FRs#‚‚ TAyº»Ø]¶-´¨ÉšÁšÍšÇšÏZÀzõ"y»Šµš•Lö¬a¥²ÒX¯³&a±YѬzv<»vÌŸ¢žfG÷Í‹9ÊqYã.£ïÆïŸP35æ½7¸Âøl÷„Ùƒñ·£ðKsÕB£f9 ™dÕ>h "ã8x1ž„ÇߦàƒÕ§Ÿ®Å¨åÛ+ð%ºüò9f2ŸùžS¡ [½Ðî9“‰V ¸g1íî1[û OçÜiY•ýbBóÅH™¯¸j à—Åeq\Ä]<œÉùº{õºY³˜X*np䂉¾…—þ¾ÍÁyxÞ‚ÅøÙÿ`fQÌßã š; á‰<þã$&Ž‚‚jfá&:sÝ «˜ €˜Yœ{Ñ ¸ÈGÒÐñ#åaö§8**r6ò×½Ûâz Pf“¯šÒ‚ž ÈYiN7+éªÈñµÐJ™¡ÚŒF‡”£04$ä•/~%u-HaCz]´¾c•ù%â,ÙÚäéר[€Yïµ}‹â¯ýJ=¹Äõii°"Ëásè]*J+£—/U¨c§ÉéÂgrSgP Õ ½AÎŒZÉct‘€¦Ñbˆg½«I3å‚.ê˜Ç†zxÊ%eIF¤Sš*tv‡²­ûݱÓl~xk,Z*Ï,rÀn°[ëÀŒ§D<3w}ã”›µOÚl iŸ4¤ ãÃ!|(<9röz燫"¼Èà]Å?å|ö‘t ™’¿l.HÏO«I%ZOâ`…œ‹'us>G_Ì:ÇP|æð(NÔßS»¬÷Þ`Uù¨-Mfô.çk褀u¨S@%ECTZ¤£Ü`·8Ìös¸ž÷ðü(çF(=›‚jm‘^ª)Tå@úÃû~Ñw'`£= ~ Ðj“¡lÅVi! m†P˜‚°ã€-lëxàLîî×› ÙǤáÁgºØxå%\{)jpþàb®Ùfq€9uv-_ Fc²FQ²£F™{juÝ•bb˜ñ ‡‚Ôî|»6¼½S3P¹[mNm§ö=9,B ^˜;m%ӄ⃚­fÏ[c6ð`2è%ÙÌBž¡J[ 4Ò8ôN¾ÌæZßᓼ èTÎwÄÒ3p ž‚c)8XÕ[… \ÞBg®[â9×5ÁEtõÚµïo¼›Á°ø 6HÁ€”n£“ï.`=ñù?‰Õ~z“Ùùžëî5[HÑ®p~ðl¤ T·Õ¤7Ö˜Ô`D 7íàׂÍa tർ:%Tð‡®sJÁZi ³œgÔÓÐ!Sç"û,vGÃ)¼ Ó‹çzƒÓe6i(  å&Ãj!%¥kž´C2(¨¸`íô9'é qa] SbÐ@‰e‡Õ`ØÌ6«‡”!›”ar˜=p-jpÞHƒ[/ÝÓ ú2:ñ ¢3éM:£vó¥A‘ÇLg&/› hErßM ¬¶úo#Óyî^‹û@MÞ‘&—S2e&´š3J¬Z@ù½&Õ©ótåeóyë™íÕ¯ª 8žsŽáã©€Áãva.ŠÃ¿¨B*„¹7Ù_^_ŒÂÇ£¹-òzII¡XTV/¶w¶vñ™§†¢¸¯1|}•^ •ñ›öæ½}» |UËW‚QK«$K³³s)•ö Z¾nO‡§£¶£ûSž;èí†t4g÷†g²Bí4¸ø>0;¬žÐ­ƒ]$¶<ú" T¦j•ˆT}9³5¹>‚©ê– DEž# U±¨¤¨Dæ—µvµ‡ÚùŒð—¹U)›V¦€ªlFs·ßÖnÔZá“—÷”žâŸ~#ø½N¯Õáê±7¿â~§î8˜ƒáð‘CÎêm–fPðj3N–®*¡µ Ci‡Šö߹ϽâEYB! ¹Æ¤ èjñ´ù÷Àãà$º¼¾7‘¿Òò¶$k>YÕ¸6CŠüÕDí™ôPl‡Rie¾8Cµ‰¤Ð][ÛœíÞ#§÷jw”–QP¡—i Œšªµ†êmÌ3ĺRt¿ÁO²ƒ7ªLäáû”y0#Žl“¢€XKñ`F‹³rÿ£%°~S¡P{"s×ȃR‰|'a±ñÿÁ"ÒͼƳG™¤\z‹™ÈÕì0jH8T“)©vëí”Çfýp Ù9:ÑëªA™7ÎÆK]x¼OÒwœ I$¤¦á[un)µÒ³ EÒKI ú®dKÍ2wîë;ÖxŠ ˆ6§DL²Ä 6jЀœko‹¿qoÿþ`/ £M[(ØV&­-y-=“tÓ_åWX,µf+^øèû¯FEŠ# d†š‡g¨ÃàRe³såE5-¢þd2=c˜)d‚Î|òüš¨£Ð×ÙÕn¢w2“ •U©`ZmBJre¹¿øÈÀgFos>FÚè¿I›Ánó#¶pIPЕ²õ)™) Í’}oQp¨ã§–gì;è|ÃKZrõ0jMz•õ ž@â1³¹zYFb M•½ýœÞ}£å¤§Íê†Fw]›gf3O(ï‰Ýö¯„wò»U $j‰b{Öê­‡f}Xršž±Ùë3ú+záßtú›zëÞÁ©¶—^W¢ØX‘– H¢„È€r÷8Úmþ3¶Æ¦+> stream xÚ¥y TWÛÿÄɨHÝFqé Zí«V­K­u©Ö}CQ+î;;HKØIž„}ß;¸!î¥V±5îFíb«mµ¾­ÚÓÞñ\z¾ï†€¡oí{¾ÿù“0ç sçÙîïù=ÏsQvv”H$ê·aӇ˗­zkÑê fYþ0# G ‡^¬‘#(a¤Hx½—À‰…¡v¯S”¨h¹RO_³\¿ío¹Ž"—±ÓRv"£ˆPO™2}ò”)Óʃ}¼¼åNãÜÆ;M5kæD§iS¦ÌrZàïìã¶'Àiõ¹·‡ÿ9¹Ùçôa ›‡<ÜiÜ\o¹\6ûí·•Jåä=þ!“ƒ½æŸè¤ô‘{;­÷ñõpwZ wZ³ÇßÃ©ÓæÉ×Eþ2…Ü#Øiu »Gp±U:Z4vØf•d}ß]#£ˆ©bÊŽ¢))ÅP½©>T_ÊžêG9P¯Qý©Ô@j5˜b©!ÔPÊ‘F §FP#©×)Žâ©ÑÔÔj,õ&õ/j5žš@M¤&Q“©·©)ÔTj:õ5ƒz—šI½GÍ¢fSs¨¹ÔûÔ<êjµZD-¦–PK©eÔrjµ’ZE9S«©5” µ–ZG­§>¤6P®ÔFjµ™ÚBm¥¶QÛ©ÔÆ^”ˆêE¹ŠìE½ü{5‹ÅâÍbÁn]”Áî¬Ý ÉbI݋Υ_HC¥™…Lsï¹½å½/ôaûlècì;¼orß§ö ì[û½Ù¯Îa²ƒÂá·×¼ö]ÿÝýÛŒp~`ÐÀKƒÆR;¸’eÙ ¶ž}8„2H܇¢‹ÎëÛR3¼d#?†ãÍ|d¬)o„"ý·¬c¸7›/;9S  ôÆ#öãg•µcÐG´ö™ÕšÄè±Èš½ìòŠ Pp¤Ûs*E ¹Z­F§$ò‘%¬\¼'.9. ™ðbU‘ñ«h0çðžá…\/BóÍbaÅFŠâ2â3±ãý½ˆƒßàŽÁTÖzøÎ©#'ê2Ó3²!—ÉIÒË89Ì\÷á;ß‹˜‹ayÁÄËO-úÂ¥˜ª }o¹æ¼Õ›Åèwtž…+QW<Þzóýö `“ ?Ï:Y}sU]}7Î ÅÂÎölVh»ó4âÃ’ãðç.tLˆ $2òRU g„ì’§$©0‰NšQ’Œì;Z3 ÅvXò&ŽWâ5ÏðPd‡$OÑp´’þ8}5ñt {õç›7¯NÀcðØÕ¸÷ûÄF“@›ž‘P&]î²…PåÇE@B|Rô¾%n2·•F¡F™cäÃ!C¹žéx{š42|ýª GétaIæ ˆä§Ñ±&ÑÙŸP†Y|åS6!11TŒoqè{º!;ë_#-…rOO•qXAtÙ=¨(onºy~aPßqŸãþ¸÷œ9ïºÕÇê+‹k90$d&§;Vy˜/Í;fð°ÄÕÅÍ×´ß„6™D·~êt fŸ[²ÙyýÚ|ÌOó> d·@KJ§ËÑjAiL…Ò"WùL´ @Cîÿð˜ƒ{«Ïm7Ü:›y™ ýîüËX‚_[±u™YxE…A_ÉAvJnrfC• 2€¹Þê¹—‡Àè½îÁAáší)îj¥%DÄÉBŽà¹I`HDo¶‹"`㣠›‡2iQ9¤ãBG‚Ÿogä–ÛhÐå¹Ùv³=£$d{st0$i¢C<½ƒf‘z$Á¤·ËMhªIô­%ðB ûòe¬§}âEœ•g×®Øö÷ìMØ!ÔÊL4x57iqiHDhéoOKKRuPÈXÂá»tbQ¦òy¿Sòæf0Tq6üœ7£|âË#ô5{¾øJ+\cîÍüÛcû™sgq°ôÊŽó‘+Ãl€ÙÌø§—þøà _Ïos.aæÖ³K\Z>>Ývâζí[6¸ì^Âã‹v³Ï]¾øIûýïϹ¬YáüáìÎZ8ã2ª!‘3£ÒoÄÂhTÎFãAs§MƒhÐ* ÓÒÓÒ¡˜)()ÃüwÔ¯E4^CƒÐ&‹©ÛobÉØ™Ä,Ƀ©ÈŽk…òOebÑV›¨‹$,±nýæys6™n~síã›Ü8°¡x£.I›¤Mf´É@~4‰§íß°pZbã'Aüw‚ŸØý´º(³û]Çx×¹CÌÆû„ú«ST‰ÖI¦eOÚä¢ìà/Y 7G*¾Çi5ãpÖ xê­TºVgs2 ²ÀÀT(òUœb!2ßÁîŽ1 ±‰ eA|V2z€ý3S²4Z`Jô…å¤fDgÇeâF´ÌÑm¸}÷¶¨YØ(œÑ6·‰0³;Dñø åNú¯&Ò¡çx"[pˆtu^¤«ÃëE8ûð=­Y‡Œl^Vn&i õQÙ éøòsLLMÐj€ Wªä<(óãsQ#^æˆãµûS’ lXpYt!—éº é&ML½¨Zð£Â×lbm\¶0q´Ä%$îÃ}:JÃ;[ ßJ(â‘ÈJ¦ ðæ $h2m˜$ñVtS­ÈFµá4¶CÓY<€®DÒ49í£¥uòœmÚD‹Z$3¡Í&Ñ3’›ÅŸ ˆUYY§ˆ¯ìPÑ/ï†Fô…îòpÁóÚÔŠ;•µàc^s‹9<°h3rÞÓ¯Ùç%[6ÿ>È"!½W½x×6Ïõ3ù®btØŒNÜ aÝDI1‘>òÒUkÁC°ÄËñrÔ ¿Ž‘äÁ·È ŽOP%à~£Õ±ÀLõ©Qã¿}þ_ßÄ—âþiÁL3”—vÖ*…Iô¥å˜ÅzºdèP„öpÉFC¿G£Ð;èhÆc»ŽVPü EôYR ŘY‡í,Q  m1‰™Ñ@s;!€¹¨™Eik¶èäw•ª0 ´Å»ÒVö ÏîJ²}¸ŽÞ6Õ5ŠÛÀ[ëÝO]BäaÜÂʵèW3b>HÔ.D•,òjµC;J~…Úþt¤Œà¢šà¢¾Cág»CSé‚‚’@R 6ÓÖ™hB‡L¢f3*&üéŠö²†Jh¨·<Çö6ì¦æz/\Ìüù¿¡¡ñwŸßáÛàø¶Üy:•.¼¡k/íÜ`9$©¢å¥žÆ dƒíÇ‚_Wÿ†Q_þ<®+.f‚rb«:M¶áñ3r'687Ú°Œè—í„oÆîhó_Ÿ¾´ÑØ¡é‘-¶U!–îXb“ô—§tz‚„û,Q([”p @dvFêP`ªÇ}KuT·˜ûíbT‹^°hZ'i6hZJïTËÞûúÕBwál Ê6H ­u9’Kÿ^ŸÑ/ׄ¢ÁôCRyGâ$Il@×ó»V7äàß¿›Q4qc9qãcÛËx–-2M /Û`oâVF«0n)Ž–vI»ÚŽ Ä“Âël´[ôÞ¤}Œ†Nª‰«‹mX‰¶9ÆÕÄg“YhÕ^#Ôò ©HÖîYÕ‡Û/­4=$; ;à*áë´˜¬ Z¨…¬Ê´¼Ï«#hËo¦m‡ýÊ—ÒZc&×ÑÞ„ãü™.û~hGÁľMÂu6ê`((€Yü€ zl¹à£¥ vo+ÞŽX,8xÀHæ¦í^Ð¥6|Q=Åùhè¨Öˆ“'ºÛìsÖ´ñ¶´ÙGC«ñj¼:T†[ðQƒ ­FÎeUè(‡÷’{ÈËbÇœ…/¡>ƒ›y­ùgjò>‡»P“ïš»ƒ p.° –ÆlŒÛ¢˜4½Ø„;ù'¾“}’X‚ZÔ÷ÆO?þ¸ø'Ü—'ýñ? r´í|-(ìžÑ,Û´iﲉjÄv×.–Hrn¡ù¨yP4ú cÏ6±úcæ»y_“¶/û¿¥–;=èÌmÚFMMPa"Ø kÀ·Ä¯Ô¯&²˜O«>k!Sw<A ñe’Ô^ª`8qŠƒKodEG7”ïOepÿFv)r¿FÿxxíÎ]î.“»ËÇÙë¨á:)¹¶òèïzxmj0aÑü¹¤çw­ñ̉9²«6ñvDNʵÈT¸¤,Ý >̦Ý.àö‚[¶¬hGõþ#šRM‘FïÝÙí)yÌJU «çÊ ;?“ô¢¦X2C ææ÷y¨?¼ïû‰í¹^Y¡é ‹£Óvæz5Á1æÔ‰W9$…ÂÉiÁiþÅš¢¿ J3`ùvñÈ€WpóPK îÍÏ—¾|Ò†t(6Km´²ø?HÚ25Ý4#Úf"¶¦G^;Ú¸½?¤Ç8oÚ¸Ñùìs=¬‘þêG4ð`ÊÓ§~@8‡xƒPg•*±°È>`ɴҶ©ðKpsô&Å”ä½Ã4´º,±!©r’0Ôñ@yWN޶¢‘¬Dƒ;òsÜõP Ã*„µ‰é’Ÿ'¤ˆ…"?§º 8slp5Ò{ðÄ I»S¶Z4|º mLÌ‹+QBùkxRìNìª^•r(©5éønô½c¹-s¬¤^ Ù¼–¾Þ‘›ªL m†aÙD}Ž15ó ’§attêÞÓXž–#/'=ÃAH-Ó•ts:¾ ”d’2Û˜åd…{øUxø4\R\Õåï(›åe4b° Æ…-?þ°Š ÿ-rþ;KÂ-ѯ!=äï6Ã=ËŽ°†ÄFoÛö.•D}ÀjÜ?ÁQÓ ‡]Ѐ€‹ÌË =ÊVŠô4z,ÁËB¤¯.rhY·¾v3ª$=…ÃlN!™Ys˜f9(9üõ+€ R|§#8NI7̳ôzj­?Û—…¸XêðžéÅâK€Å—½ÙBk´Ho½’öOðáÿ\!õÍŠ?À¡•´íÙ„#èghØ‹Ilrn|Ié¢Ã,]tBZ‚6}ùçRǜмøbÒÓ—Zzú¬ýYšT¦['É tá…Û™_DŸmˆžðç<¡ÇýJ«íºÏg&üÃñŒ@?CëÈœ¾Ò$F—…Y,d¨nMÕ@¬F£UkIÐ2 *ËtãhNzNKK" #Cœ–áÁ ÷k*ª)ã’-Cø&ÑGæÎý‡šØÏ]>ÇN;Þ„ÊÂEu'¹êÔËáÖÇ}×ðxŽ;n‡ñÌük«ŸpypÚ}Ú€4WÕÆÎ&"’WA(„e2 ®±„gCÝ”^;a?0k÷6æáÔÓ¨¿–±h¾dB½:+‡ÖR9„ËÖÐÌ·EâXÐJë6ë¹:ÿCáÇó‰Ÿ<&ãkßO±¿öDx0xÝ… §.^»°ìi+—/\ìþÕÙN×®˜D7ÌhßOFHÄTÙ .¢ ^‘¨ŠØ³˜w—^»¦î4˜/†MèÕZ6>Õ§*Žf•^_u{,lÇ ÖàӱÿǑ1öº_ y›í:m¾Êv<‘V”º•o$ì/~ë-<¿öp¢øVh)njböAÄQîŽ-“wÑ ÐÖuçì–®½zÿéÊ­öÓ›\;½`/¡~d‡>G9d<™Ö±ú28ˆ˜•?c;L‹ûâþ¿CƒÑðÖ‡F‹|Æã!ëW‘ásÌ< |Ìh/±¥÷>;ô \‡#;2?è,Üm&dOp¹’?[èÅ¢Þ6kpïãô­‹ÚZ.Ufˆ4SZYPÿé,PÍ›½ûm~Ë[ÒNž¶xù·½Ù£Ó¬±qÛ´»„f_Ûøã!R ÷Õ…ºU§O*Ü“±"š™Êúê¸ ÕG«ÐVÙN³’-›ùœôo™;=WXªÈôUdúWtWû¥äæ¼g«ß`ýÆMïß]k77A, JµÆO½ÍMáÌh3v  oaØ+ ¬'=s^ŒÏ<¨©ãPÙßy§Ñ“®ÝåápzKmš¿J€¹óWLÐs“È(ÈÄÂÄøž#KçTÒc°i 2I*{ìKŸc-záûy¤ñ4À°R¨€<2QXE ±ba;ÝÕ‘ûÙŸ¦w࣠½¿*ò\B­ê£ýEžàûU‘ëb=£·ïf4ôtTrº‡Ú~Vz1B5—éQFvnX ¤æ·—¥Õk -X¼:CQì’}„¸\™™n€EÁ,¡1’Ã=ˆ®o·Ì ~ùä¥?IŒ/míÛól0íÒlL•¸õ8¡êÛ}´À˜{˜‘…üÇ3‹7º«üˆZÌÖX“ñ+]—¥+È„2†ôÙ¦éˆ@Ë?Ò£3¢ ÷§«Iha+žà8#Ö'YIb‘X£<tÝñŽ…$ȺüôÌ\(dˆ©á–—#,/‡YZŠtu ñ½ŽsÔªÓb@ù\U€Â- 6XYê¨n Î!\&s«Û}–¿mŸÖ|×¥SfTG¬Üþd òÁòlëèñÀ:zl³•(VŠMøTi¸ ¶kôxamß/ÚFœm=Ð1Ë·«!7JáÔ‡µçêá$”2è)qê ªcò¬Q çƒa¹zKÐ:Ø a & B`¦fâdš}~Ušl O=Üù,H·ã3ÿVÅeµ‘Ìdöª Ô&ðx¸š Šù›ö],á¦crª´uõ2m> stream xÚ-’iPSW†ï%!9(-E½·›T‘º à®H¡ŠÈ VÔ©J 1€„Ä$€ˆ¬#†ð!Œ H©˜ †4&Ä© n(  huªVÑ‘¢U;2n£¶ç:G§M´ž™ïü8ç}ŸïПOÑ4í¹fåò5ñÑÓ#bV»æàR9žoyWâΣ¸ñ47ÁcyÜhþŠ¢°·‹½\øÂÅÉN¸ßAñii·é‚‚fÍŠPªrÕiòT­xJÊTñÌùóCüų‚‚æ‹¿QÈÔi)’LqŒD›*SH´Î!C§LI“isÅS¥jµª999…&@©–‡Nõç¤iSÅ«e™:[&/SfjÅ+% ™Ø•9À…¥B•¥•©Å1J©LI9‹yP”75‚I¢êKj4åC¡ÆRÃÝ(šâSrÊNO¢O¸yºç-çÙù‹ùW¸²Ï9œm}çf¥{†ð¹!wß`n6=Ñ1…G1b=Ö6Þ`‡½Œ" š¼ ð.Á¯pç‡ó‡ß®³C;\Íj\R¿®"B!ü¶Ç)çD¤r>Îàh3ÐØô€‡É;/Æ¢=䀤B\…3z¿[˜¾l’TÐYÕ]]ýÐééëHúBMäºæ1þ Sô LášW<ÎŽc™Í}~qÔŽ¢¥ ‰àQoZšõ±Œ±XZÏÂo{÷›d,afψ?QZ{ø§†£ÖM졳½Ç®zÛµx¾ý>|i4)& ŸââòrÈ@\¤À¥çèe,Ä"¦ßž³ÑCãBÌãá“xì^=™¸E%†‹Tà»gãGÕ&hF-šCé*ÅvÉì‡Gâ)/†^°p3în¹kêëƒûèÞŒâI> stream xÚ]PÁj„0½ç+渥”¨…BA„ªuëaÛ²î²ç˜Œ6P“ãÁ¿oe=d˜™¼÷xohÕÖ­’è·Õ¼CƒTÂâ¬Ëz¥"iBr·O±ò‰B«3ŸlB Çúxû(«ÓùõéziÒ8l€Ëj²}nënN­4ä9 g¯7;»ÂáMèÂîË ´Rp¸V]Üt‹1¿8¡r¢ˆréæˆk³a-S#’> stream xÚ¥y|U×þ,KvFˆAXF6ˆ3¡w MŠ`”Ð{MH „Ho¤'›¾»g7½‡ôMÛ$!…N”¦( J{AP4T(wÂþ¾;D¿÷E¿÷ïŸ%óK™{ï9Ï9÷yιWBõîMI$Së¬7-~¼Õе³ÅŸ§ïĉϋº¢M„·(aˆDx»—ÀI…A½ß¦(Irò¤~è'>ÿõ†øI£w  zK$ŒP‚¥å´I––S­¼¼ƒ}w¹¸ú[Œqk1eöì™,¦ZZζXèáä»ËÑÁÓb…ƒ¿«“‡ƒ?ùÁÝb—ã.'ÿ`‹1s]ýý½ß<900p’ƒ‡ß$/_—ùc'XîòwµXëäçä»Çi§Å"/O‹•N¢É“ć•—‡w€¿“¯Å ¯N¾žÄR¦¯t5º×„~ó¨…Š­Ôö!”¤åAyJúRC½Fõ¡^§Ì¨~ÔTj%§R,õ&5ˆRPæÔ`ê-jÅQèáÔj$5ŠM¡ÆRã¨ñÔj"5‰šLYRS¨©Ô4êj:5ƒšIÍ¢fSïR»¨…Ôû”õõ!µˆ²¦SK¨¥Ô2j9µ‚ZI­¢VSk¨µÔ:j=µÚHm¢6S[(Ê–ò¢ÔÔš^”„êM”ØJõúJj'­èÝ«·}ïìÞսϛ0&q&çdse×éIôEÆ…ùèµõ¯Ýï3¬OpŸ¶¾óú5fš÷zß×Ì^3+4{ÐoY¿Î7¬Þ¸ÖUÿ’}œ+N¨gß`•oÎ}óù EoÅ Å÷æNæíƒ—®~ë·î Ù1¤åí!oÞþ†Ëçy>ÚÂÄ"ØâÎФ¡—‡ÍV6ÜvÄ[#ªFö9häAe&<ƒ`b@:½äÙ%´ûÒýo¥ÂUakÀ¦È„¾×ÖÒÌ%BäÆE%„F‚/ãS¬/Ï/(«w©YÃùƒ]œ£Ë½ãÞuÀ Çôºa<6™ë~EÛ)a çN·ê ´-­{5‡MGè%JháÑWh÷?®ËÖ=Xª9GþH¿¯Ê¬çÑ7 ¡ìwöÂeA¦*4Zåî•X¥Š„hˆd0=h3áBõýïW½°_Šî‹ØP ùjÂÁf¨—ìéýÚv®öÇéýv&Ĺ“B?³µ‡¾€Ï™«3N>oõ{»‹ƒ*+‹Š*kýrwqeg s+oÉV<âl}Üí]Õžj_µb€‘ÿ­‰Ñ€’‰Hƒ½\«ìîþ'àÖ.›ù —l¥.¾B5Ì>ß"O_0‡©‹ƒúwÜëää¿ÁÝEWÆõ€Š’Ùg®H+ÑfÖ•M'*pî²s‰!5ù2ˆ²@/eçN§a¤`CBjÙ:Mt8ƒ÷u;³™I·Œ6zŒ$I2£A·$Gkó (êžô)z̃2‡KƒÄ¤”ôªÆ¶ÒcÀ<<É…'\áeïíà´VÃâz¿+ZHQ§SX™]gÈ÷ÞãéhùÕd$E¯ÿô½^ŸþKx[° uuaк*Úoõ»ümvz\R<¯&øGÇo ²‹q€í`ŸfW•¬ 0‘ÂMxý­ï’€|‡<:–~'ïFƒÑm:3ÛË6þè BKB‰ ãäí“XQQ_uÊñ¸%!Ï¡XŽýxùs\ŠÌßGÒ:É'?Ä&œ¼{lwõZÅ 7ð5v-ìn¬ jÖÜ‚<æ‚QÉf: Õ+ œÀlÉÇ&ÈÙ}í¶Xoc† goHÚ ÷;¤B„ðŒMÏ1X'Ã@•­*`¼d»±“I…,©$íTvVjÊuÈ!~;ËÆãAøMl‰gÂZs%Ø·´Â¡lî0 ht1bŽ_6Î^ÑÕø{§ U´ùœ_E Ö£À¿ê™O.øôêÙ rðá*;GFÊ)ýâÜdîO<9eØì“9pÊq)õÜ”’ð‘3#ÿvšÃê•0›úób’ÞÌã!ŠƒG Û|ó”ižù‘©ÌÈí,0¯$숬4Ÿ;Çvî;ÅÁå#§/Öõ˜Sÿým½0T ÁÒäñü™Ð}ÆÐX…¥Û×’ªis’Ï>&I–¦>™²àB/¯ `%Ç·ßC,ù('ŽJ±é§S0=rÁ@þýxD‚ðì 8x<¿‰Ýl(AÚílÐ~‚{ù)Ú_uô@v¡òEIQ9ÎI+a;óþîá¹öDn/Tx­ò+%êçáYêK(T_Éá¯zÿ'­¾äðÿcp@woü4s–[ÅD“tL0²{ú—W‘©®¯qðó0j^!¤$¥$3f]‘¼ Mo’´w-vm&ù™SEÅÆw?“…@ÀžBÈæ…çx;›[ ÅEAÎwÿ&‹„=ÅË›ue’ nk¬ %5]k¥ÂÄ®el|¶*M,{Ôqq¡Ø­û;Eän×ùB¢ûI*ÔkN‰…ÄZmˆ ]—¬KnE¬eÉNàñIQZ"»æëÀ‡T͉Ǡ¥9n‘!ô P¦GUB m`±R†ú &f]nÄ‚Oô¨Þ0 ¿.=üð‰\@bkt©­zSö¸aÞªù‹MäñR+Ù'…ÏÁæ›ñ7±‚ëfÜKdWuJg¾»˜vV+çsþî2ùÏÂzëþ·<Ü{ç ,Íbðf|ݪN­áQ)ZC#æÀØ•óW½7‚@`èšh´w ñåR¡Søu3¬=5Š0ýF< OÇöxzOEëÑ»?¡·ÑkÎGÄj¢cðlºp03ð’ãhªFKßâŸÀÏ Jñ ]„6>˜–›„bd=ñ,C–P±![02³®©d½VjéYφ¬÷P\ï£ÿ\OÖœxZ~µF¶L ŒÔ÷èG™n3zVš¡tÇMAÉ/V CA¿.sÆ•Z ( Œ0FÎúž´kA×öO o^ ø÷8nG3ñ;h3.×UÞë]çšL&¤çñh}0)ùg —ª”°qçtp5á^Mw$F:óËil†'@Äl¼ú0ªï 2÷Š ÷즳Tc0zîžT¨hŸCá²z]æU®Ä ³W­;»u`Oæ/¡ÿ=s›OAKË)h&˜øÓóÕb—ƒÎ᜿{C(¦ÿfv3Aö"×,îIQˆð#[§ËºÁé ²*kؾÝv—õô ]¤‹hŠ‹:rçë.kHü šš>ƒ²/=GUG¦ÒèÛ%$m¤P™|W* ';µ!Îè–žrƒã4#t5ôºn[zò¦›8G°-ðÝ ¡¤ LU@©›»ß×÷/®üžû¾=–óP›‡ Ld´?l ß°ç>>«Ý«e ´§j D98kEÏè MnAŒ*&>ßÁgèsúŸüÌ Z… Ò”éa 4÷Ü Á„½%沃pT¤»åžîÖ‚#Ð× ³®7_Z‰î¤Â”IªDå¨p<[óN϶*èú¤¬ï¸jƒÌUe Žv+^m“P)3{¾ðÅŒ# BÝMi—}Çj5&Ý^~:ñä¦\1–Zÿw—Ô ™˜Ÿ6Šï¡Áº tNdÜ{èt'É[tEw>qó<ƯБW%K$­BGz´é¡ ÍÜËÞž<ð»<AXé ÞØy±õÑ ú Iû4MN>‘ •©ì³C¨ ÙÌ_9ÃÕÂþÔÒÔü1¹ïtó´ >šY|,$ÄiâcÞ±Ž … °§Éÿƒ²Ùqõ IƒhÍ -âï=}Šø©XÇV8¾&ðˆû©¥Àظì´ãÁ/3H«aÐôTÖ3lWœùuTc^UqÕþ89d¯'qVèUtTŽveþ°¢ó±A‚‚Ñ3eÐP¦K/HJ×UC0wðØéÛ–ã!<’„±ʯ} ט'øõ›x4‡/¿ÈV²“ÚÚÈן€L¤å5ÈTvª’ªœ! >€Å°­Í©Õù4ds;÷ni d¥–t2ñËÝýÜÁ ”…1{£‹£?‹kŽ9}KkI­x(¸%û<ºy^Jj‡ìœBŸópˆ¹pâüm±pl|묀 m9ÚN^¹™œšœŠÆ"!&eZiUæâ(–ý͉ǡån«x[ðMÚcÀÞè²âx@*™¤9ëQs\†Š½yi½ÖÀ½0ÊN³ŒF†œ˜|/ä*ðÆ¿ ‡÷T™u<ÚD#t®°ÚPw]kþ"\z²®® ÔŸ‡HU|L¤Ø) CHcµ°P‚¦ôSV kÙò rW."”Ñjµx.˨!%‡O«Î´5ët‰âñ^r\jlÔŒØtY™CcmAy¹xLùÏŠÇ”/¬¸¢›»jqG©¬E.úÊûµ¤õ½fÛæ\¹\!·U¢—Ùd‡J—&`ôçroð§¼ÖÓJØââmy²¢¡jìœ÷Ùænfæ‡ËÜ‹BÊÊ Ëš¶%køò²¶ôJ`޶;MãwÓò2jƒzAüb7+×€MàÈÌ~ä}#kÜ‚ý's*˜èÏÙq <¶mÝVs„ƒOÛ/¢‰)"Í*õáE‚…97xv éïÈ÷¡%è2KHJ›™WÓr8o?4ÁA¿2‡²íºÕ„«·Æmôq pÛá¾ìÁ©Ô¯>¼´PÀD¯g ÛŽx ÌØõzˆ¡þc~Ħ¼5luõófä[ÑQš¸ÓŸ¥ÇÚðÝ´™°UY꾫¬ÔÜAÛ:¤%¼ÍîI OƧ0°¬¬h¯áì‡û§áã-pÌ>KúK¾½žž¥§Òφø/Z糘e³‘¾ÊòFëi>N¨ë}_8gÞ4:GVÐ_’ïÌ‘) Á  ÛãnoäÛÁ±Ô§Ñ§Iý1TCkÊñ²ƒÅÕ †ãÐ÷”;e…: bϰñ)öÇç)ég1³¸ÿ£P_þ hnÊ/"¾-£ÑøLmz˜žþÙQ3ÁŽ8éZŠæë%•wê3©0³ÅÉPôÓºx 68¿ý<š¬f‡Ÿ•¤Æ§DóQ ŠÕ$ì9U¶°£Ü¿f÷aÍihd´¥l:št/¯NÂi-Ș¡?îSÉ¥Žo¥è¸ñ’ª/2¡¿;ÜÜÄeµÉHø·KªýNûÖÏ›½šˆ;ý¿®'^}ë$"ï(GËÏÝ(G±å’ÊS(ìjÍ))ê¬Y}¨!¬˜—?»ÎÃa¯šˆœƒu­ñ¤’‡`F™T’“—QTnpä<Á^éêâ]¼3ǘ VÖsyØ\å’¦V{¹‚ìÊs)Þêè [™ž¬EQ¿Ÿ_å !èséºÚ50IÆèK4V jpöðÑn¥"W“ ¡Ãqì’4й/EËÿ.„ÿû¾ì÷k¿pý1\ÄÿòäûÈbuíÈé“ù;?ü«Øþžÿç‹J‚»P±»~O©c–Xƒ×ÆÈëf°ٴǎ‘ßÔ<–á‘/-Ç…½ðï7¨/,w¾"o6šýÏ2rl_îE2R~õý_[¡¬Æ­îŽTB»X4høSÜËGYRëÿt ê‡ä?þˆúq8of·€ƒÞÿ€O£†”Píú†ª£Gr눾5¸î*qÐnp†5¾Û¼ììÄ£ñ x£MÐ oB*<»‚ŠïY‚¾ek>:YØ̵ÓS0…eÖÓÞ剕ùÕF’B¯€±î]æS³ûÓ?„hÀØp~l pÚÁÈ÷{‘ª—Râ¶óÝ®çå&Œ0*Tñ‘»Ÿ±[¯¯Mw%RÐKÄ3xyçôßGs›N2øƒ¿žO8åKÛávQ~¼}·;¸mfáòo b.ݺz­eÖz²æ¨ßcûìÒ³oHdµhÈD£‘ŒÓÐj !q?Æ»(¤¤¨$·ªÚ£Êž[þ+Œ$Ê3ì|§› c•zÁ²XRsE•¢G»=mñ¤NŒˆT«££ãâÝ‹ÝSvG»ßß̃[ŽOI@ûþØ£ÑG£öªŠC2bôAàÄLáÜHðù:ò„*C“iì‚y<è,Žt Úü‚¤”ÌìääÆ-*½xiÓtùÍå%»ö¹¤.ÌñI~?Ú™ê’Æï8DAê,¯6â²½]xKòMn@³ %¿\Aƒ+¤èšQãF¢å^´f¦ëˆq*Æ÷.®¤qï›þÇ/Ôž¿Äµ{m º»¸,†oò9TEÿ^˜4¾Ü5‚šÃNݲÌjV|Ó ݦñx½« šÊãq4,‡×ÊÀ†Øƒp —TžfäAÚY24æ¥Ö#ôbÌ ­? ,“.IPKÑb„XUŠ:R™²:( uóvµ¿f›«'¸ˆ,ÖJJ¬\g4 #EJhš*ÒI A7EGk³jÅòßCej/w­—8¢R½7Œð5ém”Ãq2)ÕC^,×µFÚÕÝe‹Ï4$‰ã _îv Gq\“&Ç›èf”:N;'*F¡rÒ%’ž¨Ì +#vÙ©v@¨»'¸‰oWC¡&3<]™í*PÇ+A3(& ì¸\²½’ÌË}±#¾8î&¼8¦ ²ÕY»‹Q$G&Få’ö#)3)£íSü„÷%E%)sÁ<3’2˜ù01Hr„L)ú°±é¤‚Ô‚îÚƒ´4CMM陞³Aoðt îñ WC<VÆÇ-›«˜÷$6]­ƒTsÈÊÌ*ßvRûhìÕka§øöç S·¬þ ³ŠŸK|·¬Z«Þ#^W&–Ceuµ¦ZÜ’¾‰ª½A`ÈÉÍ/5”Ué«®RôeT„ŸØ%5]jÒµÃq€#x@@…h?Qؼۂ?þk)ZŠ~aãr tLY hlÔÕ cšIcšå¦vÓ ßÕ=­—‚¹/„d«tiÚŠ4¨!ª›çïêmßè|Œûš>*=‰–s™eù çuÄ77•;Düž-jpP’r.fŽV*3½¤É€Î¤ÂHaxÏb“!þ—L‰g™TÈR:óë‘ Ù{½e¸¶›‰¯«ãÍCÓlŽÙ^´ÖÄK…¥›qñÀD¼ÅF©z Rñ;VßáK›=Ï2þòy–TüŽÕÿ–E~P,XíEž™)Å2¼#‹6ô¹ÒWŸbjz%Ïôu®Oï™…¦¯¡ÿ¯ V¿ endstream endobj 1765 0 obj <> stream xÚZ\SWÛ¿¸¹.TâU¨ö^Ü­Zgm•Z·¶ XŠEö 0öJž0ÂÞ 3 E¬[qâjÛ8[[­­bµ­­ÚÚ÷Äú~ß Ãз~ƒ_¸üîzÎ3ÿÏó?D@YZRÀzñ'k?Yî:i±³‹Ëôi¦+³R±Ü¸çå +ãÊ8R`|³‘³0·|“¢ÕCÈ‘úqéø`°é8ŠÞα¡,&\Ӧ͜2mÚŒÅAÁ‘b/o‰ý[;Þ¶Ÿ>gÎû“ígL›6Ç~a€§ØgÇö@{çíoÏ€írâo¿6h‡§$Òþ­¹ÞI°ÃÔ©R©tÊö€Ð)Ab¯yoO¶—úH¼í×x†zŠÃ=wÚ/ ”دÜàiߥô”®?‹ƒ‚Ã$žb{ç žâ@¢mŸQsÝyŠêCYP–”ESBŠ¡úRý¨þÔj eM ¢SC(JD ¥Xj5œ²¥ì¨7¨ÔHêMŠ£xÊžE¦ÆPc©qÔxjõõ65‘šDM¦Þ¡¦PS©iÔtj5“z—šE½G½OͦæPÔÔ\êCjµ€ZH-¢SK¨¥Ô2ê#êcÊ‘r¢–S+(gj%õ µŠZM­¡ÖR.Ô:j=åJm 6R›¨ÍÔj+åF¹Sn}(Qß•jlëÃ÷9l‘bñ™¥å.«Vë¬ò­ŽZ}EÛÐ[é&áÂ&f“ßwbߘ¾ô‹ëw¤ÿ€þ›û÷ÿqÀöí7 4XϳÎÔPä`jpÒàËCF Ñyj“ióo‘»èØÐ­¬%»ØÀa~Ã.þÜv“í!ÛgvívØ%Ù]~cËú#GdŽx4ÒéÍ·ßÔ¼ù’óá~áßáoÚ¯´Ïe9*pÔõÑ!£¯ŒqS0vÒØ}ãæŽ+?züGãÛ&Lµ†§÷´ÆQò~j®ÛØÓ™ ©ë9ðÉÂSÓÝT°3ÝCR…°2rÒ÷§ŸQ]QQÊ< §™ŽK]XEPPXXPPE˜NWQ¡ã¬ÑtLð_TÌŦŸîþd—ÙŒc>91qî…ØÝV%Ë×A5d•©J´mûߟ°-}¿ŠFkMÆMÆ>è}öKº  šš¼!–w¤ËÐx«ãæ žtf5‡æÉÀÎR•±2<Ðvìk¯Î£c½ÁÛ» øÏéH<Þj“ù§t4© d"‹¢´\dÔ¥” kÛß^wƒÁÃÐìoBÆÒÖ³µô7ï!—{mú ›ó——·§ÿõæòË¢¿´è(ªc?‹9ä`ƒÛ–åqÌJÍb™ÐMíQ!;©ÎÌËJFZ*MðJÝÊÁìóóÇìFƒ¸¡ªK¸}Bd]~ò{¸ -A¿âqµŒèß§ÑNáîÔò’ ñ‰)±ÃHJÃkµUÍ|år÷Ëcš…%PàâhÎSˆûÄ,Ÿ !T)4ן¹j¹&oý^8 ÇïoËc¬g·¡Ñm(­ i4µ¶µþA~-Œ‹_a3óÒ³ ›)“•J¹PHŠH‰Å5-µMW¤@Q]ÎUAvYf>ƒ¾û½¹ëÂÆ»V-\ؼêĉæ 7¹w—°±µ‡—×”»»GÇòxñ6{{gëæMž«|øéÚã-ûÎßêzRwø@Y}aaY€‡{DP,o§G7ôh˜^ 3¨[ïµ"[¢ÕûFšm ‹«¡¾!¢ù©´L þUPÊ/ñ¼>FëqIzæÙ ¸@ܪÿrÉÆun8Ø–½V»"1qõr…2"4Ú¶2ó-þ’;ö•DÚp˜Ïê¾8¾;!Š>Õ="&vçÑ„m“æh^5ƒW ‰¬ì”ò4ä0çkj*ö¤œÀA`¤×ƵŒ[²ÙÑå¾E’ŠY ¥¡»Ö{¥Èq‹¿TËÃñü‚c§ktVŽÚ&<µAÞˆ]©ÑÆdö«];‘!¡ÁI=— Yªt`2!!™‡ˆ´Ås·&¦Ä§@4Y*/ªúÀl8ë9Ú—¡¤,ŒŽëX(NÊŒ,ÀƒïmEv€,áé>Ä£7~(ÉÏ΄b&'Eˆ·a[œËîtzÓÆÓ‹n­­¦&K“Ã÷ÈÚk°@/ÐPÿ­½O¬¿± 5q²4‘Y~RVšÅx8Á„]˜Ç#¦ÉHâŒITK«ëÐ6d‹r9ë‡ÚpãbüøtéšÆæ £-–~&ú7:‚Ô¬Þg—æêöÚètÈFSXVÌCil®B%.ýhwH¢.ØdfC9±¼n‡/N¯Q}uv¹°Û×|MnV9¦‡`ê’­ÄÝnc›jü<Åþþ»êC÷U74pw^J4‚óÆÉF·—ƒØìÜì¬Ö0H’%ÇàoÿZf›­Hd"‹£4\d« RZƽà„}JÒ(gÑÊqh8îƒ-'à7°^ùG}åSôrâ°7Îa?tBýÐ[h¼á×›7®¾'à·œp¿‰Žz£µþ9ñg ɢˤ¸MÈÃE@rlJ¬ç{®qŠhe¸‚qYJ1WÔ‡÷1Ó„Ñ¡àP Å<Ê4ô4Ú$0M/8u Õ,>?Ï&$&§€œñ¯†=¢wgç6ò5Âr¨ðñ†ˆ 'ÐNþ|ëÐþK­G/Ã7 0þ¶ÆýæÎyo—.®T[Yªã  ¥0!»øè±†³ÀÜýjëL–nZíèbòJ¿ˆÜô6‡Û?iGÁ†Ñ£ºÏ¶îÕƒ3ÌÍEŸc!°tó2ßj¹¦KXQr^ZFCÃ5Èæ‹^n<ȼƒÃüBÄ /ÅšT@ #ú`R w”þõäÇ«W®]1ßóòCŽeee«AÃTEhÄ’0™ßŒ'«Ñ 4ü»G9Ѹ¶å‚c=ézDé}5‚º«HÜj±¥± 1  ùä››ÔÀ¡,L9Ófç}lvž3¢n›Ï>D/èÝI9>\ )Ê)ƒ?è`X$FÏ­ðs!±½õâôh–ÞæTûzRDÿBõF;ÖÜ“<ÂLí:IøJ® }“üx\.ŒI#W™Y9yµÊtŠþ¼{d‘ÓK>yŸ‚å9Ag³²r²‰u’’pY@ÂÎÙ÷–"K4äׇȂýëÙ¼_p?Îäûæ64Gosúk$ow5LºjõãݰJâ²RÈO2D2¡eÒšjMi}‹×™‰$?ßÀ±'zã‘å¢_‘à—{h¢g¶ã>œÈè ®Qn ²ÇX'ØÙ"Õ+ÔJµBÍ(3ü¨rN £ÌV”’ÞÖvñÄ—wN¼p–ãšÅD'­±Y/8l8GÊb ñ‹â>8pF¾M¥¥ùu\jFï E¤Õ—¥§Ccr‡¿¥“K"!‹à· # lO”ë:íL×£­$Ç .TI¢'¨u°‹œ´žj=þõís›]×8»/â¿ög¿©=Ò瘻ïÝÆýñ€÷ç:p°æèƯCHF-_¾ 0ÏDCÍ£O8¸åta¡–™‹ÙÙŽ­ýùK?<:·bå2ǵ³;»çœ6ÔLÜkpmG1·IbE5l<üá[“ ¼Tá%™YYj(eª"5!biT€_Ù4”€ù ²À&â_”Œ- “±ÅøÙÄáôƒˆø÷É)8UzäƒÇf²ë?¿yÿZëuþè$%Òß‚ ¥R %3—ukfs&CŽf(3ZþËðËâX‚9ïš@vȪ ¢g¯]ôxU‡%³Î3B–˜œ&O"-Ó¾?ŸA–Ÿ4zz…ù•z·pÖ­Z£»¦ wW£ÙüìÂÒw*# ¢¹HSÊð]¼Ã6!9&‘ ©19qyIè{ìi[”¡$õ^R^PÉC9¹ž÷#G[käzõîUÁ>£‹…Ñ=e vßrÿJËwßmj/ðd¶¨™Üñ5üŸt¬/¹Ó E|omÖàäªMÚ@ab~|6þy’n—¦J&:"VBº¹ž„öcG[LqI&í$å±%\.d¨Šr™Î1ý®·ik?útú7˜ z?JfáXɹÇ'ëJšëàÓ,¾ñ¨MŽkýªdÚ|ÌKQWëŽe ÌóOýüy ‹ˆÇã>€°ƒÙ 1ûëóÔ{ˆ›óð"öŸL YRêÉAp¸õ‡V´” jc‘lZzP™/08ÍÂV¸ÿU‡›-?D ¯ŠÆKðH<Çã5¶Cöï«ÓA<iïíçç ¦&" Fo?{þ¯ƒ#ñ•+™åø»eûÅÛ÷Žž=xäðj·5ÛLmèw=2ÜÔ}-Áx‡MØ'WùC 4ôÄ;´¶r@²".99žLÌ5PÊ=§Ëª¼IÁ‹¯üÝ ½GWޱò’`­‚2þ9]Zõ<¦äÅf%g„Œ¨³Øƪè+Ø`…mM …ëMÝã’6›ì]hý]…³¯‡ŸãD~,Ö±—+Ÿ‚6æÆÊ»Ø‚Ãá´<„ ­¤¡ñµrZô"˜Ž“UkHF %¬.¶ßæÁ°ùŠC9㈠X,Bሣ¿«_ä¶içªwùîî½ß€¾¸haŒèi¹‘@fÅ$E*(bľº­š D_[vöóåˆüEÃó}ûÃÝ¡Ç'g(“ÞvõfÚ¬?ÐDôöý?Úù‹pvk‘CFTzt=0M Õt6x¹^p×€Ê ˆíÖµ˜¯è‡Ñ¯Î†?@öhzwšˆíx,ì8Æå? ‘U+¶Ã î»Â&‰(LÜõ6O h¸áˆa‹Aôç=`fä»}{w£—r˰F(ê@ah¸Ð¢›ö@E9÷¸ûv´Gæw¤XOwá®VÃÝ6$çùp}i™ÉÛ&©õ!ó5}Ï h$YÚÍG:¤_+s$òE¯‘9Ĭéî¹o/'L1÷_WÚ„Á3õè°^°Ï€jHKY‡<ÙªJh¨û÷—þ ‹-7mYŒÃ|’ðÐ;ßüv›o‚K’RL¥G©ckº£øNfÇ…CJœÌÇ»~GñvæcñìˆWüN*©?Ök*™0vYô*O÷ ÈÛÄH’V›í­H5vÃÞÈíïw_ Õrq¯Ñ£¿ù)1IQo.6KúÛ]º;‹Pñø SPt1)¯†NGì3‡QrLõ:ß×ë9ÊäQÓpx­-#vL"‚êé’ê‡:šß»Û1…~oNJ—›!°&3+3 J^Í]+>Ûò´ýΙ¸nµÚ[-Pú“E“‘‹Õ^-‘L0|¦Iœ@-)Kì…Ë­Py…°S11iB×Z¦"WgOéWÏ„!;ú1êKF‘ «W%«ë¾yEfªZ™ÎôøF`@ÉÄ=ˈU­tQmÕï™=ÞÜ!ße>3è) hIÆJÃI‘$ Mác p,¸ÚŠª‰e‡ŒVl¬WB`r £¤ãÍD u|•A]Û/-4òr¡_x·ä»]¡ ?Þ¢æo½Œ]2cr$…žYIêÄ‚¤(„¢œœ¢ õwH]pšQu„Я}Y.l4ySLìXKJ,UžÒcîãVN”[c¼ÎÆî–eóQ¯44%Ú«³?ze’1HE£i…Þ%ʰ«/ÈØÇÕÕæAuTït RÒÝhÙj@µ$e¼M\ç`¸Ž´@çð`|Ô#g´¢¢ä°á93A¬={îÃYhƒ/ò^h(¸ · )¡Ø¥` ,€•à KâÖÅ­ Ÿû ="iIàLA耦€˜?^ø y,éBò^@‡Xs~ÐF¹åôχ–­_¿mÙ$b‰iúWoõ?À<[\ å<¨¥{ã* #÷$.+kʽ£>ŸÃQæŸÆq…Ðù*uÌé é©9±ùPBc(ZÍúÑÓAª‹?“p¾€3Ð _å/<[¡yí ‹ÊwÊÝÁ:ÀžRy˜ló}Û„b¥J L-„RTi)& µ±Sm¼8¶4Q4šF²ø:ýèðªÍ›ÜVOãÓÈÅý¬¹\˜ïçß%/ýÿ‹/-:q›.‡zh ª‡0ØNPîW ‹ÞÌ¥ªÏö5šZZ£›:Œ¾f‘’XU˜‹|L¬UB%¿Ÿ‡Æ[i*»rŒÙ­•4€ÃÈÐTjf6ë÷.1¡ á¡õ¿âõV’°¿ß2­ éÝl É9ÆjÍ–u/_Uüh'?é€fÇkíª*Ì*ô¤–Foá Vx¹XøúžŽ–÷,tÑ`ÚB4î2bóŠA yÌž0ˆàðý×äf¾ß툌—¢oçSåœi›ÂÔÆ™g½ÅX'´ž­9†!&’?y95$Ž];-ú«ã÷pȱװ2ùåº×¾úr*›’—XŒTÉCbf|F2º÷×G¶Yñ9QÀhŠKËxÈIÍKS3=kÊIÅ}9Ší,1ÓXñÊ“ÿƒ'÷:wìÒÝzrÏ^Þäÿa+ÏÈ<€Ú¤’¼+K¨Â£[+­ à’ …Pf&rÕ„[f\ÿúhNVži\)‹*’‡ŽZ†mæ5ï:°»¬¦ÊÄ´\ôhºþ©Þæ¬a[;r6ˆÂ}Ù ÿãÊ}Àèzâ¸â³3ä/¼¶î»m, ÐFWqÅ ËU5CŽJ¥I/Rš¶°¾<å¿„ÃKÓð 0‰YvÉé9' o†¶ìc LZɾ/$Ⱦ3Ò+ÊÍ´Ááì±çSZ¾oFã2“BZ„ôȪsšWD2ä`´e‘S>-2S›#jZ ád&ÕTs¢–Û%4(<ù ‰Ð ¿ŒâE²ÍàéãÏà–7„Ο¾tóü¢w'-uZú¡÷ƒã&ãÑWzÁ  m'Ù†¬.’¹hˆW$I“c"¶,æ½ÅW8®CB4Bû)$ð*ïry0UÚÒºcÀ /øœ‰ü8Ù ~Ï/¥|—C¿èÔo·þž`½@¾Ÿ»ÑŒrÞͨ¦ÿažA‹Z|ëÞŽ†›„¿0Z¾>ƒ~s4¬ã¢À3Ä;ØÓŸT{ ĦËÒUÄwÙŒNR. ‹ œÿ @ãö¢—9Ñcão¯Y¯+û“ ìCFûý(‡EƒÐª©‡›Ò‹ÍÐø=<Ù ½èrª“V[:ä›zl/R½éýÍMÈ©]5Ê÷3‹÷ÿ¢ùùßmí Ñ0Â0Ù^çw{UȰîh¸èmN·¢þ¦èDZŠz)DãgžNp›Ð+¼;¢ºT/}$µ´8v ²(ʉÃraDOØoýí¡ÿó‘Bë=ƒ ˜ ²={i¢;~  c^éÙ™ª¢¯êe¡xÇß!ªíINÑ‘ÿGz"ÝY¢¯ºk …ÏP5©/äO¸Î”_±%¶œò‚E?MF}PŸŸ~F6ÞŽg± o=þáÊ•k×/;M›â¼`!oÅz4ÕTi.==ãáL¥ì?·|M—èî¢'uŠ"Ï¿—¢î²–îYôfç¾Y%ÑÜÅhÏv Qž\pGÍ‚â–ã:Qülj¨ÿmÖV2ØoS¯èƒ^©H/Cˆ]³iΜ…NW>ºjøæÖ‘yŽÜ«À w hÙ}Ñ$&=ôÇ ?£œ*´TZ L…¦¤V{p6¿–Gº¬`D_íé*ÜÇœõwp›C¯(êUCtWl®ëQ¬Þ_/z†N’Z“dJ3ÄY™À§LMcÃOÜ·P¢ŠJjèæ † ’*W$¹kÝ!‚XýdŽS_D=’ Ò’øM ¬gvíòÆmµùâÛ)e©ù!Ý|hbÊ…UAs‹×i…ŽDgFã·ÇyÑ3ø³Z¿¬ÎùBÿ›F`rÁ RˆbS'šÝ«Îfߥ_ {sÞ57Ÿ8žô…×›wµ—ÖÛWÅ)×ÄK€™§ª»ûu[OÚG ?Y•ŸÊ€éÝ®IQÿ³]ûŒŸîë7v7r¨òŸPŽséI†Ðœ(âÈkÖ1Ö©§Ð-½ Êla\Dl¨ïeB_spt4à[X€nYéþöÄ+¨«§‘?.ðÑ€ìÊ¡òwáZ´Ð€,ô‚cœ…q«I¾‰…B$…tdh'M(ç[èø¤•’N­‰9{ òRZ¾7a1GXÌÌ¥J ‹qE'­Zºv³%„›÷¼®…zþ"nÏ”dÈöƒÝ~ÈÈ-ÓW?PeTö’åÚŒûf&D•îÒ %™ݨ"¨5ú˜à[Ì"B¬ö÷ÚŒêÛÃjù…ãç?³ªé™8q_ónÙ~õÃoáÁx–ÕóUÔ·gcÈŸÿ jǃ¬‚zè ¹÷jtwߺÿ¸}1ö‰Ù•™äo¢’å Ú¤ò)(©7‘ëƒÆ/3ãAJ;PˆçĈ]¼2%¨²r ©Ž,GE†lß³£…{ Gmf~CZ è@çþíKV«!m±´›á<îb8[Í §¥ ñÜ.U¦ATÃ1¢+Ô„;3çÍÇW˜8:aúôô«RªaFNÙ¾éMÀ¨5êªS>,,ˆ‰š©L†ÄL‚ȼ¢½d•¤0’¥É¡UÊ<¾F‰iéëì $Ó’Û©Àƒ’³IÇ!yÑP'V%ðxdì…ÍBuÚ—úƒÕÅ»UÕL7cêúJÄËì«o@ü5_hþÆÃ*{q­Û\³"Ó˜(RG!å©$М‚èçË`²ÊŽb¿C’µ~Š-ÊàeB2XxáqŠN•ý«¡”¿?iŠï¨ÔptÌC!Ñ®xoÉÞâ㪪.ëëCUñ|¨ ÷IW´2ÖÆX4ÀéŠÍ}ô›è;££ñK¶DVÍÅArJRr@PH´œFbnLAL¡TëÁ-‰’Êà ’‰.Ž.áòA•­®×Õ”Aä$ÆÆhÂ÷@-èJ*K5ÅuPÆXÇåç¢ùù4ŽÌêûúë 0 Èõ³Œ Ð×X1ô¿[„ endstream endobj 1766 0 obj <> stream xÚ]Mk„0†ïùsÜRЉ¥Û-ˆàG¥¶ÛÖ]èU“Ñ 5†þû&Q<ôá™ÉÌ;Ãde^ÊÞ@ð¡G^¡¶—Bã4Κ#4Øõ’°DÏÍ–ùȇZ‘ ;×꽂ô-)>/÷Ùùõ›Ñ‡Ûµ`GØ®-×E!„[^æÕ2JÙŽE ø²Š“Ñ 16xçj-P÷²ƒÃ-«|¥š•úÅ¥JâØË±õ&> œTÍQײCQCT1A)þý׉¦å?µ& m'¥á)¶ü¸ò‹ãÄósê8]9·üä”Ã1ǧížMÑmtÞìÖðYk{³7лáï%î«Q¹)ÿþÑÅxã endstream endobj 1768 0 obj <> stream xÚmUkt×ÞµìÕBÁåaÃYK !Ÿ04 „»u|ó0oh H–l\d[–×’H6¶¥•…lãW$L¨Û‚9ÐäUNÚ…žH!)mJ åp¯|Ú+“øAûcïÞ™»óÍ73ßî²Ll,òl|zÖÒÌœ?ÈXö“ sR£žù¥Â=«w(²7?ÃàY,žƒSUxRlÃÄ$§+‹¿]oŽ£+£¥Ë(ëæ‰†eâIaæ3éÌrf#cf¬Lãeš™Næ5¦9Üg.3a—³kØ\«Áf.²˜óDcA~þ€a+Èß6`m†\ówGÆàÑ`”hŠ­ƒßnwÅa0â »°À4äÿÎ0ï¢&#&––Ä‚â"ѼcÈ0”Z-§X`1™&sjêg¥¦ÎÍ(¶:âô3rSôsÒÒæÏÔÏMMMÓ/-¤ér Eúeq›9Š‘k°èWç˜E§~Æâ(ï…³g;ŽY†ÂÒYŶü%)3õŽq›~•¹Ôl³›MúLÊA¿ÜPhÖ?šÛ¬G·ŒâBk™h¶é—›Ì¶":"~;…Mep/°+™ t [ÏzY+±ÀʬŸm`ìn¶‘mb÷°A¶™ma[Ù½ÌÄè,cs—íŠÉˆ Ç(ª¥*Iu161¶>ö~Ü´¸ª¸\6÷'u öÆGDáþ‡aaÔs!™®©"+…û5ðù} y‡³Îe!†ÌC-éè2`  î7Ðm”†N]AS¯^=~¼¡üÐÀ7ï‚Jm%ø ¢‚|A>˜ªl% ”¤¿*zÔDN‡Ä7Gó[wú¡ ø¶&hÖ ÏŠW^SáW²C8iÖ“&tÚ±Ï|ÔøÆÎVT¿³<:¨Ôû}‡òÏe# šGZ.‘Ë h€tç“Û$œZL¦.X`0ø¼>/xyOZµm”\{;ú}poœÆÇGª‡Š½NÓ>+ôÏÖÀ øsög¦·Wý6³­ÿê×h¼ÏãKjøPZwkO ŠÃ‡A.(²dçŒM)‹í$Þë€jÈâ£,°^rWO]žJ¸ìòjI‚rpÉR[͹¼[!2> Ò87¯ÜTyúöL4ne·›b–¡[’\³Û"š?ÚÑ4_´ÀÙÿËõGt£ÏÞES.6d: S’Ý$ë–%ÃASxôtò?ȸߕµÐao—$»Žn|Áºcv”ðÓyÊ_ nXÁ+A5¼ K¿ðÈÆ÷7Ÿ·õÏü‚LƒU¼Bë^99é[Vo*ÙjßUõPÅÛe)<ÐΞ֯OþëJÅ7„ ç(Ëÿ‘'Â÷wÊò8R©ðhjkº¡Mçä|†¯ opeS†ú£2)×–ÓNø|õ^2‘LŸN6“DÒ¹€¼—§0^‹˜€xx“šaŽ-QðO…H• ",ê·ÜyÙˆ U‘EÈXÑU¿›êC–ärà+j¢‚¡iö:ÑÅuYù§ü ¯l„ní»\AnáãûÇIAŒiß?„"£FV¶V6vÚJD$ ;J:‰ŒT›<õ ·H óÄD²‰Þ}-œÑê[ª{ç×½5ýÈ¢Ð\˜Ëÿo:Yè?¬Ï» e#}K0:h'ÜÁ’P晟Ý1}êø¾äñ¢‘É('2öÙŠD";IÚDŒ@FóÔÿØÐÈ™0jLæÒ G!¯Œ|:ªÁ'‡ ]|[c‡ZÜT¨  Ä’þÞéR‘*´ˆÛ:úù”d©øŽè×.*þÚ ¹ŽÉøŒ©ãÛj¡L;ù[uÑH-µ`~ WV •:˜&‘êâ_«´‘ɤŸ“³»ª£Âæ={ ]ÛöÐD4ýÚŒQç5ôÞaÌ4ô†‘ ‡¶¶ïaÅ»ýI},NSz5)/Õx$ÔOv¡K¹À]Gþ8g{!kùsEåu™¥$xåyÝÆK›‚þL†€$Sö—ñªD¬çȵëYÁïçæ¡ª¸¢m³èâ…¸ýB¿÷†{÷-Vˆý†î5h,ºDÁMO=ù"QÚëRJÈŠ~›Ãø«¦=}÷äèÿcW³’Ÿˆá)p³2è{§æ†ëÊÆýåmy}!ÍCÆ¢×ãbäD$o­ä…àÆ=¶%*íÊ¿=;¡¤GÅãÓøÞ±×Ž±€O«ð›‘<Í&ãºÂ EÛBE–Î\°AIM™Çáq¸]•kžØæ:yôÌ/OÁä>8è:ä8èêuõÁ~èÙÓÝjµt¶½s<1Þââ ©OŒ>ñ½¾¦1cè5V;:ÖY> stream xÚ]P=kÄ0 Ýý+4^)%¥C”æ2ܵԗ¡£c+©¡±â ù÷}á†èé=IOYÓžZkdŸä”Àƒ±špv )„GcYQ‚6*ìUÊj’žeÍEú«œpSŸ¹èøssßo/ݯ q¸3n«G(÷º=‰u8µvpPU ûÚÎV8¼k×ãSÄ>H#;¡kDBÄâý/Nh䬮Ӹâ~’rg/’´#²*Ïk¨8¯Zý¯·+úAýHbÕ12ËüX&îŽFU´÷p§¢moúAr—‹7yç£*Åssm endstream endobj 1771 0 obj <> stream xÚUQ_HSQ¾ÇÍyÕiÿ´fÖîM´ FÔÂŒ˜f(EõÔЋínº]›K:]»zrº¹?׿œS)Ð4_>ôÒ«ÑSD"=ô,çŽ3²;)8çƒßïÇù~ß÷@Èå è~sSûƒ¦‹†–öÇW³ëìïÖ3òd:‘+R„Hñ\ŽX!OÉÕ;wäûÊœ³*e±ìH‹ŽJH\@F'H‰ñdy…&[1:8Ænv> stream xÚ]“klSeÇÏY»úÂjC¥F=§Î$³â§Ä@æ%C&¢‚ &£Žn«®íÖ®ÛÜÚÓûåéÒ­½î0¶*ƒ©C¸ˆAAð !cBPã-&ê‡÷ÔC¢gÄÆ÷Ã?y¯Ïïù?ÏKR)A’äÍÛžiܺý¥{›››6…È_g+Îjþ‚¿“ä©*ž–ð«¤ÔÕÍÒ¿åUw©\±¨Ä2Q‰ß–/ê=¢Èž½…¨&É›¯³Ñn­á•}Zæzf]£©gЬïìbÔuí«Õ÷74¬_«^§Ñ4¨7tf}»Ö¨nÖ2]:ƒ–'ÝêLíz3¨®ÛÐÅ0=ÞwŸÕj­×úêMæÎÇW¯U[õL—úy]ŸÎܯۧ~ÊddÔÏj :õ êoh£ÉÐcatfu³iŸÎla‘’x”ÜD6¯Ý„…—|Ä2âf¢–¸›XC4ÍÄ¢…¨©ó’"Lœ'ÍU«ªK‘‘¶UÓ¼_Áÿb+Têó$_…ç” «giÒ–ïÝÓ€J²D(Äa_Ô>æóôü—*æ\S¢Ó6ûƒ©à´wÔ”éøC˜V 3çp¸Ü0|[Ö‘¦Âh&E < ˜ ¯aB‚wžVN1\w7c6Kær¹ÄMQâ¾°½€7ŠgðfN‚7+áUhØô„ÇAð!wÂO}s/ùÄòî^½µ×dÊ÷¡2‰H!E%eür™2/ÞÆK”»kó·ûÝA¯ œÈu ró‘\ñtQ^ƒì¨=ä§!]XÌ2ÊEbW°R…Ó²ÑGÌÑ}ñ6ð£á‘¡m ²û *á<äa"4oB&‚ãÁRpÐâsc,Øé­Lø§ž¬T©Å`lFÀãvÙ0|ý)%Þƒ¿=&|[­¨dEÎO9|¬LVª–àõ—”Î΀s# m Kó„ ?ŒkðÒ_iøê¹³u),+þz ¾C—Ï 5”ð³lÐ.MBŽBƉ°à úü,* <‡É£áÈ܆o—ý™Ü`^W¯ªia¯ð½rà 9BþXÖ„cÙ/ñ*üœì“ó=š:ÍZAN+øíP®e’_Áÿ®<0N~('¢¥am&`Äè‚n†aäµýÐçž‘øyº%È»B>ð-–-È}Âשœ]Çã€,b–Þ°kŒÎC1\;¬*‰C^[€‰@PbÑMXuFÑ ‘0M#¿…åø{8Ü1GÎ_Àž‹ìªÔ)£i± Q”ôÄœÔ<à²b4B¶ŒÏƒÛIîžB§jäÛN¶Õmvà5ôÐÉMWñ¼ß…×ü¾åìFj'´u14ò¼òðÛ §ÍçZ[iØc–wïèx¦éÔb}†™Äd鱕?f¹Ê-sä‰Ï%8õ?”!xÄe ¸‚öQ2óàrQ¢ï °ì:«òZÅÖð¡- †w©P8š*fŽžŠùÊA¯o`èië®@V6ý …p":.ºpí† $®þBÂ¿Ž¯(ã‡FߣŽ9Ç-¢ÃN·ÝëxZ˜ð¼ÚßÙþò‹€šá|ކc§ŽcéþR< 9tªcf×½íB­Ý™ð'¨„âѱÂ×o½P!2> stream xÚ]PMkÃ0 ½ûWèØ1F>ƒAŒ˜@ÝFÝB{tl%3,¶QœCþýb7ô°ƒzzOÒSÖt¼³&@öMN 0« g·Bèq4–%h£Â^¥¬&éYÖ¥ÿ”Bv;µ×ëss··—˹-^AãpgœWPîuÇÅ:œ:;8¨*¶s ïÚõø±/ÒHÆŽp¸4"!bñþ'´rV×i\q?I9³— IÚY•ç5Tm[3´ú_oWôƒú‘´1ùÆ,sÎwG£*Ú{¸S Ѷ7ý 9ŠËÅÇ›¼óQ•â¥(mu endstream endobj 1776 0 obj <> stream xÚ%ËOQ‡ïm‡òj«ª]”é]ˆ¤T4Á*j 1šÊk‰›á†ÖôÓ™ŽÓ B¤‚^K- Úg î\“Y¹4Ƹño¨ÿ‚&w¦·§¸8ß9ç·8ù „޹éñÙû³—Æ‚3sVp3~<íáÒF©Mï:u¯EGVýÇ×ïq'vK°ç\‹gL‚“³-^4aí6óâù¾7¹²…(Kª(Eq2‰ŸÊ¡¨ßÅç÷µÒÈbXBýºŒ ¢a¿?€îİBq Ia IæE3 !‚%õ†%iéúТ(¾P,éKˆ‹·‘‘Âh'±˜Â h<—ЃP £Ó—|§KÄ–d ‹(˜XÀbÜ”çp€^ðÄtÿ7à&˜m@ü…}Ói|¡ªë†ÍjŒPÕU*“ZU!ioó«-­”\&%¯³Q`QÍø­ÁošñK³6Ñ--0 ,Ëòì1Ãl—íR³Ó<ÍR3§¾ù°yÃÅT¤St…®ÒI:AeªÒ ›b+l•M² &{MæÓèÕªþ½ò_ã®þǵ“ÛË“ýŽýµUþ5yE^dš?Ù‘ûùzÆœÉÊ^fgCÿÁÝë9’%òÛ^²ÿ2·ö®ù‰ÜúûfÖU¬jM&Ë­W–e"§*¤èuÒÏl«Ú˜©@êЬôš1ï*’JJ&ÏTþx¸=M”j”K¼3yhܮ٘g¯ïâF*öÎm{×[{·Ö¥ukE»Ý,­÷þ_þ endstream endobj 1778 0 obj <> stream xÚÅTkpSe>é á“­UV‚AñœàREaK—2"x)—„Òq°ÐKÚ„6MIÒ¤IÓ6I›¦ÉKš¦iÓ$MsiSº¦µ´!)®r[)ޏ^fÄ묈÷u¾ƒŸ3zÚªëuœýµž™ïœ3ßyžç}ŸG@ …”@ ¸~í†uëó^š¿eç¦ÕSP¶…Bó5Û,îVŠ[(ànËàš»YÈ\Þ,ü!3ã6ŠÌË#õÝ SøñS¸ˆ‡Ù%¤„ª19ssórrsWä««e¹B']Rz—ô/«W¯Z&]‘›»Zú°J®Q–ʪ¤[d:…\%Óñ‡JiºT)×¥KîWètÕk–/7 92•6G­)ð®eRƒR§îkå½|¯tƒºJ'Ý*SÉ¥ÓÜs¦1_­ª®ÑÉ5Ò-ê½rMÏí dTi†’ªh(¥çÉæQk©uÔzjµ™ÚF=FP…ÔãTf% „ÔA£à£Œ=›Ž ‹„‡gåÍ­àZ³®YjâÄ <‘p®Ÿÿ7ÍÅñ1|ö|ˆÞ»÷¹‘!1‘ÉÆ?ôœ†f+ p:êÉ­ß§$6…½ù¯€êø×¶‡=Ü6–JfÞî @oÀ uÛÁëgÁnOh$X$z?TPÁBƒ«Éa6XË -þÚ¹œüÖßÝ­L8[[k·Vª«é,Á#,ôzÆÝ¡¶xû1ˆÂiåè®8Ê ‰¥¢Iê<äƒ$,xU4©–AÓ˜ö žª}¨¤¬H^`+”ÅÅ, î΄g\¤¹&nŽØ7xP¸Á_Çÿ¬¦É®¶F÷ÚˆÉõ$›,Í>³ó{ŽÄü%#š4< ±Ã¾pïhà´!ž¤ƒ1ƒËá¨5m2>¾PmsO‚…Nž`=Û”>Xhgë!&žÆ¡±—Ÿ< è\çªfZÀÕjåyUZxäRšgF¿ŽïÓœþ+±#`óÚù/œÎfÛŽµkjöÚU9v…ñè—‡ÎÿmbbütÃgxoI‹STuÐÑI†Ž=÷dj#™Gæ“ÛIvÞ |É\OŒýãù¸ìÈŒç¯Ý-n pCln“óO6‰Ùeu 5tAø9h²1`ŸïbüÿŒ©HàU¼3è5ìJÓØŒâ7á¤ïPðâ`çKCÇäéÙäî?“MDøò¦~Rû_ÜÛh}k„ õœGÞ„øY¼ò‹¶  £1•j1ɃÍl~eÆ [. ðü³és4~÷-îi ëµZ½FÝg÷'â}ýL÷÷:ñ´Âzž¥]o-W¯áµ458ÈBØÛçOGÁ檤³Ïÿ4DÐóÊáâee$ÛÖØ íL´{º;~~P—ß¹Ÿm³Á´[‘#±ëd­¶&½M T8¦N2Šïì`²¸7f—[x68IcɘØQNhAÆ 5Ä A{4ðb{$øB[Ð7Ü{Ñ{Ð<Ùß ÿÐXç>>dÛŸ$sLÅûœvÐÿçêß’Ñß=ä‹÷OcN¡WJSë™|(*Ù_a;Q6 ュ1åuŠú~íø*ð2!O{4z)2:¨§ËVɂ޾ßåøUæøÍ¿Ns½xPüɶ.'7‘›É"rGÎéµWñ|<gãE ñ“ XQÒÿ ©è7©ÉáSCãüˆFÊ7² ¨%¢â Oì®Mey%Æ-å-Yù{ða±»ã(¾á_à…Aˆ™UÖ-4"C¨12ÐOŽïî+d¶Ai¹Vi9¦H<õ?(È'iɯÍBÄëK¢,|•×5?‰ó£œyžÆ½ÜbñeQØ?Suì}"ÞÞ™zY0]/Õ`©q˜ö’\É=3 Ú=ìÛ¢u$®#˜'÷œùêEœÝ埩>~&õêõ²Â"@“;õsx¦31mèŠIß9¼r‚总NüRu N_­×0`u·ølþ†H ìFª"â"³·¶œ`àxìÂȧq¢¿¿‹ª¹v'YZ¨3ìyF•T;b€ðš |õ›UçòýXw '."2ÿì䜋Hx33™9ÂUÑÌë8zÞ§‡< endstream endobj 1780 0 obj <> stream xÚ-‘MlÛÇíÆÓ…ÀP£EÚæZH@'ª.Œ©ÓB‘«Z¶Â¤¶C0²Î4Q“8M„´iÒ„ÄqüìxMóliÉš5µÔI+êØ¡|¬\àÀ…〴]øÒ@å‚y’ŠÃûIÿ÷ô—~ÒC CP}|tôÍ!Ëøó–ááÓ¯´¯æ´Ô!ìÇfôõ ¢BÕÃ*¡S`ÄýAì_}ÇaA”ýmî>Ñæ¯O¶ù\ º“O!ŠâÞÙ¤Ùüb¿Ù|ÌB»û¤!{'Ž/ ï#™ÍäëNÊcŸ°ºÈa+c£œV¦ä;ô„bdïIøO=ê÷ûû­Î™~Ú3yêHé·36òmj†òø¨Kä´‹!ß²:)rϽÚéö2”‡¦/Q‚ ºsˆ™j)¾Œ "CÖ †|ƒ^ìP9C“†›êï·Qµ¢þi\’EñSÀéü»äéù¤;áà¹äpxd)ž#Ê fÅR]9gª,€Ÿø‡èœ†$Ä|ƒÚ )xœÂ¢B*³ú™bXßRŒ€ÿÜyDÈsÚÁ‡·L1šÒ šÚíÇ&óÀ⼪uh¤ê€o® õF£¡z dn – RZLIy¸b àŸà1,@ 7¨#Y= +ÝË_UQÅt·þƒNÙmbÆZ Ì¸]Ó.Ï•àŠ|­q8£ýe”²™š”Ie¤,TðñõñgÎk&/+E‹-ïÔb*sýÁ—Ÿ\¼š1=à“±Q­ÛvA2d9ÙÌâc·'ïìn+¦‘ψyàÙøGscÏŒˆæk=P],ÖqC³7"+òoEY¹ð9ªh?}û‡N¹×ì3 ’¸—¡ìçü†EM³|ˆ‡ÆOïP_?ØPž]ú_,gg#“ôk-1 ¶r=Páruoòp÷¥Ú©t­´\ÞÜØ¾õÅÖ(´ž”‰ØbA|øÔj¬¸r£¼½5%Ÿ'†àì»ïMŒ¾ï˜þp7ø–UK6—SÜËÚÙG‰.ìxUÿXZß%è÷mtÝÛ·!éõÊýîÿÇazë endstream endobj 1782 0 obj <> stream xÚcd`aa`ddäõ ðsÔvö Ž4 ضÿóa5ü¹Œõ‡4ÃÆ²L?䘈³È=ôbùÏÃ$ËÀÀð^D¾á‘/@¤:`”b`adä(­ê400Ö300rÎ/¨,ÊLÏ(QÐHÖT0´´4×Q020°TpÌM-ÊLNÌSðM,ÉHÍM,rr‚ó“3SK*4l2JJ ¬ôõËËËõs‹õò‹Òí4uÊ3K2‚R‹S‹ÊRSÜòóJüsSÀnדÎù¹¥%©E ¾ù)©Ey@G1]ǰŒ‰‘‘EëG߯°ï%û¿ þŒaþ¹á{‰èì%ÝK—uWËÿåb«.ê.,\Ò=[ž¯xñOû%l¿§³Ëq1OSýÏÃ9‰‡«‡‡{?×~îý xx€˜÷ûCód÷ endstream endobj 1784 0 obj <> stream xÚm“{LSWÇïmËå¨ ±±ø¸÷Še`y¸„¹¨™kPa>˜‚3‡€Z¡K¥”w/”G}QžÅ"•©ŠJ¤ 3,&âÌ41“‘=\Üæ¶lY¶%{x.¹,Û¥ÿ-YNò=9¿“œ|~ßïù‘„BA$ùÊÁ½ï9x ^s(+ýõÅÂn­èZ¯™ç#„u„°ž6ÈZ.¬QÐßd(þ‰’m 2r¥¤ÄËå‹úãŠEÝ(IDú*BA’è|U[RÒuRRŠÆPf1ꊴ&v[A›¼sgj›’”´“ݫ猺‚¼RöPžIËéóLÒ¡„=f(Ðq& »m—Öd*{#1Ñl6«óôåjƒ±hO\kÖ™´ìQ®œ3VpgØ}†R{8OϱavuX5}ÙygdÎpÆR‰•:HdùGÈr’ ¶É„†Ø'ÕÞ!²ˆlb‰Œ á 7‘·dkd¹Z~[‘ ´FÏ¿Aáï )Ä ¿);ÇÛ»žê ú»ábW“›gNŸjÍÝZÝk«…ÊÚð †´µÔŠk®©x? è|Cøú#dQÃàpxýŸaNåé78P¯ÕÉÓµ`om¬Ð¥œ)1PŃx§£\®^=_ A<6Š? ’ó{¾—ã/ð#%ÞMaÓ/qÄWš'â2F|LUÕÿ£•·ÛĘ…1•µ É–¨¦*ÛmŒ&ô€ú­@í>¸è«‡ª’r‰ÐîîC8F˜Pv^÷ÂU@¿S³LôÕ©…'²Óš‹‰©hÁj Ls!G=ÄÕ³rüñüv¥ÃíôJ­õUÛì›xU­´I`¾)°ñ44·6Ømq kUöV¾Šzúí9Œðr‹ã0‘>NŸ®ÌPŽÚ2§òî·ºï\ùÅ{uðÒðPOWptÐèÕòý /eÍyÅé9ÚB@a\ÀÉ/û{'åØ+•·ñÀ«îæŽï 1a»˜–8½ã/¼ùÙÏ¾ŽºÞ&Æö6Þš¾Ë˜h_õ“ÃÞ;ÞQÔPñŠoƒ“€®+ âD52ÑB(Ü3‰#çp`N.ŒãËÊ?Ò%‹Jq½¸NÜ*Êæ2ŸãiÑx3-ö‹^%—såKBƒ?Ý»ótfø ©›Ei ×¼š¿¿8+»ðä"|H<Äñá·í¬üWq¹²ñ¬­™Ô åÖâ´ö0×ÓOüQ±žÅÀê ÞP><Þ÷…x‹jˆ³Ü„#ðJÌâø°—Lœ,8g¨ŸÊ(”Wšµ]ÍhFu½ÐN_‡«ýRßLÿ´„-Ï@M[“½=xOéö;œ¾ÐÌDàÿüΰ¾ð2àrz ?øû Ç?¬Iyˆ7<” [„H¥–=´!‹¯Þï¾ ÷f2GŽŠëŠE’£á\·a°j¨²»m¦n¨åÃ8ôçÞetdº*ÞuÀMp¡‹µ¾Š2£9ïØ½ü8y/¢á»ýg½¹:/L ÀåûŸÓcp­¡§EcAÊfE¿5@âUåø’«üò÷„w5“JÝÀ›Ý}àO̰ÙÃÓÅШoãψ‰ªdʲ8;½ÐÇ<§ÒÄ`³YšbkLæäÙþ¼Y_O-´Ð5Ò6×ånÉ1—2¶ 1à….WŠ®4]ØäðRâé®ÈàÒÙeOT½T‘:µDX½ú_Ï…l@ endstream endobj 1785 0 obj <> stream xÚ]PÁjÃ0 ½û+tì#NÊv 6%`J¶17àØJfhlã8‡üýb7ô°ƒzzOÒSV³ 3:@öí­ä`ÐFyœíâ%B£6$/@iö*e9 G²ºîSL¸©Yw=]_[~nsúÖÝšüÊmuÅ^³ _ç€3ƒ…²$ÙÏ6q~…ÃIÙ_"öåzmF8t5O_œ»ã„&%U•Æå›¤U8;!Ñ 3"))­ lšŠ Qÿz»¢ä¯ð¤<6³(è{âîhTEO{rñ~Û›žÅåÚàóOκ¨Jñ«¡mM endstream endobj 1787 0 obj <> stream xÚcd`aa`ddä ð õvôÖö vò54‰˜…ü±áTÿ¥ÃúC†á‡,ã9¦òÌ?ÄYd^ ‚Èçü ò±ˆTŒ‹„X9êZ:Ss J*‹SK Œõ Œœó *‹2Ó3J4’5 --ÍuŒ ,sS‹2“ó|K2RsK€œ…àüäÌÔ’J ›Œ’’+}ýòòr½ÄÜb½ü¢t;M…òÌ’ … ÔâÔ¢²Ô·ü¼¿ÄÜTˆóõ ”kiNjÐUŒö@¢‰‘‘eó¾Ÿs;7ÿèßÌø D2ÿ ÿ±Ytæôî‰Ýýó*{:åZº;:+«í<$Ê:žúÍÒÍñÛä·ÔoáßVòݺ›BæçU×tuD”Wvvv7qÔOnž.7©»·{ç%¦4^uø.ÐÍñÝî»Àw¹ïúòÝ/’V,ëé™8¡¿ŸãOØïç¢Qºw/äø®òý;Ów9¹oÝÇý¦6p,Ë]?'²;ˆã·ÊoößL¿åäºýO4Nãà+ŸÿÓqÛï¤é웹6s¯›ÀÃļr\,æóy8¿(ý¥ endstream endobj 1789 0 obj <> stream xÚ]‘ÑkÛVÆum‰.mÚµêd–Y2Hcâ¦VìgÃÈF ctsŸ¶—e]j3IšlÙ»S$×õäMõkTQ]§ú ÕãTOЙ):šŠF¦ãÓ,e .e¿Í¬™ÍXÒæW—3ZTûbU»sëê²½¢åV #“ŸRtÉ0´?¿½˜ô¡U–ˆIʤB¾#Œ|O,²Mlâ*¹Ojä©“¤ ‰HiZZ–šÒ. ’k$ƒW†³bà@7®œƒ|®„ÍçûÊNÕ­©¬ZqÌm>ã H3 r}«ž/¶òüÖx¡>çýÙ}Ø&Þ~÷WEÜ…9eüæ*ÆL»d•˜¼•/n¨ _m"< 1È2¹^¯¹ê©øù#e'_Ý Y©R6ù8ãén’ů µ‚ P€µ–Šþà+4xÿr­ènˆÛ0ã4ÁÓ¨7Ë•+Êb¾ ë° GažyûŠVY}”‡÷x•½a‘øîŠ<ŸÚ„u*'ÿV2H']m›N¥Êäš[ÝiòMXçGª/Èy” ·X ;̱l0?ÜÜCe/© Ãø&_7Ô>âSÄnqF®{FÁ¸½m9¬*‹l_Çy‘àwÑÈ_Ý s° ›ÏÁÜ(X §e ƒÖ1waž§ltèœàí¤_8mÒ¹ýâžßMƒqëP,ð»é3éw“âóÐРù?ñnR)a-¦Éçð±Fq‰üš÷R0oÛhÝéYžág4ýÛ>uÞå–Л&VTêQ?!•ÂG—Aëq®ƒûÎPwÈ-\" kqqFAÓϾÄ2žÝëÑ Cƒ5* rñ9¢iîóÖ«ZÖI*¾3äÖ!î8íPåM´¡qd5˜¤ßË)ýõÐ8K¨™ø ±"»Ø—¯lŸiïþ³»;4Ô~£ÿrÖ+_z mÎ?E endstream endobj 1791 0 obj <> stream xÚ]AkA†¿/MDM­ÌB•¥¦ãZ²­«9´‡B©^„ÖVP …m»B&1®®=å²Û]Çu7›K.öGHþ€A¡…Ä›7Á¿0³gÛƒn˜™—™y߇ùæCÈfK+«6/ß~úleyãáGÆnóÍ^bhVü‰‰‘c7UÍfØì»–½¦ýy)Ño—’ ®@q"w>_œ*Iòs]×ô{º&æ}½®êuMWkb©Z­¦Î-ÔVÛ-SÞi·Þ]ÓØ•Ͷ¼¹ß1dUÞÞ—÷^ÌwLU‘­nÓ4Vrµ±Ó6MyMÙlÍ• €çrXÇuxMx-Ž.zø ~@?b2€»° }ø«ØÀA‘)ô„)%‡x.?‰ËžC¿7°‡DŠü(Cá—±%C{Ðó¥"›¦ßÙ¼ ÏuùQ\ϱJ*ý+¾Q"‘ñc6ã"Ll›ô$_ìéq<#2ô(%ÕüŽËgélz<-Êë»ýÿó„w¨¬Ë $L'ˆ·h#……nä±-ÞHaKt™Ão¾å†³hu²xõòŽ®!{E—ÄÏc‹+®›ê³¨†©> â+²Eúù´Wñ"?c¢@¸‡ijtqT(Œò£Â$ó®þ endstream endobj 1793 0 obj <> stream xÚ]T{PTç¿—}ÜK\#WÑš»K(j|D)„•‡ ‚8 +»òf7°°"*+°„åð~- ”‡¨, š  UiMš:Smª£Æ¶43&6ö\û™¶;™tòÏ™ù¾ïÌïû=æš’J)š¦¶ÇoYñv¼ÿÜŦ¤f™tðy‰Lø%,£…×^"¸J_£(zé±Rdþ\}è2WW‰… z•’Ò4›Øâã³~­Ïº¾07=5Í Z™â¥òõ÷÷[£Zçã㯠ÎÖæ¦§¨sTjCš6[mYªX]JºÖP¨Z¹%Í`Ðoöö6kÕÙyku¹©^kTÆtCš*F›§Í-ÐjT¡ºƒ*R­U½$½öe Ñeëó Ú\U„N£Í͹*ÖP>Ô:Úò§¶Q{(-•Nåйt¾HÚ‰Z@-¤\)7j)µšò£BÅŽ(*šŠ¥v‰.MI©`ªŸæé³J‡‡$»%ŸJeÒ é¨l¾l@î T8ã]²§ ƒÑ—~ˆÌ<Á•hb÷iËß/¯€Rö¸µ¸¹ýÙCTÞH»³W§Ñ¤ôi¦ø.èhlib…GÅ6á¾€î˜K$Âþžû®‹I%©0#qð¨!F¬ÄŠzÔ£„'Õä<§‡Pë±ÙÒiø+\†ëp¿ñbûŸ¾hé…!¸^Ôºµql„Ø d^‘&?!©0æþtÅKøÆ ¾†^ŽáæsñrËÑ’wŽ”+†ÃÀùôøÌÅO‡ï_ûÃ%ø†EGÕmâI\VE{ÇÙò†Çz¦xè.9»ß:|r¢¶Ø{S‘o)!$9|Ïn’Gôn&T‚‘=$D2sâ&N£÷³ñÏÑ㬾‡Ëq=úJ°ïr(¯½Ià©RChuâÐ…Öæèa/f &&§æÄ¿ù$ —âö;Ofyø2ê‘}ô÷á‘ðkövÐgÄ‹Ìßœ4¨³ŸåaèЩ”¦Æ†ÑþÏ€ý ¶e*!¶`ÃFÑý ‹©²È&(c-ÐÁÏ1êjÑ•Æ\$~#ÌrM-UõPÞ"‡˜ ªzS±®²ÁÒÂÆËÓH³lRÞò ½¾ Úëï€(7Ë=‰#X ²ü‰K!‘CûîeK3ßÔÕµwA\ä¬èôùÍ—éNt"7>Šÿ°Ñ_â"Ü…îÁÏp^¶ãúØ{){¶B)$CV×é–Ö^èeÇ2{2ôÚÃ{Ã&£‘E%úþëx˜ªø>þéöçWŠ-÷ ËÈ‚¾è¥<ãÝ—X¤q«áæ·á.ÒÊëÐ[SbÍ€]Î&ÇÕ¢òÛÚq•m§{pªP)’Ÿ/àîÚå*¶Âþ$Q‹V±<U/Ž0o¥h#x#dÔêZ†N4ˆ¹ØSû“huqÁwâÑ=¾žùŽwþ—KI×s™~^#®¾µ¶é°vùî ¤ÄæUʼnhL/ C¯‰¤½Hu#ÙB®lÖ.O«XÔ ßg<ýâ?V}|K>„6°ö‰®˜Ç1ô n²ÑC¸-ßH=fr]V8©„nË£m—’ÎF5%ˆNüÒPDA»ÑìÙF0+ Áb65ÄEêwˆ=¯[³+ÏH«/Ô‰†2€ŽPKœ«SXqpÁޝ<'(‘`™ð‚›R÷¥&fh4êÓ'ÎÙú?áIy›K`®6€FI®†%0_T·VÙ[+¥Xn<ççž"Î6_AG<ˆŽá^åp^HïžÌ‡ß²#låS9 .•%03?âܪ±‚m´îˆ8a¨fP:{~æ\gAO:~þ<7KæqAñ?G¬s‹â2æp¸Øû{HÞÙ@hò*qùË Â°ûOqOÚI8GÁÓ¯îÃäp¬ðÛî„S: G^ʦ‘F R¸P".–nö!û¸Æd*? EìþaãÉÁÁî±É¸¡hþ]HŽÏßÉV"-'?×PŸ||¦E’›D’Í6aázä–Ý’î®ZŒüq(*-<žÙ¦©wQYÄM ¯ãâüa󽣿5A ò&äóñ°­5g¶üDeM°ï9Oé΂©“o€jènë;áv1kzn ûqàJ˜Ì,lO:—Y·¥u_ãŽf˜`gþݼ¸[j£«õUGÛ Ø«ê>RŠ!™mH®ü_HNB$÷£–& no`àûÝÓ<~͈ŸT1„~h|ÌÀï`ò6Ä`X½ÌÎD•ˆÿÍ8[…è&ÜßÙl•“ÄÆ.Âϳ5)èxRáÄ¿"õëT8V)œÞõ¿noê endstream endobj 1674 0 obj <> stream xÚå\[sܶ’~ϯàÛI*e w4¶N¥J–"ËG¾ËŽìøøAkOÕ:’K’Ïzÿýö×9$T(ÅÚݪ­©!Aht}AäŒ:ÕécG¶‹*v‰OÚv:T‡Î8‹Bê¬ò|'tÖp £;§Ÿ]ç¢4 Î;ű šÏVu -7vŽêHk®ΩKŽø¦é´Ò-4—È€_j’K6–v\e5¡J„*¾²Izò.ÊÍØiá½½Gr€ Ϥ¢‚° 3¸Y˜JRŽ L$EFÔe™A¾2̘µÈr¾¥ÎX•P²\Š(%Ø1åÈGàŠ15žéDÙøQÅTIDs€YCBKJ }LÌCÒ`9ñØ)hîmU°±:¬b€ªÕìp{ÖªD/‰fD·Î0ú¬;ë¬TqÉkno˜–7(°žƒZ(e¸cdE5Å;2}J¨âŽÉÂ\”e‹`ó –Å)(#²8ÍŠ#þ:ÿØ1¦#Ö3QhñMë¹sésÂU‰K ­¸àZ1 γ։Ew>I+ê\˜as Vª‹™`ÊŽÀ3ëË% a&—HX5W%¶;¯a‘0_¾ªÐyÃ7‰ó&H«Øyë`·‰ &ì…D ÛÄÚñžÍŸX >0œ€qÜ ±°ÚI̼‡$fËÃXƒì2ð„Ä÷ƒ"àLŒTÂ-£1+/1`vÒ Ìö™ ÌxÆ8xÃÕÑ"û {(÷ [(dR‚ †:6+÷J|Z¶QCG 'ÆL `*‰„2;N)À9X~ÅúF%#© ›¢ a{‹ÀG±¯wˆƒF!Ær%ÇvE<{!¼0®°Râ1 ›)&HšÍM*QtŒ*¡Ñ>`t–ÚÈdð÷¿o¿ü¯Ï«íg'W—Û»ç_ήئùòb…&6Õ½Ø><ýpù–5$W˜ùT_Ð}Á ðî§Ÿ¾{‹ ˆòwLüÅêòüËÅûÕe‡èRÃpëAxÁÝó³+®¸| 7í³³ó«Ë<ïs¯Húå$]Ï_Kd3êé×c€xbkéú:jIiÔ,KT³”j)SSJc“4f$å˜DXNÂ_”J‡ ŠÑåìfIsŒª¡6 k“°z†„_NÂÝSlĪr¶3ŒÐ,#ºf$¶I8½˜„S3$Ürö6pØb6ÇÌË×P™?Ù««ô5p:GÒ¹¤’¾'à{’¡/D?Wœ…ËÕp…uÜÈ¢ÔñÂëÅÄ2«£xA~/® idGºp¾è€Ö¬yÛdmÞKêèê]ÍZ;`{ZNrÆÞƒ^L"¨…Æ:È› /FëÓ #ó^SÇÔ0ãþ!.'Ú$¢ZN"ÝŽPàÅnÂLX޳³¥Š‘83KŰœÄŒoÆ´œÝŽ’ð`•Ïqi(#3Ž;Ù»«ô5pš=“ÊpT´@MO¥YOMu§ÚS“)žÊ÷ʬU8‰ÔŒXI/,Õ+Ùe+w,—iÆÒ¬#¦:„¦GLq9‰QHOy>Ã’'Ÿu9›pXÄ,‹  ¸ëB½.£IÅuÓ:äc”YåÜÊfIÏF—j–ël65§Òv1I½^SPNõ;*‰&•,œšY8™å|odᥛAeff§XÀz¹ñ–LÓ̼5T‘ŠLe 1Û[&šÄi9ñX×M½Y½˜¤]:ïN ,K2J“nYS¿$M}ˆM}ˆMí©œìœ.bvılë• •´–l±ÅœÍó¹7i6QßÄ©Z'nQÜŒj„å…’l~6¥vóRûš¡‘Ô®HíŠÔ®HÝÌoÉëŃø ©Ã`æÍ •f3ÔqW‹Ü| ©+–$š|;“¡Ù<7*ª‹khCkã„‚YL,èZÊ4@˜óÕ âa9q_×ê–´š|™;ÃÈ´ÊÒ‹BÓ”â¬)é*ñ X›’6Í Ýr’íÔb\N",‹‹SÀBñ³Xl/ú[ÅÅeß49ùƒíC^’@þ5Dd©€´{ruòéücì«Ûr²¿ºû¸°åb®\ìÉ£Â*Tÿ|öþüÃéÙÇí½Óß~[±þØ\ßFª è*q9踅gÛÕñÝwom[01n,õÓ-òçTSúu–?Í&t-2´wòŠÙ5è•=¤‰¹]ÛáÿÞGà‡ îÏÒorš’­|5Nº8ÆŽ(ø‡V9±7âÖ•åzŠÛn.š®Sgö›”lï¦wnÖé4¦­%ø;Y]NK•¼i^>f diÃ1?ômØF·X•{NÓc9æšÙú°¢×å˜kfꑊ³©òò0©EÕõ“ÇÉcÞt‹{³´¼OU‹­{N*âÈ1ãpî¯6ïüé¢V³VNÉŒ±&_®ÇdÌó°¹5x ƒEu±äî»áù×þùÙÕöÑ—¿Âjìöîï'Ï.Îß_æŸ`âáÙð$—»áÖÑêêíö³½ý퇜|\Ý÷ÓOôükMyèǤïãdþM§Â²0¼Û>>ýpõûeþ)gßìñÉÕÅé×·[ò¸±ÌVã‹wÛû§—WàŒŸíG'}9Žåmˆ¢Gc¥ò²§âüšŠ6zûþÉåJìß?øÇλŽî¿ÖJ¨î­.ß_œ~¾:¿È¿£œ>Bœ¶ØÞ=ù|°:ýøû~¨º½sùÏ„QD”ïi¾xxuòéôýÎÙÇO«Nm]­þø¥Ó6lï:ùxÙ™`´WkïqÚwO~æ¨vKßÛ?ý´Â/0ó–R…穵 1*¯tŽ0 #Œt\côËîÞƒ£BŸ«7ò!ßD(ö…6ž26¼|ÅJ™B3a})0¶Fq#`^>úó£LÝ4€ we:M`‚0¼®ÔÆUÀŒY¿˜—ç¯ÎNÙÛW “߬\cj¬Æ~ÖP=}}ÿÉ>÷¢édq1Rdo„TH ¤œêÝKÁ†j÷ŠS¨Æ¬ß)ªªCÒœQ½ùõõ¯;¢™7M¨èP©(5AégMʨØÌ3TqŠ8”ÞKø%³Öx¬é§X¹*M˜_Vy;zË™ ,­ÇveÖh=zñëp&z§åh…›EoÖÙLôö¡˜—nÓ¼œB6‘๠2_CfÆ ì`ow÷ùnp3j‘Rw™J³Ù»´¶ t¡‚l,Á ‹dt-dvèŸÿ|øŠ|ù°ae4þÑÄ· _Ç ÔrLÅÅÊLËÊRïÇ,‡,¿•¿†Ì×Iƒ™sÌ_½Ú9zÆ>nCfî²hš™>î;Ú„Ì×¹ÃX‚…¹ƒ¿>wMˆ¯ž=:~rŒY…èØ»š›™ƒí–ŠªK•:Œ8_ŠJ›Â\ªyðäèø cÞ‚ÅÝ­Ñ4ýŒ½«ø™nS‡¦‘Kщ:v’Dù5:/‰_¦:ËópžN{t¸8 cØ›FãZé&··²%ÍWÙ¦§)*cÆ—¢²±„£5*~d2/Ÿ¼| Ú/B“pWŽÄÍ711}b©ñeµ­„*Yq¾<"‡*U ×§J£yÿÁÞƒãƒû®e]/Size 1822/W[1 3 2]/Filter/FlateDecode/Length 4093>> stream xÚ=ÚwpTÙ•Çñw^¿î&çœEY !2BH‘%2ˆŒ"‰ "g‘3"ç쩚ªÙݲ]žõ¸gËžO•§¼ö”ǵ5Ŷ¾çôþó©S¿{»ÕýÂyOï¶ã8ΧO®(ræá\×ñ/užQáÜ…{Äqª:Žë8GœØeuxþsF÷áqd²ÍF_‘$qчú1€A,‡å±VÄJX«`U¬†Õ±ÖÄZXë`]¬‡õ±6ÄFØ›`Sl†QØ[`Kl%Žï…}ßÖ|ß7ÔÑØÛb;l°#vÂìŒ]0ã0»b7LÀîØ±'öÂ$ìÉØûb?ìp ÂÁ˜‚C0‡b¦ã0Ž#p$fà(c0SœJ»m‹e‹½£‡Y8'àDœ„“q NÅlÌÁi8gàLœ…³qÎÅy˜‹óq.ÄE¸—àR\†y¸óq®ÄU¸×àZ\‡ëqàFÜ„…¸·ˆS³m«­l«ÔÛp;á܉»p7îÁ½¸÷ã,F=7áa<‚GñÇxOái<ƒg±Ïáy¼€ñ^Æ+x¯áu¼7ñÞÆR¼ƒwñÞ§õïm+=w›ne'\?ÄGøŸàS|†Ïñ¾ÄWøõ\~‹z”¾ÇX¶/BáNè~»Ÿ¿âï†èr!º\ˆ.¢Ë…èr!º\ˆ.¢Ë…èr!º\ˆ.¢Ë…èr!º\ˆ.¢Ë…èr!º\ˆ.¢Ë…èr!º\ˆ.¢Ë…èr!º\Èi$Nr¢}ÚÆl+ýœM°)6Ã(lŽ-°%¶ÂÖm°-¶ÃöØ;b'ŒÁÎØc1ã±+vÃìŽ=0{b/LÂÞ˜Œ}ÄI»dß±/ßÑÏ5è0ÅãxO‹“‘nóû1? Îøß[ÒŸD÷׿ŸÅsxAœiõlæ@fV$¿$Μ·|¹îÓÁ˜"ÎÒߨèF«Š³êKRIt_Å4q ªÛh:£º÷‡áp#ÅÙ–l33˜Y[œýË,ERGœÃ‘c`4I]qŽÿÅ’1$õÅ))²$“¤8WÞ[2–¤¡8w¢,GÒDœÇ‘¿žEÒTœ7]-O%Îg§-™@Ò\œ/r,™HÒBœÿ`É$’ðuöwÃ-™LÒZœ?\¶d I´8zfÉT’¶â|ÿÉ’l’vâüÏ¿,É!Ñ£t{íŠ8ÿ¬l£ÓçÓAKfèq;gálÿ1›3‡9q"U"GÔ\=ªç‰Ôú³å¹äÝDêF¶ê|’î"-X²€¤‡HÇÈ÷ZH’(’ð_–,"é%’ô¿–,&Ñ3b‰H¿–/%OI‰±dI‘´/,É# 2z”%ËI‰dÍ·$Ÿd°ÈälKV¤ˆä|oÉJ’T‘Y¯-YE2”í|Mdqäó¯&O§^ƒkEV?°ÑuŒê±½^dsË7)Šìß’ ‘½C-ÙH2Fä`äHÞD’)rä3K IƉœŒlÍ$Y"—º[²…d¼ÈÜ/ò÷­6z€Ñ\êb<ˆ‡ð°Èϳ™G˜¹€ú(ÃãáËÛ›s‚9‹Ä-Ö’“$‹Å­YlÉ)’%â6ŒôÒÓ$ËÄbÉ’uœxQ_ZOÞ@¼ö‘¤+ICñbb-éFÒX¼¸³–$4/ñ¤%ÝIšŠ×·ª%=H¢Ä¸Ô’D’æâ¥o¶¤'I ñF—XÒ‹$š: {c²x¶Úœ>ÌiKÝûañ²ËÙ½»n/Þ¼È~HÒA¼eo,DÒ‰z0¦àLoUä×;.Ôi˜ŽÃÄ+ôÛœá̉oçXKFÄSÄ …£Åûÿ³` 3¨3Å;éBcÉ{PïRŽåYä‰âÝ~`Éx’$ñì¶dI2õDœ„“qŠx#[f*3ûŠ÷¶“%Ù$ý©spNÇâ}˜d3g2s õ,ñ>ÿÉòÙäƒÅûM¤Í!Ñm;W¼?V²\Ÿ¥Îï»Ëç“£^€ Åûñ¿mt£ÃÅûGdk/&!ÞÏ‘ss Éhꥸ óp¹x¿<¶™ùÌ̤^!~ß¿Y¾’|õ*ñW\kùjò Ôkp­økͰÑuŒNÄ—âo¼Ñòõ$“ÄßvŠ%H¦ˆ?a‡%$SÅ?(Ò+6’d‹lK6‘LÿôÈÖ.$™.þ¼Èud3É ñܰ$|¿á}Yvö%†ïÿý­ì¨ÞJ‹7ñÞÆRæl£¾ƒwñ>>ÄÇÌÙÎ{ê;/Æ%¸uûá^¥sòp9æ3º“z®Äõ̯…µ™³‹ºÖÅzX0g7u#l‚Ýx7}•žY{p/IOLÂdÔÞ²z Á4†ã™³ŸzNÂ)8³™s€:KpNÇÌ)ƃ$Kñ<^Ä˨w&‡¨¯â5¼Ž7øŽzN¦NÇá8’9¯¨µ#¡…£q fâXæÅcxœ| fc]Ô;¥Ô>ôÐÔ;¢“Ôåø$¯©Ëc=BNQëq²uë>Õ½vÏèÜÏûÔÖŒž¥n…­1ëcsJ¨ÇaŽÇ ¨ýóõ$œŒ ù‹jcæœÇ $M±Fa F/òÚÆ$3©›SÏÂÙ̹D=çb..ÀEÌÑ#a Fcl‹í™£Ç‰!ù[ú©Nâ)ýTzüœFÝžgñ^`Ž]úÙ&b<&`"snP÷ÂÞØ ^goâ-Ô“Šùøõ:UJ‡ÚºcÔ{€;Ôí°=v@ý¾zŽß¥žŠ98 §cMæÜÃû$3P÷Î,Ôýò€z&ò©ÚaÔ{ í‡1Ø»`veÎ#jý.ÚsôX†«™£õ srq>VÄJŒ>¥®ŒU°*VCýàu Ôþyõ<Õkës’–$±‡ñ¨Ÿù¾$Ñ.š€‹p.ÎcÎ+Þm-ŽÀÑ8õ:ûšz,ŽÃV˜…z¿ô†Z{¯vÎbÔÞxˆ9oQÿ_xO~àQÔ®õZ¯t¨ïÿõ>R·F}7}ÕG¾CþŸñäÖ+[•ýŸN´s6ÀF¨×uI´èUl3‰^M´OÂÁ˜‚µQ¯5ÚES1 ‡áÔsM{löÆdìƒz0HÒûã\Ũöä>8ûã LÁò8ÓQ¯,«©W vr}Ï5¸7`VÄJ¸7a!ÎG½o©Œz¢÷úž÷ðVA=³žàS|†z„ëÙ±×a'ŒA=[«au¬5ÅéÛãX;Óón+àFÜ‚›°73_û’ÞÕlCýE¸÷á.Ü{p/^B½ºÀb<ˆ‡P¯õz5?ŠÇP¯×z¾ë•W;ÿi<ƒz•Ôë ^éÎãÔkÖc¼ŒWð*^Ãë¨÷7ñÞÆRÔ^­Ýøj¿Õ¾úá Ôî§[[ûØsü€Ú‹ôNFï"Þà[|‡ïÙþzv|¤Ö_ˆøï÷±ÚEzX ÄrX+`E¬„•± VÅjXk`MlŒµ±ÖÅzX`Cl„m° 6Åf…ͱ¶ÄV¨¿"ˆÆv؇`,vÀŽØ c°3vÁ^‡ñØ»avǘˆ=q&aoLÆ>Øûa€1c6¦b&Å4LÇa8GàHÌÀQ8Çà$Ô_ŒÃ,p"NÅÉ87âlÌÁi8gàLœ…Kqêocæa.ÎǸáb\‚kpæárÌǸWáj,Àµ¸×£ö±Cx7a!j×Ú‚úkm¸‹pîÄ]¸÷à^܇ûñã)<ŒGð(ÃãxOâ5Æûøâ#|Âܺf§+¿Ú%^ v¡—øß2G»Íêð}Åç<; ×.–Ç êsQ}ö«O‰õYn5¬úTVŸ©vB}.ÚÛ`Glº¢‹1ã±'öÁ$Ôu"]çÕj]q†i¨ëÂÃQW9u…W×gu-UWfuUTW÷f£®Hê6œ‡ºŽ©«º2¨kˆº†¥+zº¸unê ®Áé*˜þMŸŠ— ®déj×a<Žºr¤ëPºÒ¤k"º¤ëGºZtu=è–¢®ªÜá/ê>Õõ‘øu%â­§¦ÛD ÔUÁò¨¿:¨ŒÕQŸ°µÂºXa=l†úL[Ÿ¬ê³è֨Ϯõ²>mÖg¿ú 9õ ­>Ög¼¨Ï`{£>Gí‡úÜ5 S0Gb:ÎB}†9 õù§>휌ú<3gŠÿw?•¼Væ·óÊükÀ¶X.êÓ¸Püÿxj£‹$bõb TŽ ¿6Pýª%K$Pã벤[_K–J ¡¤,éó½%Ë$ЯYY2á†%y˜øUY²¼‘%Ë%ŸV–úµ%ù8ü/«WHàN‘Õ+%ðtÕ«$ða½Õ«%ðM½²wø®¥%k$ð}–Õk%Ü F-Y'Á6™eIçž–¬—`—¹Vo`ü›²Ñž-)`¯ÈÌìý[«7Ip`†Õ…LùÙêÍLÝQöðd‹G6´z«Gu°z›3ÿjõv fu²z'îÆ½¸‹ñÁcxOá,Áóx/ãU¼Ž7ñ6ê¹và#Ôά¿D}¯$˜÷Þqþù@0Ç endstream endobj startxref 488901 %%EOF glpk-5.0/doc/glpk.tex0000644000062000006210000000617213766346220013734 0ustar maomkpasswd% glpk.tex % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % The GLPK package is part of the GNU Project released under the aegis % of GNU. % % Copyright (c) 2000-2020 Free Software Foundation, Inc. % % Author: Andrew Makhorin . % % Permission is granted to copy, distribute and/or modify this % document under the terms of the GNU Free Documentation License, % Version 1.3 or any later version published by the Free Software % Foundation. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % To produce glpk.pdf from glpk.tex run the following two commands: % latex glpk.tex % dvipdfm -p letter glpk.dvi % Note: You need TeX Live 2010 or later version. \documentclass[11pt]{report} \usepackage{amssymb} \usepackage[dvipdfm,linktocpage,colorlinks,linkcolor=blue, urlcolor=blue]{hyperref} \usepackage{indentfirst} \usepackage{lscape} \usepackage{niceframe} \usepackage[all]{xy} % US Letter = 8.5 x 11 in \setlength{\textwidth}{6.5in} \setlength{\textheight}{9in} \setlength{\oddsidemargin}{0in} \setlength{\topmargin}{0in} \setlength{\headheight}{0in} \setlength{\headsep}{0in} %\setlength{\footskip}{0.5in} \setlength{\parindent}{16pt} \setlength{\parskip}{5pt} \setlength{\topsep}{0pt} \setlength{\partopsep}{0pt} %\setlength{\itemsep}{\parskip} %\setlength{\parsep}{0pt} %\setlength{\leftmargini}{\parindent} %\renewcommand{\labelitemi}{---} \newcommand{\Item}[1]{\parbox[t]{\parindent}{#1}} \def\para#1{\noindent{\bf#1}} \def\synopsis{\para{Synopsis}} \def\description{\para{Description}} \def\note{\para{Note}} \def\returns{\para{Returns}} \renewcommand\contentsname{\sf\bfseries Contents} \renewcommand\chaptername{\sf\bfseries Chapter} \renewcommand\appendixname{\sf\bfseries Appendix} \newenvironment{retlist} { \def\arraystretch{1.5} \noindent \begin{tabular}{@{}p{1in}@{}p{5.5in}@{}} } {\end{tabular}} \begin{document} \thispagestyle{empty} \artdecoframe{ \begin{center} \vspace*{1.5in} \begin{huge} \sf\bfseries GNU Linear Programming Kit \end{huge} \vspace{0.5in} \begin{LARGE} \sf Reference Manual \end{LARGE} \vspace{0.5in} \begin{LARGE} \sf for GLPK Version 5.0 \end{LARGE} \vspace{0.5in} \begin{Large} \sf (December 2020) \end{Large} \end{center} \vspace*{3.2in} } \newpage \vspace*{1in} \vfill \noindent The GLPK package is part of the GNU Project released under the aegis of GNU. \noindent Copyright \copyright{} 2000-2020 Free Software Foundation, Inc. \noindent Author: Andrew Makhorin $<$mao@gnu.org$>$. \noindent Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newpage {\setlength{\parskip}{0pt}\tableofcontents} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \include{glpk01} \include{glpk02} \include{glpk03} \include{glpk04} \include{glpk05} \include{glpk06} \appendix \include{glpk07} \include{glpk08} \include{glpk09} \include{glpk10} \include{glpk11} \include{glpk12} \end{document} glpk-5.0/doc/glpk01.tex0000644000062000006210000002766313766346220014105 0ustar maomkpasswd%* glpk01.tex *% \chapter{Introduction} GLPK (\underline{G}NU \underline{L}inear \underline{P}rogramming \underline{K}it) is a set of routines written in the ANSI C programming language and organized in the form of a callable library. It is intended for solving linear programming (LP), mixed integer programming (MIP), and other related problems. \section{LP problem} \label{seclp} GLPK assumes the following formulation of the {\it linear programming (LP)} problem: \noindent \hspace{.5in} minimize (or maximize) $$z = c_1x_{m+1} + c_2x_{m+2} + \dots + c_nx_{m+n} + c_0 \eqno (1.1)$$ \hspace{.5in} subject to linear constraints $$ \begin{array}{r@{\:}c@{\:}r@{\:}c@{\:}r@{\:}c@{\:}r} x_1&=&a_{11}x_{m+1}&+&a_{12}x_{m+2}&+ \dots +&a_{1n}x_{m+n} \\ x_2&=&a_{21}x_{m+1}&+&a_{22}x_{m+2}&+ \dots +&a_{2n}x_{m+n} \\ \multicolumn{7}{c} {.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .} \\ x_m&=&a_{m1}x_{m+1}&+&a_{m2}x_{m+2}&+ \dots +&a_{mn}x_{m+n} \\ \end{array} \eqno (1.2) $$ \hspace{.5in} and bounds of variables $$ \begin{array}{r@{\:}c@{\:}c@{\:}c@{\:}l} l_1&\leq&x_1&\leq&u_1 \\ l_2&\leq&x_2&\leq&u_2 \\ \multicolumn{5}{c}{.\ \ .\ \ .\ \ .\ \ .}\\ l_{m+n}&\leq&x_{m+n}&\leq&u_{m+n} \\ \end{array} \eqno (1.3) $$ where: $x_1, x_2, \dots, x_m$ are auxiliary variables; $x_{m+1}, x_{m+2}, \dots, x_{m+n}$ are structural variables; $z$ is the objective function; $c_1, c_2, \dots, c_n$ are objective coefficients; $c_0$ is the constant term (``shift'') of the objective function; $a_{11}, a_{12}, \dots, a_{mn}$ are constraint coefficients; $l_1, l_2, \dots, l_{m+n}$ are lower bounds of variables; $u_1, u_2, \dots, u_{m+n}$ are upper bounds of variables. Auxiliary variables are also called {\it rows}, because they correspond to rows of the constraint matrix (i.e. a matrix built of the constraint coefficients). Similarly, structural variables are also called {\it columns}, because they correspond to columns of the constraint matrix. Bounds of variables can be finite as well as infinite. Besides, lower and upper bounds can be equal to each other. Thus, the following types of variables are possible: \begin{center} \begin{tabular}{r@{}c@{}ll} \multicolumn{3}{c}{Bounds of variable} & Type of variable \\ \hline $-\infty <$ &$\ x_k\ $& $< +\infty$ & Free (unbounded) variable \\ $l_k \leq$ &$\ x_k\ $& $< +\infty$ & Variable with lower bound \\ $-\infty <$ &$\ x_k\ $& $\leq u_k$ & Variable with upper bound \\ $l_k \leq$ &$\ x_k\ $& $\leq u_k$ & Double-bounded variable \\ $l_k =$ &$\ x_k\ $& $= u_k$ & Fixed variable \\ \end{tabular} \end{center} \noindent Note that the types of variables shown above are applicable to structural as well as to auxiliary variables. To solve the LP problem (1.1)---(1.3) is to find such values of all structural and auxiliary variables, which: %\vspace*{-10pt} %\begin{itemize}\setlength{\itemsep}{0pt} \Item{---}satisfy to all the linear constraints (1.2), and \Item{---}are within their bounds (1.3), and \Item{---}provide smallest (in case of minimization) or largest (in case of maximization) value of the objective function (1.1). %\end{itemize} \section{MIP problem} {\it Mixed integer linear programming (MIP)} problem is an LP problem in which some variables are additionally required to be integer. GLPK assumes that MIP problem has the same formulation as ordinary (pure) LP problem (1.1)---(1.3), i.e. includes auxiliary and structural variables, which may have lower and/or upper bounds. However, in case of MIP problem some variables may be required to be integer. This additional constraint means that a value of each {\it integer variable} must be only integer number. (Should note that GLPK allows only structural variables to be of integer kind.) \section{Using the package} \subsection{Brief example} In order to understand what GLPK is from the user's standpoint, consider the following simple LP problem: \noindent \hspace{.5in} maximize $$z = 10 x_1 + 6 x_2 + 4 x_3$$ \hspace{.5in} subject to $$ \begin{array}{r@{\:}c@{\:}r@{\:}c@{\:}r@{\:}c@{\:}r} x_1 &+&x_2 &+&x_3 &\leq 100 \\ 10 x_1 &+& 4 x_2 & +&5 x_3 & \leq 600 \\ 2 x_1 &+& 2 x_2 & +& 6 x_3 & \leq 300 \\ \end{array} $$ \hspace{.5in} where all variables are non-negative $$x_1 \geq 0, \ x_2 \geq 0, \ x_3 \geq 0$$ At first, this LP problem should be transformed to the standard form (1.1)---(1.3). This can be easily done by introducing auxiliary variables, by one for each original inequality constraint. Thus, the problem can be reformulated as follows: \noindent \hspace{.5in} maximize $$z = 10 x_1 + 6 x_2 + 4 x_3$$ \hspace{.5in} subject to $$ \begin{array}{r@{\:}c@{\:}r@{\:}c@{\:}r@{\:}c@{\:}r} p& = &x_1 &+&x_2 &+&x_3 \\ q& = &10 x_1 &+& 4 x_2 &+& 5 x_3 \\ r& = &2 x_1 &+& 2 x_2 &+& 6 x_3 \\ \end{array} $$ \hspace{.5in} and bounds of variables $$ \begin{array}{ccc} \nonumber -\infty < p \leq 100 && 0 \leq x_1 < +\infty \\ \nonumber -\infty < q \leq 600 && 0 \leq x_2 < +\infty \\ \nonumber -\infty < r \leq 300 && 0 \leq x_3 < +\infty \\ \end{array} $$ where $p, q, r$ are auxiliary variables (rows), and $x_1, x_2, x_3$ are structural variables (columns). The example C program shown below uses GLPK API routines in order to solve this LP problem.\footnote{If you just need to solve LP or MIP instance, you may write it in MPS or CPLEX LP format and then use the GLPK stand-alone solver to obtain a solution. This is much less time-consuming than programming in C with GLPK API routines.} \begin{footnotesize} \begin{verbatim} /* sample.c */ #include #include #include int main(void) { glp_prob *lp; int ia[1+1000], ja[1+1000]; double ar[1+1000], z, x1, x2, x3; s1: lp = glp_create_prob(); s2: glp_set_prob_name(lp, "sample"); s3: glp_set_obj_dir(lp, GLP_MAX); s4: glp_add_rows(lp, 3); s5: glp_set_row_name(lp, 1, "p"); s6: glp_set_row_bnds(lp, 1, GLP_UP, 0.0, 100.0); s7: glp_set_row_name(lp, 2, "q"); s8: glp_set_row_bnds(lp, 2, GLP_UP, 0.0, 600.0); s9: glp_set_row_name(lp, 3, "r"); s10: glp_set_row_bnds(lp, 3, GLP_UP, 0.0, 300.0); s11: glp_add_cols(lp, 3); s12: glp_set_col_name(lp, 1, "x1"); s13: glp_set_col_bnds(lp, 1, GLP_LO, 0.0, 0.0); s14: glp_set_obj_coef(lp, 1, 10.0); s15: glp_set_col_name(lp, 2, "x2"); s16: glp_set_col_bnds(lp, 2, GLP_LO, 0.0, 0.0); s17: glp_set_obj_coef(lp, 2, 6.0); s18: glp_set_col_name(lp, 3, "x3"); s19: glp_set_col_bnds(lp, 3, GLP_LO, 0.0, 0.0); s20: glp_set_obj_coef(lp, 3, 4.0); s21: ia[1] = 1, ja[1] = 1, ar[1] = 1.0; /* a[1,1] = 1 */ s22: ia[2] = 1, ja[2] = 2, ar[2] = 1.0; /* a[1,2] = 1 */ s23: ia[3] = 1, ja[3] = 3, ar[3] = 1.0; /* a[1,3] = 1 */ s24: ia[4] = 2, ja[4] = 1, ar[4] = 10.0; /* a[2,1] = 10 */ s25: ia[5] = 3, ja[5] = 1, ar[5] = 2.0; /* a[3,1] = 2 */ s26: ia[6] = 2, ja[6] = 2, ar[6] = 4.0; /* a[2,2] = 4 */ s27: ia[7] = 3, ja[7] = 2, ar[7] = 2.0; /* a[3,2] = 2 */ s28: ia[8] = 2, ja[8] = 3, ar[8] = 5.0; /* a[2,3] = 5 */ s29: ia[9] = 3, ja[9] = 3, ar[9] = 6.0; /* a[3,3] = 6 */ s30: glp_load_matrix(lp, 9, ia, ja, ar); s31: glp_simplex(lp, NULL); s32: z = glp_get_obj_val(lp); s33: x1 = glp_get_col_prim(lp, 1); s34: x2 = glp_get_col_prim(lp, 2); s35: x3 = glp_get_col_prim(lp, 3); s36: printf("\nz = %g; x1 = %g; x2 = %g; x3 = %g\n", z, x1, x2, x3); s37: glp_delete_prob(lp); return 0; } /* eof */ \end{verbatim} \end{footnotesize} The statement \verb|s1| creates a problem object. Being created the object is initially empty. The statement \verb|s2| assigns a symbolic name to the problem object. The statement \verb|s3| calls the routine \verb|glp_set_obj_dir| in order to set the optimization direction flag, where \verb|GLP_MAX| means maximization. The statement \verb|s4| adds three rows to the problem object. The statement \verb|s5| assigns the symbolic name `\verb|p|' to the first row, and the statement \verb|s6| sets the type and bounds of the first row, where \verb|GLP_UP| means that the row has an upper bound. The statements \verb|s7|, \verb|s8|, \verb|s9|, \verb|s10| are used in the same way in order to assign the symbolic names `\verb|q|' and `\verb|r|' to the second and third rows and set their types and bounds. The statement \verb|s11| adds three columns to the problem object. The statement \verb|s12| assigns the symbolic name `\verb|x1|' to the first column, the statement \verb|s13| sets the type and bounds of the first column, where \verb|GLP_LO| means that the column has an lower bound, and the statement \verb|s14| sets the objective coefficient for the first column. The statements \verb|s15|---\verb|s20| are used in the same way in order to assign the symbolic names `\verb|x2|' and `\verb|x3|' to the second and third columns and set their types, bounds, and objective coefficients. The statements \verb|s21|---\verb|s29| prepare non-zero elements of the constraint matrix (i.e. constraint coefficients). Row indices of each element are stored in the array \verb|ia|, column indices are stored in the array \verb|ja|, and numerical values of corresponding elements are stored in the array \verb|ar|. Then the statement \verb|s30| calls the routine \verb|glp_load_matrix|, which loads information from these three arrays into the problem object. Now all data have been entered into the problem object, and therefore the statement \verb|s31| calls the routine \verb|glp_simplex|, which is a driver to the simplex method, in order to solve the LP problem. This routine finds an optimal solution and stores all relevant information back into the problem object. The statement \verb|s32| obtains a computed value of the objective function, and the statements \verb|s33|---\verb|s35| obtain computed values of structural variables (columns), which correspond to the optimal basic solution found by the solver. The statement \verb|s36| writes the optimal solution to the standard output. The printout may look like follows: \newpage \begin{footnotesize} \begin{verbatim} * 0: objval = 0.000000000e+00 infeas = 0.000000000e+00 (0) * 2: objval = 7.333333333e+02 infeas = 0.000000000e+00 (0) OPTIMAL SOLUTION FOUND z = 733.333; x1 = 33.3333; x2 = 66.6667; x3 = 0 \end{verbatim} \end{footnotesize} Finally, the statement \verb|s37| calls the routine \verb|glp_delete_prob|, which frees all the memory allocated to the problem object. \subsection{Compiling} The GLPK package has the only header file \verb|glpk.h|, which should be available on compiling a C (or C++) program using GLPK API routines. If the header file is installed in the default location \verb|/usr/local/include|, the following typical command may be used to compile, say, the example C program described above with the GNU C compiler: \begin{verbatim} $ gcc -c sample.c \end{verbatim} If \verb|glpk.h| is not in the default location, the corresponding directory containing it should be made known to the C compiler through \verb|-I| option, for example: \begin{verbatim} $ gcc -I/foo/bar/glpk-4.15/include -c sample.c \end{verbatim} In any case the compilation results in an object file \verb|sample.o|. \subsection{Linking} The GLPK library is a single file \verb|libglpk.a|. (On systems which support shared libraries there may be also a shared version of the library \verb|libglpk.so|.) If the library is installed in the default location \verb|/usr/local/lib|, the following typical command may be used to link, say, the example C program described above against with the library: \begin{verbatim} $ gcc sample.o -lglpk -lm \end{verbatim} If the GLPK library is not in the default location, the corresponding directory containing it should be made known to the linker through \verb|-L| option, for example: \begin{verbatim} $ gcc -L/foo/bar/glpk-4.15 sample.o -lglpk -lm \end{verbatim} Depending on configuration of the package linking against with the GLPK library may require optional libraries, in which case these libraries should be also made known to the linker, for example: \begin{verbatim} $ gcc sample.o -lglpk -lgmp -lm \end{verbatim} For more details about configuration options of the GLPK package see Appendix \ref{install}, page \pageref{install}. %* eof *% glpk-5.0/doc/glpk02.tex0000644000062000006210000032277213766346220014105 0ustar maomkpasswd%* glpk02.tex *% \chapter{Basic API Routines} \section{General conventions} \subsection{Library header} All GLPK API data types and routines are defined in the header file \verb|glpk.h|. It should be included in all source files which use GLPK API, either directly or indirectly through some other header file as follows: \begin{verbatim} #include \end{verbatim} \subsection{Error handling} If some GLPK API routine detects erroneous or incorrect data passed by the application program, it writes appropriate diagnostic messages to the terminal and then abnormally terminates the application program. In most practical cases this allows to simplify programming by avoiding numerous checks of return codes. Thus, in order to prevent crashing the application program should check all data, which are suspected to be incorrect, before calling GLPK API routines. Should note that this kind of error handling is used only in cases of incorrect data passed by the application program. If, for example, the application program calls some GLPK API routine to read data from an input file and these data are incorrect, the GLPK API routine reports about error in the usual way by means of the return code. \subsection{Thread safety} The standard version of GLPK API is {\it not} thread safe and therefore should not be used in multi-threaded programs. \subsection{Array indexing} Normally all GLPK API routines start array indexing from 1, not from 0 (except the specially stipulated cases). This means, for example, that if some vector $x$ of the length $n$ is passed as an array to some GLPK API routine, the latter expects vector components to be placed in locations \verb|x[1]|, \verb|x[2]|, \dots, \verb|x[n]|, and the location \verb|x[0]| normally is not used. To avoid indexing errors it is most convenient and most reliable to declare the array \verb|x| as follows: \begin{verbatim} double x[1+n]; \end{verbatim} \noindent or to allocate it as follows: \begin{verbatim} double *x; . . . x = calloc(1+n, sizeof(double)); . . . \end{verbatim} \noindent In both cases one extra location \verb|x[0]| is reserved that allows passing the array to GLPK routines in a usual way. \section{Problem object} All GLPK API routines deal with so called {\it problem object}, which is a program object of type \verb|glp_prob| and intended to represent a particular LP or MIP instance. The type \verb|glp_prob| is a data structure declared in the header file \verb|glpk.h| as follows: \begin{verbatim} typedef struct glp_prob glp_prob; \end{verbatim} Problem objects (i.e. program objects of the \verb|glp_prob| type) are allocated and managed internally by the GLPK API routines. The application program should never use any members of the \verb|glp_prob| structure directly and should deal only with pointers to these objects (that is, \verb|glp_prob *| values). The problem object consists of the following segments: %\vspace*{-8pt} %\begin{itemize}\setlength{\itemsep}{0pt} \Item{---}problem segment, \Item{---}basis segment, \Item{---}interior-point segment, and \Item{---}MIP segment. %\end{itemize} \subsection{Problem segment} The {\it problem segment} contains original LP/MIP data, which corresponds to the problem formulation (1.1)---(1.3) (see Section \ref{seclp}, page \pageref{seclp}). This segment includes the following components: %\vspace*{-8pt} %\begin{itemize}\setlength{\itemsep}{0pt} \Item{---}rows (auxiliary variables), \Item{---}columns (structural variables), \Item{---}objective function, and \Item{---}constraint matrix. %\end{itemize} %\vspace*{-7pt} Rows and columns have the same set of the following attributes: %\vspace*{-7pt} %\begin{itemize}\setlength{\itemsep}{0pt} \Item{---}ordinal number, \Item{---}symbolic name (1 up to 255 arbitrary graphic characters), \Item{---}type (free, lower bound, upper bound, double bound, fixed), \Item{---}numerical values of lower and upper bounds, \Item{---}scale factor. %\end{itemize} %\vspace*{-7pt} {\it Ordinal numbers} are intended for referencing rows and columns. Row ordinal numbers are integers $1, 2, \dots, m$, and column ordinal numbers are integers $1, 2, \dots, n$, where $m$ and $n$ are, respectively, the current number of rows and columns in the problem object. {\it Symbolic names} are intended for informational purposes. They also can be used for referencing rows and columns. {\it Types and bounds} of rows (auxiliary variables) and columns (structural variables) are explained above (see Section \ref{seclp}, page \pageref{seclp}). {\it Scale factors} are used internally for scaling rows and columns of the constraint matrix. Information about the {\it objective function} includes numerical values of objective coefficients and a flag, which defines the optimization direction (i.e. minimization or maximization). The {\it constraint matrix} is a $m \times n$ rectangular matrix built of constraint coefficients $a_{ij}$, which defines the system of linear constraints (1.2) (see Section \ref{seclp}, page \pageref{seclp}). This matrix is stored in the problem object in both row-wise and column-wise sparse formats. Once the problem object has been created, the application program can access and modify any components of the problem segment in arbitrary order. \subsection{Basis segment} The {\it basis segment} of the problem object keeps information related to the current basic solution. It includes: %\vspace*{-8pt} %\begin{itemize}\setlength{\itemsep}{0pt} \Item{---}row and column statuses, \Item{---}basic solution statuses, \Item{---}factorization of the current basis matrix, and \Item{---}basic solution components. %\end{itemize} %\vspace*{-8pt} The {\it row and column statuses} define which rows and columns are basic and which are non-basic. These statuses may be assigned either by the application program of by some API routines. Note that these statuses are always defined independently on whether the corresponding basis is valid or not. The {\it basic solution statuses} include the {\it primal status} and the {\it dual status}, which are set by the simplex-based solver once the problem has been solved. The primal status shows whether a primal basic solution is feasible, infeasible, or undefined. The dual status shows the same for a dual basic solution. The {\it factorization of the basis matrix} is some factorized form (like {\it LU}-factorization) of the current basis matrix (defined by the current row and column statuses). The factorization is used by simplex-based solvers and kept when the solver terminates the search. This feature allows efficiently reoptimizing the problem after some modifications (for example, after changing some bounds or objective coefficients). It also allows performing the post-optimal analysis (for example, computing components of the simplex table, etc.). The {\it basic solution components} include primal and dual values of all auxiliary and structural variables for the most recently obtained basic solution. \subsection{Interior-point segment} The {\it interior-point segment} contains interior-point solution components, which include the solution status, and primal and dual values of all auxiliary and structural variables. \subsection{MIP segment} The {\it MIP segment} is used only for MIP problems. This segment includes: %\vspace*{-8pt} %\begin{itemize}\setlength{\itemsep}{0pt} \Item{---}column kinds, \Item{---}MIP solution status, and \Item{---}MIP solution components. %\end{itemize} %\vspace*{-8pt} The {\it column kinds} define which columns (i.e. structural variables) are integer and which are continuous. The {\it MIP solution status} is set by the MIP solver and shows whether a MIP solution is integer optimal, integer feasible (non-optimal), or undefined. The {\it MIP solution components} are computed by the MIP solver and include primal values of all auxiliary and structural variables for the most recently obtained MIP solution. Note that in case of MIP problem the basis segment corresponds to the optimal solution of LP relaxation, which is also available to the application program. Currently the search tree is not kept in the MIP segment, so if the search has been terminated, it cannot be continued. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newpage \section{Problem creating and modifying routines} \subsection{glp\_create\_prob --- create problem object} \synopsis \begin{verbatim} glp_prob *glp_create_prob(void); \end{verbatim} \description The routine \verb|glp_create_prob| creates a new problem object, which initially is ``empty'', i.e. has no rows and columns. \returns The routine returns a pointer to the created object, which should be used in any subsequent operations on this object. \subsection{glp\_set\_prob\_name --- assign (change) problem name} \synopsis \begin{verbatim} void glp_set_prob_name(glp_prob *P, const char *name); \end{verbatim} \description The routine \verb|glp_set_prob_name| assigns a given symbolic \verb|name| (1 up to 255 characters) to the specified problem object. If the parameter \verb|name| is \verb|NULL| or empty string, the routine erases an existing symbolic name of the problem object. \subsection{glp\_set\_obj\_name --- assign (change) objective function name} \synopsis \begin{verbatim} void glp_set_obj_name(glp_prob *P, const char *name); \end{verbatim} \description The routine \verb|glp_set_obj_name| assigns a given symbolic \verb|name| (1 up to 255 characters) to the objective function of the specified problem object. If the parameter \verb|name| is \verb|NULL| or empty string, the routine erases an existing symbolic name of the objective function. \newpage \subsection{glp\_set\_obj\_dir --- set (change) optimization direction flag} \synopsis \begin{verbatim} void glp_set_obj_dir(glp_prob *P, int dir); \end{verbatim} \description The routine \verb|glp_set_obj_dir| sets (changes) the optimization direction flag (i.e. ``sense'' of the objective function) as specified by the parameter \verb|dir|: \verb|GLP_MIN| means minimization; \verb|GLP_MAX| means maximization. Note that by default the problem is minimization. \subsection{glp\_add\_rows --- add new rows to problem object} \synopsis \begin{verbatim} int glp_add_rows(glp_prob *P, int nrs); \end{verbatim} \description The routine \verb|glp_add_rows| adds \verb|nrs| rows (constraints) to the specified problem object. New rows are always added to the end of the row list, so the ordinal numbers of existing rows are not changed. Being added each new row is initially free (unbounded) and has empty list of the constraint coefficients. Each new row becomes a non-active (non-binding) constraint, i.e. the corresponding auxiliary variable is marked as basic. If the basis factorization exists, adding row(s) invalidates it. \returns The routine \verb|glp_add_rows| returns the ordinal number of the first new row added to the problem object. \subsection{glp\_add\_cols --- add new columns to problem object} \synopsis \begin{verbatim} int glp_add_cols(glp_prob *P, int ncs); \end{verbatim} \description The routine \verb|glp_add_cols| adds \verb|ncs| columns (structural variables) to the specified problem object. New columns are always added to the end of the column list, so the ordinal numbers of existing columns are not changed. Being added each new column is initially fixed at zero and has empty list of the constraint coefficients. Each new column is marked as non-basic, i.e. zero value of the corresponding structural variable becomes an active (binding) bound. If the basis factorization exists, it remains valid. \returns The routine \verb|glp_add_cols| returns the ordinal number of the first new column added to the problem object. \subsection{glp\_set\_row\_name --- assign (change) row name} \synopsis \begin{verbatim} void glp_set_row_name(glp_prob *P, int i, const char *name); \end{verbatim} \description The routine \verb|glp_set_row_name| assigns a given symbolic \verb|name| (1 up to 255 characters) to \verb|i|-th row (auxiliary variable) of the specified problem object. If the parameter \verb|name| is \verb|NULL| or empty string, the routine erases an existing name of $i$-th row. \subsection{glp\_set\_col\_name --- assign (change) column name} \synopsis \begin{verbatim} void glp_set_col_name(glp_prob *P, int j, const char *name); \end{verbatim} \description The routine \verb|glp_set_col_name| assigns a given symbolic \verb|name| (1 up to 255 characters) to \verb|j|-th column (structural variable) of the specified problem object. If the parameter \verb|name| is \verb|NULL| or empty string, the routine erases an existing name of $j$-th column. \subsection{glp\_set\_row\_bnds --- set (change) row bounds} \synopsis {\tt void glp\_set\_row\_bnds(glp\_prob *P, int i, int type, double lb, double ub);} \description The routine \verb|glp_set_row_bnds| sets (changes) the type and bounds of \verb|i|-th row (auxiliary variable) of the specified problem object. The parameters \verb|type|, \verb|lb|, and \verb|ub| specify the type, lower bound, and upper bound, respectively, as follows: \begin{center} \begin{tabular}{cr@{}c@{}ll} Type & \multicolumn{3}{c}{Bounds} & Comment \\ \hline \verb|GLP_FR| & $-\infty <$ &$\ x\ $& $< +\infty$ & Free (unbounded) variable \\ \verb|GLP_LO| & $lb \leq$ &$\ x\ $& $< +\infty$ & Variable with lower bound \\ \verb|GLP_UP| & $-\infty <$ &$\ x\ $& $\leq ub$ & Variable with upper bound \\ \verb|GLP_DB| & $lb \leq$ &$\ x\ $& $\leq ub$ & Double-bounded variable \\ \verb|GLP_FX| & $lb =$ &$\ x\ $& $= ub$ & Fixed variable \\ \end{tabular} \end{center} \noindent where $x$ is the auxiliary variable associated with $i$-th row. If the row has no lower bound, the parameter \verb|lb| is ignored. If the row has no upper bound, the parameter \verb|ub| is ignored. If the row is an equality constraint (i.e. the corresponding auxiliary variable is of fixed type), only the parameter \verb|lb| is used while the parameter \verb|ub| is ignored. Being added to the problem object each row is initially free, i.e. its type is \verb|GLP_FR|. \subsection{glp\_set\_col\_bnds --- set (change) column bounds} \synopsis {\tt void glp\_set\_col\_bnds(glp\_prob *P, int j, int type, double lb, double ub);} \description The routine \verb|glp_set_col_bnds| sets (changes) the type and bounds of \verb|j|-th column (structural variable) of the specified problem object. The parameters \verb|type|, \verb|lb|, and \verb|ub| specify the type, lower bound, and upper bound, respectively, as follows: \begin{center} \begin{tabular}{cr@{}c@{}ll} Type & \multicolumn{3}{c}{Bounds} & Comment \\ \hline \verb|GLP_FR| & $-\infty <$ &$\ x\ $& $< +\infty$ & Free (unbounded) variable \\ \verb|GLP_LO| & $lb \leq$ &$\ x\ $& $< +\infty$ & Variable with lower bound \\ \verb|GLP_UP| & $-\infty <$ &$\ x\ $& $\leq ub$ & Variable with upper bound \\ \verb|GLP_DB| & $lb \leq$ &$\ x\ $& $\leq ub$ & Double-bounded variable \\ \verb|GLP_FX| & $lb =$ &$\ x\ $& $= ub$ & Fixed variable \\ \end{tabular} \end{center} \noindent where $x$ is the structural variable associated with $j$-th column. If the column has no lower bound, the parameter \verb|lb| is ignored. If the column has no upper bound, the parameter \verb|ub| is ignored. If the column is of fixed type, only the parameter \verb|lb| is used while the parameter \verb|ub| is ignored. Being added to the problem object each column is initially fixed at zero, i.e. its type is \verb|GLP_FX| and both bounds are 0. %\newpage \subsection{glp\_set\_obj\_coef --- set (change) objective coefficient or constant term} \synopsis \begin{verbatim} void glp_set_obj_coef(glp_prob *P, int j, double coef); \end{verbatim} \description The routine \verb|glp_set_obj_coef| sets (changes) the objective coefficient at \verb|j|-th column (structural variable). A new value of the objective coefficient is specified by the parameter \verb|coef|. If the parameter \verb|j| is 0, the routine sets (changes) the constant term (``shift'') of the objective function. \newpage \subsection{glp\_set\_mat\_row --- set (replace) row of the constraint matrix} \synopsis \begin{verbatim} void glp_set_mat_row(glp_prob *P, int i, int len, const int ind[], const double val[]); \end{verbatim} \description The routine \verb|glp_set_mat_row| stores (replaces) the contents of \verb|i|-th row of the constraint matrix of the specified problem object. Column indices and numerical values of new row elements should be placed in locations\linebreak \verb|ind[1]|, \dots, \verb|ind[len]| and \verb|val[1]|, \dots, \verb|val[len]|, respectively, where $0 \leq$ \verb|len| $\leq n$ is the new length of $i$-th row, $n$ is the current number of columns in the problem object. Elements with identical column indices are not allowed. Zero elements are allowed, but they are not stored in the constraint matrix. If the parameter \verb|len| is 0, the parameters \verb|ind| and/or \verb|val| can be specified as \verb|NULL|. \note If the basis factorization exists and changing the row changes coefficients at basic column(s), the factorization is invalidated. \subsection{glp\_set\_mat\_col --- set (replace) column of the constr\-aint matrix} \synopsis \begin{verbatim} void glp_set_mat_col(glp_prob *P, int j, int len, const int ind[], const double val[]); \end{verbatim} \description The routine \verb|glp_set_mat_col| stores (replaces) the contents of \verb|j|-th column of the constraint matrix of the specified problem object. Row indices and numerical values of new column elements should be placed in locations\linebreak \verb|ind[1]|, \dots, \verb|ind[len]| and \verb|val[1]|, \dots, \verb|val[len]|, respectively, where $0 \leq$ \verb|len| $\leq m$ is the new length of $j$-th column, $m$ is the current number of rows in the problem object. Elements with identical row indices are not allowed. Zero elements are allowed, but they are not stored in the constraint matrix. If the parameter \verb|len| is 0, the parameters \verb|ind| and/or \verb|val| can be specified as \verb|NULL|. \note If the basis factorization exists, changing the column corresponding to a basic structural variable invalidates it. \newpage \subsection{glp\_load\_matrix --- load (replace) the whole constraint matrix} \synopsis \begin{verbatim} void glp_load_matrix(glp_prob *P, int ne, const int ia[], const int ja[], const double ar[]); \end{verbatim} \description The routine \verb|glp_load_matrix| loads the constraint matrix passed in the arrays \verb|ia|, \verb|ja|, and \verb|ar| into the specified problem object. Before loading the current contents of the constraint matrix is destroyed. Constraint coefficients (elements of the constraint matrix) should be specified as triplets (\verb|ia[k]|, \verb|ja[k]|, \verb|ar[k]|) for $k=1,\dots,ne$, where \verb|ia[k]| is the row index, \verb|ja[k]| is the column index, and \verb|ar[k]| is a numeric value of corresponding constraint coefficient. The parameter \verb|ne| specifies the total number of (non-zero) elements in the matrix to be loaded. Coefficients with identical indices are not allowed. Zero coefficients are allowed, however, they are not stored in the constraint matrix. If the parameter \verb|ne| is 0, the parameters \verb|ia|, \verb|ja|, and/or \verb|ar| can be specified as \verb|NULL|. \note If the basis factorization exists, this operation invalidates it. \subsection{glp\_check\_dup --- check for duplicate elements in sparse matrix} \synopsis {\tt int glp\_check\_dup(int m, int n, int ne, const int ia[], const int ja[]);} \description The routine \verb|glp_check_dup checks| for duplicate elements (that is, elements with identical indices) in a sparse matrix specified in the coordinate format. The parameters $m$ and $n$ specifies, respectively, the number of rows and columns in the matrix, $m\geq 0$, $n\geq 0$. The parameter {\it ne} specifies the number of (structurally) non-zero elements in the matrix,\linebreak {\it ne} $\geq 0$. Elements of the matrix are specified as doublets $(ia[k],ja[k])$ for $k=1,\dots,ne$, where $ia[k]$ is a row index, $ja[k]$ is a column index. The routine \verb|glp_check_dup| can be used prior to a call to the routine \verb|glp_load_matrix| to check that the constraint matrix to be loaded has no duplicate elements. \returns \begin{retlist} 0& the matrix representation is correct;\\ $-k$& indices $ia[k]$ or/and $ja[k]$ are out of range;\\ $+k$& element $(ia[k],ja[k])$ is duplicate.\\ \end{retlist} \subsection{glp\_sort\_matrix --- sort elements of the constraint matrix} \synopsis \begin{verbatim} void glp_sort_matrix(glp_prob *P); \end{verbatim} \description The routine \verb|glp_sort_matrix| sorts elements of the constraint matrix by rebuilding its row and column linked lists. On exit from the routine the constraint matrix is not changed, however, elements in the row linked lists become ordered by ascending column indices, and the elements in the column linked lists become ordered by ascending row indices. \subsection{glp\_del\_rows --- delete rows from problem object} \synopsis \begin{verbatim} void glp_del_rows(glp_prob *P, int nrs, const int num[]); \end{verbatim} \description The routine \verb|glp_del_rows| deletes rows from the specified problem object. Ordinal numbers of rows to be deleted should be placed in locations \verb|num[1]|, \dots, \verb|num[nrs]|, where ${\tt nrs}>0$. Note that deleting rows involves changing ordinal numbers of other rows remaining in the problem object. New ordinal numbers of the remaining rows are assigned under the assumption that the original order of rows is not changed. Let, for example, before deletion there be five rows $a$, $b$, $c$, $d$, $e$ with ordinal numbers 1, 2, 3, 4, 5, and let rows $b$ and $d$ have been deleted. Then after deletion the remaining rows $a$, $c$, $e$ are assigned new oridinal numbers 1, 2, 3. If the basis factorization exists, deleting active (binding) rows, i.e. whose auxiliary variables are marked as non-basic, invalidates it. %\newpage \subsection{glp\_del\_cols --- delete columns from problem object} \synopsis \begin{verbatim} void glp_del_cols(glp_prob *P, int ncs, const int num[]); \end{verbatim} \description The routine \verb|glp_del_cols| deletes columns from the specified problem object. Ordinal numbers of columns to be deleted should be placed in locations \verb|num[1]|, \dots, \verb|num[ncs]|, where ${\tt ncs}>0$. Note that deleting columns involves changing ordinal numbers of other columns remaining in\linebreak the problem object. New ordinal numbers of the remaining columns are assigned under the assumption that the original order of columns is not changed. Let, for example, before deletion there be six columns $p$, $q$, $r$, $s$, $t$, $u$ with ordinal numbers 1, 2, 3, 4, 5, 6, and let columns $p$, $q$, $s$ have been deleted. Then after deletion the remaining columns $r$, $t$, $u$ are assigned new ordinal numbers 1, 2, 3. If the basis factorization exists, deleting basic columns invalidates it. \subsection{glp\_copy\_prob --- copy problem object content} \synopsis \begin{verbatim} void glp_copy_prob(glp_prob *dest, glp_prob *prob, int names); \end{verbatim} \description The routine \verb|glp_copy_prob| copies the content of the problem object \verb|prob| to the problem object \verb|dest|. The parameter \verb|names| is a flag. If it is \verb|GLP_ON|, the routine also copies all symbolic names; otherwise, if it is \verb|GLP_OFF|, no symbolic names are copied. \subsection{glp\_erase\_prob --- erase problem object content} \synopsis \begin{verbatim} void glp_erase_prob(glp_prob *P); \end{verbatim} \description The routine \verb|glp_erase_prob| erases the content of the specified problem object. The effect of this operation is the same as if the problem object would be deleted with the routine \verb|glp_delete_prob| and then created anew with the routine \verb|glp_create_prob|, with the only exception that the pointer to the problem object remains valid. %\newpage \subsection{glp\_delete\_prob --- delete problem object} \synopsis \begin{verbatim} void glp_delete_prob(glp_prob *P); \end{verbatim} \description The routine \verb|glp_delete_prob| deletes a problem object, which the parameter \verb|lp| points to, freeing all the memory allocated to this object. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newpage \section{Problem retrieving routines} \subsection{glp\_get\_prob\_name --- retrieve problem name} \synopsis \begin{verbatim} const char *glp_get_prob_name(glp_prob *P); \end{verbatim} \returns The routine \verb|glp_get_prob_name| returns a pointer to an internal buffer, which contains symbolic name of the problem. However, if the problem has no assigned name, the routine returns \verb|NULL|. \subsection{glp\_get\_obj\_name --- retrieve objective function name} \synopsis \begin{verbatim} const char *glp_get_obj_name(glp_prob *P); \end{verbatim} \returns The routine \verb|glp_get_obj_name| returns a pointer to an internal buffer, which contains symbolic name assigned to the objective function. However, if the objective function has no assigned name, the routine returns \verb|NULL|. \subsection{glp\_get\_obj\_dir --- retrieve optimization direction flag} \synopsis \begin{verbatim} int glp_get_obj_dir(glp_prob *P); \end{verbatim} \returns The routine \verb|glp_get_obj_dir| returns the optimization direction flag (i.e. ``sense'' of the objective function): \verb|GLP_MIN| means minimization; \verb|GLP_MAX| means maximization. \subsection{glp\_get\_num\_rows --- retrieve number of rows} \synopsis \begin{verbatim} int glp_get_num_rows(glp_prob *P); \end{verbatim} \returns The routine \verb|glp_get_num_rows| returns the current number of rows in the specified problem object. \newpage \subsection{glp\_get\_num\_cols --- retrieve number of columns} \synopsis \begin{verbatim} int glp_get_num_cols(glp_prob *P); \end{verbatim} \returns The routine \verb|glp_get_num_cols| returns the current number of columns in the specified problem object. \subsection{glp\_get\_row\_name --- retrieve row name} \synopsis \begin{verbatim} const char *glp_get_row_name(glp_prob *P, int i); \end{verbatim} \returns The routine \verb|glp_get_row_name| returns a pointer to an internal buffer, which contains a symbolic name assigned to \verb|i|-th row. However, if the row has no assigned name, the routine returns \verb|NULL|. \subsection{glp\_get\_col\_name --- retrieve column name} \synopsis \begin{verbatim} const char *glp_get_col_name(glp_prob *P, int j); \end{verbatim} \returns The routine \verb|glp_get_col_name| returns a pointer to an internal buffer, which contains a symbolic name assigned to \verb|j|-th column. However, if the column has no assigned name, the routine returns \verb|NULL|. \subsection{glp\_get\_row\_type --- retrieve row type} \synopsis \begin{verbatim} int glp_get_row_type(glp_prob *P, int i); \end{verbatim} \returns The routine \verb|glp_get_row_type| returns the type of \verb|i|-th row, i.e. the type of corresponding auxiliary variable, as follows: \verb|GLP_FR| --- free (unbounded) variable; \verb|GLP_LO| --- variable with lower bound; \verb|GLP_UP| --- variable with upper bound; \verb|GLP_DB| --- double-bounded variable; \verb|GLP_FX| --- fixed variable. \subsection{glp\_get\_row\_lb --- retrieve row lower bound} \synopsis \begin{verbatim} double glp_get_row_lb(glp_prob *P, int i); \end{verbatim} \returns The routine \verb|glp_get_row_lb| returns the lower bound of \verb|i|-th row, i.e. the lower bound of corresponding auxiliary variable. However, if the row has no lower bound, the routine returns \verb|-DBL_MAX|. \vspace*{-4pt} \subsection{glp\_get\_row\_ub --- retrieve row upper bound} \synopsis \begin{verbatim} double glp_get_row_ub(glp_prob *P, int i); \end{verbatim} \returns The routine \verb|glp_get_row_ub| returns the upper bound of \verb|i|-th row, i.e. the upper bound of corresponding auxiliary variable. However, if the row has no upper bound, the routine returns \verb|+DBL_MAX|. \vspace*{-4pt} \subsection{glp\_get\_col\_type --- retrieve column type} \synopsis \begin{verbatim} int glp_get_col_type(glp_prob *P, int j); \end{verbatim} \returns The routine \verb|glp_get_col_type| returns the type of \verb|j|-th column, i.e. the type of corresponding structural variable, as follows: \verb|GLP_FR| --- free (unbounded) variable; \verb|GLP_LO| --- variable with lower bound; \verb|GLP_UP| --- variable with upper bound; \verb|GLP_DB| --- double-bounded variable; \verb|GLP_FX| --- fixed variable. \vspace*{-4pt} \subsection{glp\_get\_col\_lb --- retrieve column lower bound} \synopsis \begin{verbatim} double glp_get_col_lb(glp_prob *P, int j); \end{verbatim} \returns The routine \verb|glp_get_col_lb| returns the lower bound of \verb|j|-th column, i.e. the lower bound of corresponding structural variable. However, if the column has no lower bound, the routine returns \verb|-DBL_MAX|. \subsection{glp\_get\_col\_ub --- retrieve column upper bound} \synopsis \begin{verbatim} double glp_get_col_ub(glp_prob *P, int j); \end{verbatim} \returns The routine \verb|glp_get_col_ub| returns the upper bound of \verb|j|-th column, i.e. the upper bound of corresponding structural variable. However, if the column has no upper bound, the routine returns \verb|+DBL_MAX|. \subsection{glp\_get\_obj\_coef --- retrieve objective coefficient or constant term} \synopsis \begin{verbatim} double glp_get_obj_coef(glp_prob *P, int j); \end{verbatim} \returns The routine \verb|glp_get_obj_coef| returns the objective coefficient at \verb|j|-th structural variable (column). If the parameter \verb|j| is 0, the routine returns the constant term (``shift'') of the objective function. \subsection{glp\_get\_num\_nz --- retrieve number of constraint coefficients} \synopsis \begin{verbatim} int glp_get_num_nz(glp_prob *P); \end{verbatim} \returns The routine \verb|glp_get_num_nz| returns the number of non-zero elements in the constraint matrix of the specified problem object. \subsection{glp\_get\_mat\_row --- retrieve row of the constraint matrix} \synopsis \begin{verbatim} int glp_get_mat_row(glp_prob *P, int i, int ind[], double val[]); \end{verbatim} \description The routine \verb|glp_get_mat_row| scans (non-zero) elements of \verb|i|-th row of the constraint matrix of the specified problem object and stores their column indices and numeric values to locations \verb|ind[1]|, \dots, \verb|ind[len]| and \verb|val[1]|, \dots, \verb|val[len]|, respectively, where $0\leq{\tt len}\leq n$ is the number of elements in $i$-th row, $n$ is the number of columns. The parameter \verb|ind| and/or \verb|val| can be specified as \verb|NULL|, in which case corresponding information is not stored. %\newpage \returns The routine \verb|glp_get_mat_row| returns the length \verb|len|, i.e. the number of (non-zero) elements in \verb|i|-th row. \subsection{glp\_get\_mat\_col --- retrieve column of the constraint matrix} \synopsis \begin{verbatim} int glp_get_mat_col(glp_prob *P, int j, int ind[], double val[]); \end{verbatim} \description The routine \verb|glp_get_mat_col| scans (non-zero) elements of \verb|j|-th column of the constraint matrix of the specified problem object and stores their row indices and numeric values to locations \linebreak \verb|ind[1]|, \dots, \verb|ind[len]| and \verb|val[1]|, \dots, \verb|val[len]|, respectively, where $0\leq{\tt len}\leq m$ is the number of elements in $j$-th column, $m$ is the number of rows. The parameter \verb|ind| and/or \verb|val| can be specified as \verb|NULL|, in which case corresponding information is not stored. \returns The routine \verb|glp_get_mat_col| returns the length \verb|len|, i.e. the number of (non-zero) elements in \verb|j|-th column. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newpage \section{Row and column searching routines} Sometimes it may be necessary to find rows and/or columns by their names (assigned with the routines \verb|glp_set_row_name| and \verb|glp_set_col_name|). Though a particular row/column can be found by its name using simple enumeration of all rows/columns, in case of large instances such a {\it linear} search may take too long time. To significantly reduce the search time the application program may create the row/column name index, which is an auxiliary data structure implementing a {\it binary} search. Even in worst cases the search takes logarithmic time, i.e. the time needed to find a particular row (or column) by its name is $O(\log_2m)$ (or $O(\log_2n)$), where $m$ and $n$ are, resp., the number of rows and columns in the problem object. It is important to note that: \Item{1.}On creating the problem object with the routine \verb|glp_create_prob| the name index is {\it not} created. \Item{2.}The name index can be created (destroyed) at any time with the routine \verb|glp_create_index| (\verb|glp_delete_index|). Having been created the name index becomes part of the corresponding problem object. \Item{3.}The time taken to create the name index is $O[(m+n)\log_2(m+n)]$, so it is recommended to create the index only once, for example, just after the problem object was created. \Item{4.}If the name index exists, it is automatically updated every time the name of a row/column is assigned/changed. The update operation takes logarithmic time. \Item{5.}If the name index does not exist, the application should not call the routines \verb|glp_find_row| and \verb|glp_find_col|. Otherwise, an error message will be issued and abnormal program termination will occur. \Item{6.}On destroying the problem object with the routine \verb|glp_delete_prob|, the name index, if exists, is automatically destroyed. \subsection{glp\_create\_index --- create the name index} \synopsis \begin{verbatim} void glp_create_index(glp_prob *P); \end{verbatim} \description The routine \verb|glp_create_index| creates the name index for the specified problem object. The name index is an auxiliary data structure, which is intended to quickly (i.e. for logarithmic time) find rows and columns by their names. This routine can be called at any time. If the name index already exists, the routine does nothing. \newpage \subsection{glp\_find\_row --- find row by its name} \synopsis \begin{verbatim} int glp_find_row(glp_prob *P, const char *name); \end{verbatim} \returns The routine \verb|glp_find_row| returns the ordinal number of a row, which is assigned the specified symbolic \verb|name|. If no such row exists, the routine returns 0. \subsection{glp\_find\_col --- find column by its name} \synopsis \begin{verbatim} int glp_find_col(glp_prob *P, const char *name); \end{verbatim} \returns The routine \verb|glp_find_col| returns the ordinal number of a column, which is assigned the specified symbolic \verb|name|. If no such column exists, the routine returns 0. \subsection{glp\_delete\_index --- delete the name index} \synopsis \begin{verbatim} void glp_delete_index(glp_prob *P); \end{verbatim} \description The routine \verb|glp_delete_index| deletes the name index previously created by the routine\linebreak \verb|glp_create_index| and frees the memory allocated to this auxiliary data structure. This routine can be called at any time. If the name index does not exist, the routine does nothing. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newpage \section{Problem scaling routines} \subsection{Background} In GLPK the {\it scaling} means a linear transformation applied to the constraint matrix to improve its numerical properties.\footnote{In many cases a proper scaling allows making the constraint matrix to be better conditioned, i.e. decreasing its condition number, that makes computations numerically more stable.} The main equality is the following: $$\widetilde{A}=RAS,\eqno(2.1)$$ where $A=(a_{ij})$ is the original constraint matrix, $R=(r_{ii})>0$ is a diagonal matrix used to scale rows (constraints), $S=(s_{jj})>0$ is a diagonal matrix used to scale columns (variables), $\widetilde{A}$ is the scaled constraint matrix. From (2.1) it follows that in the {\it scaled} problem instance each original constraint coefficient $a_{ij}$ is replaced by corresponding scaled constraint coefficient: $$\widetilde{a}_{ij}=r_{ii}a_{ij}s_{jj}.\eqno(2.2)$$ Note that the scaling is performed internally and therefore transparently to the user. This means that on API level the user always deal with unscaled data. Scale factors $r_{ii}$ and $s_{jj}$ can be set or changed at any time either directly by the application program in a problem specific way (with the routines \verb|glp_set_rii| and \verb|glp_set_sjj|), or by some API routines intended for automatic scaling. \subsection{glp\_set\_rii --- set (change) row scale factor} \synopsis \begin{verbatim} void glp_set_rii(glp_prob *P, int i, double rii); \end{verbatim} \description The routine \verb|glp_set_rii| sets (changes) the scale factor $r_{ii}$ for $i$-th row of the specified problem object. \subsection{glp\_set\_sjj --- set (change) column scale factor} \synopsis \begin{verbatim} void glp_set_sjj(glp_prob *P, int j, double sjj); \end{verbatim} \description The routine \verb|glp_set_sjj| sets (changes) the scale factor $s_{jj}$ for $j$-th column of the specified problem object. \newpage \subsection{glp\_get\_rii --- retrieve row scale factor} \synopsis \begin{verbatim} double glp_get_rii(glp_prob *P, int i); \end{verbatim} \returns The routine \verb|glp_get_rii| returns current scale factor $r_{ii}$ for $i$-th row of the specified problem object. \vspace*{-6pt} \subsection{glp\_get\_sjj --- retrieve column scale factor} \vspace*{-4pt} \synopsis \begin{verbatim} double glp_get_sjj(glp_prob *P, int j); \end{verbatim} \returns The routine \verb|glp_get_sjj| returns current scale factor $s_{jj}$ for $j$-th column of the specified problem object. \vspace*{-6pt} \subsection{glp\_scale\_prob --- scale problem data} \vspace*{-4pt} \synopsis \begin{verbatim} void glp_scale_prob(glp_prob *P, int flags); \end{verbatim} \description The routine \verb|glp_scale_prob| performs automatic scaling of problem data for the specified problem object. The parameter \verb|flags| specifies scaling options used by the routine. The options can be combined with the bitwise OR operator and may be the following: \verb|GLP_SF_GM | --- perform geometric mean scaling; \verb|GLP_SF_EQ | --- perform equilibration scaling; \verb|GLP_SF_2N | --- round scale factors to nearest power of two; \verb|GLP_SF_SKIP| --- skip scaling, if the problem is well scaled. The parameter \verb|flags| may be also specified as \verb|GLP_SF_AUTO|, in which case the routine chooses the scaling options automatically. \vspace*{-6pt} \subsection{glp\_unscale\_prob --- unscale problem data} \vspace*{-4pt} \synopsis \begin{verbatim} void glp_unscale_prob(glp_prob *P); \end{verbatim} The routine \verb|glp_unscale_prob| performs unscaling of problem data for the specified problem object. ``Unscaling'' means replacing the current scaling matrices $R$ and $S$ by unity matrices that cancels the scaling effect. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newpage \section{LP basis constructing routines} \subsection{Background} To start the search the simplex method needs a valid initial basis. In GLPK the basis is completely defined by a set of {\it statuses} assigned to {\it all} (auxiliary and structural) variables, where the status may be one of the following: \verb|GLP_BS| --- basic variable; \verb|GLP_NL| --- non-basic variable having active lower bound; \verb|GLP_NU| --- non-basic variable having active upper bound; \verb|GLP_NF| --- non-basic free variable; \verb|GLP_NS| --- non-basic fixed variable. The basis is {\it valid}, if the basis matrix, which is a matrix built of columns of the augmented constraint matrix $(I\:|-A)$ corresponding to basic variables, is non-singular. This, in particular, means that the number of basic variables must be the same as the number of rows in the problem object. (For more details see Section \ref{lpbasis}, page \pageref{lpbasis}.) Any initial basis may be constructed (or restored) with the API routines \verb|glp_set_row_stat| and \verb|glp_set_col_stat| by assigning appropriate statuses to auxiliary and structural variables. Another way to construct an initial basis is to use API routines like \verb|glp_adv_basis|, which implement so called {\it crashing}.\footnote{This term is from early linear programming systems and means a heuristic to construct a valid initial basis.} Note that on normal exit the simplex solver remains the basis valid, so in case of re-optimization there is no need to construct an initial basis from scratch. \subsection{glp\_set\_row\_stat --- set (change) row status} \synopsis \begin{verbatim} void glp_set_row_stat(glp_prob *P, int i, int stat); \end{verbatim} \description The routine \verb|glp_set_row_stat| sets (changes) the current status of \verb|i|-th row (auxiliary variable) as specified by the parameter \verb|stat|: \verb|GLP_BS| --- make the row basic (make the constraint inactive); \verb|GLP_NL| --- make the row non-basic (make the constraint active); \verb|GLP_NU| --- make the row non-basic and set it to the upper bound; if the row is not double-bounded, this status is equivalent to \verb|GLP_NL| (only in case of this routine); \verb|GLP_NF| --- the same as \verb|GLP_NL| (only in case of this routine); \verb|GLP_NS| --- the same as \verb|GLP_NL| (only in case of this routine). \newpage \subsection{glp\_set\_col\_stat --- set (change) column status} \synopsis \begin{verbatim} void glp_set_col_stat(glp_prob *P, int j, int stat); \end{verbatim} \description The routine \verb|glp_set_col_stat sets| (changes) the current status of \verb|j|-th column (structural variable) as specified by the parameter \verb|stat|: \verb|GLP_BS| --- make the column basic; \verb|GLP_NL| --- make the column non-basic; \verb|GLP_NU| --- make the column non-basic and set it to the upper bound; if the column is not double-bounded, this status is equivalent to \verb|GLP_NL| (only in case of this routine); \verb|GLP_NF| --- the same as \verb|GLP_NL| (only in case of this routine); \verb|GLP_NS| --- the same as \verb|GLP_NL| (only in case of this routine). \subsection{glp\_std\_basis --- construct standard initial LP basis} \synopsis \begin{verbatim} void glp_std_basis(glp_prob *P); \end{verbatim} \description The routine \verb|glp_std_basis| constructs the ``standard'' (trivial) initial LP basis for the specified problem object. In the ``standard'' LP basis all auxiliary variables (rows) are basic, and all structural variables (columns) are non-basic (so the corresponding basis matrix is unity). \subsection{glp\_adv\_basis --- construct advanced initial LP basis} \synopsis \begin{verbatim} void glp_adv_basis(glp_prob *P, int flags); \end{verbatim} \description The routine \verb|glp_adv_basis| constructs an advanced initial LP basis for the specified problem object. The parameter \verb|flags| is reserved for use in the future and must be specified as zero. In order to construct the advanced initial LP basis the routine does the following: 1) includes in the basis all non-fixed auxiliary variables; 2) includes in the basis as many non-fixed structural variables as possible keeping the triangular form of the basis matrix; 3) includes in the basis appropriate (fixed) auxiliary variables to complete the basis. As a result the initial LP basis has as few fixed variables as possible and the corresponding basis matrix is triangular. \subsection{glp\_cpx\_basis --- construct Bixby's initial LP basis} \synopsis \begin{verbatim} void glp_cpx_basis(glp_prob *P); \end{verbatim} \description The routine \verb|glp_cpx_basis| constructs an initial basis for the specified problem object with the algorithm proposed by R.~Bixby.\footnote{Robert E. Bixby, ``Implementing the Simplex Method: The Initial Basis.'' ORSA Journal on Computing, Vol. 4, No. 3, 1992, pp. 267-84.} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newpage \section{Simplex method routines} The {\it simplex method} is a well known efficient numerical procedure to solve LP problems. On each iteration the simplex method transforms the original system of equaility constraints (1.2) resolving them through different sets of variables to an equivalent system called {\it the simplex table} (or sometimes {\it the simplex tableau}), which has the following form: $$ \begin{array}{r@{\:}c@{\:}r@{\:}c@{\:}r@{\:}c@{\:}r} z&=&d_1(x_N)_1&+&d_2(x_N)_2&+ \dots +&d_n(x_N)_n \\ (x_B)_1&=&\xi_{11}(x_N)_1& +& \xi_{12}(x_N)_2& + \dots +& \xi_{1n}(x_N)_n \\ (x_B)_2&=& \xi_{21}(x_N)_1& +& \xi_{22}(x_N)_2& + \dots +& \xi_{2n}(x_N)_n \\ \multicolumn{7}{c} {.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .} \\ (x_B)_m&=&\xi_{m1}(x_N)_1& +& \xi_{m2}(x_N)_2& + \dots +& \xi_{mn}(x_N)_n \\ \end{array} \eqno (2.3) $$ where: $(x_B)_1, (x_B)_2, \dots, (x_B)_m$ are basic variables; $(x_N)_1, (x_N)_2, \dots, (x_N)_n$ are non-basic variables; $d_1, d_2, \dots, d_n$ are reduced costs; $\xi_{11}, \xi_{12}, \dots, \xi_{mn}$ are coefficients of the simplex table. (May note that the original LP problem (1.1)---(1.3) also has the form of a simplex table, where all equalities are resolved through auxiliary variables.) From the linear programming theory it is known that if an optimal solution of the LP problem (1.1)---(1.3) exists, it can always be written in the form (2.3), where non-basic variables are set on their bounds while values of the objective function and basic variables are determined by the corresponding equalities of the simplex table. A set of values of all basic and non-basic variables determined by the simplex table is called {\it basic solution}. If all basic variables are within their bounds, the basic solution is called {\it (primal) feasible}, otherwise it is called {\it (primal) infeasible}. A feasible basic solution, which provides a smallest (in case of minimization) or a largest (in case of maximization) value of the objective function is called {\it optimal}. Therefore, for solving LP problem the simplex method tries to find its optimal basic solution. Primal feasibility of some basic solution may be stated by simple checking if all basic variables are within their bounds. Basic solution is optimal if additionally the following optimality conditions are satisfied for all non-basic variables: \begin{center} \begin{tabular}{lcc} Status of $(x_N)_j$ & Minimization & Maximization \\ \hline $(x_N)_j$ is free & $d_j = 0$ & $d_j = 0$ \\ $(x_N)_j$ is on its lower bound & $d_j \geq 0$ & $d_j \leq 0$ \\ $(x_N)_j$ is on its upper bound & $d_j \leq 0$ & $d_j \geq 0$ \\ \end{tabular} \end{center} In other words, basic solution is optimal if there is no non-basic variable, which changing in the feasible direction (i.e. increasing if it is free or on its lower bound, or decreasing if it is free or on its upper bound) can improve (i.e. decrease in case of minimization or increase in case of maximization) the objective function. If all non-basic variables satisfy to the optimality conditions shown above (independently on whether basic variables are within their bounds or not), the basic solution is called {\it dual feasible}, otherwise it is called {\it dual infeasible}. It may happen that some LP problem has no primal feasible solution due to incorrect\linebreak formulation --- this means that its constraints conflict with each other. It also may happen that some LP problem has unbounded solution again due to incorrect formulation --- this means that some non-basic variable can improve the objective function, i.e. the optimality conditions are violated, and at the same time this variable can infinitely change in the feasible direction meeting no resistance from basic variables. (May note that in the latter case the LP problem has no dual feasible solution.) \subsection{glp\_simplex --- solve LP problem with the primal or dual simplex method} \synopsis \begin{verbatim} int glp_simplex(glp_prob *P, const glp_smcp *parm); \end{verbatim} \description The routine \verb|glp_simplex| is a driver to the LP solver based on the simplex method. This routine retrieves problem data from the specified problem object, calls the solver to solve the problem instance, and stores results of computations back into the problem object. The simplex solver has a set of control parameters. Values of the control parameters can be passed in the structure \verb|glp_smcp|, which the parameter \verb|parm| points to. For detailed description of this structure see paragraph ``Control parameters'' below. Before specifying some control parameters the application program should initialize the structure \verb|glp_smcp| by default values of all control parameters using the routine \verb|glp_init_smcp| (see the next subsection). This is needed for backward compatibility, because in the future there may appear new members in the structure \verb|glp_smcp|. The parameter \verb|parm| can be specified as \verb|NULL|, in which case the solver uses default settings. \returns \begin{retlist} 0 & The LP problem instance has been successfully solved. (This code does {\it not} necessarily mean that the solver has found optimal solution. It only means that the solution process was successful.) \\ \verb|GLP_EBADB| & Unable to start the search, because the initial basis specified in the problem object is invalid---the number of basic (auxiliary and structural) variables is not the same as the number of rows in the problem object.\\ \verb|GLP_ESING| & Unable to start the search, because the basis matrix corresponding to the initial basis is singular within the working precision.\\ \verb|GLP_ECOND| & Unable to start the search, because the basis matrix corresponding to the initial basis is ill-conditioned, i.e. its condition number is too large.\\ \verb|GLP_EBOUND| & Unable to start the search, because some double-bounded (auxiliary or structural) variables have incorrect bounds.\\ \verb|GLP_EFAIL| & The search was prematurely terminated due to the solver failure.\\ \verb|GLP_EOBJLL| & The search was prematurely terminated, because the objective function being maximized has reached its lower limit and continues decreasing (the dual simplex only).\\ \verb|GLP_EOBJUL| & The search was prematurely terminated, because the objective function being minimized has reached its upper limit and continues increasing (the dual simplex only).\\ \verb|GLP_EITLIM| & The search was prematurely terminated, because the simplex iteration limit has been exceeded.\\ \verb|GLP_ETMLIM| & The search was prematurely terminated, because the time limit has been exceeded.\\ \end{retlist} \begin{retlist} \verb|GLP_ENOPFS| & The LP problem instance has no primal feasible solution (only if the LP presolver is used).\\ \verb|GLP_ENODFS| & The LP problem instance has no dual feasible solution (only if the LP presolver is used).\\ \end{retlist} \para{Built-in LP presolver} The simplex solver has {\it built-in LP presolver}. It is a subprogram that transforms the original LP problem specified in the problem object to an equivalent LP problem, which may be easier for solving with the simplex method than the original one. This is attained mainly due to reducing the problem size and improving its numeric properties (for example, by removing some inactive constraints or by fixing some non-basic variables). Once the transformed LP problem has been solved, the presolver transforms its basic solution back to the corresponding basic solution of the original problem. Presolving is an optional feature of the routine \verb|glp_simplex|, and by default it is disabled. In order to enable the LP presolver the control parameter \verb|presolve| should be set to \verb|GLP_ON| (see paragraph ``Control parameters'' below). Presolving may be used when the problem instance is solved for the first time. However, on performing re-optimization the presolver should be disabled. The presolving procedure is transparent to the API user in the sense that all necessary processing is performed internally, and a basic solution of the original problem recovered by the presolver is the same as if it were computed directly, i.e. without presolving. Note that the presolver is able to recover only optimal solutions. If a computed solution is infeasible or non-optimal, the corresponding solution of the original problem cannot be recovered and therefore remains undefined. If you need to know a basic solution even if it is infeasible or non-optimal, the presolver should be disabled. \para{Terminal output} Solving large problem instances may take a long time, so the solver reports some information about the current basic solution, which is sent to the terminal. This information has the following format: \begin{verbatim} nnn: obj = xxx infeas = yyy (num) cnt \end{verbatim} \noindent where: `\verb|nnn|' is the iteration number, `\verb|xxx|' is the current value of the objective function (it is unscaled and has correct sign); `\verb|yyy|' is the current sum of primal or dual infeasibilities (it is scaled and therefore may be used only for visual estimating), `\verb|num|' is the current number of primal or dual infeasibilities (phase I) or non-optimalities (phase II), `\verb|cnt|' is the number of basis factorizations since the last terminal output. The symbol preceding the iteration number indicates which phase of the simplex method is in effect: {\it Blank} means that the solver is searching for primal feasible solution using the primal simplex or for dual feasible solution using the dual simplex; {\it Asterisk} (\verb|*|) means that the solver is searching for optimal solution using the primal simplex; {\it Hash} (\verb|#|) means that the solver is searching for optimal solution using the dual simplex. \newpage \para{Control parameters} This paragraph describes all control parameters currently used in the simplex solver. Symbolic names of control parameters are names of corresponding members in the structure \verb|glp_smcp|. \bigskip {\tt int msg\_lev} (default: {\tt GLP\_MSG\_ALL}) Message level for terminal output: \verb|GLP_MSG_OFF| --- no output; \verb|GLP_MSG_ERR| --- error and warning messages only; \verb|GLP_MSG_ON | --- normal output; \verb|GLP_MSG_ALL| --- full output (including informational messages). \bigskip {\tt int meth} (default: {\tt GLP\_PRIMAL}) Simplex method option: \verb|GLP_PRIMAL| --- use two-phase primal simplex; \verb|GLP_DUAL | --- use two-phase dual simplex; \verb|GLP_DUALP | --- use two-phase dual simplex, and if it fails, switch to the primal simplex. \bigskip {\tt int pricing} (default: {\tt GLP\_PT\_PSE}) Pricing technique: \verb|GLP_PT_STD| --- standard (``textbook''); \verb|GLP_PT_PSE| --- projected steepest edge. \bigskip {\tt int r\_test} (default: {\tt GLP\_RT\_HAR}) Ratio test technique: \verb|GLP_RT_STD| --- standard (``textbook''); \verb|GLP_RT_HAR| --- Harris' two-pass ratio test. \bigskip {\tt double tol\_bnd} (default: {\tt 1e-7}) Tolerance used to check if the basic solution is primal feasible. (Do not change this parameter without detailed understanding its purpose.) %\newpage \bigskip {\tt double tol\_dj} (default: {\tt 1e-7}) Tolerance used to check if the basic solution is dual feasible. (Do not change this parameter without detailed understanding its purpose.) \bigskip {\tt double tol\_piv} (default: {\tt 1e-9}) Tolerance used to choose eligble pivotal elements of the simplex table. (Do not change this parameter without detailed understanding its purpose.) %\bigskip \newpage {\tt double obj\_ll} (default: {\tt -DBL\_MAX}) Lower limit of the objective function. If the objective function reaches this limit and continues decreasing, the solver terminates the search. (Used in the dual simplex only.) \bigskip {\tt double obj\_ul} (default: {\tt +DBL\_MAX}) Upper limit of the objective function. If the objective function reaches this limit and continues increasing, the solver terminates the search. (Used in the dual simplex only.) \bigskip {\tt int it\_lim} (default: {\tt INT\_MAX}) Simplex iteration limit. \bigskip {\tt int tm\_lim} (default: {\tt INT\_MAX}) Searching time limit, in milliseconds. \bigskip {\tt int out\_frq} (default: {\tt 500}) Output frequency, in iterations. This parameter specifies how frequently the solver sends information about the solution process to the terminal. \bigskip {\tt int out\_dly} (default: {\tt 0}) Output delay, in milliseconds. This parameter specifies how long the solver should delay sending information about the solution process to the terminal. \bigskip {\tt int presolve} (default: {\tt GLP\_OFF}) LP presolver option: \verb|GLP_ON | --- enable using the LP presolver; \verb|GLP_OFF| --- disable using the LP presolver. \newpage \para{Example 1} The following example main program reads LP problem instance in fixed MPS format from file \verb|25fv47.mps|,\footnote{This instance in fixed MPS format can be found in the Netlib LP collection; see {\tt ftp://ftp.netlib.org/lp/data/}.} constructs an advanced initial basis, solves the instance with the primal simplex method (by default), and writes the solution to file \verb|25fv47.txt|. \begin{footnotesize} \begin{verbatim} /* spxsamp1.c */ #include #include #include int main(void) { glp_prob *P; P = glp_create_prob(); glp_read_mps(P, GLP_MPS_DECK, NULL, "25fv47.mps"); glp_adv_basis(P, 0); glp_simplex(P, NULL); glp_print_sol(P, "25fv47.txt"); glp_delete_prob(P); return 0; } /* eof */ \end{verbatim} \end{footnotesize} Below here is shown the terminal output from this example program. \begin{footnotesize} \begin{verbatim} Reading problem data from '25fv47.mps'... Problem: 25FV47 Objective: R0000 822 rows, 1571 columns, 11127 non-zeros 6919 records were read One free row was removed Constructing initial basis... Size of triangular part is 812 GLPK Simplex Optimizer, v4.57 821 rows, 1571 columns, 10400 non-zeros 0: obj = 7.131703290e+03 inf = 2.145e+05 (204) 500: obj = 1.886711682e+04 inf = 8.273e+02 (36) 4 741: obj = 1.846047936e+04 inf = 5.575e-14 (0) 2 * 1000: obj = 9.220063473e+03 inf = 2.423e-14 (432) 2 * 1500: obj = 6.187659664e+03 inf = 1.019e-13 (368) 4 * 2000: obj = 5.503442062e+03 inf = 0.000e+00 (33) 5 * 2052: obj = 5.501845888e+03 inf = 0.000e+00 (0) OPTIMAL LP SOLUTION FOUND Writing basic solution to '25fv47.txt'... \end{verbatim} \end{footnotesize} \newpage \para{Example 2} The following example main program solves the same LP problem instance as in Example 1 above, however, it uses the dual simplex method, which starts from the standard initial basis. \begin{footnotesize} \begin{verbatim} /* spxsamp2.c */ #include #include #include int main(void) { glp_prob *P; glp_smcp parm; P = glp_create_prob(); glp_read_mps(P, GLP_MPS_DECK, NULL, "25fv47.mps"); glp_init_smcp(&parm); parm.meth = GLP_DUAL; glp_simplex(P, &parm); glp_print_sol(P, "25fv47.txt"); glp_delete_prob(P); return 0; } /* eof */ \end{verbatim} \end{footnotesize} Below here is shown the terminal output from this example program. \begin{footnotesize} \begin{verbatim} Reading problem data from '25fv47.mps'... Problem: 25FV47 Objective: R0000 822 rows, 1571 columns, 11127 non-zeros 6919 records were read One free row was removed GLPK Simplex Optimizer, v4.57 821 rows, 1571 columns, 10400 non-zeros 0: inf = 1.223e+02 (41) 258: inf = 3.091e-16 (0) 2 # 500: obj = -5.071287080e+03 inf = 2.947e-15 (292) 2 # 1000: obj = -1.352843873e+03 inf = 8.452e-15 (302) 5 # 1500: obj = 7.985859737e+02 inf = 1.127e-14 (263) 5 # 2000: obj = 3.059023029e+03 inf = 6.290e-11 (197) 4 # 2500: obj = 5.354770966e+03 inf = 7.172e-13 (130) 5 # 2673: obj = 5.501845888e+03 inf = 3.802e-16 (0) 2 OPTIMAL LP SOLUTION FOUND Writing basic solution to '25fv47.txt'... \end{verbatim} \end{footnotesize} \newpage \subsection{glp\_exact --- solve LP problem in exact arithmetic} \synopsis \begin{verbatim} int glp_exact(glp_prob *P, const glp_smcp *parm); \end{verbatim} \description The routine \verb|glp_exact| is a tentative implementation of the primal two-phase simplex method based on exact (rational) arithmetic. It is similar to the routine \verb|glp_simplex|, however, for all internal computations it uses arithmetic of rational numbers, which is exact in mathematical sense, i.e. free of round-off errors unlike floating-point arithmetic. Note that the routine \verb|glp_exact| uses only three control parameters passed in the structure \verb|glp_smcp|, namely, \verb|msg_lev|, \verb|it_lim|, and \verb|tm_lim|. \returns \begin{retlist} 0 & The LP problem instance has been successfully solved. (This code does {\it not} necessarily mean that the solver has found optimal solution. It only means that the solution process was successful.) \\ \verb|GLP_EBADB| & Unable to start the search, because the initial basis specified in the problem object is invalid---the number of basic (auxiliary and structural) variables is not the same as the number of rows in the problem object.\\ \verb|GLP_ESING| & Unable to start the search, because the basis matrix corresponding to the initial basis is exactly singular.\\ \verb|GLP_EBOUND| & Unable to start the search, because some double-bounded (auxiliary or structural) variables have incorrect bounds.\\ \verb|GLP_EFAIL| & The problem instance has no rows/columns.\\ \verb|GLP_EITLIM| & The search was prematurely terminated, because the simplex iteration limit has been exceeded.\\ \verb|GLP_ETMLIM| & The search was prematurely terminated, because the time limit has been exceeded.\\ \end{retlist} \para{Note} Computations in exact arithmetic are very time-consuming, so solving LP problem with the routine \verb|glp_exact| from the very beginning is not a good idea. It is much better at first to find an optimal basis with the routine \verb|glp_simplex| and only then to call \verb|glp_exact|, in which case only a few simplex iterations need to be performed in exact arithmetic. \newpage \subsection{glp\_init\_smcp --- initialize simplex solver control parameters} \synopsis \begin{verbatim} int glp_init_smcp(glp_smcp *parm); \end{verbatim} \description The routine \verb|glp_init_smcp| initializes control parameters, which are used by the simplex solver, with default values. Default values of the control parameters are stored in a \verb|glp_smcp| structure, which the parameter \verb|parm| points to. \subsection{glp\_get\_status --- determine generic status of basic solution} \synopsis \begin{verbatim} int glp_get_status(glp_prob *P); \end{verbatim} \returns The routine \verb|glp_get_status| reports the generic status of the current basic solution for the specified problem object as follows: \verb|GLP_OPT | --- solution is optimal; \verb|GLP_FEAS | --- solution is feasible; \verb|GLP_INFEAS| --- solution is infeasible; \verb|GLP_NOFEAS| --- problem has no feasible solution; \verb|GLP_UNBND | --- problem has unbounded solution; \verb|GLP_UNDEF | --- solution is undefined. More detailed information about the status of basic solution can be retrieved with the routines \verb|glp_get_prim_stat| and \verb|glp_get_dual_stat|. \subsection{glp\_get\_prim\_stat --- retrieve status of primal basic solution} \synopsis \begin{verbatim} int glp_get_prim_stat(glp_prob *P); \end{verbatim} \returns The routine \verb|glp_get_prim_stat| reports the status of the primal basic solution for the specified problem object as follows: \verb|GLP_UNDEF | --- primal solution is undefined; \verb|GLP_FEAS | --- primal solution is feasible; \verb|GLP_INFEAS| --- primal solution is infeasible; \verb|GLP_NOFEAS| --- no primal feasible solution exists. \subsection{glp\_get\_dual\_stat --- retrieve status of dual basic solution} \synopsis \begin{verbatim} int glp_get_dual_stat(glp_prob *P); \end{verbatim} \returns The routine \verb|glp_get_dual_stat| reports the status of the dual basic solution for the specified problem object as follows: \verb|GLP_UNDEF | --- dual solution is undefined; \verb|GLP_FEAS | --- dual solution is feasible; \verb|GLP_INFEAS| --- dual solution is infeasible; \verb|GLP_NOFEAS| --- no dual feasible solution exists. \subsection{glp\_get\_obj\_val --- retrieve objective value} \synopsis \begin{verbatim} double glp_get_obj_val(glp_prob *P); \end{verbatim} \returns The routine \verb|glp_get_obj_val| returns current value of the objective function. \subsection{glp\_get\_row\_stat --- retrieve row status} \synopsis \begin{verbatim} int glp_get_row_stat(glp_prob *P, int i); \end{verbatim} \returns The routine \verb|glp_get_row_stat| returns current status assigned to the auxiliary variable associated with \verb|i|-th row as follows: \verb|GLP_BS| --- basic variable; \verb|GLP_NL| --- non-basic variable on its lower bound; \verb|GLP_NU| --- non-basic variable on its upper bound; \verb|GLP_NF| --- non-basic free (unbounded) variable; \verb|GLP_NS| --- non-basic fixed variable. %\newpage \subsection{glp\_get\_row\_prim --- retrieve row primal value} \synopsis \begin{verbatim} double glp_get_row_prim(glp_prob *P, int i); \end{verbatim} \returns The routine \verb|glp_get_row_prim| returns primal value of the auxiliary variable associated with \verb|i|-th row. \subsection{glp\_get\_row\_dual --- retrieve row dual value} \synopsis \begin{verbatim} double glp_get_row_dual(glp_prob *P, int i); \end{verbatim} \returns The routine \verb|glp_get_row_dual| returns dual value (i.e. reduced cost) of the auxiliary variable associated with \verb|i|-th row. \subsection{glp\_get\_col\_stat --- retrieve column status} \synopsis \begin{verbatim} int glp_get_col_stat(glp_prob *P, int j); \end{verbatim} \returns The routine \verb|glp_get_col_stat| returns current status assigned to the structural variable associated with \verb|j|-th column as follows: \verb|GLP_BS| --- basic variable; \verb|GLP_NL| --- non-basic variable on its lower bound; \verb|GLP_NU| --- non-basic variable on its upper bound; \verb|GLP_NF| --- non-basic free (unbounded) variable; \verb|GLP_NS| --- non-basic fixed variable. \subsection{glp\_get\_col\_prim --- retrieve column primal value} \synopsis \begin{verbatim} double glp_get_col_prim(glp_prob *P, int j); \end{verbatim} \returns The routine \verb|glp_get_col_prim| returns primal value of the structural variable associated with \verb|j|-th column. %\newpage \subsection{glp\_get\_col\_dual --- retrieve column dual value} \synopsis \begin{verbatim} double glp_get_col_dual(glp_prob *P, int j); \end{verbatim} \returns The routine \verb|glp_get_col_dual| returns dual value (i.e. reduced cost) of the structural variable associated with \verb|j|-th column. \newpage \subsection{glp\_get\_unbnd\_ray --- determine variable causing unboundedness} \synopsis \begin{verbatim} int glp_get_unbnd_ray(glp_prob *P); \end{verbatim} \returns The routine \verb|glp_get_unbnd_ray| returns the number $k$ of a variable, which causes primal or dual unboundedness. If $1\leq k\leq m$, it is $k$-th auxiliary variable, and if $m+1\leq k\leq m+n$, it is $(k-m)$-th structural variable, where $m$ is the number of rows, $n$ is the number of columns in the problem object. If such variable is not defined, the routine returns 0. \para{Note} If it is not exactly known which version of the simplex solver detected unboundedness, i.e. whether the unboundedness is primal or dual, it is sufficient to check the status of the variable with the routine \verb|glp_get_row_stat| or \verb|glp_get_col_stat|. If the variable is non-basic, the unboundedness is primal, otherwise, if the variable is basic, the unboundedness is dual (the latter case means that the problem has no primal feasible dolution). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newpage \section{Interior-point method routines} {\it Interior-point methods} (also known as {\it barrier methods}) are more modern and powerful numerical methods for large-scale linear programming. Such methods are especially efficient for very sparse LP problems and allow solving such problems much faster than the simplex method. In brief, the GLPK interior-point solver works as follows. At first, the solver transforms the original LP to a {\it working} LP in the standard format: \medskip \noindent \hspace{.5in} minimize $$z = c_1x_{m+1} + c_2x_{m+2} + \dots + c_nx_{m+n} + c_0 \eqno (2.4)$$ \hspace{.5in} subject to linear constraints $$ \begin{array}{r@{\:}c@{\:}r@{\:}c@{\:}r@{\:}c@{\:}l} a_{11}x_{m+1}&+&a_{12}x_{m+2}&+ \dots +&a_{1n}x_{m+n}&=&b_1 \\ a_{21}x_{m+1}&+&a_{22}x_{m+2}&+ \dots +&a_{2n}x_{m+n}&=&b_2 \\ \multicolumn{7}{c} {.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .} \\ a_{m1}x_{m+1}&+&a_{m2}x_{m+2}&+ \dots +&a_{mn}x_{m+n}&=&b_m \\ \end{array} \eqno (2.5) $$ \hspace{.5in} and non-negative variables $$x_1\geq 0,\ \ x_2\geq 0,\ \ \dots,\ \ x_n\geq 0 \eqno(2.6)$$ where: $z$ is the objective function; $x_1$, \dots, $x_n$ are variables; $c_1$, \dots, $c_n$ are objective coefficients; $c_0$ is a constant term of the objective function; $a_{11}$, \dots, $a_{mn}$ are constraint coefficients; $b_1$, \dots, $b_m$ are right-hand sides. Using vector and matrix notations the working LP (2.4)---(2.6) can be written as follows: $$z=c^Tx+c_0\ \rightarrow\ \min,\eqno(2.7)$$ $$Ax=b,\eqno(2.8)$$ $$x\geq 0,\eqno(2.9)$$ where: $x=(x_j)$ is $n$-vector of variables, $c=(c_j)$ is $n$-vector of objective coefficients, $A=(a_{ij})$ is $m\times n$-matrix of constraint coefficients, and $b=(b_i)$ is $m$-vector of right-hand sides. Karush--Kuhn--Tucker optimality conditions for LP (2.7)---(2.9) are the following: $$Ax=b,\eqno(2.10)$$ $$A^T\pi+\lambda=c,\eqno(2.11)$$ $$\lambda^Tx=0,\eqno(2.12)$$ $$x\geq 0,\ \ \lambda\geq 0,\eqno(2.13)$$ where: $\pi$ is $m$-vector of Lagrange multipliers (dual variables) for equality constraints (2.8),\linebreak $\lambda$ is $n$-vector of Lagrange multipliers (dual variables) for non-negativity constraints (2.9),\linebreak (2.10) is the primal feasibility condition, (2.11) is the dual feasibility condition, (2.12) is the primal-dual complementarity condition, and (2.13) is the non-negativity conditions. The main idea of the primal-dual interior-point method is based on finding a point in the primal-dual space (i.e. in the space of all primal and dual variables $x$, $\pi$, and $\lambda$), which satisfies to all optimality conditions (2.10)---(2.13). Obviously, $x$-component of such point then provides an optimal solution to the working LP (2.7)---(2.9). To find the optimal point $(x^*,\pi^*,\lambda^*)$ the interior-point method attempts to solve the system of equations (2.10)---(2.12), which is closed in the sense that the number of variables $x_j$, $\pi_i$, and $\lambda_j$ and the number equations are the same and equal to $m+2n$. Due to condition (2.12) this system of equations is non-linear, so it can be solved with a version of {\it Newton's method} provided with additional rules to keep the current point within the positive orthant as required by the non-negativity conditions (2.13). Finally, once the optimal point $(x^*,\pi^*,\lambda^*)$ has been found, the solver performs inverse transformations to recover corresponding solution to the original LP passed to the solver from the application program. \subsection{glp\_interior --- solve LP problem with the interior-point method} \synopsis \begin{verbatim} int glp_interior(glp_prob *P, const glp_iptcp *parm); \end{verbatim} \description The routine \verb|glp_interior| is a driver to the LP solver based on the primal-dual interior-point method. This routine retrieves problem data from the specified problem object, calls the solver to solve the problem instance, and stores results of computations back into the problem object. The interior-point solver has a set of control parameters. Values of the control parameters can be passed in the structure \verb|glp_iptcp|, which the parameter \verb|parm| points to. For detailed description of this structure see paragraph ``Control parameters'' below. Before specifying some control parameters the application program should initialize the structure \verb|glp_iptcp| by default values of all control parameters using the routine \verb|glp_init_iptcp| (see the next subsection). This is needed for backward compatibility, because in the future there may appear new members in the structure \verb|glp_iptcp|. The parameter \verb|parm| can be specified as \verb|NULL|, in which case the solver uses default settings. \returns \begin{retlist} 0 & The LP problem instance has been successfully solved. (This code does {\it not} necessarily mean that the solver has found optimal solution. It only means that the solution process was successful.) \\ \verb|GLP_EFAIL| & The problem has no rows/columns.\\ \verb|GLP_ENOCVG| & Very slow convergence or divergence.\\ \verb|GLP_EITLIM| & Iteration limit exceeded.\\ \verb|GLP_EINSTAB| & Numerical instability on solving Newtonian system.\\ \end{retlist} \newpage \para{Comments} The routine \verb|glp_interior| implements an easy version of the primal-dual interior-point method based on Mehrotra's technique.\footnote{S. Mehrotra. On the implementation of a primal-dual interior point method. SIAM J. on Optim., 2(4), pp. 575-601, 1992.} Note that currently the GLPK interior-point solver does not include many important features, in particular: %\vspace*{-8pt} %\begin{itemize} \Item{---}it is not able to process dense columns. Thus, if the constraint matrix of the LP problem has dense columns, the solving process may be inefficient; \Item{---}it has no features against numerical instability. For some LP problems premature termination may happen if the matrix $ADA^T$ becomes singular or ill-conditioned; \Item{---}it is not able to identify the optimal basis, which corresponds to the interior-point solution found. %\end{itemize} %\vspace*{-8pt} \para{Terminal output} Solving large LP problems may take a long time, so the solver reports some information about every interior-point iteration,\footnote{Unlike the simplex method the interior point method usually needs 30---50 iterations (independently on the problem size) in order to find an optimal solution.} which is sent to the terminal. This information has the following format: \begin{verbatim} nnn: obj = fff; rpi = ppp; rdi = ddd; gap = ggg \end{verbatim} \noindent where: \verb|nnn| is iteration number, \verb|fff| is the current value of the objective function (in the case of maximization it has wrong sign), \verb|ppp| is the current relative primal infeasibility (cf. (2.10)): $$\frac{\|Ax^{(k)}-b\|}{1+\|b\|},\eqno(2.14)$$ \verb|ddd| is the current relative dual infeasibility (cf. (2.11)): $$\frac{\|A^T\pi^{(k)}+\lambda^{(k)}-c\|}{1+\|c\|},\eqno(2.15)$$ \verb|ggg| is the current primal-dual gap (cf. (2.12)): $$\frac{|c^Tx^{(k)}-b^T\pi^{(k)}|}{1+|c^Tx^{(k)}|},\eqno(2.16)$$ and $[x^{(k)},\pi^{(k)},\lambda^{(k)}]$ is the current point on $k$-th iteration, $k=0,1,2,\dots$\ . Note that all solution components are internally scaled, so information sent to the terminal is suitable only for visual inspection. \newpage \para{Control parameters} This paragraph describes all control parameters currently used in the interior-point solver. Symbolic names of control parameters are names of corresponding members in the structure \verb|glp_iptcp|. \bigskip {\tt int msg\_lev} (default: {\tt GLP\_MSG\_ALL}) Message level for terminal output: \verb|GLP_MSG_OFF|---no output; \verb|GLP_MSG_ERR|---error and warning messages only; \verb|GLP_MSG_ON |---normal output; \verb|GLP_MSG_ALL|---full output (including informational messages). \bigskip {\tt int ord\_alg} (default: {\tt GLP\_ORD\_AMD}) Ordering algorithm used prior to Cholesky factorization: \verb|GLP_ORD_NONE |---use natural (original) ordering; \verb|GLP_ORD_QMD |---quotient minimum degree (QMD); \verb|GLP_ORD_AMD |---approximate minimum degree (AMD); \verb|GLP_ORD_SYMAMD|---approximate minimum degree (SYMAMD). \bigskip \para{Example} The following main program reads LP problem instance in fixed MPS format from file\linebreak \verb|25fv47.mps|,\footnote{This instance in fixed MPS format can be found in the Netlib LP collection; see {\tt ftp://ftp.netlib.org/lp/data/}.} solves it with the interior-point solver, and writes the solution to file \verb|25fv47.txt|. \begin{footnotesize} \begin{verbatim} /* iptsamp.c */ #include #include #include int main(void) { glp_prob *P; P = glp_create_prob(); glp_read_mps(P, GLP_MPS_DECK, NULL, "25fv47.mps"); glp_interior(P, NULL); glp_print_ipt(P, "25fv47.txt"); glp_delete_prob(P); return 0; } /* eof */ \end{verbatim} \end{footnotesize} \newpage Below here is shown the terminal output from this example program. \begin{footnotesize} \begin{verbatim} Reading problem data from `25fv47.mps'... Problem: 25FV47 Objective: R0000 822 rows, 1571 columns, 11127 non-zeros 6919 records were read Original LP has 822 row(s), 1571 column(s), and 11127 non-zero(s) Working LP has 821 row(s), 1876 column(s), and 10705 non-zero(s) Matrix A has 10705 non-zeros Matrix S = A*A' has 11895 non-zeros (upper triangle) Minimal degree ordering... Computing Cholesky factorization S = L'*L... Matrix L has 35411 non-zeros Guessing initial point... Optimization begins... 0: obj = 1.823377629e+05; rpi = 1.3e+01; rdi = 1.4e+01; gap = 9.3e-01 1: obj = 9.260045192e+04; rpi = 5.3e+00; rdi = 5.6e+00; gap = 6.8e+00 2: obj = 3.596999742e+04; rpi = 1.5e+00; rdi = 1.2e+00; gap = 1.8e+01 3: obj = 1.989627568e+04; rpi = 4.7e-01; rdi = 3.0e-01; gap = 1.9e+01 4: obj = 1.430215557e+04; rpi = 1.1e-01; rdi = 8.6e-02; gap = 1.4e+01 5: obj = 1.155716505e+04; rpi = 2.3e-02; rdi = 2.4e-02; gap = 6.8e+00 6: obj = 9.660273208e+03; rpi = 6.7e-03; rdi = 4.6e-03; gap = 3.9e+00 7: obj = 8.694348283e+03; rpi = 3.7e-03; rdi = 1.7e-03; gap = 2.0e+00 8: obj = 8.019543639e+03; rpi = 2.4e-03; rdi = 3.9e-04; gap = 1.0e+00 9: obj = 7.122676293e+03; rpi = 1.2e-03; rdi = 1.5e-04; gap = 6.6e-01 10: obj = 6.514534518e+03; rpi = 6.1e-04; rdi = 4.3e-05; gap = 4.1e-01 11: obj = 6.361572203e+03; rpi = 4.8e-04; rdi = 2.2e-05; gap = 3.0e-01 12: obj = 6.203355508e+03; rpi = 3.2e-04; rdi = 1.7e-05; gap = 2.6e-01 13: obj = 6.032943411e+03; rpi = 2.0e-04; rdi = 9.3e-06; gap = 2.1e-01 14: obj = 5.796553021e+03; rpi = 9.8e-05; rdi = 3.2e-06; gap = 1.0e-01 15: obj = 5.667032431e+03; rpi = 4.4e-05; rdi = 1.1e-06; gap = 5.6e-02 16: obj = 5.613911867e+03; rpi = 2.5e-05; rdi = 4.1e-07; gap = 3.5e-02 17: obj = 5.560572626e+03; rpi = 9.9e-06; rdi = 2.3e-07; gap = 2.1e-02 18: obj = 5.537276001e+03; rpi = 5.5e-06; rdi = 8.4e-08; gap = 1.1e-02 19: obj = 5.522746942e+03; rpi = 2.2e-06; rdi = 4.0e-08; gap = 6.7e-03 20: obj = 5.509956679e+03; rpi = 7.5e-07; rdi = 1.8e-08; gap = 2.9e-03 21: obj = 5.504571733e+03; rpi = 1.6e-07; rdi = 5.8e-09; gap = 1.1e-03 22: obj = 5.502576367e+03; rpi = 3.4e-08; rdi = 1.0e-09; gap = 2.5e-04 23: obj = 5.502057119e+03; rpi = 8.1e-09; rdi = 3.0e-10; gap = 7.7e-05 24: obj = 5.501885996e+03; rpi = 9.4e-10; rdi = 1.2e-10; gap = 2.4e-05 25: obj = 5.501852464e+03; rpi = 1.4e-10; rdi = 1.2e-11; gap = 3.0e-06 26: obj = 5.501846549e+03; rpi = 1.4e-11; rdi = 1.2e-12; gap = 3.0e-07 27: obj = 5.501845954e+03; rpi = 1.4e-12; rdi = 1.2e-13; gap = 3.0e-08 28: obj = 5.501845895e+03; rpi = 1.5e-13; rdi = 1.2e-14; gap = 3.0e-09 OPTIMAL SOLUTION FOUND Writing interior-point solution to `25fv47.txt'... \end{verbatim} \end{footnotesize} \newpage \subsection{glp\_init\_iptcp --- initialize interior-point solver control parameters} \synopsis \begin{verbatim} int glp_init_iptcp(glp_iptcp *parm); \end{verbatim} \description The routine \verb|glp_init_iptcp| initializes control parameters, which are used by the interior-point solver, with default values. Default values of the control parameters are stored in the structure \verb|glp_iptcp|, which the parameter \verb|parm| points to. \subsection{glp\_ipt\_status --- determine solution status} \synopsis \begin{verbatim} int glp_ipt_status(glp_prob *P); \end{verbatim} \returns The routine \verb|glp_ipt_status| reports the status of a solution found by the interior-point solver as follows: \verb|GLP_UNDEF | --- interior-point solution is undefined; \verb|GLP_OPT | --- interior-point solution is optimal; \verb|GLP_INFEAS| --- interior-point solution is infeasible; \verb|GLP_NOFEAS| --- no feasible primal-dual solution exists. \subsection{glp\_ipt\_obj\_val --- retrieve objective value} \synopsis \begin{verbatim} double glp_ipt_obj_val(glp_prob *P); \end{verbatim} \returns The routine \verb|glp_ipt_obj_val| returns value of the objective function for interior-point solution. \subsection{glp\_ipt\_row\_prim --- retrieve row primal value} \synopsis \begin{verbatim} double glp_ipt_row_prim(glp_prob *P, int i); \end{verbatim} \returns The routine \verb|glp_ipt_row_prim| returns primal value of the auxiliary variable associated with \verb|i|-th row. \newpage \subsection{glp\_ipt\_row\_dual --- retrieve row dual value} \synopsis \begin{verbatim} double glp_ipt_row_dual(glp_prob *P, int i); \end{verbatim} \returns The routine \verb|glp_ipt_row_dual| returns dual value (i.e. reduced cost) of the auxiliary variable associated with \verb|i|-th row. \subsection{glp\_ipt\_col\_prim --- retrieve column primal value} \synopsis \begin{verbatim} double glp_ipt_col_prim(glp_prob *P, int j); \end{verbatim} \returns The routine \verb|glp_ipt_col_prim| returns primal value of the structural variable associated with \verb|j|-th column. \subsection{glp\_ipt\_col\_dual --- retrieve column dual value} \synopsis \begin{verbatim} double glp_ipt_col_dual(glp_prob *P, int j); \end{verbatim} \returns The routine \verb|glp_ipt_col_dual| returns dual value (i.e. reduced cost) of the structural variable associated with \verb|j|-th column. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newpage \section{Mixed integer programming routines} \subsection{glp\_set\_col\_kind --- set (change) column kind} \synopsis \begin{verbatim} void glp_set_col_kind(glp_prob *P, int j, int kind); \end{verbatim} \description The routine \verb|glp_set_col_kind| sets (changes) the kind of \verb|j|-th column (structural variable) as specified by the parameter \verb|kind|: \verb|GLP_CV| --- continuous variable; \verb|GLP_IV| --- integer variable; \verb|GLP_BV| --- binary variable. Setting a column to \verb|GLP_BV| has the same effect as if it were set to \verb|GLP_IV|, its lower bound were set 0, and its upper bound were set to 1. \subsection{glp\_get\_col\_kind --- retrieve column kind} \synopsis \begin{verbatim} int glp_get_col_kind(glp_prob *P, int j); \end{verbatim} \returns The routine \verb|glp_get_col_kind| returns the kind of \verb|j|-th column (structural variable) as follows: \verb|GLP_CV| --- continuous variable; \verb|GLP_IV| --- integer variable; \verb|GLP_BV| --- binary variable. \subsection{glp\_get\_num\_int --- retrieve number of integer columns} \synopsis \begin{verbatim} int glp_get_num_int(glp_prob *P); \end{verbatim} \returns The routine \verb|glp_get_num_int| returns the number of columns (structural variables), which are marked as integer. Note that this number {\it does} include binary columns. \newpage \subsection{glp\_get\_num\_bin --- retrieve number of binary columns} \synopsis \begin{verbatim} int glp_get_num_bin(glp_prob *P); \end{verbatim} \returns The routine \verb|glp_get_num_bin| returns the number of columns (structural variables), which are marked as integer and whose lower bound is zero and upper bound is one. \subsection{glp\_intopt --- solve MIP problem with the branch-and-cut method} \synopsis \begin{verbatim} int glp_intopt(glp_prob *P, const glp_iocp *parm); \end{verbatim} \description The routine \verb|glp_intopt| is a driver to the MIP solver based on the branch-and-cut method, which is a hybrid of branch-and-bound and cutting plane methods. If the presolver is disabled (see paragraph ``Control parameters'' below), on entry to the routine \verb|glp_intopt| the problem object, which the parameter \verb|mip| points to, should contain optimal solution to LP relaxation (it can be obtained, for example, with the routine \verb|glp_simplex|). Otherwise, if the presolver is enabled, it is not necessary. The MIP solver has a set of control parameters. Values of the control parameters can be passed in the structure \verb|glp_iocp|, which the parameter \verb|parm| points to. For detailed description of this structure see paragraph ``Control parameters'' below. Before specifying some control parameters the application program should initialize the structure \verb|glp_iocp| by default values of all control parameters using the routine \verb|glp_init_iocp| (see the next subsection). This is needed for backward compatibility, because in the future there may appear new members in the structure \verb|glp_iocp|. The parameter \verb|parm| can be specified as \verb|NULL|, in which case the solver uses default settings. Note that the GLPK branch-and-cut solver is not perfect, so it is unable to solve hard or very large scale MIP instances for a reasonable time. \returns \begin{retlist} 0 & The MIP problem instance has been successfully solved. (This code does {\it not} necessarily mean that the solver has found optimal solution. It only means that the solution process was successful.) \\ \verb|GLP_EBOUND| & Unable to start the search, because some double-bounded variables have incorrect bounds or some integer variables have non-integer (fractional) bounds.\\ \verb|GLP_EROOT| & Unable to start the search, because optimal basis for initial LP relaxation is not provided. (This code may appear only if the presolver is disabled.)\\ \verb|GLP_ENOPFS| & Unable to start the search, because LP relaxation of the MIP problem instance has no primal feasible solution. (This code may appear only if the presolver is enabled.)\\ \end{retlist} \newpage \begin{retlist} \verb|GLP_ENODFS| & Unable to start the search, because LP relaxation of the MIP problem instance has no dual feasible solution. In other word, this code means that if the LP relaxation has at least one primal feasible solution, its optimal solution is unbounded, so if the MIP problem has at least one integer feasible solution, its (integer) optimal solution is also unbounded. (This code may appear only if the presolver is enabled.)\\ \verb|GLP_EFAIL| & The search was prematurely terminated due to the solver failure.\\ \verb|GLP_EMIPGAP| & The search was prematurely terminated, because the relative mip gap tolerance has been reached.\\ \verb|GLP_ETMLIM| & The search was prematurely terminated, because the time limit has been exceeded.\\ \verb|GLP_ESTOP| & The search was prematurely terminated by application. (This code may appear only if the advanced solver interface is used.)\\ \end{retlist} \para{Built-in MIP presolver} The branch-and-cut solver has {\it built-in MIP presolver}. It is a subprogram that transforms the original MIP problem specified in the problem object to an equivalent MIP problem, which may be easier for solving with the branch-and-cut method than the original one. For example, the presolver can remove redundant constraints and variables, whose optimal values are known, perform bound and coefficient reduction, etc. Once the transformed MIP problem has been solved, the presolver transforms its solution back to corresponding solution of the original problem. Presolving is an optional feature of the routine \verb|glp_intopt|, and by default it is disabled. In order to enable the MIP presolver, the control parameter \verb|presolve| should be set to \verb|GLP_ON| (see paragraph ``Control parameters'' below). \para{Advanced solver interface} The routine \verb|glp_intopt| allows the user to control the branch-and-cut search by passing to the solver a user-defined callback routine. For more details see Chapter ``Branch-and-Cut API Routines''. \para{Terminal output} Solving a MIP problem may take a long time, so the solver reports some information about best known solutions, which is sent to the terminal. This information has the following format: \begin{verbatim} +nnn: mip = xxx yyy gap (ppp; qqq) \end{verbatim} \noindent where: `\verb|nnn|' is the simplex iteration number; `\verb|xxx|' is a value of the objective function for the best known integer feasible solution (if no integer feasible solution has been found yet, `\verb|xxx|' is the text `\verb|not found yet|'); `\verb|rho|' is the string `\verb|>=|' (in case of minimization) or `\verb|<=|' (in case of maximization); `\verb|yyy|' is a global bound for exact integer optimum (i.e. the exact integer optimum is always in the range from `\verb|xxx|' to `\verb|yyy|'); `\verb|gap|' is the relative mip gap, in percents, computed as $gap=|xxx-yyy|/(|xxx|+{\tt DBL\_EPSILON})\cdot 100\%$ (if $gap$ is greater than $999.9\%$, it is not printed); `\verb|ppp|' is the number of subproblems in the active list, `\verb|qqq|' is the number of subproblems which have been already fathomed and therefore removed from the branch-and-bound search tree. \newpage \subsubsection{Control parameters} This paragraph describes all control parameters currently used in the MIP solver. Symbolic names of control parameters are names of corresponding members in the structure \verb|glp_iocp|. \bigskip\vspace*{-2pt} {\tt int msg\_lev} (default: {\tt GLP\_MSG\_ALL}) Message level for terminal output: \verb|GLP_MSG_OFF| --- no output; \verb|GLP_MSG_ERR| --- error and warning messages only; \verb|GLP_MSG_ON | --- normal output; \verb|GLP_MSG_ALL| --- full output (including informational messages). \bigskip\vspace*{-2pt} {\tt int br\_tech} (default: {\tt GLP\_BR\_DTH}) Branching technique option: \verb|GLP_BR_FFV| --- first fractional variable; \verb|GLP_BR_LFV| --- last fractional variable; \verb|GLP_BR_MFV| --- most fractional variable; \verb|GLP_BR_DTH| --- heuristic by Driebeck and Tomlin; \verb|GLP_BR_PCH| --- hybrid pseudo-cost heuristic. \bigskip\vspace*{-2pt} {\tt int bt\_tech} (default: {\tt GLP\_BT\_BLB}) Backtracking technique option: \verb|GLP_BT_DFS| --- depth first search; \verb|GLP_BT_BFS| --- breadth first search; \verb|GLP_BT_BLB| --- best local bound; \verb|GLP_BT_BPH| --- best projection heuristic. \bigskip\vspace*{-2pt} {\tt int pp\_tech} (default: {\tt GLP\_PP\_ALL}) Preprocessing technique option: \verb|GLP_PP_NONE| --- disable preprocessing; \verb|GLP_PP_ROOT| --- perform preprocessing only on the root level; \verb|GLP_PP_ALL | --- perform preprocessing on all levels. \bigskip\vspace*{-2pt} {\tt int sr\_heur} (default: {\tt GLP\_ON}) Simple rounding heuristic option: \verb|GLP_ON | --- enable applying the simple rounding heuristic; \verb|GLP_OFF| --- disable applying the simple rounding heuristic. \newpage {\tt int fp\_heur} (default: {\tt GLP\_OFF}) Feasibility pump heuristic option: \verb|GLP_ON | --- enable applying the feasibility pump heuristic; \verb|GLP_OFF| --- disable applying the feasibility pump heuristic. \bigskip {\tt int ps\_heur} (default: {\tt GLP\_OFF}) Proximity search heuristic\footnote{The Fischetti--Monaci Proximity Search (a.k.a. Proxy) heuristic. This algorithm is often capable of rapidly improving a feasible solution of a MIP problem with binary variables. It allows to quickly obtain suboptimal solutions in some problems which take too long time to be solved to optimality.} option: \verb|GLP_ON | --- enable applying the proximity search heuristic; \verb|GLP_OFF| --- disable applying the proximity search pump heuristic. \bigskip {\tt int ps\_tm\_lim} (default: {\tt 60000}) Time limit, in milliseconds, for the proximity search heuristic (see above). \bigskip {\tt int gmi\_cuts} (default: {\tt GLP\_OFF}) Gomory's mixed integer cut option: \verb|GLP_ON | --- enable generating Gomory's cuts; \verb|GLP_OFF| --- disable generating Gomory's cuts. \bigskip {\tt int mir\_cuts} (default: {\tt GLP\_OFF}) Mixed integer rounding (MIR) cut option: \verb|GLP_ON | --- enable generating MIR cuts; \verb|GLP_OFF| --- disable generating MIR cuts. \bigskip {\tt int cov\_cuts} (default: {\tt GLP\_OFF}) Mixed cover cut option: \verb|GLP_ON | --- enable generating mixed cover cuts; \verb|GLP_OFF| --- disable generating mixed cover cuts. \bigskip {\tt int clq\_cuts} (default: {\tt GLP\_OFF}) Clique cut option: \verb|GLP_ON | --- enable generating clique cuts; \verb|GLP_OFF| --- disable generating clique cuts. \newpage {\tt double tol\_int} (default: {\tt 1e-5}) Absolute tolerance used to check if optimal solution to the current LP relaxation is integer feasible. (Do not change this parameter without detailed understanding its purpose.) \bigskip {\tt double tol\_obj} (default: {\tt 1e-7}) Relative tolerance used to check if the objective value in optimal solution to the current LP relaxation is not better than in the best known integer feasible solution. (Do not change this parameter without detailed understanding its purpose.) \bigskip {\tt double mip\_gap} (default: {\tt 0.0}) The relative mip gap tolerance. If the relative mip gap for currently known best integer feasible solution falls below this tolerance, the solver terminates the search. This allows obtainig suboptimal integer feasible solutions if solving the problem to optimality takes too long time. \bigskip {\tt int tm\_lim} (default: {\tt INT\_MAX}) Searching time limit, in milliseconds. \bigskip {\tt int out\_frq} (default: {\tt 5000}) Output frequency, in milliseconds. This parameter specifies how frequently the solver sends information about the solution process to the terminal. \bigskip {\tt int out\_dly} (default: {\tt 10000}) Output delay, in milliseconds. This parameter specifies how long the solver should delay sending information about solution of the current LP relaxation with the simplex method to the terminal. \bigskip {\tt void (*cb\_func)(glp\_tree *tree, void *info)} (default: {\tt NULL}) Entry point to the user-defined callback routine. \verb|NULL| means the advanced solver interface is not used. For more details see Chapter ``Branch-and-Cut API Routines''. \bigskip {\tt void *cb\_info} (default: {\tt NULL}) Transit pointer passed to the routine \verb|cb_func| (see above). \bigskip {\tt int cb\_size} (default: {\tt 0}) The number of extra (up to 256) bytes allocated for each node of the branch-and-bound tree to store application-specific data. On creating a node these bytes are initialized by binary zeros. \bigskip {\tt int presolve} (default: {\tt GLP\_OFF}) MIP presolver option: \verb|GLP_ON | --- enable using the MIP presolver; \verb|GLP_OFF| --- disable using the MIP presolver. \newpage {\tt int binarize} (default: {\tt GLP\_OFF}) Binarization option (used only if the presolver is enabled): \verb|GLP_ON | --- replace general integer variables by binary ones; \verb|GLP_OFF| --- do not use binarization. \subsection{glp\_init\_iocp --- initialize integer optimizer control parameters} \synopsis \begin{verbatim} void glp_init_iocp(glp_iocp *parm); \end{verbatim} \description The routine \verb|glp_init_iocp| initializes control parameters, which are used by the branch-and-cut solver, with default values. Default values of the control parameters are stored in a \verb|glp_iocp| structure, which the parameter \verb|parm| points to. \subsection{glp\_mip\_status --- determine status of MIP solution} \synopsis \begin{verbatim} int glp_mip_status(glp_prob *P); \end{verbatim} \returns The routine \verb|glp_mip_status| reports the status of a MIP solution found by the MIP solver as follows: \verb|GLP_UNDEF | --- MIP solution is undefined; \verb|GLP_OPT | --- MIP solution is integer optimal; \verb|GLP_FEAS | --- MIP solution is integer feasible, however, its optimality (or non-optimality) has not been proven, perhaps due to premature termination of the search; \verb|GLP_NOFEAS| --- problem has no integer feasible solution (proven by the solver). \subsection{glp\_mip\_obj\_val --- retrieve objective value} \synopsis \begin{verbatim} double glp_mip_obj_val(glp_prob *P); \end{verbatim} \returns The routine \verb|glp_mip_obj_val| returns value of the objective function for MIP solution. \newpage \subsection{glp\_mip\_row\_val --- retrieve row value} \synopsis \begin{verbatim} double glp_mip_row_val(glp_prob *P, int i); \end{verbatim} \returns The routine \verb|glp_mip_row_val| returns value of the auxiliary variable associated with \verb|i|-th row for MIP solution. \subsection{glp\_mip\_col\_val --- retrieve column value} \synopsis \begin{verbatim} double glp_mip_col_val(glp_prob *P, int j); \end{verbatim} \returns The routine \verb|glp_mip_col_val| returns value of the structural variable associated with \verb|j|-th column for MIP solution. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newpage \section{Additional routines} \subsection{glp\_check\_kkt --- check feasibility/optimality conditions} \synopsis {\parskip=0pt \tt void glp\_check\_kkt(glp\_prob *P, int sol, int cond, double *ae\_max, int *ae\_ind, \hspace{105pt}double *re\_max, int *re\_ind);} \description The routine \verb|glp_check_kkt| allows to check feasibility/optimality conditions for the current solution stored in the specified problem object. (For basic and interior-point solutions these conditions are known as {\it Karush--Kuhn--Tucker optimality conditions}.) The parameter \verb|sol| specifies which solution should be checked: \verb|GLP_SOL| --- basic solution; \verb|GLP_IPT| --- interior-point solution; \verb|GLP_MIP| --- mixed integer solution. The parameter \verb|cond| specifies which condition should be checked: \verb|GLP_KKT_PE| --- check primal equality constraints (KKT.PE); \verb|GLP_KKT_PB| --- check primal bound constraints (KKT.PB); \verb|GLP_KKT_DE| --- check dual equality constraints (KKT.DE). This conditions can be checked only for basic or interior-point solution; \verb|GLP_KKT_DB| --- check dual bound constraints (KKT.DB). This conditions can be checked only for basic or interior-point solution. Detailed explanations of these conditions are given below in paragraph ``Background''. On exit the routine stores the following information to locations specified by parameters \verb|ae_max|, \verb|ae_ind|, \verb|re_max|, and \verb|re_ind| (if some parameter is a null pointer, corresponding information is not stored): \verb|ae_max| --- largest absolute error; \verb|ae_ind| --- number of row (KKT.PE), column (KKT.DE), or variable (KKT.PB, KKT.DB) with the largest absolute error; \verb|re_max| --- largest relative error; \verb|re_ind| --- number of row (KKT.PE), column (KKT.DE), or variable (KKT.PB, KKT.DB) with the largest relative error. Row (auxiliary variable) numbers are in the range 1 to $m$, where $m$ is the number of rows in the problem object. Column (structural variable) numbers are in the range 1 to $n$, where $n$ is the number of columns in the problem object. Variable numbers are in the range 1 to $m+n$, where variables with numbers 1 to $m$ correspond to rows, and variables with numbers $m+1$ to $m+n$ correspond to columns. If the error reported is exact zero, corresponding row, column or variable number is set to zero. \newpage \para{Background} \def\arraystretch{1.5} The first condition checked by the routine is the following: $$x_R - A x_S = 0, \eqno{\rm (KKT.PE)}$$ where $x_R$ is the subvector of auxiliary variables (rows), $x_S$ is the subvector of structural variables (columns), $A$ is the constraint matrix. This condition expresses the requirement that all primal variables should satisfy to the system of equality constraints of the original LP problem. In case of exact arithmetic this condition would be satisfied for any basic solution; however, in case of inexact (floating-point) arithmetic, this condition shows how accurate the primal solution is, that depends on accuracy of a representation of the basis matrix used by the simplex method, or on accuracy provided by the interior-point method. To check the condition (KKT.PE) the routine computes the vector of residuals: $$g = x_R - A x_S,$$ and determines component of this vector that correspond to largest absolute and relative errors: $${\tt ae\_max}=\max_{1\leq i\leq m}|g_i|,$$ $${\tt re\_max}=\max_{1\leq i\leq m}\frac{|g_i|}{1+|(x_R)_i|}.$$ The second condition checked by the routine is the following: $$l_k \leq x_k \leq u_k {\rm \ \ \ for\ all}\ k=1,\dots,m+n, \eqno{\rm (KKT.PB)}$$ where $x_k$ is auxiliary ($1\leq k\leq m$) or structural ($m+1\leq k\leq m+n$) variable, $l_k$ and $u_k$ are, respectively, lower and upper bounds of the variable $x_k$ (including cases of infinite bounds). This condition expresses the requirement that all primal variables shoudl satisfy to bound constraints of the original LP problem. In case of basic solution all non-basic variables are placed on their active bounds, so actually the condition (KKT.PB) needs to be checked for basic variables only. If the primal solution has sufficient accuracy, this condition shows its primal feasibility. To check the condition (KKT.PB) the routine computes a vector of residuals: $$ h_k = \left\{ \begin{array}{ll} 0, & {\rm if}\ l_k \leq x_k \leq u_k \\ x_k - l_k, & {\rm if}\ x_k < l_k \\ x_k - u_k, & {\rm if}\ x_k > u_k \\ \end{array} \right. $$ for all $k=1,\dots,m+n$, and determines components of this vector that correspond to largest absolute and relative errors: $${\tt ae\_max}=\max_{1\leq k \leq m+n}|h_k|,$$ $${\tt re\_max}=\max_{1\leq k \leq m+n}\frac{|h_k|}{1+|x_k|}.$$ \newpage The third condition checked by the routine is: $${\rm grad}\;Z = c = (\tilde{A})^T \pi + d,$$ where $Z$ is the objective function, $c$ is the vector of objective coefficients, $(\tilde{A})^T$ is a matrix transposed to the expanded constraint matrix $\tilde{A} = (I|-A)$, $\pi$ is a vector of Lagrange multipliers that correspond to equality constraints of the original LP problem, $d$ is a vector of Lagrange multipliers that correspond to bound constraints for all (auxiliary and structural) variables of the original LP problem. Geometrically the third condition expresses the requirement that the gradient of the objective function should belong to the orthogonal complement of a linear subspace defined by the equality and active bound constraints, i.e. that the gradient is a linear combination of normals to the constraint hyperplanes, where Lagrange multipliers $\pi$ and $d$ are coefficients of that linear combination. To eliminate the vector $\pi$ rewrite the third condition as: $$ \left(\begin{array}{@{}c@{}}I \\ -A^T\end{array}\right) \pi = \left(\begin{array}{@{}c@{}}d_R \\ d_S\end{array}\right) + \left(\begin{array}{@{}c@{}}c_R \\ c_S\end{array}\right), $$ or, equivalently, $$ \left\{ \begin{array}{r@{}c@{}c} \pi + d_R&\ =\ &c_R, \\ -A^T\pi + d_S&\ =\ &c_S. \\ \end{array} \right. $$ Then substituting the vector $\pi$ from the first equation into the second we finally have: $$A^T (d_R - c_R) + (d_S - c_S) = 0, \eqno{\rm(KKT.DE)}$$ where $d_R$ is the subvector of reduced costs of auxiliary variables (rows), $d_S$ is the subvector of reduced costs of structural variables (columns), $c_R$ and $c_S$ are subvectors of objective coefficients at, respectively, auxiliary and structural variables, $A^T$ is a matrix transposed to the constraint matrix of the original LP problem. In case of exact arithmetic this condition would be satisfied for any basic solution; however, in case of inexact (floating-point) arithmetic, this condition shows how accurate the dual solution is, that depends on accuracy of a representation of the basis matrix used by the simplex method, or on accuracy provided by the interior-point method. To check the condition (KKT.DE) the routine computes a vector of residuals: $$u = A^T (d_R - c_R) + (d_S - c_S),$$ and determines components of this vector that correspond to largest absolute and relative errors: $${\tt ae\_max}=\max_{1\leq j\leq n}|u_j|,$$ $${\tt re\_max}=\max_{1\leq j\leq n}\frac{|u_j|}{1+|(d_S)_j-(c_S)_j|}.$$ \newpage The fourth condition checked by the routine is the following: $$ \left\{ \begin{array}{l@{\ }r@{\ }c@{\ }c@{\ }c@{\ }l@{\ }c@{\ }c@{\ }c@{\ }l} {\rm if} & -\infty & < & x_k & < & +\infty, & {\rm then} & d_k & = & 0 \\ {\rm if} & l_k & \leq & x_k & < & +\infty, & {\rm then} & d_k & \geq & 0\ {\rm(minimization)} \\ &&&&&& & d_k & \leq & 0\ {\rm(maximization)} \\ {\rm if} & -\infty & < & x_k & \leq & u_k, & {\rm then} & d_k & \leq & 0\ {\rm(minimization)} \\ &&&&&& & d_k & \geq & 0\ {\rm(maximization)} \\ {\rm if} & l_k & \leq & x_k & \leq & u_k, & {\rm then} & d_k & {\rm is} & {\rm of\ any\ sign} \\ \end{array}\right.\eqno{\rm(KKT.DB)} $$ for all $k=1,\dots,m+n$, where $d_k$ is a reduced cost (Lagrange multiplier) of auxiliary ($1\leq k\leq m$) or structural ($m+1\leq k\leq m+n$) variable $x_k$. Geometrically this condition expresses the requirement that constraints of the original problem must ``hold'' the point preventing its movement along the anti-gradient (in case of minimization) or the gradient (in case of maximization) of the objective function. In case of basic solution reduced costs of all basic variables are placed on their active (zero) bounds, so actually the condition (KKT.DB) needs to be checked for non-basic variables only. If the dual solution has sufficient accuracy, this condition shows the dual feasibility of the solution. To check the condition (KKT.DB) the routine computes a vector of residuals: $$ v_k = \left\{ \begin{array}{ll} 0, & {\rm if}\ d_k\ {\rm has\ correct\ sign} \\ |d_k|, & {\rm if}\ d_k\ {\rm has\ wrong\ sign} \\ \end{array} \right. $$ for all $k=1,\dots,m+n$, and determines components of this vector that correspond to largest absolute and relative errors: $${\tt ae\_max}=\max_{1\leq k\leq m+n}|v_k|,$$ $${\tt re\_max}=\max_{1\leq k\leq m+n}\frac{|v_k|}{1+|d_k - c_k|}.$$ Note that the complete set of Karush-Kuhn-Tucker optimality conditions also includes the fifth, so called {\it complementary slackness condition}, which expresses the requirement that at least either a primal variable $x_k$ or its dual counterpart $d_k$ should be on its bound for all $k=1,\dots,m+n$. Currently checking this condition is not implemented yet. \def\arraystretch{1} %* eof *% glpk-5.0/doc/glpk03.tex0000644000062000006210000020345313766346220014100 0ustar maomkpasswd%* glpk03.tex *% \chapter{Utility API routines} \section{Problem data reading/writing routines} \subsection{glp\_read\_mps --- read problem data in MPS format} \synopsis \begin{verbatim} int glp_read_mps(glp_prob *P, int fmt, const glp_mpscp *parm, const char *fname); \end{verbatim} \description The routine \verb|glp_read_mps| reads problem data in MPS format from a text file. (The MPS format is described in Appendix \ref{champs}, page \pageref{champs}.) The parameter \verb|fmt| specifies the MPS format version as follows: \verb|GLP_MPS_DECK| --- fixed (ancient) MPS format; \verb|GLP_MPS_FILE| --- free (modern) MPS format. The parameter \verb|parm| is reserved for use in the future and should be specified as \verb|NULL|. The character string \verb|fname| specifies a name of the text file to be read in. (If the file name ends with suffix `\verb|.gz|', the file is assumed to be compressed, in which case the routine \verb|glp_read_mps| decompresses it ``on the fly''.) Note that before reading data the current content of the problem object is completely erased with the routine \verb|glp_erase_prob|. \returns If the operation was successful, the routine \verb|glp_read_mps| returns zero. Otherwise, it prints an error message and returns non-zero. \newpage \subsection{glp\_write\_mps --- write problem data in MPS format} \synopsis \begin{verbatim} int glp_write_mps(glp_prob *P, int fmt, const glp_mpscp *parm, const char *fname); \end{verbatim} \description The routine \verb|glp_write_mps| writes problem data in MPS format to a text file. (The MPS format is described in Appendix \ref{champs}, page \pageref{champs}.) The parameter \verb|fmt| specifies the MPS format version as follows: \verb|GLP_MPS_DECK| --- fixed (ancient) MPS format; \verb|GLP_MPS_FILE| --- free (modern) MPS format. The parameter \verb|parm| is reserved for use in the future and should be specified as \verb|NULL|. The character string \verb|fname| specifies a name of the text file to be written out. (If the file name ends with suffix `\verb|.gz|', the file is assumed to be compressed, in which case the routine \verb|glp_write_mps| performs automatic compression on writing it.) \returns If the operation was successful, the routine \verb|glp_write_mps| returns zero. Otherwise, it prints an error message and returns non-zero. \subsection{glp\_read\_lp --- read problem data in CPLEX LP format} \synopsis {\tt int glp\_read\_lp(glp\_prob *P, const glp\_cpxcp *parm, const char *fname);} \description The routine \verb|glp_read_lp| reads problem data in CPLEX LP format from a text file. (The CPLEX LP format is described in Appendix \ref{chacplex}, page \pageref{chacplex}.) The parameter \verb|parm| is reserved for use in the future and should be specified as \verb|NULL|. The character string \verb|fname| specifies a name of the text file to be read in. (If the file name ends with suffix `\verb|.gz|', the file is assumed to be compressed, in which case the routine \verb|glp_read_lp| decompresses it ``on the fly''.) Note that before reading data the current content of the problem object is completely erased with the routine \verb|glp_erase_prob|. \returns If the operation was successful, the routine \verb|glp_read_lp| returns zero. Otherwise, it prints an error message and returns non-zero. \newpage \subsection{glp\_write\_lp --- write problem data in CPLEX LP format} \synopsis {\tt int glp\_write\_lp(glp\_prob *P, const glp\_cpxcp *parm, const char *fname);} \description The routine \verb|glp_write_lp| writes problem data in CPLEX LP format to a text file. (The CPLEX LP format is described in Appendix \ref{chacplex}, page \pageref{chacplex}.) The parameter \verb|parm| is reserved for use in the future and should be specified as \verb|NULL|. The character string \verb|fname| specifies a name of the text file to be written out. (If the file name ends with suffix `\verb|.gz|', the file is assumed to be compressed, in which case the routine \verb|glp_write_lp| performs automatic compression on writing it.) \returns If the operation was successful, the routine \verb|glp_write_lp| returns zero. Otherwise, it prints an error message and returns non-zero. \subsection{glp\_read\_prob --- read problem data in GLPK format} \synopsis \begin{verbatim} int glp_read_prob(glp_prob *P, int flags, const char *fname); \end{verbatim} \description The routine \verb|glp_read_prob| reads problem data in the GLPK LP/MIP format from a text file. (For description of the GLPK LP/MIP format see below.) The parameter \verb|flags| is reserved for use in the future and should be specified as zero. The character string \verb|fname| specifies a name of the text file to be read in. (If the file name ends with suffix `\verb|.gz|', the file is assumed to be compressed, in which case the routine \verb|glp_read_prob| decompresses it ``on the fly''.) Note that before reading data the current content of the problem object is completely erased with the routine \verb|glp_erase_prob|. \returns If the operation was successful, the routine \verb|glp_read_prob| returns zero. Otherwise, it prints an error message and returns non-zero. %\newpage \para{GLPK LP/MIP format} The GLPK LP/MIP format is a DIMACS-like format.\footnote{The DIMACS formats were developed by the Center for Discrete Mathematics and Theoretical Computer Science (DIMACS) to facilitate exchange of problem data. For details see: {\tt }. } The file in this format is a plain ASCII text file containing lines of several types described below. A line is terminated with the end-of-line character. Fields in each line are separated by at least one blank space. Each line begins with a one-character designator to identify the line type. \newpage The first line of the data file must be the problem line (except optional comment lines, which may precede the problem line). The last line of the data file must be the end line. Other lines may follow in arbitrary order, however, duplicate lines are not allowed. \para{Comment lines.} Comment lines give human-readable information about the data file and are ignored by GLPK routines. Comment lines can appear anywhere in the data file. Each comment line begins with the lower-case character \verb|c|. \begin{verbatim} c This is an example of comment line \end{verbatim} \para{Problem line.} There must be exactly one problem line in the data file. This line must appear before any other lines except comment lines and has the following format: \begin{verbatim} p CLASS DIR ROWS COLS NONZ \end{verbatim} The lower-case letter \verb|p| specifies that this is the problem line. The \verb|CLASS| field defines the problem class and can contain either the keyword \verb|lp| (that means linear programming problem) or \verb|mip| (that means mixed integer programming problem). The \verb|DIR| field defines the optimization direction (that is, the objective function sense) and can contain either the keyword \verb|min| (that means minimization) or \verb|max| (that means maximization). The \verb|ROWS|, \verb|COLS|, and \verb|NONZ| fields contain non-negative integer values specifying, respectively, the number of rows (constraints), columns (variables), and non-zero constraint coefficients in the problem instance. Note that \verb|NONZ| value does not account objective coefficients. \para{Row descriptors.} There must be at most one row descriptor line in the data file for each row (constraint). This line has one of the following formats: \begin{verbatim} i ROW f i ROW l RHS i ROW u RHS i ROW d RHS1 RHS2 i ROW s RHS \end{verbatim} The lower-case letter \verb|i| specifies that this is the row descriptor line. The \verb|ROW| field specifies the row ordinal number, an integer between 1 and $m$, where $m$ is the number of rows in the problem instance. The next lower-case letter specifies the row type as follows: \verb|f| --- free (unbounded) row: $-\infty<\sum a_jx_j<+\infty$; \verb|l| --- inequality constraint of `$\geq$' type: $\sum a_jx_j\geq b$; \verb|u| --- inequality constraint of `$\leq$' type: $\sum a_jx_j\leq b$; \verb|d| --- double-sided inequality constraint: $b_1\leq\sum a_jx_j\leq b_2$; \verb|s| --- equality constraint: $\sum a_jx_j=b$. The \verb|RHS| field contains a floaing-point value specifying the row right-hand side. The \verb|RHS1| and \verb|RHS2| fields contain floating-point values specifying, respectively, the lower and upper right-hand sides for the double-sided row. If for some row its descriptor line does not appear in the data file, by default that row is assumed to be an equality constraint with zero right-hand side. \para{Column descriptors.} There must be at most one column descriptor line in the data file for each column (variable). This line has one of the following formats depending on the problem class specified in the problem line: \begin{tabular}{@{}l@{\hspace*{40pt}}l} LP class & MIP class \\ \hline \verb|j COL f| & \verb|j COL KIND f| \\ \verb|j COL l BND| & \verb|j COL KIND l BND| \\ \verb|j COL u BND| & \verb|j COL KIND u BND| \\ \verb|j COL d BND1 BND2| & \verb|j COL KIND d BND1 BND2| \\ \verb|j COL s BND| & \verb|j COL KIND s BND| \\ \end{tabular} The lower-case letter \verb|j| specifies that this is the column descriptor line. The \verb|COL| field specifies the column ordinal number, an integer between 1 and $n$, where $n$ is the number of columns in the problem instance. The \verb|KIND| field is used only for MIP problems and specifies the column kind as follows: \verb|c| --- continuous column; \verb|i| --- integer column; \verb|b| --- binary column (in this case all remaining fields must be omitted). The next lower-case letter specifies the column type as follows: \verb|f| --- free (unbounded) column: $-\infty #include #include int main(void) { glp_prob *lp; glp_tran *tran; int ret; lp = glp_create_prob(); tran = glp_mpl_alloc_wksp(); ret = glp_mpl_read_model(tran, "egypt.mod", 0); if (ret != 0) { fprintf(stderr, "Error on translating model\n"); goto skip; } ret = glp_mpl_generate(tran, NULL); if (ret != 0) { fprintf(stderr, "Error on generating model\n"); goto skip; } glp_mpl_build_prob(tran, lp); ret = glp_write_mps(lp, GLP_MPS_FILE, NULL, "egypt.mps"); if (ret != 0) fprintf(stderr, "Error on writing MPS file\n"); skip: glp_mpl_free_wksp(tran); glp_delete_prob(lp); return 0; } /* eof */ \end{verbatim} \end{small} \newpage \subsubsection*{Example 2} In this example the program reads model section from file \verb|sudoku.mod|\footnote{This is an example model which is included in the GLPK distribution along with alternative data file {\tt sudoku.dat}.} ignoring data section in this file, reads alternative data section from file \verb|sudoku.dat|, solves the problem instance and passes the solution found back to the model. \bigskip \begin{small} \begin{verbatim} /* mplsamp2.c */ #include #include #include int main(void) { glp_prob *mip; glp_tran *tran; int ret; mip = glp_create_prob(); tran = glp_mpl_alloc_wksp(); ret = glp_mpl_read_model(tran, "sudoku.mod", 1); if (ret != 0) { fprintf(stderr, "Error on translating model\n"); goto skip; } ret = glp_mpl_read_data(tran, "sudoku.dat"); if (ret != 0) { fprintf(stderr, "Error on translating data\n"); goto skip; } ret = glp_mpl_generate(tran, NULL); if (ret != 0) { fprintf(stderr, "Error on generating model\n"); goto skip; } glp_mpl_build_prob(tran, mip); glp_simplex(mip, NULL); glp_intopt(mip, NULL); ret = glp_mpl_postsolve(tran, mip, GLP_MIP); if (ret != 0) fprintf(stderr, "Error on postsolving model\n"); skip: glp_mpl_free_wksp(tran); glp_delete_prob(mip); return 0; } /* eof */ \end{verbatim} \end{small} \newpage \subsection{glp\_mpl\_alloc\_wksp --- allocate the translator workspace} \synopsis \begin{verbatim} glp_tran *glp_mpl_alloc_wksp(void); \end{verbatim} \description The routine \verb|glp_mpl_alloc_wksp| allocates the MathProg translator work\-space. (Note that multiple instances of the workspace may be allocated, if necessary.) \returns The routine returns a pointer to the workspace, which should be used in all subsequent operations. \subsection{glp\_mpl\_init\_rand --- initialize pseudo-random number generator} \synopsis \begin{verbatim} void glp_mpl_init_rand(glp_tran *tran, int seed); \end{verbatim} \description The routine \verb|glp_mpl_init_rand| initializes a pseudo-random number generator used by the MathProg translator, where the parameter \verb|seed| may be any integer number. A call to the routine \verb|glp_mpl_init_rand| should immediately follow the call to the routine \verb|glp_mpl_alloc_wksp|. However, using of this routine is optional. If it is not called, the effect is the same as if it were called with \verb|seed| equal to 1. \subsection{glp\_mpl\_read\_model --- read and translate model section} \synopsis \begin{verbatim} int glp_mpl_read_model(glp_tran *tran, const char *fname, int skip); \end{verbatim} \description The routine \verb|glp_mpl_read_model| reads model section and, optionally, data section, which may follow the model section, from a text file, whose name is the character string \verb|fname|, performs translation of model statements and data blocks, and stores all the information in the workspace. The parameter \verb|skip| is a flag. If the input file contains the data section and this flag is non-zero, the data section is not read as if there were no data section and a warning message is printed. This allows reading data section(s) from other file(s). \returns If the operation is successful, the routine returns zero. Otherwise the routine prints an error message and returns non-zero. \newpage \subsection{glp\_mpl\_read\_data --- read and translate data section} \synopsis \begin{verbatim} int glp_mpl_read_data(glp_tran *tran, const char *fname); \end{verbatim} \description The routine \verb|glp_mpl_read_data| reads data section from a text file, whose name is the character string \verb|fname|, performs translation of data blocks, and stores the data read in the translator workspace. If necessary, this routine may be called more than once. \returns If the operation is successful, the routine returns zero. Otherwise the routine prints an error message and returns non-zero. \subsection{glp\_mpl\_generate --- generate the model} \synopsis \begin{verbatim} int glp_mpl_generate(glp_tran *tran, const char *fname); \end{verbatim} \description The routine \verb|glp_mpl_generate| generates the model using its description stored in the translator workspace. This operation means generating all variables, constraints, and objectives, executing check and display statements, which precede the solve statement (if it is presented). The character string \verb|fname| specifies the name of an output text file, to which output produced by display statements should be written. If \verb|fname| is \verb|NULL|, the output is sent to the terminal. \returns If the operation is successful, the routine returns zero. Otherwise the routine prints an error message and returns non-zero. \vspace*{-6pt} \subsection{glp\_mpl\_build\_prob --- build problem instance from the model} \synopsis \begin{verbatim} void glp_mpl_build_prob(glp_tran *tran, glp_prob *P); \end{verbatim} \description The routine \verb|glp_mpl_build_prob| obtains all necessary information from the translator work\-space and stores it in the specified problem object \verb|P|. Note that before building the current content of the problem object is erased with the routine \verb|glp_erase_prob|. \newpage \subsection{glp\_mpl\_postsolve --- postsolve the model} \synopsis \begin{verbatim} int glp_mpl_postsolve(glp_tran *tran, glp_prob *P, int sol); \end{verbatim} \description The routine \verb|glp_mpl_postsolve| copies the solution from the specified problem object \verb|prob| to the translator workspace and then executes all the remaining model statements, which follow the solve statement. The parameter \verb|sol| specifies which solution should be copied from the problem object to the workspace as follows: \verb|GLP_SOL| --- basic solution; \verb|GLP_IPT| --- interior-point solution; \verb|GLP_MIP| --- mixed integer solution. \returns If the operation is successful, the routine returns zero. Otherwise the routine prints an error message and returns non-zero. \subsection{glp\_mpl\_free\_wksp --- free the translator workspace} \synopsis \begin{verbatim} void glp_mpl_free_wksp(glp_tran *tran); \end{verbatim} \description The routine \verb|glp_mpl_free_wksp| frees all the memory allocated to the translator workspace. It also frees all other resources, which are still used by the translator. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newpage \section{Problem solution reading/writing routines} \subsection{glp\_print\_sol --- write basic solution in printable format} \synopsis \begin{verbatim} int glp_print_sol(glp_prob *P, const char *fname); \end{verbatim} \description The routine \verb|glp_print_sol writes| the current basic solution to an LP problem, which is specified by the pointer \verb|P|, to a text file, whose name is the character string \verb|fname|, in printable format. Information reported by the routine \verb|glp_print_sol| is intended mainly for visual analysis. \returns If no errors occurred, the routine returns zero. Otherwise the routine prints an error message and returns non-zero. \subsection{glp\_read\_sol --- read basic solution in GLPK format} \synopsis \begin{verbatim} int glp_read_sol(glp_prob *P, const char *fname); \end{verbatim} \description The routine \verb|glp_read_sol| reads basic solution from a text file in the GLPK format. (For description of the format see below.) The character string \verb|fname| specifies the name of the text file to be read in. (If the file name ends with suffix `\verb|.gz|', the file is assumed to be compressed, in which case the routine \verb|glp_read_sol| decompresses it "on the fly".) \returns If the operation was successful, the routine \verb|glp_read_sol| returns zero. Otherwise, it prints an error message and returns non-zero. \para{GLPK basic solution format} The GLPK basic solution format is a DIMACS-like format.\footnote{The DIMACS formats were developed by the Center for Discrete Mathematics and Theoretical Computer Science (DIMACS) to facilitate exchange of problem data. For details see: {\tt }. } The file in this format is a plain ASCII text file containing lines of several types described below. A line is terminated with the end-of-line character. Fields in each line are separated by at least one blank space. Each line begins with a one-character designator to identify the line type. The first line of the solution file must be the solution line (except optional comment lines, which may precede the problem line). The last line of the data file must be the end line. Other lines may follow in arbitrary order, however, duplicate lines are not allowed. \newpage \para{Comment lines.} Comment lines give human-readable information about the solution file and are ignored by GLPK routines. Comment lines can appear anywhere in the data file. Each comment line begins with the lower-case character \verb|c|. \begin{verbatim} c This is an example of comment line \end{verbatim} \para{Solution line.} There must be exactly one solution line in the solution file. This line must appear before any other lines except comment lines and has the following format: \begin{verbatim} s bas ROWS COLS PST DST OBJ \end{verbatim} The lower-case letter \verb|s| specifies that this is the solution line. The three-character solution designator \verb|bas| identifies the file as containing a basic solution to the LP problem instance. The \verb|ROWS| and \verb|COLS| fields contain non-negative integer values that specify the number of rows (constraints) and columns (variables), resp., in the LP problem instance. The \verb|PST| and \verb|DST| fields contain lower-case letters that specify the primal and dual solution status, resp., as follows: \verb|u| --- solution is undefined; \verb|f| --- solution is feasible; \verb|i| --- solution is infeasible; \verb|n| --- no feasible solution exists. The \verb|OBJ| field contains a floating-point number that specifies the objective function value in the basic solution. \para{Row solution descriptors.} There must be exactly one row solution descriptor line in the solution file for each row (constraint). This line has the following format: \begin{verbatim} i ROW ST PRIM DUAL \end{verbatim} The lower-case letter \verb|i| specifies that this is the row solution descriptor line. The \verb|ROW| field specifies the row ordinal number, an integer between 1 and $m$, where $m$ is the number of rows in the problem instance. The \verb|ST| field contains one of the following lower-case letters that specifies the row status in the basic solution:\footnote{The row status is the status of the associated auxiliary variable.} \verb|b| --- inactive constraint; \verb|l| --- inequality constraint active on its lower bound; \verb|u| --- inequality constraint active on its upper bound; \verb|f| --- active free (unounded) row; \verb|s| --- active equality constraint. The \verb|PRIM| field contains a floating-point number that specifies the row primal value (the value of the corresponding linear form). The \verb|DUAL| field contains a floating-point number that specifies the row dual value (the Lagrangian multiplier for active bound). \para{Column solution descriptors.} There must be exactly one column solution descriptor line in the solution file for each column (variable). This line has the following format: \begin{verbatim} j COL ST PRIM DUAL \end{verbatim} The lower-case letter \verb|j| specifies that this is the column solution descriptor line. The \verb|COL| field specifies the column ordinal number, an integer between 1 and $n$, where $n$ is the number of columns in the problem instance. The \verb|ST| field contains one of the following lower-case letters that specifies the column status in the basic solution: \verb|b| --- basic variable; \verb|l| --- non-basic variable having its lower bound active; \verb|u| --- non-basic variable having its upper bound active; \verb|f| --- non-basic free (unounded) variable; \verb|s| --- non-basic fixed variable. The \verb|PRIM| field contains a floating-point number that specifies the column primal value. The \verb|DUAL| field contains a floating-point number that specifies the column dual value (the Lagrangian multiplier for active bound). \para{End line.} There must be exactly one end line in the solution file. This line must appear last in the file and has the following format: \begin{verbatim} e \end{verbatim} The lower-case letter \verb|e| specifies that this is the end line. Anything that follows the end line is ignored by GLPK routines. \para{Example of solution file in GLPK basic solution format} The following example of a solution file in GLPK basic solution format specifies the optimal basic solution to the LP problem instance from Subsection ``Example of MPS file''. \bigskip \begin{center} \footnotesize\tt \begin{tabular}{l@{\hspace*{50pt}}} s bas 7 7 f f 296.216606498195 \\ i 1 s 2000 -0.0135956678700369 \\ i 2 u 60 -2.56823104693141 \\ i 3 b 83.9675090252707 0 \\ i 4 u 40 -0.544404332129962 \\ i 5 b 19.9602888086643 0 \\ i 6 l 1500 0.251985559566788 \\ i 7 l 250 0.48519855595668 \\ \end{tabular} \begin{tabular}{|@{\hspace*{50pt}}l} j 1 l 0 0.253624548736462 \\ j 2 b 665.342960288809 0 \\ j 3 b 490.252707581226 0 \\ j 4 b 424.187725631769 0 \\ j 5 l 0 0.0145559566787004 \\ j 6 b 299.638989169676 0 \\ j 7 b 120.57761732852 0 \\ e o f \\ \end{tabular} \end{center} \newpage \subsection{glp\_write\_sol --- write basic solution in GLPK format} \synopsis \begin{verbatim} int glp_write_sol(glp_prob *P, const char *fname); \end{verbatim} \description The routine \verb|glp_write_sol| writes the current basic solution to a text file in the GLPK format. (For description of the GLPK basic solution format see Subsection ``Read basic solution in GLPK format.'') The character string \verb|fname| specifies the name of the text file to be written. (If the file name ends with suffix `\verb|.gz|', the routine \verb|glp_write_sol| compresses it "on the fly".) \returns If the operation was successful, the routine \verb|glp_write_sol| returns zero. Otherwise, it prints an error message and returns non-zero. \subsection{glp\_print\_ipt --- write interior-point solution in printable format} \synopsis \begin{verbatim} int glp_print_ipt(glp_prob *P, const char *fname); \end{verbatim} \description The routine \verb|glp_print_ipt| writes the current interior point solution to an LP problem, which the parameter \verb|P| points to, to a text file, whose name is the character string \verb|fname|, in printable format. Information reported by the routine \verb|glp_print_ipt| is intended mainly for visual analysis. \returns If no errors occurred, the routine returns zero. Otherwise the routine prints an error message and returns non-zero. \subsection{glp\_read\_ipt --- read interior-point solution in GLPK format} \synopsis \begin{verbatim} int glp_read_ipt(glp_prob *P, const char *fname); \end{verbatim} \description The routine \verb|glp_read_ipt| reads interior-point solution from a text file in the GLPK format. (For description of the format see below.) The character string \verb|fname| specifies the name of the text file to be read in. (If the file name ends with suffix `\verb|.gz|', the file is assumed to be compressed, in which case the routine \verb|glp_read_ipt| decompresses it "on the fly".) %\newpage \returns If the operation was successful, the routine \verb|glp_read_ipt| returns zero. Otherwise, it prints an error message and returns non-zero. \para{GLPK interior-point solution format} The GLPK interior-point solution format is a DIMACS-like format.\footnote{The DIMACS formats were developed by the Center for Discrete Mathematics and Theoretical Computer Science (DIMACS) to facilitate exchange of problem data. For details see: {\tt }. } The file in this format is a plain ASCII text file containing lines of several types described below. A line is terminated with the end-of-line character. Fields in each line are separated by at least one blank space. Each line begins with a one-character designator to identify the line type. The first line of the solution file must be the solution line (except optional comment lines, which may precede the problem line). The last line of the data file must be the end line. Other lines may follow in arbitrary order, however, duplicate lines are not allowed. \para{Comment lines.} Comment lines give human-readable information about the solution file and are ignored by GLPK routines. Comment lines can appear anywhere in the data file. Each comment line begins with the lower-case character \verb|c|. \begin{verbatim} c This is an example of comment line \end{verbatim} \para{Solution line.} There must be exactly one solution line in the solution file. This line must appear before any other lines except comment lines and has the following format: \begin{verbatim} s ipt ROWS COLS SST OBJ \end{verbatim} The lower-case letter \verb|s| specifies that this is the solution line. The three-character solution designator \verb|ipt| identifies the file as containing an interior-point solution to the LP problem instance. The \verb|ROWS| and \verb|COLS| fields contain non-negative integer values that specify the number of rows (constraints) and columns (variables), resp., in the LP problem instance. The \verb|SST| field contains one of the following lower-case letters that specifies the solution status: \verb|o| --- solution is optimal; \verb|i| --- solution is infeasible; \verb|n| --- no feasible solution exists; \verb|u| --- solution is undefined. The \verb|OBJ| field contains a floating-point number that specifies the objective function value in the interior-point solution. \para{Row solution descriptors.} There must be exactly one row solution descriptor line in the solution file for each row (constraint). This line has the following format: \begin{verbatim} i ROW PRIM DUAL \end{verbatim} The lower-case letter \verb|i| specifies that this is the row solution descriptor line. %\newpage The \verb|ROW| field specifies the row ordinal number, an integer between 1 and $m$, where $m$ is the number of rows in the problem instance. The \verb|PRIM| field contains a floating-point number that specifies the row primal value (the value of the corresponding linear form). The \verb|DUAL| field contains a floating-point number that specifies the row dual value (the Lagrangian multiplier for active bound). \para{Column solution descriptors.} There must be exactly one column solution descriptor line in the solution file for each column (variable). This line has the following format: \begin{verbatim} j COL PRIM DUAL \end{verbatim} The lower-case letter \verb|j| specifies that this is the column solution descriptor line. The \verb|COL| field specifies the column ordinal number, an integer between 1 and $n$, where $n$ is the number of columns in the problem instance. The \verb|PRIM| field contains a floating-point number that specifies the column primal value. The \verb|DUAL| field contains a floating-point number that specifies the column dual value (the Lagrangian multiplier for active bound). \para{End line.} There must be exactly one end line in the solution file. This line must appear last in the file and has the following format: \begin{verbatim} e \end{verbatim} The lower-case letter \verb|e| specifies that this is the end line. Anything that follows the end line is ignored by GLPK routines. \para{Example of solution file in GLPK interior-point solution format} The following example of a solution file in GLPK interior-point solution format specifies the optimal interior-point solution to the LP problem instance from Subsection ``Example of MPS file''. \bigskip \begin{center} \footnotesize\tt \begin{tabular}{l@{\hspace*{10pt}}} s ipt 7 7 o 296.216606851403 \\ i 1 2000.00000290369 -0.0135956757623443 \\ i 2 60.0000001302903 -2.568231024875 \\ i 3 83.9675094251819 -8.85591445202383e-10 \\ i 4 39.9999999985064 -0.544404310443766 \\ i 5 19.9602886941262 -2.24817803513554e-09 \\ i 6 1500.00000199013 0.251985567257828 \\ i 7 250.000000244896 0.48519856304979 \\ \end{tabular} \begin{tabular}{|@{\hspace*{10pt}}l} j 1 3.3482079213784e-07 0.253624547432525 \\ j 2 665.342955760768 6.04613825351601e-11 \\ j 3 490.25271366802 5.8488360240978e-10 \\ j 4 424.187729774275 -2.54144550490434e-11 \\ j 5 1.46067738492801e-06 0.0145559574770786 \\ j 6 299.638985053112 1.49359074902927e-10 \\ j 7 120.577616852015 3.50297708781545e-10 \\ e o f \end{tabular} \end{center} \subsection{glp\_write\_ipt --- write interior-point solution in GLPK format} \synopsis \begin{verbatim} int glp_write_ipt(glp_prob *P, const char *fname); \end{verbatim} \description The routine \verb|glp_write_ipt| writes the current interior-point solution to a text file in the GLPK format. (For description of the GLPK interior-point solution format see Subsection ``Read interior-point solution in GLPK format.'') The character string \verb|fname| specifies the name of the text file to be written. (If the file name ends with suffix `\verb|.gz|', the routine \verb|glp_write_ipt| compresses it "on the fly".) \returns If the operation was successful, the routine \verb|glp_write_ipt| returns zero. Otherwise, it prints an error message and returns non-zero. \subsection{glp\_print\_mip --- write MIP solution in printable format} \synopsis \begin{verbatim} int glp_print_mip(glp_prob *P, const char *fname); \end{verbatim} \description The routine \verb|glp_print_mip| writes the current solution to a MIP problem, which is specified by the pointer \verb|P|, to a text file, whose name is the character string \verb|fname|, in printable format. Information reported by the routine \verb|glp_print_mip| is intended mainly for visual analysis. \returns If no errors occurred, the routine returns zero. Otherwise the routine prints an error message and returns non-zero. \subsection{glp\_read\_mip --- read MIP solution in GLPK format} \synopsis \begin{verbatim} int glp_read_mip(glp_prob *P, const char *fname); \end{verbatim} \description The routine \verb|glp_read_mip| reads MIP solution from a text file in the GLPK format. (For description of the format see below.) The character string \verb|fname| specifies the name of the text file to be read in. (If the file name ends with suffix `\verb|.gz|', the file is assumed to be compressed, in which case the routine \verb|glp_read_mip| decompresses it "on the fly".) \returns If the operation was successful, the routine \verb|glp_read_mip| returns zero. Otherwise, it prints an error message and returns non-zero. \para{GLPK MIP solution format} The GLPK MIP solution format is a DIMACS-like format.\footnote{The DIMACS formats were developed by the Center for Discrete Mathematics and Theoretical Computer Science (DIMACS) to facilitate exchange of problem data. For details see: {\tt }. } The file in this format is a plain ASCII text file containing lines of several types described below. A line is terminated with the end-of-line character. Fields in each line are separated by at least one blank space. Each line begins with a one-character designator to identify the line type. The first line of the solution file must be the solution line (except optional comment lines, which may precede the problem line). The last line of the data file must be the end line. Other lines may follow in arbitrary order, however, duplicate lines are not allowed. \para{Comment lines.} Comment lines give human-readable information about the solution file and are ignored by GLPK routines. Comment lines can appear anywhere in the data file. Each comment line begins with the lower-case character \verb|c|. \begin{verbatim} c This is an example of comment line \end{verbatim} \para{Solution line.} There must be exactly one solution line in the solution file. This line must appear before any other lines except comment lines and has the following format: \begin{verbatim} s mip ROWS COLS SST OBJ \end{verbatim} The lower-case letter \verb|s| specifies that this is the solution line. The three-character solution designator \verb|mip| identifies the file as containing a solution to the MIP problem instance. The \verb|ROWS| and \verb|COLS| fields contain non-negative integer values that specify the number of rows (constraints) and columns (variables), resp., in the LP problem instance. The \verb|SST| field contains one of the following lower-case letters that specifies the solution status: \verb|o| --- solution is integer optimal; \verb|f| --- solution is integer feasible (non-optimal); \verb|n| --- no integer feasible solution exists; \verb|u| --- solution is undefined. The \verb|OBJ| field contains a floating-point number that specifies the objective function value in the MIP solution. \para{Row solution descriptors.} There must be exactly one row solution descriptor line in the solution file for each row (constraint). This line has the following format: \begin{verbatim} i ROW VAL \end{verbatim} The lower-case letter \verb|i| specifies that this is the row solution descriptor line. The \verb|ROW| field specifies the row ordinal number, an integer between 1 and $m$, where $m$ is the number of rows in the problem instance. The \verb|VAL| field contains a floating-point number that specifies the row value (the value of the corresponding linear form). \para{Column solution descriptors.} There must be exactly one column solution descriptor line in the solution file for each column (variable). This line has the following format: \begin{verbatim} j COL VAL \end{verbatim} The lower-case letter \verb|j| specifies that this is the column solution descriptor line. The \verb|COL| field specifies the column ordinal number, an integer between 1 and $n$, where $n$ is the number of columns in the problem instance. The \verb|VAL| field contains a floating-point number that specifies the column value. \para{End line.} There must be exactly one end line in the solution file. This line must appear last in the file and has the following format: \begin{verbatim} e \end{verbatim} The lower-case letter \verb|e| specifies that this is the end line. Anything that follows the end line is ignored by GLPK routines. \para{Example of solution file in GLPK MIP solution format} The following example of a solution file in GLPK MIP solution format specifies an optimal solution to a MIP problem instance. \bigskip \begin{center} \footnotesize\tt \begin{tabular}{l@{\hspace*{50pt}}} s mip 8 8 o 1201500 \\ i 1 60 \\ i 2 8400 \\ i 3 -1200 \\ i 4 0 \\ i 5 9000 \\ i 6 -600 \\ i 7 0 \\ i 8 8000 \\ \end{tabular} \begin{tabular}{|@{\hspace*{80pt}}l} j 1 60 \\ j 2 6 \\ j 3 0 \\ j 4 60 \\ j 5 6 \\ j 6 600 \\ j 7 60 \\ j 8 16 \\ e o f \\ \end{tabular} \end{center} \subsection{glp\_write\_mip --- write MIP solution in GLPK format} \synopsis \begin{verbatim} int glp_write_mip(glp_prob *P, const char *fname); \end{verbatim} \description The routine \verb|glp_write_mip| writes the current MIP solution to a text file in the GLPK format. (For description of the GLPK MIP solution format see Subsection ``Read MIP solution in GLPK format.'') The character string \verb|fname| specifies the name of the text file to be written. (If the file name ends with suffix `\verb|.gz|', the routine \verb|glp_write_mip| compresses it "on the fly".) \returns If the operation was successful, the routine \verb|glp_write_mip| returns zero. Otherwise, it prints an error message and returns non-zero. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newpage \section{Post-optimal analysis routines} \subsection{glp\_print\_ranges --- print sensitivity analysis report} \synopsis {\tt int glp\_print\_ranges(glp\_prob *P, int len, const int list[], int flags,\\ \hspace*{134pt}const char *fname);} \description The routine \verb|glp_print_ranges| performs sensitivity analysis of current optimal basic solution and writes the analysis report in human-readable format to a text file, whose name is the character string {\it fname}. (Detailed description of the report structure is given below.) The parameter {\it len} specifies the length of the row/column list. The array {\it list} specifies ordinal number of rows and columns to be analyzed. The ordinal numbers should be passed in locations {\it list}[1], {\it list}[2], \dots, {\it list}[{\it len}]. Ordinal numbers from 1 to $m$ refer to rows, and ordinal numbers from $m+1$ to $m+n$ refer to columns, where $m$ and $n$ are, resp., the total number of rows and columns in the problem object. Rows and columns appear in the analysis report in the same order as they follow in the array list. It is allowed to specify $len=0$, in which case the array {\it list} is not used (so it can be specified as \verb|NULL|), and the routine performs analysis for all rows and columns of the problem object. The parameter {\it flags} is reserved for use in the future and must be specified as zero. On entry to the routine \verb|glp_print_ranges| the current basic solution must be optimal and the basis factorization must exist. The application program can check that with the routine \verb|glp_bf_exists|, and if the factorization does not exist, compute it with the routine \verb|glp_factorize|. Note that if the LP preprocessor is not used, on normal exit from the simplex solver routine \verb|glp_simplex| the basis factorization always exists. \returns If the operation was successful, the routine \verb|glp_print_ranges| returns zero. Otherwise, it prints an error message and returns non-zero. \para{Analysis report example} An example of the sensitivity analysis report is shown on the next two pages. This example corresponds to the example of LP problem described in Subsection ``Example of MPS file''. \para{Structure of the analysis report} For each row and column specified in the array {\it list} the routine prints two lines containing generic information and analysis information, which depends on the status of corresponding row or column. Note that analysis of a row is analysis of its auxiliary variable, which is equal to the row linear form $\sum a_jx_j$, and analysis of a column is analysis of corresponding structural variable. Therefore, formally, on performing the sensitivity analysis there is no difference between rows and columns. \newpage \begin{landscape} \begin{footnotesize} \begin{verbatim} GLPK 4.42 - SENSITIVITY ANALYSIS REPORT Page 1 Problem: PLAN Objective: VALUE = 296.2166065 (MINimum) No. Row name St Activity Slack Lower bound Activity Obj coef Obj value at Limiting Marginal Upper bound range range break point variable ------ ------------ -- ------------- ------------- ------------- ------------- ------------- ------------- ------------ 1 VALUE BS 296.21661 -296.21661 -Inf 299.25255 -1.00000 . MN . +Inf 296.21661 +Inf +Inf 2 YIELD NS 2000.00000 . 2000.00000 1995.06864 -Inf 296.28365 BIN3 -.01360 2000.00000 2014.03479 +Inf 296.02579 CU 3 FE NU 60.00000 . -Inf 55.89016 -Inf 306.77162 BIN4 -2.56823 60.00000 62.69978 2.56823 289.28294 BIN3 4 CU BS 83.96751 16.03249 -Inf 93.88467 -.30613 270.51157 MN . 100.00000 79.98213 .21474 314.24798 BIN5 5 MN NU 40.00000 . -Inf 34.42336 -Inf 299.25255 BIN4 -.54440 40.00000 41.68691 .54440 295.29825 BIN3 6 MG BS 19.96029 10.03971 -Inf 24.74427 -1.79618 260.36433 BIN1 . 30.00000 9.40292 .28757 301.95652 MN 7 AL NL 1500.00000 . 1500.00000 1485.78425 -.25199 292.63444 CU .25199 +Inf 1504.92126 +Inf 297.45669 BIN3 8 SI NL 250.00000 50.00000 250.00000 235.32871 -.48520 289.09812 CU .48520 300.00000 255.06073 +Inf 298.67206 BIN3 \end{verbatim} \end{footnotesize} \end{landscape} \newpage \begin{landscape} \begin{footnotesize} \begin{verbatim} GLPK 4.42 - SENSITIVITY ANALYSIS REPORT Page 2 Problem: PLAN Objective: VALUE = 296.2166065 (MINimum) No. Column name St Activity Obj coef Lower bound Activity Obj coef Obj value at Limiting Marginal Upper bound range range break point variable ------ ------------ -- ------------- ------------- ------------- ------------- ------------- ------------- ------------ 1 BIN1 NL . .03000 . -28.82475 -.22362 288.90594 BIN4 .25362 200.00000 33.88040 +Inf 304.80951 BIN4 2 BIN2 BS 665.34296 .08000 . 802.22222 .01722 254.44822 BIN1 . 2500.00000 313.43066 .08863 301.95652 MN 3 BIN3 BS 490.25271 .17000 400.00000 788.61314 .15982 291.22807 MN . 800.00000 -347.42857 .17948 300.86548 BIN5 4 BIN4 BS 424.18773 .12000 100.00000 710.52632 .10899 291.54745 MN . 700.00000 -256.15524 .14651 307.46010 BIN1 5 BIN5 NL . .15000 . -201.78739 .13544 293.27940 BIN3 .01456 1500.00000 58.79586 +Inf 297.07244 BIN3 6 ALUM BS 299.63899 .21000 . 358.26772 .18885 289.87879 AL . +Inf 112.40876 .22622 301.07527 MN 7 SILICON BS 120.57762 .38000 . 124.27093 .14828 268.27586 BIN5 . +Inf 85.54745 .46667 306.66667 MN End of report \end{verbatim} \end{footnotesize} \end{landscape} \newpage \noindent {\it Generic information} {\tt No.} is the row or column ordinal number in the problem object. Rows are numbered from 1 to $m$, and columns are numbered from 1 to $n$, where $m$ and $n$ are, resp., the total number of rows and columns in the problem object. {\tt Row name} is the symbolic name assigned to the row. If the row has no name assigned, this field contains blanks. {\tt Column name} is the symbolic name assigned to the column. If the column has no name assigned, this field contains blanks. {\tt St} is the status of the row or column in the optimal solution: {\tt BS} --- non-active constraint (row), basic column; {\tt NL} --- inequality constraint having its lower right-hand side active (row), non-basic column having its lower bound active; {\tt NU} --- inequality constraint having its upper right-hand side active (row), non-basic column having its upper bound active; {\tt NS} --- active equality constraint (row), non-basic fixed column. {\tt NF} --- active free row, non-basic free (unbounded) column. (This case means that the optimal solution is dual degenerate.) {\tt Activity} is the (primal) value of the auxiliary variable (row) or structural variable (column) in the optimal solution. {\tt Slack} is the (primal) value of the row slack variable. {\tt Obj coef} is the objective coefficient of the column (structural variable). {\tt Marginal} is the reduced cost (dual activity) of the auxiliary variable (row) or structural variable (column). {\tt Lower bound} is the lower right-hand side (row) or lower bound (column). If the row or column has no lower bound, this field contains {\tt -Inf}. {\tt Upper bound} is the upper right-hand side (row) or upper bound (column). If the row or column has no upper bound, this field contains {\tt +Inf}. \noindent {\it Sensitivity analysis of active bounds} The sensitivity analysis of active bounds is performed only for rows, which are active constraints, and only for non-basic columns, because inactive constraints and basic columns have no active bounds. For every auxiliary (row) or structural (column) non-basic variable the routine starts changing its active bound in both direction. The first of the two lines in the report corresponds to decreasing, and the second line corresponds to increasing of the active bound. Since the variable being analyzed is non-basic, its activity, which is equal to its active bound, also starts changing. This changing leads to changing of basic (auxiliary and structural) variables, which depend on the non-basic variable. The current basis remains primal feasible and therefore optimal while values of all basic variables are primal feasible, i.e. are within their bounds. Therefore, if some basic variable called the {\it limiting variable} reaches its (lower or upper) bound first, before any other basic variables, it thereby limits further changing of the non-basic variable, because otherwise the current basis would become primal infeasible. The point, at which this happens, is called the {\it break point}. Note that there are two break points: the lower break point, which corresponds to decreasing of the non-basic variable, and the upper break point, which corresponds to increasing of the non-basic variable. In the analysis report values of the non-basic variable (i.e. of its active bound) being analyzed at both lower and upper break points are printed in the field `{\tt Activity range}'. Corresponding values of the objective function are printed in the field `{\tt Obj value at break point}', and symbolic names of corresponding limiting basic variables are printed in the field `{\tt Limiting variable}'. If the active bound can decrease or/and increase unlimitedly, the field `{\tt Activity range}' contains {\tt -Inf} or/and {\tt +Inf}, resp. For example (see the example report above), row SI is a double-sided constraint, which is active on its lower bound (right-hand side), and its activity in the optimal solution being equal to the lower bound is 250. The activity range for this row is $[235.32871,255.06073]$. This means that the basis remains optimal while the lower bound is increasing up to 255.06073, and further increasing is limited by (structural) variable BIN3. If the lower bound reaches this upper break point, the objective value becomes equal to 298.67206. Note that if the basis does not change, the objective function depends on the non-basic variable linearly, and the per-unit change of the objective function is the reduced cost (marginal value) of the non-basic variable. \noindent {\it Sensitivity analysis of objective coefficients at non-basic variables} The sensitivity analysis of the objective coefficient at a non-basic variable is quite simple, because in this case change in the objective coefficient leads to equivalent change in the reduced cost (marginal value). For every auxiliary (row) or structural (column) non-basic variable the routine starts changing its objective coefficient in both direction. (Note that auxiliary variables are not included in the objective function and therefore always have zero objective coefficients.) The first of the two lines in the report corresponds to decreasing, and the second line corresponds to increasing of the objective coefficient. This changing leads to changing of the reduced cost of the non-basic variable to be analyzed and does affect reduced costs of all other non-basic variables. The current basis remains dual feasible and therefore optimal while the reduced cost keeps its sign. Therefore, if the reduced cost reaches zero, it limits further changing of the objective coefficient (if only the non-basic variable is non-fixed). In the analysis report minimal and maximal values of the objective coefficient, on which the basis remains optimal, are printed in the field `\verb|Obj coef range|'. If the objective coefficient can decrease or/and increase unlimitedly, this field contains {\tt -Inf} or/and {\tt +Inf}, resp. For example (see the example report above), column BIN5 is non-basic having its lower bound active. Its objective coefficient is 0.15, and reduced cost in the optimal solution 0.01456. The column lower bound remains active while the column reduced cost remains non-negative, thus, minimal value of the objective coefficient, on which the current basis still remains optimal, is $0.15-0.01456=0.13644$, that is indicated in the field `\verb|Obj coef range|'. %\newpage %{\parskip=0pt \noindent {\it Sensitivity analysis of objective coefficients at basic variables} %\medskip To perform sensitivity analysis for every auxiliary (row) or structural (column) variable the routine starts changing its objective coefficient in both direction. (Note that auxiliary variables are not included in the objective function and therefore always have zero objective coefficients.) The first of the two lines in the report corresponds to decreasing, and the second line corresponds to increasing of the objective coefficient. This changing leads to changing of reduced costs of non-basic variables. The current basis remains dual feasible and therefore optimal while reduced costs of all non-basic variables (except fixed variables) keep their signs. Therefore, if the reduced cost of some non-basic non-fixed variable called the {\it limiting variable} reaches zero first, before reduced cost of any other non-basic non-fixed variable, it thereby limits further changing of the objective coefficient, because otherwise the current basis would become dual infeasible (non-optimal). The point, at which this happens, is called the {\it break point}. Note that there are two break points: the lower break point, which corresponds to decreasing of the objective coefficient, and the upper break point, which corresponds to increasing of the objective coefficient. Let the objective coefficient reach its limit value and continue changing a bit further in the same direction that makes the current basis dual infeasible (non-optimal). Then the reduced cost of the non-basic limiting variable becomes ``a bit'' dual infeasible that forces the limiting variable to enter the basis replacing there some basic variable, which leaves the basis to keep its primal feasibility. It should be understood that if we change the current basis in this way exactly at the break point, both the current and adjacent bases will be optimal with the same objective value, because at the break point the limiting variable has zero reduced cost. On the other hand, in the adjacent basis the value of the limiting variable changes, because there it becomes basic, that leads to changing of the value of the basic variable being analyzed. Note that on determining the adjacent basis the bounds of the analyzed basic variable are ignored as if it were a free (unbounded) variable, so it cannot leave the current basis. In the analysis report lower and upper limits of the objective coefficient at the basic variable being analyzed, when the basis remains optimal, are printed in the field `{\tt Obj coef range}'. Corresponding values of the objective function at both lower and upper break points are printed in the field `{\tt Obj value at break point}', symbolic names of corresponding non-basic limiting variables are printed in the field `{\tt Limiting variable}', and values of the basic variable, which it would take on in the adjacent bases (as was explained above) are printed in the field `{\tt Activity range}'. If the objective coefficient can increase or/and decrease unlimitedly, the field `{\tt Obj coef range}' contains {\tt -Inf} and/or {\tt +Inf}, resp. It also may happen that no dual feasible adjacent basis exists (i.e. on entering the basis the limiting variable can increase or decrease unlimitedly), in which case the field `{\tt Activity range}' contains {\tt -Inf} and/or {\tt +Inf}. For example (see the example report above), structural variable (column) BIN3 is basic, its optimal value is 490.25271, and its objective coefficient is 0.17. The objective coefficient range for this column is $[0.15982,0.17948]$. This means that the basis remains optimal while the objective coefficient is decreasing down to 0.15982, and further decreasing is limited by (auxiliary) variable MN. If we make the objective coefficient a bit less than 0.15982, the limiting variable MN will enter the basis, and in that adjacent basis the structural variable BIN3 will take on new optimal value 788.61314. At the lower break point, where the objective coefficient is exactly 0.15982, the objective function takes on the value 291.22807 in both the current and adjacent bases. Note that if the basis does not change, the objective function depends on the objective coefficient at the basic variable linearly, and the per-unit change of the objective function is the value of the basic variable. %} %* eof *% glpk-5.0/doc/glpk04.tex0000644000062000006210000014743313766346220014106 0ustar maomkpasswd%* glpk04.tex *% \chapter{Advanced API Routines} \section{Background} \label{basbgd} Using vector and matrix notations the LP problem (1.1)---(1.3) (see Section \ref{seclp}, page \pageref{seclp}) can be stated as follows: \noindent \hspace{.5in} minimize (or maximize) $$z=c^Tx_S+c_0\eqno(3.1)$$ \hspace{.5in} subject to linear constraints $$x_R=Ax_S\eqno(3.2)$$ \hspace{.5in} and bounds of variables $$ \begin{array}{l@{\ }c@{\ }l@{\ }c@{\ }l} l_R&\leq&x_R&\leq&u_R\\ l_S&\leq&x_S&\leq&u_S\\ \end{array}\eqno(3.3) $$ where: $x_R=(x_1,\dots,x_m)$ is the vector of auxiliary variables; $x_S=(x_{m+1},\dots,x_{m+n})$ is the vector of structural variables; $z$ is the objective function; $c=(c_1,\dots,c_n)$ is the vector of objective coefficients; $c_0$ is the constant term (``shift'') of the objective function; $A=(a_{11},\dots,a_{mn})$ is the constraint matrix; $l_R=(l_1,\dots,l_m)$ is the vector of lower bounds of auxiliary variables; $u_R=(u_1,\dots,u_m)$ is the vector of upper bounds of auxiliary variables; $l_S=(l_{m+1},\dots,l_{m+n})$ is the vector of lower bounds of structural variables; $u_S=(u_{m+1},\dots,u_{m+n})$ is the vector of upper bounds of structural variables. From the simplex method's standpoint there is no difference between auxiliary and structural variables. This allows combining all these variables into one vector that leads to the following problem statement: \newpage \noindent \hspace{.5in} minimize (or maximize) $$z=(0\ |\ c)^Tx+c_0\eqno(3.4)$$ \hspace{.5in} subject to linear constraints $$(I\ |-\!A)x=0\eqno(3.5)$$ \hspace{.5in} and bounds of variables $$l\leq x\leq u\eqno(3.6)$$ where: $x=(x_R\ |\ x_S)$ is the $(m+n)$-vector of (all) variables; $(0\ |\ c)$ is the $(m+n)$-vector of objective coefficients;\footnote{Subvector 0 corresponds to objective coefficients at auxiliary variables.} $(I\ |-\!A)$ is the {\it augmented} constraint $m\times(m+n)$-matrix;\footnote{Note that due to auxiliary variables matrix $(I\ |-\!A)$ contains the unity submatrix and therefore has full rank. This means, in particular, that the system (3.5) has no linearly dependent constraints.} $l=(l_R\ |\ l_S)$ is the $(m+n)$-vector of lower bounds of (all) variables; $u=(u_R\ |\ u_S)$ is the $(m+n)$-vector of upper bounds of (all) variables. By definition an {\it LP basic solution} geometrically is a point in the space of all variables, which is the intersection of hyperplanes corresponding to active constraints\footnote{A constraint is called {\it active} if at a given point it is satisfied as equality, otherwise it is called {\it inactive}.}. The space of all variables has the dimension $m+n$, therefore, to define some basic solution we have to define $m+n$ active constraints. Note that $m$ constraints (3.5) being linearly independent equalities are always active, so remaining $n$ active constraints can be chosen only from bound constraints (3.6). A variable is called {\it non-basic}, if its (lower or upper) bound is active, otherwise it is called {\it basic}. Since, as was said above, exactly $n$ bound constraints must be active, in any basic solution there are always $n$ non-basic variables and $m$ basic variables. (Note that a free variable also can be non-basic. Although such variable has no bounds, we can think it as the difference between two non-negative variables, which both are non-basic in this case.) Now consider how to determine numeric values of all variables for a given basic solution. Let $\Pi$ be an appropriate permutation matrix of the order $(m+n)$. Then we can write: $$\left(\begin{array}{@{}c@{}}x_B\\x_N\\\end{array}\right)= \Pi\left(\begin{array}{@{}c@{}}x_R\\x_S\\\end{array}\right)=\Pi x, \eqno(3.7)$$ where $x_B$ is the vector of basic variables, $x_N$ is the vector of non-basic variables, $x=(x_R\ |\ x_S)$ is the vector of all variables in the original order. In this case the system of linear constraints (3.5) can be rewritten as follows: $$(I\ |-\!A)\Pi^T\Pi x=0\ \ \ \Rightarrow\ \ \ (B\ |\ N) \left(\begin{array}{@{}c@{}}x_B\\x_N\\\end{array}\right)=0,\eqno(3.8)$$ where $$(B\ |\ N)=(I\ |-\!A)\Pi^T.\eqno(3.9)$$ %\newpage Matrix $B$ is a square non-singular $m\times m$-matrix, which is composed from columns of the augmented constraint matrix corresponding to basic variables. It is called the {\it basis matrix} or simply the {\it basis}. Matrix $N$ is a rectangular $m\times n$-matrix, which is composed from columns of the augmented constraint matrix corresponding to non-basic variables. From (3.8) it follows that: $$Bx_B+Nx_N=0,\eqno(3.10)$$ therefore, $$x_B=-B^{-1}Nx_N.\eqno(3.11)$$ Thus, the formula (3.11) shows how to determine numeric values of basic variables $x_B$ assuming that non-basic variables $x_N$ are fixed on their active bounds. The $m\times n$-matrix $$\Xi=-B^{-1}N,\eqno(3.12)$$ which appears in (3.11), is called the {\it simplex tableau}.\footnote{This definition corresponds to the GLPK implementation.} It shows how basic variables depend on non-basic variables: $$x_B=\Xi x_N.\eqno(3.13)$$ The system (3.13) is equivalent to the system (3.5) in the sense that they both define the same set of points in the space of (primal) variables, which satisfy to these systems. If, moreover, values of all basic variables satisfy to their bound constraints (3.3), the corresponding basic solution is called {\it (primal) feasible}, otherwise {\it (primal) infeasible}. It is understood that any (primal) feasible basic solution satisfy to all constraints (3.2) and (3.3). The LP theory says that if LP has optimal solution, it has (at least one) basic feasible solution, which corresponds to the optimum. And the most natural way to determine whether a given basic solution is optimal or not is to use the Karush---Kuhn---Tucker optimality conditions. \def\arraystretch{1.5} For the problem statement (3.4)---(3.6) the optimality conditions are the following:\footnote{These conditions can be appiled to any solution, not only to a basic solution.} $$(I\ |-\!A)x=0\eqno(3.14)$$ $$(I\ |-\!A)^T\pi+\lambda_l+\lambda_u=\nabla z=(0\ |\ c)^T\eqno(3.15)$$ $$l\leq x\leq u\eqno(3.16)$$ $$\lambda_l\geq 0,\ \ \lambda_u\leq 0\ \ \mbox{(minimization)} \eqno(3.17)$$ $$\lambda_l\leq 0,\ \ \lambda_u\geq 0\ \ \mbox{(maximization)} \eqno(3.18)$$ $$(\lambda_l)_k(x_k-l_k)=0,\ \ (\lambda_u)_k(x_k-u_k)=0,\ \ k=1,2,\dots, m+n\eqno(3.19)$$ where: $\pi=(\pi_1,\dots,\pi_m)$ is a $m$-vector of Lagrange multipliers for equality constraints (3.5); $\lambda_l=[(\lambda_l)_1,\dots,(\lambda_l)_n]$ is a $n$-vector of Lagrange multipliers for lower bound constraints (3.6); $\lambda_u=[(\lambda_u)_1,\dots,(\lambda_u)_n]$ is a $n$-vector of Lagrange multipliers for upper bound constraints (3.6). %\newpage Condition (3.14) is the {\it primal} (original) system of equality constraints (3.5). Condition (3.15) is the {\it dual} system of equality constraints. It requires the gradient of the objective function to be a linear combination of normals to the planes defined by constraints of the original problem. Condition (3.16) is the primal (original) system of bound constraints (3.6). Condition (3.17) (or (3.18) in case of maximization) is the dual system of bound constraints. Condition (3.19) is the {\it complementary slackness condition}. It requires, for each original (auxiliary or structural) variable $x_k$, that either its (lower or upper) bound must be active, or zero bound of the corresponding Lagrange multiplier ($(\lambda_l)_k$ or $(\lambda_u)_k$) must be active. In GLPK two multipliers $(\lambda_l)_k$ and $(\lambda_u)_k$ for each primal variable $x_k$, $k=1,\dots,m+n$, are combined into one multiplier: $$\lambda_k=(\lambda_l)_k+(\lambda_u)_k,\eqno(3.20)$$ which is called a {\it dual variable} for $x_k$. This {\it cannot} lead to an ambiguity, because both lower and upper bounds of $x_k$ cannot be active at the same time,\footnote{If $x_k$ is a fixed variable, we can think it as double-bounded variable $l_k\leq x_k\leq u_k$, where $l_k=u_k.$} so at least one of $(\lambda_l)_k$ and $(\lambda_u)_k$ must be equal to zero, and because these multipliers have different signs, the combined multiplier, which is their sum, uniquely defines each of them. \def\arraystretch{1} Using dual variables $\lambda_k$ the dual system of bound constraints (3.17) and (3.18) can be written in the form of so called {\it ``rule of signs''} as follows: \medskip \begin{center} \begin{tabular}{|@{\,}c@{$\,$}|@{$\,$}c@{$\,$}|@{$\,$}c@{$\,$}| @{$\,$}c|c@{$\,$}|@{$\,$}c@{$\,$}|@{$\,$}c@{$\,$}|} \hline Original bound&\multicolumn{3}{c|}{Minimization}&\multicolumn{3}{c|} {Maximization}\\ \cline{2-7} constraint&$(\lambda_l)_k$&$(\lambda_u)_k$&$(\lambda_l)_k+ (\lambda_u)_k$&$(\lambda_l)_k$&$(\lambda_u)_k$&$(\lambda_l)_k+ (\lambda_u)_k$\\ \hline $-\infty= {\tt piv\_tol}\cdot\max|u_{i*}|$, i.e. if it is not very small in the magnitude among other elements in the same row. Decreasing this parameter may lead to better sparsity at the expense of numerical accuracy, and vice versa. \medskip {\tt int piv\_lim} (default: {\tt 4}) This parameter is used on computing $LU$-factorization of the basis matrix and specifies how many pivot candidates needs to be considered on choosing a pivot element, \verb|piv_lim| $\geq$ 1. If \verb|piv_lim| candidates have been considered, the pivoting routine prematurely terminates the search with the best candidate found. \medskip {\tt int suhl} (default: {\tt GLP\_ON}) This parameter is used on computing $LU$-factorization of the basis matrix. Being set to {\tt GLP\_ON} it enables applying the following heuristic proposed by Uwe Suhl: if a column of the active submatrix has no eligible pivot candidates, it is no more considered until it becomes a column singleton. In many cases this allows reducing the time needed for pivot searching. To disable this heuristic the parameter \verb|suhl| should be set to {\tt GLP\_OFF}. \medskip {\tt double eps\_tol} (default: {\tt 1e-15}) Epsilon tolerance, \verb|eps_tol| $\geq$ 0, used on computing $LU$-factorization of the basis matrix. If an element of the active submatrix of factor $U$ is less than \verb|eps_tol| in the magnitude, it is replaced by exact zero. %\medskip % %{\tt double max\_gro} (default: {\tt 1e+10}) % %Maximal growth of elements of factor $U$, \verb|max_gro| $\geq$ 1, %allowable on computing $LU$-factorization of the basis matrix. If on %some elimination step the ratio $u_{big}/b_{max}$ (where $u_{big}$ is %the largest magnitude of elements of factor $U$ appeared in its active %submatrix during all the factorization process, $b_{max}$ is the %largest magnitude of elements of the basis matrix to be factorized), %the basis matrix is considered as ill-conditioned. \medskip {\tt int nfs\_max} (default: {\tt 100}) Maximal number of additional row-like factors (entries of the eta file), \verb|nfs_max| $\geq$ 1, which can be added to $LU$-factorization of the basis matrix on updating it with the Forrest--Tomlin technique. This parameter is used only once, before $LU$-factorization is computed for the first time, to allocate working arrays. As a rule, each update adds one new factor (however, some updates may need no addition), so this parameter limits the number of updates between refactorizations. \medskip {\tt double upd\_tol} (default: {\tt 1e-6}) Update tolerance, 0 $<$ \verb|upd_tol| $<$ 1, used on updating $LU$-factorization of the basis matrix with the Forrest--Tomlin technique. If after updating the magnitude of some diagonal element $u_{kk}$ of factor $U$ becomes less than ${\tt upd\_tol}\cdot\max(|u_{k*}|, |u_{*k}|)$, the factorization is considered as inaccurate. \medskip {\tt int nrs\_max} (default: {\tt 100}) Maximal number of additional rows and columns, \verb|nrs_max| $\geq$ 1, which can be added to $LU$-factorization of the basis matrix on updating it with the Schur complement technique. This parameter is used only once, before $LU$-factorization is computed for the first time, to allocate working arrays. As a rule, each update adds one new row and column (however, some updates may need no addition), so this parameter limits the number of updates between refactorizations. %\medskip % %{\tt int rs\_size} (default: {\tt 0}) % %The initial size of the Sparse Vector Area, in non-zeros, used to %store non-zero elements of additional rows and columns introduced on %updating $LU$-factorization of the basis matrix with the Schur %complement technique. If this parameter is set to 0, the initial SVA %size is determined automatically. \subsection{glp\_get\_bhead --- retrieve the basis header information} \synopsis \begin{verbatim} int glp_get_bhead(glp_prob *P, int k); \end{verbatim} \description The routine \verb|glp_get_bhead| returns the basis header information for the current basis associated with the specified problem object. \returns If basic variable $(x_B)_k$, $1\leq k\leq m$, is $i$-th auxiliary variable ($1\leq i\leq m$), the routine returns $i$. Otherwise, if $(x_B)_k$ is $j$-th structural variable ($1\leq j\leq n$), the routine returns $m+j$. Here $m$ is the number of rows and $n$ is the number of columns in the problem object. \para{Comments} Sometimes the application program may need to know which original (auxiliary and structural) variable correspond to a given basic variable, or, that is the same, which column of the augmented constraint matrix $(I\ |-\!A)$ correspond to a given column of the basis matrix $B$. \def\arraystretch{1} The correspondence is defined as follows:\footnote{For more details see Subsection \ref{basbgd}, page \pageref{basbgd}.} $$\left(\begin{array}{@{}c@{}}x_B\\x_N\\\end{array}\right)= \Pi\left(\begin{array}{@{}c@{}}x_R\\x_S\\\end{array}\right) \ \ \Leftrightarrow \ \ \left(\begin{array}{@{}c@{}}x_R\\x_S\\\end{array}\right)= \Pi^T\left(\begin{array}{@{}c@{}}x_B\\x_N\\\end{array}\right),$$ where $x_B$ is the vector of basic variables, $x_N$ is the vector of non-basic variables, $x_R$ is the vector of auxiliary variables following in their original order,\footnote{The original order of auxiliary and structural variables is defined by the ordinal numbers of corresponding rows and columns in the problem object.} $x_S$ is the vector of structural variables following in their original order, $\Pi$ is a permutation matrix (which is a component of the basis factorization). Thus, if $(x_B)_k=(x_R)_i$ is $i$-th auxiliary variable, the routine returns $i$, and if $(x_B)_k=(x_S)_j$ is $j$-th structural variable, the routine returns $m+j$, where $m$ is the number of rows in the problem object. \subsection{glp\_get\_row\_bind --- retrieve row index in the basis header} \synopsis \begin{verbatim} int glp_get_row_bind(glp_prob *P, int i); \end{verbatim} \returns The routine \verb|glp_get_row_bind| returns the index $k$ of basic variable $(x_B)_k$, $1\leq k\leq m$, which is $i$-th auxiliary variable (that is, the auxiliary variable corresponding to $i$-th row), $1\leq i\leq m$, in the current basis associated with the specified problem object, where $m$ is the number of rows. However, if $i$-th auxiliary variable is non-basic, the routine returns zero. \para{Comments} The routine \verb|glp_get_row_bind| is an inversion of the routine \verb|glp_get_bhead|; that is, if \linebreak \verb|glp_get_bhead|$(P,k)$ returns $i$, \verb|glp_get_row_bind|$(P,i)$ returns $k$, and vice versa. \subsection{glp\_get\_col\_bind --- retrieve column index in the basis header} \synopsis \begin{verbatim} int glp_get_col_bind(glp_prob *P, int j); \end{verbatim} \returns The routine \verb|glp_get_col_bind| returns the index $k$ of basic variable $(x_B)_k$, $1\leq k\leq m$, which is $j$-th structural variable (that is, the structural variable corresponding to $j$-th column), $1\leq j\leq n$, in the current basis associated with the specified problem object, where $m$ is the number of rows, $n$ is the number of columns. However, if $j$-th structural variable is non-basic, the routine returns zero. \para{Comments} The routine \verb|glp_get_col_bind| is an inversion of the routine \verb|glp_get_bhead|; that is, if \linebreak \verb|glp_get_bhead|$(P,k)$ returns $m+j$, \verb|glp_get_col_bind|$(P,j)$ returns $k$, and vice versa. \subsection{glp\_ftran --- perform forward transformation} \synopsis \begin{verbatim} void glp_ftran(glp_prob *P, double x[]); \end{verbatim} \description The routine \verb|glp_ftran| performs forward transformation (FTRAN), i.e. it solves the system $Bx=b$, where $B$ is the basis matrix associated with the specified problem object, $x$ is the vector of unknowns to be computed, $b$ is the vector of right-hand sides. On entry to the routine elements of the vector $b$ should be stored in locations \verb|x[1]|, \dots, \verb|x[m]|, where $m$ is the number of rows. On exit the routine stores elements of the vector $x$ in the same locations. \subsection{glp\_btran --- perform backward transformation} \synopsis \begin{verbatim} void glp_btran(glp_prob *P, double x[]); \end{verbatim} \description The routine \verb|glp_btran| performs backward transformation (BTRAN), i.e. it solves the system $B^Tx=b$, where $B^T$ is a matrix transposed to the basis matrix $B$ associated with the specified problem object, $x$ is the vector of unknowns to be computed, $b$ is the vector of right-hand sides. On entry to the routine elements of the vector $b$ should be stored in locations \verb|x[1]|, \dots, \verb|x[m]|, where $m$ is the number of rows. On exit the routine stores elements of the vector $x$ in the same locations. \subsection{glp\_warm\_up --- ``warm up'' LP basis} \synopsis \begin{verbatim} int glp_warm_up(glp_prob *P); \end{verbatim} \description The routine \verb|glp_warm_up| ``warms up'' the LP basis for the specified problem object using current statuses assigned to rows and columns (that is, to auxiliary and structural variables). This operation includes computing factorization of the basis matrix (if it does not exist), computing primal and dual components of basic solution, and determining the solution status. \returns \begin{retlist} 0 & The operation has been successfully performed.\\ \verb|GLP_EBADB| & The basis matrix is invalid, because the number of basic (auxiliary and structural) variables is not the same as the number of rows in the problem object.\\ \verb|GLP_ESING| & The basis matrix is singular within the working precision.\\ \verb|GLP_ECOND| & The basis matrix is ill-conditioned, i.e. its condition number is too large.\\ \end{retlist} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newpage \section{Simplex tableau routines} \subsection{glp\_eval\_tab\_row --- compute row of the tableau} \synopsis \begin{verbatim} int glp_eval_tab_row(glp_prob *P, int k, int ind[], double val[]); \end{verbatim} \description The routine \verb|glp_eval_tab_row| computes a row of the current simplex tableau (see Subsection 3.1.1, formula (3.12)), which (row) corresponds to some basic variable specified by the parameter $k$ as follows: if $1\leq k\leq m$, the basic variable is $k$-th auxiliary variable, and if $m+1\leq k\leq m+n$, the basic variable is $(k-m)$-th structural variable, where $m$ is the number of rows and $n$ is the number of columns in the specified problem object. The basis factorization must exist. The computed row shows how the specified basic variable depends on non-basic variables: $$x_k=(x_B)_i=\xi_{i1}(x_N)_1+\xi_{i2}(x_N)_2+\dots+\xi_{in}(x_N)_n,$$ where $\xi_{i1}$, $\xi_{i2}$, \dots, $\xi_{in}$ are elements of the simplex table row, $(x_N)_1$, $(x_N)_2$, \dots, $(x_N)_n$ are non-basic (auxiliary and structural) variables. The routine stores column indices and corresponding numeric values of non-zero elements of the computed row in unordered sparse format in locations \verb|ind[1]|, \dots, \verb|ind[len]| and \verb|val[1]|, \dots, \verb|val[len]|, respectively, where $0\leq{\tt len}\leq n$ is the number of non-zero elements in the row returned on exit. Element indices stored in the array \verb|ind| have the same sense as index $k$, i.e. indices 1 to $m$ denote auxiliary variables while indices $m+1$ to $m+n$ denote structural variables (all these variables are obviously non-basic by definition). \returns The routine \verb|glp_eval_tab_row| returns \verb|len|, which is the number of non-zero elements in the simplex table row stored in the arrays \verb|ind| and \verb|val|. \para{Comments} A row of the simplex table is computed as follows. At first, the routine checks that the specified variable $x_k$ is basic and uses the permutation matrix $\Pi$ (3.7) to determine index $i$ of basic variable $(x_B)_i$, which corresponds to $x_k$. The row to be computed is $i$-th row of the matrix $\Xi$ (3.12), therefore: $$\xi_i=e_i^T\Xi=-e_i^TB^{-1}N=-(B^{-T}e_i)^TN,$$ where $e_i$ is $i$-th unity vector. So the routine performs BTRAN to obtain $i$-th row of the inverse $B^{-1}$: $$\varrho_i=B^{-T}e_i,$$ and then computes elements of the simplex table row as inner products: $$\xi_{ij}=-\varrho_i^TN_j,\ \ j=1,2,\dots,n,$$ where $N_j$ is $j$-th column of matrix $N$ (3.9), which (column) corresponds to non-basic variable $(x_N)_j$. The permutation matrix $\Pi$ is used again to convert indices $j$ of non-basic columns to original ordinal numbers of auxiliary and structural variables. \subsection{glp\_eval\_tab\_col --- compute column of the tableau} \synopsis \begin{verbatim} int glp_eval_tab_col(glp_prob *P, int k, int ind[], double val[]); \end{verbatim} \description The routine \verb|glp_eval_tab_col| computes a column of the current simplex tableau (see Subsection 3.1.1, formula (3.12)), which (column) corresponds to some non-basic variable specified by the parameter $k$: if $1\leq k\leq m$, the non-basic variable is $k$-th auxiliary variable, and if $m+1\leq k\leq m+n$, the non-basic variable is $(k-m)$-th structural variable, where $m$ is the number of rows and $n$ is the number of columns in the specified problem object. The basis factorization must exist. The computed column shows how basic variables depends on the specified non-basic variable $x_k=(x_N)_j$: $$ \begin{array}{r@{\ }c@{\ }l@{\ }l} (x_B)_1&=&\dots+\xi_{1j}(x_N)_j&+\dots\\ (x_B)_2&=&\dots+\xi_{2j}(x_N)_j&+\dots\\ .\ \ .&.&.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\\ (x_B)_m&=&\dots+\xi_{mj}(x_N)_j&+\dots\\ \end{array} $$ where $\xi_{1j}$, $\xi_{2j}$, \dots, $\xi_{mj}$ are elements of the simplex table column, $(x_B)_1$, $(x_B)_2$, \dots, $(x_B)_m$ are basic (auxiliary and structural) variables. The routine stores row indices and corresponding numeric values of non-zero elements of the computed column in unordered sparse format in locations \verb|ind[1]|, \dots, \verb|ind[len]| and \verb|val[1]|, \dots, \verb|val[len]|, respectively, where $0\leq{\tt len}\leq m$ is the number of non-zero elements in the column returned on exit. Element indices stored in the array \verb|ind| have the same sense as index $k$, i.e. indices 1 to $m$ denote auxiliary variables while indices $m+1$ to $m+n$ denote structural variables (all these variables are obviously basic by definition). \returns The routine \verb|glp_eval_tab_col| returns \verb|len|, which is the number of non-zero elements in the simplex table column stored in the arrays \verb|ind| and \verb|val|. \para{Comments} A column of the simplex table is computed as follows. At first, the routine checks that the specified variable $x_k$ is non-basic and uses the permutation matrix $\Pi$ (3.7) to determine index $j$ of non-basic variable $(x_N)_j$, which corresponds to $x_k$. The column to be computed is $j$-th column of the matrix $\Xi$ (3.12), therefore: $$\Xi_j=\Xi e_j=-B^{-1}Ne_j=-B^{-1}N_j,$$ where $e_j$ is $j$-th unity vector, $N_j$ is $j$-th column of matrix $N$ (3.9). So the routine performs FTRAN to transform $N_j$ to the simplex table column $\Xi_j=(\xi_{ij})$ and uses the permutation matrix $\Pi$ to convert row indices $i$ to original ordinal numbers of auxiliary and structural variables. \newpage \subsection{glp\_transform\_row --- transform explicitly specified row} \synopsis \begin{verbatim} int glp_transform_row(glp_prob *P, int len, int ind[], double val[]); \end{verbatim} \description The routine \verb|glp_transform_row| performs the same operation as the routine \verb|glp_eval_tab_row| with exception that the row to be transformed is specified explicitly as a sparse vector. The explicitly specified row may be thought as a linear form: $$x=a_1x_{m+1}+a_2x_{m+2}+\dots+a_nx_{m+n},$$ where $x$ is an auxiliary variable for this row, $a_j$ are coefficients of the linear form, $x_{m+j}$ are structural variables. On entry column indices and numerical values of non-zero coefficients $a_j$ of the specified row should be placed in locations \verb|ind[1]|, \dots, \verb|ind[len]| and \verb|val[1]|, \dots, \verb|val[len]|, where \verb|len| is number of non-zero coefficients. This routine uses the system of equality constraints and the current basis in order to express the auxiliary variable $x$ through the current non-basic variables (as if the transformed row were added to the problem object and the auxiliary variable $x$ were basic), i.e. the resultant row has the form: $$x=\xi_1(x_N)_1+\xi_2(x_N)_2+\dots+\xi_n(x_N)_n,$$ where $\xi_j$ are influence coefficients, $(x_N)_j$ are non-basic (auxiliary and structural) variables, $n$ is the number of columns in the problem object. On exit the routine stores indices and numerical values of non-zero coefficients $\xi_j$ of the resultant row in locations \verb|ind[1]|, \dots, \verb|ind[len']| and \verb|val[1]|, \dots, \verb|val[len']|, where $0\leq{\tt len'}\leq n$ is the number of non-zero coefficients in the resultant row returned by the routine. Note that indices of non-basic variables stored in the array \verb|ind| correspond to original ordinal numbers of variables: indices 1 to $m$ mean auxiliary variables and indices $m+1$ to $m+n$ mean structural ones. \returns The routine \verb|glp_transform_row| returns \verb|len'|, the number of non-zero coefficients in the resultant row stored in the arrays \verb|ind| and \verb|val|. \newpage \subsection{glp\_transform\_col --- transform explicitly specified column} \synopsis \begin{verbatim} int glp_transform_col(glp_prob *P, int len, int ind[], double val[]); \end{verbatim} \description The routine \verb|glp_transform_col| performs the same operation as the routine \verb|glp_eval_tab_col| with exception that the column to be transformed is specified explicitly as a sparse vector. The explicitly specified column may be thought as it were added to the original system of equality constraints: $$ \begin{array}{l@{\ }c@{\ }r@{\ }c@{\ }r@{\ }c@{\ }r} x_1&=&a_{11}x_{m+1}&+\dots+&a_{1n}x_{m+n}&+&a_1x \\ x_2&=&a_{21}x_{m+1}&+\dots+&a_{2n}x_{m+n}&+&a_2x \\ \multicolumn{7}{c} {.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}\\ x_m&=&a_{m1}x_{m+1}&+\dots+&a_{mn}x_{m+n}&+&a_mx \\ \end{array} $$ where $x_i$ are auxiliary variables, $x_{m+j}$ are structural variables (presented in the problem object), $x$ is a structural variable for the explicitly specified column, $a_i$ are constraint coefficients at $x$. On entry row indices and numerical values of non-zero coefficients $a_i$ of the specified column should be placed in locations \verb|ind[1]|, \dots, \verb|ind[len]| and \verb|val[1]|, \dots, \verb|val[len]|, where \verb|len| is number of non-zero coefficients. This routine uses the system of equality constraints and the current basis in order to express the current basic variables through the structural variable $x$ (as if the transformed column were added to the problem object and the variable $x$ were non-basic): $$ \begin{array}{l@{\ }c@{\ }r} (x_B)_1&=\dots+&\xi_{1}x\\ (x_B)_2&=\dots+&\xi_{2}x\\ \multicolumn{3}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .}\\ (x_B)_m&=\dots+&\xi_{m}x\\ \end{array} $$ where $\xi_i$ are influence coefficients, $x_B$ are basic (auxiliary and structural) variables, $m$ is the number of rows in the problem object. On exit the routine stores indices and numerical values of non-zero coefficients $\xi_i$ of the resultant column in locations \verb|ind[1]|, \dots, \verb|ind[len']| and \verb|val[1]|, \dots, \verb|val[len']|, where $0\leq{\tt len'}\leq m$ is the number of non-zero coefficients in the resultant column returned by the routine. Note that indices of basic variables stored in the array \verb|ind| correspond to original ordinal numbers of variables, i.e. indices 1 to $m$ mean auxiliary variables, indices $m+1$ to $m+n$ mean structural ones. \returns The routine \verb|glp_transform_col| returns \verb|len'|, the number of non-zero coefficients in the resultant column stored in the arrays \verb|ind| and \verb|val|. \newpage \subsection{glp\_prim\_rtest --- perform primal ratio test} \synopsis \begin{verbatim} int glp_prim_rtest(glp_prob *P, int len, const int ind[], const double val[], int dir, double eps); \end{verbatim} \description The routine \verb|glp_prim_rtest| performs the primal ratio test using an explicitly specified column of the simplex table. The current basic solution associated with the LP problem object must be primal feasible. The explicitly specified column of the simplex table shows how the basic variables $x_B$ depend on some non-basic variable $x$ (which is not necessarily presented in the problem object): $$ \begin{array}{l@{\ }c@{\ }r} (x_B)_1&=\dots+&\xi_{1}x\\ (x_B)_2&=\dots+&\xi_{2}x\\ \multicolumn{3}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .}\\ (x_B)_m&=\dots+&\xi_{m}x\\ \end{array} $$ The column is specifed on entry to the routine in sparse format. Ordinal numbers of basic variables $(x_B)_i$ should be placed in locations \verb|ind[1]|, \dots, \verb|ind[len]|, where ordinal number 1 to $m$ denote auxiliary variables, and ordinal numbers $m+1$ to $m+n$ denote structural variables. The corresponding non-zero coefficients $\xi_i$ should be placed in locations \verb|val[1]|, \dots, \verb|val[len]|. The arrays \verb|ind| and \verb|val| are not changed by the routine. The parameter \verb|dir| specifies direction in which the variable $x$ changes on entering the basis: $+1$ means increasing, $-1$ means decreasing. The parameter \verb|eps| is an absolute tolerance (small positive number, say, $10^{-9}$) used by the routine to skip $\xi_i$'s whose magnitude is less than \verb|eps|. The routine determines which basic variable (among those specified in \verb|ind[1]|, \dots, \verb|ind[len]|) reaches its (lower or upper) bound first before any other basic variables do, and which, therefore, should leave the basis in order to keep primal feasibility. \returns The routine \verb|glp_prim_rtest| returns the index, \verb|piv|, in the arrays \verb|ind| and \verb|val| corresponding to the pivot element chosen, $1\leq$ \verb|piv| $\leq$ \verb|len|. If the adjacent basic solution is primal unbounded, and therefore the choice cannot be made, the routine returns zero. \para{Comments} If the non-basic variable $x$ is presented in the LP problem object, the input column can be computed with the routine \verb|glp_eval_tab_col|; otherwise, it can be computed with the routine \verb|glp_transform_col|. \newpage \subsection{glp\_dual\_rtest --- perform dual ratio test} \synopsis \begin{verbatim} int glp_dual_rtest(glp_prob *P, int len, const int ind[], const double val[], int dir, double eps); \end{verbatim} \description The routine \verb|glp_dual_rtest| performs the dual ratio test using an explicitly specified row of the simplex table. The current basic solution associated with the LP problem object must be dual feasible. The explicitly specified row of the simplex table is a linear form that shows how some basic variable $x$ (which is not necessarily presented in the problem object) depends on non-basic variables $x_N$: $$x=\xi_1(x_N)_1+\xi_2(x_N)_2+\dots+\xi_n(x_N)_n.$$ The row is specified on entry to the routine in sparse format. Ordinal numbers of non-basic variables $(x_N)_j$ should be placed in locations \verb|ind[1]|, \dots, \verb|ind[len]|, where ordinal numbers 1 to $m$ denote auxiliary variables, and ordinal numbers $m+1$ to $m+n$ denote structural variables. The corresponding non-zero coefficients $\xi_j$ should be placed in locations \verb|val[1]|, \dots, \verb|val[len]|. The arrays \verb|ind| and \verb|val| are not changed by the routine. The parameter \verb|dir| specifies direction in which the variable $x$ changes on leaving the basis: $+1$ means that $x$ goes on its lower bound, so its reduced cost (dual variable) is increasing (minimization) or decreasing (maximization); $-1$ means that $x$ goes on its upper bound, so its reduced cost is decreasing (minimization) or increasing (maximization). The parameter \verb|eps| is an absolute tolerance (small positive number, say, $10^{-9}$) used by the routine to skip $\xi_j$'s whose magnitude is less than \verb|eps|. The routine determines which non-basic variable (among those specified in \verb|ind[1]|, \dots,\linebreak \verb|ind[len]|) should enter the basis in order to keep dual feasibility, because its reduced cost reaches the (zero) bound first before this occurs for any other non-basic variables. \returns The routine \verb|glp_dual_rtest| returns the index, \verb|piv|, in the arrays \verb|ind| and \verb|val| corresponding to the pivot element chosen, $1\leq$ \verb|piv| $\leq$ \verb|len|. If the adjacent basic solution is dual unbounded, and therefore the choice cannot be made, the routine returns zero. \para{Comments} If the basic variable $x$ is presented in the LP problem object, the input row can be computed\linebreak with the routine \verb|glp_eval_tab_row|; otherwise, it can be computed with the routine \linebreak \verb|glp_transform_row|. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newpage \section{Post-optimal analysis routines} \subsection{glp\_analyze\_bound --- analyze active bound of non-basic variable} \synopsis \begin{verbatim} void glp_analyze_bound(glp_prob *P, int k, double *limit1, int *var1, double *limit2, int *var2); \end{verbatim} \description The routine \verb|glp_analyze_bound| analyzes the effect of varying the active bound of specified non-basic variable. The non-basic variable is specified by the parameter $k$, where $1\leq k\leq m$ means auxiliary variable of corresponding row, and $m+1\leq k\leq m+n$ means structural variable (column). Note that the current basic solution must be optimal, and the basis factorization must exist. Results of the analysis have the following meaning. \verb|value1| is the minimal value of the active bound, at which the basis still remains primal feasible and thus optimal. \verb|-DBL_MAX| means that the active bound has no lower limit. \verb|var1| is the ordinal number of an auxiliary (1 to $m$) or structural ($m+1$ to $m+n$) basic variable, which reaches its bound first and thereby limits further decreasing the active bound being analyzed. if \verb|value1| = \verb|-DBL_MAX|, \verb|var1| is set to 0. \verb|value2| is the maximal value of the active bound, at which the basis still remains primal feasible and thus optimal. \verb|+DBL_MAX| means that the active bound has no upper limit. \verb|var2| is the ordinal number of an auxiliary (1 to $m$) or structural ($m+1$ to $m+n$) basic variable, which reaches its bound first and thereby limits further increasing the active bound being analyzed. if \verb|value2| = \verb|+DBL_MAX|, \verb|var2| is set to 0. The parameters \verb|value1|, \verb|var1|, \verb|value2|, \verb|var2| can be specified as \verb|NULL|, in which case corresponding information is not stored. \subsection{glp\_analyze\_coef --- analyze objective coefficient at basic variable} \synopsis \begin{verbatim} void glp_analyze_coef(glp_prob *P, int k, double *coef1, int *var1, double *value1, double *coef2, int *var2, double *value2); \end{verbatim} \description The routine \verb|glp_analyze_coef| analyzes the effect of varying the objective coefficient at specified basic variable. The basic variable is specified by the parameter $k$, where $1\leq k\leq m$ means auxiliary variable of corresponding row, and $m+1\leq k\leq m+n$ means structural variable (column). Note that the current basic solution must be optimal, and the basis factorization must exist. Results of the analysis have the following meaning. \verb|coef1| is the minimal value of the objective coefficient, at which the basis still remains dual feasible and thus optimal. \verb|-DBL_MAX| means that the objective coefficient has no lower limit. \verb|var1| is the ordinal number of an auxiliary (1 to $m$) or structural ($m+1$ to $m+n$) non-basic variable, whose reduced cost reaches its zero bound first and thereby limits further decreasing the objective coefficient being analyzed. If \verb|coef1| = \verb|-DBL_MAX|, \verb|var1| is set to 0. \verb|value1| is value of the basic variable being analyzed in an adjacent basis, which is defined as follows. Let the objective coefficient reach its minimal value (\verb|coef1|) and continue decreasing. Then the reduced cost of the limiting non-basic variable (\verb|var1|) becomes dual infeasible and the current basis becomes non-optimal that forces the limiting non-basic variable to enter the basis replacing there some basic variable that leaves the basis to keep primal feasibility. Should note that on determining the adjacent basis current bounds of the basic variable being analyzed are ignored as if it were free (unbounded) variable, so it cannot leave the basis. It may happen that no dual feasible adjacent basis exists, in which case \verb|value1| is set to \verb|-DBL_MAX| or \verb|+DBL_MAX|. \verb|coef2| is the maximal value of the objective coefficient, at which the basis still remains dual feasible and thus optimal. \verb|+DBL_MAX| means that the objective coefficient has no upper limit. \verb|var2| is the ordinal number of an auxiliary (1 to $m$) or structural ($m+1$ to $m+n$) non-basic variable, whose reduced cost reaches its zero bound first and thereby limits further increasing the objective coefficient being analyzed. If \verb|coef2| = \verb|+DBL_MAX|, \verb|var2| is set to 0. \verb|value2| is value of the basic variable being analyzed in an adjacent basis, which is defined exactly in the same way as \verb|value1| above with exception that now the objective coefficient is increasing. The parameters \verb|coef1|, \verb|var1|, \verb|value1|, \verb|coef2|, \verb|var2|, \verb|value2| can be specified as \verb|NULL|, in which case corresponding information is not stored. %* eof *% glpk-5.0/doc/glpk05.tex0000644000062000006210000011247513766346220014105 0ustar maomkpasswd%* glpk05.tex *% \chapter{Branch-and-Cut API Routines} \section{Introduction} \subsection{Using the callback routine} The GLPK MIP solver based on the branch-and-cut method allows the application program to control the solution process. This is attained by means of the user-defined callback routine, which is called by the solver at various points of the branch-and-cut algorithm. The callback routine passed to the MIP solver should be written by the user and has the following specification:\footnote{The name {\tt foo\_bar} used here is a placeholder for the callback routine name.} \begin{verbatim} void foo_bar(glp_tree *T, void *info); \end{verbatim} \noindent where \verb|tree| is a pointer to the data structure \verb|glp_tree|, which should be used on subsequent calls to branch-and-cut interface routines, and \verb|info| is a transit pointer passed to the routine \verb|glp_intopt|, which may be used by the application program to pass some external data to the callback routine. The callback routine is passed to the MIP solver through the control parameter structure \verb|glp_iocp| (see Chapter ``Basic API Routines'', Section ``Mixed integer programming routines'', Subsection ``Solve MIP problem with the branch-and-cut method'') as follows: \begin{verbatim} glp_prob *mip; glp_iocp parm; . . . glp_init_iocp(&parm); . . . parm.cb_func = foo_bar; parm.cb_info = ... ; ret = glp_intopt(mip, &parm); . . . \end{verbatim} To determine why it is being called by the MIP solver the callback routine should use the routine \verb|glp_ios_reason| (described in this section below), which returns a code indicating the reason for calling. Depending on the reason the callback routine may perform necessary actions to control the solution process. The reason codes, which correspond to various point of the branch-and-cut algorithm implemented in the MIP solver, are described in Subsection ``Reasons for calling the callback routine'' below. To ignore calls for reasons, which are not processed by the callback routine, it should simply return to the MIP solver doing nothing. For example: \begin{verbatim} void foo_bar(glp_tree *T, void *info) { . . . switch (glp_ios_reason(T)) { case GLP_IBRANCH: . . . break; case GLP_ISELECT: . . . break; default: /* ignore call for other reasons */ break; } return; } \end{verbatim} To control the solution process as well as to obtain necessary information the callback routine may use the branch-and-cut API routines described in this chapter. Names of all these routines begin with `\verb|glp_ios_|'. \subsection{Branch-and-cut algorithm} This section gives a schematic description of the branch-and-cut algorithm as it is implemented in the GLPK MIP solver. {\it 1. Initialization} Set $L:=\{P_0\}$, where $L$ is the {\it active list} (i.e. the list of active subproblems), $P_0$ is the original MIP problem to be solved. Set $z^{\it best}:=+\infty$ (in case of minimization) or $z^{\it best}:=-\infty$ (in case of maximization), where $z^{\it best}$ is {\it incumbent value}, i.e. an upper (minimization) or lower (maximization) global bound for $z^{\it opt}$, the optimal objective value for $P^0$. {\it 2. Subproblem selection} If $L=\varnothing$ then GO TO 9. Select $P\in L$, i.e. make active subproblem $P$ current. %\newpage {\it 3. Solving LP relaxation} Solve $P^{\it LP}$, which is LP relaxation of $P$. If $P^{\it LP}$ has no primal feasible solution then GO TO 8. Let $z^{\it LP}$ be the optimal objective value for $P^{\it LP}$. If $z^{\it LP}\geq z^{\it best}$ (minimization) or $z^{\it LP}\leq z^{\rm best}$ (), GO TO 8. {\it 4. Adding ``lazy'' constraints} Let $x^{\it LP}$ be the optimal solution to $P^{\it LP}$. If there are ``lazy'' constraints (i.e. essential constraints not included in the original MIP problem $P_0$), which are violated at the optimal point $x^{\it LP}$, add them to $P$, and GO TO 3. {\it 5. Check for integrality} Let $x_j$ be a variable, which is required to be integer, and let $x^{\it LP}_j\in x^{\it LP}$ be its value in the optimal solution to $P^{\it LP}$. If $x^{\it LP}_j$ are integral for all integer variables, then a better integer feasible solution is found. Store its components, set $z^{\it best}:=z^{\it LP}$, and GO TO 8. {\it 6. Adding cutting planes} If there are cutting planes (i.e. valid constraints for $P$), which are violated at the optimal point $x^{\it LP}$, add them to $P$, and GO TO 3. {\it 7. Branching} Select {\it branching variable} $x_j$, i.e. a variable, which is required to be integer, and whose value $x^{\it LP}_j\in x^{\it LP}$ is fractional in the optimal solution to $P^{\it LP}$. Create new subproblem $P^D$ (so called {\it down branch}), which is identical to the current subproblem $P$ with exception that the upper bound of $x_j$ is replaced by $\lfloor x^{\it LP}_j\rfloor$. (For example, if $x^{\it LP}_j=3.14$, the new upper bound of $x_j$ in the down branch will be $\lfloor 3.14\rfloor=3$.) Create new subproblem $P^U$ (so called {\it up branch}), which is identical to the current subproblem $P$ with exception that the lower bound of $x_j$ is replaced by $\lceil x^{\it LP}_j\rceil$. (For example, if $x^{\it LP}_j=3.14$, the new lower bound of $x_j$ in the up branch will be $\lceil 3.14\rceil=4$.) Set $L:=(L\backslash\{P\})\cup\{P^D,P^U\}$, i.e. remove the current subproblem $P$ from the active list $L$ and add two new subproblems $P^D$ and $P^U$ to it. Then GO TO 2. {\it 8. Pruning} Remove from the active list $L$ all subproblems (including the current one), whose local bound $\widetilde{z}$ is not better than the global bound $z^{\it best}$, i.e. set $L:=L\backslash\{P\}$ for all $P$, where $\widetilde{z}\geq z^{\it best}$ (in case of minimization) or $\widetilde{z}\leq z^{\it best}$ (in case of maximization), and then GO TO 2. The local bound $\widetilde{z}$ for subproblem $P$ is an lower (minimization) or upper (maximization) bound for integer optimal solution to {\it this} subproblem (not to the original problem). This bound is local in the sense that only subproblems in the subtree rooted at node $P$ cannot have better integer feasible solutions. Note that the local bound is not necessarily the optimal objective value to LP relaxation $P^{\it LP}$. {\it 9. Termination} If $z^{\it best}=+\infty$ (in case of minimization) or $z^{\it best}=-\infty$ (in case of maximization), the original problem $P_0$ has no integer feasible solution. Otherwise, the last integer feasible solution stored on step 5 is the integer optimal solution to the original problem $P_0$ with $z^{\it opt}=z^{\it best}$. STOP. \subsection{The search tree} On the branching step of the branch-and-cut algorithm the current subproblem is divided into two\footnote{In more general cases the current subproblem may be divided into more than two subproblems. However, currently such feature is not used in GLPK.} new subproblems, so the set of all subproblems can be represented in the form of a rooted tree, which is called the {\it search} or {\it branch-and-bound} tree. An example of the search tree is shown on Fig.~1. Each node of the search tree corresponds to a subproblem, so the terms `node' and `subproblem' may be used synonymously. \begin{figure}[t] \noindent\hfil \xymatrix @R=20pt @C=10pt {&&&&&&*+<14pt>[o][F=]{A}\ar@{-}[dllll]\ar@{-}[dr]\ar@{-}[drrrr]&&&&\\ &&*+<14pt>[o][F=]{B}\ar@{-}[dl]\ar@{-}[dr]&&&&&*+<14pt>[o][F=]{C} \ar@{-}[dll]\ar@{-}[dr]\ar@{-}[drrr]&&&*+<14pt>[o][F-]{\times}\\ &*+<14pt>[o][F-]{\times}\ar@{-}[dl]\ar@{-}[d]\ar@{-}[dr]&& *+<14pt>[o][F-]{D}&&*+<14pt>[o][F=]{E}\ar@{-}[dl]\ar@{-}[dr]&&& *+<14pt>[o][F=]{F}\ar@{-}[dl]\ar@{-}[dr]&&*+<14pt>[o][F-]{G}\\ *+<14pt>[o][F-]{\times}&*+<14pt>[o][F-]{\times}&*+<14pt>[o][F-]{\times} &&*+<14pt>[][F-]{H}&&*+<14pt>[o][F-]{I}&*+<14pt>[o][F-]{\times}&& *+<14pt>[o][F-]{J}&\\} \bigskip \noindent\hspace{.8in} \xymatrix @R=11pt {*+<20pt>[][F-]{}&*\txt{\makebox[1in][l]{Current}}&& *+<20pt>[o][F-]{}&*\txt{\makebox[1in][l]{Active}}\\ *+<20pt>[o][F=]{}&*\txt{\makebox[1in][l]{Non-active}}&& *+<14pt>[o][F-]{\times}&*\txt{\makebox[1in][l]{Fathomed}}\\ } \bigskip \begin{center} Fig. 1. An example of the search tree. \end{center} \end{figure} In GLPK each node may have one of the following four statuses: %\vspace*{-8pt} %\begin{itemize} \Item{---}{\it current node} is the active node currently being processed; \Item{---}{\it active node} is a leaf node, which still has to be processed; \Item{---}{\it non-active node} is a node, which has been processed, but not fathomed; \Item{---}{\it fathomed node} is a node, which has been processed and fathomed. %\end{itemize} %\vspace*{-8pt} In the data structure representing the search tree GLPK keeps only current, active, and non-active nodes. Once a node has been fathomed, it is removed from the tree data structure. Being created each node of the search tree is assigned a distinct positive integer called the {\it subproblem reference number}, which may be used by the application program to specify a particular node of the tree. The root node corresponding to the original problem to be solved is always assigned the reference number 1. \subsection{Current subproblem} The current subproblem is a MIP problem corresponding to the current node of the search tree. It is represented as the GLPK problem object (\verb|glp_prob|) that allows the application program using API routines to access its content in the standard way. If the MIP presolver is not used, it is the original problem object passed to the routine \verb|glp_intopt|; otherwise, it is an internal problem object built by the MIP presolver. Note that the problem object is used by the MIP solver itself during the solution process for various purposes (to solve LP relaxations, to perfom branching, etc.), and even if the MIP presolver is not used, the current content of the problem object may differ from its original content. For example, it may have additional rows, bounds of some rows and columns may be changed, etc. In particular, LP segment of the problem object corresponds to LP relaxation of the current subproblem. However, on exit from the MIP solver the content of the problem object is restored to its original state. To obtain information from the problem object the application program may use any API routines, which do not change the object. Using API routines, which change the problem object, is restricted to stipulated cases. \subsection{The cut pool} The {\it cut pool} is a set of cutting plane constraints maintained by the MIP solver. It is used by the GLPK cut generation routines and may be used by the application program in the same way, i.e. rather than to add cutting plane constraints directly to the problem object the application program may store them to the cut pool. In the latter case the solver looks through the cut pool, selects efficient constraints, and adds them to the problem object. \subsection{Reasons for calling the callback routine} The callback routine may be called by the MIP solver for the following reasons. \para{Request for subproblem selection} The callback routine is called with the reason code \verb|GLP_ISELECT| if the current subproblem has been fathomed and therefore there is no current subproblem. In response the callback routine may select some subproblem from the active list and pass its reference number to the solver using the routine \verb|glp_ios_select_node|, in which case the solver continues the search from the specified active subproblem. If no selection is made by the callback routine, the solver uses a backtracking technique specified by the control parameter \verb|bt_tech|. To explore the active list (i.e. active nodes of the branch-and-bound tree) the callback routine may use the routines \verb|glp_ios_next_node| and \verb|glp_ios_prev_node|. \para{Request for preprocessing} The callback routine is called with the reason code \verb|GLP_IPREPRO| if the current subproblem has just been selected from the active list and its LP relaxation is not solved yet. In response the callback routine may perform some preprocessing of the current subproblem like tightening bounds of some variables or removing bounds of some redundant constraints. \para{Request for row generation} The callback routine is called with the reason code \verb|GLP_IROWGEN| if LP relaxation of the current subproblem has just been solved to optimality and its objective value is better than the best known integer feasible solution. In response the callback routine may add one or more ``lazy'' constraints (rows), which are violated by the current optimal solution of LP relaxation, using API routines \verb|glp_add_rows|, \verb|glp_set_row_name|, \verb|glp_set_row_bnds|, and \verb|glp_set_mat_row|, in which case the solver will perform re-optimization of LP relaxation. If there are no violated constraints, the callback routine should just return. Note that components of optimal solution to LP relaxation can be obtained with API\linebreak routines \verb|glp_get_obj_val|, \verb|glp_get_row_prim|, \verb|glp_get_row_dual|, \verb|glp_get_col_prim|, and\linebreak \verb|glp_get_col_dual|. \para{Request for heuristic solution} The callback routine is called with the reason code \verb|GLP_IHEUR| if LP relaxation of the current subproblem being solved to optimality is integer infeasible (i.e. values of some structural variables of integer kind are fractional), though its objective value is better than the best known integer feasible solution. In response the callback routine may try applying a primal heuristic to find an integer feasible solution,\footnote{Integer feasible to the original MIP problem, not to the current subproblem.} which is better than the best known one. In case of success the callback routine may store such better solution in the problem object using the routine \verb|glp_ios_heur_sol|. \para{Request for cut generation} The callback routine is called with the reason code \verb|GLP_ICUTGEN| if LP relaxation of the current subproblem being solved to optimality is integer infeasible (i.e. values of some structural variables of integer kind are fractional), though its objective value is better than the best known integer feasible solution. In response the callback routine may reformulate the {\it current} subproblem (before it will be splitted up due to branching) by adding to the problem object one or more {\it cutting plane constraints}, which cut off the fractional optimal point from the MIP polytope.\footnote{Since these constraints are added to the current subproblem, they may be globally as well as locally valid.} Adding cutting plane constraints may be performed in two ways. One way is the same as for the reason code \verb|GLP_IROWGEN| (see above), in which case the callback routine adds new rows corresponding to cutting plane constraints directly to the current subproblem. The other way is to add cutting plane constraints to the {\it cut pool}, a set of cutting plane constraints maintained by the solver, rather than directly to the current subproblem. In this case after return from the callback routine the solver looks through the cut pool, selects efficient cutting plane constraints, adds them to the current subproblem, drops other constraints, and then performs re-optimization. \para{Request for branching} The callback routine is called with the reason code \verb|GLP_IBRANCH| if LP relaxation of the current subproblem being solved to optimality is integer infeasible (i.e. values of some structural variables of integer kind are fractional), though its objective value is better than the best known integer feasible solution. In response the callback routine may choose some variable suitable for branching (i.e. integer variable, whose value in optimal solution to LP relaxation of the current subproblem is fractional) and pass its ordinal number to the solver using the routine \verb|glp_ios_branch_upon|, in which case the solver splits the current subproblem in two new subproblems and continues the search. If no choice is made by the callback routine, the solver uses a branching technique specified by the control parameter \verb|br_tech|. \para{Better integer solution found} The callback routine is called with the reason code \verb|GLP_IBINGO| if LP relaxation of the current subproblem being solved to optimality is integer feasible (i.e. values of all structural variables of integer kind are integral within the working precision) and its objective value is better than the best known integer feasible solution. Optimal solution components for LP relaxation can be obtained in the same way as for the reason code \verb|GLP_IROWGEN| (see above). Components of the new MIP solution can be obtained with API routines \verb|glp_mip_obj_val|, \verb|glp_mip_row_val|, and \verb|glp_mip_col_val|. Note, however, that due to row/cut generation there may be additional rows in the problem object. The difference between optimal solution to LP relaxation and corresponding MIP solution is that in the former case some structural variables of integer kind (namely, basic variables) may have values, which are close to nearest integers within the working precision, while in the latter case all such variables have exact integral values. The reason \verb|GLP_IBINGO| is intended only for informational purposes, so the callback routine should not modify the problem object in this case. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newpage \section{Basic routines} \subsection{glp\_ios\_reason --- determine reason for calling the callback routine} \synopsis \begin{verbatim} int glp_ios_reason(glp_tree *T); \end{verbatim} \returns The routine \verb|glp_ios_reason| returns a code, which indicates why the user-defined callback routine is being called: \verb|GLP_ISELECT| --- request for subproblem selection; \verb|GLP_IPREPRO| --- request for preprocessing; \verb|GLP_IROWGEN| --- request for row generation; \verb|GLP_IHEUR | --- request for heuristic solution; \verb|GLP_ICUTGEN| --- request for cut generation; \verb|GLP_IBRANCH| --- request for branching; \verb|GLP_IBINGO | --- better integer solution found. \subsection{glp\_ios\_get\_prob --- access the problem object} \synopsis \begin{verbatim} glp_prob *glp_ios_get_prob(glp_tree *T); \end{verbatim} \description The routine \verb|glp_ios_get_prob| can be called from the user-defined callback routine to access the problem object, which is used by the MIP solver. It is the original problem object passed to the routine \verb|glp_intopt| if the MIP presolver is not used; otherwise it is an internal problem object built by the presolver. \returns The routine \verb|glp_ios_get_prob| returns a pointer to the problem object used by the MIP solver. \para{Comments} To obtain various information about the problem instance the callback routine can access the problem object (i.e. the object of type \verb|glp_prob|) using the routine \verb|glp_ios_get_prob|. It is the original problem object passed to the routine \verb|glp_intopt| if the MIP presolver is not used; otherwise it is an internal problem object built by the presolver. \newpage \subsection{glp\_ios\_row\_attr --- determine additional row attributes} \synopsis \begin{verbatim} void glp_ios_row_attr(glp_tree *T, int i, glp_attr *attr); \end{verbatim} \description The routine \verb|glp_ios_row_attr| retrieves additional attributes of $i$-th row of the current subproblem and stores them in the structure \verb|glp_attr|, which the parameter \verb|attr| points to. The structure \verb|glp_attr| has the following fields: \medskip {\tt int level} Subproblem level at which the row was created. (If \verb|level| = 0, the row was added either to the original problem object passed to the routine \verb|glp_intopt| or to the root subproblem on generating ``lazy'' or/and cutting plane constraints.) \medskip {\tt int origin} The row origin flag: \verb|GLP_RF_REG | --- regular constraint; \verb|GLP_RF_LAZY| --- ``lazy'' constraint; \verb|GLP_RF_CUT | --- cutting plane constraint. \medskip {\tt int klass} The row class descriptor, which is a number passed to the routine \verb|glp_ios_add_row| as its third parameter. If the row is a cutting plane constraint generated by the solver, its class may be the following: \verb|GLP_RF_GMI | --- Gomory's mixed integer cut; \verb|GLP_RF_MIR | --- mixed integer rounding cut; \verb|GLP_RF_COV | --- mixed cover cut; \verb|GLP_RF_CLQ | --- clique cut. \subsection{glp\_ios\_mip\_gap --- compute relative MIP gap} \synopsis \begin{verbatim} double glp_ios_mip_gap(glp_tree *T); \end{verbatim} \description The routine \verb|glp_ios_mip_gap| computes the relative MIP gap (also called {\it duality gap}) with the following formula: $${\tt gap} = \frac{|{\tt best\_mip} - {\tt best\_bnd}|} {|{\tt best\_mip}| + {\tt DBL\_EPSILON}}$$ where \verb|best_mip| is the best integer feasible solution found so far, \verb|best_bnd| is the best (global) bound. If no integer feasible solution has been found yet, \verb|gap| is set to \verb|DBL_MAX|. \newpage \returns The routine \verb|glp_ios_mip_gap| returns the relative MIP gap. \para{Comments} The relative MIP gap is used to measure the quality of the best integer feasible solution found so far, because the optimal solution value $z^*$ for the original MIP problem always lies in the range $${\tt best\_bnd}\leq z^*\leq{\tt best\_mip}$$ in case of minimization, or in the range $${\tt best\_mip}\leq z^*\leq{\tt best\_bnd}$$ in case of maximization. To express the relative MIP gap in percents the value returned by the routine \verb|glp_ios_mip_gap| should be multiplied by 100\%. \subsection{glp\_ios\_node\_data --- access application-specific data} \synopsis \begin{verbatim} void *glp_ios_node_data(glp_tree *T, int p); \end{verbatim} \description The routine \verb|glp_ios_node_data| allows the application accessing a memory block allocated for the subproblem (which may be active or inactive), whose reference number is $p$. The size of the block is defined by the control parameter \verb|cb_size| passed to the routine \verb|glp_intopt|. The block is initialized by binary zeros on creating corresponding subproblem, and its contents is kept until the subproblem will be removed from the tree. The application may use these memory blocks to store specific data for each subproblem. \returns The routine \verb|glp_ios_node_data| returns a pointer to the memory block for the specified subproblem. Note that if \verb|cb_size| = 0, the routine returns a null pointer. \subsection{glp\_ios\_select\_node --- select subproblem to continue the search} \synopsis \begin{verbatim} void glp_ios_select_node(glp_tree *T, int p); \end{verbatim} \description The routine \verb|glp_ios_select_node| can be called from the user-defined callback routine in response to the reason \verb|GLP_ISELECT| to select an active subproblem, whose reference number\linebreak is $p$. The search will be continued from the subproblem selected. \newpage \subsection{glp\_ios\_heur\_sol --- provide solution found by heuristic} \synopsis \begin{verbatim} int glp_ios_heur_sol(glp_tree *T, const double x[]); \end{verbatim} \description The routine \verb|glp_ios_heur_sol| can be called from the user-defined callback routine in response to the reason \verb|GLP_IHEUR| to provide an integer feasible solution found by a primal heuristic. Primal values of {\it all} variables (columns) found by the heuristic should be placed in locations $x[1]$, \dots, $x[n]$, where $n$ is the number of columns in the original problem object. Note that the routine \verb|glp_ios_heur_sol| does {\it not} check primal feasibility of the solution provided. Using the solution passed in the array $x$ the routine computes value of the objective function. If the objective value is better than the best known integer feasible solution, the routine computes values of auxiliary variables (rows) and stores all solution components in the problem object. \returns If the provided solution is accepted, the routine \verb|glp_ios_heur_sol| returns zero. Otherwise, if the provided solution is rejected, the routine returns non-zero. \vspace*{-5pt} \subsection{glp\_ios\_can\_branch --- check if can branch upon specified variable} \synopsis \begin{verbatim} int glp_ios_can_branch(glp_tree *T, int j); \end{verbatim} \returns If $j$-th variable (column) can be used to branch upon, the routine returns non-zero, otherwise zero. \vspace*{-5pt} \subsection{glp\_ios\_branch\_upon --- choose variable to branch upon} \synopsis \begin{verbatim} void glp_ios_branch_upon(glp_tree *T, int j, int sel); \end{verbatim} \description The routine \verb|glp_ios_branch_upon| can be called from the user-defined callback routine in response to the reason \verb|GLP_IBRANCH| to choose a branching variable, whose ordinal number \linebreak is $j$. Should note that only variables, for which the routine \verb|glp_ios_can_branch| returns non-zero, can be used to branch upon. The parameter \verb|sel| is a flag that indicates which branch (subproblem) should be selected next to continue the search: \verb|GLP_DN_BRNCH| --- select down-branch; \verb|GLP_UP_BRNCH| --- select up-branch; \verb|GLP_NO_BRNCH| --- use general selection technique. \newpage \para{Comments} On branching the solver removes the current active subproblem from the active list and creates two new subproblems ({\it down-} and {\it up-branches}), which are added to the end of the active list. Note that the down-branch is created before the up-branch, so the last active subproblem will be the up-branch. The down- and up-branches are identical to the current subproblem with exception that in the down-branch the upper bound of $x_j$, the variable chosen to branch upon, is replaced by $\lfloor x_j^*\rfloor$, while in the up-branch the lower bound of $x_j$ is replaced by $\lceil x_j^*\rceil$, where $x_j^*$ is the value of $x_j$ in optimal solution to LP relaxation of the current subproblem. For example, if $x_j^*=3.14$, the new upper bound of $x_j$ in the down-branch is $\lfloor 3.14\rfloor=3$, and the new lower bound in the up-branch is $\lceil 3.14\rceil=4$.) Additionally the callback routine may select either down- or up-branch, from which the solver will continue the search. If none of the branches is selected, a general selection technique will be used. \subsection{glp\_ios\_terminate --- terminate the solution process} \synopsis \begin{verbatim} void glp_ios_terminate(glp_tree *T); \end{verbatim} \description The routine \verb|glp_ios_terminate| sets a flag indicating that the MIP solver should prematurely terminate the search. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newpage \section{The search tree exploring routines} \subsection{glp\_ios\_tree\_size --- determine size of the search tree} \synopsis \begin{verbatim} void glp_ios_tree_size(glp_tree *T, int *a_cnt, int *n_cnt, int *t_cnt); \end{verbatim} \description The routine \verb|glp_ios_tree_size| stores the following three counts which characterize the current size of the search tree: \verb|a_cnt| is the current number of active nodes, i.e. the current size of the active list; \verb|n_cnt| is the current number of all (active and inactive) nodes; \verb|t_cnt| is the total number of nodes including those which have been already removed from the tree. This count is increased whenever a new node appears in the tree and never decreased. If some of the parameters \verb|a_cnt|, \verb|n_cnt|, \verb|t_cnt| is a null pointer, the corresponding count is not stored. \subsection{glp\_ios\_curr\_node --- determine current active subproblem} \synopsis \begin{verbatim} int glp_ios_curr_node(glp_tree *T); \end{verbatim} \returns The routine \verb|glp_ios_curr_node| returns the reference number of the current active subproblem. However, if the current subproblem does not exist, the routine returns zero. \subsection{glp\_ios\_next\_node --- determine next active subproblem} \synopsis \begin{verbatim} int glp_ios_next_node(glp_tree *T, int p); \end{verbatim} \returns If the parameter $p$ is zero, the routine \verb|glp_ios_next_node| returns the reference number of the first active subproblem. However, if the tree is empty, zero is returned. If the parameter $p$ is not zero, it must specify the reference number of some active subproblem, in which case the routine returns the reference number of the next active subproblem. However, if there is no next active subproblem in the list, zero is returned. All subproblems in the active list are ordered chronologically, i.e. subproblem $A$ precedes subproblem $B$ if $A$ was created before $B$. \newpage \subsection{glp\_ios\_prev\_node --- determine previous active subproblem} \synopsis \begin{verbatim} int glp_ios_prev_node(glp_tree *T, int p); \end{verbatim} \returns If the parameter $p$ is zero, the routine \verb|glp_ios_prev_node| returns the reference number of the last active subproblem. However, if the tree is empty, zero is returned. If the parameter $p$ is not zero, it must specify the reference number of some active subproblem, in which case the routine returns the reference number of the previous active subproblem. However, if there is no previous active subproblem in the list, zero is returned. All subproblems in the active list are ordered chronologically, i.e. subproblem $A$ precedes subproblem $B$ if $A$ was created before $B$. \subsection{glp\_ios\_up\_node --- determine parent subproblem} \synopsis \begin{verbatim} int glp_ios_up_node(glp_tree *T, int p); \end{verbatim} \returns The parameter $p$ must specify the reference number of some (active or inactive) subproblem, in which case the routine \verb|iet_get_up_node| returns the reference number of its parent subproblem. However, if the specified subproblem is the root of the tree and, therefore, has no parent, the routine returns zero. \subsection{glp\_ios\_node\_level --- determine subproblem level} \synopsis \begin{verbatim} int glp_ios_node_level(glp_tree *T, int p); \end{verbatim} \returns The routine \verb|glp_ios_node_level| returns the level of the subproblem, whose reference number is $p$, in the branch-and-bound tree. (The root subproblem has level 0, and the level of any other subproblem is the level of its parent plus one.) \subsection{glp\_ios\_node\_bound --- determine subproblem local bound} \synopsis \begin{verbatim} double glp_ios_node_bound(glp_tree *T, int p); \end{verbatim} \returns The routine \verb|glp_ios_node_bound| returns the local bound for (active or inactive) subproblem, whose reference number is $p$. \newpage \para{Comments} The local bound for subproblem $p$ is an lower (minimization) or upper (maximization) bound for integer optimal solution to {\it this} subproblem (not to the original problem). This bound is local in the sense that only subproblems in the subtree rooted at node $p$ cannot have better integer feasible solutions. On creating a subproblem (due to the branching step) its local bound is inherited from its parent and then may get only stronger (never weaker). For the root subproblem its local bound is initially set to \verb|-DBL_MAX| (minimization) or \verb|+DBL_MAX| (maximization) and then improved as the root LP relaxation has been solved. Note that the local bound is not necessarily the optimal objective value to corresponding LP relaxation. \subsection{glp\_ios\_best\_node --- find active subproblem with best local bound} \synopsis \begin{verbatim} int glp_ios_best_node(glp_tree *T); \end{verbatim} \returns The routine \verb|glp_ios_best_node| returns the reference number of the active subproblem, whose local bound is best (i.e. smallest in case of minimization or largest in case of maximization). However, if the tree is empty, the routine returns zero. \para{Comments} The best local bound is an lower (minimization) or upper (maximization) bound for integer optimal solution to the original MIP problem. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newpage \section{The cut pool routines} \subsection{glp\_ios\_pool\_size --- determine current size of the cut pool} \synopsis \begin{verbatim} int glp_ios_pool_size(glp_tree *T); \end{verbatim} \returns The routine \verb|glp_ios_pool_size| returns the current size of the cut pool, that is, the number of cutting plane constraints currently added to it. \subsection{glp\_ios\_add\_row --- add constraint to the cut pool} \synopsis \begin{verbatim} int glp_ios_add_row(glp_tree *T, const char *name, int klass, int flags, int len, const int ind[], const double val[], int type, double rhs); \end{verbatim} \description The routine \verb|glp_ios_add_row| adds specified row (cutting plane constraint) to the cut pool. The cutting plane constraint should have the following format: $$\sum_{j\in J}a_jx_j\left\{\begin{array}{@{}c@{}}\geq\\\leq\\ \end{array}\right\}b,$$ where $J$ is a set of indices (ordinal numbers) of structural variables, $a_j$ are constraint coefficients, $x_j$ are structural variables, $b$ is the right-hand side. The parameter \verb|name| specifies a symbolic name assigned to the constraint (1 up to 255 characters). If it is \verb|NULL| or an empty string, no name is assigned. The parameter \verb|klass| specifies the constraint class, which must be either zero or a number in the range from 101 to 200. The application may use this attribute to distinguish between cutting plane constraints of different classes.\footnote{Constraint classes numbered from 1 to 100 are reserved for GLPK cutting plane generators.} The parameter \verb|flags| currently is not used and must be zero. Ordinal numbers of structural variables (i.e. column indices) $j\in J$ and numerical values of corresponding constraint coefficients $a_j$ should be placed in locations \verb|ind[1]|, \dots, \verb|ind[len]| and \verb|val[1]|, \dots, \verb|val[len]|, respectively, where ${\tt len}=|J|$ is the number of constraint coefficients, $0\leq{\tt len}\leq n$, and $n$ is the number of columns in the problem object. Coefficients with identical column indices are not allowed. Zero coefficients are allowed, however, they are ignored. The parameter \verb|type| specifies the constraint type as follows: \verb|GLP_LO| means inequality constraint $\Sigma a_jx_j\geq b$; \verb|GLP_UP| means inequality constraint $\Sigma a_jx_j\leq b$; \newpage The parameter \verb|rhs| specifies the right-hand side $b$. All cutting plane constraints in the cut pool are identified by their ordinal numbers 1, 2, \dots, $size$, where $size$ is the current size of the cut pool. New constraints are always added to the end of the cut pool, thus, ordinal numbers of previously added constraints are not changed. \returns The routine \verb|glp_ios_add_row| returns the ordinal number of the cutting plane constraint added, which is the new size of the cut pool. \para{Example} \begin{verbatim} /* generate triangle cutting plane: x[i] + x[j] + x[k] <= 1 */ . . . /* add the constraint to the cut pool */ ind[1] = i, val[1] = 1.0; ind[2] = j, val[2] = 1.0; ind[3] = k, val[3] = 1.0; glp_ios_add_row(tree, NULL, TRIANGLE_CUT, 0, 3, ind, val, GLP_UP, 1.0); \end{verbatim} \para{Comments} Cutting plane constraints added to the cut pool are intended to be then added only to the {\it current} subproblem, so these constraints can be globally as well as locally valid. However, adding a constraint to the cut pool does not mean that it will be added to the current subproblem---it depends on the solver's decision: if the constraint seems to be efficient, it is moved from the pool to the current subproblem, otherwise it is simply dropped.\footnote{Globally valid constraints could be saved and then re-used for other subproblems, but currently such feature is not implemented.} Normally, every time the callback routine is called for cut generation, the cut pool is empty. On the other hand, the solver itself can generate cutting plane constraints (like Gomory's or mixed integer rounding cuts), in which case the cut pool may be non-empty. \subsection{glp\_ios\_del\_row --- remove constraint from the cut pool} \synopsis \begin{verbatim} void glp_ios_del_row(glp_tree *T, int i); \end{verbatim} \description The routine \verb|glp_ios_del_row| deletes $i$-th row (cutting plane constraint) from the cut pool, where $1\leq i\leq size$ is the ordinal number of the constraint in the pool, $size$ is the current size of the cut pool. Note that deleting a constraint from the cut pool leads to changing ordinal numbers of other constraints remaining in the pool. New ordinal numbers of the remaining constraints are assigned under assumption that the original order of constraints is not changed. Let, for example, there be four constraints $a$, $b$, $c$ and $d$ in the cut pool, which have ordinal numbers 1, 2, 3 and 4, respectively, and let constraint $b$ have been deleted. Then after deletion the remaining constraint $a$, $c$ and $d$ are assigned new ordinal numbers 1, 2 and 3, respectively. To find the constraint to be deleted the routine \verb|glp_ios_del_row| uses ``smart'' linear search, so it is recommended to remove constraints in a natural or reverse order and avoid removing them in a random order. \para{Example} \begin{verbatim} /* keep first 10 constraints in the cut pool and remove other constraints */ while (glp_ios_pool_size(tree) > 10) glp_ios_del_row(tree, glp_ios_pool_size(tree)); \end{verbatim} \subsection{glp\_ios\_clear\_pool --- remove all constraints from the cut pool} \synopsis \begin{verbatim} void glp_ios_clear_pool(glp_tree *T); \end{verbatim} \description The routine \verb|glp_ios_clear_pool| makes the cut pool empty deleting all existing rows (cutting plane constraints) from it. %* eof *% glpk-5.0/doc/glpk06.tex0000644000062000006210000003177213766346220014106 0ustar maomkpasswd%* glpk06.tex *% \chapter{Miscellaneous API Routines} \section{GLPK environment routines} \subsection{glp\_init\_env --- initialize GLPK environment} \synopsis \begin{verbatim} int glp_init_env(void); \end{verbatim} \description The routine \verb|glp_init_env| initializes the GLPK environment. Normally the application program does not need to call this routine, because it is called automatically on the first call to any API routine. \returns \begin{retlist} 0 & initialization successful;\\ 1 & environment is already initialized;\\ 2 & initialization failed (insufficient memory);\\ 3 & initialization failed (unsupported programming model).\\ \end{retlist} \subsection{glp\_version --- determine library version} \synopsis \begin{verbatim} const char *glp_version(void); \end{verbatim} \returns The routine \verb|glp_version| returns a pointer to a null-terminated character string, which specifies the version of the GLPK library in the form \verb|"X.Y"|, where `\verb|X|' is the major version number, and `\verb|Y|' is the minor version number, for example, \verb|"4.16"|. \newpage \subsection{glp\_free\_env --- free GLPK environment} \synopsis \begin{verbatim} int glp_free_env(void); \end{verbatim} \description The routine \verb|glp_free_env| frees all resources used by GLPK routines (memory blocks, etc.) which are currently still in use. Normally the application program does not need to call this routine, because GLPK routines always free all unused resources. However, if the application program even has deleted all problem objects, there will be several memory blocks still allocated for the internal library needs. For some reasons the application program may want GLPK to free this memory, in which case it should call \verb|glp_free_env|. Note that a call to \verb|glp_free_env| invalidates all problem objects which still exist. \returns \begin{retlist} 0 & termination successful;\\ 1 & environment is inactive (was not initialized).\\ \end{retlist} \subsection{glp\_printf --- write formatted output to terminal} \synopsis \begin{verbatim} void glp_printf(const char *fmt, ...); \end{verbatim} \description The routine \verb|glp_printf| uses the format control string \verb|fmt| to format its parameters and writes the formatted output to the terminal. This routine is a replacement of the standard C function \verb|printf| and used by all GLPK routines to perform terminal output. The application program may use \verb|glp_printf| for the same purpose that allows controlling its terminal output with the routines \verb|glp_term_out| and \verb|glp_term_hook|. \subsection{glp\_vprintf --- write formatted output to terminal} \synopsis \begin{verbatim} void glp_vprintf(const char *fmt, va_list arg); \end{verbatim} \description The routine \verb|glp_vprintf| uses the format control string \verb|fmt| to format its parameters specified by the list \verb|arg| and writes the formatted output to the terminal. This routine is a replacement of the standard C function \verb|vprintf| and used by all GLPK routines to perform terminal output. The application program may use \verb|glp_vprintf| for the same purpose that allows controlling its terminal output with the routines \verb|glp_term_out| and \verb|glp_term_hook|. \newpage \subsection{glp\_term\_out --- enable/disable terminal output} \synopsis \begin{verbatim} int glp_term_out(int flag); \end{verbatim} \description Depending on the parameter flag the routine \verb|glp_term_out| enables or disables terminal output performed by glpk routines: \verb|GLP_ON | --- enable terminal output; \verb|GLP_OFF| --- disable terminal output. \returns The routine \verb|glp_term_out| returns the previous value of the terminal output flag. \subsection{glp\_term\_hook --- intercept terminal output} \synopsis \begin{verbatim} void glp_term_hook(int (*func)(void *info, const char *s), void *info); \end{verbatim} \description The routine \verb|glp_term_hook| installs the user-defined hook routine to intercept all terminal output performed by GLPK routines. %This feature can be used to redirect the terminal output to other %destination, for example, to a file or a text window. The parameter {\it func} specifies the user-defined hook routine. It is called from an internal printing routine, which passes to it two parameters: {\it info} and {\it s}. The parameter {\it info} is a transit pointer specified in corresponding call to the routine \verb|glp_term_hook|; it may be used to pass some additional information to the hook routine. The parameter {\it s} is a pointer to the null terminated character string, which is intended to be written to the terminal. If the hook routine returns zero, the printing routine writes the string {\it s} to the terminal in a usual way; otherwise, if the hook routine returns non-zero, no terminal output is performed. To uninstall the hook routine both parameters {\it func} and {\it info} should be specified as \verb|NULL|. \para{Example} \begin{footnotesize} \begin{verbatim} static int hook(void *info, const char *s) { FILE *foo = info; fputs(s, foo); return 1; } int main(void) { FILE *foo; . . . glp_term_hook(hook, foo); /* redirect terminal output */ . . . glp_term_hook(NULL, NULL); /* resume terminal output */ . . . } \end{verbatim} \end{footnotesize} \newpage \subsection{glp\_open\_tee --- start copying terminal output} \synopsis \begin{verbatim} int glp_open_tee(const char *fname); \end{verbatim} \description The routine \verb|glp_open_tee| starts copying all the terminal output to an output text file, whose name is specified by the character string \verb|fname|. \returns \begin{retlist} 0 & operation successful;\\ 1 & copying terminal output is already active;\\ 2 & unable to create output file.\\ \end{retlist} \subsection{glp\_close\_tee --- stop copying terminal output} \synopsis \begin{verbatim} int glp_close_tee(void); \end{verbatim} \description The routine \verb|glp_close_tee| stops copying the terminal output to the output text file previously open by the routine \verb|glp_open_tee| closing that file. \returns \begin{retlist} 0 & operation successful;\\ 1 & copying terminal output was not started.\\ \end{retlist} \subsection{glp\_error --- display error message and terminate execution} \synopsis \begin{verbatim} void glp_error(const char *fmt, ...); \end{verbatim} \description The routine \verb|glp_error| (implemented as a macro) formats its parameters using the format control string \verb|fmt|, writes the formatted message to the terminal, and then abnormally terminates the program. \newpage \subsection{glp\_at\_error --- check for error state} \synopsis \begin{verbatim} int glp_at_error(void); \end{verbatim} \description The routine \verb|glp_at_error| checks if the GLPK environment is at error state, i.~e.~if the call to the routine is (indirectly) made from the \verb|glp_error| routine via an user-defined hook routine. This routine can be used, for example, by a custom output handler (installed with the routine \verb|glp_term_hook|) to determine whether or not the message to be displayed is an error message. \returns If the GLPK environment is at error state, the routine returns non-zero, otherwise zero. \subsection{glp\_assert --- check logical condition} \synopsis \begin{verbatim} void glp_assert(int expr); \end{verbatim} \description The routine \verb|glp_assert| (implemented as a macro) checks a logical condition specified by the expression \verb|expr|. If the condition is true (non-zero), the routine does nothing; otherwise, if the condition is false (zero), the routine prints an error message and abnormally terminates the program. This routine is a replacement of the standard C function \verb|assert| and used by all GLPK routines to check program logic. The application program may use \verb|glp_assert| for the same purpose. \subsection{glp\_error\_hook --- install hook to intercept abnormal termination} \synopsis \begin{verbatim} void glp_error_hook(void (*func)(void *info), void *info); \end{verbatim} \description The routine \verb|glp_error_hook| installs a user-defined hook routine to intercept abnormal termination. The parameter \verb|func| specifies the user-defined hook routine. It is called from the routine \verb|glp_error| before the latter calls the abort function to abnormally terminate the application program because of fatal error. The parameter \verb|info| is a transit pointer, specified in the corresponding call to the routine \verb|glp_error_hook|; it may be used to pass some information to the hook routine. To uninstall the hook routine the parameters \verb|func| and \verb|info| should be specified as \verb|NULL|. If the hook routine returns, the application program is abnormally terminated. To prevent abnormal termnation the hook routine may perform a global jump using the standard function \verb|longjmp|, in which case the application program {\it must} call the routine \verb|glp_free_env|. \subsection{glp\_alloc --- allocate memory block} \synopsis \begin{verbatim} void *glp_alloc(int n, int size); \end{verbatim} \description The routine \verb|glp_alloc| dynamically allocates a memory block of \verb|n|$\times$\verb|size| bytes long. Note that: 1) the parameters \verb|n| and \verb|size| must be positive; 2) having been allocated the memory block contains arbitrary data, that is, it is {\it not} initialized by binary zeros; 3) if the block cannot be allocated due to insufficient memory, the routine prints an error message and abnormally terminates the program. This routine is a replacement of the standard C function \verb|malloc| and used by GLPK routines for dynamic memory allocation. The application program may use \verb|glp_alloc| for the same purpose. \returns The routine \verb|glp_alloc| returns a pointer to the memory block allocated. To free this block the routine \verb|glp_free| (not the standard C function \verb|free|!) should be used. \subsection{glp\_realloc --- reallocate memory block} \synopsis \begin{verbatim} void *glp_realloc(void *ptr, int n, int size); \end{verbatim} \description The routine \verb|glp_realloc| dynamically reallocates a memory block pointed to by \verb|ptr|, which was previously allocated by the routine \verb|glp_alloc| or reallocated by this routine. Note that the pointer \verb|ptr| must be valid and must not be \verb|NULL|. The new size of the memory block is \verb|n|$\times$\verb|size| bytes long. Note that: 1) both parameters \verb|n| and \verb|size| must be positive; 2) if the block cannot be reallocated due to insufficient memory, the routine prints an error message and abnormally terminates the program. This routine is a replacement of the standard C function \verb|realloc| and used by GLPK routines for dynamic memory allocation. The application program may use \verb|glp_realloc| for the same purpose. \returns The routine \verb|glp_realloc| returns a pointer to the memory block reallocated. To free this block the routine \verb|glp_free| (not the standard C function \verb|free|!) should be used. \newpage \subsection{glp\_free --- free memory block} \synopsis \begin{verbatim} void glp_free(void *ptr); \end{verbatim} \description The routine \verb|glp_free| deallocates a memory block pointed to by \verb|ptr|, which was previously allocated by the routine \verb|glp_malloc| or reallocated by the routine \verb|glp_realloc|. Note that the pointer \verb|ptr| must be valid and must not be \verb|NULL|. This routine is a replacement of the standard C function \verb|free| and used by GLPK routines for dynamic memory allocation. The application program may use \verb|glp_free| for the same purpose. \subsection{glp\_mem\_usage --- get memory usage information} \synopsis \begin{verbatim} void glp_mem_usage(int *count, int *cpeak, size_t *total, size_t *tpeak); \end{verbatim} \description The routine \verb|glp_mem_usage| reports some information about utilization of the memory by the routines \verb|glp_malloc|, \verb|glp_calloc|, and \verb|glp_free|. Information is stored to locations specified by corresponding parameters (see below). Any parameter can be specified as \verb|NULL|, in which case corresponding information is not stored. \verb|*count| is the number of currently allocated memory blocks. \verb|*cpeak| is the peak value of \verb|*count| reached since the initialization of the GLPK library environment. \verb|*total| is the total amount, in bytes, of currently allocated memory blocks. \verb|*tpeak| is the peak value of \verb|*total| reached since the initialization of the GLPK library envirionment. \para{Example} \begin{footnotesize} \begin{verbatim} glp_mem_usage(&count, NULL, NULL, NULL); printf("%d memory block(s) are still allocated\n", count); \end{verbatim} \end{footnotesize} \subsection{glp\_mem\_limit --- set memory usage limit} \synopsis \begin{verbatim} void glp_mem_limit(int limit); \end{verbatim} \description The routine \verb|glp_mem_limit| limits the amount of memory available for dynamic allocation (with the routines \verb|glp_malloc| and \verb|glp_calloc|) to \verb|limit| megabytes. %* eof *% glpk-5.0/doc/glpk07.tex0000644000062000006210000002126413766346220014102 0ustar maomkpasswd%* glpk07.tex *% \chapter{Installing GLPK on Your Computer} \label{install} \section{Downloading the distribution tarball} The distribution tarball of the most recent version of the GLPK package can be found on \url{http://ftp.gnu.org/gnu/glpk/} [via http] and \url{ftp://ftp.gnu.org/gnu/glpk/} [via FTP]. It can also be found on one of the FTP mirrors; see \url{http://www.gnu.org/prep/ftp.html}. Please use a mirror if possible. To make sure that the GLPK distribution tarball you have downloaded is intact you need to download the corresponding `\verb|.sig|' file and run a command like this: \begin{verbatim} gpg --verify glpk-4.38.tar.gz.sig \end{verbatim} \noindent If that command fails because you do not have the required public key, run the following command to import it: \begin{verbatim} gpg --keyserver keys.gnupg.net --recv-keys 5981E818 \end{verbatim} \noindent and then re-run the previous command. \section{Unpacking the distribution tarball} The GLPK package (like all other GNU software) is distributed in the form of packed archive. This is one file named \verb|glpk-X.Y.tar.gz|, where {\it X} is the major version number and {\it Y} is the minor version number. In order to prepare the distribution for installation you need to copy the GLPK distribution file to a working subdirectory and then unpack and unarchive the distribution file with the following command: \begin{verbatim} tar zx < glpk-X.Y.tar \end{verbatim} \newpage \section{Configuring the package} After unpacking and unarchiving the GLPK distribution you should configure the package,\linebreak i.e. automatically tune it for your platform. Normally, you should just \verb|cd| to the subdirectory \verb|glpk-X.Y| and run the configure script, e.g. \begin{verbatim} ./configure \end{verbatim} The `\verb|configure|' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `\verb|Makefile|' in each directory of the package. It also creates file `\verb|config.h|' containing platform-dependent definitions. Finally, it creates a shell script `\verb|config.status|' that you can run in the future to recreate the current configuration, a file `\verb|config.cache|' that saves the results of its tests to speed up reconfiguring, and a file `\verb|config.log|' containing compiler output (useful mainly for debugging `\verb|configure|'). Running `\verb|configure|' takes about a minute. While it is running, it displays some informational messages that tell you what it is doing. If you don't want to see these messages, run `\verb|configure|' with its standard output redirected to `\verb|dev/null|'; for example, `\verb|./configure > /dev/null|'. By default both static and shared versions of the GLPK library will be compiled. Compilation of the shared librariy can be turned off by specifying the `\verb|--disable-shared|' option to `\verb|configure|': \begin{verbatim} ./configure --disable-shared \end{verbatim} \noindent If you encounter problems building the library try using the above option, because some platforms do not support shared libraries. The GLPK package has some optional features listed below. By default all these features are disabled. To enable a feature the corresponding option should be passed to the configure script. \verb|--with-gmp | Enable using the GNU MP bignum library This feature allows the exact simplex solver to use the GNU MP bignum library. If it is disabled, the exact simplex solver uses the GLPK bignum module, which provides the same functionality as GNU MP, however, it is much less efficient. For details about the GNU MP bignum library see its web page at \url{http://gmplib.org/}. \verb|--enable-dl | The same as `\verb|--enable-dl=ltdl|' \verb|--enable-dl=ltdl | Enable shared library support (GNU) \verb|--enable-dl=dlfcn | Enable shared library support (POSIX) Currently this feature is only needed to provide dynamic linking to ODBC and MySQL shared libraries (see below). For details about the GNU shared library support see the manual at \url{http://www.gnu.org/software/libtool/manual/}. \verb|--enable-odbc | Enable using ODBC table driver (\verb|libiodbc|) \verb|--enable-odbc=unix | Enable using ODBC table driver (\verb|libodbc|) This feature allows transmitting data between MathProg model objects and relational databases accessed through ODBC. For more details about this feature see the supplement ``Using Data Tables in the GNU MathProg Modeling Language'' (\verb|doc/tables.pdf|). \verb|--enable-mysql | Enable using MySQL table driver (\verb|libmysql|) This feature allows transmitting data between MathProg model objects and MySQL relational databases. For more details about this feature see the supplement ``Using Data Tables in the GNU MathProg Modeling Language'' (\verb|doc/tables.pdf|). \section{Compiling the package} Normally, you can compile (build) the package by typing the command: \begin{verbatim} make \end{verbatim} \noindent It reads `\verb|Makefile|' generated by `\verb|configure|' and performs all necessary jobs. If you want, you can override the `\verb|make|' variables \verb|CFLAGS| and \verb|LDFLAGS| like this: \begin{verbatim} make CFLAGS=-O2 LDFLAGS=-s \end{verbatim} To compile the package in a different directory from the one containing the source code, you must use a version of `\verb|make|' that supports `\verb|VPATH|' variable, such as GNU `\verb|make|'. `\verb|cd|' to the directory where you want the object files and executables to go and run the `\verb|configure|' script. `\verb|configure|' automatically checks for the source code in the directory that `\verb|configure|' is in and in `\verb|..|'. If for some reason `\verb|configure|' is not in the source code directory that you are configuring, then it will report that it can't find the source code. In that case, run `\verb|configure|' with the option `\verb|--srcdir=DIR|', where \verb|DIR| is the directory that contains the source code. Some systems require unusual options for compilation or linking that the `\verb|configure|' script does not know about. You can give `\verb|configure|' initial values for variables by setting them in the environment. Using a Bourne-compatible shell, you can do that on the command line like this: \begin{verbatim} CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure \end{verbatim} \noindent Or on systems that have the `\verb|env|' program, you can do it like this: \begin{verbatim} env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure \end{verbatim} Here are the `\verb|make|' variables that you might want to override with environment variables when running `\verb|configure|'. For these variables, any value given in the environment overrides the value that `\verb|configure|' would choose: \verb|CC | C compiler program. The default is `\verb|cc|'. \verb|INSTALL | Program used to install files. The default value is `\verb|install|' if you have it,\\ \verb| | otherwise `\verb|cp|'. For these variables, any value given in the environment is added to the value that `\verb|configure|' chooses: \verb|DEFS | Configuration options, in the form `\verb|-Dfoo -Dbar| \dots'. \verb|LIBS | Libraries to link with, in the form `\verb|-lfoo -lbar| \dots'. \section{Checking the package} To check the package, i.e. to run some tests included in the package, you can use the following command: \begin{verbatim} make check \end{verbatim} \section{Installing the package} Normally, to install the GLPK package you should type the following command: \begin{verbatim} make install \end{verbatim} \noindent By default, `\verb|make install|' will install the package's files in `\verb|usr/local/bin|', `\verb|usr/local/lib|', etc. You can specify an installation prefix other than `\verb|/usr/local|' by giving `\verb|configure|' the option `\verb|--prefix=PATH|'. Alternately, you can do so by consistently giving a value for the `\verb|prefix|' variable when you run `\verb|make|', e.g. \begin{verbatim} make prefix=/usr/gnu make prefix=/usr/gnu install \end{verbatim} After installing you can remove the program binaries and object files from the source directory by typing `\verb|make clean|'. To remove all files that `\verb|configure|' created (`\verb|Makefile|', `\verb|config.status|', etc.), just type `\verb|make distclean|'. The file `\verb|configure.ac|' is used to create `\verb|configure|' by a program called `\verb|autoconf|'. You only need it if you want to remake `\verb|configure|' using a newer version of `\verb|autoconf|'. \section{Uninstalling the package} To uninstall the GLPK package, i.e. to remove all the package's files from the system places, you can use the following command: \begin{verbatim} make uninstall \end{verbatim} %* eof *% glpk-5.0/doc/glpk08.tex0000644000062000006210000006415313766346220014107 0ustar maomkpasswd%* glpk08.tex *% \chapter{MPS Format} \label{champs} \section{Fixed MPS Format} \label{secmps} The MPS format\footnote{The MPS format was developed in 1960's by IBM as input format for their mathematical programming system MPS/360. Today the MPS format is a most widely used format understood by most mathematical programming packages. This appendix describes only the features of the MPS format, which are implemented in the GLPK package.} is intended for coding LP/MIP problem data. This format assumes the formulation of LP/MIP problem (1.1)---(1.3) (see Section \ref{seclp}, page \pageref{seclp}). {\it MPS file} is a text file, which contains two types of cards\footnote{In 1960's MPS file was a deck of 80-column punched cards, so the author decided to keep the word ``card'', which may be understood as ``line of text file''.}: indicator cards and data cards. Indicator cards determine a kind of succeeding data. Each indicator card has one word in uppercase letters beginning in column 1. Data cards contain problem data. Each data card is divided into six fixed fields: \begin{center} \begin{tabular}{lcccccc} & Field 1 & Field 2 & Field 3 & Field 4 & Field 5 & Field 6 \\ \hline Columns & 2---3 & 5---12 & 15---22 & 25---36 & 40---47 & 50---61 \\ Contents & Code & Name & Name & Number & Name & Number \\ \end{tabular} \end{center} On a particular data card some fields may be optional. Names are used to identify rows, columns, and some vectors (see below). Aligning the indicator code in the field 1 to the left margin is optional. All names specified in the fields 2, 3, and 5 should contain from 1 up to 8 arbitrary characters (except control characters). If a name is placed in the field 3 or 5, its first character should not be the dollar sign `\verb|$|'. If a name contains spaces, the spaces are ignored. All numerical values in the fields 4 and 6 should be coded in the form $sxx$\verb|E|$syy$, where $s$ is the plus `\verb|+|' or the minus `\verb|-|' sign, $xx$ is a real number with optional decimal point, $yy$ is an integer decimal exponent. Any number should contain up to 12 characters. If the sign $s$ is omitted, the plus sign is assumed. The exponent part is optional. If a number contains spaces, the spaces are ignored. %\newpage If a card has the asterisk `\verb|*|' in the column 1, this card is considered as a comment and ignored. Besides, if the first character in the field 3 or 5 is the dollar sign `\verb|$|', all characters from the dollar sign to the end of card are considered as a comment and ignored. MPS file should contain cards in the following order: %\vspace*{-8pt} %\begin{itemize} \Item{---}NAME indicator card; \Item{---}ROWS indicator card; \Item{---}data cards specifying rows (constraints); \Item{---}COLUMNS indicator card; \Item{---}data cards specifying columns (structural variables) and constraint coefficients; \Item{---}RHS indicator card; \Item{---}data cards specifying right-hand sides of constraints; \Item{---}RANGES indicator card; \Item{---}data cards specifying ranges for double-bounded constraints; \Item{---}BOUNDS indicator card; \Item{---}data cards specifying types and bounds of structural variables; \Item{---}ENDATA indicator card. %\end{itemize} %\vspace*{-8pt} {\it Section} is a group of cards consisting of an indicator card and data cards succeeding this indicator card. For example, the ROWS section consists of the ROWS indicator card and data cards specifying rows. The sections RHS, RANGES, and BOUNDS are optional and may be omitted. \section{Free MPS Format} {\it Free MPS format} is an improved version of the standard (fixed) MPS format described above.\footnote{This format was developed in the beginning of 1990's by IBM as an alternative to the standard fixed MPS format for Optimization Subroutine Library (OSL).} Note that all changes in free MPS format concern only the coding of data while the structure of data is the same for both fixed and free versions of the MPS format. In free MPS format indicator and data records\footnote{{\it Record} in free MPS format has the same meaning as {\it card} in fixed MPS format.} may have arbitrary length not limited to 80 characters. Fields of data records have no predefined positions, i.e. the fields may begin in any position, except position 1, which must be blank, and must be separated from each other by one or more blanks. However, the fields must appear in the same order as in fixed MPS format. %\newpage Symbolic names in fields 2, 3, and 5 may be longer than 8 characters\footnote{GLPK allows symbolic names having up to 255 characters.} and must not contain embedded blanks. Numeric values in fields 4 and 6 are limited to 12 characters and must not contain embedded blanks. Only six fields on each data record are used. Any other fields are ignored. If the first character of any field (not necessarily fields 3 and 5) is the dollar sign (\$), all characters from the dollar sign to the end of record are considered as a comment and ignored. \newpage \section{NAME indicator card} The NAME indicator card should be the first card in the MPS file (except optional comment cards, which may precede the NAME card). This card should contain the word \verb|NAME| in the columns 1---4 and the problem name in the field 3. The problem name is optional and may be omitted. \section{ROWS section} \label{secrows} The ROWS section should start with the indicator card, which contains the word \verb|ROWS| in the columns 1---4. Each data card in the ROWS section specifies one row (constraint) of the problem. All these data cards have the following format. `\verb|N|' in the field 1 means that the row is free (unbounded): $$-\infty < x_i = a_{i1}x_{m+1} + a_{i2}x_{m+2} + \dots + a_{in}x_{m+n} < +\infty;$$ `\verb|L|' in the field 1 means that the row is of ``less than or equal to'' type: $$-\infty < x_i = a_{i1}x_{m+1} + a_{i2}x_{m+2} + \dots + a_{in}x_{m+n} \leq b_i;$$ `\verb|G|' in the field 1 means that the row is of ``greater than or equal to'' type: $$b_i \leq x_i = a_{i1}x_{m+1} + a_{i2}x_{m+2} + \dots + a_{in}x_{m+n} < +\infty;$$ `\verb|E|' in the field 1 means that the row is of ``equal to'' type: $$x_i = a_{i1}x_{m+1} + a_{i2}x_{m+2} + \dots + a_{in}x_{m+n} \leq b_i,$$ where $b_i$ is a right-hand side. Note that each constraint has a corresponding implictly defined auxiliary variable ($x_i$ above), whose value is a value of the corresponding linear form, therefore row bounds can be considered as bounds of such auxiliary variable. The filed 2 specifies a row name (which is considered as the name of the corresponding auxiliary variable). %\newpage The fields 3, 4, 5, and 6 are not used and should be empty. Numerical values of all non-zero right-hand sides $b_i$ should be specified in the RHS section (see below). All double-bounded (ranged) constraints should be specified in the RANGES section (see below). \section{COLUMNS section} The COLUMNS section should start with the indicator card, which contains the word \verb|COLUMNS| in the columns 1---7. Each data card in the COLUMNS section specifies one or two constraint coefficients $a_{ij}$ and also introduces names of columns, i.e. names of structural variables. All these data cards have the following format. The field 1 is not used and should be empty. The field 2 specifies a column name. If this field is empty, the column name from the immediately preceeding data card is assumed. The field 3 specifies a row name defined in the ROWS section. The field 4 specifies a numerical value of the constraint coefficient $a_{ij}$, which is placed in the corresponding row and column. The fields 5 and 6 are optional. If they are used, they should contain a second pair ``row name---constraint coefficient'' for the same column. Elements of the constraint matrix (i.e. constraint coefficients) should be enumerated in the column wise manner: all elements for the current column should be specified before elements for the next column. However, the order of rows in the COLUMNS section may differ from the order of rows in the ROWS section. Constraint coefficients not specified in the COLUMNS section are considered as zeros. Therefore zero coefficients may be omitted, although it is allowed to explicitly specify them. \section{RHS section} The RHS section should start with the indicator card, which contains the word \verb|RHS| in the columns 1---3. Each data card in the RHS section specifies one or two right-hand sides $b_i$ (see Section \ref{secrows}, page \pageref{secrows}). All these data cards have the following format. The field 1 is not used and should be empty. The field 2 specifies a name of the right-hand side (RHS) vector\footnote{This feature allows the user to specify several RHS vectors in the same MPS file. However, before solving the problem a particular RHS vector should be chosen.}. If this field is empty, the RHS vector name from the immediately preceeding data card is assumed. %\newpage The field 3 specifies a row name defined in the ROWS section. The field 4 specifies a right-hand side $b_i$ for the row, whose name is specified in the field 3. Depending on the row type $b_i$ is a lower bound (for the row of \verb|G| type), an upper bound (for the row of \verb|L| type), or a fixed value (for the row of \verb|E| type).\footnote{If the row is of {\tt N} type, $b_i$ is considered as a constant term of the corresponding linear form. Should note, however, this convention is non-standard.} The fields 5 and 6 are optional. If they are used, they should contain a second pair ``row name---right-hand side'' for the same RHS vector. All right-hand sides for the current RHS vector should be specified before right-hand sides for the next RHS vector. However, the order of rows in the RHS section may differ from the order of rows in the ROWS section. Right-hand sides not specified in the RHS section are considered as zeros. Therefore zero right-hand sides may be omitted, although it is allowed to explicitly specify them. \newpage \section{RANGES section} The RANGES section should start with the indicator card, which contains the word \verb|RANGES| in the columns 1---6. Each data card in the RANGES section specifies one or two ranges for double-side constraints, i.e. for constraints that are of the types \verb|L| and \verb|G| at the same time: $$l_i \leq x_i = a_{i1}x_{m+1} + a_{i2}x_{m+2} + \dots + a_{in}x_{m+n} \leq u_i,$$ where $l_i$ is a lower bound, $u_i$ is an upper bound. All these data cards have the following format. The field 1 is not used and should be empty. The field 2 specifies a name of the range vector\footnote{This feature allows the user to specify several range vectors in the same MPS file. However, before solving the problem a particular range vector should be chosen.}. If this field is empty, the range vector name from the immediately preceeding data card is assumed. The field 3 specifies a row name defined in the ROWS section. The field 4 specifies a range value $r_i$ (see the table below) for the row, whose name is specified in the field 3. The fields 5 and 6 are optional. If they are used, they should contain a second pair ``row name---range value'' for the same range vector. All range values for the current range vector should be specified before range values for the next range vector. However, the order of rows in the RANGES section may differ from the order of rows in the ROWS section. For each double-side constraint specified in the RANGES section its lower and upper bounds are determined as follows: %\newpage \begin{center} \begin{tabular}{cccc} Row type & Sign of $r_i$ & Lower bound & Upper bound \\ \hline {\tt G} & $+$ or $-$ & $b_i$ & $b_i + |r_i|$ \\ {\tt L} & $+$ or $-$ & $b_i - |r_i|$ & $b_i$ \\ {\tt E} & $+$ & $b_i$ & $b_i + |r_i|$ \\ {\tt E} & $-$ & $b_i - |r_i|$ & $b_i$ \\ \end{tabular} \end{center} \noindent where $b_i$ is a right-hand side specified in the RHS section (if $b_i$ is not specified, it is considered as zero), $r_i$ is a range value specified in the RANGES section. \section{BOUNDS section} \label{secbounds} The BOUNDS section should start with the indicator card, which contains the word \verb|BOUNDS| in the columns 1---6. Each data card in the BOUNDS section specifies one (lower or upper) bound for one structural variable (column). All these data cards have the following format. The indicator in the field 1 specifies the bound type: \verb|LO| --- lower bound; \verb|UP| --- upper bound; \verb|FX| --- fixed variable (lower and upper bounds are equal); \verb|FR| --- free variable (no bounds); \verb|MI| --- no lower bound (lower bound is ``minus infinity''); \verb|PL| --- no upper bound (upper bound is ``plus infinity''). The field 2 specifies a name of the bound vector\footnote{This feature allows the user to specify several bound vectors in the same MPS file. However, before solving the problem a particular bound vector should be chosen.}. If this field is empty, the bound vector name from the immediately preceeding data card is assumed. The field 3 specifies a column name defined in the COLUMNS section. The field 4 specifies a bound value. If the bound type in the field 1 differs from \verb|LO|, \verb|UP|, and \verb|FX|, the value in the field 4 is ignored and may be omitted. The fields 5 and 6 are not used and should be empty. All bound values for the current bound vector should be specified before bound values for the next bound vector. However, the order of columns in the BOUNDS section may differ from the order of columns in the COLUMNS section. Specification of a lower bound should precede specification of an upper bound for the same column (if both the lower and upper bounds are explicitly specified). By default, all columns (structural variables) are non-negative, i.e. have zero lower bound and no upper bound. Lower ($l_j$) and upper ($u_j$) bounds of some column (structural variable $x_j$) are set in the following way, where $s_j$ is a corresponding bound value explicitly specified in the BOUNDS section: %\newpage \verb|LO| sets $l_j$ to $s_j$; \verb|UP| sets $u_j$ to $s_j$; \verb|FX| sets both $l_j$ and $u_j$ to $s_j$; \verb|FR| sets $l_j$ to $-\infty$ and $u_j$ to $+\infty$; \verb|MI| sets $l_j$ to $-\infty$; \verb|PL| sets $u_j$ to $+\infty$. \section{ENDATA indicator card} The ENDATA indicator card should be the last card of MPS file (except optional comment cards, which may follow the ENDATA card). This card should contain the word \verb|ENDATA| in the columns 1---6. \section{Specifying objective function} It is impossible to explicitly specify the objective function and optimization direction in the MPS file. However, the following implicit rule is used by default: the first row of \verb|N| type is considered as a row of the objective function (i.e. the objective function is the corresponding auxiliary variable), which should be {\it minimized}. GLPK also allows specifying a constant term of the objective function as a right-hand side of the corresponding row in the RHS section. \section{Example of MPS file} \label{secmpsex} To illustrate what the MPS format is, consider the following example of LP problem: \def\arraystretch{1.2} \noindent\hspace{.5in}minimize $$ value = .03\ bin_1 + .08\ bin_2 + .17\ bin_3 + .12\ bin_4 + .15\ bin_5 + .21\ al + .38\ si $$ \noindent\hspace{.5in}subject to linear constraints $$ \begin{array}{@{}l@{\:}l@{}} yield &= \ \ \ \ \;bin_1 + \ \ \ \ \;bin_2 + \ \ \ \ \;bin_3 + \ \ \ \ \;bin_4 + \ \ \ \ \;bin_5 + \ \ \ \ \;al + \ \ \ \ \;si \\ FE &= .15\ bin_1 + .04\ bin_2 + .02\ bin_3 + .04\ bin_4 + .02\ bin_5 + .01\ al + .03\ si \\ CU &= .03\ bin_1 + .05\ bin_2 + .08\ bin_3 + .02\ bin_4 + .06\ bin_5 + .01\ al \\ MN &= .02\ bin_1 + .04\ bin_2 + .01\ bin_3 + .02\ bin_4 + .02\ bin_5 \\ MG &= .02\ bin_1 + .03\ bin_2 \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ + .01\ bin_5 \\ AL &= .70\ bin_1 + .75\ bin_2 + .80\ bin_3 + .75\ bin_4 + .80\ bin_5 + .97\ al \\ SI &= .02\ bin_1 + .06\ bin_2 + .08\ bin_3 + .12\ bin_4 + .02\ bin_5 + .01\ al + .97\ si \\ \end{array} $$ \noindent\hspace{.5in}and bounds of (auxiliary and structural) variables $$ \begin{array}{r@{\ }l@{\ }l@{\ }l@{\ }rcr@{\ }l@{\ }l@{\ }l@{\ }r} &&yield&=&2000&&0&\leq&bin_1&\leq&200\\ -\infty&<&FE&\leq&60&&0&\leq&bin_2&\leq&2500\\ -\infty&<&CU&\leq&100&&400&\leq&bin_3&\leq&800\\ -\infty&<&MN&\leq&40&&100&\leq&bin_4&\leq&700\\ -\infty&<&MG&\leq&30&&0&\leq&bin_5&\leq&1500\\ 1500&\leq&AL&<&+\infty&&0&\leq&al&<&+\infty\\ 250&\leq&SI&\leq&300&&0&\leq&si&<&+\infty\\ \end{array} $$ \def\arraystretch{1} A complete MPS file which specifies data for this example is shown below (the first two comment lines show card positions). \newpage \begin{footnotesize} \begin{verbatim} *000000001111111111222222222233333333334444444444555555555566 *234567890123456789012345678901234567890123456789012345678901 NAME PLAN ROWS N VALUE E YIELD L FE L CU L MN L MG G AL L SI COLUMNS BIN1 VALUE .03000 YIELD 1.00000 FE .15000 CU .03000 MN .02000 MG .02000 AL .70000 SI .02000 BIN2 VALUE .08000 YIELD 1.00000 FE .04000 CU .05000 MN .04000 MG .03000 AL .75000 SI .06000 BIN3 VALUE .17000 YIELD 1.00000 FE .02000 CU .08000 MN .01000 AL .80000 SI .08000 BIN4 VALUE .12000 YIELD 1.00000 FE .04000 CU .02000 MN .02000 AL .75000 SI .12000 BIN5 VALUE .15000 YIELD 1.00000 FE .02000 CU .06000 MN .02000 MG .01000 AL .80000 SI .02000 ALUM VALUE .21000 YIELD 1.00000 FE .01000 CU .01000 AL .97000 SI .01000 SILICON VALUE .38000 YIELD 1.00000 FE .03000 SI .97000 RHS RHS1 YIELD 2000.00000 FE 60.00000 CU 100.00000 MN 40.00000 SI 300.00000 MG 30.00000 AL 1500.00000 RANGES RNG1 SI 50.00000 BOUNDS UP BND1 BIN1 200.00000 UP BIN2 2500.00000 LO BIN3 400.00000 UP BIN3 800.00000 LO BIN4 100.00000 UP BIN4 700.00000 UP BIN5 1500.00000 ENDATA \end{verbatim} \end{footnotesize} %\vspace*{-6pt} \section{MIP features} %\vspace*{-4pt} The MPS format provides two ways for introducing integer variables into the problem. The first way is most general and based on using special marker cards INTORG and INTEND. These marker cards are placed in the COLUMNS section. The INTORG card indicates the start of a group of integer variables (columns), and the card INTEND indicates the end of the group. The MPS file may contain arbitrary number of the marker cards. The marker cards have the same format as the data cards (see Section \ref{secmps}, page \pageref{secmps}). The fields 1, 2, and 6 are not used and should be empty. The field 2 should contain a marker name. This name may be arbitrary. The field 3 should contain the word \verb|'MARKER'| (including apostrophes). The field 5 should contain either the word \verb|'INTORG'| (including apostrophes) for the marker card, which begins a group of integer columns, or the word \verb|'INTEND'| (including apostrophes) for the marker card, which ends the group. The second way is less general but more convenient in some cases. It allows the user declaring integer columns using three additional types of bounds, which are specified in the field 1 of data cards in the BOUNDS section (see Section \ref{secbounds}, page \pageref{secbounds}): \verb|LI| --- lower integer. This bound type specifies that the corresponding column (structural variable), whose name is specified in field 3, is of integer kind. In this case an lower bound of the column should be specified in field 4 (like in the case of \verb|LO| bound type). \verb|UI| --- upper integer. This bound type specifies that the corresponding column (structural variable), whose name is specified in field 3, is of integer kind. In this case an upper bound of the column should be specified in field 4 (like in the case of \verb|UP| bound type). \verb|BV| --- binary variable. This bound type specifies that the corresponding column (structural variable), whose name is specified in the field 3, is of integer kind, its lower bound is zero, and its upper bound is one (thus, such variable being of integer kind can have only two values zero and one). In this case a numeric value specified in the field 4 is ignored and may be omitted. Consider the following example of MIP problem: \noindent \hspace{1in} minimize $$Z = 3 x_1 + 7 x_2 - x_3 + x4$$ \hspace{1in} subject to linear constraints $$ \begin{array}{c} \nonumber r_1 = 2 x_1 - \ \ x_2 + \ \ x_3 - \ \;x_4 \\ \nonumber r_2 = \ \;x_1 - \ \;x_2 - 6 x_3 + 4 x_4 \\ \nonumber r_3 = 5 x_1 + 3 x_2 \ \ \ \ \ \ \ \ \ + \ \ x_4 \\ \end{array} $$ \hspace{1in} and bound of variables $$ \begin{array}{cccl} \nonumber 1 \leq r_1 < +\infty && 0 \leq x_1 \leq 4 &{\rm(continuous)}\\ \nonumber 8 \leq r_2 < +\infty && 2 \leq x_2 \leq 5 &{\rm(integer)} \\ \nonumber 5 \leq r_3 < +\infty && 0 \leq x_3 \leq 1 &{\rm(integer)} \\ \nonumber && 3 \leq x_4 \leq 8 &{\rm(continuous)}\\ \end{array} $$ The corresponding MPS file may look like follows: \newpage \begin{footnotesize} \begin{verbatim} NAME SAMP1 ROWS N Z G R1 G R2 G R3 COLUMNS X1 R1 2.0 R2 1.0 X1 R3 5.0 Z 3.0 MARK0001 'MARKER' 'INTORG' X2 R1 -1.0 R2 -1.0 X2 R3 3.0 Z 7.0 X3 R1 1.0 R2 -6.0 X3 Z -1.0 MARK0002 'MARKER' 'INTEND' X4 R1 -1.0 R2 4.0 X4 R3 1.0 Z 1.0 RHS RHS1 R1 1.0 RHS1 R2 8.0 RHS1 R3 5.0 BOUNDS UP BND1 X1 4.0 LO BND1 X2 2.0 UP BND1 X2 5.0 UP BND1 X3 1.0 LO BND1 X4 3.0 UP BND1 X4 8.0 ENDATA \end{verbatim} \end{footnotesize} %\newpage \vspace{-3pt} The same example may be coded without INTORG/INTEND markers using the bound type UI for the variable $x_2$ and the bound type BV for the variable $x_3$: %\medskip \begin{footnotesize} \begin{verbatim} NAME SAMP2 ROWS N Z G R1 G R2 G R3 COLUMNS X1 R1 2.0 R2 1.0 X1 R3 5.0 Z 3.0 X2 R1 -1.0 R2 -1.0 X2 R3 3.0 Z 7.0 X3 R1 1.0 R2 -6.0 X3 Z -1.0 X4 R1 -1.0 R2 4.0 X4 R3 1.0 Z 1.0 RHS RHS1 R1 1.0 RHS1 R2 8.0 RHS1 R3 5.0 BOUNDS UP BND1 X1 4.0 LO BND1 X2 2.0 UI BND1 X2 5.0 BV BND1 X3 LO BND1 X4 3.0 UP BND1 X4 8.0 ENDATA \end{verbatim} \end{footnotesize} %\section{Specifying predefined basis} %\label{secbas} % %The MPS format can also be used to specify some predefined basis for an %LP problem, i.e. to specify which rows and columns are basic and which %are non-basic. % %The order of a basis file in the MPS format is: % %$\bullet$ NAME indicator card; % %$\bullet$ data cards (can appear in arbitrary order); % %$\bullet$ ENDATA indicator card. % %Each data card specifies either a pair "basic column---non-basic row" %or a non-basic column. All the data cards have the following format. % %`\verb|XL|' in the field 1 means that a column, whose name is given in %the field 2, is basic, and a row, whose name is given in the field 3, %is non-basic and placed on its lower bound. % %`\verb|XU|' in the field 1 means that a column, whose name is given in %the field 2, is basic, and a row, whose name is given in the field 3, %is non-basic and placed on its upper bound. % %`\verb|LL|' in the field 1 means that a column, whose name is given in %the field 3, is non-basic and placed on its lower bound. % %`\verb|UL|' in the field 1 means that a column, whose name is given in %the field 3, is non-basic and placed on its upper bound. % %The field 2 contains a column name. % %If the indicator given in the field 1 is `\verb|XL|' or `\verb|XU|', %the field 3 contains a row name. Otherwise, if the indicator is %`\verb|LL|' or `\verb|UL|', the field 3 is not used and should be %empty. % %The field 4, 5, and 6 are not used and should be empty. % %A basis file in the MPS format acts like a patch: it doesn't specify %a basis completely, instead that it is just shows in what a given basis %differs from the "standard" basis, where all rows (auxiliary variables) %are assumed to be basic and all columns (structural variables) are %assumed to be non-basic. % %As an example here is a basis file that specifies an optimal basis %for the example LP problem given in Section \ref{secmpsex}, %Page \pageref{secmpsex}: % %\pagebreak % %\begin{verbatim} %*000000001111111111222222222233333333334444444444555555555566 %*234567890123456789012345678901234567890123456789012345678901 %NAME PLAN % XL BIN2 YIELD % XL BIN3 FE % XL BIN4 MN % XL ALUM AL % XL SILICON SI % LL BIN1 % LL BIN5 %ENDATA %\end{verbatim} %* eof *% glpk-5.0/doc/glpk09.tex0000644000062000006210000003220513766346220014101 0ustar maomkpasswd%* glpk09.tex *% \chapter{CPLEX LP Format} \label{chacplex} \section{Prelude} The CPLEX LP format\footnote{The CPLEX LP format was developed in the end of 1980's by CPLEX Optimization, Inc. as an input format for the CPLEX linear programming system. Although the CPLEX LP format is not as widely used as the MPS format, being row-oriented it is more convenient for coding mathematical programming models by human. This appendix describes only the features of the CPLEX LP format which are implemented in the GLPK package.} is intended for coding LP/MIP problem data. It is a row-oriented format that assumes the formulation of LP/MIP problem (1.1)---(1.3) (see Section \ref{seclp}, page \pageref{seclp}). CPLEX LP file is a plain text file written in CPLEX LP format. Each text line of this file may contain up to 255 characters\footnote{GLPK allows text lines of arbitrary length.}. Blank lines are ignored. If a line contains the backslash character ($\backslash$), this character and everything that follows it until the end of line are considered as a comment and also ignored. An LP file is coded by the user using the following elements: keywords, symbolic names, numeric constants, delimiters, and blanks. {\it Keywords} which may be used in the LP file are the following: \begin{verbatim} minimize minimum min maximize maximum max subject to such that s.t. st. st bounds bound general generals gen integer integers int binary binaries bin infinity inf free end \end{verbatim} \noindent All the keywords are case insensitive. Keywords given above on the same line are equivalent. Any keyword (except \verb|infinity|, \verb|inf|, and \verb|free|) being used in the LP file must start at the beginning of a text line. \newpage {\it Symbolic names} are used to identify the objective function, constraints (rows), and variables (columns). All symbolic names are case sensitive and may contain up to 16 alphanumeric characters\footnote{GLPK allows symbolic names having up to 255 characters.} (\verb|a|, \dots, \verb|z|, \verb|A|, \dots, \verb|Z|, \verb|0|, \dots, \verb|9|) as well as the following characters: \begin{verbatim} ! " # $ % & ( ) / , . ; ? @ _ ` ' { } | ~ \end{verbatim} \noindent with exception that no symbolic name can begin with a digit or a period. {\it Numeric constants} are used to denote constraint and objective coefficients, right-hand sides of constraints, and bounds of variables. They are coded in the standard form $xx$\verb|E|$syy$, where $xx$ is a real number with optional decimal point, $s$ is a sign (\verb|+| or \verb|-|), $yy$ is an integer decimal exponent. Numeric constants may contain arbitrary number of characters. The exponent part is optional. The letter `\verb|E|' can be coded as `\verb|e|'. If the sign $s$ is omitted, plus is assumed. {\it Delimiters} that may be used in the LP file are the following: \begin{verbatim} : + - < <= =< > >= => = \end{verbatim} \noindent Delimiters given above on the same line are equivalent. The meaning of the delimiters will be explained below. {\it Blanks} are non-significant characters. They may be used freely to improve readability of the LP file. Besides, blanks should be used to separate elements from each other if there is no other way to do that (for example, to separate a keyword from a following symbolic name). The order of an LP file is the following: %\vspace*{-8pt} %\begin{itemize} \Item{---}objective function definition; \Item{---}constraints section; \Item{---}bounds section; \Item{---}general, integer, and binary sections (can appear in arbitrary order); \Item{---}end keyword. %\end{itemize} %\vspace*{-8pt} These components are discussed in following sections. \section{Objective function definition} The objective function definition must appear first in the LP file. It defines the objective function and specifies the optimization direction. The objective function definition has the following form: $$ \left\{ \begin{array}{@{}c@{}} {\tt minimize} \\ {\tt maximize} \end{array} \right\}\ f\ {\tt :}\ s\ c\ x\ \dots\ s\ c\ x $$ where $f$ is a symbolic name of the objective function, $s$ is a sign \verb|+| or \verb|-|, $c$ is a numeric constant that denotes an objective coefficient, $x$ is a symbolic name of a variable. If necessary, the objective function definition can be continued on as many text lines as desired. The name of the objective function is optional and may be omitted (together with the semicolon that follows it). In this case the default name `\verb|obj|' is assigned to the objective function. If the very first sign $s$ is omitted, the sign plus is assumed. Other signs cannot be omitted. If some objective coefficient $c$ is omitted, 1 is assumed. Symbolic names $x$ used to denote variables are recognized by context and therefore needn't to be declared somewhere else. Here is an example of the objective function definition: \begin{verbatim} Minimize Z : - x1 + 2 x2 - 3.5 x3 + 4.997e3x(4) + x5 + x6 + x7 - .01x8 \end{verbatim} \section{Constraints section} The constraints section must follow the objective function definition. It defines a system of equality and/or inequality constraints. The constraint section has the following form: \begin{center} \begin{tabular}{l} \verb|subject to| \\ {\it constraint}$_1$ \\ \hspace{20pt}\dots \\ {\it constraint}$_m$ \\ \end{tabular} \end{center} \noindent where {\it constraint}$_i, i=1,\dots,m,$ is a particular constraint definition. Each constraint definition can be continued on as many text lines as desired. However, each constraint definition must begin on a new line except the very first constraint definition which can begin on the same line as the keyword `\verb|subject to|'. Constraint definitions have the following form: $$ r\ {\tt:}\ s\ c\ x\ \dots\ s\ c\ x \ \left\{ \begin{array}{@{}c@{}} \mbox{\tt<=} \\ \mbox{\tt>=} \\ \mbox{\tt=} \end{array} \right\}\ b $$ where $r$ is a symbolic name of a constraint, $s$ is a sign \verb|+| or \verb|-|, $c$ is a numeric constant that denotes a constraint coefficient, $x$ is a symbolic name of a variable, $b$ is a right-hand side. The name $r$ of a constraint (which is the name of the corresponding auxiliary variable) is optional and may be omitted together with the semicolon that follows it. In the latter case the default names like `\verb|r.nnn|' are assigned to unnamed constraints. The linear form $s\ c\ x\ \dots\ s\ c\ x$ in the left-hand side of a constraint definition has exactly the same meaning as in the case of the objective function definition (see above). After the linear form one of the following delimiters that indicates the constraint sense must be specified: \verb|<=| \ means `less than or equal to' \verb|>=| \ means `greater than or equal to' \verb|= | \ means `equal to' The right hand side $b$ is a numeric constant with an optional sign. Here is an example of the constraints section: \begin{verbatim} Subject To one: y1 + 3 a1 - a2 - b >= 1.5 y2 + 2 a3 + 2 a4 - b >= -1.5 two : y4 + 3 a1 + 4 a5 - b <= +1 .20y5 + 5 a2 - b = 0 1.7 y6 - a6 + 5 a777 - b >= 1 \end{verbatim} Should note that it is impossible to express ranged constraints in the CPLEX LP format. Each a ranged constraint can be coded as two constraints with identical linear forms in the left-hand side, one of which specifies a lower bound and other does an upper one of the original ranged constraint. Another way is to introduce a slack double-bounded variable; for example, the constraint $$10\leq x+2y+3z\leq 50$$ can be written as follows: $$x+2y+3z+t=50,$$ where $0\leq t\leq 40$ is a slack variable. \section{Bounds section} The bounds section is intended to define bounds of variables. This section is optional; if it is specified, it must follow the constraints section. If the bound section is omitted, all variables are assumed to be non-negative (i.e. that they have zero lower bound and no upper bound). The bounds section has the following form: \begin{center} \begin{tabular}{l} \verb|bounds| \\ {\it definition}$_1$ \\ \hspace{20pt}\dots \\ {\it definition}$_p$ \\ \end{tabular} \end{center} \noindent where {\it definition}$_k, k=1,\dots,p,$ is a particular bound definition. Each bound definition must begin on a new line\footnote{The GLPK implementation allows several bound definitions to be placed on the same line.} except the very first bound definition which can begin on the same line as the keyword `\verb|bounds|'. %\newpage Syntactically constraint definitions can have one of the following six forms: \begin{center} \begin{tabular}{ll} $x$ \verb|>=| $l$ & specifies a lower bound \\ $l$ \verb|<=| $x$ & specifies a lower bound \\ $x$ \verb|<=| $u$ & specifies an upper bound \\ $l$ \verb|<=| $x$ \verb|<=| $u$ &specifies both lower and upper bounds\\ $x$ \verb|=| $t$ &specifies a fixed value \\ $x$ \verb|free| &specifies free variable \end{tabular} \end{center} \noindent where $x$ is a symbolic name of a variable, $l$ is a numeric constant with an optional sign that defines a lower bound of the variable or \verb|-inf| that means that the variable has no lower bound, $u$ is a~numeric constant with an optional sign that defines an upper bound of the variable or \verb|+inf| that means that the variable has no upper bound, $t$ is a numeric constant with an optional sign that defines a fixed value of the variable. By default all variables are non-negative, i.e. have zero lower bound and no upper bound. Therefore definitions of these default bounds can be omitted in the bounds section. Here is an example of the bounds section: \begin{verbatim} Bounds -inf <= a1 <= 100 -100 <= a2 b <= 100 x2 = +123.456 x3 free \end{verbatim} \section{General, integer, and binary sections} The general, integer, and binary sections are intended to define some variables as integer or binary. All these sections are optional and needed only in case of MIP problems. If they are specified, they must follow the bounds section or, if the latter is omitted, the constraints section. All the general, integer, and binary sections have the same form as follows: \begin{center} \begin{tabular}{l} $ \left\{ \begin{array}{@{}l@{}} \verb|general| \\ \verb|integer| \\ \verb|binary | \\ \end{array} \right\} $ \\ \hspace{10pt}$x_1$ \\ \hspace{10pt}\dots \\ \hspace{10pt}$x_q$ \\ \end{tabular} \end{center} \noindent where $x_k$ is a symbolic name of variable, $k=1,\dots,q$. Each symbolic name must begin on a new line\footnote{The GLPK implementation allows several symbolic names to be placed on the same line.} except the very first symbolic name which can begin on the same line as the keyword `\verb|general|', `\verb|integer|', or `\verb|binary|'. %\newpage If a variable appears in the general or the integer section, it is assumed to be general integer variable. If a variable appears in the binary section, it is assumed to be binary variable, i.e. an integer variable whose lower bound is zero and upper bound is one. (Note that if bounds of a variable are specified in the bounds section and then the variable appears in the binary section, its previously specified bounds are ignored.) Here is an example of the integer section: \begin{verbatim} Integer z12 z22 z35 \end{verbatim} \newpage \section{End keyword} The keyword `\verb|end|' is intended to end the LP file. It must begin on a separate line and no other elements (except comments and blank lines) must follow it. Although this keyword is optional, it is strongly recommended to include it in the LP file. \section{Example of CPLEX LP file} Here is a complete example of CPLEX LP file that corresponds to the example given in Section \ref{secmpsex}, page \pageref{secmpsex}. \medskip \begin{footnotesize} \begin{verbatim} \* plan.lp *\ Minimize value: .03 bin1 + .08 bin2 + .17 bin3 + .12 bin4 + .15 bin5 + .21 alum + .38 silicon Subject To yield: bin1 + bin2 + bin3 + bin4 + bin5 + alum + silicon = 2000 fe: .15 bin1 + .04 bin2 + .02 bin3 + .04 bin4 + .02 bin5 + .01 alum + .03 silicon <= 60 cu: .03 bin1 + .05 bin2 + .08 bin3 + .02 bin4 + .06 bin5 + .01 alum <= 100 mn: .02 bin1 + .04 bin2 + .01 bin3 + .02 bin4 + .02 bin5 <= 40 mg: .02 bin1 + .03 bin2 + .01 bin5 <= 30 al: .70 bin1 + .75 bin2 + .80 bin3 + .75 bin4 + .80 bin5 + .97 alum >= 1500 si1: .02 bin1 + .06 bin2 + .08 bin3 + .12 bin4 + .02 bin5 + .01 alum + .97 silicon >= 250 si2: .02 bin1 + .06 bin2 + .08 bin3 + .12 bin4 + .02 bin5 + .01 alum + .97 silicon <= 300 Bounds bin1 <= 200 bin2 <= 2500 400 <= bin3 <= 800 100 <= bin4 <= 700 bin5 <= 1500 End \* eof *\ \end{verbatim} \end{footnotesize} %* eof *% glpk-5.0/doc/glpk10.tex0000644000062000006210000001610213766346220014067 0ustar maomkpasswd%* glpk10.tex *% \chapter{Stand-alone LP/MIP Solver} \label{chaglpsol} The GLPK package includes the program \verb|glpsol|, which is a stand-alone LP/MIP solver. This program can be invoked from the command line to read LP/MIP problem data in any format supported by GLPK, solve the problem, and write its solution to an output text file. \para{Usage} \verb|glpsol| [{\it options\dots}] [{\it filename}] \para{General options} \begin{verbatim} --mps read LP/MIP problem in fixed MPS format --freemps read LP/MIP problem in free MPS format (default) --lp read LP/MIP problem in CPLEX LP format --glp read LP/MIP problem in GLPK format --math read LP/MIP model written in GNU MathProg modeling language -m filename, --model filename read model section and optional data section from filename (same as --math) -d filename, --data filename read data section from filename (for --math only); if model file also has data section, it is ignored -y filename, --display filename send display output to filename (for --math only); by default the output is sent to terminal --seed value initialize pseudo-random number generator used in MathProg model with specified seed (any integer); if seed value is ?, some random seed will be used --mincost read min-cost flow problem in DIMACS format --maxflow read maximum flow problem in DIMACS format --cnf read CNF-SAT problem in DIMACS format --simplex use simplex method (default) --interior use interior point method (LP only) -r filename, --read filename read solution from filename rather to find it with the solver --min minimization --max maximization --scale scale problem (default) --noscale do not scale problem -o filename, --output filename write solution to filename in printable format -w filename, --write filename write solution to filename in plain text format --ranges filename write sensitivity analysis report to filename in printable format (simplex only) --tmlim nnn limit solution time to nnn seconds --memlim nnn limit available memory to nnn megabytes --check do not solve problem, check input data only --name probname change problem name to probname --wmps filename write problem to filename in fixed MPS format --wfreemps filename write problem to filename in free MPS format --wlp filename write problem to filename in CPLEX LP format --wglp filename write problem to filename in GLPK format --wcnf filename write problem to filename in DIMACS CNF-SAT format --log filename write copy of terminal output to filename -h, --help display this help information and exit -v, --version display program version and exit \end{verbatim} \para{LP basis factorization options} \begin{verbatim} --luf plain LU factorization (default) --btf block triangular LU factorization --ft Forrest-Tomlin update (requires --luf; default) --cbg Schur complement + Bartels-Golub update --cgr Schur complement + Givens rotation update \end{verbatim} \para{Options specific to the simplex solver} \begin{verbatim} --primal use primal simplex (default) --dual use dual simplex --std use standard initial basis of all slacks --adv use advanced initial basis (default) --bib use Bixby's initial basis --ini filename use as initial basis previously saved with -w (disables LP presolver) --steep use steepest edge technique (default) --nosteep use standard "textbook" pricing --relax use Harris' two-pass ratio test (default) --norelax use standard "textbook" ratio test --presol use presolver (default; assumes --scale and --adv) --nopresol do not use presolver --exact use simplex method based on exact arithmetic --xcheck check final basis using exact arithmetic \end{verbatim} \para{Options specific to the interior-point solver} \begin{verbatim} --nord use natural (original) ordering --qmd use quotient minimum degree ordering --amd use approximate minimum degree ordering (default) --symamd use approximate minimum degree ordering \end{verbatim} \para{Options specific to the MIP solver} \begin{verbatim} --nomip consider all integer variables as continuous (allows solving MIP as pure LP) --first branch on first integer variable --last branch on last integer variable --mostf branch on most fractional variable --drtom branch using heuristic by Driebeck and Tomlin (default) --pcost branch using hybrid pseudocost heuristic (may be useful for hard instances) --dfs backtrack using depth first search --bfs backtrack using breadth first search --bestp backtrack using the best projection heuristic --bestb backtrack using node with best local bound (default) --intopt use MIP presolver (default) --nointopt do not use MIP presolver --binarize replace general integer variables by binary ones (assumes --intopt) --fpump apply feasibility pump heuristic --proxy [nnn] apply proximity search heuristic (nnn is time limit in seconds; default is 60) --gomory generate Gomory's mixed integer cuts --mir generate MIR (mixed integer rounding) cuts --cover generate mixed cover cuts --clique generate clique cuts --cuts generate all cuts above --mipgap tol set relative mip gap tolerance to tol --minisat translate integer feasibility problem to CNF-SAT and solve it with MiniSat solver --objbnd bound add inequality obj <= bound (minimization) or obj >= bound (maximization) to integer feasibility problem (assumes --minisat) \end{verbatim} For description of the MPS format see Appendix \ref{champs}, page \pageref{champs}. For description of the CPLEX LP format see Appendix \ref{chacplex}, page \pageref{chacplex}. For description of the modeling language see the document ``Modeling Language GNU MathProg: Language Reference'' included in the GLPK distribution. For description of the DIMACS min-cost flow problem format and DIMACS maximum flow problem format see the document ``GLPK: Graph and Network Routines'' included in the GLPK distribution. %* eof *% glpk-5.0/doc/glpk11.tex0000644000062000006210000001636013766346220014076 0ustar maomkpasswd%* glpk11.tex *% \chapter{External Software Used In GLPK} In the GLPK package there are used some external software listed in this Appendix. Note that these software are {\it not} part of GLPK, but are used with GLPK and included in the distribution. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{AMD} \noindent AMD Version 2.2, Copyright {\copyright} 2007 by Timothy A. Davis, Patrick R. Amestoy, and Iain S. Duff. All Rights Reserved. \para{Description} AMD is a set of routines for pre-ordering sparse matrices prior to Cholesky or LU factorization, using the approximate minimum degree ordering algorithm. \para{License} This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. Permission is hereby granted to use or copy this program under the terms of the GNU LGPL, provided that the Copyright, this License, and the Availability of the original version is retained on all copies. User documentation of any code that uses this code or any modified version of this code must cite the Copyright, this License, the Availability note, and ``Used by permission.'' Permission to modify the code and to distribute modified code is granted, provided the Copyright, this License, and the Availability note are retained, and a notice that the code was modified is included. AMD is available under alternate licences; contact T. Davis for details. \para{Availability} \noindent \url{http://www.cise.ufl.edu/research/sparse/amd} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{COLAMD/SYMAMD} \noindent COLAMD/SYMAMD Version 2.7, Copyright {\copyright} 1998-2007, Timothy A. Davis, All Rights Reserved. \para{Description} colamd: an approximate minimum degree column ordering algorithm, for LU factorization of symmetric or unsymmetric matrices, QR factorization, least squares, interior point methods for linear programming problems, and other related problems. symamd: an approximate minimum degree ordering algorithm for Cholesky factorization of symmetric matrices. \para{Authors} The authors of the code itself are Stefan I. Larimore and Timothy A. Davis (davis at cise.ufl.edu), University of Florida. The algorithm was developed in collaboration with John Gilbert, Xerox PARC, and Esmond Ng, Oak Ridge National Laboratory. \para{License} This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. Permission is hereby granted to use or copy this program under the terms of the GNU LGPL, provided that the Copyright, this License, and the Availability of the original version is retained on all copies. User documentation of any code that uses this code or any modified version of this code must cite the Copyright, this License, the Availability note, and ``Used by permission.'' Permission to modify the code and to distribute modified code is granted, provided the Copyright, this License, and the Availability note are retained, and a notice that the code was modified is included. COLAMD is also available under alternate licenses, contact T. Davis for details. \para{Availability} \noindent \url{http://www.cise.ufl.edu/research/sparse/colamd} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %\newpage \section{MiniSat} \noindent MiniSat-C v1.14.1, Copyright {\copyright} 2005, Niklas Sorensson. \para{Description} MiniSat is a minimalistic implementation of a Chaff-like SAT solver based on the two-literal watch scheme for fast BCP and clause learning by conflict analysis. \newpage \para{License} Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \para{Availability} \noindent \url{http://www.cs.chalmers.se/Cs/Research/FormalMethods/MiniSat} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{zlib} \noindent zlib version 1.2.5, Copyright {\copyright} 1995--2010 Jean-loup Gailly and Mark Adler. \para{Description} zlib is a general purpose data compression library. All the code is thread safe. The data format used by the zlib library is described by RFCs (Request for Comments) 1950 to 1952 in the files \verb|rfc1950.txt| (zlib format), \verb|rfc1951.txt| (deflate format) and \verb|rfc1952.txt| (gzip format). \para{License} This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. \hfill Jean-loup Gailly \hfill Mark Adler \para{Availability} \noindent \url{http://www.zlib.net/} %* eof *% glpk-5.0/doc/glpk12.tex0000644000062000006210000010631213766346220014074 0ustar maomkpasswd%* glpk12.tex *% \begin{footnotesize} \chapter*{\sf\bfseries GNU General Public License} \addcontentsline{toc}{chapter}{GNU General Public License} \begin{center} {\bf Version 3, 29 June 2007} \end{center} \begin{quotation} \noindent Copyright {\copyright} 2007 Free Software Foundation, Inc. \verb|| \end{quotation} \begin{quotation} \noindent Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. \end{quotation} \medskip\para{\normalsize Preamble} The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. \newpage \medskip\para{\normalsize TERMS AND CONDITIONS} \medskip\para{\normalsize 0. Definitions.} ``This License'' refers to version 3 of the GNU General Public License. ``Copyright'' also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. ``The Program'' refers to any copyrightable work licensed under this License. Each licensee is addressed as ``you''. ``Licensees'' and ``recipients'' may be individuals or organizations. To ``modify'' a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a ``modified version'' of the earlier work or a work ``based on'' the earlier work. A ``covered work'' means either the unmodified Program or a work based on the Program. To ``propagate'' a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To ``convey'' a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays ``Appropriate Legal Notices'' to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. \medskip\para{\normalsize 1. Source Code.} The ``source code'' for a work means the preferred form of the work for making modifications to it. ``Object code'' means any non-source form of a work. A ``Standard Interface'' means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The ``System Libraries'' of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A ``Major Component'', in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The ``Corresponding Source'' for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. \medskip\para{\normalsize 2. Basic Permissions.} All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. \medskip\para{\normalsize 3. Protecting Users' Legal Rights From Anti-Circumvention Law.} No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. \medskip\para{\normalsize 4. Conveying Verbatim Copies.} You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. \medskip\para{\normalsize 5. Conveying Modified Source Versions.} You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to ``keep intact all notices''. c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an ``aggregate'' if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. \medskip\para{\normalsize 6. Conveying Non-Source Forms.} You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A ``User Product'' is either (1) a ``consumer product'', which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, ``normally used'' refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. ``Installation Information'' for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. \medskip\para{\normalsize 7. Additional Terms.} ``Additional permissions'' are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered ``further restrictions'' within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. \medskip\para{\normalsize 8. Termination.} You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. \medskip\para{\normalsize 9. Acceptance Not Required for Having Copies.} You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. \medskip\para{\normalsize 10. Automatic Licensing of Downstream Recipients.} Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An ``entity transaction'' is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. \medskip\para{\normalsize 11. Patents.} A ``contributor'' is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's ``contributor version''. A contributor's ``essential patent claims'' are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, ``control'' includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a ``patent license'' is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To ``grant'' such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. ``Knowingly relying'' means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is ``discriminatory'' if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. \medskip\para{\normalsize 12. No Surrender of Others' Freedom.} If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. \medskip\para{\normalsize 13. Use with the GNU Affero General Public License.} Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. \medskip\para{\normalsize 14. Revised Versions of this License.} The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License ``or any later version'' applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. \medskip\para{\normalsize 15. Disclaimer of Warranty.} THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM ``AS IS'' WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. \medskip\para{\normalsize 16. Limitation of Liability.} IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. \medskip\para{\normalsize 17. Interpretation of Sections 15 and 16.} If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. \medskip\para{\normalsize END OF TERMS AND CONDITIONS} \newpage \medskip\para{\normalsize How to Apply These Terms to Your New Programs} If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the ``copyright'' line and a pointer to where the full notice is found. \begin{verbatim} Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . \end{verbatim} Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: \begin{verbatim} Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. \end{verbatim} \noindent The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an ``about box''. You should also get your employer (if you work as a programmer) or school, if any, to sign a ``copyright disclaimer'' for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see \verb||. The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read \verb||. \end{footnotesize} %* eof *% glpk-5.0/doc/gmpl.pdf0000666000062000006210000066270513766346220013725 0ustar maomkpasswd%PDF-1.5 %äðíø 8 0 obj <> stream xÚePANÃ0¼óŠ=Ú»^;vœ+‚VjSTPÊ…r©*ÑDø?k»$dìÙ™ÙÑÀ; (:¥¦« ;Ãu‹%¢¬¬…¦§±0VúšãÛòçf ¦2Ò{šD¨NÐm“•´’Ι¨´^¢®XeùÄ…QìÞNã@OW²º‡¯vñçØênŸámûùº›§!™/–°”S T–6€°%EÌ~=а‡Ð‡9Œ]HZa¥I\í·Ÿ¸vlÎÔU½Ûä×#×–…ùã4ÐÌJuÙ]Ò.îÖTKEv…´&ÙØMèÂù… ]’ž´ä®•V~‘ÿíR WQId%}¿þ_éæ§Òû«oÖëe endstream endobj 14 0 obj <> stream xÚTKsÓ0¾ó+|”g°"Yò‹SË#¼ ¦† pPlÅMì"Ë-ý÷H^9¤Ä30ÉAÞý´û}ûPð3 ±?d±ý“ :ÏË`µNJpAŠ ÜYw”Äf4(믨le1ÆÐë«Í{8ÝŠ*Œ3t& Í䎑f§6îÄQ¿‹9Føø<݇‘½üCV«å^ŠAÖ»ZêG—9²™SÌm<~/ß9Æ4Ç ›¿èo»­š6Œsd&HÂqœ˜¦šl«uz";b˜° š!ßM<ê´8”ã$± $&„E1‰ ÐY‡9³B¼Øë~g{ÇAh_%‹‰Qoõ £úî)ßvèˆÒgÅ©˜ËÑ´½ž…ç]vµ–÷ÿƒ¸±Õ-(¡,Ã4ö$Û¶Ü»¢¿h:GtĽn¢¥ ™G«å`sA¼ž7RuZÙImöÉr= ÌÔŽŽB×f‰:É\þ‹z;§±áðP¹àÇ 9d¸h¿p-kÄÿ)kNä›ÃS‚IzÚË-õA ƒí¦í‘i7¤#?=ù PV¬ endstream endobj 51 0 obj <> stream xÚíš[sã4€ßùžœ‡Ý/Ð݅ O,i¢¶fb»8ɰå×#Y’ewÒ"§³e6ñ´ÓtÒ(q¿ïéèÈÙ_Ê ùB™Àæf«2ûf‘}õNd˜!E¶¸1ž+8Ïëßó‹ºÚéj·ý±øÞ¼Nf•§€ öuh6W˜å—ÕŒ |×Ô³¹y\ïW»¢®Ú±oþ“ýÖÿÒܺÏî¿'å’Í£@‰öynGúA¬7q@¸Ã%`Ø] 0׃ Æùû¢ÒËÆ\ !ù}Sß6˲,ª[ûµO\ot9› ˆs0›3OëáyðlÆÓÁK  ðà±ÿ£ ,óµÞ8øõµ¹(žÿ©W&˜æñ“þú¾"{‘ìK1ÀC¢ïëjטlÝ7Úëºq)R>Ò¸ÖÛUSÜ·i=W =ÿÈRäÿhÆÄ_ØM™~®t³’tÈ öÈåùø™´÷*5@0!áŸÂÝLzõPΰÈM›Ÿõ¦X¹€¨–¥6 Mà©%4Uêu"‰ `~ëCG0Ùùpê¦ÞŸö¥n‚ŸM±ÓÍrc±IÑ EÚ#qDH¦Þl뫾!OtU|uQ‘ùQ‚r‰zQ?臿í´W7k#H õ¿Ó8¥E4èŠäJÖ%!¯˜×õFoŠÒæ“‘ÅšªÊO +rO—E ©4Cnq/ë¢.K]Ùì²[Â'%Ÿ@WüºU¨3 I;€¸ õíÇûFo·¦þÜŽ)@” Þáäx! é.¢«@uî]Ô\p4EDrDD¶ B(rŠ!­Di_ í2˜óIÄ‹ˆLIÁ9 ]f´5¿ñf_šíϬ œÕºXÙ}•SJ$˜ˆPG˜fgS‚x¿UÛýµÛ±ëµï3.³KvU ô|1Gb#0+˜è0Sùê9È’¢³éˆ-5…fƒ‹;Ö̳~7“8ßW®™ßÎ/¾Ñ®Ú)†p:M* ô`"šlCÀc´soàÒ®¬]¨j©èÄ}À="D,™;1[ÐùÂs¿¨ÍBjÃ~¹9„‘³‡¹€M1È¥‡ý³-`–ÝÊ|w§·Å?.âñ;—gÌ;¢C<™77åI nåyÝ»;³d†ú½¾o{ûv¦©ÛR’ifÀGÀÈìš6ð¿+ çfeCþÎÆ»/Üݹq.dë½:ƒÆçø#I”|8M¥4Ä>~þ,k0ËPɧžB²šH‰ÔÌ`…›<Œš®§0U›ÇèÁa±p·‡5š mzð6=x—‡Ö‡ÓÎ7]¡"RE2YVáœÞªÝ„i™?’LÀï— Fq8}'Ý)íeµÖ»sÚÁê`óaY­ýM1móM89$6߈ŸÑ±ß¤#´¤ˆ{Òá˜õJïµõÉt—Ø EØ8¹×ϸCݺüÞµ÷]ìoµ=³“„œ­’£W‡Hw„i….iº…ú@¯Ù‰a/+^?“;Ž€9âä®(SȘä©´C¯žf¤g D˜é¸y†Äðg>ÄÆ—}©ÉÁÓz8`‚ìÝ9sŽÈ_¾ø†Â1 endstream endobj 97 0 obj <> stream xÚí›IsÛ6€ïý„Âë@P×:¾+´€jnBàÆŒÿíÀ/¯Ì•´’äNR ’~t,xŽè„'S…f–½Éf Æéåu1ogwr/™yÉ‘pîÓMP0æ± ÒYÈNP?mWyUÌ{V].ð‰ð}´$Ó)@|,l©¿Ë—Y7ÝÙ[”SÍ;ìÇð ʳ'c†?»'ˆE4uÊÍÕa§cÞ; À›CÛÕ:«íþäB;Ÿœó –'–Ñ„fF¼+%ŒÉæpöd~›n")€Ûçr—në<«z²M)ÏpßõЈð€ãcC¸‹ îÓÍßÖõö²žWÅÆ¯Àï'Œé…¡È.—¹$°8÷D³Ã«hàˆìy»Dóâ#´ ⟮çfï1@a¬‰æØÂÜõ•xìt¬%Ç–í¶¨’zÖlLêãqwÐÁhÞ\¢å~ž'ÔÕ!½OÝ•#\H!Ôêší6D‡vCXˆqMz˜©t[ý£\å ™úiÝsUmçͶÒ2ÊN9@ËEkôw4¨Ä€…¨1¾kŸËþ›1‹¬ÉÚéª*Wí«b½ÙÚÆë¦u&?A7ã'wuå°xÊŠ››=eÒRþÃŒøªh,iìIk¨¥­yo šxÐLžÓ ÓAGb Ü C×áÂÚ ÷[Ã¥‹ÜWJ;ž‡×¹;L£ë@ŒPÛÙÁ|ûu¹;ÇpF:ÚkS‚(×ú¹W¡èo“xÈ4ºĨp- Ì×µý D0r¹lm¹­-fã>öq¤4º“qd›G´4ßóôª®‹ëõýŪÊçeµ0ß夣€>ž%n:c‚º.#À7A-‹y~ˆ?—ê%œ½>›†€t€)VÞƒkˆº(V›åAfC4B“F÷ëpˆ\Ó‰1àz£ÞfMUÜ2@9=åÁ´Ì˜è‰K軨´ öŽ_¿ø7ê¬ endstream endobj 124 0 obj <> stream xÚí™Ksê6Ç÷ý^Ê T½--IïLçf’[h7m(ÄsMm“¤ß¾G–Á&Á0}Üf,Ë>óû‡þh@àCƒˆÁ—ÓE0œßÿ J°!&˜<‚b!ƒ» ‚ÉìW$1Ã2P*š„š¡"ÎÊe8`ÊK; œs´ˆ«"yõãY\Ån$Pa§ywD„ „1î ýÙ·~ø}òcp3i€ýô©óÈd„aÔeFÚénæŽITa®‚XÒ†3Ê„1tÛ¸ˆ¶²Å6SŽÒØk4u7} FËÿÔÿJšæÃÒ4K€kLÖK€cÚ,«²Læ™÷ïV•µ§K#.üwðï°d}ùKŠÕfi`Öð§ÉÔîïô·aþØw¼ ¢½UPÓvðF…û4Nö.n¢K,Ú¯B‡ho"£¢›ã‡U×Y‚íȼš‰ ü.ü$ïËÞ0ÌäþÁR¨jÙU ù!j¡´Þ )‘Xo@«m/H²ù[/Ì (<¦2/ß®D7$ÅNúº3‰Àýœ`æcÒdQNÐÏ¥ç­9*W¿ª^myÀ½eˆô’¶–²—%R`èNÜ„¡Ëç]Ç•Ë÷Z 8›y‹ªdaýèq•M«$ÏN²­}•T}ëuª4f>‚ ]M¨©@wdÃÆ?9š®ŠÂf®<¯š qj³Ù:$xãÍÙ¸ì ÞÙ2<¼¦X7ŽáŠA~”טŸCè‡lQµ ¸«OÐAM›Š¡úÓõÏUîÃÇ.]˜gVôuÀAÛ@^»9?@{Æ-ÌûÕ8CÚ-8©ûŒê 0Fã_6õMºnÀœi ®“Uþáö!þ®Í‰÷ … k4b^£×áÕøæ]•X¤.ò½w´!­xoyÁ"jäá^ž»ëáè]u$»¨s´:-è#Ô‰&ëÅ#¼:·Ž¿|~W‰%뜇.-bÕ«ògFcá£à5¤ªÑ8OŸ7]ÈÂU mZú /IõäGótYæé)ɱ}¥ê•¬9c؈zÄÙºÓ›×x±Lí[}Ã2³å´H–®A9ÁºÎË¢Þÿ'p®°0ÞÂ:u †nóz‹Â›Å·Íªýý¥HªÊ6'ë}½Û¸zº/rÀoÄyïUt˜ZLW¨ó/€þd3[@»Úì}¾÷Çe‘C> stream xÚÕYÝsÛ6ï_Áé5WáˆO’éC{×fÒØ7q§õ=À-ó*‘*I%uþúîb‘²àÈq<éÝÄ àb?~Øß’?ždð'¹€¿,Yl’ï.“þ ‘1cdry¯ç%6’Ëåoé¿nív¨ºÙ\“òÙ.é<ŠåEî¥54J'ý²ºd³t¹[ uÛøeÂ3Vf%àš• LÒ ?ý2›«L¦çv¸½èf:KÛ™æéÊÖ“ÁyÉD6q\݃¥B¦*Ý€aQ¤Ëj]7+z³¶ÍjgW ÔÍLäéP5Ëj‰="½i;zµ¬úEW_릲þݼªà¿za×Ô³íÚUg7sçß¼ÔLˆdÎ%ÓÊùµ!5RN\ê™þþÒÃÿú…ÿÑ­hx–ä¬tˆ‰ÈÌhTÒiäã`ç‡ècP…„§pcÎÑv޶Ám|ˆ[œ”žzÞuõhP£öOˆ•~¸Y‘ZûYiWÔ=Z PV÷5ÚzZzôÕ@ B?Ø¡ÚT4 =½³Í’PôŒ(.í` Åë5Á¸À¿ã@)œå¡ƒ$ss‰R3aÒ;zIA@ç®w©+UzÓµêÛ¿œ„ÕúÀ7Ðâ“ÂÙVL =ܺ샞¥wnFÓL‡xŠÏK)´@tð±íh~UßS¤×ºZFSŒ ŸóC‡Ì°M¿¶zM3Ag¬ ù 4›bbÓöÀšûˆDxš)VzEGH—Kx38’’@¡(M¹öcmc×wï«~´å~ŒÜ ¶ÏOO*) V–Ó|páB¢œqåhèÈÔ/êú=Ñ[ßëiß5Ž¿F…Ô2˜’˜B»®ê*™«ôÝmíÒì–$76d4|&xÛ·•wrÌûSÕÐÛQ/•è\UMÕÁd5TÎ2ŠI¬‡¥Eé0G¾„(ƒ×™Ô¨!çm³¨¨å,ÀsYwÕbXßQëÝ¿#mv¯ƒ&aâñw|âe){š½¾]¿­bS,9*deKöÚëÁÖ””sK„ÓhÝ<M:€Ø tïü´‘\™pÔòüô¡ï+'ÕIžpÅÀy¿öH•#;\•d|6ç\¨ô,”ïü>¢Ôá=)Ñôï9‹žLJàX@Ô¸J³3Ðq•ž]\ÍHpœD,!¾p¸r¸$ëûnÚ5;€é]ÿµsP–pI0£ÃâRoê÷U0Òzûû§ë“€2)!×s¬F%©y JU(ßÄ”pÎt¨C‹ 0.[° Àe5Y³î©™ìEþ˟͇Dþˆ|ŒW~‰&¶:µ>ÌyY2Åáɱ<œ¢ˆ<˜È(Eä³PÄú EäIŠÈ“‘ŸNïªxª«*‚lŒ"òŽ"‡>?"ò$EäIŠÈg¡ˆ|xcê‚ÄxøÔp alÆããT§[îL†æ'õ³cîQnó ”ã׬=6t/7Q‚þÐS}>žŒ#tÜþŸ‘õã`‰ò2‘Ë¿‘ò!BF?¡<y"8~;>Ë>TÜÛ‡ߥöG)ûÃ.<ŠhwͲŸ~<ËôíLÃ×dW[øÞìã—X6ð¼­(œÒõqfI&L„!O‚W‡õõtÇì¬WTv¶sXWao®Å´¬žF|&`Äg&¾à(ÆœXoî¯)dfº¤¬¹uËOã°¸åÇÖŠâ‰Xʇ°Œ}ó>àÕsÖ ékÅ÷—É “e‘¼s729¨É,æLìÛëäMò³?GSP‹Ë¼ð)w#cïƒ ’Õ¸s4îȦK-3–Qý¸Äã0••á§œ—ak> stream xÚíZYÛÈ~ϯPö‰BVöIÒÇCœØ€6à ³y‰òÀ‘8#:%óóëSÕÕ<Õ:f=»@‚À†Ýlu_UuU5g_f|Â?>‹üg«ÝìÍÍìïôŒ‡, “Ùͼ^àÀÌnÖÿ¾n²2›ÿóæ'XÄÅ`•ä,Ž`-.zl„³ˆ%¾6L(؇eWp·bHG±Hκ?úˆD,ŒÏÒâ  ñ€ÍÜúµ¼ôEÌŽd”§d,<ôfzò)hr!æZÁ(Oo·YõÒGØDL:Âÿön«…{W´g½±›«`;_h|ÎVuþ0&pDïšfö…—’Ií¶\«ô(žÎË4®„3œàèÀ½çêÎ ýká”SG›_íç Ù2äfaw~Ó P‘Lkb$Ï üMí7)Y,¯Ð™´+BÏ1S–iÙ›‹âÎ\”&‹ªN‰÷*+wôn,—Õ&¿«XÎéÝþŽÞt?÷Ê ÏZ›01 [kK¥Ò,2©8÷Šk»%^¸ ‹â³D¢!á'b†D@4õ´ðÁù”yŠƒÏâ¸a±îY ›ýZØÊ4wÀYãR¡`¡Z`DxÁÐt‚J'^?k+bJµuÆ9å¹È«iˆ+h,”J&ž2%¦ È!CoÚùðèþc<ÙíuûuŽþ^â”BdзpîÖF„}S¬ý(pص0üìU‘~ÔÕ4~%ø”yЧÀÐsKûÜDBô‰õÐMn­—œFE…Èñ»=V˜dâ PÔÅheÌYæ© H)ŸŠˆXO§„ôŸŽ"ž†*`aâRŠ¡à„¢sÖBf¤ÏgF\i&[E5Þ¤ð<ÀˆÎÒP¿7ó¼ŒÈÆÐAp–$£hu³Á£¢±lÆ %Y¸òn¿u,w›Õ8üv ã½¢9 @| ¼"àa ÉÅì,%ÝÕ´~álÌ s:±…ÆB ¼ Ã{íYbfBöüŠö$Ïå±]©oé?xèBJÛ:‡Ï¿uˆ¶OïßÍc”YFqg4Vð>àgk›ÚN Þ'Â"IÐûÐøÑ QÒŒŽÖö`[†BùK-ÆeWTZ¶|:œ%Éóèà糖V2Kðk^oúàlNgÙGÇjái˜ï(Ä “X8ª:}…¨§Cß%¸Í³Á}¼CÒ·QžCÙ7 úbhàßkÞÚ+ïëk…Õ~a_¯¤ïòG’Mød›Ø¬Áîz–è§­[‰…]l×|òŠ!™„¸Ø-:WûQ/á³7íd2îÛ þ”¼´ TÚ¢ßä•?—¾m“3‘FO´•g£í6/²Ô9âݾÜyM’‡ ‚Q°ùàás ýµ+Q{_Ø,&§œ‚\jš¨Y<—÷e–Ömü¬7˜Ùœ±¤³Ü%Cöåþ‡“žh~Áññ`*/c*/b:ÞÄx •WÇúŸ}©ïû´×ãy`õ$Ð~u?L®Á,ùßÃìÄù¬ d9 ¦qÝ‹ë¡Ñ' yý_Š‹>‰Ëëïåí%7r!”;¶Ú‰…ó?,'!ß\¯sìuãHQ VRøôá“›)÷€ý®¢ÑÇ´Þ|*÷÷4J·Õ¾}ruWE»ï(ÏÁWŽìÞ–¦?EÝî÷eºÛQ‰hðøýøþœ·þr¶eƵ&èžÏ>Vû]6évëi ¦ºzjÞºÌWukШ‡>Ív‹Fô$`U^¤å·y,ê5¼½¡‹IÎg,Fw3)#0:Õ˜˜Ãy"@“HIë ¹Œ´½“0ÂÞIT>g Uˆ͹ÅQq1@G¶úƇ]ãØíqŒW(ŠK˜¨VeîÄ[»wn+¼C©è«r\^e5*[§‡€Ê`M;1ªØíÜ´Ãß®L]µr èñMLm¾Â‰Í±àšµÅO2òtÕŸ½ ¾æN¹bÖíçlŽM¯nÀ¾ýÐ5x¢Ã šF7Ô׀Ь¢^HgÙ%ÝW¬›5.ªªÎWÍ6u wnE¶¥±•Ú8¬Ý¦®I¢ÚŠ ¶iqߤ÷nTÕÄìÚÛÛ{QÁÛ´Õnr†Ì õ£UeÝ£õCn#»PÒU BÂô§ú¶¤Å[ÇN)ú> Ã-›"ÿÒdÛo4‚é<ȱÇeõ¤¤Ué§DÔ¶~ð‡M´>X8&àôªÌî +ÔàQgõ›öUÛlµÐAûq¨7=ºŒ¦æ[äWÛÆuÅ`…s |ãú~rØ÷(lOl[çë0« ÎÚ†›FC.S³+ß6ù¶vtqþ¡kðiôÌuö8¢j[ƒ1Õ,P€3|ÃÇýçìo_ÏÕàK2þň[ÛOk¹õíŸl)ÓOÿä?ÀãÑ¿tãÃ.=@²Þ§hÈ÷‰ÝE[׿@cL˹/dz§?­ü½o'Ù_-ÁÊûÔu¦^ú¶ˆ#µ4–·6H˜I:~=g{½T{*3ìU†˜:ô_¶,T$N «"6hÍÿm [yÿæ»(0‰ç³‰qŠÉ£¾ÒNüt8KáõÁ º>ðõe¡Èâ}&~zG1å\žâÜ{5"NÝ{,Fƒê´jnÁÉð™îpŽŽTxø3Dõ¬ÊÑßqx(ÝÛ¬jšiÑ{­Ý“b…#2.ZRÑß´[ÓmA‘³hÜân=Ñ~³ËáÎdˆ ¼ ³üŠ£Ï pä>³‘D¬ñØ/oèSœî\íÖ°RIÓ¶oQSHp¿Xëý}OÒËñ~­=[‰ÇÚ‘´2+ƒAh6õº•„L¶Æt)ŒÕÍS=r!©é$ï4¹ ü~ËrßM¦û¸c쓆ßù¼œ|ÿÇл¨§Ó[0èê¼ýjw…ìÊ„}L ¼—~ª\ãnq4ðu¿[†Ý‡_×Ç“óŸHýâ‹ÇÜw <²ð4c®’WìÑXûu+ÚLÓ$XæÒ‘÷w'JÃîó¹ÂßZ}µ¼ÐB!†H(‚Å|Á`8‰`0“ºë…>Áù0Øà%.ÈÓUIö…ÛwŒhrisÃ6=F¢ $Ï´V‹ŒaõˆKsG>o}6¤/ÄŸ=K…ý&(¦F‘p%æÍyñ/W B0kû´ã\Ûæ4îú><“;z°±iY‰mö2]ãòoÔ²„’2‡…QÔˋڕýÝÄiJË endstream endobj 143 0 obj <> stream xÚWKoÛ8¾ï¯ÐQj–)JÚ=í£Z »-ì¥í‘èZ…l¥’œlÿ}çAÙT¬,‚ák4~óqf˜|OT"áO%E?™Ô‡ä›äå문"|dJa ²ë£ŸHua„­À“8÷ªóÜ€¹“ æÞu®=rw _lù“­‚3æôÝ{4Ø î€î»³ªLÿ>-Á‡íøã€'ÆE›ö©•±Æ7¥­»íüs̼ߦ±|l¤¡¯þìã4àiÀ À>S`嬪˜U!'rW¦ýsq`{§ðxŠ\^ëZ8e‘dÜ…%L’7qŽø4t§žÛÁïx*;O9nîÜ0µõ©sá‹%Iaâ1“X/]‹5ñqߟº†û·çÛ‚ Dñû¶¡{–<´ÓžNòòu±ÌÈLX¼4žnÇzhï¦1HÆ|4V˜, ÆÄX#ª"Fú5’)c´Jýîp×ù0DÛ]Pª²HkQŠrÞÞ­ì =`?¯cA½Ž›l۴ཱíè<D¸»0%ÿY*C¡‡=BË>ÖlÉ$ÜǤ7”hÜäB ¥ØÙ1;JÅ9D/W£Î=Ž,†z8Õ@H„ޢ޸etùa0öÇÀ†µF®¡ò3‰ w˜˜¿ °gélÀ´'s<ûã¼7·ïÜ´?ô_gY©äªê*AÇ®&žaFoG"-æä·•mæ¾Qª¸­19mtßT)…´áV ¹š= 7ÅoÀ õ³Ë(°«›äÈ{ÏÐ[QË\ª3ªó¶ª¹ŽJo“/K[¾HÁ€én‰½(˵ô^"øB4± 8Œ—ð“$³"éYy&ÀüÅFÆ}¶ñêVϾ´&ÂÛC-ZÎãž`£H £º œ…¶: /¢þè$I C@/ΠGÆ@ÉÇgò5FSóŒtžŠ‹Âó$æ ñ"ùð›aT’ñV9íÈ¢0|R|ƒ^8Å=ÞWlCù°* ¢ä3! N ½ÐÏ ¨ˆ*‰ožÚ‡/=Tº\ÿHŽId¯D“‚Q† W•ÓWØÒ3ôÿa9¦ð=…æäy™?… ¸µeÅÄÁéÎM\Bç':8zx‚Æ‘·ÛÓ«ùž@űn[xÆ ?XœÐÃ'Y½p©…íUA%ç²°†:> stream xÚ–osÜ4Æßó)L™`×ÿíK™6mhZ(”-ÐF±uw¦¶u±|¹>;Z=:Çiš9—If~·Òjµ»Z­l[¾å©?ßJõïYym=˜Yw+ðÜ$ ­Ù\M;S¬YñÊ>\²UÇÛ‰&‰L^Ïž(íÔ "7ÍR£+a m¡=»(›­HíÚ ð rÁeÞ–«®±[¾çN½)Ùòcw){™ÂÞlÉÕº,Òv‚ÔØQòÐŽ(%˜“b¦æ 3næ°ªØn¤ã—~ÍE[3ó{-á»úyÿäðX;6¦'ʃ%kYŽ„d¡-yçNœxšRž0!u\Ž ÅÝ8Ò¡\LâØfUI~…ü •:Â0D„™‰PÉ×#T¬åï,™‹ªäÔFù| ÷}4Ãy³ê¸Q`9Aä©#Ó®¼½UÕx=ÐeÕjÉÎtòyWæðàZ&ä9I?Xò{¬ÜW9 bûp<"ûÒ·Àcàx<¾¾ž??ÏŸ€`ü ¼^¿¿¿é€®EÀ0sä@pD0‡´–@ ü ¼* @+àh tÀ¸6À%°þþØWYæ¦ñÈš¸Òmèø×5oQÁ׃÷| B B6cH 0ÝV„®?²Ôºr…2ÏKVý¿:ÿþÝ>>>C\§6ÄÓ ø9ðð%à.p8î__߯€×ÀïÀßÀ[ààß})ŒS7™Á^u³,;îÈËMƒúÐü˜ûûØÜÕCsƒŸ™;ÿbfšÅÑ{eI%ší˲[R‡ TÛ–]«[z©›§lY%!±¦€J.êš«ªNìNO©f«¥-„áC@뮇§6¿ÌùªÛ„µVT0‘“Ø/¡Ã×»PK'‹ýãàö­'sã± ³ùþíiL[¢hY.šòÔó£œé«JoT’fôšnIK]X5¡ÕÏt\£kI¯& Ï[Î+£»kþÁfBÚ\/öìŠ_–9ݽ¸);ãL'n¼8ß²^µúÁº˜`× ì–³‚•êhhf‹A1'Æxëh`ø<ÒÄàyTÑEÔßut4‡´ªE꤆š¶hF$_©vRŠVF(daÞŠƒœ!ï7ß¡œlQðå¤sô‡‰ê%€<ÐÞPJ¥b‹>Ú èbg†u¨ˆ]*ûª8ÙâhU㕱°ç+Â|'Ñ× ùùš7¹ù²Æý>$˜lèÅMÞ{¾@ÌW9]ˆ¶ärßI”®ïk2]¹­iG”¥¨ð…vÃj.ïíÙ2öw:òeèÞxðv}dï~ª#e#ûè@wײôYŒÝ*R_ááÈ­®tßPh|«/¶h‹ýÛ$±›Œ<´®*Ȳ¦Höo%n4öˆ®tw-\] Ù7Ñþ=˜í ö¶Êów*»bÍbÍæb°Ým.J™¯¥n&$šöiî€{«¿Aè»Aj9‰ñ¶ÿ‚yþÑŒÂ^C endstream endobj 150 0 obj <> stream xÚ¥WKoãF ¾÷W¾DÆÆSÍC¯cHÑöP´ØÜš"PäI<…,9’¼‰ÿ}É!Ƕl%ÝÅ"FæErøšÔìe&g1üÉY¦àϪÍìóÝìç_¤œI#´IgwOp¾”±(`¾ú;RB.–R*}Ùo:ŽKøßÖ®‚I–DM¹±ý⟻ßAL2CƸ@)2…™-U!´ö’n˜¨8%R"3p!ž÷ûÍã"‘,Úh=!93"WÌTµMïú¡™Gíe½]— ¨Ê";xi¸Ù¬hÒ,`·±dQ…ë²+«Ávý5^žGÃÚù},M×ã^׎¸HB¿nw5‹Ç{óˆGj‘Àÿ¯ð™jxLÝÔ5xSktŠ%v2l““aj¢²³´·»]S ´ºª²·DÒ[pÊྡྷ${¿ìÃüćã\$™Û·r³­9Š·wœgä,ŽH¥=u|jÛÝÚõð+‘?ü låcõ •|?eŽŠ}¹ôz‹½aLJÞÀ½]oW´5´4º•õ‘ÜÓwL´i}hV¶&Š'Iô¯­w¾|d&ÚBFllH‰LG_ úß•à,ÞúÒÑU°KagK¦Ÿ\Åqéï9Ÿ—> »7wK¹få*ÛSô.\C#ådÆÀvȘÞGö­²Ûáâ“ÇÓ‹aÉ{ýðÎmœ‡Üö‹]ã^vöIä„Å\Ö=MÜ™ŽÛn2^Zè ærBÄK¢1‘" ÜÓÑ„,Ó§Ðx@G‡Âž}c—6\+|=ÖPÉø¹ÕvÀlž² UÇ6äöc ê¤D»fT¤é˜+:F‰#Þj,5Œ§\/Ê~R¯<I¸Ø~ìÚ©Î`i’Tœ|o ¥¤H?Ùh!LŠË¸îöSrºO #²ü’D PÐ.³o鎀î:ÞP©qðhÛÒØÙmg{Nî¿N[F ÕË®ä38_V8k®±j¥Xµò[¨VXÇ\»c°­| WolÙ¸æùcL7*qÁ˜®CW>tÀø=þA7.….v¹JD—ÓˆžJÔê˜èªðoM 4SPûšÊâÊøšŠcÙ=:h™º=»o⦺õA ؈8‰ÔX?q¯íjü²kÛÓyÛÑ^ [µ;èÖèr?ušMÄ(¨;üÜz¦²Þ)¤qÆ€r/;G­`I’#jLöh¿=QE,i*ãÜßLSyŠíæ@;í_qˆéàè%/§9¿&e±žÐ±øCCó#ÀÀb0°02¯ÐðˆwZ¶(Sí3¤t½_ä:º¦Ð…¯0ú6âø9›§®§-2gí˜/˜óƒÙ¸8šíå4ï\Cr…7{ü–¾ÑFøâ]Œ5ç.øÑ¨$QX¹þ ¿– ƒ…7L£7døÕ¥ró –¦¥·qdœ_2Â]åpuże]O ŸÏµuÝ µ×ó9 .ÝŠf¾3ÀIUnøêóoúŽ üƒ0üÎ×1qvãÓœê¥TŽÖ.S“S1‰é_?ýÏ&lÍ endstream endobj 153 0 obj <> stream xÚ½XYÛ6~ï¯p ·+®(‘:r,Ð#Ú ì[’Z™^ ‘%W’÷(‚þöÎp†²d)ÇS± ðÎh>¿zõ÷J®ø“«$„ÿ`UìW?ݬ®ÞJ¹’JD*^ÝlaÝ—È ¿yç…B­})CåýnžÖQà5í¦[¸ù ¶é î’Zdj凙ˆ"»óGÊÆBR¤!Àõ ¯i×Zz›uJ %Y²ìÖ~E^NMgþ>šº08R^³åÅê°Ëo×~˜z¦/ š,Öaâíò6/zÓ:-õ†:+Üt]y[=±êfo¸G«¦(ójПt û;ŽD^©Ðìuâ œúˆ¦2´ÙÙmNë¡WÖ(Ð78 ¼•“,Myoîš¶4Ý‹%³@H¤ÅÐt¦½7„¦¯âx€7ð+ÕB;—°# ¼‡]I>º/¨ë¦§E\Á;³!oòŽfº§=:CRMj,8a&…NHhm-ÕùÞt`.Š{sÏt*"wîuSûÖƒ‰sQ~Í9Ä"ŠOÞ¡¹‘wQxy‹K¯5EsW—ÿ O¸p‹BOÔ/:$óØó.;°«ß™Öl§°¢Î(ìåô•¾Œ•ˆ“1"#èb‚ÎFµŠbŒ/Ö)Änv£­ÅÅÆ™ éƒ.žÎ’¯ µw;·MU5¸ñ¡¬ï\€Étafï±/¡3kÕWŠH3´¦êÌ0éðÞ7sÁc]”Ašˆ &”]¼}šÉ—Û™ZŒÅs±‡²ß• z Ú¢…»=W]ÏTC$‘ŠP‰DŽUlÊívAÀL ä ½¨é~¦¨2£ïszàŒê…öCP({"qh%ÿÀë±Ì;É<"ocº¢-™'™ËšÂc´¯3EGÇ¡̘.ÊŽ*èÌ)gw9Nß㤕‹½÷TÖx–z{“×`9HF|K{KAò¡$#©Ç_L*Íã¡ÊËšT€›5µ›²+Ž@ç4N)5À|Ñ´€Ó}½Açè”øf.#Ýw xºˆ!R@×·GBá’ðzÀËv£|Ç\ã`G* ßÜ,§Ü0Ö"L9çjι¿˜ªÜ—6w}1ãª/eÜ(ãÐÚ8mKùV ¥Fù6Ì"Ï”HsØW˜{±é¼ÊÐò4Eâê$Ý’Ps¶ÈÝvqK³½ :±8~M5_ÞÑÚ)n»E.“±%qüìÓ<.. e¾zÍk»"½çÏyâO|âö·××ÃÂÇgµ±Ìkn_]³²OŸ¸ó’Wþåöƒ“ôçZ/Xës§Õ}ë÷®#xå…›xï1 ñ…0R"u¡°]ÂÉg‘‘ñ+6þʹ=ç‰Kn…p¶×_³}·DoQˆ,ÓÛ¯\Ø Wì¾öêáÍ,»žoš+'¡d/ð$p.îfv»æX1žHuCvºC^˜n"àŒ@×Ôg_9µ÷9ÞTIH[T2r¬£ñ”1Qt`L\>1¦Ò1cªD2c¢Øà FŒ‰CdHÔ;fLœÿ?˜rìíˆ#Õ7p¤‚WAÆ3EþÜì÷pð0é¿éYòv+E‰ö6uµ8¢ ô‡¬Ž­{ØÃObö:{ڎИrê¡§ÄTBçP08´–¤îËM\`ë—·EàŠóË^ëã¢*RŽ*Ý4™äP0²·ÑD5–¯‚L“ô,=Gêü )ˆˆ¿N’0rÅB»‡ð¶O®HµÓ¶ëi€Ô£\ I`îl',‡"ʦ¿‚H…:Cïö~ÁùLM1hj\æÃWòÜ•uÇë¹íõYk‰£ ñä!ólék0Ò‚¡X†³€Zü±7µ­`päðIµgœå.88tƒ…9(À'Ç€B¯d‹€jynˆž?8| úpÆ&aûl\z&ST³t‚jªGæm3z“76Ô"xÒÈkŠÄ^&*%UÓ¹²tTÝŸ't•\¼ºX¾öA6:Œ%¡Äª€D.®–tH¡\©.x}2Kè‘4pû›Ç|€²~ÊbãMÀbZ¥)(ÿáH5ðX¶9[¼¤Î3jnv:ö\›SSŒnǤn\¬â…ð–²…Ýx¿,ãpþeÊÅXƃ“ŽÃ%˜¸«áQŒ(ñòñqKGÿЙ'ìèۼ·” ëtu`Hg\ 惈Uì’ Ì”õÄŠ>³¢EûŸIgHÝç)Ë>FzãÛü¿ôÐÙË*·E(ÿŠsžÉÆx†aŠvýXQ5*¥ýó»ÿ®!• endstream endobj 156 0 obj <> stream xÚ­VÛnã6}ïWèm)4âŠ7]Ú§m›¶@(à·$´L' tq)©M€~|IÎÈ–6ÎÆ °(ž™3Ρ£¿"¥î✻oUmôË&úø™G<¥Y&¢ÍÞm'¥_D›Ý ùõAFcãDdñÝæw‡Î#.i^äˆVnQôõÓ!)±fê¾®"–Ò2-=œ)ZJgRP&Ÿ:D•KTA á\{€y:ØX1>ϸT‚òÁõ'’§DÃãŸÙ÷^U}{˜Æº»_ù;VŠèf24NòT’/¼oû8á9Ù™Ö;3T¶>Œ>’`³‡§Áìð") šºÜ™ J†h+g5ÖãdºØ‘ŒÎƒœô{ÿ+Heì¨ëÎ/$F=švÒàk銅þ¾t`yo:cuƒnô`ÀÇ*Ö°åžêa„ÐJÒBÊÎA·à•{BŒß+üÞØ[Œ"…Dˆà7ƒÖÝ.”88Ĩƃ1ÏȳfC›s>b\ S3êÎCG¨Ë±G€Ð &ø"­=nIRC½zp€Î¥; MÓû0Hîª4šûÞÖfø)du½ÁX´„J¹ì-óí¿¯B±5 lˆdj­+`\„ýó[”eFey!å ;<·žt:Ò7@,ÞC,Ø…¬3°îvæ ‹ú>&ɨâ’°ƒßO•IšŠ ©Nئ¿¯+ݼŸ®È¨RÒ°MÝm_°Ñ• Æ"&©*±ä…FÊâ„1.É×ã¡ËÕjV^g^R9:§Íœ¦ å¶;ùÎQ¨Ó×…ºTT ¡Jzýn¬A¨ýSjÿ°j¿Dàà^ÌÐõH9gK…pKk|²¨™^Œá°òw›2ÕkO“€H3îä9•†N€¢õ¨%ФŽnQ._h2”pãE‡—)9غÕöÙ/Ø:t¿{j Zí]”¢ vô+šzô¢åW%ÙMm;{p›a.qkê†i ט/ŠwvÐV·s0ƒcþÆùu¦R”de(Y †3@¦d;Õ͘øKËï«’®{cMWĆxžVùxø©"Hîn«]íݹ!œ/žcß‘×+¼»ì|™õî"°«>ÎfbÕ‡°îª¦7¹_Í·±KÕƒ;`8”?‹Ã¾º¯Ÿt{hÌ> stream xÚ¥XÛŽÛ6}ïWøQnVŒxÑ­@ ´h $E qŸÖyÐÚrÌ%9ºtw[äß;ádÒ‘7nŠ]€¤4—ÙÃáÈ‹ ¾ˆà/RÿÑbS-~Z-^þ³Xå‹ÕÞ‡9SÙbµ½ º¡úG/ÃX¨@×8ÆÁ[¶z·£ÙêÅá¸/nõ;Z}KÃÝ­¾¹·|·znbÇ‹à㜡›u û²-úr» ¥”AùxlË®ÓM½^Z]bhµC.Yzga’ßíkú}iÞ‘†òЕ4ûx«_ð+ðnšz«{X¾òzŒŽþ‚°Ø¸™¬=æX´°=‘â6;ý7EQ|)‘`< )K„Qþ­iaçRÈà}YC ´0Ö†ªlõ¸¶:’€,Eô…®uýž„zÔzXŠ,hèAÓ’pe½¨àØêªhŸ®õR(bÅï–!,JÚ Y®Üh ®o‡ÍD¢»QB1tRª`S¶šdŠV÷ûªì X7@€\lÚŽÙП~,ÏWEu<”‘{µš?L³˜êäëñ6C“Ïr>Ͻ“IÒº#Á‚–gòr„rsæl ‡¾ ƒH–ÿZÆX‰‡Ò5 ¼6‡á/Ý –Ô—#$Ô~1FØÀü‘4à(!*"á'§¨¤Ts¢‚K2*‚ÍК™G9åÈä} õd¾âô͘¢§Á³UG¼çã-¹`©šâ-m¼ÿ¬»á®Û´úHå èE¾€JU¶W‡] ËœLaWâŒJø„DŒj5ƒE&<$±ö` ìîéA·o†Ã–æwTUi…[]•ux!ª¹T×ËËdOnìb:E“Š“N|ßìü|9{øB’²„EÉ”$e“ôöÿ¥heR#S'5°ðS#'5•H/Îð¾-wèæ™a$)hðs†žF€ÖÔ¾èèE?bÙ5‡Cc®q¼0/d艒Plú± íš¶úÎn:w7EgÊ5˜ë .P©£¹„#³tìxôø>Z¤,Oñ­dinXB3Ÿs¡ÐÂ$r3ç$g2¹Ú‰¸ÞIìûH­LJÒ€ÍÙãŠÅÊŠ_‚œžC–.äØ\Ϲ€È«乿N/Ô&‰ $‹èvxØ—m9“qÉ1ÓÑy®½î5g"!wgǼ{2”z½æ@SdŠ®2ÿªU.©gÂÃóˆ©üÙœR€”GœØO©‰ºœ„„%×ðFy¼‰gh3ú0[œxá²dÖ¿HY–=Ë@=ËJ‘ž혎±„ؾ!yÎré5ÁÅXŽd¦N ¸Œ§[çÓ-€ lu²ä¬Õ}óÉ€ŠOæ¢GdäAæVCGETEQÁZ¯û¡`-€êi+ôÜ|d¦½Tèœ½ÄØvf–œv'ή`A¤D â+̰Ä:¯ðËn?ÛûÁsÏUu.V\>ÀŠ ?Ú9ùra&ó³.}0ÂÉÐáýƒ3¼ŸpÔ[û½ªwOd´ °w¸S†CÑÒº*jPÚ‡#êøHËFìB£vjÐPªÒuÙýçVºy¶Åwyé¶^Ý" ûã —£èßü ɶŠ endstream endobj 166 0 obj <> stream xÚíkã¶ñ{…ÑOZ fÅ·” 𢠠AÓl€q?hm®W,íIrîîßg†¤ž¦ü¸óP Øô"‡ÃyÏp¼z³¢«þèJ3øWÛÃê›ÇÕß¾¥éŠR’J¹z|†ïk“T­w¿EœP"Ö”2}ûòèXnÛ¼*Ö\‹¨6Ϧ6åÖ4ÿ}üÉNS„C%IÅjÍ$‘ÚÂúg±4úWÖ¾ü»®öðÄã¨}îƒy—7mÿÖ½{®Š¢z`*z›—8ƒ%ÑÓ1/Úu^º‘Ï£Æû’o˜Ž^Üã!Ç÷îáéa Ó=àccvBîñ*qèñ`j€àñy­M³¶{[ûíPNL°ýÒoœ&§;‡‹p;ÏžšMÔd£‘Œ‘y‚ƒÞ…@)¸ÿ¾yðÔè{*ˆðß-ÀIÌgðUüïŽf´â¸“ª8¶Æ=ýñ E”GûÈ¢ê9„B®ÏíqÍà1&mÖfåÁ¢Ä­o)6Y½……‚dc„ÊÙ22¼Š'Ìk—Ûü5+–(WáÅéXoÝ °7VòZ÷"LDšP’$g0JIÒmkã$`ÕÙ.Ïʦ'Ä”ì\r¤…¥»¸îïCÐ$Ñ¢§HH WÃ7ÍÑŒÜÂ7Tz}"ÕDLø§§üÓSþIÏ?ÝñOwüÓ=ÿ”ãŸ\äSaÄ%”ÎØ¨6’‡µ ©5IL2’¤cÅi_r´ƒ‚EÛ¬1îÎá,8¬½µ’‚»ýÀ7g«öŽÎê=Ø?'Í’¦r&S1”få.(I”pzVÓÏ~ ÞV†måÞìLkêC^O 0¤šN)á5íÍ1ÛÕÙ a2ònº±æX´“1ÿCšC™U™ÑrÛ¬Þ]Öœ_CÐRäáŸHÓ+mü¯!1À¿ÎÆã^ò2+ò¶óðr3PÔûÉtÅ ?:2uoº,=Maz)‚-M,`cÚ°T¢ù922 Â&nbkòâŽnB-¸‰  ’Èë« }4Û½9dEaïrG=³ïH[Vþ Œi:ñ Û@*Ò÷‹®b³A*ºØjÑûHEbu;üë’³Q ÷æU÷Œ‰d8&‚E‚$RD°óûcö0„ÆÆŠð(aú¾šÅšð‰™ˆôŽD›:èj½Ñã+ÖØº÷8S᳂Ðþ$a ØÜ ñbýnh4Zñ`çC’Ýq6mÍLUz£’wQV˜:¾@‹5ýÔˆ°ÏEUÕaÒrq9tgm ÃtÀ xú8[²½Ê–àǯ0%ûÚdm÷vÑšÈô†Às³ÙÄTVŽ]õ9u Ú×ià²EŸ¯ÆLÜÚü`6a«à}vQ$“YKR‚Ö`Lß”ûö%¬ê"&q+5á,gÏCª®4Ø×ÅjM`þþu±šÛÍ4ürõ¬Î¶^»YÔ´5ºø~s:øö&l-$wzBÃjÿé}7,6H§KœOÍAÑŽu§K5«óöåpÎ8Qp¼'u“Qäqˆ_ßÑ…È2¢KÜûgйfD1;ˆÆá}¬úAׄ>T‡CUvögg¶9„ª.¬¿–œ*Г“[åDOÙ»dl „åÿšbüo ZN`±¢ru½bqvý"2¼döT)wÑp U’æÆ _B¹ ›75B9(‰LšŽ½èIÀÑ¥×}  ÁÓ$ ¹8{ a<ÏDušM×&ž[ÃnlÎ+{ ®®õ$vº‘%-H¤ø ôÔiF^þ_3þG4cšÖ_§4†ÕøÕrû©tƒ°nèÉE}¨nˆËº‘RWíu£®Žåî38a»ÎBH%ÔE^Șl9C“ÕÁŒ-X}Ô)‘cWy§M_R2<¿W½ ÑÔ(’ºÑ‚,á|†©œÆ>½z>cl iRú Æ?äû¼]ˆ„cˆÀÙô°üô‘0,² ³Û"áK5,1*Ê,0!™Õ°Ø…M%I&…¿æMÝ~Òª-WƒzíòÈ7+"@Œß‚§H𠑉«ÐP¤.V?¯~òGâÓ’ªŸÆAÜù-©GU®K³ÏZÌéuÔ9…7Gw´@_8ú'èÅ|D§³³ Èù˜«‡,”+{Ž”ê^2 Ï †“oIûm‰õG ºu¥è˜¤±1?›ÆÆCÁ° ÖûН5º1äÉdÏ»ÌÃn]‘ÞwE–x\d‰»"Kü!EÊíÁØš+Ž®ÝUYØÅ2• ¤“iVe¡‰¶åš +ª,4µUØñ¬%-ߨ'Õå“ä;Æ…S`ª‡³âërÜÙ)üR+ƒz¤w®ñS…Ç{cÊÕÇrûB»NÖ.(”ä§KÝĨsAL¢fE¥;íû“G1÷¤ÛB#.Ä1ÉÇÆ1pÏÒqñêû:+wŒ‰kŠç )¦ÎÚþÌðµ1Ç]µFÕ!xèÀ¢c™ƒQ=ï]ø±ËÑ”?[׃Å{eù-X·b)C;è–ÿêü;Mf$ ¯œœ1t©;½’çÌœàryÿâ¶Ó;Ñmñhýc駆àøýèÒÞ!¿Õ,°ù…R:„}Ã͆ԕÕóC³iA%gã =ø™ÏBù0áã!dξréðS¸Y’tÌÎz\~¼²âÄï»ìØ4yV.ÄÕ(êÈÔR¯¾Šé-Ê™L` ï‹-nˆ#*ÜŒˆ Ov'xã%Óø÷È‘ÜìcÉÐŒXÛÓX,€Ïc˜*žÁì°ò0N»_jãz½°3igc.:.ÂÊ·ë(ßuí`[›òÀ§‰®"F"v¶‡Æwó|?´Ž€àæ™ML¹Ù¶îý.·õ`x`ȼG^NqàYvíÊÞ½Åaî§'Íé&_k×!µ;n‘޾ sR~a,Ák%™‹nèOù˜Q› endstream endobj 171 0 obj <> stream xÚíY[oãº~ï¯ð£ Ĭx§²O§E l¢-‡S4}ÐÚJb[r%û$é¯ï ‡”HYIv[ t±ÁZ$‡3äÌÇáÌpõ·_•𯬀¿rµ=®~u·úåoyµâœUZ¯î`|ÃKV™ÕÝî/…dœ™õ†s¡‹Ï禯ÏÍn½‘VÍË©o†aßµÃú¯w¿.z…óÊ ™pÍ*µÚÍ´õŒ~hU•R9&D‚=p_ë² kÍ ”R©¢½›~¿Å‰D»$U‚<¸PUÔôsê÷Ǻ¥F»¶Y[™ìæ:œ.žŸ`ˆžhü©ÜÎO }ËG.Ô;á”ÚL‘ç¾ó*Ü]¶Mà¶»½n=þKdºÇþcÛÅé‡!l^Hfí‘õÖ³´{e™7 (ßE×dÛp6júɨ”ùÆ¡}~ªÏôuª{8YûàÀóP¨…@ÓÐG `ÀhoÖ±ŠÃÖÓ„øÏaÚïëóÓûîqdÒ7Äì0œã¾ôô5AI¼$ 8ÜPgj$)Šc-ÓG`bã2¶0wT2À]w©SùƒlYI.|¸t/s6è(Ž^3‘¡M-x2ocIì~ŒDåʲʒ÷ÐŒk©'¢û"RÉ‘J21žŒ8ªVp¸¬ó'Ål8ãÜ“ðk …ŒŸnoo?EFp—Œ¸b®¢j¯W k]Ñàý:NçK«KsMì}YŽk©ƒC½‚œ§zXP½a:^z“žRŠ 5×T™¬ÐTl2STÎÁÊÕHò .pcŠ[ü±Ù¡1;É™Ô i’²äµ4Ž£238Â…ÈNp3;ò §¾Û}ÈÓäÀÞ‚¥+™KPùç%T<ÿ]¨dUõ.ãðwdþ'yÜ·(öpº"øT¸CŒ›Æ–@(} lƒÖÿ~„Àÿ ÚïøËñ'ªõËGø«_Füƒt"™“(ÂÀ.=èlõý:ö˜ Šø¿ÄŒ%›©ëÄ.[%Pºê›7ªßÜç †¶º`´¥ôÇ7K †¹+MË·°¤pÇbZ@»€Ä<É~°9f?Ô˜§L;ü¢, |A1óŠp†H,šf‚üîXï#]M}Cs&ªîaI˜ž˜4ñj—¡ñ¿9_N¿'£Š!ä;Ûý}É•ßÑj˜¸)èL6et–ea;É\ï®A~mC™×åP÷DýóZë¢>\âx œÛ(SqÿK¢U°Š%y¤úͤ™æ˜£V¼ði_%²Ô’bè¤<>’\ ZyÖ·Œ8!0F,ßsü#ç ß=3ú+œƒZvsÆþIç 3ç@úæ ¤ÃÐ<ö±^U©}FC-šjªÆñ+Þ~€eêL|~ê†Ùååp®‰=e²€åÑBÍ]ÌÕîB)  9ð˜Æ§E )"@(Ç)›¿ó³OD/Ú•™h À²’t¡äíFNÌRpÇóR„ ZtQ‹ðAé{ä}:^ ±‰ÄqÊ(’Ê.z¦É¬¬´ÒÅúÃ0– p‡d;Ò¯Tý¼ö‡ ”W‡% r AH d¿ÖÓ ¿X2÷Öì¢Y²ê‹ ÞÌô›»åгt¤Xr¶¡äüëlŒ§·>|cÕ™‚Ì–ª¬%F´—-§RÂò©æŒkÎÊ%ñz>Yy?cÍް#¿A´Ë¼­tTsF®E©Jì  ¡m©MØÁc˜•ìΞQБ…†×`´¼$ýFAÉY£a’‚¨ýÃ2„ÆÂî—%>ŽÉ8Ëo߸ÿG”½,ñ¨¦H¸9 ÍG<^ãng|Ø ž¢²ÿþýdUw!-Ö–E‰WÀû±ŸX}Y |$ŸWRƒû> stream xÚ­XÝœ6ï_Á#›ƒ1¦êKZ¥j*EMÔ«úÐk%n—Í¢òq6w׿¾3þÚ½Köt«ìñx~ãù´÷Ù£^ÔK#ø…Þ¶ö~¼ò^ÿL3R’%‰wµ‡ù€†$ãÞÕî/?&”ˆM@i”ø61õó®hð9оü¯Øm‚8e~qÛ}_¶M¿ùûêW`™xÈ$Ì#MHƼ JH’J®ošM”ú°–‡¾|?ÖEWnÕÀÄ ¿©_çõÍ&ˆ„_hÊf[µ½èJM+e„%(cÑ+ÒájºP“ùv(·yUiÆuþï&⾤O2¿ÔÔ¹æÙ•uÞ=HpÆCc‚Hë€Á «Y¦S…A-L·o»ºØ‘MˆÐÿóP˜E§ç ƒ#KTÀ‹³PÀ±™EÁvwåp0ò"" m0§[À¡–òûÅ—MÂ@“Ç|¦SZ~¸P4jë˜ù°ï±rÅL›åÅœ- ¾b-W’Ø’ ·ÄpƒÏv° vÐP¸í±|©’PI&¡tú}^ë·|9õØ–o·­X~ ÀÇÓ€÷…â•>Þ^­„)N OÇ8•é8õ¦†u1HgLi‚±ÐÛî‘ø$$·wè-àõïóáð¡k?©¯A™ ãèße?Œ£jlßVU‹¢ß•\š³$AË@tÂŒÙÃìhÇìh‡3:píÍ0b€MOá{œŠSè45Ð_ªÈ¢ÊHÌAá8ïÐgÈDÍ “ê,«cïÚ3H‰m!ƒçÛ³.•NzË“ï]âeD¤šñš2ÌüƒC°$!¡<ßíÊÁ¸Á¥Â Óo†“Þ3ÉS]¹E9¬Ë§D=¯ü¡íAK_ðÜtôÜ•×!ÁÛš­¹ö˽k3Æ„E£7áÿ€Ô½wH¨Ñ8®:¡ŽëU_¸öHátaŠÜš„¼×aºÅ$=wN$5Æ|½qžN$R’f_s>/.´—Z:R5”·ÔIÏf6¯/kW~)ûç˜9M8$":#‹'‹ø|l‡²°ó»Ì‡hO÷àmª xV¡ëvw©Ð]QçeƒÅœ”ôDâøy%~á´EÈ=ðò$§xåZÏ1ù‡OàŸG2Œk{ȉf9dQ¨}Ð¥òšºT…9_V~­Î~2u«‚@†¶N{v…$R9ÎÙßÉÂÂ!aL§PêJ‚¼q%ѹÀ:0±XUбl+øJ7£ ² á$Lí õZjeð%›×—ð]BÉwÜÉR¾jU(˹¦åª»j’vÕ„¥} •UUY“b,î$O…&ç„Ûwm½R,UÅ­Ÿé¾ž]ùé`<›AöÝB ¤ŽÚ¢R áåP‚®ætÏ Ë¤{1a˪{!¼öûB/×Õž®"Á\äj,û´ìZ–ñÛâVÛ¢¤È‡‰ö¤­™Û1G;Öf*l87í̉"aL*Rõ8––€“ò&Õy®¡a‚.&fÝ~¢òr0K&Ë[H¨é8¹, aÁ¶Õý}‰*Æ‘YæP5—²_ì£DÓ+ö+&“ßÞV“ï´¾\Ê4j¢²[’5»Gzh×ò°×¡¡nv~Ñ& Îÿ=¨ Õ“ÍzŸÇ/g„ÕlâÏ<ÚJ¶=ˆ¢?¨)ÝýîÜ„”g̉ÌᱺÏÀçâ%>í^DDÂÄnW~›]/Hš ˜´b´[j‡Ô:þì‘8Þ—¥$ƒ²*¡¯¼j¨NCÒq ò~÷>ª™…M½ j]ÎäNoÙŽ™a½?6[ îµïìÄÀ;Æ`~ӻ˄(Ü q[”•ƒEMuè+­ãaK0ÔD™`>…ãU†Î¸méoOcÇ„Ô IЩlK€"Š›œGÄ)|Q!Äó²™B”™ÓtN ”IX`þXt©*Ú5;u^Syni¶hW„{ [ð$lYÊæ…ÛÂü~…Cfi4J²ÈOŒF)˜nœÚ}cnFæöißQœ3ÑHLw//3Ñà2µnAÖÎD»/ƒZÛp壭-Ý÷§¶QšÉ«é¶yžXÖ3Ÿâíx]’¬t\Ìž§êÁ}âdȦöCÞ–8pr’°oãh]·œÑ\@Ã,ñS­/SÍdp¦JÊ éÇïþzþÎI endstream endobj 179 0 obj <> stream xÚÕËnã6ðÞ¯0r¨å®ÍŠz«·.°[¤Àm7@IŒL[JõÈRR6é×w†CÊ’£8^ @Q8ˆ¨á¼9/jñeÁ.üø"öàÏ]dÕâýÕâÇá‚»,uÓÅÕnÁC–‹ ¢ÅÕöڹʋvµñãÀÉ ©„ÊV^ìä+/qž l·ûVnq:]C­ì¤ªŠZøk^bxõfg°ö²¬©[™õ]ñˆ;’€ÍÃjƒoJtì©{ ìíUY%n\¨¶c«MÅÎånu{õ+ØeÌóYjóº¤>½4–£è… ˆdÁV^ìsi`].jC` òK/Ji/h$#Œjêízµ 8Ÿ•å‚•„@‚#Ç:€Œ»"Ÿ£]¤]7 £îØÄºé@¨ïY¡<5ªÐúØVi‘ðÌšêA(iµAø´\º¼P[ÍÚsd—JAà:æ²>B”ƒ¬ÝñÎÓƒ’mKÆŽ$+)(V$xa‘(ÑǾ‰!x?X(Y‰¢.ê=¾Gþl ,¢Å‹°XQåˆ#…¡j  Q[©˜VêÃ%ç 0?ˆ0ƒ@ÓtÈŸy« ç^à|~®V¾ëÜ×iJH¦ÐÉÍf£—2ß×ü~6H鉳À±¸ß>Ww«prQBŒ—_ÊHCæG†Ý雷#è¡úRÒj‡¡ HMtð±€EV^„†ÂÒÃKSçq†pp½ÆŠÁ­h7D ø¶Cç#P´„k¸R%2¨#&=Åþ8ÚNp:›Ý }S¼ðÐ\HUTBaÅrcÒ0ÖÆÖSžÄ"ÐTíÐ4¡FNt1LaøhÑ„\ £(1¸ïlûJ‹0ÄE½•Of«¯Ûþ®ÍTñ ÍÖʉ•ܼV¡¤Ò¤P@&„Ü5„|Þe·Ñ! »»¾ÎL‚£äN*YgÒ0ÃPà¶®W€0ç¼b©H¸Ž€º’›s™d爑 ̨‰{!@—²ióë EáѾr®—qlKeÛØUÙ …lJ1lö:‡ è] ê+©(Â! ZÃ`&Ž¢ù8ŠŽ=ÆÉ6Ø7@`š PçTWÒÕ§íËNGäa"&‘ðõ¨GFÆÔñ¦ac컦‚˜Ϟ A1ÿ¨§(΀ƒößXƜ帯cÞ4*fjM2ª5îø?<‰ê¡”¶îñcĘ…‰F\~ _ÅÌs]9Sü bqlŠØÍ!1A'“˜7«91C8rýýÛìÇÙ ÞÑÙ}6ÿ‡·ù—lU6ÓÏ–Ó^/Å]¶\ß¿ã·gxì_,:uãÔ@w]Ü®ÿzÇ×þ@}Bö¨Néˆ7uêlÁÅŽ‚£ÀG¨³ Ÿ—ôèô8‚«öºXßßÒú{z\0Æ.h)K,šâº8ËgÓ ŠmH´³u¿wIÿHüV8Œ]²»¢]žãÍI-þ¶)üB·ç»,ñužEž&þÔèÉ( œ½¬1ið%œMöd:¹h€. wÀ€Ñt¸€î€\Yᨤž-+zó|ù$rS«ð:Ñ©>Bûn”»};ÌŠCÍ‚Lt²‡ œÌÈßV؆ñÝOcÆSªo¨×K sÞÅôô×ËÉûýt÷vù² _ìTSË‹ vVtÏž&þMÄ7“×1æýíëcé‹9+ÆÃ¬³Bï u'xJÛµ¬S—öâ¹Q“LÎ4·»4ƒ–P›t× ÈÀfßôº}b›6(Q[uöæNY¿8zÌÅ?ÑD[ ¨™ÒŒ áPÏÔ:oVG„§ô¥èÃ☹ÜÞ×w„Ðù¸Jq@´Õn¶C5›YèhŠÁLŒÇS2%M[fÀ-Œ^'¦×æ_íóŸæê©E YMZEöFÈË`anIsÜBƹÙ_Ï1€;˜­²Osôóì-l¶NGps ¬ZÑaFivsÔ%á‘Æc† ‹‡íN¨Î°óJ}=MS`¶ºMÍÉànÂÜè”YpB.óæýíå·èŸçå‡0{JtCÿqJ“; B~êC(ª‰AÐsIâ˜Ï8æh#\²z IµAø Í¥þéç ÂÖ7¦[Àr+aè)["§¶ÐÏ2}zýã³Pû™¯~Ê‚d± cyäç÷Ì?0@Ú9²0Ä“­í¿—ß"?‰YÂ'ŒÂämñ)ĸ7¡²3&O è%4còäðèðÝ_„ÚC³µ·Ü¿2Ì;w!ÓIzξŸ°'oúrKB†O8Z"=f:‚ÇWf|‡žW¢k ©ù†ª¹ÙEó`.d~`5™\ì µµŸ!6·”¢V[, “öÔ824&7/A¹›( ñ€Çõ÷ïþ±D endstream endobj 184 0 obj <> stream xÚÍXKoÛF¾÷WðTP€µå>IæÖi›E›Ú·ºF¢$éTÿûÎììò!­íØ-Ð"Iícfvæ›of}Šx”À?¥þ'Ñæýp}÷£ŽxÂò$nv×,WÑLt³ý3¾9”«µ0"¾M¸êú~Ýþt,›•Hc7ÒîVÝüÒx6—H–d E Õ±ýй…sµ*cÆ/ëí©Þ’ÔðÈbgAA«´wÕ†Ê/w]Ù÷UÛ\Á@jâ¢qÛ«¡Ç÷å¦õƒç¶s¯ÍZs“²’imÍAR4AJ…&H âޏ¦Ú ÁáÉf…ygfLËÉ™*‘1,;ÕCáP‰ˆ?¯´Ž‹úTÒOð§]9ø-V§±:ӉËÃ+ÁãûLØÉ©zZWÐcwj6,öfìÊ®l6¥ÛëK;éÝExíO5z¨¸»«ªfON°{ñeRe‡[ò  ÌÃГ¿ÞÝ yqÎr¿P¬ó„%L¬Öœ _ƒ?$GÈÄÇbßÞÁ“ÇeW m× æÌšéÔ }{ê:gGý€¶ÓœÑ¿Ãá÷®Ý“ép²®ô‘®zw`· íhÂÙÚö&”/ò%Eë$“P¢á´ßÒch-xŽÙ3Ûto-uòÅl­¸ÄåY@VŽH¥iL¢€!|6¶gL¿½³Ò!_àð„[þÚ˜’ƒàG1Äœ³~¢¡cY4=í„LÞCÙÇÚ%‹&páòUÞ¯ÀÙ-¨@öX,§€'1Çò¤ºÙöW×YF!8 ‚ J<]±ÊŽæ€Ý ž³‡É|´t€þ¹­ÝA}À?ˆ¥TÙ³ÉTÏN{ÙÙD76Ûºn­K\šŠ¸®ËñxÀ~vª§‰Îg=9xÒ况Ñ>ÙÚcùÄ &€šàŸ –hðêMþm =F×8PîPå}ЍàÁ;úS.Í¢û(OYž£R–ñèÉ4a êè:úpYöü. ÂÁ;OÇ…§°éä‹d'Î\qn5ï‡u:r41ƒÜÛ%žÑ}·qˆRÃòÔ‰ü6ÍRŸ¼·+*@ 憲§ ØV¨¼¨»]þ1“87,ñ)_í L¼ Ñ¡¼ÒÃÄ,(P¡UŽae( Óêu˺/CËùä9è~r磿rÎRmË8på•eªüÍhÅ-4@å#Õûúôº£1Û —¨Iüã'÷Òí/óE+f ©$ÄB¦ŽÉ8ãÉ$w6B«|±ñŠrè®Ø—/0€ó ¸yV;Gn‹]·«3²æˆ©Œ#ki4ÂŽHT­â÷Í:K¥©^ºlÿ‰/ÛÓš”ÄSyy¶)Ÿ¢îÜWðï=òóùªŒ%>«É“[V:‰ÉŒPa7Œ[ÑL…m²{ž¾TuUtôê+”±“…Gå‹ ¨ÌŽï6^ J/Ž»ôÚ—½L—ƒE+‘%ûLm¦Ì]§»š4é±5Y+•Ztë5r]k ýö´±{€´m((C©Ã³¡âP ðý@$góÖötXÚ}ÿ` û †Zï»9È¿cï»8³@YŽ|0NUmf>ñb٠݃÷P¥Hóè€8ŽÂÑ›Â~q\rT46e_©H<¢H^*Z62ó²™èù^öÁÄì4d¶|Ôìc(0+&³÷Ž•a™´”ÿ4Bêù©%Bêù©ÿa„Ô"Bg=„ ­y"¾ûCR…Dm0þÆ4OÈ+ͤg¼}èÚi:×`d¢/®MsõÞ²×åª~Qª&øëRõ)=ØÁ\tJöWÈ1ë2_˜xËá¸Ä^šDÆguKd"v÷î®*û ² ®Àã¾8½Ânmªt¨¦ Ýu»¯6ØäZÕcÕ¦ÉáP 4sQÞ,gÈdqQ,§ŸwÎ ŒCÃ\Ó<ªÄ´ñ¶o:.>½+\ Ä%Uð©øët¥¹'R>•W1¿ÎÌD,.fg…°müÇÝùçºSšÙr8te(Ž‹ªW,c¨8RVï:lfy@ÊüZq×Ûi"Å»N/ š]šªËt“,5_ÁïÚ](™üóJþ3nÖ/ò1“› ³ã¼W¹Ok¡Vú8½ç:‡¾ÛÌãw"q \†”¤ŸùöÅ_jý²H›ñÒÿõ~J$¸¾ˆç‚»—~̘Ô/ÛFÊLз.à]×/‡¡ÉšåâY)àj~÷y=膀õ|N@0q $ßoN}·`\P¹ âhÊ/ƒ²!Rõ+ '4LäntÙœÊGJûXô¾¹Ö÷Âå÷‚ ÷®¢öžg~é‡oþsUH£ endstream endobj 187 0 obj <> stream xÚ½]oܸñ½¿bµ€—'‘”(åÐIpAïÐ>gô¥îƒ,ɶ}ø$mýñá¹æz}È¡°a‘œ!9ß3$½ûm—ìbøIvŠÃo¼«ú݇ëÝŸÒ]³".v×w»$e…Üp Û]×ÿŠ®šýA¤I4ìyû=Ï£Ûý«¨™À£ñ޾íP·U3Û}; Í·v¸§áF¯¶LÏœÆcWÈ,îMçÑ\ö¦UÎ' ºí›anÇÁ'g…ß–s[íÿ}ý °e¸,M5ws³hÈŸîJA±‚ƒ¨åWƒàJI1aÁWûƒ2jYÃö‡,/¢ö.´¢ŒY’¼²b’°<5ðjvæø”‰ÔüÈ$’Ãr|ìšYo˜{¿‰9Í !ÝSO-+Rl¯"ÅÎqnj³F9„0Í<ç,爖çˆ,˜J&rƒ?ÖËP-^™Õz“‚3U¸Š{zh¦&´‡H¶Eä[E lÅ BK@Bc1Иদ6IT€ŠW#…Q”ht”(#BEÆ™³Tè¥FåÙ¥±±ik]Íg<ÅÛÜÁè.ŠÜDµ3 [U¦ùÉÄsÚL¬6Û€Hr&­Dªr V>q»’v¨}äXbô†ÄÅÐ=6A†I¬ÕêèΘc7b xºÙƒãÈ,Õ²21j€Æª[5À(2_ü|›aCPˆ}.Yšœ°ŸÄàÊ…ÒvÃTD²Œ—$™»ã*´ ¨_½yþ†=4  $SÞ' ïÏs秈s„|°`"ÛІ€òß :M ŸHäŽ5 hK'œÇÞÏ &3×´eûf‚}ŠÓ$Nø¬×%c;‹¨ùö853†{Œ„"&h`¹Ð·kÊÙ4ÇAäµS½´õdåz2Χ˓2RO3iÒ¡BOm§št»üLM}¬&Ò5x¤”•lØÆ†“¡ç88vt’sÑMþCT!¢©êYÄV¯Ÿá„É >íu’GI™0þZ0PLZg¹9“ɸz-;Ähuf CfrX³uÙÝìl¦Ðò(e–+’­¼èRò¢ÛÊ×Ü6{‹ÛÊ‹n+W·… hÕ÷Þ°Û*–¿Åmå+n ºX1^S™¼ ²tSYhG©—Rø UƒƒuI±äwU‹‘üEköP¬•¥É±E„ $Kܾ7t.|«§p5ÌKRzÙÑ#»pܳ+Цs ~ßÚ®-uò…n?jÊ릣þ$M£Ïà’:sH¬€úDPQY-fÅ®ý²7…Ž›õ‘»¯m},Í‚_÷)HbjËÛkJ¨ÿÜçPøvG“Ú„ùÄõŒ"âý€b”²ˆ–‘¾n¦–ù›Vb˜ÀF5ö¤ ˆ”…fB×p ,.~WGËÝMcO;RA®›Pë‚V如V§t¡Á^rÀE°b¥D"S¹WÊò˜ÒoÇ’¸j—Öš=¬eÚ§=äL<\Áï j•ÎIJÃçítç[ÖFsõ»"ÓIu“H‰vX(»ð$*6“ &9È>Ôá׳íAücx‰n^‚ñ*‡r±,âõõšz7Ñ y޲óÍþ*|Q­¶ŒÀ’%êåÓ³³#?Ù±·´#Ò‹DFqZ‡FD°E;È3e±÷^y7v&u›Â†Ÿ=½ YN*ñ­ù®Ïsß~ò°á¶P¸qºoJ¡|Eß›èóÕ¼~ÃŽ~0ÀÎþ"D‚œ˜œgR"ÎÑè4¥ÅK›ÊÏ<³·Á §¶ÿÌw^\>‡§‹ Ó­°¾\šN›]çg^ºs¯¡Æ3lQæÝFÿq"t¸àbñ<“¤ý¤°¨ÿøÓÿÀý€ endstream endobj 190 0 obj <> stream xÚí]oã¸ñ½¿Â2s)~‰Ú Ù zh-‡—{PdÅÖF–¼úhvÿýÍÔ§i¯·w¸+ÚÅ."‰œç“3ôêÓ*\Qø®"ÿé*=¬><®Þ=ÈUHILãÕãË*”$« ¨Õãö§à®h÷U·Û¯7‚©àïI»ÿG]íð+ òÆ>˪µ/‰…:ÖÕzÃtfÛ®N ;W$å®KvÙ |J¼TµÃ)×ð÷‹ÅÌËmö9/wö+û|¬³¦É«r5ÏìS—ÿ{-e™Án×??þ\;æ9‘Ò0Ÿ»ªÎÛý!O“GÁ6kÒ:?¶–$ ¤†&×Á³á8³£; ë”d½‰¤ þê IÝæiW$5îB‰ Ý;ŒÅJút¥êÅ>Š÷мÓ)ÛÓ}s΃Ä2W!OÀ˜a“s¤UWlñUJyuŸù«Ù€…{© ˜¾5ïÍjïôTç‘"ÖˆÔf}£®aá¢pð!› pEB,#lîÔd^‘(vÓ̇oÜÍßùø ‰fn~[YÕŠ˜„|*#ò ‹O A˜p×›0¸…?* ^=ÄÀ®¸î‰­=ŽÓWnøƒoÃŒµØ°Š‰Ö_ÙðY¥^¥È+Y¼÷³È:y÷OPClî|©1þSq2€Œ­[»[&-66¨˜™xÛgu†6íœ _¶Ýáà‚‹8:Pžfw7Œa››èÌ>HÔ‹ãÆG„)ë8E—$dW¢û Jz-záEÌ%±Bâ Ê&K»#DÎÂÉ(0²+³­`ZÕXŽ6T€ô0ÐÚñÃц˜ÒÔÆ¢CÐò°ÇSè8(½ ÊžÿMÛ §${]{jÕuu€pHcáå9iL…×&k½êaµˆ Óõ5 õ%ùF$Z¸ã[óë°ï½Ør\Û¥­­ÇaÀ ¢>uÎG “mQ(ÕÁIÊ¡9ñ%˜„C ™Ç*8+·a" ZI›}nÎÝz(ë”4$Ô]aYÓ³çéY0Ë ŒwM¶ÅÄ©âàa­Y`2½ ŸÀLꌃüÅB[¦}Ø ¼¿™ìe8Äc[~ÝÒ4H;0d—ú wè2ÇCå¨Û¡ dœdY>nlŽ5là‹] W]kG 3}ªe6Õj—j¹Mµj‘j£Iª&£ë˜dŸN“úgÔe¯j³ QJaÄ‘ ¿FÆ­bBÕ@Æ·§pŒ?¬7±2µ0=yS³&\^K/q';Á gÚû.¶ ôž¿‹í?[z*6ñ?(¶ƒ ÊŠA´ýî¥Üž= öI8;IC2UJÍÑì1ô¬ žÐèÛÕÿ6já¿Oè0 Pxù£ƒçÿ«ØRŸ13 ÒÓÂîoY»8q¹s¡í\ŒGL;5ï„ ]üÀsf´ 9v<)8¶Y´ [ïàŽjÓ’7Ö(Ì ¸Eä¼éžºv6/>:r¬ÖòõF2Ë®d2¸»±Ï§àãÍëÓÚ~ô“Üd1¾÷± À,z5ì|<€ž&?å7°ÞMñ³WaP[E|ºm[xˆrVQ¯1j=©]¸¦Ø ä: Äf›²õŠíA2üîÕXû!è1©“CJ³ó•{ÚêN0fÆ oûªÉì+ŒwE›ôBƒ+MCËiÊ_”Q‹c¯zcr©Ñ Qš‹bRϟꋆ«Ñ_¿†eŸ£s]R"ø…–Äé‰J×Õàs¦î3½Ô&›õ8£±¦Ã~§7:¯s5Õ¢1ºP–àj¢¬“^ªÕPM‡³X eÜ!©¿Xo7¤S`0+à‘cµMÃ-vÅ LHõ_=_E$ެÇB…y„jf€Ó1¢O:¢# IT_äßÝöÓt˜ÖC¿aìdŽÈ¤âÁ€Âàöõ”î"^ö/'ÜMHø¹“C·d#tp[œ’€É«hÜ{“(„3Ž™ôª~íÑ·€Àö!‰"«‚-±™»aþÌšð6ÀR9·ä{o¬TŒD`u\Ëù¶ô›¸M¢ΰñeLtbzÕa§& ³c¢ƒI—è`8iìHb£‘Ã\Ó¯7Ò"¨/a\Õ2bâ0ÀZWí™;syâ|—Sjã73ü|ê’m#mƒy Ñgñi¥8/U}èá½gHÞ,sןwê7|øðž^ááhöv#nCU™Ùv€hdâòå¤Ë8Äâã˜$ @[Í.!â4]Šh{næ§>ä8ÈlâËìü"‚û¤n³&Oʾ'e{NÛ.u‡§~ÃuM Eº¿ù:ÆæÓ˜Ûï|§ :$´'JÏ] ç>!aòhøbÐXeKH¶8vÍ–_»ÿ‘3ëRh],pïh]ÃÇ9ëš‹tà:'\üF—e·>9qlÒþWÞtm$]JpJ‹QFßx'¥üö}bÞðÍEŒGó‰;üXµYïW‰ó´Üù« ž0â‚çÔûšäõàçëòݾ?ƒ‚yÍÊ™·:oÛ¬1 PÓBÌó,(á4[õٜӤ3BÚß“ÓÙž ìâÆ#é™+> stream xÚÝZ[Û6~ß_á·ÊÀX‘(’’¦Û’`l>,vÞ:–±9cedÉ+ÉMæß÷\H]lÎd² Ú¢HÞÏåãáñ¬þ·JW üKW¹€ÿÉj{X½¹Y½z§Vi—I¹º¹[¥*.åjƒzu³û9zW5¦®×E]­7YZDµ°£¢ao±##ûÉ޵åÙªÙÙOUsÏ#ûéØÙ¾¯Ú†Çï×QDnß©·;ž6ý‚¥ŠúÓû~ÛUG÷©]{0UûªæŒvg·µéÌ€ùåæGÞ"‹•¢C´w@™e‘áFnvÕÁ6(•©yêÐ’`;Kcµ ¨RÑ»®˜¢7k¡#P„Œ®ÜšµÈ£ÓÁvÕ–'Ž ÌÁ¶»&q^½K‹¹†…ˆ¡·IËXH’ŽèásBEG·CÏ6Èé"½ qT±Ôn½B6¬"d÷úŠÛÛèÃÕÃíš~ñ[¬—Óo"¤²ˆ½÷n}î5eœºÕx½Iµžšd¬¤#ÿ>Àl“Á‰aÇFÈXdDö/M‚–‡}Õc¯ˆ¶¦·~Îò”Ù’Ф'»·EÏ@w\6âùƒ= Ñ;óÈv=¨Fª4ú¸·Û`Í)ö8ÒL¯‰^G̤ˆö¦?ûÊ]Û¼ ÄìˆÉÜ9€I½¾1Èâ$ó&ÿžuýd‰\ÿÑ r°ï%ÿLÄ™7Ù/l%Tw~YÄŠµþ£tônÜ 7ÕŽ{†c¹ÅÕ_ר"ÔZ$íϯrÄ‚jkÝNt0œdí +»mÇŒ4EË«Lîqg-EÙÐUÌMEƒL;¢ ñˆm÷,ô£Õª&úf‘d*jÚ—šú‘{»ÓáÀ€ÃÌŸü^û+9…žóWà¬Oõ`ø<¼ù×µ’‘©Ot6“ GŸƒÙ™Xtž¥Õ^¢”Q×"‹R+Q*gœ©Ûûj‹°‡Óh€j –´8´ŽÜÖ€|Üç3ÓêÞ !o*…÷×&ànÅäåÍp‚«¢gÖw]{ð¬-O½5Ý`û ôCóÇ®¥˜ÜXœéDïMcÏÕY\,-k‡žÁ˜dv>TýÝ£Ÿ¶h„úIÞMÆ8x KÕÎvöÁU¹ã®½+fÃ×­×5ÅG¾!gwb&g†¼a-Ħóûáÿýj“~ìë$Îô3¸÷1Aõ$,Cf@à,U1J‚¼ÜCÚUh¿Ž!máõ‡ðvñÂíuðóW’éÈŽ¹‹pŠ©,Ó>¯xÑp…î¶4‹™7iàK"‰‹Ñr=ó6Ìô,“Ð3O‰õnöN8Sß·]5ìLšcÔc¾Ä™VF8ÊÁ‘À}«çÁÁ¨„®:÷Ël™«ájÿœg{ß]^íiœcìä±*Ùw)X y„$2x‘é8Õg^¡—fóÀ"Bû¡çÕý:$PÞì»–"![ÉæúȨžñ6 !Ñù™náÔ_¼!7pÉ|@d^´xáß„,&\˜ùè­³X磸—"qêÁú‡ Èé³&K½Én“$ )zžC8D9%¼Þhi†ú¼Ñžt¬:(¥z¡šß†Õ,ÎüêÕ»rŽŒ’‘f`téi€2_ä×O‘QiA 7{‚¡‰!|(‹Å£E(ØR8Êe3‘úwÌ·Ûps쪃éyÐÓ;oÁŒ¾îVÎrä=î¢O¶§zÇó>E»È\žG—…Édœ¸»F-.ƳÌYÁ*C¦-ãIÛ”-ÿMRFÏ­ý¤ !Aèv¼O!Aèiö7î}H8ðõ9áÔW §ËÏJ—GÛ°tùיּ×HO“*hP@cõÇŠ4¥œákk|4ï®™T÷¡Îbó:”MÊ$á'è˜MþgïD |„!R¨1§Wׂh†pzüÐâ9Ë'”Ò„RÊct¶˜Û÷ƒÛLu"h3÷JA¼S?ÿæër¾ž{lÛš“ÿö$WñfP­åª5+á4téLÐ6-·óŒT»ìÍo"h|ÍtÀîÈOófç8 íÈœ;·I*»žöà+ðp¤WVÛØQKÚˆ…´]…pîAåžY6øFÔi¬Ó³Äe™uŒ‰š«G(‰EÙ;Œ“ß4wUšÝ©vÓUÏõÜWÇ„‹¾´Ã t2hÝÉ wrØÚÁÔ Rñ…]d·³¨ð†Ëè0Ί)\4 —UçuÓü¬nJ-÷Ô¥ìëâþ„íÍzßêк¥â =À[¸XzÖ¬nƒkäË:}¬8KòÜ×ÉfßÌÏÑ6[Gá¢e «žêF¶¹ô¬Åë+™I”¥”ØÒ»:l> ­eR—§èK_h>ø ©ZçäéEâ“ùĉÝ&'YOµS_¹R@lñ-'åÄlŠELu%Î{ó‚“ž%z‡`¬KëÒǺ„ðùóžs•aËW`|,Ë-GNˆ# 3^ômÇì¼—ãôc‡íe,ªe‰//b±¾çn5¸–ÆùÖî(Ú.jÑFWÔ¾a2ü™Áº)‡e‰SvfÅ(¤^£p†âg!VžÐÀÝ𥓾X.CºäǶS1P˜Ž@š9õcɸz{Æß0äTÙ£!: cëªV÷•/&No{@룻»*ôÿÙªY€º|²P𧨘å«/(˜©yÁL}ݯ$×nÌÍßàVqC…·ün¿ûÉtßN Š$ÖòÙB[É—˜?~<æNŠTs8ûé ÆZžmܶµ'cÏP\“R“j•¾¥Î+Pø3ÿb7~usUðÈó,èÕž’ø[—ž>[‰Iÿjµ§ü¥'~ªø¤ÎN¬Ë¸Èÿ\…›ôÒ(ba”êî Î¥zY©ò62dH?¼G¨çë^/¨Ý=d^D ëzpãуǔSDÏ{È';GªËã2'IDœëUæÿL GÇÔ:’@(7¡JYYŒòÅ•²Þ\þ ƒž`£eÁn’zÒÿí7ó×Bî endstream endobj 196 0 obj <> stream xÚ½ÛrÛ¶ò½_¡é‹¨©‰7^Ò¾¤3õŒ3=gâ·8Yt)Ñ%©&®'ÿ~v±àM¦,)=éØ3 €ÅboØ›fÎø,€?>‹ü³l;ûõvöæZÏxÀ’ ™Ý®aÛÇI8»]}ôn7 yûújáK!½|£ðšM^ÓW¾[™/ùîžfæËceê:/w4ÿŒ§MepÆYÑzêN§4uz€ÿç…ÏÃÈ{¿ð“ÐKwv H%`[ªShê<ªþ®Bï™xf鸜dK²(üÞl…ÉyľÂ1_ï+´±×”\éó¹²xÞ’†C8I°œý§š”—Øç¾µÏlÚ>%?d9sÜb½?qëÛ ü¾ÔšÅ3_H&ÉŸÝ€S<ôv%Žx³Ê³´14E¯†cýHn#Ëï®ÐkÙÝÖu –ÞùáòÈ_){åθ¯Ï›æÀÊÃOüÓé«þÑEœ±Æç$ÓåÉQœ¾slÜßúÜÐh;x#PqÛ)±Å>*;m!>¼í¶_n^Ÿ¡ìAÄöæ}6ÍÀ_¹~ÎÇ„ß8ªÆ½ÿJö öØá¶îu;A~3‘XXYúˆŽ_FÔÁÃl¥ù1¿zøDߦ¨# «|½¤äu¾åÐ5ð€øØï¬ÿ¶V Ë28GœÎÅÖ埖«/ Ó‘±u: –ÿ”½„VÞ½Ù¹°òzœ¬Øÿ|Gn\K¨)±´…$-XŸ §·ö>v½ŠƒWhƒ`éƒÝ[Cú–¡ùL™¥‹{y÷u÷2S!±q;Ù”.c{,« x—õ€«€3ítóî…^í_sƒaˆ^ù }dUY×îM9eî«5•è{úÔ;xž§s÷‚çËî+›=|ÏóU·mº¯õü«#ªc²QΤŽXW1‹d›ñ2ns^íýÞEžÈÆÜ×^ÝÆÁÉ„—÷ ¢ g Í=‹XGV©Ø ïÏÛTÍ…ð®24‰qÿ¨ ± A›Ú¤‹k…¨q+„€FOê'JRÈ‚]Z)ö¶žêœ`©,ŸA8êœ+âÚb†³ˆ%íøÀY¨Æm„xT&‚®:«éêVFg_"οDïh«~FE/£R˜Mძ+Ž‘’,‘¼?€&=ÅT@ûqÀ¢ØºÄ3ÔI|¬5­4ÆÙJ›ÔZŒMÆS.¨:!ÐèrCëE®°8®§„g;6½Åç5-@àÛ8Û"I0ºÌ$£^ÿ/“<ýŠFT'$(Çœô¯Aò­<½¢!ÞóßÛ€ý¨/·ù7;ïmïÇšTDlDÙkdÂÍ \Áýd.L1Yc …Ô¾Ëq@±ä½²Î¢ú![… Ó“"Qß1?ßôØéÆ'bQÈÂèrß©_yøß—Ë©æ±ßÁ {FѨgdÛo˜–`Ë(²9pÔµŒ†IJÛ/â2dñ0WÅž-¦E”¦Àöd«³Û䃖mR¤#û3Š$Tý‘Ã_Œ\–e?0ÏëÆ.ׄ—÷=1¼Òü€Œ³^Ü7§®Ô!¤MÍÆfæÚÖ0Gòúl_OØîÞ²J3l¹ø!”7Ø÷ $5¡aLÛdÌöбp¯)i³ïP¯ŸøŽF³}l\å€WP;÷뉷+BPvkŒ.÷¾ŸVw¨-eŒzÚË&ñž£°`ËÝš–©Ém ÃòÓÕq1gѨ×IjÅ60õäu«V%uÛ(ׇjU\¶íc=P+ÎŽ4jƒ‰ä¢F­ëMh×ZíãuŽBÕ)ÖHÙŽrv=mkYÁâ‘¡@= 9ö¾H«É Œ³@\ÒÞ¥æöÀÚaf­Ý®V K²)l P—\i9'â¥ùÃZgþI[S$íE?Ò{WS<ù:bzôóĹJ±‚ûݾ7¶küׂ îA•`évÜàF òK¦rÕôÚÕÚÄ~ìØ&êñ%£n†ˆ‘0?TT÷ Ñ‚þ÷‡ÿ7²Ão endstream endobj 201 0 obj <> stream xÚíKÛDøÎ¯ˆ89b3Ì{ìB‘ŠTP¹ èr¡éÁ›L6¦I¼µ“n—_Ï÷ÍŒíq:Ù¤¥H= VÊ<¾÷{¼“·6¡ðM ‡ÿt²ØN~¼ž|û+&Œ‘B©Éõ îgŒ’BO®—¯2A$áÓc\eìÚÃM»hª»½]Ng¨¬µûvúúú ¡&ˆE $Á)ädÆQÆ‘y±šÎd.²ýÚúÅ]SmËæ7©øSûþ®±m[Õ;Qµþ¼ ûÃX¼êqçÙýºZL¹ÎÖxÀ³v]6êf:ãyf=:[V[»C6åf>½šÎgN4Ôd„g‚ =@xé°Ùƒ ÜdÀLî¹ !œ„BH'!îíÆiYnüQ[¶míäXT¥· ÞWûµ_9Û ­EÝË;5Y½[V»[ÞªA¥³¿ìbOœÌϯÓ~ÌÁyyïGüøòS½xí$ ½÷˜Û‹‹Á{Wx`‚C :±»²Mëa÷µÿ-ýÕ8°<Ñ@d]v(ž»ÎVõfS#Ý{oÄ6_ì¥;ZÕÍöIЪˆµÒ t’D1§Ó®ÜÚÅò ´@ê`^u<PĈp_u÷tbHaðV£!†ˆ–‚¥XH¤Ðƒ\¥˜Dè‹™ðË™¨1xˆ­ýÉHŠËÉ~Jds,²ˆEV‘È» …·=Èë„ÈDŒûñ~m›p·`˜ÆôØ×15^`–‘ÛQ2Bö>l1²n|6n\tA.:R>WGé;NSåÒ4i)–çã^–ý‚ÒD›¡Çx8Ýú‰&ÉŸ’ç„NÄ8@¹(›Î3]Íh} Îx¬ˉöyÙ×l3nUßpÝ÷Ü`MÊuæ*ÊakçsÀ¯›€ˆ!¡ŽîB"˘CSÊ% JS`áãÈJ.vuPÅŸW;ÿ{º'źÐ<ÛTmXõZÑ<ÒŠ!>‡.¬\e¯ú¾è·N¼ª \¢äBÃÕÐ…5n,qI\ùÞCcõB«4¡UzwFèÝûl±?`—åÍÞM!ÕÊÍÁ¶¨tádÇóˆ-n'µþÀ….-ö\aoÂßj:yµzðDKqW6Ðf›²ñû­j„ ‡ÎNdˆ—öî~]†²´{Ûl«mªLz(y|à†cúy@†y`>Ö€û¶”úúÒ‰ &^°a"àï4åG¤D4 VÕz8œžðw>/cI­€ë< åǃRÜ»-fZíŽ&<ÂÉ }’®ÈŠH Á©’éœÕÕ#šja96Á„$3M …ñ<v‚ØÜ<$Ù( ÏfN™ÆÊøAê fa¾LuÇ]_”ŸÞ ´»þˆ´}©.æF?¹µþ+…>ì¬8ï–'Ú¨ai7å(Ç‹F½’Ë£^£:ˆãò¼›¯ÕPJ=(²”;MAà9Èœ¨›ûî„2Õ{ÏohS°ùÛ6õ| TJÞ=8p¦ZÀKhìCÃÇŠÅ…³ßìÛCÔÀžg¡œºgG<Þä²qj*RóÍÉÀbQ\¨7ï^O±5˜Œ…I…Ih·²i#Ê}È håÙ©IV ¾§W¾+œéþ®³[ßn–Ý“µ³LWiû©ã ^ÄÓø*ýb’Çù¢FÙTtƒjŠ”ª»H'cÿ&%"¡e¸wÆŸ)Ÿè—`ð,Å^Ôò2%ž&=ÊÐD狆8Y— a®æ{ˆoÎ…Íp ‹*Æw0{@3Mð† £U‚¹17ó9åòR%uÚH‘àÛé±âD&äˆ|y{&`Ÿ¤ú‘€|Ã4âþWȶæ¾jm(#U2´ÄšŸNëïO¤µ¥uTÁ†´Ö'¿N¥ÓZti­O¤µ¨—Sïÿ¬þY-Ïfµüï²z<‡¤²Z~)Y}éTöy²úÔsIQ/ú×’ ¯¥»¥}ï?<ÂC)ž£.ü.r²7ÞM¸ñy ‹ø;8î]ÃoÙíFÐX 1P?nù9xt4Gµyôç³Sßà=ÞºËðõ;|ÃRòn†9(DUø*þžº¨L°¶ÿÄï?‡Esëí?²ä,<1fJ"yp‚ n ^àì-ÔË»òÖ~ ­0ŒbB,?ÏÞhÂÔkü"Uuž£EgZú·4ïÕûí«Í·Bø endstream endobj 204 0 obj <> stream xÚÍYÍo븿÷¯ðQžY~‰’vOÛ¢¶—nmÑ׃bÓ±°¶•ZÎæ¥}g8¤HÉTœ¼S‘¢Hj¾8ó›áxõŸ•Xqø«JÂ?_mO«?<¬~ÿgѬ„`MY®ö°¾œ5fõ°ûW¡˜ff½B–ÅÏW{i¯v·Þ¨ª,ì·ç‹†®?ë?ü¨”+üŽ7HD”¬Ñ«,YY9B?ý®&ÝU±º†¸¡êëRÀÈ¥¬ŠÁ^qP;vë’Ä2Ǒ׬ ´øH©¢¥Çó¥;µ—7|Ñž"ÌF¾ÐÄë¡Û®¥)ø*‹Cë©\–>Ý÷Çc¿–UñÚŸhÓðvƉk»½ÂÇnû¾¿œ~ðŠ:‘°dÆ€IƒY”$é÷«(Éd49ïì7à¶™éï˜wg´/žÈpç]Æ,Qs&Ë”ïëÁ^lޝ`²ÎóËvoàˆ›Ôî¼QðÙŒTèmjp¡½Á+gpøª#S^úõž»—­õäv/§ ž ¯jç×§µlûðù‘r#¤auOÅг½µWèKF}m˜ªVŒ o€û¶Å/šÕfüD’ ¦íÀc.8®Ðñ1Ï£¥å3ªòr²t qÕû½ÃÛ 5xtê÷GZ®³Ñ{Ÿ’6ű®~aOOg‡ÈÀòœ¡É*CvÒN“4¶Oö¹ ±¯HåÆÛþtj­·³ß`ÏÛc?ÐvKqØ^,ÒÁv`Ž»G Ñ«óŸ÷x ¥;x¿°OØ¥w´Ò87£yqj¢½âÚÙËmº5/îŸy¥|MÓ/ÇkK܉|Þ6€áÚÙ{‘Åæúò|´Áÿ¼f£ûæ ø´³à§î 'ÍĤPWKV—)å#BNðF@ü– ܈2? Mªâk‘##â;¬óUŚʹ3ä9"GA³J­Æ-?B:1y SM†ÖªÈG|™"—•¸8îøºÎØ­ŠËlaJøõ¯œ‹ …†ñ€uOwLþcŒ%œ|€Þ®Ì OH)…¸²||°•NpW›Ã¿­Kã‹ÅWœvŽƒI@}Éž¹æLן>õrñÐ!¶J. Fç›>L‘•’QYÎPKä V%ØCÚS6qø…Ö³Ib™$íÆ…Ô†ULm.Ô¥j0y$9…•ª!‚§è‡' vý©í¾–æi`Ðgc[Ô!€/jo¢ù(ÝgP Ê©m÷• MÅ€nš(V’½áíF¡4{Ãg;‹Ï#øÕ5›€€?”H/ÇöB7:i¨Õ€öÓ9d˜k?«½’S£Ò'Ô°‰ê!]xÕ.Xù m¤ |òPÛ?»#võ@~'éÚ§]Ëy*Â5{°ÔÒƒÒ1ŽBAGü$sˆ"àÉ)çšÕj<ä$¯!c/Ì%6œN’8FŸh¢³Ì†ÔÐßÈ•ñ&`Ò“Kr;Ÿk$3âM¼ÌÝ1V z!%*Ÿõ½”Ø8K%Eî>›"FtΧ:ͤžAnzWsÔýT§>šê¾e°Íaod”³'ìm"Èv.»<^/åñ*žÁ{þ9íF}¦JzÍ—¹º›ÈÕÿs"‡{ˆ‹t¸êN"—LÉxÕ'R©–2$ÏiFͦRÙ°úF•  ²8$ÙM&…j \×\Q¡*wÜ0¹Gà„K£éŽÎ݆" Dмúƒü=–üPQ’Zò»‹^&¦$¥µ¯pthÑ"¿­1“‘AÐXšU#˜V)4íÉg·“mÏcÎ  Ùúœ)R¢ûÓC¾ï£ õUrlüT¾ñóDz-¦ÉöøÉÞañO¹Öˆ¦Üâ{Âãsप»­Z?zr¥¦¡õM¡C0ÝX6,5}LÒô‘ËM¨cÌ#Ntùz®Œ€ô˜£SGÑÎYï4x§=ÿÈÑ@¿ å„=v‰H@¾f¯0•Fï]è'ÍkxUΔ*': •›(©s$Lq쟺­s1½¢çleR£fŠ—S½Ç«RìäLÕŒËwÔ ËþP,r'vZi)1­qç¡9îhs¨“GÍ»‚m˜p±M%çˆ0IÜﺓ=Ë…ëÑ7= ¡ÒÛ!¾Îøj,÷’H³h÷õ…öy7ÐLXidy$ë Ç»Ð7¡ðÔŠ§U MP"Á¯‘öíQ®¿ì²îˆ4Þ)÷ù;õ˜ö!TÊÐèwN¸ ´¿"ëù£æ‰"Ñ<ƒy?‚Ÿ^/ã–‰ • f§RGÊó¢]ùK¢“nðÒsŒ©Ù‹¹b’KÕåôz69äJH¬ÔÔæ´dið›W&V\©ÎR²FD«—FÅêk7XŒ§Zái¥¬Uâ@•º•=ž¾Ò´ŠrGãÜžÑF45¢IÒ Ý·+Ë)fŒ··/³Ëæ<îbö‰Ý¿ñn›F ä-i ZJWzv6JFšdwÏF•»P7ù`ùlÞ«t£°´ µCík‡_Öà–®ïKî9tÿ¥¦ƒþŽ_|׆ûê@ózb|?µÉ.*¬ß9ö¤5÷ xÎzÒôXž¤úöxt„ p!ß÷û;¿»¥×±èpÂÅúÖ¢è (þ ÊEòÕ£|˜^Nmø9^ ŒáEòâ…šî’SÓ] ïv’ϳ”ôeb²µ=>ÙÇKëV%µ`ÀØ1Ú¿Ñ~r2ìà8/ÄP —ᯑ OÒ`ÞÓ& þ|±îò+PY˨ N¦=»cXÁWÅß]BëóóD #I4¨'}rÒ'¡=¯ÝõÐù±ßtKõᓟ–|PÛÌé¯%NIØÎ;ƒ3,è|9Š‚¿›ëMsC ¦Rjðêeì<„Wˤ‘iê úŽeÚô÷µó¥{,ïfûô·£x‹¿<š¢VÔ6FS…*uØú·ßýzè¤ endstream endobj 209 0 obj <> stream xÚ¥XY¯ÓF~ﯰúäHdêÙ¼TêK-TªZÊ­DEú`’ ±äØÁvzáß÷œYì±3I. ®ˆ=ËÙ—ï8úÑ(4Êü%Ñöýüýð -"JI!eô°‡ý5MH‘F»w1'‚«5¥LÆoÔ°ZóLÆí ~i¬ºrh»~õïÃo@CFx+)•¤ÑšI"3MæU78/‡ÃŸ]ûÁ¼ Õ)|±úTõøjöm]·+–ÅUcoôÊBXîDxfÕÏÌë±Ä—ÏøÂâ÷æ¼Ù9÷jgøVÍ‚°útêTßWmÓÿh5£ÌS ­“YhµÞº¹¯<'’Ã9ÍîIˆcä$I}AáÌî¿ Ý/È\„5ЬÀ_‚±ð wÕ~¢ÍR$qCÁŒäÅHc“P±ÐlUˆ–ÈIÎn(ZL¤‚v’D¤ EØW|‘¢ýçã5]'¿¡+KHF'2G5t¨:Üî©NŠ©ô4'©$L„ô†|ûYn÷‚<Éòx I’¥7qÏ·B"ŸˆoVê)I³E8ËóÔqK/ öi˜ý½(zd?á(ýìþš‘_sU3¨î[Ë”8(ƒ@¨WÛáJ%‘9‘ù(s´Ù<­– ÍÔ¨+ž¦î¶kûþ[Õ5Dtrmâçe7¨¾*p‰^:u­n»óvF8ô,Ážœo ûš|[3(?Ú69a\{Ô­0¬º¼uTáW6ÐÔK€§þ)±¹ FMsï¹A˂ٖ™bË´ˆûC{®wæÖNA=2WFoÖÛ½Y©vÊDVµ-k³´«ŽªAòæu ·ê4˜{Ø×udˆ”¹Ÿ£—.}´Y}É" 0˜4{RpQX´“nð.A¼f[Ÿwª7»Ç¶SîBiO´]2Íf¨A…qY×MK¶tTÝÞ¾íŽ[ÀÚ¾k†S­ö–Ãкì0úŒ6èªmMWÊí¶ív#îk®ŒØèPE;ÊAß,à:Û¥C¯,ÜB4”Å áU?^5ò²cEƒeÏõP6VB\úo%%çlO gVdFB\˜ü†L„ÎpÛje…òáŠvƒ¦uîàzÕ/™Ì¢ã^žNõgm5<1FÜ…µ5‡Ìó%Ú¶ñgÕ-ÍØìú[6âÀÛ ~^äÆðk\ âÐóò¸"ЬÖ)÷Î_Ò Á¬œN•¹ †­‡ó©V½åèäóA³3/>Lâ¦F\ã mOžp2Ë`pf-©+úŒqí3nS_?ôåÑ>•Ë-_][e8cÓþä2ð…¦/Æò2#äWxõ«‰ëÑÎ^QJ|m|Q8“Ê&Ÿ¸ð$$Þ8?Tý"SûóÑ'ãíŒlúùj识ߋ‡ðÄÆrA’lÙš™í¥­0®ð?¬™0¬æ“œ–ãæ(—{ñÏX\Û!N`#Ñ[½ÙM7¯[ù¼n‰pÝZÌhârFKaf03Bþ1å·C<,-¦ÎýòB kܤˆ£,% BœsJD#^HfãB½‰^WøÖr·%ÔHòÂÕI#ÉL[@磲ӻPÿBnÚël8˜,´;^àÞbƒ²3•¿­Ýr—e>ÖÅ×±¬$kFmàd‹êfSvÕp€)¨Ú~oesÙ3÷|6?¥„;ì gÇR8²r’:xÿ,DÅ OAãx‚p‘&…Œi2ª.9¡Ìdz7`Ë-m 1)ã#ÞkÊØi‚lšâ€^÷È«%Þ×> Ë’z“«?l,eá Y Î §e×eù»«¨F§#¯vX6 ^}¹&Û=§{ÓûŒ›Àú=óo>‘d1þÉŒ¤.ž(¿n£çm³«ÐQˆ¢õ'¨‹”ºJ”¦$q~¨öáò=ʃ¦©ùÉb$(&¸5;hòãÿ«(ªºWw<àlÃüëÂÙŽ3XžMì·¢!@, ÀÉ¥Þ—¦რxå¨ÊF·.\vçñ²yÑkÀ§XÁôóQw¶ÿVæs"Úció‚n ¸NeN ¥oÎïýº‘ùXûׯö¡ûpÙq¤ )…™ ~™´ýŸûH“ÀÛ‹9Ã>æ_|f*Å©ü ¾@J/$ é]î8gK6»å¦qæ!’£•Ö©0]•Iwôõwÿß¼÷ endstream endobj 212 0 obj <> stream xÚíY[oÛ6~߯p_y³8ñ&J] 6 Áº[3 EÒÕ‘¶”Iö’tØß9¤®%%n’í¡HRÒááw.üxHOþœÐ‰t¢ü{“ùjòêhòÝ”N¨ \ø“£|w©GBèŸ;œÈ©K)ÎOÙY2–S—+éÄ×—y\I–ÓG‡ BNp¢*I(&. çZËËR(l 1Â~_fSIО# ôSé9fË4O¨_jH 8‘iòÍ26½E–›Î<[]nÖIz†a%XÀ‹JtÙX8M¥(›xÏAà\:¦œóR[”šÎǩ˫yˆ“õyœ[ŒåÌ#¾(±®óMl1‡qÂX)’Ù”¸B„)DEj¹E´,¬º(¡a©‹èï®$LÂЀH“£s Ë),•€ 5äÃU IU¥ÎLž _°C*É”Ú0]~Ö¾ðÑ\u|YwÈVé„:• Tnš¥î§8Ï<ðœ_°Ð¹JŠxKßV8J¢† J¡r+5Š&nwf¨ˆ¨JΡ²4蔥½™Äo2••™ú{{3ƒdE‚à´"ˆ»äëë)ÅwÞDëó_óì Ÿ4W#b7¾NŠuýÖtÙŽ(àÉ+MZ8¾½­¢ˆ¦*U!¬ca•µ>f- dS?£‚Š;õè.A±—¤¦­`0aÜžÕkõyµ²ÛÖC# ã]Û¶ÉÕöõ¦ŽqÕ÷=JDÕuŒÎÓÜÚtqŸˆjÅ]£Ò-ƒÌ½)7B©•móF1ï÷˜î…¨i(‰òwBmüV©:ñ˜°âí„uð ñH?÷0u‡ð€™¼C`[Ã}â«-Óz§ßÍÓÀ—”}†§¥ÝÓûææƒÿ[FÉÇ3õ?XðŸ»àv G<Ð:x¶[~È€ððáó÷Ìå}ÆwòA’Žùàý®fã¾…eëx¨àäF»¹MQ‹Bk·x…U N†žÃû=” ¶©j¨EfÃ4 •õ}Ó(‡ØôQˆ²Ô±mȼ Y´ §¶)$~­Eð‚Ç6{Ø™ B…]P¢lQ×­Ýé³,Èq¯³®×[&|oÜú¼Õ¨ª)¿Y\çr¡,¾’C®º« /nGr•v<èræï^Ĩ‡å=¦m=A5H¢4K³!ý†¬v…g=yâ‘`eÞ‚<#o¬wõðÖ-¸õ›mVþú\ܬðÒoû|'[šÏ¢}Ën…@U€¦t3Gö$3þð`ó%l¸Ú"bÛŽ"^oßùv/j;[”kM®/ÌÝ*ó+Ñß¾ú%œYx endstream endobj 215 0 obj <> stream xÚÝYÝã¶ï_á¾ÉÀš?$Q—§H€ â ,Їlt¶Ö*KIÎfû×w†3”(YÎ:Í‚;¬,r8Ÿ?‡£Í¹‰áŸÜd þÇ›ýyóÇÍß¾I62yœoŸ72¹Ùìp Ý<¾¤ØîŒÒÑÇf»Si §’~´/ð´QÙCÕ6ýö‡Ço—´³<I‘OÕ0ÅLšÆ<¬qH…”<ß´Ãv—(³ÎI¡Ó‘(&£¢9¬±T©HSþu•—Š…ôl®š­J£Ëy &†‘ g?<ÓsßžÉ#mSq =­¬–ž{Š¥éúa鯿ÐÓPj/5é¾Sà"™@@4º5béÛÖ†xj­£¾8ó¯¢_LªsÙô#zE}çKË} ®¢É@á4ð€°"ÑN¾@¤ ÂÄŠø˜Xßka4»öµNwÄr…M6EpDÅMnI&T6!èø&2r‘ä7ù#ŒeªÏðáD®Xıt¿OÂâ'„PI ªCép5Tû¢æ€çJ¤yð1~7ò÷º†àåG~teíbP¸ F¦íz¢©«~(ô»`;X=BWžN # ¢êh€U'sü;‰L£s¤ðÇæ”8—ES5GD΢GÐÕÙëÍÍíÊþRm!X*s‘˜¨¨/%½V[ykDâÃ2t—r-Ûä"Î'$hÈjn@ľí@®ß¿Гƽ'ñM¢`7ÚÃX»Ø9žÛŽ)&™A…NÊîµêËõul…6¬ÜsQ÷k(ÈÞLË&Žž¢¶»Òh-TèÊáT -hüvÆ`aœÓ¨­«=Ëɱ=‘]Imw(;g¼ÔåÏÕ¾=vÅË ÃY¿m­vÌ•ÛJŽˆöF|8Y–”Í#ó/]¹/$u±Ôišq–sš¢mqh0K3ñ´u³_?ÒAÎt™#Ù³[brŒÁb¡·;)U}p'8ë²$*mú>HY+ç¡J]n·5+Ñ“™È}Z«€û6« ,ð@))ø°Å—#˜ƒS5 ¢èmG$~MºTûTçÐ[§À‡Vç¢{£±º=òNƒ™É¢x…¸aDNøŠÛº§q>2Ào Å+!ˆú7ÚÅ~àÀVŒÎRàþüaÍjD¢YuÊö<ý Û>òas¬5ÇÝÂ3<‰‹ãèH‹Æ:lÇ’á);¾Âž[ÝpJØYÄâ5å)w-Èj!ƒ¸ÃÞ4&_°›oÜxã“WX§!ÒM‡éš)["¤DÍl<FÖZÈ}ÉÓL»ãà!’ÃØÕ.Ý¿>mV¼£2aò±r[ʵS ÞS6Dk† ŸräB£Déš9„:b‡½®u.<\ö%s;\ÎgŸ,²™Vã¥"øáN&·¼îÙx@E–…Ö“ÇAŸ5ëM&ÆÝ|è€|*s{®Âèá! Ì ‡wNÑðë¥è`§U/€®àª‘¦\VgÃXì2+rÖyÙwpêÚãȤã¢âгÐÁa`ë70!q! ‡ c¯çÂöèˆOœ¹ôÄg²$HS¡+ú«U^*l†°ÐÖg8}˜4  í³¤] P*b_Oî~¼piQá¾§Óýš¥•"NîcùyíU¨“Pþ8¯ü| •kž¹ì#²b&R ™\çéÍHò^i}ÀG6{¤4—Mrô(¶ã$eµ:©™„ðy:wEP?«µ3*7ËSËï×L‘jºQ=¯zs<åþTÞüaM“ÀŸ_­áR^"2ÚÒ\½¸Û¿ƒüüË#?ÿ‘oÞ•ùí±2ïÆÊü)ÿGóæ½ÈŸo:µèŽ\ÔTrU½ÍXAù6öîÏÉÍ„€$Å[:B#øñ°ª@,’t©€¾¥@s>A¶pw/£%×8)©F5Žq5ð²0:Œn1•”A)Mo³+Š€eÂ~±òО‹ÊÓTdØdQ?õ%TœÓ>ßö•`³{ŸcvÃå¥vöãù ^î+½FŸ½;Ò”ÕD”NÂ[XW™Ô†E ®:”ȯ!1–k­K]t´z¼Qöô^§cãÅCñ휠-Þòf÷k×Ç‘aYjâ0d0ç4‚gX­“Ú±w:v‚¦®™z«øS\œüÁÏÔñíKV(äâ~é@Úå;.^énÊHã«N ¢NÐî ŠË’üõÔö\Á.{Q04B…›«å õc]ÇkÝvYµû™ï¸Žͼo°·2Þ8Óy÷jlpý_E®“ÎZ™kÓÔ¬I¯Wâðn`nÕòLºÖ¢ƒUÂæïöèdТÓÜ¢›üi–à´Óy"’ìj{:!68 k ÂUê½¢RˆùØßGø²7ÞJæIP ›üÊ$ˆºqgu€,\zu›…Æ$í\ð EgArWc‘Ü™(Û»¡i̯ªBíš*fÛ\ÓÕC3½ÑvÐTrZ@SÉš05ƒ&5q× ©§®þ=^r-]Åýã@‘kEœîKVÐûM༩!l0õ»¢SÝ•/Î÷S‚øÅv/ôÂÚ±Ýk¸Ýûi Õ TWÍ–ªœ¾ú/õ~Íý½ßÌ÷~ù—A/ÃÈd^~Hãš"©§œšv0S6ûºu\W1ý‹ÓO¹ò¦w•ƒô½!$›5c]Þœ‹ÿàO_1uÁ<¹A¼þ™åFú¾q,}Bñ¤£tŒÍÔýÁ—ÉPx¡î‰ÙHxN‹gm÷úÂ\0KO^ÔÇòsWð¬ë€ÂèT!>³T.8‹ûªóBÝŒQþºÂ"1ɨêʦ˜0h¹,‡N$lÁÂ˼ ÷+môojµ¹yòY6ù,É&–è"4ÏúVpbçH‚wþI*ðG³Ù×+œA(°>ùs{lÑÆåb×¾_x¶¨ø ¤<:ni~Å-Íg'79Ç.îà—ÌvïÒÔ.šÅTûiÿAøã7ü*–Sï‰ x¯cdÚ¯®6ähpÃ6tü<7Ík‹Üv©¡ä¤2Oú¯¿ü•ƒM endstream endobj 220 0 obj <> stream xÚ­Yë“Ó6ÿÞ¿ÂíÆi±jÉ’ ýÐ-0ôÜ7Žé˜D¹˜qì`;Ü¥ÿ{wµ’c'NrPænΖ´ZíK»¿õyï<î…ðýDÀoèÍ×ÞOÞ÷¿òÌãœeJyKXxȲػX¼ò#¦˜šœ å?«¯Šy^΂(Q~½'÷u“wuÓÎ^_<>ÊÃa†l¸b™ôûÃêI5 Dù¿çÝꯦ¾Â‘ô»•n4½ê›¢íúYzYÖeYÏDâ_Õí/¸ŽbˆÔ‰qJú׫bŽ{V´aãà–oˆžÛV/ˆOQÑsÄ\ßlݶE]µ¬†<¨ˆ–J˜ÊŒzUÝ91 !KP"ÉÍ„™b&"»|ꌘʼn]ÿzŠ¿bIt‚½Œ™[®ôUÞ.–*RI&”%{0u ¾N ¸Ä©€C€¨Ñé#é3–:éójqÎ>· €~rß>bÚ>ç$¸woR5ÅÂì„àáØ­Ïëêí¶š+Ðå.`Ìð´üær6yN±XžpUÆDì$dÀ™[*àž|Šêæslððñãç "&î‹¢=ㄺ9æ!oãð"¤,v>ø{ŠAÆ’R‚?jŠY!æ†ìÚ¤· NG—І³7‡3ÁOH“±(u0ÅF‘j”ÞÅ“ŠYˆâ§LIÊÙKÈ„RÙ| /»=4.ªy¹]è–FëºÑnCn)êÊNíR«Tã¼i;Žü¼œZ´¬sÇÙ­-ëfm²7Ì-›zmÑËÎJPÛDEu¯éÔW+,H§„ŸÏçu³ ê¢"Üfji «ähl=“oiº^ZzG7-J“—~«51Ä“ø«Yì__ÎØ,<ö/Vv̺-;°ÚN´÷3˜ÏË­¦áÁ‘;gЭ ‡™`PÑóº ç¼@Ù¢aÅÁAÅÉÂRš1bHF»cIÏ|³)où"W¸Z>uϯhˆ~GV-l>º8Js;*‰-*ylý`d…nŸHoŒSŒ[îT.œ{àÃ\ QPòvEK--ô6šˆ\'sÉÃ01†®\2>²“àrü¹¡˜jvu]„ã.…=>ÅÚ÷Ç¢,õ®Á €bP^ÀÍO½µÅ«”›(½—ÞsrÇÈdn[•\ò‚Ua°æ.1‹>DLäm׺ˆÜŽÞ)#ÉyÛI·²UŽV±}ê°övÇÑu«K:ÒÚ=9qdÚ­‚ì3ÔÝá!œÂåñc^èÒì¥ Sá"!«LYÌböNWñ»B͇?L]ΤêÍu7g¶Ô&p%]½á긆8jô›VE…ÌYl«÷@O?61…Ÿ‹”e½üñqùcÀc*Äæ†ìðÏÕ¡‡®Çüá´!98%ÜCœ •Òɾ$tâ6Ñ÷Z ÙÙ¤Ó";ÃçÝÖ–·â2är~6 ’˜eÎPîI%gÌè$0f{† ˜àLùu¼øÍ¾4W‡…LIêA~°LЂ3îXà`2m¼Oq°É¯ô'Àù<>{:G°"F»PŽÐ÷€u±AèI†›8R‘°“ôŸwò†€ÒÐØÇA4‘aò£%Êö:T×'–Àz¦¸oØGäË™ }Û<žU®4À3„HÂGê7ÛRÓ„‰œš×ëͶ#Xö¦uO%ÆÎåSÆQßÁíKˆ ÅT©€D.wWØÓk½Ç=}«Žl·e>•tw£‡G#ÐÆhìú_1úÚ’[ÀèhÚàÚ¾å^ãJc"C¸°uË´èR¯u…ÍHçÀAœ¦ÈߔڂqwÍ #ŒàbgÓë¼A#ïåã ûÏo8è?¿!en)¶U —wÞ›Î8–†¢ m@Ì=iÛ£ ´£"%½8’#œ˜BŽ›'h?9vH‹Âa/!å)jal 9èñOí°cè”kúÞ(í÷F˜Ý@_KNXéö¨ÑŸ ¾ÌBºðÌKðÇž™Ú“P´lú,xn[mé‰xŒÃa~ä*¤³ü©™;'ÃlïdXÙC†¤. #8ÍàB¶Ç6fû/^ªAç‹C³@I[x¸§ PŒ4áÖR°#ßvõ€&†[š2plKPÓ¹taŒ†;ˆÉxHi“P·Ê;ËÛ}ó8è¹ûîÎha¨5 H’F>³)aÿ‹rïõG79¤ÝžøôL¹ÿÃÔ3%z$xypÃ@Äá Û}-KGHÑð~]|UÜûúìi_ä¬v»þçí,P‚bKÁí~ú/=/ýœ1£oéq3˜úŽшàöUð×ýñÇÅï“ÈAŠÝEÙ]µ(–V’Áiò„/Õ¡ôºÄ{‹oÿ÷2PáÃX=&ÔYeFYíÿë34½> stream xÚ½XK“ä4 ¾ó+ú˜†ioüʃP»Tq†Óì2Ýî™@M’fg øïH–¶3™ÝY¨¢º«ü’%Y’¥ÏÙü¾á›~|“ ø§›}»ùúzóêÞð”•i¹¹>n¸f¥Úìp"Û\n’úÁlwªTÉéÌP54hêÎTöubNƒǺïFZÜ÷ÝVäÉTÕ]ÝÝÑÜ„3ï·¢Hzšèj['@'§¡n«áñÚ ¹9ÊÛífûîú{PÜé/™ÖVÐeœ†ó~2‡íNJ ä´UJ‘œG«Ÿ” ³P_¢©†zºoÍTïiÜŸ@F‘Àñ§~™õêMØ-™ÓÒÊ|ýPµ§ÆŒ–îõ5Y™/È3ÎtnÉÅv§…J>ÇF'7õŽ_ýúGã/¨QÇ‘=Þü,Öÿ´ÂÓÐo“IW¿~œýÛ-õ_Q3žÛ¿&ꢰ½þ›Úêv|›ëÕ„Û¢s—ÎY‰:™RÉ”° I–1¾Ýq,~éÆóí¸êy*×ÉÛL +ª[oËÕXšéÂòûîu‘L÷†:sDáÀG”ÔeQ´VÔV­ŸÚÀÒ[­¼68“ƒ=ßßC„@8ÝÓÄxߟ›q¸¥ˆ¡½éîP·¦CyUóv{õL¬’Þo Û¹™*ºEªÇ~h·"KÎMEVe î«‰Bx©4,‚ÒÚ+Í>ì–=”2T(æ¶9T.M¶._䬸p`d+*¸i¦¨C*̉ÅUûœè°ÊWsî/‚L„C})п”`ö.²Ä¦öskëû‚àÝøhÓ<îÉ|hý%G‚9²4¥´Š'DV 9N6†`ëå(4oA´[ë‰.<‹,!W®7ŸJ–3ìÚI•ú8 ÂeRÔÎKs ¤!…x°nC¼ð!^F!Ž3P•ÑUˆÌ_øYó'èÇŸBÎ×±G¹¯+( ähoŒÙÍ_í§3¢^QW]š³iŒg…»¦Ø ,‡Ã¸â„/ìœG[±poOm}0Tïëã#q¯háT P“ î4nM<Œ›|¢I0Ö›WÊ! ¡q0“Z(Ñ#-Wì,€ î €É¢A: jDZ¶¦1­;ª}Mê‰.Úû&w¾¡Iëÿ'ŽÝ÷¨u¢\ÚfD¿°Ó‡áÌR&Ô ¤ƒ?ßMˆù=ö ÝùäóU· ‚ê Ü·š' ”RNÝê4±XµÌ­T;¼º"XÈ Õcpꩨ¹ à<@Àyƒ.Y”–õ¨ ;t·`÷5É<#Ô”/P“M¾ÏÀ¦¸êkÈÏc¢9ÃR3Ç”ñËKªùùâó\}‚Ûà¶×3yò·•Ð+/XÉÃŒmK£RÚÏfÍ_”Ž´°”£›§LÔœý6|@t7ŽÎÑO^Õ;ì½GTX†ic5.hcuB°ž¡c%9¼7Gc¨ Ï2²Ä~òQ™¾îüô­ë w+ßwDá¹S9âÂå;€?¸{m£æ,ÑFˆZ•Á#»º3Ÿ¢AœX®?.¾ÌXm¯h Ø3{sšfs¹r¦„÷÷7ÊÜ öš(@.AÔˆºž÷{|D²£4ÕV“ a¹Œö¸ b^êú) P ð'\ñá"¥!géK‘R®H}ƒUo²ßþ]Z+S‚)_RöxéCŠ‹¨JáøãUJÙ DIæR¥Ê [”2N‘*-"àW W¥€°ïŒë©¥œQJ_¶2*[äЬdJF_^¯“ÿG•möë¸^È x†È—‘wêãÚc ŸúÊp»Æ 7¨ß­>x²ËKù¸ªKʸOæÍsL<ÍÝ“]‘ᇠ̩î3ðÿ{¢øY.Áºô,w¨Â‚ñ ßå·+¼@¾,Q®Æ4ý]½·HÆa·vl8÷ ¸Ötp©–‹÷9|áƒÅ»Ô[e~”^êhøÑlŒ“Fô³=ø1S”3EéIüìSï5\ endstream endobj 232 0 obj <> stream xÚ­Ënã6ðÞ¯ÐQÞF\‘z÷¶úضm€šY¶‰Ê’+É›¸_ßÎÐ’b%ζÁë!9œ÷‹òþö¤Â?ée þB¯Ü{ßÞzï¿O<Š",¼Û'QÄ^€©w»þÿÝU« ÊS¿l›µLÛèš6jÓTº#¸zЦõ„Ũ'Èz$áÔê¨Æ’‚ðÄî7(ma ž6p«·Õ}§ùthé´çÐ,ÍæD;¶` °¿vÄ3õÛn]ugöËxØAx¤CœdO¢¥Ir W¬ð;ê —'ËÕZ¬‚\æþï»Ê]b¯f£É’l$‰Bõò‚•€½YÁ³Õ0ì2-œ*qÁÓÅhô«ËN[8bùAbÎC*¸tÀ÷Xšˆò$G ÙFÑŸ j)iqA¶\¿`ŒvƒI²i1ÏNÒtnÄ·R¤l5Üà¾~ztå„ör”ŒùŠŠ; üÄô/W&¥"¡òsiJ¹4}è€à¾l¡Ë„P¤0ÛîU%é£m²ÒÿY»O]»Å•B‘¬ƒ¬M?ôçm6m]·(ûƒi¶D@OE”±  (X¢‹xš3xçœþ¸8§.(ý‘Mj2Q L—}<¦xveáV^æ L&’¢í°Ô«Q 6ÇóÍ‚ Óû)¬äÎúØ/ñ ²PùIHoÇto¨×õK$/9oX “~ΟoDKBá$Ókš¹ÞHšàÿIÓï‡N—¯ˆ‚çqI BäŽß»+ò,:¨ç·…ë)=áëìñîJà<.%|. –Ð9ãÁjÞÐQï¯æñeG­Íg3–Ð<aj[‚ЏÑb1ZàIE/ؾÀlçÈlÖK”|!” *wÝVCUHÆó!d¸ 3‘¿ä›B¤îØö$ ¯‰ô|‚•Ѽ‡I|”ì© '¥é+˜ê 4b¡•©£³,.×Î<¹œúÞL¶iÓPY‡Þ6õéI§´~Þ自Ûß­žéè±gÒ܇@1×ÖZäqm‡X±^ö‚fŒ¶á«³&ƒãÐÕvö=¼®'‡çD4É‘p8Ÿ½hoÓµûçÆÝjƒÓq¡h’ƒßÎlwl‚¸€öW–04Z³M±h2+"g@ŽŽ›½[ñˆ7‘•§GØä—'‚ܹ颭ƒB…4-!ù'Ó’žŒ.–Ãf”èb ]‚e2kÔ1Øt=íL=ë‹vwÃÈdHL„Yu¤t8Ô'2½¯–2öŒdºK-Æh€‡çËóT O½|œ§2ž§~d/þw¢g}³ñêµO>òZضV€ß™=U¼ðœ€M÷(Šø™OEÑì1JH|mp2Р‹[šQ ü °s3WœåÑjF ‚û0àû0EØ»‚ª¦û."ÃëFR)T<^»qãô}‘Åœ¹L¯ c¡²ñŠ«x.ÆæPrŒÊ 9ÈÎzýòÕ¿Z É endstream endobj 235 0 obj <> stream xÚ•WYsÛ6~ï¯à#5c¡ÄÁÍ[ÓfÚÎôÈÄou ŠØðPHÊŽÿ}w± JtÜŒ=Ca±ØýöÄ"úñ(?åþ“hßD?ÞGß¿‘HX–ÉèþÛ[‹è¾ü;~{4§Ñö›­Ì²Xmþ¹ÿ ¸óH(–¹çNa¡÷‡ÑŒ¶±í8xNñ„éD#'O™VÀ]0ùwp§S¤#£éíf«’$Þ™¡Ú­ãs[Á9Gíôž­é6[‘Ç¥­i]ÚaßW§±êZ¶ÙfJÅ¿¶$åw3ÿê»Ägj`ðÈ6 µ ë ¢¬«Ò–ó6LÉhË%K•ÃZÑ!@ ¥ˆG\> stream xÚ•ÉŽÛ6ôÞ¯ð-6j³â¢­Ei›í­ÀÜâd[Î(±%W’3 ‚ü{ßF™²”I‚@äãÛø6Ò‹ÿzÁŸ^¤þ£Åþ¼øíañÓŸ:[èHåQ¾x8ÂúÉâáðzùó¯«þ”<ÀбJà!BùáÒ®b½,»®jjB~õÀTãñ–Ü-6Æ©XÓ¾î²Ú˜tYî«m¤]Ù­6ÖºeQã×.ËSy.ë ôʼn§º²g NoêòÀ£¾áýcy‡×´¼RõOœË3RÜ1ã¶ûe$í½ \ª"C¢Êcq=õ3†pN™tdˆè ‘D*N¿hˆT ‘L {Ó‘!1Dâ ‘z¼D ‘xC$lˆ„ ‘ !ÿ鱬Ë÷+² sª…dq¹´Í¥­Š^Hо¥¶$UÑi¬ŠcR©@"ïW1,W§bw’“©äp‡£òdȺïÁjJlÅF,¦s["ÿêCq¾œÀRÏŸÖFÁY úJ9õ‘¼BÑî;„âåSÕ?¢¼Ó6÷mÓuÁìsĺ¾¼|dOJ+u.>T}Ù~æ‰C…ÇK áDo9òW(Ȭæ˜PvÝD.O])[€óën£ÿ%étІ$¼Öè ŒYöÍñÓ»±¤Ùšáí²Z¿Û®ÆýéÝúí‘># Xf[m&â {ù©“øKè¿Oÿýy==¤ß^W?‚Â÷§ôûë·79Cü?¼ýbçWëykùè'¤OÛå‹b·±ÖÆnWƒúÖèõ‹ý®x±]}þE|8ù°2è™wá Ì)=D—už:”ûÄWÇ£bØ V>Òå_GžéZ×]·o«‹ßÞœ ¹,[VB¤n<;Ì:Ùu Š‹t@ËËÅ;³}…¡'')žäZr/jŸªÎG¾¤äê.ÍmK¹â£ì:>—ý;ΞëÈ–lòQ0Z¥>7s”MÏÅj•Á)ú¾­vWLq&µ÷êpVª .EJô4’‹&ÌõIª²DèÏñOÐr¼¼é¯˜ÓÖÈ<õ±Ú£þÌm`KÇ‚ ·”ªz^ªDÄB0ù h vatâ4ÖÞÅé*²U©œ¢#I‚2é«x3´‘/0°@Ç _:VüÇÅ|¬Ñ´–E”: —÷ ´’Í=I¬Jm9g\«•ÚgŒ›«,—åî±¹žÌrÇç:–øZ¥õa!Ë7PÉHÖ$è(«ÛæÌ†Ñü¡ò _Ax:¨Œ/}$ÁsÃz¥Ë¦žuVmR•d_÷Ö<›z+’ݳ"i¨Ý4ÈE2J'Ž9YâTÙädÉçdñÞI®‰ær Õå*Ò¡QÙ³ò<Œ.ÎGWæTWp1µÊ!@ª}ÕŸ>bî‹ ÝBY>Wì°¾ó.Œ`>cpжãmÛ屑¥’Ì¥:¡xA„žò¬õõÀ¨æq§pØÈÆûÚÎrpm·Ñø…vâ©éŸ…Ã×Zg½Ï#„¯µ H/ß^hqkUó²(pÛšqÆ9E8ÎÖeÅ7#"*ÞpÝÈäàþ„46óÙpoãF’Â|ý\qhâGïÆûtb„}qõ¯MÃmÛ´ê‹/ñîJÀt“8~&¶Æ£þóÃÿG›ß endstream endobj 241 0 obj <> stream xÚ­XYoÛ8~ß_¡}мµXñÒÑ4Ú¢Z`»[lÞâ<È6Ý0ÕáJJÓ Èß¡HÊ¢¬ÄÞm‘¯™o>rÚûæa/„?ìÅþCoUxoνçï1ö0C”EÞù梾×>Cd`L˜ÿ÷Œ†~Vg…hE= hÌü¦ÍZQˆRÍ´³ËóÞ»shšx·J‰QʼÂcQ„·ýÜûÇû¼[‡ˆð…ªo’ lit‰§…©B‡AóÆQ¤n¦Nùó÷é`!%ˆÄB­)5@¦ÔÏr™5ús]™,ÍNGGJ£fë|BtЍ•œµm-—SBHŠ á®ÈL# 8ŠtC3! އó§!EGA²vî—:¤ïÎÂö‡ç1<\XGèàpupnC|°>Ží¥êŽcŸ€GOšCÊT7í®˜‘Ø_Îà ùU.Wzvw®ÕF/l¯ÌÀÖ^ÕÓ ¶­*À âT“ÖÝ‹ LÑ=L¥Ñ¹meUf¹¬—_ôL.Aq–Ïuïö ð’È¿R]â7[°"ñÅJ.BÌÄHhA™±‰mSu`“sÁ‡FÑÅÑQFÉr-~ôf‰ÛZ4 Ìÿ'ËtÓÜ,›U-·­–lÀ ¯7”0TÃÞðÆN/N{¯ (K÷|­k¦<Št×9<  E¼÷»Z¡gÑBèé½7mG‹µ±0®…ÞXÃê/ü·UQdv¶+±ÖG»]i‘_dÊ/îT‡wîôw8ƒ„"®®UCá« Ù¶b3cHâúçŽÏ¿vžJ2ö£r·#¬5ɲ_ I —YÃ\¥§p݆îâÄîÅQ¾œµy€¹žæŠÁE‚íÒÓ'A‚!Î¥,³úîFBŠ H­ð>«ÀÔ©»+–]¤;„0QB ½(ë‚Åsi’ê¯gû"ÏÔµQ<îBÅŒ‡¾‡l a„ÒNÒbЍÅT>ø²£o"¾¥(f£øV•}¦x1•YŒ"ëî/'d‚öqIàìPdk‚—gû1FŒ)àìÿé·èì1ýÑ‘^ý´€Ÿ$ðÕOøû¡010 ŒéB ’Ó>drت*×Ò\òΟ2“Í -B\µÍÓŽVÕ&^Ù……(TþTù¢¶[„ ÞlîÆÊzOÇʈ-¸ú* u}/²^¢Ýë®Ú´0¢N#Š5¢ôÅ©ªƒ•‘/Î~-})Q©ù }ßgœC=xcŸ. üK)ÖCƒ§j¦!oýUc{¼=m=¬¡Ék±Énòv‚å<±CÁ±ŸAuì=BAª‹Æ”( ˜¥ ÅC RC,ÒÀÇ‚ÔPÚ‚tòêÀ4$œR|ŸuCz¤4‚³í¶®¶µ„W®°ÎZ,39*ÆŽ®ÈPôÉ<[æ{×Ð 1ê>Š•rd4Q‘}•d˲w?²b›(ÃXª×Øîepx¼ß”@Â}ÝÎUŸCU¹~Ð_ë»6<Ý·g ˆØÈöö ¡ógøáé]ŸôÚF ukëC€n^š.]Dl,{UK½ô¤Ôíꪪ¡¿¿žèö¾´*„> ¾îÍ”=^¥Ç;¹Anœ.𪞚4ÂáèÍÖÈ-ReÇEàù×_ê¡gã™KME°‡hxB÷Ò5胱óÚþø0wNa>:†¹{òÙõÜðúBœP/®åÆòæâúrþofçÛ 9W‹ºŽ +†|®?þÐÍ—׋ÙUÙ^õÐtõ¼¯ëäÏìîÄ5éÆêìäõv÷­Ö>œNUÆ;ûGÓ¹òn9XuûÉ Ã·jü_¬r êqêœmð LhâØèñL¯<ŸÕ¨}>«)Ùè±²jÍZ÷®\–¥q4‡»Ëá.wÈÑË]ª°£ÖÂoV€‡ÊÍÖæ ”Ô·²6k%šÂ8/í1[ÚOÕó‘r=¬%pÙô?Q€Èº6o`x«¢GŒÖÓ™—R»ôóoÿIwSÇ endstream endobj 244 0 obj <> stream xÚÍYKo举çW(75°V$‘”¨Áx€]`l ë[œÝ­ QK=’z<þ÷©)Q-Ú;ãÉ 6@ªH‹Åª¯ªØÑ§(‹RøË¢2‡ÿ4ÚŸ¢Ÿî¢?ýYEYšTiÝ£L%•ŒnPDw‡¿ÇwõîFÊ,žvy?Ÿw7ÐX’™¦¡y¸Lõ¸ûÇÝ_€S¦}V)ta?äÒtSý±ì4C™&©›õCˆN2iǚΠÏ&B&¢˜™ÜÈBǦ;„¸‰4QŽÝø|zèÛf`¨Ò¤vÚ§‹i›ã³ÕÂ+êèØæñçR±i/ »ÆLÜÛ›Ž;°NÃ:Üz°è\$JÑŽf›]}ØÝ!â©·-n³Ì©ž@ð)a6“ÇÇezêøóEkXÄOïh«,Ëñ\7Y™(Í×;£ˆkËÏÝêÌ *âWÒx‡CŽ?ßEŸ¢DT:zš¹Ëoã ¥Qºï6ú-ú5`pv‘*’T’H÷q×OöHV¿ûæ>Íd}¸ßL"™:’gåq‡'¼œê®’W2^™@ê«úeÃÔy¢œaþ­kŸY¢†6æ5oÙü†Ùz¼hÔ¾?7pû‹rÓÛÏìë¶yÅØý®[zgäT|1Ï'c#¶Î8¤wv°³*É5Ù[‘Íp7ÏxERY%Yf§yf*Ò]‹ÍúλèƒlH/6ÄTÓöÝGî>n±*µJâ•{Ó’ípbp”ŸêÆñoÒL¬]"†ù—ñØ_Z«ÊóPïëƒumÓ¶övÝ}ËÕ¾äÄ¢u¢„Ñ%è ïÍÔôz’¥¸–q´“:íϸдANÁ`ÚPÀt?ÙÕÞ…Ãwæ!NFäâåéœè³"VP¶@Ýh¦f<>;Ü3kb– /@J8x3n0 —<:L´˜)ãcß¶ |g`Ýã3û²ÙOÎ~ýp߃™•¼DWAÉß»Y¹7«ZÂÐçpTÑvx[?ÖÐèøŸ,lâ è9»Æ´G {CSÎ[¬=?K‹$W¾’ß߆øÂ‰f¾!a%Œ—ß)-O(VÊÓû4—AÁ²DeW‚]1/“TøG¼}Ëm$…~-ñ(’‰zû& æbàû4¨Â¼ý~õqÈýðk!êße!þ7þú_;ßûo¹Âoð?¾ÉF0ò‹ÿ¤‹À¦é·ú‡ZéVæIUrÒ’Ó´'ˆÅuˆ—ÈY¼â«Ð+çCdVƽ¤‰–ºNø¢À “¸ÚÂ'IC¢ýê-¤I.®ä˜yCH¿´“¡D£<¤×WÂQa³ˆ¾J i|àv›r}#t¢KßXë/õÀ‰)¿He }BjC£ÊJ ?+I½ é@¡tüãðÐL&Ó4ÛŠ‰Öfk¡è8©\³S~5ËÃÆøÅÚªx¸.OàKddÓÔ!¹s‘B:sª™4ß#f0Yÿrdºá‰s:Ÿyå6¦Œ…fÍF‚“ÑH¼m2?™ÂñÃe˜Wžzbu¨[«ÝN†Î¿9Ùç¦o igcþ…\ÚÚŒ¶Ûwöl½=Áö ‘:«x„²W< Ö1Ù8lë‰;+_‡ï§Ç~´å€‚ –ùײ@Q‰P$r¹RsÎÀÖp3^¬ 퇤ËHåô¨š€ÖÕ,üµ¾HØ iä¸& ûÆ…Ó½Ço.4 ³8áÆèXÏÕRžª4%Ö{|¦’ÏîPA¥ãAN™¡Å-Úp½‘¹…-GeIYþŽíT› {d¹ ‘ûê[D* “„ç!r<(4¦¡2Ž«ÊŠ`Q@¡c¸ñ`Q”å iÖr#ðE7RÚØ)€™_cÝÁ"ö}XÄïÚYÃ"ÑÈâ å×$تJ?£¢wÛœSBR)ô³ÖoHõ-xœ!ˆ«V‹’ôðd‘Å¡ä`Èå%@èܪû 4d ªJ*—2¼» YB¶ä6øîFl½2[‡^j¸Y?Áb:‰Ã!}œÀoëǰn(ûþtž÷¶»,¦á^ZDåß‚25çUÔRÈÔz2~7Gî5O à¤)õÁpóÜ^¯Eíà`?¸µ#Ï8ÕÞI·{¼$żgÇÃf …“û]²Eô)\®(ªùî‘èC7 üùÚéÍÜ%Zb%]ÆöQ­°Dã#²Kí€^yhëP¡QÎ1‹ãK<ÔvÓ®®#oØõL:˜É0nŽ.X€Í—+ìx˜ßèÐ×zäùܰ·VO$õÞ>&)ZÌ©ܘ}ûžáϘP9L¨6 ˆ~\¥/`Pµ¼ÿ•úåìòê,²r/• j{Åñ[Þj5´œOVB\PF§ó8œÃ(ù´HÂ?äIî~;9ÔG¡:ô* „ùRÁÎrg*Ýâ"_4Ô€Ùêëè pþ!„ójJ/€|S&%pÞïžH-ç^½©f/½©r³®“`6ÕIeB@$¯2%øf¤ÔÞ=ËZôv¹F@•@mþ1©¬,–¾`™:µ 2†áøÃp âb¥£”ì±ä(g0ÛóÐÆéÙµÍÊi™5EZHB/ˆ¼öT·t[t-V ‰Ñ/6¸vu㽘;[ư1g2ýJc.EÀ˜½€ÀR$Ÿ‚Ÿš¥SŸ÷¿7p¿V^++…ûÄý®¶ù©,Ï5*á¦üÛnê¯ø,ÿ¹ì endstream endobj 249 0 obj <> stream xÚ­X[oÔ8~ß_‘ÇŒhLì87+-+XöKµ/”‡4ã¶\†$CÛEü÷=ÇÇÎ8i˜Â µ’cûØçöù\Æûèq/„?î¥þC¯l¼§§ÞÃçœ{\²H&ÞéìxÂÎ]o¸®:9®¥¹ã5W> OSewܵˆ'2#^eœTà8»m6"õÏ7 ¿««’v~í.ˆp¼2 Ÿ6ql±úhÅ`q xÆâˆì¦¡±"VŒr/Äj ÛÝXumQ)Áðí%íÔÕ¨ú¢>¡Ùõˆ,ÿ §Âv H櫲: ¹T‹K'ŒJ£V4SKWKKë¨5ƒ¹«W”±4ù&½ªv«n&ÍÔÍ®WÃûߥ Ãþ|(ûj7ÒÍF8Ç…“®ò~’® ]è/|˜æÓó $ˆ9½6÷í­=­(d¡\{[ñœHXE H.+J™³û-‚sÔG­/’»¾y’Œûgþ¯]ÓŠ(Áî¥ÚjG¬]ØøFnqÂõS'hQƒ b%ÄU±8Ö"vM5ŽjËÎ6F—lþV&ý뀄lÆÒ„»ñY'NU;ªKÕÏÈ]ÃñBÀó„¥ú` x”ãpù´±£«ªžšŠšç££2 Ð1‘šåyÕýí}"ŠH0žÿ‰ß=âÅ’qrÁÏOVP B%•ø"71÷éUÞ«G’²„±~ªéü©Ê)Ôâézƒ‚÷®ݾÝ~ó›ýª‚YΡÅxücŒB@_ú îw&TÕîhRùšvDSžR¨4ëg7E³«ï QcL´ZCyƒCŒˆÖcHÜB74M´·Ÿ_œ¼ürŒ¢)>¨Ï;º ³Ž»~ûåÄ.é0p2çYB@­Æ·»wfý±YoŠþƒÂõc‡±ëÕ羸6‡9c§ø—cZÉù ÿ~®æ¿0W½Ÿ/¿\\Z=xÿh%ïƒs( PÙ(›ò¤Výu5Ø1šqz0¦Rn½ÀSÚâh­xJP6Ú¶u˜ê%³ïm*>¼7é«z²>QΕ¨ðDñ9u}úl~P܃`T—‹aè´¹Ë |½ÅEˆàÕxE_ÚèòcCT[UÓÆ,HqæWô…C4Ž-[/˜ãiŒ(]oŽæ\£œ^õÃWœMŒe”jÆ2Ê4c1lëÑšY!aÙõ€a ‡o¤ÂÌ«G]^Á‡«ã`8´ šß_=üãÅ+ÚÜõP6´qÑõZú}]`=D`xe¾Qåè„oj±ÿþÍ|ô—w:vPàiSQpÆgñØÊ °šÊ9…¥¬þ®¸TßÁYB£Æg÷$÷òŽ#IçÌÙbC&þŸÝˆFÌXŒôÕµõ-}-@/E8=-å¸/j{¦WªWm‰Æ¹vŒC×Ne×B†A/¶—´Û‡Uš‘שxwàÿ÷è§OxjjLú©r,ëýÖæLêJœÜo¡ß4¨;‚À š¤ºVð]ªšA,¸µt_ Úiaqm;–Üá²ä^þT‘±ljNR{áq‰­¹éNà¬ý6ÀYjK§¾Ó2Æ–ÈÖÀFp«Á¢Né!¢"‹™ñœ–W/tf4¼3àŽòÐ7/3H`$‡Ö}æ\ëRP&±—Kò\ç,ÉsÈD8fhÛ„l›øŠ¶&Û…4°¼’²¤ m£–-t”»ÖHè´d´ } ÎæåÖ2‰‹C­êM…ͰÓ5Ryl€¬e“åóHÎüÕGbΛ³Y¤æLÚò@W&yèb §+¿’  DûFõú‡.X8üæBó mBø€jv·É¥x¾]¨–®©F‰,ÎC¤¶blm,P0þb‹G k:rub]h¾‰Û2Æ‹¦*ñKê¾[Ðdùä4;á?½¥í­º(öµá¦ßÐR¾¸©Jµ3”÷4öBd¨{Hj‡£Ø’¾þé?2îU endstream endobj 254 0 obj <> stream xÚíYYoä6~ϯÐ[Ô‰›#RÔ•™H‚™E»@¿ÙÁBî¦Ýšèè¡Ôc;ƒü÷T±(‰TËs$úZdÚnøˆàØÙugl€™÷ÕpXäÑ“YÐSh_^RÍã<à’Å2‹žÈY$ŒA’É ¤¬á÷]Ûº¬ÚM™LÌdØå eIV䛀ÅEÜI°›@¦) õêà—à§™‡‰`+’”e9ðaxàC\¤œ›@a2¦’¥T–{60›I…Ã(2–¥6•Ú²Q£»ªÒú}ß5hËZ‰‰™³ð«ÑÐJ2;Ž ¶I¢Ð&ÙŠ´D°x”vAK½&4ŸSŸ„ò–û9å¢HÆÑ5ŸOÿ†žy±æ!çŠþiRGפ˳¿¹k¾ùË]#þÉš¿>ã8ciòO.þ¿2Ü=ðŠç¼ î™ãž^ÈXäÎf ÎéTø×‘h>í∂‰Üª8a:ÁûÇQ†µ10:GŸ€¢œøÝt&#:|¾â¿-­çÀ7J¡ÅŸ)fabwÀãemõA¨#ëjPº¬m (¥(Å«@Û:å²ai¥ ¶‰+(ýàÊœs–äÞ¤ë %ô¶HXêe´©5€éŒ“å¸CZÓ{\Æã¦ÕYêÍ Àÿ`·!Î΄ `mçAÌ]¾É ŒÂˆäóJß|è'ó»S4Þa‡™ìÂwzÉ#–Æn Ì1% ë&ü•l:MiÃ_³ÌÏ86ÿôGSqÀg!LØE&i]¹Ëš‰‚)i'®8“VЕ)ûîD?Ìm-5]ë]DŽ6nS™CãiWþôÙŸïÈG„ endstream endobj 257 0 obj <> stream xÚí]“¤¶ñ=¿‚G¦ì‘A_À]ü’”J^R®ì[6,£Ý!a`ï]~½[j‰ ,ÌÞ:®T¹n뤦Õßên)øÄAÿâ ¡ðÅ)øÓ]ðÝ"ˆ#’EYp÷Ó{ý"ƒ»Ã?Ã’(²Ûsβ.ªóAu»=c4ì­Rú1ÕççVu]ÙÔÝ·nÒNÊáR8xù"¯qâa·§Ih¡rœ¬ÊZåíü‡/ÇÒáªÔcjº~÷¯»¿Â0× ¶|:î`!„3Ÿ75²Ã1Ì“"1 æ«/øTï¨ Ï'Õ–Å”¨Ž˜EcA2 §D0³ð_T­Ú¼/ë'øBpK«á©1kT…拏ŒÂ¶9?ÍŠ0Ú=£Xòÿ‡O”eß!pdôm^Ö†AƒOdZP…¦û¨_Y˜·–€¼zÑp¹þïK‡“êç Ì«óÞp³wì\äØ+#È4|lŒb2'ý,T¸niˆîüÐmùÜãë¡9iÚŒ€‡`!MÂø@¦aó8A8á¡*• k<cıþÜÖv¨o,1Ž“aD/pe ¬Ö¢vGÑz+"ÿ­ŠÞÚGw.4)Gk¤nT¡¬á“ç¼ÍOªW­°vÇCä·-ó‡J-ÙÊŸ ¿çª6•¡±Gý[ôç\“•&§€ñ±„pÌzèÁ½áW(Txn áäf»>¯ Ôò(²¦‚ ÂìýÿýnÁ*Ц7@Smꃕ ª‚¡3Ùôeq®Ð¡y¨€ k2†5èx9+²³ß£O¶`x'e½9·sMU5ÚÈ_–dûW0.J­ÿQ*®D§'ßJ/†OE >&Ê^/öE€´ÑÚ*ûèÈÁwíR7”Kc—¾ák”ˆZ؉¯NÑúÙ 4 :x*Ök ‘Y¿€ƒƒ[ÙÀ§ºsÊv–0—ðÊ £Ýƒû»cêm1—f)ÊCY>Z0»€§X€kéùïgÑPï;€(HH–èiA ì‰KÄs(8Ix0€|¾F" e3H|:SÂ’ ŽoÞFiâ-B(ek”ò$Jå¥a±¥ôÃnK‰?IøaNEœn¡·3Ζ¯çP"çTÄ–TTÏЙºEEl³1Eë*úh½*3NFn5O {ÕÔqb|¸&Ž™þné¿[úFK[Š7ÓfKÓ±g°QF cwI/G®t¦mK,c¬Úô/ŒÔ4UöG,da¼+ Ív @›]·Y &¯¡¶$†U¥ƒ`)ÐPúÛ-׳‘;2 ’0|Ì{ôk Ÿ°O^›"F§u' MjÁ«&AiÛB¶3ÁBÍÒ!o®úlO˜†d°B¶ÃÀƒSóå}8¿#S~s8—‚D[Ä}E ISoö‚x5Ùú™™·å‰N(ˆotÁKUo|û&õkKŽþ/$G7Hn…“ ‰³'ßÛÁ–QÏ(NùFEÜ´—“‚íŠXÍö Nô5Áe@ u$#ilFþ8„”Ìaù0› !^ŽJK9iÊQé>¢ü:VÁ¨˜£0%< ˜Ð»§Ë®ˆüþšÈ…l” GÙÛë×¹áöla¶øY–ºn†›¼Ç$M‡f!K…ÛÅLŸÕ6 =(i›…z¨±Íù¡²8¦-Af2;]L[Õ)  g(©ð’ ¿1¸±/è¶°K?P^÷ý=íÊó#"@ìœ&]ÌT2½ük-0¢xsç!~ÎÃÂÖ#Ö;YüÛ÷Hn¤ôÖP¿•ñ›{$l­GÂWz$nŸx7½½GŒo÷˜‹&ñUO_N\xg“ðF/ßNÏ#“hrÊ~óß|d|Z¢OÃü¸×ó£BMC¸£ºYæ9…jåWÍÚž ¯W{Qa\ÝgÉË>«c_’†öØ( UÑÛ@U™Ø¨K*¹’JºSÁ$šV25©Àð0„4x¶ážÌ‘ü^ÊýMƒø½SƒÁ+àÕ*.º(ΕZSø×Ÿè"¥s¥ƒ)RظHñkŠK‘Â.EŠ\:Ã1,LøzarÕÿÌt…bŒ9é]ŽÜ×YÅÛ7h¹š$‰ŸØ”æÛ_ß.ø;V*_²Ð÷ ô7¨ ¾b»àëÛ_Ý.^++¤ÜfO.¤ç±$¿ŠéÏžòø¹éwx'Žõ)ƒªÓ~.!«ÆÈ‰=Å”‡‡X%™¹¡A…EæÆJÂuèMü`±mgÚOaY¼l©iÆ.¥nº*øGðÓ’@D f€ê &Ò™ú2A‰ˆŽÕÁ©¬ËSù_w’ùÜg„;‹ªó“ ` »C}¼0â篓1MR4Jé³±nDjçõæ¹°I_’ä 6AõÁväŸÒô—™RÈÞ8åŸÿñÕ®U O¡n`¤TßJ4¤dž•ØOýÙ¸86”ì"‰ë8u¹›¹½Gó夷6»ÿVxÇŠy"Å BÞnçÝбÑÇ!îqMï2êf†8AØq¶÷×<ëä7cía-^Ò(éT›WöºŠÝ vè!½)õþ®&H#±ŸŸæäÀ\²Äœ¡Ùcndm>w,Õ1i we}PŸþ.éçM,Ú„Ä¿Æqž:ŽùVu"dzž!£Óç×¼ã+†<> stream xÚíÙ’·í=_1=ÑÕ¼úœ‡$%'N%Ží›Ç•âöô¬Úîc܇v×)ÿ{‚}Íp¼«D.m©I@@Ìæ§ ß„ðobá&«6ºÝ¼þ2Ùð¥aº¹=Âò'Ñæöð]ðîÑT§2ï¶ßßþmóî–°ùºH™J-zUÔEUüœowZ¨ ¹ûá ŽtðHŸWôáLÓà÷ôÙO«õŸ÷Û·–!Š"™ÖDÛ<.h÷MoÊŸÚæXôŽI7Tÿ9Ѱ¨é{j¿Œ#ÄüîôýŠse~ÌFÜ^©ç⚥ ø'LKËÿö°ViÇ‚Í:ø!ÏúâãVÄ…ÇA×›>¯òA=yVšÔg7šzA Z`Û]*“à«£C¤O7ÜuY[œzššÊŽDáHÖ[ìàäH)+ö!WùáX¨0èAh<Ûn<ΤNß)„ ÊB†(ƒiÐhïƒ.3pžý–æÞs¨0 þ lÛ‡¢Ë‰TѾ% _ãÔÍÅBß"L%`r®ö$BÉiyw(@Ï]ÑÔ¦t$ÛÖ OtˆæHà¼$ƒDAO˜>ëuŒT$´dÀjaòwådOÜ®¸ôœ´‚ Q\¦ëà’Y®p àCÑÀ‘¶Æ°ƒª±Æ:ä%Í/‰ÒÖ}Pi„*DLkwøÖ™ˆÌ‹@²­“¹u›ûîŠ3Ty…lîk‰Lµc/Sbo¿n=ç“Ú‘•Le5-¸ûÉ*¡©„Õ7´ë>¯ó‰À²¨sÓÒ8kê®oѹQÕãåxX­áàïß¼þÇWßЮó‡è›vç‰Hl(Mnx’£ÿæHKÊà=j©©Ç°FAñ_qƒöžÝ*„š%@_„,&œñy?nõíâ)‹åjÛ Ip2÷ù§°×œ%jE(zž»ŽÙšù~‹WTÉ௠ºÈÃì”´ÿ·V0 uYüèœç—Æ Å®® ^Ô÷t¼É¼€ö©:C0]D›ÌulGÛìA„Ñã êC~@¹qßETþ³•nkZÎID¾‰ß¬¬³%ñ, À×ç!XQgåpÀK3ÚE‡Àìmv}å7ëÂàáC‘!¥´º?£ÃåfÅŨ8¼×BÚ«‚_CŸ“iû"'Æ,Äy&–ÚKyˆðØ)-FÃÈ}ÜÌË_†sú¿YFRÌ`¶ƒ šLq{,$D®- d–î­? $,ŸQôUxNé/¿Æ”.Ï´ýœÒÓO¾“çJçJO«ï¡Ê[HÐVåç9$«(+œ=®è^½èWõy.à:_¨…+PFNæ™R!t‹ŠÀVãóQó ÏÛ t—„67×äÏôŠÐ‹,­©Ä"¨e¡³ _»šB•”JLtD€¹Û>¤pr^a€ç¢ a.Ë8ÅÁ´‡Ë¬­T ZîÛ‡aèÍ‹ž†Òã ,9bŸMxÌDò[Šý-Å~®=—bc<Í„ò…O_‹¢ð•ç$sðãÏ[Ç—Â!P%XºjRÿ#vYÛDI´ƒmßÀÈ^xTmû燜ÚLö¡Œ¸ñ”«à­CÄšº|¢µ¦ÎÈSÕ#ü¬ † ,ÝGV6ÚäÝ™H—Í‹‹g)ù8Ôôrß©DŽA.¡G~)ª%‹­Ò› ƒi]yüjÁ©Ï’¸00ö4âh* ¹îML{W@”lŸhê’n»s0ZhŽ—ÓÓ“Â< OPгñò•©@é™érZpQ<žž»8öhÓn[(f”)$Ð4m×/hœ÷¤×YCïsÈN”b¢ILo:Xw»¢¥»=¢TP¿ðZ+lìxYEÃvSb“Íö³¦W;­ ðºl³ðõ«]FÁÝÐOØON¬†¾ØR½8ƒÝÈ<ë_ø²ÍÖ}s¨R“*r}s™$M‘¾b].Tð¾)?neh)Åj¾MêGj?m˜L“ÍQ!„d¹©6*‚¸¨'@¹y¿ùvÆdV¤f‚ªÔª„vÙÖçd¤Þ„n^‚¹c¿½™‡zÁb,Ù¬äLÅ—r`!§¯4NÍýxÆV°Q÷áE^†äé2„eÎ6…ÑØþ$ 2Û2 §›JŠ-¸NÁÏ ¢Ú^=‚êæS¥@ÂØÈà‚‚)ŠkYÓuC•»RÊœû_^»ž 6¼W+Ë]¾pHÿo2 —§izË”¿#ì~ܶ↠}ï¨à^Ò†bOj—ìþÜÔ–&V›ÕipÝ> stream xÚXYsœF~ϯàͬ³‹™ƒËŽS•ÃNÉ/)GJ^$= @,k`-­]þïéžžE¶’’ªæèžžž>?Öùè0LJ?æDþ}'«_Ïœos˜ô„ ³k o˜ï%0ÏÏ]éE« c\º¿ÝÙJøîÝj#"év}Úu±Å­~uyöÎysæ|t<‘ÄÎ=Êà‘—H§vdz<0ëÊ9uÞ|w6AìùqÎc&Ò,vP?AÍH’ÎF^Ì”vèt§.ñ6±÷xJ OÞÔi¹ÕLq"ö"ÃõrA ÌC/ví*`nÑue³(-àžšûÕ‘AÐ ~0>Ö¬íÛÖ>.,ëÑÚ2Œ­(ðG‘ñØä½ýÜÄc¡V°ìÀ‹aâ¦[ô¦ï6»ž•V´*·yñPn?Ð ŸNÏ^ãFìÞߔي‡î ʈÝn·‚g¸EV^øLJièöW]Ö–»žîÓÊÑ×4ö7M@häb”´;âWQ¶QÙþ&¼@ªG`ôÁ‰þÕ‚ï0ˆcøè¼`ê»PNLÃÉ40V͇2S–Åh ZOLÁ–LLôÀ¹¨¬Ùæe?Hê…{"W ÙÆ"(9÷V›RîÂ=3R³¦ÒÚÐ;,¶Y‘£+M$Áž|Þþ7-4Dw¢Ùp»àJßXé+„ÛÔe߃Ž+-ÂN¨*Ì“9F(IoÒzWtº§<ú1ô½0óý%XêÑû# ~zM#£!Ýæ4ÑÌ?k²?#fdŠ(ß¶$•us·¯¿”ĉ±ŒãŸüñ•¦Ý~·«çå%-_›ÝúËíôÌïoNÏô™¼¨A—óÛËÉÅÖ›é>9œ=YÓ8É<ù__Òâô¼\ß^NþôÚoUèáôŸáâ©ÏY€Ûr— 9ž„óLÅ­¡`F☷ª àûŽÖã©È½Såw{#k_õvpDKø´ PÌ^s`ÅÀS“'јO¸i§&U.FC.æ´[n‰oU)c9Ø{òÈ6)…{rMñM™,¤­î—ÝRûà‹LÁ½N«®X°1gK4Ïš2J¸£hÛ¦䫱-¨À4-f™~O<ŸÙnBme“¶8±Š0.MÆ9JÆqÛhâÜl*ТQÖĉ¸ 2ôÉöºik´7î5ÛꀳfYæLüØ=ÊäõAÅÑöXê‹pT_D:Ä"bH³U ÉÀT#„V ¥†Øfñ‹[×hkœŸ0‹ö`š<·{¨˜Àøt©N†¨4‘7ý~¸ÐèKfœ=¢+0΢@º'õ«§J2Sè˜OÑ1,tÌ5:æÃŠ-“Àl†•öV†=‹¹×&} fÌîKb “1h¢Å˜€/½x!JƒG‚4mM^Ýè†8A—¶ –RXX «é}•¤Þ° Ú®¯$úÿµ‘@`ü_1­ "ÇvÍШö™Fª¯Ÿi„÷ Çg‡á`Ÿg„Ï Ò&¯ÛþÂ@âçÏiäKpz™øyF¼X=~ãë;ZKC×cª@¬^\©ÅÓ¡ªÉ,mDlá;3q«0p(`A“!(“ù×]®¶4R€IŽ„ñõ¡L÷mIWH•ÙeKÛœÔ7™ï¹#(4D1\²ÍÓ6×!ºïw{Ò.à?i«B»4Q¥fÚ=)¥=Õþ#+î T¹Ðb—+ØÊœŽöŽT¼3c­5Ÿ1ghò>Pæ—Úü9i¥ ¦púVߦšì'N˜Èª¦„ý`n±ã<™þÁ‰3™Ñ€”¥ûƒsýdÁ2…[C½ÀÅì9’éç mRÂ"×Ð |ÒÙÇÁ§ð9ü¬õTðÉ(ÉÌC•9¤zñ¤] o GãHBm! ð‰›>qf Ó¡Š"÷€0‘B3$š¦@ɨfh¦&Ð]ÂŒ Â<*8V[†Ÿ#Ì£ÐþEõÙØtžPÏqü†'K0f «SÀÒ^ݨͼ¨hÝä÷m‘õ´q6^Ó|—¶i]€UU‚øº´ezUš%k¶]ߦ‡¯-¡¡Z~Rªéþtìæ+2Ý.ÛÆ4©Iƒæ1ß„’º”H ëûþï²% endstream endobj 268 0 obj <> stream xÚíkoãÆñ{…jÀ= °>–yn¯@ ré‡$ˆ¿Åš\Ù¼ãC!©XNÿÞ™ÙÕ’¢ @‘/ÁÇ}ÌÎ{ç±Zý´ Wü WÛþ‚UѬþu·úêëd~ä«»ý*Lü\¬6¸®îÊÞ‡ýzlj7>*¤^5ª†–ªV$}Š®9Gy_+Úîî×›$õ>«b$€WùÊ_oDš3ƒ¸§…ƒìe£Fe¦}·Ž¶ÞÏU©J\ÞS5>ÒžåHCõÐ9Ž}uÕn}³þt÷-ˆÂÅ~’h‰è\Ì„-0§~^'€ª>ÊQ“EXÍÆ:Ê<ͬX4ª]GÀMÕã\ä^Ù5²j “lK ÍKÕÈTŠ®E¤#žÏ‘¤´š! —½Â]e~¾§ÅÙ{‡ØÎùƒöÀÖiKË%Ò£•&˜é´)K±z!´åd øêdb˜­5ÈYSê¤íÜM³„ü*äs‡)umCØ·L8gžzŒ~-0Gö¤¤¶”}99ÑSïÀéú¦‚|º[›ë”½tÞŸds¨Á›'Íâ <ÎŒ!N…¸I ]|óªëî'àÉ]_—ÝíÚ7·.KÂ9õ–Ž]èÄ?èsíÇû[>¿´ñËźbÊ'þ>ßL€ßÑçŠZhfùÛßÞ2Ò}Ý=Ñpßw ³5ÐÊWü½.¦+CÁñ±ºùü‰ž!¶>Àáñ‹B’üg¯o.ü¹q„Û\œ~AÂßèûfìF ÄZ”W„²B< ‰gB Çæ× U¹r½¬ø/S¶þÍÇ®N¯‡O«_MdÞé.¢ð…ÿNŸ€Í _ðôÉòYU¬¹«ë‡+óâx¡±/7gÌ· 1hÒó„½DwE2­!…ó€ÂÏ7‚aá;TMUËž&: óh ÷…êFIC?r>ኟ:y§bba¢\$PtC2r”–ƒå×WªB?æRxzí¹,§çDø¸Å7Lmñg¤„ܼ@"ìe¬¡É‡°OŠMI±yz¡ØœH·:©âHOjp_,õ¨À8žBÿÑRÛ?ÛBöBråÒi‘:=Dêò8(Î@D–“y NÓ)çñçœÈ^—E0@+¦þÙäÆÈ­H£ÄÏLj^ªBÓs{º‡š0ÌZŽÎlñ=_×±÷¡åd õbœ_ôQàÕX_ö4.äÀ«vÛÖû0¦—ÌhÖ´À¼á'JHl9°VÔÇ’—Ǧ1¯÷ʪÐÊ…½Ê´)ÚËc¡J»Aìt=!³v­íN&Çé+'Uî Þ¬/µ„•K‰}Ù× nRÃD›èø•´åÔ8ÅÂwG›,µy¸ìhl¡-ÁòM,½¢LzKèðM<¿YÌj;cƉ\\3ÅHÈQßÄquA”{´¹ù¾ø Ù` …TÛv(ævw¨Â*c+òþv%£Üw6†½E¢€»ûÊþ™à ´Ç£ì%ÔÁ=»ËN–¥§’(ö3Sý^/urþÖ¼Ê`zl±S£S9å~M«áƬè5`‘wlélhÉômü n ¹ÄEp$%nSõõZ¡­óC]# =éð ý+ÇÀ‡•íæëŸ:Ì꼘ÐåV}ɬé6©Èè7‚À€þð—ÿjY\ž endstream endobj 271 0 obj <> stream xڵˎÛ6ðÞ¯P 6#Qï ÚCƒM^Š ¾Å9(mk#YŽÙ],úïá%ËI´ØH΋3ÃyÉÖ'˵øs­ˆÃ¿ce•õûÖzù&°\‡%Nbm÷€Þà!´¶ù;[|^–}Ú§ÃjÃ×Îê¦í‘]Ÿrç¶x<¼-ê‰ÈŠãú"'h¡°ÝQ¸s ÚÝÏŽÝvi'*A°5Â{_7UÚ*ˆðÇNOJìCStƒ&E×®Þoÿ”¦x,¤) [_v)Èì¸=nkã=»«ÕzT€ºïν¤õA­F¤“rÝ€%>ÈŽYàIÙ¯k)öóŠÇ¶hÈë bí‚ œXŸZD¹pIÚáŽÛUмOÄñˆ¦oÑkHSœ4—B‘G™Ñí]S—êÚ®‘¾@´De°–e @t+ zùÆØhçåŠÌ ”€E¸Ñë%)1ƒ(#|ñcìûevþv-þÍw±{®Â‹Sþî»Ø‡Û?vû_cßø±'ÓhAŽç27T”í—±Õ&NB{{­@™þµØGÔ1³…Á)¹ÒJ¤£Ž„•Êâ"kN †4A-7®Ïg<äôkZÎM}hÒª’y‚ù]¦§CŸeøÝ– £ëZ®Ï®2m@%z´Ä ã‹utäu•*ŸÍŸbH?ýí‚Ø± eq·$ÈOX¨ƒä•z7aQkÂþ¿h^Ñt¿pKÂ`]6$¸b»†´D6[r·,5¼"õ°d]Â܉óÌXÂøq#J€)“ÐÊ06CFL%³Q ‰˜Ã/ŸÀt—ŒÆ˜‰tÕ®!dd.e’!Ôûp,2Ìä#ç%C´D”oÛh³¦8wUÚHT½'U`åAŸ'ž\ÖK¥#fIô Y8̉LWFžt%,­øÔ‹S&è$MF¨9Jte-‡5¤Á°Ä5ë›ò‰šÂ‡&ÍD»[);Œ¸GÓ % ͪRò€9“>f>’÷_<Ò•‰ö¯“Tk~èró„à Þà0bê#ý\p QwEw,‰’­uã3Ýn!‰½Ä&W ¹|\]^´çRå4~ Ô·pî@6—mzªáöfp®âñµŒ¼{L«s)Úé|0#÷<‡ycOÛ êóÎ.Ö÷òp h’‡õîViùùWZïÿ¹üry†8wüDZ‡_IHw³/ëÚ¢Ý‹–Vü1Ï…Z_v»ÓÍZÕz¯ÖÇw å{ÊY7b`™YÁýM:Úÿ¦´vtgŸó-X3ú¥˜zÄeì4¡÷'Ö+¾À~¾_â“Û‰‡´ƒ÷—@()7oƒ(q‚• vsÅtÏξAîVße=¨ñ‰Þ ï—AÚ´N]äçVfNÌUæÄ³\$\–BÚµ„NçT‘¦Ò4ÅX÷bUEæ|-1ÎÚu®Ä¨ ÏiÓMeP¶ÇÞ0î]fåL=_³6éÂ(cĵ{FFÑ<éQŠ›>Œ‚q\šcB 9Boºr„Ê)ƒëé‚£h× +"(aÛ#ÞÝ·øIåÇCb]ú&ÒFgÄœ¹ü ÞÀî=üX€e«€¶Ó窼ç}U 8üÅ /2ùør^Q½Aú0ï3Ý@Š“îú7xøMçKƒÎô+Ét"‡Ö‹3U©üLr5éÛŸþ©î´ƒ endstream endobj 276 0 obj <> stream xÚ½XKoÜ6¾÷W9i‹)R¸—Ô‹mŒÄÛæ`û ¯d¯Z­´‘´±ƒ¢þí!)‰Ü¥ã6( XŠ¿~ó ¼OõBø£^Âà?ôV÷ò”RrñØ[ÞÀû€†$ƒqqásBé" ”q¹È˜Ÿ_×å"ˆî÷C>”›²YDÔWËŸ½7Kï“G¢,õîP KHƽÇã˜01>×Þ¹÷~–# v£IHâK ¥¶ÔC8a†Ø(¨â^ BX.ñ îþò43#FX(P¦É7ˆ9Šü¼®ò^K[z'ñ(þöCJ èªÏe§5v ú·z…0U†$UpaÏ?ýœ®¥Q'tÚö§³Y¯j*‰ÁCàR!¤X_NM1IÆ ¿”1Œ …’» ©(œÊ‰™:rø"#QìpE2¹ÂÖÆ»­-skû*¢H ]¡uÌ© ü™ŒÀ·x’à{·ÛÓQÛƒQòû(Ù§Ë·úèí:–é Î4#"úæ0•âÝäUãÚ7‹±Ÿý¶tQ7Ä´ò|1~kÌf ¡‘³åýÖy^ eöÌ<üßbõ¹Œ:>(FXBašqÂ,6fé¢`VȌڥ'Œ²d"ÄQD1óøÐ¯,#,Õ+Íî ”~Ù,Xâ_/ rü¶®VêííÖzBÆÓ±‹Lj›H§CϬyA¢<Þo;Tm“×ÞÐUÍ­zSWCÙåõ‘zº[Vûk•aû-Xú媂ƒâåžÒ)ª¹¶'úWöH˜†=VF0 Š —ÇT5Ey¯à’‰e߃‰–‰²#Rv$¶\¼Ü]÷«®ÚV‚r›ué·»a».úüL3- ½açÔ†ˆGÚM™7Ú̮̋鈊|мºéÚÍ¢ª8O‚QÛ`æ+I°š»®ІvÄÊ7O@nb@¥r¦Qƒ±Š°Øañ>j:v! €"Aµ²°€ø®/ -Òªß|µý{ËÝDÃðÒ¿i;­¬òªÖ²}©RH l2JÃë­ÆÔÕý˜éTSÿá'=ènU޲K¸2ÊH¦ÔœÌKq•kABÒÔZ£ƒe›ß–ÿaãÌÞ8¦OîLCRkÕåÂÉQÒÈvVïliÍHL vp!dzà"6ò>9È‚ÓYx›dAeûJóîv‡÷#p†ƒçzÉ|‹ ‘¿È 9P¬ÀáÌ+(½)¥þr]©(+Ìö~OµÃd¶ÎZëvWº®´:TͪÞ:‹ÝFjú2eÌj5¦ð½Ä^Œ"Vrá:ºN*4Ïh¾‘»M²'}“êJˆS˜bqF99µN.ñûj³­õÜEVy]—…«?dŒdc6]aÿÖ6ƒäO‹ú ¸‘B—È)¥‰ÿvÚ«QH®•Ã4ÈM5 êà(ƒ-æFœ¿«†µ¡¥ªuÎ(ž¬qÀEYW¬º®LÍã¹À-ÎáU:cu†„¹Üo:³Çö…1´Êk¢²kÂ}I É.xÀ³¯ˆXøÁ>Ií?íòN:¸îrYnÿ\ †QÙ ÞÖeÞjªmʃ .£ªÑÏòÅM5Œåº|§Ž)i™áò›¶®[x'ËSu„ªmÞÁ2< xÔ:ä‹¶S¿fÜ¡zJ¾ŸxгyS¨iɨd3*ù"e_p^ñG22˜¬_c‡Èðs‰ÝZ[L&Id5ï9ÉÓc”[=ä}¹WÏûÕUÛ7TÁj›bjÀ6­<(¯åÁ|Èœ”«13éÄ£+*vrýÞnóaê­ŸÌ;[ í¼sçž4rõæ‘»7ç¶N½¼4-Mã3cÜLnl`4.Iâ‘;ÒÀáA¡éÆkCÛ}yd0t¼ÐY­ŸÚÉ@ôæ>ǤÚeûð£8™ã²Ø¸ê‚qÝû &°™•¿/NΡ‡ø–¬úÏ/^©‰sõƒ£ð÷âôÃÙ¯G˳«#õ\<üøö|ùúÝÉEU —æÔ$êêáäì|©?A¼5`ù»zø z¯#Ù™£vd¹ñ·úņ÷±Zhb¾y(ÕÃð°<{ÛýìuõpúËÙÇcÇñT~Öœ.SO£©+H®pœƒz›yªWÏÓ=”÷q¥ºàHOLZeG}­z2Àì5ŠÝ˜$½q_Žï1µ©ø¹×ðÁ%4MÐC9Î;u!ŠæèèÍ(‡dƒ]SY×*×ä‡ n\,®9‡Q¨îSÌHû‰Åh+ÚX*‹bÌSõœ¢ï¿û“äÆÖ endstream endobj 279 0 obj <> stream xÚ¥ZQ“Û6~¿_áë½È3kV¢HJJï%I“™vî²Ó®§77Ù/ò.±2 :­áT¤ÈX¢ wÕ/WA~ çmp<ÔMQ6eq»$R[vôRßOª–Œ[ÝÍR†A¹Ýü_ ¿yP´6Äœ)nf]¡ø$xÚ‚VÒTæ›%<¶øKM¹“hdSÚªíZg‘~v[3±Í÷æí°‘Çý’§ÁÝrïesa+^1CìÀ¨Û0ånÒv³,õl9lÚ ²<Ñ–Ù¡!½Õq<65²|­Š² ÊSÕmé-§ÇñP}9–4­ý¾GvZD½«6Är •ÂÛ&ßíJ£7âtu±^\è¯ =$!!“&†Ÿ-WBˆàý2O­±ü–ïwå+=uÅUÌb Ï„‰LÏy_5-ø OAÅ €›ƒœ‘,³rÿ•‹žÁ|˜xº÷zXf,ۮ钅¼·Q)å=xœ$îß+í(LX˜ú*ÿá”Y_&J i¸W¸J<|+²(ÖlkÜ+sºÁ ¶eçiÂŒ$eÊúÑß§Dƒ¶Rø‹˜CñפÒÚ DQ¬LX$´D' $ð _‰p)=“ö‚—*~·^|Y°Îà“?8_oE‹=ø:8¯r„ÝâfñÛ;© Øûùð´ìÊS?ÊáÇy‚Q<ÿûõ¿O­Acâ-aF|*0zâ××'Ây¬˜àžpG¸,œ ΄/ûç_nÖ¯?¼}wª!ƒ[*ó5XÂe q¾Ÿø*Þ^߬OÄ;h¬ø+Oü$Vé€çØa¹*ò¡¥i³ÐÆ©=f7eÞuæêœ„שpx_VaáíU|(ŸVÿ­›ÏçQ¶:zØ/êàR±$èàLž‡Ø‰w˜_ï îÅŸÇØÊïAó䟂ÖGƒóHógA“œ…Ùó@s*†(΂֫x»­6ùC}3«bâ,f½ HäÎcæÄAœÅ¬µw3+â9ÌT†ÖïÇ Îb¦$SÏZ#gQëU\cªì´Di8Úkd3»ªWàã§íŠ'î!ï°EVkELµñˆÞ„`‡ƒŠæÃ„_)4›†WÝñqWZ]+ýÞØ¶5–mjÒ×Ô;Z†n jÖÖ¬|ì2TñCÀIOw* è$rë‡×“õ§øªvj‘Q2‘¾d‘¤CÛ úóB7à´µê°ÝÅEð¦l«¢Ôž‘ꮎý$h¿C«'ü†Áï„ö;Ã}OϾ¹‰¿ü.lRÂÂA2o[m[°©`gð¼)nû…*ÒýB ìk½õE¹#òcÞ€wºå úóˆÜm[=¬\4RéÌa0+ öåíÄU©À‰* 8}\VT´Ç»vÓTìž n9O!xýQíÚº‡YïÉ{ꃑo"–îðšÀ4å"dÉË\õþïHm'¡Ã ³›±8òCÖTÓój(!vÖ»îç>™À:šcϵáT½²‹ñ¯6™°ÄWo&Kncµ„[å—ôü1öÃ+z¿¡Ç?Wôüˆ½©«õõ§+ú]üi;>†°ùû3?M6c¬;<#Üõ¡”w}À?ªÆ>5R* 96ÄáZèúÆÔbjÙ<”ØR‡mµQËc3϶Ü'„$}7Ø´ÎF)ä ê™ý±Qg\²ÔÿlëÎÓ«‚´ØuÃF‹Rý¢Ì ò¼/zËÍ5«Ì×¥ÜYXÅR2žøçKÇàdpm NŽ„‘ âͺ9m` |ü½c˜4J™^FH¡ã˹-‰ÜWˆiŒ$&€ÄðP}Õ—&™“yÕá6˜Š2í/„{tõà'ÈÅpǦ´ 9n—ˆ¥ˆáIÐMzÍM¡·²¦!:ÿ@Ü‹8‚÷âÔ&f‰¤ðfÂÉ’Ø}ÏÐð ú^âÁKÙ÷RúIßÁ²Ñ'þTõà’ƒgL > ¦þ­*ôÕ¿,€¬/‹¤ÿÔ6µ rcëEÅåø8oŒwãËÑýtE&Ò7:0Ý|-̦w1½´‹`¡âÙc-û-4H†L%£{Ýn*^µù4èm*üßÀ“GÊ»©›éMå/ßÔdvSí¥ gNg,îÂøPw:ŸWÙæ}Ó_ºCw5"Í~ÿƒ}îò‡”&Ř'"Ê„&§9ÞÓLÂŽ&aG*åH«;¢LEmÊȶ¾;ÍîÇy)&Z@lƒ†²9Í&oÍïò¿–F¼\¦5e–· LvešË4¼\ÂäM"ª¡"`¶ü,P%–̲/PcS þÿ ¡©:S¤ ¯HÕ Ïúؽ¤FM¼(%²~¶èá–áI‘ £.Ë€÷'gð“„ <2´‘7›*Q­¼ë`mÆõ¤Ühj뽡 Þ1­Ú3¨ßj¿Ú}Ç+S¼½ù_BM¢àÛ›×7ïèo%@fÙvôyÿ;L¬ û½à®àA²©rïëÆúÕsZ½V I%Ó«‚ ²ü²3ÜùnG/ýID§¥jµ€“Ü›R‰–|Å®ÕÛw6í˜*'ukéEY¶Hb}@Db< §ˆápQïsb©¨DâCy(p“–èPÝæCøŽ[Õ•f&ºÇ@™ÝpM$§Ð(c.3@yI“fÉÄ?›ÒôôßLøU æoh`ê5€<ˆžxXGS¶¶ê1çèå·G ·U}hÜS?— EiºúÅÏðläJŽñPô:õˆ½©îëÜãRõØ%gQœÅ35™{‹0Þ"Le…/Î/@3ù…Ð Š+Ä30 Ö踽CÌŸ¤¤˜Zš›Ý±0á³8î÷^˪‚ÝßP¶­ÒPÕ]7ö޶áÞµÈz“@-¡€Ch‹Á~ƒ‡AzXݤhçJ jò‰Ø²þö·ÿôSH endstream endobj 282 0 obj <> stream xÚ…UËnœ0Ý÷+PVF\üâ‘ì*uU«Qª.2Y0`:H LÁ4©ªæÛëkBÒ(‘l_ß¹œsîÃÞx¡þ#^Lõè'ï]æ½Ý „8 S/«<"pʽ ‘—•7hë' u½0ƼÏOçFnìI¥ÝT]Ót>Ñ]Ý~·¦nTçQ9¿üÐ8ÏAåJždëÓ©Kÿ6û ¿O’bA5€ f¸_ ÊQ/‡±Q¿÷¨Ú¨½6êÖ®×ìºûšÙÍÆøâÒí—ݧ=¨‡lç¶÷7:ÒíÃöãîÛ•³#æÑL‘ƒ4ÁÑ]_+ËW ­èúre"‚ Æ/ëÖµréb÷•QTod^€ïÑúžóÚÙ÷h‡.Qb.tKЕ(Fj>á8v¾ „µ`¤ZŸ%˜Má¯W" ¬KÇ^ol Õ¹õèXΉ#¤ÎH¢»£ìå?œá SL!ã aBOBqÂPѵC=¨NZËÊZÕ±—Òšö!á²){Ñæ'Y®1# Åt¢ێRœ’™ÞJ îî³ÝšàÊeÖåí*šâˆMhtõ½€Æy`+;:Î?}­bތұ†JTº©Ì%dŒ³0kjð3úŠ1æ“/°8Ôã“Ü­ë"ÀË…2UqTŒ}ƒjWØVp†dƒc9žNS?isÝ–u!×iÅ ¦ñÜϤsC¼”ò˜bµÞlÑ11 .Û‘É7<àH“w¦]¢¹jWIŠ9¥6"œLLêÁ†Ìg¿nD4]Æu—¥ñ2S'iT=øžÅ²_Å'SÏÜÿ_›µqÅpÈʼ2¬¢©ÞoÝRÙUO=ùÏh¢§iéÞކñ0}}V²´Žç¼×ý¯¤{­ì«5µK_Ã4ÂæÓï³ç/¥ HD<1 8Ÿ\?¿ù 0³Êî endstream endobj 285 0 obj <> stream xÚ­VÝoä4篰xÊJ]'qœpO€8qH'8Ñ7znâíò±{[úß3ãqvÝÞ¡êªÛó=¿›}b‚¥ð'˜Êà—²f`ßß²oÞf,KyYæìvÇÛì¶ý=ùa¯ÎÌ›m^–‰Ü|¼ý¸Ë ®*¸%,jÏý~Æ4iM*iµÓA¦f"åuZ£Œ¼.@®âùINŠ V䱘ŒÄ¤äªƒ(ÑMl ð •˜Þ fÜdeâ4ªeb³7@f"yÚwÍ&SÉž˜õ쥪äîîq#e¢û£±_ÓÙ´£ïqdUpXOÚÒD-í¨ó8˜´“âåÄ>xv:@eçËV ^Vl+r. ÃÙ<ÈåYÏ ²®‚uXô¬U°Ük éÕ¢èݸÙYž¼×nÿë<=àªHÜÞ`¨Hê…pèØÓb›H¤íîR‘£ÇÑæÒ¹ž-í¸‰ä­vÇY» -Nraš‚AÌgßiýÔ¹=QXdŠg»tÊÌ/#Ö¨HcO0uÒY:°Ýp蟉>ÌÖþ±k»ñØFÓkõ8< eQ+\Å…)´ßc±Fyž#Ê2„ Jz^,I>Ÿ_õjî5÷Ò<çÁÖä2A%â—dðz"–Šç§‰ˆÐ‚t¡Ù =@™ íùƒSÒWˆUhÙE‰S;¢š) Øn †ZÓôˆQ`¶ÄCú¡„}¥ß7z-yšÅyž`HÂüRf/Ú…f†%Û„Y8$ °½Ó?ðÞC÷ñE$DÔٙוfIp¨p–ýCQdÍ•ˆŠ’Õ8ñ+“Éç›WT¿¿£¯¯ qep½ª qê ë+£–Ê µ+aï9Röà[Ü48ö‹†61«¾<•⩌˽(ç¤&xå*îý\Uk¨Ášê DH«ª–Ʊ´jôHĽ4´8ôºñ%¦£Ñû]`žÆÀèÌ_Ž(Œ´»Óûê>D§¹{y1QB‚VÈiµŸÉà4;Þí0} Þ}k(8èóë)bƒ¿.0õKü@û <ÔMìÓÍ|CǧøQäÜTrÉ.Út0µ›úž.=€Ü·ìƒ—ZÅž˜¨+ž †s™‹œ ,+k|ü-=û}X³À.Ë’WÀ½¬‘;_¸ý4î¹,U\ÂK©È¯„ϧuPxã¹Ðo¢Šø‹2tÛ›nñ¸€¯S·5<íø xI£ØTÂ_²- ^Æïš×X¿p‘ñR|é%Þðøìý=Òüù¢%Å…øbÎ<Ãÿ£xÃŒKñ¯“ø}¹ËŒí›+Œ#¤e}í²^öª#d©¢vÀU„î8YV¡ùmYTÞ‡B.|øêo%Ó~ endstream endobj 290 0 obj <> stream xÚ­XYsã6~ß_ÁGªvÄ!$“§½²GUR•ßÖy )ØÆ IÙñþúí@‰žÔ¤Rã‚îF£ûëƒJ>'"ÉáŸHJ yÒöÉŸï’ßéDäY×ÉÝc"tVÉ &¹;ü'•Ùnojþóq·/D•.ÏeÚ»½¬Òƒíø½¼84Këٶ‹‡Ù3L^òØ5­=°:70mÙÉ2}Ý dÍÔ,–ÙîsQtvþo*²Á“¯ô·c$ÛÆÙz›šy÷óÝ¿à^þz*Óš®÷8vÝHgÏßËßî’ÏI¦ê*yMD¡²B$ûBf¦HúD‚\U†÷.ù)ùqÍl€Y“iÜÜUà&×+ˬ•ZgJEó·îí°9¿UÄ^ r}ëwc]{Ø®öuŠbì•ÈjëBÇ‹"Ëõo=ÿÊt;¾½‰zß”‘ƒ!vðMì»4QðŠ×`“™_6#~cnïµ > ¨ª£˜Â&ø[‰žðø¤©2Y®ð÷W¾—R1òöª†Rð¬3]ßãb¿Zg¸R«Bq•TE|+_ùÅÍÌÊ1Ñü^Ã[—"ŒD¶à¾”A»J?aõ´o¯ø§Ã–הݢön'kna MfBM–G´¶é¼Mƒ7²oð¬7æy JïýñÏò:æØ»e¡Û ›nžxùê–g^ñE:§wíØ‘{ˆÞ,¼ò=Â@@‚LÝ’€pš (7™‚ÆÉ'•Áðãù:;(9²Hÿ•dŽL(u ¬BXn½âûÄÂúîžíF>H‘•±{A;èN‹ô=ͺF_ü-!ã~ÌöóÉ­Å7ˆé#S½b `†¡Ó[ Ã'/‹ÈÁçËNC¨&7žhCƒ÷¦¾Y°uË*O_Ÿ‰=û'ëµ»¹=ÍÔ¯ñÖVFíÝF1®¡|¯ûŒŸ2 ^yEÚK©ŒvÂc ¯hññ2dnÜÞ ¶/ç÷ e G\ä½þ¸3BQ* ”øšéÁ-S3½í*™·N‡qÁM“¶µó ÎëÞ讫:îq IÙô”„°t«|-“>3>Ûqšììg Á#Øâ‘ ßG0M›ô¿`û¼‚:Žb«·_«ð÷æ|ÓU•é Z÷ Â;hLSOøl½&¶Î„ŠrF’.õÊøùŽ%û~º·•XI~aÍ|µõÞñåíñ«Áv{f<عÜÑ[¼CQX—éOQ*Cyàyûß÷‹éicâ€y§jì6yGÉ-!)3¡VB #Ócód¿æt]d•\)ªýt“SŸŠ„îwþ|—YHD-ÎmGo t‡Wã: ‡Í…Åi€Î1CµÒŒtÀÆv@ÜÓ0oÍ@0ß„ èí¸ÎŠÊoc¶œ˜e¿Õг2L¶4¢Tô‘â 3Óe´­ëÃHu¤8B•,$¦aºù˜E;¡v†©‡©ñäŘ“š/{–hMP,Þùé1ØwO½ßqòøvS±[?Ÿ`¾ßé2ê:Ì•â*}Ï)Wë8÷Ëû5^ê/N™iãèbH¡†_{ïá"LWÑ(êi€ª‹sO{W‡!¡±êb3æ<[‡øÜî;œ½F]ß Œ*óPza”= û„1µ\”}o»jßFÅ ªßÈOûËƇ™¹Q¦“«‹ ÕÁWü¹Î‡„þMdÕ–+Ò´ßœn EÓM`Jô™(ÞO§Jãó—ò©üõ|2ò ùih›Í¿À§’·íªÈˆs_à·eägMTe~5öø+’+¡Ð\©Ì÷\Ë·8ìR ¨%+`P åÄc` £3£©µ:WoXΩÝ×—¤®}ôYÉb÷ó±iý«Œj'¨ö’áW;ªx‡C‡Á½xŸ­ÕÕ4O§Å7Ž@Á¿—¯¨\?òêÜ‹÷"xò§š„¡™&ùö$â }`.?ÍŠ`#*àÎ(¢™ß7Äü**@XÙÅÉZãÓàþg½&?‰¬aÿÌ©ès¾ª܇ÃÌCõeÒQŠ'ûÝú‹sõå,+T¿7ÿP˜Àúãþ@?œV endstream endobj 293 0 obj <> stream xÚ½WIoÛ8¾Ï¯r©ÜZ¬¸ii0‡v¦¦ÀŠæç ÛJ#Ô²\I™Ôÿ¾ïq±µÐŠÝ „äã[¾·ò¾{Ô áG½˜Á_è­Jïí÷ö†R ÂEäÝ>À~@C’½¾ó%a³€R&ü/y; x,ýuÖfšZn* ˜¿šqê›Ýß~ò>Þzß=ÂÓÄ{FA,&©ðJODaÒÎ7Þïó‘0/ˆaC#Ò,!Ô2ió- S4‚$á""!U&6`ª~{“vØXH& Ç6+sÃÒÅRÂÃ3wÈH Ív=“ÔÏñß ÿUj¾v å”Äé@¨ì Ì6h£H1 i)§MŒŽ&†h";ÇDëöµÚ¨Œç0¦DòÿÕ»iT›}¹T¶nœfJBù4’ñeHŠó‚ý²YVÐ=ä?çNy4!1„Fe;34ÿwòüB~_j =”Çz¶ónMwD ë²Ó ô¼Sû]{? §Ãô“'²¯htx°]qa±Ø_Π Al‹•ÞU‚U=hÆöÑ,@\;p ´’Bl«e˜1²Ø1 ÓQìÔàŠSõž¡Cò&«Ñú¬Z6«ºØµQûü>ƒïf§ÈWÅÃW„ †]V·Åêi“Õš±Ì¸Hùy­™X© ˆF]À¾ð‹“{*$¨i«O‘ûÇLÕÖ×Ú¸Ÿ%áÂ0$Œ„Ðê¸èH鈩…f1sÅ*ì†i2Ë{Yic†*ÎYL’䜲’'ªJTš›¨:_UõºÑU$±íà×UYfæÐxóu±ýÚ—!¬ ½\aÂT`?7–EÛækÛP’SXþ©'ãl/_Ùø9 cuðÝï=Î. Tâó `pÇGl\ÂP«Õ6hНÛbR±‚$'Z7X&l:ç#•óàjÇon:ñû©É×zù¡Îóai+½[”»ºÂ£ÿÌ,T eëlYlŠ5쯧à~T-|g3N©­tìM*q\׫ÀF©³¡”ŒPóN:”;‚—7Ú1[Q 2ï;0¨" jû@c“ ñ—ôC®FSúM)wãWl‡mXé3Á©ê2k§¡æajÛÉ;×ÍL‰í© ª.~œå gœü[G´º ’„ÂäL[C¸UÁ¹œ‚ìâé/x%!+Ón±Dj·Ðn!…ná¨ÜRDmÍéJU.Z_‘Ö¾b‡âYøFË*kòÐUµ©¶öøf£ŠïYµ5–ˆ#Û7\Ï÷ÏX–Põ®Š »÷‹ÁÑÑò£ãc »Dâì¶;Dt{D¤ªI†Ó?2LÝéÞ(Bx*F‡Ww ák«¬¶í#’û¥?A»SÄM¾ÔÄßxA#ñ~WÛ•½a~ÚêÔê9ïr¯æ†Ñ¤hPÐYßhPs5¥çýŸƒœû¾' ŸÎ&³ž°9?NDw‡Ïi—uÙD—MØËÿ´¯ÀŽWC¨Xoàz®EçÑìñ‹ìqIïÛanÍDâ5Ñ‘IµÄ@s½ÑC`‡‘ ÌÅþæ$;×ìC±æÔˆ]Lcf想ã‡ècóÁ‘+Ý¡s>Hž~’Ð>s/k(ì˜ét挬y=‡Ÿ1ؼ·jâÇæÎDê¯R§Ö—@ûƒS½È Îàá=yˆÎë#XýüeûåÀÒ.°Sa*¿£Q%œ[rTîÜ—£d>u¡2øf€“A$] ±eýüÛOÕc†Ë endstream endobj 298 0 obj <> stream xÚ­Ërܸñž¯˜#ÇÑ` ÈMåà­¬SÎ%µYUåå@ÍPËR&9Öêï·_àkh­œJÙ%`€f£Ñïnì¾ìô.†zç üwÇóî§ÛÝt¶Ó±Êã|wû°³ZÙtwÀ·»=ý'º‹ÌÍ»›wwûýÁýȃæÁðÈÞ_÷ÿ½ýÇ.µ*3€"QÖ þ3‡ð aã9œYŒÃ\²…O†¿øììN‡Ü«Ä†LÙD.õ±Ù’8Ž†Ç²/yZþVœŸê² ¶äZyTàÇç¶7ŽI´ÊµÀTýþ`ò<*u_!f™—OÚ‡°Ù|ªË¡¿Ù:X›D%V°¾ß85ß>ÑNÕ¹lúªmŠš—Š®+öÆG/ ÈÇëèÔ^îùxøé¢¢9mÒ‘[å?½NnR+ççbCÊÒlâΉ0!bÒ<ºê ‰QûCšåÑߊ¡àûº²}tÜ}îqÑGmÇŸƒ¬/ÎkÔE'{å—KõuomTÔe³7ðTÍ ~ÚôòÍðX ãî‹l?%YT«‡—kåd,IHÙ‰o3:*I£Suë¤ìOt$os.àê`jˆU[•§s¥½ÌÌ÷|ÆwcŠyÏwNüxbF|³qtü¼!2çUœÍÔ'Ñ:ºôå‰gCËã⺴RðplQ^R›¨¬Ë³\‡N“¦£Ri=?VGÜzä >ÌDEßWŸšõ‚ž/PwQõÀKÕ £è˜Ž­2kCÖÃy9 ïB®“¶ÀRÛÈilTCÏ çòŒdÞ“ª•¬ 0á¦Ó _ÆB$;32”i8àû»½"²¾?ü¯¿Ë¤û$ž8Þy•{v&‰r(~cÑw±¿Æ囹@ƒÊ¤^eÌ1 oÅ€²ˆä@äÓèHd{nÌ?&‰ƒ–¦$@Ð6õ ÏØì°i›jÁe(î‰ß°Ù‹+É\T©ìØz¾XìÎuv‰m_Ñ.K&®iùÖ‘¸Ü0Á(EÀeÜ_†2ˆjËyÙX%‰(º©ã´Jƒ{gm ¶šL}l»®Þ´Í ¼ö¨a"ä¡F#è•øA‹² 3fŠ?¢JØànlðT0!]‚±õ Å ƒlsi‚߿̴¶­­´Ü°B€ÇöRŸx~ϲ•'–ûLÒVâœÂDz8•ÏÛ5ùäk¶…3sÚ s¤ >ú'|Ù=W}Iz³mù€Ð~$ñÃ#?D¦f¡ë™ŠƒP›-ï†N·W±POfš%øé·ù ß?ýŒŸ~ÎOyêZŒO_«[ hy%¹ÂA»TÙlå­R€žü(þª«~àr: úË}„¸ˆäáz_>hÚ‰Þ‹»TçBa §IÙë¶gpOÂ%,_. EW°ˆðOÉçXòǹ„ú:ìICu¼ÔEÇÙÅÊ“N)Ž$jœ¨)k™Ëƒ?øÎÛEu9£kØÆ7çýò¬gôlãÁ”s‘,éä~EÓ¨+×—lV.a L¿CúSÒ'X{=¸²]~È•ŸZ˜OÚ„HÙ­l^ŸÂW'~g©¯j;}xVÈWÚ‹3p÷ýGd#ŽÀ¶-9®˜lW仞¡Žlþl †yMcÀöåÊYò"1×d#ê<êJp¹§>†<œ® H¶$ž¿'ÜB„ØŒ3ʤR‹l[c¨Èñ´T Еiú2…ކ€½çˆEqí4F`¾ÎVôák@¤ÿðJ¦§qŸ=šÄD`¼“Læ£S½ro!7Ã? ðwëÄlæ·CfªŒý£ˆigÓXÇ%ˆE÷@fH%ª&œéHÀg*ˆ¶®³èãÀßœÇ ÀFcÀNLqFÉw& YÅb\ê R÷U ™"áa5Iråý<0Cž2óUz4ªÎ¦Øo&»±ÿ ¡¢ü¿Kݨ1½ÇPD¦x%gäñwÈ]«y…š8N6`8¶,®EŸà¼Ð}Ãqmž«ÁÞ*A1]S¯}¦Ò%ý:*7(3©ŠC IÒcØí¸Ée9qYHy"Ø›»,G.‹džßR½Y˜}K訊iJªˆ›E¿JúÚZ<‹ä~\¯xÒã@i€c÷ãf ¥˜eLŒÚ¸4½yf“cÂ/ û“§²JcɃÅÁT¬NÊTâw#ÈÍÿtˆžbÞ~ˆ]žáå à­vŽ©Mö¤hSñ«$û5ÉÉ·Hn6»8ÊÌH–:{Õ+2Þ£K')±]rß (Ñ“}‰ÉBRváe}²!6oí°‹òÖ3ÌÎ %1 nû|ìÈ^e»™Ðlªs!Šn,§Î¡– %Ó¼fžÛèW¥œ2É<­ùyL­Ò8Ý@Êë”KÇ–qâ¤g_S*‚q2ÆüQð@^g|áF+ã*ùZnŽÇýPvUÿ™m‡ÜÄÎŒòÝ#­òf ¹ 3çbN’…P¿MèƒxDpþñ¢["ÌòK ä–ó¾Ü‰`"ܽ1[ÍÝ,[€mh|åŽó½9ž)·&H!íʬ°«ó¶Ân¸PÇv›êu¦›‡¾ µ!Nhåí¢h[!ÚOÑ…j’<ú°Ï çÝ„ŠòW´)£¥KÎ×þº%æBSËñ¶$¼•N—ý»ê³Sw¡nèÝžŽˆ'ÔA ˆ2–Ç&Š— »(_ÚK÷Mۣ藰>½^uˆy•¶n—qO"鱨ëò4Á]ç (ŽÉßùÂ!±~U˜-u²1ÍOŹ2zÝ@…| R%ê¾)çÔ\EZl}J©™öžç•ŒCøZÒGi寎š:¸·Ùª0ùNžPµPHIð©bÆ÷‹2KšþR›6’f“äßzn¸ÈãúÈq}äÆÚªjŽõå4+M¶Ë¿QÖH|‚ ôËhÊvÏèË­Ï•3»3Ô_>äw½ûu÷‹”ª)¤ 9f®dÑ)ج…jßøåÃZHâsç®–lã›xKJÕ\.÷É£¢i±yË?ž‘pp99),Ðû Œ¤ùø`äÆn‘å!Àq aCÛ‡‡QÜ«[R,X£öé·p`ô\‚vc𲉒¹e 0e1\Ö䟪þxéû±{ÄWžžºù!Є‡À$jÊß^ê!Z€» —k.{¥í²sÄ> stream xÚµ]ã6îý~Et£Z–­]ô¥E ô€»Ã¡óvsžÄ³ã]ÇžÆN§ûï%[v”¯Û-v1–%š¤HŠbV¿¯ø*…|• øŸ®¶ûÕ«ïÉV ÈyvΖ®rfrè0-ç^»LB°÷ ïb´ .æN*׉ˆ3DòS"s¿.½U0òþö‘',†+–ùXw3ËòË1KØ­Y^Xw){µ*ÉÑå^šiasµ!¢;ÒSø¼NCÄiȆÍ}–²¶(}Q0‘Ý RuV¤†)11`ý™T:îqÁ•ÛC;0L¯f5;ÌŠ,ù¹ô~5NÞÍ—-‘"¿O/%=,àq¿†Wih¡sÏþËAh±k\¢"ÀnaÁ¡ý©ÛïK—û9BƒuˆºªZJã"B÷~pßv¯Cݵ”2zG)ãÞæ<_Ë´ü`_õÀ 2ku>0(þQ‡úÏo>uÚ; YZ8 On šñü40(Š©þÀx\PVÊh_€Øårë]w|‚ì®ÇgÐ÷㳤‡ç qyßo—Qä8°¾Þlmx•rîÕçÑ@.£UÑÌ÷ϼº&À'»Ñ!ä˶§¼ˆ8¥% ¸Œ8q;‹‹òæ=yœ÷äjð!S5á< ÇX}êRæ¢0˜MLȈq’*Iñ!¶sU"€³À‡bÉXž‡Xâ‚ wqš¨dEʲ‹’Mµˆ!—ÖqF¶*aµp­ ‘‚£PÈ"ø ~£HÅ7©ø6"©HÅÿ!RÈètJèi"«‰‰ñíÚ$ù ò˜ÑËS Q&´¿¨!9­<íË$`Å\º;€À˜_#¡o&!®“8Ѭá2F<‡âH8ž,æ)“T[§×“Eéù¼tdä¥dQ^ÉØƒÔ'NCF2öK4 Ææ³,Q_Nsü4½ÓêfIƒu/“EØD‡±Ì s!n0oÓ//Ò/ùÉ¡ê}&µ£Ø óCGÏÅäž(ÙôWm  ýâJÍÑý\¶ßJ«×iܨUqG °QJ²¢ —²È ä¹Ì¢ßDJ¹(”L'å’ê4)WI>*¡¬rµƒ°ÊEˆ˜r•‹Ïm×÷­FÝÚÅ—Š&H·Ñ]C1À¼jïøÙ¬ü 3 (•Ët,XPÈgÅÊÔçÂ×x­zÉùªó>N@±(ïèr6“X÷aȧÐ’äà³G®¹r÷^ÚÖgdSfLP¾àwt»Ë Å2Ÿü7¾±lìgnFˆM´Ý‘‹é®B+l\üê¸^ìÕ›)Æ -ã+#·îv°«šj°3›Èõ´‰÷±Mx^yå\YXt¨T²t&v:TZ4u?,Jűq™1%XæiÙö¢ÚK}|suN1Ö9r"cG¡¶Ûn˜ÕÃózÊ2Jn˜ZÞfe}:3¬¨+ÕÌ\´÷ðLןÎtS‚;-R¯ßÔLVÎý¥0Ξ\a§ØW¤dÁ¾ðXQƒ.ÕØ‚*~2)¦Ž ’ÑÜ€Âw*÷ñÞK1^ºÁÆTœÛ u ³Ÿ"8 ÆïAqå*×vÓ“øß;uôôHjf /$ƒãïºIý¥ÜÝꪩåkç­“×æh§ò¤¯?¶47Iqv=̧Þßw—îãM¯È]óqN-d õHWp0]Ò£éÚ“/›·•%VZw\ :ÒöGžB>v³`ÆËàØW;ku°ìçÆ^]ÒUزÁ‹&.\NƒE/XqN½¼.xò/Œou<))§héf _«æ\ÏÕŒ¬86e²¯)msó¤kä?®kÃÙ•Ø*CUcrFªFZ£ª?q"0ìÄØ-¥·Iž$ò¶!‘Ç»ígº¥¿Õ¶G*|Çwò8v¿ ÞÛÙ …lF'ƒ¹ŽLõØ$!õ\iâJ@X·¿Àµþ¥;6õ¶k{8ñÅv g¡öp„aØ/Fä#¸G¢Û¸+c´cçcž~\/b³«ÝÞ^?ϯ“³ÙýL<@¶DwÀÊxÐÿíí¡Ó endstream endobj 304 0 obj <> stream xÚµXKsœF¾çWpd«²æ Råâ<ª’SRÑÍòaÄ" ›™emëß§{0¬f%9‘Kªbš~÷×ÝdŸ2šðG3Íà¿Èê}öæ*ûéwZe”’JÊìêžoiA*•]íÞæ’0"7[J™Ì¯6ÏGÓî7[^äáÙÁAË|o¦±ýêÎ;3w›zw›wW‚™!Ï¢BT’Jd[&‰ÔVÈÕ]ãɪˆŒ1"hƒÓ¸‘EnEKŠ’ñ‚Ò¥Z¤Ë2H‡“}Á’ÕöøÍò¤6‚“Šz9wæ¯sžO ’=Ü]7l˜Ê¿´ý{¼ÅòÃC¿a:ŸL=µu ÷ž9-#î[V‘²„ %ÊyôŒ¹Þl¶’‰|~…E¯ˆ’ÈÊëS‚"Ó¤Òö1àm°4Å‚qÂx6Ó<Ï…¥¸Ð³`¦¹€4PÚ]”½ðB.¼ùÌ›Ã+eļO9†‚_tÄüç” ¢Â$€+ÁäÂ1eKõ¼GJÔi¦1¹H¢uÌ%͆úml’žešó„g ÅSÌyA€AÂT9"_¬ý¾v)Ú€L(¦ýË\Ê^Å¥ìu\ʾ«KÙqi¡×±KA râ•?ÿzî&òßRM„Lf="n)öO†ˆ¯}Ëûö„Ëâ P% Q2~TU½ž ö‚[Q‘ æ Kîø¿e%%(4Cô}h­oµ9ØŽ –Ö°kºvßN͘Ä7¦ íë"Õw aKÿÜ7™rn2Qúˆ½¦yø‚—¥Ÿ®ezia¾¿<ȑ«†û©zÓ¹_¦ß9÷¥=¸vw³å^› žšñ ‰+Â(øš÷Í™‹*Œxò£€=‡§õ°¿ïš©éÜoj < þŠ~ÀChóç9_ç‡Æ§ô€f|FÇ6ØrE%ÀÃÓ£zíÊÍ $K¹5_ëÆz¹0ÐÁLîÔÚ;!/ðŽË <5¦Æ9áѼéš}ãæ„dFWÚG㩚q¨Ô~Hg o¸u’­ÇPÉà1«æ0Ž nè•~ç•G'#%ÛNG†»y'Öšèòt,áçŠÉɆðjÑ÷Ò•oÚªã¶s£¦ÁEÕGÆsÐ\¹oÀ3 @ß´‰€ó¡>žÂÛµR+CÀ(\…žºÊõïMÛ9ª¦uq´ì<³® Ö c(ÛŠ*Žë šC2n‹ÍË…;7Mz Hüè .ÀaÓת¢r@u@9+ç·+¿$QìC:Š[’˜¤Ø¥Ý–ÄíŽ$ò¿6°™Ñì›É E´YÑ7 ú˜Ê ÔeöÅòTвx¶Ï„\•ó.û'û{¡$‰\1Â4â$SÌi» ±ÂÔ«K¢]BÝ£Ž‰¥‹[¦~Ø+R + íúÇŠp5×ì^ë-ŒæÉKƒ>e*×Lƒ^ÄÕqSIæ´XzÝõÿRñÒ§ ²¨¸…mF²Wu쮹5ÇnJp‚}U‡Áâ³éŽiVš”Õ÷tÀ™©8Fz ՙɧÑùeþTÅr"†+¤‹"dëý"å^FÊ Ödnn^·¶„Ò4;ɈB`cOË;T­¾%¢)½±3èoЛ¯ôŽq±§„+”‰a )…Ž`Ë߈ð(V߀¡Ûý‰ªAžCy2®懇=‚÷mrC>ÂXF+ÔŸûÁ}€äË„ç¶NTÔTã È31˜uêÒbŽ´}ôy#a$E–‘vüÅÚY¡‘vO¬\¯TÍfEb§½¤ª¥–/Ay ÌÖ¤¹õú–Ÿ´²y<¶2‘ÃòLéù¹6Œ;‡¯®Õvˆ_ùß‹rOñSž™ü¸å¤DZý2ì÷&„ ìivóƶXFÎ_°KyëÊu…,2uŒËÙë±ää=Q1ŒzôQ-P&¾ÁÊ ú¸Æ ˜†~{hß÷Ö¥µ 3\* >µ¾ÜµaBS#»¹/U¿@݇cül:6vÿ³A|tö÷c´·9fccvæ¦íÚ %<\>é ¹++kÔÛd_™we*]n§W ”9ÂwÏ:RPBÅ’z"¸ÕޱkõOQ*N ?Kt¦í—xJ¼VNÓâÏ÷ÅC% ]¾j›égWe˜‚“]‰¾4¥cgÆÙ£({c¼Ìóæ¬àð&’­¥›ê‹@ú÷ÿrDY endstream endobj 307 0 obj <> stream xÚ½XmoÛF þ¾_áo•‹XÓ½è-Ã>dk2´èŠ­36 qP(–ܱ%O’›åß<òä“ädí r'ï9ò!ï…™ý5³~Ä,–ðÌÖ»ÙËÙ·W"™‰ÀOƒt¶ÜÀø?¢Ù2¿öV^׬æó…J”w>¿Y¾íÔQV‰¯R˜‚º]v{ØfÍ"Ϻ̨^. >t&ˆÐOõl!µ 3«ÝÏ2öŠu¹ „.ZøŠ¯-:ìÄž3¢²"IwWp§É*3;ñê¶ÈI‹ MÝì²ÎŸ/´TàÊë¡l©·ÎÚ‚çYÔu½­+’mêí¶žƒqeõE‘UK¼{”s\½É™š ‘ÊC—HRs ‘ªƒ» án¥¼[â?´WïÊ®+r¿‡p÷|Âj©Jtùw¶ÛoL7 cãâȃ}Öd»ù"”Ú[bzçßS«¿3Wí]]uwš7YEIÍUqKEÍÏ#³5{þíøã/}-n¨óVqÆBi…`B/TVvôBm…`L/ š/ž7©¬ÊîCÛÕëû¡]eS3±¯˜ª\ß[¦$ô“/C¾~ys úì¿`¯ë¶cTDc`?‰k‚ëåêy¸OÙöP<åÿÂ'l„µžÄDq”ø±â-r>%DaÀ^˜îÐX(í«Ø7&l L¡‘Qï»cc0!€ž3ÝZ/EŠ’ú¸—(§ެ!'B'~*ž ïœT›ì=` Á_ê}¶ÓÌ’ŸÉ¤çå0è«"Щãj ü ý®æÅ.«rÒÏ‹Mvز‹5Α©\Í9g·¯Þ_pïÕå’{o/Þqï×ïØðß–oû—½ÞÕ0K¤{ öµ¬­‚€iò¹½$GCÒpŠÓdLS{]—[‹ìÅ¡íé^&ÃñªI¯…3§»f›u+×d“ª¶í1äÄ+³¢Â؇‹ãtÍ üáx€0‘“)×/Ï^ž2o¾(pÐûœÀáîŽÜõ~ºxÿ'§· úh±ï‰# Ž°a¬Myýñíåï )%«Åch+1‘VEM!y½\2¤HǶ96³ß¦‰²Cáñt‹&|›$ûú|÷žè‰K½$rèá˜LΗð˜ÕR‡œ@ZÄÔ’$âg —zbT| ƒÚLIûe‚ç7[ï«®Å1Æ©}K¢S„O3<®Æ„O¸Éó„GÿN¸ýÁ¥Œ;‡Ñðå¼€ÛYIüP™å–ð8Ÿ–(nª„oªý<¼<ñï®è xsj!¹ÈÐÝðàÇ‹õþÄzx祂‘°‚P©ò¦òÀ^Wc«‚fóH’uq<–QC9”'$âos²’U(]yv¼háõ¤ƒÔ+7ö~…+kð2at¨²¦ ×H¶ÂÊIŠåV¦¢ATN·¦ÎÁªœVsŸt*ÚŽL¿bC¢¯±º7¤`YUñ(­L'ìi]m M©¥#ñªºZ g0iË“‡xù\Y‘ræMtîJc׳ÅnôdÝe8úiÎ6* K+YÛ–+&²ëšòöÐ1O+ïT±'àñØ4ãm;Jákû84%ueƒ€©Ò4…-j«¼‡›ÒŽš]Q¡ù]ë³{Âã“0io-ä¼BÒ y‰Íº(pðñ3ï'ãK2“YØYÓXna³–[n‹¿Eµæ%ê ›ÂØðÈ-ÀÝœçäE»šiïäOŒ‡¹*ÇøëÈ»Èó²+ë*Ûb&ÁÛ‰Ý „] D?@fÒÔ Ú4Å9ûÆ *sJÑʬ4qŒ¯ÞÓŠ§RAÁË;µe…}ØNóAk_G¬Õ§˜IÜxœ¸* (²=ÓÿšÀªæÑÎc?LŽvEˆ Ðt¨@Û>îæ22¾G^½¥ávC6Å„ÒÊD Å”¡z)ø¹rv §p›ãQë¡)#è²Þ´ï ñ1©±ÝñpÄì ˆË®¥Î®p|‹Híᮨh¼bÀlQÞ7¥y+£ ˜ZÓbE§;´Î¶1⊴OØóÔÿ»¤LÐ7HÔÄ8 «úë7ÿOÀ· endstream endobj 310 0 obj <> stream xÚÍYK㸾çWø(mE$E=vC6Ø&‡ Á6ÃÌÔ¶<F–z%¹gûß§^”)›îÇ‚4i¾ªÈz}UZý¾R«þ©U®á²ÚW?߯þò«]©$.“ru¿‡é þÈV÷»OÑ®šªõÆäIôÐöëΣíZgÑ·x½±6îõúËý?àUxG:6H‰N¨÷Õ©d™O(McedU5MCópšj&¶­º®Ÿ„0-"™8õîºE5{jd]3r[µC]ížñ‡ŠÆGbºÞ6Ÿ•Ö;m:^:½~jZ[D}·kº¯ÄïFé,NShMl-1úX Õ±žê6S5ÕǺ[‘)¦M¿Üó›ªr¥T\â>zT[ÄŸac«õF)m£¿c󕨱ócÛh¨£]àÍ”KàGÛØtÖY¥·L+œ—§ ºÈ„‚.òhXÛÕ*(üéü¢Xdxu>ês’vk·à§¿†xVq:Ÿ°ò6#aa[qÓõݹD!ìé5qÆFuë=ï&UEôqâ=Ç GŸyÙ¬$8ƒJ½=Ü‹é‡×?¡liµ¤zhZÐ:‡nÊ8Ï}÷{–´zl ZB}_–º2ðKÏb×"ößÚf[ÿˆÔ󗤮ã™ÝP¤H¤(‘2™¯_¼ŠÝadZYÒÂfÛ³@†¾Å\G»Ìóèû¡!qà9±*góI×쫼ˆÓòŠÿkÎt'n‰Ȱ)gåÂ@‘Ð0ˆž&B¯•²áÜ¡Yê^.5¾Ôù8ö¾o[Rœï¤8Æèh|îð~Sµ€G=;þ² U¤qšù'rË´·¬ŒMæ.îæ“U—9ÎÚoTœ¥´B]nlòÕ¼ä(ˆ~;»¤‘ xl•eÜäQ|4¶©,¿År~ɲ¹År"QÆÚcùK€eˆ9ÚÍF•qÁQïû¡ê?`̳3|ý U(èŹyENYœåï–ÓK4H‘g9œ›,L_Ãs/¾º¼º½ùèÕ ¶´í.ÄŠKÙ|œ«KÉúkV™ XFÛ,bkè¼_*ò¼à_Ò$ ÊãxfšX>;#»\ìbˆ¡Î6ðGÅ ÷鸆‰OôÒŽÏG¤Ã“èýÉ™\5‚jÆoü+9õlòχ´159AfY–ïwŒæaF÷âÖÀ…'Úw>òXùRIΈ()DБעî¡?µ;îŸÁX’{‹Áãr¯/ÎÙ5¾Ç¦—óIÒþÖÙ]ct7YôëºÐô˜Ìà«n[£ +ÈOÇ &7€™ÎSÐVܤ›™‘ªÅ!»Œ wx/‘®—ëSW®{´ãi-Xf÷ýI(´ï¤%Ó’ ÄpŸ…x¥¯ïG:Ûˆ™%]ŠÏ`6Ûªm ãʺ@Œ(q6n#ØÜÕµ"æ ‹Ù±3TÂ1í&ßá„zSo ¨)¾´§Q°—bÞGî7ÒNn·„ÜŒB.¾,ú¸ç¹*è°q.ŽƒþhFÃzàxáÓ?GM\Åœ‘©7«œð]rpÁ„Ê ¢³ÛL(/)šå x˜3Õ€ ‰= à™ ü´ãQÔlEa‡ìah OI±$E­wzëßO5C+¼½ äF>rVüûçóAÛ¡yœ„OVaÉ©ôˆ]éò±ž=h6 ÚK¾Ãˆ™ûÑà"çú¾&Ë h•Ë|¿&Üqœ3p(¤@ʹáqx’¨Ø‰¶:N”o'ÿ9Ô]ýÄ·ѳ€¼_Ô$Hºûb0ÚJ°Å£»mb?oEàGçØI‹ç…säaP+èÝ¡ã< Î<4Ômµ%Cä Ϻ•B ¦‡žðgŽÑëh VQÏD_~“1ˆ”¼$è™òêMîØ³qJÂ×’;ôOiW3Y¾. ž?¡SÀA_åà§§°(4Ì#íÅ*t¢TÇÇ–B•-X‡íÙ oTRÄZ-ÞÁ¥€I8'6K¹ú +²å•3çP>'‰ ªf¼äC)NsÕíömÛõ·gáíÿ6Ìþ¿ÊãJ8j5Rª:)ñ,ì~np>è6@:Bè!” #¢N<4‹”—&ì [Õ™ ñ¶LÍì©qÖ¥Íâ&¬Ù`ŠÈ¢­'÷=ûŸm3Nì&¹ìAž³—”‡÷äfûQ¼©T1.œ*ix6»d^ÚˆGþÎ…Ê3”¨>„mrVÐÿwí¤¬è!1œ~nl+ë{tª(èLÜdŽá–‹äÐvì!I*:¿ˆ¥´\&œ¿ÍkdR¬Â½ì¢”TG¿æZ‹¶ ‡=u»ç¾ów゚§UH{Ö*vW\q:+#ªa ÃØ#×¾WÕT³kžP¢¢®þcâ!³ÒóèZ+Ï)ãLßµÏ<.Û;¶2ù´¶»Ú“Paä¡BˆÆßDX¾îî³t®EÔ;~à4€ËpTbgzE:»(‰Ðâ3Œ4ÚDu{^Y‰°ëïW‡ôúµ¢” į@o‰™L#ÔÙkmnH™<e-YôÏuÁ#‡h-5wl»žg:.Ø1cÀ«ûE>J–»J´ºø°@:Vb…½R…‹xB/¼øjˆ` y±ãlæÎW€ô\ÙWãéˆW©–›–ó WË5RËýW[5Ýÿ –›8 ø(ДEÈÅ; øú\cð=AÂQ*IF%¢$J¢©[x6Bì{FˆgpA¹Ä^ÍL' UG+*ßL†¡î=ÑFéK}ž*\:p»k¸›ß.Å.b<Àø%®«k† âµRköz©Õ ïu"?^jÍÞWjµ¯”Z³K–Í-–ßPj}ÈS¸›¡Ú¿±›—o~ã.Å–ï—ãË¥ØL½§ë}y»T.à‹¾,Å‚á.S¤ì&0.Ó³&?…ÏüD–ʨÆfgÿ€É’R^ÕvA_öŒ¼‰ñRÛ.G%C³xfê|ŽM¹Œ‹ ÎUIú¤Èx:×]øæ¬¾¡éÝÇÜg÷-A,ý½?«\Ÿh`$qÕîþq’*¡îN°ùüÙ’>%2¼¤?6ÓäbÐùØq”aö(ðC›,kZF-+&J.¨Î%CåpŒ9?­æOœ0ë@޲#†aP˜\ÜÆùjÈZLŒÓx\¸*¿$ s0¾/X#èrëe8^|Ë€c7YÊŸÁ­vKÿý§ÿÖÝAl endstream endobj 313 0 obj <> stream xÚÍËŽã¸ñž¯ðQÆ\Š/‰ä²ÀÙÜ‚ô-ƒZfOkV–z%y;ó÷©")жiÙ=é‹]´%²TU¬*Ös6¿mò …ÿòMÁຩ›Ÿ6?ý5×›<'ZÊÍÃ3ìïrJ´Ú<ìÿ•I‰ØîòœÉìa«yV=ÛjØîx!²}5Uø$³ÁÔý°ßþûáï€Mnð{ªY.‰›“DáËñ`:c9‚Q 1¹šIäE6l%ÍÌVæYúÿ¦HꜨÜãÚ›Gš‹ÎŒÛ+Ël4¿oY‘™¡jÝÂï[)³ª=šñ,è"{{1ƒÁ=™ªFà—3H÷ÚŒèuèè÷foönç­™^ÜÞ„;o[Vf½'|ë¡yFbùÞåL¡á—”½bæœÏ"µÏ/•_œ@zð ²ç¾m-å·¦ûŠK,¿w[¦@|õÔÔn鹟½ˆò2V‹R¤µ]§çÅb­X¶œ$ë€n ¢ ÜÌhÒ"¿‚‚ñM€Icá–Â’—hæ3¤Rî§°?œŠ7¸9|RFÈ»¤,4)cäIqª*‰:QÕ:‹¾)‘€åB®ºÄ"IQÄXÒ‚eOñ4IÉ2а"YªX 9§„–©£òHl¾Ò]Z¤às²—?¿S¤ìCDÊ>F¤ìÿ*Rö"Õ’(Kè)GV9&ÂÛ­Eç  "dÒèù5 Þ£!~M´‡Kùè*éÊÅOr‹„º›»MâB³:ç)ºà9¬á.µv¬ „c¨d³Ov±(Á¸µröË÷{¡˜œC,ù”"Rz? –¦Ác;®ÊŒ8a':ÿ–¤þö‚›Vw’{À-ˆ8¨0°s•ÃÕ¸y<``~‚ÀŒù†W¼•Ýþ§~pPã÷Â9ˆ¾õ“3¾ºÅnï‚/¬O½û Ó•½YhšõÏnÕ…m«žZóç´N9)òwÛ5¯+õ6RjÐm’þNNx{”:¥Û>R×E“üBµìªj]TË’ª…Õ¤jaݪÖî·ÇCçÑYͲY³°`5›<3g Lßîããžæ?I2 Ý}o2°FÎÅßsa ¢.8¸îàSZÍQìB­^¸." &;ÉÃLkÆ*óêÐ"û‚©»ÂÔ ÀTuÕ¹´€23îë ™4!·o­G^XO¼I½= ØOë1ïMݪÖmxk\²î8|ÌR‰)/KÌLDIB\ï‰Û~ÜÚ£+@õK7³bK ¤E”•ׂÈò$ û2C0á˜PéíMÛšÉ É|™æ„Íöü9¥E†4Üþ+à7î.Pp—É=·Í8¹'¸¤îá>N¦'³BÞ~fPtŽèg%Ó:;NZ¢ \8«ªëúÉÕb‹ñÀKLNfO·öS_öBÝ"¹ýðK(&c'™ºÊšp½z“â<¦ù–Ž}e”Ë¢»ŒÏæK‘bpE6.?µ¶TÍ,³¿:fC°Q'©#œÏÖG™HæKœäs¼iHÊE}÷ 8$A°5ðXBÈ4·%¡ù;(}KàФ(ß"åßÔROƒ¡X‰G «—¸g€ KÏà“7JI± ˆŒÒ÷,¸,g÷Sfˆt'÷p¸Wp IÞÙÝÙV“8Äõò,3îBŸ06‚¿q‹¢¬YåÒm)ÎÓ~­sð-™®ÄL‹”y‰-¨Ñ8é:FªYÇÑxΛÎÛߎ]=5½ÓìŽ)ŽEM¬ÛúáTùãÒ"«T„Ø;cÛÔ~Ï&ð‹]šóÏúÃkk&ÿë^¿tð•_köžJƒšGkÂýÊm¾VÃÔÔ¾©ïE0ÞÖf4È•oÐÑød€¡:tÃ;A!O† 1|ß–6CPd~yNéP—¨¤ÛI_ueÊÖŽfô<¸Ÿ®ÝyTæxä6"#ÀY¸F'‘k.jì šgór5ŽÍב ªì¯õŸðp"~.ѹ½á'?±¿õá~c+þŸ\ZÐ$Å'‹Dꘈëâ£Å©ø¸˜/$<„Dž—D’’ÓDų>»´!Qzä:®V3òçêØúŒ'’:DÙÌ¦Ý Ú™¯ÿÐÀ}ò‘WÂbIÚkÉåÜ•±FðÕ7Žáé<¦áZï¡na§jr¡Ú‹€ øÖ>(T™êzO26ãÂG®«+/êQ%/Ý¥ˆm[øP5o»9|ìI:ïøgÓYw£çÞ1dÇKƒ]‡><…†3À¾º:ÛÚHJ³˜ L¸pâ:5v¤=Æ¥oŽ˜‚ðâÑ SÇÈÌQ,uö÷ÇŸ&HÄ«‰/ ‘‡m¿{±8çp/ý±Ý'ò5¶Û7 ×¼yÕ:Ù}yHCxÁ°13OCd< ª5Ê¡p4 ‰·ï‘”k#¶$K“†XÚ8 ›…À Uy^ž<<%Æ',9>É…$åLè|ðÀç,ZŠû;ž“BÇ“‡G8 &CÑäB€1ë;šüŽ)¿Ëú‚/í¿"îr*×§|} ¹ékS®Ñ îœB¬I¤DžÌZÇ€ß3…¸ÍÕ–¹\“,UüZË\§ŽzÒ2çëS<ƒþ€)Déf !ÏzÕïéÚâ†H©rM¾?Ú⚊>x ¡ôÇÑ`wиP®ÎŵA„º=ˆ(mÆ "|OɆy<]W£OmBhXﱂäl­kD—JÞ™2™(ýj'øß]*êY‡ª@ãq|¹$ÈÔR]Χê_'›¸7W½Â¾Ú±±m­ïQ\–» LD}Qs›žBÓ žçݹäÃ$ß+`£ÿÚívé*¢ð>„ÎUÔPm÷yåë›ÕÙÂÃ6 å‹Vï; }žx¹C˜ÿÔÆŠfVF5ýƒ„¥áÀùIÁÊ—‡—æS$Ì0&ùb?Ú ƒ§å®\i5PDø¿tlƒ)@¼½4­93ÜÐùÀ¢ó‹×:oêǵcÈÜþÕÎ÷ëüÙ¸F!ƒu•<ù!H\Qj”óËEnø·;k—-ŸõØtû¦®&[/Þ ˆpSÛ:_ÛÖsFd~;†î ÓzÎga×Ù¹ÿæè{­ƒ 5u]}D6·]hT]hBUlåAU¦ó5ƒmŠðP%qž¨&™÷PùtuïY1Ã\’Íeʼn4ÀC$Û)á2~ÉgÐüé¿@ò% endstream endobj 316 0 obj <> stream xÚíZKoã6¾÷Wè(+¾É,öÐí¡·¢¾e÷À8Jc¬mem%ÛüûEÉ’lÊ¡mÅ›l°-‘óà<¾™‘¢¯Ž2øÃ‘$ðŸEÓEôÛ$úå¬#Œ‘æ<šÜÁýgH‹hr{sD‘HRŒ '‰¦±¹¹™-ÿIR*Y|kJc¿ñø®X-L™|žü Ôxd÷gÚÃi¥„#.+‚“û¶P?˜•Yäe¾r?kZ”Å7ó"I‰Œ§ ñ{ij¥[UÂnÇD÷˜h$n” ¹–K¤q½ãÞ¬[êÕ—»bBûoŽH°~^& Ti¦ålÚ¬Z-®jÚXuˆ§˜Ã¹Yµi£v¥m­i~gçP˜t¥j”x²âÇf‘ŹG¢‘Rõê+-DCmíÙ¯äû¶8 úþCs?‹$ÒÒÞåˆiP Z­À¾S°äš?ûX`Pó ~(ð¹WÂ}ÈØk<¬nÖO#±s4tHì•—Fжb_}ôñȬv)/b}bí)1¤IÅέÀ¦@"Ú¬ñk¥ þk­ØØŒmŒ±wÍÅaõþ¥Oˆ<@'ãócë á>l/ùÖM ¶×DtÛĪ—Ê,~íÕ©Š%È—U,ñ@o!ç‰%ò>c‰¼X"gŠ%ò>c‰œ+–¶UK –ÝŸCWÝ/Mµ‡áÚCpæ]˼tÕ«OæMtÈÑ»ç,-ÆgÃ¥BôEG÷Û‘2dxµ2¬“7G`a}8\nã«ÀzIâõíç—A¾kûèä/m†jåþài= µÁˆ)¢WÎ (IcmwøÅv_ù󷄨¸XÝú8IÕÖõýžªËŒQ$›Œ·0–ܳãpS5™¹ë9‹Å¬,ó[wÇÌ ×õQèÿÊ{·Â¸ O ¤3Ì]WX7вÓ(ÎJT‰‘bh¡ ɤpì¼naj-ÿ~^Ø=N‚bÞô“Kè‡}fQQÖÊY ¥ÓTôU¸†›îwZÀí^#ÜêG[ý4¸ëªGkõ~ÏB‹…©ù›UM½x(gÅÒÔKÌòÖÝ’œ6’£MîÞ0tÞ"x3<€onx ìð@VøV à³l–·#ˆ˜zDPÝXß;eë ¦¶õŧ¤–H°x¶v[óÍ´œ?»Åù×Çx‡íÚs7*p‹Ë¢Ç]윩¨)Îiܼ¤Å§þ4d}5sºg‰uî/¬˜µ?ç´Cîô?Å/Q:¶)UvÆ´?Áñ6víI•]¼Ÿ‹´g½›EÅ@e¶ÏÆzo‰æEHn÷n|J’”>`',Û”lÃp‚©LN°;íXkÖ!¡÷»0 .¥Ãìä³µ-Q°Nv›å~ƒû,1feË,ýÃaÌÂ6@„ˆÓS-k)Â´ë ®0J)c¶Cìän7)öHAIkü}ãRZ×îDw«&ÿ,ºï—)Ù‡C²l»ü¹>=[ž Âc}HÄèn÷Ú@Â^HP—üìÍOP¨‹SG›°-›ëÓSñYª‰ÑPJ¾XMðÑœàd”t>tÂ^ñÎLî@¬»þNPÇŽH+‡‰ÀOGº‘k":Ò‘cÒʑÓ€2¥ÁZ%‘b¯€µä‚µ¬=7Ö’ã±–žÞ^°öM`-¹`íkχµ$k·þ2³o#uð ÁÉeYv§÷½«jÜu4ÀÓ!€xT:.À+ÀSuøÿÀï•Áÿì Ò¸: üŸì"cÁÿwsò\„„¹鿳òþJƒrâÌÎPÐcªÍCø”ñmüÿ}â^,ï½±l÷C“*˜{æÏY³ô¯Ÿþ›‡É endstream endobj 319 0 obj <> stream xÚÍXKÛ6¾÷WèHkV"©Wo)Ðz(Pt{ÊæÀµèš‰,9z¬m ?¾CeS¶üX¤‡ ,’óžo>Q| â ‚q1øËMðësðóG°ˆ¦)žWp¼(Ì"x.?‘Ûm¸àQu©÷ð”fäCøùùwÐÉ&h–gN'Eauþîtý‘MI7¼DqºWÓI‚8¢ET8¡…"¥‚[½¿ŽÂ ždd)kó“×pÁr¢p1tªÄ§¾A¹Võ­Vo!KQ&%²,u¯›ZV(ù&‚Èj@ËpÞuµ¹Ô²Íít¿Æ§ –ªB¨ÞjùZ©îÉ$ÆÉ²©»¾•ºYFzØ5ù-\J1§IbS’µ±Î9i ‰$!_Ô²×jG­Î¨’Ó«0–·ðKS‘B‘͹+éLAYNYæ¤L|ºëMÂQDš•ù‰Äå Új—(î¾g3Î=£ENEîŒÒ§ (áñK.äºjªª19îBã̳¢€.B¥èÊÅQ7õ¢Uj±"Nð«T‡ùiÚ’£Œ| sKQ{¹ÙVÊô"ʈ^ÍÎ’‚Æcäså*ܙbÒ¿6òf]PØ(ñÛZê‚ú:„Å©H2Bäi.š8â4=î?é§/Ÿiõ:WÏÄ LKü±@6д¥ÙHN Æ¥ú6ŒÁØÁ0¿k{–Ó —“jQgª,>AÖ"DU¥ 5 j4—Lr›K PŸ›Ü¼ú`‚3ÙqAùä'œŒÝ2k\¾8˜Á‡Ö#pá:"€'3ûy{Ø­UëNuíÎö[@˜iU‡•þ:2˜–¸Y›­cqa+[¹Q½j©l˜æO)À‘[8uK™# ˆÓ¯X‡;Û@b-MÈoá)lÖiz _È¢ ¼Q²†Å/sÕæ3šä8 ób¾Xtc:';,Z÷ 0×]ÔöšK‡{NóÒ8zàï÷Ðõ²º;^œÍA;„«Ø5Õ`^X³È·¡Ê¿¨A)h¨Uy)OD_eø¸b!Ãi(ˆ¼ïpèâ|Ý'6ù#6±Ì£AìŠAqËàªUjœ¾Á΂1•ZSªÄ1—<0qÜr` ¼ÇÕÞÃ@<¼ÝöÕKXƒÏŒ·°ñ Ëá®÷r¸âûn'å°ÄÔ¼•»Ëyb(–˜†uŒ#£)»Ï8g×Gnµs{vù€Átd8a%þ.Vâ°Rñ¿°‚~uV®J×J¶ctíæA(}yyxpzo ?4Ç™Á•G˜Ü#;OÒn7.Äó Ç»ØîšÑicÄM‹â¦Å‘ï„ã»Ì£Î‘ï8i]w¨îܸ½ˆéÞ°èÁÝ_&Ãù <¾‹òîcÔŸQÐÂŒ÷GÝ#Ðk¼~I 4ý‘ÕdN€3çÇïž«³*"Çû쌔¦ã'Ù•–2F‹xz%–ó%–ÑSHWjÏ™÷ (ë…9| ïÞÜÔÕÁç85Ží(Nøæ–’Žßx=þíÿŠ0M+78Y¤¯¦I2ŠþùÓ³å5ý endstream endobj 322 0 obj <> stream xÚ•XÛrÛ6}ïWèl,”L›N·™63½M”§º0E‰œò¢‚¤/ß],(QOÆã¶Øöì,½úo­Bø‰V‰€ßp•7«÷›ÕwÄJ„\k¹Úì`yá`µÙþÍÞÁZ†¬h·ÕôtÂÞÿl>žd%bž¤‰ß£`¹=?™¡@QÍL»¥=CÕÔÛm>T]Û{-j…< 3ÔÅ’§T).…Suˆ„=ÂN)Ø»vk‹{ìÇì7óoÙÙªõJ¢t®%T<p$TðCcº·ûväÝÿ¸`r)͵‚Vr¥Ü:´”ì—¢jm•ãJ:Â'hˆ”9þ-Ý‹‡Wétˆ’4•¼ÏË1w›Þ-èL?o†(pkïS¡Bžïy¬£HÄìÛÁTmÕîáL‰bùhmрр1ËM hKËÎó ®V<‹Á@Æ¥tú7A*Y¬E¢Yç,P( ì$“pÆ@+';¸Lã<íL£¡üÓvû£ë5U?ô~[éwMq±äL©‡9sß _»_ZèZšýhH»±4]A›Æ,Ê’Ðu»Æ¥¬³Ûª…¼Ûºk…ó}n«»À¬75Åñ†Òbü†}Þ\ßœÒêƒ KKŃiuñúLÝànS~xâ8ùWk©ú„¢6I^|žÒÓ‹âÂÀD°j3TŽÖð0/ût48È qªé0€/2Ĕޠéb¤>;S×Î’œ=\gÓm}BWHI…õNàå¼äü¥2ZÉŒ‡Â—Ñ—Ñ×+šïa¥àëiˆNœ…ÝäÄI0ÕöXn;ÖIJû+«ì˜ªl,T•_*.4ìšÊ0-(ÜÊ¡ß¼à’¦˜ÇÀW û3žNŸ(»Å*‡ËI=ûåõ2øü›*’󺫧[l€ÓÝ'ÔÌ¥ÑÌ¥xËÅÊo©c%\>Pvç{ìb,§¯A¨È†pÄeûÁœêúHÃ)Õra¿à (çâô‰'ÕsŽ\ÇYÄîËã—a¬CÖ_Ö[ê™ Ư?6¸¸Ïk {]Fù’Á©¥:å`çg(O\èŽÕ`nk?Úu^ÀØj(›bTÆ.g¤lê|Äü†OpHk%µJ­ž€Ø»âZjIä cZÇç¥óy¯O¥3ö‰¶@p>¯mÃ)ÿ%2†d‰žDåŠÿ7àƒrfÑiÔ7ö„õM@¯|ç˹'f"™˜Ú=fÀ5–ø°xÊ£ñëˆeâ—Kú^š°> stream xÚ¥X[Û¶~?¿Â`@b­Hñ"mqR ½'-Úì[Ý®Å] GW’“n~ý™á’¼ÖvÝdñ2ä ¿ùf8ôê[%ð­4‡¿dµ¯WßÞ­n¾“+–Äy’¯îVLƹXmq@­îŠß¢»ƒÝlÓ$:ÛŸªÚí~E´o› ×Ñç Ï"Ûõ%taœƒìpê[Ô=Êö Ö×€(8Ÿ§ì"’‚»ŒÝI‘ÌÂÅÒÑĈ .a4†¨à—q‡Šf|BÇ \Pz•Ï™‰K(*žðÕíßCåãU¨$yTSav\?#XXâ`Ï t–aM&X@*¡ƒ¾2'²èt Œ{X Uz•ðž!XPù9,òÁòé*X˜†W0\¬¶$š ÑsH² ‰$š É<$:R A’ë9$z„$ó覤#$úÿ„Äçȧ«’Æ¢SŠ»Ø ‡õUë‚W;dðJ«½æe«i~ÊVÚÝ.ê9”š2vÈ¡°Ë<Ð͉L†¦Ì£rØr·‹žn—í%BSÒ!AÉJ *ë À­<úÑ_Ø ‹,¸¾ÂÏ5JÒå®ÂåŠK½áÐLüTK¢*£¾éü¼«· x ~¢¶×“«kL·Iy^ôIaÄ)Àº÷PVÏ=g?3Aݧòó×Lžwß|¡˜ÙàÖ±œVŠQ/ð©sþÖ(!E¾ÿsoøÔí}ÓùýÑì¥awG‰,”îXÍr¦Ù…ÇøÈ„îÞøuãyi|ªdÚn!´áwgÂÂû¯?'êÂKJœ•ÿá׳ßú¸cÅV zQIDù×ÿÐûå endstream endobj 332 0 obj <> stream xÚ½Y[o+·~ï¯YM.÷ê =I$-ššª´–’g/êîê8Î¯ï ‡Ü›Ö¶Œ¢…,ï3œË73ôêß+±âð'V±?¾Ú—«OÛÕÝC¸œ¥<]m+²4Xmp Zm³z?ÖE^[—šZ™êL+öT•ÝÕ vyiG÷uyZoüÄ«+]­ýØëv^»[ãdè©Æ®*ó¶Í«#mÎ+ìž,CÝ”ªë©ÜB+qºÑ0¥M?¸Ü–W§s·þ×ö'¸½ˆdah.Òv ЃAÑŽÀ¼Ã¹Úwy]™Mw"É"MXÀìnß\‘ÖErvÙ¹Õ-,‘BÞLÔ¹è¨óež*δÎi5nÀ2#\×ÕôåüÞü¨ŒšïOÊHö¬š"'níµƒ”ùãk‹4æ(.‰,‘B+oû!”œñˆ£=Øõ½ú0[ü‚´µjh:oiº§¸•òŠcG‹ËšÌåi|îô®‰ôniVw{f®ì°PšoÉø›ºBË÷u ÒŒC»Ìð¦ž:Š|¯ K5…_UÔØ«BW™NÃÉ-5É^¹³Wî5ª:Úæ gìÕv¥¹{dõŒÄ{=KÁ‚‰¢9çÂꩦ¯/ïÃ~Ô3G‚8¿Ó{]¢@Áæ@ MKaM"à† X9Ó»ô~hô±nreOr÷$=|¿%4b%&ƒåÇJR¤†ÅOL®7B€ý~ ÜH!pÐÄÁXtèï„)تé»Ç]OªQûÎ0[ȯtg ÃO™Þ6Œ€…Î鑾çï<»2»½@ÉÛ…K'IùvþvaÊ„3ÀÃòvéPÀóòz)ã±ß“ã|Y†€4ÑÚxhÕÆã±PyÔв¨£÷ùŽ‹@g4úˆG½P;§³"4mGÕÏ¥…ö…‹ù±d"šI&|M0)|ïù)ßãqOdÜ”,M'àýTŸ‹ 60v \câ }!JÝÀ90 =ýû `µ%ßâòØXP¿ Ýj0$Üb ɬ‚ˆõ2r’º sCİÐ`ØnÍŠUáÔT HšH!nŒæ»¦. 6Þ”ïØ Эw¹ÁhåÌþÇzA€15±±"²µ0GÑ÷Z ŒftöXÓ»µE^RHÏ®·ªA¾zÕ`GYþ.‰³ƒ‚˜C´ñûq:2`?áÖ€±uRm‹"1£õ’ 1îÏÜy ç–8ozR-‘5"Á³[å(–ZUd$Ð1ë>Ø„Ý×èîÜTŽ1§Öɉo!ÐÆçœ%rlÇò•ø$ã±[muøËùÔØh¦Äïçl£9.¤~Û€Ú‘&­Å°7.표Eñ°ÇšÈIõG(G>‹G§„Ñû„d¢dØBîÞ_ëN;R‹¸ ÄÄQËÁ{VS¨l—Ð.`ëªz íÀžÓ¨jHööÝÄÇýE÷£7Þ!}HF'hq<àˆØöD)js"a'`펣zȬ˜Fiõ™s0ÉYìzjqšVÅ3š±2¶lò²tž¹¶vkM;Fù Œšä¾“¼±ù Ÿ§¬¯äv˜ÖƒUž };ËRJº|¦ ¡,Å øµ÷Ódeq!mû÷Ñ@¨ø9A€(×›Ð=̘Í÷¥|D³Ýû?ÓwHÈWwžÁKœúêæa{³ýí«Ýú›Ë»fy{*Ô‹=û›ûÙX¶!”j)N½îy¯g‚8@ ©ñÖÏ”_™Õ9¡y}îÞ—„fôK€‰C{Û¯¢’ð7<Ø‚–!Ñ Âß¾¾Šù!ÔOŠ,L²Ü), MRÍ*ùÛ8¾UøPmº8‰í>¼CØŽˆRKó¥Mog‡"•Ì®Š'±²³6o1“B2˜TãwÈâ![ˆ‚94v›ª,»u5"º?ŒY2®MlZŠÒû^ 2—‹‰Ê5$r[&óÊÖcÏy÷4Ršôì¶fïrB3Ú'Íú‰IÇI27KÕôP—™7äw|%bu0ms ™CÕóVè6ÙB0þe­8øJ<ò#¦è}1Y F¯ŒœWN¡sëò¶¼š•¼C"çòÏû%©qâÙ'©©¥D@°$±rë/¥ý%øËœNüÍDšNÄݵþœ)¼­ai[ÌPˆÚHŽ7¹–§Ã¹(.iöpöšÿ…ä²fOáæÓÇ%0¡v¼ÓÞ¾½ŠZ …Žuʳ‰¸©­êSW¦æ5'Â×|ã‰{%‚›Ç+¶nšÖGã”0ùÏh]ãv›÷‚%ŠØ“¿äÙ{‘àü]ÑXEd×*bbxo¿FI“ìp%÷/Mz{lõ‰®3}TÙõ/<°jþ<#&­××w×ß©ëQÇ"Ù%Ü,6ß¼ÒX\.ïn²»›—¥À²Ä6öJõ31å^ÿO4RäŸ ‚ت£ÒÒÅB9 8K¶!–=Ã{Ö±g‹É'•e4\܃X¨ê3 6 ¥û÷U‹ïè¦^–ŽH#*˜é<üuûÍM¹YÄt;xÛñîñÉ}x4ÆÞP<Äów@Ï4Ã= ˜ŒG\¸ Þ‚Ë!~Å!éÎl}ÕÔ‰ÝyÑq ÷Qì@½rCÆ_ÃØKSSd†"KÑcpBØ =@ƒ pCÜaÔäoØè hj³$¨ö¤{¶XôùÑFXíõ©sÜ8ÂùaÆ¥Ð@úÙ 0 T†F ÑÃ(i’)‹“±@è¡a‰í‘Þo~}…ëp–ÝÙT©¨«c;È‘iŸ0z×g;]ÛÄ´Ò¿[/u¦uñŽ¥T“|¬í´Ê¦ØáLpëMØ—‰Ä-ýûŸþøì• endstream endobj 335 0 obj <> stream xÚíYÝoÛ6ß_á—2k¢Hê£}Ú°vM Ýâµ–=(–«±¥T’›fýîx'™²åXkZ´CƒR$¼ïãôäÃDL<ø'&¡Þd±žü<ŸüøBDá¹±OæW¡ÝXMf±«¢É<ýËyòëôïù+ Ò‘nÁVH0_fÓ™ •s?õC'K*ìIgQVUVßNg~ä”Eš×DՔܶËNÏ_ÓÇYŸÝÐú{›5þ ›NV¹Ó™B`˜×´b™Ô;›ÕÉš¿®Êj4ô)}|œjè­6™Ñɛ̄tµ6jÀV¤gßÒ­¢Oþ°„®ÒLpL„r²O‹ì9 ‚`4¿¢–D…)Ò[ôô–Þ‘Ñf*"»pê,’Ñ÷À­ŒoÈx1%6—Æ1Ùª,®k¬Üð¶Ê>æå†§K£È>±n­¿O Ë™/C ˤ¬¼”vhHß1î“ÊÙÔYJóyQ7Y’ºCêÍ(Øf"vµ$%—£Böåp€¯a÷àÞÖ2O.˜.`‚a鄸*†6êÄ{9V¼e¹©:ñŒIê¦Ù"_'+ê dÂIk@J+Ü€_ÍÚM•³X•ÆË \zC¶¿pª¤¸fþžG„Æõ¸Z^LöÁVÉÓo§¤ðÿ“’¢¯¤ðÇ+ù~¬’i‚ìï‰}yÅÛY;ü[3È3¨ÙT–J ü&h´ÕIÁ1¥¶Ùs3F)%Böœ‘Gêv"ãˆìˆ žS2j=g6 ¦ O\¸ë9[å7ÆVƒu.ŠÜP¶ÙúòH¶žÐ†—›†Xß&iŠåïòfI£—«¤ {̤ç¹"¶ëW•€ÙþPË úú'«Ê£¦öIÈÕ·3u—$7õéwmjŽêõØT]—&ÉP,LÖ#E)8–+0g£¥Î©44Ù{§øëx| ¹="öóܸs`3)ÝP1ÕOCÚþ”‚ Êê&Ó-£7g#0™†Z»<Ê T³ÎZr…†ëü£I <í;M¾æ @ŒÚ FŸžrÎò´È¯—há†h šÁ½ª,i  AŒY§•vÃp¬ö„Zaç¢dÍÙjW£°«ŒÙéap£,vE{ó(Ï·%%Y?Úó·ëãUIê°ïy>1u{6ÃÀÏËí]Áx^n=ö=¯lÏˇ<Óþ+8þ¨™Ž:žSþ÷ÏÀ{F(1»Å+/ÆAJ´ _ï˜ZLx:XcýÈ ÔƒJïëóÑ׎lQég^"(Ô-ØS# õVäùX‘9îá«E¯=Hûu=¦ã­DÆcOmñvÜAuß›/á­Kúð;>¼˜òuç "Ç–„/êÝHŒ=£ÿ£¸F–j~ǤÆÆ$HÞ´ë›ªÊ ®‡8°½æàFh#M¨él„{ Ú©:a©ÑHØ×ÒXÉb§n’ª161 ÈÜ{Ñ!ßy°©'TUcÑöbç|cÙ×#¼ãLÛÔ‘ Š€HC ФqgF¹v~!&5ís[e‹ŒO¡ƒÌX´ŽŸI:¦ÞÓ®ÿ¤’T§Pxê<ͪ,í£;£ö¹…&í öÁÜc¯5oG]kTLo\J™ ˆöÝôæòƒ-5ÛËŠ/êb;ƱE½±ÕæIcÆ¢f멚¤1±Ä3ƒd§$Æ£9×üÈÐ`>ßrpÈ ¯H:  ø»iä·F""©I(XœP×Êè!¶À–² >ºH1ü¬”©—¹¹Ø±æUÔZ+œ5°û¾¬ò†dÛÓ‘ žvò¦¦t¿)1º{ÒÓ(n€â>k'r^ضهMÎè«DäðBŠHÝ–VÝ‹B…lJJ’\ó´ó*!ç'Õ=)4¬öаr»”.bê²ÿ¼ –ˆcÛÈ1T0¼hâ°Å”f¶Úcïª*×DH&…í㨽­É}ŸKkÛ~Š£6á œ6qs¡ãa‘óz+Èž’«Ä”Ø6\8Ú§qóŠ ¨Ó‚G®¨e@ØÏ¾:°Ë ô2 +kz҆ќ™+ÆŠ5QXA=2£Å N›ì®ÏÁ¶ðÓb Dù‰@K*'ëã“ t¨BÓ oº•È‘¢ BäÌ197Y3¥-ÏPt¥Íщ°Ÿl¨ÀˆK5°’,¢º»¡IÝ+¸žíkitÁsžšÐg] }bWùo¾ó¤ÙT„$0´ýÚÄäycï«:¤×<&~¬­´$êòª}³á£ÅŠ©,¯Ž;Xî¾O°æõÁZе˜kÞX°öî°f~·ó-DÊ>ùÕ+là >,jßk¡  8@*m°¦ßk° Ö ;¼Ã®hyqH©½ß¿¬©°&‡ÀÚpBŽkZ÷£ÀZh—zì¡›Jó¢Òc4Œ-2*ð,F*Ô„×ÚùÐÂk@<ø ‰[¼K0l°5x &ãØ„î~;ÅÁœÙ4K^Õ‰ºgòµ ?'ݬø¶,ZK=ŸÓ¯Ý½g?Â…³€ìÖqKúÛÿó­E endstream endobj 338 0 obj <> stream xÚ…TM¯œ Ý÷W°y ¦•ò%âÛµéGòvMÜ4.¨23&*SÔÅüû‚›ñÅ´{9œ{ÎeÐoÄ ?†JEÍ€>Öèý¦£¤¢ªÏˆ¤’(Õíüô=ûY¿„´â!K0¢uÀŠ õÕf¹ß3^bk|\ql¦ø•Ø@°µM7˜cÆ^†Œkü+Ëã)ÿ"ËԘ΀+ñWo/Îwf„ýÆôvl'‰×Ž~Ìr¦I!€ÿÓøؾ›­@¥ B¥ì#´Šˆ2…›¨ÁÕxÓ4`˜kIJÜØ'\¨ÑÃô„o»Ñøû)ƒ²wPˆÚ¯´9;?˜6§ÙÿÏø”0uí¿'åÜ­³mBpŸ7÷¼–~"‡[w€P}Ôtµœ« Ÿ(“~šaaüeìÀ•EmfAÆÜ 6–ç73M‘̺ïÒwÃ=/c3wn> stream xÚ¥WÛnÜ6}ïWy©ȲuO‚"‰›¤—$NêE_’¥%z¥f%m)É ßÎH«uå8E`Ã’ÃÃá\ÎÐÎߎïxðã;‰„_ÏÉkçùÆùá¥t¤'â8p6°¼ÎpàlŠî³ý~µ®X‘ð¹ZMmo ²bÖÚÊMunÉeDa–ÚYf»ºƒ>6«4p‘”ÂÔ%B$†j;“‚5ÕØ¥8Gq‰m\d.FÃ…FÕ¬‚—?™mïz¸sÍ‘ ð®l‡]A2_€u÷4Ê+ô….hVuK­*È ÀÇ~ù °:ÒØ:ZYîµ! ÃPuÐ)tmC, ®7Ûá`;ÎŒ¶[y2÷âæVôÉ7–ý/Š>cfÁ gÖ­ÈçmƒÞîAÍv¥#²·~ІÂÈ}i£Êœ®¯U½ßéc?öÔ7>R¼»ï¬÷F2âZBé—·ô%’ˆ«"ï.<¢ ! Ÿ©e¬YúÖÓ5G×€ÿ˜‰¯Éµš=𦬠 œWЩÍÍ*•ET([îËP —¶;^©z«¸ïå?ÍQë[R:}+hGöü¹”t!4{(¡Ð%K9'Eæ³Ê÷‚sMsœâK‹À6UÐÓÃCvÚ=‰ô`­Ce[›Ó*‰sÎD[OÓ¾¤G•W|€-/Lc`@ŠÅKSŒ·ýýÅÉÛÓûK Ï:¼»èòÄV<«4›ã‰ÍqŒRìq bßÍOZÁø™‚íüPc¼™ÍÄrÌÆt¦«Y4¼> ‡„‚Áig+VLá€XóÆÿüŸÅ£‰Š®.ì…½[¤b8½([i4Õ4<ó~P»C…è‘^÷Çœ.Ç—üš“-Éoc”ÌózÆ(»ªëïf\3JAµÂ“5}?Øk}z¸H8KÏ y._ÇüÞŠýQõýwÿgœs endstream endobj 345 0 obj <> stream xÚ¥WKoÜ6¾÷W>i‰!)êÕ[êØEŠ6FâE‹¢î«¥½BôØHÚØÎ¯ïCJÜx¤ ¬¥á¼ç›*ø°€Â?äþÓ jƒ_ÖÁ‹KVŒ‘2Mƒõ-œÇŒ’2 ÖÛÂóë?Wq’§ám?´rZý»þ-¸X[-ï~µÃÕCƒœ”¹Ö’3Â’ ÎHÆ"¶ˆj)+Ú-µKI)‚8ÉHš‘õNí$±NÀÃMXõm+ãQíå 'µÕd~\¥i(›ƒoVšÂ·æ´QXâŸ}#ëO&õ0YÅ”‰ÆZóe·JŸthTŒŽ¥iúÏÂû‘˜¸tÎ ’ •¬b!Dx!«ÏÃÊ ªê«Ç¹Jb^„• % {ëšuÖjÙëNEα¦nëYl£ =Å©™íá ä{ãS^® 02àzí¾Q?»Ò` ¯&‰ IÄyBRÊh³ÙDUUÝÜtsè ÑÐ󇇇èññ1úôé“;?.rl5êla•ïwjP–óØ6ÓZ©a:­ ÈÑ*ÙXü q#,ÎË4ô žTºf;Èh5©á”M¦ÑǬÊß/¿bó&<¥Cîܦôå œ“YÅ sZ‘ú‰áFs4r´°<ÂR‡ç¨},·Ò†+»Gäa×[;Cý¸˜Úu‘íoñØò¥Ke€hÊæ+ekÙæ¤í;—ŒtšÉÀšzp Æü8# ]‚KØ’ ›É G"/ü‘tjÔáç0–X8õ(kÇLXªÙZSˆG掩Ú³W]¬¾éÒC«¡·1挫\`¹pðŹÈm¹Ë0<Ìqò¹Ü+=> stream xÚÕ\ÉŽ¹½û+òh_Ø ƒ 00 d àÃ`fn´´ ðd dÀþ{¿ÇÌêÊnfké•4 Î̪Êd_,ŒÌ¾ÄEléø¿-Rò"}I¥-).ZÓ’dɵ,)-Öâ’t)-/)/µá+¶´Ž¯”¥w|¥."ßÁmRÔ%õE4Ú¢¸sŽ}QŽè¢ 0RÕE*n¯€l¸• ñeÅ­"N´<ã@)ãr©Å—pªK`mÉ” à‚gÈ×*Î "TœˆÐpHÔ¹A„Žsˆ¤½-¸%n«‹%@Gœgüí²EÀ¸ ¿ïçÐ縅Î; ¥,")ÆQ0SsQ 1XŠT0Li®¶ !L)€æß hÃu@ @J‡¸I‹)¾T‘ñ”``HVÎ3Di87ˆ9ñ‘qþk…(½C3!¦¥vˆëµ•,iióÞD€>1%¥BiÐgiPJ3ˆ€Iç­#&µUˆ€IÔՄÉi¸µBNXJÍ<¡ ƒƒÔá1¥µB¸Nãx7ˆ€›C´ñcLu|Hi´0Á¤6ŰÒ¶\yE!Fã• 9¯ÀÆjçܦu^©!òJƒ ‘WpóË‚ùA ¨„êéPäH¼¢„&(¨*¯Àè[æÚoæ•J጗†tÆkâA-°iÊÅo©Á4BÂÊkCÄÆkF¯ñ· ö!Ê;wŽy lK`§*ru4Š…QÈÀ¦1ŠñÓñŸ®*Eçóƒ£Dyø=Xäá÷¸tS¢l°4ÈÃu“”‰^ù £Ì•ŸVÞ¿òÓÆßqî±Xp¯Fi#ÿ‡ˆŽi¥BT9V؈h¦,Ôÿ‡`|Ä¥rµk•kžsƒÄ˜×4Gš`4NŒ*N‘ó`X‰)ò¥óg©‘@„¿èBâŒÄÄ£ÂY‚9%êÈ쑈c™ëŸR˜ÁXõa…h +±q?ÚÁdpÄ9ŒÆO;ÙsÆ|%ÌAs­"Gˆ€£ÂyGüEU²g½‘—À5Rzá5Îu,¼ŒŠ`©ÈùÇ’à2’šI’Fö3Îm¡RÓ‰š­˜‰š® +mX^í°ûDM7.ƒDl¼k´C ê·e²q%Ÿ–D6Ä[ÅX5Ýï<4ÛÉ™Ôj…× µÛKCw vŸu§œ—>4KW@ývÚPêüE¡C ¦ûpÔto8WèÚ†µ“þ¡m’~¤GQp›bm¦˜ Ù˜ÚæÈ+KW¬2XÆ¡øŒ×páÂUh0 õ­•ðÚ9ý>…ÞÒêb8R!É)½Éêf¨'L%îÇÑs:p *¤Êôqd“o¾¹zúöÍ;þ¡Ã9þ|õ ¼€2×pž<¹úé÷·/¹~÷ìê§ž^ýzýßwW?þëù߯¿_ÿ|·þùñ·'Oþ´»3—àz#L¤>äN¿þïß×Wß¾yóöÝÕ/ÿyñŽgûÇ›^}÷ö÷W׿?‹¸güíêûg²|‹Ÿürõ×·¿¾½úáÏñ/@ûùúå»gX?>ÀŠ…¨t8p>5hÅGv89¦ØLBÆÂ8Ö‚IrÀI3ŽÖÐa'çêwÀÑ'å mÃQŒM²Nžô“{X—+N,¡›9àØ'õ±Ðs+AP'w 9œ2ãÀÆíŽ8µ‡fÕ§Î8ÖCªmÅ)[l8mÆÉH´ÇR¨ÖpúŒ£)€ÃVÅØ<–éóFZ(«Uçd¡xÁ‹J ™ÑuÏqÉ€‰à)p^N£Ñ}d¢†bdðjÆ)5ĺN›VŒ-zÁõŒc@<+N‰ÁÌçõŒëu%Í[ô ‰3P*™Óãeó08‘H@;u¥Œ.zÐŽ¤ ÁPÐß|HÙHg âÙ.uŒÎ…à$Ï@`lËŒ\Nf„(8”m@ˆJªK 2{ „ìA¶ˆayŸˆgvAÈ&‚µ H16—Gf„1ÜJs ¬‹ Ð섽#ˆ[yq9‚8>•Ù !=A·’ DqD'/f ZÆ­L‡, aœ ÓÍ®iehºÕš‹k•Ù![Ìëatâ4;#Ѫ®L'Ñjq¡ÔÙIÒÀªÃRŒN<˜.ÍÞHbGð³2HAôÓïdoõ”2__N Ý%Ó¸4;¸ Ùc^ɦBöèBŸivp¥[`µaÅ„xÄ%‘›\iz^ɦ´†€ÄƒlÒìàJiAûT1ºäA6ivpÅrhyeµR‰Ù¤ÙÅ•Œ˜º¯dS2F—\€fWÐ×¼’MAf\«Ù¤ÙÅATÝW²) £Kd“fW"R†¼’M‰Hª ÙÌ.Îľó¡äV¥ÙÅYEÒWV3$DV]€fg%® ̆\ÖêìÝ,#a°­\…l(7𛽛!ßîq«W1R𛽛!QÛ€is)XÍÞÍ¢ÃÓ!uš]¼’„¼•’04>ÕtPKj¡Æ•æ2Ó!õ 9]QF:Â=¡µh…”¡yМ惪•„7 ¦CêAszPîC>m+Ã!!ŠÍ¨L¥ž,`Ÿ¾Õ­Ë1ì£?÷ÉÀÛ.Ù°¶ƒ’R [a¤cdêA?:»!…•õçIwoô£ÏJJ=äç´€\]xNg7¤°²f[ iwóṃ¢˜[ãV$s«ºÐÏAÕiwÝxV¨Í…~Ê~`î´Ù6 YI]èçõAñ ô³ñ\ê¬ÆxåxPSjÛù¨±ãA?yöE©äÀV‘µxÅzŒ/䃺˜;Æ ÈXñà¹|P÷SëVŽË¹˜ÎAÙYw?¯"21›üƒ @È[ø“bá¡М ̬oá Bé.áO®%%ðÏFtêV—ð'·ƒJOC@·É¡4¢Ë³3P7›Ö’øÇ…èòAÙOÝV»B„R]ˆ.”ý@ݲ…?ê–›ðgÞ§?•z.YàÉ//Tàɯ.TàÉ×*ðä×*ðX¼PÇäBK*ð˜^¨Àcyr8Ö:xåTw)¡j³gcgÍÖÀÆ—LÁf¿ÆÆšzjàG¨.ÛYV*"àÌS=‚Ëv–Í~­5EÓMkMqiá±>k)£Ô¼õÖTÄØ.¼ðü°¹¦lMMlVÜn>Ø6_s÷ý¼ë¼Ý}°3Ä~ºÌ>f÷à;é\G½ÔÌø¼˜æÇØú%ig~jïk]?Ú ä,ŸâÎ’K'È,g6u§3+yóñ»x—MÍx>¡´>NKÅ qT“3V¡¦Õ·ÝôÄÞ˜P?Z8{ú‡}v¼x¶¡rÿ„å{‹|ï¡ê½Ëà“Veû>Ÿè©“ãñûC“wÑÅÕ&Ø=wN&(Æ€æ ¶šà Öj‚bHöo*—NXùêˆ2oOþÃUéÔ*©Œ=VîßçM66Kqn:•v Á¿É]°ƒéýàìÝ«‚ÝÂwq ÀŽz´=t‡¬÷1Œ´“÷Û<š$¹›ˆÈçìD>‹ã÷ ÙmØOˆyî˜àCv}¼Òe¥¸éb•ÏZÏæVdA>=þg0n½¥¬g°Ì]„»`s”ŸÓ\ÄsÍW û™ÈÇÃ|ªy#r>°P]6݈ül#òÛ`ˆ6ö3y0×Mßî÷+p ;)öö·èdjˆÎÆ3é«ýiÉl!ýLÄ l³¿Û`NÞÕ]t¢Ïå¿„`Éø‚€œƒŽ'üß0À– 5qÆÂüòyý ª´Pú]¨÷#÷,°¯6§ß=Z–Æö»Þì'c[ruÜÞƒ5î½íÀ:›­“'XÙY…ñJƒXÃxcêðäI,D—œ~Vî€ÕÆÛ%n°âž—ª_íë¸ì+Ç…Úu°C!\ÁîÐgþÎ}p!Úç ãMO||´.ìïÊ衹4äÉÎWò¹-¹’ñpy¹ƒõÅôæ4HïÏà«f‚ñ5/|µ7G]Z]w8ìžL;nôÕ»X°ÅÖo<ËŽÍ¡%|!MWF Æ×o…ñBŸÎ& [¡…ä¬m†;-§¬”ð·×;X§I?ŽD¬ŠGo\} üa.Àý*Ö}iÛõǰ€Âî‘ÈÚ¬ïtË ù†KAeTv@|â!®@±%3úl…’£Šæ%†Ïÿ=¸<ëóÎ#iȶª,Ê”€¯ÌE–%#%Ƚ»b%$ï >a%øn鷱޿׸¼/J”í99·8*"ÅÂGÿ;‹yÑF’á¢\ž—-»ÂGäã<Üóåþߦˆ ع ’ìúQÛì{¥í}ÞÞ{v'/Ñв£–{ªûì-ðÑõ9÷‚õѾÂgϹ÷¡%œ —ëÿ€}îFžGï5~\Ï•SW™S§ _ÔtSQ[›´GE­çâ „ (i;ƒÁwóÁ·Ëwï[\_h†XHÏ|ô'IoW…Àe¼y<ˆævÕî__4:wqñõG|çs ÚF+Å)ßsZÞC£{f<æ.-<ŒD>iÄÿ5A¬ endstream endobj 352 0 obj <> stream xÚ­koÛÈñ{…àjêÎ\s—»|$‡‰ln}öåì â ¥EÊ"Ž"u$Å(ÚßÞ™]Š”h; Ú×ìp^;¯É>ñàOBÿÞd¾š¼¿›œ^p>á’ù2˜Ü-àÜå‹až~vfLL]Î…t¾½w{>uýP9mòPd4MëüëÔ÷œ¬ž~¹û R¼ìň‰+ˉ+bæûÛݯù~‡ ¦™/ ™¬…“4Íf•5n™´ÖZ,iÒ&Hrß´U¥4Ï˽›,}XÐìÞãÒ^]Tõ*i™æ¥1eèžF¾SM]!”3G —¸ªÉp3 Ä81Œé=¢ ïcf ×yÛФLVæ"’8ÀÔ]€•¤ÍVY‰_néb³¬6EJÇ0DŽùT³¦Õ¶KKŸè}_x‚E|5`¤Ù#£QŽ0Êc&ìS½þnY©qQ}5š2NFÐ÷$¹´ Íñ—W°—¢¸QTø]ŠÒ¯ ^W W´ƒò¥@Áö¬µSšye¼ÿóŠ hÅ/HfÜž“ïtëÈkòªÅ°0xA‚1ãöé܃;†ž( ¦Ù"ÙíN0ïœ~ï9"Þý”"œ+<ÉB>ˆsÖ-ª¢¨„­qNÂܗމ¸M¾Z[—˜}KìBöÕ¦¯Ŧik`æþ¼Î’Ö`õw¢ƒÝ´s„Éx”~£é>¿3IKß¼Ð[+ˆSQß]+H[`Êÿã\iÿ‰#gŒ{ÿ¡ùͧ;šØøG‹EUá×ÉkòÁÇz¶t/PÝOá—{'ò~ ΋Ó/H÷è á?æ?qšþ—†÷'4~*sôÜ÷¨àä'w`ïNÐÑ_077ÙÑgsògÃä`uôexoö–tÀR“µ$°[ƒ7Í1Xé©|ûlD4"xyý’,\niøÙ¥ñ³•ÊÌŒ¿Ï®-sフ|:Í›u‘<rG²2};4•½üV„ºJp}“àÞœ½Ÿý?ò[é—ôB‹ 7ûY ô”“Ø7ÖÐ9¤ e6§·¡¯V´ûñŠ60ß}HšÌÀoš4)iÔÒ&ð̪’@ÑßሙéŸHßÉÌpOÉ2ÞÎêE2ÏèãGMS•]D“°AGWeï]ºÜÇÏØ™]]ZÿÊ¡bä·fR?uy“ÓKŒŸ!gê{1 ˆR±»Í=g0.5üYö£|ü€;®?^ƒ>w6ߨ˜JáaÄ6 *S]Šp¹CÂU‡CÎ7ܲҀ3#F.;#âjX×ôF«OÌ=HíìEå¬í?w¦ˆ¢~ªý˜|¿Á»‡1DnMÞ`_ "`¾£pÄ;ý`Æ»ò#òzå,òŠ•¢È†gàíÌùÃ&/ÈÏ㊊˜|¸úõï4³ÜO•BF1[‡'s·â7¦;ó¤¡3kB±Ž8Ú q Yéž%=H«Õ BÔ Ç¿€¨Â…!yÒMZ‘÷JÖ­ûH~UYÊiQäy•>Ì…›Â£94CŒÉ:ÙîBóuÕ¢Qž)„¥âú-â8 ›ši¦ðŒ$‹3-Ù% d ²ŠÆ¬4~ îZ¿¢<‹†[ûÄ= ½Nê§½ïTëÖæ=‡Îå_¯d„®KßwQ&#â%“öQ›üc¯ö míµNšÆÖýÈ]OŲ')£óf^çkSò»gJäC*¿Z¦ù×<Ý$­{žXQG ufˆ Sñfº¡‚+6:iž¨éñt›§n­ĘV;¾òYd«€Ó¬Ÿ¢ÀÔºc¥˜‡žs—¡Žu3 ‹º+Úë3˜ãmž0à ýÀ93cð½.’U%†*p¶ÚÌ`ì4…‹ÖÂ? ТDŒ¹¢ Ö´›Ôfë°ÍAè)kFJZqºDy?±Y­lW)‡,¾­ê'³Æ$G»º½ ¥0ÏzQ ‚3Áû¨^|ÿ!Ø8:Œ}®ºréYñ/ù¼®šj­£@9ÿc®0n›ñèãÅAÝÇKÂb²Ü _òzË´°`Ú‚t¿oš¢žÖ¬ Š|´?)eסÓåHÙïÖØºgeǦÎö:-ÍÓ É"»¬Š×½òì†!?@a–—™©#€Üž]]¿ûåܤ½¨JÈBÒ¢뽸ßNM;æ÷»I]›èÙf&¹x WÖ½™‰p»§?„ZÖï€b‘?²å+í¢c[CB&í©>g]S¶©6õܶou˜>pÖº´Œ}Í“=wý.]Á;Ðå£1J-ïtóÎèÌê·®V{×g¦XW&%ý—I™/õxc>Òã…1Ô¸3pÜ2óa‹7öL‹`L‹fºÅ[‹ï_-^ër¬˜÷rÛ -ÞX<×â…ìѪö ?³Eì탈ýLÊß9þãü9tý~q—êÿ1¯M¶(t{LE“ä¦!ݺ˜ÜN>š—''C„‘þ¨`R"Àúà €`v]Ûñ€)ð}Ç™'{- )À°ë:3a£*M¯A¢•‚ǽ-þèø©2ê£L“:%íCäð%JR(n_ÞÞœ^žÏh3öBåúo„çùÖ½ö¹q%‚ÝÉø³¼p¡o3Û—bÔµ©~^¶íúÍéév»e:»dUýxúKDµ1î«è° :ʹ¤¶JÐûñOÿ ËY endstream endobj 355 0 obj <> stream xÚ¥XmoÛ6þ¾_áo‘Zµ©Ë ‚ÁÌC·¶Ò hú±˜D˜,9’7¶ß¾;I½XA² 6@Š<Þï幓z½Qo¿QoÌà?ìm¶½aïý…× íÉpÒ ïz#Ïž¸½.ø½0új…¢?pÇâùý~+Ò>[%®0+‰ 9s­¸ šb×°À›øf8rE¤NDu—%I†ç…Ýÿþ º Fí9MAx4'ÎÇR#«Ôô›,MŦŒ³”Äe§÷´·ãE¡Õ(3Ú7—³ç4KâÛœçÏý€YïènwYNÔâ;ßîñA*üþbÔŒÕÐÿd¶¾:»Ov¿Ÿ^/fgûBä§Ÿ~¡‡,Nƒ†±Çfc`ƒçß‘* ·CÒ@‘6ä­_櫳_ž×Ÿ/OgÓpúqºžK ¢Û·ëÀ&c;`JrË@­Õ„ÍСŽÈ+O ]0n^¢3†ž•ÝÑH¶…‰qÌy.}«p„—Ò!°~‹¼ž‰W!¶ñ&K²Bcà:ž5çÜ~ RE3ðvq×’Ë5Y¬Í7©ÝÑúöD]Qf¥|+:¬1p³LÇö)ãŒoR]µHñ˜g-`%\–u˜¶"nJÉ8ÈÀ„-žª±nFi~t+ £V×Ý Ä ‰â4\+E»s©2q#)ŒqݦÍ(Ž€Šb`ÔT%vK¾¸Eñ…Iƒ/‘’ûaܺ¦ªN"u­l£)›pªØñs\)"žÐ ÈŠ‹,)HZæ`ŒA¾€WÒÖWS§*t¯}ñˆ‹bÿлߗL褺¶Éï õ&½¦„¾[#p[ý ½WÍCú¨ÓþPáÆö>é(ÊØðc«ö' 08^.ϧábyµ¦Ç¿h8£ëŽ©6=Á§“cC›/#ê»NÍ· |h~Ÿh]-?‘\x¼œ«Îò‚Æùo‹u¨´ËEÐwÚÅã|5Ÿ†ó#.t‚æ7–â‹RŽüÛ\A}Üó´ŒËç¯É·^ã´?,@Æß $wßÕ¤ŸøpâV endstream endobj 359 0 obj <> stream xÚÕXëoÛ6ÿ¾¿BØ€EfFêÕì7v»l©Ó&κa6Ùb¡²äŠrÓ`ØþöÝñH=mömHR|Ü‘w¿ûÝ1Ö{˵øq­Èƒ_ÇÚì¬ç+ëøE`¹KœÄZÝÂô?Bk•ýlÏŠFÔeÚä&^d‹âa2õ}ÏÎl}{SŠ »Ü^O¦¸‚>îë¼iDI‹RIímUÕÄ í{ùlòËê;k±"ínÿ æâz¥¹S×gA ä]ÌŸŸ©9g0>¿Z~µ-öï²õÉõÙ\uRÔ'¯ßÒÇ>•ò¾ª³Ñ½—¯Iïjöü|AݳÔ.~<»ZéÓÕBŠædLÆéåb¶Z<‘B;¨ckÉsÝ.W_´F Î³ËÓog—7¶7=ûæz¶¤Þü⺕|3=)<¢5Ïú ¸Z Íÿg«X+yHË&o~.~¬@åz LœÍO”ô!§.ó8ü¾k™—ÛÉ”;±Ûi#$}ÞçÍõ~Ó‚pr¡zpx”ò͈ª€E¾ž>B9¾-û=€9¶«ºÑJʪ¡NUb`ïlyµ¸œÄžÖÇmëƒ^“²¢Þõë9†Ílûöj¡×Íç ýÁmÑlØd‘ýUµ:!Úc^Ò7¸ø˜ÂµÅ?ŽºÌÿFØ©E}êW‹•Fl;ý5™ŸS“zúí·‹ËÅ0Zô~~òŸÎÑÅ–óÍEmWÌ–óñƒŒÅ§K:tŠ“¡û]ËåÌç¡áÍ06ÄyÊ Ì\¼ÿêáêÍ9pL`7«Ñ}ÇõHH¸K¸¢aŸÀ·ºDáFt0`{% É¿¦ì*ž€çM–(K±iT«­Õ#i=˜®S)$Óç‰l@B:ðÕæb§`Ú/—×Çç€fßµÙØu<ÎÂXÇøu™á19ØÀÁ¾Ùéð‡ lðÒ8§É; ò(\—Ø%Í<ÚHMgèywŸnpû»IÚéV|aÍ·>sL:NIÿTÙfıƒÉ¥Í½è´‰Ðï˜>„.5 ´®îL¥Inê|ߌrIì3ÏíûàU¾©+YÝ¢ùÝÐ~›—àp Æ{9J&nÈwH&~èõ¥à'IQµ.¸ú¬aGz°ÈP(Œ(4ôt =â\£Ex^¡ãô¼b ÕCor{¥* ²”A™/7•¹H›Öv­UåÃDXÿ5  IOñY&nóR'åW?ÁyŸ/g¯t’üÔD ËŠâÓ±PÑ";7ý-22ä^&ÈËG×Ðd4€‰!X‡#Æ"£ˆö8À4Ò·ù–Ý™,6…æA ç0'è_Ã8ƒ'@GŠ‚+²¯4H±—xmp&m®ÅÑAÚIð%&©S¦;A«ÑIívði¥Ò^f Ÿ¸­aqº5,n“T‹MŽ6ÂknÄHOÙáHÿhÌP`“DÊØ‰3wh&ã½´Þºó"‰¹lÈu¾OÚ=;¹ÉQÐΨ"ÜZËf\ëZó ¦ƒ-qSî<â(¬pôK9•¢Õv·¡ˆÖêüP@] “Y­¸ÿy´;šë’JUßmMNõxysŒ‹Ü =£ÇúµW®roÝ™Þ1ûT½•|'°«[jéRБ e0ì§ŠeœÐ–¶¤”¿a|­®K²¤Øå›ª¨J‰æÃÛ9m‹XŠª¨†–†GzS³,7µm2_È ø”'‹LEÎqÏcñÓP;Œˆô\Ì($òCZÆ„y‹ÚþÕ™é«÷Ñ" ø/4òm©˜<èÀÚaº-ª{—‘Ä&†L!4AwåÏ{ ^‹±uÀ Ÿš;Aļö»°®¬7šñ9¼•“(¦’šqŽ‹bæ&Ã*”ÖVÌ’P=L0CÁS6t=µÞ¹­ÐÌ];£K”E•fzDèÿ4U{€‰B÷4OKúÂÙózš0ÿpmå/ïšfÿìø2J5Pýg)“ÇjìøkGýäƒ!A™{ \êň‹iÈ)å…Yúæ“¿É[ö† endstream endobj 362 0 obj <> stream xÚíWÝoÛ6ß_á·È@­Y%+ †ÁM\ÌC·‰Ò ¨ûÀHJ"T–\‰j– Ûß¾;©/+M0`oCð(ïówGròeâLæðçL ~óI´›¼ 'ß¿u‚‰3·çÇ“ðvâxö1ŸÌðƒ? ãÖUR~MÊé§ðg`õ:œžgÃιbª€iÊ0Î\—Yeçi~‡nÉû ׊…7¢Ò³­'·¢ÎdËXÐJ# ¬Hd÷E%·Ó­½gèŒôÏœÀö\eÄ™ÿm[s±Ó·4jycà ^¯ÏžÑUWWi}¡Øw¿¾\ì^TÕF¾(ã—Š/JùŒü=ÄEJ ¨‹IÝ ªzìEÍ$ÿ0±n“X×ûÛ©­´¶£"×EyWï’åKý¥YÊ2"n‹ Ã|ëAkd°MËIU'%yÐbìFAL3]½?ך¥‰Rç[²"Cç]‰ÓŸw8Á°Š¾í„ LnT QïXÕ¾LDLtL°€†ûð ÆkŸ!¿wÜzMfÌ<æYë[⦸ƒ LT’¨Ü‹RDRÉ Û°$r=vã¨âo*ݵ=Où–V:®& »4*²"7é¦un¥yœFà}5ÀA’뛺½èò~Ì(¸Æˆœ¾Á¨É™“\\¢äÑ“K¬”Xƒü£­9üÇš;ÙC¤šiiØUíE”@¸¹»h I¾bPz`ÉZdÄ*K‘f·ñX‚÷¬öpW&;ƒ€JüDH–ÍÞZ–†À8„›ŠyB{ò{ÕÒFœ–I$³ÇiàZ#À‹ß cÖúbRfd Úf¬OCkàS¤ Dk L„Þ¸:_†š±Øí¨Ø™r«Ô –RyOß周§RdéàÐxN²DByTc]ÒumÎuó;26xŒ[GcÒ±=ÃlSðTm¶GB½Ô½È³b:Î]>y!›r ë‘?#v9>³¹÷bà£kæT+1EÛ‹N ^èÜ›:,U8Ý9³}ÖgÛˆ5MZrÓ^jYì„„’e¤ð.ÉU’OT@>ƹµ¹ ú÷(äŒû}øI¡‰úp·B®A@”q"Íi¥ÈµDRä Ú2²|©“J¦EN w¢üŒÍ™;ÔœqO*;ÒJzõnWæ‚+™D)I J ŽÝâ\Ðþí3ð’f·Êö…"ejË¢† Rý ´–ò!­’ÁƒÜ't›ÆÐuCµ$ƒ·sÁæDº®/®V—Ó€Y!a¢µW Vâ>‹êÖ^ ü¥ÊƒCP{L¸ÅTDQ•"Ѫ‡™n*]†698S ×´ò U$ !H¬íÜá¥ê†])ã@Ð9xs±@76x­(ä‡öµ¦ñÛ%ÐÒ^ÁüØT,˜ûÒx¬1U||c«Ék5Ñ:€ƒª0—±RÞ#Æ ^ +ùà МSmwoº" ªŸÉq{ß[tî{ trs¶‰Ý>ëÝó;FßzÀÜO^+#VáÈ ü†‹˜ÍÈq-›²tUû“†Œl08žoN—ázsqEÓ¿h€vFî.è:Üôè—GÖÑa¤ÌC燻lÿ9¾9wˆ"ñYp¯5Q/xŒ ¸Ü¼#íáòÍùJß/ßÒ¸úm}jˤ‚x2&ãôrµ WRhÑ[KK>ÓãEøª –—§?-/·ó¼íT¯¾¿^^u¶¹n$Ã;pÌÕRÂFÁæÐŒËóëÕUß$®UýhF£ãˆˆ×]Mœ®´òwãÞú¥¹LåãÇìS½89¥g&Ó ”ÜPSºRÏcúÇJ©³¸=­æ´ÆV' xQ ßBÕ·Ìí;ÿ‚ùÿ~9‚Iáð¼ <ÍÂ{ 볓$º¨d,@}3ŸJ©ïÖ÷ßýرÉ× endstream endobj 365 0 obj <> stream xÚRÛNã0}ç+üD‰dçZ*„ Ú¢ÒRꈄ´.5PmHBì¨TˆÇÉxµ‰¶O«D:g<—3zG²Õç ¨ßFOoè‚¢W>rlkl}FŽo=d¶¢›œ‰mñb˜žíaÉߪœI.ÀÜmå+°_Æ#½V…œ¨_IÑ€(½¶Ê¹ŽèKùVèj÷¨­ãbÑT•a’—µÔ"E)”E¾6¯Ò;#"˜ž@ÚºÑ1,%°ì61Hˆc#r1Mu\’ÎRmx˜Ë'Ë0?ÄWmPYwšŽK,2nÑòý®7þÁÔµùiçO)ŒlpS™žkÙ^.Ù:ç†é5/Ö¢?r€m8[\Ætº˜¯ÀüXd´rBKiôÚÝìWËÙ¨sÚG”&üì%¯~oÖ“lšt´¼žÜÞƒQ1!ve½9T@ +¦)è×\4¹¾J)¿î3€À1ÀFíÄà@»ï¦w:oš ò½Éõ±Ìâù Îù?Bjª‡"âyr¸Ýêi¿xÈ÷†r+÷ùã‰~ÀÉ`ú»LHÔ^à ¼¨KÂ?¡Ë£oAÑØ1 endstream endobj 369 0 obj <> stream xÚkoÛ6ðû~…>Ê@E“Ô»ßöh‹li‘®0`ÛFfl!”èJrÝüûÞñ(Y~dMŠy¼;ÞûŽ>"àð'‚\Â?ª&øå6X¾•ä,ËâàöŽ£7ÁíêŸðçívÅ<Ôíªþ «,[üwû;ÐäLX^äž&…Méh>Yó¥n׈……¯WÚôØ×ƭͶ·ÆsKÁYÉKä&RV&À±dyê8Þnô"’Y¾»¾ùƒV[U-d>,Ò4Tkí¸¼¹õÚýùÎ/º5é'x³Ò‰*xÁò<ˆ$L&޽8P#¡§9’Hd,Aš”IGR·•Ù­tO £|Ûή;ÕxD1gÁ% °Gò'UgéðÌËPë~Pí*Rƶþ®ë›åû«&_È,Ô[D‰ä`±ÚÉ–‰ÉT²2ˆDÌR²l¥Z ÝvjÜÈШ]ëÌ»Ñ+„ðð¾³ 9]qQÙ¦‘ˆÜÔ­ÛŽ (ú6†NëANðœ..Z`GÑ‚çû®ÝÒ¦ö²N ß}øËéÅç*½WÃæ”† ‹câX G IÕ®w3ÌÑú`Kc ¶E‡HUáà–eé]  IâΣlÔp„R‚œÛÝ@§ÿr‘®l‹„ƒªÛžN}2"ÄUÕÕÛ¡xD:»#ìV£SÜÕ–Žû-9¯ªïG¡ü–¸\ˆÇhT|2\5e8Ê$fy죀VtWàbŠg[ˆ Á$ ß:;v×_U³5úõ˜i”•ÅY䃡bž$Q*ÓI6·¹·–Áö‚ èÆDνùÉ6z¨ÌÔ¸LÂzÀoÖ~ßêJ÷½ê ŒEð®×à´ÈJ Š@½®È3ÞU¡;O›ð¶ªSƒ§§@€”N÷˜i¸ßÔ”f¸KªñÚÑá.iÏÕ(ä§\ý¾ùKåóÌïOÈ2ãì.ùų?øåƒ&¹1pUߟh2O <³ ×Êô–°Žó*+"y¯’÷Ú«Ó;Þ$(Ⱥµ^=Q ®FqûSIÔhø¦ãÊ ã]–æc–’zÝÁ>­\yÇù®3 §*v¦c|¤#†ÁKs/.J&Ä;_8ï_:‘OÅÅY¾^a ÈrTÇ€<)Žˆpâ~@é!ç=rÝC†bgD“H‚%Ù…Cg¬‰Ò_ vÐ&XÿŠ€wcª¹«ïÕÎ DMÔî,÷—Sc${{Ïw9u?éË´[让[e tæÀ€à©î#Õ}‡íÈËB´îÀç'̼@3T×iðs¨B©<æ>Õܸš’Œ^@ÂãšrÖsŸ]_’4f2Yˆ9>Îìîù¡ä»gvÒ=cÎ)/ák(Àìm]aà£9†‰½3ºÁxàÙ¼d#ïê ËÏO8ªàv­[Å5ž’qÆ„£ÈÆ;ÕöF ¶swåó¶_Nºg§] þŸÎŸ –¾›GÑÞl/Í¡ÝD8Ê×¹C ôßwtÊcV/r4J2Á/JuÞF®p$䨧]¦ÁŠšh®¢àåéèA‚R]BðHq˜1‘ÈÐ—ß æ“`>òOŠø:ŒLÈó×›ë7Óòú†®ƒ"Ý`Ä!¬ßÕƒº3^hW¾åKÝï”ñó{ÎYϯ j<öuÿD¯š?2nüq_¿ÇlpÓ$¬ÝióHk7YÂ×?*ìgòyáðçSk.N¦Vdnýmýø t¬GúYŠàvtÒu´Å÷OE³eâÜNÑNM8g'€MYƒÍ·™Š?>6Žæägf‹ŒsVÈ)]*°ÆÃ¥™3^n”//mÀi‘±ôRu¤[(ƒà¾Ï‹Ë"ØcÍÎàÙ›&Aˆ"‡·ì¸7Á§à£, Àúyá­’% "L”ÇoeúÝ@+ñ·ÀÙám™ 7ð}½\î÷{¶nwÌvëeoêô”{X1š›RÊÝe Õ¬Q?þô 4Gb¨ endstream endobj 372 0 obj <> stream xÚuSÉŽÔ0½ó>¦%b²ØY8"b9€”ÃÁ8Ó–»Iœæï©J93ê–\‹ëùÕ« ûÅr–Á/guÿŒõ{×±7$Ë3Þf-ëF–KÞ –b bÝð#ù4žÒB¶ÉÓ©¨¿¢Ó$Në¬*K‚§ôãl‚&SQÆaÁ:éÙôT´x»ãÝòç ŒÛaÎxù‰î…‹¦ <`\Ï1áÜe¹°ú58µ8Ò›Ô3\›¬KäE¸`ŒÞZ*ªäѸûÓÏî3ôÛ.¹”[Û½Ÿ&冷[ú}GBåÍR¥àeÅRQòLl%÷ö ŒO©,d’¦“ttFï9¸{ƯẆ—á+ÇA¤?o¸,7|ʉ X_@Q`!·WØ ¨jj¥Ñ3 8¢ cµÄ“DŒïú+ŠŒ—¸1øöÿy É¡,»aXã€ð¸ZµG‚þˆîèçI…Ès5Amd 2̲*z -¹ho'£œ²O‹YøvaܳJŠPŠ'xµ:lžH¬YÅýHTëmçû‰ý»é²áù.¿¢ÔK|T9B?ê5I¤2úÕ 7ŽBá‰}üúí Y³õ¬]‹`ýpʨøTövàƒ¡…­ äF— ¹Ü‘ÁˆÈ` ÐülÎÛNðÃFËÃÀ› ²ÍXµûÕï¯þ˜a endstream endobj 375 0 obj <> stream xÚTÉnÛ0½÷+„ä"#jµÚ“ݺAŒÄq]åTôÀHc‹©¶ˆt“4è¿—)ÕÊb… g4óÞãpHãÎÀ†-~Øñ·¤0f±qúÙ1kÄñÙŠ¤cÄé7sZ×#˵M(Sú VAhÎGßã…¨ ÇCá$Ô5¾p¢¶fþ@Š:™˜E%,6SÈ•ŸKZsZ•-νf2Kƒ·7³'ãæévX¹8$#…¢ŸžáÕPëÛÿT‘¾hÆøUÀÃâ(ãD ܰ„gÕŽ‘þ éZWÐü™´îÙÛ÷g"Y¬À›´T¡Ý¥~y÷XÚÛT endstream endobj 378 0 obj <> stream xÚ•UÍo›0¿ï¯àHªBŒÁ¤kû’šÃ¤©\¦¨Lâ0ÅN—uêÿ>ƒM  F‰d¿g?¿ß‡ãÙp ŽáCùF”_Bcúà Øs07ÂD®[U03Âxe¸ÄÙÄBÐ3“›Éc¸¬—]¡zyz¥×JB7[QȤ¹c–¦¸ä*(H©&æä$%¶lÏq«(£)ÑEWÓ¦%ômçPôvÞ_«ñ©›^¾©qq«ÆD®Q®èõÓ£šOÕàFÈŠç¼`¥¦1~B¼á£Y°äcztØV^Èž/¸TM’½ÓdLjð--2’kôÏ{œ *h#~sbð¼ÍiF_‰¶Dj±P{ù>»rÔrB›s¨Sc^0S­zc ”åïÞðËÍàÉmakÕöE‘þíq{kñ>CðÐ"øYûƒWtŒ[sR¾æèª³š§RumÖc‘âÆKú1ɤ }¬#þ ðhîÙz5ê—¦ðDcW»à3\îˆèÜ¡ç!ÆßôI©Jϼï>é ‘jõpn}£dÃFê—ÝúŸäõ›•;}ÝÒo˜ BVÝ”Öû Ÿg2r¨kgn[®#Ɖå ß3g͋Ȫö 5YŸC å[Ìt!èr$"‘x¦ @ß7EOÕ¶ïÊÕ* }¤ñ8®S¥[Ö´@ioõV½SðŽ¯æwD"£FÓ#!Å»îÞ–¨%£gBõ›ÈiD¾ ýc.ÐÀƒù˜âg ôd ðæ¦V"8lQÒµhú·†ä±J~Õµ>ÈZkæõfßi¶þúô\Rû^ endstream endobj 381 0 obj <> stream xÚ¥VßoÛ6~ß_¡G¹8‘Ô+è4Y6tHÒ´q q›q´J¢*ËuÒ‡þí;òHY²d/Ýœ$Ç»ïNÇûè|v¨ãÃubÿ¾³(œÓ™óÓo”:4 <ˆœÙ=ì{Ô' Ì—·î9aR¸¿‹RÔi#–Ç¡{qcUË»\¸ÈÊu“– 1ù8û̆Ž2ä'Ê* I8KçÚò©Èå„ÅîŽRê>ˆZà,[«‘¹ÍƒÀI-Ö›¼Á¹¼ïmR·©Ór§M&ËQ æŠÇ´¨r³(äħK‘ãàƒ`ê.7 ˆîª'cÝYËü‹’‹ÚÄF§à“§âZå(dÀ 8'ä€r†Z7-•OÎÝm5(q‘™ñìúâüO5 0Û º—u‘6æLÖ<à.¢‘¬tF² ðy¢çmój!›’ˆ¢÷Ïg¦@º¶ @â)áÂ|þbâ…P×X'jâg©pþb>ׯà‹ ÕÇ.³2+²¯X)!‰y7- ¹nNÐêK4áÆBœ>ÎÝ‘6M.~¼ÛoÉúÓ|‚[­2 ù@ùì![¤+ ºËÎßKôç"687“•ø”\ôð¤å·_3±’]DÏôÒÝáÛ‹…E#Ú-*åÆÃBrÕW7›»¿Å¢A‡39šäõ¦ªò§6Îù¤ŸñOówåö`B_ýŒ#ýáá£{ åXò÷qŽdùÒaš{X#ëRpçîÅIèÁ`~±y‚º;è»î ëñ*;Vˆ­ãcAÛ<ô;z‹Ž¤Úzeq¸WâØ?ΡsöÔƒA[$Ab(Œ { í±Hó>A³Þtºæ³9+ñ-g%†³Ë°%[W m]è•&¨.uWf…¥ãŽY•ˬzu/7¥ÑnÙ œ¶³•gâÚ}ƃœÅ§†Ž3U•§8.Íÿå*F[®’›¦Ú4#à‚LÙ(]1æLáÓC’†Å°c)æ'‰¥)[×í³ç½Ü®O°mFªŽÐIdJQ‹:Úgð}‹rmFC{W²ô¾ŠZ*ê‰K§C¥›&m6ÚJ¤ŠõzöæòõÅPí­îíÙam)ºÄÛb. ЉbÃOs÷òÍUVl ÓóàšPEMIB 6†B¸ 5ž)ÓBÙMc&¯•ϬyÒðàúÈ-T—Ö¾ÃjÔZªjǪﻗi½ÊÊKÌ3v!yú‡½ÃëüÐÐnÙú~‘‚À ôƒ.ŠÎu*•Bì“È–à©–Œpû€² Æh(#IÜ5ÆÐ²×­i;v»•ñAË#J¨-3K…”S2Ý“uËñF'ª5áÌW€ŽqÞ’–žîµ œ„#H,ùA@ºçô†œp æ)8Ösu1ŒÛP[íiODdß ññu ä°ÂpÙ¡Ü`0Ñu1ÑõÆ<€!êa@b{>KyV´E½¶×{ËÃcº»S­3«útž0 endstream endobj 384 0 obj <> stream xÚTÑNƒ0}÷+ú‰­í-·ŒG7烙KŒø`–=àÆ&ÙFqaNÿÞB™# Ó $”Ós9çÜ´%oDnnA|0'³ é‡äê€ôX  DxL¡ X$œOœ±f.E@g ×»MjÇi´‰]*8rç17ôѹžåÉ{’º”¡Œô>ÞZö‹Þ¥óŠõ”e çÎ}´]&i´v§á¡• Á«Ò-¯¢Ì«ÆGãû‡©ó¡ÂH†^ݰâ“Ç8Êóu|9Ž÷ôYoWÓ’ïs¦„åcÉï—°B˜ŽòÑB¡ÀýF\hŠ ^“Y´Ô--U×LÄ$¯ÔIøMM6ÕBÅ«¨Cl<êÈQËj!€þb\*ë@‚ùêÿô¾D)½Iâ¥înoWdðñ-xºÅÿO̓vj»DTÛÄÉΟ—YšrUßÈÃb³‚zaW½ÞåÙ./éÃОH 9cÓœ=†H¨òze½/Ô‡‹/½Ñš endstream endobj 387 0 obj <> stream xÚmRÁnÜ ½ç+8b©¦ÆØk;ŠªmªDQ¤RùVõÀb¼¦fa‹½Ú$_Ÿìh+[b`Þ›7óýGeðQTåðgHÐ}‹¾?RŠhAX±Amù”f¤¸ûƒŠ„Q<ë—³–Ý^¤ñ›yJþ¶Ï@.‘‡gçÒ’4Jó†0øí “”Õæ§y°nò(”älOº‹9­Æ$¯ð‚œmÍ7ãÊôVkë±geö~LÒ¼ÆÒµü' Ãça©0*Óé÷;ɻϱ°?´0ËõŒ›.â„ui,]f¡Œ”e˜ÅI€1¶tAçx?ÇÐö~- §¦%iCsâô*<߆ÒÞᚔѡç7ý‹;mæ½uޝÓúÂâÚª „çÞíl+&2H=)3*Ò«W.&´ Ý'P“ïQí… ßÜ8i>”¼&\W¤¡«ððï°Ý©ýÑšŽ€ŸW%#áBò·ÝíÔâÛ t®&k®*1²ùRr´åbvê ´ˆùˆjm|¼—šy^ûÛJ7EØU±B_o>^¹É¨ endstream endobj 349 0 obj <> stream xÚÍYïo¹ýÞ¿b¿öCWË3$C€»¤iƒKÁå ´5œl­sjm+åkÒ¿¾oHÚâ®–Ž£ëýˆwÞ ß¼’kc}Ó7†úFõŸ¦ÑŠñ‰žðéëtc¸oÈ9|šÆ‹On¼‚ûÆ{<ëú&<ïL£”–7J÷ ƒÐ(ÓÃÔk ¼‰¸ÊÆo¼ÂR±uíaîlßX¥åå󀨬îÝ# «BÄÏÖP£µ¢ÆZm´j,©F[I7š§º¦€Ê̬\2"ЭÇzz,Æ„Û; &ÔÄ­jnŒ) 9«$å„- B¦,¢Oi†5"daH(] Jâ/§ä™Hž¦h´½ $°Dcà…,¸¦½ÇR$T@˜``¥ª•xB²0Òk±Pb|P Û XxƉ%"¤ˆ“,S¡€j‰Ð ×1BXjðghqÁ@7âr@ð3GKX°äJ²’I‘•çâ¼6¤RˆŸµ°&æ²ZÑ— ,¬á?!‚%– ô!)ÔKòz D„вÔR/ˆÈzùPÌ«Èâ´?So%Áb%n,È5ˆ[Â:P¸‰‰óÄÄÉ”XD£0 e©É"X -Ñ!,‹…$ ak`¥#«°2ª•±Â¬Œ˜,ÀйAÜbjeµ""dàE‡@&˜¨!<$AaÄ/[mÃ{|ŽI´ KQ$ƒê’Á3ΊˆðŒ¨Î 6ÈIÈ”×ò ¢êäï䠇Ȳ”'x€·˜æ5 Åa…æ1¡¡ Y‰9É æ\³!q¬¤ìeÖbÁ±stÖbnñ°sÄÍ)²¾ É3ð%]újX*À¢e°ô‹¶Æ’+¤á¤L‘d…z´èqauá@½ÌVÒ§"65ì•ü‚À‚Ðõº^IÎ/¿¸Æ)8DΧQ„tÂZrÞ7NôN¿‹dƒ‡¥Š0"Q-ÎIº! çQMHƒ–+T‚ïQƒ~¼’n ~¼&ÑŽj¼A_Yx!@º’‡¢<ƒ$¨©ñN|(4ùÅ`Ö ¡—’Áj4Ô„^®Ñ¤2:c#d)BE);h° Òô: ÌQŒMpÒ3Ñ.‚gyÆcO°â}¾ï¥X¶%Q£—¨^cÅÐ,FŒƒN´ßŽ~=Ë„ß>Þ/Å}½¹ÞìoÏ}»P¦}·ü~u=įrhÞBµ²ñÆ~ * åW†º•Ã\šVŽsNÀ•úꀎïrÊ‹6ÔÊñ.¹•cXºVNvqè[9·Åahå䇫VÎn3®ÎÛ…î Wç­ £ÍE+‡Ã8\·r݉á• O^¶rå‘¡nåPG}+ןcOZÁ“;xÂw›ò±Ð0W‰mZ¹"Å¡mån‡ÔÊí(¹µ© šZ]õÙÓw›õí™\VñH¼«ÆO¥òg˜‹ÒÃv]D :uâPƒN: Ât„é0Ó<‡?´ S߭΂NH I´ :ÓŽ¾0 Ì$ÿ„¥®&`Ö̉È@D¦¾ËÕ%Ú€N“84 Ó$ÿtšì«¶9¬Úæ°j;'"ÙBDø.gþhNlâÄ€›Àªm«¶)h“€É5}>=ÑSL­Mo|³?mNqê[ Z>D‰ïò úŸ”¶à“RÀQ Ø‚1JBîz3øø…tð]N«Ñ|r"Ñ‚ONY´à“s`Œs`Œs`ŒçTd¡"*T„ïrŽ6à“‹ˆÙ%ÿ>]òOXµKþ «vÉ?ÀäZ|쉠"*T„ïrC‹6‚Ÿ8!pâ’ª]öUûVísXµ×•üDW)·R.9çØå{3&X¤_åÕBt:}tú0ó9`–{7VæTÇh(\Àã»ÍíœAgnç :S;_0èLmgÁ ,÷na¹w³¸šCD¾ðäZÊÝ—ÊÝW ê³ÿUK}öÞRnÝb•܋ќ‚B»¸<¸¼Ä†À%2€–úøâ¢¥Ô3ë–rËZÊû²%e+)¹|ÈfÈM7íRñE]üL >›æ¢îsëœp›}XÇ™Nº^þõoǽ½a£:ÓÜÜ]]½“9SÎ9ÀÝϤäßÏ€,>&SBgÌL?ÄR:{0K²Ÿó6ž4êfÚp‡BÏ“*IçaÒ;\“5‡“&Ý‘©L¢[tŠ+“Z».´eG­•Œ-“éÇ%ãÊÆ4ì]‡-p~R[*úQÕv>ž1\öe£ªÁOš—e¡õ¸îM×ûÊ$1u8™4Ž;ªÁj:]LŽÅXqe{uAùdR³)JQÙPm²a¼}Rçjf:ôÙZ2&38äuT3ÓÁwþ *òãÆÀ§Ê$N]ñµIm»ÞU& õzèaŠUmìŸ6#ï•i2nÜ1Ñ=ÝIU2Æ÷5ocŸÊTÌpwאַ셒À‚l7?[ÄyH½ï ÎvL•³ c…JUv“zÛ7Æs&`†J4l± ©Ê$¡ˆ ÆÜiveµ÷|éoþ°·ÙZ>´­Y4ãTºö¨|’ÍÏÃíæß¯ÀÖ=”­Ó)û›Ýfÿ3Ò qo?SÛã¼RÜ–ec¶€?m€¸»øù“ì- ~.x®ãW+±ÎÅEÑrÙ¤F¯{¹¨þà²Ü!­9A£ŽkËZµTݬª|‡´ÌGY¦–Oä{UǯGûˆø\ÁxŽ03ÎóÛy&< ´ì—Ö#ÖÃGÙŠšÕͺY?ÒHÕùHR¥»qvüñÁ-vøæv8Ú´Ô¨ÍÛ²r©¼#Ï¡ 3h9IJdI=ÖŒç€/«ÀT–+•ëO?ºÁW_Ía뾎]™§¤q ®êà¥FÈžÐãµ®ƒ—Š :­ÇkSÇ/‹–øÔ¯mÝC¹½ÒñésØW›¦:j¹±’?­Ùh®ãÏúHŸ);{®‘ÔgòË‘jgÏeUîå¾|gÑ£6Oe•òQ•þ0\­²jªÜ‡¼+—•ÊúÁ¯êàe©²9Yçue½òQ½¾Þ¾ß\> stream xÚí\»ŽäD­–Køì/`¦ga–,- 1D|ÀBH°+ˆ]+B>‰ZðâLVA©ÌôÛ{«Nõ^Dk5§­ã{Ï=uêáë¹ß<ÿèysÛlîšÍ³æþö¾¹{qß|·Y¿^òâãÇn›»OŸ~~õÃúåÃúæÛæñ§õÍ—Û_Ö7_5?¾ùéûõÍ˯?k6ë‡Ï›arõÕ u©R É©N Êrù‰QåU+Õ+±ü¬Uº¼BÖƒª¯°€‚Z—Ô‚”Y W8˜µ /”W$Ç ñ BÕrCð‡ê%¡Ú+„²OP¸‰>A=Aý'PõÔÿ%6¥Úª¼B¨þJ¡ÄVÈîJ¡Ä6&^JlçD¡Äv©¢P-_]•åš…Òj{­r j.\•‰ÅÍú…çÈØ¨Uç«{/(?B‚G)mXz …®PHÃê'H¨;R.Ôìê.¶;‡ª.Ï‹ @mãyšáâ¾ePh†‹AHf¸9ŠººKäîH¨ƒ*#BÏRéLî^Ñ×3¡Ea3Çálúš,ϵ¦u3bL–ÓL‚7ótYw_+ä(k¼twKa» e…eˆR\YcaQ• ø0 ‹^mY˜÷‘°,ÉH€EÎw1ê±°HOÕáÞ˜w}|`_°zy7Çêš§ãÝ)z ã½?ÆþgäLïÀ*9€¼ vú {ò®Óò  Ï€ƒ•Ð4ôØÐéVBР¡"jØÙƒŒvß!j(‘ç!%4 ,á ª3»ChðP =Dd¤2##WÂ^®„ŠÝ‚4TB%Ähðbf„Ç>ÈÅyò rˆ$vèÄ+!t ‹ÉÏA+#…=°€JÍãHq,¨™öï­ïÐ áò^Iñ 5Œw¤ÎïÛê`v‹m|¡³“âëf‚xÇz¬°iNWb¼›RŒw¬KNCK#è(ËbK#ìÌ +@ÂòYØÙ-´¬Óˆ°0‘šj©…Îêâ¤=$¬€å±3R mÁP¤i²°ãVˆ,ÝŠ‘ej1²l…’•>'À^U8`:ìeL¶D|£¨ÓžÀ× Yà+"dÿˆÙÌn³-c3ôyíE6m¶{ðÕœOËÁ¡/2Ór@…µ•C%#¬íØ)d„µ“C'#¬­ja¢ÂÚÅÉ ÈÖVð…Œ°Ò¼q!™¡nÅ24uN†ÀüuȰ˜¿®æ/$CŸÑÆ‘È0C Ô˽Ëlfï4µ„Íì½´°™ýlãÃæ´¥é(ñ.§,.-ŸÕµ%>dµZʼnÏꊯÛ!øRÀfŠW2jØ_½ÿ¤“ÔCžvVS‹¨a§‡•ˆözhEÔ°sÀBD Ѱln{/–Ëí~åÃòÙlX!» “+¿w’ +W ‘°x58îÍ9û=2ß Ã…Å©!Ö²eè‘è Î0ùæ(Æ h5ØxÏcº£Ùˆ¶’ÑvjÚhztŠ=9ùØš¼1ÑÃGN>„€Æ;G»TC´R‚«StXb^±aQÌÏÕ`À6E¢3b¦†@¶´øf)öu‚t®mË.RtUŠt®çGÏIœèÀ4OªHqª†žƒªèåÈ4s¬Û·ef7³„™×¶q}Æ:1ý´"ãZŠžf¦E¾LJ!Ò{gƹ‡bFUI: ·ÒÖã€ßN©j)WŽtŽŸb&Tµ¼ò+Ô#Ö¹„3ŸÛ˜GX§=?0 `£v8ñâ«3UUdã—´ás(ÏTÅ}¾ˆm4vÜ'T”l –h½¯‹9Aw‰™¬ˆnù±Ý™"5éÇŽÜèú s«à9ÎP–r¸ãïÌ?yð„7È,Þ¹oWÄ!QÅhPõ!Ñxm€¯AÅv¿cþô_b»0ŒùSÝtR~‰ݹ?;±³IUñÜQV©Í|Âæ¢&ždŠŠšÆjfq”ªZ>ª 'é!=Õ"èsÒ9ûàøš6d¼…6•´&f°X)ffRó`c °žpÐ9ˆCV&=¶µÀâÒf<%–ï²N¢ºÿ9÷Ô_rÉýÇP‹AùV ÊubP½Òð—ÔïrP¿ÈAU×(« '+/'+'Çú?rP_¥BÿƒúUJN¡ƒœB‡ßä Ö_<¬¿ù;¡wù endstream endobj 677 0 obj <> stream xÚí\ÍŽä4®(‡H}É#$OÀLÏÂ,{Š´€ÄàÄG 8'ˆG^Ɉ¯aÄ „›–ÃÌjº;?.×çî’h­&·Õd?W}þ\U¶+}¿ýÁëö¶ÝßµûWíýí}{÷æ¾ýv¿ûa÷Ñ›ÿpÛÞ}üêùÏß|¿{û°»ùº}üÓîæó§¿ìn¾húñçïv7o¿ü¤Ýï>m§³_NZ£N k¨Ô FRƒòŠR­eôæp,åÐ_!ïškœBE½+ªÁè©ÁÒ5.èQO£ŠÑOÊëÉ]ªÖ[ÏŠPÕû¥®ªx‚¡èêJ*¼@ýP^ªx¿¡Ü•B•W5jBUWe5¡ÔjQ£ ¥V·šP]ÎÚ§Ä,Q”¥wOÏBõ™HÜà‡òt|ú ³Äp‚*. ¢#Ížú"(Z<ýáÊ-¡Ê ÂÕ°„Š1~…á v µ5 ]͉f«yã_Ä,p5ÛTqÞ"P+#ÀubH«¹Åî¢PK‡ÀŠÁÄ¡ê3ľ&ÛEˆÇ²`$RÙ ñXê:Å—}U¶BMŒg¿„“ÄÕ·[xˆEöÕÑ;¾ªÌ¢Ýmˆ:Ml¦¬,ìüÌCLV†Í23-a²âŒzb±È’•çSߣ[Ýq¼eyñ`K€deãÓ÷lVy4½Y¯YÍõÓQÖÙ!í´Ô:¯™p`¡Yodj0Â,4ë%ÀB‡E˜qM B(¶lJ€Ð›À ´Ä&°­¡ ,&- Ä4L „¼å<"…'B¡ æÆ‚X#„VÈx¡Ðx Ò!­GÆ«•&ÐC¦[p1÷Jl 2žs­ÅZ @Úƒê¯aaš@‡¼„Ê+å B;hÙ@2î•XŸ@ÖK„ÐR‹u²ÕÆë#XõB›-Ö¡Æ—@Ðæf€Ö´ÑS´;m´X÷XpDXw¤ÆúX¨±n¡r:µ2Py Bv>¡È¡NX±“OZ\¡%Ðãf=A¡sc[#T! ²áU;€*ìà_¥*U¾P£Ê!'Uc,@ì6B1–Ð+ñµ½ä—µHi!KTÉâ8ôdqœGz2Ä䑞 1.ô” åµÉñéÆg’žÐB¦ZD™­m¬,å¶„&ºÑ2»Y-Œ”Û̦›l£&WiÅj!ß(N gÅiá £-œc£…sŒŠ#Ì5¦š5ãZˆ’ –ÓXÇWñHVL LH ¡YsèÑ`HhÖ$4x:š5CM3eÒ½¸‹-ÄÓ̺ׯD´•Núüžk0!l7f™.Âyµ%a£…8çVl?Üj!Þoe\½SnÝ«ã«XêûôÕÆ½b5%~µ˜-×( 4X.µÀ¸ï]{hú•%SÐÈë¥ÏTYÌ3«XMS7M ÖÎ'Ðq™a䡿ÿ½^Rrɇ{fNÍ ¶´eŸÓ¬Ù~>tÏÕÛ±ø²îÿ3ó÷;¶´·ë.É*fH [os!oNÖa1'B"xÎ#·¯–6|i›X+§»æ0n“8åsÖì^`ìžg¢Kì¼RñütaožYåwDɸ9ïÖýÅóm¦1£ºˆèºÙ˜©­IÉýØMAÂÎj¾R˜}k.íöÄO:=|@ØWYɽéôƒ¶Î儊êôK"é p#ÌÞÒ³”Y.™ÕOVjsyçÍÿL†…Ü›ï9ËA÷æ¦w$€î-*4Cr@OÊÏÎRM)é ½$f 0òåAÄ+Ñ6½YX{ñbaÝ:1NÔ"®Q°Š¼÷kų:Ò;ÓAuôyKÔØ•u‰à‰Ó¯bq8ý!i<ã(&YLeð9‡”9j¸è Ô¤÷CQÓozPêAý­5êA9=aùë–"ÔïzPéAý£õïujTÊëÉ=èÉ}R„êwŸ=ì¾ús1xª endstream endobj 678 0 obj <> stream xÚ훽ŽäD…]rPR'~û ˜™e™…ÈÒ AÄ!bòJ…xB¼@‘UP*3ÝÓžnÛõsªu­Õt´Ûã>¾÷ÔwoÙÝ×÷woÞ{ÓÝvw¯º»îþö¾{õáëî›»Ý÷»>zýøþíãï?ýõëïvov7_uÙÝ|¶ÿÃîæáóîÇ~úvwóö‹»»ÝÃ'ÝD{ <©ž¦äyRŽ— åYexRÿð¤þæIýÉ“ú'ÕòåI9ìv¸FBÿâIýÁ“ú•'Õ\#V6ˆÕX=½Š˜3[¬TuþÂ¥tZèñ%P©ßWeT^ ¿,«‚/ - ”0-׬•š²Œw¾^k±<ÉúÄ‚_{,ô^T&±Èõµ4fë‡*áË×§ôê)Ã}ÚzÛœ>•ªEÀ.Ý>/Xð8_Áõ¨fbÑ[8ÅyYLô„z¡o:NÌyÄ S4ÇUÓ‰…STòTjm”âQB'éó¨îxŽL}i ®çuË Ôâ(N‡¦ö“MÑÏÁäñË¥hæ7v™Ê_†È`œßSÇÀ°ªíúÍo™þHb†UoЛS²íŒO †Õ¬ƒ’Ëm'¥¥S»¬:ýî¥c\˯w³~Y¥ÃºÃ'´T\k±úê¼÷‘"«"~-¡<í†q&Æíöß?÷ S*¦]xô­*V—§çHð)K'—goLc½U¬>Ò#<„)×ëñ¬I5¬\©!B%©ÛõgŒ‡m™fSqÎÃâP'7ç0uäâ(™¢©€kñ*ð¡äaíè°µ¸Î·­Ðþ¢úÀÊ·PXCìšmÖ&v+CË%°65æê EC6¬íç¼Â]gÙ \…k®Ï ¬¯!è±H7ˆàÅjêM¦ÜLÙHS=0¼9YéçM\+r‰áêX?½/ã¯V汰蛆™†ž–j'VXº™XaY9±Ârbb…嫉VôZ»<¬±_Ò Ñq ‡°ê²¯m£‡»Òoý¬HÝóJ ±Íç›OC¡á€© ÐðÄCO¡¡˜“X%Wf¼MÙQf¼«Ò_ˆ°†‰e|òX]DüØNiã94Œo)4¢e뉕¡K/wI†>}VS’aº6|I†c:U¡jhj9±24™“dh3Åoð:tÕÄÊÐç:åˆwšÜfÀÚסà€uÈp €uè4 ¬ýÕCÍëp5Éë|ÏkCÃk¼à€U€C¬=Xw0Ùº°híØzb™åò‡)Ð,ŸРfåÏèP³Æ<˨Yª¥™¥šY¦žXfYÀ°g9 )¬gyÀRö,à( ö¬|›Ù—aÍi3ûžAªj RœÐbÚ Yfl°‰óÝ#±ƒ"ÌÌ÷QÒ|W‚æ»Fl!ß bæ»ElÀ|wÈ:ÈwØà±>•=æûˆù. z–ïô½Gh,ßè;v‰å;dƒ®°Zm >1#Y¥c@h±¼Øu%Xøh ¡mµÛ¢!HQÒb7Û9û†]Bì’[B‰,atÝ `›/<ÚŒ€3*t kZ3VÚ‚=ÈÐ=È£Á@B4Xl¶¡ÁWÉ }AAOé1m]BƒJM¢Ï·² :5+<ßöc4ØÔ”ö.FƒKÌ÷šgìþ$><îOg€h8ŽÃˆ 2ðϬï°Î¯B – |/Ÿc@Àò‘¡¯Å{»[ƒSmv±yìnU…‡Ü*gìÛ‘³ë”G,·hÒ›Q" ¬i=ge3WX±¡Îféô‘†'1°"cŠò‚û¡È|hÁýPxâQlÖa48Ûn"ï/ÌPli/̰݃I¹ü“hý-fÌ>‡fÐ_ùln Å}ä°°”Éa:|ŽcÌŒaH¹Ì¦/øÝ^§Ç0}ÉüŒN?ÇV4Šã’ÏÅNy¥×…(Õ²¤SŠöè®fJI–”¹R©š%e¯TJ\¡”{÷¥*–”‘ú?¤¦©©ÿDJ¼HÁRõJy¦”|×¥h×¢Ž)Õ^¡”åÝã¥LÙ31i)Z5kž”âµ+ÅkW#­'^ÝxfÝaçz•,0_…ÅÌcØ÷6Ï#ï>}Ø}ù/b7xA endstream endobj 679 0 obj <> stream xÚ휽ŽäDÇÛr`i?‚ç ØÝãØƒ¨¥$6@‚ˆBÄnD@È#Ñ'ƒF¼€É:°ÚÌÞÍìø£»ê_{%1:­£e>ÊUÿþÕGûz¸½yñÞ‹ýõþæÙþf{}»öáóý77»ïw|ôüðúõá…÷ß¼ûõw»—w»«¯ö‡wvWŸÝ¿±»ºû|ÿã?}»»zùÅÇû›ÝÝ'ûß'µËê™êôLý¦gêO=Sè™úGÏÔ¿z¦¢ž©±W3•ôMŠŒ¶z¦~½HFÿÖ35(2ªÖx™`5z¦~}Ú¯¬Â¯p;Þ̯íû5ÌúÚ€…ÑLæZ%p„–0šìµ\³±}¼¥µ­æ–š‡eX|ûg>#Š®ø¥^^ªx¿ôw¦uà²ÐQĹé¡ñ´Õ±>+ÑH$ÏT¼sˆ©Õgó霢xÞuù»=Äå,^SúÐÉBhù¢òú**áOÊ5ž-3Üü{«ð^Vd³Hx†\ç£[¦Eà$I>¹åk ‹+&Oíñî=Ÿ{–I {ü£cë¹>d‘Ôl‘b1¶'«=³z5S9ÚПHli8 §ÜNüÙð¦r€NØ­ÏѶd5·T º_³ÔÌ^¡ªyEY²Ëè–¶îUa©_Uõ°‚6–f½&ιÑ`~Ç~ÓÓ¹Šdºy_¤Àfú²3å«)VÅs«©©á‰!aX>o€±l©. ù×[f#HXÝb1,ø¢©’P‹ÿîËIG“0¬tì¬Y a\ßa5+8œ·Îʱ¦Ê ABØø[~š.Uê•€ë̓$¸í ¼åê*¿zë¥p==sæJ9>ÌD×ó¼S>ójfnœŠ¹EÍĹUe5Ï|¯e't i~­ãš{“-¼åFŽìÛ¹>æ¸AÈfAèr‡™; „m2ol”Ì©j\ª ¥3ûú ~Vrjòâ(%§ÈÌ©ÉôZN%£æÔXi9E° uŠÜÊœ’²@8%e!Û% ‰ØÃ Y§„,”G[rç]¨eEX9j .ba,ÎÛb¹±@îæE, än^Ä‚#H8¬n­%ºˆZôÉ·J¢Âï$¤“Â+OŠ~`¡—”êÃ&> L|ÓÐhÅ'h7ó´IPb<ó\/1‰~X(ao4jñÅJ+>¼ÝD.>¼Ä°ñá%†ã/1||p‰ Lþ °rl|(V#÷Çj Ö‹°ò†ÅŠEÆjäQ@± ,ê0V< (V‰GÅ*ò(  ‘ ì\ŽGì\ @ì\‘­ pç `c‘ Ž!©°’ +1"Vb< Xb©°3 –˜H@°Ä| +1ÎÈ ( U¨1@Åñ “kµMˆçÕk„=«¥zD°ÂTS¸¡¯´TŸ\­¥zBôLH=, ô!Dõû¢z@° ˜êÈý Õ'¤ M êµ–êË-LõVKuGPP¤8"*Œˆ XÚDD…Ñ`×Z ©Õ1¼ÆëP£LXcÆÆd "hïW#*TTÒzˆh (h‡è‰%30ú0™{@l‘ 6ª÷ ˜Ì ‚V[$>¤¤!OŒÁ¦^Þuo XÒ øA2ÿEÇ× XxEñ -à Å èh0ÕÏ,7ëž?»b¡´ëHT}ÆBa½uú°ÀBÈ®RNìžjZ•ùsã¶¹©É‰4!'’O7]üöÀf—R}qZ7óy9qý€U·h+M.<¨Â,L¿^uœ(ŸÝ¶_…Ól„‚*̺Ä,WËqÇcKXÍ jf£€.°šrÇua©X-cPÞ·DüP+»oAÏæµÙìü$àìD?åùæOJS„–ÜêAS…ª"ŽoÌ|.<*¾Å/‡ŠnAñ­aŸ5c!Ÿ÷ßjJÝX”ÅMúÿ¤ƒßï±Råý¾.ߺ²çR?Páʧф–¨§QÝ”ÿùË㮤jJÉ2ã¦*-SQÓT}¦MSÍš jª}·MyMSÝ“©ÿÔ}2õdJÝTx2%胗iJ­ÈÄwÝÔ¨iJ­¥¦‹45éÍWš¦œÚ„\ú><Ê”ÚÆ;ø‚–†I/ {½Ì±z¸wzŒêeŽÓÃ=Ô—HƒâjꮘЊ¼kV¿ámÄÚ}z·ûò?D…w endstream endobj 683 0 obj <> stream xÚ]PÁjÃ0 ½û+tìÃN;…Àš.%lÙÆÜÒ^[I ‹mç¿_ì†v@OïIz¢e½¯@¿½•tÚ(£¼Dh±×†d[PZ†µJYÂZ6Â}Šžß?çæ±l8ß]2öt:VÙ (ìn¤ãì¶k]ïù<jÓYÈs@–™cð3l^•mñ!b_^¡×¦‡Í©ä á“s¿8  ÀHQ¤qÙí*iŽNHôÂôHrÆ È«ª hÔ¿Þªh;y~a¾EæŽ='îŠFUtx7('ï—½é ÉQ\® Þ?嬋ª¢Mn endstream endobj 685 0 obj <> stream xÚW XçÖžœŒJ±¶LZÌÄ¥u©"îZ—º¶¨µZ¡E´ˆl²²„ÈrBH¾(›`¥²º‚UqmokíBoŸÚUZ«ÕÞ[µ‹gèÇsŸû…¨·ü¿ýÿ›<3™Ì|sÎyÏwÎû½Ÿ„qqa$É£þk^~ÉísË×úú. ˜îí¸7{±üñm_ÍPñiFô”ˆ£‡ˆ ©èî2ša$~£gÉHzfn<ê8O¦§Çc\$n§¦ÀÛ{¦—·÷Œåñ ©ª¨ˆHµrbè$åôùóçNQÎðöž¯\¦Š ‰S® QG†Å†¨éŸ¥o|hT˜:U9qa¤Zðü´i)))^!±‰^ñªˆÅ“¦(S¢Ô‘Ê a‰aªä°mÊããÔÊWBbÔ÷Ãöº±<>6!I¦R®ß¦Š£±Žpc¦»,uy‰Yż“rkË1›ÁA Êoˆ/д¿‡Ã¥XÁ礃R9•³Ð0i,;p±Ï™¯ßËšªìÛ2‹#…qÛª) W,cwB:d©9òXÿBgaWQ“µŠ3“›¬ÿ;=8î–ä|Ÿ¢)À(ñl—¹®±êƒÒÄFïÊ ÈÙæ:S£¢æ³¼¾¾£¹ú0pá…E‹á…±B ¼Tú…Áf°é Œy¹9ju$踜‹„Áq8ûû¯pÊýþI¦*T¨OÔrn};(À'zÅUÕ1®OàÓÄÑiæf²)éoˆþÛò¼LZy\Â^(W´²»¡ Êv TŽûÙæçJ#í)ÇÁã4[¾ ó–WÆõ3â³|ÅѲöÂVÎÌZÁX¨¾Išå$–uxìÅœŒè•\Ã1Ø‚…¾Õ|D–&\è¿y¯úÙ¿ãËe¸JC„ÚpÛõšîSp™C! 2•œà1‡É:3L%,yTáÈû<æàc²€ð㕺 Á­Ï7û–Xz[ò.N”ö¹ã8¾PW W$BÜj2†–òŠ@dp2N:Mæ W¡+²1É–ç¨Ù°ZÍÕ©¹ÀTcY_ûJù"ú†Œ"#ˆ–ñq¢^¸Ý¥Ÿ+´í4£-Ð+îq€¿ãø‡«bÑpŸÅ¾Èü‡ï'K~$®¥«©å…ý¿ñât—aLñ".d¨†Œ#Q4¼-7põ]j˜Vˆ)ÒJöA©‘J\û6{¾0\®¥Ž …N¢ëÍ:_w:§8ë´\v\ Ûþ`ôŒ7¥šÕý3*obó-ÉßpÆcº´o"õT`(Ò*H›£3f +d¹V½Mñ-qgµ¹>¹éޏý~C/g çÒtJ¾àG©Ïd¡å`-È/Ú}Gn¶šmZklåÒJ:~÷Xò4QÀ'‰3„ßáÖ}uœ~5}cª%×súžr{;({'ñ»‰ŸÃmñãê{é¸Í‹‡eŽ·œã‹du¦½Á ·?œ>®áH±GJÅSø%Ÿ>-'’3±ÚÖ­?'wwüHžv(R›7Ø\£ÓšXn–•l>F¤õë‘#íòÝoÔC3ýÖÃî#莗äÅõ§ÑÓÞÀ™ûËôpÿÅ›Î(ç²*PÓ¶Ô˃€$4 <Û7–O>ëhC¯‡;¯5Ëp_ÿþšÐýP ?¶œà\ÙúkM2·¾ ´»á ,w”ã¬rôškxœÂâôÐ }nÒEâ%ËCsŒ®â9Ÿ,[·ÒG³†<%7,§„…I(ë~¡ 5ŠZ%Å:q-Ÿd][GIôÊ•üfÅY8‘ùvPeºÙT6°Z,ßÉó )¥[ ÐdV•­hYo n™–LÖ °¢-xOÊIÿ®ìË©g3kójSгk’!Œ›:Û°]1–5Ë*5‚žR}žÁž>Kn¤üFY8ù׫ñRòicp8ùÆ%œFùÂeÞ·êœÌ&¾ƒC$Øé¨Nñ[¾¿u<±Uv”7n_ýŸ:¦Û™ŒYP=ìS¸õ$õŠw O¢§´oÖýʼ'9úçÊ&Q2q#\Ì…_â¼Áu8KF"ðù­ø8²¸¬cnb­¦o i¢t¿€·áG<Î SÌŠM¨÷‰OÖæ@:Û«æs®5ÏNÉB?Gލýp§+·¯"e‘¤ÂH&¬<»ô{¡>+îúˆK‘ýYëÏßy¯)`IhmWÀ?Q°ï3Ó%í<õ~µCªézân¼(|pd«`?˜;:ORÀa ß‰ã€Èza>k³9K_Vº¿®¸Û0mÉR˜B\„PíÕ”SWéšËøÍeI›dð JôÆ2Îb,ÎVèéfg§¥oÚ:¸qpûý¯¬ßÞ.Bã®ÖØRM>%ßbÈ/2䟥è©þH+ ª-^Iéc’×J²œ<ß»Ÿáó¥æ}f3GâkT!Šúÿ€sj¾Ùæ#öjh ¿×ƒ¼†¯ ‡áHé‘N.¼<»ùzôüœ‡4ÐÆ¥¨v©YÀ= ×?û n ‹ð&4f×&S‡…ÔáÔnôì¡ÓÉã6”JÅ帯Ûk>†üº^2‰ÌZ8L!ón.ÀéB;œ³~p ¶ÄnR°Þ4ê›Lf-8²¡É^°N d(d]5¼Ï™»y˻՟}_BÅ«–E”¯H`\ÞãÀRŒŸà³DbJØ8x‘JÙjmõN{ŽÅh¤=£ìq¶dªC¸%Ä5Lü¥ø¤¢„líÁa(éìÁu=§YîHqÓu>‚j°ŒR}AZ4€Ýœo¶uí¸5ÀÆ™€ó8ŸÔ¢-©‚8¤)0Úà ­6»yõÆb}=ä§B f…©75ù¼\™ „¾Zؾ=!¶Aì´m¯IHÏõO…5Sáÿ^ܹ—L]À]@_À±èMnò´ ÇáüJCû™3–Ž?¶„ùù¶­N“þ«Ã>„…èP%|ÜÕuÐyš;×Âx‡ÆBGEð2ÿË–CÏ(&@ð‹ñœ‰ªŽ‡w“ wȾ;èÔñbu€‚ì´ÍpÃBj~võ-M›ÊCz§o ? Ø‚eÑÅ™mŠSìq¨é¢Gpˆ´j5ò¯Á™wXr,3Ù—÷÷Ýu º4i‘óöu݇µü¶G¬ÚõÓKì„ؼ=F­KçL'œ8£îYuùŸ8x·ýíã%É8ÿËG÷3üôŽ…Í/d&üÿ^ÿ2»bå‘«ŽóÄh‡é LâqÞ‚^2—,X<ƒÌ&s{—átœþ]ÎS=™Á~øòs¸z˜¹h!x+’58§ÇAI¨/°ƒ?xÊ)»E:ØímÀWÉ*a=lLŒˆâÚ2Š£$¿{PÀ¢Ù¥¤ø@Ýàî˜Éð-¡@ÜÉPA ©…YE‰U”²vSvàèú{ûæ½ÉÄ4n~Ññ^Áns>@×%«{ª"–eo" gºèÌOôàüÏèjtµAà‘Ȧ« ^ bÄhÍÀýCåå!M°¸O;¥ÃT‰¤;­Ö÷­‘ö…ŠËxÃ>n‚,C†Òâ-Ä;}Ãì–çÖêê‚)?«!C­MßB–F’a °UžÝ¬)Ù \ ÝD&ƒ!þ÷~wyYp쥲…킊’ƒuß´Ò™8e6ËmŽ’e›J"¬;O÷!{ŠK‹›¹ÈêÅR<Ù<>ƒ/—:ö8µ)Ýl*dAFz^ÞêYiêÙÈÈÓj4f5p[ØÌ$H@G·D9øñ‘“Ä?W§Ïƒ¤Zº'<€|Kí^t—ß!ãËSJézàq”-¯¡+ ê tEœ[R­¸¹ ãkY²µT¦î2·Úu˜Ýu¸ÙuÄáè9Âìꆞ%®ˆCÜÿ ph endstream endobj 687 0 obj <> stream xÚ=TiTTW~Þ¤}N’~­a*`4Œ("‹Èd‡Áå Ðt ›Ö¦1"*Á# ‘‰²Ä1ŠvPbÜ0B³Hhdq`”11“É2'S\<™G<'êž{«ê«¯¾º÷Ò”XLÑ4mŸ¼=hu`DlìZï…“õѤü¿¹ ÿ Å¿Jó¯Ùð ÿ²ø5Š¢Ý¬ÈA°Ôôâ»Z02Ç?Pbšfö•ÊËS¥z3а7ϨMÏ0)ÝÔ+•k7lðvW¾©RmPúë5F­:%K‘bÊÐèSLÂf2Ö ÖjLyJ·M&Ó^Ÿ5krss=SôÙžcúæ•îÊ\­)C£ÉÖ÷kÒ”Á†,“r{Š^£|AÚóÅhÐïÍ1iŒÊCšÆ˜%ðtð¤TÔzjNGQ1T•B©)–Ê¢tŽ@Þr¤–Qn”;åA­¥¼(o*€ ¢‚…Œ*ŒŠ¤¢¨X*NÈcm(šS,Ô?i_:‹>IÙ(lbmZE2Ñ;¢Åqâñ§âŸ$Î’£’[ü {¬†Iú›Inžd7nœ”Úóºw-|Ÿ…¾:ŽEã">'Yè*ù9õaêDhý.ØÑj}xfȱ`Xå^Í›¯¿5´ÿ è…ž¦ËCWî¿?ß0$‰\aýÀôø½‹mÅ­0!¸­u~Ü­á*ŒÂ9ÿÊ}5 ÑŒ']d‘b¡j/ZЯŸÁ¸)ºòOX,î'Ãó’AéÙŸ™[iiSqJOäÂ!êó}™±N·ƒÆ =À 3󔣃ϳU\h ²²û9Yáöâ¿ûéÞ)|&tcÁ/X²3ˆJšvD]¨†(ÿ„«p.Œnø*÷nf©®št ½œZ½Ep'[DBÈ´#aÉYaàl¯YW@ýÜò:zZàú#ïÍb6JVKÉ#ò«õ~6…92\„ΘC~‘<„­€þç Õl”“0g'ÄòŽBÀ·PõÝxë.ýä!¶Mˆð!Þ`QþÝS´AÊc–,ãÈáÜR\Š?²È´lÛµ™È9² o ? w,XõÀÝ ¯À ¶¬U¥HÁGÎÏVÏ1={ˆV|CŠ[‰U2%wçíY¬Â—e¸¤%0:^íGœ8û9ñ‹yœ c}¥ÄÞt<Ïš¢LçiáÕÌ'ïÿ¶/)V>“L  -¸¼_Ñ×F0R\ŽÍìlÈÀZÅ_`ga\æû¡NŸœ½yñ>0íæ´N##뎿±61©Ÿøè£›„ ,ÿ: §vלÔI#ÂÌ–ù ‘ùc´å¡µáóóE÷œ’uIyñÀøþùë§÷›f¾ç:Á|äöžß°,èÓù? }iM÷Dü+h`¡©¸?óËŒ®˜Úd`^÷ZI–Å3®(ãZ ³ª­N7””BÙ 3œÜ™wX áÜqÅLe'[Õyëow¡¬ÅgW0öxM˜Ê»1ÝBÏŽŠpϰ?t»àRépdzâh„æÃÌ=™©ÂPžŒg˜Ÿ·*8zhž• Ï‚$wâGº¾ÂÄnºg½‡O‹øh>Œ)ÙqD}@w^[af]h 7ñ—RËŠóŒG÷‚2ª§ó3ßÛ˜€™H´E»™žQTÒ…ôÚ9¨ûkUiiÍóÁëÀ<²þ‹ƒÖœ+ÇÎ0åÒr¸Q^ŸByIã †Idµ;ë'wVŸ¿Üº㺸ü}ÜUÁžû¶%Gh·øE4µT@ïgF¨çëÐeŠºõ˜se½½§¤Ç‰ ë?0*Ü\AÞBŽc¸0<laû="E8¤è Z¦7`~ë8—õ»ÿõty”VA>_B˜÷„…¾0޵BÖvÔ±¸Ôý{"&2OâH–|ëŽ"”Î~‡‹DM¼Ø íÝH#3|³g`p—& ‹Øì¸zL ¶µ,ÌõM— ꇗDf¦'2“Aó[Ùq^¨6ÙC›­¸Ñ*Â1^ÅF5î.Óô–Ñ•W´É¹TtûXûQHbÞ„à 5ÄNj.qêÒu½-|Gæ±.îšÔèΔoø0¿lÇihaºú Z1×r/n^na7Î×ý®Àú‘‹Rÿx}LhQÃuZýȘÌ÷‚fHqTv´1I»wkù€3¨«m¨•’äd ;qžAn{JnW*Éb7þÒÝ ¹|¼R¾ï-ý?©Óc¡ endstream endobj 689 0 obj <> stream xÚ]QmL›U½/-í tݘ¼ÙF_'$ H)5ˆL !0䫃ò±Ä:(_ZÚ•R†naÌ-X § 8tnS& ² Ûø1†®€|‡Ý0u SYÔD|^v!ñÅý01¹97ÏIÎyÎ=—!R)aF¹'Ë“³;,Q—©]g¢tÔù¨d¥ÉSØJ„mŒ°ÝC”OJ·ÂxûŠH–7®ãýMë&‚4r3‘2 ë8 ͳjF›h±ÖÚÊKËì|HÑN>2&&:œ×j41|‚Ùd+/2Vò:£½Ìd6ÚÅá>ÛRTn²×ò!±ev»uWDDMMÚh®R[l¥ñ;Ãùšr{Ÿeª2Ù¦b>ÙRiçõF³‰ZýøJ´˜­Õv“×YŠM¶J1-Âhˆ–$‘Œ‰˜‰MŒëE¼‰/y‚“D‘O&z’M|<C¤"ñ:A&ia<´­ ’ BƒRØD] ç™{n ¾³rŒ£¡4ÀD €FM ùL9Ö%+îÓß+COëOõ`ðÆ_49Êþ'G‡¨—Q'‡¡ð F&b> FŽÝ#û´t$®—z^Ò¶«AôÆ”¢õG.aÖÅ\uc›["pŽƒÉ†»g Q÷^.¤AFEIlEÒ‰]”9£»²ûÃÔ¯Š¦`Æúz¦{fZïÀC–Ð~ŽúQÁ8Œt~qaæ³ WE? ú¤Cj­Î–}ô ¬ï„)a`”ÁÕo%ƒc\†°uŠ&Ëë ®©X^vñÒƒÅñ/gÇÇFa‘EIüŸÔ?0$YÕWŠ ñLÝû<8 ìÃ)Q*ÈsìMIe•+憙…y!`^²°’Æ­¥a»_À Ã,Ì£O¡–ƪhÂÚfN˜ÃP9,S9M¥éTD9•Rhªwá’ ­âWÌâ1±ÍpÑ%a-Íý¹ìZÁàÑ^`ýq ·áÆT$jU%¤ŸÐíc[ô\çå¾ùz?õ¥[b õ* j¯}»ªëd'tˆÏ}±~Ž2½b¿ÁH¸ý%ù‡²}>gvé»þ…ßU“pùµÊ³ãþ{{*Ú2¥qTIeÔoq*Tƒ0|öV?œjènrþëåÂÄ!T¸˜¾Áã·%BVs0prä囦w·UŠrù ÝBý BVu n½%ª ÝÐÒÔÜø.83÷e7C<¤N7.³§‡¸ŽÉë7oC7LéxZ¬ñt ^.æ®ó×dE‡CÜtí<õ |^Ê<\];fè̃(Ì}ÕÁN'­æ¸±E>qqîÎâ%ôúÿG¹¿=#×[+E ¸'~nf'嚦Ü\k1{?y5gV®tt ™ç0¿«³KFoʽ¥Ñç^­ ïf…ËÛí3tZ¡p·+6àœß?*×ûF endstream endobj 690 0 obj <> stream xÚ]PAnƒ0¼û{LUU"å„R**¥­ <ÀØ ±Tl˘¿¯mP=x5»žÍnRÖ×ZIÉÕ¼EƒTÂâ¬Ëz¥"iBr·w±ò‰’”7f¾Ø„tŸMyþx-oMJߺ{•ž@à°1î«AÈö¾¾¶ëìpªÕ !Ï @ÒxÃÙÙg¡{| ³o+ÐJ5¡+Û8ic~qB倒¢ˆvé‰k³a-S#’œÒòª**ñïï¸)ú?˜õÌÔ3³Œž /Auñbß7|Œ;;¸…µŸ[óÅZŸ'Þ&nBI…Ïóm‚*¾?¢|qØ endstream endobj 692 0 obj <> stream xÚ­ztSײöÂ:‡fÀâ$6$G¦„:5ô¦÷î w[.²%$÷^da¹ Û¸¦ØtÄ—z í&ÙÇlß¼·màþëæå¿ë¾Çò:,Kûì™ùfæ›™½-¢ºw§D"Q›¥kçÏ]4fþе'Luƺ7ж83þcŠçD¼¬o-æ?ìþ1E‰ªû OQ_ò¤þÞOx~Bcâ-(‰H$aúFƦ,põ rÜ´}„Éã&L˜4ß×/,`»»GõHçQÖg̘6ÖzÒ„ 3¬çz»lwvô±^áäáêíD~ñ²^çë¼Ý5(ÌzäL  ¿ÏÇ çè8Î7ÀýËQc­C¶yX¯u t Øéêb½Ð×'Èz¥£·«u‡òã:žó}½ý‚ƒ\¬Wøº¸øu{‰¨îT/ñj¸xL¿YÔ«­ÝF’/’DJQOÊ›òõ¢B(šb¨TOª7Õ‡2§úRý¨þ”%¥P,õõ!eIYQ©AÔGG ¦†PC©aÔ'Ôpj5’E¦ÆPc©O©qÔxj5‘šDM¦¦PS©Ï¨iÔtjõ95“ÚN}IÍ¥æQó©ÔWÔBjµ˜ZB-¥–QË©ÔJjµšZC­¥ÖQë)jµ‘ÚDm¦¶P[)µ±%˜±ŠúV”Ùmz·¿‰Ot_e6ÔÌ߬U2J$9"¹(yN¡ËéçŒkº‡]O‹žÆ^=zåöžÐÛ­÷©>tŸ»ævæ÷ûÚ÷=Óof¿Ýý—ô¿g1ÊB)'ðÁ€ÜÏX›>øà⇺ÿ° ²|h•5pýÀ?È0èÅG)ü8ŽëË…sdßZ¯±.Üc°~ð!C­†F ë5L=Œÿ¤ú“WÃ×?1"pä°‘£ÌG 啿mWáz¥lÛ)æW¶­drT)áªÄ„hüøŸ[&Æ ÔL|*äsmK%ù©. h3˜vkþ)‹ íµfí5ó¶qp ‘¿ë¢ÆŠ FôØx¡BÌ£¶lûQI<ž`f”ht¥iY©ég!ô\’§!5>M®ó×:1FI{k{!ËŸ“¤£/Ì$Êmjÿø(…|#ƒ‘„ÁzHÈŒÏQíVíg$|*a6áÇÍxޱ=Þd”˜ó·ÁÄ›™PŠAôº¹µ>ý^̯燱ˆ6ឈ‘<xÜdXëTí¨ß ̧¸òߊ÷ÿÕKºŒ~ñ}Ýi®ªË|]TqÁÙ…‰Œ9¯äeÅ;QËà×U¨w°áªðþ>å°g8x„ùùûøÕpzÈÍLMÕh5|ZˆJ’gÂüå+bbHv+™„”¤”¬{×QOmøà?{Ѽ­0ØÄ2¡|ƒ¨ñÞÞsh)·-G}XåÌe;ìÀ66{îm:Z¡éV]kqõC c¢ÝT6j…|šÆ¯÷0/ºÉ ƒØÄµrýh»E¢ó°}lècg.\‡V¦)âÞ‚s׿À1u~õ¤ £-í¶ùû 3åîòçÜwpz_mÕÅU§#Áu8wRû€iwE ¬ßmå)01÷ë+«ÏÀPK>ŸèÏ8|Áló¼÷­(ò­ÙXë¶líŠ_`¦=;&ƒ;{j޵0æh÷;|t@Ë#§ÿZsÞëŠß¬Ó‹žŸ£û8hà pdá‰Öúм½hê‹úçdƒtLZ’NÁÅÂÄE«±tîƒÅ0 feá>DZÙÜ÷ÁÒL`R“ui²÷{£²y#Ò±pSŽú¬Gf«Pß©ßÄ£HJRÈ@ ª¢°ŸGžÄ“»ží†à~Ø"ºSYErR*— .œFÒfÔ-‰á>I­ÂéÅè@=jÒ‹x³z1ÿ) gQ¥$·ôúPˆ®J’ E!!Åá*\EG…BHHäÊùM¡z=årPlÓh1´G öö|`ƒó;<ó!;53]«µÔhÔQ2Xæ»ÒÞV¡ „–Ôeö­[ˆ&­:%ÊB…bTV±§pášì ¯E^‹Ñú£lE`‰O` OI`EEII_ÙÐ þC1¿´Í–MÉðg²â2ä\$Å*cñßÿ˜g™-€ÄÈ3Ⲹ\HÎÔe ylh³4ˆêî¡ô{bÞ]aávâm«Û~š‘ï«`ž¿Ó8Ï…‰³à ˜“<±aö¾Ï¯„†cp½xÿ•SnÂ-»ã+¬ ¬6†ý$?OHé;­éÇŠP¯kF¨‚Ö°¢‘™ë`6,‡9°H¾,rìZo;db«5í'®õ»*FÛ°%  âV,› žÀxÑz²UK)ÓžG»+c&rž^’jÝ÷P_ÿ=T2ñ¤'*³jeÂ67ЫW¿˜,޼BöŒzé öõK4qgŽÁ +$™x›c³¹ã'­;º‚êì†Ò°R.^ õ®oŽÕžæñ¾ÏgÈà‹Í3ׯÀëñK¹œ|ÈH_ñ´¤Í#u;Ñ;Á>62!~‰P·äÊ/# Û…zþòµÑ¢uÿìWôÅ“Ù/¥˜BûÐ+önÙ©Kž»“OŒ>{Õì†Ð “ÞPqÄ"9ÓáÖœ`ŽO”AŒj¿½÷ÖíÊu¼:P•ñê5Ä2Òv¹< ¸ý’»µ‹FáúØË`NÇéêD“ö25~zŸ@Ï(û O— 2üøWއ»Ëo-îÄ 4ñŽàƒ7Àh;…vWÉçr;½$ ºhl< ïëù÷/L#ø­öÔ.ŽÄJ| >Ó¾ÝÒ‹FFÂ×J Rò=Ì: GÝ~FË èÃ{Gžo5¡Ð‡Òßy´E½f¼À·"Ü=´‘Ö+ª*IKÔ÷ÒãœTeJ‚LMPMT†Äm Y ΰ-Ͷ8^§"Ÿ1±!Çé0ˆÏåÒ@«KNÍʯ=vZÀ¸-=,ßMë›éð€UŽ.nþÛ`¬=~Z§Ö©³€©*0–”„wDy$l›zq4ê.“þŽ˜_BRY‡Îü]÷×G=B.O–>’¶#Kt‡-¡Q*êWÓLªP£Â°‰t;¯’HCþ3ö‡¦ãxf±¿Lúë³à)ÿøwò¦tÒOXÌIÛÛ¦­ ê…¯±ËÁûŒ"/ì ܆Bæfå‹G$å›À´¢Ð 6ÁØ ›ÃݽWmK ê Ÿbþ›¢ÆŸˆy?þ5›!0c1ƒ“$ØT9IE¤ÜHw©ËÏ8—“–zr”ÎyÄL, Þ1Úeð ή© drÍ4×O?–¼+÷Áþ¯;cýí$* V ÚJ÷‘>CÓømì¶ÝI{ €9ûMãå+ç7Îç`­ËÖUŒ!’ý¶öp ©HO&œ0âó¹ã8ÓÚ5ÚfÅÔÃéË5>S×ÁHfð¯‹_!³ïýÎAü€kchqDæ²zf„#‹úÎ*=è +­æÎÙ8cêü¯ïqpªòüw;õ©yr?LpÃÒ'Èå 1ºÌzÒ8zè¶5\8Øhýö0ûÓ+ LyÁÞq.‹9}‡XdŽ>BžÄ È€é “¸õ°%ÌÁÎÉ.Èæ0¸ÿ£PwNúûYhhÜuŠÁý¾d#`x «…# ðÕÁâÚ²#{sª‰Cª¶Øe{&/‡mÌôí£'süŠ|»(–7ÿWŽÅ7»ÿ+ïv0>š#¼iñàu¨AúËŸ¿,}Ú.fIG“™„?ȶB¦æ<.ðSÒl.Å ‰hZ‡†¢OÐtô1š»aÅø„‰K< 9O¶°‰…0HŠÚi¿|“"˜ù« 1Ÿ~pEV ‡"jÖå„F #¸ÄVÛlâ—èE•msÅü¶ålbŽ*-"@©HŒÂÎí?Z†mrŽ´Q“²K³O[cjQU Ýçæc© tšL¶ }h‰@rJšv$Yy¯?Ò­Öè.ÁÞ}MêF²>Œ^Qiò*øL2çà›f8˜Œƒ›ˆ­Tg²@²{èÔ³y/HÅ à»±HMWiÓr¨ŸäYõg–m™†Å²Çqì³¢‹çá*óýø»ø®½›W‰ä†Vî.k/¡¥¯ÉzñIÕ£‡—Á÷3®aq6³ßbq‰­*­J†JÑjúyã¸Å 6ÎFüêljûÔdqâ%ïYMÊÝÓèG;£ÏðD´MûÉ“ iÑœ@¡ŽÇC­g`0+ñ¦=¨YFâ´mÜs–C"x8A‡k£@™ L>èŠe(–.€49—I„þ7ϵt«Ùtd 0Ò§xqüdì@ä'ƒ©Md!î/}!®n›Íz•ÐoMzkP7 š‰84­Fkñ 4Ï–áÿ°f;,â÷v"õBò5\ n^°ouÆT˜XºÊ}KˆßÚ5à E¶Í$@Ÿ1¡ª="ôÑC´ÅˆÆuF1úè&ûVÈUI#Ê"¥9 š‡ç8³ê‚Lÿˆ~–åù™Ìˆ $Så^£¹‰(AÒéVB:Ò²õùXFfs_lÖ~æ­OÌÛ¬‰Ðƒ&ÔÔ)t½ %Ùr«m&ÛÞôÎqÅo­$ ÉM¨kx 5$^vÐc!§Z†ÔèŸ2ߊž»c 7¥v‰î-A£Á¸.sD´y›1اG&þ“w~öУZÉ?:Çæ×;“š–éy24®KNù†#3…z½ÊÛù3p'3E%ýH'w“-£¥qw,ó]Š·T£fâÛÍUg¸ßáñD=ñ—®õ¬´96’@¶†'aG숦àÉh­Lyn—î9Ý•k_›ÐS-Å|ÿ+[£ÍºÁ•˜$ʹàê:<ˆ:]€£q ЦÿbÅû!à]…½{¯utsô—B ‚òP Îû«æè]á÷ÑC1 ÔÑeÝâJa3ÁÕef‡°Rú–®K˜R>“ó¶º{ënulåOÏT [ñ™Á†S¨;¿Ó$j@ÝѨbtdÇo^·SÀ"p?Å´dï.­ñÕûo²Ÿ{yÕCÙ¯påRÖ5M:!ë= ¿šnÈ…sÄ5ö*Wµ­ãdp%ÂkèŸ!ÚC à÷šòÃøi,ZŒæ¦§m¾£±2ÑþJOðs_ Û…±^qŸ€[q‹%ºü¿q>MÓnh .Nˈ†+o!ìV-°[õÞv£m`g²÷~âd3âdg=Ïu:ù;!ÜQ ‘…ûãÀÌèÌ)~7½räªLwåpr™õç*ñ…ó7#»L·.çK¢mgPi}ð¬wy¤¤ýÀv˜ ˜æ°¶ªê°J0‚Ëd|†FŠtK‰N‰Ë«,Ð¥'g!u[KMûeÉ[ãku ®îoPûÞx¾ä-px–Ä@†}ÛÏXvs§7ÊùåbÙ6‰ËVkB‰J_zUHò@¯ÎSïRjÔÊ´ý…jtJ¢F¬àǶ?³ÌˆÑ¨Ó€É…´"˜.ƒƒ/I8x¨·¨vìØ¢¢_‚­Ÿ¬}6-œ$”¶M+‘T·)nsEOXä€Çæ^ŠáOñìD²pž€¢¥h šŒì8üþƒþ€rQ6~áÞ÷hèœ ñÇÓÆË:Iro):'ðñCt𥅠‹,š%A½uçÅÏ#ÀËðë*:9JTÀ¢]ÜüP‚&Ãà-¶€)ì$³6“@f,2ú‹±¶¸§­åøþɬ}h<1˜¼Î!=-@2 žAWè*8 d·»z«j»ÇV­û»ì¤· 6‰ŠÚ¶ŠÛDü]6·¶¬â‚pè¥rVû{¯Ñú ‹[ÔÅþ„ã• •/kßi‰×ñZE.)&Z«Š“`6W.×­›CŒËuE‘ío,ÓBS”9PÚ””\ÆüMv§¼Â7â7ƒ‰¼Â“û2ë€ÈóVy©½}–uÊû›Z¿BA¡Œ'òF·;Yâ)|´:Y• )V»OAi‡¼E­“°þ$C¶»á+K,kŸ‹§òr2[§îO×^ƒäÄl7dÛÞf©‹ÓÅæ1#-9ÍàS,Ñçí©Zu~ʼãß’¶µb~8ÿKf€m†Ê=•…j袶U8oçÎjh&(ŪT r,Á³,1‹lTºÄtH¶")Z°OÀÕC9\½VhÜÈEôq(J(òE˱ÉOljQ!ÞÛ†ƒiè5ÚªÚãIIoÓ„—‘(ËÐ%§e¡!ÈÍMÂñÚ$](­ &8ÜAªuW`ocçJo„);MïµG÷ˆùßùûlíÙÓÉ•Ðå_?¯.ÿ6䇆È@®ˆNRà¸Ø/A‡2‰{S¬ŠÉ: œ.ŽÛ4Ždy!}ÒåùþÈ ÿh‰7þ)“Ñ_*3ëdÈF8ĺú7cëE¨g½¥c[?úÍØgõøã?"iáÈœ{=µ„è-7£ÞW…‡ôdä×±¥áeî\DÅ*j•p‰Â¨ 7Y•ißžû:»ëL619Q>}6Än_uaY©pfþŸ½øOªö"ªNn‹cñÇÎÏþ;Ú},NŸßªúm‡’<ÿS%‰árC¸ yJM|Òd°h¼±õ švñŠQê}=¸Î&;—9¦ølîÙ‰€uôš…|GÒÙÒ„˜ëÜk]ê6ço%}ÎBÛ%ÞúðÒòB=™³«¶iʪg/>é2IæFK÷ݤüJ¹Ü{Îö€`Ï|þ,àG¤´BS}ÑA&MgGÐcço·ÛâT}„ƒã÷ÐŒT¿åy1?Ô€Ü-^_Dù÷¤‘h߇E—hcq1ý¿‰…ÿ‹˜‰ú~n–Ì[ߌôÎ+ÒF VIwÝù·ïu—ø¿PüÏz«ÄwJèRB)7ò "Bƒ»ï‰yO´ƒEF¼Æ}pÿÑXD(ým ©}~ùI9ìmY°/ök Øg¡êàXÉþ²¦ƒÅõ°ö—:”:Àpw° ¶¶³÷Ù,\l´à &Ò€ðVÆ®j÷ŒT»ÞlkW\NSØË¤wÚ=Þš´GÓ¢--kî±;MŸIgÐ)6×ß—ÀÑÏqw™ôÙ,p´ &%0EtEóáŠf`®œŒÍpŸ¯¦Í•9ƒ«Þ¯< áƒ/éÒf´‘4•èßï,‹ýÏÒù“Á´ë3é³èr§s_L9d4þ÷61DñKаÏPÁè‹Óàæåég ̼•I¥èuéÞÕÛS6À½õúëÖפ7Ðè;u£±ì]ÄK¼?cüqôóƇׅ1Ъ•êðg|‹# …ÆìÊJ¯ Nzc¸/Žr ÆrrÿY‘E•1à 3’>D.hkHºó™Mγ¸ià~2ô;eŽ:9öí,gÙ9Ë¥€FST¤%b ‹ö;Pè馿}+ƒ£Þ»c²wTº¤;¦“ Z—µ8N1Õ¥ 8Ô R&j½4qD½Î‰ó—Î3‘ÔÞèeRl\’ÒµÜ " Œæ®‹×ÉÀ#ß·,˜‘>¬ô/W|E´¶$åy„ùšÐt½è·‹h QŒæ Û4Ô„‡¢åõ oëQILðw¸‚Æ}ŸÆÔ\.¿|ž;°žžëíê¶po;³Æ·ùʺÅN¤Ñ°÷ýÆ„h<â}¿±ž²uѼiI[8ô]×77A9I†GÓ³`ËICOÀþò á*­„tpÉ|ÇG‰ù)è›±«`_«À}A*uPà6m¸À}µê¬ 2oÅ©’’äŸàtKÜU*r:Æ»Ò:($ý¿·z*ÈÏYã-,?ÉŠ/Rúej”61r 9#9Sš;Å Wÿ…²…GL9Õ‚¸`".ØÇN*¼_£6„(@•=gXŽD•IÙjaÚ(«=‘æ£Þ¤ ôöé”V ùªÌèE–wZèTœh9é…®:ùíêÝ’6h:FÏ#­ÌöDøwË”(]¼ ›65%÷Tcù+®M– Y倮Cß®J#Êæ5bTbØÝ{÷.)5Õ4ä´öWy“!xƒ6ZعX• ¨X1ËrÖ/q„”jyyúŽÕê%ªˆ¶;s 4ꃫžcÖòSÜkëšÕªÂ\Wª5iJ+U%BÖërHge¨¨:ûíõ–éòœ‚I\\¤Ÿ0ÐíÖœÐÊêÔ»;O=ôAÄàh(¼Ï—Þó“ Ä¥çš5ùðÖ£a¶Ú`A¼INX6V­JŒŽÕ–XŒ I™ªd‚Zi-qÚ†¿õè!a`÷@£ÛE–‰ÑQ;ÑÁë}.¡|‡š’Ó Ï”†æ…G{Û5ºáÎAÃÉ’“B— F~€AÔhD_Åü@þ6#Kp“a¾"‘ã©fFIê¯Eµ$í$‘àÊö>qŸ)$ZE¥UÐ=IZe ‰Ã=wÚcFh¤%æo"iFáM„øMJg DÓæÁ~~òÉJ5H°S6mêy±—!£wï‹úÞ}¸žÝ§é{÷@ü7®¢g endstream endobj 693 0 obj <> stream xÚ]Íj„0…÷yŠ»œRŠQ[« ‚Õ\Ø–q†Ò¥&W+Ô¢.|ûšDfÑEÂwOî_Ž“•y)†œO5±èÁÎÓªB‹ý ˆëØrDæfc#‰“U|oF§úºœËô1«êo—>Ý®…ÇΦ\7‰àq™×Û¼àXŠn‚8&Îeï8/jƒSʧ´ö¡8ªAôpºeµQêUÊ_Q,@I’˜v®Ý‰MgÙ0Tè‘Ä”&EBPðo¡­h;öÓ¨=3ß3=šç ‰ý`gêûáΧuŸ¦š}ËošŸ-›œË‘æPóëÙè‘åÈÌ?&éM´gwËØªÔþc¬qIhx÷^NRW™ó©ý~ endstream endobj 695 0 obj <> stream xÚuV pS×ýß²¥ï%Î2ä,_¦4a 1‰LÁ$ì;a5‘eÙ–e[’WlK–d-¾’¬}16–Ùƒ(20’ÔÙiHÛ„,mšNºdhÒL3“iÞ—ŸLû¾ØíLGÒÓûï½{ïy÷ž{ï§©ôtЦéÜu/n.Yµìñåë¶ìœ/ãWŠ4·¶Žþ8˜ÁRÜš[˜Æ=)থ³_¯NÿwNÚ#•¦¾ŸŸ¸—³ï##õr[ J£hêj5ƒšG-¦VPë©©}T¥£Ú(å¤"Ô uŠ:O½N]£¾ nRÿ¤~¢Ëéýt‹\§WjUºê¹¾J¡Ò*ÔÊ:uƒ.5SÔÖµhõZe…ZÙ¬k(Ó)õj¥N§¬o«+µJ9ŸËµÚÚ&­ª²J?>+¯mÒ¨4*JߢT+k”½FY)׫j5:µ\WÕ Q5*µ:9Qª"Æ5z•\MÖj‰ѨS*ø“êÚJ•B®®ÕV¨kkµje…~|2nE¡T©UšJ~ñö4e\SY¦•+ªy”“žÆ7µòr^ŸL¶ @&+\Î_Œ_Ο¥˜?É’Esó e²%ùËjˆ3rMþ:â%ñ /”¿¥V¡Rê[ògUéõuOÏ›×ÔÔT ¯ÑÔj+Ÿ›=7¿I¥¯Ê߬Ô)µÊòü•µ}þzy2?Ü‚ÔßòÚšºrÁüuµåJ­†¢èûHi†„íj =„n>ýµ8mWÚ>ªŒÑPu$¾Ç©“´¶Óº›ÚI»h7ÝC{h/í£ýT˜z†ÐA:D‡é¥{©=T)}î£öRÏÒýT>ÏŠtj6uš^E_K›™æ¤ ê_¤¯Jÿ{ÆÚ GÆwÂ%Âý¢ý¢a&—ÙÇx™æ§ÌY™W³¶f½œ5–ýhvYöœ=7ÑZãôW$f¢Vq_? ´@«4yVØÚMMýÐ'%‡1nÝfrM.ã=h·!ìp™!¯³Ód”‚ÅåѼW‚É`4:`É3MAÖ.W8Œv£Ý¤À W·Ïê…¼°?’‚ zìžn^€æï¼ŠÖ 5·7âñ:]==àcBæ€5ƒÍf42¹œýÕ÷ QE€NpKÅÎ(©‡ÐÑáî`:DQ<O¹iò8\Èkïho— -hE?{^‚Ù˜Í6hËk‹tDY1|ôJÿRÒ†‹2û­þp¯ïÛ†ŠÐ”‚€ÕåðA^4J¡×ä1x7¼ì€¢_"öºä ßß½LoG¤µ€´Í8ýi ñÏâ£hø(º|”áGò$*[ŒÖâ9h6^ƒ×ãYøq¼¯EsðlrÑõhz­fǦFÄAbv*ÊF2?ƒ/‹ˆ°Í7#1Î âg<,Ôâb<ϧ¡ÌN´”AÃBtcj'^Š%8˜É‚(w´ «ã‰›qz$ž¸Œ®àGq)’c+v(pGQ)–#+r =HÂlrcò91ÖãUh32"µÕ#=Z…7c#6Øq=}üHÄ9!Jœð„»9Á<(ÄÅø!< â'‹ÅèY)NìÉŽe" z ÉgžûÆV‰ï²‹ëŸ8}ÇVŒ;="å"îqÈã÷@8Å+˜l6Gò ŽJZÍv ˜ÁäµD»¸+8"‰X\à&à©°y[ýÉÔ-á¼É¦àFh“&ÏÛ'ˆý?æžBŸ‹£^¯´yø’—QDÒX33Otƒß²rƒ$É M¦n3tå¦ë&¬Šøî4Þû̶ñÉ62š%H|J’m«¼®ÌÜQºÒ¼ºCülæ÷þþ?¡ŒKá· |àër;œûúð=W”¨Èîv·c6€A ŽÀÚ / Ôœ¬z­š; lIy´_JRo‹%þLr¥5.@‡‰ÉrS´´°c{Eº³µ'´‡Ö_Zä/F3Ig÷ å£æs•‡µW·†7xÕN«ÛÊ;ÁésQÆÇ_ ´S½@ㇵÃFãæ²ýÚºšCîeâò†è‘AnÚo¸iƒÎƒŽˆ·}dèUÝrqKÿ`pæRœFø*ºAÈ ’"|õÍðÞ|>ÜvJ;R:Òr”ùJ#D-C,’b,–íz†9¦ŸÿøÆ(˜½9cþìž^ Ý¥cÚãúSëϬ|I\¶|Ùc˜˜¾íÇ¿}ýË¿H߆‹òXãѺÃê÷Š˜ÜD"N\1^éÎ ¸‹ÿU芄aô }‡¦²IÌ-’{OÅ ñBDþÑR)*œ´/âé€EßЃL.`ulô^âq)g$²KÄþ(მñu‘Za{—¥=¹mlLbn'\²3fŸ!†ÁíõEIi{½!ÆÉâH7@÷†€»œø¹Ø"â&hØè2ØŒ‹q¿%\Œê¬Qk ƒ¯¼„àð¶#ר ‰§ÝcŠ@zB=Ar21:*$7à2ˆˆ£8ÿ¥¹}qg'œxÅî®f“Ùužâ8æ&ž‡ãIá¤ýláÛý I›‚¿ÆPQu¨Bè“ÛªZ'mÀ[„-Ð20ýýln¢ ÞG^CMïÓ\úQï>dóZÝN›ÓÁtúÁsðT_Œ…£rÞÉ8ÚNÒöúß~‹òÐ2îî ©¸õ]š†ЦÐÖ`¥¯ÖÀýöêù›Í›HÙV?{Þ=89üˆÐ÷¼k¼b:o>aò ¹·¯Û»ca!3S¸ÝTc3Ðo„óž=$È™ÇòÕ‹K:ŒÍ­`!ºl>6±`Äß샃p~m¾d½l¹n†OàóC'ß{³ÿwàe¼6§•m† “¦«¹S¥®ª*˜Þé-n‡.ÐA³'`Cœ{k€TgNûŒ{g"#ñ-žƒU³¥°6°ýÕç†ágИèî‘dšÏEO¬B÷“F1ë·h&ËkŒq#ñ ÷‰Ñ\üćø~r—Y%x&›ˆîÝ¡9hÑЧìEøÀô†êó]Äuu MНñ3‚‘»*à~à~%öFœ<C¦€‘í„.‹¥ ’Ç$ØÀ72ó]Öhâ+"O@r%ß•ø[½¶DÀíóò¬ÞˆÝñÑb’¿ §b·¸7v»*ââQ™0u½Æ6öÖBQumˆ$ÑBêÖ`¢T“¼©xIo#;d;º—1¸YåP­Ø_¥Q:º­Ý6!B§‚ÝÚ.W†v¹Äg• Þ%9T_Vž«ùÐxŽô-RY¥$Gk{v u\µH 8à \2÷U5Æ4ÁZÿŸ¹o3·QUÅ8U,…J3Å ¨_ƒiKÊ&c A€ýÜv~Æ ‚ê Å_9}ò¬kЙ²¶ªg÷ã°=”²FP]€¡Ýg§VUÀ˜Œ@b<ŽþÛpud‡Û”BOPíõ·UÇOvž0/ÑWî…M•„÷îâ¨4¤ /{îT²q™Àbµ´àåÉ}G—½‹øÅáJÎ DÖzŒžŽ(ä¥8i§Ö.áÊ%JGxÇP»Øæ‹ëø™0ÆË¹—ºúº¼Æ;œäµQI²\‚K’eVÞáÖT—Ž@O”Ç\ôò Ù„ îr¤aÌDZŒ»yÜ67MÀ=ŠŤÌvFî¼f¸xøÛÑbIWŸÝ×ÌÝœðHÞ߸µu\ø“DŒ¼8}'Æ+¸<ËA+˜× VÒ|ç.—tt’G;cuwùX/ôEC~¯§7ò£É‰ï€‡²ÞñNÁí"v|¤Àƒ+ÕÌÄæL®îHb)y{($b³Ò ädúr²œ9Ùñ¬xvü`Nù݃¾žò^à endstream endobj 696 0 obj <> stream xÚ]PÁjÃ0 ½û+tìÃN ;…Àš.àC²Ò´°«c+©¡±ãò÷‹ÝÐÃèé=IO´ä'ntzöV¶ ×Fyœìì%B‡ƒ6$ÛƒÒ2lUÊrŽÐ²®#­~n.ïe}üÍØÇíZeŸ °R®‹CØo5?µËp䦷ç€^Ö‰Sð ì¾”íð-b?^¡×f€Ý­lÒÎÎ=pD€‘¢Hã²çMÒ*œœè…äŒWUAШ½MÑõò.üÊüŽÌ#;$î†FUô÷²'gï×½é ÉQ\® ¾þ䬋ª¾Ëmu endstream endobj 698 0 obj <> stream xÚ•XiXWÖ®¶¡ªÜPi+BbºQQDEq‰+Š&ŠFqµY…€¢ì»ˆÈÚݧ›}U”V@d¡Ä kâÄeŒ>q’¸$ÑDc¢§ð’™ï6Ädœ™çû¾ùAõCÕ­{ÏyÏ{ÞsNÉ33F&“Y,]öÁòe®cç/urŸèhº3m%Éj¦ïL6—Þb¤¡2éí^’R. 6{›ad>ƒè•é`º>hºŽ¡«{–Œ™LÆG'€£ãäñŽŽ“懄ƅo Œ´½ÁÞfâŒÓÇÙLrtœa3o‹øÆ >Á6K}"ý·øDÒ6Û¬ Ù°Ñ?2ÎfôÌÀÈÈÐw'Lˆ‰‰ï³%b|HxÀlûq61#m\ý#üãýýl†GÚ,óÙâoÓcõøžŸù![B£"ýÃm–†øù‡SkûZ0ãûÎ3[Ä|À¸ÈWörc|ø óp–>`0™AŒ%£`3ó3„±b¬™7™áÌÆ–ÉŒbF3cf<3qd¦0S™iÌ;Œ3ŸYÀ83 ™EÌût×ÅŒ ³”YÆ|È,gV0+™UÌjf ãÆ¸3k™É½cÆÜf:eÓd»d÷z¹÷ú‡üCùs3ÙÏæÛØÞl<û‚‹å>ãÇòí= ÷²Þ_÷‰èóußâ¾ûùô{Ñ?£ÿ?,|-îppp`êÀGƒÞtzÐ3Kƒe§b•⯃§ þN+è…Ço¤"i,^º‚ˆÏDõÙË8xw½åsd0€þ-Á!#QœHêô† å9¨"Y¨æjôÇ --mÚÚ~¶âBi,G¤ét ­µâ+†Ø=a¿úKÃwÊ*0¦ïKŒO ‡ ¼_UXý᪊æ“^—I/åûà´cùFÏ£® <áȘ@Ò_e7W}“<û×íñü§»aDlyÂ~s«æ ¥Ê5û>JLÙ ±”|0ž·À뀎²;è(Ç·…–À:oïÀ@oïºÀ––ºº¥…td_®,“]–\å’¡s¹]9 ç˶nSFCú¶´m]þ>Þ*};¤ŽÙ•TBÊ.ÎÙÉÓ—“ê¥oëe­8cq°\ªÄëÂc¦4’¦#Éö£õd+¦aªãR’t" °roâä“ð tÀuø$ïdу«åpšc÷x•~Ã`¬ÇT·mã]¶mÓ! JiâÑ2nǾr|Ñ)öBA˜2 ´œ:ÛÕÖ„_ŒºŒÝús{ø®¢RsG3ŸC{ûs8J‘"6œi„gqXƒ(;‹¶¸iB–`¸ f51ÉK¶¥&¥Í…­4v¬Øx²¥õ²_]á{¹%ÃH‡¥—K(¯iÚ{\ '}v%dU•7Ö·mÑ\,ô_ä¼€x«ÄíÔ°>Nšg:5©¥мñ:¾ÝÐhy HT¡ߦ¿ Âà¯ø«ð™ñÆY¸Ëßšs‘žÔwÖ’÷¼«CZ+j+áãÕ…úºGóªÿ2sÉ&$êÈi¾Z­.]·C§Ýi¼¢+)®v+²({w5Œ¡ ·¬õåWT@3ßTíåê>ññ‡(à¢?}«¤gCGð]2²ºc”‰’3ù’K+ÐQx,Ž‘f°ûµÙ!”:Ýöòs×Vjl&2b¦æ2¿…–¦{PGÖ¾A€EÀKæÝn_À¡h[ÿ ´<‹o¾s 7ápŠЏ‡€Ü̇d´2ÖhÔA ó?;¶–¨œgŽU‚×n—Û^¼âÁô¼\aO͸SzM¹s{)™éâº<™³H¨‹C;6 ? ëùé[]í]OÜVÂíS-ue=¶qP{=>7Åa¨ MÔñmÊ–7ñ¬ÅSòò„ñ~Þž ! [ÊŠ2—@+_yÀÏ/"ÌÑ W”ã8ñ+̧q¸XDvá£ß%oåsq zˆ¹ Wy"÷ÆÁÍŸžÀ/Tç`ßš¬E›`lä]ÂFNWZtvÒL%J‹ËdÍûåRpç!©r;ÄCd¤¤Æ}×Vi š”9ÀG«ÙªÇÕgà0MN;ŠU Ï,Ðëc+4²çÉ(óqtUæ÷4Uî¿J•GR€,©6'±¬Eç9z`k=–Š–h‡Cð4'Ú)$¬–ú XŠ‹¹§»gzÌ^¿tŒ Ùx™=Ÿœ‡[üwS¾ S•] ÕÈt=`¿F-ù±øîW÷Ÿ¨à‡©WHß|~*¹,lÅ5lˆPë}ȇÒ0‰ßd0±¥Î^K¥—¢ì2:HšvygnçDaäÇ)“A«MIý`¹ÕÒãïï^DEÑ@ˆ=ñ!>T¿ìÑ@ÃcŽ+KÕÇ«!tñ©ëþËFÁ,˜^îvA}vûMøÎd"séÓO>½Wx’Ò¾Ÿ³—(2cõÚ}ÀWê •*‹—æT܈2êúPiÚÉÑ®S!t=0y3ŸÃµ8†³ CÉÈ:U—“šEM×Az€£¸OáËØvç:÷¼E0ˆlûš Ïõ‹&o]F‹FgEµNÄ‚S¦­‡ãTQÞ€û©ØGeÈ$²”ú4ë:Ø ¼ç©D¬U³ó’½Ç(WaŽcq*T:í"ýy‘ÝŒiæ¿ÉL Imê´d-^MŒè'J}DKrcpøºvEBç°SBuèù°\àK x§ =¾¹@Íð[1V÷³U£í(N!ÒÒì–”SajÕº‹Þ‰×à[@³²·7¿uøxñïPa÷zhœ>ž_àFÝБ ÄŽl ëq$™€…*EÂ!xf8~‘æÕû€;\ŽG(°ÈЬ¯Æ<<ìÁ×dK¡fÕ\sæhk{ͦbÉr‹þ|ÏSì†tc—²0žL"”¶ÿ·DÖKCd°Îkø›öbzÂv•³xùùï¯>%ýf’±´HªT™T‘Q`MÂM«Ï³¥Ó…h"4Zš\|¸)OÎBã‘“Ýf„S‰×Ç‚©îÃ^^õVt=É)J/ë2ÈÛ™•5±ÒwËÖg>„ææGPor¡ö1" 㢠’Ây‹—V¯:%eœ’ãéΩBR‘Noê¼âþ{cÊ8)½ëË‚ízÝ.°ÞùûTÒMöêõ2Ë3 pø ‘õ׸‚Ÿ[7ÐÜn(ÕíÖViô:ˆâ»ì)Æ¿$5w²ÍÝÉ7äMø€›ÉH*á$ލÈhòÙ€6dÆ`<-O#ÑGÙeF.ËÁé€ïç›.¦\ƒ»p9óë£i¾p¥â\†ÏBš>hX’5sÆ$Ÿ…žNÎQ«Mù`I3ýï-–—[=ãgg·*nH£¤I­þòWÖÂë–R~O7î#C³"@k¾²÷©pIïRh ´ÃÓËjEÛâüõ¦ô™?v¸ ò0Fµ¯«MEY¯xx?¶T³7zgBExðëÃŽPÎ2®,íu»!; øH‹T‘Å\,$ïVæƒÁ—ÛÖfõ麇i´„㌋hþT¥¸(÷Žãjw3ÛíeGDL¥TL¡TŒìœ.ü6•&i´öå£yÁ´þV×mâ fOg¢Σ—Ó&8H·?çp¼W@XšÍ/yŠÃO=Ä–T§äQÒ á¿ \ކE¶Ž¶@óµ8äŒRšB‰ÆùÓœòö¶•ã8b ‘átý{Óúc1Ô¬"ÅØÉŠ²ò¡f‘ò—§%"ä”ê Õ™e#ì^äBuZOÿ¥@÷à*àT%‘¹]+­ˆ³äiþƒÉ*ðö› ôù]®ÙÔwüúŸŸaêo²œ­Y;*Àº² rv¡“´Æ ºÖ¼v— Ä™´ú-"~xê-k°÷lZx§ «ˆ–úÜ6ƒÇ/ÊclY”ïK„DÕ2=Ã>žêЃŸ{Wb‘1Ù«.vuñˆÒÀäÔè‹€¿Yç3Gµ‘jÝ ÉM2’‹ã>S*¢¿±yï>' 㸱ÃÝ7Ô5u 8©äx¦‰¦Ô £ôv=®è ‹Ù8X‘€›¤‘¶qÄ9Å\Í]Ì?U×c‘k?c®hÏKi_ý€2ÇþÙ7´­¶vxDFRt‚µÁ1|é0‹Û_w¬ªƒ®±ÒßYjXæìë‘Îàwz‡iÉKk’4Éè ãD »¤±BÜVm4$ó¯|¼KøœdÑ<:©ñÄúÑ8Ó"Ÿ[² v(ã@§MO sYëNSCh×vhG"¨ê TS¬ùÝ5Q’w»f:'› MkÖq¸$Ç\ä–¦B£JúõŸÝ$nœ¢}m£[Î&ºë¨á“ét`õÝ8M]¼ÇÊ«+x¼dF2¹Ä8ßU´!!€ý¯ª(wNW6V ªá,4í ¦–§5¡Ë!|·^VCOù^.ùb°°·ö« :íÆÚãÕ¯Ù½î1eŠ-DÞüi NÅI-ÏKwÇBº*´éi[£×»-¦K†éÐú„ꙡQÄx¨²©©¨ °7È} 9鞣1´^F¹Ï<Àrì--~ŸlÙ:}«¡­ár·RO¡“-'’þO9ìõy~…2²!W›” ±¼w]låÁcó‘€ÖYö„ñ!æÝóªG=ŽûáZ=F6[ÖÆyÔ[ÛU³(k|Ë|k"yE'˜¶‰Nœ Yëš‚5NÑà»wÌE5:ß>w•&BÊ¥÷kWøÆÕ@H×{å&5Ðé¡ kgN‘¬°7[æ°4Ào5yƒô[×Övþ”¨(Càw~È(óYôFVN ¶@!; ?ohh<§=Ð=öûs(»Û~©Ö=GIö-Ts¯?.â~]Ýh§ î+"7ðøý?Êô=@ħÐÑò6:’>È(b¤´F N¦EçºYw‘îY­o79xBkŠÒRNñ´@º" ¨õyõùàH}íQŽg=±vë=GFN[µ‚äñZ¦§›Ö‹†úÃǺ7[ˆ ®j_^NYÉSbi•¿}W hød:Ï)ÕÜAÃ=}v}­Îôy#žóMVâ.2 ¬ð§%…ù¹WÀš ¥&ÂB"MB¹25y)Ýß9h§Èñ&3"; ÿjÃkŸN¸ž¯=O;ê-»ÁöéùS´Ó_IèFàßA¿×~±voÌìÿúÿñ¸ˆ{æÞl«t·µa1'dúÃpõ ráwáÈ\“­Šöž™ˆðO¦Q(Zÿ7³þ?\XãæÎÓï³Z{Î’®SåSôˆB®éN#U|sÂS2¼ã8’X“÷íð=œyï)-c$¸DAûž ZáDiížÃGŒípŽlÝhÜ«è|7Ctº°$kDV/É:64ý¡æw0ÿ&À½¾¤¤©ùdÎ^௜YF,É0g·ÅªmT=O'ƒöð³ÌZî0õc~îVwÇGÄV5ÖlŽŒãÛÿ¤™¿ªKÿ¯¾sÒŠc1ŽXeª%Ìs´ 0zá7šsäÝ?5Öêëš4ŸSܺZ?)uº¸­ÌûÖÄTUÕ›N­®rS*ZaÃÚH*ªkÓꥷj,Žø\ÃíôB@Qø(wq!ˆüҰGy‚³Wéôé¯:ª/zª Ђ_lXq`Îà·:Á QÁ†²Ð²ø¦À†´[Ûè\]Ÿv3–ós'@”r„ÝØÞ’^’Û^uQ²ž.* `ÜIûÒ™†¶ “P|5Ž¥‚–˜ºÀ4ì~UA9³Š©Á+iø‡ˆsÊdÏh<úˆògÒ0ìçlîE]û¼õì å)µ;·(("d\Þ§Ä*: “Q¸RÍéìÖ­á¸îBpŠòóOvÆJ‹¯ ³8tþ£Œ)Z%Ê´%‚¼’›á¾Æi¶¦â´½ödgs'êG¥"¶®CÛmjä³ £4P”UJ'äR¦ÔOÈ)Éʽlj‘µÁºðpOC´)ó÷TiRT´)Õf$Ó‚œiEXi~Zd7i'ÒFÞÓ`êÞ.s8¿«_Qx1m]¬K¡ ³ÀH+ñµžý+:¦þ¯Ÿ]œ•wδ¤v‹."Tmˆ2íŸß®KRF“¦Ó 'ùV„ÅCægD6Hç¦ÝâãcØJלãŒkiuaZ5“¬²Ž…¦E¾Z_ïf/ÃÆîEèÐÕ'7þÎ+·ô9Y='E¯Ýã_i©l¯t^Ž?¢Ž |£¸$'÷K“êjÝtéák !&ÛJ H[”š‘ÚŒŒéVöÈ™7‰l˜ÎEäiØD—\㨺»!Ä.>6Öƒ5å¸á¤>»âcm™é[E\lvŽŠf™>7ï1ʬ°yÃÜOÍVê/Õ´jÑ5 8‹¤Biy>z Yâ‘ˉ}íÛ”Û¯²úõWö1›^Ö¯·¾Ÿ…¤ü?£¤G$ endstream endobj 699 0 obj <> stream xÚ]PÁnƒ0 ½ç+|l5M„NÚ !utH9´«|@H ‹4’È„?’¢v°%?¿gû9«ÄEX »“S ŒÕ„³[H!ô8Ëòh£Â^¥¬&éYV]¥¿É !û>‹»è^ªk+rþÚµuþ‡¥]=Âi¯Å¥Y瀓°ƒƒ¢`°‰·‰s gízªRü·„mn endstream endobj 701 0 obj <> stream xÚ­X XSgºNŒG¥´Š±¡NÏAÛº´jµ‹­µvjÕZµŠ»‚ЬBK!{ Ë—„l„$¬‘= ‚쮨Eq™ªÝ쨻×ν3w:íüÁý3@;Övž§½Ó‡''OBξ÷{ßïûÞÿg2ÆŽe0™ÌàMËVoX½õéå붬^¸ ðÍ+I´ù¶Hõ€Ãÿ;¦ÿ±1~’åd,ùÉš±ÿóƒÁ\= _ÿ÷PàúÍÃët|y4n2c,“IdçÂÏÍ_°àÙåé‚\!/1)+lvÜœ°…‹¿87ìÙ ‡-KMòâbÒÂÖÅd%%¤Ædá)a›Óãx Y¹a³_IÊʼüÌ3999ócR3ç§ _37,‡—•¶)!3A˜öFzZVØú˜Ô„°ÑØç¾-OOˆ²„aëÒã„i8ÚñAcæ1V0Þ`®cn`lfleÄpŒTFs"#˜ñ$cc6c>ãÆBÆóŒEŒ×ËñoW2Þ`¬b¼ÉXÍXÃXËx‹±Ž±žÎØÀØÈØ„WØ‚×ØÆØÎØÁˆ`D2fŽa0cŸ1YKYBÖ­±=ÈØÆ1ÆYˆäñŽïž°nÂÁ‰™oå<øØƒg?Äz苇£'ÅN~l²(d~Èå)›§ü‘³iêSU¬çNâžóë‚ý§éoŵ÷½þPzüZƒ—)D_Ÿéd¡ÿ´‹½œn7hµ†n;°÷0Ù U5_y[I?˜ˆb5hH9 "éfñ[< 2 ÎM JmõWÐÛ\£ÕdÁ¿sj ¤Õìò¯+ÿä:‡‚!´éj„{TBæ×zëËÛ>¤'€¤ X/ §çÎã®aç)@,w@)u–ý=¤ŒTDÊ#C5²m‰ ‡L•7ZÜÕPIxs‹%BaNÒ®nq ùt£™õèI"Ø?x¼yW+ðücΰ†‚‡žã˜¬Æ"0@HÈ|vv†X•Ä5°¡ØP_&tòÍ —€xŸ~øQ,+é¨v+v+¢BÕ)²í‰P"£¼ìþXzÄûÉÏ¡=^‡fœEïs‘èÿŸM‚N@×9%ç<7<åÇŽ»;Á=P#ÎÐÈD &DåÊR²Ê\–bÂÈŽ¦W<|ûŒ½üúj?«¡öéA´b-ì¿ 8é7$¸ˆÝ‚"'Ñ4pèMQîÒ[á+íø€~Òȵð¦zçúÔxM‚žBÐZö~´LŽ}•GޏÚ1¨ÎƒªÛçm:õºs'IOƒ˜WsžÌË]ÍÎSB®Ìe˜‰à U”*JªJ’E&D ½_»»rŸa&ÂêѬô.iÙ«é?ÉÃu¹y[BÕBH HNÎ%ˆAhÍ/©(ò–CÝÈí‚,ÇiI'yN¾Wìn¨E4ŒÂO1?AVz…s*Àæ“Õê…"¢D…õDogç`…jeú‚B18Úr2xH ¾!¦9ôæ zí}ŽšW ^„ä®°Ð6Úˆ6#¡Ç_þ+Í¡è ì‘ÿÚ¡ÂWyƧ×J‰«S-6c3ÿž~5Š~„‚ itø¢Y‘›VÄ,â v ˜mXÍÅX‡ÂÀ‡ùPï~æÐ«­,t ý‘sƒ}Á‘/  O+ÑJôƒt„Ü E¤ÌFKÅI$à‹Œ°N9èHt…¹¹+$—€XÊ>JìÍBÑxöß½)oP©ë² îÈ"n0™Ê÷¡•\smd1¼s”4TöƒZE4Ú|úÑáfî½IÀ§Ú;Íí½‡z‚f8J "LJÉ~ì. ŠÀTäÁpÜ"’úüOú˜è©OYCo¢ŽuŸ©¸—ÊíZ‹ŠJáéøÑQÑA3Ô2ÈQ8ÁCÙÙ.(3¸ U:»¤ ½:]ô¬^‘š¿EžÄÜÅ@¡ôW£ç®#Öů¾êýˆï<ý<…|œe1XFÒST6€´ôX1Ý&ƒ]IêqP)ÞZƾ´±4:–æÓ"ZN¿ð·éhõ¼ßÛÐêÈô&:q阬f'|{ʨþpûÖíI~?ÇÞd·Ÿ¢Êå.5¦šžÂaº¹ô×Ãg¹›ýýzo å…Ò¡?' zÊp Wº9A¥'Ô C®Êª³Qû;¦_Ð k ”—hŒrj“I_ 0ƒµ¨…úë¹FöÀð·¦<Ðx Ô›Õé?ÄÄ_ÓÓ‡ÏRú5­Ímm­A3lx=—r6‚ÝAl#¼HFò±†²ü×9¥çO™Œ„¹ÄX6JJ²ŽÏç¥Í(”Xá08¨ãz{–‡J¯Ñ«é1Ãk¹t¸¿¬ Ô`ÌÆ8'ý€ÓvÔÉèuJš;\Ç•nÙ+ÛýËqrü%\ľeÉ7êÝŠŠŽã}—E[-:‡ rêg,ôºÄAϰÑd4í¯hüàªó4“¢û~6ÙÓ†Û¢Û¶óÁöŽƒ÷'' Z7sÝÃq°®ÙOØ—e¬¥ 'Nž¤øq8Ìd6žÅ"ßЂz&Úyí¹Èš0´”s¯È qV)¢6sãßYaÌÁ÷KÙ &£)ЯUP€ûº^¯ÍßN'pqýë°À ,Z+i£É^ì,©m*vµn=ŸœzM¦ AÓ‘Ñ$ôÉÍsëÅ–G¡‰çÉk‚âã>¿y«~Õ22 ­È åÞS,e`dàrúðç•‘š¬Ká'ÿ;e.6>hFì'¬==<•«æãù $è ÁU·HØÔ:4;»ÂëŸV©÷NFŒ‹è÷!¡¿žæ8#[³[à—Ä‹¨†[än›Uy%É ÏPH„ôˆ»ø¥|L‹ž@Ï¥g.ê]ù!òÑè®j?Bœ@6Î.z£š¿îå-ºK}º‘‚£>4¾¼³f ÷hÝ5Ûc(Ð õ8Òhé1zbÚZ¹0zå µ]íñ2јË(æ&Ë¿Êÿ '¢bAOHœ’}uÕÞ¶#Ñ­ké‡i=ƒž9ûôêÏДñXÔN5©Å U+—Í{V›ÄVaO?}ußÕ>páhK8¡GCÒè#,±ü'~ô´Œ›ïÔÅÜÇÅ(¿ŠnµšØPÍQ§¬_²ˆŸ²f‡}†òôbIqv:ƒö.wHàEKpšØ—Pa ©‘„Óï˜W\m®ÉFôî=¸výøLzåÂ˾ù7)Z£x÷ mÅ=¶:Âêåt¡—¾5ѾOÀ›N/†d*:{¿ß?Žš¿³ØÕ7bÓ÷1»¬øÎYÊv`.÷\¶·:ûà«ô.Ij¡4rFÜWMMeKWì¾Xré©^6=Û/Üòrp^=Ø~½><^¾N[ªæŒ0vPf…ç>ûÕ•ÝJþ :Ð^Û@p`%Ýòúƒ½¸ÜúC¾C_öq²_”Gd§óBãvÅA>È ÎJ{I”.UEFnŠ4>®5wü®ü¡â bú×p‹<¸ØŠF‹MYjmò´AP K£gÓÓZ…‹í»cÐÕQRB\@nN½FÍ_¿ÛVý'‡ÑøªC5'º{qÆñ¢šú‘Ônž*øÕEFÏþ”kÐTXÿ G~Y®2³³ÈÓ„¦Úê-^k•Åë8`4•7U6u»Œ‹Ü•MÁº=ôDiœŒ§SA6±§>ñð×ûÑˈ e€»X¾Z ˜³ˆlƒ«°¦¸Ö^]ÙׯB?ñño$ù&$%¥¤bzz4þÐë“Ñ”S‡NÆ|âGƒèqνK¥ žÆK©¥Æ: j]Í®Öóè÷Ü⌱‚8™P³wžS8ÒÉ]x*¹͵_÷átfaçHÓˆS_âÊ’åøOš Åª â«cßjFO‘!Ÿú³859vi¶ ']X©vWÖW4£ºt\ó;GbKDIgvÝƦô=œÞ¢Rp‡R»6ÏÞFÏÒÜy4­¥5çÚÏâQTcåR щµ’¹Ã“¸²mñK×A.Hízc‹ÓÜ„ûî]¥ìmÍî&¯Àµ U7‰oÑ£C‹9õ"«\˜™™)+Ω®®ñÖ£õ˜Vwùºk”éCçOßüÏ™n[½Éq íᶞφ ­NŠËVƒGÏòCÂV²¼ÍÎ o›{`tz·ÅÈvˆWíB ßWIÁ>[½Ñb©ÂöÊWÖ½åØç®ªªó?}°÷(T€Ma4Äh “@ýú6w¹ ¢cxq›VK$IyXXÇCœNæ­3¿פa× -Ì|bdkØ•u®š²÷ù»QBè 5BnÞJqLú{cðPÿˆ™(q­@Ûp å¡åœQ黎€©¤ªáhWÿ% zaG>Mš^µ†vqõ†BlGöüJ²Êl¶Švô<÷ßÞ÷”ÌàÆÊ]äJˆØ“ºG}i{E„Cd2o·æ¯1!'K’*Ž“mÀÄÞ­£Å[~¹âˆˆZHSÜ‘âktßÏ[Ýée`ÝácYƒ»ºçÃ+¿Uå/†á2ñoºýNèxš—\fù­ÈÇùfÃ¥çïŽï'έ»F4Í"i+]ɉßë{OÀZÄj:Ñ:p¸·Ò#õ{6P-z‚ž¶eGTdÀ'Øém>4wdmø;¬/è)x„ªuñB%±ÆRh£êÌõMûvÞ…w€Jîk1ÞÍÚj‹J ™\[^MlÀ–2ÑD4Í ø*¢Óxòþ¨á/C_M:q:‹cßöêÉŸ55•7í¶°¸dFÆÖcóÁò«ü/üPMj“ŽT@b’$]ÞѲó>sÑ­µõuñôB®"Ú ]k dxÏ0²qij177hº©ÍdÁûv=*ú•îb±¢ ]ºêÁ™ƒG½uà{ç°@=TJ“:~à,w‹rŸûàñ5Îdò HŒˆ}ñÉÿjpÇkIÒ\…÷íkhþÅ£ÞÉWnjN¡Éoïz?ä6ÁéVö(a+Á,y‚ÁF‹äØ1 tâìUÈ\ÙYéyQëûßEOµ¡à^>]Zë B¾O·&Ú¡‹¨®ºx¬ƒV¥3ž¯U pUXóªËjKºzc®¦ÇÇ>½ ¹ ¯^Öã< ›Š‘C¯å•X!¸ï¹°ç¹É.sÞ9NXÂnE³G]zèˆq‚2[›O?Ç]ô¯C¾k÷ŒE4ÇÿŸcw«Q`PçæîŒ{mnÕPSz÷ˆ.Øß|§hž@ ±9-öO œ2Zp»tª=9d*à§~îáæ‚^%§§¥âv¥ên¦` ù‹š‹ö*‹ߣɾèùIôì‚{†¯ÝW÷ÍÈðÕeàá«Hã3Vf,ƒíÄóýi'È>ØßXÝX¾µ« âWìW~ØM0Ñ‚÷)´ð˯ôqZä¾´,aV 2›Æª©Î0óqSJßEÑã¶*Ž6“ÐßôiÝ{–R«çG›²('v ΧF¯ô¢ÿ­%ƒ‡æÞyøÂ4ññÓF¯p4é†lŠ”—¶­„\$œ¨ýÀ÷±­ÂòËAÿ2@<;¯6³)½GWMÐâj<æÙÛ.8 g ³£ñÝÆ‹Ñ|è#~-ÄñgäÅŠ¶ócw!éè¤Àa¬vvw¢W¸Voq;v#œ¦F WãDÆ)¼îk(ãšÛËìDGYþ4ÿSœ8%ì½s¨¹cKÒÈ-©‹ÎDÚ…@ÌÚJ?’ÀBŒŽ¥´î“ãÛh¨ÈŠÃX䑪½ŠXƒV±[²&{I8ÞÈfBž»Ñî¨Q›m• …ÙÉñY½äahn+k¬ÜtDQ Ä·ÇУ•æ©ó…Á ñxË“#(9NAµ³Ë¾ßÙé9kov¯;yÌP¥R !—Žñô]ëõúŸ¨Tx'ÿùfÚ€çTÈ÷h¨–“@/^¶'ˆÒ6 …›‚ÑfôYJê ”¨’8såñ›·wðNb“ÿå·5þo?9z0|ŸìqCþ¤I‹ ßðÛH>äû^ðU»\D°Èë_îD™¦R/›ŽqŽóM¸8Ñë "'Œ}±2h<šòO%ÓÁ endstream endobj 702 0 obj <> stream xÚ]PMkÃ0 ½ûWèØ1F>e‡X]9´M»:¶’Û(Î!ÿ~±zØA=½'é)áõ¹6ÚCòMV6èaÐFÎv!‰Ð㨠ËrPZú½ŠYN±„_„»Š !áíÏ©;½óËýó£k«ì ‡'¡]B¾×õ¹YgSm EÁ’û6oö´ÂáKÙßv#…¤Í‡Ž7iç~qBã!eeÇeÏ‹¤U8;!‘„‘iZBQU%C£þõvE?ȇ ™mÌ> stream xÚE‘mLSg†Ï¡¥=@a+óLT8=Ý0vPXÂ(8ÄÈæÀÄmµ %åHùH)ƒ¶Oéu)¾&ÕÁ†™†HÐÄŒ0t8ÜŒ™ËfpŒ÷ÀÛ-k÷gy’+yþÜïs_/I…I’’ä̬¤÷“v'§ÙãÙ£s±mcjýŒ7Lð!$Ïxñ2¿YB„Kêáo/y¸ô²‡;݆Þ$)ò/7X÷« 8¥BñV¸B•¬-.×ååj86Lµ‹Œ‘³Q E,»¯P­ËS)‹Ø4%§Q*9÷RÀfhUyj®œ ‹×p\q\D„^¯W–„ku¹ »ä¬>Ó°GÔ%j]©ú$›¢-âØte¡šõîA²¶°ø4§Ö±iÚ“j]A’#îš „áKH‰@âbA>^I‰CD7ñYA^÷ŠöšHySÀ†,ðØAòëïÒÕ#Ô¹ÇÕz¼öwdP]5˜ÁLÕ´€Y׉Î7C« ¡±®rEóK4q]ôvÍŠøHlëÚÈp/fhÛè–vh—Á§kÕ9‚è<”(Ð(òCÛ&®vœ³Z¡‰jjh®a*!;«ö ÞŠY-N,Ì=Å©(x7õ*2¹co! Ï*‘( ù{¬ø¹¨S]½ ÀÜnD,Þ2„ü5öÃÁYÇ«ª,¨§êmu­ŒÆ'Z΢­ˆ@©€$îðÒußrtõ, xš£a­z&ÿ»–âº3Âñ7 ÚÜ$s|m¯½}ußݲIƒÅÎñ?†çlË0CaÏÐyb/]­ž†§p nÃmS]+?µöÂE¸]áP´gÂ^8ïA¤1£t{Š!òî :ñ§}†Ñ ㇷcéþœ£2w_‡f’ú²·Ç9Äõœ*ÖV¨ä+iH„¶ÕqÚzyêžís úækwÈà"¥¡²°€3§7”Yj-PEÎÂyæ?‡h³“ÿÐ-qîGϬo£ÐRÊTÅRcÀs.UP>º´Çm°:áòEm0=ÝÝ9q‚©mXöà/çkâ½¼7íòÆÍâ€Ò.>¹i[[ºDXÙ&vúÎû 4I$óv‰?ã+ŒqH|ÐÚ¦€˜òõ endstream endobj 706 0 obj <> stream xÚ•X\ç¶ŸuagDÅ: Fg!6ìX"%FQbCQ,(–E@š‚Hïìž]Xz/"ÂDa1˜(j¢Q5רÑg‰I4šhô ù¸÷½o–ô›û^Þ~;óíéçþgdŒ™#“É,V¬X¾|¬“Ë\÷I“¥;ÓV“Ì!f¡‰æâkŒ8D&í& rq€ÙP†‘÷¥WæUoéú tC/C|û1f2 ööS&ØÛOv Þâçãfc·y´Í¤3ÆÙL¶·Ÿa3'Ð;Äo³g‹g˜¯w gý`ã¼ÙÏ;,ÒÆn–oXØö7'NŒˆˆ˜à:!8Äç­Ñãl"üÂ|mVx‡z‡„{o±q ³YêèmÓeõ„®NÁÛw†y‡Ø¸oñ ¢Ör¯3ûîs¸Å=×3ž½C8†‰`z3}™~LfÃ3™AŒcÍ f^g†1ÙÌHfcÇŒfÆ0ã˜ñôÛ{f3™™ÂLeÞ`¦1ÌtÆ™Ë81ó˜ùŒ3ó³€YÈ,b3Kf)³Œqe–3nÌJf³šYø3k™uŒãØ‘1fL“ÍtÈfÊšº-îV w1³3«7i^¤)Ÿ³öl 'pi܉îKº§Z °¨íÑ¿‡oÏñ=Ï÷ŠìuÒÒÁ2«·mï=}úô‰îs¿ïš¾'ú é÷¨ÿ²þyý;d8λñGö˜:ðËA©ƒÎZÙZÅX[Y×58JL·o Xsp¸¬ §ÞÀ©rœ!^âÕŽÛ\Ü6&&i4Æ%æ'dþp­?ÝvÒmÓöm[|j|Ú„:(-ÊÉá0qàß?l‰ŸÕt‡Ëq×¾y[ý–-Û¼¼ ‡ê›KñtœA|jµbOŒÁžr±¯ðSHØ_Žsñ_<|œqv߉ʖc‡>2hL¯ñN‹ †íœOmXÃ^CIë™Í¿NúGGR¸H& Õw7ÐmÆ\#=„X ›§q(#gøÅr"-'Æ7AÏaïöã§ŸÂÌQv0s˜©K*hgXH¡qC ¹hózê8â£H2zOœ.$S§Îå<Û˜·(´¹9—JòôY_B1p¸PA8bàêJ¸ÄI°Ž[p r„(,ÈÎ.(†|h_ˆfç®w9,> ¾ÞÄ37åb/ÑŒÿ`暑pƒ{>±•Ȉõ¼ÙcXU»ìÚb¾v—3¬áûÌ ­ÐîÞMä@Ùmîû8²à9‘\EͼùJWu÷èÆ…xEªVlãH÷7xfvCÁÝzæÌ';·ö/¸zä½£µ]T£ÅIþK yô•úm¾Ëϲ„Ø à“^\—UQ \ãö*ÿÛvošÒý9=;áKÌ»X@¢ˆ0z&J”߯žB |PÔp™#ŠÕ¼Üúî1ÜC™ò±U‰î,θõà±¾þé¥ÇáµûnC÷Èá&™*UäS«p!û¼Âqíü-N¤»’Œ&_òøz°Ø½„0—ø½IX¥eG{œה㢠ô2Ê΢­¨m‘w$tLå« c§ð¶“ÛÑÕsÀš$‘ dÙJ¼p4jtF-Ñ¢$E­L€ÐÄ'’q„_3 Á”R·s¾Mþ'ø®èjÛ©óןå…뀽<÷“yºD=­.® tÕԀ爟P'‡cqu²é7'g°¸í¨óÛ0œŒÃÞÄUI\ÿ9ˆŸàö\ò;¸¦Î«lH÷è5¾ë}7,Ø6‰¢{G8 ^‹‹Jr­põi5VQh'£·:’¹–í±å´âq®×le î÷T¼à9VpÅb´Wàx0,*"<×¢ÂóΩ9lUæ4+k¨à:úû³à)T°E‡#ßù ëŒ¢N‡ 8ØþÞ—Æ„5ÖdçlšÛ¥cnÒ¦±ÂJ¬Ãa œ5s I/ªÃò'ŽæÀÃ(öëJÀdŠs ¸›¿aT„ªmÀéBXÚs¸ mG°Á›C"b<)ÄÙº\Ýr$ôcÀžð¼äÒ‘öÿg bÿ÷„*/ÀEÍíü? Í.r‹•–?É©·GŒXjìòö¦dYhÇ þ¥QD-óñ± jÙKRJnbéK#û‡»R)Ä¿‚ÆÆWPGãa‹Gð&9òç»î§ý\Ã$ŒßG5 ™Qᣞž£ÀGrÞ¬ó 1S±ºgÐÒò ¥ðš±–?™ýZ>VrÑO|“ÇDÜX§ÏyÖFv™Z !„Š`+¡Z³7Ó°äŠ9ÞùöncŸßGoÒ KÏL…4ëøu°SP± º¯¡iÿ7¦öÞή‚´= …´è~gJg*·dç(2™,Ά֬µQ±N=Vo%ŠßŠQ'ŽÿüÍQmâ Í÷cž$‹ï&V$ÒŒ[?zö‚vj4;Ò"ÕšHàÂTŠ*Ý Ø·ï “aìv:ýB3‚25Z¨äÄ“Zk:_í‰ÏJ(ëÈÊÝ“‡û;ºYi%¥ŠZÝ 8pà…iðÚŠO^‰‰Ι²ÞåG›˜Ò&GcÇ4>!O£ M³ãÿmˆ“:¿Î‹Ój Àº²ª”â-*µÚ½™¥ºrm)­O£"LíÁÁ³ ŒF¥Š­¥c¬:½.M«\ç4Ö²ãn\SGŸFSw,¢d§£ ¿æÑ—8’„PŠç£ˆñAb‹Ûé Ú¢@:É~,©÷þÐãjê7p•Îæ;Í[/]©9 ·àŒªnãÁåù.0 ì⧯uñ[©r”°CO‹¾¨ Û»0 Û$vU‡ñø–g~}÷92ãî’ÊÎq] Tü±–q°ø„lj0ã…à@&*‰Û)nÜ%«Ñ¶¹ñ‰AÜ#ù1y¢h'^.âñ³m8‚²Iî?ù$è¡Úr÷ó²Y_÷|?ö>«‡¢he,Å]MRŠ×ʤ`:züÁë"GRëx2øàB8 ôŸ·|Úxò“Æ+ð\ k›Õ2?c,WJF:{]ô®Úœû&ßõJØ‘¢Kåp^:¯-»7ÐÛñ†¢ººòÊ£P±­x=ÌÍ8C¸°ÑØÏ›&´í-ñZ£á œàž½~‡¸æ¿ÆæÍ?wÓA¶ÿûØCqâ*wì÷£/ ?^ÇüŽûÞÖT÷CþÃÂ’¤ŒXå.Ð$kbSׄSB”|!é×?:¥=ùa(¿±-çIwl¤’Ð!c†ëJÍT2“ó8c{Xvö!^}(Çlq oW™~ ¹c†ÓO„'po}”š2à* £J‰®ldG É®ILP­³ ©X{h ­òa³'™4®/Œ9¾f_Ê‹°g;óÕ•á±uÁàΩÂg3a åþ$©)… ÚáF§å˜ÉEB6hµ¹ú¼<}AMÍGnÇž¡|ËþÓ—/•ðËC"«¡±¬¢Mvÿ¸ oH`±…’ŠŽRDJÓô(˹‹Ã»ÕyŸŒU)nêžÃ?‡›äïßdéÃ=é& Ž㌢؅:âëïQYbÿ×ýåø—ýÕ—%ÃF.'Ä) $ˆÓÿ '±Äê%é†Ðåúý$B”XÑÑÃ(ëðí`ø¬‚ÌÜkÀ•j'H žgRCÑö ì‹O±"ž¾$@L0ÿÚ¨ðWo;?d±îŸ=ôzM1XC.è+8Ë!fš.Ñ?Õ‹ÿÍg—ê²îgd×R_4B%Éù÷!F ”í§%’Y+¬È;b€ù·’ð à0ÆtèÛL2´“!Îôá7Ò¼ >þãLšï°˜øO.kwFr%XWBFvV1Î=­Ð©Ó3+Êt· ödf—q¦å˜†vn¹à®íx¾¸ƒ×Ý0œ=uDŸ£ÕB&§ËM‰á@¬Vžj­5j i\/AdtR’´ÿýÖ¢1Å€^µ8Õ ;€rô’ö(çÍ=Kl݈EªƒgCdíþºŠ&Ê’KwçôÕtÏà.6{ÏPnf鬙²‰Èí‘‹øLùx¿¥¼•Û ªï…cŠŠ¨¤Ó$F¹DKéGd§øñ‘þë¼ tÙû ™úïöв4O1ˆƒ ¸ê˜ìṢ̌û7néXÄ“9Iæ*öl6lQv~ß–”•”—[}2þ0-láåÊP‡ŽH$WX¿ËËŸÛãÁ¿{ôxi }ÚHÿ…JØ+B·x¬Oð‡w`ëјJêkzJ£8¨QÖD7ýw¤©ç‹ÝùüxH¢@£IKÞµ}ÁDÚ¶€ãŽœÖâ ”}ZJ3¯Ñ¨5éé±ÑÂyØ]SÑTÐv›°Y«ˆó|ºÓ°dÈ·qNªG.[ø½K’¦,R|&qÌ.ÈFvgÙ¦:gªèõ‘Sˆ ötZ+OB[Ù!·†Eç,s#ë’ ‡”¢HWÔ·¼çR÷Xz¾`ÿO•ÐT6ÕŸ:UEAº5Ò°‰º–›Òˆnuø–AVOu&>’‹î¸ƒ¯Ê‚%ìO¾¾¡Í³Å­`¹ÄB§ ýˆÍs{‹c¼,)І%õ?=%vÇ¢…áôÈ ¾vJYg¦kÖªh,kx·Ò¯@Ozj×r–ø˜N«ŸŒj¡ù‹ÈÉ1PÁÓEœôx®xñi±AÈ&K¸Â¹Í ‘{+‹Z›}ZæÙ¹7á„sT×ÈOÎ*¶JwöÕÝ‚j 4S¥œlhÀÉ®7`ìYým }™u[ŽqtÇ)ºÓÔŸüÇ%% jŒË­+®Î,Ñ¥§Ò(– /ܵwoaYEudƒ§ ¯ððH¯ê-zwê°ò­ùJÈõjñÛ½+Ò|@Uµµ"*4Å% Vp®Ÿ,À%øæ×¸¿¼.$ߣz1L¡«Ö&HÕª²ãšh±çh‹ò 8ì‘ÅO…ÏÞ{>»wœ7lç©ÊSă¿z)v¯ïrbE¬|N5?EÒl hkaªÚU2Ü(õÕ><Íëõ>é&Œ„uób9 ~§ø}¥dŠÉJmº69gôc‘¹Ù~þ`EèlÔþù1+½Ü2¢xì{.eCŽ¡rÓ+.¯?oïz¿fÓ+.2,¤ÕwÚT}—LB>ƒÚ}çMqwÇR1ÉzƒxÎ$g5Z< ’ò¨¤Ãþ ›7ûûoÞÜàøpCÃa,0I*J(RWÒÀÓwÚ±ãÞZ*ì‚ØÌDÝžŒòbØÏ5î¨Úæê»ülà•;_.ˆI4¿»JÇCêu9ÞEý~ÈÏÍÓ&Qçêغí Ìó«Ó“”–’¦V“Ed¤•¨bÿ=RÔ‹ÚÏ~ŽÔ`¶8¿¨ ²{{«ì$J 5\BÄPö\­ûjš^¤±QñÚ˜Œ´ŒøBÓËAJ=u/ðOÀÓ¥ä2Urù—xÿähÊkWR7uýÉ;îÒÄ>ÚrœÎè‘°þ(ÿ¨»ï-†±°Æ%܃&¹›‚8þ*õçü)ɲ[ÇϬÜéøIþ?³¿ÔÚ_š¸øú½ý÷lø_ M„Æí%Áå>°<¸é@±“—ð’¬6âƒÍ/¨ YÒx—Œåq¥¢fgkˆDf†¾úG¢0áyb¾{Äfîø*"ç6;‹ÍüÁ£íŇ€ûä´+íÍNî‹•*PU´Q¸ÜÔ²/žK¶wò†lœ‚Ý…˜øäÝÉyv×ÔJš­Ùç!Ì?çOD¹‚Lÿsÿˆ`Ë(ôÛì—5]Ĩ‹Ò[«Ù¼‰ð¥ÐrŒNLKONM.ÞšEÁ<Œ2P ¯cŸõ©µ©†”L8œx8<¹·ì!\p‡%ÅÁORÊ5ÚÝ¿p=ö®§ƒòâ½eVG|O¥['±o> pt‡!¢Ôë€_ÖªÜÅyËòà(÷ɨPYóu!ÚØi77ñPKq!Í&kÄÙå²hÄ{µÈÑGqÊ÷†£›§Bcçag—Îm»EêYÛÛaW®µžº&´{®a,ƒ U?O9îwð†/Å¥¿Î8wvöÆ¥Žo§Õœð1Kœ‹Z;êBÐ+¡®ñ§}Ss~›wfH¤Vˆ¼Q&&‰–|vQfÎ9‰ŽùP:æµR2 j+S“%:¦IM ÝI®áñ€ùI‰t·íAËa=tŽÅyýô»t©U×ËÑéË)Ùhï’M)k/>»$#û#Iv:|¼bM[?«bM²Ó^'V„Å&ó¥×"®°Ý] ké™ÓlFÒŠu)¹¡ êôdMúl²ÜŠ0X& S¿Ûý= ÐtÇwöÍŽÌ”(^M@NùK,¥ä¶X¿Sú(‘Á¬ìRîl”áC9´Î+Ðç|)Á¢uÝ/HÁ’ye’ëêÔdµzêh+;ìeÞò³ÂÀU¦—Y´'+h;ŽŠ‹INžÖ*öŒNõu-°O‚¿]á{²• mvÎ34·B9yÍÜS¥¨Ö]€}ûÛMgæKIæÁ'FY¥'Ibo>«03ç¼-?uÚo™Ð¶IÑJOOѤÓLì±"p¿”‰PjQp«)çYté‘”g¾Ñßy>¤AÄgé´ûó¡‰3„V„†û­oõ<#܆×(…¤T ÅnÄrq‰8†×SRY\YìÈ¿ñämº¸d}[ÙJË›{¨ õlb<í²dë=” bE ®3÷T$Ùît#ý€³WXÆå‹®zÜTž›¯ ²Y£ÊzÐ÷쉲ªž½ 3‡òžÝµ=-Åþ¯p² endstream endobj 708 0 obj <> stream xÚ¥Xy|Seº>i  P£©KNEQD@@¯\¬²ƒì{)¥k ÝÓ6iÚìËIÞì{Ú´iÒ}o)¥*» ":êq@GÇm¾SO{¿´àçê½óûÝNÍò}ïò¼Ïó¼á£F'vÃâ­[Vo}2aÕªesfG^Y¸‡µüÔ6¨ÍêáQm£ £Ž.3nÌÉðØõãVŽŸ<þ`LBLÇ„û'ŠMŒýëDñ¤­“ŽO>y—òîçï>Ïk÷œàIy?Ý»ï¾þ †ŽeÖÈCƒsZ9½o~ÓðÍE. 0Ëxìäìéì½ÀN Ÿ<Ÿp ½Šæ n¤ögô¯yúÈP°¶CÐ AYMyP”UYWQ[IAHjÉpnö”ƒÈç3v½FÁƦõ-«Io¯.±y#$ËÒØçfmØÝûÎu¡5èN2–ùšÝ[ƒV†˜§‚$Eßól5în°‘¹»T@C®Q•É>:ôŸ–ƒ d™GÔ€·Êl±º|ǺѬּ~}.Á¾þÚF×ήÜ>è€p¸²5Ðé; fÒ­Z £ž./].Y³È<º>ˆ£õrv4"‚o©pw[+la|«¬*w• toT w°¯ñå[É´Ò¨Û>{[ ÛÞ  ÉÑèhÄa¿£¡¿Ÿât¿‰Ïs™ f,Ï× íµÅ ¡Xq4û$Ëeç³ãŸ>ýê 4Å¡ h8¼·dsÙ¿ó¶¥t^¦ ÙûIÇéÞ‹güí@~ê\¶—‚%ó…[R×lÌO25Ük?rц^SamNNaaNNmaSSmm“¿Ën¬A/ýÈAËB\”dâ](Ø—šUR›ÌoxÁgu»,f“ɤÉd,§`QækYY ®#Mjlz›çã? ±‚ØÁªÔ¦=È¹Ê îà.³bpÏæ+˜FNÔ€†¦µì7_Å×É@FRáRy>°8ìòŸ¢AbžÇæ´¼j›Â6tùù2NH…J¥ @eÓú5Lˆ5ñ‡ð£\£Ó‚*nø@ ˜ÁçÀª %¶0¯b|-Acx)KSË“h¹Q &µ6SÐÐbilëh™b÷AµGeÒP"s¡êÀk÷8ý {øÈm.ö³‚’ÌÞL—”+¡Dá³`ÿËþºsuø›^z” £V8è¦Õƒ£ù† XKñ,è5Z%ÉŠ‡–ñÐVtµ•½::vЈCºBûZ8Ì_pÑ3ò”©õB K#'» ŠBƒÑh.Fθ¿Ppyí©éžï«¸_’W–gcìçÑâ‘OVSf¨†€¡Êà2.§‘¦åd€5óÞD&W‡Ùrâ/úzÍš¤§ÿmK±ëÙë¼rÜT­Ii¢MàÄ4Ûª.¢V>ZýçêE»¦ÍÎŽ£bwµ Îlá½Á4 ®àY FƒÑ¨P¼ú_åO|ŸåɲEl>[ÆÎGãXšI}ô üâ“À °n%ZÐ jUŽè•Åk¯_YºÈ9C³)8Yƒžý=ûî­#ŸùíéX’‚Úˆ«¬ô€C"îà}¸\‡ZÐÁv:>ä}ý¾SšCäšlƒÎ¨Ç¼ ¶ëí7€ÅVueó-Ü} i6¸”‘á×é¥ÅÏ‹$Ï9;ú\~4šÎzèé<ƒlx2tKà“Ý\D‹ø–9$‹.¹]ñ®F<㸄åÕóï´Nb¹,TÓKSÛÕ¶˜)./n8µfÀ•6àKŠŸeαÐVðáøìÖ L$+ eƒ0ŽùŽçê´¸?²Ö Õ^詜EtNöËÙ1S4²‘»{@LáS ûÀP'_•N+ñÝ"Õ0 ñÝïYšš¯4ÇLq⻽j(¢$øÓ%æb³Þ pšf<ÌѢРÅ”¶pÞCQ\¦›ùÏÙfv²ÒÕ.­EM¬¦ ²dÅLQÉñÙN¨§Âà†:C-í ¡´AÍŽJâN_²i3äÃ&·ô˜ÅèÀy‘ûêÛ›[óÜ¥’mò%«v|DÝ„ï/Ô};¹ð—d¿$ë¹dóH²:*k>5’¬üw¡ÍÞ?ÔÎÿçYaR¢kÁöÀGh/ß鼉´Ò®*ÜyTøTÍ.rfôÿ>ûÓΑ˜~š;ܳû} îáq.¥X~t>A.⠽͞9G‡ 8×8ö¡hq¤ßøs”ªŒ^c¥ÁNƒâv”wÙùÊ”Ò= 0œdF‰ÊN;©ÖK[{'†&àGjI„08L6‹=ÈôòMÑ×~&Ìrneœì›ƒ™68¿Ì>2ti$ë¸_`ÖøŽ¥qÿýìô¨@œž‹kyv8+fïìFLy—PÙ%î`ÜÖá–—o_ÇÏ?´¹n9žà»Ùv ;‚‰GËþ–ËïR/ƒùäœù3ŸXÁrCh’jmµ&»ÉŠ¥ ªÆ¤Ã§p¢zýzVŒGFkÃÃg“Éëý$ÿÀÚwÊO‰¾I\¶—ùEá2ëÜp‘=í2繄M0@þÇÇüòêÙ]ì(ìÑK@KAåÅCl²X#BðÎà¾Î;àNdÞç¹÷W5l!m^Sµ Ü2*+“ Ó1@µ¸¸ÁI4zŠñŒÑ†2#=‡ä ÙûÙ1Ï<ä’}×( ‹VOßWL?Òä÷€¬w÷¦rèÜœWrb¦¨¿<­"Y+*zš¯JÝήՋ5¹Pe${ãÕè.@“Ðè6ÄÇ_¼ n óoÚN; Xôâ0.«{­n“ÛÒ+Çnd÷.:¹`UÁ/‘û¨3`WºŠ0…¶òÙ ¶D¦Ø¶i‡t 'Q)̈>As›¥¥k_çˆÖ¸•&¥2í5C#TVTz}ßb'ó§¿ü•U[&#â@-.MÕ+Œ*#”’ò›6^²4ÖÅZåˆPƒÔÔR“ÁRÚ“úÅR4[tæK? ñ­MµÝµg,>“  šŒÔYEïMOËÀÑb¤k£F—±Å¹P®©Uk¸ø-æÏïonnkÇ牜QE:uVµ ?‡ÎËÊÜ3|†Xá6ÚM†b JEùz ŸBG´þÈäÆÕ¾n¿·&RªÜWéÜ‘RÉ~)•Uå*@ÙOø&Ú‚Ût ûo:‰lƒ‘~ÎHŠÕ#ÒLEÒm¼Ü8œîðxPC)fBÌÇ^À`«é@ómÕ&‹Ó…“¨S„˜™!NÏ»\f,Ë“tå4ìÄã1–Ä>Î>6󸲩 ±žyיܑuø_4™f§§ÏÓkv»º;Q<ßш3´ŽXÛB(+¢‹È嬗§“€¡¬4iÃni.v™åÇ÷Qp¤+ÓÁ–Óý]=@¾åŸ¯¥0ãj:ç¢á8Qz/çФ¸ÌEêÁyÃÁËê|ƒÚ¨0‚„ÄÔTqجQ @£êŠç³a7«—B&9c`Õ<šÑèÑ›.>'H„Ý9Ù{É’xö˜]ž×ßꯨ²³!{k²Ø1’´¬¥‰Ø‘ ³®Px6ª+ÏáH^Á¸ýzOˆ³ÿ Êù‚ËÄ3“xR¬ ååÒ2C)hÈÂ*EuSCmÏë;º^a`ãØG؇çœZø=zäÓ½v­CáƒV½pËÁÎ’\™÷ú ö¿j³åäñÇ¡ºeþ<|U¾*/„ž q^F6.z IyMpÅ|¤æR³í4øÉ¾´ý‹±ç~r:›0õô¿üÞÏ«>m¥Àkj©8KÚC¼}hÆw‘\5äaŸÝT,SÎ&‡ª¯3y-hêçU!ÎÀMôÎM.Ãeå]‹ºo ÿG× hkÿ]»7ÎU¨¨ÁÄ[Õ’$½2³ƒ¨J^]ßê>˜Þ-ÂJIö4m1­,dï"ßQŽjêBôKC”dzéìͧÇ.C\uÐâê„ 2,ñŠósŠÒvöÓUÝ­çÂh‚)"Þy8>﯅˜)!Î{—¹Ìf»8F¥„<>CÒ•YŸ‚ññÏ>:íìšËÔi8tÈí1ùÅså»Á W §=Œ‡"Ë”ëjvyê1?U*ªóŠöHRvw•üY€&Ãå+Îb´™§Í‰‹%{%9£eÇz(8Ü„Æ5mxý@O/ü tؘ`ŒêñÞòÕFïýœóñ™g¸¨kp4/X^)ÊËËÏûKkÃÍáfÁ‹C1ó'ïð£oŸÂö¿ç`º„:ôž~ػĉ‚:6Æ.»×æêG«ìuíô'RX†Í°žVä9(È5=)Çð†ÞPêªëóÿ5A•¼,Ú’¤XæéÄ©5l­´0xÝðÖʦg=-U­­áÚüvlªÌF¯Áñ°F0š ävZ• rRê7`xïkµíäB¢:á9aZjJZîýQEh×Ë9xŽ‹<¿‘˜˜Ä4^qؤRG»kˆ¦ HãÖõe´A]0ÐYÕí=õϤ*^ƒÁœ ­~ jM6[5ömQ#„=8ñLÅyîõÓ<ºL+)ñ«*ðö[åtMfï!{]èO|{Ȳ…­g“ÉZÑ2pãK û]éYhrÕÙ¹,É/yQ_¢‚.nøë-`¯s¶úOt¡Ç\û,¾ƒ8@ð3(X—ÌF—lRê±Y wtdÂð{Ìùð+Û´ç• ¿ÀÏUë UëE\8I¾•Òû’à%Ø’”¾Éè£Ûsk jöØ `l[Q*ÒLnÞ ‰ NUI$™²5ØWÝ™“=x7x¸Ûó užZ!ÛŒ±42fôÓÿ£«¶±÷Hw©DÆp~+’%Yë·ý:^…Óy{WO‚àvð'v·$¯”H…åk@ÿÁ=²¬ÿØM-hÆp̳—¹ýl,O-4h04å˜Õ6½“jh‹y{ëmˬ„ò­X·1{÷¢yŽ:_NcæQl3I4=†¿µî‹ÔVØž‘•ª|cWMúJ e¯ýf%þH%G¦ò¼‚çhhh¬ªèhir€ì©Í\sGù„¯nÏJr™ìª=b!Í/Ž}³¢ý܇Kÿç/~»ðfk;zÐZål«ºdo°úÕ†œŽ¦úX$*ä&ÈÖBþð54†;;ö4o,‡¤mâ\uFëŽ-ø;•ÌT„®£iïÂñÄDOœä20ãx¹Æ’"("Ë]e¡Pm`_ÿ®ý/²üô©IxþJY“ö˜ò˜6ù¢ylŒ ^Ñ@·®®ɰÔ[œŸ]¼sÝÉ”kèÙ}hB¿:Åuro^cŽ-É•áLq@?ÙT{öº Žh*RñÔÿŒ¡ׂ‚œóxðwc±¼uG,%ÔÓÑh &Jû?þª—Ê>ÍŸYªÅrlÄ©ëÑ l—¾߯î´7¾=¡ô‘ŽÖ)v=²©Pd±Ò׆ Àìˆ,ÌÅÛð'Î{°Æ|w‚çÙÝ‘àwYùzñ’ä;güŸ?ÿ‰_Nb䛌ú”ç^r³²¿‹‚Õ_ô6ÿ"V3Ò-VuŸuwuéª4b±*TähËÒ§¯‚m䌋o.@g „ãߎ›sÞ}Ýw‹Ëd2$ïüJIAa~‘d6­GQS⡠2y5+aÇnuÀ‰†÷Z®:¿+•M=nº#•Ê<$‰%e‰°‹d‰ëÒƒháIôé1Áð/—¾ÏQr¾M7ÑÛ7¹è3tœg¯ß¼6¨…Y®®¤ ‡Ñj­ê9¶Æ/¬…ÌMrQÁ…nlYÇò "WSx6›]í?^¨Ã*]Ý¡ZKÁÞÒ¥él¼tUfrVPûêl¡Œ«†"gYvAþžÄ#%}‘j\²Ø½é©g€üî$âÕEZE©°-1h²â—î2UÚÚŽ[eyúpÙdXÁ{¯÷þCÏ™Rf2ÏY#­S‚T«*3èÔ{õM¾&O›·“]Ê×—ízu[}¸‡o¶_¯Üoõ`Iÿ­þÊp(ó5┇%ë`9÷\öiÁ>h46Ê6Ë·¥lʦå$b»»ÓRº¯|à÷º]nnNKžU)Ê’nÛÚ—þ¦à;øîF#=ìaßv†7ä|éUÞ§šê:[Àôæ@gç—_„ãÅWÀ ÐàV§ÊÞ^,-„BW”ÄáÒ`/%Î*ÖY´.Ê…W|³½úà)“j ZV÷”y0±dìš— –ΙÇ_²4s¶ßÃY9Ál¶{ÂÍ ­·ª.'P\%Å8ùúº»Á¦·©#5×ÒÑòâ,(‰½Ø!ô•Y‹±ß‚Š&c‹BL‚ÇãCÙ¡h6Ù3F0nÔ¼`ÌXGÌ8SÌø–q—Ç×Ùcbе{þ ëçÔˆ endstream endobj 710 0 obj <> stream xÚ­”{lS÷Çïó¸€ «U£¶×.ePZFS:Bi'ˆÖRÀ¡„wš&˜< qâGb'~Äïk¿bÇÏ$&vHœ‡M’–œNë³R/a©—ñÔ+)’•z1“¼³!óŸìŒW0 ÏÇDì¯sgâýçgâ&çc™8NÈ›­yyï,ÏË[Q ®WJª+«dü×+–òßÎÏ_¹Œ¿"//Ÿ¿¶V$©®ÖñBY•¨V(c~ò·Š+ªE2%ÿõ5U2Yýê·ÞjjjZ.¬•.K*?XºŒßT-«â‰¤"I£hÿCqŒ_(¬ñ£/ ĵõr™Hˆ÷‰$u kÖj|mFu–S0˜s±ç°…ØkØ"l¶Û„ °Bl3¶Ûåf`8–Él”aÃ!ãåŒaÖÊ̙άþ캜œœË)*Mbá÷‹…ÊÏr’âhýiC]u\Þ7ÔÓÛO2ûôŽn´–9ƒ6ÇYhs˜ÔE…²ZÁL¼&Oà7ѬßI'Ê«šÄõâˆx¤'²“¹éaH âDjÝ! ÐN麽ºJJgÓÚ ™ ­²½Íyõ«˜›½Ð†HPc7óí^ˆBØŒô…2¸¨/»›~?K­T•¨4 °Ù5¤Fívâ·Ù÷ “òáê€HH-¼m`k§¯IýƒKEmžfP‚IgÒ´öÑ:ª@·ÇèÛY¹é1†êR%xzÁzÿ&G/²Ö¡Ð‚B„N^*'壹hÖ|½éÂ?"¢¹w‰ëë.ÓóIú‡l%â@g¢ŸI ›ÒQ8—Õž´;´(ûûèÆ½ïæåÑ/ðèFú[ŽÞAxÀëð:Ú®¢.*ÏþóভKß̣ټܴµ1‘^’ÀOO³Ò#é|ŽÝåh7á1¹¤(Ê ÿõ\}pÇ z´ŠÖÐèfz⾊Þá¡™Þ:óMâxp Úˆv“KOjÁj¦Z…4I¿ôKš ÄÏùÑ/x0äGï!šwýO?ŒÞÍ?µxÔh M\d.W‘‹~ÔÅS¼8âÜÇï^I\e¡“éLN´¥CÖP'­•w´Äzû{Hzñ#g;MšUf-4/(­<ýà(â}§qÁHédïíÝ[„VëîãA§+8èëóõùûÿÀm¡“8Qqd×Bš¯Ñ{,^ÀÞæôŧõ ò™Å<ÐÙÔºZ"7µ–ÞOÝy̤šF²k¬ÔÛ TD‘Ö6ˆaEÏ@o¼—¤E?¾ËQo(„P¹¬öÁ°«Ú‰e°±®^R#‘œ'/Ê@ì{è!×px!Lœ-ÿlË«‚§~°;=á+'Ož¢; ®aÊD1ÃqBGã÷Âq$šÄÑùç¾c¡Éô2ŽÝádà ·¥]KZà %³nµpåV ”„:)0éI ˜Æ(é…~ϵ¨À6¢9¤ŽIð¹B¾±Þ¿ûÇΚ¾T@˜ÁlÕQ«š³O&öü†ƒÞÁ`¤g¤ã"Óä§6Y”š’†õ%@4˜¢L…ƒö€;fw1Cá‡Û‹ºvyF¢Éd xöÌäÈ!@yuÛPÂä•wª¢}Ñ£Iéðnr ì,/*ÚR$im12Í¿ª‹§Ù“øä5 ?£l±a?e`$-xVÒóŒ\ SpæjÁÉ'Èqˆ%ýÑ®Døcä6Ê£ÑSfi¥ÌJªUµE!¬BjŒõð âô;ƒDîÃ_=vž^}ÅÍä-A«8ΰoÔvúÚz>‡;qy"‘ìMxã@Œ’—ò@j’µ–š×›êU›¹æfc-S*YÄ$» ðœmÞ¤»;ö-÷É=¡3`%Ç¿˜øˆáîÆlÒ9ŠOu ”DÑâñïŸq¯t•P$¢Åà‹ñ æú‡G'Pœ#®ï. ?„¢Ê2áÖÆ®P …-Û Œ?—@H›«¥%ºb°OmíòôŽw]¢·M"çÒ¬0ÔX ªO,êýôŒL°ü'?‘›æ>©LêgÏTæ§e+Š55Œµ4?­(_¸ï¿(Z ;‹ëDƳåC» $²–ƒŒŠÝÿ)©®¸dtàÌÄlG$Ç?î÷MØž~»ÛÙ~øhïá¡þ¤»‹±n—-¤Ý£7íýSŸ~>|ðHù”–5Ö7]ûtÿÆ“•µîêÁ;ž¸7É€Mëâá{HÀL4>ôº5ÍJYS¯qÊ[­û˜£3é£ÉÎñó›:ö“% ª‘퓟ÞÙË<Ãx!=O<“˜‡Ûˆ}}qêŸEÄ•> stream xÚkHSaÆß³Í£®ÌËÈJÏÎ-ÅÛ´ðÖÔ.ˆ¨¤EB7‡;yÁ]ØŽ®•·I¢î-%K‹Rf£iÓ©4"Á&Z( Ê™4,¬ÐÀ‚Œ÷•W¨­/?x¾<ÿÿó£€D(Š’åŸÎ9—››WX’îÏé&Ò%qnµà}GQ8Z„Y1Þ-‰üõóKˆŸÞ]~Æú ²‡ E1ÂÕv¥ò`²R™–§Ó› Õ•UWÏ¥fee$riJe—£á Õ*-W¨ªxJð…Z®TWQÍ f.îH• è³SRL&S²JcLÖ*Å'r¦j¡Š+ἡžWs'uZ+RixÎÿs²y:¾Nà \¡NÍ´À7$U @@D€Pf¨Rʉ;vbÝØæž´QÈñYŒÈVˆÜÙ5l~A,¬„ŒšvÀ7p~˜Ù¾E×À¦¶\-í^‚ssKpVã.§cà}—Â_ó}G`ÕM½GõþãqT,¿"íl´ä7´Ühˆ!ÅRñ{lhÕ3âÜãt>›†ïJÉ^"OMO*{ÞÖ÷øÉÀÄ£¦Ñˬ}záé[ÈlÎÍVÀãrO ÑDZ,V+¬eð)©ïhýÄkD#… Q›3.jýjFb1šB+ò•—%±D”>W¡‡1·/½rw?tÀ!fÌh¯Ñk®©â¨…£¸õ .–~ ÁÎ~b–“扌¦Í*w5ÛCã,©ÐwO½øïBfÚcÌTÀ3µ ÚÌV}g+´X[¬°¹ÞûÙÿ:Q¨—Ù( ¼b¼€2ånˆ‹h;ì1°fØÙÑÚL~n_ŒT#ÏaŸÒæ V«–Ún®uMN®uØ|Jµt¼çR,Ó™x¿œü%ÃôÎúAœ÷ézï J‰ªvyƒG{d2o¿l$ɰÉñ¡ˆ¬u, endstream endobj 714 0 obj <> stream xÚX TTWÒ~mK¿ƒi_D'yMÜwQG q‰Jw î "‹Òì ›B³wwu³6»ì €„Å•Ämb·1ÑD£ÙI2Ö#—™óß³Ì?™üÿÜs8çÞZ¾[õUÕ•0ƒ3‰ÄzéæeÛ]VNuZçâhùî’ñSEo’•ø'F|I"¾a{½½‚ì×yEøûzEДö›‚½÷úDÄØOZèòÚÌ™QQQ3¼Ãg‡ù-ž<Í>jo„¿½‹O¸OØ~Ÿ=ö+‚ƒ"ì×{úØ[LžaYœ‚C"#|Âì×ïñ ¢–ÚX3c˜I’i6K'fù UÌ+éNÆ‹Sc&‰bžc†0Cfó3œ±eä̆g^dF2vÌ(f4ó'*a3™ÈLb¦0Ó˜éÌ f&ãÀÌbæ0fæ2ó˜½Ì2*ý f9³‚qfV2«˜ÕÌ:f=³ÙȼÉlb63[˜­Ì6f;³ƒqe b$Ì`¦T2V/¹=hÄ ‰ƒœ¥H%ÒÒ¶Á[›­ÖY}*[*{ŸõaË8{.ï9«ç‚‡H‡¬òãó+ž¿kíb]3Ôfè»6I6=Ã܇}úÂÁÈp×áŸØ.µ­•GÉÅF¨ùe|÷‹_4´Ùe7ØÎÏî£QºÑkGßÕ6âU0‹Vfþ¤Þ(yz ÷]“â}q§¥? Ñjà pÄÉ~xÒÔ-TÁÑTcøžôT%$pÕ±Uµe¦îÍm &ë-ö±Z¨¼Mþʺ«`• d;ôeºöŽCÚ“ÖãÌì*´+ð¯8—íÈŽß­ •ÿy—8ˆµóÄ—+p 2iD'£ÄOø+¡-^þÑ!!!e!MB!fæôzNœR“°*p½›‡F£VC—–’“÷ÉGh-àÎÿ»ƒ6âX¢¯øÉ¥\òÝe)>!ILX·f&(S²epÎÖp}E¬¯:a† ”5g|'N<„fªì uÁ…EÈìù¡Ç,9ý|.wãr>X¦‰OÞ—š´¢h­}ó_Å1» g²Óîa„]äà°£5ÍPY_Ò\¿¿R)¤ÒµÕ×®4œ®§iÚ Œ_üªÛ6²†¸Ú©T N”Ë,˜™n#ƒcjpÈ·—Œ¶­(Á—öÈÿ‰oãü㦷>„÷¹›ó.Œ»hãëû*£ëê**êšÂ‹÷ 5-ËOw¯dÕN¦º…ù(=ü5Aš0’“ÿ#I›¬Ÿ ‡„Ùƒ£Ë§‘Î~ÛÑ0%ËãFsšÉÜá°Š °À^³¯@‡?~Ø#Èÿ VܘZ1*Ž6‹^4²/ÞÖáv^‰5s)†ª%B¤Rv9ãÈɺ—)†‘ìuþÅýóxÑ•-‡œhš:ZmÒAŽîóåD™UŸŒí÷%_Ó`Æ‘÷$§›J͘øPú~ÍÇ€ªHÈ…ŒÌlC}Kgõàž™á§ 7¸.Ø#ÄË+zl„•GÂoè [“\y]a³9²4dp‚·Ã_g¢‡~ÿ5¾€Cç~C$ 7pó÷ãp[ŸdN3‡Ã®VhHÍLSh(þIi;£Ý“½`x亗%fi@ \$Æ*úMÆ{Ÿ§ò¯~$ïÃÑø1=ùݵgÊOœ|û”C{z•çZe2••ÖŸ÷îr °,¢ŽpùàØ»7/mY.Àò îÞœ1Ž?Uýá)¸Ë=™~nÖÇ%3ð)ò«:þ¶/'ÿlŽ×ÆõàȽòãJÞÜ×CF€¯–v†•¨rƒJr¸ñ»x´]TuàT¬µpÛÂ?/»tO€ë§.|Ð<`ΑÏ?6НX®`õc |$*Ã÷øH–¨‰t—‹Û3Cs™²\ͱ\8ÎÕÄ”GÇ®êÚõyúÙa° ÿ «‰õ»³;~Å@þùT¤—ðôC8ÞUÚÊþ >Ž"p)ú(Ž“~§*ŽÖŸ>VØLi§vEfb‘oæzØÅ-Û7vº0Àž𠃊CùúðjJ¡áAÕa”Buùëà§ÕÞ|šGnfѹ\ÒØë"§÷®áÓ Õ¹qšÔÔ8Ð÷È.a_„ÿb-媣ñ¦JíyKuÑÅš¡ ú,}VòvX ;K¦f&êhu¸ BiÕmË8ímpˆe×ÊhâÈ|Ü• ‡à+›ÞØHsït³¤»GL«•Š=â?ù³Ëù ”϶’WÉ\âAvãkd6nÆ×¾Ç—ñ¹<0TĤh“’É4b½tpóȪ.<Œ ¸ºëžâøqI5™§×¥WY Œg!AHµ:5‰³éÝ@ݾ`ÆÃ´ˆž&©ØÛ»ï»®¬’ÝÔ«|}e¬¯FµXˆPŠŸÈZ1ß*XFf†:‘ש]ö²šœF–=f¿.PÎU˜°4X67A9Y˜É²F}N‡€£eè¦-%Äž3ÉlzgS}flÐçJõ}iÑ÷ö¿ë“µe\‚öã ©ŸþÒ)ý£æ!ûU~À¼MóTS„Y˜õL“­ §ƒqS ú5uDš1Þ,ŽëGÔù¡´wIïþ7Îo_b÷¿ñÝ…óÉŸq»â \o6<ÒìŸ\>J¸„=ž™uU0³«Õ*غg.ø[S6°3|kYbC¦A¼#Ùx €/üø6¢ ̽³Åu)ÆŠßñÍú‚;‚Ñ,Û­v†]»œa7jdïèü}•¬Ÿ&a¦”ÈxZ[߃ˆ0v¦ YaÓ{üWQâ—â§üåw.éé83¤Þ‰^¾:*‹5i‹ã!’ÕÉi)ä>¹h‡ï³Gôù7…*³ÌC½ ÜÝ7ec;€~åoÐ?ííç¡*`kháÀ×Y´A+Ü@ÊrU† ´bht¿•q ÚjŽÃiK:¬…ƒ†€vŸØÙô¾ø‹•øÐ,¿À|Z¬U[â ÜŸâG4±G2  f™¿Ú¼Ý×ý¾MbÌæ§¥Ï$Ž7‹Íw¥½½¯ÓZõ]ýÅð W¡8ûFÅ{f¸Xù³Ód¡l?¤@J ‰è»bG"Ä ÉåZ}Œ" ‰À46ÜÆS·Îé‹t';‹µg-n‡ÎZ…ØÀêt¨ý“Ÿ™T£ò!ËiàúÙcÀO³¸Ä,EUï>¹@M‘ç¨`“¬Œ)´ùíkþÑ…¬¸¨ïinBdÁ¨È-Sˆl-töРۢ9 us×m²Üi¸…(ú^gi DÖõΪ³ÄwD´7?çq™‰óÈúÍ$ó‰'ñDJëé瀳ÑS _ù Dñ)æ£ÇÞþê+»Òu>QÌ™ àƒf^¦¾Œyˆz¤âX¼Ê£}σ/¿÷€(„üÔK«ÆS|j~)CG ƒ<<èB^Sq4=Õ‘FµOñ´ÙÇ<Àüo×õ|m–Çb >å1…½¡,Ó o€ àî£È乞kÉK ”࿨½õÜâ¾!Cï’‰¹þ;&uИì줿1)ƒ•7¢µì:4ød¦×ûÂxV‚g§O‡ïÈîãâÕÙPÐϪ´5K[« WB¨Ê“%U&½—Ú–|)é*‘6Ñâw•’µƒIÒ}ï^‘b”8_PzÞ⮞½ò±€<œ™Z4!#Z—F'"ȡ̻…v\¹òÑjSâcò ÷m‹-ßvj: ‘çæ;ŒWÀ¢·¬´6ÏÒ4|>øn´Asx¯NÛè 9g×%Âb ІdtÔCv¶:~?üÉ·,yiò¼‰o«&\i™ŠÄ—há_J»àYókƒèÂ×F×ú ñŸ®JÒh,6§lƒÞ­¿ØÙ¦×gX&ȬԜ”ÄyKˆõ𝖦²ÚZËüúߤV¨ŒQMèg¬{ÒD›¢[nqÁë&¹› ¿¸ÎgyÕùµg¼\|Gq>x3«‚~~ÐY" K‡¨F¾‡ÝŠw7¹×eElMmYyM«g–VQ[Ói¨ît·ÏÅ>V^ÃlÑ,I[àä¹ ¼9ǯB® TÇ=8z®ÈÄ%½ÏOYè¹Ó³ñ”ïv€Ó³-ñª2¬íèÛbûôïËã*¼ÎÓÛÖå—4¶Ÿ,9 ­p<¼Æ«f—~# ú©[C½#v+·‚øT‡9X:(ã’6ófÏSÁtfÂçqЗ8‡OúŽX+œa§x'߉WY2Ie¥dß3¤¸*ú›è@±SeÂæGu&Iã}ô¤­1#¾ÌïO:A\hyTMMÅ!ó¥åGçSíÉpÂÿ0™¶DŠj(PZPmÁb#Vl ÝÜÇ38 ît\PÂYÍ‘°gΙÅû£Œ×ä‡ÅQhÍC ¨ìWz¸G{Ó!»:´%´Uó4@GvWÍñʆæ.hãûk} âèlÍe\äÓ²=ºÑœf?™Î ÿ€Ï+>„¶ÖÒ êÛ§æ[™Y礜“ ñ‡ß:j#ºS'ý«q±QRwÕïIÅqÃWfAÅ÷›¾ #ˆõô±ä2òlj´†Úœ|Z•“–¤HuŠ6}ïøÙšt”Ø]Ѹï¤ö´pºjÞ€3–˜à\ðÒ‘œ >{<Ò%huíñgRìÇñfò³Ü÷†¼­ßìÿî‚fÀ®ƒéÉo~Åþ¿-ÈS™Ä)ý Þ|_*Fã^GŽý #ò ö4LJÿ0 ‡¡ü»ïp˜@¢Èv~x#Ž…¶h» Ž@·ñDýéSÅÍ”îO”ï­òÒm/ð…7Ã<ƒÝÝ£¼,oWÉV3N3Š/šcM¶Oo`å}Ê©«ð3¾ñíså-Àݺ0‹0Dæ<ç5%æšð¦ørÐSbv\Ú¸ïÝ_yÙvò·dˆb ìˆôÙÍÉ_~ÆVײSw)úüÿÈË ?ãüôÚÓO)Ê+(‘Èlj(´¬FKù%œ ©ˆ­ª¨*®o¬÷6€—Wĺ~0))Žù0‡nlÄÉ*£èP)i<ñ§¥ø•øÚÀ|–ˆOÐh’’RÓ”•Êì½”Žíö-Û®€€¢ÐªÈFåÑ”ÓI§©+có’ÑàÃÍ™…ñúIÂYuž6;¡¿?ŠQl,$Ù´?*-ËÌÎ/ÌÊjÙÝ®6Z^šZ¯_U@[TmdÕÞÃ~9K‹B³–B7×PÕòH@r^Õ‡é µ°¿+³¼ Ó»—›ñÕrÉßoàh“oõÓïx\Ìjçû›¢æÂ:– ¾ÑuµéÊ5¡;x »Téç·>-°žý¹RYµüÁ¢=.àgïXãôjZëY?fÉT z7A=[A¦°°¼Úýë¢N¤‡3p²ªî'Ö½*ÃI¿”!Äggž•¡cª q´YR.j¤¸‘Wgk²!‡«i†2ÚJíÒDh=ýƒÀÏÒJuÐê_ì‹ÚeÇåª `€\}Î!| ïÚUœn*h²Ì“jÐ+uÁ–ušC µštÕX’E'¼Øgêzß”öÇ|åÅ™–sÞj ìó9Þ–s­Ú¢J鉚TuÊL’a7kéXœ£jÌúj—»z7Ä)ƒ À²»ʵù ªBoPƒ&MZGi7 S‹i¨gŽª=Öï‹;õÅ{_최é„BMÁ^äÉßí²2‹¡Øòæ×ƒ‡í¾'‡33UÅ0ª2ò2óh’ëpI‘˜/Å·1’O1ÐæFú[_äæš«/LÒ!ä3àA±¦0™z—¤JK]³ÐnÑ7)rFAA~A•e·&Të¡q=–Ýïƒ^Ó¾ñ{ÂÛE†n]¶cƒ‹f¿å•».£ê´ –t ËP‚< CQqiµ¹¦ÞX{‚]Y$ ÿTP%Ƈ[žšZôÕºV}7³ð†@ˆ4Yì'^Æ’Å ü'R\çS‹èܨçj¡‚B㪉Òz©ŸÓeš‚œÝÇÚ…mŒÜä¼F…Al¡ZŸ«3åB#W]âÑâ{Fø ´¾]}W‰ ìòkJO\ÑSßÔJˆÿ9Ú5àé ¢Fò’dgY): üìJÙ]Àš‡ÜxÞ˜mm}£Äz¨0dðürëçð‹ÿ'Ù" endstream endobj 716 0 obj <> stream xÚÅW pS×¹¾²qÆI„s8da™qùò•qË—¯ˆ—䔿e¤‹ ¢—]ý‹/®Y½bùò£_ ó2ަ‹Þ–R ŠS ðŸìè]’£‚Òè%ÿ)*(ÈY÷üóÅÅÅq)âü8I^úw—.‹.Î(Eïæ óŠ„©Ñ›%Ç ¢·§ˆ…ÑSØã¦Öx‰8§°@˜½M’*Ì;†QFƈÄfÎëÄ6b'g‘ž&Ë# ÂJ1ð9ÄB"–XL,!–qÄJb±¿wl"6¯[ˆ­Ävâ âMb‘Hì&öû‰§ÂŽ·ä¬#ÂÎq{Ãe¥ð^˜Á™á#—¶Ç_y¼wæ¶Y¼YˆúÙI³"WFvÎÙ7烹FƉÞDpÐ Ä墢küƲzIº8C\P[ÔÖÓÞÕNEN¤A5£Þ ‡ùÝ=.Ú|‹¯i5¯Y®€R™jht‡bÑL4ãw4üxÇ™ÕD6ß}î’ïîx—%)ö¯ìÁ«@£¤AF}éc™]=NBz’w'°3ù¹VÄÒì^ö—ü20‚Ò n°Û|ã¨S€6ð.ž¯Yú‹Y.9QÁ N3‘ô>mz¤«<´%¢ ”/£l ý7`üÔÌŸ†@~Éûíõ-,†Äö¥MÏìÞ°nßó@²\ÞÃPÈȉ˜Ñ :ÑÅA?B?åÿ‚wÃ^žKC…¾ÄPaÒÕ` eU`£|`¶ÙjÎ"‰Àl·ØÁJze §*À¤×•nÈ/ùky×P•³Ë ˜¹<á>²-äé2MrÔªÌKm#zSàS@95™Â+—ã(Ü¡(´Šé(¤ì·'»q ªÔ;éþaëÀñÑ‘ˆ˜J/ø½x3­æÅƒÓKƒ,¶jIwaɂ̢ =ûwâ‰õ|³Õ\‰¡zä ¥¾·*ýRBëVˆb3Ø,¶ˆ•²q_°3ÐsôEøÈþŠ£4êÆg¯uõ8+ƒ•­5ão¥ß=fÒcw¹úJ%•nÈ<|(%"F#{ Ž‹Wƒ÷ùÍ›d *Ù¨—æ=Æîò¹UWQ4 WZÑ+¿Baw?ýEÃi ¿]»† }9hIyˆ•)nC!´OçSɬä£7Ѳ¶ÆñsWQ.³Û 5d¥Î¡¦4ÃQzfDŒß/÷˜lt“ä ƒ ©T§3M&£Ao0™ôzöìqÁÏÐMg§Ã9Q~ø­&·Œ5¤¦¦§OøZ±OMöÿõ}ÖþþÁ¾ˆ»S¯„òàðÐàpvØý](Z€– ôÛå¨À‡¢ÄB“BU5‚ÂGu÷Z{Ú;ÛðÞiÙTtšYé’ÉÈ?,›ö ˜/qÒ:œ×¬õL_@³sy…ø0y ûùäuÁvæ’¡ÉdÎÅÚÍTÚ³ó&Ý‚ò×hÓL¤^n*SÛu.º½ËÚÑÑŒˆ±aÔU ³†N´èÀ6pØj€i˜y×'?³”š55U v·ÃÅÌb&ñc6zòâ4 Q_±ÐÓoíí艈qxfÁiÁ?,¢°WÒ©ft ëgºÿƒ_r™ô1…·üúÜ#﮽ÎÎ¥ØúGÂé½Ö¾þÁÞ¯_g %ûò ÷Aõ®,d&µ^*Ý¥LƒrÑëë> þÞS%%£Á /Ùž-9dÂ7Lƒß6d©¶6ØC.dôîk ãªùѼ1TýÀ¸nð: _×VÖ—™PGJ^NNKîR2’y¯08±¼ƒŽ!ÉwbþŸ Ì n9¥“I­<¸Sy6Ñ{{Í\6œÅ’4Äü\ìÕ£Ù™‚zíHÄ“ËV/[ñòú®ßSÐho°Ö€Ål Y¥ m0êK÷²‡&6#©±ëœT%X¬•®¦6“Íqbëû:ìoè D¢yh Õp2c07Xj_×ðº_ê-ìaòƒ;Ýû¬ec<“ÁP€2áðÑTR°™íu8Ý…õ pº™+üþñïˆÍm¶9ÁE:µv ¥+1ìÉÊÈ~¨Ðܦ!#d€\U®S±îÉtA.£6ÕšÚn˜£³ú€©‹±+a+¯cSšÑkÍÌÓø¾pÌêk)[ åR]‰¼17˜„© ØH–b—F%]Â%ÕÛÐÞV´F ߯+ÎÊde+D ¹v™ÍjnöÁ[d½ÔSR*®¦ •ߡ޻Yû.Y‚’0Û^™ââæbô-Ä­íow´¿È«ÎÕz !ÛùKõî_òýßRÖZ<½,š¼%ÐWà)KOJ=²:*ŽæÊöªa°¸=ÃÞÓÎnÏ` ¯½½ºº³ó‡@ö¹2±‹ï8ÌÎ,;$Ï4j¡ˆLì“ ~Ú‹WV=˜± Ú"eºd®–™[ihªêp6øO".œ'ß9Ú¿‰J€äAóq7ŽE (ÖÃúø¢ä¦;4ô¾ìë<ªcW~wú«4ˆJXÞ¡ÍYûd¥„¬x£¢žyS²ê.Õ ¾¥rÍùÐõR±R—r²¸Z^×ÒØ:ИH½GÓó3ÇEÿ”l>¨s8ñŠ>ÁqÍ¢øE\ã"?³ˆÿ!ï«!ô%¦wÚ‘¢¦)…ú²Tv¹`õô‡¿[èŸñ6²ý`Ò•‚4êPðàÅ/΢X·gzÚTH6¥$bS”YúÿäÉ‘ÌèB_s]æ2æÉi糓þ ·”Êu¶Qµ‘hrŽ|ÿ ÷êOcC?Óx£ë¾«ÑæÀ?®Ç<…XSr£<ÉäÒ›Å'¨!è­ë¬Nî)ïü& äOý›ƒVŒ9/£U§¸ 0óÏåxË‹rŠò(PZtN6ºB8@Š“X;c»î| 'ë¯wÿÊÕð à&°K ¹v‰ƒ’!}=žóÖBŸ ãv¡ µ‹õÓV¢­zªaLÑVe*d;,P9´/nặ[ÿÚÜ•wRuÐmíéÈd—nHØ9ãS¿5j7㩎 ”W•–e*öíÊ8G¡0ø÷ÉÈÂ&Þƒ Ì5 <6Å3#8s|V³#"‚š¾&ñ8Ã÷¿‰ Óp endstream endobj 717 0 obj <> stream xÚ]PÁJÄ0½ç+æ¸"Ò¤¢(”ÂÚµÐîbva¯i2­›„4=ôïmÒ²ˆ‡ o&ï=ÞLV5‡ÆèÙ§·’c€Nåq´“—-öÚ–ƒÒ2l]ªrŽdÕQ¸“²¯zÏOo÷ÕñýÊèÃå\³gPØ­”óìò­o|é,E¼8ŽÁϰÛ+Ûâ]œ}x…^›v—Ч ŸœûÁMJÊ2Ù±5“´ G'$zaz$¥%u]4êßßãªh;ù-<)ž"3Ï+üò¿&LWÝâÞ·µåäý’''mCiƒ·û9ë¢*½_úŸqä endstream endobj 719 0 obj <> stream xÚe‘kLUÇçÂìÌw±mذ˜awLµ@la‹,PD)X@ õѰìN»vÙew`»P+ôA—¹(n›¦ R Є¦ÆÈ—JM#¦~ª‰MZmL-i||¡¾’{—»l¼SJü0gÎùß™ßùŸsò ½¡ª¼±®â‰ÊÚ›wÙu¥($þ ÇÏðc ~àí)8'g²Ù z¶èÑý°[6ÓÈXi`Þʘ0Z¶”V7É¡îß—[ƒ§ì•(Jà^ôt¯æºÜª¬É÷s]öy\k:-B>ŸCñøÛùò pyB¯#ú]Nå~e·?™o·Vú‘{K¹ÎÒ§ª0"(š:i=Ë!/®£zjp#’BDŒÏ‰Ü­1¾iýd%t2S3j! QÊþµB”&P}¹REˆ‹ì!RïQ½»>ý飓áo_¿¼ýÓÒ±BX(ü¿&.}b†·F‘ íAÒé˜~ú&zccU_¼ù‡ëfø¼#àÒõͨ'bºBZBDÒE²ß ­¤ T_i3ÉÃ_.eÏ\œ˜6”¨9Ö§À“Y½18jÏs·Ñ !ÈŸ¯®{¦½§¿*Dr ØÍ¡»¸|$68‡³à°ªˆ‘pƒKâ ê>>O^&¸§ÑÃò¼nÈkK âRtAdÿ¼ Dö/𛑠}Oá®m¾Dx_W^yÒïrø}üûÈ”þ^„CÇO%Ä·Xð%=y'60wl¡ûÇ}=ßì¿XBûºhI+§@UžP£ðìÅ“ËnKâlâï¾wa?TWJÙeÚyN4ç  ø<Ú™*²_évæx’åýìšmé*ÿõ…KÈbI¨‰GYÓoר’WùWÚö‹µ w®~(²âó´ïê ŸãDãgÓfš1éc²¦±¿qºñ/Î&ð endstream endobj 721 0 obj <> stream xÚz\SWûÿÀÍu¡o…Ö÷^Ü­Zë¨V­uk Šu ÔŠ"{…@ {%Oa@ CëVœ8‚Ú¬ÚÚjm«mmÕÖ¾'öÐÿïÂ0ô­¿Á'\>w=ç™ßçù" ¬­)@`»ü“5ËÜÖOZââê:mªùÊÌ4,7íy±ÒÆôe)0ý«Ÿ‰³2°þE ª‡‘#õóóñþPóq9¼ÙnGY L„ ¦N1eêÔéK‚C¢Ä¾Þ>Ç7w¼å8mΜ÷&;NŸ:uŽã¢@/±ïŽíAŽ.Û%>^Û%ä$Àq]ð_/I”ã›ó|$’¹ï¼#•J§l ›,öžÿÖdG©¯ÄÇq­W˜—8Âk§ãòà ‰ãªí^ŽÝJOéþ³$80$\â%vt Þé%"ÚZê7nîv¢`?ÊŠ²¦hJH1Tj5D ¦l©!ÔPjeG‰¨áK½F ì)êuê j$õ/Š£xÊ‘E¦ÆPc©qÔxjõ&õ5‘šDM¦Þ¦¦PïPS©iÔtjõ.5“šE½GͦæPs©÷©yÔÔ|jµZL-¡–R˨åÔ‡ÔG”åL­ VR.Ô*êcj5µ†ZK­£\©õÔÊú„ÚHm¢6S[¨­”;åAmíG ˆònTƒ`›ÀÔ­Õ&+½µ‹uõ—ÖÚ8ج³)·yBo¦ŸÝ„_2þÌ©þ³úŸéÿb€ËÍ€oNX9hÜ âÁÃÇ n·]i{lÈ¢!燺eè÷æ3Ú-°ÓÙaQùðeß³«ØÝ¯ z­iÄô¥#ý4{ûjûŸ:h^g^ßòúÕ7&¼¡é;òî¿æü«ž{› äY>“¿ê¸Ô±i”hԾуFGþrŒÿ˜gcec¿ç9.m|ÿñÁ¶ðä®Î4J+@>O¬ÐS{Ú3+1Ñ3m¾Ùø w•'ìÌðT…Ö@ì…ÌÜŒýgTWTgT§²ÎÂi¦³ÐZ^\®×WTè9[tü{±é§;?Y¡ Óe6ó˜on,DBP|¦Gö°WÉ2#ôP Ùe* ƒÖ¢mÿó¶ C£ÛÑøv4Z+h2m²2õCï±_Ò…MÐÔäq¼]†ÆÛ·\𢋑0»9,_¤Œ“áÁöc_yu>ç>>MPÈNGáñ6›,>¥cðH%U­ã ³.£°ÙÚÿöª ~ ýÀþÖ%d,m;» nCémhL› ©µ­õòkeZòb›•Ÿ‘ 9L™L#å 925×üµÌ>-A‘ ÉLdiL9W9eY úîwöÆ® 7îZ½hQóê'š/ÜàÞ]ÊÆEÖ>\^[XXâáÇãõ¦[ì­­›7y­YøÁ§ëŽ·ì;³ûIýáeõEEež‘Áq¼m¼]7 × ½QÝz·Ù­Þ3Ñl]R õ aÿCËÄP>d©ßÌ ±:ÏKÒ3OŸÃ¨d _.ݸÞ}ÛrÖéV&%­Y¡PF†ÅøÀVfÁ±%_r§à@cþÒÈCŸœ泺«Çw‡‚"TšÊ§yDÆÆÀ.ð:šX¨kÒͯfðJ4‘•Rž†\æ|MMÅžŒ9ŠòÞ¸Ž‘bk6'¦Ü¯XR±3;Q¶kƒwª÷„Kµ</(ÐE˜–àG—ÐK×´vWMöXú™èÿ¡#HÍ|wiÛ·×Æd@.0Ú¢²4qy •XóáîÐbD]°/Ì)ÊrbyÝ]’Q£ú êò`·Ÿø™Ý¬rÊÅÔ%{yž’‘ÆFɈ‹ RŠ’‘`µ=¦VÇ%Ǧ€Ô! ‚öshèŠP¥9$‚ßîݰ›˜_§üLQÃØÞÖ¡ÚÑ|bµ´Ý @U,m©G<¡ ¡É‡V‡ÇàÑ—5†Fã1tø4‘‡ 9[Ì“pjð0ڂƯ¸LâÙ”ÉÊ\¶ÄÄ¥%¤G¥‚”‘•DkŸAý ;?õØ! ô÷ªïæÔ£ÊÉ ùPÕ.h5Mµ2Í!JX4¸f©j[@ÃDú0+t«m¬ñ÷ìªmÜWÝÐÀÙÎÖ½hçM“­Lî/†°9¥* ¹ÙU­á,K‰ÅßþµÜ>9F ÄD•Dk¹ È)Q1¤´L¹Á #ú”¤Q:Ï¢UãÐÜ[OÀ¯cg¼êú!ë'èuäÌaœË~àŒ 7Ñxã¯7®·¿…'à7ñ€ˆŽ“­áñg*ɢˤ¸K¡:‹„”¸Ô8¯Ynñ‘Še„‚qYj WÔ‡÷1s§ c °Jx”e)è©´Y`ºApê&ª3Z}~žMLJI9P ¥zHïÎÉkäk„åPáë‘ÁN¤/œüùæ¡ý—Z^†o4hüMl‹Ì›3k—>^£«Ôè9(L-JÌ)9z¬á,0w¾Ú:ƒ‡e›Ö8¹šý€2."wƒÝáŽ;Pˆq‡QôØd…î±­{õçà scñçXˆ-ۼܯZ®íVœ’ŸžÙÐp ò€¹zÂÛ‡@™OH¸¨Xá­X›&bD¿L*åŽÒ¿žühͪu+§ò;`~Aè±ìì5h™ªH­X.óŸþx ‚F|÷ð'z ×¶\pª'MÄ€(ƒ©¿VP׎ĭVûP:› ’O~yÉ ÊÆ” mqÞGç¹ ê–åìôœÞœëËÓaªŒ•2øýN†EbôÌ?Û[ï"΀fìNul0"¥QôoTor`}À#Ù3ÜÜï’…/¥á Ú/9ÑŸÇåÂ(4re•›_Ûx Œ@§èÏ;G;¿¿ôã÷ø`X‘|6;;7‡ØY')&îœ}w²FÃ~}€¬8Ñ¿ŸÎÿà̾onCs v§¿Fò7#) ¡¤-£Q?Þ¹{ 4>;•ü¤@V&­©Öjê[¼ÏL$ùù:ŒÝ9Ñsœ€¬ÿŠ¿ÜEƒ=£÷ãD&7p‹v÷d#>À:ÃΩA¡Vªj@™äG•pbÐeŽBCz[ÛÅ_Þ>ýÑ¢™Nk—t¦fƒà°ñ)‹Á¦c,^„WúâÀý9ø5i4u\6jFo£Å† Ú²Œ (fÌîáð·tJi$ã á‘üva$„ïi‚r}—´•ä˜ÑÕˆ*ÉAô• Nv±Ë‘ÖS­Ç¿¾un³ÛZÅü×ì7µGZàsgÖ-<zoÞ\ÖÝøu(ɨ…+VÃBfâ£h²{xÿ17/,Ò1óp#;Û©Õh8采çV®Zî´nvW÷œÓ†š‰{n(öI챨†MÀC?xs$‚·*¢4+;[ ¦*J*–Fú—-Eà ˜! l"þE)ØÊ8[ŸMNßŸŽˆŸ‚Sš#<6‹»áó÷®µ~Á½¤TZãWø ¤€B©€THÍŠDÆuýÚٜƓÊLÖÿÄ2|ÁúŸøF –`N×»f¶ú‚èé«_=ZÝiÍÆ®÷Š”%¥¤Ë“IË4ƒoÅÏgõg^Þ¡Á¾ÁŸζUgòÐvãîjS [S”KúNeda —éJy"¾ƒwØ'¦Ä&‘)/67>?}½ì‹3•¤ÞKË +y('×sð~ädo‹ÜÚï´ ö™\­L.è [¸›Àø.óøWZ¾‹ÀønsãxŽ'³ÅÍ䎟àÿ¤ãüÈf(æûj³–'OmÖŠ’ rð÷È‹t»tU"01‘qÒíÈõd´;ÙcrˆO6«è )+åò SUœÇtÍÉèwƒ][ÇÑ'Ó¾ùÃ\ÐûQ ÇJÏ=:YWÚ\§˜fñ=ì‚GmrZç_%Óõâc~ªºZ,çS`ž}êÀChx\d÷>L‡ÌNˆÝ_Ÿ¯ÞCÜœ³ÿ¥S ' ¨ž‡[hEËÈ 6ÖŦg—ùó¾óLlƒ¶Ï½ÑòóA´è  ¼ÄCñüþÙbäøàî¹:}0$ðÑ >þ^ñ¾À`j"¢ÐhôÖÓg¿ñz8’P¹ŠY¯±[¶_¼u÷èÙƒG¯™;×}í6súÝ€Œ·µ&?+d4Ýf÷ÉU$ ½ðàN½$¢ˆOII€X&°4Ü3º¬ŠÀ›¼ùÊßmÐ,ºrŒ·”k”ñÏhM ÔóP”š—’2¢ÎS8«¢¯`£ ¶7w*a0wŒHfÜlF°w h aôw.~žþNù±4ZÌ^®8| Ú˜ë«î`+GÐòP2´’†Æ×vÊiÑó:FLV­!”4²¹Øq‹ãæ+sË'\ÈbŠ@ý]ýb÷M;W¿Ë÷tïýFtõ¢•)²·åF™“i ˆûé·j?!ú²Øº«Ÿ¯@ä/z 1ßw<Øñ|"q†"(ù­¹ažÀLùšˆÞº÷GÎn-ž›SLè´] ^nÜ1¢2£ÕEb{t-á+:åáôË3äI£÷‘#š‰Þ‰&b ;±&ùÏBdÓŠ0ƒû¯ÁC°•Y" 7 ƒÝc#aó×£VG«ªC²h2rµÙ«#òB†Ï0‹ ¬%e‰½q¹ *¯v)#&&Mè^Ë\Ä]uðòì ýò™pä@?BýÉ(’ió²äovß—@¯ÈJS+3˜^ߌ(…¸g9±ª•.®íµz–ÅãÍò]–3Ó Þ"Ñ‚Žd¬4‚IŠÐî1FÇ‚öVTM,;d²a㼃R‚%pl*T¨ªÄ@êºîxé ‘ï” ý#z$ßé]øó¦P•°`ëeìš›+)òÊNV'&Bçægª¿CêÂÓŒª3”~åËra£Ù›bbÇ:RbiòÄÐ^sµ¢¢ÜZÓlÜnYf0öICs¢½<û£O&™‚U4ZÙ™^äSª¬‡úÂÌ}¼I]mTGõM×`%݃–­FTKRÆÇÌuFèI t‰Á‡ðA]rA++jÑA{ž3ĺ¸q'ᜅ6¸Zp´èBCḠM‰%®…[`!¬X¿>~]hÄtèØWIKg À¹HaþàÑ£E°Ç’> Ô)ïtˆµäw m’[ÿAÿ|hù† Û–O"–˜' ÷Uÿ}̳%(çA-Ý_‘Tµ'¹èpYYSÞmõøŽ2ÿ4Ž+‚F(P©cOOÈHË+€R‚ÃÑÖŸžR}™ēpÎ@+|•¼èl…ö!t€>ºÀ9ïøÖö’ÊÃe›ïÙ'–(UR`âiyDòªJÏL5S¨=˜jGàÅɸݨ5ŠbÐT’Å_Я޼É}ÍT~ \ýÙÏšË p€ù~ÁBð²ÿ°øÑ¢·èr¨‡ÆàЇíà åþš@}Ì`.U}¶¯ÑÜÒHKS2IŠ]ÑÁpô4— 7±2®N¢“ô0^»SWPé¯+¢G¨Õ²ú”o¥ð.ã¶mõ<.6eí¨Ý^›vPY¦Ô(Ëü1·Û c@\O˜³º8¯q !æ20ˆùâ~—½ÆyîÉù Œ=[¶½Ð« Ž9œl9~C ämu@fxAж»í»±›°±è¤@Ϧõ…î$V çÍâᣣN߆1¢GYÊÇ’âôÞ©1"#²ïÅLûW´¢7h¿¤$?~±ðåÓÈ¡Sî&´ñ¢ÿèIf½iDñæ†ôÊöÉSü#íèäæ¶ÁùÔ¿9ôc½ú^õÔ¯4rï'Oî=DC8Û$iAPf’uËîÂRó;ãº_ÑA?_ˆÝ¹ y›ƒ’NmJÓ$6O49Ø7ýãɽÄaš|¯R¨‡Z2ç53D>"½t…AP`RZ™‚ɽ@9¯O:Ñøû¤UÉnÊ`²HÊå-h“RX)!´'¤žž¼oIu!xÙÊòä3n&Gû>=o^7òë!WÑ_tj³}ª ò@ ùÚÌœ3(6k?£¢³ÜÏà(•"G\9ä~d7õFnŸÉÝ F_³ÈIl*,E>¦Ö*¡’_ŠÇÏGãm´•=9ÆâÖJ ÂádhÒØ„[Ìú½[LHø‡hïxƒ$üï·Ì+Hú6[Brޱ:‹e=ËW@?ÇËOÎE³tUzÓFG£7ñ¼B,|uOG+zºh4o!šv™±ù% †|fO8DrøÞ+r³@ˆïtF%ÈQLpð­€rμManc-³Þ¬ÚÎ6¼CŒÉ¿ÌZ§îˆ¿VÔ {8äÔgX™üb Ýg_ ñ›šŸ¤ F*‹Žâ!)+!3ÝýëCûì„Üè `´%š2rÓòÓÕLïšrRqg_Œb»JÌOÕ ¹*•6£XUdÞÁúòTÀR^t /KÇC6Â$fù%çgœ(¢ÚrŽ50ñhûžkÄÎ(ïhwóþ†‹çžOyhù¾ËbÌ é2 ›®a^mÉÐ\“=‹œ»ái±…ÙéTÓRˆ #©¶šµØ~(±‘ ©àñOH„†Lÿe/’m÷(ßo´¾.¼pþô¥ç¿;i™ó²|î7³Lô•Ap݈Â:H²!«‚.ÉÒ”ØÈ-‹€™µ¤ý‡ãz$Doè>…D^åS.¯¦J§©»>ÜñÂñÈxÐãâ÷ü¢éqèÕ.ý÷öèÿç Öäû¹ë½¸(çÝMjúöà鴨ůγtAqÁ¤ÉX„‡>˜ø1£Öêëäo½T¸Î}öü¥_ëø¹ýJûå–u®]fŒ¼ˆ†g¨Š$÷<´ŽÕ•C3¢Wü‚_Ã'M ,ÉöéxDÿ؃j³‘|$¥'G†²>1˜Ì OÄ|Ϩ.²Å×/œmÂ,Åyc»Æ6FÒw¥ññ=+¤6Ñ,²íS¶Çè[ŸC=—–·³I[Yª¿ø>ļ?ë»Ü† Â.³Ì@ò·ï3~WYpe<G¢.¢EçÎ^D[/ÚÕ4"Wã§ç×|!úw<’£¥ìúíÇNŸ;|øÔ™ƒ[6¬õðpã§ù°™Š}’`^ÿ‚4Ìúĺh½®°*«H¥©LÎFSYXWÙ°ž‡MÊ­¾1>å[y{éBÒ·iüJ"¦âcÃ!|ŠÅyq‹ÜÉPÏÌ|¾ Gß·}ÇAsÔ‰Ojcs¶WLf±”aÆ—¸âøb¥2 +£8+ŸAñ%vÂÂC‡y(ËklÔV—æÁu`: ÌôX¸mB/íJó çJ"³eŸ~rh÷¸ûFF2hÕ+²Zîч½Ï ‹{‡´Œ~rcßÉÓÅÁsXº³ÛÅf2ÞîóÝ·ÛOìדåF2™´™^ïžÑ}aƒÛðà>sãqK`FÓ¢§&Å+þÉ# ¤ÑÇ;гðç&ë—§Ó/cŽ^ë|›†hð õ ñ Õq² U&ñ]£—h"$áÑA ~hÜ^4è2'zdúíëugà@’ýÈd¿å²hÚ4õ¡pSúÏ“mÐón§:[Pµ¥S¾©ÆöáÔ›nÓßÜ |§{Ÿ¦KùñÿÁ3?ÿ»­]!zL¶Ïù>òZO4\ v§[Ñ@óGt LãXE½¢€ñ· '¸MèÑÑûÝ*D€7>ŠZ:;PYíÌa¹0²7ì7ÿöÐÿúH*auˆžÎ‚glðNÙž®­4Ñm”‡…3/õìJUÑWu‡³P²ãïÕö?$§èÈÿ!=‘ŒîªÑW=5ЃÂ猨šTˆ7 TgʯØ[OyâŸ&£~¨ßO?#;oÇ3ÙE.7ýpåʵ/.;Oâ²po‹Åô޹Ò\{{ÆmB™4ì?·~E—èé¢ÇuŠb¯¿—¢þ¿³–î]ôF×¶Y%ÑÜÕäÈvÏÑ^\HgÍZ‚âÖãºPülj¨Ž6ë*ì¿©Ïüó~ŸT¤—#Ä®Ý4gÎ"çöÛßÜ<2߉{ô¶-¿':‚Ĥ‡þxág4˜S…i¤ÕÀThKkµqgóŸÀŠ(וŒè«=Ý%€ûY²þ6n›Û§ŠûÔÝ»/ (Î`=E'I­I²¤™âì ¬ áS¦¦±á'î[(Ì UEgD7ôPc/I“+’=tI¬~_2Ç›‡wžG?”Ò’ôM,l`víò›Êmuâ[©ei¡=thb7ʃRUas‹÷i…žDgzã·ÇyÑSø³:ÿ쮹jøM+0»`:)D±¹ÍîSg³ïÐ/g½9ïZšÏ}œNOºê}ýÆíCe óñSFDsJ—µ `æÃ©êž~ÝÖ›ö‘èÏFV寃2`ú¶kRÔÿl×¾$ã§ÍóŸ»9TùO(Çyô$cØuNyä7ëÛ´Sè¦APe ±2-&6Ô÷1¡¿%8z ðM,@7mô{â%ÔÕÓHˆújAåP »‰pZdDVA©)ÞÊ´Õ,ßÌ ŠÇB:*¬‹%”ó-ôF|ÒFI§ÕÄ;u)½À‡˜Hˆ'$fæÒ¤„ĸ¡“6-Ý›ÙBÍ{_×A=wdI2eûÁa?d敪響3+yÉvkÆý³’ £Ëui†ÌÒ¬ŠTÔš|Íð-fá6ûûìEõ掠ü¢ñ žÚÔôNœ¸¿e³l?à7ñP<Óf‡å*êß»/À†tà!6Á½ì…Ü{¹Æº§o Ýû_ܾûÆîJ‰J03ÉòD]rù”Ü—ÇõAFãY  ¥(ÄsbÅA®Þ ™TÙ¹PÄTG•‰C¢£B·ïÙÑÂ=#È>« ×!-Ft kûö«Ó’¶¨é!8º ÎV Á©AB|·DH•éÝMpLCè 5¡Ž%Ìy ÅñÂfŠƒN˜?½ýJÃB5ìÏÌ-Ûw?£ µV]Õ`·e€±Ñ3”)°‚™iBð™wŒ·l£’FŠ4%,°J™Ï×(‘ =c=ƒç É´ä~*è älòq`H^4Ô‰U‰<™ {¡A3…P~Àµþ`uÉnU5ÓC˜º¿ñâ öå þZ ´|áá?•½À‚ޏÕm®Y™åL4©£Ðò4hNAôóc0YeG‰ÿ!É:ÅHcðr!,¼ñ8E—ÊÕ áïÁOÚ’Û*5œ=ó@H´+Ù[º·ä¸ªªÛúú0U¦Âý2­Œ­) r¾bwý&úÎädú’-••Æpñ’šœ#'…‘”[[$ÕùBÇH¢¥² pˆbbJbJ¹Pgç¨ëõ5¥Å¹‰EqE±Úˆ=P úÒJ¶¤®ÊÛøÓ’<´ €ÆQ9BÃã@àAÆAƒ¹ÖQÁƒú›*†ÿ§"W endstream endobj 723 0 obj <> stream xÚcd`aa`ddäŠpóò Ôvöõõ4 ØNûÝ'Ãrógëi†2Œ?d™~È1ÿg‘{èÅòŸ‡I–á½ ˆ|Ã"_€Hu Áx@ˆ…‘‘£´ªÓÀÀXÏÀÀÈ9¿ ²(3=£DA#YSÁÐÒÒ\GÁÈÀÀRÁ17µ(391OÁ7±$#57±ÈÉQÎOÎL-©TаÉ())°Ò×///×KÌ-ÖË/J·ÓÔQ(Ï,ÉPJ-N-*KMQpËÏ+QðKÌMU»]L:çç”–¤)øæ§¤åÅ$ü˜YÎüèàû9µqõñÕŒ?–Ýdþ¾óû;Ѷë®óR»S» K*³‹’êúÛ9¦´O‘›ÝÝ3iÂìù·¯^Ýͱ¾;©Q¾»º1¹%¿¥ 1©­´¥¨µ°¥¨%¿>²»•£tNÃ\¹¹Ýs¦OžÕ;qʺ ó>•˜´´îÄESÖ®;°aÃüyÛVìæ8ÝQ!ß P×ZÕRÝ]ű3ýЇ½ß%övM¯”«íîjk­¨K Œèæ¨hžµ@¾{þ¤9SÌÚ´ã;k÷aŽ»¾kíå"»½«½m8øÊüpž:mÚ÷‚l¿¦²Ëq±˜ÏçáœÄÃÕÃýŽë÷º~žïE¬ ¹Â endstream endobj 724 0 obj <> stream xÚ]PÁjÃ0 ½û+tìÃI c(î9ts»Ñ£c+©¡±ãò÷«ÝÐÃèé=IO”·ûÖšô+8%0Bo¬8¹9(„cIY6*®UÎj”žP~þCŽTœÞù3?ˆóÛË騔¯ ±¿3Ž‹G¨ÖºÝ‹eŠ8¶¶wÀ ß·S lvÚuø”°Ï 1;ÀæÄEFÄìýG´ R×y\y?I9“— ƒ´V5°¦© Zý¯·*º^]d l›˜U±­2wE“*Ù{¸Ss·½ùÙQZn,>ÞäOª‰Xm5 endstream endobj 726 0 obj <> stream xÚcd`aa`ddä Ž suÖvö Ž´ Øæþó—aYøs>ëY†rŒ?ä™~(0ÿg‘{èÅòŸ‡I–¨JH2üá‘ß@¤:Hxƒ##¯HcÛÔ‚¢ÌÜÔÔœÔÜÔ¼c=#çü‚Ê¢ÌôŒdMCKKs#KÇÜÔ¢ÌäÄ<ßÄ’ŒÔÜÄ 'G!8?93µ¤RAÃ&£¤¤ÀJ_¿¼¼\/1·X/¿(ÝNSG¡<³$C!(µ8µ¨,5EÁ-?¯DÁ/17Uì=0霟[PZ’Z¤à›Ÿ’Z”t"“ƒjgì``fddq[ù£ƒïû–- ~Îg\õ½ùûÜy¢fôOêžÊ±&wa¾\rwCF{íoá?ÎíõÝÝ]ÝM;§vÌmîíîíîëžØ=ißÏïß;AˆñÉ.æ7¿—‹Î^ؽhQiwµüŸ ¶ßå¿s|ý®ÓÍñÝ’ .ñÛ†í·ÇoÕß ¿~;Wû-ÿÝ]þ» ’¼%Ûoîß_ë¾Ësð/þi¿€í·Ütv9.æiªÿy8'ñpõðpïäÚɽs.ó~( µ¯q endstream endobj 577 0 obj <> stream xÚÝ\[7–~ϯàÛØX¬šäáu1àØÉ¨¼èÉGоÑ[r£bq´f …q¼‰_„ˆ‘QÕ1Ešƒ$úQp89G\ŽÆŒL¡¸ ½U“ªdÈû"‘ Y$œ,YÜ•Š/¡l‰Á"?É¡j-’HÄOp èÒ–&“«s*€ R$d)ErN4SJIdCvÀG…ô‘¬ÑÛÉBYèRÙÄÁ»Ù¢Ñ,²›-*‰|7¹²’)ê-.;\Š‚alZ4L¦°°èú9'cçˆJÂÂ2ð7'Ò³Ç9‰"Í„v#)(-h‚&·Ò”!n´Ap@“MFA'¡Â¾3šRhZë(¸PD!+`ţܦ8¢¨ ä§(sVÅÏuDä@^ˆól‘=QR£3Eœ-£²ñp1òBN…‹1pÑ‚Ærqò8c1þ¥3ÐaÑqDèžÃÙàhžCï{=¸ÂÑSOÀ…5ùŽÈ“eÉH6Dw2&aàbR¡j–²‚1d‘ÑÑ4Æj\D×Rt­µÙddZ @´ù€’€ “Ž¥²DOIIQi=ò ”±-e³€ÃÅjYɦ“¡ÄDÔš–îdÂÄô¢ÉëJ4&ºgÑ›KŒ£Ré)bXzŠ”Pu4BM@Æ( TZG8Ï‘s y—KÉÑT)P¦H¾‚ ŒîQ‚JÈ$*°ä+RRDLLD†F@# gòL4Bº‘ì1cVBëEKÙH£î"ÞÇ&ÞhKB¼?ÿùêÍúp·zòzuPûÃò°º_mO¯žáƒ×WÙ¾Ù^½xñé·ß^½ZîðQ)|Zý|õ×ÕÇC)·øæÛo¿9á´åýê°ÚõáÒÜ«Ýê7|ãkìÔbÿ}¹[/ßß­úйjèÜB?ßnö‡Ýr½¹ †e¬»Àøû>v®±M‹ýz{w ÷º‹Ël¸v¤_V׿öqoú¸¦Æ…÷Åzÿp·ü£¼ê#ÛÙ‘ÔSDGÁ† ~Xïö‡#‡?.÷G¯žo‘È¿BÇ#k¾í[ %ÉDB)Ô”Œ9’2¹"µãg=Î0'í)l7­¨¡ÖZ®ã3âóÙ~¿þ°a¸Ýêz»»iÑÎÒl®c'bçõÝúzu ,O€±Ø¹žt]irùän¹Ù?l÷«uÿI*×}*#ž©Î¨÷wÛë_[¤Xy è•=9<зN"ÔÎ0}¾Çœ¥Þ\Õ4Úœ~®ÇÜN€ Ÿ¹FU´WwX†/ {ÝC6d;‘iï–»Kئmjl¸à1‡O“±}2¶&ã&DxJõÛzg‹ }lèwk}§¼©2ŸœR¸œ2tœrd…Ÿ¶7«»B¯¥äkJ¦vÿ4êÏòoݘÒ³!û·=émÿx{»þ¸js¿?+Xg°ù̧¸·; »ôõã®,¿^Þ­67hÿÃú¾-Œ¾Nñ‚6@§‰žô·Õ®ÔÜë_ÐP×ÜUïèÖß‹tâq‚XÍ—ˆÖ ņ‹–hê ÷«°ZnnüöqS*âÈ.•K œ‹óåO»„xÈjÆ%ùõß¹}Q7;ìÎw-ñº2ÉòkäÕ¿{öúû‹hï'ИMS§3 Ò—/¾{~ùº\g3Ê&?ýñú?~¼}Ó‡†éFŽqF†Ì•!MÛÂÕ`H×1d)ÆOm‚Ècï)µìÕïëÃ/êÃÝÃ~{ײ±êÅycßÐÉZ«ýõný@®ª~Ç~ø°Ú`¯­°ùåÕnÛDÐgÚ;“aYmV; Šõã+õ°Û¢.©Ç¾xs݆w0À"FÞfÞ/‘÷ûåÑ@í(#V‚“÷sƒOìrµr•…Ü’Ò!º\ƒ\£\%|¸{ #q¹ ž<30"xFð„%coG‰G#i$"„¤aU5Š5¶›B“Ø‘+Õ;Ö·†ƒ¸…æÍ1]AWI¾丞ȉ`œí8 L!ä:i6B¬F¾g[æ‹ïÉY†ÓTo±ŸtÜ<8€8ˆäFál"õ÷Ô ºÅwÔéÝl„Ž:}œ¦8WÎBÈ—t: ŒÔãÅ0’½O§Œ ÚH†6’¢ çè6,BWdÓ0š°;ÑÎäR0Öaô³ª6@Ê…ázÑŠ™ºvi; .4•˜ÇŠi¤Ü˜4™»’ŸK"5¹ .•ÛŠÏž EÒ$óù¡iÂPN$YKN{`&Ð*V¤ê ©cpõß±}S/iAl§²™‹;¹"»Ù\‘ãl„0/Ò¡N½i°¯D¼4)&û“Ëç¡çj­îb:gÐê¦I„<ÙVûÙ€§¸´ÒhX=—ÖèÙ˜M\:=É$÷)€®I–;›wc„0ÁÏ«©"K1¬•ÆÊž¶0—÷Ì+²lS¤»³ÒÍ k¬péÀ¬™jƒ¬í…×úJ:îÜ*…ÇøHÈKÖ’³Iø†„;‘)dGf%©XI* I€¹$¹jU$ý¤AW†Ðúi7‚<!Ís#W¥p+ÛP ñóÝÈJ³n‡ý±l‚…µ±,®—J\“ë¬3?¡Ê²!¶n2wx=³ÍéègÒIY“$ºl7ýµõMM÷Óéɧـ3v– ë%¹øð^!çÖ Ç%Cr¹Ø©š<ÝÈ‘Hú~ÙK„ÓFä­•“&ƒ:ô‚Ú·Aš ö0©üfv‚:äÙÓ'\¶Û¢™×6xS;€¤Kiú­ÅبOZ—Ó§66öúïZ› ŸN¥ÝÖ{ 8½5´ æ"¤NMO]Ë·É8ú++‡F6MVÒn:ÂÌM%õqV¿/Ò±aåp˦™ùþÌ+¤¿·qHŽò:»XÛíŽ}Û•ºcˉªœzµ˜y6fjÔ5ÙŽB·¿mAO%è6´c÷±(-»•£D£:ÐÐa§W‚nÙ™Þ1sŒî ¸Ù)L/Ó"L{X=!Ï«‘Â<¨ÊÉ%˜ôù‘Òpƒ—‚ kŸ»s–æC"}ð»ß ÍôahŽÀá[<ÀNeƒM³1›ÓìpìÖaøÀd²;˜ÍvۇɒÝî| èçn¨Üíð¹|Ô3|*nÚ,ÝV?„–鮺 ö¡Úé›Ú~ ³±šíW8ž¡ƒ|“Ÿ>ï´Mœ¾5èt.÷a6àÌ=w¨:[}ø™{î3o>Û“ö¤=§¹šÚ @÷08¶ÉÔ7”h&ÕÔíˆG€aº‚n cGѱ«h×Êâ;y6B'«$;!u:¤î™¶œÑWÜØ=ì#ÌÜðƪ-ùèRø›ÊFâðé½\Gÿ%Þáñã‡àÚŤÝpŠ>|®.Ëe+†½íO«›õò»íÇ·K_cŠÙ èóÝjyØîžü¸|³ú/þ®Ï/Hg·[ݪ‡åõ¯HîéÕ«Ýöæñzµ{róÛúáæöþ£úÇ«ÖØüãéSYo7ô5´'/þÍj|h7ÆkëþEß´þÓS¦÷òaµyV¾ÆO_ý°>¼+RÑw‚®þ¶_½|<Ü­7(ä_—÷ôuîµ®†Û§ïœ&Žz,Êy¾<,ﶘÒG÷L ¥î;G?§?"”ñ Îþ~…`¾ß\—¯—_½XßÞ®Ð\èoQÙˆHH„@+K~ &.èO?›×wß¼MÙ,ˆâ×ÿx?þþ‰ ^µ]$´´[8:ä-¼ðm‡^ÆN4Ê1çjYɾbfÀ °È=éïrÍu)á,û²;.ßå®õ^hó(…€¼ÉŠã,ä1Ú…UÎçN;ËÜ EGœâè™ù¹‹º\ùçü]ÿ'Øp”*xÒ…×I¤×ôÝÂkСh†W¸…ŸÄr¸ž°zÀéŠÛnÔÞÀµV¤/+éôÄ+î_p.ÿB¡ZŸLBçM¥Ü¤dÈé%ýç’Ò)„’î5ýy/jÁèrÉš N'‰œèn‰%úËj ðq¹Ì2 ŒÑï°y#Rñ]–’üð޵'«Ž3©¤ÅŒ/¯..¬<áµ,c£|(ŸJܤ¯mpÑõ펟•½®$ŸÂwe™\’ã4‹­ø ó¬O&nѨÃÝ)ýžÞ&ÌÓ=~º+¥Þ”ðfݘS‹Pð¤Ð«@™ÃêJ$wp ‘¨¨àÕý´WÇrŠIÙÊë™Ì`(ïM¿’­“éÆ-…œ$ö_øÚD•Ë ú¯*™üª §`KË—å¿® ï  R¤¦À•f9•Ö÷&‹\þý…dyœ0¹`H†D@eœ /øÿˆÄd)€QõAÈþ~ØP¸OR{GPþ9‹Ö|5äC€ž”DºËú»™^ùN†(3Ns©"¢®Ìv§eËÎcy-…d¨+g-ž®õè£ùJ¿©›SÁªš‚RI¥Ñ¸!ã¬/¹Tn"ƒ´ßzQûP ihÄ“%R_Ðÿo±²2òüÌÕ0zZAz`¼½'µð†ó®L2ŠÅ*®zzâ›GéHç4-¦Ñû4ewÖbyî(17<.¯´9ÂK³»/αt+¡Dmz{Ç”K$dŒSŽˆ.™â±.`ãí'ÝÙ—öÎñÎ5rÓ{º£ÏîÕŒSÖõB‚Ÿrª°EÉàdo\öŠVØpèȾÂÒ]|££óê&'TS²Åe`ùÕª~÷ÿý÷ÿLZÚa/MGJY:4ÚlVÖÐ_ÉnÞéάáIÆ¥5õ«þßÓç»oþ RîS endstream endobj 728 0 obj <> stream xÚ¥Y T×¶­¶éêrBPK1¾T‘8|5jPcŒÆ8„I#‚âÈ<6S7Í<ƒÂiæyìdFÅ 'Ô qnGl5橉ÁñùòŒY/·\—üÿoÓhw~’¿Ö_zÕZEÕ=÷œs÷ÙgŸFD™™Q"‘hè†å.Ϋ>Zj¿nÝ\ýf§á8aÿ‰0–þ&Þ pba´Ùû%в$WJ¦¿~o¡¿~@.cˆSf"£ˆÎ°±™5ÝÆfæÒà¨0?_¹õ$ÉÖ3æÎ3Õz¦Í\ëÅA^a~ÛeÖöÛå¾^AÛåä&Ðú«`?/y”õ¤ù¾ryȼ?V*•Ó·…OóY0yªµÒOîk½Ö+Ü+,ÂËÓzE°Lní°=È˺Ïçé}×¥ÁA! ¹W˜µ}°§W˜Œø:x’hªùü‹ÍVSvfkÅ(7j3µ} E ¤QC)sjeAYRéÔHŠ¥FQ£)+j õ5–zŸâ(žúG§&P©)Ô4j:õ1eCÍ fQŸP³©O©yÔ|jµ„ZJ-£–S+¨•Ô*j5eK}IÙQö”åH9Qk¨µÔWÔ:Ê™ZO¹P®Ôj#ñbñJD l¡žˆŠ&‰ÜE»Eÿ9 `À‰ÝÅ;2k•Œ‘ÔKîÓSéú˜t†´Š‘2®Ìµ£z2”2¨gðÂÁφùi¨ÝÐΡ¿šlÞ:ÃÊʪ|Ì‚1åæŸiÞÈÕ"´P'V¯g¡")/9[=rGüw4Úš#ît<Ö’Ÿ›WÅLQš:„“Ü5_}²þ³è™° V•M½2µsé=Ç]À4ä©‹x½I‡³"Ôª££³,\{±úÅÆî/·œ®Há!¦(µ0 Y}rs0FØ*¶x,Üè¾)0%-= ’™ä¼ˆ®ž=óèë•=p“1Ǽ B#DÈ M£Ö,6]åå¼3* LlyTuë믑ÙYïŽMžaAþÞ !í\>䫲TŒ9ÒÜlĤa‹÷Aû>oHàñU:Ñ ¼½Ú¡„7ƒébtïÛØààÝÒÚÞÐÒÊõgé¬0U,ly3„-¨ä3µ‘åQ\8$G¦'áo[b•™ÊÈ«c«¸:(¬Ê-f̵hEÇu¨d8„¤9L@£±–LÄïa[ìð3ÌäzÙrØç°_Ø“HÇ£ ×þÑÝ}m 'Øã_µ­ý™V*ÉìUá.[ \4¤$§Å.÷ñØ›©È€ FYœPÇ€ýšZ5ÓûñLiL(ø4@9réòhm …~&­7˜¨z†òtâ«Ù”ÔÔTˆeü ‚C?Òm…»ù&i5Ôz{CD‡ô×G‘YÏ®Úö½ÝWá' žô-¶À?ÿüSÖ¤ru}e3š”üôÜÊÇëOónól–;;zøëvh‘‹VtëY_%èûúðrW»µN³ùPX˜ã{ÈiŠà,+«H¥‚,Èav)5¡áòX¿YÏ×"K4êѓܷ?³IsëTþh`î.¼‚%xØê+ƒj¢víÒ¨ë9(ÜYœžßÖ …<`nñvç!8ÞÝ3,4:*sÓNÏ ¥>E$ÈrŽ$àµV`HF»Ï‹÷!`“ã!"YNÜ>©Æ;ÒqÁàß—¹UtY#É\ÄòޝuÆ›ÅègzwJ¡/'£Ã -3>‚Á³zi çü\ª»V‹fhEßëP /t°ïc5í—œâÅãR©B÷pU›[PÔ¼÷HY'0÷/ÿrÁ §¹¼¸T(:T*«ü"UVVIfê•êÐÈà¯y÷—! ²ü×c$þyþK<ó÷ôm ÙõmÞtÍÖŠNDµl<1æLˆ™JYž“›“ •Lmt­,D´¹Õ Ñh,†F ”ˆ©Û±dÂâ–¤g2ãŽÀ×¥‡˜D4…U¥fÅ–X³ÖuÁç.Úî‡×OwsWa÷ºÊõYiª4U: Jò“™ pbÈ8=7¡åF~Ä$(üÙIë”FðVˆÏIˆb‹òË @ÃìR”Ær1‰øö´JHIL%(Ë’ ÒQ°ÊßY©¦J]^˃:¾0)ïA+­ÌѺÛwo‹Ú…õbÁ½d‹÷õ„8¿¤ã<ÁË{/óè5žÊ–í‡}í>ÈcNô! »ÊxSoÖ :¶¤ 8Ô Ž+LÉÅ=(À*5;E• L”2V΃²4¹(íÁ+­ðQì´cgJDŽ «‰/çr!7+/‹!¥û\+XªE‚¯Ý°©ÍI…~À$Ñ~”’ˆõVYEѱ!¤€ë¡‚G"õ)À—×<— é´fšÄWñ–EFbŒ¢±šÅbKºIÛÐôœýŒŠÎ’¹©RõÛ¢-rÕŠztH®_kàˆ ¾¾WJ¿»C™4¢Ï=¹ËÃ9ïë3vÝ©o>ŒÎá>sx8.c‘+2—ÞW;ú„¬œÂÿÞÇ¢4Vz¿qÙV7ïµsøþÖq@‡ŽÝ ‘où^i 1~òê- NÀàQXŒÿ†WáUh~Y!IÏ÷/v‡@ŸAš‚‡~˜‘ÌŒ¹¿’Ž2ùû×?ð5ð0¹[ä„í‚`Ú¡¶º¯³(´¢ït¨H'>g’¦Wa’Fÿˆ>@Ÿ Of£)x Íz;XAñDŠèS¤‰1³±ÖDÁZ´A+z®CÃuçI¹ÎGí,N{Ad»~OîEc‰ô"Ù@P²3m¨uòì®´-¥Ðëhܺ©W!3Þ ¼¡;=ë7"ä–í)È~§õ Š.k"§¬§Ú:NF–7êO›êU`Êä¾Ãä=Šî7óoŠ'†VC§éreÇðx®S{{>Æ;aˆÁ©§Ä©:âTx$·Ç¿uêÚy¤9/FÇ…÷Ùxx÷´@&“NkJjIl³EnVIMÉ…>À¬1„XÍ|¯BNЩ÷ï¾aûpâ•47¼PV(»Fj7'¡ ´š¡ >§är¶Umwn£êõ¡ÿt±BÚ\m­ú8×о¤N’‚˜~ÿžœGaÄ?á·/À,3†V׫7)%ÊX,႟Š.ÛRéV¹ ±X°*óÒ@‚Uªƒ¼ ª“¾{‘äÕÄœ_&w$úxô±·éŒU’†á«H‡"±=¶Áø&Ù#»štˆÃîDÍyMâÑ„Sðœ‡KÐ]r¤ôdSÉ·pZJ‹7Eê+aEÂú$·pÅlè+ÙeZ”Ú‡Åä>$¦±ÈœFƒo>{útÙ3<˜'Êæ/€†¬Œ'/£…ÙÏô‹ƒ+]\ÜWNå'ÐÄwg-òÔ†?Ô¡%ºCºñèt†=ÕÖ|N3?,x@2^ù—™47É$ò¤Gœ¼M×A]fSh )p勺hŠÙÌņK»ƒ!™O‚PÈôgÒ2|bÃàX'—!/¹Žß&«Ý‘Í`‹=ì äy~zÀiËVOÇéo©äÔ ÔvƒÐ¯‘J’ãSƒœ8e‡*-œOÔšs“wQÂÁ­Í©·£‹v^ɆËÊjWðc\¶}µ˜sŠÍ;fVgVdª}ûú´’Ǭ4BZ¹(,Í'*B›HÔbº|ÌCkòÀýžÇ6ûDä.©ŒÏÙRì³3ÇŽ]ãʧç„åUfVüžŒêuÈRÿé¯dË?¡‡ÑzñäË/”¾{Ò…,{®Rca/3¶«þ¸ôz·[‡b Ô\‰Ù&“º¶¢cBúK¦ ?¦ÇÛ¹¬_owê5‡7Iÿâ­ç4¶ì±yõªç ²äLÈGp ¶ÕÆ­?0ª4¼ÌÞ[¤x0tÊGd)»Àhêû+ò#!©i4Ÿ–à•á&ÚýwXYI›¦}3–ì'Óï÷f Kêí~lKû'§øñ¿­–ú$ïæ-m|6åÍØw+Iй7Öl_6É*£ØòÛX<ÅäÞÖÀlæéz%ûT+úZ׿´—ýÖñ[l½y",’ÕDÕU´ä糫ˆºdîõwàñçØjLf^·É•ÀèÚ_ç×mÀ4ê™HŸÓXˆ€È|fñu–@>ÂCé½vãäÞv€‡ÎW»‘áÈΗµh@_«ôE,\1ø½Ðèæá^ •(¨¹– ýQ‡ Å/_ 8xö+lÆo‚íѾ20;w®óÂõs+?™i»jÉ2Ï¿Ÿâô\ÕŠnêPà3±àD¬&¶PÁÅC$+Rc£·/æÓ×lùä+¡,3ÔªLUr¶_CÁnƒZÝp{l‹ðØYØüŸ“ˆ×òS9oô}wŸïÂ’?óO¥ÕµëI!Š?ú[âa§ Š?•{÷2}ˆ»cœ:¶Ò‹Ñ(Öy˼E+œ®=êÑ^½uþ„‹s_ìe4”œÐ·¨ˆ¨†yh «®}ˆ±ýf±ùÔ x0¶øe‰Þ;ò¸N#Gm²"|í—D®9»•/Õe¶úþ¥ýßÀ 8¸9Q‡viÑ[’üBa‹½ÁÒ·.¨š¹ìMŒ˜êú²Ö‹s!vÁ¼mó>’ö•Œ>Ê—¸k¢IÛm2–ÈDÚG^Fó.œ¼ŒÖ_iuÈI×zQŒ|.±)Ä¿”삉ĒäÂ¥P 9P’[ØÛ’ÜÌsÝ­õ,Ó]_SRžU¦Ê Õ¤”S[]U× hYÏËakš·,¸Ê¯˜ÐÕ´ÅKfñà]Pž“J˜t»&8+cåö¶dôõoG¢µ‡ÿzþGRv ã6")뺭£««£ãäÉŽmÎÎÛ¶¹ò*¼Œ}ŒDð™Çòm'/9ØÁC{ëÁ“9}i:÷¥Nú“FGØŸ6™Ëm‚ÍÑ^þ úRúGÐ*¶šTÚ§&gŒÓÿ¼³§³³,܉Ãá&´6Å †Ã¹÷³¨¯»i…³l£¼68X.®•76ÖÖ6rØ2Š:$Á]ØÜdÓ.ã9|ˆîÒ}.šc¥VØ¥7{ü²!±HÿÔð6½áwílTï$bÀ+Ô'ÔOFª9Ò V“E扂Ìýþ… À(Âbü   ûРk¼°Ä‘~„I Â("C¡| Ff’=FÒÃ6ƾÜFã©xœýdX½Úªã½ 7ˆÙCs»Mß½EbŸ$ Ðk£&2” !FóôïåcâOiÓøx”Éý#ïFõ„èäyDë?ba+:ÍÖ2›É%¸oÈȉ<êLÒâŸ" ÝѤ„(`ü Öj`»¤ïæ‘ÇÆa-“>> stream xÚµ˜mo9Çßß§ðûSº?[ª"†¶¡ .Ê Ž®¤* Rûío¼°½NÎí¯ØõÚžá·3ÿ¯ ”HÂ(%šS¹"ŠHªñˆbœà•‘xLj¥@€  G9'VÀ_.ÝtA@XJ@PRà>ÔÆà±Õ…v¬ÛÄÆ”³¨ ãnšfRŽà#¥pšgWhn ³í¢ Îè'ÃG€NpAÑ–Â¥³Œ^p¥ ŽàdmÝ*I¸•è±àDP…þà†Â-×BÁ•E¿’¹I„Â¥€£ÂP· YÀ91Qãæh"gHnœ?†Hayÿ¾þüVÕr[ ¾ÿ½u7n„­ÇÙúz½šoˆ2‰÷‹~¹Y}_ÏË ®rOåö®¸¾èÝçÙCÙ¼??/ÚËùêëbù€k Zã6n6W?îÜk Š"O«î‹ñâëöÑí̳®fÛõâÇÝ; ”r-‰³éßÜÅz³un¡ÿÅçÙþZŸŸÿñêÿ€b¸-èU‰Öxeí`\쌶o[`´hÎ6eµãøÓçã«?[WƒAs´2sQnæëÅ·íj]…!îùqœP´fß.ËÅÃã–(+ŠÆf^.w—nŽ»>¼éngO‹ycùðTZ ¶åó-¾zUtžfŒ1’ži gLb$Rk1â |ÖY<•ÿ›<€íÍžËø¼ìHE€„ò>š~úÒé]TÛãp üw<2‰Gïé(Œ4;0ÓFKrÑ!—ÀñL*&¦B}*âHåK8µw›³:vª IRQÌQbÖÄTlH%p<;½, ÒËBœ^~vy˜Fû­Æ´ÖO¥Ϧdø/QR6A …ú%©¨ ž0©, 1ùŽçS EÈÆ";Rº÷Û݆{'Ó&ñ˜è xGÅ &Œî&틳äÌb=,0Z†œ"ñ \Ï¥BP:W­¯zÝë^Í¥µZæ“R¿¦ÕèÑ+Z-ÕKXõ°2.ßÿ|\ÖÇ¥)q1qõÝëîÍ »)\êÿο º”IE¾£\¬†KSqþçâÒ”…¸øëb%½,l 'ÍQÓ¥¼©£Ò§’ª¤ ó}LQlôjDÉó;«Êi*# <2738e7d6f286bea97a22ff6a773022ef>]/Size 750/W[1 3 2]/Filter/FlateDecode/Length 1679>> stream xÚ5ØiLÕWÇñóû_\pAQ@E—jÝPQw­û.Z7Z-n¸ou« V¥¶.E¥î[Å}ßÐy1m_Ì´I“™&3É$“4MfI“™IçÞïyxóÉÉ÷ù{½àá܃Î9÷Ûo òÜ×xsÂþè CXGÎ5‰t×À9éÉžÉs]™ÖÃh9ͶgÄ´;½!%ÀFa¬‹õ°>Fcô¶6Æl‚M1ã0›a6ǘˆ-1 “±¦`kLÅ6ØÛÉ…þg_]{¾ºwX§a:f`ìˆ0;cfcÌÁ®Ø »côKOì…ïboìƒ}±öÇ\€qæá`‚ù8‡aÇ8Gáhƒc墣ì{2Žï‰o㱋pNÄ÷pNÆ)8§átœ3qÎÆ98çá|,Ƹߗ‹ùÖÞá"Þaödcô»h1ëXŒÇl-1Y.>Å^g ¯Ó—ž"—Tc})½Ÿ\Zí>YFéÏ“©r‹­—ÐÊu·òe\¯.V>¤äÉåv¶²œ2X.¯ö§lÅÿÛ}„¥¸WÉ䨓«yrï¤-¶—+ºlÓ5L ä¦w·²–âÿõËpܼ ›®gê÷ÃÜ(·$Ϧ›˜Ž“[ñ;+›)ãå6L±²…R(·ãV¶RŠä$XÙFñ»e;î«xbÓ™N’;¹ÙÊNŠßK»p·Ü¹Å6ÝÃtªÜÕL+{)Óän­·ò Åï´}¸_îñu›`ê÷ÞA,—«ycÓCLýnüã<*÷ÍR{²‚'çËýḕÏ(År?VZ9F ïÞ¿&Yùœ²Hîï«­|AYÂú8žûgí.=ÉtëSø¥ÜÛ;6­dZ"©•Ó¿‹ÎàÙð°Ð¦ULK¥øÚ=üe¥”ô«•s”URZG+ç)kY_À‹Rf¾M/1-“º²r™²Nê?ÕÊÊzi`©•«”¬¯áu)ÿMý§Øiô4+þÓmë›X-¾²é-¦Û¥­Ü¦ìµr‡²S*kå.e—TzÍÊ=Ênicíû¼OÙ#íJ´ò€²WÚw×ÊCÊéÐV+(å¬ãéØ<›>eêw×3|.UÙôÓÃÒÅh+/)G¥ÕV^Q*¤êt+5”c¬_K÷jÆßÐÃ{L3ßøAè÷‘^û[AºôÍ|+O—~øÎJˆò%ë(éÏ?Y¯C¯”þ6×J]Êiéç9VêQβ®/ý2Áz4½Jú÷+ (ç¥_k¬4¤\ÞþÑJ#Jx×ýg“•Æ”Ká/#ÛJ å²ýl¥ ¾‹“p9®À°›â*\ƒÛpnÆ-¸cq=nÀlì‚98»bvÃîØ{b/|7b<6Ã|ŠÃ°‡ãLÀM8§à\œ‡ó±›ã\ˆýq;îÀq'¶À]¸÷à^ü{c:&bKÌÀLìŒY8;`vÄ8óp0ÁN˜ŒSq¾ÓqÎÄYØ ÷á~ìƒý0à8LÁÖXˆð=<ˆå¸Sq%®Æµ8Gâ(mp ŽÅñX„q1.Á¶¸—a_,Ãü?ÄvØÓЮùýy?ÅÃxO`~†ÇðsôgÈq|ƒçñ$žBVTâi<ƒþ¨Â¯ð^Æ x/ἋWñ^Çø5ÞÄj¼…·ñ>Á{xàC|„ñ5>Ågø_àK|…þ¤õ§ÿíI åüËÖþõ'gúÓÒŸþT¬þ$ôç˜?ý¹çϺl‚ Øc1ã±¶ÂæØ±%&a2¶Æv˜Šm°-v@ÿ›Q¦cvÄ,섙سñ:ŽÅžØ {àì…½1‡àÌÇÑ8G¢¿9OÀ8'ãt\ˆ3q6ÎÅèoã‹ÑßÕým?úÛµ¿û»®¿Qû›ðô÷UË݇þ¶y àAô?qþþæo†'Ðßý-ëú;Øô÷¢+ âG>¯_DLÝ1#ÙöØM¬Æ[ ²¾³~[Aø×¿¾£ ·ÜÖwäWG^aD'+÷Œ,Ž”e™Vî+(Ù)eû­. % % Permission is granted to copy, distribute and/or modify this % document under the terms of the GNU Free Documentation License, % Version 1.3 or any later version published by the Free Software % Foundation. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % To produce gmpl.pdf from gmpl.tex run the following two commands: % latex gmpl.tex % dvipdfm -p letter gmpl.dvi % Note: You need TeX Live 2010 or later version. \documentclass[11pt]{report} \usepackage{amssymb} \usepackage[dvipdfm,linktocpage,colorlinks,linkcolor=blue, urlcolor=blue]{hyperref} \usepackage{indentfirst} \usepackage{niceframe} \setlength{\textwidth}{6.5in} \setlength{\textheight}{8.5in} \setlength{\oddsidemargin}{0in} \setlength{\topmargin}{0in} \setlength{\headheight}{0in} \setlength{\headsep}{0in} \setlength{\footskip}{0.5in} \setlength{\parindent}{16pt} \setlength{\parskip}{5pt} \setlength{\topsep}{0pt} \setlength{\partopsep}{0pt} \setlength{\itemsep}{\parskip} \setlength{\parsep}{0pt} \setlength{\leftmargini}{\parindent} \renewcommand{\labelitemi}{---} \def\para#1{\noindent{\bf#1}} \renewcommand\contentsname{\sf\bfseries Contents} \renewcommand\chaptername{\sf\bfseries Chapter} \renewcommand\appendixname{\sf\bfseries Appendix} \begin{document} \thispagestyle{empty} \artdecoframe{ \begin{center} \vspace*{1.5in} \begin{huge} \sf\bfseries Modeling Language GNU MathProg \end{huge} \vspace{0.5in} \begin{LARGE} \sf Language Reference \end{LARGE} \vspace{0.5in} \begin{LARGE} \sf for GLPK Version 5.0 \end{LARGE} \vspace{0.5in} \begin{Large} \sf (December 2020) \end{Large} \end{center} \vspace*{3.2in} } \newpage \vspace*{1in} \vfill \noindent The GLPK package is part of the GNU Project released under the aegis of GNU. \noindent Copyright \copyright{} 2003-2020 Free Software Foundation, Inc. \noindent Authors: Andrew Makhorin $\langle$mao@gnu.org$\rangle$, Heinrich Schuchardt $\langle$heinrich.schuchardt@gmx.de$\rangle$. \noindent Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newpage {\setlength{\parskip}{0pt} \tableofcontents } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Introduction} {\it GNU MathProg} is a modeling language intended for describing linear mathematical programming models.\footnote{The GNU MathProg language is a subset of the AMPL language. Its GLPK implementation is mainly based on the paper: {\it Robert Fourer}, {\it David M. Gay}, and {\it Brian W. Kernighan}, ``A Modeling Language for Mathematical Programming.'' {\it Management Science} 36 (1990), pp.~519-54.} Model descriptions written in the GNU MathProg language consist of a set of statements and data blocks constructed by the user from the language elements described in this document. In a process called {\it translation}, a program called the {\it model translator} analyzes the model description and translates it into internal data structures, which may be then used either for generating mathematical programming problem instance or directly by a program called the {\it solver} to obtain numeric solution of the problem. \section{Linear programming problem} \label{problem} In MathProg the linear programming (LP) problem is stated as follows: \medskip \noindent\hspace{1in}minimize (or maximize) $$z=c_1x_1+c_2x_2+\dots+c_nx_n+c_0\eqno(1.1)$$ \noindent\hspace{1in}subject to linear constraints $$ \begin{array}{l@{\ }c@{\ }r@{\ }c@{\ }r@{\ }c@{\ }r@{\ }c@{\ }l} L_1&\leq&a_{11}x_1&+&a_{12}x_2&+\dots+&a_{1n}x_n&\leq&U_1\\ L_2&\leq&a_{21}x_1&+&a_{22}x_2&+\dots+&a_{2n}x_n&\leq&U_2\\ \multicolumn{9}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}\\ L_m&\leq&a_{m1}x_1&+&a_{m2}x_2&+\dots+&a_{mn}x_n&\leq&U_m\\ \end{array}\eqno(1.2) $$ \noindent\hspace{1in}and bounds of variables $$ \begin{array}{l@{\ }c@{\ }c@{\ }c@{\ }l} l_1&\leq&x_1&\leq&u_1\\ l_2&\leq&x_2&\leq&u_2\\ \multicolumn{5}{c}{.\ \ .\ \ .\ \ .\ \ .}\\ l_n&\leq&x_n&\leq&u_n\\ \end{array}\eqno(1.3) $$ \newpage \noindent where $x_1$, $x_2$, \dots, $x_n$ are variables; $z$ is the objective function; $c_1$, $c_2$, \dots, $c_n$ are objective coefficients; $c_0$ is the constant term (``shift'') of the objective function; $a_{11}$, $a_{12}$, \dots, $a_{mn}$ are constraint coefficients; $L_1$, $L_2$, \dots, $L_m$ are lower constraint bounds; $U_1$, $U_2$, \dots, $U_m$ are upper constraint bounds; $l_1$, $l_2$, \dots, $l_n$ are lower bounds of variables; $u_1$, $u_2$, \dots, $u_n$ are upper bounds of variables. Bounds of variables and constraint bounds can be finite as well as infinite. Besides, lower bounds can be equal to corresponding upper bounds. Thus, the following types of variables and constraints are allowed: \medskip {\def\arraystretch{1.4} \noindent\hspace{54pt} \begin{tabular}{@{}r@{\ }c@{\ }c@{\ }c@{\ }l@{\hspace*{39.5pt}}l} $-\infty$&$<$&$x$&$<$&$+\infty$&Free (unbounded) variable\\ $l$&$\leq$&$x$&$<$&$+\infty$&Variable with lower bound\\ $-\infty$&$<$&$x$&$\leq$&$u$&Variable with upper bound\\ $l$&$\leq$&$x$&$\leq$&$u$&Double-bounded variable\\ $l$&$=$&$x$&=&$u$&Fixed variable\\ \end{tabular} \noindent\hfil \begin{tabular}{@{}r@{\ }c@{\ }c@{\ }c@{\ }ll} $-\infty$&$<$&$\sum a_jx_j$&$<$&$+\infty$&Free (unbounded) linear form\\ $L$&$\leq$&$\sum a_jx_j$&$<$&$+\infty$&Inequality constraint ``greater than or equal to''\\ $-\infty$&$<$&$\sum a_jx_j$&$\leq$&$U$&Inequality constraint ``less than or equal to''\\ $L$&$\leq$&$\sum a_jx_j$&$\leq$&$U$&Double-bounded inequality constraint\\ $L$&$=$&$\sum a_jx_j$&=&$U$&Equality constraint\\ \end{tabular} } \medskip In addition to pure LP problems MathProg also allows mixed integer linear programming (MIP) problems, where some or all variables are restricted to be integer or binary. \section{Model objects} In MathProg the model is described in terms of sets, parameters, variables, constraints, and objectives, which are called {\it model objects}. The user introduces particular model objects using the language statements. Each model object is provided with a symbolic name which uniquely identifies the object and is intended for referencing purposes. Model objects, including sets, can be multidimensional arrays built over indexing sets. Formally, $n$-dimensional array $A$ is the mapping: $$A:\Delta\rightarrow\Xi,\eqno(1.4)$$ where $\Delta\subseteq S_1\times\dots\times S_n$ is a subset of the Cartesian product of indexing sets, $\Xi$ is a set of array members. In MathProg the set $\Delta$ is called the {\it subscript domain}. Its members are $n$-tuples $(i_1,\dots,i_n)$, where $i_1\in S_1$, \dots, $i_n\in S_n$. If $n=0$, the Cartesian product above has exactly one member (namely, 0-tuple), so it is convenient to think scalar objects as 0-dimensional arrays having one member. \newpage The type of array members is determined by the type of corresponding model object as follows: \medskip \noindent\hfil \begin{tabular}{@{}ll@{}} Model object&Array member\\ \hline Set&Elemental plain set\\ Parameter&Number or symbol\\ Variable&Elemental variable\\ Constraint&Elemental constraint\\ Objective&Elemental objective\\ \end{tabular} \medskip In order to refer to a particular object member the object should be provided with {\it subscripts}. For example, if $a$ is a 2-dimensional parameter defined over $I\times J$, a reference to its particular member can be written as $a[i,j]$, where $i\in I$ and $j\in J$. It is understood that scalar objects being 0-dimensional need no subscripts. \section{Structure of model description} It is sometimes desirable to write a model which, at various points, may require different data for each problem instance to be solved using that model. For this reason in MathProg the model description consists of two parts: the {\it model section} and the {\it data section}. The model section is a main part of the model description that contains declarations of model objects and is common for all problems based on the corresponding model. The data section is an optional part of the model description that contains data specific for a particular problem instance. Depending on what is more convenient the model and data sections can be placed either in one file or in two separate files. The latter feature allows having arbitrary number of different data sections to be used with the same model section. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Coding model description} \label{coding} The model description is coded in a plain text format using ASCII character set. Characters valid in the model description are the following: \begin{itemize} \item alphabetic characters:\\ \verb|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|\\ \verb|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 _| \item numeric characters:\\ \verb|0 1 2 3 4 5 6 7 8 9| \item special characters:\\ \verb?! " # & ' ( ) * + , - . / : ; < = > [ ] ^ { | } ~? \item white-space characters:\\ \verb|SP HT CR NL VT FF| \end{itemize} Within string literals and comments any ASCII characters (except control characters) are valid. White-space characters are non-significant. They can be used freely between lexical units to improve readability of the model description. They are also used to separate lexical units from each other if there is no other way to do that. Syntactically model description is a sequence of lexical units in the following categories: \begin{itemize} \item symbolic names; \item numeric literals; \item string literals; \item keywords; \item delimiters; \item comments. \end{itemize} The lexical units of the language are discussed below. \newpage \section{Symbolic names} A {\it symbolic name} consists of alphabetic and numeric characters, the first of which should be alphabetic. All symbolic names are distinct (case sensitive). \para{Examples} \begin{verbatim} alpha123 This_is_a_name _P123_abc_321 \end{verbatim} Symbolic names are used to identify model objects (sets, parameters, variables, constraints, objectives) and dummy indices. All symbolic names (except names of dummy indices) should be unique, i.e. the model description should have no objects with identical names. Symbolic names of dummy indices should be unique within the scope, where they are valid. \section{Numeric literals} A {\it numeric literal} has the form {\it xx}{\tt E}{\it syy}, where {\it xx} is a number with optional decimal point, {\it s} is the sign {\tt+} or {\tt-}, {\it yy} is a decimal exponent. The letter {\tt E} is case insensitive and can be coded as {\tt e}. \para{Examples} \begin{verbatim} 123 3.14159 56.E+5 .78 123.456e-7 \end{verbatim} Numeric literals are used to represent numeric quantities. They have obvious fixed meaning. \section{String literals} A {\it string literal} is a sequence of arbitrary characters enclosed either in single quotes or in double quotes. Both these forms are equivalent. If a single quote is part of a string literal enclosed in single quotes, it should be coded twice. Analogously, if a double quote is part of a string literal enclosed in double quotes, it should be coded twice. \para{Examples} \begin{verbatim} 'This is a string' "This is another string" 'That''s all' """Hello there,"" said the captain." \end{verbatim} String literals are used to represent symbolic quantities. \section{Keywords} A {\it keyword} is a sequence of alphabetic characters and possibly some special characters. All keywords fall into two categories: {\it reserved keywords}, which cannot be used as symbolic names, and {\it non-reserved keywords}, which are recognized by context and therefore can be used as symbolic names. The reserved keywords are the following: \noindent\hfil \begin{tabular}{@{}p{.7in}p{.7in}p{.7in}p{.7in}@{}} {\tt and}&{\tt else}&{\tt mod}&{\tt union}\\ {\tt by}&{\tt if}&{\tt not}&{\tt within}\\ {\tt cross}&{\tt in}&{\tt or}\\ {\tt diff}&{\tt inter}&{\tt symdiff}\\ {\tt div}&{\tt less}&{\tt then}\\ \end{tabular} Non-reserved keywords are described in following sections. All the keywords have fixed meaning, which will be explained on discussion of corresponding syntactic constructions, where the keywords are used. \section{Delimiters} A {\it delimiter} is either a single special character or a sequence of two special characters as follows: \noindent\hfil \begin{tabular}{@{}p{.3in}p{.3in}p{.3in}p{.3in}p{.3in}p{.3in}p{.3in} p{.3in}p{.3in}@{}} {\tt+}&{\tt**}&{\tt<=}&{\tt>}&{\tt\&\&}&{\tt:}&{\tt|}&{\tt[}& {\tt>>}\\ {\tt-}&{\tt\textasciicircum}&{\tt=}&{\tt<>}&{\tt||}&{\tt;}& {\tt\char126}&{\tt]}&{\tt<-}\\ {\tt*}&{\tt\&}&{\tt==}&{\tt!=}&{\tt.}&{\tt:=}&{\tt(}&{\tt\{}\\ {\tt/}&{\tt<}&{\tt>=}&{\tt!}&{\tt,}&{\tt..}&{\tt)}&{\tt\}}\\ \end{tabular} If the delimiter consists of two characters, there should be no spaces between the characters. All the delimiters have fixed meaning, which will be explained on discussion corresponding syntactic constructions, where the delimiters are used. \section{Comments} For documenting purposes the model description can be provided with {\it comments}, which may have two different forms. The first form is a {\it single-line comment}, which begins with the character {\tt\#} and extends until end of line. The second form is a {\it comment sequence}, which is a sequence of any characters enclosed within {\tt/*} and {\tt*/}. \para{Examples} \begin{verbatim} param n := 10; # This is a comment /* This is another comment */ \end{verbatim} Comments are ignored by the model translator and can appear anywhere in the model description, where white-space characters are allowed. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newpage \chapter{Expressions} An {\it expression} is a rule for computing a value. In model description expressions are used as constituents of certain statements. In general case expressions consist of operands and operators. Depending on the type of the resultant value all expressions fall into the following categories: \vspace*{-8pt} \begin{itemize} \item numeric expressions; \item symbolic expressions; \item indexing expressions; \item set expressions; \item logical expressions; \item linear expressions. \end{itemize} \vspace*{-8pt} \section{Numeric expressions} A {\it numeric expression} is a rule for computing a single numeric value represented as a floating-point number. The primary numeric expression may be a numeric literal, dummy index, unsubscripted parameter, subscripted parameter, built-in function reference, iterated numeric expression, conditional numeric expression, or another numeric expression enclosed in parentheses. \para{Examples} \noindent \begin{tabular}{@{}ll@{}} \verb|1.23 |&(numeric literal)\\ \verb|j|&(dummy index)\\ \verb|time|&(unsubscripted parameter)\\ \verb|a['May 2003',j+1]|&(subscripted parameter)\\ \verb|abs(b[i,j])|&(function reference)\\ \end{tabular} \newpage \noindent \begin{tabular}{@{}ll@{}} \verb|sum{i in S diff T} alpha[i] * b[i,j]|&(iterated expression)\\ \verb|if i in I then 2 * p else q[i+1]|&(conditional expression)\\ \verb|(b[i,j] + .5 * c)|&(parenthesized expression)\\ \end{tabular} More general numeric expressions containing two or more primary numeric expressions may be constructed by using certain arithmetic operators. \para{Examples} \begin{verbatim} j+1 2 * a[i-1,j+1] - b[i,j] sum{j in J} a[i,j] * x[j] + sum{k in K} b[i,k] * x[k] (if i in I and p >= 1 then 2 * p else q[i+1]) / (a[i,j] + 1.5) \end{verbatim} \subsection{Numeric literals} If the primary numeric expression is a numeric literal, the resultant value is obvious. \subsection{Dummy indices} If the primary numeric expression is a dummy index, the resultant value is current value assigned to that dummy index. \subsection{Unsubscripted parameters} If the primary numeric expression is an unsubscripted parameter (which should be 0-dimen\-sional), the resultant value is the value of that parameter. \subsection{Subscripted parameters} The primary numeric expression, which refers to a subscripted parameter, has the following syntactic form: $$ \mbox{{\it name}{\tt[}$i_1${\tt,} $i_2${\tt,} \dots{\tt,} $i_n${\tt]}} $$ where {\it name} is the symbolic name of the parameter, $i_1$, $i_2$, \dots, $i_n$ are subscripts. Each subscript should be a numeric or symbolic expression. The number of subscripts in the subscript list should be the same as the dimension of the parameter with which the subscript list is associated. Actual values of subscript expressions are used to identify a particular member of the parameter that determines the resultant value of the primary expression. \newpage \subsection{Function references} In MathProg there exist the following built-in functions which may be used in numeric expressions: \begin{tabular}{@{}p{112pt}p{328pt}@{}} {\tt abs(}$x${\tt)}&$|x|$, absolute value of $x$\\ {\tt atan(}$x${\tt)}&$\arctan x$, principal value of the arc tangent of $x$ (in radians)\\ {\tt atan(}$y${\tt,} $x${\tt)}&$\arctan y/x$, principal value of the arc tangent of $y/x$ (in radians). In this case the signs of both arguments $y$ and $x$ are used to determine the quadrant of the resultant value\\ {\tt card(}$X${\tt)}&$|X|$, cardinality (the number of elements) of set $X$\\ {\tt ceil(}$x${\tt)}&$\lceil x\rceil$, smallest integer not less than $x$ (``ceiling of $x$'')\\ {\tt cos(}$x${\tt)}&$\cos x$, cosine of $x$ (in radians)\\ {\tt exp(}$x${\tt)}&$e^x$, base-$e$ exponential of $x$\\ {\tt floor(}$x${\tt)}&$\lfloor x\rfloor$, largest integer not greater than $x$ (``floor of $x$'')\\ {\tt gmtime()}&the number of seconds elapsed since 00:00:00~Jan~1, 1970, Coordinated Universal Time (for details see Section \ref{gmtime}, page \pageref{gmtime})\\ {\tt length(}$s${\tt)}&$|s|$, length of character string $s$\\ {\tt log(}$x${\tt)}&$\log x$, natural logarithm of $x$\\ {\tt log10(}$x${\tt)}&$\log_{10}x$, common (decimal) logarithm of $x$\\ {\tt max(}$x_1${\tt,} $x_2${\tt,} \dots{\tt,} $x_n${\tt)}&the largest of values $x_1$, $x_2$, \dots, $x_n$\\ {\tt min(}$x_1${\tt,} $x_2${\tt,} \dots{\tt,} $x_n${\tt)}&the smallest of values $x_1$, $x_2$, \dots, $x_n$\\ {\tt round(}$x${\tt)}&rounding $x$ to nearest integer\\ {\tt round(}$x${\tt,} $n${\tt)}&rounding $x$ to $n$ fractional decimal digits\\ {\tt sin(}$x${\tt)}&$\sin x$, sine of $x$ (in radians)\\ {\tt sqrt(}$x${\tt)}&$\sqrt{x}$, non-negative square root of $x$\\ {\tt str2time(}$s${\tt,} $f${\tt)}&converting character string $s$ to calendar time (for details see Section \ref{str2time}, page \pageref{str2time})\\ {\tt tan(}$x${\tt)}&$\tan x$, tangent of $x$ (in radians)\\ {\tt trunc(}$x${\tt)}&truncating $x$ to nearest integer\\ {\tt trunc(}$x${\tt,} $n${\tt)}&truncating $x$ to $n$ fractional decimal digits\\ {\tt Irand224()}&generating pseudo-random integer uniformly distributed in $[0,2^{24})$\\ {\tt Uniform01()}&generating pseudo-random number uniformly distributed in $[0,1)$\\ {\tt Uniform(}$a${\tt,} $b${\tt)}&generating pseudo-random number uniformly distributed in $[a,b)$\\ {\tt Normal01()}&generating Gaussian pseudo-random variate with $\mu=0$ and $\sigma=1$\\ {\tt Normal(}$\mu${\tt,} $\sigma${\tt)}&generating Gaussian pseudo-random variate with given $\mu$ and $\sigma$\\ \end{tabular} Arguments of all built-in functions, except {\tt card}, {\tt length}, and {\tt str2time}, should be numeric expressions. The argument of {\tt card} should be a set expression. The argument of {\tt length} and both arguments of {\tt str2time} should be symbolic expressions. The resultant value of the numeric expression, which is a function reference, is the result of applying the function to its argument(s). Note that each pseudo-random generator function has a latent argument (i.e. some internal state), which is changed whenever the function has been applied. Thus, if the function is applied repeatedly even to identical arguments, due to the side effect different resultant values are always produced. \newpage \subsection{Iterated expressions} \label{itexpr} An {\it iterated numeric expression} is a primary numeric expression, which has the following syntactic form: $$\mbox{\it iterated-operator indexing-expression integrand}$$ where {\it iterated-operator} is the symbolic name of the iterated operator to be performed (see below), {\it indexing-expression} is an indexing expression which introduces dummy indices and controls iterating, {\it integrand} is a numeric expression that participates in the operation. In MathProg there exist four iterated operators, which may be used in numeric expressions: {\def\arraystretch{2} \noindent\hfil \begin{tabular}{@{}lll@{}} {\tt sum}&summation&$\displaystyle\sum_{(i_1,\dots,i_n)\in\Delta} f(i_1,\dots,i_n)$\\ {\tt prod}&production&$\displaystyle\prod_{(i_1,\dots,i_n)\in\Delta} f(i_1,\dots,i_n)$\\ {\tt min}&minimum&$\displaystyle\min_{(i_1,\dots,i_n)\in\Delta} f(i_1,\dots,i_n)$\\ {\tt max}&maximum&$\displaystyle\max_{(i_1,\dots,i_n)\in\Delta} f(i_1,\dots,i_n)$\\ \end{tabular} } \noindent where $i_1$, \dots, $i_n$ are dummy indices introduced in the indexing expression, $\Delta$ is the domain, a set of $n$-tuples specified by the indexing expression which defines particular values assigned to the dummy indices on performing the iterated operation, $f(i_1,\dots,i_n)$ is the integrand, a numeric expression whose resultant value depends on the dummy indices. The resultant value of an iterated numeric expression is the result of applying of the iterated operator to its integrand over all $n$-tuples contained in the domain. \subsection{Conditional expressions} \label{ifthen} A {\it conditional numeric expression} is a primary numeric expression, which has one of the following two syntactic forms: $$ {\def\arraystretch{1.4} \begin{array}{l} \mbox{{\tt if} $b$ {\tt then} $x$ {\tt else} $y$}\\ \mbox{{\tt if} $b$ {\tt then} $x$}\\ \end{array} } $$ where $b$ is an logical expression, $x$ and $y$ are numeric expressions. The resultant value of the conditional expression depends on the value of the logical expression that follows the keyword {\tt if}. If it takes on the value {\it true}, the value of the conditional expression is the value of the expression that follows the keyword {\tt then}. Otherwise, if the logical expression takes on the value {\it false}, the value of the conditional expression is the value of the expression that follows the keyword {\it else}. If the second, reduced form of the conditional expression is used and the logical expression takes on the value {\it false}, the resultant value of the conditional expression is zero. \newpage \subsection{Parenthesized expressions} Any numeric expression may be enclosed in parentheses that syntactically makes it a primary numeric expression. Parentheses may be used in numeric expressions, as in algebra, to specify the desired order in which operations are to be performed. Where parentheses are used, the expression within the parentheses is evaluated before the resultant value is used. The resultant value of the parenthesized expression is the same as the value of the expression enclosed within parentheses. \subsection{Arithmetic operators} In MathProg there exist the following arithmetic operators, which may be used in numeric expressions: \begin{tabular}{@{}ll@{}} {\tt +} $x$&unary plus\\ {\tt -} $x$&unary minus\\ $x$ {\tt +} $y$&addition\\ $x$ {\tt -} $y$&subtraction\\ $x$ {\tt less} $y$&positive difference (if $x1$, the second form should be used. If the first form of the indexing entry is used, the index $i$ can be a dummy index only (see below). If the second form is used, the indices $i_1$, $i_2$, \dots, $i_n$ can be either dummy indices or some numeric or symbolic expressions, where at least one index should be a dummy index. The third, reduced form of the indexing entry has the same effect as if there were $i$ (if $S$ is 1-dimensional) or $i_1$, $i_2$, \dots, $i_n$ (if $S$ is $n$-dimensional) all specified as dummy indices. A {\it dummy index} is an auxiliary model object, which acts like an individual variable. Values assigned to dummy indices are components of $n$-tuples from basic sets, i.e. some numeric and symbolic quantities. For referencing purposes dummy indices can be provided with symbolic names. However, unlike other model objects (sets, parameters, etc.) dummy indices need not be explicitly declared. Each {\it undeclared} symbolic name being used in the indexing position of an indexing entry is recognized as the symbolic name of corresponding dummy index. Symbolic names of dummy indices are valid only within the scope of the indexing expression, where the dummy indices were introduced. Beyond the scope the dummy indices are completely inaccessible, so the same symbolic names may be used for other purposes, in particular, to represent dummy indices in other indexing expressions. The scope of indexing expression, where implicit declarations of dummy indices are valid, depends on the context, in which the indexing expression is used: \vspace*{-8pt} \begin{itemize} \item If the indexing expression is used in iterated operator, its scope extends until the end of the integrand. \item If the indexing expression is used as a primary set expression, its scope extends until the end of that indexing expression. \item If the indexing expression is used to define the subscript domain in declarations of some model objects, its scope extends until the end of the corresponding statement. \end{itemize} \vspace*{-8pt} The indexing mechanism implemented by means of indexing expressions is best explained by some examples discussed below. Let there be given three sets: $$ {\def\arraystretch{1.4} \begin{array}{l} A=\{4,7,9\},\\ B=\{(1,Jan),(1,Feb),(2,Mar),(2,Apr),(3,May),(3,Jun)\},\\ C=\{a,b,c\},\\ \end{array} } $$ where $A$ and $C$ consist of 1-tuples (singlets), $B$ consists of 2-tuples (doublets). Consider the following indexing expression: $$\mbox{{\tt\{i in A, (j,k) in B, l in C\}}}$$ where {\tt i}, {\tt j}, {\tt k}, and {\tt l} are dummy indices. \newpage Although MathProg is not a procedural language, for any indexing expression an equivalent algorithmic description can be given. In particular, the algorithmic description of the indexing expression above could look like follows: \noindent\hfil \begin{tabular}{@{}l@{}} {\bf for all} $i\in A$ {\bf do}\\ \hspace{16pt}{\bf for all} $(j,k)\in B$ {\bf do}\\ \hspace{32pt}{\bf for all} $l\in C$ {\bf do}\\ \hspace{48pt}{\it action};\\ \end{tabular} \noindent where the dummy indices $i$, $j$, $k$, $l$ are consecutively assigned corresponding components of $n$-tuples from the basic sets $A$, $B$, $C$, and {\it action} is some action that depends on the context, where the indexing expression is used. For example, if the action were printing current values of dummy indices, the printout would look like follows: \noindent\hfil \begin{tabular}{@{}llll@{}} $i=4$&$j=1$&$k=Jan$&$l=a$\\ $i=4$&$j=1$&$k=Jan$&$l=b$\\ $i=4$&$j=1$&$k=Jan$&$l=c$\\ $i=4$&$j=1$&$k=Feb$&$l=a$\\ $i=4$&$j=1$&$k=Feb$&$l=b$\\ \multicolumn{4}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}\\ $i=9$&$j=3$&$k=Jun$&$l=b$\\ $i=9$&$j=3$&$k=Jun$&$l=c$\\ \end{tabular} Let the example indexing expression be used in the following iterated operation: $$\mbox{{\tt sum\{i in A, (j,k) in B, l in C\} p[i,j,k,l]}}$$ where {\tt p} is a 4-dimensional numeric parameter or some numeric expression whose resultant value depends on {\tt i}, {\tt j}, {\tt k}, and {\tt l}. In this case the action is summation, so the resultant value of the primary numeric expression is: $$\sum_{i\in A,(j,k)\in B,l\in C}(p_{ijkl}).$$ Now let the example indexing expression be used as a primary set expression. In this case the action is gathering all 4-tuples (quadruplets) of the form $(i,j,k,l)$ in one set, so the resultant value of such operation is simply the Cartesian product of the basic sets: $$A\times B\times C=\{(i,j,k,l):i\in A,(j,k)\in B,l\in C\}.$$ Note that in this case the same indexing expression might be written in the reduced form: $$\mbox{{\tt\{A, B, C\}}}$$ because the dummy indices $i$, $j$, $k$, and $l$ are not referenced and therefore their symbolic names need not be specified. \newpage Finally, let the example indexing expression be used as the subscript domain in the declaration of a 4-dimensional model object, say, a numeric parameter: $$\mbox{{\tt param p\{i in A, (j,k) in B, l in C\}} \dots {\tt;}}$$ \noindent In this case the action is generating the parameter members, where each member has the form $p[i,j,k,l]$. As was said above, some indices in the second form of indexing entries may be numeric or symbolic expressions, not only dummy indices. In this case resultant values of such expressions play role of some logical conditions to select only that $n$-tuples from the Cartesian product of basic sets that satisfy these conditions. Consider, for example, the following indexing expression: $$\mbox{{\tt\{i in A, (i-1,k) in B, l in C\}}}$$ where {\tt i}, {\tt k}, {\tt l} are dummy indices, and {\tt i-1} is a numeric expression. The algorithmic decsription of this indexing expression is the following: \noindent\hfil \begin{tabular}{@{}l@{}} {\bf for all} $i\in A$ {\bf do}\\ \hspace{16pt}{\bf for all} $(j,k)\in B$ {\bf and} $j=i-1$ {\bf do}\\ \hspace{32pt}{\bf for all} $l\in C$ {\bf do}\\ \hspace{48pt}{\it action};\\ \end{tabular} \noindent Thus, if this indexing expression were used as a primary set expression, the resultant set would be the following: $$\{(4,May,a),(4,May,b),(4,May,c),(4,Jun,a),(4,Jun,b),(4,Jun,c)\}.$$ Should note that in this case the resultant set consists of 3-tuples, not of 4-tuples, because in the indexing expression there is no dummy index that corresponds to the first component of 2-tuples from the set $B$. The general rule is: the number of components of $n$-tuples defined by an indexing expression is the same as the number of dummy indices in that expression, where the correspondence between dummy indices and components on $n$-tuples in the resultant set is positional, i.e. the first dummy index corresponds to the first component, the second dummy index corresponds to the second component, etc. In some cases it is needed to select a subset from the Cartesian product of some sets. This may be attained by using an optional logical predicate, which is specified in the indexing expression. Consider, for example, the following indexing expression: $$\mbox{{\tt\{i in A, (j,k) in B, l in C: i <= 5 and k <> 'Mar'\}}}$$ where the logical expression following the colon is a predicate. The algorithmic description of this indexing expression is the following: \noindent\hfil \begin{tabular}{@{}l@{}} {\bf for all} $i\in A$ {\bf do}\\ \hspace{16pt}{\bf for all} $(j,k)\in B$ {\bf do}\\ \hspace{32pt}{\bf for all} $l\in C$ {\bf do}\\ \hspace{48pt}{\bf if} $i\leq 5$ {\bf and} $k\neq`Mar'$ {\bf then}\\ \hspace{64pt}{\it action};\\ \end{tabular} \noindent Thus, if this indexing expression were used as a primary set expression, the resultant set would be the following: $$\{(4,1,Jan,a),(4,1,Feb,a),(4,2,Apr,a),\dots,(4,3,Jun,c)\}.$$ If no predicate is specified in the indexing expression, one, which takes on the value {\it true}, is assumed. \section{Set expressions} A {\it set expression} is a rule for computing an elemental set, i.e. a collection of $n$-tuples, where components of $n$-tuples are numeric and symbolic quantities. The primary set expression may be a literal set, unsubscripted set, subscripted set, ``arithmetic'' set, indexing expression, iterated set expression, conditional set expression, or another set expression enclosed in parentheses. \para{Examples} \noindent \begin{tabular}{@{}ll@{}} \verb|{(123,'aaa'), (i+1,'bbb'), (j-1,'ccc')}| &(literal set)\\ \verb|I| &(unsubscripted set)\\ \verb|S[i-1,j+1]| &(subscripted set)\\ \verb|1..t-1 by 2| &(``arithmetic'' set)\\ \verb|{t in 1..T, (t+1,j) in S: (t,j) in F}| &(indexing expression)\\ \verb|setof{i in I, j in J}(i+1,j-1)| &(iterated set expression)\\ \verb|if i < j then S[i,j] else F diff S[i,j]| &(conditional set expression)\\ \verb|(1..10 union 21..30)| &(parenthesized set expression)\\ \end{tabular} More general set expressions containing two or more primary set expressions may be constructed by using certain set operators. \para{Examples} \begin{verbatim} (A union B) inter (I cross J) 1..10 cross (if i < j then {'a', 'b', 'c'} else {'d', 'e', 'f'}) \end{verbatim} \subsection{Literal sets} A {\it literal set} is a primary set expression, which has the following two syntactic forms: $$ {\def\arraystretch{1.4} \begin{array}{l} \mbox{{\tt\{}$e_1${\tt,} $e_2${\tt,} \dots{\tt,} $e_m${\tt\}}}\\ \mbox{{\tt\{(}$e_{11}${\tt,} \dots{\tt,} $e_{1n}${\tt),} {\tt(}$e_{21}${\tt,} \dots{\tt,} $e_{2n}${\tt),} \dots{\tt,} {\tt(}$e_{m1}${\tt,} \dots{\tt,} $e_{mn}${\tt)\}}}\\ \end{array} } $$ where $e_1$, \dots, $e_m$, $e_{11}$, \dots, $e_{mn}$ are numeric or symbolic expressions. If the first form is used, the resultant set consists of 1-tuples (singlets) enumerated within the curly braces. It is allowed to specify an empty set as {\tt\{\ \}}, which has no 1-tuples. If the second form is used, the resultant set consists of $n$-tuples enumerated within the curly braces, where a particular $n$-tuple consists of corresponding components enumerated within the parentheses. All $n$-tuples should have the same number of components. \subsection{Unsubscripted sets} If the primary set expression is an unsubscripted set (which should be 0-dimen\-sional), the resultant set is an elemental set associated with the corresponding set object. \subsection{Subscripted sets} The primary set expression, which refers to a subscripted set, has the following syntactic form: $$\mbox{{\it name}{\tt[}$i_1${\tt,} $i_2${\tt,} \dots{\tt,} $i_n${\tt]}}$$ where {\it name} is the symbolic name of the set object, $i_1$, $i_2$, \dots, $i_n$ are subscripts. Each subscript should be a numeric or symbolic expression. The number of subscripts in the subscript list should be the same as the dimension of the set object with which the subscript list is associated. Actual values of subscript expressions are used to identify a particular member of the set object that determines the resultant set. \subsection{``Arithmetic'' sets} The primary set expression, which is an ``arithmetic'' set, has the following two syntactic forms: $$ {\def\arraystretch{1.4} \begin{array}{l} \mbox{$t_0$ {\tt..} $t_1$ {\tt by} $\delta t$}\\ \mbox{$t_0$ {\tt..} $t_1$}\\ \end{array} } $$ where $t_0$, $t_1$, and $\delta t$ are numeric expressions (the value of $\delta t$ should not be zero). The second form is equivalent to the first form, where $\delta t=1$. If $\delta t>0$, the resultant set is determined as follows: $$\{t:\exists k\in{\cal Z}(t=t_0+k\delta t,\ t_0\leq t\leq t_1)\}.$$ Otherwise, if $\delta t<0$, the resultant set is determined as follows: $$\{t:\exists k\in{\cal Z}(t=t_0+k\delta t,\ t_1\leq t\leq t_0)\}.$$ \subsection{Indexing expressions} If the primary set expression is an indexing expression, the resultant set is determined as described above in Section \ref{indexing}, page \pageref{indexing}. \newpage \subsection{Iterated expressions} An {\it iterated set expression} is a primary set expression, which has the following syntactic form: $$\mbox{{\tt setof} {\it indexing-expression} {\it integrand}}$$ where {\it indexing-expression} is an indexing expression, which introduces dummy indices and controls iterating, {\it integrand} is either a single numeric or symbolic expression or a list of numeric and symbolic expressions separated by commae and enclosed in parentheses. If the integrand is a single numeric or symbolic expression, the resultant set consists of 1-tuples and is determined as follows: $$\{x:(i_1,\dots,i_n)\in\Delta\},$$ \noindent where $x$ is a value of the integrand, $i_1$, \dots, $i_n$ are dummy indices introduced in the indexing expression, $\Delta$ is the domain, a set of $n$-tuples specified by the indexing expression, which defines particular values assigned to the dummy indices on performing the iterated operation. If the integrand is a list containing $m$ numeric and symbolic expressions, the resultant set consists of $m$-tuples and is determined as follows: $$\{(x_1,\dots,x_m):(i_1,\dots,i_n)\in\Delta\},$$ where $x_1$, \dots, $x_m$ are values of the expressions in the integrand list, $i_1$, \dots, $i_n$ and $\Delta$ have the same meaning as above. \subsection{Conditional expressions} A {\it conditional set expression} is a primary set expression that has the following syntactic form: $$\mbox{{\tt if} $b$ {\tt then} $X$ {\tt else} $Y$}$$ where $b$ is an logical expression, $X$ and $Y$ are set expressions, which should define sets of the same dimension. The resultant value of the conditional expression depends on the value of the logical expression that follows the keyword {\tt if}. If it takes on the value {\it true}, the resultant set is the value of the expression that follows the keyword {\tt then}. Otherwise, if the logical expression takes on the value {\it false}, the resultant set is the value of the expression that follows the keyword {\tt else}. \subsection{Parenthesized expressions} Any set expression may be enclosed in parentheses that syntactically makes it a primary set expression. Parentheses may be used in set expressions, as in algebra, to specify the desired order in which operations are to be performed. Where parentheses are used, the expression within the parentheses is evaluated before the resultant value is used. The resultant value of the parenthesized expression is the same as the value of the expression enclosed within parentheses. \newpage \subsection{Set operators} In MathProg there exist the following set operators, which may be used in set expressions: \begin{tabular}{@{}ll@{}} $X$ {\tt union} $Y$&union $X\cup Y$\\ $X$ {\tt diff} $Y$&difference $X\backslash Y$\\ $X$ {\tt symdiff} $Y$&symmetric difference $X\oplus Y=(X\backslash Y)\cup(Y\backslash X)$\\ $X$ {\tt inter} $Y$&intersection $X\cap Y$\\ $X$ {\tt cross} $Y$&cross (Cartesian) product $X\times Y$\\ \end{tabular} \noindent where $X$ and Y are set expressions, which should define sets of identical dimension (except the Cartesian product). If the expression includes more than one set operator, all operators are performed from left to right according to the hierarchy of operations (see below). The resultant value of the expression, which contains set operators, is the result of applying the operators to their operands. The dimension of the resultant set, i.e. the dimension of $n$-tuples, of which the resultant set consists of, is the same as the dimension of the operands, except the Cartesian product, where the dimension of the resultant set is the sum of the dimensions of its operands. \subsection{Hierarchy of operations} The following list shows the hierarchy of operations in set expressions: \noindent\hfil \begin{tabular}{@{}ll@{}} Operation&Hierarchy\\ \hline Evaluation of numeric operations&1st-7th\\ Evaluation of symbolic operations&8th-9th\\ Evaluation of iterated or ``arithmetic'' set ({\tt setof}, {\tt..})& 10th\\ Cartesian product ({\tt cross})&11th\\ Intersection ({\tt inter})&12th\\ Union and difference ({\tt union}, {\tt diff}, {\tt symdiff})&13th\\ Conditional evaluation ({\tt if} \dots {\tt then} \dots {\tt else})& 14th\\ \end{tabular} This hierarchy has the same meaning as was explained above for numeric expressions (see Subsection \ref{hierarchy}, page \pageref{hierarchy}). \newpage \section{Logical expressions} A {\it logical expression} is a rule for computing a single logical value, which can be either {\it true} or {\it false}. The primary logical expression may be a numeric expression, relational expression, iterated logical expression, or another logical expression enclosed in parentheses. \para{Examples} \noindent \begin{tabular}{@{}ll@{}} \verb|i+1| &(numeric expression)\\ \verb|a[i,j] < 1.5| &(relational expression)\\ \verb|s[i+1,j-1] <> 'Mar' & year | &(relational expression)\\ \verb|(i+1,'Jan') not in I cross J| &(relational expression)\\ \verb|S union T within A[i] inter B[j]| &(relational expression)\\ \verb|forall{i in I, j in J} a[i,j] < .5 * b[i]| &(iterated logical expression)\\ \verb|(a[i,j] < 1.5 or b[i] >= a[i,j])| &(parenthesized logical expression)\\ \end{tabular} More general logical expressions containing two or more primary logical expressions may be constructed by using certain logical operators. \para{Examples} \begin{verbatim} not (a[i,j] < 1.5 or b[i] >= a[i,j]) and (i,j) in S (i,j) in S or (i,j) not in T diff U \end{verbatim} \vspace*{-8pt} \subsection{Numeric expressions} The resultant value of the primary logical expression, which is a numeric expression, is {\it true}, if the resultant value of the numeric expression is non-zero. Otherwise the resultant value of the logical expression is {\it false}. \vspace*{-8pt} \subsection{Relational operators} In MathProg there exist the following relational operators, which may be used in logical expressions: \begin{tabular}{@{}ll@{}} $x$ {\tt<} $y$&test on $x=} $y$&test on $x\geq y$\\ $x$ {\tt>} $y$&test on $x>y$\\ $x$ {\tt<>} $y$, $x$ {\tt!=} $y$&test on $x\neq y$\\ $x$ {\tt in} $Y$&test on $x\in Y$\\ {\tt(}$x_1${\tt,}\dots{\tt,}$x_n${\tt)} {\tt in} $Y$&test on $(x_1,\dots,x_n)\in Y$\\ $x$ {\tt not} {\tt in} $Y$, $x$ {\tt!in} $Y$&test on $x\not\in Y$\\ {\tt(}$x_1${\tt,}\dots{\tt,}$x_n${\tt)} {\tt not} {\tt in} $Y$, {\tt(}$x_1${\tt,}\dots{\tt,}$x_n${\tt)} {\tt !in} $Y$&test on $(x_1,\dots,x_n)\not\in Y$\\ $X$ {\tt within} $Y$&test on $X\subseteq Y$\\ $X$ {\tt not} {\tt within} $Y$, $X$ {\tt !within} $Y$&test on $X\not\subseteq Y$\\ \end{tabular} \noindent where $x$, $x_1$, \dots, $x_n$, $y$ are numeric or symbolic expressions, $X$ and $Y$ are set expression. \newpage 1. In the operations {\tt in}, {\tt not in}, and {\tt !in} the number of components in the first operands should be the same as the dimension of the second operand. 2. In the operations {\tt within}, {\tt not within}, and {\tt !within} both operands should have identical dimension. All the relational operators listed above have their conventional mathematical meaning. The resultant value is {\it true}, if corresponding relation is satisfied for its operands, otherwise {\it false}. (Note that symbolic values are ordered lexicographically, and any numeric value precedes any symbolic value.) \subsection{Iterated expressions} An {\it iterated logical expression} is a primary logical expression, which has the following syntactic form: $$\mbox{{\it iterated-operator} {\it indexing-expression} {\it integrand}}$$ where {\it iterated-operator} is the symbolic name of the iterated operator to be performed (see below), {\it indexing-expression} is an indexing expression which introduces dummy indices and controls iterating, {\it integrand} is a numeric expression that participates in the operation. In MathProg there exist two iterated operators, which may be used in logical expressions: {\def\arraystretch{1.4} \noindent\hfil \begin{tabular}{@{}lll@{}} {\tt forall}&$\forall$-quantification&$\displaystyle \forall(i_1,\dots,i_n)\in\Delta[f(i_1,\dots,i_n)],$\\ {\tt exists}&$\exists$-quantification&$\displaystyle \exists(i_1,\dots,i_n)\in\Delta[f(i_1,\dots,i_n)],$\\ \end{tabular} } \noindent where $i_1$, \dots, $i_n$ are dummy indices introduced in the indexing expression, $\Delta$ is the domain, a set of $n$-tuples specified by the indexing expression which defines particular values assigned to the dummy indices on performing the iterated operation, $f(i_1,\dots,i_n)$ is the integrand, a logical expression whose resultant value depends on the dummy indices. For $\forall$-quantification the resultant value of the iterated logical expression is {\it true}, if the value of the integrand is {\it true} for all $n$-tuples contained in the domain, otherwise {\it false}. For $\exists$-quantification the resultant value of the iterated logical expression is {\it false}, if the value of the integrand is {\it false} for all $n$-tuples contained in the domain, otherwise {\it true}. \subsection{Parenthesized expressions} Any logical expression may be enclosed in parentheses that syntactically makes it a primary logical expression. Parentheses may be used in logical expressions, as in algebra, to specify the desired order in which operations are to be performed. Where parentheses are used, the expression within the parentheses is evaluated before the resultant value is used. The resultant value of the parenthesized expression is the same as the value of the expression enclosed within parentheses. \newpage \subsection{Logical operators} In MathProg there exist the following logical operators, which may be used in logical expressions: \begin{tabular}{@{}ll@{}} {\tt not} $x$, {\tt!}$x$&negation $\neg\ x$\\ $x$ {\tt and} $y$, $x$ {\tt\&\&} $y$&conjunction (logical ``and'') $x\;\&\;y$\\ $x$ {\tt or} $y$, $x$ {\tt||} $y$&disjunction (logical ``or'') $x\vee y$\\ \end{tabular} \noindent where $x$ and $y$ are logical expressions. If the expression includes more than one logical operator, all operators are performed from left to right according to the hierarchy of the operations (see below). The resultant value of the expression, which contains logical operators, is the result of applying the operators to their operands. \subsection{Hierarchy of operations} The following list shows the hierarchy of operations in logical expressions: \noindent\hfil \begin{tabular}{@{}ll@{}} Operation&Hierarchy\\ \hline Evaluation of numeric operations&1st-7th\\ Evaluation of symbolic operations&8th-9th\\ Evaluation of set operations&10th-14th\\ Relational operations ({\tt<}, {\tt<=}, etc.)&15th\\ Negation ({\tt not}, {\tt!})&16th\\ Conjunction ({\tt and}, {\tt\&\&})&17th\\ $\forall$- and $\exists$-quantification ({\tt forall}, {\tt exists})& 18th\\ Disjunction ({\tt or}, {\tt||})&19th\\ \end{tabular} This hierarchy has the same meaning as was explained above for numeric expressions (see Subsection \ref{hierarchy}, page \pageref{hierarchy}). \section{Linear expressions} A {\it linear expression} is a rule for computing so called a {\it linear form} or simply a {\it formula}, which is a linear (or affine) function of elemental variables. The primary linear expression may be an unsubscripted variable, subscripted variable, iterated linear expression, conditional linear expression, or another linear expression enclosed in parentheses. It is also allowed to use a numeric expression as the primary linear expression, in which case the resultant value of the numeric expression is automatically converted to a formula that includes the constant term only. \para{Examples} \noindent \begin{tabular}{@{}ll@{}} \verb|z| &(unsubscripted variable)\\ \verb|x[i,j]| &(subscripted variable)\\ \verb|sum{j in J} (a[i,j] * x[i,j] + 3 * y[i-1])| & (iterated linear expression)\\ \verb|if i in I then x[i,j] else 1.5 * z + 3.25| & (conditional linear expression)\\ \verb|(a[i,j] * x[i,j] + y[i-1] + .1)| & (parenthesized linear expression)\\ \end{tabular} More general linear expressions containing two or more primary linear expressions may be constructed by using certain arithmetic operators. \para{Examples} \begin{verbatim} 2 * x[i-1,j+1] + 3.5 * y[k] + .5 * z (- x[i,j] + 3.5 * y[k]) / sum{t in T} abs(d[i,j,t]) \end{verbatim} \vspace*{-5pt} \subsection{Unsubscripted variables} If the primary linear expression is an unsubscripted variable (which should be 0-dimensional), the resultant formula is that unsubscripted variable. \vspace*{-5pt} \subsection{Subscripted variables} The primary linear expression, which refers to a subscripted variable, has the following syntactic form: $$\mbox{{\it name}{\tt[}$i_1${\tt,} $i_2${\tt,} \dots{\tt,} $i_n${\tt]}}$$ where {\it name} is the symbolic name of the model variable, $i_1$, $i_2$, \dots, $i_n$ are subscripts. Each subscript should be a numeric or symbolic expression. The number of subscripts in the subscript list should be the same as the dimension of the model variable with which the subscript list is associated. Actual values of the subscript expressions are used to identify a particular member of the model variable that determines the resultant formula, which is an elemental variable associated with corresponding member. \vspace*{-5pt} \subsection{Iterated expressions} An {\it iterated linear expression} is a primary linear expression, which has the following syntactic form: $$\mbox{{\tt sum} {\it indexing-expression} {\it integrand}}$$ where {\it indexing-expression} is an indexing expression, which introduces dummy indices and controls iterating, {\it integrand} is a linear expression that participates in the operation. The iterated linear expression is evaluated exactly in the same way as the iterated numeric expression (see Subection \ref{itexpr}, page \pageref{itexpr}) with exception that the integrand participated in the summation is a formula, not a numeric value. \vspace*{-5pt} \subsection{Conditional expressions} A {\it conditional linear expression} is a primary linear expression, which has one of the following two syntactic forms: $$ {\def\arraystretch{1.4} \begin{array}{l} \mbox{{\tt if} $b$ {\tt then} $f$ {\tt else} $g$}\\ \mbox{{\tt if} $b$ {\tt then} $f$}\\ \end{array} } $$ where $b$ is an logical expression, $f$ and $g$ are linear expressions. \newpage The conditional linear expression is evaluated exactly in the same way as the conditional numeric expression (see Subsection \ref{ifthen}, page \pageref{ifthen}) with exception that operands participated in the operation are formulae, not numeric values. \subsection{Parenthesized expressions} Any linear expression may be enclosed in parentheses that syntactically makes it a primary linear expression. Parentheses may be used in linear expressions, as in algebra, to specify the desired order in which operations are to be performed. Where parentheses are used, the expression within the parentheses is evaluated before the resultant formula is used. The resultant value of the parenthesized expression is the same as the value of the expression enclosed within parentheses. \subsection{Arithmetic operators} In MathProg there exists the following arithmetic operators, which may be used in linear expressions: \begin{tabular}{@{}ll@{}} {\tt+} $f$&unary plus\\ {\tt-} $f$&unary minus\\ $f$ {\tt+} $g$&addition\\ $f$ {\tt-} $g$&subtraction\\ $x$ {\tt*} $f$, $f$ {\tt*} $x$&multiplication\\ $f$ {\tt/} $x$&division \end{tabular} \noindent where $f$ and $g$ are linear expressions, $x$ is a numeric expression (more precisely, a linear expression containing only the constant term). If the expression includes more than one arithmetic operator, all operators are performed from left to right according to the hierarchy of operations (see below). The resultant value of the expression, which contains arithmetic operators, is the result of applying the operators to their operands. \subsection{Hierarchy of operations} The hierarchy of arithmetic operations used in linear expressions is the same as for numeric expressions (see Subsection \ref{hierarchy}, page \pageref{hierarchy}). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Statements} {\it Statements} are basic units of the model description. In MathProg all statements are divided into two categories: declaration statements and functional statements. {\it Declaration statements} (set statement, parameter statement, variable statement, constraint statement, objective statement) are used to declare model objects of certain kinds and define certain properties of such objects. {\it Functional statements} (solve statement, check statement, display statement, printf statement, loop statement, table statement) are intended for performing some specific actions. Note that declaration statements may follow in arbitrary order, which does not affect the result of translation. However, any model object should be declared before it is referenced in other statements. \section{Set statement} \noindent \framebox[468pt][l]{ \parbox[c][24pt]{468pt}{ \hspace{6pt} {\tt set} {\it name} {\it alias} {\it domain} {\tt,} {\it attrib} {\tt,} \dots {\tt,} {\it attrib} {\tt;} }} \medskip \noindent {\it name} is a symbolic name of the set; \noindent {\it alias} is an optional string literal, which specifies an alias of the set; \noindent {\it domain} is an optional indexing expression, which specifies a subscript domain of the set; \noindent {\it attrib}, \dots, {\it attrib} are optional attributes of the set. (Commae preceding attributes may be omitted.) \para{Optional attributes} \vspace*{-8pt} \begin{description} \item[{\tt dimen} $n$]\hspace*{0pt}\\ specifies the dimension of $n$-tuples which the set consists of; \item[{\tt within} {\it expression}]\hspace*{0pt}\\ specifies a superset which restricts the set or all its members (elemental sets) to be within that superset; \item[{\tt:=} {\it expression}]\hspace*{0pt}\\ specifies an elemental set assigned to the set or its members; \item[{\tt default} {\it expression}]\hspace*{0pt}\\ specifies an elemental set assigned to the set or its members whenever no appropriate data are available in the data section. \end{description} \vspace*{-8pt} \para{Examples} \begin{verbatim} set nodes; set arcs within nodes cross nodes; set step{s in 1..maxiter} dimen 2 := if s = 1 then arcs else step[s-1] union setof{k in nodes, (i,k) in step[s-1], (k,j) in step[s-1]}(i,j); set A{i in I, j in J}, within B[i+1] cross C[j-1], within D diff E, default {('abc',123), (321,'cba')}; \end{verbatim} The set statement declares a set. If the subscript domain is not specified, the set is a simple set, otherwise it is an array of elemental sets. The {\tt dimen} attribute specifies the dimension of $n$-tuples, which the set (if it is a simple set) or its members (if the set is an array of elemental sets) consist of, where $n$ should be an unsigned integer from 1 to 20. At most one {\tt dimen} attribute can be specified. If the {\tt dimen} attribute is not specified, the dimension of $n$-tuples is implicitly determined by other attributes (for example, if there is a set expression that follows {\tt:=} or the keyword {\tt default}, the dimension of $n$-tuples of corresponding elemental set is used). If no dimension information is available, {\tt dimen 1} is assumed. The {\tt within} attribute specifies a set expression whose resultant value is a superset used to restrict the set (if it is a simple set) or its members (if the set is an array of elemental sets) to be within that superset. Arbitrary number of {\tt within} attributes may be specified in the same set statement. The assign ({\tt:=}) attribute specifies a set expression used to evaluate elemental set(s) assigned to the set (if it is a simple set) or its members (if the set is an array of elemental sets). If the assign attribute is specified, the set is {\it computable} and therefore needs no data to be provided in the data section. If the assign attribute is not specified, the set should be provided with data in the data section. At most one assign or default attribute can be specified for the same set. The {\tt default} attribute specifies a set expression used to evaluate elemental set(s) assigned to the set (if it is a simple set) or its members (if the set is an array of elemental sets) whenever no appropriate data are available in the data section. If neither assign nor default attribute is specified, missing data will cause an error. \newpage \section{Parameter statement} \noindent \framebox[468pt][l]{ \parbox[c][24pt]{468pt}{ \hspace{6pt} {\tt param} {\it name} {\it alias} {\it domain} {\tt,} {\it attrib} {\tt,} \dots {\tt,} {\it attrib} {\tt;} }} \medskip \noindent {\it name} is a symbolic name of the parameter; \noindent {\it alias} is an optional string literal, which specifies an alias of the parameter; \noindent {\it domain} is an optional indexing expression, which specifies a subscript domain of the parameter; \noindent {\it attrib}, \dots, {\it attrib} are optional attributes of the parameter. (Commae preceding attributes may be omitted.) \para{Optional attributes} \vspace*{-8pt} \begin{description} \item[{\tt integer}]\hspace*{0pt}\\ specifies that the parameter is integer; \item[{\tt binary}]\hspace*{0pt}\\ specifies that the parameter is binary; \item[{\tt symbolic}]\hspace*{0pt}\\ specifies that the parameter is symbolic; \item[{\it relation expression}]\hspace*{0pt}\\ (where {\it relation} is one of: {\tt<}, {\tt<=}, {\tt=}, {\tt==}, {\tt>=}, {\tt>}, {\tt<>}, {\tt!=})\\ specifies a condition that restricts the parameter or its members to satisfy that condition; \item[{\tt in} {\it expression}]\hspace*{0pt}\\ specifies a superset that restricts the parameter or its members to be in that superset; \item[{\tt:=} {\it expression}]\hspace*{0pt}\\ specifies a value assigned to the parameter or its members; \item[{\tt default} {\it expression}]\hspace*{0pt}\\ specifies a value assigned to the parameter or its members whenever no appropriate data are available in the data section. \end{description} \vspace*{-8pt} \para{Examples} \begin{verbatim} param units{raw, prd} >= 0; param profit{prd, 1..T+1}; param N := 20 integer >= 0 <= 100; param comb 'n choose k' {n in 0..N, k in 0..n} := if k = 0 or k = n then 1 else comb[n-1,k-1] + comb[n-1,k]; param p{i in I, j in J}, integer, >= 0, <= i+j, in A[i] symdiff B[j], in C[i,j], default 0.5 * (i + j); param month symbolic default 'May' in {'Mar', 'Apr', 'May'}; \end{verbatim} The parameter statement declares a parameter. If a subscript domain is not specified, the parameter is a simple (scalar) parameter, otherwise it is a $n$-dimensional array. The type attributes {\tt integer}, {\tt binary}, and {\tt symbolic} qualify the type of values that can be assigned to the parameter as shown below: \noindent\hfil \begin{tabular}{@{}ll@{}} Type attribute&Assigned values\\ \hline (not specified)&Any numeric values\\ {\tt integer}&Only integer numeric values\\ {\tt binary}&Either 0 or 1\\ {\tt symbolic}&Any numeric and symbolic values\\ \end{tabular} The {\tt symbolic} attribute cannot be specified along with other type attributes. Being specified it should precede all other attributes. The condition attribute specifies an optional condition that restricts values assigned to the parameter to satisfy that condition. This attribute has the following syntactic forms: \begin{tabular}{@{}ll@{}} {\tt<} $v$&check for $x=} $v$&check for $x\geq v$\\ {\tt>} $v$&check for $x\geq v$\\ {\tt<>} $v$, {\tt!=} $v$&check for $x\neq v$\\ \end{tabular} \noindent where $x$ is a value assigned to the parameter, $v$ is the resultant value of a numeric or symbolic expression specified in the condition attribute. Arbitrary number of condition attributes can be specified for the same parameter. If a value being assigned to the parameter during model evaluation violates at least one of specified conditions, an error is raised. (Note that symbolic values are ordered lexicographically, and any numeric value precedes any symbolic value.) The {\tt in} attribute is similar to the condition attribute and specifies a set expression whose resultant value is a superset used to restrict numeric or symbolic values assigned to the parameter to be in that superset. Arbitrary number of the {\tt in} attributes can be specified for the same parameter. If a value being assigned to the parameter during model evaluation is not in at least one of specified supersets, an error is raised. The assign ({\tt:=}) attribute specifies a numeric or symbolic expression used to compute a value assigned to the parameter (if it is a simple parameter) or its member (if the parameter is an array). If the assign attribute is specified, the parameter is {\it computable} and therefore needs no data to be provided in the data section. If the assign attribute is not specified, the parameter should be provided with data in the data section. At most one assign or {\tt default} attribute can be specified for the same parameter. The {\tt default} attribute specifies a numeric or symbolic expression used to compute a value assigned to the parameter or its member whenever no appropriate data are available in the data section. If neither assign nor {\tt default} attribute is specified, missing data will cause an error. \newpage \section{Variable statement} \noindent \framebox[468pt][l]{ \parbox[c][24pt]{468pt}{ \hspace{6pt} {\tt var} {\it name} {\it alias} {\it domain} {\tt,} {\it attrib} {\tt,} \dots {\tt,} {\it attrib} {\tt;} }} \medskip \noindent {\it name} is a symbolic name of the variable; \noindent {\it alias} is an optional string literal, which specifies an alias of the variable; \noindent {\it domain} is an optional indexing expression, which specifies a subscript domain of the variable; \noindent {\it attrib}, \dots, {\it attrib} are optional attributes of the variable. (Commae preceding attributes may be omitted.) \para{Optional attributes} \vspace*{-8pt} \begin{description} \item[{\tt integer}]\hspace*{0pt}\\ restricts the variable to be integer; \item[{\tt binary}]\hspace*{0pt}\\ restricts the variable to be binary; \item[{\tt>=} {\it expression}]\hspace*{0pt}\\ specifies an lower bound of the variable; \item[{\tt<=} {\it expression}]\hspace*{0pt}\\ specifies an upper bound of the variable; \item[{\tt=} {\it expression}]\hspace*{0pt}\\ specifies a fixed value of the variable; \end{description} \vspace*{-8pt} \para{Examples} \begin{verbatim} var x >= 0; var y{I,J}; var make{p in prd}, integer, >= commit[p], <= market[p]; var store{raw, 1..T+1} >= 0; var z{i in I, j in J} >= i+j; \end{verbatim} The variable statement declares a variable. If a subscript domain is not specified, the variable is a simple (scalar) variable, otherwise it is a $n$-dimensional array of elemental variables. Elemental variable(s) associated with the model variable (if it is a simple variable) or its members (if it is an array) correspond to the variables in the LP/MIP problem formulation (see Section \ref{problem}, page \pageref{problem}). Note that only elemental variables actually referenced in some constraints and/or objectives are included in the LP/MIP problem instance to be generated. The type attributes {\tt integer} and {\tt binary} restrict the variable to be integer or binary, respectively. If no type attribute is specified, the variable is continuous. If all variables in the model are continuous, the corresponding problem is of LP class. If there is at least one integer or binary variable, the problem is of MIP class. The lower bound ({\tt>=}) attribute specifies a numeric expression for computing an lower bound of the variable. At most one lower bound can be specified. By default all variables (except binary ones) have no lower bound, so if a variable is required to be non-negative, its zero lower bound should be explicitly specified. The upper bound ({\tt<=}) attribute specifies a numeric expression for computing an upper bound of the variable. At most one upper bound attribute can be specified. The fixed value ({\tt=}) attribute specifies a numeric expression for computing a value, at which the variable is fixed. This attribute cannot be specified along with the bound attributes. \section{Constraint statement} \noindent \framebox[468pt][l]{ \parbox[c][106pt]{468pt}{ \hspace{6pt} {\tt s.t.} {\it name} {\it alias} {\it domain} {\tt:} {\it expression} {\tt,} {\tt=} {\it expression} {\tt;} \medskip \hspace{6pt} {\tt s.t.} {\it name} {\it alias} {\it domain} {\tt:} {\it expression} {\tt,} {\tt<=} {\it expression} {\tt;} \medskip \hspace{6pt} {\tt s.t.} {\it name} {\it alias} {\it domain} {\tt:} {\it expression} {\tt,} {\tt>=} {\it expression} {\tt;} \medskip \hspace{6pt} {\tt s.t.} {\it name} {\it alias} {\it domain} {\tt:} {\it expression} {\tt,} {\tt<=} {\it expression} {\tt,} {\tt<=} {\it expression} {\tt;} \medskip \hspace{6pt} {\tt s.t.} {\it name} {\it alias} {\it domain} {\tt:} {\it expression} {\tt,} {\tt>=} {\it expression} {\tt,} {\tt>=} {\it expression} {\tt;} }} \medskip \noindent {\it name} is a symbolic name of the constraint; \noindent {\it alias} is an optional string literal, which specifies an alias of the constraint; \noindent {\it domain} is an optional indexing expression, which specifies a subscript domain of the constraint; \noindent {\it expression} is a linear expression used to compute a component of the constraint. (Commae following expressions may be omitted.) \noindent (The keyword {\tt s.t.} may be written as {\tt subject to} or as {\tt subj to}, or may be omitted at all.) \para{Examples} \begin{verbatim} s.t. r: x + y + z, >= 0, <= 1; limit{t in 1..T}: sum{j in prd} make[j,t] <= max_prd; subject to balance{i in raw, t in 1..T}: store[i,t+1] = store[i,t] - sum{j in prd} units[i,j] * make[j,t]; subject to rlim 'regular-time limit' {t in time}: sum{p in prd} pt[p] * rprd[p,t] <= 1.3 * dpp[t] * crews[t]; \end{verbatim} The constraint statement declares a constraint. If a subscript domain is not specified, the\linebreak constraint is a simple (scalar) constraint, otherwise it is a $n$-dimensional array of elemental constraints. Elemental constraint(s) associated with the model constraint (if it is a simple constraint) or its members (if it is an array) correspond to the linear constraints in the LP/MIP problem formulation (see Section \ref{problem}, page \pageref{problem}). If the constraint has the form of equality or single inequality, i.e. includes two expressions, one of which follows the colon and other follows the relation sign {\tt=}, {\tt<=}, or {\tt>=}, both expressions in the statement can be linear expressions. If the constraint has the form of double inequality,\linebreak i.e. includes three expressions, the middle expression can be a linear expression while the leftmost and rightmost ones can be only numeric expressions. Generating the model is, roughly speaking, generating its constraints, which are always evaluated for the entire subscript domain. Evaluation of the constraints leads, in turn, to evaluation of other model objects such as sets, parameters, and variables. Constructing an actual linear constraint included in the problem instance, which (constraint) corresponds to a particular elemental constraint, is performed as follows. If the constraint has the form of equality or single inequality, evaluation of both linear expressions gives two resultant linear forms: $$\begin{array}{r@{\ }c@{\ }r@{\ }c@{\ }r@{\ }c@{\ }r@{\ }c@{\ }r} f&=&a_1x_1&+&a_2x_2&+\dots+&a_nx_n&+&a_0,\\ g&=&b_1x_1&+&a_2x_2&+\dots+&a_nx_n&+&b_0,\\ \end{array}$$ where $x_1$, $x_2$, \dots, $x_n$ are elemental variables; $a_1$, $a_2$, \dots, $a_n$, $b_1$, $b_2$, \dots, $b_n$ are numeric coefficients; $a_0$ and $b_0$ are constant terms. Then all linear terms of $f$ and $g$ are carried to the left-hand side, and the constant terms are carried to the right-hand side, that gives the final elemental constraint in the standard form: $$(a_1-b_1)x_1+(a_2-b_2)x_2+\dots+(a_n-b_n)x_n\left\{ \begin{array}{@{}c@{}}=\\\leq\\\geq\\\end{array}\right\}b_0-a_0.$$ If the constraint has the form of double inequality, evaluation of the middle linear expression gives the resultant linear form: $$f=a_1x_1+a_2x_2+\dots+a_nx_n+a_0,$$ and evaluation of the leftmost and rightmost numeric expressions gives two numeric values $l$ and $u$, respectively. Then the constant term of the linear form is carried to both left-hand and right-handsides that gives the final elemental constraint in the standard form: $$l-a_0\leq a_1x_1+a_2x_2+\dots+a_nx_n\leq u-a_0.$$ \section{Objective statement} \noindent \framebox[468pt][l]{ \parbox[c][44pt]{468pt}{ \hspace{6pt} {\tt minimize} {\it name} {\it alias} {\it domain} {\tt:} {\it expression} {\tt;} \medskip \hspace{6pt} {\tt maximize} {\it name} {\it alias} {\it domain} {\tt:} {\it expression} {\tt;} }} \medskip \noindent {\it name} is a symbolic name of the objective; \noindent {\it alias} is an optional string literal, which specifies an alias of the objective; \noindent {\it domain} is an optional indexing expression, which specifies a subscript domain of the objective; \noindent {\it expression} is a linear expression used to compute the linear form of the objective. \newpage \para{Examples} \begin{verbatim} minimize obj: x + 1.5 * (y + z); maximize total_profit: sum{p in prd} profit[p] * make[p]; \end{verbatim} The objective statement declares an objective. If a subscript domain is not specified, the objective is a simple (scalar) objective. Otherwise it is a $n$-dimensional array of elemental objectives. Elemental objective(s) associated with the model objective (if it is a simple objective) or its members (if it is an array) correspond to general linear constraints in the LP/MIP problem formulation (see Section \ref{problem}, page \pageref{problem}). However, unlike constraints the corresponding linear forms are free (unbounded). Constructing an actual linear constraint included in the problem instance, which (constraint) corresponds to a particular elemental constraint, is performed as follows. The linear expression specified in the objective statement is evaluated that, gives the resultant linear form: $$f=a_1x_1+a_2x_2+\dots+a_nx_n+a_0,$$ where $x_1$, $x_2$, \dots, $x_n$ are elemental variables; $a_1$, $a_2$, \dots, $a_n$ are numeric coefficients; $a_0$ is the constant term. Then the linear form is used to construct the final elemental constraint in the standard form: $$-\infty= 0 and y >= 0; check sum{i in ORIG} supply[i] = sum{j in DEST} demand[j]; check{i in I, j in 1..10}: S[i,j] in U[i] union V[j]; \end{verbatim} The check statement allows checking the resultant value of an logical expression specified in the statement. If the value is {\it false}, an error is reported. If the subscript domain is not specified, the check is performed only once. Specifying the subscript domain allows performing multiple check for every $n$-tuple in the domain set. In the latter case the logical expression may include dummy indices introduced in corresponding indexing expression. \section{Display statement} \noindent \framebox[468pt][l]{ \parbox[c][24pt]{468pt}{ \hspace{6pt} {\tt display} {\it domain} {\tt:} {\it item} {\tt,} \dots {\tt,} {\it item} {\tt;} }} \medskip \noindent {\it domain} is an optional indexing expression, which specifies a subscript domain of the display statement; \noindent {\it item}, \dots, {\it item} are items to be displayed. (The colon preceding the first item may be omitted.) \para{Examples} \begin{verbatim} display: 'x =', x, 'y =', y, 'z =', z; display sqrt(x ** 2 + y ** 2 + z ** 2); display{i in I, j in J}: i, j, a[i,j], b[i,j]; \end{verbatim} The display statement evaluates all items specified in the statement and writes their values on the standard output (terminal) in plain text format. If a subscript domain is not specified, items are evaluated and then displayed only once. Specifying the subscript domain causes items to be evaluated and displayed for every $n$-tuple in the domain set. In the latter case items may include dummy indices introduced in corresponding indexing expression. An item to be displayed can be a model object (set, parameter, variable, constraint, objective) or an expression. If the item is a computable object (i.e. a set or parameter provided with the assign attribute), the object is evaluated over the entire domain and then its content (i.e. the content of the object array) is displayed. Otherwise, if the item is not a computable object, only its current content (i.e. members actually generated during the model evaluation) is displayed. If the item is an expression, the expression is evaluated and its resultant value is displayed. \section{Printf statement} \noindent \framebox[468pt][l]{ \parbox[c][64pt]{468pt}{ \hspace{6pt} {\tt printf} {\it domain} {\tt:} {\it format} {\tt,} {\it expression} {\tt,} \dots {\tt,} {\it expression} {\tt;} \medskip \hspace{6pt} {\tt printf} {\it domain} {\tt:} {\it format} {\tt,} {\it expression} {\tt,} \dots {\tt,} {\it expression} {\tt>} {\it filename} {\tt;} \medskip \hspace{6pt} {\tt printf} {\it domain} {\tt:} {\it format} {\tt,} {\it expression} {\tt,} \dots {\tt,} {\it expression} {\tt>>} {\it filename} {\tt;} }} \medskip \noindent {\it domain} is an optional indexing expression, which specifies a subscript domain of the printf statement; \noindent {\it format} is a symbolic expression whose value specifies a format control string. (The colon preceding the format expression may be omitted.) \noindent {\it expression}, \dots, {\it expression} are zero or more expressions whose values have to be formatted and printed. Each expression should be of numeric, symbolic, or logical type. \noindent {\it filename} is a symbolic expression whose value specifies a name of a text file, to which the output is redirected. The flag {\tt>} means creating a new empty file while the flag {\tt>>} means appending the output to an existing file. If no file name is specified, the output is written on the standard output (terminal). \para{Examples} \begin{verbatim} printf 'Hello, world!\n'; printf: "x = %.3f; y = %.3f; z = %.3f\n", x, y, z > "result.txt"; printf{i in I, j in J}: "flow from %s to %s is %d\n", i, j, x[i,j] >> result_file & ".txt"; printf{i in I} 'total flow from %s is %g\n', i, sum{j in J} x[i,j]; printf{k in K} "x[%s] = " & (if x[k] < 0 then "?" else "%g"), k, x[k]; \end{verbatim} The printf statement is similar to the display statement, however, it allows formatting data to be written. If a subscript domain is not specified, the printf statement is executed only once. Specifying a subscript domain causes executing the printf statement for every $n$-tuple in the domain set. In the latter case the format and expression may include dummy indices introduced in corresponding indexing expression. The format control string is a value of the symbolic expression {\it format} specified in the printf statement. It is composed of zero or more directives as follows: ordinary characters (not {\tt\%}), which are copied unchanged to the output stream, and conversion specifications, each of which causes evaluating corresponding expression specified in the printf statement, formatting it, and writing its resultant value to the output stream. Conversion specifications that may be used in the format control string are the following:\linebreak {\tt d}, {\tt i}, {\tt f}, {\tt F}, {\tt e}, {\tt E}, {\tt g}, {\tt G}, and {\tt s}. These specifications have the same syntax and semantics as in the C programming language. \section{For statement} \noindent \framebox[468pt][l]{ \parbox[c][44pt]{468pt}{ \hspace{6pt} {\tt for} {\it domain} {\tt:} {\it statement} {\tt;} \medskip \hspace{6pt} {\tt for} {\it domain} {\tt:} {\tt\{} {\it statement} \dots {\it statement} {\tt\}} {\tt;} }} \medskip \noindent {\it domain} is an indexing expression which specifies a subscript domain of the for statement. (The colon following the indexing expression may be omitted.) \noindent {\it statement} is a statement, which should be executed under control of the for statement; \noindent {\it statement}, \dots, {\it statement} is a sequence of statements (enclosed in curly braces), which should be executed under control of the for statement. Only the following statements can be used within the for statement: check, display, printf, and another for. \para{Examples} \begin{verbatim} for {(i,j) in E: i != j} { printf "flow from %s to %s is %g\n", i, j, x[i,j]; check x[i,j] >= 0; } for {i in 1..n} { for {j in 1..n} printf " %s", if x[i,j] then "Q" else "."; printf("\n"); } for {1..72} printf("*"); \end{verbatim} The for statement causes a statement or a sequence of statements specified as part of the for statement to be executed for every $n$-tuple in the domain set. Thus, statements within the for statement may include dummy indices introduced in corresponding indexing expression. \newpage \section{Table statement} \noindent \framebox[468pt][l]{ \parbox[c][80pt]{468pt}{ \hspace{6pt} {\tt table} {\it name} {\it alias} {\tt IN} {\it driver} {\it arg} \dots {\it arg} {\tt:} \hspace{6pt} {\tt\ \ \ \ \ } {\it set} {\tt<-} {\tt[} {\it fld} {\tt,} \dots {\tt,} {\it fld} {\tt]} {\tt,} {\it par} {\tt\textasciitilde} {\it fld} {\tt,} \dots {\tt,} {\it par} {\tt\textasciitilde} {\it fld} {\tt;} \medskip \hspace{6pt} {\tt table} {\it name} {\it alias} {\it domain} {\tt OUT} {\it driver} {\it arg} \dots {\it arg} {\tt:} \hspace{6pt} {\tt\ \ \ \ \ } {\it expr} {\tt\textasciitilde} {\it fld} {\tt,} \dots {\tt,} {\it expr} {\tt\textasciitilde} {\it fld} {\tt;} }} \medskip \noindent {\it name} is a symbolic name of the table; \noindent {\it alias} is an optional string literal, which specifies an alias of the table; \noindent {\it domain} is an indexing expression, which specifies a subscript domain of the (output) table; \noindent {\tt IN} means reading data from the input table; \noindent {\tt OUT} means writing data to the output table; \noindent {\it driver} is a symbolic expression, which specifies the driver used to access the table (for details see Appendix \ref{drivers}, page \pageref{drivers}); \noindent {\it arg} is an optional symbolic expression, which is an argument pass\-ed to the table driver. This symbolic expression should not include dummy indices specified in the domain; \noindent {\it set} is the name of an optional simple set called {\it control set}. It can be omitted along with the delimiter {\tt<-}; \noindent {\it fld} is a field name. Within square brackets at least one field should be specified. The field name following a parameter name or expression is optional and can be omitted along with the delimiter~{\tt\textasciitilde}, in which case the name of corresponding model object is used as the field name; \noindent {\it par} is a symbolic name of a model parameter; \noindent {\it expr} is a numeric or symbolic expression. \para{Examples} \begin{verbatim} table data IN "CSV" "data.csv": S <- [FROM,TO], d~DISTANCE, c~COST; table result{(f,t) in S} OUT "CSV" "result.csv": f~FROM, t~TO, x[f,t]~FLOW; \end{verbatim} The table statement allows reading data from a table into model objects such as sets and (non-scalar) parameters as well as writing data from the model to a table. \newpage \subsection{Table structure} A {\it data table} is an (unordered) set of {\it records}, where each record consists of the same number of {\it fields}, and each field is provided with a unique symbolic name called the {\it field name}. For example: \bigskip \begin{tabular}{@{\hspace*{42mm}}c@{\hspace*{11mm}}c@{\hspace*{10mm}}c @{\hspace*{9mm}}c} First&Second&&Last\\ field&field&.\ \ .\ \ .&field\\ $\downarrow$&$\downarrow$&&$\downarrow$\\ \end{tabular} \begin{tabular}{ll@{}} Table header&$\rightarrow$\\ First record&$\rightarrow$\\ Second record&$\rightarrow$\\ \\ \hfil .\ \ .\ \ .\\ \\ Last record&$\rightarrow$\\ \end{tabular} \begin{tabular}{|l|l|c|c|} \hline {\tt FROM}&{\tt TO}&{\tt DISTANCE}&{\tt COST}\\ \hline {\tt Seattle} &{\tt New-York}&{\tt 2.5}&{\tt 0.12}\\ {\tt Seattle} &{\tt Chicago} &{\tt 1.7}&{\tt 0.08}\\ {\tt Seattle} &{\tt Topeka} &{\tt 1.8}&{\tt 0.09}\\ {\tt San-Diego}&{\tt New-York}&{\tt 2.5}&{\tt 0.15}\\ {\tt San-Diego}&{\tt Chicago} &{\tt 1.8}&{\tt 0.10}\\ {\tt San-Diego}&{\tt Topeka} &{\tt 1.4}&{\tt 0.07}\\ \hline \end{tabular} \subsection{Reading data from input table} The input table statement causes reading data from the specified table record by record. Once a next record has been read, numeric or symbolic values of fields, whose names are enclosed in square brackets in the table statement, are gathered into $n$-tuple, and if the control set is specified in the table statement, this $n$-tuple is added to it. Besides, a numeric or symbolic value of each field associated with a model parameter is assigned to the parameter member identified by subscripts, which are components of the $n$-tuple just read. For example, the following input table statement: \noindent\hfil \verb|table data IN "...": S <- [FROM,TO], d~DISTANCE, c~COST;| \noindent causes reading values of four fields named {\tt FROM}, {\tt TO}, {\tt DISTANCE}, and {\tt COST} from each record of the specified table. Values of fields {\tt FROM} and {\tt TO} give a pair $(f,t)$, which is added to the control set {\tt S}. The value of field {\tt DISTANCE} is assigned to parameter member ${\tt d}[f,t]$, and the value of field {\tt COST} is assigned to parameter member ${\tt c}[f,t]$. Note that the input table may contain extra fields whose names are not specified in the table statement, in which case values of these fields on reading the table are ignored. \subsection{Writing data to output table} The output table statement causes writing data to the specified table. Note that some drivers (namely, CSV and xBASE) destroy the output table before writing data, i.e. delete all its existing records. Each $n$-tuple in the specified domain set generates one record written to the output table. Values of fields are numeric or symbolic values of corresponding expressions specified in the table statement. These expressions are evaluated for each $n$-tuple in the domain set and, thus, may include dummy indices introduced in the corresponding indexing expression. For example, the following output table statement: \noindent\hfil \verb|table result{(f,t) in S} OUT "...": f~FROM, t~TO, x[f,t]~FLOW;| \noindent causes writing records, by one record for each pair $(f,t)$ in set {\tt S}, to the output table, where each record consists of three fields named {\tt FROM}, {\tt TO}, and {\tt FLOW}. The values written to fields {\tt FROM} and {\tt TO} are current values of dummy indices {\tt f} and {\tt t}, and the value written to field {\tt FLOW} is a value of member ${\tt x}[f,t]$ of corresponding subscripted parameter or variable. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Model data} {\it Model data} include elemental sets, which are ``values'' of model sets, and numeric and symbolic values of model parameters. In MathProg there are two different ways to saturate model sets and parameters with data. One way is simply providing necessary data using the assign attribute. However, in many cases it is more practical to separate the model itself and particular data needed for the model. For the latter reason in MathProg there is another way, when the model description is divided into two parts: model section and data section. A {\it model section} is a main part of the model description that contains declarations of all model objects and is common for all problems based on that model. A {\it data section} is an optional part of the model description that contains model data specific for a particular problem. In MathProg model and data sections can be placed either in one text file or in two separate text files. 1. If both model and data sections are placed in one file, the file is composed as follows: \bigskip \noindent\hfil \framebox{\begin{tabular}{l} {\it statement}{\tt;}\\ {\it statement}{\tt;}\\ \hfil.\ \ .\ \ .\\ {\it statement}{\tt;}\\ {\tt data;}\\ {\it data block}{\tt;}\\ {\it data block}{\tt;}\\ \hfil.\ \ .\ \ .\\ {\it data block}{\tt;}\\ {\tt end;} \end{tabular}} \newpage 2. If the model and data sections are placed in two separate files, the files are composed as follows: \bigskip \noindent\hfil \begin{tabular}{@{}c@{}} \framebox{\begin{tabular}{l} {\it statement}{\tt;}\\ {\it statement}{\tt;}\\ \hfil.\ \ .\ \ .\\ {\it statement}{\tt;}\\ {\tt end;}\\ \end{tabular}}\\ \\\\Model file\\ \end{tabular} \hspace{32pt} \begin{tabular}{@{}c@{}} \framebox{\begin{tabular}{l} {\tt data;}\\ {\it data block}{\tt;}\\ {\it data block}{\tt;}\\ \hfil.\ \ .\ \ .\\ {\it data block}{\tt;}\\ {\tt end;}\\ \end{tabular}}\\ \\Data file\\ \end{tabular} \bigskip Note: If the data section is placed in a separate file, the keyword {\tt data} is optional and may be omitted along with the semicolon that follows it. \section{Coding data section} The {\it data section} is a sequence of data blocks in various formats, which are discussed in following sections. The order, in which data blocks follow in the data section, may be arbitrary, not necessarily the same, in which corresponding model objects follow in the model section. The rules of coding the data section are commonly the same as the rules of coding the model description (see Section \ref{coding}, page \pageref{coding}), i.e. data blocks are composed from basic lexical units such as symbolic names, numeric and string literals, keywords, delimiters, and comments. However, for the sake of convenience and for improving readability there is one deviation from the common rule: if a string literal consists of only alphanumeric characters (including the underscore character), the signs {\tt+} and {\tt-}, and/or the decimal point, it may be coded without bordering by (single or double) quotes. All numeric and symbolic material provided in the data section is coded in the form of numbers and symbols, i.e. unlike the model section no expressions are allowed in the data section. Nevertheless, the signs {\tt+} and {\tt-} can precede numeric literals to allow coding signed numeric quantities, in which case there should be no white-space characters between the sign and following numeric literal (if there is at least one white-space, the sign and following numeric literal are recognized as two different lexical units). \newpage \section{Set data block} \noindent \framebox[468pt][l]{ \parbox[c][44pt]{468pt}{ \hspace{6pt} {\tt set} {\it name} {\tt,} {\it record} {\tt,} \dots {\tt,} {\it record} {\tt;} \medskip \hspace{6pt} {\tt set} {\it name} {\tt[} {\it symbol} {\tt,} \dots {\tt,} {\it symbol} {\tt]} {\tt,} {\it record} {\tt,} \dots {\tt,} {\it record} {\tt;} }} \medskip \noindent {\it name} is a symbolic name of the set; \noindent {\it symbol}, \dots, {\it symbol} are subscripts, which specify a particular member of the set (if the set is an array, i.e. a set of sets); \noindent {\it record}, \dots, {\it record} are data records. \noindent Commae preceding data records may be omitted. \para{Data records} \vspace*{-8pt} \begin{description} \item[{\tt :=}]\hspace*{0pt}\\ is a non-significant data record, which may be used freely to improve readability; \item[{\tt(} {\it slice} {\tt)}]\hspace*{0pt}\\ specifies a slice; \item[{\it simple-data}]\hspace*{0pt}\\ specifies set data in the simple format; \item[{\tt:} {\it matrix-data}]\hspace*{0pt}\\ specifies set data in the matrix format; \item[{\tt(tr)} {\tt:} {\it matrix-data}]\hspace*{0pt}\\ specifies set data in the transposed matrix format. (In this case the colon following the keyword {\tt(tr)} may be omitted.) \end{description} \vspace*{-8pt} \para{Examples} \begin{verbatim} set month := Jan Feb Mar Apr May Jun; set month "Jan", "Feb", "Mar", "Apr", "May", "Jun"; set A[3,Mar] := (1,2) (2,3) (4,2) (3,1) (2,2) (4,4) (3,4); set A[3,'Mar'] := 1 2 2 3 4 2 3 1 2 2 4 4 3 4; set A[3,'Mar'] : 1 2 3 4 := 1 - + - - 2 - + + - 3 + - - + 4 - + - + ; set B := (1,2,3) (1,3,2) (2,3,1) (2,1,3) (1,2,2) (1,1,1) (2,1,1); set B := (*,*,*) 1 2 3, 1 3 2, 2 3 1, 2 1 3, 1 2 2, 1 1 1, 2 1 1; set B := (1,*,2) 3 2 (2,*,1) 3 1 (1,2,3) (2,1,3) (1,1,1); set B := (1,*,*) : 1 2 3 := 1 + - - 2 - + + 3 - + - (2,*,*) : 1 2 3 := 1 + - + 2 - - - 3 + - - ; \end{verbatim} \noindent(In these examples {\tt month} is a simple set of singlets, {\tt A} is a 2-dimensional array of doublets, and {\tt B} is a simple set of triplets. Data blocks for the same set are equivalent in the sense that they specify the same data in different formats.) The {\it set data block} is used to specify a complete elemental set, which is assigned to a set (if it is a simple set) or one of its members (if the set is an array of sets).\footnote{There is another way to specify data for a simple set along with data for parameters. This feature is discussed in the next section.} Data blocks can be specified only for non-computable sets, i.e. for sets, which have no assign attribute ({\tt:=}) in the corresponding set statements. If the set is a simple set, only its symbolic name should be specified in the header of the data block. Otherwise, if the set is a $n$-dimensional array, its symbolic name should be provided with a complete list of subscripts separated by commae and enclosed in square brackets to specify a particular member of the set array. The number of subscripts should be the same as the dimension of the set array, where each subscript should be a number or symbol. An elemental set defined in the set data block is coded as a sequence of data records described below.\footnote{{\it Data record} is simply a technical term. It does not mean that data records have any special formatting.} \subsection{Assign data record} The {\it assign data record} ({\tt:=}) is a non-signficant element. It may be used for improving readability of data blocks. \subsection{Slice data record} The {\it slice data record} is a control record, which specifies a {\it slice} of the elemental set defined in the data block. It has the following syntactic form: $$\mbox{{\tt(} $s_1$ {\tt,} $s_2$ {\tt,} \dots {\tt,} $s_n$ {\tt)}}$$ where $s_1$, $s_2$, \dots, $s_n$ are components of the slice. Each component of the slice can be a number or symbol or the asterisk ({\tt*}). The number of components in the slice should be the same as the dimension of $n$-tuples in the elemental set to be defined. For instance, if the elemental set contains 4-tuples (quadruplets), the slice should have four components. The number of asterisks in the slice is called the {\it slice dimension}. The effect of using slices is the following. If a $m$-dimensional slice (i.e. a slice having $m$ asterisks) is specified in the data block, all subsequent data records should specify tuples of the dimension~$m$. Whenever a $m$-tuple is encountered, each asterisk in the slice is replaced by corresponding components of the $m$-tuple that gives the resultant $n$-tuple, which is included in the elemental set to be defined. For example, if the slice $(a,*,1,2,*)$ is in effect, and 2-tuple $(3,b)$ is encountered in a subsequent data record, the resultant 5-tuple included in the elemental set is $(a,3,1,2,b)$. The slice having no asterisks itself defines a complete $n$-tuple, which is included in the elemental set. Being once specified the slice effects until either a new slice or the end of data block is encountered. Note that if no slice is specified in the data block, one, components of which are all asterisks, is assumed. \subsection{Simple data record} The {\it simple data record} defines one $n$-tuple in a simple format and has the following syntactic form: $$\mbox{$t_1$ {\tt,} $t_2$ {\tt,} \dots {\tt,} $t_n$}$$ where $t_1$, $t_2$, \dots, $t_n$ are components of the $n$-tuple. Each component can be a number or symbol. Commae between components are optional and may be omitted. \subsection{Matrix data record} The {\it matrix data record} defines several 2-tuples (doublets) in a matrix format and has the following syntactic form: $$\begin{array}{cccccc} \mbox{{\tt:}}&c_1&c_2&\dots&c_n&\mbox{{\tt:=}}\\ r_1&a_{11}&a_{12}&\dots&a_{1n}&\\ r_2&a_{21}&a_{22}&\dots&a_{2n}&\\ \multicolumn{5}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}&\\ r_m&a_{m1}&a_{m2}&\dots&a_{mn}&\\ \end{array}$$ where $r_1$, $r_2$, \dots, $r_m$ are numbers and/or symbols corresponding to rows of the matrix; $c_1$, $c_2$, \dots, $c_n$ are numbers and/or symbols corresponding to columns of the matrix, $a_{11}$, $a_{12}$, \dots, $a_{mn}$ are matrix elements, which can be either {\tt+} or {\tt-}. (In this data record the delimiter {\tt:} preceding the column list and the delimiter {\tt:=} following the column list cannot be omitted.) Each element $a_{ij}$ of the matrix data block (where $1\leq i\leq m$, $1\leq j\leq n$) corresponds to 2-tuple $(r_i,c_j)$. If $a_{ij}$ is the plus sign ({\tt+}), that 2-tuple (or a longer $n$-tuple, if a slice is used) is included in the elemental set. Otherwise, if $a_{ij}$ is the minus sign ({\tt-}), that 2-tuple is not included in the elemental set. Since the matrix data record defines 2-tuples, either the elemental set should consist of 2-tuples or the slice currently used should be 2-dimensional. \newpage \subsection{Transposed matrix data record} The {\it transposed matrix data record} has the following syntactic form: $$\begin{array}{cccccc} \mbox{{\tt(tr) :}}&c_1&c_2&\dots&c_n&\mbox{{\tt:=}}\\ r_1&a_{11}&a_{12}&\dots&a_{1n}&\\ r_2&a_{21}&a_{22}&\dots&a_{2n}&\\ \multicolumn{5}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}&\\ r_m&a_{m1}&a_{m2}&\dots&a_{mn}&\\ \end{array}$$ (In this case the delimiter {\tt:} following the keyword {\tt(tr)} is optional and may be omitted.) This data record is completely analogous to the matrix data record (see above) with only exception that in this case each element $a_{ij}$ of the matrix corresponds to 2-tuple $(c_j,r_i)$ rather than $(r_i,c_j)$. Being once specified the {\tt(tr)} indicator affects all subsequent data records until either a slice or the end of data block is encountered. \section{Parameter data block} \noindent \framebox[468pt][l]{ \parbox[c][88pt]{468pt}{ \hspace{6pt} {\tt param} {\it name} {\tt,} {\it record} {\tt,} \dots {\tt,} {\it record} {\tt;} \medskip \hspace{6pt} {\tt param} {\it name} {\tt default} {\it value} {\tt,} {\it record} {\tt,} \dots {\tt,} {\it record} {\tt;} \medskip \hspace{6pt} {\tt param} {\tt:} {\it tabbing-data} {\tt;} \medskip \hspace{6pt} {\tt param} {\tt default} {\it value} {\tt:} {\it tabbing-data} {\tt;} }} \medskip \noindent {\it name} is a symbolic name of the parameter; \noindent {\it value} is an optional default value of the parameter; \noindent {\it record}, \dots, {\it record} are data records; \noindent {\it tabbing-data} specifies parameter data in the tabbing format. \noindent Commae preceding data records may be omitted. \para{Data records} \vspace*{-8pt} \begin{description} \item[{\tt :=}]\hspace*{0pt}\\ is a non-significant data record, which may be used freely to improve readability; \item[{\tt[} {\it slice} {\tt]}]\hspace*{0pt}\\ specifies a slice; \item[{\it plain-data}]\hspace*{0pt}\\ specifies parameter data in the plain format; \item[{\tt:} {\it tabular-data}]\hspace*{0pt}\\ specifies parameter data in the tabular format; \item[{\tt(tr)} {\tt:} {\it tabular-data}]\hspace*{0pt}\\ specifies set data in the transposed tabular format. (In this case the colon following the keyword {\tt(tr)} may be omitted.) \end{description} \vspace*{-8pt} \para{Examples} \begin{verbatim} param T := 4; param month := 1 Jan 2 Feb 3 Mar 4 Apr 5 May; param month := [1] 'Jan', [2] 'Feb', [3] 'Mar', [4] 'Apr', [5] 'May'; param init_stock := iron 7.32 nickel 35.8; param init_stock [*] iron 7.32, nickel 35.8; param cost [iron] .025 [nickel] .03; param value := iron -.1, nickel .02; param : init_stock cost value := iron 7.32 .025 -.1 nickel 35.8 .03 .02 ; param : raw : init stock cost value := iron 7.32 .025 -.1 nickel 35.8 .03 .02 ; param demand default 0 (tr) : FRA DET LAN WIN STL FRE LAF := bands 300 . 100 75 . 225 250 coils 500 750 400 250 . 850 500 plate 100 . . 50 200 . 250 ; param trans_cost := [*,*,bands]: FRA DET LAN WIN STL FRE LAF := GARY 30 10 8 10 11 71 6 CLEV 22 7 10 7 21 82 13 PITT 19 11 12 10 25 83 15 [*,*,coils]: FRA DET LAN WIN STL FRE LAF := GARY 39 14 11 14 16 82 8 CLEV 27 9 12 9 26 95 17 PITT 24 14 17 13 28 99 20 [*,*,plate]: FRA DET LAN WIN STL FRE LAF := GARY 41 15 12 16 17 86 8 CLEV 29 9 13 9 28 99 18 PITT 26 14 17 13 31 104 20 ; \end{verbatim} The {\it parameter data block} is used to specify complete data for a parameter (or parameters, if data are specified in the tabbing format). Data blocks can be specified only for non-computable parameters, i.e. for parameters, which have no assign attribute ({\tt:=}) in the corresponding parameter statements. Data defined in the parameter data block are coded as a sequence of data records described below. Additionally the data block can be provided with the optional {\tt default} attribute, which specifies a default numeric or symbolic value of the parameter (parameters). This default value is assigned to the parameter or its members when no appropriate value is defined in the parameter data block. The {\tt default} attribute cannot be used, if it is already specified in the corresponding parameter statement. \subsection{Assign data record} The {\it assign data record} ({\tt:=}) is a non-signficant element. It may be used for improving readability of data blocks. \subsection{Slice data record} The {\it slice data record} is a control record, which specifies a {\it slice} of the parameter array. It has the following syntactic form: $$\mbox{{\tt[} $s_1$ {\tt,} $s_2$ {\tt,} \dots {\tt,} $s_n$ {\tt]}}$$ where $s_1$, $s_2$, \dots, $s_n$ are components of the slice. Each component of the slice can be a number or symbol or the asterisk ({\tt*}). The number of components in the slice should be the same as the dimension of the parameter. For instance, if the parameter is a 4-dimensional array, the slice should have four components. The number of asterisks in the slice is called the {\it slice dimension}. The effect of using slices is the following. If a $m$-dimensional slice (i.e. a slice having $m$ asterisks) is specified in the data block, all subsequent data records should specify subscripts of the parameter members as if the parameter were $m$-dimensional, not $n$-dimensional. Whenever $m$ subscripts are encountered, each asterisk in the slice is replaced by corresponding subscript that gives $n$ subscripts, which define the actual parameter member. For example, if the slice $[a,*,1,2,*]$ is in effect, and subscripts 3 and $b$ are encountered in a subsequent data record, the complete subscript list used to choose a parameter member is $[a,3,1,2,b]$. It is allowed to specify a slice having no asterisks. Such slice itself defines a complete subscript list, in which case the next data record should define only a single value of corresponding parameter member. Being once specified the slice effects until either a new slice or the end of data block is encountered. Note that if no slice is specified in the data block, one, components of which are all asterisks, is assumed. \subsection{Plain data record} The {\it plain data record} defines a subscript list and a single value in the plain format. This record has the following syntactic form: $$\mbox{$t_1$ {\tt,} $t_2$ {\tt,} \dots {\tt,} $t_n$ {\tt,} $v$}$$ where $t_1$, $t_2$, \dots, $t_n$ are subscripts, and $v$ is a value. Each subscript as well as the value can be a number or symbol. Commae following subscripts are optional and may be omitted. In case of 0-dimensional parameter or slice the plain data record has no subscripts and consists of a single value only. \subsection{Tabular data record} The {\it tabular data record} defines several values, where each value is provided with two subscripts. This record has the following syntactic form: $$\begin{array}{cccccc} \mbox{{\tt:}}&c_1&c_2&\dots&c_n&\mbox{{\tt:=}}\\ r_1&a_{11}&a_{12}&\dots&a_{1n}&\\ r_2&a_{21}&a_{22}&\dots&a_{2n}&\\ \multicolumn{5}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}&\\ r_m&a_{m1}&a_{m2}&\dots&a_{mn}&\\ \end{array}$$ where $r_1$, $r_2$, \dots, $r_m$ are numbers and/or symbols corresponding to rows of the table; $c_1$, $c_2$, \dots, $c_n$ are numbers and/or symbols corresponding to columns of the table, $a_{11}$, $a_{12}$, \dots, $a_{mn}$ are table elements. Each element can be a number or symbol or the single decimal point ({\tt.}). (In this data record the delimiter {\tt:} preceding the column list and the delimiter {\tt:=} following the column list cannot be omitted.) Each element $a_{ij}$ of the tabular data block ($1\leq i\leq m$, $1\leq j\leq n$) defines two subscripts, where the first subscript is $r_i$, and the second one is $c_j$. These subscripts are used in conjunction with the current slice to form the complete subscript list that identifies a particular member of the parameter array. If $a_{ij}$ is a number or symbol, this value is assigned to the parameter member. However, if $a_{ij}$ is the single decimal point, the member is assigned a default value specified either in the parameter data block or in the parameter statement, or, if no default value is specified, the member remains undefined. Since the tabular data record provides two subscripts for each value, either the parameter or the slice currently used should be 2-dimensional. \subsection{Transposed tabular data record} The {\it transposed tabular data record} has the following syntactic form: $$\begin{array}{cccccc} \mbox{{\tt(tr) :}}&c_1&c_2&\dots&c_n&\mbox{{\tt:=}}\\ r_1&a_{11}&a_{12}&\dots&a_{1n}&\\ r_2&a_{21}&a_{22}&\dots&a_{2n}&\\ \multicolumn{5}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}&\\ r_m&a_{m1}&a_{m2}&\dots&a_{mn}&\\ \end{array}$$ (In this case the delimiter {\tt:} following the keyword {\tt(tr)} is optional and may be omitted.) This data record is completely analogous to the tabular data record (see above) with only exception that the first subscript defined by element $a_{ij}$ is $c_j$ while the second one is $r_i$. Being once specified the {\tt(tr)} indicator affects all subsequent data records until either a slice or the end of data block is encountered. \newpage \subsection{Tabbing data format} The parameter data block in the {\it tabbing format} has the following syntactic form: $$ \begin{array}{*{8}{l}} \multicolumn{4}{l} {{\tt param}\ {\tt default}\ value\ {\tt :}\ s\ {\tt :}}& p_1\ \ \verb|,|&p_2\ \ \verb|,|&\dots\ \verb|,|&p_r\ \ \verb|:=|\\ r_{11}\ \verb|,|& r_{12}\ \verb|,|& \dots\ \verb|,|& r_{1n}\ \verb|,|& a_{11}\ \verb|,|& a_{12}\ \verb|,|& \dots\ \verb|,|& a_{1r}\ \verb|,|\\ r_{21}\ \verb|,|& r_{22}\ \verb|,|& \dots\ \verb|,|& r_{2n}\ \verb|,|& a_{21}\ \verb|,|& a_{22}\ \verb|,|& \dots\ \verb|,|& a_{2r}\ \verb|,|\\ \dots & \dots & \dots & \dots & \dots & \dots & \dots & \dots \\ r_{m1}\ \verb|,|& r_{m2}\ \verb|,|& \dots\ \verb|,|& r_{mn}\ \verb|,|& a_{m1}\ \verb|,|& a_{m2}\ \verb|,|& \dots\ \verb|,|& a_{mr}\ \verb|;|\\ \end{array} $$ 1. The keyword {\tt default} may be omitted along with a value following it. 2. Symbolic name $s$ may be omitted along with the colon following it. 3. All commae are optional and may be omitted. The data block in the tabbing format shown above is exactly equivalent to the following data blocks: \verb|set| $s$\ \verb|:=|\ $ \verb|(|r_{11}\verb|,|r_{12}\verb|,|\dots\verb|,|r_{1n}\verb|) | \verb|(|r_{21}\verb|,|r_{22}\verb|,|\dots\verb|,|r_{2n}\verb|) | \dots \verb| (|r_{m1}\verb|,|r_{m2}\verb|,|\dots\verb|,|r_{mn}\verb|);|$ \verb|param| $p_1$\ \verb|default|\ $value$\ \verb|:=| $\verb| | \verb|[|r_{11}\verb|,|r_{12}\verb|,|\dots\verb|,|r_{1n}\verb|] |a_{11} \verb| [|r_{21}\verb|,|r_{22}\verb|,|\dots\verb|,|r_{2n}\verb|] |a_{21} \verb| |\dots \verb| [|r_{m1}\verb|,|r_{m2}\verb|,|\dots\verb|,|r_{mn}\verb|] |a_{m1} \verb|;| $ \verb|param| $p_2$\ \verb|default|\ $value$\ \verb|:=| $\verb| | \verb|[|r_{11}\verb|,|r_{12}\verb|,|\dots\verb|,|r_{1n}\verb|] |a_{12} \verb| [|r_{21}\verb|,|r_{22}\verb|,|\dots\verb|,|r_{2n}\verb|] |a_{22} \verb| |\dots \verb| [|r_{m1}\verb|,|r_{m2}\verb|,|\dots\verb|,|r_{mn}\verb|] |a_{m2} \verb|;| $ \verb| |.\ \ \ .\ \ \ .\ \ \ .\ \ \ .\ \ \ .\ \ \ .\ \ \ .\ \ \ . \verb|param| $p_r$\ \verb|default|\ $value$\ \verb|:=| $\verb| | \verb|[|r_{11}\verb|,|r_{12}\verb|,|\dots\verb|,|r_{1n}\verb|] |a_{1r} \verb| [|r_{21}\verb|,|r_{22}\verb|,|\dots\verb|,|r_{2n}\verb|] |a_{2r} \verb| |\dots \verb| [|r_{m1}\verb|,|r_{m2}\verb|,|\dots\verb|,|r_{mn}\verb|] |a_{mr} \verb|;| $ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \appendix \chapter{Using suffixes} \vspace*{-12pt} Suffixes can be used to retrieve additional values associated with model variables, constraints, and objectives. A {\it suffix} consists of a period ({\tt.}) followed by a non-reserved keyword. For example, if {\tt x} is a two-dimensional variable, {\tt x[i,j].lb} is a numeric value equal to the lower bound of elemental variable {\tt x[i,j]}, which (value) can be used everywhere in expressions like a numeric parameter. For model variables suffixes have the following meaning: \begin{tabular}{@{}ll@{}} {\tt.lb}&lower bound\\ {\tt.ub}&upper bound\\ {\tt.status}&status in the solution:\\ &0 --- undefined\\ &1 --- basic\\ &2 --- non-basic on lower bound\\ &3 --- non-basic on upper bound\\ &4 --- non-basic free (unbounded) variable\\ &5 --- non-basic fixed variable\\ {\tt.val}&primal value in the solution\\ {\tt.dual}&dual value (reduced cost) in the solution\\ \end{tabular} For model constraints and objectives suffixes have the following meaning: \begin{tabular}{@{}ll@{}} {\tt.lb}&lower bound of the linear form\\ {\tt.ub}&upper bound of the linear form\\ {\tt.status}&status in the solution:\\ &0 --- undefined\\ &1 --- non-active\\ &2 --- active on lower bound\\ &3 --- active on upper bound\\ &4 --- active free (unbounded) row\\ &5 --- active equality constraint\\ {\tt.val}&primal value of the linear form in the solution\\ {\tt.dual}&dual value (reduced cost) of the linear form in the solution\\ \end{tabular} Note that suffixes {\tt.status}, {\tt.val}, and {\tt.dual} can be used only below the solve statement. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Date and time functions} \noindent\hfil \begin{tabular}{c} by Andrew Makhorin \verb||\\ and Heinrich Schuchardt \verb||\\ \end{tabular} \section{Obtaining current calendar time} \label{gmtime} To obtain the current calendar time in MathProg there exists the function {\tt gmtime}. It has no arguments and returns the number of seconds elapsed since 00:00:00 on January 1, 1970, Coordinated Universal Time (UTC). For example: \begin{verbatim} param utc := gmtime(); \end{verbatim} MathProg has no function to convert UTC time returned by the function {\tt gmtime} to {\it local} calendar times. Thus, if you need to determine the current local calendar time, you have to add to the UTC time returned the time offset from UTC expressed in seconds. For example, the time in Berlin during the winter is one hour ahead of UTC that corresponds to the time offset +1~hour~= +3600~secs, so the current winter calendar time in Berlin may be determined as follows: \begin{verbatim} param now := gmtime() + 3600; \end{verbatim} \noindent Similarly, the summer time in Chicago (Central Daylight Time) is five hours behind UTC, so the corresponding current local calendar time may be determined as follows: \begin{verbatim} param now := gmtime() - 5 * 3600; \end{verbatim} Note that the value returned by {\tt gmtime} is volatile, i.e. being called several times this function may return different values. \section{Converting character string to calendar time} \label{str2time} The function {\tt str2time(}{\it s}{\tt,} {\it f}{\tt)} converts a character string (timestamp) specified by its first argument {\it s}, which should be a symbolic expression, to the calendar time suitable for arithmetic calculations. The conversion is controlled by the specified format string {\it f} (the second argument), which also should be a symbolic expression. \newpage The result of conversion returned by {\tt str2time} has the same meaning as values returned by the function {\tt gmtime} (see Subsection \ref{gmtime}, page \pageref{gmtime}). Note that {\tt str2time} does {\tt not} correct the calendar time returned for the local timezone, i.e. being applied to 00:00:00 on January 1, 1970 it always returns 0. For example, the model statements: \begin{verbatim} param s, symbolic, := "07/14/98 13:47"; param t := str2time(s, "%m/%d/%y %H:%M"); display t; \end{verbatim} \noindent produce the following printout: \begin{verbatim} t = 900424020 \end{verbatim} \noindent where the calendar time printed corresponds to 13:47:00 on July 14, 1998. The format string passed to the function {\tt str2time} consists of conversion specifiers and ordinary characters. Each conversion specifier begins with a percent ({\tt\%}) character followed by a letter. The following conversion specifiers may be used in the format string: \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%b}&The abbreviated month name (case insensitive). At least three first letters of the month name should appear in the input string.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%d}&The day of the month as a decimal number (range 1 to 31). Leading zero is permitted, but not required.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%h}&The same as {\tt\%b}.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%H}&The hour as a decimal number, using a 24-hour clock (range 0 to 23). Leading zero is permitted, but not required.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%m}&The month as a decimal number (range 1 to 12). Leading zero is permitted, but not required.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%M}&The minute as a decimal number (range 0 to 59). Leading zero is permitted, but not required.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%S}&The second as a decimal number (range 0 to 60). Leading zero is permitted, but not required.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%y}&The year without a century as a decimal number (range 0 to 99). Leading zero is permitted, but not required. Input values in the range 0 to 68 are considered as the years 2000 to 2068 while the values 69 to 99 as the years 1969 to 1999.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%z}&The offset from GMT in ISO 8601 format.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%\%}&A literal {\tt\%} character.\\ \end{tabular} All other (ordinary) characters in the format string should have a matching character in the input string to be converted. Exceptions are spaces in the input string which can match zero or more space characters in the format string. \newpage If some date and/or time component(s) are missing in the format and, therefore, in the input string, the function {\tt str2time} uses their default values corresponding to 00:00:00 on January 1, 1970, that is, the default value of the year is 1970, the default value of the month is January, etc. The function {\tt str2time} is applicable to all calendar times in the range 00:00:00 on January 1, 0001 to 23:59:59 on December 31, 4000 of the Gregorian calendar. \section{Converting calendar time to character string} \label{time2str} The function {\tt time2str(}{\it t}{\tt,} {\it f}{\tt)} converts the calendar time specified by its first argument {\it t}, which should be a numeric expression, to a character string (symbolic value). The conversion is controlled by the specified format string {\it f} (the second argument), which should be a symbolic expression. The calendar time passed to {\tt time2str} has the same meaning as values returned by the function {\tt gmtime} (see Subsection \ref{gmtime}, page \pageref{gmtime}). Note that {\tt time2str} does {\it not} correct the specified calendar time for the local timezone, i.e. the calendar time 0 always corresponds to 00:00:00 on January 1, 1970. For example, the model statements: \begin{verbatim} param s, symbolic, := time2str(gmtime(), "%FT%TZ"); display s; \end{verbatim} \noindent may produce the following printout: \begin{verbatim} s = '2008-12-04T00:23:45Z' \end{verbatim} \noindent which is a timestamp in the ISO format. The format string passed to the function {\tt time2str} consists of conversion specifiers and ordinary characters. Each conversion specifier begins with a percent ({\tt\%}) character followed by a letter. The following conversion specifiers may be used in the format string: \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%a}&The abbreviated (2-character) weekday name.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%A}&The full weekday name.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%b}&The abbreviated (3-character) month name.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%B}&The full month name.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%C}&The century of the year, that is the greatest integer not greater than the year divided by~100.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%d}&The day of the month as a decimal number (range 01 to 31).\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%D}&The date using the format \verb|%m/%d/%y|.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%e}&The day of the month like with \verb|%d|, but padded with blank rather than zero.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%F}&The date using the format \verb|%Y-%m-%d|.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%g}&The year corresponding to the ISO week number, but without the century (range 00 to~99). This has the same format and value as \verb|%y|, except that if the ISO week number (see \verb|%V|) belongs to the previous or next year, that year is used instead.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%G}&The year corresponding to the ISO week number. This has the same format and value as \verb|%Y|, except that if the ISO week number (see \verb|%V|) belongs to the previous or next year, that year is used instead. \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%h}&The same as \verb|%b|.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%H}&The hour as a decimal number, using a 24-hour clock (range 00 to 23).\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%I}&The hour as a decimal number, using a 12-hour clock (range 01 to 12).\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%j}&The day of the year as a decimal number (range 001 to 366).\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%k}&The hour as a decimal number, using a 24-hour clock like \verb|%H|, but padded with blank rather than zero.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%l}&The hour as a decimal number, using a 12-hour clock like \verb|%I|, but padded with blank rather than zero. \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%m}&The month as a decimal number (range 01 to 12).\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%M}&The minute as a decimal number (range 00 to 59).\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%p}&Either {\tt AM} or {\tt PM}, according to the given time value. Midnight is treated as {\tt AM} and noon as {\tt PM}.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%P}&Either {\tt am} or {\tt pm}, according to the given time value. Midnight is treated as {\tt am} and noon as {\tt pm}.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%R}&The hour and minute in decimal numbers using the format \verb|%H:%M|.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%S}&The second as a decimal number (range 00 to 59).\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%T}&The time of day in decimal numbers using the format \verb|%H:%M:%S|.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%u}&The day of the week as a decimal number (range 1 to 7), Monday being 1.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%U}&The week number of the current year as a decimal number (range 00 to 53), starting with the first Sunday as the first day of the first week. Days preceding the first Sunday in the year are considered to be in week 00. \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%V}&The ISO week number as a decimal number (range 01 to 53). ISO weeks start with Monday and end with Sunday. Week 01 of a year is the first week which has the majority of its days in that year; this is equivalent to the week containing January 4. Week 01 of a year can contain days from the previous year. The week before week 01 of a year is the last week (52 or 53) of the previous year even if it contains days from the new year. In other word, if 1 January is Monday, Tuesday, Wednesday or Thursday, it is in week 01; if 1 January is Friday, Saturday or Sunday, it is in week 52 or 53 of the previous year.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%w}&The day of the week as a decimal number (range 0 to 6), Sunday being 0.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%W}&The week number of the current year as a decimal number (range 00 to 53), starting with the first Monday as the first day of the first week. Days preceding the first Monday in the year are considered to be in week 00.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%y}&The year without a century as a decimal number (range 00 to 99), that is the year modulo~100.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%Y}&The year as a decimal number, using the Gregorian calendar.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%\%}&A literal \verb|%| character.\\ \end{tabular} All other (ordinary) characters in the format string are simply copied to the resultant string. The first argument (calendar time) passed to the function {\tt time2str} should be in the range from $-62135596800$ to $+64092211199$ that corresponds to the period from 00:00:00 on January 1, 0001 to 23:59:59 on December 31, 4000 of the Gregorian calendar. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Table drivers} \label{drivers} \noindent\hfil \begin{tabular}{c} by Andrew Makhorin \verb||\\ and Heinrich Schuchardt \verb||\\ \end{tabular} \bigskip\bigskip The {\it table driver} is a program module which provides transmitting data between MathProg model objects and data tables. Currently the GLPK package has four table drivers: \vspace*{-8pt} \begin{itemize} \item built-in CSV table driver; \item built-in xBASE table driver; \item ODBC table driver; \item MySQL table driver. \end{itemize} \vspace*{-8pt} \section{CSV table driver} The CSV table driver assumes that the data table is represented in the form of a plain text file in the CSV (comma-separated values) file format as described below. To choose the CSV table driver its name in the table statement should be specified as \verb|"CSV"|, and the only argument should specify the name of a plain text file containing the table. For example: \begin{verbatim} table data IN "CSV" "data.csv": ... ; \end{verbatim} The filename suffix may be arbitrary, however, it is recommended to use the suffix `\verb|.csv|'. On reading input tables the CSV table driver provides an implicit field named \verb|RECNO|, which contains the current record number. This field can be specified in the input table statement as if there were the actual field named \verb|RECNO| in the CSV file. For example: \begin{verbatim} table list IN "CSV" "list.csv": num <- [RECNO], ... ; \end{verbatim} \newpage \subsection*{CSV format\footnote{This material is based on the RFC document 4180.}} The CSV (comma-separated values) format is a plain text file format defined as follows. 1. Each record is located on a separate line, delimited by a line break. For example: \begin{verbatim} aaa,bbb,ccc\n xxx,yyy,zzz\n \end{verbatim} \noindent where \verb|\n| means the control character \verb|LF| ({\tt 0x0A}). 2. The last record in the file may or may not have an ending line break. For example: \begin{verbatim} aaa,bbb,ccc\n xxx,yyy,zzz \end{verbatim} 3. There should be a header line appearing as the first line of the file in the same format as normal record lines. This header should contain names corresponding to the fields in the file. The number of field names in the header line should be the same as the number of fields in the records of the file. For example: \begin{verbatim} name1,name2,name3\n aaa,bbb,ccc\n xxx,yyy,zzz\n \end{verbatim} 4. Within the header and each record there may be one or more fields separated by commas. Each line should contain the same number of fields throughout the file. Spaces are considered as part of a field and therefore not ignored. The last field in the record should not be followed by a comma. For example: \begin{verbatim} aaa,bbb,ccc\n \end{verbatim} 5. Fields may or may not be enclosed in double quotes. For example: \begin{verbatim} "aaa","bbb","ccc"\n zzz,yyy,xxx\n \end{verbatim} 6. If a field is enclosed in double quotes, each double quote which is part of the field should be coded twice. For example: \begin{verbatim} "aaa","b""bb","ccc"\n \end{verbatim} \para{Example} \begin{verbatim} FROM,TO,DISTANCE,COST Seattle,New-York,2.5,0.12 Seattle,Chicago,1.7,0.08 Seattle,Topeka,1.8,0.09 San-Diego,New-York,2.5,0.15 San-Diego,Chicago,1.8,0.10 San-Diego,Topeka,1.4,0.07 \end{verbatim} \newpage \section{xBASE table driver} The xBASE table driver assumes that the data table is stored in the .dbf file format. To choose the xBASE table driver its name in the table statement should be specified as \verb|"xBASE"|, and the first argument should specify the name of a .dbf file containing the table. For the output table there should be the second argument defining the table format in the form \verb|"FF...F"|, where \verb|F| is either {\tt C({\it n})}, which specifies a character field of length $n$, or {\tt N({\it n}{\rm [},{\it p}{\rm ]})}, which specifies a numeric field of length $n$ and precision $p$ (by default $p$ is 0). The following is a simple example which illustrates creating and reading a .dbf file: \begin{verbatim} table tab1{i in 1..10} OUT "xBASE" "foo.dbf" "N(5)N(10,4)C(1)C(10)": 2*i+1 ~ B, Uniform(-20,+20) ~ A, "?" ~ FOO, "[" & i & "]" ~ C; set S, dimen 4; table tab2 IN "xBASE" "foo.dbf": S <- [B, C, RECNO, A]; display S; end; \end{verbatim} \section{ODBC table driver} The ODBC table driver allows connecting to SQL databases using an implementation of the ODBC interface based on the Call Level Interface (CLI).\footnote{The corresponding software standard is defined in ISO/IEC 9075-3:2003.} \para{Debian GNU/Linux.} Under Debian GNU/Linux the ODBC table driver uses the iODBC package,\footnote{See {\tt}.} which should be installed before building the GLPK package. The installation can be effected with the following command: \begin{verbatim} sudo apt-get install libiodbc2-dev \end{verbatim} Note that on configuring the GLPK package to enable using the iODBC library the option `\verb|--enable-odbc|' should be passed to the configure script. The individual databases should be entered for systemwide usage in \verb|/etc/odbc.ini| and\linebreak \verb|/etc/odbcinst.ini|. Database connections to be used by a single user are specified by files in the home directory (\verb|.odbc.ini| and \verb|.odbcinst.ini|). \para{Microsoft Windows.} Under Microsoft Windows the ODBC table driver uses the Microsoft ODBC library. To enable this feature the symbol: \begin{verbatim} #define ODBC_DLNAME "odbc32.dll" \end{verbatim} \noindent should be defined in the GLPK configuration file `\verb|config.h|'. Data sources can be created via the Administrative Tools from the Control Panel. To choose the ODBC table driver its name in the table statement should be specified as \verb|'ODBC'| or \verb|'iODBC'|. \newpage The argument list is specified as follows. The first argument is the connection string passed to the ODBC library, for example: \verb|'DSN=glpk;UID=user;PWD=password'|, or \verb|'DRIVER=MySQL;DATABASE=glpkdb;UID=user;PWD=password'|. Different parts of the string are separated by semicolons. Each part consists of a pair {\it fieldname} and {\it value} separated by the equal sign. Allowable fieldnames depend on the ODBC library. Typically the following fieldnames are allowed: \verb|DATABASE | database; \verb|DRIVER | ODBC driver; \verb|DSN | name of a data source; \verb|FILEDSN | name of a file data source; \verb|PWD | user password; \verb|SERVER | database; \verb|UID | user name. The second argument and all following are considered to be SQL statements SQL statements may be spread over multiple arguments. If the last character of an argument is a semicolon this indicates the end of a SQL statement. The arguments of a SQL statement are concatenated separated by space. The eventual trailing semicolon will be removed. All but the last SQL statement will be executed directly. For IN-table the last SQL statement can be a SELECT command starting with the capitalized letters \verb|'SELECT '|. If the string does not start with \verb|'SELECT '| it is considered to be a table name and a SELECT statement is automatically generated. For OUT-table the last SQL statement can contain one or multiple question marks. If it contains a question mark it is considered a template for the write routine. Otherwise the string is considered a table name and an INSERT template is automatically generated. The writing routine uses the template with the question marks and replaces the first question mark by the first output parameter, the second question mark by the second output parameter and so forth. Then the SQL command is issued. The following is an example of the output table statement: \begin{verbatim} table ta { l in LOCATIONS } OUT 'ODBC' 'DSN=glpkdb;UID=glpkuser;PWD=glpkpassword' 'DROP TABLE IF EXISTS result;' 'CREATE TABLE result ( ID INT, LOC VARCHAR(255), QUAN DOUBLE );' 'INSERT INTO result 'VALUES ( 4, ?, ? )' : l ~ LOC, quantity[l] ~ QUAN; \end{verbatim} \newpage \noindent Alternatively it could be written as follows: \begin{verbatim} table ta { l in LOCATIONS } OUT 'ODBC' 'DSN=glpkdb;UID=glpkuser;PWD=glpkpassword' 'DROP TABLE IF EXISTS result;' 'CREATE TABLE result ( ID INT, LOC VARCHAR(255), QUAN DOUBLE );' 'result' : l ~ LOC, quantity[l] ~ QUAN, 4 ~ ID; \end{verbatim} Using templates with `\verb|?|' supports not only INSERT, but also UPDATE, DELETE, etc. For example: \begin{verbatim} table ta { l in LOCATIONS } OUT 'ODBC' 'DSN=glpkdb;UID=glpkuser;PWD=glpkpassword' 'UPDATE result SET DATE = ' & date & ' WHERE ID = 4;' 'UPDATE result SET QUAN = ? WHERE LOC = ? AND ID = 4' : quantity[l], l; \end{verbatim} \section{MySQL table driver} The MySQL table driver allows connecting to MySQL databases. \para{Debian GNU/Linux.} Under Debian GNU/Linux the MySQL table driver uses the MySQL package,\footnote{For download development files see {\tt}.} which should be installed before building the GLPK package. The installation can be effected with the following command: \begin{verbatim} sudo apt-get install libmysqlclient15-dev \end{verbatim} Note that on configuring the GLPK package to enable using the MySQL library the option `\verb|--enable-mysql|' should be passed to the configure script. \para{Microsoft Windows.} Under Microsoft Windows the MySQL table driver also uses the MySQL library. To enable this feature the symbol: \begin{verbatim} #define MYSQL_DLNAME "libmysql.dll" \end{verbatim} \noindent should be defined in the GLPK configuration file `\verb|config.h|'. To choose the MySQL table driver its name in the table statement should be specified as \verb|'MySQL'|. The argument list is specified as follows. The first argument specifies how to connect the data base in the DSN style, for example: \verb|'Database=glpk;UID=glpk;PWD=gnu'|. Different parts of the string are separated by semicolons. Each part consists of a pair {\it fieldname} and {\it value} separated by the equal sign. The following fieldnames are allowed: \newpage \verb|Server | server running the database (defaulting to localhost); \verb|Database | name of the database; \verb|UID | user name; \verb|PWD | user password; \verb|Port | port used by the server (defaulting to 3306). The second argument and all following are considered to be SQL statements. SQL statements may be spread over multiple arguments. If the last character of an argument is a semicolon this indicates the end of a SQL statement. The arguments of a SQL statement are concatenated separated by space. The eventual trailing semicolon will be removed. All but the last SQL statement will be executed directly. For IN-table the last SQL statement can be a SELECT command starting with the capitalized letters \verb|'SELECT '|. If the string does not start with \verb|'SELECT '| it is considered to be a table name and a SELECT statement is automatically generated. For OUT-table the last SQL statement can contain one or multiple question marks. If it contains a question mark it is considered a template for the write routine. Otherwise the string is considered a table name and an INSERT template is automatically generated. The writing routine uses the template with the question marks and replaces the first question mark by the first output parameter, the second question mark by the second output parameter and so forth. Then the SQL command is issued. The following is an example of the output table statement: \begin{verbatim} table ta { l in LOCATIONS } OUT 'MySQL' 'Database=glpkdb;UID=glpkuser;PWD=glpkpassword' 'DROP TABLE IF EXISTS result;' 'CREATE TABLE result ( ID INT, LOC VARCHAR(255), QUAN DOUBLE );' 'INSERT INTO result VALUES ( 4, ?, ? )' : l ~ LOC, quantity[l] ~ QUAN; \end{verbatim} \noindent Alternatively it could be written as follows: \begin{verbatim} table ta { l in LOCATIONS } OUT 'MySQL' 'Database=glpkdb;UID=glpkuser;PWD=glpkpassword' 'DROP TABLE IF EXISTS result;' 'CREATE TABLE result ( ID INT, LOC VARCHAR(255), QUAN DOUBLE );' 'result' : l ~ LOC, quantity[l] ~ QUAN, 4 ~ ID; \end{verbatim} \newpage Using templates with `\verb|?|' supports not only INSERT, but also UPDATE, DELETE, etc. For example: \begin{verbatim} table ta { l in LOCATIONS } OUT 'MySQL' 'Database=glpkdb;UID=glpkuser;PWD=glpkpassword' 'UPDATE result SET DATE = ' & date & ' WHERE ID = 4;' 'UPDATE result SET QUAN = ? WHERE LOC = ? AND ID = 4' : quantity[l], l; \end{verbatim} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Solving models with glpsol} The GLPK package\footnote{{\tt http://www.gnu.org/software/glpk/}} includes the program {\tt glpsol}, a stand-alone LP/MIP solver. This program can be launched from the command line or from the shell to solve models written in the GNU MathProg modeling language. To tell the solver that the input file contains a model description you need to specify the option \verb|--model| in the command line. For example: \begin{verbatim} glpsol --model foo.mod \end{verbatim} Sometimes it is necessary to use the data section placed in a separate file, in which case you may use the following command: \begin{verbatim} glpsol --model foo.mod --data foo.dat \end{verbatim} \noindent Note that if the model file also contains the data section, that section is ignored. It is also allowed to specify more than one file containing the data section, for example: \begin{verbatim} glpsol --model foo.mod --data foo1.dat --data foo2.dat \end{verbatim} If the model description contains some display and/or printf statements, by default the output is sent to the terminal. If you need to redirect the output to a file, you may use the following command: \begin{verbatim} glpsol --model foo.mod --display foo.out \end{verbatim} If you need to look at the problem, which has been generated by the model translator, you may use the option \verb|--wlp| as follows: \begin{verbatim} glpsol --model foo.mod --wlp foo.lp \end{verbatim} \noindent In this case the problem data is written to file \verb|foo.lp| in CPLEX LP format suitable for visual analysis. Sometimes it is needed merely to check the model description not solving the generated problem instance. In this case you may specify the option \verb|--check|, for example: \begin{verbatim} glpsol --check --model foo.mod --wlp foo.lp \end{verbatim} \newpage If you need to write a numeric solution obtained by the solver to a file, you may use the following command: \begin{verbatim} glpsol --model foo.mod --output foo.sol \end{verbatim} \noindent in which case the solution is written to file \verb|foo.sol| in a plain text format suitable for visual analysis. The complete list of the \verb|glpsol| options can be found in the GLPK reference manual included in the GLPK distribution. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Example model description} \section{Model description written in MathProg} Below here is a complete example of the model description written in the GNU MathProg modeling language. \bigskip \begin{verbatim} # A TRANSPORTATION PROBLEM # # This problem finds a least cost shipping schedule that meets # requirements at markets and supplies at factories. # # References: # Dantzig G B, "Linear Programming and Extensions." # Princeton University Press, Princeton, New Jersey, 1963, # Chapter 3-3. set I; /* canning plants */ set J; /* markets */ param a{i in I}; /* capacity of plant i in cases */ param b{j in J}; /* demand at market j in cases */ param d{i in I, j in J}; /* distance in thousands of miles */ param f; /* freight in dollars per case per thousand miles */ param c{i in I, j in J} := f * d[i,j] / 1000; /* transport cost in thousands of dollars per case */ var x{i in I, j in J} >= 0; /* shipment quantities in cases */ minimize cost: sum{i in I, j in J} c[i,j] * x[i,j]; /* total transportation costs in thousands of dollars */ s.t. supply{i in I}: sum{j in J} x[i,j] <= a[i]; /* observe supply limit at plant i */ s.t. demand{j in J}: sum{i in I} x[i,j] >= b[j]; /* satisfy demand at market j */ data; set I := Seattle San-Diego; set J := New-York Chicago Topeka; param a := Seattle 350 San-Diego 600; param b := New-York 325 Chicago 300 Topeka 275; param d : New-York Chicago Topeka := Seattle 2.5 1.7 1.8 San-Diego 2.5 1.8 1.4 ; param f := 90; end; \end{verbatim} \newpage \section{Generated LP problem instance} Below here is the result of the translation of the example model produced by the solver \verb|glpsol| and written in CPLEX LP format with the option \verb|--wlp|. \medskip \begin{verbatim} \* Problem: transp *\ Minimize cost: + 0.225 x(Seattle,New~York) + 0.153 x(Seattle,Chicago) + 0.162 x(Seattle,Topeka) + 0.225 x(San~Diego,New~York) + 0.162 x(San~Diego,Chicago) + 0.126 x(San~Diego,Topeka) Subject To supply(Seattle): + x(Seattle,New~York) + x(Seattle,Chicago) + x(Seattle,Topeka) <= 350 supply(San~Diego): + x(San~Diego,New~York) + x(San~Diego,Chicago) + x(San~Diego,Topeka) <= 600 demand(New~York): + x(Seattle,New~York) + x(San~Diego,New~York) >= 325 demand(Chicago): + x(Seattle,Chicago) + x(San~Diego,Chicago) >= 300 demand(Topeka): + x(Seattle,Topeka) + x(San~Diego,Topeka) >= 275 End \end{verbatim} \section{Optimal LP solution} Below here is the optimal solution of the generated LP problem instance found by the solver \verb|glpsol| and written in plain text format with the option \verb|--output|. \medskip \begin{footnotesize} \begin{verbatim} Problem: transp Rows: 6 Columns: 6 Non-zeros: 18 Status: OPTIMAL Objective: cost = 153.675 (MINimum) No. Row name St Activity Lower bound Upper bound Marginal ------ ------------ -- ------------- ------------- ------------- ------------- 1 cost B 153.675 2 supply[Seattle] NU 350 350 < eps 3 supply[San-Diego] B 550 600 4 demand[New-York] NL 325 325 0.225 5 demand[Chicago] NL 300 300 0.153 6 demand[Topeka] NL 275 275 0.126 No. Column name St Activity Lower bound Upper bound Marginal ------ ------------ -- ------------- ------------- ------------- ------------- 1 x[Seattle,New-York] B 50 0 2 x[Seattle,Chicago] B 300 0 3 x[Seattle,Topeka] NL 0 0 0.036 4 x[San-Diego,New-York] B 275 0 5 x[San-Diego,Chicago] NL 0 0 0.009 6 x[San-Diego,Topeka] B 275 0 End of output \end{verbatim} \end{footnotesize} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newpage \section*{Acknowledgements} \addcontentsline{toc}{chapter}{Acknowledgements} The authors would like to thank the following people, who kindly read, commented, and corrected the draft of this document: \noindent Juan Carlos Borras \verb|| \noindent Harley Mackenzie \verb|| \noindent Robbie Morrison \verb|| \end{document} glpk-5.0/doc/gmpl_es.pdf0000666000062000006210000071174713766346220014415 0ustar maomkpasswd%PDF-1.5 %äðíø 7 0 obj <> stream xÚ=OOÃ0 Åï| S‰šÄù·™€I0بÊ.+‡Ò¦cZ(Û÷Çi&”HŽŸõ~ñƒP ù(ðÄWBó‹®îDç4”r¥çHs(ÛX…~ª?B–kçD;U/®ŠÛϺÒhùôržÕÇ÷Í8ì³×òžéÊ#)éJÎPZÈí Mø"ta }s¨#PGbzüÿ)9¡ölóhÜdû®3²bœL$–«ÍCrm£ÆßC¥î“fÐúó.”A‡4h8«u(SÔJ,ÖEq}³..ÙINp2ò¢9žÞ2îÆ˜ñiEH*[eú¶„ç‹?7QVá endstream endobj 13 0 obj <> stream xÚ­VßoÜ6 ~ß_áGȹ–%Ù¾½¥]¯èÖYs0,{Plå¢Õg_e9éí¯)É?’K ÀERÔÇâEß"¥ðG£"ƒÿ4ªöÑÛmôfÃ#š&ëtmï`{ÅK2më?Èû&^1ÆÈA~”U~ñáÓå/^R=~9l›q³VÁåÒtq–“cœ•DU¶CmF>|¾ö.µî­Ñ·ƒ®;o+ã˜þ–ôß&èN×2x)@˜?·?c¶´LsɾëqV£Ñ»{<Õ:Á“<æm*§{³‹+¯X’²h5šÜ¤T«%0”'k¢I–¦édR(R'–(f³Èf>kÅ,æ³A1kËY\O4´t>ÎGP8S^åy"r…%B„Tá6«l½&çmmÔ#x¤)¹_ï;£[ æä'…Ü«ñ³Þü®3Þöüph´ª½öc ú½´ºêoA.º¾êÐï1SJɃ›®z«í`Õ‰ËÙTÅ)á/¸1ô½–I¼âœ‘m\fXêºë;F¡VFUèq?jŒê•yˆ… Ì“SšlR „ä@)€a§[Ùø@_At»kzýñ*ç9¤ìØ ì†oòI¶»Aî”wtÄFáBÚ{à~0ZyåÒV/êÒn«àêv1°±Nù-.¡ÓLïàÄâ‰H_¸šYU¥oXÎZÈ\œ\":ò¯ËÖ%ùÍäa0ŠÁ)'„WVCce&…o20}§!G-W¬ëÎHV%´µSn0Z[Ù¨>D¼nõŠ9×>hI>Ë .€0ã Ž8¹ç§Ðñ—´˜ʧ:NÎÍ.Ê–ü‡g -þŸg€ÍÏ€oAZ†E’x=e}6AÏhϦô– JœØe ±XyÚ`׌Bè€w¾„¨©ƒ³gJK6à7£AßY%]ën/½¼à .W|23WN€Ã÷÷¶Q•®Ç®Ò”ã¯_$ßÕ Vg/°Úcô~{úã:c4ÉàÎyéÈhùëÿ ö endstream endobj 50 0 obj <> stream xÚíšM£6Çïýá×ï/×Ng«®ªî¶ÊmÓìŠU€Y†TU?}m°1L““NÛÉÍH$€‰õû?o~Lô%BÔ(XÿÃ(«¢ï¶Ñ·ox„)RDÛúòFAÀy´Í?Ä7MÝu™7ÉoÛ·úN!TöNNAý(Ù(Lãë„À¸k›d£ù!ËÊá¤î‡ßníÏÿúƒýÐ~&0},åm£@‰þáÜ7#í :„8 \á0Í|\qµÚúÀÝ# çN¡^øz[g–û›DâøPgc¢ÆãJ¶->m¡/éÕ¬ôÚ©O"LCÀ½µsKýQqDã>/ç¦(âdìsî!âÁ܉^•zk§¸gÉÄúÄPq)¯—³G¶€3@xû–§8ß§­]9šb³êòµÕÿg@÷ü†Îu­â[Yèï†}H𱵝ê]e™÷YT¢¯k‹î æßæ‚é A,4ó·švûå ³¿mR[šQ–1É^~kø ê Þ¥Rê,Ÿê,ôÛW¼ß¾ânûÊÐ§Š­;"Ï ã#ê "÷¦‡fì/¬Õd(õ @¤‚©#æ^ö0ÔñSÿ˜S˜À二²xš $ÀÊm \Ë`ÍÁÔ=@ü£Ømªÿ2Ìã<àBÍÐ4˜½ÿbÅ0ú¸Ö¿üý¥3è{ è3·ôésôõ’êóa¨õC™­mË'ôðhqpsŸqrzŒÉ÷Æ‚çq×Ì’¯B¾ï/©XÙì=FÜFcR‡ýÑÆ|„ý¼]¬ »zÞÝÞŠémœæ=-ˆZküzO1=×gˆ7uzýb8o4è3Èlð^<ëJ~1€<&ȼL³ánÛÐøå›¿3MË endstream endobj 96 0 obj <> stream xÚí›MoÛF†ïý<’n÷ûãØ´n @ÑÄÈ¥î¡h—©$Ú”´ýõåÇî*•œ‘EØeÚ´éçÝ™}g8J’`ø ‰¢ð‰“r•¼ºN¾ÿ™'#ƒMr}›p‚¸Hr{B&׋?R†8YNçéÕ?÷mµ©›uµÉrÆxº¨ì‘¥õzQÿW”õ “låÒðe¹ÀøÜ^¿N®®lo~^´wÀ …àU@Ž ¹½òn’6ÄÄÑ–S´ëmÕ‹¾’ ¿À_ˆº'Oi„ýWSÔËw 'Š¥=%µ¾XÊžX¡x†ñÜ•FÊa'r` ÀÛ‡¬jQìošËb¡qÊ”cDhvyȾâD"&“ÜPDŀܚLé§©8[Wr×g”—ºc~M]8L¢ËW9é0ëuÕo£ÏÎòE<\Ý+ÃÉ1 ¤³–ï2MÓ¢­‹÷Ë^š®›¼ïKvû®Pg‘Iž£WŒÇN8¢Ž:¦ ç˜ÍËþže<ªòË~6š'`’øÖ~ jïDÿÜÐýFÆbËF 2ýÞÃ;Ïj눷C.ëî¤WySm³\Krî®ôy^é©!ƒ2qPŠN+[Q±ªÀme¹âfÖ$Z‡—‰hI8\;j¦5ù˜ 1–#]-N_V›é9äñ¨™ŠÖGBE9Èç哼ٶEÝòã&^ǘéh]l6c܈iaš÷à-Tú¡*·õnjʢG0zîžîù5ò¼Yt‡‘i5<÷æ®ÃxÈ4Ëö\õU÷›³t§ 29æ8V'ŽÉø¼Ÿ›ÊröÄ_tú·½E~á¾í©b…àI´ZD2ƒZzZ­E½¹_öì¿p‡šÎ"(RÀ;^$ %ôPœusjS^»<Ã-d(¢gž&U@FKÅ Òc<ÙÙ6qXªÛ "mÈ,Α* ]Àv}Š1ª™”jÛ—Iòâ OV)Îc;\jd\@Û²ã¢WP!íÊí®ý¤hÅêžê`=Ã߃pŒ‡¯)>DlŸÇÂÿµ:@~Ql7-½¦wë ŠŠýaê!Ôìs¸,7„ž΀LôŒ?7Ò^ìp²q-—mý(P õYš›bY[ZŸó* ‰˜¶µ xV}ßú§›¶$—}ûÕÀ‘Ú¯›ÙÁßàѽÁø0³!\#ûǦ{6±¨o0ã¥X(ãÒu¸ËÃßwAÖÿŸŠéKH_'në®ÆáZÔ¯–½»jì^þr¸àÝôe»µ4ñ|yôxždêMÜXÒ›ún„OƒmuWÃfHqVX£{D'÷£'c„‚Ê“;òãhÒ‡wØ’ûJ²‹‘¦uŠPAgO{H‰€j¼Z#jœì ›zuoëŽK| y‚Òè)‰É8buàuXÛ¶†b¬„áêºû'¼ 0àøyø”AòRp×üÁpÅïßý':á endstream endobj 123 0 obj <> stream xÚí™MsÛ6†ïý{-\¿¬…OvªPÔ&;EØ'ûE™nr¤·TÐÜëàáÛn~V>ZáéàÙXð#ÑMDŽºŒÉ}Â×S£° „“³õ˜ÿr  ŽBp„û@ ±Ët‡*fOû¿a”A*$; ØQ *}·Ï´u*àgüÿŒ¿G9š~Lá~þyüŸÔ;?=Èb£)ãˆ#ÕQžò‹™"`íPP֠ɱ§aß¹ÿ9ÛÐ)f‡ME-ƒ"¸žFˆ4þsE ·¥C«|©XXîo#ÊÞÞχ#ÂáŠý×s9*Îl:܀ģ0Hîó$-rãV^tˆðIf‡÷ºyû±y¹/¬>%ÔþÎ<[œc¡i dáêA…Yøê®2ù t$ÛOj¶¾> stream xÚåYKsä¶¾çWð”âTvâE®òÁNÖ[¶¥”ì•+‡Èhs‹Y>œ]ÿút£AGY»öÚ.;%•@èw °•¼Nx’ÁOŒ€ß,Ù5ɧ·Éß?ã‰ÈXžËäö;XÞ–8In÷ÿIÿawRëqª»ÍVæyÊ7ßÞ~y"3… &¥§ø¼{Ü›¥ûi·«îd.Û@S$’aõ< “ŽÝ¬¹5ØrrëàhŸkw•0Tú–†ûš”=9¿@‘ò£»ð û©Úw˜¼Ñõ´Œ–á8 “í«Ž&–H˜±ê‰jæ\Ï|]íš ÚÌy?3{à&\½Ù¦ƒm”+!= ù³ŒÞ‰R{´|7y¹9È¥´š]V0Mó½œò6ŒÇžü´sCGoPÿ0„qïÚ®©Zƒs.YÎ$Çkÿ8ž×€uJª’‰@òl³ÕY¶V@ÔØs¹`[D²,XY^H1vªÈB“Xg”ת@m3̨µßmkëêGT!+Ó:Œ'¬˜Vü‚ÏþŒ°bf¬ÀÊÛscê9ÚìõÔ†U‡i¸§>Ì«×=m(|Šyy˜¼à5!›YSÀàá8¹}4“Ð'\BÛ½¥ÇÑ®&BùS\¥׺ÞÎmØ^N,‚Œ¦^®d%ÆíRþlU.Ñ\—¥ äÝuMw©v(ɦL»ûµ¢É¾êÝn´3¾°üš‚4Åå¡«§E ¾ðÛ&©y"i»®ž4ÇYãö•%ü,|—}!3½?•™ç¾ïê@óËÌp–å!}—€e(þŠIX%fÒh–ÑaÉßl9‡’ñ«‰Ñ+ýqæ Œµ]VÏ#àýùQi>*J¾Ô ,3§êí‹NM%g%ZRÐqô¢iõh\$Ñþù.½¹ºÛÐæ¹Ö¹7ÇÞ £Ï Z®“ûÈk¬s–ᨘæt²VmÕ^û™k7±oè=È S9_ÙZ¼êx>žÍó&±ÞÄtBôqŒ çLÏ•l7oËq w#¹Àrµ:«°€=2Y¶¼¹d’3¡bLÖzÆõ‰ÉߢªÂgUŇPU<¢jþª~é·Ïeˆp„¬ë³÷4]=fzc¡Y3]=fzϦ,ÿ QÊ¢î9î^6ÝÅó®dy¹ø8ÂF²l¾ióAç'g·Ñ5‡é•úì\ zèñ€«à» kýu @½\£cþ.¹Æb D‰ô†z. °b/@FA²Ù¢kÛ‚,êˆÿè1éË]åZßÀu1cÌ©úÉœ¤|Ë2»Û<£éñˆ ©d ñkÕysë¬&9Öœm® Ï0Ÿw~õ—ÿÄ…q endstream endobj 141 0 obj <> stream xÚíZKÛ6¾÷Wø(£1+>%¥É¡-¶‡"EÓbÓK݃VV¶ di+ÉAÒ_ß!‡´^´l/²iA0%Ž8ofÈfõ÷Š®BøGWƒ¿p•íWßß®¾ùQ¬hH’0YݾÕSý¤V·»?‚ë çg~ŽO^þõ˜\ô‘aT’Q¼µu"Ä&áÊcÂýÖÇZ%$t`þã]¬‡Óy‹‹–:åÇ"x{¨²bË·Ìê»õ†ÅÁ»¼+Þ¯YÔ^††µKfskƒ)ÙyDù刞çñĈfsD'\hV#çÛ‹¬È+mèÎ!c6\DÈä9®‰Å0Ó0“b9ÌÔ ÌbN’xќà =ÚÄD ´1ò÷¼ÄßnË%möEUë甬Ú.µºéW R$¾Ð(¨?hÒ¶L­&0A!͘ $ˆÑGáÙ«ïYåa¢EE…ӹ’DÑÐG©Wã$:㤊$ÉåL˜Ÿ‰{©âWxéFN:H:wÖ‰ {Ÿ·Òht°@w’w…Iüâù0ƒ&o»¦È²¢®N¤+IÍöjn´ˆˆO“=YÊc”K&AqHKG‘âÏ`±¾Æ45ÝhË—É×6ð"ÉDpSéchWWYÞ¢G…CEÀtZë.[î‹®ØÕèÒ ZtÄÞu…Í>;7™Bj‚ÖÌŒÐzî)Ï%îÇÌ”X¡‡¡·nfP»ˆL> ·¾ð–Ñ&³ ù×Þ‹p¡åË2ìOJ¿¯¡*°ê!㲸k¬îÛÀœ»AŒTóK5ûx·Oµ:Xtð’®m G™/눼úë>DòTúgÃD‚Ú;ç÷°‚L!5Ôý:ç+•»¦¥3Ò0&‘¼FÃÑùâ3bìëiÅÑ“j¿«a¸ÏûR·ªÑ½¯S|ä’ ¹åøò”È|¢µðkýòÓ«¬wwé‚÷2qlì]æ½– ^é†)ï%ŒÚèõ %8äCGs¾ |ç[E÷ÛþRãta‘˜„ƒ®ƒ7É M~"É$ I†1»ƒö‘ºÙ»‘¢ÊÓүζ4ä„RÎ+x”’ÐH_ »²ßÜæîZDƒ#À—ÒÁ”0-(€RÊǵ>D4HYÛô¹‡rÝ•:‹\=b+Y@–^-ý/°•'¡½$í¿ñÀÇißÚ} |yu 61í©ãñ j¡6ßÉÙâN~¨q¤Ôt3žÀÄÿß0‰“0½|RŒtÀìÒ«5‰%.¤n9ÍŠÍõFðØ|*x<4ÌÔ¾~84u‹3Žâõ«g8ø9íþzÝÔ÷øÔ¥{½ê]¡o *ûu_ýù–O†\ï›tt+ì<¬Ñûw¨úý;Œ‚}ñÁœ¡a¸ ^ßü¼]?Ã',Úc[t H!8HËûC•Ú·5þtØ ß¹×¶%ÏzFÀ¾µëü•ZXˆV÷PéZøcûÑ@v^8ÛdwWTšmÜÜâò áŠ‚ ¥Ý>‰i­™”°5ìYP™ÿrK0}ubttc¤ÄéDèæXYûŸhi–³æM…—4=ĺ5€—A±YLI/f&Z{§³ËÛ¬)ð'Ç©}¾+†÷DæêèÝÁöM°Ó!‚‡´Ñ¾¸Ï»¦vÝ‘Å-Ý´1 >ΜUß›Àí³I÷A·!rבªê=˜ß5¹â‘‰„¾¸íÚÎÆFi{Gf‘á)Ǫ¿Sµ= ¦Ó •ù¦ÄÆË¡=€âµëø[5µÑgwÈr|ß_”Õ®”6]‘ÊôØBÙ`0†Ì°H«]=i µÎA«¬H§K”yiÅÕô‚dðƒKñKö×\"5öÅ^˜±-#œ…T ex_´ø¡íîÁï¡BrÉdšÆ¾o |6ütþ(‹Ì~ŠÃ7¥}Qèf™n_æ¾Khd€@µO+L.@¹å« ¤P¦Õ/¤³àµ²ªMw¶v8÷ æA-Z[tÓÆV“¿ÍcñqÈNÄùìRJĆ]ä(ýê_ˆG+ endstream endobj 144 0 obj <> stream xÚ¥Y[¯Ü¶~ï¯Pß´€—EJ”bô¡Mm AÒ\|Зlt$ÚÑÁ®´–vÓ:¿¾3œ¡Díòا(l`%rDrnß|Ó|Ld’Á?™˜þgI{Jþö|õV'2uV'ïYˆZ'{(“‡î—ô»qÞíUQ¦ããnŸ›ôÉ^üHgôpaªÂ÷ñŒ”yÚíñúiòvèF”*Ò£ÿ®‡§ë€“°”û@¦ç«íì@ó³è¡™&ûaùì´ËËôz¼ô]²ÃÜCs´3­ Kîw¿>| 'g”( §À|™®}çQ*ÇÇÉÒãæ4Ô]ÿGCcv»½Ö*}»«òtœNͶݞûŠÄþðËçtøê­”=óZŠíŽGX"4x‰ç¤é} Xl­R â¬$¥¨rž·óö„§æì\d£‡Ü˲`´\ãYÃõe¾Ý ÷ª|ÁP¥‡,“,Z„’•5Kþ9º”µbXCÇNeD^±Èëè•ÆïrHelZ”õrâÈJdþú°‹u¯‹J(2ëÆ¡³Ñ¥r!•¢fÙˆäyìÄ`äÂ{ñ/ Àµ!£Tà.Qj'ÛÄY&‹œ$¾ <¾„ ³Ø©Ø¢,š½xÅåà:88øj=y,jtø"A!¬—ž¯.„ô¥Â!=O D×–ætÚ6drß üÞqòª À—PàUÔÙÊÁÌ]oC§Ì„Q!‘N%ëdît)ù|ÆŸP¯·'xœüHç¿fØA˜*túf Ñï›Ëo?Nã‡Qoµ‚n‰[E5*EUßÇ¯ÞÆ¯ña0[ša<õCÃâUˆW¹(¼x‡B=*YfNÖVH Ñúúx@´»B¦6r ­Vr­ÓwWvY«\¬•à«Ç£ù¦„z!>_®ç`•õ?—ÌNcûh‘ûxéïÓZ¡aïóúf¦EäõMÒ†o¯é§¿Ï¼ŠäàF“gWøˆab   (†gVÕ Ñqµ‹/™1ëyžCõ¿"¦~Ö°¬’ ‹ 2%ÿ¼Š–xØ¡ºÕQ?çÚ!¢c%Êò:þèºu¬ TF …t©…rïúèöP(õM–l‹q&¤?ß_À‚ƒY AŒ(‚Ð)kÂ'`Œ·Ø Cì.Uzéí`iÊþ§i/ãcÒ4xè7€L"—^æ?-¢Ë!Sº]¿æ“øÏ3ÊóÃŽ¼½/ê£Fk™¾GRH—ÕÐyúñÊ“êapwù‰£úàÄ:KùPÃÜLüÕ@_üÃÀHEϳn·pÛ›i]Ù7NlY£·4Dðt¨SªãÌÊ yŽwˆJ1ã ö1o@õ•êÏ®Cé­”ÃÑ݉p`[Éòœ+Nyí^fë¸ØÉ•÷J¶'z³›M«uSìv34+4ÐŽ°;ÇàØê¢x?ÁG#õ®–è’̡֠‰ KŠý°¶K7,es™ÕEúýjc*Z]¬³xó|L„ª«äßë~Y‰Ìì”(]`òÇä]òS¤»óŸVÁ7!qªdÊ>×ýlµ­ó‘¹6Öç7,{þ80×;çß„ßÉ^¦Èÿ<(“Ÿ¬×‰ÚŒ‰JñBQÅVˆlñ¯]…–ê›Ç£½_~3ëvxѹ¶Ð8ömÛz†ûeoæ7 —Ÿ[x Œþ÷K—»µïEž[Ým8îThoLS§“}o§s¦ÊRÄ(üÝà#JhûözlXÐ¥.ü"àoL€•ÐÒRú¹¥f güˆ¤ø[0_¡!°Ÿ/¼áBBº¨L-*_6<W‹Õm#Ê* ‚`§=`±K`ŠÚlø÷“=é’¢*!c¥®(„ò§h¢]JeÂ.Û„š¦D;®qîFòMOï†:‹ågè;¡‰¯§fž?ÿ#JTý¥¦ ZvßM~Qƈ¬ê1åŠx‹çr¡c‡¶çwþ™Õ6å–j™ZÔUhï5°ÈTšÚøu÷=d=(hSÿˆAŠ^cš˜!kë—æj¼c~‰rQ‘-4òÓ3wÆóÉ_#6 î œÍôgèo}O·ä¶ð*=羬¸‰€m,.'ý¿þXLö  ú¥»!x ý °ç;v©‹i†X¨§äiÅäÈø«@ðö†ÞPe´zÛ4¯„ªŽ¯>ƒm^šëÅ ^re ®Z[~¸aFÂWW-e–@+]¢‚d…ÓµBAÔÈZm¼Sl/ש!u|$—w é3Òàt-nâHŽBHâ–Lœ#¯‘›ÓuÜê~êŠ%ýjCðS#šÎ–«éoš@fC:p|Ñ«eAœF:Àç>¸ ©‘+ù‚ã.jµTKâÖX\`‘ÉïÔõ/øÖäŽ<‘"]CkgbCCO@6¯-zWÊJàýÏôT† Ìß|à·ÓúžXê:7tÉœñÍJV„úbiPÅRÜ4V'zšš?œƒ0•%pXÇߢÜÓeçdÇçØÉx'µ²µ’·­Í鯙ö .¢–›é³ëv¾Æ I÷2×Á]2)ÔEwI²î^)ïxn‘=aµ²ZƒîG¢[·‘¸£ŒîH¿|Q_±“#›ªµ`qÿ©•ÄÞ7è&¾CæÝØlWn…ïÄßË›HÆLƒÜdÎ1øî ÉSÑsnŽ~­dÔ…ŸßÌA®Á}÷¤y N3û¯[À«æ¹?H`¨DIŽßï!ûÝö{„4œå5Bþj&žyô@54A|ËÇX°O ~}læ¦óÚ…ÍÞíKÛ†iŸ"kõLË蜌u"t²)ÙA\Üá>’› "(9±-çgx½‰fåŒÉ8ulü{Ìׯ7¡†ÿŠe¼¯a€}]ÞúêÖÍãŽ&™ðÒÁß:3ø¹Ž»ñ·Î+Ö‘ÄÂÉ7¨â]÷ŒiÿnyS×É",êœ ‹¿G~wªáT|¸@æ:Ó`ä΂ÿê¥5Ç9}ÛúXÖ¾ÃÆñ!qàÓí!üä]ã¿ÿÅ •‰¯;!ƒÔ²raª%Ýà;·"8ÔL-žÿ·ÞiÀƒüCŸU”a-º„ z”P ß8àÆ̲ã¥?ñk bíÅNèb¨ŸmCËóÍÎtê/±+¤‰’éÊ;ø ö0ôkÓc™ uC°¡Ý)9a}qEÑm1vËù˜“ž I¬œ]³]FrËA›`ǵÞ&{¤Üm9UXrüz²RWîëÊKþô§ÿAÏ" endstream endobj 148 0 obj <> stream xÚ•—ûwÛ4Çç¯0p8Ðx¶äG¼ç°nee0ÆcÅQ;uŠÚNéxýí\é+×n–ždg;çIW÷¥k]Õ»ô"/¤‘—1úzÅÒ{8õîE ƒ4åÞôŒ–ǹxÓÅKÿP¬f½š>¥©Çâ ›dnGBƒ;Œ`è/Ô,äq! 5ã)/i.aþBr_‹nܵZÑ ò75$—N›$û0{Qäan GIÇd|p?±Šó^1› çNqZÅ,ƒb;ÑHH•ÝÕùEé¶ŸUõR´U§ ‹­¼î¦VZ”NߺåÂMwF/Öò|cs!jQ´²–oìBŠxÄ6¤¯O­«Çíà±R5ænµã«Qû3GZ- Ãà8w§ÍÛCH GÆMüH M4U‰½º3ܨóµ"ÍäT+›ûÖñÇSTÒðxÆA̼1‹ã Šl,³¥wJ»Èâ› }&æÖ;ªÉ¨UEåŒSçM!ò— £qÂÿ!p<GÀ7Ààx | œßÏ€ï€çÀÀ)0~^?¿¿¿Ù€nE °2 `Hà 8^ ¸ÞX%P+à¨h5pü \o¿€?v•E΃ø=Ê¢ß, [ˆë¥©‰z¿šáb0€1) ßgye{‡6ß M6øTe¡„–{Dö!<üøøø˜ùŽ#ð3àsàp¸<¾¾¾^¯€ß¿€ÿv%1ƒœíŸÄ^üúp™Z®jµTó½yê>ç'îÓ=tô3w¼póGG[úibiÁGyŒ›?OÜuj~(rÖ/†Ýz!²øýÖ }wkQ-vQ«ª¡Ã‹#ê)k¡/醮;Eµé &%˜p-ebî83žùòº+ÛÄœöÍ^”lͬõÇt¢ª Q›ªt Û•’¾+Vs§x$}ÛÄâ[íÆ‘=;ÃÁÙ BØ1Ô”J׳[ueÜ1Ö(Ü?•Y­åB–ØGí¹Æ¬VóZvi”XíŽÌ µpV×¥Zбܕmî kUñ˜Þ4+ŠÆübþR^Tµ±hÚMjy®æJ•7ù líÖXÐØ1èÖlF¾NGæ‹åˆfçÊøSB²‘ y—@Iï]#ÍïúÝÖs/ƒðìíÔgɹy)Ü,¹7JSu/Û_£¼VM«j,Vm-0m_XÃêŠý×¢µ‰okéœ*x'çìQNè(Ljb›L–ñA2³>™XÐøqëéc&l±eŒÒàt4²XË’.ãn'اÉHÓ4”ÒÝÄí÷ÓßZKÅÚäTì|c%ŒÑdïËr ^VKãÇÜ}ÓT 6O&KÚôÔ»ˆ“€¿‡½øðöÛÒÌwN³ É÷7Ü‹o¾¹Ëìµ»Óì$ïþàÙËl/¾ZÌëî*¨:)à+S±r—Ñ4Ú¿v²TÌto¶bQÑ ßm€ñ(`m‹q*7Oœçü~‰E endstream endobj 151 0 obj <> stream xÚXKoã6¾÷Wø(ccV|èuÜ顊MOuÐ7` ‹Ž$/âß!ghK¶¼»(€"g8C~ó¤Wï+¾JᯠÿéªÞ¯~y^ýü«Zñ”Uiµzþ²Ú0%V?ÏWÏÍ?É6ùúßçßVÏ·ÌŽ .ìиX;Toa(“£®íVæ²c³+pÀ@1©r8]Q°’‡ã Æ×Î…J~wûµL“]ŽX¨d°¸³4ñB[[»!È]ETLÊ ôÊ)WΪ”{†Îíwý:ã‰ñM½ªÝ:;kñ· ¨”LI÷ì0z°±¡±Ö½®Gîàçºý¢áÇ{ „»ãÞ{O|€å.dŒŸ pÃè^Ìðrì^‚Û˜[–—?`ç‹ÞÕ/Rðûz9ÜS¸= 4‡¾î Ì!} Ú+ªäî†k¶¡4`·©Tà†(®{ÝŽBzŒ+ñð±ws‡ [ïÜoÇh§\][©øÞŒ½_C7£‹‘øºÎ²2‘Þg> …án#8wm]g(ۜЮ—CÙ¯þð ‹{NäÑ£ÀU³®±µ¡ wƒ(8¯œ9o•Ñî*¿B¹ÂÔ—óêóÊÀ¼MÌGmãQwûž “žÐF—ƒ†«i ÀÁX ÑaÐßf+% –rÊ5–¶àV• VeSü[p•{cuoA1edO¨Ðêþcfu¿Ð¹ÈAçEIïý=eîC—â¹Hh© õ ÐΊì°?«ˆðAÊ)!É>Å]’#°7á5‰‰¹µ$`š¨.ˆ wrÑþȇ÷ðÙÖ{๠ê¶Ö]m+J‰Ä÷#Gˆ•ø@|ëñ½2(SΪXÕÁ' õ»,2¨Pý&âÛõO}£þAÍ­È¡Z¯ÃW9íï‘IwÖàËàRí+J–+Ú>Ø×cÄrõ×C–¾ÕZ¤ zÜöñA ³4 _æ˜EÕEéæ;û—஘ˆíҲ嫪«Ky¸ý¥Ìf/(˜é„-$Ü'Ü-T%½è]ŵoݽÀ€¢l‡ Ikp5h¢ß4#x®Ù‚0QU¬ ÒˆAy8š˜¬jʽ“ZV÷n9@ä¥s5 ·€‰0/µEðZ€³`±T?ÞA‰b “ÓU_„B$ãŠgÕmºÎröø)»]gEy»¢™Êr³)~¼oÊ L`”$}ù¸j£‘)ôK0R¿”—±_‚µÞ Ö Û`h»!ÑcJÀ8­iõ„ÃhMgH¶B2hè`ÉÏÞÜV ª)HþjÝ·kD&8KÕ¹\#‚_ÁšM§ÿÿ ©db±@”TgKPáëÃ=5¥`j–>sñ÷…·>š®¶4ÕýÎBÌö8¨Ö§/(?‡-¦ï56uaŽe:°s4¶… ô‰¿à`JêF.Ï œ_õ‡6¦öqø0q¾a ¡,ùŒí†¦J(mñÕ3¾y?Zlv[^¾ãÝÖô/ [xFHð<ž'x üç‚Üt¤¥†ÆP…`$ÇŸÉî(#â§¸à ®©î€¯0\ø¤a½ã¸5µÙÓ—FN]7|„NÞÔ„&O>w¡r¯:þRas°8"0b ŒÈÐ$¸nHtÄEË ÂELq™ϸˆ).79hŠØ{‚ÑÙ3¨¯8ÿré‘ïçó&¶–Dîý®#DéO³ÉU‰i1¬þô]¼È endstream endobj 154 0 obj <> stream xÚWÛnÜ6}ïWlý`K©W%ê–&~(š (‚¢Eݧ8h‰ŽhÅ¨ÝÆhÚoï3ÔJ«u“6Lj8<œÏЫ+¶Šá‡­Š~ãU½Y}w½zúªX±8ªâju}Ëkû‘¯®›7ÁË÷r³mµ ß^ÿ¸zyÚ¬š«'UÄ+§~ñÒ "\g ¤±cì:“Z4²Éž‘FYæ6-7顟í:[îºøIãžFÞJ:ʈÞÐÜÚì&I|qaNzvöƒnÅ%‚Ô÷òìÌŸØ â–Ž%öJGxüÓW|â7Ë¢Š`e©|mOLÓ4hÕ {ÑJúl¤9y‚2#q‹;\ÝŠžÖz¹í¥‘]˜Á z+L¬Qa’ƒjŠ̨չ ×ð÷&ÍÓVÕÂDóTA²y”òÜg6)£8qö&׌ó?‡iˆVÜöÂB`k+¬l¦,;‰OÑùßÀ3T+'jIq[qVcf q8'Oí9ûSø9 Ú‡ÞVXG)g»z'»Z¹Ïà c ¬!ðNŸ[î„ M ¡ÉØ jM ³ukÚ¨ÛVn(Úí»]çÕ'¸ÖN¸<гi%I³u)`d°(ë°LíAl]ÊÁ–Cðm®A Zû쓨P Ùá"Ž m(à ƒ+ЪòîÁñL˜gášsg™Sª2['SdÁ²ŒrÓ"y îÊ~/šnVÖߊà.ј;2¯ÓAe“Í"¸ÝÉÆ9V.±×z£qÖi¬uLoűøsWü¹/~màHΘK1lzÄe¸iö¨ËœqﲂÑ0f_àzšGñÄuÎbr½Ê£É»^ÖÚBBjkåà*ðˆóYD\¡èÉA¶H °ëôã 1¦¤€rÝÕžÆÂêRáB 3Ò܇ô>Ñ•ókAô6­ÝtR»E@iï]ÔB¨$Ñx5Œ‡åÊQ¢Þí”D’“P³àY§©Û¬YaKÌÚ ºÆéåÉ!¡²5ræ$Üè¥â®S`^鲈â|þÛ‡…¾º[ÀvzX¨ý¡†{u—»Õº×Æ,¡»4d!`B65­Qww'€¡ æa3jŸDÚ/€€¿Ìg¸—݉Š_'sÌHþ«¢Ó¾Ûauð±:’±;B§«{…$îkYv¾ƒÖ5$Ð7YÏæ¥{OÂñ¿0–_–Oíñ1g¶óÊÎ ó]‡jP³º‰S­]ã’ýz¯/±»¹k B¤»Fùqk{54g¨"»#ƒeêñÂJC†xR[û+9æ³Ö}ï{‘î囚Éà ýn6£PÇRöù@‘‡ýòè†NSÊç!ó&ŒÓ|î)t•)=E2zŠ|/[µQÄÓ7ÜGœ'(’Ωv›à ¸¬ŒØôQ2xr—ÚÏs]ÚXA’=êͺ>ê(ú^5;üfžka†­ºœ?^àÓÙŽ®sã1³×F•5†£ÇÆ%ecduË£ò$}–eT•xYKõ eÐÕžbD~ô*µâœãådÌ«þòÕ? ó endstream endobj 157 0 obj <> stream xÚ…UMÔ< ¾ó+*qé šm¾Ú)ˆ hßâ‚´7–Ch³ÔÙ´E/üzìØŠ(B3RÛíf™ÌJøÉ¬Vð/³vÈ^ße7ÿI ¡M•Ý=¿¥hàÞ}È•¨N…”Êäo¦Á']æ‹‹ašOïÞ‚¦ÉP¶lPQZј¬PÐ:)¿™ÆS¡Îu~‰Ónu~¯+=‡Ô½ó|NxæíŠ.@lqm@Ññ9Л*ïÝ&?·1\H˜$6FO—,Á{b׫߼Ì>^ÃA/ß¼$ÃBùœwùèFŠÚ@=0—ödeŽ%økú¶ªaéç‰_˜Êˆ¦†zjambô˜ºÖ:\=^ 81EˆÄŽ™Ý&þ0ÅÁÍL >r¡ü,N…1&çØ\ ƒü𬽎驦ö0;P²޶gPFk¶Éû{míèQÔ‘H»ð-t«ëÚ¡²ÂÔÿ*§KÅõ(5¸ý” äg‹Qýpq{t!5 ¸x¯l¨… ›} u-dÅ1<=²¥föw dfÇþÿ%ø±ã×—zeïú¾Ôftý5= q­¢£þ¼Ž?¦äÔSCò\ H`WŸCè`Òtý7è`VS?)‹¹³]ýØwެ½B¡˜”žjjD5g¬ù “≌¦‘šº ³ßì'zÇrŒCT°“h??®!5'Yj}Œ®›¶ÜµZýÖÔãÑA«jQIýæÙñ:*›+¶`Omüg7‡ÕfëÁüzÇ/ª)€&,-¼Û¯~¸ôœÐí/׽ϒòä/P¤áTX€lÄÃæ/^Ñ)Ë—tyJÇí¼LtÂ⹲Fû {ôZî uIÆÿÔž–8ý¡ŸÞÇ¥ Õþ+Ówi1Aç&uÚÙi/Ò Ñ˜ª<|'‚8u> stream xÚVMoä6 ½÷Wøhk­õåöÖ6{(z)0=uzPmeàÂcÏÊöb·¿¾¤(y<™d3H[ôI=R|I>'<)à‡'•€ß"iÏÉχäã'žˆ‚•¥LÏð9op‘º¿Ò_Ìå(µ^ÖaÊrY–©Ìþ>ü;ÊD(VÕUØ¡aÑøO_/™,Rgç~íà*ákŠá\³FÁ–šIÚòçh¬ÞÁ„dº߈°_/.ÓE N²”ã+^U͸ˆð’Õeº‚cx© ›Ó`Èv1.¼µfh×Á8‚¬#Y¿dZ§f˜ËrÍeúìCpÕÙ¹uý%ËE¶!èl JÀóä1¦È!/<ŽÍý!òºb%°Áá´Ê'xË¥”élé¹Îf¤·vB¿R*xç¥_Öo™¨R;fk‰ûº°¯í­[ÌælDèbǶ73óáC-x£?…8';Zg†´¢Ì!¨Ï|Ÿ¡—£TüšÝeS„#MU:9ZM´¿c7Ä7Ú8¡ð©› %WPbÒ'ö« »Ç®‡? AéÙÅ8z(ÉKûVNZ‚ïuXL N§ê&]B¥0k ôÒÜž¿Ä,CÛÞhl†“ï74!ÿhCO¾Ê‘g¨²U>­},ˆçB@C.ö49¼pfþÑo|:ÐÝwzΔH Šiá} Q¾‰‘wð»ú,Ö3Äå®oÍüÓ;¡% õpèü.ôÜŸ1ø?¾´x™†‡"òøPWø]=´Ó±Þ¬5+ªÇ_áw·+:ÿ®z?~UáP|8þ~@¶O°­Š‚ñ‡c^Ñ÷!ûÑš!Þî胃)&U¤D©‚)ª–d<Ë9 Ueç«Òг 2»ž}[gDäü¾Î€tíu†_u&—M™Ž[Ô óJ¨¦dºÜ‹O¥‚ø@ªQ|ªM|À¸XyÍ€'L+¦º¸½˜±c¿ôÝj†è©ÁQR¦ ŒÏ0pdÉD³Ÿ8Q9$E‹÷þ(+q¶nºíÊKlIZ ©§mlÞIÑû;?Uƺ•ª^4êôâú³q½!Ȇš°¶ŽlëH†¡_P‹^ó…Òª<ÙÅÙ ü´~´b½{ãP¦ÎvÁ“"rœò7F3„]‹’Øw.Ðr àúy·ÿ G¼¹À“âÓÙgë¼ߺ¨^pˆX_ß=‡8ôÄt°;Êåvê>èO¯Œûm mpÁ|[a“a^|Ç^¥ÿ=Gpë0©¸ôgw–$Γ¨95+x{1 öwJˆ“—Š&—úÇÿ Ûw endstream endobj 163 0 obj <> stream xÚWKoã6¾÷Wø¶r7æŠQRöÐ"ºÝ-67;Ù¢·Lôp${±m‘ÿÞ!‡’©‡ï"(’Ù3ß Ç‹§]„ðG1ƒÿp±+?ß-Þý/hHÒ0]Üía{e&rq—¯ƒÛUŠº]Þß½9šŽc%VÆðdeD£Ffú¨š¬X®8çAµdqp*7<¢Þ՛圑•Ó°¢œD‘UóðºÐU¹Þ©«•5\´~]ó!k6\ÐR›Ú]£^i°õo–_…lýæìP±(ÈŽ, ù››‡·ôþ[`|=†m» ¶k}ópߟyÁâþTíô†K^¡=ƒÚŒÚ«FÁ^vµåöTþ§ñκÂñ£s…ÞïñëîǬØgk}“ïq@ЯCV_j}Ж~ùõHµC3BûÇ¿•[`|TѺÈ>­õUQÞՆƺ®²âjÐ]TÑö[H4€¸»&äS8@;eÓöh²ö¨w+W4•DÄXÆ-•U¹á§€›hÕ¡ÀD5¸ˆ% F &P"kô±tz;AãA³w8©Ü8Û¬OÚcsÒ Nʺêô ëJæVK“/Në'U­숤Âwž)OV:ßÞUUZá=8 r ÃP¨× ßC( 3T]Âe³–¸ŒËoB">-¿·wX¬'E8¥}i|K­hè_É’St‘‡lZQ¬2v¾šäT8ÎÕTбÿýs¯©g™Sþe=¢9þ8LžßŸÏÇÇg l\Š iäÝO?âH¿)KÐvö‡ÍàšîVàoÇû.&ð–RJRƒØÆ„IH‹žJ ¥pî>–qìàÔ{Û™Œtüd‰b«î£FªÙ€r}ŽN87¤œ;äèyri=~–¥‡ê(·ûy (ÊuƒË`ûT3—'¾vÔ[³úY×äEWq& {_1ç« §ø„_ïš [`¹V¦n¡±ïsȧ)ºæ}a|À(úÖÁQç˜N|ŠQUâéÝÛ»ºi´œÈZý©‚rx¡.uÑé1½âÔ4%"éÊSÿ4ŒóZKDá·0¯x;9{;èíPŒ½Α0侷͡Ǔ;2jiÂ,\Ø ?áëé¤ð#W[|JpÚª?ÂU®KUµîé¼¹TîÏ´îCj›š1­YOk<"ÆGòN•—ƒ$bFÎ1/Çè«ôÁøXNÒ@&£ì¶bƒ4ô­Lññ•†à› èòpšáîa„vέôÔ•;S8Ý@ò“%¾D¿‚ñ}ݔمð´ºë6Ý™vãwûÄ¿},GPU—Ûf…ÀŠ™–‰ wMκ ž@Dbîöu·Ï1Ic{œÄŒ‰O43!Œ†^äfÎHJ¸¼Ú»ÞˆÚˆ ì’‡8 sú¨ ‘pâ— Çcȇy«9‘â y®#†\ŽHwg! ™Ë¡V3qçŒPæð¸ˆÓ>â¾Nž9Áa›_o¥aضqYÞêÒÓ˜¼)à Ä„ŸÍp§mÎ]4 £WÄX ˆ$fB,.E)¯¶Áæm߆uCÏ“ó çí³˜$/³ÂPͲ”%gm]¹Hœ¶ýcç:e¨ìÀA¿Aþ~Í-W"ŠãŠ÷4Xó4˜SeŒ{'³5y¶DHM£o¤-3bËŒ¸cFž‘ÀºÛÂ;¿á1+USw(¦øZ\RÎjq©üº=ºÞÄþ܆Þd¤Æ,á=ã “°O |@©Í\û‘áJáF÷4zÝr›¦cnÃÊ®®ü^œÚ’ÉVfg£­­»wÚÆÄ·7¼ÇÌoŒI¤»'sðë”%æÄJºÆ†ŠNô¯ïþP Ãõ endstream endobj 170 0 obj <> stream xÚí[[ܶ~ﯘG-àayÓ-A^\8E‹¶H0éwÄËÐHkI“®ûë{I]—’fìuÐ… DÞÎõ;‡ôîãŽí(üa»˜Ã_º;žw¯ßîþø½Ü1JRšîÞ>ìXHR¹ÛcC´{›ýü­jîö)3¬W¦<$ab}ƒkIeðwÕ¾ÿ¡®NøÂZó¦Õî“$¶6ùé’k·IÓ&‚‡Ñ"€$w_ëR5¯îö’¦CwËS°Ñ¶áñ¢³nxíæv-cµñËÏÌu9ƒ±:?ªæ·a–z´8$Òj±ºoAGÉF”œ“͉ž|CE„ ÷ýpçÂÑ÷Té¾ðM ³ñCÿð<¢õ~åUBØXU\ÚªS\ßR¶±Ç=ç1‰'lV Ø KH$oåã#‚Fˆ…ªhB>Æñaœ'kFÓ ¬ {ÖK5}TEÇ÷SV0çÉ9–Ár=‹`qH’pe)Iº­¬à µÊr*÷Æ ÑT{8>ê=ã8ð°ÓÂ.,tœ.«‰4 Ægb¡ ’_,”ÓVQt﫵r_aL¶t"6 :Çê%1Ñ$fŒ@ÌâåU´Îª©;BæÀ@ÚÊB.1 b5[g2‹Õ|+Vs€å`Å#¶D}I¶1?Ûú ÊxÚØFzš€Ópy™oƒ!á`©=É«>p“ª1A(z57¿÷ªñ+3•Ãv|Æ” :9Sõ ÑG¯ÂΈ: ¬EUÕ~ö‚«ºÉLœ ǤÀÜ™s9Þæ\ù'ü§ƒíŠ™:9&=颳ðr“³yÌ›Õ4An›ä5~&”h…#™žÎm~Ö‡A(ÜbºS3dXÌãGñ.vñ.JN—2«ûÖ²hŽ—ºÎû¦L7­MBáÒoÌߎ¢°É3ëÞí¯.÷ftbífIl©’4`iLM’˃·¹>?Z$g¿ý\æ¿¢ütÝ3ƒnª¬í™€žºäa ølÐ"v¥ SPÁf7ޤPÏö“>]]ÁlmçŸvõÉS݉ã"8¦5¶ðš°aìë놎)™ts*þˆ%”VJ®_ Iéd´0Ý\‡¤‰O:-yl€Ê|X ]žÚ÷~¯")¡é̪'ãÉÁÍy½ p4W‚Ä£§ÿhüë@bQ•§¼½d½)ÛVW«:ªL—jú à¤:‚¯ÑþH ;kØ ÆI4Euú  Ìâ÷|®¾: ËNªÎÛ³s¥j/õPðG¿d3x£ãlÆF_0xM‹&£è5bŒèá„[Š6Š¢B"FÒÀ8ÙõD×A¯ ÿ@Ǫs—8u6ó³*l²Ð G«lØ ŠÚ8bêY=Ý j;Œ¢í‰„寂mÃÆ;’«Ë'‹“ðë'‘þ9ÈÝžE‘ý‰â­mJd͹´äÒ_SŠFKöÆm.‡rÂ3œ3€—¾n¢Ü¸F·àŒnGé*Ã¥GªSþx]¨Ñe^/T¹"S³×^hÃO䟟Ç6ó‹Hn‰hÏÓk\{<6°¶|ÎËÿ[ÊïÄR†rCÀ­…Èm á7‹ò¥ÍCn›‡˜™‡x&0ó³hÉ—ÉÌ®3fèê ‡ŒÎr!8×:«ÊL¯¦ZÜÈÝFùú$c<#òv*óXc"€ßŸòså/œ®Š&©ö ñc˰JÿÞ0½üŒâö¾4?ýëí“€r¡¸Þ}Ïðô¸5WÞŸÁXgå#AÒ žinòÒŸ a–èÌÓ›ÎÔºšÛbÑ $!áó1Néì¼¥ùX·_µä Çz“Ç.ý¸#”øßE ˆw˜£“8Þ‰’$ý{±ûi÷£MWgÕ/× âtÂoàx­PÃþ3>=É\rWVûRŸT›Û±šÀHãÿV˜$&l’À4mÍm­Æ[^eƒÕn¥Ê[^áaÁ+ð5¯ }®^•ˆ3»rKõ Û”Ø͹”˜&ý·”8¡„ò•Z_BèàOÌ€­«%¦df(t™AÚäÞûš®¬ên7€öÑtvŒÖU Zîª@˜…9V凃>`©Uqxñ5áÛU—HšbʨÛT~@:&GÑÍ5‘4ôZª=R6«'·õ¥<þAßÌcë{ËAŠ"dù‚ /FA_\ô©ü üøêAÿ¥ùé_/Ûˆù‰7æ‹+b¾˜”ËþR«2ã\^S?éRƒoêZä’èHó>Ó øþØèKVíaAª­¬Ã1ÔùCUŸûãaíËÁËç÷—<«<ÕîÒ‡+Æ9¿ÜíÃÀ[Y̾õ2:áϳŠ#~rÅ¥·†´ÃñÖ‚`Q8;±ûÙr‚²Ïà?©»ºÈ ÿñ}vMÏE`;<ï@KÇ7 ‚¬ŒÇ,÷Êçáp¥®'EN#žŸÉM1E”¬b‚x@Í¿Ñù:T£¾µIò½w x_”^„7GkúlBŸ¥ú’YþIÆ ˜«NÔ¹º/´%9©KÓœW–rÆN× áš½åábäÝ7ÀØwö"]¸Ì¯Ý€Ú ÎðBψ;*„7“Â\¹Ÿ/3?¿…ÀÌð¿·ÏšÆ›ÉøJ{/~:D´ £!nöç's“á>s¼c‹Å{A¯9çáXäHð\äØº$òô=zÎ…iä¦rM’É™ LÞØžAöäжÄà'‹ñFc¹]R1»‚gwí•=W§×ã0æq¸¤r| ›ç· 9 ôÓQ?¶^l†l`$ñ¾—_£{ßöÊ7H> stream xÚíY[oäº ~ﯘGQ­›/Ù§Ø>(Т)Тéƒw¬d}à±çØãÅæüú’"屯N²ÅéE{`lS)’Ÿ(‰Úý¸“»þä.WðŸîާÝov¿þÙÉT”i¹{x‚æ~d»‡úïIíöÿxø=pÈrÁ"°‘£uÝóå3s-åè‚9^ö­URö*K>íðÛH3I5?ê\¡vi Þõðn“†u]ÿ¸G’fáíX½!Ðo_йî§þÑQ+Eh-?¯®ûCVÉoF™½ƒV =ê¹æ&úÈX2Úœ.íÜÙOwiê*8Öp+eRÓó,9öür;ÛM¾¨÷DkŽýèû#¨?5Þ]Ø­¥'àûxéƒLŒÝšÆÆ`Zñ?ÏCïXOÇfxÔ´¬Œ˜g°ãìÏaFwÝø©Å4ŠÿÇJE¥„ÐÛ;u&Œôµ"Û¤T6ù¥4‡_Wã˜xâ(+láý¥«6p©”È4óÊÞÂdŸ3‹*󤛳ÊÞ¦8g‘ˆŠýg]méÖ©Ð*H1[”{ð%N^*+ï”eòRYžoN•Ÿ‹Èⱊ½yR"­ecó<5×9ˆ¤§~8Uœ£²Bå2^#Ï çSÝo8FªTu3¾[F‹ÑnX‡ wÈ 2ñsRÛœ˜Î<4]ÝüTu”ÇÁkøíÏÔ­ã4z“‚fx¤”óê¾›´åµÄ%6½\n­¥BêE„´,(ÉKGOéçÒýÂV]^Øzb­CŸþLÙØgU"8™‘–"xùé~pÇ r6(œÒz–‘šªÚ8š4ŠfæÙãþnËGF(|3>k•F”ÅÒC0‡iý¼.þób¦å/Gi€löm~„×TÂtL¤Ðív/DÆ\Gü´r*^A ¹4$Xò‡*…RKl¥&˜òM´ú0¶Ýlؾš¿Hœ­?WL²æ\Ç«Ø\‘3¯3Þ2cEo˜°#dÁ?T—ÏúgüÂÑ4ãÅqÓqª¼—ñ=B¤7B…„Ùó QшÏóäê kýþÞ%ÞñáÆîñ~sÓ™Z¡%LgØä”¦ÓÖV×à¬OoDX`±+aªkË\>IÖ_‡Þå¢Ì)XQ`êW!õÏ;if.-T Á­Jî`ÑÈ ¿.PδÉu#¤Ý…ö÷÷÷f1ê*6ù E”¥çëÖ£µ "4ÃF†Eè­qª­ÞYب?¦ék¤\LWÇ6Ûî¶â¢L*L¶jTðPÂ,K ØŒ±NÙâÓôÞ}%Sñ~˜¸Ò‰*Öx$²ˆ¸ý¸å_ØHåAé–÷2¬[Póá2[ï“ 6òÁŽ[©6G>aKGOï-,úÞT™Õê L\cÆ’;Šë˜üeo͵&:NmÅ•TcóÜ]µW¬œ­=(È‘¢¸[/±¢·PK /?|«ÖKjæš}¼l"WJaCÄÿ‹’ΜfâÜà é{%B¤Që'-y8Ô Ÿ¬# Ä­å:]Á(·—çŽQã8½ Üžê3’¶j«á¶‡CÝÑýƒ™ï!õQ©å•{¼Ž1F.Õ³¼Ž!È#­öO®ˆàKl)JYUD8#Ï÷‰èZú¾Þ¬øOÒ!¯)¾óö\4§bÛöM̵ú†7+ÑM‹¹ x˜é³ Œý²‡âø¯7j¾ë…Ól¸}{%;)X¢tùvz²«ô´(~¹ŽÓø\2Ò„;=çÔ·k蓲škèùk5tP¸BÕºw éù[…tç•í:#(*Ëu!ݤiâ߯#ØÔ¿¸(õƒ.RždÅê&°H7Šqy¹(¦# ålxábz$±fBË×  ›V­£[¾_fç÷UU}¦/ªó¯”ÈŠœÐ› JDÍӿЇûMòç-1ÖÙ¨ýòÙu›°\Àîë–Œ÷WìëvtïÉxÙ<5™Ð…O.|þµ'Ú1*ãáV¥¸Yx{è„T7É×èJçrx‹ïÏ€‚;J§¡¯Õñ-§àÍÄ[&-#´}f0åMtâî:t§åú*_ß.T7·u&ÊsFà*/Ê,°þéWÿGåE| endstream endobj 179 0 obj <> stream xÚ½XYoã6~ï¯ð£¼µ)êXô©möaÑ¢-š·ºT‰Éj!‹‰ŽEÒ_ßÎЖlÆÞm‚"Lñ˜ã›ƒ3\=¬âUñ*ð­ªÝêû›ÕÛ÷É*ŽÂ"*V7·«X…E²ÚàDºº©ÿ®Ûõ&‘Qðy­’ lMOŸ½¦v,»µÈ‚QÓ\mã`êèW?Þöf+SÉ3•éê¦jLW¶4QëûõFäîÜáZûºõ¶|Žx‹ã»¦â “^ÿyóta•d¨”Uihî`m#s ?ÊÅßû²-ÿîù£‚Y‘‚(Ÿ%õö}\Ì±Š³0KQ$ÚÜò–šq˜(Þ®7ª(‚ߢ>šóA…ñV¤0Êg„Šu BŸu¿VHYã Œ‡q¢Œ¯€|‘yØXj½„`‰«Åan4»eØ n© Ó9ÀsR ™ ø=b3oq¦a9?”ÍL“Ö4ÙÓ™…IÎŒuçÁHˆ°ˆÆI”~dÞfì vÆúgm®HŒ¡¹¤ËÌ ñÓÚ™aŠBYÌq²&‘â¬åe&Ky[¶ƒÏÚ"³¹µä)iøŒÙ’Å'â‹#kã–aNQ~=E6®8Wq‡œq-N“XÄëekgx"bL}ÙØ*Î)U (“*‚i(i¢-ÝÂÝÔÕüqkú›o(ímeW#X1O“ý¹^×SÕÔnúiIõ \™y |rf‰,ä0sÎ?6* cEp%ÿÍK’¥MåIrÇ­K;''v–Çž#¿!¢ý•îMh¥º¾¡kn ÈùÄÚÄ1ØÈJ'Ã8Ì×8¡‚kâc:ë‡æèÂ<ðW1Â?ø2/%}¡B•Yš?Leû05º÷‹¯‚“ý´C¢=G¯ î'MŠ+Ô†º]úÒ:†ý´0õšƒxHÂRÃpEó­¡í ˜pŒ¦ï˜Ö‰gmž¹ÂvzaÍ&˜ºg­c÷Ÿ¨×7»²oJ2Œã’‡JZ.?Q©™R)ÅÓˆNGcˆžž")%qÔ>9²í”:Âb“Fà9˜f'[:€@´wrƒÝ£$%o¸t¨šm$“ªì鈻•N03½6‰ ëA—µÁ" IŠ6\¬&[À êcW>éjKëͼÙZw–¢/+«($—4‹ÑÝ:bïÉD|úOÐ.±-n¢£ÚD‹kcîqÂk}ô«9¸·2lvÙÃ"A'þïO€¥jóŒÿØÚQ‹R>OjG˜«¹†¤ò.:)ï"Ž{ŠŠ{:‰ZàzSPh*C‹¥§˜tÜDq†Û!ÈýÎtÉçSHeXÈ}®+8×ý¾„¥-ð5½ËwŸãŽU6_”ê®A(€‚ŸËñ㯽¹Ã/ô©fuG-F6ðNnôÁðÜÁ¥Y ܸüU@ îÉX²ôø×¥cj`X²ybðã{œ)Þy p>Å.5+ߺ]ñ¼v¥+Ò=ð¥É¡´Þa„û\Ú7ÆÇv“%¡œ »y)[Ý/×ø×GŸlE˜gLõ90Üú“G*¥ÂÈI]âm~HA/góBq†i!ɾ¦H­!‘"…çÅ‚æ"wÍEÝÜjHLUã®T;fhƆÒ(%ˆ-vVq¤@fç&‘eÁwø“ûC­çðà 5¨8GW$BÍéÜu1òÐÅxE2Ìä‘«ªÙ†,$)¹V’7c8ÓtU;=!9,DS±/> stream xÚµYÛŽÜ8}߯0ò°åJºË’o³ƒ`;X ¦÷©«P¹”÷úRñ%›Î×/)ÒUv]º+É À6EQÔ!yDU{=éðOzIÿ/¯¼ÜyïÒž DdÞÝ/K…òV™Ð©w·½÷ÿµ[®ÂÄ·­É‹µŠU½|¸ûÅ ÃXĘB•_`°ý8¬U7z{ç}ô„ÊRïlN*‘D^å©8ÉøYz¿{¿]r TB+gþöÓ2Š|S{VJ…þÖâSù†:/šÚvø©ýµï\xÿ“Ì&6eŠ@±¿fÓ±ÎtY™™²ÆÍ9°ã˜Çs[”gLÀ"™Ü›pÞÙ>ë%B¨3_ ž”y‰Èg4*ò”ÈbrÍ)Þ*B€P²¤<³à ‰ÈJ‘ÐÜÛÏ*À™‚¥. ’†"JØß·oÏa"…ޝÄä?gæÃ.FЗa ÂQžâ‘bÞý)püºVZv”+Ï”•­›ŽjÓÍKàÈ@C ³§ï^ÞÜkج®ÃV”šeê/Åf(ûbWù¼¤¦mñ©è^ÏF"Óýí·4fßûïÃ<þÆŠ¨ší+\§aàëÓÈh%.±¾:2É ÝŽ¤¦ü¢ÁÖ¼Lq8;Rr7Tß È®=‹Rܵõ÷Å|¾"(2 ?: Š‚ ¨?'*?,Ã’lF©Ïô膮‡`]Á¶^÷º@(á•Ȭ¾¯^JÛu¯œ_ÌIqz¨ñøk(ék!¾pÊçM¸7µ)_Æ6>øY|8—5‘ÆÌ4qBØg j±êÿ°ç2Z ½ÊÞÔËGr·eg_Ç%ƒ,ò“SÔC-âo‚]Aíè `ö°w½A^SþÓ´‹‰öÁG72t,Ø™–•· Ü´4’!ÉOZ4Èhé”ÑÜ„¦îl>ô…uÇ[kÊâ‹iñç¥Û¢²mCX ÿ™vmdDGßïdG°øLXÞl›–ÔúÂÖ–FçÛFIe–ÀÀÏXò£~C#Å£Û&¾~x>­ƒëC½m°í“Ê/ IÉsìÈ!ÅAÜYÒåM‹1š‡ÝÝ¢f”ú¹éГ(Cø–!ì£Å.׌5ycì }oDîPq6* èvb’ÆÙD8Èé㙦C x!·Ç:+Ä«·PQ(ýƒ.œì¤ã¦Ý”¹©¿î‘ÇÒ”æ:×ûö¾•>ïZË]É ©ôÛŸ‹¨Ê/§)‡R˜Þ‚Ír_8ºÃÐ×d×Ös¿švkyŽ4ÈOKg½ãt„뎻ÄÈ‹\AÇ µÛƒP„ws!”³ 5vé¸v+‰ü®¨–*ð7˜>nÛ²î<ƒaÒ‡™Pt1úwmX-’Ü­F¢CЖQàÛC;—¹7(åÅ–‘ôÍ™õ²HD{Cì,´ÍôÒÚG™$fV@aaJä”5I!C4Ü¥_¢Ý~ÃësØ…†f5¶ž[*2·beæ½á|‚lŠ„ §Y™ÜìÛzzÉ ÄÌÌS)GsÈjÛQÜFI±O@;ÿ„ :Hg¹F’sN³2–8Táø5X\ÎÍA—”®+écÔ"G!£5X5±ÈðܳGòQbe{¬K”ÔÍê%"˜_ 1R ‰0;6’™"‡åîbÍ„Yârk§%…˜¨[û@Å;籉9(¹$ÚwGýê”3¦§ÿÀÙ·Ûù ®!;¿‚+è éñ“8Ô8d"IÙ6/eÉÝN(S!l š±Òyµ§óJCm T} ‹ p޶4ê—£L‰[~¨ÐnK9¦3Np.Yr:ñRŠ¢3œ¢7Rź@³5<£‰†¿Üi£5!J&•¬µDB…{äH©$si­û©Žý#N}¾AéˆÕݹ[Ø–,†¾ú¦B`{Ю˜ Æ1v .³ïs'ΖxO7cK•Lè.˜ÆøöÉV»²éÎ5r¨˜ˆˆ~[üjž<ó"·u|†A çº;c×ÅíÝ 0…lÀ½÷Ѻ+60ÙÜÓëËì©äj£»×ÎIyäê…ºû…Ùä‹›§wòá[Öüú‡ \ÖÖàlµií}ñpóßwòFíç¿°ú” §;pßÕ^ÀõÄåIÁšž?ÓÃ]6Ü[w_Ü<=ÐûßéñFñ†^Ý‚fÜWxJ•“ËÕÞë1£|ÐÊoé±qŽâ…eâêBlŠnq ´§~A¨¹Î‘%°îÙÜ‘**@þÕêÔêwcnÇãÓ¦D.d±;grÓC™sOw€;Yê.)};lÀÎZ7œsŽry¬~„÷G[_:¥‘Æ•É\ƒë‰ÛþÌÝð¯>œô{»‡žøðã÷E‡T>º¯#¿}s{DQB ß/0æz }1O„›Åìûi>ú°8åì7[Û›jÿÍL=/†­ÙBår=Ðããn±É\ýéár;=éþÒ;.¡ w}Ó™†OËçßä'Š0ËöÃtý@½YX@p1,8æ®]8‹ƒß.S䎩1äeó8úcx½Ñ_Ø"ë4¿¸9ŸÞŽŽ²FŸÈ|7Zã5‰<Í;Ó;*îÖËùhþ[FŠ>¬bþ;’LGÕßþöŠ¡¹{ endstream endobj 189 0 obj <> stream xÚíXKä¶¾çWèd¨mZIQò-ÆŒŽãÉ)íWÍËPK½R+™µáÿž*©G7{Æë\ ØÅ4ÅGU±ž_1ùð$ƒ<Ñ9üÏ’ú”|ù˜|þ 9g•RÉã¬ïyƪ"y<þ3,g|·ç(écì¼bZ¾f:Y²ì×tr£‰2h²îƒ¾{n.Ó1z±ÜücÜ* \Aº}—ædó»Î 8º Q¼Ä( ê_ģ¸3(þš1dÚr¥Pê¿0ãØaôŠÝç•v)7¯J¸M0NOµimw4Cã¿ ýL ëä8Dj3˜2'¦Rü>¤g˜¡qÛS*ÌÖát´Ó¶v|G&òâGž~gëµ <<úbó÷?ûÁðLåf}ë\”Xk ä Ô…<¾db!€gcÇ”b\oŽy‘Î!ùsÓ™O¢*XUm¨üMD¶9äí êãt)ÍÕч¤ã*=à„Íð<,/Œ-.W»©'@G¬â|8â?B³à>GK¹À£1pt¾€_î¼[ ^¬Ë›žËª”—é)àË&Êé ¬#ÔÏeøø8¯Q)ÕœezíEàqµz2Ø!í)…`M7-èÐç®÷n6¤º Ö¥Ú%$§ÁétŠX“™cŠpÉ”XL~=› ªnL@¡3AáB"‰q†nyk…ÊãªêÚ ÀÜ©y¹ Nj§N®·†&Ôš$3;κjŽÌ&ÏõØûÁbžîè]d¯¶%+\ëlzªðÒ¡gV >´oï=Å8CM÷» Š×^(%78¼ðÿ5ˆ:|˜ *CÞZL×â Ÿc¢^úµ7:ο„Ø ݤOIàù-¸¸¡ 95L2»ñk~áÇ­T«ë’T°e±`½*M¡x]Õ,qÇ/(JÊýÒRÐ7+Ú ¾ÊóSyàFo^ï%"ùwR¢Oö2ƒ~”'§DÓów›|—|{ nüÐ$Ùdw€,ídV9/Ÿõ°8Z½ºåU9oåæÌ›¯‚h„KQW"Ø&àdu½Yç±^ˆi‘p¦)Óíõ-ažc:øtÊàGœà!§³º‰CTÆÒX¬³œÖè…tÝÏbßô\ &‚†ÊûRŸz(2 Õ=îXÒ̱!80Z—¬ =MóĹÆ¤Ç M?EÊ¢åªûÁvŠà<ó–™ÔëC·íhcsV­3Àó•J«[­CÁ)î8¦zUí"YV]hÿF)'»É,0}]gièP üžšñÔÓX×2!kã `P®…c/X9Мô t†Ã\÷i‰º=h•¡²+T½¿ƒêþW­ 4)¿¥¬Úb/5€¯ Pó7[1ž’¨Öÿ‹n€Å6Rpý¶ºÀŽÕ¡Ãn[y†Þ(dá+ ‚|4C>ª 6fX•¿"ò§U””_AßÁp}µVÀرúGžhËu ÈÕ›ˆ°SYºÀr)¥çß]b„Ýó|Ú?Á:hŽÈ%PP§ÙÜ ®™^š¶1ÃÕs­}©½Z3©§¹YC:çÖt~xBߦ‚l]Å…üà\’êïÒ®Nçùzçßœ±‡EÞSíçc Æ“*}ôጘ¡÷¨à âÐÌ@€(¡ŸÖ—ûOÊà,ØCç+ õsÄŒ«÷HÛAªxjŽÁÞùC*ƒ: 0ŽYANÁï<~‚¢Â–wqvÅoa—ÿzv2ÎnùõÛµäÓ…—w…?Å̓Oªóž_ÂÃG…µ[åJÿßh¿s£}᣻ù¬ˆ> stream xÚ­ËŽ¤Èñ#%maòÁË–|ðh}°Ö’-÷ž\>0Àô2¢ ªF3þzÇ+¤²zºíU·DfïêðëAøS‡\Ãr¨/‡??~ÿ{PI\&åáé¼>á$;<5ÿŠšqhÚ㿟þ @ÅȨØŠ0ípŽiUM%Êò¸Ì 0Ó0Æ™%`% Ûmœ›ÃñCà¸,V™wšz|šÝœ¦ßpÚIYO*˽G¤Dgq‘=¾¸}xñK€+-ó85y ˆ:® žqÅFÝÐtÿ©x¹•µoò”lBÞ ×"³š®>¦C ÉcUº+ îÛP )__¦vîÎ&3B\ãç®æ;ŸL–Ä&‡‹¼/âøõÖOÆ@ö‚ÜÚº;'ÆÂZ¾ üÄ@ÒSœGu7UÏKç¨ýëjw<îZŽ?c¢@¥q‰2/âÔÐùVyx’+âÄ”èdTéø{mü)ÒØše#Yꨯø¹cOi|Iá’Š^nmÓ2üu¼T2‹aͽëIØ4‘æÓ8]ÜêÜ=ߺ֩ÀœÆ© ¥©ŽS}8Ž–Dmç€Ê P;.tC ð3qêð!„à¤ulKâ8ª:€£ 5hh‰OÈÆTã< ø擄cð)c“½ùýöC¬F.gˆgXüDŸ²èƒ’Ç$‡øb‘<„ŽHñír>¢eèâÔ6¶©'ÎS ®)ÛÊïCàÒðZÅ¥i§xý}0ð΀hPØW¥ð†`¿#é,¶o?C¿á 0|}'PzÏ×`8úÝróI\–;oo’,:›4E/‡Fo’bñëþíM\¨Uz¡„„µ:q“äìapà{)\AŸƒOð¯ŸÁë <“PÁb®o×®q›eK/ó— ñà–¯Ý¥âMs[‹“e$S¹ŠÕ»ÂBÛóÓ‘”3I°òñl¬š»z|àðì1r¨ˆ6M®/í4âR¾^myŒs·N~ž-ó`¢€€÷nœp}dºyK=vCÝ5Ý䦃²é.í°‰œx(ªwWDÜËC²?¹/¼üÔ®´Ø¹?…Jèâ6©Pdî‚¡!‰ óšê8qžî8w3òã+é›N"uºÞ^úqFëÓô†—7¬ÅémÆ ‰#R:x¾LÀÍI&yøíX2e­Ь³| ߈Îî‰&ª‚îÛ¢'­<[Ýÿî²½›°€M ¾a+`Ò˜<ú“ƒÖÛ©5@‡|)¤+Ù¢œ3‰‰Ííómhdâ¸y9Œ œ˜ª¹ä‘LQ.³è ™Úšá?»ãÉBB¡â yÐÓÓ¬BÄE9‡MëÃmÒ_\P¾1Âlš‘»@àŲƒ)!wë;mßh–2fFKíG&ER6¾Î$÷ø¹žÈD_0€â|²¯$ÛÊòB¶ ÀI gÛWìkZL`OY–0ãÈ‹ò“ƒ¾r/Dnˆ‚‡LÐ6åbˆ Ú@Ûüݹ˜}_*–ÇYöÛh Vã—d¯èÿúß4Œ@t )ÁàD01ûQçkÇ2¬.¨«E$uIçÅVø^p/’häGÕ?st.Ô>:Ã[ÒôèMª¦Žâc^òN^ä‚oÙ.IeíœJ„ö¸ 1ì j €ÖQ¨¸ ‚­àÞ½ñé…ãÚÊm¡+&ÁËXR­¢Ÿ6-SÍÞ&N_M–FPñÝ fº) ½€z†oÒb5üŒ¢°Iá-xQÙF;›9? ˆI¿Z즲&±ijºá¢:Iª€…/%󉉂q¢ønžý˜1äÙêÝÕ« £’÷åÙ&ÿóìtS=’‹òõŒºØ oA¯^õA&à´#$bJ~ýBÖþ±‹øÍ]†L=¥t±€Blæy=^äÍj·.<ç)'àK|þy5Œ@Ë‘·îïežWb(މFº²?úÜ’ñÁBuûÚõ¥q0£Ì¹@ÛŒ€7ÔWLÝ+žÉÅ”´Ipðå˜Büœºêcßò^ô_ºæVõ1†â<ú‰øÂ°üÞ89«ËHØ£«æîy¨ˆ‘Ú^~ônîÕ 0çÖ €0îSƒÔ b¹¤!µN›7* §>ÚmÍ ¯–¢a%üÊlº¦SþåTI‚º§ ¾ºq<„ Ä}ƒM–êÅ©™ûß$ÙÄ@•Q Ê–@5?(áþŽ˜*Ê !ÖLàÆ§ª«jâô9…‚s¯ål¡×0]¸d €^ ”_ V»}T¡á`™²‰1$Á˜:©§¢(!;Ü-UÓóøƒØØ¾.Cú!à4£æW¡ø¯ƒÃÕ`fÔóÀ³\8ûÂÇĨ„’¨šPþ—‘Òx­ãó‘&J–ù1çƒàZXê®U ²35nur!C±&Ád¥G|u'ɦäÀ©$þvصrçEPÆP6WkôÆSCÝk¤€»µ¡ö5˜ödÉ› \ƒ$’JkJ-xa¨x V|Wõ=ÎxÒ¸r JÞ!س§òPÉœùVd}úvcy[ÉZ¹ZU£YC”œéã–4Á ùrŽ}Ñ qc ¬P"-ãUð3C=’<ςɹb\ã&Ž^ȱãHãú ŠðÔ¬¹ˆÜ‘‹fž¾¶î›Q5]»úÖSbÁséYL-J]ô‡_kŸ‘ÜYàoM`©n‰µ¹,x5ÇüJËÑ*»*¢U\Îà“Êvµÿv†àw “²g‚wäþ•(£™^òÁµIˆ.«žw§²à¹}؃Z6‡­9VÔ®¢®Œ$¡C#[V\ÌF¹ÂWnÑê…±K“w–'9`|ãzK»j×쾘ñw­Ÿî¿KŸ°ýÍÄ¥f–èì!´ÜqŽ]Ì{É'w„H>¹õ Š{Y”…Ò5”\TÉGL˜‹î¶"§Sw¥Õ<`7†Y½•2 Fà]'¬_ªùêèêy 3þ* ôQˆGjŸ¡phÆ?~‡s)öGì›9·GÎiq°øqxÿMØìëtìq“KÈ-sáZ>.ß#’l77wrnbö/ì‘·z p·;sáíËŸ7ßV>K¶Íß(®ôugÄßåz–bãëÍ\_ÁI_—ø]›Hß}£À¥yí ó.qÔͦ›v“ ëey¼tC7òbãVçÛÇM›“àŸœÅ)mj2#¬åy¥_'ÃE ›¬WºÖd>fì]üÊÆ|`¶ˆÕ†Ä*™ÉÆ ½’0QÇW43øx¹D«tqþø%ìÒaÒ{J ù¦æšV+cp ö ÚRÍãþ¦Ûˆ¾±É7@?*%ÅÝ@znàžÛ„„ôó8=ðóT1K!u]üÜ^¸ÞôzÿŽÓü9Ðàʵ?oî¶ñCýÖº ßÃd¶àÆQâ@ÿñ»ÿhÕ^_ endstream endobj 195 0 obj <> stream xÚíZKoãF¾ï¯Ð‘ÄûIv{°™C€ Ö‡¢h’vhS”‡”‚LûßSÕФZq&È!h²ÕÕõúª‹Z|\ÐEt‘2øOÅfq{¿øæƒXЄèD/îT-1v¨Å}ùSôŸ*o—1ç<ÚuUoŸŠmû¼o—,vÛþÛåÏ÷ßJGd”&Š.b–. ™?‹7£„!O8áßn‚œŽKæÆC$Ò‹0®Üø»ÐzA2áÆÓ7®÷ûëÿ#öž®"KMR~FtjºoOˆmØöÏŠmÑgȆg,¦JE̢¶ ‘c’PŽõ2DN&®”ãI†”s”F áYT=YℊK,É«Yb×°¤¢ï¡It”wA–R¢Ø—“Ò•,Ý<„™aèæ_Œ~• yñ| r”ÊÿrŽæFôÝ2Ö*‚XâHôHF2lB§Ü{jb1Óœd¿;áàêR\¤s?Xr'üwâ"@Nš©Ï TSЈ©xÖ"AÆÍ´rÛ–Uˆg„z%ÜhapËÜø§°^îBëa~=àT_÷»Ê˜Ž€!ÓÒx·m¶½}[G}Ý>5ÕnÛV=è9æ" ïLSu0 ÛðÞ’ÏöÆM2»5Ðe³­Kó¶^’e,îpQ¹æ’Ö:n›ÜÙŽ”$á kN¤ÅÔ¾~ÚוÅa3™EÕo¯°²^sÅj×mYÿÎL°ZO Œ’Á­ ÿ¯†hϬÅVF7+Û®£çÕ Š_üà­l¦ÝwÿÊh¯c;Ñ3;ñá²’$õ¢^…Öƒª¼™<¿m¹^/åšp57R=5R7Üœ_Ýož@éTUT=±ú† fc¨Üy (zß~܃®™ÔÑ÷ùî—ºí¼)µ[ÛbŽÆT‚1ͼ7Uû´Ïá9ž+ÛUºöwù&/¼½àºWh²hÛ SÌÒ¢*ë±5…9ß ;Eôšw¹]Uìóæ#£[fÌ0¶çðåÈl½yÊ™yb‹ŒáK ¾¯J÷X¤š‡}›»žª/ºúÕ2w (¢¼yÚv(Ìݦ.Üä Xûu)% zw‡“‰ˆÞ»Up’]]웼[a‡ñºÙ>Ù°+ŸèhOЧ 6Ü‚vî™âpôƒûzAt5*{zGæWœV™MrŸ„o¶ö ãÀàÚéij„°˜¦DjéÕÏ ›ÇÅ ü/ïÑ3ß“çH}ˆ ¦!ðÄé,Ƨ³ï}»z®ŠýÎ¥LhôÑža˜…^G’‡gBÿ/Aø•„gç€?%,½öü·¡ó³Cf0=¿N̽ Ï/Þ¨°&¨0y‰ß¤ÎØ®iv¿ùƒ;(OO”—K™LÜfyB(eHªÔ˜,dË„ˆy’F8“l,CÇÉø†CÐÁIªæ±ry%Bœ…Ž˜.-?ò›|;fXcì¹äÚ¼ôÒÁÔµäbÞc^fc N¶“šÃì“ û T!{;ÂŒ²¹èdFTäpô ®FzGÚ!3Éø£·Á£Io¦£4Ér ‰‰ÑÝ(Ÿâþ<Jžì²‡5´¯‹ÌhA’ôL" ÷‘켚‡ÛÁ©\^Ècå……W“_X[£¨ZŸ8—•µHP?l¯Ç*ù[³ùÍÄ) `e –7¶µtá¡wmÕï0Óµx»ïó¶ÜÚ‹½Ù2¡g™á4‹~À7—¸ä¹Ú€á ˆ+À8%8>)¼>î+ÏK½yí Á鎱ÝY"°I ¶£*X×M¼£³G}»JŒ"ÕjšàŽÓ|ೡ~jÏ‹…úlù&ÐF«‡‹%xu®›AÖl'tÀ9ä”=E‡Ïbá„ä¸óJÖôT£›îP‚Â*‚‚ã„ÏHš^KÐ]¬¨àDM.V_Ew‰àÃWѽUtÅ?Ft¦B«±BS–ѯû·Êî!XI(~¡IPU)5iÒI3ê ì Sû|Õè/¤þ—«f¨Ç”lÿýÁô,º"dÔ,ƒÛ°¶¹ô1ßP)MꊳmVi'B¦Zz*혪d·.‡îòbR•ÝAO™ë±:E ʱý~ó…*²¦}ý©^ÁªUós0"€ù¥|¼ý¹­öW”×Ð&9”ú1AÔ–%±…Ë^Ï6Õ+Œ"Ñ‘¹¼í7¦ø —6ìÌ"—5Ü_ûzÛæ]¹µ¿ÁàóT›Øct0ËíÅþ“¹+ôöu’ÐcÇP²G¤“ Øï›]>Êô3=¾™äšFa)Qüš£ÿD%;=ÜôNT²Ù•ËÃå­ÏU²á)9Wq¸@¥­©j¬D'€§"ïÑytb=zÆ71è6B…n? Ÿï¶]¯P3Ò^«`^ƒ@ææ¢Óì•×7¶cP©‹¨Šc¥r¤HÐõH•³;›óâão(GÖ„xaÌE ¿ƒÈP¦È1x‚î´$A2ëLÿõ³(¿>W3ÇæW7ƇIŒdz^Â;DùZÄÍðmô°8¾ÄŠ£‡Åœ0=ØÞ½À¡žWDGÜH„¹“C¥$Yô®9&’JåU4î¨(5ÖL²ì|XÎâÕd SÒ@ô1Jx†p‰ââR©¨ ‘‹_­¿ ‚•b$¥s@Ķàyó˶ËW¶†Õ[àRÎ8Ó#ãTÇÀ¥> stream xÚÅZKܸ¾çWôQ LÓ")Q’fœõa‘‚ø¶³$O4«–f¥î “EþûÖƒ”(5{lc l@Y,‹U_=zv¿îä.†r—)øïªãîîóîݧd'cQÄÅîó˜>à‡Ù}®Šª¡:÷{•E§áfÐÆDuƒO‡ýAåQ=ðç¯g;ÞtøŒ£íÓ$*»aäϱ™ÎÝ©d^ 9V§Ò®ž‰g3–U{¯î-ˉŸS{|îšc³bÂûÉèy´«ÓÀSU9žš©-ûaÿóçédZ¤)ŒöÖ:ꆉ_ü£Ú¡‡{È©­†é=1x÷IJOSR¦"•»ƒR¢ÐÄôÖ’¥>U, lÓ÷q¬‚ŒàMZš» )Tú<>:µfâäøsxTÙù/¡õ©Hf¢É"dûa`+Op#‘}ÿt:t¡´Úí°‡•Y…õ®…NÜN£‘vúšªÜ>·‚ªÒ"Ö_;«“Î(ùXœ1Ä-:_Îu)o&TþòÞíi¼U¢ÏKÅBfßÈìc`}.R'Ëch¹gîn|ð8褉aŸHˆìàh   nðN#ûÙ§rÄסã§À—{žl¦“%«Êi°“]ÉCÇv:Ú׿ßÏ€+*p¤íëö? ʨTGŒ)Æ{¦nõTíC;Nv/·»ÛèË0ºÆ`¥­ËÙ‹•Îs¡´æßnAæT%Ñ=ÓèãCÊò2€¼ à°§¹QQÂ#xAÙá|àaàjò|ãþ^ZdÎûoB‹(ÒÙ /—§Bªo\þK`y!fá^BË aû.°<[ü½X9ÓгNÆæK36}Õ–5«)…-ra´J Dõ©©Î.dPìÈá…¦óh:Û5ýpDЇ‘b nÐòÙ,X‡q€÷´ñ¢I†‚{Q¥oàrZ s@¦fä—f²‘ âZ¬“ …ÄÐŒæ ÁñØ>µ}ÙÍ1åÌ `„F‘d›ø\[>Žl,_zÖ‘ú©È9ðÇy*kË¥ŽvÐQÖñí[;8¯ŸÎ³íYú~–‡UaáÅת+ý8Zp1·ìïu¦ìèð@ªyj(lë$Ju ˜Ú¡§Ä€VÚ—u4å#zvï‘×.'…©³Ýá¹1’›Óh· 5p(9½ÝZ*)rå»5ð)ìØÏ¿µìÙmÏÏ[ëé÷ÑÓÍ/¾üIÝz8ˆ *NDìâ—`¤^DPÌD¤Î;>„!9FÐ;…"²¬ï0Ìj ³lJvˆ²Z®ŽHùùØô+`J’ë>ƒu¾0 ñucÓ¾¡¯ç}k»ß¹·Ô[Ô«ÎeרN-ìï's|1$4\4#v(^CÊàðïùJvãtþSˆ^îäÍÉÍÏA|ž3¾åC&…Ö |Èä¬I¢" Xø¬Û'²~?¶ ãS ·r'^â…úF?F¨Af ĵý°çk»eW. •‰N#\ È5M°`]èÜÔ´'¤1„ŽøbÁlèI*X»'oP`§ed.'<,àQ®ô \¾Ü)+RrÚžÜßl¶ŒÈüp ꘔê{¦U±®j`…Ò)éJiƒe ™õ q n&*Ž p‰ƒ;~>—v²sôü¤Ë,-npk‡êxd)`ñÌÔtM…¤åxsyŒ•¶ÈKÁl ÿèP ¡xmDìŠ>`Íf¤ÃéüÌ®l*ÀËE±¦ýb ¾-W ™ËÍøÛ"oyj§/eEaÊ`ü=•Î$c…ÇöNï©ñJLþYD[“9½vÇÎ1 %`«çÖ«W$6‘[orÖp(ôé*ü~Úƒ|[:È$G´óvcÄråæ•´3™ÞæÅ*³K‹WòFx“Û¼±ØÌëWGo=%ŒI,×ßÁs°€9>ÈP˜–h>LáXgZž«;Æ‘ ¢™ÄDµô5•"lP•¿ Ü} ’åt„UŽØn6mMÚ@ʰ‚Ù­‘é‹ôP#Ö»j­ÐÅЕÉ:kÌVy‘ÌCÒå¹¼óT‘3+l …jG#òâu»»ÎÛ`¯¹ypÇêŒ&)Èh¦žË¿"±º"ñW›H# ûVÜof©Î_®0PfSæ­DÌfÖM¢MË ;^¯]¡,–FUԂר’CK¦µ¾D™€¨o¼ÅÝXËœ~gÃd£s4ºwŸrTÁ‹Ì¾¬ö˜qX d„€]r•×Ts½™9&·z0…ÁŸ6øÀsJ- `”¤\‰¡*í:[=Zˆ•­å€ÄEecï±í±Û’¤J¹²TëðÍK)y:\f#§ë0¥™Ý6²¾]+`bæ±k]͹;%áÞD6ߥ÷ƒG ùÑ ¦n° æü¹È’­Ã_ë#;‘‰ÈÓ?B¼‡ x™0é×ÄKß*ž)¾*_UWäËþ×Úûq( ؽ•+|­€ãoÖ[ò6Áš,äÿ¥±êŠ`sà F>O®kmgóZÛ9d,üFê_–nsbrî6OöƒûÍ)¦P=Ø ÞlH“ZWgÜþ–…cØhl§SKݪ-O=×@øõ“T¨š|&J,Q :ƒšy"ÌÌ•­pr.ÜñI`Ÿ_”¹ºÈørÉÝS˜úg‰£/ϯÍWÒPƒJ³ÂÝÐ’åù ¤n?ϸ.”•Ù)xeh+‘TLi «Q]½7Å¿O;Ò?ß|çÅ)þ™ ù’Q‘+„Q—¿–Óª‰W=° µ,Êî&m*-E⌿°jùIÈ b™Œ$Qÿ ¤HŒÜ)gŽÆ\ÜÏVô1ö÷y³M^¨³ÅLÏÔ܇øã;66nãô‚Õ…aX)²˜dž*VÙŸ/ÿ@B©œH&ɹjPŽôïú§<\M endstream endobj 201 0 obj <> stream xÚÅÙnä6ò=_ÑoV#-xèr6f6Áæa1Þ§éV–h¯_}¦™wD‘å}I£¶~ 8U,¨Üh,:XªÛÛÎ2 óƒ)ž=Ì»–?÷µa$%#±âÁ÷}ÇŠ¼äíz¯bu[-Aµ÷ XâY½Ô;X‹ãëÏ#£¾Pœp)‰éé¤)ª}¨t‘o}¥´g•Wç4š_~_!ц ª¦¬~›Ä,âIMi)‹ü}ÛôU¹W‘€ÃfG¨î­ ÚŽß¡ÐínIN{}u;VfÖ‘Rò9Î-o.E¶ð¹D¡ØøR‘° ý^mýHFp”Æ·;÷ÞÝîË~»Þ|Ç›õzùý9ÓðïiŒhÈ›’&_xûÏ~Ê»³?˜Éå½ðÓ$È"bÒòX¶ Ú^%©#‰e‡•Éü `MŒTOy«Æû„“ršÜ£çÆè¹DÅðúȸgOÇŽéý“1•¦/ºŠÌW,™»Òv`åh8 G'>fÅëyíö&õ`Ëx6xo,Îü ϘŒž,㌊ úIe–ü}ÞááTÙ€˜á±³ˆÅÁ(Ò Ç#D‹ý8H¦mé:3Åûo]|‰ •¼N_ŒÄ]â,H㥾ž`X>ÂðÞs±¤©àÌæ}·õ†/.lpyÕŒmë? dòBù߹䗎òga ’_¿Ö`µÓ`Ñsü xïfXŠÇ –%Kƒõ•“DŸäeµ¥vE`ä"˜ÈÁc„НÈ('¥q°ç'Å.ú!o~9"õþ㤡Q ÷8X˜z¬¨7—RÛ€®LÊ ‰7 cB†iâ@«?ƒÀ-W\ üÏÐé*p‚WfÈ‹m$æÐtjUˆI›ß‘)¥Ì%)ZPYò¶Ç¨ƒ)4QhXÈœ"‡gÇ¡÷Viˆ–zÇÞz2ž+ÚCË‹MÎHPÅœó£ãVî»ê5PÎ|ÙÔn±.Oâ.`ë!_¥ÑuT5õQuå(*é2“Þ8#ÒÃß{Úå,Y¬ p„@é°„óÊ?àXv9*…‘?sVÈIrÚ ”ñýUÁ¢g‹Ö‚]€%áµýN‘Lá¥úK¦Ÿ ³§&{{Ý¡£=i1‰•ä3r)ìœôt¾úr²,JùËB«— ýaëgXb±5 §Ôú!#9Sð‚ïÛgÈž»JM¸øhn‚ž¦Úè#8¼@g"n]`¤¶ ]¶¸l›‘hÝŒ 4/× vÙ`e$1ˆeáL+ïǃ™ð3FêY`2´‡ iM¬þ²4”œmçÊ 'Ú/¦Ã¤Pæ%MZ‡^4èmÒ+u2WÔÀŠÓ›­ÚdµHŠø­Ý ¦R{$mÛ.¨§ò£³ §èììˆ1Q»ôï&wÈ$Õ\W¡^·¶Æsí º°ä" ‡[–¤›\õR:aBVUHÉ'¹¥[Lå—Âæ¸.Æ:ï&XÚ_g'%Ñ4æ`¨xÇîÓ%C¨‰vp¿xÄTU 1sU´¶ÙHèÐÏë@5Ï%®R ÆZ“¶ýa¼§& b1~EÁæÏö@í1—›“žóhËKÁ]K….Æ›V9ãÁ6¾pMxõë”k¸}mñ¢d5‚Fü(Ѳƒ¶½—H;&Aï¸sd X™j‚ãGÜ€ÜOkÖ’‹³1ŸM+Üäj0]^›s)øDæ Ö´>]î²Ý=òZB/4긬Ò{8ékPÍc€ äd¬N‡ªhaAØSŠ *qÜVj¡OØá pzü±ôýÓrjåô©g5Tæ;ºä²2;émCnCǽ£ö͆F‚l‡îØ Ê²4}ZÃvŽG¸á¨GÖK_õ£—~xAÏ4½ë•%¤ò9¥–½'¤Úåy~¶ßÚ I¶úVìή¯¯§5ûäâÃZQ°æz‘P¶)9§é#y±+äg…ÙW*…%{>#ZÈÿãkÈ-ýÅ„>~ª@È»oÅç×PüÓäD ¾ _%=Ë×Pv^·³ñû@,L/fÀÖÕlõ<áîø©íãù¼}ºyùïxâE ]üŬ÷fhoè•ðÿ™ù»5_þ ¿?žñÿ)'>Ö¿šbˋٮn˜c~t\ñ;ü×LjþTíî>ÓÜÔXYýÒPV77+°¿U¢E¨{±T{ô’hcSµ,†„eþÝ:‡ È0;ý¤~_BiÕËâ‘àêóÆÖ¿ŸÝMgŸSµNé)26°íì:áÎþäÇ ØéyÇæéf†ê‡n¬:1Ë÷ÇV‹Ó_-¨d½5 ÊYt;hýË)¨Ré£=Ö #\>Ûr¡«ôSÊä¤_×Ó+SA- †öcM™Cª ô_ßüÐ8¨g endstream endobj 204 0 obj <> stream xÚÍY[¯ã4~çWôí¤ÒÖÄ—Ä âÐ"xAž(9©wÉ*M¹ `µÿ&­sÚ¢­öhíØcÏÕãoÜÍノáßhñ¦"«\:d•ª5`â-‚7°Â.…¯Ÿ M>™îX nÄô8¤eµ¥*‹ÇµÓüRWœùc›$QQ‚/’–x—í± lçÌGÈ{B (–g§ô©âÜZ¹†¦MKK·¤U1C·ZCI‘²<›[ªw ¬£­‰ èÍÛ±9¸Aïè9ûKåOŽÖÑ`¼úÞѸ&œ“D–³4?»—Ôâ8OWÈ!Èð,fc×\O‡*ÅŒ9³%N(Aò¨,@ý$†Ór—´°„üsÑ@kDðmz‹åé¢äy„OkC±u”¤¯¥ê:“ ç à;a7w6cìá[š4a|õÐ@!®B@pÌ-îü‚7!¨”’Ñã6³i†Éú‹| |~·+yìE›© ïƒy¢è’ßÞ+‡0t¬ú£KvVĽÔmI ëL)ƒ¶a/–¬"“LfSÍ*ÖkÖ¦ÝUà¿'Û^)Wm’ÕšrªNÏÊHœ± Úe‰´§2çѿ؎͒^Oô3ÙˆdO™z67gdúìÑÂØ‰wHö Þ5EíÁ` ÙÖÞÄ‹„Æ?Ïü8fœgm7^®2µ9:n뢷ÒGeeõpëÜ}èhZRâÚµ×ÎÏ˹œår ¹7FUv?îB[z?—äýüÜ H;ó>Ì“a¸w :ƒ×”éܧ#›µíf‘_îú6kR»xF *{¬DÂâ_#¾¾Ë¤Lñù²¦=>Ù7¼(púBí—+OÕ%Ø“ˆ¢>ÊEz3ñ©•Õ%‘“™È7Ô¿†J‘%,Cݵëyé‘­TÎã|òø|O™1™ÌŸÜf‡b„=ùK*oÝñ?¬$†ËD%£0,øNï,u_\Í*•Ûãê¶r,]Ô+7*á(IQ²ŒZ¡eJ?>! † Sú›Ý‚@oVo|ƒ `¥XÐÓÈìZ²x-aÇ>¿ªXžeNœ:+…p#DAj*Ú†Šž*!Ädž¯ëÙú€ ).åëiÈ8®õZ>¬ù"‚ŽcÂ!ОmCS“žøY¶USV‡ªóŸ u,0uÜìí5u–‘N‹)? GZŽÔã3 ÃtÑfö¢-æ|c§ÌÅ/`üíí1yû{Q&•IuÛY€ðf^ÀÙé‰^8Ÿˆ³Ê7' ¿ï¹uº±…§¡àÙ‚zÕÁ±œ•wÀxt„ÇʸlÓ®8xé-\½–sÒ ŒPùf XtÚf¸öœz´$XÚO˜E­c–},b€ƒ=4 LÛÿƮ± `øÀ`¨Jªaü i ‘®Á~)²•ØOÆ…•Æ>(À¤û9åÜ•*Œ]zÃIY>%s&1­°¡bB™Ü²ói2?'ËY&e,XI¥Lz4tÍÊ«µœ½+=ýuí1vóëOÇo—¤,æóß(>1uý‘˜¯žÙ]ª(v…ò¤?~ö3úg¤ endstream endobj 209 0 obj <> stream xÚíZYãÆ~ϯУ„¬Úì‹Ý\Çybòâxä˜U}lª¤ÑÆÈ‰` ÕW]õUqVŸV|UÀ?¾2þ«Ýqõ‹‡Õߨ/XUT«‡0½Ååêaÿ§õ¾k÷nóç‡_Ã"Îg«¤`\ÀZ\tJ äÊ°ÊøiV)8‡•ʯ(âŠ9ÅŒ\+ÞQDJVš»ip‚†e²œh¼R4*¦"‰Ç‚—›­4#­ùI\0+ã¡ka”k÷òÜ»¡éZ7„v#Êõùø(5ï›]íGÅúqíaþ‡VëúÐõa‚V-·š)›3e¯2•¸o»@bï>l¶Â®]ø9¸>¼ì\ß=nØf«”Zÿ¦ÆA³Oçv_‡»þ_A¤çLrP²dZ{2îÓ¹)4Há@ZàËY≇xÂsß]ì@a” Òâ±W´î•I*’ú¿ùŒ!íÍKô°Œ¸æÌ¢@Kú‰ï’þxÁ ²ëŸS, ÉLR>åß`Ä2N¿‹Z=ŒêøË”çG£§:ŒE….ôäúcÓFïºcÜ44Og÷>RÖs¯W¬`<…¶Cú)gü‘*Ÿ©’"R²"m¯è»;Îÿ•Ø^±"Y^{þ‘´;¬¯Âš¢£˜PwŠñiwÎ4¿#ÈÈÌÐ ø2aÉOI*ðÆGul%Ÿ]ì/7[]qaX© ê:#nfÄ ¡î•RÓZºu„¸[QœRT ù‘× ÁÈÌœOoxí{âÒm%\Kð˜™óÿ2Þ£îÔÇ‹ƒ"×¾{—.EÉJfí•€ð³_@Py@÷a}ü@ø_ ü¿' ÿª€ðõCÀ´oà qKµº`<’L1½Ùr.ôúë àÌ?›vßü­Þ5²”-…5´Ph¦mÂ[Yð ‘ÐaØïgüÑ0³¸ï`k„KuߤCXn¯¸óxóä0œ&„˜[Ï/à Œ .1ád›ÀR0Ú÷È0ê÷uŠGîožSèJTúð¤Ë"˜‹¸ùw~çvsý‚åBuòÛ_Å—þé²>¥Æ²]ÅDí)§p/µÍT¬äÙ¶w«çG©ø z?Rp¦Dv¯Þä¨1)³]ì¦Ï È)@&ùlyÍgPw½¯‡ÛnjüA¿‹‚~ñÍ“—H—½m£‹õÌ㔠Ϋìz‡SÞüÅa©ã p@1 àèj<ÃBFÏréÙB:â") 1¿$0ÿéžׯWïXBùLØŒ¾\Û‚îÍÜ·gõÎЄµè »Tn)Áñ*“Dc¨š1¸S÷‘Ð&ØY˜+ÚÜÆ«›.Eƒo0ÿ«8Üž}Gán ®Â£b•¼¨Ì¤eF™S”/)Tšq=·’ª¢•÷ÜJ05ÆŸx»a(ÄÏù°„p žûóÎ…S ,Ö°m—Ž ÃXâ1}çÍ.vˆd½[Ï#Ä–CT:+H X´t%h—ßÖ®–™{Šõ)FVïxüº·ŠeÅÖwaõÐQ0¬ÇÍ÷â éÕ÷C³?ׇpLŒ®ÓÍëC3œêüJÌû ^%_ø´×äEbćGäöƒ7KâgH€ç:„P¾{„Üõcìå5¬víÎõ³åñªõ13ÀQÈAôŽ¡B”KÙe^‰à!qY‘Ç=õÞP0ƃI`.èÅ^ØÀŠ¥Ða° k6ðÔ’ 0T:²qy,‘?‘éÁ‡‹+‰Tö|†%¥O¾=ŸÝ锬÷§¼«®Ã{ mV߃ïÓ¡ÀX5Ŭ÷ÓÞÒ}i(Øð“¨ùUØp——%Òä¥Ée˜35Aa;£ÒRòhìûÝ—fYÕ†o%\pºn©ÞÀ§Ië_R]XßIïVÏulQ½P™¶`ÊÌ#™µpmðYeG‹ÉüÆcâ‹Wîݦ“¬ülƒ««ö†Û¦Ó²`Z ‘ ˆŠÉjÉ€ºÆ…Õ+fÍÄ@èß‚ðYBe]$®fï/),uq‹OMø{…ì"#†ö)Þyûô•¾xÚ\:Ù¢Ñ[-r³7 <÷ÄŠÆ·2ÀÂ瘞! ×ѽf€4c™ \N Ú)f!õáÙGTÙ¹jWEAΞE:Õ¥.Ô…¹} l0·wxhá AÖ¨ºA¡£;Ñ]ïb¦ƒÌðí|¨ãø<„Í6²‡ÕI¬@º8¹@H]ujÁÔà°ÏûÚ]o†KüpàyNyN©`ð¹ÌsØ’G”*CžÃE1ÿãXBH®P;"˜üŽzjŒIΔšñ~@Z—°Yz ÔÉ:à-62ŠTæœ_úÒ|f-ª©•²hÊuSÒT“+‘Ž[N ”#yåµ½ðÜ”måè®cÓƒJµ‚úo6©^.Cj‰³—_¶ÈªîÍ¡/Dä,ðCÓDèH7³ªj"iÔCƒ÷¡z!˜)¢ÝÊŸ'Þ(P.eý:DPoCõ dað{ìáp¬[Ÿe}…ÿ¹Ú2^-Ps$áp*o+=q’5D£Á„ «" ”¾ ÁðšµE0¦¶iE|Æ’J©qsŽÒ>R2¨À¥ül¯þ'éöR7p¬ˆïá 0"Þ#6ù«ï½ÄÚ\I‹!y^›ÇïÇf˜…Õv„ 1Cφ·ÛaZWh‚Ô3×ÚaŒ ¥Ã@}p?¦'¦±aL÷R°Eo½i^`OŒO=1]T©K–Ø ˜0<︨ÊÄì_Ù`¤…ÏÚᦩ/†óEápì‹áØ¡Ž9¿£‹¬ƒ•uÊ|J^öÅÊ7ûbV…ÖêxjC  ö1~ ´<~PøÞ‘3 JDaÍïIf$›Ú9‡Á];$iþ™Çecáÿ> stream xÚ¥M¯¤¸ñž_ÑGZšvðVÚK’ÉaµQå6ÚοF4ôƒf´³¿>Uv0MÓ3Z½'á¶Ëåúþ:¼ø!†?~ÐþãCy9üååðç¿«Y燗W8>áôðRýU][™ãÿ^~ ÎPR0‘,} €%–Œ)l†ãI*m‹,2¿]{3Ôg™ÊÖí4¸þX—ðuëE.$“špþ²ñ$—,Þܱ4¡óÿnÝ,ñçC×:¢‰Ö®u\dˆÃ~Ë®ý<¶G¡£[ç@ßFãA>Oølýïs,U[÷÷7Kljç9‹9|%’`¸¤ŒêcѸeU_LKbcöOX®àVÆio½P¡óèË1QQÑt=þÌ"à`ln…{Ó8|@dqÔîw¨<:«º֑ܨÌa/¹2t&Óƒ„¾9¯ãɬq°²ÃÅ  q7É­C*‹¿×¢)>ôô£„] íËå/•¯YªH»õë–ú9S^ýìxR*þS#òôt¡gLã¾3¿Q¾§„è‹é ª¢r‹nãa•0å){>³220‚µ*-ôðˆ8g7&”[  +i!9Kò¥¨­>”⤻,ܧ¡ï$~ü1‹_o‹Ÿ+Á$1yûdÚ 9Ár>+@§:ú=ÝÝúέ.u­ªI©4úBªBK³'³¥áO§K¥„îìéR¤ ‹=ݯE3l)Pp¦“Y ÜV²*á,$»V©ØP©$•JR©\:4^ñÑaS¥öÄ#XªX^’ßé?2ѳ$L3˜§Äó÷/.Á@®ÿÊQ.ÃpͲÌJ¦Xv„‘Dïƒh« ±[‘ ¶³Lø ´8l¹®‹"a‰ÃùWšocmÈîÅã赑NÚ¸ŽÆš¶4}_ôƒ÷3§¢ÞdÑ#Q¤·¡Þ‘|»• ¼–à1+c ëF8†Ú]?KÅË[}zùÊâbö!\jÔ.§nZÀ‹}})úºxD~î¬ð³ƒ©c·µ“>a|H<˜Ah/L™” ß’”U–Ã:ô|;s¿Q"ÍGŠ yŒÔ:\]~-kL¬eÑ߉M‘™bÆ•Q×;‚Je0EÕ¹~ÓÕ.×ÂÊò¤@¬ŸM9ÞPŠpS „•¨è‹Ò2‹IC+´½Ö?àÐHÝÞ4•8Qò>8ÇK;xfäòÞ~)²¥äó>Ê Á› ‹8³L÷¡ LÖÉSU·Sˆ("øs÷Ð:”t…~W\Æœ›¸ àn"x^W³ê²s‡¨I<\QPÑ«_#¯¯Š¾øLûO¤ÆHør |ÿ[‚(¶Tu½~Îoï7@Û­Û~Ú k,@úâöé_}÷Ñý2¿ÕÃÍÐQƒ>Ž Lµñ.Ž{jaØD Ú’N$AþÛP&MÈ\¨ö¡×*ˆ’ÖA-Ŷ¬×1 ýa³9 ›ë˜eƒ!íÓå§±…‡u6z§M€s®Ÿ"‰§jÇS’„­†tþëÖýœ…$€Lb&‚Bâ)‡Uýúº…[¤sŸ³É ¤æ|ÆaÀùʺØÂ¤r¦Ä›9óx6…”Ì·çªD„ð§\_/U’i¹Ã¨ˆ™æ÷ŒRÙt±Á¦Çh³¥ ”ñì5|Žy¼i´ñ\.yú¸[í%ø#öM::GÌ_§»ŠÈ¾O+B²ýù¸?e©^›³ÞOýûÛ (&Ö$Ûï?£ÿ—í÷'þ'ú'‘ËÉò¾Ñ¿êöfú?A¨þ3PE•å"í¯Ì¿ÃÜÎßQ§þ.ŽË¾†?Êñ[9à¹KWBa\ô˜:‹–*ç3¸ŒˆË~ü2,ù¶Ò8´$»ñ'tÂX|«ªÀ2´bIêr˳¡Èjo@ù^ì ¨ÀL÷¤ªÐz9 RiVÛ¸a+œ4^5š*É©©· ó€ÊýžTË›©PÙ«©-›à{©‡ -—c)gYZàdaXg ²4W?àJ~joÕ¾MœŠLÏ(N½?ëZvê¶lƯn(aA/XÈîÐòß‘€;šnÙ²'Y= R?ˆˆˆnX YVO¸9"ê'Zw§z4骷Ýkå«vßÑõ¦D">ï¯(G€î¦bi9ð‘Ñg ¥!Ÿ%Åz$D-ú—ñ~è:Ô xáÙ+Óø:þ¡‚ì82 Ç‘éÆ82õCG¦wãHíG„:ömô ÊVãÞ¬Úùb û_÷†È#zªnq¾Åµ©·zK§"«ïPt¾tŸ56Œ4š›m zÃáQã·rzì7gÅÅjzÀ¡0ßm̰x–â Šò 3l{„•ù(Øìá¾M·™rÍ„X¥iT SÝyºW'Áœhíµ¥ŽÝ»ç‡jR€ÈøÎP/‡j© l¦nªÆÉ1à»â“c „%…/µ‹Š³x²E4ãÊ 8Å2îcY6Å28šc™GÐ. q£¢»fß»ïŠJë¾æÃûÃÄf²J?ΞçˆCð–3YòZ ûÍn’@Æ›z](‚]³ûS®£ÝÔ—sødè÷s1O<ëp\Ö€ËÜÍps9HLÓ¹GQr’ÎÒ‹Ë…ˆü,.œ{-¢ì}÷êO3Ôü)UŽ‘zÐÿéÿ˜g&` endstream endobj 217 0 obj <> stream xÚÅY[oÛ6~߯ÐÓ"o6+J¤.ÃV`ÅÒ¡ÁеKú÷•™D,%º¤+†ý÷ÃCÚ’­\ê­€EžëDzwëq/€?î%!ü^¾ö^œyÏ^ , 2ïì“K½EÆDê­Îýßof‹0ñu£òbÅQ5{vâEAÄb¢pÊ ¼lnûe$¥2oϼ[EYê}´âxÄé­=¤,t¥wê½½O0b"2âïfRúªì7,¢(ôWÛȯQÁ”¬+ÝÒh5 c¿_ƒN¼)rÕîkÍ™{ö2ó–%¸sÊDæE,‹Í²%ð•Å‘eÀ¹]4TX°$ò8K23i‘ì æ!ãá’Q˜² ýâãýÑkôÇxû¸ªœöIú¥|’ýŸ>Éëêº7 ÑÕ-½*:ðЪ¶î©±°a¨¦èLÖtE^·0ÂiÊÒ·ªðl K(gÖy­îê‹ …A݃çSRbÇö=cÀPá&,g³2éÃë=—FãÑA.å “#—¾ijS÷«>ïjëFÕtº-TåÜ5éŽùd•Í›ºmñ„xFºÊœ(M@ŒLL›&žlZbf¾‚TH}H€Vçƒ|¹/Ʊ`Qd5+*Xö4ƒBx'΢ð‹Zô®šñ‰šUq¡]å…zȺL"Г–}q`;Ka×ÉYöD í§õ=B Ø‚l'm Û¸~I/߃2€.«ÁV•9šó˜¥¡Ë£)ó¸ÜšÇ Ê㘚Äg““.*Ý•ž \̤e‚*†°À’¥Dš (Œ[¸zb!šgôpåœ4»YF‚_•ú 5x,Y<Öƒ'ë@š†£UËsËÌt`rFp Â|ÈžHL:2TBJóPøÇ£P$Ò/Ñ—¦³Wm“0Ct'UvZ:NøÄ!Æz&¹›¸ú2Úe&v·jb3°0u(‹Ú…)´UÔiôeiº¡Í+ÌU™÷¥jÜ\zo¨¶ÃÎÀš ¢»bÕ«bf¡)|aR;7½^iÕj+¤³y^OXŽ•LfÃÔ½ÓÆ+µ¢N=Ô œ¹y½ž’ gÊæÜ¹Pe;%&äÈ[|™JJ#% NÊ$Eí7¬Ã$tuèâ’DÛèÓãMS¬ÜÙéÖøÂ8;& Ó²FE+,pá ]*:s§±`gq4Ö‰«Ú‡ž¸WÝ5và‘å€PU®›­MÑn,7†ŒC«,ÔµEë<"züøZ¯oʺ:ALiâ±i¹ï§`=ñ¶¢–êïøÚž2;-¬˜Õy1¿~?[H€‚±Ž Øp€Ûà=yóö¬_/¸Sà9ipôZ5GÔý–U]Õ_I©%†`~t\é#¼6 ^UÝ‘EEí+jˆ©›îÉWÒî”4"Òiv>£æcÑ]9õ~>/Þ;…‘z›î‹sˆó×Qò¢nTYþU®§Í©½ûòäoâM&J—‰xHaû5Ь,˜F†ÏHˆ{ŠÄtêf œé=ÿihÐf›£2ফ¸½d;í!Ü^áø7b¯õ€3ZUHØ`j^èÆ\àE"ß9Vu£íàæ<´ÏÈì°5h_QèzÛ5}ÑÐÊPöy<Èö/bB>èvÊ…=ë,ŽV@F Ïį;_œÀxo?Ô wÇÉîÔz–Å>,oxÓ8  X Á¸E1J yHRXX[Q@g~íF]eœ:Ò¿õÕ`žÌm:’µ].ÌeÑôÞlüp’aê“íÀ¥£ŒŒÒ(÷Ic5‹øÞ‡Ãiêòì½x–ˆGôLÄHìÚ¾tôJÓ”•m wÀθbpdP1øèR0Gd€Ô½­\Û>*lŸ¹ˆLøº${»ÔäI\/Å{œ½ºH‰#{3þÖø¸ë[Ù¶Tvé@‚=>@Óé¶…9Ú®püu$HO —]Èxÿ;¤©¦ekØ¡4çÄáIáh@SàdÛÀ!{ ¾2–Žo=“Îçq¶ýÌôtB|_²K)˜Ø${h“¿åCvoA~{*ê§%;ÞE f_«îêMS_â“«!º¢„!Ókw_hG.iÝrãàP ¼¼ˆd+„n/(MÓdç8ַ掄TN“mEO3î-Èþ0râøCGŠÓ±ý$ÜÜcß~óœò_y endstream endobj 220 0 obj <> stream xÚíZ[ÛÆ~ï¯ß¸Àj¹®c?q ´H- Ê-q7 (rMJ®Ý_ßsæÌi(ieoZ ˆœë¹|çÊ]|XðE ÿø"ð?^¬·‹ïîßü•óYç‹û‡OX®Ëœ)½¸ßü}ºùåþo¸(Ÿ,Ê™Îà$œÿÖÍso^ºùÏv^M¦EÌñxZ°n·Oݾ|_Ü,¥”Q_…LS–¥v盥È2¸~´=)t†G.¹dIráoBûð0O:Ï“‘’+H§‰G’pÓ«X¨ Qœ%Â#j)cûžÁï›+¼*;}䥇¬Í^¸SŸøRqà Ay¿y1a¿ý¿Wòrüþ¯¼ÀÛ/õo¯QÔv‘]h¯®CJ¢™Ì_)iÈlâ·™ª9'‰Ÿ~o›AŠb&ùEOÀ{ÆâdÊû* ”ËC˜ÈEÆòŒ@$$œÁRiVðÐU O–܆¡êî`7Kž¦ô“ÁOà<®âȆãÄ!ÉjJ²šÜ„®HXªF’W7¨*1£|¡˜JN)_q–Ó½˜Ñ}X' Y8¥Ò ŸÕÉkú ýÎ{{M?AʘüØ‘$…/IéIòËú–=ù.e’2ù,Ú´;yX‡J~B‡zÔȵ9†cñÕ Šb¦OQÀ…fZ¾”3ýÓ‡ü^>ÄQÍQ%LdÏbâ ªBU…˜ª"5r¥*äIUÈkT!ç,Ü×'T–šñ?ýùEþ<½Ú¡ÿ„ L»ÿ®v¿Î(ð”öxš3~uRúc€].X.ÆúEœË=Ë0ûžÃòÄæy‡”[‹¯ÈÎ’ójž %G› ‘‘Œ^L éåZð©ZJ‘1õ@æt²i›Mg"?°Yå RÈ“‚¾À +ÏÞUÀ+{Ô—üÈך·àå"e‰ºÀ¥*Ïø8R‚ÊXšœ¨õHBß6ÀA’Få§§®ì«¶){Èàj‘EûíJ&¼«ÖEOËZšì«-N¿GLeKŒ0D´­J³y×¹]öA2E™>@–Ÿx Ùû96ƒþ†ÑÍò™y|’3€1ɧÎPgÌaÝ6¿í‰“–§m~r–ˆKÿÑîŠþÎÌÅÓqH ïàV™©¨FIàCûdè¨ìŠõHá¡Ci<4µª&Ì™:™‹@SÏ•>I4ùP9LŸÕQúìÅd>&³eM\¡­d&¶e×â$¡Âº#àžd[ön…ÙDO]û&òÊP^ͦ¥¡Mùždh{:€áůÞlÆ‚ãq_ÔôXPæW[O·š¾Bä6vÄÜKúòqOwÁè¨.šÁ€]«á.s \``4pÙ7R<ßœl†Àuì=É£ð9Ãìè2Ë)vœ5¸—â.dý`&Ü[ Ü“ù£/\’Ì ãP~Ë Œ÷?E³+]/žP°JD&8’zw3Ôí±8J굟Óç. "uñulÖÜ1Q×”ˆð,—Û•4nœ§‚iéÆíñ¢ 6íBR!<ôö·ü­\ïÁC hd…^<ŒÁ­Æù÷4^שô{‰gí\ùêæ6$£I¯â„~Ž%”ƒ ÔS  Àðp`£[s”õ?ƒŸ©¬»´!v¿¶ãàZض¦ã•óOƒ{m)ó²{p;“ѵ$‘cÖ:‘G(zü&8Å ŸÃ`"Ð4XÞU€÷©ñŽþUEOEæU=9¡¹åö iª7IOÐo§Ù4?yg7þ½ØýúC×>:@ÊAg*›·xɧKWPÅþ€¾Þêái.ÝÞ±ï ܈WäyìöwÁ2BC}66ˆLŒm»¢®CùBÊäð~_P–4¤AÝ2Ð6€°0ôú4…Rhj{Aõ¥=¼ê¸¦—ؾ8®éƒ=×ÀË?ȈpÿnÇüç`¯EŒ’}vEYÂ_^ *,P_®™›»V r*Ð_Â]‚A¤¯ƒŸRDÆ™NŒ•âÅÆ»‚=ö_ç¹Åyþ¢8ÿš½êyµÈó8—œËó8—_Žógtþ/ŹßaMSjt »7ßaLñg Føhˆ·?§KªYzx¿š»?Ԟȱ«2¬0Ý?̧½4’ê£t¦¢ÐЉ½Kç Úzœèy¦l·a“Vã7Äq¨¼c ëÈ2©(ܹi·USµF|¤-4;íKÚ¦Š±ê÷0C£±;Cc¿t¹Û?QÁ/!±|¹\™É#[Øw´Ž²¡#QÁÌQJ™¹Ôo<´±oÃ¥P{ª¡ªÆ ”‚íëÂŽ@.Í–‘×7‚zÀ“ÅÐÿñ´¯4žXГKáé­¶£GY ÛJ•^>á‹3¾Ø5%'-0¹Þ5}e_ú(énˆÕàÊÖg ‘ÊBâÑô’n©Hé9®òq„šÒsû÷|&AEU+“?£]Ø"v€½µË`lSZ7®²±uírì53=Çð@‚—¶ôT6=ÈÎ¥<c¯^2[ý“âÖoòÀë{Ü2Ãmß›'‡Å™IÁÃÕÛð|,Á>Ra~º—¨Ç¿2½D<ùˆ…i ÉkßA(;^¦6f í–þó/ÿ-×LÈ endstream endobj 225 0 obj <> stream xÚÍY[ã¶~ï¯p_X3âE¤¤/M§‚¶›dç-. ­¤L´¥ÉÚÌùñ=‡‡ÔŦ=;“ ì`ÅÛ!Ïß¡7¾‰áßñ¦8lþz»ùòïjÃc–ÅÙæö'˜ÞaGonË£²j¶;a²¨n·BGÇê®Ï۲ñ4ª†ín¿òtAž –f° R¬úm£2/©Ñ¹õËãTÊ”_Ÿ÷9wÄ#Ò¨ìüÆQÓù³8_ëŒÅÜ·Í5K7½;Ž÷ݶ/:Ç€8m]ú±ª¥£¬Äð-»CÝÖÝèeЫh´;öµžEGR†š /ÝOy3„4 83Ê­av~§&Á)K¤øùµê‘*³Tf@lt°MC_”º¹«Þ÷¹[Jac— ÷Ö)«Âe·~" +¦ë‰Í¹ª½YÅ”Ùí·¡IÈš XIpæCUŒG”^q·¸ÉZÝ9.ú¼°"²íNŽNÕÒé´ (ÇQ‡CAý)V&Ciâ #]_Q0ŸmFF*g~—ìöÒç>A»l`Ýp™–éºgYh@DB•ÝϹA=Š ÷Sn?ìžî‡cQJÒ-ßµÓâE7…E7QZ¯‚ùºœµPMZKÂä ¥;õòi.²áºeWmp=¡ ‘2¡§Œ–¸Œö| Ò^]ﳚ–î“’Ù †xšFÿÊ?×wwÔ«ëáX¹)º 1Ôwö¾š…;{bbý4æóä:)… ød€mLîüÖó1§‚°^çÜð•¿³sy¹ñò¶Ý1tYŠ˜¥þ.z ^–p¡xD8G3mÜüŸCû'ÌÈ+Û+Íüt[ÝAf˜#y ½”b©¿µ¿ „-¾:iÇá¢MV å1$BÆR/¤¢ç”ô"™ç› ¼ž•ô_|.aqv…0³öóp5~Ûbyí£},â'ø¯ïµn¿ ËÔ)Çbűð+Ì0h~­1å˜)ók@z….>£1~ýõ5 9û²ž‚Æè^dŒé¼Ç@h¤L{[ü7´AÆÌnwBJÆ]ª »”][V¡¤`üZ²X¨.H¿(QŸ‚äÒ“]»Âd».!Ùàk<‰¿¸LßA #TJX‹¼5NUX„Íø„謢¥,µ-d…E£[¼Jô44Y aªÖë*ç}ÃÒšÅ%ƒƒ;À%wŒ?¶þŸ…Ø¥cþÒµ åBUà…ôsn±²¡ ·Åäu'Ûg}^ú‡îàÄx: Ô°q ÔhtÐÀŠ‚]=k O„²Ðƒ”ý–!bH,¤ÁÉDBºSHƒc3·6^¦]-™©^ƒ›¹¢©³;—-`íÓ¸¦÷ è;ެÆ2§øæ÷Mm¡²Ýß—Òg—‹,€lŸ8r™J&€£Àùve&D7¶ÖD”“;¸ÓM¨˜qÂEÐc¨Bq¸vh˜5|R=àøX G*¼½HÀÄÚyæ X:®°žTLA«¦RëJ4Ó¥žAáÏ)e–ã·‹ýfl âxÎò+]9]?l˜ÌÒÍ/ lÎDzN4&§ÃFBÃÌÍæÝæûóÇ»‰Lkï‰7ΓÇ|‘ÎÅüܪx< äím™ × 3g­lcXfcdµ¤1œb!Avqds‚Pˆ°83¤¯9ßšÛ´ýòWÍâÌÁñEåÕJjëQïíR5N\é(ýýT‘ýñTáã…@š?L-<Î’N;WWL§¿]°Í¹.lmð]HͲl©‹·Aa{¸°Ÿ7>Ü÷Q°VjÆ_‡!ݧ!_ÿ%”9æØù]3ѱ`€·°ÀäÉ3í@àþ*íÉÚù÷¢²¹¢†RÎô?Uk'0Ÿ§/¬Æ.èÑaMÎ3¸ŒÜ×'±•ÀgQÃ7¡Â$(ÅfÎÙk1UT—<«"–Lúc¹y‘*Ô'«Âø—ÔÕï N)¡ß ŸkÏ4šõŒ©­Rƒ¿\Hüäòs6‰bbú¡ëó¦ ì!ÕŒß/Å*öexfŒOÎñÀ%!¡&ÿ<Æø[¨F ò¿x˜jÓËyæº[Nµåsn ³rŠÐì3º¥„kÖ¦qXéÞÄÆgHFÌÆ¦}ý„ï¡ð9›(Ûé·3JÜ‹Îy²G„Ô¨eêû" ¯»~~«·Sî7ŸX ÆøQíΪ#¹È§ gªZðr~7¾ªb‰$+Ò/¹?üÃ5ú»s8°kÌ$ÌcuÎx<ï€Ä:.$^Á BwýÜcùtW·ù ˜àêƒÜ<ÏÑø³  mY‘¬ž.DŠpw§9„ÈüÒïÿô€SÀ^ endstream endobj 228 0 obj <> stream xÚ¥XKoÜ6¾÷WìQÛXŒøW=¶p¹u{ñæ kéT®Ž´ ’ýïáZjWv6 .9œçÁo¸ù°á› þøÆøÏ6U»ùñfóúgsŠI•onîa=å+`|¸M$Ë·)çB%ן;Ö}gÇm*Nšº³e¿Þݼjƒ»²YpÍ µIEÁ¤tl~ïJO¶‹È„dÄ!î[Ͱ—¹ì@„VNÄVgIÙ¬193EØŽ:É,™@Ž ö}ã‡åàGUÙTSSô‹Öyr°]ßÖ]yXS‘Ŭã}?´¸GëçÓ9+v~ÏÉø0Yz¡èýÔUÞdä'+˜äàÉ´v,蜑Z&û¤§Ay¿=ºý–~{•|Ü‚råP—w I’‰mlk»­0É½Åœï ¾cšôÔQÊ8?œ|€3A¼R»äq¨[äN+“E¹8í@Î.œ‰5¡™®OëîPƒ†SQ&ŽxA©¥;ž ø|:g óHa×G;x.2(Ç/¬ä»Å¦ªáDz˜˜èÓ‡’¨Ÿj»Ê(6üt‡?XgA+¡ näD ŸòÎÍv.o·b—ÜÕ´#UfËq/Ç2yܦÀÆm}¬=Ήd1ÚÝÈÙƒ3Ýa£?µÈw¨«’XW}ÛÿÇNq²Æ!6ð¬yV¯;¬š>£<Œã\@JŽn„qJ_Š…¦è'Hœšcéˆ6¹h‡5—Á¸u¡Î\˜„ÛF·M¡qùcm‡À±œŽ}‹Gyê.aXRÆÂ€ÊÀ…/ã4õé.!Œ«†ìµ!é{tªAÙñù :ÎÊœäJP·oNª0_gLTg²8D®lûØô¡óâŒÐ0½s„_V*–Ђi_±ögÙˆªD© gEBJ¢ãøt[_=¼û²¾VÐ8µ?lS-4l¥ï›è»OJÒÂýúž>Ÿ¢©Wô‘ ‚Ï·uÊßÍâŸÖý,ìÀ‹q øÒóR3ê{oÃÒ”_èsüÓv—êÛCGœé… _–ö1¡¿Ñš¨&¾Ô¢—ž>÷bŠño>~(­>w0Ó0­=ËTÈœéœR‚@Î5dŽ-;,š0H……2Éý豬BÅ_öƒõ“°ÇÖó%Bª.¸ænÅŽæ\VS=Ð’!NÌÊQ»äWÞÛDtµRE{_ºÚ:Å1u½¿ó{B¡+< ø6ýRsõ¿®Ð\ßxyVnd&C½èRù?åW¯Î.Ïâ÷óí_gqßõwŸ¤$i-ÁWØ#tÂñkú`9.sïÆ—‘ònÜ'äzu u! šsV d¸ÊGè̸Ï:ùc[È—×Ôç ´fÚ8v¿ÕÚ]zBçgá/´žÃWOHÍÑŽDáî0œX–]\ŠÔ!’=Ýb¸v°w”´âÀÎg顆jôeá ˆð êèž¼ ß8S/nxˆä–%èÐP—w…Œ•fϺEA{“ïf·ˆ§ÝòU>q¨Ù\àAáI³@ÍðË*F÷-Àþ}&•ü´'#Ô°ZEØØœ°1­¡ø­Ÿë÷S}18õœ3Æ:JÅ+¬”?¬5BÐn©E_]ÓÝ€M]»¤b†ûZ}xÜ%1«:¬Ëa…qÛ™ÁÍrÊ%¾&B!‡™äjM4où‹…ˆ— QKÆË`WyN“°5~ˆZÍÍáºÊæ\e«¬#•»5Wg’5 ɬÙl˨¬à‚·+~—‚qáõñç³ÇcžrǤ^´ã'´ 1Âî†më‘.V(45 Ü£”ñŸÚQÒ«%@<®Ø @U‚ß~¯];O¡+^rhjî<åÓNËYž¿X†X—!cÎÀ9Žâ¨Z•/ ÛížšXn5Š…9)0öRÓ{hðÞ  ‚ÒZĘà'ªFÐÆô4]ŽÀ.R¹ÒV®6¤=Q»Ð1.tL(þiayÝDû÷ÒˆÖ}ÐâR¿Ñ·µ¡™}ú²‚Öl‹˜†¢3SçlpŠì¤F)ÐN@-v7 =Ú¸ƒ.Ï`3üÅYðg!øaiü™Cè´6W³Üù™é\à ;«:¼xyEå"ä]0:z\Z‰…襂¶¿uÀìÜÆ»óATÝÃ|)ù9ÇYãÑû]K”ªÅ‰"ð=?y¼ñ;eG#ÿä£úàEÖxÉVîíOž°­­¯Lý…óUx¢+‘^ …ÑN!arB9æI9І–. T08Ø#¾ÓteÌ+ &š XÆK€„(kgfùäeÜí@^xU»Pí//Þ©².C#ô}q)W‹s›Ð¯v¤. ›Äå‹Ed‹6NìP‰4W‘eô×ïþW‰áW endstream endobj 235 0 obj <> stream xÚÅXKÛ6¾÷Wø(§+FI=zl‘(Zôµ=u{PdÆQ!KŽ$ÛþúÎp†zز×MÅ. ‰‡óø¾¡76rÁŸÜ¤1üG›ò°ùúqóú[x•RäÆlßÁ|(#‘'›Ç݉PÛPÊØoží«¶±ý6T© ªÁvÅ®è·>~Zô×E9*‘FäzÆF˜Ô)ú½)X,›‰ÅJdvD ê·F°Å“JT{äyPWÝš((júÆ=Ý÷®XÛVj8†WèÌ̃lí^,ÀkÏ"§Ýi†ÙcWŠ®bÙ'K"CeKcuAC}µ?Áè6Nƒ§ÞµÝWöU:ÓBi´H<•@ׂIÓҲª²øŠ­—ùÂkR¨d¾ ?Ö܉,¾â¶°jvÕ?Eã,SqPá8l金f×®ø-”i,d†O‘(§w×6;»²·Š…zyëË-r#ä"2ÚGŒ;‹ L±ªÑÇÚ‡ÄÍmã$ºvÂsw*-iyRÆÀ²Ò«ÿ›†Ë–Ôt­  Î(0ã¸äm)dq*´™G`Í™Ðå.÷%¤šŸâBgWúüìJMY ïth;äMu,hÜzYÖÒÁY0GдI çÉ„¡¸þ bcζM2n‹ï\ÚôÑ[zÚ[£¡ŸTZŠr(S1ààŽåk^¨úƒ-PLïîhs¹K“œÚÓ+;(_V[¦ƪ4 ž‚¸PÂ}þvzÛÛrã7 ‚¿~Ç/Ýž`p‰$‰"YÎX(E2©ÀÕk ¸Z/> ldÁ‹_1ÞiF&…^j“wØC‘šÅª§-[aŸK{ZôNÆÙn²5 TÈ}çRÙÍ™7C¼”ž.a% U1´ˆŸ$oÂTH=e,'¾1s‘ñÚU- 5­§aÈ=¹×v<½ÈŒVxŸ¬óY’‰|ä3}Ï(=` ¨í ¤–Ý"5-"s•Ô´L¤†ß%~L›¯m­€‡åBòŒ=™_LÍÄ–{Ol0VÔûQ׎§ë¢ç¶ç¦`Ã<¢.€Õž3g$8†¹‘+°m¿ÎzY*2äPOQªÞy9¹t?¼ Þ®)Ê„ò¬8¼·Íš(ãŽw«ÆD3šª{{M‰—Ù¯) ³D$Æ¡nžþ'ZP{¬À½Ê£Ìµ/t·ËøÌ½nÎE5¯Ð¾ï!¨‚¾gê|r`.®¹@o ÂÚ™æAú{MC.ôY|­ˆˆ=÷m³0ŸÁ`„$Û3ÆJ ­Î‰TëóÞEk9ÎÎ0…&‘LñiИLIÓ™jEõè”ôd2EyO¦8ìʽܬuÞ> stream xÚ•UÉnÛ0½÷+t”€ˆIQ˵@Z è¥ouªÄ¤ ´Ø¢$ýúÎCY² Eší½Y8ŽøãA.à? ê>ø´ >~Nž°2)ƒÝ¨cüÈ‚]ó#lÆ¡ÑÑÏÝq¾²’œeآѬ£”,ç¤~¿å_ ‚Ó?ßp/X^’ÚŒC‹R†úí0iÓŽƒ6Nеƒ®:mî¢X&<ì[=D"OSe Dxœorç\}ø·›äSIj5Õ†Å^f’xYйßKŧ¶®ô>AÊÉ\êÖT=Ôw4iÉTõ–L) ga¤¼„A‰ËÖÝk¨‰È Ð97# Ræb E"Ÿ“%طøÄ0§ŠL÷³”¸be „ ¦¤%ôØFqšz…gzÁ %íPwó;ÒÑ(Kâ¨l´;g2P"ÔSÕŒ“US{²Å;µõ­LK W3R˜Î_6þš„†@ô‹®gLÉCÛ"û”–·Žs«§+d¡=KC°¿+œ'Î-wkPÏ`=:3¬¼•vä÷\¦ã ( èür°0Np&]Óô¢z¾"œžðS-UCUÕènÝ™8•*¼ï\´×HAѺ‘ü&Û<“uŠfî–ÖF8f–”P‰¥çŃ‹½ØáO-r¾ª:šmúF2¯Ã™ÃŒ‘ ?=‰êÐÁœNÄÈ;[”üŒr•= 3w9Ó‚7`ÜßïÜFƒåÆ9+ÑÓ­4ž³¢°a$ËXD¨ðaÛ½\¹îÁéºD‘|Õ½ë}A#&Sâ« &.‡$.¼ðáÅ­á麸ÎV©磊‹0›åh5´ï"%}kzºú%yýP´ß<•Ù,%‘võe«Õgh­&Œç_F×5Í5Éý }ÿB—éùú‡H@Ë$nG•³„Së8ãÉ9ºßòLéÆóÎq9à+{naËþ¢lyðüßÊœ•ùÆË/Y?£sQ`Ùã,¥!ÞôÛ‡¿ƒÑ” endstream endobj 243 0 obj <> stream xÚ•XKoÜ6¾÷Wè(+>DIÍ©ôP´@ƒø÷ ÕÒ]­¸Ö#iúë;ÇV´µvHçýÍŒ6yLhRÀM*ÿEÒ’Ÿo’~£ +ˆ”<¹¹ƒã¼ÁErsüþÒžoyYÎKo²œK™Šìï›ßá†L˜ U]ù%,{ã½f5tº<¥HhAš¢AJZ’FuM¸£þc%«7dŒ’J[¤˜^âWrҔРY.*–.ƒ>¶G5áJ¤‡[.褻֮yzTîÙ·a=u£>g9«ÓNßrɇpл—“±‡°6$Ëk)Ò·žäÏvþø×hîÝjötARïUÎJÀµ9å¤Á¦ŒUi°+çœÁ>yÚÁ5}[pѵîˆT îäh&OÒÎêÞŒ˜vú„‰r—åQ³±õ§¬iØýâ˜Ø 2¾p·À m¯&bU÷ñ¢uÐüj¼dó<^¹¨Q‰¬,Ъ1+iŠÊìg„qÏãÖiW{ív$–ŒTkàÕ¼Çê ¾Ïò²`±Å{<+R ÎVY§òIÍjÜ‘ *Ìâç"ª—E0åS;êöЫÎ\¢Û¿Iù\PIàu“ejo†ivfèaÏM%Å[NfFU}¼öWÌáÁÅâºg‰(ˆX£š!é2ä,“ÍðªNÏ¥nϧìèVæ`õ f›úöÜ=;­FľϽ&ôޫŭ]·ñ% ¼íbšSQï·Òù y·kçÑœµòõÄ¢P9TΈ·µUónøK¸)­wpî,îewÑ’Æpy)d”°µ š~7TŒ‘Z^’Žóâu¶ ›»Ò}t‰ðÏër‹Åoå|ÔÓ¹o¿ìá„ÉvË—OœGÀÄÝž¾rË×f‰‚4Õ6M^3AlÊ d bñ¼ïör ÀPš_r޼€j¾RB€íZi,ð€¯šfl†¾è£j.ÍE@ =¨n™-±Õ\°¤ÃŒ Y¯&;Õa#r˧?x‰Ê·øU,Þ)ÒÁ€ˆÉ/|©Û1íÎÓn†‡Ï»ÃÒ±¨#6Hwë~TÛ÷niûÇ´w—͸RµãAÏPb´”a ÅàX¼´ófx¯1oïT7ƒ£˜¤)–&Y:ªiéçöhÜë>ûÖ=AÔqéüdóƒ`4}¯w¨Nhæ¡ï­2Pg_´°àY6á%®…N’×`3 „G¬¼˜ÉºA®rG‹È6ïòuxÉ8ºèêN6 ë &Fú‰#çÒáíŸ2aò„ é‡F^A«¬pAh–SÊÎàØ'?ЈµÁŸÇzn|¶×‰ºŸ!%aåºÑ'ï“wJ½ˆh¤¸@²*9Åšmi•X+¡Ÿ jâãIñ®Âs:Ø.«œóÚ^‡ÍIÚx±¤¢$5êL,¢!¼òÇí<êÃ2ïò&[—O؈˜M(ì€TVî!S²«•@'¾¨”üJ¥Ý›gáÃå&0a# Î6ÚHYóM´ýÆ&Œ[-ñ†(‰`Oã³ÓEàk$²ßÎ=¸h:úÀNú„íá%S„t¯;ãíî@Í4ÃÃâP`ÞìjNà¦8ºtÙí›ë¤Êîâ1×k˜JÛ>È_Pæ|!7ᛇ·e ­ý¤Xk·ÿÔˆyoÒwÓ¾Ö<§õƼÑxm‚>30ü÷ µÕÎ\Gý_(Q«"ȯlÅ›–¶2Ô©0ìyƯí,ÙÆ4ÆF”pa›±…5e„Ëž{èc0U\ß“¹›‹í‡1«åJo›lûOùM×T€8Xì[R]˜éû3Ü1'÷*}ó†=Vz1Èr›®}E²]g-ŽXÑ8ånßÐm„OzÖãmêTüâìŸ2NÓ‹u¾;Ñ:l4C¯¨‰•¢! óÃæ ¤ûzFãYóRî#n{?pHNDåÓÚ¹9ÊDaÇ›a(o ¿;l?0z3íéA!Ó)« /å;Ÿ—so¢ž®k5€POz °ºŽó«î«a6¶?ëù£vÒJÞªâÚÖâ`ökÎlj"ÊkÎ…°uK`úq«¼;³Öâ ÔÈ”áÞ/±t §7XjÜAëè¯;è='krç'í§¸1ÝFÌ&ÇMõ*>tü¸„)êÆt–¶ë´ÞúÑK]¿è£‰§®Lòåißð7W=˘G.EmÕà<¾ûîçÁ6t endstream endobj 246 0 obj <> stream xÚ•YK“ã¶¾çWè¶REbˆ_qå;›ª¸rIyn+( ³ÃYŠ”I1±½µÿ=Ýèíºfª@6F?¾n@›_6bߨdþãMuÙ|ÿ´ùË?E±qTÄÅæé¾ð%Ý_‰Ù‰Qt)­o¦ÿB„sîµ’ÈFšòL#K`ª áöâfy:›f0<–þp=ˆŸ­z"CSx*ŽmÝñtж{þü)ÔÒnmOÏÇm½ÿtÜ… “ü‰éÓþõM¦/(>“± u&‹ýýsŠøË É?~Ù/½ôý‡úϰṛ~øðz×Óçÿ‡sÀ3úý~ÝZ,Óçãö]yªÞí…TÇÝ´}%Åþ]u*ßw_¾ã(ÖAGƒ8wAüȯíO9kÚª¶$MæPi WMÙ—ôb!3 !"‚嵨þTÓ'La1 p4œ>ø"¹¡¥ÏÝ¥†@pk56](Â×cX)†Äi7ý}ƒà 5äÖ×§‘71ÃŽ$AOÎSr.½©D”JW –ˆŽK4vÔ$• ûwa9Á`}á— UD©bák‹§hkú|¸ríÒ¿ŒL{ õpã7ÓÐç°ÖÈLB5}3,s$  çQÁI¡íÒËÙäm”ÐÑ`‹Jò‹1Q¼ÕšIO¯„¡LÃ[[§p¸oXÏÃö„ƒMT™k[pŠóšhÅ:‘NøàÀJœ(p¥£2R¬Žé;¢uë>¶ñœÍpæù‚>¾”í$ŠŒ!ݵ,¶?tæ·+¬Õ/N¬¡ñ:'j3ÍeƒVi¤ÔWÒAæ÷V‘2죣"óícAJdR"'ù*H!¹¡ñ‘rB‹(Ïþ€rE2¦^d‡¹i)¬Ô[¹C#'ÿ`nú›=@]V3Á¶ªo¥‹WCf"Pézο,‹’ (!ŒZì+&ᫎ!¯¦¹öÝP»„{‡Z9‡Tló2hó¬„Ñ*ØØš»E€0·X´ÛÁ ²@ÌU®¹I%âð¬1k“EÊ “dë*XãZ6å©ç¨Š¨È1îÍÚŠXµ¢4[+âËÅuÁƒ \@¡®Céj¼Y]\Ëv7R,¿~3l´ŒÒüqØèEØX¹ =TšJ³kðë7‘œŽ;°›MAÛÞÑèb€Jy^DJø&«Û箿”a»6ù\¹»SoÂ6ß·ÑÞÕw>À ãeÕk2QwOL}±(|ì´èž#rQîUò•rŸba#AÜ®Ôû<’a½ñ*QœBð0K¡DSt$‹Ã.RÆßðÕ¾Iˆg`.›·ð R `Ë»§ª‡´‰FVí)D$‚¦Ì/ÔIQ=—L¤æ>Áj`¥öcÅ!í±é³:ŸÆ®n§‚ª3Pl!YåõzxãEyEj €žKQCo‰u5€Ç¬I©kŒý®Q0‚‰e×/ÛžNÀ"X*ñ±n«f¬Ï,‘δ°€À†É9bJF›wrûkÀ5™d/jò»Q[«àQeòbz¾ê(ûS}ë˾æVÚuÆ÷R°V.Ó$Ré×cÝzprÇn¸L‡x®U|hàÐ9 É"-mwßóоÙö©ö:cB$·«úKéâa¦Ìmн£Yö牠|µßƒ|õ›Ç\l3‡§qæ ÎÛÑöUº˜Ÿ“ S)|çÎBŠovÊn{Õ•$+ÀA ‚ß ó:D˜Õ‚Dy9ˆß;šF—dðöåHq²ùÜ—,®Úí¯º¼šzô$g[‹=ɗɇÙ" [¥pÊ`\¢/—¦Óg?¨Ši½ ¨öÞ1#)~Í–Ì.ü¤Š„Cý ¯?˦¡ iÌꉀØ=C`sUXÜL5º”±{Î Ñ‹˜jqÁÈÜ­©ÌÀ‰ ¯WÈø©Õ1½­¸@¦+9ûhÓF›¦0lÃ,Àl‡úNÛàb›Ã²Vj[aAxéåÉìªà¾¹XšÝÞ`r4¶í1ãå >2å¼…|¾Yí¶ZpÎ!ÑFf±èJA6ÉâÆ±(fæ¸kêÝ7û¢Ã•Å;ÿp5ëa&$W«§+ºÁ`°œá›½™]r<èOT ]kž4±*ÊÜ1ͤè¨ï » ïN¨I™£i©¦ßA”v¬ÿùÓÿkipo endstream endobj 249 0 obj <> stream xÚ­XÝoÛ6ß_¡=E^-Vü(5MvXX¢y‹ó@KJÊT–\ÉÚ–ùßwÔ‘¶dËqÖ ¯ãÝïîxŠ÷Í£^?Ô“ ~C/[yï.½—ï)ì ÂEì]ÞÀy@C’Â<¿òa³€R&üÏE5ã¡¿)ªL«YÀ¥ðתQ«bS4³ëËÞo—Þ7ð4ñþ2m5¬c9 àï‚ǼÔY¤9Þáæ­,¸ ð^›ú|Âv hB"Ž&ì_Ê!2žŒq¿«p,5„ƒ*lÜÌT^T çõ@&~¦ëJYdߺé‹‹L/B.25æ½}¹y¸ùlõõ@½ñë*((IèPÁ0 'Åßë¦hµ±²ÁJ_W¹þGUÆ#£Ih ÷PK G-åHK³mé,\à®ôÛn¹àQ’²btŸÖÕé5S±1zu’0¶00Ûänˆ'£Å„²éð‰H‰t1ßÖ`Cf|ké[\ŽìWØÍ^c¶çkÜYø¥²TY½Â)C“÷š"+à ZY8”NØN¶ ÉŸc.îÌÕÚg¼îGÿŒWz£›ÅÌ¥)9Žñ­ßÎ8õwÊñ„õʺ­r6æûž‘$ f ]mŠÛ]­éɇv¥I¡:°ÁíÛ=|i<6Þ¦cÇE¢¥°¯Ú½¬c0ã$z¡K]©æþ$JxhÑÙKÔ§B:‡´Üûó~µ¬!CžÄ(á Ä?dŸ¢eŸ¢å6E!ïÕ –BÝA×c‘(U¶M;‘ìQ_×]2:¡SãÃX@–©òbªsˆw¹ï¤N&J*ö**o»ª¶ FñjªþB¡”.Q¼ž`™Ni\åÇ÷IìÊü닉û" z&ƒ‹ï“ïltqL~üLo¾—SàÍ´ì¹|ó? øó),f˜WY X ëd% ±Ô²4…Tnê{óf3:L CR­ní‹l¸_àÄ–cÛµ8Yé[¦¦¯i²¥PÝÞ¨ -^‘e9ôꄨæ0‹ñé Ä£Ô´ï˜Ê'BÂ4ÞSÛôù±-‘éQ£¦ ›(ÛÎöX (s×a~7ášR›Î€h`]³ì­ ã^vƒµ%p¼[œ u¥µ®!´ÀW58ÕUVv:¯í•¢:4ko{›>'a?mp&¦Ï7œ^]ü`ƒ ƈxª4¸¦õÏYëÆfÇVßV*¯]®CåQH۷˱ $š@ZÈÀŽ#À[hXï½-8Ê:U9v•¿(Cs?c‰c+lÀ ËuS¯µÊmÇ7zs¹¶ÊÔ•^–…µ»kûJç"ÛÕâÁ—N/dª' ¬ÕhJ"ôÊowÅj]ÖO·¬B9øÖ"fÞ–Îᓪ}ÐUÛ­ê9¨“wÙ¦~4Ç‘))ýžª7àr«*eþ—ñà®Ïñ%äò}|úòG¤}eE±G×£ŽqàðÚ.ixtð¦¥3ý1Þ8³cQj“’Ìô뎕leòÑêñõà¤zÜ¢6ò©$4bÐ7£›cøu3uh™o¾vFÔÖ"hsUtþ5 ×xòâÁõ¹ýÙÇ7°ÑúAÕûÝj}7Þþð8yf¾çšùØ7úÅÝ|Ìàí•¶p¡mÎõ5Ñ»«»ëù+Ú›¿^é¹!ê.YWD8ù‡…¯G¹[Ìža‚• N ûùCIg¨û³±B°×œYXgo—»¹¡}> stream xÚÍZKÜÆ¾çWLn@Û&›Í—bHùäbh‘K&.‡ZÓà+r¨hýëS¯&›dïD^8F zØêªêª¯ªºuøtˆ!ü‹™†¿ðP]¹?|óƒ9D¡*Ââpÿñ%ª0‡;ìH÷ç/wq–cÝu\ë®j¨+ žÊ¡¼Ô×zÀÏ<8×U =ü1uÜœSl"˜6ôêx—¥ Õ­¬ë/M×ô–ˆôŽÓÃ)N’îÜT5sÐÉ”±–õãÓñNC[5§06Uùúóéþëþo ƒˆ«$!Q\^`j n‰[h·3L06—§¶æÑ̯Jñtü÷œkžÕÏ/=ñt^m`æ Êa¨Ûžüæ‡(r4›\…)œ²ÚÉ ÷hR”ƒ‡ïÎÍ¥îÆ¦ïÊV±´qœ«4qs•Ä|r=nždAyš‡éÊŸ93 íµaýÍÜ®„‰Šµl×t×úŽyÏ“ üàYo|t2|hºrxöP¶µôì£P¨Ôje|¾<ômSù)TfÙ…3‹èXR²©•Ĥ«ˆÏÇÄeÛµ(ìÓ$#£´­´OS ‹H߸rl«›GPN¹õ›STýÅ–Õ娳`ªÇ+y.¶3;¹6Ѐ;•`äqwoi÷¢P:‡í3•ä´ýŸi.3®×bš±+s¤£0øÇ1׋°0‘9?³¼¿?|:¨¸Èÿ¶›d¹2æp9ÄiŽ*–ïöðáðã>dMž«Hc'v[r…»žûÓ˜ ‹4ø~*ÛOSS‹þà@â‘?IÓà šÊk®¡{/›k©,+ùз€^¬äšU±6èØì,ha ÐááåŽwqzÑø]~î9>“–3 ·F}Ý~7üÄÝq¯u3k}';w>Ϩˆ£p Y€vÙÚs›LT˜°m27ïÁŒ)fòÉ*Ìþ»—'áâåhWH [öMú¹3µûžfõ““‹Q?Â÷¸f?“0°Ù‹²cXVhT]w^`Éu¢²Ø=æ#[ø`íkVœ§¡®€õaåþWG$€´ÖøÎõ1E¾fv9 Ø7ÇÔ}êE÷ð%a+$ŒðÊÀÂ=>ŽCŒåK+z^PQ,â.†Oø1 ¬5Ý£|² ¡ãßägá‚A2^~}uåµ?–•Õ"l,Êv9Vx`&x?^EõŽZ*ëNP³-Gkéà!âð‚ ûáRÊŒ §EÈVumªr|ë §" 8EA’|ëK ÛP÷Ùoý¹ qýåi˜ê+~ã#—¦*³ô¾à)e°-4ùL}#‘NU¡Y߆¹|ç£ ÂÌAßǧIg~£­;˜•ZÓX¥‚å\"Ÿ!ÄÔÞ’N«8Ú0º’<\<‚k+Å$ZåÀÐ=gé4H‘ÚM<„žg¯LYzû •D+>"©™v|@ÈžÚk¹¤Í’$áTÎpíÈiÆ9K€žu2Yò:ɵÎT‘¯òWOz kLzª;ÐI‹Ùf9¡{)ƒÞM6š$ø C6ôm2pÿ${PÈ?Å™¾Ô¤÷òÆá¡nh– Q¸U]âÖá…daÅ.§*¨nD†Oz.ÍH5@ooTRð ÙÙn&É*çcÐO5'R)_áN¶,Êfé³å9+ÓÚ‰ržÇâ&láèÅ^æ‚•»ùZ~Ðý–Þ­TŸ›Þ®-휺ãlךàV³ù$û®–eŒoxQ? ’UOUCÒíã{«$¨‡¡èÂJC ûWÊØsÊØa°ë¯åÀ×P©h~pz ?Öé-Ì÷–K2yšýp®;º°@Rõ˜ñH<²0n¥ ³ŸW{'A5—rŽDFüÝ)¦5Û“ÄI©CÒW“{ERPÐoÊ㔀ñí0ÇEöÂɇ–©Ò…ƒRHp¬/õÏ‹%ÒÛ½èë,£kgÃjà™væÃÝd€4¾Â´…$UKaIˆEv”¹gPMÏ8NÚÎÖ…v¾‡T˜ÂF]Ƚ!Ô˜“p7¬v£¹ÓÈq¦ pÀ/[z5²‰ÔÅöŽ#Û„ô Á,wmN—†ìÉÐnâS‘q¥!ÕgÿlºªYŽ °í–»XøÌ .ºMÖ†à›¶bø&øÆ)“^Ã÷^Êã0‘j9qàÛ{_ 14»i¾FeÖ|圀(É­ø0ݼ‰àçÙéÊ¡[ î„ÁÆ€G¾€ÇÏv¿½À0˜æ¾óQÎ0ófó‘½½‡q{ Î0´ÖŒ¯PjÓžkÁE‚ûðS¶™h™–:Z;Áï#³á¹jßìÚ^ÁîÃÂêQ@BÁ‹÷+:uïWtÊÈ€-k~Öv¯õhÈ‘-ø½}糞H™¹$8ò¦ÈÂ-²ðDz°g—†!™žrõ”\=u’.¢8Rš…?ÙrñWU¶ÕÔ–ƒ½ªÑx-¼‰¤:_%#:w®›áËÐÑc» \vÂäŸÆ¨°µ·sí# ©Æ-i›Fî¾45 Hw}ÈŠ³Å‹l8›{€‚sNG„¢8e/Måj?õ†fX[]>¥†-{]›Áü%‹æ[8%ݰ­ä«²Ã,ù|u¤zê¡­}ey®òd~€!ªàRc]M6å Ü#G à—¦,ÞÀyib¤v0ºö( @…þ¥1ì¡.(ŸHÀGJyJòaK‚(V-¨’ˆj°-é¢ó. sÖ5nÕÛ5–…½ÎÑy’¸:wot¾;hQDßU4åaâã|•+qšDM]Qa²u 9!.vWšÅL«•™+uОҊ: „¼ï剠÷¤ ø©Gû1áÌíò|Þ¼¦죥}’Zãvõ›w͉]TÄ*·%õ¹þXB¶ã³ÃoÏWñ2SV“™ã#¿ŒÍ€¯l ©4Ú]|ÇúvÆ™.¥þm¾ôœvz.ôíõ8r».|wé¶3’u¿Pæ"EŽès颂ç7EÙl`žÐ Cš­ªéMæîÜ$ÄFj.ã¹Y·ä|íAÔÌõÐsyµ¼UÈÔÏ8\ÿ²DÚŸJ~Fû‰f÷€ÍÀžšr~õ87âÎ}×z^×¼‹ËÉYr½v–\žAóxÁŽ"bì€1b)çÞxŠKùtçе"ß )òƒü¶Ò¨ð+ìmõ¤Nµx+œ€gÚÿ~Á¢1FE«÷¿Y£¸,g—Ô7©y¿ÇÕ:Gbw©á÷å8µSüÃäsï endstream endobj 257 0 obj <> stream xÚ­]oÛ6ð}¿B2Z3’HQÒذvXÑíš·º²Ìf ôáJv×4èß´([qšnˆ’Çãñ¾ï¨àSüÅA–À/ ª&øõ*¸xL0.dpõö—qÄ ˜oÞ‡],ã8á;Õ.xîT[ér±ä™?/d–½.×µZ|¸z¼¸ >Œyð’I2Vˆ  „”,IݺÞoG<–Ë4gDœ'9‹1WÈOT s1PÁRHå†ÁÏeo®¾x™{hIÄòX@Œ¶kÖý"C\ó$,k]8á¦kt«;K`zQ”²œ[Og®(Ïìv¹ëõz¿›¥#€“ôˆŒ˜’‘v›¦eFƒ„aŽ+ÁÒôÄ[ÂÅåÍ\¤b,•,§‹~~>ã±ÀŽ.Þ!¼Mfv!þ YÁ¦ t×lš¾„͘»éö£êu×2»W´"q¢=û¿Eã‘|¼hÃÞf7'?È'~@>Å×Íç³u¿ˆT:ȇdø£'Sçí‚I—;½ŽýäsDâmzKÌ-¦ÇY‡£—õé0ß´ßضïàfa?6b;½$/I@©Q~Z°Œå@¼9…w)ÖOnë'Ç §h=÷ÚÎloãájVFùp˜”þ„ŒAâ©þü$ÍM™6F¦fu”RÖöå„5 j’ohŠ®kšˆ™ê„…Èè È©d¶ À<ŸÃ0 Gä?ìÉÌ÷j8v”¯µ±Bz’‰œ#¬Áñ(ðnAo^3‚1ðw‰<Ü•Òñ¬Zãá°¿·i/º¿ 1Ÿ¼|Á'6 žÇÀÊ}ó£×¡esûj|{8Öa ±Ìî}&$ðòæ–RÐ#gõíOÿ‰7»I endstream endobj 262 0 obj <> stream xÚí]ã¶ñ½¿Bo‘›5c‰¤>r—{(p-P\KoßÖA!K¼²ä“ät“Cþ{g8C›²å» ‚ hìbÅá|Ïp†}ˆ’h?I”§ð»‰ê}ô—û蛿ª(ÙˆrSF÷ï£D‹REk\È¢ûæ!~Ý®Ör#ãjìî8õ8Sqcè[÷SE#Û½7ƒíšmãÕ÷ÜI"—ZHd¿úŽAfä¡4lW„ËŒ‡Õ:ÍcSÛíFªš ;˜çÃ`F»•™ìh¥[¥Y|Üo¥NKð2>TꪭmŬ¶ÕMQ¿u’¥"‡Z;¾Pö´Ø¸ƒi‘Ä?®´Ž«ÁV»ÖˆÕZíw†¶GÓð¤(ÎR „ʼnDGgUÒú¾'PH%Ïvß;*yüvzÆÓ˜÷¦žú;˜•I<¹#qS„¤õƒÙÑ ¸ eëо…Œ'k:Óј£ÀÆÚØ<׿0ñG;Û!q»fd™‘³À'G7=M? -n0ŽÖ ¼{3íwýº3ÕdIGEÇãñZf]ÎX‡Ym†žFÙ‘YpºàkÃèwž-8”®íTíA54¹‘¤™BhyŠ™TåA̤ª ¿U64¬ŒGö ¶6lÞ œLhÅqñòKq]¹Q%ÃýYàà–+ £ÀqœŸ[ÆçåÉ/äáè‘¢”—ლoÙ2`D†’.|p‹ÃgÙ0´NY@ÊÀÔZE(Š!Ü bè¦é¤NÃt§%ñ¬=¯­C @ÈɃÜ0\šˆ¢d»,ÙM‹\†ù°.˜ ¤0¸Èw°re6DÃùNÏòoO²è@ÓÍ·ëcÕ² Ø. M8²}œüÕ€*ý¬M_›2P-€výØÚáÓ‘ÏIÁ¬­·ýHX<îÑG··ÿT‘Á_ßÓ—À=¨„Ts†V"-tJ¨Õ:IR~Ø­ä⼫-J–#¦nœ†ÊÒ†Gù!²,¢;Ly"Ò<ÚG*ËDªO mô.úþ )ÒŒ,ÅF(NLy0âqæI€ =µ„2‚˜;TÀ¥¹È3ö¨®ßN(»S·Ö%iÐHÓïmgûEŸÝhQx§üvŒtÁû茎‚wÈ„*…géŽ óÝÚâ „vóY´9ÿ WMu!2Ì6¥çÿi-½\RS þ™ýJ¼—jÊÀõ³ÿ5½úCMÿoº# oâÕ¿MýŠž¬ õ§xé-õ¿ú}ÔÞjx“Á=u¾¯üÂìÎ /A„Lup òBp»…ì ¹ID’_Úðº`’…'ÉFR«Y$6{,v´{ì±ÂÏb”½µuÏÎpQ…BE¥C]“Š^,¨tM”ƒZ‘|ëšÅºÜbÆ"VoLÏNf¨Ú9uÕ_ÇöTüÕ¶ïÌw@§Âh^¸_çâï× H|Î#&Q±Bƒ¾¢Xè+lרŸ+×–OÜ]ȉPNN‡`¹q1®<±Å]U뛩ög@©6 gæÊ¨€ä Tp#xfº¿P¡¹óŒ‹u\ëyÐgY«¦¢e¶,å:¬;ãâj¿'¥ôï>i£áoËÇçR’-w焇vMŒu=;väGã½ÊûÑxj„Q"`c *wËLÊõíJœºñ“.·ñD–– l[ížÔÀ9Èóãʵá ɩȄò¯FÁ .®o×, î(`hÆú;0Aì—nžwO¦žVk À´:Dzþœ‹sÿiJ‰$ÄÈõ2rè¹2`Œu4gþ­ ž!ø¾Ì7"IC{:k4•€Î’(ä󜴽Opöã¼G*çàJ–x«œÌàT3|KR<Óçkúü4›ý|G_¸ªÜwÃó—£>Z°à—“O¡îÉÔUöYâ©„®<Ÿð…š¿óçØ Ôæ:S…ƒ•…ýþOÿÍ0LŸ endstream endobj 265 0 obj <> stream xÚÝÛŽÛ¸õ½_¡G ³âUb²[ Úž,2o>h,e¢@—‰lo“|}yxHY´iKžlvÛb0E’çÆs#“O M2óG“œ™ÿ,ÙvÉ_î“?þM$4#:ÓÉýû„J¢E²•ÜWÿLß5w&²´-ñw¬wû±Ùn›®x}û¦îëìý0v®Y¹¡Cï:š§CÙVe…_ƒ‡Ú…ý»¦{në×wÿºÿ‡Á±˜áÈ%LJ¿†ÔÄÁth"•é·íáËËSÀ„ë´v¸GýùÙÐÓ }½Ã6\*’kÃN¤´³-ÚfÕøÛ–f¶0³·Ýz‡†+\Pü(ÝøÐæûÆü顜x&x«Ã·BåϯÒ=~é¿-Nöcù¢=‚†Õý` Îæ¤Žuk& }Ù:ŽR=c©ÌˆÈKŒ°\’œ»á×±ùáÒÿ›O ±LkøStJ„œP؈¢HËØñhE&Õ\àБ£̯å®ùÝÕÈ¿ºß6%Îy>ÔUÝûág µM_ƒ:»MA•=6n]«W4c¤(Bf‡‰«é A‚_w Y¹!«‘¶cxlk?6ŸØ‘a’Å®–‘¼ˆ.uºPØ)83¦'ŸPu#3z@á,ù,çDÌ©ïêª1'Ÿgù‹MË^h ‰¦q²¦éAFC[¦]ãÄ5‚€yÆÓO·T먂o™6_?šz¬Üð—kÐð=Ö[8J\˜´sÌûù9–8$ƒóPK Ãb{踤Föååànáø»Qƒ±U3‡ØZ¦Ó,%Ø:¬„äéÓ8˜-ËÎë.ÎûP>¶e_ ˆ¥OÇ58ì°1i¡“',‡Î ZfZð¡w¦î IN§ÚÝõ/wR¦e{(++*Ó笧`Ïý?*ø­†®é­*èÊ÷î†G²¯š­ÑUk³þìGð÷«œ_A)G»ê„Áñ\Ùuq¸E´TH¶kÝdœRúçf2¶ g¸ ` 'îáÑÒü±Þû¤Ð4i´=:ÛÝ€­ç °ë(ÞÁž;³aë5LGÐÕ~gÔkîD ƒ²H˱1:QŸk·týO1ØËpçp4MÐi ¥âΚŽSû}þlàèZ IS•Ø_{ØÒîö¥³¶Ê1úŸG°n] J©åN÷LýP.Ûa4H=¾æéÐ{q”È´(œŸÛ]S›ÜᱦÅ0×ðtßlm9¾Æy;·ÐÕ|-O%æ·¾ÀXp¼p†Òüž¡`•7ýX1™þÝt!¦ã+Á×€£A ý>†ÚˆŒNËÆÔwÚ"ŸyÌ8—Ïlš÷|{íÞ±§vü­¼¦Z’Næ½ñ¾žÎ]¹Pv_Æ!Žƒ}ß{0†TžÄ$á:ŒPï÷JÀ“œèÜÅ,ÊG0[BܸIòù|E-ÂÂà'?.òêe¨æ³]ØTùª"¶È ªj ÕŒpêP}s·¡JáOž¾‰JI€‡Èn$]\"½-!aôœtqIJ} QMØ)ñÕ •-Ké­;g¹Qå|~О.`ȯê;'ž‘çØ ¢Šÿu7˜ÒÕ¨þ©{Œtq‰ôßWÝo’Òju3i$ãÖÚ£±¯¬ÿŽ,Æ9ិ˧‘ÍBt^Ç6)Õ«÷`+ö؈œ§U† ¹¯èþÜ´ø)â},6©²>b€ñ»a]'±O½{7zšhy³ÍÊÛ×û¿ulW÷W°}½ K jY·n·Ï7«/»Ù®~'í[7ýBíÝbÎT?d\l}ê_»@•kûÎh˜lcªLfÁYÍj×tfNL4™ ¢›ècùêš`®îÁŽ{X¶E{K¡I£‘ĸҳògðÿt¨Ÿ›Ëèc.n'ä>“ÌÏ—š÷6Gˆ œê¹÷>.O¯‘KŒyŠL·n*s•‡°MÖ)CõÙ–”m!cÒÌÊV˜ùTùqŸ_ð§ÅZ0 I‡‘‹´«Ý,_,è±wã³Ý\å(O?Ó™Ê\)ÄŽAÁqúyQŸä¤gE8}ÙÎó,>eŒÐ…ÅáÞì R´™m¸t÷!ûn&V›do®älò³ â!˲ –¦·‡­ì¢y¸[ æ…q­!'7Œ± ¬3‰3•7»3yq³k¼»Ê:½‡öþ…¬[Œ³CMxµ¤kâì‡oÅ¢c—åÍÔ Õx9®gãúõ²XŒÍa71¸… “p‰ …·.…]nW|#a~˜,P^6ô&ž_*aŒAÒ:gî‰]c"f혌bb‘ð,@é„ü¸†·¤« LÀoˆ¾Í.ÛŽY×›hÖ%)$8O¢äñ²Wc’éâÜ/é©P Mæ/{5V¡ /{uáï¨ls~Ge/cü‘’ä|± ,¸ ²ˆº‚3.©0ì/›âåÉ©6,æþWŽ×&eF¤3yþåÒ¤†Ý¯Uj(‘ôfßúMõú+Øåß³2ù½]ÈZÒo®Lò¥RXò ¡zõ› ¥7¹ ûÔEô¡ñ¾Zh;Ê0l¯,ØÎÁè¦ãôjôtBÍ®o¡û ö"uPÙ,øöxCæ ·8¦í0º2»š=ÆDK¡l…,o#ÜR¤àן©ì}ˆNg³ç œZó…÷[õvß ú6I0fïIgyxÉš³Ü¿ƒÔ»*÷‹7ßÇ˧LÏnÜ LÀÌ'`ð )Š»›ÄO?Ñ=~È9†Öoç—ðÁ-š7¾Îrt·r~¨ç°«ïõfy“X›7–Âòb~Úˆ›—SLþr¯"Õ€0”Èóc5`Š›^èfø²›á‹™_Μø·0¾ìfÖ¢Ê~TK7Ã—Ý _t3üJš£Ô:•:5['«äßEû£÷T|àþõ_4Ò .a¸P.½ŒÂó'4ÇÖŠ2‘¾3§ŸgÓS/ž û^ƒÓô#ZW3Xûe?%„ë"ù·]MPó‘t‰PÖBûŽ6y—ü|„$ÌŒhj¼e‡m%=¢©Ãço )5H<Œéš¯uä=—ÐÇ—nýÐ=Žw2³Oµ8Ô¢Åî×DÓIRˆI…Ï· 6Èͦ;»ƒ¾# ŠœÞÝi2cñs8nÚ¿„èÊÏÿÓ$Í5¤ŸÉ£Œ§ï¹œ½1€j®6ö{¦E˜+sÐX>gMëH˜Àg/+±RËÐóg&Úç£ãä®éà9¼KR©}ËÖlïlÛÓWK}e5¼ WðfàÓ7J`εýùÿï¶Áè endstream endobj 270 0 obj <> stream xÚí]Ü¸í½¿b½MÆgY²l'×—¶i"Eïš¼Ý ­G»ðÁsþÈeSô¿—’ÇžÑ$Û"÷ÔbEQIQ$EíîçØ%ð'vy ¿dWµ»ß¿ß}ó§b'’¸LÊÝûÞcGïÞˆLS›ñîÇ÷$µBJ³X€Š8v¼ÛK)£¹ã¶©';˜;*:ZVæh;ÃßýénŸQU÷£ÉèçÙ2¾yÐVõ!‘ª2[ÚÌažÌà­#ÒßÓÔŸìT¸Kó¨í8_‹·gÖ÷¢ˆ3Iüû¶îê> ¥Jc!®¤ô«~< v¬RKÇ\ÝëO¦»Ku4‘8égD•·Dµ^sŽ-½Œã|Y+UÖkø?ŸeZ‰rÜe"Zd è!‹üùzhêÎúýŸGstˆç «LSÍ¥qЇ~hÍ5…ÛòÅŽÕ|#ñº’ïÍO¶=5=[ñ›÷lð¢ÜZ|‘ÅIAè¨ô¶þÊÍRkÒrý+ìfÑGn^p#âŒ?~ËÍ!zÚŒ:Üñà‘’q–ñæãjGÓ™®ªÍ?¦~2[fœÛžø³î¸= ýq®¦þ_ÜõÓ~8ý¸aÁ6æ¾Ìð×Y\ªµrÞ‚ÂU®¢Ñv¨ÒÉ"Q­Ô]9}[†mÕÐNâ<<—*Ï9÷{£qoö…ÖÑ»šñºÞ¯ÃmÀö Üp»Ø>Ò>zèÚö_‚¼I‰PʽlÑò–!0 ‘dd½ØßIvmS k0ËߘkÜͽR‚|MžÂ×QÛÓjÇØR©ºZÆ ƒ}l¼‹ówÞ)ËXhw¸B‡OÇ™rÃûcÝÚntÎ /¬\ÊÁæ¾—*‹óµ^lc[·×¦±#¡k³èñ”giˆ.ÀÅBF3š±wÞÎ=ªG§9·¢Èsù”^Ë4 ßó„ìñ:.Ü"•ºÍ;Ü9$œÇ–ÒÖ¶ÅÙ÷ò¬„t+*áöQ¸}„¾ÛG¤Ýª‡¾³ä¾ƒç°x MC]¡ïg:Êù5ß{´J¿ˆŸÞnÑ¢†ÁSVÞ½"{Ggô¯þáöý§Î9êBûÝÛo¾{óWü.@*>ÅèuñdÚªZ9|pŒœüýÏîcxdW¹ñ¹Œs‰–RÆEI ‹Xœ àÜд"u¾™Eæ::¤5Ä’ç3‘Ê$–[&ôYH%„b3épN*Sè¤:V—%}ß›á±'þh+QwÇúÁÎ7®õÛP2›½~É–¶,¹l£cÜNí½ïÈYEÂq ­KzÆ~‰±÷ƒÅr¯8<%Ûù5&ƒ"†8Ú˜¦ã ŒÏÕÙÀHNE»€Eº’ш8¸¯ÂUÕÌõÑ0Üz\ãGÇɸ£]Rƒpo¼è=ËlA¯fs˽Ÿ˜ÓÉÉš^™9¾ËìšoÀÙ8@Q&9Õ”`T‘š£͇|ó“á‰U® Ácý8[°R&¬H$»É‚H VÐÕIõl/¡ó#ùóùÐELÞ¤@«˜Œ3ú”òÃ]FÛdžòY—BmÌÍÄY—\VsyœºN¿^…•Ȓ8ãüª$σGKWh%JËAëwA2;ùÌÚx¹Ëã2Ça88¸F¬û˜ …žhAùxMDÇ© Yó™Ç";yd¾žÏjú5XM¿«J póÔäÑ«E8UÂïÒóEW·DïB$²X‡DW·DïBŒq¢¿ê.%_Þ¥Pú¼—BÅjmüGr>¡´.½jÃû-¦©¶Ü¨37/Ck€EÈÏ®²)uSb’c¶˜u£Ãë§ †ô’/î¬Ú¸ ½²in°({±¡6÷ø04oóÖ×AHu\–Ÿ5ýU´®ž½Æ¯¤uùÙC©ÿ­CÚΙ·¥¨´II€#êÍ-Ü¿DÔÞAŸ‚Û ‹8¶†’ƒ0Å u™»Ê@òl{™A6 í!¶àʈiÎ8«1NLòd½ícÏè-m 4®õ!P«sÀ.„zÂÃ\É/ó „]䈎Ší|ÇvשÁ*EL»£¼ïÎ6¦žã­q5÷$I0N¦i¬¼½|‹™GÚ‘Çiñ?rå3B®þÈýCn޾`Aù6¨±U¦ø"pŠXy—/¾¼A¡˜ž ªÂ9\ôþeú2Á²Õ@·)öë‘c5Ô¾®ëO|âêTˆ±-a$ä6Èàí !Û÷ñâD‹Oy¢ÎÕ¬ÊÕ×Üç™hqò.à™Â&ä>'ÿ0w Ó©.C5Dse[ݳqýÕ%»$5~øK\Œ%0É—j$µ½T§EBþ—fp¼Ç=YOŒj‹÷f·2©¯4­úk¯i†ûz‚IT+\“B_×$GÚÉ‚¯>€XÍOÇžŠ**_áDÚi_ëj!xQoÊÝ~‚%¶ 8 uKõ–Û“ù5@ðSR¨ša &p{ìØ…ÓnäyØy á•5ÒÖdÑß&*uá`¨¾‡ðÉpM¬ÆÈJ™C£;þÝ>Ý·ÅÂÔÚDÖ¬œ‹TÔsÛØRÛ4½+ntîÄ<€ñ›ÍYmwèöÁRõOvÀK¥]Õ_©åÌ«XƒÛ©ŠÞ4p±_Žžû欧öó.–e±û…ˆd%f„íNip¬Ùhvïvߟ1ãFŠ2NS@¥ IéЮ%{i•ë8/]¢Ö|p÷ü×WŒàâI¶Zb¬—Ùð ˜*]óÍ€C§ƒ, X.5¤´(/ýPa\žH‹‚ÎEZ&—¯aˆùÄÍi¶xl \Ï@¦ÆtÖni‘›Ä1öƒŸÈ¦ zhÀÙ]ï™Z¨1€l³L®¹-·@ìå çéË+fœ[{ñü埩ÎÉ=×mít´ÕÆN—7­Íá¼Y©K•‹ úÌ·Rg¾NJ "â÷ˆŠ5;D¡ƒ¨ô6B!`´‹D¶™ÈUk ßPÐXûê–'œßò°GÇ?à —nz*RâÒ› ÄþfY°¹ÀŠíä5Þø‹+".ÉnF]yŠ÷)[=æˆUßú¢þúþ ËC*¼œ\%_¤ÎÀœm¶(ð)Œ5Äi w?@ÙÑѯæÿÕÀ-ÁyX´RêXŸÓ ޽V¶rór’H`¯?«Ä£~ÿ›mÒ²x endstream endobj 273 0 obj <> stream xÚåXKsÛ6¾÷Wð*µ‚_IÓC§N'™N2©^¢h’iéP¢BJ©åNþ{w± ¤èØ9w컋Åb_ø(ï³'½þ¤—„ðxÅÚûåÒ{òBM ¥cïò#ð—2ÌË÷¾Éb)e¨ý‹j³P¿«6E/–*Ñ~„¿+¤ÿiñáò•w~é}ö„ÊRïÔ&"ÓÞÚÓq,ÂÈ®ïÂ{{”¡·ŒR(Äy˜ i…ȺÌCƒ‚ ­“ I{K‰$5`þäEêªP„ 2e»®7uËR#}:R²ØÓ50‹RæW7ÛnI¿ê땊ÕfV_"Ò˜åŸøDÇûÚµ{g× *Ç´v|ãš ò œžÍ\Y»J‘ÚW=D2ˆýý&§ ^q¸ž¡Ô›²¾Í7‹0†Ø#)òÛí,ö‹ºÝä I}ÞW¬ 'fUÔ«@éÂêe9k,¿´Ô~µRQ'¬¦ä±ÉI´‡ì ›}x©%Ýc)•ˆ"Ê”Àt„ã?=›‰%fv*"õ­`êq,ãÌõ”LØS0™x ( Îÿª  — äŒK\ME‹¿SSêoóŽEûª³{ÖÛ®½ÊKf¬ü¦e K˜ƒŒùŽƒ¶{r¢‘T![¨”7)ª²ÂÓ•öó¹2€©ÊFuÜãºÔVßvou+¿«»¾Z-ïJœ]K‰ »a:¿®ÖÛ†¯¥tÚ0ª±©Ò¡<],#hY78Dþ4høé9’†|SÒ„…fv0a&lʯ`”¦™“ûýúßš$ë oþxùÛù믴h?VÝ._ %+Å]×ã]¿ž_\¾|ý†·•Õ Êß_¸ëx:Uû_žÑ8Q+…Á×§´¸x_Ÿ] ¼lÛC¹2ñÏáàq°e„mÝ Öu*'UkHÇ"MàÍRàsut˜i8dwG{L›ò—EÙÙ´íƒòÛ7;§5­d T\0™”)hs‹ ¦ÕYr±·lsØô$G·‹¥ÖðJÖÄ3&Ã蚬ð°¹Ú‚N–Ùbù˜7ý\×#¡ì;ÔsÙv™ÞB.eÏ&V]×vÂÞC -Ýð ‘:JŒ‘:JM‰¥¥Ž›2²6-sx}â:H6¦ÆA(gÃ8ô6ÜD›aÓuUìw9Û&_WC$uÄO ~A'W·âލœ#’£èjÍIãñÅÁ…¥N^ L²PÖBÖ·FãV* ›]½mÌs2Ç+¶Kãv {†d‚–%Ýîàdˆø\ûŒñvÄ^îöÐÿ¸£«LDáIN¢Ý ð–\Û.O¾¿ÉÏÐ?7ò„ÎÜø|¥5‹yßž‘ŒÉs”—¹%KÓàiZoŠf_w´qðpo™Æ°®5+÷Emߪà[uV´]gS ŸJ[v\Rcë”>"ã‡ctáuaÆH7½é–u¿s€z˜Ã¹Jž‹œÆ„¤«b€zC] ãû°.xQ$ä²ã0ÓD´‰zÜ} ÚÅèíªõœ–Póól&}3¡,†¼“qLCâ‹9mrF[:¯í›ô½À{pÿ@pC0Š)HªÈ)îß*… ‡ÿWôÍ%b‡{±÷8Œ£gfrÈ…¥†rRç8ijyf"OÞéCjó¤Gd£ƒØŠ÷¸bäŽdóVaÝö».ïVÐÓíÂÛÈ,i¼Ž ^k«Ixb4¢Ök„ó8·æ²#lÜœÄB*×ÍßÐÁwCg"‘nsaðüˆñóG !ox|t˜0–q;aÜΠTÛÁ&îv+‹¼?¦1œCíóÌÛ sµ¸ûÄ"ãW×–ÏcnP2/®ÌâAXøwSC§X8†’‰ñ–H¨.ÂI ¾É¼mÇ¥ùf BþÌÆ1equŠb­œyMqãÝvH¢ê‹®¾"0E”~ÏJØ®¶«ŽZçáØŽó¦.y`ÔNi°Vp<-è_«½ÙöÍÿØvëÜ@X˜6Ì]ucIà¯MK™âikuư6pamÀ°¸SX0¬ ¨Úqÿ¬M2®xtºn3M÷1Øß“óµNѳ(Bý£l‡Œv Š™÷#½ ™>Âße ‰2‹vAÊôò,r:<©ÃgzÚá²5 ,EÆzC`B'ÃPG•oø¬ñ=U¦LçxÏ“*dPœew‚bøLIÒïÂÄFÉœŒ£Sœ¹8ÖÊ `”cœe.6 k[Wd£÷!8þ œð"ü&ª îÞÚî"àx@À£ xêU'¨WÍ¡^§Bèøwæ÷¥àøÜ()ýœþiIA¤•Åö®„ùÊ„±½2Ö]W;¦„3:(»ª†9«Q\ðCjÌ ì ë bH17š®Î¯šŠ¥àž»®.–£glô¢‡)¦D—~ÒÒŠ¾ýá?ì&ä. endstream endobj 276 0 obj <> stream xÚíkoܸñ{ÅÖ@-àå‰õJÚh/‡öî¾âoÙ W´CGGÔÎáþ{g8C­´Öº×~¹/ w8œá<8jóy#7!üÉMªà?ÜêÍß®6ß|§72y˜o®n`y‡?’ÍUù>8Ø}”DÍvEQ0ÒÐ^ow* îÌ`¿lU´û-.¨ ÅAcS¢y¸ïLOÄöÃÕ÷‹\ýLÄ‘£ÿÎnwZÉÀT8ª`Åñ`júazÇ†ŽŒ[Z8Õa¬ŠëÊðîÀqùæ»l&L•P)ˆ…ü¬0‚qæ2+%2ÆðÌmss¸É€™ÞÝ>Ò²6Cç!0¼/¶÷¨°™E¨P ½ý¹KãΰSRŠP‚>"ÇŽ{ÑÛÛ¦`­ï·— È0tTT®‚Úöu‹Sétƒ óe련Ƣ䕂†¡+¶* ÀBjUöÖnÎL›TÐ4–mmËÀGªÑÜz4Þ]£¼£é‘‰#ë÷£à¨2ÓXžU£èX‰<~Þ(;Fš©…Ñ)›(Dº5ÐE×™Ûª%DÇ™ëôû­3Dqð­_t–Ä™ÓnZ@ÅË0è-Á=ßÉ=‘QÛÐ8¢ç ÜñJÙMptSgÏ<èÛª¨ ‹à$çR’–Ôr2ÓrÂZNHüd¦euH:ÐúmHb¡’ç/s‘ú Sµ=ÆgõëÎC:STõ’å­iLžè0À»Æ®X¬W-½v 0¸Œ6tCf±£¹NjöWSµh¿³ÁÄÅŠÆ£µ *9+a[‹N—„SñÞ3ž¢-Üv8q 'ÞG©*(Ü=Ò aDË;á¶r¼ämG?éX ^/$ÊÛ+ŠÃb³‘N| ÖRÄ©N‹|»“Réàè< Ñú‹¬R ÈìÆ“û¼Qžmþí¨$hnêN¡â PmÞm~:b )’Be€Š?-öht¾|áJB¡þÓ\h2ƒ°ôºÈGW_eAN+!%£½ZóÜUAë7mWÃ:™PdÞ¿/WÈä"òËèÛÂ+{Á*¹Tdé 9½N¢ŠLÒ@¬QãÆñÿr8ù«÷šSJ’‹SJ.bõ»Q~c£¼yž\áˆ>Ú/«Z‹R‘æKóF2aBæýýÎýææ]³/¤¥0ÿ <Ü­Ãx“=`—ç1u6 ô ˜EðlYé«X ¯¸É\ß„2ï%Tì$œFa2O£±Mi¿\¡ (Ú{WWlÛa} èiÑ@)Fúàé2ÞT‘Faê‹<¬„®1»§“)yt9P{_™¸,é.Éአ=݇tózÅ!ÕzÅûõÒù'ÿ"íÄçµCIIe”+g^Y/òa|týU\"¹²!ÔçÔÄœb(2Kã¹–¬v_&wmE¯$/î©È#e÷¬*'Ô\U¾ê©ø!óA9ò °¦bˆKŸj¥Æ"„’·O€4Æ#0÷`»Þø*oÕ&Ñs×ua-T4]~ÈŽú+æ‘c-0¨DL1ô×°JDîYõØÿ) &5ØZ(nHƒ{Ǟ欶qÍàxèió䆥¡6Æ4D 7MH›†+o dnkäÐö‚Ëjȱž—Õ/Ê3¦ŠŽÜ|%Ü-M8XòH6¢ó±Æ^³³×Aá®wç Ù”÷¾{­ƒ|}ôÞÓs×ýí©ï+ÎHS‡œ/ѵråÖ¬ÞÅÐ#¿üG[—8ƒzlÊöû}óòõÓ·ÚôŠv]<ÐŽ¿ÐðBDP¸éã¹…¯O€Ñs~àññrü†† ~ ([1< g÷³¥ÓA­âöý“©ÝÑàÁßÿòŠéb,ÂÉM5Þµ4-M^àÎØÓø±pÏsáñE9Âzv^¨÷öòî½À¤'!é ‹ž†Qú_“„LøO|™À»'DÎHý /W¤Ú¡¨¼ gDºE8©럟hq.åy›|ZžîÞvñðþEÿaá Ñ÷½ñ>1âŸiY˜†‰^ü•÷šªg±.^Ü^à³ðªö?])¿^{P•ô`3Ý0ÌX-keE³Ò˜~»ġֿnö¨KL¤šKÄJÛßÃ2ìy|±"*±ùQ±èn1´«4èð#N9ãBä žz*x:ëé)ðÃZ~î+‹ÁO§’uzÓsÁŒòfó웢æ7E=kG\%ÄГv$Š)dO¯ƒ+åûâÉ1>5UÖG_0a¼3‡q(|]>&Ï¿À`Yâ«8£¥·§y¤Ã¼C¨8NÂêˆص{ל «ÝIùÝ|$·šÓ‚Û´”qæòáïÞðÂL@G½èxv@'o¹øšM¹âì¼V›'XöÒò޳^¢±ïŸ)cïÝWRN“ôU Gÿ-(qŸMƒ5ãòt¼õø½³Ìð™¸lÝ2¢§O ÉDóØÁG¨v§Õ*@¦ xÛæP¶óŒØýÓPe}÷‡wc˶_ÏÚøùÀ»h ôæþ´ÖL=þÓ7ìåwµÌõ‘‰Îè[yÔŸþðapF£ endstream endobj 279 0 obj <> stream xÚ­ÙnÛFð½_Á@KîÁ#AûÐÖ-Pô%ˆß¢<ÐÔÚ¡B‘ )¦qü{gvfyH´“&… í1ÇÎÌεôÞ{‘Â_ä%þC¯Ø{¿\{?þ®¼( ²0ó®o½H™òÖ¸{×Û×þ_ùj-ÃØ/ò­©y¾5¼×Ô+‘øÇ¶©pC€Û¦Ýçdž¦ã±¢ñÃJ+?¯švNS1sóñК®ÜÈXÖ´Ó•{<æfµ†_ܯÊ"_½¹þdO'²K‘uD¹„6UQ…ŽËtËÕå&” ”tB׃TÈa-S¤FZ[ÒÎò¦.J=‰ýC[ÒÞm°ZëDù¯ Šfç¤~SÛÄšŽ&¦mhÖî~#UÔÑÖ¶lMq,ÉbvO#/&èÊ»Þ<‡“¤€ëióâhZklàÒ´Û²ÎÛ²aN¿v¶ˆ²©1@2ųSé ‘ Þ¬.É*qwb‰÷=*¥á¢¬Rõ=”`J<[£œ¼‚ƒ¶lëb¸d@Ê+Âîw -¬o ‡¼*·ù%,báßÓÞÙÕ%X—Ü'\ºkZö*Ë'BÎ «·ŽMd¨c8Õ®²†¤_ôyex~€Ks|+F‘ĺq¤|—¦A«~¢f$H0WŒ~âí)š¶%ÝÐ]¶¥s3¢wÑaÝyõô|Iîî ´£{^ž«Ùõ€$%Çih…¶–,-,MW´å±oy¹µ! pÖÕ†48#ÈßWÇ|Ik+Ç{ú-#Ñ=V:—‰Ò@KÎDÖ—Ós 7ŸdÄ ož@ä¯0é Ñz³µòÁ¼ïò–á«<ŒCØ–)çp3 žX6vœN§ÎE±\º+ëž/…jœ™‹ÆíÓÁz¹H†$x¹L.>C®\ný:rwúï_'¼KÙߦúÕ×ÉÎà»o;üò,lß/‘gpäÝÓ§CÑQ2õ¯º#yÕS‘À#øe”³FêïËnŸ³G[‰È%KJo±M€×q&É?–»v’© ßV“²púML}×ç6kîÌ<@^½kóý$gÂæ¯”®®©]‰ …QT1ª9L‡ADGª Wë(Xzë• 'åYaL:Fï½@f©÷·¥“ ÞÞSq=lTÞ+ï刀r"ˆT\ šth$ÙôÞ"`fó—TìZ’…®E„h7ëf_Öår¡Aäz›ç l`¦ç'¦f½—%ØÚâ ¾;¡Œë(s¹öu­”ò–$Î0.K¬\<Šc?XâªÆ<õY;8ƒ}"G{qæè¡ž\¼Û˜]þÔ›Sʉ7ñÆÄM¦â"…L,:³@„½§ëX©1íëGû庆r®%Ôd7”0üsnÃ)tcò¼5¹‡\Ù™³.K¿3E¤`7¹½§]3卵A¨Y0ÂéKPÀðKú­Iî/UR¡c»Ê·ZŽ9ñPg©$"ý%Ái:1¤p†RaѳR‚‹ˆ8Õ·£½ T!xjµÖ˜¸Á8­!ž ÖðÇt›íÚk!–-C¢u÷âj†x»*Û?Ò¿jª|?>†%Î¥"u´8³Ý&N†n);G:·š²1íäukLjùÌÅUôôÇ'iï+½5†é;ð%à±_v²ôý*•ìçmñøR!3ÝspÛ']ÚՃ䱽ڙý3ͬŸÈæè2 ƒ± ®54¿¼Ü¡WhPŸ³8^=ç5 ßÿDãîÓùëê"!T™U •B¼ ô œÜVö!„Ó­éÐÆ8}ÖÑø6·*N· Ïî6›úâ’¥àqÇãÇ× òŠr¬^éTžîåÝæ?³ ¡k NéTTÎÍA=ÃW3S0övKtv:3—³Á ðí¹Ç·†¹\¼dSulÑ‹àâsÐ9ÿíéRÿÔÄNÄLnà÷ÃÅXH–>³M· QrZpË¡ é¶’Ó±yJqãi`FöóA†œ‰Ë­Y èˆbá[C蔕)oæ‘(¶¼5= q<J§¬›…1Ò¤æáøóÌ~êà>.šV0âðªlÃ7®õ±‡ðçƒj+æßÔ»žlH8î| Š¥Bø¿±6î#³!Ó[-¹¡‘>ú©MÙq–ZíGAÆ‚ñÔ…Œ°!»Ã¼¬‹ª/0´drg"Cöî‹ÒvW"z9œ÷èg§3—ÿLO5¬M/Bˆy¬c•ÒkM:Ô—ßý ÐCÈâ endstream endobj 284 0 obj <> stream xÚ½YÝsÛ6¿¿‚“'jÆBI$Èø^r‰s—N¯ik§/Qhç0C‘)åšvÎûíb ” §L;ñ >?ì÷BÑÇ(ø—FŠÃ_ÕÛè7Ñ7/S“LÈ<ºù̯ӄ•ÐoÞÆ’¥éj¦\Æ×º_‰$Þé¾n«ÕZ(ïªÛN¯ÞÝ|]ÝD#&Ê"ú/àŠ•2ÚF2ÏÏÜw]G?Ö1'¥‚Vâ/XêV®2B(I‰¸R %£u–0Aاó²ð θ¸¦¶·ã*Kb ˆ«®­&»gA=L »éÕ÷ªiÆ C êU–ÆC¿MÛUÍ0"yWfäÎn—Þv•1éè3àh®¨É¡ &Y–ÙÕKšK–‡›> Y§…b‰‚V = =èöýn‘”¨–äß×t«·Ò\2éÖÛû).XšÛ%–”(H#ù1¡»z,¹ò¨=‚ÇQxG7 ¦Îšp¬„y_¸e_ç Ôã|œ?꯾եYœÎ˜ …%ËÄWš®[3lÛ¾ êošd¬p|xýæ&¤º ºœG-™«K~Ÿ%ŸÈåϰd.$+Sß’õ/÷ãåã"T_­˜Žáþ5Wº<‰X¦’Ì‹FnÀH~|KáR ÷œðb—wÁòÒWì4ÖÞŠ‚ TO¤‹ºÃVâÆWñíh-bjá;oWkø#rѵõ@KM–ÒUÔ¢ÁU—!Å¢!R8ÛôC¤Œƒ d"Þ÷ö˜v§Çª[ž]WîíùÃ=€,âºzZ&â{MëõD“ºn7‰uµ¤=Û½Œï«±ú½÷"¸Þ½–Nÿ™äåœÜÌž€:©§Ùkµ}ÓþZõÈú•„½‹8w'A‡¼˜¶œ˜ö·‘e@¶Öˆ¦6óäœiªÍê2¤ðkº”wÿ9«‘g²š©½ë¨;­m^ÓT»arЦGй)ÈASwcÕTaxt°ïà«å_}‚OOõØÞ¶ÇÍéÍ @aJ˼°æ˜3=h¡ q 5S‡ÌÉh‘,­a [jŒãUÆx•3^»˜´ ¶‡´ ‰uÔÖƒåò¸dï'èÓ¼5èUu­#Lü â#æ˜@MWðbÌÆ3¹íFÈÔ`½«ºNOôù mAÛÈùŒ0ƒF§¤ÑÖÛRåñÓ?mg¼#?¹ÐÆ(³CÎW€lØk‡|ÒäAY€A¾Œ›»¶±Ï»: Ô ’A7ÄÖ{þu™Hf$§‡Ú4`0)“ù"Ë;®‡¹ZÈqÎå2]”¾å‰LQ>’Ë, Äe" Œ×Õ–D3ƒ²TÅWÖ@4í¯‡±Æ÷zçHNv+©²Šíç‰Ûi¹Éœ`¬Ó¨/t ”:>¼ˆ¯:šðÐ ÑÍ< ø¹ð(Ðwe‡­™·ÐÀqU=[i.æ½{û½`7A]ñVƒ· ‘Á_ mœÌO<ŽLvÇQ CŸió=)"Ž8ELÂ:Ø|äÊê ²iòâË:¨Øq%²H˜âs­cƒÀ÷Ÿñ`wn5 ˃¼ƒe‡¸ƒÜÜí07nËv03ðmg(qÀÆqtZ4ô ïi5ˆ¾¤”Ê:OHŒ„lâ>l‡eÞz\y¸,Ê* €|ÄaÊÀ£ƒ<óæàÒoç–‡ãÂàgv®nÇJç'ÜãÂn ò¼„W˜Ê3ué à"Bßo13m8ãñà]쨖«\=­–/x¨îꃆð0L.K9}:AH¡°Î;<¾¬3.]Μñ ËÓ>y~ýóÛ5Ó¬ž>=yJ#ÿ¦±}ûâêúÅÕÅ¿ž=õìÝ5/^]ß<û†¨ÚO•Éé¼'ȇ篯o^ÛÇ!oZÃþí;´Åß6ñtñ~³¢#ÀšÿQ‹¥Ã öy¯z ÄôõþÁ ?ó—·p仇—ß½ùöõe@øëÔ¼GäðJ´(À¨ÈŸ‡òB¹;á¬uí#8;bË,è¹»¶Ì*\c®Œîgj*¬‰ª±s»ì¬ç2fru–>Ã…<ÞŠ"ÃWz_R³#ðsû*ñùÔ̬ llŽf*´ª«@›Õ-wÕ{·<œ©çç‡ zåÐ{éÛlu^ÆéL'˜”x'c ™”øØæ~Þ`ôG†ù踯w{S𨌠´†ä.ž‘_ LÈ/.Í€†‚Ëü!#cÂᱬX€´æàB` ®IÄ!°ñ"1¬ÇCP6Ø1pPô¨QªÃ z‚Oí°uöu8IÏ}µÛ¶é]I.s#ßjòâEøREÁ¤òßt10a2¼ŒdIêEi™e†† ãÁ‹tH`)¾sê!ÀnúÜæÊ̘à„–q«8·Js»ž¾$VP=V át~‚.É…—òM¾7g£(XÇ„ PJïWJÿ`òk}š‚ÊÓ…%-KÞ1¬sÀcLi®’üÛÿqà endstream endobj 288 0 obj <> stream xÚÅZݓ۶ï_¡¦/º™BüLúâØ—©;Ž“Ì];Óñù¦˜3Š:“Rbç!{w± HñÒïHH5‹éÈÜÁ”Ì”ç"õ/-^‚)E’> &Ë?„m &Çÿùû¦*ö³(üÔ–Prü¥ÈfQ²¼CÔ–Pr¼!Bç³(ÌÔfP’‘Ò¿M´z ¦"òi·iâ¶„“p·¬.garüÜ–prü¥Ègq™‡À-å˜PÅ,PŽ{€ÜR2™¡xùTW9ß–ÝæESO½EË 9o .OÈ¢ûs2B— ód\ò€#û—@ó؃LæQù‡0ÎÁ¦ L•w§8.ÂI±’O…Í 9Áq6'dÉ:!Œ‹¨9ošeã"jŽ= Í£6òaœC-V"W>j´~5È’²'_6+äÆEÔœ%ç8JQ\ÍI"žͲ?Aq4Çd6ÚÈ?Dq4  ÈiÂÛ”¾ ëK®Ÿ ÖØÈL!n¸“X`õ&˜ÔúU]Ž} EK–P­‡cyØvj°³ÇŽÉ¨ VÔÝ•–ëC_nˉ‚ ,°À‚* eÔ¯`¹J“õë Ü<Ô]Õ˜)ª3kúºå‘‰ sCóØ›{½=VLÒ2ÃÖÇ_ßâaÌ‹¾ Û“µ|,#q "¼®šûHÇH¾ÆÂ8ëº ÌÕ¶\þ÷T3[b*-q޹$ÿË*ô—+SsãK¼þxdfL×­ïu’˜ú5ÞÒøØßëT#ƒOT|œ• {Ö9Ÿ9ýr•$ë²Ý÷õ@²Œb;à+û¦²˜3—¡Ùágê Ö‘XÜ[;áúÃŒjªãgdgÀØí‰;ížÌqÁû²£0Šºï©a^É j"¯ö}u¥@;õÁr¨y¡1NO¬ Iغè+=¨5S]=J¥ñر!C‚ã,9†Ç¤àâ½›0õ›ôys8>¶¼ùÏW¹Z_³à†4£—Ó¾ŠÌ–IˆÃHf˜yfˆìEàAµï>éæKDÀÐR×¾¥æ\°´eÞ§Ê£Üd‚7àPO)@+¹ùS€9 å'ŸÞø»fØímcEC|óµò ÷¹­ÁJc9Àöb0\8ô&ŽsgÑøšžÚ3Nšf“æLŸPi8VÆÃÐÓØ†3ïå@tµå)Ô°Ùí%[?–=nqW£{`¾-=ìØ_Õ-9Žèõ¾–Có€!V…Q Îíšš¯Éž&ˆ%<œHƒ5Í–!õŒÅPŽ> ©†ã;t#ݶ©j£M´ ¼”ø±:–m=вÁœ'÷VµCBç›°‘àt36’œÚˆÖìùàa౬Êw%¹Ò-OµuÝ“¡}oúÃÕèyá‚|¨wÀ÷š1Pð±±g Bs Rw `Êú¯ùéE ¯ì‰ƒxŸQ+uÜ óHÔtðñåk¿B|ñ=GÃß74¾1­¸kÓ2{{Í~{\K#‘©ÄàYqIKvj/#æó@;…sA2QØ„«¬0ÎwîΊPÞú,‘F÷ëɈ-”GÃ×ô¦2Lq’©PÓû«©‹§“y3ã°â(%eÝø¹¥o6F§&FÇ%OHáÇè õÉJû«ÎwSfŠuÝøcʺi‰³aš‚F”ÿº Œb¬ïŸp? ·³¨ ¬‚1zá3‹ £o„‚<ýœágÎ~<#‘*éYÊv ÀÄYì›ÉÌÅù 'ÂÛÉà•¦£Õ›(a²1ûZÇ8²µóÞÏ‚“ZÜ/u³ÞD¹Ÿ!ÇèÈ7Ï-¤ñ”4îmB/êWB)™ÛsWÿO›’Öš5yËH ©ü˜ö¢æ*Ñš5‡²Ì P8kÂŒ¶°Ë9ÈÁ–”›?ë-¯·×²îÌO¹:‰v°¼„ì©Ùw”,á„WÜàSܤ\ÜÐÑ uÙÍÔGÉ>:k©(u—œºKu–ºKéRw™ŽävODQ™Ö°±|Ã04&L Àá`i‚£“pcG,,pßÛr>" K;Ot[6Vƒ‡°ÍÉväøüã«éVhîVÜ Uß\ìWPܸܬʶYêSä®O‘gg} ¶¶O‘glT¹åkæNZ0Óò—ÚÁ-ÎÆÞDN%¨¿b´ßlª1!(K§‘¯™½Ó¶FK¢§~8v&û—A<HU Í=~¨úúPî\ßþ›>ÓúOß<»½Øi^¶`D=Y ž'–ÔhÁO|¢"Vu8WzE†Ä˜qnIF‡ïþ#2hL×Q‡6ñËý|-u©H#j1…=d+LñŽ ¦Þt"ðoK+g8á¯ü— Ÿàm¬‘ØyA*•g¾ïzîšdÿT™s°O¬¬UªÉZRŠB8†=•B Øïš®±ägÄÐß•ô|dž.)¥¥h¹ÌÔŠmyÉØ=c' #ÊjH¢ð¯@^Ù{Ö”ºØ[¢ ¼ïfÖN5´â ¡•xÓÙ†Vi…þVW{¨–½ÒYÖŸá3Ä€z˜2ϳ}àÆMG ꜻò„]9^ê¢w(¹qâ ä¥ü 6ìbƒM" ö, š16Br¹ÐÇI¦ú8Ý…¥vXíIÿïrFûÓJy0FZ)j6Á“%¦r‡Ïa‰š®jæÊkaÐ;µ· µÉ¸ÉtÁ ¨{c4Js‡»J{Hg#Ò)5Ô¨w4—îéè³+ iAa •)¬Ø¤1Å•xüÕíÇ¿ü/¶rÖ endstream endobj 291 0 obj <> stream xÚUMOÜ0½÷WDœi×]&- Ѫˉå— ÊÇ’l*ÚªüöŽc›z©UV»’3öxüÞ›ñ8zˆH´€‰ ÿET4Ñ»eôöŒGd³E-¿EDàŒGs=!£ey>Ç4A]Ï£HÝ«fSw3m1Tçzäh¨îÆJµÚq«Œã M f[T¹™Úæ·µ2Ke7æuUæ‡ñÍò`ÌÇ‘`IGŠ›pØí‚rÔ«a¬·yÙýZ¡a¶^ÅzZ ª5ãÅo3^^-ÍÇÆøàÐ|O'§_ONgÆZ?}8~ÿñØZ×íæéìÓÕùå‘åk˜±>¨MßÅs ]Ž…¦”r£IÊŠ¾Ú޽5'Æ0öê®¶}7X¯vw—&ùb‡ÑH+žId×úüçŠIf7;ϱÝ=ÃX˜š‚U䥱É{§;õ8rÎ0M J4½r.ÄwÁ”[‡á(ž)Ñ:ŠHL…‹‡ôä’áD‚ “®ÚoD@¡Õf,ºö~4•Õ…Ê$!XP{ÆEàf—g6ò‹Fe2ÒÀ—' 0€9yÙ´ÀìŠÐík¬Æv¢®óŠsá¥)¶€¦B `¦)–üt ˆÄ©ËÐT¾Œbî|~„bdXÚå©Ü_§uÈÇYâçëÓDšgè{,ÊëÎÈæ¸e£úÕnÂW-tý¥Ä<}E(MRüŸ¤ØG(cèZΠ¸/X¥P }_¹ÞfçLIxÜVLˆ¶¬ ¦–z°†$Xæ{²ZïQòÌF™s!0Û½mú/yÚL]êÌÚ”9=j_ºp‰ƒ7!HZ$a¯ThNÜ¥D„3Çö ÷ ”bS©F·ÛÞKwž-x/žÁc¨y²\‡ºÃ0îÙÕ\znää_¼©5Øz‡ÊðÞJX…N¼bœ4Ê´ k(Â'ÇLø 3‰ê+÷”RxôJõËÜÐÓå¿/:…‹¬_- ÷IÇàÒ¹~yóiU~ endstream endobj 294 0 obj <> stream xÚ­WKoÜ6¾÷W証ªDQ•ÜÚº‡¢Ä9u{àj[VZë‘Öýõµ’wm¤A`ÇÃy~3CAÄð“…‚ß8¨ŽÁOwÁ¿&Š£¼Â‚¢¹ÛüS°¤Q¦ÙGr,M)zÊg7Lyâe¡ *ê#ÊÜîÒ04ÈÅéŒ!LJ+žèo{èøL°•ÎàZë*7ؾöGGw¨íJ¢·ÎŽ}½ŸÆND8ò&fG2rÄõ}k«qÑ‚yR„jÌT b8¶¿GŒé8ãÚÀ²"ÀThëÃQ;𧸋lHù>QT«ðÅ„ÁaZzÞ,êÕÇSÄ–;ŽðÔÃQN …éÂ7 ™‚Û  O%H eDá°ü…¦àºN­†VõáÒõx † £\Ø¥…jÆú(ÛÞþKÑIJŒcrÉgØãn†=ŠêF¯[0sáÊㄎ*jJC=PžUÉÁõJØ4–׃ª¾>‘’`ÐðÇ:Ø y\‡Š Jî ¸¯Õ,xpÕWÊ{b£¯\¼L–ã†27ÊÞE+IyØ+£¸T)Ý|p›, +ú3›k1€üú\(#-‚.EN.àJ‘ÏfF}² oD.fΫáç¹± (ËøY¦r®]ë¼þÁß®Åv{ž0 q¬ê®ussæuE>´cv<>»ÑS®Í—ը𲫎zb¿åqa™áe)¶¹=ô>+šöv°3-µ_1N^Ã@)óŒÌ] ó(à>q ƒÒD:]à_/ww〙Î'¹k­¼mHG.ȧýµZ¤ƒÅkèo¸Ê%'k0Ð%{~ ¤1¾apÉBç*옻8Õ•O®ŒAˆóÔ®s2ŸK—|!æ·álÙË`'ØÌ¸¾~¸ gËd2áÉ3ˆ€ÎߎM²x=MîàDí´¯+ìrø=ÊÄ#‰:œYd%\Ò¨Áí+l·5ÍØîb¨¯[Ðèþý£ `Þ ð%d3fIhÁB«G“á›Ü/v³Ç‹Ö0wEðÝ[ÿ~;GOy•Q0ÚuùpZõÊ4ð÷†9žTå\ø²'š ¥ÜÚs|´ÜOî Ù~{<ð"7ÁßAb²È$LFå&8ʨ()gB|Þ/Ùó(NðEGiìž€ìÆ³Ó?«Š.³()€+K¢4—ÂnG­×7Ðyæ×:J}Ѿ½Ò!¶Ì°Hûÿ·ìÛ¤ˆÒÕ QÐ(h)Âèš ª ǿلK pì5oW#vßÐÐãÆ’ñÄJ3³ê+ÍE•¯Æ’¾· ý,]¥Zªø–ø~³.}…GúÛ‹¢PØÊÊ=a…ò‹Bö,[ÔE±ŒŠRO·¹6dŠ.¼!ïøýNÖ endstream endobj 299 0 obj <> stream xÚ­XÝã4ç¯Èc*¶¹ÄNžH!ÁíåÁM}{9¥I/ÙìÏ|¹u¶ÙE Ó®äx<{¾~3nò))’þФVðŸ'í1ùþ>yóc™yÖäMrÿ>)ª¬)“-Lrø#UÙf[ª2}×m¶ªV©;n”I÷nÆi‘ξm»qð4Õ0e®ó¾kÝÀ4/ãaœEÄÔnT~è>ã0^$Üä€éæ¶JûQdÆì6 BÂIíx<á†.!i¦îáì¿Ùüyÿsòö>ù”dº±É_I¡‹Ì‚–0¨"9&*Ï3£Â¼OÞ%¿ÅÌ*ËÉ$UVhàà.7ÙÑÆv,AV²-uf-ÙqöãÚÎÑmÞüX4wYfZƒkñ[aˆ¥m™a[謪þŸ¸ØÉxõBÅâÀÉÆjV®Ì`œÿ…[üpøöÆ7è‹REæ„ØÜ7žDn­#W !òÎ"Ê!ú·E©Ð x“ï–!¶Ùj ñê{þ h²8o¯[™)®¡¤KûB!§E63¯*„›8ZRø´q$Ü£[ ’<¶íîZé§3¤‰®j¸<Ž7C­8¬.²F½‚Ìð¥(ŸEyS¼–f=,Uåž֭®«¡ªË:³‘Ce¾¨!NÙÚ(2{!JUÕd¥¹ T{¨2^4Ü*— 4PMV´ó×ñÑ}P^!*"¿M{‡c;ÓFѦ'×»ý$‚Z BI!üšƒt­°(å—è_‰e²ª/—¹0`}r½`Ô·²Ž=ûĶ;}0ãxì»iöwæTS²vw L€Y¿ÓUñ7”u™ïÑ€óuί)ü8N÷oÍ!—ù1G›ýÞw-½ß(Ò»G?¹>C@q>âar±¬”b䯳àZƒ» ©FMÂZncÇPKÇp€®ï pC¯A×+äŸx¦¨P3ÙÀ{vàeÏJ¹éa$Q€, SØ>\:©Denƒü 6=úãäd#Œþ¡Ûw=šüV“¤YÁJÅãLüܹ?¤¶I²âH©ÏK1|@‡Waéï˜ë,»ÅA:lì c˜»ùQVHD@ ï‹“kA _qëß»[W+£+º¡íÏOÃad*A‹)Q&ÆŠeE;0ÌglÁÁOèp/føGš d…’2¬·öª©3:ǯWRÏbSžK#¸"ÖÃöíúö°ûÍÈ—a…4·„†ZBœ|Û]/WZs¡ä|U:¡+%Yë›Z3 }î†ÀpìzªØ]F¹À$´>$뉳{\a÷@Úm^¨€÷K¬X3ñE½ÊOu®g*©zõ85F5®­‚ 9M#¥D^?ðÈ5©\”QÜÁX˜¬®`X VÏ«—‚+n_(“übT Y˜ G?`UÜÚW`xPµbà`°è÷VÀ»äêuøWyV… s|Ê¡{é%=o%øÇRöãñq—Dë=/DúŽŸ¿Ô`]¶ªg[õEYnÑ+}éžá“ú=Ú#–ÒЦ/c”´÷Du¢Ørÿ}d¯©­@-´Õ^~; PÛH;„÷Ë9ŒoØWR¾Ô«9Œ ¯%q,€rN5Z˜M> stream xÚ½WKoÛ8¾ï¯r©ÜZ¬ø(6ØC$‡b{ènnq²Í dË‘ì]ôßïð%‰6-'Ewá $‡Ãá<¿¡¢—G)üpÄ ü¥ÑjÝÜGï0Т,î¿Ã~‚S$`¾~ˆ3Df Æ„Å7u3K(‰_FžÅk7–û¦óI«fû|ØÎ(Ž÷ÍìñþKt{½DˆŠ"úGɧ)â4ÚD,ÏÉܺŽþо |ˆDI Õ˜„c2Z‹H)š ¥5I,JX8ךwr¯¯þxWŒØHŠ *(Žm³Y¶³ ÇÒ2zi±œó€$(·ÛVü{ªº½^5gD’#‰,,Óó| `ÙýòA¿ôµúa{æZ3$˜kZ‚ÊÈ/÷ëô_»ͲÍRë[ŸÓ˜çÓ.Í.åç]š½Î¥½jé”jÎG( (L lä\œÈå8ý¯V;É›i ªêÓl(n·ø-€O°Z˜õÆÚjôJQŽÃ©ÈŽ2Ñ.;"Y«‘©ƒ3Âãe+ ½«`ÇËYÿ4§uµj ëÚœ¡õàØ¾¹821&òŒžOpOÅ aÚÇ&Ɉ8‰¨Bq£á|ª’Ʊ±¾ìší,a"»ÃRÛ®«•ò"iôWÙíÀE,WÕ"¥lUÚ3=âxSIëAp+D¼+Û}µ:ÔekµÛçØm†uî¶·Ô†R® =ÁTåªRÒ?¥C×™0( T\ʶ•Ou,:LPáB_!‰Ä–ÃH¤'wRÓðŽvºÅ,} á^ø'ú†—P |Huß«“€pT—Û w) ê>ð¤:ÒtÈÅJ̳å²s®Ø¸©y*@(v­\ɵ´ÂJ3ÔúÕ»½pCßÖfSí«¶ëÄ*½¿þÏ^†E›ÓðH£Â çß=N/ò™Â—„¬¯G^˜D€QÖr*èDàܾ|Š¸ìª§m 5¡™E¿åÌ4Ôm“(V[<ûêo•iE ï,”Y©-KÇÕ²‘ÏM«*O;ÞZVuµ.××ÓnË8b¦û/â`‡íw:«tn9'„ûCáŠk1»n¡P‡¨c2è°µ&LjZ{·oÖQ› ‚"&´Xý„…xlvµì.©C!‰R6¥NíRÙ=5RØÎ. Xß›vS:d1ÊLÇ…áü)ˆrÈõc Ho«UU¾ÆHFþ¯mìõ¹`fž¡Ü¥ß¾…„NJƒ&«+~Úf.TÇK¨‚  ÎÔ×ãðÍ$p²BìŒd æõx»•fr'—fòUÁ¡š|^¶ŽòÃL¾,rxÎ<~R¯æv‚û9Èîç ~DÿÑÏá’«©[>?Ð9ÈyôíXÄxNT˜™ÓaÁÆ;tŽÇldÌÆÆlÌ=WΫñôxw¤6ñj"0opÇߤOHº¯‡mõE¦ÚÔH&6ÃõÁ ‰NT !ögÙ©a?kOØM+aÊØ•ý$?±£÷ÍM WÆ ‚çô(yü$Á>³—5v˜ñtæœhó~?'â(`sjãGæÁDò©8(ø°?%à7ƒÁ˜Þ=Ô“§¼ó~p–Ÿÿ'A9qûÛ‹ÇŽ*[ ‚«‡íq%„K Ô/ )ÔÉ$g…É]áX¿ýö/«§Ý endstream endobj 307 0 obj <> stream xÚ¥Yß“œ¸~Ï_1¬o‡Ip*w‰/©T*•;ož2y`AÞàb` Ã%—¿>ýKŒ˜ÕžíJyË@«%µº[_Ò>òCÿòC©à/;´çÃ÷‡oÈëCž¥uV>ê2ÕöpD= î2.nA^•2þw‘éáÍÑùUÒ̳{&þPÇ®?»qé§±6 (öd‹ÐÓÝŠ-e“_bF›fF¦ý>n–Þ¹"³À7n–Í- ëäy™{´!½;–Þ¿°5eòˆëQUòiu˾C×\¼ÉÏÍܰРü<÷ËyzuúidG65:ÌL÷ií¾+Фt©’ Ϊ1iF|š@ƒ/ÇCöÝÄ4 Ÿ`(¿¸å™,wmÊ´i›‘åähŠl\¤7/†úÉL¦ù|•výréeà$4?/ÒÚp¶k²þÝ ‘©ÂȘTûŒFg™˜X²+uYm³ã+-^ZÔ$×Û"×0­ø‚ã€×Ö¥áˆ.¬x¡¼zaf9&júèXŠŽ.ÐÃî,ÎÅÄe%Ì—ËtŸ6ç€×AqÌm•V6 $Yd!ŽKÿ4¢)Ö&ò ™í‹™­´XzÖ¡¨ÿª.§0¢%êMÁ à†Q¾É¿ð\Ö…[ν;ã(3ù{?çÀÏ}¾b/·øq_bé¶çà ‡XNwœ.ï¤ÖüôGy™Ÿ¸ÚÔ‡2­KÞÆ:-Ñ‘Ö ¢o=±“èïòÀ'a•ššúðÖµZ¶né·®´[¶ãërÒVfÁÇóê:Ljp3¿¼ØGï+ÛÞÞ,E*§cÛ í:4ÃiÃa2›Zµ}êÒÚ›4÷pKÓqñ8,wùvc"Æ” °¡/½€€‡‘`ïq½ˆ†g-¬|#NI –•QiU‰}R–oâ“_ëek€0CãÓ’H¼<]/»Ïñ:<Ò¹±í~vÖQ ð ô¾ÇbÃ@itñ¢(j)[…”-s³¹Pƒ7×=2 2ú,Žûtî‘“B&»Í‘YÔWn§3Zð8‹>L@ß”Ÿ4~ßÊ nÜÛïFaL>Ó¯1o¸¿ûoÓQ‘*=ñ%È}ß"φðêP•üAdÓe–þg.v"ª-aƒª°}ïLjYø‰ÎD ’,y ²6·’ c$W,®Œ›Cò@¶°/q†À—Ì& •–;x׆ÞÍÊ]Ü2(ܰpÐüÿsn¦èf”3ܾ"vc¿Ê_Ã2)¥Ëúx‚šÙÛR~¡ÈáŽe´MÉïyEFø…Þnfõ +;€²Ç`ß¹EÁ¿Ñ ™2ZðPNÙnJ)è¿iëzé§D‘r_®tÎÈ:Í>ˆ,Uë>µ‘ø¤Kuv~p¡|»ÕܸJà ‚Ÿ„½Xiû§•j0È–f`ÎPÐÂÌ5·’DR†›|¹—Š7õÜz^Àx™&´Õ(».R ÙnUPóÆ#(’ǂà 0 Ó+¬ê︳Ì-L)£7¦b™© ¨sô‘X¡2Œ&ôøÐY•p¤$Ò«W¾Ùí ½8ßÂ8!)æ <ˬ´mðeqíʸ‡0_p `°ÁfO6÷„Ný—¯NK ÕjK䲫{š¾‚^”yjs<€ñ6rŒ1 8 CáªÑÊbà…È6±C‘ªšy§„ïnêdY¥-¶ÅJ"{AiQ1cib¼Ù^ çM=6™ÜÏ!MvwEžÐ|ø3ƒ:™û:­å&Uæs•܆•¼RÌ +Éwü¾rç‰%@ƒÐxI”KOP !;µJÞ;V"Þ%#-ÄÐQÈdg÷qšY¬$—ÀAa. àñÇ~軦۳ÑÁ§Õþ,©Š’ Ñ€£\Zç[ (IŸ|œ)êN² NßÓ²/H‚øáI#«eŸûH«0ÒG•<+U<2QËë×Yš—ÁIYÁY‹ŠwY_“–¤ ÅjHågB\(=©€–´ÇKh•A†y®øLæÆT]¦¥OI%<îA $ûs ]í‘æ ŒWz%Â;`Œ¤T3“< ƒÞsWHîuGX5œ}+·œ´É[¨²ÍÛø‹NÃ×/nögHŸj¼[òÞ“v½A[‰r„U›ààt3@@yØTîÿïIÔ—Obâs€_s[òÃ&iÔ9æÊ ¿ØdóšÉcôÎ-UÉ€m‘«=H4\‰Q ƒ£Š‹ò\(ê«#evP\êÏ*8:~y ~mÊ×-×°”ñù «ê«Ýn^õ:Þ‰ÉaðìO‚~[ÉvÃó†· 'Ô r"¬XuÈŸ~OdNUulhü¤YÕY ú ß,ä"…zÄóðe•¶ž‡cN{ßcy¼^³\ÜÜ/­ˆã¥ZÃ"7(}ñm‘–j+Õ^:#–ŽCîmåû„ÌFˆ™*Jï²R\f9ª°›ù¬(#>+vÇ-­2Øõ³ÿ÷cìI= ÓÝjy %ú ”¹dfë‡Í†Uãa¤œ('tWÀZqm|yq)ß»ÿ Ä£žªµ¿ïÇ-–)>R×Fþ‚Ö×úöET‚-ßà°Ä\—Sã-^»béfžîd2Nè[ÅÛìƒ#¼çÓ!Õuuø7Ò¨20“3þªí{8¼?ü(¿fuYH+äÓ T¥JïoîX×B]¨ñRˆ-PécQ)¼ÒGÝ?5xÕçà¢ÂË<ɵ¯£†Î‡,bÂQï· ÷zðê/å2>ñõí ̱ÝÿCëMý¡÷àŒŽ="tüÙáé¢_{‡wr1Lk½þt7-ìpDƒ ÄÉ(>âºeoWâF®üà|?Ï<4ö?= “ã«…„Ê“£¡)ñqwày-06ÓÞÚ€Ü!ûh,yï0dcêù|îéÒÑ·cß"ç7°½þ* Á©€̼`|æë Ù~  Å»ëE OÙ Û)Ñëº8=`¦Í°'ö»ëUUá–>ZÃ$¼È¼ê¿ù…õjB endstream endobj 310 0 obj <> stream xÚ­Ërã¸ñž¯Ð‘®µ°ÄôT.ÙL©’sŠr %ŽÃ)IôŠÒTy¾>Ýh€/A¤<›²K$ñêF¿»Õo+¾Êᯬ€ÿ|µ=¬þô¼úù/jÅsVäÅêù t¯ñìžwÿÎÎÕ±:=¬¥.²í¥<Ÿx7y¶moká²æX„…q-{Xk!³Ï{Í&ÛH+•Ÿ¥]¶«hvÙž«SÝn›–¾a ÿÜ—45,}ÚÖidèlÃä]ulõ1 …)ÿyþ+ìÀ v Áì7°«Õ±írœ°p2N]Óè5—Lk?åíAs€Ž¿‚1¤’TÌòƒÑBÜ1kýCKßîIalV}©¶gO¹H—]ÚòDoû²¥—~Û@ÕП@ð°@[¿^ª' 5—ðÚª8šÖ¨ï\ªm`yj"SÂÒ¶8îKŒÇ/˜v¡{ˆÛ˰ÓM–`‡qLFvÔ¬b‰E×J Vè!ÒyJxöÛ¥¢—s šÚÏsAP­^"7C™äYµ§ç˾ñxt€wñYž›ö‘}¦1;lžíãË©z­[ОðÙ^^Új{éT'Jö qïäI–Ë!Mˆ¿¶ç¯WM‘/oJ¼ m$ø)úÅÅŒÕV…Ë~¹”Ç]CË{‘pÕ‘öa²óÉëdœKÂŽ)u§`ù !QµÉ¶å®$X—Ï"hÞ‡î”t¯EQ0LJD$eÑÀ“êð¶/¿—ôgÓWà@oN§¨VÍqWx¦’†VØä$È @rñ2ôÊS@tG†Ãdi®`2’9e¸ Òáz}Øäe.ÃôVDð.™*†Dôj ”õ Ÿõq»¿Ô(Jy¦Þ==·Íñë…ÖnbOu+ý ×$s†cvJù,ÆÚ:“ý¥ „ƒ«¯È=”e7„„Íy#§e¾Õ¯‘'4GÝ0ƒbâa³Êo¶³j#B+&"ËOa€ f"£7y.Skh¦"3>¥ÐPÌÅ~~c¾Y˜qwÎ×iðÈôÀt^‹›C"Rÿ;U¡Hÿà-‡ –£dl¡kçå2sÛK÷&KÒ´`¶ÛÒšƒž¼¤V*ÐI߇··3ˆpÀ.ó°±-GÌ]7Vw:æ'uŒ¶Lþ„ÈB+ªÛ¡®yÕzÇI8TÃ'¹¤šh—1Ö.?¸MÔÞ’s=•óñ èёȔÒ%)¿WKÄâü‰!Xä•C:ùþ†Áœ(ÈÆØA0‡mž×鱡¼é}ãwlGÓ†ÏCÝJh䪳ŒaLÚãÊœ3ç>æ p5ôiûêÜŒ¶^oñ9GòB19’ر€Ê+•c%jrÍ 5¤å¿|(òì›ö>®bÜ]E£¸ŠdBR”½žŽq©à-°}ä-°÷¿À‘0‡”ÚJpÃÕ÷mh¾D}üs©¾=@¸š’ÁHÜbG¨†¬ÅKíf^D øJî0î&3šìòÒP†µºqÌJ=á‰1+xUcóìÏ1꤮cs.ObB{éÙ¡4 Hý>ó«8^åz !ŽW¹¡@: e=EY”uf+`eÚÊör¯”-Š&„ –ä]|fC|f(>Þ¶9ÆUzÅó¨„öÌ—¡ó´«Ý…ÅÛšôœ$ùó3eÕ`si…Pà› ?O3Á$Ø".tökïO¬R£ö¥ò¡™¶1½¼N¶¸bðBJíSØ <ŸÖb¨lo±t©s02¤±i£,öƒÑ&ª0_šÓ¡Œ6! å]Ú;5Qvç_½þBæ¿õ@SÁÛùUb/õ ^oÏõ¶|JZÆS?àfˆ¾ÌGÉ•e…õcHU™QcÇTŒ‚iVÝÇt4"#}–ˆ@ì5qÊ MŸ©¡ó›±Ôz !]hs7ÊêÊ)¦¯…1Ì:x e¼,Aî”LÓ%ïåuŽ@rÄ…±[¶rÕxL]€° CÜ´ÐöDî& _&ä$•7Iê0ÙèFxÛ%dq#ýÒÝJ? Çœ™×W5ÒWLý¹Ì~ñnöH‚øv©vi±fˆ/—€§Øqx†n¤Öì~!SŠ ÉY®ù(éôÁŇøbÕõ$ì= O3Òú[_¶ªÂ2ïd>üâ¸C}®ÁÎÛt؃(2Út•´é`ãNà!Êý¼Yw3f]3ngÍ:f¼spœa…»²ìJBäó UVžjïá[¬c=IÝ6”ù˜ ¦[E£ë³yøèûÏw¬7¶øÔ¹­7r&ð™OùÜÙs9cÏG& í/[+¢aÒê Él”ýíµ S3]B Áò*É|6\Ø~•'²OdGð!þ6a'`ŠKŠ1- Ôð~ñ?¦0Xsá˼C¢_ïEc®½@HÈ Ýƒ+S«øªx·Jš° EîCË$)+r¦Íes#R‹Ëœå.µU5`¬˜–Õ&$»àPŽÁ<ðE’ªñˆ$U‹´«Ì“ôîeæIª~”¤“­~€¤…FYPàk‰îk©‘LeÆ$…^ÝâÐá#R·H{¸¦ÅŠêLÑÂ4»ÂÜ B,ƒ¸âl~?ëøz8Ú‰Œé|îB@H…bt”VÄSáÙLÞoFJ-'0ԆϣƱ_øJ‡€@5>E`QêFÇbn7„â-Æ­áèýgŸèÉ.¼2>¼2^µÔC5 -§'tª"}(Ð %|ì”}èônÿû§t\/Óeoû{¹z? qŒ+®ÎöuMOF¶);7Â#¥/ð†^|Ä\ÅÝ8pƈŒ[b.¾¤™‹Ó¨|Â]й8³Œ½ûËáX†I¾ÔûÐKÜÅš Ä釺+=4Fª"Œ·1ÐL;¡Ùâ<™ívó–9q?q'µ2 ›üœfÔ3Y¤²vŠÓm—È¿¦b ¹ Ç‘Ü ë¦ÔdH)¹#¥¾tlÃ2d7q{ Ɍ貔!½ƒc–¢ò&T —£¦½ý”,AðèjüU…äLF ¸N,¡QKúóf¹Mö9`Yµ¾Öoñðå‘J°Ý ¥1 ²ßÒ·rלR¨h0ÆÖSZ»\)ØI‘½ªmO×Kzì㳦Z1ž»‡½ná×{8²ÞÇA³ø ù~D ‹à'Y£ìD-À#±À„Ée—²¿.1¸Æ—(n¸p#KvðH©Ø1”é†92I$Î>YÞ5- ''WÅ|* Њ^„“š=8ÎY{ê¯iW)x¯F»ñ%;½Ä!¨ºLMƒT?7ã¸etîJa'!œ˜¢;=*})¢¿ P'–°L|d‰…û©]X–ëÿß&¾&—0úK,”‘ã©g#vuwº$2 Ì]Q#u~ˆ¥3P5¼éAòX'ã!&ùm8†LÄ V÷ûµ¾¦Ï;‡kÝ:«TcjTöO¼+¦òx»èêÚ×à2ÔŒï’3J—ªþ˜àÕÇ]íÌöžžmýê­ ¼°²ÓÒ{OûQA´¹;?þ)í8ús[4VŠwn]ßA«UD¡ˆÐÃËûKÆövé"n¢ ðïÅ(Ý—§WVÓe>eá4Þ¤:f„—É š×„n‚™ÜPŠNY” Ä0ÓcX¥§Ç°kåð@F7T¾„Q‡x­Í·˜ê¢¤rÊõûd‰ãÍ·‰,é(KDKác¥á©ó>Ö _£¯‚Í5¡Â›.kûã‡õ’lµÅð@‹†Ë-ð=¹³!ìH<Õ¨¬ã|bmB©Só8ôø£±œ endstream endobj 313 0 obj <> stream xÚÝXKsÛ6¾÷WðHÍ„(ñ ÚÓKfÜC§‡&uOqE»ôP¤CJnÓ_ß]<(P†$»M/dL Xî.¾}#ù’Ð$‡4Q þçI½MÞß&ßÿ(š“2/“Ûû„¤I† 2¹Ý|JÙ7ÓnXe¼Pé—}c_šÎ>Çæ¡v£ÛÞV»±­ÛÊmnš»œ‹Þ|¢S–íöOÝ0½ƒŸ’§_WL¥nÉtjª­Në¡Ü÷Ha%KØi¶]±ìe:XÚu ëæëÎqyZeL§ÃX·w ©_}¾ý äÎÅIQ˜s=·Ž!*ÈYjØpžî'äÌè¿NÊmPs´,Û´ ÍÔ}Õ51nn-˜€+¥¤D)÷vVh¢ŒÀ‚0R¬2JY‘~<ঊnðs7VÓ“EGíà RX¶7£Ò!• ð’‚qUдÁ?F&¾Äì¥SÜËÓs²¹$’9¶;À½±xàá9µû6•§÷øwíδ޵uuåDÐ2‘êLÁÁPܺÅîV«¬ÜæOhð‰ÐD:¥j¿ÏEJev x{F‰†‚Æ8€0Æ“™æ2ãB5ÆÌLs¶–Ê>¤yð¼8ð3oŸè€yÃ…–D«€ù1 @DI$ÝüþåY ÂÅED4¸*ÆE©Kœ #T¿‰MY–ãqÎ ›CF‰0ç9†Aä¨"0,X>_⾄΀pALÓ‹ˆòÓÞ1#Ê/BḜGôÕlÎ#Êÿ)¢GG} ¢¹$\YH™/­xiÅÏ¿.-ÚÜ®ˆ”Q§§L´}‹‰Ä)l·/RDøÄµ¤7Y~;ì2^·¤"&/CÉ}¤@i¥$Ç ÕL¸}’"…ºÑह «(¾aMǽMÓµÛvWm†1šß8#\»S]ÅŠONháö+ËÚSQ°°èt_ù‚ïäYù#~ªºj=VN=X…/ŸñOUGæ˜4ò°½Ô ª°ô–h&+g°íGmš»ôÕ …ºê•‰vœâØfœ2 † jˆ+{7K^a“¿P>ëaûÔ5»jÜìÚc}í†GnŠ{)˜„•~Þ9$FÏÃr[¨Þž=–`ÜDÐÍG¦êãÇ\±Êù‹>ËzGógÝ<™>Ê™@(„ØU±R{Ÿ)•ñ·ip‚MÓpÚ½Måèà b,Ãzv”ÓáeÕkã¾VÐC½Ù8%:§‚Aï/§Ø0ŽÍäZÎÞëm,»®éõZ°…‡•$糇EÂÄqc#Nµ$q<(¿×6D²#WX(Û˜Æ|Á,Af²ö51íû_Ö;×1AªÞ¸F±ŠI„¾, KúG§¢'Oå ŠÀ]bÛ„;Š(ì³q¡¯‰–aäÿÖ›A&wA ŽÆE™z'k Œ`¬‚€0Áâ2,’·ý¦­OæW `Ћ MÅ|]uuÕ×f£vq8š>›a²¿;ÿâSÍdé§ýzjê½Ï#“eù{5í\Ê`¹Âˆ œÂΙ83¸gÓÏ F7N óÛñ¼g·íÃM‡0½”`Å̤öuc×DºîìYf¹Þ+7Õn8šïhŽõ•C¥´óÏax`nÂãf¾é{d3¥e¨lB3Od¸\zªFLÙÛ³³“ô%! ùÀJ[–É6R¢óø….ù5ùp $ •D Å¢‡z2«úÒ!0tÀç-T©¶‘a*3P¸Žnخ͘­šàÊÜ{÷»§’pyn*³dôˆ¥ˆ³$6v‰mwH4 ºØ¦àµ«¦0L¥éo í¦¹¯öÝ.ÂŒ©ü€þ\uñTÀa¯ÆÕ)ØÿÐH :¼¢´Fb‘LÜ_ŰeDÏÀ0ÎvÕzßUá5Ó‘Xcj_úD¥¢/}Ã¥S†UòV¥åQÿ¬zýoÕS¦£¼’Ž_X$ž0“ Ôrd2·¤¨Pcü‚Kw{梃ÎÑ!N‡)0xçr;|ˆuc=ºk¾©ÝbG‚W{2Å£wm=_ø¹¦äë–™ÔìÐ,â„U¬f<Ý»òó¼‚ÙÀ|góelv…¦Þ9Åß@Û™âmºZ]ÏÍTC#ë8xÍ#¢ SëË1zdCŸ•¦Á!4w$v0šÃŒ¶°Âi¿'ÜÚvUêÐUYtm/〣naQ°]{➎ÂÜzîÜæB×óYÍ®œëü«ëF@àØÔ0:ö¾S¶—®V/±h·ÐöÒyÌt(¨etÄœy,ZrI_)0¸ô”‘êBâ½Ùì÷J[¿W‡ NÚÛ}¥\+cÓÔ>ô‡1ž«rÞ æWXí‡ IÍv­é”3×s•~ÞÆ¯íÕ=¬í'híZ×BN§gXÃ\l–‡íè¶yÆj\^vw ÐºíÚMµ¹>Z©‰°Œ>E«Yé+Ó“‰ !g²2Î >¥|¾dIÙ9?ß÷ñúú$_Æ4Â’I¡mÏË<é‡ïþÍq5 endstream endobj 316 0 obj <> stream xÚÅXÛnÛF}ïWè-’am¹7^däÁmå"…[´®Ð¢°Œ€¢è–-E*$e ßÙYŠIƒAŒìp8;—sfIŽ&&|âÁ?> üy“d7ùf5ùú.œpE^4Y=Ãí¹¹ð'«íãt7e=ßçqQÖ³§Õ“å w¨Î®Y¤&s¡˜ævWZïgsLÓ$[{R%ñl.¥šæà‰^ILs¼¹«µT|—6U‰·Ò×ç²ÚÁ23©ÜôRáQ?{¥™Šl k×/s&ÁêX\oy\Í´yªF1Oýß5RF—« =æI›ÉzÚTël åÉŠeÈdôù%G’éðlÉBPÉ ¸’hKaP2hlÉ‚wJ%HU–d1íjª¸ÞÒÚÝ^Ó.Ø]7)JI\—×FT œ°?3È´¡®5= eh[ƇCŠ ×ÙŸG€£/ÆË}œÇ›Š.Ђ³ó_J÷èàêØTÄZuá¾I ¶­‹\î²&«êt=c´+èìšóP² ‚U³Àî]þîöùà8»Ãf„Gˆw³¹œVfÑÓÅ[\ÕÍœŽõz£gÏqY) —»tƒ‚ÄåGè,ôË톮µ»ÿñ•ù o ö›kR §„Z¥tJÈ¢U*§„TZ¥>Z~|s9!èÃäŸ÷YAÚMí¯,­Lg9`’ )2h2²”š…¯vÿxõtÚÿõçHJ{’¬ctHÞ™'ˆ”GôØêåe/q^V瑘3~"QˆvÖ«Qû! Ü1Zœ„†{ðÈ¢j¬ÜÏÃ8™KÅdÐ @‰ #X¶¬Òi Á=Ï€Þ¸äfKÇ«Hø„½5$;çHZ¥æÇ#α$„ÂÌWgà]`IYQv)©^¼Cq@1¥_‰G`¶Œñ8ÂË<ü h±1jÈÀéûèµ|€Ç~Þ|¶é..¶1Ö¹MŸãCÞà…‡Kç)¬àEuý,¨¦»‡[í»åФûÛŸHúý“~]Ý“t÷°líîú]'‹x7Jï²"®É^z×Zy« ôà–0°ÛmB{ãS•¹}áY[mÝÛ@;Iµ:¡‡aÃÖÊìùN²¢‰ëQŠŒ skëDŒê²! 2Ä#´9/=—ÞÃ˾¨÷eÕ¤=HG¯®¯® Ö§EKÉGâèÉñýíÃت ‰+€‡Ð[¼œÀµœL|ýt"|{¿ümAÀI^MƒŽcëÆ)„  g"ÏDøùÝj5ŠÀ#WƒsÄŰáÚ2”î–Æ<¹,3Ø––cüˆi‹RCŽ¿‘7ÄM]`& f¢lÖS rðñà5Ì5*"8RL1\ÃEmTï3x¨¿ 3Š»¢ô¨Ýüa™¡–™Kg&2#‡ÌŒPã᫘ñ?ÍŒä„÷Ô‘TÝœ˜ æ‘`¡yÈ…Lã0·ÌOͬʌ`˜Æ&/gšÓ…ðö3kÔ_F´Ã{3á™9OÝ6ÓbZžÈ„+Ÿ)A1jã3§‡:FÁ<³QÂ0<΀ê]x“æ“´½¤‡¢uÕA³ž–Î’Þ¾<|¼Ì´†:2¨ûCeƒ[á45ž¿–c†íaîEwczg—4Œ'YY¤5}QÐ`|$íÞDRœ[rL`Çj„¥Ç®˜Žëµô¥14n´7Ò …Q¢[·‰0¡˜›E9Oâx{ª‰9SÎÀþ"bÂRx;ÙÚ”Uåð-‹-$h( 4jwYÀ÷µQùø½’6iÅÎþR"DhP™û (ÑÒ™þòÕ¿·N¼ã endstream endobj 319 0 obj <> stream xÚ¥ËrãÆñž¯àtIcÌÀºrp’õ!•C+'ËÄÊp€ [Ùýz÷kð Á•¶¶¤ªzÓ=ýîæîÞ¥ð§w™ÿtWw{Ø}ÿ“ÛéTi±{ø°Ó^nw€°{8ü’ü«÷÷ÎØäPžøÑ%‡ú1µ®kPw²¶¼>µýþÞäÉç:~!k<΋È/åðh>Ö§¡gÈ(ØŸrh\Uvz¼sWƪsÝUMÞÿúðO¸…\Æ*ïé2CýÜŒ@X°y¼±š—¿gI{®Ÿ{µ¿©O~Ü@hª¦ïÊöFNõ Ý?X݇¸–§Häå\GèXüð75Yò˜é«ê;ÞŠG—§¡y:Ã6Þ$]^¢šYœÑö÷?éb¡CgUæàD>ÔÊs{´¥¦]ªà±ðZ™\+ÓIu.å©™X]‰|Ff³4ù¸÷.)Û~à×/u>>Z¯‡•gC‘ôüÉØq÷‰Ž{´Á¶ŒŸ½ ù×Õ)n•ƒŒ¼­¬…´œ[•Û¥€WHããTêtž¼O ,/ø6Þ.À͉ã=™"˱yFkC aK*wx¯4‘¯JFÏ#¿›šoì &ˆdÜ½ë¿æwñ/0º+åçž8¯Ñ¼0¶ôÒ”äŠ6rE<Ë ÞÙD31ÑØD!š(Z†-oBóN'ïekeg­Q©~ÝâœJ3Áêz>v®¢—è<–dž5l³ ÒœÅàèóO(M´ køk“ßèÝ]Û,Š™6:FlK^«~”ßššì÷$Çñ•ã RBkÙÔƒ"¾Þ?pü„Pªµ*PCH[Ú¨‚ØôÊ*½G² à lŸÜdz*`aiCfÂŒW>ãx\ V¾Ä Êy‘l¹¦ãRÃÑ7µÉ°÷iRï½Nˆ>lÒLse£:“Í£LŒ0ïþºu„V.ÄöÑLB›[øÞÖG‘qÏ®¿GæEm§æ#n’!&ù¹f¤)žÚh)¹‰q`Çú÷~`0iZhéF-Hü©i›Cy`mDë-ù<,BûÈæQÈq^±€<(c&0bÿz&­×b`€1D•½ÁÞ·[F„r‘9éöRÓpœ¨š¼ª` =íÜ&œ(0>²¦X–“úŒ/f£%è¡f(æ1Ôèз¼Aqw6R ‚1‡_ߍ])¿û¯°j3åí‚„x þLŠJÌb¾r÷^|®òu€ ¾wÎ%êeØ€(Ý<ŸW±Â$úá(Ael:¬NH¢:5UùnË4$­4ê”×Dñ—ˆ¥X…²a’ìÛ]¦Š w½rp„VC¢Þ¢Žœí&”»o&bÞNÄmÓ¹êñµ)7[Ý›Yv·Xî¶HÊ,Xþuƒe0Uº×BGHõ?þ´ùjE­R£Êì+z *d_­§/Ñ sô0k%Û¦o2•ç_-uwSècßÅ4|Œ98zÕÈnu¸ð¼X§IPRÿAtÄú/Ç€'ÿ½<”ä6Žæ(H±ðdSp š-b09Ó Uîøp–=:íÑfæXYû5Æe°_Ô¼}+²PŒ¼ªÒ¡+oç[ —œ‚ûw²õ*3S¾ÅØeS*ÝðÈ5¯$3—†‹Öˆd]ø[Ú(¤Z)kÖ mD¤' nÕ7P>š!¾vË3½`œˆµ(¿®EØÃ¿©øÓú÷úøÒbáí´ÁR‘¡íuͼn0mȹ ¬+\§6Ï‹ œmüUpQ™•AS1z9¿ÐëùÅ4/ùAü*ª0M@ÒÔnáç™Ë[l¸Y_úÆ÷áß›7Ò÷ÛŸ/o`¶O€(¾Ñþωíkò&ꪛ‚194iˆ¢#=×1ð-ï|Úº„BàÕ, èi“™),pÁ8²Â:"¬Í.sÅãpq+`Ê#VdmÍoRÖô’{q ³™Qk~¹“ŘL ²-ü­ÜÈZ?û ]æv‰ŠEݸ¥18Sà¿iÙîÒ²WG,MÛ~£]êoô‹×횺ӧ­cŠyÞ³i¼ © ìÌ®êÍŸ)–ÞëáØœrU —ŸœŠëì@ù½« ñ6®Ð <—ÜÍ„Ä º™‡}n$âæ—ÇaÌöV~W+¸—äÇc3……¼oüØÅõ šLÞ®L~z^¦ ü(6Õ™fí=C«rŒöÙòú2 Èòÿæ(XK´R¥eÉÔ€ð‡ƒÐîÛò¸ž¦…ôô[Çu Ô¯›ÿNeåÇÄ×fúæÒ!ÍüÝ:e!½(ÏÉXþGò4ø«Þæ3¿\ÊA°XüFo¨ÖiÖ`WôÉGÅðu„ÝßJÖ¢‰µ<ÀJ`»þ\ ø¤<}®A~!ÐV#sm2T—ÉSCÚ×3ÑTla°Êj…4LºI ‘1@×?EéT*í"NÔÁM²ä‹f:EG:•Ã(øü!@©d@' G„­v.gÌë©ÀV—­>šÅº‰™\ÆÍM ýRÄk9ž²}Ž vtŸq5ëZ äW¬8[µDtê7–¿9,c19^ë>¸œtpõ?ùÆ,5 endstream endobj 322 0 obj <> stream xÚµÉrãºñž¯Ð‘ª²ðˆœT.IM©²øç@K‡Sé'J®òß§€‹-žñÔ¸ Ðènt½A‹ßr‘Ã?¹ð þòÅz·øóãâ·¿BWJQZ»xüó+™‹Ò-7ÿɬÐB/WR*›ý«~iúþ[®´·Ùë¶j»åÿëÍWä%.—V”f±RVXO(¾nT1…2Â%œß/mžÕK+3B¿´*&//’p’àÕ›ú)צ­©¢Ì¶UhSènpªÌ³þøü¤­m7ͺîyêgŽ-¾-­Éªm·ÇÏ"kô­Ù«-ƒÕ¬Þrû­ÛïªCǓĪX®œÔÙ×þP׫²¶qj¢Å½Ž"Ô:;451]bÚ¾y9ÂèR¹ì@SŠéÄYžyÒF®ͺú¤#åT¶…ÊÙBšÈ"˜^xQzÒ¤%)CÈQNB»Åò¢U õx›ˆº@ÄŸ1s.Ð Kç¸ñÐ$ðÁÉaçWYv§,›K,·)¥Pþ¶\"‘·Ä–VÊ;‘{Ö‘âƒÜµ›:…JKQwËX&¨Á]Ó7øuÂ|\×h¬´´£žÆÆ¥é+/ìU¥è„Ræ‡$ŸÐï;¼¬RžÝzzOÑ/òñ ¿¥ÑÇéˆçH€Ù°d6`F»ì/Õ¦:'Nq˜‚k»¿kîÔÛ!Û!Zc²×c½ }½gË" °¯åÔ´;ªá(Ÿ=i¯v5ÙUdÏDˆ™Ú¡!y^®àÿn‹–Ëý½Â½é<[w;ê4³‡Ë€ç: ¨¸ÙvþTÌÞØî¨ÙºéÚjgß¹¡­E¸]shö}Í·:¸¸–UúÀŒô$%#_ÕwÜCá`ûZíÑ0îj0°=æ Û#u˜ÊW›fW·}`ë•WØGCMëÉQ7¶ÁvcwºyyJ {t´î€^6¿ï¶Õ®&}E[OzÖ†U ÃÙâÏÑ%±¾>^ðßÎ 7:p“tà‡êù¸­ö?îÂñèÂåÌ…K”¼*Ë+D¼FËwêÄ•‹~xß Ã7 ´¤ ºÇ+¦<úîŽ;(9léHbg}äÓ†ý7V"{…íÙ>;YãA%qéì4‹ Ë\ é¦Êü:(ò†W7£W÷ç^ݰW÷)¯>ók St^¬”¤ïWZøèxÖ熬´"Cjæ^ÿ…"SjîÄ¢ÒA0_ØöaO€Î͈{bêaI1AžtÀ²…› ÿSŠƒ•T¥€‘‰Ê¾ï%yiGrU ‹÷S,iÁ*!‹¡IJVåºk’ÍJ!׹ȋÔVÍD±*^é6-R03º°6òN‘ªO©ú‘ª_*Rõ"--žå‰Džc²Ž™¾n ²¡òhúS‡Þ\ÒÐî#2—D»;—¦ ›O_,Ìopw“P·Iœi¶„|-AWÂØ)á6Äç(dÀ…úįж¡#Jðc€Dt{×îÎÕhÞÜŽæåÝ4Ô4 øÌÏ’/j.Eóº8eÀ\b`— A¤Ðò4ž©Rþ£[Œ%s½ÿ†ž7·C`ë)°õØö<ÃA,tÖ݈¶{ÚŠg1 ÙVaÍ&,!'0Êl«?&3´<ÇØà¶×ý,¥¦iè§hQ*dFä3ºNÙ»Ù^Ó©šr§ªÕrž¸ô<ƪ…pé‚ja†U ”jEg·Ç][õÓ8[…MEÝR#µ}¸@)µ—Z¸˜^s=z˜Yõ£t7õîÜU"nJD¥‰ø¹âa›R¼æ­€âïö)Í£¡œXcV=äõ¶Þ…¢©Õ Ã2áöaš ™KȰa4.mu¼.&Ë0‰É2uŽÌÌx0x@ÏOt‘Aþ|=Nˆi`rÝì*NŽV‹¸Y¶÷”¥b×I@ "²xIyúi‰9iy"ÒƒÜ÷‰‹Òe5'0“T«ÊCÁkÛêjÓí“t¡„&úKJUùèXC…ÂAòT¯C-ÂÑÅú¤ øŒ%W¢ÍS“;£ï èÈ7B Qû?òŒ0 š5ï€ â­ Ìz!D£´¡üd+cÄìí¿›¤™+ð|æw†i3'ñm`€!“ôp[qR 7Xîæ™„Ëǰ•`ý¶ 2©¾"N< ØV}óÒV  >ˆÏ±ø Û[5¯JÂhÃû Åxh"º ƒjÿBþ\âM ÎzaåOú0lv.8‡óyÁ4ÒÉË!Ò¡že…/<ìÍó“ã0)4,Øš!"ä´¤o¼á¾D2ßê5ÑÄ!˜L|p7aâ)U—:8O–i*KŠú\ˆÝ|p|>Ü ØÄ¶ QgÐŽMµÆ#]ÀÖò'Ç¥臋ݮ²t•aaMï76ÏÐ$­hÃ÷ÿ*ÜÆ;³Ó7hD5J‡féœÝ8–”ŸJê£Ú'sý@ðD ¦¦­×!ÚiÚàR Œ¹ÂüãXsá¼ ‹üHÛ±ŽÓ±ôOSTv÷°=$Z3×ÛË3ã…slq2ÔúËÉ;À'æñ <ƒ /ʼnq&4ϘޥŸgb xnÃñ)†møXÁà±ïbÐøÌB +Bdh25jºþvc%™½øvc¯¾Ýð$ª¯¬—Ÿø9F^^}ÌÑÖO¨ZP/ýnãe5 b¯ýÔ!ŠTŸýÔáæ£ÈÊ ¤G‘"ä\‡=ÆGD–| 1…øx¥&ý>¢ïÄrñ}d’ùOjÍ¡>IÕªkï#úúûÈ$ã¿ô>¢K„¸ó}äšD üõÀóRHº˜7š‹Å|{M²¹Ó—Šùej«³b¾¾þ>{0\ÌW,¿þœDÕçHTýR‰ª‘hîð—‘~Þûˆù™÷‘AE¿ö}Ä•ŸGCÝAãL¹¥4—^HÜy½/z53;…•eœammýçþ¨‰Î™ endstream endobj 325 0 obj <> stream xÚíÉŽÛ6ôÞ¯ðQƬøHjIKäPôR`zŠseÍTG²ƒ´_ßG‘ÔbS­qt`¨åéí|›¹ø²  ÿÑ…øß]Äùâ·ûůø‚º$tÃÅý¾^Éoq¿ýè¬÷År‚;I½Oä•pâ¨.ÕU’©wÛ$KótmËjùéþwDHÃFÊ€°KŒo4DŸ$^Q¡ßG e\Kð}ŠKà¢8]3†ž¢Ÿià]”E›*ÒìáSüò«ü“XÙñ\âqMníì«õÒÂâ…(©r‡kàÄiYDZôÑÝ!1L•¨‰´ª¢Ñ®j5 ‚5øÞ7ºäÌuªä1­÷U©î$¹Æe¾Ë’}”'J B'*֌Ӭ|lÀ©#y8E²6‡,ªÔÍZë¡2–à!¾*-«y€7ë徬Ñyó•Ôkó5ó¡HãHÉA 9.Œ¡Ôò-N¤F|§µcAcÆBçË!Q¤›ÈuW¥¹äD^ׇ͚ QlÓ81Ÿ­]Æ‹t[jèF×eÕÇâš­”Ƹ´o¶Ð'açK‚/ð©/ß âû(ñ”%ÒÏvwD- ZÅB'ŠOépâCŽL@\¿£’§Z¬*ª¥¨þ±þB§N…Q«ã.a}#=ØtÀx_ޘܰ-i |/þ«@7aÂÕ.ö/Þp4P­ — O =c wLE žJ£Æ ¹£OnNøLíQq‰¢eqT4þ$¨“ŠÜ¾løÙ–µºÏÌ…Ù6µ‚G¬“ø`¶\­PþÕ{íÿࢃ¾nµ…ZF­IÑ"¨ô£r/“¼2ÝÛ,øZ-›´a—qmlæ4›A]nÕ3îl2%KKwkÖh_ÖÊJïïUHÇèN)ú±01ÐaUPG o¹¢„óa"UI51_ÅVæ …R]ªˆbضì0bŠ@Å7-Ãy~•L[#ð.ªdxË“&’)m¶*QDƒ>Ñ $ÌÓ>ðÐJ ‚'Ù ÿÈyZ¦ÍT§‡´ ¼òQƒÞ¼Uo$«ñýØä3è“@_ñÃ@è+Jé(^”K€"?D‡loÛ¿¾‘è«”¥‰ðà:ÝVA¨#®w”UÈ<âùÇ ˆ‰sߣA[ ï ë…öµngè¢È5Œ†$`“iÀÅ4 tE=O-~'ö_@¨©Vìøz¥ÁÎ^Ï~0 ÀCže~haÞ¼³sðAF¶hÎÆ¢9±ñžÒRÐ%Î d`2}cx3cÛ¶L Æ ¡ŒÓeŠl< jŽY,d'ãM²@‡¿Ð~9£üû´‰ì&µEp7²—qÙóöÜf/ÁϹ—àØKp›½?é^‚[í¥cï[PÑIj–î©×b?Ó‡ÕÂÀ†›î ö§'xÒ]Å:²ARù©ž}™ãÝñº'Õ_‹`úf»˜‡ ã2öPî½é|Ÿkòoe?;Þw³ß¬ÑåT¯ºjÍFì'ü®´}kéÀ°µ¹ý°7$”ÈrÅ9wþ0Ͳéɰéö‘^(º‰Þ°»ê“åLݺnW»¦×;EëóÁL—š^­™‰5ͨîÁ¿.…ìËÔ\Šu­m–tícBôÄŒ5=jofZLÓ!e.'r5-ü:—Ô7ÍTM6°Y[ç\”rƒ£în8]êz7»¬LÉêÊšµÍ¹º@s­Ô T‹Í‡bFnh†c=¹™–û~€œy Õm¤‰d‘&—¹¹¬KÝûF®‰~ûa å2pfêÚønÚ*uíÑ£i>ØšUO#[€¢×¨OöÊ”poÂdåœyPΞâ>^m¸I51š¥¼Ù`¾j.ª&جNЙ‡5’ÐÑ™0ŸèçºÿßTÇ.s7oƘs]ªu)ñ’3Ÿ¡æL² ©òΟlá5Ù¾&Û['[xM¶ßÕ ~ˆd ¯Éö5ÙÞ0ÙÂÔd{ü#Ï ô¹5çºî«…“•x5døÞrðÇ?ûójÐý¼úÒ¤gÊðlB†gWgx6!ó-¸³k3<»:¸Ÿ=<ÃÏýà¨ß¹äeù_> stream xÚÍWIÛ6¾÷WèH+‘Ô–[´‡žRÔ9Å9Ð"'à@=Zé¿ïã"Y²™Æ3 ŠÁ .ï½ï­Ÿäè)J£þÒ¨ ðŸDu}8D¿þžF$ÁyN£Ã\Ç•ÙDñ½?ïbš #ÍÒN¨ZÂ./Ðûݗà–G„á¢,¼Z›Êª}´‘Ì‘ðÃtL({Ôƒ×dQšà*©ŒfšáŠE1Ë1£Vû/£”æèÊöÜ软J™àdS–AcIqVx_¿B©p•ûk[Ó²t^›Åº7ÌINJ¨VB‚M›íƒx¬ÂùøYí¿àæÊ!$±¼A^€3ÛÚnkK6µfR¡-µsE}xãî­»ô´ÛÖzô+Õ=È^ÍfìÀ:9›BBr\•ë:Ü%à” ÙHˆ×¶  â-+LªM¸Xiq‰õiò¦û¤Ž Ürf 1˜‰¡)s91b¼?R–¶rìµ;¹M XºòiRÒQñL‡úÙù"NŠuüòÛÚÐŽ÷w¦ô£Át´ãíXæÃ"¡Ñ/ìèïÝI£½Úšï`;*ÙYRÜÈ@¡•/¼œuʨֆÚÞ…êœ8+Ý ‡;à$[Xcô1-=0;•UÆðt¿åa¡ðûÍ#§áÒKY”%ÜçJ7S­Ž4§KT²HœÒ1!¹SSÐ>&³üV<½?™žT%ײ@rqë›ó•z_Ù’+º­ÂÆ,ý/foK°±Í®m_X¸EkÔ©÷—G¸vŠÜ` o‡³ Ùk@ìœð;›æy¡ªïuÌš`Á—s¯ZK¦Kò‚ýs'¼˜^Š/¦ýÅFŸÄ^ €Ú¼cCu½vmñ?ÿ7ºò8—öš™½÷&ÈflÅfô °™uIÈu)zÐ}ësÙ¨N†ßp?“ô~ªoaŠÕª‘ûrßA‘[ù Ï¯âÈÙ})Iš”4 ^Ýðc¤Æ,LË º!·Fæö±€‚‹P„ÿO:7ØmÓ¹‹íõ–³Þnç…#øñ á·ƒû¡½ùAFJãœ3GYY1‹þùË?ò endstream endobj 331 0 obj <> stream xÚm‘=OÄ0 †w~…ÇV¢&_ÍÇŠ€ ©0”k@ ^Ë‘æ$þ=NšJ'Q%ƒm½yl¿p`t8A—Áá·Ü<(à sнoÑ)hRAC7,yeS}G?P%oÃæ YýǼ†C±iì‹9~jr#ò“¡&—%¶mn°øéð™dR¦fçÔÉcßwÿI›^6ZÙü¼µ›ôéê¦yx endstream endobj 335 0 obj <> stream xÚXYsܸ~ϯàS k°I„’M­ì]{7e{w­ñK2y Hh† $}üûôÎp$V)IiJ¸»Ý_`ð)PA*È"ø…AÙ/wÁw¯U…2Mã`wË[ƒƒ`WýCÜv5ßà EÃõªç ®ª»¢êÙµ÷âãîÕ~#ù!#pÿÐlúëK¯1O,›)P ø¶`‹H‹i,¹sý=·lȽØoþ¼r™DÔhv"Æ(ÑQyËRwê ^[€‰؇ Wöd¸ÏRëÆÚñR·yìM°tÁ+Œ„ÑOû=ŽGÍS¶+NT&³ç ¼MâX¦É#5Æ`ɘLÏAØÛ+öXH/\–„Èíå(B¨<8{ `(Bû(B¦Þ¦túdSq$‚ÙúÞ:Œñ~ ‰ÄõÄuœ˜¨-g3Ã}ûõ¶UÁÒÙî©Çαôžéäìn êÝ ôŸ¤1‰‡³(öˆµ/­k hÐ~XMqX8¡É¸P3ôkëÐwˆÃ0îãDñ2yvfp#ˆCH+=ѪfbpÉ«§×AkÆi$>MTÄdÎYS}ÇuÉ쨰|¡kŸuÆbÞýB¹÷=7/â”&ì™õxÅÙ¤òì[FÅ6z±|‡‰%6—áòçªñ%49"rœ†¨y©[ –¯,¬ƒDØ}bñ0Yv\úòi=Ç¡>Löùp †Œö(Ú¬®õxËãÜ W°'À7Â¥éE{vQ¨Y½¿‡Ê°ç]ZŸw RM諘u¬Ëâà7ïÅß{‚ô>ÁwyV®hPp"0ã×˺+û3÷»‹"F‡'†§e͈†ž/Ÿ¡]¢†Œã/kÒÇà^bÃ<}æQè3>ôe>ô™EèKO4ßÎh1‘ö)bÿgä¨5õÿ-7š›?=¤E&gA\ÄmC. GwÕÆ«fIÍÐ~Þ@!W4dK-£6ì>½QV«FÈlù³U#”ƒs^¦±D¢ Bf¬›«•›,^µ´r=¯ÂÓ·Pöƒ¿%hës92£átéD  |kö!ŸŽ!r ð#nó!Ζ0¸(b ¤þ>¾ìñ¾+'ÕÒÅ1 q@f rЧê¹<øB/OPXª‚žÒ~Ü·Áïi:€—L–“ "™$ø\…•^¾-xoäÒ¤ôæR©Ô÷f´÷=–¡©òN ×ÞÉkÈ?³¦ÑÉËŒð©çÂË0ÔsÎa ¿Pz¦L±ˆ3‚GPv( #,ÆØ„P@ÁË®ënšÚyóBz¸áéõáåUKñ®øîGγåσ„›9yA¸A!§´8qçìržÆøäç¥ éȪæ×E˜ •_ÃU4 ÐIîÝpð(IS¡¯ð`šÄ¶)Ú‚»û0 /5“ÅÝÐ7ÓØÃ¢Ú¨$¢"2IÄ[¨²û0NºúŒI˜\„p,4[®’h÷Š!â®æu{[t•C[Œá·XØB‰‹~°mOKvÅ>Yt.‰¯Vxñò‡ D³? ÙÊóþýE2O—j¾1„gàÕmÑ­p†ô|ŠkœSêg]À44ö®|ã¨p+„ÓTšü¿#|ƒ„½âð+ÿ•I¯YCx›ß\¡ —×3ç ~]A’‘ø‘<> stream xÚ½YÝoãÆï_!`€Nkî¹\}HÒ¤AM}@ª>ÐÔžŽRô‘’[ç¯ïÌÎ,EÊTìh`û5;;û›Ï¥V_Vr•Ÿ\YÿéªjWß|XÝ~/aÎmòÕ‡°¾‘©pÐßý#ùF¨õFJe’o»ÃZ§ÉÓZËÄ÷C½Õ¹>¬7FçÉÎck“Ó¡¤NUî|ìÇŪìËêè{?à¸Hʸ‡ÚcíÛÇõ˜w‘¾ñ‡ÍúŸ~\™TH RYátjWöu–n¿7+”6u(úF¡44.(Âclž|<*™¶I7Ù—Y‘!4¸c8öêX·~›0e1%”"3LX-r©âõ÷ û¥:ôqi¿:ãõízá†Ø‹T e“§Ú÷GÙf¬¸ï¨Ëê s ÀxÈ_ ©R#òxK?KPL–…q+\Ò”Ô~ô¸X}âåçÀp£ó4hBj }êúu&“ráR*Öžo½1ι` ªH<¨-Õ"Ái›³0N<ÛƒÊzÚZöûSë›<9v‹÷“"¿P¢¹¦ÃM¦ù®ÀùËÉÓq;ÿ@ÒÑüàYÂ:þ߀óè$HS·(îèa¾©«’ù—q7§”ÚxYƒ½/ޤš¼ƒÜÆ*)ûî±.w¼üª¦…j«lªSÓ ´{ŽíVgòXWÝ Ö§¹ Rw¶§5ÞmâäNÂùd²ºcß5¼©õ»º¤IO´ i9^jÏ ­Fî©!«J5˜ê³O?v}[.ªT:' }áXSZa£Eoß¿ÁïO‡2Z \£Û®A3F¥¤y %Íx’<Ôa^ͬ!°í‰6º×F¥`ì ™}h­É>l°;Ú‡ûe&œÝ…È(þ}ЦH€Å©9­ãqÂ…ÆöŠ6µÁ¨ütòÍ‘7’«O-D$•æ"Í.‚ãÂÆ‰<†60×ËâYÔ¶Z>m¨÷‡èÔaʼAt4Sì<­³,)›£ahÑk'Æ+à†\Nâ‚ÎA³¿÷¥tÂ:zß^¹™.„mç •äÃ)irz|5=ໜaÿögîô{ʱ³€§s¡ÑŒçYyÞ[—veJdÅt×{Ã&èãûš­í"8s3f™{U‚%ºé¦í"Hüéìˆû¡;–ýÀÔîúizΦ–UÌ-ËÆx} ïߘ,j"+Ì.]ß×ûEægÁ$‹t ªUœ˜UOœFS]wêïËžÆ ÏÿÚ¸ÉØð éÂ!À}©$Ð:yÌ7µðb)AJa¢ 5q àB[>b à~”‡}F…(ä¥4½ ÿsv èHl(Ðâ¼·ï" -IgÓ÷1Rn½ëÁ#º†MWT’^ ^]G?"ÿx5sFÁÃibÞKs* kŒ# CXÓE‹¥*vVHA=›cä-DN¥,ê¯EcÍ’ê=µÃsûÐ|<¼û#µïR{+Í­+h(õ±ï¾z™Ò&sç"2ò~wÓÞÞìnožixóÃÝÍÏï¶ë®»zxlJ¦;~µTæòåΘÖm(€Å.êiªý˜˜I±h&)›zW¬Pé¡òÐî^ÇÕ*Q( ö$)ßÜ¥©QÓ7ɽë£Í±)νRÏKR? K™WÁåc­xfV^ØSPá‚Ù›¹Ý>5õ »wÅCÆ¢IAõK¸v؆s±T “!»agàÕÇr`znfõÛéJJ¿!çpbÕpôsñ^V×!ÑÎhâó‚üz˜ˆÚwó\üŒ§˜½0pÜõ;ÈJ 9¬3óÔ%߆2^îe9¸ !VòEqå|X‚aûXû_Ë3]èœĤ@CFAh!rŒeNÅNQ >û—>8>þføÃã2¦«›ÅwƒÕ“WLð/¨0ëhªc•F¡ÒE k<˜3™X˜YX(n.]™ãá5N úŒá¼ ¢±T'¿‹aá4„”†Áà"PDŸ2Ÿ–ã׋µ7Ü áó5³5¾¢ gõjÉE¸P 7eøFÇMwKºÁ‚[¨"|%€")èèa©¢(XKXF«ÜAQA¥7æ4‡ø€6ø„7…µ'z^áü6©¢†ú¡ñLÀJ,¸Ÿ·ÚªÞ\åê#/¬¯G–‡Ž™†è„sÇ>žCÏØ8,cXÈ1~MŸ§H?Ä0Æe별œå+ÿ_h™­"n)'D7PJ³ÕÞìÞ€»Ñià •…ï@’DÇNKˆ$ØnÛQ¾¥IxÍ ¶m(OŒBUUu[òÖmÒ—‡}R+i/£eЈÕ6¹gö¢¾­Ãóh£(ey™ÿù£Cﲯ±”)OzÔ”Q)½‡¥âÂ[ýô  ?ññ‘¥õµšÛ¦˜¶Óëþ!¡ÔŒ¯½eñ¤4Bf$U7?¼&Ú8–ÅÔ#åb/Dm¥“`fgåj%£rQe0è7¾ ïu¤§} Àäúú3ƒÝB« Ñá™Mö1¥K‰ŒåRš<òàýB^àœÅ¶\ˆ]±+f¾¬ýnöѾÉá\ô-7ú–cßr—ðãÚ‰o¹©o9ö-G¾EŸ¯p¤È·àÅwÏ—¾åØ·Üè[SY¯—ñî*vš±3ÿvl»?¿;cÁ·D',êŒÉ£Ø°r ]ø¼¡ƒÁ:ßáM©)©ÉAWä).L ‰tøYg<æ,Ãï ›Ýý ÓÚž¿³á º}úÇöÒóÃ/ ŒŸ;<»-ÿœ€mJMI ãg2§榇3žÅ‰®:•åÿ€T5_VB»bõ/ä™ ¿5µ+YX¡Æq³º_ýÂï¬,€EÃJƒDÛY©D´ùª.?ØÈ\dPVeN ERÿE ñX.d¬K>ˆ;Ì—”ñ•-’ð4G¥†-¸Nxt*HÈÓô¯°†üTÒ𙌭¤R¤àÊñè"ÖPãžq!fÿé1 ó|[¸ß{,o=1Á&Pœ";8ÓgÓ†9ÿŒ £ lÛ7øávˆ_b¤=ãhR3ŸûÑ ¦HCæ‹Ù3V¡ù¸ž‹ endstream endobj 347 0 obj <> stream xÚ•YÛŽä¶}ÏW4 ,¬¶eR¤$j¼Ø±bg;/NçA+qÚ2tK­…g¿>U¬¢DMkfLâ¥X,²Š§9‡ßò àOò~âPu‡o·¯¾—ÅAЏÅáüpi\è鈵9œëGožŽÿ9ÿ ¤t ¤dl ¨BïÚãI)••ÉË2ššž sï®-÷UC7l;ûc’G•'RVÛªéÊ–ú/ÑXö×¥‡}JúÅåOZëè= <O ÖŽ]sãËú*ž†mÁå‰ÃIª8MÝŠÇ,‰<‹ê‹JÓksÞBÝäQ9÷¿Ï–úú¾vÂoºÆ¦À’4WÑÃD©ŽÊvI2¥EàH·ôÛXÖåÒ@ß–¾~áh‰¥YUy@f¨u²÷먆~jj :`g„â×BG-Z†Mä´‰Z!7·¾%3°pȨkcx¹}ØhÛ¬EjËŠ²b«¸(èëMRNÉÝ ó”R‘,P –œÓ54EÌѹ‰áÅçIqª(Š?}&Š,IuÝ<ØÑöUÃõ_‡±ž6”Za^&²ÕmlRÑ?“¬eчaìJ/ô×÷ÿ ^“ ùºéf1ýÍgLÿÏT•ãEiYÝ vw4§EœgØ »åêÓW3ð°SÉN7\aOãÊyò 'ÒhyJ‡Ó"ˆP§ïh’ó…ƒm5sÀØ  ®[¢žçI+DS³‡Ä· ünšK›èa÷fª~d ê%Ÿñé6&7Ès;H M\x(˜'6dš'š@>]@{xÏGoä"vy‹Û’ ñÎý¼lKròù1ÞÜÆ$"‰u†¹sfVúçw¥Ub #õR’†eR±šMÍÄ\Í d£]W颚ÝXhY¨ êã¹ÂéYlIX5Á¾`ç: æ)ó:§—ôßl·o åí­º;*Hay§,OÉbe¢ò±mªòCkI¬¤Ö[åXo©ñÕXœ¸«*[Û×½I„roÔš†®œjžÈ9ÛVçcsM£ :Ÿê/`4Eeg£@•œ ËéÆé™'RQ¢Þ¥ü6ƒt¤¤o𹾂5âÁü0º¦d@ ²S¯Mëò©~íunÐ3J}wf: [ÇJgx–ÀINLú›XOR&:úpUaH")'ï,¤Y.Ã$Äu’x/€à@ ¡X/½|éû9]%É¢Ì!ôÉ©E,ñ8åqAQCÀ}§Dlj‚ð‚5¾ð°¾2€1ª`ð@|Ih.KšPP"Ö±àž&gŠûßîŒ@êa¸òêkÜ/ÐÄÆ÷ÙºTí ˆ€œÈëþ;¬šø¢{"”†íçŽa°6Í –|·Àr9^çŽÁ|ØYáIê4βð,Üö¸`œ%Ë>RE ¢‹œza˜3±ÔN4Ú)j `ÿx„0XZœY3äùTŽN³qÑVäë¸%Ú Boìܰ>h¿„Øë¦o:TN4§\Üý­PÈܲ¶·™€R-¶*¸ELÖÎŒezÏ`Dº¤þ…w,´ [’÷½ˆþçAn}gž…ßÇÏxa’€ìð:÷5“„ó/G¦ ÞnJ_" qbãKlqž¹ Ïü†—/dwžè?w”™LÂgX(LümùûX"gÀ!å. É‹XËg±ÇBŠX®@I€´[¶¯k¦Ž-™šk¾Õ8)ñ0ý ŒÕ³moždhX>¬ô “äø¾Ž|¹DÀ$ƒ¯Ý ÜJ™ØËà¹p/ <-¢÷ó`Š¡~H(ô^óϸ0^)Å„¥Éã¼€óR¦œiäªÇî K„Žñb ÃÌ¢ù^ášö‘è,N7Ê û~Ö„4ÇHG9H!Jÿ²"–ÊDÔ·rtn@çî–qšì–ÙVž²˜{ÂûluL¸{l®{NKƒú\åbFgI7µ91xÕÚ¤jŒÅ½TDÝÿd3®·5ü~z.-®{ dÙîeH`U±ò+mbï,-IbeÖ¥9­›œw·¨ Fh|RP0‘#Ó« öÓ¿“ ½'] RÌÕô†OzòŘr@ÿú“‹0ì§£?¼@éìo`Sëéó2ïr£Ã«ÿ´a:ê˜ÛvØR» ÁÐøbÄ’QüØaüBâyKßé©û0ÜrõÝŸé»2#BŠKäRv}ñæûó›ó/_\Ž_ßßêfzlË'žãë=ÞÆf­»áï÷°úÇ‘¦žé¢ä6ÄçˆëÜ×fhjº5‘¼ûì>¤2Á&—ªÉ>^ë—‰æ$““Ðgp5sþòåÿd:Á8úzžä€õwå6J–^wÁÏè‚~}Zßò¶s>Ú‚G:t¯Ü°U¬—rMïÑØ¶¨ÀFg7&ˆ-üiYÕë)%–œòZ®4±V+™šéf·æ­– öÐ>YV0,Ê9¡ qKÙ¾ý¼ïŽgß2ÅúÔã܇ÊvçwÏîp„û©\å\ÁýÁÛ÷>Å ʬWðŠ»tü¶óV¾\Q6ûW ýÊ“iŠð·\1èÇkj†ªà`N¸§ÚÛÈô ",ßD˜ìÞG†§—|—X²3­B<à¶y*Çí‘ðx°å@9Çø ¶ÙÄ=Ÿ2þçQ¶ðŸÿô_Þ"Î endstream endobj 9 0 obj <> stream xÚÍ\ËŽ·Ýç+z™l8¬*>C€P` ÃöNðBQ‘C’¿Ï9ì¾3=Þ¹ò¨t¥…¡¾íižêbñÔƒÅnK\$-M©‹ä¼H[4÷EúbÅK*uQYr•Eu)5/jK­}Q<Öð'yé R‰ƒa¤ãÚ"ÚË¢Ë:FN޶J¬‹)E3@J^,p†G#Æ4<*xÈ0´â¦A.KøMàd .5§´$@–Ô—¤€Îø ‰^ÿ ðøGcÁïèŠß„†ô©ºá7DK­/¢äž– K­ †²ÚtÉ„Æûe<ß;~W@wün€Œø¡ ïS ©$Pº, H* ¢V(…¢4¼tÉ€ä¿e:  h¼DiKV Q³A˜!@¡öœ1hTÁCÕ nâUr«ø!¦—%¶Œ™·6ˆyñªÅ o‹€†¼øÓBý7Î%äÅ –y¡ŠÒ!/‡ˆ·rr(Å$´h(ªª JíÐP^'4”E¨ etGÃËB•µãe` -BXŠ ¦ÐJ– -J€Þ!zá|å˜X­¼ƒQhl $h¼S!Bç:ïcˆD GÚ¡^xG—^hàbDyµa«x· 8oU •xÃj&M±2îÁF!Ì@°* Xá=¥d…÷E«¼Çgñb0ÿ!t´Ž)…W™ÂpèÒ`f…£K.q]‡R =¡‚d¨6y0ãy¡- ŸÂ*á=bÓ~„ Ä‚ÁßðyÜ W&…¡pUù®0,P¨H¨W‹Ô&_lÈÑ(·“ˆf|–j·ƒL¾`îð9V„1Þ´rãWŠ™ì‘’À´(ɸx91){zÀ*$!˜—<®¸~UøßR)m¦½(ç#+&Z©¹l\ü`#!‚¨{¨ÄA2aJtèã­Äƒ±”oZ \áÙZ!µàÊHF&è@9o%“ù~˜^ÜK¥Bw !êÚöQ#ÞKs¤ Z8 œK¬ÞÃÈ5af”³Z¹ª•³] ãÐ5&Op-T˜;®Æ<ñ}9«X?¼Yšb~´Ž¹ÃBSj½ñ8¿mŒ×ÆŒEÒ!ç³C;Ê™îÑEâŠö¨sGL²…`á£óÿBѸªœY¾—X¯xÖ0XpÐŒ†³MVޤíH2¥þ#íÖ8Rä;¬Lc2^ [èô•¶ë4âDΑé°è¦‡+è W´Üñ?…À9c0 üßá&ȳFáYZ^˜>#S¬e̬’,Ñ*ö<æÔ6­–þÍ7WÏß¿ûÀÀãð?_=ñ®`J^<{võÓïï_ÿrýáÅÕO?<¿úõú¿®~ü×Ë¿_¿þóÝúÏ¿={ö§Ý€\µë@Ю>e¤_ÿ÷ïë«oß½{ÿáê—ÿ¼úÀ_ûÇ»^}÷þ÷7׿¿ˆ3þvõý Y/¾Å#¿\ýõý¯ï¯~øsü Ð~¾~ýáE6 ôH¹ä±*2´”«X¹ŽìpRÈÐqÎ=)qr `Qq¬†û8)…=plÆÑ9 “€µî€“îÍ‹ÞCÇÊ8±,œ|‹£=0bK­Cø@„&.çÌ8°1ºÜS{(½:àÔ'÷ `ÊSJ€gqÀi3NÊcžNÖ€0̧Ï8¦‘ÓÀ1ÜKëôåŒ#-”uù$Í!;€¼ÚÔK÷„—YÉ EÁBr€y=½‹µàØ ‚’º¼™qJ ±n8ÕBOkôzÆÉÀ;+N‰jtÀy;ãÀ¾z]9þ1´äag -!éJ:ÂC®æ$3€uêÊ:&=Tv€tm½! âBob3Pïlü†˜-”䱆$Í@ t%¤Ì¸ç Ìñp(Û !(É.67; aËð¨K"³÷Až˜ k =ñšÝBÜÀ¤m!$é.áŽÌþ‘;â·•ãB#~óà8™Rp+Éaõ €ó 9y5Õ Ç³²²SDp.@³BJšm@5†]L{öC’c`N8€2bÅìÂr³#+¡ÚÊrÈÅB‰.,7{"Q ¬8 ‹!f–ÓÙID(j+Ë!u9¶{‰[9e‚¬³¬W§\î’œÎέF†ƒ+ÙTÉ¡‹ÙèìÜJÏŒ¡V ¨ÁŠK7;·Ò„AÔ*­…&.@³s+™h߀jZOrF6ŸÚj¬¹½<ì«)[ÿûjRwY¯¯J"†ô Ü4Ö8Y÷ëÃΚ|êàAÞh.›öùÍakMß6íÙZÓ\Zxòõ\©ëd9U*ûâ<€Þô½TЛl¥ŠwäÁ—ƒÆŠf=Ïk±"¼=l9h¬(°´rj})¡¹Te‹T+JH²¿zxòbóvúòŽ"ÂMÈðuˆåÖ± £*ÉSf÷oeÿ0¹'õM'ëÍF&[Äïíd^=g·x]/eô†o× Ñãv­ ×·kv~ëvØ#~·¹wÙM¾!²‡Û¶>Zö×›S+íéví¤ØÉvG~vŸÇù}otã,Üz'ÜJÜMЭlOhžÿˆìÕ¯N¯{¤Åý®ù§ƒuV„'ëm7Ø-Ä~jv2<•>f’\­áœ õxZh·V{I*Ü…ÄÊÖžªJH&”Õ?¸ Äc[ÅŠ/˜Å6r°; 5ò”Y .Ýq»Ü”›<—°›§ÕÊxO‹¤úìŒU0n±™óèEfëýÁ¿·•½5íeGv{öݳò99pÐNŠõÞtOüð/ÕÓ5P΂ðhN~ŒÝ/ó úõ~ 8 õ‹.ûÛ¼Ñ+®ð¼¥…yb¨Ž´ŽuSç$ÕʺnÀ˜eEVJb(.õÊ]»ª”F·j <|•CåQ06€W_ î*ŒãrISCâï"ŒD]áCKþ¼ñøxÙ„ÏBÜ[¶ûð\Â翃Ðá®ø{–Ú3Óž<‰ó>£;^GE«û…íÈ/‘Ç~úÈ^/:÷“WÉ +o~%w ÑÊçq,'°“k¹ 6kwï7öx.¯ÔOO‘˜×ùÌîÇAíáËμ°ÊÕog^ ë±äÏ3ó'°ÓÌß{Üoòýƒ™Æn2nÌç³%üçÂWÆý·ÕTAJ'c ÚèÂQÄÏ™ÇxÊØ¥gÆ’i¹+iíwõ³˜ép0ZÂøÖDå–e[’òçä f²®žÏ1–^ï=6?ä§nLç …¶ŽEš–\ÙNæ'‚rKÍ›)؃86DN`ÜN¨÷°wÀúY+£‡‘äù õÉ¢GóŽƒ Ø/ô(ð狞Ž}ë“3 ŸÏWÐe•ñ%¬´~–†Güùq“ >‡ˆo±º†(·PÞ³¤{PŸ4y_Œ^nÙ%Yhµ6fIf¸’|ì`:ó•ÃÚµókóxÞy~ã“ßpxÇípOëKÍ7<%Oó"ÿã‡w„Ïze+¡»ô\È®,¯Ÿ :aY¬ðÒrë4çŠÏT|ºsºô:Ü@/àϯŒ_šÙv­EÊ/´4]R£ù²ž8b›Ô isk2xôŒ}ÍŒHmÝ|ŒèÓC«ÃÌùc’¦}aŸ,«ŸµÎxgQïcËèÏ[>yOÜçkS<òÑù=N–ë†Ïd¦¾­RŸþÿ[š†KȈsn°¸kÊ.¬;XO`ƒ¯:þ¤–ŸÛS©ð§<Ղܺ³ŽÃ=(¶lïŠOïU¹¬±Ž“¢…Ì2âµD£hÈvË#©Ëá¤íëz‡ùÛ#»5‡=D¾æìf̓‚~¦*óǵÏÖ™îqÛç|ª ‡«Ã³æxÔ'7¦OëS…{úöÏ¡µø w~oöÎ^â±F÷n÷8èýj}âcz¸(o×]yRBñÓ}ü4®æ .í£…È¦ÍëÕ»»žwôºW¢{÷¥c•q²òÌ¢M!³Ù»YˆbÎ`ã}í¬ÖÀÏ•çÆCNáM¹ma¼ŸøÚÒBJü‚§„ªãÀ¹åÚlx Ù{гóŠÌoßÊmÊë¡v–ÇYØâÙßâèÒéNŒ÷s,Pw¯7`I¬…Ö>*Xùô¾ÑÿöF`º endstream endobj 350 0 obj <> stream xÚÝY[oÛ6~߯ð‹°‘”(©oíÖ.V¬[żFbu–äJvÐì×ïP<ÔÅ¡-¥N¶bHQäáá¹|çByòyB&.ü‘I@áßÄÙäÕjrñ†Dâ:‘MV×â;‘7Yª o²Jþ˜MÅüÏÕO@æu¨qÂx)‚×›ù’16Ë‹lNƒÙU)Õ;%²^ðfÉšù¾ÐD‰ÔÏÐk•ÌDŽk¶Þ¥")ôëzF5M,Jïd)«õÜAaz2/µ8K:>ÓB¿ü·„Ž‹l»‘»b¬`Wç –ÉꈹØ×›ëÕ“IõX{|?òä*½ÙÆx¨X3NŠ…ž5$2NK½.qo&”Ð÷sΊ©s5V*´"yz’ÒÙç½ì³ÓÇâié]š¤ îÞΗ°»Àã‰ë޵B2Ò }TZlbís½Tk¹fÍM•}2±1 )E~ƒÒ˜»õÔÓŒŒÇÑzüŒ²_ËXIv+Z¨}%rcDcæë¢ÌÄ®°Lw²œfÓäbzo9Ùó"™]J<-?æ:y¦‡Žˆ‹ÜªeõŒ6ïâx «F:Ò›•r³‘yÿꤞïeµqZ4x¯ŸW‘ÇÆÐ8w§\!ÿîçºαیpîø}·¿ùÜþq9Í–VÓu{äøTóºãöÐm#ÆqQBŠU>T‘'©É(°D3;–j ‡¤­"@ööÃ/ =Ò 51¼Vi®rc&t„a¼ð¢¹º3×ÕÜ‘q™àuAcæø~­Ð Ä… 4¢5cõÌÒJV à…A.¬çîæ¾Z©Ü¦^UR´y(€¡±½5&qí‚j_b¹Ý-ãzP¥ú|#ß%iDj‰±¤"KêÁq]Ú䤼ë9?"§!XÏk‚¥Í»v4!¹sÆX&„¥LlU©F MAÛ7 Á¯0ø .˜£WìúÑ\íõÚf#ÊÓ9:j‚õÇ1`‚ö@Ÿ;×áC°s KXjÀÌÀEŽ! ÕP"„¡šj`¨^îõr†Šýö°>ý8†¤…!s}WÃP=kù`áPGWÃP-5:ºC5¨aÈÂ:! k–&E4 ƒ9â5NStt0Fµ@W£šB¾ ‚®Åž†˜so‡jbÁØ1oCÎiò½µ¿îñHM#žCü^M»YÓn‹Rô«¾‡%˜h¿XôT³lj köAi/j'êwfÔkϬôR§ƒk‹w]”³pßÁ½ýÕ&t¤Ú¤§6¡ãÕþtNã׉§êÁ›p·”i3ü_#|è¹úÐsÔjNI­ž¹ÊZ­ÔžÛõ¡GiׇÝ}]ªw¥z*èš3«ÃCtÉÐÀ8Äöå@`/4Ó¶ª“‹ˆÊjäöm3E¿y'Úæ‡nÚ|ƒnR¡v–›ÞþÜ„…*™\ÃÇ$ÄçÉfïÆŠœÖ’íw(ÔÉÙÑäÅëêòÃŒä~4>um$_ÍCà›«ï3ö;"»Œ/mv€Jïnµ¾¶¾,p"CóþÝ0¢i¨;]BÛïe™ú¥†­Ô· ‚þÕ3רЯìL‘8´;*j£:ôÕT&“Tä:RõÕYj> kê¹+ÅN$œfWgúŽK»Ñe· PE¨Ô=VƒíDKÙ+€Ç΋àšÎ‡ÌÇO7d¾çQïχRŠì \¹·Ùðµ‚F>â‚wqÁ .ø\ð‡¸à\ qáÛpÁOᢠ»Yžƒ¶&çßÝ®Þã]¥¨s`¥“ ´õmU/kã‡>¯ó‹ù€ÅÜ sU¹|aMÔ4t8;iÆC‡±^Æÿ0x›ªÌ'†›=ˆüÄ¥ªßNø­à«G;Ðú´‰_õ Vóuö¡Ó¼SN£wHØuÚ «¹‡?;2Ÿª¿ÿª{BX—ö~Žz ‡ö[`=7¨RÙ|°%}Øoö¹¬´Þ¯Wú‡ÅªÖªÃã^X+Æ©!ýõ»&W endstream endobj 354 0 obj <> stream xÚåXKoäD¾ó+|YÉ#2¦¶Ç½Ü ´B›!†CgÜŒÚö¬=~=U]Õ¶ç‘M@ (‘úU]õu½=ÉÇD&þd²Qð/’]›|u›|ñµ4‰™&¹ýÈ"3y²6Y^%·õÏé«÷«_n¿ª|A¤eVUÀ ÞøÕ:WUÚ­T™nõFµnèqk“ÖG“Ž®µ¥yí!`×´–nÓÁv÷}C£,xz»º ÉZê¬(Â\»_­ŸûÃv5pÐB«ŒI0Žû¡ÉtX÷mdáA}’t«‹ÂÒ>¢ÂÑ[:‹t¸GJʧÖé;YwcS»Á^bþx ´¾iB’Â"'=ãnÔs˜³Š‡¦ß²L7aFNñyÈiDE ;Xfíè,<ÖÑÂ8"c—9q¬59ÍZš¬ÐäZ?¼Àµ4háÌòÚTd_ÐàäZ0ÿæÝw4!ƒàÍà;°Þ½ä`¾ç³ïÀBH-¢Ï€YÊ`l:N>nÜûþŸ§Ó€2fŠ(7©v× 'Ø®> stream xÚVÛnã6}ïWy© ¬Yñ¢Û¦(6IÓë¦Í"A_êe$®­T/%¥Ù¿ï ‡ZÛ±‚EŒpHÎ g†g| xÁR¿((šàü6øæˆˆ%‰ n?Âö2ÇIp[þžmK…+ó¶¬ ³$ /ÝþfI K³Ô›Å0ÉÙE×¶«uÙ-ÀÚší’°44ú®Ö½w¢±<ÊÑ WœÅxŠ™Îœ/Ò°³`(exÖ–Öü‹² ¯ô?›ÎV­wÃó}? Ê0¡‹oݽ[·#ëìú»™C—<–,’0JÇÎä3÷“©Z[ @°ÁÞÀ$‰È±ÀÿmËaB”³4™ lÈÓ†õÅf,œÑ»uóÈJ3(h¼„p(JÄeíõ²ƒp±„û#ŠEÌC »1ô3qtŸz¤X”y7.UYŽ-Ž,bêšÈBEiØ›­¶Ξì‰{‰û1â^-hdï®§ÛEû+M_ØŠxÕ3Uƒô/K“jÿŸ!ÇkÜ(àB)¸¤YWåÄ]Ç£ü »‹ãæ”\ƒû¾¡Õ~¤±í4½³†40–¸^kšOÉ5mQyèÐû.͵$§§¯ ST«HªBÛÞL!F3Íü¸NãÉLñKÁá{)v™$¦ÞãJ¦¢­ŠŽ¾´]ïtnIíÃDc˜~ÝûÛ ÎK?º£+¥d¯”è ÿ F5Šz®FItra„†UR(–t¥½»»n>q ƒš‚h»ìOŸiæÞ4Ûº;ì\…–.áû&–1Ë2çÔ§+ñôŒQüù7)Ü$R‡.ú‡“·´Â#átö[*s|»+T¤#Ã31¬÷Íè£&ÎÃAáúÑËÄÍíh¦ýÞXò¤í]:¶êN‘&yØW-©ò ©GN€o |ŠnÇ(=Œ¹&cï²6OÑÎÓßseë>k©1^3Ñ».©|½à2 Ù³Hˆ O[&Š2–¨IõÃWÿ¬5-‹ endstream endobj 361 0 obj <> stream xÚ­XY“ÛD~çW¨ü$W­Í¡ x aCA¥$[¼ÄyË“E”Žd‡ÝýõtO÷Ø’í%!PIíÝÓ3_ßrô!’Qÿd”+øŸDU}}ýÂD2eRF7ï#™ŠÒD+ÜÈ¢›íÛøY³\câÆ¹f;»iìHó­Ã1]·Ty¼ìÖ^ÁN.cÇ窞I}c·ý0=6õüÍï4¹z<ñÿ8Ϩã}ÇÒl{·\©"îi]·wÍZ§iUïx§il -ßÝü Ðd9Á¶ à´HSîõõóW¿0ëT ª™U!âÉ4á±Ú[?;"«]çæ<~­sÕº¡§­m  î¶w´2†¡få9±\ÚÄ×ãÎ1uŠÎÞíÝ–InD (¨ª×‰6•Æ@éhl¬¶",Ðc¸¯«j ¼©övp4õ¤æÔ¢ ïÛžhcÍ<÷¥vƒ¥¥7Œd¹ak·¤2’>úÜkV™AyÛ¾ƒ×^JJHÅ‘~Y" ¹ìÓqB$ƒaRÀäZYíœs*Ažp¬O—®—&CÔ$ýå‹O\¿Ž/É0B…b’Ü'Ï.Õ…ÑÃ2–‚·JD¢§JR‚jÜ5ƒÂÓìjrN3u7DÞM5pž}¶ãŠ‚t¨¤0ôvv¥‰º&ŠÀ¸±|ßÛõ‚z‚/K«Ê”"Ëþ­›]ò1ЛQSõiL¦Yÿà6>rÜ€`,åÉ?ì† ê@k I˜L笇ËceYÊ#2¿ùaÏT që+xY¯ï†ºõEó’ø†%Ì­… ÐI®y"Sµõè½!™fÇ$¼ v}»…;á^^n™>ñ!ØíPFãFŸÙBg‚„sø æÑS½&Ç.‰½+AiqgC QþqgÆÅÎ(49, WX8p€×cµÀõ±±à ×*Ò˜+‘ÈÜGRO:5Å 'MŸ9%L»2E’ßoÂÛÅU8uª±3À¤=p@Ц1#TËñ"íäÕ_‡tvxÜx¸´q´0ÓçiBÏô•“¾Ì¬EÒŸËÚÀ• Ð&hR^ѨxÔ'qmþ§òrúpä ¦B[‹}(h‰ÚrUž;4n> ÛSÅeå+/Î&M<¬B[¬Ó,‚ë}Ç<<´X„Æ nb*dž4B^l(ïO6%3ËSn9Œ”ç329F$-籈;>Œœ7PÂéÇKR’€41ãkà+{.ap¿89†IuÝÏï<éÔÊK}fqH¶ª½Ëæ5RyŽpƾ1lGkОÏOÀÂy4Ÿ+®–F}6¥ó®Ú‡Ï¡'L˜ìÛC¼®gùÐ[ôÞ>XG੾ ô ϯ<rmó’ÝŠíÁlž>8ôFw»¯·'5™J•ïeZûŸŠ/œù“=Þ§‚,åöäeH5'Ɉ?`;NDB—Eô.K$š¡d‘ uX7Ñ›è7¾*úôóJƒL…'_ÁÄ›E…(±EÞ †Xe’b†û#£bè¼ÜPûz +puÌû¸ÐñÆŽÔ1îç {ƒÑ>E‚Ϋ}ËIÉóÉøõ \=§…Á/±Ù“柚h•òè, ¬¿}õ7ñz-/ endstream endobj 366 0 obj <> stream xÚ•XësÛÆÿÞ¿‚£ ˜'àxØ™v$JrÕ*Rə阞)œh$$@`d·ÓþíÙ½½#Rܱ‡¸ÇÞÞîo÷ö¡É§I8 à_8‰9ü&ùzrz79¾ˆ'aÀÒ Ü=À¶“hrW¼÷ÎÑëͪž~¸ûûäüŽˆÃtHÍS&SC}v~{v>ûÛÉüòdvvy{wr£ùÍíÝာSÊßê¬ëVzv­ýÖͯ3ÎÔ,`!žtþ±Ì³e= Y ”Aò<å]½Ñ¿f@˜ a:B˜UþY©ÙÓûÕKÄ{ qôiåÚ eˆ‡‚$2rˆ+àF æŒOý0äÒ›×ÕT^×Ô«¬¨›©/bé¿Êë²ûUÖÒøóéÉí¹á|!{Æ K¥1dÎÕÔçIâåÀ™Ç=Î<‰ gž¤;ÎHHœÍrÖnךV?mí`•õŽÐRa·Š¬«[ÚmíR¶Zg¹®"´¡+Úx¨›5÷À}MŽ2~,›òÄ#ô­F{Ó°âþ™=·•0EÊþˆÇ³äîZée‰ÊÆô=€AÈ€†ï` 40ÌhÜni¿ª×Sy÷¶T´@:MÌu•—Vd©i·Ð÷¨¦g§ºÝÀ4öt^.!ó¬ÐÆ5Îëumm=x‰Û««B±)‹"K{1Â+e±ÛÖ-‰Ûe‹~’3¡ìù³$I?fA¼t,«1 ›/¦#"©ý30ÚÅä’\¾ÍìèÀyiyk‘γ5í×47¾kÖ›,ïtCªšuã‘\&Œ«KÖղ춅S >A.žh( *ÕSÞÊsO^(…–ôú«Ñ”ã`¾½{0Ù÷°ÞŒšBÅvûÃ3Ü嘲層è"œ)?ŒœD@a†;SÆa¸g‚Év½*lÊÜ,†66ñ­Æe„‰åy(a$Ò~d !¢‚Tm‰ ¯ã©Ôþ5lF_—عºgÕhÈ夌Y÷]®Ð:ïêÙ¨Ël/Þ³óãÚBxÁbJifXÞõò*HÒ–Ëmé’.q{Zú@¢mùhéa¬‰€Â;,–«mÛQŽá`7ot–[ØÌÆ» nKTXî.“P¢~B0¡¼z±zaÄD´‹¹ÀTAéÃð?%Ž•WVô |ÿ¥ñÍ»;¸LK“‡ºÆ)ê†1 “¾…ŽàªÅ~Ã`&S€!ýÚG¯ˆÿ¶ü.¤áÿès:£ï»ªÄпð|̾ãpf@v2;Ì"G=Ð\ÜÜXfGïíΟ­’ƒÙчá¹ùk[Œ¬Ž‡s"¼¼~ K‹ËôùÞ§ï{‡ÊÜ~:Ÿ_;åN>¼>Ä¢(ÛÍ*ûbÅ!€lýúÅ"]Š˜¡-ÒÅÿ[¤ßœÎ¿¶F§)NC[EÁæŽ1Œ c3²I­Y—Þ1ÑŸKøi÷LÍà>kÝšãi+vÞ¾½¢Á¶ÍL cƾ<¨’Ì;öŸ)O])ÔÀ|÷XÝ /mØh²…Õö@´¬°AWÃsóle£Ï•þ Y˜„Ç/m• sŒÞüêÒ…1°)u¾?½±ƒfIVN'1Kc“ޤ41UÆ ƒïã¹åh»,Ó„IN°¾/3”9Þ›ëwÇW¥ñŽíg6fzˆ©‘+ÆO3ßA°¥Ø3’|Ƕ·ŸM"m #ÆZ‹6|÷-ŒpøÂlJÛŽÇ&ƒpܹ~ƒ„êY´Ä£³¯GÀ€ó*HÜc£ JÒ _A¹‚Lð1¢lâ=u,™t´ßتÅ9DÞ”›nXÙº‹eŸ&Pl&“G ?*QhÀõ$„ïæ«Éíä­õ"¥t'F`Î$¤R΂xãˆ6š$,L΃ÒH¥H cbh¯lè¨LÚ 6 AýÐaåõˆ?YcCP^7ë¶ Éì׋æo$tÖ6Ìö ý%Ex—·7Ç—çsZLƒXùâábi_-_2˜ú1þbÎsJEAÄ*J~ž& {|â \Ÿ6uÈ÷»nóêøøññ‘™Åêfyü'Kÿ}Üu]l Hß8OÐIýH¶QäHßþéw¯åoh endstream endobj 369 0 obj <> stream xÚ¥XYsÜÆ~ϯزˆ­âB¸ˆJ”H'J(Y×ñC˜J†ÀpLJ$æ×»¯Á± ŠŠ]Ü"æè™îéþú˜YýºrWü¹«­?g•–«—»Õ³‚•ëØ‰“¬v÷+7´“`µÁhµËþi½[{[K5j½ñ<×j{üzVßÖÜÐ~}«ÃþÖÊjîê‚§Û¼ít©Î¡V¡Zž¾S­n™"ÓòU]-Cy•åŸò¬WÅHtX¸!žѭjZ-ìªõ¿vƒ£¸Éä,~ìØa'Æs<Ó]ú¬ÎîR;¯r¡ž|ã'‘$ptá’‡¥M{o™Wm÷ȶÉÖö#¡·×›0t­kÔ‚ÅVZWúKÿ¨Ÿ*ð[(5!­™5a³oUf(¤ýº‘™ÊPôªÉkîŒZåAw(.˜zk»Áôܺåítšß:~*ÜάRg9´a¦Ci|p‘b÷Cþ ?$˜Ï˜ð}®ËòF§]Í’Àø‡ºÔܺµ–Tì…žíøFi_±YÚ®1Æ#Æ ¦Û|ÅNÛÀ Tn×¶Plçqm'EÅvèá›ÂöÔb«æÃg²Œ…Ë÷=h ¿õ#¿šëô/×ïþΔÿYôƒ(²ÃD{Ýç{ûÃÂ)‚ÐŽ=!;[»~l1ü6†´íôx{ä÷½O¦‡d Æ8Œ4‡^gx^l§æp‹4c´ (óF Ƈzº›Ë¡ ‰þª›F•¹0UÂô{Y .Ùv"…–$*ž’“t2ö*¶7¨óÕ謳p8þ´à¯ºÐûñ&lÏ0^ð¯Pü ˆÿ Ù¿Îy“"U5øÑÜ'¬„âwHgT^¥¹â)ÜQ¨‡'áfØÇêHë²^ÄOl&<ž¡¼g àñ E½@MÀ:ËÛ!pl'R‰˜@–ôç¸cùŒ“¨fß—¢“Ao#%Ä£Œ_•’JÚ|ßkfêLù]Ip94y©nÏ™ýE¬!Và•q}£,=ñÞ_{‘ÜHyP­¬—¥ÅpÚ1ÐÒ€ ÐðÁj‘MÔåÁ¾#Ìvvyóöž8ü÷ùϯ/_ô­nž¿ûåòˆÐ~®›lÉ>nìÛÞV tÎü½Ê»÷¯ÿqõþÅ›‡›Ÿ®Ÿ_^ì.^^Ü\‘ÙÝ·‹àA4„¨!8ÑØqpòÝ †{ÝLâ“ ð iGl #=Ãw0̵2×jXA• ÔÒ8ôìÞ5oú`¦K…iÍO¬WPS )2–S!;çÞW¡9ž)óØM!<Ü5k(53Ïä›®CÇRåazƒ]¦Ê‹;öªœ)§ØŽu?©¢n–ôÙ‘ñsVLFÅvNpèÅ×íð¿ªjn‚‡©µd×¼*š„:Ù†Êx˜Hñ N…ØÿmʼË3³:ÓÛªL*÷ë96„¢‰ºŒÿ}Õ™lv¦ ¶0þ­Ï§$ŒEbh©f‹ºcH>EŒÍÎ7Ké|>È~‹¾z’qŒË> stream xÚåkoÛ6ðû~…>-2ÓzP²Ü¬+œØm³yIš8퀺Àh‰sÕÉ’£GÛlØ~ûîx¤lÅN û°aHžŽ¼ã½yëÎr-~\kèÁ¯cÅkëtn žsËuØÈYóŸa»¡5OÞÚ²ŠË´nJÁz}î9öDöú^èÙE]¹ö×ÈNŠcX‡¡ :‹Dæ‚ÎÈJ㊼JYŠDo49mäźç íe) ŸèµKÃïž–Jï¬d|'šºX/|îÖi,Ö2GVµì½›§”ñY(e”Ç÷}{“ :”f™ByöùÅÍôºyöœ)B7`#Ä |E<ÃîÐ.›:Í5ŒbâÚZ‰>›JйíÝç†h M›ÑZ¥«¼ ã†mª5)Ëb%âtá‡~NÔ÷Z)×ÀûW}Ь6eº–å.[Ô¨oTjí¡¬Œ¹w””^è()q5¬,J4úZR,Àqr›cW"K¡" RجäªÉ“BŸ m4D%F ÃjÏÃ]‘ÐÕÊ–°¶"ášÏ綨~èý&–Uú±Z…P¢`Ðsßž5rUI¥ÙÉuZ0£­¸X ¥"o^͉£i¦/LWMÚÆªŠALä„Y¡8@÷váSHohó8Õ(ÌyHí'J”霒Ý=Ìö!ó”lšAàqq ìßhÉh©uvy6žOÆ“é !~§åòvNZ™í:æèrrzv´ï°£ÉÍÅÓU¶ù%YžÜžOØT²<¹zCQUŸŠ29H{}yE÷Îǧ³)çÏiþx~3×Ò•²j²Z$EuÒáÉÏÙõt<ŸîqÚRÑ÷ÂÖ7Lôz1?nÍAÀëñõÙËñõÂö‚`ÑÓ»gã‹9A“ËÛ–û¢wrH'U‡æí—‡E9z=žÝÛ¹¸¾ï™YÍEG<Ù¿N»õV M‹¼†¸IÞfï:'P•ŦûfôÃÛ0gɹ¨1¥‚”:¦P¯t4oiBUÑeZÒd“I9Hùåö¼Àhô áàßÂÛKÿÙÀÓGxgã|r8™·Wu¹ GU ੉kçi®èzopó'ͺo®ç²hê ßg.tW´}D|ò‚Wø¨eZ‚ê›dI/ btâÛ¨ª:Ÿæúp-¨A‚g1psÚ½½š n¬(¦šd2Mõ<(uÌôÛÏ•éw¤]V "æÐ-UƒJc’ŠMÝ_ÉÚT\Z—ß,]®ï«»,ÎàÂÚ ú‰üxð™Œ÷³18‡\Î 08ªÎ½‘ F#,LY‚P8Œ t]8>_ÁÜZ ñ êŽ[“#MnÐ¥æ bÓ*–´e(éÅöɧ»w‚Ž¥,q‚Ì·:ˆõ¸dr}I5B Q‘¿¶ƒUAEdë}ÀnB—æ¥ï÷eŽb_Ùý€­#_º¶-@®Â4¾›º[‹ö-ÊLÜYÌEÖ',ÄÁhþµ¶Ü‡8óY7Ö+M… QëÂ8X(tBæGÝ4¥³¡±Q’v,€èAÐZw ‘­#6ZÅ¢\)ëÁŒœ©ÊÉ=8cuzÞg¬R‹£z`o(\þ»7>âaYjƒyÁŽgÆ`ß¼¯ëÍ“Á˜)3ÈœAR|ʳB$Õ@áß/íªA86¬£í®w> stream xÚ¥Xëoã6ÿ~…Ñ~X°uz²Ü¢®Mî°½ìvÛ¤(Ц¸c$Æ«ž,yõÈ­û×w^T$[nwHRÃyqø›áЋ‹pÀ_¸ØDð,²ýâë»Å_ÿ¾Y„¿ ¶‹»GX^ãG²¸ËñÞYS·õc·\ÇÛÀû©¨òz‡Þ[ùëÝ· ªF¢a¨}•€ýÚ,×QêýVƒh¼hRNS´M+¦Ø’³ºZF‰×5uiòºAbêå–™:óPšV4o¿¿áigö(óPÜÇ:¬X¤o Ë”†\]‹wë0öµ&Ë⡱ ÈhdcVéóüzgY1YW<-µ "϶-)/¦¬c=mWdfÅ"¼¡Økqýƒˆ$^]Ö_G×wýp;Ša¬üœT±(ròóÜ>ì_GÚ{ó38ø¯«›·{sÍ”Ï`ûcû¡ôó²ülæPÖ¢1L}“ÆÜ¢#ϲÿ¹½bUMkÅñj¼[Î0ï!p 5ï?i8.ßõ‹p.ÊþqóîŸÌùoqn²Ý(I|½È€®Çb翟مÒ~ Û«eçË\GÛÄW›ñöF‡›,í®hÜÇ”!¶C ¾ÈaX sÂÊ×ÛžiU½Ga@Ž(­˜^[ËÊm•⪴ÎÊ¥…³í?!vE€£Uû[5kVïëÙ¦¾J]dÈáWsñ üP˜$p:ò5ŽÛ@½,ÚñpȦÙõ{ÙWÝ2´œnÁáb_ þ‹]oÙh0¶w-ùqhнm$ÍÆ†þD<Ò§i³ŽóRñ1õÁ8Ý&r#¾Ÿ#’¹(EÝÕí[I`¶[‹kö7»?¸Ô=9ƒÉ¾^]8p0ÿÕ®<üçË__ñäÝO0©ú¹Ó ÓØ6ÓóÚä€À}j//mc¹LZ¡L3ÌqÇ*L(8f&·•Ì[ëF0•0Ô29ôCìQÑÑ-ï TÅdyߘ\‘ÁA¼ÐÈ[רšG2HJ Òq ¶~âp 9öÐ,uHi²Ùò˜-uà™ý—ê™8¦?pUâ8cLhY~2eÝ̨ˆ6¾r<£œP£ÂÆñ ¥˜Àð®jf ›¥a÷·–—YÈ6û¢#Ô©d…$Ú®\ˆ‘çò"„ܸÒIAÀ@G³˜taàsk›';·e­ý0¶Ü<¹Ã|V7 8˜Kj”’Û§¹?ç–òî=Ì$p+3åûºí˜:Í%¸Ò eëûå—sž¯Ù¡‘ë.£^p~RšGwÔ 5á€Dþí÷moš¢þD;P'^°“Á†À]ÇÿŸ©ºé^°uèmãJ1´T 'µQêè=÷^É9¿z>w:æî†Öîú~“ËAjô‘ôôç®À—Ó[ÉÕUWÃÕѹu9>½¶Æ÷¸¨¥îðì"£ºm7g"H£5Ú¦Txq„€æX pÑ~Þ/?⨠98%ÝÇ›¨ìŠCiE×ô†B£ ¿-XÏG‘Âmà'´÷± ±Ae%¹˜¸XžÏî`lv•ds?Y>±z_º p}~áz×S¿iÊi*ö•™ <â~VÔnjŠ~ö:ái¼Õ„UãäD5òÈù$r>t™e8LÅ £K—ŸŒ_М@Û+gl‰ü´äÎõ†¨5tïBàCgcfâÔZ:HVc÷ôzÂl»™»e{\‰s‡_y;©pSWrN3{è&E?peVNÅÐe}Ç(s½Ñ`Gæ@4×ü=7é: ¹A^¿ÆÆK‡™Äq0‰ŸgÀ@A:=d¥¬âi‹HG~D+0 TDðãöúæú›;žèE:»Âþn{5[=ÏÎëÕ +RÞ\[§?v½¦¼ÂרíêãTèí©Œq›mÖÃáŒ6‰¦”Vür%¾¡öH£>¾‹ª hß¼ç‘NÑåà}­„yÅ6ØVø\.™LáC:”Bt 95 Q/ˆ¸t3ÒckRÉMßÕ{ľ¤]BÛé“cg+Û˜O(´Õ ùñŒ@‚Àï~¼[ñ7…ªë‚øyb9 ‚¸&Dšû ýJ´7kæ’á¼À£õ’-s8]…¨jšz}¡pìÜÓ›t2~=¼sáDe¢óÀQšVd";0²3°3èÃ`D‚5Ö7œ?}îk§VH‡ÒˆÉ’"kãø¥é»Â HwŒ·cÛ¬)º¾Á7‡Šï +sy5<ØqÑs×ý ë?tÃ% òÐ¥™D£;^0¸0Æ$Òs“Èrä¡•‡;¤ãƒw¾™Ÿ'¡A|¾~{{ýÃ2¼K¥'y¸"†sJ‡(ñ'ÿÜR¦göÜ3dKÝÛ%Lµs0`飸bñl~3FT ¯øAí> stream xÚíUmo›0þ¾_Á§ÅH  ª*5S–¤„´“šJsÀíØ¤@6MÓöÛg|Î k:iÓöaÒ”HwöŸ{l?g”ÅPtþ3”.æ]‰VÊy¨œ ŒžbèZOï)á·ëAG ãTÑeÊÔ¶-îÖÖF_À¤`’ ìhÒ÷FCßóÉ &¾‚™ÌCõ6|¥]Íp8²©Ù¶@n½þ<»µDPo|ʫҒާëñÒ}ánJV¸Ók¬iY~Ê‹ø(@0™BõÐ;p‡°äÍpJŽ+7iEã¼táôâ…äÒ~ŒHVð¥‡/v‡Εô/¼`°m/Tí{ã<2ß¡/Ô& ¸ Ç3„»“ãT®¼Ñ|{[Z–,w¶µÛ:-p^>Þ¹¼Ûo»]È¥ͪ$¦ñMzÛȨwâ ˜“u ¥ööÖÍ6²—V¬Èh•|TmÑËTì Šñ¦‰QÉjk¡õ†ÅÂ5+£"Y&Œ¢|•CJ™Üop'á2Æ=ÍÄMÇÖÿ‚Ž%—}Ñ?+?™b5Cÿ¸*5lŠ’ð‚–n M™×Fµöj»N)×gUIšÒ’¢<ƒà[ ÝP ÍéñíÔ¸gGŠÛ{!Üœ,àravÌT2X«mÞ¬X%•ä"Õ1Q½U‘Ÿd2¹¢«šå2Y˜¶‘At>õë9O¬ r‰OFD0bU¤ ‚mÃGpÓzm^@S²÷lµNóŸ÷îðSÅÿî7ƒŸ×®G~lŒ‘ú®~pOÁH?sÇ¢w´1#ã×$ Íî’–ûÛlö}wÚxÙŠí·™áýãdžîɃޓ­–º AŠcGªc9bqWߦ^>ûC• 3 endstream endobj 383 0 obj <> stream xÚWYÛF ~ï¯Ð£ ÄcÍ¡+oi³ ÐnŠM³ 4}˜•f½JeÉÑ‘ÅþûCJ¶Ö6²)l`4Éáñ‘C_Dð“AªàÅ.øù6Øü*‰$ÑÁí=¼^ç¸ nËÂ7ûÕZGá'˦¬ »$ ß®þ½ý Ä’@‘f)‹Å°É½ØÇ¶‹ê“NtƒIX²ä®õúJW·=Qж¡‡m½ïÛš5›@F"rÔ,c‘О‹4öÚ¯êÕZ©4ÜÛ/£n²ðÝõÍï^øê–}üó?t[ò2R‘{có\ä*X«H e¼NyE1–X˜¥BŠ…ò2USÔãÓ ,ñ6$¡«É–}×n;»³ìŒÌÔäFÈ N@]ÖFè„™^N“…cÃ|ÙdMÇÌš¾ºîŒ2•cüˆÉŽƒÏJ‹‰@SKG±¼¹ÞÜ\½D¼ê§¨.8·q€Z™G i)Ão–ŧªçUq‰/àMD æ%’êüaö¯7›ÇÇG±mFÑvÛMßÞ¶sÀÇ›…¢Å’ÊÐÃub2¯)ÏüðÓ7û47› endstream endobj 386 0 obj <> stream xÚTMÓ0½ó+rL%âMb'i¸´‹{Ñåà:î®Á±³ùXàß3c;I«ÍJ¨•œù²ß¼yvôeQ ¿,ªrø§‘h£‡èæŽEYJê´Žç(+HÍ¢eth¾Çïw -ëøy—W±rðæp¤%ÕŒ*éWƒq5ro ¬x”O“ä½/ÒܯD¯º]’ïc¡p'ãK©ýG ;C5Øö-zà@rz9XíÑ\n e†‘¡‚ù ìyÃw?Ÿ ¡Ð%EáúògQw½=iÙr²Kcñ-žCY,‡QúÁ‡>]§läÉ”s®oFB7)eÂ5 é¬öºWts—Õ´ç%lÃAhI"¥øò.§ÃR’…$‡(ýζ@~ʶÓö+½=øñ^D¡e”0JRæöyкKмXFkIhœ­%`Αߺ[ýðýi’í ËÝRPwÐ7PëÚqˆë…ZÒ4v’8©ÞÇ&ÜmZ$âªpòS{¤EÖ+Á½ÓžFiT¬•´Ü˜ýN‹jòfe¼ óÞ VAT#½i¹€í&Ù„Ïi€ñnkj–Ô &%T/¢<¶å¦ùÉÔ””ÅÆd^†Æn×m $ì¿DÏ„˜þ"R,P»oTsïy1ƒ™?3¯ü•Ô™ô R7•Ÿ—dOƒ¨_‡‚¥EÈšŸmßò1 m„Qþ™]æ&|r¸åâMh²ã}xò ®Ô~kˆÜ)Ë´ÔàÏj˜¸&®nýBæ=’Uij@IçeŠ#ï´œ-‡Öå-°S¬Ð1YÁRz©…—¼ÐŠä!Ç¥Xµ ‡I#¬—aoFyÒ~Yº+ÅõÆù{y–½ôÏé¥ÿãý—Ϻ´"e}I2BO IF¾Ü [^Ax4Ð˪% 6á‘ÅmÉÕå`W"ÙãI o$Tåsê×7ÿIÊ# endstream endobj 389 0 obj <> stream xÚUKOÛ@¾÷WXââ lì]?âö"EDÒ`N¥‡½ Ùë`;mSÔÿÞYÏ:Ø¡D¥igvg¾ùæåO†k8ðç!ÇHrã<6N?»qì  F¼€g+RЧ_ͳõÀ¢Žù@}W¦"á ¡9|‹ÇàijÃa¨Ý|P¢Æm´âù:+”u`¦Ú+åUR LÄ ¨l2ò¢y½h"ŒbM({6õˆ8C›Œd»Ëu‰g^ìàI>ô5< ¼‹ðÍEãQ3­hóV?NËb©sô ×±#'R¡]ߎ<Ù”byæàLBs€„Pó‘ @Û*…˜‰'o‹¡,’d^ø¤J£n3†ç®D€²Ëº˜´I… u*M&„k+•¸z̸\nXã±â}À –bÑ-¥Kmßo²¼œÜCi(Ý•Æîw'ê”HugèÚ>ÎÁÑÀò¡5÷uúætv{~=º9Cíb„g<;›ÜMog1Ž•Ó }ô·«sTÕý×e1ÏxÎPKyÍË\H­fíY,aˆýªÉÎϤ¨TÝ”˜+)ò¢o±€†ñ7‰.3V«…l´ãÓÖý5ôøt¬z(îçšA/И= ´zî®~b]é¦[‡îíÆabó¤?Ó [±êÍä:¬æÏ«>«ñ!V)|dÊú±ÔG°³d¨¬þ—PúªLé]> stream xÚ­VYoÛ8~ß_¡G¹ˆdñ’¬^@·› ‚EŠú¡‹¤´D§tu­Ä´é.úßwxÙR--°H‡s|ß 5tðw€‚þPaøO‚¢~_Ë7(PçI¬·pa3¬ËÛ°ã=¯Ã4Ü>[|\_écDbÆÌñò‰;«„Zf¡hìZÞ‘”T¼ƒÝwmo…‚︗J'Õ²Ú wO–>#Îâ#<ſҚI—ð­°›ª¯¾Ûõé »n]p‡òV^ì>Zyi”$É„+p-ÚAµÎYØUõ¼€ßQ €§ïm¢,3¼¿ðÞfüEÖ/ëäL÷ Þ(Yòòuèxñ š3üÀGc<ÝœZ6²–ÿˆQžZãá¡þEÜŨ/®UFuŽÇ¡3ªU¼úÿš4CvˆUlÓ9 >¨¾=âø}ÄÿÑÇÑç®YüVžãÙnÑ»4ÏêŽ0VK%¦Tè¦úÊ]¶®‚î;YþÛRÔ¼)ù13­ž¡êïåæölK®ä°å…觨 ¿ñÃCô0RÚÉŚѢ—\ñgÇ…²IßNÆ{Á•ª\ÙÞó&úCŠûöŒÿÕÔÿOñ5ú«í?ÛÝëO²à÷ãºíÄç(£1ÇO€Á)ìKŒoJÆÅÛc\Dˆe4Lý<‹´Ý\’Í)ĆaH0›É²'HhH’äxdZzÖwgNµgÌáAiõ,¦Òa2–ÎÐúàz{ °ó%Ýó±´Mòq…FU¤!ŽÙq’e1Îöº•ýÊÏüDÀÕL@ . ÍCWÌð\5ö¯–ïPž_Ñ”Vy¹vÏ:<õ4&4uÏ:KYŒVÆö2ÆéËÞ Š7…„’(ß½hDože½3_–º¾ÝTðÍyµ]o®M¾å:úý€XœS€•Ç„˜\¯6à†³på!‡bPw„"·Ñ  aÔ>TÊ|¼Zm2Àª¿w} û|( ©çrãM*+Ô­ ûœÅNÔU"ÍÌV!„‘>Kg4úÖ>ÞÐV_fŽe7ùyD¡¤©ïß}ÕõLÔ=uF¶µ4¥qž¯MÑj*„X–°¶§9“=Mu 7оVÝ\n|¸`ßl`1½T.‹0Y©å ûmÛ×\?œzóúæúòƒ=¿¾Y¬HO®Ô8Æ+Í$J©½Sõ¦ï~û+¡¥ endstream endobj 395 0 obj <> stream xÚVKsœ8¾ï¯àÈ$®ìVÙÙ¤*)Ûñf&‡”ÉAžQ¼$bA'9ä·oK-^Ì–wì*¤V«¿¯›~`ýcù–¾ðïYÛºØXÏ_û©å{nê¥Öæ3œ;jC­ÍîÖβ'+' Bû¦w{^œ©]dËš•M%jÉqÿ$ËVŸ6oÕÝ v}}õ*/ó"ÿÉõAäÆì7ŠôáV4Rœ¡é§hÃsƒ Âå÷Ì^s&åž?»æ¿>Šúk¶Â£NÙÈDùåßù–Ý Ð5dzÀ§ˆ÷h0¹·ÿÊ&#>¬üõgÎïÅÑ%<Ò]íùùÐ펕‚q0‚]tׇ»/|+o#fƒÜ x¬Eçj¶ý¿#ý¨ð.ÆôÅïø$‘7½<âÙº?Çtîs ö)¶ÓhøRo†ïެܱÌîiüŸ¨.zóG,È¿eðοEìùt;•‘òI·ÛP-ÏÖÓ‰h·°AÍ&û«r§å¯6¦_A ]RÓ¯ÚiºÐ|X­Åþ°Í3BI¹rHÙjYɼ`¸Ýñ=.*ìlŸ7—ñùëpÐýÈMC€K]B4Üù\ bû‹€[4±y#3új“Ú{†ÂfÄC&°Õðlõ󲑬ܿ ÍÜó’×l×)ïq1 =°´‘H¹å* ªSãÕØ®4UQ£Y°£Cm|T£Ø["¯MFÓ¨¢Ôî÷hΉÀ›¡Fé`b+.°ÑEÅ%±Û¨ÌàÄÄ¥¡±â8â «ƒœ S7ŒŒÚ´Í›mK†€¼DágQL Üè`Á¡äß[Qµg¥pÇIv4ᆦ©†—¦Ãi8)š÷â¡9Óbš¨¤Fªc¢öKH•¢lZÃtjïZ”ÎO^ ¥ã{ajûÉTi-™PÒFÝ!±Êçµ­õ#òÖ4ÙOÛÃüø åqØ×E;s}êõ•Ù ‡Yù±xÕ ’¤GlÈ” +ÝÒø\LèDstÚ9ëÀsáët`!DL3}naX:jX.ù9õߌÑÄS¹2–ùaÒ¿üâ[p=Ó0ƒó,Œ‡#FvÄB}Ú.° c8F'$Â%퀒heÇ$:j‡Ã®@Ò!‡†‰Ö6@õ¯ßþ8}5 endstream endobj 398 0 obj <> stream xÚ¥TOOÂ0½û)zÜ[Û®íÖ£  ’çÁ.À:É&úííŸ „@Ü–´y{¿ß{¯i >X¿ÄTŒ— “‚›{"ÁHb Ò) 1" € ƒB!ä”]µh–¥›—Ù25‰ãà¹Öóàv\ŸEýB*4¥¯ÖùʱßTSNZÖKUíÁ”`hõÖD„8·& }Lkç[„Ûñ_—CÆM`¾âÄ¿†ÏyV׋üz¯á«ZÍG–Ÿp$‰Ïï8› Ø"{L9RNýRº/Õ}/ÆÙL(1O)fˆñ¶m„]cILˆSRѾTªª|žÉ4èoð®&å.B¢xk# '%Òà^O¶q•ð®Èg꼕õóÒ˜Ÿ™—ª[ÜÿFÆòXdqhâä²_X;3;—ê#dñž9cf“«i;6uÕÔ–ÝKÝ À¼ €ê­¯…¡`‰­Å/õéê7Ž endstream endobj 401 0 obj <> stream xÚmRÁnÜ ½÷+8b)Pc¼k;ŠªU¢VQÔí­íãɆƆ¼R’¯ïv´‡•-1ïÍ›y@^‰ %~‚4þ%ѹޓ¯?îÕ\Ö[²Äs&JÞa<ü¦ u“‚j3°F³ Åßýk¡eybûš°ªãR&îO„1Ù¶Tgç!% €²9V¯Ðà—4/£Z ÁŽQ²jè K­—‚U-œUá¢`uYÑ׈Zë«Iõ#L‘¶EZÜlèï1ïlâà4!,Á–Î…ä›Mê|VD¦”ô=/Úyo>÷aŒkMûÔžªÁù|4À IA:ˆCèãÚ–»LÊÑê–o²]wGµÔ¾Q~LÞa|¥ÿÈZ¬Ž‹îÄòo°J¤_õ±‰°Ó?ÁŒ}6üÑ|;sQ,ÓN¤oQ–I†?ÑfûaàœpÛðN¬ÂOÿ¦]o/Îm=+™ '’®ïÍbÔ}4/ô¬’äÛO%ŸH;¥goÞP‹Û¬ö}Ÿò©fUµñ>Ù¶n»iVè¯/ÿÃÐO endstream endobj 352 0 obj <> stream xÚÍZk¯ÛÆýÞ_Áo?„Ú×ì $v\¤ # ж¶èJ¼R]ÉÕÕ ÒþúžÙ]].)®?j4€/—ΜÙ3Ý¥¢I6¢ÑD³¸øF:Óh+$®ª1bkRWj¬ ¸ºÆi×h'š WÕH!¦‘ø×HE0éE#5A×ãÃÊïöàë0xÇpƒn¤¸¶‘Á°(4Jh 7T£¤dðDÁ)#Ð0ŠÅn­E/kÓ(+!2вðÎfä\ÀÀ7Ê{jŒµ˜c€“Ñ"øÆðÌ%ä®j ÓÚJ à ¿hà&¼HZ8$yþF$‚¼q iÌ?€WÒì® À)`D ‘“F‚ÃÎ)öÙñL4óSÅ  . ¿µÄÇ“4ü˜àØ(¼gX]ÁŽauˆˆ£ðÔD~ð±\A“‚ÆQ+Ø<à (Fh¦ÆòC‹ÿ9é1AöÒ0 9ö—XJL0Ìñ‹Ëy&L8ò <2½Q“mà&0,¬ ¿I€?1 ¶Šì"áÙUKÉÓ s--?æAp,‡sŠŸ(ö’k êqËçx¬òcTˆÔ™¤;v Ÿ|ž«Çy¢au¼¤*c:îM˜.ö0&tX÷?ÒÍÀ¨/:(µ.p˜Î-%]‡°OåÝ×%¡² t ¼LT’¿“qÛ#óA©=øÁûGß>ix×骓è¹XX;^`$­±R uý»fS²>Ìì“Ð;À½¥c|Ìæ÷ICµBåP¼lHß9¬jÒY„Ž÷CºóÁ¿CO-CSi¯EÄþ7EðñÖŠù¢ÿHoi,ÿÏv?ØÖGæô›íÝötÿr!Ú…Ôíëå·«»>Þò‘ ö²åÃIñCJC~jÓPµ¼ƒCÝò®Éqi`}5XÇ=oí£µ&Íb!mkÒÖe!]Ë{¸8ô-oÖã0´¼]ÃUkRƒ™BÝ´ % ¨›–ÏQgÝò‰ 7-vã°où¸‡·-xyˆI©„c|ø½DRHn@½IUºP¬ž8QàD%|…Y§Ð-fV»…¬Ó&­ñIåJd¤¿l7÷/ùS^‰_*âUQºj=祇n_x :S—_(Щ³Ã Sg‡A˜Îƒ0a&; ÂR×™Bݶ m (Ði‰ Á¤jÐi¾a&ák–òw¡ùÝ„c|"½DÒ¤› ÷†‡tRŠ¡”ñ1kÊ`Ö”À¬);€Y“›ƒZ· # (pB‰ NlâDƒ›À¬mrîÛ„o0k›ðaŒ?ÓÌG*"¥(•¢J"_}ºÚ¹¬7 ºE.âž¿óD<ði“ùä°c.9lÀ˜Ëƒ17—E†}+²÷üE#ê€O—H4àÓ¥(ðé²`ÌeÀ˜Ï€1?—EYDEáž¿|°|ö‰DŸ>áøô Ÿ0kŸð ³ö Æø¼}‰DÈ"*²÷|:à$$Nœ„ŒY‡ìf²˜uÈ`ÖÁUâ¡RlI±ô9Æ!Ç8Ì5OBÚ"qÏŸ”"Þ¦åoIqØ·üé o[ÊÍÛ¶”›·-åæ c$æ²ÈÂKë$ÜSêç «[J}gaMK¹y[j)7o ¨Ü¼­k)7oX#9×?W„RwXç…Ò9œ‹…rÌC²"´8)ô…ȈîR¦4 —4¶H=æ ÔèÇøË´zͪ¹ZBUÓIËúàºêB‚®i 3Žê”ª …ØÐ"Œgæ:¡*BD³¡’ÜÖùNÑ1㕨 %œ5…pŒéD™hjŒIÈB_¢ÑvØ–Ì µre‹”ðÐ ü{W'çøËb Õ¹rs©“…Ècær$ËÑ&ÜNvì8|è"õ²2×ÁК¬ž¶;MsÂ32uÂW”1Ë¢pg”•éäÀ‰U ÂÞ›9áYYtÎUJT#þѲԣQFwÎ %¬§šEÈQó·Jýd"$ì×Y¨ª-~,!‡Âs¡R²èÅZ™qƒ7±1i?2Ú. UÚŠFTeU¨T'‡¾¨E­!%ÄSV„zH°‰Dê\æê-Z’¯Sª ¾"Äñ©XŠ&BfµŽ—?©Ê¼ Ñj‹Z‘TëþÒŽ—q´¤¡ÓM…; Sj:SªRê­Uºqª#U*5ªY?NqJâܵâã•Õ¬TEGŸÂ¬ãåÌQçeeåÔíi a¼?"äÀÐø¤¯/hçTlÆÙÕå*‹ÿ6_9eŒÑêœ:I¡F}5im±(L¶h¶EßVÆ×Š˜LU¦;´aðòê"¢ì˜kÊ=³‘¦‚/Ò_¹Ú.g"1èRÃü­Pöðj&{´RR­l]ÝñOjeà´ñ¬¿?ÝÇÿY$~Œß½·§]¿øj×¼9nvýݪÙôÍnÅ·?Ww«õö‚¸ovÛ}¿Úµãß’¿{¿Xûý)þî̸ßö¿âÏÒˆïn~éO‡{˜ß5wü=LŒ©c/Žý¯ñÇîÂr¸pþþt|XŸŽgß7ýýú¸}sv½Š¨ëˆî½?›‡u6:±$ØÒóíñþôèí7«ûGo—OÀøLhTL)}M+Ѿ=ÜÝûûæ~{wÃx»íúp?Á¤ÒûdâlOMí}³=õÇÕ÷w¯4ÉãŒA;c0Ñ‘¾ñ­ëºuð¿^múýjbÚÕM«Ò´™š~±Ú­nŽ«ûf½[ýÚO¬úºU]Z¥©ÕgýŽì«Í$OŒ†ºQSµS£OwÐY·Ä®ê&éÒÊf{»]¯†ä}—Œ6Eæ ¥<ÌÄœ‡vš‡9ëË >ÿ†ðŽI´ÍÕé"Ë_iIûÍv}ƒ~ÆH&,”åeº_i#ïz+Ü<|¶…ýÿ ÎS„Û*••Dê:Bͼuûe-ÑE-=د·‡}ª¥cÛÃÄz;­')ëöË‚¢‹‚úê·7Èù„ã¹Y]8¯êÆËº"ºf|}àÐbÌ3EÐu„²ÈÈ^Cxõ9O(˜ SÇ(›/]äùwo˜n ªùt—.ƒLu„²’èb1ù3Žÿz€aÊkÖ}s`Ôú)Ž­ã¸k ezÁκl¡hÉÙs£bÀ-a ï™·£–Me1[y%×ÖAfl&zlYËV}`Vuy- …ó—YêŠ@dwS òëbçãÛaÙ`­¾ææ—ºÕyéžølÿ•7£Œ+Ç13—Ë×þ8÷yØ3æcj~´Hز⭭[¼ÒÎe?c1Ǧ,vëêæ«¶oë¶Ë2·¾nû§ŸÆäœn~E¤,<Þ%ÆSY)ɉ÷X5”ª/sÆÉ÷]5”®"¸²ÐzÿUC™:F¹p;}¥[ñ.8‡~jžêæËuÛ™ëUÊÖqÞÖ%*®ËrÉÈE•:Ur¶¾dä$(·ŽÞsÝR£Ä•µí®-äÇ~·ª¥U˜1™¹*ëÛù÷©ŠUÝxY×.|@ÎÞÔ1ʲöâ A;n?Ï,¯j]·^Öµ—˜²›*Ž¿ÚΞ_òR®­9”)cóÇ“‹ÓÐ8aËuÉ_ô”¿¢£¯nâièq]ºta´vø²Ä½©[¬™ÓbÆ\æ¨,/.¯ÿÕP{ü endstream endobj 696 0 obj <> stream xÚXtTå¶>C’3‡HÍpp ç„"EzÑ+Ò A T‰ÔHïe†„L’É´=™ÌLzR @$„^@šŠˆ(̽]ïÞ;kå¬)çìòí½¿ýý‘1îîŒL&ãgÎ[4çõo,X“8n쨙±Q?L•þÂH>2©Ip“ú¸·®'§}Øf÷þ #{£7½2Oz:¯Ž^Îë,zé[åŸËdìêðøñ£ÇŽ8+6.%!<4,ÉwüرF¢×i¾R|gŽöõ ŽŒU'F†ûÅlôõ½`´ïÂX5ý2ÜwXlŒï†MaAQ!¾±!¾Ë6­ô]¾tÎ’¥¾¯/Y´<`éðÑbíø@cêéÃŒsǼÑ%€YÊ,g‚ºF¹'¸m–Ýg¾gžÐ£/FÁôax¦/3Ä f^`†0C™aÌ‹Ì(f43†ÇLd&33™YÌlf3—yñcæ1þÌ|f³YÄ0‹©åeÔö &y‹ù˜q07™Q]ãΜ•yËuYÜå·Enï»/tèáï±Ïã)»›½%^~‚ëÇ©ºìšÑõ©§Êó»çžûG·ØîKº7õPö¨èqµçºž{yö2öú¬wjïG^ ½®+ûxõÙÒq_§]üû+UR_ÇcôYàðjFoœÞŠ;R•ô„?,[[¾Af7e¦‡‰ÁòHû–#Âaö`aÉ~ÑÔzÇ_\7„¸n ¿¸î8຃¬–<ù†PÈ!Ë*nîÎÝW'ÔCa²-#WoɱWEåâ9TCn‚-ÁžiÀ Z²Œt§ÉUaZU"ùFZ”q Ã*~sQ^Ü b©8ÞûDí…1Ø_qSŠnàB@#Ì‘¾e·Ãžu‚ôÆŒŒ”-›B†¹”xmLè~({öÂ~ëž|®µäyºÓ‘ó[<Èh7ü³d{ä…Ï¡oúF£¯Â e5ñÅr(‡íªm^$¨áu“’LfQ‰½=½ÊJÖ••rаóçΟ…;ö˜€ *„ÁݪYÚ5¡)~§ç+mÙ½ ×n)æ;>©?ú!p í·g/aþ&¿EóÉR²^™™ FHå²]™ãw®Ôi`É÷qÇß0òŽ Ýpè÷8ÔM\ÇÃÝU—ÆU~¼ö \äp"TâOúû Ïαg°;8?ÃÞvÈͳÚÏüí:”÷aAÄ["l…UQ›cŒÑFi³É`Ô ¶p)òx³i—pœý¦hÉ_ý´óÆŠ‘ðšÝïrVɬ\–ÉÈAÆ|]zóKø<Îøøz;ëTá¨ûÒRZËèù*z*ü¤2\ÍH/ qAÒ ¶AS"Ìd7ÓRg$‘„ÖQÊì40@ —àêLÈ* mow³Š€¶¼ÿ)Wøeë*ì‡E²±‘'³XœˆuÖ Š¡™mƒa°=òº}±U¤IYÏ£rÙ÷d”‰úÄ,ÇâJy£¹ºvÔ¬I¹%'X$ïÉ×V›j…]´0¥55‡êwî ¼úÊ_áÕb¼^ü©Áf°i!Œºœì­IIa åÚì+„ÁA8éëÏq²@Gé¿—/§Œh–Ö¨e-sky°B®®„„J•iÇbhËpX5Ä@ÚzÚúX©K§EÖqq;¡Th`·A”>„nJÜËÖ(³«›Àû[ºjE’„!<‰fVv¼ä`~ƒ·™µ&‚1?‰sù…fÌv`h³×78w¢ LTœh™€+xÀD¬ ±Ý«<ûÜâЄC@Llh†&Dl}ÐÞcµ¬"éïøF ÎÉt¼Æ–< á0»Òé=„œa”¸›|ÌöÕ®È ˜^¬Â}?Š@x‘†qæR æ‘TúHv‰öeK¿wùìf[Ž5G0€Ñd0Å©bÔšM˜)À‚Šà“kÏf:à\+tœ8{¸ñƒŠ`/Ôé÷h¸=š©Õª\£Åd;X­fëöŸ•¯ÏÓçFGFØÂmá¹0«fÏ37y ƒáUC®Í½>çGõ#8Í …\Cᾊ}Û-¹–<°Q˜Üú%N€fi{³ìŒ?á`·–8|ÀçéÿXz}Æ·¤[±?p¤âw°T°hø‡àJ‘ îK<4d /mÇ>,FÑÄÝ™{f] ƒëî£ÿjŸÎå½&¾TÞ”c$CŒ„årg;§A$å¸à‹ýÕÐ$滈´µ»û{.÷ÒÈöÉÚ%ØÉÓøÎ}\ÑîàRKO¾ã±î;ÓN•y˜öixŒE•Á£ÞéÑÕ7šG8àÖ·Õ ¯¢[ËÓ<–Éí:›V Á¬V—£çʵÖ»p›ôe£´‘úÈ?-_=ÔëêÒßN¯M®I¤Õ3ægs–϶ý'%Ø V}nDyXiH~hAˆ%äOËwnV\ÛÇå9 g¥…“ù[¦VªZüÕ²{4oÌn⥮¼Wv.Ö™g`ͶL…ÇÒ]µ ©º&¾@^mÚ¹F ¹zéè>Œ:žv»öÁà6t˜z®ÂžR öT¬üÏ_ýNa Á˜º(ÉM¥jeȘì0ÎÄf5lx¨:Kúà'ÊÔ#‘ÜTVQÙɉÂJÇlO›©Ô,/Z{‚¸Õ G*·­¯qâ5°íöÁ«ÊšsècßÅ™[KÙ6>¬} íd 4@I†=ÝZ–ü\œk·V™äd·´Wu8š2÷èÎÙ¶Û’ªÌrÜݺ·2x/ìïoŸHg™v[å§Xê—¡X¢[ /%ð8bø2Z –?„ãp¤ÇÝÿ‹Dìë§™Oú ¤–bOŸ/Y4§½““Q&UÿH›®7fao7é$]€îS¿Z=¢J™l]PMÙ—_æÖ àtú©Uåifb°Z,ee_)só!,o2'”ÌÞ`] Üx2FE‰0ûÀšíê3o6fÞJ¹^¥«RfVª`7j’!B˜3ëOdAOלÎ`HK›¨4RV§Hõ$Ôj¼ª:gܾxÿ*ŽqÆJîvOnnñt¶ÂP 8Œ@ÅÍ–‰˜ÂK“:‰£Ö)òá1þ¤á¢ÞûQ¦vô˜b §‰rŠ/m@²8³£…R•Æ?’¡ k:<)¦‰ÇJ9Ž'#ÍÂjÔûŪ²tЀֶ؜mαê(‚…¾Ž8]õpçÊ#Ä0y)3’¡s.¼öµX7 ?áÔ…˜ÏOüè‘`Šk8(À÷(Úw›{c\# ᎓մ>¸ÄÅÜÂ7.!Â4\“•ÉáÖ•שä‡Ù Ê׿C'ÏPYÄa8à²ÓÔ—‰ Fw!vjJ9J&%Å{«O÷ÆÌ ˜Ê¾ýÚ¢¹…·oÉ8ý­9ÍC‘þ¤±„³ 3=-FffjÚê Ó¨„Ç~nýâñ Ôniˆ.ÖäBBn9/7¿ðƒj±ÔüUUÑ…s(w=‡Ì"/5ÏÀb-¼o¾Z¿»Ìl†ÂßåêuÀ•+ñ¦B÷Ÿ’þ×ÑéбjùÚcö(jreo­²ß7±âc'¹ÒÌúL|nò Y1ê„-IÆ à†À½7à>º‹{ 6³Jå$°§mÎGE‡Wò&tûÝäD,á‘_ÔL†Sf _GF’©¦ã8ñ \´~´¯ªÈnbÊœ{Lùú:“9 œðh2V.ÒFRÝøñ€Œ;†9ÜÉVï4Ÿ‰›W¬"Êriǯà3([lyÅC€O|›ÎÇþŽð6?™fï+õn‘ñ'åPc2‡Û9ÅÊ›Ê)Âgn©äEqz'®Ð¶ëp…_»—+–5±N1îTùâJ”±»àðámØ‘µc3§ðµg[ŒV§Ì/,wªC²Á]QŽx.rx9inöIüA±Oª“†ó§«1êk 7¢ 0cSÒêº7óÖD&™&BpQàÁˆ¸Ø:Øl‹¨ŒKËy3æCTÙ›—c.Æ_55÷.ˆcÉ W±¡Tãn-Ö祖Á.°›sÍ6Nq»1þ=¨î(N¤vßMÞŸUTûáˆ&Ïh7Z€Ë·Úì"‰Â/3lœ3ÇpðüyË¡k×,›– OZå¼a!2Ø®5ÖAµ€«}~tk¨èj3Ê›·ÐÖhïÓF{™2ÆlÉ@g{¯\qêÇuG^†Âš¹[c9Õ\ÄCH‚”üŒ‚Ä ÊØÛ8ÔÊ‹ ÷Uî3ñ\çl¸¤©_ÓÒy> stream xÚ]UiTW~ÝU%Áˆ´Õ¶Q«{¢cH„5--‹6²ˆ; BÓ@#-*‹×¸0ŠHLp‚b\ñ¸ÌÐ6‹K#‹±£Ì¸0h4Éçäyxœj—?©:çžó^½ûÝïÞ÷Ý[’HEQ ]LP¨.râÜШ¸ôÕ^¾î‘‰IÙ©q™öoS„ÑHC cÞQPJ•¤iŒ4dŒd‹t,B”ïp»• -ú—‹ÝjDÃþ스E/NÍZ;ÙÃÓÓg–1#7SŸ”œ¥šìééíî.Ú©ªø\•ÆC¥K0M« zU\ú •Ö#ÔCf4‰›z•›1]Ÿ˜—ºRe\©Ò%.PEGFF©‚#ã#¢>÷ø#ßë0cfZ\ªÈk¸ò¡|Q0 ¡"P$šâP‚DO¥¢t”2©lôJ$< qHŽÈ MBîÈ y#_¤A(‰ž³‘… PŽæ¡(¤1î¡O…$h¤Y‡^R‰TuÕAâã°ÃáwG­cäcI„tœ4DºKZ-}Dkètú)ó)Sµ¿¡¤S¶QOmŽð¥Ü6m#nu{Wå€Ú"L7Qp¢ÇQ5gñ¦{3dãàti`¢¾jFmáˆ?Ýô_ !¾ØÊ¾s]×Òß^P·Q ëuü`ÃüžÁ'c}Aúj`[é”Þbœ?]s³õWC†$Å(CpÄ™U †(Å¥€nã ÌÛ÷38+ßïËúoS0Îæ(h„Ç\ûàè`bÊqyq¹x’¡É82m*IÂÄÈÚh ÉV0ÀX˜)RsÈ|VÔ&Üm£,½ðTLÊ|ŽƒR C‰³"?~S<úSIW–6¯¹‹ïâÎo:ë›ê.›ë,ø;\³¥º°ºðXîS…M‘^™¶ÏP–Rf(MÁS±:!znDPúd쉽NLnj˜Û“ð߯·*[jíq·ê¯ÊК¨Çb)@Nö ¾PÇ¥iò¼‘Âß×Ú^Èf`(Œ‚lò»TÌt°ÉŠÛ†¼óÑËÛÉ ¦l/Àìü'ñ<-âÆTTˆ·t¾ .6ROÀÕûŽÂE¡äþŒÈy’oG=ž48¿ìåtyðâ/‰3Oäpä4°×4±¨KÓ.ˆ0V ì{ Ó(ÂôÈI(Ü/)φb@ø›QÏ'ö‘ñ<Éz­}VøŒ†@b•æ;¹è5Qðd$샑4ÈêgͳCf¢w 0 åfÐÄ0ks^ê_6Fm§‹¾7 õ'ÍLêч£0ë9˸—·'JÙ½;øÒéÃUl,ŸHp^ŸšaZ»º( ³ÑgE)¸ÚN›•§qunUÚ¾ð3ÿf¡ª; ë¦HŒ®ÝÖføgòõÈÊå˜çý9‘—¾ À(ë±yßÕ:vÇÖCo­ÝÁ/Z¡ËOÀ!8¨a+HXÈ2s$•Þg¾øF¼[·øÔCãT•#°Md¡žu=ìr„Xî&“µÓXšY­ÚMùEм;ƒl—ÀþÚ4F0 å5ü|×å¿ï~²Ü î¼nÖ5CL“Îìz´#¾cö­³·;övÈ8$,œ¹Â–Èí ÖŒJ9ªß)fì3g–¯GWÇ—lce¨07sCNÃÉ™{óXÙóŒÃW ñVÓCÀ©ïFðĽ8Ž÷£×'àkßî©ÀÊý…5kÏaöáë¿•ørö©ål)]ŠÏ—î{·tûñ­,ñsç|ty«xÙ&•~Q•푹âèÉË9Ó”ÈoÜòPýL^¦qQ‡ÖÖïÄ-w”?Ò‡ÅÁ¢–ÑÃÃ¥bQ4&ðèuµöNë’YÀM.hü5ŒÌÓ&X¸^__qf"Ál!ËÚ„›o>íõ·Ô„sB¾ÿà&ž endstream endobj 700 0 obj <> stream xÚ]TkPW¾ÍÌô4ÈC{ˆ=BÖ  ‚E !<„‘AÞ`6 ‚ˆ„!`‰ZhWá‚°b4Z…F%Šb"YÈÖ","°NF ’ÄçJÈîFO³—½SÆ›êêSÕ_×ùÎw¾{ÎeTІqN]›¤MŠY£MÌ,(^âéÃüÌ"Ë¿eâ\$º1â<+Qˆ*éôbÒã&+s“~,›‡ó;GÑ´ƒ%Þ›m‰ïÐ /wB2†aßËßú‘¿¯ŸßÒ0]aiÑæM¹[Õþ~~>>4.Wo(U¿ã«ÖdfmÑ•oÙ¬Î,Ø¨Öøj}Õ±º nV/Ш7dçfæç¨u9ê¤ì4urbDB¢zuÂÚä¸Ä7|«÷Õw¬®èýÌ|ªÎn³ùY¢P&­E hƒ$éPÚÊ dlrDNH”ÈÍG^È 0Ž"P$Ò¢8”ˆ’Q RZ!I)T…7&‰i¶²¶ µj±z!I•4J¤ÒV™J$+“5Éž±>pÖ~†ÙѳŽ|¤ÿÏÎæŽIfRÃo<{'d…?î~„`¸ú xôrkYâM\³I:&A˜„_$iàExîÿ@O): šÇžiÄ xšwaSϪf";å_ï‹ý0¹êA<£´œopýÒ1qöpb¾G™'£¯âG‚ƒOÈ‹ˆ£¬…¥×ê ¢ÑÀ|c‚&‰˜fì»ýÁpHWOÁ“—³2/|O0Ä„©Ó6EœŽþ[ÖM|÷?7xnø“[x‚ 9Èã58ºT[¸0qט#s0d>Vá~Üsôú×¾øs0“ØÅª—Eq—øqw?m+ÿŽD\ªì"öâ·É·oÿý{Up;++KUYò|åpC7}˜ØÇËÍ»)^ìe`zD"Æ(o’Hy.«,Üš=yêÑÃþ.c_/~Èä­g œ^èÛ”…+êÊN<ÿªÍˆ¹ñΨ@NÕÇGE“bRä#eŒ`E/c†ŒqJé<8M¼.d᜺"² ¾—ŒNKûå'®_:F;jmÏ$³ˆSXV¼* GŸÞÒ——ì|ÃçñOÑfmžþŽ*û©¹ zHïW—0§Ä%⌒ÔNid,©}¡‘Ù[.ƒfÖHÒe‹à OþÀÂ,˜‘ÙÏXUÜC¸ €;‚÷è½ÛifE›øâxüÃÒaÏÏÁºéòîâî{wl¡OYE¸ÿëþ„ÊÆøˆÀxŠÏ ¬âÖóñ”hÕIòC¤yÁ…UX?AŪ=bwŠæNæÁ˜è:&™šyH%.àOV ¤žÒ׳°\a!$¨‚ªx²†H< /oÑ Þ,¸>#rma~sDß'B/sm\ÔŽK¦Ã¹Ä“2½I‚‰; $ÙdòÅËÁ–@¶x˜'i{"%œ8B2ÄC °Ï)-Pf}@5tȇ,2Áh–ˆ?)I*˜9ÓmÂF—Iõ÷3v½ÐŒÁø± %C²±†×&¯&Nq‡Cà΂]÷š(Ë(>½¾ÛO P^âtÇj‚]&E¡˜Å<8Dò ðš=Úu´…¾ÐÈý¦Ëì•ô¶]͘{òýSpS…(‰ryF¬ ÃÛêK7ì=ŠÐI‘m<ÿeæzþ¾ž8Zê´øâݽ0ÑË4Ó%[øgïßw¦²¦¢Ñy}NÚ¶DÌ-K6>ý®åÁ¤j7n¿Xp°ß9þ\Þ8ºIÂ*êKæ<ô[Uî<ØÑÂýFx³Ev¨Qñ‹¸B9¥ %—åë¿N=”¹E«¼ˆ’ðFÏ'*Åí¯hî_Ú¸49ØH‹3r‹Ò1Ö ³Áå^K—ên*9–Çý*Õa×ÀÖÀœýÊ»©`øÇ÷öliß0q €ªBKæSfçx§º‚;>£¢jöÅxßñ!n]\ùûø-=XñŒƒÊk<)g ´¶wã3xpçwZ=HˆnÐOièÍh”À"‹jjïËE¤>M˜Ó&8M­J‡Bæ.ø7,owâB^›\,Ý®ŸBêyâže°ûöjßàP*±¦sÂÄ´£½øîKþañ5~@îW™’R¸‘û!r:Ù:9þÙtã~•¥áÌúäݽ[»à¯] (qšV¼ æ/ù]2ÅåÜüœ½¥˜KßÓÚ¬‚ZºˆŠH¢Š¿KŽÉã?‹oà+ÇÏ|þêP:Äù%Ìm¤Rõ+•b\¹ IÉÑD”Ÿ¼$ÀÝ2.;þî]¡›k{:¸ur{}ƒwÒŽ6°‚4Igký‰­ ¶e°Ÿu­ªªººš¾µ:`kk¨«ªÚ_eöWÛÚ þyË"ùe‘3sþÕã¤9 endstream endobj 702 0 obj <> stream xÚ½zXWÛö, ;cWÆ5‹1³Ø-ÖX¢QÑØ;b/•Þ;,eÙòì.½×…¥¸ ‚-ö[HŒ1‰Æc‚1ÅMÌ<üyÿ3 –|iïÿ½ß÷ÃuÍu±sö<ý¹ŸûD”µ5%‰ì6®›·ÌqÞ¨¥ËVûz»øŒ7fµ»G°—K€ðr ÿ*Åñ¯Yñœ˜—[·;àl4O±Ík%:ÜGxJz‘'õuoáé@cÞ²¥lD"Éfï¨ cÇ›4××/<`—ÇÎ û ãÆM3†<§Ù»†Û;Œµ_ìâæéè¹ËÞÅg»ýâ±ËÆÚ/÷ %î²áëcïê¾ÓÅk‡½ïû5îëíßYíh¿`õ §•ޝýƒ¾Ï?XîàíâE4ëÓ[Ô n5ª÷LjNÿ-”sÿfêsê6õ=uŸzDýL=%*ï¢B) åMùP Õ…êJu§zP=©^ToªeK±T_JJõ£^¡d”ÕŸz•@qÔ j05„J £†S#¨×©‘Ô(j45†K½A£ÆS¨‰Ô$j2õ&5…šJM£¦SoQ3¨·©9”5—šG½CͧP ©EÔbj µ”ZF-§VP+©UÔjÊ‘ZC9Qk©uÔzjµ‘ÚD NQ¨©©Ï¨ëT µÑŠQÖ”ZÔU$²Z`•nõX¼J\*¾-þÅZj½ÖúŠM› ÉHIíHÍ,b®u ê²·+ÓÕ±ëÅnk»]í>·û±oõ¸Ö3 ç¹^oõú®÷ÂÞ·û8÷i´m‹ØC}Ãûþ$õ”~Ù¯è•u¯Ü’M—m’EÉÎÛm³û¾ÿÒþ7_]ðjÀ½¯zMõÚC.•{_!b¿Î¾u ÓÀ÷EúpðäÁUCÖå†6 ë5 †þd„vÄϯ׎œ6òªéÉ{ñÜä*ú؈fÅh ï(-¨ðàB!:N©Ôj4Z4¹Ér¨NûøÒÅìlЃIKJNRL…»®(Ûz ¶°¢œCkûý÷¾(èðÕZÚ¡+[z>ðóÎp?ÿ¿:®r3SSuz½NØP­’ƒgâÜ¥ËbcAj&1E•’Õòê*hðßûbϧQ(Ý(‚§‘â§‘(]jü-2˜îù/«Q†©`æm̈m­3Ú>iFC›¡™=Í—õ3Ó pH΋il©lµÓh5 îŠl$lûƒÛû/r{ .®8ÈU£ô…HfwyLQiiþž÷Ö4Í‹»­Ç"Kfx}ޝÓ[°ó¢‘Ø€Äj›ÎÍÑu4>œã*Ç¥/­°yY1•9Ø¢˜G3{ï%µ~£=”*ÐêTz;Ï\WP3‹ËÿIžÇïÞÙìægKñnÁœÞß}vøŽÝžP¯ŠŒO*P2=ÿ%’žÀO AN– þ'${%~cÀá!O£BEΉÑ-œ(è# pdë‰VÈar@½PŸœÎ”R”\Œ_°³ë±U,Ø™…{œÆ6çq¯Û‹3IM6¤É·=Š$û7!ƒn(P5Èfê5ùý8`”*•RjÐ…ßqOìxÖ<÷ƶ1*+“U©\&Üùð=ÄGVÙH ·ˆ'Ä]ÎX‚š÷£æPo³_ÜæN‡A4‡«Q$ŠBC!ŒüUƒkèè0 -‚\9"I¢!¬¸Šr9TƒªéÜ"(–w¸Ïîpí"âÚm:éåÀF·çžÍƒÜÔ¬Lý ßåÛ6“¢Ó‚ÊâÍìÏ?G4×­8'ÊB…bT…VHÏáÂUtÇŽðDtû ©õ“ÒªÀ2ŸÀ@Ÿ²Àªª²²*RŒêNÿœá_ó+Ú|¤Yñ .Tqê8üýo²¤H"qTdÄgq¹œiÈDß?u¥ä@ ù˜lll“E -(½EÌ;£kR¸™tsç'[~œ–ï+ÀÁßu¬çü¤™ðÌNß8ëÀôk¡Gá|Vrð‡ê+)7àsfj¶fÃÅ’¨Ñ«½·ÂvXi ÿQqîÂ{pšÓO¡nŸf˜ šÃ‹Fd:Â,X*H&EQo¾Lbë÷‰˜ŸÒÏìIWgÕËùst胸eK&‚'0^t1ÙçD9ÓžG{¨cÇsž^’ZÃ×°Ÿü~ µjËN×ï]GóùÉl{ì—û¿À·ìSÞ 9H$IÞ‰Ûâ¢A0©õ…’'Ñ8Ä?ídüMÜÛÌyc‚ã10Ôf7–‡—ï䄔і¾ªþ0ߘ>Mξom˜±f^ƒwË ò>ái ë x¯ò*bÐRÔõ§‹&{—X}WÌoA³¤ðåÒƒK¾¬8÷ñÑ—ÏŒ6kÅ¬ÝÆ°*s±±êØfˆâÌG›sê€i<<^±šUþÛ¼7íRh´šDHÐ&j!ŽQ¤AwPòeý‚×ñ€ù>ÛäÎ0»`ç{µIf#ìcêüŠ}=£·ûn¡žß~ûˆ³xõ7óÁĵ'¯ŠyO4MjÎo"ŽLäâI±$Äâóí»d^¨hí¡QÌáB¼$†ÐD~OB£š1‡Ðs4Yuò¯éyf)VKšïbc1YÝÕ‚6Ñ+-ïÜ÷­ 1Bm=i}ó’¶²}{Ço‘¢nÓbŠÛΑ;´Žf™’beMb50¨×Gßæ¤ªSål ˆ.IêÐø¡ a­(7Ø’¶¹$Á ’›ì¾q)ÇGépHÈåÒ@oHNÍʯ?õœÓ–ôðüúí°vŠ@—Àí;ü·€¬>ñÃΞmдYÀÔ˜ÊÊ"L»£w&n‘³%²ÉWF"kÄ<ú±œÅ~PiË·ûM¶MwМ;¾wØv;g)b'üˆÅÜر>tSF£TÔ»î8WMJã.&Ê ¶z•Eó÷d4œßöîTÜ¿Š¥Ø#fÞwrö4ÿð=’ÉÇ뤰 6Dxx¯Ø’KÁû¼2/üÜ„BæFõÃ;\>ó²Â°6 y¬ áo_¯&a›Gr(¼M&Å* î šU Ù]mLC~Æ¥œì´ÔC¼é&ÁÖxÂxüên,‡¡vq°õða8”ɧá´átú©äÒÜÛ/¢WÑjY†ÐK,%_ÙÖË$j:Vr © É:C uŠCîMa%‘™Kö\ô43w'œ7|úœ±„ë·6mΊ­0E¬ò™ì#˜þ‚l~hù•›‡IaõöM+vâÞ7e[ö¨öBsáý¦«×.¯›Ë•´K¥sf¯›6yîÅÎU_þêê5SVvÄ–w¨Rw÷Vé%ÜEãMû„0”ÜA½ï°Oµ¾”"#¦?œÀ­áÎ[]·¹Àl÷ùæudÍ]€Æ¦ÒsŒ'coYÅE€“Þo/s0½ªÀ˜é¿}á)ׯõD§ü»Ò©»FNäØW‘°¼.…×Ã1:Ù‘’úŠcûrjI,jvleX†ÊöL^ [˜gýùv¶`¾ç{0¾aýǾüüí— íݤUšOœžADŠA\š.KŸž¾0sɜĄ ûñMÄp°…ìö£±ûEgÚÆ õ°´Ú”t‚Tžœÿ^’'€^kMÞEqíßK¢žÿ£¤°ÚâI£Ø`æ·„ŠÚ\ú™Ã馨Á^m6²¤MZ$D‚Z™ÝÚ…¯w‹rÒ’vüÈ€ha Ù`*—ƒA—©ÓF¯ÈHNâ1dˆQ‚ÊÎÛüÈXRgøö‘ÆÛeHq°„TÞ a :ëäD7QƒÙÉ[й{ÙCmr´D _Oû‹³ï]¹ Ÿ0_¿ñ%îǵ[y•I®ëòö2¡]½Ízñ$l²»Óú½÷F·¤K6N!õЇ"­¤FŸv„C½%ìõ{µo®•—áé¼uÓ†p¸d³&­FŽÊÑJšµ~Ð4v!Ál««S¿ 6·1‹Î<æýöˆÛÆ hi&¤Åp ¥6.¶Ÿ†EÀ,Çë÷¢ãèZ·÷‚‰ u\1¦u.0ù`(‘£8ºÒœ T¤Án˜#ÛQ·þØ(bý <OÄÎØ ½‰Ç£åhÊ}$GŒ cs›È,BÜí£QÌCqÛ:Ô*E«ñ«h<žõç–[IÐ Ä¡h¥|x?Àâ°CýV¯̰ ù}´Å %áJðñyVfL†™$­ª„Q7ß6£)Dê€V´Ñ„F™ &q›=Ê"€€Ç9àÙDk»Noß¡ïey¾)7¡ÂÉd…×Hn26ØŒ¢ÍüPKœßl·¢$©™Æ=Õnð&x켪é;ÅùštT6Þw1ÞXk‰÷†šóܯðíøb<üoÃíYítjqÜrü&ž€]° š„'¢Õòkp³|ï{9ÁûÝe@zž9Ð É)ïsxÑŒövÄâQ˹Ÿ9~[À^¾Œ®Óg]çÊÌ’ê9àN~gÃNãUF[œ„cð ó÷k^¤ ™™>!µ¸>f¦g2P:óþ| ib»øwæç€V1ºÝÏìOÏPwªfÈúœ+ÄÎ B·Ã ‹ØrúsC§Xµbç/lù9Ù°>ïØÒJô!ØÈÚ Yù³m#²^‚¬ºÍnàÝÛì…HÕ.0ÜIHêèû³SÞ¾™~cƒãZޤ„àqŽa‡œÈÞS^ç[ì+gçïŠÞ&gaÎÕ­Ü#¸öQÖ§ºt‚t{~%ݘ —:[æ CÚ‚õr‚dïƒ8}'C Ñœôô“Ç¿ÐÙ™iµ'ø¬†]Äz¿65â!2..!7ã2tõ?ôø\š ŒVh.IψX;ïíJzemG¯ìÙfCr"4”ŸÐY'¨ÎľÏn©NÅÐhÜÏfš„×Qê{è½ûWc–°#<ÔãÀ•Äbf§BìµÿÚ; I)Š3ÌæNgØW¢¼J÷…ø©øOÒÏ”øhñoûyöæÏÆÕvxæóBUÓ~°yˆÀ@»P†À‘ 9_§£‘òÿX¥Ä¤Äg‚]Ò“³¶­‡L×~UòÌAõ†If4ÀPOrC(†ŽUòÓ*I%tdC5îb°ñ¢Ãf?yû,?áóã³µº0¢ÇÛ^U’<(ÖæiKÕ:-„1íE¡O’¤Ó&+ùÑí÷d±:m0¹V$çÒpäqg’—·M5 bÛcXïJ‘3EÚöb¼Á“°+©ê±xš£Qh"ÚÊ É•âBüÚ”7Fáþß \”†}Øò5<gpÏî¾rtÉl[ûn#ÇÇì¯mÖ¼RzÄ7ø5?ùcÿ‹Ô‰G3iÔQ_<”é·0…É<³s¨´£·JÐD¸QÞa ^ûøŠ©ÁxÑÈW™lÏï˜Ñ,ó3š^):sùƒËhée1¯BË¥ðpÑ—SŠq_³lYÞöSpŽùèÔ…z ŒxjêV”6[/’£-ˆ“ZmbìÎÕ2ï*ׯ qÄS&”ÃÔ“7ü²TÇc?ЍHÜ“X¹£Ä?s7ìfæm˜;…óY)k®:¥¾¬­Óf&ÞÅÄ@b¸o¦# 1‹+>- À\sÒ¼ë²G+á]nÞGV#áêËCÐZ³¨Î„Ò[Q:æðë¥al#I&Ì$MΫA£ Ê!SS¢1Ä×» zç&0ÌGdÆ> - Ó¹{…vC¼•[˜œ¥¯€"’t·;OÚA°™¿h>ÒÓZ›Ÿ·„®jÜíyKÀi%%ò_Érë+ª>Ô‘,·Ÿ@Øß}s€¹Îl[ø4]ÿTi‘ì­ñÒz1˜lõ¶x7„R@$lw•áI|Œ6Y“ )v{ÎA¹EòArOa9;õ,”@¶‡ñ–·ÏÁ“yaÅi`øÓÅ'?…ä¤ìhs{›ÌoˆË\Ч%ç i|Š MoOíøÐ®ãS†Šù[…gd6€Ýóæ]Ö¶Zܶ»Ÿ9Œ^!)!fì>–¡×ÐcõÞêV`±˜L\›ÀÀ;AWc0ñdœF“¨À¨¿ð^r5q࿬ÜȰµ—ÿ ¨¼NÌŸEÅð°’ʧꤰC³Âgkˆ—ûn'‘;¶‚GY`}t  A®4i º¬ü†3§ÓËàÔù—¹—»Vƒ«0võ?¯0¡š»õ&Ñ޴ŸˆºI3ã@M[£Ò(}Æ.ŽÝÌÚ‰Ðd4å˦“ò ¸¤­õpU+½!†ñ/ ­,/.Øóᬆ·qŸ7ÈœÐ÷}0‚Ìý«Q÷Lî™± ó3:MÌ5{5ÙIEͬ»å^â„´£rþgšÍÉNìEûÔ9—; —&ƒ^ÇRÌÞ$òËph¯©šYD³³‘ÔÂA£ˆ`ØïM[ƒX]¸Ï¿Q}–¸zýùªC%æ}5§ š¢Ì[³"@á/,ö.AFQe Šoî49AŸ$˜¬Ô$ì2â`¸í ª÷~š¡ŽAÕ£J8Ý#C1óÆòìÿËHD£ž‡¸H¾ÙIqœ$½~Ë´˜Ç™øÕíÂ!ýøg×1“n¥EȺùî×bÔÖÖKZ¿£fí;o®Èaú÷/Ã~8ûIoé<EŸ"‰wA ýÍ»ïä y‰±ªð`‚òC+ªòŠË,‡ó®¥hõ¹C¥ù¥JcKmÑÄOÉH÷)K+øp~„´ ¶z;)¡mJW†Å —ÆÎŸÿ¶¶ÝM!1Qá»a'x帛CWDx:ƒ3÷ÁÔuýùø j£¯¯\[¹ –C8C¢Î39Ä ÕˆJ Š|ÕEÀ|wåÊu9ÔGÖ”Öí­K)$¹ø ™hª$Ä29±ù™Ei¥ž‡))øi=£bƒ|Ý€™KåP¡«Î31ìeEzviå~`¾†áArdÕÞMê4oÃëÃæ?ÉÁá}õ Ì{’ÛÈ&ËŸ_zÙu&²º‚ܯ°×øj’]눶Ú= r¤É(göª‹.Ø]¼ ¦À¶‘Œý$aï½\^Ïã`c@Ö/.À–Ò?_=sùR–ÓjG¿´Æ¦óØNˆ±W=±ýê×éͬ ‘½H•Ò \²g±½ âý %Élãó¯[j¡V³WkÇÊÖð?I+‚ʽw…úø•úïÙ[\iâ:ò»ó¿á-›»Ý=þë¢fö´cƒ”WÐx´°íõ As{zküä%\8ÿœ¼äâ\¨`ÊË}}ÃCý×ñ=ûéÅËßrlß¶AÖ"ǪW§ È_ðà“æO›šÙ>X±‚Áý$fÑ™VŸ”JzJòÕó™é—Ž7éKÈôQÇ€/!±ËôÑ:‚uEÚLÄ@ht,!±qOD³µîc‘Y=÷ñcúòéë›!Ü.,B&¼§ UP¥­ÒØ=ó2O!Àâf¶¥¿t§É^ùs–;Qñá§0væ†GÛNýmzD¸G='k+8ÀfgßeÌ/4ûø¢?•üe¢°GÿHCØVâw8à \€:2|œ*;XqøHÉ~8‚ËËa¸wâ^k&ô·3G›lŸ\Aù-lïNØù[ØsÙÌ4ÓÏ ójšr›¼}çsU­ Èæ…A3è :%²Éé32‘tÂa?Üã)s87p/ök$ ¨ƒbÒlߪãG«ŽsíÂDl#ïHúNeFZÀ/ÿŠ˜/Ãk¥Ïòêl0í>.¦ÒõÒ[„þ3ƒFâ~¸Ï½aˆ‘ŒU ^ð’R6^è¦<Ã}ƒc¢=ý6ã°¼•àC·Z>¹Ù4i­€*á0¤#´OšŸÜfíyŠï#­öªræÀca´3ƒ¬„@Êÿ,†±4;âASëgÂmèµjmh,ø3¾%QÆBSvµÐ>´êŒú"~`‘mÍ»ÈõÝ wÉ$ÝŽúJá¤÷žØìÝÕÛÓ]Ò³æ*X[Þx›CV2^屢ÏnÅ,Lð§"˜Dà3&V­Š‹W©Ý+]!Š@sO÷…ŽrØ™ï[\í_©ü8ša¯U_FÂ\fýN·™Üð8ö•:G›÷ŒÊ:(` ètEEz¢vaÑA—CÚ>úðw^Ä|~+%˜ÑÒPÛŸ¯˜Pû}…zKϬ¡çx»ïXßpÈŒ›ñ`!«'H´Ó¼í_W1Á4kþ WIp¯ïbë®V^½üÒò®x "[ Ë2€ D³ððŽŸOOÚ´ÀaŠêÈ Ží޾¢ÙÆŽ·7@=AŽGÒ3a̓•U™ñd éH¨Ìþ Bæøh1ŸÂ!©¤ñÑÁ$a¾¯×fF¯Q©Cqº [£jeŽ…Ê•7@!™ï±Hín:o=a— Y™ã…†`$KÖ'åY™‘œ‰^A7d¥š*'Ðe"RdÎ3‹ ÛæˆÛ-Bƒ‰Ð`+­ÓÃÁ” IЇ3d#Pµ*[+pŠŠ(&2«½Á§Cd=äk2cR”YÞia“q’l4*N†ëägk‰~c2| ²ÕÙžÈÿ*K‰6$ºéSSrBu²G¸>Y!|d—Aß.è Yá1sN­E_ ÐX®Àl›ÍëX5ŸCbÀ®t‚p}PîæÈöìÛw´¬Ü\טwD7¡ÃÞ°V# k_¢IHˆŒ‹IR.›)›ùS¼@’Rí //£Xǰ9DQJ›u~‚UN{dÅ,•m^šÍ«7­Z© îúËõf]9ü –ù³ƒ ‰9d´2VÕ\øø³á²tEN$qZ||”Ÿ–aÕ0ª€íŒ,ÃÅXx Œü6³mÑ-öУmÖæG–§Õ$ÅÃZ#£*S“L¼Y^Eÿ%Úï Ä}'Ù.’¬ ^ã; ر×4+4'§!Ÿ)Ë ŽñÞÚäqŒ»gË΢yü,Yù¥ãº|èœlÁÄ÷%-œï"懢„ÕÅã®!Û0# Òdæ»gdYš“á¾FXÝdÂêRÕ“ÒgD‚«Û{Ä ÿwdFÔD-’—ço… )¡ÂY1{áàˆžÕ†¤Éƈâ`ˆ…¸• Åýd¹!èíï³R22õÙv/Žfž‹¶œÏ°wÿ?а ÷ü%_"š-!heès¶¨ø§›ÔïøælÅgõÆÉv§ÎñÓ¥…á…á\(*%îŽÇÈ ÂÑhÔ3#-= ²í~ÏŒ:̰Ð#öÛÿ%~ÄÊÔüØTêÅxÝjÑI˜þþŸçëü¶‘ÿ$è¥Á 1‡ ‡žDé¿5}ý7§¯Ò¿˜¾X™±­‡42ÏÜ7mã‚ /"Ó/?<-‚¤lXðzÇü(ì#ô¯LQq‘…‰¤ŽŠŒÇÏ0Ï·ç!ÛÓ¾ÿ¿0¾±ã¢ù¥ÿŽ_BÚÎuxr¡â÷x»OñW€Û…wõ÷;ŸÊj›ü ù¹È'+Õ(áºZ¯ñíÞ%­{WèÞÍÜõJ7£N/üçaš^o¸Ð½»©ÑªO5 )©ÉÝ{p§O~þÕ÷ÿÛñ endstream endobj 704 0 obj <> stream xÚ}V pTÕ¾7›Ü½„ˆÊteƒ¸Pc („‡Ï€˜Dy7t ›°²É†Ý$›˜ì;»7ÙŸÙwbÀ„WmÅUG…-õÝúDelÇGǬÓÚN«ÿÝœˆ=7 ’é´Ý9sîîÿÿùÿï~ç°Ln.ò¬ú¾uU«6UÏ^½f¦e×úŽÆ½iþ¼9ë´ ­zQzåq#ÎgŲqL\˜«ú²J¶ãÇ‚œ¦‹FÿžÈ»arj®•FõÕtdÉ5tdÊé0E>•™žÃ°ÌUÌ4æFf.Sά``633õŒ‰ébÆÇ$™!æ(ó,sšy›ù€ù„î`׳¿Ð˜Z´Fiw#M«Ng¬Ók›õ­¦ì¬ÎÐÜal1jëõÚvSë“¶E¯5™´{Z5ú£VCÇç£Ñ`6êvµŒÏvÌMº¦z]“®¥C«×6j›Zš´ š¡É¤×˜vµ6éÚ´F“†ÕQð¦FOmêD#š´uÒ›zCƒ®N£7ëõƒQ¯­oŸŒ£Ôiuz]Sƒd¼475;%—²ÒyóTH™KÆ¢2ú4g—íè(º·´¨JS·Û`6íÖišvU•®)-zÀ`¦F]Q‰¡©h‡v—F__d¨/Ú ÝR´qýÊuë‹V­[»ñÁõ·–þæý‡ùƒ±Q£§ º–¶ŠåiS¦2?cgÒÆÌg1å9593;òeš˜fÚ¿CÌ+°=l/ëeõ±~6ÀÙfûØ“`–±Q6ÆÆÙ›dSl?SËlg¶1w°ŒJêx.s;3Ì.eÏäÌÈ åü ÓË>έÈýc^uä}ÇÝÏÙå‚ü_ÂÛùùLºu’fÒh~$ÿ•É9“ñÉ)?Ê&½Áàci6S…žv°¨Æžã,í`6ï…”Z|ŽKí…}êì{™üDzýö8ÙŠµJ¤C<î÷C¤0îŒÚU.§“Ô’Z%Ù†µöx¯ß…‡Ó®WPˆ:q«´´•lu8zÜà.´Çœ1Uüþxk¥€Ô5æ÷„¡0‰ÆÕSÄñ>œG1…˜¥Üü®g½ &Â0P8`IXUx¼v™ZªLáB_Ò;l„ÂN°ZVÞ.O‘dêyk|ÝPhµØ:ÕЙpGœy¿’Ì\ålnè,ìLÙ’ª „|ñN½ ´ò<¼§+eKÁ!€aoÊ‚eJd—'œƒÖ>(L¦—ªQ~OÀØ3ÒHÿ²Œ–Ö×ÙXB*ÉRBf“*²g“¬Ä5X‚³±JEþšT\K1§á1Ï’Ô„'8¼ÃùdZ„”òä,ùHA–ÅH*\8Ÿ—VÏ^ç"óI¡v'åSF»ˆ>¹fϤ3'Ò²Ñ )ÙŽâ&½´Ôu$A´îuØ‹܆L©ê®#.²š¬%b"•ø:Ð…«q-Є•ä!âPewHnHciZÒìgiY¦ê\–d˜#¥„C¯Ç"œŒ9X¢Æýã<‘ÖÕäG~Nn$×%dÞH®ÆEj<˜åÙ”›åØÐŽ MäÅd%(Htlá±!ô)ÅaôÇ‚‘ $³<ë^°»Ç^&ýJ‡Ç)€l1OTOSCÜí‡ ðñ(¥O¬K5–æ,æÿJè,þMIgÐ;…)¥µ¯z€·;%ÚÚÂ=I·8D|ʱaâw Z¡=êŒSÊø!Oc¿2Œ… ÁÕý¸Ñ®XºÓè6³Ÿ´˜³­‚|EÇ—ŸoÇ\oÈôßÁ¹=—z`îé%oäèå,݇£Ï‘Rgz¹»7n^Ò9—w…Ó(O9Â4®Û¢ú¡Q¾ýçÊ]>Ü|‡Ü!äÅÜ=_Ì œÏ† Å@î‹ó˜{0ä !ÌÓmÙ‰…ÇØ3C™Ï‡¤=é([‰r2YEn‚2Rbm½ÿ^_ëÞ݇|n9ð„¿‹°$ŸÈÞ'rœ¬Æ›à+,I½³Ôçj?ÖüšæSà‘ÿYÌW·^wËÊå‹UÛ`Çðö“†£Ûß2Ê?Æí„õá-á#•‘Àí>ƒÊ>*ÎñÞ=>Áçð¹ÃÞ0ðy|ŸF¶úÍ>«_¹ÿà—_â,,ƒxaÐp©š{võ`ò¯W'ô=P·­}¤fO“˾q†é ÓK¤tñpºJîVÚ^¯¤æô`Th £‘ÓÏ(±flUØâ÷Æ¡püÁ¾~±vt…2÷ù¤cÙK‡2S?3Ä©òe›çLê+ȇ‚Ééüôä¡@8ðÇ|á€ÿ@AÁP  ñ”ߟ¹§àªçÄ endstream endobj 706 0 obj <> stream xÚ­Xw\÷¶Ÿvf4 ȰºœE£`[ºQ±Æ. ¢® Š%R¤#ÂJswϲ©‚tAAŠ(c‹ØbInL¼Æ¼´g47Æ’ï5gðÇ}y¿]ÔÄ—ûîçýñ˜Ç)§~Ï÷œ3 ÆÎŽQ(ýN_ä=ù¨ ½C·„Œ÷ãú~ åÎëòËŒìªÙÈ¢­ìl×OŽ»²s\í¶*1Œbe?zf~u°œo8ZÎ3èÉe¹c§P°Ú-ÆzzNš·mó¦ H· žžÇŒ¡ç7ÜÖǹyu›°!84&"x³[@H Û¼± Ǻ- ¡7»  q[¿1(àý÷ÜBßs[¾ÑÏÍgÙ,ïens¼û,Y6bì‹Æ>ÿZåàÊŒUŒgß`¦³ï2 l¼>Ì & ×ûvÛlclþNÜÊ80ŽŒ#0ÎŒŠéÏ `ÔÌ@fó 3”Ƹ3Ìpf$3†ËŒc&2“˜W™×/f3“™ÅÌfæ0s™w™yÌ|f!³ˆYÌ,a–2˘åŒãËø1+™UÌMf‚ £`ì˜íL)ó­b¸â ŸÍÛE¶wì|í¾P¾«<Ë.`ë9‹äò«øÒ^K{Û÷>þRhŸ^}êû¾Õ·Ý~”ý‡!)Ž‘Ž7ûyô«è÷™ÓZ§SÂá°³£³¤âUþýûç p°Úÿf“xÛ >’þŠBi£â12ø2¶òÃþÒlyGf¦w)‰ÇCöÛ¿4ý ÖByzeb|ZXНä% ›ãý×Ά8Ø”±µ¬À|¸Žñ‡"÷F„oœsÊm±?ŽÿsE2è'Õ‚ða¯†??„//@¥oæÎ‚-°6óö¿Ùn c(Ý%ymŒ¢ë/~ÉíRêj’ \BaWJj1uÿ¤NKЧL>ZËb/s3œ…Ãz‰ƒ P¨É,8‰}•XÎ^$îÊÑZ¶É|ÏŠÏÛV|ÞÄT‰e‘Å:Êf¶ú\¥úŽ5b‰¤@€gpˆmW.RÁýÉ“—r‘)½znò?Lú’L»gk‘é¾C­Èâ›ßÞ~¨!^ø•êÕ GŠÄKpÛ¹÷í5š}äKUg2T$ ðú²e Á!ÿƒF:‹§ï˜_×IòIqÇÈú¶]9£*K5Å‹‰ ÆøT뾋Üa ¼VµâCí¹¤ð=œ5#sù£«}—{S+ˆ`Ž5*¯1eÔh0˜+…Ü81 †”Ôw—¨žœ»wå¶ 2†Œ $é_Ì ¹U¢rjHxg'åÛ;Vÿ]åèaÛu¿Wa‰*²Jìözîó WâHúâ ñ0©€(’|ƒ×®ž3qû"ªÃ]¾ƒîìGðMì‰Y ~»çÀXê§ÍßM–7H˜'9Q Cp²„R‚$<éÚ„û( G1tYHŒÆ†ö~žÿt„‡´ìôdÿ‘ârÌÃѬЊ“¡Æ«˜ôå%ö}LSþSa1êjT—“…f³ù¬¨ˆê©”°ÂêÉ'á ɶë5y¾ÊòF÷/ÏÞ ˆè„£´KP†¤mB"/cåIî~îs½)TïJ¬@7–j­|géeI˜~dNBIîÝ“³‘¤ÜÂ8•Äé'A …ðXð1óZêÎA,„F†'§Ãd˜\»ê’Gâ§ð7@»²ó‡O´œ¼yø>üúH ×ùy+hlŒdñ ÈjFÆa¾æ <Ê8y©.ìbxðEP¸Gƒk8Úž[]ßgsˆ­ìA{'KóÂJÜzýXC°Þb$KSÊj¹VóCh§ÇChÕ[ÒÕRW÷ûûx‘p€5K)³ãÉB¡4”J{Yb×é‰VÁ:p‡qOrÚ`7Ã"c$ߢþÁä:J§­O©- }›‘H8:Ðm#©Ý5j’*×èªu.d›EÒEV˜QFc¨žtz„¿MK/6™ÏA3å\ý8m±WÚÆ ~qoŠË¡]*xY2qXÝýP)TçÆ¤çCìÞ“™‹õ2Q›¬&R1æ»@û„ k…¡‘ºýDmµ÷z¢¥ã-z»:»š^Ám£Þ›&˜œ`…5|ÕœðÊ^(1î5ÔêMFˆâ»GpÝCä ¥à§+0šèlBâz\ù·Ž¤þÁ‘/:RÆÉéÝß(…м$“±ø}[©‘opPa2í7ÓV_e΀ý`AæZ…4ë±ÎZb®€®¿Ð2tR¸ÛõÓ=UÅØiéÜ;‰éÚ¨­°’?M?bÈOùʵãÚò:ÿb䜺 ñÄæ[²Dìv¤Fþú4§l#…Èz<´ÄЦë°WD+¨ns}º¼ «®m>uiꯅßkˆ$P-ƒ×É"áéó½i%eLY¤é[iù·É\›âÊüä­ü)mßüʳ”Aê ¹ËÁ‡|ÛþK?‹_BçæJ⚆rà« «Rƒó{J$…Î"ºkש—¶ÏË]m¡£†h`ÞÁ5åQ'VJEEÄíØ}Eôž„êpXïŸýŠ8Èè²aÜ YQÀG@Z¤†Ìãb!y¯˜ »sÚÛÕ­º›F=Á7.¡²ÓB‘‘m_R®~ÐZW-èpëºÕƒŽiÏÐ1üèøêEtôåÈp¢XE'¦pV<åI´¬/úr«?­Ì§¥4š#.Èn@ïÿÄ^´ßÊýè£ÏRïö<õvÕ·Í…Ñ]/KŠ*W»H[W;“Õ¤0ca-l„…°‰ äªá8ÔêÈ´îej2K^«¼/±õc¨Ö@x‚è·¸VË´òÿí.¦þS‘½=sg5¸TCf^v1zɾjôêö}ñêvùGuv‰)£Î\–QÅ–YþlZãV À1Nû¨+È Zùd•ª2ÅE&(„Jž²Þ™WÉob¿k⺆Ø}uõåGD8@Ó—±?»ÞTü†€©šÍÜL=ÉI2ŒÖÓ(tŒû„Dj­8 ÓÞ‡5³eP¥!kS GKÜæ·¡á¨H{%N(:iæ{ð—Ö(;7âÒ§ÇÈ:ÓQÐY“`„ ]ÆüH†‰^°2$"†ÇvŽÌJQj¹K9¨é~ qÅ¥%{‹Kyáêî”>w(DF<ú5âÜ´°<<0dý]0Ì‚À3;÷ð˜Éík8^ÛA³ÒwE’â7×ð´Ù¡Å© érR„ýÆSn¼+oÃ^ª"KÆÑž¾`u¬…´Уý,ÐñI¥i€}!%’åqÛ ÑÌ?‹Ó-Âg/…r2g:áO\~cñÕÈçhžù»U’m©Ç’¶Ã¢³hæY6Ena*4käpBÛ<%+¸•Í+²·Xzú‰tQÿ0‡k>„ãUuÕü*ŠDTØ ûãÖ/§3±ì{MC1v¦¦¹öˆ”Wç %¸"Äm•OZ .8ˆo6*êѹêö¹G7:êíÞXHãÁž¶=zµwð<*h°]Ni°ƒ­Èƒ}¨K»¾òä{¾{gÓ{“& %ýÈÀŸGâdœÐö¸D3ªH ›Ñl:R~°¦¥¥ °d¦ ªX±nƒÚºcX£‚ÂŽ¹ƒ¶ò»r—êȦcSF&€(E÷ç+¯“¹ ®Pzs‘&Ñ­—“HßNm>Ï­³ r º”XˆåýbkÔ—·Z—Ü58úþÌû÷ÃÑîþºû›7µ:áîÛ”Éà¶ÀtÊò`Ue|Ã1´úuA¼PWP>z3tù”YX_¶¾>24(m Ýe2Wµ'ê½¢aï×1 µ8ë‹ ×h ¤\ž{ˆ–„-Û¿F%2H7­ËÑ5Á^ÈËÜ“½›ú„µGœ2TS˜ íø‚&BÚv0¡ø@qyF¾ÉnH¶ì…½Ã¶•ÄÕÔ””V‰$x´j-Ì( çÃ&ÂÇÇŽÁÇ·oÃܵTv÷Um ô!ýIŸUíí/C‘ˆ½Ø:TÂBͳï Ïa„–ÚŸâèºLúK³±€û‡O³‡8 ü–Fmäx—ü±xNö„¬_6r¨¸uâò¡òè©"©ì¹õìã‚„TÁ §Ó×èI쑪‘.¢ eN8G¼,"/XQzÉòž½Y)¨?‘;ÿŇ+ˆ¶:d“UÞ2ìw„Šd¨È:, PÉ:Ž,°È+ Øc¨Ø‰ÍwæV&ÌX,n‡”Œ„ÌÒ¢¬rØÃ7„ïÛD—ÀÛÂ6i„dï‹›¿¾uïôcQpîd÷¯4[¡c”%R<ÕwÛi”º^æ„OþëwÛS>>O]ï‰m@ϯpâÉ[=ñ}ä×:Tô„+Ã×ÄÜgÞ“À{mð*v2í÷ê½ô§PwâÒ¡Š˜wž‡úßÜR>ÿ²ÔùBškÿGš}½Ãý¬ªoþ{Õβüe@ÁJ˜ƒÎ¶r3†¨pà¸NòyÝsq!Ž·=ð-|û»NÚøˆs¾j†D 4þÇàTÉ¡ÒÃGÊOX¦’íAå›a9¬~ÊíÄWÂÁx‹nÁ-O ž(©”äyæ)Ë{þH³iàû~d‚r™çIÙ¨é6½àÄ"NðÒµÝi™Fþò”îÉàY+æ‰;(ë¯=£+”òÄ ƒuPj2µ´žÎ®þ㳋ˆ“…ö¿( ÑÇtoCûíh/ —Évª|jWˆ³`ÃÊHšJ%'\'oþ)ž¿“Ó îZ5Úÿ ±ñ!ëëcjkëË[,p;_üYZ}p£ür½SÓ§˜ô©+OD7´Å4í¬ ΞRø^μ|øKw¡T¼M!YËM ¦ôgCÕ—=3Õ.0@`lxaPöà·’±@h`CYXY|KPSÚÍi7a ?mD‰ƒ!üzR[zQ:ìx6H)z©È€ò=tL¯)i>MGp—: èn‰Äé×oÓ†ð›„Ëbœ!«•°·$<ÐQõÖ›º®TŠX‹îqÇeZÎè±jøp=¿‰Ææk²uû.êÓÏ».>mn`g‡âNm-0}ÚÕŽÌÿ=”˸7ü|½ÞÑWŸñÇîìàܾŠúI¬Ï ý ~ ׳œ—DËÃ$§jL Óqú2Ü2·n‚Ó…Y]í”Ù%.Ò°Õ£Ìj-—{¨Ӏ^ŸfÔ!¹jÂâAåY‰%¬>2¶›\´¸ò• €]–‡Þ&ËÕÂÜ!˜¯ü-Ï9ÐmÊL ®_`qLwïœøçcUN /cÁcRðÂUŠÕÂô¬ÂÌÝ,£ ÍZËO;ž¢B¾h+Ý_šÉ‘·q5m~ý ‹²s¾‰§jQS†‚Ô]i`صëµ1êÈ)[¨}õĆÞþ”£$¹€ ñ±›`5¸h¹Ìh1pq±YÙêCFÎî¨P£ é¯ Ô²ØÇJÔʶòyjr´q¶òMk "h ¶§%P A’&=‰*F"`¥ò Uë¨',U{…ÃÅ݃#WG­ž3\v€Á”bÎͬ,‚þ`DÕæÐØ@?iýEñ&œ¿´ïËkÔ9Eæœ+ÖOÆVN¹+bœž‹põÿ‹YÏ2y¼ª.´.XŒ„¤Ä¤DbGÔêïᨯŠs+ò¡ÞÅ^—//Éŵåyù¬ØÛnyhŸ^9}zCŸ—¤ÞȾtÐl6™22M99‡.öé#e)ÌÎ7ïÎÌÈ7÷é+¾þæDËÏoÎÿ ”{Q endstream endobj 708 0 obj <> stream xÚÍX tSå–>i ‚R‚§#žSP±ˆ`EEu®À ò,Ж÷-}BÛôMÛ¤MójÒ6ÉNÒ¼š¤ï„¶i›úKË[±PZ¸:à•{AtTp®:ŠÎzOg1Ú‚àÕæ:³¦]ë¬6óïýí½¿ïÛ‡GŒEðxxùœUs‚W§‹ñ‹IÁ!éiÁ± ‰1)ÛƒÓ·G$l Ž _².k[!Äá·åvIƒ§±ºã7²hŽ„…ñÜ´¼ÙÔrA¾$ ;T2§¯sÉÜSšLùú òêfsyÔ’ž¼2iV–8që~Éú3Øf4¢'O¢÷(´U°˜Û«/)‘‚,h}Ûöƒt;¸ë+|ÕΓøÜ (ì8ï*²ðÑ´Eh´X·¶r\,'âr8÷âih:ó|ÐÓÔnßéÙáÀÕ3ZLŽƒ(œ²ì2–íÒå€j'¤Ä9ûx>Þ»}…?p©ZèÒ€x-Øìøî`+­@²”­Åf; ¤ÛÕ.5ä3ÜdAhA™Ç]g~‚&ïæÔL¥‡íá}ÕÏg=¿Fwý¨ž*-#˜Iw¾YE‹@“¤/–t‰*E>7–{†›1¯gɦ ö»÷rlnÏÝwñ·T"T‹Výc[Õ'š8ìCcªß¬ïë9¼Èýõbp#é5º"r=Úþ&=ðÊxÏnCÂÿ;F'@Rn’èj³`%{¶w®˜Î=>ƒ[òÜÁy_ClÂiÜH¦s]hþw¦2 ÷îÊHb†kHÌY‰Íþ£{HÊO]á³…]±»bé™ÅMÑ$årÔ2?Yˆ1$Xx ŽQ¬RÅå©“äv€ $&eÅO´7ª+·¾ûÐvkÛyÄQT•(À«‚4ÏÖî8ÖA6pë\ÒÔbÙN“9ÕªÊúúÚ=4†‡†VxØéþ¾Áõ»RˆxìòÒ PÿÖþnÌ{'í/©­lôO›íããÕ}w´›0¯¨32f®2W_Û­¾¬ÁVW{l½äŸ#<›é7 11%õÔ}ï È… ~¢×é•AJ{A íW•ÉÑ…RfÅmöØÛ Æê–Ú–®Óç13£rXµ'‹“'i !—ÜÖ¸ãàµÝh¦™®üP?ü0 M>~àíÀ±á¹;´ŒY8µÌàe ÁÕêj?ƒ~G•51’o'ÔoŸÄÍ,².0` °·6\ëÅÆÎQœÍÀNešF’:ŸÚ"K(Á}_{ôz+zº” ö²‰Bw'U$JåTæ6µ´øZèÛíÈ~ã*ñ J<‰£Ú!¼ÆŽ5˜J+¡<è@jWxÈzìøFŽƒ¥²þôÞSG¬7æä1 ÕJJ¤³…”¾(…{pC>ä•íqÚ0ÄþŠ‹Óò£ŽÈÚèËpîBÍ20=:0çg¢šÆþ?¹†K|àÌ L[’»E¾Q²tº]µ ì²6Ìf7ÀýK¼+í»ÊÝn¯ïè‰ÎžÃ@ÖØÀÄhŠA}ÛÚ6ä펢×CtLRܺeRibþ·ì3ÿónhk£Ñ~m£Ú‹ÏäÂZìíJ´2̬l‹dµÓûÁÓê¨ñt”÷ ÛUâ¦i¾Ò3 |“wý$µÞJ­Š@[¬É¢ò—HbÒÿ¾äÄÄV,†‚a›Ýµ^W}Õžò3CÇóŸ;9uXJýó3pù^ççÊÚÚ­ôØ´-u›ú܆š(ƒÍÉI¿×Jjކ Ζ¦Jâä«q·šÓ`öTŸ¯9„ÍT¤)Gºä5î¥+Òc¬´ÔÒN¨²Zkö¢FÆÉuŒNwÓá®Þs@öÀÆ24iºÂåœë~¿÷‹cèߦ†A`‡@`/߉,€-arÉožø0T5•×u_¸øëõÑÛk~LdÁZ¶[,¼u V£Ù`A±]·§KmÔÒJØ‘(MW4eîÙò·¸Ú½âW ~E­/Y¡'娩íxk0µb›Ý¦mΈYˆߟ¹ÉkðùÊrÑgU`ègb? c' .w$ӯÎMÒå±øšä¿£ã0Wa9‹*p¾ÝHxoÐP+KT╪xˆ«}åþör}jRzÞ¹„æôÆàÍ9Ž&½ÃgCÏ á“W«cíé–6è"ëÜý—h/´«ñ¢u&<¥%¿®ªÁÙÕÛ¹Œ;k ÿtVÖX´_Õ­‚HR”ñòt¬5K1Ã~Ü•›žµºwÇÐÓhBÿø•CãäCĸú˜&Ùôê¼¼-q¯­Ã õ•#–ÿ_ÐaêcA•wR!H™—í(dxv,Y Ê-)ˆçž§æýø ãÒ$6µÆý÷##ô@¨4=ÛWqœÏöþÚÆñ>ÚG-3¦X‡ºBŒW)LYêE\7UœºB¹$=-KVTáþVúZ?«ï·¹ÍåXÐ'û¢ç$r!EwºÍçýrHе™XÐU²øÌ%™ aùBoÚ[ô1ØÝ\×\ÙUTs·ñ½µˆðPh_ùq4æ_ù¬Š/Ü£ð¥egegÓ ·j,šºL““IúV®”{ Ry¸•†Þ–O¼ï›+-÷OÊHq†ó(uŽ.ÛîÝè1ªü¨÷íx»®‡JYœ FBù;ñÈZgÉ›U’œ“›mY@>É=’íñ›s¥÷êÑν@6ÕdÇáЛ ·g‡RÒå¹/‡á-s'ä—7ÛìõPA6äZäYY¹Éñof÷Сµ£ª¹vÝ!eßAÿPë'¾ÏLóýÆ÷5?„“¾>¸ðaŸ× ¿biƒÅˆKtWiPš´¸°5¿MQ{ÀWçr%p nÛäY‡¯—£Õà3;½PIº¥Ž<:Ьˆ/ ß°/émæ|þ]ý×äȤžqxÓã8Ã;ÅÎà³Kü¨+@ëG]["ÏÛ´%)Ä µŠí©.E©›35ë­6w}c#z=Nè=xì$.UÑp‡+’×É‹¥ª2Iƒ¢2Þ›FÏZu6Ɖ3;mž¦úv¨…jµGÕZà€ (È/TJ¥Ü|î%*> stream xÚ]}LwÇGÛ»*“žEŒzwS–½•¦àŒ°@Šd0y‘©q!¥´–¶ô "¶†-+üjWËÀ€nG[‡7G7ÌX™˜es‰l8|ÙK20$Æ1H~·‰kÃügÏ“|’çû$ß|óÅ€T 0 K)(,)Ê?øòëÅe\Öš™V¦?ÚhÑÚb¿Â& lÆ„-q-éÊqt³ìçþ–m,'Å8ÿLŒ¿¬‹1/ ‰Kd†±Øjæ•|®¾ÅV{Ôhg34šíiiQf±Õ-lžš-ÒêÌ\ó1s-«µÖ°Eêb5[Â5GÅZöÎÊVëZ‹å l…þ { ¼ ¬œÝ[öÆýå/ªÿ÷é]ÂÙê´0É.ÑFC¹€P`=P‚<@Ä HA Ѓ̇ÍÅ9Ÿø$ŽÊ½&¼%ÜSFVzbUƒ¼p‰ÿ¶CÎY‰PžÌ •ûì0#\#BžzºZWyLI‚ð›¹ÒMÜNm4á#Þßàht‡#nò?³ûèñò#^1¾\¼PµŒ’¨Ð€ö*-¸»¹ýóø;í9°’âmB‰çú®ðçz7Þœº1 çH”ðü1‰¦ö‹ò]šŒÃŸ½Ýê‹0”éÚ!è¤/N?ø$^ݵ“ÛòrÄxq­¨“S(¿Ó; |5DÓÇÓH‚"U" *~\Ì^:¼äY ,Që€à@9Jø`ßÌs³á·à]’R¹î¦Omc_-Í1 ¶‡ú.ÒpØÜÛè¹2yÇû$)Åxp¦=•Vm[kÅÞQòîñÎöNx’l{ž§ÇðÙ±Ò­ 5Ä¤× •tÌí7Ž“Ÿ^àj2÷’ý‚¹žsèT‹ÅGÎ?¦ŸöŽ6ð‚-ZüíŸ$‚e*ùg…J¢v5Ñ'agç©6ñöŠ.Å„.gFweÓvŽR½(Õ-ãíD¶»g˜y@äòJÑ#¿ “­ºž Û#HâçƒaÅ'÷‘ufzˆªzþPNZ*ˆê­MøejˆGª1Mænó¾º@K0üaˆ†8ß蜀~H^¿^“ÅXˆRw¡»Àº]ï(…&’ríø³ázŽŽ |NR»}ú þ HvÿúÞ#~­¤B/e5èÞ¬º|•†ßݼ…4>2±) ä÷!®»+€ÓñÒ N¾Æ/‡ò>~&!ì‰Ïç9Ý5%—‡½}!ï¿÷´ÏwF¾–ÞQ´!•jI²þ_ß¾Ž| endstream endobj 587 0 obj <> stream xÚå\mo9’þ¾¿‚ß6Áál’Å×Åb€L2s¸»™Mn2»8 ÉEî$šµ-¯$ç2ÿþªXÕÅn:=>܇݅a‰î&Ÿ*ÖËÃ"[²O^iåSPð-)“ ¾geé=kØöÉ*—°›‹x-à¯UÑx|qŒÏN%ºŸ½ÊÑ”>F‡¨Œñ4‘­£+Y«‚ÖÊ8K £Œ7€ ´S&Djxe" Ú*“2 7Êj¼tTÖXj ®´ F+ ¨U@,ë ]±Ø@ÉÁ€²4© “²!Ò¯l2¨T0˜3]I tB}LV`"âX4ƒ¥ØÐAK¨¡5 HN°€ ±Ø'áT*ÙÑp´Y#بœ!}lRÎ&ê“•jàœK„”óqÀ(Ñ6€Œ²À)—I é5™íèMi ‰qbÊÓ-pV¡3 ×ÓÚõðME^‹x?8r3jï-Ù •Òôv¤WDO¢¢.Ð ÞõÇ’¹½'b_‚4Ô7¢1Œ ؈„‹}Ð(üƒ k<š #žñ-Ú‘·†Î½ˆj (K¨aÈ¿! * ŽÎQ Œ ƒb¢÷PèÈHö6è­0XƒÇFDx“6Ê!Š1vÎx¨\Òd Œ¥¤Ñ‰†Â—´3|h“L!†DÓ•ÀSÐa}FÀް8íä)Ä0Þ¥Bð8<àœ,ÆI¢&¬=ÂÎÉCb£ ã­Œó¶è¿”1{,†GÖUÅC?ãp F¹bU¶hQ ØÇâ}ú#ƒ£[Fa”ax ˜Lþ²è‚ìñÅâ”sÉœ@. (AeƒÃFAÆÌO„ŒúäD±‘Šy@·(~4¦^À ÁVÄ™áM£'(´ !PBQ GØHý'Dñƒ-䆀íPžÔò×ý-´6æ 1EÉÆÂÈ݆ÑA¦É¤A"«db 7leôBˆ¨ ‰Ã~Zèj 21¦ÈðÔB@tb,Êòº¡Þ€~Ãn(#D[47d¨’ØÊÅBØÂ¸!Î@1L(# µ°7`Zc‹,„iIŒö 6S ¡ t6ÑLiáÌ¡¤ ‹%Á(ÉG‰‰â](ÿ6–D¤VÂÊZKùˆãÑÄ8‚ük3‘ù4‘ ¥hÔ<`Œ¢É.ä°˜”@~ƒbI².KÒÌ¡XWdI Y¶¨ŸÇ4™®yŠüD B Nña u–»‘l358ŒÈ“tɨ³£µ2ñ-ÝuDØBí! Ç9c+UFZSÐ’–¨ cQ#A›牠Õ ôBN”6±,Aä½HkP ‹´ö`ä#bªHk[¤øI”mŠŽÇtúã/Þ®‡'ß}¹Û ûÍövØ«ÍaØ­®Vû§—ÏðþëËÛþ¼½|ñÌÓo¾¹|µÚ ·‡²¨jõÓå«Ýðÿpå? _e5Æ?¾ùæw³àëííÕfíÕõ0‘`û|-!=$ᮌ‹~;lÖÓY@_F¨eäVÆË;2Ëå¨Õns¸ ۉח* ˜„ÿ@»¿Ý#°_©«A]¯öjKR×ef­ß—“2Ðõæv˜±¾ïûÍnOpPà~Xíš^>ßÞ£¤G™¸ÜdFÿ€ÌFÔûJ’K•$™…H GIà+IN×V4­Ø×8b¸]oVj?Z›ÅÚf†ÔêfÀ´háÒ +™míúØŸ1˜V﯇:÷¡¡†ö}h̵ýa·ÚÜN̰êƒ×©œC|ûþ—a}Ø|ž(þ¾]'qŽ8n{=Å]÷qëÄÍéƒ|Ömq¯ú¸±ÆÍ}Ü«Íþîzõk‹<ô‘+" ½D?òvè½-ð‡>p®ÈÛ6˜î¡Š†#ª$:FÙýúp¿+¬uÀhžÐ®«©] F¼Irü0Á®V‡í{lßß®œn -R­˜#s€Z攬ök$õ3©Ãí¹Èýêz3•èúÈúÃLÊ;s¢ÅQÝB‹¢îH‹ÐqRßÛ“¥#T,L%’ÎؘÇÚ–’x¾½Ú|Àµw½y‹eÚ-/eÈÆëú¹•ÌÜ!œÙ3Ô‚&™ýl¿ùx[‹Ù 7ŒÛ4ÖÉg&É÷“`ÿï¶;Aoó ¢ø¡NAcºðûÍÍÝ4V]\S'¡±]Ü›Õa‡Ö꺅~߇654|Zaòíïî‡ýabêu_ÊDço¯·»ê<§5댽 l¬s#WËêŽëÛПÔkÜ£ã¨ftÁAÃãâèà ¢˜Ë×ð± +Ïm«¨×}Ø:¥LêÂ"CÝ_¯ÚE›>ð™ó×€û!äm_Fºv’ºßow¢ÛS@±¬yÓ{è‹É "‹Â·à Ö…Ó8¹ª¢UüÈÑjõlÛDëÄ+/D赺ÙâëDž¯³#ÖÙáæWŽ3:¯ë`:l„ÿy_,º¿ÿ°ùeÂ×þl·SÞ“·$ÿË÷eqs9e3ÜÜmÕ÷&·WXcs»Ûmhk…ž-¶®&¬›®F·Ÿ‡Ýþ”Ü´¨¯WWÃmYÕ×XÛ¯±´§mÞšjÑÊŽ3²y¶.1¬_ ÈÌœW]ýZER_‘‰¾¿¿åM$A~ÖŸVêWõi»kË_G’­kë¿I<£f ¬Ú¶×´‹>UŠêùë¿´Zœ­‚ö,ŽÒ2Ð/ß>{ý] û~V¯ÉËæe2^¾øöy+bÝQsèe"~üõõýÐʸêËxHsvþlyîsíöš@àŒ°\Çíu´Ý^ßW‹+SX9 R¯ïp³×j3t9å,`Â)/*ãïjVaiªÜ8¬h1þquøôj·ýØH gk&œMi’OÿŽ;ëU©ä?·å¸¬»Ûm±®¿)‰ûªõ[03xZP3ø‡ H¯w‡ÍͶ/p2£ï~A&ºæµ³gÅÖOª¨š,` Y@M0S?a€l×›Z&ëN€nŒÔa!{F• •rÆpÇŸ†ýö~·Æá4ýù×»á?'ûeF›ªÃþMÉ’wíhYp¿>œëVÿ†+'ÅÅââCq¥ ˜Qg˜bFVÌïŠ)YqN(N[Å4£˜ §¯bS+¶ŒbW)ŽŶSlŒŒÂJ+>qSŽQ£8FqŒâÅ1 oŸí)WPÞÊ›…†òEø»Ëg··Ûþ< d÷¾ñ¬g âU|4«¸‚S¼•W|@¨ø(Oñ©[c}9Úúºõùl­²~Íîãè½$“;Ápýçæjÿ†µáí«2â%{Œ~>²¢GtònäÝÊû8ÞÉ»—÷ ï’=ZÒG Þ(О<#xFðD#coÌÆ1%$¤‘Œ4œ’]í忳Mþs.W–÷Ýo çp i)4'q]±}MUv) {}†ì|Á·®ƒ#¤ az¶U¾„ž’2ÌK½Á~6n³€Ð¬2ͦSñ]s†f*¾cNï#tÌéÓb„Îúz¼,‡~'fÓ·º4T..7Áþv—?²Ä…¬¢¯ÆÂýFÈßû›0·Œ™ØµWjfÛ…,ÏfeŒ‹üxiY„;ÐAðºAH'"7²^Y°LëšY:Ëz±Œ|n8ÿÐdÛÙ²ãe5É="j¤(0²ÖYÉEÓ˜É'´xB G‘úÃ1˜æ‘»Î€ÆPÙvÂb„·å¼a~VÛ…V›‡¬zª1|MôR)zL–jXëŽ:=ªõ®Uç1ØQç"Ú½³h?GÖÀR@sJC+å‚f¢do…ð¡Ålªg•´f) ÕËè^fWk¥L³&/KÜ:*¬ÔŽVjE+µ ¨Ææ÷T\¹µæ²ÝÔIíì|c®‹Þ3È HiÞˆr°T”kJ°d¢¤87KM®GM©¥&×PSšçÏîÓ¤  _¸ MÕrò ÜÂ:‘<>ƒ»ÁøPi¾äî)pòí\\!-F8{B˜†`—bIArU8Fƒ”Yü¬ˆ“¦–ÅBó4ªþ&HõbÀ¼0|åPyb!="¤Î9y†ñÑdª<ç-A·˜NÍ3;ˆÍ£¥ú«&5`\ ØYÁºåðáTCš^êM/7ÚéÍž(@Š‹ÃÂ(¨)Õ#$ÿˆ(‡Ç Ša Ì3ÆÞ¨o-Æñ!ÃøˆB2ŒŸd<¼üq¸Ú¬¾Ý~yCbè£Ù1[}¾V‡íîÉ«Ÿ‡ÿVÿ³9|RŸPÎn7|Pw«õ_QÜÓËW»íÕýzØ=¹ú¼¹»úpóE½}bµÑ«¼·OŸ2Èf{ûbuž¼øÞ Úš@_¶ôñ_4ü^ëß?ey/ï†Ûgkê̸ü~sxWfõãöj¸üó~xy /­í/ÿ´º¡Žp‰t9^>}þ‡,q´c1ÎóÕau½ýX>.’¹fÙ÷ÓßùŸpã«¶ôUmwAß7‘>\Rù®¦/Ó^xÆOÔÊ1ûkÍ1E×à"÷4ÄŠÜêçRÂ^Üöe$š™Ú¤w¹j½¿(_S.¨üW õ“QÇž¨c´V9KÚ;í°=ÞÁ>šÿ±¼1ÇHa[ÅÅ;:H3¶ºê¢&›•W}|è'Øpôlðú" ]“xŸþE¾ º :\¸ãw¦I%Ç–3ß]¢˜á¶MãnÔÇZ‹¨Ö±þKKÿÓ;îK/èÿAp¤ŽWÿYŠíÞQÕ¢/è+áZ|ÄG…¥G"_Õ¯§«ßã®&¸\ì1Ã`žWÐ?|'À×ãÉkêíÀS¾Víº-ˆ'íp—zA|‰…i‰A‰³u‘¢ù4šþ•ÂYPRø&5Žb ©A!%~ÅÉ”kr§!·GBYòk+ŒQLEÿ(ӊѬÐf(‹K Qlr8MêB“Ôƒ1è³íÙ¹/×ÊXnG!Sš­à{–i´-äOfíQA{T°šjqÎÍÇmÐÅ Çb(¾jOÓNÅtbþcoî…NÊZÂf¯ï²âÜæW–ü÷ƒÌ+wôm&Lr¸š©­Âf àvD¹ŽYÏB­îU_“çƒÎ;žÿȰ‡×ÓÒ)”¥ú\Á ¯í½ÇüDKÙÁH'¼S‹ èf^ërà̰åZ V4#£‹–0™Âµì‰èµ÷«åµþI!_Ð?¡¡Å4%Cù-9KÔ–K)ƒs± %aŒ.oYŸ ,ц( qhú<èü,è qg.¤)Fÿ¹Ä•âÇ3ä«ã|³'Þ’Qñ$ØEÒÚZv.^Ø“Je†ôE/þ²×?ÛZ £ÊûÕE‘–5&ÒÇäH,¨b,—5ÂAñ^ˆ©Z¸Ç«ýrÒ]~O±V§kü÷骔é¦O™-÷«ð¤H/±¥Œ£IZ)SYftú+ãê"ýHôáè÷Æã¥7E ˜N¹õФ`N_ÿßfNè4OU‰él/¾¾´ÓéËK`!½Ç½6LìˆÕ"n`‹ :*mfHÔQ²Öúß|¦d’¿ ÿÇèVŠT™&\^¾C¢á¥ Ê´XȬqí«¨-BåÝP͘ I.ÿÝ®¨&W3½ò• Qzœúò}çs©×€ìÔ«ÜÓò.¯';dg–R[µM@8ùFÇ{d»w¿û_tÕHƒ endstream endobj 712 0 obj <> stream xÚ­x \WÖoµ ]%âÊÂ&j5¸âŽÑ‰5qÅ=¢¸/Ø ²/ ¢"Í*ݧš]‘MdiÓnÝL51q‹1.“ÆOÇL‚:‘è)r™oÞmÀloÞ̼÷¾_AýúÞ{öÿùŸ+cìì™Læ¼tö’e3fX¸hiD˜oøØ7F͈Ýdûf¢Ô—‘úɤþ]$Q.õ¶kÛB,ýÃúÙEÚ÷gYôkôͼìi{ßêe{O¡/çÄØÉdŠuÁÑoŒöð?3bK\TP@àV×7<<ÆEß“\ýâ\gŒvï»1$"6:$ÈÕ7|“ëüÑ‹F»¾Kÿäêîê·9Ð7Ôß5ÂßuÙæU®Ë½g/õv³tñr/ïa£¯ì/Q­zö’õcFÉ<ºN·Ÿ'[È®`|…í]®0ß2ež0-TÉ &– cz0=™×'†gz3ãÌôa”Œ ó:3€È b3C˜¡Ìpf3ŠÍŒa<˜±ÌÌ8f<3™ÁÌdf1³Of3—™ÇÌg0 ™EÌ»ÌbÆ‹YÂ,e¼™eÌrf³’YͬaÖ2VæSæ*sù’y§ #cì˜(æ¾,L¦‘Utqì2¿Ëùù'v`ßßި諨d°F®·ƒ»ßuJ׸®—8‡Ý&w«udïtOî1¥GiÏa=+{uë•úóšŸÓ§F^àÓzOé#ˆÂ^¡Ù9ÌùvŸé}Z”Ó••.¬KÑë^yýN_}¿Ñý2ûóhê!B áŠXÙUÿŽ—ãviš`Ž2¯Ã!nWr²á+Ó…s'9z=drÆ„ÜÔøÁˆË<Ó²sõU¦c"&9ÿç‹©4©{ ®ÀA²ûÒ´Ò5áJðYï [‚7T4ˆÕ°¿('G;5x‘·OR²N{¸¤üĬÂï¡‹MÚ¾¸G«=Xñg«úô tlýÚäÔÒ‚›Zø2é[g«§4š%ÓÓìù…{È g,Ú£Cîq1ÌPš¸;"9¾—Uôa‘¿j:T~ô¬ÏÇCˆ‚Œ "ÝUC¦«o’Ÿ=Õl¹á ¨¢ÏP®å¬žø3Îf+³t*rëßöÀYeùØ$ÇË8KxLšÆ°=þ!›¨a€:ã¢~¿.œ®Ý´)8ÔÏÏz옩ö„Øã]ÞÐ0 &é©IVŽŽr©¯ ?¦ I’2|Ô F»žŠÄ1_¢Ù»%1B º ¶4ªrg1`\ƒK9§ Ÿ^Ï.ƒ:¸°«p‚q¼ïr‚À*eX/Åʨ{¹ël%ý¥;lµBÄé ˆ¶·]]¢xš²ŽpmeD¥fq…Á¾s7:à%ti´ÊΡ zao¹dÀÁW‘“âµ+19e*쎌QÐ|ë†òo®6Â.èàúQûá F®°î*¯5—¾/‚%´44óøûM™¥À=®Ÿ6SSWÌôS“0«LL-Äq;¤‰l§wŽCÞ»‡½-f§t#]°Ë^t;†]è'7žh¤<œ#ÀQß“1UÿUõé¸ÍÝšy‘¨ˆÝ$¯·VÛy°ú½*µ<ñðºlˉ«ÜCð SAØžõ!~‘A‘ÚÍÚ]¬n65RhŽíÈ‚â)ÚÁÀµ>àFU ÌËX{Øj,ª…îDxµŸÈ§Ló ÷ól9öÄI·ÿòLõÊǨ°J>ÔÉ~(3¢L.U9[‡£¢Ù:\šÎVê2£Ä8jaÂ.ÒܶX©Æ#4ëdj¶Úð”ææax UZŽøá:€¿°å…/ðµ…Çqêñ`ÓßÐ~€©%Ö ™÷1•¼“†b½€=&> ýŰ6YÂá0–·c'WAp¼œ©€à³µ%§OB9·òD€tHLãø+Mëw®ÑxÃRX›·n_Š!Ý\$îP‘zv;hˆ¹`ÐçäæšëïÓ€Á¨)3a é©ò‡……Aq¼+ÓTp¼LÅ71æÈ*ÿ°à¸uãoOÀn"ï: G7?Ä^ªW6 1A‡C¶0ò„Gª2 ‘ç¦!ôÐuøMÒMŒ…°ñM®Š…O3.:SfiSÀ6.rOœ6VÜVµ¢Üð¢ÏíöªÛÊn¡½,:#pÙY¹{󰦵‹RoÓEQeh¡-î0´ØšMÁˆRæ•I Rjƒ¼õn»“¶j§B}¦ÀVêâr¶ŠBgEzõ½¶qmo²m¤èÄ<>–jùÿ ¥‰•’Û¾ËKÐë À¥²ÊU”A™^0s¿á€~?Øt[ø]CÂÑÖ^æönòÖrüNÀ@"âE¢)*%$]‰n¡+t€HÜ p×L\í´L=•ÖïÂÚÍ­½‘öW TŸfÜ;qµþÚõÊóp>QWûY’¿†ÚÄ1íÌ¡è(6u$6ØD®dFÞ'“Ķ‘¥©ü’23¼„jj›áÛ,NþîþsqsžÈ‘¨° U “æ¨:l!+Ðí„9ØÔl’öš.`?L8û%a?þ²¦µ:I0BÑ.q7…]rªß²ä ³!àwÿt¡SîÇýŸlùÓŒN@CîAb_2å/À=¯ÁžTdþ(€m¦C<ý®n.ßܪ ëT°##ÕF^?8ÎÃCãŸ-WÌg/›¯ÃÇpskÃŽ_ª±ÌÎ ‹9"’Ólܱ~•ÆTT]}à°x Jƒ‹×Ù<6Ç•ç+1¡¹cxŠénU”–´þù±°/9c·¸t)ºÝi«Cc"(©Hù,ùqjSÊM˜°¯ÙtÎpÏÜ#‹Ä6{õ hs/%b-íîý©Ó½G°{êÊ"k‚¨KæÒǯ1ˆãOÞÕ•÷cþ£B©“F ËtãÉd‘tE3vSà„ŒI^*:¢P¬ÇŠ+£çqÙ…GèõÈòH.§üþºè‘U’þµJ÷²ôëPÈ5šÎ7‹Íð`])铺àJ!£\…^l dï¢8‘®KJT¯QF•®>6œ"çÀwÆ™ æš×ÆŸ^y(µeë³mùÚ²˜‚ÝÕ´Ë«c¦;qUM2Ñ퇌Xàb }«ŠxQb—R$fƒ^ŸkÌË3TV~¼þîîO(³ñ¸òâ…ª£/çÇ´ºZe­WÚ«2T;’iUÎj¯J¶ŒÂé!MZ¼’ø¶’P)Ñþ;«"D;‚¶áp‡(ºæ‹ÕïfŒ5êŠÁ¥rÁXŠû¥Ÿ”Y™¹7mEÖeÀ}&Õ´¥JêorªF¹1ó'¥£e… xq¡ž2­rCÙÇ3.7oâ6Á·.®ª¦ºô¨%)ûw䙌”rWOlž¤ÚÈR$·È=‹ý\õ%|`9PÏñ«üAý7±QQše*²» £&Ä…¬ñ3щà/ÈÔ>ÙËÑ(¥š$®1Ø„ËmCd:ò®Ò7-`ÿQ(§æïxÁºí~”UŸ¢Se²½š½ ›Tm³°ûJö•h\qVsœ:O|q«ˆ#m“>°4Ú?tíºÄ˜þ§âË8ÌfùAï:½ßBWöÂÏSõÒSÍR³ì(þæØ8h Õ0_‰âNÐéÒR¶o™;††Ú päÉózìƒ}²ÏkÓT:­V—ž¾{Dq¾‡wT–-h¸KجåÄs6¥¦,é÷ýŠck‘ËÛ-Üb•¨…Vu£“MZuö|Û¨Ì.Jc*Ibyëol#>ì¶’ ÕžTö€!ãˆ+øôMtQ…†’c&n%ËO{iÇWù¾»jw]Ò ¿¢‚ø°ìhí¹óYåêãLlA–-ŽJ5£w5¾mrª¥‚‡<†Çü—Ò6jhÑ.Hµšžº;rþ¼˜µô¤Á:ì{N…güOåYP©‚š”[ë|-ÞKl\áÍÁĉ¸>÷À8âä‹}ª1è"$…á„þX©¹¤î½2+F# Àj*Z¶²‰i¿"Àh“ í["'—Þ’þ.œ°Ìò òÍ„Òè_‡ý[´cTSd® …?žû +éöœm¹RlóÀ ËÒîJLÚ1ÜÆº¸ƒeæ¢úÎ!‚¬¯Ã7ߪÃu‡jï.}3^dÝå9F²Hƒ„Џ:_Q ~11qïÄøUl¢39E¶eoÏVAh®Ÿ%hÇö¸@u¹éNŽ¢‰N]´–r^—çâB|ëÞ™["ü×’ê¨üµ `DÁHÓ«³ŽÒÔÏÑ圊OºNko'Ä‚FŸ±'CSH&c¨~ÌÏÍ3~.V6R þ Þ›_‘ž¬‚=©{´Z2Ÿ QJj–×ýÑËü´7p|i|Þéê×Ùâü¢‚²ýØx(ùiÙÉtô§+4‰±gm{* WÚ÷h¡,¿zŸ’3[¸í[ø#xŒFºUÅòŸÿïýíEØ?ä5íq«2[Y£Lɲ¡ã—¿úóàŽ„y¼é4mNC`Ýœ!;ïÏ)Z#`墘µ4yº(øz2õW$ºöO“‡¿Š²;§/)Û6õŸ¤OG~ý‹)]õmùlü}>Ï„EAÓ:Túî?PéÆ¿ÎhZP¸Ý$³á`¾í²¯ #ì;æ)K&ŒHœIŸÇ£p,NxðDâ˜+LŠæqìzW´l‰¹ìøÉýVøÌ[öE€•°Öf YaÅÁ´Y#ÌN-Ôœ,ÚÄzu41qôCÒWô‚U±C¸Ó,ßüÛæüS–±•Ûê£ll ÿËopmhÎdðÌU (Ž©ËBÚ;Yï#§šŠwù¼Qª:Ò¼S‡Î~–e»ýú–¬¬žÒvÅÄÀÆ5uó(iþ‰ Ÿ½‰JÕQhÌ9ýG|þ¨™ŽWß)^»ƒ[°ø<öÅ!n8ÿÕÉ·ÖSa²KØe»õ}Ží×ïH¬Ð¸òÐZq yÆûÒ¨É4Y'þ1j¿‡ùù,ïnʦT¸«¯IÙqœŸiGe¥iŸívVvª‰|½û×\®‘½Š;¯Ê¥a¨àT¤)v¿ßá ¬å¹ òçÁ)îòC(QY³ QúÝ9¶©¼¾}ÛÁÞRé ²+iOº&%-=¢Ø?‹¶Í02ˆ³ `¯mµiUi¦ÔL8žt< |¹·= F\ ‹#šSèô;^7öq3Àâƒ%Ê“g€,gñµ|Ú©Æ–öc­èëô#Ê|-ØÝÂ7KØKhò]ÉÎ ] Ÿ•‹xYÉ ôöeuîkÝÝÓ¹`š¿wH­ÂíîÖë7ëÏÝ|ÅÚø×Yf+‘NÎ`Çò&âù«ƒW±ïø¼;uڞʳ"¯ÄX¾ú·ß&²C? )VÀM°Þáôo)øiiS# ·Ê¤+Ò`Á6`kÁþD'd¶ª,-…2Ц%’®$WI';ï–££%óýü½cv†Á˜éØ]êÖûÖ4E endstream endobj 715 0 obj <> stream xÚ¥Xy|TÕÙ¾“ÀpÙ‘:zGqnÑ…‚X-‚Š ²ÂÖ=²g2™É2ûrgÞÙ÷É>Ù3Ù KØ$h €€"b«­ZE¬ÚVëw&Þ|íw&”Ön¿ïŸûûerï9ïû¼Ïû¼Ï9bÌ‚Ãáââ¶lZ¿ññµëÖ%ˆÒW‹2…I æÏMI+ÌLÈ¿ñ\è!"$à„èˆPTdhæÁÕ5‘‰›±—µ|ß>¤ûAp$÷„Ÿ3§†Ÿ‘Óð“ø~ÌÈ™NŒãp¸§¥–mÉ)™¢„aZV“óæÏ_¸<'Wš/LKE=‰ÿš;?E%J£–Í‹Z“´7§¨`¯0*!;9jͼuó¢Öçá…QÑ9ÙQ‰)é ™©Q9©Q›Râ¢6o\»1jeì«›c6þ|ÞO§q÷¯ësò³2q¤S¦÷ÏŽy1bg5g-g3ÇIˆH™˜?FApô„ÃS‰ÉÄCÄ4‚&&fsˆÇ‰¹Ä<âibñ,±ŒXN¼D¼L¬$V«‰5Ä+ÄZb±žx•ˆ!6‰MÄfb ±•ØFl'vOà•‰1Ä—œÆˆ{"žŒ(‹¸91rwä_ÇtŒ]Ì7nœlÜé/š0gâ‚IĤ¶É/Nn›5åìTÑ´ÓÎݳiúâé-?ë¼7ïÞ³<ß}sïë¾?úþßS‰ü™ü¨@íSþÆ9–7¨ Íoç<óǦ¯ßŽ ñО«ÃÖ íPa,7”«Žˆ{s:ãÖ~}`7Ù-6›ËérÙ<6·É}†æ½=%¤Õh5ZÀå.‡Ïb7ÛÁ>µ[fIu%¸Ó@*£ÚXÆ”êËT2µB®)#U¥L1H`Kð•Ö‰ª$qzÖ¶=ÂØ² Z±¡Š Õ%¬ÎnJ8’÷\ƒË_ÔE®‘ð$ËÒ–¬…DȪ+íPWék!MöG³ïDMïúÆ`MÐeÑQ5iU)Îk‰©Š!ÉÑä’Sþ±ÝtžÝ*F Ðò"Nèm4‹çV#P‚QÏ”¯‘Æ$™Ë4ÖÐðqv6#‚²”»{¬å¶:wØÉª2W©@yFµp'û*•7Û¨Û1ÿYào+h?IŽÂÑ|-¡lµømY)w È1ªÒÙG†M1rÐ¥y¥ ¼Uf‹Õå;уæµåöékàìë«ovíîÎ9PWWÑVÙå;‡?À/~­ ¿žâôœEÍoF†Þ =ΫƒTÀJ¸ìãl$»ˆ¸ðôŠÏÐÄG“Ñ<*áhæ!Ep}]ÐA³›Øûy°³h‘0.9fs^2Û“º.ÓÐêý°óô·ý@~ì\Ic2ð…ðçêw‘hS?¯¥ >;»  ;»¾ ¥¥¾¾E0ú»TŒ6ÇA«‘(ÞÄ»¿/9£(?'·&¯]àŸÕí²˜Í&;˜e4¼˜þjF†B`HMoóüö7h<^*rü⣊ZSÄÆ&·‰ á‡×î°‡ïQ¹CÈ4ï±~J¡Së@r§Î£ …ðiÌ`Òãryè)!†•Š¿/ŵÊæ|« ÃhÙ?þu¥“‡¤p©<XöJôÅ÷ÏS6ØFPþ!dáWmS؆_C~JæÀqãïT* *›Ö¯ X5ŒeTü‘%-`Ÿ#þÂcsÚÀKNRApèÅ"ÎPJ Ï£™`€ƒiY?4–2Ô€µJ@¯Ñ*Ù? ÿŽJZ•\ÏÈ* ©µéœ‚&Zšqv2m@Ú}PíQ™4´È\à„ðÚ=N¿Ãk‚·I"+×,ö³3@IfmeŠÊ”P¤ðöÃAË~üò9¦¯à…šÝŒt0ÜA)“ ê%@¾VE£!.z“qÂWt*ºÊ[øË'Ø)öQîYdruš-xÜkµ1ñôFö=^ô“sØ v· ZkRš8qUͶª·Q…6pÿPýâÌ͈s}× ƒCsq¬" Ï-Ç9jAg0¨UÙ¢—^ÞðòƵÅ[\0óšOÃ@-zúhü™wn¿äŸO?Ï’4$1FŒ’ÒVÌð瓲*Ì2£Q¡Xñ<¥òïz’-` Ù<¶”]„&°4—þ~ÝÛøó+?K¸+?Yð-o0ˆÚ;8C»ð8ÜE©R%@¤Âÿà~ z€ëÄ„ =GÝRŠÂ„ž<´çÒZÔ‚|XÏäû˜…RÉñGNh¤ëÀ †zÆÁ@h ƒš7OÌY¹e+äÁwÉ ‹× È}­m¹îbévùÊuý;? oÀ·¾FãCi”³ÝìzÈ ÏèÖ-–_fšÊ~H™ ®&0Iì/uRÙ&#³ØHJÔ£óÆÁ¡{™±8²špŸà‹¡K–Ö ^Àòg«íD3)[µÉât!ê¡üþÖÖöŽ·l|O¸BUa]Ÿæ½WÍ pz߉ éþ•%6;=‡ŸR](ÊÑŒe×Ê1¸PZÈJ»³›vãa7žÆ>Æ>:÷õÕïÓ5pÜ:øŽ3¡3ãè݆–BKyÛØ8 ¥ÅüøM‰%9@n+{} ÇÛ°Vžîëîò¼‘–Æ‚§5êÂÝ1'8*J=À92ˆ—#C Q'ï³-o/ì‚Äì¬Ì+è$5Â:,SçÔF…¤$€ò£fR•P'^Ä~@É·éK |¢ÝlS¦¢Ÿ£GìTv /cÕ®4l…MWh¨†êŠs”=f—çØù¾òF »š²^¡!&ƒ'M GÕ}ÒŠ½yǵÞgÿ•ÈвÿáÙµ­ <´ê%Ñ,ûUrmî±Aö×|Ùq68ðúÁ×±ÄôÈü¹%XÏËÊJJ Å ! ªÕ-Mõ½Çvv¿Ä>ÈòÙYì̧–|‹f}ü7l¼/ÕñN¹´8À9|U¶ÿ³ÝžS}ÜFƒ×,?Cös[àŠùxí¥VÛið“‡Rö¿ŒÏ Ïa—Ï>½ä«Ñµw`Ã;‹} ‰Ü}è‰oÂiiʆ7=÷° êk¡Ü š}½*Àé¿Þº:64wxW]¢@k¥YÑZ1£,`§“/ß–Üjúwé0-S<+ðõ¸%U‡-®.('ë¤^I^vaÊîCû¯Cï骞¶suh²É1ˆ.QW¹5î[Âþ+®ç”Ñà9e­õ¿c÷ºª+Ëkñh„ji¼^™¥¤¨J^ÝØè £ó»õþþj ôp€óîåH4¼Š‡"C1xÄÛÀ1ÊV%äjôiÒîôÆ$ÌC.fkûHô™˜Ëôi8rÄí1© –Ò«„Ñ3/ SŽ«ÕåiÄZT¡¨Î-Ü+MJì.úƒÝ—ß/$[B÷ñv°µy¢üB _,Í”fc"—žè¥áh šÐôZÓ±ƒ½€¼àV‡]&²>ÜsK£¿»Cdtu°ŸèþÐyÀèJK·ì}i•w ®zW â`š§ÈóI– ÖÂŽÌÔ]ï£wþÛ™"vöð»ú‘ÎÕè\‚ ¨ðÚüÕ¿¦ŸÚö€­Žo¶;ÛñqÞ|££)P¬>äA0†Í),§`½Z¤Ã‚KîìL?r³=ê ã§^5ü}×9¿<8‰º‡ÆòjÊ*D¹¹y¹q}]k]«À5,þqBÒµëãî$d÷×Ù÷ÊÛfw“³ÆæÇÓ¢oo÷¶¹)ìl•Ò‹m½Lf[EÓÍÞV|4uVÂ^ı^©ÎÛÍ’%{”y² “;;ÒâÀf»ÂU\ôa¸? YFb“Ý@Ùç"C3qpÕe•¢,QV‘¿¤®©©±IÀžçÙj«19йmvìím]Øù:«Î>ƒ’¿JŸ€M#£ÐÏOI^Ø»´x\J]­Ü#5#¤Èϧ%õ\‚Ïû¾×—,ÇB…?õŽVøàÅSŸG†dwkkÑ2Q\<™§ ŸÖ­uÖ k%&·ίmyÚ¬jk««?Úøà1°cd6z ؃iÍF0š äF• r²Ä#iÂôß×*jß-È]êå‹…)ÉI)¥ß†žýï˜áƒr—Ýksõ¡uö†æÃX}·žQä9(Șޤx–6UºyFŒgNÂJE`ˆ‡3ÔüýÜÄàþÊ‚6? õ&›­=zï"’xÚ•5©Ôሦ3ŒÂ ~ì¡ô#‚vh¨©ìªêñ†7û>btH M wËÐõ×-Õ' Hí–¥ŸºÅèc:rêók÷Úòal¥X¤HhÝ »@’¬’JÓe1øTp›{&{ òš£Ø3T”«S0÷…lë¶„bJµ"|Ê’úUå/T95&³÷ˆ½ÆÑ–ò§ÊƒýŸ}dŸ+5ƒ†|MŽ:+‡%)eªQ«ÊЩ„·¿‚½ÁÙ†t”Å×&!Îíæ‹M`¹E[TzÅß5_DÜ’%£@ ïGdã­»(Z™±qûÝ@ô@ˆ‹{z— n¥ýFbp×HÚJi‰°,ô?‘vG–ñÿI{ÝvöÞ’=*‘1Ìž»ôãúáGSØu¼¢FÞ·+Î/À¾ööaöáè‹+>G|ô  GËöñ ¹èá”5é6 w¹'>ø> ÇÑöÚñß ”7yªuÇ«áA…¢vK=1²vèéËáŽëäÝŒ½ð‚`ìHËHVžÜS›z»ÜBÙ«?YîJ¸Ü#=ÏŽÞ@©… nS9jj›ÞI7AËÈ¥LGøRf䀠„²mØláy{=ãhðe7§¿$"Ñ=èQô=â*„+vd¤¹Zö‘=lÙ­ï1G9ššš«Ê;ƒ-ŽJ {ëÓc~l+Þˆ>⣯ûp­ÿ€åcUh2¯sokœ` Äo—ä¨ûÒÚvþgÉü‹"š­h†µª ÝGY}ÍGêNGK#žr ³t…7"2MÍu]áÚ½ÛO(ý×Pô»GpX7"CQè<è’4Ƚ¹ÍÙ¶xWš3É}dKý™k‚8®)OÎ1B!Yæ* ê+÷õíÙÿK¥ÎŽÀsWJ[´'”'°‰Ì=ÃN”Áó êïÑ5´B3YWâçe‰wÇ$]EOïC“ûÂ!gÜÀôáÑÖ"º¦¿ôá“+£S왵¥@¤XékǺcvX+¯ £ÔÍÛ†BJ/äv¡‡±ðÛ|9›Ì.¤æ†o0$r|x¢¯q—³Ýúb¬—›{RNþyàVç-)Ü|«óˆ7=ƒ‘¡Þ»%¯l£deÂí­ÿííñRö$eÔ'-^äVe_7 o4Ðø¶·õÎ |"õîAØðIOw® #„Šlmij´xl'Ÿx;ÿ¤àtõU<‰yÿþê·[­¸9oºÑý7#Cé!’w2¯Bš_W(™MëQÔùò LXÏJÙñq¢Îx£éÝàGŽÊ:›[þt°®åölÎWæj¤ñ,)Û{H–¸Vr-@Ÿ#·X?Cð]G a.·Ü@±{¼30T`Ð4Q+ ðÑ)¹¤­£gxu ‡({cÝK`ƒz¨•åèŠò¡`„Œ¶ªÞ1~¡`¤o‘‹ò/lvc×5+–åå‡Ã£`1›]ß]hÀÖ¡ºSµ†ÌâU©lTɺô„x<ÀE ö5ص˜cM…ÎÒ¬ü¼½»Ž ÃxÉb÷¦v%ùÍâ5„uå‹UOa[qàÚ;¥/ÝóúñÈ1ZS%”hU¥:S/-ZLífWéK÷¬X ü8Å!\ÛÕg;®Uì·z°aø©ÚÞerò•yIÒLi,ì$Ÿ<—uZ°:*››e[åÛ“¶ä S²wá#ÃnKñ¾ ðßëv¹}¸>Á\«R”Q²}Û¡Ô³‚oà›ÏšÑØpñ/M:¯¸è oÀy‘Z‰A·émêÑ+EhÍ+’ (©]ìúJ­b¬LRP1'Oµ4tΞìêúâóÀQ°’nŽVŒA§ÊÚ!.)€——VJêŠk2€\ºkžXgѺh˜mf{õáS&'ÔBµ¦NÝ[êÁ~=mÏ3Ë%% ž¡V®JÅ'‘ä`6Û=u­MmPnUCv¥¸ª3êëSègMô”Â@h¹ÇãCY®`˜M9“Æ;&M€I'Lf‹Åe®ð›ÊM“&5˜:Ìf“O$»yÒäÿk) endstream endobj 717 0 obj <> stream xÚW Pç¶îa™nQi;Á,=x“—DŸKb4JŒe‰+û¾Ã°Œìƒl3s˜a“E@``ØdPA%bT ƈš{1͘Ä5/š¿ñç%÷5y•º7Uoþ©SÕݧÎ~¾s~ebB‰D¢¹›Ü7:;º.Üèâåmg»È-($1ÒOjø¸Lx™x‘ 1¬…y&SNøàK¦ÊÇØôeŠmšm 3fJÝže N„Ìš²¤h‘HÌÌHHÏ^™à·5l±­í’51±ÉÒ°ÐëŶ¶ö‹ºÂÚ?ÙÚÉÆzƒ_@DŒ,>"ÌÚ/:Ðzƒ‹õ‡12ò2Ìz~L´µP¨_d°uL°µGÐVkO÷÷ÜÜ­×»¹znrÃæß ÿãŇ1Ò(¿Hbâ,eB½FÍ-¤lÍVQ;(/ÊW@…PaT¤±ÔhaÉ)(ššF™QæÔlÊ’b©9G=G=OYQs©¨)žz‡z—r¤œ¨µ”3µr¡>¤\©M”;åAyRÛ¨¿Q5Ô]ÑçF‹Œ Œ®o1Öš¼hÒcjfú•8Lס Bd:V\$ü&ì㲑­éÔqq6¶5Õ‰Õ}š¦’òâÒ3°tO\§¡8»D®‰Sû3møŽ •Š^ª¸ìô\ùH?'ƒä”eW*Û”‡©¸¿m*ŒŠ£Z9H·â‰!)vÐ ¡‰­4qtÚÈK‰zÔ¯¿¨OÔ¢j­eÿxÏh‘î¡êØ{Ç'#„W9=½@!‡e±ê¹‘ô€n—TYy9*…Çïõ¾eTazÙÑÃ#ç/Ã9f u|­‹£Ç<üŠ×t.¶]`åí žÌ’kïñ×áôÁîŽ1×Ó©Gà2ŒžTß *Þù Ü ìÖoÂìVl”‰a¬*Ç3N`Ó<óƆ2`Š 5%’?‰G©D~?ÒppEŽfx SW4ségYÀäæççJH…(k“ïÎ?‰í^Œ×âYØ2#” `r ó‹ù2¸yþ4b‡Q2†o˜§éqIBçzÑ9™H0í5ž " êvA:ÛQ‡x/ÔÊd°‹Vt¾b–Wpàë夽éå °I—|[>·Hqž…s¥Ãµhú?öè Î%×Î/s‡Õ°‘!šA/tëÏ’8ÅþÝXXöœ>‚¶S”wK„St#¨x—ì!˜HºŽÈù¸‰™ª¢C™v|D¤¸Só-ô’ó-t*žHúòΗhÝÃzËcï>„ ö±à‰œ8©8/*Ç'+-'ûý'à,~ô?Èñ#Ãp.Û]ÅØÔñ­ÅîÇ@SÓYÑ×”ÜÊg¯jøl¸û0W®°ŸÁÛÛÞñpÁ8ÜJ.'ßã³N†èµ\D zµ™=øT'B6·ˆ×·Œ/´šƒk¯¼R­ùÔ£köŸ,|mµëêpí®V}¶õØNHãõGÏUvÓw"ÑN™ÊÍq>Q;ÂRU¶*^™Ùªd1ò¨á‰¯u¯¿´.ÚGâ 5¡§;óôZèaºbë¢ã#Ò}l¿‰ÅÄÄOü“È¢ôB" íñ‹ÆBZÁé_v@§òhÊÎÄ#SaV‘¨v ¢”;òI‘â>ÍÇÐOÎqèS0ú$ÚQYÞ%ù–^«ç°BŒÂ4Ó'î"£» ÇÑ6-z~ü½»1-IZÌòؽ¤ïþûâ¾cçÌ"÷âÐô÷1ÅïßÔPm¡Y¦¾.·#§€ÖÌ •ÅŠ¢ ;bKžB¶{»ÌÖˆ ¯’õÙš|® Û3? ²S%ø( Ù{ùPk ‹Ë«»‡¿†AçUš\¬„m ®ñ~ñÁq^ànÇSN3¬ƒƒF¥Q•ÓQ£klLÑ…§‡æxIØz«¥c b~ºXþ‰?Â߯'zu–ý7‘ã͘›ìÉ/‡ØÅ·±1¿‚·Êv04*F³º†øFèÏÕ†1iàÙ˜¦­nÛs`ÄçÈr<¿ˆ9‡ë³ö{ {ÿø²’Øp°¶¥„D¹zå%ÀFˆÉ­J„«°¹Ò~ÿ&_  wÙ [a»¡ŽUIÂ/ÛIÚÖ’Jž´âp¾[€²2¿– b8ö'#@S½g´²¢¤ø T’hˆ± ^l‡_ Çø¯¹Yà=0‡Ëø!NhN”6ì½qèSô"r³ÚcÀ²zæ‰×“3u¢þcõÇ☡Xßá K~8¨W}jÙ½—º~LpûÖâ“¶¯¯t´á!YíÝ¿³<³[ªKÙ½Ôæ3ó~r~ˆLÿ…_‹~âÀ-p‡k(žuÕÊ«-?Ô0g>ë¿øÅÙ-køú)ŽstزbéšOÇy8Õ~öú š¹Êªe×`|øÔ”®[ß4Œêà²ÓõÒPͺÉÞ?N̺Æ!-¦Ï/æ=`{²¯·¿w‚80xö?ß@&üèëo8ÅDÐ8ã¯Í| xªc÷3‡J[kôñU‰©Q»‡ý¯#Y —P„ä­[Üò°ö<û¼<¼ r4¹ŽÉë»›õTv’\t„Õx3,CUDn/ðàF^‚G(æ‘èÆ#cä!Xp­ñÑÑññÑÑñ­­­<¾bòoïžâ4šÛ‹lzEŸL.2 ôý§(=u[ü •«$Ââ* ãLÈ·4~êqÚïˆ-Ü?Eè'6`Mïã7{EȬוb ×»àñ›wzñË¿¦Ñf˜Nì Ãã4ürÀ_ß\ðŒAà!O™è’Öà†;×”ÒÂË =+7W¥TªH»ro¡ÚK.~ZñlêåæÉ—¯Æf®Þ;÷57:F®MÑ£ê›G´–í_¢€±/tl† ûŽûDêNo–æÊÃóñh'M€ä@HwàmÕ;€Y±nçûQu)M-ûêš$P‘×áUÐÜy´œ ÁÑ“‹%ÁôVÅ{ŠQaÒ-àðò•w¤£ü9è­dX§Â€f¿A`êÏìýZ‚ßâØ‚7ׄyo÷ï<ÆÃ‰þq´¢Ø¨£q#rê¸Õ­íG[HÿØ£é\Y(â)ó•¹Ñ62ƒùÈþ ZŠ–]ë?.Ù£ªÎEnd0qûd-Mu5mçWxÏ~ SdϹ7Ÿ€û íȼÌà:öo@n§7T7 hÈl°DöÿrXZ.$ ó¹šÌö@RŸ\?†År¿? :6ëÖ½+m.)#-9œ€Ude^æšá Ìš{¤>Í~ºÂCgúÐÖ–Z6Ç _È)ˆ(LÒC;BCMݘ>E-0ß})îÔniC×þ®¢}%Ÿ—”€F%ÏÏ“C&“R™Y]V[ÒÀ“m‚â V‘&ÍÎLˆ f Üo@sA{•ŽaÏÊK+Zzù^O £©éœçÚmo¼¶nè8=݇4Ìiñ dKŸ• ™Ö¦úÈ~$zdyý—•çX‚çôôûùE$‚1ÍžÄÖrÓHú³=¹Û%XK{ËÁ™¤‘‘¦:•ûUsY+áלÐ&‹‘Æ6ĵí¯kÑñ¿ËžÙ–ÈøÛJ‰\g9–¿Òì~Õ ÷BiÎvÉTÍr5¦Ï–rƒYr­%2CA†?{tr˜ØB‚¨jc; 7@Ù•^^·™lm>®)Aéß:–{“Y±Ó7Æ…yH³_ãyèÀõè0Õ …é3[ÐFš=úóÅOÎŽ–{ºñ8ý/¹þ3aå_¨YþgkÙV¡ý/Mý?óÆþŸæµþ•jÒµ:ÁV+jGmã†} œCs^„gàÙ °ÏÆÜÏ Ñ44ãÁ]2—“«Mx&ú$zûDo#…èS; =g  Àpã¡æÁú^8›|›|a3ú/ŸÜgž9÷èÜ£¬µ@ ³¹öÈV_Þ BœÓ}ddpEòŸ\kzazsß; Íο×ÿÝeÃÔµJ¡’eBSŸ¦Ý§«h7”Š4¼V]+Ì«µì8‚ü$a—£)4‡ƒãQm™áí¥~¥îåΕpŠélê»Á##(²SGì.7l•PT+y@×@‰œÏ#+]F¦"?kw¾"¨ÅÒÈ®häì.Ðê˜æÄö¸–ÜKé û…6ÿZ*¬a¶†¬â—AÈÉ]וªB²Ðg@N2¹àÑ)SÎAAAm­š˜½¯ößaU=ÓôÀç—ž]J½-CÙz´Qfùó˜T‡^бÑu4‹;)õ £‚‚a¢†GzôŠ¿bÈë©Xµ"Êú|&‘fõ×q«Ïü>³ëbËų$F3 ýC6¾B,+„V!T’ªb7y’ÁЊ_@ŽVm==G›ô]}UƒŒžŽSF©â >Rg›µ®W–f@*¤feä庬²Zõ`w‰{ñ\¨ªÚSWÀ°•zSŠ$ØùôÎw Tƒ®÷0gµÓ”;ÝvlÞ¤L2¬êMj}Aü¨°"ú59•PÚÖŽ3—.¿nU*¯L…\ؽ;-VŰ ’vJÓ Tmʹ‰ZaM Š./ÖŠy3ói%æf`>]o66][ .P« JÔjÍss]Ÿ¦X]¬ÑhŠŠ Ígðö+í ¿ßæü uÇ+ endstream endobj 719 0 obj <> stream xÚ]}L[UÆÏíÇí¥íØ ^Æ6¸½N¢˜A-03ÔeÃn¢ 6aqY òÕwëX»ŠÐ2*Þ®ëZKh@³€ºnaŠf nà‚&ËÈ‚Á©[ÔdŠ#ÑEƒœÛ/‰ü¡ï“ürÎy“ç<… DQTb^~™©Ä´åù¡ÑÜ”^R]{´Ál]Ùm“˜L‰œLÔËE^±ô¹˜¤¼u?ªLFý·Â{kWøãºš$È'ãMQ´Æ|ØáÜ]ÝÐlÎ4[w ‡ÖúÚºf>ÓhÌJO—ø_éàM¾À\uP°9XÏ››^æ …¾H°Kõ|ªÐÄWV×™jx¡†/«.ç÷”>SRÊ畼°§¸ôQÃÿC¯Þ‹k£¹!JA¡TÊ(Û*»P R£8tˆEŒ QHŠÑ»T ÕIÍÊÊeçq$vY~´ñ#¸]k§¢7C,œt÷’ÅhF¢kÐ nINpÙÉâ_‰nt0íAà¢Vú„ôD?Ã.Ý ññœ2v™z3+‹8l÷_µSLËñŸä8 '{¼m§I2fëqàÇa ÞtåRßi¯üŒ¿+Ðε@EyÇq²‘ðÉ¢Ò|—äã¤-L0 aýŒ±Gr¾†},Ì·`º«÷ýlüÆ!Åò¸;õRÀî°ódÃYòˆ†$•ïokëéN¦ÓçqpùJðu¼ó#8°–‰]–érm$ª¡ÆæðÛsr±ϲ°èš¶\?ðÓo•‰‡ýé­B­©;^„g}?uéé›Ç&aîô_þmtÖ7ÓLf˜…bÈp–Ú6ç¶Z rl ®)¸ 0Ÿ÷^úýVè œƒ™Wá2ȼ?‡ˆx6r]jç¼-K"uª4OxT/N¨†»½‡¸Êª½GÒ€±¨†áøt˜Y ©j<Î4®ÎBùîÀEIߨgÕì[|oá×HüäBáüœ0¯ã<¶öØ;*œÇ^ëØ -À\o±ýFú6\›úì*üÄ`Í#_“8NWL´Û™ûÞw÷ ½×A¯³LT€“{ç‹g>æ—ñíÛôði'Q“5$ž$$êNtƒ•õôj#¼>"Z¥J³_ÊEÎf#Š{Uƒ´qmÐÓÓÞJf—ª-ø|¶Ôŵƒk¶Ð8ŇS<ÊH³j‡§wTÿ*'Â’¢Rkwõc!¢9µ¢LÐÆ´jÐj"ê¯4#Þ•ñû½'‚SZ툯Øw*à;á÷ŸÒ®á/XŸ¢sd,?ðU»î endstream endobj 721 0 obj <> stream xÚ­”{PSwÇïM ^µº›Ù°®÷ÆÇjmW×ÚŽÚºS¥j‹€P,¢g€H ä}ÃÉ‹„-=],;ò†L\V|hÝ*QAQM™¸z:ac|!ÿ_ĉ“Ü8•@~–Ê͔đ2¶o&&µ‰‹0 _8:bó؈ýý™é¸Ž 3·.Àqœ—[¥Ö¯]½fÍ‹)’JEuqÑ™p-û¶j× óÂÍ«…©âC¥’:ii±P\qX˜º:}µ0CRÇ. Ÿ•Tó ŽˆË …’BaVÁ^áîÌ-¢Lá6ÑŽÝ;3W®þ^åO-fHªËÅe¬ÂÄ ø&N!Vœ(g%ÎÃæ`K°¥Ø2l–ŠmÇÒ°t,Û½‰Íå°Å$`+01ÎÁ{9¯pþÂmJ˜•0‘XÈkœ±˜¢sá+–9qñÏ—‹òÆø1I¨²TZUQ©éèêî%ÿ—‚vD¸¨ÔÆOz*ïH¤R” u@BªJ”žn¢Íf0:—ÁéýÓ'h&û'wá: Šr¢ñ=uø¤#È÷«¡Ì‚æVúØ+ñot¨ÙY 0h æŸSã‚ý›ó5E´¦¹±ê ÚÚä%[¡Åv>„0퀠Om1Rµ–Z„ àò{?Dêáu2U e®R r°¨ÚH7 [[-Äïy vaoƒ ÅDf>cå¡CèÓDVàâÂBVൊEñÉä‡ÜÉzT‡Ӯ¬ð "ô·ÛpŸ¸µù:³€d¾æ)ØU^höB¦æfZÍü|*&Иu›€7²Ÿ}ÐNÅgðÐz4Í|Hå£{ü—Ö¬a~J2/ð®!º5f±€d´Œ÷Uh{>•ÉÜæ¯|~ “D2›xZ+ à—Õem¹‰ú(÷EZ&5÷篽V\Å/Mp'‡&×ó-vk 8§Á¡'õ@Ó:í–ß ´¾=·™™@0JFÍ”2õÌf$XŒ^¤ÐÏØÛ»sùÑó¾sÐB´ìZ²ÌFºIÌÌÂß0I@üRx­¢`Àƒ^F\4ÿÖ½¯‡?-¸¸üW¨Lrh$Ô>°“>°ÚíkŠoË0æ`$p?^EKî"øØ—èÎ—ÜøG“søg÷uí#‹!­¡ô×Z˜+!ñ*¯î Ÿx)SùråK{ ™†Z{Ïx`€+ü5•²ñˆäy N¾ç;6ø~Í·ºßE×_ðŽz!È:¨žZËDYöv›'àMöy\V öéŒfm¤ëµ ¨#dªPoϱãÓ.Õj"q*‚øŸã÷oDorÑèd?ÔÐ&«ª–×´5„»{»úÈàT ß­³é§ñèiìåüüC@46:z(èrvøúûï úﶆ½ýО|áÐñ½Ï‰¡Zë4¹X0–›;2q¦§¿Û(¡@Ó¬Ò”WnT¾Á"ØbTYSç ]zx }Ó²bC÷X†ñÏëRN Ù87þ+,¨ JË«$Uò€¼«¯;ÒMŠ™ë|›×ê‚1–÷Ö®ÅéOŽõ€Åæ ôݽD§WUÂÞÍ>«¦f ”9©ÐJ»ÙÒ°÷@+Ñ¥ðÕVTV— U¿ÃFœá>”ÄÞ&g嫘&‚F"¨à4ï@Kÿ Â`R¨s«^Ï¢ÊbAø,^GØbgÛÉŸ.ëØë Åb^ߨåÓCçÀ^Ú¥Ù­‡}ì}Ö´+C=}¡1éà›ä.ÈΉv‰ª›ô/X¬6?›ã0µ6’&(£eæL“ Æ¬i¡òƒ÷´$ЬOÌ’©÷&%èÙüz¿*HÆÀ5`÷ŸE"Á˜á9ˆÀF³†V›UìÚyêà»äIèî÷»†Ú®²ŽgIo\²D™L:Ÿç¢V¶ºÚ©ÖÒ Í´QA7)wÉÅE@Hõá. ‚6͇¨ø¥§D.×Ò:V]òwÕ=3¥˜XÐ@¤–^ G ó„:¢+l‹²3f`üîcóá“n8ƹßPÿ—u™t¸ ˆ;LAØr ŸB3àmâVö` ¹DEÒuw¶wdÃ~ÈhÈJÑ_ÝÉ…#P][_,ÍÕìeÏ}bA»³Û{¾ãÊI º[ªk(Påº’Ú ‚Bæ9“ÒP ¦dYPç#; àuzm-®˜£3üg-à¶lî–.«Ûêˆ^?uG] †ŽÖì§@j5(g’ÊÆz}9`ÿe°„£ÑógO}Ä`gm.Ybf†|Ÿ¦ŠÖƒœ•Œ|õûsôƒÏþLü'Ó`âñï€Y/>ü`6@vNE~,o`/Aµ¬¡Œ…‘ý#Áøþ:xòu @ýt{W4‘À”ζ>ÀŽÁ n<ôt-u¯‹vï¢D:IÁÑ–°ÿíZ$ð_<>rÐ ª¼&óa0=î™P¬}ä´¶B2 Jd‡k.eóÙ±Žg0ó%ÓÅQ^°:lÞðÇWÏ]â­ ¤ˆ‚ºÆýºÒbf‘@µ»H|LPµþïÌÕýç«FÉK0ô»ŽPÎÙ9vÀãWÑü5·¶3žâöxPe'œ•%IšéLšI³#³Ægw[­«×rÔÑâ³&%õ;Üa‹Õâ°ù-ޤ9ÿ9Îx* endstream endobj 723 0 obj <> stream xÚ]mHSaÇŸ»—»«.kÎ…•ÞÝJFlÌ©E\…©©µ)Y9[Ú¶;6k¬,]$æž­‘¯Q‰&M›N­[ôa…/h ªYôFoQQÊsë ¶Q}éøÁ9ÎÿÏÀ0,¥p{ÑΊ¼õ»Šµ´EoݤÐÖš›õöØ-›]ØTŒMã±$Ÿ• {¸p*Nÿú)L|–ÄøvyŒ¯VĨ‰‚NB Ã+Í GÕJ•jã6Úæ²×™6Pj•jƒBe.Uí¢4JªP_sˆv:ÕQz«*T+©Ú]ÖQ™´•ª®=¨7)ÚH•ÕVPåºZ•¯--ß­[§üß„¶[ôfuŸÅ HA2!`@ö€{˜›B¡Ä%^Íêïaû˜ˆC7|Ö·’©¥Ãs!9{[l…² (š aà83D,úDõðD:YeÀ'üsp2Úsp¢•øûì=úˆÀ;{ŒêúÆgÇP©Ìˆ·w46ŸjÙ C‚+ÅQòÑÁw‘áàª`ðF>"„>áVs²¬MŠŠ›-Ý—¯ôŽ_:1r€Ï^{‰ùÉ­›åp{¥fGçæ,)n·ÇÍ›ÿÑ=2~‰Ükóß¾óvB"qäÈ¥ËÌë×¶Ò7Í.­í$t{š=°‘8Ö /’Óøë)mÇ+Ø«‘Û`úÙýÓŒÿB£Žz›å¨>ñtHŠ2¿|úBþ IÖìÄXð’Ï΢Ãű%¢Øn']°íôÉ&îë⾊l‰fÜ”MZ 8Rû‘ºUÈXEÙ°'$.ÊadÜŽ†Ð’0ñH?»í<¢»:úq2^PF‹ãÚÅñPœÀÄ¿Lñú¼g¼¾v¯¯cF,¾ê»î÷úÛ½þN_—x™WoŒ–i)ù7ƒc@ã endstream endobj 725 0 obj <> stream xÚµy\TWÚþ‘¹WET®£Cbî{¬ØcbA¢ØX°¡¨eè]†>3ï C¯Ò.R, "vbM4Ѱ1ê1Ö˜FÌz.9ìîÿÌ€&ùân~ÿýöóÊøÎ=çyÛó>ïADõîM‰D"éúÕ«¹¬¿b¥“Ÿ›ïì‰Nîž!r·@ãÏf oRÂ0‘ðV/3d½»Vã£ÃÌë~é2‹¢DšAÆO³ä“új ñs!ùyÅŠ2‰Ä›åÁ{¦N²µ¾ÈÏ?"p—§W°ÍT[Ûi'’ÏÙ6Û#lN²qpÛáíä½ËÆÍw§Ã¤•“lVù…‘oî²ëçk³ÝÝËMîaãça³ÆÝÅf­ób'g{§Õkß™ô?á¾üÿ*¿@79Á5h h5š+š`¹€ZD-î½ÜÜ©·[yÿvê)õõœú…ÞE…Q>Mõ¡úRý)Kj5DYQ,5˜’PC¨¡””²¦Þ Þ¤†S#Énc¨±Ô;Ô8j5‘šDM¦l©)Ô4j:5ƒšIÍ¢’s> SK({j)µŒr –S+©UÔjÊ‘úr¢œ©5ÔZjµžr¡6P©‹Ô5êu“ºK-îE‰¨ÞTžh¸èl¯V³áf±f§Ì¾0û¥÷¼Þ-æ}Ì£ÅcÄñ´ý#³ŽyÐ'±Ï™¾óû6÷›Û³ÅÏý?è,—[>à5 eàì/²²µªbßdÏœ'™")b5äC5C¿•n’[ûZÿò†ë?¼öæ×Ãò†={kÉ[-\°lŽì¦MñÛÓß.>qø´ßòŸ¢‡÷C…aˆBkìÚe8² D–ì§ÈEp’T†WzqѬˆS©TjTi™2ø¤úâñ£ZmJ ¤2©‰é [;Ó[,¯pk¬+ª¬”¡ÍCþø.ëø¯ÞVþþíPSCÑZD‰Ðj=Z¤7C^Â=É•€F7¯pÿ"ÿ:.ruÙ™Z­Vc¦MŒ“Á2ŸU›\U*¥’˜¤´„ô¬{AAóŸ½h)\^0çÑ §ÕzÑ‹ë7¯rÝLhÂÓËpL&ô¢ñ¸HµÑ:k•ZQÀ`KÔKüüi]+WõA;“åÃø”ï)«,)2´®9úþl±Ö†Ãæsä·ðô,ãät³¶Hs šaŸºEÅôì¾@3èæ´èí2\úÚu–ÿ4“m£Bxô™>oâQ®Þª©½áj€aOûÃÑö CcûÒ«hµµíÝ#Œ”ð´—Òpÿ©œ>^"…J¹nº”¥¤Û|ݼ<ã³°9â¶ æÖƒc§àÃöµiÚs¡Ã‹Ë‡7Î Ññgå?²0‚KAa»ž>A¾>åAÕÕååÕäÕ^¢û¡8"ô—½a¢Va„™°¹S.ÉIã"!Y‘ƒ;þ1OªŒS%C2³7'!“+]¶.uü2Oš’©ÕŽéÞ#Dßi¥jGyíf‚ú\W•í^Ùút~ù‡°æmï½$é=˜ÚqMsšg~y >†6Cããê«iÛÌŒ ¬„Y±Ž¡X¼ 6|`Q^82=íÐ ×àVÎÙâW ká\+š”½æÂŠžÓIq6ðWHhÂnš  á½éIÊœ™pŽÖ«µÜÊå“AŒœ.‚‹p¦‚éÊ£=”1“8o¹¸>å&ÏC¨W¾Üì6êxÞÁ‹N>GÞÍ„íh±„äot¼ctdbÜ#µ½DüýSô.~ñ4tX#zÂm<Ósmm74%e–VÔW‡–ʹ$PB²ºüú•š3ÀtÔMX"ƒQóÞÝ´/Ç¥ ¨ ˜Xqÿ ·õ¯0 æ‡K¤|‘ȉü‘èrk¡v£y¸¿¤m|É“º#ŸÃ§ÌÍ™FŒ˜ë8wixUUIIǾEÕåïâ*/·s·`Ùfø$n t—»z©|U {ÿt Jñ§ŽWƒ‚‰Î€}\³øþÅð`{OY8ŒKum«O2è¡–ÙXâè³×mê“%ˆAƒž<ìà^º½Á !Ä×ÛÌ„p4[Â6ÒÅN*I­Ž‹ÂwyHå¨bq²ÂŽ ‘‹/§|é 7ಒáCh;evƒ¬^ÀK0ˆbó—N@¢ïÆßEëõhèÝš0«çüþ>ÿóC–S0l– þ3¾Ç"nlŒôòdк:ŽOâAn<ÈÍLÔ%É’!.isø–x7Ø®[ŠbS•„蘈Ý#ÃÍ4+¢"@‘DZOg@Š.-³ºñxù)`^žä)#Y²ÒÏÕßÍ-|'8ÂÒ† 6†=CAº*½¸*·ž)ôõ‹ÙaûÅddƱ6v¨ÿOß¡²—àý£¯ôw"Ñ{dû¤ž|%Ï'k¸k†#¹\ hL)bNß@6ÈYš™ Z(yÉ †ÎzÑõãÈpÜŒ¸`޾]p<°@‘á[“~¢üóp‡y:ñì”á³í&sàžçYî»/<-ù#inŽ«`6óöÏKI]0ßýQÜ|Ô!Å«·ìÆ–_H}Š‚+¡ùø³ƒŸÜ¼´v1WÚ5X2çýMs¦/¼t—ƒ'.|V¬æJËöžð†U¯Ð4<þJï1ò7ÆÈÄIžØ>b¿³#Øþ*AåØâ“)˜5‰ØÉ>̹ÏáÐéÂ&&„ÆJl¶Í‰ ]À~F'f²ËPÌ€CLED±Ÿ_x„ϲÓÛ" y¤È›ôX²p÷ˆ‰„F7‚7éo)Â'ω’Õ'æÖN«\¢‹ÍóЭ‚mÌ+¶FÞ¯[è/©*'”äã[H([_Åá/z¿†ÆÍzñ<©ÌM¼°)LÔ<„ßC¯Ef¬‡uÒÒ¤\eF$D‚*11{w=’Æìöš§&„x …ø¹RÊÓNš=<A¦6U›ÚŒ$R”#>ƒÇëb5D Yû8CQGSNÁ1B€R”-Á 1ê‹nk÷‘ý°¾s"/jí’*Í:íÐ^IdFÝ ê¸x<[, ÌL¼ì4ÚjÃ黲ïág»rÆÊ;¾"†_àÛy4‹·B6Ÿ<,6  0°ÿPtN!8ýÄxrÀ"<Ÿìc#Þ¬J¯•¡¢'ôw9ò2*ôψ‘¿ÃMBñâZmz3‡Þ³Ç(d †µ؆1ˆýPˆy× y™ø¦Vá!ë*¢=TŠy\°\¸'f)PÔ¶–@hæÑ1xˆ(a`꤅MÓëýñuñÑ”KÄ—‡àÔVô¦m“IËB*šõ}(þ6Û{f7¸™ ïqÜ”ÚÎJŒ&‚Þ¹sFÑ7Za}Ѽ0Òäzû‡fÉ(™È;¥‚ˆ­0¼Ry ý$%ÆC¶‚Æ–xDÏÆŽ-¨¡; Ü…mhžŽ\dOáF½¡eŸ½W0ÙY Cvô!]êÕ_3òjyñ ºLÀùáƒéy*ÂþB)ݠ;ɕñbW¥3l!3¸¬e´ÉO8 _FQÿ~MWéo|yŽøòœƒ£Ä—=g XQ™ÞÇp4º'E«Ñ‚Ëç/iöi¬yÚW¹b4êoƒ:?Â!^Ÿ”€ÛñE)úôiø|Y"s´e(2÷‚ÂÚw'Dò=’rŽBIº“&µg_÷«„oLÅ¢…­0QÛÓ»kE0Ð ºœG\ /öRÚÂfåëÁUbË_öl8Š¿Î Ëî˜ý2ä51ÇsÄ¡ 8¸ëŠ â‹ÕZ°Æs^Jí›FÐgµy#sæ«Ï'¢Qp¼R&ÔÐ RÿJÖÅå€u6¤fê2QJ§…T£6ïºúÊ?R®B>¤A›Qz¼ÌÊn‹yÁŽ')ÙiCêe­j¯š4RˆÖ8k -vÀ&Y×|ÿS(ŒÏQ’à‘ÄÇ+@ÖUÿo‘åÒÂÜ®1©DðX@F‘Lh¦+á¸Q@™¦´êÎ)cµw˜uF Ç´ OF3ñjòLƳðV¼Ù’[E[4måFåKp6–M=˾FÙH‰FÜúö[4bVr/ÐÏ€ê è2ou¨ƒhÙÖµS"$J¾yË8Œ_9õe¬ÄlŠœfWugÞüŸ ƒÞ§‘MÇýg²QC\÷Âïqx$*í&¡gb4›|ÏÕH¿?G<&U~RNò"rô} F%<¤Aމü‰ÖLZ!’ƒ7(Šã÷Å•Æ]K<)î*6«û¦òËóð%ó=îáð?€”‹›I¾šZ&ÿ ¸dA߀w]rµì…`)l=îÞìq²ù*ÿ~¹ ‡ S%3¶®ÀÃ8Ì ,1Th3‹t™Ú(¦±€ß‘‘™žH69Péh¶ÁªõÊß® ©WØ¡”E¦(h =T½í¬k¶Cþ´éûÅWàsõÌ•¯8$SãóF§„k’ÈŒ˜é„5לadMµ:!&:"+w÷ú=ÅëOL$þõVà>³lGÉ`nó¦Ô¤£[ “P?¿;ᙪý»¨sw´ßhg+›XVf«I¾Fña26N×ÒaŸÃ¥ƒF“ž“[½ÿÔ¥Õ·b‰ÈG–w~x!ëî¿dÂ$«¼³Fp‘„‘®ówZ†CˆŒËC³‹«Ð8ÒÜ« KU˜¬‰…@†¸yìÎí4A¨—‰ÊÈ?d âwÒÃ!¿ÖX¯P¡É,Öei+¡ÈžyxvO‘†?ÔD·¢Íÿ¶ð4öÎÌ1bó:´”þ »õ¥ñhÔÿmÄ¡1_¡·~àP] Í=M…èÖùƒ¼¨3Ît —Òvîm$Òui0@¼Z•‹»"¤x³B”`]}ª8žvUºóð`ãòÏ!;9Ï %uuJÓö¦$@¤¤¥æ¡½ÂWÒ’Ó‡óš¡G6*ôauÈS¦ê­.?Aï·Ý0°®BâÉ9¿5´6xzÂñ-¢ÉœZëzØcÿ¦ü ÀÌZì¶\^²§¢²¨¸¢É5d•Ç3«€9Ùê>M¶›8Ê.i©÷"¯õ°ƒa³¿õ¿ÊÝ…gó »0խʳ ýåüÛ2¼ð”„Õ³óÙºykí >iý ML# ìšBžêôÈ£Qôâ:Ò“Á{?’KР±?b Î6{ù3è*Ç*ÌåôµÌ„²®'„Ì/ò[OøkÔõz††Êf!bs⺀!ÞÛåëÀÜ˃¢J@E ÚJ“¬ÑdÔk)8@2äPP…[Å6­#xëÅK#„xUDµíh+$æ£~’(9¹¹'x‰s€ 0ËgŸBc‘ííæ ²\8£j M‹_& 8¬¢¢diñixðx<Kž¿CT¥¬õÏäL66ÊùR=4¢8}-±•—7Z‘³²Ú?¸ÎÚ¤šîàìãÒ[dÂsš]ïø[ñ.:)Íõô\¢[ؼCF¨A?ŒFýdŸÃѦÂf9ÍŽ¥ÐÐÞʽ¡ ›²Mîº%|i÷;ÊšT硚ÓNW*­9ÌŸ†F8Zéž j7Z~iB"±Ü«ÍÓ‹ªÚ‘òZ·ééIiq\,(ÔÉ»FMUí%ÓÙöÊàÚÝ-ê ÐÈ âÒT(ùÉù<[Lâ¡?!­Ú²åE™Ì½!ÁÉâL4éaÎÂ7 l<ë½¾|÷íc2¨·Bæ×áî;RèÕi)9ྠÇ^œ;ÛqŒ Ó¿»I<­ÍÕœÄmF/4ŽÜ¨ 1<î‡Ìiv𣖣M;<‹BVrlrd ¡„€¢}eaQÅË{¡í•hÅåÛ•(¡Òªê\ÐÍèshØÍÚsì`JHÆHŠ¢øœ/¸*¼<ýKwæ¹3a‘ý¸T{ìU©ü¼H¡í*ð¬Œ`Øg —Ȱ™ùà{'4 øùôM‡ñ(w®û&@éñZß´ðJâõ‚ÔüÌ\}$¿—t¦on\»%ƒ¿Úè¼CõÍID$A£H/Ë+È*á°¦$Á0n ÇfQSá»RTjk÷•çWæ€yã‚eȬ‹‘8ÍsȱŠw4Ÿ-Èú¤]öX\ƒ¨ß“™îvIC=É…z·!6V!!©Åîv@Pó ZCÃ]¨ò« 6¸çn g£—Ü™Q£gb¶é·VðÛûYcëÊUŸþõ×þÛ_N]>Ÿ»q5‡#_»²g 4†[ÞøQV5ë:«GiCrêA™`F³­x¤ñÈ+™‰$ÏK^ntT[¢9BH¬Z” +u~x5>þfT4¦vÓ 7MÛï|RzÝQ¤˜®#ßM!𯶯­¿0Y#£}“ÇØsJBªA95Y`€4¦"¼Øß7"ÌŸc•ë?òkåØ^·.üXÆŽì”õ~Ýq&sˆâ2ºÖü:Û€ò^]›ÿf?ý—Îûíå¶KÄ"SŒ‘ˆÒ›BäiüË&w¶£´þ7Qº†Ý ; ´|GÎXÝüÖÅœßQ? Þ‡ëC·0êïĬú•(Šÿ$f¬Q_ž¸p¶pçâ¶_ÿéÒ—ùöˆï±ä×d[óúd›Û–Dù1êoÅlÕÿîÌ?Ï6S{3ãL,Vßn¼ÑÛ%ACG<Ç0;Ú†ðÔ çcÑÄþø#ÀÍÈ”€|¸ÕoË–07ØnúàƒêÓDE6@«þpõÉùõ¤ ö.ÞUæ¦q7£½x&èÑCC ¿Ç`õ¢ •¶³c»›•Õ;?à¾ÜZØâ¾¹L³/ºóázZâ6Y—׿5p6]P»û"ƒ^6²!Xl?í=Žt°Š ºèbÐ;˜?Íö­ýèlq#0_^˜‚)£^âüVLD3OÐ # ÝýdA»GhÀë$/³ó\ í>mó-§L/¢þûb‘ñò‹í‹úÈád~ÓYÐU-mבa[z`â±èž„´—ä½þÛܼ׳`Å×d(c®ß½ùå±w×âm¼¹h,6–Æ‹ë/¾f…>Â@IOµ+·ÜÜ‚W2êçbö[<ü51 »£g£1HÌ©i•šzã_²§¬¤,ßT‡YD0ˆõ¨¢TT{EŸ4Äh°ކU†”íÚ / ua.´25e8DAú»Ú@M $æšn‘ìY÷µ@¨ :F¥Š‹KL’—ÊÓvïƒv/t‘w^@YH­ü@Âɸ“±û”¥{²âõáàÎL QÜ(¸sF™¥N‹1‰ÛLï¸.(ÛÂ"]ZvnjjãöcJ½ñF·éÆÕž_»ôdy´"Ìêom~† m``¿Aß ’V¿µô¹§çRøºCÕdâģР?Z=Ëkä8%H³ŸßÇUbÜûNðiÂRWë®\7’½¢Q0ouž™©îLú!ÿÕϋ驖/z7©é ‡¾êùÉMPN•áq48€Û1¯ª°Ã ‡à´”U]`4Ó*+T˜Ì‹„BÓ/Ù|”›Àä?£®RíÛK˜4–ÈSÅœ*ÅbT¡LS¥AºuE=uºM¬Þ ^à žDÓÍD{å{ ÑIÓ"3”™ Úô}hº#-9Y—S§aºÅ÷©î¦Sw(U°Ü! v7iRçù“«JT&LÆ)ÒѨ2)R ź‚×VC·(·C$ÈÉ¡ÞÆõ5P¬ÎŽÊTäîeR”t6™€róI1é¬+š`b‘r7Y¾+ÅZN“lWåìBü7ijLJl>™¶uÙº¬´_úÞ¯‹Õ)òÁ:R²tY¤N¿”–^<¬+1á&Þ"ù‘¯&þÒ“0ì1à¡è=iB&9ŽüùòÛŒ ¾¶¶ü¢†1^™ø“CÝII™ìÊW寻"ãI‰ËçHç~Ÿ©ÒWBNvN™q½»*@íJ6q„ÆõŸ‚VuÌñ',‘ŽÃ}6¬vR…_•RI†¢¨Q×™%0E¹²ˆwòò ËùŠj}õ­ÑÒ¢’ñ‰ ˆ2Þ™6jË5MdßópPÙcé§­¼ à­ŠïÅßc«„}¦@x+åýkø©À’AAÔVüh'ŽQ~bži8©¨…£_Í”Jp"p °£P¤ÊñGS»hi cÈ:_{°„=¹J-Ãþ˜¡1d@-iÅÁ‘þ®§¸¡é£ò³h™ð¾4»¢ðð톗;¡È)ìÕã¬ø/0Ôïf;ņ˜RêS kA]fIÊ "¸=”@Æ]K<^ZŠÆ£¾¹Yoý{µÝm„Ir³þ47+U ãþÔ¯:í¾ “QÝü':m_ç˜?;ëU—~e}};ûñ¿W³¶Q²?Óà=6wë—ÿ‹<ÊÚæuNý !¥Â¢}È7;­TÌõí½ÆÏ¢OºE_°èÇ÷}د\£%.M£IÿÈ¢ÏHOÉÑ¥èRÓ,úsÓǹä,rÉùçàÿS¨Þü endstream endobj 727 0 obj <> stream xÚµWtTå¶>“ ÃB¤ žxñœH‘*ðñ*J‘réIè$$2)L éÉ$ÓËžÞR'½IB „ åÑ… €X–"*è»¶^½×òþ¬Çû'½øÞó*ë¾—¬uÖÊLþó{ïoûÛ<ÊߟâñxO¬[ºyÍÊk×m'EîqÖꑉ¢½Þ¯–xþ@y&ò—’Ç'ÆRÃx<Á®„´ìy³çÎ]°Lœœ*Š;e\ÖäT‰c“DIÊ3ÛšZ›ØÀ~¸Ñn·g{&¯»KX\ìÐZµ ;úiFçÒ˜sAR(ÌÄwÞgÂ_ŽT&k uRäÒ ³ÒÊš Ñø¸¡EshS ¸Š õ.Ùç€*(2ZŠjn¢q ’ Šñ+ W¤‡è‚$ÈVåE\tÛá´kZ|g9¼i…8I€BÐíaünh? øúêP»›çùþ.¿ Ú/„÷6^èDtÝíá6ýö¦·1Íâk‚œBÈ–8¡ì<(¤¨A«ÎÇèddqJÅ* s‡¾æÐ]šŠF áßs‰è3á¬ççMeñÁ%¤··ÙH$Ah¬àVåæn3~O8ý_¦a>‹Ÿä€¤Fp€ÙTrµ0h©àÂ餸Àþ2p÷óܼþóû[=«„ˆY‚†ãIé²mEaH„Ò¸Û„–Œ_ZñÜ–¥‹·Ïóq9b='Rú¯‚¿\]ÉTÅØÕ$S½ntŒ@‰ñ¤ kÐÆa%…ËD r ÈE/e¡G~ràÐÃ8dVµë„#ÆÃнš£@[‹ÁEøËÉËÀVÌ ¦ÒËÈÄ|.¸fÎMá _¥ÉשµrÐÐ’"0±% 7™ÊÎ 1£7Ì`¤‹% fóA§Vfd/MËzèE‚+¨ÈÖjƒf’èÑàˆZÇRUñº&Ï ¶ôC9ø€ÿäkºIÜž)nšq‡ß߀J„µUÊ&@¬&ö@¸1h…d(vAØÁ¥­Ó˜´ YÖru^êsØ?};г\FÁ¼Ù€^ûùÝþúóêS@×»h2"u.(éï݃”^BjFoÔ[IÎP²¯.ˆ½Ú°‚°'à œ‡g‡‡£Yܸã:÷¦%»r_1¹Xo1—WÁXÊ®[Š­®hÓÓN³ÝNêÃΟ?Ä“„Á6“±1z©½ÀYô ƒ6¢™5×Ͼi ²ëz(£­*‹œU€B³ â Ö´’YàÔ™¸Z-€ òóòT*V§ÓjÔN­Æÿ‰{˜Ñ [‹ÅÖA.'¸Œ:‡„‹†½š}°"Ѿ·ü#™Ð‡Ð ]š Í¤5‹¥» ,N,¶f³«3èY€†áVK>y‘&()ZW('D”°¤©mÐDd¡‘œ'LòrTþnØPÆ‘6ä†ÄË\ÑÜHLã@Ïÿ%Õ'zºû!«ã# í‚rSjPr® ‡(ØcÜû»¤†g¥ ôz«ë}Í@&/Ê£2† }CÊ2# 6ùEOzZH§YlWö^îýšÃ£éäš‚,|à*³ÞsQS«Ó§fLø_»}ü€ƒÉýÓ.eŒŽVèräf•k‚Vc3áÿ!ûgÉTpaU5¸.‹© 1ž:F/¸:pÏ­W”AP)˜»g¤g€|Œƒ.øÂ ú¹^>)%UÓ´mñå›?. /½©ÿùFzî Oú§üþ^Ï:!š3ñðÓx/Ž#<–àùßMEO¡(‡2Q!»°Cˆ·`7á KþxMgáf-šqù_ºõqï;@ôáFÌykùíʼnDoNÖ¡“D™u_¾ñ¿?çka‘4¤¦Z¦ k}¢x?Ð KŽpà2uJÕæ¨„ó¢öíÕÈ¿þÛ[p—¾½è*Íâªß#•ƒ¶bv ³Ýè߉iòêS*f@ðIiH\—"dzÊêŠÏÜs²Ó={„•µ$"fgtˆ,è`A*Òþk‚fèT5æt¤B<䆸½öœ;ÝÝ?—$qw÷ñ=½H"„R8.êJqg›W‡–iAaØWœÞGèOnݹ{¯~ù2Ä:æ€W шöZY'˜ô抓(ò'ip×éäÒÝ›™ø3aÅ»‰ÚÆþx$¦9˜ôiR±Šgª”G3`=sáÌyK^ný 5æjc™ÞÌIAA²­Ñª³·á=ŒN£•’Ëf•µ‚Áhµ×6ºjM–ck>V¦¡1ˆFãÑx2²L$¢'ˆ¤F½Çïÿ±žÐ¬±IÙ$i!DÆD U>µ±s½Zg6¤ƒR§Ò*žÇ˜$øôôi@oÙÔò5f·ÙuÏó4ck¶Øû€þÝ¢3s` £ÊP§B‡ßzí/,ĦŒ9ˆFÜE¦ìJ—½Ë@[‹ôå„lþ¼°0]FÿB7o¢kS𬠲4[‚û³8:tÝZA,W%ÃŽX&Å#וë¯éƒœECØâ`Ÿ&–œŒ3&­Î#ØŠÀÁ£ÒX¨Ww€œÌ#²«Ö‘óR]¥®á-}P ‰Í®0ÉÉùè¡óC‰"±qGA¯Ð'7`FŸJ”ƒÙfq¢™©Ðè3Aá‚ ;6Gºêéc:¯×59ô&ؽ< 8<¿°Î3­Žwÿ:ßÓ&{{IÍæ}Tgå¬ÎÞJF@–¢¬Ž;é£Ê·PC¤Ã&º\âÌ%,H—+ÅÒÊ”62êƒFá©xÆÔ ¡W¹‹pôxE•3âPjƒªÃ¶rW{ñ9B?¼![(­}% èPÍ»¥œlB~¥õ—Ÿ"Óÿ’ýGÆŒN#%èx¼4nŠ9Bìä%”F@ŠP‡ðÛЋ+ˆa ß#W¼…jc‰^F(–r´“eLž×(æxé_Þ r ­\«˜60™Q¦i’ˆ…|áèòDÓÑ4Çs„q‹vÄ‹€Þ%9×ÁA‡£½â#s¥£Í`ì¹q´†ø,Rr°-Ӓćqñÿ&Šû„ïÉøN¨.–Y”ºV«m^º8tÕöÄŽ«tWÞo»rðäÉîPG´åû"TÚhPÓûÔÖ wiOïžÎ•x<ž€'á©óO¿|Ÿý3Ü=ÑñæÃÕŒßï:RøÿV‘ç9Í‹õ†”¥·6ãLæÿ¹x(¡½@òDß@º®_ËÓJéû‡8 æ¬ì }P𜲵•\o´Ÿ…*º'ºkåTüÜ,¼û_^ýéO¹ÙìÂ)x>¬a¡÷Œ%@­JJâ|·âÈ:´ªÎ3‘\ëO6~µùyÖúx4ÈÛLÈÍSeÔ¤¸w’Ð)ˆY<=¸oçEÒíÕM/0;T™ "qBba$BŠYb2êëJà ]•çÌÊNÊŽìνÅ"¼{£üm: í$‰Y÷Ú`bn’ÄôDüòΦ·{;ÉÀ¸l[¨æ@C”Rþ?ªúåÅ’¾‡ŠJ\«F™!/&¯’Kô Ô5Ûª]Ç»ÎÑoíí\Á†BDj\Ìutè7™  ¦{ÊÀMFO,ŽšÎsJ*X7Xê¬MEGÀàèjFgWeGSSiiKË¿Ýa'3lÓ<"'¼ ^«$ZÖ!îúºM³²¾ínýˆ‹&\ìº4îôÕ?€_n©qºKÚÁPÞÝúc¯q6Aý†¨%|f ž*+(³×þšMEÖú†¿´Ã©%&?M‘™³+n6“úº1èŸì­eÿTË×aGtÜNùù=› ¶§En‘Š®‹"> 53;:7.?„TMâ[PÀd®¬ü¨¢˜Û2‡,‘ƒ eŠN½ wùª«¢³K¤¥l3˜+‹ÏTÆÒ¬ug:Ûƒë[‹š€nreîæ [™¤‘¬Åæ_=d*nc\"á`k"¦3#¼’Þþ)åÈð¼J²5þ6мÍ÷¨=£„Ý»jÂØ °76MTØ÷OQ·*,6w*a Ö£èñ;`F¨ÊK’ªÒ €Î,-¨¨¯©v{[½öÌ2\º®¾A°Ì9ž¸À÷LCs…Ð(­Ï¬J©?`·'Yc­Ä»ÊnÜa› ­À£ ØHö,YµÕUåí={»–áÇ"f‡²ðò[ùMŠ^i¶ÒûÓ^Â<6B¬¹½½fè&'X •š!§£>F³:Q`Cب÷w&¸ÑÖL ¸Â÷ø¡)B§o!Ôϯˆ #ó¥0ÇÐ9$97Q/ó™àç­î%¡áÃs) ÓÕ9ûð\f¡o5qòCÁrÜ9Ì+?áîݾ;ƒ¦:¼{æÞ½!æ>ßg¿Ä÷¼û[¾à:è3ofÚ•ïÈc@ž¨•-LJErÔÚ @oSŸ"ÿ{ºæZë—ö“*[¦S “Y»ñãÒ(ˆ §ßÈ<ÆvC{EkWiD[nË/½Ã/lÓ¼>Û%´à$ߞDŽg“‹s3’3RYT6™Pé°‹NÚ‰uxøzÕ¹zŽW]=ô½ú0…âg! î<ØÝšäw««H,>‰¾:âÍ{bÊO@®Z/}Þ‡OòûwÿØùy¢ü„ý6½Vs©šƒƒÖFkC'šË˜«`ñe4²åŠý¡XÌèT 1¤B¦<3+9'-« èep½œƒžÒ“?:êMŽßI8%Ý {éà;ÙÇÙÃÐRY¤!ô‚Ü Àá·+޹ßiG“à¬7½ßg|äµ>/?ÌŠWÔÂo<L¥ƒ™92…x)>ÂH£Âwl#.Uu¢áŸ)ûÓ· ZØ 8dlkŽÇÓ—††@2$—Èöšõd»¡+s‹²sâ ·oée‘üQ5_ÒéÕžeNt@_V-`Gø‡Š³Œ€€‘u#úFÖ z½Á¤7u”;ë+ÈêjÖsÀ(vaÎtþ¤m‚ãÿ ‰À·Â endstream endobj 729 0 obj <> stream xÚuQ{L[U?‡¶·wPØ#6)æÒ^2C‡ø˜Ù¢àØÂ †).kiM -íå=7c°{.-cí2F`–0§Fþ™Î,bf4ÙGŒÙÔ .ÿqçÀ)à)'Lï_Î÷;ßý=¾Z „Ée¹–¢œ²g ­RíþÉQïwzêŸÍH/smt[}Ñ¡]äi@v@’CRU$Míþô šwæÏk’€S[£5¼9Zû·° v³¢ÉÝ6ÇtÀ¶ƒ Å  ¸A8¾¿‚e¨±ù¬Õ·£F’¼+GŸóhíÚ9 Û¤Gðê9 ×9íðµÆÑâo¬«³J̾äh‘þiìN¿×mmõú<öÆjiµË4gd<—ãñ¶®Pˆ™¬KOgu·hk³ÍbžµÚåiö»œ¢µÞ.æ™ Íb‘§™N1ÕS/ÚµVwè©Ë•b…e™ExÊAöà ÂÝ¢ä0ø¦ÂP ˆ1Ç «’U]øí„eU˹’'°N5oóéÇdÅgl程òûh)¢)|$[Û È“Æ[ܤ¢L˜H¶}w [p.Þv>¬(h„_ÏB”%­>:…SöáRêÂ<ŒkeÉ„Z9Ø7%}YùáÎÉŠ+{ÙR-Å4­9Z\Ö£Yé ¸ÇrnTýl¿Û|ÍñŒ~BV¼Æ|Î+Ë &F‚hê=ZŠ]TËsãŠ2¶‘Š(‹þ?þ{ÞOKè«tËñNYF­¼¤ÈÆ vcþ..eVÓ­ró›ôdË_‰P ¸ '}„mÇò _Gž¥E»Z©P±£+JÍ®k¢ùÎk×w¼Ÿu1eòlèñø«Ñ— +Ñ;B s?~ã7û·Í÷Ñ}žd­Wafhü zKT M4éujC4–gøºWcf¾Áv\€Ås¡½Új.ú®®#¦£œ©MÁª¥cŸ,$MÃ…öÅn½ó½|°èÅúöS¹~š‚øÈ^? ¯ †ú(˜ˆ‚²Ò¢_“29Ì!Üvr–óãÜ ø¸fq6*â6‘)ŽäwwʧQobGçg¹„eÍxÃgÂBßœ þý:4®¥ÛLϾ=ùÕÖ5Jk åLðGÎ_Ï2ÁD„ÐÀÉp¤f~«\ãð“è§·B§gºçÚ¾94ÞþÅá«{˜4ÇW5µq’å¾¹µ 2±Xkˆ\ˆüÑyõ ôЄ e.Ô‹Ÿb.fnb/N'—qºJPÊ@ýŒ–&º?¸eZ¸©½}å6gê¯ÐâÄ©7óMK7µy®ÃÔ`¬ kƒŒ“\fêk7Ú„Î0yj€˜Â…3ƪË=ºMƒºX¤‹›Ž½wi¸P9£ƒCïétÓàÙAö …ð_ºø¿«‰V× endstream endobj 731 0 obj <> stream xÚ½zTTW×öEàε¡r3¤Ü‹5±ÅØbMì Š •ˆ ŠR¤J¯Cï{è½÷Ž{Êâ &š¢MÓäù÷MYë?3Tß$ï÷½ë_ëÇᎷÌ9{ï³÷óìç0zŒ£§§§Xgn±q¹Õ¤5îïN›²ÑÞÑ×u——öÞlé5Fz]Ozc€$èK¢A§Ñüîñ‡Êð †ÑkAÌôÇ/‡kóéaÒ\cÆPOÝîê4}ê´i3—zì ôÚëèäc:}Ú´S¦Ðã\S»@Ó%SMÍwívñð÷vÙkºË}©ùT‹©¦k=ü鎦oy¸›ÚÙ;íru0õp0Ýdÿ¡éfËå-MWn\·y½åÛSÿÝÚžóµ^n»\©uìèãæízãæ'æWjÚFŸ1`XFÆpÌ@f3˜ eŒ˜aÌpfcÌðÌHFÎŒb^aŒ ó*óó:ó#0"cÊŒfÆ0c™7™qÌxfóó63‘™ÄLf¦0S™w˜iÌ»Ìtf3“™ÅÌfÞcæ0s™yÌ|f³yŸù€YÄ,a–2˘åÌ f%³Š1cÌ™ÕÌÆ‚YˬcÖ3˜Œ%³‰ÙÌla¬˜™­Œ5³ÙÎì`l[FÍ|ÆÜav`ô¨ùë˜<½ z?¸§?J»~…Ál¥Áƒ;h8ÉÐÇPÍ.gïÈ–ËZ¸ù\úÀa^d4hË œAß Þ6øÁÍCn ]64ßÈÄ(~?,wØ×Ãg ?7bØˆËÆóó%¾`äÊ‘/äò¦Q£G}üŠÇ+_**Š'&F&ïšœ{uü«A¯þöÚæ×N¾~ìwÞH … á–"þf:ÓôàhÓѪ1˜ 1?Ý8öû7#ÇM?ž?süÉ #'|ñ–å[W°ÑžKÅþzèu_¯Iíòsv)‘‘vq[„tšL†ª<« L>‚䌤C)¸X¡:›rÎq95¾e¾¾e¾55ee5‚ÞÇ“z’(]•'ŸÜ› àžl›Klªd¿¨„Ô"U!GæàÎÿü„Q©¾wÇ_ÇÙþz’­åMN&˜±E8Þð›ÓMÚ ¢=›‡²Ôfï¬0q…8÷İ2Tñæß^}Ÿ s'§&È?aÉxCë¾ Ù`2 b¸À¼ R¡’k“r ÐHñ¯ºñ¹Î‘ÌC3¹v°7u¦ÍiÇ1íߎcÛõšZÛ[£¿úh/]”ßÝÓºÍÚ~â…-Oµ¸t[À€gò¢BÁ¢bÃHÕŸËq ±Í ^”’Õ¿¯T¤d%¥B:w¶ó7ù-‡¶­[Ö/^ܼþôéæ¶[é2ä¶aa5ÇÕåæ¹Ù ØØ©½º^­>v¬¸:'§xŸ­`®Æ›j¥6®Ñ¤µFµ6hÌ[¡íf«e¿'\ •Þ”×{C°ðân®P(î[æ_&ð fëf› "ìL·,]µauBb€w°ìàø¶Eœ\ú¹p7Ô(8úá%à>®ýôT£€g‚g¬g `"2§´©äDVåeœ¦¨gyÎ4¿êD_ËÁ=Ðq«eÈÙÄsÁñG˜KUUeû“VE qCå[c•ÀÙD\©áTvÎɳéÁÅÎy>?€)Û“YèÍIÏõ°Q­ßI1ò;ÍvΞÞûJ|êÒÓU ¤@dŒñK숊ˆ…`.°P™Wñ›i/ÖèKf›å˜C†µM àùñÕo ²ÓS ŸËˆ-ñt';‰‚d @Ÿx·ië¹%·-+€«J-Éð#>¾À69ààNo¹¹¨Õ8¯ÿ(B²£SãqÑË'³À&8‘¼6-$"*B¸¨4ÿÊZ܉ ̤Æ~¬/mGg9†e&¨¼ W6zæ!Ó¦ÈIÏM‡b.jw døÒ¤*ÕÇPk’ ÎÎà)€»Ê,É“0WÊ̈Î?40„ºœ“zë„Yþ&qà~HÀáŸ%x&š»I$876B#uª6ñã„*õ^‡’뻪ƒ“ ¸’Ü¢|êYÅu=ô¿®/Qït…IÆàX6šœhAѳ±dŒ¬·¶p ˆS­—Çâ™®tŒGèáv¯Ï*åê=mwû¸¹Ø×z5 i®JO ±Ø þ\H~PaÃ/çq€ ›^rêúF_ã ö¥¡GèãÝvy³[•‹½—««CgÃÊúzÁHrø}BWíùBtHL(ùòÏŠèàD€(.0?¨D(ƒôü´\üò÷ŠôФ¥#e¨õNkð Mw¼$ǵãð2€L ¯s²öò @ƒçø*š +²åä-s2háBs„oáxͳ[7¯¿M&F –ŒÔhD!7–Ž´¶®«æ¦I…lTº f?Û*< !8Ñ/<8¯¢Ø|¡§;ÀuΛ& öW·JÈ1…ÕŒvÌxµñÙôÒ¸køxÉõ°¼JV e{ ÀC ‘,?¼íÌ·âø§WZO\…{›‘A æÎv¨ /,-/¬ '672=ÿÄÉú À=¸³c†Ë­7˜m"žd­"2*&”œk%|*>¡åÚ˜žÙ jA%é*Z«u¬ëÈíÀAšÝÞ]òÁ%r¸±½Í¬®õ£š‹pž»µä"#C–o[á\©,éš0/&+>¹¾þd÷éiGÜBœöùºxz%8&lŒ pç('X>ëÙ™UÖZ®™&î†÷³=O¦¦¦§A WPâåãâ2ýÇ 8 _ùúÉSmŒ‘QKoÐßÒ°…ۺ¼_°Ñ{ÖbCýIùC 4Çœ3£ëL%ŒÛâUºk?,Z s·+àdI½œx±è…¿jý¯Wã,µÞ# &Ò%uÅòŸßÿ‰ œÀ6ÚΗÃ-ë…”±ÎÑ‘.")–‚OƒP)©YÕ ‡‹(N>8¾Ä|þ²u:ÃãBjjF:u±Ö§À/Ä-rÏœ¯–£ŽxöõuX>  Úq®ÚøÜe_`ÜVþ¤ä‚›åÈÎè +° ²±ËÃÑß=xû¡ <5–þÄ@ ç]ä_UYRX×âx~"MßWÉPbC"Ð`É3Œz?}…CÄ£f™m\*˜ÃžuDERäqí—O~ÿܪłQ–ŸtI­wLs‘zì#Ýé /ù’)„(àö‚o€¸K¾û› ¸FÀB–,&kö’}@pJpn*,Ì®R±§àu[IQR_—LjÜA“I³IƒåôÀOîJ¥Ûæm‹KïUo‹ÜƒÙwÉ`2ä½óØxbëžc‘ßêõ°ˆ›øtŽ@ã'~æà!ùF Û%߸ÄâxëÙÖS_ܽ¸ÍJÌ#å+Ì,çüÆ9f­õ¥+ß>¹¸f­.“ç¶c3§+î.»Á¿ Ñ¼&Ç¢¯™LôÇÏ¡abM§ tÎ?A†/|kD‚£Ê¯ %55 ¹ŠÀO/ÿ 7—¢e8’Bø0jµ°ðŽ|ÓæsæmùäÖíŸ G¡Æ§ÀŸã¹†=™°ŒÓ"šõ¡–dðWØ"m…²ÿÅçRÉwòÝì==öz:µ¡›íB¢bâ•Ñ”÷´ÀZöÃy4 °èô­ŠC3ÂÓÉ!4S =d§çf@±Iy@N° ñ‰ÊHò€ìVDÆ„FÑÞ>šß{E^dr"-á‚âœrÊV×Pˆ’ŒåM È3Vé@!ºQ Ѱ9ÚÆi²A“³¾ÿ`Üé½fÈñ›×¬…oºCnTvD:ùí)ƒÅ«" ó¡ F¯Gã!b¦ ô­µÄħ8¬@È„dU^&>ÀÝŠÌ4­Ýœ¶¹Õ 6nïh½÷›†7•ì¤y³×Cb!ð÷Éhk3K—ŠR-‰ü²bÓ*kN¦î—ƒ.®"xú†Dqóa:ìæö@衺¬´ýB¡ N\|z¦¶ ¹Îrdnç:ù_{áõ5ÖуޱÖo[q9E!Ÿ{òˆ‚ ""œ\ìÃ÷G˜‰Èà|ûç_þ%ÖÀñˆòµñIEÎÀÍ7ŸE Éàëónµüp_ &ËÈëd8y…¬"+ш˜ éã¯.ÖŠ–è+Ÿg³qçö]—ï~uâ‘ãÇ6ÌÓ‚à¯ji´¿^5®û×éK1u4¦±Ya©1ɾd¨T¢ˆ< T¹‚;C¤=ÚYªP‚Ä$„ÇÄD@(çV…Â/lQ….pË5ÄÙlùXCG P$þÂViñp!~(' öcüÄP ¾~j´Q«ÁÍ6 \òÃùrÐl»6¯øjÙ±³ÐÎÝ\û€è ÄUzÒN“RŠXÝ©ÜÇ{Ñq«´©Èò>hx¹ã®ø.–Û¹˜MÞDÁòw¾.³pKi [ïY?S <ú¡Àò_×-±»iúÛ(.ày£7„ÓÔõ÷è·çyÛ7mÖo8ß~ø[‡x.ìÈ›—”\\”–ˆ(Êt4´-ŒNˆƒ„P/çš%Ò•’Õ¯FúŽ£û¦ã±Ž{•j½,¢3ây9Μ…‰‰@ìzüÉË:•¾}ghÇâ+ÐgQ%7a4“$å,¶ÂiGE_5ÚªÔà+šãšíþ)ñ°¼£›Öýü…¤}ñ™7퇲bái÷½`;ö"¶,¶°]\Z"Ü”ÕÇdí:²!Ú k ©ëTºõ™%‰,? ‹ÓéôÎÚ—Þ/|N¯OÕAŒ¼g„}ŸiìT:÷slj[Z¡3¾Îþ­q¯Ó[Éý,Óï 5SëÐ`,£åuž"Á=Z¤@<†ëí[€›÷-™ 8åÞ¿îŠMpŧ0IAiaUÿ¶†~²×©nwþ.ºzCÞ$¯3²æWZ6ƒÅ‹p¤®¤œóÿ.óp¬¢êÅÞìÕ{¨A'jJbwƒæ%)+ûœëoW%¥N'´yùnoQÙ©ôê×N î{Ê‹&®ñóê©ûnONa#_ †ê`†Í§å¦=ɾeD¦SI˜~çtÏéª!^­w£WБ¼¤»ÝA5ë{ôAçTvöÜØ! ¶{UJjJ*ôöTk>Þþ¼ãþùoif¬ ²+>ZÓ:Zq3¾K+j¸ )qi‰Id&PàdÜdøQ)Ô×í¥8C;•«[5­iâHŠ ±¸L¦óÁ‹F`B—Úò×HïÙs¶÷_4aŸâ@4%Ɇ½`q»Û¿î8éi0†:¢-(¥YæïGË#FR¶Êòª{6»oš;•}gÒ¶7ë窱@m|±ugë½V|¾ñåR uÒ\I)k ~‰ü¬:/FKšÜqÊHÏUÄFæéãÎ%²'g`NBZD…P…j©[[‘¯u-…¡S)sñW‘OÕN+<èZlþ“®Á=U²ìWɦ”Ð Ÿ\ûÔè´¨œèÈ…¼ŒŒ¼ä´¯1-ç§êôdµCèÌæ#¼”.O[ѲLtO36ºz$²dÖ’¼LVöË^m~öžýÖ/=%‹k:ãs «À¤.'ù€(¥UʺæìÚV VÓÈ;iõпbA,üö‘£äHé>´À5eÕxDX‘) X¾9ÜÒÓo:̯ҰÓagà!\€vø4ûDn[}θ M‘ù›r¶Ã"XËi—biòRüKе˜‹äO?&2øü~¡¼¯<Üp % än>~J1vËΓ„ÑÿûÃÑ[ú/Ó<þGó…\h€l•š Td„eCp™l~!‹æÿQxYTnàþèÜcEEM™÷ÓÎÃ'p‚[¡’±÷Wú†l{¨ˆÌOTùÎ*!@„XU|rì‰é ö]ð¯‰8y>…óÐ w²Nå^(+yP”mžù!¬„Í\/S2ÓìÒ”høï¥â§ò-ŸEP>Kt㢂<àÄ9®@FdyX­O©2›ã_|Ü\¬†ÃÜ7< "„,ÿß‘ó]¶ê Áƒãÿ(ó_ØæàVìRèV¼¸+Étü—ÜÚfÃ4a):ÆòOŽ­ßÖNã³×Ì5'5(jì¯ñ®TÍ“ÃUÇ#a¹v‡ö¥/,šW¤Ø•cß'¹3-§n8ò§¤¹&ûfÇ”ôÀ¶¢ ¶©0 Šr³kÚœcCa[Ñ‚Ù"¬:aö¥7Êö)øüš˜/ýa&gµsýÁ¬SvW搜;’X”X˜X䜖E¢ƒWÕñiy™ ‡ÜÔÁWCî³G=Åò‰æ ý§/Åö£µ×Xç¨(gq‰¬—˜Î¡I§ÒJÖЋûñÅcÅË$¦ÛÛ §ãö‚­¼_º’ïXS3+«-ægÿ€ßÕi‘°¾NN/=õŒ%þóüùÃ'8LÀg=ÐuOòRá2×|kø;RrÏ4ãº>_JÛç÷I[è–€¢wš$²±Mq…‘Í%¿³©´{2~ý8–ÚýüG4î…YöP &ÕP ™Í¨ŠZ§S~%¹«³qf$άǙüS)K /ÚôK+Ö–|µ6Ú*уÎsu;Z'¦E–ûPeþá½lµ ø©‰ÅÑç­$SE?¾\ÐE5)ªØÏ:K ù;©N™PY%Ééç14å§bSlΓ@UBºW¤ÓÛÚôíb³«{Qи-È´°B‹ÅôÓЂ¿)Ews¨KFc¢aYTŒí‚¿r(—‘ñïãxÃÚ h!^{«gUÊYB|isVhèËò¥½¾óñ¿ÒSÝ`Þà#>Á-†|ü3B‘>¾ÝÏüú2]ii=©¥»g/ƒ q Wž™‡s"JM*Êú,èI¾Rß"m†dµ—ìß;†î^ÍÒ®¨Í°ô%Z¸¬ÑîDJ¾‡åOúzÇ¥¤F†¤À¬|Hƒ,“ý¾ ‡“ÿÙ2ò 30"b ÂdoÐNéE7[ÎQÿ>–zãE÷ßÒ­ÿ'ÿ>'÷k„̺ö:þ\-sM‹Ø/ Y·i’Ã69dÄeŧ‘¯~_©ˆÍŠ*ôÎ?$(P„¨”ˆäüêÏ•ŠÔˆŒ 2àJò ‹z§SjôñÂ.ùï«»ŠVÛËôcòŸcÉä~çfÝ–JfÒ!9yï‹èäHˆŽ7!ï-p ª°ÚŸo‚“®á$󦊳N…&Fd¾vc‘(þÃÆbŒz“o¨Ok0XÃHõr]/° "R£’9t•ÝØüysç8XâV\!äCM¦ª2Tª’¤|Åó_„fhO?YÏñ‹Ê\O%®†®?UUÿ’S ÷ÛÈñ¹ŽA6Ú} »ýEhù¦Ç¥pÔ¼¥FCK¦i; t•ã°é?¶Mà^Wͻ´¤OZïLcýÁ¶½%•Âá]G#(4êýø=ò”('-7_¾ÐéÑ)*Ú.»rëÒ’™Z)‹wÔz75èÝ¡/9 ž¼Æb„`ˆHˆö ؾ¸ÙK¯{ªeøZéAˆUNÅÊ à*J ko޲hy}òÝ84FqÿO…ÝüTk»1VáÔš8••2ëµp¦l¤4ö/†“é¬s­]ÁNÊ z“&^ä“ÉðÇZáHuM-ǯuå!á&«ƒK2ß“óM–6sÞ_¶îFÇׯ]¿Úb¹Ië\þü2ŽTóû¤==îBT|t€ï‡›#=h²ètð7žaK‹¡ÙÕ?‘Qdð¤ d˜È7£ŸÇ£'W ËpŒœ³y7Û.\ªk½2ßÔ1w»GÐ\]£ùñ¡>M¾óòËó!xþû;f [&ÈtiaágÒ>¾_Ó^ÑIã±ú•‘ÑIöî'P'Äeîi*)/¨ŒHàe\|ñÂeüà²ÛeãÚKš\¥ñ¼§Ùp‰ÎHi’B^P¿YëÄ{9~œíT¼¸)ËQFÝYèœÀñzLxp¤/¸SžWfÇG_lCpnÖ‹µ8G¾hÿZà›Bsàé«CÓw•½ Ür6 B!*I ay?&<ýÓž´ßDÓ>“â;Õ ‚-†°?xt° löp¸öo²_iÛo›a›×#4lq9ûüÖ3çò<Ö ÄO×:i… NÑ=%v­ì­çƸ÷ù ¯–¶uóÊ|Е­dL¿õ4$ídh¿îôT ðÓÈ©ìovŒH€š"ö>í§:Pñ|¹†w– låÒŠn¨›Îö¦ŽêœÂBØ{:í³w¥ áaI!IªdH‚t®Æ§ÐÏÇ7È]à#?ø ã¸pÈU©’~ø›y»òu0Í×y¸Í²Õ·éK©Ýž¹²ämÜ‚ÃPfØÔO{Ní'¥X2›L6Ä]Fš÷ÁoK§Òº÷Û°¾ÏÞ»…ƒÉ;]I:‡ý•#»¥7Õƒ=!ЭÝ(*zåýÎûÔõg“Úø\+Ö¾ø)W§àŒ¥úÙ邨…zì Ù¯Ýhs7¥·/ÇßO¨ó‡@à\ØÞÖˆ´Ëýº³àQ—ÿtWÊø–ŽÃ'—ç™ D) èI•Û/=ôé3S—ÃüñLb^Óù»_ÂöÿÃ|íÿÅ]p~Qƒ•ÚkcÄÔgÄ€L}‹Œ ü÷“qøþ4V¤Ë§Z,Z¼ØâöÓo¯]»ñÙUói4M½ÔøŽ¶u¶Ó ©†Wü•yøgµ yö/—^Í?šmÇþ&âû¸¨{ö[º=¾rêÀ~²©+K¬¥ólWd/쫵«ÚHyÂ`å 2ü»‰8@üN4—–sÄź_ÿ4¿û:Ó¥QòÖsç.6¿þøÉuͽÛÇß7z×§hP__óÓ¤`i°¼$ìÈáCX¸i ·_ÆßéÊÍ}É~Ÿ´Ïë—úyýJG_»‡ùæwm?àPAå]è_ \YIAuϲ|¦Æ"µ¾d‹#äð+‘—º¤®ÌQ¸§¬Ìƒ\UCý÷—ç–ì© J ªïÖMšÙ§Lˆ¶-µ…êø|Ÿ¹Ž"¼ó"色%ê^(lᜧ ÛÁ2ÛënlQ\¶g·T𨥔2¡@•ÓÜâx.¡†.Âô†/Oé,ú”–"õ}: ôf4–A©“s¢_h±1¸÷ál¥ˆ‘8§ßŸ·æ<`{Û̹3ûØî‰g'}êxóÖý£Bÿ·÷'ÿ>òïÓ—r~/Ë·¼;/Ìe46XþWd'™ì$÷Má0Îj®áøí*—R(®»0*ô“©õ*pëܪ/Å÷|Û ì[©–è‘ÛDoÖô£ß}pWÇ¢Œ<ÍÙ[¥`R åÝH»žïuÝà÷9žQëà¶ït0*“×yC @dl ·Nd‹-ìVrÆ0‘« =v8ðJ|¶•INeÒn"ÄùS™d…g [º6Þ} @ìùx)â2éHñI9&‡ 9³H]ùH•—\FÅQªU3˜•TD¥Q3$¤”]ÆE]i÷¶f»VY“Mh}޾­Akª{”Ñn–ŒÄYH†á!¶oËl`8©ÿàgêYBöíëbqy‹ '³ w³|eïuØBí–×78¬ƒ 3ôèQDô^žN´QÒ[‹Æ¶”KÕÆU¸•¬z€+p+ÿê?­ÏR²7Ô!&0ÚU+n‹#K£‹§bt-Ù±êYC~O‰€x¯÷B½h‡ã¾É1!$‘ƒÔÌ\‘_TXä%ðG÷zîÚ¿»E|ÇQ‘’ïHÛzU<½ ¦uàqX~©OHÙ“2^ÖÒʽ…ÝBêi—ÚÑ'¤ª0IF®‘?ÿÄxêRÒ0¶, Ü|Žj<­}u󞕼ÖK)דá#¨çp– *ãoª;R™ß¨ªäPAÏáPrFÑGIMÀ¥•¤UPßÅå@ôBƒf$ÆÀVðàÞ•#„8;†lM¤µããíV‘˜%V%¢^|ÒfŽÌ“Ñ¾Ïæ¬ûŸ ѧ€£ÙFEûÅ<í(ÿýYï:þü@ÖûŽ·/Ñ WEÞ*2 )¡•Ãù2¨ãVµÛªÖ¤8DëÓ³8ަƒ@íqæõfw¾ËQK—„íÇ‘2Ú½8’q :]+¡P|ß—äßW¥Ái¨áËhò?*ø(ÿ”ª¢Ë[*éÌñ¡¼ ¤ ˜ö·1±Ñ1nžÁJZFQ™¡9¡¹þ¥{axûù‡¸ûB œ\ dCZjzZ]MUAdAFdnXnh‰ß~¨†š‚òÂ’üÚ2(âz$žÆ_õïÖyÿÿt^ìßé<^Q,ÊKBòý 7Ãc‰É:…2&<–z•îR%¤CjRZ2š´)*²Sr!»[„ÜÕù€Ñÿ½ê,*^þ«‰u4Ö<]‹Á_ûï{ ~š»ÄüwÓ†gKK³qavJ6+ 2Øä1d`úA0d°zfð‚4•ö'µ$%mȦҤ”tU±*ë|cÖ¡RÙÈÿ œ 4 endstream endobj 733 0 obj <> stream xÚcd`aa`dd”puv wÑöñ ÊÏMÌ3Ó JM/ÍI,É™ÿfø!ÃøC–é‡óy–?Óï“aËÿõ“U–á™ ˆ|Ì"ï €H' Áh#ÄÀÊÈÈ“SRe¤g``âœ_PY”™žQ¢`d``¬« $-’*œô¼“³óË‹³3óR¼ô|õüòË‚™ ùy I©‰9i ùi !© ¡Á®AÁ îAþ¡ÁšzèÎ…ñýò‹rs€Î`4:Hˆ‰‘‘%ðû¾ÿLÉRŸº7ý˜¿ét9ã÷¥™ôŠmJ`Wéž±FþÇ.ö•íݹržÞªÝéÝ)ìK»Ïv_Îñ§—=«»NE.!…íPÿÍîÃ@x³ûP;_Ù‚γ¾çO¼€MŽ‹%$Ÿ‡sW7÷&®{Ü«{z{úzz'õôN>Îó¡wsOÿ¤žþ)½Syxå³Ò€ ý¿Ùa‚ò endstream endobj 735 0 obj <> stream xÚcd`aa`dd” ò w óÖöñõM,Éð,IÌÉL6Ó JM/ÍI,)°û!ÍðC†ñ‡,Ó9æò,r½˜“þó0uÿî“a¹ù³‰U–á ˆüÉ"¿ €H ÁxHˆ•‘‘-¦°®ÅHÏÀÀØ9¿ ²(3=£DÁÈÓÕ’– I• Nz ^‰ÉÙùåÅÙ™ ‰y) ^z¾z ~ùå@ÁLü<…¤ÔŒÄœ4…ü4…Ô…Ð`× `÷ ÿЀ`M=¬NGôË/ÊMÌ:ˆ1è4&FF–ƒß×ðýgf\µªqõñÕŒ?–Ýdþñ]E´»kf¥\mwW[kEuXR`D7GEó¬òÝó'Í™²`Ö¦ßY»sÜõ]k/Ùí]ímÓvÝu^jwjwaIevQR}Xw;GÔö)r³»{&M˜=ÿöâÕ«»9Öw'5ÊwW7&·ä—J”Û·ä×Gv·J–Îi˜+7·{ÎôɳfŸXøtι)k×ذArþ¼m+vsœîލïHP¨Œk­j©î®âˆØ™~èÃÞï åøÊüpž:mÚ÷‚lr\,!ù<œ“x¸ºy¸Wsmà^ÙÛÓÛÓ7kÎÔžÉý<<f-êéé™2±¿§o /Bw¾¢ endstream endobj 737 0 obj <> stream xÚcd`aa`dd”órwŒòÒöñõM,É®ÌMÊÏ)¶Ð JM/ÍI,©°û!ËðCŽñ‡<ÓæŠ,r½˜“þó0åþó—aYøs>«,£  ˆäá‘l@’ÁÄÜ%ÄÀÎÈÈÆ+”Q×3© (3755'575¯ÄHÏÀÀØ9¿ ²(3=£DÁÈÓÕ’– I• Nz ^‰ÉÙùåÅÙ™ ‰y) ^z¾z ~ùå@ÁLü<…¤ÔŒÄœ4…ü4…Ô…Ð`× `÷ ÿЀ`M=ì>AõË/ÊMÌ:É€ÁHµ3v0032²Ø.þ¾†ï?£‚áçïË~ôŠ®Ì_œ+—ÜݘÕQÿ[ø›DWg{Mw7Gݪ¦Ir»ûû'LûîýÃJ¢w„iÝÓ8øþ3‰`ðÞù½„üK]TÚ]+÷Û†í·R÷o¾÷µßU9~±Í\ؽ$!ÿÈþ®úïýw¥nŽï6‰ßöl¿~ký–ùíöÛí;þî ÿÝ,/Ï×8uó„ŸBË7-d“ãb×çáœÄÃÕÍý“k'÷ò¾Þ “{&ö÷Lè™ÆÃ³¼¯gJÏÜiý“{{xxýµè endstream endobj 739 0 obj <> stream xÚ}TkPWÞ%d³f ãŒz7mm))"ZÔj)ŽØò°`-†H Þ| XõDñŒ… ŠEEÛA¬¯QÛ©ÁÁjg´­Û±>Æv¦s·^tc@´ÎtgçÜ9÷ž9ç|ßýÎ¥)wwЦé )QÉ)‹cbbcõ¹úAñ™šBÚà<›-L¤„I´0ÙM@wö)qü£j’N¦(Z6N´Ôc§ýÉ×i牆Ù"§¤4ͬД«‚‚Bê×–´š¬epPÐÌÀ@ÑÎQ¦•*ÃUÊhuz¶¾8?[«Tçf(£U±*eœ¾XÜÔ*§ës•i™YjÝj¥~µ213Y™”Ÿ \¿4éã„·UÿívÄÓrÔ:gwj*]¢£×Rª€.› §"¨H*ŠZDÅRqÔ'T•D-£R¨±nM¹S{©ßé4ú¼Û47­ÄW²SòÔ}™»]ªÆ‡½«l‰6|Í&?íÀFW"4t): PŽÔ°qצ,ÖÉ®%ýL¦¬š á9c ªk©öšLM;̦}Pì3ºžDn%>)Àr¢®Dÿ‰zÀ¾§¯‹åšu§¶ÖÚ ]<™ÿ—  (£”åöiÊRa°±iÝÇxè¿Óƒ§V³b;ø¦tàü!‰°Ó k.T!#lܶ¹¸j]ÉŠ€½pà·SV,Ã-Ç ’7e5V´ÛbÙß1ø¤’°¥dÒLâu*–c¾ûÑ~Þñª Kmr܆UQŽ(¬âÖ 5"Ò<¨@©Ân¦«ªV‹Â£t9m`æ¿&ÁÌšŽ´†UÀ:à]ÂñÜNâ{ï¿Ñ8Ñní`¹8 TGƒLC«— ¿¯àŽ$¤†.ˆXzmèÁÀwßö'$"±4\¾q·É¹µBÆœRØ´usIarR¥ ì´ñ‹¿a,Ѓ™%ˆñ ˜F|x®‡x?ñÇ <¡ï^+ŠÀo*H#c¼t~΀ÝP3…õ¶Ûð8c•‹…sŠËóÀ8oÁç!hÙ4Ùs@­PÏ?!v¦<rtm¢‡[˜ú6èìʃrÞÛ±7Sß*ºù`ä‰wóã÷Љ¾¨É8Òt°ÁŠÄ"B…X¡Ä!4 g"~#¤‰D½` û=« Š—üÛÏóò®6mò³°§óçú…}b¦"Ð ¼EÖ˜ F9¶NŸQÞ­?°²!§"¿ånmë,†R`³]­[àKžØeš"1»˜ÿ® …˜†Ç‹d\ÿPo_ïAsY4"²ÃpЯýOïM 6üžS*b«_9°ÒÁMʱN}‚½>ƒÔR­Žåwl3g¾"—gÖ•/ÁžÉ˜% "+qÓ«>YyXL?üs|”_@dtäü¬»§Ð Œ“_ºxöÊõ‹á!èI8Ð%ø… Œ‚§¢iý‰P” KJcØnwÓźSniþ±Ïõ°yôj‰c¸)÷/=Àc‘)q+°ÍM íΑQÒÎJÁâ­&a¹âX²Öl/*CÛcã7»Î´ò¸‡ÊF¥z›i„fm£9!£âºK¶2W5ƒ×oB®q³¿({=¢† pä¢^è­í±²Ü S¶;<~.êäíx9IÄËÏŠK ^ÎÝ6‹y@é gaO—gÌí#ìŒq±Ö íüGþ>‘¶‰O”óí{~’7¬ã ö Ó‰/™%Mg¸ÖûxŒkfD-òw°Ïñ‘ê ‡ùÏœUxï uÂÂ:<¿®ºŽAî‰z¯1{¼<ÀËÓæáð<Ú°Ûäüv5Uïöò:bÙQ½ÇÔhª=w¸Ök¬Ð<þ_’‘ r endstream endobj 741 0 obj <> stream xÚ…V TSg~1ðòDJŒÆñ=N]Ž 0Œ¶Ö¥ã‚ZEÅ ­ Š`°$†%R–(Ë [X«DܨVÔfZEKŽkÜꜭ¶£µN;=íÿœß9gþ48¶¼œÿœ·ü÷~÷Þï~÷PNN”@ øCØš ¡Á§¯ ’ÇËçø†îÜ¥Œ‹L²½šÅ£ø? øñ#xVÈsNÏ7àkÏ’þ­uOQŸ7ÈJýs´mýÒö¾K÷\OÊY  ·È’Rføùû¿µXžš»+Fá=Ãߦ¯/YçxoOõð󌌒ÉUɲXïÈøÞ~A~Þ«å*ò0Ö{Š<Þ{ûΘȸhoy´÷º½ÃÖ. ]ë½,48,díT¿ÿ;t»Zž´'2Ž`é'˜K½KͧQ¨HFæ–Jà¦<¨qÔxŠ£Þ¤fSÔbj µ”zZF-§VPÔ**ˆZMS!Ô*”ZK­£Â¨õdÿFj3Å ”5ФôÔw‚‚FlqO¸\Øì4Î)Ýéžs7=…> r…ˆ“Àé3Òà"p9èêâšæzÇmÏ(/ÔéH,@áH,Dw>“tǵʢâdÑí Ý­í¬{ÐÞgF•àï#䣟M”4¥RÙdÈN9…oÿ'@š“ auj#Û åÆ’JtûY€´¬´ clÆÑR‡^øºü©Óë^¯ïå‹U‚Ox!óPõåY:Ü…–IÑa´¼B§/ƒ¯ƒÊj5 陸&Þ!ý 'S*Pé³Ë X&Õå•0ÆzC÷ŠEt‘˜ÜWžS‚ ™TS”­%Ÿ¥ªÔ TÕÙÔ…—Iñi’›—³R¼’3 l ”–"ÛŽª²JÔ“è,,ü$•ÀÄÇyM‡¤3ÒÙT»ðFÍ¡¬òXðÊ¢c!+G‡]ž¥©´:d»[ †CÚÐ Jˆá9#?ºÁ×9F »e­`xñ–à Ñ: ~ƒnA¢NäW|ŒÑÒ…ŠŠp­†q¯ÚËŸ·ªøQ¼ý,VçT(š  ŽBQc¡q€¯’VœûK°ùX¾µxž±"¥U¼…¯é”tÓ¬öBŠŽA»D·ƒocï­“aa|cjsM{éÖTd„r`îœÞ½šÃóò±t LeÄ™ ®=a«à&˜1â…ͱfèÆÔ ¶ôPPÀÞ(#îÜ•ö>ä²½ó8½?FZ† Aý4Â"xdEZ«Ï@qäúö؉Ý‘i1ñ Z&êÌ)eÐûìÉ3p>ZŠînhªgÛ÷Ký$|òyr‹ÆÎ\°dÇÝóì€èâÅÞKW/.{‹µ¹¹b\³¢¸6AIƒº\ÉfÀ>ÈVjÔi‘K™õÞÕûçÚAc¸ZÐC}¾¶@›]ÛšULk}}ëI°/ZÇÍÄîßOA£Ñ„ö§†¡\^´Åày؃XÍW¦%€šÝÆké×°cZYÕ´,œ>¿Á‰5xôÃiˆbOAOí‘#$‡qv’½IëmµÂo¡w$âΰ÷ç.|/äóû,W®÷Ý6’¤²>¾*n ù/¢ÚG:.[™º2a ¼sXõ˜A§èúF8Š˜Àï°»ûL®Øã§)h ú㩇ÍÜ4Q‚+躿vìS€[u m½ƒÌäf @R—ü9Éå9 ž?7âÏì¦é¢ô„¡Vx‚Í“é}ñ$:“­1Úh}a©ÔÜddF#ƒ°%ƒÃ#OÓ×/i±E é ÀÔµè qJ?š{iuÿ™~´¾ßÓb ºdÅ—òc$­Êöõ¬¶íŽ—c+c€ñ]0“ƒèj™19;=+!²A^˜¿,2/ÔÌÌŸƒ‰˜yþÒ÷5š€WA<»„ŸÏ!ÉÈ)J'ÄˬÊ.Ï«†j(†ª’òVu{v;0¬×¿æ #Û”ÖÒXe(ÔkKrôÀ4Õ›9ˆ’°ˆˆ#zÌæžžsçz"ÂØŸ1/‰Z1yjÀ‰º;Nœ+fúè‡H³9[Ò.¾ sIÛK& ýtó©9„Ô[ÓvîfÐÊ_!µr›ãÍrdnZD³«·WŸÂâd™È‘îiv’Ø‹eýÑÅü¸À*¾ÄG¿¤ì›è–x’C{36c÷a¾ÌƒEãÄþx2ß 1)šär…B.oR˜LMM&vˆ "BªOÈéh'¡5È99wÙÅ’<å°¿ÃQ'}ðgôÔì OÎúO0Y$>õ›4_5ÔnU^Ì¿Ã"qÛÿá‘]'ÿfEu$DZ6-öð}б³ïì=OCNÈéñäÁ.ÒIþ|ýáƒþËW> šÁºã$ÛX!-`ÇNÄPú+Š.~r$£$þUî×ÿ&ê-ôï(¼xŒC㇜÷[G­ÈHðáö.çÏÐuÐ ª8VvhGÃ"¾ô$ì‰G};ÑÜðÑI½žÁ;‡åd¾½+ð^,Y·ù¯ó¯üüþ7×,7nöÌf_–M³Šýùtž‘Ô}pj6 «’ÃØv‘øª•NŽvø›‡ÑAz,D®´Øû‡+÷È(Š6iª‰5ÔšlùÜ‚8‹Ââù…UXH>·!O ôƵ'¢&•ø"KWTB7ÓÒaú†ýŠbµÊBy+™ùŒØ›ÌÇ:Î"ß5@«ŒHéò4;ë6C ±Ú_ÎÁúãÉU9‡÷šü+½%÷Nlbââc¦³«!ªAuQSŸ[)&*Î_¤†„Öz]™él̨'™Ûüí±AÎÍ­òDÓ­`½i?áÃDÒ•™l:¨ò dùáQÊX`¹™C)h¦È1fÞ¬ +¾>èfÞlÇdù «é _Ä\»wµÏÊÚǬÙF«ë‡Vqܰž¸õ+C6š÷¾3ÿƒØùÐÖ΢Æ×ÕÓ¾Wo±]p¼¤çºÅ{êÁÌÐØu¯ÙËÁkæ„|ÿ¦Í‡fµÐ±e"²8· +£‹£¼m4ïWE7AxÕÁA¨:‚Fc\Ûà1î…ý>SÈ—ðl‡/5‹G9쟥·â“Îtnkú'9‡ÔçÖDÃ.ÈU§¯ÉŒÎØ’›ÄЛÐIç³Ã¼²‹S3˜¸ øžng#)’WUÔö5ÝÕÖkõäxZ$¯ *UÖeœ Ñ6‚îètO:xZsÇ*‹Ñ¯±z¬¶  (9¤±˜¦ÓHPd”î3ä–ä“à`3ž&•¿{@E`hÚTç}Cr¿ZZX]¢«CbJµmO·mO±Íß’ü6âÇ?IµùÅ@~ŠyêxeT|fR¾®Nšß•TAdVžš’Õqžóå¶{h*¿FZ &rÀ/+Ôë ‘qϬäW¢¿ê‹´4ëâ´Nî6Rçæn®«ëÑš ­¶°°X[[XææÖÝTXTR\X£-7#‹Û(¾qÌWÃþ endstream endobj 748 0 obj <> stream xÚ]Ënƒ0E÷þŠY¦‹ -m$„”‚Xô¡’|€±b)˘_?¢,º°uf|çá›Ô]Ó)i!ù1 ïÑÂ(•0¸.›áNR‘4!¹½Gáæ3Ó$©?™þb3B‚Šßæ™Ùëº?_ÎmZ€À1 λFÈîq×ôûjqîÔ¸@Y€ä×õ[­ÙápË€O>÷m©&8\ê>dúMëΨ,PRU¡]7â‹ÀU3ކ© IIieÛV•ø÷ö+†‘_™qÊÆ)3Ú4)s8Ï<Žiž¿;.2ŸÏéÉsùÃóKä y| 3ïÝýtïÒÃ$¾ãöVgü'¤Â‡ÛzѾ*œ?v|— endstream endobj 757 0 obj <> stream xÚ]P=ƒ0 Ýó+<ö†S€¡B:Q!1܇Žö„ÄÐH™0ð廊à ¶äç÷l?˶¿ôd#ÈözÀ“%øø•5ˆ³%QV`¬ŽG•³v*Ù~ªð¥‚DÒÇîývíÊ3œžÍ몣î/öDt=MêZÈß}ÖyƒÓ‡ñ#¾%ì› ²¥N·vÈȰ†ð@‡¡M“Ç•Ïk´7¸¥‘Í(ê¢h îºF ™½C1Nú®xg–;³ªŠsæhR%g/czeÞ÷fûÙQZn _ >$UŽ?rÉl¤ endstream endobj 765 0 obj <> stream xÚ]PËjÃ0¼ë+ö˜Š,—–Œ 8|èƒ:ùYZ;‚è,Cý÷µdJZfW³ÃÌÒº=µVG _ÁÉ# Úª€“›ƒDèqÔ–°”–qïr•FxBëwá?„A håͯøóx97ìá¼x„rïÛS·LMkUEè÷ª7ŰÀá¨\iömG8\ê.OºÙû´ Ây–c›#éN^H ÂŽHª¢àP5 'hÕ¿¿§m£äUR='fY2ÆWüú¿e\l;;©¥Ô÷Ðraõ“O““&SÚâýzÞù´•ß/Ðs endstream endobj 714 0 obj <> stream xÚÝš[oÛ¸€ßϯàûA,Þ/Àb\›¦¹t·I·èƒb+©°²•µä³É¿?3”lK²ä*É1NQ‘y‘3‡’±a‚Pb˜&Ârø¶ÄÈsJ¬–ðÍ £k4aÆjHX©a^ž3 2‚n¶ ·d„†Ã*¶Ø°aG%‘D0ìL "¸²D!4} e$}Œt‡ ë@ F$Õ 4‘rŒ),8"•õ Â(P”Hk,Hh¢¨«#Š9%†(UJA‰#J;ÐP ¢¬ÐRS ]+E4Õè¥(b £ØÅÀR­‘—rD[ ÚA Œö4Afƒ.F£Yh´n4Ú áMË(”À Îb± µcÀ89$V¢ÒÀP€}Þ´ÆŒa‡äµ%µcÌ ®q@JqZ@;0fÎRø qÁ›Œ2ŠS$ñ㌽HLiŽ` ¹B`cX«ÀxƽUX&¸ _¥” NTýhÊj•S†mH¼ìÃØòiüSQZ¦°†ú4L –;€Q’bÀ¼„nþ ¤×K[ 9ghY[ÑÜò²M˱=å%ë2 jРݰ—Za™Å^¤?3j…Äþ$c¨1Ç–¸³Àý¼ ß·¨¯¢…žR1,Óä…fP¦ ’,¤ ’st °Çoÿúj…ˆBs­½Ì[?KªÂÚ+ŸUÖží÷Ç×#T{ÿµPm‘¯ü¸I¹ò·¢¤)WpRJá˜ÒBR8Ä„Ãw—vã o [«Þè·ÍdÇ×?k%jWy–e w ü xVF ò`Å™e”)}à­Åhi1zŸñ>Þ©P_Á hà`ïJÙêk ¼›Îš¡ïn<¡FSX±ý³UÃÚ|Ò9¯—pΘ+{çÇSHŽ3˧°uozíÔg-Öè9k¯†R«Ž—^wÔW”u’—u…º´RøF[‹6K™²Ÿ¶qñú¼„7m™2~Td¥¶äÁäŠ]õ´–RÐ'„` žHÑà žëšB§"]<é/õ)H4f¦§I+^µMX/çžkxØLùHbŒ@>öX{–þn¬+#„uN½§kÊz#­÷BKlö”«Ö‰¯8NO ¡ƒ—Ïj ­•­à‡ÚÂWeG…Dñ¤>ÔÁÔe¸ÀÞƒ“¢Xâ[ÃÀéC8¿xâ‚Úçùc|Œ*µ…Y±ñ`~}‡µË?Jª¹_ýþ{þVƒN;ê5[F6ø†­öÀ`t¶¶˜‘ÔúhÝ>õ6—%kÙòŠ?wkV}ÒŽG»ôî¼­´ê·ß‚Ñócœ¤³<¸^Üå˜ÁÜÄ“ü{!…‡ÁI<ÏòÃïá–ãà<\¦¥ŽgãtÏüaEÂ,ò ~yuüîßç×á,ctï M&¾«£(ÏãÇ<û#'¼ôûï5]ÖÁaøxÅßsPEûÙ8šI”ÁôƒÌûdDúFÒ§¯{Ž„{ÜÜà(‡&ùÍמÄI$ a]˜ %—á4jµ¡¡l8Ó'u_p£›“‹ÑpÙ©ÙF‹$œo²“og§ZÙ™6t|aOP<•ã¡–)WGgëè:¬èIÏ5éÑ5=ÆÌz7W£‹Ñù²_ÞMOíÊól«ã1†ôð¤Ws<ãAzVô¢g(kÐcUßSt ½?oŽ.® ßa: gàñøto|V¼Ÿv%>]Å'ü¼ÅC|ÜÔññ:¾.3zò ~5çãU|Å,¥Ÿf1”E¸3¬=ž½ûü4¹óï×ÏÓ»4ɶauý±®¼’® ÒÑ=ØMR¡y æPÖÐ YîÈžƒU‘1¼13ªÎUÖ¹n·¦'Ýׇ”‹ýËá‡QeX[cŠ¢ýê—Å&Û|ÓjôMXµŸÚBÔ6bJ«=Ñ™W£ûp9:ût[éµ°oû_Ïë†*Ýæ…RÙr~ [\kÖ6‚K‡5=)6ƒ‹[CtÛBËñéåÙáªWÛ9‰ßÕÚ¸ Ì5ÿSÞÿ8¬Îl²cÐÒaE?vlkhÙêÃã?Fë5™wL^±³ÉK[‹AxÖ§lœ¼õÀÂ¥ÕˆžèšQ“uXáÕ°¢dÝííçÑåu¹ì¶m‰!Jíx ëÖ@"8€Tx? ñŸ:´ÎQÕ9nµ¨'OÝäYÅYÝä(ÝŒÒÊÔ¼>?Ý¿ê±íQögÚö0S§ÚeFO ¶¨â/âùîtt0<è±RºŸj¥tuœVô£Éiƒ¦²þÙ˜î‡û?~<©MŽn„šîx¶Þºm”ålgŒnÌvÎÇè-õ¤É›B×áœÍ°svôáôv9ˆº›#Û•+‚ø¦+*XÁá<¨e‹+rQ'ØaEOxòÕçÁ›«ËÃÛÕŠâºéílËãhÛD–b9‘ýÿù­ÓSÍÓt«=éé-79Œ³mç•Ó˜Öývì¹µx<Õ?`«Ö=·vKˆøë‹fpáàÒnLO†ÍТ* ­« Ô²[´jì#O®/‡åbrü”G³,N·ÅlÝûª‚þèD½5Xû%Ñ¥ý7 ¯ãl—™Ñ¬hF!úîǯÎ.†Ç7¨@:K·á3½½“±•wBrå6·ý·< /Êð.BøßÆèEш,Fô„·-¨H÷¢ÏñáÑõÍQ0c¦0#a¦ÃŠž87 «]œmÛò ÏoöWK…u[º¯—´¬—´ÜðpÉ66<¢p¶™ÓæFÔ©lë!û‡w§ÃwûžÕoíº7”†îð ²õò9ÎÿO~g\m# m5¦'Ûf4r¦}koÌöa]^åWH¿œÜ~yþãÅÓ°Ÿiñl„ #úA”ôÕÛ¢OÜ ¯nË~»÷”†ïŠ‘Ý슟Ìn°“ÀÓnC¡,ÚéBGñý}4fã(ûê‚i8ž§3Üÿ½Hóhr—$Ñ}¾Ê̽y`E4„Ùw¼ï½ƒû„WÈ®|ßýöBh0g‹Œð`ºHòø1y`¡áì¯)Ì0bƒq<'ÑcBL”¹qúø<Ï ³Á<ºO¢§lq—E ) ’(Ë¢¿a<Ì£òÜ—„óyúO¡°PEn’þ3ÕíqÓxvÏâü9C¦8€J³è!Ìac”%h?l³ø?Ñ<ƒö£§å1¤“ô!‡É, eÒ4½gÑ_'°ú—2àZ0&i:÷¬}Ê«Œ£8‰ÑSîWé¢ânŽ=Ý"UÁ¨îÊÈvŽÿ*TÄÍà öôÒ¡`2˜DIâ€O„› ‹¦!ÞÌ l^·ñ›|†aE$¬0Yf°â® ë®ÂpO*5«\ôD, ²Xˆ#–GO9±v]0‰³Ç$|_I'‹q^fQõÿW—ñ- endstream endobj 773 0 obj <]/Size 774/W[1 3 2]/Filter/FlateDecode/Length 1722>> stream xÚ5ØWPTWÀñóÝ«(¢" * J/‚€ˆ ‚½€]¬(ØMì&$(¢XP°÷‚b¢h,Ø»N|Ë[b¢“IâKúL’™üŸo_~óÍÿ\×…½{ö,Æóîcœ\ó%~é;4í±vc|qŒñ6FäeÙû¹ùʾ¬úcg1’«×«ýè])ºØ[¢¶ÂÖèmÐÛb;l¾Øý°#vB ÀÎØí3 Ä Æn‚¡†Ý1{ˆñê«?]O~º,æŒÄ(ŒÆŒÅ8ŒÇLÄ^˜„ÉØS0Ó°¦c_ÌÀ~˜‰öùôÇ8³1á`‚CqÇ8GáhÌÅ<ƒcÅø,×ßÉ8~'öp"NÂɘSp*NÃé8gbÎÂÙXˆE8çâ<œ p!.ã—¥Ïp1Ï0‡{2íë^̊ݱF`Æ`&ˆ ¸ªYÂc¢÷ÒZûú`1‘“´,¥ áÊd1I‰Ú? “æjù2BLæ.-Ë(#ÅäLײœ2JÌgZVPF‹ñ–•”±Ì«p5®ÁµbÆÓ+?âÊq<·LÃt1Ónè5sÍx1söj)¥LS¡åŠ}­?Å2\‡ëŬˆÒ+˹rª˜Ò -(ÓÄTj© LS3TËFÊ 1ÿÓ²‰R ¦öG-•{·lÆ-bοÑÕ­¬Šilвbï¥*Ü.¦é]ÝÁê\1´TSìÝUƒ;Å|åy5w±Ú|×}ý›–Ý”bæ=¸÷á~1ßfꕸr óA<$æõ*]=ÌêR1?4j9BY&æç2-G)ËÅü¾OË1Ê 1¿Òrœbï‡X+ÒÂèêIVír ëD|ªtõ4«¥"Þj9C±¯õY<'êy´ó¬–‰ÄÄi¹@Y'’ä¹·/RÊE2*´\¢T0×cƒHö¯ºú«¹?3DFÖk¿Lß$2i»–+”J‘)·µ4R¶1_Åk"ž÷Ôç¬V‰Ì¿§å:eó ¼)RR¬«·X­Y®¥‰R#Rîy„Û”Ý"[=ûÀÊ‘šT-w){Eh¹GÙ'Rçy÷ݧì¹tB‹ý¤>,rùw-öü(ó‘FÏ;ë!ý8ó#|ŒOøfŠ4Õ+Ÿre-ó3|.òÈój¾`õ¤È+v*)j> 8 ïô$pZäu²vûéFä§"-å³+ò6O{ úæ–è%òÛJ]mÅêE‘ŽkiMùŒÙ[7E{úeqÚ„hñ¡\§c7-m)W™Û‰ãÿ—ööôkâ{kñ¥Ü'4FKÊMqÂK´øQn‰­¥#¥IœØB-(·Å‰Ôâý±×âGø1–b~ŠëpnÀ͸·bg¬À˜‚©˜†³°vÁt싘‰YØ7aW ÄQ8s1ÇàX¬Ä \ˆ³q.Æb,Á%ŒKqVávÜÕ¸»á.Ü{p/À8ŒÇ Å$LÆÞ80Ãp(Ãá8Gb/,ÄîX„àœ‹óp>îÃpÜ1㜌S°öÄi8â!ü?Á2ŒÀõ¸Çáxœ€qFb>NÅé8kp.Ç(\+1Ëq®Æ51‹öÓÍÞ™ÇñÅcxO`-žÄSX‡öÊ‹ù žE»óœG»Û\ÄKX h÷–Ëø96¢Ý7®áuüoàM¼…Mxïà]¼‡÷ñ |†ð!>ÂÇøížl÷Æçh÷a»ëŠ8×ël÷Xí¾€vµ;§7ÚÝÒîvWl‡v'´»ŸÝñüÑîuv³{ZvÆnØ»b a0ÚoL!ŠaØñFb,Fa4Æ`/ŒÃxLÀDLÂTLÆÞ˜‚ih?I§`ÌÀL†0‡bæb>ŽÁÉ8í y&ÎÇY8‹Ðží ý>bÏÿö{„=‡¯E{z_‡p=Ú3ö´gæÍhOžö|»wâA´gK{®¨C{z´çÃSxëñ,Ú“˜=ÅÙ³PÚ“’=MÙÓ‹=Õ<'ë’ÞÅÉûWçGâäßÒù±8³‚t~"κ7:?§ªNçgâÔVëü\œÆb_ˆóüæ—Íg·âÎûÈ÷ÑZšß þ¡³#nËl]q½ un!®_ƒÎ-Åõ«³—¸Éõ:·w°«skq‡ÖÙ[Ü…ž¹¸‹óuö·¤Zç¶â.=­s;qW–êÜ}Ñ;aw½¯^Ù1C0 b8f‹[>[ÿUOŒÄhŒÅxLÄq7TêõIØS±Ú¿çØ¿Ûd‰[=Ù˜ÿ©QF endstream endobj startxref 232532 %%EOF glpk-5.0/doc/gmpl_es.tex0000644000062000006210000047621713766346220014440 0ustar maomkpasswd%* gmpl_es.tex *% %*********************************************************************** % This code is part of GLPK (GNU Linear Programming Kit). % % Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, % 2009, 2010, 2011, 2013, 2014, 2015 Andrew Makhorin, Department for % Applied Informatics, Moscow Aviation Institute, Moscow, Russia. All % rights reserved. E-mail: . % % GLPK is free software: you can redistribute it and/or modify it % under the terms of the GNU General Public License as published by % the Free Software Foundation, either version 3 of the License, or % (at your option) any later version. % % GLPK is distributed in the hope that it will be useful, but WITHOUT % ANY WARRANTY; without even the implied warranty of MERCHANTABILITY % or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public % License for more details. % % You should have received a copy of the GNU General Public License % along with GLPK. If not, see . %*********************************************************************** \documentclass[11pt,spanish]{report} \usepackage[utf8]{inputenc} \usepackage[T1]{fontenc} \usepackage{lmodern} \usepackage{amssymb} \usepackage[dvipdfm,linktocpage,colorlinks,linkcolor=blue, urlcolor=blue]{hyperref} \usepackage{indentfirst} \setlength{\textwidth}{6.5in} \setlength{\textheight}{8.5in} \setlength{\oddsidemargin}{0in} \setlength{\topmargin}{0in} \setlength{\headheight}{0in} \setlength{\headsep}{0in} \setlength{\footskip}{0.5in} \setlength{\parindent}{16pt} \setlength{\parskip}{5pt} \setlength{\topsep}{0pt} \setlength{\partopsep}{0pt} \setlength{\itemsep}{\parskip} \setlength{\parsep}{0pt} \setlength{\leftmargini}{\parindent} \renewcommand{\labelitemi}{---} \def\para#1{\noindent{\bf#1}} \renewcommand\contentsname{\sf\bfseries Contenidos} \renewcommand\chaptername{\sf\bfseries Capítulo} \renewcommand\appendixname{\sf\bfseries Apéndice} \begin{document} \thispagestyle{empty} \begin{center} \vspace*{1.5in} \begin{huge} \sf\bfseries Lenguaje de Modelado GNU MathProg \end{huge} \vspace{0.5in} \begin{LARGE} \sf Referencia del Lenguaje \end{LARGE} \vspace{0.5in} \begin{LARGE} \sf para GLPK Versión 4.57 \end{LARGE} \vspace{0.5in} \begin{Large} \sf (BORRADOR, octubre del 2015) \end{Large} \end{center} \newpage \vspace*{1in} \vfill \noindent El paquete GLPK es parte del Proyecto GNU distribuido bajo la égida de GNU \noindent Copyright \copyright{} 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2013, 2014, 2015 Andrew Makhorin, Department for Applied Informatics, Moscow Aviation Institute, Moscow, Russia. Todos los derechos reservados. \noindent Título original en inglés: Modeling Language GNU MathProg - Language Reference for GLPK Version 4.50 \noindent Traducción: Pablo Yapura, Facultad de Ciencias Agrarias y Forestales, Universidad Nacional de La Plata, La Plata, Argentina. \noindent Copyright \copyright{} 2013, 2014, 2015 Pablo Yapura, para esta traducción. Todos los derechos reservados. \noindent Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. \noindent Se permite realizar y distribuir copias textuales de este manual siempre que se preserve este aviso de permiso y el aviso del copyright en todas las copias. \noindent Se permite copiar y distribuir versiones modificadas de este manual bajo las condiciones de copias textuales, siempre que también se distribuya íntegro el trabajo derivado resultante bajo los términos de un aviso de permiso idéntico al presente. \noindent Se permite copiar y distribuir traducciones de este manual en otro idioma bajo las condiciones establecidas arriba para versiones modificadas. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newpage {\setlength{\parskip}{0pt} \tableofcontents } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Introducción} {\it GNU MathProg} es un lenguaje de modelado diseñado para describir modelos lineales de programación matemática.\footnote{El lenguaje GNU MathProg es un subconjunto del lenguaje AMPL. Su implementación en GLPK está basada principalmente en el paper: {\it Robert Fourer}, {\it David M. Gay} \& {\it Brian W. Kernighan}, ``A Modeling Language for Mathematical Programming.'' {\it Management Science} 36 (1990), pp.~519-554.} La descripción del modelo escrita en el lenguaje GNU MathProg consiste en un conjunto de sentencias y bloques de datos construidos por el usuario a partir de los elementos del lenguaje que se describen en este documento. En un proceso que se denomina {\it traducción}, un programa denominado {\it traductor del modelo} analiza la descripción del modelo y la traduce en una estructura interna de datos, la que puede ser usada tanto para generar una instancia de un problema de programación matemática, como para obtener directamente una solución numérica del problema mediante un programa denominado {\it solver}. \section{El problema de la programación lineal} \label{problem} En MathProg el problema de la programación lineal (PL) se expresa como sigue: \medskip \noindent\hspace{1in}minimizar (o maximizar) $$z=c_1x_1+c_2x_2+\dots+c_nx_n+c_0\eqno(1.1)$$ \noindent\hspace{1in}sujeto a las restricciones lineales $$ \begin{array}{l@{\ }c@{\ }r@{\ }c@{\ }r@{\ }c@{\ }r@{\ }c@{\ }l} L_1&\leq&a_{11}x_1&+&a_{12}x_2&+\dots+&a_{1n}x_n&\leq&U_1\\ L_2&\leq&a_{21}x_1&+&a_{22}x_2&+\dots+&a_{2n}x_n&\leq&U_2\\ \multicolumn{9}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}\\ L_m&\leq&a_{m1}x_1&+&a_{m2}x_2&+\dots+&a_{mn}x_n&\leq&U_m\\ \end{array}\eqno(1.2) $$ \noindent\hspace{1in}y a las cotas de las variables $$ \begin{array}{l@{\ }c@{\ }c@{\ }c@{\ }l} l_1&\leq&x_1&\leq&u_1\\ l_2&\leq&x_2&\leq&u_2\\ \multicolumn{5}{c}{.\ \ .\ \ .\ \ .\ \ .}\\ l_n&\leq&x_n&\leq&u_n\\ \end{array}\eqno(1.3) $$ \noindent donde $x_1$, $x_2$, \dots, $x_n$ son variables; $z$ es la función objetivo; $c_1$, $c_2$, \dots, $c_n$ son coeficientes de la función objetivo; $c_0$ es el término constante (``de traslación'') de la función objetivo; $a_{11}$, $a_{12}$, \dots, $a_{mn}$ son coeficientes de las restricciones; $L_1$, $L_2$, \dots, $L_m$ son cotas inferiores de las restricciones; $U_1$, $U_2$, \dots, $U_m$ son cotas superiores de las restricciones; $l_1$, $l_2$, \dots, $l_n$ son cotas inferiores de las variables y $u_1$, $u_2$, \dots, $u_n$ son cotas superiores de las variables. Las cotas de las variables y las cotas de las restricciones pueden ser tanto finitas como infinitas. Además, las cotas inferiores pueden ser iguales a las correspondientes cotas superiores. Entonces, están permitidos los siguientes tipos de variables y restricciones: \medskip {\def\arraystretch{1.4} \noindent\hspace{54pt} \begin{tabular}{@{}r@{\ }c@{\ }c@{\ }c@{\ }l@{\hspace*{39.5pt}}l} $-\infty$&$<$&$x$&$<$&$+\infty$&Variable libre (no acotada)\\ $l$&$\leq$&$x$&$<$&$+\infty$&Variable con cota inferior\\ $-\infty$&$<$&$x$&$\leq$&$u$&Variable con cota superior\\ $l$&$\leq$&$x$&$\leq$&$u$&Variable doblemente acotada\\ $l$&$=$&$x$&=&$u$&Variable fija\\ \end{tabular} \noindent\hspace{54pt} \begin{tabular}{@{}r@{\ }c@{\ }c@{\ }c@{\ }ll} $-\infty$&$<$&$\sum a_jx_j$&$<$&$+\infty$&Forma lineal libre (no acotada)\\ $L$&$\leq$&$\sum a_jx_j$&$<$&$+\infty$&Restricción de inecuación ``mayor o igual que''\\ $-\infty$&$<$&$\sum a_jx_j$&$\leq$&$U$&Restricción de inecuación ``menor o igual que''\\ $L$&$\leq$&$\sum a_jx_j$&$\leq$&$U$&Restricción de inecuación doblemente acotada\\ $L$&$=$&$\sum a_jx_j$&=&$U$&Restricción de igualdad\\ \end{tabular} } \medskip Además de problemas puros de PL, MathProg también permite problemas de programación entera lineal mixta (PEM), en los que algunas o todas las variables se han restringido a ser enteras o binarias. \section{Objetos del modelo} En MathProg el modelo se describe mediante conjuntos, parámetros, variables, restricciones y objetivos, los que se denominan {\it objetos del modelo}. El usuario introduce objetos particulares del modelo usando las sentencias del lenguaje. Cada objeto del modelo está provisto de un nombre simbólico que lo identifica de manera única y está pensado con propósitos de referencia. \newpage Los objetos del modelo, incluyendo los conjuntos, pueden ser arreglos multidimensionales construidos sobre conjuntos indizantes. Formalmente, el arreglo $n$-dimensional $A$ es el mapeo $$A:\Delta\rightarrow\Xi,\eqno(1.4)$$ donde $\Delta\subseteq C_1\times\dots\times C_n$ es el subconjunto del producto cartesiano de los conjuntos indizantes, $\Xi$ es el conjunto de los miembros del arreglo. En MathProg, el conjunto $\Delta$ se denomina {\it dominio del subíndice}. Sus miembros son los $n$-tuplos $(i_1,\dots,i_n)$, donde $i_1\in C_1$, \dots, $i_n\in C_n$. Si $n=0$, el producto cartesiano tiene exactamente un miembro (específicamente, un 0-tuplo), de forma tal que es conveniente pensar en los objetos escalares como arreglos 0-dimensionales que tienen un solo miembro. El tipo de los miembros del arreglo se determina por el tipo del objeto del modelo correspondiente como sigue: \medskip \noindent\hfil \begin{tabular}{@{}ll@{}} Objeto del modelo&Miembro del arreglo\\ \hline Conjunto&Conjunto plano elemental\\ Parámetro&Número o símbolo\\ Variable&Variable elemental\\ Restricción&Restricción elemental\\ Objetivo&Objetivo elemental\\ \end{tabular} \medskip Para referir al miembro particular de un objeto, el mismo debe estar provisto de {\it subíndices}. Por ejemplo, si $a$ es un parámetro 2-dimensional definido sobre $I\times J$, una referencia a sus miembros particulares se puede escribir como $a[i,j]$, donde $i\in I$ y $j\in J$. Se sobreentiende que los objetos escalares no necesitan subíndices por ser 0-dimensionales. \section{Estructura de la descripción del modelo} A veces es deseable escribir un modelo que, en distintos momentos, puede requerir diferentes datos para solucionar cada instancia del problema usando el modelo. Por esta razón, en MathProg la descripción del modelo consta de dos partes: la {\it sección del modelo} y la {\it sección de los datos}. La sección del modelo es la parte principal de la descripción del modelo que contiene las declaraciones de los objetos del modelo; es común a todos los problemas basados en el modelo correspondiente. La sección de los datos es una parte opcional de la descripción del modelo que contiene los datos específicos para una instancia particular del problema. Dependiendo de lo que sea más conveniente, las secciones del modelo y de los datos pueden disponerse en el mismo archivo o en dos archivos separados. Esta última característica permite tener un número arbitrario de secciones con datos diferentes para ser usadas con la misma sección del modelo. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newpage \chapter{Codificación de la descripción del modelo} \label{coding} La descripción del modelo se codifica en formato de texto plano usando el juego de caracteres ASCII. Los caracteres válidos en la descripción del modelo son los siguientes: \begin{itemize} \item caracteres alfabéticos:\\ \verb|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|\\ \verb|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 _| \item caracteres numéricos:\\ \verb|0 1 2 3 4 5 6 7 8 9| \item caracteres especiales:\\ \verb?! " # & ' ( ) * + , - . / : ; < = > [ ] ^ { | } ~? \item caracteres no imprimibles:\\ \verb|SP HT CR NL VT FF| \end{itemize} Dentro de los literales de cadena y de los comentarios, cualquier carácter ASCII (excepto los caracteres de control) son válidos. Los caracteres no imprimibles no son significativos. Se pueden usar libremente entre las unidades léxicas para mejorar la legibilidad de la descripción del modelo. También se usan para separar unidades léxicas entre sí, en caso de no existir otra forma de hacerlo. Sintácticamente, la descripción del modelo es una secuencia de unidades léxicas de las siguientes categorías: \begin{itemize} \item nombres simbólicos; \item literales numéricos; \item literales de cadena; \item palabras clave; \item delimitadores; \item comentarios. \end{itemize} Las unidades léxicas del lenguaje se discuten a continuación. \section{Nombres simbólicos} Un {\it nombre simbólico} consiste de caracteres alfabéticos y numéricos, el primero de los cuales debe ser alfabético. Todos los nombres simbólicos deben ser distintos (sensibilidad a las mayúsculas). \para{Ejemplos} \begin{verbatim} alfa123 Esto_es_un_nombre _P123_abc_321 \end{verbatim} Los nombres simbólicos se usan para identificar los objetos del modelo (conjuntos, parámetros, variables, restricciones y objetivos) y los índices. Todos los nombres simbólicos (exceptuando los nombres de los índices) deben ser únicos, {\it i.e.} la descripción del modelo no debe tener objetos distintos con el mismo nombre. Los nombres simbólicos de los índices deben ser únicos dentro del alcance en el que son válidos. \section{Literales numéricos} Un {\it literal numérico} sigue la forma {\it xx}{\tt E}{\it syy}, donde {\it xx} es un número con punto decimal optativo, {\it s} es el signo {\tt+} o {\tt-} e {\it yy} es un exponente decimal. La letra {\tt E} es insensible a las mayúsculas y se puede codificar como {\tt e}. \para{Ejemplos} \begin{verbatim} 123 3.14159 56.E+5 .78 123.456e-7 \end{verbatim} Los literales numéricos se usan para representar cantidades numéricas y tienen significado fijo obvio. \section{Literales de cadena} Un {\it literal de cadena} es una secuencia arbitraria de caracteres encerrados entre comillas, tanto simples como dobles. Ambas formas son equivalentes. Si una comilla simple es parte de un literal de cadena encerrado entre comillas simples, se debe codificar dos veces. Análogamente, si una comilla doble es parte de un literal de cadena encerrado entre comillas dobles, se debe codificar dos veces. \para{Ejemplos} \begin{verbatim} 'Esta es una cadena' "Esta es otra cadena" 'No debe usarse los 20''s' """Hola, che"" cantaba Favio." \end{verbatim} Los literales de cadena se usan para representar cantidades simbólicas. \section{Palabras clave} Una {\it palabra clave} es una secuencia de caracteres alfabéticos y posiblemente algunos caracteres especiales. Todas la palabras clave caen en alguna de dos categorías: las {\it palabras clave reservadas}, que no pueden usarse como nombres simbólicos, y las {\it palabras clave no reservadas}, que son reconocidas por el contexto y entonces pueden usarse como nombres simbólicos. Las palabras clave reservadas son las siguientes: \noindent\hfil \begin{tabular}{@{}p{.7in}p{.7in}p{.7in}p{.7in}@{}} {\tt and}&{\tt else}&{\tt mod}&{\tt union}\\ {\tt by}&{\tt if}&{\tt not}&{\tt within}\\ {\tt cross}&{\tt in}&{\tt or}\\ {\tt diff}&{\tt inter}&{\tt symdiff}\\ {\tt div}&{\tt less}&{\tt then}\\ \end{tabular} Las palabras clave no reservadas se describen en secciones posteriores. Todas las palabras clave tienen un significado fijo, el que se explicará en las discusiones de las correspondientes construcciones sintácticas donde las palabras claves sean usadas. \section{Delimitadores} Un {\it delimitador} es tanto un carácter especial individual como una secuencia de dos caracteres especiales, como sigue: \noindent\hfil \begin{tabular}{@{}p{.3in}p{.3in}p{.3in}p{.3in}p{.3in}p{.3in}p{.3in} p{.3in}p{.3in}@{}} {\tt+}&{\tt**}&{\tt<=}&{\tt>}&{\tt\&\&}&{\tt:}&{\tt|}&{\tt[}&{\tt>}{\tt>}\\ {\tt-}&{\tt\textasciicircum}&{\tt=}&{\tt<>}&{\tt||}&{\tt;}&{\tt\char126} &{\tt]}&{\tt<-}\\ {\tt*}&{\tt\&}&{\tt==}&{\tt!=}&{\tt.}&{\tt:=}&{\tt(}&{\tt\{}\\ {\tt/}&{\tt<}&{\tt>=}&{\tt!}&{\tt,}&{\tt..}&{\tt)}&{\tt\}}\\ \end{tabular} Si el delimitador está compuesto por dos caracteres, no debe haber espacios entre ellos. Todos los delimitadores tienen un significado fijo, el que se explicará en las discusiones de las correspondientes construcciones sintácticas donde los delimitadores sean usados. \section{Comentarios} Con propósitos de documentación, la descripción del modelo puede ser provista de {\it comentarios}, los que pueden ser de dos formas diferentes. La primera es un {\it comentario de una línea individual}, el que debe comenzar con el carácter {\tt\#} y se extiende hasta el final de la línea. La segunda forma es un {\it comentario en secuencia}, el que consiste en una secuencia de caracteres cualesquiera encerrados entre {\tt/*} y {\tt*/}. \para{Ejemplos} \begin{verbatim} param n := 10; # Esto es un comentario /* Esto es otro comentario */ \end{verbatim} Los comentarios son ignorados por el traductor del modelo y pueden aparecer en cualquier sitio de la descripción del modelo en la que que se permitan caracteres no imprimibles. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newpage \chapter{Expresiones} Una {\it expresión} es una regla para calcular un valor. En la descripción de un modelo, las expresiones se usan como constituyentes de ciertas sentencias. En general, las expresiones están compuestas por operandos y operadores. Dependiendo del tipo del valor resultante, todas las expresiones pertenecen a alguna de las siguientes categorías: \vspace*{-8pt} \begin{itemize} \item expresiones numéricas; \item expresiones simbólicas; \item expresiones indizantes; \item expresiones de conjuntos; \item expresiones lógicas; \item expresiones lineales. \end{itemize} \vspace*{-8pt} \section{Expresiones numéricas} Una {\it expresión numérica} es una regla para calcular un valor numérico individual representado como un número de punto flotante. La expresión numérica primaria puede ser un literal numérico, un índice, un parámetro no-indizado, un parámetro indizado, una función interna de referencia, una expresión numérica iterada, una expresión numérica condicional u otra expresión numérica encerrada entre paréntesis. \newpage \para{Ejemplos} \noindent \begin{tabular}{@{}ll@{}} \verb|1.23|&(literal numérico)\\ \verb|j|&(índice)\\ \verb|tiempo|&(parámetro no-indizado)\\ \verb|a['Mayo de 2003',j+1]|&(parámetro indizado)\\ \verb|abs(b[i,j])|&(función de referencia)\\ \verb|sum{i in S diff T} alfa[i] * b[i,j]|&(expresión iterada)\\ \verb|if i in I then 2 * p else q[i+1]|&(expresión condicional)\\ \verb|(b[i,j] + .5 * c)|&(expresión parentética)\\ \end{tabular} Empleando ciertos operadores aritméticos se pueden construir expresiones numéricas más generales conteniendo dos o más expresiones numéricas primarias. \para{Ejemplos} \begin{verbatim} j+1 2 * a[i-1,j+1] - b[i,j] sum{j in J} a[i,j] * x[j] + sum{k in K} b[i,k] * x[k] (if i in I and p >= 1 then 2 * p else q[i+1]) / (a[i,j] + 1.5) \end{verbatim} \subsection{Literales numéricos} Si la expresión numérica primaria es un literal numérico, el valor resultante es obvio. \subsection{Ãndices} Si la expresión numérica primaria es un índice, el valor resultante es el valor corriente asignado al índice. \subsection{Parámetros no-indizados} Si la expresión numérica primaria es un parámetro no-indizado (el que debe ser 0-dimensional), el valor resultante es el valor del parámetro. \subsection{Parámetros indizados} La expresión numérica primaria que se refiere a parámetros indizados tiene la siguiente forma sintáctica: $$ \mbox{{\it nombre}{\tt[}$i_1${\tt,} $i_2${\tt,} \dots{\tt,} $i_n${\tt]}} $$ donde {\it nombre} es el nombre simbólico del parámetro e $i_1$, $i_2$, \dots, $i_n$ son subíndices. Cada subíndice debe ser una expresión numérica o simbólica. El número de subíndices en la lista de subíndices debe ser igual a la dimensión del parámetro con el cual está asociada la lista de subíndices. Los valores reales de las expresiones de subíndices se usan para identificar al miembro particular del parámetro que determina el valor resultante de la expresión primaria. \subsection{Funciones de referencia} En MathProg existen las siguientes funciones internas, las que se pueden usar en expresiones numéricas: \begin{tabular}{@{}p{112pt}p{328pt}@{}} {\tt abs(}$x${\tt)}&$|x|$, valor absoluto de $x$\\ {\tt atan(}$x${\tt)}&$\arctan x$, valor principal del arcotangente de $x$ (en radianes)\\ {\tt atan(}$y${\tt,} $x${\tt)}&$\arctan y/x$, valor principal del arcotangente de $y/x$ (en radianes). En este caso, los signos de ambos argumentos, $y$ y $x$, se usan para determinar el cuadrante del valor resultante\\ {\tt card(}$X${\tt)}&$|X|$, el cardinal (número de elementos) del conjunto $X$\\ {\tt ceil(}$x${\tt)}&$\lceil x\rceil$, el menor entero no menor que $x$ (``techo de $x$'')\\ {\tt cos(}$x${\tt)}&$\cos x$, coseno de $x$ (en radianes)\\ {\tt exp(}$x${\tt)}&$e^x$, exponencial en base $e$ de $x$\\ {\tt floor(}$x${\tt)}&$\lfloor x\rfloor$, el mayor entero no mayor que $x$ (``piso de $x$'')\\ {\tt gmtime()}&el número de segundos transcurridos desde las 00:00:00 del 1 de enero de 1970, Tiempo Universal Coordinado (para los detalles ver la Sección \ref{gmtime}, página \pageref{gmtime})\\ {\tt length(}$c${\tt)}&$|c|$, longitud de la cadena de caracteres $c$\\ {\tt log(}$x${\tt)}&$\log x$, logaritmo natural de $x$\\ {\tt log10(}$x${\tt)}&$\log_{10}x$, logaritmo común (decimal) de $x$\\ {\tt max(}$x_1${\tt,} $x_2${\tt,} \dots{\tt,} $x_n${\tt)}&el mayor de los valores $x_1$, $x_2$, \dots, $x_n$\\ {\tt min(}$x_1${\tt,} $x_2${\tt,} \dots{\tt,} $x_n${\tt)}&el menor de los valores $x_1$, $x_2$, \dots, $x_n$\\ {\tt round(}$x${\tt)}&redondeo de $x$ al entero más próximo\\ {\tt round(}$x${\tt,} $n${\tt)}&redondeo de $x$ a $n$ dígitos decimales\\ {\tt sin(}$x${\tt)}&$\sin x$, seno de $x$ (en radianes)\\ {\tt sqrt(}$x${\tt)}&$\sqrt{x}$, raíz cuadrada no-negativa de $x$\\ {\tt str2time(}$c${\tt,} $f${\tt)}&conversión de la cadena de caracteres $c$ a tiempo calendario (para los detalles ver la Sección \ref{str2time}, página \pageref{str2time})\\ {\tt trunc(}$x${\tt)}&truncado de $x$ al entero más próximo\\ {\tt trunc(}$x${\tt,} $n${\tt)}&truncado de $x$ a $n$ dígitos decimales\\ {\tt Irand224()}&generación de un entero pseudo-aleatorio uniformemente distribuido en $[0,2^{24})$\\ {\tt Uniform01()}&generación de un número pseudo-aleatorio uniformemente distribuido en $[0,1)$\\ {\tt Uniform(}$a${\tt,} $b${\tt)}&generación de un número pseudo-aleatorio uniformemente distribuido en $[a,b)$\\ {\tt Normal01()}&generación de una variable gaussiana pseudo-aleatoria con $\mu=0$ y $\sigma=1$\\ {\tt Normal(}$\mu${\tt,} $\sigma${\tt)}&generación de una variable gaussiana pseudo-aleatoria con $\mu$ y $\sigma$ dadas\\ \end{tabular} Los argumentos de todas la funciones internas, excepto {\tt card}, {\tt length} y {\tt str2time}, deben ser expresiones numéricas. El argumento de {\tt card} debe ser una expresión de conjunto. El argumento de {\tt length} y ambos argumentos de {\tt str2time} deben ser expresiones simbólicas. El valor resultante de una expresión numérica que es una función de referencia es el resultado de aplicar la función a sus argumentos. Se debe notar que cada función generadora pseudo-aleatoria tiene un argumento latente ({\it i.e.} algún estado interno) que cambia cada vez que se aplica la función. Así, si la función se aplica repetidamente, aún con argumentos idénticos, debido al efecto colateral siempre se producirán valores resultantes diferentes. \subsection{Expresiones iteradas} \label{itexpr} Una {\it expresión numérica iterada} es una expresión numérica primaria que tiene la siguiente forma sintáctica: $$\mbox{\it operador-iterado expresión-indizante integrando}$$ donde {\it operador-iterado} es el nombre simbólico del operador iterado que se ejecutará (ver más adelante), {\it expresión-indizante} es una expresión indizante que introduce índices y controla la iteración e {\it integrando} es una expresión numérica que participa en la operación. En MathProg existen cuatro operadores iterados que se pueden usar en expresiones numéricas: {\def\arraystretch{2} \noindent\hfil \begin{tabular}{@{}lll@{}} {\tt sum}&sumatoria&$\displaystyle\sum_{(i_1,\dots,i_n)\in\Delta} f(i_1,\dots,i_n)$\\ {\tt prod}&multiplicatoria&$\displaystyle\prod_{(i_1,\dots,i_n)\in\Delta} f(i_1,\dots,i_n)$\\ {\tt min}&mínimo&$\displaystyle\min_{(i_1,\dots,i_n)\in\Delta} f(i_1,\dots,i_n)$\\ {\tt max}&máximo&$\displaystyle\max_{(i_1,\dots,i_n)\in\Delta} f(i_1,\dots,i_n)$\\ \end{tabular} } \noindent donde $i_1$, \dots, $i_n$ son índices introducidos en la expresión indizante, $\Delta$ es el dominio, el conjunto de los $n$-tuplos especificados en la expresión indizante que define valores particulares asignados a los índices para ejecutar la operación iterada y $f(i_1,\dots,i_n)$ es el integrando, una expresión numérica cuyo valor resultante depende de los índices. El valor resultante de una expresión numérica iterada es el resultado de aplicar el operador iterado a sus integrandos a través de todos los $n$-tuplos contenidos en el dominio. \subsection{Expresiones condicionales} \label{ifthen} Una {\it expresión numérica condicional} es una expresión numérica primaria que tiene una de las dos formas sintácticas siguientes: $$ {\def\arraystretch{1.4} \begin{array}{l} \mbox{{\tt if} $b$ {\tt then} $x$ {\tt else} $y$}\\ \mbox{{\tt if} $b$ {\tt then} $x$}\\ \end{array} } $$ donde $b$ es una expresión lógica, mientras que $x$ e $y$ son expresiones numéricas. El valor resultante de un expresión condicional depende del valor de la expresión lógica que sigue a la palabra clave {\tt if}. Si toma el valor {\it verdadero}, el valor de la expresión condicional es el valor de la expresión que sigue a la palabra clave {\tt then}. De otro modo, si la expresión lógica toma el valor {\it falso}, el valor de la expresión condicional es el valor de la expresión que sigue a la palabra clave {\tt else}. Si se usa la segunda forma sintáctica, la reducida, y la expresión lógica toma el valor {\it falso}, el valor resultante de la expresión condicional será cero. \subsection{Expresiones parentéticas} Cualquier expresión numérica puede ser encerrada entre paréntesis, lo que las torna sintácticamente en una expresión numérica primaria. Los paréntesis pueden usarse en expresiones numéricas, como en el álgebra, para especificar el orden deseado en el cual se ejecutarán las operaciones. Cuando se usan paréntesis, la expresión entre paréntesis se evalúa antes que el valor resultante sea usado. El valor resultante de la expresión parentética es idéntico al valor de la expresión encerrada entre paréntesis. \subsection{Operadores aritméticos} En MathProg existen los siguientes operadores aritméticos, los que se pueden usar en expresiones numéricas: \begin{tabular}{@{}ll@{}} {\tt +} $x$&más unario\\ {\tt -} $x$&menos unario\\ $x$ {\tt +} $y$&adición\\ $x$ {\tt -} $y$&sustracción\\ $x$ {\tt less} $y$&diferencia positiva (si $x1$, la segunda forma es la que debe usarse. Si se usa la primera forma de la entrada indizante, el índice $i$ sólo puede ser un índice (ver más adelante). Si se usa la segunda forma, los índices $i_1$, $i_2$, \dots, $i_n$ pueden ser indistintamente índices o alguna expresión numérica o simbólica, siempre que al menos uno de los índices sea un índice. La tercera forma, reducida, de la entrada indizante tiene el mismo efecto que si $i$ (si $C$ es 1-dimensional) o $i_1$, $i_2$, \dots, $i_n$ (si $C$ es $n$-dimensional) se hubieran especificado todos como índices. Un {\it índice} es un objeto auxiliar del modelo que actúa como una variable individual. Los valores asignados a los índices son componentes de los $n$-tuplos de conjuntos básicos, {\it i.e.} algunas cantidades numéricas y simbólicas. Para referenciarlos, los índices pueden ser provistos con nombres simbólicos. Sin embargo, a diferencia de otros objetos del modelo (conjuntos, parámetros, etc.), los índices no necesitan ser declarados explícitamente. Cada nombre simbólico {\it no-declarado} que se usa en una posición indizante de alguna entrada indizante es reconocido como el nombre simbólico correspondiente al índice. Los nombre simbólicos de los índices son válidos solamente dentro del alcance de la expresión indizante en la que se introdujo el índice. Más allá del alcance, estos índices son completamente inaccesibles, de modo que los mismos nombres simbólicos se pueden usar para diferentes propósitos, en particular para representar índices en otras expresiones indizantes. El alcance de la expresión indizante, en el que las declaraciones implícitas de los índices son válidas, depende del contexto en que se usa la expresión indizante: \vspace*{-8pt} \begin{itemize} \item Si la expresión indizante se usa en un operador-iterado, su alcance se extiende hasta el final del integrando; \item Si la expresión indizante se usa como una expresión de conjunto primaria, su alcance se extiende hasta el final de esta expresión indizante; \item Si la expresión indizante se usa para definir el dominio del subíndice en la declaración de algún objeto del modelo, su alcance se extiende hasta el final de la correspondiente sentencia. \end{itemize} \vspace*{-8pt} El mecanismo de indización implementado mediante las expresiones indizantes se explica mejor con algunos ejemplos que se discuten a continuación. Sean tres conjuntos: $$ {\def\arraystretch{1.4} \begin{array}{l} A=\{4,7,9\},\\ B=\{(1,Ene),(1,Feb),(2,Mar),(2,Abr),(3,May),(3,Jun)\},\\ C=\{a,b,c\},\\ \end{array} } $$ donde $A$ y $C$ consisten de 1-tuplos (singletones) y $B$ consiste de 2-tuplos (duplos). Considérese la siguiente expresión indizante: $$\mbox{{\tt\{i in A, (j,k) in B, l in C\}}}$$ donde {\tt i}, {\tt j}, {\tt k} y {\tt l} son índices. Aunque MathProg no es un lenguaje de programación por procedimientos, para cualquier expresión indizante se puede dar una descripción algorítmica equivalente. En particular, la descripción algorítmica de la expresión indizante anterior se vería como sigue: \noindent\hfil \begin{tabular}{@{}l@{}} {\bf para todo} $i\in A$ {\bf ejecutar}\\ \hspace{16pt}{\bf para todo} $(j,k)\in B$ {\bf ejecutar}\\ \hspace{32pt}{\bf para todo} $l\in C$ {\bf ejecutar}\\ \hspace{48pt}{\it acción};\\ \end{tabular} \noindent donde los índices $i$, $j$, $k$ y $l$ son asignados consecutivamente a los correspondientes componentes de los $n$-tuplos a partir de los conjuntos básicos $A$, $B$ y $C$ y {\it acción} es alguna acción que depende del contexto en el que se esté usando la expresión indizante. Por ejemplo, si la acción fuese imprimir los valores corrientes de los índices, la impresión se vería como sigue: \noindent\hfil \begin{tabular}{@{}llll@{}} $i=4$&$j=1$&$k=Ene$&$l=a$\\ $i=4$&$j=1$&$k=Ene$&$l=b$\\ $i=4$&$j=1$&$k=Ene$&$l=c$\\ $i=4$&$j=1$&$k=Feb$&$l=a$\\ $i=4$&$j=1$&$k=Feb$&$l=b$\\ \multicolumn{4}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}\\ $i=9$&$j=3$&$k=Jun$&$l=b$\\ $i=9$&$j=3$&$k=Jun$&$l=c$\\ \end{tabular} Sea la expresión indizante del ejemplo usada en la siguiente operación iterada: $$\mbox{{\tt sum\{i in A, (j,k) in B, l in C\} p[i,j,k,l]}}$$ donde {\tt p} es un parámetro numérico 4-dimensional o alguna expresión numérica cuyos valores resultantes dependan de {\tt i}, {\tt j}, {\tt k} y {\tt l}. En este caso la acción es la sumatoria, de modo que el valor resultante de la expresión numérica primaria es: $$\sum_{i\in A,(j,k)\in B,l\in C}(p_{ijkl}).$$ Ahora, sea la expresión indizante del ejemplo usada como una expresión de conjunto primaria. En este caso, la acción es reunir a todos los 4-tuplos (cuádruplos) de la forma $(i,j,k,l)$ en un conjunto, de modo que el valor resultante de tal operación es simplemente el producto cartesiano de los conjuntos básicos: $$A\times B\times C=\{(i,j,k,l):i\in A,(j,k)\in B,l\in C\}.$$ Se debe notar que, en este caso, la misma expresión indizante podría escribirse en la forma reducida: $$\mbox{{\tt\{A, B, C\}}}$$ ya que los índices $i$, $j$, $k$ y $l$ no son referenciados y, consecuentemente, sus nombres simbólicos no necesitan ser especificados. Finalmente, sea la expresión indizante del ejemplo usada como el dominio del subíndice en la declaración de algún objeto 4-dimensional del modelo, por ejemplo un parámetro numérico: $$\mbox{{\tt param p\{i in A, (j,k) in B, l in C\}} \dots {\tt;}}$$ \noindent En este caso la acción es generar los miembros del parámetro, donde cada uno de los cuales tiene la forma $p[i,j,k,l]$. Como se dijo anteriormente, algunos índices en la segunda forma de las entradas indizantes pueden ser expresiones numéricas o simbólicas, no solamente índices. En este caso, los valores resultantes de tales expresiones desempeñan el papel de algunas condiciones lógicas para seleccionar, solamente, aquellos $n$-tuplos del producto cartesiano de los conjuntos básicos que satisfacen estas condiciones. Considérese, por ejemplo, la siguiente expresión indizante: $$\mbox{{\tt\{i in A, (i-1,k) in B, l in C\}}}$$ donde {\tt i}, {\tt k} y {\tt l} son índices e {\tt i-1} es una expresión numérica. La descripción algorítmica de esta expresión indizante sería la siguiente: \noindent\hfil \begin{tabular}{@{}l@{}} {\bf para todo} $i\in A$ {\bf ejecutar}\\ \hspace{16pt}{\bf para todo} $(j,k)\in B$ {\bf y} $j=i-1$ {\bf ejecutar}\\ \hspace{32pt}{\bf para todo} $l\in C$ {\bf ejecutar}\\ \hspace{48pt}{\it acción};\\ \end{tabular} \noindent Así, si la expresión indizante se usara como una expresión de conjunto primaria, el conjunto resultante sería el siguiente: $$\{(4,May,a),(4,May,b),(4,May,c),(4,Jun,a),(4,Jun,b),(4,Jun,c)\}.$$ Debe notarse que, en este caso, el conjunto resultante consistirá de 3-tuplos y no de 4-tuplos, puesto que en la expresión indizante no hay un índice que corresponda al primer componente de los 2-tuplos del conjunto $B$. La regla general es: el número de componentes de los $n$-tuplos definido por una expresión indizante es igual al número de índices de tal expresión, en la que la correspondencia entre los índices y los componentes de los $n$-tuplos en el conjunto resultante es posicional, {\it i.e.} el primer índice se corresponde con el primer componente, el segundo índice se corresponde con el segundo componente, etc. En algunos casos es necesario seleccionar un subconjunto del producto cartesiano de algunos conjuntos. Esto se puede lograr mediante el empleo de un predicado lógico opcional, el que se especifica en la expresión indizante. Considérese, por ejemplo, la siguiente expresión indizante: $$\mbox{{\tt\{i in A, (j,k) in B, l in C: i <= 5 and k <> 'Mar'\}}}$$ donde la expresión lógica que sigue a los dos puntos es un predicado. La descripción algorítmica de tal expresión indizante sería la siguiente: \noindent\hfil \begin{tabular}{@{}l@{}} {\bf para todo} $i\in A$ {\bf ejecutar}\\ \hspace{16pt}{\bf para todo} $(j,k)\in B$ {\bf ejecutar}\\ \hspace{32pt}{\bf para todo} $l\in C$ {\bf ejecutar}\\ \hspace{48pt}{\bf si} $i\leq 5$ {\bf y} $k\neq`Mar'$ {\bf entonces}\\ \hspace{64pt}{\it acción};\\ \end{tabular} \noindent Así, si esta expresión indizante se usara como una expresión de conjunto primaria, el conjunto resultante sería el siguiente: $$\{(4,1,Ene,a),(4,1,Feb,a),(4,2,Abr,a),\dots,(4,3,Jun,c)\}.$$ Si no se especifica un predicado en la expresión indizante, se asume uno que toma el valor {\it verdadero}. \section{Expresiones de conjunto} Una {\it expresión de conjunto} es una regla para calcular un conjunto elemental, {\it i.e.} una colección de $n$-tuplos cuyos componentes son cantidades numéricas y simbólicas. La expresión de conjunto primaria puede ser un conjunto de literales, un conjunto no-indizado, un conjunto indizado, un conjunto ``aritmético'', una expresión indizante, una expresión de conjunto iterada, una expresión de conjunto condicional u otra expresión de conjunto encerrada entre paréntesis. \para{Ejemplos} \noindent \begin{tabular}{@{}ll@{}} \verb|{(123,'aaa'), (i+1,'bbb'), (j-1,'ccc')}| &(conjunto de literales)\\ \verb|I| &(conjunto no-indizado)\\ \verb|S[i-1,j+1]| &(conjunto indizado)\\ \verb|1..t-1 by 2| &(conjunto ``aritmético'')\\ \verb|{t in 1..T, (t+1,j) in S: (t,j) in F}| &(expresión indizante)\\ \verb|setof{i in I, j in J}(i+1,j-1)| &(expresión de conjunto iterada)\\ \verb|if i < j then S[i,j] else F diff S[i,j]| &(expresión de conjunto condicional)\\ \verb|(1..10 union 21..30)| &(expresión de conjunto parentética)\\ \end{tabular} Empleando ciertos operadores de conjunto se pueden construir expresiones de conjunto más generales conteniendo dos o más expresiones de conjunto primarias. \newpage \para{Ejemplos} \begin{verbatim} (A union B) inter (I cross J) 1..10 cross (if i < j then {'a', 'b', 'c'} else {'d', 'e', 'f'}) \end{verbatim} \subsection{Conjuntos de literales} Un {\it conjunto de literales} es una expresión de conjunto primaria que tiene las dos formas sintácticas siguientes: $$ {\def\arraystretch{1.4} \begin{array}{l} \mbox{{\tt\{}$e_1${\tt,} $e_2${\tt,} \dots{\tt,} $e_m${\tt\}}}\\ \mbox{{\tt\{(}$e_{11}${\tt,} \dots{\tt,} $e_{1n}${\tt),} {\tt(}$e_{21}${\tt,} \dots{\tt,} $e_{2n}${\tt),} \dots{\tt,} {\tt(}$e_{m1}${\tt,} \dots{\tt,} $e_{mn}${\tt)\}}}\\ \end{array} } $$ donde $e_1$, \dots, $e_m$, $e_{11}$, \dots, $e_{mn}$ son expresiones numéricas o simbólicas. Si se usa la primera forma, el conjunto resultante consiste de 1-tuplos (singletones), enumerados entre las llaves. Se permite especificar un conjunto vacío como {\tt\{\ \}}, el que no tiene 1-tuplos. Si se usa la segunda forma, el conjunto resultante consiste de $n$-tuplos enumerados entre las llaves, donde cada $n$-tuplo particular está compuesto por los correspondientes componentes enumerados entre los paréntesis. Todos los $n$-tuplos deben tener el mismo número de componentes. \subsection{Conjuntos no-indizados} Si la expresión de conjunto primaria es un conjunto no-indizado (el que debe ser 0-dimensional), el conjunto resultante es un conjunto elemental asociado con el objeto conjunto correspondiente. \subsection{Conjuntos indizados} La expresión de conjunto primaria que se refiere a un conjunto indizado tiene la siguiente forma sintáctica: $$\mbox{{\it nombre}{\tt[}$i_1${\tt,} $i_2${\tt,} \dots{\tt,} $i_n${\tt]}}$$ donde {\it nombre} es el nombre simbólico del objeto conjunto e $i_1$, $i_2$, \dots, $i_n$ son subíndices. Cada subíndice debe ser una expresión numérica o simbólica. El número de subíndices en la lista de subíndices debe coincidir con la dimensión del objeto conjunto al cual está asociada la lista de subíndices. Los valores corrientes de las expresiones de los subíndices se usan para identificar un miembro particular del objeto conjunto que determina el conjunto resultante. \subsection{Conjuntos ``aritméticos''} La expresión de conjunto primaria que constituye un conjunto ``aritmético'' tiene las dos formas sintácticas siguientes: $$ {\def\arraystretch{1.4} \begin{array}{l} \mbox{$t_0$ {\tt..} $t_1$ {\tt by} $\delta t$}\\ \mbox{$t_0$ {\tt..} $t_1$}\\ \end{array} } $$ donde $t_0$, $t_1$ y $\delta t$ son expresiones numéricas (el valor de $\delta t$ no debe ser cero). La segunda forma es equivalente a la primera con $\delta t=1$. Si $\delta t>0$, el conjunto resultante se determina como sigue: $$\{t:\exists k\in{\cal Z}(t=t_0+k\delta t,\ t_0\leq t\leq t_1)\}.$$ De otro modo, si $\delta t<0$, el conjunto resultante se determina como sigue: $$\{t:\exists k\in{\cal Z}(t=t_0+k\delta t,\ t_1\leq t\leq t_0)\}.$$ \subsection{Expresiones de indización} Si la expresión de conjunto primaria es una expresión indizante, el conjunto resultante se determina como se ha descripto anteriormente en la Sección \ref{indexing}, página \pageref{indexing}. \subsection{Expresiones iteradas} Una {\it expresión de conjunto iterada} es una expresión de conjunto primaria que tiene la siguiente forma sintáctica: $$\mbox{{\tt setof} {\it expresión-indizante} {\it integrando}}$$ donde {\it expresión-indizante} es una expresión indizante que introduce índices y controla la iteración e {\it integrando} es tanto una expresión numérica o simbólica individual como una lista de expresiones numéricas o simbólicas separadas por coma y encerradas entre paréntesis. Si el integrando es una expresión numérica o simbólica individual, el conjunto resultante está compuesto por 1-tuplos y se determina como sigue: $$\{x:(i_1,\dots,i_n)\in\Delta\},$$ \noindent donde $x$ es un valor del integrando, $i_1$, \dots, $i_n$ son índices introducidos en la expresión indizante y $\Delta$ es el dominio, un conjunto de $n$-tuplos especificados por la expresión indizante que define los valores particulares asignados a los índices para realizar la operación iterada. Si el integrando es una lista conteniendo $m$ expresiones numéricas y simbólicas, el conjunto resultante está compuesto por $m$-tuplos y se determina como sigue: $$\{(x_1,\dots,x_m):(i_1,\dots,i_n)\in\Delta\},$$ donde $x_1$, \dots, $x_m$ son valores de las expresiones en la lista de integrandos e $i_1$, \dots, $i_n$ y $\Delta$ tienen el mismo significado anterior. \subsection{Expresiones condicionales} Una {\it expresión de conjunto condicional} es una expresión de conjunto primaria que tiene la siguiente forma sintáctica: $$\mbox{{\tt if} $b$ {\tt then} $X$ {\tt else} $Y$}$$ donde $b$ es una expresión lógica y $X$ e $Y$ son expresiones de conjunto que deben definir conjuntos de igual dimensión. El valor resultante de la expresión condicional depende del valor de la expresión lógica que sigue a la palabra clave {\tt if}. Si toma el valor {\it verdadero}, el conjunto resultante es el valor de la expresión que sigue a la palabra clave {\tt then}. De otro modo, si la expresión lógica toma el valor {\it falso}, el conjunto resultante es el valor de la expresión que sigue a la palabra clave {\tt else}. \subsection{Expresiones parentéticas} Cualquier expresión de conjunto puede encerrarse entre paréntesis, lo que la convierte sintácticamente en una expresión de conjunto primaria. Los paréntesis pueden usarse en expresiones de conjunto, como en el álgebra, para especificar el orden deseado en el cual se ejecutarán las operaciones. Cuando se usan paréntesis, la expresión entre paréntesis se evalúa antes que el valor resultante sea usado. El valor resultante de la expresión parentética es idéntico al valor de la expresión encerrada entre paréntesis. \subsection{Operadores de conjunto} En MathProg existen los siguientes operadores de conjunto, los que se pueden usar en expresiones de conjunto: \begin{tabular}{@{}ll@{}} $X$ {\tt union} $Y$&union $X\cup Y$\\ $X$ {\tt diff} $Y$&diferencia $X\backslash Y$\\ $X$ {\tt symdiff} $Y$&diferencia simétrica $X\oplus Y=(X\backslash Y)\cup(Y\backslash X)$\\ $X$ {\tt inter} $Y$&intersección $X\cap Y$\\ $X$ {\tt cross} $Y$&producto cartesiano (``cruzado'') $X\times Y$\\ \end{tabular} \noindent donde $X$ e $Y$ son expresiones de conjunto que deben definir conjuntos de la misma dimensión (excepto para el producto cartesiano). Si la expresión incluye más de un operador de conjunto, todos los operadores se ejecutan de izquierda a derecha, de acuerdo con la jerarquía de las operaciones (ver más adelante). El valor resultante de la expresión que contiene operadores de conjunto es el resultado de aplicar los operadores a sus operandos. La dimensión del conjunto resultante, {\it i.e.} la dimensión de los $n$-tuplos de los que consiste el conjunto resultante, es la dimensión de los operandos, excepto en el producto cartesiano, en la que la dimensión del conjunto resultante es la suma de las dimensiones de sus operandos. \subsection{Jerarquía de las operaciones} La siguiente lista muestra la jerarquía de las operaciones en expresiones de conjunto: \noindent\hfil \begin{tabular}{@{}ll@{}} Operación&Jerarquía\\ \hline Evaluación de operaciones numéricas& 1.{\textsuperscript{\b{a}}}-7.{\textsuperscript{\b{a}}}\\ Evaluación de operaciones simbólicas& 8.{\textsuperscript{\b{a}}}-9.{\textsuperscript{\b{a}}}\\ Evaluación de conjuntos iterados o ``aritméticos'' ({\tt setof}, {\tt..})& 10.{\textsuperscript{\b{a}}}\\ Producto cartesiano ({\tt cross})& 11.{\textsuperscript{\b{a}}}\\ Intersección ({\tt inter})& 12.{\textsuperscript{\b{a}}}\\ Unión y diferencia ({\tt union}, {\tt diff}, {\tt symdiff})& 13.{\textsuperscript{\b{a}}}\\ Evaluación condicional ({\tt if} \dots {\tt then} \dots {\tt else})& 14.{\textsuperscript{\b{a}}}\\ \end{tabular} Esta jerarquía tiene el mismo significado que se explicó anteriormente para expresiones numéricas (ver Subsección \ref{hierarchy}, página \pageref{hierarchy}). \section{Expresiones lógicas} Una {\it expresión lógica} es una regla para calcular un valor lógico individual, el que puede ser tanto {\it verdadero} como {\it falso}. La expresión lógica primaria puede ser una expresión numérica, una expresión relacional, una expresión lógica iterada u otra expresión lógica encerrada entre paréntesis. \para{Ejemplos} \noindent \begin{tabular}{@{}ll@{}} \verb|i+1| &(expresión numérica)\\ \verb|a[i,j] < 1.5| &(expresión relacional)\\ \verb|s[i+1,j-1] <> 'Mar' & anho | &(expresión relacional)\\ \verb|(i+1,'Ene') not in I cross J| &(expresión relacional)\\ \verb|S union T within A[i] inter B[j]| &(expresión relacional)\\ \verb|forall{i in I, j in J} a[i,j] < .5 * b[i]| &(expresión lógica iterada)\\ \verb|(a[i,j] < 1.5 or b[i] >= a[i,j])| &(expresión lógica parentética)\\ \end{tabular} Empleando ciertos operadores lógicos se pueden construir expresiones lógicas más generales conteniendo dos o más expresiones lógicas primarias. \para{Ejemplos} \begin{verbatim} not (a[i,j] < 1.5 or b[i] >= a[i,j]) and (i,j) in S (i,j) in S or (i,j) not in T diff U \end{verbatim} \vspace*{-8pt} \subsection{Expresiones numéricas} El valor resultante de una expresión lógica primaria, cuando es una expresión numérica, es {\it verdadero} si el valor resultante de la expresión numérica es distinto de cero. De otro modo, el valor resultante de la expresión lógica es {\it falso}. \vspace*{-8pt} \subsection{Operadores relacionales} En MathProg existen los siguientes operadores relacionales, los que se pueden usar en expresiones lógicas: \begin{tabular}{@{}ll@{}} $x$ {\tt<} $y$&comprueba si $x=} $y$&comprueba si $x\geq y$\\ $x$ {\tt>} $y$&comprueba si $x>y$\\ $x$ {\tt<>} $y$, $x$ {\tt!=} $y$&comprueba si $x\neq y$\\ $x$ {\tt in} $Y$&comprueba si $x\in Y$\\ {\tt(}$x_1${\tt,}\dots{\tt,}$x_n${\tt)} {\tt in} $Y$&comprueba si $(x_1,\dots,x_n)\in Y$\\ $x$ {\tt not} {\tt in} $Y$, $x$ {\tt!in} $Y$&comprueba si $x\not\in Y$\\ {\tt(}$x_1${\tt,}\dots{\tt,}$x_n${\tt)} {\tt not} {\tt in} $Y$, {\tt(}$x_1${\tt,}\dots{\tt,}$x_n${\tt)} {\tt !in} $Y$&comprueba si $(x_1,\dots,x_n)\not\in Y$\\ $X$ {\tt within} $Y$&comprueba si $X\subseteq Y$\\ $X$ {\tt not} {\tt within} $Y$, $X$ {\tt !within} $Y$&comprueba si $X\not\subseteq Y$\\ \end{tabular} \noindent donde $x$, $x_1$, \dots, $x_n$ e $y$ son expresiones numéricas o simbólicas, mientras que $X$ e $Y$ son expresiones de conjunto. Notas: 1. En las operaciones {\tt in}, {\tt not in} y {\tt !in} el número de componentes del primer operando debe ser igual a la dimensión del segundo operando. 2. En las operaciones {\tt within}, {\tt not within} y {\tt !within} ambos operandos deben tener la misma dimensión. Todos los operadores relacionales listados anteriormente tienen su significado matemático convencional. El valor resultante es {\it verdadero} si los operandos satisfacen la correspondiente relación, o es {\it falso} en caso contrario. (Debe notarse que los valores simbólicos se ordenan lexicográficamente y que cualquier valor numérico precede a cualquier valor simbólico.) \subsection{Expresiones iteradas} Una {\it expresión lógica iterada} es una expresión lógica primaria que tiene la siguiente forma sintáctica: $$\mbox{{\it operador-iterado} {\it expresión-indizante} {\it integrando}}$$ donde {\it operador-iterado} es el nombre simbólico del operador iterado que se ejecutará (ver más adelante), {\it expresión-indizante} es una expresión indizante que introduce índices y controla la iteración e {\it integrando} es una expresión lógica que participa en la operación. En MathProg existen dos operadores iterados que se pueden usar en expresiones lógicas: {\def\arraystretch{1.4} \noindent\hfil \begin{tabular}{@{}lll@{}} {\tt forall}&cuantificador-$\forall$&$\displaystyle \forall(i_1,\dots,i_n)\in\Delta[f(i_1,\dots,i_n)],$\\ {\tt exists}&cuantificador-$\exists$&$\displaystyle \exists(i_1,\dots,i_n)\in\Delta[f(i_1,\dots,i_n)],$\\ \end{tabular} } \noindent donde $i_1$, \dots, $i_n$ son índices introducidos en la expresión indizante, $\Delta$ es el dominio, un conjunto de $n$-tuplos especificados por la expresión indizante que define los valores particulares asignados a los índices para ejecutar la operación iterada y $f(i_1,\dots,i_n)$ es el integrando, una expresión lógica cuyo valor resultante depende de los índices. Para el cuantificador-$\forall$, el valor resultante de la expresión lógica iterada es {\it verdadero} si el valor del integrando es {\it verdadero} para todos los $n$-tuplos contenidos en el dominio, de otro modo es {\it falso}. Para el cuantificador-$\exists$, el valor resultante de la expresión lógica iterada es {\it falso} si el valor del integrando es {\it falso} para todos los $n$-tuplos contenidos en el dominio, de otro modo es {\it verdadero}. \subsection{Expresiones parentéticas} Cualquier expresión lógica puede encerrarse entre paréntesis, lo que la convierte sintácticamente en una expresión lógica primaria. Los paréntesis pueden usarse en expresiones lógicas, como en el álgebra, para especificar el orden deseado en el cual se ejecutarán las operaciones. Cuando se usan paréntesis, la expresión entre paréntesis se evalúa antes que el valor resultante sea usado. El valor resultante de la expresión parentética es idéntico al valor de la expresión encerrada entre paréntesis. \subsection{Operadores lógicos} En MathProg existen los siguientes operadores lógicos, los que se pueden usar en expresiones lógicas: \begin{tabular}{@{}ll@{}} {\tt not} $x$, {\tt!}$x$&negación $\neg\ x$\\ $x$ {\tt and} $y$, $x$ {\tt\&\&} $y$&conjunción (``y'' lógico) $x\;\&\;y$\\ $x$ {\tt or} $y$, $x$ {\tt||} $y$&disyunción (``o'' lógico) $x\vee y$\\ \end{tabular} \noindent donde $x$ e $y$ son expresiones lógicas. Si la expresión incluye más de un operador lógico, todos los operadores se ejecutan de izquierda a derecha, de acuerdo con la jerarquía de las operaciones (ver más adelante). El valor resultante de la expresión que contiene operadores lógicos es el resultado de aplicar los operadores a sus operandos. \subsection{Jerarquía de las operaciones} La siguiente lista muestra la jerarquía de las operaciones en expresiones lógicas: \noindent\hfil \begin{tabular}{@{}ll@{}} Operación&Jerarquía\\ \hline Evaluación de operaciones numéricas& 1.{\textsuperscript{\b{a}}}-7.{\textsuperscript{\b{a}}}\\ Evaluación de operaciones simbólicas& 8.{\textsuperscript{\b{a}}}-9.{\textsuperscript{\b{a}}}\\ Evaluación de operaciones de conjuntos& 10.{\textsuperscript{\b{a}}}-14.{\textsuperscript{\b{a}}}\\ Operaciones relacionales ({\tt<}, {\tt<=}, etc.)& 15.{\textsuperscript{\b{a}}}\\ Negación ({\tt not}, {\tt!})& 16.{\textsuperscript{\b{a}}}\\ Conjunción ({\tt and}, {\tt\&\&})& 17.{\textsuperscript{\b{a}}}\\ Cuantificación-$\forall$ y -$\exists$ ({\tt forall}, {\tt exists})& 18.{\textsuperscript{\b{a}}}\\ Disyunción ({\tt or}, {\tt||})& 19.{\textsuperscript{\b{a}}}\\ \end{tabular} Esta jerarquía tiene el mismo significado que se explicó anteriormente para expresiones numéricas (ver Subsección \ref{hierarchy}, página \pageref{hierarchy}). \section{Expresiones lineales} Una {\it expresión lineal} es una regla para calcular la denominada {\it forma lineal}, que es una función lineal (o afín) de variables elementales. La expresión lineal primaria puede ser una variable no-indizada, una variable indizada, una expresión lineal iterada, una expresión lineal condicional u otra expresión lineal encerrada entre paréntesis. También está permitido usar una expresión numérica como una expresión lineal primaria, en cuyo caso el valor resultante de la expresión numérica se convierte automáticamente a una forma lineal que incluye el término constante solamente. \para{Ejemplos} \noindent \begin{tabular}{@{}ll@{}} \verb|z| &(variable no-indizada)\\ \verb|x[i,j]| &(variable indizada)\\ \verb|sum{j in J} (a[i,j] * x[i,j] + 3 * y[i-1])| & (expresión lineal iterada)\\ \verb|if i in I then x[i,j] else 1.5 * z + 3.25| & (expresión lineal condicional)\\ \verb|(a[i,j] * x[i,j] + y[i-1] + .1)| & (expresión lineal parentética)\\ \end{tabular} Empleando ciertos operadores aritméticos se pueden construir expresiones lineales más generales conteniendo dos o más expresiones lineales primarias. \para{Ejemplos} \begin{verbatim} 2 * x[i-1,j+1] + 3.5 * y[k] + .5 * z (- x[i,j] + 3.5 * y[k]) / sum{t in T} abs(d[i,j,t]) \end{verbatim} \vspace*{-5pt} \subsection{Variables no-indizadas} Si la expresión lineal primaria es una variable no-indizada (que debe ser 0-dimensional), la forma lineal resultante es aquella variable no-indizada. \vspace*{-5pt} \subsection{Variables indizadas} La expresión lineal primaria que se refiere a una variable indizada tiene la siguiente forma sintáctica: $$\mbox{{\it nombre}{\tt[}$i_1${\tt,} $i_2${\tt,} \dots{\tt,} $i_n${\tt]}}$$ donde {\it nombre} es el nombre simbólico de la variable del modelo e $i_1$, $i_2$, \dots, $i_n$ son subíndices. Cada subíndice debe ser una expresión numérica o simbólica. El número de subíndices en la lista de subíndices debe ser igual a la dimensión de la variable del modelo con la cual está asociada la lista de subíndices. Los valores corrientes de las expresiones de los subíndices se usan para identificar un miembro particular de la variable del modelo que determina la forma lineal resultante, la cual es una variable elemental asociada con el miembro correspondiente. \vspace*{-5pt} \subsection{Expresiones iteradas} Una {\it expresión lineal iterada} es una expresión lineal primaria que tiene la siguiente forma sintáctica: $$\mbox{{\tt sum} {\it expresión-indizante} {\it integrando}}$$ donde {\it expresión-indizante} es una expresión indizante que introduce índices y controla la iteración e {\it integrando} es una expresión lineal que participa en la operación. La expresión lineal iterada se evalúa exactamente de la misma manera que la expresión numérica iterada (ver Subsección \ref{itexpr}, página \pageref{itexpr}), excepto que el integrando participante en la sumatoria es una forma lineal y no un valor numérico. \vspace*{-5pt} \subsection{Expresiones condicionales} Una {\it expresión lineal condicional} es una expresión lineal primaria que tiene alguna de las dos formas sintácticas siguientes: $$ {\def\arraystretch{1.4} \begin{array}{l} \mbox{{\tt if} $b$ {\tt then} $f$ {\tt else} $g$}\\ \mbox{{\tt if} $b$ {\tt then} $f$}\\ \end{array} } $$ donde $b$ es una expresión lógica, mientras que $f$ y $g$ son expresiones lineales. La expresión lineal condicional se evalúa exactamente de la misma manera que la expresión numérica condicional (ver Subsección \ref{ifthen}, página \pageref{ifthen}), excepto que los operandos participantes en la operación son formas lineales y no valores numéricos. \subsection{Expresiones parentéticas} Cualquier expresión lineal puede encerrarse entre paréntesis, lo que la convierte sintácticamente en una expresión lineal primaria. Los paréntesis pueden usarse en expresiones lineales, como en el álgebra, para especificar el orden deseado en el cual se ejecutarán las operaciones. Cuando se usan paréntesis, la expresión entre paréntesis se evalúa antes que el valor resultante sea usado. El valor resultante de la expresión parentética es idéntico al valor de la expresión encerrada entre paréntesis. \subsection{Operadores aritméticos} En MathProg existen los siguientes operadores aritméticos, los que se pueden usar en expresiones lineales: \begin{tabular}{@{}ll@{}} {\tt+} $f$&más unario\\ {\tt-} $f$&menos unario\\ $f$ {\tt+} $g$&adición\\ $f$ {\tt-} $g$&sustracción\\ $x$ {\tt*} $f$, $f$ {\tt*} $x$&multiplicación\\ $f$ {\tt/} $x$&división \end{tabular} \noindent donde $f$ y $g$ son expresiones lineales, mientras que $x$ es una expresión numérica (más precisamente, una expresión lineal conteniendo únicamente el término constante). Si la expresión incluye más de un operador aritmético, todos los operadores se ejecutan de izquierda a derecha, de acuerdo con la jerarquía de las operaciones (ver más adelante). El valor resultante de la expresión que contiene operadores aritméticos es el resultado de aplicar los operadores a sus operandos. \subsection{Jerarquía de las operaciones} La jerarquía de las operaciones aritméticas usadas en las expresiones lineales es la misma que en las expresiones numéricas (ver Subsección \ref{hierarchy}, página \pageref{hierarchy}). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Sentencias} Las {\it sentencias} son unidades básicas de la descripción del modelo. En MathProg todas las sentencias se clasifican en dos categorías: sentencias declarativas y sentencias funcionales. Las {\it sentencias declarativas} (sentencia {\it set}, sentencia {\it parameter}, sentencia {\it variable}, sentencia {\it constraint} y sentencia {\it objective}) se usan para declarar objetos de cierto tipo del modelo y definir ciertas propiedades de tales objetos. Las {\it sentencias funcionales} (sentencia {\it solve}, sentencia {\it check}, sentencia {\it display}, sentencia {\it printf}, sentencia {\it loop} y sentencia {\it table}) están ideadas para ejecutar ciertas acciones específicas. Debe notarse que las sentencias declarativas pueden seguir cualquier orden arbitrario, lo cual no afecta el resultado de la traducción. Sin embargo, todos los objetos del modelo deben ser declarados antes de ser referenciados en otras sentencias. \section{Sentencia set} \noindent \framebox[468pt][l]{ \parbox[c][24pt]{468pt}{ \hspace{6pt} {\tt set} {\it nombre} {\it alias} {\it dominio} {\tt,} {\it atributo} {\tt,} \dots {\tt,} {\it atributo} {\tt;} }} \medskip \noindent {\it nombre} es el nombre simbólico del conjunto; \noindent {\it alias} es un literal de cadena opcional que especifica un alias para el conjunto; \noindent {\it dominio} es una expresión-indizante opcional que especifica el dominio del subíndice del conjunto; \noindent {\it atributo}, \dots, {\it atributo} son atributos opcionales del conjunto (las comas que preceden a los atributos se pueden omitir). \para{Atributos opcionales} \vspace*{-8pt} \begin{description} \item[{\tt dimen} $n$]\hspace*{0pt}\\ especifica la dimensión de los $n$-tuplos de los que consiste el conjunto; \item[{\tt within} {\it expresión}]\hspace*{0pt}\\ especifica un superconjunto que restringe al conjunto o a todos sus miembros (conjuntos elementales) a estar incluido en aquel superconjunto; \item[{\tt:=} {\it expresión}]\hspace*{0pt}\\ especifica un conjunto elemental asignado al conjunto o sus miembros; \item[{\tt default} {\it expresión}]\hspace*{0pt}\\ especifica un conjunto elemental asignado al conjunto o sus miembros cuando no haya datos apropiados disponibles en la sección de datos. \end{description} \vspace*{-8pt} \para{Ejemplos} \begin{verbatim} set nodos; set arcos within nodos cross nodos; set paso{p in 1..maxiter} dimen 2 := if p = 1 then arcos else paso[p-1] union setof{k in nodos, (i,k) in paso[p-1], (k,j) in paso[p-1]}(i,j); set A{i in I, j in J}, within B[i+1] cross C[j-1], within D diff E, default {('abc',123), (321,'cba')}; \end{verbatim} La sentencia set declara un conjunto. Si no se especifica el dominio del subíndice, el conjunto será simple, de otro modo será un arreglo de conjuntos elementales. El atributo {\tt dimen} especifica la dimensión de los $n$-tuplos de los que consiste el conjunto (si es un conjunto simple) o sus miembros (si el conjunto es un arreglo de conjuntos elementales), en la que $n$ debe ser un entero sin signo desde 1 hasta 20. Como mucho se puede especificar un atributo {\tt dimen}. Si no se especifica el atributo {\tt dimen}, la dimensión de los $n$-tuplos se determina implícitamente por otros atributos (por ejemplo, si hay una expresión de conjunto que sigue a {\tt :=} o a la palabra clave {\tt default}, se usará la dimensión de los $n$-tuplos del correspondiente conjunto elemental). Si no hay información disponible sobre la dimensión, se asume {\tt dimen 1}. El atributo {\tt within} especifica una expresión de conjunto cuyo valor resultante es un superconjunto usado para restringir al conjunto (si es un conjunto simple) o a sus miembros (si el conjunto es un arreglo de conjuntos elementales) a estar incluido en aquel superconjunto. Se puede especificar un número arbitrario de atributos {\tt within} en la misma sentencia set. El atributo de asignación ({\tt :=}) especifica una expresión de conjunto usada para evaluar conjuntos elementales asignados al conjunto (si es un conjunto simple) o sus miembros (si el conjunto es un arreglo de conjuntos elementales). Si se especifica el atributo de asignación, el conjunto es {\it calculable} y consecuentemente no es necesario proveerle datos en la sección de datos. Si no se especifica el atributo de asignación, entonces se deben proveer datos para el conjunto en la sección de datos. Como mucho, se puede especificar una asignación o un atributo {\tt default} para el mismo conjunto. El atributo {\tt default} especifica una expresión de conjunto usada para evaluar conjuntos elementales asignados al conjunto (si es un conjunto simple) o sus miembros (si el conjunto es un arreglo de conjuntos elementales) toda vez que no haya datos apropiados disponibles en la sección de datos. Si no se especifica una asignación o un atributo {\tt default}, la carencia de datos causará un error. \newpage \section{Sentencia parameter} \noindent \framebox[468pt][l]{ \parbox[c][24pt]{468pt}{ \hspace{6pt} {\tt param} {\it nombre} {\it alias} {\it dominio} {\tt,} {\it atributo} {\tt,} \dots {\tt,} {\it atributo} {\tt;} }} \medskip \noindent {\it nombre} es el nombre simbólico del parámetro; \noindent {\it alias} es un literal de cadena opcional que especifica un alias para el parámetro; \noindent {\it dominio} es una expresión indizante opcional que especifica el dominio del subíndice del parámetro; \noindent {\it atributo}, \dots, {\it atributo} son atributos opcionales del parámetro (las comas que preceden a los atributos se pueden omitir). \para{Atributos opcionales} \vspace*{-8pt} \begin{description} \item[{\tt integer}]\hspace*{0pt}\\ especifica que el parámetro es entero; \item[{\tt binary}]\hspace*{0pt}\\ especifica que el parámetro es binario; \item[{\tt symbolic}]\hspace*{0pt}\\ especifica que el parámetro es simbólico; \item[{\it relación expresión}]\hspace*{0pt}\\ (donde {\it relación} es alguno de: {\tt<}, {\tt<=}, {\tt=}, {\tt==}, {\tt>=}, {\tt>}, {\tt<>}, {\tt!=})\\ especifica una condición que restringe al parámetro o a sus miembros a satisfacer aquella condición; \item[{\tt in} {\it expresión}]\hspace*{0pt}\\ especifica un superconjunto que restringe al parámetro o a sus miembros a estar incluidos en aquel superconjunto; \item[{\tt:=} {\it expresión}]\hspace*{0pt}\\ especifica un valor asignado al parámetro o a sus miembros; \item[{\tt default} {\it expresión}]\hspace*{0pt}\\ especifica un valor asignado al parámetro o a sus miembros cuando no haya datos apropiados disponibles en la sección de datos. \end{description} \vspace*{-8pt} \para{Ejemplos} \begin{verbatim} param unidades{insumo,producto} >= 0; param ganancia{producto, 1..T+1}; param N := 20 integer >= 0 <= 100; param combinacion 'n elige k' {n in 0..N, k in 0..n} := if k = 0 or k = n then 1 else combinacion[n-1,k-1] + combinacion[n-1,k]; param p{i in I, j in J}, integer, >= 0, <= i+j, in A[i] symdiff B[j], in C[i,j], default 0.5 * (i + j); param mes symbolic default 'May' in {'Mar', 'Abr', 'May'}; \end{verbatim} La sentencia parameter declara un parámetro. Si el dominio del subíndice no se especifica, el parámetro es un parámetro simple (escalar); de otro modo es un arreglo $n$-dimensional. Los atributos de tipo {\tt integer}, {\tt binary} y {\tt symbolic} califican el tipo de valores que se le puede asignar al parámetro como se muestra a continuación: \noindent\hfil \begin{tabular}{@{}ll@{}} Atributo de tipo&Valores asignado\\ \hline (no especificado)&Cualquier valor numérico\\ {\tt integer}&Solamente valores numéricos enteros\\ {\tt binary}&Tanto 0 como 1\\ {\tt symbolic}&Cualquier valor numérico y simbólico\\ \end{tabular} El atributo {\tt symbolic} no se puede especificar junto con otros atributos de tipo. Cuando se especifica debe preceder a todos los demás atributos. El atributo de condición especifica una condición opcional que restringe los valores asignados al parámetro a satisfacer esta condición. Este atributo tiene las siguientes formas sintácticas: \begin{tabular}{@{}ll@{}} {\tt<} $v$&comprueba si $x=} $v$&comprueba si $x\geq v$\\ {\tt>} $v$&comprueba si $x\geq v$\\ {\tt<>} $v$, {\tt!=} $v$&comprueba si $x\neq v$\\ \end{tabular} \noindent donde $x$ es un valor asignado al parámetro y $v$ es el valor resultante de una expresión numérica o simbólica especificada en el atributo de condición. Se puede especificar un número arbitrario de atributos de condición para el mismo parámetro. Si el valor que se está asignando al parámetro durante la evaluación del modelo viola al menos una de las condiciones especificadas, se producirá un error. (Debe notarse que los valores simbólicos se ordenan lexicográficamente y que cualquier valor numérico precede a cualquier valor simbólico.) El atributo {\tt in} es semejante al atributo de condición y especifica una expresión de conjunto cuyo valor resultante es un superconjunto usado para restringir los valores numéricos o simbólicos asignados al parámetro a estar incluidos en aquel superconjunto. Se puede especificar un número arbitrario de atributos {\tt in} para el mismo parámetro. Si el valor que se está asignando al parámetro durante la evaluación del modelo no pertenece al menos a uno de los superconjuntos especificados, se producirá un error. El atributo de asignación ({\tt:=}) especifica una expresión numérica o simbólica usada para calcular un valor asignado al parámetro (si es un parámetro simple) o a sus miembros (si el parámetro es un arreglo). Si se especifica el atributo de asignación, el parámetro es {\it calculable} y consecuentemente no es necesario proveer datos en la sección de datos. Si no se especifica el atributo de asignación, entonces se deben proveer datos para el parámetro en la sección de datos. Como mucho, se puede especificar una asignación o un atributo {\tt default} para el mismo conjunto. El atributo {\tt default} especifica una expresión numérica o simbólica que se usa para calcular un valor asignado al parámetro o a sus miembros, toda vez que no haya datos apropiados disponibles en la sección de datos. Si no se especifica una asignación ni un atributo {\tt default}, la carencia de datos causará un error. \section{Sentencia variable} \noindent \framebox[468pt][l]{ \parbox[c][24pt]{468pt}{ \hspace{6pt} {\tt var} {\it nombre} {\it alias} {\it dominio} {\tt,} {\it atributo} {\tt,} \dots {\tt,} {\it atributo} {\tt;} }} \medskip \noindent {\it nombre} es el nombre simbólico de la variable; \noindent {\it alias} es un literal de cadena opcional que especifica un alias para la variable; \noindent {\it dominio} es una expresión indizante opcional que especifica el dominio del subíndice de la variable; \noindent {\it atributo}, \dots, {\it atributo} son atributos opcionales de la variable (las comas que preceden a los atributos se pueden omitir). \para{Atributos opcionales} \vspace*{-8pt} \begin{description} \item[{\tt integer}]\hspace*{0pt}\\ restringe la variable a ser entera; \item[{\tt binary}]\hspace*{0pt}\\ restringe la variable a ser binaria; \item[{\tt>=} {\it expresión}]\hspace*{0pt}\\ especifica una cota inferior para la variable; \item[{\tt<=} {\it expresión}]\hspace*{0pt}\\ especifica una cota superior para la variable; \item[{\tt=} {\it expresión}]\hspace*{0pt}\\ especifica un valor fijo para la variable. \end{description} \vspace*{-8pt} \para{Ejemplos} \begin{verbatim} var x >= 0; var y{I,J}; var elaborar{p in producto}, integer, >= compromiso[p], <= mercado[p]; var almacenar{insumo, 1..T+1} >= 0; var z{i in I, j in J} >= i+j; \end{verbatim} La sentencia variable declara una variable. Si no se especifica el dominio del subíndice, la variable es una variable simple (escalar); de otro modo es un arreglo $n$-dimensional de variables elementales. Las variables elementales asociadas con una variable del modelo (si es una variable simple) o sus miembros (si es un arreglo) corresponde a las variables en la formulación del problema de PL/PEM (ver Sección \ref{problem}, página \pageref{problem}). Debe notarse que sólo variables elementales realmente referenciadas en algunas restricciones y/u objetivos se incluirán en la instancia del problema de PL/PEM que se generará. Los atributos de tipo {\tt integer} y {\tt binary} restringen la variable a ser entera o binaria, respectivamente. Si no se especifica un atributo de tipo, la variable será continua. Si todas las variables en el modelo son continuas, el problema correspondiente será de la clase PL. Si hay al menos una variable entera o binaria, el problema será de la clase PEM. El atributo de cota inferior ({\tt>=}) especifica una expresión numérica para calcular la cota inferior de la variable. Se puede especificar una cota inferior como máximo. Por defecto, todas las variables no tienen cota inferior (excepto las binarias), de modo que si se requiere que sea no-negativa, su cota inferior cero debe especificarse explícitamente. El atributo de cota superior ({\tt<=}) especifica una expresión numérica para calcular la cota superior de la variable. Se puede especificar una cota superior como máximo. El atributo de valor fijo ({\tt=}) especifica una expresión numérica para calcular el valor en el cual se fijará la variable. Este atributo no puede especificarse junto con los atributos de cota. \section{Sentencia constraint} \noindent \framebox[468pt][l]{ \parbox[c][106pt]{468pt}{ \hspace{6pt} {\tt s.t.} {\it nombre} {\it alias} {\it dominio} {\tt:} {\it expresión} {\tt,} {\tt=} {\it expresión} {\tt;} \medskip \hspace{6pt} {\tt s.t.} {\it nombre} {\it alias} {\it dominio} {\tt:} {\it expresión} {\tt,} {\tt<=} {\it expresión} {\tt;} \medskip \hspace{6pt} {\tt s.t.} {\it nombre} {\it alias} {\it dominio} {\tt:} {\it expresión} {\tt,} {\tt>=} {\it expresión} {\tt;} \medskip \hspace{6pt} {\tt s.t.} {\it nombre} {\it alias} {\it dominio} {\tt:} {\it expresión} {\tt,} {\tt<=} {\it expresión} {\tt,} {\tt<=} {\it expresión} {\tt;} \medskip \hspace{6pt} {\tt s.t.} {\it nombre} {\it alias} {\it dominio} {\tt:} {\it expresión} {\tt,} {\tt>=} {\it expresión} {\tt,} {\tt>=} {\it expresión} {\tt;} }} \medskip \noindent {\it nombre} es el nombre simbólico de la restricción; \noindent {\it alias} es un literal de cadena opcional que especifica un alias para la restricción; \noindent {\it dominio} es una expresión indizante opcional que especifica el dominio del subíndice de la restricción; \noindent {\it expresión} es una expresión lineal usada para calcular un componente de la restricción (las comas que siguen a las expresiones pueden omitirse). \noindent (La palabra clave {\tt s.t.} se puede escribir como {\tt subject to}, o como {\tt subj to} o ser completamente omitida.) \para{Ejemplos} \begin{verbatim} s.t. r: x + y + z, >= 0, <= 1; limite{t in 1..T}: sum{j in producto} elaborar[j,t] <= max_producto; subject to balance{i in insumo, t in 1..T}: almacenar[i,t+1] = almacenar[i,t] - sum{j in producto} unidades[i,j] * elaborar[j,t]; subject to ltn 'limite tiempo normal' {t in tiempo}: sum{p in producto} pt[p] * rprd[p,t] <= 1.3 * dpp[t] * brigadas[t]; \end{verbatim} La sentencia constraint declara una restricción. Si no se especifica el dominio del subíndice, la restricción es una restricción simple (escalar); de otro modo, es un arreglo $n$-dimensional de restricciones elementales. Las restricciones elementales asociadas con la restricción del modelo (si es una restricción simple) o sus miembros (si es un arreglo) corresponde a las restricciones lineales en la formulación del problema de PL/PEM (ver Sección \ref{problem}, página \pageref{problem}). Si la restricción tiene la forma de una igualdad o desigualdad simple, {\it i.e.} incluye dos expresiones, una de las cuales está a continuación de los dos puntos y la otra está a continuación del signo relacional {\tt=}, {\tt<=} o {\tt>=}, ambas expresiones de la sentencia pueden ser expresiones lineales. Si la restricción tiene la forma de una doble desigualdad, {\it i.e.} incluye tres expresiones, la expresión del medio puede ser una expresión lineal mientras que la de la izquierda y la de la derecha sólo pueden ser expresiones numéricas. Generar el modelo es, groseramente hablando, generar sus restricciones, las que son siempre evaluadas para todo el dominio del subíndice. A su vez, la evaluación de las restricciones lleva a la evaluación de otros objetos del modelo tales como los conjuntos, los parámetros y las variables. La construcción de una restricción lineal real incluida en la instancia del problema, la cual corresponde a una restricción elemental particular, se realiza como sigue. Si la restricción tiene la forma de una igualdad o desigualdad simple, la evaluación de ambas expresiones lineales resulta en dos formas lineales: $$\begin{array}{r@{\ }c@{\ }r@{\ }c@{\ }r@{\ }c@{\ }r@{\ }c@{\ }r} f&=&a_1x_1&+&a_2x_2&+\dots+&a_nx_n&+&a_0,\\ g&=&b_1x_1&+&b_2x_2&+\dots+&b_nx_n&+&b_0,\\ \end{array}$$ donde $x_1$, $x_2$, \dots, $x_n$ son variables elementales; $a_1$, $a_2$, \dots, $a_n$, $b_1$, $b_2$, \dots, $b_n$ son coeficientes numéricos y $a_0$ y $b_0$ son términos constantes. Luego, todos los términos lineales de $f$ y $g$ se llevan al lado izquierdo y los términos constantes se llevan al lado derecho, para dar la restricción elemental final en forma estándar: $$(a_1-b_1)x_1+(a_2-b_2)x_2+\dots+(a_n-b_n)x_n\left\{ \begin{array}{@{}c@{}}=\\\leq\\\geq\\\end{array}\right\}b_0-a_0.$$ Si la restricción tiene la forma de una doble desigualdad, la evaluación de la expresión lineal del medio resulta en una forma lineal: $$f=a_1x_1+a_2x_2+\dots+a_nx_n+a_0,$$ y la evaluación de las expresiones numéricas de la izquierda y de la derecha dará dos valores numéricos $l$ y $u$, respectivamente. Luego, el término constante de la forma lineal se lleva tanto a la izquierda como a la derecha para dar la restricción elemental final en forma estándar: $$l-a_0\leq a_1x_1+a_2x_2+\dots+a_nx_n\leq u-a_0.$$ \section{Sentencia objective} \noindent \framebox[468pt][l]{ \parbox[c][44pt]{468pt}{ \hspace{6pt} {\tt minimize} {\it nombre} {\it alias} {\it dominio} {\tt:} {\it expresión} {\tt;} \medskip \hspace{6pt} {\tt maximize} {\it nombre} {\it alias} {\it dominio} {\tt:} {\it expresión} {\tt;} }} \medskip \noindent {\it nombre} es el nombre simbólico del objetivo; \noindent {\it alias} es un literal de cadena opcional que especifica un alias para el objetivo; \noindent {\it dominio} es una expresión indizante opcional que especifica el dominio del subíndice del objetivo; \noindent {\it expresión} es una expresión lineal usada para calcular la forma lineal del objetivo. \para{Ejemplos} \begin{verbatim} minimize objetivo: x + 1.5 * (y + z); maximize ganancia_total: sum{p in producto} ganancia[p] * elaborar[p]; \end{verbatim} La sentencia objective declara un objetivo. Si no se especifica el dominio del subíndice, el objetivo es un objetivo simple (escalar); de otro modo, es un arreglo $n$-dimensional de objetivos elementales. Los objetivos elementales asociados con el objetivo del modelo (si es un objetivo simple) o sus miembros (si es un arreglo) corresponden a restricciones lineales generales en la formulación del problema de PL/PEM (ver Sección \ref{problem}, página \pageref{problem}). Sin embargo, a diferencia de las restricciones, las correspondientes formas lineales son libres (no tienen cota). La construcción de una restricción lineal real incluida en la instancia del problema, la cual corresponde a una restricción elemental particular, se realiza como sigue. La expresión lineal especificada en la sentencia objective se evalúa para resultar en una forma lineal: $$f=a_1x_1+a_2x_2+\dots+a_nx_n+a_0,$$ donde $x_1$, $x_2$, \dots, $x_n$ son variables elementales; $a_1$, $a_2$, \dots, $a_n$ son coeficientes numéricos y $a_0$ es el término constante. Luego se usa la forma lineal para construir la restricción elemental final en forma estándar: $$-\infty= 0 and y >= 0; check sum{i in ORIGEN} oferta[i] = sum{j in DESTINO} demanda[j]; check{i in I, j in 1..10}: S[i,j] in U[i] union V[j]; \end{verbatim} El sentencia check permite comprobar el valor resultante de una expresión lógica especificada en la sentencia. Si el valor es {\it falso} se reporta un error. Si el dominio del subíndice no se especifica, la comprobación se ejecuta solamente una vez. Especificar el dominio del subíndice permite ejecutar múltiples comprobaciones para cada $n$-tuplo en el conjunto dominio. En este último caso, la expresión lógica puede incluir índices introducidos en la correspondiente expresión indizante. \section{Sentencia display} \noindent \framebox[468pt][l]{ \parbox[c][24pt]{468pt}{ \hspace{6pt} {\tt display} {\it dominio} {\tt:} {\it ítem} {\tt,} \dots {\tt,} {\it ítem} {\tt;} }} \medskip \noindent {\it dominio} es una expresión indizante opcional que especifica el dominio del subíndice de la sentencia display; \noindent {\it ítem}, \dots, {\it ítem} son ítems que se mostrarán (los dos puntos que preceden al primer ítem pueden omitirse). \para{Ejemplos} \begin{verbatim} display: 'x =', x, 'y =', y, 'z =', z; display sqrt(x ** 2 + y ** 2 + z ** 2); display{i in I, j in J}: i, j, a[i,j], b[i,j]; \end{verbatim} La sentencia display evalúa todos los ítems especificados en la sentencia y escribe sus valores en la salida estándar (terminal) en formato de texto plano. Si el dominio del subíndice no se especifica, los ítems son evaluados y mostrados solamente una vez. Especificar el dominio del subíndice produce que los ítems sean evaluados y mostrados para cada $n$-tuplo en el conjunto dominio. En este último caso, los ítems pueden incluir índices introducidos en la correspondiente expresión indizante. Un ítem a ser mostrado puede ser un objeto del modelo (conjunto, parámetro, variable, restricción u objetivo) o una expresión. Si el ítem es un objeto calculable ({\it i.e.} un conjunto o parámetro provisto con el atributo de asignación), el mismo es evaluado a través de todo su dominio y luego se muestra su contenido ({\it i.e.} el contenido del arreglo de objetos). De otro modo, si el ítem no es un objeto calculable, solamente se muestra su contenido corriente ({\it i.e.} los miembros realmente generados durante la evaluación del modelo). Si el ítem es una expresión, la misma se evalúa y se muestra su valor resultante. \section{Sentencia printf} \noindent \framebox[468pt][l]{ \parbox[c][64pt]{468pt}{ \hspace{6pt} {\tt printf} {\it dominio} {\tt:} {\it formato} {\tt,} {\it expresión} {\tt,} \dots {\tt,} {\it expresión} {\tt;} \medskip \hspace{6pt} {\tt printf} {\it dominio} {\tt:} {\it formato} {\tt,} {\it expresión} {\tt,} \dots {\tt,} {\it expresión} {\tt>} {\it archivo} {\tt;} \medskip \hspace{6pt} {\tt printf} {\it dominio} {\tt:} {\it formato} {\tt,} {\it expresión} {\tt,} \dots {\tt,} {\it expresión} {\tt>}{\tt>} {\it archivo} {\tt;} }} \medskip \noindent {\it dominio} es una expresión indizante opcional que especifica el dominio del subíndice de la sentencia printf; \noindent {\it formato} es una expresión simbólica cuyo valor especifica una cadena de control de formato (los dos puntos que preceden a la expresión de formato pueden omitirse). \noindent {\it expresión}, \dots, {\it expresión} son cero o más expresiones cuyos valores deben ser formateados e impresos. Cada expresión debe ser de tipo numérico, simbólico o lógico. \noindent {\it archivo} es una expresión simbólica cuyo valor especifica el nombre de un archivo de texto al cual se redirigirá la salida. La señal {\tt>} significa la creación de un archivo nuevo y vacío, mientras que la señal {\tt>}{\tt>} significa anexar la salida a un archivo existente. Si no se especifica un nombre de archivo, la salida se escribe en la salida estándar (terminal). \para{Ejemplos} \begin{verbatim} printf 'Hola, mundo!\n'; printf: "x = %.3f; y = %.3f; z = %.3f\n", x, y, z > "resultado.txt"; printf{i in I, j in J}: "el flujo desde %s hacia %s es %d\n", i, j, x[i,j] >> archivo_resultados & ".txt"; printf{i in I} 'el flujo total de %s es %g\n', i, sum{j in J} x[i,j]; printf{k in K} "x[%s] = " & (if x[k] < 0 then "?" else "%g"), k, x[k]; \end{verbatim} La sentencia printf es semejante a la sentencia display; sin embargo, la misma permite formatear los datos que se escribirán. Si el dominio del subíndice no se especifica, la sentencia printf es ejecutada solamente una vez. Especificar el dominio del subíndice produce que la sentencia printf sea ejecutada para cada $n$-tuplo en el conjunto dominio. En este último caso, el formato y la expresión pueden incluir índices introducidos en la correspondiente expresión indizante. La cadena de control de formato es el valor de la expresión simbólica {\it formato} especificado en la sentencia printf. Se compone con cero o más directivas como sigue: caracteres ordinarios (no {\tt\%}), que son copiados sin modificación al flujo de salida, y especificaciones de conversión, cada una de las cuales provoca la evaluación de la expresión correspondiente especificada en la sentencia printf, su formateo y la escritura del valor resultante en el flujo de salida. Las especificaciones de conversión que se pueden usar en la cadena de control de formato son las siguientes: {\tt d}, {\tt i}, {\tt f}, {\tt F}, {\tt e}, {\tt E}, {\tt g}, {\tt G} y {\tt s}. Estas especificaciones tienen la misma semántica y sintaxis que en el lenguaje de programación C. \section{Sentencia for} \noindent \framebox[468pt][l]{ \parbox[c][44pt]{468pt}{ \hspace{6pt} {\tt for} {\it dominio} {\tt:} {\it sentencia} {\tt;} \medskip \hspace{6pt} {\tt for} {\it dominio} {\tt:} {\tt\{} {\it sentencia} \dots {\it sentencia} {\tt\}} {\tt;} }} \medskip \noindent {\it dominio} es una expresión indizante opcional que especifica el dominio del subíndice de la sentencia for (los dos puntos a continuación de la expresión indizante pueden omitirse); \noindent {\it sentencia} es una sentencia que será ejecutada bajo el control de la sentencia for; \noindent {\it sentencia}, \dots, {\it sentencia} es una secuencia de sentencias (encerrada entre llaves) que serán ejecutadas bajo el control de la sentencia for. Solamente se pueden usar las siguientes sentencias dentro de la sentencia for: check, display, printf y otra sentencia for. \para{Ejemplos} \begin{verbatim} for {(i,j) in E: i != j} { printf "el flujo desde %s hacia %s es %g\n", i, j, x[i,j]; check x[i,j] >= 0; } for {i in 1..n} { for {j in 1..n} printf " %s", if x[i,j] then "Q" else "."; printf("\n"); } for {1..72} printf("*"); \end{verbatim} La sentencia for provoca que la sentencia o secuencia de sentencias especificadas como parte de la sentencia for sea ejecutada para cada $n$-tuplo en el conjunto dominio. De modo que las sentencias dentro de la sentencia for pueden incluir índices introducidos en la correspondiente expresión indizante. \section{Sentencia table} \noindent \framebox[468pt][l]{ \parbox[c][80pt]{468pt}{ \hspace{6pt} {\tt table} {\it nombre} {\it alias} {\tt IN} {\it controlador} {\it arg} \dots {\it arg} {\tt:} \hspace{6pt} {\tt\ \ \ \ \ } {\it conjunto} {\tt<-} {\tt[} {\it cmp} {\tt,} \dots {\tt,} {\it cmp} {\tt]} {\tt,} {\it par} {\tt\textasciitilde} {\it cmp} {\tt,} \dots {\tt,} {\it par} {\tt\textasciitilde} {\it cmp} {\tt;} \medskip \hspace{6pt} {\tt table} {\it nombre} {\it alias} {\it dominio} {\tt OUT} {\it controlador} {\it arg} \dots {\it arg} {\tt:} \hspace{6pt} {\tt\ \ \ \ \ } {\it expr} {\tt\textasciitilde} {\it cmp} {\tt,} \dots {\tt,} {\it expr} {\tt\textasciitilde} {\it cmp} {\tt;} }} \medskip \noindent {\it nombre} es el nombre simbólico de la tabla; \noindent {\it alias} es un literal de cadena opcional que especifica un alias para la tabla; \noindent {\it dominio} es una expresión indizante que especifica el dominio del subíndice de la tabla (de salida); \noindent {\tt IN} significa leer datos desde la tabla de entrada; \noindent {\tt OUT} significa escribir datos en la tabla de salida; \noindent {\it controlador} es una expresión simbólica que especifica el controlador usado para acceder a la tabla (para más detalles, ver Apéndice \ref{drivers}, página \pageref{drivers}); \noindent {\it arg} es una expresión simbólica opcional que es un argumento pasado al controlador de la tabla. Esta expresión simbólica no debe incluir índices especificados en el dominio; \noindent {\it conjunto} es el nombre de un conjunto simple opcional llamado {\it conjunto de control}. Puede ser omitido junto con el delimitador {\tt<-}; \noindent {\it cmp} es un nombre de campo. Entre corchetes se debe especificar al menos un campo. El nombre de campo a continuación de un nombre de parámetro o de una expresión es opcional y puede ser omitido junto con el delimitador~{\tt\textasciitilde}, en cuyo caso el nombre del objeto del modelo que corresponda se usará como el nombre de campo; \noindent {\it par} es el nombre simbólico de un parámetro del modelo; \noindent {\it expr} es una expresión numérica o simbólica. \para{Ejemplos} \begin{verbatim} table datos IN "CSV" "datos.csv": M <- [DESDE,HACIA], d~DISTANCIA, c~COSTO; table resultado{(s,h) in M} OUT "CSV" "resultado.csv": s~DESDE, h~HACIA, x[s,h]~FLUJO; \end{verbatim} La sentencia table permite leer datos desde una tabla y asignarlos a objetos del modelo tales como conjuntos y parámetros (no escalares), al igual que escribir datos del modelo en una tabla. \subsection{Estructura de tablas} Una {\it tabla de datos} es un conjunto (desordenado) de {\it registros}, en el que cada registro consiste del mismo número de {\it campos}, y cada campo está provisto de un nombre simbólico único denominado {\it nombre de campo}. Por ejemplo: \bigskip \begin{tabular}{@{\hspace*{51mm}}c@{\hspace*{9mm}}c@{\hspace*{10mm}}c @{\hspace*{7mm}}c} Primer&Segundo&&Último\\ campo&campo&.\ \ .\ \ .&campo\\ $\downarrow$&$\downarrow$&&$\downarrow$\\ \end{tabular} \begin{tabular}{ll@{}} Encabezado de tabla&$\rightarrow$\\ Primer registro&$\rightarrow$\\ Segundo registro&$\rightarrow$\\ \\ \hfil .\ \ .\ \ .\\ \\ Último registro&$\rightarrow$\\ \end{tabular} \begin{tabular}{|l|l|c|c|} \hline {\tt DESDE}&{\tt HACIA}&{\tt DISTANCIA}&{\tt COSTO}\\ \hline {\tt Seattle} &{\tt New-York}&{\tt 2.5}&{\tt 0.12}\\ {\tt Seattle} &{\tt Chicago} &{\tt 1.7}&{\tt 0.08}\\ {\tt Seattle} &{\tt Topeka} &{\tt 1.8}&{\tt 0.09}\\ {\tt San-Diego}&{\tt New-York}&{\tt 2.5}&{\tt 0.15}\\ {\tt San-Diego}&{\tt Chicago} &{\tt 1.8}&{\tt 0.10}\\ {\tt San-Diego}&{\tt Topeka} &{\tt 1.4}&{\tt 0.07}\\ \hline \end{tabular} \subsection{Lectura de datos desde una tabla de entrada} La sentencia table de entrada produce la lectura de los datos desde la tabla especificada, registro por registro. Una vez que se ha leído el próximo registro, los valores numéricos o simbólicos de los campos cuyos nombres se han encerrado entre corchetes en la sentencia table se reúnen en un $n$-tuplo y, si se ha especificado el conjunto de control en la sentencia table, este $n$-tuplo es agregado al mismo. Además, un valor numérico o simbólico de cada campo asociado con un parámetro del modelo se asigna al miembro del parámetro identificado por subíndices, los cuales son componentes del $n$-tuplo que se acaba de leer. Por ejemplo, la siguiente sentencia table de entrada: \noindent\hfil \verb|table datos IN "...": M <- [DESDE,HACIA], d~DISTANCIA, c~COSTO;| \noindent produce la lectura de valores de cuatro campos llamados {\tt DESDE}, {\tt HACIA}, {\tt DISTANCIA} y {\tt COSTO} de cada registro de la tabla especificada. Los valores de los campos {\tt DESDE} y {\tt HACIA} proveen un par $(s,h)$ que se agrega al conjunto de control {\tt M}. El valor del campo {\tt DISTANCIA} se asigna al miembro del parámetro ${\tt d}[s,h]$ y el valor del campo {\tt COSTO} se asigna al miembro del parámetro ${\tt c}[s,h]$. Debe notarse que la tabla de entrada puede contener campos adicionales cuyos nombres no sean especificados en la sentencia table, en cuyo caso los valores de estos campos serán ignorados al leer la tabla. \subsection{Escritura de datos en una tabla de salida} La sentencia table de salida produce la escritura de datos en la tabla especificada. Debe notarse que algunos controladores (concretamente CSV y xBASE) destruyen la tabla de salida antes de escribir los datos, {\it i.e.} borran todos sus registros existentes. Cada $n$-tuplo en el conjunto dominio especificado genera un registro escrito en la tabla de salida. Los valores de los campos son valores numéricos o simbólicos de las correspondientes expresiones especificadas en la sentencia table. Estas expresiones se evalúan para cada $n$-tuplo en el conjunto dominio y, de este modo, puede incluir índices que se introdujeron en la correspondiente expresión indizante. Por ejemplo, la siguiente sentencia table de salida: \noindent\hfil \verb|table resultado{(s,h) in M} OUT "...": s~DESDE, h~HACIA, x[s,h]~FLUJO;| \noindent produce la escritura de registros en la tabla de salida, a razón de un registro por cada par $(s,h)$ en el conjunto {\tt M}, en el que cada registro consiste de tres campos llamados {\tt DESDE}, {\tt HACIA} y {\tt FLUJO}. Los valores escritos en los campos {\tt DESDE} y {\tt HACIA} son los valores corrientes de los índices {\tt s} y {\tt h}, y el valor escrito en el campo {\tt FLUJO} es un valor del miembro ${\tt x}[s,h]$ del correspondiente parámetro o variable indexada. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Datos del modelo} Los {\it datos del modelo} incluyen conjuntos elementales, los cuales son ``valores'' de los conjuntos del modelo, y valores simbólicos y numéricos de los parámetros del modelo. En MathProg hay dos maneras diferentes de proveer valores para los conjuntos y parámetros del modelo. Una manera es simplemente proveyendo los datos necesarios mediante el atributo de asignación. Sin embargo, en muchos casos es más práctico separar el modelo en sí mismo de los datos particulares necesarios para el modelo. Por esta última razón, en MathProg hay otra manera que consiste en separar la descripción del modelo en dos partes: la sección del modelo y la sección de los datos. La {\it sección del modelo} es la parte principal de la descripción del modelo que contiene las declaraciones de todos los objetos del modelo y es común a todos los problemas basados en tal modelo. La {\it sección de los datos} es una parte opcional de la descripción del modelo que contiene datos específicos para un problema particular. En MathProg las secciones del modelo y de los datos se pueden ubicar tanto en un único archivo de texto, como en dos archivos de texto separados. 1. Si ambas secciones se ubican en un archivo, este debe componerse como sigue: \bigskip \noindent\hfil \framebox{\begin{tabular}{l} {\it sentencia}{\tt;}\\ {\it sentencia}{\tt;}\\ \hfil.\ \ .\ \ .\\ {\it sentencia}{\tt;}\\ {\tt data;}\\ {\it bloque de datos}{\tt;}\\ {\it bloque de datos}{\tt;}\\ \hfil.\ \ .\ \ .\\ {\it bloque de datos}{\tt;}\\ {\tt end;} \end{tabular}} \newpage 2. Si ambas secciones se ubican en dos archivos separados, los archivos se componen como sigue: \bigskip \noindent\hfil \begin{tabular}{@{}c@{}} \framebox{\begin{tabular}{l} {\it sentencia}{\tt;}\\ {\it sentencia}{\tt;}\\ \hfil.\ \ .\ \ .\\ {\it sentencia}{\tt;}\\ {\tt end;}\\ \end{tabular}}\\ \\\\Archivo del modelo\\ \end{tabular} \hspace{32pt} \begin{tabular}{@{}c@{}} \framebox{\begin{tabular}{l} {\tt data;}\\ {\it bloque de datos}{\tt;}\\ {\it bloque de datos}{\tt;}\\ \hfil.\ \ .\ \ .\\ {\it bloque de datos}{\tt;}\\ {\tt end;}\\ \end{tabular}}\\ \\Archivo de datos\\ \end{tabular} \bigskip Nota: si la sección de datos se ubica en un archivo separado, la palabra clave {\tt data} es opcional y puede omitirse, al igual que el punto y coma que le sigue. \section{Codificación de la sección de los datos} La {\it sección de los datos} es una secuencia de bloques de datos en varios formatos que se discuten en las siguientes secciones. El orden que siguen los bloques de datos en la sección de los datos puede ser arbitrario, no necesariamente el mismo que se siguió en la sección del modelo para sus correspondientes objetos. Las reglas para codificar la sección de los datos comúnmente son las mismas reglas que para codificar la descripción del modelo (ver Sección \ref{coding}, página \pageref{coding}), {\it i.e.} los bloques de datos se componen con unidades léxicas básicas como nombres simbólicos, literales numéricos y de cadena, palabras clave, delimitadores y comentarios. Sin embargo, por conveniencia y para mejorar la legibilidad hay una desviación de la regla común: si un literal de cadena consiste únicamente de caracteres alfanuméricos (incluyendo el carácter de subrayado), los signos {\tt+} y {\tt-} y/o el punto decimal, el mismo puede codificarse sin comillas delimitadoras (simples o dobles). Todo el material numérico y simbólico provisto en la sección de los datos se codifica en la forma de números y símbolos, {\it i.e.} a diferencia de la sección del modelo, en la sección de los datos no se permiten expresiones. Sin embargo, los signos {\tt+} y {\tt-} pueden preceder a literales numéricos para permitir la codificación de cantidades numéricas con signo, en cuyo caso no debe haber caracteres de espacio en blanco entre el signo y el literal numérico que le sigue (si hay al menos un espacio en blanco, el signo y el literal numérico que le sigue serán reconocidos como dos unidades léxicas diferentes). \newpage \section{Bloque de datos de conjunto} \noindent \framebox[468pt][l]{ \parbox[c][44pt]{468pt}{ \hspace{6pt} {\tt set} {\it nombre} {\tt,} {\it registro} {\tt,} \dots {\tt,} {\it registro} {\tt;} \medskip \hspace{6pt} {\tt set} {\it nombre} {\tt[} {\it símbolo} {\tt,} \dots {\tt,} {\it símbolo} {\tt]} {\tt,} {\it registro} {\tt,} \dots {\tt,} {\it registro} {\tt;} }} \medskip \noindent {\it nombre} es el nombre simbólico del conjunto; \noindent {\it símbolo}, \dots, {\it símbolo} son subíndices que especifican un miembro particular del conjunto (si el conjunto es un arreglo, {\it i.e.} un conjunto de conjuntos); \noindent {\it registro}, \dots, {\it registro} son registros. \noindent Las comas que preceden a los registros pueden omitirse. \para{Registros} \vspace*{-8pt} \begin{description} \item[{\tt :=}]\hspace*{0pt}\\ es un elemento de asignación de registro no-significativo que puede ser usado libremente para mejorar la legibilidad; \item[{\tt(} {\it porción} {\tt)}]\hspace*{0pt}\\ especifica una porción; \item[{\it datos-simples}]\hspace*{0pt}\\ especifica los datos del conjunto en formato simple; \item[{\tt:} {\it datos-matriciales}]\hspace*{0pt}\\ especifica los datos del conjunto en formato matricial; \item[{\tt(tr)} {\tt:} {\it datos-matriciales}]\hspace*{0pt}\\ especifica los datos del conjunto en formato matricial traspuesto (en este caso, los dos puntos que siguen a la palabra clave {\tt(tr)} pueden omitirse). \end{description} \vspace*{-8pt} \para{Ejemplos} \begin{verbatim} set mes := Ene Feb Mar Abr May Jun; set mes "Ene", "Feb", "Mar", "Abr", "May", "Jun"; set A[3,Mar] := (1,2) (2,3) (4,2) (3,1) (2,2) (4,4) (3,4); set A[3,'Mar'] := 1 2 2 3 4 2 3 1 2 2 4 4 3 4; set A[3,'Mar'] : 1 2 3 4 := 1 - + - - 2 - + + - 3 + - - + 4 - + - + ; set B := (1,2,3) (1,3,2) (2,3,1) (2,1,3) (1,2,2) (1,1,1) (2,1,1); set B := (*,*,*) 1 2 3, 1 3 2, 2 3 1, 2 1 3, 1 2 2, 1 1 1, 2 1 1; set B := (1,*,2) 3 2 (2,*,1) 3 1 (1,2,3) (2,1,3) (1,1,1); set B := (1,*,*) : 1 2 3 := 1 + - - 2 - + + 3 - + - (2,*,*) : 1 2 3 := 1 + - + 2 - - - 3 + - - ; \end{verbatim} \noindent(En estos ejemplos, {\tt mes} es un conjunto simple de singletones, {\tt A} es un arreglo 2-dimensional de duplos y {\tt B} es un conjunto simple de triplos. Los bloques de datos para el mismo conjunto son equivalentes en el sentido de que especifican los mismos datos en formatos distintos. El {\it bloque de datos del conjunto} se usa para especificar un conjunto elemental completo, el que se asigna a un conjunto (si es un conjunto simple) o a uno de sus miembros (si el conjunto es un arreglo de conjuntos).\footnote{Hay otra forma de especificar datos para un conjunto simple junto con los datos para los parámetros. Esta característica se discute en la próxima sección.} Los bloques de datos sólo pueden ser especificados para conjuntos no-calculables, {\it i.e.} para conjuntos que no tienen el atributo de asignación ({\tt:=}) en la correspondiente sentencia set. Si el conjunto es un conjunto simple, sólo se debe especificar su nombre simbólico en el encabezado del bloque de datos. De otro modo, si el conjunto es un arreglo $n$-dimensional, su nombre simbólico debe proveerse con una lista completa de subíndices separados por coma y encerrados entre corchetes para especificar un miembro particular del arreglo de conjuntos. El número de subíndices debe ser igual a la dimensión del arreglo de conjuntos, en el que cada subíndice deben ser un número o símbolo. Un conjunto elemental definido en el bloque de datos del conjunto se codifica como una secuencia de registros según se describe luego.\footnote{{Registro} es simplemente un término técnico. No significa que los mismos presenten algún formateo especial.} \subsection{Asignación de registro} La {\it asignación de registro} ({\tt:=}) es un elemento no-significativo. Se puede usar para mejorar la legibilidad de los bloques de datos. \subsection{Registro en porción} El {\it registro en porción} es un registro de control que especifica una {\it porción} del conjunto elemental definido en el bloque de datos. Tiene la siguiente forma sintáctica: $$\mbox{{\tt(} $p_1$ {\tt,} $p_2$ {\tt,} \dots {\tt,} $p_n$ {\tt)}}$$ donde $p_1$, $p_2$, \dots, $p_n$ son componentes de la porción. Cada componente de la porción puede ser un número o un símbolo o el asterisco ({\tt*}). El número de componentes de la porción debe coincidir con la dimensión de los $n$-tuplos del conjunto elemental que se define. Por ejemplo, si el conjunto elemental contiene 4-tuplos (cuádruplos), la porción debe tener cuatro componentes. El número de asteriscos en la porción se denomina la {\it dimensión de la porción}. El efecto de usar las porciones es como sigue: si se especifica una porción $m$-dimensional ({\it i.e.} una porción que tiene $m$ asteriscos) en el bloque de datos, todos los registros subsecuentes deben especificar tuplos de dimensión $m$. Cuando se encuentra un $m$-tuplo, cada asterisco en la porción se reemplaza por los correspondientes componentes del $m$-tuplo para dar el $n$-tuplo resultante, el que es incluido en el conjunto elemental que se define. Por ejemplo, si está vigente la porción $(a,*,1,2,*)$ y se encuentra el duplo $(3,b)$ en el registro subsecuente, el 5-tuplo resultante que se incluye en el conjunto elemental es $(a,3,1,2,b)$. Las porciones que no tienen asteriscos en si mismas, definen un $n$-tuplo completo que se incluye en el conjunto elemental. Una vez especificada una porción, la misma está vigente hasta que aparezca una nueva porción o bien hasta que se encuentra el final del bloque de datos. Debe notarse que si no se especifica una porción en el bloque de datos, se asume una cuyos componentes son asteriscos en todas las posiciones. \subsection{Registro simple} El {\it registro simple} define un $n$-tuplo en formato simple y tiene la siguiente forma sintáctica: $$\mbox{$t_1$ {\tt,} $t_2$ {\tt,} \dots {\tt,} $t_n$}$$ donde $t_1$, $t_2$, \dots, $t_n$ son componentes del $n$-tuplo. Cada componente puede ser un número o símbolo. Las comas entre componentes son opcionales y pueden omitirse. \subsection{Registro matricial} El {\it registro matricial} define varios 2-tuplos (duplos) en formato matricial y tiene la siguiente forma sintáctica: $$\begin{array}{cccccc} \mbox{{\tt:}}&c_1&c_2&\dots&c_n&\mbox{{\tt:=}}\\ f_1&a_{11}&a_{12}&\dots&a_{1n}&\\ f_2&a_{21}&a_{22}&\dots&a_{2n}&\\ \multicolumn{5}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}&\\ f_m&a_{m1}&a_{m2}&\dots&a_{mn}&\\ \end{array}$$ donde $f_1$, $f_2$, \dots, $f_m$ son números y/o símbolos que corresponden a filas de la matriz; $c_1$, $c_2$, \dots, $c_n$ son números y/o símbolos que corresponden a columnas de la matriz, mientras que $a_{11}$, $a_{12}$, \dots, $a_{mn}$ son los elementos de la matriz, los cuales pueden ser tanto {\tt+} como {\tt-}. (En este registro, el delimitador {\tt:} que precede a la lista de columnas y el delimitador {\tt:=} a continuación de la lista de columnas, no pueden ser omitidos.) Cada elemento $a_{ij}$ del bloque de datos matricial (donde $1\leq i\leq m$, $1\leq j\leq n$) corresponde a 2-tuplos $(f_i,c_j)$. Si en $a_{ij}$ se indica el signo más ({\tt+}), el correspondiente 2-tuplo (o un $n$-tuplo más largo si se usa una porción) se incluye en el conjunto elemental. De otro modo, si en $a_{ij}$ se indica el signo menos ({\tt-}) el 2-tuplo no se incluye en el conjunto elemental. Puesto que el registro matricial define 2-tuplos, ya sea el conjunto elemental o bien la porción vigente en uso deben ser 2-dimensionales. \subsection{Registro matricial traspuesto} El {\it registro matricial traspuesto} tiene la siguiente forma sintáctica: $$\begin{array}{cccccc} \mbox{{\tt(tr) :}}&c_1&c_2&\dots&c_n&\mbox{{\tt:=}}\\ f_1&a_{11}&a_{12}&\dots&a_{1n}&\\ f_2&a_{21}&a_{22}&\dots&a_{2n}&\\ \multicolumn{5}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}&\\ f_m&a_{m1}&a_{m2}&\dots&a_{mn}&\\ \end{array}$$ (En este caso el delimitador {\tt:} a continuación de la palabra clave {\tt (tr)} es opcional y puede omitirse.) Este registro es completamente análogo al registro matricial (ver anteriormente) con la única excepción, en este caso, de que cada elemento $a_{ij}$ de la matriz corresponde al 2-tuplo $(c_j,f_i)$ en vez de a $(f_i,c_j)$. Una vez especificado, el indicador {\tt(tr)} tiene alcance en todos los registros subsecuentes hasta que se encuentra otra porción o bien el fin del bloque de datos. \section{Bloque de datos de parámetro} \noindent \framebox[468pt][l]{ \parbox[c][88pt]{468pt}{ \hspace{6pt} {\tt param} {\it nombre} {\tt,} {\it registro} {\tt,} \dots {\tt,} {\it registro} {\tt;} \medskip \hspace{6pt} {\tt param} {\it nombre} {\tt default} {\it valor} {\tt,} {\it registro} {\tt,} \dots {\tt,} {\it registro} {\tt;} \medskip \hspace{6pt} {\tt param} {\tt:} {\it datos-tabulación} {\tt;} \medskip \hspace{6pt} {\tt param} {\tt default} {\it valor} {\tt:} {\it datos-tabulación} {\tt;} }} \medskip \noindent {\it nombre} es el nombre simbólico del parámetro; \noindent {\it valor} es un valor por defecto opcional del parámetro; \noindent {\it registro}, \dots, {\it registro} son registros. \noindent {\it datos-tabulación} especifica los datos del parámetro en el formato tabulación. \noindent Las comas que preceden a los registros pueden omitirse. \para{Registros} \vspace*{-8pt} \begin{description} \item[{\tt :=}]\hspace*{0pt}\\ es un elemento de asignación de registro no-significativo que puede ser usado libremente para mejorar la legibilidad; \item[{\tt[} {\it porción} {\tt]}]\hspace*{0pt}\\ especifica una porción; \item[{\it datos-planos}]\hspace*{0pt}\\ especifica los datos del parámetro en formato plano; \item[{\tt:} {\it datos-tabulares}]\hspace*{0pt}\\ especifica los datos del parámetro en formato tabular; \item[{\tt(tr)} {\tt:} {\it datos-tabulares}]\hspace*{0pt}\\ especifica los datos del parámetro en formato matricial traspuesto (en este caso, los dos puntos que siguen a la palabra clave {\tt(tr)} pueden omitirse). \end{description} \vspace*{-8pt} \para{Ejemplos} \begin{verbatim} param T := 4; param mes := 1 Ene 2 Feb 3 Mar 4 Abr 5 May; param mes := [1] 'Ene', [2] 'Feb', [3] 'Mar', [4] 'Abr', [5] 'May'; param stock_inicial := hierro 7.32 niquel 35.8; param stock_inicial [*] hierro 7.32, niquel 35.8; param costo [hierro] .025 [niquel] .03; param valor := hierro -.1, niquel .02; param : stock_inicial costo valor := hierro 7.32 .025 -.1 niquel 35.8 .03 .02 ; param : insumo : stock_inicial costo valor := hierro 7.32 .025 -.1 niquel 35.8 .03 .02 ; param demanda default 0 (tr) : FRA DET LAN WIN STL FRE LAF := laminas 300 . 100 75 . 225 250 rollos 500 750 400 250 . 850 500 cintas 100 . . 50 200 . 250 ; param costo_transporte := [*,*,laminas]: FRA DET LAN WIN STL FRE LAF := GARY 30 10 8 10 11 71 6 CLEV 22 7 10 7 21 82 13 PITT 19 11 12 10 25 83 15 [*,*,rollos]: FRA DET LAN WIN STL FRE LAF := GARY 39 14 11 14 16 82 8 CLEV 27 9 12 9 26 95 17 PITT 24 14 17 13 28 99 20 [*,*,cintas]: FRA DET LAN WIN STL FRE LAF := GARY 41 15 12 16 17 86 8 CLEV 29 9 13 9 28 99 18 PITT 26 14 17 13 31 104 20 ; \end{verbatim} El {\it bloque de datos del parámetro} se usa para especificar datos completos a un parámetro (o a varios parámetros si los datos se especifican en el formato tabulaciones) Los bloques de datos sólo pueden ser especificados para parámetros no-calculables, {\it i.e.} para parámetros que no tienen el atributo de asignación({\tt:=}) en la correspondiente sentencia parameter. Los datos definidos en el bloque de datos del parámetro se codifican como una secuencia de registros descriptos luego. Adicionalmente, el bloque de datos puede ser provisto con el atributo opcional {\tt default}, el cual especifica un valor numérico o simbólico por defecto para el parámetro (parámetros). Este valor por defecto se asigna al parámetro, o a sus miembros, cuando no se definen valores apropiados en el bloque de datos del parámetro. El atributo {\tt default} no se puede usar si ya se ha especificado en la correspondiente sentencia parameter. \subsection{Asignación de registro} La {\it asignación de registro} ({\tt:=}) es un elemento no-significativo. Se puede usar para mejorar la legibilidad de los bloques de datos. \subsection{Registro en porción} El {\it registro en porción} es un registro de control que especifica una {\it porción} del arreglo de parámetros. Tiene la siguiente forma sintáctica: $$\mbox{{\tt[} $p_1$ {\tt,} $p_2$ {\tt,} \dots {\tt,} $p_n$ {\tt]}}$$ donde $p_1$, $p_2$, \dots, $p_n$ son componentes de la porción. Cada componente de la porción puede ser un número o un símbolo o el asterisco ({\tt*}). El número de componentes de la porción debe coincidir con la dimensión del parámetro. Por ejemplo, si el parámetro es un arreglo 4-dimensional, la porción debe tener cuatro componentes. El número de asteriscos en la porción se denomina la {\it dimensión de la porción}. El efecto de usar las porciones es como sigue: si se especifica una porción $m$-dimensional ({\it i.e.} una porción que tiene $m$ asteriscos) en el bloque de datos, todos los registros subsecuentes deben especificar los subíndices de los miembros del parámetro como si el parámetro fuese $m$-dimensional y no $n$-dimensional. Cuando se encuentran los $m$ subíndices, cada asterisco en la porción se reemplaza por el correspondiente subíndice para dar los $n$ subíndices, los cuales definen al miembro corriente del parámetro. Por ejemplo, si está vigente la porción $(a,*,1,2,*)$ y se encuentran los subíndices 3 y $b$ en el registro subsecuente, la lista completa de subíndices que se usa para elegir un miembro del parámetro es $(a,3,1,2,b)$. Se permite especificar una porción que no tenga asteriscos. Tal porción, en sí misma define una lista completa de subíndices, en cuyo caso el próximo registro debe definir solamente un valor individual del correspondiente miembro del parámetro. Una vez especificada una porción, la misma está vigente hasta que aparezca una nueva porción o bien hasta que se encuentra el final del bloque de datos. Debe notarse que si no se especifica una porción en el bloque de datos, se asume una cuyos componentes son todos asteriscos. \subsection{Registro plano} El {\it registro plano} define la lista de subíndices y un valor individual en el formato plano. Este registro tiene la siguiente forma sintáctica: $$\mbox{$t_1$ {\tt,} $t_2$ {\tt,} \dots {\tt,} $t_n$ {\tt,} $v$}$$ donde $t_1$, $t_2$, \dots, $t_n$ son subíndices y $v$ es un valor. Cada subíndice, al igual que el valor, puede ser un número o un símbolo. Las comas que siguen a los subíndices son opcionales y pueden omitirse. En el caso de parámetros o porciones 0-dimensionales, el registro plano no tiene subíndice y consiste solamente de un valor individual. \subsection{Registro tabular} El {\it registro tabular} define varios valores, cada uno de los cuales viene provisto con dos subíndices. Este registro tiene la siguiente forma sintáctica: $$\begin{array}{cccccc} \mbox{{\tt:}}&c_1&c_2&\dots&c_n&\mbox{{\tt:=}}\\ f_1&a_{11}&a_{12}&\dots&a_{1n}&\\ f_2&a_{21}&a_{22}&\dots&a_{2n}&\\ \multicolumn{5}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}&\\ f_m&a_{m1}&a_{m2}&\dots&a_{mn}&\\ \end{array}$$ donde los $f_1$, $f_2$, \dots, $f_m$ son números y/o símbolos que corresponden a filas de la tabla; $c_1$, $c_2$, \dots, $c_n$ son números y/o símbolos que corresponden a columnas de la tabla; mientras que $a_{11}$, $a_{12}$, \dots, $a_{mn}$ son elementos de la tabla. Cada elemento puede ser un número o símbolo o el punto decimal ({\tt.}) solo (en este registro, el delimitador {\tt:} que precede a la lista de columnas y el delimitador {\tt:=} a continuación de la lista de columnas, no pueden ser omitidos.). Cada elemento $a_{ij}$ del bloque de datos tabulares ($1\leq i\leq m$, $1\leq j\leq n$) define dos subíndices, siendo el primero $f_i$ y el segundo $c_j$. Estos subíndices se usan junto con la porción vigente para formar la lista completa de subíndices que identifica a un miembro particular del arreglo de parámetros. Si $a_{ij}$ es un número o símbolo, tal valor se asigna al miembro del parámetro. Sin embargo, si $a_{ij}$ es un punto decimal solo, el miembro recibe el valor por defecto especificado ya sea en el bloque de datos del parámetro o en la sentencia parameter, o si no hay un valor por defecto especificado, el miembro permanece indefinido. Puesto que el registro tabular provee dos subíndices para cada valor, ya sea el parámetro o bien la porción vigente en uso deben ser 2-dimensionales. \subsection{Registro tabular traspuesto} El {\it registro tabular traspuesto} tiene la siguiente forma sintáctica: $$\begin{array}{cccccc} \mbox{{\tt(tr) :}}&c_1&c_2&\dots&c_n&\mbox{{\tt:=}}\\ f_1&a_{11}&a_{12}&\dots&a_{1n}&\\ f_2&a_{21}&a_{22}&\dots&a_{2n}&\\ \multicolumn{5}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}&\\ f_m&a_{m1}&a_{m2}&\dots&a_{mn}&\\ \end{array}$$ (En este caso el delimitador {\tt:} a continuación de la palabra clave {\tt (tr)} es opcional y puede omitirse.) Este registro es completamente análogo al registro tabular (ver anteriormente), con la única excepción de que el primer subíndice definido por el elemento $a_{ij}$ es $c_j$ mientras que el segundo es $f_i$. Una vez especificado, el indicador {\tt(tr)} tiene alcance en todos los registros subsecuentes hasta que se encuentre otra porción o bien el fin del bloque de datos. \subsection{Formato de datos tabulación} El bloque de datos del parámetro en el {\it formato tabulación} tiene la siguiente forma sintáctica: $$ \begin{array}{*{8}{l}} \multicolumn{4}{l} {{\tt param}\ {\tt default}\ valor\ {\tt :}\ c\ {\tt :}}& p_1\ \ \verb|,|&p_2\ \ \verb|,|&\dots\ \verb|,|&p_f\ \ \verb|:=|\\ f_{11}\ \verb|,|& f_{12}\ \verb|,|& \dots\ \verb|,|& f_{1n}\ \verb|,|& a_{11}\ \verb|,|& a_{12}\ \verb|,|& \dots\ \verb|,|& a_{1f}\ \verb|,|\\ f_{21}\ \verb|,|& f_{22}\ \verb|,|& \dots\ \verb|,|& f_{2n}\ \verb|,|& a_{21}\ \verb|,|& a_{22}\ \verb|,|& \dots\ \verb|,|& a_{2f}\ \verb|,|\\ \dots & \dots & \dots & \dots & \dots & \dots & \dots & \dots \\ f_{m1}\ \verb|,|& f_{m2}\ \verb|,|& \dots\ \verb|,|& f_{mn}\ \verb|,|& a_{m1}\ \verb|,|& a_{m2}\ \verb|,|& \dots\ \verb|,|& a_{mf}\ \verb|;|\\ \end{array} $$ 1. La palabra clave {\tt default} puede omitirse junto con el valor que le sigue. 2. El nombre simbólico $c$ puede omitirse junto con los dos puntos que le siguen. 3. Todas las comas son opcionales y pueden omitirse. El bloque de datos en el formato tabulación mostrado arriba es exactamente equivalente a los siguientes bloques de datos: \verb|set| $c$\ \verb|:=|\ $ \verb|(|f_{11}\verb|,|f_{12}\verb|,|\dots\verb|,|f_{1n}\verb|) | \verb|(|f_{21}\verb|,|f_{22}\verb|,|\dots\verb|,|f_{2n}\verb|) | \dots \verb| (|f_{m1}\verb|,|f_{m2}\verb|,|\dots\verb|,|f_{mn}\verb|);|$ \verb|param| $p_1$\ \verb|default|\ $valor$\ \verb|:=| $\verb| | \verb|[|f_{11}\verb|,|f_{12}\verb|,|\dots\verb|,|f_{1n}\verb|] |a_{11} \verb| [|f_{21}\verb|,|f_{22}\verb|,|\dots\verb|,|f_{2n}\verb|] |a_{21} \verb| |\dots \verb| [|f_{m1}\verb|,|f_{m2}\verb|,|\dots\verb|,|f_{mn}\verb|] |a_{m1} \verb|;| $ \verb|param| $p_2$\ \verb|default|\ $valor$\ \verb|:=| $\verb| | \verb|[|f_{11}\verb|,|f_{12}\verb|,|\dots\verb|,|f_{1n}\verb|] |a_{12} \verb| [|f_{21}\verb|,|f_{22}\verb|,|\dots\verb|,|f_{2n}\verb|] |a_{22} \verb| |\dots \verb| [|f_{m1}\verb|,|f_{m2}\verb|,|\dots\verb|,|f_{mn}\verb|] |a_{m2} \verb|;| $ \verb| |.\ \ \ .\ \ \ .\ \ \ .\ \ \ .\ \ \ .\ \ \ .\ \ \ .\ \ \ . \verb|param| $p_f$\ \verb|default|\ $valor$\ \verb|:=| $\verb| | \verb|[|f_{11}\verb|,|f_{12}\verb|,|\dots\verb|,|f_{1n}\verb|] |a_{1f} \verb| [|f_{21}\verb|,|f_{22}\verb|,|\dots\verb|,|f_{2n}\verb|] |a_{2f} \verb| |\dots \verb| [|f_{m1}\verb|,|f_{m2}\verb|,|\dots\verb|,|f_{mn}\verb|] |a_{mf} \verb|;| $ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \appendix \chapter{Uso de sufijos} \vspace*{-12pt} Se pueden usar sufijos para recuperar valores adicionales relacionados con las variables, restricciones y objetivos del modelo. Un {\it sufijo} consiste de un punto ({\tt.}) seguido de una palabra clave no-reservada. Por ejemplo, si {\tt x} es una variable bidimensional, {\tt x[i,j].lb} es un valor numérico igual a la cota inferior de la variable elemental {\tt x[i,j]} que se puede usar como un parámetro numérico dondequiera que sea en expresiones. Para las variables del modelo, los sufijos tienen los siguientes significados: \begin{tabular}{@{}ll@{}} {\tt.lb}&cota inferior\\ {\tt.ub}&cota superior\\ {\tt.status}&estatus en la solución:\\ &0 --- indefinida\\ &1 --- básica\\ &2 --- no-básica en la cota inferior\\ &3 --- no-básica en la cota superior\\ &4 --- variable no-básica libre (no acotada)\\ &5 --- variable no-básica fija\\ {\tt.val}&valor primal en la solución\\ {\tt.dual}&valor dual (costo reducido) en la solución\\ \end{tabular} Para las restricciones y objetivos del modelo, los sufijos tienen los siguientes significados: \begin{tabular}{@{}ll@{}} {\tt.lb}&cota inferior de la forma lineal\\ {\tt.ub}&cota superior de la forma lineal\\ {\tt.status}&estatus en la solución:\\ &0 --- indefinida\\ &1 --- no-limitante\\ &2 --- limitante en la cota inferior\\ &3 --- limitante en la cota superior\\ &4 --- fila limitante libre (no-acotada)\\ &5 --- restricción de igualdad limitante\\ {\tt.val}&valor primal de la forma lineal en la solución\\ {\tt.dual}&valor dual (costo reducido) de la forma lineal en la solución\\ \end{tabular} Debe notarse que los sufijos {\tt.status}, {\tt.val} y {\tt.dual} solamente pueden usarse luego de la sentencia solve. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Funciones de fecha y hora} \noindent\hfil \begin{tabular}{c} por Andrew Makhorin \verb||\\ y Heinrich Schuchardt \verb||\\ \end{tabular} \section{Obtención del tiempo calendario corriente} \label{gmtime} Para obtener el tiempo calendario\footnote{N. del T.: el tiempo calendario es un punto en el {\it continuum} del tiempo, por ejemplo 4 de noviembre de 1990 a las 18:02.5 UTC. A veces se lo llama ``tiempo absoluto''. La definición está tomada de {\it Sandra Loosemore}, {\it Richard M. Stallman}, {\it Roland McGrath}, {\it Andrew Oram} \& {\it Ulrich Drepper}, ``The GNU C Library Reference Manual - for version 2.17'', Free Software Foundation, Inc, 2012.} corriente en MathProg existe la función {\tt gmtime}. No tiene argumentos y devuelve el número de segundos transcurridos desde las 00:00:00 del 1 de enero de 1970, Tiempo Universal Coordinado (UTC). Por ejemplo: \begin{verbatim} param utc := gmtime(); \end{verbatim} MathPro no tiene una función para convertir el tiempo UTC devuelto por la función {\tt gmtime} a tiempo calendario {\it local}. Entonces, si se necesita determinar el tiempo calendario local corriente, se debe agregar al tiempo UTC devuelto la diferencia horaria con respecto al UTC expresada en segundos. Por ejemplo, la hora en Berlín durante el invierno está una hora adelante del UTC, lo que corresponde una diferencia horaria de +1~hora~= +3600~segundos, de modo que el tiempo calendario corriente del invierno en Berlín se puede determinar como sigue: \begin{verbatim} param ahora := gmtime() + 3600; \end{verbatim} \noindent Análogamente, el horario de verano en Chicago (Zona Horaria Central) está cinco horas por detrás del UTC, de modo que el correspondiente tiempo calendario local corriente se puede determinar como sigue: \begin{verbatim} param ahora := gmtime() - 5 * 3600; \end{verbatim} Debe notarse que el valor devuelto por {\tt gmtime} es volátil, {\it i.e.} si se la invoca varias veces, esta función devolverá valores diferentes. \section{Conversión de una cadena de caracteres a un tiempo calendario} \label{str2time} La función {\tt str2time(}{\it c}{\tt,} {\it f}{\tt)} convierte una cadena de caracteres (una {\it estampa de la fecha y hora}) especificada por su primer argumento {\it c}, la que debe ser una expresión simbólica, a un tiempo calendario apropiado para cálculos aritméticos. La conversión se controla mediante la especificación de una cadena de formato {\it f} (el segundo argumento), la que también debe ser una expresión simbólica. El resultado de la conversión devuelto por {\tt str2time} tiene el mismo significado que los valores devueltos por la función {\tt gmtime} (ver Subsección \ref{gmtime}, página \pageref{gmtime}). Debe notarse que {\tt str2time} {\it no corrige} el tiempo calendario devuelto para considerar la zona horaria local, {\it i.e.} si se aplica a las 00:00:00 del 1 de enero de 1970, siempre devolverá 0. Por ejemplo, las sentencias del modelo \begin{verbatim} param c, symbolic, := "07/14/98 13:47"; param t := str2time(c, "%m/%d/%y %H:%M"); display t; \end{verbatim} \noindent imprime lo siguiente en la salida estándar: \begin{verbatim} t = 900424020 \end{verbatim} \noindent donde el tiempo calendario mostrado corresponde a las 13:47:00 del 14 de julio de 1998. La cadena de formato que se pasa a la función {\tt str2time} consiste de especificadores de conversión y caracteres ordinarios. Cada especificador de conversión empieza con un carácter de porcentaje ({\tt\%}) seguido por una letra. Los siguientes especificadores de conversión se pueden usar en la cadena de formato\footnote{N. del T.: en todas las funciones de fecha y hora, nombre del mes y del día de la semana refiere a su denominación en inglés, {\it e.g.}: {\tt August}, {\tt Aug}, {\tt Wednesday}, {\tt We}.}: \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%b}&El nombre del mes abreviado (insensible a mayúsculas). Al menos las tres primeras letras del nombre del mes deben aparecer en la cadena de entrada.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%d}&El día del mes como un número decimal (rango de 1 a 31). Se permite el cero como primer dígito, aunque no es requerido.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%h}&Lo mismo que {\tt\%b}.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%H}&La hora como un número decimal, empleando un reloj de 24 horas (rango de 0 a 23). Se permite el cero como primer dígito, aunque no es requerido.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%m}&El mes como un número decimal (rango de 1 a 12). Se permite el cero como primer dígito, aunque no es requerido.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%M}&El minuto como número decimal (rango de 0 a 59). Se permite el cero como primer dígito, aunque no es requerido.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%S}&El segundo como un número decimal (rango de 0 a 59). Se permite el cero como primer dígito, aunque no es requerido.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%y}&El año sin un siglo como un número decimal (rango de 0 a 99). Se permite el cero como primer dígito, aunque no es requerido. Los valores de entrada en el rango de 0 a 68 se consideran como los años 2000 al 2068, mientras que los valores del 69 al 99 como los años 1969 a 1999.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%z}&La diferencia horaria con respecto a GMT en formato ISO 8601.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%\%}&Un carácter {\tt\%} literal.\\ \end{tabular} Todos los demás caracteres (ordinarios) en la cadena de formato deben tener un carácter de coincidencia con la cadena de entrada a ser convertida. Las excepciones son los espacios en la cadena de entrada, la cual puede coincidir con cero o más caracteres de espacio en la cadena de formato. Si algún componente de la fecha y/u hora están ausentes en el formato y, consecuentemente, en la cadena de entrada, la función {\tt str2time} usa sus valores por defecto de las 00:00:00 del 1 de enero de 1970, es decir que el valor por defecto para el año es 1970, el valor por defecto para el mes es enero, etc. La función {} es aplicable a todos los tiempos calendarios en el rango desde las 00:00:00 del 1 de enero del 0001 hasta las 23:59:59 del 31 de diciembre del 4000 del calendario gregoriano. \section{Conversión de un tiempo calendario a una cadena de caracteres} \label{time2str} La función {\tt time2str(}{\it t}{\tt,} {\it f}{\tt)} convierte el tiempo calendario especificado por su primer argumento {\it t}, el que debe ser una expresión numérica, a una cadena de caracteres (valor simbólico). La conversión se controla con la cadena de formato {\it f} especificada (el segundo argumento), la que debe ser una expresión simbólica. El tiempo calendario que se le pasa a {\tt time2str} tiene el mismo significado que el valor devuelto por la función {\tt gmtime} (ver Subsección \ref{gmtime}, página \pageref{gmtime}). Debe notarse que {\tt time2str} {\it no corrige} el tiempo calendario especificado para considerar la zona horaria local, {\it i.e.} el tiempo calendario 0 siempre corresponde a las 00:00:00 del 1 de enero de 1970. Por ejemplo, las sentencias del modelo \begin{verbatim} param c, symbolic, := time2str(gmtime(), "%FT%TZ"); display c; \end{verbatim} \noindent puede producir la siguiente impresión: \begin{verbatim} c = '2008-12-04T00:23:45Z' \end{verbatim} \noindent que es una estampa de una fecha y hora en el formato ISO. La cadena de formato que se pasa a la función {\tt time2str} consiste de especificadores de conversión y caracteres ordinarios. Cada especificador de conversión empieza con un carácter de porcentaje ({\tt\%}) seguido por una letra. Los siguientes especificadores de conversión se pueden usar en la cadena de formato: \newpage \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%a}&El nombre del día de la semana abreviado (2 caracteres).\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%A}&El nombre del día de la semana completo.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%b}&El nombre del mes abreviado (3 caracteres).\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%B}&El nombre del mes completo.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%C}&El siglo del año, es decir el mayor entero no mayor que el año dividido por~100.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%d}&El día del mes como un número decimal (rango de 01 a 31).\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%D}&La fecha, usando el formato \verb|%m/%d/%y|.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%e}&El día del mes, como con \verb|%d|, pero rellenado con un espacio en blanco en vez de cero.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%F}&La fecha, usando el formato \verb|%Y-%m-%d|.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%g}&El año correspondiente al número de semana ISO, pero sin el siglo (rango de 00 a 99). Tiene el mismo formato y valor que \verb|%y|, excepto que si el número de semana ISO (ver \verb|%V|) pertenece al año previo o siguiente, se usa aquel año en su lugar.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%G}&El año correspondiente al número de semana ISO. Tiene el mismo formato y valor que \verb|%Y|, excepto que si el número de semana ISO (ver \verb|%V|) pertenece al año previo o siguiente, se usa aquel año en su lugar.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%h}&Lo mismo que \verb|%b|.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%H}&La hora como un número decimal, empleando un reloj de 24 horas (rango de 00 a 23).\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%I}&La hora como un número decimal, empleando un reloj de 12 horas (rango de 01 a 12).\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%j}&El día del año como un número decimal (rango de 001 a 366).\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%k}&La hora como un número decimal, empleando un reloj de 24 horas como con \verb|%H|, pero rellenado con un espacio en blanco en vez de cero.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%l}&La hora como un número decimal, empleando un reloj de 12 horas como con \verb|%I|, pero rellenado con un espacio en blanco en vez de cero.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%m}&El mes como un número decimal (rango de 01 a 12).\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%M}&El minuto como un número decimal (rango de 00 a 59).\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%p}&Tanto {\tt AM} como {\tt PM}, de acuerdo con el valor horario dado. La medianoche es tratada como {\tt AM} y el mediodía como {\tt PM}.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%P}&Tanto {\tt am} como {\tt pm}, de acuerdo con el valor horario dado. La medianoche es tratada como {\tt am} y el mediodía como {\tt pm}.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%R}&La hora y los minutos en números decimales, usando el formato \verb|%H:%M|.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%S}&Los segundos como un número decimal (rango de 00 a 59).\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%T}&La hora del día en números decimales, usando el formato \verb|%H:%M:%S|.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%u}&El día de la semana como un número decimal (rango de 1 a 7), siendo 1 el lunes.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%U}&El número de semana del año corriente como un número decimal (rango de 00 a 53), empezando con el primer domingo como el primer día de la primer semana. Se considera que los días del año anteriores al primer domingo son parte de la semana 00.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%V}&El número de semana ISO como un número decimal (rango 01 a 53). Las semanas de ISO empiezan los lunes y terminan los domingos. La semana 01 de un año es la primer semana que tiene la mayoría de sus días en ese año, lo cual es equivalente a la semana que contiene al 4 de enero. La semana 01 de un año puede contener días del año previo. La semana anterior a la semana 01 de un año es la última semana (52 o 53) del año previo, aún si esta contiene días del nuevo año. En otras palabras, si el 1 de enero cae en lunes, martes, miércoles o jueves, está en la semana 01; si el 1 de enero cae en viernes, sábado o domingo, está en la semana 52 o 53 del año previo.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%w}&El día de la semana como un número decimal (rango de 0 a 6), siendo 0 el domingo.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%W}&El número de semana del año corriente como un número decimal (rango de 00 a 53), empezando con el primer lunes como el primer día de la primer semana. Se considera que los días del año anteriores al primer lunes son parte de la semana 00.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%y}&El año sin el siglo como un número decimal (rango de 00 a 99), es decir año {\tt mod} 100.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%Y}&El año como un número decimal, usando el calendario gregoriano.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%\%}& Un carácter \verb|%| literal.\\ \end{tabular} Todos los demás caracteres (ordinarios) en la cadena de formato simplemente se copian a la cadena resultante. El primer argumento (tiempo calendario) que se le pasa a la función {\tt time2str} debe están en el rango entre $-62135596800$ y $+64092211199$, lo que corresponde al período desde las 00:00:00 del 1 de enero del 0001 hasta las 23:59:59 del 31 de diciembre del 4000 del calendario gregoriano. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Controladores de tablas} \label{drivers} \noindent\hfil \begin{tabular}{c} por Andrew Makhorin \verb||\\ y Heinrich Schuchardt \verb||\\ \end{tabular} \bigskip\bigskip El {\it controlador de tablas} es un módulo del programa que permite la trasmisión de datos entre objetos de un modelo MathProg y tablas de datos. Actualmente, el paquete GLPK tiene cuatro controladores de tablas: \vspace*{-8pt} \begin{itemize} \item controlador interno de tablas CSV; \item controlador interno de tablas xBASE; \item controlador de tablas ODBC; \item controlador de tablas MySQL. \end{itemize} \vspace*{-8pt} \section{Controlador de tablas CSV} El controlador de tablas CSV asume que la tabla de datos está representada en la forma de un archivo de texto plano, en el formato de archivo CSV (valores separados por coma) como se describe más adelante. Para elegir el controlador de tablas CSV, su nombre en la sentencia table debe especificarse como \verb|"CSV"| y el único argumento debe especificar el nombre de un archivo de texto plano conteniendo la tabla. Por ejemplo: \begin{verbatim} table datos IN "CSV" "datos.csv": ... ; \end{verbatim} El sufijo del nombre de archivo puede ser arbitrario; sin embargo, se recomienda usar el sufijo `\verb|.csv|'. \newpage Al leer tablas de entrada, el controlador de tablas CSV provee un campo implícito llamado \verb|RECNO|, el cual contiene el número del registro corriente. Este campo puede especificarse en la sentencia table de entrada, como si existiera un verdadero campo llamado \verb|RECNO| en el archivo CSV. Por ejemplo: \begin{verbatim} table lista IN "CSV" "lista.csv": num <- [RECNO], ... ; \end{verbatim} \subsection*{Formato CSV\footnote{Este material está basado en el documento RFC 4180.}} El formato CSV (valores separados por coma) es un formato de archivo de texto plano definido como sigue: 1. Cada registro se ubica en una línea separada, delimitada por un salto de línea. Por ejemplo: \begin{verbatim} aaa,bbb,ccc\n xxx,yyy,zzz\n \end{verbatim} \noindent donde \verb|\n| significa el carácter de control \verb|LF| ({\tt 0x0A}). 2. El último registro en el archivo puede tener un salto de línea final o no. Por ejemplo: \begin{verbatim} aaa,bbb,ccc\n xxx,yyy,zzz \end{verbatim} 3. Debería haber una línea de encabezado que aparezca en la primera línea del archivo, en el mismo formato que las líneas de registro normales. Este encabezado debería contener nombres que correspondan a los campos en el archivo. El número de nombres de campo en la línea de encabezado debe ser igual al número de campos de los registros en el archivo. Por ejemplo: \begin{verbatim} nombre1,nombre2,nombre3\n aaa,bbb,ccc\n xxx,yyy,zzz\n \end{verbatim} 4. Dentro del encabezado y de cada registro puede haber uno o más campos separados por comas. Cada línea debe contener el mismo número de campos a través de todo el archivo. Los espacios se consideran parte del campo y, consecuentemente, no son ignorados. El último campo en el registro no debe estar seguido de una coma. Por ejemplo: \begin{verbatim} aaa,bbb,ccc\n \end{verbatim} 5. Los campos pueden estar encerrados entre comillas dobles o no. Por ejemplo: \begin{verbatim} "aaa","bbb","ccc"\n zzz,yyy,xxx\n \end{verbatim} 6. Si el campo se encierra entre comillas dobles, cada comilla doble que sea parte del campo debe codificarse dos veces. Por ejemplo: \begin{verbatim} "aaa","b""bb","ccc"\n \end{verbatim} \newpage \para{Ejemplo} \begin{verbatim} DESDE,HACIA,DISTANCIA,COSTO Seattle,New-York,2.5,0.12 Seattle,Chicago,1.7,0.08 Seattle,Topeka,1.8,0.09 San-Diego,New-York,2.5,0.15 San-Diego,Chicago,1.8,0.10 San-Diego,Topeka,1.4,0.07 \end{verbatim} \section{Controlador de tablas xBASE} El controlador de tablas xBASE asume que la tabla de datos se almacenó en formato de archivo .dbf. Para elegir el controlador de tablas xBASE, su nombre en la sentencia table debe especificarse como \verb|"xBASE"| y el primer argumento debe especificar el nombre de un archivo .dbf que contenga la tabla. Para la tabla de salida, debe haber un segundo argumento definiendo el formato de la tabla en la forma \verb|"FF...F"|, donde \verb|F| es tanto {\tt C({\it n})}, el cual especifica un campo de caracteres de longitud $n$, como {\tt N({\it n}{\rm [},{\it p}{\rm ]})}, el cual especifica un campo numérico de longitud $n$ y precisión $p$ (por defecto, $p$ es 0). El siguiente es un ejemplo simple que ilustra la creación y lectura de un archivo .dbf: \begin{verbatim} table tab1{i in 1..10} OUT "xBASE" "foo.dbf" "N(5)N(10,4)C(1)C(10)": 2*i+1 ~ B, Uniform(-20,+20) ~ A, "?" ~ FOO, "[" & i & "]" ~ C; set M, dimen 4; table tab2 IN "xBASE" "foo.dbf": M <- [B, C, RECNO, A]; display M; end; \end{verbatim} \section{Controlador de tablas ODBC} El controlador de tablas ODBC permite conexiones con bases de datos SQL usando una implementación de la interfaz ODBC basada en la Call Level Interface (CLI).\footnote{La norma de software correspondiente se define en ISO/IEC 9075-3:2003.} \para{Debian GNU/Linux.} Bajo Debian GNU/Linux, el controlador de tablas ODBC usa el paquete iODBC,\footnote{Ver {\tt}.} el cual debe estar instalado antes de compilar el paquete GLPK. La instalación se puede efectuar con el siguiente comando: \begin{verbatim} sudo apt-get install libiodbc2-dev \end{verbatim} Debe notarse que para la configuración del paquete GLPK para activar el uso de la librería iODBC, se debe pasar la opción `\verb|--enable-odbc|' al script de configuración. Para su uso en todo el sistema, las bases de datos individuales deben ingresarse en \verb|/etc/odbc.ini| y \verb|/etc/odbcinst.ini|. Las conexiones de las bases de datos usadas por un usuario individual se especifican mediante archivos en el directorio home (\verb|.odbc.ini| y \verb|.odbcinst.ini|). \para{Microsoft Windows.} Bajo Microsoft Windows, el controlador de tablas ODBC usa la librería ODBC de Microsoft. Para activar esta característica, el símbolo: \begin{verbatim} #define ODBC_DLNAME "odbc32.dll" \end{verbatim} \noindent debe definirse en el archivo de configuración de GLPK `\verb|config.h|'. Las fuentes de datos pueden crearse por intermedio de las Herramientas Administrativas del Panel de Control. Para elegir el controlador de tablas ODBC, su nombre en la sentencia table debe especificarse como \verb|'ODBC'| o \verb|'iODBC'|. La lista de argumentos se especifica como sigue. El primer argumento es la cadena de conexión que se pasa a la librería ODBC, por ejemplo: \verb|'DSN=glpk;UID=user;PWD=password'|, o \verb|'DRIVER=MySQL;DATABASE=glpkdb;UID=user;PWD=password'|. Las diferentes partes de la cadena se separan con punto y coma. Cada parte consiste de un par {\it nombre de campo} y {\it valor} separados por el signo igual. Los nombres de campo permitidos dependen de la librería ODBC. Típicamente, se permiten los siguientes nombres de campo: \verb|DATABASE | base de datos; \verb|DRIVER | controlador ODBC; \verb|DSN | nombre de una fuente de datos; \verb|FILEDSN | nombre de un archivo de fuente de datos; \verb|PWD | clave de usuario; \verb|SERVER | base de datos; \verb|UID | nombre de usuario. El segundo argumento, y todos los siguientes, son considerados como sentencias SQL. Las sentencias SQL se pueden extender sobre múltiples argumentos. Si el último carácter de un argumento es un punto y coma, este indica el final de una sentencia SQL. Los argumentos de una sentencia SQL se concatenan separados por espacios. El eventual punto y coma final será removido. Todas las sentencias SQL, excepto la última, se ejecutarán directamente. Para table-IN, la última sentencia SQL puede ser un comando SELECT que empieza con \verb|'SELECT '| en letras mayúsculas. Si la cadena no se inicia con \verb|'SELECT '|, se considera que es un nombre de tabla y automáticamente se genera una sentencia SELECT. Para table-OUT, la última sentencia SQL puede contener uno o múltiples signos de interrogación. Si contiene un signo de interrogación, se considera como una plantilla para la rutina de escritura. De otro modo, la cadena es considerada un nombre de tabla y se genera automáticamente una plantilla INSERT. La rutina de escritura usa la plantilla con el signo de interrogación y reemplaza al primer signo de interrogación con el primer parámetro de salida, el segundo signo de interrogación con el segundo parámetro de salida, y así sucesivamente. Luego se emite el comando SQL. El siguiente es un ejemplo de la sentencia table de salida: \begin{verbatim} table ta { l in LOCALIDADES } OUT 'ODBC' 'DSN=glpkdb;UID=glpkuser;PWD=glpkpassword' 'DROP TABLE IF EXISTS resultados;' 'CREATE TABLE resultados ( ID INT, LOC VARCHAR(255), CANT DOUBLE );' 'INSERT INTO resultados 'VALUES ( 4, ?, ? )' : l ~ LOC, cantidad[l] ~ CANT; \end{verbatim} \noindent Alternativamente, se puede escribir como sigue: \begin{verbatim} table ta { l in LOCALIDADES } OUT 'ODBC' 'DSN=glpkdb;UID=glpkuser;PWD=glpkpassword' 'DROP TABLE IF EXISTS resultados;' 'CREATE TABLE resultados ( ID INT, LOC VARCHAR(255), CANT DOUBLE );' 'resultados' : l ~ LOC, cantidad[l] ~ CANT, 4 ~ ID; \end{verbatim} El uso de plantillas con `\verb|?|' no sólo permite INSERT, sino también UPDATE, DELETE, etc. Por ejemplo: \begin{verbatim} table ta { l in LOCALIDADES } OUT 'ODBC' 'DSN=glpkdb;UID=glpkuser;PWD=glpkpassword' 'UPDATE resultados SET FECHA = ' & fecha & ' WHERE ID = 4;' 'UPDATE resultados SET CANT = ? WHERE LOC = ? AND ID = 4' : cantidad[l], l; \end{verbatim} \section{Controlador de tablas MySQL} El controlador de tablas permite conexiones con bases de datos MySQL. \para{Debian GNU/Linux.} Bajo Debian GNU/Linux, el controlador de tablas MySQL usa el paquete MySQL,\footnote{Para descargar los archivos de desarrollo, ver {\tt}.} el cual debe estar instalado antes de compilar el paquete GLPK. La instalación se puede efectuar con el siguiente comando: \begin{verbatim} sudo apt-get install libmysqlclient15-dev \end{verbatim} Debe notarse que para la configuración del paquete GLPK para activar el uso de la librería MySQL, se debe pasar la opción `\verb|--enable-mysql|' al script de configuración. \para{Microsoft Windows.} Bajo Microsoft Windows, el controlador de tablas MySQL también usa la librería MySQL. Para activar esta característica, el símbolo: \begin{verbatim} #define MYSQL_DLNAME "libmysql.dll" \end{verbatim} \noindent debe definirse en el archivo de configuración de GLPK `\verb|config.h|'. Para elegir el controlador de tablas MySQL, su nombre en la sentencia table debe especificarse como \verb|'MySQL'|. La lista de argumentos se especifica como sigue. El primer argumento especifica como conectar la base de datos en el estilo DSN, por ejemplo: \verb|'Database=glpk;UID=glpk;PWD=gnu'|. Las diferentes partes de la cadena se separan con punto y coma. Cada parte consiste de un par {\it nombre de campo} y {\it valor} separados por el signo igual. Se permiten los siguientes nombres de campo: \verb|Server | servidor corriendo la base de datos (localhost por defecto); \verb|Database | nombre de la base de datos; \verb|UID | nombre de usuario; \verb|PWD | clave de usuario; \verb|Port | puerto usado por el servidor (3306 por defecto). El segundo argumento, y todos los siguientes, son considerados como sentencias SQL. Las sentencias SQL se pueden extender sobre múltiples argumentos. Si el último carácter de un argumento es un punto y coma, este indica el final de una sentencia SQL. Los argumentos de una sentencia SQL se concatenan separados por espacios. El eventual punto y coma final será removido. Todas las sentencias SQL, excepto la última, se ejecutarán directamente. Para table-IN, la última sentencia SQL puede ser un comando SELECT que empieza con \verb|'SELECT '| en letras mayúsculas. Si la cadena no se inicia con \verb|'SELECT '|, se considera que es un nombre de tabla y automáticamente se genera una sentencia SELECT. Para table-OUT, la última sentencia SQL puede contener uno o múltiples signos de interrogación. Si contiene un signo de interrogación, se considera como una plantilla para la rutina de escritura. De otro modo, la cadena es considerada un nombre de tabla y se genera automáticamente una plantilla INSERT. La rutina de escritura usa la plantilla con el signo de interrogación y reemplaza al primer signo de interrogación con el primer parámetro de salida, el segundo signo de interrogación con el segundo parámetro de salida y así sucesivamente. Luego se emite el comando SQL. El siguiente es un ejemplo de la sentencia table de salida: \newpage \begin{verbatim} table ta { l in LOCALIDADES } OUT 'MySQL' 'Database=glpkdb;UID=glpkuser;PWD=glpkpassword' 'DROP TABLE IF EXISTS resultados;' 'CREATE TABLE resultados ( ID INT, LOC VARCHAR(255), CANT DOUBLE );' 'INSERT INTO resultados VALUES ( 4, ?, ? )' : l ~ LOC, cantidad[l] ~ CANT; \end{verbatim} \noindent Alternativamente, se puede escribir como sigue: \begin{verbatim} table ta { l in LOCALIDADES } OUT 'MySQL' 'Database=glpkdb;UID=glpkuser;PWD=glpkpassword' 'DROP TABLE IF EXISTS resultados;' 'CREATE TABLE resultados ( ID INT, LOC VARCHAR(255), CANT DOUBLE );' 'resultados' : l ~ LOC, cantidad[l] ~ CANT, 4 ~ ID; \end{verbatim} El uso de plantillas con `\verb|?|' no sólo permite INSERT, sino también UPDATE, DELETE, etc. Por ejemplo: \begin{verbatim} table ta { l in LOCALIDADES } OUT 'MySQL' 'Database=glpkdb;UID=glpkuser;PWD=glpkpassword' 'UPDATE resultados SET FECHA = ' & fecha & ' WHERE ID = 4;' 'UPDATE resultados SET CANT = ? WHERE LOC = ? AND ID = 4' : cantidad[l], l; \end{verbatim} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Solución de modelos con glpsol} El paquete GLPK\footnote{{\tt http://www.gnu.org/software/glpk/}} incluye el programa {\tt glpsol}, un {\it solver} autónomo de PL/PEM. Este programa puede ser invocado desde la línea de comando o desde el {\it shell} para resolver modelos escritos en el lenguaje de modelado GNU MathProg. Para comunicarle al solver que el archivo de entrada contiene una descripción del modelo, es necesario especificar la opción \verb|--model| en la línea de comando. Por ejemplo: \begin{verbatim} glpsol --model foo.mod \end{verbatim} A veces es necesario usar la sección de datos colocada en un archivo separado, en cuyo caso se debe usar el siguiente comando: \begin{verbatim} glpsol --model foo.mod --data foo.dat \end{verbatim} \noindent Debe notarse que, si el archivo del modelo también contiene una sección de datos, esta sección será ignorada. También se permite especificar más de un archivo conteniendo la sección de datos, por ejemplo: \begin{verbatim} glpsol --model foo.mod --data foo1.dat --data foo2.dat \end{verbatim} Si la descripción del modelo contiene algunas sentencias display y/o printf, por defecto la salida es enviada a la terminal. Si se necesita redirigir la salida a un archivo, se puede usar el siguiente comando: \begin{verbatim} glpsol --model foo.mod --display foo.out \end{verbatim} Si se necesita inspeccionar el problema, el cual ha sido generado por el traductor del modelo, se puede usar la opción \verb|--wlp| como sigue: \begin{verbatim} glpsol --model foo.mod --wlp foo.lp \end{verbatim} \noindent En este caso el problema se escribe en el archivo \verb|foo.lp|, en formato CPLEX LP apropiado para el análisis visual. \newpage A veces sólo se necesita chequear la descripción del modelo, sin resolver la instancia generada del problema. En este caso, se debe especificar la opción \verb|--check|, por ejemplo: \begin{verbatim} glpsol --check --model foo.mod --wlp foo.lp \end{verbatim} Si se necesita escribir una solución numérica obtenida por el solver en un archivo, se puede usar el siguiente comando: \begin{verbatim} glpsol --model foo.mod --output foo.sol \end{verbatim} \noindent en cuyo caso la solución se escribe en el archivo \verb|foo.sol| en formato de texto plano apropiado para el análisis visual. La lista completa de opciones de \verb|glpsol| se puede encontrar en el manual de referencia de GLPK incluido en la distribución de GLPK. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Ejemplo de descripción del modelo} \section{Descripción del modelo escrita en MathProg} Abajo hay un ejemplo completo de la descripción de un modelo escrito en el lenguaje de modelado GNU MathProg. \bigskip \begin{verbatim} # UN PROBLEMA DE TRANSPORTE # # Este problema determina la logística de costo mínimo de flete # que cumple los requerimientos en los mercados y en las fábricas # de suministro. # # Referencia: # Dantzig G B. 1963. Linear Programming and Extensions. # Princeton University Press, Princeton, New Jersey. # Sección 3-3. set I; /* plantas de enlatado */ set J; /* mercados */ param a{i in I}; /* producción de la planta i, en cajas */ param b{j in J}; /* demanda en el mercado j, en cajas */ param d{i in I, j in J}; /* distancia, en miles de millas */ param f; /* flete, en dólares por caja cada mil millas */ param c{i in I, j in J} := f * d[i,j] / 1000; /* costo de transporte, en miles de dólares por caja */ var x{i in I, j in J} >= 0; /* cantidades despachadas, en cajas */ minimize costo: sum{i in I, j in J} c[i,j] * x[i,j]; /* costo total de transporte, en miles de dólares */ s.t. suministro{i in I}: sum{j in J} x[i,j] <= a[i]; /* observar el límite de suministro de la planta i */ s.t. demanda{j in J}: sum{i in I} x[i,j] >= b[j]; /* satisfacer la demanda del mercado j */ data; set I := Seattle San-Diego; set J := New-York Chicago Topeka; param a := Seattle 350 San-Diego 600; param b := New-York 325 Chicago 300 Topeka 275; param d : New-York Chicago Topeka := Seattle 2.5 1.7 1.8 San-Diego 2.5 1.8 1.4 ; param f := 90; end; \end{verbatim} %\newpage \section{Instancia generada del problema de PL} Abajo está el resultado de la traducción del modelo de ejemplo producido por el solver \verb|glpsol|, con la opción \verb|--wlp| y escrita en el formato CPLEX LP. \medskip \begin{verbatim} \* Problem: transporte *\ Minimize costo: + 0.225 x(Seattle,New~York) + 0.153 x(Seattle,Chicago) + 0.162 x(Seattle,Topeka) + 0.225 x(San~Diego,New~York) + 0.162 x(San~Diego,Chicago) + 0.126 x(San~Diego,Topeka) Subject To suministro(Seattle): + x(Seattle,New~York) + x(Seattle,Chicago) + x(Seattle,Topeka) <= 350 suministro(San~Diego): + x(San~Diego,New~York) + x(San~Diego,Chicago) + x(San~Diego,Topeka) <= 600 demanda(New~York): + x(Seattle,New~York) + x(San~Diego,New~York) >= 325 demanda(Chicago): + x(Seattle,Chicago) + x(San~Diego,Chicago) >= 300 demanda(Topeka): + x(Seattle,Topeka) + x(San~Diego,Topeka) >= 275 End \end{verbatim} \section{Solución óptima del problema de PL} Abajo está la solución óptima de la instancia generada del problema de PL encontrada por el solver \verb|glpsol|, con la opción \verb|--output| y escrita en formato de texto plano. \medskip %\begin{footnotesize} \begin{verbatim} Problem: transporte Rows: 6 Columns: 6 Non-zeros: 18 Status: OPTIMAL Objective: costo = 153.675 (MINimum) No. Row name St Activity Lower bound Upper bound Marginal ------ ------------ -- ------------- ------------- ------------- ------------- 1 costo B 153.675 2 suministro[Seattle] NU 350 350 < eps 3 suministro[San-Diego] B 550 600 4 demanda[New-York] NL 325 325 0.225 5 demanda[Chicago] NL 300 300 0.153 6 demanda[Topeka] NL 275 275 0.126 No. Column name St Activity Lower bound Upper bound Marginal ------ ------------ -- ------------- ------------- ------------- ------------- 1 x[Seattle,New-York] B 50 0 2 x[Seattle,Chicago] B 300 0 3 x[Seattle,Topeka] NL 0 0 0.036 4 x[San-Diego,New-York] B 275 0 5 x[San-Diego,Chicago] NL 0 0 0.009 6 x[San-Diego,Topeka] B 275 0 End of output \end{verbatim} %\end{footnotesize} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newpage \section*{Reconocimientos} \addcontentsline{toc}{chapter}{Reconocimientos} Los autores desean agradecer a las siguientes personas, quienes amablemente leyeron, comentaron y corrigieron el borrador de este documento: \noindent Juan Carlos Borrás \verb|| \noindent Harley Mackenzie \verb|| \noindent Robbie Morrison \verb|| \end{document} glpk-5.0/doc/gmpl_pt-BR.pdf0000666000062000006210000076516213766346220014732 0ustar maomkpasswd%PDF-1.5 %äðíø 7 0 obj <> stream xÚeOÉNÃ0½óst$2x<^’cA´J)%åÒpˆZ7D¢ ˜åûqãÜ*ôl?½eà d<NÅ‘°=ÀuWS%ÑZ†jÄHäÄ%Z Õn#æÝ±ýmZÈr.J±óK)ûˆŸ#ÿf‹õH6?ïËзÙ[uCE&0¹)P¹³âqå÷>ÔlÔqÛ5ƒQ®Ê¨t(‹AùÙdÊŠÐ$AŸ`6_>¤Ûk¦Œðá»fÍ#©cöXŠ4²¶§R9긴±(S¥Z¬&/7ëÅÝÓåIçÄt°úóÁwa°²BI²u6˜ÝVð|ñ¦ŒV½ endstream endobj 14 0 obj <> stream xÚ­VKsÜ6 ¾÷WèÈñ*âCZ)7»=Nã6uì^êh‰^3Ñc#Q›¶¿¾A­´ö¶ÓCÇë~ AàÉèkÄ£þx´ðK¢²‰.î¢7—*âI\$Et÷Ãk™eñ”ê7öój-%g;]vΠ,ØÕ‡?’õA¦œl;ÝÓ0gUG¦=iÊ>,W?݈\oGðO'øÐ=Ò &çÞÚêŤ0E¼úýî=FÉó8•>Èï»ÝJlØŸ½Ý>¯DΜ‡¤*VEK”Þöæ2]lu-ãDEë òð4 – áiœ¤° BD’$gJ!Pä^ä(ŠÙ*gQÍb:‹Ù,næòÙZD>¯Æù,ÎKpXC^CÉRȉŒÓ4DÊqIE¨ ¤,açmÕ›o(sv£¿“ˆššG°_W¹`¦|Šp×*N7'bFX¯+hµÙ½ÅÚçì}ç5ˆYeì²…¯ G{ëM)ÃÖñC~H“hà¼nŒ­ô¦T…ºë©ð/œßµ[Ó>ëÞjÔ7»onÀ/ óÝ·v3áÎ* øWåö™Êôº¦W!I7PŒPØ+µÃÙ¿Û/z=Øú¿Ÿ2òÿ8$ŽÉ¡Ëhßs9@yYŽLRæpè¨0°(Ç&ǃTÐ ÎK)sGåǶàñ"¡ÈeúÎmî§Úbɸȗ9 q*ɧîÉaøß0}º§°Çtc[ùÆÍzÝ–q(Èí¨@¤m¿Ôv‚¥<€¦”fÑ&.6˜P¡e>”îDÒóXp¬O€hˆ¡?£Å.ºÁ…h 5Ïi•Dpžé茆ûOçaëˆÀ‹åÞ$çxL)¶óG€éë,Þ9*ÅüéÚþ¥{Ò }¦+Ìsù 3¹³XTTùÃÀÔ†Z¿F·˜×¹ zúδ´œbaU潂µ þ%R;[RÛŸh³ÝT÷³Ž< „®YÏΡ;îÁ9Ãíývq:¹S_¶¢)»n¹²ƒ±²“>'–ôfêï3÷( L?š–éG}»#Âðý%|¶‰T¥ö£=”}C |ID‘ÐK1„õaƒ¿ï??{޳¿Ê·Ï PK& :1iˆW˜&à×Ñ )Vu¨×X;]µìš]Mo'ê-ÕrŸ¾p:<êú9àÂ$Th“l0Ÿu˜åøáõj‡GØt¥:(Ëá² ›ÐåmçBZ‡!¦WÛI2 f+X_Pˆ¶Ô‹gŸ'¨þGÁKI¥XøœZ ÍžC(MBÙÐgÉ!ÔǬ/óÆ“È#CÛ(uÔ¿Žo °w£›–Âç>,9Ü™˜ÔW™>4Î)nQBJÛèÃëzÊR¨ËtŇ €&> stream xÚíšKsÛ6€ïý•év¶˜ÚDøWê¾r³k@W@íK+¢¼.áu}Ÿ­òu^¥Ë¢tÉI¸€ìò‚:Öñ~…v·ˆDzA7¶jظ¸©lacsP½Oà×À9¥¬xÀ˜*•¡ ’×XS¥Þ~¾·´µµœ¨ËUL#*Ma‹d>x[`ѳ†¦KWk†ã]¿»¬gRWΤ[W€šëD‰ž(u„ ngÚN‰â­ Z05(eŠqA®%»:Øç àí@Ú`邤®õƒ9±Yæ‹:<¤¼®Ÿ'X¤ Ñ!H˜ÔT“¥M}¸Îª²hweõ&–o–Ùg[º¸³ÄËØna!"øóÀ{¤•ÖgY"Á= ŒçΩ$&Ltṿšjœì6ÍÖ i‡mn™½Ë¬›…Ûí¢a_ßYû—ŒƒZÑ>â@zÃJw.ꤽt…Cóí`^ÐB 2Úㄆ¨P,, —µóbS×Oš‰óRpôÀot®ˆS_€~Ÿ–Y}Zå7! ùÅ;=† ¢ÁK» `xãÁ¿¾ox—íiŒ£ž–yUo ªf[€J}í+û©ÐŠ#Ð+N¤›1ÚÌâsK½ü¸Ë»K>¿/+:'R3 ¼øÙhBô%+ך`;ûñÀE}S¦ê›2ÕÞ”97Fès>p<•Ÿ€tlˆjp"ØW\+Ôv„„uñÒ]ìÍO],K¡Ïò@ÿ&˜h¨‰!ÑžN ³ú0€ç’†:·%ê&D Bp$¼ v i´ËQsj1øˆLüïì*Õýñ Ná=°#lAL<҆ݴ}Ø5WYN׳ÔÃvhŒ¾pÒÑÆ ïøMÿƒ¼½êî"„’WæšÚÅG—²÷x|’ ”™ԭGÐà0úHUId˜ïìiÚ=ÌB\—š!ú@1½´O Ltþ4ú9E:<˰O܇â_:ùÄòÈÀ]¯Í$÷ÜÛ¿óX£áe endstream endobj 98 0 obj <> stream xÚí›]oâF†ïû+|i.˜Î÷Çíªi«ªRÛ-êMÓ ê-à¬1Ñv}gð|±eÍÛTÁV"&2±ž÷¼3眲÷Ê þA™Àúfóuöf–}ý-Í ªlö˜Q0Φf€g³Åï9°É!"ò»OM¹ÝÞ®G°ÌËídJʫ͢üPl&˜ç­ÓžƒÉ”Á»ü1û!»›Yˆo¿³/šåŒLÄbŽ˜†ÛÍËϲÇ8òìù)ömً¼Ãêe`P¥^“'f© `ˆqBƒy½YTóªÞ•‘„Ý–ç#øÒ‘3x{yùSє݄S}ìŸÓÁÏ6a:vÎ ‘®,öŸž:Úzj©Ç|Qš+6áþn§á‹¼­õd/Ñй†˜§rÁ.~¿¯4ñæý®*,ñý¼®‘×^{B…uƒØ»3Ľë;¦¤Ø¥¤hLIûùš ؤI}³U€ŸJJ«MYì-ÁSÒså ¤ar_BÀA¸ÏI›HœM¥]€LMü<1®¨\fª‡I=í:¤{ïª^ûB|uG."™ŽQ€=}œD?ÂŽ•¼i'tqkºXœ0æ©W"ŠÒ÷  ^:ö¨ÏÝðøÒ‘3 $õÌÙX\À=b˜žK@”Ïûʽ´ûVPÛ•XˆÛjF\Ž>¢˜Ž^" BÌ‹±.¸J‚ˆ&>*Œî‚Ù”@½Àv7è)^a˜ÿªç͹-Mn)4öþ§O¡Kkz𡄤V') »è¡ûì×”'æaÌF}˜.¶e«_(~Ë‹üËï©üghF 6zö9óg5ÓkU±.u¦¦ßBòjàÿMš°du(Ê9Šô©ó€íÂ_8ØN]/÷„1Cš!ôŠÙF˜XJœah·Íºþø7ŸÔ$ Q óµ¹V«ú‚nyô/hrψTw*ùnùÏM½lŠu᥶"nËn¯„’úPU òÖÚH|·%ð¤É]!F`68|ûûc¡y}8¡E¶Ûo`*ž¾] RN“O2ŽtVÁþ`ÕÛrYéàGmS=ìª~¿P†PËÄà’ï0A÷žð©iwëŽ.gж*Ž"Æ\ ö¸NŒ0»”…('G¹o«õÓÊl•+"Ç–KÌä“ " BäÓÞyfm&š¦ã‚GŽ}ç1‚yZL´JßåòfwÇ/_ýÆL ˆ endstream endobj 125 0 obj <> stream xÚí™IsÛ6Çïýi×¥ÀÛëéÌ•%üe%xz¤gè )RíJ`£txó×íû×.ð²'wpñ5B¦Tu­¡õ„k ˆô³»2ÿâ²W“ø!ouÿ äu›¥\¥Zø“U¾…ñc’Xÿd9(ËRBð ìI(Žoî¡ É›^¥k ²Ý†»¯áÍàEF˜X ïâS*öÙMÝ&@¥sý/ÿ.üm£oiÝà¶åmûÛ7¦úüΖ+ð©Ÿg8 È›i$/©ûÀýófW¹…lm ºÊ¬Y¶ACvkË»<+ŽÚ…w¯]H’Å‚’ Æ.("­—SâÂþÈÇ¡‘§ÕºLžÁß—šM¤ÿ¡Ãq€T ¿©yµÿÎë"ó}Ȩœàó¤xÔÅ.ù'‚5ÛOíŒ÷?üîd† endstream endobj 138 0 obj <> stream xÚåY[sÔ6~ï¯ð£w`Uëj›™>@ LKÒ ¦M”]±˜YÛ‹í¥”_ßstñÚY%: 3m‡[²Îý|GÒIò!¡Iÿh’3øÉ’U<¹L¾F–¥xrù>/K$—ëßÓõîŠK9ì·íbÉ‹2¥‹?.Šnsý>ryA26‘›¡Ü¡í£°ö *1÷0l“cMJI˜ò,t£·U¯]¶Ht(/×Z`g‘|ÇIÿœç9L÷ð£¡?»÷P*²P|`1fÓ°wóÔŸlÌ8x­|Æv~ˆ3eúaïW¹Ìs‘s”2¼ó"zTt@ÇQòx•TNÓi$UDöXÊšU¥ÝŒå®22CÈ®!wg_i´hѬh¹•íÞ?¯ã…®«ªjH\/ÏëÖ·ÛÉ5G’ìk¬íÁ}|`c™¨Š#ë,ÌÕ¦ò…Õš3Ö@N§9 ³+ð†Ñ¤d#œûŒU?‚IÇi˜ÄŒ•ÛÕi x"\(¿=‚7B½¢v+š•ez1ñ¸¶Rqç~“‰(Jz‰ …ìÔ[°·0qÝÚÌ]3ÛšXi—\¥gW 7ïw\x3Ÿv¯/èq϶7›}u:|yÛvµ~dµ—Šd¸m "©Õ*CUWŸ‚l&a(õ'÷ä:»)›!R3FŸÃ*>]EdáCôCŒ ¥‡"¶ ĸ˱†A^5Ýao°€5 1,ùtÌD&bL¦zæ„Ê“QUáÞ[Uö5Te·¨ª¾@ÕGî×ã#Âr˜ ÝÛtu›åMŒƒÄ¯G–«Û oâ¹”©¯£,ê ®põ¸è*žu%QåèáN²PÀè iá€ã¼"|  ~íÏÂîP‡hä"ë;ÜØü–©¤-º¦Ÿ ÓGüœDº+ÅÙ±[r<ÁDÎq:ñýUÆDÔý°Ýc9’äùTNÔ±ÅÌûqŒðSp£OÂù¤®j*…ýS]Oât§ÓšÇðœß‚gq¸ž=ø qŠ ž…ä¾ íâÚyír†/vŸ„c$øåM4¯å©ÝcIK…æÒp';öÂþEaÿc„°ÿBX!pEdÔ!„+ÅÜC¸¿ßÃ^ á4ŽgÐÃuãìÈþpîÔ^ß8qÒ~z#ê8‡çbæ ûüm§OqÐâ.0ŠÓ`w$ä!ŽQ3ò{›qçÉTœÄ©8Sñ qúEáBÒFlW·Eð.,Š/Å¢:†âÎÜán›Œâï¯s8eþp Wç áe‘üiʼ$…Hê„pËÇÛäuòÒß±%¸·Ì oÂU …i6ë…ºµ 7e¯ãTá•ι ¡šgÙ´=—gÔõ-qþpÆiw÷Åù½_hOÍØ¢›õ,UYÚû0®˜qÎÒÇçgÄ}ñ¢«zçÛ†@<½…[.­Wèìâ…[nupÝPg :Vù&sÕ¬ªÞZn…ïºéµîïogic{ eŠýËM;(ŸøHPR„Tyµ,m¯’§¦°¥GÓg‹<‡‹zç&‡‰—¥$…›ƒÇ t!~Ò«µc{NðÉÒçú¯Ïœ‡~#6Ûu³Žð†MÒïIWéÆ1ÿÍ3aº¦Ú¼ÓMDD1!}èÚû¦ì±sØùØ„ˆ:_ži[Xt# omcJ0›F¦ÖØ0Ûâ Çþv]jàE@Åv>üt®L"Ó ®%ôzU™f…Z³`,á %bo›ÙÕâ¡S`·#îEÒÿ‚3ƒÌ¬ÑÅ)2[*QX~*¬|ùÝßû‰T: endstream endobj 142 0 obj <> stream xÚíZÝã¶ï_á¾É虿¥Kò Ðâ‚\ƒ½¼Ô}ÐÚº–´'YÁâþúr8¤DÙôZ»·9´hq²¨‡3¿™áÌP«+ºJͺÒÌüMW»zõýÍê«ÅЦ$OóÕÍ{x´;µºÙÿ3)×ÎiÒöpeÉ¡ª«cÙãà¾p£¿¯¥HŠ®ÚrA×,3÷濲ê×ÿºù»™²`zÊr˜{C5¡–ÃÁS‰•&¹N˜4D KA… ¦É S«‘b›2gF¤4ÍÃ9E˜¸Â'#Ù"6Ôqs™Í°‘@EI¾T-ì ©…}µ°¨ZÄ©Z^¯7J1¼p¼ˆé¦0Ækþq0Ô£:W#·Í#jäKå{8ãbÄã/Íeˆq.”‡d’ÐlÅŒ^q̉Ê£×±y8I¹{ηkG!fh+6B ADféÚf_ÆX1E¨~²_†¼Ñ|²ÀW1& âÌcÄ 91DÒ‰o¢+oÍ"¤< ¸z ¸_Gõ ˆðÊþe#<®[.)r(࢒÷Ccxè€u{»Þ˜Ë‡òX®*±Ã"‰r¦)#©·©Ý9FÁìEq¾Îƒ-à1á¬Nྊóî çþpfqœwæjà-·)»ªl@á¸ý•ï $šad# ’(FÁ9j:i£xã²ÅªL#¢hx8m Öœ˜ÑÈ¡`í]í~îÚ¦? ,æX"æF#Ë–O3 N…ë/Î×/‰Ö¡¹Åì-cºfo©Z΄řè™Á1=Åà‘ÙÉ T¸, ŽYUËÏL@°&—…&§Ñä¡éÊþhÃAII|#}6œiؼc|s®5 †w5ˆ+ÈdS´¹ÎcQÄŠyÄ¿ O‰’' P—ø×1\ÑÙ9.‚gSæ-xžTÍû²«ÚÎß[\€j9.Tk½¿‹jK~~lÎÆÜå:‹E¡ùù€¼‹"¢c€ä! YÒ÷¨ìST\<æ$—¡ œá¤/á$S’ù˜¯ ÔKl¡£),¯;ßBSõ”ˆ¦!CM/'ìêÊšAˆ9gyOÓ™ßÀ=V°)…„J.N¨Œ4„Ë'|O fêçc²ÈwBL)<žŠ ¨}† ºŽN`hè:¦ÌC×¹±/P UΆfDbIô3ÌHuÀ“*‡;Õi$+‘h¤ŽFW|„2àÞ¹/kìËøD§ÅyaomªcëÞý8˜ÙÙÇÒXéH@0¼|w€TÊͺ¯ú¾8i}¬yØSÙ;Š«ÅÜìÍýùbÍ .¨ï†â€?‹Ö½1›î,ØÁà®íÌo|eŸOŒRåÉ›öή9‰Ÿ³/ï†*Hi5OŽ•[Š5+ä÷®i6iO±_Åâñ†hæòráª}Û¿Žé·m&}b›¦i´~f¦@ö»Ý78ÿ^¾‰–Ó‚¤ÞÁÿm±ŸÌÄ"ˆÙ˜Ù¿®3vÞ; óCõ{çT·M* d±/Æ~ž¬å9Érë>®ÿwˆ¬LOiÖ¢ÖÈe@OâKè`×Ö^`ÇhÞ+"|7Ô8TFQú°ŸOŠú„VÏLÜŒhùlqg^{ |ýbàÇÚ^Ù—RÄ~¸?u9V™£NŒ®ÒÌ ‡‚ˆÃi¼=§Œ ûc2¹ïÚÛCYÛ~±¾:Ua·Ÿñäí›WHúSqüím×Þáݱ¨ú[[³¥ZœEÀùÎ0+Â#502¯ºâ¬dvý¿ª?¾Pzû·Ÿ¶ëW¨{Љ‘âp7Ôþ«Œ$Ô–íPHG¾Š Õ© õÕêqœÀ%ìeWº<>X¼{݇±Û ÎJhW®òà ~ÒAéÊäx\(ÛÒBShÙØ ‘°µq› ?¦qëZ¨"¸Ö¾gup®ßÔ÷C…CWD‰¿úªño­ðt~¨ðŒK"€@ãf«ö.DUöô Ž#3Ž˜öfË5k*$‘ ¹_â=¨_Œc… :³†–¡¼wQNñÞµ­¡Uuå{š]5…²K=Î’ æhñàÑVB×cwªÆœº“ô¼=È0¹) ã@ŸJÇÈëáp¬ö•‰ï}Õ6EeQ<áíŒ)J¹÷ëêÛÛî’Ÿù¥@ŸÔE9³Îò¡ð=Bh† :V»£dæ‘sÈ¡v¡×Ï«#9?Š5­Õ䤛I¤C´Aϧô»X¤Dçó+ ÿô+tژ봯/¤7ö›–Â3!«Óì†Ññã{ž¼*‹Y²jk;¤üst*¸øl6¦š0Ÿ[|ÿäH²öçF•Æ~o›Ur&‘aùj£Ü'GÚSþãOÿ”ÖÐÄ endstream endobj 145 0 obj <> stream xÚ•XKã6¾ï¯ðQÆ\‘Ô3AÉl/°²“ì4rIÏmq2jX’G’³A~}ªXE™’iLºÉd±Þ¬úJ»Ï;¹KáOîJÿéîØí~xÜýóßÙN¦¢NëÝãGØ>àb÷Øü– }c÷©"•‹J)Ò<¥©dš< ‘JHµ(åÙ¨FŠÜÓ¼÷Ù®u‰Û…(jÐF™£ˆI)D]í P%.'eÆr¾ÙdQÒ£€GDóLÔõÕ¸/rôš÷ï™ ts-d(®s¹?h¥“K‡Ï,™.Ïûƒª’ãп\ú½*“y Šf Šó/°Þ\f^ykÆÙN­éù7ÄÎ=C1i!°X+8ò&c-+¡åÕYÄ x«<›¡ HyȲLäøA‹/(fy‰QuëM{Ügubc‰Q Ÿ|‚ýX¸„ üøÞ^œ—äÖm2™žt¦‡XÊ‚õEÉœcY wÚ>Ì—óÉLѬ(„Z|˜ÄädBy7´·wZ‹²pWC¯îô†Ü­…ä[S¯Ò?x¯½¹ª „ô1CrÜ]Hžö€%Þ#oÈ»a= 5ÖJä_otXtJ$Y(îÕýŠb¹–‘Ýõ+›$Ð…9= ÿx“¯@Gµ1²¸gc±±Âüj‹{&Æ’8ÇŠºPðRuN'+‘k¾@Qáù5·£9ƒå·ù;p_­“4VDªë/g²Ä•¥rS³q%¬ÙøÛÛÎàkšœ]¦éÒÒTìÙt– ¨%"ìøt… ÀB€zÕp7Û]Û»š…§SºÕO{ î¡HQË ªœjÃ8s_@÷¼ª¹æÚ5#ÜùczÙ¾EM*§ n’º¶ŸÌH =Ö¤\×É­,Ï“;Ó PMGs2£e‚ãÐ ´1Ù¾h‘ ¿åé¡iÁô©zÓò±Ï c±¼f;ê1†–lo&Zp=ÖOç3Jˆ…iòŽ<7· üÉ= _VÅ ÃNuz'ï¹];Ûñå=vâŸ$¦\ÄXzÞóòYÊàÎ7Ì@‚Gp)ë •Š…ãí­ ºq7pÓ°¿_,A!©´(Ü # øåg,Ÿz6»/”/ÓºH~ZBÔÃ¥÷òxÜ}Þ ¨íÿ‹,™°z×í4 ]- §ÝûÝ/·u9–k¡J§ã[ný•oýuyE–o7¨®á‰0¼Ú“u7 òòÖ9ŠÎŽú›:«êì<ÞJøï“.aË›=\ÈQözòö4Ü‘ðë¾Ò ¡éé†nºÒUHW"ˆK_eÊÿì4»ãå'„¶û¯öÑ5KÚ?ò–õ»%[§ö†yye®R(Ä”‚Ú ³1›r•Œö£Û€Óèá®4<»0ö åµ=^NÆ‘3$èƒË…ý0ÇÒ43Mc%–9-u¥#èP!6@25„y9fŠ5ãòŠ®¡ëæiAf#ɳÚî|øòjðd*C‡Oñ¦D깉H­®c &UR=Äç9ÌqXщ ªî‰–û”ê¬o›MÃóUE®•þ¢³[ù¥1 «÷ÑkJ!¯mVU8zÒÒåX¨úckHQÞ™vÆ·Uùfû9Y8b•WBÆš$W>B÷“ ÞC[Û™±¾+¯QˆS Uob´¦¥ê¿EѦH=Hj¿Dኾ¶÷|0ù }ßj!‹ ô[£×)ß—ËM*¬§á>GåCÚúH¿Ä¥ü’øâUy„7àÚOÆàŽÃ䢜;´á»†3wgðgïk'¾Û£¦pg”rW0È(—EØ„¯EÃ2PñˆŒÛ‰-#—5¾³ºV)%~ÁÐYÁ_s4,¸‰@hצëäjüe¾¸z C”ëÒCKß°öã&?TH©ÙG/a 6ÏS:MñV)Í=Ê9üÉe?dØÉ¾P'+–ŽçvPKçF\á¥2Â%c\€¨àÝÏr—GfÞBðˆEwƒo=“;“a„?™…Q^GœmùÄ‘TcV)ÖCoÃi1"+æ+™´ý4c©¥ê„ÔÔáùqx†ŽÈ«—Éô~‡º¸΀¼­ªêÚA:™WÅüåBú†²Ûv·°9ü¢"]WE¤w“ê®B 0L-uOì댾›‹‡Ýg7ê|ƒ_rÔRøêÍšå›!\;h¡ì¥}ç(;¿›Œe-2¹T¶çVš,EV½FE7òÁ¤åæK®±ÎÄ÷à#¸=“ xãòVEµÉgXàë$†Îc YrvíV™SÜDIñ½Ýp=Rú¢‚CØ“¡n¸ƒ,G :VaòÚ¡¼Qä4¶ø½áÞ­X×IUHVj5¹à‡=Y%¤ A&Ì‹*jñ N9njs¡HŽYzQôTË}âŸÏf²f!êC}®QP÷&©;câ÷4r¯‚Œ3yÃ3:—7–ó4˜Tqc>E_ŠÍ‘áõ¼¶W¸5,h5‰á†+f¸Ã»*Ì]K±J±BðzÄ΃¸îx7šTØð29ÍñB¯«˜¬B¸ŒŠ> wø/ëGô†æ­ø›©ò}^ [ÚêÜ'\‹|‘ ‘×íºÊ£Š%2.uK—ºN3^»ìzßÇO-M†é;¯ØÈÚÉ ³¹çHwª.i©q°ü|ñ3“ÛÀa²oüË “@f}øÜÍ – e–Œ( ·ªÈ$6zC´Èó4»OKøó㥧$kÁ6Kkœ c׺ìÈóuågUÃàÖ >%K Œ”!ÿ{®°fÆçvƱBŽ-“û­UT¨ „ÛÞëˆL6Í\Y Ń"Tc‚þÊL°H¸}–‰]Ó¬Åúñ7±U… ÑUØ”–ˆäÁÕ•;\yÊ_þñ7þ­ì9 endstream endobj 149 0 obj <> stream xÚ•WùsÛDþ¿BÀ ÈP©Òên™6MhJi)1g]˜¼I¶è°u„PŽ¿}û­lÙNÆî$™OïØwíÛ}kiù–§~|+aê׳òÒz<µîŸøóÜ8¬é…;ÖtþÚ>â‹YE]_Ô'H3›MÞLŸ©‰ÅB7I³"RD†¤È친yA˜óY&ê/ nÚsNØsÑæÜÖ–„¤£œÂ[hùž›yyó#7 •ÇÔ àñÑÄa*²“,ó´IB2ÉR˜ÔÚ*+¢ÜˆLÀ!±E ìK,¸¨›’wƒYäͲ—×–ØÆì¢àÕ–N'n†e}Ë«!"³ ¯«·}5a±Ý!YÇäçnêüÈPøvΞw¢-ÑÌ~tvtªŒ$ö© ÆËövÅëIª„C¿óZó<»âín„2 7B 7ªF‚v¥ÄìÚxkÅe/‘hèާh«ñ¶9n[ C×÷uZ3Åwj›"ŒÔ6’òm^\ðsme'óÚ8WÝœ,y(e4´JäÇöc‚Ä><CvêkÀS0OA=|xÙ· ^^¾ƒì¨ïg€)d?€úðàgÈ~õ«Nh#…s(ä€9@@vêp¦õ𠀬UjÀ²%¨Ð:ÈzP×€?7ýêà÷}m‘nøm±VÏ·Ú¢¢ÃØ—ÔÍa=á!`‘2@!‹@Å€ÌT¶'µ€e®ŸœÚH};5Ñ.t¿‹\ry@b"ÎçÇ€OŸB6³AÎ&ÀÏÀþÔ=€p!»êà!à Ⱦõà5à d¿úðà_ÈþÛWÃ8t3vx ×êÛ5Ä]ʨ–z4™{.{bŸ7¼Êëý¥=3çûéÔÜ$æ„¿xnµ9ã''· 0e‰Ån‚Ÿݱ]£" cÆÌ.¤ŠZm3¨«Æ“ß«.n_ºáY·0´ìÕêe/šaåºD›á‘ÒÕFôÌ7¹èêÛµ•ÿíÙ„B¨ñeÂ/5–ñØ=®¶2IÝ(ؽÚC³Iáh“Q:تÁƒúnÇßò²2c¼£±ÛäÓ f°ÎèbæµòTš•T'úP#32¤=¸nDi6H 6Sëæ®‚ô•œ«MjɼgtÝÈœz¡2ÅW)Š«ºá (Ã,Ä¥<—…¶@_¿—H²û¸IÍã&ÝxÜP¶,2Ù’¬ã%…®“¦hJðÛ‘!çU„;S§ÄopXÖ)ÒSÔGiU 4ƒ¼½ª'm=<=Ì•=êq#ÛNGuß5晢__›Ë.ø;åš9”ô­mu&±sªr®·1ÕÛ%‰£ vʪ™S”51¯bàÍH*}ÉÁjŲ§(ª\®L•U•Ho\%’V¼ àõDÖÞuÈx'.ëFò½Ï«ˆ®Ÿ|QŽÔ+u :¹Ñ2qPÐ }¸Ïu¹Á{¸^«¯¯ºÛø^¿qâFÙá~×ê›~‡É€+v¯×4þá9ÈëZ}Á N)^7¼urêÉ+Ðô)öùýÃÇà «X–²Sg\ݰw;`ï²L- ±-«‡Í«þ~Άg endstream endobj 152 0 obj <> stream xÚXKÜ6 ¾÷Wøh#Õ–lÙî-E§‡¢(Ztsê ­lø1kƒI}I‘ò¼’yxÜ©4í0 '™‹Ìñ¼›¢RI8÷¶©ã~ɰݩ,9ÙºbjSñ¾í_æêÅt´=^5©±S=A ‹TûÊžqåm’I*TªÑ]ð"ÏE‘87¤H"ð¼,Ã_ÀiT¡óp²]¤âp¿âp§´jm=LNãêÉe)”rêÞwÌU^pI)df‘¡+Ñ&-b4²ÒÒë²$VLä…HY¶úÉNG”×EظoÖÕXÕG3¢ó¸_µ*ð\!Æòè~ÿí£ãø8:÷wÉzt&vÀE@@´†åœ(\ͼíKMÌAš@½ñ ðQ?Rì4ã†$¹!ýl!€•åžÔcGº(Ûÿ¿Å¢(¹£´h"Ê-…§_,àîƒ~$}C:¸tÓ4[O¥Ã|> cW­˜Î•P¾žNÌpU KQf̰]Q ímOŸ?¯… Åb=…BÔ7fE•’"/o}¹R¥„ö ÔãJG_×ECq0IcÆ4Ÿ1ÂõŒøSÛÎE~0Šj;ôUûvÅ9À7B_‚r-á…HÒã½™,è^ qªÎRoV”z| †yMÀ,Ṉ̃YQp‘¤µ³i‘{ýR(åÝ©|Ü͉Aç"ÈÕݾÒÇXШòŽ[èÕú1Ò³'Û/âì‡íqÀ"Ce¥%Ó8GƒWcÉìhv Ñ‹éê¬ÔFâ‹Ls-¹«¨Šç$Ötþ†{®“‚ÃêYUrNºùrÎÖfðÒVüçÉ& ¼È3ÖÐQŠIVÞ2-¶o²û}pâ~TCõÔf“Íàs.«¦ðÛiÃ].u\É2õàš¦”͆ ãÄ8ó Øë\цÒàæµ… ÛZ C϶5ì'ª(ö43Ù—ÞgöQ7FòiðŠV{7þØyød*YÎF­6j¤0Û[}]›Y+öR#ýAŸñݺÆÐ#CÐj²äæ*%w™É¼Înb¨mE¤jÜÛãHoNÞr†à{ùJBáÚŒ|m€È¹‰Mº¹ 2Kùä"óÇÓFFê®Ä’wûèÙ:ZÊ4è{×ajöþ}êš#?wÏóT¶×Ùº™¡jV”µGçïx¨²àPÀ]¦•wÑýà Á €{d¡æVØ%Ç%¦,*gŸÖK¬PÓ9Vlxº²ü_SÆÊ›óBU殀­ã¹æJwQÑd ¯ûõãŠÔümèá†öiØ€%<ý{7o /öþš óÌ«£@‘âCËK *à09ú"Jß%Jgb²D ÷|”ý•DJÈàE§U­Ø³þöÍ?æÆ„P endstream endobj 155 0 obj <> stream xÚÅWKsÛ6¾÷W¨:Ä”k!$¾Ò$3M›:=¤S÷¥3 Ûœ‘… ]'MûÛ» ,(Ò¤íc'\,>,öñaµú´ŠV!ü‹V‡ÿáª<¬Þ\®žÿ,VQÈŠ°X]^Áò?ÒÕeõ>8n¶< t»ÙÆ1¤9JƒÓ(¨úã^š 'W{IRu»ái ð+ Œ¢}¥¶0U½ cQÊJ:qÕ;4À®,P_”a›—¿€Aù=ƒr–ÄÖ ·wêpÜkcõÞ^:ó£bª.rr«~öÖtpZQ78fAnbº¶n®Ï,ž³$±›ÖóMºïÚɶõ|ÛÙú¨Ý¶êìL^÷r {½~£öê‹\¯Iµ6FÑ!n(å±î¤fkòÅ88Q 1öǯu§ZYû¨(r¸¬TM11»XÄÚÉ{Î'Ý£l)­:¶Ê¨ƒÐÉÖ-ê¥Ô€ÑSPöцs§ñ¾.%mF´Š‹Eêc'RyÎÄ’«(‚w^Ò@o[i¶åæÆ}ãõðåyÁbwù? ”Nmœ@)CÚÆYX$f{k³v!!xȲ˜‹ÒòÖÅw+„`‚½ÕP%ð8óq°+¼ç[‰¯œ—ú Ý¬ÑEÂ¥BÐH‡ Ú‹H·3 ½ÙçqºÕ,$þ–d(\Dä;ŒŸMŠüѤðµ5ËpòJÂsW¶ðSŠ4Cþ(PÊ K›ô>‡=¥ƒ/jÝú&|Œ‚“‚nŒgÙœ[Ã34Ùz,‘|„¼ê²·:!.à%+ø¤ßatÔri÷‰1Æqèܧó`ný½íâŒ7ui÷‰Së6àH7™¶1(©”ÛRil!'‡QÜ‹„‰øážãbJî‘%TµH¤yΊ|L¤ßá«íÂù9LBÁƒ—¯hòÚ¾gaðì ^êWßÓ¸ ¹˜7Ù[Zý“ÆW4¾|Mp_¿ÚI|O+ÿÒøÁknç¨ç´öÌ£zk¿}EhŒV^ø•]@’¿çpÏýQ4¾àHpA#c¿ÛäŸ%ZÌâÝo·ß=ÂOk§Œ¤rlLm:å—é7„®ý‹=¤5Í„$OE( $­«KÈ‰ä  úÜ–vh*qø1ôc¢jÇ«I±Zq $Jzïd – ™…9¤UC³q2"Hü´‰›–Òó¿¤~ðM\a¡G]ò¡¾Ç‡bÒ•æXŒÛT¸ŠŒ"¯úÛ7ÿÚù/g endstream endobj 158 0 obj <> stream xÚUKÓ0¾ó+"íÅY¯_yÄÐrà†Ôå`w‰ÔÄ]'‘øùŒ_m*"„Újlgæ›oÆÓâµ -Z_Rè±øt(ž¾PZP¹hŠÃ ô%XºÿŽnJØJ‰>ÛÑL%“h9rAÝ`çòÇá+‹Â_'ÒÛÒKQTLb΃=X•-º8{)+Ö¢#oø<,`Î{“¤m‡ô¢´hQ¦…·oáFMʳvÃUy³örŒ^zsN—°·!r¥-DhÐb\Ê@n2à¼Á¤¼ÒFå¾ëŒ-¹Œ­]Q5"veùê·7f ÞÛ endstream endobj 161 0 obj <> stream xÚVÉŽã6½ç+t±8\%19eé9È8§vØ»¡†–AçïSÜ$y‹=°T¬ª÷X,Ösô5"†‰2 _Môû.úø‰D£4eÑî–i^¢]ùÿ¡{&Ä8ÕÝ&a¹ŒÙæi÷Ddå(Ë3!àEÚˆ‡÷ÆѸ×ðg©€(ëÁGñˆ`$±4QD É!2GÌEþÓ(ï&Wn4E˜„ñÐï‡~#L>ÈÍYw!+ÏPÜ91ø"ž 5<¤@ëµWÎvP½7ª.¦ZõîmjÜï·±ª»mÎÒø³÷.õPôàgŽƒ7 ÷Þ€æ`®»­±HË}® ÍLM¬çj'I.QN£„0$¸ÝÁ4¨RG(bÑ™¤ j[tí0VãTµH4jï`9GÝ.ˆÆƒö>­!¬d|éIp>w.ôU÷ªÞºÐ‹„MʰmËÉ11=RÌÀ£;Ø@ʶìüÚÙRÙˆc…#fý©µ-ákª™Âí/ŽÇÊųvf81nO̽Bâ©•/ÀÖ¤ãñØÙ´–¬‰=Þenwi‚í×Û¯“*{Õ8sâýº®¿Y+Ô¨_»¾RÃ/v?;w¹Öí™ –F@€!™¹Å4½êíÏiå~íP,“©1ßW…~½Å@¦ˆËû,îWÛ¢j ‡gk„UVßÃnÆÝ$‚ï5´Ê{8îÛÈœ Aï_ܯáÏ÷¯kß& ‘B³Ý¦‘r„Ùý4÷k4jSü×»ŠŸ§Hˆû±÷«ØU«Õ|¡C.B"Âã© 3Ý%C0  –ÒÈÆ©dÀfSÓØrÝØ×…„JÄØÿ ËŽ„/BXYÜÎ8fM]€’eâX]xêÕ…/ê^]ø‘ºp¯.<]Ï*ÆÅÉý휺úV•“ªÍ{éMüD‡ÉéDƒ°áÔ©†; Ä¡…ñ°gmtß«…Ÿ¤.i—ì1Ó8…kt¦®Â¿$R¼´-!§ät9·C_…ƒE9¯ezg–‡± ºw†³ù­«Ñ¨Ñ¥¼FS9§³«‘¨U¡­Ív8À…M}àg¹&¾r~[sáÜ)MzÁ°K#ÏÒ€åÌQ9ûËÔ®þ8OWȾµ.Øízý¢!­ mQ©Ó<'…•ç… ‚¹p7Õ*Õ6¼:QñY³ídZd˜YP¿ªkm¯A\7y¥žÆþj*ø§Q¦[ö‡Úû¶Rns~‡‘ðñS¾ºNGŠÿð®›CÝ…Nä‰c†Dn ¢ìÂݤX"š†Ë¹´ßóº}ö›K ‰Ï°*êÛmœ¹÷îN:V¾÷¸éì&\ï†Þ»O=~ø[ý ÿ6)ÆìÃöígòô# ¾úyØÇÏÕöíi޹€ˆ0ñ˜Çh=§Žî‹OvI¬(ÍM£$)÷Ý‚뗟þ¶ ]' endstream endobj 165 0 obj <> stream xÚ]oÛ6ð}¿Âʳ¤HêcÀlC¬Ð Í›ÅbZ&–åHV`èßï¤H¶œ¦E ¾oÞ·²x\¨…„j‘Æð_.6Õâ·ëÅ›?T¾PRä2_\ß~™ “-®ËUÔvÕþbiUùžiôŽÒßÝâú AŠíþS±ò7ôëG:nWþêþæâæú¨1#-±2"]¨e¹§}ãÚv­®/–Z«È\S”Åú‚y'&.‰{©´°6ˆðlŒ'µ½±ôðÉ1 žX·'´Û¶Ž+©¾ÇÜM½+ýÆ×»bûZ“×½s‚ —d€°#“h3ûcà±qG?÷E³Ö6& k]ËB—*ÏDžÀ™ ›io{Y Ø䮽XG·«@Œjü¦PU…güG·pWŠ%z„îÊšÈË®`òº£óY€›(ÎX±BÅÉ©â}ãd„êè-VäfìÞ}x@¤•®"W´®ÁKŒÖµ‡¦¹¶D©ˆìÚ"ØŠøÒAþU~W”5cë=YY7®%²¢ñ‡`ÜÁoêVp¬²i5©LXÍîuÕ~ ‘îíõ|ñ)iDJo¸¿TTŽSjp CÅ-ÕÕ=fmø½$ì¨î&ÌXÐ÷Ó‚~÷e4d# ZݳXNOd˜²ÿõå¹Òn&Ùû´z˜1aý•b… Œª3~ù™Nõ]µ ¹~½¡c=y&¿J Ë%ÑÇz£R"G‹)&i.lÌ×B 0E©ØD‡.…9¬S ¹ªås®r”§•ËY[aÓ í×hAùtZËG€@9ÎâC4'qEm0m;'¤¾")œêŸ/¬æ]7ýÝöP–ƒ#X/%úëú³¯Å‹.‹u.´\³ËÖZYl•î+îÉ÷©Ñ=xL݃÷`3™¸©È~¼¡{Bf„nG,nä ôì‹4øa½,s†gS7›p‡ÆßR«©Oš•¡šÐF>vnËÙ0X÷²‹µŠE’ .Öìâ0±ç›¸r‡&4°ÔD»à¶¥ß•î)´µWú_'iHO8ŽÒ GƒÉQzçO’Rz¹ÙÇ’¦æ1c^¡ké>c¬© F`¹,}åv-ÞsÓ€«é›r}ަX=šªü‚¯„)k²!Læå0½2>Ô>~žÌÇ%³3q²Q\°ä{è[>wç¾5³Mc˜ÞF–B“±nÛÎ3'1¶îc矛éè®nªâLˆZOUƒÂ8-~bŒÇ£Ê Í'\»ºrsûøÈÞ‘V=A<"°"éñ¾Ç›E*ò±Z¤¸! R¨90¦õb ¹šS’‹8yQ‰)‰Ï(1§JÌT‡eR+±t$‘˜“«£éMz­ÉÉ9·ìæ4€cGn™[¦![”1œRHÚŒ`}v3ñ†(抭Ez² çB¦ý2<ŒÁ~z"O(æÖW˜]·a+Ä)¶…A8®èø8Ïq‘žsJå+òFOòÆÌDTŸA‚Ø×êˆçu豎ðšãìǬþ8Eþ’ÀŽôïæs2yÖ?ÞgÚîv˜n¼0CD´0ã=ùwøòr9%GHLs s@ö =€»ª ËQ/”s+ñ$À¼HB^$}^à ñž$þµN!3BbH Fjò¦f;¶¾=œku=—'ì¹? ÂórÚÕ[¹¶ª <„ aüõÏEÓ¥sŽŸd¡ø÷cÄœÖOÍl'&Jø6 =út³/Ú¶õµñ@ nÿö!¶ïQŠÍq¬Ú0VG›4\é“ .næ{T'ìÀ¥BzOÀ>èIà‚n¾t4“üZj³)ÐÃ6£ÍЕ£Fœp`„iÔmn~w›[¨¡ÐtÅÓM¾´X/›±àFtô]0Ùq§ÛǤ7ÆnrË„ÿœ£LOúïÿŒ”H endstream endobj 172 0 obj <> stream xÚí[[¯ÛÆ~ï¯Ð#`m¹.ÉyhŠ$h€ÆMsˆú°i…Hʤä:ùõÙ ¹äYR’}ì6@aÃ’ö¾ßÜgÇ›7º‰áݤ þÆ›}½ùòqóç¯á+¥$O’ÍãkèßÒ˜äróXüqBIò°¥”‰è뇜G—fÇEºãZ9Ê>Ò$*JóÙ•¯ËnÇÖì+õð¯Çoau±Áõâ§ ÉÅfË’¤zƒ¯ê‡­àqôwuþå]{0¿ÊwU.uToûòp©š&£3n+X½öÃ2}ê†uê_@S"¢7—ÒôôÈþMáØv¾ìLï¥W…ÙFû¶nÝyN]Ù÷þ>x·­½å±ƒëÀ¾it©ÚU{Õf1 ùSàC”Õ«~¹‘ÌÉ.ëAïBKI¸íß=؉ן ’J;à×МÄ|¶A^ÿ×9½Ù3ÌÞ>ÖêØvæ'ܬ=^έù\8BN O×.¹e,%̇YU³€XF`îˆQî Èr+šªÛÃNAÜ¡sʈð6adN]2rRG †ˆáŽ,ØøPZ>Æ–x>š;å+GÉIæNº‹áqõN•jÚ~Ä`‚82ÎÝÿZ-!©°1aט\¬’,÷’ì7@!‰¾ÁES"<Ò‰”ù¤‚û¤"ѤBXÒa‹#]ªI‡} ¤ËÉÙõ#`Ù„„¸æHBb´K$I3Ÿhß•½>Ì"PF-\'‰YÔ¢~“yÔWªzÓ]”¦MÕxìWZ;¶¶Ou‡KmïÓöA °s2ã ¨ñÈ„a%@r¾ÂÃ`ž¸›jXðÖ Õµ;æIuÊ!2’M€(J05Ü×JŸ•±7Utj*dV'âƒaë/Çó04$3”Ávk°W]q]f~ ­B›¯)öLÛûO!Ã0®›bÇ»~ǪPÚØD;£FeÇSV—];è*=¦<–#ëÀMWu¹)0ñ.Œå6Ëbd˜Ås›†MhÓXFu Úh·ƒe Z÷m×Uö7ÞKû\ø5Ž?Ó]‡m¥n¢ùý-x“4Ocã(Çþ2êád|3C—›ê-R°ìz'@5¡mÛe£œ7³CHÑñ:ZleÚ(MüŒ4Ç ¿z´‚~c¿t“#˜xrÙA ’äúp_:.€sCÓrL2L¦YŽ<Á èÜ‹;!¸q·¼Õ’ìêÀq&<›ÌZà!î‚°VèDz9œYÐùèõá ˆÒ5-f¨NosèúÀ|oýº¶†@¦.ÿeÜ6Ë{pò*5ªmëÔÜè2l9Á#åÙ[Îb_=–>¶‡Oaìa›à‘!p¦wÅð°êªsm¥ªQçK·n¸hœb(²šÝ/7‘3XhüŒÖfšßðÌŒì9HR‰Éô ‡/†NÍ0è6gi‚ŸfAd¾Km˜•Ô¾ªÕÑÄ l Ò$yêOÍ8 ¾CïAZ«wwpÚ†æ-%Ò¨ÚN`~crsŠc²‰ð6a ›ð§›ˆðäaKeb>dD‚IHADzgVF.¸ k<é8hx™@Ÿp°»çÃÄ~‹‡UO¨¸›„â> J¼Í­{°öÐWœJ÷g)IÙÑ} 4[ÌõS#Uó©øCH… ðˆä <,rò‘,KÿP©#Á|©èZpïŸÑüŠ뫺®„8¢)Ô"[MôÇ1¾Ý+Ë7³øN«WË>§nÇ%ÇîwU݆¡áà,OÌè3AsM´šðüA%¡•)‘ŸÚðÙ Ô„ÓßÔ©•bÇ“äPÛÞùèóTý²o8Ióôw©ì÷v™a›—™Ýç2»äØ’7'`Åô™_¯s’TìßtçšN1ÏcN.}³Tnþ &%ÃÇnˆ~2TÈ5`(H6ü>n~Ø|oâÔYjÅNãÀ÷üÀ;Uýî’6øºQØ0Îdv¶MyPçÊØŽÕÀ8OæëK®YÎÇùÜ1“g æAãñ!ðZŒ|MC¼^ÐlMC$t|nÛ·Z/¼}Àçüν)1ÎM†'–(ü"†`M§¸ §ù^8 ¨ªÔSÕ¸âÙKíàN{u†‰‘®²C¼,Ž)?ÈRÂ'‘£K~¾_^ß#%²¦äh×M^‡]Í© ¸¥ùdÚ kcÞ#¯ÃÓoµò:¨(ÑÙðf-)ž6ÉBœ»K³ÿö^Õü§Œ1W~·—~÷.OsŽC^šë™àøè6þ¹áü¤v2´þ­SMÁ˜¸%E}(;µàßúòR´[Ðꌴ׺;.Mõºí겞ՔT ³«W<¼Kƒ• x ”ÃÉú9˜ƒæ”Þç¡%>YÅÓhNxïHBâ;’Áƒ‰`ò Çn‡AK©[°™tò(ü£¹}LïƒW£ë?l\€=£ñÞ;v¦‹im©ýŠ'Ø„%Ü3:Ym¼"ðrþ¶5 ày›ìlôþ'貚wgTŸ› õUh%ôžŸTuÌY—Î’ÁßÁáÕñ^Î5^W¡FÇø96Uýºô=8Ðj :÷ ÐÖájP‹l|…“Á`‚HÇ8_ [“Fq(Õ“$[« Òo0n'Îv’ÓèB©ˆ.BzíõÿŽ3k•ÞÈüþá§KÈU—UÒ1ÃòߥîÜîå÷“m¶Äà*ºˆK»´<¥&sŸ¢`çË«Öòy´™ªµ„Æ:ºÇr^åÆö¦}Zœêú`ìŸÕ' Èþ»}yºHL |Lއ’®p…^’ÌYaZÏ5,ažCotžw¥OÅÃõ @ ¡BÑE\¡ÔÚ¨ºíjEùïQ4¢‡EÏtç³:æiÁ³޳äI}3Áúèt–'QUhfÕŒQí[4@<ÆôèÛªhí´Ö¬œ]í÷¾Ü_†|ž#€L¿™{ê¬1¼ü^uchrAv]=ÐTzFª@°Ü%­>øê1{azq[)2z$nè÷ú³ú¹/ endstream endobj 178 0 obj <> stream xÚíY_㸠ï§È£LTë%{öíÛ‡E[ÜТsžÄ3ëEgíd1ÝO_R¤Éq&{¸^ÑÃ-fÇERäO$E/>-ä"‡?¹p þóÅz·øîañÇ?ÁO)EU‹‡g˜_É\Tvñ°ùW¦…v¹’R™ìýë¡o†áQÛb¹Ò2kx¸"kM_oêaùÓß™Yàò¼B^²•Y¬T! çùý¸«™¬ŠÈ`^)Œ HYyæ%Ý-WÊ©lÚ=êBöíçj”^°ÝÔs²U%rÃ\q1,22;íjúÑ„íB–Êe£ &;ô-Œ©ï`¤¨²O§†§àQfÝ0œZ¨‰ÏмœZÏìÈ”Ï]Ï_I— -ÐÜ ÚÀ¤(äbïg $•²ŒWuo$Ø?ˆÝtýŠŒá_À-EqaÈU»ß4¯h+˜6Y»å`ú…L¸‡e—6\Á*¹&ÁÀ8hu3Šê‚ ŽúÉ,øg¢ß¥ 2Ö%¾" þ±ïv^¤[íÐVOè ³zÛ®™ÈoHºƒŸDHv= …=PÁŽ}Žs5M Ó6¯Íút$#Âøcö6™®~ªÛ×îqy7³w8%î"òÒu\š RÂê®V1\­žÂFÎþÄ7B%¬@8ÙìØ{ªlsúBóÀ²ØoÚ5žZÏëŽÐ×wÛšÖ3¿©±h͌Ǖ*¸.•¼ *#KQ‘™Lâq>Z«ÉvqÊo+>Zç´k¤?Ô=žöPñ†ÙœÑ0nEx•0Ê•AþûPU&ûK}üð·¾{¡·æµŽŸ*@PM&­b%CÌÛ) v +v,$:¿b¸y¸áªÓ€kh°Ù¹QœE9,až†(d)´ Œ«œÈ)„§ÝŒ´…d¯ Ý®>âiêÛà/8ógZç„Ñø®‰ã?‘Y8Q9Â~!dbDô˜1•‰4jÆ@áI%"\é³€(1Ä )=‰¼XoPÄ8ÿîþþþÝÈGùH#,¨"ªÊÓí/µ]aúqXè9EÕÜj¢Ücž5¥ŠÃ™(¸B”žê9èˆÄŠ"¤¼ÑT #”™X+RB gÑXÖ$Æšpp 1¼ƒ4nmvGñí=Ú “«2²ŸÛG³#ÉhM™FÆÊ‰ôÕ…()2úns–Þ„°7ÁY m"pþsœÃœ7°ù š¿yhîÚý dî|2mwÝœTgÏÅì™UGí«b'\õÿ*å[h”¿2G3üªXÔ·±¨1õm,ê¯Á"Ü\ë×ÛX4òõ Œxù„U‚E‚Ò7,~ÃbR£kU"1gjw¾øÍ¨ õþówm®n hSd‚vëãÛݬ%ÞMSì5ùs¡½º<Ëïp“/M0šµá²Ä…É—ÖWï8µ¯ùGZ¾»ì¼–®kÃÝœO”럺ÄhÚÑezCD¾=6g¥Ž e¿Ÿ€ÞÇÝ =©Ìæýˆ÷&_߯¯sƲ8I:¬Ž§ÃÖoÛâ—oEëö1×fMWh+ùÔàõ_';‰úðF7:‹Z"Ÿ=¿}^pYßÒ} åÑ…ï´­y®›Ç¾}:¡‚èºã©È¾ ã7]@k\PVáö½€Ê·™ðq¾îŽ˜àÆ½ÌÚTZ)\ðêï±ÖJz<ÂT)zѸlJn—½ôØ4›\s3m›bF.›à½õé#ûqD ¹[) É#6p;mõØ£ÃV¦a?sƒKet¶u jp[3þŠb]$^m$Å’ó¼Ë’÷?&{.3{³Ö` ›¯ô}`IæèêÃĨ…Á@”t1¸7ÉûíÄM ²‚?$Û›'àN;¬È=Ñž(ŽÜ÷¨Ùc“8=%¥Åê ÿy1Ø…æU; س®çhH{ÿ0ßé°`3´ºÝV7´Ý¾no´»Ë·ÚÝVTúj»ÛÈâ²Ýƒþ÷¨ÀvV¾¦œœ±€µÊ]œ£rk•[ÞDE1~$ï„uèÿûV'Y$n‡„ßN“þ÷•¾V áÃø«¼¦­}žÅ’eˆ2OsŒJLüÐì¯4244_çXøêœÝ·š[<þ=[ë—VC*÷¿ßORë)íõøy»Ô|ˉ2fV—¯êèn±­ó.¿cŠý§Çd¦@àÍ %¤~cK±‡æ‹}c&Þ™„aùY_5_Ùé‹ïFœ$ ë”XOÒ$¯8MÀëE2‚±Í•Ì'£´¥IÞÂÅLš¤£ŠyÊž£#è•{îOnCcõ• q¨¡°Å?÷õj½5>Ð+þlæðjá^*žòI“B…e¿ÕUö‡*"!Úôͺy¢]Ó‡3ØqqÎû“oh2*¥>Ó—©M½iZÿ­bîC…˜¸cI"u$çìAË–½Èå ×Ä[cêNTž°"ðÀ}ÀÓoIñGÑð!~°ŸðgMr‹ýz·HGê2ÄæP꜆Á1òä÷õÀºŒß‘(q` §JÔì¬V™Ïì!‚¾&ŽÅ&K ºI:?¹Ðåx®·Ãœ/•Äœ|éMl¬ÁNküQ³¼M\Iß{†'Þ…‘Ô»ÎïÂÔ[¬Ü +:sð#œ9øÉÄ“#æ¼/ËÔ—É9ÌÀî2A%‡ÌáUoôeÒ~hFÍ·ï¶œ"ùd]ó×XPuO_Ú þÄíN3:…åÙiˆ«ª­Ï´s˜èŦüPø³«|â0æW–\XÈdoa)·ùuXò‰ªw’?bÀëåÅ#|«¼ˆËXR|ÑEDÒÔ—¦Ÿ”¶éQ-QÅ•5T‡JHÿþ‡ÿêuh endstream endobj 181 0 obj <> stream xÚ½YmoÛ6þ¾_¡rW±"E½ ûÒ†E[4ß– `$¦Õ`Y‰$wé~ýîx¤-É´ãÖ锸r<>w|îNÄðǃ\ÀTmðËuðêWx䜕i\ßÁxÄcVfÁuýG˜0ΊUĹáÕã}¯‡á&ÉÒU”ðPÐäix¯z½Y%q86ÿªZ «?¯¡2@1q‰2yÊJD"einä¾ßªõÃV÷«Hò2ÔN²L:êÙ¬DnÛ›$å}S)ì,ÂûU$ŠfÀX­iâàdTº¯`wz±3í(‚„‘9êA/¡_Æ¡Ý ô PÝ´c×o¬ ¡UY8ª´hᘠvÔæ„‘=O‡Ú¶°*AdfçIqxœvß7Ð#¡G1#ÒI,Xš‰ïpÙNû‚´ͲÄ17`F‹Ò¢£ÛAÕÝ@4˜ìµBûÁ*'Éœp¯›A§Lêk»¹ÔuýQßöÊLÉXee¹®š›8‘•²z¨#Pu½ÑY”ô߯r¢elûBOhl;»C¯@|v ®õgËI5H`¯Õšü’JpRp½MÝÑà ©¸ZzòùŠ(EhÕšYOO¥iY¯Ñ¾ñDVæ,‡Ý4y…ÂéŸWi‚Žt å6·ÎDÍ ·´¨£wX&aú8¾‚VÛõè–RŸÛˆ“;ñ±·K<•‡Ž¿”‡SjÛ?—béç8D\€k æÔIzà“ÕêÁø–àËmÏØÂ]t¿c=eáêúñeðV옯´Ì÷öž¯{G{ªoFsi€º'HD^µ(F„oÔøé]ß}Ä7t©fÔ-=ã•ÅvзSšutá':À¼¹/±3'>ÃÑŠ Ñ==8Š0:´N—)Eäx¹–0Ks”Ÿ ?Ùóóòh$±þn–˜Ì*™H{ô ˜I–åv¼U½Û gçÛ7ÊVŠ©WD—n¬7ݱÅÉ} –¬p;ƒ$³ã_<š¥’ÜŽ«º!:t„tB#y–FÑ… ÛÛÑqôJÓ¼Ò'IdŒç'KrVÚẹÓ@N¨˜‹¿t?†flˆ†,mbXðìÅã„Ébç1°6Ʀðo3.ílËJ»„ c"óÁ(äG)ËY‘-4Œ,sÃ7qûUf%?e7–;oV^K%qÌrþ5¦zq¡ÿ´†ZÖcs¿fyf?zu¡ruó¹žQçuë£óq•¤¹Í4þ°¥Œ¸jô,ú»tb¢²q9ý¨Fõ<Ú·]}©önÆîSø…×99¸<ï–¼ô^T–ÉÅ==¦À_O"ßögmô¦j&—×^kb²ÅˆEÖ(Â1ßhr#D—?*J¤œvL©þë6µ— !©ba1?>I’›áR0™ìd|ñÊH&2†É|µ ö/kJ÷ _c™˜&½0Ï,R›E–Yda³©ÖÛ†F)íÀÞÚ.Û¶Ôîk’Úd°Å"-„Œ,…üq´9˜©È–Ë´íœî®uµÕn'Ý¥`®¬¢Mñaˆê1‘—¡mê¦×Íè^´« úê芼قO (Õ?l+±6Õ œª¾`Þ $ò€<rô®nUóØ[yvÙI.6¦ ÆNýXé9ÍÏŠªÚò¥µXY[ hÈC;Ò°ß¼7eN/{¬÷4$öØ™TÁ K59 þxQYâ¬H“ž"MÚí¤˜¹ &òRÚÃXÕ¹ü!å--;,`Þa9Rl(©r„ÆjQÛWR8Âoë«ú$úŠF1¯Ù̃ªû‰òKBÊ3ùðÄc[ý6ñJ,½ŒWâC·+Ìö^‰&=«{M ®›aTNk*»öAT¡Ql\U3.Þã.êàÀ“›’[†Tj%ÂWjù¾ÙʪŒ[b&åßîì?·˜Àhá‚Ù7 ûCÀ(pÿ\ = ¢PIŠ  „~÷¾>ïÉF3í"À0Î-†œ›o™ù„±¸fÞ™ªéŒ›Ð[7£ ¨êÖkËlŸ×¾ô‰˜„äJ7k!Ð¥ºÓcÅl$Ì8Eî6ˆÀ(§Œ@Š q¾ªiA1RØ|œsÏž‘ ˜Ms–Q\=Ñ}‡Ë!p–ËŒfhŸ?O²ÈHæ O¶( 8øEî’dñ=y³«ñíÜÕÞbR{Ÿ@‡Ç)+ŠEy}ätONéÞ“ï Œ§&šâ´L›Ý­ 5›—j߈Ϋ˖ïkŸo½Úûú㘓eÊCÓH¸%òyl³dãÍ5#†I ü†)·ÓÝ'”ö‘qØÞ÷^hæ¤wZD ‘ðBó¨ÇsÌC OÍ“& ¿yò¯4Ïküídú¡loÄÁ÷ªS6*öQá³$gb]¶|ò=liß9刺²ãü”>ȧRHaë¦jº þ¬s‚žâ’ÅŽ¼›;ŸûLŠuùa–R“…Ì+P2éâÖøIû\zú ñ+%êõîSá±k†.§ÊÂü|ÁYv¹„y¾IÉ`”IšÌs7õýÿ$%b© endstream endobj 186 0 obj <> stream xÚÕX[së¶~ï¯Ðœ‡ŠJd” ^ò–tœN;“IÒ¸O¶`–ኤÍË7¿>»X@"%Êǧ/Ž4Cr±Øv?,°z]ñU ?¾ÊøÇ«²^ýp³úËrÅcVÄÅêæqÅ+äê éꦺ®ûAo®’,ž¬ét÷:Z÷EwBqz{]yâ‹îü[eÓÕ¶Ñ}¿ŽzFüsÔ=½µ/ðÌ#'dv'R…ôÈøá²mzSŽƒý¼Q2¢I)ˆù¼A&úê×cÞ º¿ùxâL)çÐKgkc»–m®¤H£ß`¾àiÔÒ#Œâ—šØUµgp–µ}?Z"LÂߵ¶·IŒÝ9ß‘¤½žÞìÆ¦j·øUDz¦\Ÿ*§ HÑ:—â©7´"G¿Á1UäÑ_ußÒ„o“¤ÑÐ ÞY§´PNi.½%šX—t:®£ž²­q‘+dL°Ü¥·膈ºïmí¥/ZÃÚ€M9Ìaç>ý:j LJ °ž"Žô¾Ô ڤ黥Ç],dMœ•1o/èq¶o‰4´Î« 3Ç óÏ–sžv¹K;îL­Ó—hj¦öÞ¤§ÌÝ5Á¼®2õ¹gÖIú¼q!î5ù~}CeÈùŠK&dŠuˆÓbÉwóK6ð]ÑuðmœlM!Ÿ Ê ÿ(`MR±·%…ò <)˜Nö¿jíÙŠ [’2‘ÈÝ(Ôup=ÍQãÃFÅA2è}…dYîù$’i4Öš^:³ëü+A¾•°ÚãƒxéI‰³wÅ%yœ:Ó`DKœ¶©ìg[QÑ9%4CU¥ì‘Ad lœ,¤¶[Wîí ˜RWÙ@¬L uº„l7=-`€˜œ) é÷-i1ËD¢,Ù Âe»Ú§úÔÄK•è3×øùrÈíìCJ°‰{ Fé=$½Š¥ r@ÐÄ£4't7èKj3 ÚáüÆYzu†›ÒçneÞ´ƒ,•p~"(gŒšèc3 ˆ`}aucIÈOèÌ£±*iJ«O圄(Ëa=«>ÀAˆƒm—° ŸaAÛqèüÏ…ã ž9áÙd͹Ä# >¡1pÀCÇÅ\¹Ù€ßºFH*wê%Ž,×v°»nçߨšâSë%œþ±FI·»y4q΋/z-g™Šø*“@r0¶ÛÒmC @JŽãi#ôŽûAû8Í…4>s(®„§î$°Óù0Á°‡¶ÖŒÔ¾Ú½D·—bˆtSÓÄÑ?{(;ü\ŠBË<Ê唋§Kzýfê—}З'ŒS…c\ÿ½d7O]æ+žEI‹õŒ&R°ø€£¡ÔOq ±àn³¤÷Ê ˜¬Ìó—Õ°ãÃB_¾,tŽè€žPFÔß®õC¹Þ>Ëïÿ½_¡¼ëLJÚ(Øækskï·ÿþ–oÅaö;ºçØ7]´Ô}ØûHic)kHÝóïDžŒ'ô·vû|Oï¦Ç'ÆØ'â3ûÞ§Ýpk?ÃSxäSPý°õXɆoÈ€g(H8ššFkö`ûõGâ{n¬¶‡û;`´r•$ã’ŠÐp¦•?tHÀÄÅMÅ%Øã{®iyЇšÁ¸)tÎÁ7ÜpðyœofÚóhçSî/rè”⛇šBâºpžº«Û÷Äwjºq?ôÛãÉéG$>k“¥Ç„¯CÅCÏ{‚¾ÒŒÀJûvM‰àS×γc»ž%öó|ô~}Þ|"˜M£O³™¥­:¡ gƒÔº’™IöÜÏ÷—»ë£×?cx•;Ú5%üŶޔÑ.CvE8‘ííìÜ$p•-æ N¾”'8çP*s§¶½h_¤ÖéFXâûv×zyxœ{ÍÞŒ¬Ú‹I¦Ïº¦Ù ŠŸn×þ\u‡û0 Ï³?,éÒÖP óÓP¯8gª¢Ì(b&‹pb°ásžÈèÇM!¢®Ó3QæcÏľs$RLQê]CÁ(‘G?éáé—®ÝÑ—y³Ð渡Â!‘ˆ§g{<"éqjŽœ2év='š^޽~FåŠü®\qÔ]¯ø)aМ£Öò"MZ˜I‚|·„Ôa®b2mw9™0‹¹;Å8÷ãÛ%KÂü·¥ù)KDÀ÷¥ L† € µÍî°·.(L9ö]s‹§s–…¶-MW¡=ñ~¸ú±óû˜S¿ÄñÀû¶¼!æKåR_ñ¿ô—æÿgY&ß[(™ÿÿ,Ôìæ‚åÊz’PÝ<-ŠKsÆß Ó”*ú5YöÁÖ&¹¸ð*>vX’(XñÑ…{\^xÅß[8%œŸ¶Rå.áR•¤ÕKµ¶ø,õš éH¬´eà ;³")Ü`gNoXn<ñfYïŸ{Œßƒ~3óÕ†„n»ÿù7ÿÒíÎï»Á]?¨rHãÄ)ø‰£œ»4MfÜé´­ï;Ñßmôבç˜kSiiüeŠ‚e³I‡&7‡ÔN§Mîϸ1ŠÙí¶ˆt·C?àHɤ gCͶœ•ðBºI`:ÞÍ£Tj> stream xÚíYKÜD¾ó+|B)Ó¸îvç(€PYN gìÝí=†Ä§ª«ýœžÝlÈJ¤µÛÝõ®¯ªz¢wøÇ##àëè«›è‹oTÄfÝÜÂç=¾èè¦ø%>—ݱ¬ºv·—’LJ¸½ßíE«¶ÉO‡-çÝÝP—ÍNèøÜö¸–ÄEù;¾—5½öe‡".ßßweߤN’‰ËžÖá´‰‡ú SÞUǼg»_o¾xʬy2–J'ÏKبø¾«j/V’Îü ð§ EéÎñ · Õ¸LÐЩ$DîüÆ¥ TÆ”ôÛœ"Y\]ÒxuN“BJzÞγ*ÏpÕ #¥»¡)¶ @ ³a ê.YšÎ’GhiQ’diZ’ÓW5’|–Ö1˜\ž@žë–UJÅ¿ïRçÔvø*c 8œÎ9IVÒZ‘ÓÖ5?\ òý•‘ñ»¡¤Mhzr’ãÃíг TøÍ]y[vpB4ÇŠ(‰‰@·ã&'d1Ÿ% z'æ÷(O烖Œ¶fí>´>$ÁU}(ÀÉ€/n(u ‹8gYøÜɘ¶ŽŸd‚‰Ýžs¡â—8@©ì@ÌνI½À•o0F{÷Ë€ôªˆ”¥™#ý¥ ö!?9±2ðÍ3•ŽÇ?äç·?víÝÕ¹ÃÅç²4¢v´êòÚxñ¼úèLãœi&ជÒJ$’Yâ%£x _Êuü9þ9í·Ìòå¡¶™³V,ɧ,É|6†ŒcXfýçàyÃô˜òÓšzâ> Dª68•9œÂõ`ˆCHì(ú¢G+ È =q©ª]øÑK“¹cÛósÙä‹ ÄïEÛÓ!-U^Â@¼)|¸@b0a—Á¾pŸžcëùÖ%£sò"ðyQV¹þ¢»üU |$ì@«çŒa/}ØW”Ý»¡Ê)âYCö¡t ÅÑʧüN´SÕŸó1U €—»nÚóUª¿]ÊËŨëì¬Yïr—<>cB!qe{Ê”L1®Á-f”ýå†Z7 ØbÆ0^XÍÛü]Ĥ͢?À, ìÑS®Ž¤6ÌNï§èuô겤‡ŒeZ{rž Økû*ß@`Q~€aø¶Ðõ—Šð1ÈBdI™‘û RâG3N:$œ‡J2328nÓÞ\¶X.ŸNx/¤f`ZˆW&©~HJjBèg åFù<À ezì% arµWB‰P~-ûd&‚„ÔãKMv3€OQQ+Gþ+È;puÊP5C0@!×)ýÑ1 TLMü Ø%EÊš£Xžú2DÑáÓä¨ÓVÇöÒø‚C¹øãËÄ0i\×áÿÂÁ“C/‘G ¿Û¾*ÚÐÒz]öµì«»¦:$R©¯¥c;~$BŒ¡€oǪ)ç]>í¹@+u-i/{¥CLÍfGÝæëáM_® P‰f‰Ÿ¾õÝÝ%ôèŒ@)¡Jk_8ãÉLOZÍ”]ôÎ=ˆÀïª&‚˜q‰YQãæQ8ÌV¬Nvë2È9Æž„à£2(féØýIe6~±tÄOe³ÚÄ4>ïWÉ©©Í×XOÒ³ôÁÊhAÇóç:÷ÛìºcþbXìÒ$žwå˜$hΡı)†¾O×z ¥©wǨ´Ã²Õ|x_à`ë£ µ¸\ö¾¢}lÓwìI=­ß†iŽÐáߟòÆ“¼ÒZÁÔ˜×M°¿KG¨ÝŸ 76LÕwLÊ7.¾|Ñ9ÓÄÅð§ÇÆÉØì)ÿˆÛ|»¢9ä¾.Þ¶]=ö½'‡A{žû‚-~IŠM1“Ü óWÀ–‰QÓ²9;7æÅèp®&Í"™U¶Û‚:myö Ù‰g§ÖìtñÓÇÿŠðz%<_¯W²ë…ìuØ;LóYø¿=dšŒÉÔÐHëŸý—}ö<Àž&q<("KÈqâÜmbæCûh,\* ¹kíºÅ‘檺_é@hlÚcõpdÆí¿‰ õ@`ìe&çþlÙ­…$VÓk¢è«’Ô¡ (X¢gQ¦qÖ@D÷50;,†_åhLìC¢q‘0}@L¨uHX¾*ÒH-›k9X9áx‡wHdšaý^4_~<ç¾^fËz‰Ët‡Ý^W¾ÄåÕåì8²¸&Õø‹Y€±¹¸ üzvÈÆuR\:¨›ˆ :¨©Jç›yzH&i?Ç'ëV™t÷ãü4¾ŸÝa¨ö.n溻ìÒÅ‚ï{ÝxœðæD­š™åüó:DF3Êá©VÌ£–ÏŠU 5]+ý1%bÅd³3ùøÂ>m|3›Âð˜]ô5‰›‡¿N[Æ.ÂÞŠñtåͽÍÒ}¯CÐÏ3s#B¿}øFS#²=ÕÏêin68ñ<ÕÍ£<`èƒ(¿V2cZ<Õië !»V˙Ƚm¬%ËÌ&'ÕºAvÚzDm½ýqWhZSÓ¢éÇ&8t€úЇsUø­'rß!Ð"½¯ˆ°Œc´ C؆pO-¥vÝÅ¢&w17]à,EÁŸpÎè«c»S×!^Fîµ¢ nÇ­¯>ûL/ã“ endstream endobj 194 0 obj <> stream xÚ½]ܶñ½¿bµÀ­*~é#E ØFó  »OÝ<èVòY—•t–VÆ!Eÿ{g8C‰Ú¥Î—8(ÈáÌp¾9Ü}Þ‰]b—IøOv§v÷öÃîÏßëHâ")v> ½;àDºûPý;úiPIu{™EG•ɶzœÊ¢ªÆßféªæT ZÒom÷\†²â‰¦«êç’fk‡ãË^¦ú¦;5U3ü©oiÀû«¦­»ñ¨´ê‰rÕ;Àîq"¼ÌÛ=@‰±9õûŸ?üGÒ;£Ö"ÎHÏ÷ž!|!d±’¼|g—:ÕqQ€\TlŒ]hâ:¾Cb*ë%c#_ #@Eëp€±Q(²0V°²H#q¸LOçr´d4É*‹êÃÈpÓXYÒÏÓjþúØmïZ‰è}EiŠ8ý=<¦Èc¡Ñ±(¾ àKtþÙTÔwa„ vÎ2Ë¢¿98åŸDĉ#,„Í‚fS£he ª±~˜:k²J’ iÞ3U•Ô@ „ ¤Œ8ïä±Q$R΄ŜIO=øåPÃÐR8ô˜tö˜¸ö˜o4²”Q~¹ŒzB4»bPÛy±H¡ š}.xù eXeN~ÈéÈxœ';_wåH+S{MžXHb%‰\¬¥ðEÞ–  Ð"‰Êª)éôõqF›f¹ŸV|2+çXz8$‰àhº4çæW’Š%õã á"TP.*Îõ•\„q™uä83ÀtœªMóÒqŸâ.D%‹3ñ"Ô£!Ã4”OÞ$%RC?©û Ò—EœçW ¤[ô»p,@„dm!­SÑ@¿”s8Æù+”‘±\9Äz„dåùa²ª•ET?? õèB>ÎX™ZÔùМ,p1ÑâØ´¸|L¥@3UgAIYýç©&`6â3#†Ôb͆SK¿•›ð3œ¶çu¡¿èдO—øçš·Ú@œE?¢g‹Ì|8a,@ÿ•2âY`8ÔÕôkc((Bˆü*Bˆì&B kf§†6÷4ßÖcÛÓLý±n.<=ò¶OýD§‚9S¥qúrð.¥72¢Hã¬x!Û@LNâ4'ñi'>Œv &CJÿMß•çãž&Añ:…¹e5äkú%¶¾¦·ý9µx5 ù  ±rdó²?gèA_õg½éÏ9‚Î/èl–åF…0¯[epä±È^. \ô 긣B3µÑ½¯é{)ÁjGöçSsL”>•3E, 7¦| ™ÚÄ"¥ŒMbøWË ¾¨a”/g´8ö&‰êÀa”ˆuæËã 4Eüí!4=ÖÖù`¢œž!ea‡_¶žÄȰÄâøÜ£]@ô²QËn¸L%ø\{Iû¾ìy94XübDƇP¶ún¾4ÕTž1AùøÓèï:÷ƒ‹Îi«Â÷Âò24÷ÝJUê,*i¯b#.8¥à°ÈÁ¨ãÀEPP>–áTœÈ%D¼®€$ª3_î*€Ö´æ»›ÜŠKw™jN6|”ÏR»•†LŠXi?¤[˜%TÖTÚ”Ù”Í)hܨßÙ d…§¡'óÅccYWŠK/X `@PÂõȦ ¬¯]ˆÃ"p–Ó‚ •©p)ëÛš‘†XìG4Š4‰~ì ˆ/o.ß1? ðÁKuëìL|ºYNÈ|®4éË€²ãÅx† Œoó´p\ë8( díä áŠ8qx®/§£…(ÌZ,ˆ¦c{Ä1§f,[ú9Ó­ò5T ŽæR.§;èù:Ë£ ª2zgS°ÎI´4 Õ}( èt¹ƒpDöJÞªåØd¹^aõßoe¤˜?úæj¦Ü»w§Þq\Ižb]ê `r÷õõ]Ý^FÔ|»ÉöÝ'¯ƒæð¤èn$¦-a Š÷ø7 ‹l\„Ç|ÀLl¸• lÎæa¶yZ£LaÄÚ£p“Ë/$Á$!œ‚‡¸;öž‘XLNf½ÏA”㩟ëe Xòª¾Å••ï6<‹R¢}öô㉠??ö šŒ›ÍàóÍÖÒZÅ{=æl©Ì×&+/uxfCû¹^»‰„ÐÚ•'{ c¨YÑ “j”óÖº$~ë{TškE hMëHs¬LœÞR&‚ÝDA»ÁVè°j†±@$)™(;;°0æHŒüÃÝ–p)ÜviNø)/X<7gjÔ¬‹¢åˆuÈ&œÖC€Ê#žI¤† šñÊûlݲ|.ïY¥yÔ{×™\Û›¼±7˜Ä¬QÑ!ü(¬X¾2â €à¹0fŽœ¨®Ž+=’\t°?QHb‹ÅuªÍ¤Ò»ˆÀB¾Û0ÇCÙa¼ùŠüRkýzù-à¶'u@I?W ˜¹’Ÿ6¹kA¥ÀòC8n8.ŸÃȪÚ/•áÄ^šï`ë1]²Eã{c¹­3f£¥^ûc]sPŒ^Ê«ðÀÖ,×þªà ˆâõ‚_Àßs[–W|dê¶W)ç^¥œ ×ÅK»£ªí)m»?ã&Ìö­  ÷4+þ§ûUQÑCBøáiæÇµ-±ÄïF_dIëR”:¼$Ñ«ëV,Ö0˜¬È®°^}JOŸÂÁyú‘ë.‡Ù¥ØÉ\±“ΪÅ#^¸—©‚4y*»Æ6wðÓ>¤N!r;‰iÛ%m[AÊÔédÙ4ÐG(á<ŽHŸ?õ 4^v*¦Ä.À‹žnƒzý\[³šñ4]¸ÌBiÞ—Ís¿Ùb,[Úw±7¤Ñ qy¿ 6díÛQ½ =,-k*¹ÿÊf½>WòCL¬ÝUŸL–žü_BûõÒ›Î~ç~G¿ðï±÷ð*ôSÄ™Õ?¾ÝÛLö[ÅvŒ‚]%dÃ1fÛd?àm0*»àûŽåܦÚœ±Ô¯”ãkú~äƒ/ ýÇq$Ã¥…ÏRý~ÈžC¥ly üÿ±ôæ>ÌŒDOÿØQ¯Ò˜Oä(}…ÆÌ·r´YuM[VÝpd my÷šáƒ,=‹Úö°mRmøwúµ°(®ý{#®”|Ò{6ˆSœ4OSœºª~„6¶©)Mœ«å|g¥$ë£bÕºNÝÙã·mÿåkÛ©" ‹6NœýhŠ%`ø:»~9 ]¤„¢ $™jºéÊÄþóOÿư,t endstream endobj 197 0 obj <> stream xÚíZKoÜ6¾÷WìQ XŒø”T£‡ÄhZ´¨º=È+Ú•½’6zA‹þ÷9Ôséõ¦HÓCƒ–Dr†ÃápwónC7ü£›˜Áÿh³/7on7¯ÞŠ H¥›Ûû •$›Ð4¨Ímþkðm¹eqp· áoÝdÛG,ø>ë~ÿ±©Ìª¼ÆžV?fØÚ—îåPT}ö Kql`(K‚½Îû&;\™Ö$8fþ®ÏïzÝàhýáØè¶gàAQåúCV©:ƒÌT¿Ý~b;é9‘ÒJŸëvß@;LÐ ;<ÔÍŽKÙ•Å>Ã6ý®/Þo¥€N ¼Ë›‰(8Zak»þܶ™E6H•gyF¶¡ ÌèÉ6ÁBºbß²VÆd¸ .”„O'Ñ|åfuÑ|ak-ð(Èö…U9g+¡›Â5[¹9§Áû¢í\Û¾.kllõC¯¿¶S½z›ÌmB1Â8Ì™ØÙÝn%QÐbºvt”Í¥"Ķòº~9ëV$N\7ó‘çnÀkŸ\” ô÷™Ñ¬³•!çÊ:#.÷‹» | „ð¸ ip T<ù˜)òAºÝÖ³ú˜°øÒÕ¿ñ­ž!|ËO#Â.\ý3›uðn–|IZ×ã–¦a_½Mg£ÌÎÉÅÎeÓÁás_Å(‘ƒ ¯qíŒS¢˜5Ux˜Žº2§VÔ->Íy«òb¯[ßBâ„H±2Úù¤œÄÊu_ùèBãÑFNÉ%Ñ—‘?yȉ.%?xÈÂòÁ¥ ÁÁT­Þ÷ó€¥ýŠéͺ¦¸ëÖòA…¾Hã=Ž*C¤€¨x6྆Î|Õ›g^凔)s,¬+gåÕ‚Œ1ìú㘅`'•ϼÀ‚{œ›Tpë¥m±¯½SÁHÄW¾f©9šœS¼"‰\Ö%yÂ.$¿ñ’ËiöKˆžã.G ¶yþà€o¾RT#ŒÙ"™“ÛoÈNÅc‹®òlP:£Õ|°nz*÷4ݱu§”%D%ós¾ óŒMNa€ƒ&'*ƒÜ¢u—§Á[›™àýA—ÇCm”Ä$D4ž¹Ç|Qð}_·Ãˆ¢<6EY4øemž.!¨Ý"û¬ë³ÂuæÃ¨ÉŸØi…[å2\—‹õÙh;†å1Ó1³e4^Úª/I1§ ?µ@]û9…q |Ü`+R¶rX >`ùrɇ¾ÄÇS©‘oYÔ¬ |· SÀBvðñãàÌä¥ ‡üPpÂèbc¾¨î†w§ª_TwÃýÿÆêÞ‚ÎÀë÷FwIüåÄþ§º»óÄ|(éá=žk¨R bñ5{ø’5È™˜ø[“~¢­áŸÉ#ôÆ#Dðò¯8Ó/ªûgº2j–XÁæBˆWýŒäR.‘r)!¶åÙиÎÇÖù&l–é˜TÙ„‘‹AµË‡›Ev $Emy6¦póL=MmþËÁÝoûòÏbJª@óŒƒ×WøÜWO»í²óë<à›Upó~-®€êêð›×@`jd3;jd˜0"Š¢£·,! ÌÍ nekd³ÔÁJÝ5ëK3¶J 6æTœmQW¦L0”u?Âc#·åŽrËÛ¾¬‘’wi“w Äý¡3{ 9_"%XÜÄ®¸a¶ÜñéEJŸ@½b]ì-ÈI’ž….&ò×øÃžy…§#u8?»E6yðƒn …º:kMmÅ”@XS-j*3b°ƒ8p m]fÝŽ+ÞHÊŒCýÕ”N϶¾©ÔTyáçjólÛ°E'8©tËÀd ç¦bN®©ø (0Öa¦{<®ÉhЇÐ)ŒÓ6ü~q£hbªõD‚DÒ>¨ZXãã 6í;á0SüëëA 1v'£ÉØäD vü¹ íÑ4–n6΋½Ù’æ åŸ+Ý*oŒ#!™9æ3e;'È!GB ^ŒjÓxîy*gNÐeЖ;ŠÎ"l@S»¶LGÒÁ1›±mv¥ÛR/8¹ax;÷k¹ÉšN·EfÑ< GÜ+ËlO!¯ põ£X`vr'¼öÜ:ÀÛTFÑs7éúžD.sH&?‚‡×;“u滚C™ó½÷jÉÜH½`¯òÚ+laøõÎ ç/åÒ /z¦0Å—ŒHúç¹FK.”B—ŒÖJœóbÑt}ré-—ôÃôÞ+¶É ¼Ñ„‹Ô ø!È*´®¸Æ:ƒ:ç`Jç Zì¼3´ºú¤„sý1%ÎtQœ /AdÚq07Ö2]9¶ƒ¿â&¥Îû?ŠgJ%Dñy•ñ'–4j¬^ \ñ…ÔBw‰dw• :ÏîñØdÈÿä/&”Ÿ¿Ç£’û’tx‹Ä:K_^ä%üL–›l»Ç__ÀwÔÓè{Ýèj_@ko& ìwÛÝ ©´µžB‚îR«ºÔîâÄôÓ“Áìí›Mf¶/Ú¬t"€õ`ZÁ˜9š3?\Âð]ÄÅÞ†9È··§¿D1—DpœB%0ActúÓWƪZõ endstream endobj 200 0 obj <> stream xÚÅZmoÜ6þ~¿b¿U¼ŠÄ7IÉõ'× ð·º@åíÊ^I[i·(Pô¿ß g¨•´\gë¶80)r8çO¼úy•®øIW™€ÉjÓ¬Þß®Þ|T«4‰‹¤XÝ>¬RjµÆ³º­¾>Öm¹ml{%²ho¯¯ÖZÈh°OåÕZå:âÆþºëí0ÜI%;©ÛÊþZÂ2ËpHEUç‰m³ÛòÇa(+ÇÄD›®áAnª®¹“Z·uGžÁp¸wãU½±4Ò–W?Ü~¹Y|kíįìf[ö%–±pR¦0Š­ˆ }w÷p.=Ù}GDF(ÈásËj]Õ ¡î@-×D´s4]O_|ºëù»²‡ýEc÷=sr=àÓ¾ÞtoÝÞ|L‹ém«bµ  Ï|J`©Sí~«±“ª©½¹¦‰»èéúùîj>ùþšÚ-Ñøá¿ó¾S# t˜ î_­S£©1ЄÄT±2Lþ.ÀΛÇyç€ë‘Žì¿v@³`L›rpÚΚpdv]BE¨#šy´}ÙS·h²± jò¾§é¬Û©Ê™×Vã¦U¹\ÏËà63à>j"`¡º¾)ýéÅätJ¤q*ùø;O!'/‘æ¿qqâ××ïHÏO EÄýg€>ðþHË”9ü¸€Étk¥Š8Ñà)y¬éF>÷4Ònо+þ.ÙùûT€‘ çH anûxh¤Ë¢Ñ'ZçüÚÁÿ 5ò<rtéK™DÜw8ãÛ|Sì¡àBáf=uÆd´£C©„Ê~WºQ°Œ/¯ Yà7¬•[¤¹ÆOµl“HX’×Û–8˜ÉéÁUTª¼‰ã›8òè˜ü—+ ¦µízË@ç°ÝÏÏœÌCÙ°§Íò3‡C5 }X²ŸÊ†F;jv%iÌn=1µx‡ç¼©Éÿï|ä½Eu¯m_^=*;)&®®dmtœzÑ@£Á¼ Ÿ8§÷ÆCì,n9M–± ‹TÑ ‘ƒ¯oúzš*a|¹ëQÞ} ˆ‹ -(ªâÍM}pfYd~,«·P1ZèÔøò™í©ØàšÅ:ëX›'‘óR}azvùYÎÓ"´zc¼ É•Æ~=»6)Á€ô,µœW†Å½‹‚µA,¼I@FO}1ƒü&½tàŒ§§Ïb‘]zú÷¡Ó‹£ï؃â¸þ)$a§þ¸_Hc¾x}éxÀ$I‚J€žg‘μÁTöÔ…WxÆâ¶A‘õçTÎóÂO‹€¸o>NšŸž™ß¤DÐr6«¶!ì*ªæÀßèÙv3@%ƒ%ª“à…ˆ_–ÑgBùNYsȤB”{»)[÷¨˜¼±U= Ý‚ C`2§zd*ÏÏê6éaÙ†™èŸcêŽîíhy“)Ô{DýÄkü]ƒf1k÷¥‡«^Ä¡Nîù C`™+9.‚Àž.ÀÞ2úüç×Ôjjʶ¢égžþµ_}[ö_¡³"ÁÚz"$GM“¸¨i–G&=B±LGÅÁFÊlú¬yÄ{çˆ~â 'è¡M92oSÄ.\5É)Ö„Ì—XîCbŸØÚ_3)环‚™ÆA=ˆþYôã™S޵‘{ºçä^"„ãÃÓ+s–@Cú¿H‡Û„ <’@¹?E»fàXžÅ™žfÞ?Ž}s{úWBä1ÖFQØ“~÷ÿ&‡HÜ endstream endobj 203 0 obj <> stream xÚ½ËrÛHî¾_¡›¨³Ã~ñáÙKf+®Jn[ñž¢hŠöÐ%‰®ì¸üï 4º)’iE’gf+®°Õ â 4.¾-ø"‚|‘ø‹ÅnñÛíâÝZðˆeQ¶¸½‡ãÄ‹ÛÍ—à}ÛV»«U(E´%=sz”ߟš²m×RÉwtPí7å÷|¿‚ûºmí²oó}µ¨w5­ú]N§slq°)ðþ±¤IÐY:OMµ@ÞT¹a- ìôëí'#‹dZY¿írB…Èe2\ ƒmùÐWæÚ yw£GêÉ$ãr Î2B{o`÷¥™Š:ž¯å ÄK,À¯>Š¥Êžsßë#¿®BÇÁ§U˜qöægVò`•€Ö‘]¯|xú_ú”`qv&†3%»‡Ì‚ò,»Ícò%ú”|êÏÊw®áÄy⽿kÐÝ~*—`™:ßnÑ5ùÁõä——e1RÊ›…vÔ塵Ï[{ç­ÅkJ>—ZûùpB×.”Ç™.”Z³ b9Fí"ÔgH Jg˜ ð)iSùÆQ°·Ù ÖRsÚ-Û§Uö+‹jI5Ï tšÚðdH””ˆ(oÛ~W†­ýÙcÒU™¾õv§)‹ò¥ÁˆGÀõ¼Ò:È·ucÌÆr’ràsÙ¬tlòMYÁеG/*eÊé™ó·tOp¾à`Ъ½(*И)°d”eÁ'n¬!^9èÃÖæs45%iH¾¸eYdLJƒù?»Ü#ØŒ;—D£T£û$3ôàY¬( iúéE1Óƒ÷«JP²½˜RÐûCc—O¹[ù¶è·yã`íî즟ؖ»’.¤¼±wUÅJf–ÙHQoK`=!ö‘Ƀb=¶äñq°Çàä{|1¾NÇa×?mó‰ƒ]ê½ÑÞ|-íÀµüd<¬Þ—Ö9íÉ&o½´cÁäeÄ ß`'XëmÉP¡W¶t/›~‡öh í®åJäî΄ø™Ü"³zK$ËRx¦L“½'Ï+ŒÔV>»* ²…xm´ã^ƒÚÁoÿxÀã@·UW6yÕv?F˜RLH bS_Y™æaŒÄÚÊÒàðf¨7€:Š<€ëHDySuFÇ]UÔ°Á‡·rzm–º€â$uÁñðGp볓:lÊKÂ!$P;,æR®]ÂçÃÔ'¾0ÕtÂM•©ºª÷ù–@ëÞ=»æ(¾¢l S•"RëûÍCàƒ–„‹‰ÒúÚ»›tV7>÷á{¹{ÚÖCÔd3À„éÔ¾¬.äÕ2Ïóåz… aÖAõ ¿ZÞÝݹ=ðóà1„½¢(`ïÕkBr–×åÜ· z\¸;g<“;Ãâ‰ÿñ-Ôfž|6±Ï_*óñþõ-T/&ÇëBNj¿û/©Z¼…²7žÎfã¥# ó0,[·ƒá;p†G@5ø|=»ÃÄBÅ|†ƒÌò!dâIlŸÍz[võýK5åî£eþqºýé•\\yÀ‹äÃ|žjÑò&‡œoøêÞ²FœýsÂo÷{éÔü¥ºzüJër‹å®nlSÝßOÀþR‰F)í ©”¥žÃ#b¯ßÃËÖ¥a[FµÎ!/Úê¦úã {è5¶™&ËÅ6ŽjB¬‹Z̵ éµ9Š‚d(z(÷£:wœœt¿© Á¦§3nò>ÂÞ// N;£ë¿=rO ‚-kLE ƒm×ôÀ¶Þ¸š§osè®1Û¸"‹ Ø-ð=ÓK¸ÊÌ¥îyÚáÁe7ÑPÇÏî#%¥ÖÞÿà=¿òK‡"Òõ‘öЦn[ÞÖ¢Y†u9]ÛL›9ƘŒðe™/íµ¸¼[Ú´²,–¯ó˜|YnÀr¼_¾Z¦œì"ZpÞh'{´pM ƒ»€s¡‚Ú´B¢È ‰.Пt/šéÄv/¾æÚyp6.®; µ$·ÔRì]ŽPŠ"&ĤoÑ8e3¥Û5mjz>%ƒ5-wÔt¸°nÍiEè͈„wîëf7„‰ÌXOn;KCôÝ¡’wS6œ¶×¾ä–)š³)f %ƒ»ÖmhŽÔ"aYB§63™6e“B"È•ö1ŒVNçQSñÐq‡<Öôˆ‡øžà÷|ÇXŽg,ÇÇ8Þù($ØC TM„i„VÅÜ’%®xõ¶…œ‰ä|³xíbhœR™¾LeÉ •é‹]é ÔÑ(j:rSÕcúö+PD˜½Ïv¹ÿ›/õ¹Óa2Q <¡@5U ''B²ÈÞ*ÒOì€ÙÅát=a*›O¼/N³¯—Çk n¾‚ŒÌñê¯Æ‚Ám×]Ì œ™9ù®M~qô©©ÕX‡¶8šêÊüòjêŸD\jb5M˜Ù‰{$ÆpqVT?‰éƒñLÖ£BÊ‹í> °x¢æq—0­²ÓÀUµþIVé§Gy2¢öf(fq>/ ËñA˪±¿L!BKª‡pvG£%‘R½žèYçßq‹øª¥_šºxòaiaó°…Ç)f‹F§ýÎ÷ÇÚ;_mp–/SSU)™A5»¿çøÿóÊ(ì™Ä âœ@ìdžfWu•ùÒ <Ÿ ‚5cB™Í*>$ø¼Ò Å?*ûÓ|õ„¹„ò+I­Ë¼Pqýê÷‹!~ñÃElKH$>|5±Ì§®œÄ §Íég†I{*Rœ•…±¢:PHúïü¼¤’Î endstream endobj 208 0 obj <> stream xÚíYÝoÛ6ß_áG‹9ñC¤Ô­¶¢°—bkžV÷A±™L­e%’5lûëwlj’©ÄÁ: †DïŽ÷ñ»#½zXÑU t¥ü§«]½úþzõÕbESR¤Åêú¦7ø!W×ûwÉ[½ÞÉ“Ò>:}×÷îã¶ikó*’-Ϩ#Ü7§r_^ÁW!“Æîšã‡þ¸f29™–´ºë§ÆTrÒUWuþk¯×ï¯Ý( ”ãL®@GTîè(Bí%É27½9õ÷‡²³ì´Õ׺í&c§V[`ùm8n ¬À‘rÚ!ÝoåšåÉïøª;Ø/TÒAÍ Ï3à\ÆôÍs¢øsÔEn"¹/ÛSµëek¹¦Á¯cÓùáú~½a¨‡¶æÕe°kZ0±ŸÜÏfCc4“14†1B‘–‡6•ÀËÌy¬Ó« š\¯s†~†acXΩ·äÌ4¥DÏô²ÛkkõÚ~ž4Z…©ø]ë®nìˆÑn˃­5~±}:[åÎVfÄ(ñúÚ&䥤Àýš,PŒ0»wNaë ¥L$¯l,óbõS"9n¹àͦ;ÿa z¾5š‘B¬6,#™ 5.íCÿqþê #áNo6ËÜÉ}[Õ@HÛÊ-¶Ù‡‹úziÑLG·0yèµgml':oât³¯j Á×ËÃv}eƒÃíf ŽÆÛØŠUƒØyžã˜W—9ucëôA×ÎM&LPuqà®r0N„Bs³ÞdYòAŸš©!FÎcfä>3PµÇC pœb/ÇÂ…A^ß¡JÅ™ó ë|‘ž©_„ÎG ‚t.,ÀivQ«ouëÆJ;d ]Døy}³“I2XQzžw}x¯p¨?aöÓ9RTð«|áŒP„FÈ)á“à96õ€õ!%ØI‡ïb€’éç+?/VŠÊ” ¢$ˆA¤ 1Ñy ¹Š )“ É!lAˆ8"¦2<ðªR™Ù‡LHŒDx•.UY.™å“† Ìò>¢1d%)I–’”[ 8%{æÅ‚zÐ=2cI}M÷à@}J›5”ª£ëÆÔš-—üPí<È»t¿ ÿ£m…r'Ù³cI3w|öux÷eNƒ™»ôµ'D}ÑMµù¹Bäö>ùìÆZ³%DÌNlU>(bб#³Wù05áαC¨@Ê;Da±c隦ÛÁáÒŒ?kn¶þG£ ˜çèšÀ·´VVsçûCê/?º—öîü§Tš)ü!u#SaÝÃG¸6¶LAËÌ&ˮޣ‰ïðár%ìð>äF‹'u`ˆ«SÕ§wSâe#…—S@úóæƒy‚ endstream endobj 211 0 obj <> stream xÚÍYKo举çWôQ ¸ñMíÞl¹$‹8@‚Lš–ìÕ¢©Û0æ×§¤$ªÙ¶çØ€Ôd‘¬÷W,m¾mĦ‚?±qþ«Íþ¸ùÓãæW!ÊÚ˜ÍãÌïDUÖvóØþ§P¥.ív'„ÔÅ/o/C7Ž_”5ÛE7ÂÙ¢¿tCÓ6ãö¿…Íô—W5î%LYëÍNšÒ8ÚïŸÇ&Õ 2˜÷FŠNÙšª “´:ÃRm‡OSìqê|úýzº„<}«ë8È1 EimØú‹2b»“µ/®À½tQ&: Gð$|îé”­tÅ…f\ñ2ôG Cß<ÀÙ•)¾]ñ <|qÇkÏaû±{¾ö¼IGÜí„•‚J„*QÝÀÕÓy@nht ´xÊ¥ß7?‰DˆdÊÊ.w»Ëù)£V%J/µŠI­»þÔvoÍéÒñÑ=¾nŸIùÍ©=g´¹ΖÞÁ³.+Aûža›œE->oÑÅÑ·GÔ>1–›“±ð%5––¶;±‚Á(Z{6 OÒø€æsE{ýλÀÆæÔö{t_$ëxìÈá¸ð ÷†3ûvÑA~>›d©NqOF–µHÄU°äÒL^§À¯IzO¥Ç¢»qéÞÂôç+OŽý§¿’ð³ê0‘€Öú×¾½6ôcƒ²Ö|Ðúñ¦Ø[2€ñîÞqÄïX ^“,+¾0M¨ŠS2ÏØ溗†s 9e«½¢å†çë¡aâà¹ûnØÇ%0¬&a;X%ƒ‡ŒÝXÏ!/ Yþ²QúŠÑä:<d:“1{À,gxYe¹1 mzåÉ;&á&‘¶ŽŒ¬²l^ä#È ³T#Ø+¦39# ×eˆÝåúrhƇ¨l’ gÚœüØŸÑ#0'A ëb"2Ë<äeé $wYjNî1 ¹tòR›àãoq^-¾”.Ìÿ„ŠÍ¹}àMº>Îë+kG©®t˜Kˋܺtpp$ùPÍZÚó‘8îÁV;#$Û&ÒôD¤Y/º.md$§+‹gótHR¼]7¾Jº}ÿ¥RzO ':Âj¤Kµãlª å3‰›Â/pRMNM[J¹ÔÀÔc€fí´þ¸Á/5ãäÎ3?ÒÃ1ñ˹€_ð@_©üAUÍ¥JjA5|°Ð1çì²´‹zo®ÝðˆÛ²GãùªÁÐû(Õ A¦’õd¥Ë*)Æ&x X—͘û¾|5Þ`}ˆøxj'‹ý8ŠÖ”s ªòù<Žº”z²s²´8‹ÉJ}ŒŽê³èøv›«RûÅ9Çœ(@\Ïç@’i úý=èw³ò߃‚“n’'2H~ûÕÇØ¯þ¯±_Uo÷ŸÁ~SÊú]¯R½¯ x¡Šfó#lÑl)öÞùÇ<†O$S¥ît’õa@-g$s'Bb\9eMÍÍl$ùvÌ £ìl¹Ï»±¾ëŤεïÕùNE£î¢´Çɉ¢Ë‡·—ï€U¬«ܱoÒY£gV豌C;åUé—×™±>-ªBã ÿ¡?Œ¿<æ[[ K"?õ¶Ü½-€òþ|júú[þ½þ–›ÛßÒžÁ^{µêoáÌ›[‡¶.•Ikp®òÚ‰›ÚHðiðŒ€jCùV-{\Lj&±0UÏM€[0L%ÓvÔ¢éEWÿ©Å%?Ùâò¦L*Òþ)_U–1ž¾æ¶ñsúºüÖî„„ˆ ù_YV€‡©‡v»6ùwöºåt)ëîZÕZ 4ütÚƒ¢0vlܺ?¤}qÀ:ꔜ¿aóZ¿’]§¢OóY~!ÈwĆ@ŸŠú™-—ë#Ñ8¼:í¼Rƒ*x!εÝ+N`¶à%TÈ÷Ãíʸiû®+— Jð¶?v§ñ½òúo@XW3fðϹú ®cmÃÏ•5j±H%h»PúŸÚ¸8.ÏñuØSdöœ,Ì?YM°•›<ÖÜ4…â•îNÀøëÐìö[`ã7þ‰¯].¬ÃÖo•Æcbo™• J¾mãµD‰ŠïiJàhßqßñÀ™ f‰o³§€‚EFGzí({¶MÛõÔ[Í5V5DJ Zô ¡ã9iÆSU}kD  Ño7ìÑO2ˆ¸12Œ 8-*“UZÄý-}P¶&°© |ÁžMF ‰)Ó/RÚRv¹ˆ:°‚1ªøs3žùÄ©ÉÍ9žÂËágŠ„¯•X0²ô3[OVôEXÈÞ³¢Ä6C¼">5‡1g8)æJ?ð6s>ßýHÖiµÔð)ÕdJ@žp'[´¤(öCXÉ „LÔ'eÃaÁ#«Øq³áîÄŽôPjd`ä¾áÞ«aŒ°¥™¿Ïùj˜—fO]\úïŸýN÷ëµ9€@IN¯•ã4×+øLã iC@Þ©FÞHÆ^=ÿX´êiáºUà5E.R“9ðËt|^Îé9ÞÉn±Ìh°Æ8âIž]ÂÇ/*™>uÔÕªÓ€‹…D•®ø;NO<{æ9ów næVQN°qî! Ç+ó«–2QÕ¦äµq¡Ñ€“¸!>‘×Ãs÷uhˆÄ£z›@2܉=µÇiZç¡›´ Òïd/üu¢¦P|»b5ÌkÂsÝÅZ\pÅ Û7R‘Ztl½uûël,ú µVt¥(C!èîÈ#9wѲ")`zUôâÈìn¸ÓÍzõ3Ð8¤lѳ`>f—@Îåq% %’-3¸ýpƒc¨^Æ'r BMKՆПYOþ*Â)uÓ%FŽ~\CÑσàtÑ·³ú}XC K¡SØS±–J„\çM1Çøç?ÇÅD—¦C—ªÕ|³’&’þú‡ÿ|„H endstream endobj 216 0 obj <> stream xÚµYYoÜ6~ï¯Ð£ð²]9CøœA)F’¤tužgšý† rìšmR{E­Ç7sä¾Á'ÞÈBB¦ ’Ãoíé“ù&¿çÈâ)m±ì"¢2«ÿréÓ,éÓiù9¢|±¿˜o_< ¾Xh¿Ø^-¥ŸÑC,RˆË‹<¯9!Ô}^‰‘¸3ÚºÞ½1E`ÄÔ#cÊf“*…Z6nr‰ÆÛ®5æ35¾ël¾yÝCjƒƒFóªRQSZð6°Oÿ䎴©çˆ? ŒécÏŸ¹CQiÁ)¥nY{€”” ¨““ó:•«!E×´iSaØÑ=Œ·¶u½T^tkê@²ÌÂJ†,ìÖü½¢…O±ÀªÖÌø¡éüg¤,€ÒİÙëCÜS{65Ä=ê7ƒØˆ6 ãV‡rd q¼bâ;ÁvÞºå`]2±îf…qÌØ¥M“–öÈèò ‡ŽiÛ]ßø÷}ÕÿV²~2f¾dÔVÎ [“ Öap*„þ¨·ý±êêžÒE0MW‡4rWu•÷ó0P7nŽa,–9Õ¶íêp¶í> úïw Õ}è›HcMbçG‘}ì˜ØÑ®Ûä[õû°qUƒ|¸¹×Ïa)%@(x^í,ŒöðèwÇHìÇœ~”άue‡¸÷L»`wŽgó¨Õ‰âS˜-‡¥K31ÊrKꙵ~M¥ŸQŒên¾:¡‰ª²=.ŠajrF÷'ë@{hßÙÚ–ÇÉêªùðœªå—Ž€:úÊ'öiä^ÝIp N8V&]ÔQ$ËE~ä³ì,bÈ\û»]eÂF¡@`3w®‚¸fhDžR¡KKè¬X›û‰µ`1XPHçÏðØk³¯Îz¢œ+ê&œ)àen€À2D"Gi&ÆÀ¨\wSq÷É®V#ã*2 ì²WÙKo )~‘Jp$ilã«€øÚLd™èsOdÕvšö®=é\†^*Bb”À™DJ† ™f,ÞDTÑá¡…+c‹B‚³ŒÆ"h-O+„ù'0Û8àÍŒ=6жYtÞ:kÃ,Û%*/AH>!×ê„äAhQò15ÝÑ¥ºxêúµ0ÅU×}£Ûl[#Ç8“6mÚ PRÇË Aø&ÕW—ˆÄrÿ*ÅšÅÈ¡TØ!ˆÊ±_[¬Š|ì Gd©´‡ —B‹¢b í‹úz"DŠDƒ´D¤œ7 ¤·ˆt$q`"Ø“èöKªË ½VJ'!Ò]î*QÂÇ BϨtq¬8QéxçóCHµ'—8iýâÀô2ðS}xrÿ4cAm-ñ8ó[¬Yï¬Æþ2ºæc=GØÅù|ÄHS7[@°ÚÃÎ/ÂÕGJKðœá~ Á‡‚sx¤ò”ã;4àä¢óBŽzgôö –PÅXwþ”† ×À0îoø]Á% 2«¥ì·¯k îØÙ´öA]™ÝúÓÜÂqÁŒo]ßd‡ É oP[Ù'b]Û5mõj,ìDC+hwR©¸lä:Ó"·ÿ(°Ÿ¯ú·Ëë/(½üÿV~ÿ)¼t·§å!Ê^K®y!¡¡&(d ÇÃ’§(¹t×}ʫЯƒä¶9T—ÈQºX>åFäÃ2(eo¡¦T±/ÅþÜýJ[Ë® î]‡qé˯þIŒ– endstream endobj 219 0 obj <> stream xÚíZ[oÛ6~߯p_y‹9ñ.uM€vÈ€(º¡)Ð!éƒj3©ÛJ%;K;ì¿ïðf]LÙqÒ¤P4eòèÜùCªƒ<ˆáHñ`<¼8üô+ÆÌebprë#£ž'§E|?Ó4:º¹*UUQ3Gª‚Aˆh 3ô"gÕðÝÉ10cýzœj^˜£” F$E”~of™#KdD $ÁšBœ!##‹Ñb8b˜X)z$ 9޲€0™"‚—3Ê1è—Òh áG¥º(Í#‹®2ÿ4Φãå4+-Érfg¯‡œEÙ´(- oba©òù$¿Î'Ëlº¯•‹£KåøG$‰€ŒÈh¢,u¥Ê€Å”HÄ¥SöZ•#C3b,ECÀïܬM²‰ÊCŠ€É4A1w\Še@ öbγibB0≣AVž )@q·ç`Œä&8u`ôÌ*üú§ˆ®Ê|«¸Ì3»¾æi]b¨ml|E4 ˙Žc ÜÁÓ4áþP¤TÓlœsšXæÆ—„µO;/C27­ $ʪÌ&™]¿šÉb¹(ÝT—i3ÀÑX•cÇ€DÊØ²(•]ƒä«ˆT•ª‹IÒˆIÜtþÑš]M ¿ÁpÚ!”:~š0ÿ‡âË(Š}€ÏÖƒ*¢áë³aHÐȱiø1;Í÷/ß G‹è™d©t êàÝZxu Öî_ްWàÐj°÷2+÷ìã÷vå“ÊÊGRêL‡`ï8›ïÁ;Fú¼XXmò¹³ó㲨*;süHÚ½¶’—sxÍJ>±Ã_ùâƒUODÏOów^á…Þ¨úñÅ)Äùq”1\Á3Ë*³ZÂúDAdgù<›nµ°t¼‹RUmœ/vDí£×iu°›HŒXjèPˆVÎÈNΗ3rSÎ:0ÍN&í_ÚÙ„^­âvy:Ñ k%j‹×²X¢I~~n'Þ´l‡†c”jqÆv žp¾%ôkn4¡Àχ4nT©Mí&÷ñ•æÀ[ýÖ­Bµœ.2Wíœ)Öx­±Àí·RQg"N]û§½c›Nì¼ÖØà`cƒûj ML Áu›¨û@ßâ`GÈÄ|ìxWÊ5—œèµFÈ »Ûšî÷ç±æÁ»ÍƒtžÐ/æçÊà¨y¹ñ³* ‰ÂxôKVV€ÁÝ-Y;!nåAE=s¦]Ëì­ÙãýD¢ïÜ<÷¦;ÄR®²¸lue“¼F™f/›oÉrËïH[b½Ì~/‹ ûKÝäÕB¹%j0Vêb™ûÖSO9œKš]CE±ÏrXjwô3Ï·´€©AcùEµ^XÂh]ÃþS__ɺáu¿{ªÂ)Jü‘èYˆ œýŽúòn |D¯‡¦äg1e6Yb¿:\yŒb„½ÑVä&2qBFD¤Þ`«öA'°ú¬ÖŸ!Âï©¿%àa¯Å„5ƒ­@ZšA¢€=b£î2Ž$[A^àuí˜Ö+þn>IùE|ŽiØîƒóøá7ÍøÃýU‘áð¾Èpx—Ýb›°[n“'wËGú9#B»(~ð-u‹;þü*[ˆÕŠíhÕ9ÅB£"XûhT$/l Q*m6 <4ôj Å„@y’ý`ήd@«ˆ¡é3ƒˆPˆxœÉM)Î×+hjÌÏC ƒ‰> év2Âæ›âÏâZÍñ§=ñ†iCvL›@ÅŠägëò§AúÁ­­{“Æ:wÒnx›î\Og‰ˆÜ–θåeð(± š£l$)GŒlˆ¤¹-ÿ2 È“ž\2Gå ¹DÀäÅñ LL\.’ž\d ‰dÇ\LùøŠ„Ø ö‘èÛ‹)’›ê:ìU‰¿Áú­a]Ü×ßÓ–ý›îËFÓ%bl¢ŠÅì^ˆú6`7&(%õ ‡lëIé$¥zΘÎngúª¦õû€›¨~‘º¶U'ýj4?h„Ô¼.~ qûP´UÓWcœÌ¥”ý/Å|Ô‡p”âÎþe-g’o1Ø:ʱÖögXf«ËaHŽ.üš!(: ¹±Þцüyè7äo¶1t€LõùؼÍU¡WP@;WíUó{>Žª|¦/ŽßÃ+úê^ЩýŒÊ‚” *;¹Äz=üd Ø4ø÷[–¬,›¨ÕW­Ë¥½Î-Ú·Ï­‚D}c:Ì^›éIÿøî_Y;°š endstream endobj 222 0 obj <> stream xÚíYKã8¾ï¯ÈÞ ¢µeK²{n ôØy5§ÉÔ±ªÆØ®¶“ÞFÿú%EÊDIWoϋŠ pô")ò#EQ››l“Â_¶1þÓÍ¡Ýüýqó·›,UZmŸ6™U±Ùa‡Þ<Ö¿$™ØîŠB&ßÛq»Ëó,é_¶;Y&n°û¼0û\+h›ÄÛ_ÿ Ô²jA®,´SO©éxÆŠ_&dÉb´Ð9wýi»S™ŽSÊ( žé¢²ÌãR©PWO›í¶°µ}ndëîª~erèÛ¿ó¾s0M''ç5”‚œ#MyšÖ5C¥¹®Sj÷Y8š1ºÁ˵Ë@q…‚o.”"í=Ÿí‘fY^ Ä»ŒÉzÝó¹«ûSá©—¸]¤-ÑÆYJ6–yI‹Ì…Ë[6ÎD°à¿›Óoqã䢔÷̬æñÉÌ7©©ÑyÇÔ…,˜ú&•BŠ4P±-ZáìR'ýR sÉܹtâZl¢ÉškéÓº±µù¾ÇíHc’gÿcaDvŒÍ„p h:?’Õýk )ôhˆ@‚Íšé=õƒ6tÝ'Xúì·D¢)“öb r†L!*¹TWϹE @•âçËà.„Ù™¶€ž `ÃxÛ•Øo=··t¼ÁI§L…Ÿ@uÀ]#Œ=È!òí.Ëûo?ßq¤`´}4k5'ôE;Æ/r ©Ð(HïgPÒµa¥2ÀÖºçD Qvì~n~KÝÈz[T °…!€1AîsËçƒ šÏXØùx"`ÚéH[0x4³¿Àã€tO>Î!ľ‰ìv! „XálÒÀ'áù3-ºª«›:¢'JSýô£%BÌÔkl þñm“ÜË´ê5hRRyËѲ+G“a§ùýâ8ZÀaš—ÇÙxb=g°L¹LÞ²ŸþËž~ûq蟃ÃCVàÚ 6œb^eØÉðW¢AH cÒ/¨‰”$ØùvJ\· ›”#úñ)ÖŒo¢Z)J8*á<Ë)tBd±ÇcìÐW¸yR>¡)™v¼D-ï JèàÓ%„÷´Òðe)ò¥ó" ´÷I˜!—Üç¥ ãä—•ñi­0ì‚‘Æß•â ° S¾q ïxƒ³úh3=±‘å‚IÛˆÂÑi €k¥!Cæ c$0"U¤iöKl/™Yp„§-”üÔç¯1Iý.†qp¢Ìตá( .:þþ(¯åÕŸ(ÿå8ÊW™\£„ÂýT"+/3­%ȃUùÕj)nj.`Ejð„zX~Ô\dX P‰¼º@ßâ+Tx}™fL'~%WÉ ¶¯rš†NÎ 2CKß‹´Á/â$ ¯ÎQWÆT Z8–œÁ=²\g+•/3à§î[/jÓ{í•¥4V½?SØ S£FÜå²y¶¾Ä] ¡qdØÎ/G_=„+M¸‰»ÃÜp@%œ¤-5/”=+å`WÎi ŒÕ‰uÜZ]~×Lq7Þ%OCóîŒÝd\Æ6õi˜ßÓbß$+L²ñ[þËšßð}òSuDuœ™t.tÜŠ@Ù—"ºëj꨸¦Ö·E <Ñ×>wfTyÐ%ÃáÙWdè6äór]c{`lÎïÙ„u ™K¡ÍÒÖsY+\†S@ê ÅŠ)¡ž¡s£äú#¢Sæî\¦±ƒ?rÄá%&ÓÛ˜ï¥fQ%“™§ŸU«Rp½*ÕAŸ¿ŒÀÔ ÿá–ŘÀ0¦ÆŠ–Ì!½ÿ¦ ŸÌ¨ÂW– \êÇvôH%bÏÄ …_PTK¿fÄè 1²R‰ Ô–Öô=춈t¹³+ô-\Ú›ÞÒ ¤?劣!ó/j©ýô.4e6@í*³¾Ñ—Çq²GÀ Xýú¨Ô*2WÅõ}Þ»*}é¨Up~Ð}&'„霻‚¦žà_pí£Œo1Yz8¬ZëûNWJ_»ÕÙ×;8¶vº Ë¼,ÃÔŸþòTÍ¡à endstream endobj 227 0 obj <> stream xÚÍXÛnÛF}ïW°/„[î•Ü }èÅmQ p]û­* Fbd¢h“bêùøÎìE$¥•¬¸6PX––{™93;{†Ñ}D£þh”1ø¤Ñ¢Ž¾¿‰¾ù š”-etóÆš­¢›åŸ1'’ÈYB)ñåÝ,á4.ÛbÙ´e™Œ×s®øªZ4Ý쯛_A–ˆpuªQ•D‹(a #3â.êY"¸Ž+¶·¿·ÍÊ>•U·-qH¤12]¹ê«ÍŒ©x[š®Š(áÆ¿É—D/¡ÊoÊU1ç"ƒÞ¸¹r<Z¹›û&´´r=Ù ðÊHªÆ¸=„¬Ð$—na±Y>†Ó§€!’db'6Åi‡c¼z4N}bp´òã‹fó¡ß P&ÎÌ<ž§,-á‹B¤Q1Dí|TÎ÷Uæ•™w]XcJ$›¨œ0ʈ’_⎦=F®ÿ›7Ä™Þøüù) 0N¸÷÷²ê޹£éÏ÷4¹ÜSz|çH Rñº{6pºªFxÞ™Ië0DùKA¤ÿ÷-Ý!µ\ϤE¼|„â1MµÇäŸ*eÙ“ aïè4—§Œ¦·×Åο½£…y¬}R  ž¡¼ ÒCunQóöÛP:¥„e;6³mÄ7E õâ© à•"»| ^Ö‰#¼¦%“#–!‹„$žŠ…àÄ$5ºc˜ð½BoR™ƒBÉä%Rõ¢0ü0-xÂ@º—â È{*»"íX\x@Ù!²…áªw\¬š§\Œ˜L(Ðð½4:eá»âÏeš(çR_“èÓRŽÄ%f;á}Óëu@‡˜y\Í{œî!àšr„ŒiàaIÙóøãÇpáw$8ÅAÉ{<圎Í]ɺ/ ß‹M{.6õ3Æ&O9aÒT.‹ C4%Ôc‰Ï6å7]‡%vâÍâºìêÆötÕjãbz麠 q-à”Hü€/GÚªiërGh%”¶lrkÎ{Ëv@ÓÌmª ã{<|¼îßuåôÍ0OûšóŸ]£]…È%åÏs|aa©?Üé —‡VŠ /ÝñJwÝtUmŠ/Ñ#׿-ÙHšKU'uÐóåxÖ€ãgòJ„åÈæ%lì0í§^}õ/ÔEY8 endstream endobj 230 0 obj <> stream xÚ¥XK“Û6 ¾÷Wø(7kF¤(Jê­í$3Í%Óé¶—uŒÍÝ(Õc#Ù™m:ýïŃ´–÷1™dV4¹ú²’«þÉU¦à¼ÚÕ«_®W¯ßJ¹’Z$Ú¬®oa~#cQÀx%¬ágQDoî;×÷ÛĤëM"#×Ãǘ¨*gafýáú,¥W(¸’LE¡WUˆ$¡Õþ¬­g+Fl*qj‘ÖuG¤I'íz£Òœt Õv Z2#’‹o“T‚ˆÊ¢#¨¢Açî:?¼·a´³ÕîXÁrô+×ÊDŸlm÷KVÊLŠBy=·mGëÛt±l[Zˆ,ØÖYM_Ö÷•ëk׬á×Á-èÊ ‘M°áIWƒ± Ë'àzî¯h~£E!LDšÒÄ—£ƒHAÄxs’Dñæ éöØÀ6g~«qŠÃéÈf¤Úmœèz»fúÞ1õë:Õàw âr­rø ¹#VŽ|4ÑóC}>%d.RN‰Ÿ9O(îCÌ“\†Àø¾+kTÒ•–Ùïa+󨥿d Ðzç¹Ù;,ÛWᤊÒµ)›½{€ˆ_µÈ•ͽl-ÑæïN{?sËŒö×À2×ùU2éU›ä ¡]ÛìË]Ù6¶bň¾‡îy+¸n‡9άœ…§a<6Ž ¤ŒòiÚ_ áõ¶ÓÖ¸A!"%Z£4rü¹'ºëêòPî1l™‰Ž=?˜å³ŠÜ»‘BÊ5®Ø•;bÓ°µŸ¾(ü%åCö\aÆdQãúƒ·lgûöêBôp-Ò¼jq9#¡ ôÇê`9³Óp7ÕÙÆ£0±M0á$¢€=ÚÚ`f¨$aÆŸœvß5 ûfü!Æ5|‰ ªü$z”Í®:–çÁmù(CÖþäƒÆžÜb#pÖú¸5ÖÇþõÛ|T~âq¼ypP×ÚÐd1cÌDšã·…B¦t.²P\·¸ãépø²Ñá£fŠÒ‚Æ_qäñÃMyõùÃw*±ÖþXÿûy½I¥YüfÑ»ÿø»,›D³?2ñáDÊ¢WüI& ÿÜ”ùá¤ÿGfU¬Š» ÅçÙŽ”·Þ 6#8óSŸ\szÇ#)Ò‰ߦ •~¯?£ºølŸžã÷|b²ß8ËþЗ߆PlT¢D–ó‘IýÙa/<ÐbU‘Ø ~™¨¶¥§ß¹&œ»Kœ„zrp U’BGû£õ‚„L@lXÀMæŽ +«Q£ÆœAc®/VnÕ°Tsº#›îmïÁIoÉFFX ÊÆî[?Û†V$2„àIW¨ÄB!m_XªÞ\{ <+X°i"͈_Íóc#¯>¿’ÓI8óáœþ=e˜Í;¯ÉÛhìKE`v€pyÄc8~Í,5‡i©¹ö¥Æ~ì·ÑW½:„Ú‡{€h‹6°ãÚ¼è_@£’Réè¯u‘œÊ"„æ+þa°-yV”» ¤¡ü- V¶ü™õN5@@O  Ré êëõÁ{J%s Ybë% ÷î+¶jÇܽ§Æ›} ¹÷uñƒ6ÁâSã5QÀçã\×äåB_éú¤ˆ0@s 1U½¨ ŠGcªázgN7:¡žÓp¼.ä,ˆH AÄñ$ˆºð0gzÇ„ÎݺÎÓ,(¼8wq;kˆ+)¢"Ñö=@’µAÍݱé²~•¡ü“Y¢'Yr–´'Ž1dë  ¼ w`@¹ˆÓ1¨ø•¯Ôñ”ŸQõ–,r~žÐOža`0ƒ‰ÀsvmD"Ýôq’ºfŽ ™ `£!ÞóŠ$¿M2U»Ž–Œù¦&îxnoGU ðB1DqUäsqU#÷T‘±{H.ïŽøFB¶õœÖ©©†V aâb'&Ï\‡‡ŸÊvmÍâ–ñŠ ®T½½}Ï’»Ò…^bð<ž;}!ΞAÞ÷ˆµôð\àAOY^"3|‰<²O‹,¤ß&ëQÙVã-óˆiïaF³÷ïœnŠÂ&MAå•6F3^JâÀúûÿ6I È endstream endobj 237 0 obj <> stream xÚ½XKÛ6¾÷Wø(·kF|Šê­ÒŠ$íöÔíki–åHV°È¯ï ‡”%[^»Y HÑ|Ì çñ}Ã,>/ø"…?|‘ ø›.ÖõâçûÅ›_`È9˵^Ü?ÁúЧ,7‹ûâïD2ÃärŹPÉÛç}[v݃4z¹’<);ød:©eë ×-ÿ¹ÿ „©Os”Å5ËÕb%4Ó™—÷Wí¶|´ Ö¹Ÿ£-KÒA“’Ír%ŒN¶Õ®\ê4q-ýFþwáæÔâmTø 5‡CR&=(‡ö:Fò¥òò½lïÛª†%ÞVîf´J>÷%-ÊšŽ>]¹é«ÝRd°B3OM[ÇŰ‚²ÕÚý,å㫯“þåLson××sJ™–¥ƒ‡VÕ®(ŸÝM2M*©<Ùx?º]Ñ̸hÅ3ÎÄDsbæTgLÙëªÏUä–éiT¦(*3'AP˜H$ŒÜ ®×<%×ÓâR˜äÐú„HŠþ+Mƒ`½+ª5&#þ»×Mܾu¤×g)(Ë(……KÜÍ\wÅ…a©€¯DóÑxïP¸õ‹Õ‚AUo+¡Fümq0½­”bH9\õ·Äɽk!Uª}8U8šnödq¼aÞ†•4,³`¬Åü@Ý?Áu…<õ.ÌD}J¨X²´b#0«Áõ_–Z'n[…u¢ÜÁÕ%9´¤¹x¶.;O1d>ÎRмÀ Æxa}ª[( ºK@ t¼&ÇG3¥É’° Ì+ÑeÆ$ö]9xà x{àí_àÝÀMÀ!5Ìäg@, gæ(OÏ–åÓƒwˆ€&Ùc‰oªû/f@ý)=‘Æo°Á^L=,ƒåóº<4ä+Ê'„ߣ6­Ï^ïÀ!Õ†ÀâlNtMí¹Œl«0’F}¬öäOÔ¨¬ß:‚£Ù»QêÄùô†TƒÙ6-íœ&EÈpðÆ| š ÍMØó4kJÊøÀ Û®¼$$ {6³lm53ÚÃmžýÿš¸˰úr&Ô)OEArókÔ¬1gÄ%Έ R‹|ip7{u¸{._0Û‚Ys-Sò$“¶‚‰È³c«ÊqácÙtcš-»À—ܤâcÂ4g=¡‘f(3¯G%ì'ÈS8:'MI“zCœ£5I‡4qèë–úÏÄ S~¤€O¬R6=£Uè|r"Nã‰~;qf–ìsÉ„ˆ3»JZ"M1%Æ}w—}q •a'Òn N¡3ßÕNyæÔÜ̉$ô´p3| FKÏœanØ4p(õ쫨å£Eèäf:¸¢#^œÒg@Ù’>cþx“’üŒ9»—©Sª4&?R§¾BpIÈcÐr¨¾^çY/÷Cï¶à%|QÙÓæWØcó‹còLãÝ\”4וaq]¶k_Tø#”S[’X0 n,BÿÒa?ñå^TŒ §Ã›ŠãpB"·9$¶QÁz»ë émýˆœ)"QÐ>ïQÝp K׀é9q vLiF~ÁAß9ŸŽ8¦Es–˜fb£ÈÑu©hãvS>¶.lϺ » ù¿®R©Ö.èËM[\tRwùb—%»ðýÜ#Xá¿§¥1pa-ˆ¡¾_ÞÖÄÌÀ¾¨\÷LH†ÍŒÅœóÍ-.v%}ÁM5æ“E'.J›¦h6J6¼^:ÆÝ£¬lˆÔGdO1à ˜ñiÛM}> stream xÚ•UK›0¾÷Wp4Òâbó0>¶Rê¥j7·¦¼[ª²Vûó;à 鲭ªD2þæ›÷0D‘ŠRø©Èhø§QÝEowÑë÷y¤RiSíî@œà¥ŒvÍ7Ñß}ŽÒ+’.di€Šœ;&¬XYU,ÞÔ¯¤²,¿ßP¯¤]¬‡}–g}œdi%üÓi𲈠÷€¸‡öèHn¶\)¥¥Ulíi3Örï³B‘«©sdûì“£°âkräm툿k9P¨Ûà:?3G°Ê^0‰ñ$ÊRgpf²(æH(%àgJÔ=:6=!îDù] `Æ5P†®?+…Ñb è>–³#UH›ƒ›JÙìæÖÇI^ÂÑql^•¢=Ö‡©%)eˆhÃjSGgÏñ ®é¶8´ã\£±­{¨@¡s1ö3­éÆšgpíÝ?ùzÝY¡q\/Îã\.&?€8Ñ6'7ÌO¹` iߎŒa𺺰 ˆÕ}Ç Ý¶Ôð0µ‹,4 æ † aš«IDñ^ÆÄwÀzi«ä?Æ…<§™®3Äܲªºj”5O3©£ÌÒ @¿±ìÑ/ñr‰‘wÕ›ÀVxöAÜÓÁ5|mοŒŠ×ÅuŒMÁ5lÅw|ní2À—]F7n š¥£ó¡ãGšòlm¿&¬®yy¤4´ð² t½~O©- ÚB߯øa¸þåPÊJS [ÃRR¥¨»¥–™›‹Ú -°¸W÷íÑýO••iy1¥Ì¿½[‹Ÿ‡³Ê²*—I\sµ†ÅYEI™ó(ê…úåÕo²æP endstream endobj 245 0 obj <> stream xÚ¥XKoÜ6¾÷W診¬(’z4§¶HZ4ˆouZ‰v˜j¥Núï;£!%ÊËu1B‰Îû›mô)âQÿx”§ð—Dõ9úù.úáW¥ Ë2Ý=Àñ±Ä—è®ù+þ¥ºÜ ¥¦¹íGQ”±<ü}÷ÜÈ£T²¼Èí /årã½î&ÝÝ ™W£¥-#ž°2)‘–+VJ /˜¸I/=zª” IG ¨G–ÄsgšªÑ#¾¥ñ NøhêjyçqSÙUõ`ùz6{ºt†5ͦíÙá¨ßž‰â÷júðçÐ?ÝdéóÊ uw€ýMûE1«$ZrÌ2>=rÁ”\,hÌ“i qyå‰4nf·SW“~ìS?ŽRZ!ÙNˆH@g{Q×m5T¾È–úÁáÃÜÕ¦ï*3²Ûáá…Óxžc¾ø ×W•Ä(ÿ À)›×AäiÉJÅûçŠÔP)“.èz q,á–âûñÅ+¸f Ží•·ªŸõ¤‡€™³$ ɾ&DÙKODòÔêo©¡¾•÷QB|r?¡j4£ïƉ,1]ÈYdyÎ’Iù YгÒߟ>R°'ó2F&Œ;÷ȳRn`…çy¬š~¤ç ä+=Ùäè­?UüQOD©(Éá¤ÖÃdMæ²`Ѿ.HJÉt „ûDÈÎPpÁmË$¹O‘û€µÆeè/ƒÑ®ª,袓 ÀB;¾’_ÀGl6ü…Ò:IY¢ö@)^Ф(Tj‹”¾ F'MYVláÉkRM–¬pá¯?Pôÿ 1—¬ü?¼3^ÚêßBR&òëüµ¬!šÝôÒ9c2ýV¥2åL~ö@¶!ú.¡@¬ð ‡YôŠª—`S¤KÓºJʇr^kŠYìR´ZûŒÅë/ºž§sb-Ú™ø±K{=Èt­}•²ý˜+Dº—àô¢D¥ñ§Ù>úŽâ&lYJÄ+¬—ÆrvŒg3гÛû4W-H²»ý°WÃÉLÎPsÑåªXÊ„¯Y·Júð­ µk`{,’2ô8·àFûŠC®ÓP5óª?Œ oÉæ˜f{¬´©¯0Þõ nP‘Ã] £ƒ'ä¸ pÅà¶÷9*ëêѪh¹¶Ÿ%¾Uƒ~Ѓ†ê³Ü^òbñwo³¡ŸÁ²1<;PøßÞÙq‘G\B/Íìô'ò’ ÊÉøáÈ“²ÄÒwHË-ßa:Rk7NŸ"Èö"ú¼0( –«è ­*c©Z7Úè}ôn£d) %_¬td¤Ú®gË XŠòÙ0á“Áì ÙL˜êú³­úUkœ7šþŒPèŒnvRÊŒ%rÅú5û’¥®DWÓ`NódMT=g#Ãl ç88s]Ü >2{Y)õJ¥Ý›«Èa´ ]m1q»¸ø–0 &Ò ´Ýð"è‹ÇÐâ¸Øb(‰ÀÁ™ aâ¾ÙÎÖ[@GsÆ„ÿ¡ê‰ÖÔ½ °¿ûîãL j$Ë«”%¥ P–7•j LœU»3j˜<Œ­Ó=ÄeR°dTÅp¼ ·º6Tœéœx¨G=7`Ì=g×lýç±Ýpvæ7í\Ô÷켂Ànþãøõwm¬ª¿\ ”ú]Êtþâj—Õì¦Å~GÚYlƒæ©¶ æ8Ÿ–ýÆÔúÃLyŸAÏ0òl’/E„Ÿ#®Ù—As¿¨ !¡8ÀÀ]AèÄÓUÎêÍB¬—°Z’> stream xÚÝYM“¤¸½ûWÔm¨pFð†»ö8Â{±Û>Mí¦èmz èªñ„'æ¿;S™ ¨îñÕÑ!!¥¤T*ßË”j÷i'v ü‰]&á?ÙUíî§ûÝþ*ŠHâ")v÷ÐÀ³»?}ˆþø§ý¯÷?ƒˆ/!ÒX+CúË˰O“¨Ç£Òª·âïïi^*ôî uœ 9¾ì2‹êª9&JWåþ ”Œ®-–"ªúîùÚí¥‰.=¶À纭©¥¨©¼ ÍÃõ¨ÒôÔÓð²¿5¼¿:‰‘DÆú:RS[·{ÐäaèÇ‚ , £³8‘VûSýX^Ï— ëhXG|·uL§ÙMëäYJ·½Œ¶—ç+ë@ÓÂ:0¬ìo ·Ö±#UØ:Pó¬C²cݾ 5u~ºr¥›7ˆ¤â4µy‚vA?•§ž-^¾ ýËиèkì†A‘þŒ+Ö wv¥;1˜,£…ì4§Ú›9æÃÈ=»ذ¢ˆSeõyÿ´?ò¯³2¹•ëËþ uÎ9‚íMÝåPá^R‘Eÿn.OMGõŽMTùÆ©íµ™^Êq쿲¬›GÄq[~i.õð¤N ·í“TViÈ#Ið Ü*¨¸<Ѩ@áú<ÖT³kâW« 0q!|%¯]Óóxзüú1T¶vGµcÔÜ}<îIÖuÏÓORïžIÊMb<©o8 ô“¹+u&›ýøµ ùÛu<‡Í?»[ž‘‰~úÐü6lÛ½cúó‡çYQ_þ/Ôtj©öþnÛZŽ$쨯Çè]ùP½»R÷Óþ•w慎òÝqÿíö`Ÿq‘Áœ¹óßÁã…†|kÄ]†øŠÌ½§º:—CI–3 ôAïZ™è—šºzÖ·>8c÷Í‹]lû©©x@ç@uèT[‘Ö©¿ÃžÜ-°àPÙ¦Ãe¤Î¾¶ˆ<y ×èiHU9Τo p@Î&þ±axa.i‘ÿÒˆ4Æ S3Ç8U§Cù;lhž÷Òó1¬’Ê8å¨@Ð]µ‚ÚW×üoWÀBÒ R¨¡vkJ?ª€¢ÆðŒ[+´5u.×—s9Ò2'^îÓµ<ÓtÈX#ÍxiœL?5{§„ÇYå–ˆ=s)EœætèÚªáœÉ¸CFrÀO 1— %ŒKÐ@ Za’]º[:MŸ±#à4ÎÒ<ÞÈ“;GÈÈ,‚•(¢º¥~ „G(CR¸}"q^QSÐ#Ëh½æ: ë&%\Kª–š¡§«=”‚úK*d`OµŽþâ½õªS}°¦‚î•£ ÔÞñ¤-bçKÓöÔìÍÕ•Jã<{ÃÙeŽ–dXÁ_X%^ùµ%²4ÎÌ+ÃqØÐÑ–Ìma­æÔ#¤-Yh 7á–ƒ¥ËqoFÇZÿ¯x tA§oªæR:ÖAå N BÛtå‰uâli ¯þz±0@åœÝÜܳ(ñlê¾UjJ‰`ÏZ+‹!-…Kܰj±¢ebóÙ)—µ]6ÿÃÊXÿ6#À?*™ÈX:o˜î‹ä7w‡‰0ÇéJ*^Ês‰nûy(ÕvñDŸXÝ\­Hc¡&Dù9zÀ´E¬JvÛÆòà¶Î‹Çn¶ý €Ü38Úw¾’’¢¬TË+ ôœCMU? õ”*Ÿ\pÜÛˆž†`²®îž°‹h6Ýc?´¥Ÿ@KE”¥¿Ul`¢„ ë§’’œƒÝ†·UHÖ®­å“­¨—Ä2€©M…Ä#1Ø•2ÃEufUúV˜ÎÊœ³m¬ebýJœU†Ì†k…]h2,d«ë3Ë|Þ§@g‹Nè€ÀK>+jcÈ+¢T,Ç+«2ž@ M€YЂ¿ZÇ1˜UÛTÏä¸ئû­è»§bMæB¥É–Î,Ì"~$6|UÄfŠÄP #±7}¶Ô`kz´õê64Gå„£r²JÏ’b•I²¤¬aq#¸už¯ÂÐו@]gž™LŸ{¦Ÿ’dý«¥)lëQe²­mÄ…åËá¡ñ³MâL,ØÌÌÈ ~â¢Û›Í…¼ÄF"X­uWãrÙœïÜîÝÖcË-ë[„êÂ4Ùâò”z |QÚ%µ6Ã`ë1ÚÚ´€ 9øókAAÄÒåx¬¸î*PÓVìÁêé¶+È"~x<áÇn‚K µsƒ®ƒ’þXplP† —ÙEàŒÇˆÝ±ÁC ÍÍŠ^cŠÕ­0~ º™j%24Ô|x§…'6o8§Öx_™ò[bT–æ‘¡X—ÎÓݽ…å6³T«Ad‡…àêŒèJŠºÔØÊ(Æ|á[˜7’ßÂ&IØÎtÌ^f8 à«nfEWá!Z#osë2E÷à›F°%LòG¾´ðÖðÊQRS¸5c¦‹ÛÚ­ÛLºVg¾Í¬CŒw³Q‚Ÿ¤o$%øi@nÙzk[ä–˸x3Õ*NÁqWöªL/Òc»ñ’ͼ,a–dù‘N/¾72#¸ é·µ‚\<¿á"–°ÒmšÖZØ"Ï¢t«´Y«.îʧÛ4ÏnÒ­ø–ñM·ÁˆqÉ;T&º5üFa²Ý³|¬¢„ÍÌïõ0ŠÞë¡2Ã9‹žú+½=0Z&L拇z\¾a¯˜ê ?Ô‚7Þµ}Ðh&*=£Yç’ˆJ{$£S2šN·¢¾µ©&£ê€Üt:-²Ûylº»õšQˆXèïºR/$è> stream xÚ­WÛnÛ8}߯Ð>EÞÚ¬(R·&)Ð.Z` l¢y‹óÀHLÊT—T²Òtƒüû9”MÙrœÝ1"ŠrΜ¹pä}ó¨Àõ’~—WÞÛ3ïå{J=Ê ã±wvë  ÆÅ¹ÏI8ƒ×,ó?ËzfþJÖKÆ1[°8òoE+*¹’íìâìƒ÷îÌûæ–¥Þw} è©<Ç$Œ†÷Òûì}ÚÈ‘Ð[ÄI)ê1eƒbË< 'È46kžN <£ßè~ùÞ•c”¤A‹ÔM%,£¾(•èô0ô‹¦Z²(ªUc7´d1 "»}>qz¦ÍÁe±Zµêrê¤èÖ!|ú™æÃcâ4pxçIHñ³ Y¡ã‡i/Õkg ï®C\ïÆ”Ôñ.¾;Žs5ƒ|8Ýxd—@ 6€s(:­¯Ðc7vªš…±9[Àÿ%‹Y©òfp+Š@X@†™ms<ÁÖu-hJ"†¤™Ø˜ p¨RAè‹Ò*·ørQH%p®¹”‰Ÿ«¦ľõVNvz1õe®–ã¹Ý‚gƒ ì 0ת²æéhÇÅÍÄ; |ÇÎÀwå”$SÆZ¥òþ¶•]™Õ¯êBÞ ¨ Ô‹l¯Å¡µ8Ù¶Ø:Í6rf×_šùBåò?º rݬS£_MÏb’±u†ÁùÁ&!ÝôœÊ¾0! ]§ß^<Ð8PlC#]oéPmƒqa(TvnÊdœYúÂÊÜišÚë¾Ä :øà·\ÒFVÓm«ÕP¡ÊC°$ðd$аºo5ÍzwÅÝV©•*DG–3kk:Îø íof°Ñ12E#u²X#m5Ú­øæœ„¤X:T½’×›ÛÆˆ» ÓˆdÂ> „£ê=1·Î‰L²¼ÚÐQŽ®†(Û4 ™V¯Õ^ªZ´?âd áٯ :a¶êL(ñÞŸÝê²úyhAÿ* ¦‚'¦‚'ë >Ƽ Y_É ê‡*4‹ß©DÇâE>.•B÷(¸|À2d$±äù Ô³©n" tÈÛi»¥$Ú©£¢¼îB¾šºŸ#€’Ø}'çF$f[=Àh¼Y?9ØO) Ógp:­Ÿ?wû>ýɯÿï‚×?gÀÉëŸ$ð÷Cز¹yLxäÖ݉ c†±ä§j€fÎä_s®h¨´õµÄy»°·“å‡Òr'Ü[ñ9KM_ÅYí„]nûM_k“ᶆµIÔB‰zoƒ1‰ZN“¨WD=‘¨Ï( ŠVV(¤j¸EUaoÞÀõ}mØZÝÞ¶ˆk¬pb9‹ñêô“̃”¤ÑS·ÀмÞÍ &‹²iÝNC·'C#ö^šR½"†v£·ßl†ÙÄ0û4¾þ^V…¼}¹šà3]ö]èóyàœdtoª£š‡0ñòl‹-(ÜÊOX1ùi$:±‰ S8ÑÉ Z<c!€A=TØû¥éïf&èuj(…˜ ¿BYƒšZüӱ,‡&´¶^î¤S|Lë>4æúP2Ñ .,s4ZÂw÷€¹lžîü8\ûQè|é/"û} mg!»H£¾jæz6·) ½|Ä7¸>Œlp¼k£sTÙçmó`·Úƒ(!g/èãÓ?¢ì«S|†Ný©ƒ!ñ|œXH48*o*Ý>æ:6ôÆ£Ÿ²Ë›ò‹D¡¯G8ù`•}„|œ[‘•úq [ ±c„ºíãoÚ©E{øê‹¬­ylÙImÌ9¯tþuA/páŶ¹¸~ql¿G¶Ñ9Ý>¨±qY›oÆÓçÄqŒ•Z{f^ÜÌGâÌ›seÑB«\¨«+|y{~s1ßáåáÏs5×BF~¨CÖþ@É¥¯Bÿf9Û¥€oSPÉn {ømM±ô·PGcF`®=²°ŽÞ\Ú±•}<Þ[ûÂ>çRosücÑ úé·dA endstream endobj 254 0 obj <> stream xÚÍYÝܶï_±}Ó^E")Q2|ÀyèCSÃ×¾tû Óêú8K«ëÅ}惔¨÷|qÝ$¸Vš!‡3Ùg¨ÝÇ]¼‹à/ÞiÿÑ®lwßßî¾ùAíâ(Ì£|w{¿‹“0W»ÒÝíéßÁwûƒÔi0VÝ^¤Á¹êŽRé‰IðP E[«_upªÊ(ü2µü c`†€aCî‰Î‚÷ËìÍ´¾=Ê$éjû^ñï8ÝýT—†‚kËž'+fj5>ì" ª²>FR•Å©œ,ƒþsû70ÆØ$Ã$!›\`¤Œ­4)‚±nšj4d^`ÔqÿŠÙe1š)eÏAQñPÓš2r$MmÁ#Ûâ<ÔŸH—o~ˆ…ãm‘%aŠ»‚Zuf„»)ªÌìén«n¬û®hB6Lè4,ËÂDÒ Qq‘¸âÝtîGVŠ\ ¿çš]Õ[erg­<un«»sõöu«‘ÌC•šQ¯|bÒ0†WwÅð‹Oˆ•Tù„d ü¥½ë›ºôˆQY¨Í¨SјíoÙÖöÙf×ÀÜ'*(š~¨ŒÏ>NÆKÖGà_Ý2q4Þ8ˆ$ eâ†;cõÔ›À)zŽ7Ò^ÍqsßmÅ@~ßç‚ö5Éϳ0ÏAº“Œ¤ß’þ:èí³‚Ùá=„wžÿÚgb±fæ[¥PòÛÛÝÇ](ól÷_»Š?Ë]»“iF±}ovïwï¶Ð`ædY1Œš—„„=ix܃vQžï`wÀ½œ=ϯF˜8C]zC3rÝ}=6sˆ=Á߱ת®Ùqëý†¥ô]Ö5ÔÚà\=·]¨ràE}®F¹«Î-íÈ΂³qXÄzAä’˜ñËV}&-Üu“çyùpq^D°Mec÷bBqŒ²2?œX/1é± ‘aþ²”N,¼ÌÑ¢çR m$³bï ÀŒŸ'v-œRü@3SÈÁ–ôÓy ‡çPÄz^fÆR8¾”ÔÁ?×Ù1Á”³)¸Hõ‰7òʹ[^5ÆÉ§êlqg¨ÊêÄ{%(€z¿Zf•樆Ùƒn9`Xâb¾‘] Ñ©ÆÓܺ9±I¬™ÌGÙ•9=›YÒÉÄ$†Rx€dƒµ»æ•ôNâ‹\L¢ „&¡/=½¸êÀÓ»8×ã}ñÉ|š4†·Ö7S‰àíxÞ*yŸqÈÆÕcõaªM™@/F›.ŒX œk¨^û’ÀÚ2ƒû_U‡ÂúžI¢Pe37kX6‹N*ŸP˜YPxÂ=Ö°8üdókÀܳUp¿¹ñÉU˜åÏh«€¯þGmy@²v‘E‰c$”W±8LÄ…b&Ê(L] o¾d7Â4ûL9dÍ¿ù"  ýUK¿o¾’û¾ýÓHòµ,üƒÒõ÷²ïÍ·_²ƒ/Hiøý¢¼Lÿ¯!’ú2$ú­é¡V¾Uл­Š$8~¼zŠtéŸ|ÖGKhºË<áþJk·¤ËÕê åÔŠäÉE+â3I'ØM^·)ÇúÿRÞ«ìSs.L-Í4ª;òÔ0µz‚Šgm)¬uAj†õ“i¼„¥^ÕÀX£jªQµ­Qa’P¹¿$Pitæw9îq8ê†Ôm'Pð™©{ZFƒ3¯îêù€GYQN ~}¦­N²vÕñP¡+2uŪ,1>B[íÂso`lÉû *Q¾=MC1WƸ‚‘R öžšºpÕ…1vÑÖ–ãMOâ%rœh ¡« $ùýÖÊ‹º.‘ÁcÝSñ¦,m êy®•­Mep¢Z § Ï3c7å-ÌÁš<É÷Ë~*ÚOEY†¾½Š  þÞSHÛÔ¹rUÐn·Ï¦¤½†ºq¾Ò‚êx8A»z²,¾\f2©©ž`êRp@Í=›¦VÒ6{zÝìéM»ËDÓrðwº°»ß/4(„nÿZ"ÒäùæP„Y<_=ù0P…±^aŠ=ê¦À KçèwIlx£´KÓmÚ¥ÔvÑ϶çA2ÅñW0u!Ôv˜=kTN?›1‹÷ ¼2í¯ãÃ!M[ª¤EUeâN©`œLÂëµhÌÈ}.<šH©¹áª~_wZÐðxn=€ Ëë] U¥6=¬ûù4VB ¦(!ÁÏçbÀ¶ _ê®lY8ª£^­b¶ßnÈ@ xü½¹ @´<ŒÏß`ãÀ¢¦ÖÈßÓE†Eo%â ôÞXBy¡RÉ}ÅM¼”çþÐMÂÈÖvŸøî[i Óøx ÓYÆ0M-» Ó¤Ϲ Ó8æd×°®"˜¦6œ.@ÌfÎ¥Š7-¸NC)ŸoÁ—›@a±z8W]i®9ÍM¸Ù¡Æ ´(.cx¼Þ´Œî]£‹ãýhîV<8Nwñææ…püL%Ò)xãLÇ_¦º‚Ôcàmò¥ #¯o|!áÄ Þ‘¢, !™Pˆø+BʦXBõ1‘‘黾³"7Ì#Å#ß²¤Q(2w˾}˜Î”EqÎYçnÌàë:fˆB¹]ÂpŽ¥*>Îá(+ö4"û݃Ð."WÓÈ”¶b é2LÅ™#ÿ󨤴UBiö1>ð‡šãq&Ëé;•RT˜!w‰ |;æ62ÖÂý·€Š?©‹¼w&sÔ¸qæ‡Ê6åK̦œ òǪñwÖ‰Z5f•*þ¼°8†/V[¬F`)nªµŸL"Qa?*è lÇúTFÝþB±‚¼‡L5Œ®àß±ra*SóL žO£˜¿r1+çúñܯ—Úx~³éÖ¡ì>¡„<°|M#¾Ž)8i±߸”Ö*|4u·"L5g7‘ÑÌYNbÌ"Öp <Ú(0Dj6¯Æ«šL±­ˆ[Ü«§ºí]໼Ý\DZ]èJa®KXËu˜[Ô:U÷”/¾ ðËÖÇä•3ÇÝÅ—1û9S$a_Þ_ëøùÒ‘æ¼@«ÄŽòÝqk{Ç …ïE[ªcO[ŠÕúd*xJ"iQ¨q…Ž\åUí·…>VßlýÍæº‡Âì·Ýã:䀂ªáK¤Xj–ÌjÁJfRC ®Ó“þÔOæªÅô¯&èqᇡj›À« Èõ*ÈójO'D _äøn@, ƒ@.$¢‰ü»AU&wtkŸ ¾•nÔ;‹x¢—YÍÏ‚ê!M?uëoåaÅÆ8Œa»êî èìW!“¥Å\ •ÄÒ¦ž‰zæííö‹­~h8¤Š¿6ÈÔ}÷—_ÿcÏR endstream endobj 259 0 obj <> stream xÚ­XÝoÔFï_áGŸÈ-ÞõúKJ­UPi¡Éǃs^‚‘?û. AüïÙ™õÙß*ÊÙ»³3¿ùžµ÷Ù“^ÿ¤—(øxëÚûýÊ{úRJOjêØ»úûKˆ ž‹w>¬.à5ËüKÓ,TæoM³ u’/–aù·‹8ðó®Ì¯+³xõÊ{qå}öD˜¥Þ¿È( D˜zµ§ãX¨È½WÞ¥÷vO'”·ŒÒkû D‘#"x™‡ˆ‚ áÉit*"eÞæ•üôå˜J EÓÖà†ÒÏ«2ïñQùE[¯Â(jÊ–OO„d±4?›aŸ óv¾íÊë9*ñ =ÏB€‰Á˜ö'†Ÿfàÿ@’‰Îx ]D{O¸÷±7Æ®º8¹–ÞG^‹ú\îýñÐ *Ó\#Ée»šüµwb_Ö û׋%ü]…qX•ë–šÉí"Ò–©r¡xW©oªóÃ-IìR¦0Ö~6HfðEÌy _UnM—WŒƒ¡®ó”9­µœøë²mÙçÓ™7âº\¡^óâ-ýMovhª›²fM7yǺ2íTåô´ÊV“‘Ê’a¬·–"™Ó›å›»Mgú䆌­l s—7hø-+x\yÅÊ'‡Ê·tró–£`wm׋rmþ¿óI·±óGÉ3q¾Y6äß2LGé:NÞ¹ÜT©ÈäLrNøC²¥L3Ø2ÑD¿Û¶Xµ’ˆì˜’ËžH¬ÞI4`ÔŠˆV~Îä·h¶îfWåÌ“àǵ)LÍ¢x{‚@û µ‘UY&±€²°”¡ˆ"RÁtìøºÜ–EÞ‹Õ‚µN§eaoúß@?–V]L#V—KÖÞ`ù$ŽQÙlÍé&äc[ËHd² hs< ‚›s˜RÑL h¤Sƒžâ½ìòó“@•+eVìuÙäÝ—Gq†‰úgá™H-û˜Q†õ¥þú|&¨œv KÀ" ü¡ <¦Q %éè|ò»ÊW•?ÆYøƒéÊ–Ë@åOÚÕ2‹DBsijŸ­e@SN~TË~ǤNUõ˜ªC¦ŸVb­C8Ïgˆ¡Èÿ°¢:‚Ùñ{%à•ó!’ܵßåÏ%§edÉ@dæ†Âw¦ÞTíé’¦!Œ3ùŒdìßáO‚!oŒkÛ@ûåëÅÙ«o§(6][ìîËîë†ØA‘°¿¸þíŒh¸ZM¯Ûˆjų}·yϻϞәÚt0ZàÆ)éyWç÷JÌײéwuËL¤WOä·±¼ø´¢÷_Ë)þ Æþiºüê€iùäÓùL¯sÞU~è& Ô(®¡î†‹®¸Ù†])̺²Á‚/v aº¹p¶¬aL¼ä³ ·V•¦ ŽÖf†/\nYÚhþÀS¯ç°†ÊbɾÛNétŒŒ tÀzhy¼‹«0ÃÑwS™ž(W€|ƒ)V e0nö-í­[2eGµ¾%!4½áþ ®Æö~ïn j2µàÐ]¡fÜ£ ´½,ÊÚ4=Ow(ª0§ÔÁÑõ1•©Ñ鱿͡·ÑÍê‡Y4  ×2;ÒéJ»›r£Å¼ï[ž™ò"g>]ô|çŽÐãH„£·Âð«pA9m៬aeÉ~„™ÈÒ¶»#Ás?NBRAÆ×Èàºky„Û'šÉ¥â™\†ìUdËë¶ë\·M1ÓóšX;_Jé7ÌôCÛY 09b~º!UJšÉ*d)Pþ›?Ÿ¾¹xM;+Ö¿{Xe.ÍžWkúFñÏüÐÝ> stream xÚíkÛ6ò{…¾Un׌$’z4à ¤E}¤Í~[­Ä¤ZX’W’sÛýïá mÊ–/Í9 À!‹ˆápÞ:¸â ‚q%ðU|{<úNq$Ѝ®_±… Ö¸×õMøËj­–ÓÐÜî§žfµÁon›¶™ ­5Ýk34ý@³M¸zuýO@>v• ¥Äüì)ƒÌîE’1ÀfE¸Ì¸[­“<4U³‰¤ªJZÞ·%QavƒÇT’éëVIû©ã¡qð»ràQUn«ý¶ž3HÓ:ΤHSøJ¡µ%ÆcO&a˜¤ ß®´ Ë¡»ãøÿ3[±ZgJ‡?÷ÝâöCÓötÈ^ËéÁš^†Èoö–ëš!FÃwŸ‰£îù¾ȶ#qWÖƒÉÌu¢î`».GÂ_d5ò™vô‘ŒÙià„ŒbЩy¨ â‘Q‚çí÷¶é|hʆK«M¦¥EÇ-Ž·W8ÍÕØ´<äwKƒEQ2VS–›º¬Ä}­!àà‚6 ÊïŒa¢tÝ™7åÔ÷H‡Dð= tËÄÓÎÞ™¡'˜Ú¼Eqw”À0·MÕLek¬EN @ÌæDÚœ÷åBKç}²ð½g–oø(ƒñ¸g£`òŠË.Xˆ(g{rÉsÏe¡–\¯ ÉÃ`HÏ]Ñ â£ "0z„Ç»`*¤¯+b1 =  ¢@Ÿ‘*[7D(Ï ñ°½ôDÁ§b„mZ`çq`fð5™ÿMMF™¯ÉˆñEÓ¿µWFiˆ¨ä‚ãB$1+iI‰Z¤Ò×!`ZÒa”9ïÉNu+ Ãt®C ŽuÛž-žE^:Æu¿/·,Ö¯ŠD–8úlIÒHP:e]Zí&áóÑ)Ï“-€‚ÆÂ“xú!ÒÆÝÞ €FaÕ·t²ißÝ7²1ßžÈ ž_SŠcp²Èƒ[\™B#k•¦"ч…mð2øõ)’¸ŸŠ'–90¢rfb©*”ˆ3ò?1 ¶4.É„t»ë[B¹mJ'—-HwM¿dÉE*"ÅÇ¿Y@#í£…®t¬tŸÊEäƒCùÓ%´à˜ñG¢Mþ1pk*F |Þz²$¢4¯ÿK¼NDZ!íVDòóѳÿ‹ènEŸØ:eÂ!î³÷ßgŸHòŸÈèý†I+Ò^jr ³ôäç;„Ô±—ïxÁKdþõpêçGý—K ÅNÇJcÏ ÿ¨tèS°$¸…‚Ê4™J¨ïûy- 5Ôdk˜ÌJäñ‚×tW’1-ÐeBq‘®-Ôƒ-«¼òêÓ”\©PáS5}çÀî÷æBÙ3¯ŠwÐÕÀ¡êóGqh ÷8<óŸM‹l‰M¾ð¤2µXmÊYS5ãõjÆlrÞq±|¸};ÒÆþÌÚÞßÚõº©ÌÇ‹€˜òDpÁYf‚ÈO¤]–Vš)¹ŠÝ%¹ ÝÚ¡B?˜-d¹©éü¾4ºÄmn¨ãÇn …2¼ļ€b¶UÍêy ·2µaƒreò¬j>m¯Ú“Ú¼‡R:þq³‡æý ÏMø€‚oWnKÛ0 åºÂ¦á÷òØ?,…¤\[\/è«yÐOÈYû \“¯ÐªZ|š€hc` (uAÌêÎTÓj­cÛ],toé1ã )+y³ô""F¬Ù2V% =¾n¨Èÿk$ýž…LçN-…L|m£UmÍÔ;U=ú.ŸGá£âž?€íÇy‹t´•R˜*²Ò¾!þèó5­þáͲðÝ}!yÙ݈çOžÒ7~|þD=Û{Ö 4[)ÄõŸ|ã¸oßßÍ·wC_ƒ!ÿéÍÞ5ÃÍÝÕôÊ¿1 Ûòá_¸½pñ©-Øs·`Ï]Õ¿ohJ÷á½@DÏÜLþÞTûôŠ"öïoîÁEoš«éëøábYx[Lóúo²»ïìKÜGïøèW?—Zg4-ò=€hô¥{”±Û`-ýz0q†/ àý ÿæ’™ÝÔÝt³›31 ÀÍîD•(g9ƒ«w»›É? 2½ß7;Œc~î„kQd¾/`Óès‰½?$ ëz)k|s¬¶èµK•ç è6Q¾dDï윉˜ç;í=¢èà Œ^|1Á(¥ÓÃÛ¿~4pÆÔlŒ0Éù —à2,º ²Œ4Ù`Àÿ6+¸3±O‰#V= q éžîi1 ½sñ4ñ㩊Ž/kÝ‚S䉶×uÓšnäê ñ¢ÆNùH5 käÈ©R‘Í~Z0[ãˆK8xáñ·S”è½øË…:E€‹ø¾ObЍ¤G€´oX8(és&o\¬ùÛº¬¼å…}·#+Rñ¯0P±êè—…YgÙ> Ø)!µPÀ¥·CÏ t©‘*gîmõh_8möWéõUŠ~?ØeØ-*¤hFÏ^÷ƒ­ö!ìÌj¡‚³çÐß‚ì9ù׿<¾¿øñÑ‹~â‡K~—æÚæ¥9båDH?Ïýö=†7ç?ÐA7™ƒõ¤‘ŠÞåbÏãÑ…S1 ³dvŒ[¼úÊ›¦+?‚†X'Ø«ùØÒ“ 3ìçüC®Tp%À¬þJÀò¡œL5n2w ¿~ñì¨VD endstream endobj 267 0 obj <> stream xÚÝÙŽã¸ñ=_áG5vÌå-if7ÀØ äe±ý¶¥ih`[=– æëSÅ"%ʦZvwf`Êd‘¬‹u‘«O+±âðG¬r ùj³[ýí~õíOz%8+y¹ºÿ°†•zµÆ»º¯Í~iîÖJ™¬ÂÆf‡¦?Ú¥sø§:{º[Ë"ëúþÔTEýºÃÎÏ«jÛÇSµ­«Ú¯ÚÂp6Ò·»§mÓ¿Á_yÖ²†…ÏýfKû˜¬>U=-Ð|~ÔúeCgþëþ@‰'H1cA'DÉä<ë›ÇSƒŸ¶Gò¬k{ßÑõT]žÈýÀÃpCME Ýéx˜[¼‹ãš4зûjë»<ì¡ÙV#s‘€oe$Íã(G$å{ Ð0«ýð›Ô%+J?þ]j¾È™ñã œÄ`sñ×ä ‚Éb‚ÂZ[ÍÊ2–BµC>¾wâ“úL|9ˆûM¶¯¨íâ{³GîT4ɳÕM¨›]€<ÐÇ¥FЬm»o*awk­9é·$ý†æR¿Ç¼~ÀA¿¤öË v!É<&öL»e Šû´­œBóQ·y¤Û<;”‘=Á§ÔÛAUgãþL’’a»kÚŽ`¦ì¢QÏ­’Nö\®D {sIV³ÿtªüy±Q2«}ÛôŸNÍ~‰¬¡Nÿ+ÀÔí¡i¾sD±ð…NÂgÒ!mötèeZk ßátÚÿÄ¡ÝT jÄ=X‚‚åðÿ{s¨`ivˆš]Øzë;p à´¶ñÆžÇèµÌì<ÈcXÐf½³L8!Ö¨Xz8áÚ üvßÍÈ¢e*¤äßwTnÛV5­ Y<:Gq7cíêÙ`ö¨ÚäN-°íOï]Ýn8 …(³î/ÇÍô4a–Œ¢b;„¥7SÀR(“/hÛÀÒÚ±ÑXjr¤Ïâ–Öm;‡kC-šÕΣѽCi²Í‘zPX±fjGuŒ“#jıj{Ò¦M·ó}›nÿñÌù¯€œ:-w í©-!ï8 î¤#8Ð^êaðÌâ÷¶b{½±àÆ:踴:<*‚t†Vû{ß¶°>b¼ß´Ö~úÓ¡{¿mvÎÊNªF(`»àÍjß[+”püÀØÀ[f‡)qðØnN[´Žqx„hèЀ¿TáäIr–3‡í³ʹXh.Ð0‚ìsìó¬ƒ}Æç`¡+²ÃØñ ÷“Å”Ì/8=Ž,ä°ÅèÚÒGrÎjǘ՟¶Çjç-·…!à‘D›‡ 3ß-cw¬sŒÖè·I”˜ŠÁ8ú,®˜®#Yˆ;ª0®W9+s ;r {„-DjÍrˆÈçËE,“*µHŒgÁ”ùæE˜æÑ&rSµ„©N-r†©^”3P}{·ÖR“go“2ÒxùM”Û9Â÷©\ôxA¸“Ð>…eɤ}­„b]â˺ôεœ3®â³ö8ƒ |VÓ!€}‰žf¶øÃ¨: Z^êÿ—®'H·s”ÿ®Ê~“:]­íÓ¤ ||Ž)»3ó¥o{-&!à ø<§™j¢™:Žš¦™r¢¹¸zyÅk#eÆPa 56üJî¯Ä˜ç>#Y5‘¬žªk)G†½Ð©P0ÇPGÕ4&júwi•àLçWø¨ge ®—ÁòòŠ=æd`—eðŒ;š—ÁÁEågëµ|¼~¯ÌÇg,Ý‹tyC™RóÀ•Þ´¨·6;6>tU¥fzR¶™fÖ]Z»ºEñxa#¾MZ(ClY(3{$x"Kôv˜ýÉRRW¶`ÍðãŽ1oik—aq>¦â~jhã寥í³â‚ñ ï ÌKLÇg³A›ƒõ‰é9¢O5;H\L1©Ù¹Ežm«ÚùÕ?ôYAë¾À‘;fhU ÌÀ¾·¹S9×7Bò JT ¹@€ªGaŸ3íÃè>Q‹»6Åáʳ® äëSCA[Bž[Ü Éè¥TSfÒíú¥ÝºÔW'*Áx™‰‹(B|àœÏD^¥¸=žU³ÈÃÝ5/ xœI0µ–`'Ӭ忿$ïkð®\Чöÿ€wòÞ-ÐrM±øfY,¦fj±ìËD±ð«Ù€ÿjI,gÅDÚ®$Áþ”¬ CðÝ`‘ÊàzÒl¼äÌÚIš3mbÕ¸Ô—¶zM Å‚éb¥ FV^`ùý%–é8V0#b^ޘݼî .x¾œé¾MfQƸ­,cýQ *ÿ qé>°sr?{wŸuڸШ±l诂´æÍ–µàîâçM/jpZ(»}|Ÿ»þI×!½·$϶÷nÍ…4Þ%Ÿù¼°AºÊh839n‹ù*c‰›?Wz…7»ÄWÕ3æ<‘¹ÁšþžeÆQ½Ùð_IúÍuFµPzÑKÖ|ê5¾ùMŒÆLéÒ$RýÒ‡åk•»K•—ó§aÜ•B%o ÿü.3Ló³ÆVèm¨3 ŽW«8cØ´ôð‹ìmG×yž¹L'Jð’,Ñr,½m“©•}>A)ƒz³Aöféù€¿Á6mŽ-áxL0ÝŒþ³{ìÜÝ—ÅÛ]%|"FŸ“Ô»ü…´ƒ½r¼Ã5öi Mà”C¤óBÏ¡–=‡º±4šŒÃÕë­’ZöêÆ ëkPý =‡ZöjÉs¨gÒ k¯S(yf¦ÎVÉ¿Šî'+ÿqªðã=½ÛoI¤”hk™¥^3ð"‚—%į`Êøå”5î…ÙG²žø~(,üiÅTY¬þãÖ+,SÅj·Â…Á&‡Žíê—ÕÏ#$“«µ€Y•Š?Ì0Âtò€Ìºœ&!»k÷í®ý|Åä¹[T{Ýw;’¢õWßÑû–Ôc7˸Ô÷ryøÒƒ«|gD6ÄÔ©×wQmÍß9J®è¨•áÅ®úü§%'Ö”:7‘lCÇD¾±Â ¤)#…ñ‘&”Ó ÖÈ·Ë‘—Ѹ!hŸ’œü»ˆ‘‰}»ÃÐþ‡(JmÛ÷µ¯ò¹·Cßµîʦ{—àáš6Œ^ x˜™1 Š1«Âsˆ7B±öXn ík=@G̦í†:#=ÒÁ‚¤ ÓlZW™÷SNþÈSßœ  ³NŠHˆ´sD:Ü#"/or!X>K©¸x2(³v_7Ÿ«I9O­ÌÆ`.Imü†-&5~ÃöIYèÌðó3£gŽLBè笓rGP?<~z ñݦں×R“/ª3ó…'OžÉÈc¿0QRéòµÕ”•«2€þü—ÿ&À endstream endobj 272 0 obj <> stream xÚ½]ܶñ½¿bµµI}ÚéC$EŠÔIê{ËOâd¬¤µ´º^/Èï g¨•VÚ¬1 ,i8Îçk7Ÿ6rÂ?¹Iü…›¢ÞüívóæÛl#C‘‡ùæö–oð#ÙÜ–?ß<Ùú°oûí/·ÿØ|sKØ2Ÿ£«\D¹C¯«¦ª«g»½‰e´wßâ[<ÑãÁ¥ˆéûÏôØÿ­?ï¶ïÜÈŠqL´ÍÓ„ö~(ºößÇöhö|F?Ô¿èµjéеåpl#¨Ûòóá—ÙÙå¹êNg¾ù6šH'c‘GÀE&bí¸øëö&Jâ ·ÍV¥ÁÑ6;¥È 4ãà£-ŽÕãV%%xi‹½é íjzŽÈŒÛŠíMÉàƒÛß„V¶õNÇqSßÌÀpçàeUX‚ 'šWaIÛƒN€S[T»PG…)Û×°’çpŠ{ã%õS!ã‘W«¬ÂÛ糪¾«ê ° U¢„zÈ=ÒàíE¸LÒ[é³EO.IÞ¬QˆE²"yrIðfÍL„ɵQxÝFkµ1†gM]ß…§Z*™/ÒÖ­­W3šs¸y½vHŠB…/ô¨è¢Ä¯)Ñ r÷ˆý×êù:¡:c ¹$ãZ©Šé>=1àci$c gQ`\8—˜L)òU=®Fçeå»UP©È¢G˜ßÓϺ ²ß=#¹nƒhÝñ™).ÚàÅô3mPPm]«Pß ä 6ûj®EÛ 6ÐJ$É‹¯å¬Ä:rÄà6˜ãf.еPjZmç²6¤CWÙæ[P‡ü}ûàŠ6hÌ aù´§§ ïœ_ámè)©Â+'UO»*Ææõe ‚”@ÔÅé¢ R o&FµùÁ”£æCx|æå2™¢ïÂ0\M—J‰ÈǤ¯|ó±0‰L…ÊœMôõÌ«¯}=óê?ÕõõÌû¹¬ª/Àêÿ1óêë™W_˼úzæýC6J&§„ÙˆòÕª¾&åâ«•{á@.¼ì±só¬¥v%E†e-Ý¢¯ÇÒÿ±r»¢Ù‰k:ì]t¾¨·}qÖz(UÀs>ª †ËÝŒ050<³j\ãçÛ.|Yö€~6w£žàŸëyuA‡Á—Z§û¡™ò,ÃÕ W˜P†¬¤B`ð³ :ñýœM ¡“Z©›î× ÆºÛ‰ewöë ‘ÓîÍ_áT{¨«‘]öÌSí§yöãF/3ÿ•,¸š_ÛK3;7u!–ž´ŸpçðëqËúM!°ÑŠKJ¾'Çzò a@A T+÷ŠŠ¿c¤ÐW O¸h¥0{7[ãz‚R;·oiŒ ÎyûpAÏN1*‚|A9Ô¾ýór›¨ k’—„Áwý‘×8ñbÚá³ÀðÝuVåH'øˆuf ^5w¦zâ3œÝ=æìÎâÉj‹8ÈóGçÆä ÷mß»siÀ‡Á¶¶>°«À12Ñê'zß:Y“Ì 2ùZµ‘Žj0Â]Ý“r÷cx~H$˜ÒÚo‚He¼e€3¿ô5éÖË»y=14ªà4:Íj\wQ¯è¹@©Và+TmG>Ùy'ð꟟!uLÅß r¶™t¿ ´á~QŒYm‡€Ò’ÌøëN¬I&‚»Jf<Ò•û™—ø¹ð> stream xÚ•XK“œ6¾çWp3ãìÈ$vœª¤â¤ìƒSŽ×¹x|ÀNX°†gwSþïéV7ŒÄ°Ôn• »ÕR¿?&øÈ ‚?˜þ£`Û?ŸO~•2J$* Î?-#‘Ãsù>T¬à5Ï÷U»Šóp_µ›D™bµNRn‘ôwµ]%2ü¼úpþ*xq| D’gÁ?¨)‰D’M ÒTÄz|ßoƒ7G9ë4p|cŸAHBt¿<À+E9ÞO¦(£2ÇöŠ[8ŸÎ~ò«+—H‘ÁP¤ìšM¢u[w,ç)TR˜œ%Ÿ.(’öjį®.û•ŽÂjÀ ɲ¾LD’åŸ8=é£Áã»k´ëAKSǃôî8Ç=ä3ðp²lµr/™ð AD®ÖJ%á¡)èœ JÖmY])$‘ºËÕ:6á¶îÚbGû¾*V0 3 «m½‰µe½-νøÖáðÑÒËzËzJÞ8`î™cî¡9k°`-¡5e `&±ŸŸ-DÓ::¹+ŒÊbª<%YN>ÂßGHÙm’4ù«Fc“<"gXÉ<å8ù¬gÛ½hÕ-šà•—¡êiçW4µêY[iÙY¸ »Ë®H’î(nÀ&¿YÃ×ÑM¡‚Á¢mUV ¾Åa±àDc„Rw—‚º¥ø.6/ø É6Áa]Sïë²6+Áz2GÏZÆZ(íFðÅUÕ\îØ&¨¯Ó>O9]âéj­e^ábÂïi¹&âÏéUÒR´%=\ûGfG3öõŒM©y©i”Í¿5IÖ-­¿ÿñò·o#÷²¯›ªÝwïëÄeµ¸ïÂÝ—†¿¼x{þHàN¸OñþâÃm§Ó¡étèË3Z/|²BFßžÒËÛ÷õÙÅÿÐwÓÅP¾¼ëÏé`?úR‹\¹1û bë“j¶Äcý˜$@R!÷Rr˜eýp‹˜eG²_WZ‡Å®ë‰ ÅzØí >™Ey¥¢†=³¢Š[Š yÒØJnF£­“ÛÛbÌpÏX MÂ0崧Ž+ì±ífaÅljö©Ø K"z”9#m®çªï;G¿¥õ—e¿/ÊN°-±­r'px]m2¼®6¹×ÀéV¿#¥eWâ3ŠjN½ØÁ]SðKA_±a-™G=}UìêÛñ€‚µ¶Å@W| „¹·ÄêżCcEg6¯\òꛋ”YƪØf¬¨Õöà&*ªa‘%cS š€:Hƒ"›ÄÄ»}}¹+,ÚuÑÄŸòZ`ì ùDÈqз é’ =¶óõþªÇÑš‹ÔxéŒ3Z*Wž'Hq½¹æ2|] #H=^¹éèu[ h•hô RfH(NÁáyäÑΆ§d­u»Ýê~<‚#0Іš.‡©ky¸Á©B¢mqÚgÅ1Aî@Úv}?æ,Œë±¢…?{f:‰#aÑÙ] º¬ô<Я!´¤˜»š :1D2б4¿F':2#¸h¯q½ÐxLчCéìPj¤YÒƒÍÔÂNs6G'2N‚í’†bIÄd:ñláF í!JïÅó“ï'‚ë/  i¼""ÜŽéË!ü¹ÔÇGk¸É›q¼5Ov£ç¸…f¸¥ ½„ëéZ½FixÃ:k”ÈáËÀÞZáéX €¶îEöN½¹ÖÎ\C§¬qsh)Eâ ›at§zøNéä_Pâ-vëÔØI@¼üÂcÓ û¾°í Àƒ<ÐæÞö È9x=µÐšˆ!k;êhïKt¯“’k£„ô\Í€\ÞÈ£ÿ Å•Q¤ÜFÃ`ü£ñç“^1ãzƸæõÑ LŒ›Ø;v3Ö_úýf„ýÓÏý ¸y3cnVÞ‰žY„Ú¯F˜]|6»°°›‰íË=àZMàÚæ×\cB ˆö™QgÍB{Î1Ü=ù„„ÚÂ96 ¶jܽí+‚`£ð·OÀ·âÔ“y(°c, k2ö²({gfoà`]а6+»üù©ë›bÏ0»äy¾¯®F¸¥eÜ{ò¹bAºJ©½)3Æœ9Áé{‘Ë}X-z[‘–TøêèrT:©°ÑJÑ"ß+r/Hºm^ >¤-˜€í÷N°@r §ØŽ½ðNOýº£ÖùF¦ez2 ¹Îàñ.Š×$f kôí@W¡ó»®ö®=¨íÆ‘£°;¹ŸÍ t Ý„¾rhu¯\}Í íªhB»Øš’`g wÞŽ-ñˆláÅC¶¸ùd ¢mA«7àOZâ ²îF¶'ñ®Áë**± £]ìÔˆÀyÞ=Ñ«è>Búéð¢Úó®Q²7ñ‚r†Êmn€¹qSc,iL«U“”f˜É;Þöîûã/ngÞÔòf:Ì}tð]JøXÉQôÍwÿvNå¼ endstream endobj 278 0 obj <> stream xÚí]ܶñ½¿B=Àµ¸U$Šúòµ.ÚÀê ‚Ü›×(d‰wáY»º“Vîúÿ÷Îp†ZrW#Eûø`Š3Ãá|q8à ž‚$ˆá_þâ Ù¿ ¾ùNIUqÜÞz“<¸mß…ý‡Õ:˵ןV¢ûÍjµNÓ$ì'§m"T‡ÇAã&•i­Þß¾ ’,ª$0+£,5Ì~R«µ¬Á± õ^ñ×&Íú²8³qŽ÷hê®™:`Ÿ  LªŽømB©è&y63húÝôCZâP‘óXÀFlÕ~°¼{»+ õ~Ð&»s«\¨†µ…Ñr³º6z®­¢i”edµÕZ&¹c<š2)š”lÝéº5ø,|„@ˆ¨ÍþEHH·°>Ûif¦xØzT÷“nk°‚Lq6̰ÀKmÒBØ}fƒ!)³7„Å a[r‹º?G0j{ 51BD[ŸæI¸íÇýJFÈ  ¿­ÇžvOôG2è]XHžÐLÅa,wÆî=²Ÿë‡ ÜÉmÈØ=ú­b…‰ØX ÙñG|fº3­›~ŽLÒ4>OD?Ò¸ñæÃ@€$TÝmý…÷ Ä Úi¨lòóƒfŽCâÐö¼Gêø¬ 6!­'.Ps¸‰š €#>ï‰wÞ¯­|g˜SNâ¾&Ù!å‘H Àƒ@ö§nï›Ä²LNtzsK-I‚DF©ÌmJe £¥Œª¤¸ª}g<1° Èã  zg>QZ•Á¿ YDEl™ç‘Èf@üüx¤ŒD° `âÉ*KFVNÒMrC”gQY!Q –à›ï\Ê´ˆ¤IÈI Dèñ”ITTLùj|y×pÆ—ÙÄQf7¼^`S¡ž_eàOëý%vÆ>;¹ÌòX„†<Œ–¸g.—ÿFᦿ¡ä.ò2’%ø¦²§äw×ü¯]óú×uÝAn_·ýº6LŸ&ýi‘c)¢XúÎN³** r¶øÝÙÿÎÞÄBþ—üíævÌçqædm ð2·{ e%œ«€NޝüºZ@ÐdÕrȸ¶—©Õ F™Ò½‹þí*%\Ó»Vj®UÔ?š" Ñý®îhÝÓ¤˜ÁHe¦jô&NeÃ|{¼*ÓÌi§Þê†ù´¼p´• _¢æ N¡DW*ÐÜÝ,x2vKÿH?þEåÙ%K®Gàã¤êȨ©î2¦Ø¤yÚ醉›é‰ÜR#.–ŒãìRAIÙ*Í@ì 3[Åöò1V3ÙPAˆè^l&£“k)#,3´õ¢qH a£Z[”-4^„h™ü¸=¹·0ÿÏ,F5p­ºÕ{Ýbñ}ÍCίç*Ès2X °ðœ;ŽC¶˜(º¯d o§<ª &·&i>+ÓÛ¥Üõ¥9´0`tó5,ÏŒµÃ1(FZÄj?!õ Ï—iD`jì†kÈÄTºÞ4è­Ù¢#î!3øGâ[.~—Êe³Y*ÏGG·î5G MM¬Lxj¡…j¨Oƒ¿w[wv¾ðW]~9ÁÊ“üZú4Ílß陑Œ¹‘1w(û‚ˆ¼^ [< )uý¸%%Y+Ÿ1õ€r¯¬Ý,A‰ëÀùfM¸Ç±ø”õ;k~€´Wc>lëÓgP­†cŠ™·­±ã•2ü—hÌÆ 7“ˆe”7'—ñåú~ç¨.ÂfÐõ`›3‰~nxÙç5)ŸÛ9YõYÛpQ»§‰¯ÞéEf¸íRl|k97µ/¼¬…ÏÒ°n &E;52²0ˆçX…¥FEœzîÌð^ÔãÞ^E`÷ ²¹ég˜I88Ð2Är!»ÀÖö…‰Ø§ðEAWƒ®5v˪¯;£¢±„$=àp»gÐuÐ{ïØ>ñcÝnë Ú [tÂ15——Î雃Ú>výèwÂ'ÇZ&‰“‹Ûu–äáË:|<ÊðµgÚµý7›ÝË÷ÑÃ]óŠ]hÅ_hx¥pÃÌçeD>ÞAÀFW¼óÇÏ×DõLÓ×4\ñCôúûÃþêæüE†„ûEÓj(:̺0×üöË+æ{×M‡ž¾ñ”#Ñ‹‘攌¨ Q?3Eë®íV‘wúúá=½²À•¸B¾~M (øúÍZÑÒ?±PŽŽë3ýBãËY!<Ï{,º-hr¾>Ñdœ¶¿<0hGto¿¸Ê]6ÿG_ªò²«Ã»ã{ÏýWžÊ›Ps0Þ}|O°?ÓÓ°ÿY±,W嵪Y­«÷WöMöÌ`¯œo’Ôëç(ý |EÅm¢är6Ç"CÄO‘H®·ºÃ4&Ê3‹,Z=>v5Â?¯ÊÔTIe…yÛ,á4Æ/^=cUÇ9AZ0—á2„76ÅŒ-×%Eu”e€fùÑšr“-Y–ßù>••×( ܤT€ûbæœ*­©ðëRNMM¦—ÕY_ax; œ.¿ƒj¦=UU0­™û® @uˆÄŠ ¹çè‚ޜʅ¯ñ¥4zãè5H%]%8ž4HÁ7]úâÁˆè<ÛšåŒ;‹ aájkæµåØ ¢|+ ï­!ŸKïÝB˜çÇ7„õ~Â4ìv\I!NÌáÿŒ’æüÐlFk¼mE~oxÝ¢Ûë-O›z4žÍéªȱ/‰"n5Ïü"1O¹Öû Ö»¦›ô`÷c³4×¶£‡ðé›ódE‘áà¦(M?€p¯¯é¥Ú<ùs Š%!‡è¥CƒY¤Ê殿ͯIã_¨k•dL~4’qn©¼BØP×Dí[ —ûÞ…V«*£¸X|x:黓ùaéìв;Öné1À".S!ÀFP<沤7yaIüÃÐQI> endstream endobj 281 0 obj <> stream xÚ­]oÛFì}¿B3P@â«îôb¶!°—¡hÞê>¨Ò%UjIŽÎê²ýï#”,Ér—-CƒžLòxü&ïœ{G:ü“N¬àÏsòÊùåÚyù:p¤'R/u®o½Á‘s]¼s÷mY¯UìnÄz(ϽÚeëŠw뇒¾ò¦ÚÃWì6æÀÈBÓúE· }5®©[e¥aš²Õ‡òó: ÝÌ\,ñÓ}ÛéK8Szî!"÷`Q±›gm–t«™QÓe½õÙ– ƒ¶®~È5lxý;¨'Ó‘~A 郚¨ß ¦ QÀèíúÂl‚Èq –ñEZÔ}:ú~ê8Úoè;oöeV £+ú°J¡Æ[Ïò 6Ä£M¯€ »þQôÜ: ‹ ©ùÃ’%®6{ËZçÞQHP3e–7vógüO·$¸eì£FA­7󬲺{c­Ñ¿© øƒ\·+Çú¨N³D\°õæAHÞ´m/qSšTÑÄ“ñQ•žOÍ«Ñgt(@o0„R0rÓSwÄ÷¦i«ìÀPMË ¢ÉÛ‚öDÏÂÚW¢ŽèØ´øÓsAúnׇ£&XmIÕØ}’-®÷ {„ EÀ1‰}{ÌÏè Ðâ[nŒÉ »1õ݈ %š…lLagÃ0Áxlé£3`\CÌк{ë2#XÁ\ø CÛìôHX£Z¾½†¦Wu°(&4×m.—3ôDrâßÎË‹¥ý‘ˆ#Æ—ÏÛ~ó¼í¯—·ûÿ°½g¯ŸwúÕóN¿}Þé¿-lO…Ît›lO0Fo¾-<6¡š4Cñ ™TœÆt6’ÑRiSñ§áB’=h*‰šáºžŠB·Ì3Bb¦Q CgHÕ8ÒmFA Ø•õm—ÝRP\$VÚÛ6«¦]@¹¿R‰¸º¦Ž,¥#áQß’ýH„‰åé­¡G§©ûKb:*‰ 8æfÏêÞ~š8ZaäTNEB…ôkç¼uÞih¡¼HxèðÐÀBT$ÔØk2²41ˆSÖð¹/_É”‡Å޳º©°Öårc–"N™òr|CœèzPz‰U T¤¯ØO2*žöÅ÷ÿ•w@¬<.‰ŠXž;8#5Dº_Ëß@Ñ¿7ÇWŠÂW'!‚‘B ŒÃ`PH¨ä(¦0 ˜t:W*ìÌ´C¨£¼4gúqäv6Sãx6X ¤„aâ!Æ ¤¦VˆÔó Aà®"º‘ ^ðjº^”93*x§éç–!é€ ø*Œqöüƒ{ ©1™*JÃE€g šåÈ#¥¤á—Ë“™Î€˜ëÌ\ãI×ÇÄv}À6Uy(a8Ý®—ÂÉÏ%OSv°'÷ø sNI¬–Aš[zÚ¶×OçÝÁÎ|Vèæ}ð<5›D|áH½¹7 Þxµ ã†$º¢0‘DCド1¦„Œ&K84ÅI‰Dš>-í}‘¨‰9q°µæTvj»ï¬ê¼dHÁóLu¼û$¹nûéºN6G×|ÌpÌ'?@8ÆzˆØF"Þ`=„ࣇ¸žJLnDì3ér€žóÙ™±´<%óÅ ¶M_I·_O à+o˜4ñ&†êc>†qXáàÞ M;­ÈjIdeEÆÂïGlV£]?á•JA¤—f¿³7¥¿Ö‰ï2ôx£&ú̼Üt$EsŸ±É¹Œ½zÐÕ~טé1Kp?LEÍoÊÈ}ܺåÅA(±ÒzuIØ’~~ÿ#­w_O¯J8‹ø¾U •BºÕÍÎ^…F+Â^Z÷p}C Ò>òïÛí¶^]°$¼Þ]ÑÃ;ó=e5Œ©˃é?éhïO,¶×Ïó} ê SNM"…¨'ôÁD}Þ»wlºÉ>R}l"¢za…1VàðQ×D·z³"Þ6èJ¬Î˜ƒÎÙº+´çvýŸ´±c5‘øý0p›–°Ó”…È•KÅ€ö _‚ɲ/ɛРÔ%$u=ø=Û)$Cû–„Xê8ö˜q‰D”¶O`’Ë…K¥?ÐÓò„0=œËÍbü"1V žíX¹ï†§¡»©Tq Ø‘¾žB²ªÉЋ¤Cë‹GÇ;ÓæÐíwý[ÉðÒRßuÃK‘}òÖ~Þ±/z©û³1e5H|ÒQÒIM´öPÜL’¹A†Â¾ÐŒ©!,Œ'Ò$ßu%S —é‘¶èÒ#¢[t_J~\S|ËR'ƒ‘<FÇ7š3OÓ+ר¼J%xÝÚDß¹üžôÍw‡¬[§ endstream endobj 286 0 obj <> stream xÚ½XmoÛ6þ¾_!ô“ ĪH‘’ÕìKÖ¦C‡¡oI‡u?°’–j,ײ»ÃòÛwÇ;Z”-7k» *™<Ÿ;>÷BÄðO™„¿8(Úà‡ëàáS!¡¢D¥Áõo0?q”Ã{ù6T‘3øçáUµšÉ<ÜV«e¢23›'©·æ}SÍÞ]ÿ\^ƒ(ÉÁ¨"‰£d´JÓHj÷» ®‚Wƒ\$a/aZû¤´“"dy€`â‘¡d0×2ZXlÃÞŸúb‰ØŠ¬º¶ ‰MS›ž…GJµŠdÊâÏžO¨Ï,r(f:»Õv3Ó"ìSvV¿Á™^®¼å,Ïxy®§í“›)‡f¬sì‰E$‹=šP3Y¥èÝ$ÒÚ‡þûnµí¦T*§ïû9™ôvB¯>hç‹v=¥GÊ(wî?›ðGާ}ìŽtïqèì@[>­íàyG–M):Ekô8ÚïÍÝ7£ù_½óy£ÒüóV¥÷[åpœ[ð³´ÑGZ~m´¢’°ìÚe¢õªždmžF±3ñÅ›ë)ÊÆˆà(|c/|ã¯ßô? _ +?|«ÛõäáÉ$J³o>¼—’éç)馿Á¤/ˆ²ó£ê„% H3T7àW¿–¡ Ò^1ã¯Nù»ãŠ$„H}ìU™G±sð[ïw-‘~ˆ„¾ng2 ßÏæðÿ2I“¦.:Ž C"Y0»«ÆœO’Én5Ç —3½Z8¤#‘ŸÄÔÔÛjcޛ᦬jCcÝ`daQw+'öqÇrU¿&ŒE½ŒUðÒ-Âu_íJ°N­êöK­³ =뎆o¢Q6e"o†”¬úœ„aÔ«²º5ÐùdÐùÐ}Fu4ëáàDÆ'º{oÇ˺¨NšJKö³ {ƒkJ³œO~Nvy^Ø·2êD+Ó×7+¶›jãà”]Ï6T!DÀæ0 ·Sši„´·‡pH×ê ]'§ V}±©>áYTÜwyX«v„U2Öì«sæ4Ÿ,çTÏwŒ[ë¡N±¤N‹Ôê€X85Ø,l †2ÃáŽÄŠŽh¹q•ÌîØ›’wX› +4ìmX‚ÇFÞÁ%-°Õ›¬ñÊOkê=%¶¦ùPõgäÓÑi\Pû%Ñ›S/]:^ÿÈ/›Jš#jBÆL aJâ÷|<,Ç•S‹”íGýEgœPÀÓâ¦^™/°ÐQ¦FÚÒä~ Ђè|´jÒq°¤—ˆO¶Ð7 1¢“’1ÑIÉÃ<…S'è„£¼ þQ*!Šá¤¯œFÌæf×VD-V¾6=Ñ ˜ŽäŽè‡“¥¡§—'¨M˜“E¥.ûíɬk­ÉÂ÷L'g ¯<±Ò%ƒš'ëUÑìjfã>Ër'IÑ” ÑÄ©Ëía¯9u€ñDVð¯S£:“ M §ƒ”TÝñ­ä'úŸ…Õè\/Së‰uƒÈTVX»Oýƒiñx¦îk ãæ—CS@Ù]æò°-žjWr¸%M ‹ð%nlAî­è1X;Ûz[3 y²xäÞÉ{&bó]t­W8ñT›x‰vÜab÷,‡ËêDðˆHŽÛ¿ÃH„–HNsßGªq#*ÇA‰zíNßJ~¦¥êÀG:NÃK.Šv#¦¡ãª¶”?ur‚o:RgI©“ý>¬uaÝcw#ÒÓëód_+Fìf/<¼öDÈ.ï@lh å€i"Ñœ&`¦¯nÜ+Ë’ùJèýj(›²­ %°èŽž%/¥ü%Æå·âD$˜å‹=Ë­<ïàüKÞÝ:À.óHOÑÍØ¬¶ >NçÌ»TXǦñ½¼S‹ƒKɨþGi2ˆ†mžW½Ý 4¦ç=øÁÜÁM;ƹNëð÷j»GCOì‡A[IAeÝfヺӡ7›˜¦ F¥^ :ÿcP×r7ên~KïøvoTP'¾)|íõ¦/ÓËï¨=M‡»ãáönžêÄÅóèr Ê8±ï°fˆ ¨Ø’þd swæÅ¨å´ûzø.o+Èú]ïšãO¡p *É£Ìÿ:×"u ±^ìóÁã«_Ðì;ý§hòŠøÑŸoŸ\ž½¼x}ñîŒÕÝ=yvu}ñüñ³ ºÍÃÍ7åŽâîñ›«ëüÙçhÚƒÎÛ5^½æl½œÑ–õŠ‘üEbx/ã†×ýZ;€»dœë;D}âí[ØîÝÝÓŸßüúâ|âÜçøõÊsÿ™ÄrÆ¡å>xã Ûƒ¯œº73ìˆ Y¦©êíÎöÞ’ròÁøCt;‡½¸T®u›R›zVÄ›µ.bbÀ jqmÔ&ä€(PâFÙ‹*ÜcÍáºe®Ç£²Ÿåz$µ2ˆ»”¥| ˆ‡KÙdˆî£ÙÄ—ç…hÄüQŒÊ~¤™§Š¨¯”}õÝßs³)œ endstream endobj 290 0 obj <> stream xÚ¥ZÝÛ6¿¿Â×{‘5OüÐWz/ÛMÈᤷ›E6ŠÍl”ZÖF²Ó ýÛo†CJ¤,YÛ V9šÎo8$òêËŠ¯bøÇW™€ÿñj[¯~¸[ýóßpË9+’du÷ú7Ÿk‘EÇ[âè4vM»ÓPx¿&10rîOrVXÍ­ñ ÿ24ÌÄær8O|ƒÿèí¸<¥"i4…3 )D!fœ¢pSœú^ª¬ÜBü$NU¼ *àÎås×x ˆ:ƒŸ2h%<燰£~ýUåʈ9ÿºîL0!Mºp—`p4¿S–%žÐ*Âw«/+&¡õ×W S8DÎ’U½’˜ºô°_Ý®~œTà0Šú¯fVÚ¬<,Œœ)Œ\ΠxþâÌ Nráéî.ê\±¸”¿¹þßõ¹ú4a<óÕ»†Ëê!ñyúþòöîúÕÍËs°ÉSÏFßpц”’åa|nÞÞÞ½>×o€é•;˜²K0©A”žæd˜¬>¢ &‹&ÂÍí[]{=«5àã|Á@ë`á•þuósÓþ2­3áa}ÉDž³8 L–Ì£jµû(_Ð.a¾¦¡v¨ƒbT§Û•ΕXêrK@¥fEzPÎ@ˆÜ"Pƒ…›OÕ¶|hæqê-À-â4Xà,›ÇÉi[Äiг8ŸÁ©×= 6‡S.a‡Qq[Â)+p)xNÖÀ·Eœ wÍ£þ¥œ‡Éa[„i0ÀY>“Õ>‚m¦A;ÀTÌÀät{˜ÍÁT¤¸á©G¸-ÁT–ÙéT6Ï+=•îg"Dn¨ÁÆråëMØ-B5˜¸Xùœö»E¨íPù’¨zÝp3P 0¡|¤èÕ¨Dœ2)Ÿ•31‚n *ÏÆRíë-„È-!åY¸4©œörKHyÚ©x©^·ÛRB²ÂŸTôîR¼`ùS'Uo"„n©ÁÆBõ È-5€AÍå´‡È-5h‡ê—ÍÕë`›J1ÞƒjŸ<'ÆdH`~zl°lÏ5„é1¼K@úœêòŒý %ôa gèc‹ôÁX¡kx+΢NS£æ– Iär¸ðyP`Oç-=¹>:Þ!“–»“å[0QD_‘bпÑד&®¡¡‹§z»Ó‡Nƒˆaz 7›Šd÷Õ®¹¢Û¯ëDEå¾iuGB&.§ɰ¶Ú6¶µ9‘ø$ÓQßÎÝ ÔCg­lOŸ-i´±ð g¤cðÅ$:@Nâ’"Úêvk£ O.M‚Ûf¿Å†OúèÞ=”$yžÐ í5ú’&‘VŸÕ`¤&éSmÓ*‰7ëô9L$fŠ<uoާÇ=`¹I„„­©wóIE{–OXžùL…É7• ,»ÙÛKRÂÝyž5Ôa"¡Ò‰H¨dˆ„‚ñ"k81R!anåd¤cßÊ]µ­ËÉ+Ö¸ÞkdËr]ïQ¸¦Þ]ÕuõÉ Úç%…H(snòB4ÊSTËMšª\ÎÑ…Ø…¡U¹°ä$¶øL>—à‰ì¶20ÒMM§šË¢*jm¦œQl¯HÁ,{Û@aÁ—Êc[}8Ásâ„˦ŸïQKÎQ•FD*e#“ØRí,Ä~À–ÑkI jš<&š&dîªG6̸‡AÚ7.u:ëB99#RŽ»ï§çIIvzãåÖR€T^2ÇBÃŒÈp³è¥Ó-1[P»J*’®’ä=­ºvu `¯ˆL´œb§N•©;Ÿ$Ò~5QÄMÚoõxæ"ã¯Ð°…ÉRß53í ðÔ­! Ï¢—¯èúcì»gtKRÿÚÐã»ç/®ÂzEÏ»ß{ÆÉ¶l7üÐ÷ST"†Ñwƒ9%iB*o‘SÊ5Z”è;¾œJJ=å3úm0õ¸¬½-á–Ho¿ÑÂÙ”õ_?&T¤,sý=«7âåÅqs*ܹ õ$Š©¢ÿ˜1¡'ÇÍGè›)¬p…*çK¸˜¹€ßGSÅH!JqbDßÃn4…I:¥ öÿ©Ã÷~=ᥧ ¦™â¶h¡ƒ¶œÃ¿Ê!4e¿žCúëùøC¢­$™ Wø‰€ò˜Vn§Ru@„¡J½¦Ë°‚ºƒ¦ùìƒOˆ_Æ”zÚ6/o¦Å^Í’–Ú%Ís&XÒÈŠò-çø=ÙfË’ Ë\6½›\£X,½´Kiá’ìýT9Ul«P`aí°‹› }¹!q0H;rÉ`@š8{BazGH‹£mÅàÉ"ȱýgài äÇ ýSxºÜ—°Ì~íW¹W ®î"UÞ”t ª)åÍ4ÄŽà8(†/Ôv+GBf®âqª%™` 4VlA¨ì3{Ì­=å˜[[õð¾ÓŸËÚºp¾Ÿ??2Ù½o9»yáþ¦åŠZš~ qöÓN[rZ¸¥-f÷ÓÙŸðrnÕö;FU‡¦µ§4è<ØmÖ°­8ûžkbÏU1I+$"ÃêÛÓ ²ÿɶÕ_‘pü‚òùsz{¿Ð•f~<•\Pp9‹´R*Ü¢”9[àÉË0­ºµwö¢a Õ±$Yz§gJ”=ÀaW¸öOùpíÏàA)/Ñ:…Æö§Ã\yËØ5Ð 8?݇Û8hÑÍíOt£éòí‡ëÛøÓ|À\¡ß1˜øcSI— 8$J×!8Fz8høBš°ÆÁ·äšsÇÄé Ó ¢Šivu~€‚£—>â´2Ó¼³9:¤½Û€Ùfý Ccçw7sÀ¸)§Bøó‘âò9HÎA : k}S›ZÕPûÎ^Ã]ƒè Ïü(J9†w¸ÂëÀ‰>å¬ðÁІÕÐæ¢ðòë\âÆ’~&SŒhŠ~m3ð)e¼ K£¨¼*6œsNBÑ¡N ³œ“1Xv$¤¿=‚:°’&4&Û¾mÚÖE Kå&ª j“m8”¦Š8WÕÄøñoÿˆ|. endstream endobj 293 0 obj <> stream xÚVKoÜ8 ¾÷W=É@¬ÚzÙnO-š ¤)°@&w¬¤^ŒíYÛS»h~ûR"5ã BS$€F$Eñ#?RNþIŠ$‡¿")üçÉ®OÞm’WTRä¼Îëds êÌmL²i¯ÙФ™ª›íŠ’-vØJUz¡dKómoyšÕ2g—óÒÌhkï“ç­4:Íà%9H”ñw“ Ã~¤Z³fß5-•ìÐLtá„éÍæ®«èdnxéPøèÈb¾áZ“:[އ=Å:ÐÅ»qøû8¸Û—5-iÚ±ßJ­‡n¼ðn3YH. dC:—ÎáÁã§¥Ál€e&eáå½¶µ½ Ö »ý±›ÐÂ{n»Ë*½ƒ‰ÎÿíÚqFS—rgrJ£Ojí=]mÑx7N`Dq‘AQ‚BóZAü×ÒÇÿ1õợ9ø·ýa£Kg{wìÝð¤òîlKæÀÝî´n-ùiâ¶yjX¯k(x.×qy"¥™. 4ÇýÒ´ã[v{±lS'.]¾üúå'®W_7hÿ’sþò5 oÞ_^àÏåáãÛÏois žn>üùõ¯«7Êdªäu¹èÎ:ÊR3Zì¼›ºÅo ‚ádïºj8¿}]±cÿXŽÖÈi'÷œ²¹ D˜œ‹@î-‹ñ_q¡ÈàÐ wjóW(^oixÅep6Œ#õ‡cw¬v¡tæKÄeÍKIê3pBl)‰-«D¶„ÆÓ%¯Ôºñµ¡KUÈ¡Rf•e·ƒ¸gØZܵ´.83™4=5J¸fùÞôë½Va4!ï/#h‹âlps@*Ò;BF\ˆ’«PrsQsS“Þ38æ£âE¸†#¶+ÂH3vœüVÉ!!Ϥ‚Ê­S¾ÎV¬‡+×2¿JrÃç¸*®žK9wÃyj†“ÒcS'lNá§!+ÑXÕë  ¦05—õ©±b¼–¿ f‰œÖܨU} ì+Œê·TÜø–”'Þº&¹>Ã0©Âý‡ý¸ò¥WJq¥×µ?‘††úˆkOtÌ·)" ÉËÀˆûØ4Ò¼ ^GŸv÷*<må³£í&ú`ÂW@ˆþüTVá© ¯\îfLôÇ6¼`ãWÌÅÔºp'~¤þ½CŸø"· ¾·—›§_SzSWIf€.e‚é§ÿÞ›e< endstream endobj 296 0 obj <> stream xÚ­WIoÜ6¾÷WèH¶JJ¤D%§.î¡@ÛqNh‰NH£±7è¯ï[ÈiÆÐ4H`ŠoýÞBNò˜¨DÂ?•”ü—IÝ'?Þ%ßÿ¢’L¦E‘'wp|Sá&¹kþ?¹Ã.7f^ºáê&·•0WÝý e’é´´e0°©Hâg× ðV¹h^{\aëA KëDÉ´’J+“V4Ø4g L«ÚrÙ,!CL¨ŒM(2aäK¬LUdÛ}Ý-ï¯n2kD=ì?-û«¬3j̬¾ó½g’ýt Táqñx\ˆi—ë|`éÌäÓ•ÑÂu°ÂV7… +;é/£~CãÚÓJ._“Ï7J©´*`ÍS£ÉY¸)±²)Ƚ¥‡Ì¨±­‡@%îLLmïA})vy‘w‘E±cÈtp#’õ~#‰ ž•c)9¤ltëÑ«¬øÍÍߌÃÜUÂn§™€…M³¸‰¿†±ßMûàGÏxø‰•4þÈ·÷µy· ÙÜtœC gAÃYLdpІŽÈReòF«R¼ïLÁã'¢gÔCç§XhÑqtä ÿç@#Ó Š…1® ²iËäöT À:0ÉÍc{¿ÌH¸©-H—TzÁÝß92ÉA.†ÅÁbëPИ’Z„ЦeÔÊLÔnâÏ<ÆYjÑ»6Цš¡vx?yÀ×¼÷ E& P‘ Læk¢…ˆ*v#h]:ǹ©3|.âBÃÀ™WdWËm‰J¼Áà›l»¼Ìº¹íÃFLŒeL€´ª`Ø}Døs¡€a™£q* RP± ñ\¾ÀÞø©OÉ ÄµÛåiJm‚äP“¶OmÓ6ŽÛ-•:*ô.tÏ+\gÂñéäW6©›ýE7}LÚÏäTË8aýŸ“«?<7ŸUZè0c'e”X+Ö†ëâË“º¬R'u$c_a²Ú×íÁua‹0à':ˤ ô‰80ÓYËCòn» 3…:MöLš7Ò¼¢‰*ױ¸~ SFiQ®“³0‡,Ä9<Àt†YñÉÏÛé»ñò:¦hGs=p÷<ðC£«ÇÙ>÷p‰¹`ëÞMÞ÷J¶óÆþKª³Ôd«TËuªµª(jÉÐôÏdÙœp–µÌ¸åð#$VK˜3r°n‡=¦IMàºÈ5|¸©z$PŸ"ÇYªI£ƒŸ~:pFk|õìd®ëá˜Ü<­ìåXBˆ9!'ä™zt/€K÷¨ÝÜ£ðŠ-y*."Ó}ëvæÁoÏ㤅O/BÑGõ#[ey˜Š]û£:Çcº=ÊP°aPy «—–î»ÀÍÎþó|yÙ2PÀø>Özj3ª+D|ÄÄùÃúÂlC¤_G Û9Óâ¹mAMrO•öy¾þ$ãWFüŽ<=¯KXW€ÑSRòÝY­CgB¸„AÚ<¤nzSà9Âóañ¯ˆíö.yLàm“¿em*aéܦ…Múl¤U~$tÉ»äí–=+ñ.ÓÜ{$ »ìôca3 ª2Õ¨Ô¨4/ÂHØÏ~˜»Ðûj-¡%ÎHnþ×ÏL—fX…ú ×Ó±³›g5Ô üÖ9-Ï8?n¬ú_N\ÆÑ¸Ù=ñæpßÑýXãL0<ƒ©%à¶XÓñ¢LÍ—¥óooc²ÎÒ¢Zù¿‰cáÂýùú¢=°Ê|Uï‘°©÷‹nBvcVÝ«öXÃ’e0¥àÒ(´%WtyûÝ¿0öà endstream endobj 301 0 obj <> stream xÚµXKsä¸ ¾çWè(W¦9E½vO“ªlªrØÊf}[ç@K[)=l±åìÏ^ì¦Üòlm5R$ ðìä5É“ þäI­áo–tSò§ûäó&É3Õfmrÿ5ÉKÕšä„ Urßÿ’juw*M–þìîNEU¦“z÷P˜þ ¯÷²?Á·®ás” Ç ½íÏ+þÂfÒ nÒÅݰÌĤn©Ë +v}݆·;]¥LS€ /vE–Oð]i(ë4H“ÿqÿW°L ,TY’Ý2½Ê‹?C¡q õ+r8äisßëŸï“×Dm“ü+É‹*9£ê*™å*+Â÷˜üœü´£TÎËU5@,ß@ÛZº„6¾S*< ¬•)HIïæ³›Ñå–tùüC3˜LU\-’~/ñþ‰ "«ÿq˜œt«ôN „IUi ”Èseþ+nÍpsÿýÍåè,SMù<,ÄNß_%’6Mt—²]Ð.Kt¡LÁT¢B¨É—kÔaädœKqBÜhZjUÕ×H*`R~IHÜà¡…Vº@]eá&–vnÔ•V™‰ƒ©·g{%YìÙGP·ÌÒî®ÌÉ¢Ò°Ee)©|pcÑ~+ ™àÿpÊ.6Ækÿ}±©jòÿ½f·F,Þ{QDW#6D R›" Yø huY©¶ýVÐæ´yd"x2¢¤Œ/5qý¸œíww§°«‚ìµ8¼« ¸Ð˾ ?.=e΋ï°_d ôãî6ñ·uÄ€ûûeÖ†£_ìh‘èmµ§'ÏðÙ¤oøŸ;„—œ Ê.)qJºVu !½…ªBå`†ö® dÇÈi/ŽxË»•'Ë4œ´)ÿ¹Í¨öÙNŽ'Žq$Ô"Ê ÕjÆZx°Éo d¹>m£È|ÝdÃFÕL…ðc¬È¡Ü¨ÂT‚ºhTV“U¥‚‹Ê³¶Mÿ¶.O«ìÜSÙ®¹ ¨Þwb"ŽQŠ´K{îËA2æZå¹xÝ;ÌÂø”F±)?<¥Fƒâk£.`›.½ËëËzî7/†’ï« ½DÛ½pkb ²J f“¯CèH¾.ëdÏÂ]óÁâßmpå¡1™­$YžiHî8¤‚k«’®ÛyTÌÐ |õΠ]‚ikY{Ô §³åñuÃp¤Mág k¶P‹/id Ã,©¼HÚÝô|˜äÁ°M±Ž»>ç•ýe?‘Õ»z#ÌëÙrôczë¦Hçpf É´ºnð–?X2Lf×9ï-ˆ2G×Y*„“ó“Lƒ‹jI –#Öâ¾çÑ.Èâ%LÃuu^ÒyîÃIþÖ’þ’lqØBp‚‹Æ…s1ô¤ ¢8eZVYº:H;™#èá ÝÀÙ¸ò†åaw’áq¸!7D4Ñ6à š°‘¡ 9¤ )yMæä+ä±zõîƒÆ:R³(§ ƒä¾[‡gÚ”`6#ÏðÆCJ-?fåæÊ( Æ/š¿ÿE&ëÓAáC€ƒžNP9;X_Ù‘ó©UµÙ1á;Àû1ˆŸ†Ùþªœ*t$­ým*(ØåŽéáN””S4Õû”fË( ~¼€Én<¼&Õ^μ^ã6C‰ê 6"žþ:tV¾Ñ¿?aå ·æe \~ X{¤cÓŠqè–À1g·ÚAHgJ¨C÷w µp‰x=¦­Shp”ZŒ˜¶JßÝ/.Rピ‡IÏl`2¾ ½°`›A<»DËþ@Žð€hëð€`1Á7´ÃR*îÃ.üÇÕ‰.桨õäV’\1ÊÀో¦´y$Ó—‘± $ ì¢Êýð¢S2!*¢(%íÌ©$Ã`Œ~ÉsDå/s-ÁáV~*x&p¿B+äý®;Äu©IÙ>_^`íÔð…?¼d%jí!ü–ùà]:®> stream xÚåWKoÛF¾÷W¾„ŠÅ ÷Å%côñ!@ ¤õÍÊ’‡…(:¤äýõáìRKŠ’* E… ícfgg¾yì0øð †?ÿq°ª‚ûÇàÝçWLª$xü ôˆÇ,ƒùú)ÔLÌ`™eáý¦žE’‡+’$\8šp¯ë–¦m±›}yü|| ¾Lfið;J†e*¨•$Lh·Þ¿Ÿ|L‘‚Fœ‹”qÇD:fªg¨#OGi–òNMwó»ŸKÄLKÐ9¶uUX–$‘±8±<ó ªLäf¦ã°ÀŸç²ÝÁЇõ”H fˆ‘H5éndn¢iH`˜ŽQLF ò+¼ëàzÃ’Æ !ûç }:i»ZWKÔ»ÞLëš2eþ 0¯Sí d$Ç”Lž²ÿAù9‰ëC>»µŸÓ~0°¯½Ak/÷ý«?3È6 Au"Áœœ³¯pt¨ÛiËj&’p9‹àw!¹)»òLëšXVõö·ý¹võÝxÝ¡—åéÀñµ“Š¥º÷G”juäÅn5å+™1.ÇÊO\¤$‹ÅYI°É¨,l÷K<º]—«J·M¿ï ¢í  ‘†Åª\ÄR­òŠöomnìÊ×á2;(‘‘2¨î°r¢:p²oóµ¸)_›^1ä‹3̧¼³5ö“¥*6ßê&·8Û\Ø€vËrˆ¯‹»óHjÁb N8ù˜ÌFÕW0*Ÿ|ÕõáYÌ.º#Ñ,!ßQE1‡Šâ26'kº‡úÕOóm×m‚ ª—MÑ^RBÆ«å%\˜»&öDá§JââýkÝ@ªû'U9¿Ɇ"yªC5S ­Ó…®Ö­Ê¼¼l¨LX"þ]C]¥ |Á^ ©nl¼í—H¦ñ¤íPÑÒ#Ûõ5¶ÁøiÛMB¶ÃèÄã´¦qd»Ñd;P¶û­#ÙNó]“oí[Y·»꼆ã‹ðç¢ÝYöUÞÖø(¤éA‡º´3[JíåíqÎ÷•¹-ž÷Î%6g^òMŽ_›> stream xڥ˒ã¶ñž¯Ð‘Z`âE›Ê!v­“ÊÁŽ×“SÆŽ„3E‰3¤´ÙÊ×§_ HŠ3¶Ëµ[h4ýîÖæe£79üÓ›`à¾Ù7ßÜo¾þNW«*¯6÷Ÿ6•W¥Ýìp¡ØÜþÙíÎëíp(²¯Ò×Ï÷ÿØìœWpj§­òž€2s÷îîÝÖ¡ß3´æ/Ã_‚ðý_Ç ÍÛ_ñ™]úBØ| gftí¦tÍàì>þLà_ç& Ø%”Ê[yÔ÷q8Ça»³¶Èâ—x|n»AŽÎ˜Wze<\§ŽqXÁnråKx°^#NŸ]ŽŒ{ßþs9mM‘;Þ¸,]}ˆ<Íé©çn¸[#B­‚–;þºBC¥ì 5ã>Öç¾ùÎCfv‡æOCÓêvNÂáòÜÖüÀ) Uº)Ïã*sT‘¨úf•*gæd¹‚ãÂ’1®˜0¶‰*XÒ‘,µÝ¹²Ê~ÝÇÎD2‡±>¤¥çº¯yÖñâ;vóËÃõòë¬ìÆ—Kóyë]V·€Êì,‚G Ê-³ÅÑ»N$T ‘±5Yx¹[M‡g"5ܺ}}äu"‰ª×õ°ìS׃üF€f87B÷ À&‘*íUåX»™¨D32ªHZŠÜó:Ûo}޼q9+ËËDË•/1ò xu+dm­2 1—evjbM‹Ì‹òÊ‹ž!H'`¡x¢Ga-#ªÉY3Ÿa™®f!zT^fÀã <Òd*Õ8ºÇùÅð"•½émhQ]t’øÙ]pqË!ò8ÄËÀ³#ˆÞöØwÃüZ“uó»Â•² =õ­s¼Z»Óž#"úp/±ããßdÒ?IôÈ7AU¤›ke5à÷F¹äÍÇÓxPÎÌTB28É;LíÕçl¯4²¾á”U££¿T\bÏ“3Ï iƒp¢o¸5{7ožÈÎwûºÝ_Z˜k<ù<6à|w”½QQÑT3.Ö*yÔÈèrkó«ÑË[†áÂv¬ÉÁk⹛ˇW '$7dQÖ|®±NåÉÞ$â.د• É ·ŒëTóMÉOEäC¨“ó:ódßõ}²ÑîtH°J‚‚0ã§aô'ò†ÈÒ.\žtÕå–l`FlîL>—&m“±àÑS‡˜°Á²R‰[ضÙwvˆŸñ|<¦ó=ŸYÕ uÑ’W ?õ#û+bVû‹,“c å$ ñ7‰3ˆ…ˆåË<û¶²ŽßÕ£ÖõMwÇ~kˆ¼-8‘)„äSaÆ€ÄÆE;ÌDö6@òUˆðO+ÊQày{š ܱ7%fOl©1¸Ï˜Bì7A3û b1e¿ 3ö›3ûqÙ XHpàÆyB¯ÂI Á­7ÑÇ× ¥\{yD~:4û(X†ˆ:"Õ•+?#tÿtIiM>Oh@å«lû}Šº•D]XíÚ=Êà—(Ib™¢­E1+Q Æ«SOžð6 î x®žºOPÍ &=…ƒpN[´ú`ƒ9ƾ»}að7LÂ¥$ü‰Xo²æéB9 @Ô@ּŚ‘|Ñdc¤ÙëñÆ©I£Ãíä=øp·¾¥L®A”°›g]ÄÎ_Ï.õÂ>- ˆ}¢˜]Û©e‚Ä~ë_]ôÒØ°|HùFÁù."JùD™:ÉÈÖ_’õã7…4]!MKNB³ç¾{êëc€‚ËŒÔÏ vÂsÚ7õˆqÝ?õñ l¥O¹â!û¾“Äú±n¾t¿'È£ Tl67ª¬¤[ òPaBp©ŠO(&pd*çe’‚·jm\öQÈCgåÅ+úµ 7Ù=Œîx5—0^ùðVr öj=¦«ó["'¤ÃR#øj/ÎÛ—¯âJeÇfU}È%Ãø©>7õïÖ™òu±Wa¬ëŒ¡,F¹Ý‰¹·Åj´¦iAä{)çìh»üEÈœãäDÚwmdxÊ%ä&ÜðrJþç¯2Æ©T’3Í+ ‹Bi'0Tä¹EZÆ 8æ-€E- ïÔ7¢ðOÝR+V•‚®­å (YnÄ¥\õé"Ånä먖MÙÁd ¢ký~µoR:À±S¼^®™5*LÊ™Æ&Ý£W!UØIýsÓ EAîþð%æ·_2︌Í*à².<E¦VÙã”K&ðÉ~Ar1¥ØL(>­Ý@FéW,šs&ôí$$£Üa…°çJ¿ÉA¦ÇÍÄäf:ØÍ±úä‰ýu)¹™”w¸é¤÷Kaаz¿ *˜_ç¹{5ÁO,gˆaRObR-¥]ªìR!… y ©öh[5Mš¾¥DÎÛr n„Œªä-v’p‹zɘqa–Üaå]åc6—ª¼] cÚ‡‡ëáûfØËòzH¶…¾Fíw+ìòWyccd§óÂbÆ}C/¥”Ì–”*ÍÚGqd3îbÝZó˜"Xn§‰on$DsCjT" œ&䫦¡•{»êKÛ»3÷y­\³¨:¡l^$¸$´Ô^jø°HTÿ‰(±óÞ¦6;ȷКê^ï¾ÙCÁ°HÅacnp)EIŒªG^rã{ðë!ÃÚéCO‹[¹¬æí¤—ÞO$€ç(7¼\êóZuµ&]ŠcšË3³V Œí¤©Ã¼“‚@¡¼nÒÆjd‡‚ó¯Æ|„¶#ƒ$e/0ñró_|ª9ú˜#ÄÌ ÌøÝn~Úü(ƒc©B) ·³Taæ]A†- XUEA°¦a;ô;ö$§¾é·4Põ/ç^,Eù\ò†<5Ñ«yÉ_æ0•ú<—z07+J}ý…!—ÛØ ’É P BÅrKqêõúx’´á|µÊ¼ùîg¿{Pë~97$(ÀA¢†åçû'ØüÒemˆcm2Æí[æ¥ý¼VcÖ‡Ö¹U–ãÁÇ-”ÝÿH¦‹NG®˜ÈÌz•‡ÅO7&±ï˜~áUþAÇ  ñÏ+– tjöU(Eöýøë öîÆ2†r×vø—sýIÖXîc'•ÀëŽô¼/¿ðÖDMêv^{Ì`S2_—>O ?þéÿ3s endstream endobj 312 0 obj <> stream xڽ˒ã¸íž¯ðQ®´¹|Sš©’­äÃæ±SœƒÆÖLÔe[=’ݕگ@’hÓÎ̦º«$4 _bÁáO,œ„¾Øìx^üð'½œU¼Z<^Ã*½X!À.ž·ÿ,þ²\i¡‹æsÓ;zß6ô< uOoŸëc[ô¾VFÐ[˜>4_Nía)mql>,W–[ ûz†`ù¯ç?;BÎø‘Z³ ˜FVöaœߊ™2 ¯¶í¾9 mw¨wˆUë¢e {‚eÎiù×Mø:l»uQ–7h¯´)™– -ÅŒñÓêáØôí°é†õr¹RÆqà[3¼.WÒͦ]s¥7õ¶¦C‡O[|Úu~¦#8ÊÙ?ëm7À*”ê@–h¬o¾´Ã±ŸÃéÓÐ|=5aYŠ {["á=}#åÄHO?>ž^w E\(Ÿ/Êó!—ïZi•–¬*o«Ê…a†*©ŠŸ›ýkï‘›˜&*¨§ öŠ3­4¿Ħ¢ø@sðÚvűÉ?0(ÈŽš£Æ‚¯*”ò±=žb¶‘î:àJ8ë‰qÓíɺÃL?Úpéû¨”î°mˆMÈJÎ4­dV¼G ¸Jáw¥‘$o|ʧݱ¦Cž–ÌÙ€ì¡eqZ#‘àà­=lv$¸H²£e‚v^N$2¯•✙¹›]³ÂA›5B5>8”ž^¶ šô¡Ýv`cU銿"Æ.Ìnþ·ë€;c*ï…ð7GâƒÔÜâ(×EN@šÉh›õÇ0ÁÌÈ™•ç*‡Ã0eø1Ç…feW~oü½|¾Éÿ|¾•ÇÞ/g‘e”R3Áü[û%š<R½lýnÎÐÂ19R,²R­˜µœlìõ çÞ’½yj«˜(É>5­*q1`Öšœ»ÖntÔøeç~—ÛÅ颦©&:0œ¶ç(„…!oôø’î)Àpd’=åÙ9ÛB8i\Ñ™P’ð¸Ý§*šþ¯eõæ­Þ~™ ‚çU2‡Î«Ä_"ügTž%åÁ#f!´E!ÕƒC†S¦z-ÎAƒÃk¿VV½öMp}Ì•0*ç뮜ÐaðÚ5ÇðE~h¿nÏm‡Ñ‹ NÉ*·J¥øh•­’ÑQ~ÿÀüM•¼ \æøpÕe.³ ³Nqº4†ûÊ{í›!ŽŽŽÈc&GdýFCìõ1}¤^ê׺oàG.¥$pÅÀÙÛR©š~³˜Õ¯“‰k%Cr1A¶sâ!†’jØ´°Ø=½n=È%飇>}„hh+[üÔô‚TÈÝ”ÛÉ2…óz›—¹Ÿ¦¦œ ef’ʘÔ*6>œöÍ 9QJ|szñ‰-ÀòÉÚNHHý¬i³Ÿñxç7œÑ9í¢»n¦Pˆ^·”ê®@ @¯fq®¾Äb˜ss,y¹J,´ßƒ&+XÉ™¹)Xne¹âŒ—™¥Ú™,Æòï—(ìY ”Úc•ßE¢òûHTþª•ï—h•{E‘¸µêy„óZL˜3&o/õ£“C×¼~t"X{)×3$“p.ìÆ‘äzîû0yŸÂ…V+6wN|†6sºù4ÒV¾®çåí4Ò0;¹ë{囲HËTy“†zo©xy–>ÞÌ"“òŒ»ö¦ÓT “D*. cN6¬ùÁŸBp•K¾¡c./š{¯it×þ]‡Ÿø#xR¦ñ1[œaì} ¸~/mÞ ½ÿmn2ÚLÖ˜ÝÚJ¦ìÜ«M*µ•šQ¥îªJmT©Í«Ô’Jqtw:N]Щ :}ÊëÔ/ß : íIR›ZÕò&‘¹³2OÄ¥jâj­Î8¸îm³µžÅàŸÙ¦v~;‡ú¢Tòʰ|T|¸ UËÏJ´=©z—Ø:è²é 1˜4ÒÚ~›o"F' UVæŠqk¯2( ùñ à ?5Ã1pû"aUA·Í®…²«Þv}žo…(›aÍËñ6æÐÆ)¡IxÞ+ºíç½ä›‘sT÷‰+­ö ¯pâÖ.swwÙŽšúÚ½—P{ þBöt`o“Œç^Î <¾EÌ!ÖKó†ü¯–û•{08ˆQÃg:ð›+ =÷µ0ÂâºÞ3%|/ a‘Ä‚ Û óçÐÒ3b¼Ú%ñ&ܶ¦_spÒÅ!ºé%Ï; 0’ôå1Nr>w£ñžZç\}ëƒ%ÞöÊš†ÛpÕ·Ù†`âÂ4¨í„h°`šîž‰+¶Q ì•=”mHH!†++çª:ã(†fÝ¿À'@SÁ+ºdDr~!â]­g-ÕÔzÆê Jºçß³2\’”±(а±C#Ñ­=Ñ)Qó£áqvƒCÊ”a}=ÕÉ”šÈMš.;ÍÉ”ƒ¿#hCÇ”O¹œ_«LÀuâJ V+ÏÀEœú·ßü‚hJå endstream endobj 315 0 obj <> stream xÚÕXKoÛF¾÷Wð(á–û$i£‡H=´HëžâÖ$ã0àC!)·è¯ïÌ>¨•´ò#uEâg¾Ç7³L¾&4ÉàMrYRõÉÛ›äûŸà–RRJ™Ü|‚õ”f¤TÉMýa# #r›RÊÄæ·æ¾—iܦ<—›º±×^/Sû·½_&=Ì;¸§›q^ôöãÍÏ ]$¨/+Q9•¤IÊ$‘¹1ð«*C!F2 8p}ÚÊlÓl%Ýãø HaÈ€D(`@ÈËxA2åôZ–ƒä¼oA×xa›¹¹ß·ÃÖ–Æ.|§^ÛÛWÔf¹å‚.m¥¯œî"¥œp {åDZgÞ¾Ûí6•4߬¯°à«¼€HrRæf™@ÜRJ”04¦¬1ž¬2Oka1-´ÀXe® Tn/Ê\x&WÝjUÍá"Ð=ÄüBKRäîbÀBI¨4NÄ´4™ÙJù´C "èÁœ>×"Iž‡Zâj¡Å‹ÔDË2ÜÎ#ŽÍ)çç[U/ îÙ±Û=ʨu\è3=Ê^Å£ìu<ÊþS²oðhfÙìàQ°§ÀÜ7\PJs¢h,çÕ¥õ/ºäØþÜ;9¥Û{4xTU¾š ö g-©ˆØÅ½«Ððé)+2R@ô!Wnþ¥™=ÕWzߨ>0Ú'uÓµ}»èzœ¢œÆr"ýn®b='#·´¯{g{Lc͸®³ÓÆžó0é´Ú²bóÙþÄÛ&nXΜb×_έƒͽ—Ôš±÷›ªÝÙGkŠf¹n|CœÜkà‡¶‰³’÷žBÏܘxgY–›iD–9ÓxWý®kÝ7‡ âzÀŽÚ÷î=ÆÔ "¼úÆoT£òÁhYµS MÛÛÀÖËË;õVÎèâ®]M¯5ØüU5+‡ÿñ/¨‹$<\î‡Ü)9ÜÖÚ®7]ãaŒqãH†Ùåb sºýË0J;”‹·¼NGm§çÙ=Öì8MÍìÂ=ÔÆ}õ«,]ö»nåN~8oM»è,C˜8eBËy°¡/qŒ(«ü$'ðܤÎsÂu´Kq…Y¯(^רpþ÷[é)(“ÑøGd²Jr°—{ÐRhß( óùimˆ“ÒPgcö¾·”m^rŸzü|tÌ®@Pñ®]ùݵÄ|¯#.L­­ ÷†Ñ‚qêa+á…oÚ6u~$Øézò£ï‹»ÀG*$ÄËÅg7%¬Ök¬á–ó§ëQ\(ÇyÝf0D÷V–¤”áÞËbOb?v¯S‘ üPéò—Û•ÆEÑ|š\œØ 7«ËâÈ 9ÝÃÎÚ:Þ즦jjoâ¸t|Rì£GE={r-Ž+ê€æ·UëÑDsRŒ†_ ½dä³òÎUö‚f&í¥ëyL™qWÌ¡Vð¸t·oƒ>õ«ÁA~ F"ÛûÁÅpiÍäëtW¢ ­*7xºgÆIx³Ÿuívíô3§ÜÒвÙkN˜}Ó}'=}³îÝ]ÛÇëæúqOÊŒ¶Ý|ˆöµÜS†Vc$/$þñÉ`(¨êü±¼ßû£ƒ1xŒþ|¡ðãÍ¡îàŒ:œ¤NƒÊ íˆW®=ÖCfßuÍ|} có€…Ì™}ÿÝ?_ì2e endstream endobj 318 0 obj <> stream xÚ½XmoÛ6þ¾_áo‘‹˜ßô’b²-VtÝÖ†8(YiØb*ÉÁ~þ޼£,K¶»X‘"Ç»{ž;Ò:Í>Îø,†?>Küdzb;û~9ûö–ç3³<ÎgËGX_¸I2[®ï¢«ùýòh 8g<5·¾6kÛ.:ó°Û˜f®yT¶~ÇÍ-«á>Ír5[Å4÷›Ëöi¾iTÕ*–ª0ó…”mº!ÖEO¦YI%¶e×X\)·¸òh›­éHHq¼<a N%Lx÷«¨kVsØ™ÅGqÊ”e'pÆÿ§ÎYªOâLãgJ8A4 ’Ú¢Æ'C8iLíd‘m;Ëæ ­3÷¦l»U ÓÚKº÷Xµä·Ösˆ°óËI}Ü•Ÿ+É4âhË÷;äG&$fcÜÆçÆ,Š9Øù€S7,‰S~X<šñ”X¥  ÚB‘0žrg}”ëö¶l0»­º x\ÍÙÉv\§L¤ðL™B7ÿ”Û§mÏÖs&2toN5O¢¥{¤ÑÕwøT/§ ´·P"úå¯LsÛò×q‰õöñqý@sÖ«Ït|Çïqå|_\’PÜãàè…2hB½PM¥ê½fuq> (D õ®ª«¢2›ÃàËÆÕºÓK™$Nê ôIQj–}ý»÷G\~‰‡b×v–ìz{d›Å‚²r‡{¹šÝ¦ÃIŒ ƒkUæL%ð®(¢Û·×ÄÆ7K’½¾~C²¿~~C²?–¯Ivûö¦×»=¬!œù—âƒy2{OÌ?yÄ{Iª–âHxR;¡ã)©ö¡ª ¢ÔÞŠSMuL¾T/:™ÎtXs;§çhcŠ2†ìë5<{"Û÷‡9LXÎÏÝ'ïð—Û6îgz@çdã݋˗žÒûÿ#}“óþÓõÛ¿©0e@Écb pÀ)­)'•dÊî¯oþ$“BZ:6‚‡”‰P1rjò·Ÿ—K2ÉóÃX`ÐïŒûô£2èè÷çKíëÞCQc~÷’dÀ%e@š0ž’Z>`ç@ ‚Å\géYÆ…š„™îsEFC©ä½›øãþ~uÂߗøv’Cl@xrŒði‰çcÂå˜ð7à,;OxòiÂ%ïï/µg|p'¾d/¤b¸Ë˜–ÞݯǛ½DÑïÕÃÆºÖ§p}žëDô0%=©—qC¿Äá½t±) =“Ø#‘pø}ŒEh ¤vI.£]kœ1‘+w⨤^§o¦T¦œJaá ¿ìÂt¿w·í%ƒ6ËIV‘Ý…k[°dtm÷Êí%vm‰mHß§†–:P–¡IÇÚ7¶µ´¯‚Ú:ØŸz¡¥¡~r'ß¹ Ÿ×–>©Üw–âH÷”†î '„C µ †<‹4Ú‚¢Ú¼(̦Øm`Ìç"¡&°òœe<ªXÉüP¢-d›°gBP‰ïEa’††·õ©“XT2]S=ì:š­K\DiÕs‹««èX‹*´by¨FºAFõÊ]wHå:Gž(g´-±•.]¸©!þÇ¿ìñnZئ äÛz¶´Œ^¨tÌD2É9¼v†Ôf°¹œÕ ,ìë"(N÷Z>8ÀJ_¿nµ±ï!ìý68Y´´ÛÒ/?îàÈŠ^°ÉMy"·Mù¾j©hÜ¡)Û¢©º0 _ÜW†jmàµJ)]»JZÃÛ»­ÍfëxÊ€':†tÌðJ:ÃSÉC¹Ð1@ÙsEßgú¶Ñ—w‚{1‚“}„€TÁmš(ül ePýý›?¤½^ endstream endobj 321 0 obj <> stream xÚµYK“㸠¾çWø(§ÆŒø–f*—¤&‡²ytNë=¨mõŒ¶,«G²»¶òëƒ)S6ÝÝ»S[ÝU’I ­¾­äª„?¹ò þËÕ®_ýåaõ§¿Éz%KQ—õêá æ7øÃ­ö?ûö©9NëŸþt&!Óµ0ˆ‘êÃzc¼+¾[x1UÑNÏë‚ç®Û–Úì>÷øôÅËÚš¢9 #ÿ<®•‡¹­¶rìvg^3u=N?Â~¾Øj§¤*ž›ý¸ÕF‡Ÿû°ò¹ÁQÕ·§1ÌlçÝÒ¹i»t® e#µ°–Îóy:áIl½Õ.YÂ,Š o®,šÓØ=žá·Ý‡¹fà™+q`†„A &˜ÚóÄ} guÅ#ÈÆì¾›cÜïùÒÛ·¨ÞcÛó0kIØv¢ƒ•陚çqx»f›«ZÇŸºx< d¬]ø½oÃ3’jR-.IÏ"€§ª‹˜‚ÏP€R¾V¨Ü”QÂE@ÅÃS’n DÙ¦vä—óÔì‡8ÆÏö^~†M$¿žºD¬bƒƒZ¤Oµ3u¸Öò»qâØàSì©E!}Ó ™Ô‚báÏÝ0Žq£á¸+oŸØëÀ¥5J@^WYá%IcÈ·ÞH©LñïöK7v´·¤|²¾;”€Uu«OiEmVe…­h×QjÀû ôqmË¢][YGüEG/™+ë=\K…:å·EF¨ˆ†Îm!…ªâkà\ÚàiºtDð fîƒ^¦aÐl¦îË1˜ŽÌî Â*Xî3"×>˜öû0F" )¢«òÞ}{ø:ŒMÀ4`*»ð.VÐŒõØ:ð–ÑB>„S7 3úÙ§W‘!m…¶ŒÐPYh`Àç»ùÍxPÝßàA¼ ¬Ì]V•ÆD ²å¬bËY]Œ±a”ÔÏÝpD[Á8Y ˜Ñu‚ Ø“|zàð¹o2'PÒ xß“t £|û†ù÷îÿñÎû Û2Þqè€H–Þ‡à'Ò ˜3 aj¿œ;>QËNô4Œ} !Ô©Û5sn"+#| Ó¢öÄìÇH¦²Z¨5§8oVžÖ<­à (¯pš(dŽQ%´]Í$¾›‰z?³äãø«t–®Yíaüœ~äE¶W"»{sèÌ3ÉO‰“^XŸšƒ}N@\-_ՠʘiq= ¯ß°’ÃÙ_k¥+&åAH¾6=²ü•^½¦s•Ñù fŠ)$|¡öñ6—i £ÁáÈ׃“z@xެ„å­þÚ ™ÕUn#œðÔ!fí%óàkÇèš@:Œf8@›lµ‡(1 2[—(¹µIÞ:`ìGbLýpq æØM»0œ¿'µ“BG}þ1£.{±7æ²¶; ÙX<¹Ñ•UF± ¿Ô®q%=ÆÍZÁ×}˹>pxàß};õC Œ :¸¨§4aX¢Æy„vyNج7§óó¡™Â¾åUVZAÆþO”’v˜oiûçÙ¦¤4‘´ <ä!‹·«ÌuÂ#!͇7¼rè%Þøn6|Ân86ä¢èÀ©¨6x%µ9R[ )© †!ÅŸù\™¯Ž TWhU¤ Ñ‹Uq§`Õe®á5-S× gÇ¡ïâDî"•Ɖ:Ú%µ!Ü6\›÷³ ¸¼´ŸÃ9k2íR·ÄSaÆþÔv˜Ä™ÚŸNìG!¿KÀ| ×,Böãzã!PQqTG[ÕË,å*(ƒ@1*÷ÙxdãRYŠN´í­gfz¶xm8£¡BaŸ>„•RT*5\N˜o-¯ K‰q='Ƶ»Í’ÈD0…’¦…þ¦Ì æ)Å^JÊ¥1Úr€&æj“NçÇ©…¼, Á´GÌ€àÜ7ÔÈ‹‡)dÏz?œÓ®0ûn‡[*„×ÀÏEI¬À³ãDê¥ðÜtG„I*­+2´<ò4LSöžÖ¥Æ¤ëUHTHe¬[3Cq§ÍëAÎföYgUãU¸Î ¦pL˜ÃD9—¸KA–¿dÁW&À]£·;4é1‚y `ñ¯bH›ÜgH‡ƒ3¸Ùsñ 1têNs³ `"u™È›7”–Õ½R›f}¨!$\w-#+}I[ŽÙ’V”*§'LT¬Sd•¶cðçÀœ Â!œ<§´.ÌdÊ Yë+MÌW›Ï»\mÎ)‚½Gkø±ˆ{zQäÁënjtµ¬Ñ#4šOÀ.uâbäÜ–¥Îía/ ÂO91Œ¨"äåõöëÕ;×Ûüòô:ˆ·Ydø¨¦v:q¿ UÿÒ}I²K4c³GSwÃ!ͬ'K/1ygFù–‰Œa)ú-í–úm3±,Ç!¯D¹¨f“Ê«Ôe°ÿÔ·º8aHÐ7í)LĶÆÕq ;+aMè¬h,îwÃá+7Î7œôÒg¨‹2/K"9RR\ɘn‘½ãK?GÇ×߉Ðß á£ºì1·M—Æ+0N1ß7Üßš¯›­–˜f¨2†ê±ïNÜ3U2ãÃ8eEøÏ9ZÂKìñâ;äH_Þÿ’âP×®.Ö îÀ³´Å]Íù,ž:~>ø}{Ü Æã‹0S¹vGÄ2ëËxi´Ì5Å2í­˜9.8ÿ<0Ñ®™BÄ–Ó—_º>„øÄÃT™”RÌÄíFþÙ›‰¨«0ÿ?ÒWM¾P„»ä¦XzSùÚ•‰•AÆ×Qq3*þKö­ðË»g¾ÎtÐÕ9’ÏVÄÔ‡°n ¯s$¥9’†6ìÞœBÊ “Œ%xi@Ø6¶ã/œ$Æ:åÇ^¡TXÓêÓEnÁÁµ¤ãºB.b*XªE`Ûó+•¦~pÊí)å¦ñ°¥ÜsWüc8…ÑV\UÀ>±ª€±ù;rärHº¼Î‰<.%ñÙ²1Ô꟦sßn¦ÍY¡Øˆ¼O—¸]®2À.uS‹Æ>i¬4š)2 °ã-§ð•ÁY>×ôú·k*l°Å¹ÎvÈŸÍñ/%þ~g\‹R¿Ú7Úßeájì~ÅO`1,™#ñ%D!|݇¹4îàˆ*æEüL?OBdè€ò¥ÛŸ©DUü‰ɨõ| ?HDÀž‡r>trÆ]‰²¾— ÈØ PtÁ\ñcØ¥þ}¸Øæ–Üæv™6÷2ývN’êé¶w©Ù)…3o·±Í»ÚØo3Qïgò}ml÷FûZdwOâ{mì_¡–—…—-¾™¨ Kß3üõÈšHú¯?ü) )ñ endstream endobj 324 0 obj <> stream xÚÍZO㺠¿÷Säè&~Ö_Û[ôЯ‡^Ñv{êô M¼³^$ö¬,Š~ú’"eˉâÉÎîC‹@¶$‹)‘?’Ù|ÙˆMbSJø/6»ãæï7?ýIoD‘×E½yÿ†·øb7ï÷ÿÌúnß<üëýŸaŽÑ$iò×Â9§0Aoʼ.qX嵆er«ý Á3b2:/Õfšñ˜"bs]ÞMCÞAc«„Íò‡­°†š$}Yæú‚¾½E¾K¯óBÏäÇ'¥U<¨l<xRÆtûv׌Ø%³¤˜Ë*7’Yøš¦Pó0¬'h¥ó‘ˆ|}0:s‡~€=je²?º½£1y/•2sãØit×™Íþb!?×d/[Yá ,38´£f  Ž|nEYæF@«rcXD0ÿI•òØ ¸²*²þŒ-³ íˆlqÞ¿zè‘y-³ß£˜”ȾâŒáù|p#}òåÜÐÈØ<Ÿ^§çÙ—r&¤îi'»¶ï\Ëã¼Úr=¿IüðØžÚ½s¿Waè,€²”ßé/ø-³ù Å$må7Šï/n>@§g (pÆGwjuÛ}{lºÙ;<"CEƳ‡æ¹ùÛ*{9¸Ž:Þž'B{ÇsK±8èˆíÊxjXu¼ŸIs{JPãu·°à×vvv/^lMôó{23`q„Èk\ÕÛ™ºÈËÊS0¹Ê5\E!uö·ioª4ÙÉ}e‰ÃÏl‚)2¥_ä/<©Ž'©\X¾"Ã)`ÇFdž¾õxºª"¥ ݾy*”î¼N*ƒ=?H›5ȧM“Xèž4#MñÖÓ?íüÝÓJϓ躶8ð;© {&õíHSÇ.F ¬ÿ<«­0yµ¸qó)‰Ž4ìpáT?Ÿ[9O¬çýpt|ƒpÄf'8VâÔîÜ»`¦B¶6¯P@™üÆ»¤=…aåîÚžƒ±– Ÿq¹‚Œ,zz•ð ‹Uࢂ{›æ¼#à›Ò7ªÐÓڑŇ/ª„É_Š¢Î«xíߥØ Yå¶^¨*µ•úU˜lfrîzpÔe¼JZ®2Õ7-“¬,Pÿ+‚-¬L-®Š¼¨[µ‘,dpÅ]Z¢`X4röEÜ)QùC$*ŒDå¯*Qùí­M®ëX @ÎZõ–†AnEêÈÛký=®êG-k¯åz±È,œ7V¬\*0"¯P°wS¯S¸Òj 8êš,Ø mbº)Ì Ž·È5˜@8€ìW0¼-'×xû²¨5 ¯çmÜÂðúnk^Í^]€wFô·0¼ºd`qàTB“ ”!reg&øXÔK@;R_ó“Ç´ð°¬õXÖ"–õP¿`È SvýXýrG0ÆÚî“ãOöÜ@ÅÏnî·Ü›îËÙ‘÷ölU~ùº0ñ\sÂêÕÀmU镸Ãѯ*]/•®Ë m¯nZ¿%öýtä¦*×:z6×ê‡qV?ÍL©¾#õÃìþrR?t;Z`×Îão¼þµaý—¨ÿäΕªçˆ1ítbÓ%R ®pîÝ ¾ƒˆ¼ƒì®J…æ7®5 v…À<:ͯ{‚”¦…Ey­k ‘à¡è‹nªA RƒT±|p]‡à:úÌÒ…”â:^–!^–úB»8M(©Sá0Mö‡ [j‚™¬ôí›]{ô¼8eš±ä ¯o·ï×Y(Å`­`½PЩ(€Ûjkã³=ãµ4B›|>tsðùó™®´ów»òyÜÏ®?ÒºÊ[©$2Y*ÎFêÂd_ÛçfÊaÇ‹xÈç‹0¡UxË]l¾°¨¼šx ×ì Œp¬Ý3¥OÓŽ¿DO‰í±!XåE¡‘S»óù;ÿõžvSÄû8ºÓÐþÎb-É´@ç`1›fÁãþ½I_„ £ùâ5œ¡WÍž‰Šœ­¯Ùÿ×ò*;^³—¦$àÀ#npùÛZ-R³µŒè >œq…=/ï¸å©j&™vÍ€IбÄ÷Žñ©npúŒx¯Þg«ñ¦¤Å™À /²&Î"—å¥8‘Ÿ`G0À¨:à0Yêá„¶0¯=õ{i”$ \p^z)AœëxN”ÓE:/n?ÐMd9JŸå@?ðCœT¢Xã*ëX5 ¯X«é诈]<´¬(ÌÇsÔŽáú"r(Ýt À*œšÁŸ¤júÈ|÷LµkºO(O.ñ,.ØEI`åcˆåw£­3ža(Ë?d­AR``ºfÇ@x#?¨æ¤ù&°¥)€1ü®¾Ô5YIyiD\FÎPð/`Óˆ ¾#ç ³…]dq9ÊòÕ¹d&­¡‹Aà|"_\V ¦\Œ¾®K1 Ù.ûbLl—qŒðŸÀ"Ý7$„c(”±’d\_Z¯Ôh#sa¦RY-ÕÐËà:Ô5jvœÀäúMu»~#1i±V¿Q6HG_Ã!uùû—> stream xÚíZKÛ6¾÷Wè(#>EnÑC 4‡^‚ÛSœƒÖÖnUXV"É‹¢¿¾C‘²)›²e{×›Œl )ΓóÍŒ|pÀ?¤þ’`^¿Ý?±'H%*¸ 0Gб~!‚ûÅ—ð¯2‹bšŠð9""Ìÿ3yó-ŠIæób–P6ÏÕ‘*¬Ì„bµ(ôÛ:úzÿÐÀÊ%"âXÑfa[Ï";Íe…$„”=æmÇG¶UGyQ5æ¹ÎŸŠ¦­ûÇfýÐäß×ù*‚ImÞv²vF963`ÐNµ×|5¯Ìô:ïøˆI¢– Š8ï¨Öm­ 8|ÌÚ¢»%ðÖ¼ªÌ£VEiÞ,쫇¥awnŸ¹½‚nÔQûýÞ˜,‚1Ršà#ˆs‰ÒŽ6G‰(Ƙ°ðS¤hXÕeÖvŠffÁ”›Ím^šk›=¬—ÙŒ²þÓÊ£bkmÂ7¤>î ×Òr‡\ü–Õ°:)s0Yõ”†&—ˆ[c>nøçS˜”‰Ô~j¼®jšuaÈ[C4ùÓº°&·VÒDÌmcG€nÁ+ï,âR‰qªå  °¹q}-ëÍ™?fëeÛ;3q>L¹Þ*†½g˜ ζcÁNØø>u½Z¡¤WÄo=ðzfÇßàìÐ÷À?uÙ ,H‘Jõ0GL°šˆž½ûëÉ›9|d°B)ŸL†Œ‘'¹µŠÔ\ÄVøÁ’áÞWüëq´«1Æt=Ât*·Lßý⣡qãG½¯"†q-á7A\Ó‘D²×Ñ:ä%è¼°-&°½g-†µŸ¯|ôÁâ‰2Ÿ§é$ É tÄA:âG·Ð¶}b»VƒP†…÷ §í$r¥DÞçN"o¿“È•vyŸ;‰\g'mêÅ#Ãǃo±‚üp”g˜w.ÛÓ­³®³‚'ñ1æäå¾’SîÉxÖ#uúwÄ+ö÷Ùiô.EF`Óx¥¸1.ÏÊ_Êétt2Ó™'çD†W·›—ñ~ív\ËuQµ™ô³§î‚ò wU0Ò ý£(f ‡¿öµß2Ó•ÕsÅs}ó7úª~£Ê£ àQ0£ ã5Ôjã>’ÝÀÁ"³„2»âó ªüú j|;И:ßÈ`$œÕ*+ìx>`Ͼô[ÞvP×DÚ486^°u,7- xµ²CÛ~N÷úÝ˲jÚ:[اl^t­¬-Ýu•`ÝüßlèzX„ù÷uîÆÀݳèzܾEcÕl;p´×òV’Æí!a#ÊÝÈîVK5¹·wA­µfƒò;#TºÕYxl¥C)(=PIIÛu ãëÑCT¨Ke$Z›¦Ã*€8ƒh-†™È®²™Örri6]5‡r?/w:Ù|?‹¢˜ƒïùÍp½ >ÇHð™ 5]$ØtxÛFŸ(“éŒÔ‹éðp²+œÉá€]ÝMè!Ü 4’3CD\W0ÙWLÑ»ÓÁ2Óö0A1’š¯ôxÖL=ÉØ€”›éþ6ïúÛ$ ý¿íèþ6ÛB†´$ÑÕ´#Ø—Ëãä B^ B¾zCFDNè`²ˆ)ð–ÎåNðÎêHÕ÷CÔ¨¤º|»ÖÙIA˜ýN„¹/oƒrìô 2 g¡}ódh\¥SPnrPcîtq~ÒìáäËÃ,¹Áì f¯ ³ä³7˜%7˜½Áì•`–L…ÙÝß„4d6Ø„¢X)f.|p9öÒÃAl[gbºƒôƒ¿µž éž“ajìd˜éÃ\å’hÎ&@:»ÒÙHg?¤³ !]é瞢;ìg¸ÜAÈ«9ÈñÓ3¨¼¥ƒ·wi‡CÈð¼K‚#‹WKØ¥u»9Ù¥ö¦~xêY H¦øZ:ù0F=r|*á»GúCìƒüúà€—`ÒœcýÔ?úRñ 3 endstream endobj 330 0 obj <> stream xÚÍXKÛ6¾÷Wè(+Šzö–顇¢E7§8Úân¸DG´¶F}‡R¶Ö4¼Š4Øl ‡óúf>R޾F4JáFUÿi´ë£÷ÑÏ¿Ò(KIY²èá–“Æj>´Ê(³XO›”åG¥Ý¦<¢)iÒÆl¢iò(ÉK’3»ñ¯Y9ÉXƒ÷¬ŠÁPVÇ­èQ¨Åˆ_&Í[«™§ñž¥£ØM¸OŒ|ÄÕ—UQļS£p†9$#ÕÀ¥Ö½ì¤³ Âêý*~‚™<æ£Ü°œ®@ùee¼H½†å¢Ïú`« + ³N\¢”‘¢°‰šJ2«í*ОÅA‚±26®Kc[<(|¯¬™VtŠXKÞPM ¬ØÇÞÕµ9«+ I3€Ä(øúÊŸ5€žSÛ©AK}ÆøwŸ“©@E-u¬“ðÁÄT6ñ&v&é¹kšB„Ì%§)s·¼Y­’<£€èÓ$[ur˜ø4õ#ÙóŽ› ½Œ<Ù™âá'0 JÏT0ˆ¡j9A¬¼MÐGÑï;µvÐTÉé96Z£¤ô5=òª -}^¬ ¦c|øð%Ü:YLã­LZÙ Z²[½çž·ü$×ÏŸI· •—‘¬ÄqFg+Ž-žSoôF¹S¨#Ÿ&ÞáWîDì¥m ³<<ŠQ¢·7ò³%ÎhIŠfÑþ€|m7ÁŒòÍ¡5³Eº\#µWZã@}NÎ&ÞMÏ …sÖ¦áŒ`É+¸ÁÒŠY´´‚2C9F$Ž{è*íÆº6cmåÀNsršÀCP‚¬‡Ñ­¼ª1ŽDRV¤<cÛ –ÃÌøs{¯ÎU’X£D¹øNÜkÅnеž|bÊçˆp8bÒòifóŠñK¡ÔŒ)jôp/R’{|| ±E ™§MÜ)3Ù› =[DhZÀ,à=AÛg-E¦{BÐóáâ03í½%[¬×=Aè?LúF NÉ2pê&<:€Ã°àé¹åÔ+ÍJ_ÄV€ 3x¡N_«oMi¹ èf¯u‘ž¶`#»i:•1;!ya”}»QĦޝXÎ_[¾Ê­fHÂn;ù2ÎD!­s8,Ê oÅàÍ!¿ÕA9vÐ ïn´Ï|›AŸûQö¼såtÝôÆÖm§{=Û3Ûêƒc“Q´Ó?pž{¶½ÔEe·ë> stream xÚ­X_oÜ6 ß§ð£¼æ4Iþß­C“´EQ [‡]_¶Ûƒj+wÆÎVkûÚ`Ÿ~”HÝsnƒC‚H¦(Š"¤ÈDŸ" ø‘Q¡àWDuݬ£^ÉH žçI´¾ƒåUå>¢uó'»þ¯Å6I¦ú¦­ |U‚ÝÄ­ßÀ¶"R)/Ê‚¶eðQùm¯bØtè7IZl’<ƒ]’™ÑmNYã…$¬Ñ“F v6¶A“ð4’‚W¢rÂeªx¦à„Ч¥?ôR³l…£®ûf0_Ü\²·úïÚžÄÈê\ލx^€®NÄO¶Ï·ýÛaûó¡+™I‡Ê„g™ßað„צ퇶ŽUÎvŽ"Øïô¡Jv¨ÝßšiYƒ’Ë2h°CI;>Ö»Cí7=ßv÷¼1¨ÐË5ùG‚ x’ædi¦.ÑC7\Æ+¸WÅ~ý0™¾± Q–qCÎ&Ó}ôÖ'²7>Ðk½^ðZZªí0˜>†ÛLfɯR8¹âIâ~ƒ4¸k¥ÊœY8|pS´ðh°}»£ÝøàhO£•Û„âL‡+oõ´{7Ø-~™ûvœHŒÆá. ,Mì’½@ŽÊÉÞÛnj»¥Ë% /1ñx•‚&/÷tB²ýœ.4އÖKÜ*.fÑÃöÐÑe¬ƒ¼¬CgÃ6ñ‹‰¢àe CÉ3Œl]dígò„C§q2C2òúèr³ÚzœY|¤ƒ¼ ‘vü³à„×ÌÎ6û¥B'…û¨ô±ÐY¥Iê°sîcÔ[º{âxÊDðX¬Ï“JŸ¥ËTº|ƒ:h2Áê8“ €q© ¼aiqÅIÁ®Ç±í®.åQ-a`®íõ@j>Ôò[Jú¥=²ö•å1ƒ¹Œ{…ao&ÒJæ’Ï 4˜º=ŒöéàŸ•”ix`[Û$k‹Ô™R@Gç¹s?R›ö΀&αBáQÔãÒjÛ!#¡¢æ‚àœ+$˜{ÐwuHgï¡—R3•3z.ÏC±¡èd¥…—^œ7fØ·4oëЖ(Ã"½=‚Þâš7³_ÆHšI3œÝ=0n[C2Ã5Kz¿Ž]½7ešú[¤˜^( â%pÜòD×iåO’Ügoà Öô&ƒ‡.@8ECÇ,àá;èuMt™ôt™3+ÀëC)wÁ²‚\£Î\#ÙÙ‹NÀ’ /Uaǰ `F¸;™ÇÓ±Ë%yò0÷öË×Ò1~?ÁÁ™p1?“ôS~~a0%ÜÙÁûP)¦ûäÞnµßhyò¤E>|åT0VH×Àéí+·»¶Ö[bß°?,>ùP7žƒÂ1’3½_ݾX»Û86B40Ôm_“½¸®'/f¼Dk£ÑîÔê裎\FŽ¡œ£}Ï. ä‡H‘´S]äBXšåÂF¨Þôþÿÿ0RfîYú¯Yá!×÷ æâEÿÅzKˆ’l'0!Ãð9Î #ì}¾Å,-‹òÔ§,õiÅ‹äÑÚ´85  ª»wŽ˜Ú½ó¶„0æ†û)=¢$ÃävvºÓ$ h㪬ÜWY#RÒÿ˜‘Ä™Ñwhb¡TX)¡x™]VvóÔ@ƾÇ4‰°‘ãh=¯Ç·Zž,ËCSzõ<·®.ª@ˆ«ù†cûãú›Æø0ƒ9ö<®ñt èóG]Sã3ï‘Îù/k“¯tDÇëx•‹ìѺ*S< eÊ8 qºPüd‚¡þ+4ž†®åj©xR¼ªhýn±9âIØa²pCu*O%héMwõO ›ƒ»yãó“Á‘¼amç+ Ê™žU#+þ3ÀQˆÙå;Ò úðS“…–O2”Q‘¤5ZÌÚ áZ¨Ñ02v*ð5ëÑ– Wå®]š[>ýšáAd²‚ë‚0Œ@(…Ÿ Z&TM…¦ÒñÀã øÁ÷@›$Oöð~XªYö‹BÌ»êÊ7‹çQ3+‡d/Hb9ýË$+ëoßý 1çŸÈ endstream endobj 338 0 obj <> stream xÚÅXYoä¸~ϯh ЀpË$E]^ìC6Ø#ÌN;yIçnÑ:<’z°3¿>U¬¢šê‘ÇÞ—,ºñ¨"‹ëäæãFnüä&Wð›c»ùánsý“ÞH—¢ÜÜ=Àô;Ùæ®úwt4íªC¢åP÷»}’e‘yú§¡6÷ŸÌ`¨uDºæxjú‘I‡zjI*§úØñnŸê4ú3÷ÝNeѧ*";ŒÀš¸Ó4ÓÐ7¦24û´Û«<²ßÓT¶æveéûЭ™úÝîÞºÓ$qšºÓØ‘¹õA$úˆg@¢ëŸÊ€´ŒuŒÈñÀó!@Y\úéC„2'2íã©sˆ$ Žýxj-ˆžGSØ]ÉÇ“¥ÆdZ<Õ=ˆ’¹Ã¶ÄVÙOÈbýŠ ŸZC#ö·§ÁŽ3R05Ö-rÜ»C’,i꣉ÈûTÄZÁá‹8Mœ¬€»2‡iÑV3î DÅOÍdHnKÔƒú¡sàcá+¢~`Td›Ìuœy`ÆiPSÝÚøt§“Ñuôãxªi'Jµvl{ëÇî|[n¶BýRLÓƒäþ$.8TRÄ2 U TŸBG§È …•C¥%KúØ>sØAÈYV\\E·§ûÑ.—ÿñŽ ð?scxüÚe:&á³À•ˆå™Y׸Š$IÈ…šW‚…¢]>Öù"(•Æe¸VZ¼(€J²8×!Óa‡F_ѯ=j"Žf°t&ãD^*0$QÇ*šJTÞa¨×®AÊ4Ö^­zâœlË KýŠ÷Õ! µâÒÍIqV%ìJïå õ¥ï¸õ¡ˆ…ûMïvƒÅx™Fulcn^g´ô5Oh«wè#ÄûS¯bJéá›<.s§sYçå&ñ^zvuY, ^H¹‚XC²Q±RŽˆvÑ[ÓÙzè/¶-sqEx%9¨£Z8ÒÆx/Õ‚S"oĈф 7·RêÐ ý ¤w®M€Gö¦¿b·9²Wc×iiÒ(Ëß–@®lÓßxtš¸P§$‰ ”X‰8gÇ lI‹Æ+üfÑø¹½ïá®høæ{ú¾ùµÔ×eA]™ÜèüÍw_G“`ʼnô+x>ðV°æ¶½ÞV×ÛÏÔÝþr³}÷æ°[YµªÇ§Æ0ÝôÝÊ%îýáfPŸðò²êô…¡,¶U æeñŒªBÀÔe2gØF.üú :ô`]„Ä8€`šB‹,³s üF¼Ä@îÉ xõ8Ù¥4• ­qñL£ƒ°¦[Ž›Cevásœ¬[ÝA?TuÇ·ƒ™œNÒè/””ÁìJb5,ÝÉ3éxŸº«Þƒû–'þÎb,WóyÈ‘]…ytW«¢5¬u žO3ˆÛ5ãÌOv%²$΋gNUú£ =kì4˜gTéý¸4Hôn<ôÜå…{¬çlhÏs|Cë·­w ñŸF— ¹ArÌêœ0ë³:߬A‡ÎÉelºûµ HÆ…WÐ÷° ÖQ×»è Ù¾ƒ F° P#™ûÁ~⦠àóGôLŸPIlƒ‰³m oM}Hr5BaaF—QèBR ±_Þvî Ð4¼Ë4Ì[‚`\õàçÜ]+Η/w–6HËÙ§pûöèþª¬›XI¼†ìž€ÛËҫɶz^••#0Ï…“¼¼86ÔSËíеv` Ԭ5 uNT¤”4`&ª½p(‘µ’Ñ-S±¢míÊ`à¾ÌëŸ7gĹWáå>ÖS‚®)™Š˜~`»°Ì±ÿõ£€¼«€Ð ½Ô¯ÐY¼sª9pÃçrÔ"Ö™w"÷«Ih¬r&X—NI&âýò‚xX/‹ “MC-Â89yI¹¸h⋾bw:ªN¦Á6X2>Ö3Í+½Ç½F=ðx šf!TBê‘h§8´P¯L‹-‹T…œZËcgUqövVrAµÌê¡õ³z¨ß©”oÛW¨G™ž]´Yth90á{yqgSÃy†Z’>†J3©ŒËK+ÃÞ‹¡[ì@½u+Kÿ/Vöî0JpÔ”ž&ýÉP…› ”I¥œ¡„– C½´dÌJ9¿y(%A , ¥Lƒý(â„òö5Q xsR™·&l!Žø½À9ﯼ÷‡– ÏÄ d‚€”%y~Z‰#Lë=(@àù3õÇɦýùe 5$Q¦ÃT˜ªYjø>†C|ÏW¤S¯,8sb µ B,ÎÈØô™x’´5׬“ËðˆA kWµ+Ïš!à‹P ¸ê¯ý'j‚d7ºT ˆþµ+Ôù--Ykd˜Þ,'-k蓬­ÁŽ®Œ©ì0?Ô]$aœþšÎ'¯JPiGO%n×uá¡ûx2TãrNÌ­ £¼Î♲’ã|‰ËÒ—™> ˜Sg/>Š«âÍp¤,_k×_^é1¬ à¡ÇÚlñЄ,áÏïîØ:úE"Oƒ½}O£E&ä·eœ •íöÿÙúrÝfk‰RËòÕV+ŸG5 ìƒiøÑZŠ"Nˆ”áÕÏ© ÝG.dD_õ§iðí°^ÅþaY±BQçX1_'rÊ×±z‹s3x48gýØ0áÇÆ©½ØçŠoNjϯ¹{­˜_a4Åold‘¡Ïù‰!ç‚=[š—¦Œç]qç˜EáTc•±/¡,ÿñ·#¿:g)ùí‘Yçª?Ã²Ó Q?R¿[%|%Z>Xî3M…aZzÒ¿ÿé ´| endstream endobj 343 0 obj <> stream xÚ½Y[Û¶~ï¯0 •›Ë‹®[ô!I›âôá¤mö¥­ûÀµW…%¹’½hòë;Ã!%ÊÖv7)Zd‰äšû|C/þXˆ‡b‘Iøã‹]½xy·¸y/g/wï`yƒƒtqWþ™f%³èÔéR¯W¥x¤ñ!£?Îú@oÇÕHZø?Jƒs"ÚµU³«Êª#’][ÓüÓµ4ÕžéYëªw{t§w'Ó™žVüY¦?ê­Š3·±Ñž¼4•ž’¾k»ZŸZ¶úõî»…HXƒ,9K”•å-RI¤ûsM¯À˜c¿AIÓèdib:J}Òôfn,Ëðö[Ûù¹þœ©Ö{pJãV_n(2Âê-Úî¤iSkç9 ˆ¼y‘ cEÚx™K’9ûHií#Aç•FìáÞ›×¢¬œ',OÀÖxHê䩪£ !ÎYê¨Î½=šG½9÷ô‘‡Uƒ:[²,uÙyÀp×v°ämJÓ”-mtLr~kÿˆÚêf…ç—/2VdȆL%j¡¼[’Hà©)¹Ùr!føÏ™T ɤ´Dô}§SuŽ¯Û˜Ç,¡rE‘ñ5y–w×Þü®ýÍ : ð5€Á¡;=!×Ö'`¼U‰ ©ð3Ÿtf gI5þXá…\Ó¼9í ‹@§O:Lœ±¤x†ÃLIGæxÉ!4އjG Œ±‡¸ƒ9Ðg5=08À‘ËÅÈ3Œ1$ï*šH!à>nަJÓ[ƒyàHvžsŽ” –äŸäHEráH ×èHÀÄèHŠ©v—ê6)àV(‡ÉH‰éøkóÁÔä÷]®ˆ(æV`̭ωS%ÁÒ·Ù·]nGæÿæŽ2¾ 3§>åËœqî%S+(E½j!½`0LÃÝÉÅoŠió&¸¦gÄRzm%XÒô8×Ú“¸´6Ù6¤þkÍ;‡•àXƒÃ¦<~ÒaÉ”Ïp謼v9Ê !gYì çNRC\Ïl}‹ÖßÍo#b5' Ä$E»Ö&ôü5Ž¢*Ôrʧu*¶8. =/´ŽÊñY×ìª-W1(Ý-¸éƒB.§3ލ]ÙÕÁDº°î hºjÓÎ)1c2»Pbüˆ7™P {…N@Òâ(†:|ÉÉapÝüyÇè]ÄËų¼Óî@J‹¸>lõ¾†ç•ÆÏ0ÇÛ ÛZÙSÎò,½¯(þ¬ê·*UËÚíŠA¹V±MŸ<'ÃùÜÖynqÅ´·S|6AŠå’Ò®¤£9¡‡Mdå5>¡r¾¯ï[(Mkš¾ýŠž#ô¡T±lšÇ¥Ï—¯ï–w?¾]}ym‚²êýÞ}ãËn[£:殎Ÿ?Ðu€ðWXˆ*§Z¨ê±x<­CÃF‘Л_‘&¾œç€h7<¾7œ'?ñ„tU¾I{¦¯ysâVÜFM¸ ¬}Žt¼€åÿ½}ó7­˜@ÀÐóàÛfcéÓ~й7÷xª|HÑ󜚘@—¾ê­D105“m†«O3"Ú 0‚S\^“P¢¡ ™äµà&(‹!Àʪñí äì$“Ñ+’?›…ºègác¤x›Ù•ÚBMèž æíýNxNÂïçÝÎ]é=´hW44Ó>zDl˹jÀÒxl¬¿Ø8)Ûi.×Áœ:ªRÌ…!¦êƒ‚›)ºT›·\ð‰i/2z>Fˆ†å©öáìÂûÜkêã‡Û:ÜÖç;—¾Ó'9(=/õ¾,÷øæ Ü€5§ q9Üj¯ŠZ{žô}g*àuÉË+HÄ3lm諎—/þÞðb,Û>—‹ûÎ…›/“ ¹œ)oÍ×ÓËOå0dècÕòêyí1Ûï·vúeÝøbN×b¼þ“‘çNW­»åö!Vù‹š&(ð5f8Bû*QVU9Dº¿¦‘àü¹B—Ïúo-Šv³ç:hã¶*“µ/¢vUM? sø¸æ¾pžÆËH%žï)_?Áÿ‹Ë² §ñB\ܹ–pè—õͲ¼Y¾Ÿ«} ŽjžmQ@6åÛü#½¯/ïJÊ%÷2ߋ̚Zˆñ&fíÔ™ ŒivhÉß?~œ¹ø¡Å¸éûN7;{íöTcAE_€Zü•ç­%9öÙ¡Ö^ÿgÖþi³¬7³*»²¶‡Ó¾3·ýWSg‘rOúÃg|Ý« endstream endobj 346 0 obj <> stream xÚÝYÝoÛ6ß_á—2kâ‡D©{ê°nK¢í’æ=¨6›j³¬T²º®ýîxGI¶åXIóP @úx"ïãÇãñ8û0³þÄÌHøf«röÃõ컟D6Q˜EÙìúÝLÄa¦g‹,ÔéìzýGðíÍüÏëçÀ¥LJ„i S!ÃËùB)äÛ ;i°ªêÚ6·ó…4Aµ]Ûí\&ÁÎâ`äÌD,•‘¥­+š`m©ml™osb»¼zyAÔ2oˆÃDᙚ¥ŠÅªÝðÏe7O%ß!Ѳl9ç DÁ³dBÍ¢ÙB¨0Ž2,vÓ´~Ó*:(mSr÷]U—ù®¢aK´óXù¦ªñ§ >´–¶oZ£Ã8a³}ûïˆ]…¥·ëMm?­¬_ çuĆ[¦YS³ôÀš­IüK¾°õ˜”R¤aœy)ßœ‘r9w ¸1âØ”¶ÞÙíÊ #ÙûÂcNò­ 2ª–ÚÆÞ´CÇY"b¥eÐ69OöØø©ý”œ %¦½ÉëpLÓÁx!²0V¤îÏÀnüjF Àžz°»auéÐ=0äÜC{ î ©ç°éøxfÆ# ñ”ÀÒãè.öƒQœME·gD¾ž§”§Án„"Œ…ß#c€¤;òGù)$#™åÕ‹ó‰â MaVé-m*Ã`Õtá•Ò¥uN£~§˜—nÁ®ë /\i¼°E¾ØVÅŽ'g›Â7»:ßå~‚Sj,Ò$Tz¸}Æ-¢ÃÔ_^¬ÏˆŠjçÕÅÄ# ¤*4朡һÓ"-h‹÷¡ïÕcb /Ží­r[NfqÄ 0¤ 0ç@`΀À|9ÆMò( 8k¨ó à@ðë}óF;ÌìXÔm†a·hŽÓHŽËþž8£B‘vÈ“Ñ` wk®” ¥ÞË&¯¦Em¼Ruò~Yy|ÊœÙý)s}_Oùô·Ë‡íØ1Ó Ï™¢éê[ÿ9«~—’a5ðÑ“Qëê8g¼dÂý”¿½oÊŸ{¯ùÚÒÐiÓÏ×£\_/í.%*û;¬#\9ˆðjýy,¦Æ¿MPR¦GÒðÜ¢2ëÕ6ç7 Ñ­:®ÔWdê-=cà9„1ÎÓYÆÙ2@v0Æé½i€+g ÛbU8ìUw\€–™«[bs[ùj÷+ ~¬ ¢ÜðÉ×ñ&{¼1yÛuò½©rb&c`Tÿ¾lºo¸çÜF“Ú•]ÛòXT†K¿*:¶“Ð®Ú«í ¬õjÕE‰mS¬m¯}¼Íë"TŠÙÜÔëÊ›óP‘©:„ ’œ­Ò¾êŠ4WÚB"zláfð€Àqö0{ÆÖû±¢b6HqåÖkˆÞ-H8)O DeÃM?,5ËHém¾)>çŽIöÜìX3‘Â…Âl ïrüŒ«›ÇïÌ×pnB3°ð=¨sÖ,MÙ~9 95T«Ú…§ˆ$6¶m˜Â¸„-è sîã­KK'—Í®"›zöC[p~Óol™aâª#¿ëáEƒ™\LÇQMÍzä™áy¾ĖT||J¯ÃR=Ý–|_ñI¨ýVÐþ¡ÂÙÃ39\“wAAå!Í;©û\íÕ;Cª…>=|0PUQ ¼ û@ÍQ÷„‘š0rÆzBKËÔ§|ŽD n€ÍPO?ûɰK¢â»¶Ý<Oœì=&\ í»gdkX»áu¼µPž‘=BÆÓ’–…TÝÕ»¢*xVOÕîjúNB<‚¥@¢TmКÞmpHøHÍ V—]nf GG–(Á¬Ë•³#!FS† ± %s®¶’1Àh5²8öx¿³4p÷€]_cåH*xÝBͽ.\—:Ô{I÷k_ÿvé4¨OµnjöÔÞ7;HA?ßcÇ€(Ä4b ‘˜0Q°d¨b߸Bg üÁ$¹²ŸX~\¡Ðos·M`È=B3> stream xÚ•V[¯œ6~ϯà%«f߸8QÚJy©ªlTU!.ö9¢Z`c Ròë;öØ,äÐ$Õ"Ï|Œ¿¹z³OË(üXVqxhÖöÙëKöò¦2F‰¢*».ƒ‰ªHÄãw¦‹™CS r:˺ÊßtzBЧÅ&´m­±+›'L7æÛ0£ BŒ.¦FH…í8L±N›qBíM»tP& k®àRs¿«3fÿÌ)ÖÈ稑­àHî4 Ö.וiKÄ}]]‚n*p±éxVª)…à\ƒ¿õ‹OîÀ[Qr¢’ýh<åÔì¿‚&¡±„‚¨ÕkÔþüŸQKaa1,üIcøDbX¢o˪=€SpõÕꂹ.j~uöqtÐã·~§þü;Ôß÷é0§ÛÙ:{d·¬ìñƒ#ƒŠð2ª¯ÑW¤wf´&B !ì‰Ë©B•„êæU•ãZCÊg—d+Ÿ¸oòÑ™nˆÑ˜šŠ} ÜØ.¾ûóëÃèz=¸IýåÏ™ºþvµSoCVæ/!i·N¯œNw¦Ñœ¹÷~ËuÖÑz@kBy¨ÝðÁç—>ÎÓ ˜èoþÔ<‚L\w¥à}÷›ž&0!t4ŒËÃâƒU¡ÛGí«{»ÌÀŒO³;È­¬IBû÷Ó"[;ÍÚáY1kñ»šTœÀ=¶ ZC¡÷#%±Öþ*ãJÎDQ¨²^‘[N¥$2õqæ uªÚŸJIçŒ1¥Ž nކ†”\ú HZà´—´ÄëoŠÙL”êóò:·¸¡ÊBê<‘Œ»WáÙKWâ4ƒtTaH ÏQeà³^%auŒc‡]ÈÊŒÎc²ð„·zÀ¢óƒ‚wîÍor)aOç1¯ OšX(l¿c¿À5>ÿuŸm¸JŠSþ~áýÀPûù‚ÿvv“›C7Ád+㟒'èïÏþûP endstream endobj 352 0 obj <> stream xÚ¥WÛrÛ6}ïWhòRjÆBI€0Étâ¸î5×ÚÓ—(3EHDb+’2Hºîßw»´E›jÜéÄ’‹ÝÅÁ^V‹«E´á_´È$ü…‹¢^¼¼\|ó}´¡HSµ¸ü Ë«?—å‡àt¿\)¬U"›²*,|åap¶üxù3˜e ‹Lgl–ÀGîÍÎÚ¦wíΔí¬íÐN¥·ƒÞ|òníÎtì*^D¡ÈÃ]E±‰‰PÒû2 ZV`vÚ”Îþ…ïQðÚü¹m]Õ°›(?ôæ"ͺx^›öŦDë6ßÎlºŠ’HÀ¦‘Iâ-,íð£­WK™[”„ÁH þ¿5®ìçhéÁ–å°kIVòsïÚ3µ!‹«Á²Ôu`]]õÍÞ™¦ƒÏŠsYÈŽ^m³ß½cÍj ÿaû–ÀBjb!ãÕöÄ–ðÙßkÓoß6RcT¾ü@ ÂÀ ìá7‹‘ãVzŒý©7˜]8uÐÛÆI½)ÚžýüðêÝ/w€Âíº¡"ÁÕ` 3Ȥh,$îê(¯ò!Ìî©u~Ií:)¡ÒÅJ橈¨WÖ¡Ljó±Ô=ˆìA¨˜uM;‡ISùCœ]üöì àT”ŠüÑØî´ÿ/´›—§ç_§2‘êÇ£»SŸ…wÍÛï^ž}L¢Eœ>Ìúóúï‹÷¯ÄÄñ …þ<›+ ¾ÎP°iŽÄ¾”ùá6)³Kš1­‡ã6 â˜ã™±…ym+ýð (Dçøœž%èÜ¿h¯Ú«åD=^Hß“^GÁè‰E¶ë×*ŽHîì:‘¹È”†¤ ??·®¾sD¬ÄLqKJÆ] Õ5ÚC…ꔎ ³Šö¦÷¢<ØïLÓž`PÃ8°5 ½s¯‘QîP8zKGoþظ²®—I˜Q®uÖí£“ùm|È0”øu œžl†!6 Am]›UgѼ·%U ûl·^REÚÈü¶+\Õó—ùdª›öu¾ÃX€_PÍ0ÚE»ÛZ¬zöÔáLùf”*\<$B’@ Nè­³½4mÍê˜+Z"Ÿ¶ìf¼;øÚ±^i}’,-t#"Ûñ­UTëPÅ1ó‰öÁ˜¹õ¡°å8v<¨Ofz@I‘W-Vd¤1qiU™lª¢%¡q›Áß8Ày^”²‡pÝÄ…%K&åéXËu|y’t¼¤lSòþ†Â‘Âà1™—Ò$@3–”x"#¸|ol½ßµÓ›l7¥„ƱhHÞºÄl%xjªê$JƒŸÞˆbK¯tuÝõ“§$Bö³ÙÙ*ZÖ(PLÓ 0ˆ78F}•ü¤ J&]‰†|ÑûT”¬ìKŠ´?U½CŽqv½ôõJk#ÓÐïf9O_¸î,”ߌ[a·,˜bþ}®"c©D<Ρ¥™˜H‰‰$•¯©“!‰©Õƒ1›6ÓÁηLvŸ›QRrW3'R\hI>Óï£Ñœ;ÏyhÙØ‚õüÔ‡ÎLÍDGò ê ©® zB Ül ói9Û°[û×ó³7oç‚ó|ÎAò ¤yØÕw‚¹Cd𥡠q{ìëÚúÙOS7â’³›ªëGiÑ:ÇÍn¡|ÓHçŸ*õí1o½Þ/9”1‹éY#,†ºqfGŸo:Þ½;Æ_ <©Ò…˜„Ô™X—B ¿9:KOgyNFú%ƒm;ÝvK0}¨|˜>ÿýïÉ.YÄ98–' ’hÔñLûM‰/ñ·ˆ -G¢òAPiìy£A?–ºRÄù}êÚA†ÍqêòˇÔÕ`dPûùŠü1?žL˜- ŽO“™¿¥1ªð»UßõŸáœ endstream endobj 9 0 obj <> stream xÚÍ\KÜÆ¾çWð˜\z»ªú ü€9¶o‚z¬‚ ˆ üû|É™áns4«Uí¬Òr8ÃþªëÙU]Í6ÅIòÔd’>IÉ“ÆIKŸT&«6©N©–ImʵMš¦ÒtÒ<Õ–ð³©5ܬSï¸Ù&‰?Å0ãd×bš #§Ø&SàˆNf€‘2Yš¤Óò$ ã[Ä*HÀ # þ3Тɦº,Õ) ÈÈ2%Ò‘Ë„¯´|Aµà3¦Ð*>“ŽG,¶8% %-O Úã”A¢õ%•Lá}pUH—[ ¿%µÊÏd©)àóšÈÇ™²LþUþŽ «ÃU§}B@-Ñù[ƒ}â £=Ѥ%„e¡¯À'+äNç<®gJÿg›ï´dŒœ”¶ IJJÂ{ø-Lög>@J©¥Úèwø D!*ðT)gš9%bVºò>§ÙEñw&§ä=lôF¹ÑØÌÃFï1{ø¥Ø‹ƒÞ§`J¸Â³…Š­äM­M¤¼žFÁÐ(Á2û=J°ÐÅÐ<Àkh”fÌ£’"ø&rsƒ˜ ïQ:ÜUJ f JµVŽG 0 ­£ÅHÏF9Q»”Rm RJµL@ë,1pV)íV0ªR¾°?üŽòm=Ò5'ÊSÊ·CÂô‘”"%C£ì†9(õ£ƒùôœ¸*™¦Ö+w¤´›ÒµSºÒ³2`Dð®r?ámqE>™Pîä®Á¢Ä(äR,@7X™Â>"`QÐþŽœZ½Qž0&Ü#µ’`37!~<iAíù,¥ V2°P{èú1DƒÒ4ë xb”6¿žDTÚ ¿O=‚ç3jÄX¦o¾¹ùñÃûüÇŽàøËÍðÄË\'/^¼¸ùùo~½ýøòæç~¼ùíö¿o~ú׫¿ß~¿üùnùóÓï/^üi3 =Ë2¤ ËýÄcÆüíÿ¾½ùöýûo~ýÏëüô·¼ÿçÍwþx{ûÇˈ1ãï7ß¿”åâ[<òëÍ_?üöáæ‡?Ç¿í—Û7_f³PJžâ˜‹‹‰&ëKœW#Ž´Pób¢I1·èa¢¯785À<±®O˜C]p¢,¢pÞ ó1è 3޵Zñ°ž·#N©ë÷§bn’pnGœ ¯°¨5ò83}7¤¸œq¦&æ#qÒЬ@ðx¥¸É$bY Õ³—§–L!Ëb©áS‹‡¥Š@-‡^SÅB>Dñ0UI#|v’%6`’ çÆ„2ìsÅÁ’¤«Îƒ>› Ñ>Ûª‡ï‘1!û€….N ÍÐÔeFcÂÊ&ºx9¤©Ð†ÑÁD7‡•z¨êáædŒCHSq!íH¡<€^@iáPÔáʈ]†¨‹£C¶buqtc$BÒ ]Òဈë4†"±]$ ½º8º1aÅ ]f§@:#‰6ºI ­ö{9sù%scf¾\òºkæp:¸ âY¹#ñÄÇî¡`:¸ÒsH}Q°‡‚éàJ“ÐÓ¢`¥5¤t.r\)-Øšÿ–ŠÙ% 1•œB[àR$4Ÿx q%IÐ5. ³óðj:F¸‚å|MK(-H‹[ô¥:F¸")H_ütQL.{„R#\Aº Ž-@H·¡á@c„ËÈFb_€2²!Üó#\®Hç¤C%z„RC\.qA.]ê:†·œ˜ÌËZCÂÌ\ :†·lÌæu­îôÐ]*:†·,LçW ¤CÉ¥„`cxË‘ùüZæ Í¥†`c(Btz(" 2—"‚éN5©Á@תÒ!—5•‘(!á¦ÌŒƒlH=¼œ¥ª•–Ý—jRÃRÛh§Ø‡l$Ê/H‡D<¼œ•¡Î“„9ýZ‡CÚ]]"‘íü"súµÇ2©K ÛÚNE‰9ýZH@Ú]\ 6F"«Ìé×BK¥.…{µSSBN¿¬`v.…{½SUBR¿ŒÅRÎíýX,-e-*ar>öºSõCÞÝÖJ‚±ZêRI°²\·®•ƒë6—J‚½Û©^!©?TwW—JBŠ;E%$õ‡J\·ºTÒŒ´0«_‹Wp¯Õe›f§î—™Ô¯E%ÌÍ¥vÊ~Æœ~ñ¨šæ / ²Ÿ2§_9g˜œK!!å!F+¦u­ÇÅ\jÚiLŠž››ÕKM εyXkª;5% ©®E¥ŠÉ™‡µ¦¶SëAV¬‹µ +¦ÍÅZÇX$,™ÖµÏÌÅZwê~P´¶Ö”X1m.º°SöcÅte·—%ãný¡ÒsÍúNzs¥úNz{¥úNº½R}'½»R}'Ç+Õw²\§¾“õJõlWªïä4›Üz8]XáõðcyŒil©I1[j’Kq%öÚb ™s_^î¯gí¬§-L¶‚ßÛÃÄï¸ îëµp=¾^³å{íZ®Óm½fóxºÛͺípe·­ ´ìÉ·²^³Á¼úôÓÞ¡mCÏØg{vH0É8×#cHÛÀm˜r†à™Ùœ({,9;²ßPÈ.|¯Ùî1q»Wî ¶7ª³·ƒ€·²Ù ?ÖUÕûŒPuW'–_“¹›6VIìû†16 2ŸVk!µÆsªA\¸»S‰!Ö˜j„ÿ”{`;ì½È½óKÍ­…:” ëÅ‹kÙ 9{š…ÌEÿøïµñX[ÏôÅîô²ÚzšÔi"âO¤y§»#Ì aŸ±zº§®Ï¼ Ù4,+á>æa½Ì£¨s³ª(,3ug°Æ•Ì «—0d½ƒõiÃ:·\Üêή½í¥LWYœÉÏ.8ˆçŠܨå<ÀÐø:ésÛ·f¨‰uç(P$ļCí<ü{ì²eËÓ}®o9ýè%̃s·Ï õgÉ|šø´¡gë37¤]öy_¡®šÉ|Hî «Æ=—ƒr;ºz[uõ.˜gÎòÕé곋þT¾•Ú°·¹Ã¹Í/}Àú±§©D'_0†Ä”7`é«'”mÒð „ž´°§qNÃ;?óÔv÷Åb—³Í–a%À×9ÜÁz\Òûì¹Ìêø*™ƒWÈ5:µïx…hõwºšq,ïíà·E÷òâ—Hm¯Ô·K„+Ø™ }Ø9É»¸Þxt©Øç 5ßWS¨óÙ3å{T¸“ãc '¤Ü‚Ö|@*÷Üï!}‘äžÍ«œ¦XxŽXg6f¾ì§)ªÎçsë®Xª<ë„b’VÍîA]È /V¢¾Ø?/u¿¸¥ç½mæ'ö¹ÿAâ"v¾;)wˆ?{‹Ý"ñJ•Ò÷¡Üß_¼=¶µ‘×o ^ÛÀ?]‡=CÂ,áéLЩk á ˜b Qkà{gé.ÊÁ可+W8±~‚aåVùCÜ×ç ïW·{ÚóÆ7«µþ´ë _¼o?º>íóö*m%ðoV;bq[Ε¤åôTwyƒÕ ‹ïá XÌô¹#zjعœèy¼êU›ˆò&?7®_xd7§¼¼ ƒ-ÙHgKséÛ&{Ü¡ã Tkàû;ù^ÌWÌ*‹>¨a+³íîÑ™ºó™óµ[’v{€ÎÕÇ7$oyð¥ÕÅGÖR¤ßÛRyòÌÔ·Ë命-¾›—Ú6[{Ø]yÒÎÔ·uêc”{Ú”ëÅÄÏl¤»6ŽêYR¤M§ßBÕe*ìß‘ùÚ!òmÕ•»úÙ«×À÷ÙÀ KØ:¿;†tlx\~ž¦–Í|xæ¦ |µNfñ;ÁZ›Rçéç–2‹‚¸\`<ôK[K‹šö°¤æR{…¯ uØÙ÷Éö\jË_ÞŠû?d¾ endstream endobj 357 0 obj <> stream xÚ¥ÛnÛ6ô}_!äId–¤(‰Ú[–ËÐaè-Þ€aÞ#±®P]ÉnÓ|ýÎáE–c¹ëZ$0ÉÃs¿RÁCÀ ,È8üÓ h‚_VÁ‹[Ø2Fò$ Vïá~É(ÉÓ`UþÞ.ò8ìúFíºÅ2ÎDxu÷çâŸÕoÁÍʱz÷«ÛôËŒÑ #y†¬$#4 –)I¹áƤHåD€òhŽ,!¹–qJ’ؼ^,yÊÃ÷^< f³ ÷ù„…¤„çÀ©‹EBîiÔrÐÛEÂB՛߯‹¸ä4ü¤ê½§#e'©p¬Ö '3N˜Ýí\ãcÝJmWÕ?ì«O ž†æ‚¹‹8ÜéG»­U;’­i,Úªì,VÑ5ÑhÉ©$2ƒ˜Äãš z³×ÄÜ:w1éÝÅÈb) ¯T© `1 {½©†]ßÙ“Õw5J’a¡êêI•îZ7vÝ7Žº®ÚfË@ìVõÀ6²7¥®«¦Úr¶†]×?cð°×÷½ò$¦FQ¾Yð ©Œ­ÞœÑTý¨›mÝýìóÆ&Ø4ÚqL$ÇŒ¥$Í R*º¿¿Š¢X¯[CI§<£/_¾DOOOþþ8ìKÏsôjׂêñH8}™ÏY^LŸ‹Cµi+ŒráÚÙ¥¯;Ýçpç$w-fD®ž•ÍN¤OÎßoçeK/|¬”#‚pîè#½œáÁ9ºÍWq)ÉrgSq—v¯­ ë8ãõ®j:{œ¦ [õ’yG`™ä‘÷B··Èí:±#_ÙKeχcŽŽÏ¦˜AøöŒJs"ãÿ›QséÄ2"åÔ[1*ÆòðZó]Ç€:ƒxD†h vSE¸qeˆ[ÛG¤Í½ñ—ÏdªþàG«ìõ¶¯]õ3ôE8r¿¡tk£‡¦;él@¨Ki˜ g*Ö€ecÌ{l‘S5 á± o†C³VÈ©.GÏ$,…ÌÅÝ0ýUßëÁõ¨Ò¶t”—\¨Æ]ªà*§0je½'¡5‚1mò7ÖÂ<µ˜€Že!޲«o£°µ¸bÖrs=ZHƒ1ÀîÖÅÆ ºõ+:u²Q²NMœF +è´<]q_Áì#Ôvfô‹ð—›ßx¶š~¼Ÿœ 2CÁÙDBG g«[gb`m—R{,œubÒÐ`Š$ó£Ï¸ºÄŠ8ÏÊÅíÝ65\±"<ëIâ À [ta<7&?ÁXOú;VXa’ùù/’1õD"ln¥Æ¬$ŒÑÎÅw)†Ûg©eYØõXaÀ54§ëâöVL_CFA -`«ÐÛž~° þ$Ú åP•Úû‚‚$Õc÷À­Ñ†¦Ö±tZ.F­vÊÚjáñ8Nh˜ìaDwFh™B«{mÁ“y†âueÏ¥£>Ì9„¶g,šT8¼…l…›ˆoö•/>?þý¡Y§1çŠë¿Š'Ÿ”ÓævHJ7¯›ó[;åT.t_ØPš G¤ ¨Üom¿µ‚rÿùrö^D`1ü‚ͳ:‰é(ÐY¾Õ))j(³ð%2“¸2ОÝ{[¤Þr .™7AÆp|\'̵a „ݼ75ä ®0 ³îH,åú‹ÄäÞ|C)\3sïÕ1-÷ÊM ËæI?4DšÆ"uqq«·ò«¯ó+î¼4vBaÒ _ßDo.ß]F×/ïV—¯®^^FWÜ­ffÿV»]­£Wúóò¯®ÿÁ[8¢ ðyÔ«U¡6]ÄH˜TžÇ\u[ýQ¢DÄ|QµËëJ³çò“¯!4@ÆŒNqÅ3ÜQ:dÞ‰s|F²”2¤k&3ÂÇsÜo§“²'“拃#’$,?þâ·¸i ¡4Sƒ ŸøPR©‹¿{ œŠ0’*Uã) ˆ‡÷jЮ€ìcæ5›‡Å¾ÁÑ.ÍàAø»[<]Ùƒ`’’#EŽ?q¤ÕDØüH…G}ûÓ¿Š~oD endstream endobj 363 0 obj <> stream xÚkoä¸í{Å zž^F±$?³‡Ùìf±m.¹½dÛ;‹V;‰=k{6i‹ö·—)qÒ H0–HŠ¢HŠ;Íä̇?9‹üû³Õzöözvt&åLBÑìúð 鋯ÙïT¨9LÓÔ;­«¹J½®©K“ÕÍ|¡£ÐËrüÆ^gn`à{yiZ‚<¾=¹z?ÿzý'`Ì¡Ÿ"wŠ4˜-T*´¶;\Îy+dØ>±G¤e¯fbo‡¦m·k&ü¶åÙ[HÇ1ƒM˜ÕR‡’5kóϼ2W5}ok@tuÏOµàƒH-ÂÐÄ4ß¶Åw<PjP†Ènn…%v´‰éп ™i`­”—·«º¼ÏQ§JÛÕð± ‰†úJ«o@Ò¹b:—Véãm¾¥AU¯™¾2EZΫ¥bÞ˜•9±Ér{€œ­)o7¤ÆU±ôu°žQª^×lu™Ì®b(p-¤9°ÂL8G „Œ™ dPA‚ÚPAêmšbMM@ÓÜÉI?“ä­Š÷nˆ ¯'Å ãm¶kšŒˆ4"¡œ‡æUæÄ ÏÀÉÈÜ‹(a:TËÀÞuNݯsF€µ.HßðÉ0롽MwopB†Ø¡ìHØæw[+Òõ*Š­Š´Uê¢*zššÖõîm‰žκXê)ûÜ !Î& É6F‡Õ GÅ—ê G­DäÜál‚Älj.±ÖxåÝ¡§8Æ;;]zL2¤R¨„)ª)‘ð~9Ÿ*Q0>ž J8ØóJ’ØÚÐ+³&|Mð,wðÆ¬º¼ÉÇàάMußS o[îÎYM¡Æ6ØN^[)wm/^­¯`Z]_&-"ü7ì³hs3©l¨„þú wõjcÙ«DHGw—Í'§Í'Ù|ʙÿò¬n×è™M±ª‰8c^/be½ RÉh%‘ݦ¡Zˆéz’eè <¯Æ´¿‘KÏÐÐ!6&kžg›Š4~[¾žÒó—s’¤Ò£¬x‚Ë ¼À€z­w €ëº-Ö›2oi’?æ0c³µ”W”Û¶kØF†MԈئ̋në¨3ºÝždvi“±=Åûk® žFÂH‹ˆNÅé5”¶‘ÿ*p{EE_)„ôÿMøËÏ×t)’&·u;R0•‘Hå(ÔÂÅ —sø•þa°œC\“ô º>8&Îê÷Å’Øý‡>oéû¹*0¤/½…òT°†V0Ù Ý‹qpÿãÁˆæìò’™|a™GÅ`د"ïô W»#vƒ6ïˆâŠùfæ2; Þì 4V±"Â{ºŒvº<&ä}~ZÐ÷ iDã}záwòubë¬h7¥ù‹;Aå›±«<)¶Usµ­ÿ¿jûòÝÛÓ×Ûi²_["Жưõ ó·±Üíˆ`³.:¦Vù㤣5°"ô}, }cªUÍlÜ®ö†áÕ§sÚ|Û[– pËõÅ~uio½«jÆ7Ù§Ê/>—iÍ­Yq ¡ òÆ´¹ÉøžW¼âÔ”%AιŠ,‰åGRÓŽ•òôü£‹a`Rê§~ýÀƒæŽìÏb Ž˜ƒB)âÖÑ¢Cíã:^’Œ#ˆ†:)J,ý»üƒâ" ïÃÅç£s8"ÃG1esاO¨Ò8è9àØqÀìôˆ Ûr f¿œµ Ÿ¸@Ø-`Ö£3Ú˜Uݹ>‰äZ¾^Ð@ù"t÷DO*0g¼—¤BéAô QÀµ8 ×¢j;ƒÇ¦)‘6Åš+óÀ[³†LCp¦æóÚñ‡ó_þ,pB>²º+®qµ‚Jzö½4ùmÞmÑO­ é0£&‹Ü•+ ,ü×(ð>½£´ÆÊn¡S‰E´ º[<<:³éw.“ô%aÊ⦨³›•Z ÷o!¡vI†9ý‚j´Öš!4Y5AÀß°ºƒÄÛÄ"úêó†ê €àÞÜeÑ–ipC^o/8nŠ›²N+žgŒ/8 ˆ15E¶¦ÐßÿG »X俢*iB?±Êb?¸b£oï`F€i[ãBF\€´PÉl:e½Í{möÇpý(TZÑôûƒR>=(%I8ȱƧÚziÆà¶h»|m±ï…;Òc*m;_ ñ8„v³ø^d[Sô4t×nóưÈWÀOé: 1—‘ònu„šEULycàK Ãl<Å4‰|ÊÝþ¶i('‚À¨¬½›‡£Q6Ll6´yÛ0š5µËå¡Ób A@ ¨„lÑx·† cÖ]êXUÔ]Xú-ÖÊMQ3«¡/û6;C]´ƒv¯:†+êq0([öY×ÍMÕy¤iG ½§''ÀõÝⓆ2‘k=Å ¶ ¡D û&gÒhA0äó‚Á†·Î¥îq¾Å¨ b=¼"?«¦nëÛSZäýÕ>›@ðÐNf]X(GYW†#0% ÆL ’²%À÷«1PÚä“§O€pÚ…¥]ðgîÈä$ÔÀä‰\]$Èpƒ*@ ã+õ`n·Õª¨+SÂEÍl<¤!|µZ#ªêò (”©k”~›å·E•S¦AÑþöîüâäç÷\¹£‘µYYN½*-˜ß΀ÃÀê»ÀªúW°ÌµéìËÎË#÷|ëºÀ©¸:¼ʦ(‚LæE"t¸Ýwâ~úa¬ïÒàÈ­ ØD£Ð}6O p‹ÜŽ_\0Ù]a./\Ûì² 6Â=é÷‚­nYçMcú»%Uœ Z²5Ü.l©;PSzé´@,ÇBîÜ;}4•ŠâáS¸‚:ÒæX力 SüŽoB¨¾´(µÅî-ÜŽŒC=y gfeîø;ÿÁ¥©øù·ppòo3¡Ódö€ ¡« Õl=“I,T?/gW³O|”qBE» ú„PÉxÜ#mñ.lËÝr˜ m Ò„ßM hDOÆ—Y*kñŠƒøcìËa€BÓø©}sݽ³Àj~¢ 7„™Ñ˯ò>^]}|JÀÔÃ…>V¾¯]<h˜.büUìÏ'òm­…´™'!>nWŽhS÷ž÷Ó}×mŽŽ„­IEÝÜýÁÉ2ÜÁO„êsÅH`ôî–$i’8“~úÍl>Ù´ endstream endobj 366 0 obj <> stream xÚ¥]oÛ6ð}¿Âo‘Z³¾­ypbóÅmìtæ=È“³¬T´²ÃþûîxG}YnÚ 6 òx¼;Þ79ø4pcø9ƒÈ…ÿx°Ë×ëÁ÷ïü3¶ãq±ÏiªäÄ×C<—ë{–|*“} Š•ø¸®"8ʯš¨'{s‹x‘É£¬8¦‚Á‡Td&;ÄvÔÔMÊÑÓ66-­å³~œ'¥ J®Î²á>€¯Å¥bÄBF'Õ â¶ÀoÏäÀ¸í¬ =ŠtÖ#Åo%Ú)$E3\öÆ_ÐM—}¯°Øåtæ"ßiÎ(¨³¯e²º{…j±}ˆ2c[=æ-Sü—C¾[ÜÎÿ› ¦r|*å J‘·…xdÅ´ö9ß$$¶WäRâð{§H”ªïr ™%—Õüþu3ÿ?O‚Týí ®ÎÁ)û„ê².½‡ô|ieº8…@KsÎ/Äm3ˆã Q¯D±çç8šð4B.gLN☃~tW“ŠQ* qLŒ‰úºì÷¸¢ûß` ’$[î0’Ñâî '–^‹jÎU†¨1+âh³â n,"í´£ º6"A:HtúAàj~;¿YÓ§²ÚBy;ÉŒaWܵæEEÒ ­¾î6ls=Â|áµÇ•‡ã,‘xfµGÀ0q<p-ÁOÝÑ"èÀvÀ±b4#·Æí—Û ýºÅ~]ä±yõ É«J·4Õ:D¾:¥h÷¢±D}™ÈÔúZÇ©Áe—ˆÐ%Ø);'Ž€«æ:|ê Zy“M'X—ø'¬É™ª]Ôsƒ–‹.Ö¸ŒŸ°é£= p¨`¸á‰âÓ“é²áò5GIóžZá­•H†–ä/ŠüIç+í'ö™¤Ì™ ° •—¨äo·" ,ÕÛbË”ã63ôß\Ë­Qš @´cë)Ù&…4TébŒpþù®46,…ÚÁ¼‚Ec®`*¯²LuªªÕ徂hB‹ÄQ}/Œ'ÆYâ¨!#£i[ ;kÌVHÛG š;¢Æ©pqq}feôÏ8¬XNzýóä,ÚWÏeû)V›¨Ò“O¸ NŒž¡T¼Š"â·g˜+4ÏOÌåÓãb¿Í ‡Qx¦Ê­:Êc)ÐIã…ŰzµPÒ-:>Ë×øáïªxšï8¸˜ +¸¤[†h’€§¬¾©®oQlñjÝ©2åVKd¶³Da_xQÔ¼>7‰ž˜¸#鸰p+™õ=¥2aÆØŒøŽ5Ïê[¦¦ZW1>„Q>jõ~‚n´çº/B× Þ´áâ\ûÈ/Tæâñ…v‚hß)Æt³ž¯é9³ûÊø1V0i`õBOœÈú›>{‚‚yôôvy3]¬hü} ™ÓyC;vZu¼~¹lY©zSã-V¯Z8i¿luöÞ/ß“HëéõíœDX¼£ïü—ÅjÍÒB•{h©òË>27÷óéz~B¨ÚDÓÅôg„¹¸ÃºÅz ÁÇéýÍÓûåÁfÈ«¦w´c¶|¨ˆo†,Š1HëñÈ?™ F¡?ц¡AýðÝ¿—­Ú© endstream endobj 370 0 obj <> stream xÚÕXëoãÄÿ~ÿ $âHÍÔöŒ_î*Ûd—^ºi·MYE÷Nb7k]'NýØ. øÛ93çŒc§!ø„Zu^gΜÇï<\ëÑr-~\+ôà×±Ö[ëåÒ:}åÆ–ë°Ø‰­åƒå,v­‰Ú¬eò½=ºXÜÎo–ã‰ïöÅby¥f¡]¦U“×2)p9úfzy7¿ÅŽÔâ×/ÌHÇãž>þaùhâræûúµO~EÊË«sºúØÈ]%2I¿ÏÀ­_‘ôíÝtq¦¾E&F“ˆù\óžæuZîd}û¾-·énì…vŽ'œ;ö~<ñ"Ô½DïyvEcZ­Ëôƒ¢NKµãÚëb[à¬J7MŠšÌ—õ—ù¡¡–«\ËŒ‹€0ÀÇdÚsñè:qlŸçc».‹4R | ´ TP @,—î¼ùñöíå@¹>‹…5ñbƱ«+–‘{Ø4D³W!…ìaÙk"¬8m´ÁŽD`™~4 k‰§+iêQBô`œ¢Ë—‘ÜQ¯¢à‡¤3KW™TàÄöëÅÝé%„0k>²!µ=‰˜²ÇB´„à-ˆõæ£Úòl¢zfE®DW#Z&"Ë(r²Œ:l*‰{®÷r]€0W @ è‹'Øâܼ¦I¹!¨8V¨’/¨$8ó ´¹1ÇÓÄᲺGWz)ÔÕ ŠC)#‚§r‚£|®*Ý!8䘪–¹Ž!µ”ÔlTtIâ¸.3 ž·ÒÜ ¥õüõåõ× oL{ìîb/´eºK¹vúÖ„—µI£ƒ±È Óülš¬Ó"é¦Gî’?ÊܳÈ3Å‚9Ø>VÉ"r_O6im2°?§¬œ­¶?Vù:ÏÒ]íúeÒ¡Ž.dQÔEòBH„½!BaËGß½ÃŦ)e‰;t`̪æÊ¬f·”8{/WYžÕG·t…V“„ÈVÙ*πњÖ½Jº‰Î8xáKÑØš}°¤sæ¸s“IºSõl¢M4`–0b1ï”wÞƒ$7T *‘L(ÉHÓ¿÷u?¯tŒ×Š?˜["÷(·¼ÉÖeQÀPÄý.¼¨äòT &¸»Ýä¢2Y‡ÜD]ž*Ü(pÐÙ%èfÊ»j<Ê.‡¼‹‡ÏE‚YGç[tJ×ñU×éÊN”tµítÇ¢Q¤N:(RË´ªÉìÍn;™ëÊÖ8Åß*6X4ŠüO„š¢tŸ&éC¶K1¦Þ|¢ýwv¹˜¾¡¢þ‰ 3–äù'CñE,ÞìâÈ18R0QèØe ¾#(Éò±+°j7LÂ!•X`$ªÁxð‚€ù(Àí!Û°÷*Ÿ9¦X¨¹ôb胮ZWy‘òͺÈß+ݼÈÃÜÉŸ×.E©ÔQ‡ýª®nQ Ò§UÚàæ®Ø¦4“æˆò©ê¿CzŸºUE§íØ)TF¦´¢Va)3®Ûþ,™èî|È~ãž±‹v4`=3h¥ŠµU"êø½”g-¢ Še¹iô75%v%ŽŽ.ó M½/iÖ6‚½$•½Êl›f¥é‰Ìk`ÎÂÙÑǨ¾jM1ù»]•wèª\B¶’¾Îrâýþ îRµ%~½¯”ï“VŸÑ Zvõ¬þ> stream xÚÝXYoÛF~ï¯Ð›) bx1ŠB±Ô…k'¶œˆò°&7QRTx¸-Šæ·wfg–"E*6Ч6°ËÝÙ¹÷›Y;Ìì™ö,tàßš%Åìõzöò7³-3¶âÙúÓÌöÍØ›-p!˜­ÓÆyöIVr;wB£‘õ|á…‘±Ïc#´–ˆTf‚Öêë¹%Ï%P‹T0ùn¾NeµÿŠŒ’¸—ÄHÒÖãÆõýê¡Í…9_D‘kœ‰”Ù+ñ4MÊmÕú+å±-æ×?lŒkú¾2Nª—oâžÍŽe:è¤Ø–…\¤å"™û–!ŠÝÜ·’ÏôýF¦­ÏÈ ž±é¼ý(ò²š`á„f¬Y°—ÐvÀn‘9ÖÙVä4U˜=´"OÁåàœ öëšIåC›;–í+‹êáé SžçS/ò™ë›~;¹áœ¤l(¨µBtÏG=œ+XJeµOÓZCèÈBÁgnß]’žÖðîÒzv„´8é@SžÊ‚kI£0Ü‚dør,£.ï+Þ(åÆ ¼ÉvyÉL–×&¡å|:RÒÀ‡ þL¨’Fj¾ S@ÔQÌ9×޾Í!/a$äb*μ}!xAN¼ç¸eÛ4K8cxic¹^qº…˜ŒÁAF¦0ÕíùUSk!YíÆÄ'#Þx’B“® ºªd%è(7pWjTjúìUJãºȹÄ.¦±Z~D©,J±º÷÷òåªrÃ÷o=㳄x¸l=•™PkÄS™Ïá×êKÂqÒ §NZ¸aù‡LÚF¤šSšU²:@râ>½EùàZpx€ Z.W/pÑ3 d"­5Ó.¨°HA…ÉðƒZÝ<˜`b㘔Õ3utu¹:[ÓF¶Í’Œ*>‘I.› ,›c!2Ô°N Zõ Ú…º¥8ÑÒ|;4N¦ Ø2C‰!«\+R7ßµbkßÓáÒV‡æ¤;Ó”ÅdCàºfŒU ¦UñL­6cƒâÜ(‰U`ªP ’”õ¥˜bÁ`­:;”#Ø5=»ïÉ (°ºðPjˆm1lh4Šqmx@ÕÄ‘›°Ï9×ñûú-®ï֘׸CÐO:\«4*épr˜tx"ási”Ÿð¾·ô]Ì÷RúQ§aï])±„þ’¿ªÊ…;*ú摼¤‚‘"p WÐRËã¨Ó·#nGcCÒ¡0¼™ž®ªðôóZ®}ЪU™æº£›n«,Æ¡*h {ÕJ•ÉNUððiQ—ltVi·VÜø B¶«¢‡û»G:Yâ°§#“©X çlÌQƒ•Ñ‚ìŸ{VáæÅÕíêÑó3:‘Ñd~ŽlQ¹z µ— Ô~rb Žì'"€þŒVQE÷*â—Â0¤ãïQ‚9l=nNÇœh˜„¿êö¾n²¦Íz«À¼Ê ™U=Q½ú6¥ÊñA|T4îñ[Gõ¡Õ“¢6¦‚SDóŠb tµÀ*šª‚ªÆ w÷=f0~êvÇY£`ê¸a8h…{LG!>ÐN÷°`uý¶Z÷Ñi&º¢ wÍ6Vž9ÎÈ×1ºž¶]ÇLx„íB‡“’އǚ)"ÿÒÊ}-Y´,J|±Ó½¿~ŒŠ1B6\¢üàm¨cAïÔÕš~ã'ð€€é‘jÌkf:–Ë¿hÈi£>/¯Ï–·4ÿ›s²7À·|/'?ÿ >:‡éD?-¿Èw¿¥÷§ðæSÓz‡Sx›©í÷²J > stream xÚSßo›0~ß_á§ÅHa ŠªŠ ¦¥Êò£qÔ‡¦ÒœàUÑHHh›¦õo¯áœ(¨–ån[k!£É"½3óa³á7Rt^-v†ÃðZå0¼¢Ñux9KšplóTg'é8Õ‹ËzcµjMâÚ–C•¥–çµ:g†B¥RË?rwÈ‹«œòžNÚÈdÄòü6·ë\B{jÝøF÷w»?78-Àÿfºä-Ëi4΂ßÿ.æãA´;D(BQÉë§üð+[GËQÒºÇJ–ÑìQU¿‹2ë+ n*æ)H+euÌk‘ g‘rpN_p«`2QË‹søþ[z—ž²“ïFï•ÒŒ|§ÔÍ.u±}ˆx’ôkÑj¯Þ*ê¼¼!Àó¨3—“î8êijÜ Mgá :ÿ𠘙ü€ endstream endobj 380 0 obj <> stream xÚ­XYoÜ6~ï¯Ð£ˆ¸"©ƒÊ[4hë¸Nâê>0+z-D+®uØM}g8ä®d¯'â€Ç ‡Ã™omtñ(…<*ü¥Ñfýp­æ‘HYQÈèòÈI…‹è²þ+þ~¿J¤ˆ¯d.ººÙXUiüÓêïË_áX‰Œ•ªôÇrXTîØ;3ØöÎtµÅ2Þá(ãÚ´v Ýá$‹·íx½À,â)«Ò òœU­XAB_%™ªâ½ÞØÑÐüõÙÅoîè«Kÿ°w¯ý¤ßú§¥QÉ*§"ONéD¦2OÃ¥ðQº+dšÅÞ‰“Í vo€×yôÈíÉSÒ6ݦ½ <­ °°{w ÀÁßscÚÖStïô†^^ƤÁÈiG03lúf «ŽìŸÎ_m'½57ÉI+@ôQT ‰øõùÄôF7àQæÄy rÅréD^ NNM‘ ‡dXO]³Ñ=mižË…çpÿv2DðtÝßN{¡%†ÚÓM‡ÇÆ^ׇK:d'ç|G[ÎæÈ\;#\ɬ„ÿÒ‹®ýèÞ©œÉV¢PËœhÙ˜a€C¼o,!$¼õ`>3xWmš«Tfî‰h+M–²„ƒãå§ñ/Jí$ÙYÐåDd’¥Êsu^z@“Þo<  @že=Qe›ÌnßÚ—!¤)ü«GA ¦òy<&9/ºÁ¢ˆ¯­e°<¡hÂK¦ÔW2ME\ÿ5~I¶ÆÙÒÖnkœ1Á%š63s"n¸G½†°óÉvh6í(Á!Eú1«ˆC¢1®œÝò<ÏËȺÑ ã´ókCïIC&ö*ƒ?, ƒÙN Asé Ï{A˜Ïó‚§ÔzÔ4G¬N¹Ç‹?ºçÜÝ\ü‘ڽǯGó<i‚ÏÇ6F½C³~ÀXŠ}4¢„ЬÄK¯ ,È«/ û]36µ×‰Â\=sx¿n†eN»'L,à«þg Àgóz”g‡²TKó¯w(z@qGÄSøzþï±Î ÷\¥ãL—Ž‘¸Àà&i¬Û­ËíHL0* 74ÃÀûŸhì±®âlß7T:®_P†ô×@-ÚQ5 H ùw ’N'_©já0"t:ÝÒjæ8\éºwÏÆD“–Î6¸ƒ™¦^%Ä0àYÂØ›ºéKoNhN ÔÎkn j9DΪ)$=U^Rþ*(=j B.ãß —e¹ÄÎò‹`èœøé˜Îìô|¸I‘L*rg –&…0›(8giºÂ­Ùù£”a…á(wð± Ó­éu˜Ï›7Xb›2³;—‡7̪IÿÖŽ>ñ¹Ðî}ûŸþ¢¬ÈýÅ}»?Õ^sš pª ‰i;™Ï;7OÝø%ÎE%Ž=©Ð‰2E59iT““LB` ¸U†ÀM-q=ˆ»CÈ60?vŸê<ÿ¼)8aF¡2Æ o¤'õ†/š¹ øÚö;=ú»¼8{õ'MÏ.ˆ~×8HÁÅwXš|û˜øöÇ©ÝùŽ·Íàkå]3Lº}¢ìAÿÅD›Œ)Þ¡ÿÂf·¡ÙU›]Ø 5†Úvå2n?笠HàH°÷BÊh¼êòÕØ٠Mç¢Lt›F/Å|z:>( ]óËMv*®‹ž‹^ˆœÉcˆmÀfOa£Â†îð ‹Ò¿²¬çª`ù©|JW»›Å_ùœøƒûn#&+Ýc!(RÎò,ÚE\•LÖmô>zëË#°©Ü¯‚e™ãÕò—Ç+òH± 4^Ð2vÁ)gÜŒãþåz}϶ÝÄl¿]öz¼×½YÃã>®‚²…ÙIÊèÇŠ2 ¬o¿ûÅÙ™¡ endstream endobj 383 0 obj <> stream xÚuSÉŽÔ0½ó>º%bâ%ÛÜ €ˆ¾1<‰{°”Ø;nñù”—ŒÒ,ê´Û¯ª^½WFψ¢~u ž z{FoÞ Dk2Ô:_mÈ P7Ztž¾ãoêT‰NàŸ\Ðü)ó˨Qy¯'9ÈþV~têzbV.îp–ãí QnKš Ëo¨Ó£ÌöqƒÄ°ž*Öc5Û—7¹Wé 0,…Ÿ{0-¶¯O?ΡÒ'M“ºš ¿ÊgÎk¼tñ‹a›_^=¸m Bñhi&{—R¾;gíèpsÒ3T Nj‘Ê<Í+Ð=U ípU-vRiÑ⋵–û‰ Û¶¼ŠG1(V¹õ¦*ùiOžòå»¶Á£ôÐmÅAwÚ?µŽ (rþŠéMæ…)ÇáJù›öXM k`‚béÿÓ„öÅŽRKÎ|±n‘[)3Ê›úµo­³4™¾ÀWF ”ÏÍ"ŠÏ‰¦‰€YƒwÉ]&éŽî^µr&ét·þE³û˜¤ÇžÛ¢±ë¬öUf×c›ç.+Ø6°.¾`þ©=ð¨Îÿ­ïH/ hMImª³—õq®c eFk¢›“SâÖ£ ƒ˜nœsP°SåÀdfF-ËQ ùðù˧"W͈èzi3ÆQišTFÝÈ| &ÉéÇ sçS¹$1)¹¹ÇVÑ¡P Õb™ŽîЯ¯~Zï-» endstream endobj 386 0 obj <> stream xÚUMSÛ0½÷WxÊÅabaùÛí JÊá#MÍ©ô lÄÄr°œÊô¿wå•Iœ” í#­öíÛ·«•±,j¹ðC­Øƒ_×ÊKë(³>SËsIùVv n'Õ†•ßìÃÅÀñ=ûÚ=Yˆœƒ•ºöhð=CXly‰“Ø„…`¤mØè‘—‹y¥Ñ¾]ðnUy-®ý †?¿u/ÎRÛQš|”eÔ¢ñƒÈäðÜ„x&!tàP7Míã-æ(Fæ(BfŠÌ­£7zy‰‡ç¬¹›ÔÕÌTXÔ%©›ê¬4$i™Sâû˜X5šÛOu_(î–š'pmþR9æìyc¬‚wë¦ZˆëœZ­—tjá`¥ É=r¶d³Vüó*xå;¹¸jkrLÔ'aØ–Ñ•Lú O×J× O( “6`oà„4²¯ÎõÛ“éåÑÙèü­ãz³éáÅ×Éå4Ã!q×3îýí¨Â–jžE]ÝÌyÉÐâ2¯dS3D™Ãy5ƒÆ‡ª¹9)Lp¾TºU[jˆe…ž‡¥°†Ë^0…àJm½¦¯‹(y³Âpr£J¡YÝòºéŒ¢ÛÜÂ%Ó›¤*òÖŽPžÂ”_ûðrÁ>¼š$ŒÀ¡OŽ™l~‰ª:ÁôGC\ߟ ÉY>}ë5+K˜"ÓYàfôíQ¢’Š¼Ç±Á;óNj!ssiæCмV¢y2sRs¥†ÝÞ@‡ˆ½à?Ñ1†þdP4üá›Óºc‹†›Ò|Ç'½H/&´…)Þ äôãv3öÑ·v[ýÉârθyµÐE³›ö©Ç;¨ÍèÞ \0¸3RÏaBâzú{sÎ,[õæè!N˜öòÒ¼&Ù›ôÜ<ß÷õŒwé1¯ ‘²Úz9‘}ÿßJŠ­Î˜Iú'B5Лöem()ÅüŽÁÀn<{}Ú××}/×ÿSx^¢¿•Nà3ö:è—w&ìe endstream endobj 389 0 obj <> stream xÚ•U[o›0~߯à‘Tc6¤]û°›´‡sH Ô)‘lÎÅþ.Æ8Ïs¨ý1'ôìŸ:‹Äù2uF?ØØa”ŒéØ™.m~¸Î4ž¹k™Ëd0äL¸ËËÁÝtR¦}Ây™a.WFïç¡«ã[_ø+™«jÖY‰…Ô; SYEb E‰^AÈNdó³Qµ³ö×âUC™Naüy‰ÇfxòãÅbÆÅíLŸ?ÞÁ|ŒRÚÃy±)L†Í F“Ë´°> stream xÚ­WmoÛ6þ¾_¡r;q")JVÐ h² Èà¤iã¢~Pl6Ój‰š^š,úÛwäQ²dË­;,MAòx/ÏO|ço‡:>ü£NÄà×wV¹s¶t~ú•R‡„¡³üûõI óõ{AØ –qì^u“ð€«,y<ŒÜY¥k3ݵBYY©ûÌ­ÆZâîÍböaù íÚu*H8‹ ç«n´>¥nÂÕ3æ**Y·›&]Û¥‰ cZÁÞíÙ1‡‘ͦÛ8Ê'™—ð‚ mŸ³Î²4†½]­6Ÿg "+›YðÐÔÊ7¦¢.U¥W¯_$‰q¶,"Ô˜^eE–gÏÒlX„Àl®ÚºQ'èú%úð¡ %O‰{+Ó¦Ùȯåã—?Tõ)™¡V¯LÇé@ùüÏl•>(е`¶U‰žÁ.d{vKUÊO)†ØÇƒªiñå—L>¨!¢#£ô¦[|ã@”…Ú=*ÓHXÁ¾º·íý_rÕ £¥Ú)2¢©Û²ÊrY4ªO5™‹~°ÒSß.ïšFî«STàÂß7áìÒŸB:uuŽC»_íÞПÀ»†ë°X§‰»…ñ_ªz ›ÈýùGýw8xŸßÉ·Ïëˆ"#5í®TO~O_©v–Eb§Ùõ•¤‰¤X/¬zã< ÁÜò·ü÷ˆJ€¾ò&Ëÿ_ŠÓvÌï(ŽQ× vã3:Œ«µUÌÆD ;=ÃîÚÚPj[‰»€Ò¬e±R…&µfk9¤=Ä´ ½ÀIÌŽ =¾¥=d¸:6 ¡¥/iÙlD{=ùÔ‰ÊMZ(”ZÄBÂúdŒ“Xô ¨Ú¦l›‰Aè$2áÌ÷ûŽŠc°£¶ÔÇt[ ¸¯ûDúÇÕ;õXŸà]’ ²BÛÔF4Ð>‡É‹ºsîû»V…÷,+¥u¨Ä.ï+Ý6iÓ/! Ü77Ë˫׋}µ7†0²Ï²óe8><&ÜS€SI \$îÕåu–·¹½AíC†QS Ž€':m´)Ò\ZÙmc&Â}­ƒfÍ?ßB=Bí{ÕÂwZïËrGljr•VY‘b+zÝ[ªÏÉ3?Ú,°ó­D¸ÛqbëûEt™àCƒëZ…È'¢{dIÀïž“]1ÊtËœ1t¶åÃ;{£~ø¶Ç{#©þ1BG°”Sí ‡Mù S”ehà† þ¨¸|MZxæþ>€çlŽ˜‚Ó‘*4„¹3Œi©æ˜ÑÓÌx(ÿÅ~þ–3CAæñŽŒ²ÁQàón/u¼ÁĆeÉï@a3¡°²ú{àÂ1 äÌãAtl:ÑÉvA°ptŽþl€¿Üï¡%Ø(èTßþð/ š¹a endstream endobj 395 0 obj <> stream xÚTOOƒ0½û)z„ÄÖöWZàèæ<˜¹Ä fÙ¡nl’mpúím)*N…„òxô½÷ëôŒ¢æb(sS4Û ^‚.®A ˆÄR¢dX@ ŒÄ€’ùÄiâc××ëj“Û¾ðrµI}̨ Þ¸4Þå¬Ì^²òÍÇ e¨wéÖ±u•ÏÖ}QÀÀ(õnÕv™åjíO“„ŒWµ \7ç·šèëùͧÓ!k8¼í€9ñ×É8Ue¹NÏGé?èíjZóCJDìø¢æ÷jX Ŧä´ÅtC0Ðа­‡jý§l¦–º#&ÛbŒ°¨™ÓFMþ›?Kt‘®Ô­Ñð—{Û¨ÑÂØj4¡\:ÌËÞôŸTޝ²t©—÷XbÅŸ‹®ÞÏþhwC»"»&~,üI‘¹uÚÚŻӬœ^¸%¯«²¨Êš=HÜ1 +Fc{ DDDË ªÿo” õîì3a= endstream endobj 398 0 obj <> stream xÚm’]KÃ0†ïý¹LÁƤ駈̉"ewâE–f]\›lI ê¯7MZèÅhi{š÷=Ï9'g@vEân xÖ[póL )¢i¶{·Œ*÷]‡ưZpÙ Q {m£¯íÆYR0Šp5:H†ªÄI…(õ®7Å´" ½6b m{f$ëBX‹IÂLᤶ¢¤Š’ö!†§(N (¬Õ³è> stream xÚÅZÛŽÇ}ÏWÌ›9ö­úlÉJŒ²`A’•s—³]R!¹‚’¯Ï©îÞžá4×^ÅΗ=SS·S§ª{(i¢F4š|#…k´"…o™?¦1r뫾Cã”m´“ׄoÓ眃¾õX„FJc»R‘ÆÂ4’ÿhg è I°¨ƒn¤5x&ØFº¸€º—¡1w"2Ò4JÑ¥Å1•ÔXÈFi‘öXÀ³1¶QÆQcZ„Œ…–õ Ý(R:Ê/ ê ‚eˆµÄƒ& 5…I ‡$·Q $IðL ƒ¤‰Ó‹˜¿‚/ ÂðËi3†ÀM{ämœœ ãü ?_Áñ3is¦€Æ…g$/P§FxFƒïJ<¨$Cu¥ù9¨+þ\)¾Ëêˆü‡<ÿaø$±, ãà vè¡À!¶Ì`רFÖ1>»@¥ i<ãð!váp—8˜ Gèbþøã,§„ÛQ!z֬ɹ ¬Î`9ŽPãã9BÍ1!Bâ’ûX Ï1), 4×ñÀF’à ,G"Ö‹ÄZV€8 ÇP<éXËsÚLp]5C'¸Àœ;ß œ4é!ÒÌPPf,àËp,`9ÃŒ‚e®9ÆÄæù.1S-; ;#Ƹ!Ëê‹,«Dh-£ŽÀ,«ƒÊä N¡#Nçc ˜ÎÉÁŸg«¼Ge 19ˆ«ƒØ;ãØ;ÊiÔ0X°wAX0ªQøt¿düŒä–A-¬tü V‚»@aÁõŽV¡íŒdS¡Úا(¹Õ& &Ò¶ŒºA-w¶AáÀžxÆpçŸå, áaÀЦH=ÁÆ¥nù ‹åĸ4°¾¬ãš¶Q‡Z>ÓÆ¥mùì—®åãl\úÖÈ@hù¸—«–¬3®.Û……«Ë–ÏÃQçªåq\®[#s}kdàºå÷<^")•üÿózRžÜà ×üNuX=a¢€‰Jþ²VÉ¿BÖ*ùWÈ:MC¶fRÓŸ'zúóf}¸à7t<_Ðã·Ré[‹¹(=t×E”€3í« 8upê0Ó9`¦sÀL»9û}»ÐqpÍ›RÔœ&Lª¡œ&ù×Ì$ÿ€™ä_ó³s$Ò ‘.H„k®Qp&ú/4à4É¿œ”ý#kÊ kÊ kš#‘‰LA"\J˜h`B  L(€¬)€¬)€mòcüÛÄ|y¢§TZíS)M.1å§é1Ñ5  ±C”¸6é(»0ÀÓ¦€ ð´)`Ã¥€ ³)`˜à7æûö êàšE‰:ÀÓ% ðt©Šxºs9 ær@ÌͱȀET°×üÞu€§O("fŸüðôÉ?!kŸü²öÉ?Œño§ž,¢‚E¸æ×Ò¨Ãö&L|òOÈ:dÿÈ:äuÈ ë +õ‰®RmHµt¹Æ>×8˜¹0ÁÀ¢´¸äßS¢;ÀrÀ€3ä€XÈ_·”g·mI̱Îb ØÂ<®)s+[Êãܪ–Ò8_XÝR; kZʳÛRKyv[v5G"¼–-|áɵ”§9^Z(Os¼RÌþW-Éìÿ²¥<ºY+¹g¥9…vq=¸a{ ˜ËƒÖÒ_\µ”fæbÝRÙ}Kyb>E•’\ßW“ÒFžLß©ª”|VÍM-së\pÊ>äq¡×ýÛßô•|l¶w77ïX¨K¡C>÷’Tý{ ‚ÂkؽP‹ššNßKÀÿ³ýÁ›¯yKЕ¯©):ŒÉ{aBëAhU²<i”;Þ%KÍ‘‚ìPœy!6ÆÎÖ„Ò‰Î<`£¤¨%9–èÀ¿ ¤ØèºšI¥D©¬ÕB&ÌILM¢µBvâ!iÅ/S“Þtë>BcjjfÌM ’ùTSKób’:çjB¥:C=卿ZuÖV„8%vZWˆ=*똻Šð]jãñBý TãhBè|E¦Pˆ!R¥ªÁŒ%¤e'Õ!<Èǯ颠€.Ë zMŸ‘+×Ùa,™ÊñºûéðRÊ5Àòƒ\ŽÁrP¯+i¡æäºX?v Š&^yµóçs²~Ú·AU:P»P4®“_Y_Ä$Ç=ƒ³{çÆšVã¶!¹"#çŠI:JLçÂèhŽXc;¡+B…þ.h£FgÁ)5h†É¨±ew¨0ndÑɪ,‡©78eŒ%ädg\EÈ¿d*_*CÅ–§t*Të!I9&®Å&BEÈóA›ŠP ßé4næ`JúŒ…(Bg ³ÕÑoG•$²%_ÇB;ckBeŠîœ5aà±ÕhœùežÅ ñã­Ý†P|u— ²æÍOºÆáOÔ jdteOÔR-%ǧ+«¡(áxg°º£P9ÕXé:!+{Êhú‡j‚ºÎíI(VùrÓ q‚.IèOf˜7•}Ÿ\ؤ¨zL"[“Øñ~驳C÷Ú‘šråˆRvz×Ül¶ýjߎ‰–üCô›Õ¾ß㿌²Ï×ýÇcü‡Ó‰ùo/î»C³Þ5·»u³›ØR3¶Þìûñ_c ÃfjøëÃqw¼Û#pŽýpµß a׼麷“È¿Ù÷»õ݃щ)Á¦^nö‡ãC¨¯V‡‡P—Ïwwpò¹܉2šº{½Ã esØÜ^¾E÷ßl®v‡‰GO¥57µöjsì÷«Í¸} .ígìÙ{ [÷Uã ÌÕjÝoVË®nÙ•–à W7«ûÕáó«¬>ô«¾nÕVÓAª´ú¢¿áWëÕz·ï§ „ºÑP•S£ÏQ¯í̶'ЮªVO£{¾[o®7WEÓý B›’…¶`a øž…vÊœbÙ»F=…Dë2Óô#ë½½Š¿Õ’¶ëÍÕIú#.SZ´§|ÙuÛ£UfÄêóÍvÝD±§^®ë^Êf2î¼—šy)êöË~2'ýôòn›*m©Mµï¯{¸$µ½:é-)ënÊæ2'ÍõõÇ÷àÿ!»‰µ]¯N²Puóe—‘8oþjÇ•Þì¶àÏÔ…®»({ŽäyÍæ²0UTŽa:áü·ïÍj¿9FÞgx/©î¡ì*:ÙWþ´‡ý¿î6¼sš;Ê?ucënÔyx†¦=窘¹ÃÒÔHÑÞO )ÏåfLæÓ<äTv8Ù3õ8·7Ê0c3ãT67¹såè«ÆªîÅž¯Fü)[]Qn®‡›?Kärä¦)§.ùóq Ç4À†½¥oP¨ùÁ,/Gô+½ŽëNwµíÏz=Þädj}´yPÙûVÖ >2æe?c5ÅlËÞ·ªî¢jûºn»ìz«ë¶üqûlz$u'eZóÈ„Il'UU²î ä’¥'m!JÕÍ—¤±öÉ[ˆÒue»[÷ä-D™º‹r;·þÌÈâr.üÔ<ÕÍ—Û¸ Ÿ´([w󸤍Ä.Ëý#÷TšWùźºäÑQ$œxò6¦F‰+›ÛÛØ÷ýͪ«0c1íÊþvúi±ª›/;Û™§Óö²î¢ìmGgºáê§™mV]Õ­—­íì§±v]wóÈLºý˜r“ÍÅL¤MÁž¾*9[îNîd¬üeßÖä‡~3Ý N#m"®ìvήYÔbÆbÆ«ì5/žD[-ëæKX¼|ò@תê—}íÕ“;C뺋²·½~ê;6ue{{óIÝ¡©îæ>öÿ.Á›Å endstream endobj 690 0 obj <> stream xÚÅXitTU¶¾•{ R”/Ý­÷¢´´Š" "(cI SÈ@!B&H •¡†Ô<ìšç!sÂC ÌCHÀÁ;€Š¨ÍRôŠŠ-çònlß©õ­~¿Þ¯·*ë¬ çž½Ï·¿ïÛûFD B‰D¢‘ ¯¯\–¸d|Òü¤”É_|>ò»çù¿PüÃQü#Ñüè!‚Bè{˜¾ø_#c¡(꟣"ë‘Õ=2²>M–ÑÑqT´H4äé—'Nxnnaþ–íÛ²‹Æ$nÈ.*“”YP<&)»hÓÆ1 …yÆÌ+Ý–]°!{ÿí£(Qì¤!s†, ^‹ZF%S™TVTNTÞ"j›è6õ-‰G‰©Ñ”„zˆzŒKý•zœG=A=CM ž¥&QS¨êj5ŸZH-¢^¥©%ÔRjµœJ"§­¢z©>ê±(JDEQY"$ºµ6Z]5äå!}1sc> 7Ðz Õ;t×°ÙîãÒðƒ©6Æ®ý|DÚˆ»#׌ü|TNÜkq]±¿D-üZgiç5í¥"ìþ1»ù÷$ý~aSj’+Ê­ê¾E×Ù|Á€)$å„Xþ&][J¶ô•&}Ó2ÙJ@•t%(ÍF*gäNM5[G·Øö;öûÑ`€+É%ü7=qü´Š[ð“}’†ÚÆê†šÝ»÷4|Ò…ÿtÙc‘›Á¬ yOˆe_†„‚µó4Ê )(På™d'ëÇ^‡¿ñì#}€>ú$í®’Ñ<ñÌ‚…IKRV¬J\¥P˜,ÊÝê*–ÿ-Þb‡Ù (pTqn'8‘¸%¬÷—°ykÊ4ŽVƒÆ¬†Á$øÓÝqüØgßÿƒ±Äç ÙýîS{Þ:ï Ûs;„ÇX=Ï8?õjF¡ì«±1?Þfpè€,´Óêð;œ‡;º›Þt²S9‹ƒÄ5ÉKÕËC°å2­3’×ú…½[¸wßVw&¬GâÀFæ¢Ü­Yš 0fíXyFŠ7Y6 •>ÅÌÚR/ïȹ(»äQ,£à8èËygv“ÜQáYoSS‚§wó3HQ¿½¿Æ/I„1LÁ.KSU½­–Å_f f ×ÞÀ¿Á_Êê@gÖšÉ?NõÞrv.]š"eÅ‹ÂЗ„áÓ…á*…ª*P%z³ô¨Â­ ³]Ý’Ë?\ùg7Žr½a[Ø"üÿ¤¸§Oï}þ®¸—ñ–à\ÍDªcTm ¸&ÆPÚ* 8R½I„«ŒÜ¡®awÑ àn¬ ¾ÙpÐ{ÐwÁ—æqiÊ,ÞT°1E³æBâ¾ôN“Íh7Z‰ÖƒQg4lÏ7ô$;(ïÎl)?"=¦9ÇâÑÇð<³ô¶0‰[›Õ饪è_PÔ—à¤.~ê‹ûÓ%[õÅÓË2ç 3„™s…™Fj¤òÝl]^·«ºª5ÜZÕÜow™=rö»´l:«Æ_ÜÜÚì-ŽwKýú@Ý´ÛkwsàW…ô¾i8e N&«º^ßhI™|Ìhrÿl ‰Ï…O„RwϺ-”Å԰ΰte•àëíXÛ‡£ä£~x宸$ïÁ¼äRøîÀQpºðtÆÎ…mS­3 €Z¦Ò•s??È”øŒAS´¸¼ ÚÌm€Ó×à†­çØÑæ¦vhG8F ÏMfÅÇ…S ®ÅÏ0ÁO†Ã³}¥Î(AÂpa¼f+ÌÆ—%X‹bÄ'?ÁÌBŒ-<,›À‘ú~½q£¢‡ÿ{E÷Á=q/?ãþbÉxõÊ9Ó–¾*}žƒg«Ÿ¼0ÿ×pŒô\‡>ÿ•C›ÅvhÒŸÕZ™xF~þvefq†z­ Éé0×»òèÂŽÒ/àSèõ\më<ýþúOá]8Wq*Û­ ȉpÜáOC4£ÃI6¢g™¥Â"‹HA :К#M4ó–.þ\—GýħÿG’ª*Œf%T¢ŸSêÑ…X|‘Æ/¹ñô €}p¯£ñï%¶Í¨™M0¼H|Ìè«þ_$ü9 Žüì¨ eØÓ &W>ý|ÒÒìÓ‚ëè¸xÑò!6vãÒK",",Ïë“`Ä<®0WÍÔ(¬J¶.¥O ÓI@]tDzä.8š®ƒZS ]e%Rhdêe gû‹hy¥q×#:ÓƒU¸T5,4 ¹½‹èÖ„›U·¯ž?ÕÚçë‚^¸Xr:Í­õÊ=à¶>† ‚êõY®l÷[6Ag±°æ5áãvŽùxÑ•Ä;·]ůìØÏa0XU¬PDk F —Íh-:KR]šn¹Ìÿ(­“Æ|ˆkåõJøKOvOüeÄVÅ-JPZ€ ´¬Ü¼ûy$# š,?›ö‡¡ŽsEö»À…Æ`«¡U •eÐÏÂDý³—¾¿…ª/¹?} ÎЯøÛÿ)þgóßK,´UꕺË:„1¶[xÄWäÛê/ò€²öƒ3ä©¿ŠŸïÅ/¾§xê} öKWüòz¤°+kØ´ßëq÷G3Õrù t>¥òÂÂôW„éÄ' •z¥I™ˆgNÇ3fâiemñå­{! %´ø(©Ÿ…˜j™VM”ˀʡö™Ð;´×êpƒ7’ø騺’ßSG_ñO}%ÎÃR¯Ú\›W“{S˜pS˜xKxº)ÓeÜ èmZ\å < $ªqyª¸û#qxtnµ%Ò*“^CÈÞ© ©«Õᩘ}³d-ÛSÞ\ºGÞ Ýñ ´8•¾E¨Ø ”qä[-¹p¿ðGŠâ}¿'õMìTb”-x߀²ð/w£q>> Áké[€cC‡ð0g­­êáûŽÖe¹²,ë a¹¯]׎ÿuZtì;¼‰ÆZ ±ÇLµ›p%ó× WݧZ¢Ì¥‘>X8¼©ÄñO6L€dHªLÙ¦6T@‰Š¬^Ö^¿Óqx{m' Û¶Y+¸C^aÌV®ÉZ<͹¡6÷^û^ëÞa¾=¬ëä'HE­ƒ:~d™v¹&mýêôŠùð*¬ô/mYwbùG²>¸}Þó»}6l ›ÂÈÎD½>b¸jØ^*ӬߞZ™ !ÛUИµOÓ§á¸åìÞ–]oóóp¬òø‡Ñ¥&ÕvÚ hq:÷Å[¬äLòʺ÷ÞäùHbiÇöpðYì䆛~ˆæ'óc%©2kp'.+Œà`¹'±%õPJoù;ÄÌÏìhkC9ŒÜ^YCèà³Ú½„`÷'0!­§‚]L+L¤Z•¼Ô!¡©?W²Ÿ+Õ_âX Ñ¡Eµ'Ûn°ë-ä¯Y ¤åä*äz™Ië ÝW°¯h±ÕÐÉmXC3ÉíÉãxj»hïhS$øKºÊðqðžª7íTÖá¥þ°æW¦­OI+[ ÙŸÒœqjÁ—×  z‚í;œv«ØÔ[µ‘!Ã&“ÑT¦ŒO+XE”)¡ü#e;u͆½È|\âè ߯#á*´$»ç?“[ƒ™°öûÉ{'ðÆókOÄ]¸ƒ“ïˆïÝÛ)IWågA*FáE†k_ã©v<ÿIø«{*û"Mž7ËeåÖ⬌…L6Ïáò7µ¤¡ßúi7sð–æÀ¶]ûáMû~ –mörºÀÍ9sØÜTk U&3˜õ&2Dšhb n­-7cÛSàÑr4 ¼áΩ/ 3¬•^Oö*JõÛ`;x j¶!ÛX ØÌ6°¡ãgXGŸƒO îd¤c {Ýö\õêlsá¡@Ù5ï£vü“d#¾sÚÙq«gGÎìTSâSl:˪ʫ ÆÆAÞÔ—ðãÚ#¼ùâ\Dh½’’˜#´µ#ÜKŒÖRI´«2kµäàçñ (¬Š ‰4ÏßVÇáÞ \ïÙpíA òÑ7l‰)œ`ÊAÙÄž¡Ã^;ÙUÇÀa㉼}›ß\cO‡D˜•S”L‹âÏ}CÂvÄŽ¾Ë¯”( ãAÿcL©ß`Ûéz«/Èñ3µ$*›ò›±ù7÷YÀl÷“ötŽL~~›Õ.ý/ãø5ÈýTé@û©¥ÑHÞ’mö燙SU åðVqÝÿ¦^eS°Éݰtª“viÜw RäK|¯À¿HÌ—bj%»š®Pë¥\ÿߘR¯!’SÕäð8Âæ0TA_ýí;A䧯ù“_å@f®63­Ÿ=O®ÙüxdsÙünøÃÞæ +l ºáJZÅ ÍŒMé1úu’ƒ‡h1”îCâ“…ÇWzR°¯oÏX­ÓèÕZúú´ðXór7/ù•Lë]Ò”r· Tº“ñé} ›BÅ\ÿ8‚*Á¿ƒ®µùH ÇbæÕÄÌ/ïÀ¢Ÿ>u­Ha+C^R"Þ s(ëØN:ìôRj5Þþ&Í;–äL!lœ»±0iPzºN|ŸxÀ]Ü3hŸ¯©—ë×®KI%ö¹–‡ÛÖyýšòïÐ×½í‡Þ&>x¾²;ëØªwŸ÷Í Nö„à–T1Ÿ¹¾ÇO²­pX×¼õÐF{‘ª1iSNÞætu¤Cš7wÿ–fãACëàÕ…™%8‘(¢SD.ßH¢'ñH𙀉¼†®¤• 6•¨ÿk¦Ä«±Ý¤9ÚÝdæÂELËÆcÅ‘|ª¿»çˆ÷,œAwó°D˜Ç.%%é™7 Ë$†LíúüÜ‚Ü5•ë!rª·7kÈ~„70η.7#m‘iž8…˜ŽuV:VI=†~©Çd[Žoý*;ºÂÔ©lrv­4é•¿{pSaSÕ³]Ä«N!<‹ÞïùÑ‹\´×âprçq‹ÇìP‘Yt®~κ܅‘8;·%°ßiÇbÒ½‡|cødɺĤP(,²zÎvÒPÐYá ýjãê>¶Î{N7:¬+q[Rd¿z—ÎJz– ¤2ƒ\_f,”¡Úw€Ã»ð_˜zkTÎ .r12^ 1?Òõd€$Ò‘éŠß¦™Áu‚/ Ðô§ISáTWò|Žšß´Ç‹™Zµ]ή Ëuê N3d %C)š6/o>k s!Ób8b&Ý |·’®:ð?…~ ”¿>sŽ-–-⦌· Gà=¸> stream xÚ½UiPTW~G¿wAË:oÄJòš¤L¢å†ÑŒÌ ˆ(-ATP"ê°Ó ‚(K³ôi¦Y„V¨ â4., $€ .AŒ£!i2cœ0qBД™:k浚*+US5fªºÎ{û~ß9ç;ç{,ãèȰ,ë²fI¨ßŠe3Ô~jõÜo¿k?›o{™±½â`{•³Mv¤ôÆ+ŠÐGœâU†a¬/Úcà ö¨u±Çrp¾èÊp,ë(Íò˜=Ï'>6A“äþA|TtRœ»:".Ù]´å£ßÜ0 ë2›™Ï.`–0þìJ&ˆù‰`"·0±\«aî2ÿñ_`DæwŒ3™ÉÌbæ2ó˜Œ7³˜ñeüäwK™åÌ &YɬbÔÌjásyÙaæ%fceEV˶±ƒo:èz¸¥ÜQÇWw;^W\Wü̯ãDÐ ÄlrzÍéãIÿbÓ<ëR¯¦±?]—_½*È'·D±.Ì6Ï4›z¸#øˆå4À‚÷ÍoÙ<ø“¬ÝíGÉRê´Œ:ejÜòr r!›ô•‰LÇLG/ZÍßœþk©É¸_¿_?®t{ ›aÆïÍèßÁZ»1ñ2g{C¤.UPq¤¼¢®îDU#»‡ÞX>o†*ÔMÛ>':>'s—rH¡‰7Ö^ØU«­+8¤ŒG…að! #õGB9iDïŒ'¸ Ïê¨JµýÒÅâÌ^îŒÌ¥ð=}‹ú-¤‘@S¦ôò€17p NÆ…†²²RØGÎË’.•et`”ÿÙÁôÛX g³`«H׆¢D}øªÐî sÞÃ÷P—¿Â÷qŽt Z¶÷EUï­*ªÖé PLNÒYµÛ$ºÜéÒ\úIè‚4C¥>¸RÕÕPº×PåDæÓ¥{×¥ŽyÉ\æ~[$>öêÃ_Ãé¨çý<­µÍÆR<¤ðâéø¸RaSÚëopÕwŽ9?÷Ì&tÒÞ1g{ !)a²ˆÍmØÜÊŽ^Æ›W¸Ñ'¹ŒÍ¸Xxh|ø% “ܼ©7_7êGï‰òÅ|á¶öΘ«·|¨N‰N„H°'¾lª 6`ƃ2X/~{ùX/àL¡ª}èy“FÑÇÓP¼uÐpÐP[>År¼­ È^A&¡JË ¡ïÓë"”Yþœ÷ãf˜ Aáa«w|”QOXÂ6?mÃ>«{)nòX=æ¥äé¢ñ`º8ßþ=ÑcJ:fËcSäF|~å‹\3þÒÊv˜1ê7ˆÅJC¥±ÒÐh:k< äÒñU«T©Ë„Ýd:—L¹à+¯¨ºÁ²ïâi²©w P­¯†j2´fhš³"Óró÷äC6deè3¦Ó™¢¯à¿Bóaôê-|SMEF(£^έ¼˜Û£ì…NÙEî‹aÛ"RV™>lýöâðϪR¾ Ní8§1œv“Ç£èÉx¸UfHtøP®àu’+Lí£.è&uÂSKƒ¡ÄX¥P]`ÒUÛñï¶ÏÈmÇ‘v<–ÆžïDèáðDZ"½#l<¹¥.H6?5k u’µóh¦“îg‘ þ3h?|ú, ²Œmh÷ø> º0oÌÃ#çºÿ´V‚,ÝÈ"ôMâcc5»vîIËßó!š{ëiQä¾ú6£ÒÌ~ÚÊÙ\Gåº"“ƒL ¾£ÂV~4]¨+@]^—ò=e)‹ÎÐ m¦¦£†’Òb0ÊETÉEÐOq¡xàÒéþ[ðõ¯ °3¨|êRm®­˜ßÎ>èáØ|D¯u·Ç]{l®èÐJ‘ðP®«€ è<ÙÔVLÊùÃpX{$Ÿt)%IÅÉà ê ~ÚDH€òtçix3¾Ó}­ã›]te´b`ë']Jz蘆#n#l Ô—e6ÞÆ—NÝCeêJ³ø­éõõ*0öªjw4ì©/”©¬–Ûߨ )óèöÆ¢Âb(’³¨,ª€ãÅp²ÛÝÂ!,gSº¶P›¯RÈçAV™¶(µ2Ål—C‰Ì Y ïC|i|UÒÞüâ<}dgìÌËÈÏ,È„]X–°?tʼn¥z£]j»äß5¬]ìM'ì‰Q)iЬš/äŽh*&m67ÑÈ÷ׯ QÁš¤µ+³IŽL²$¡§C% Ýv©L®Ÿù¶ügy‡¤4v¨‡’»9îÝcó0A\Òßo÷…†•rÇÝ̬Ղaö‡*›ƒØ¿jÜׂ©Âå}£ßIG¡Q[“R£Ùq„6þçó3ÂðæÞ9R0øÇjÖ¤tnmX!°:1~ý³‘}Žé¿¡É}º†&rSóµ»ÁIq랉*/×3{¦Ïtr˜d é„Lêî„: Rœ(•óèTq xH]„Îô‰ºÓLJt(!w>úÛ®÷<$ðM\¾tkznzA:¼¡ƒ9wž%K¥â 3Žt°CÌÿŒCwÛ$±sÕcG  '¶žMì‚|'N¾§‚ï"qÒÌJ²‡WCPjd$ÁBºXÔz¿û{ êO.ªPÞ©r]9Tsß©æ¿tzxI ­Nk'[´àk¹3ËŸˆ$BFÄïÕã¾=¸N€ÁúkC'”ÖÕ€<âà•¬¶¿ˆ‰Ž—×ÿa+{¼ Cº¸SwEíf]®ò§@òÈöŠÂýûuà Ô—ÿ°úõ©Üdô+ƒK¤¥¥æœt ó²LyUÙ¦¼²v·°šˆŠµ@|ôK©ºk›Ï‘`yÀé~’tšÝͦ;6ÙSmQá€ðœ9ßhÏiw}bÐÊ‘ÿ»CÓtìͼÒz¨¶æcI9Ò §6¶QZÍgÏu¨ByåHrÚöIi]1ç×Ë#¡‘!ª_=К•`†|1ía†ô¦ˆmú{÷~˜Õ¦“Êe½~á“2L6ïJÜ©/­1OÃŒ‚äÌUxMt*謟8á¾³y‚4×óÝ´`—9/ý¨< endstream endobj 694 0 obj <> stream xÚ]T}PSW¿/÷!¨â­¨:n¶Š•ú±‹"DðÄme×-ЫqQ «† 9 ʧ¥"Zµ.U0D­²‘"\•EJíZéXG·c=/½8î‹ëvfwÎÌùãžß9÷wîùÝÃ??Â0L`êÂø¸%Ë^KŽONžá;‹”ÇyœJÏÊ¡~t9íÇmú…ãÆB_ÿ’ÏçúüëŠú‚ Ë0~š7"¦ÎÐê6nÞ¶5#+ø9ÎÁ‰Ðõ9 ¹âiáÈ,[67—®¡¯h |x/þ¨áXNÜ„Žö#žòk#4ŠÖ*2à5ËA›‘•*–ÐW¥Âýpö‹=í½ó°’.ÕnŸ¢™[~νd±Ï¬`-¶*dTÆâ¶:=¾ß,G)ªiðÆJÔþ4†kã/aÄaW]1‡Õ¼‡¾]ú®›§vo4Gç EIÈcOySÙZäéuN)’æ²]²×Åtu³²óIŸ³c§>7Ӹμ^™kÄ<œ/cÈuŒÃian8µ£]wàëÑÉuIeË•p"  ‹é"ý„®ÀõaWàÒÁóÇJ¬6+ØáPA•åæøì‰ ÍN'V¸˜ûö¾w¾ô4ÚƒxÎIÏaÞq)ZT}ÌßWPýN¼hPP8èÆJOc<؃´ßãY@/ÒA¼ø+Ø£ÈÚÝìƒçH·—°ó©ß¾Bî®7fÙSž§^¿¼b_—Í5Œ¼S µ†àÖnyU·"Ñï¼)MÚö]t¶H£žÐdLÁÅÊû$b´pú œGg~&ª›²­Fk6(º7¿P{æ'UðMmÿEwãi×§@ÄðÒÉ4, èˆ4:‡N|o×Þ]…»€J‹ãŒÈì­´TVúž#óhÒh—kš™;ñö×ìÏéwbNÊ QK›ê¹.ž®ÆßVÓÆà(:­eІN Ö /ôçî§°tͺ•Û3we@ºï¿«‚RS—ä'.¦õ*~Ùζ¢¿dÙžgÅ:u'sŽåž0‡>è?þÅCG­êà^ÂßgÝ\ªslv$Uhëa@ìûöL‡¦ÎgŸúÈ^`7; Šª÷Õ@ T/¬{¯ToÓëAŒ Ò;t|ÌvÇÞÚv' ¥| !›4ß,æð aÉá”S¦’|û›•Õ½ÁØìð|°}îçƒZ À¬Ú·n¤œÚØœÝ ÈÂw«Q°V(åØeC1,1-\ýǺtã»ð&,¿‘{{o5TA•('ø¶W}ö=NŒ=‹¡N椋•CIÚ°>+Ä9q=Âð<ÿ8ƒ¨šŽ\Jƒ_ј…bÊôRŽ€f8Wyª^ÙÍ6(›ÅªX™¥ÜR&ÒÓ8[r|åì¹¢¿ ñû”ÈwSg×éå¾îà›‰mêÎ~9^Šk“ãõÀ"Ü"i»»_¬Ó=.üÉÉ¿Œ'®°¸UV&쌔'zèH ÁÀ[(  …(i°†jhžd±ƒÏn}9p·Dtð7=*}ò¤°HXs{ÏmßÖ‰[¹R¹>ÑÀÜnc1Hƒ+†·aª½õý UŽk5ˆ„Å0÷ÝÍ+|gî»?ÖËZS®PŹCZÎÃÛíø[y.—ÀÓ1ô_yr…|n#v(?ÄX%ÇU ¡¨´vðt%ö@ôðaŽáþEÃú·h¦×…$-Jy6êß¾“âÇ endstream endobj 696 0 obj <> stream xÚÕz xSÕºöNK÷Þ ¢Áao•ñ0+*ˆ È(ó$cJ' mÚ´i’¶é¤™Wæ4Ò)i:¥-C[(2”YQqBQÃuX©‹{î];-¢çÜsŽ÷úŸç9wÉÓììõ­oxß÷ûVyD¿~Dz|Ãâ×®¿fÁêeOLyöiî½§‚Á‡Ã‚„è‡V¢ËGÔü<'â‚à‰îïDý`îU9„{‡_žý~(Îãõ>vʤ©sSDbiz\Ú£ËRbãÒ’]"Ú–üWoâ'ñ‡ðî'æ ?dñâƒ[ˆW<Â;M¼A¼KÜÿŒ¸Åû3ñ}ØÏx„œ0""™ ‰þÄb q/1ˆL !î#†|b! î' „ÄpâAâ!âa‚!'F#‰QÄhb 1–ø1ŽOL &“ˆÉÄâ âIb*ññ4ñ 1˜N±€XH¼D,"Kˆ¥Ä2b9±‚XI¬"Vkˆ—‰µÄ:b=±ØHl""‰¢‘ØM´G‰3Ä)‚ÛÛÄ9âb|ú„I¾˜Ø6iæäþ“¿rñ‰óO9õöSžõôÁgR§ ›vpPpÔ7p­œgð•ÞðÊ`ºÀèN|­9ÕÕeÅ?ÀFÛµv“ Äñ¹2ILî°…ÞZ¼êSc-ójºV^%b@¡QçÐ0îþ?ôýAÁçdpí7¼ïCæ|¼-0kÌZ ‹S—GFðÐÓ:‡Î΃ÚÖb¯Oñ~°ŸîÌ=±ŠI5dIA-®L0¥ ÔYP™ó‡¾?è¿Â?Zó,ðò` Ÿìg©—ô_acÛǘA²š½¼ÎÂgÃÎ̽ƒnÛ“ L¶¦ÒÉ”Tk oÀ©T£7?šETŒØË(¹OÓȉm¤(4F†GÞ:{ü:ÓšT~ -‘f§¤—ÉjX¨,³øi+u~nýJæðLRü|eº)H軆 ã÷²Ý î¾/!“%øý’R•% õ¤¨ù…-Ë’e¦äDn@,  0Jüž|»óòOL9Øc´hh4™y È+Ô%¶†7,’Ïo¿œyÃáÂ?;üHu· eÊ~Ζ{åC¿9Î?Ï÷¨9ºLy^ŒoBsz e'Ñb8 ±: V»…b¯²x4¸> àdg4Âåpb·¹@Íoµël:†ÞŒ&¸³Z·f?…—ÒM`Êê wÞhh#z §š€ž‡IÄB&/¨iÍ`g¬d‘¥Ò[Tïƒ÷„³œà’•p ë­Z»˜·—T¢VÊàe/¼,çzÃa‰'5j“š5Q*7p2ð÷†Y]À˜É³ÛÉÂcðå,0°fÊ­uÃã¤ÓT fL¤Ú¤Ò°½Q@/pQú1 —y±Ïæ—ã8îZž¶*:Ê`È×-o7Øð·VTï)éèÝê³ëþÄÌ´Ôd¿¼†-ÅN·›WçB£`5,?Nõ®à“}Í…„>ð EŸ“¤tz©¸±¡¢ºšá{«µ‰ ÿvÉòìwúÉe?+ðf_ÀnU´Éš¬)Hÿ2àWÙÙùµDhÔt@G)­Mog,d¡ÅÕì,ƒ-=ayWEWÙA{¡­ÐZD;ôv-ƒ] L¦¾§Ë|=B¯Y>tÏ»Ðý.ÿ*Ìí™$@+³´(<& ~§ç7ÅNÀñàœb,(7—ƒrpK ×_ ù »×W¯4ÿ*¶À¤4"o˜p¦àëuðºýuk›mŸ·É×Ôâß  >ǛޱÙ6 Ì¥WR ÕœRh4, =†"=‰¹áXÕ×}ÖÙjÕ²ž‰ò¡0í"¿õ³à×uìr(§oWRÑñ†íÌ’/Á)~k5N­% Ó¤tÌNG¼Lœ*  Ù™yê¨äuùîxÕ|%x"Àƒ·? ¿ô <¯Ÿì:èO÷O{žÍ¥´“—¿¸rÑÆ—7­Ùð²L"ÔæçëA.Йu¸ ƒd-|!BBjE†M ¥N—gÊë‘9¦|¦‘GŽ=|ìÐùÓ7ÎÙÿƒvQpÐÈK›2k¤¸$¥¥Öë­õgù“™>_õÚ"¯íT=tï·snÁù½ôÿóƒW½¯VÇ@ÇNë|ZC¥éÏ/•ŠUË œV]L!YŠÌÅØóŸ| š¦™çÐùÔœ”‰“˜—ÀÊÆ„nº€¬©õ4±ÀŸUj¥µd\ŽXŒx0bÃ'°ß7ïÃpÜ|êÆ³ÖB{‘­ÐŽÃ÷Z ë$¸HßÛõ쬱ÑO$WHkýþòº¦Ô’$æn4àŒ@P‚r迳>'€ɘÆ(&“ägˆ`Åï¬Â^K*Až cc¢ÈÞÆÞú&0&¸š6³8èBƒSÉH@üØ?âvªÏC5ÁG¼¹󾫃9×ïÁÁ»Éa²º¦¢²ÚŸáKK•eˆ&_™òøÅwðÞoÃþh«&·c2i¸ªW×ëêÁ›à´ÿP·ÝîÀdK[(“]gÅ0’‘Y¯änQ ¦ Æ£³h­:3~S z“ŽF—¨|K¾›)®2—»¾i_y mä>SÃö’í%ñ–h æjŸ{6Z¡Q`Xr$ëÌ« >îƒ 8¾7`ò‡Ë>â!¾+0‘à–ý§Kêëv•îM EY‘BKR•I饘½ª@e©™c¯‹+v-F3Ç£¥h2Ѐbô4¼ìSûu~pko;Fó¨i+è4 {öC÷0+ÀÚØŒe´u5ðÝÌ9Ð8Û¾Ö"ø¢jÑ@D1ZrªKö•îmàn“ûNQÈ‚_lÁ(>ÿÃðzž$¢¨?éÚo<ØŽýLV¿¥ Ðp¹å¥ K¶Í[12 ÄVÑJÊ*­Èöº¾¸ªžõPÄ@qî‡}g_=Õ~Öåv8A ]D=–F€U`¥ÃP7õï­º·KÞköÉò?«àM‰š½sÎ 0…ñ ¿ûòÎÃ{pBtts³¤L\œ^³õdõë'ÀEðÑÌcO9è<ò‰'aÁ¼ÃËÏ%ÑcÑFÿ`ÃÉa—9¶Ëf±ÛìÀœZ»aŸXxhÇX°~úù³°2˜Ý¥ú?Ð|@P@{§¥ûõ«1Ó°:rý+½_ Ï"­È*ÜÔ¸¬:ÿÔ/vÄÊàÈjÞÞ ñFx0¾%0“`ªiìʹ© ñé[ÁíJ¯§«ýÅõ¾l_ + c:­¥æÛyÏ€÷àM—coQ¹pðZzaª=ÌËccV¦Æ©£ÀVúÑ+(ög ÈàXGÉqÚˆó(Íy@©_4z2 GäÁÁï_«„Ô_úÐЕ,Л8±p‡m‚/rtóÉŸ1›=œó·ŒÓÚË8çû]ï÷W·„>¿ËG½$ÙÆ=µ—&ëÿ—4yþ¯irKpÊ?µ«—øáH/|#+þ‘Ó0(À;åYë”×s/éÀTÏò½¸R1…r«ôíÛ$§C°v0£—:“Qôˇ‰îLºœ–î~öÎÝ?‡î6pävkÙCæÜnó"ü_*%ÚÓÌZ(àq—Û=ÅM¥mÎFÉ àÞPêù¢€ŒE‚F)Êg¸H4DR)ZrŠr‹õ•ºÒup þÝÇ®†Ïu…G.£T“¹­X‚V¼„V)¢1Ïá:[³°?¼Ž‘ìz¶èýµ¹Cðוpo»>ú<ûéâÏùíí=³15r|Pèæ:] {»ŒÂ`ªÁØž Kdp˜U€ÁS_Z*M•àcðC í'[±µ”€—ŸëÏpÊír”2s &„–³UÇ໲äèÒª¸’k ¦š} Ôè1覾HÖ‚Z£?¯[ܰ¬¤'ÏY<ŽÉYæ,@Ï"å™¶ZžèíT½ÇácàP’ß~\ItŒÁt6õ¹åO3Jl”’ nØÁÓò†ž ^÷áÁA$ØxtÅ®™8סqèE´½ ' Yp#[DB¡’?ø0G#j&Ø_ÑÉ%£ž˜ý8˜4lî^u>ócð¸UþÅ…KíoÖ¿à0pExQ˜9Ï”Q èb‹³€…Ênr«5ÐæéµÙ’¬ôÜ4Î8óçäžõC!{-øÐçüÎ}¿Û»õ?à ¼&øÜÜuæÃ§«®‚«XE†³Ñ‹e KÀÚf¡›(-ê‡Â‘ 69_D€~’”Ë,Í,pš˜$ƒù(0at¦›mîc 䑇@wJÛö3ËJ&™Ÿá,­NY†ôT¶`!Ã\‡›ýáûzf DMTSƒ~; ´&ÎÀÛ%TL"¶QÙgcð4µº±€Q.×ÎŽŠÚºe¾i%vô}¤$ÓÚÄÂêO¨fܧxÅ©Y„éBí‡e5Ä&Q¶T&Ž1îĆB3ÙPa­âbz œ3µmiޱ­vn¤ý¤¦s™j¸²ÖV“/ƒï`W`(gÜ:?ÿà^κßú±äò#?›+þÁj,$ž®%s‚St‘)¶šß£Ž7Œc³8»²¨¹é)#™…°ˆl,³a{hlÏyÐÙc]íÜtÇž¯<³Á1\~ç¼¼ù† (­9¶ÐN³ÓÁÂYp˜pïM襁t2T/¢J±Îʲ§E»jS>ÈywséÙs#§2ãÁSÝ‘%×\gÀ—¾¯½ÙÑv¼ê€ýÀ[SêQ˜-Ó°£ÐE/Ó6^×4ßN+I´MCSQZG¢p{œ©<üF…œøyÊCnì¾Îoç‚,þ« —ý&È|™’¿ÝøH¯Ã"51Ù±›…°UPщ†mŒ”ü›•œdKH²ïbÃìäÒ°ŒÚÓhoÄÒ§'#F…â¾nˆ@Œ8¤@‹ÝX§c‘wUjO“u/ã#ïÜ(1à|àÅÜÛJÏã5½ûà×·r› ú¾ßÜ ‹co·PqIÚD,Ös8TàïÁ{(~=§&GÔ’y½{Ø™„Õd°…jkp4âf¸Ä„3‰_@ܽKýåÒr¯ . æ†úNºÆï„‹¸>A57écÙÛ,…!J²èe™#Ÿf¶‚¨jénÚE|Þz–ŸQQ”,•'L{?òò·ï^„aLp3µ«Ú|€ `-Þïæ…ÐF e5¿uï/ÛøÇÐÀ5)8¥[9G3\Jç†""ÆM |ŽåõÞâÂÚê꺺*›Ê™ïP¿:ïÀ¼ƒs 3«%¸·—¤èÓî ýñ¼ÖˆïkÉbKÚ“]™ëÍñ.ýtå­¥­+Ö;Îb—ÝÞ±·££cïáƒû÷œtmQÞŠœL¤íHÍÈš0u““'Óðmª½ÁÚÁøˆ"C® ='2×÷ôëË5þùžh¢ “ª ¡‰j²7ö‰)ZÜÏz)WØëØ`;µ§ÙÞ€“§ÀTèZ’ß@Süó¡õ­ŸO6zúÕóàãµÁÊ·Ã;C8[Ø›M]< 4&NKÜΣ–¬Ë¬š ¢Ö:ϱ ÐŒ¡Ñt í²‚ —|÷XákhÜkhü14Á®´IJÇl÷Û ;aáq8ê(…_ |nŸÃg¾}TòÍjOÇ%…"”Û ÞáïÖËoË`wƒ£Á‘æR.€¦Q™u6J¹ý&ßT{2­w4CO8‡ÇµÁ'kÃC̱‡ Ô³ÙÛuÔ‚uÚWn‚DE­+8Ëâ pøTQ2OŠ'’h!„æ@Ísª OfÒm)p°´ÏqµcdJQíGò³·_¢Ð{AUbG–%¢WÉ«{¦W›äC1Ä%}Áï Fô¬ŒWLÍCý·/ϘæÓh6ˆVÁD ‡Áep>ƒûý…h8\†61üNÜxagÓxK8‡!¿¾g4bi\hqãô¾ .,Û=«~kXаh!š£Ï6f4¼'å@¾©xŒ%}ä¯ Õð ®ö:<öÿ`H§ücèÊ!ÒÁ>Dê+ûÄ®P p9uË œâ`ö»?WœaÉX`‘pK›¨êR‡—÷o_‰GX°]›ž¼ý•Uêõw$ZûÅ;Upˆ7ðóº?ƒOy᫟…e:}uzà@ci5¬›uR£KÃä³È—³SVéiE;¼ÿø[¥±ÓÁÎ[Ï`_¯ECÐR€æÐ8vCÐ Ã4ƒzg“‹.Û/È<(:±÷• ;õÑ\ŸéÈ*P ‡NÄÀ‡8ar£äƒ—ÚŽŸî¸`Å g^D+Ñ8 ^ þi9ž-HQ¦æaÒÝ.©kiª¯kbòµE›9_«ú\îµÖÀn/ìÆEÄ^ƒn…ÿ~±BRUwÌÁ~²óC!îဃŠÚÍeb\ÊIt$ú—(÷èK@xµéªSïÌg³5ݨÒ&ÊãâÁD°.‰z;­=¾<²òJå·°þËŒ£gCÒX\¦ܹš:+® µA«fÑZìÎ,ñ3ÔæÜ"¦ÄZv ¬ªOƆØá¬/`vèîyNÒqm?b¹ÐØÒØ|ÌÚ è}¤ÏkHä/:^»ýN@’B“¬qâëqXÔ.%cwØöqd×ì5·0ÍäIpQã›îÚiÝnÝ¥MF¯ÔÂ#ô ¯IÀžºä©8ÿZ¬^Ô@C£[^GBø<ÃÁõoʾµU™«@U¨¨ a*ÌÅ¥•¾fkqbÕyHµ˜EoQ`’l"¶Êò¥z)˜V•Sî2µ‚6~Iaqsá¶Æ>|ts_&©^NáQÖóL€WÎÙå£| ÊX’[”k—;².£U—ÑüZ.´)íÚbP ì[¡Ë'¼ —^„ËÎÃe¥{¼{¯pÜ„I x5žl‡Zháfq:«ÍÕåÊ× 7£Á‘h0~Õdj3ò3—Àé+጗à4uµÐh7âÆŸ¶RöêPÃ=‡¢¤!òùÏŽßö*pI‹£_E£:Иƒh´g«'ªd«-ÇšVh é±Úªíž8¼߇[†‚Æ¢†º¹•s«^¬›Ò090¥@,´hl—‘¶’åÀZe/)î(í(éØ ‡áßv8¬üˆë܇}iêÊÆÜ¦PeèÊU¢2a.JæÆäÄäÅ(ÚTûrwGCþv(Ø ï3Ù°ý6ºþUsÃÙ.ú+\\Ž;Î S±Ú›åÜŒ+AoæZ~eRi•UâoECb_¯Ô+ JÚDj[åûòÚâáÀX80Þ£+Ò–‚Bì§·ûÄÁ)™á7üµ‹C‘ªÔë«ã»gœ˜qdzQ¦Ðb°â•€Á`0ò²„1Ë_Y±mEVš"%-3)=6?ŽCI€’˜“J@.G»×[]RQÓV»»¦­¸ÂS^X‰]é–•K=²÷Ð@¡GˆØ@J¯–a^ÐÛ2wá–YÊµÌæl—¢@íQ•Än|ký•oi]:·ÆI›©ÒÒ¢ªâŠê]Õ­Õ»*êÊêë+­Îοé"ÊojÈÁ½‹Žy*•F•¶-1Z£ÊÉËÑdcw¨*±n*OèLÚ/: ·k9Ùo¦*v¹½ØÃý)¬lç“}ê››>sJïÆ5~k!—&UTð›Js‹T®œ‚ܦµÂCÏyöÐô‚œ5ȤÑ3Є„–×1LZ¨ #úTßÃΆT_B Öá¸Ësa]§QÀ[Xèö@¦ ËêË[üþÚÚÖ¶¾LñÕ)SY‘¡ÊF ¡V©ÁA¦¤Þ­qk ’ 'à+þ5¡Þ©)ÀeˆS½rðqßЛêaQŽ¥æ¦\¬¾¹¡ÿ•k8¶Ê*Y»·µ8pœÆ]éC$ºmFÃÐÄG[5Jµ w;y6] ÷;€Ýltp#Y +°Ü3-Ò¼°!2*z‘q5ÆöÉdCwëáæ#ŸÃ1ŸÃ±_ÂÑ·Ë8ºHoÏaøÞ¾éJßøÈâýyµ—÷ýÙðï{òɆã¼Ïü¼ú†—úÍÇ?ž ÷âe7þ²ú÷svßÇÁ¡s²+Þð¯þèkï Oí•í‚ •pºwhû[0úÜ?ÿäiAMc«w /µ-[À&PˆDÏášý±è[L´uï*ÞÅ™5º.f?hÍͶvú²d#ÅÏë·%$iöT3X¢á2ƒ ú_ýùÔ£Ó—>½s¦¸,£Æ_Q^]•Y™Æ{\0= Cñù›_^¤§õäæm­]¬r|õãî[Ö>rTû‚ã½Ð)çÎ,+¯…×sEZB5 ›ÙÛßPU–¶SÕ›»SƒápÐW?°ß4Ø Ùu`[êöX^¢`Åm“À™¿%1.M›¶í>I‹ºHS<4׉›0uÐ'.t½yµhÐth@¾IÃykÿOcÔþàx?¯ùZ8üKp° M¦HM¯úýµ¬‹R½ý¤ ΆÁO`²ïúßDžo´Ö\°:¬.\g6Êh×[t@´ÑyÙ’øhi ‹ƒÔG,x¿Òß:±j]ÊšÄ;[öÇû¸-7_ƒ•gÃá nÏ…Ôžjã í¤Ú¢ýëðšÇŒF÷¡ð(ÞÇ{«v·Ó‹(8ÒÈ¡EÖlðg ݸ  \q_¹p ²ÈgÇUrèBìR×%îÈh4ƒ9ºü|eZìÖ”-à°õ¢êMc ( IZ¼Ú“+ál/¯þ=¨ÆÖð`Žî#Ýv»ûëu_£AèÞ©ˆ‡(Ä{ ‚²oƒ3{êÞ1Û,\f:¸ÌÄß©U¦mÛ’¼ ¬›vKeí1u‚vÚ\)x§ýÖõkÆÌåN[&ÿðŸ½Ôµr Ã+…ýr>½Cl3RTBý:”$‘½……@ —üçhM%ÅõÕf &#œƒú"C¶:G$´Ô“Q[SRéëŒôÅ=±tÁ¸¾ƒ´­ ®9þA4ø åCëéðì!þ÷?Âu Îrå¬ÏâËRkRiþ[ÔQÛ@$=>#yíxËW0‘5#˜$ÿË©µûXP^Pâ(©ËªÏk2âh^çß ÝhÊk”U­F °Òª¸rY=nX­&ÐhµZ£šÖSŠâÛ~øý›Õ-Qe…yy,¤e)rbã_Ù½“¦Sw\Ý3¡·Žš±fsȱ!™‘‹ ˆû[4ë.¶'‚›òÌ|…%΄s0–û oêN€ÃZèÓ6FûëdXA]Ø}ó«“EË×3Hý›døgŸ÷&‹„\²HÚ7n´’\§[³'¾òÒòê`)X#_núVø«d Ùó;Œû‡™Š;k¦†ìZIçÆ¢ÍÜR[³Ö„–âÐAUœèãÕ¿ 1îçW аìçGA?ö>÷Ýú €žÄHð ƒBÎÞãýn9}ß2v<f¨°ª¬¥µä y^óŽñÎÁ#·´6'yƒòó~8Kß ¯ç6ä¥êkô¸}Må6Ʉ쥒¹?þ1Ãy¾è×d˜èîýê'x ›I4ˆ]¶Èb¶Òo`žC:þ…è“5´šŒ\Ðyˆ½KnGß|õÔw-H0‡Á=„Ö¤ëKZΆ‰>Ά–k°ô\xpÐë´œJÈÕ,Ák§dTRšµ ž¤äƼôÔEùnm±Æ=•‡…Ôõ=pÈO̰aÁ=I5«6lËS¸®{Œ5 5‡ûþЦ7ª\ÕüÏUîsí8®Sel¡ÓN¬¤³µù d¥™^#]WVîßW™À.›Wç­7AQÃÂ÷0©.mÚs¼²ýüÏ?n”‰+v‹àÃ*×àíkª$n±5Í.³ c]*ÁAúÄe™Ë y«k­ª"†ÿm¡Ù]ÀÂþ”W#“ÔbU§ÍÜ-K‹Ríi€^>Z>†X T^ÈnÏïL2GÒs–È×33Aü©Ì7 …¯Ð>ŸEB*4ÒÒù–<7ã±7”÷ùëŽû½²\&úý9‰>\Å Ž Þ,LACG12Šÿ‚"‹È#®ŠÙŸÕèkeŸawã²Ê6gƒlz³jöÊÕªóX§øèq¸ŒêM¿"Ypb‹Ce¨œøWCõTLUƒ£=Å‚Yw)h ’ÍÉ%âÚ'T‡A78ÔRqÔü¤>ÒIIÖN–ß ÿB¡‘ÊþU‘‹ji2F²h5'~ÚÓL,ØY¬~Õˆû6ÜkãûNSõ½‰‡WŸàU`‚Ç}Ø’j–î¿g\ë8{ž-ǃôŠKžÖº ‹u|ÇüÍG1ÞQó SÅd•© ÷9 C•™Ÿ)]•¶:}•&K›™Ÿµó³¸Oã>58õ\Ú(‡¯TrßêQô®WέWBuÛΪEMã[&5M°©¬9ÅFÜ¢ù€çÍ¢¦ÊÃåørx[)Öº¥ š_ò½T´Ó³ØËuÄ%fk‰­°îƒÆë|¯{.\àXhˆ˜(&kLµ9ÖLç½zÚ<É\ñ|C¾!s¼‰Lý,OúŒ«i5Wâ¶k5¶¤ çm·jl\e¤ Êt<'.7>'N#SÉtRü]_Y•_•~6í¬ô¬“–”5ÍærÆ Å<¼Ò^_å™UIMÑmMÑV]wB­Ë×èõ Û„G¯nÂí꼕©*ó° Ú_YR^î-­*¯t溕J¼Tî‘(K³AÈ–åçr·o È©õ@áKoÕIëduñ]B½]í29Ãé°Úw ß}ä* m4OD–»3sYÿr|z Wî|·¦`ÛQa¾[áÅÀãu›{ÃÂáæìkÜì¤"8[ öP‡UÑ7¡n_¢ogE‚wøŸÊ©ÄÚexFvf& ’ëõÚ.EWvW6ýïg9š4 ÜÒ.¾J‡W8êm ž.Ï.ÏÀͳ2_¥Ù!&Èvf$Jÿê¤.‘ÿ[6£®~ï6îžBÖ×z¸:[™–ÿ½cÈŒÐ1dç??†ä!%†ˆé¤òA¡>ÚYé`k†WpÖÈA²$3›"OÒ¿šÚbCîn{MùwÜ>GBùï÷ëoÆ(p“ü—IÊá?2IÉûc“”Ãg’b†6Õ†AÅœÒ ¥[R…/¿²PéQXðÍЬ ¤Õ©ÊUMMò¦ —¾@S`üÿn›h"Þ§Ï^[å/.s—»¹unPMW(Ê2=©0*³•Ê””ç< uå[õ»Ã­ÿÞ;|<8^ 3´ãh Ð Ï×=·Njw‰ÃñÁB‹Åj失Uo1~5Nh ‘cí—ØAÑÂ7“›U…Y>-øÛÝó;ìw÷¯üCPþA(ÿ^µðÏ‚ÒÜJ_]mÞ š7àþ.µÃÚØ^Û˜]"LËÈï0ÒFr3Øqp H)ÒL¹*/7¯wü‰¹mñ“àDnº¶ä\8LÐ –R»dÅlž¡MdÅ$–b„hYõ$¬WXpbº”ÒmÔ)÷¡ý¥'ÍV‹ Xi‡Ö¦e²!U——¾%*i ÇDýø ®VܼÖXd+²6Ð¥¬ML7¥çb+d%ò*#Ý쩬~gb`4ÜIÜèK¸O rþjÔ† í_;mC¯Àüÿu¥üÚÀ­ÿj‡Ù_eº^§á¿þH¦÷NŸzzG"ÿ|î4ãÀ笫¬*¹ãŸÚßø'O¡RI$’t‰D* moþ)¡ùA(ŒÿšÂixäÿ‚t½fmý—™™àæÿçÕk4‡Mÿ*³SƒÌÿR~i¦aœü7éÿC3Ý×JÿÃFº·¾Úý¿Œ¿Üœã)–’jE¹)f@xá û;0¼ç›¯ÞÃL}p­DÞÏù_ÃþÆrV endstream endobj 697 0 obj <> stream xÚ]Mk„0†ïùsÜRŠQ[iA„­"xØmivYzŒÉh…š„¨ÿ}“({è!Ã3“w>x£²©5Ì}Z-ÎÐ JZœôbB‹ý Hœ€ļg!Š‘•'nÎ|DˆX}«Ïõcybß1}º^ê8‰Ý&¹¬!Ùó¦bë4ãØ¨NCž€èËMœf»Âá(u‹¾öa%ÚAõp¸–,TØbÌ/ލf ¤(¸x»Ih‰“á-W=’œÒòº.*ùï/Û:ÚNüp딕S&´ª ’§™cš¦¯Ž³Ä×Szôœnüîùyã yÙø-ìÙ'úÞ›»5b±ÖÝ nøÃ…w6¾+¼?Fy; endstream endobj 699 0 obj <> stream xÚuV p×Þµlimˆ2ä+Ó´á1²¡'˜r$æ07¦Bȶ°,Û’|b[²$ëú%Y÷áËà±(206$©sÓ6 9Ú4ôÈPhf2“ißÊO¦}²v;ÓÑêíÛ·ï¿¿ÿ{KSééMÓÙ;Ö¿¸¾dýk6ïØ›/I®ªîìÿ>Þ“ÁI(.Ÿæ Ò¸¥Ô£¿æ/>µ{û ¿¿Zĉsü–fhlìƒ^1Ùär›ûi4Ÿkäq9hHˆ÷£}ºÍi„œŽƒ^ &§-¨Gûñ&ƒ^o³)G0X8¡Ú‡ö‰ Ëœv¯Ù9!Ÿ?('tYÝv'^Šò÷^EÑF‘ÛÓv{ή.ð2A£_ÇÁbÑë™lÎúj”{ˆ8Qw…‡Nq«„Žœ¨ƒ£ÐÞîjgÚ¼ϾipÛœ&ÈikokÃÑ€%`F?y^„ÙŽhÍi ·GX/1º1§¯Â"œ‰óŒdA=ÞŠ•±øÍ=‹Äxãk“Æ#¸ I±ÛHId8„#¨ K‘ÙÐ~$C!6±5ñœkq1ÚŽôÈ@ÜÚŠêãíX Äí­¸.Y}üh åÅ8 JŒà„»9…<ÀÇEøa<àŸ# ѳb4ÀŸzßÏ'ox(‰Ð#ˆO~KÄØ;Q,¼‡.®oj÷¶¢Ü™þ(—sß ƒnŸB)4˜Á`±ØWpDÔb´šÀ)ÒÉ]ÁaQØä0AZ~‹§Å—èGvçI4¦n€Vqâ,¿µa Øÿcî)ô…0âñxÁ‹ç¨71‚¢6¯…Ԛѓ@×ùÌA37€A”èÇÐh°¡3Gï7YAUØËpgðÿcn¼5ÙlcãY¼øg¤ÙvJkÛËÖ7Ñ…ÀÇöA~ßñïÞùʸêr9Á ÞN—Íq°ßwEŽ ­!»«£tb°ù7]|¡¿útåkUÌÄQ~s*£}bÒ*xW4þgÒ+-1:\H–¡¹™8 М«9¥>Vr¹$ ôFÒ(û€é£¦óÇÕWw†¶x”³ËœL‚Ãëô ŒO¾DiCÝn'@/ãƒ ŽµÂVýöCGÔµÕõ †Ä¥ær†é±nîo¹¹<ÎNw}¤ëV£o08sN#xÜ `ˆ‘¾þvôo>jR•5_e~ŽÒP« ÄX+$¥Ï0/)„>¹ñ=ÊæŸo>–¿ð…§—Š·AÙņ¨ú¤v¨ä÷Ìú_ ­Yý8&æíúáoß]ÿê/â·á’4Ú0X{\ù^!“Ï“ÅH*&™î»ô_DWÈ¡‡à6šG\LCnŸôØ#x^†—!rG«Ä¨`Ú{ Ï,¸­C1Ù€•ÑñûIÆÅœ…ÏŠ¯ú".ÆÛI¸BÖNS[b×Ä„ÈØF°deŒ^]˜ Ëãj{½>ÊIbHÓO÷‰ÿTèq70tl;tê,ú¸V„ßâ¯@µæˆÙßždÞŽ‚°yÚsâ1‘»ÍmCº‚]p!䓸 bb(–¼hî`ŒÇY &^±ºªØÄŒ)žçø8†¹©gÄáX‚?íý þ°Ëõ i›¼¿FÑ!¢ê:Q…ЧwUµLÛZw𛡹¿úúØìx%¼.¾†ß§¹Jôƒ0f?fñ˜v‡Åac:|àîê²0(ukŒ­Íá GCO·ÏëÊA‹ À¸ì]&¸uªúfPöàÎ@…÷0l„-ÚÝUùÛÛHYf{ Þ=í?>øˆÀ÷¼«¿b¸`< !ò ºvo>°gY3Ÿ¿ÛPm1ø‰£ßòMÆýûI‘3m¶5V¬k×7µ€‰è²xÙ0Da__ zàüÆxÙ»;ô¡½‰u"ïQ7á‡îIæJ‰/áMp¦øÖ&³ñ(“­9_E¾o جôåý33½3³3gIJb3b=3g’ÿ}è›Ùÿ÷M© endstream endobj 701 0 obj <> stream xÚ­T{PSg¿— \•âc›iœÖ›T­ÖÖµÔîT±¶;B¾‚ŠR•ò0bä¡H$B^79y‘'IÂ#hyY|¢U·ÛmuìèÔÇî8Öq‡êì8»;_âµ»{Ñõ·³ììÜ™3s¿ï›s~¿ßùƒc‰‰Žã/lÈØ¸g÷Æ73ùük¦ÖIh룩xÓŒØËXì<¶0!F²b/%’·7%þ3%a!†ásç1ûëœéxoît\Æ„™9ó±D'ªëŒiiï¬LK[•)ª”‹K‹K¤¼×‹–óÞNO_½‚·*--·¾\(.-Tðøi‰°\ e~ñvˆŠJ…R9ïõu%RiåÚ·Þª­­])(—¬‰‹?X¾‚W[*-áe %Bqp?ïcQ…”—%(òž@_ù$fŠÊ+«¥B1/Ú/W0Xg¬Å×'”&‰1sö¶[Œ-Á6a›±-˶bÛ°ØlN†c‰ÌUö7^I`­N\hÑ“T‘ôUr±8F¥¢ @,üb±Pá$;* V”TU”†«»û;»zHæžþ´­gÞ ­aÚêgÃ&e6Ÿo ŒFЧÎáùãu4ó÷’±Â’ZQ¥( ìôûÌdj|"(7Ë8Œ#>šÍÎÏØ§.¦Ô¦Ô”¥ÑC¶4[/²§,²û!àU™õÜs‚àwz=ß¡êNê ßŸ¡”+ò*™ÌªVÒC–3ñuÒ]h£œ@ØZ!àSA=w'˜Z¨#ëbÿàPA“£ä SëÔÝð8ƒŠÐ­úÖŒÔøƒêbE#x|Á}zÿ:»IhÔ¬BÖ2¥Ú¸±ä$”Žæ ™÷¹ðý–óË܈þåÜ!®f|CÏ'é‡Ir‹Òm‘¦,L&JEi`_DTKÔl†hIÒƒàæ}殮Ñ/réúGv“…p€Óâ´4_F½T˜ôç¾-;–¿™F§pSãÆšH|Y?=ÅŠÆÓÙf›¥ì„Cg×’Z (MÓGpš¼Ÿ^£gA+h}®£3çUô½ÄôðÆ™"ǽÐL´èlMdõT£€&é—C§ñïú5úÝè=ÄBó®þéáÐu ÐüSKWpAiA¡ò‚ô‚Åfk'RÑÏêpŒFì{øK‘Ë,t2žÈÖ·J«*$åÕ­õ¡®žÎ^’^ú˜ÅΡI½Bßu r‡ŠOßF<¯KcÕNCÐRjé{ûöÑÐ`ïæB§£ÝÛçêvu»»ûnrZBž>h#NÝý†€æ©š'ÀÜlu…§Žu÷áséE\P›”êr"5¶žÞŽÝ~‚I1…¤WX±·PE@R^%ª’ùe½]á.’þü.[‘•») êAa3šûü¶nh!:åÞšŠJq™pP|޼(a¨¥ÜE8VÅ ~b²ðóí¯òŸápƒÙêð÷^:yòe#Å| Žê0½ë#á8ŽÎ];û ÇW°Í+ž°ZH¢¤ÆNµQm9¡ôgtM$PLcäô¢Çà QçSÈ(8ûm>×H×ßÝ#“ºoe zÐՔʨdÆlÛØÞ¯Èèêó:[/0M~¦°Î WåUmÈ¢Jdöš=öÙÆ …n-ißí F£ïä™ñÁ ð‚‡rªs´ÇÔ­nS»{ƒÃQÉÀr;ì*ÌÎÞž-n¬×2Í¿¬ÇSÆññ+,äŽÙRÍJÃPZð<¥¹µ#8“šòà rBQw°=â?Ϲ™r¨š(½‰4Rz9Õ¨Ø.!ц:¹°º­^"õÑoŸ8¯½dgêæ¡5l«ß5dõ[]Í—Åùf,íŠ8Ã@ ®Îç‚D'm,ÐVÕmÐU*¶rôuÚrF*i@ã%ÛÁïqx¬ÍΨ½#ô#çiß0‡"‘ã_Ž} Ä@GMv èdÙgê*J 2"ûKÑèƒçÜ+Y# ¨×¸B\9ƒ®#þ¡1” g‰«»2É!»¸€¯¹±¹}äCVýÎLí…ÏÂyP⚺RIž:ŒÄ3[Û]žãíçG€èjWsA®—iÊŒÅ6ƒòýc ÿ‰ŸHsž*ûÕsÊü2£$Y®ªŒ±–ê—¥ öÿFkaWn…P;YØ¿ŠA,­?İØóÿ`s=e1vßdÅô¨ƒý࣫‹éEÌŽ"iÞkW>|ˆ£…ˆ‡H’î§­ì’mí÷¸0@ØÄïŽ=éîbø´x5Šä+„[dï,ÝLZ‰º¸çeäÁ™AÌA$Û=êu™-޳ÝÚrd¸ëHOÔÞÎLD»É×°·IwšžÙÿ‹CG³ÉO ¿ ¦²öÊ' þ7kiAãn þÖGÁvF`Sê°ÿ.â3‹ïÿ ݘbÅŒ±ÅìÂFã~æétù`´môÜ–Ödˤû«Oï ìc¶;žEÏMæzÀb·zBß_˜8ÄçQ1jò5µÕ«ô2eN±  P5¾cna&4$÷UWVH…ùÇ«N’§að‹öþ`î1é³éñ h^xÚܧ>¨Ý³ˆ2Ip„ ‡›C¾³ŽÞà{Àwêèè8Ø¡ :˜]WÓËt¹Ý¨²#‰ÞëJ&g%®>œ2Ó‘2Ëœ2»Ö³Ã¶”tûÅòˆT endstream endobj 703 0 obj <> stream xÚÍXixUº®&±êˆ’¦¯}g´ uÆ îŒ#\FEa ¶4Böô¾V×W½¯éì‚@HXLZvQöt¼^Åí4ÓñážJÐa湿çÞ§ºëG÷IŸ÷|ßû½ï[‘Q‰‰”L&{lÊì´´ñY#2&ed½AŸýÛà‡ž¤(ꛡÒ}û£ÒÝ÷˜tInö'Q 2YâÈW_úͨ «W­)-)(>cu~AqÑðŒÅEë†g¯X:|üjUþð䊒‚¢ü‚üZGQ²!OP¦P³d³©Å‰Ë¨‹+¨Ï©/¨ï©¿‘VQ¿¢~M=K=G½H¢FS¯Pã© ÔD*™šDM¦¦PS©T*5“J£Ò© *“šMÍ¡æRÙÔ)ê4u…ú„zj%£P×efÙ·ü C2®% ‰?>ä _¦O2Å̽‡_x¸mà¿ L4hðÃëAt™<äÈ£¯?–øz!i›¼rȽUÌæ²Å¸½0š„™[¸ò–ü fb³Óé*Þ çLŒQÔÔ±.p‰.@û{ºÂk ±Gé:§/ÄÅb†©søCœ©µz+Y X+ ‘˜£w:÷²-°^_Sîà6ò×.ÑíæN1öPžXHO/%fÕšœ<˜_{MaäQïóŒÚk•6©—~:ö<1»ulmx ¸^a¶ó0£iŒü¦Úg ’µaŸ+Äd"&—¾o©MZJÎøÍ³ßéÞ‹]<î(OúøŽüLìwS%| ”ð“ô‹³²R&—=¿…—š^85ùÒ똮ú.À%ÿùn·St‚µX÷›Y,]Q¢É+Yhα£Rz $‡çv&®¼ŸÁéà…ÎCÑ>{ë* 7ý>ªŠæû-!ƒöºÂ/4ǵN$ߦ«E5˜¥KB—0{÷nñpìØa¦¿Ž~€‡Þ«0ð‚ èÇÁL•ÇZÃâ0ü‹Ð庎E.Â9ÀÔ:L¿pzzçëõoŠ@óý•¹Ö{O;†G1øy<¦"¾‘ƒÑ/¿–5=ïMaHÅ8ùÙóâYì<Œ«O‘ï$`Õ)Ä35AXÏ…™ˆÅ£a{‡b-}Îñá!t4Ù›ùèÇSÃu0ö A4ê5Ð=¯æ~ÊèÆF6 ü|‚¼ÈÇDôk¢ ` €ÖÐF —€ÐÒÙÍ€æÓk…bX+ yt¡@®>€[On.Ã'cá„XžD Êo`>©ÀwèˆË&×@ËÆoa¾ —ùK€Þ¥½‚—Ô8A1õPg¯—ÐN‡u3|ÀèðæÑòK6°ˆ„Ÿj‹I#¯ Aöô¹j¸!÷dSgøšËîŽ-ï/ÍýNüR'4.S„,mtùê8ð ÂŒXŒ©±ùÔlêßÙ–@-/$øOE±¿¿¥ÿ~+âÓ œL7@ë¼Ú’£ãLôi=ÚF@ïÑ^ŸèãDüº€Í;û윳³ÏU5«›«š"qÕ8ÿ«áÜ!¸w~äÙÚE¾E°ˆtÛEWÚ :îÇGHÝ õì:„FßLÄ~<‘ù+LñÁññ¡†ß‘3 p¿¢;;qFvêSŒ?MÀûý§›gÙ²—ä«Jç@¼t6õÊÚoWâ©.ˆBÏ(ÇŽ†±›'´x A “æe Ú·MÓÅ•WÕŸN0øÉø?98P²« ãóqÄÿÇÆÅáìͰyÿ_¾ó¼§àxÅþK@ïîƒÐŸ .ÁÅ;ÊüÊ©“É XîOÁ ¿£;twH_ácC¾ê¯½Ñn7‚ õÎb‚ñdÌ-Àøµ?žbiDp<Õì4Ú(X,dXz_c`Ž5-¯ `ùLÓ cÖm·Dñ½½²ž[¸úvBì¬SÄQ|…1>xÂÅ%'¸÷àªwÏ;¨ŒÑ¸-5ì!©ÈMÖ3ÐûT; öM΄TÈ4flÕŸ¿ ?÷ñé]xUtᮤ¶óK¾Äó¾l¹ ÿ^Z tª¥âCð ëEöKÀrgû_G‚+â¿ ½ÈÀ2{ üeœƒƒ.¿ËßUµÕÜ èSŒêðp:ŒÛJZ; Ý½ üàü€ä_êÝD9pQpØš”|@ôjadsÔ6Áj·²K£êäj²0¼Ì¹^g*MñaÈÄÀ _^óZ§Íc+ª«yµMgׂŠEeˆZAðƒ“ü¶Øçëaq}ìºm:KrJ MKK…˜ Ã݆$(ñ÷Š L4pèó£ï”¾4×’>‚] EžÊúªzþ-þ­ûì"1é×»d_ÜÂU„ü¸W!Häv!|ީӉ6“ÖìUÜ¿dÀ*HÚ¦sèCvtŠ{ÝužÆ@l l©võôW÷ÌL.ÞÊ8,n«G «"no ‡kØ)t–¶íIódÁHYQ˜F ÈžÈ{•@øäŽìÆ­„océ’1ÝJZ9̦œÄŠJ³~:Ûf¾/*e2`ÈÇHã'yé8]çö†¸ãýÂø€ƒõït7»¼o§»ÙýHÂȦ, „Ùýt£#æîŽdš ¢–ó€÷µxR*ÓnwyÒ·q¥ô"6 ÿM!œy¨Ñ êØ Zm#Î+<%LB[ƒÃæð³ Ô õĺÏnøêŽùéÿv¥¦pqS?b+ª›>xñsÒâ:²ø£ _--¾!N!•ô0„º;:IG<ž‡ë¤JvoEò½ªîLw6)æ›E3ômæ¦â†•-9Ž|2[—¥?Ð១Ë/õã–„Ú…Ž2 zQOÐk-–j®÷.+ÁUÄê®gúÑ€>lÅ ?\wÏœÍÆA¢Q л ¡>hn/ÖÌ@—moa’ïZÑ–í\ø2”DaãQYÛm|ùg‘iž¿8+‡¨ÁdH¤vå˜ó±á#8  íßÿNgäú÷ ºgŸzD„ßÄÝŠZæÿ<’í†=æ6Uûrwä Qšgã#ÙXRm]³Å¶Ó¶óþéããÊðŒ(Æûe7nã­ÁcJÅ6&(*Y­­¨“TP£ʸÞëÄI"ÉÃï É£‚éÈ{wÝA¸Ÿ4v}ÐúŽ/ =è›B<,>… K3ˆEmOSØòÌyE……+æéÊßÖÃá\Ƴýâ–)St¼4šè«T/‰…~Ciºà–¼P~†tãs©n»ŽÝës»F¡Ô\ZgàËRæ^£së$%8ÉÐcàÎÙ /Ýî0#ß²‚™µÑã­¯.,J‘ö:¬¹n9ˆñ»bŸwœÃ–óò6œC ¯·M’éK`ćãùž“¥-Æ •P„f¼n]ÆN…ôõó:y§ÙO2¥Ñøp`òˆÓdT,=b8 è*¦êñ ÎMÛ=µ6µ6>”‡Hþþ¡ÓžìAˆê÷:y¯Å >€ˆèòt(É#‡tµÄ©ðJ’aÑI•—·IÙÙ$ylóx¡È×Q<Œä%†¸"k¤5‹†30z§¾Žu“<@r×áøNˆE6®«/Ýhi%,98Øìvø$.“,&¸,M$Žî>W&ƒÌóöu:å:ã:ËZ@ õm;8ü6ÎÔJ¬õ1!»¿’?õݤ‡¾Âù î¾ù@´Q„ØØCŠ•ŒÆiª#² 8ë9ðôçeS'©Sª¤Z.ÞÌüv|ÉDÒŠÜ|ñ#Bb˜ÄLÙ+Jy>` h*­¶XÔ\ü(«ÅÕ‘â–E'a'œ†ÓµûvKÜ}zG„%”¢õ‚ÂÐ`n26ªÛ«;Ôíãð›Js­v5 ¹´•¸ !Ïœ–·§*÷<Ýóôî§¼j§¶ÐYº\_]Ë!åîï÷|ßóÛï BùM¢‰]L—€Õ®YW*WM*˜T2ñ÷-ÅÕŠ””©“RRlV³•ÐΈy$AgHæwù‚Á-;Ú·oÙ^‰D‚uH¤ƒêMXsy´²i]dÍ@Òrd‡9H޳¸m®üÊeË·.ë(Ø®4ùÌ>£‰Œ×ã!¯ÖVeOÏž}==N§—tyM3›Bº¨²²pYþòÕKs»vçí6„Ì~ò”L›-‚™ݦ’ˆº}ùÖ•ä½Bé5{M>ëƒ1øZ4ëNR_–_ù¿ÍÂñɱyŠëüBk²1fïcߦko „üf(Të®uçì°QÝ¢{[»I¿…Çý[ª ÿÿd {W)lv»•·iJ”¥eÅKíÏ˰‚o ~Ø;x 8xÐW÷ bÇþ!å!þ™Œ{ÃþfðF endstream endobj 705 0 obj <> stream xÚ½XgtSW¶¾n÷^šßD$C%„Ð %@À`Z0ÍcƒŒÁ½á.÷"Ë’¬­.¹âÞ›ä†ma0=ÀIy$$f€„ 3™À‘ç0+ïȘdòÖ[ë­÷g–仼¤«»÷þ¾]¾}(ggÊÁÁa¯žû<çíõÜà»háÊeöÏ–Ú~GÙ¦:Ú¦9Ù^sÆbüÙTúÔ?—»L£(‡ñÉ•jo¿*&دo‘‹ Òrrppž¾pá;K<ŽEÇ&%Ç»ï8ã¾áXTû¦”Äà˜ à ÿñ%y¢ëTê1ëé­ÔŽ{|¨ýT åOÿ‰zH=#¦ÆS¨‰”ÅQ¯QÔ>bË—:@}L}BÝ£–9R”#¥¡Üú¥NëœZœS]¦»4ÐáÌd¦„]Î~3Ê{Ô…Ño¾;fì˜c¹±]ãö»¾åÚ>>xÂø Ú‰£&6¸Ír«äz_[öZÉk·xêIã&&Ï™läoæ[¦¦(^_ùúùßuOõ™6ÝõgÇ´ëfmoB²í «è µ¸ýô íD“§?ã,?ÙvóÖ‹náçž4#zÊpæ ríõDÏѺJž!Äôd^~W9òm>ö 9K.žóóôAÃMA3TçÖç%d‹3 œ kˆéèèmm˜Ù{ËÚ·fž›‰YןÖ„Ý®IF³Å_£ÙNè-4‡"= AìÑÖð~î445B7Ûe×W¯øNIþgº¸ZìÆ³¥Ix™ré1iz²¿ØOì?ë1…µîX'ÏÍË6×”g¨ér­¾ÅX&£óh"º„xè‚Æ 3‚‘åª %F‰€;§„¥Ø—&r:†ÆÚ-ô£ñ( Mäî ª¡7yþù’#Qk¼21 sa™ ùx}¿ÿÇâ€EÂéB@\Zƒ×w³œ5E“¢ËÝɇ|¥ Ø9/fó”&0‚ ®Á5í5íGeC+´dÕ$tæ{¨}TѪ(ˆfw1xLØ´Ïsëˆ[*«Í&v@ÙˆuúÆögžˆ9 —Ô}ì‹Jì.B« ác/v·}JƒN¥=[–_˜,È‚¼@SœÐTÛǼ¦¦ž²`¿<¿u•0‡ÉÆ|fÐ,îZh»Ãkiè+éö¢åØF!x[³%‡¥ ÄB£Î.&²]4÷à÷×ÒðÔ]y‹çÃ!ÔU’£•rt¬ŠéÐךI²õ‡4‰Š<<¹><D5öüh¨ÔVAÜò»¸¾9MŸ¢OQëKµÅzBÔåÆÁópEvk[´ 3Á3޶ëìilë€%®!R7⺽xÐB«íØ ÝDã°râ¬mhõ`'ìDs)"4“ᬄ%½s‘ÓÖ¹¶Mt™Ü”"È¡Å%ÎN›‰_›'ͼ 1_&•É@ÂyÜ èSü)ó $ôWË4ªÕž—Ф÷Qzû¹>áu65uZZŽÇÆÌxöÁcáøºfðZKG霄«ñWý»›½Kö‘üþÊ Š%¬0•òÊ‚J%[N ßvœýÌ`Ò¡ˆÕ1¹6ò@’ŸWàŸqHrŽB.¸(ÚÄçþ‘¯Î'_²´d2¥”%þeé$ÇUPXSZÔÚÐSØ P'­Šo ‘o8ªLŽHŠ<š ¾à]ÛÿŠôôOó ò ¶3?ù ×7ÑdîÚ‚ò”4܆oO^i:°È*’ØqD¬{YÓin¬?ñͳ§à]x7Â{›ÏIKaÌ5aúî†Þà‹éI ß¡QhÔ 4 ]ývúƒw¬Ø›UáE¼væzÝß~k\´V°Ÿáž@¨"$-.5.23Â!²"¥)©UÝ#ïñ³0ÙÖ†Æâ±ˆk {#WîÎ÷C+yXãb¥õ=ªó=Шi„FRùÐx vÃxàì±’ SuMA/…P¨*ÔÜåk>­¼Ûs±ãÌÉ“=§Ì=üÂb“*À 4€Þü”~ÄoëFؤިC4ü¶@¾Úÿ9ª¼µï+îÚŒîó”ŒgÜŽ°‚ÅŽßï@îh s MÀ·^×Ö›Y5ÃݹxüôGp…E.xLûÒw0}O€×‰M—“Xî?ÞÊ+bàöSmZµV£VEëA/Ó)zøµYuYµYÉý‰:vÁ’Ô­‚°±9û/lÍÇÝQj€¼Øëß-Wo%,Àá¸ÀàE\!òÒ(ÔoŸãGV¬”ø%äkFx˜í™È•>™{b{]å©b]Iñ2U°EôM¸QæÌÕ…'ðu¢=?=|bOùn‚ÜOx4½Ïf0:<êÛ•ˆçàT[Õ «D3I‹”}ýî{ÀnŒ¿tWØÍ@©² ŽƒEÓYÙTÙÐ^Úì·«– ]vùzª¬èm«M$vè9É!¹•‰Þ¥BÐ+t…%æê£…Eºªà~Ëe¾Í¡í¾°w]P(+”&\â¿6oG;W Òr™)D ÈKÜ㷮Şð6I‚25Tž¨H„D’8iè¤kbq— q`Þs)q`À‚ª¬n$ƒÝÐUô;L¡éÜOÝC<ÑóÜE¶÷˜§€¦u#W]™¶œ„òÃÚó«*24éÚt†ínÝã&ø núžÙÞ°¿Ê[íM:óªñxhífê¡^Y›M ;“P³ |À/Å? .\¢ &w½‹¾ä¡*´–álßõí[/„CbÑÑøà„Ã`N+Ù 9Ö!ê¤Ã54˦9édû`h'/I‘ IòYoùíY¼;Å6Á²æ¥—·ß]Æ…!G@î€Þþ„‘Sœ¯ÏHèPgdåa»x`'xÖÖù\Ø}%÷1Ü{…®^=wþ‹ê›€œà/˪ghRùšl¬H”tEB”Í*в òLÒ°LùÚý–ÕÛí­ ò”vW##UÖøä¡I'•b;’“mÓŠåv¹ö—8¢o.ªê”uðWø[ÍíÏ?ú}ÓcxÀ"Ow´ ¸òDHR&û&k·=Bï2†¾­K*¨÷Â~XZ0c…בŸ´Ã#õ‡“O wÝVTbu §¢UV§î¡µvÖþä.reúQ=™Ù;¤›ýúÚ$ßN ŸŽº/ÐW¥ØQhEm"b!!;V¨Ö• )ôgpzG¯0å 5j“QˆB¿°âñL´Â¢7æÑ+ßOÝ%xV×xŸ÷ºšóîÁ×Å®üþܹ/ªok¢‘Kþ­¥ 3ÔʬJ`‹i#é–êBÉ“˜%ˆŸÍ2ÈU§–gšü÷•ì%€yáÐYØ(„ùæù7¶}¹9Ä" .ãbóy»”l½ % éaàMâfûÐû¼@äüâv¡yL ds/v&T:[ñ<:BAâs´x޲ÿ¤W#~‰ägÝö_½,µOˆÎ±“–3# »â¥ÀÎ ¿BsVü>Ã}–h€óêåb;CüPB·µ‰ãN£çÃÑ_F_S#‹±ÉÑö¥¾äAnxô{xvýfš+<•Öv–ËðE[Î0öˆ$À&Šu­BÛ? XûÂÄ;ÍÜ-{†Æ ú 7¥1B+×ÊTù,&ÍIªÌ—ç“ætìÈcÈVšÔÛ¦ì‘wÛ}½aƒ¬yµ¢÷,mij¼ÇNh!Šå¡kt¹ÞX†è]OðBáØ•) õ9»¶Mö@œà:ܭF7 Ãd!Pgkr œªœŒø˜Ã~ÉûÉzæ_×›ØYpzÙVg8¡¨7×´XŽwÀwP>Oça§åÐŒG#gDÈÍ"YŒ˜§³Ÿýåzóo§D ö“ ûDô.CÏ)¢q4g&= ÊØAÓ½Çè•:ÈJÏ͆d–ë iJh·Ô5·]ÚÝä+Ø‹ÃßχxˆYðA3Zðøs3› b·¶ÛË´÷¹'çÐèb^ 4 D,vFÛ2oÿ-®´ûˆ±£àÙÊl`ƒBjû„P¬+Òu¥vçõ¥\̈BGº%¾¾¦°ÚX§‘K ò M¬L­­­ª¨k‹lŒD@PFrº¼@N–ò|ó4,÷ã¹È² ]°Ë1‰G !´4º.N£0Ê@Æ*e~¾L!c¹¿ŸËL–Æ‘PBʚ؂<MU Múb5aƒ¤¿#=_÷²Rf=vL÷l‡¹¥97íN£!^Ó§ùÃýk a+÷fú¬ì8‹ììH®Ó±d8Wû‘Çôg(”ô”~{¶Ö3\_mµ"Føâ*à VÒD'ÿØY™Ðë‰VÑP¢,öÞ…û­eGwpµ'ó?nRÑ`)èHmØcô…í°6(ÑK‰žð1K¿<¦¶oE³ÝÑ:ìŽfc—g\ç m'OTÍpõÄ|´ß$µgDg5y,Û»Ã6—Ưç»|ˆ4<®ù¨Þ¢Ú Ùpû…'ÆgCOlIhƒy×Hrã=öf—ÅæÖíÖ¶ØÔMä:ì8Ôü®¯QD _ÿ·üÞC·;‘Þ§ [Y›'Þ@Kë»ÿÀ³„{Á;# ”=3<™0ðdcfÎjˆï–“®DDJgtm·:Oû¬Ý$ûim¾=o>¢†­kÈ´¿´rÞ÷óžqÍ#ÄÔÿBL3q(Ìž”†WmpýÀ„f"V%Mƒ4–kkIliklh?··é `ìöËܪD ;ȈZp¸Ð2“Ìài­*2†>C9Ÿqw?¡á½¼•10ð6ôáÀØížÙ‡»Á§.î6QÕUb`sé …$Kˆ'0«’½XmÇIÃÕçë ZS:ä`¿~Bd«þëƒÓå»K±³ ®°Wï꺧à|JÑ>uº<•(]®1 Ÿ’ýË”-à¬)ž’¹Q˜¡k“5Éö³l)™[R»Þu8½«˜ÌmGK˜í»ýˆœDVäjån£5Cx«âq˜„1Ü_âJ¢Õ1qMG.f ûѵž„P¦,#㬢Yª Èdäxí÷Íìe”È¿¢°Ð^æyâ|ι¼, §áʨeª RaHf±œÁ̗Ɉ¼ï+ië$âµP[¤ZÍGg’è„DM³Ð6 Og‚ò\H›j¨!}ïe6F¬_$PÐAª;B(!«‘I—È]ÄžßÊ“ms¬õ6/^à9ƺµÔìÁïŸß7Ï:¿0E-nƒfÐV+ûþÒû°ïaã%~aC‘éC»|\-bÊ ¹@-a äË¥ yø†Èõ¡ä™D!Á<ÔÊ?gI'Û%¢ýD奥:»¥ËŒ)²"¼8¢saÏ"óCª.³Á¾%7hô=EuÍ7ÍŸ×ßbÕtq`õÑãGÛWñõé†4Cº1ÙU]Px¥¤½ùF˦uWøÅMªÂ«ÄfƒÂå­@º,Jm®Ý¡Ì´HIò±-‰žQÛ0ƒ,ü‹V.:EW–x¡ ”i‡Ä¢TQF(_.‘K $˜Be䮇íШN¢gvhvóD×´ïÄžž’›¿Sá"B>V&V+ÑkŒ,46G}9×%H„R­i9È”r’Jù™!àÃýç]’ër `½Q¯ÕZºùÕU•Õ啯¢M•Æ~>OÐô1rS~¦xóºÜ<‰aÑs—+ý[m^¿róÝ÷ŸØ·ÿ_—Ú\y .Ü'ÕÕõ¥-¤„nŸ‡Óaçí;±E]WYÛÐÞÉç>‰¯uán'¦¦¦…’;>ñ?Ë>Ø á¢Èà‰Œý;lÁèí n·N4-GÎd›H›´“±\–Š-… £è\p®’ c¾×¢Àtxgƒ*ŠX‰BoV1—õ—Ï”•J *–HBûš:Mš•èG8ýôÛû&¢£^QÈD…§C*)ùÈژήºæv¢Âõ{ ßnðb,ï[}7´&§!·NÉþÛyIÈÈ0ážüǧ‰—mõ0Ü÷^Áýäûžî'¯à¾÷[¸sŠm»L(@ÝTBc?#íT´nì(ÃØÑª±cžŽ#X1ZæVäóókÿ 1ÓË¡ endstream endobj 707 0 obj <> stream xÚÍy ”TÕ¹n5 §·CŒR–ž=Gм˜Ñ\õFB¢ D@&¡¡šnz蹫»æùÔ©¿†S§æªîšzî¦GD@™'5Ї'IˆÞÁë)îñÞ¼}4š•÷Öz®¬uC­®Õã>ÿþ÷÷Ã&K6y²,++ëöu«V¬]¾zæê…Ï/þù#³—¾÷ËÌe™{&eîͦ.?;ùÏ·NÊÜ=ù!ñ{¦´þ篧Ü+“ɾ¼Czïù¾ôÎÜ.½ÿ¿ÍøõTYvVÖäi?ydÖ£ókªk›‹ëï[VST\¿í¾ÅUå[ÿê»2YÖ÷ï‘=$[$[–µB¶Z¶FV h™tyÒ'²ßgýIöï²ÿÄ+WËn“=(›%{XösÙc²–=-›/[ ûl!þ«gd‹eÏÊ–È–Ê–Éž“-—­­”­Âë¹íÏ“f¡Z1?™y·Oð&³„ÒÌŽVk‹½µN¼¯^œ^!RÆbã‚|Pƒ–7\4Èu¢Nm µZ]ÛP°£i”z †.%w]¿}·[˜Nr]ÞNOòK“­ÑÖ¸^Ü@2*« Z‘='o è0µÇ•z1<êM’î…â-n+Õ PÃh%ª¥¥€T¦öv:¼Þôyatrð(`vZ(‘%|»}/wGŽ¥_ý†aœé®o´µª¡µ´£½ñž®Ó?ñn ÖÃsQù¦"õrã*ÓÒnð¨Z-' fFgØý4œ“t›°âPÖg‚Ma°2•À 6Çâµû(¡”ˆs=QÚ•ã7I-&ì€_„{öçU~eŸ éËü¸/KøÉ{Ù™‹§NÂÓ* ƒ\Q'?,ÜOr)ÏP$àç#t"?æ¹(íðÚj€èíbi÷‹Q›J¬å55¥Åk”k‰“| L¡A˜qJX.üðÃñîÉý€„IƒΦAãÐ:4k+²xl>ª œgà PöU“9Æc£´¿¼i[ÝÑ%½ÏáÕâ2‘‹Eù;â½Â/ècp"±gÔï ø¼A¼ËìÖYàì37_»¯oª<)ü˵Ûðâú61/)®w¶²í>‡„lá9! L–Ñ„/Žœ„u›¹Æ²­@œMÖŠ²zQ¶M”™Kj\µ,j&Œf›†+gçaˆ:ÃN4L!à ¼ƒ´Ÿ;Bøg(è÷„iðÚ½'ª!TõÎ(íÎÞÅ»¼ÂÝ™$eR¿ÜÝ ‹Hø ÅiD%h7iêç> Î{@|ŠI@’M¨…_¶ s4Â/Ù°+ÒŠw?ƒÐYmjÚežxbŒHv;Ô4˜YüzðKŠ4 …†‚*Õf+ÒYµÑÇòt‡+íì$ßÒ½Ž ò¤<7 _€‹JH¦­D­§Ö 𥸸0%“Gz¢\Ì• sùþåîSsªùÚ¯•IåT¹]8sí^…Ãd7²¦¾|„T/c^Ü‚¿tÈLmf#mÏ‘?ã´yp·Ü‚3äD#n•.0i6R)ÏÜ(…z¢´ÜÎ[=ÊFT5„ûh_Ž+æybBVf é‰q1w ’Ë춸ÌÑr¿8m·HíˆäÏD¶öý(Â"žˆƒ#î‰wd€l;Í¿@á ;Ê[9+­½Cï@¥„Ì ®‚k‚&W -!·ÛqÚ™6 o$a-2ç°›†ÑþìË©¤]ÏèX½5ÂDmÑŠ+d¾pç&A¾EPØBŽ žPñnÂ`µé ~{ö‚×éÅ(‹Ú£¬Ô½ä‰þT³p¾S8Ù—uí®÷³…ãÂk á)B˜È÷APÀGs^œãEâ)Bob5ë§ÓD<Éâ“Uk­Íâ÷¾T“6•]ÙjÑZ[@È@èL6½ÙkãéDœ'ú”è>¶PÀë ÐÐ5§ú à¸ü/ •¤Ëïö9ýÈÓ©ðvz;ùÎ… $s¶uyÐ'ÄËmÒ°ªqaÉÖ’¢Õº\Š~èpXÙwí‘î,aà ¡èx¶ðÀKŠÑM;ë0n…iŸ ´p+ ›¯êÒz5n ·´Ü*î„CÈ•óÑ[}òÞÈ3ó(0K}¶W“›Ã6̤N Ïz! àwö Ï‘®„ þÎ61èuyÍMê}ËÒpG¿'f‹„ˆ“›Ì=P¡T¸­Äï£{ø1j3lj«jé² `Ķ»cî6§Çå¯äðb8ƒX ǵb é°;0"+~Õ;NyøˆÆÛ#ûʩ¦×ä#‚ùÚS ËXÀ‚äçŒ^{€ê"âqV…‡Ënb­¿Ï“†-ZÌ~˜ÓÞžw• Ÿóÿï±?†û}Û}¿ö“ñÐðQ? !¿;êc83] ÕöjÀìæ´Rò¼:þµòs6ü‰ Œ¬Ý„»ÔðF,w´X”¶–Åb©~Võ\ášÂÜ¥›š[yêUvwø‡Þ.’¡–þ ø”13»Û%fƛՀģh#a‹¦@›5¨]j ó‘¯E K¼S4%3?Kf}q*[øì˜Â»u{õ8¼ ±ÏCN7VÂh¦L`cX«._÷è&h{œ">k[Ú›~U0’î€'è ¢¤Þ¯¦êÁÔĨZë;¶âS»ýGâñÎg~~‘>ƒCƒCèS8 ŒÁn,ï#í:VmÕ7oXµ®P]u× F‚c¾áÄ…qá®÷íI­¨ q¡ÇJJ& xe–0å°Ps:[hÍÜ­½>>Ð#L"]Ao×u¸ J­exi½Ç¦Ä03~*@D»¡óCbÍ\ñ ©ÏÓäÁ:´tàï\ÆŠ4ùD凳©<¨ª«ªA£¿QØKÌe¦RÕ3MϬܨ7«ÌØìÔ½ Ã(‘ã ŽúG"‡Èðƒoä!Æì¡ Î ˜è:úºæy¸à¬3Ù™™[õl“ j‘*ªõÅû{=ß›'Î'‰‰òG_ž{…zÞÜ9þÇñ’Spå°¼•ǧŒ‰±µ6“[ ž«\ ÈB¬TŸÜ‰…'Í¥Û/t^:»7éôw¦sM°ú›Ç*u ŸlæñŒ\ñ=‘¿y渉-Fm(R-(Æpµ¦c4ìM ínÎT’Nó4rç8x‹ËõÐÀÔÛ•Ž­¨G&¶1"‘t´ÒÐjj°)ÕK5KTK‘fÅw<ù”P“æ$x:§œl£ò«Â§™e qšîAñvïE³Çúœz>;îv»¤Ê8sÐL±„Þ¦©mU•­¯Çöceó¡ûƒ'Ûhp’ļ%<Áaâ’¿wpýÀzJ~•›ƒÁ-z@\¡h{çè‡ïÚ‘ª®š!þÔ±P*å‘ Õ7lf7>ÔêÌ|ÅÂÂ2&LFžõQç FËâWµx“ø@™8ÃXbš›ZhåMÁv.‚^”TûÔUêºÆÂц1êu¹œ8Ñõ»È‡m—çÚNûN£?¼‹óE—…zœ¼èÛ|Ñ7Âß‹‰2j•V¥ûDM@ê‰wwîÌOn¥,„8I«ŸÐ-e vƒÃp~¸ZaI23›â,<àR0-V%ÓÒòtÃôû¡¶As°ÍŠ@bÆH‹9ˆÚ憺çß]ôxïPç§ÿ‘™Cb£Âã‚<9ŽˆÎ§ƒ&Ð*ÙÖæÆÎB(€‚†š†…+¶Ì‚‡ÑâáÙïS;a¸£¯R VÇèíºrq©Y±vÁ À«oѦa,8æŸØ»+ME°î»ˆ]lǨ³3û×Îüøh¶Ðœ¹YáNxã\ü˜À’N—Ó îëÓ^ ¿°šÍŒÝau0È–ã4cŠ­ ÑÞ‹çýºdNÿri*6™Š >béymœê×uHØFÆß:~ém@£þ²m4›ÛDUƒ]¼gž©Ì6ú‚=ÁîèÎè®Ð.¾Ë× =赂‘¥Ôȯ)/B×qs}/åvé’°ƒ÷YSÅSšu¬dwmÈÂ3>,GÎ..ï9ú (oÀz_gl0׫6ª6¶nÔ—+‹ § Rƒh¬içóÔ¡\¡´·´@3jhÛS©%?×®‰´RòK,>Ð_ÐþiR¨Àh½’íç)þpR(fˆ(ëšê _Ð â¹;s¨û”7ê‰zbïçIo‡¯ :aGãØZ³Õ\È}Bù<ËØ%Í7{YžJ‚«Ó×ß5røE@I^ÕDC¡ºÀT¸Zl õ›Ì”[T%ù€ðü‚ÑcàpôÚÙ¯kkÛ;R‰Î„&¨¦X,e¬ýµB¬TŠÝöWk!”f%>Ç¢äÊ—©w!}1v ÜN—ÖµˆŠ3æj`:â´3æŠy¢® Ö²òå¼ùx_åÌ9Û{D˜þ`ko÷›ìÊhDê&ÑÛÞÕµ£¼}%fA®8óÉmž;ì]ÉÜLbýŠ­˜+ ÔRÁê-n<;u¯uãèÔln²)Å»¾ŒáHgÕ‚©Â¦µ¸í|× @“ž°'âŠàmÉþkû5SòÚSʬ+G²…±kK3Mj‡Ò?pš&pÎí}Î[Œõ6å/ıé7 Y“ÃF´9½ù†Ënoroh§UOÈÃËÃc׌q âŒU€Z-)Œãm{ãÂ÷2-¤‹sùûVÖƒ# NQ3g~jÎÌKfeò^ÖÍÎ…Ïâhnoµ JK¶0»*‡7Áô—¶kqIŠÆbk¢-¬n# ¡wÙB¸žHx|¼ó­ñàut~óàJj,-©É½a|C8édæ&§fòŽbg˜þ[q}·èW "¥Á–£Ó]ž˜$~|Ç0¿JIC­¥ÎZ¿NÜLZêtåX5}Lbœ´'}X¨#Ûξòû÷¤Ð·Ý쫃jXPùdÃ"S£ +)’×nªÃs5ò»ÈKØÉrNvâÄTÀTÙZ±‡ÓliX¿´.& an FFB£Q¾›—è܆ç©%_Všÿ-Ÿ‡­ˆ:‡½ž$Ÿ¤vº8Ä»ÐS;ýwla…¿þw¡·¶~põ¶ø#…uy¾Ø(*°v6ÞGr|W‡…éŸíp €%VäÓØ`Z–OçâfIšó3I­3KNË…Üý8tGÊúFa†c]ñd;yöÕñ?‡èdíÇ?Ç~«°¼²É«L;¶õoÁ#Û¸FW¨ßLbITmáþ޼Q‚Ò %®§ï­š­¦¢¿ mJ{^m6ëÀà@FÂdÀa‰ÍÆÍx¤|ëÅíu¢AâzCòñí0hߎ}3'¥£Î… öNt#“óýÂT.½m®ìBBa[Y*šÄ›LÈNlj:>@;ž€+0$L'CÞôÀp2Õß—rÿ-ÿ'®é3ßh‡-d'åãÂå= }¾1ßo*#-ÛL:ŒÅfl#l’°xm^*„#NÇ;p:öM¤ãÆœŽqbòíR:ö`uó{"´[ðùu0èjó¶áT¬È„ItÑ…<6ŽÁX©,Ò`4kG+»Š°¯¡—‹Yó±LÓ;a¤»ÃDèÿ–,½õ“t°,óSE‹Y­ÅĦñÚmˆ#zâ]ŸöÖÒ"ßV°­¹X»«©w3Ìõ,]þ5H*€åΜÛííŽ^ÆÔÐÆ+q¶jfšmÊ߈}_Qƒ&Œ‡ÝEô¹ÜÝ|úˆ "c'÷¼yÚ‡Ç= ¦Í(u9ðBË h?tP¸ë`öœWtºÒíx¢ÚHk…¦²æ7oÔþÓ‡g?£‚9ÖÓËS+BU¾ÚÃ#/ìÇœ;¤æË”Œ ¤÷kã=¡žŽWžï^7gîÊ¢@¼SXrÄl4o~Ñr Û˜v§ôÔÅcQÜ‚Y}B.V›Ü ”V¦…iÍsI[ƒ©Ïû¦¾‚—©7aÿÅÔ!—Ç-°O`œžj-eAõúufTmO'iHò).qLpî'ä ¡ÓÒÁKÔ r‘€Åe¢%|RÚõo'¼ËëäQÂàÓâ˜ÃTZêªÅ[IÖì4j·Vº³XBhŒ–fr\–‰k!ÌbwV=÷U“0{ßt@ªU¼¯Aâ_}CÎëåñÎLUKœ­šÒÖ‰ Ä@°ß×·[XDò¡A,ûQ}PKÕ‚±‘iZ-6’–Z¦BߨT^Y±EÒêãÎÎõœï8åK;  í+í+¢æCÉãÚF~;!p󮀿ŒŒvÙ ¨Ý«ÃÃ\¡®4V7-¯YKÑ¢]Ï`+ùB:=òMmÏf¾œYÙ«ÉѤÄV6ût!%×€?¯·4Xê›U,Þ4ÛˆVèvÑp¦÷Γ|Ò—€4o]G= ųtë’o°#‹Û¤àèä"¡]Ç÷bzu:6Ö®UoÑlTåC.ZÙ»â å'.q{>ë:ÛÚØçIri¼^§ygõÍê~ߥˆsm1HCÔlᕨi­¯+ا¢wÁöÞÔh¸¢·ü¼ϧN¸87Sž'‡õØ\VhGUÛº¥xu.  Í`?x¾N.= ÜIFÇ?8 1["VäÈiµ¶j±J¨‚ÚTo[wú…ÜhµJ«[KTÃuýëð¨å.lZÆÚ˜ëŒb÷R’<ñmí»Ç^Þ¨¯­ëjƒUXzíÍË-XU õj}R»/ïÿLJó’™™©,á‹…î©5â´™P à êèlïn7„ëè*F_ãìÚ=U{©«ðöÅí¿‹ óØÚ¿%&]>·ü(l ©1b,M–¦Eb7i7²z›IYZVŽÝ]~|†£é‰Ã¡þhß„=_M-€ò‡5ö a‘˜")©k4<–>òvDl⌶éª5K«À³hÁîͧ©è‰v¥®SÂÊ ¤ÙwŸÀ$Of& R<,NïxâIñvÆl6â¾Øsœ6ÜÜUOÌŒ$;zz0Ӯ؞¹G±Û?ðnü—g" cç5KW6VÂ`·Õ4ÊšÒ†R@f¢˜«ì.’.t0ã_¦}|V¸çF2ÁéÃ)G,Ã\»í„<¹Åe=»Îƒ;½6¯Ðoľճމ—Ò2@Ô 'º#° +^€oe b)7|qJ~å÷ŽFÈÞTf‹ÙÒÐB–To­.«dívvâ?#̼™§¼Ày8w_;9’íNDý!Ä‘üBÈSQò+ìD?¾µí¼ümsÂI…Q6ét¥Ååeevüó°Ùgõ²¸D·ÛÝ%·÷ u÷÷»\n7Vn'áŸÖcÙý ÉYxUܸ/.§×‹3-8Áñü“ÍC¸/Ö ±Ãˆ1yÅŽ¿îÌÔ¡ÞAÇDo®þãöæYá#ESVÙÐ`±h°œƒÍÍpœõ執îc0®%ØËí~ïõ-¿ »‡qâIÁ¿ª3[”­U MxûŸ—‚ý6Ûò«¹¶”œÕªdæò„ŸýäD¶PcSØÔæFЂòx¶ Õ³my”†0FC¼ôAâÌŸB¯Ó°½2ZÃy{ì±.îxðµñÞ7zÎ[}V~´Ôµz}Yù–†&†³IS_F`ÊÚ¡ÐgyÚaodoxwúüþ?|½÷mŽfFµÏÔnEc‘ÎþkÒyâgˆ‹ÓhX<þô9=úö5Öõq¾q“õÅßñ&KºÆ¢ÿŸ—XÂHfúwšÒO¯Oé™Òon(ïnC‹2wÝÀY‘7pfñY¾1}]©ÎtW*'¿À(¼(NnÇîßâhð™üvïšß“òO¿š¸/þ2q__ÝcŸ÷?{m#ä ÅŠV¶¥Y£/©*ÚV^õíƒ @*õ÷¶õ´õ¶%CýAèqDô!íß’ëPbŽ¿{|Køâ;Áë½ëðºú5¼¾v¬×K–_ú;™Ö&Ç™r}SóuÓÊ…úQlZƒ® 3à?–|%yäÿϺƹ 목4T7.ÅÖu!š··ò ö‹cžñ~$ÌÌüñ;uäÜõŽ\úª#ÊDf™Sh„X!æCusvð©[oâo½Ùyë-ŸÝ¼ÿêñ¼låãïŸïü??—²N endstream endobj 709 0 obj <> stream xÚ]’mLSgÇŸÛ[ú<°õ§r/ÌmÑÌ/JÄ10Á¹"̥ۢ"d-·/v`;ÀÖB¡Ou (.ÚŠ`ié´0†Ù[—f.êÞ£Ë^5nA3Ïe×ĵ“}Ù—_rþþçœÿ9JEQé;*^¬¨¨ZYU¦ªÌ-ÈÍMhk…e@X.2i!C*¾.^Y.Sü½!)з(Aç# HO0'ú= )JúèS¹«Ÿ-5èŒMu¦¬JÞ:“>KeЩõÿ ¤É` ­†„P%X ° lH( ‰jprSó’n¤=(Ù‰ùÌ1ê«ùR¦NPŒÁ‡’+<Ÿj¦HëôŸÂ£…Sx²+âC÷{àÎÝXž¡%saY3¶8÷côŠæð$'D¡ÇÑÝÊš±õífk®Ê¶£¯…‰05s—4ݤÿBŒïÓÏOG1ú}º°ˆksJŠËËJ‹—ð¼NËó6›½[P‹ÀÁ!RžÄËÚõŽK³½ýßV 2Sƒµ=)‹ÎF?ŽÍ\üèr Ï!ˆòX6›ƒWmv¬@vÈû›B!`Äø®†}8…9(hÈ6ã)E„PEwHåÍ’»Êq’&|ÇÇ/û£Ï"»Ë8¼E·þËÞvÕ‘Ž}¨ÙÓÙÍöȼØëòb¤¼t/¸¦˜³Cg9_TpYe[qé?FNö‡‡M~]ý~^L"ꟈ„À¯I2玟×])èEÊØ¥Àð t]“yëD ^ÍÚá!£ï­FCý'‚A“OÏý=É &³‚Ä®müFy{ˆ2d¤P¶Çf}†Õ’3aî|3žøÕ{álá5ØÛá±°VlwÚmü>mSC¾˜R$¦å‰r»­£ ·b»« ·¡‘0£¼Aº:é>½pc[Àp–Ô’•Eä*Ñ{9¤l!K…LƇ<£]œxu×Åtqs­¸(ÿ¶1ÆÍâèÀà,rÉÔïkÆÏ›a?áwÀ½íõ|ƒcôKŠ î§Õ‹n=>µ¶:Dz¾Ék ÷²Ø×ê3¹©W1OCå¹ç_®.cwášãôÄ„"˯¹~ƲÔÐ/dêWšTŒ[³ °ø—’ô| "É¿‘ Âdÿ%.aÅ'D7ƒ8=؃ϻ¿<{úÔÀ¨7¾ÀHÞ oïÜZ·Ë¨«µÔâüÒùßwöaogJ3û…MG‰áPßI™X!+§{6¦&w¥Ê]©)·äÓ)ìs[ЃÅÿÑ¡4 endstream endobj 711 0 obj <> stream xÚÍXpSWÖ~rÑ»4"‚DhIèI)lBB1%Sì€mÀE.ظ7ÙÆ]¶Ú‘%Y’{o²-¹"0˜`:$¡†PaIBˆ“°` WÞËNþ+R6;³³3;ÿÿûÙoÆOOïžûïœï;Ã891gÌ»žïmذ|ö&·¥[^Z¸pýÚBÛ$Æö¬ƒm²£mœ‰"çŸå&üýyçÉ Ã™<–žóhûY1Æ~žIO¢fWÆ‘ÃqznÁ‚y¯,‹ŽŒILŽ›â5eitDДÉ ÁQAÁAÿô!}☹œÃÞuZͬuÞļÏŒŽsJæ|áð ó-óæoÌt f43–qexÌ8†ÏŒgžaÌf"3•™ÆLgf03™YÌ\f3ŸYÀ¼Ä¼Ì,d^c–2˘åÌ ÆYɬbV3k˜÷˜µŒ;³Žñ`Ö3˜MŒ'ãE×ÛÌx3>Ì)æ4s†9Ëœc>a®27˜7ãÀŒa–0_rfrj¼ÚÃF9sw$7‡±‡Ð‹¨E†Ÿ<¼u„ëˆ¿Ž´Œ1ªÎe¶KÝè×Fw=vÌØ¸±»®s½Æëç4.‡ïÂ?o|þxòLð3ÿMðŸøÌDÛ¤Âg—>kš¼IÈsÁ+¿âãjþ+¸÷+Öå'ÎK»Šj“ð$ çžäˆ§ãgùáÒØE¡¦=B=·ÕÐX¨#Æ tùÉaÆÍò,³íY-q݃ñ.<‚w Îà¿!]öjìZÅ X‰ˆ¨”lÁ1¯áòÞŽ/O«Ï«Ï +›‹3ñò’ñö¥h%šd@¼«2©d€f>žÁWÀ~œ†´§ó;ò­UæjKGUX yWm|u¼n§6Rç ô@³Y2:8NʹsŒw"(T¡ŸCT[m%œ‚9Ž_ؾæ‹ÙЧí-C›Èd±m¬•L²}Ê‚V­‡T*3¤ “A’”íç‘·ž>;ÛÀÊ9‚ÇbOìâˆYÛ!¾i÷ºý€n\ú¶(“Í›ûÎ[îïynܰi‹‡Tª”AJ²-`M8Ä9˜›¨~?âñˆü‰ÛßÛ¿ÿHÏÅ#_Ÿ„‡ ȸ£ÓæÖkJ@K|kW}KkWt}ÈS€;m˱oX›k/LÇ£ñ\ì2OàuãçlWùÍͽ¥{îŒðIYpOøÓòôx¹·âP›ŸUFzÔ@ÕÜÝО]»ñ.ÖFäûAZ'?C¸‚Š}LHͶië¡ ,I-¡:$åÆF…'<%ò3ÌàñàÉ"¸÷Êéù…ˆ÷ñùæ=pýŒh_ø&q š½£1ª££ÁÔÞß.| 9fµJ\ñiì<õ!ïž¿ÌÇf2lŠŸ·ÎÆÃ¾·Î¶ypKäiÂ\nW¨(UÞÉ›³¼ Bt; #‚< =ÔHÁÍ…B•‡È'l¶NZ$¬†âÆŠSM›¡-¸@˜5¢Tü•~±¡ Q¡™¡°|["ö£_2É1ŸÀˇr9û`§ù´`nàÅøs¾ª îh^;4¡¡ÂRhhÉ©MŠP&$@âݨk7××vÝ|§u•ðux}ÇæÕÞk$oÀ›ˆLk¡µå'¼Õí;‚xßµY‹úà„Ýî‘Ð6„§y 5™ÁocÏ×þíÛ»š_&°+³Þš'Ct•¤)©Um•w= ±0ÉfÅÎÄh¤¹[xW¿|ƒAdÎ]\Ýn8Ò šF èá-ÜÀ-~>!žkæøB¡Õ±íŒ»Û„-,Ü×a—S_—T•W”VR †ÂB=T@Ê^dd—·o-¬Q¯Õ¥@D¾²þW€¾¥Ø|êw—žÛ~™w¯Â·ø;’CRbwÆGeC0x5zˆÚ}XÚÇàdqoçžöºÃp®l?îÞž]eÈÒÒ.rÂrp7\B÷gí™.ô¯Ìà°Ðˆäm° Üöl8…Ö“µ|ÞmЩ´ …},Ú|­VHÍ-½L§¸°sC o£ù¯%®.‡eÍ™¨ÞæÊç]UièW4èÂ%=§>‰Y$„­1AAÑ ¥\!‡<édš°*A|i|Y|iLYd•¼íÉÖ2»‚ñŠ“f›c›ë>ì2;Ñôäí±¹â‹|u0¼žGœLd'ä%ˆׇW5×B;â%µ$5††%ņ/¼qNx ®´ôûð“òoaáiÁx¡}|?Fœ–“™dø•Yx’èë(=†Tx+[ñÚbˆ‚ÈâÔzI£ªMeQժ꠳§5w±Ã@!qp§eëøöÂnZ¶¯[mÛ$œŽn¾§YÙ¨ P&‚c•®¨´³Æjì@¸’ûyÝyž_´ÎáJ[ÒZ2›—ãµKðZzÎ+V$ ò”dïedÓëÄ}ñÌIŒ”GAd¨³)mb°?³¸#ÒëLWÕ~‰®zØŒMVW<í1<öEÌç=ì\Æ?|ü`ªØ6—ý0Sxø›Ò½ šÐ£éç_òl7k¾ê„¿ÂÙmý¦-užà¥FäµLäãÃØm€zU]&â=ì­Yžàâ½-&L¢ ¦ øeJ+lÂoÒ»Uõô.ÛžÄj_Ø ÞIÛücw$‚ØÞø'¾ÛÙ=8ÜÊ9…'8ŽtâûXnZ Ä‘~çÛ¯¯/úX¯š^:¹æÓ71ÚñˆîðY<{ÏéX¥Qª–’ssrU´=g{f„îõ÷[¿Á‚–-ŸlÿPö9\‚³úO;÷]½Óvð0øó¼jÂäg(Óª¹%š‚"ÎfŠ‚la:$Ǥ§gÑŸìL{|kNîR[%Iƒ“(vÏáQ¶‰¸}¿‡¯°¼äZ¨UÕ—ðuÅùWÏ´~?^¼/ [ëó“ ‘ªî¾!Ølðtö¯pw»eF¹O¾'lAä™Tò.‘Ø{ú…¢"š¦ýV\cåà)x¬cûàû*¥éù;Û«©Èe¹ç®ÜºÕÛç]ÕŠñ¼ÿ8·ÈJ½ $I¨ ›‚¹”i ’AŠP@p žÃ=gs{VT…jubÔÅÁ”ã÷íT¸mˆw¾ýÌÓ½÷ؤ=ŽíŒ›»Té€Â£´µ4Ê>­´ ¯ w‚)œÖô¡¿ádÚK9ؤÏÑæ–*à–”ˆl?°5šVa‡•èÄÜ(U—j5+’DW²¹¶­¡Ý j{i¾q6>«}ßFÙ/°­Ám“=øo帧yø/XDœ€8Àܦ9gÝήü>ú[x:ÎÜ<ôQý-¸‰°7qÅ‹H†„>ŧmßîå¾1bΧçºÚTôÁQ8–`õ?±Æ0Þ„©YDD8î‘)a9a°ÖY‚¡ˆžŒ~é!e-Ô)jí]ô‡©S)kÚñQŠ e;ÞO‹ò7dÿÊ:•ÒÉ“}¨Ç®?˜%ÌÂRÕ©J9—|ÏÇG± ûQî2E‚?U_Øæ’°]å?=Ý4ñÂúÚ~0Û ítë|üŒwàñŽ6ýø2wy3´é4b'í9d`Jc–0 4 ²œ´È ¬ÚCvv¤ìn64WÖW}qv7½ùÜÝyÙ¹Õ§4¿D--põ+ÈgµdÝøüæÙgW]ý]Ô´B«Æb@µ'ùIûú6òóôA–&K“I˜#Qذ+Ü3böË í-½¥û`.¯o[é¥ÝaZæs ÞEáÉühilv ˆˆ*³¥­²I´š‚ ýíbI–upT'çÔ-|ñ G<ñþ¡í×RÏЦ…þv‹Dð¹÷•¥í‘¥aºpÃÚRWѪF¸†®~ØyFˆ9pee%qÌÏRdTÙÍS¡NS*ÂbÖ 4äc!a=%£Š+ÕdI š|жšN6gE°¨ßírDEn•¼R~?Ap6­7¤`ÊaÝ|6½)œE›i[<¡heºla7S)•ŠH›£“„¥Ðb-·§ß.OÅIƒÓ­œZ{ʯ²% ÎÓJqÕ?º¬‚œ2{³¤à+Æ¥¶GC]«Æ ¨ÉJ’ÄÜæ£&‚<ÚÅ»ŽçØæñ›õ¦‚fê´ûc§ŠÂX2‚lŒ%ãbNâÇTn/™*OQó°¹;ü@ï!ó!áéàljn\Rbž©LˆƒØgÉD!ï›÷'ëÕ&I³¹¡Î"‚úŒ²äR„=Érþö=oŸ÷„¼ï¶6Á}Ì«¾¢’3™Ù&4c…„sÿ6Òne±À PmT[#‹=Æl§úЉ®Àq'aƒ®ã1w)µr/ˆ6‚o²_8Â}Ä™µ9=6ðÛeAQañ±¡é¡”®â†Ø.™è°”Õµ^ì:HùÀ‡wD±,ä€T%¥pŽÊÚl“Ú8˜uÄĶ€¿+3;¶õèê¨Va·½²Ùt›ŒS‡ˆ”Ü °>}[Èfÿ˜•öñOx~–:ÔK-æ³}A!QšŸK2ä§åf&ún÷ô¶Øùz!µcE Ð ¯“ÿóþ;1ï9â¯í4°õ5Š eƒ-[+|h}!N‹é~asÉf‹÷ûç¢ÏB?ôWìîD^xY/+…lU Ä$Ydû‰‚AüØËeØ–0­\+SS‹ŸËR;—'Ï‹ ô‰öp,碪ŒªB;‡yÈÚð^bá´Ð 2îØ‡åD>>Å-Ñê‹1óþ2Gäžiþáž1nàF:漌…ÂËpÓl¾¡ÖæS#‰Œ9º,:mÊb¥é±[}a3l©;Ü¥Ú =Èä{uL5¦¶òV@wêf¿#¢‹¯G³©80V<O¦LåǶ ü¥âK™b\d]hc°“• ¯¸ûtß|)¤}WeT¥fæì¢¹âÝÚÙ`ni¨·ö2ù Ý`A|ÌÒìxˆƒØ'F•lmƯ}u­g¶Dv¸½¿¨GÜ7\ã}ŸE}¼?!.3Â!¸<²)zknP Âà?¥^ÿÏ©ÆÌ£×÷‘ÙBOndª2mßQ·W¤eÕ%º¢‚"kj[6Uo=°þ(‚ÝiͱæúÂú¢Fµï|xnl,„¡¦ð¡—1úF:²£ö˜VûË;/ˆ¯9?7(£³Û ÷xíÏmdM òpäªr!=Í(ç­ N2]“¡¡s…ÑXUˆÓ_·3,1.bÍ5Éá'pÝZyE[åPlɬ‡Ây1÷#¬æÿË:¢~´<üÝÛT‰«Åï–å nçÁíÅ(›b4–›_zp>½8Ó˜1¡YljçËu2)rÒíÄÉãX+7T K©$/áPeAq {¯¡à ÆÙJÜÅl±I™#R± Ë•+”Äuª 5=uWJ²ÐÂþfJ7~ÛJ÷PÏ4‚ÑÞ3yçëªdQ¢Çh@e©ÕmpêPvñ¯ åŸ&ñ¬»³â­ö_Þ.;’Õ,ïrc½½çÜ`yw†²Íåý×$ðcÿx­˜…6e[Jslï&ƒ/¬·ÀDw»dÞ|·z ,ƒÛ$nˆwG…YgâÈý  ïöÓH.ýÉí'‘|ü¯#)Z5¹%f¯'¥ãÓenÿºŒ]øÚl¢Ž™v²BŒ±ÑæÃ'#3¦®2V5¬:лãdúq* £°ËY¼PGR‡ôø{§zí»£I%¿Ÿ…Ô'vwÕÕµYèHsÀ×°$_¢–@2ŠgÁG¹128>2$=„® ²sl+ôÈw?©8âeÅ/˜©´PÞ,›úk1-0‹}Ÿ ´æjë”á¢Ç•¿Öœ7·=Ê*éƒËðYCï‡ÍÝ%á ÂÎ+0—ÌnŸdÿ0Ô?¤uDÍÏ[7uøCÜnyÐcHå,ì*÷¨šŒ[E}­<{[ÿ`Ë\ê0ÍX@Ûª¿6o`Þ½{Ø‘wÑòóÁüâP§åòL ñtîm žI$#Cš)ˆw1´1©¥µ¶±ùàf“ŸÐ6oÌñPáaÂÈìsM×éåI¶eM®ã”®àyZù–è}Ù{h‹ÿ¼û¨ˆ•÷Û³¹:¶0Z£ë—B?:üQñ>á èO0,GT’Ëhñët¥"Þ=(P€Ýfr]Ž0Ò³é°-)KÖ¤jìÎ-}>™°"˜G&’±Gzb¬Gᄀ¾SÑógE¡”Š<ÊÉÓEÄ……Š–!ÊÑä ‹¡¤Ä ×SOU`÷"KÛDÊ”‘æ+Þ$qýáapÓÉ»ŒŽá¿%&.S„,ï³ë¤Ž ‘ù‘±Í~G³÷ºÖùñ5‘5˜…tu:¤!qöj/ïìþ^!nÁÓXÞ~+•ÆMì/Rÿ–„ƒ;×»~¦@Ô+óÉcéS#Êcš·\”÷ÁI8eª>¡~U€—ôÆr’ò©¨"ˆ]/uײµŠ(‰eóÖ®[ ((®ˆ L]%§wýܬ*’ls©Ÿ¤ê)î§Ë”y–Äì™ÕóBïlCj~Š @[^P±oÀú]Ï·ÇEíMj+ +yUÌ–A“J—Ô%Pù’KSéX—º‘ðYñq9qvgÉÃÎG‡œåP[¤‚Í©¶¯´ŸÕ€N­ƒBÐæérñxòš@+3Jív#'W.#Žd¼`—$T (IŒ7X¹ºìáÖþùtg?1NµúrCïɳA®ÏÓ“)x™€&ß`¹fÐkµ_ÜTTéKÌšM5TiÈŬEV˜'Ë~eÚóx¬óÞ§qQÁ°] ÜwBá0[ ZIAÆaâüá$¬.GŸIÙ‘¹+Vº+Ñ;rýZ’SqϦ3IyI¹LÈœX*ŒÈKO¢bãÑè^áWÐ{Ý|á$žø!žpO*6 Šê›Ô €ŠìÈqE.Cž“äA‚ì„섬D X›àè­8’üÖžõ_³ãßgý{?þ—¬ßr2Wð›M%ÍE{ËŽÃ>Ôß% †@Ðð̬¤Ty6RRR¥é³Ñvâÿÿi'lá7Æbî7…ºBæÎol ³ðLqˆóž|&úÌoÿ¬ÿ¿ø·ýÿ>ðïúxÍ…_ŸäÌ»Ó_]×XFgëCÒ6'L;¼4(u*Èú§é‹%ÿË Áªÿ€áOŒgÈÏþÑËžÿ^ö^á~~_E_õªCu4¢–¸æH¡ÒÒÓÓçÏ(2¹Jf_#·$]—ƒ~ãPh+ø?0)ðéÿ´ä‡‚*›'áòîþïÅëe[> stream xÚ¥Xw|Teº>“p€@XæDEtå‚X0"]B¯!„Ô ¤O’™L2½œ™wzͤMfÒ{B =Bè¢ `½â".ÅuumûxâÞûMîºWïÝßïþsòË”÷{Ëó>Ïó ‡5Šàp8‘‹V/Zµ$晘•+—ΞzeÁ.ÖòSë j4óÁ8 ÆDs™F ®-õ_a'crèÉŸˆŸÄß&…žOâǃËî!Â9œðñ÷(tî¤äÝ¢„ÕNV–¸Š:È1ª…ÛØU|ùfE­4ê¶Îšäæ¼Ö·(ht48pÚï*èï'8]gPÃ9.SÆŒå•v@[MH(VÎ>ÃrÙyìøçN.ºÆ¡(4ͤ îî%Ù,öï¼-‰—(hò~Ú~²çÂ)_Ÿ9—î¦`[á<ᦤØõ9I@F¢&ø‘síG.Z×ÏkÌ«ÉÌÌËË̬Ékl¬©iàwÙõÕèÕ9hi€‹âM¼ó¹{’Ò s³²ý9­/”ZÝ.‹Ùd2i2K(X˜¶*=]¡À}¤IMoó|ò!+ˆ¬LªfÚüœ« âÎet<¯ÝaéQ¹xi†Ž°>¾B§ÖäNGÇ„^(Õ˜Á¤ÇåòPàÑØäö¡2ñ#šµTÿ´ÖÏ9Î<Àe–nãÙJÁ ¦‘ˆÐд–ýæï+ù:èÁH*\* ,{ù/Ù 1ÏcsÚÀ ^µMa:‚||™¤B¥RP ²i}&ÀšøCøQ¢ÑiA5Ðf(uà€*hFqÍÌ"Œ¯Åh /qIRI<-7ªÄ¤Ö¦s ê›- ­í-Sì¥PåQ™4”Èœç„ZðÚ=Nßè>>²†› |ìà$36Ò…%J(TxÁ,ػϲ·öl-þ¦ü%Ȩ•ºñÍÁÑ|ƒ¬Exô­’dÅCKyh3ºÚÂ^9hÄ) =Íæ‡[\ôüGñ´çûª®À—ä•¥çØûE¸xä“U”ª ÂPip·ÓHÓr²‚5óÎ “«ÝlÙQˆ~½:6þ¹?Lg#)v-{W‚‡ª5)M´ œx‚f[åÔÂG«Ãÿ\µpÇ´9O³ã¨ÈÁíù̓3š9GnpMƒËyƒC…Ñ`4*‹^æ«|qï³\ Ù<6ŸÍa‹ÙyhËA3¨Ïáƒîþý·>­¸Ò­ƒ@ :ƒA­Ê½þÆê7Ö®(ÚäìG¢Y T£¾AcO¿wûð@~{òe–¤ ‘6â.+=`Å¥†'øn×f´¿ƒŽ£x_…¿ï”fR ¹&à3ê1/¨íz»À `±UC|‹OßBš .ehùuziÁK"É @Î ?‡®v“µ7†Ž&Ó_¦@z:Û Þ EãxÀd7WùÑB¾¥^¹@É ït¼³ï8®A'aùCuü»£S€Xî ÕxÅÒØzµ5bŠË‹ÇN­p§ ø|À±Ì™Ú ¥8?»µ Érhä` Œc¾ã¹:,î¬qB•Wz*s!™ñZFÄläìžzS8ŠÁ bêà«Rh%>[¤$>û²¥±éJSÄ'>Û«†|J‚?]h.0ë­à§ÙiÆ+ÁÉGaLQ3ç2 ã2]ÌßxÎV³ëå¨ri-j*÷M:7}~zÄ•ÇvB7Ôjh % 5h jvÌP’ÓOs†`v¿dÐ5¼ÎEËÏ#ÈÅCœ¡wø/1gé ×Å>.ÍŽ*…J£×Xn°Ó ¸“å½Cv¾2±h×| '™Q¢²ÓNª¥ÝÒÚÖaÉÐïQ€†ZcRø!“ÍâA3=|SøµŸ ³Ü„Gå»Çæ`¦ NÀ/³ ]©:ê˜5¼kiØ»oï0kù=*§dá^`ž®ŠÄë;«SÞET|‘;uw…ux…å%[×ðsl¬]†7ø^6‚ÃN `~Ü‘â¿eñ;UÇŠa9{ÞŒ§–³Üš$€[Én²b)Á‚ª1ép.T¯_ËŠñÊhmxùl`2y}‡øûV¿[rHôð°ðM¢à‚°­Ø' [çóí©n•9Û%l„~ò??ùã—WOï`G `—^ZÒ*/^b“Å‚—q4sÞý;8‘yŸçÞ[Ùô‰…´yMU&p˨ô4Z(LÁÕ†àâ'5`ô࣠ÅFz6;Ȳ²cžÈÅë{¯Q-žÞ¯˜(~hÈ—¬sϦ²bè¬Ì×3#¦¨¿<­"A+ÊޝJÚʮ֋5YP Å$ycÑt Iht+âã„/Ü·„y–7m¥,zQ—U=V·Ém‚ Ò+Çndç:!weî/™—R§À®tåc mᳩl¡L±eÃ6é&:J6¢R˜KM­–æÎ=#ZãVš ”Ê´Û P^Vî-ý;™?ý寬ڪ0ÁjqQ’^aT¡ˆ”‡Ø´á¢¥¡ö4Ö*Gˆ” ¦–˜ –¢î¤[KÐ,Ñ©w/þ€Æ·44ÖtÕœ²”š\Ud¨Ï‚ŒtzwJr*Îs&]í0ºŒÍÈ‚…L­ÂXûðNá·™ó<Ÿ¯©©µí][”'£’tê¬jAN&ž¶k8†Xá6Ú† ŠD9z?Ÿ C‡µ¾ÐæFÕ·ÏGjUÖ":k¤U²_ZeU¹rÑDöS¾‰¶àñÈþA'‘­3Ò/I±zDš©P¹ —†Ë^Êb(ÂLˆùØ XlÕíèQ¾­ÊdqºpµŠ3#Àé~ËŒe"y’ÎÌúíx=Ʋ“Ø'Ù'f[úå‡ÃÖSï9ÚÓþ›&ÓìôôzzÌnWWŠæ;p…Ök›Åùt>¹Œõòt0ůÛ)ÍÂ.³äØ ·`eÚß|²¯³È·}ó´f\­Q‡ó\8œ'Jéá8…—¸H=ø oxR"xMcPF˜šÊš5JhTB]Á<öcìfõRH#§÷¯¼‚Ws"z =~cÃ…q°33c7Yø2ϳËsèí¾²: ;ê3–S›ÎŽ‘$§/‰KÅŽT˜^…»QU~gò:¶Àm×»œ½WPæ-.ÍLâI±6””H‹ E !ó*Uõ5݇¶u¾Î>ÄF±±Î>±à{ôØg?zíZ‡6Ä#­zÁ4–ƒ%¹"ûÐ) öú¿j;Ó²7yïØs?ó43õä‚¿üÞ/©>k¡Àkj.;MÚ¼=húw¡ZÔg cŸ‡T$SÂ&ª®3ÙÍhê•NÿMôîM.Ãeç] ÷»ïÄW£pkµï=»7ÊUUQV‰·ª$ñzefQ¥¼ª®1е?.¸S „’ŒiÚZ™ÇÞC¾qW9ª¨óá¯Q’§‹fm„(=vâÊýW”‘A‰Wœ“™Ÿ¼½7o¯àtŸ¬ìj9DL!ñÎÆùyÿx-ÀL p._â2»˜ <ìVlàA–²5úTIgZ]"Æo8Æo4ûø´Ó±—¨“pà€Ûc2ò æÈw‚A¯N{/Eº)ËÕäòÔa~*WTeçï’$îì,ü³M†K•"Åh#O›#ÊÍHvK21F‹vSp°«?Rh_wç}óuؘ`Œêñ½å«ŒÞÿç“SûNqQçàhž¿¤\”“-öÕ›‚M‚W†"xÞF0»ë~›ÓMß®ÎÍ3’Ù©*¥{k¬f[yýíî&|9rVÀ. 4z¥:g;KJw(sdéP@nkK;x»MuÝYA uÅ’éonÂþ@ãRPk÷Oã®=‹»æþœ± g%»‰2Ïr™GqZU%y¢ QF¡O¬¯¯«°q?Ïå‰_Ùºf-h1ÓK\MŒÿpkr3 R»ó .­þÚ¯o2a|›|Øi$´ožºænî.¬…ΪÚÓûOcKå«Ô'`‹I+ôE8 ŒäSò/0Ú÷Î lÿ»ÿ÷¦ Ù©C—õÃÞ%Jä×¹°1.sÙ½6WZi¯m£?•ÂRl†õ´Ò 7ÈAAÆv'Å7ôúò@gm¯çد ªð5Ѧx Å2O¾‘ZƒÖrk¯Þ^Ñø‚§¹²¥%Xs°ÿ¾C`ǦÊlôL!k£Ù@n¥UI '¥q=†÷ž&QëvAÄ©c^&'%&ãÙQy=œýg¹Èó…‰ILãeM*u¨°{†hZaЀ4jMoÚA+Ôú+:*»¼'þ•TűÌÐ⣠Æd³Uaß6B؃O•ã^?É£‹µ"БŸª ß~+¿Éì=`¯ ü‰oض µÂÙh²–5÷ßøÈ>WJ:¹š,uFKò _Ѫ„ ‹þz3Øk-¾ãè ×Ki?Š@ ÷y„©¬I`à 7¨òôØ,ÛÚÓ`ø=áü'øoØõúº_àçªqªŽö . o'ö¼*x6ŧl0–ÒmY5¹Õ»l¹0¶,/éš¶Cˆ“TIš,ûª»{`²*ÞóìÀö¼LŒ÷€VÈ6b,¬ýôÿèÀÊ-ì}Ò*‘1œß*§pqúÚ-¿.§¿…árÞÙÑ#¸“üñÍqÃÉ+%RaI,è#y¿G–þäÅ#Écíh»Ìe„¨Ž÷ý¢·gcËö ;…2íE·°{| ÐÖÏ–ñvÄ7DÁ¡:D´9üá@Y'𶮢 ©pJò²´Õë„q€Ã»¡Mͼp‰ÛÇFòÔBƒ#^ŽiWmÓ;©úF|ßok¹ãÄ•P²Û, =h®£¶4³!ív¯$šŒž@OÞ^sþj3lMMOR¾µ£:å²U¿9  _h@#Ë~NÁsÔ×7T–µ77:*€ì®I‹½+¨ÂE[ÓS€\*»j9S³Å‹sߨ¨F§¿(Åýó­ßž§ÙÚ†¶V:[+/Úë­¥ jNGcÝ>¬=erdèòó gx=ë‚í»š6 –Aüq–º/µeÛ¿—üÝ¥)ý×Ñ´Ëp>Qè©.ó3Ž—e,̇|²ÄUÔTìéÛ±÷–Ÿ25^/])nÔUUÀ:2G4—”ÀË êïÒÕ6A”z r2 ¶¯H¼†^؃&ô  C\+÷f7dÚâ]©ÎDô‘5§¯ já°¦, “ÉÏ$QÍ(ÆÏ9‡ùd'ÖàÛw5XB=Þ¦`þµÿó…Iìsü¡»ºXŽý=u=<†íÔa>]ß•üÖ·!l«AºÒ:ÅŽÇ6ä ,P–¶b^1;B÷æÂ­"Îy°t}wœçÙÙž³ïw _ÉZñâ„»1þÏ_ůų1ò F}⋯¹QÙ×IÁñ†ë.x›~ÑÀé)¿ÖÀÚÏ»:»€t•±æ)2µÅ)Ó VÂrú…Ü·ç¡£¯"ð…BœsîSèÛ\&!yoå”Krórò ³i=ŠêÂÒH%Þd%ìØM¢ö£8^¹ùª£âw¸ñ¯û‚w8W™­‘ij¤,v,q]º-@Ÿ ÿ ZúJÁ·ñ&zç&}ŽŽñìuÁ›Á5P-ËÒæBÞ0:-•ÝGc}BÁjHÛ åž_ïÆ¾â±5,/7t4…oçf³«íÇóµXü«ÚU«)Ø]´$…–®LKˆÇÂ,‚‚ÒZ[ ãª>ßYœ‘›³+îpao¨-voJGÒ) ¿@¼ÚШ(v;Mzôâ¼]@&I[Úð¨ìO/n› ƒžë=ÿ4s¦ˆ™Ì³†n#Ž‘Ñ)AªUtêÝz‰&G“­ÍÞÎ.áë‹w,Z ä&E/žáþŠ3m×Ë÷Z=Ø)üÖ åcr•9q⣒5°œs6ã¤`´U44È6Ê·$nÈ&gÆa½ÝR´§JÁçu»Ü¥x8ÍÙV¥(]ºesoÊÁwðÝ4zØ¿ã oÀù^Ó«¼·N4Öv4ƒéLGÇ—·ñ}wÀ Ðà{±N•±µ@šy /+®‹üé@¾7³@gѺ(˜mf{Õþ&'TC•&¨î.ö`bIÝ17F,=—¿xIÚìꇫr‚Ùl÷Û›ê[ nUmfEA¥ãäëèÞz›Þ¦õ\KkDË–‹Ó¡$ö‡°´ØZ€mŒT4™`b<žR”g> stream xÚ]P±Žƒ0 Ýó{:H:!¤C{U¡C#IdÂÀßIQ‡lÉÏïÙ~ΪæÔX »‘S-ŒÕ„³[H!ô8ËDÚ¨°W)«Iz–Ué¯rBÈîçÛ¹»~V—»à_®GÐ8¼Ýêò½nNí:œ;8( ›v8Záð­]û!dì‡GÕ&¤]¼ÿÅ mÎÊ2¯“”Ó8{©¤‘œ—PÔuÉÐê½]Ñê)icŠ™çü˜¸;UÑÞÛZˆ¶½éÉQ\n,¾ßäªHÞlö endstream endobj 716 0 obj <> stream xÚ­WgTTY¶¾EAÝ«"*å}íx‹6´Mƒ¶£Ú€Y0!$¡ÉPäªÚT¤((R¤Ú„¹ #†6ŒŠá)Øj«Ý-ž‹‡7ëÝÒvú½õæß¼µî:kÝöùη÷ùö><ÂØ˜àñxc·®Ù¼ÆiÓWvö[m¬ ó¼±ê}Æpª ;…`+2b-ùìgÆS‚·i‚¡3Žk‰ŸÆÚ¿pÍø\sBÀã ¨q )¹+}ƒ#=wX[ϵ²¶žc+ ðó´œá=ÓÒÆÖvþlË9ÖÖ¶–Ëž’oÏK{ÏH_±g$÷léêàk9c±ddØÂo¾‰ŽŽ¶òGX…Jü¾›9Û2: Òßr«o„¯d¯¯åêÐHËMžb_Ëà­>´v¡â°¨H_‰¥}¨¯$„ƒ;žG_3x_Ö£—.„+áÁó&üˆ"˜/1Šá¦dñdIŒ"F¦Äœ šøâ3‚˜D|NL&b1ñ±œXA¬$Öë {bá@l& '™ØIüÙˆ0lã@\çÕñÜtü/ùbþãLãû&y‚©iA¶O©éÔ*Ê›jµuTÏè¦1¼1 Ǽ37}0ÖÞŒo¶Îì=+3þn j^Ïð^>»ix^"σ8g¦'áÿZh‘™ rPPiyPÆ ¯”åA²A™YHX²Ïh¤i5i˜ [ÁUÄ}a·xõW´h@{¥žÏ¢a[zä„ [›hÊUM~Q^Áy( ½ÁYÈKË—ªÂ•^”V0ryäÍ^ E&ÌUž–˜!ÝQ@á7‚Xp‚ô}i%òy%°±¨š–ìÀÇ$x™öØ¡å0ˆÒ±“u¨LÃëìo»€&kѹ:þðF4––-ÞèΰýXP[÷ ý•î¿·_®l~’MéÈ=rgE†t~v˜é´`²[#AJfºBæ4ËmǶ¤RÌCSÜÙ{îÊ-¸LuÇ÷¯´_îôžyvÍs¬gY¸¹†‡3õíý¯˜‡pöPkSŸÃÙøïá\8­|Dø¢:ì®ì è¨úÆæs0UÎÀº…ßF„S‹hÍîRñ!ûŠÐ–í­{6lµOjAäË^Ü;ØÒ{œ2c-°ªò½£š÷ê =Àé4¨@WŽ' ó ´Ð×€V´¡hšPR JPQùYª &lÖlÆÂØ(óa>,)ÂcOb“sxÜ£õû€ÊËQå‹þ°â9ãHEÃ)ë„Lиy—R€ÊÈÊÊ ä±?Ï8çö¼t^‰Çcó¤d.6dTFNV³ž^9‹„ÇQ1âÊóÅ‚JtXºÕ<ÖDÏg¿Fq4j쯵:E¸5 öCEt4Ä$2¸ 7‘‰1]ûEˆû$BŒZ û3V¥¶ÐðÚûQA?Ÿõ@7h¸›y×ÿG×¶ežà+½¬‚Vg.E°,Ǧcé¡…7¢@/ܪìzÞØ—{þNa?|ƒöÍÚØÒs0ÈEÞE¸\Ð[ÆÜ,ÔB\Ž­˜±Ï–ÂFXk¤fo»G¿ tl«®‹ã(ìG>êžHWƒ2’±ß0‚€ &Õœ©ã5ÔH)é'K¶a‚‚ͪǠ×?†fÓiº ÒFVÔ*2˜¹Þ¾}£3?ú¹H´B oÓC¿"kÄœë…דÀæ.6Ã&Ë¿™ãxTåÍÅ5±5þLšcEÕ¥ÞÖ3@ Zh+‚E;;Ùc'h!•r£”ð-K êÐ îÚdŠÓÝSÒÓÖ®¹ºkˆBÓªÐè7?hÍ;‘ñ_A‹—þ*Ä:„ÞÒ÷kÏ\åè¹?÷ÔW_.uX¨‰©×©5õGwC£;r¹¤¨Ž“Q6"H–o w»È$Š4E„<Òé H¡„#Ri>”3]‚û­kfâ?­qyÀ²rÿ³Í™: ´Q-aꈠDwëgë™ üÂp›Ãýw¦V~ä}®c=9‚{ns#[ú[ÒO.]Îì t¨ŽCgç èà¨ÜK.—µˆ¿ÖMg]8Úóâ™T.2Ó’ñ¹‘‹`iu4– ŒeòáàÈèg´Qƒ>ë7?úÊE‡bžß±ÎÈ•Fcl_c‚qx? m'ÕMéœ"»:P’'ËM)8V3eÑ©»¢×‚7¸æï®LSɹ>*ÒâEø iû™|PªròŠÊZ{ïÁqкÄ–íQúÀNJøüÁ!Â3ÂgO¸+¬€­'âΪ*EPMåÚêê8m`¢ºë¼¾YÈX$|‡¨_^ ¡èföÏUýzÎQO‘Ïàú§ÂdîÑÕ$ÊCã[Ž1ÕЙ¡  ¼Á-¸:ASÖPØ~Îýûx"žŒi.¾ÇjD­|†øÏâV ç¼À|F8²öìˆv¡Ð|“Þâs¥±=pPw_?eÊ tööÀØ.°3ÎOìàšù1|*ÙK·y§´Ïùl;D$¦’ÂYlò’¬ Nб' %Åùyw „£Ò[ _ŒyQ6xr Á_8êܺ»áð>æ 'U' zsªö?êúácŒ¢¿FåÜ©Fv¡š®È£Â—h>ëJ»6d„rêü¥Îk7.n·c`«‹ƒ?¥I ¯·9ΉñàœÓÖÓ.·b VéÖ¹»(¹U¢£„¿n ™ç3¨/~Yû™<ïÇ@‹ô°ogLeü¾ zjº'Æ-©‹éæIË—m·g÷C?g/>ìùˆ§eðA;Íà†õƒÈç)8|t"qÒT×-L8+ÃR]õ庈ҨxqªÏÚ^¯‡ˆFfèO(ˆóÒ`òÊÆ vÅz¸y¹EzÂ2 OøÏ™È˜¾;Ug(<þ;:\!øBl+ƒ^õT¶Öm+iæÒPîV”³\©³æ2f¨†PèïÑ9±ft}DuHHDDHHuD}}uu=ƒïÿŸ>N…Ñ$=²ÒóN ͶCwéÒO<òBð»à–ŠØçxý»4'ˆF~$|’bn_¬Ò¿Ÿ­ç¡Ñz>*À*Z?ëýì—z<å äÿÃÎN¥ñï—ÿ˜=ËMp£,3ô:­6¿®‰B¦œè9±ŽtM\­ ‰) ¹B¡JûsDИýÂÅ¿'±ÌœLé‚¥x´CµÛ¡æµ5†4 ÕÄéP¦æ©Í`·Æ¼ó¶Ë šßwC+Ÿ@nÑ9Þµž=@UžßOtJâHn‘dH³ç2h7 Ðî×êÓ¾³Ì(Ûջ׉Õq5uÔ5"(ÎlrÍ®m>RÄIÀ‘Ó>sD{Há¡;d«dÅË$ÛÁZøRráv¹ ÝúŠ*- §“³íÜvy5eàdg?²Íã"g³T‹š[µæûÑöÁDƒÈB!4š¿óSÍ~^² 1$Qá¢ëjÔå W–¶‡'|ƒ <ž¾Å_ÍàÔúóFdºo_ È8“gÉ3B¬Ö'ïJÈn›{Í3öªB[Ï<¨BPe^w<ú&Zq³ù¸ûá;)’ eô·ðºJµÙ¥Ú‚âª:=Paz¤ÂA ’´äÈPo®¤¢|hȪru{h‡¬¨g}}·EÐß*©j9Ø’{€sC.¨Ò¬L)$Sq%Éeû*ò«Ê“}8ß¹gxzy6yª¸$cµzõw"p×øj÷&%Ä‚?%& ¸ÄWíäÞ”Ý+'îfŒþíØší¨ÛV·6< =;(g¯¹…ûè/W;!‚î¶Ö.uVðÃ<ç•;g‚ËÂ&hìùÍ¡U—…ÏÐ*v-¥&Áä¥ÂŒ]"¬!ݤ°– &³{•ÕÍÍòƒ\Ê ×eå¶‹„orØ6ºQR¦ ×Õi+?Ü(Ý0¯“‡ø—ùhÕðzO3Ø»Z¾K4RþÉ^Sö ¥V{DÞj°·V ‡E†ªÙ€&JcŽŒú¯áAFè%+?-kÎ>¦¬­9þƇeh#ùÛµS/9oepâ¿5o;Ç¢BŽ$<]pKby z Wä¹;Äù&>^^äÆ%Ý¡ö”ðÞ[a8•ðȇs™±Çÿ7vááÿàÿÐ'·ÿ âðï dR-k­áÕõ£®  B4š8}Åfaž€éß¾ânÎØ7?#!ƒÃñnÚÜ+ú%]pZ z«»j»{*õЇ¢ji ¯Ë¸žhx[p‚5]Buhš÷[ú\ËGËÙi4šªÃSÑF‰@a+¶œ™EE=Äõ$÷,¹åZݵ‹Ìi‰ɽª÷¬…rN—« LëxÅl6éQ2ÝÐÖv¤ºF×ÒQÚcx_…ËÅŠpñ6e’á}U)/H‚xˆOIḚ̂_b±äMê>Þ$(--T˜­X'ß»ûãkì*d+z^aÚâk<ÆeËfù^˜LÖ(uÙ5õòjCèE©ÒK 4õMç¯ßšnQ -‰‡ HMMSpÕyCö)¥¦¶]Ñ`˜êÌU ‘õ”Y”†µ+G!Eyö*&u£ûÆh MMûÔ¦c™ÑÆóÕ¦£Ð£‰ÿ m¡g endstream endobj 717 0 obj <> stream xÚ]P=kÄ0 Ýý+4^)%ÃÑ!JŽ@†Ü•øBgÇVr†Æ6Š3äß7ö…:H §÷$=%UsiŒö|“•=ŒÚ(ÂÅ®$œ´aYJKT1ËY8–T­pW1#$}ÛóŸî½j»Ïþ^ggP8> ÷Í!äGÝ\ø¶xœ3Z( tû¼ÅÓ§/e| Ø’6œúŠG„¯ÎýâŒÆCÊÊ2ŽËžI«pqB" 3!+Ò´„¢®K†FýëŠa”A;3Û™yžž#÷@ƒ*¸{™“+Ѿ7¾ : ˵Á×—œuAã&klî endstream endobj 719 0 obj <> stream xÚE‘}L[e‡ßÛÏK)(èu¸Áíõ›eµ”0&aƶt1°¹±djí*mC))×vŒ”–Q¡í)¡–5igº¸naŠq î‹ É"!3¨ÓEÍ¢nÉ4ä½å­ÆÖÌIžœóÏï<'‡B ¢(JyPw°åPó–]óÖÜ\ÝFBë³é“R¡ e”ÀŠ•XØ )CeŠr|ðPŽËçøLâ±b$¥(YA·+ø²±×kµ/h´Úª[g·ÝÜfâ¹rÃf®²¶¶FÍUiµµÜN«Ñn6è;8ž7­z>;´s-6ƒÙÈwsåu&žïÜVQát:5zk—Æfo«ß¬æœfÞÄ5»Œv‡ñ×hëà¹ýz«‘ˉkrh°Y;ßævNg;f´w DI(TNiE/fÛA”‡¨£Gƒh¢íC§Ñ?Ô ê†¨Zä|…ëypG qJhOïe¶Z÷Ÿ$ g#M@”@ø{¤ —n¡ÿOžlìMbà~–é°âÈ/Úï»îóyT0þ¨säñsd H>)=|´·7€z ä°1¸r5ü.Þˆ¹$n¬Ì†'É´"IM¯à÷WÄ‚ /2°æ™·|ñúò¶Ó€ÃÑç]¶¶]þr8{BÏμtyç×ǯà ,M\ùmj1´ó4áÉú×™º<µk;QRL+qç>n§•ì,Þ-m—ùœý­îãïôo‡ I£ì?u¼!%¼–u_üF,°éML¶>YÌJ,øÂÖ¬¸§žå-²»¡!˜›‚»Yq^^ïRýøWê ùAÊd¤dD^èH Ø 'dD?*O)nç'‡•ÊÛ1e«ÔÄ•yxíÑ>à«o endstream endobj 721 0 obj <> stream xÚ]‘[H“a‡ßoÛwpš§ÏQ‘nF…˜$…`‰ffy(fšYtð°´ÔÒ©ø©¥Û<üçiQ.ÊZV[Ré`¥"¢a‚ˆ("¨ˆ¢ÚUïgob»êæ¹øÝüx($“!Š¢÷'g¦$f¯OOÔ¤ª·¨ÕÞ-J\…ÄP‰&—ˈ–¼e†~'Ða¡– /Í^ž ô2b’®`$¥(ÙÊuêM›wŠËJóO…§ååŸ2†kŠ Çÿhñ&RŠP0âQR Z‚($AèÕ.‘û/Hr~Ŷ ˜Ls˃q×þ^&þPä²O`Øþ°“ûÓÁ #”6é›t Ž/ÎýÈòw´Ò8዇éA¶N7›€;ªmïS‰ì%³½ZY 5UB]–.ͼ¸¥ÛgÑ=H=ÇŸ÷Hq Ø«èsM7û){µ ¥Þ—”~Ps #K*ê¡ ,63X9qãÆ{i-c16©¬²Z+›+€+`šwB̌ώ<™yür¾sx #²µDžLØg™Ë}Íéî.¹bP.)˜úEÒ<…i\ç‰ÁRÞƒ7ˆ¯®Ç}àF'ÛU°;/>I8\ŸéƒÍÜf±7q/þËûñ´ˆ¤üÈHÕˆqä<êé¸Ü .îöi§.¯Ò¨WBÚ€þJõpá´0ýÐoïsÌÞ˜~o`úبÆ]æ(¾XÒÊñžI÷ÛÀRî+ Ro#!‚N:Ëo¹;7®WÜ4þ“´ à AQ·˜cîÓÖ÷¼çŽVà§ÑŒ¶ÐR ¬ÁV\.¦ÙÎ6úóªa1@-Íp9†–»ªwØgøˆÞ ‚Ò”ÂÙÒÚªC)+"‰<Šl$¬ÕÒ`†zn蜂ÿ‚»ð> stream xÚå\mGrþ~¿¢¿„ Üîª~ lé±ÏÎÉôÚÉÌí.$בóëSÕÕC6{¦¹cÉE ›3ÝOU×{5—ëBPZ9 ʘ¨\ 0ÑkTh,½&e5ÝO4Gzåÿžþƒò|/¡ ‘_­Š_Jò£Ò °åUI£¼ÖÊ òÜ ŒEši²³ŽÞXe‚çÉN™è" hNrüˆ8ÔÖÓ *0ÈwPÝ1š˜'¢Þ–ˆz ò€æxÚ §MA oœ‚È$¢ìi¨çxÚ¼£;´YÞ$…hµò ÚÀ€Aa–€Â4Pa$TVa" Ž„—FYC{òÄ¥æ™ÈXddZiéŸò$ëÏ Êzß6Ø?Šà•MÄ?mÓ¦@°èH)Ä‘p@Ï=Ò‰qZí¼#V‹uË2$é“èÂÄu4¤”,ðþL 0;@+Œ ̽ãGò…ÞcÆ‘ ©À0§.W¬Ÿ¹¡yiyb) 'ëò‘=ë$Ò–<“à=Òvд#C!³Aæ2)9IÕD22à¥ÄO@¸!ó Yd5Á²UYšc#ÑA8GÆÆ¦Éü²ÅÈH Á“ºIÛ!’ô¼¥;IóV YÉÜ“iiEæAl<#Ù) È(Ì"í‰Í9" Á“ÑE , Ze™¤›YCd i:²ezçiØÑ9ä;ȘØÖbd3&ùĘøQP1Û=É™8%II“ŸÑJ™¢ž€ÕHoоH$ddòÅ„ŒÌÈé­²9©äØÊmdŸ%±xZ•}Ó‡À.CsMÚ[ФJ ¾SbUz6DMÆA^Ä£ÈÔHÚš­He4òìcd#H—@l,âžFQøi¶Ÿ#‰Ÿl‡G‘çñSÈêÓžióˆfsDƒwjt´>Ç,CVD»bCÖ)Ó c räÂä´†þÑ<òc d3`ÙÓ Ï0¯ÀÈvl9|q¸ <ÏeéäQ¤yÈQ“eÌê4ä;„BʧQ^Á¡/’^ØRiD¶Š–Ÿ&Vlüd‘ÄÑ6 ‰Kt쎆͇e À‰ôÎq“xÄ+ؼI›H»§«3»²eK üÔq°‹¼–c2²œ£)²\ÀSÈÅÀk[`ˆí˜gˆ¼L žò¼˜+Ú9©‚Öò=;‡¼È#¢É\Þ%e ñÄ3rŒGd7Êó,ù‘|ÏqXaбVY’È&ɯì±"™1… qNñ9FYæƒLÜØD³=[’cÇöl+” (0p‚ñ,™ó‰c'Ï …$¥r`¢(À£È¡…ðÇŸì›4… žC'B $¢£y&Yºæ¸Ä#zú§?]ý´9ÜÏþüña7ì÷oˆð°W·›ûaMïŸ_}M3^]ýóö§íÕËg0<ÿê««o7»ýs¤Ìû׫ïÖü†TÅo^lïêÃÕ´šFœ˜ùþ»áZ¡ùÍW_ýažjCì]E‹ä~¢•Sþ‘–?ÒB]Ñ"+ä7>r†n¿¢ÃýJ†kµ i L{Ä•Õ#T¼õ°Þ­ï†Ã°kã  0Cž.¡ÿ²ÞmÖïn‡<õÁcžô%ðëíýþ°[oî'ÂX÷áS o.Áoßýçp}Øü2aþ]]øÑᢠ··Säë>²©‘ñ¢X~®ÿÞ"ßô‘¡F¶—o6û‡Ûõ¯-öÐÇÆÛ]´Ãéñ} ý¾mkè‹Þò~Û·Õ}ÜÚ S˜¸?YÜãáqGÂÔaýn¸]·QÀB žjgIgùn¸¿Ùª›õÍvψwë‚Êï`·¾Y·ø8ƒ_˜¯œ‡³ø„ùkšVQîŠûõtnJÒöI^ôÿÃŒó[S…ÉT…äÂñ&±£ Kºnu¾¢Uâ–„ät’™ÉjNÂÅ»í Ÿk–(Geæþã–e™EÜîÝW‚,€#úÄ©ÿ:|عe°õa·y÷¸yš@<#€5×%@vð~}ج»¨i5KˆÇŠ„ï’Øoîn'Ó®ûÀ®—„sÇÒùïú]Ú×ÐñihE~x¿ØîϸîS™ðüÍíöú¤¹™,nÃÉ\GÉ׈µ¹ºÖ„ Å3kM¿ÅžZF†³mUI“‹¶§Ì¨{?&]#C™ÒÎ}Ë£Ó}ØÚ±Lß±(<=Þ®ÛìàL¸–°±OŸìfÂ<ôiÔNk&NûívGFY™I]Èõ”é°OË>a£4  ‘PŠÄÝÄLn*{-º{¾'oc¯ͼ¢[u·½n'ä\íP»GšÏgÁ¼®ŠùÈ©¡ý·}ŽãûÇ÷›“èÎ2` {ÅÍÄéxwÈ—Œb¸{È¢½^ßÒ-ªÙm¶TÆîµM“î,U˜P™¸ö‹íý/ÃN]¯o å×TÛ_SiOíѺG¾¥f¨[©‹ ЗXèìt«9þZ.bŸ‹ÉÞ¿}¼ËÏ}`¶ÜÃZ êçí®D®6 S— Ÿ6 b3£ÌŒÈEnÉ„wUu¨^¼ú÷–³¬µý.DýøÍׯþÜâ¾›ÁÖ¡\`ùáå7/Z×}uà·Æ÷¿¾ú·ïZ"7}"—xýÏ—å.Uº‡:xÀY¬²Ý×3uNnèî¡kO~}§>Ü>Ðý–“¡KÎmaK^TÁŸBM凜‚¿_~æÂ´¡êÏÒ%œmgâSÿB5ýûkòÔw!•v[ªçï²óþØ*Í›e[uèÀIè =ž6EŽŒ‡ÍÝ‚Ð'˜¦ç6“n%³õ¤Øêé}m1u´À%Ñêh“hñ5u7ÃõæŽVNÒǾ‰TVQy3oÆÈD6ÏÇÝ5ù‡lã§_‚ÿ0Ňãq÷R‡ýëLåm»º¤õ§—KaÁë_KÄVa•X¸T2”8µGT"8%U"x%U" %›T((((ƒ’s4…‚‚‚‚‚‚‚bÅ Š4yJNì”+(VP¬ XA±‚âÅe”·ç‚r¸PP.{õõýýö°Ï1‰z_;áÀ N8p¼pàe^öáe^öáÅ Š/(^PäSA ‚%J” (rœ©ä8UA‰‚% J9kUQP¤SÒŽ+9ðSr0§äMÉq—’³)%ÇHJŽ|”œÐ(9PÒÇ7Ò—C‰Ò—ã‡Júu`Wï‹3ÙŒh÷_77û×›¿ÊeUÖ/å!$S^Ƕ¼ºòêËk(¯±¼Š`ÌHÁûµ'n¡1-…ÆVkU´¯-.”0v¶·[«[׉—z1Bª&¶-óÙöL VƆK‹Ý¬á=Z@± k3{éÉÓšf/®#Oç#ôä™#Äy‰’sÐ HXAð‹Ü2æE-~ %ø :uÅ›]1Œ’6üɉ@‰%ü›ÿM˜Kd&tµŽÍnC“ʬuËvTa)B4§m—$d$ µÛ,‡Ã3˜®ÅôÍ6ý1°•$fÒl€K°”„¤¿ŠD¸– Ý¾XBI½&ÆO0£R'˜0Êl  Ú¤œÐJÖC×hî#¿Sý¦^•iS+(ÛAˆ‹æ ](§:O#€Ö»ᢧŸÊ)?‹ŠJQdJdÒXfŸ<JMz®HÝsD§[›„ëÌœgƒ¥€æä—P 0s~ &,ÆlüÒÁ,“ÐËÈ[À4¯XÀ¥ËâÙKV,”B À,sÜÚ* T“`Æn«4OÛ,©åZCÏuœmw»Y£Y ˆúÄdéé Ä(]à,Ó¸˜il™>Fo(õع<ÝjÒ5Õ$Ø&º8+—nq9\XF”ÍŠ%”V¬ý3òÒuCi´ kS—°ÝPÒÆ:;ŸÓÁÁRg:n1©=ƒR A)Lß ¾>Bä¤toŽvUúr(]KÂ-%!}EUeû¢ØršþS‚‹eUÅ•àâõ§T奿ÑzG~§úõ=÷­ûpÒo)na¶¸…nq;Ál‹[?ì‚_ 8ßá@·<ž"Äeeƒ¯*;ð£Ï.„ŽgwkíÒØ©jm(µ6ÌÖÚЭµ§˜MN÷aVêÉ,Lb-õŠ5[ì „Å~Y8/Ì‹ÞÊQ$·ÌqÏ”^Êw(=”3·Âš¨,¬s½ ê®4ÁuÓ»Ô¿BYºÅ€§håp õ\´F£c6Ñ:Ì´hzá!4>šù4~1ÂÂ$ï«pŽå0ý«HåL¼œH¢ψ{{éE¦€í^æ“<,EÓAp‹l¡—F‚mæC"v Ú êe: õyrùø!ývb9íÅrº‹å4·°ö[SôøÂøéAI…ßÉô¢hð­dNýŽŸÔà\—ŠÝcá)fÓ¥†1Y¼Ær‥4oHØÅl—‹‰ÙÒmX è—åp©Š’{•OºJã‚ChìB‡6.ÚÔAÀ¥§£_Ïetq1VÓ«E}Th9$E?WÖ¡ï)46§Äè…ÆÙCôa1àÂäê0^>ÎC¿0¹ŸYCùPËÑ/ŽutU¡8n+¦Ð d± ¦’Ä+1Ííb°‹;$„Åþ´½0»½ØÝ^sÞŠ±ÝžŸÝ^´‹q™Ä:v—ÏS1Â'XA9ÔÇòñ-–Ol kSAwkðÚ½øy„¤#t¢JÂ¥©S’¤^yc‹Ð‘C÷£â)B\¨Óê:,ŸYc Ÿ Óòy9Æñ—ʹùå#ý^2cyW’xi ¿=´àÇCüñ× ÆÞa¬,Êç¼ß7›õ7Û¯Ù,øeC‚úb7¬ÛݳïÖ? ÿ¡þksøYýLtv»á½zX_ÿÈ=¿úq·½y¼vÏn~Ù<ܼ¿û¨Þ<m´¦ŠíÍóç²ÙÞ¿\†g/ÿ‰yù¹Aýÿ¨õŸ ½†û¯¯y²|:õíæð6ïêûíÍpõ·ýðÃã¿0¶¿úËúŽ[Cj­«ñöéWnXG9fá¼XÖ·Ûù74¢]ñW·ç¯zö'D³â/Ãê•WÁ†•UѺuίX²!¤j­·fÅ_É4y"ÀŠ…l\™ã”¨M^8÷ã<ägÎ0¨×nh¯°bK&å5ˆCF õ*Œó«yZY­W,SK(öx÷ÿÇÏ(¹"¥·|´ÇÊ<ͰA¯L¹êãë¥þ¨=ïôŠ¿`2u)e{2<®°+;‹ehÑ’µ$e#ŽŒ!Z?òÇ}°-ÙÓ\á>5·´7*´2µñî—ú3Ê®ºÃ’{ËÅkE®Y÷Þ%aƒ'éÔ×úþ¬¾ÑfÙ{Ò²ÐsäâYÇÁÕóø[²Z=yc³ç¦Œêízü‘{ÀÕˆ+¹£vúhW£ì Q•ë¸"%{œ—yvÀüäë”6d|ªV±\9¬á Æ'[Æ61oŸs({:£móîø›ÈüâàÒŠ¿7Îó(‰Wüw4dõ$¶ Û@ÀñسÝI#NF–õ2y,…BAæå«Ñ€g·¼Çmëã«>„€Y[ø¬~Z„Hw°!Èû‘®eU5[æe$àÍæqý”™—‘\­…ÿC®Y˰q¦ÊÍD…—1*èSyš÷Ï×QÐ8to¥¸†%7 !ÃçW§+^Êùá?é0y$¯çÏʲ·3É{æ¥Î¹lµ|mŸ}’z€c“ ðN#km6äöʬìCµS¹WÈ69ÊIr­hÒû˜+ò<&†ñ9?H9r!ÅZŽpìçH™Àð_õXñTɑ،ÑÕ†´ªã¶KT›ßò;/¿£PÌþ»&D=ÇŠ2²ÈQÏH xÞ¹,Ù¨S·q4ÓqÉN(|5NyO\ È=ˆcõ!£dOÏêy\)ZBµŽkV \¿”YV,c|ýëÄ,ϱf´U™›ev h,!±ž'3|Ö|î \à\õ9×sÔèYO‘Z¸NÅàØËlÊ–G^—ÄWí±rõÑçŒÙYb‚cŽÙ}x3¬èB…1ä3s2á˜dËt§™JCN[–-Xø•û²û“’3첦šG¼ú\;îj8ú`yâ53Ë»”ÑiYªcl í*Kí-õàië“ÓÝßÇüy´Ž1åJ*äèäŒU±+™°<™åVó3ërù”¯õ*šûr§¾9žF“=ÁI¢æ™gȆã¨Í.JV@8"èqVÌYã‹ë‡kyÈuì—Îv>ïNë5åJä¨z6¿7·szý_“Îèù9÷TT yþÌ;çgù4æÓ®M¤F“ØöBîÑ¢e pêÞ8§R“qk´¥iŽ‹ |<Ùñ&d¬ËwçGèÙMeFxžÜFñˆ‹6þïôL6›ïEÝŽß'“Û/^qœÉ%"'K%õÔ¬™åèA^Çw_”suÔ+r­«ûÑtÎW–W20)©›îHCµ†CûçÉOŠt¨ZæïÔ¤Çÿ¹ô f<"ñv,R-¦ÜvX9ìÈ矩9 óFšwÇ4À]­Ëº÷“ø¸ò¹L§ e¾õÜÔØÈ”lþ$ m.Bɽ-£@âpùÏÔi¶p¥Ü>­ãT`=ËŸ.8reG,Ez—¸à&j$ùܨ4-Ïg–úE¢¹£•kÛ5ŽÍÓSÿOÕ¥fr¹ökD¨:ÛÚþäN;OäTšÏbט8paÊi9žúwG1€Wct¿³ÏÛlaÖ`Û8PãÙµÜãbœÿàé?‡sË6!×ù2Jwe‰­S®ÒFñKÆÜ\ÆÏºÂDn¡_¢“ ­$‡a\Ç|¸ŽÇœÙÚòŸ å¹Éæä’ŸY•¯ìë¼nÜk™q<&ÈDøË³¹\Çq.ÍŒ=›Q¤’­IƱ¢VÏt–›«¹ôçò ‹lë§²këBý‹Ê# 8i¹ýqóEtžûöÿß0+ endstream endobj 723 0 obj <> stream xÚÍz T“WÚÿ÷}Ý•˜»¼ÑV[«ÖÚêçts¯¶EqßpABö,d²ö aUQq×Z´­ŠÕÒÚvj;¶¶ÓE§Ës=3ß h—ùÏéÌœïÌ9ÿH8psŸý÷üž'ð¨Aƒ(7jõªÕë_[;eõâUÓ_˜>=ð»™þ‡)ÿ#AþGƒýÂðÕGB>þëìG)Š7e4y¦Ü#ÏÊQçÉäéÉÇB©`oÐØIÓ§ÍX(ILJKI!‰ŽI[%IÜ!þ‡_’›Fâ=BMâM1ŸZH-´$do-oÇ`ѰLêzÐÔ—Ô÷äò8JN%Rƒ©!Ôpj5’E¦B)>5†PPRaÔXê!êaê1jõõ$5‰zŠšLM¥ž¦¦QÏPÓ©g©ÔLjõj‘ò µˆZL½J½F½N…SK¨jµœZA­¤VQ«©5ÔZjµžÚ@ER›¨7©êmêêÕG½Dñ¨ ÊÉ{Œw>hFPEÐWAþàIÁÙƒ5èË":˜>ËÄ0Ÿ±-ƒ·î2ȵ¡’¡?Û;|æpýˆ#šGÊGþu”mtÈèc¡Y¡廯ÌÓ.˜"ØûÀ¤*l ›fK7öoå>„Ö>2öå£/?ZÎ=È9„;ÇgŸüXâã›&ð&š˜0Âÿ(¢ÐZ9OçF«ÝÁÕ~¹Àä€À£»¢Û»·°¤®ŠX§Ö®ã²!qgNštgîØÌn/^zÊWSç㜌ΓZ‘™«Q*Y$zàÿôþþ2´Q¼ûõùÁ[`ÖBà±1c£8Z™#Í«qèì\)4î+©©ÛW|ºØ¹çV‹Ò¤"NÃØ%µ PÅ΀>ÿ§÷ø{ЋïϲyT2ÿã>du‡þÔ‹â{ùÝ?ù ^}€?¦cÅÆx.›æg‹~÷»ÖÈ— !ün_*#I¶¶ ÑÇèyÆS“-Ä>&^¥z8{iàì»ýg¥LR²­]è§uLj”¥C +­”zÜ5U œ•¹8·qÅ$4!mÂK8~§ˆ\`1swŠÀ”.ȇspÞ~κǶ¿¦‰­nn¯Ù „æ‹íÍ‘ÉÎcSj4;6W“eȆ%°ãŒâͼC–NÝ¡{š™}wF’Ëû‚oú¿ˆ˜nhu)gï–2[bŒ«¹8ºî£s!Ë”ìºD[§Ðÿ6S¤wärY ÈT¨·ˆ×¨×Ý·Òü¡ÿ¨wô{3øs£ ìì…gý®eò¡jÂÒÅá‹Ö,_³tåʼ<½rY¥ŸÏxТ ­ÙaÞ£U›Ôl -6ILbˆhs ôœ=wú­Ó='.œ·}ƺ:®zêé9Çצújk½õéõñ\ -õ÷(óøÑŠäúЈ÷â-´èæüÛüDûûÞ½Çj{êPÜKBXšo÷DïÙi_æ\ÿ³ÁO¼>AæC¹ÿ“ýa{íOÁ~t^P”Ü[¬Ëœï¢Ù 8LNp²íæ6Îá£Bp¢„.‡r3ñüþ6í6!䑯¬%QUɮܹâ¦ÂsǶþ1þMÕe¸—ŠÞm;Ûyå“£×€ÇÕà!–\SFÙïnç³¼‹ˆÛ×à™x6^‹#ÐüJöÁÛÕGÎÿ’ý=>ÔÚØïžÄ…óHA±¹Ø–Fm´ðn#³=ÖÃID¨+@Srr·ØÑ!De¨—1Ûã Û¹äÀ_£é‘µCèodö6;š9r‹©Xîµ0ëô;„X{‚éô™{9_€;¦Ü8jn¼Ü/>¸¹_v1”d·ù²½ÌÎÝÚÝ\îý žöLÎ1å+rìú½Ì¾VG+io’È•ÁBÖ@¯?)þ-sÈeñ‰ö=BôEùŽ|GkSë¾öz»*_åT7o k_ß¾®}}ErX¾²( ²YÉ.S:©|—‘“âÎpFWHŽ¥¶¬üpå‡k>Ê+Щ]¬™9yðø‰£‡:¾ÿbÀq"¦®2W&„¬œ\¥Z¥V©Tj¼ Ï “ÉÓÒer…R©ÈU±è"s°Ùz€«÷Ñ$ÁÕãÔÄ ÆiˆßK{úËMõŒj2™ ÑJ@ ì\:-ÇåúI‹k­rÔXÿè;ë3”sD¯.Y”ð Lcñ4¯@b´MBsÐJÒ2'ÿš„Ÿ>Îò; cq@ m¿ÛYœrw˜ œP¦=Іžö”69›€Í§Ñsêwñ€;*ÁàÁ‹2â4±€±ÎG\&b¨6U«Áì6:O¢üØ tövð¾ß¯†8z›Ô¶_ˆTèuæ;zà4 a€h<ômÌs²x)þR€ÜL}AQ×G“&¬ÃS„§JMŠÝ¶ø¨bGÁ A¼D× ìB‹ü%•åw—êËŒîNtw\vé*a:X6ä¦)22rÓ`¨OkÛu^C£Þ«¯3º5©1•›ª®T{¾4 ?}ä ‹'਄©+(®ç®Òÿ%ÅC§$áAÂåé¾Ó=¼Óo¡kçƒÑÐnAynYN¥ò@j·º Øï¿ý Bß¶6§HíRÇÒÒ°dG’-µ$ª.åb?¸xô]î;xg~ÕDk–ALHC±ÙEÀYÄäëj’ôJIžB«ÒªuÊÍû·z6Oz|!áü0åÊüé‡sOé:e]©M`;gÕâç¼wòÉ,4ž-€¢œPæq8ɳi\ï =ùEއË^xȉîöcžн¸¹ß3 6Kb/Œxó!eàÆweˆ²VA5T±¨¹zÒÑ5Þ‡Ni ñ' L›öÔ®4µTŸJÜ»Ý-jêÖŸ‡ÖOý¶P™ñ »3ËÇ« È­ej ÎT’[œë92ßÅ+ßÇ+ßÅ«™vi h¯s”E‚°Óè±ãhÂ4ÞýFkåñÀM+I_œ"¡k¡J[žéP‡YudÈÒA²,Z!Þ„GlÅ#6àáÚ,M–.‹5Ñúm±®x zf-úëhš1À›í¬•qÖµ[ê-èÇPBsUî”}¨=M†™ŽQÌ•ËþV4Â&hpw´AøÒ«+%f$°Ì ê`ñúø”ähˆb_üFò6ׇ|ÞcùQu»{¶áèIa§$’‘hcDñƃ„Ÿ¬g~xöØsÓ’_æø­Ie²6Îm.«…Zh•¤ÚY‹ŸLb^ݸb1—Go¶Ç¶B'û¢}Å $ÊíŸXrÞO½¨îÓàÆ€ K™f¯a³ðî·ŒÇÒþF[äá´0¾õ#þÓ,B®­éÛ·³èƒjïúͺâØ¤„iQ°¢Ü©my…Ú(f‘”É?Ø»÷(¡Šƒ«qè<‚ëb4FýfË•µ¡'%žÐ–O £þ»Ÿ¤åe( ‰•–§yë«+9èå^faU4fqÐÓqFüy<#¼çÛ=½‡ÝExM>!ž„s˜’ór¤[·‰ µÅ¼84ºOÈoÿÈCn×^½[é48tNûf·|ŠêzƒÑ…€Ý…̾zã !Žaâ÷n®Š$züq<Ó7q0-ì‚óµîó’04¥0Ä—ÍÄ‹ ‘óßaðWwM‚æÃ*4…½ÁõãI.‹Ÿg W§Ö¨’¢·J6C4ÄVI}âv}§®3àžQ=Ä»ëÐl7ÏóÒ_ F Ê nºÈî(D£ç¼7˜J¾ñȯǡG…½pùHÕE³ÕlëÔ9ò¸ 0%ªr¤;6Š7«¡×[¶´¦u¥ï3vÂÖ\'0¿íé»\›o p3özÓs/ á½€ä÷· 3KÒ…ôò;Pˆ¡à%ѵ_íASE ¿¹— $ó=ñtl’í€]A¤5ýœy«ìË÷¸(4ºôYyªlÈ`ù)•éîÆÒ*w׆ºÜ"ˆØšöº.Œ¯é÷—n;PDÏ5Ry å¡ÞSÒ÷Ñ«}ͧøß(…Ö LŒ\®Œ Ä—ìòflIß*!8ôz6éò'h|ã-4 ª}‚›NÇÙÒ¡‰-vx\œ….1+KÈàSe¨öƒOO}&„ÖÜ}’ZBškŠ÷@žV›G8mfINYuAyI³¸<™ÔH/R¥È ½N¤–5Vší`ùß+ÓóeV°/ÌX=]»Ê£ öÿ¨LÅ^“9~ÌÛ0ÚTìQ2OÞÔ,$CäLüDn·¦Ô«.®8î ™“Å—Þëñ¬eUòª%\ ¤dVgUÜ÷¯Ñ3Ý$CÑ ^w…ßÝHÁrÆçÕoÞ53 1V­;ĦíœöÞV:g=©´8ÅÖ.D¯1}Ÿ~u¢,2‚à æ7ëëƒé´Xl%ŒFScvƒôà†’Í°'¤.3¡oÃæZB_Bå¡üðJ/ÿâ>’¢2¦É­Û*ÄÌÎ$S$!.‰¾,&)ÙÚ$ôeV¢tÿ“d½LF†q´‘sÒõ¶êjð°^i]"7ax{ÝωiAˆ \Û¸¶†ñ5é7 ñdæ4Hc×j§¾JR8Ùe'ñª¶Ú7µLJìM5d¦C*kdV^HëºÖsá3ΟË,ûײì™"瑬n x´ˆió#ÿŠPš/…NJ±µ ï t‘ ‹.Ý ‰È…W¯ ØÀÿ@ë€K}±—‰J6màø2âäÖßFc ãè=|ù:°çáää/ œ=ðoŸEéä´/ùmä’»Ön„å°d§l IXõÅðúåKc¥KM8þ*¥îi¿ë ¿ãŸªþsYÿ«D ìø'‰äÍnHéZ_´"`iTÚÊùNçñ?Ø€7^GÏ;‘οF€YÅ”§a'ôááh2Œ‚n¢8~: Æ÷o½õý[ïP\ 8Àðû>p“¬a¹kнÔõ²EÇ:ÃÊØ)¢è¬XNæ^3C‘±ø^-áUÄr´ÄíÜúÓTõ¿»1`y%Óè1ìÞMa¢a3÷ëÊè<1h.Ó»/õiOCQÐ×H€èh#\ ¥»¢Ùs¤½a­@ÿò–qO»>üèA!"˜^l"ôƒ=uùЙ/;ñà9ôóæ€6ܲe¿Ö†4—ª«ünØY‡‡Ä¦é×üF -J±’9ò FjT¤%-QjKT…c%-;+¶— ÿ$…Aº_xÎÖ»²¸ 1ðÑ~Dß²³6ú<‰(XÎâéÌ ¢E¤t:¢®*z %¦RcI Í8n&ÜOŸÞ ïå·7þ³´H"Zy/­xâè8‰ ¤/3΋•?Þ"Éäh´ÙdöLªÎ¬sWT×uDUïæ–ÁÆ 9«Y~»é'2…ð "Ö’¦úLMhËQ”呜àßü¼EДС8ìGîÿZXÈèOm;Y™â’Ø’í;ò_/‚3ì™wKpçàÐ.Ç+lžYUÄño9Ái3;Y4œq\j.”)ŠÀNYcÑ8´VYA²M ì+SR' á 48órÎÁ¼ÃɶìÂå²uœŠ^`Ûy2ó¢¡ʲUòÔB,`úsLǪ,ªBŽÌ^E‡ Nòâ¼÷AX¡Ì?ÍâCòЯH<èáþU4ÕW° ™Ä¥0ü®Oq9 "KbYRÝŽ#Y„޹è÷Š‹?†7Øv CFÊ€‡¶©æ®X«8×Í¡Z2Ûâ‰(‚ù™pÚúѾ¿6ûúkÓÅ4ì5Š…%¨H“›H4‹K“<‘o*Ã)8Þ\yÌ<+ M"t#“IL´v I]ýÁS”!ü>Q TÃ!ÞÈhã̆[ >f¬„ ¨$S |<ÈÈ€i„–2GÁšÝúòþ©m“öOµçÚsÊ¡ª/•îñö6^òö:Ë奕 ž’¦%ÞH(1M(±©:ÇœÂêHI‹Q$¥,—,O‹PÖªëÔµËÑ„°¼ ME^…Ñ© L«õ-æêþåJ`Ÿø+É%Ì)0ǹÃ[§¶OmšjWZsKŒdÆ-{¡½¨ájXå±ÊãUÇì¥ù¥Ö22À[³ò³íÙÉ®Wrã‹aäEêJ±+ìÊÒÀd\b±Û [oï½Ýþ]å‘Zo—™ð’—DL½É— ,ß­§-“.—EìþSÜÄÏ N}>aŠž½PAæŒõ¢b¦Êt¥QV­-4¤Ë€Z«2äel“¯ËX+[¿ûâO?¹÷®†6sÍ€EÄ—fpx•ðrÊdµâªäꔪ䶭a6]¾†@:Q”•±yÅ–eÏ+bŽ’’xh¹ðáR¨-//-«¨­®)¯#FÖïjÚÝk׿ç²ey¹&V„vð„ŒêT_ìÁ¸Î؃»šTx<%e‡Ïì?ö~ 0ëI`º¼ 3Gòœ\eN¦<]–FÊDº'ºYÞf |¨e…’*W‰¹J ðm³Ç?ÜÍ;A”WâçC<´¥ÕÒQãq7²v ¦E»’¢Å1áÿÃÒY:6°$Wò9t›.G«B$´!J¿Qš ÞiØFà)˜þ ¿‰†ŽFÚÎþõŸÆ¦âþqîA‘ÍÄýág½ò¿5ý4)ÿ£ñ'Õ?IiÌ”) ñâ„“Ñd#«-Èqpd”³Ù,ž²°ƒu×›¡•å{”UYU²€ #MÆûŸìýÊÈm¿˜¸í¿eaÛdàxÿ4Æ”™ªT$Æ‹ãE"ƒA£=›Wª¶ þÈõa‹Õjƒ|ƒSáÒxSDÞ«Ñj°vhsI>‡¬BU jMhµ¬z»þŸØ>úˆþÈÏÖoúÿ%ÀØŒn *3CHðjjjëÚ€%7tÁž-‡´Í.kc§×ˆlFyùƒ„TO¼%Lۣܱ‡6C$Äo–$ÜUñöz¿ôÞ¬Š–\%èš´HÐÚ9Ë(”ÐjRÁj›ÂüÑŠþ'¾€®-UѶ•’&kiþÞª¶}®ƒf‹ÙVÖÝ2ÁªW¤nÚ,Zìøhн„„ Û¡%Ï—‘š—©€d–ß—R‘æm¨¬ üêÒsU«HÝ=8ö6/MþQ–o°˜@õãä@ÉõÏ”üŸþëCåÿÃÿ~%};PH?ý¶ŽÔm(=À¿þöxŸ:þ–8þ'´­óoü÷5þp@ã¯ïk,«ñ/¨@bsq=×à .œ;l°sØó°¡ß 92”›9y…kFáãó¿Î‚ÓÅ endstream endobj 726 0 obj <> stream xÚ­WipTeºîNàô§¬Ò6¶Âœƒã:nÅ8.¨ CX"BÈ‚Ù÷N§;½ïË{zß;é%Iw6I  ‹ìADÔ‘qg,õŽSÎx«ækŸ?{óêW¶¬,zü•W/|aáÂìo/fæñ2ós2¿Ê¥ÿôú”Ÿ¦çdî™ò÷ñü©Ã?.šú+÷û»²gϬìi™=#ÇÜÊ9¼\>Ê}¿YøÔï–7Ô5¶Jv6/Èo(ßÙ\¿`µ¤¤¶ªìýÊãñg<Å{…÷*o%?—Ï+àoæ•L©È©Ëiž"'_Å{€÷ïÞ£¼'xOñ~Ç{†·ˆÜ^Nî¯à­ä½Æ[Í{·–·Ž·ž÷o#¯·‰·™·…7?‡ÇçåðžæOçOæ\˽4UDÕ ÚÐ’;>ºÓ?mÑ´ñéìŒù3>ŸÙ7kÛì’»î¹K?gæpéݹw‡D3â¿x$§KŠym|,À¹¹øÌÕZ꡵ÄÚzi/5èêë‡AÔ#O4Ò3ʹ¼å*; “âïRxdpNæ®ýR8–™À?оêÆü³ðOøãâƒ/¹÷J¯¶)U1{œñPɤ]ÎØ”f¥EÉͼ©ëKئÿ¤¥tZ‹Zï5û‹ŸvS§sÀÕ¹/;#î¨#‚œŸÅ­¡e`o³ªäùÍ­O¶ekHúyïßÿ.ÄêÁ̃ƒ|üÄŸr3?¼'b)4^…8ì/¸_:ê?ŸpÇb®@IÊçp{À‡\ð˜]&¶ *¬Õ°v8·Ò:³‹êߕͻÝ(·( ÆÊƺeùÒ° Š•jöiÃèuöºSÝxî),ÂS¯ŽõK% ˜º÷Ág›$¯[Y¹¨€ƒ 8|ÇqØr‡Ùr<&·‰VBÙúƆÖÉ¥½ëáQX¸åÕ5 _\ÅÍ0s³Q›€£¿âîÁ‹èI8×91ðýÞ šyc€¼Áäg 2<ÑžgwÿnøY·: ´6™6S­Á¬Ñy-f ö;Ç ÝÖ@Á ³ƒ±ÇwhÚ;5~CÊØ¹ã%ÿ,ýÁîò*;½Çõþ¡3ÇÞŸíß}ÈrÄ-Ð^«ÛÀ" ¥µU¨žª„J¨r"­Öªf y4Mд³¹U¾$ÿå5/¯©l¬h¬®ó¤½)Oú®GNý€”ŸÀq€Dfdß„­Ö"¨ƒzg ½ÎªRÆ Î¸³$"c¬mÆ6³Œ£nn«ß ¼MÐÖBlf#²86y,H¸¥]¥R$¿›ÓîÉÑç  .=ÓJµ¶°YÐùX÷0~XìHľ¾ „‚a8á‡ÊÙA½ô38G˜Ä™wظ¤l«£µ‹[áòº¹Õ¬Á© rPQð½!œƒ×â©x áÐü`<šðÅKY$ÆVsk 7G\ËÍ®ãfÕp³Íæ·€ÔK§´·3`ô˜½öqÒˆqˆd;JQA[‚€>O(ÜÎÊ#%•²qÆ‘ð&Ü <5³Y>fþP7«Ç >ðš<&q÷Sµ oQµ<À½ü÷ò¯¹ÅFQkÖZ: ÓÖQš™&¶ [F,ÃÖ±•à_Ù7tŠl ×ú\ `´lÆGo.ëJô%šRMiµ¢Ø„Œ½–îÐùl𹣋´ bÐ 1ŠP¤ œvR`_ÀÉö0ýr=œ†˜/éŽã)™B±+êîptdiê»@¡4eÄGSø(Ñû7‡¿*3]øѵ$¾û}B“ðícG'â±Òjm š>ëöHU&›ÑnâæÝÜ#6TÔI~éúmŽ9Ü)'AòYJ¨ÜÃÖÝ€¼gq  ÷ùzØ~'yÎ`Øác}~@¥zP’Ê”"Üõ ·(Íí†j±©ÅØMHxxÃ;Û¯Ñ'`ìXô0ër¸Á|&––ƒ]bV«ëZÊ+ÕYG“ œˆœ„cÈ+0©Þ–@Ü[QQübÇÅ΋‘bW‡³³Ç‰þFü°åNôÔrNÈB,›:U:pã·}|üøaÑ®¢ó²S„*îfàtÓ™uÝËú¸Y&;棯®_ûò£¯/¦Áh7‚ÉZ'¶›í0“ªÚ¶ùpœ>Gð ^#v]A6˜åó-þ¨ß&“´]ÛLš=ƒ›Ê ¸é ¦6ži¾^]ÀÍE6Á³Ï>¾ðÅG¾¥¡Ë‡$™v»Ïè0U·Ë[u èÈU“×⦣Ð;‘ì&íœÂŸ5 ¤7ž ‚ƒw_+ºŒÝXq©è#áås2‘·ÔºÕYŒ„—¼Üt7ÍÇMGzڡ餅Wà{CWñü«x9ÏüSÜ÷nêÂ…h‡ÃeõÇ« *Ò ¶¢£D+ØfGVeMFᕉ`9ØX"¡ •5iÛÖpèuN@ÎÚ7Ä&­AkÑ ;EàÙi!á=fŒx/°ìABý£žnE)ëõ²ŽÝR¹r(·–M¼Í:z£N´†á97¸X7 XØ ce`a-`¹Ú•2½b7{5'\ÁÍ2jȪmA2¹Aë¤X8fÄ"žKNðÚÉ„"À=q½†² 2ÐePj-ÔL ¯¨ARRÂ1+˜Y+èÀn5iH±…W´~"²jWÀº‘Ää #ÜF7WHÊV²"•OØßñ-~áOxñ·xQvȦ»yºTæáÿx†—»t¬a/| ‰ïc·€ìB~½ÃD·«°´kÊ•«H$J}¼“´·×›¾¥ÂŸqÔ© *è6PÈ­rép}âmXÕ%¥…+`¬å¯›Ã¶0„Ó»’#è8ŽŠlj‹Úª®âæ‹•ë7-_h³éÜÃúÀÏú\ýÞ>o_ôLüƒƒãÑ®Žî,…ŽÛÓ…PEÜñD$þ§óên%€=YSz7}”‹u™yÙ¡ºÔy)zZìð8‰7B!ƒS¿á%“„†ÆSDg”F™Eñ4÷£ØØdj€F¤8óúŸÿ !& ßåÿ?x.:_ÿÍ“t)ì”Ô5 üÌ‹"k•¡ÆPÝþZË’ü=±§ð¦Ëxû£½‘“âè{“玚V1`"3húŸñ~¸)=ç^^Ìägfˆš-míäáöÄžèî~Ú/0)ê*q"=Å=ÀÝÁ=ÎÝ·ðÔÒï™Oá“áC§Üno6 ‡Àæ5ø ¤ñ™ÉPº}uÕZ@Åå3°70A‘ä§ïþð5ôÁ 6Ôð¯-ÎV(³,3Wd§TÃo'*ɘÏ{Œ[ÆM_µká×Ì8³;9-I7€+ÿ&|ðg"óœFw·`= ™1I i¼/Å™´˜õ8½àA!½CO17VÚ4ö6dY· hììÂËz«Îª/ãž›‰[¥¨ýõÿ—¾kÓ¸&…×µ% £ ËØ6&üãÌZ7Oõ‡€{-Ú÷Î¥¯Â_÷žuº.g·!¬£õ`ÔXŒÅ[òÊW*h=}äo’xpñGßâ'=áZ)ØÍ uyËÆb+2S s8ÂÀ@¤?ЗºZò5—KÎ1"ãK.gÕ‰´VVC&µzì&$pM¾ƒ[ñ}€œÔñžÂí ˜³Ë{Ú#'O¥™¥¤@›2ˆì¹Q¡ ’ETÉξÔÉþ:z l¬m+7E-QmHk´À« yRWl·ØÈwÞMöÈ$@Øìíøp ¸»5;·–6sÛJ.ýsû‘"¢’¡pÁí;‰Ûˆ¶ýÃGl:Ìúl,=½{Nû»3¹xêEQ*™ì)#òyuÃò«M§™=0ìì8Ú7v &áXùØ[á²ÀœD§Nì:HæoTí«j³)äІTAU¼/ÚŸš\›.¢W@aeCžIiQ€šüÍqÙx)žÖÏ¡•+ÊÖÒ;akX5– a#ÞNÊñÔ ."â_”yPd¬Õ×k·s«ùuV¢­»Š'éOØc_$Ž;Ü.OÖ˜ë]FâR¬­&•´¸fÓfj0'ºHxºÜñ÷°ìÕΠ#„¾'Ž/»1¡°ŽˆÛ3T`ÄŸ}öˆY² „Ç•~5Ñp`ôA’¸VÖÅ(¨• TÈ+4UÒÉÈG«ÞÙz‰‡#]Éѵ[|ü4É!K¬{‹$ÐÕùÔ!™§Z¡ ˆ+»_6¨Æ÷1pqðB×Þ$1ê]h¼q_!ý ?©ÙŒL½ÓÎ"1劄Ç&Ç „Šó[-ŪbM…XWe¨†J´nhýÒ~ Ï ¼‹×¤ðLW«zPJ»·–&1ýPXÈíHá%©ÌCi>þ)%R-ÙÈÍy’˜"£@/1J^ã’bÍ–²M³Ý®Û?ÄDÉè±ÄÉ@_¤Ðᆡuô*Cù"Í›ÿ^Ò|ßU71ÜQ·FÍ@­ºVÛк¶~ä¡e‡‹ÏÓÃ0Nu¡™ÒdfK 𢏠 ïÌ .~‡wúìôißßydý\û½Ë$­-?Ýýß8úà endstream endobj 727 0 obj <> stream xÚ]PÁJÄ0½ç+æ¸"’¦¢(”‚t­ö°*fdoi2­›„4=ôïmÒ²ˆ‡ o&oï ­š}ctúá­ä ÓFyíä%B‹½6„å ´ [—ª„#´:÷&z®^øùõº:<±ìæt¬Ù=(ìVÊqvùÖ7{>‡ÆtŠ‚ÐÏEq ~†Ý“²-^ÅÙ»WèµéawªxšðɹÐÈHY&9¶z’Váè„D/L¤È²Šº. õïïvÝh;ù-<)î"3Ï+üð?&œ­;ªÅÜ—Ørò~ñ“Ž“’FSÚàå~κ¸•Þ/Nr endstream endobj 729 0 obj <> stream xÚe‘LgÇï…ëÝÉZ¦††²í-n™Be?0É” ™ˆ ²ÍPÚÓ6´´´µàøʽlX1a8˜`\–ñÃÅŒÅýå’l‰nfq³ÿà~%ï[ÞÒì=ì{îy¾ïÝçù>Ï –eé å»j*Ÿ)¯~µ~›]WŠBâ?Ñðqüœ?Åà§Þœ‚sRq&›Í0 sƒÝë±q=Œ•öçŒ £eSAieêøm~±)èpÊ^ù¢¤AÏa÷r®ËMÊŠü0×eŸÇµ¢Ó"Ôæó9¿E‘( —'ð:" ßÕæTVvû³ùv{a¹?yð·”ëÌ“¶m‘ íöbi‡RŽ©Ú¡¸eätx¥Z¿Ó#+)÷%Ý^IAA8ÎwøBùþàá²¼-RØ£¸¥ýrH¶Ë.©‚‘ö:|²´´±ü¥W¹ßhSä TíwÉÁºœÔ û˜zÀ€^}@h  €A&-… Ë¼Æ 1·A2Å2ŸZ£é ƤåB|~à dLÅZâ€þôªEhã¹3š‡…QU Z;9ÒL„2RIŽØÉ·jê„õ7¡iã¶µŒ$oþï9ÞÉC”S†jH3„£\«ª*6ÑÔÁè¤ò]ýtÁDÝ¥í0‚Ê\Å+“™æ1MµÁaUëðŽ–_{ûW×Íð-8'P踪¬U\@U[mÔ$¹·H j&üZÎHÔšás!²¼BÖëVUM·žç 7Q 5¸I!"ÆDîÎ#Œ_·z²:™©5‰¨eŽš J¨¾Ê\)‹"ÄEö©ë¸Þ]Ÿþìññð·o^ÝüiéH!,þßN>1Ã;ÃÈ…ö élL¿ }]±Ö‘Š/ÞúÃu;|ÞpéêfÔ1]#H!"i'Ù ¤ ’4ê«/m*yôË…ì)€‹“f‚U'ºÕ>؛ՃÃÖø,wõ‚\ðåʽ/´töT„HÛ9tïŠõÀÁ,8¨j§bä¼ß‚%quœœ%¯ cÜóè˜aqV7äµ¥‹†1q!:'²^"ûÍÍÈ„¾§pצ'wÞ×Þ“×JÞ ôûþÿ>tšÒßÏ‚ýpàä™Ä¡ø ¾Â¡'à/ïÆúfNÌuüx`¬ó›ƒ—KhbB— "i⨪ÑSj]x|ÑmIœOüÝýìêÒ@é"»H;ψã @´_D[SEö+ÝÎ O²¼ŸÝ°-\翾tY¬3" Õñ(kò*[ò:¿»ù ±XëpÛò‡"û!¾Hû.ŸðéáN$‘~:mú±©!£‘>&kñס»ÿ]•' endstream endobj 731 0 obj <> stream xÚÍz”UÚv #UQTÊÆfW«L¨DE   ’ƒä'÷tÎa:ÞÓ9ç‰ IÎ=bŒ`@Ñ5íVWÝÛœb÷ûoõŒ®ûýÿ¿ÿþßwöœïôМ3SU÷¾éyž÷½UF\qQVVvíÌyÏ,zrê=ó§-Xð»Ñà7®ø[¢xã€âMåÅ®àVs½qàS—ÞxA”­¾ákøoóµü÷]økÒ„¡DyYÙÌ}£G}¢¦ªV"Þ ºùÙšõDÕ7/PÔn‰¶àßü§¿àÇë‰[ŒxhÍMøCÙ7ÄøyrbQN\AEbq%1˜¸Š¸šB\C\K\G %hâzB@ #n „Äpâ7Äo‰‰›†`‰›‰[ˆ[‰ÛˆÛ‰ÄÄÄ]ÄHânââ^â>bq?1šø1†KŒ# ƈ‰ÄCÄ$âaâb2ñ(1…xœx‚x’˜JL#ž"ž&¦3ˆgˆ™Ä³Ä,b61‡˜KÌ#æ ˆ…Ä"b1ñ±„XJ,#–+ˆ•Ä*¢‡x‰x•è%Îoç‰ ˆ2lÊe³Ê¾ðRù¾+N  ”|l'ÿL=DI¨   Aª+o¸Ò7øöÁmW ®Ú}õƒWë¯þfÈò!‡®¹ëš¯ÝtðºüÐßÕÓ£é®ë7 ÖN»eØw7ÌÞ.|sxíðï~ó§ß¼qÞ{nšÇæö›·0·ØoùøÖgoí¼õÃÛ´··WÝ~yÄæ_ßñõ²;¿¼«b䜑þ»%wÿÇ=«î¹toý½ÿq_fTù(ë¨ï?9úóß…÷·1ú1'ÇN'~ aü–¯yð« 5¯’•gÊʾ-ÎèìÔAu\2_~tÉñån›Ï -ÐT#Ój׬[³~õzƒQk€j¨ ëbà&30Ó¿x¬û…'ü~¿†‡²Æa}hþ‰ÇçÓLa%´ñ@‚aÿö5°=—Ȇ¢åpþD_DžKå‚j‹¤V@³³šŒ¢Ïº–:—¸–ºV¹WÂUÀDÕ…õYf™t{£0¢}±ñ[ø þçwú¡x)[{m¶Óe· Ö&ÁP•«z¾£¹µ­]ܾ‰±A{imô½”eðò‚ùOøýúì!Ú´ (zŠîtÍòÌöÌr‹*ö¦€+ ³ AÑ{OÀãžNŸÓ} Y‘1ô[ø±ÜÃ6Ú¦ŠÞîšÝ8Û=ÛYo­ÜÛ½æ÷6@ïÅw¾Èß ù»”5#È øå Ø)hR. ‡eehLqŽ`,)U늈6ϾKʹÑg“b­V©ŒjÓì Ҹʸ®sª¢º8.2é &`Ò»ßÀ½çõ?ýóïÉL,”Lj#õì#d X Óñp2¡Š(ØE¤¯Óµ××Ùg¥#® « °“›¬î'-ël ›Ò¡Ü á"4’«à+ùçãýèF2Kz)Á{~{×ôø÷èqú­âo.ÍÈlfyƒjW;–«z«±hŒj»X)E\™dÜdÎåÍø’Ÿ¡êø#T×òEœaàÆñH©b †~ÅŽhÇ!Ø6l¾I<.‹š&ö¼Ôüî‹ ½÷„è¬R”l¼QÛe¿ ÿ¢Åýç¯èÿ;w¼x…znè­ÑÉV÷4+EÆ52 6Oõ{ìÙ¾‡„(ØÚŸr'™/P²°N»JaR õ¶,b(ÌFw!MÝÐ3´µ·±ë£.Z‹rAkÅÎ-­àµ]=)mDÅ®ÍÓ·(}Ìb³Ø-lZu4ÀÂ@ª=j9•ëÉÜ!g4A–L¦<Í8fRÖ Í33Is©Z€LeJcÆë'çr÷TÏïí–îðØ<Ðãô¸].w("Ü{xo7|œ’½ûäãU?ÃÀe¾eÑ•.³›¯7+e7Lfóòy[*àS`FçÄ÷™Ã°{{zàZ(ð)ª€ª}¡Ð¯MH¡ È篯^m8ÕÁÀlc6” ¥Ñh¤P¹@³Óvnù@÷îÖÀªZ.X[]·—]AŠÞ+Õü³ ¸ä;‹v|¶nÞ¼Íúª€*®Šãhg½éD"vp[| tI^{‚©²JİTfkv1ôÙ ¸0äY饮“G{Ë‹7âÒØ5:½‰ôà î6ÈÝ ””—ñ&÷4ä¡ 9h B„c,L*ZÿíoÌEà º"úŽÊßùB~ð”¿àDÿí½åˆÀ hí&Åíú˜ö“qWBîjÈå9öQ¹r£Š¡&‚Á°¾~vÇ 'ßÝö5ü @ÄÌD7qÔ§ê2&‡¿@Ð@iñqüle¡)QQP™®HU¦t>]@ \«TátÚ¥KšµMªf°S›U[Å›U“ªÊ*¢L1„}ÛR©mi{¥£;HAá¬0C „Ui& #Qgbè²§yg“=¿MÖ!ß&7„R‘Dœ…ÍÃò`]D¯ µ3¾=·3õÇ}0…}‘3Z¨3ê*åòJ™«‰ HR0ìŠÀÈêâ2Fµ‡®„+<«À¥hA-À–ɱerô©€{€TèÔ*e\gÑXn©ˆh‰H4É qh O„’ ]TÎrãÐ82©*•Z‚ ’¢~ÌrÄ”£6· a]mýf¥Ö¢²ATEÕqGæ"‰Ð¾Ööcð88&:ú,Sa–×Ãj°µ©~;ã…øãÄŽžUpʆÒzD »@c3i¡ÈyAmd6N°0jŠ©\€ ‘ô”hršx:Ì%ŠBƒJ;TŽ<èJÄ\­…ëAeKMãÃYÚ`[mkó ¬Ñ'Š“p¦ÔX+ï-­]P7¿nþò»–Þµâ.ùÚÚÕšÕ>üv Ä`\dÖéÍùã™}©}é}çШ7Ñè·Ñýá¦p>Ôä‹ã0èL\U1ô‰~|¢ï){²¡GzÑÎ^ú r`ÖänVÍã‡ÜP8'8+¿°}êK]€çà鞎3í…È«ð5øºúÝͧ}~k÷‚®i˜oZ Õ†pï ¢¼˜F×ÿa'¾Àïö»ür§g{¼)_ZÆQ(+ÞŒ+üæ§#{ŽŽ>ÞÓÕý²÷"Rèª;ÎqW1ÁÉ+D“-Z« ªAMJÖ”Ofr Œê}0SM-©H&–÷6ApîýcYxÛÍ>³°ª®ZTU·dP£• Ôfm }J¦­ìN*cNÔÊUæZ£8ò¼‚–†¯ê]ßK‡.£ß öuìÛß_88a7D6²&¥È7%Ò9ÆMÙ½ÖôÛÞÄ „oH]ó0´Âg.™mÛhY‚ë öRÜN“ô—¯¿»|òO/x˜] —„*Ú-&ŸÃËúý!räeI ÕÚ: G ß®ÿ;D¾Œ®a”åµe]³[xÿ¬•¢G Å›1ªžíÆùð:š,àÊfP-V !m‹Z¾î³ï )çieéƒY•_ÎÌ@eÈt$”JêÂö!t‰LÚ25Ìfr 4JÕuk¦ OX<~Ñ“V§ÅÀ¬¦DCžé(P5ú~ ÷=Å»e{z€/®{‘å5úk4 ýU€æ£­” œFÙ”§ƒuÄ´A¬ 8HÒ4@£ÓHiÞÊr9Jé·2yèKÆ£­ù]Áݼ{lÆãLžÿ(» ®Ô·Y¼Æ ôÃ@Àk!¯HÕ×Ë•5wü´è"€œG×}?åkn0³®Óo–ót‹öô ‰…²ãçQ'æÕ|¼­®–`Kë[gÞ¼Aà€CÁBLqPDie®9žÍ¾ýdë,nôÍÜî~nh·=ƒˆ/>CÔ÷“¿ã³Î¯_ü%pS¯¿½ÿ ó<6Ýó40PS=ö0ó\ß«éÁÂÐá·p䆄¤ÅÓ…ŽÆ¤^ú,*/ iÔé Fwwó î!ÈMÇúÒ¥ÄàÊZÎåÏÀ4S~4ó ô4¦¢áápg-Hi‚r†{ƒ¤wI¡+&‚ Î¨±‹)IÔ˜J&¼-83{«­, ÝÿÚ¢^”~mÑkôŸÑ ô‘`ZÝÔ•ðxËŸûÞ äèŠ7ÉžÚ÷d; ¿>|uNÞ¸òîÑŒ‘c1Ž„OYù’<ÉMІn‡ºÁù÷¿Æœ…¯nˆL†6§ÚÀ£“–=ÍLƒÓwkÏãEÑ^ŸzõüÎîSç6͘>yó|f6œ¾Ãtš*4±í=]vïì|y‘EíåÈ•q®†@µ¬1ÊB¿—'h'¤"•´~òû¢3èÏÑcètCšËMåÊïÍ‘wœÓ »r@î`è²A«Óè6B˜úØêg›÷ê9&@yÞìyåmø*Ü7;2Ïevñ’†ošÿÁ‹Oüoà^ýgøŽÙ¨øjIº â!¬Aþ”$*NùOKÑÿa± Ò¢ïú6tJà¢dtìoiK¶§Ú’g:…±@&ˆó%®Å´ †:ƒÎ4aÉÄÅŸ›¾V¨5éŒPU˜ÜM¯®^xîÂâ—„MaCŒW>QÌõiiP˜Ù)œ½kö®9»µ~m@ãà ¹¼ðE¡ì•âýµ]«ÇÕ®ˆiSL#Þj#–Ë™Š†’EPÌr?‘ ûÕ,ܽµ­A‡¹TÓ73è2™Nù³<—F1—^¾žÄ!*éœ>[ŠƒPA`§VIVU¬®­VTÉ«3× ÕF©ʰ˜ÑÄ™ Ãþ^8~áØ«{…8ã0Žåú^áÄcO8ªóë‚jœ=Z VG²Œ!f<³^XØXØxzCÄ1FJư³åH\ü›`VÃ\õ–yf]‰¤!QG.•Ê3Ðo`6Â0}>šhLx’.Ì:/|Ñ0‡…›—Èê”+·®[­Y`‘á°J1öA…W›°4™ ÄsX˜;‚0Oî?z¸½3({ÀOÜ ™ñŒírV QÔËêÓõÍMÙtS^–¯cyµÇ·¥p¢€ÚñWÙþ®ÏºÐ]¸$Šr2$÷K] ¼wW6vÌa®ü+,á_õî+ÄO;`–Ñ_ëÑ|îAnÂýÜŽånùŒ{MÆõp*»¯Óïóúq å%n5¦UƒBª©kM¸æ†NA7ñ%ÿíÑÿ°+áKy’p7<,‰.ܽܲ¾¾œtæ>†«'¥ØFIª!É~sY'ÀÂu0•…GÚè÷Ê›Wb};ë¹ÕsÌ€c1è¡Uh E¾"ÂÂùKWÎ3óôS Êö`©2²øº`ËŽ¥ñeIî.ÃdnäXüsž›‚î6?ùõgÑÍ*¯œÝ}•‰nþÒUOCîÿ 4~_о´óxëÞƒ»Ã7à¾éáÙž­a[‚ÖÆD’E÷RYCDÎàf£Ê"ã5À:iñHaè½(Š%á%ûE”Tm’°´‹ìþƒ<ð`÷£gHtÿY41H8M寱ÜrR®2Iea}Žý¶¼¨CåºBµ›»Ž…÷¯ánäÊt}‹ ½´º0ô½Hpöïëc,­UAÉ”üZZyT‡×:Úêâ dÊåKâ*æóÅ Þ¥²ºT)7×1Ðâä›”9\ÉÐ0ªÔË6€º¨!“Œ{[™©Òn½ Y)” 5L)£°ï‡¡Õ$} Yæ’Õ8o2áp†ù⦕n%—)²^cI’¦ËçEeUðêä»^4üìþ^úÛïJ»Ý\Ú-î•s,Ý—x[ìN%õa)Ë •v£“† &Æý¸ÿ)AngÐÇx‘ùEn£`=”¨dÒºJ}^iA(ÅB¯/ðP9e¦^"QÕNú¬âõ÷>=ô5S|°ƒÊa›J’[Lªì:TY7³?£[3®kÐE7}Òt|ËË~JÒ›q6—ào•¥›ÒÚ ˜¡áä—èJÄrž ¤ÇHÁ)û™‹Ó ]DÉI´$ÌáºÃÂÚ#µGjŽT½(´ù¼ü &ßIäÛóÛòí‘xrG âtJ$|MMb·ŠE*Tøiqc’õ‘Ü&ŒØ(Ý„w”‰ù3i]HÂŽ!éHÿKZŠc“$aJÿŽ¿ôòæ_J†¬¢¤ ›ÑÄ…dÒí‹ÃD?²¼CeŒ1±Rf­ù;²ñýT.NboÕ³ÜdR¦×¨TAMcCOQÓSv¶ ¥»ËÏ–žMñ[Àé!Õjòˆ>Í~Afpâ¥4aYÿ¤ÍY” ]•Ñ­Áªä¼ä¼Ôü@­Ð+ó×´Á6èoõ¦-¦·[Î¥Ïyžˆ3â¼,þ? Š:Š®L$‚91$cç’«¡ÅX=Zú”ø)Ù4«ÞªÇ}±„akÈ’÷J{«?·VC0—”iõrE·xýØþ«ø¢ ‰ºèí_ô¬D£Çž­ÄJ-ÃÐÛûëîóöññgkHlž[åS5ª†??b7hwå~nÐðPMD»ƒoÇ[“q¶m¥ør,9t4I'úë¨/nÛûÊﲌ´mx³[¿®E`5ˆ¿õÛ„òN=¬àç•2•Q*ö"Ï—§Ï <.‡ÊKå‚GŒÓ}Zîër¸.Sp’çw»ÖíØð²ã({0F½èÞ¾=•öµ66‡º§`7xŸ‚G/4¼ O|„»îˆËW pJàzƒ§œ§=§ò\§îãº#¼3q5¡d:ȤÕA [f¡Áä7_¾ÊqË5ûâ]½Sõxw5¤L«§ƒ?qv²c‘Q°œYŸv >·eÕ ¹ÈPëp,ùé×õ%u½…’XS]9ÿ‹Þ#¾S°ÿc>e>jê^˜Ý_ ×ã8óà㎊EŠJëzÛfËr¸ {ñ1 ®t®ð¯Œ>Ú¼ý‚.ÒÍσaਠÉgñ;·ÈpÀb]”=ªšÃêm›ªl9#06)›tù†ˆ5¡€ÀDZúrZ«±bnð<ÆH}TJ²nrŠ3¢´e—m›õÓè¤`F£¼ïš."‚¹ƒ$/ñltW5®Ä‘^ ÖQP µ-Pö%Ιë¶öMÎoâ†b?y|èÅ^ôtïSh7º—žü ýB&¿0ɯh„§¶U¾Fî{Ã0}Ž¢Wóýã>9¼çàÉŒ&*eè„~옌“’NbÛþ<›Æý€3cðˆòКV¿/Øè÷|ÙÎm¹}ððÃÈ—ïe¸'I±¦„hiö+®B€*º(¬.M†NÕŽp5°RŒ­}šQB…S…Ç_F»^.GWîìßüŠîß~üÎw,ì]wfzû¢Ü3‹âëc[Ÿ‡{ÁË/?ßͼ _؟᫱‰Ÿ‡ ÝL°è6*gÀœ^ m5fùúmËãK xø–¥ÅÂûÞ^ò±ìŒZ˜1gliã󊦮uÀBMŸ³bÖ“c:~ߦj”WÙd*†»« mšiîVoª4Z» Ý;»0´¹ ãè#àÇÃ.ëæ‘R,?ä!}3‹#›J°’³ó°66—¤?àE+9,zl 5/y.ßHJ±:b'Râ.—ŽòLÙa0z«i{éóoá‡sY ÊRÜVÝÝÉ @CëyüöÁ·á+Ç[z{\{á>€Þìc9–>ˆÁ“þù~îæHR‚!ƒGŽíàΓP %X9/Z7w6œ ×Ò°daæ:ÿ/YšgŸxïÚ½<¸Ü»<Á IqC¢ÜÆz{õnxÂÎÀ®è™èKá3×+.®®¬ómòoöo l„ëàvÐÞÖ˜O {òèÞ ºÇp'I‰ã.¾´ÞG¿ß¦ãæÈ “E Y¶•ÜÈµŠ¸õ°ÕÜjin8ªÇs“}÷V7‘µF»Æ"1‹„†¥ºeÆ¥–Zs ¬ySg+™ÅR{LÊN/y¬¤Üd}“ÄM™_ :ƒÆ÷>G‹¿á4aÌ4IÄñÜÈd6ȶˆ]*Vƒ‰ú>SѳõtUÁæµð"ÝE9½,Ÿ;„©ÝÉÝ©ÝéN¡Ûï … ˆól—jÆ2Ë%RµY6B>ÉÝ9Ý9ÐO¦b¼åi Lî#UPm·ˆ@uÚš`bd¦ž‹ˆò+š–7­pÙ\VhÅÈm’h%ziÍÜʹµs­F›Z  x½¼6gKðšku?ͧb¼¼ÍðÅôk{±è¤Û¸GPCö1õfÌÔ˜\Ú0‘õ+äÍ?7ݾén+©¶\›0â 6†äÂH›¿%Á“u&¡7¼TJªgîÅËòëmã g"ä(n­aë@;i츭!³ÁH‚¥#}ØÆÛoà^RdÐ)X3åÇ1Âøé¡M"8¹°Qï5@-è×j§{Q&ršÇiPéñgî8áüñóÆÏ?g¬Ð¤3êKCMžAE2™roc¿§ZU^¥BÑ€[B~‹f,ÜòT0ŸSŸ»?ê¾ØýÑéß ýá`&AÊ1Üç¤Jì¨b êCúl:æof†Lľ¼´¶äËjÞ—Á¥hu0:’—ûx«ú»n‰ ÇÞ µ…¥ó23Ô9µXiýõ>ª*iK3h|Éå%2I¤›°×øÉ–Ú ~uÐóäh3h¡jBj¯ö8W~‚p‚+Gã¹/„U£2ƒïŽÄb,Œ«ZŒ‰[Q5G Ú;P-Àù5ÄpÏú÷ƒ_™ äMP^ºFð×Ü$Jc3â%½¹>Õ*%E Ð2#N6Qè, a؆apiÕ®pËn|IZ— M)³ˆx4~M̆çJÑ­²2ä+ž(íõ*…Q¤«×‰t2C Ô2*N3 „¼;’ø“p»]~X´GŒAó;ë…ᆈ!ÊÏ€òqÆ´>·."¬ŠáOTëÕ„4Ø Q½eÖ 6ƒšz\ÛÌ sdS<’ÆîÐ'ä.À] Í}ÓÄ!–z+^$Å4±x• åJ»pCÛõºbË‘ÜÓuÜ1Ÿ®~›Ý ÷øžOú<¿6ˆ*jɶ9Z ˆð³¹ë¦L9½ k©¬s⥱Öñô,ÿ8åô(/ØD>÷yFMZ•Ë¥R9º¡Ûáh&÷;Á8jꄆµžIž`œìþ4³××ÑØáîÀ¶˜{ÐÛ=ˆ*”a-è<[^’‚I ‹x“/‘bBTGÅnÉ!p•!òÇiˆâ®a±Š•WT´˜j•¹ÌxÜêu¸aSDõ)¦8€û^`~|Ñ”G ˜¶úÝ3, 9C0C¥ žyéè鋯LÃý .CËÏz»ç?Šƒþ%;§ä9& SO¼=É3›ÙBr¤aÜ]#7ð#® 1L<•í8ìÃRÆANêÑ0UÊ *EÅÍ&ø œö–ýCÐH]ìyïLæa¦´ØÂ:[ÀÝÙ‹ÜX ŸxöOU¶lH¯ÁtýÃ\97ð–w¹+Ňù;€’¢Õõa}޹€±÷úˆ„]RŒ“}¨Ž™DÊÕF©"¬K³ÜRî;ltx`#8òÂÅ“ÇÌc ÎÁkä¾2¤L_ðÄÓÌ#põ ½%Û™SH€çëÐB:LæcfžRœY³oóöåü˜»úþÜ`nØO÷¡¡l,d· „#I˜i¥_ÁTC¨Ð+¤°ÉçN«ßÎS‚ôÙý…÷`Ü·&<Çet\FËЙÂÇßaY„¦cÑ‚¦ŸÊë ƒ-RìpVX¶ )(mÖwÔwˆð?¡ÅkõaT4Ž„Ã/F£±LéÅ€~Íz3ìƨ„ánü¹>eò±*¤N³ûInwï@ô UjÏý gŠV3O’*™YŒs=Íþïã>î&JnT«ùj1G¢/I,-2YM žåèb’l–óÁKª$¶:Ütò#æÔ[jCt¡kùúë¿o´*%?Ïu¥Ù:F‡€§ ýA;wæç¶è¯ùó‘Òdè+2ƒµgR³ýÅäûðL¼ÑÉØle9¹ºt¨¡•b²}'ùoÝ£¡ºŸL`6À5y%îOô;7'+`ܪ’HúÁpaÏßëð-ô`q¨ N5©ý2æ!lœAV²€~å(wæ9’ÞûoªÎ~úë~ å^+GöâL7X9õÈ ZÊ{Û;·¢k ‘èªèÙ?AD€ÕðÃcX£âßrBNÁ¿Î׈eÀ;ݼÏ8É ÇÆ?þÈÂ1±òߪwÞÆeWW@÷c’ïZð³µÎ³ô±µÃ!*ÇO£míçG/·akßû¿X»ü§rÀÉ=óÿAüüÎFÐ;…²Î^”<[^'\õBªTˆ!}‹û÷B,ž";pÃ/Ó±¢æ¥_Cå®éåØ ƒFÝÎ ¾ù}n ºŠ}¾”Ïí\Ý)S¼ôþÅÂégf1³©)O=û,ó0\öŽñí_pÇ¿ÍzŠ×¤5è'cïÀ´9QÍp‰u»DÊ›O7}À™€%séÔ"‚a†nkÄÒ‹?>^€ƒ¥æ¡=åmæ'ç¸Ëè¯1èòÂaTŽ®bðõX¸$1ESc*™;>+°• ÙRýÿÙhèLÌoP¤@'Ð;UŒ‡!øøÛ_±=Á½5~^x/°Ù»Í¾U€Þî«s¨±„ks'“ì‡TVT0jh4™5ÉžM<Ì¢Q,\¼·b¿ê­Zô`>žâ8TŒƒ\—g$']iÈ9UÔX v,\…‹;mšÉCo¶1QJP,˜®Á¢úî^4£ÊÝX8Œ!ëuz™Œ-ósNAÎ ŽAן{÷Ð,›•^…Ø 3 ÔòUÒs•Ï`§’YwKé]òSŸ’|ƒ$W5Ô0C,¯Îæë‘ŸGâR<øGž‰ «]5‰úæõGà~¸?¼½Ðr…WÕʼGf¾\Z”³KQ/ÿ –ú@Ö®f¦ð0V« i2ì1n- ¥‰N!Ù´V·-¹É% Ããå¨&c´Ž™ˆ¥›A¦ä_&’ʾÀK7Öëýâ¸[„‘µñµáµ±ÍAK+Ü ÃMçÚ.¶\l¿è y‚®è("¤t!Ë]MJqƒ[žµ“Á½…¢·¶“üIMRÙ_!Â3пXiÖ"h¾ÀIÂ¥ÍφW7Å­Mð0´÷G/Ä.D/¸‚öPœ€˜3rÆ€‹¢3UHÂÐ'úí.R¡lðg¡l7ù×eß«ØgØ3ÜØfÎkb"8| 4‹ÄÆJc•©Ò¢lP8‹P—°f$™UúìH’Îðo/ñ*PÍŸkŸà%_ÌŽ¾¹w6øª4ôºÎvF0¸äÈDÒÝÁZ³J·‚ÛKC¦Òñ„D§Å^;ÁS ÓFŽäº8u lŜȔN?î*…¶d¡X«ãRõ¸±crd F燪vŒÛùÀöqî†F#4+eS™äf•r…üé°Ÿ!ËÀìäÈ‘·9R£Q™`=ùÕM¸Ë#SÉÆVöÒÙ7£‚*‹MrIêÛoÿüå·ßF£Q/li®3î+R¬2Õ°‹)1¾5õ·10È¿jÂбt¬_°¨ÑiÁÁæØx »)Xèi,4f\Íf¸äÅ.#'Ÿ60ïÜT Îyư؊Ûa™V£¬O›ãl’ì´uã#î· €GÝù}ý—˜›3Áp2aŒHY%¹¸q„/a¸¥`gñEéþ±Gßò—f$¶)–ž¼êj½ŽÂ¹b‚FP–çw‡Â®8¸4™—_<èätI1óŸ¬Ø… ‚•uê-p)à°³gYf[¤ö:/Üêóö“"_ó~ |¶âôËÁã&Ó‘h"/óªX¹Þ=? ê°0uG}7"?c e˜‚TAMšMÇ-g!|pØŠõ¾çNÈÀ¢ vàìš‚¦‹‚–©+àf@ëÕQe‚i†‰Ã»¼ÀËŸ…/ê†àà[Çw²ô”¸:¦bj¡jé+°’´~)Üøâ|,ߦð¯7Ya¿4AËdÿsÇUÅ ­CkÔYD:‘^¤«P 5 Z3Tà&Gšb¢0Žùš#-áæp:Ð ©IàjÄ–Õþ ðÅ÷"%ûhî ÜàâdAƒÃb5[EJáFÑcë¡(âÒ$“†‡ö´e31¡ÛåvcQì$= “ö„V˜Q§ÕuÈäY©xŽ=®*¦Õ%Dɺ„Þ¯ kp¤¹ŸGt¥HŸ@ƒg¼Òÿ'úâæâM‚• O.„u@UÅúƒ6Øþâv¾ãh‡‰…G!xáÝÓ­qM\ÅVê…[¡ªSú** Jà߇-|Fÿûç-…ÿÅÔ„ˆ§ ü=?é¿ýû÷ËÝVdp¦™-fk­B(V‰Õb•ÚPo䧦qI’ Ã` èû¨çïù°u~Ë6Éþµ9þ ‹Ó,+ ¨Â€þk]²~N³¿ýœf}3‡õØý 'ÿ½ƒeþ«¥ßjÿ¶– -+Nù/mÍ*>@SB$'óRÌ•å¡G¯ä»êJçUƒÿtåÑÁÌÜ­âõrë˜ÿ¸þˆÀˆ¨ endstream endobj 733 0 obj <> stream xÚÕxyXS׺÷ÈÞ˱Ê6Ûº£UëpœZikõž:£¨u˜Ä€€È<‡9@&’7$ažÂ@¢ETêPç¡j-µzµ­ÖžÖÖöZ»b·÷ž»‚è×Û{Î}Î÷Ç=ßóA²vÖZ¿wú½¿7jÀJ  _¸l½ïbß?mðZäóæ[³f9ÿçéx•r¼æâãê9€Oä/¿FWýö¦ÛŠLAVÊþ’sÍî\§’e¬—;å* 7k֌ًc£ã’“BÆ~š3vQlTÈØ¥©I¡1!¡!xHN5\0]0kàbj©`9µŠZ#X/ØLÑ;QƒR©têõ¥Ë}ê/‚¨GÔcrÝNJB £^¢FPîK¤„Ô(êeʃM½BM Þ &QS¨éÔ,êMj6åI½K-¢SK¨¥”µŒZN­ VRP«©5ÔZjµžÚ@m¤6Q›©-”/åOÙ©ÓÔrãEêu™ºJõR7©÷\(åB•f þ,ˆrquñv9á*u½9Àâ¶Ôí4]̬F®(]8bà‚7-ôÓà³Cæy84~èÃa†—ÐKIÃåÃo(pÛ½ÊîùæÈ*¡\xsÔªQÇ^~¹×ã½Ñ¯þù•/_U½6ëµ3cf¹Ë5û«@5 ?Áð&‰»Ä=¿w.lo‰#AŸ´žîé.0š`BZÆ”g–qj: ·IÓ"Ó7ÀF´¹ÁûìÆöÎ}QÍÁûm ¤Ê236ú÷rìÝçÛE/¶?Cåx)oÂÜUØ3Âö½sa¿Å/9®aiäêÍ~ eždHÃÈÌy&NGWBûâÊÖƒÇáú(þüJq\xhpKô>޽VU¦²²>XÿØ^bÊóí"önÿöaxé}A1®ÎÄ=÷rNTZm ž ÜÆ\ñ$Ë¥EìOŸY¯õÀ—SüðÖYÜ\˜²#g R2a ÑzbC„î…ï1mwJÜñ%<ˆwÁ.ìO-ø-!ÞÍÓ¼@Œ{íS1ýÀ>ÕáM—É ²¸: d)ÒLÿ<–Íöò\>Ûû¥B¥ éÜe’ QãOÜøO˜þ|Û‹¶ý„ÝZ%îÇ0»  Çbö7<ð¡°£©¾Ó–з]“¾[ùµ•Òx~õžGO¼Î#ûkä„Ä <…©“ïÒÔÁ×ðyËÉ«…f£ ,ÈȨ TäAžæÂlËä—ì÷=ŸrûŒŸc~eÚM~¨ÈÖÅ¥o@Zþac8×zçsè†Îpƒ>M› ©háêPI|Zb”4ÐÛÉ·¾=ÃkIq´“ð ÂÃH$×ãAlïwOÞFðàf§ öj?Ú úFh„×Ð<â_ãð"àýP‚iûÑŽZkWÊ@Tk«P-wJ¹VZUVQV‰]°‡‡Åb2C9jœÈ'ÐìÁmÚmºmú4ˆÐ©ë_¸Ìq¯Ý½ë ¿+¸üŠïMö.^†o ÃÓÂÓâ£c¤¡ŠxÁÏ«1ÃÑ?ã1ûðd\ˆ:¹±3£(Í”^Døãã]]]p=š¼üÄIëyšƒ¥ö'£‘¿BÈÞ£ÆF8n;ÔÕbÐ F(“˜¿'ioòž¤öÔŽã6ä97Ñ‹[ ‹¬Òû¨Öá.d{5z ¿èâ­²®3Wcßå`kRxpL¾Z•¯Ò¨@¥Ï×¥y$–&–$–FVT)ö?7¯8fÃÿ¾›Ä_øÉËMx$ûÀ!Äg…ÚhxSÁâÇŽÎUçir!’L‘åVsM)ÓÖdkØÎ„Ä©I¾ÌЗôW­9s©ö[¸ðØ(¼‰ßÆÍ‡…ñ+ûK\X^ "^x÷<œ;‡›ª! ~]À(½cæÍƒ(H(–4¤×ƒMÓ¤qVzªaà´ñ‹»¨˜>¶¸ò`K4„@í:íÏû“v­Äý Ç^v,}²Fø¶l~Æ¿™+·ò /Ï&ÏWôÎÁƒ#0ø5ÀSošñ TÀ˜Õ¦l.ÎV¨²Er&2e ?fÀä½wãŽ).ÃÇp¦àRÓ‰ƒ_þ¸ç/€ÀÝ·kÆêÓ<ô9ze ]j4‰ØÝXÊXÔ)—Ñ;$’œµF­Î䘕ÆÍíkkV’Ä¿,È5N_õþ#ÂAûí¸Ü. :ÀõóÉûBñã§÷ljŸ¸1v\G:gµ|‰ ÿVoÕ BЯãýLj퇔¥ ià, ;nçÒ¨I”¦H·ç‡ÚˆËñ$ú¸¨Ø¿´z‡1ȸÙéœë6ìÉr_“óÕwžmÿÝ•ÆÎÆMG˜ð¡²t£!õwçO÷Ï^Ãùà&<”œ{,¬#ç??÷¯®±ÉÑí¸²ÿè}æ,vžý`œ?°Ãñ þ೿ÛùâÇ|%W>¶;I³þØ-Ò Øÿg›ã$iSN/ä å‡ðoïx€GÛir㪽³s:Ÿ ß-8ƒ_wxãq®Ž $ä‹äË2׈§/ónÀ /;?ð‡U‚®§Þ ú}ýÅ3×.µ?"©õÄ;›/.»Í»vŽ9(œAá}Ÿj I‡/„;…ØíÊ…=G«ŽÂGð‘dOðoó xÆçðWFJÂrÀPÉÌÊðdDvh ¹HmÚD|QÖ‰{ú|Áâ º?ø¢ {0s–ƒ˜5–ë+ Hût?Í1 ~-ÿ½÷àÌ!8«¶ÕÅiC`§³y‚Ÿôޤ@M°³ó»z}/mK±ãÝ6Üawï»jIþÌßÝuŸÜµ»0WÏ„¾#ZÎÀŠŠ•xBb»K5¥êRè‚ëŠ>C…L‘ÒœÎÅ1T–&MIËL„9P€§ä×){rl÷f™Ò-éúcyŸÙu¾ záÚúcÞhyãbÝb@3øBÜñ s.h:‚êãô¡°‚”[ƒâƒ|Õ}2%®÷ßH…2{gîák÷\q‰ÖFÅæÌíÛw†§ù‚/Ì:óþ½„Μ}ŠÎÜ¥·$0½·,t÷'Ķ$ÌäÛ<Š”)—Kç(¹">œÑ*ôª52ÐPÝS¡GZÚæ\³ª'æLöi8—«÷÷´ì.ë&œÛË»Ö/-óˆ-ŒÑÇ—„WĶ©÷’Ò¿yÍzšûn{—òH—£•—2Óņ"ÞNxÁ,å²A™———ï¡R©d @šdŠI¥l_kÙІu“JRžŒµ êœ~ÿœ)Ü +Ž÷(‰,*¼ÄϼÈÏ"kQ¢1Þ ÈD[ÁXWXõ^s¯½W5êÊl†Z}-Ô²óR1ÓG¡@ŠÔ äɲUy+ù)^üäø©|¤#Çã¾3ý]^?|NisŒ±¹Ûð€E„¤ßÆ"Aæ:fåUolÐïtêpôTQ$Ãã}bxö-< ùsQ}Tºµ¢[Ÿ¥Ê*̪Š8ßè4]b°—(M"9¬Û©S×"œ@È6áà MA5[[ oõ®ã™|OÄUÆÙ”¨niªÝ-‚*YU†áx/áLf™ÏV§~ßÐÜ-‚¯57kK X×~‚÷•6¬’=ÂEx˜k»Ó] ‘ÓZ3 ºje´èécf¿¶ûxÏvkÒE…ý+~ÿ ?R´R·F"ÜÅð¯)Ücžj…ùÁù!±‰1¡™„õ¶-hï6¶]Û}˜4{ºhìQ<ñ È42ç`óèÎ)e‡ãåÝ‚Ýx¨+þx*;[– D»Ô¤´*Pݶ«Áö?B,Z k²üÂ6Å{¬«\½?¨ËÿɸŸZ[/è MÅ`FEyº˜ž9 ¶–8€fB›·Vø’“ÜùÁïóÓø¡·Æá‰¢àp¹½ù`!Ó]àfgœFåJ’[Dާ}áSžê…‡8a¸x¤£®Âj²Â~ØŸÚaP”ZâsÂqD¯ÆûÄúÁb>©¸ ¶@‘ÆâÄ'˜¹HÙ74ã?Û-NMà B|†.-0•üêóˆ÷­‡uᛃâ—ÁrÄÇfã7¸Ïà_Û›{uz­ È’WÍ%ƒ&Išì›âþà_`OîTw5¸Ñtï>wl+ W9•¾.Ë–---„-#Z¿asÇn?Lyt#öìæX'\(þ”ÿÍKŒKìžø7"×ùÁvš½eš2(G=%7ïp…Dœj2³ò² …ìÚјÜÒÒX×vbƒÕ‡[JŽŸ› ß/nø€VüÖýë-8Ãf”¸ÿ/üÕx‹}ˆ Csý“`3g$ÿ=ž^‰BÉ£«ßàâ!NRj¥®‹kXtÕ£Jò,ùDŸ«ê5¨Œ¾ƒ©<@»3mñ M%{Ìù2µ d£«2kê*ªj9hLlˆÓ£§àÓv8Û' ¾~›ÖuìV«µq¯¾ÐW´Lš+Í“ú¯ôðóö[áëíãå¡Ës!e«Ìœc$]ýÈô© PúFDDÅæ‘öL[mõ íÝç»Ï:ô²‡±ÀHš%*–H}§îËÉ}c,^+àñd nu6ìúôï*Æ¿ÚyW2ºÚ~^#ÌPgI³òv&ÍÛ9(¯(ÎÄ•A5™Œ †C[áDÍ)-‘œók„ü¾o ž+"ù½øÿåSü?øGÅÿ/ÿ]üóÓq™ðpé‘ÚC•µæêR°¢–øæ(¢ÓÓ22Éѱ±Qq±±ª|…R­tf¬$£0ç¿*þÿÄP3nZ£-Æ{׫Sï-²(­MüLüÆön¿7çÕË‘ŸüÞ ÿ›]ÿG úîodq îJrcoÔÔÔ—·8¿µ= Ýa=@†¥£z뇶¶Ä:DIZ:¿Ø>àß¹ÖCŒßÎðþy‹÷ksÜxÖ*ß!$ˆSF­a:NæùNSGŠ¢iRi«AÌzì› ?ŸZ±µ1Ç N)ûtZ-è%×Í%.Sž•°5ѼÁo¯ä’¼Qc+\/$KY^ÌZÏf:Y·Ÿk1Ô×C3ºÍ,ô!óÔˆ%¼'oÙÿåVXu^­¬Vý‡¹‡Ô?qôá#q¾ðH顺õæªeïN–¤©TJ•¦Oø«ô*]þŠÿ©@÷âRaU²Ef1btœaQ=Kkžçö\h;þ£oˆÿßæ‡Ëk~°ü»„ðwÙà¹íÒÿ5ú!>õ³˜_½qŽ5ûàŸ{­c^_߬­­-muÒ\tí8ö7ëøæ–ÿRÇ9ÅŽµf¼Mg-¡yÿ†äZ4ÈÀÂ!ƒ´C?tx0÷î #ù)øëÈÿÖé¶T endstream endobj 735 0 obj <> stream xÚcd`aa`ddä r õÕvö 2ñÍÊ÷ɰ¬üÙÄúCšá‡ ãY¦rÌ?ÄYdž ‚ÈGü òžˆTŒ¦B ,ŒŒ%íÆzFÎù•E™é% Éš †––æ: F– ޹©E™É‰y ¾‰%©¹‰%@NŽBp~rfjI¥‚†MFII•¾~yy¹^bn±^~Qº¦ŽByfI†BPjqjQYjŠ‚[~^‰‚_bnªÈÍz Â9?· ´$µHÁ7?%µ(è$FC ã„˜Y¼tðýøÞ½éÇüMÛç3~_úùûïŸü¢+Û»så<½U»Ó»9RØ—vŸí>¾œãO/{VwŠ\B Û¡þ›Ý‡ßì>Ä£²)]¥{Æy¾²?œg}ÏŸ:yÛïÄi웸îq¯žÄÃso¯‹ù|Î&"dir} endstream endobj 737 0 obj <> stream xÚcd`aa`ddä prÒvöõõ4 ØNûÝ'Ãrógëi†2Œ?d™~È1ÿg‘{èÅòŸ‡I–á½ ˆ|Ã"_€Hu Áx@ˆ…‘‘£´ªÓÀÀXÏÀÀÈ9¿ ²(3=£DA#YSÁÐÒÒ\GÁÈÀÀRÁ17µ(391OÁ7±$#57±ÈÉQÎOÎL-©TаÉ())°Ò×///×KÌ-ÖË/J·ÓÔQ(Ï,ÉPJ-N-*KMQpËÏ+QðKÌMU»]L:çç”–¤)øæ§¤åÅ$ü˜YÎüèàû9µqõñÕŒ?–Ýdþ¾óû;Ѷë®óR»S» K*³‹’êúÛ9¦´O‘›ÝÝ3iÂìù·¯^Ýͱ¾;©Q¾»º1¹%¿¥ 1©­´¥¨µ°¥¨%¿>²»•£tNÃ\¹¹Ýs¦OžÕ;qʺ ó>•˜´´îÄESÖ®;°aÃüyÛVìæ8ÝQ!ß P×ZÕRÝ]ű3ýЇ½ß%övM¯”«íîjk­¨K Œèæ¨hžµ@¾{þ¤9SÌÚ´ã;k÷aŽ»¾kíå"»½«½m8øÊüpž:mÚ÷‚l¿¦²Ëq±˜ÏçáœÄÃÕÃýŽë÷º~žïEê¹³ endstream endobj 738 0 obj <> stream xÚ]PÁjÃ0 ½û+tì(ÃI c PšŽ9=ìèØJfXlã8‡üýj7ô°ƒzzOÒ­Úº5:ýôVr 0j£<.võaÀI’ ´ {•²œ…#´º׉žû®«ÏÇê¿ß_o}“¿ÂñÁè7‡Pìu[óm 8·f´À _÷Kð>”ð%bW¯Ðk3ÁáVñ„ðÕ¹_œÑÈHY¦qùã$i.NHôÂLHX–•Àš¦$hÔ¿Þ®Fù#> stream xÚcd`aa`ddäõñósñÖvö Ž´ Øæþó—aYøs>ëY†rŒ?ä™~(0ÿg‘{èÅòŸ‡I–¨JH2üá‘ß@¤:Hxƒ##¯HcÛÔ‚¢ÌÜÔÔœÔÜÔ¼c=#çü‚Ê¢ÌôŒdMCKKs#KÇÜÔ¢ÌäÄ<ßÄ’ŒÔÜÄ 'G!8?93µ¤RAÃ&£¤¤ÀJ_¿¼¼\/1·X/¿(ÝNSG¡<³$C!(µ8µ¨,5EÁ-?¯DÁ/17Uì=0霟[PZ’Z¤à›Ÿ’Z”t"“ƒjgì``fddq[ù£ƒïû–- ~Îg\õ½ùûÜy¢fôOêžÊ±&wa¾\rwCF{íoá?ÎíõÝÝ]ÝM;§vÌmîíîíîëžØ=ißÏïß;AˆñÉ.æ7¿—‹Î^ؽhQiwµüŸ ¶ßå¿s|ý®ÓÍñÝ’ .ñÛ†í·ÇoÕß ¿~;Wû-ÿÝ]þ» ’¼%Ûoîß_ë¾Ësð/þi¿€í·Ütv9.æiªÿy8'ñpõðpïäÚɽs.ó~(w>¯Z endstream endobj 742 0 obj <> stream xÚ…T{LSg¿·-·WÅ¢\ë–¨÷ÖL‡C@€•—ónF÷@+t´ÒR¸”– Õù`>N÷PѬ€RäQc2Ac£Ñ¨·h18]‚YÜâÄÌmY¾;?—ì–¢`ücÉ͹9ßwî9¿ó;¿sIB¡ H’T½»tùòµ+ÃSÓÓ£"}'ó÷`‡ØúϪq !N%Åi2‘•‹¯)¦8Q²Ä_A>Û?Ág§K†z/˜P$m-…Èȹ‘‘щæ|;oÈÑ[4aY³4Q±± fk¢##c5KM:Þ¥ÍÓ¤j-zIk‘£&ÍœeÐYìš°Ez‹%?nΛ͡5F˜ùœøY³56ƒE¯Y«+ÔñV]¶&ÅœgѬ֚t?èÿ+ÑlÊ/²èxMª9[ÇçIh•Z"Kn$ó ž°ÅØ"‰H&RˆeD*±šxŸH#2ˆuÄb¼Œ qˆø•ü€<)SË2dÿÊyùmE´Âª*Ò%ü._ôn@©^Æ*ÊZÔ5Ƴû¿ÚSÍM<”rZØñÕ®/hdTÞÌøÏØ &wI-[žrgr:«?w9¿†r oŸ7&qL'NÞ‹ƒ6@8rmÅ,cmƒîƒÍô§hµz,`ͶçlÍ„]@§nn=ÉA×½6ò%-Bw²×‹ äâ'ˆT{ò Œ-ûvÛʶ´è·{~9ëAJ4Å}vrNý1G-ÐµîªÆÞ7 /Yƒ§ÎÅCP0âZWqþ&o(@>áE¼L)zzNŽv¶—ª¬“z,—) šËت„£©\ÜM1][7Wn“á³1ƒ'ƒV€º4Q Ñ*ïà}9: Rj¤¢*ê ©¹J8¬ê¤~ºMìžòìo«Wz®.„’…ñÏc×ÍTµUÜÜJ•€ÉX/y¨–ª¨—¾/JI%D‡”¿Ø+GçÄëê!J$^p‚&?s`õ(ÿî¨ò“)?Ät!øÂ%4Î÷0}ˆCÔûšl`:×_× '8ܭ̱JI¤$ý~VÈáÐ2%Ó5ÐÑÙqܵu‹Êb~8èÇ—‚þ7ä3e5 *š5ÁæmæìÒVóÑ-@3}¹`rÑ*Ì hŽOÖÁ!Yô¡8T¥¾rùµ[—æ…'¯H~Gß–Å¡Šíé-@#rð7Ä  èÇÓ¹!Ón0ÒÌ`ã>—î%Í<ólÅÎ\ÊåCÄKìl!½åE)÷™3ˆ—âá•Gh<ë,¬²Õ]S]ÙP½ýT ·VÚÓWÑÌV¥2ª”—¨«…J®wÇxÈ52@,§|â»!üYMúŠDKcä}"‰5¥˜»Ô1¨1èÁjccçè¢ï¥ÂoäôÞê;=pÜú-û­[Ùý©kwX€Ž‡óuëÔ=DXº—)FO[ÔÎ\7zô&I’xu“ s&*n{î"ø¦…EÇ•¯F”SáÞÂ^–)Ãmžaµ“ ¢AŽÚ¯F h§\ Ï{ãç ¸¥¡‹ŸÔ?ÿ_ùn †%ÑN¡±8 OÀó²FNÑ?’¹{(h˜‹†iî^ÔÈ¢TŸËÑâ#¶T c½ã„À@oàxv¬Ân#ÖLú:êèø endstream endobj 744 0 obj <> stream xÚµy pTU¾÷ Iî=,Fɵ5¸Ü‹ 8ã‚  ŒÈ‚aƒÈ.‚¬$½ïÝé%Kÿ“ô’Þ“@ "0¬aŽˆÐˆ¨3ÏÑg´\æ´ïò¾yçvÀ™zõ¾©©¯ê«¤ºRɽçœÿö[Nr¨¼<*''çžEK¦Í]¸ì‰—f””Œ|näHñw£3R™‡údÎÍÜŸ'¬„‡ò_ýù³ü‡)*‡H>©ÈÝâ§ýñó7äcÈW…TnNN7|äS£¦•m-WÈ_—ž[¶îué¶Á%šò×UÒMä7ÿã/d¹þ¿Éy²`|Ÿ)yÅÔœ¼E¹K©åÔJjÍ ŠêKõ£î¢ ¨»©{¨T!ÅR÷Rê>ê~ªˆD=@=H=LqO ¡~E ¥†QRS駨ÔHêij5šz–C£ÆS©©Ô4j:õ5ƒšI½HS³¨ÙÔj.5šO- R‹¨—¨j1õ2µ„z…ZJ-#§˜Ò‡Ê¡úÜɡržÏYŸs¾Ï¼>GsŸÎMçMÊ»œ¿*¿‡Þ@Ï<ÏìAE¨®ï´¾—û-êw¢¿¹ÿ‡¦øÏ»ö”½[zOÁ=åïx¹px¡ƒ}ˆ ß[po»d€Ä{_Çý#ïo+>ˆTüÀ=øøéA÷Cªø±‡ÝÿÎÉÌ ¾úÈô‚yÊŸ#ª<9›üó,Éæªù ¶¬ýüÆa0 „Á)áœ7&dŠiã€"Á`31ÇàûÕ{%ø>Àw¾û4&\ö{š¼B½_ËÕùr qé°*®*Ä;Óì{8¬®¯­4€ô~‹ß†©éo X  w™j¨ÔÛ@tAC˜‹@³?Ø„ïú<…9À¿üÈ‹øa¹‰Ø½ú&mP ˆ}¯–lR ¨@è«Ä1Â2üX.îtJŒ5²uZCµ¶   è"tùÒ×n=¹x­të¦ íe{øFh¬k¨CxNªNUÈšq.®“èj¬z0 uÀ˜äðN:FxYB:'šhv²,uV°ƒÝa'Ñ%”øÞì®÷æb7–HJmRlB›ÚJßäéîÖt¡®Šk¹_Ávg&“,¨jìj«n†ðè4aùT®–¯V­Z3ºÈ¦7jA‡4}”«§“uî„'ü¼ìxÉŸðÒ¦¤/éOºMahFl<¬i9¶»j³90÷dï:T…‡Óxwš=„?çJ„aº… „M Zï|áâ”p Οí:ßu>pÞƒ·ÍoËN"özéåYéçHJUAµ£ >–¸™À÷þq'yÀëôÔyáœ]¸Ù< Û 8\\üìä%“ø °& ï¨vÙÉ´B£/ÔªŠKË•ª­¿ÆÔ’ÏÂÞÇ’¿ýökáÖÀóz-OÔ‘ÂcR9Çnâèµ\\ˆÿ$ñ}s÷ÇyHu³Ùn©±@%’Æ•­mñhljÉùœî‚'o\¹¡z=¬GBáÂl<çüõ Ü—ƒÆ}-ä»…^ ¯h^Û€<‚DrýÒþKéÓÅÓ¦/zq7Ö¼c8œ ¸Hs»µŽFTФ̜L5“yx^À~™ƒì¢+¶Tl“o/,Â>Š*|Šv2î-õ¾($IÛzðœ÷ñT< ‚^ˆ¡ˆ1¨â„Ót2œì^%@Xh³]#ãKEse,q·sbìÕ)¼$Uxèêü4¤ç§Ùïñl|SR,ö*Œúaê÷ÕÈKÿ„ó¯â<nÎ<4};b¿9¹ø\¿ yû'‰r„ÿÒf¤VŸÓ öûYÂX‰—I_?ü.w .¼œŒ,Ìԉˋ¹™0ûMãUò~¿!ñ0©ë'¹Ó*õ,@Vfö¤Í‹¹— ¸Óz6[•1ba ^ÃÑ›“>`Ì Á-û¨yÂ]ØP%­^×äÁÓèêPD¤åjeÙsŸÊÏág¿#õ.,Ç/ s„Ü¡£…~ ¹1犜„ã‘ý{°0;Í`F3¦¯™óÂÜ3Ÿp¦áÊÛg?‚èš^Zo¯# a;3õØÎLû°mNý+PÿX™±’…ÇoKuÚ~¨ý‹“E1< „¼1/ÄQØÐ¬áªhSm¥µÒ¾hCÑè—Ÿ-ý²Ñb´‚Õ2õÛN(Û5—Ö¼÷ê¥5g6ùì>«ßèH 9ÌCBéÖ7ÍÙW´h÷ÂÝ‹öê½:¿ÎMèjYê‹,au¿›yF¢­5ÉRš >Á5ˆ„F`õït<ˆ–Öù4õHøœfã•PYW V°:lT%<)ÑWªMª°1ÉgòèxÜÛBH®2¤­G·Šè¨ÎRwop™~øœdÕ¶Uå«ÊF/.R™”F•QoQY@‰´A]„k ýõ>¯ñÌž¢/º??õEwÀð@˜UmÇ’xYdæ[3Ì|kÑž¢ÊÆJ©UÑ£N˃"n ™ßYWtfãÙgÖ‡,ͦf­ž•J<:•FâÛûû‰¬u6@ m¥\4·ð¥Ùr‚ŽF@‰fœg÷Æ Agù,òÕçãA´¯&>’P4ysÌ`‰GÙl‰G¤|òê_é–`S"©õ)xI‰j›«š«›í¶v{G1>\d:éøðe@z˜u¶ÒõÂS„‘[„Õº*]­¥0Jr 7yNùæv ®|‚¶¸<…_Iþ!åé%WÙÿ@ý–b+#Ó›•Ê ©…Çz;´Õµú.¶LÁ»ð~ÉûÓš›9Óqt\E_?wáINPÒrò¼,b‰ó?ÜRHp9–0ì—Ž.%„»^¾y«z›¶6ú56ü ÎcØÌ›WŒxبÚ\ªÞ¦Éþ‘Lá§œ}×r3OfÒ’më#«ëÉ| O?+L†ñ <ü±0?iGú/»„ó&ÿ:4”WÉ­ ¾¶«/‡5e{_ïÖ¥ 'ý§Û·ýîÈ‘3€|ôEû›%þù®-{ÐŽÆH”Ç1-&P`­¨Tõj€ÌÁTáGiì¿Êú(› )£ÔXe<«V6ã{¨‘ˆR <’fÕMÐä𓟇_Åc1ÍÆ/cya ­ÒXäÙô±‡¾% É(~ÏàÇ…ÁšF¬RÙ»~#…—ŠCñu^Û›^’fR_g·ÝÂȵ9Ϫ(eÐØÂ±Ìð‘2ÑÑzo˜0‚ÛáFtƒIš2µÊ¾'ªÐãÜÎ$›}‰¨9XÎ?I³áÛP&5Š€´‹$¦…k¿UJÛ ôT5—X´罆ó_Ãy¦Î"K—ÂShaö5{©¸JgR’×H¶Üí?÷Žž)#2¼efƒI_½ VÂ*4õóÃKÚÆ§kÞt˜>Ýή]û÷;¿‚ë¼8æ8n=bí6™ÞâÙ [HG¹ÕWBæ€/¼ gÎ:·;»¢ñdÛ¾ú.@ºö:Z1uÃfgEà _h‹Ó䛕WÔ¬‡ù°ÄeøÔ¶§~oõ±õðô¶¥rÈ@ZÒ¹wFQ¦«”«²h8„@°?3äÙ‚§cŽþÒsã ü_!äxPKW2)ÄæúI°I°í¦€šj:WÁ (^°b®]ܧD‰÷^į§ o¦ñÔô¼H›fÞ¼]H¥Æ"S‡ IÞÝÛæ_з«™7%ÄRòexÝûô‘Sº©üj†Õ.jþõé®ã'Û5nµRg)ãÆ™®£ŠÚ}­ü Æq@Þ^JìÐïºWàú቞Áœð-3Ôò°%Á'¬“àu§˜Vhu´XÞÐum$©ªf&Ž’Îá´ ­ÓýÐ'.ãÎ˹¸`—ää–cæ·}÷ÙßópiÝù¹##5€û óïì>É]€£›Â³Ýeµò½€v6Ä" åØëwÀ´/-5˜”$ûI¾S¸Bǯ¨Rš–¬}i,€µ§M'ªâ€ÂWþþ $³XÑ#)§E@àÙ*ÒJÛñK3±ÿ©x¶£ðxš=wðÀÝ_ú´¾±¾ÁD©Æ[œ;c†&)ÿÍî̵ÖDîG-1ÎC^±”æ×Ò–£ð+ù:OHhý*²möÖÐoh™Á¬*m©‰ó:nY£qÏÄÝãöMvЋ«¯ŸæÐñþG÷‰óoôѱ Óy°C•Ã.fdŠ=…W®²å¸=3["ô1>ElÜ]hðLJr)x¯­ý‚ËëôÅ5n ‘¹K 6þ7€ÆÌLÊÉÖ¿ÛÑÝéÚ(J7‡f¾šiFtI@mñxkú×μ‰&ú…´C¶ï¤HĤÂ]Wq}šØùŒ8¡Ã™Ímëš×úõ{z¨Ð_ ?ÿÎåáخ]ÈÌH¦Vî3‘ž“ OÅ/Íø"DM!Ç~#®Lw­‘ÕlSŒ ^XJ² 4 kg?ü˜ØˆÓ5Ç—A ˜•`κ•J4kù¤)ÜxXû‘õ"9ØE|ßE< •“)ú ߇IðaºÝhýñ¥Ÿ„G„þOð î7÷åÏûɮ“nŸ[¼/ N$fð(`+8ÔfªôuÃF˜“N›Ó¨î¢$˜:uê}8 §Ö¸&Ü–L}RbŠt!.N“,&ñ1"×>D,1þ[¡{,I–­Î Hf4¨UA–Ò¬¼ša@ñ†Ž¨hv—­7îgq7–ÐÄF¶Ë´¼pW7ýÖ¾¶79vj_}ÐöHb;_sdIÓk€ÆNZù_ ¨.âqçO¼ƒÇ~ûÂÅÂŽ i¼ ÝyýÉüíÉkš­/Ár$PxèÚ/¸ß~¨«é{ä/»EFsé*¨®¯d£ÙÌ2C[œo½×éi×wZwúà?NÿÄ{™ší–CK !ì%I‚úM¤=±1‚{6Ç6Õ“—e ¯RXd¦¢êÚêª*¨ÚúšzScûg³¬©¢±Ðèq3GðPî. ÊU žÀbÖÔ˜j-¤†(÷*‚ d$rl‡êÁ‰NŸi=Â}@ŸÿÖ:õ·ÂôZ'_â泈¬yÿ$ñ2'<Æ…}k—# ³dõê¥Ü2X÷¦ýHVSœ;³ÐƒGOóÁ~Ó«+–¤0é5Yü&€ÓBdWÄRðKðoièj茷µìØ%±·M;T›)"½¤[B¿<¾•¾Vñán9¬ÐlØ‚ð¼ÿm€Åst§àãï²×Ú–4û#¶dúH„na Sn2©xÐùô‘Z„¯ÑI 3+ø¬ñácz‡Î#ç„áÃMJß@z‡ÃIYµNr$–u슷l'3“T·oåØÅ[ôñ‚[Õ“iùe×câ®ÇÈ®·†0ó3ÇŠÊ´.pÖ9I’Ûå§•¾ºU1“¿«Ùùé¯áÝTè¦3Qˆ¡ÌÓÌ.•KÍ ãi­Â^! [Ûx<ìß9ÇíÁHˆ~|þ9v¦²e(aØý¢@èµ»cè¶àmP’¦?¸Šiá×ùÚ,Ïò¬\³¸_$ â?!ÓC´ ‘Ÿh{ H\ý®v…SÃ)h5v›7Ø´ËÁWU4@c8èó´·};ÈM»³æ µ„ñV•[Í ciÑq+BæV~7-N¸_PKÀåhºvúÚG\} ޼à™IÞ›²bä(Â&«>µ]"óT‘ÂOôà³w…kd¢Æg”¸™r§š+¹ƒñ µåv¼ß¿%ñþß fý¯´óÿ}Ö÷$Q©œ7®âh:7s× ‰°î%FNvVD×̧KÜYο”9CoW5h¤f½Œ31›w­Š¬%ícC…¾bªrð@þŽïÞ„~';¦®}BŒÅñ…î9h!3íŅ󹉰¸ÇvýöŒ3çT…ÛñÒ)¢Ê“cAÒÉ´UË8¡€Vi+Êx)ÓzSèM´¢œ¡xI´ÜkÄÿíC–ß¹·}óÔxW×&“ñp;ÇNÎõmäŠaqéÊ•½‚g€Cø÷J ûRl?²S²§âå  ›8§X$|Ÿ°Ð9;PÞ¸&mèðuÏ›Ü.8ëð¬Cì®F¹Ctá®xŒ¿ÌÄ*ÃJÎF[•©4´Áµ‰ð«ÐGöÂóøÚ@`мǪe\½VEÇ[ZÙZ.Íz#5ÿ8£òi\ Í®hïÙ&à•)|7àÇÓ¬?N´ÁhZj4ª²€öL<µò@éOŽÝˆY›·ò«!ZªÞŒØC†ŠrÃ6@óû÷óX†gÜ‘ãD±j9á¹Ïé­G•õœÕ— È’sh ·ØØV¿-,k_wÜröÃ!ß®Ö:uÀœMˆ¨¹âº&5ÿ ¡—¤5´…GP½º,û¯žÂjúùùŠ’ ë]g9cZ¬áRn ­Ô›Ò˜xûVfèÞëä?“ê+]•ÎÊðÒ¢ÈÒà²ðÒí㋚Wxõ$ŸNz74yBoöÅ.ÄÎÇ/Ä/¹ü þz?꧀ؔxÔ$j¯»÷J ÎRqðI¾ƒ*\Š/äwˆ®±×w¦Ù¸8b¶^ųÝâM×{žœKä,Nic…KºC˜Ty¤^{‚Ï¿ßã »"uTGòĂÀ«¾M‘êV8õg}ïoDn4Ý@!:ôÇ[Õn%/Hh©ŽZigèåÂAØ«Û_¹g¥ÃÞª—àµ`ßd«0½fZcY³ ,:ÓKÚæ€T|W©¶I Ýq…}²‰Šc-–IŒÉT©¯4,š\dÔ[¥ÄVl£5R"oƒFÂ~÷Ò±ˆ7×û¼žþ£O”¯í³Šg_•‡+'”t›ü^½M~"uÈ]^LMV1Xh3Ôºìž!ø¢Zg• \õÞPÈÓk¶E[C±¢·³¡ PhnJ´¨=^ȡنÛÌBx…èÐxö¿ÙºxÄŒ?æè„?Ij¼ÄúßKJdTmk­‰’lkTZ‘G¹×ä16U,Röd’½ ò­Ø ¦F³Ë¼sÂΉ;&lŸQä´¸‰X‡ªš*Gµ¥¢H¿R9e. «ÝäÃt«&V.ShËVì]„Ã}`~¨ã÷áo‹œ¾º¦ 8‹;wóÕ mƒ†@EZ‚ð“h‹•Y[Ü­$<Îuг„¥åÃE[¼ë1Ü”¿ní½:’ec%©ÊÆ*7d»HÑlnÉj´=9GÓx'¡»É¹q¥CgÑ*uúA“¦L˜6aªRYa„­Hå×µKFw:“QþÓ¡nÔhÔörn…àeöìèÚݵ+uþâ…žó¡@ÐqÔ©hPqÂ×´FNüòBFæÑ¶'CžN® ²)3Õƒ§4Ñ‚²áúå6MÐ×= _Ý€þßö;ÖŸ[4«ú~ouÑßïýoþ“¤Å endstream endobj 725 0 obj <> stream xÚíš]O#¹†ï÷Wø~Eâò·¥ÕJd2L0š‹,˜Hf!#óïÏëî|´¦×Ë ´ :·»\~R~]ÕÁ Å8³Â1¡5³’3i^#AáD1rÞáÄ0òÜàÄã$\R„Ü`•d‚sÅ †¬20f$ÓLXáñÞ2á`Õ0É‹þŽI2š1)%¡Á3© C[ 7lè!™ôÁ„&¦¸‚/–)A¡‡`JÂ09¦4ºY-™2°Lð@¹àŸ†G¦ 4 Œjf Z-†iü E0m|Ñ–i'aXJfx˜°vÌ„e°0’‡»<3 3!©™ÑwÎŒÁŽaÆ-øãs‚-K.¸Â²*¦ŒY‘ ó%øm­ -ðÛã#!œ8î1(8,[œÈ²aNóÀ'×­±ÌY‡ÃâÄcÆ1ÏwÏ`/Œƒ Ç%Üð:ÌÝræMøÐ•fÞaî%©–E8äüZ!ZEèXÕrx5Æ·0/q\öpáÌ Þ¢Í]ʵ€Ü®F!.tåòæW …ŽÊ \-ÕµUÝ¢–,(¯…6%\TäÑK¾Ö<¼_ZÂuïZòÓ/sp¾ù˜ƒ†¸ÖË¡+J)#amËa0M¦uyµz¬kû÷øcü'õúçÿmšUÚZ{+JB{+/óBBË T*›6áõeÇmÛVeP@éZØx˜³~Ý×X]è(ZU3HxÑßÉ ;F¨õU_´×0TKÙÛËú.lQ*(.½+çX¶­ÞyiayyOÑoy¢^|Uª8GÏø*_¿–#ÿ 1§Èe{Z²­—6–³-—G¾&Z¹ßTb ±jˆZ„WlËEì çŠ;-/·"¤)Å&¨£¿êö¸iÙôÝj/,…˜.«Õ¿Ê‘×¶ñ¿½kÓ'§wžôõugþÝÇO¿üö[{ô߯Óv÷a¾h¿ý¹oB µÇ³Ï‹/O!­Ä$íîìñi±÷eòˆàk¿›,Ï…´íƒùõÃçÙü¶ÈèB×ÎäiZìŒG§'ý_‡Ýá…àV£ìOŸ®g_EÆŽþ¿ÿ¹±éÐÞ›|=šÎn¿,àµwŸ®§ó²ZÙ}ÂùJ‚vo1¹›]ïÎo歷·‡‹éý9Ӽݽ›ÜÂýÂf§óðŸ;™ôŽ$¤æVAѼøT\ìÎî¦ ÏËy¢¥?¹Ÿ¦Î'^>ËS ËTa©X‡—Ý~/Œ7$FÛ°l>,µeª°d>,r¬P ‡Ç–Ã1¬ÄùLX2…Å7°ˆ\¬«ÃîÁïÊñnÛ‚åòa™ ,õbX°D(ÍFÎQ KŰç3aéU# ^=«ñÇîÙ{Œ78!îõ6,ÿ‚È‚C/†å–°T(U² M +q¾Öèál>†)ìËeƒÏ%ø¢PXÃî¸Ûïþºw2¼¤í¸Ò<•\¡âkP<¢´ƒ’«%*µBeyU²<Ûñ¨ò‰È æÕ1*£Š\ÏŠ*Ëy‚E» Á7\Ž:½Ë‹ŒŸô¶µIÓ °`]T#H=ÏÆºZ6(~`Žð*Ë)fSu?HЗ»àzg§§‹rëP®—ÈÆ…©¯Õ‰¾oß³aß³áBLJƤç3a©&XJ7% ýËîyãu.jÕIËüز߯NB)ÇjÃ>&Qœ$a¥“$!v>–yqd] NÏß1Þ¨WKýh)¢®)¯VzŽU‡r.&f“L!žA&±T½}U½©)Qè½ïõ†ÅöÁ¯tý¦{ŸÀj+YiJßd)&‚ž8ŸÇŠRIÇêË\Š»£ãöËh®Ëª´yÛ¥Hn¹ ÓS´ûAcX‰ó™°R‘G XÙÿ*yÁÁ‡ƒ÷G{ÅR—Ø×ÝEݺ“b¹òðì=Ù)‘õÈÿÜ, q5‹²´•„>“- OG}Œ6¨ƒå~4¬U_F¨õ–˜¸ßÆ”¤›UÇó)Ù˜’{ž’®„ÔÙÉÙp<cÕ¤þµYSÃHš#»KQ"K¿óV™à @äyEŸ¿ë^• hjäÛð·•oˆk)ߊW*â$EJœÏd%šê<%` ÃñÑY9ž¯ƒEo[ç¡”,½¹tšˆDŸç3a©†Ç-$šƒq¯sÕ½(òzXâÿIA¢2Â6„ÄÄK#K´*™B¶\‰X®D*WºÑùJ.µw8¼:º?¸¨Qu“§ó¿+ŒWa¥lÝ e_Q+¤PÖ&ŒÒªês^PÉT­Ï]ïÇçûáÕ¦ç&?=§ª“Ø•ÿ¤ðã!3Dz'‰ Ý%µŒLä*q>V³\5f›‡ƒË½Ë2au+P¿qá'WÙ& /âlS&r•8Ÿ K5샪²Ò{g㳓°Ãšm,æµ2t¯‹¡ÕS/·2™”ÿ3‰¤¥0Qô`®’Ržvǧƒ"­ò²ü[gæßNר5 ’ŒÿY“’IÊÞª÷ÙB-]$Ôr뛘Ês]Au<ê÷÷‹Û™¥q¯öÓÔV) þ׉œ†\Gß#„ïa"LUÏó"H¥ß¸xûÜÌÝ^ol}ÛÆ’Ÿpm¤™ªÒ,þAQ‚þÐ81ÞÄL’ïV"¿3¡4~³"š2îÁxïäÃU± ÔæE–¿íVdܨ†H†ÿ;K2n•|³’8_z¦¶š/ÍwçO³õûýÙÍÍôq:¿ž>}ôíûÉõãÃ<ìa}{XL?ÿyw7½Y¬ß<óBLÝ~›áÊýÃbÙ"ÚÓûÏ“§/áIÞͬ}sǤ/ï*;ø¥Á`í¼úßN endstream endobj 771 0 obj <<27d91efbe400b7d4ca4bfcdb4898e8e3>]/Size 772/W[1 3 2]/Filter/FlateDecode/Length 1724>> stream xÚ5ØWLTYÀñóÝ« `CEŠˆQlذ£¨Ø v,ذ *6ÄŠX±‹½+vÁ®¨q“MÌcv“5YŸ|Ùú°Å—ùŸ—_¾üÏu˜aîÎhŒ1?~8Æhîá]lWå{ãƒ~XGŒ©gŒcŒ1"ï–yæª+Û³Zý1@ŒôÕ+…k:Ðacºƒ.ÖÀšè…ÞX }Ðý°6ÖÁºXë£?6Àlˆ0ísh‚A؃1C1 ›a86Ç1^#õ5¶à5vdŽÄ(ŒÆl‰­°5ÆbŒÃ¶ ØÛc"vÀ$´?±&cgì‚]±vÇì=±öÆ>˜Š}±öÇ8á`LÃ!8TŒßIý¤ó;±Ïgǘ#qŽÆ18Çáxœ€qfâdœ‚SqNÇ8³p–ÿB}†³y†]¹'ƒÐ¾ûs˜C±6Ç…1ØJ¸øWsy´nôX1¡iÚ³éÝÅDçh™GIáÊ81ñǴϧ÷Ó¡XËJoá­¤,¤ôÓó/-‹(©bR´äPúòøñbT?þbº}—àR\†ËŠݥW®àÊA<‚Ý1IÌøt½f%× 3퇖U{'äbž˜¹tu5«éÌkp­˜Åu5ŸÕ 1¹_µ¬£ŒSðVËzÊ(1EyZ6PF‹)©Ð²‘bïœMX ¦4PW7³:^ÌùµRì}µ·Š¹qSW·±:IL¹–í”L1OwhÙA±wÝN,ó“—®îbuº˜·aZŠ)öžÜ{p/îó¡ú´Ÿ+g1À1«cY-æÿ´¢d‹ù|IËaÊ<1_k9B™/æŸ?µ¥,d>†ÇEä‹®ž`5‡¹OŠødëê)V—‰ø_Õrš²‚ù ž ©««çX])U å. % % GLPK is free software: you can redistribute it and/or modify it % under the terms of the GNU General Public License as published by % the Free Software Foundation, either version 3 of the License, or % (at your option) any later version. % % GLPK is distributed in the hope that it will be useful, but WITHOUT % ANY WARRANTY; without even the implied warranty of MERCHANTABILITY % or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public % License for more details. % % You should have received a copy of the GNU General Public License % along with GLPK. If not, see . %*********************************************************************** \documentclass[11pt, brazil]{report} \usepackage[utf8]{inputenc} \usepackage[T1]{fontenc} \usepackage{amssymb} \usepackage[dvipdfm,linktocpage,colorlinks,linkcolor=blue, urlcolor=blue]{hyperref} \usepackage{indentfirst} \setlength{\textwidth}{6.5in} \setlength{\textheight}{8.5in} \setlength{\oddsidemargin}{0in} \setlength{\topmargin}{0in} \setlength{\headheight}{0in} \setlength{\headsep}{0in} \setlength{\footskip}{0.5in} \setlength{\parindent}{16pt} \setlength{\parskip}{5pt} \setlength{\topsep}{0pt} \setlength{\partopsep}{0pt} \setlength{\itemsep}{\parskip} \setlength{\parsep}{0pt} \setlength{\leftmargini}{\parindent} \renewcommand{\labelitemi}{---} \def\para#1{\noindent{\bf#1}} \renewcommand\contentsname{\sf\bfseries Conteúdo} \renewcommand\chaptername{\sf\bfseries Capítulo} \renewcommand\appendixname{\sf\bfseries Apêndice} % \renewcommand\contentsname{\sf\bfseries Contents} % \renewcommand\chaptername{\sf\bfseries Chapter} % \renewcommand\appendixname{\sf\bfseries Appendix} \begin{document} \thispagestyle{empty} \begin{center} \vspace*{1.5in} \begin{huge} \sf\bfseries Linguagem de Modelagem GNU MathProg \end{huge} \vspace{0.5in} \begin{LARGE} \sf Linguagem de Referência % Language Reference \end{LARGE} \vspace{0.5in} \begin{LARGE} \sf para o GLPK Versão 4.57 \end{LARGE} \vspace{0.5in} \begin{Large} \sf (RASCUNHO, Fevereiro 2016) \end{Large} \end{center} \newpage \vspace*{1in} \vfill \noindent % The GLPK package is part of the GNU Project released under the aegis of GNU. O pacote GLPK é parte do Projeto GNU distribuído sob a égide do GNU. \noindent Copyright \copyright{} 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2013, 2014, 2015, 2016 Andrew Makhorin, Department for Applied Informatics, Moscow Aviation Institute, Moscow, Russia. % All rights reserved. Todos os direitos reservados. \noindent Título original: Modeling Language GNU MathProg - Language Reference for GLPK Version 4.57 \noindent Tradução: João Flávio de Freitas Almeida, Departamento de Engenharia de Produção, Universidade Federal de Minas Gerais, Minas Gerais, Brasil. \noindent Copyright \copyright{} 2015 João Flávio de Freitas Almeida, para esta tradução. Todos os direitos reservados. \noindent Free Software Foundation, Inc., Rua Franklin, 51, 5$^{o}$ andar, Boston, MA 02110-1301, USA. \noindent É permitido realizar e distribuir cópias textuais deste manual mantendo o aviso de copyright e preservando este aviso de permissão em todas as cópias. % Permission is granted to make and distribute verbatim copies of this % manual provided the copyright notice and this permission notice are % preserved on all copies. \noindent É concedida a permissão para copiar e distribuir versões modificadas deste manual sob as condições de cópias textuais, desde que o resultado completo derivado do trabalho resultante seja distribuído sob os termos de uma notificação de permissão idêntica a esta. % Permission is granted to copy and distribute modified versions of this % manual under the conditions for verbatim copying, provided also that % the entire resulting derived work is distributed under the terms of % a permission notice identical to this one. \noindent É concedida a permissão para copiar e distribuir traduções deste manual em outra linguagem, sob as condições acima para as versões modificadas. % Permission is granted to copy and distribute translations of this % manual into another language, under the above conditions for modified % versions. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newpage {\setlength{\parskip}{0pt} \tableofcontents } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Introdução} {\it GNU MathProg} é uma linguagem de modelagem projetada para descrever modelos lineares de programação matemática. \footnote{A linguagem GNU MathProg é um subconjunto da linguagem AMPL. A implementação do GLPK é \linebreak principalmente baseada no artigo: {\it Robert Fourer}, {\it David M. Gay}, and {\it Brian W. Kernighan}, ``A Modeling Language for Mathematical Programming.'' {\it Management Science} 36 (1990), pp.~519-54.} % {\it GNU MathProg} is a modeling language intended for describing % linear mathematical programming models.\footnote{The GNU MathProg % language is a subset of the AMPL language. Its GLPK implementation is % mainly based on the paper: {\it Robert Fourer}, {\it David M. Gay}, and % {\it Brian W. Kernighan}, ``A Modeling Language for Mathematical % Programming.'' {\it Management Science} 36 (1990), pp.~519-54.} A descrição de um modelo escrito na linguagem GNU MathProg consiste em um conjunto de sentenças e blocos de dados construído pelo usuário a partir dos elementos de linguagem descritos neste documento. % Model descriptions written in the GNU MathProg language consist of % a set of statements and data blocks constructed by the user from the % language elements described in this document. Em um processo denominado {\it tradução}, um programa denominado {\it tradutor do modelo} analisa a descrição do modelo e o traduz para uma estrutura de dados interna, que pode ser usado tanto para gerar instância de um problema de programação matemática ou obter diretamente a solução numérica do problema por meio de um programa chamado {\it solver}. % In a process called {\it translation}, a program called the {\it model % translator} analyzes the model description and translates it into % internal data structures, which may be then used either for generating % mathematical programming problem instance or directly by a program % called the {\it solver} to obtain numeric solution of the problem. \section{Problema de programação linear} \label{problem} Em MathProg o problema de programação linear (PL) é expresso da seguinte forma: % In MathProg the linear programming (LP) problem is stated as follows: \medskip \noindent\hspace{1in}minimizar (ou maximizar) $$z=c_1x_1+c_2x_2+\dots+c_nx_n+c_0\eqno(1.1)$$ \noindent\hspace{1in}subjeito às restrições lineares $$ \begin{array}{l@{\ }c@{\ }r@{\ }c@{\ }r@{\ }c@{\ }r@{\ }c@{\ }l} L_1&\leq&a_{11}x_1&+&a_{12}x_2&+\dots+&a_{1n}x_n&\leq&U_1\\ L_2&\leq&a_{21}x_1&+&a_{22}x_2&+\dots+&a_{2n}x_n&\leq&U_2\\ \multicolumn{9}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}\\ L_m&\leq&a_{m1}x_1&+&a_{m2}x_2&+\dots+&a_{mn}x_n&\leq&U_m\\ \end{array}\eqno(1.2) $$ \noindent\hspace{1in}e os limites das variáveis $$ \begin{array}{l@{\ }c@{\ }c@{\ }c@{\ }l} l_1&\leq&x_1&\leq&u_1\\ l_2&\leq&x_2&\leq&u_2\\ \multicolumn{5}{c}{.\ \ .\ \ .\ \ .\ \ .}\\ l_n&\leq&x_n&\leq&u_n\\ \end{array}\eqno(1.3) $$ % \newpage \noindent onde $x_1$, $x_2$, \dots, $x_n$ são variáveis; $z$ é a função objetivo ; $c_1$, $c_2$, \dots, $c_n$ são coeficientes da função objetivo; $c_0$ é o termo constante da função objetivo; $a_{11}$, $a_{12}$, \dots, $a_{mn}$ são coeficientes das restrições; $L_1$, $L_2$, \dots, $L_m$ são limites inferiores das restrições; $U_1$, $U_2$, \dots, $U_m$ são limites superiores das restrições; $l_1$, $l_2$, \dots, $l_n$ são limites inferiores das variáveis; $u_1$, $u_2$, \dots, $u_n$ são limites superiores das variáveis. Os limites das variáveis e das restrições podem ser tanto finitos quanto infinitos. Além disso, os limites inferiores podem ser igual aos limites superiores correspondentes. Logo, os seguintes tipos de variáveis e restrições são permitidos: % where $x_1$, $x_2$, \dots, $x_n$ are variables; $z$ is the objective % function; $c_1$, $c_2$, \dots, $c_n$ are objective coefficients; $c_0$ % is the constant term (``shift'') of the objective function; $a_{11}$, % $a_{12}$, \dots, $a_{mn}$ are constraint coefficients; $L_1$, $L_2$, % \dots, $L_m$ are lower constraint bounds; $U_1$, $U_2$, \dots, $U_m$ % are upper constraint bounds; $l_1$, $l_2$, \dots, $l_n$ are lower % bounds of variables; $u_1$, $u_2$, \dots, $u_n$ are upper bounds of % variables. % % Bounds of variables and constraint bounds can be finite as well as % infinite. Besides, lower bounds can be equal to corresponding upper % bounds. Thus, the following types of variables and constraints are % allowed: \medskip {\def\arraystretch{1.4} \noindent\hspace{54pt} \begin{tabular}{@{}r@{\ }c@{\ }c@{\ }c@{\ }l@{\hspace*{39.5pt}}l} $-\infty$&$<$&$x$&$<$&$+\infty$&Variável livre (ilimitada)\\ $l$&$\leq$&$x$&$<$&$+\infty$&Variável com limite inferior\\ $-\infty$&$<$&$x$&$\leq$&$u$&Variável com limite superior\\ $l$&$\leq$&$x$&$\leq$&$u$&Variável duplamente limitada\\ $l$&$=$&$x$&=&$u$&Variável fixa\\ \end{tabular} % \begin{tabular}{@{}r@{\ }c@{\ }c@{\ }c@{\ }l@{\hspace*{39.5pt}}l} % $-\infty$&$<$&$x$&$<$&$+\infty$&Free (unbounded) variable\\ % $l$&$\leq$&$x$&$<$&$+\infty$&Variable with lower bound\\ % $-\infty$&$<$&$x$&$\leq$&$u$&Variable with upper bound\\ % $l$&$\leq$&$x$&$\leq$&$u$&Double-bounded variable\\ % $l$&$=$&$x$&=&$u$&Fixed variable\\ % \end{tabular} \noindent\hfil \begin{tabular}{@{}r@{\ }c@{\ }c@{\ }c@{\ }ll} $-\infty$&$<$&$\sum a_jx_j$&$<$&$+\infty$&Forma linear livre (ilimitada)\\ $L$&$\leq$&$\sum a_jx_j$&$<$&$+\infty$&Restrição de desigualdade ``maior ou igual a''\\ $-\infty$&$<$&$\sum a_jx_j$&$\leq$&$U$&Restrição de desigualdade ``menor ou igual a''\\ $L$&$\leq$&$\sum a_jx_j$&$\leq$&$U$&Restrição de desigualdade duplamente limitada\\ $L$&$=$&$\sum a_jx_j$&=&$U$&Restrição de igualdade\\ \end{tabular} % \begin{tabular}{@{}r@{\ }c@{\ }c@{\ }c@{\ }ll} % $-\infty$&$<$&$\sum a_jx_j$&$<$&$+\infty$&Free (unbounded) linear % form\\ % $L$&$\leq$&$\sum a_jx_j$&$<$&$+\infty$&Inequality constraint ``greater % than or equal to''\\ % $-\infty$&$<$&$\sum a_jx_j$&$\leq$&$U$&Inequality constraint ``less % than or equal to''\\ % $L$&$\leq$&$\sum a_jx_j$&$\leq$&$U$&Double-bounded inequality % constraint\\ % $L$&$=$&$\sum a_jx_j$&=&$U$&Equality constraint\\ % \end{tabular} } \medskip Além de problemas puramente PL, MathProg também permite problemas de programação inteira mista (PIM), onde algumas ou todas as variáveis são restritas a serem inteiras ou binárias. % In addition to pure LP problems MathProg also allows mixed integer % linear programming (MIP) problems, where some or all variables are % restricted to be integer or binary. \section{Objetos do modelo} Em MathProg o modelo é descrito em termos de conjuntos, parâmetros, variáveis, restrições e objetivos, que se denominam {\it objetos do modelo}. O usuário introduz objetos particulares do modelo usando as sentenças da linguagem. Cada objeto do modelo possui um nome simbólico que o identifica de maneira única sendo projetado para propósitos de referenciação. % In MathProg the model is described in terms of sets, parameters, % variables, constraints, and objectives, which are called {\it model % objects}. % % The user introduces particular model objects using the language % statements. Each model object is provided with a symbolic name which % uniquely identifies the object and is intended for referencing % purposes. Objetos do modelo, incluindo conjuntos, podem ser matrizes multidimensionais construídos sobre conjuntos indexantes. Formalmente, uma matriz $n$-dimensional $A$ é o mapeamento: % Model objects, including sets, can be multidimensional arrays built % over indexing sets. Formally, $n$-dimensional array $A$ is the mapping: $$A:\Delta\rightarrow\Xi,\eqno(1.4)$$ onde $\Delta\subseteq S_1\times\dots\times S_n$ é um subconjunto do produto Cartesiano de conjuntos indexantes, $\Xi$ é um conjunto dos membros da matriz. Em MathProg o conjunto $\Delta$ é chamado o {\it domínio do subíndice}. % REVISAR Seus membros são $n$-tuplas $(i_1,\dots,i_n)$, onde $i_1\in S_1$, \dots, $i_n\in S_n$. % where $\Delta\subseteq S_1\times\dots\times S_n$ is a subset of the % Cartesian product of indexing sets, $\Xi$ is a set of array members. % In MathProg the set $\Delta$ is called the {\it subscript domain}. Its % members are $n$-tuples $(i_1,\dots,i_n)$, where $i_1\in S_1$, \dots, % $i_n\in S_n$. Se $n=0$, o produto Cartesiano acima possui exatamente um membro (denominado 0-tupla), portanto, é conveniente pensar nos objetos escalares como sendo matrizes 0-dimensionais que \linebreak possuem apenas um membro. % If $n=0$, the Cartesian product above has exactly one member (namely, % 0-tuple), so it is convenient to think scalar objects as 0-dimensional % arrays having one member. % \newpage O tipo dos membros da matriz é determinado pelo tipo de objeto do modelo correspondente, como segue: % The type of array members is determined by the type of corresponding % model object as follows: \medskip \noindent\hfil \begin{tabular}{@{}ll@{}} Objeto do modelo&Membro da matriz\\ \hline Conjunto&Conjunto plano elementar\\ Parâmetro&Número ou símbolo\\ Variável&Variável elementar\\ Restrição&Restrição elementar\\ Objetivo&Objetivo elementar\\ \end{tabular} % \begin{tabular}{@{}ll@{}} % Model object&Array member\\ % \hline % Set&Elemental plain set\\ % Parameter&Number or symbol\\ % Variable&Elemental variable\\ % Constraint&Elemental constraint\\ % Objective&Elemental objective\\ % \end{tabular} \medskip Para referir a um membro particular de um objeto, este deve possuir {\it subíndices}. Por exemplo, se $a$ é um parâmetro 2-dimensional definido sobre $I\times J$, uma referência a seus membros particulares pode ser escrito como $a[i,j]$, onde $i\in I$ e $j\in J$. Entende-se que objetos escalares não necessitam de subíndices por serem 0-dimensionais. % In order to refer to a particular object member the object should be % provided with {\it subscripts}. For example, if $a$ is a 2-dimensional % parameter defined over $I\times J$, a reference to its particular % member can be written as $a[i,j]$, where $i\in I$ and $j\in J$. It is % understood that scalar objects being 0-dimensional need no subscripts. \section{Estrutura da descrição do modelo} Às vezes é desejável escrever um modelo que, por diferentes motivos, tenha que requerer diferentes dados para resolver cada instância do problema usando o mesmo modelo. Por esta razão, em MathProg a descrição do modelo consiste em duas partes: a {\it seção de modelo} e a {\it seção de dados}. % It is sometimes desirable to write a model which, at various points, % may require different data for each problem instance to be solved using % that model. For this reason in MathProg the model description consists % of two parts: the {\it model section} and the {\it data section}. A seção de modelo é a principal parte da descrição do modelo, pois ela contém as declarações dos objetos do modelo. Ela também é comum a todos os problemas baseados no modelo correspondente. % The model section is a main part of the model description that contains % declarations of model objects and is common for all problems based on % the corresponding model. A seção de dados é uma parte opcional da descrição do modelo que contém dados específicos para uma instância particular do problema. % The data section is an optional part of the model description that % contains data specific for a particular problem instance. Dependendo do que seja mais conveniente, as seções de modelo e de dados podem ser dispostas em um arquivo único ou em dois arquivos separados. Esta última funcionalidade permite que se tenha um quantidade arbitrária de seções de dados diferentes a serem usadas com a mesma seção de modelo. % Depending on what is more convenient the model and data sections can be % placed either in one file or in two separate files. The latter feature % allows having arbitrary number of different data sections to be used % with the same model section. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Codificação da descrição do modelo} \label{coding} A descrição do modelo é codificada em um formato de arquivo plano de texto usando o conjunto de caracteres ASCII. Os caracteres válidos na descrição do modelo são os seguintes: % The model description is coded in a plain text format using ASCII % character set. Characters valid in the model description are the % following: \begin{itemize} \item Caracteres alfabéticos:\\ \verb|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|\\ \verb|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 _| \item caracteres numéricos:\\ \verb|0 1 2 3 4 5 6 7 8 9| \item caracteres especiais:\\ \verb?! " # & ' ( ) * + , - . / : ; < = > [ ] ^ { | } ~? \item caracteres de espaço em branco:\\ \verb|SP HT CR NL VT FF| \end{itemize} Dentro de literais de cadeia e comentários quaisquer caracteres ASCII (exceto caracteres de controle) são válidos. % Within string literals and comments any ASCII characters (except % control characters) are valid. Caracteres de espaço-em-branco não são significativos. Eles podem ser usados livremente entre unidades léxicas para melhorar a legibilidade da descrição do modelo. Eles também são usados para separar unidades léxicas entre si, no caso de não existir outra forma de fazê-lo. % White-space characters are non-significant. They can be used freely % between lexical units to improve readability of the model description. % They are also used to separate lexical units from each other if there % is no other way to do that. Sintaticamente a descrição do modelo é uma sequência de unidades léxicas nas seguintes \linebreak categorias: % Syntactically model description is a sequence of lexical units in the % following categories: \begin{itemize} \item nomes simbólicos; \item literais numéricos; \item literais de cadeia; \item palavras-chave; \item delimitadores; \item comentários. \end{itemize} % \begin{itemize} % \item symbolic names; % \item numeric literals; % \item string literals; % \item keywords; % \item delimiters; % \item comments. % \end{itemize} As unidades léxicas da linguagem são discutidas abaixo. % \newpage \section{Nomes simbólicos} Um {\it nome simbólico} consiste de caracteres alfabéticos e numéricos, em que o primeiro deste deve ser alfabético. Todos os nomes simbólicos devem ser distintos (sensibilidade às maiúsculas: case-sensitive). % A {\it symbolic name} consists of alphabetic and numeric characters, % the first of which should be alphabetic. All symbolic names are % distinct (case sensitive). \para{Exemplos} \begin{verbatim} alfa123 Este_eh_um_nome _P123_abc_321 \end{verbatim} Nomes simbólicos são usados para identificar objetos do modelo (conjuntos, parâmetros, \linebreak variáveis, restrições, objetivos) e os índices. % Symbolic names are used to identify model objects (sets, parameters, % variables, constraints, objectives) and dummy indices. Todos os nomes simbólicos (exceto os nomes dos índices) devem ser únicos, i.e., a descrição do modelo não pode ter objetos com nomes idênticos. Nomes simbólicos de índices devem ser únicos dentro do escopo em que são válidos. % All symbolic names (except names of dummy indices) should be unique, % i.e. the model description should have no objects with identical names. % Symbolic names of dummy indices should be unique within the scope, % where they are valid. \section{Literais numéricos} Um {\it literal numérico} possui a forma {\it xx}{\tt E}{\it syy}, onde {\it xx} é um número com ponto decimal opcional, {\it s} é o sinal {\tt+} ou {\tt-}, {\it yy} é um expoente decimal. A letra {\tt E} é insensível à maiúsculas (case-insensitive) e pode ser codificada como {\tt e}. % A {\it numeric literal} has the form {\it xx}{\tt E}{\it syy}, where % {\it xx} is a number with optional decimal point, {\it s} is the sign % {\tt+} or {\tt-}, {\it yy} is a decimal exponent. The letter {\tt E} is % case insensitive and can be coded as {\tt e}. \para{Exemplos} \begin{verbatim} 123 3.14159 56.E+5 .78 123.456e-7 \end{verbatim} Literais numéricos são usados para representar quantidades numéricas. Eles possuem significado fixo óbvio. % Numeric literals are used to represent numeric quantities. They have % obvious fixed meaning. \section{Literais de cadeia} Uma {\it literal de cadeia} é uma sequência arbitrária de caracteres cercada por aspas tanto simples como duplas. Ambas formas são equivalentes. % A {\it string literal} is a sequence of arbitrary characters enclosed % either in single quotes or in double quotes. Both these forms are % equivalent. Se uma aspa simples é parte de uma literal de cadeia cercada por aspas simples, ela deve ser codificada duas vezes. De forma análoga, se uma aspa dupla é parte de um literal de cadeia cercada por aspas duplas, ela deve ser codificada duas vezes. % If a single quote is part of a string literal enclosed in single % quotes, it should be coded twice. Analogously, if a double quote is % part of a string literal enclosed in double quotes, it should be coded % twice. \para{Exemplos} \begin{verbatim} 'Esta eh uma string' "Esta eh outra string" 'Copo d''agua' """Beleza"" disse o capitao." \end{verbatim} Literais de cadeia são usadas para representar quantidades simbólicas. % String literals are used to represent symbolic quantities. \section{Palavras-chave} Uma {\it palavra-chave} é uma sequência de caracteres alfabéticos e possivelmente alguns caracteres especiais. % A {\it keyword} is a sequence of alphabetic characters and possibly % some special characters. Todas as palavras-chave caem em algumas das duas categorias: {\it palavras-chave reservadas}, que não podem ser usadas como nomes simbólicos, e {\it palavras-chave não-reservadas}, que são reconhecidas pelo contexto, portanto, podem ser usadas como nomes simbólicos. As palavras-chave reservadas são as seguintes: % All keywords fall into two categories: {\it reserved keywords}, which % cannot be used as symbolic names, and {\it non-reserved keywords}, % which are recognized by context and therefore can be used as symbolic % names. % % The reserved keywords are the following: \noindent\hfil \begin{tabular}{@{}p{.7in}p{.7in}p{.7in}p{.7in}@{}} {\tt and}&{\tt else}&{\tt mod}&{\tt union}\\ {\tt by}&{\tt if}&{\tt not}&{\tt within}\\ {\tt cross}&{\tt in}&{\tt or}\\ {\tt diff}&{\tt inter}&{\tt symdiff}\\ {\tt div}&{\tt less}&{\tt then}\\ \end{tabular} Palavras-chave não-reservadas são descritas nas seções posteriores. Todas as palavras-chave possuem um significado fixo, a ser explicado nas discussões das \linebreak construções sintáticas correspondentes, onde as palavras-chave são usadas. % Non-reserved keywords are described in following sections. % % All the keywords have fixed meaning, which will be explained on % discussion of corresponding syntactic constructions, where the keywords % are used. \section{Delimitadores} Um {\it delimitador} é tanto um caractere especial único quanto uma sequência de dois caracteres especiais, como segue: % A {\it delimiter} is either a single special character or a sequence of % two special characters as follows: \noindent\hfil \begin{tabular}{@{}p{.3in}p{.3in}p{.3in}p{.3in}p{.3in}p{.3in}p{.3in} p{.3in}p{.3in}@{}} {\tt+}&{\tt**}&{\tt<=}&{\tt>}&{\tt\&\&}&{\tt:}&{\tt|}&{\tt[}& {\tt>>}\\ {\tt-}&{\tt\textasciicircum}&{\tt=}&{\tt<>}&{\tt||}&{\tt;}& {\tt\char126}&{\tt]}&{\tt<-}\\ {\tt*}&{\tt\&}&{\tt==}&{\tt!=}&{\tt.}&{\tt:=}&{\tt(}&{\tt\{}\\ {\tt/}&{\tt<}&{\tt>=}&{\tt!}&{\tt,}&{\tt..}&{\tt)}&{\tt\}}\\ \end{tabular} Se um delimitador consiste de dois caracteres, não deve haver espaços entre os eles. Todos os delimitadores possuem um significado fixo, a ser explicado nas discussões das \linebreak construções sintáticas correspondentes, onde os delimitadores são usados. % If the delimiter consists of two characters, there should be no spaces % between the characters. % % All the delimiters have fixed meaning, which will be explained on % discussion corresponding syntactic constructions, where the delimiters % are used. \section{Comentários} Com propósitos de documentação, a descrição do modelo pode conter {\it comentários}, que podem ter duas formas diferentes. A primeira forma é um {\it comentário de linha-única}, que começa com o caractere {\tt\#} e se estende até o final da linha. A segunda forma é uma {\it sequência de comentários}, que é uma sequência de quaisquer caracteres cercados por {\tt/*} e {\tt*/}. % For documenting purposes the model description can be provided with % {\it comments}, which may have two different forms. The first form is % a {\it single-line comment}, which begins with the character {\tt\#} % and extends until end of line. The second form is a {\it comment % sequence}, which is a sequence of any characters enclosed within % {\tt/*} and {\tt*/}. \para{Exemplos} \begin{verbatim} param n := 10; # Este é um comentario /* Este é outro comentário */ \end{verbatim} Comentários e caracteres de espaço-em-branco são ignorados pelo tradutor do modelo e podem aparecer em qualquer local da descrição do modelo. % Comments are ignored by the model translator and can appear anywhere in % the model description, where white-space characters are allowed. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newpage \chapter{Expressões} Uma {\it expressão} é uma regra para calcular um valor. Na descrição de um modelo, expressões são usadas como constituintes de certas sentenças. No geral, expressões são constituídas de operandos e operadores. Dependendo do tipo de valor resultante, todas expressões se enquadram nas seguintes categorias: % An {\it expression} is a rule for computing a value. In model % description expressions are used as constituents of certain statements. % % In general case expressions consist of operands and operators. % % Depending on the type of the resultant value all expressions fall into % the following categories: \vspace*{-8pt} \begin{itemize} \item expressões numéricas; \item expressões simbólicas; \item expressões indexantes; \item expressões de conjuntos; \item expressões lógicas; \item expressões lineares. \end{itemize} % \begin{itemize} % \item numeric expressions; % \item symbolic expressions; % \item indexing expressions; % \item set expressions; % \item logical expressions; % \item linear expressions. % \end{itemize} \vspace*{-8pt} \section{Expressões numéricas} Uma {\it expressão numérica} é uma regra para calcular um valor numérico individual representado como um número de ponto-flutuante. A expressão numérica primária pode ser um literal numérico, um índice, um parâmetro não-indexado, um parâmetro indexado, uma função interna de referência, uma expressão numérica iterada, uma expressão numérica condicional ou outra expressão cercada por parênteses. % A {\it numeric expression} is a rule for computing a single numeric % value represented as a floating-point number. % % The primary numeric expression may be a numeric literal, dummy index, % unsubscripted parameter, subscripted parameter, built-in function % reference, iterated numeric expression, conditional numeric expression, % or another numeric expression enclosed in parentheses. \para{Exemplos} \noindent \begin{tabular}{@{}ll@{}} \verb|1.23 |&(literal numérico)\\ \verb|j|&(índice)\\ \verb|time|&(parâmetro não-indexado)\\ \verb|a['May 2003',j+1]|&(parâmetro indexado)\\ \verb|abs(b[i,j])|&(função de referência)\\ \end{tabular} % \begin{tabular}{@{}ll@{}} % \verb|1.23 |&(numeric literal)\\ % \verb|j|&(dummy index)\\ % \verb|time|&(unsubscripted parameter)\\ % \verb|a['May 2003',j+1]|&(subscripted parameter)\\ % \verb|abs(b[i,j])|&(function reference)\\ % \end{tabular} \newpage \noindent \begin{tabular}{@{}ll@{}} \verb|sum{i in S diff T} alpha[i] * b[i,j]|&(expressão iterada)\\ \verb|if i in I then 2 * p else q[i+1]|&(expressão condicional)\\ \verb|(b[i,j] + .5 * c)|&(expressão entre parênteses)\\ \end{tabular} % \begin{tabular}{@{}ll@{}} % \verb|sum{i in S diff T} alpha[i] * b[i,j]|&(iterated expression)\\ % \verb|if i in I then 2 * p else q[i+1]|&(conditional expression)\\ % \verb|(b[i,j] + .5 * c)|&(parenthesized expression)\\ % \end{tabular} Expressões numéricas mais genéricas, contendo duas ou mais expressões numéricas primárias, podem ser construídas usando determinados operadores aritméticos. % More general numeric expressions containing two or more primary numeric % expressions may be constructed by using certain arithmetic operators. \para{Exemplos} \begin{verbatim} j+1 2 * a[i-1,j+1] - b[i,j] sum{j in J} a[i,j] * x[j] + sum{k in K} b[i,k] * x[k] (if i in I and p >= 1 then 2 * p else q[i+1]) / (a[i,j] + 1.5) \end{verbatim} \subsection{Literais numéricos} Se a expressão numérica primária é um literal numérico, o valor resultante é óbvio. % If the primary numeric expression is a numeric literal, the resultant % value is obvious. \subsection{Ãndices} Se a expressão numérica primária é um índice, o valor resultante é o valor corrente atribuído àquele índice. % If the primary numeric expression is a dummy index, the resultant value % is current value assigned to that dummy index. \subsection{Parâmetros não-indexados} Se a expressão numérica primária é um parâmetro não-indexado (que deve ser 0-dimensional), o valor resultante é o valor do parâmetro. % If the primary numeric expression is an unsubscripted parameter (which % should be 0-dimen\-sional), the resultant value is the value of that % parameter. \subsection{Parâmetros indexados} A expressão numérica primária, que se refere ao parâmetro indexado, possui a seguinte forma sintática: % The primary numeric expression, which refers to a subscripted % parameter, has the following syntactic form: $$ \mbox{{\it nome}{\tt[}$i_1${\tt,} $i_2${\tt,} \dots{\tt,} $i_n${\tt]}} $$ onde {\it nome} é o nome simbólico do parâmetro e $i_1$, $i_2$, \dots, $i_n$ são subíndices. Cada subíndice deve ser uma expressão numérica ou simbólica. O número de subíndices na lista de subíndices deve ser o mesmo da dimensão do parâmetro com o qual a lista de subíndices está associada. Os valores reais das expressões de subíndice são usadas para identificar um membro particular do parâmetro que determina o valor resultante da expressão primária. % where {\it name} is the symbolic name of the parameter, $i_1$, $i_2$, % \dots, $i_n$ are subscripts. % % Each subscript should be a numeric or symbolic expression. The number % of subscripts in the subscript list should be the same as the dimension % of the parameter with which the subscript list is associated. % % Actual values of subscript expressions are used to identify % a particular member of the parameter that determines the resultant % value of the primary expression. \newpage \subsection{Funções de referência} Em MathProg existem as seguintes funções internas, que podem ser usadas como expressões numéricas: % In MathProg there exist the following built-in functions which may be % used in numeric expressions: \begin{tabular}{@{}p{112pt}p{328pt}@{}} {\tt abs(}$x${\tt)}&$|x|$, valor absoluto de $x$\\ {\tt atan(}$x${\tt)}&$\arctan x$, valor principal do arco tangente de $x$ (em radianos)\\ {\tt atan(}$y${\tt,} $x${\tt)}&$\arctan y/x$, valor principal do arco tangente de $y/x$ (em radianos). Neste caso, os sinais de ambos argumentos $y$ e $x$ são usados para determinar o quadrante do valor resultante\\ {\tt card(}$X${\tt)}&$|X|$, cardinalidade (o número de elementos) do conjunto $X$\\ {\tt ceil(}$x${\tt)}&$\lceil x\rceil$, menor inteiro não menor que $x$ (``teto de $x$'')\\ {\tt cos(}$x${\tt)}&$\cos x$, cosseno de $x$ (em radianos)\\ {\tt exp(}$x${\tt)}&$e^x$, exponencial de $x$ na base-$e$\\ {\tt floor(}$x${\tt)}&$\lfloor x\rfloor$, maior inteiro não maior que $x$ (``piso de $x$'')\\ {\tt gmtime()}&o número de segundos decorridos deste 00:00:00 de~01~de~Jan de 1970, Tempo Universal Coordenado (detalhes na Seção \ref{gmtime}, página \pageref{gmtime})\\ {\tt length(}$s${\tt)}&$|s|$, comprimento da cadeia de caracteres $s$\\ {\tt log(}$x${\tt)}&$\log x$, logaritmo natural de $x$\\ {\tt log10(}$x${\tt)}&$\log_{10}x$, logaritmo comum (decimal) de $x$\\ {\tt max(}$x_1${\tt,} $x_2${\tt,} \dots{\tt,} $x_n${\tt)}&o maior dos valores $x_1$, $x_2$, \dots, $x_n$\\ {\tt min(}$x_1${\tt,} $x_2${\tt,} \dots{\tt,} $x_n${\tt)}&o menor dos valores $x_1$, $x_2$, \dots, $x_n$\\ {\tt round(}$x${\tt)}&arrendondamento de $x$ ao inteiro mais próximo\\ {\tt round(}$x${\tt,} $n${\tt)}&arrendondamento de $x$ a $n$ dígitos decimais\\ {\tt sin(}$x${\tt)}&$\sin x$, seno de $x$ (em radianos)\\ {\tt sqrt(}$x${\tt)}&$\sqrt{x}$, raiz quadrada não-negativa de $x$\\ {\tt str2time(}$s${\tt,} $f${\tt)}&conversão de uma cadeia de caracteres $s$ ao tempo calendário (detalhes na Seção \ref{str2time}, página \pageref{str2time})\\ {\tt trunc(}$x${\tt)}&truncado de $x$ ao inteiro mais próximo\\ {\tt trunc(}$x${\tt,} $n${\tt)}&truncado de $x$ a $n$ dígitos decimais\\ {\tt Irand224()}&gera inteiro pseudo-aleatório uniformemente distribuído em $[0,2^{24})$\\ {\tt Uniform01()}&gera número pseudo-aleatório uniformemente distribuído em $[0,1)$\\ {\tt Uniform(}$a${\tt,} $b${\tt)}&gera número pseudo-aleatório uniformemente distribuído em $[a,b)$\\ {\tt Normal01()}&gera variável Gaussiana pseudo-aleatória com $\mu=0$ e $\sigma=1$\\ {\tt Normal(}$\mu${\tt,} $\sigma${\tt)}&gera variável Gaussiana pseudo-aleatória com $\mu$ e $\sigma$ dados\\ \end{tabular} % \begin{tabular}{@{}p{112pt}p{328pt}@{}} % {\tt abs(}$x${\tt)}&$|x|$, absolute value of $x$\\ % {\tt atan(}$x${\tt)}&$\arctan x$, principal value of the arc tangent of % $x$ (in radians)\\ % {\tt atan(}$y${\tt,} $x${\tt)}&$\arctan y/x$, principal value of the % arc tangent of $y/x$ (in radians). In this case the signs of both % arguments $y$ and $x$ are used to determine the quadrant of the % resultant value\\ % {\tt card(}$X${\tt)}&$|X|$, cardinality (the number of elements) of % set $X$\\ % {\tt ceil(}$x${\tt)}&$\lceil x\rceil$, smallest integer not less than % $x$ (``ceiling of $x$'')\\ % {\tt cos(}$x${\tt)}&$\cos x$, cosine of $x$ (in radians)\\ % {\tt exp(}$x${\tt)}&$e^x$, base-$e$ exponential of $x$\\ % {\tt floor(}$x${\tt)}&$\lfloor x\rfloor$, largest integer not greater % than $x$ (``floor of $x$'')\\ % {\tt gmtime()}&the number of seconds elapsed since 00:00:00~Jan~1, 1970, % Coordinated Universal Time (for details see Section \ref{gmtime}, % page \pageref{gmtime})\\ % {\tt length(}$s${\tt)}&$|s|$, length of character string $s$\\ % {\tt log(}$x${\tt)}&$\log x$, natural logarithm of $x$\\ % {\tt log10(}$x${\tt)}&$\log_{10}x$, common (decimal) logarithm of $x$\\ % {\tt max(}$x_1${\tt,} $x_2${\tt,} \dots{\tt,} $x_n${\tt)}&the largest % of values $x_1$, $x_2$, \dots, $x_n$\\ % {\tt min(}$x_1${\tt,} $x_2${\tt,} \dots{\tt,} $x_n${\tt)}&the smallest % of values $x_1$, $x_2$, \dots, $x_n$\\ % {\tt round(}$x${\tt)}&rounding $x$ to nearest integer\\ % {\tt round(}$x${\tt,} $n${\tt)}&rounding $x$ to $n$ fractional decimal % digits\\ % {\tt sin(}$x${\tt)}&$\sin x$, sine of $x$ (in radians)\\ % {\tt sqrt(}$x${\tt)}&$\sqrt{x}$, non-negative square root of $x$\\ % {\tt str2time(}$s${\tt,} $f${\tt)}&converting character string $s$ to % calendar time (for details see Section \ref{str2time}, page % \pageref{str2time})\\ % {\tt trunc(}$x${\tt)}&truncating $x$ to nearest integer\\ % {\tt trunc(}$x${\tt,} $n${\tt)}&truncating $x$ to $n$ fractional % decimal digits\\ % {\tt Irand224()}&generating pseudo-random integer uniformly distributed % in $[0,2^{24})$\\ % {\tt Uniform01()}&generating pseudo-random number uniformly distributed % in $[0,1)$\\ % {\tt Uniform(}$a${\tt,} $b${\tt)}&generating pseudo-random number % uniformly distributed in $[a,b)$\\ % {\tt Normal01()}&generating Gaussian pseudo-random variate with % $\mu=0$ and $\sigma=1$\\ % {\tt Normal(}$\mu${\tt,} $\sigma${\tt)}&generating Gaussian % pseudo-random variate with given $\mu$ and $\sigma$\\ % \end{tabular} Os argumentos de todas as funções internas, exceto {\tt card}, {\tt length}, e {\tt str2time}, devem ser \linebreak expressões numéricas. O argumento de {\tt card} deve ser uma expressão de conjunto. O argumento de {\tt length} e ambos argumentos de {\tt str2time} devem ser expressões simbólicas. O valor resultante da expressão numérica, que é uma função de referência, é o resultado da aplicação da função ao(s) seu(s) argumento(s). Note que cada função geradora de números pseudo-aleatórios possui um argumento latente (i.e., algum estado interno), que é alterado sempre que função é aplicada. Assim, se a função é aplicada repetidamente mesmos aos argumentos idênticos, devido ao efeito secundário, sempre se produzirão valores resultantes diferentes. % Arguments of all built-in functions, except {\tt card}, {\tt length}, % and {\tt str2time}, should be numeric expressions. The argument of % {\tt card} should be a set expression. The argument of {\tt length} and % both arguments of {\tt str2time} should be symbolic expressions. % % The resultant value of the numeric expression, which is a function % reference, is the result of applying the function to its argument(s). % % Note that each pseudo-random generator function has a latent argument % (i.e. some internal state), which is changed whenever the function has % been applied. Thus, if the function is applied repeatedly even to % identical arguments, due to the side effect different resultant values % are always produced. \newpage \subsection{Expressões iteradas} \label{itexpr} Uma {\it expressão numérica iterada} é uma expressão numérica primária, que possui a seguinte forma sintática: $$\mbox{\it operador-iterado expressão-indexada integrando}$$ onde o {\it operador-iterado} é o nome simbólico do operador de iteração a ser executado (veja abaixo), {\it expressão-indexada} é uma expressão indexada que introduz índices e controla a iteração e {\it integrando} é uma expressão numérica que participa da operação. \noindent Em MathProg existem quatro operadores iterados, que podem ser usados em expressões numéricas: % An {\it iterated numeric expression} is a primary numeric expression, % which has the following syntactic form: % $$\mbox{\it iterated-operator indexing-expression integrand}$$ % where {\it iterated-operator} is the symbolic name of the iterated % operator to be performed (see below), {\it indexing-expression} is an % indexing expression which introduces dummy indices and controls % iterating, {\it integrand} is a numeric expression that participates in % the operation. % % In MathProg there exist four iterated operators, which may be used in % numeric expressions: {\def\arraystretch{2} \noindent\hfil \begin{tabular}{@{}lll@{}} {\tt sum}&somatório&$\displaystyle\sum_{(i_1,\dots,i_n)\in\Delta} f(i_1,\dots,i_n)$\\ {\tt prod}&produtório&$\displaystyle\prod_{(i_1,\dots,i_n)\in\Delta} f(i_1,\dots,i_n)$\\ {\tt min}&mínimo&$\displaystyle\min_{(i_1,\dots,i_n)\in\Delta} f(i_1,\dots,i_n)$\\ {\tt max}&máximo&$\displaystyle\max_{(i_1,\dots,i_n)\in\Delta} f(i_1,\dots,i_n)$\\ \end{tabular} } % {\def\arraystretch{2} % \noindent\hfil % \begin{tabular}{@{}lll@{}} % {\tt sum}&summation&$\displaystyle\sum_{(i_1,\dots,i_n)\in\Delta} % f(i_1,\dots,i_n)$\\ % {\tt prod}&production&$\displaystyle\prod_{(i_1,\dots,i_n)\in\Delta} % f(i_1,\dots,i_n)$\\ % {\tt min}&minimum&$\displaystyle\min_{(i_1,\dots,i_n)\in\Delta} % f(i_1,\dots,i_n)$\\ % {\tt max}&maximum&$\displaystyle\max_{(i_1,\dots,i_n)\in\Delta} % f(i_1,\dots,i_n)$\\ % \end{tabular} % } \noindent onde $i_1$, \dots, $i_n$ são índices introduzidos nas expressões indexadas, $\Delta$ é o domínio, um conjunto de $n$-tuplas especificado pela expressão indexada que define valores particulares atribuído aos índices ao executar a operação iterada e $f(i_1,\dots,i_n)$ é o integrando, uma expressão numérica cujo valor resultante depende dos índices. O valor resultante de uma expressão numérica iterada é o resultado da aplicação do operador iterado ao seu integrando por todas as $n$-tuplas contidas no domínio. % \noindent where $i_1$, \dots, $i_n$ are dummy indices introduced in % the indexing expression, $\Delta$ is the domain, a set of $n$-tuples % specified by the indexing expression which defines particular values % assigned to the dummy indices on performing the iterated operation, % $f(i_1,\dots,i_n)$ is the integrand, a numeric expression whose % resultant value depends on the dummy indices. % % The resultant value of an iterated numeric expression is the result of % applying of the iterated operator to its integrand over all $n$-tuples % contained in the domain. \subsection{Expressões condicionais} \label{ifthen} Uma {\it expressão numérica condicional} é uma expressão numérica primária que possui uma das seguintes formas sintáticas: % A {\it conditional numeric expression} is a primary numeric expression, % which has one of the following two syntactic forms: $$ {\def\arraystretch{1.4} \begin{array}{l} \mbox{{\tt if} $b$ {\tt then} $x$ {\tt else} $y$}\\ \mbox{{\tt if} $b$ {\tt then} $x$}\\ \end{array} } $$ onde $b$ é uma expressão lógica, enquanto que $x$ e $y$ são expressões numéricas. % where $b$ is an logical expression, $x$ and $y$ are numeric % expressions. O valor resultante da expressão condicional depende do valor da expressão lógica que segue a palavra-chave {\tt if}. Se ela recebe o valor {\it verdadeiro}, o valor da expressão condicional é o valor da expressão que segue a palavra-chave {\tt then}. Caso contrário, se a expressão lógica recebe o valor {\it falso}, o valor da expressão condicional é o valor da expressão que segue a palavra-chave {\it else}. Se ocorre a segunda forma sintática da expressão condicional, a reduzida, e a expressão lógica recebe o valor {\it falso}, então o valor resultante da expressão condicional é zero. % The resultant value of the conditional expression depends on the value % of the logical expression that follows the keyword {\tt if}. If it % takes on the value {\it true}, the value of the conditional expression % is the value of the expression that follows the keyword {\tt then}. % Otherwise, if the logical expression takes on the value {\it false}, % the value of the conditional expression is the value of the expression % that follows the keyword {\it else}. If the second, reduced form of the % conditional expression is used and the logical expression takes on the % value {\it false}, the resultant value of the conditional expression is % zero. \newpage \subsection{Expressões parentizadas} Qualquer expressão numérica pode ser cercada por parênteses, o que as torna sintaticamente uma expressão numérica primária. Parênteses podem ser usados em expressões numéricas, como em álgebra, para especificar a ordem desejada na qual as operações devem ser realizadas. Quando se usam parênteses, a expressão entre parênteses é avaliada antes e seu o valor resultante é usado. O valor resultante de uma expressão parentizada é o mesmo valor de uma expressão cercada entre parênteses. % Any numeric expression may be enclosed in parentheses that % syntactically makes it a primary numeric expression. % % Parentheses may be used in numeric expressions, as in algebra, to % specify the desired order in which operations are to be performed. % Where parentheses are used, the expression within the parentheses is % evaluated before the resultant value is used. % % The resultant value of the parenthesized expression is the same as the % value of the expression enclosed within parentheses. \subsection{Operadores aritméticos} Em MathProg exitem os seguintes operadores aritméticos, que podem ser usados em expressões numéricas: % In MathProg there exist the following arithmetic operators, which may % be used in numeric expressions: \begin{tabular}{@{}ll@{}} {\tt +} $x$&mais unário\\ {\tt -} $x$&menos unário\\ $x$ {\tt +} $y$&adição\\ $x$ {\tt -} $y$&subtração\\ $x$ {\tt less} $y$&diferença positiva (se $x1$, a segunda forma deve ser usada. % The number of indices in the indexing entry should be the same as the % dimension of the basic set $S$, i.e. if $S$ consists of 1-tuples, the % first form should be used, and if $S$ consists of $n$-tuples, where % $n>1$, the second form should be used. Se a primeira forma da entrada indexante é usada, o índice $i$ pode ser apenas um índice (veja mais adiante). Se a segunda forma é utilizada, os índices $i_1$, $i_2$, \dots, $i_n$ podem ser tanto índices como alguma expressão numérica ou simbólica, em que pelo menos um dos índices deve ser um índice. Na terceira, a forma reduzida da entrada indexante possui o mesmo efeito se houver $i$ (se $S$ é 1-dimensional) ou $i_1$, $i_2$, \dots, $i_n$ (se $S$ é $n$-dimensional) onde todos são especificados como índices. % If the first form of the indexing entry is used, the index $i$ can be % a dummy index only (see below). If the second form is used, the indices % $i_1$, $i_2$, \dots, $i_n$ can be either dummy indices or some numeric % or symbolic expressions, where at least one index should be a dummy % index. The third, reduced form of the indexing entry has the same % effect as if there were $i$ (if $S$ is 1-dimensional) or % $i_1$, $i_2$, \dots, $i_n$ (if $S$ is $n$-dimensional) all specified as % dummy indices. Um {\it índice} é um objeto auxiliar do modelo, que atua como uma variável individual. Os valores atribuídos aos índices são componentes das $n$-tuplas dos conjuntos básicos, i.e., algumas quantidades numéricas e simbólicas. % A {\it dummy index} is an auxiliary model object, which acts like an % individual variable. Values assigned to dummy indices are components of % $n$-tuples from basic sets, i.e. some numeric and symbolic quantities. Com propósitos de referência, índices podem ter nomes simbólicos. No entanto, diferentemente de outros objetos de modelo (conjuntos, parâmetros, etc.) índices não precisam ser \linebreak explicitamente declarados. Cada nome simbólico {\it não-declarado} usado na posição indexante de uma entrada indexante é reconhecida como o nome simbólico do índice correspondente. % For referencing purposes dummy indices can be provided with symbolic % names. However, unlike other model objects (sets, parameters, etc.) % dummy indices need not be explicitly declared. Each {\it undeclared} % symbolic name being used in the indexing position of an indexing entry % is recognized as the symbolic name of corresponding dummy index. Os nomes simbólicos dos índices são válidos somente dentro do escopo da expressão indexante, onde o índice foi inserido. Além do escopo, os índices são completamente inacessíveis, de modo que os mesmos nomes simbólicos podem ser usados para outros propósitos, em particular, para representar índices em outras expressões indexantes. % Symbolic names of dummy indices are valid only within the scope of the % indexing expression, where the dummy indices were introduced. Beyond % the scope the dummy indices are completely inaccessible, so the same % symbolic names may be used for other purposes, in particular, to % represent dummy indices in other indexing expressions. O escopo da expressão indexante, em que declarações implícitas de índices são válidas, depende do contexto em que a expressão indexante é usada: % The scope of indexing expression, where implicit declarations of dummy % indices are valid, depends on the context, in which the indexing % expression is used: \vspace*{-8pt} \begin{itemize} \item Se a expressão indexante é usada em um operador-iterado, seu escopo se estende até o final do integrando. \item Se a expressão indexante é usada como uma expressão de conjunto primária, seu escopo de estende até o final desta expressão indexante. \item Se a expressão indexante é usada para definir o domínio do subíndice na declaração de alguns objetos de modelo, seu escopo se estende até o final da declaração correspondente. \end{itemize} % \begin{itemize} % \item If the indexing expression is used in iterated operator, its % scope extends until the end of the integrand. % \item If the indexing expression is used as a primary set expression, % its scope extends until the end of that indexing expression. % \item If the indexing expression is used to define the subscript domain % in declarations of some model objects, its scope extends until the end % of the corresponding statement. % \end{itemize} \vspace*{-8pt} O mecanismo de indexação implementado para indexar expressões é melhor explicado por alguns exemplos discutidos abaixo. Sejam três conjuntos: % The indexing mechanism implemented by means of indexing expressions is % best explained by some examples discussed below. % % Let there be given three sets: $$ {\def\arraystretch{1.4} \begin{array}{l} A=\{4,7,9\},\\ B=\{(1,Jan),(1,Fev),(2,Mar),(2,Abr),(3,Mai),(3,Jun)\},\\ C=\{a,b,c\},\\ \end{array} } $$ % $$ % {\def\arraystretch{1.4} % \begin{array}{l} % A=\{4,7,9\},\\ % B=\{(1,Jan),(1,Feb),(2,Mar),(2,Apr),(3,May),(3,Jun)\},\\ % C=\{a,b,c\},\\ % \end{array} % } % $$ onde $A$ e $C$ consistem de 1-tuplas (singletos), $B$ consiste de 2-tuplas (dobletes). Considere a seguinte expressão indexante: $$\mbox{{\tt\{i in A, (j,k) in B, l in C\}}}$$ onde {\tt i}, {\tt j}, {\tt k}, e {\tt l} são índices. % where $A$ and $C$ consist of 1-tuples (singlets), $B$ consists of % 2-tuples (doublets). Consider the following indexing expression: % $$\mbox{{\tt\{i in A, (j,k) in B, l in C\}}}$$ % where {\tt i}, {\tt j}, {\tt k}, and {\tt l} are dummy indices. \newpage Embora MathProg não seja uma linguagem procedural, para qualquer expressão indexante uma descrição algorítmica equivalente pode ser dada. Em particular, a descrição algorítmica da expressão indexante acima poderia ser vista como segue: % Although MathProg is not a procedural language, for any indexing % expression an equivalent algorithmic description can be given. In % particular, the algorithmic description of the indexing expression % above could look like follows: \noindent\hfil \begin{tabular}{@{}l@{}} {\bf para todo} $i\in A$ {\bf faça}\\ \hspace{16pt}{\bf para todo} $(j,k)\in B$ {\bf faça}\\ \hspace{32pt}{\bf para todo} $l\in C$ {\bf faça}\\ \hspace{48pt}{\it ação};\\ \end{tabular} % \noindent\hfil % \begin{tabular}{@{}l@{}} % {\bf for all} $i\in A$ {\bf do}\\ % \hspace{16pt}{\bf for all} $(j,k)\in B$ {\bf do}\\ % \hspace{32pt}{\bf for all} $l\in C$ {\bf do}\\ % \hspace{48pt}{\it action};\\ % \end{tabular} \noindent onde os índices $i$, $j$, $k$, $l$ são consecutivamente atribuídos aos componentes correspondentes das $n$-tuplas dos conjuntos básicos $A$, $B$, $C$, e {\it ação} é alguma ação que dependa do contexto no qual a expressão indexante é usada. Por exemplo, se a ação fosse imprimir os valores atuais dos índices, a impressão seria vista como segue: % \noindent where the dummy indices $i$, $j$, $k$, $l$ are consecutively % assigned corresponding components of $n$-tuples from the basic sets $A$, % $B$, $C$, and {\it action} is some action that depends on the context, % where the indexing expression is used. For example, if the action were % printing current values of dummy indices, the printout would look like % follows: \noindent\hfil \begin{tabular}{@{}llll@{}} $i=4$&$j=1$&$k=Jan$&$l=a$\\ $i=4$&$j=1$&$k=Jan$&$l=b$\\ $i=4$&$j=1$&$k=Jan$&$l=c$\\ $i=4$&$j=1$&$k=Fev$&$l=a$\\ $i=4$&$j=1$&$k=Fev$&$l=b$\\ \multicolumn{4}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}\\ $i=9$&$j=3$&$k=Jun$&$l=b$\\ $i=9$&$j=3$&$k=Jun$&$l=c$\\ \end{tabular} % \noindent\hfil % \begin{tabular}{@{}llll@{}} % $i=4$&$j=1$&$k=Jan$&$l=a$\\ % $i=4$&$j=1$&$k=Jan$&$l=b$\\ % $i=4$&$j=1$&$k=Jan$&$l=c$\\ % $i=4$&$j=1$&$k=Feb$&$l=a$\\ % $i=4$&$j=1$&$k=Feb$&$l=b$\\ % \multicolumn{4}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}\\ % $i=9$&$j=3$&$k=Jun$&$l=b$\\ % $i=9$&$j=3$&$k=Jun$&$l=c$\\ % \end{tabular} Seja o exemplo da expressão indexante usado na seguinte operação iterada: $$\mbox{{\tt sum\{i in A, (j,k) in B, l in C\} p[i,j,k,l]}}$$ onde {\tt p} é uma parâmetro numérico 4-dimensional ou alguma expressão numérica cujo valor resultante dependa de {\tt i}, {\tt j}, {\tt k} e {\tt l}. Neste caso, a ação é o somatório, de forma que o valor resultante da expressão numérica primária é: $$\sum_{i\in A,(j,k)\in B,l\in C}(p_{ijkl}).$$ % Let the example indexing expression be used in the following iterated % operation: % $$\mbox{{\tt sum\{i in A, (j,k) in B, l in C\} p[i,j,k,l]}}$$ % where {\tt p} is a 4-dimensional numeric parameter or some numeric % expression whose resultant value depends on {\tt i}, {\tt j}, {\tt k}, % and {\tt l}. In this case the action is summation, so the resultant % value of the primary numeric expression is: % $$\sum_{i\in A,(j,k)\in B,l\in C}(p_{ijkl}).$$ Agora seja a expressão indexante do exemplo usada como uma expressão de conjunto primária. Neste caso, a ação é reunir todas as 4-tuplas (quádruplas) da forma $(i,j,k,l)$ em um conjunto, de forma que o valor resultante de tal operação é simplesmente o produto Cartesiano dos conjuntos básicos: $$A\times B\times C=\{(i,j,k,l):i\in A,(j,k)\in B,l\in C\}.$$ Note que neste caso, a mesma expressão indexante pode ser escrita na forma reduzida: $$\mbox{{\tt\{A, B, C\}}}$$ pois os índices $i$, $j$, $k$ e $l$ não são referenciados, portanto, seus nomes simbólicos não precisam ser especificados. % Now let the example indexing expression be used as a primary set % expression. In this case the action is gathering all 4-tuples % (quadruplets) of the form $(i,j,k,l)$ in one set, so the resultant % value of such operation is simply the Cartesian product of the basic % sets: % $$A\times B\times C=\{(i,j,k,l):i\in A,(j,k)\in B,l\in C\}.$$ % Note that in this case the same indexing expression might be written in % the reduced form: % $$\mbox{{\tt\{A, B, C\}}}$$ % because the dummy indices $i$, $j$, $k$, and $l$ are not referenced and % therefore their symbolic names need not be specified. \newpage Finalmente, seja a expressão indexante do exemplo usada como o domínio do subíndice na declaração de um objeto de modelo 4-dimensional, por exemplo, um parâmetro numérico: % Finally, let the example indexing expression be used as the subscript % domain in the declaration of a 4-dimensional model object, say, % a numeric parameter: $$\mbox{{\tt param p\{i in A, (j,k) in B, l in C\}} \dots {\tt;}}$$ \noindent Neste caso, a ação é gerar os membros do parâmetro, onde cada membro possui a forma $p[i,j,k,l]$. % \noindent In this case the action is generating the parameter members, % where each member has the form $p[i,j,k,l]$. Como mencionado anteriormente, alguns índices da segunda forma das entradas indexantes podem ser expressões numéricas ou simbólicas, não apenas índices. Neste caso, os valores resultantes destas expressões desempenham o papel de algumas condições lógicas para selecionar apenas aquelas $n$-tuplas do produto Cartesiano dos conjuntos básicos que satisfaçam estas condições. % As was said above, some indices in the second form of indexing entries % may be numeric or symbolic expressions, not only dummy indices. In this % case resultant values of such expressions play role of some logical % conditions to select only that $n$-tuples from the Cartesian product of % basic sets that satisfy these conditions. Considere, por exemplo, a seguinte expressão indexante: $$\mbox{{\tt\{i in A, (i-1,k) in B, l in C\}}}$$ onde {\tt i}, {\tt k} e {\tt l} são índices, e {\tt i-1} é uma expressão numérica. A descrição algorítmica desta expressão indexante é a seguinte: % Consider, for example, the following indexing expression: % $$\mbox{{\tt\{i in A, (i-1,k) in B, l in C\}}}$$ % where {\tt i}, {\tt k}, {\tt l} are dummy indices, and {\tt i-1} is % a numeric expression. The algorithmic decsription of this indexing % expression is the following: \noindent\hfil \begin{tabular}{@{}l@{}} {\bf para todo} $i\in A$ {\bf faça}\\ \hspace{16pt}{\bf para todo} $(j,k)\in B$ {\bf e} $j=i-1$ {\bf faça}\\ \hspace{32pt}{\bf para todo} $l\in C$ {\bf faça}\\ \hspace{48pt}{\it ação};\\ \end{tabular} % \noindent\hfil % \begin{tabular}{@{}l@{}} % {\bf for all} $i\in A$ {\bf do}\\ % \hspace{16pt}{\bf for all} $(j,k)\in B$ {\bf and} $j=i-1$ {\bf do}\\ % \hspace{32pt}{\bf for all} $l\in C$ {\bf do}\\ % \hspace{48pt}{\it action};\\ % \end{tabular} \noindent Assim, se esta expressão indexante fosse usada como uma expressão de conjunto primária, o conjunto resultante seira o seguinte: $$\{(4,Mai,a),(4,Mai,b),(4,Mai,c),(4,Jun,a),(4,Jun,b),(4,Jun,c)\}.$$ Deve-se notar que neste caso o conjunto resultante consiste em 3-tuplas, e não de 4-tuplas, porque na expressão indexante não há índice que corresponda ao primeiro componente das 2-tuplas do conjunto $B$. % \noindent Thus, if this indexing expression were used as a primary set % expression, the resultant set would be the following: % $$\{(4,May,a),(4,May,b),(4,May,c),(4,Jun,a),(4,Jun,b),(4,Jun,c)\}.$$ % Should note that in this case the resultant set consists of 3-tuples, % not of 4-tuples, because in the indexing expression there is no dummy % index that corresponds to the first component of 2-tuples from the set % $B$. A regra geral é: o número de componentes de $n$-tuplas definido por uma expressão indexante é o mesmo do número de índices naquela expressão, onde a correspondência entre índices e componentes nas $n$-tuplas no conjunto resultante é posicional, i.e., o primeiro índice corresponde ao primeiro componente, o segundo índice corresponde ao segundo componente, etc. % The general rule is: the number of components of $n$-tuples defined by % an indexing expression is the same as the number of dummy indices in % that expression, where the correspondence between dummy indices and % components on $n$-tuples in the resultant set is positional, i.e. the % first dummy index corresponds to the first component, the second dummy % index corresponds to the second component, etc. Em alguns casos é necessário selecionar um subconjunto do produto Cartesiano de alguns \linebreak conjuntos. Isto pode ser alcançado mediante o emprego de um predicado lógico opcional, que é especificado na expressão indexante. % In some cases it is needed to select a subset from the Cartesian % product of some sets. This may be attained by using an optional logical % predicate, which is specified in the indexing expression. Considere, por exemplo, a seguinte expressão indexante: $$\mbox{{\tt\{i in A, (j,k) in B, l in C: i <= 5 and k <> 'Mar'\}}}$$ onde a expressão lógica após os dois pontos é um predicado. A descrição algorítmica desta expressão indexante é a seguinte: % Consider, for example, the following indexing expression: % $$\mbox{{\tt\{i in A, (j,k) in B, l in C: i <= 5 and k <> 'Mar'\}}}$$ % where the logical expression following the colon is a predicate. The % algorithmic description of this indexing expression is the following: \noindent\hfil \begin{tabular}{@{}l@{}} {\bf para todo} $i\in A$ {\bf faça}\\ \hspace{16pt}{\bf para todo} $(j,k)\in B$ {\bf faça}\\ \hspace{32pt}{\bf para todo} $l\in C$ {\bf faça}\\ \hspace{48pt}{\bf se} $i\leq 5$ {\bf e} $k\neq`Mar'$ {\bf então}\\ \hspace{64pt}{\it ação};\\ \end{tabular} % \noindent\hfil % \begin{tabular}{@{}l@{}} % {\bf for all} $i\in A$ {\bf do}\\ % \hspace{16pt}{\bf for all} $(j,k)\in B$ {\bf do}\\ % \hspace{32pt}{\bf for all} $l\in C$ {\bf do}\\ % \hspace{48pt}{\bf if} $i\leq 5$ {\bf and} $k\neq`Mar'$ {\bf then}\\ % \hspace{64pt}{\it action};\\ % \end{tabular} \noindent Assim, se a expressão indexante fosse usada como uma expressão de conjunto primária, o conjunto resultante seria o seguinte: $$\{(4,1,Jan,a),(4,1,Fev,a),(4,2,Abr,a),\dots,(4,3,Jun,c)\}.$$ Se o predicado não é especificado na expressão indexante assume-se um, que recebe o valor {\it verdadeiro}. % \noindent Thus, if this indexing expression were used as a primary set % expression, the resultant set would be the following: % $$\{(4,1,Jan,a),(4,1,Feb,a),(4,2,Apr,a),\dots,(4,3,Jun,c)\}.$$ % % If no predicate is specified in the indexing expression, one, which % takes on the value {\it true}, is assumed. \section{Expressões de conjunto} Uma {\it expressão de conjunto} é uma regra para calcular um conjunto elementar, i.e., uma coleção de $n$-tuplas, onde os componentes das $n$-tuplas são quantidades numéricas e simbólicas. % A {\it set expression} is a rule for computing an elemental set, i.e. % a collection of $n$-tuples, where components of $n$-tuples are numeric % and symbolic quantities. A expressão de conjunto primária pode ser um conjunto de literais, um conjunto não-indexado, um conjunto indexado, um conjunto ``aritmético'', uma expressão indexante, uma expressão de \linebreak conjunto iterada, uma expressão de conjunto condicional ou outra expressão cercada por \linebreak parênteses. \para{Exemplos} % The primary set expression may be a literal set, unsubscripted set, % subscripted set, ``arithmetic'' set, indexing expression, iterated set % expression, conditional set expression, or another set expression % enclosed in parentheses. % % \para{Examples} \noindent \begin{tabular}{@{}ll@{}} \verb|{(123,'aaa'), (i+1,'bbb'), (j-1,'ccc')}| &(conjunto de literais)\\ \verb|I| &(conjunto não-indexado)\\ \verb|S[i-1,j+1]| &(conjunto indexado)\\ \verb|1..t-1 by 2| &(conjunto ``aritmético'')\\ \verb|{t in 1..T, (t+1,j) in S: (t,j) in F}| &(expressão indexante)\\ \verb|setof{i in I, j in J}(i+1,j-1)| &(expressão de conjunto iterado)\\ \verb|if i < j then S[i,j] else F diff S[i,j]| &(expressão de conjunto condicional)\\ \verb|(1..10 union 21..30)| &(expressão de conjunto parentizado)\\ \end{tabular} % \noindent % \begin{tabular}{@{}ll@{}} % \verb|{(123,'aaa'), (i+1,'bbb'), (j-1,'ccc')}| &(literal set)\\ % \verb|I| &(unsubscripted set)\\ % \verb|S[i-1,j+1]| &(subscripted set)\\ % \verb|1..t-1 by 2| &(``arithmetic'' set)\\ % \verb|{t in 1..T, (t+1,j) in S: (t,j) in F}| &(indexing expression)\\ % \verb|setof{i in I, j in J}(i+1,j-1)| &(iterated set expression)\\ % \verb|if i < j then S[i,j] else F diff S[i,j]| &(conditional set % expression)\\ % \verb|(1..10 union 21..30)| &(parenthesized set expression)\\ % \end{tabular} Expressões de conjuntos mais genéricas contendo duas ou mais expressões de conjunto primárias podem ser construídas usando operadores específicos de conjunto . \para{Exemplos} % More general set expressions containing two or more primary set % expressions may be constructed by using certain set operators. % % \para{Examples} \begin{verbatim} (A union B) inter (I cross J) 1..10 cross (if i < j then {'a', 'b', 'c'} else {'d', 'e', 'f'}) \end{verbatim} \subsection{Conjuntos de literais} Um {\it conjunto de literais} é uma expressão de conjunto primária que possui as duas formas \linebreak sintáticas seguintes: % A {\it literal set} is a primary set expression, which has the % following two syntactic forms: $$ {\def\arraystretch{1.4} \begin{array}{l} \mbox{{\tt\{}$e_1${\tt,} $e_2${\tt,} \dots{\tt,} $e_m${\tt\}}}\\ \mbox{{\tt\{(}$e_{11}${\tt,} \dots{\tt,} $e_{1n}${\tt),} {\tt(}$e_{21}${\tt,} \dots{\tt,} $e_{2n}${\tt),} \dots{\tt,} {\tt(}$e_{m1}${\tt,} \dots{\tt,} $e_{mn}${\tt)\}}}\\ \end{array} } $$ % $$ % {\def\arraystretch{1.4} % \begin{array}{l} % \mbox{{\tt\{}$e_1${\tt,} $e_2${\tt,} \dots{\tt,} $e_m${\tt\}}}\\ % \mbox{{\tt\{(}$e_{11}${\tt,} \dots{\tt,} $e_{1n}${\tt),} % {\tt(}$e_{21}${\tt,} \dots{\tt,} $e_{2n}${\tt),} \dots{\tt,} % {\tt(}$e_{m1}${\tt,} \dots{\tt,} $e_{mn}${\tt)\}}}\\ % \end{array} % } % $$ onde $e_1$, \dots, $e_m$, $e_{11}$, \dots, $e_{mn}$ são expressões numéricas ou simbólicas. Se a primeira forma é adotada, o conjunto resultante consiste de 1-tuplas (singletos) enumerados entre as chaves. É permitido especificar um conjunto vazio como {\tt\{\ \}}, que não possui 1-tuplas. Se a segunda forma é adotada, o conjunto resultante consiste de $n$-tuplas enumeradas entre as chaves, onde uma $n$-tupla particular consiste nos componentes correspondentes enumerados entre parênteses. Todas as $n$-tuplas devem ter o mesmo número de componentes. % where $e_1$, \dots, $e_m$, $e_{11}$, \dots, $e_{mn}$ are numeric or % symbolic expressions. % % If the first form is used, the resultant set consists of 1-tuples % (singlets) enumerated within the curly braces. It is allowed to specify % an empty set as {\tt\{\ \}}, which has no 1-tuples. If the second form % is used, the resultant set consists of $n$-tuples enumerated within the % curly braces, where a particular $n$-tuple consists of corresponding % components enumerated within the parentheses. All $n$-tuples should % have the same number of components. \subsection{Conjuntos não-indexados} Se a expressão de conjunto primária é um conjunto não-indexado (que deve ser 0-dimensional), o conjunto resultante é um conjunto elementar associado com o objeto conjunto correspondente. % If the primary set expression is an unsubscripted set (which should be % 0-dimen\-sional), the resultant set is an elemental set associated with % the corresponding set object. \subsection{Conjuntos indexados} A expressão de conjunto primária, que se refere a um conjunto indexado, tem a seguinte forma sintática: $$\mbox{{\it nome}{\tt[}$i_1${\tt,} $i_2${\tt,} \dots{\tt,} $i_n${\tt]}}$$ onde {\it nome} é o nome simbólico do objeto conjunto e $i_1$, $i_2$, \dots, $i_n$ são subíndices. % The primary set expression, which refers to a subscripted set, has the % following syntactic form: % $$\mbox{{\it name}{\tt[}$i_1${\tt,} $i_2${\tt,} \dots{\tt,} % $i_n${\tt]}}$$ % where {\it name} is the symbolic name of the set object, $i_1$, $i_2$, % \dots, $i_n$ are subscripts. Cada subíndice deve ser uma expressão numérica ou simbólica. O número de subíndices nas lista de subíndices deve ser o mesmo da dimensão do objeto conjunto com o qual as lista de subíndice está associada. Os valores correntes das expressões de subíndices são usados para identificar um membro \linebreak particular do objeto conjunto que determina o conjunto resultante. % Each subscript should be a numeric or symbolic expression. The number % of subscripts in the subscript list should be the same as the dimension % of the set object with which the subscript list is associated. % % Actual values of subscript expressions are used to identify a % particular member of the set object that determines the resultant set. \subsection{Conjuntos ``aritméticos''} A expressão de conjunto primária que constitui um conjunto ``aritmético'', possui as duas formas sintáticas seguintes: % The primary set expression, which is an ``arithmetic'' set, has the % following two syntactic forms: $$ {\def\arraystretch{1.4} \begin{array}{l} \mbox{$t_0$ {\tt..} $t_1$ {\tt by} $\delta t$}\\ \mbox{$t_0$ {\tt..} $t_1$}\\ \end{array} } $$ onde $t_0$, $t_1$, e $\delta t$ são expressões numéricas (o valor de $\delta t$ não deve ser zero). A segunda forma é equivalente a primeira forma, onde $\delta t=1$. Se $\delta t>0$, o conjunto resultante é determinado como segue: $$\{t:\exists k\in{\cal Z}(t=t_0+k\delta t,\ t_0\leq t\leq t_1)\}.$$ Caso contrário, se $\delta t<0$, o conjunto resultante é determinado como segue: $$\{t:\exists k\in{\cal Z}(t=t_0+k\delta t,\ t_1\leq t\leq t_0)\}.$$ % $$ % {\def\arraystretch{1.4} % \begin{array}{l} % \mbox{$t_0$ {\tt..} $t_1$ {\tt by} $\delta t$}\\ % \mbox{$t_0$ {\tt..} $t_1$}\\ % \end{array} % } % $$ % where $t_0$, $t_1$, and $\delta t$ are numeric expressions (the value % of $\delta t$ should not be zero). The second form is equivalent to the % first form, where $\delta t=1$. % % If $\delta t>0$, the resultant set is determined as follows: % $$\{t:\exists k\in{\cal Z}(t=t_0+k\delta t,\ t_0\leq t\leq t_1)\}.$$ % Otherwise, if $\delta t<0$, the resultant set is determined as follows: % $$\{t:\exists k\in{\cal Z}(t=t_0+k\delta t,\ t_1\leq t\leq t_0)\}.$$ \subsection{Expressões indexantes} Se a expressão primária é uma expressão indexante, o conjunto resultante é determinado como descrito anteriormente, na Seção \ref{indexing}, página \pageref{indexing}. % If the primary set expression is an indexing expression, the resultant % set is determined as described above in Section \ref{indexing}, page % \pageref{indexing}. \newpage \subsection{Expressões iteradas} Uma {\it expressão de conjunto iterada} é uma expressão de conjunto primária, que possui a seguinte forma sintática: $$\mbox{{\tt setof} {\it expressão-indexante} {\it integrando}}$$ onde {\it expressão-indexante} é uma expressão indexante, que introduz índices e controla a iteração, {\it integrando} é tanto uma expressão numérica ou simbólica individual, como uma lista de expressões numéricas ou simbólicas separadas por vírgula e cercadas entre parênteses. % An {\it iterated set expression} is a primary set expression, which has % the following syntactic form: % $$\mbox{{\tt setof} {\it indexing-expression} {\it integrand}}$$ % where {\it indexing-expression} is an indexing expression, which % introduces dummy indices and controls iterating, {\it integrand} is % either a single numeric or symbolic expression or a list of numeric and % symbolic expressions separated by commae and enclosed in parentheses. Se o integrando é uma expressão numérica ou simbólica individual, o conjunto resultante consiste de 1-tuplas, sendo determinado como segue: $$\{x:(i_1,\dots,i_n)\in\Delta\},$$ \noindent onde $x$ é um valor do integrando, $i_1$, \dots, $i_n$ são índices introduzidos na expressão indexante, $\Delta$ é o domínio, um conjunto de $n$-tuplas especificado pela expressão indexante que define valores particulares atribuídos aos índices ao realizar a operação de iteração. % If the integrand is a single numeric or symbolic expression, the % resultant set consists of 1-tuples and is determined as follows: % $$\{x:(i_1,\dots,i_n)\in\Delta\},$$ % \noindent where $x$ is a value of the integrand, $i_1$, \dots, $i_n$ % are dummy indices introduced in the indexing expression, $\Delta$ is % the domain, a set of $n$-tuples specified by the indexing expression, % which defines particular values assigned to the dummy indices on % performing the iterated operation. Se o integrando é uma lista contendo $m$ expressões numéricas e simbólicas, o conjunto resultante consiste de $m$-tuplas, sendo determinado como segue: $$\{(x_1,\dots,x_m):(i_1,\dots,i_n)\in\Delta\},$$ onde $x_1$, \dots, $x_m$ são valores das expressões na lista de integrandos, $i_1$, \dots, $i_n$ e $\Delta$ possuem o mesmo significado anterior. % If the integrand is a list containing $m$ numeric and symbolic % expressions, the resultant set consists of $m$-tuples and is determined % as follows: % $$\{(x_1,\dots,x_m):(i_1,\dots,i_n)\in\Delta\},$$ % where $x_1$, \dots, $x_m$ are values of the expressions in the % integrand list, $i_1$, \dots, $i_n$ and $\Delta$ have the same meaning % as above. \subsection{Expressões condicionais} Uma {\it expressão de conjunto condicional} é uma expressão de conjunto primária que possui a seguinte forma sintática: $$\mbox{{\tt if} $b$ {\tt then} $X$ {\tt else} $Y$}$$ onde $b$ é uma expressão lógica, $X$ e $Y$ são expressões de conjunto, que devem definir conjuntos da mesma dimensão. % A {\it conditional set expression} is a primary set expression that has % the following syntactic form: % $$\mbox{{\tt if} $b$ {\tt then} $X$ {\tt else} $Y$}$$ % where $b$ is an logical expression, $X$ and $Y$ are set expressions, % which should define sets of the same dimension. O valor resultante da expressão condicional depende do valor da expressão lógica que segue a palavra-chave {\tt if}. Se ela recebe o valor {\it verdadeiro}, o conjunto resultante é o valor da expressão que segue a palavra-chave {\tt then}. Caso contrário, se a expressão lógica recebe o valor {\it falso}, o conjunto resultante é o valor da expressão que segue a palavra-chave {\tt else}. % The resultant value of the conditional expression depends on the value % of the logical expression that follows the keyword {\tt if}. If it % takes on the value {\it true}, the resultant set is the value of the % expression that follows the keyword {\tt then}. Otherwise, if the % logical expression takes on the value {\it false}, the resultant set is % the value of the expression that follows the keyword {\tt else}. \subsection{Expressões parentizadas} Qualquer expressão de conjunto pode ser cercada entre parênteses, o que as tornam \linebreak sintaticamente uma expressão de conjunto primária. Parênteses podem ser usados em expressões de conjunto, como em álgebra, para especificar a ordem desejada nas quais as operações devem ser executadas. Quando se usam parênteses, a expressão entre parênteses é avaliada antes que o valor resultante seja usado. O valor resultante de uma expressão parentizada é idêntico ao valor da expressão cercada entre parênteses. % Any set expression may be enclosed in parentheses that syntactically % makes it a primary set expression. % % Parentheses may be used in set expressions, as in algebra, to specify % the desired order in which operations are to be performed. Where % parentheses are used, the expression within the parentheses is % evaluated before the resultant value is used. % % The resultant value of the parenthesized expression is the same as the % value of the expression enclosed within parentheses. \newpage \subsection{Operadores de conjunto} Em MathProg existem os seguintes operadores de conjunto, que podem ser usados em expressões de conjunto: % In MathProg there exist the following set operators, which may be used % in set expressions: \begin{tabular}{@{}ll@{}} $X$ {\tt union} $Y$&união $X\cup Y$\\ $X$ {\tt diff} $Y$&diferença $X\backslash Y$\\ $X$ {\tt symdiff} $Y$&diferença simétrica $X\oplus Y=(X\backslash Y)\cup(Y\backslash X)$\\ $X$ {\tt inter} $Y$&interseção $X\cap Y$\\ $X$ {\tt cross} $Y$&produto Cartesiano (cruzado) $X\times Y$\\ \end{tabular} % \begin{tabular}{@{}ll@{}} % $X$ {\tt union} $Y$&union $X\cup Y$\\ % $X$ {\tt diff} $Y$&difference $X\backslash Y$\\ % $X$ {\tt symdiff} $Y$&symmetric difference % $X\oplus Y=(X\backslash Y)\cup(Y\backslash X)$\\ % $X$ {\tt inter} $Y$&intersection $X\cap Y$\\ % $X$ {\tt cross} $Y$&cross (Cartesian) product $X\times Y$\\ % \end{tabular} \noindent onde $X$ e Y são expressões de conjunto, que devem definir conjuntos de dimensões idênticas (exceto o produto Cartesiano). Se a expressão inclui mais de um operador de conjunto, todos operadores são executados da esquerda para a direita de acordo com a hierarquia das operações (veja adiante). O valor resultante da expressão, que contém operadores de conjunto, é o resultado da aplicação dos operadores aos seus operandos. A dimensão do conjunto resultante, i.e., a dimensão das $n$-tuplas, dos quais consistem o conjunto resultante, é a mesma da dimensão dos operandos, exceto o produto Cartesiano, onde a dimensão do conjunto resultante é a soma das dimensões dos seus operandos. % \noindent where $X$ and Y are set expressions, which should define sets % of identical dimension (except the Cartesian product). % % If the expression includes more than one set operator, all operators % are performed from left to right according to the hierarchy of % operations (see below). % % The resultant value of the expression, which contains set operators, is % the result of applying the operators to their operands. % % The dimension of the resultant set, i.e. the dimension of $n$-tuples, % of which the resultant set consists of, is the same as the dimension of % the operands, except the Cartesian product, where the dimension of the % resultant set is the sum of the dimensions of its operands. \subsection{Hierarquia das operações} A lista seguinte mostra a hierarquia das operações em expressões de conjunto: % The following list shows the hierarchy of operations in set % expressions: \noindent\hfil \begin{tabular}{@{}ll@{}} Operação&Hierarquia\\ \hline Avaliação de operações numéricas& 1{\textsuperscript{\b{a}}}-7{\textsuperscript{\b{a}}}\\ Avaliação de operações simbólicas& 8{\textsuperscript{\b{a}}}-9{\textsuperscript{\b{a}}}\\ Avaliação de conjuntos iterados ou ``aritméticos'' ({\tt setof}, {\tt..})& 10{\textsuperscript{\b{a}}}\\ Produto Cartesiano ({\tt cross})& 11{\textsuperscript{\b{a}}}\\ Interseção ({\tt inter})& 12{\textsuperscript{\b{a}}}\\ União e diferença ({\tt union}, {\tt diff}, {\tt symdiff})& 13{\textsuperscript{\b{a}}}\\ Avaliação condicional ({\tt if} \dots {\tt then} \dots {\tt else})& 14{\textsuperscript{\b{a}}}\\ \end{tabular} % \noindent\hfil % \begin{tabular}{@{}ll@{}} % Operation&Hierarchy\\ % \hline % Evaluation of numeric operations&1st-7th\\ % Evaluation of symbolic operations&8th-9th\\ % Evaluation of iterated or ``arithmetic'' set ({\tt setof}, {\tt..})& % 10th\\ % Cartesian product ({\tt cross})&11th\\ % Intersection ({\tt inter})&12th\\ % Union and difference ({\tt union}, {\tt diff}, {\tt symdiff})&13th\\ % Conditional evaluation ({\tt if} \dots {\tt then} \dots {\tt else})& % 14th\\ % \end{tabular} Esta hierarquia possui o mesmo significado como explicado anteriormente para expressões \linebreak numéricas (ver Subseção \ref{hierarchy}, página \pageref{hierarchy}). % This hierarchy has the same meaning as was explained above for numeric % expressions (see Subsection \ref{hierarchy}, page \pageref{hierarchy}). \newpage \section{Expressões lógicas} Uma {\it expressão lógica} é uma regra para calcular um valor lógico individual, que pode ser {\it verdadeiro} ou {\it falso}. A expressão lógica primária pode ser uma expressão numérica, uma expressão relacional, uma expressão lógica iterada ou outra expressão lógica cercada entre parênteses. \para{Exemplos} % A {\it logical expression} is a rule for computing a single logical % value, which can be either {\it true} or {\it false}. % % The primary logical expression may be a numeric expression, relational % expression, iterated logical expression, or another logical expression % enclosed in parentheses. % % \para{Examples} \noindent \begin{tabular}{@{}ll@{}} \verb|i+1| &(expressão numérica)\\ \verb|a[i,j] < 1.5| &(expressão relacional)\\ \verb|s[i+1,j-1] <> 'Mar' & year | &(expressão relacional)\\ \verb|(i+1,'Jan') not in I cross J| &(expressão relacional)\\ \verb|S union T within A[i] inter B[j]| &(expressão relacional)\\ \verb|forall{i in I, j in J} a[i,j] < .5 * b[i]| &(expressão lógica iterada)\\ \verb|(a[i,j] < 1.5 or b[i] >= a[i,j])| &(expressão lógica parentizada)\\ \end{tabular} % \noindent % \begin{tabular}{@{}ll@{}} % \verb|i+1| &(numeric expression)\\ % \verb|a[i,j] < 1.5| &(relational expression)\\ % \verb|s[i+1,j-1] <> 'Mar' & year | &(relational expression)\\ % \verb|(i+1,'Jan') not in I cross J| &(relational expression)\\ % \verb|S union T within A[i] inter B[j]| &(relational expression)\\ % \verb|forall{i in I, j in J} a[i,j] < .5 * b[i]| &(iterated logical % expression)\\ % \verb|(a[i,j] < 1.5 or b[i] >= a[i,j])| &(parenthesized logical % expression)\\ % \end{tabular} Expressões lógicas mais genéricas, contendo duas ou mais expressões lógicas primárias, podem ser construídas usando determinados operadores lógicos. \para{Exemplos} \begin{verbatim} not (a[i,j] < 1.5 or b[i] >= a[i,j]) and (i,j) in S (i,j) in S or (i,j) not in T diff U \end{verbatim} % More general logical expressions containing two or more primary logical % expressions may be constructed by using certain logical operators. % % \para{Examples} % % \begin{verbatim} % not (a[i,j] < 1.5 or b[i] >= a[i,j]) and (i,j) in S % (i,j) in S or (i,j) not in T diff U % \end{verbatim} \vspace*{-8pt} \subsection{Expressões numéricas} O valor resultante da expressão lógica primária, que é uma expressão numérica, é {\it verdadeiro}, se o valor resultante da expressão numérica é diferente de zero. Caso contrário o valor resultante da expressão lógica é {\it falso}. % The resultant value of the primary logical expression, which is a % numeric expression, is {\it true}, if the resultant value of the % numeric expression is non-zero. Otherwise the resultant value of the % logical expression is {\it false}. \vspace*{-8pt} \subsection{Operadores relacionais} Em MathProg existem os seguintes operadores relacionais, que podem ser usados em expressões lógicas: % In MathProg there exist the following relational operators, which may % be used in logical expressions: \begin{tabular}{@{}ll@{}} $x$ {\tt<} $y$&verifica se $x=} $y$&verifica se $x\geq y$\\ $x$ {\tt>} $y$&verifica se $x>y$\\ $x$ {\tt<>} $y$, $x$ {\tt!=} $y$&verifica se $x\neq y$\\ $x$ {\tt in} $Y$&verifica se $x\in Y$\\ {\tt(}$x_1${\tt,}\dots{\tt,}$x_n${\tt)} {\tt in} $Y$&verifica se $(x_1,\dots,x_n)\in Y$\\ $x$ {\tt not} {\tt in} $Y$, $x$ {\tt!in} $Y$&verifica se $x\not\in Y$\\ {\tt(}$x_1${\tt,}\dots{\tt,}$x_n${\tt)} {\tt not} {\tt in} $Y$, {\tt(}$x_1${\tt,}\dots{\tt,}$x_n${\tt)} {\tt !in} $Y$&verifica se $(x_1,\dots,x_n)\not\in Y$\\ $X$ {\tt within} $Y$&verifica se $X\subseteq Y$\\ $X$ {\tt not} {\tt within} $Y$, $X$ {\tt !within} $Y$&verifica se $X\not\subseteq Y$\\ \end{tabular} % \begin{tabular}{@{}ll@{}} % $x$ {\tt<} $y$&test on $x=} $y$&test on $x\geq y$\\ % $x$ {\tt>} $y$&test on $x>y$\\ % $x$ {\tt<>} $y$, $x$ {\tt!=} $y$&test on $x\neq y$\\ % $x$ {\tt in} $Y$&test on $x\in Y$\\ % {\tt(}$x_1${\tt,}\dots{\tt,}$x_n${\tt)} {\tt in} $Y$&test on % $(x_1,\dots,x_n)\in Y$\\ % $x$ {\tt not} {\tt in} $Y$, $x$ {\tt!in} $Y$&test on $x\not\in Y$\\ % {\tt(}$x_1${\tt,}\dots{\tt,}$x_n${\tt)} {\tt not} {\tt in} $Y$, % {\tt(}$x_1${\tt,}\dots{\tt,}$x_n${\tt)} {\tt !in} $Y$&test on % $(x_1,\dots,x_n)\not\in Y$\\ % $X$ {\tt within} $Y$&test on $X\subseteq Y$\\ % $X$ {\tt not} {\tt within} $Y$, $X$ {\tt !within} $Y$&test on % $X\not\subseteq Y$\\ % \end{tabular} \noindent onde $x$, $x_1$, \dots, $x_n$, $y$ são expressões numéricas ou simbólicas, $X$ e $Y$ são expressões de conjunto. % \noindent where $x$, $x_1$, \dots, $x_n$, $y$ are numeric or symbolic % expressions, $X$ and $Y$ are set expression. \newpage 1. Nas operações {\tt in}, {\tt not in} e {\tt !in} o número de componentes nos primeiros operandos deve ser igual a dimensão do segundo operando. 2. Nas operações {\tt within}, {\tt not within} e {\tt !within} ambos operandos devem ter a mesma dimensão. Todos operadores relacionais listados acima têm seus significados matemáticos convencionais. O valor resultante é {\it verdadeiro}, se a relação correspondente é satisfeita para seus operandos, caso contrário é {\it falso}. (Note que valores simbólicos são ordenados de forma lexicográfica e qualquer valor numérico precede qualquer valor simbólico.) % 1. In the operations {\tt in}, {\tt not in}, and {\tt !in} the % number of components in the first operands should be the same as the % dimension of the second operand. % % 2. In the operations {\tt within}, {\tt not within}, and {\tt !within} % both operands should have identical dimension. % % All the relational operators listed above have their conventional % mathematical meaning. The resultant value is {\it true}, if % corresponding relation is satisfied for its operands, otherwise % {\it false}. (Note that symbolic values are ordered lexicographically, % and any numeric value precedes any symbolic value.) \subsection{Expressões iteradas} Uma {\it expressão lógica iterada} é uma expressão lógica primária com a seguinte forma sintática: $$\mbox{{\it operador-iterado} {\it expressão-indexante} {\it integrando}}$$ onde {\it operador-iterado} é o nome simbólico do operador iterado a ser executado (veja adiante), {\it expressão-indexante} é uma expressão indexante que introduz índices e controla a iteração, \linebreak {\it integrando} é uma expressão numérica que participa da operação. Em MathProg existem dois operadores iterados que podem ser usados em expressões lógicas: % An {\it iterated logical expression} is a primary logical expression, % which has the following syntactic form: % $$\mbox{{\it iterated-operator} {\it indexing-expression} % {\it integrand}}$$ % where {\it iterated-operator} is the symbolic name of the iterated % operator to be performed (see below), {\it indexing-expression} is an % indexing expression which introduces dummy indices and controls % iterating, {\it integrand} is a numeric expression that participates in % the operation. % % In MathProg there exist two iterated operators, which may be used in % logical expressions: {\def\arraystretch{1.4} \noindent\hfil \begin{tabular}{@{}lll@{}} {\tt forall}&quantificador-$\forall$&$\displaystyle \forall(i_1,\dots,i_n)\in\Delta[f(i_1,\dots,i_n)],$\\ {\tt exists}&quantificador-$\exists$&$\displaystyle \exists(i_1,\dots,i_n)\in\Delta[f(i_1,\dots,i_n)],$\\ \end{tabular} } % {\def\arraystretch{1.4} % \noindent\hfil % \begin{tabular}{@{}lll@{}} % {\tt forall}&$\forall$-quantification&$\displaystyle % \forall(i_1,\dots,i_n)\in\Delta[f(i_1,\dots,i_n)],$\\ % {\tt exists}&$\exists$-quantification&$\displaystyle % \exists(i_1,\dots,i_n)\in\Delta[f(i_1,\dots,i_n)],$\\ % \end{tabular} % } \noindent onde $i_1$, \dots, $i_n$ são índices introduzidos na expressão indexante, $\Delta$ é o domínio, um conjunto de $n$-tuplas especificado pela expressão indexante que define valores específicos atribuídos aos índices ao executar a operação iterada, e $f(i_1,\dots,i_n)$ é o integrando, uma expressão lógica cujo valor resultante depende dos índices. Para o quantificador $\forall$, o valor resultante da expressão lógica iterada é {\it verdadeiro}, se o valor do integrando é {\it verdadeiro} para todas as $n$-tuplas contidas no domínio, caso contrário, é {\it falso}. Para o quantificador $\exists$ o valor resultante da expressão lógica iterada é {\it falso}, se o valor do integrando é {\it falso} para todas as $n$-tuplas contidas no domínio, caso contrário, é {\it verdadeiro}. % \noindent where $i_1$, \dots, $i_n$ are dummy indices introduced in % the indexing expression, $\Delta$ is the domain, a set of $n$-tuples % specified by the indexing expression which defines particular values % assigned to the dummy indices on performing the iterated operation, % $f(i_1,\dots,i_n)$ is the integrand, a logical expression whose % resultant value depends on the dummy indices. % % For $\forall$-quantification the resultant value of the iterated % logical expression is {\it true}, if the value of the integrand is % {\it true} for all $n$-tuples contained in the domain, otherwise % {\it false}. % % For $\exists$-quantification the resultant value of the iterated % logical expression is {\it false}, if the value of the integrand is % {\it false} for all $n$-tuples contained in the domain, otherwise % {\it true}. \subsection{Expressões parentizadas} Qualquer expressão lógica pode ser cercada entre parênteses, o que a converte sintaticamente em uma expressão lógica primária. Parênteses podem ser usados em expressões lógicas, como em álgebra, para especificar a ordem desejada na qual as operações devem ser executadas. Quando se usam parênteses, a expressão entre parênteses é avaliada antes que o valor resultante seja usado. O valor resultante da expressão parentizada é idêntico ao valor da expressão cercada entre parênteses. % Any logical expression may be enclosed in parentheses that % syntactically makes it a primary logical expression. % % Parentheses may be used in logical expressions, as in algebra, to % specify the desired order in which operations are to be performed. % Where parentheses are used, the expression within the parentheses is % evaluated before the resultant value is used. % % The resultant value of the parenthesized expression is the same as the % value of the expression enclosed within parentheses. \newpage \subsection{Operadores lógicos} Em MathProg existem os seguintes operadores lógicos, que podem ser usados em expressões lógicas: % In MathProg there exist the following logical operators, which may be % used in logical expressions: \begin{tabular}{@{}ll@{}} {\tt not} $x$, {\tt!}$x$&negação $\neg\ x$\\ $x$ {\tt and} $y$, $x$ {\tt\&\&} $y$&conjunção (``e'' lógico) $x\;\&\;y$\\ $x$ {\tt or} $y$, $x$ {\tt||} $y$&disjunção (``ou'' lógico) $x\vee y$\\ \end{tabular} % \begin{tabular}{@{}ll@{}} % {\tt not} $x$, {\tt!}$x$&negation $\neg\ x$\\ % $x$ {\tt and} $y$, $x$ {\tt\&\&} $y$&conjunction (logical ``and'') % $x\;\&\;y$\\ % $x$ {\tt or} $y$, $x$ {\tt||} $y$&disjunction (logical ``or'') % $x\vee y$\\ % \end{tabular} \noindent onde $x$ e $y$ são expressões lógicas. Se a expressão inclui mais de um operador lógico, todos operadores são executados da esquerda para a direita de acordo com a hierarquia das operações (veja adiante). O valor resultante da \linebreak expressão que contém operadores lógicos é o resultado da aplicação dos operadores aos seus \linebreak operandos. % \noindent where $x$ and $y$ are logical expressions. % % If the expression includes more than one logical operator, all % operators are performed from left to right according to the hierarchy % of the operations (see below). The resultant value of the expression, % which contains logical operators, is the result of applying the % operators to their operands. \subsection{Hierarquia das operações} A lista seguinte mostra a hierarquia das operações em expressões lógicas: % The following list shows the hierarchy of operations in logical % expressions: \noindent\hfil \begin{tabular}{@{}ll@{}} Operation&Hierarchy\\ \hline Avaliação de operações numéricas& 1{\textsuperscript{\b{a}}}-7{\textsuperscript{\b{a}}}\\ Avaliação de operações simbólicas& 8{\textsuperscript{\b{a}}}-9{\textsuperscript{\b{a}}}\\ Avaliação de operações de conjunto& 10{\textsuperscript{\b{a}}}-14{\textsuperscript{\b{a}}}\\ Operações relacionais ({\tt<}, {\tt<=}, etc.)& 15{\textsuperscript{\b{a}}}\\ negação ({\tt not}, {\tt!})& 16{\textsuperscript{\b{a}}}\\ Conjunção({\tt and}, {\tt\&\&})& 17{\textsuperscript{\b{a}}}\\ Quantificação-$\forall$ e -$\exists$ ({\tt forall}, {\tt exists})& 18{\textsuperscript{\b{a}}}\\ Disjunção ({\tt or}, {\tt||})& 19{\textsuperscript{\b{a}}}\\ \end{tabular} % \noindent\hfil % \begin{tabular}{@{}ll@{}} % Operation&Hierarchy\\ % \hline % Evaluation of numeric operations&1st-7th\\ % Evaluation of symbolic operations&8th-9th\\ % Evaluation of set operations&10th-14th\\ % Relational operations ({\tt<}, {\tt<=}, etc.)&15th\\ % Negation ({\tt not}, {\tt!})&16th\\ % Conjunction ({\tt and}, {\tt\&\&})&17th\\ % $\forall$- and $\exists$-quantification ({\tt forall}, {\tt exists})& % 18th\\ % Disjunction ({\tt or}, {\tt||})&19th\\ % \end{tabular} Esta hierarquia possui o mesmo significado como explicado anteriormente para expressões \linebreak numéricas (ver Subseção \ref{hierarchy}, página \pageref{hierarchy}). % This hierarchy has the same meaning as was explained above for numeric % expressions (see Subsection \ref{hierarchy}, page \pageref{hierarchy}). \newpage \section{Expressões lineares} Uma {\it expressão linear} é uma regra para calcular a chamada {\it forma linear} ou simplesmente {\it fórmula}, que é uma função linear (ou afim) de variáveis elementares. A expressão linear primária pode ser uma variável não-indexada, uma variável indexada, uma expressão linear iterada, uma expressão linear condicional ou outra expressão linear cercada entre parênteses. Também e permitido usar uma expressão numérica como a expressão linear primária, neste caso, o valor resultante da expressão numérica é automaticamente convertido para uma fórmula que inclui o termo constante apenas. \para{Exemplos} % A {\it linear expression} is a rule for computing so called % a {\it linear form} or simply a {\it formula}, which is a linear (or % affine) function of elemental variables. % % The primary linear expression may be an unsubscripted variable, % subscripted variable, iterated linear expression, conditional linear % expression, or another linear expression enclosed in parentheses. % % It is also allowed to use a numeric expression as the primary linear % expression, in which case the resultant value of the numeric expression % is automatically converted to a formula that includes the constant term % only. % % \para{Examples} \noindent \begin{tabular}{@{}ll@{}} \verb|z| &(variável não-indexada)\\ \verb|x[i,j]| &(variável indexada)\\ \verb|sum{j in J} (a[i,j] * x[i,j] + 3 * y[i-1])| & (expressão linear iterada)\\ \verb|if i in I then x[i,j] else 1.5 * z + 3.25| & (expressão linear condicional)\\ \verb|(a[i,j] * x[i,j] + y[i-1] + .1)| & (expressão linear parentizada)\\ \end{tabular} % \noindent % \begin{tabular}{@{}ll@{}} % \verb|z| &(unsubscripted variable)\\ % \verb|x[i,j]| &(subscripted variable)\\ % \verb|sum{j in J} (a[i,j] * x[i,j] + 3 * y[i-1])| & % (iterated linear expression)\\ % \verb|if i in I then x[i,j] else 1.5 * z + 3.25| & % (conditional linear expression)\\ % \verb|(a[i,j] * x[i,j] + y[i-1] + .1)| & % (parenthesized linear expression)\\ % \end{tabular} Expressões lineares mais genéricas, contendo duas ou mais expressões lineares primárias, podem ser construídas usando determinados operadores aritméticos. \para{Exemplos} % More general linear expressions containing two or more primary linear % expressions may be constructed by using certain arithmetic operators. % % \para{Examples} \begin{verbatim} 2 * x[i-1,j+1] + 3.5 * y[k] + .5 * z (- x[i,j] + 3.5 * y[k]) / sum{t in T} abs(d[i,j,t]) \end{verbatim} \vspace*{-5pt} \subsection{Variáveis não-indexadas} Se a expressão linear primária é uma variável não-indexada (que deve se 0-dimensional), a fórmula resultante formula é aquela variável não-indexada. % If the primary linear expression is an unsubscripted variable (which % should be 0-dimensional), the resultant formula is that unsubscripted % variable. \vspace*{-5pt} \subsection{Variáveis indexadas} A expressão linear primária que se refere a uma variável indexada possui a seguinte forma sintática: $$\mbox{{\it nome}{\tt[}$i_1${\tt,} $i_2${\tt,} \dots{\tt,} $i_n${\tt]}}$$ onde {\it nome} é o nome simbólico da variável do modelo, $i_1$, $i_2$, \dots, $i_n$ são subíndices. Cada subíndice deve ser uma expressão numérica ou simbólica. O número de subíndices na lista de subíndices deve ser igual ao da dimensão da variável do modelo com a qual está associada a lista de subíndices. Os valores correntes das expressões dos subíndices são usados para identificar um membro \linebreak particular da variável do modelo que determina a fórmula resultante, que é uma variável elementar associada com o membro correspondente. % The primary linear expression, which refers to a subscripted variable, % has the following syntactic form: % $$\mbox{{\it name}{\tt[}$i_1${\tt,} $i_2${\tt,} \dots{\tt,} % $i_n${\tt]}}$$ % where {\it name} is the symbolic name of the model variable, $i_1$, % $i_2$, \dots, $i_n$ are subscripts. % % Each subscript should be a numeric or symbolic expression. The number % of subscripts in the subscript list should be the same as the dimension % of the model variable with which the subscript list is associated. % % Actual values of the subscript expressions are used to identify a % particular member of the model variable that determines the resultant % formula, which is an elemental variable associated with corresponding % member. \vspace*{-5pt} \subsection{Expressões iteradas} Uma {\it expressão linear iterada} é uma expressão linear primária, que tem a seguinte forma sintática: $$\mbox{{\tt sum} {\it expressão-indexante} {\it integrando}}$$ onde {\it expressão-indexante} é uma expressão indexante, que introduz índices e controla iterações, {\it integrando} é uma expressão linear que participa da operação. A expressão linear iterada é avaliada exatamente da mesma forma que a expressão numérica iterada (ver Subseção \ref{itexpr}, página \pageref{itexpr}), exceto que o integrando participante do somatório é uma fórmula e não um valor numérico. % An {\it iterated linear expression} is a primary linear expression, % which has the following syntactic form: % $$\mbox{{\tt sum} {\it indexing-expression} {\it integrand}}$$ % where {\it indexing-expression} is an indexing expression, which % introduces dummy indices and controls iterating, {\it integrand} is % a linear expression that participates in the operation. % % The iterated linear expression is evaluated exactly in the same way as % the iterated numeric expression (see Subection \ref{itexpr}, page % \pageref{itexpr}) with exception that the integrand participated in the % summation is a formula, not a numeric value. \vspace*{-5pt} \subsection{Expressões condicionais} Uma {\it expressão linear condicional} é uma expressão linear primária, que possui uma das duas formas sintáticas seguintes: $$ {\def\arraystretch{1.4} \begin{array}{l} \mbox{{\tt if} $b$ {\tt then} $f$ {\tt else} $g$}\\ \mbox{{\tt if} $b$ {\tt then} $f$}\\ \end{array} } $$ onde $b$ é uma expressão lógica, $f$ e $g$ são expressões lineares. % A {\it conditional linear expression} is a primary linear expression, % which has one of the following two syntactic forms: % $$ % {\def\arraystretch{1.4} % \begin{array}{l} % \mbox{{\tt if} $b$ {\tt then} $f$ {\tt else} $g$}\\ % \mbox{{\tt if} $b$ {\tt then} $f$}\\ % \end{array} % } % $$ % where $b$ is an logical expression, $f$ and $g$ are linear expressions. % \newpage A expressão linear condicional é avaliada exatamente da mesma forma que a expressão \linebreak condicional numérica (ver Subseção \ref{ifthen}, página \pageref{ifthen}), exceto que os operandos que participam da operação são fórmulas e não valores numéricos. % The conditional linear expression is evaluated exactly in the same way % as the conditional numeric expression (see Subsection \ref{ifthen}, % page \pageref{ifthen}) with exception that operands participated in the % operation are formulae, not numeric values. \subsection{Expressões parentizadas} Qualquer expressão linear pode ser cercada entre parênteses, o que a converte sintaticamente em uma expressão linear primária. Parênteses podem ser usados em expressões lineares, como em álgebra, para especificar a ordem desejada na qual as operações devem ser executadas. Quando se usam parênteses, a expressão entre parênteses é avaliada antes que a fórmula resultante seja usada. O valor resultante da expressão parentizada é idêntico ao valor da expressão cercada entre parênteses. % Any linear expression may be enclosed in parentheses that syntactically % makes it a primary linear expression. % % Parentheses may be used in linear expressions, as in algebra, to % specify the desired order in which operations are to be performed. % Where parentheses are used, the expression within the parentheses is % evaluated before the resultant formula is used. % % The resultant value of the parenthesized expression is the same as the % value of the expression enclosed within parentheses. \subsection{Operadores aritméticos} Em MathProg existem os seguintes operadores aritméticos, que podem ser usados em expressões lineares: % In MathProg there exists the following arithmetic operators, which may % be used in linear expressions: \begin{tabular}{@{}ll@{}} {\tt+} $f$&mais unário\\ {\tt-} $f$&menos unário\\ $f$ {\tt+} $g$&adição\\ $f$ {\tt-} $g$&subtração\\ $x$ {\tt*} $f$, $f$ {\tt*} $x$&multiplicação\\ $f$ {\tt/} $x$&divisão \end{tabular} % \begin{tabular}{@{}ll@{}} % {\tt+} $f$&unary plus\\ % {\tt-} $f$&unary minus\\ % $f$ {\tt+} $g$&addition\\ % $f$ {\tt-} $g$&subtraction\\ % $x$ {\tt*} $f$, $f$ {\tt*} $x$&multiplication\\ % $f$ {\tt/} $x$&division % \end{tabular} \noindent onde $f$ e $g$ são expressões lineares, $x$ é uma expressão numérica (mais precisamente, uma expressão linear contendo apenas o termo constante). Se a expressão inclui mais de um operador aritmético, todos operadores são executados da esquerda para a direita de acordo com a hierarquia das operações (veja adiante). O valor resultante da expressão, que contém operadores aritméticos, é o resultado de aplicar os operadores aos seus operandos. % \noindent where $f$ and $g$ are linear expressions, $x$ is a numeric % expression (more precisely, a linear expression containing only the % constant term). % % If the expression includes more than one arithmetic operator, all % operators are performed from left to right according to the hierarchy % of operations (see below). The resultant value of the expression, which % contains arithmetic operators, is the result of applying the operators % to their operands. \subsection{Hierarquia das operações} A hierarquia de operações aritméticas usada em expressões lineares é a mesma para expressões numéricas (ver Subseção \ref{hierarchy}, página \pageref{hierarchy}). % The hierarchy of arithmetic operations used in linear expressions is % the same as for numeric expressions (see Subsection \ref{hierarchy}, % page \pageref{hierarchy}). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Sentenças} {\it Sentenças} são unidades básicas da descrição do modelo. Em MathProg todas as sentenças são divididas em duas categorias: sentenças de declaração e sentenças funcionais. {\it Sentenças de declaração} (sentença {\it set}, sentença {\it parameter}, sentença {\it variable}, sentença \linebreak {\it constraint}, sentença {\it objective}) são usados para declarar objetos de certo tipo do modelo e definir certas propriedades de tais objetos. {\it Sentenças funcionais} (sentença {\it solve}, sentença {\it check}, sentença {\it display}, sentença {\it printf}, sentença {\it loop}, sentença {\it table}) são projetadas para executar ações específicas. Note que sentenças de declaração podem seguir em qualquer ordem arbitrária, o que não afeta o resultado da tradução. Entretanto, qualquer objeto de modelo deve ser declarado antes de ser referenciado por outras sentenças. % {\it Statements} are basic units of the model description. In MathProg % all statements are divided into two categories: declaration statements % and functional statements. % % {\it Declaration statements} (set statement, parameter statement, % variable statement, constraint statement, objective statement) are used % to declare model objects of certain kinds and define certain properties % of such objects. % % {\it Functional statements} (solve statement, check statement, display % statement, printf statement, loop statement, table statement) are % intended for performing some specific actions. % % Note that declaration statements may follow in arbitrary order, which % does not affect the result of translation. However, any model object % should be declared before it is referenced in other statements. \section{Sentença set} \noindent \framebox[468pt][l]{ \parbox[c][24pt]{468pt}{ \hspace{6pt} {\tt set} {\it nome} {\it alias} {\it domínio} {\tt,} {\it atributo} {\tt,} \dots {\tt,} {\it atributo} {\tt;} }} % \noindent % \framebox[468pt][l]{ % \parbox[c][24pt]{468pt}{ % \hspace{6pt} {\tt set} {\it name} {\it alias} {\it domain} {\tt,} % {\it attrib} {\tt,} \dots {\tt,} {\it attrib} {\tt;} % }} \medskip \noindent {\it nome} é um nome simbólico do conjunto; \noindent {\it alias} é um literal de cadeia opcional que especifica um pseudônimo para o conjunto; \noindent {\it domínio} é uma expressão indexante opcional que especifica o domínio do subíndice do conjunto; \noindent {\it atributo}, \dots, {\it atributo} são atributos opcionais do conjunto (as vírgulas que precedem os atributos podem ser omitidas.) \para{Atributos opcionais} % \noindent % {\it name} is a symbolic name of the set; % % \noindent % {\it alias} is an optional string literal, which specifies an alias of % the set; % % \noindent % {\it domain} is an optional indexing expression, which specifies % a subscript domain of the set; % % \noindent % {\it attrib}, \dots, {\it attrib} are optional attributes of the set. % (Commae preceding attributes may be omitted.) % % \para{Optional attributes} \vspace*{-8pt} \begin{description} \item[{\tt dimen} $n$]\hspace*{0pt}\\ especifica a dimensão de $n$-tuplas das quais o conjunto é consistido; \item[{\tt within} {\it expressão}]\hspace*{0pt}\\ especifica um superconjunto que restringe ao conjunto ou a todos seus membros (conjuntos elementares) a estarem incluídos naquele superconjunto; \item[{\tt:=} {\it expressão}]\hspace*{0pt}\\ especifica um conjunto elementar atribuído ao conjunto ou aos seus membros; \item[{\tt default} {\it expressão}]\hspace*{0pt}\\ especifica um conjunto elementar atribuído ao conjunto ou aos seus membros sempre que não há dados apropriados disponíveis na seção de dados. \end{description} % \begin{description} % \item[{\tt dimen} $n$]\hspace*{0pt}\\ % specifies the dimension of $n$-tuples which the set consists of; % \item[{\tt within} {\it expression}]\hspace*{0pt}\\ % specifies a superset which restricts the set or all its members % (elemental sets) to be within that superset; % \item[{\tt:=} {\it expression}]\hspace*{0pt}\\ % specifies an elemental set assigned to the set or its members; % \item[{\tt default} {\it expression}]\hspace*{0pt}\\ % specifies an elemental set assigned to the set or its members whenever % no appropriate data are available in the data section. % \end{description} \vspace*{-8pt} \para{Exemplos} % \para{Examples} \begin{verbatim} set nos; set arcos within nos cross nos; set passo{s in 1..maxiter} dimen 2 := if s = 1 then arcos else passo[s-1] union setof{k in nos, (i,k) in passo[s-1], (k,j) in passo[s-1]}(i,j); set A{i in I, j in J}, within B[i+1] cross C[j-1], within D diff E, default {('abc',123), (321,'cba')}; \end{verbatim} % \begin{verbatim} % set nodes; % set arcs within nodes cross nodes; % set step{s in 1..maxiter} dimen 2 := if s = 1 then arcs else step[s-1] % union setof{k in nodes, (i,k) in step[s-1], (k,j) in step[s-1]}(i,j); % set A{i in I, j in J}, within B[i+1] cross C[j-1], within D diff E, % default {('abc',123), (321,'cba')}; % \end{verbatim} A sentença set declara um conjunto. Se o domínio do subíndice não é especificado, o conjunto é um conjunto simples, caso contrário será uma matriz de conjuntos elementares. O atributo {\tt dimen} especifica a dimensão de $n$-tuplas da qual é consistida o conjunto (se o conjunto é simples) ou seus membros (se o conjunto é uma matriz de conjuntos elementares), em que $n$ deve ser um inteiro de 1 a 20. Pode-se especificar no máximo um atributo {\tt dimen}. Se o atributo {\tt dimen} não é especificado, a dimensão das $n$-tuplas é implicitamente determinada por outros atributos (por exemplo, se há uma expressão que segue {\tt:=} ou a palavra-chave {\tt default}, usa-se a dimensão das $n$-tuplas do conjunto elementar correspondente). Se nenhuma informação de dimensão é fornecida, assume-se {\tt dimen 1}. O atributo {\tt within} especifica uma expressão de conjunto cujo valor resultante é um superconjunto usado para restringir o conjunto (se o conjunto é simples) ou seus membros (se o conjunto é uma matriz de conjuntos elementares) a estar incluído naquele superconjunto. Um número arbitrário de atributos {\tt within} podem ser especificados na mesma sentença set. O atributo de atribuição ({\tt:=}) especifica uma expressão de conjunto usada para avaliar conjunto(s) \linebreak elementar(es) atribuído(s) ao conjunto (se o conjunto é simples) ou seus membros (se o conjunto é uma matriz de conjuntos elementares). Se o atributo de atribuição é especificado, o conjunto é {\it calculável}, portanto, não há a necessidade de fornecer dados na seção de dados. Se o atributo de atribuição não é especificado, deve-se fornecer os dados na seção de dados. Pode-se especificar no máximo um atributo de atribuição ou {\tt default} para o mesmo conjunto. O atributo {\tt default} especifica uma expressão de conjunto usado para avaliar conjunto(s) \linebreak elementar(es) atribuído(s) ao conjunto (se o conjunto é simples) ou seus membros (se o conjunto é uma matriz de conjuntos elementares) sempre que não houver dados apropriados disponíveis na seção de dados. Se não se especifica nem o atributo de atribuição nem o atributo {\tt default}, a falta de dados causará um erro. % The set statement declares a set. If the subscript domain is not % specified, the set is a simple set, otherwise it is an array of % elemental sets. % % The {\tt dimen} attribute specifies the dimension of $n$-tuples, which % the set (if it is a simple set) or its members (if the set is an array % of elemental sets) consist of, where $n$ should be an unsigned integer % from 1 to 20. At most one {\tt dimen} attribute can be specified. If % the {\tt dimen} attribute is not specified, the dimension of $n$-tuples % is implicitly determined by other attributes (for example, if there is % a set expression that follows {\tt:=} or the keyword {\tt default}, the % dimension of $n$-tuples of corresponding elemental set is used). % If no dimension information is available, {\tt dimen 1} is assumed. % % The {\tt within} attribute specifies a set expression whose resultant % value is a superset used to restrict the set (if it is a simple set) or % its members (if the set is an array of elemental sets) to be within % that superset. Arbitrary number of {\tt within} attributes may be % specified in the same set statement. % % The assign ({\tt:=}) attribute specifies a set expression used to % evaluate elemental set(s) assigned to the set (if it is a simple set) % or its members (if the set is an array of elemental sets). If the % assign attribute is specified, the set is {\it computable} and % therefore needs no data to be provided in the data section. If the % assign attribute is not specified, the set should be provided with data % in the data section. At most one assign or default attribute can be % specified for the same set. % % The {\tt default} attribute specifies a set expression used to evaluate % elemental set(s) assigned to the set (if it is a simple set) or its % members (if the set is an array of elemental sets) whenever % no appropriate data are available in the data section. If neither % assign nor default attribute is specified, missing data will cause an % error. \newpage \section{Sentença parameter} \noindent \framebox[468pt][l]{ \parbox[c][24pt]{468pt}{ \hspace{6pt} {\tt param} {\it nome} {\it alias} {\it domínio} {\tt,} {\it attrib} {\tt,} \dots {\tt,} {\it attrib} {\tt;} }} % \noindent % \framebox[468pt][l]{ % \parbox[c][24pt]{468pt}{ % \hspace{6pt} {\tt param} {\it name} {\it alias} {\it domain} {\tt,} % {\it attrib} {\tt,} \dots {\tt,} {\it attrib} {\tt;} % }} \medskip \noindent {\it nome} é um nome simbólico do parâmetro; \noindent {\it alias} é um literal de cadeia opcional que especifica um pseudônimo para o parâmetro; \noindent {\it domínio} é uma expressão indexante opcional que especifica o domínio do subíndice do parâmetro; \noindent {\it atributo}, \dots, {\it atributo} são atributos opcionais do parâmetro (as vírgulas que precedem os atributos podem ser omitidas.) \para{Atributos opcionais} % \noindent % {\it name} is a symbolic name of the parameter; % % \noindent % {\it alias} is an optional string literal, which specifies an alias of % the parameter; % % \noindent % {\it domain} is an optional indexing expression, which specifies % a subscript domain of the parameter; % % \noindent % {\it attrib}, \dots, {\it attrib} are optional attributes of the % parameter. (Commae preceding attributes may be omitted.) % % \para{Optional attributes} \vspace*{-8pt} \begin{description} \item[{\tt integer}]\hspace*{0pt}\\ especifica que o parâmetro é inteiro; \item[{\tt binary}]\hspace*{0pt}\\ especifica que o parâmetro é binário; \item[{\tt symbolic}]\hspace*{0pt}\\ especifica que o parâmetro é simbólico; \item[{\it expressão de relação}]\hspace*{0pt}\\ (onde {\it relação} é algum de: {\tt<}, {\tt<=}, {\tt=}, {\tt==}, {\tt>=}, {\tt>}, {\tt<>}, {\tt!=})\\ especifica uma condição que restringe o parâmetro ou seus membros a satisfazer aquela condição; \item[{\tt in} {\it expressão}]\hspace*{0pt}\\ especifica um superconjunto que restringe o parâmetro ou seus membros a estarem inseridos naquele superconjunto; \item[{\tt:=} {\it expressão}]\hspace*{0pt}\\ especifica um valor atribuído ao parâmetro ou a seus membros; \item[{\tt default} {\it expressão}]\hspace*{0pt}\\ especifica um valor atribuído ao parâmetro ou aos seus membros sempre que não houverem dados disponíveis na seção de dados. \end{description} % \begin{description} % \item[{\tt integer}]\hspace*{0pt}\\ % specifies that the parameter is integer; % \item[{\tt binary}]\hspace*{0pt}\\ % specifies that the parameter is binary; % \item[{\tt symbolic}]\hspace*{0pt}\\ % specifies that the parameter is symbolic; % \item[{\it relation expression}]\hspace*{0pt}\\ % (where {\it relation} is one of: {\tt<}, {\tt<=}, {\tt=}, {\tt==}, % {\tt>=}, {\tt>}, {\tt<>}, {\tt!=})\\ % specifies a condition that restricts the parameter or its members to % satisfy that condition; % \item[{\tt in} {\it expression}]\hspace*{0pt}\\ % specifies a superset that restricts the parameter or its members to be % in that superset; % \item[{\tt:=} {\it expression}]\hspace*{0pt}\\ % specifies a value assigned to the parameter or its members; % \item[{\tt default} {\it expression}]\hspace*{0pt}\\ % specifies a value assigned to the parameter or its members whenever % no appropriate data are available in the data section. % \end{description} \vspace*{-8pt} \para{Exemplos} % \para{Examples} \begin{verbatim} param unidades{insumo, produto} >= 0; param lucro{produto, 1..T+1}; param N := 20 integer >= 0 <= 100; param combinacao 'n escolhe k' {n in 0..N, k in 0..n} := if k = 0 or k = n then 1 else combinacao[n-1,k-1] + combinacao[n-1,k]; param p{i in I, j in J}, integer, >= 0, <= i+j, in A[i] symdiff B[j], in C[i,j], default 0.5 * (i + j); param mes symbolic default 'Mai' in {'Mar', 'Abr', 'Mai'}; \end{verbatim} % \begin{verbatim} % param units{raw, prd} >= 0; % param profit{prd, 1..T+1}; % param N := 20 integer >= 0 <= 100; % param comb 'n choose k' {n in 0..N, k in 0..n} := % if k = 0 or k = n then 1 else comb[n-1,k-1] + comb[n-1,k]; % param p{i in I, j in J}, integer, >= 0, <= i+j, in A[i] symdiff B[j], % in C[i,j], default 0.5 * (i + j); % param month symbolic default 'May' in {'Mar', 'Apr', 'May'}; % \end{verbatim} A sentença parameter declara um parâmetro. Se o domínio de subíndice não é especificado, o parâmetro é simples (escalar), caso contrário, é uma matriz $n$-dimensional. Os atributos de tipo {\tt integer}, {\tt binary} e {\tt symbolic} qualificam os tipos de valores que podem ser atribuídos ao parâmetro, conforme demonstrado: % The parameter statement declares a parameter. If a subscript domain is % not specified, the parameter is a simple (scalar) parameter, otherwise % it is a $n$-dimensional array. % % The type attributes {\tt integer}, {\tt binary}, and {\tt symbolic} % qualify the type of values that can be assigned to the parameter as % shown below: \noindent\hfil \begin{tabular}{@{}ll@{}} Tipo de atributo&Valores atribuídos\\ \hline (não especificado)&Qualquer valor numérico\\ {\tt integer}&Apenas valores numéricos inteiros\\ {\tt binary}&Tanto 0 quanto 1\\ {\tt symbolic}&Qualquer valor numérico e simbólico\\ \end{tabular} % \noindent\hfil % \begin{tabular}{@{}ll@{}} % Type attribute&Assigned values\\ % \hline % (not specified)&Any numeric values\\ % {\tt integer}&Only integer numeric values\\ % {\tt binary}&Either 0 or 1\\ % {\tt symbolic}&Any numeric and symbolic values\\ % \end{tabular} O atributo {\tt symbolic} não pode ser especificado juntamente com outros tipos de atributos. Uma vez especificado, ele deve preceder todos os outros atributos. O atributo de condição especifica uma condição opcional que restringe os valores atribuídos ao parâmetro para satisfazer aquela condição. Este atributo tem as seguintes formas sintáticas: % The {\tt symbolic} attribute cannot be specified along with other type % attributes. Being specified it should precede all other attributes. % % The condition attribute specifies an optional condition that restricts % values assigned to the parameter to satisfy that condition. This % attribute has the following syntactic forms: \begin{tabular}{@{}ll@{}} {\tt<} $v$&verifica se $x=} $v$&verifica se $x\geq v$\\ {\tt>} $v$&verifica se $x\geq v$\\ {\tt<>} $v$, {\tt!=} $v$&verifica se $x\neq v$\\ \end{tabular} % \begin{tabular}{@{}ll@{}} % {\tt<} $v$&check for $x=} $v$&check for $x\geq v$\\ % {\tt>} $v$&check for $x\geq v$\\ % {\tt<>} $v$, {\tt!=} $v$&check for $x\neq v$\\ % \end{tabular} \noindent onde $x$ é um valor atribuído ao parâmetro, $v$ é o valor resultante de uma expressão numérica ou simbólica especificado no atributo de condição. Um número arbitrário de atributos de condição pode ser especificado para o mesmo parâmetro. Se, durante a avaliação do modelo, um valor atribuído ao parâmetro viola pelo menos uma das condições especificadas, ocorrerá um erro. (Note que valores simbólicos são ordenados de forma lexicográfica e qualquer valor numérico precede qualquer valor simbólico.) O atributo {\tt in} é similar ao atributo de condição e especifica uma expressão de conjunto cujo valor resultante é um superconjunto usado para restringir valores numéricos ou simbólicos atribuídos ao parâmetro a estarem incluídos naquele superconjunto. Pode-se especificar um número arbitrário de atributos {\tt in} para o mesmo parâmetro. Se, durante a avaliação do modelo, o valor atribuído ao parâmetro não pertence a pelo menos um dos superconjuntos especificados, ocorrerá um erro. O atributo de atribuição ({\tt:=}) especifica uma expressão numérica ou simbólica usada para \linebreak computar um valor atribuído ao parâmetro (se é um parâmetro simples) ou seus membros (se o parâmetro é uma matriz). Se o atributo de atribuição é especificado, o parâmetro é {\it calculável}, \linebreak portanto, não há a necessidade de fornecer dados na seção de dados. Se o atributo de atribuição não é especificado, deve-se fornecer os dados para o parâmetro na seção de dados. Pode-se especificar no máximo um atributo de atribuição ou {\tt default} para o mesmo parâmetro. O atributo {\tt default} especifica uma expressão numérica ou simbólica usada para computar um valor atribuído ao parâmetro ou seus membros sempre que não houver dados apropriados disponíveis na seção de dados. Se não se especifica nem o atributo de atribuição nem o atributo {\tt default}, a falta de dados causará um erro. % \noindent where $x$ is a value assigned to the parameter, $v$ is the % resultant value of a numeric or symbolic expression specified in the % condition attribute. Arbitrary number of condition attributes can be % specified for the same parameter. If a value being assigned to the % parameter during model evaluation violates at least one of specified % conditions, an error is raised. (Note that symbolic values are ordered % lexicographically, and any numeric value precedes any symbolic value.) % % The {\tt in} attribute is similar to the condition attribute and % specifies a set expression whose resultant value is a superset used to % restrict numeric or symbolic values assigned to the parameter to be in % that superset. Arbitrary number of the {\tt in} attributes can be % specified for the same parameter. If a value being assigned to the % parameter during model evaluation is not in at least one of specified % supersets, an error is raised. % % The assign ({\tt:=}) attribute specifies a numeric or symbolic % expression used to compute a value assigned to the parameter (if it is % a simple parameter) or its member (if the parameter is an array). If % the assign attribute is specified, the parameter is {\it computable} % and therefore needs no data to be provided in the data section. If the % assign attribute is not specified, the parameter should be provided % with data in the data section. At most one assign or {\tt default} % attribute can be specified for the same parameter. % % The {\tt default} attribute specifies a numeric or symbolic expression % used to compute a value assigned to the parameter or its member % whenever no appropriate data are available in the data section. If % neither assign nor {\tt default} attribute is specified, missing data % will cause an error. \newpage \section{Sentença variable} \noindent \framebox[468pt][l]{ \parbox[c][24pt]{468pt}{ \hspace{6pt} {\tt var} {\it nome} {\it alias} {\it domínio} {\tt,} {\it atrib} {\tt,} \dots {\tt,} {\it atrib} {\tt;} }} \medskip \noindent {\it nome} é um nome simbólico da variável; \noindent {\it alias} é um literal de cadeia opcional que especifica um pseudônimo para a variável; \noindent {\it domínio} é uma expressão indexante opcional que especifica o domínio do subíndice da variável; \noindent {\it atrib}, \dots, {\it atrib} são atributos opcionais da variável (as vírgulas que precedem os atributos podem ser omitidas.) \para{Atributos opcionais} \vspace*{-8pt} \begin{description} \item[{\tt integer}]\hspace*{0pt}\\ restringe a variável a ser inteira; \item[{\tt binary}]\hspace*{0pt}\\ restringe a variável a ser binária; \item[{\tt>=} {\it expressão}]\hspace*{0pt}\\ especifica um limite inferior para a variável; \item[{\tt<=} {\it expressão}]\hspace*{0pt}\\ especifica um limite superior para a variável; \item[{\tt=} {\it expressão}]\hspace*{0pt}\\ especifica um valor fixo para a variável; \end{description} % \noindent % \framebox[468pt][l]{ % \parbox[c][24pt]{468pt}{ % \hspace{6pt} {\tt var} {\it name} {\it alias} {\it domain} {\tt,} % {\it attrib} {\tt,} \dots {\tt,} {\it attrib} {\tt;} % }} % % \medskip % % \noindent % {\it name} is a symbolic name of the variable; % % \noindent % {\it alias} is an optional string literal, which specifies an alias of % the variable; % % \noindent % {\it domain} is an optional indexing expression, which specifies % a subscript domain of the variable; % % \noindent % {\it attrib}, \dots, {\it attrib} are optional attributes of the % variable. (Commae preceding attributes may be omitted.) % % \para{Optional attributes} % % \vspace*{-8pt} % % \begin{description} % \item[{\tt integer}]\hspace*{0pt}\\ % restricts the variable to be integer; % \item[{\tt binary}]\hspace*{0pt}\\ % restricts the variable to be binary; % \item[{\tt>=} {\it expression}]\hspace*{0pt}\\ % specifies an lower bound of the variable; % \item[{\tt<=} {\it expression}]\hspace*{0pt}\\ % specifies an upper bound of the variable; % \item[{\tt=} {\it expression}]\hspace*{0pt}\\ % specifies a fixed value of the variable; % \end{description} \vspace*{-8pt} \para{Exemplos} % \para{Examples} \begin{verbatim} var x >= 0; var y{I,J}; var produzir{p in prod}, integer, >= comprometido[p], <= mercado[p]; var armazenar{insumo, 1..T+1} >= 0; var z{i in I, j in J} >= i+j; \end{verbatim} % \begin{verbatim} % var x >= 0; % var y{I,J}; % var make{p in prd}, integer, >= commit[p], <= market[p]; % var store{raw, 1..T+1} >= 0; % var z{i in I, j in J} >= i+j; % \end{verbatim} A sentença variable declara uma variável. Se não se especifica o domínio do subíndice, a variável e uma variável simples (escalar), caso contrário é uma matriz $n$-dimensional de variáveis elementares. As variáveis elementares associadas com a variável do modelo (se é uma variável simples) ou seus membros (se é uma matriz) corresponde às variáveis na formulação do problema PL/PIM (ver Seção \ref{problem}, página \pageref{problem}). Note que somente variáveis elementares realmente referenciadas em algumas restrições e/ou objetivos serão incluídas na instância do problema PL/PIM a ser gerado. Os atributos de tipo {\tt integer} e {\tt binary} restringem a variável a ser inteira ou binária, \linebreak respectivamente. Se nenhum atributo de tipo é especificado, a variável é contínua. Se todas as variáveis no modelo são contínuas, o problema correspondente é da classe PL. Se há pelo menos uma variável inteira ou binária, o problema é da classe PIM. \newpage O atributo de limite inferior ({\tt>=}) especifica uma expressão numérica para calcular um limite inferior da variável. No máximo um limite inferior pode ser especificado. Por padrão, todas as variáveis (exceto as binárias) não tem limite inferior, assim, se há a necessidade de uma variável ser não-negativa, seu limite inferior zero deve ser explicitamente especificado. O atributo de limite superior ({\tt<=}) especifica uma expressão numérica para calcular um limite superior da variável. No máximo um limite superior pode ser especificado. O atributo de valor fixo ({\tt=}) especifica uma expressão numérica para calcular um valor no qual a variável é fixada. Este atributo não pode ser especificado junto com os atributos de limite. % The variable statement declares a variable. If a subscript domain is % not specified, the variable is a simple (scalar) variable, otherwise it % is a $n$-dimensional array of elemental variables. % % Elemental variable(s) associated with the model variable (if it is a % simple variable) or its members (if it is an array) correspond to the % variables in the LP/MIP problem formulation (see Section \ref{problem}, % page \pageref{problem}). Note that only elemental variables actually % referenced in some constraints and/or objectives are included in the % LP/MIP problem instance to be generated. % % The type attributes {\tt integer} and {\tt binary} restrict the % variable to be integer or binary, respectively. If no type attribute is % specified, the variable is continuous. If all variables in the model % are continuous, the corresponding problem is of LP class. If there is % at least one integer or binary variable, the problem is of MIP class. % % The lower bound ({\tt>=}) attribute specifies a numeric expression for % computing an lower bound of the variable. At most one lower bound can % be specified. By default all variables (except binary ones) have no % lower bound, so if a variable is required to be non-negative, its zero % lower bound should be explicitly specified. % % The upper bound ({\tt<=}) attribute specifies a numeric expression for % computing an upper bound of the variable. At most one upper bound % attribute can be specified. % % The fixed value ({\tt=}) attribute specifies a numeric expression for % computing a value, at which the variable is fixed. This attribute % cannot be specified along with the bound attributes. \section{Sentença constraint} \noindent \framebox[468pt][l]{ \parbox[c][106pt]{468pt}{ \hspace{6pt} {\tt s.t.} {\it nome} {\it alias} {\it domínio} {\tt:} {\it expressão} {\tt,} {\tt=} {\it expressão} {\tt;} \medskip \hspace{6pt} {\tt s.t.} {\it nome} {\it alias} {\it domínio} {\tt:} {\it expressão} {\tt,} {\tt<=} {\it expressão} {\tt;} \medskip \hspace{6pt} {\tt s.t.} {\it nome} {\it alias} {\it domínio} {\tt:} {\it expressão} {\tt,} {\tt>=} {\it expressão} {\tt;} \medskip \hspace{6pt} {\tt s.t.} {\it nome} {\it alias} {\it domínio} {\tt:} {\it expressão} {\tt,} {\tt<=} {\it expressão} {\tt,} {\tt<=} {\it expressão} {\tt;} \medskip \hspace{6pt} {\tt s.t.} {\it nome} {\it alias} {\it domínio} {\tt:} {\it expressão} {\tt,} {\tt>=} {\it expressão} {\tt,} {\tt>=} {\it expressão} {\tt;} }} \medskip \noindent {\it nome} é um nome simbólico da restrição; \noindent {\it alias} é um literal de cadeia opcional que especifica um pseudônimo da restrição; \noindent {\it domínio} é uma expressão indexante opcional, que especifica o domínio do subíndice da restrição; \noindent {\it expressão} é uma expressão linear usada para calcular um componente da restrição (as vírgulas que precedem os atributos podem ser omitidas). \noindent (A palavra-chave {\tt s.t.} pode ser escrita como {\tt subject to}, como {\tt subj to} ou pode ser omitido por completo). % \noindent % \framebox[468pt][l]{ % \parbox[c][106pt]{468pt}{ % \hspace{6pt} {\tt s.t.} {\it name} {\it alias} {\it domain} {\tt:} % {\it expression} {\tt,} {\tt=} {\it expression} {\tt;} % % \medskip % % \hspace{6pt} {\tt s.t.} {\it name} {\it alias} {\it domain} {\tt:} % {\it expression} {\tt,} {\tt<=} {\it expression} {\tt;} % % \medskip % % \hspace{6pt} {\tt s.t.} {\it name} {\it alias} {\it domain} {\tt:} % {\it expression} {\tt,} {\tt>=} {\it expression} {\tt;} % % \medskip % % \hspace{6pt} {\tt s.t.} {\it name} {\it alias} {\it domain} {\tt:} % {\it expression} {\tt,} {\tt<=} {\it expression} {\tt,} {\tt<=} % {\it expression} {\tt;} % % \medskip % % \hspace{6pt} {\tt s.t.} {\it name} {\it alias} {\it domain} {\tt:} % {\it expression} {\tt,} {\tt>=} {\it expression} {\tt,} {\tt>=} % {\it expression} {\tt;} % }} % % \medskip % % \noindent % {\it name} is a symbolic name of the constraint; % % \noindent % {\it alias} is an optional string literal, which specifies an alias of % the constraint; % % \noindent % {\it domain} is an optional indexing expression, which specifies % a subscript domain of the constraint; % % \noindent % {\it expression} is a linear expression used to compute a component of % the constraint. (Commae following expressions may be omitted.) % % \noindent % (The keyword {\tt s.t.} may be written as {\tt subject to} or as % {\tt subj to}, or may be omitted at all.) \para{Exemplos} % \para{Examples} \begin{verbatim} s.t. r: x + y + z, >= 0, <= 1; limite{t in 1..T}: sum{j in produto} produzir[j,t] <= max_prod; subject to balanco{i in insumo, t in 1..T}: estoque[i,t+1] = estoque[i,t] - sum{j in produto} unidades[i,j] * produzir[j,t]; subject to rlim 'limite tempo-regular' {t in tempo}: sum{p in produto} pt[p] * rprod[p,t] <= 1.3 * dpp[t] * equipes[t]; \end{verbatim} % \begin{verbatim} % s.t. r: x + y + z, >= 0, <= 1; % limit{t in 1..T}: sum{j in prd} make[j,t] <= max_prd; % subject to balance{i in raw, t in 1..T}: % store[i,t+1] = store[i,t] - sum{j in prd} units[i,j] * make[j,t]; % subject to rlim 'regular-time limit' {t in time}: % sum{p in prd} pt[p] * rprd[p,t] <= 1.3 * dpp[t] * crews[t]; % \end{verbatim} A sentença de restrição declara uma restrição. Se o domínio do subíndice não é especificado, a restrição é uma restrição simples (escalar), caso contrário, é uma matriz $n$-dimensional de restrições elementares. Restrições elementares associadas com a restrição do modelo (se é uma restrição simples) ou seus membros (se é uma matriz) correspondem a restrições lineares na formulação do problema de PL/PIM (ver Seção \ref{problem}, página \pageref{problem}). Se a restrição possui a forma de igualdade ou desigualdade simples, i.e., inclui duas expressões, uma segue depois dos dois pontos e a outra segue depois do sinal de relação {\tt=}, {\tt<=} ou {\tt>=}, \linebreak ambas expressões na sentença podem ser expressões lineares. Se a restrição possui a forma de uma \linebreak desigualdade dupla, i.e., inclui três expressões, a expressão do meio pode ser uma expressão linear, enquanto a da esquerda e a da direita podem ser apenas expressões numéricas. Gerar o modelo é, a grosso modo, gerar suas restrições, que são sempre avaliadas para todo domínio do subíndice. Avaliar as restrições, por sua vez, leva a avaliação de outros objetos de modelo tais como conjuntos, parâmetros e variáveis. A construção de uma restrição linear incluída na instância do problema, que corresponde a uma restrição elementar particular, é realizada como segue. % The constraint statement declares a constraint. If a subscript domain % is not specified, the\linebreak constraint is a simple (scalar) % constraint, otherwise it is a $n$-dimensional array of elemental % constraints. % % Elemental constraint(s) associated with the model constraint (if it is % a simple constraint) or its members (if it is an array) correspond to % the linear constraints in the LP/MIP problem formulation (see % Section \ref{problem}, page \pageref{problem}). % % If the constraint has the form of equality or single inequality, i.e. % includes two expressions, one of which follows the colon and other % follows the relation sign {\tt=}, {\tt<=}, or {\tt>=}, both expressions % in the statement can be linear expressions. If the constraint has the % form of double inequality,\linebreak i.e. includes three expressions, % the middle expression can be a linear expression while the leftmost and % rightmost ones can be only numeric expressions. % % Generating the model is, roughly speaking, generating its constraints, % which are always evaluated for the entire subscript domain. Evaluation % of the constraints leads, in turn, to evaluation of other model objects % such as sets, parameters, and variables. % % Constructing an actual linear constraint included in the problem % instance, which (constraint) corresponds to a particular elemental % constraint, is performed as follows. Se a restrição possui a forma de igualdade ou desigualdade simples, a avaliação de ambas \linebreak expressões lineares resultam em duas formas lineares: $$\begin{array}{r@{\ }c@{\ }r@{\ }c@{\ }r@{\ }c@{\ }r@{\ }c@{\ }r} f&=&a_1x_1&+&a_2x_2&+\dots+&a_nx_n&+&a_0,\\ g&=&b_1x_1&+&b_2x_2&+\dots+&b_nx_n&+&b_0,\\ \end{array}$$ onde $x_1$, $x_2$, \dots, $x_n$ são variáveis elementares; $a_1$, $a_2$, \dots, $a_n$, $b_1$, $b_2$, \dots, $b_n$ são coeficientes numéricos; $a_0$ e $b_0$ são termos constantes. Em seguida, todos os termos lineares de $f$ e $g$ são levados ao lado esquerdo, enquanto que os termos constantes são levados ao lado direito, resultando na restrição elementar final na forma padrão: $$(a_1-b_1)x_1+(a_2-b_2)x_2+\dots+(a_n-b_n)x_n\left\{ \begin{array}{@{}c@{}}=\\\leq\\\geq\\\end{array}\right\}b_0-a_0.$$ Se a restrição possui a forma de desigualdade dupla, a avaliação da expressão linear do meio resulta na seguinte forma linear: $$f=a_1x_1+a_2x_2+\dots+a_nx_n+a_0,$$ e a avaliação das expressões numéricas da esquerda e da direita dão dois valores numéricos $l$ e $u$, respectivamente. Logo, o termo constante da forma linear é levado tanto à esquerda como à direita para gerar a restrição elementar final na forma padrão: $$l-a_0\leq a_1x_1+a_2x_2+\dots+a_nx_n\leq u-a_0.$$ % If the constraint has the form of equality or single inequality, % evaluation of both linear expressions gives two resultant linear forms: % $$\begin{array}{r@{\ }c@{\ }r@{\ }c@{\ }r@{\ }c@{\ }r@{\ }c@{\ }r} % f&=&a_1x_1&+&a_2x_2&+\dots+&a_nx_n&+&a_0,\\ % g&=&b_1x_1&+&a_2x_2&+\dots+&a_nx_n&+&b_0,\\ % \end{array}$$ % where $x_1$, $x_2$, \dots, $x_n$ are elemental variables; $a_1$, $a_2$, % \dots, $a_n$, $b_1$, $b_2$, \dots, $b_n$ are numeric coefficients; % $a_0$ and $b_0$ are constant terms. Then all linear terms of $f$ and % $g$ are carried to the left-hand side, and the constant terms are % carried to the right-hand side, that gives the final elemental % constraint in the standard form: % $$(a_1-b_1)x_1+(a_2-b_2)x_2+\dots+(a_n-b_n)x_n\left\{ % \begin{array}{@{}c@{}}=\\\leq\\\geq\\\end{array}\right\}b_0-a_0.$$ % % If the constraint has the form of double inequality, evaluation of the % middle linear expression gives the resultant linear form: % $$f=a_1x_1+a_2x_2+\dots+a_nx_n+a_0,$$ % and evaluation of the leftmost and rightmost numeric expressions gives % two numeric values $l$ and $u$, respectively. Then the constant term of % the linear form is carried to both left-hand and right-handsides that % gives the final elemental constraint in the standard form: % $$l-a_0\leq a_1x_1+a_2x_2+\dots+a_nx_n\leq u-a_0.$$ \section{Sentença objective} \noindent \framebox[468pt][l]{ \parbox[c][44pt]{468pt}{ \hspace{6pt} {\tt minimize} {\it nome} {\it alias} {\it domínio} {\tt:} {\it expressão} {\tt;} \medskip \hspace{6pt} {\tt maximize} {\it nome} {\it alias} {\it domínio} {\tt:} {\it expressão} {\tt;} }} \medskip \noindent {\it nome} é um nome simbólico do objetivo; \noindent {\it alias} é uma literal de cadeia opcional que especifica um pseudônimo do objetivo; \noindent {\it domínio} é uma expressão indexante opcional que especifica um domínio do subíndice do objetivo; \noindent {\it expressão} é uma expressão linear usada pra calcular a forma linear do objetivo. % \noindent % \framebox[468pt][l]{ % \parbox[c][44pt]{468pt}{ % \hspace{6pt} {\tt minimize} {\it name} {\it alias} {\it domain} {\tt:} % {\it expression} {\tt;} % % \medskip % % \hspace{6pt} {\tt maximize} {\it name} {\it alias} {\it domain} {\tt:} % {\it expression} {\tt;} % }} % % \medskip % % \noindent % {\it name} is a symbolic name of the objective; % % \noindent % {\it alias} is an optional string literal, which specifies an alias of % the objective; % % \noindent % {\it domain} is an optional indexing expression, which specifies % a subscript domain of the objective; % % \noindent % {\it expression} is a linear expression used to compute the linear form % of the objective. \newpage \para{Exemplos} % \para{Examples} \begin{verbatim} minimize obj: x + 1.5 * (y + z); maximize lucro_total: sum{p in produto} lucro[p] * produzir[p]; \end{verbatim} % \begin{verbatim} % minimize obj: x + 1.5 * (y + z); % maximize total_profit: sum{p in prd} profit[p] * make[p]; % \end{verbatim} A sentença objective declara um objetivo. Se o domínio do subíndice não é especificado, o objetivo é um objetivo simples (escalar). Caso contrário, é uma matriz $n$-dimensional de objetivos elementares. Objetivos elementares associados com o objetivo do modelo (se é um objetivo simples) ou seus membros (se é uma matriz) correspondem a restrições lineares genéricas na formulação do problema PL/PIM (ver Seção \ref{problem}, página \pageref{problem}). No entanto, diferentemente das restrições, estas formas lineares são livres (ilimitadas). A construção de uma forma linear incluída na instância do problema, a qual corresponde a uma restrição elementar particular, é realizada como segue. A expressão linear especificada da na sentença objective é avaliada para resultar na seguinte forma linear: $$f=a_1x_1+a_2x_2+\dots+a_nx_n+a_0,$$ onde $x_1$, $x_2$, \dots, $x_n$ são variáveis elementares; $a_1$, $a_2$, \dots, $a_n$ são coeficientes numéricos; $a_0$ é o termo constante. Logo, a forma linear é usada para construir a restrição final elementar na forma padrão: $$-\infty= 0 and y >= 0; check sum{i in ORIG} suprimento[i] = sum{j in DEST} demanda[j]; check{i in I, j in 1..10}: S[i,j] in U[i] union V[j]; \end{verbatim} A sentença check permite a verificação do valor resultante de uma expressão lógica especificada na sentença. Se o valor é {\it falso}, um erro é reportado. Se o domínio do subíndice não é especificado, a verificação é realizada apenas uma vez. \linebreak Especificar o domínio do subíndice permite a execução de verificações múltiplas para cada $n$-tupla no conjunto domínio. Neste último caso, a expressão lógica pode incluir índices introduzidos na expressão indexante correspondente. % \noindent % \framebox[468pt][l]{ % \parbox[c][24pt]{468pt}{ % \hspace{6pt} {\tt check} {\it domain} {\tt:} {\it expression} {\tt;} % }} % % \medskip % % \noindent % {\it domain} is an optional indexing expression, which specifies % a subscript domain of the check statement; % % \noindent % {\it expression} is an logical expression which specifies the logical % condition to be checked. (The colon preceding {\it expression} may be % omitted.) % % \para{Examples} % % \begin{verbatim} % check: x + y <= 1 and x >= 0 and y >= 0; % check sum{i in ORIG} supply[i] = sum{j in DEST} demand[j]; % check{i in I, j in 1..10}: S[i,j] in U[i] union V[j]; % \end{verbatim} % % The check statement allows checking the resultant value of an logical % expression specified in the statement. If the value is {\it false}, an % error is reported. % % If the subscript domain is not specified, the check is performed only % once. Specifying the subscript domain allows performing multiple check % for every $n$-tuple in the domain set. In the latter case the logical % expression may include dummy indices introduced in corresponding % indexing expression. \section{Sentença display} \noindent \framebox[468pt][l]{ \parbox[c][24pt]{468pt}{ \hspace{6pt} {\tt display} {\it domínio} {\tt:} {\it item} {\tt,} \dots {\tt,} {\it item} {\tt;} }} \medskip \noindent {\it domínio} é uma expressão indexante opcional que especifica um domínio do subíndice da sentença display; \noindent {\it item}, \dots, {\it item} são itens a serem mostrados (os dois pontos que precedem o primeiro item podem ser omitidos). \para{Exemplos} \begin{verbatim} display: 'x =', x, 'y =', y, 'z =', z; display sqrt(x ** 2 + y ** 2 + z ** 2); display{i in I, j in J}: i, j, a[i,j], b[i,j]; \end{verbatim} A sentença display avalia todos itens especificados na sentença e escreve seus valores em saída padrão (terminal) em formato de texto plano. Se um domínio de subíndice não é especificado, os itens são avaliados e mostrados apenas uma vez. Ao especificar o domínio do subíndice, itens são avaliados e mostrados para cada $n$-tupla no conjunto do domínio. No último caso, os itens podem incluir índices introduzidos na expressão indexante correspondente. Um item a ser mostrado pode ser um objeto de modelo (conjunto, parâmetro, variável, restrição, objetivo) ou uma expressão. Se um item é um objeto calculável (i.e., um conjunto ou parâmetro com o atributo de atribuição), o objeto é avaliado por todo domínio e em seguida, seu conteúdo (i.e., o conteúdo da matriz de objetos) é mostrado. Caso contrário, se o item não é um objeto calculável, somente seu seu conteúdo corrente (i.e., os membros realmente gerados durante a avaliação do modelo) é mostrado. Se o item é uma expressão, a expressão é avaliada e seu valor resultante é mostrado. % \noindent % \framebox[468pt][l]{ % \parbox[c][24pt]{468pt}{ % \hspace{6pt} {\tt display} {\it domain} {\tt:} {\it item} {\tt,} % \dots {\tt,} {\it item} {\tt;} % }} % % \medskip % % \noindent % {\it domain} is an optional indexing expression, which specifies % a subscript domain of the display statement; % % \noindent % {\it item}, \dots, {\it item} are items to be displayed. (The colon % preceding the first item may be omitted.) % % \para{Examples} % % \begin{verbatim} % display: 'x =', x, 'y =', y, 'z =', z; % display sqrt(x ** 2 + y ** 2 + z ** 2); % display{i in I, j in J}: i, j, a[i,j], b[i,j]; % \end{verbatim} % % The display statement evaluates all items specified in the statement % and writes their values on the standard output (terminal) in plain text % format. % % If a subscript domain is not specified, items are evaluated and then % displayed only once. Specifying the subscript domain causes items to be % evaluated and displayed for every $n$-tuple in the domain set. In the % latter case items may include dummy indices introduced in corresponding % indexing expression. % % An item to be displayed can be a model object (set, parameter, % variable, constraint, objective) or an expression. % % If the item is a computable object (i.e. a set or parameter provided % with the assign attribute), the object is evaluated over the entire % domain and then its content (i.e. the content of the object array) is % displayed. Otherwise, if the item is not a computable object, only its % current content (i.e. members actually generated during the model % evaluation) is displayed. % % If the item is an expression, the expression is evaluated and its % resultant value is displayed. \section{Sentença printf} \noindent \framebox[468pt][l]{ \parbox[c][64pt]{468pt}{ \hspace{6pt} {\tt printf} {\it domínio} {\tt:} {\it formato} {\tt,} {\it expressão} {\tt,} \dots {\tt,} {\it expressão} {\tt;} \medskip \hspace{6pt} {\tt printf} {\it domínio} {\tt:} {\it formato} {\tt,} {\it expressão} {\tt,} \dots {\tt,} {\it expressão} {\tt>} {\it nome-do-arquivo} {\tt;} \medskip \hspace{6pt} {\tt printf} {\it domínio} {\tt:} {\it formato} {\tt,} {\it expressão} {\tt,} \dots {\tt,} {\it expressão} {\tt>>} {\it nome-do-arquivo} {\tt;} }} \medskip \noindent {\it domínio} é uma expressão indexante opcional que especifica o domínio do subíndice da sentença printf; \noindent {\it formato} é uma expressão simbólica cujo valor especifica uma cadeia de controle de formato (os dois pontos que precedem a expressão de formato podem ser omitidos). \noindent {\it expressão}, \dots, {\it expressão} são zero ou mais expressões cujos valores devem ser formatados e impressos. Cada expressão deve ser de tipo numérico, simbólico ou lógico. \noindent {\it nome-do-arquivo} é uma expressão simbólica cujo valor especifica um nome de um arquivo de texto para onde a saída é redirecionada. O sinal {\tt>} significa criar um novo aquivo vazio, enquanto o sinal {\tt>>} significa acrescentar a saída a um arquivo existente. Se o nome do arquivo não é especificado, a saída é escrita na saída padrão (terminal). \para{Exemplos} \begin{verbatim} printf 'Ola, mundo!\n'; printf: "x = %.3f; y = %.3f; z = %.3f\n", x, y, z > "resultado.txt"; printf{i in I, j in J}: "fluxo de %s para %s eh %d\n", i, j, x[i,j] >> arquivo_resultado & ".txt"; printf{i in I} 'fluxo total de %s eh %g\n', i, sum{j in J} x[i,j]; printf{k in K} "x[%s] = " & (if x[k] < 0 then "?" else "%g"), k, x[k]; \end{verbatim} A sentença printf é similar a sentença display, no entanto, ela permite formatar os dados a serem escritos. Se um domínio do subíndice não é especificado, a sentença printf é executada apenas uma vez. Especificar um domínio do subíndice gera a execução da sentença printf para cada $n$-tupla no conjunto do domínio. No último caso, o formato e a expressão podem incluir índices introduzidos nas expressões indexantes correspondentes. A cadeia de controle de formato é valor da expressão simbólica {\it formato} especificada na sentença printf. Ela é composta de zero ou mais diretivas, como segue: tanto caracteres ordinários (exceto {\tt\%}), que são copiados sem modificação ao fluxo de saída, quanto especificações de conversão, provocam a avaliação da expressão correspondente especificada na sentença printf, do seu formato e da escrita do valor resultante no fluxo de saída. As especificações de conversão que podem ser usadas na cadeia de controle de formato são as seguintes: {\tt d}, {\tt i}, {\tt f}, {\tt F}, {\tt e}, {\tt E}, {\tt g}, {\tt G} e {\tt s}. Estas especificações possuem a mesma sintaxe e semântica que na linguagem de programação C. % \noindent % \framebox[468pt][l]{ % \parbox[c][64pt]{468pt}{ % \hspace{6pt} {\tt printf} {\it domain} {\tt:} {\it format} {\tt,} % {\it expression} {\tt,} \dots {\tt,} {\it expression} {\tt;} % % \medskip % % \hspace{6pt} {\tt printf} {\it domain} {\tt:} {\it format} {\tt,} % {\it expression} {\tt,} \dots {\tt,} {\it expression} {\tt>} % {\it filename} {\tt;} % % \medskip % % \hspace{6pt} {\tt printf} {\it domain} {\tt:} {\it format} {\tt,} % {\it expression} {\tt,} \dots {\tt,} {\it expression} {\tt>>} % {\it filename} {\tt;} % }} % % \medskip % % \noindent % {\it domain} is an optional indexing expression, which specifies % a subscript domain of the printf statement; % % \noindent % {\it format} is a symbolic expression whose value specifies a format % control string. (The colon preceding the format expression may be % omitted.) % % \noindent % {\it expression}, \dots, {\it expression} are zero or more expressions % whose values have to be formatted and printed. Each expression should % be of numeric, symbolic, or logical type. % % \noindent % {\it filename} is a symbolic expression whose value specifies a name % of a text file, to which the output is redirected. The flag {\tt>} % means creating a new empty file while the flag {\tt>>} means appending % the output to an existing file. If no file name is specified, the % output is written on the standard output (terminal). % % \para{Examples} % % \begin{verbatim} % printf 'Hello, world!\n'; % printf: "x = %.3f; y = %.3f; z = %.3f\n", x, y, z > "result.txt"; % printf{i in I, j in J}: "flow from %s to %s is %d\n", i, j, x[i,j] % >> result_file & ".txt"; % printf{i in I} 'total flow from %s is %g\n', i, sum{j in J} x[i,j]; % printf{k in K} "x[%s] = " & (if x[k] < 0 then "?" else "%g"), % k, x[k]; % \end{verbatim} % % The printf statement is similar to the display statement, however, it % allows formatting data to be written. % % If a subscript domain is not specified, the printf statement is % executed only once. Specifying a subscript domain causes executing the % printf statement for every $n$-tuple in the domain set. In the latter % case the format and expression may include dummy indices introduced in % corresponding indexing expression. % % The format control string is a value of the symbolic expression % {\it format} specified in the printf statement. It is composed of zero % or more directives as follows: ordinary characters (not {\tt\%}), which % are copied unchanged to the output stream, and conversion % specifications, each of which causes evaluating corresponding % expression specified in the printf statement, formatting it, and % writing its resultant value to the output stream. % % Conversion specifications that may be used in the format control string % are the following:\linebreak {\tt d}, {\tt i}, {\tt f}, {\tt F}, % {\tt e}, {\tt E}, {\tt g}, {\tt G}, and {\tt s}. These specifications % have the same syntax and semantics as in the C programming language. \section{Sentença for} \noindent \framebox[468pt][l]{ \parbox[c][44pt]{468pt}{ \hspace{6pt} {\tt for} {\it domínio} {\tt:} {\it sentença} {\tt;} \medskip \hspace{6pt} {\tt for} {\it domínio} {\tt:} {\tt\{} {\it sentença} \dots {\it sentença} {\tt\}} {\tt;} }} \medskip \noindent {\it domínio} é uma expressão indexante que especifica um domínio do subíndice da sentença for. (Os dois pontos que seguem a expressão indexante podem ser omitidos). \noindent {\it sentença} é uma sentença que deve ser executada sob o controle da sentença for; \noindent {\it sentença}, \dots, {\it sentença} é uma sequência de sentenças (cercada entre chaves) que deve ser executada sob o controle da sentença for. Apenas as sentenças seguintes podem ser usadas dentro da sentença for: check, display, printf e outro for. \para{Exemplos} \begin{verbatim} for {(i,j) in E: i != j} { printf "fluxo de %s para %s eh %g\n", i, j, x[i,j]; check x[i,j] >= 0; } for {i in 1..n} { for {j in 1..n} printf " %s", if x[i,j] then "Q" else "."; printf("\n"); } for {1..72} printf("*"); \end{verbatim} A sentença for faz com que a sentença, ou uma sequência de sentenças especificadas como parte da sentença for, seja executada para cada $n$-tupla no conjunto do domínio. Assim, sentenças dentro da sentença for podem incluir índices introduzidos na expressão indexante correspondente. % \noindent % \framebox[468pt][l]{ % \parbox[c][44pt]{468pt}{ % \hspace{6pt} {\tt for} {\it domain} {\tt:} {\it statement} {\tt;} % % \medskip % % \hspace{6pt} {\tt for} {\it domain} {\tt:} {\tt\{} {\it statement} % \dots {\it statement} {\tt\}} {\tt;} % }} % % \medskip % % \noindent % {\it domain} is an indexing expression which specifies a subscript % domain of the for statement. (The colon following the indexing % expression may be omitted.) % % \noindent % {\it statement} is a statement, which should be executed under control % of the for statement; % % \noindent % {\it statement}, \dots, {\it statement} is a sequence of statements % (enclosed in curly braces), which should be executed under control of % the for statement. % % Only the following statements can be used within the for statement: % check, display, printf, and another for. % % \para{Examples} % % \begin{verbatim} % for {(i,j) in E: i != j} % { printf "flow from %s to %s is %g\n", i, j, x[i,j]; % check x[i,j] >= 0; % } % for {i in 1..n} % { for {j in 1..n} printf " %s", if x[i,j] then "Q" else "."; % printf("\n"); % } % for {1..72} printf("*"); % \end{verbatim} % % The for statement causes a statement or a sequence of statements % specified as part of the for statement to be executed for every % $n$-tuple in the domain set. Thus, statements within the for statement % may include dummy indices introduced in corresponding indexing % expression. \newpage \section{Sentença table} \noindent \framebox[468pt][l]{ \parbox[c][80pt]{468pt}{ \hspace{6pt} {\tt table} {\it nome} {\it alias} {\tt IN} {\it controlador} {\it arg} \dots {\it arg} {\tt:} \hspace{6pt} {\tt\ \ \ \ \ } {\it conjunto} {\tt<-} {\tt[} {\it cmp} {\tt,} \dots {\tt,} {\it cmp} {\tt]} {\tt,} {\it par} {\tt\textasciitilde} {\it cmp} {\tt,} \dots {\tt,} {\it par} {\tt\textasciitilde} {\it cmp} {\tt;} \medskip \hspace{6pt} {\tt table} {\it nome} {\it alias} {\it domínio} {\tt OUT} {\it controlador} {\it arg} \dots {\it arg} {\tt:} \hspace{6pt} {\tt\ \ \ \ \ } {\it expr} {\tt\textasciitilde} {\it cmp} {\tt,} \dots {\tt,} {\it expr} {\tt\textasciitilde} {\it cmp} {\tt;} }} \medskip \noindent {\it nome} é um nome simbólico da tabela; \noindent {\it alias} é um literal de cadeia opcional que especifica um pseudônimo da tabela; \noindent {\it domínio} é uma expressão indexante que especifica o domínio do subíndice da tabela (de saída); \noindent {\tt IN} significa ler dados de uma tabela de entrada; \noindent {\tt OUT} significa escrever dados em uma tabela de saída; \noindent {\it controlador} é uma expressão simbólica que especifica o controlador usado para acessar a tabela (para mais detalhes, ver Apêndice \ref{drivers}, página \pageref{drivers}); \noindent {\it arg} é uma expressão simbólica opcional, que é um argumento passado ao controlador da tabela. Esta expressão simbólica não deveria incluir índices especificados no domínio; \noindent {\it conjunto} é o nome de um conjunto simples opcional chamado {\it conjunto de controle}. Pode ser omitido junto com o delimitador {\tt<-}; \noindent {\it cmp} é um nome de campo. Entre colchetes, pelo menos um campo deve ser especificado. O nome do campo, que segue o nome do parâmetro ou de uma expressão, é opcional e pode ser omitido juntamente com o delimitador~{\tt\textasciitilde}. Neste caso o nome do objeto de modelo correspondente é usado como nome de campo; \noindent {\it par} é um nome simbólico de um parâmetro do modelo; \noindent {\it expr} é uma expressão numérica ou simbólica. \para{Exemplos} \begin{verbatim} table dados IN "CSV" "dados.csv": S <- [DE,PARA], d~DISTANCIA, c~CUSTO; table resultado{(d,p) in S} OUT "CSV" "resultado.csv": d~DE, p~PARA, x[d,p]~FLUXO; \end{verbatim} A sentença table permite a leitura de dados de uma tabela para objetos de modelo como conjuntos e parâmetros (não-escalares) assim como escrever dados do modelo para uma tabela. % \noindent % \framebox[468pt][l]{ % \parbox[c][80pt]{468pt}{ % \hspace{6pt} {\tt table} {\it name} {\it alias} {\tt IN} {\it driver} % {\it arg} \dots {\it arg} {\tt:} % % \hspace{6pt} {\tt\ \ \ \ \ } {\it set} {\tt<-} {\tt[} {\it fld} {\tt,} % \dots {\tt,} {\it fld} {\tt]} {\tt,} {\it par} {\tt\textasciitilde} % {\it fld} {\tt,} \dots {\tt,} {\it par} {\tt\textasciitilde} {\it fld} % {\tt;} % % \medskip % % \hspace{6pt} {\tt table} {\it name} {\it alias} {\it domain} {\tt OUT} % {\it driver} {\it arg} \dots {\it arg} {\tt:} % % \hspace{6pt} {\tt\ \ \ \ \ } {\it expr} {\tt\textasciitilde} {\it fld} % {\tt,} \dots {\tt,} {\it expr} {\tt\textasciitilde} {\it fld} {\tt;} % }} % % \medskip % % \noindent % {\it name} is a symbolic name of the table; % % \noindent % {\it alias} is an optional string literal, which specifies an alias of % the table; % % \noindent % {\it domain} is an indexing expression, which specifies a subscript % domain of the (output) table; % % \noindent % {\tt IN} means reading data from the input table; % % \noindent % {\tt OUT} means writing data to the output table; % % \noindent % {\it driver} is a symbolic expression, which specifies the driver used % to access the table (for details see Appendix \ref{drivers}, page % \pageref{drivers}); % % \noindent % {\it arg} is an optional symbolic expression, which is an argument % pass\-ed to the table driver. This symbolic expression should not % include dummy indices specified in the domain; % % \noindent % {\it set} is the name of an optional simple set called {\it control % set}. It can be omitted along with the delimiter {\tt<-}; % % \noindent % {\it fld} is a field name. Within square brackets at least one field % should be specified. The field name following a parameter name or % expression is optional and can be omitted along with the % delimiter~{\tt\textasciitilde}, in which case the name of corresponding % model object is used as the field name; % % \noindent % {\it par} is a symbolic name of a model parameter; % % \noindent % {\it expr} is a numeric or symbolic expression. % % \para{Examples} % % \begin{verbatim} % table data IN "CSV" "data.csv": S <- [FROM,TO], d~DISTANCE, % c~COST; % table result{(f,t) in S} OUT "CSV" "result.csv": f~FROM, t~TO, % x[f,t]~FLOW; % \end{verbatim} % % The table statement allows reading data from a table into model % objects such as sets and (non-scalar) parameters as well as writing % data from the model to a table. \newpage \subsection{Estrutura de tabelas} Uma {\it tabela de dados} é um conjunto (desordenado) de {\it registros}, onde cada registro consiste do mesmo número de {\it campos} e cada campo possui um único nome simbólico denominado o {\it nome do campo}. Por exemplo: \bigskip \begin{tabular}{@{\hspace*{42mm}}c@{\hspace*{11mm}}c@{\hspace*{10mm}}c @{\hspace*{9mm}}c} Primeiro&Segundo&&Último\\ campo&campo&.\ \ .\ \ .&campo\\ $\downarrow$&$\downarrow$&&$\downarrow$\\ \end{tabular} \begin{tabular}{ll@{}} Cabeçalho da tabela&$\rightarrow$\\ Primeiro registro&$\rightarrow$\\ Segundo registro&$\rightarrow$\\ \\ \hfil .\ \ .\ \ .\\ \\ Último registro&$\rightarrow$\\ \end{tabular} \begin{tabular}{|l|l|c|c|} \hline {\tt DE}&{\tt PARA}&{\tt DISTANCIA}&{\tt CUSTO}\\ \hline {\tt Seattle} &{\tt New-York}&{\tt 2.5}&{\tt 0.12}\\ {\tt Seattle} &{\tt Chicago} &{\tt 1.7}&{\tt 0.08}\\ {\tt Seattle} &{\tt Topeka} &{\tt 1.8}&{\tt 0.09}\\ {\tt San-Diego}&{\tt New-York}&{\tt 2.5}&{\tt 0.15}\\ {\tt San-Diego}&{\tt Chicago} &{\tt 1.8}&{\tt 0.10}\\ {\tt San-Diego}&{\tt Topeka} &{\tt 1.4}&{\tt 0.07}\\ \hline \end{tabular} % A {\it data table} is an (unordered) set of {\it records}, where each % record consists of the same number of {\it fields}, and each field is % provided with a unique symbolic name called the {\it field name}. For % example: % % \bigskip % % \begin{tabular}{@{\hspace*{42mm}}c@{\hspace*{11mm}}c@{\hspace*{10mm}}c % @{\hspace*{9mm}}c} % First&Second&&Last\\ % field&field&.\ \ .\ \ .&field\\ % $\downarrow$&$\downarrow$&&$\downarrow$\\ % \end{tabular} % % \begin{tabular}{ll@{}} % Table header&$\rightarrow$\\ % First record&$\rightarrow$\\ % Second record&$\rightarrow$\\ % \\ % \hfil .\ \ .\ \ .\\ % \\ % Last record&$\rightarrow$\\ % \end{tabular} % \begin{tabular}{|l|l|c|c|} % \hline % {\tt FROM}&{\tt TO}&{\tt DISTANCE}&{\tt COST}\\ % \hline % {\tt Seattle} &{\tt New-York}&{\tt 2.5}&{\tt 0.12}\\ % {\tt Seattle} &{\tt Chicago} &{\tt 1.7}&{\tt 0.08}\\ % {\tt Seattle} &{\tt Topeka} &{\tt 1.8}&{\tt 0.09}\\ % {\tt San-Diego}&{\tt New-York}&{\tt 2.5}&{\tt 0.15}\\ % {\tt San-Diego}&{\tt Chicago} &{\tt 1.8}&{\tt 0.10}\\ % {\tt San-Diego}&{\tt Topeka} &{\tt 1.4}&{\tt 0.07}\\ % \hline % \end{tabular} \subsection{Lendo dados de uma tabela de entrada} A sentença tabela de entrada faz a leitura de dados da tabela especificada, registro por registro. Uma vez que o registro subsequente foi lido, valores numéricos ou simbólicos dos campos, cujos nomes são cercados entre colchetes na sentença table, são reunidos em um $n$-tuplo. Se o conjunto de controle é especificado na sentença table, este $n$-tuplo é adicionado a ele. Além disso, um valor numérico ou simbólico de cada campo associado com um parâmetro do modelo é atribuído ao membro do parâmetro identificado por subíndices, que são componentes da $n$-tupla que acabou de ser lida. Por exemplo, a seguinte sentença de tabela de entrada: \noindent\hfil \verb|table dados IN "...": S <- [DE,PARA], d~DISTANCIA, c~CUSTO;| \noindent faz a leitura de valores de quatro campos chamados {\tt DE}, {\tt PARA}, {\tt DISTANCIA} e {\tt CUSTO} de cada registro da tabela especificada. Os valores dos campos {\tt DE} e {\tt PARA} dão um par $(f,t)$, que é adicionado ao conjunto de controle {\tt S}. O valor do campo {\tt DISTANCIA} é atribuído ao membro do parâmetro ${\tt d}[f,t]$ enquanto que o valor do campo {\tt CUSTO} é atribuído ao membro do parâmetro ${\tt c}[f,t]$. Note que a tabela de entrada pode conter campos adicionais cujos nomes não sejam especificados na sentença tabela, neste caso, os valores destes campos serão ignorados na leitura da tabela. % The input table statement causes reading data from the specified table % record by record. % % Once a next record has been read, numeric or symbolic values of fields, % whose names are enclosed in square brackets in the table statement, are % gathered into $n$-tuple, and if the control set is specified in the % table statement, this $n$-tuple is added to it. Besides, a numeric or % symbolic value of each field associated with a model parameter is % assigned to the parameter member identified by subscripts, which are % components of the $n$-tuple just read. % % For example, the following input table statement: % % \noindent\hfil % \verb|table data IN "...": S <- [FROM,TO], d~DISTANCE, c~COST;| % % \noindent % causes reading values of four fields named {\tt FROM}, {\tt TO}, % {\tt DISTANCE}, and {\tt COST} from each record of the specified table. % Values of fields {\tt FROM} and {\tt TO} give a pair $(f,t)$, which is % added to the control set {\tt S}. The value of field {\tt DISTANCE} is % assigned to parameter member ${\tt d}[f,t]$, and the value of field % {\tt COST} is assigned to parameter member ${\tt c}[f,t]$. % % Note that the input table may contain extra fields whose names are not % specified in the table statement, in which case values of these fields % on reading the table are ignored. \subsection{Escrevendo dados em uma tabela de saída} A sentença tabela de saída gera a escrita de dados na tabela especificada. Note que alguns controladores (chamados CSV e xBASE) destroem a tabela de saída antes de escrever os dados, i.e., deletam todos os registros existentes. Cada $n$-tupla no domínio do conjunto especificado gera um registro escrito na tabela de saída. Os valores dos campos são valores numéricos ou simbólicos das expressões correspondentes especificadas na sentença table. Estas expressões são avaliadas para cada $n$-tupla no conjunto do domínio, portanto, podem incluir índices introduzidos na expressão indexante correspondente. Por exemplo, a seguinte sentença da tabela de saída: \noindent\hfil \verb|table resultado{(f,t) in S} OUT "...": f~DE, t~PARA, x[f,t]~FLUXO;| \noindent gera a escrita de registros; um registro para cada par $(f,t)$ no conjunto {\tt S} para a tabela de saída, onde cada registro consiste de três campos chamados {\tt DE}, {\tt PARA} e {\tt FLUXO}. Os valores escritos nos campos {\tt DE} e {\tt PARA} são os valores correntes dos índices {\tt f} e {\tt t}. O valor escrito no campo {\tt FLUXO} é um valor do membro ${\tt x}[f,t]$ do correspondente parâmetro ou variável indexada. % The output table statement causes writing data to the specified table. % Note that some drivers (namely, CSV and xBASE) destroy the output table % before writing data, i.e. delete all its existing records. % % Each $n$-tuple in the specified domain set generates one record written % to the output table. Values of fields are numeric or symbolic values of % corresponding expressions specified in the table statement. These % expressions are evaluated for each $n$-tuple in the domain set and, % thus, may include dummy indices introduced in the corresponding indexing % expression. % % For example, the following output table statement: % % \noindent\hfil % \verb|table result{(f,t) in S} OUT "...": f~FROM, t~TO, x[f,t]~FLOW;| % % \noindent % causes writing records, by one record for each pair $(f,t)$ in set % {\tt S}, to the output table, where each record consists of three % fields named {\tt FROM}, {\tt TO}, and {\tt FLOW}. The values written % to fields {\tt FROM} and {\tt TO} are current values of dummy indices % {\tt f} and {\tt t}, and the value written to field {\tt FLOW} is % a value of member ${\tt x}[f,t]$ of corresponding subscripted parameter % or variable. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Dados do modelo} Os {\it dados do modelo} includem conjuntos elementares, que são ``valores'' dos conjuntos do modelo, e valores numéricos e simbólicos dos parâmetros do modelo. Em MathProg existem duas formas diferentes de fornecer valores aos conjuntos e parâmetros do modelo. Uma forma é simplesmente prover os dados necessários usando o atributo de atribuição. No entanto, em muitos casos é mais prático separar o modelo próprio dos dados particulares necessários para o modelo. Para o último caso, em MathProg há uma outra forma, em que a descrição do modelo é dividida em duas partes: a seção de modelo e a seção de dados. A {\it seção de modelo} é a principal parte da descrição do modelo. Ela contém todas as declarações de todos objetos do modelo, sendo comum a todos problemas baseados naquele modelo. A {\it seção de dados} é uma parte opcional da descrição do modelo que contém dados específicos para um problema particular. Em MathProg seções de modelo e de dados podem ser localizadas tanto em um arquivo de texto ou em dois arquivos de texto separados. 1. Se ambas seções de modelo e de dados estão localizados em um arquivo, o arquivo é composto como segue: \bigskip \noindent\hfil \framebox{\begin{tabular}{l} {\it sentença}{\tt;}\\ {\it sentença}{\tt;}\\ \hfil.\ \ .\ \ .\\ {\it sentença}{\tt;}\\ {\tt data;}\\ {\it bloco de dados}{\tt;}\\ {\it bloco de dados}{\tt;}\\ \hfil.\ \ .\ \ .\\ {\it bloco de dados}{\tt;}\\ {\tt end;} \end{tabular}} % {\it Model data} include elemental sets, which are ``values'' of model % sets, and numeric and symbolic values of model parameters. % % In MathProg there are two different ways to saturate model sets and % parameters with data. One way is simply providing necessary data using % the assign attribute. However, in many cases it is more practical to % separate the model itself and particular data needed for the model. For % the latter reason in MathProg there is another way, when the model % description is divided into two parts: model section and data section. % % A {\it model section} is a main part of the model description that % contains declarations of all model objects and is common for all % problems based on that model. % % A {\it data section} is an optional part of the model description that % contains model data specific for a particular problem. % % In MathProg model and data sections can be placed either in one text % file or in two separate text files. % % 1. If both model and data sections are placed in one file, the file is % composed as follows: % % \bigskip % % \noindent\hfil % \framebox{\begin{tabular}{l} % {\it statement}{\tt;}\\ % {\it statement}{\tt;}\\ % \hfil.\ \ .\ \ .\\ % {\it statement}{\tt;}\\ % {\tt data;}\\ % {\it data block}{\tt;}\\ % {\it data block}{\tt;}\\ % \hfil.\ \ .\ \ .\\ % {\it data block}{\tt;}\\ % {\tt end;} % \end{tabular}} % 2. Se a seção de modelo e dados são posicionados em dois arquivos separados, os % arquivos são compostos como segue: \newpage 2. Se a seção de modelo e dados são posicionados em dois arquivos separados, os arquivos são compostos como segue: \bigskip \noindent\hfil \begin{tabular}{@{}c@{}} \framebox{\begin{tabular}{l} {\it sentença}{\tt;}\\ {\it sentença}{\tt;}\\ \hfil.\ \ .\ \ .\\ {\it sentença}{\tt;}\\ {\tt end;}\\ \end{tabular}}\\ \\\\Arquivo de modelo\\ \end{tabular} \hspace{32pt} \begin{tabular}{@{}c@{}} \framebox{\begin{tabular}{l} {\tt data;}\\ {\it bloco de dados}{\tt;}\\ {\it bloco de dados}{\tt;}\\ \hfil.\ \ .\ \ .\\ {\it bloco de dados}{\tt;}\\ {\tt end;}\\ \end{tabular}}\\ \\Arquivo de dados\\ \end{tabular} \bigskip Nota: Se a seção de dados é posicionada em um arquivo separado, a palavra-chave {\tt data} é opcional e pode ser omitida juntamente como o ponto e vírgula que a segue. % \bigskip % % \noindent\hfil % \begin{tabular}{@{}c@{}} % \framebox{\begin{tabular}{l} % {\it statement}{\tt;}\\ % {\it statement}{\tt;}\\ % \hfil.\ \ .\ \ .\\ % {\it statement}{\tt;}\\ % {\tt end;}\\ % \end{tabular}}\\ % \\\\Model file\\ % \end{tabular} % \hspace{32pt} % \begin{tabular}{@{}c@{}} % \framebox{\begin{tabular}{l} % {\tt data;}\\ % {\it data block}{\tt;}\\ % {\it data block}{\tt;}\\ % \hfil.\ \ .\ \ .\\ % {\it data block}{\tt;}\\ % {\tt end;}\\ % \end{tabular}}\\ % \\Data file\\ % \end{tabular} % % \bigskip % % Note: If the data section is placed in a separate file, the keyword % {\tt data} is optional and may be omitted along with the semicolon that % follows it. \section{Programando a seção de dados} A {\it seção de dados} é uma sequência de blocos de dados em vários formatos e são discutidos nas seções seguintes. A ordem na qual os blocos de dados seguem na seção de dados pode ser arbitrária, portanto, não precisa ser necessariamente a mesma ordem que seguem os elementos correspondentes da seção de modelo. As regras para programar a seção de dados são comumente as mesmas que as regras de \linebreak programar a descrição do modelo (ver Seção \ref{coding}, página \pageref{coding}), i.e., blocos de dados são compostos com unidades léxicas básicas, como nomes simbólicos, literais numéricos e de cadeia, palavras-chave, \linebreak delimitadores e comentários. No entanto, por conveniência e para melhorar legibilidade, há um desvio da regra comum: se um literal de cadeia consiste unicamente de caracteres alfanuméricos (incluindo o caractere sublinhado), os sinais {\tt+} e {\tt-} e/ou o ponto decimal, ele pode ser programado sem aspas limitadoras (simples ou duplas). Todo material numérico e simbólico provido na seção de dados é programado na forma de números e símbolos, i.e., diferentemente da seção de modelo, não são permitidas expressões na seção de dados. Apesar disso, os sinais {\tt+} e {\tt-} podem preceder literais numéricos para permitir a programação de quantidades numéricas com sinais. Neste caso não deve haver caractere de espaço em branco entre o sinal e o literal numérico seguinte (se houver pelo menos uma espaço em branco, o sinal e o literal numérico seguinte são reconhecidos como duas unidades léxicas diferentes). % The {\it data section} is a sequence of data blocks in various formats, % which are discussed in following sections. The order, in which data % blocks follow in the data section, may be arbitrary, not necessarily % the same, in which corresponding model objects follow in the model % section. % % The rules of coding the data section are commonly the same as the rules % of coding the model description (see Section \ref{coding}, page % \pageref{coding}), i.e. data blocks are composed from basic lexical % units such as symbolic names, numeric and string literals, keywords, % delimiters, and comments. However, for the sake of convenience and for % improving readability there is one deviation from the common rule: if % a string literal consists of only alphanumeric characters (including % the underscore character), the signs {\tt+} and {\tt-}, and/or the % decimal point, it may be coded without bordering by (single or double) % quotes. % % All numeric and symbolic material provided in the data section is coded % in the form of numbers and symbols, i.e. unlike the model section % no expressions are allowed in the data section. Nevertheless, the signs % {\tt+} and {\tt-} can precede numeric literals to allow coding signed % numeric quantities, in which case there should be no white-space % characters between the sign and following numeric literal (if there is % at least one white-space, the sign and following numeric literal are % recognized as two different lexical units). \newpage \section{Bloco de dados set} \noindent \framebox[468pt][l]{ \parbox[c][44pt]{468pt}{ \hspace{6pt} {\tt set} {\it nome} {\tt,} {\it registro} {\tt,} \dots {\tt,} {\it registro} {\tt;} \medskip \hspace{6pt} {\tt set} {\it nome} {\tt[} {\it símbolo} {\tt,} \dots {\tt,} {\it símbolo} {\tt]} {\tt,} {\it registro} {\tt,} \dots {\tt,} {\it registro} {\tt;} }} \medskip \noindent {\it nome} é um nome simbólico do conjunto; \noindent {\it símbolo}, \dots, {\it símbolo} são subíndices que especificam um membro particular do conjunto \linebreak(se o conjunto é uma matriz, i.e., um conjunto de conjuntos); \noindent {\it registro}, \dots, {\it registro} são registros. \noindent As vírgulas que precedem os registros podem ser omitidas. \para{Registros} \vspace*{-8pt} \begin{description} \item[{\tt :=}]\hspace*{0pt}\\ é um elemento de atribuição de registro não-significativo que pode ser usado livremente para melhorar a legibilidade; \item[{\tt(} {\it fatia} {\tt)}]\hspace*{0pt}\\ especifica uma fatia; \item[{\it dados-simples}]\hspace*{0pt}\\ especifica os dados do conjunto em formato simples; \item[{\tt:} {\it dados matriciais}]\hspace*{0pt}\\ especifica os dados do conjunto em formato de matriz; \item[{\tt(tr)} {\tt:} {\it dados matriciais}]\hspace*{0pt}\\ especifica os dados do conjunto em formato de matriz transposta. (Neste caso, os dois pontos que seguem a palavra-chave {\tt(tr)} podem ser omitidos). \end{description} \vspace*{-8pt} \para{Exemplos} \begin{verbatim} set mes := Jan Fev Mar Abr Mai Jun; set mes "Jan", "Fev", "Mar", "Abr", "Mai", "Jun"; set A[3,Mar] := (1,2) (2,3) (4,2) (3,1) (2,2) (4,4) (3,4); set A[3,'Mar'] := 1 2 2 3 4 2 3 1 2 2 4 4 3 4; set A[3,'Mar'] : 1 2 3 4 := 1 - + - - 2 - + + - 3 + - - + 4 - + - + ; set B := (1,2,3) (1,3,2) (2,3,1) (2,1,3) (1,2,2) (1,1,1) (2,1,1); set B := (*,*,*) 1 2 3, 1 3 2, 2 3 1, 2 1 3, 1 2 2, 1 1 1, 2 1 1; set B := (1,*,2) 3 2 (2,*,1) 3 1 (1,2,3) (2,1,3) (1,1,1); set B := (1,*,*) : 1 2 3 := 1 + - - 2 - + + 3 - + - (2,*,*) : 1 2 3 := 1 + - + 2 - - - 3 + - - ; \end{verbatim} \noindent(Nestes exemplos {\tt mes} é um conjunto simples de singletos, {\tt A} é uma matriz 2-dimensional de duplas e {\tt B} é um conjunto simples de triplas. Os blocos de dados para o mesmo conjunto são equivalentes no sentido que especificam os mesmos dados em formatos distintos.) O {\it bloco de dados do conjunto} é usado para especificar um conjunto elementar completo que é atribuído a um conjunto (se é um conjunto simples) ou a um de seus membros (se o conjunto é uma matriz de conjuntos).\footnote{Há uma outra forma de especificar dados para um conjunto simples com dados para os parâmetros. Esta questão é discutida na próxima seção.} Blocos de dados podem ser especificados somente para conjuntos não-calculáveis, i.e., para \linebreak conjuntos que possuem o atributo de atribuição ({\tt:=}) na sentença set correspondente. Se o conjunto é um conjunto simples, somente seus nomes simbólicos devem ser especificados no cabeçalho do bloco de dados. Caso contrário, se o conjunto é uma matriz $n$-dimensional, seus nomes simbólicos devem ser fornecidos com uma lista completa de subíndices separados por vírgulas e cercados em colchetes para especificar um membro particular da matriz de conjuntos. O número de subíndices deve ser igual ao da dimensão da matriz de conjuntos, onde cada subíndice deve ser um número ou um símbolo. Um conjunto elementar definido no bloco de dados é programado como uma sequência de \linebreak registros descritos abaixo.\footnote{{\it Registro} é simplesmente um termo técnico. Não significa que os mesmos possuem qualquer formato especial.} % \noindent % \framebox[468pt][l]{ % \parbox[c][44pt]{468pt}{ % \hspace{6pt} {\tt set} {\it name} {\tt,} {\it record} {\tt,} \dots % {\tt,} {\it record} {\tt;} % % \medskip % % \hspace{6pt} {\tt set} {\it name} {\tt[} {\it symbol} {\tt,} \dots % {\tt,} {\it symbol} {\tt]} {\tt,} {\it record} {\tt,} \dots {\tt,} % {\it record} {\tt;} % }} % % \medskip % % \noindent % {\it name} is a symbolic name of the set; % % \noindent % {\it symbol}, \dots, {\it symbol} are subscripts, which specify % a particular member of the set (if the set is an array, i.e. a set of % sets); % % \noindent % {\it record}, \dots, {\it record} are data records. % % \noindent % Commae preceding data records may be omitted. % % \para{Data records} % % \vspace*{-8pt} % % \begin{description} % \item[{\tt :=}]\hspace*{0pt}\\ % is a non-significant data record, which may be used freely to improve % readability; % \item[{\tt(} {\it slice} {\tt)}]\hspace*{0pt}\\ % specifies a slice; % \item[{\it simple-data}]\hspace*{0pt}\\ % specifies set data in the simple format; % \item[{\tt:} {\it matrix-data}]\hspace*{0pt}\\ % specifies set data in the matrix format; % \item[{\tt(tr)} {\tt:} {\it matrix-data}]\hspace*{0pt}\\ % specifies set data in the transposed matrix format. (In this case the % colon following the keyword {\tt(tr)} may be omitted.) % \end{description} % % \vspace*{-8pt} % % \para{Examples} % % \begin{verbatim} % set month := Jan Feb Mar Apr May Jun; % set month "Jan", "Feb", "Mar", "Apr", "May", "Jun"; % set A[3,Mar] := (1,2) (2,3) (4,2) (3,1) (2,2) (4,4) (3,4); % set A[3,'Mar'] := 1 2 2 3 4 2 3 1 2 2 4 4 3 4; % set A[3,'Mar'] : 1 2 3 4 := % 1 - + - - % 2 - + + - % 3 + - - + % 4 - + - + ; % set B := (1,2,3) (1,3,2) (2,3,1) (2,1,3) (1,2,2) (1,1,1) (2,1,1); % set B := (*,*,*) 1 2 3, 1 3 2, 2 3 1, 2 1 3, 1 2 2, 1 1 1, 2 1 1; % set B := (1,*,2) 3 2 (2,*,1) 3 1 (1,2,3) (2,1,3) (1,1,1); % set B := (1,*,*) : 1 2 3 := % 1 + - - % 2 - + + % 3 - + - % (2,*,*) : 1 2 3 := % 1 + - + % 2 - - - % 3 + - - ; % \end{verbatim} % % \noindent(In these examples {\tt month} is a simple set of singlets, % {\tt A} is a 2-dimensional array of doublets, and {\tt B} is a simple % set of triplets. Data blocks for the same set are equivalent in the % sense that they specify the same data in different formats.) % % The {\it set data block} is used to specify a complete elemental set, % which is assigned to a set (if it is a simple set) or one of its % members (if the set is an array of sets).\footnote{There is another way % to specify data for a simple set along with data for parameters. This % feature is discussed in the next section.} % % Data blocks can be specified only for non-computable sets, i.e. for % sets, which have no assign attribute ({\tt:=}) in the corresponding set % statements. % % If the set is a simple set, only its symbolic name should be specified % in the header of the data block. Otherwise, if the set is a % $n$-dimensional array, its symbolic name should be provided with a % complete list of subscripts separated by commae and enclosed in square % brackets to specify a particular member of the set array. The number of % subscripts should be the same as the dimension of the set array, where % each subscript should be a number or symbol. % % An elemental set defined in the set data block is coded as a sequence % of data records described below.\footnote{{\it Data record} is simply a % technical term. It does not mean that data records have any special % formatting.} \subsection{Registro de atribuição de dados} O {\it registro de atribuição de dados} ({\tt:=}) é um elemento não-significante. Ele pode ser usado para melhorar a legibilidade de blocos de dados. % The {\it assign data record} ({\tt:=}) is a non-signficant element. % It may be used for improving readability of data blocks. \subsection{Registro em fatia de dados} O {\it registro em fatia de dados} é um registro de controle que especifica uma {\it fatia} do conjunto elementar definido no bloco de dados. Ele possui a seguinte forma sintática: $$\mbox{{\tt(} $s_1$ {\tt,} $s_2$ {\tt,} \dots {\tt,} $s_n$ {\tt)}}$$ onde $s_1$, $s_2$, \dots, $s_n$ são componentes da fatia. Cada componente da fatia pode ser um número, símbolo ou asterisco ({\tt*}). O número de \linebreak componentes na fatia deve ser o mesmo da dimensão $n$-tuplas do conjunto elementar a ser definido. Por exemplo, se o conjunto elementar contém 4-tuplas (quádruplas), a fatia deve ter quatro \linebreak componentes. O número de asteriscos na fatia denomina a {\it dimensão da fatia}. O efeito de usar fatias é o seguinte: se uma fatia $m$-dimensional (i.e., uma fatia contendo $m$ asteriscos) é especificada no bloco de dados, todos registros subsequentes devem especificar tuplas de dimensão~$m$. Sempre que uma $m$-tupla é encontrada, cada asterisco da fatia é substituído pelos componentes correspondentes da $m$-tupla, o que resulta na $n$-tupla, que é incluída no conjunto \linebreak elementar a ser definido. Por exemplo, se a fatia $(a,*,1,2,*)$ está vigente e a dupla $(3,b)$ é encontrada no registro subsequente, a 5-tupla resultante a ser incluída no conjunto elementar é $(a,3,1,2,b)$. Se a fatia não possui asteriscos, ela própria define uma $n$-tupla completa que é incluída no conjunto elementar. Uma vez especificada uma fatia, a mesma está vigente até que apareça uma nova fatia ou até que se encontre o fim do bloco de dados. Note que se uma fatia não é especificada no bloco de dados, assume-se uma cujos componentes são asteriscos em todas as posições. % The {\it slice data record} is a control record, which specifies a % {\it slice} of the elemental set defined in the data block. It has the % following syntactic form: % $$\mbox{{\tt(} $s_1$ {\tt,} $s_2$ {\tt,} \dots {\tt,} $s_n$ {\tt)}}$$ % where $s_1$, $s_2$, \dots, $s_n$ are components of the slice. % % Each component of the slice can be a number or symbol or the asterisk % ({\tt*}). The number of components in the slice should be the same as % the dimension of $n$-tuples in the elemental set to be defined. For % instance, if the elemental set contains 4-tuples (quadruplets), the % slice should have four components. The number of asterisks in the slice % is called the {\it slice dimension}. % % The effect of using slices is the following. If a $m$-dimensional slice % (i.e. a slice having $m$ asterisks) is specified in the data block, all % subsequent data records should specify tuples of the dimension~$m$. % Whenever a $m$-tuple is encountered, each asterisk in the slice is % replaced by corresponding components of the $m$-tuple that gives the % resultant $n$-tuple, which is included in the elemental set to be % defined. For example, if the slice $(a,*,1,2,*)$ is in effect, and % 2-tuple $(3,b)$ is encountered in a subsequent data record, the % resultant 5-tuple included in the elemental set is $(a,3,1,2,b)$. % % The slice having no asterisks itself defines a complete $n$-tuple, % which is included in the elemental set. % % Being once specified the slice effects until either a new slice or the % end of data block is encountered. Note that if no slice is specified in % the data block, one, components of which are all asterisks, is assumed. \subsection{Registro simples} O {\it registro simples} define uma $n$-tupla em um formato simples e possui a seguinte forma sintática: $$\mbox{$t_1$ {\tt,} $t_2$ {\tt,} \dots {\tt,} $t_n$}$$ onde $t_1$, $t_2$, \dots, $t_n$ são componentes da $n$-tupla. Cada componente pode ser um número ou um símbolo. As vírgulas entre os componentes são opcionais e podem ser omitidas. % The {\it simple data record} defines one $n$-tuple in a simple format % and has the following syntactic form: % $$\mbox{$t_1$ {\tt,} $t_2$ {\tt,} \dots {\tt,} $t_n$}$$ % where $t_1$, $t_2$, \dots, $t_n$ are components of the $n$-tuple. Each % component can be a number or symbol. Commae between components are % optional and may be omitted. \subsection{Registro de matriz} O {\it registro de matriz} define diversas 2-tuplas (duplas) em um formato matricial e possui a seguinte forma sintática: $$\begin{array}{cccccc} \mbox{{\tt:}}&c_1&c_2&\dots&c_n&\mbox{{\tt:=}}\\ r_1&a_{11}&a_{12}&\dots&a_{1n}&\\ r_2&a_{21}&a_{22}&\dots&a_{2n}&\\ \multicolumn{5}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}&\\ r_m&a_{m1}&a_{m2}&\dots&a_{mn}&\\ \end{array}$$ onde $r_1$, $r_2$, \dots, $r_m$ são números e/ou símbolos que correspondem a linhas da matriz; $c_1$, $c_2$, \dots, $c_n$ são números e/ou símbolos que correspondem a colunas da matriz, $a_{11}$, $a_{12}$, \dots, $a_{mn}$ são elementos da matriz, que podem ser tanto {\tt+} como {\tt-}. (Neste registro, o delimitador {\tt:} que precede a lista de colunas e o delimitador {\tt:=} que segue após a lista de colunas, não podem ser omitidos.) Cada elemento $a_{ij}$ do bloco de dados matricial (onde $1\leq i\leq m$, $1\leq j\leq n$) correspondem a 2-tuplas $(r_i,c_j)$. Se $a_{ij}$ é o sinal mais ({\tt+}), a 2-tupla correspondente (ou uma $n$-tupla maior, se uma fatia é usada) é incluída no conjunto elementar. Caso contrário, se $a_{ij}$ é o sinal menos ({\tt-}), aquela 2-tupla não é incluída no conjunto elementar. Uma vez que o registro de matriz define 2-tuplas, tanto o conjunto elementar quanto a fatia vigente devem ser 2-dimensional. \newpage \subsection{Registro de matriz transposta} O {\it registro de matriz transposta} possui a seguinte forma sintática: $$\begin{array}{cccccc} \mbox{{\tt(tr) :}}&c_1&c_2&\dots&c_n&\mbox{{\tt:=}}\\ r_1&a_{11}&a_{12}&\dots&a_{1n}&\\ r_2&a_{21}&a_{22}&\dots&a_{2n}&\\ \multicolumn{5}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}&\\ r_m&a_{m1}&a_{m2}&\dots&a_{mn}&\\ \end{array}$$ (Neste caso, o delimitador {\tt:} que segue a palavra-chave {\tt(tr)} é opcional e pode ser omitido.) Este registro é completamente análogo ao registro de matriz (ver anteriormente) com a única exceção de que neste caso, cada elemento $a_{ij}$ da matriz passa a corresponder a 2-tupla $(c_j,r_i)$ ao invés de $(r_i,c_j)$. Uma vez especificado, o indicador {\tt(tr)} tem alcance em todos registros subsequentes até que se encontre outra fatia ou o fim do bloco de dados. % The {\it transposed matrix data record} has the following syntactic % form: % $$\begin{array}{cccccc} % \mbox{{\tt(tr) :}}&c_1&c_2&\dots&c_n&\mbox{{\tt:=}}\\ % r_1&a_{11}&a_{12}&\dots&a_{1n}&\\ % r_2&a_{21}&a_{22}&\dots&a_{2n}&\\ % \multicolumn{5}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}&\\ % r_m&a_{m1}&a_{m2}&\dots&a_{mn}&\\ % \end{array}$$ % (In this case the delimiter {\tt:} following the keyword {\tt(tr)} is % optional and may be omitted.) % % This data record is completely analogous to the matrix data record (see % above) with only exception that in this case each element $a_{ij}$ of % the matrix corresponds to 2-tuple $(c_j,r_i)$ rather than $(r_i,c_j)$. % % Being once specified the {\tt(tr)} indicator affects all subsequent % data records until either a slice or the end of data block is % encountered. \section{Bloco de dados de parâmetro} \noindent \framebox[468pt][l]{ \parbox[c][88pt]{468pt}{ \hspace{6pt} {\tt param} {\it nome} {\tt,} {\it registro} {\tt,} \dots {\tt,} {\it registro} {\tt;} \medskip \hspace{6pt} {\tt param} {\it nome} {\tt default} {\it valor} {\tt,} {\it registro} {\tt,} \dots {\tt,} {\it registro} {\tt;} \medskip \hspace{6pt} {\tt param} {\tt:} {\it dados-tabulação} {\tt;} \medskip \hspace{6pt} {\tt param} {\tt default} {\it valor} {\tt:} {\it dados-tabulação} {\tt;} }} \medskip \noindent {\it nome} é um nome simbólico do parâmetro; \noindent {\it valor} é um valor opcional padrão do parâmetro; \noindent {\it registro}, \dots, {\it registro} são registros; \noindent {\it dados-tabulação} especifica os dados do parâmetro em formato tabulação. \noindent As vírgulas que precedem os registros podem ser omitidas. \para{Registros} \vspace*{-8pt} \begin{description} \item[{\tt :=}]\hspace*{0pt}\\ é um elemento de atribuição de registro não-significativo que pode ser usado livremente para melhorar a legibilidade; \item[{\tt[} {\it fatia} {\tt]}]\hspace*{0pt}\\ especifica uma fatia; \item[{\it dados-planos}]\hspace*{0pt}\\ especifica os dados do parâmetro em formato simples; \item[{\tt:} {\it dados-tabulares}]\hspace*{0pt}\\ especifica dados do parâmetro em formato tabular; \item[{\tt(tr)} {\tt:} {\it dados-tabulares}]\hspace*{0pt}\\ especifica dados do parâmetro no formato tabular transposto. (Neste caso, os dois pontos que seguem a palavra-chave {\tt(tr)} podem ser omitidos). \end{description} \vspace*{-8pt} \para{Exemplos} \begin{verbatim} param T := 4; param mes := 1 Jan 2 Fev 3 Mar 4 Abr 5 Mai; param mes := [1] 'Jan', [2] 'Fev', [3] 'Mar', [4] 'Abr', [5] 'Mai'; param estoque_inicial := ferro 7.32 niquel 35.8; param estoque_inicial [*] ferro 7.32, niquel 35.8; param custo [ferro] .025 [niquel] .03; param valor := ferro -.1, niquel .02; param : estoque_inicial custo valor := ferro 7.32 .025 -.1 niquel 35.8 .03 .02 ; param : insumo : estoque_inicial custo valor := ferro 7.32 .025 -.1 niquel 35.8 .03 .02 ; param demanda default 0 (tr) : FRA DET LAN WIN STL FRE LAF := chapa 300 . 100 75 . 225 250 bobina 500 750 400 250 . 850 500 placa 100 . . 50 200 . 250 ; param custo_transporte := [*,*,chapa]: FRA DET LAN WIN STL FRE LAF := GARY 30 10 8 10 11 71 6 CLEV 22 7 10 7 21 82 13 PITT 19 11 12 10 25 83 15 [*,*,bobina]: FRA DET LAN WIN STL FRE LAF := GARY 39 14 11 14 16 82 8 CLEV 27 9 12 9 26 95 17 PITT 24 14 17 13 28 99 20 [*,*,placa]: FRA DET LAN WIN STL FRE LAF := GARY 41 15 12 16 17 86 8 CLEV 29 9 13 9 28 99 18 PITT 26 14 17 13 31 104 20 ; \end{verbatim} O {\it bloco de dados do parâmetro} é usado para especificar dados completos para um parâmetro (ou parâmetros, se os dados são especificados no formato tabulação). Os blocos de dados podem ser especificados apenas para parâmetros não-calculáveis, i.e., para parâmetros que não possuem o atributo de atribuição ({\tt:=}) nas sentenças parameter correspondentes. Os dados definidos no bloco de dados do parâmetro são programados como uma sequência de registros descritos em seguida. Adicionalmente, o bloco de dados pode vir com o atributo opcional {\tt default}, que especifica um valor numérico ou simbólico padrão do parâmetro (ou parâmetros). Este valor padrão é atribuído ao parâmetro ou a seus membros quando não se definem valores apropriados no bloco de dados do parâmetro. O atributo {\tt default} não pode ser usado se ele já tiver sido especificado na sentença parameter correspondente. % \noindent % \framebox[468pt][l]{ % \parbox[c][88pt]{468pt}{ % \hspace{6pt} {\tt param} {\it name} {\tt,} {\it record} {\tt,} \dots % {\tt,} {\it record} {\tt;} % % \medskip % % \hspace{6pt} {\tt param} {\it name} {\tt default} {\it value} {\tt,} % {\it record} {\tt,} \dots {\tt,} {\it record} {\tt;} % % \medskip % % \hspace{6pt} {\tt param} {\tt:} {\it tabbing-data} {\tt;} % % \medskip % % \hspace{6pt} {\tt param} {\tt default} {\it value} {\tt:} % {\it tabbing-data} {\tt;} % }} % % \medskip % % \noindent % {\it name} is a symbolic name of the parameter; % % \noindent % {\it value} is an optional default value of the parameter; % % \noindent % {\it record}, \dots, {\it record} are data records; % % \noindent % {\it tabbing-data} specifies parameter data in the tabbing format. % % \noindent % Commae preceding data records may be omitted. % % \para{Data records} % % \vspace*{-8pt} % % \begin{description} % \item[{\tt :=}]\hspace*{0pt}\\ % is a non-significant data record, which may be used freely to improve % readability; % \item[{\tt[} {\it slice} {\tt]}]\hspace*{0pt}\\ % specifies a slice; % \item[{\it plain-data}]\hspace*{0pt}\\ % specifies parameter data in the plain format; % \item[{\tt:} {\it tabular-data}]\hspace*{0pt}\\ % specifies parameter data in the tabular format; % \item[{\tt(tr)} {\tt:} {\it tabular-data}]\hspace*{0pt}\\ % specifies set data in the transposed tabular format. (In this case the % colon following the keyword {\tt(tr)} may be omitted.) % \end{description} % % \vspace*{-8pt} % % \para{Examples} % % \begin{verbatim} % param T := 4; % param month := 1 Jan 2 Feb 3 Mar 4 Apr 5 May; % param month := [1] 'Jan', [2] 'Feb', [3] 'Mar', [4] 'Apr', [5] 'May'; % param init_stock := iron 7.32 nickel 35.8; % param init_stock [*] iron 7.32, nickel 35.8; % param cost [iron] .025 [nickel] .03; % param value := iron -.1, nickel .02; % param : init_stock cost value := % iron 7.32 .025 -.1 % nickel 35.8 .03 .02 ; % param : raw : init stock cost value := % iron 7.32 .025 -.1 % nickel 35.8 .03 .02 ; % param demand default 0 (tr) % : FRA DET LAN WIN STL FRE LAF := % bands 300 . 100 75 . 225 250 % coils 500 750 400 250 . 850 500 % plate 100 . . 50 200 . 250 ; % param trans_cost := % [*,*,bands]: FRA DET LAN WIN STL FRE LAF := % GARY 30 10 8 10 11 71 6 % CLEV 22 7 10 7 21 82 13 % PITT 19 11 12 10 25 83 15 % [*,*,coils]: FRA DET LAN WIN STL FRE LAF := % GARY 39 14 11 14 16 82 8 % CLEV 27 9 12 9 26 95 17 % PITT 24 14 17 13 28 99 20 % [*,*,plate]: FRA DET LAN WIN STL FRE LAF := % GARY 41 15 12 16 17 86 8 % CLEV 29 9 13 9 28 99 18 % PITT 26 14 17 13 31 104 20 ; % \end{verbatim} % % The {\it parameter data block} is used to specify complete data for a % parameter (or parameters, if data are specified in the tabbing format). % % Data blocks can be specified only for non-computable parameters, i.e. % for parameters, which have no assign attribute ({\tt:=}) in the % corresponding parameter statements. % % Data defined in the parameter data block are coded as a sequence of % data records described below. Additionally the data block can be % provided with the optional {\tt default} attribute, which specifies a % default numeric or symbolic value of the parameter (parameters). This % default value is assigned to the parameter or its members when % no appropriate value is defined in the parameter data block. The % {\tt default} attribute cannot be used, if it is already specified in % the corresponding parameter statement. \subsection{Registro de atribuição} O {\it registro de atribuição} ({\tt:=}) é um elemento não-significativo. Ele pode ser usado para melhorar a legibilidade dos blocos de dados; % The {\it assign data record} ({\tt:=}) is a non-signficant element. % It may be used for improving readability of data blocks. \subsection{Registro em fatia} O {\it registro em fatia} é um registro de controle que especifica uma {\it fatia} da matriz do parâmetro. Ele tem a seguinte forma sintática: $$\mbox{{\tt[} $s_1$ {\tt,} $s_2$ {\tt,} \dots {\tt,} $s_n$ {\tt]}}$$ onde $s_1$, $s_2$, \dots, $s_n$ são componentes da fatia. Cada componente da fatia pode ser um número, símbolo ou asterisco ({\tt*}). O número de componentes na fatia deve ser o mesmo da dimensão $n$-tuplas do parâmetro. Por exemplo, se o parâmetro é uma matriz 4-dimensional, a fatia deve ter quatro componentes. O número de \linebreak asteriscos na fatia denomina a {\it dimensão da fatia}. O efeito de usar fatias é o seguinte: se uma fatia $m$-dimensional (i.e., uma fatia contendo $m$ asteriscos) é especificada no bloco de dados, todos registros subsequentes devem especificar os subíndices do membros do parâmetro, como se o parâmetro fosse $m$-dimensional, não $n$-dimensional. Sempre que $m$ subíndices são encontrados, cada asterisco da fatia é substituído pelos \linebreak componentes correspondentes que dão $n$ subíndices, que definem o membro corrente do parâmetro. Por exemplo, se a fatia $(a,*,1,2,*)$ está vigente e os subíndices 3 e $b$ são encontradas no \linebreak registro subsequente, a lista completa de subíndices usada para escolher o membro do parâmetro é $(a,3,1,2,b)$. É permitido especificar uma fatia que não tenha asteriscos. Tal fatia, em si própria, define uma lista completa de subíndice, em cujo caso o próximo registro deve definir apenas um único valor do membro correspondentes do parâmetro. Uma vez especificada uma fatia, a mesma está vigente até que apareça uma nova fatia ou até que se encontre o fim do bloco de dados. Note que se uma fatia não é especificada no bloco de dados, assume-se uma cujos componentes são asteriscos em todas as posições. \subsection{Registro plano} O {\it registro plano} define uma lista de subíndice e um valor individual no formato plano. Este registro possui a seguinte forma sintática: $$\mbox{$t_1$ {\tt,} $t_2$ {\tt,} \dots {\tt,} $t_n$ {\tt,} $v$}$$ onde $t_1$, $t_2$, \dots, $t_n$ são subíndices e $v$ é um valor. Cada subíndice, assim como o valor, pode ser um número ou um símbolo. As vírgulas que seguem os subíndices são opcionais e podem ser omitidas. No caso de um parâmetro ou fatia 0-dimensional, o registro plano não possui subíndice e consiste de um valor individual apenas. % The {\it plain data record} defines a subscript list and a single value % in the plain format. This record has the following syntactic form: % $$\mbox{$t_1$ {\tt,} $t_2$ {\tt,} \dots {\tt,} $t_n$ {\tt,} $v$}$$ % where $t_1$, $t_2$, \dots, $t_n$ are subscripts, and $v$ is a value. % Each subscript as well as the value can be a number or symbol. Commae % following subscripts are optional and may be omitted. % % In case of 0-dimensional parameter or slice the plain data record has % no subscripts and consists of a single value only. \subsection{Registro tabular} O {\it registro tabular} define diversos valores onde cada valor é provido de dois subíndices. Este registro possui a seguinte forma sintática: $$\begin{array}{cccccc} \mbox{{\tt:}}&c_1&c_2&\dots&c_n&\mbox{{\tt:=}}\\ r_1&a_{11}&a_{12}&\dots&a_{1n}&\\ r_2&a_{21}&a_{22}&\dots&a_{2n}&\\ \multicolumn{5}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}&\\ r_m&a_{m1}&a_{m2}&\dots&a_{mn}&\\ \end{array}$$ onde $r_1$, $r_2$, \dots, $r_m$ são números e/ou símbolos que correspondem a linhas da tabela; enquanto que $c_1$, $c_2$, \dots, $c_n$ são são números e/ou símbolos que correspondem a colunas da tabela, $a_{11}$, $a_{12}$, \dots, $a_{mn}$ são elementos da tabela. Cada elemento pode ser um número, símbolo ou o ponto decimal ({\tt.}) individual. (neste registro, o delimitador {\tt:} que precede a lista de colunas e o delimitador {\tt:=} que segue após a lista de colunas, não podem ser omitidos). Cada elemento $a_{ij}$ do bloco de dados tabulares ($1\leq i\leq m$, $1\leq j\leq n$) define dois subíndices, onde o primeiro subíndice é $r_i$ e o segundo é $c_j$. Estes subíndices são usados juntamente com a fatia vigente para formar a lista completa de subíndices que identifica um membro particular da matriz de parâmetros. Se $a_{ij}$ é um número ou um símbolo, este valor é atribuído ao membro do parâmetro. No entanto, se $a_{ij}$ é um ponto decimal individual, o membro é atribuído ao valor padrão especificado ou no bloco de dados do parâmetro ou na sentença parameter, ou ainda, se nenhum valor padrão é especificado, o membro permanece indefinido. Uma vez que o registro tabular fornece dois subíndices para cada valor, tanto o parâmetro quanto a fatia vigente em uso devem ser 2-dimensional. % The {\it tabular data record} defines several values, where each value % is provided with two subscripts. This record has the following % syntactic form: % $$\begin{array}{cccccc} % \mbox{{\tt:}}&c_1&c_2&\dots&c_n&\mbox{{\tt:=}}\\ % r_1&a_{11}&a_{12}&\dots&a_{1n}&\\ % r_2&a_{21}&a_{22}&\dots&a_{2n}&\\ % \multicolumn{5}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}&\\ % r_m&a_{m1}&a_{m2}&\dots&a_{mn}&\\ % \end{array}$$ % where $r_1$, $r_2$, \dots, $r_m$ are numbers and/or symbols % corresponding to rows of the table; $c_1$, $c_2$, \dots, $c_n$ are % numbers and/or symbols corresponding to columns of the table, $a_{11}$, % $a_{12}$, \dots, $a_{mn}$ are table elements. Each element can be a % number or symbol or the single decimal point ({\tt.}). (In this data % record the delimiter {\tt:} preceding the column list and the delimiter % {\tt:=} following the column list cannot be omitted.) % % Each element $a_{ij}$ of the tabular data block ($1\leq i\leq m$, % $1\leq j\leq n$) defines two subscripts, where the first subscript is % $r_i$, and the second one is $c_j$. These subscripts are used in % conjunction with the current slice to form the complete subscript list % that identifies a particular member of the parameter array. If $a_{ij}$ % is a number or symbol, this value is assigned to the parameter member. % However, if $a_{ij}$ is the single decimal point, the member is % assigned a default value specified either in the parameter data block % or in the parameter statement, or, if no default value is specified, % the member remains undefined. % % Since the tabular data record provides two subscripts for each value, % either the parameter or the slice currently used should be % 2-dimensional. \subsection{Registro tabular transposto} O {\it registro tabular transposto} possui a seguinte forma sintática: $$\begin{array}{cccccc} \mbox{{\tt(tr) :}}&c_1&c_2&\dots&c_n&\mbox{{\tt:=}}\\ r_1&a_{11}&a_{12}&\dots&a_{1n}&\\ r_2&a_{21}&a_{22}&\dots&a_{2n}&\\ \multicolumn{5}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}&\\ r_m&a_{m1}&a_{m2}&\dots&a_{mn}&\\ \end{array}$$ (Neste caso, o delimitador {\tt:} que segue a palavra-chave {\tt(tr)} é opcional e pode ser omitida.) Este registro é completamente análogo ao registro tabular (ver anteriormente) com a única exceção que o primeiro subíndice definido pelo elemento $a_{ij}$ é $c_j$ enquanto que o segundo é $r_i$. Uma vez especificado, o indicador {\tt(tr)} afeta todos registros subsequentes até que se encontre outra fatia ou o fim do bloco de dados. % The {\it transposed tabular data record} has the following syntactic % form: % $$\begin{array}{cccccc} % \mbox{{\tt(tr) :}}&c_1&c_2&\dots&c_n&\mbox{{\tt:=}}\\ % r_1&a_{11}&a_{12}&\dots&a_{1n}&\\ % r_2&a_{21}&a_{22}&\dots&a_{2n}&\\ % \multicolumn{5}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}&\\ % r_m&a_{m1}&a_{m2}&\dots&a_{mn}&\\ % \end{array}$$ % (In this case the delimiter {\tt:} following the keyword {\tt(tr)} is % optional and may be omitted.) % % This data record is completely analogous to the tabular data record % (see above) with only exception that the first subscript defined by % element $a_{ij}$ is $c_j$ while the second one is $r_i$. % % Being once specified the {\tt(tr)} indicator affects all subsequent % data records until either a slice or the end of data block is % encountered. % \newpage \subsection{Formato de dados em tabulação} O bloco de dados do parâmetro no {\it formato tabulação} possui a seguinte forma sintática: $$ \begin{array}{*{8}{l}} \multicolumn{4}{l} {{\tt param}\ {\tt default}\ valor\ {\tt :}\ s\ {\tt :}}& p_1\ \ \verb|,|&p_2\ \ \verb|,|&\dots\ \verb|,|&p_r\ \ \verb|:=|\\ r_{11}\ \verb|,|& r_{12}\ \verb|,|& \dots\ \verb|,|& r_{1n}\ \verb|,|& a_{11}\ \verb|,|& a_{12}\ \verb|,|& \dots\ \verb|,|& a_{1r}\ \verb|,|\\ r_{21}\ \verb|,|& r_{22}\ \verb|,|& \dots\ \verb|,|& r_{2n}\ \verb|,|& a_{21}\ \verb|,|& a_{22}\ \verb|,|& \dots\ \verb|,|& a_{2r}\ \verb|,|\\ \dots & \dots & \dots & \dots & \dots & \dots & \dots & \dots \\ r_{m1}\ \verb|,|& r_{m2}\ \verb|,|& \dots\ \verb|,|& r_{mn}\ \verb|,|& a_{m1}\ \verb|,|& a_{m2}\ \verb|,|& \dots\ \verb|,|& a_{mr}\ \verb|;|\\ \end{array} $$ 1. A palavra-chave {\tt default} pode ser omitida juntamente com o valor que a segue. 2. O nome simbólico $s$ pode ser omitido juntamente com os dois pontos que o segue. 3. Todas as vírgulas são opcionais e podem ser omitidas. O bloco de dados no formato tabulação mostrado acima é exatamente equivalente aos seguintes blocos de dados: \verb|set| $s$\ \verb|:=|\ $ \verb|(|r_{11}\verb|,|r_{12}\verb|,|\dots\verb|,|r_{1n}\verb|) | \verb|(|r_{21}\verb|,|r_{22}\verb|,|\dots\verb|,|r_{2n}\verb|) | \dots \verb| (|r_{m1}\verb|,|r_{m2}\verb|,|\dots\verb|,|r_{mn}\verb|);|$ \verb|param| $p_1$\ \verb|default|\ $valor$\ \verb|:=| $\verb| | \verb|[|r_{11}\verb|,|r_{12}\verb|,|\dots\verb|,|r_{1n}\verb|] |a_{11} \verb| [|r_{21}\verb|,|r_{22}\verb|,|\dots\verb|,|r_{2n}\verb|] |a_{21} \verb| |\dots \verb| [|r_{m1}\verb|,|r_{m2}\verb|,|\dots\verb|,|r_{mn}\verb|] |a_{m1} \verb|;| $ \verb|param| $p_2$\ \verb|default|\ $valor$\ \verb|:=| $\verb| | \verb|[|r_{11}\verb|,|r_{12}\verb|,|\dots\verb|,|r_{1n}\verb|] |a_{12} \verb| [|r_{21}\verb|,|r_{22}\verb|,|\dots\verb|,|r_{2n}\verb|] |a_{22} \verb| |\dots \verb| [|r_{m1}\verb|,|r_{m2}\verb|,|\dots\verb|,|r_{mn}\verb|] |a_{m2} \verb|;| $ \verb| |.\ \ \ .\ \ \ .\ \ \ .\ \ \ .\ \ \ .\ \ \ .\ \ \ .\ \ \ . \verb|param| $p_r$\ \verb|default|\ $valor$\ \verb|:=| $\verb| | \verb|[|r_{11}\verb|,|r_{12}\verb|,|\dots\verb|,|r_{1n}\verb|] |a_{1r} \verb| [|r_{21}\verb|,|r_{22}\verb|,|\dots\verb|,|r_{2n}\verb|] |a_{2r} \verb| |\dots \verb| [|r_{m1}\verb|,|r_{m2}\verb|,|\dots\verb|,|r_{mn}\verb|] |a_{mr} \verb|;| $ % The parameter data block in the {\it tabbing format} has the following % syntactic form: % $$ % \begin{array}{*{8}{l}} % \multicolumn{4}{l} % {{\tt param}\ {\tt default}\ value\ {\tt :}\ s\ {\tt :}}& % p_1\ \ \verb|,|&p_2\ \ \verb|,|&\dots\ \verb|,|&p_r\ \ \verb|:=|\\ % r_{11}\ \verb|,|& r_{12}\ \verb|,|& \dots\ \verb|,|& r_{1n}\ \verb|,|& % a_{11}\ \verb|,|& a_{12}\ \verb|,|& \dots\ \verb|,|& a_{1r}\ \verb|,|\\ % r_{21}\ \verb|,|& r_{22}\ \verb|,|& \dots\ \verb|,|& r_{2n}\ \verb|,|& % a_{21}\ \verb|,|& a_{22}\ \verb|,|& \dots\ \verb|,|& a_{2r}\ \verb|,|\\ % \dots & \dots & \dots & \dots & \dots & \dots & \dots & \dots \\ % r_{m1}\ \verb|,|& r_{m2}\ \verb|,|& \dots\ \verb|,|& r_{mn}\ \verb|,|& % a_{m1}\ \verb|,|& a_{m2}\ \verb|,|& \dots\ \verb|,|& a_{mr}\ \verb|;|\\ % \end{array} % $$ % % 1. The keyword {\tt default} may be omitted along with a value % following it. % % 2. Symbolic name $s$ may be omitted along with the colon following it. % % 3. All commae are optional and may be omitted. % % The data block in the tabbing format shown above is exactly equivalent % to the following data blocks: % % \verb|set| $s$\ \verb|:=|\ $ % \verb|(|r_{11}\verb|,|r_{12}\verb|,|\dots\verb|,|r_{1n}\verb|) | % \verb|(|r_{21}\verb|,|r_{22}\verb|,|\dots\verb|,|r_{2n}\verb|) | % \dots % \verb| (|r_{m1}\verb|,|r_{m2}\verb|,|\dots\verb|,|r_{mn}\verb|);|$ % % \verb|param| $p_1$\ \verb|default|\ $value$\ \verb|:=| % % $\verb| | % \verb|[|r_{11}\verb|,|r_{12}\verb|,|\dots\verb|,|r_{1n}\verb|] |a_{11} % \verb| [|r_{21}\verb|,|r_{22}\verb|,|\dots\verb|,|r_{2n}\verb|] |a_{21} % \verb| |\dots % \verb| [|r_{m1}\verb|,|r_{m2}\verb|,|\dots\verb|,|r_{mn}\verb|] |a_{m1} % \verb|;| % $ % % \verb|param| $p_2$\ \verb|default|\ $value$\ \verb|:=| % % $\verb| | % \verb|[|r_{11}\verb|,|r_{12}\verb|,|\dots\verb|,|r_{1n}\verb|] |a_{12} % \verb| [|r_{21}\verb|,|r_{22}\verb|,|\dots\verb|,|r_{2n}\verb|] |a_{22} % \verb| |\dots % \verb| [|r_{m1}\verb|,|r_{m2}\verb|,|\dots\verb|,|r_{mn}\verb|] |a_{m2} % \verb|;| % $ % % \verb| |.\ \ \ .\ \ \ .\ \ \ .\ \ \ .\ \ \ .\ \ \ .\ \ \ .\ \ \ . % % \verb|param| $p_r$\ \verb|default|\ $value$\ \verb|:=| % % $\verb| | % \verb|[|r_{11}\verb|,|r_{12}\verb|,|\dots\verb|,|r_{1n}\verb|] |a_{1r} % \verb| [|r_{21}\verb|,|r_{22}\verb|,|\dots\verb|,|r_{2n}\verb|] |a_{2r} % \verb| |\dots % \verb| [|r_{m1}\verb|,|r_{m2}\verb|,|\dots\verb|,|r_{mn}\verb|] |a_{mr} % \verb|;| % $ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \appendix \chapter{Usando sufixos} \vspace*{-12pt} Sufixos podem ser usados para recuperar valores adicionais associados com as variáveis, restrições e objetivos do modelo. Um {\it sufixo} consiste de um ponto ({\tt.}) seguido por uma palavra-chave não-reservada. Por exemplo, se {\tt x} é uma variável bi-dimensional, {\tt x[i,j].lb} é um valor numérico igual ao limite inferior da variável elementar {\tt x[i,j]}, que (cujo valor) pode ser usado em expressões como um parâmetro numérico. Para as variáveis do modelo, os sufixos possuem o seguinte significado: \begin{tabular}{@{}ll@{}} {\tt.lb}&limite inferior (lower bound)\\ {\tt.ub}&limite superior (upper bound)\\ {\tt.status}&status na solução:\\ &0 --- indefinida\\ &1 --- básica\\ &2 --- não-básica no limite inferior\\ &3 --- não-básica no limite superior\\ &4 --- variável não-básica livre (ilimitada)\\ &5 --- variável não-básica fixa\\ {\tt.val}&valor primal na solução\\ {\tt.dual}&valor dual (custo reduzido) na solução\\ \end{tabular} Para as restrições e objetivos do modelo, os sufixos têm os seguintes significados: \begin{tabular}{@{}ll@{}} {\tt.lb}&limite inferior (lower bound) da forma linear\\ {\tt.ub}&limite superior (upper bound) da forma linear\\ {\tt.status}&status na solução:\\ &0 --- indefinida\\ &1 --- não-limitante\\ &2 --- limitante no limite inferior\\ &3 --- limitante no limite superior\\ &4 --- linha limitante livre (ilimitada)\\ &5 --- restrição de igualdade limitante\\ {\tt.val}&valor primal da forma linear na solução\\ {\tt.dual}&valor dual (custo reduzido) da forma linear na solução\\ \end{tabular} Note que os sufixos {\tt.status}, {\tt.val} e {\tt.dual} podem ser usados apenas abaixo da sentença solve. % Suffixes can be used to retrieve additional values associated with % model variables, constraints, and objectives. % % A {\it suffix} consists of a period ({\tt.}) followed by a non-reserved % keyword. For example, if {\tt x} is a two-dimensional variable, % {\tt x[i,j].lb} is a numeric value equal to the lower bound of % elemental variable {\tt x[i,j]}, which (value) can be used everywhere % in expressions like a numeric parameter. % % For model variables suffixes have the following meaning: % % \begin{tabular}{@{}ll@{}} % {\tt.lb}&lower bound\\ % {\tt.ub}&upper bound\\ % {\tt.status}&status in the solution:\\ % &0 --- undefined\\ % &1 --- basic\\ % &2 --- non-basic on lower bound\\ % &3 --- non-basic on upper bound\\ % &4 --- non-basic free (unbounded) variable\\ % &5 --- non-basic fixed variable\\ % {\tt.val}&primal value in the solution\\ % {\tt.dual}&dual value (reduced cost) in the solution\\ % \end{tabular} % % For model constraints and objectives suffixes have the following % meaning: % % \begin{tabular}{@{}ll@{}} % {\tt.lb}&lower bound of the linear form\\ % {\tt.ub}&upper bound of the linear form\\ % {\tt.status}&status in the solution:\\ % &0 --- undefined\\ % &1 --- non-active\\ % &2 --- active on lower bound\\ % &3 --- active on upper bound\\ % &4 --- active free (unbounded) row\\ % &5 --- active equality constraint\\ % {\tt.val}&primal value of the linear form in the solution\\ % {\tt.dual}&dual value (reduced cost) of the linear form in the % solution\\ % \end{tabular} % % Note that suffixes {\tt.status}, {\tt.val}, and {\tt.dual} can be used % only below the solve statement. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Funções de data e hora} \noindent\hfil \begin{tabular}{c} por Andrew Makhorin \verb||\\ e Heinrich Schuchardt \verb||\\ \end{tabular} \section{Obtendo o tempo de calendário corrente} \label{gmtime} Para obter o tempo de calendário corrente em MathProg existe a função {\tt gmtime}. Ela não possui argumentos e retorna o número de segundos transcorridos desde 00:00:00 de 1{\textsuperscript{\b{o}}} de Janeiro de 1970, pelo Tempo Universal Coordenado (UTC). Por exemplo: \begin{verbatim} param utc := gmtime(); \end{verbatim} MathProg não possui uma função para converter o tempo UTC retornado pela função {\tt gmtime} para os tempos de calendário {\it local}. Assim, para determinar o tempo de calendário local corrente, é preciso que adicione ao tempo UTC retornado a diferença de horas, com respeito a UTC, expressa em segundos. Por exemplo, a hora em Berlim durante o inverno é uma hora à frente do UTC, que corresponde a uma diferença horária de +1~hora~= +3600~segundos, assim, o tempo de calendário corrente no inverno em Berlim pode ser determinado como segue: \begin{verbatim} param now := gmtime() + 3600; \end{verbatim} \noindent De forma análoga, o horário de verão em Chicago (Zona Horária Central-CDT) é cinco horas atrás da UTC, de modo que o horário corrente do calendário local pode ser determinado como segue: \begin{verbatim} param now := gmtime() - 5 * 3600; \end{verbatim} Note que o valor retornado por {\tt gmtime} é volátil, i.e., ao ser chamada diversas vezes, esta função pode retornar diferentes valores. % \noindent\hfil % \begin{tabular}{c} % by Andrew Makhorin \verb||\\ % and Heinrich Schuchardt \verb||\\ % \end{tabular} % % \section{Obtaining current calendar time} % \label{gmtime} % % To obtain the current calendar time in MathProg there exists the % function {\tt gmtime}. It has no arguments and returns the number of % seconds elapsed since 00:00:00 on January 1, 1970, Coordinated % Universal Time (UTC). For example: % % \begin{verbatim} % param utc := gmtime(); % \end{verbatim} % % MathProg has no function to convert UTC time returned by the function % {\tt gmtime} to {\it local} calendar times. Thus, if you need to % determine the current local calendar time, you have to add to the UTC % time returned the time offset from UTC expressed in seconds. For % example, the time in Berlin during the winter is one hour ahead of UTC % that corresponds to the time offset +1~hour~= +3600~secs, so the % current winter calendar time in Berlin may be determined as follows: % % \begin{verbatim} % param now := gmtime() + 3600; % \end{verbatim} % % \noindent Similarly, the summer time in Chicago (Central Daylight Time) % is five hours behind UTC, so the corresponding current local calendar % time may be determined as follows: % % \begin{verbatim} % param now := gmtime() - 5 * 3600; % \end{verbatim} % % Note that the value returned by {\tt gmtime} is volatile, i.e. being % called several times this function may return different values. \section{Convertendo cadeia de caracteres ao tempo de calendário} \label{str2time} A função {\tt str2time(}{\it s}{\tt,} {\it f}{\tt)} converte uma cadeia de caractere (impressão da data e hora) \linebreak especificada pelo seu primeiro argumento {\it s}, que deve ser uma expressão simbólica, para o tempo de calendário apropriado para cálculos aritméticos. A conversão é controlada pela cadeia de formato especificado {\it f} (o segundo argumento), que também deve ser uma expressão simbólica. % The function {\tt str2time(}{\it s}{\tt,} {\it f}{\tt)} converts a % character string (timestamp) specified by its first argument {\it s}, % which should be a symbolic expression, to the calendar time suitable % for arithmetic calculations. The conversion is controlled by the % specified format string {\it f} (the second argument), which also % should be a symbolic expression. % \newpage A conversão resultante retornada por {\tt str2time} possui o mesmo significado dos valores retornados pela função {\tt gmtime} (ver Subseção \ref{gmtime}, página \pageref{gmtime}). Note que {\tt str2time} {\tt não corrige} o tempo de calendário retornado para zona horária local, i.e., ao se aplicar a 00:00:00 de 1{\textsuperscript{\b{o}}} de Janeiro de 1970, ela sempre retorna 0. % The result of conversion returned by {\tt str2time} has the same % meaning as values returned by the function {\tt gmtime} (see Subsection % \ref{gmtime}, page \pageref{gmtime}). Note that {\tt str2time} does % {\tt not} correct the calendar time returned for the local timezone, % i.e. being applied to 00:00:00 on January 1, 1970 it always returns 0. Por exemplo, as sentenças de modelo: \begin{verbatim} param s, symbolic, := "07/14/98 13:47"; param t := str2time(s, "%m/%d/%y %H:%M"); display t; \end{verbatim} \noindent produz a seguinte saída: \begin{verbatim} t = 900424020 \end{verbatim} \noindent onde o tempo de calendário impresso corresponde a 13:47:00 em 14 de Julho de 1998. A cadeia de formato passada à função {\tt str2time} consiste de especificadores de conversão e caracteres ordinários. Cada especificador de conversão inicia com um caractere de porcentagem ({\tt\%}) seguido de uma letra. Os seguintes especificadores de conversão podem ser usados na cadeia de formato: \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%b}&O nome do mês abreviado (insensível a maiúsculas). Pelo menos as três primeiras letras do mês devem aparecer na cadeia de entrada.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%d}&O dia do mês como número decimal (de 1 até 31). Se permite o zero como primeiro dígito, embora não seja necessário.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%h}&O mesmo que {\tt\%b}.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%H}&A hora como um número decimal, usando um relógio de 24-horas (de 0 a 23). Se permite o zero como primeiro dígito, embora não seja necessário.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%m}&O mês como um número decimal (de 1 a 12). Se permite o zero como primeiro dígito, embora não seja necessário.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%M}&O minuto como um número decimal (de 0 a 59). Se permite o zero como primeiro dígito, embora não seja necessário.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%S}&O segundo como um número decimal (de 0 to 60). Se permite o zero como primeiro dígito, embora não seja necessário.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%y}&O ano sem o século, como um número decimal (de 0 to 99). Se permite o zero como primeiro dígito, embora não seja necessário. Valores de entrada de 0 a 68 são considerados dos anos 2000 a 2068 enquanto que os valores 69 até 99 como dos anos 1969 to 1999.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%z}&A diferença horária do GMT no formato ISO 8601.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%\%}&Um caractere {\tt\%} literal.\\ \end{tabular} Todos os outros caracteres (ordinários) na cadeia de formato devem ter um caractere \linebreak correspondente com a cadeia de entrada a ser convertida. Exceções são espaços na cadeia de entrada, a qual pode coincidir com zero ou mais caracteres de espaço na cadeia de formato. % For example, the model statements: % % \begin{verbatim} % param s, symbolic, := "07/14/98 13:47"; % param t := str2time(s, "%m/%d/%y %H:%M"); % display t; % \end{verbatim} % % \noindent produce the following printout: % % \begin{verbatim} % t = 900424020 % \end{verbatim} % % \noindent where the calendar time printed corresponds to 13:47:00 on % July 14, 1998. % % The format string passed to the function {\tt str2time} consists of % conversion specifiers and ordinary characters. Each conversion % specifier begins with a percent ({\tt\%}) character followed by a % letter. % % The following conversion specifiers may be used in the format string: % % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} % {\tt\%b}&The abbreviated month name (case insensitive). At least three % first letters of the month name should appear in the input string.\\ % \end{tabular} % % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} % {\tt\%d}&The day of the month as a decimal number (range 1 to 31). % Leading zero is permitted, but not required.\\ % \end{tabular} % % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} % {\tt\%h}&The same as {\tt\%b}.\\ % \end{tabular} % % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} % {\tt\%H}&The hour as a decimal number, using a 24-hour clock (range 0 % to 23). Leading zero is permitted, but not required.\\ % \end{tabular} % % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} % {\tt\%m}&The month as a decimal number (range 1 to 12). Leading zero is % permitted, but not required.\\ % \end{tabular} % % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} % {\tt\%M}&The minute as a decimal number (range 0 to 59). Leading zero % is permitted, but not required.\\ % \end{tabular} % % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} % {\tt\%S}&The second as a decimal number (range 0 to 60). Leading zero % is permitted, but not required.\\ % \end{tabular} % % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} % {\tt\%y}&The year without a century as a decimal number (range 0 to 99). % Leading zero is permitted, but not required. Input values in the range % 0 to 68 are considered as the years 2000 to 2068 while the values 69 to % 99 as the years 1969 to 1999.\\ % \end{tabular} % % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} % {\tt\%z}&The offset from GMT in ISO 8601 format.\\ % \end{tabular} % % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} % {\tt\%\%}&A literal {\tt\%} character.\\ % \end{tabular} % % All other (ordinary) characters in the format string should have a % matching character in the input string to be converted. Exceptions are % spaces in the input string which can match zero or more space % characters in the format string. % \newpage Se algum componente de data e/ou hora estão ausentes no formato e, portanto, na cadeia de entrada, a função {\tt str2time} usa seus valores padrão correspondendo a 00:00:00 de 1{\textsuperscript{\b{o}}} de Janeiro de 1970, ou seja, o valor padrão para o ano é 1970, o valor padrão para o mês é Janeiro, etc. A função {\tt str2time} é aplicável a todos horários calendário desde 00:00:00 de 1{\textsuperscript{\b{o}}} de Janeiro de 0001 até 23:59:59 de 31 de Dezembro de 4000 do calendário Gregoriano. % If some date and/or time component(s) are missing in the format and, % therefore, in the input string, the function {\tt str2time} uses their % default values corresponding to 00:00:00 on January 1, 1970, that is, % the default value of the year is 1970, the default value of the month % is January, etc. % % The function {\tt str2time} is applicable to all calendar times in the % range 00:00:00 on January 1, 0001 to 23:59:59 on December 31, 4000 of % the Gregorian calendar. \section{Convertendo tempo de calendário a uma cadeia de caracteres} \label{time2str} A função {\tt time2str(}{\it t}{\tt,} {\it f}{\tt)} converte o tempo de calendário especificado pelo seu primeiro \linebreak argumento {\it t}, que deve ser uma expressão numérica, para uma cadeia de caracteres (valor \linebreak simbólico). A conversão é controlada pela cadeia de formato {\it f} (o segundo argumento), que deve ser uma expressão numérica. O tempo de calendário passado para {\tt time2str} possui o mesmo significado dos valores retornados pela função {\tt gmtime} (ver Subseção \ref{gmtime}, página \pageref{gmtime}). Note que {\tt time2str} {\it não corrige} o tempo de calendário especificado para zona horária local, i.e., o tempo de calendário 0 sempre corresponde a 00:00:00 de 1{\textsuperscript{\b{o}}} de Janeiro de 1970. Por exemplo, as sentenças de modelo: \begin{verbatim} param s, symbolic, := time2str(gmtime(), "%FT%TZ"); display s; \end{verbatim} \noindent pode produzir a seguinte impressão: \begin{verbatim} s = '2008-12-04T00:23:45Z' \end{verbatim} \noindent que é a impressão da data e hora no formato ISO. A cadeia de formato passada para a função {\tt time2str} consiste de especificadores de conversão e caracteres ordinários. Cada especificador de conversão começa com um caractere de porcentagem ({\tt\%}) seguido de uma letra. Os seguintes especificadores de conversão podem ser usados na cadeia de formato: \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%a}&O nome do dia da semana abreviado(2 caracteres).\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%A}&O nome do dia da semana completo.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%b}&O nome do dia do mês abreviado (3 caracteres).\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%B}&O nome do mês completo.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%C}&O século do ano, ou seja, o maior inteiro não maior que o ano dividido por~100.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%d}&O dia do mês como um número decimal (de 01 até 31).\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%D}&A data usando o formato \verb|%m/%d/%y|.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%e}&O dia do mês, como em \verb|%d|, mas preenchido com espaço em branco ao invés de zero.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%F}&A data usando o formato \verb|%Y-%m-%d|.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%g}&O ano correspondente ao número de semana ISO, mas sem o século (de 00 até~99). Este possui o mesmo formato e valor que \verb|%y|, exceto que se o número de semana ISO (ver \verb|%V|) pertence ao ano anterior ou seguinte, se usa aquele ano em seu lugar.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%G}&O ano correspondente ao número de semana ISO. Este possui o mesmo formato e valor que \verb|%Y|, exceto que se o número de semana ISO (ver \verb|%V|) pertence ao ano anterior ou seguinte, se usa aquele ano em seu lugar.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%h}&O mesmo que \verb|%b|.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%H}&A hora como um número decimal usando um relógio 24 horas (de 00 até 23).\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%I}&A hora como um número decimal usando um relógio 12 horas (de 01 até 12).\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%j}&O dia do ano como um número decimal (de 001 até 366).\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%k}&A hora como um número decimal usando um relógio 24 horas, como \verb|%H|, mas preenchido com espaço em branco ao invés de zero.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%l}&A hora como um número decimal usando um relógio 12 horas, como \verb|%I|, mas preenchido com espaço em branco ao invés de zero. \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%m}&O mês como um número decimal (de 01 até 12).\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%M}&O minuto como um número decimal (de 00 até 59).\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%p}&Tanto {\tt AM} como {\tt PM}, de acordo com o valor da hora fornecido. Meia-noite é tratada como {\tt AM} e meio-dia, como {\tt PM}.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%P}&Tanto {\tt am} como {\tt pm}, de acordo com o valor da hora fornecido. Meia-noite é tratada como {\tt am} e meio-dia, como {\tt pm}.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%R}&A hora e minuto em números decimais usando o formato \verb|%H:%M|.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%S}&O segundo como um número decimal (de 00 até 59).\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%T}&A hora do dia em números decimais usando o formato \verb|%H:%M:%S|.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%u}&O dia da semana como número decimal (de 1 até 7) em que Segunda é 1.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%U}&O número da semana do ano corrente como um número decimal (de 00 até 53) iniciando com o primeiro Domingo como o primeiro dia da primeira semana. Os dias que precedem o primeiro Domingo do ano são considerados parte da semana 00. \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%V}&O número da semana ISO como um número decimal (de 01 até 53). Semanas ISO iniciam com Segunda e finalizam com Domingo. A semana 01 de um ano é a primeira semana que possui a maioria de seus dias naquele ano. Isto é equivalente à semana contendo 4 de Janeiro. A semana 01 de um ano pode conter dias do ano anterior. A semana anterior à semana 01 de um ano é a última semana (52 ou 53) do ano anterior, mesmo se ela contém dias do novo ano. Em outras palavras, se 1{\textsuperscript{\b{o}}} de Janeiro é Segunda, Terça, Quarta ou Quinta, ele está na semana 01; Se 1{\textsuperscript{\b{o}}} de Janeiro é Sexta, Sábado ou Domingo, ele está na semana 52 ou 53 do ano anterior.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%w}&O dia da semana como um número decimal (de 0 até 6) em que Domingo é 0.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%W}&O número da semana do ano corrente como um número decimal (de 00 até 53), iniciando com a primeira Segunda como o primeiro dia da primeira semana. Dias que precedem a primeira Segunda do ano são considerados parte da semana 00.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%y}&O ano sem o século como um número decimal (de 00 até 99), ou seja, o ano \verb|mod|~100.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%Y}&O ano como um número decimal, usando o calendário Gregoriano.\\ \end{tabular} \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} {\tt\%\%}&Um caractere \verb|%| literal.\\ \end{tabular} Todos os outros caracteres (ordinários) na cadeia de formato são simplesmente copiados à cadeia resultante. O primeiro argumento (tempo do calendário) passado para a função {\tt time2str} deve estar entre $-62135596800$ até $+64092211199$, o que corresponde ao período de 00:00:00 de 1{\textsuperscript{\b{o}}} de Janeiro de 0001 até 23:59:59 de 31 de Dezembro de 4000 do calendário Gregoriano. % The function {\tt time2str(}{\it t}{\tt,} {\it f}{\tt)} converts the % calendar time specified by its first argument {\it t}, which should be % a numeric expression, to a character string (symbolic value). The % conversion is controlled by the specified format string {\it f} (the % second argument), which should be a symbolic expression. % % The calendar time passed to {\tt time2str} has the same meaning as % values returned by the function {\tt gmtime} (see Subsection % \ref{gmtime}, page \pageref{gmtime}). Note that {\tt time2str} does % {\it not} correct the specified calendar time for the local timezone, % i.e. the calendar time 0 always corresponds to 00:00:00 on January 1, % 1970. % % For example, the model statements: % % \begin{verbatim} % param s, symbolic, := time2str(gmtime(), "%FT%TZ"); % display s; % \end{verbatim} % % \noindent may produce the following printout: % % \begin{verbatim} % s = '2008-12-04T00:23:45Z' % \end{verbatim} % % \noindent which is a timestamp in the ISO format. % % The format string passed to the function {\tt time2str} consists of % conversion specifiers and ordinary characters. Each conversion % specifier begins with a percent ({\tt\%}) character followed by a % letter. % % The following conversion specifiers may be used in the format string: % % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} % {\tt\%a}&The abbreviated (2-character) weekday name.\\ % \end{tabular} % % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} % {\tt\%A}&The full weekday name.\\ % \end{tabular} % % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} % {\tt\%b}&The abbreviated (3-character) month name.\\ % \end{tabular} % % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} % {\tt\%B}&The full month name.\\ % \end{tabular} % % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} % {\tt\%C}&The century of the year, that is the greatest integer not % greater than the year divided by~100.\\ % \end{tabular} % % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} % {\tt\%d}&The day of the month as a decimal number (range 01 to 31).\\ % \end{tabular} % % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} % {\tt\%D}&The date using the format \verb|%m/%d/%y|.\\ % \end{tabular} % % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} % {\tt\%e}&The day of the month like with \verb|%d|, but padded with % blank rather than zero.\\ % \end{tabular} % % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} % {\tt\%F}&The date using the format \verb|%Y-%m-%d|.\\ % \end{tabular} % % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} % {\tt\%g}&The year corresponding to the ISO week number, but without the % century (range 00 to~99). This has the same format and value as % \verb|%y|, except that if the ISO week number (see \verb|%V|) belongs % to the previous or next year, that year is used instead.\\ % \end{tabular} % % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} % {\tt\%G}&The year corresponding to the ISO week number. This has the % same format and value as \verb|%Y|, except that if the ISO week number % (see \verb|%V|) belongs to the previous or next year, that year is used % instead. % \end{tabular} % % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} % {\tt\%h}&The same as \verb|%b|.\\ % \end{tabular} % % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} % {\tt\%H}&The hour as a decimal number, using a 24-hour clock (range 00 % to 23).\\ % \end{tabular} % % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} % {\tt\%I}&The hour as a decimal number, using a 12-hour clock (range 01 % to 12).\\ % \end{tabular} % % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} % {\tt\%j}&The day of the year as a decimal number (range 001 to 366).\\ % \end{tabular} % % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} % {\tt\%k}&The hour as a decimal number, using a 24-hour clock like % \verb|%H|, but padded with blank rather than zero.\\ % \end{tabular} % % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} % {\tt\%l}&The hour as a decimal number, using a 12-hour clock like % \verb|%I|, but padded with blank rather than zero. % \end{tabular} % % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} % {\tt\%m}&The month as a decimal number (range 01 to 12).\\ % \end{tabular} % % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} % {\tt\%M}&The minute as a decimal number (range 00 to 59).\\ % \end{tabular} % % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} % {\tt\%p}&Either {\tt AM} or {\tt PM}, according to the given time value. % Midnight is treated as {\tt AM} and noon as {\tt PM}.\\ % \end{tabular} % % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} % {\tt\%P}&Either {\tt am} or {\tt pm}, according to the given time value. % Midnight is treated as {\tt am} and noon as {\tt pm}.\\ % \end{tabular} % % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} % {\tt\%R}&The hour and minute in decimal numbers using the format % \verb|%H:%M|.\\ % \end{tabular} % % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} % {\tt\%S}&The second as a decimal number (range 00 to 59).\\ % \end{tabular} % % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} % {\tt\%T}&The time of day in decimal numbers using the format % \verb|%H:%M:%S|.\\ % \end{tabular} % % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} % {\tt\%u}&The day of the week as a decimal number (range 1 to 7), Monday % being 1.\\ % \end{tabular} % % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} % {\tt\%U}&The week number of the current year as a decimal number (range % 00 to 53), starting with the first Sunday as the first day of the first % week. Days preceding the first Sunday in the year are considered to be % in week 00. % \end{tabular} % % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} % {\tt\%V}&The ISO week number as a decimal number (range 01 to 53). ISO % weeks start with Monday and end with Sunday. Week 01 of a year is the % first week which has the majority of its days in that year; this is % equivalent to the week containing January 4. Week 01 of a year can % contain days from the previous year. The week before week 01 of a year % is the last week (52 or 53) of the previous year even if it contains % days from the new year. In other word, if 1 January is Monday, Tuesday, % Wednesday or Thursday, it is in week 01; if 1 January is Friday, % Saturday or Sunday, it is in week 52 or 53 of the previous year.\\ % \end{tabular} % % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} % {\tt\%w}&The day of the week as a decimal number (range 0 to 6), Sunday % being 0.\\ % \end{tabular} % % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} % {\tt\%W}&The week number of the current year as a decimal number (range % 00 to 53), starting with the first Monday as the first day of the first % week. Days preceding the first Monday in the year are considered to be % in week 00.\\ % \end{tabular} % % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} % {\tt\%y}&The year without a century as a decimal number (range 00 to % 99), that is the year modulo~100.\\ % \end{tabular} % % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} % {\tt\%Y}&The year as a decimal number, using the Gregorian calendar.\\ % \end{tabular} % % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}} % {\tt\%\%}&A literal \verb|%| character.\\ % \end{tabular} % % All other (ordinary) characters in the format string are simply copied % to the resultant string. % % The first argument (calendar time) passed to the function {\tt time2str} % should be in the range from $-62135596800$ to $+64092211199$ that % corresponds to the period from 00:00:00 on January 1, 0001 to 23:59:59 % on December 31, 4000 of the Gregorian calendar. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Controladores de tabelas} \label{drivers} \noindent\hfil \begin{tabular}{c} por Andrew Makhorin \verb||\\ e Heinrich Schuchardt \verb||\\ \end{tabular} \bigskip\bigskip O {\it controlador de tabelas} é um módulo do programa que permite transmitir dados entre objetos de um modelo MathProg e tabela de dados. Atualmente, o pacote GLPK possui quatro controladores de tabelas: \vspace*{-8pt} \begin{itemize} \item controlador interno de tabelas CSV; \item controlador interno de tabelas xBASE; \item controlador de tabelas ODBC; \item controlador de tabelas MySQL. \end{itemize} % The {\it table driver} is a program module which provides transmitting % data between MathProg model objects and data tables. % % Currently the GLPK package has four table drivers: % % \vspace*{-8pt} % % \begin{itemize} % \item built-in CSV table driver; % \item built-in xBASE table driver; % \item ODBC table driver; % \item MySQL table driver. % \end{itemize} \vspace*{-8pt} \section{Controlador de tabelas CSV} O controlador de tabelas CSV assume que a tabela de dados está representada na forma de \linebreak arquivo de texto plano, em formato de arquivo CSV (valores serparados por vígula: \linebreak comma-separated values) como descrito abaixo. Para escolher o controlador de tabelas CSV, seu nome na sentença table deve ser especificado como \verb|"CSV"| e o único argumento deve especificar o nome do arquivo de texto plano contendo a tabela. Por exemplo: \begin{verbatim} table dados IN "CSV" "dados.csv": ... ; \end{verbatim} O sufixo do nome do arquivo pode ser arbitrário, no entanto, é recomendado usar o sufixo `\verb|.csv|'. Ao ler tabelas de entrada o controlador de tabelas CSV fornece um campo implícito chamado \verb|RECNO|, que contém o número do registro corrente. Este campo pode ser especificado na sentença de entrada table, como se realmente houvesse um campo chamado \verb|RECNO| no arquivo CSV. Por exemplo: \begin{verbatim} table lista IN "CSV" "lista.csv": num <- [RECNO], ... ; \end{verbatim} % The CSV table driver assumes that the data table is represented in the % form of a plain text file in the CSV (comma-separated values) file % format as described below. % % To choose the CSV table driver its name in the table statement should % be specified as \verb|"CSV"|, and the only argument should specify the % name of a plain text file containing the table. For example: % % \begin{verbatim} % table data IN "CSV" "data.csv": ... ; % \end{verbatim} % % The filename suffix may be arbitrary, however, it is recommended to use % the suffix `\verb|.csv|'. % % On reading input tables the CSV table driver provides an implicit field % named \verb|RECNO|, which contains the current record number. This % field can be specified in the input table statement as if there were % the actual field named \verb|RECNO| in the CSV file. For example: % % \begin{verbatim} % table list IN "CSV" "list.csv": num <- [RECNO], ... ; % \end{verbatim} \newpage \subsection*{Formato CSV\footnote{Este material é baseado no documento RFC 4180.}} O formato CSV (\textit{comma-separated values}) é um formato de arquivo de texto plano definido como segue. 1. Cada registro é localizado em uma linha separada, delimitada por uma quebra de linha. Por exemplo: \begin{verbatim} aaa,bbb,ccc\n xxx,yyy,zzz\n \end{verbatim} \noindent onde \verb|\n| significa o caractere de controle \verb|LF| ({\tt 0x0A}). 2. O último registro no arquivo pode ou não ter a quebra de linha. Por exemplo: \begin{verbatim} aaa,bbb,ccc\n xxx,yyy,zzz \end{verbatim} 3. Deve haver uma linha de cabeçalho na primeira linha do arquivo no mesmo formato das linhas de registros normais. Este cabeçalho deve conter nomes correspondendo aos campos no arquivo. O número de nomes de campos na linha de cabeçalho deve ser o mesmo do número de campos dos registros do arquivo. Por exemplo: \begin{verbatim} nome1,nome2,nome3\n aaa,bbb,ccc\n xxx,yyy,zzz\n \end{verbatim} 4. Dentro do cabeçalho e de cada registro, podem haver um ou mais campos separados por vírgulas. Cada linha deve conter o mesmo número de campos por todos arquivo. Espaços são considerados parte de um campo, portanto, não são ignorados. O último campo do registro não deve ser seguido de vírgula. Por exemplo: \begin{verbatim} aaa,bbb,ccc\n \end{verbatim} 5. Campos podem ou não estar cercados em aspas duplas. Por exemplo: \begin{verbatim} "aaa","bbb","ccc"\n zzz,yyy,xxx\n \end{verbatim} 6. Se um campo é cercado de aspas duplas, cada aspa dupla que faça parte do campo deve ser codificado duas vezes. Por exemplo: \begin{verbatim} "aaa","b""bb","ccc"\n \end{verbatim} \para{Exemplo} \begin{verbatim} DE,PARA,DISTANCIA,CUSTO Seattle,New-York,2.5,0.12 Seattle,Chicago,1.7,0.08 Seattle,Topeka,1.8,0.09 San-Diego,New-York,2.5,0.15 San-Diego,Chicago,1.8,0.10 San-Diego,Topeka,1.4,0.07 \end{verbatim} % The CSV (comma-separated values) format is a plain text file format % defined as follows. % % 1. Each record is located on a separate line, delimited by a line % break. For example: % % \begin{verbatim} % aaa,bbb,ccc\n % xxx,yyy,zzz\n % \end{verbatim} % % \noindent % where \verb|\n| means the control character \verb|LF| ({\tt 0x0A}). % % 2. The last record in the file may or may not have an ending line % break. For example: % % \begin{verbatim} % aaa,bbb,ccc\n % xxx,yyy,zzz % \end{verbatim} % % 3. There should be a header line appearing as the first line of the % file in the same format as normal record lines. This header should % contain names corresponding to the fields in the file. The number of % field names in the header line should be the same as the number of % fields in the records of the file. For example: % % \begin{verbatim} % name1,name2,name3\n % aaa,bbb,ccc\n % xxx,yyy,zzz\n % \end{verbatim} % % 4. Within the header and each record there may be one or more fields % separated by commas. Each line should contain the same number of fields % throughout the file. Spaces are considered as part of a field and % therefore not ignored. The last field in the record should not be % followed by a comma. For example: % % \begin{verbatim} % aaa,bbb,ccc\n % \end{verbatim} % % 5. Fields may or may not be enclosed in double quotes. For example: % % \begin{verbatim} % "aaa","bbb","ccc"\n % zzz,yyy,xxx\n % \end{verbatim} % % 6. If a field is enclosed in double quotes, each double quote which is % part of the field should be coded twice. For example: % % \begin{verbatim} % "aaa","b""bb","ccc"\n % \end{verbatim} % % \para{Example} % % \begin{verbatim} % FROM,TO,DISTANCE,COST % Seattle,New-York,2.5,0.12 % Seattle,Chicago,1.7,0.08 % Seattle,Topeka,1.8,0.09 % San-Diego,New-York,2.5,0.15 % San-Diego,Chicago,1.8,0.10 % San-Diego,Topeka,1.4,0.07 % \end{verbatim} \newpage \section{Controlador de tabelas xBASE} O controlador de tabelas xBASE assume que a tabela de dados é armazenada no formato de arquivo .dbf. Para escolher o controlador de tabela xBASE, seu nome na sentença table deve ser especificado como \verb|"xBASE"| e o primeiro argumento deve especificar o nome de um arquivo .dbf contendo a tabela. Para a tabela de saída deve haver um segundo argumento definindo o formato da tabela na forma \verb|"FF...F"|, onde \verb|F| é tanto {\tt C({\it n})}, que especifica um campo de caractere de tamanho $n$, ou {\tt N({\it n}{\rm [},{\it p}{\rm ]})}, que especifica um campo numérico de tamanho $n$ e precisão $p$ (por padrão $p$ é 0). Adiante está um simples exemplo que ilustra a criação e leitura de um arquivo .dbf: \begin{verbatim} table tab1{i in 1..10} OUT "xBASE" "foo.dbf" "N(5)N(10,4)C(1)C(10)": 2*i+1 ~ B, Uniform(-20,+20) ~ A, "?" ~ FOO, "[" & i & "]" ~ C; set S, dimen 4; table tab2 IN "xBASE" "foo.dbf": S <- [B, C, RECNO, A]; display S; end; \end{verbatim} % The xBASE table driver assumes that the data table is stored in the % .dbf file format. % % To choose the xBASE table driver its name in the table statement should % be specified as \verb|"xBASE"|, and the first argument should specify % the name of a .dbf file containing the table. For the output table there % should be the second argument defining the table format in the form % \verb|"FF...F"|, where \verb|F| is either {\tt C({\it n})}, % which specifies a character field of length $n$, or % {\tt N({\it n}{\rm [},{\it p}{\rm ]})}, which specifies a numeric field % of length $n$ and precision $p$ (by default $p$ is 0). % % The following is a simple example which illustrates creating and % reading a .dbf file: % % \begin{verbatim} % table tab1{i in 1..10} OUT "xBASE" "foo.dbf" % "N(5)N(10,4)C(1)C(10)": 2*i+1 ~ B, Uniform(-20,+20) ~ A, % "?" ~ FOO, "[" & i & "]" ~ C; % set S, dimen 4; % table tab2 IN "xBASE" "foo.dbf": S <- [B, C, RECNO, A]; % display S; % end; % \end{verbatim} \section{Controlador de tabelas ODBC} O controlador de tabelas ODBC permite conexões com bancos de dados SQL usando uma \linebreak implementação da interface ODBC baseada na Call Level Interface (CLI).\footnote{A norma software correspondente é definida na ISO/IEC 9075-3:2003.} \para{Debian GNU/Linux.} No Debian GNU/Linux o controlador de tabelas ODBC usa o pacote iODBC, \footnote{Ver {\tt}.} que deve ser instalado antes de montar o pacote GLPK. A instalação pode ser efetuada com o seguinte comando: \begin{verbatim} sudo apt-get install libiodbc2-dev \end{verbatim} Note que, ao configurar o pacote GLPK, para habilitar o uso da biblioteca do iODBC a opção `\verb|--enable-odbc|' deve ser passada para o script de configuração. Para seu uso em todo sistema, as bases de dados individuais devem ser inseridas em \verb|/etc/odbc.ini| e \verb|/etc/odbcinst.ini|. As conexões das bases de dados a serem usadas por um único usuário são especificadas por arquivos do diretório home (\verb|.odbc.ini| e \verb|.odbcinst.ini|). \para{Microsoft Windows.} No Microsoft Windows o controlador de tabelas ODBC usa a biblioteca Microsoft ODBC. Para habilitar esta funcionalidade, o símbolo: \begin{verbatim} #define ODBC_DLNAME "odbc32.dll" \end{verbatim} \noindent deve ser definido no arquivo de configuração do GLPK `\verb|config.h|'. Fontes de dados podem ser criados via Ferramentas Administrativas do Painel de Controle. Para escolher do controlador de tabelas ODBC, seu nome na sentença table deve ser especificado como \verb|'ODBC'| ou \verb|'iODBC'|. % \newpage A lista de argumentos é especificada como segue. O primeiro argumento é a cadeia de conexão passada para a biblioteca ODBC, por exemplo: \verb|'DSN=glpk;UID=user;PWD=password'|, ou \verb|'DRIVER=MySQL;DATABASE=glpkdb;UID=user;PWD=password'|. Diferentes partes da cadeia são separadas por ponto e vírgula. Cada parte consiste de um par {\it nome-do-campo} e {\it valor} separados pelo sinar de igualdade. Os nomes de campo permitidos dependem da biblioteca ODBC. Tipicamente os seguintes nomes-de-campo são permitidos: \verb|DATABASE | base de dados; \verb|DRIVER | controlador ODBC; \verb|DSN | nome de uma fonte de dados; \verb|FILEDSN | nome de um arquivo de fonte de dados; \verb|PWD | senha de usuário; \verb|SERVER | base de dados; \verb|UID | nome de usuário. O segundo argumento e todos os seguintes são considerados como sentenças SQL. As sentenças SQL podem ser estendidas sobre múltiplos argumentos. Se o último caractere de um argumento é um ponto e vírgula, este indica o fim de uma sentença SQL. Os argumentos de uma sentença SQL são concatenados separados por espaço. O eventual ponto e vírgula final será removido. Todas as sentenças SQL, exceto a última, serão executadas diretamente. Para tabela-IN, a última sentença SQL pode ser um comando SELECT que se inicia com \verb|'SELECT '| em letras maiúsculas. Se a cadeia não se inicia com \verb|'SELECT '|, se considera que é um nome de uma tabela e uma sentença SELECT é automaticamente gerada. Para tabela-OUT, a última sentença SQL pode conter um ou múltiplos pontos de interrogação. Se contém um ponto de interrogação, é considerado um gabarito para a rotina de escrita. Caso contrário, a cadeia é considerada um nome de tabela e um gabarito INSERT é automaticamente gerado. A rotina de escrita usa um gabarito com o pontos de interrogação e o substitui o primeiro ponto de interrogação pelo primeiro parâmetro de saída, o segundo ponto de interrogação, pelo segundo parâmetro e assim por diante. Em seguida, o comando SQL é emitido. O que segue é um exemplo da sentença table de saída: \begin{verbatim} table ta { l in LOCAIS } OUT 'ODBC' 'DSN=glpkdb;UID=glpkuser;PWD=glpkpassword' 'DROP TABLE IF EXISTS resultado;' 'CREATE TABLE resultado ( ID INT, LOC VARCHAR(255), QUAN DOUBLE );' 'INSERT INTO resultado 'VALUES ( 4, ?, ? )' : l ~ LOC, quantidade[l] ~ QUAN; \end{verbatim} % \newpage \noindent Alternativamente pode se escrever como segue: \begin{verbatim} table ta { l in LOCAIS } OUT 'ODBC' 'DSN=glpkdb;UID=glpkuser;PWD=glpkpassword' 'DROP TABLE IF EXISTS resultado;' 'CREATE TABLE resultado ( ID INT, LOC VARCHAR(255), QUAN DOUBLE );' 'resultado' : l ~ LOC, quantidade[l] ~ QUAN, 4 ~ ID; \end{verbatim} O uso de gabaritos com `\verb|?|' não só permite INSERT, como também o UPDATE, DELETE, etc. Por exemplo: \begin{verbatim} table ta { l in LOCAIS } OUT 'ODBC' 'DSN=glpkdb;UID=glpkuser;PWD=glpkpassword' 'UPDATE resultado SET DATA = ' & data & ' WHERE ID = 4;' 'UPDATE resultado SET QUAN = ? WHERE LOC = ? AND ID = 4' : quantidade[l], l; \end{verbatim} % The ODBC table driver allows connecting to SQL databases using an % implementation of the ODBC interface based on the Call Level Interface % (CLI).\footnote{The corresponding software standard is defined in % ISO/IEC 9075-3:2003.} % % \para{Debian GNU/Linux.} % Under Debian GNU/Linux the ODBC table driver uses the iODBC % package,\footnote{See {\tt}.} which should be % installed before building the GLPK package. The installation can be % effected with the following command: % % \begin{verbatim} % sudo apt-get install libiodbc2-dev % \end{verbatim} % % Note that on configuring the GLPK package to enable using the iODBC % library the option `\verb|--enable-odbc|' should be passed to the % configure script. % % The individual databases should be entered for systemwide usage in % \verb|/etc/odbc.ini| and\linebreak \verb|/etc/odbcinst.ini|. Database % connections to be used by a single user are specified by files in the % home directory (\verb|.odbc.ini| and \verb|.odbcinst.ini|). % % \para{Microsoft Windows.} % Under Microsoft Windows the ODBC table driver uses the Microsoft ODBC % library. To enable this feature the symbol: % % \begin{verbatim} % #define ODBC_DLNAME "odbc32.dll" % \end{verbatim} % % \noindent % should be defined in the GLPK configuration file `\verb|config.h|'. % % Data sources can be created via the Administrative Tools from the % Control Panel. % % To choose the ODBC table driver its name in the table statement should % be specified as \verb|'ODBC'| or \verb|'iODBC'|. % % \newpage % % The argument list is specified as follows. % % The first argument is the connection string passed to the ODBC library, % for example: % % \verb|'DSN=glpk;UID=user;PWD=password'|, or % % \verb|'DRIVER=MySQL;DATABASE=glpkdb;UID=user;PWD=password'|. % % Different parts of the string are separated by semicolons. Each part % consists of a pair {\it fieldname} and {\it value} separated by the % equal sign. Allowable fieldnames depend on the ODBC library. Typically % the following fieldnames are allowed: % % \verb|DATABASE | database; % % \verb|DRIVER | ODBC driver; % % \verb|DSN | name of a data source; % % \verb|FILEDSN | name of a file data source; % % \verb|PWD | user password; % % \verb|SERVER | database; % % \verb|UID | user name. % % The second argument and all following are considered to be SQL % statements % % SQL statements may be spread over multiple arguments. If the last % character of an argument is a semicolon this indicates the end of % a SQL statement. % % The arguments of a SQL statement are concatenated separated by space. % The eventual trailing semicolon will be removed. % % All but the last SQL statement will be executed directly. % % For IN-table the last SQL statement can be a SELECT command starting % with the capitalized letters \verb|'SELECT '|. If the string does not % start with \verb|'SELECT '| it is considered to be a table name and a % SELECT statement is automatically generated. % % For OUT-table the last SQL statement can contain one or multiple % question marks. If it contains a question mark it is considered a % template for the write routine. Otherwise the string is considered a % table name and an INSERT template is automatically generated. % % The writing routine uses the template with the question marks and % replaces the first question mark by the first output parameter, the % second question mark by the second output parameter and so forth. Then % the SQL command is issued. % % The following is an example of the output table statement: % % \begin{verbatim} % table ta { l in LOCATIONS } OUT % 'ODBC' % 'DSN=glpkdb;UID=glpkuser;PWD=glpkpassword' % 'DROP TABLE IF EXISTS result;' % 'CREATE TABLE result ( ID INT, LOC VARCHAR(255), QUAN DOUBLE );' % 'INSERT INTO result 'VALUES ( 4, ?, ? )' : % l ~ LOC, quantity[l] ~ QUAN; % \end{verbatim} % % \newpage % % \noindent % Alternatively it could be written as follows: % % \begin{verbatim} % table ta { l in LOCATIONS } OUT % 'ODBC' % 'DSN=glpkdb;UID=glpkuser;PWD=glpkpassword' % 'DROP TABLE IF EXISTS result;' % 'CREATE TABLE result ( ID INT, LOC VARCHAR(255), QUAN DOUBLE );' % 'result' : % l ~ LOC, quantity[l] ~ QUAN, 4 ~ ID; % \end{verbatim} % % Using templates with `\verb|?|' supports not only INSERT, but also % UPDATE, DELETE, etc. For example: % % \begin{verbatim} % table ta { l in LOCATIONS } OUT % 'ODBC' % 'DSN=glpkdb;UID=glpkuser;PWD=glpkpassword' % 'UPDATE result SET DATE = ' & date & ' WHERE ID = 4;' % 'UPDATE result SET QUAN = ? WHERE LOC = ? AND ID = 4' : % quantity[l], l; % \end{verbatim} \section{Controlador de tabelas MySQL} O controlador de tabelas MySQL permite a conexão a base de dados MySQL. \para{Debian GNU/Linux.} No Debian GNU/Linux o controlador de tabelas MySQL usa o pacote MySQL, \footnote{Para fazer o download de arquivos de desenvolvimento, ver {\tt}.} que deve ser instalado antes da criação do pacote GLPK. A instalação pode ser efetuada com o seguinte comando: \begin{verbatim} sudo apt-get install libmysqlclient15-dev \end{verbatim} Note que ao configurar o pacote GLPK para habilitar o uso da biblioteca MySQL a opção `\verb|--enable-mysql|' deve ser passada ao script de configuração. \para{Microsoft Windows.} No Microsoft Windows o controlador de tabelas MySQL também usa a biblioteca MySQL. Para habilitar esta funcionalidade o símbolo: \begin{verbatim} #define MYSQL_DLNAME "libmysql.dll" \end{verbatim} \noindent deve ser definido no arquivo de configuração do GLPK `\verb|config.h|'. Para escolher o controlador de tabelas MySQL, seu nome na sentença table deve ser especificada como \verb|'MySQL'|. A lista de argumentos é especificada como segue. O primeiro argumento especifica como conectar a base de dados no estilo DSN, por exemplo: \verb|'Database=glpk;UID=glpk;PWD=gnu'|. Diferentes partes da cadeia são separadas por ponto e vírgula. Cada parte consiste de um par {\it nome-do-campo} e {\it valor} separado pelo sinal de igualdade. Os seguintes nomes de campo são permitidos: % \newpage \verb|Server | servidor rodando a base de dados (localhost por padrão); \verb|Database | nome da base de dados; \verb|UID | nome de usuário; \verb|PWD | senha de usuário; \verb|Port | porta usada pelo servidor (3306 por padrão). O segundo argumento e todos os seguintes são considerados sentenças SQL. Sentenças SQL podem se estender sobre múltiplos argumentos. Se o último caractere de um argumento é um ponto e vírgula, isto indica o fim de uma sentença SQL. Os argumentos de uma sentença SQL são concatenados e separados por espaço. O eventual ponto e vírgula final será removido. Todas sentenças SQL, menos a última, serão executadas diretamente. Para tabela-IN, a última sentença SQL pode ser um comando SELECT iniciado com letras maiúsculas \verb|'SELECT '|. Se a cadeia não inicia com \verb|'SELECT '| é considerado um nome de tabela e a sentença SELECT é automaticamente gerada. Para tabela-OUT, a última sentença SQL pode conter um ou múltiplos pontos de interrogação. Se contém um ponto de interrogação, é considerado um gabarito para a rotina de escrita. Caso contrário, a cadeia é considerada um nome de tabela e um gabarito INSERT é automaticamente gerado. A rotina de escrita usa um gabarito com o pontos de interrogação e o substitui o primeiro ponto de interrogação pelo primeiro parâmetro de saída, o segundo ponto de interrogação, pelo segundo parâmetro e assim por diante. Em seguida, o comando SQL é emitido. O que segue é um exemplo da sentença table de saída: \begin{verbatim} table ta { l in LOCAIS } OUT 'MySQL' 'Database=glpkdb;UID=glpkuser;PWD=glpkpassword' 'DROP TABLE IF EXISTS resultado;' 'CREATE TABLE resultado ( ID INT, LOC VARCHAR(255), QUAN DOUBLE );' 'INSERT INTO resultado VALUES ( 4, ?, ? )' : l ~ LOC, quantidade[l] ~ QUAN; \end{verbatim} \noindent Alternativamente poderia ser escrito como segue: \begin{verbatim} table ta { l in LOCAIS } OUT 'MySQL' 'Database=glpkdb;UID=glpkuser;PWD=glpkpassword' 'DROP TABLE IF EXISTS resultado;' 'CREATE TABLE resultado ( ID INT, LOC VARCHAR(255), QUAN DOUBLE );' 'resultado' : l ~ LOC, quantidade[l] ~ QUAN, 4 ~ ID; \end{verbatim} % \newpage O uso de gabaritos com `\verb|?|' não só permite INSERT, como também o UPDATE, DELETE, etc. Por exemplo: \begin{verbatim} table ta { l in LOCAIS } OUT 'MySQL' 'Database=glpkdb;UID=glpkuser;PWD=glpkpassword' 'UPDATE resultado SET DATE = ' & date & ' WHERE ID = 4;' 'UPDATE resultado SET QUAN = ? WHERE LOC = ? AND ID = 4' : quantidade[l], l; \end{verbatim} % The MySQL table driver allows connecting to MySQL databases. % % \para{Debian GNU/Linux.} % Under Debian GNU/Linux the MySQL table driver uses the MySQL % package,\footnote{For download development files see % {\tt}.} which should be % installed before building the GLPK package. The installation can be % effected with the following command: % % \begin{verbatim} % sudo apt-get install libmysqlclient15-dev % \end{verbatim} % % Note that on configuring the GLPK package to enable using the MySQL % library the option `\verb|--enable-mysql|' should be passed to the % configure script. % % \para{Microsoft Windows.} % Under Microsoft Windows the MySQL table driver also uses the MySQL % library. To enable this feature the symbol: % % \begin{verbatim} % #define MYSQL_DLNAME "libmysql.dll" % \end{verbatim} % % \noindent % should be defined in the GLPK configuration file `\verb|config.h|'. % % To choose the MySQL table driver its name in the table statement should % be specified as \verb|'MySQL'|. % % The argument list is specified as follows. % % The first argument specifies how to connect the data base in the DSN % style, for example: % % \verb|'Database=glpk;UID=glpk;PWD=gnu'|. % % Different parts of the string are separated by semicolons. Each part % consists of a pair {\it fieldname} and {\it value} separated by the % equal sign. The following fieldnames are allowed: % % \newpage % % \verb|Server | server running the database (defaulting to localhost); % % \verb|Database | name of the database; % % \verb|UID | user name; % % \verb|PWD | user password; % % \verb|Port | port used by the server (defaulting to 3306). % % The second argument and all following are considered to be SQL % statements. % % SQL statements may be spread over multiple arguments. If the last % character of an argument is a semicolon this indicates the end of % a SQL statement. % % The arguments of a SQL statement are concatenated separated by space. % The eventual trailing semicolon will be removed. % % All but the last SQL statement will be executed directly. % % For IN-table the last SQL statement can be a SELECT command starting % with the capitalized letters \verb|'SELECT '|. If the string does not % start with \verb|'SELECT '| it is considered to be a table name and a % SELECT statement is automatically generated. % % For OUT-table the last SQL statement can contain one or multiple % question marks. If it contains a question mark it is considered a % template for the write routine. Otherwise the string is considered a % table name and an INSERT template is automatically generated. % % The writing routine uses the template with the question marks and % replaces the first question mark by the first output parameter, the % second question mark by the second output parameter and so forth. Then % the SQL command is issued. % % The following is an example of the output table statement: % % \begin{verbatim} % table ta { l in LOCATIONS } OUT % 'MySQL' % 'Database=glpkdb;UID=glpkuser;PWD=glpkpassword' % 'DROP TABLE IF EXISTS result;' % 'CREATE TABLE result ( ID INT, LOC VARCHAR(255), QUAN DOUBLE );' % 'INSERT INTO result VALUES ( 4, ?, ? )' : % l ~ LOC, quantity[l] ~ QUAN; % \end{verbatim} % % \noindent % Alternatively it could be written as follows: % % \begin{verbatim} % table ta { l in LOCATIONS } OUT % 'MySQL' % 'Database=glpkdb;UID=glpkuser;PWD=glpkpassword' % 'DROP TABLE IF EXISTS result;' % 'CREATE TABLE result ( ID INT, LOC VARCHAR(255), QUAN DOUBLE );' % 'result' : % l ~ LOC, quantity[l] ~ QUAN, 4 ~ ID; % \end{verbatim} % % \newpage % % Using templates with `\verb|?|' supports not only INSERT, but also % UPDATE, DELETE, etc. For example: % % \begin{verbatim} % table ta { l in LOCATIONS } OUT % 'MySQL' % 'Database=glpkdb;UID=glpkuser;PWD=glpkpassword' % 'UPDATE result SET DATE = ' & date & ' WHERE ID = 4;' % 'UPDATE result SET QUAN = ? WHERE LOC = ? AND ID = 4' : % quantity[l], l; % \end{verbatim} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % ##################### PAREI AQUI % ##################### \chapter{Resolvendo modelos com glpsol} O pacote GLPK \footnote{{\tt http://www.gnu.org/software/glpk/}} inclui o programa {\tt glpsol}, um solver de PL/PIM autônomo. Este programa pode ser chamado por uma linha de comando ou pelo shell para resolver modelos escritos na \linebreak linguagem de modelagem GNU MathProg. Para comunicar ao solver que o arquivo de entrada contém uma descrição do modelo, é necessário especificar a opção \verb|--model| na linha de comando. Por exemplo: \begin{verbatim} glpsol --model foo.mod \end{verbatim} Às vezes é necessário usar a seção de dados posicionado em um arquivo separado. Neste caso, deve-se usar o seguinte comando: \begin{verbatim} glpsol --model foo.mod --data foo.dat \end{verbatim} \noindent Note que ser o arquivo de modelo também contém a seção de dados, aquela seção é ignorada. Também é permitido especificar mais de um arquivo contendo a seção de dados, por exemplo: \begin{verbatim} glpsol --model foo.mod --data foo1.dat --data foo2.dat \end{verbatim} Se a descrição do modelo contém alguma sentença display e/ou printf, o resultado é enviado para o terminal por padrão. Se há a necessidade de redirecionar a saída para um arquivo, deve-se usar o seguinte comando: \begin{verbatim} glpsol --model foo.mod --display foo.out \end{verbatim} Se há a necessidade de ver o problema que está sendo gerado pelo tradutor de modelo, deve-ser usar a opção \verb|--wlp| como segue: \begin{verbatim} glpsol --model foo.mod --wlp foo.lp \end{verbatim} \noindent Neste caso, os dados do problema são escritos no arquivo \verb|foo.lp| no formato CPLEX LP viável para análise visual. Ãs vezes, é necessário checar a descrição do modelo sem ter que resolver a instância do problema gerado. Neste caso, deve-se especificar a opção \verb|--check|, por exemplo: \begin{verbatim} glpsol --check --model foo.mod --wlp foo.lp \end{verbatim} \newpage Se há a necessidade de escrever uma solução numérica obtida pelo solver para um arquivo, deve-se usar o seguinte comando: \begin{verbatim} glpsol --model foo.mod --output foo.sol \end{verbatim} \noindent neste caso, a solução é escrita no arquivo \verb|foo.sol| em formato de texto plano, viável para análise visual. A lista completa de opções do \verb|glpsol| pode ser encontrada no manual de referência do GLPK incluída na distribuição do GLPK. % The GLPK package\footnote{{\tt http://www.gnu.org/software/glpk/}} % includes the program {\tt glpsol}, a stand-alone LP/MIP solver. This % program can be launched from the command line or from the shell to % solve models written in the GNU MathProg modeling language. % % To tell the solver that the input file contains a model description you % need to specify the option \verb|--model| in the command line. % For example: % % \begin{verbatim} % glpsol --model foo.mod % \end{verbatim} % % Sometimes it is necessary to use the data section placed in a separate % file, in which case you may use the following command: % % \begin{verbatim} % glpsol --model foo.mod --data foo.dat % \end{verbatim} % % \noindent Note that if the model file also contains the data section, % that section is ignored. % % It is also allowed to specify more than one file containing the data % section, for example: % % \begin{verbatim} % glpsol --model foo.mod --data foo1.dat --data foo2.dat % \end{verbatim} % % If the model description contains some display and/or printf % statements, by default the output is sent to the terminal. If you need % to redirect the output to a file, you may use the following command: % % \begin{verbatim} % glpsol --model foo.mod --display foo.out % \end{verbatim} % % If you need to look at the problem, which has been generated by the % model translator, you may use the option \verb|--wlp| as follows: % % \begin{verbatim} % glpsol --model foo.mod --wlp foo.lp % \end{verbatim} % % \noindent In this case the problem data is written to file % \verb|foo.lp| in CPLEX LP format suitable for visual analysis. % % Sometimes it is needed merely to check the model description not % solving the generated problem instance. In this case you may specify % the option \verb|--check|, for example: % % \begin{verbatim} % glpsol --check --model foo.mod --wlp foo.lp % \end{verbatim} % % \newpage % % If you need to write a numeric solution obtained by the solver to % a file, you may use the following command: % % \begin{verbatim} % glpsol --model foo.mod --output foo.sol % \end{verbatim} % % \noindent in which case the solution is written to file \verb|foo.sol| % in a plain text format suitable for visual analysis. % % The complete list of the \verb|glpsol| options can be found in the % GLPK reference manual included in the GLPK distribution. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Exemplo de descrição de modelo} \section{Descrição de modelo escrito em MathProg} Este é um exemplo completo de descrição de modelo escrito na linguagem de modelagem GNU MathProg. \bigskip \begin{verbatim} # UM PROBLEMA DE TRANSPORTE # # Este problema encontra a logística de custo mínimo que atende das demandas # de mercado e as ofertas das fábricas. # # Referência: # Dantzig G B, "Linear Programming and Extensions." # Princeton University Press, Princeton, New Jersey, 1963, # Chapter 3-3. set I; /* fábricas de enlatados*/ set J; /* mercados */ param a{i in I}; /* capacidade da fábrica i, em caixas */ param b{j in J}; /* demanda no mercado j, em caixas */ param d{i in I, j in J}; /* distância, em milhares de milhas */ param f; /* frete, em dólares por caixa a cada mil milhas */ param c{i in I, j in J} := f * d[i,j] / 1000; /* custo de transporte, em milhares de dólares por caixa */ var x{i in I, j in J} >= 0; /* quantidade enviada, em caixas */ minimize custo: sum{i in I, j in J} c[i,j] * x[i,j]; /* custo total de transporte, em milhares de dólares */ s.t. suprimento{i in I}: sum{j in J} x[i,j] <= a[i]; /* observa o limite de suprimento na fábrica i */ s.t. demanda{j in J}: sum{i in I} x[i,j] >= b[j]; /* satisfaz a demanda do mercado j */ data; set I := Seattle San-Diego; set J := New-York Chicago Topeka; param a := Seattle 350 San-Diego 600; param b := New-York 325 Chicago 300 Topeka 275; param d : New-York Chicago Topeka := Seattle 2.5 1.7 1.8 San-Diego 2.5 1.8 1.4 ; param f := 90; end; \end{verbatim} % Below here is a complete example of the model description written in % the GNU MathProg modeling language. % % \bigskip % % \begin{verbatim} % # A TRANSPORTATION PROBLEM % # % # This problem finds a least cost shipping schedule that meets % # requirements at markets and supplies at factories. % # % # References: % # Dantzig G B, "Linear Programming and Extensions." % # Princeton University Press, Princeton, New Jersey, 1963, % # Chapter 3-3. % % set I; % /* canning plants */ % % set J; % /* markets */ % % param a{i in I}; % /* capacity of plant i in cases */ % % param b{j in J}; % /* demand at market j in cases */ % % param d{i in I, j in J}; % /* distance in thousands of miles */ % % param f; % /* freight in dollars per case per thousand miles */ % % param c{i in I, j in J} := f * d[i,j] / 1000; % /* transport cost in thousands of dollars per case */ % % var x{i in I, j in J} >= 0; % /* shipment quantities in cases */ % % minimize cost: sum{i in I, j in J} c[i,j] * x[i,j]; % /* total transportation costs in thousands of dollars */ % % s.t. supply{i in I}: sum{j in J} x[i,j] <= a[i]; % /* observe supply limit at plant i */ % % s.t. demand{j in J}: sum{i in I} x[i,j] >= b[j]; % /* satisfy demand at market j */ % % data; % % set I := Seattle San-Diego; % % set J := New-York Chicago Topeka; % % param a := Seattle 350 % San-Diego 600; % % param b := New-York 325 % Chicago 300 % Topeka 275; % % param d : New-York Chicago Topeka := % Seattle 2.5 1.7 1.8 % San-Diego 2.5 1.8 1.4 ; % % param f := 90; % % end; % \end{verbatim} \newpage \section{Instância gerada do problema de PL} Este é o resultado da tradução do modelo de exemplo produzido pelo solver \verb|glpsol| e escrito no formato CPLEX LP com a opção \verb|--wlp|. \medskip \begin{verbatim} \* Problem: transporte *\ Minimize custo: + 0.225 x(Seattle,New~York) + 0.153 x(Seattle,Chicago) + 0.162 x(Seattle,Topeka) + 0.225 x(San~Diego,New~York) + 0.162 x(San~Diego,Chicago) + 0.126 x(San~Diego,Topeka) Subject To suprimento(Seattle): + x(Seattle,New~York) + x(Seattle,Chicago) + x(Seattle,Topeka) <= 350 suprimento(San~Diego): + x(San~Diego,New~York) + x(San~Diego,Chicago) + x(San~Diego,Topeka) <= 600 demanda(New~York): + x(Seattle,New~York) + x(San~Diego,New~York) >= 325 demanda(Chicago): + x(Seattle,Chicago) + x(San~Diego,Chicago) >= 300 demanda(Topeka): + x(Seattle,Topeka) + x(San~Diego,Topeka) >= 275 End \end{verbatim} \section{solução ótima do problema de PL} Esta é a solução ótima da instância gerada do problema de PL encontrada pelo solver \verb|glpsol| e escrita em formato de texto plano com a opção\verb|--output|. \medskip \begin{footnotesize} \begin{verbatim} Problem: transporte Rows: 6 Columns: 6 Non-zeros: 18 Status: OPTIMAL Objective: custo = 153.675 (MINimum) No. Row name St Activity Lower bound Upper bound Marginal ------ ------------ -- ------------- ------------- ------------- ------------- 1 cust B 153.675 2 suprimento[Seattle] NU 350 350 < eps 3 suprimento[San-Diego] B 550 600 4 demanda[New-York] NL 325 325 0.225 5 demanda[Chicago] NL 300 300 0.153 6 demanda[Topeka] NL 275 275 0.126 No. Column name St Activity Lower bound Upper bound Marginal ------ ------------ -- ------------- ------------- ------------- ------------- 1 x[Seattle,New-York] B 50 0 2 x[Seattle,Chicago] B 300 0 3 x[Seattle,Topeka] NL 0 0 0.036 4 x[San-Diego,New-York] B 275 0 5 x[San-Diego,Chicago] NL 0 0 0.009 6 x[San-Diego,Topeka] B 275 0 End of output \end{verbatim} \end{footnotesize} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newpage \section*{Agradecimentos} \addcontentsline{toc}{chapter}{Agradecimentos} Os autores gostariam de agradecer as seguintes pessoas que gentilmente leram, comentaram e corrigiram o rascunho deste documento: \noindent Juan Carlos Borras \verb|| \noindent Harley Mackenzie \verb|| \noindent Robbie Morrison \verb|| \end{document} glpk-5.0/doc/graphs.pdf0000666000062000006210000063364613766346220014254 0ustar maomkpasswd%PDF-1.5 %äðíø 8 0 obj <> stream xÚePMOÃ0 ½ó+|Lõç£ÙÁ&mc¨paÊÖ µ…nˆ¿“ %²œç÷^lÃ'hP|4”ÄWÁ®ƒë &3 ZãÔ9¨\.ŒÃPBµwò¥Z€™ +Z%è¶ÊJR轉ÊP(´·¨§‰;_?ÊÂx/VmßÔÒ(1æ÷fŽcÝumŒ@)–í9ùNft‰¤S/Ö¡wP¸’›Ë†cýñÆ mDÝïcbź9Kòâ;†!†ñ=3†¯3ÿ{JÆd1ødE!Y27Sç«Í2gO’œhÆS;ô áP]:³ -ëcglgxVgÑ™d·7Í®é^eA%ëYËî¤HmåEþwÉ…wÌd…!϶ø¿ëåï®ï¯~jj endstream endobj 14 0 obj <> stream xÚ}TË’Ó0¼ó:ÊUXÑÃòƒË#°P¡0\€ƒb+¶ÙIJÌÖþ=’GY’¢’ƒ<Ýš™žýB Q÷c(ãîOQu@/J´ZKÄ()hʃc™J"*ëo¸lu !ð›ÛÍ{8Uñ ßERbÕÌ0Çݸ€ÆúS‚‡Dì)ÃÇ/€lÌÅîòO]®Ñ{­F]qêkm]N°ÒÍRbIìò‘èGùÎwÌr"ÅÜðËáè»{0]ÓF<Çv¦È„ð œjŽ­Öé™ìX*P¼P¾S&ë|8,!Rº‚žÂ)ÍbN9…vÖQ.œ öó°³¾{߃2aJŽÃñàô)Û ýS¾í+л±gŹ˜›É¶ƒyÅI’à›¾6úÒPwèú+B˜à$ç¡ÇöŠ7Š$À5S±ñ´9tãèT;1Î{of"SÜåê§Øzó=`ªà£ŸªT’§¸îFkºídµ§dXõõj0@?¸knÒu·{€€m—5@ÕtгT á°eÀÕáàº!¹ß²[–Lxó½"XeFÁP0øÕ¿•f›yÛUºµ÷œIüÕËÒf<ÁŒ8xA‚1¬z?'Þ+«Cü7 óïÍã´Ýwc;¿<îq»\sgx{·éž.vóB߼˧=c_——ß .Øìuše$/à­XÈŸžü ä! endstream endobj 50 0 obj <> stream xÚí[K“Û6¾ï¯àQ:&ÞÄ1Ϋ²UÙÚÄs‹s %ŽÂX"Çgg½µ?>ñj4fâ$£‰Ë®Aj|MáûºhŠÅ‡¥þ‡ Iôÿ²Xï‹×WÅ«odA’•,®®õÇ+U"!Š«ÍO‹/ûnlºñ°üùêŸÚ®*p‰T©œ`ˆâÉ/WŠðÅëúЮ—+ZÑÅ·C}ó‹}ùÅ¿¿³/~ìoǶk,Ú×WîZ~üÖ½¶öj &0’´XaÎ’“/§›™n“°@Tè9¢BœØëCú qIH¸.J7C¿ê½°Eÿn¹â|ñk³—+AÔéqYþ}þÌsÂ8!ˆó£õMsÂ0bfNEP)='+˜±Å›q¸]·CcÉØîn<à‡QUwf%ÂØ `¤•º×oPD«ðÆ®xSüpF Á*8ÞZ (*ÿÂEgJ=;>ãåó©8!ÆyŸȧ}#ÅgtüŸ%‘‹f›ÿ.W’áÏAzDj\'‘K*)Â1HéãI%eeÒu$Õ½‘ 8®]H8«^tæ=Jç,—È-Š„$]ÑžÂõ^Q\M­‹ôÖr\wûö¾_®HµØ´×݇t1ør¾¢L<Ï5ý´±֮ʎ%*~½CÁ;< #.ìŒRèØQ U,Œ`äÜL 6§¡©·x%ð˜HDª>´r¶Q-ÿ¢iìk÷ée%â'h!®G¾˜BUˆ½P,ç´ g ´`Ç -D7‡f<‚NÅ•Øk]Š8´rè–ê³5€@|“ÝUX9ü®Þ7G:«‡vÛÙ×oë%‹_ênÛ¼]š÷T¦Ë8}®ú‰_3_?‚šîõC3ô£g`˜Kì8¡Ÿè¦ÞlNùÅÔl#66¥% ­ºß¸µë©ˆh=Ï›­?]sgß¹oJc”o8¾¬ôW!Ÿ~)ŠéƒeЯgH˜>ì8At3›> D¾A8¥™ðçÙº{ºâ’ä+bÓ²ñJ¨2”@KSx¢ì8¡„è¦êÙó)Vˆ€Žõi›©|´ ø§çSëÑv­@«£ïL.ý§ZŒúM%žg‡èJà•ÇËËl)0æoü)¨ )è &;NH!ºqzګлc à1H$ñ¡•x¨WsƒO\¾Ì^…àµÌmR^!âó=m“YÍîÙ5 hâ²”/ò®Ê怜*ÎŽK‰‘ôqIszˆf‡qilj¸Œn=ÄﻃóøÐJú£ÿ 6¥H(ˆMõùF$±•Ãn»?¼¹ýìOŸïH8 2?O|Q T‘/¥Š‡{öZJ-H3ÃjoÇ )E7oK̺óg@!¼9Ý)žÂ‡V4ìú+x`wyÞùõœ Èù;£öu;\¯i‚¨ø'zÀn¾$T…*$‘ÑU43Ì.vœDt“ªú>ÔóY|håœÏ.%‡Ø:oPšÄVû~v¡÷O—â\v¡~ž”ÕeH ¨çî˜>™1§$vºeÐYx£7 ¯î†6ÞbŒ›Nåßön½[u°€$7~á&%ºUÏÙ˜’Çøuãùøn gº@˜ps K‚#~ºcŸÜÝ?¼ÅӼ޵Ñ~lRþN‡›Tô¹<æ“OŠÜg”s3ê§a‚ùàÃîù“»Ð&—)lhôñÖlÙ–}#×óNïLá ýÈd>û|ªjžþŒÒÍ81i=òoÇ D7ó¡ïÁ}TÏ‚£¾^oê±þ}±oK­ýûÕwßavz_¾q Ÿ]ûá¶yµîwý`êùzÝ'êí(·WqÝûZ£²—ýS²?QÙBoЫìªD8*;ã^'“ʤϨl;N(;ºIä6òÖ,|°ŠøgÄýØüf©ç´Mж^øê³¶ÿHm+ŠÜ/%³—ÎK‰ˆ×6?Ý&×]½ûxh÷÷ÇÕKÛZ*à²fÿÔ•“UžŠœ½³™Ž¾v8Ÿd¢»©UQ¿?›fLõèÓ]:°±èë~ó@ „-êÝÎ%©ÿU¿ß¹þǺïºf=6Î΂èËì»ÆÞq·Rûë£LEÙi}Ÿ‘š|:©Þ…ÐÊÙ›” 7N0ÝÆ¡wéö¸—Á§–g€Ç¤šnÑÍãC+ç U{–Sú§Òq*âTùéYŒäÓÈ$RÅŒm­™ ‰Ó0Áað1ög~ÈŽ±I&X_€yÖeYèC?ŒGä_Stíúm»®={Ú,4D<)õú£.êîæõ¦õ¿[QìÙ%ÞÈÖùß²Ý{lŒKâ%AìscÿjÆ%Å:5MïÍÓbúÅÍØîÛÿÕcÛwG’šøˆÉ8·Òγï…ñŠ»oHƒdß·]»7 òvïƒî÷k¼7Ý…ÍÞíš½ùÑû\³¤6û.5WÊüul„šýºžîF¾ßjq˜ôÈ*ryÏ€üÕt€¥ÍæCè‹'#£à LtY©ÚçSµ÷0Û|𸮭0‹l,î¾íbðž4öÇNN]Ø@'1Ч”íŽ{gÏlŸ[Š ~mIú.¡ZÁRÏ’ÒüÄÙÌ¢~Òÿø { ý endstream endobj 78 0 obj <> stream xÚíZÝoÛ6ß_¡·ÙæÄoé1íÚ¢[ ¬m0 X÷ ÚŠ#X–RYi: üHñS¶#2…»¥ƒ‘ 2ãÈß#“ LRñŽÄoš,·É“Ëä§ç4)ÈÓ<¹¼J„& ùK.W΀Ï2[×7ó¿.Iž]&€ó,¹Kr(:p–l“œ€Œ˜f¼KÞÚp2ÚÆ]Wõåfs©Äª†ƒ4¤ÛÒÊ·U³lwý|1ž}Qepø(þ]mçˆÏn·ê 'ü>…´•ÿºSí›®ýP—ZlUô…úT5òIf?¿|}!¥Ÿ¾†² °L¼ ”orÕvÛBè&ÎÀ|AÓôüðEÑ·/ô‡n}„¤”ñi P±”¸î²çú^fã ¤ŽÙ$ÌlÌAæ1[5§™ílòp#@‘S1<h·BV½xkGk"¨ÛH~š£lVv‹‘!8ÓG±ï[õ|õÛ|‘Óì_Ö)X ƒXVt ЫšÓÀ:!`rƒÙ¤vOH«o7sJgE½…­][’p]Ge Y4Fö®ê¯aÚÛ~Ñ^-6UÝ—ŠZ4ûQK¼D+ÂåµèÌòsàúJF3  f4‹e4Ï·„faB yêZ5§ mM„øltªN*÷„”ö®¬‹Ïd«F\F_½ .ce£è+y[ö×"¦‰Ø¸R=Ú+õ|"bå®GfÅN½NÑh™Ë]Ù¬Õ¿Ÿ½}öêâÅËßßÏþžø—#€Ô4 <–0¥ ³ä1›@ F›@Ù m¦ì×e3Šw¿ÖU³ÞÍ;Õ"ŠâOÛmŽ„6¡¡ìоíÄ˦=šéwÃÄ0zúÅþS;ÿYÄü‹z¨vgFCpôÔCœ”…ôûRÚ€Äjá]/<¯èVÊãÞ™Á{Ïý«FöXŠ B8ùfà¹`žœ¹/OtàvC3µ±îªÕ¾÷Èïuµñ¢ì0¡l4¡#"¾Qi0sãÆáí!dËéé1Þ„dx@höºø<^uÆk77fçíÍ"nvqôþ²Ôà v'ÅR2t³îÚ[¹“ }Gòüñ€¡çõHp»K’` ˆh%z`©Qí@¼rfº²X©ø0±§\FÞ rOÈìôŠÏûŽüÅl ½¶lÇ®¦S&Sí!ºÚƒ«=ºît®ö|3Zg¨ìóXb£4Ì;¢){غ=MlÏÌt-Ój7uÊiõ¾Ûçvf¢#EMEn¶Oîs)óÑ–2!H‘;:?Cb_ι#j™²õÉ­Úr;3còÖ D‡Ü³q&«3¾”¶3ªkâcuMüÀ®ª™d¨f"•*œrÉþ ÀÝhI¸xb xDSvðJBª€ÛÚˆD[›°0NÙð…”a‡êœ÷ ª=Ÿ‹ÍcÛ­âžÝÖÅŸ©1‘T« FΕÎÓ›<ˆ]ë@,´²ÌŽ(vÊ0÷¨­Ún;3Ýöj?a~ÑÖ««¢û`ŠÛèìp/sf,ûOfÞŽàØ¼eäDÏ<ÖyñÅnW­›m9„Ý~ÏÉ8ÄgoˆÆÄM/¡ÑÞS@Œ7àsn|J<ÜÔÆãÓ\nà é1N3pÜ©±jŽ™ÉôØ*×™ï´r+d•»æ ëãâÀ÷’ m“ ü”gÂn$:ÿÃHl“œ'Eä²öÖÝ çÌLçV»Éì¦ÕûRZÿ1ð¼Ì¯˜ŠÜÁdoÛæv):lîÕItfƒ±`ºs¸˜[˜Ê8ë`SílÎÌRî ¯Ë¥œˆÍ‘(Ïœ(¯ž 'eíƒoˆêƒíl¶1'ù]W.û¦Üíü³Ê wƒ/úf§!Þ`htâ‚I˜óÈÌEö ¾ªvPgÆLôaÚ‚‡ Äê‡b<ò xÚ€/¥-Ü›¤rwù&èŽþ-ÂùcÛ¾xÃ}ØL¬‘Î{#6ó²Gê{¯jÀvf‚`ýÆI¾”¶0ºƒî¹ÄDÛå¦GnÞ°¤ü|óæäæL^F(}z‹ó`Gሻ²ô)¬Ú ;3A ý–œ“|)mẨëQÄé,iô®ïCuSt½W@ðºj4ãÍtPŒYݪjŠºŽ–ÿž/2ÂO¢¥±©-I±¬P)‰NmŸ ª–…ž‰›Â\…³~šröª ÞÜÒ,Ö«ä’”s^{J<ÜÔ>,¾É,y­ìÁ3åt{:Êyf–77÷WzE,ñœ“XçôkOŒÿo<ÈÍ 'F‹ DìçÆïìÕ—7?ü–ÈЭ endstream endobj 90 0 obj <> stream xÚ­XYÛ6~ï¯ú$1+^:ô!-š mPäØö¥[\›k«‘%G’w³@~|g8¤,;ô"Š1)g†3óÍ‘äC“ þð¤ð7KV»ä§«äûç"Ës™\ÝÂñ²ÂMrµþ+ýykö£íK™ç)_ü}õ+P‰P¬( O­aS9êŸÌP¯ˆöEoö[\é³×/iñ¶;ŒukÇæ—+]%\1©rÏLd%ÂqãŒ/–œ 51+tºï»Mov´énË\¦ÿÚÕèUÓ ÏX•UÈkV)àX1)×-]{ñêõo´·–7f°hMàCž»öW;úíí¾·ƒm¢H‘J7¨î@Ǧõô­‘äÿéú÷‘ÖŒ~Öu¢‚ÇÇ=léßÂ%ÓÚ½åhÝùõ‚9’@Q2M¯}¾(%HÚ™¦yÀåo"žÍl¤JVH°;^@† ¥Aè©5eÉÊÊS^_P±éPïö°×š•Ê_zŒ¹ÐBžù‚X;ÓcCÛ½©û ‚ÏE¦ƒˆ±(€sîÏVºõcŒxÎrí ÿtn á‡ñS8›´}L+Þomoc|•dy1ñ*XåþœÞ,èÍ2ìHûî6j]Ž0¥›w¶{`a¯3ïi "u +™u.YpEìåK¥+VŠy,:­sòT®œÖm!€²Ò36 <]Å4å îb!QPÎzûÂ/ú ¥IŒU. å°^TSö8^Æ{þÊ\R‘Aƒ;¥d¼tw~1«…(Ó­N¿Šú€ d;‡t,-¢q–±R?b`ˆ®çñ€ª´ôÛõkˆ²5ÙÙ!‚>ßÒ—;L..¦ 8­8«ø™î:®;blq+2ðùè`’§±·ä*s¤üQ¤âQÖüK {hE~fØdG»ŽfÆY^MÝPVnͳàGàÙ1È­C¼;Iq)¤$Ô[ùˆ[ ;3ðJy¼+ƒÌ‡ˆ Ë#£K&”[P‰¹ådAXC5‡hž*&HC½à¤×ÅeÛiÉ”<ÉK!´ ó÷v^yÍXw‘kglið§ðUÔ}©[úueS±Gº]5‡5 ÇÓôÖS cXQ­íuÆU‹OƳ”þ@‚¡À ö¸IíÚÞ¶gB·ÖŠƒ¡ä<·~Væ7Íþ=‹–chšB0ÿà{„½33Ч˜ ‘îÿ›Œ3ðÓŠÑ{¿… oÛÒö¤óñÑ@ ,¼Õq‰Àè0´½ßv¥na™LU_­òå°)˜8 é\¤^—Ïu¦b+É8»Ï„ÙéI¾­;Ãß²®ð|å Žy`®¾ÊŽ¥7¦þÜäùQýÖ«Ô¯HÏ3Ž/<ŒtÎ29×÷YÓUæÈ]ì–.öe¦Ž±ßMï ®¯»«—ÝÞ|8ØoQWž¥5³l±T IÆ û}S¯<6‘ݱ»Î0u´´ ¶úHGcVP¾†I)ßöEZ`À¡mÖChåûî° S Úìš eûU,Uºí¦ÜÞa©·½?¡À6í¦n7ÔšO³Á©œ™®° ý{Û¾‘oš™Œ5±ú4Ñ‚\ ¬†mwh(¢²ùoÜ;|üÑ£l M}ȸ]ë4ÁH©Gã`ô¾Û÷µýE?ïÀbˆ?б“YŒ«„CÕBánS¹bB†aÌc:}çbâÐ{û@@.&¡èÝC¥ÀJâ@¸í`¯p šä]ò&"sNæ_ÊOK“¢„䳃.éUx ÚµÿÙOcOèk–9On·órFwÑ(œ º|·€:sÓX"r3ã„yŽøàñÁâÕž ­á ¼«-tÒK #òw­ÙÙ§—§àãw;ÔŽB«kÜÀ^”)ÞÇU•ša¨7-ÅnåçÜ2À¡ Ùd©Kž¾é`PÑ[}?üZxN‘ËÁ‚D‰T»º5~ö-{³šîƒW=8«0€¥±í&`à¶ïv´âÞäm…Ö¾o! ’€—RéKŸ:[ï(o,bÁ³Gã̸ž¦Ú'ÁËá’/¸óKÝ17+€Î4 ÿþÇ«W±ñSûøx¬à”–Ÿø½nG •öî‹âdB9j‡éÒ磞¨Ðœ.ÐCÉ?·K¬å„‘mj4Ú»HÓ š‰@p Sš•Иfqƒ`ÿ(ò¸AÌÿl(Åü÷ù¼‰ˆÎT0q„œÓš¸!¤újCÌÓ2à%—6’Kè–¦ý<#k8*}ÇFÈ•b¼:«‰6‡™¢Ês?ìé i˓ٖG’ê8í Ú‹—ÎŒ¥«sŠþ¾í(?Œõ`ÇÓ2u‚³ çƒN²ÀÿŸBÎ:¿ùæ?’1ö endstream endobj 93 0 obj <> stream xÚ½YÝã¶Ï_áG98³ü&…"/RôŠ Mp[ô!wt¶v-D–Iöæú×w†CÙ”W^;Û"¸Ã‰&‡3äÌo¾x‹ßbÁáX8 ùb½[|û°øËß„ZÎrž/a}…?ìâaósöTï9–ÝPþ¾\©³¯¿>þuùéá°É${„a¹†}žöý¸”.k«f)}6”Ýr¥Ë†¿>+šøíºé¾Ðòºmð×PTMÕ<Å-Û’hëªhÔ>Ò÷ˆÄp´j]öl¹òÂeßÕå®$&ñB$§Tœ3—Ãñ„Ç™kf}\þ™"1UOߦò}¹ òü-yB:Æíòf̸ŠëÕÌvÅÜÈýÓ»°¾ÒÚ‚3&L‹¸Ë&»r&uÜõ‘K=p&Ý…à”…Cþ÷³hæîŽãåÞ-WÊ› jåLVÐg¿\ ²"å4‚hFœçŒ›ûTµ¶Äéˆ|#¶•SX(7`O]±ß‚©ãÙíPŽËÅ@#À+w³ €ÅqS>Ó …çéä'þÁXB9¦\j¯ `ÆeD>W a¡Ëz3wkÒ¯à F|4Âîäj\dŸAµ>‹Š”[nèÇæPFù-MteQ×m _CÕ6 kTö÷ù=£ƒ—ÇðofÔ"vód7‡vëçŽ.­gÞü9¾A*ºx_òd¬ñ€Û¢y*I»+erM ò¼­j´»ê¶ëÊ>^®‰‡ù CÃLù{V8¬ú¦”1/”ÆÝÕ‹ Z5EÝã/}õŸò®ÀûARîÎù9N˜Ãü¦ Zù<Ú)~íƒùâ‘q5àe(Çy>„÷LÈÛ¡ÀN£îw‹ß „,žR‚%=æ·ØÁ/Ë”¡_õâÃ⧘ &Ð9Ó0¸‚vàŒ:+gŽìxyBså€ÒX¸rÙÇìCY’*ŠºoiDv„Á…W¦†Â11Š Ú~)2ƒ<Å«† sâÝÝa=ÌbD傉iÈ8gè'rç(Ì>.gY:Ť˜…]ñGa§Žé6wkÞp4ƒ7¯ÃõÃjŠ7oγü܃ÏÀMhæst6Ǭ@ÄÁ%„=M\]BæÅmÔiæÔ ÔÁ9åužÛuAƒu8ŠUyuR0}uÞ&¨KxëWQçs²÷uhá—24äœür`Ò¨ç`9òu¦äæT©0Áär%„4Ù‡p’C7¦ázÿÂŒBr¦ˆ„‚üÖL'R+¦2S²(ø¸T"»æ?c‡z.4’Ò“–1¢êp‘1Oa0|¶xVžKžW"€T¯”¯pÒ;8È{«Wð\•$UˆxªñråõëE»Qé׋ “ApŒàõ©Ö¯£òBž€˜JÓÑÐU™‡iáÞ_AåÄÞHñ¼mûýv„ÎB(Wó•¥ ø½«4œ÷ 1ÌL<`½-ºØ7ÅîΔøe‡§#·à€K¬/3Ü#¨*ú¾zj°ðÆ_A?v¬0lZ·a ¢]ö~ …Ð&á~ú\–Û$fd‰H‡uËnúFÙ±îŠõi?à‚¢Ž 7Þ—§6®Ëæ)4R¨ºvG#Am-‰µs*»u yóý#-6m´3i† K„ë)@^ WÆc¢Œ•;!±¨š~ÎàZÊsþá_ß?—:’yÔh+X Žmµ‰¨Á„ü¶‡iòpsi9SZ+*œ˜VTD J‹“Y Ÿ+4nÚé ¾°o{ÚÃ¥Q€ˆ °£€‘ª8 í²ÊÄ/q*iI´À.ùzÖÐU„/®¥ )¥Ö™óiÇ‚ë͆]ÀÀõÞ0µ;rŠ—ÃÁôr\Þ?ÎÆ øz­˜Û”—hY¨ó›Öqâj­˜Åw4ªÕ©V¼€–ñ jÛgÍÇ–€¿44άÃ7ô³xé©öã‹â–éIíFê¼æ.:}‡›u¬‰þwwÚ]w—¡Üíïr—/=f‹_éÁº¶Ëhˆµ„UØÇo‰êü¢\ò¢èuF¶úK· Š&Ù¸?tQ\ž É©< ”iÑ…±è¢ëbÎ+Nï1eÎÛgSuåz€£ÁÕï|IËuÒnÕ¼-)kb^‘i±a94®ñ ªý0EoµHÞ `¦jÖí.æ‹­arZÌ0Ù¹©ïƒ<*‹1o¶×X½ŸÕ(1ÚI—4Uð dky~~3°½À õªòÛÃðFíû˜}lÚðÉôRû°µ‹Aûø= O-©Ìë“ö󜴟²›hHû0Ú¿`eNÚAûÞüÉÚ¿ÖZ/GMbk©þpk‰  U<·–qâVk™žoÿ?=啿[Ÿîh(夡ԧ†Ò¦ ¥zYx]4”úFC‰/—1ùO%€DýF§8u:”sU!Å~—m‰|Œ©(”6–Ífš6ˆ°}¼ì£»õth*om+ë>0áiíHüÓWÿ¶¶ÔG endstream endobj 96 0 obj <> stream xÚ¥UÛnÛ0 }ßWèQÍ–-_0ìeÀl(†˰‡m(T[‰:vj+½ìëGŠrã .Z´H‹G$%ò»b! à²TÂ?`Å–}\±wŸÃˆ…ȃœ­Ö°¿D!a«ò7ß4»ókÓ[s»X*ó·•ÑåûÅßÕW0S«P‰<ËL¨ÈY~_È”wu»·¦_,£HrÛá7æ?¿Fçý„€›ª.«H½ÆCÉдån±—ÎsÊ-)vkR´•ñô…ð·< nùàž×]]úØJmõ cS!Ŧ¤‹ DtFÀEÓ¹+»È.iWƒkmMIàMm+2¡8ÐƱTAÀW•Ë`£çpÖó¨¥÷¶Ûj[ºiî<ÔŒú‡3»ÖŒ¤GB)^Ñ0l7 +OœðÖÜx¹/ÑmI‹uoœ;Øw*McF‰‡l!œ8“üËz¤'œdZª@ nã˜qŸV슉(ÏØ “©QÄ–i.r¶Q‰ÄK ûÁÎ|5y$,¡s:Ôÿà73¢<ô*ôƒLðó aÍv÷¬†øµÈ"Þõ—Žñ8Jùq“šr'c'Øß¨µÕ¸}GÂ…31(d|?`Eá ‹«¹óë®§…n'†»}ïÌ啪ºÅ;Ò»]=`k¬Lv}·éõ–„BÏ•¿›@ºÝ?´æØ‰yY÷¦°p5ý™³§©kÊîykníËŽÌ7pð«¡î*Cì°\åÓYŠZ•HÕ2"ƒÞéº!lf¾º#îmë®5³AG2YòDU&"ȼ CÁxÏá!É(Ôm‰ìª˜XefÒ:†¸1­ïz âÃNSöx«ÛÛMGÓ PHÙð"«×¨è5Äï@&Ç‚¨ü#‡ O î¹±9ñˆ{[—f@'0J>A ÌÔdJ ’÷ž']‚•³WX·E·! ÷]6 …LÙ2I¡2swf:*Ÿ½ùûbN+ endstream endobj 99 0 obj <> stream xÚµkoÛ6ðû~…>ÊCÌŠ=ˆ}+¶Š]³OË(–’h“%WR’¦Øß”([¶Û­… ˆãÝñÞÇàCÀƒ~TÍÍò¦ Á¶…¯‹êöyÜìÚ€,ûÕŸ—¿?]5®ΙŽcKNELhGŽqC0ïê;õ!`RgÁSk–)s ÒÁ6H$ËR7­ƒ÷Á»%bØ/pó(b\OÈy¤˜ç°{Pý” ÿñäUÒ˜v‘ö‹WY€‚ä€g퉘ñÌ zÿÜ´»¾Ú“ôña×™d¤-Ùµ%ƒ¿Ç9§å«°jÚ{¼î«OåMÆÕܬ^­~Xä¨ñŒHîDzßtÕn¨ÚÆÂÇ>s1ÓŠÀ•¿¼5…=3»Q ÐlÂÝÆç~†«åœ@{$‘„9QjÊ'šp[‘Èðé¾Ú¬DÞLÕTC•×õ3AVC¹Ý õ¼ÊThOV¬d«µâqxŸ[°¦%,+gº¡ÚXc_ó$c K†¦’§HæÝ¦gÊ’œ„„0»¼Ë·åPvKbJKܽI“ ‘™…èwÀc–›ê*â E„¢¤BsÜ,µ·ô}Ä‹ÃeÊ4/ò!§ÑM÷ÍB#À¿û \ BÂtcJ°ë‘å*ñ¸à)peâì*ÊÝû¶ÃY<ÞïÀSe–2 ®ÂcÎd ®*u„òp ¾¯úX}0«¸;(T†å§‚ÅòÑxOg®"NH§ 2öi5ÿúZ«£­¯ªN‘`xü|uæ‡êLAÐè(‰f*Cu¦1Ëâqá¨:=°$ûfêÜ‹‚*ÒLûºý­º¦?÷ÌÀE@šXFæV1;£–4*@s1 Z—kPË7“ð¯r3ÐÅÂL½Bj–ª1÷Šó¹OÄjJ¾v~&ûztúr8À¿pg1;?‡Ûƒ²¸§<1ËìX×z.$Óò,~ÌhÀ{g¹=ïûꮡñø‘Œ 74wC ìn*›ÌÙ¥¼êÈ|yæú#ŠdmUPǼ B¦¤yT¯*ƒ×6óoÚ¦·¹sŸwvלùÚE€çJ&§Š€D`-5óË,Q‰R–%.ÀôD%ÇOöÏ[t¤1Ûò¿Y&m€y0-h• aî-(ÕÇ7Æ/q¯:¬x®77ñÑ«ŽÜâ(Øðò¹Ã‹8¶Nm‰÷ƾ0Þ·³¸oC‚MDÜæ»Qú?ßb\у“ù(‹˜ró8ב|Õ/!‘rÊ|ûû›7g´2–A­D R– p™$å˜Î¦[ŒáÔœèòÞ”þ=ËUO- ÎÌ—Ç;B…1ùZsItIÎÇ‚+DhªÆà*ÏW<Á½àjçg‚«G'/ŠÃàš0žx¸5õ9gp{P÷#7WâÎb`a;@Snã@ùÔØé©þÇÒûAP)ÎÒÒØÈ`ض®-Ç#àx¤øoôä¹ çw>>÷KOÂäñŠbÑõÀ¯Æz²q–±çz)KÔXhSÕOJS6ü(Wo ÿ=Õ%³09ºÂ:…~è-š€òz‡ ëOë]B@}<ïŒê'ÏW€ü}7æx+$ bâÃ|;àl캥·ÃÇ> [œ×à÷¦{ƒØa±´]Q5yMS`=l‘0…ƒ²ë稽гùµBWns¬˜q÷¡±*[yEþ=ß¶ø d çŽ0±˜–F­•n—Ã2kÛÜæ <4!wHJ‚2Ú¨‹E#ê鼗𛸷 àãÈ¢…hû°ût=5q“g"ÕÔÏ_…”dýªÖÜ¢Ý#ë·Ÿw]nr$=c@RBƘPñPÎó!¿µknŒ8ôÛ/Kz«Bû$ƒÃa™»œQX[è‹«Þ}Ûkí ;¥geŸ ËVÕlª¢lð6¥øé- ÚÏÔøÐ@®ÇÛÏᨽ¥¯Ï ‚R[‡;{mm/ø."kè;½éͨڈ‰Ãª§oÓ6ëOe×^P94‚ŽIä5x›M¥$qÏ× w)êÅd‡H›®>ÛrÛvÏ4žß×2J‘¶Îƒ#ÛåÂè+Ý%Fwp„tË3ÝÁ†Ñ6*Œ+ã>umy©,jWü!ð  ÇÞ½·éEùÚÎÆé™ÃãÅ”ô ?±íœ²ÕìŠømèK5 N¸5‡àž94š_¬«WRÑù¸û6TÜ÷íG’Ú‚s§L¸×4øT†¿þî©êñeQâkÚ>Ùµ‚¬•u(øZûB x’²F m÷…{*êÉ)¯—N¬¦ÒÕ¸'ö¦.Œ,`…BCª3µ¬`zÉR)ÁSâ‹ßüT-N¾ jDüùu„b™"ÄàhMéR{é’ªgLµ¸AL³c¨œ{Ks̼ÃêyzJòÚ&y-'…㻎휼î~^rÏD/¡Ê†¬¤)¶ûx"sÀï¾û R endstream endobj 102 0 obj <> stream xÚµXYoÜ6~ï¯Ð£¶È2â¥úP´)Z)‚¸Oq(’v­T+m$­ýñá’vM[IÀ óÎÁ~3Tð)àA õ¾¥þuX 7y»¯®7D¶ÐÉŒ Ôîù‹4@¾Q†’¶N”ÐL'FÔ›û¶;õàl!õäbO‡КE´å¶«ËÍV“óÞÃ9¿¿5¢ß£Ôk3¹ïóã Ñüøû3êÔíh;v¢èÚÁN7yoÉ “ÍO^íIž2-&¿VCÑ×DZîZK¯—Šk–©%ùÕ žª–a߯ºu'tfm1•@¸"½Ç<Ÿ.Xì¶£“S³¯o7"+ôŸáp؈$ü°ÙÂÿ®© œVÎç@r꜎´4v4ZÓD àÈòb¬úÁ02A`Æ"<6É0Þ@ÉÚc…f‰´6lGp”¢ ĸ¨’"ìv4?šs”*@A‘†UQ_G\U%-ç3#ø ¾tÁÀB©ŒX(…G°âP>ÝáîÅ™Õê‘Ó‡€N¹%±Q|¿‚ e)^ýýòå#L„%ézÒ°:G´ÿž†ÃØ×í"W% í] ÑŽ>ªò–Úês=ÅžFäc¤…£ô¨*’”¥Î _á%$ÆŠEñÒ¿³ßØùµ¾DäG$므dØ‘è&Óx ”g9yY>Då˜ñxÁ;‹ÏVy/¨ï¾ „t Y–Ôi«;;ã(Ì‚–pÊ5–;âdúm8)xŒîpøaD`3£²Ä™oÉiâãwE¹Š‘\€¢5ÃÃ>ŽYì.P ĺk­ òtÈÒbÛŒ)rS ‰Å¸—6ˆTÌhâE‚®ù—+Vó¶ô^ψű%ùègà ÈX‘ »{Rm$á0ú²nó†f[¼ª'H©M¨:‘í D&¾ŽÌôá”òÚnDMç¦ÊKÚQµ%IíêÎh8qÈ'ê¢ÂlA§(Õ*l\À»qC¸Òá«n¬Üb>ZGUÍnÛtÆ[p5ì–¶$¿šwjÆúØT”=€Û@kyï4°èîÐþª´9ã2B1g@O:AÍáþb{ÝŽZNØ)ó1'êV5“+ÿhòap.-µE_åÖ8²â" f®¨m»vû¥ê;tKœÌšMùÀ(Õ ë9eò±ìù[3§ãÇj2á:tý=õÏmÀ¹”¼d2¨qÇñÌ–`UÓ DQ–‹Mc¦¡ç¸£ƒÝH~3y®ë«[èÌLP©©æâ.¤Ô-m¢è sÂ÷")ˆ=å»q™''Ç,™ròÎ¥ºŒê‰éÐfØûS1ú„éò̼¼À¥â• zþÌû»z0‡ a[_ÞîA=Llb¯¶WÂÆ‰;·ó‰³€2B¯žVsÑc¯£½—þ2PÁÓg­ ,ãÓC;g"p£·LRQ:?h1@ø;+¤bÒ!¼eâ&cj×<ó>J•’,:K(ƒÕ'Ks¤r²|a4‡EëHøf:?{ŸñL;ô‹l¥™Bê˦:ÈTb&ýŠL‘+¨jÈä…ÿp†ò¦™ïš[Sé TÙX¥áw»[,jC`üHm˜I*{€¢Ã EÝK¹X7òºµ¬•ñ?¶ÓþÄE­’YøÊê"š5ÂÁ#á‹d;j)ÃAg!]ò,¤/ SXóÔ@IŸLL˜Âèþë/xÅé@°c˜ÙÒÇ’ 1Ù¡ì ¾Þ[¥)· C)§÷B¨M]m»‘2µýÂÒî]UúX*ÔZ2ˆ3— “õT¨µÉ³S*´ã•T¸óD*œxÛijÂ{¢šxÛ²7N¯çoK|ßú1K˜$¾'ßÎçÏíü»¾—U²ò^žŠ­…êþ÷rz™Ï9~?Â*›Î&ì™cáM ¤¾—2N·8M® 6Tµ§‹4“s2z¸ £ Ä鳇æ‹Öù8+"%\ˆ×Û™Ù‘9â×?üO [ endstream endobj 105 0 obj <> stream xÚµU[oÓ0~çWø1A‹ßb[¼!oÓúÆÐZw j“.ÉZ@üxŽ}’&í²&¡VŠísüÏçJ#)üÑþ)™oÈû¹¼b’0F­Rd¶yÂRj32[|‰åÔÄ c\E÷ëmüuö™|œ‘B…5dO”¥F† :#’ jt¿]“r=a`Pꌸ:oÜh+)·´5TðsЃR}_çÛUœ­¢ßøAca9Ϋ2,j~™Ë+C[§d¦¢ºzl‹ÒuwŽÞ˜qj}Zo?j„…•é´ƒfƒÚÞ’×!Ü@ Âaµ<Ñj¶qb7/nS&ÝOƒQ'F¦uÂÍŸ uqKX),à+¨Ï!àUypíé?%ÂÚ´ák_4ùÆ¡(ïDÅòHÅÒ ÎöþMÕãzÛohÕníZ×IöE»:yÁ÷BI*åÈùˆõ¼÷Õàý¼\ ¤J©äèD`ž-…æµË7 .ÍK·ÇcdéÏ0"°x%Ó–²1KD}ž%£Y¯~á ºs‡ùÛÙÏ[ät`‚©Q]Õ^ î¬ÂáÙ\C'1ã¸÷ñ"ªÝ&/Ê7»XÉ(_ nNW‰WÜæ5d˜l¦Ü ÍP(XËo§á9áÐ{ü,È*÷>ØùJ y—UBöù ¬7./‹ò7!™A¼¬êÉPJõº8Òã&y:o 4Õü±1oà‚Í›°=7oF°Jžë#zÀf)dFv|¬¥ž9½ÑÌ™êÕÐ+æ ç–flbÀŒÛÁÄ„ùŸSCHóâÔH©PÿÔ¸}U}žJÝå³´8ôx"x},@ÁT8[Öo(ê5.ÚžòÆmªúçAZ…^2=§…fTM ßX|儉‚m ®Àî ©‚^¯Tô&Ðq ŒŸÇ¹ñpI¦55 !íµ¯ßüB5€C endstream endobj 108 0 obj <> stream xÚÅVKÛ6¾÷Wè(kF)JDoE› ½¥Ù[\,´’¼&*K^Ivb ?¾3Ê¢w{“K± ˜Îûñi‚ç€1üñ Kà?Ê]ðë}ðdBªà~Ï+3 çêsÈ™ˆVœ'2üÐûm´YuÑ—‘ˆÃ­iŸ$þ;Œ¦­‡èïû?ƒßïI+—çL§©S+c¦ô¤–q«8 Ÿšý$õ0¡óàKj–K+ u° ”`y6]›àSðqÁÀÌ䌔}]Œõ+Ý<Ž׳rK–ˆ[Ú=.§þøZ3Ožf®¿é·Çå4›¶ª¿R^ÿ¥Œ»Pìùˆ™¯ûqbi‹{!9ôêÝû<À"Æ-¬&IÊÒÜšøtj»ý`^ÔKxBZ%yX—fsYWÄgâ•J’9«}è$SÐ6\0ì¯rô$Ï¢u¿‡¯¦1E¢kUŒ†±?”㡯ï"h%~Ùš2J²p{©Ç´Hk°PÑËØÑËóþiNô° «Ñí8u¡WÓ=½·;`¶„ÑìêuDg º­lT±ÏõBËšÒ&V$á#RÐŽ˜=ÓÓ“20«`¡ôƒLù¹öpIÂ3ƒÔGJýDm Š‘hEëŒ"݆Ø2­Ã?6Ž´uÂTl<¹BX- 4Fu"zýÕ ã€™Î=9Ï/Vù3¸"»pÎ9i»á“]EÌÄq†Ìä6d¢D,fÌt÷ éÙñjè«Ï3Ã2«×ÜBÝ õ—SèÅ}ôrç¬.Ü#ÞOt6ã@Lçñy0“ÅïGº2(¤›¿q†º 4ÁÃÑú³€swt(»vp2å¶èÝ+:ùV ü«†ám‡7ƒ`’å×@0ͱfô¢X0‘çP1ÇÝ;G¬…‘Lé°ë+Ó ]ì vô7NζãÚÐoAÒ0÷Š*y‡Ã;PRJI–YP²ìÃ`žZœW¼­Ïè0y@½š]Àä•ðEÆ mçð‡ztÑ?xsù€Œq'bMeØá°ìH=í0Ì »b[p…C©…rŠ¿a> stream xÚíXÝã4ç¯ÈcŠˆ7vì|ˆ'à¸Ó!:nßXtò¥nH“¬“no<3§I·½v íJþšï™ÌÏnpð †?dþã Ü_ß7/‹€K–È4¸]ÁqÄcVÀ|ùsÈ™\Dœ ¾²ºÛ,¢$S¡5zY5뛽­ýf»ƒ…é¿Ü~|{Kr¹ 8g…R^°ŒYZŒ‚w¢U¸®»‘ë>`I‘û@,—ŽAÁ6H–gã²ÞoÎ(˜ˆ¼4ôDr³DL’ p\]“<yÉë)LA¡ÙìleÛ-Íóa Ù]ÌemœY7/óc¨$òZ„b*wZÞ>6m×WObšÌxxÆxD¹dÄQ5 EQLß¡Iïœ5wní ÃãÏ_}A“²mzÏRn´õ§«FoÍÝâËsVz•^··Çêž(û]Yš¾_íjHz’¦ëè1-¼ nñ»±-Ãáá@n÷UïɪÆÎV”8¯E{ÕÆÚÖÒt ZõÚ|$îºYú¸âi›ˆ”_‚ ‘Å, ×19R1__A¡™ÄIsŠC’ÅLzQ°X\•>£òÒO¡ˆô=Å"øþŸD^˧#Q‰"9Å"gÓ¿Œ’üq>û‚g®œQ׋xüÞeO èËÉ€„S—’ÜÁ‘[Rf€øGI‘Žp„GHá:Wîá(ŸÃîŽp4*öpÁ’ÿ!8JÙãìIÜŸ‹G—Ëäÿ®ùi]S¦9vµ±k&ϸ¹GšÍ®î´¾vwŸô\¼¼ÂÇ‹ùeá3*/œªèo]àݼjh|ñúû¯ ¿y‹k–uu¿37e[·ï4.#p»Êe¤ ŒÀÝg ס3+¡çü¥þ«Dz¶ÿÝå>ÖïöëáŸmÊ"+.^« •jjʧ…"X ±VPW™{æ¥Ø–Çõ¼PæRgTÅ…'$ç>'é\$Œ‹«âçd^¾/ÄÓ¨$“üøUƒ!Ñ4øìá”JtvF•г±RqޕУ«Th#X©"ËO*•dºÂd#nĘ™Y'¹ƒµ»µC1 ÝÀHõìæ´'Cº®]×´¿4}µn¨ü¥$ǯ³¦?ÜîÃüJb=5a¨ ·USmuM"….nãä ’b×C7â¹[ýøeÊ}hÞÙö}m¶=¾ áz/no5êÀ÷]JxÒÉνp†®à8¹’†q¬MháÕíšeeá2ò¹¶Œ“ãm—a°ãÄv¯¾Ô;‡‰Ÿ!j/ âmÝb8÷ýØõÇçö¦^EpŽ@Ås@@x‘oWUWûŽY®M£méIC cºƒ@oæ{i¬Ÿ®h|pÄv¨JÿóБ?§j䡜£f]"û†n hš1WLï04v·8j“G¸±€Þ(Í2–û_¢ÄHýæ³?ai÷2 endstream endobj 117 0 obj <> stream xÚ•ZY“Û6~ß_ÁÊËRUL¼’}ñÚŽËÙl.Ïæ%“ªåH”†Š”IÊãɯßntƒ9T&©™* Ð@7úøº¡àc ƒþd*ø‚Ý)øçMðòë8‘È£<¸92¹ ¶Ø‘7û_›ûr³Õ¹ ÏEWœÊ¡ì6¿Þ|³¤ö¦¥0-Ú8㘑D¤ù{ÞlU–»ê6’¦ì‘|ncWœï©¯½Ûlã$ü_¹xPKÏ;¢@º²ØSwÕˆÍ6ÑQø];ðÇá¾fsmWRΫš#5öÅPLA@Rä žZıÝùîÒue³Qiˆ4µ w-µ°3£N¶zGðâ8Ò†8ŠGÐQõ4fמÎ5H·~¤vÙ}¹§1Õp¿ Ùµ—¡jʵ£Ð±:gYë³óö&ø@w<:„J‚­2BËàm-R׬ƒÁ¤sªã XZÊvƒOh›H‹HM´M”“d ºö5>ÆQ c ?‡5."‘IßÒ™5À΋†ž-tê¾du[h– í”zïU †@ï‘É®q.Ó­›Öß·—»º\Ù¤†AN>og\ø®QvCùÛÒ™ìí®níÊ»JÂß^Ðg°[{VˆÊ™I=ÜW;¤u?[`RpkýFÛ/Là.0nA…vKÕñÞš"8cLøþ°& äÕ³W*‰Àõ !¥Á{%®}íð½Qq¾8|)§¯xñ¬ùJ)b÷=zñ”ëtÁu2qí´§cÁ5-û$+Á=[Œ2dnK‹‘QHgf³C«±]ýС—\Ó#Tw·ÓC¦¶¦Fjáùçº.%ó/–‚]Óª2ô<¢ü<ÐΫy Ð7hp0€Ï6†·¨ó•&2þªe³ïÙõ›L¨|¦§äƒAØDØè/@&ùLÿ^‰ŠÚ©™8þ¾vÖ`ÎÈþþ‚H Œ»„w'àYôýådŽlé9I " X DK/#ã…¾©;ôßó'£ƒÆ¾)±Tr%ÌL(k×ímÛ,ôö?~!n7Ìtæ1ùª÷S9\º¦_“ C‘q¨=FãŽÑ€Çc$ÑCew`Ø (-º{Ùí€Ã¥FY3MXÅïÁ6~/»5'ÉÃïax÷Põ%϶üÂ3X„û=m¨àµË®k;ê:Á²ÅÑ! æd\ÑìÙÍ+C£i›-­þŒÌÞ¼ÿ÷« ¸Õ×`b0¤®>^Ê—»¶n;B4™蜊Á97~?½ã—îÈ  ÈSRÅ uq+“TPðRÓdœw¼Ž³\d¹çIRE{Ù=B»jΗ^G½Ænä=ÕÖÒ¡y® «®ÐóêÃë÷öxßÓ'vã|ØP…ïî ÌwÊ$#ß2}~ G¿¦r*ž³õA°Z_²Ï-jÞˆ_{êÛ—ý®«Ø÷ìŒÁ0ëûÍ ö÷€ ¨8|i·DoV$ z½îT5Å`­Úì‚Ö·Ä:¬m{ØNSgîÛÒO¯+@LÒÊže1z 3ͧÀ/}‰Øi\úβL£Y§"Ÿ±º,z‡~›Ò¢ùã÷¹Ø•‘ß~¼¯Çϲ;VÎ&Ô[0vnÊí2>i+úêb²–‡.¨ed½g¨^gàÂŒ«êùY’Ý=q;œLèÜ%ð6Ón¼TŒQò°¨kò?v௻jgµF~¼¼­¡¢ñm†³~Pƒ]Ly,;F(,w|äaW4Gý ksâ«|æA¸Û(ŠV4>C—yæ>ó ±0q ]*¨åœÉpìvôÕÊ"Fdñ_^$™C"£½E®0CY+-$åô ÎNÍ!gÍÇÿîÛþÅ:V£UB\Â̧çåTL{q—#^ ¨9n),µ•Ÿ*6hó—Â4>æ®ÖÑ¿nO'ÐbDÐäå¬ã+¬ç¦N‘?‹×V†ÝúÇŠ¼}¸'ý,š-â¦âŽÐ&Ò=(ªBGA¬¶Ö…+—­ÃË„QŽj8ºstŽ âN†v‹3wÈ^%M ¤¶óztZi<²ãÉÈB Ǻ?x)Îl¸š~š…tRµKšVñPÚošz±V±¾(±¾Æîfbã5iÖÜ9A;'ÜÄŠ7$MÚXh²eœ…Õ‚™óZÁ‹y.” DD9ðnå˜c‘‚¸Âè•TÔK€µõ4“³áææã ¾¹gAb F=|åÜ2ÙICèZКÊ"·³Ö”ŘñÜð᨜k‘ *ÓcT‚qåQ¿K5£é,Ñ.é¿JädíÏF) Fª“±êèhQ‚ñ…Õ¾GR]bÀ;→Ü={Êý‘½‚3G%ã —’R•÷¦j39›CëÜÁ8í`Ü—ÏŸt¢±4›;ÓÒfðí»ïß¼ý@¯oß¼ƒ×§Gôôd9'ÌC†+suÆþr¸¢Ç2R"uÞè¼æ­&(†Á{JU䂬Ä8WqŸ{ô˜ŽXE¬t ØhÚò¡½t[²m/—Íæ=à°ÂÃVÊeùÏ t4Æ.Ã@‡cI™ˆÎ_œ·T˜4ðG¸ÚCÇ>Òqu@òh@fãNˆ&°×/1—àP7÷T|vS$' ôåáê–˰U`­|"Eâ`©ÖJÚ/'¡ŒU*•Äsœ=Æ¢YüR‘¿GÀC>mbðNµÝlb¼ºñá‘XL8ÇÙ µüøJÇãÓÕ‹ª]É W¼ðHÃVQ—”ºÆ»Î!˜¹jLFçBÏ ¿W©[ä*^½Ïø ÏÚbÃ2ÀæÌ°Ê Ƙ—¤QƒÙçÜB”ÞõŸÛÕ<7NÏà“Ÿ7ySž6çtK`ñN/è±ÜÚPü¶«Â3Ìâ 8… _‡âR®æ8ÓAR&ÊçᇠD¦1)þ¼CÏŸ_}ûŸ·%Eë°êIÍr-©=yÄûX GR­†#9…£È…#ɺŒ\yr¦k2šÇ~9E(^õ¨ÚˆÜˆhÅt F÷…?EâÎ`ü-ÍâÕ"Ò\dé¬v7‹T;‡õ!x®xR[IÔä¥T4÷Ô8…ÑÓ0PÉÄ$Î65X+…C˜‘ÀÚÉ$¸]úl÷¶bmu…–ö.5š+WN‚t€.“†ý­FdÕ*»ŠÑçVÃ+%½x.¤H}®¼ÆéÞ5›ÐJ¨ìÉÙãÅ¢wöDþÌÅ_(,î]v.•Ö–Ë(‹Àªðdaˆ^¡+"ϼ¨„­iª 6:&¬‰+<'|Ô(É$]P°®|¼>ž¥»×Q¾úÓ(?δ0|Ë•ßü_šN¾4õ}iÎ1óª/•xÛñV}i¾îKÓÑ—f£/å‹ ™‘o‘™;x›»ÑÔú_o2ºþåÌÔ;<è¾ W½œN”:wðÕf+LþoMë´HÉtú‰€1±fçõ«¶žbe‘üªè´“¬ç/È[¹Í|óǦ»6*âí—¯Êf?¯PõâÉ(€ƒD%xC~ $Dq5¶ýûÏ8ˆEžf¤€$=Ô\›S¬&‰k¯HalêîÉ©*¡cÌU@ó*[-9ÒBïÿ"–„TbgŒðr.¼´oo_sŠƒ-*J‰×ÓítsÝ¢§Ö;þ…FlU óyØÆ/è£ï*ãhÜÒùrWW;û{ \GPE®êÂݨo™Óéç4ÏßÈdžœ¤ý¡Fb2;÷~Î_¾|¹‡\n׋î2`iX”ûËË×÷E]—Í‘/5–W63Ùg‘­!9¢s7ËkU†Z½MÒÔÝîHíFÿø·ÿÅì= endstream endobj 121 0 obj <> stream xÚÕXKo9 ¾ï¯ÐÑ> +ê­cŸ@ØCQßv{píIlÀŽÇ}»?~)iÆ–§3Ö¤é1 Ñ—”DR"%vÇqúCfý8[lÙ³{òÊ1äà¹g³+úw:†Í–O^~žoo75LßÍþ$žÎxZƒ×Ä´ÙªžVRÊÉÕn³ÙM…|Zß\'èÃÍr½¯‡z™ú×ûùíªÑ‡˜)D)%#Œj?¶4š-xGái‚`Td`ËðÌÓœe TÒƒ"=†Ô‰Èú‡£ŠDR0 Þc?ü0ö7Qr‰í~ú_ÎØI3ùÄÐ+àÁÜ—l{”Ç6ì-{“Â+÷ŽŒ ï“lÔý<*®$h‹†}ࣈ£„óu .Ò²”¢e ã€Ë¶Ÿ¯3ga1¨¬”´ÂÙeá,zÃYm×Šìæ’3þ‹,Ú%š¼D{ð‡c¦‹YËšhcT´À¥¨d7k‚í³­]Q¦Â®?-r,QøÄ”ßyðNŒ›z¤ÁÖjå³½1f@ëc_ÿm|ïŒ#Ö¤}¥¤W¡›ñ¬Ý¹y|ž@ÓF¦#þ@0×Ùu·ÀMtÐØ3À|yÎÜe8èœu1´ÀÀžBçÀ–µáø:/Õù‘±ü˜îgŒÞñ¤ä`> stream xÚWYoÛF~ï¯à[©"\s^h_Ú¦ R (Rû­.RšZIl(RáaÅA|çXŠè¤°î1÷|3³ò>xÒ áOz‰‚ÿÐ+ŽÞOwÞÍ+i<)EEÞÝîŠ,öî¶úRa6”*ò÷Õió×ݯÞ/wÞOè,õÎ^”‰ÔC{G/Ö"MÆmåÝzoWÌDNɹ-{{%:3"ËfÑY&Bõ5Ñ3‘]Û¼Ï7N"ÿ_þ°6ZîÛütàe߸¯ýØóê>”¦r„eÍß—o~ûq£¥ÿó-î_Tå‡ÁÞMÕ´e½'‚(¡Á*2b״Ǽ§Ë›W©‡Ö…š)¤¨HD QÞ>ÕÍ©+»1ì¡^°ÈDÈÔ bpTKYƒ½§çùö޾§ç"|÷ú/&–Çwç}îÜqqÈ[Dz«ó£½ß|¿f¼3E¦"ÒdÊKÛmyê˦vôÑÒòHdfI~wÀèF™ß6C_ÖÖñ\¸‡"D"ùü#Fb¾#„€$i4í—(Y ¨b&_@ Tàa²/5˜#¿*&›8^GE§B¥ÎC²¢ã˜ôœ8œ0 gÍd%öÿ±EÏÝi¨Ô·E‰`µ[>}بØÂu:‹9å-d²·íZ”•I„­x½be&b㮩P@KÎr©^ö`œIÂ}ĸ+È(® vQ©„*Ȩë "".± %ý{J3ì|Õ :H¢«*:峨û²Î«ê‰i¶¶+÷5†x>mí©µ­1Nl|¸4›;†‘ Uð‚ˆ‹cY—ǼâÍ#:b[pnózëxò3ûËëSÛ9¨fbFÐUK§òm8#|uLP¦Hàeg«]÷( ڛ㨾#ò U_ž*{íÝîmw“·±iÿ=ÅÜžœp5Úc ÷[@75;þ>b†!AeAeÔ+t”g\ؼ@–£nT½jF…š%î7dôzw3aúåÊKb¡"WY×í-…î}?Ð}B%B3îŸm> ª”Ûʾ_)i%E¬æÏ¢Ò±á9–lmug{>Å0ài?úG,ÕÖÑîø°'Ÿ=kŽËÔÌú·ÍðPÙõî˜JGD$LGÅÙeùÁ…«[X=ØR¿@Š÷/¸?ihrò¢?%Q¸tä2ÊËÚmJõR’ž X%4%ЂÊí¿Ù­:šD¨ï¹ËTâ[%™2Â,§‘0ÓþÙ,ÏT:ú,Ëàä"ÍáÁÖ¦²‘r÷á ö}]ò®Ž\+ÿ¼ÿ,:—ÑàÕB5…ø2޳)8G*”"É® ˜µTô\æÒïúéÑuU‚ì½aÖÀ¥„ŠŸ­Ô™ó‡ø^M®«ñ¹«é¹¨¹;ãwjÞ„h‰½­]35ÆÛ›ÝE'»5ÙH“ ¥.zc½íxJœËþÀ¡€;véïµØ@á‘ûOk wS|K³IŽPÎ3tÑÔÅI7â ÆÉ´\88§`|9yTÌ@µ(A¢Ë;Ç1MÜiÌÐÄä†Òâìï\X Õ:]†%ú^¥ëÛ£n|•rìÝw1£ `~ìä—¯Üp Æ?l?´u÷·”TãüРãÖæ=[b¨ÀF°™2WÀ˜êvC…ehÌÌ:OZÜ8hóɶ â(Îüß¼=—uÜTÄ%·µŽ ÊnÛ¶4õàèjóý3çÉÎÚMÉY3lê¦Xûò§ÊÅ€Q)ŠâžÛÿšŒFê·ßü&5¼Ò endstream endobj 127 0 obj <> stream xÚíX[ÛD~çW˜75SÏ} ¼¥¥E•èîŠUnâlÜ&vj;›®ÄçÌœñ-;Ù¨U«µ'sæÌ9ß¹}Iô>¢Qÿh¤üO¢Å6úþ*zü4¨ \¨èjÛsšÞ—¿Å”ÈÙœR&âgu¶[Ïæ\Ë8+³Í]S4¸ª«}[”y3ûýêEôã*¤"¢”¤Rz"!*í4êtÊøf³ëN½OMtˆdJŒpDm#ʼnÑÝr]F¯ Bþ’ÃŒÓ8ÏÞÝÓžr¢ÓA{ª‰áç´B^û¢Úî¬ï"þ!¸N¨(—œÍ_À†ÄÚ°¹CÙEU–ù¢Í½œWBãªÌK+Ú6(W­PàÆnxüÔD6$IjÍ™{{˜$Ò8{.ïÊjgã1‰¡šPÍ x¢(ÛÙ\b^ÀÈ×Öœk·Ä{ÝîWÏáK/ûºÜo¯gß„ìò—PC$w·<É›E]ìÚ¢*½¼Û$I*ÆâWë<ç¼Ë(fâˆJHÂ!¡¬üÄöÀÚxAYŒPƒú1Dðr˜1݇Öã¹¥ 3"u!â CÄEÜv7(—/ {QwÞ!IœesÊ ¡ìž»‚Šx—ÕÙ6oó:ä°V¹Þ ~ÀQÎ U^ÆY¢{K{…­X|Vð!oòÖ¯VølÑÌã|³<Úµžßyµ!©Šîl´™rßBF‰¦½ºÝßzë¢P·ùÜXfm†;o6•Ãua%ÞA. öTˆ(ÂBÈ[§¶ê×…“´mJq5ä,DÜ´Uma±ï^BÄ.º€-ü}7*07\¤á™ác’0jš0J¦s«¬(‹ò¦³.kñÔà?"Ÿ¯B0'cWÇ©@é8aÚ#ým¨ê ÿ2¿Ÿ<Â<-«SùŽé@§ÁÈê®,ªKŸë ”¼_ÙIz¢¢`Ñ$t—C¶lâØgV¿)Ú:«ïpYÕK-x]ÕÕß(ªõ¹r„$ƒ>اc¹£$ºŠ² AVÖ`IH×DË• Û¯}ò7h_Û!ÒVm¶9éº÷på3^ ;‚FiàñÔGŠÇ«j_.}xo“Û”0Û¬»æÈD°°™mYGž©i uXP¦˜øm(/Ù¡ôk@•±s·ß†ZÜÐöIpöHI´çÜEÞîë²ù[ƒ``k~.ä(8fEq>j;ÆE\cÄA¦0GñUýrñ%R.¦bXϹØyÎeO(6.¿>úF÷4m]A;VOJ駉$J½`,æo託|z¡H¼ä§#^½=yA!)¿Ï½ÐÒÿ*ûY¸Â¤CÉøëø—Çé£ÙWWüaö%¦ìK¤6dŸÙ׿ľl§rÑãCS…EϾàÝKèƒÏF~…Ϭ;ܧ ˆŽÓÅZ"/(6å^vÜ Þngî:ä^BÐÏÜë3÷úGÜKë{s‚{ ’ÈóÜK¡^RO¨—É ê% ŸˆzÍ% ÈŸ*[5K[ò[÷·vîj­ÖátÖ:Äx°*aoy{-»ºò­½Æ>h?V]ù:¨kßàÂp3OîÛŸ9õ«å:a$éPºE#5`ôecnÇéiåÀ¤¯ghˆ+©ñó£òÃt¯e1áG—v&‡'ƒÝçHÐmA˜8òzz­«ï£¢Ð eÐÆQÏûV~$¶ëj³l‚_X ßYèÿò‹Â1adòè©‹|}¶\äÆsè\¤ñ¥>Ù[zc"~á?üÙ?/òµDÉãï67U]´ë-¶,ÉÒ¯aôBYÿ‚ëšð¾ÍlÖ['„±£Äi™2ü¬­‹¬¼Ùo²×жÝMˆ^¢Ž«™aq•ô©eÿ]ç@¿úÆñ2k׎ ˆø²Z¹¾sðkѵšjs=ó£&§lúelšàÆêž+ ³Ùÿ®:éW_ü ›äP endstream endobj 132 0 obj <> stream xÚå[[o·~ï¯X¸"5Ñxx'ãÔ( $Fû¤õ›e8ª´²^í*ÒÊŽ[ä¿÷çð2;‡+ùÒ§ÂA´ü¾oH/燜ů ±áŸX8 ÿ‹ó«Å_Ÿ/ÿèbÂÏ/>‰ »x~ñâè‡ßή®×Ëã—Ïÿ2ÓÈ„‚©ŒJÒço–Ç'Ò«£Ëíz½=–îèýjó¡ë›í뛳+LÜ,Ï.nãO}t†p×o¹¼Ù’ì ëõÙjƒÈnùÛÁÓQè5÷ UN¨¦vÒƒ ð.±f)ûaÏ_ÈÁÒ}Mo.ðG,eSªº^#ºÚr»»Ùn^¯?¤\O”vƒóÐ *f³;ßn6ËóÝrSJAòê:>x´Ý,7±yv·Czô‡çØ Â/<´»¥N0ð)£?®6çë» x_#õÑ÷·»‹‹ååðæizzÒ]såjû@ázõ¯‡(_¯¯ß6:)† ’n÷áz ÕB4ÍÝù.þ6GÿÁ?« ¥7wWOð×ïøçÝ«‹³ÝÙ“6K‰EC~« •ünyýzôîô;…ø(¦ÿtzœ Óã“§…äñº‚aêíê¢Êê[C¥¥¼î+©ŒgXMé©[}y»Õ·ô–çOæ¹>CîÏø'æ}“a·Ä"NnWÿ^n/ókS^ãéñ$3^ññ8•òÃÏHý¨ ÷G{Ïa%6ç³ZàH~GhÍg{yy»ÜÕê|[º/¶,“ñõ ´Èí•ðÕÅééæQiöÙËíMîÕÕäaAc…Ðï ~vòtó.Sß|C](ôV€­ÒÝÕ‹¯.^b×sõÊý–‡ðîÅêeLé±Î'³bó],×ËÚ‰ÏØ¼Yîîn6ÔŸ”ÙlýΨ±µ±»D[²‹¶6þȆ0þf ¡õñfíZ)˜'·‘¹T½oá#—2ÿ.å¬äàÁJ7H¬µ ÁáxU Tf€’åàpZ>ÎQ%#Õçq¶’¿.&ñ=ô³ÀZž(˜×rqµ6 ^æôzñÏÅÏhR'ËA½¢Fe[ ¿x½<”oj½äèî©—„ŸÞM*¦¾tŤƒ’MÅ´‰cn^±¶D ®,j<862†Ñæ”[èiÑm.W%-mô½6Ñ>­.š6ÑL›@kÀd´*vþ'׆¾um3p°†BéT¸²Ð{Ø:¦WC/3á§µûi>œ”tl+˜Ä>ó ® ôZ3ËÔìD†ÁJ¬`ÔlTmÛŸ°J¢‚Ü×jmžûŸµZîÐĢj¾ßlð×=¯T.s"̹¿ ­Œ«ÔøÿSseÑ—zv¦Û{O+’§ Ÿ38Ø,ÕÚAzö&%T}†•+åNs¼ÏØÔžœ–ƒ²u¾|dÕŒƒ_mÕÀU¨{kæ5v^­™¹ªAó~rÍ‚Ÿv–’2zšû:ˇ8»N´ÔƒµŸn}§Ù\U`gz £$ÔÍO†[e˜4ñ£µüä*5¦­aÖPÀp¨ÀRXÜÆ É×Ð|¶©+u+À¬n“¾+ÓþŠ©fÊuŒ;ÑØ²ƒ°ˆ¨L¨ÞCUBÍÿµv¯ãCZ*ÚØŽ“5ÓŠ1±&ua^ÊÄž×6™ °ç¹ö?±Z’Üø0rÙ@r_Fîˆ5.É]²)Ìä.MÞ454Éu¹"6gî\N3b›ITûa¬#ÄzMrU™vlÄAr[Fn,±¹2¡ŒÜ'ŒVÆHfòg_b©MI3bIGj_Fö#±2:KPQ}9°cfÉu¹"¯KqÌà֫ӛ }¬#î<±Žäª3¹H»ðÈEr[Fn2H*ÀÈ=±_UÆÌÀL.Óª+²NÜT€‘ëÌZ’û 0rG,î'Œ*Åù¹v̬'y´k0rElP$w`ä6³˜»Æ 0òXK“äª39¬œ2HnE¹!VäÜC¹Ï,æã¼3¹‰»…ÄJMrSF®3›s÷%ͨ’ ó†*”ôLl‰ $Õ%=— I­HìJšSÎÚ“8„0jO,M9GÎ˲SΑó²ä^0`äšX+Hî+Àȵ.®¡Œ'ç•€™Ü“ó²è ­Kš«LjR» 0r›YlÆP óœX“YEòPFî3›šÑ r[ ˜ÉEÜ+!kIn*ÀÈufɳÛòŽ“g·…Ëm'‹Ûb–ÛÀŽûr}P®2Hî*ÀÈ-±¨VÅk±â`¦bÕ«â²p €­#7ûòpPî3‹ãE—˜ñ¢‹Ë*rsP®÷åþ ÜeG£©Å1£1mó§òì³x¹R{rwPn§r[<$/ûru@n‹Ó¢–±Åiq-c‹Ó*òpPî§r×7“§•X;f\-Npòì´ŠÜ‹Còì¶p´ûⵘÑî) \ÅúX‰Éõ¥(Ïʧ ôg¿ÂTš='†ÂÄl…á€Õ‚mÂÄ$†â·8“ŠßBƒëÇâ·ƒ lö[hÎСkÎU¡u¸ÐuÀÚк"/ªãœ<´n.žàtÝ\¼ 0q¡Ø¾ ÖøÖA|×Aë}ëþ½,~‹qÿÀf¿…‹ Œë..€Í~ —.x×]ºë\³*òª–6+ ÇæÕÚv\Àf¯…+9œí.å€Í^ W‰^'É,Al»¹²Ýh<³ÍâÒÙqYNœý.œ¦»p6û-\–{SÜ$³,V˜vÑ€1ÝE?°Ùoá–¯»[ `³ß ‹·Åo1o‹ßÂíZw·CÞR86o¶¼­Å)NnÛœwÍÆŽ‡É&Ôª¿IôŽ‚±y €íoA½£`lÞàzW‹œ<{-Ü>{_¼³}6{-Üœ`dws¬–íÖ/»[`l >·Å€Í~ ÃhÑ [›=Eâ1®èE€µ¢ ¹„±7²• ¢ è„1»/&ž¤lƒEîÇŠ€4m Ò¡‡Ò·A® Ùq)šð$sT2pZÚÐ.tCsÀÚÐþ‚$?Éþ@žƒ±è‹@®B7¬lÆbÐÛZkÚ€(¤C7 $9®l Šü$l ª†bÉï†rͱX Ã’L XçÚ0tÐ乨04°£kƒÜh× r«\@º§ÙÜí$8¯_ØntäÁ¶a+Ûû+m{¤€µÝ3`s8VæÜƒíXëM{,9/ö8XaÚÌ鶫M{”€7Ý£`iŠ‚+Å1EÀŽº=†@ëî1Tpå,·EÁ‘ób¹‚+g‰¸ð¾çÙÜóY"MlOî‹= VNŽÿ°ýã¿àÛ³D”‡þá"°^µG—!:º6Ÿ%âÁ(FvFÍg‰4ù¹/öØØ|–˜uå8’·äu#›ÏÓ‘q´ìG6]¦é ûâ¤#kEsÜ-GAî‹;îŽò šÃô(W¢w˜Y)š£úXÑ;ª¬õ@L‡Î-€Èùæ‚å {÷ ")šË 1mzw"©›‹1í{÷""Ù^º£"÷Å]ºˆêš+Q®BïJGdóE˜¬¶¡s]$’&4WQ"Bï*Jd}{ÑEŽšÜwÑ%²¢½FÓ½FYí›K:ðÝK:‘Í·nhКRœê^L“£'sX/¦)ö¨Œ¦þ“ïóé<‹*g pøÊ9]_ûø qùùr›p’_÷*£ÀդȟÖ|ä ÊxaR·ï:Éðž»m?höÂq\0~¹ûÆ1º™Þ& á@Tª/÷ø´tZÅæ4^ϦûþŸ8 óåÖÒ5ùrëá¾A`S#}Ù–?¶)_1ÆÄönw}·ÃßWgÇÒ}À/aÖ[üÊï-rëÕÛø¥ eQ¿œ¹ýîÐÇÚ…ÜáÿXž]¤Ïlâ§KÍ·hø¥düõKù²çëa˜ÏÎòCúèÍÙ-}Weê÷N«ó%¡éÓÇøCÜœßÎ3Ts[¯6ùÉ÷Ë›%þŠß¤õ¾:+ß^iFqwõBL¿ÐR¼J>H¥¤ÒS•äUæAyÙ*STîAyù©ÂT%:­:>L&&Ûk~=Ç'}2 Ö¥ðušâå‚õÏø/- B endstream endobj 135 0 obj <> stream xÚ½XëÔ6ÿÞ¿"¡fË­Çy8:ŽUáD¿T”ûÆ"ï]J6Y’Ü(ÿ{g@ªTíJIìyþfž³,š“_\)p^Æ~×^<Êð,DEµ x¤JB eµÖV®y° †§`˜Fè BÎô¬•ˆGþ>ïòTçÂ%M ‹³:F@„`<14öö¨R°¡g ƒ¢WƒùÚÒs Kb_³ÔåÁ,‚ôшu™Èe̸µêØÂ³”äö¨ÕFAÝÑD™9ͼ«[Ê)ÞCÊFãKh "43´o¯*M I.x`bÈÃ1íàƒûýÐv:Ú0a(8šXµA1€5è~GŽwÄ‘÷}uÙ¨’¡-©ÿbë$„â'Ž q>ZÈ‚È=q-#(˜³àÕ' ¨ŒÉ=y”wÆù¦fŽ—”Œë0ƒ¢˜/Ò4=\0B²Ré‚E¯˜ÚvíŽÞ81™08Í%ÍBã* “¦Ñg)!ª Å `ÆÄW$Á[’Úœ3žPÀÁÈ¡¨fË{b T¿¥Lá…¸Ù:‡ú1Îó’Vz¼ _Ç“êT«ÆÔ5*Š!‰óž˜˽ïZ[îhM’á*ˆŠ Q*£ÈPä]Aãß…c˜¥, -R†"™d,°Ó?:ƒšLµûoG$ <ØDÞ¬È]æÎ™æ„nŒcEÛ”Õ¬É,”BóM±ÌpvWÇ2Îæ€ˆ…Ñû‹òÊÒd2ßÁŸbe· ê’¼ÇMÉýMKî2œ)’Ì¿j벇jÇ‘ÿj¬ý”Û_ä½séð@°ÈÆä?À¶xn,Àr†Ìȸʛž^)‡ÑŸY%vÙLf_Qš²4[¬ùÀ@mk7 çföxõŸ˜þE,‘óü2E~Ý㺦‡ !lúâ«Ù¯åÁq΂±ðµ®& µ8³ˆ› snÇ„@Ìk÷Ÿj¸îšþ{öb/°¨e¶tÁ‹µ<“„ M»Ì›räè”eÆëz!é¨Nf Ô0¢qyGL5FÓ’ÌY‰{lú\LJ¾²…\[g§í×77’ãrë „PVBÿ“êZìð÷ÿ@·o«^a7 ó–HÈ x±ø…‚ð mË…¤aY¦ý0-álJ:+Éfíc¤ ×] Òî}8šÐv(ÑÛ!øƒ!}“´d'¼Ì£"„«-©ò„2¾bJ#Q·AòI«¹¤bZ’ÿK´R¬4!ôåÀ¹€Dá†Y¯ ñÙ]¾Û×êû3iþ×°=ŒnÇthH‡Íw*/{zÍi»`Ï~Än6LfÚ{Ó¾º¢ºˆwäµQø—+éELÛDÚ† w®d9:Kt?Åzi£êƒSš`OQæl#à,œeóÄ›ŽWÓñ >lJVCOI3ÏM¶<Í.ï-„Ô±Dñ«¦¨¯KEw Oú¡,Õ–]=_JÄ÷PVíá}"ëêÝ÷PBy?£ƒÓLÒuÃǽ³ˆ¬ºë§?¯!óOéí‹=oã1çôXäC§‹мÑpãß`^#Û~Äjò›•Ú¬ÖOq>WÇ2‘¿ƒê¶*'² ÈϸØêè²€Ì %•ž¥Ñ»ÊÜ&Ípz æ9MžM÷¬A‘ŽßWŸT»µ~mVFX`o#ÂW–e¶ÆÜàä+¬­g®ë+¥Ýnát<s2FuˆÝÆ}ò‡ò•›Mó`ÂÅÉ­K(…µZps“,fô‰>_?mnìÔãÇ&†ª™p…×uÊåuÝÂ08›g àæuõ³iv´>Ҁ蕪VSÏŒg]ÕÄÓ;J£/‹Š°ì [ù:ISÜöé[Di©_þð/ó—\6 endstream endobj 138 0 obj <> stream xÚÝZÝoÛF ß_¡=ÕÙ «xßW EQ`+¶·nyk 4Kœ6hl§ŽÓv@±¿}ä}È’|’ÙéÒ¡"S¿ãñx<’GªøX@Qá?( ÇÿUq6+žŸUTÌU®8¹À×%ýÐÅÉù«ÉoG¥b²z? ¯+WñùíÑ›“ßq4ˆÆpU1Î0Ç‹R(&M1+À Æ]ú}UüY¼ÜT$X͸Eeà<_žK X|¬Xà$ ¬åâ¼b«9!ç‚Ò4sÆ3~]q50oã5.¤~]3ªLSù9îÓ‰ rÄ÷0ú,PÛîоræ‚щ^£+¹bÍ»ÿcnëÓ®,œ¶çA2¤Ò¸ì9ïÙ$¶UPJŸBdÅT°N٫µhá¸W eRÃ׆Èe-Þ׆Ìe½¼.Vd±r$¶­ »ŒnÈ00ªG‚¼á…¸¶L ¶ñ$'„žù„Ÿ=¾‘;Í .ǃ0¥ÎIÈ¡ähÊ5SNaÀš‰v¿á¦e¦Íõ•Ê{o%˜ÔÑÓ‚tÄñuKûÎ1)k>« F2à}`c)ÒKV…¹MF@n)°Ž4‹3¡&M@T5¡/jb³²%™=´dÀÌkѤ£ÍÚ&šâÉ›¢¹ž³¤ ]΋Ù^䬳T€d2mz8HG9^}‹âMnïĪc,˜¤¨‚r£d=Ø‘§y?¢(‘KÇôŸtÀÁS+³Õ `íH¾íu‚ó'N15*™ÔÓ²y*¬Ÿ™SÑšÔe›Í|²˜·èÕ/ª7ÄágiÁø[ÐYÈÅÎÄ­Ã;‘ÉGt,!{‚*£gã5Öù _”ª¡f®dt+CjæJ“`¥©ïfz`ZÓ²ô»ÉÓa™•HÆÉK3ë:T‘¥òªÝ›ƒ»'ÉÆrè\Z]Hlbš¹k¦Ð”Nî•TzG! æQºžr‰¯ã[Q;9eÅ*Ûé×ÅàÝvÌ9R’&êc"´ô¹îpŒÚø<¹£AÄ›“õ¤Rà eyø y<ÜÍÉ'c˜ôPm"úÒaŒM‚<-ZO¼¶A.M‡Ê³GA¶¯5édÞÉ`^—ÉöµõÔ‘Ç•å¨27>Ý›Ánb†ÁÃRA{û1º‹ïœLP7m“âÉÃÄ»œsmÃÔ=QÐ}-Æ€ƒÅ&á­Õ©,µ‹•wÀª½±ò@|·¯bÓ „vŒ[Eb]à j¿:hµ_m‚‰á"¾Â+Yº._/ï–§³ðcq»º¾]…çÙéד¿C%÷jq„c'‹áÝÕåªôFëÊïÍ“´/&ÃW«SÉš²ÐàÕÿ˜žžû2±â2”‰éQM.–‹Yxz[W¦1Æ<ÛVÕûE$'ïOoÂ\­ÿûiº\]žM#õt~¸ˆ„åÙÍ&C.·«Ëyùyºœ†§%Ê»9äl¾ cŽªÚ„Ìog¯àM eó(ÞF¹&JÕ(ÑFAÏ”² “y”ê0ƒ2]ŸOä7ðN¿„ß¾ct;;BF!;tKÄOáxÈcM*ŽæêHèò=ö*WUTX(¥ôwÝŠ„-!)5¶·Ž´_‰+v†jÑ8Ȧ¬½Í¡Ê—:”P ô~Í!Œ ’м„ú)5/0Ê×Í‹5QÕ­ï˜ÃÁÃv’9M½:¼ýØþÒ†ðEãÃ×Ü}IŘÖ)Ìã*;ÀnW(\£]òÌÙë_EéÑ3¦Vh²µBåe”;Qå=`³µ K}²þbÆ>øÔ’F“OAd-e˜‰Ð{åM‘Æ¥"H¾¸ð[ꦵícÒÆ¦k †Xê$Œo …[ô峚 -g½”5ð6áà±)†MU9rW3ßóñQ'z;CÂ_¢ñƒ‹&ð MÑPµh›hJ†ÊûZ4‘ïgŠ=;CôåFíä1öVí>ˆÜ Cžà±Ö° ŸÃ ¸_‰ºù  m‘fÁ?§ðgyὫN © Ò ÞÁÆBLæÜa„¼«žEŸªG5|„¯:®=¦¯›ÆÞnøD”ЩcóºzÐ= Ý£]úº#j÷¸±ìZÇ %eˆ » ß v¢Ž¤õG3¹â«6±3´O>^ë:u}†uÍÑýH †ÔŠƒÑ¥5ˆçÅßãšå'žê÷kªÎRVìÄá.T½7‡!¾Ûåí´5¸×¶J×2ωÈR\*Üê«!Ö!K”» añ›ZP†zÛ$b|oÇ£¶> B#a[”¥J¥µíÜ$~ƲVkgðk–}>µTÒkg}¡Ž„¾lŒoª+©è €F?*ÓÙ‘éìð‡Ù-Ù‡Á·œëûlíÜÆ¯Z[Œ3^µšÆ©z¿wد»cîÐÝ‘¼csØnTÖFwwü]omɱÚAíXv`ZÝ–v³ÚR©©ÔƤ%À%ôËþVèðý endstream endobj 142 0 obj <> stream xÚÅYÝoÛFï_¡G ˆ¶Üo²iH‹Ë]×¢Œ¾Ô}`äµÄD"’Š›þõÙY’Kye'í&÷ƒóý›™]¯Þ¯ø*‡¾²~óÕö¸úöfõåk±93F®nîaySâ`us÷köݾ: ®[o¤1™XÿvóØmWB1[ذ[àô»tÃZæÙÃZò¬Å·î~©³ö4ÔÇúj¨Ûglöê§ïé¥kÏCݸÞÓþç ÉS®¸bR™ÀA䳌¯7œ •ýP7õ™œ@ɪlÛö¾éì6çº%IüÊ©kßÜqÁ‚«ç¬Ôzä!-ŒF‹Î¾­¶¨Í»ÈÙÜèÏY™—ø)׬Tð¹fºð_ßì]ØÆóhŸLÜqDÉQj”·kg^ryÉð]€Ô~i’ü‚¯,˜,ÅÛì‡ï^ÿt»†¹ÊêŸ2ë‡jpw4Wõô¼o‡v-löгõÆ:û¯hiØ»ÎÑ—oÖQdŽæwõüÀ5´VÑì]ݹ-’GÑ6ÜZf<%ÓdÄ]Wö`~m@:rr¥™xúüi»w x°5̃ ÿ•2`¹ ëßaެ’” 㣩~Yo´Î^‚{1 TE>uýCTdÞ0 ºJ²\Nt“š‘/:U¯ða³­Ž/í=̓M溡Þ:¿¢8kZï‡;×YÀúS.5 XZ™xgfõ6"I„c(/Õ¹ !ˉF~F^ü-“4‰*%€¡‰ƒªê¶¶J) [)%D4¦'©2P…x ôL¶KK)YÉG1ªLi´œV3gÏ8^ëV(Ó+”ÛÃÊxXáZE³ïÏUƒÓC )²IæKJÈ¿ ; ?ZœÅ°Do¼Ãcýb-Ëâ¸c_¡á>ÔÍŽd‘ɤs¶˜ÖŽ®j`ð¹HɸfÓÛ}Jä’™§./(¦"‰ÿ‘2:gzôiŽpÉKÔ¤I¸Wš9’ߦ¸EÀþt/8`ržv¼Mˆ "¨9¦ÖDáà%jNûóétø˜ &+ÆTY DíIÈ’åú ‚ÌŽô‚)öõ„¯\dý¾Å8}èi¸ŸÒ;p>b [^?Z$ØznêÁU©KÖJ^X&ÇxÙ¹ÍA/‡TVú‘”úöŠúX`™°qnIÃdNxP¨^FÝû3`Wƒøˆ.0ñ>)¤7 Äyå¡kzŒ§¹îX÷ˆÜ°‡Þb·§Á“NZÎñyï»öH$¡Áêë;w»~0«$¯g!‹)Ž6.0[Š__)á2Ƭ)®bÖbSúÿÆl¹(^†§1‹Ýô¿wîX%;G•3«ã jO­Š<ò ˜SƘ5ù³0œ1 œ#ÌÂRÀ¬¡Õ|Â,tC×0[BÍÚÚTk5ÇçBãâ/j¼QúE0VWpª¯àôà*ÔðQÙ“S³€©ø˜ªsËS0 5´W0 ùÙª§AÊÿ^'ÎóßPêôHÔ2FâÒ-%ý§ôÓ6†‰*¯Âd2„?ìTMßïëÓÑ5©ð±sÓ5á$Hê£IEÊø€WEð(Ì/j,ŒbmÛ¦woî<-‘ÕÌaYBlº»7œÎ©Uó‰§PØBF‘×P#*}ô3¿+g/N]kuèÛ'ûWhuÓÏY1•º„‘ VÌG"aíµ#‘ž“OíOC&™ñ@=;Ö‰¤içP®S~•nÚ qÙ)ËD§lC§,g˜&ºS© µ–:i‹tíú¯’]7–ÿ¨ƒH2ab½MF<ì™¶„üZz<Ç5›Æíª!(‚u ”©pݬ8 ñ®Ák1&ˆIéEf¾LK4þ³´Ó…)çƒð§{ýeÒv¢”xȉlw~l;ƒ§Ò¿d»àlhx)º80FûÈ`õÈ>„ôËî*ØG^³O®±š|®}‚Èq±Çø<—È}–G8öýí–ŽÁþB¨:ùŽw[©n_ÃahoÚ9P³YÁcçlSÕÁŠOp޽Ø£g6ØÐT¸ƒÃŠvÿ?t /‹¹¹{Î1br ÅÎËVÅÆ¸ñBùt3Nƒ§©Â_Æ)gEÜõIg|Œœß“8Ï™R¡ŠÚåÙ>ÀÞQâè>ÒÌ"z+£È£B­ :¬‹Ð´eÖC&êï?.>åYü¹­QñùfOQ'2”æÕÓnå/D ^ƲŠg¤ñÎ×øÙ¡«jJË=MRDz™/½^ÐmîDÞߛָ fC;TáÛEŒyŽX‰7Z™ìßT[‡¨Z+5I¬G‰…-/$ƹ ,Ðô˜;v?Ä둞^‡½ßjKÕO‘¨b(/*’utíN83ìë>âQO.D®ù¾Ü¿4ÛöˆGº©éÖ  p:œý[ _•‚_Fyi±Û"ípxDÏþ²¶Ï·Ä°Í6ª†óˆŸ 6®ÅåK±E޼‹À»˜µÆ5Ôú‘¡‰Þµ¡AkŸ§¼ÖQU㡌6ã"¥l5s~ÔÅ4_…âä~¯Ž§ƒ»’ð|¸zƒ©"ŒÉQ]äB¥!©¦ÂчóY`Ö†çëzÇè³Å4'-A±–ôÏ‘»þâO³ûb¦ endstream endobj 149 0 obj <> stream xÚí[ë·ÿÞ¿b?Á^q¢—ïÝ^óÁmš AS7ð¡(Ð3 Y§óÉÕI²~ýã;Ã!wI-õ¸“Ü~1b@Kr–3œùÍ‹{)Þ¼¨à?^XÿªbôPüéºxö‡!klq}WðŠ³º.\3)ŠëÛ•¢ºxuý3PÁ kŒD2Å ÃGsSq¨xG…̶—e·Ì*]hÆeKó ×E¼s2]oσøÄfMÕ঺a•†;º¦;¢f¢2CŒE @a[;-€Œu!˜u­TG!™ÑþtW™ Ö/óÜë–I~Üëß|¹.ÞL‚T nkÆÑFphS<€´S*Œ§ÅËâW²kl1!L ÀmŸí1׳GÁ%³ªãm±K4h*&HÕ¬VgÐbsÒÛßÈŒ+§D¥P·vÌk4Í%"0€RB~Ž5íÒ±ÖU¢ÍÕBÔ¬AÔ™›#-3:pÎY ¤dZ$ð"¸Åiàæ}¨IÕÅ öZÄQœfŽh Ïq˱ìZ1‡}ÁŒ8Gp¨OÓ_Õ?‘Ÿq÷F†ºaµ8!8XË´‰˜&ûíDt#X͇èzg¨Æ|¥ø "ž­M0HˆS¼éT‡g„,)M;¢_(ŸPÞ­ìÖ¤ÎM:ÊúåV’¶ÎÂ2Nvýv]¿Í n¨€‡2O’fÿ ëDîñIJçú•8|w¯igpVugÍ`Ã8­Ð1ÞGZ´º;×l ˆ•øWõN| Z€œ"e}„ìi&3‚ª:K•&ä²­Êùý ®’¥ü_ùýqÒĶüž«†é¦¯?ÖéMPNñ#R‚9ζö´Ò3“¢2 [L˜~ ÉZËYÚXë$»t¬M*ÛUôÔÖŸ\Ô®NRhý¥ª€LD§’ÛÅ ¥òw~±G›/v2…&Xèˆi¯\M .µAìé;µŽ@Þd||€ @WÀOnÀíyðo šSÛ„«/Ü„ sî:;4áµd*êÁÝp_ îžÞ{vÝV‡:ÆÚ„–ÃVйhª$vðv;KÃÃÏÑ0nçY†mbÈv´…t9@bD=<)ܤ8šRÍH$§J<B€© ˆ’Râ«=€x•9v•¨Lº˜ IOö…I~åžÉƒ¯§ÓÁ‚@žãîGèÓ0£¿ÖÝ笻³*!°T;ݸê´bÀæ/@B˜漢QÙ_W<50[—A[Žñn‡î>›í—ooõiWr—›é¯nvœ›uÆïRHâ@ÜKm]”(ï‹‘I"ƒ$RÃÄQjöcœzÓéÅ€‹òjsÕ—…ƒ‘e0rwÅ/´:êWIBá ´d†Js.éÓ‘ŸØyÏαèT÷Jnüg¬–oºã.ÏäV±/ž*¨wÔ‘ }tf x º 2 8NK²Ú,ÓÏŒj‰ßÙDȦ‡O™VðÑÚPeîHæ0€|ÑŸƒ#nMöjFV9À×vÏÑë–¶·áx¦–æXD¦Šf8¹ïÿŤƬd¤—ÛñÃpvë uâpvøiB[õÃä-»H)K¿JéòùŒÆãOÇÅtLƒùþªr}ï'&³ÉÃ…°åæ'D9š¯ÖD­—žãÒGZY,ço¦ãFǤ‚OSV¸~ú–´8z‰ß\@ÇYúÝfÃõf9œªÝðn¾„½M¹™×ã[Úe¸¢5(DÓ)±™ÌÞÍ_ÿNKžãÜ!0m×JûªÚ‰>ùmœ½5‚£b°„T£Éˆ¿eL[Õ/ß¼èÄó™jpì÷Ï~ `Úsšõ`¹)ûÐv%7ñ™\½ëoÒ`á»ò‹ðº‰^¡VäÜÆ„Pû<§‰KZl›(ok+bÇ{—ÛÆbMÐÒ|êïb0!dvIô …Ô-ÑMÉýy²μÒ}‹¤ðÐÒº|7­=dæ9#YÁw±Ç1’Ùc$y’Z?ÍH62Ò>õÊT½&Ú¥Á¯f-ÉMUUYPAm÷è Ë×CújOüî‚—W“þ>uWg>IgúÀÎëLE:{p²m^ITR¡$-áwو±q'yÞäœÈÄ×sY.*áÁ‘` ñ2Ç/*ƒ&kb•4\{Õ±ó)èà\ç)T¿ü<›/V“Uj'™V,x-¡³i¨÷›Ì@lM†zç{í~ãfÞ.‡‹{"øý—ôоòáõò~µ=9|=ìOކ‹K'‡.¿Ct¥WLŒý»£ùlåçG÷Ã¥—án6|ß\\åÔÁ!¹¢®-¿¯FËÉb=™Ï²Ç~-"§ªW×år¾YOfmåkÐT]Q¸­² ŒR;’®ˆÁ:pJëk˜ð8‚§¤¾†q‡#xÁÓÝrîæšÒO¬ÇŸº”k`qBpK…T§~@`tÕ5á:ƒ*âU¹.Áëñ2§$èˆÛjèÇœVºåÕ[ŽG”vŒúáÜë<þðqÞÕ{—8c°às+ï'#<Á=‰Ö¾Üi ^cðt?Dâ¾/Á7üF]³ƒÕz¾ßb&mù·ùšà0hú›¿Vë{ðNèÒÚ^8¦ ´¸ëZp@(å6œm–Ëñ ¥q;`w5Æh“u˜Ä>/yÍ+RŒ/‚q¼Ÿ¶žc£¸c¯…/—ÃöX¸öq²ö¯ã–xª*>Ðôƒ‡¡ßíêƒD¦ôxbßhòÊb°êJȃ€’a+u2ܤÀŠ/BU  X¸ž~ç0)Wcô¡¨¡ã®±Uãé­§½£É5Zé³kNDn!ßzö·ó /'£Åo¡>·Ï¾iÀNà¿8±°ò:`k1$EŒýº½†uͳƒ÷*_ú@an¨eÕÎZV⪖â2i饿Ùzæ¯Dœ4.Àµ‡Ó͘0ºËêXLâ}¤TtAýÇ\ÜJ»ê2ÑQ$‰:ñ׳¹o2CT ÕW¯ì¶á¬*qΦ €._æT(ñiWDgUÅpv£;Z¥h-œq–Våp®!†„sͬŽàœð.Gôà¬õp¬xÓáXYJ6Y‹&بŠqÌà¸M¾hKôÎ{Kâï᥿˜r™dIBR˜oØœRK÷NEjÁ•.¿3Šó;0o5꣖æÕ£0ÿ¸cTμµj¼!ˆ¬{F¾nx¤_@ÉøÕ/úE°£à‘_Àì~¿àû{[»KÚò ÓÝU\&™ š¢…Ï¿K'hÞ)bÉÉ)O‹^ ¸ÉÐ.†£ YêæÂ9OµÃy„Iœ§CÔ¶óðG9è*'dN_‰ZóÐé-RÊ7 ¾¤öç”·=ä9[Ÿöœùf`©v»òpüF’%çÀ_2…\'Y=ì:ÿÞé°ï´BRÌ;Æ„ÛÖF6ã;²æ‘ï¸KϾS…o'•Ž|û|Çvâí»,—‡sJç;mÓ¼ƒç 6³Éš¦|OON×ðÛR“Bªpë¤Ë&€²]ÙDáGÎ PR°ìPÅc‡ˆÐIë€^ô Wôp?¡·þ ì40Ö†¿íÿîóëïþ È 7 endstream endobj 154 0 obj <> stream xÚ¥XYsÜ6~ϯ`ü²œ”" žvíƒ×qTJ²9,½eR^ˆÄ̰ÂË$G²¼µÿ}»Ñ ’cÑÑV¶¬ò`ŸèF÷8ßñàŸï$üyN^;ÿ¸u.¿‹ß™—9·{ÇD:[\ˆÛâ7÷ö¨7Û0ˆÝ|ÿU¯òQ÷¸¹ÃØ—Íaóûí÷ Å—K1^(ü”¡ˆ}£jÍTK]RŠ cš¡ÛlƒÄÕy¹óüP¨ qGRž¸F‚µ{úUdÕ¨?Ž´€|-ýÞÐÔez­ Z.±Ù&àÀνÞ¦i)f²{ëGRÈ~¥ˆ"c0Y$³ÈÕM1Ðè¡42âp0œ@`ü‘&ÿZÝ*ˆ4åm‡O+å'·õ· °Í÷f Ö`—lˆ†S­ ¶¥¥ßi3p’·u×ëaÐË+öáXR¤qº¹ôg.õíi,›ic<á%Ë)ô$­‘Ò-GúÝíZT"C–…Kž=¾» {.¼ö@j*"i¤¾Óã©o†µÍáŒH1¤2ôYI¸mGž÷j,°ö°ÁBC‚”ç`ïþT]àB8³Z_iÂ6˜É'Ý·Eaœ¹?yÿPš¹¿@ÒÁé@5ã@)Ö­û¾íi©µê0í%y2m¥j Ú¦Y3Lš¶Ù’ögöìíGUw {KgÝOŽvl‰)üÐP.4ì]„x²Oùh8½e5ø7ìd ß/¿AºÈ½×=œ@jT4º«Úü~si„©ÎÊŠb)S§=Ýa*#c^=ÕoÙ¶Oþ‡ ¿fLœ/²à¯»§úüÿ÷-~â[Õ>\Ð(WµÃøWVOöÍ÷²‰¢Ve³sïÛ²àc¶êò¡êÞzÕÙ·«WëαØsrÅÞ+úøwúA¡9ÔÝQ“ì;”Ÿt»ßqœvöÞ.+^ÞmVdƒÆ'Ò±¨¿¯Ë·oç^±¸v¿ô8빘r 5¢`ú“\ ŸYÔÌb¨&#WIL ­Tïh,µ"_ æˆ ðà…õyûĶrOÔ»y ¾æ=ð ¦´-Öy­­?Ë£gÊÈ·×ÿ|½‘¾ûæêO¸`kY㩦ôG¡)ç-~z /]ßBÒ2éîÛ¾V£­F„DÞ]ñ ?p}h"²ÂLÄ™¼™HÈVæFÆÃñKè"ˆf#“€ü€rlü€yÙt§‘†SÅe,³‰D€Ó®R¦5ÂÊë›7צ“\Ó'Â3?´ƒ(Üë‘Èó–ª?ðÛ¾å{Køãþñ¹­WÐeÖº[‰ÔÒ ôAmƒ¾GÁÐÏ*6§Œ Z+ô÷%÷ü‚bÍ £¾è0wÄSµØò%ÐkûÆ$™-_~|8ÍÍïÄÜÚb±Ð¶ÝogÖM³¨ÑÈÝïJ],Òì-üjE”$fæW=Ý”Iõq™¨Õ\É'Ç*­†mÃ`ã®RÍ@†Nå¯ÚõÛYµ ¬j á½;”¶ñ²»’r(@òöÌA[_`›L“jÀ€¼,4eD¹$JÆAá¤UžÇ’Îì„óS;"µŸ5Òˆ²;¦ìöS¨Neo²!€-ª*"36ìË\ñÒ‡“b³ÆÒз1øfÌ„ŒfôA÷ôÂfh¢ïUs`êß8›ãeʧьdwžç­d|*B‹†{l梉0v¤­]Ò·þ™Lò‰èÕªþ©’hEÉÒß^¶Pòg`ÛãëÿN§0Œ2ËdÌ]qø¯~üåα Oeâ>pöM˜ùI¼¦“‹x1¸nó6‡-!à–#HÉ×`º@ ‡\úáYLù¦­kÈb(ñ\åLá+®gžˆ¬ëÌźƒË c÷PR5£GÊOÕl±³+™$Ô¤²¡öA¡¹ÚšØëI°¸lÐÈY9‡¦ím=$ÏÊ!W•$ÆÞ˜¥°h%ÑäBLŽÇ“ I ¡êøà*<úIêR¤à‚ ‰­dR²7I½´˜ZD—/ Í϶u×yq‚.NhÄJ5¤LÚ˜[ЖïtçÅkåršeˆ(ˆùJ#‘H{u=¿gÈÏ³d$¢Œe™Ns{ÄÖ‚#û«,FÏëTö¶yž—[;'ç/ÜH2õ–—I*Rû2qËq 2êqÒ³ÝÂ[`95$ ³wIZ§{ަ0†¡dÌñe!µ9z¦A0Êš”³FNU2žé•I¼GÊZr`ùÑš¤+¸—ضc./8 (Ðq? í‘5Íïš›äÑÜ…—Wó}k ¾ñðÁ—Ï:ݺ:Š`YƒŸ~þöí £ŒwЪXÒGÈ,u0kã QêÔŽŸ& ÅÎ+çÆù•UFwY’¡7Æø–$Ï1"Ñ&ó}×1ý€6^Èñ/ÍKS —$8%¶DœÑjæÞÁI)hˆu?ñC$‚šSç»?•¥púa¤UjË©iËøéºÁèjL-³ _W‡¶‡\3^ ìÑ碇RoŽÐ4´Ø—|S f0?Ÿ€¯Æ¤lJä7O’ "|»Aã3ûÞ–Ë ~1o@‰B†ÀÜÁ ¶Ì«G…ŽÜo"(8eÅ…xŸGø‹ˆÅÇCËGóãØ½¼¼,ÊZåƒèO#B ¡‹Óåäù°zX†9Œ"L˜Ièya:×p‚3´“D¤T˜‚ÀRÿúÕP—y endstream endobj 157 0 obj <> stream xÚXK“ã¶¾ûWèHUYXâA‚LNã*§o⪲9p$Î m‰THŽ×ö¯O7ºAÈšuIUxv£ûkô\ýo%W9üäÊ*øç«íaõÝýêÝ]±’¹¨ózuÿË”«ûݲûçv½1u퇵²Ù—µª²vÜl›‰ç·8ýÜŒÍvnÇõïÿܤØIežŠÜ޼!ÿâ‰Ôºü‹ÃÐ86öL'7eä¢Ê/ÆH]ë%€!¡Eõ*Dó§î4¦—ö•DÎSue„6áÕˆ³ñ)–©„7£COm{„Ýx>™§efëÜ9©¶V]I—ª¥· v—P„¨ëÓȅۙƼ†X:-ÁˆÙ–*ü0¼Pþ¥— ”wpFŒcë0~|Î:N$äãÃÔÍ|Àç59wÍ%D€ŸÈúö©‰) 'ͼÙöiNp¥o’¦XðL$/ åuè7˜´Ë_˜·j%¤gÍÁLUä- ¢´ f8áÒŒ:KŠ­<ú)º\°R•=QbZÆeg(œèƒëçÒ²Ëc7´¿:;ÉgKg>’:°^3¶q5°ä~„埄J  €Ÿ~|OÛO÷ÔÁ;ë:ïoþɰöæ it™~¤@Áú† Yˆ\³õšdU"L|¥{~¥è’£¤Ñ–^)0ƒqõ®ºÐqör2S€´…ÎîÖù2mx{7¶ õîŒËçÌ«!Ãê XÞ]odi³ŸRêha½ºàbî*˜Rcîœ5²>ÕùhÇD¤‘Î"Q2Œ48twËÀS$‘qKªZMh.m-Œõš'Dª„ö9æ‘ »àx¨±÷ÔkûG-ôXmÁkÒ…)Ão¶&Îgþ·Ék‹˜T¯1Q)LÈðÈ("ß¼·Šú”·¬C©¼„­¹â§d-›%]æJ™=·Íަ^¡$¸¼ù#ÏÍ8/ 8Ð žz]H­°W2m:µn$$%=`ßš`Ë‹¯[¨åhaðO~JY¬t‚V–Qå"=¦Òf‡æ×SX‰0•\ÊÀÆSÇÁa +„© 1…ÙSäʘJNÎŽcSH0ºz#¦AdvǸg¸¤úšÇ¶™º‡}{®œ€cÝ×}œ¸k¿âãÄò`âoTãæ¥ïfšâ/MAUÁR—w|–pÅjq¥L‘ÄUðÄÒ_k²öÓAañá׿pÜ·©r¯pO;â÷]ë —¹©øÃ, ñ£I„‚jžØ53'}ÿ=Ð\@Ü~ÿ<äý':…j/ZÛãØr˜ú«Ïëát„»$up5âà£U`ªs-Zqqz&ùÑÀí]Çf“". +HÀuYò÷eî¢"¶˜9L6ÐþKjô z›šrT÷ôQ2o~h/Hã‘ÆÖ!§5jŒÒ{ûá õ]qàìrI„ŽDó igñ&MŽÄæàùÔÔHn-.Q÷D-‰Håw0ÛMjK‚oó¥&_Dãá2‘)}ŒÑñižüÙé4™¹WX_$ãcŠHEéÛ×èÇdU,duM7æu*¯‘IÈ„)²2>­ð2\!³1’ÆÏ^"+“döšne„¤a²«HÚÈO<$Å5sW)2•ûÙ·8{| á$ŒmQ¾„zköÒZQÕŽJi¿û_ßüóZÎ÷ endstream endobj 160 0 obj <> stream xÚíYQã¶~ï¯Ð[åbÍER”Ðö!é5A‚¤½äö¡@]lµ²öV‰-9’|› òã3Ã!%jMÛYìkp‹“DÉá73‡ã览G üã‘Ná/‰ª}ôùmôæ .#ÎY¡Ttûýkž°"‹n·ÿSÆ™X­9OUüawXýïöë蟷ÑOE=Eª`¹4tí£L°\»Ï]ô>ú.°À,dyê›±>™º¬(æ©‹‚%鵩g!;õ¾i«nWk!ÓøW|»œiîf¿I|Üc°ˆ7 Wv=QÏ¡ïîwõž:·åXÒ MK-o¿úö³•àñ?Þ›¬•fj"@5£ÉC×ïËÑt¾ù"PŤ@×’3­SÅ”6’ï?µÝah‡mSxC¸f<Öì–›!M Z+²ÑÙßÝùÆ4}èËÃ#IüåËz™Æ|¼ë‡çåÝ®{:m¬ÊÃÑ‹§™ÙRK@Vµ«®l{õXöV‡¶Ü×›Õ_CXp)ÌÖxΔ03¿­‡ªocÓµv€ò‘P¬¾øí#šVçqßǦ­í˜|G/IŒü `¡EÎdaáÖi±ÂúQªÉ´v~]äGÐõDcf?‚ëG 6vô,íÌõÏóx¹³{j‚5×9“ÊÇ߸,î·"µÞÆÈTaŒ’$>”=˜b¬ûJÂ4·›þ2€Š¤h²ÑÍj _7q[´yø¯ëܬVë´(Û“Twž¡âê G$ þØT8⑤‡<ó¸®D£~¾ E?3裼E˜Ñ7È9ËS¸ÙB¾ÃX¶U}7Ôþ"nK”ÅÆ„V;‘"·‘ŒÙœ^l–(W$bb¨Gjíèi¶.i²ÞmŸõâ†?ÙiC*ò\ ´þ¶;!%s¦¡¹"ŸþˆkÔ=ø)u'cÏý®3+Wh‘‰-€"5S à=£ÃUà×X‚ œÊÜGUZMîmo G+4öI–!e°L’®¡½0<ã$nÈÜä@ð2‡Ý§7Ûz_¶ˆ¥°?ðÈrw_XK)㯂@ÊŒi0öBw°vª­ÐßBüÂêO¬nÍhŸ=Ëa8îk«Üø8$‹…¨Dñ* 2&Ó¨¿£%uœ@*´~¹ÛQKÛ™ÀÜÖ³v†3 :%›ìJÐH–8ÍѲ!ó¹4Ï!3Aƒôá ~=ÐÓò…ö‚Æï½4Zaêq-h4ÓÜPkZ¸ì+z±¼oÏ£e-8÷bƒ@ ­âϵh‘)ÓÎv§~ Xª|?ø!°>{6bv–TÑ=5Ý‹tGŠ A'Ú,öX‹,,xA]æDZۗcc¯nm¬öö-‘:ýÇæïl³ ”ß¿¯Çcß¿§hhŒ*¹;†Áu”#im¦„Uš#0ËU¨ùpÜÝЙ8 0VóñKÝwèGYÿÄû§f¨íèÆV¨#†@R¨´k×}o"šö°lùÁ¹™ÝÉ §»}Í+›kz»¦Õ%ågU©°íªþòzÕ_*€t®úÓ番ÿ¼ˆ_oõ'çxÈ‹yvÎ%’î•ég)7?è %MÕ_›Z4Vó?b‘¾îGê³õnë¶rªÛªeýz¼º­²ÕZó.XĶº`I?YI_ Ý”“ºf;õ-Zw»UôQ[Ow3‹],ô#= gªÿ¦à z+(ëË‹?œ4âÏgÊûpÙÔâÕåý\_)ï§~y†.°¬t'èý±Ù!Iãü`YóœÍžç@ÿ|³úu‹Í ©1á^F¸OìEäѵ4Wnomî¦ á«Å•öá_þ¬`ª¤Ã¸¨¡dÆ=Eêô¼X¹æÅÕjÁt½}ªøÏÉ¥)…K¥ à›á¸Kb/lÊ B^x‡ñÚÌÔúí =çã?ÀæÌEü¯n¬Ýb¥d8žpBcÿ‰VlF«Vu;X]¨î_Pªr’©¢TÛ´€êAypå :­…¬ ¾Ç3‰5…ÙùÌT­çKw€»‹Jš³LÿñkÍ‹­q¬êoÁDBË´fyAG›tÒßýé7cÇѽ endstream endobj 163 0 obj <> stream xÚíYmÛ6þÞ_aä>T¾®ñM/}ú’=lz{èPà|pe[ÞU"[>IÞ$Wô¿ß ‡”h›¶w±Ÿ(²ˆ(r83|fž!Eþ3b£þ±QÂá/-Ö£ïoG/_«‹Â,ÊF·«Sa&GìˆG·Ë·÷Åx"Ò(ØæM¾.º¢ÿûöo0‹ gZ¢ÂX‚nœ±±Ö¹ª“ÔÈ”-)ÍñÁ‚iÄT~Ž'*ƒŸVÔYv$S¶>‹) Sn´½¹¾™ýýgŸIŠÄ]‘¶Î®§©w]¹)ÈÖ®-ŒGí§õ˜ÇÁ|<ÿëª\-JKÔÆ?£‰wM¾½×Ö'\F¡R€ŸÀš­A“RÁ»bËQ,XÔë-(OƒzSlÆ< :Ô«À³šò¶-ï6ØæäM¢½I¬7jðšvyëzn›z^kzÑ^Äç½øe–ü®B µý±ˆÜë`¼~í‰`!B›šž¾u Ù¯$ò¦0 O± -â!CÀÓP 'a³ìBÂÆa¤Œ/³æþDÂfÖßv«]+%À!µS`"‡0ÉR:E[tÔ«žAÖSªåÁ(.ø“Qës‘¥bHñe½ƒhúœLÃÄ •˜5Y:~@EÓi`™w9Ì«Z[^`²¿¿",…LBÅÝ`~¸‡P€Ø=bÏ!k(WòrÓ'sQµ5`nF9Tš0KtôÃ8ÕaLa*}k E:ê%LŠPbŽì¶ÛêÓËe±Î7Kʇ1P+¯væ®”˜»> e&Âì=ß!ÚÜÖŠ¯=Î1†ØÐxd|Ó% ŸmŸ›»uaœëîóÎgˆE,Ù³€ŠCÉ ¾ÁH&AD>¬ê†ìçU5 ˜¾,ZÃg! tDš(¾@FÇ|VÕ|1da–º¤I÷H&4"J\ÒàÛŠžnh ¤qG/’v¢$¾Hš$L˜Kp«7œ7 j[°uÈ–‰`Ìá*FÅ!Ï%¶HØmTÇy B®Ü†9Ò¬z°ìÓüóäÀû*å&Å“Éżä’>r‰³ä’ÏÃZÂO.iÉ%r^=­È}þ\Z-òퟴz­ È–V»ãˆC.ŸN«Ìž“,€}ˆÐÐû§à]s*u&ÐÒ¡1pʼ{d þù¢¤ˆLÇúLÌÌ™ø >hÒÀó W–ªŠÃÔ…4÷ëpÜàøã÷׳·ßýúˆC4Ä•fW”.qåiâf°§%g£öâÊÄe.‰Äûu&¶Þ2¿ŠŒ¹«QAêÓE" øR˜X9+ÜmLÔò¦ZúD¹Œ¯ÔCöÃr)Òóå²_FdýÜC]ö¨‹25I‡\êi§âÀÅð%wŽ=òr•ne§N'N…³¼ÖžZ'uý䉺P?áܨHë¶óצþSðø0Ï* hk( Ø‹%Ÿu¥/ Ã¨ÂSOPFü´w²4îÃ1e6¨€âÐ4Ð (‡ïg* ñP@üÔqBÿˆs‰²)°ðO~)l•=“˜å”x[º&»ÎZ:jzPïI,¤‰m,²Õ3¦‰PgN$=Š{ù°Ï1جÔSŽ$ÌpŒ1âx4T6ÆÎI¢³çá -ØÓ9‘aâ"¥9…~õœzù:uÔ@XYнú˜¯·Þd´WAû§qÌý²mê; '½Ð6T؃§îkŠ|ÙR³³Öå¦Ô÷,;=16ñ7úèÞ_ C»|³Ð³R¢ôþøÓÛïÐÀ¿Ð;°ÎÍôUS¯)ñ­ÿ}Þ#s«‚úÍ—9< I«—‚£hä·­ÏŸ›ì6¬z Óv×îeqä¬Dw×±ë›q*4?"¼Mè3©ØÜ‡¦ìŠCUMÑî*P†øu4U_úh+ôüáæúÕ¯}v¬MbN’7Ggã·Çÿh{¡Á¤&®°Úž€Æ’ïsÊÁW·tÏÈÒQfql®Œ8”D•hÁ¿€Æj·—Á×m·\«ðþ[==r¯#$ïªí{GŽë¸^اm:H¬íš^|)®‚ßéaJ°n7÷íWÔúƒ3,±_[ŠVøº¢lò¶°í›Ê÷M (7™YC™žu¹œŽ=ú³¤ˆÝCjµ}C*yJ;j/rÈ0#v³·HsGcßÐ',€Â]Aú§A[þ·¨WSƒÒtlÖf»sÓ={DmXf&‡¦Á3½^­`Ïô^õ±A ¨ˆIº´è• SòaŠDà{§¼":"VkôÚS«òÅP^Ø5NŽ|»9"‚? N‚cp™UÛipc,Zˆèšûÿ¯ÓààB—EU 9õæÕËé ¸ÇÏÿ¼¾¶±JÑ‹“KüW¬)º]³!‘ñúˆ:oŒáÈS%fâhÇ¡Òé± Ç™s&ä‘ 9˜˜\Z…ôš°©í’‡C}Ã_*c8¦™6Ε•þÇgÿ×#Œô endstream endobj 167 0 obj <> stream xÚíYKsÛ6¾÷Wpz¢Z!Á¶9¤I“é+“º>t&Êxh‰¶UK"CRq2Óß],HB"k©í¥‡Ž=&ì ‹o?tð>àA ?æ"¹HçÙØšžšš7ßÇ\˜‘ 3íÂL%Ê<æ"q.2ç"zÜ…75g-d/"$Î2am~[îw«ÆŽƒ$&_ß<ííò¹êìv½BŽS1¥(޹:GQŒ=fçéÉ‘ÃøEo!zE3VŠÉHQŒ×pìQ…>'T–]¯:OO&ç)ŽW‘ÕHQ“jÎq¨Ç3LÏÑóðßzÖ ÍXq\8Ü*·[Ùï.ݪ€Ã`’ ß‚a4´æ‚q–Ì"ÎÁÜí¦êÔÞLf&x’ŒEql-™Iû÷MðkðË„OÊùÙ®w˲iGö9LYJÏçŠÉÓ|1碼Ÿiæ›ÛY$þ$lÊ͇™ŒÃ‚^!Žõv&y¸ßR‡Ê¶1OJ} U]^o +¦Ã‡u{Gbå¾Ê›è~½i‹šòŸJ& .»J‚ Ê4¶vüÉKàÊÆF)Îpµ–¤Vø×O»²jÖÍá’IO…§ vÌH*˜³UYïZB,Ù•KíUyn¶ë¶Î«;’øâÕœ½Î‡«ú®9î̯6åøs™WsÚN0IðíWå2æüBâÇö>Î ×^0Õz1ûz*O\I;mnXBÓ~Q4Ëz]µërç?K Ë”/~y±@ÂÖl½+œÎAjß1RP~”Ì)'qÌ”q €…;”uRB\Û|C/0ù½ ÞÒ°-©·í" mQ(L‡B"ÂÐô(ÄA‹B 9ž&LII¬qÅõ@mWGÖŒŽe¯\£¾u°ƒsËR;S •™\cÅW ʨçT²£Ó u SDd¯ËÖÅÕÞåm×´ÛV·2ôR¼ß¯ë¢ébÞtÒn¼O…âi¸ÊÛÜ—ô¼Æ…Nv½› H|q[ԑ˘‹mÈØ‡”s¾Ù+JË4€¤‘a•×ù¶èêýB°i¡WÉðÒ€C7Œ\oJëy‰‹sOd ;AÊᯎ„$†…%üç°P]ÈÜÏ*ì$]Æ®€j_1Ä‹õbÚ“ÀÖÄœvIBZÂÃf_U›OOVÅ6ß­¨ ªMÙjc0±,…å·ÕàPì[Œ|O»rìa $±ª5U5ÚDÂ@ï¸Îw·¶)·.jíG-%¢°£ï8žZOà®.7ß¿¾¼úùÙoóW1‹;)·*J+ÌŸ·*_þ…ysŽùŽSÞ1,(~3eMÄLO”ÇÁjC}Àù„„¾™ÚÔ8¢‰Æã¹«ðÖ=zæM³ß+ªmKåŽ5Nà*;+Ípõ±Ÿâic¸)kòo÷ìÙÙ5\ ‘ Ü%3ªŒ#š‰õ šQ,–.p{š‚<œ>O3‡L .fdœú4ƒo7ô$Bc ô$ÍàF£OÒL:ìF¶:b=8Îë%5ˆ_°uÌ/‘äÜc¢ ‡º9Å/°×Š®Ì6cÀyYû8ø}b")Êø#2Ù dQw›%r0Â1~3 :uy:vö7[Úì@¹æM\„C×6ƒÚ.ép&2Â!ïˆA£ëÝ‘CGFØ|ϧÖTêl ‘óÈæëØ†Ó†Ú/Ê4A`‹O û?ÀÿÐÙ4G¨Ž#äÀ°ì;ðD²ôß’܉þ'‡EpvpAìǰ÷ù¿Ë 2Ý1®ö•ËMï~Mã»=®šîÐ`b7s舃Q'G«¼Ê—€}ÈȧŠ$[š;Ì8g¦wvpš1þiÆðCÁÑ5]káˆÏ ÝíËÝñšo§R›pTy¬º(·òÑܦA/2ÉZšiýw9ËÆü×G>Q^ÿ†z Ÿò †’>CñÓ å‹ƒHÃ¥I ü*f`Yúwÿ£XÀ½*5Ö«` 6-lªnì$›ÿuáš%ÊÂõÊÐÕõ§7?º3Û .z…+búŒýHF‰pŒo޾4ØO<ý—/+Š™Çîë¼Á¼[¥Ý‘•›rƒ»¹ Ö»['NE„{~XÞ5‹ŒáOŒ/x9ƒÂ+ë•ûÊôCͰ•B©ºÏŸ‘›äðUõî÷’[ ŽÔÖÄ~sOLj¦Ü•ÀmxñÒ…Ô’%>_÷—ô /éÍüsR°ûZ¼xöú‰>/ëŠY{*¼(*šKݺ"™&Ñ› RZ„Ïö·–#ðgZ,fNóù]^A°©€â±&ú¿hf±ø¯ôùfüù9]íLrÓSšâáºÆÛÈ¥’a…æQŒsãcZƒÜé4e&#xéNú—ÏþæÑÀq endstream endobj 171 0 obj <> stream xÚÅZëã¶ÿÞ¿Âí'‰ñ!JjÚ¢—6¤¸^^ @68hm­W9Ûړ份ÿ¾3œ¡DÙ´½÷(‚]À5$‡Ã™ß<¨Ù뙘%ð'f™„ÿd¶Üξºž}q•ÎDI1»¾›‰4.ôlfv½ú5º¾¯æ ™¥ÑCÙ–Ûª¯Úùo×ÿQByÃ2«æÆåËeÓõLåÏ­²XeLÔ=à¬Qµ¬o¡«ŸLTîh­:UWõÔÛÜÑoïX±C6+ÿmõsi¢w8­‰ª˜L$¯¿jö·›ê“5³Ã í’«²/éÝí¦F-ç°WŸcÛDoïë%²soX(˜4IAª*NS;ó²Ù!}_Ö»Îñ*<.´Œ³œ¹X2„S‹‹Ì¾Žá"6Šøü=°‘,–f6cJIÚ 6,ÓU»ØïꞺì©AKY‘N¨í¾±’Oäüm<_h­@=ꎽ™§iTnövˆˆ¶Hµïxî[:m¢¬iïÕtÉÒ¢œ½õTÔ–»5/ý+oÍøgdì¾H<7I’„Ž;uÁ$ß¾¸~ùßg¿„¤“8qTŸÓai£QÊÞa}vbúü)Ó &ú-¦ý|{šM&± ™ÏD)”[ðo¥„ˆS§Ü Ÿ6¬ŽÜ•]·ßV+êìïËà*"±*>N÷ ¥FÝû;~%ÄÄ]ÓåfÃlµË.&áKQÄ…ŸÇ©ñG‰Kø£cé¢k6–PÂÒŸÜ\ Ä9{.ûºÙ¡ Eõ ½í5ë+ô·Í¾¯wüÐõMKsš‘¢ ûø½Zöõ›¹…(»¨o5ðxCÇb‡Ôk¤€]d…¯‘ƒ¡ôM_²QknæNÆûÝÊZhzBᄜ»(±ÜIÌiЋŸŸ?ÿœ—&ôáÖ3Ÿ‚¦Ø5Œ2VN+>x!e,ÅÑÁË"¿èxòÑñ<†·¡õi¯Säuà×ó:°¬õ+ÐKàÑëøoqÃïxÚ°×IãD?Áë Úi½,1,L^ìuàÝ‘×QIjµÉHK³Áû€hó°úŒzëÎ#èò,ÖNÈLj`b©?Ày*ÄþEyþ…ì)Š,caŽ4`Â?j²x/ìT£Œy3Ž·÷Òo)‹8=Rožø¬z›8s›{óò¡éwvØpÔoüõÛ>ÝÑoïô{òöbT•›Øõ»ˆ?ªš,L ÑöÕ#> Vs "$5Ï" º¯•6q’Oôá95žâÛG:Â4óÔN«¹P*–ùV(Tõ‰ó m5?=Ñt#GVvd·«ŠX¤ójúŠB¢ºÜð€ƒ­Xå‚á<‰ž—k$A7[›¾~ØÔ6¨ ò³ãbÓ¶Õ‚ñ"Ì|"DÆÆf·ªwk ¬Qb„¸ëªô,½#öЍz½/75)ÊH×·%ÇyÔwuUåšÒ:*©(òƒßŸö·ú†Ÿon¾* ÛÖ-BÀ_næDK±«–Uוí»y.9tKh;zÄ8Y€ö?€P–̯,TôÐ6 »-=lKæ[ÂÕŠzy°òË=:®Ž!èE'¼}Ø÷U0zƒæ~Ü$2 i—2V»ôY Íf‰Eþ$œÙ/«•ã¡ë;j’—òöîÄ?Ú ) ˆc3IYÂÀ¯ÞŸ_‘O´#¯–ßÞ{žzÃÓT½; ¾H¿ýA„Ô""5RözDï=ý”àùœ‚Ú(LY…f}[¯â›9ÇûŽlƒW%KRñDNwÍfC’%ZëÅZÞBù× ðäT+’×zk½CË»OðVñ3°1 ñR°V ·ÎMLs1rxÞê Þú¬¤èÛC¬d5/OY*$[ÍÐÎKÍ/léËÀ€ …K†…Höö¾jO ªÃÇ&bÅèŒ\ˆ2Ä6GUåUÆDmˆ€¢Sn3u{®¿œ/„É‚âõΆ¬}îÿ,ŸF/^-Í*´RJ±™Êž‘\§m ‘wŒÈ¼aÄ›˜iv‚$Cô†%Ã%à!£{…¸c|o”o€°”ìV¼G.ª æ}k³†Ã¢ÇŒk†D ?7o‘ÜT½ëŽ ( ؇±ûàHó‹«ÜyâKöǪ߷C½)’AŒ,)¶ï3穾{èë­Ë1Gñ{Yf (\ fÂŒŠþæù÷/¿~ñÝ÷W?…„[éEã´ì¡Å%‡d¶*»ÃÊ#tT=ÖàìÎó GþýìúÙ9~Þ•v!™gäÒsŒ˶ç®{~×U¨.èÀPE c= ÆÝ%…HÒl¹ñLº¥Ná eOXæ0ª†y[ê´É6Ž˜Tuå‡9¤I G{ ;äÙÚƼè>!fJÁµq‘Ά€“ðÓuƒæ6<ÌꈭÁS}wI»zÆÑ{¬ úRѹÕÛí·‹I¦€;“\Á4Ö€k °FüfnŽË˜TqÒp8ûvY¹|EÒ9õ;ìy >#Ñ!'g8.Oæ0±ö¼×?N$§Îs%‰OÕ㲪V]HñÓtÌfŸVù Û2Ó¡CúñÙ‹o¾>gD×ÐF+!ñ¿Åp«ì¸ÝVÛt­Ú¼c§TµÛzWö®>É%c6)[hº ÖÕ䤾s¬P?™®ž}ûü܆ž!Øhœ¼µæ¦‹èÞnúØð+&YA"¿¤-UͽdÐ1¤Ø»iÖõ³ÈæQ-s¹4ªrð¸ð䫎_Ì íTxÌâ‚ÁUîâT@$MгH—_Ї²Xè ñ3ì„6Æ:ì§PÙpÖØòެ…#WzesÛìdn[˜¸88f39æÜ¡ìŸÃzsF¨j,ïSh—Oª®!o¢Çrÿå’\Zt¡M#¬ ¬‰P±$·¾çp׋ã;F¥-Roª®;[ W~ji)ȰÁ™WÁ"oç,Ù&ã|£‡ËlÎ? qUx5™O‘X\¬emŽQ±Lß{ç'jwîø÷g®âÞ[ÀŸ…/Î>Jlê ^Æ8¦’­ÂÃ1*·Ž—ÆÇ1H~=sw(ÙIè0ÎáØWœÁ±ä#qÌ Z$'. åáØ˜*ûß`q‡p ÓtÇàÅ 2(k )™„°rJˆ7Š¡˜i•þŒ ‰î_E0f„_„ÃØÓQ¬îÃ(&0Wøãa,È^ëì"ŠiÅÔ˜pM\L:†§ªÛÞ·N À™÷•É…»‰0¾¥¶Š9±ÈÿM¤'ÁÏ&Ãøi[4†œÊ&K6©¢¢š,WrLFHÛ$`· øxWU«[¾9e[ׯÙÃÀ òcÓ6 +ÎG8ží‡á4‡¼g½áÈ!]¾ áÚ@‚²i, i,ó)V¹ fj©šø.ë;NÔr´Óö«ÅZ§¼Žy z­mFU®_Ž÷½ˆ ¬QBj ¦ð£Á˜Š,§0V¡¤œàÏäŒ~pÅ.‘¾xÓb?‚L’¢u«OW‘?º>_ÔÞuBìòü׳Xùì-–3Ìðžw;9Æ*îy3ûiöÒQ<$å…(C›iñ€h38öbP[ÏDAmŽ_*Œì,õ 3ETµÝ:A¿ÝGf†ëS¼ß· }®8Ý’Û„“l?·Ÿ‰D§OÅp!‹HüÁÃX”9]û)ƺÎXSÎø3ÓÌÞv2‹e×9Ö\•hüt¶>~ìÏN&žkò±™Ì±´0Y†ßÚDæ¨øÓÿ4>ë( endstream endobj 174 0 obj <> stream xÚÅWYoÜ6~ï¯Ø:p­M,U¢î8Y Gb¤H ´Ý>EÃ]qmÁZi+iÔðïCê°è#AÂÄc曃Ãá·“¿'ÎĆ?gø·'ËõäÇùäû·Ñı­ØŽ'ól›|LæéãÍ®79›~œÿb~OÌñ­ØÑÈò]!:¿bS“¡Á¤Ž˜lªò²¢kœ,à,/§$4ö¸V1šÖ8lÂ:+²õ”ÆV(Ʋ¬›o‘3‰—uC‹¥ÐŠ`†«?¿ûõnà§?q¾*«5•ꫪ\‹`Lå¿kù¾ð?±OxÅÆ'°ãö"&¶åH®Eˆ8ªIZ$’‚'§€‡F]æ;îã±Fàlƒ–|ñ3®m문äâ¶LìWå¶É ¦óÇñ"Ëó¤Ë|sÞðD]”×4¿Ôø‡–Hyé-R´³¯²}‹;ãà4X/ œ­Ê-H‹ä¹ÄµH?y\Æu]Tå~0)­R>ó b³m,¡üfŽ5çD“Ê,5UHÏ Œ|›O<ãUݤ)[YW3¡=¨Î±dV>Q0Ïw$}$¤õº'G+&B®ù¼aàŠÕMµ]6|ì7øIËí"g8®®êSm²3Üâgw‘Ò†žþø¼ÜKø%ݨÔ†&éÐdÑ3°Ç+M˜,Ê”%Æ.™¢Rè+Ο'S±”LÍ_…éT“õ>"­–‰A9 cû¶@¤cDªCì|ÌŠÑÖ4+À~™¥CÃxˆ7ü²ƒ¿Ð}6WÒÆ9†M"‹x}G¹ÜŽU ;HÁÌÝó½æl¸4D#%t§'ÝôLâT¬Ñˆõ®šFâ7_ã‡^B¿lF•uö+Wêl’©4§–é…Jå=aðæ«ÚFbœKõrµªYÓáž¶eÌ-p dz õÀ:Ú©x¼4[§´"¢fªýDá©‚<êÚð‘ŠÑùÉ¥qÐ*¿2rÿŒü;¨—‡Ñ`ïúØ›¬+’q74¨ÝÍäqzÖVïpÿL’⨫þÓVN[‹ðD«F“ €i@®¾’Ëçæ¬Ø©­/tÍçF6šÝw²gú*nåí3sœ¾„fâØ6äèÕEoû¦9ã9½?T7»àΜÁ3)ƒ’[ßʽßþzÿ~¸#7¨9k. vhîMs¦5T¹‚kߥ€ô˹MèpBý85g" ¢¬dZ»,H¿rº^¤TŸ¢;–Ð;ˆ7“å·WC¿}&ÌÙAS¾Ý.2B®lªÊäÍþ©ìÕ©´•>znï¹·úö™²œuÍø\{ÞPüÛª@?ì‡í>B°ßpíHONŠáSÉ©õ›E0·–ò` ùèSwb'–e‹è­ÄbÆš}Y]£Þ­qwu.W±Ôk/V=fJÄ“Ïð4©¹g•â­œ¶ Qçu[Ô£7ÀñCß Ž;Öî:«£i¬BÏtˆöæËvä˜3oÜŒ’ãê›AðóP¢åzá—av’¯ è z¹Öùâ>‚éþ×ñ¹÷Çç ®Oÿè}pIÍ „ëwˆDJú÷oþcQ9 endstream endobj 178 0 obj <> stream xÚÝYëÛ¸ÿÞ¿Båv͈o©×¸ë%ÁÞ]÷Xdl+»ºØ–#ÉÙlÑ?¾3R[¶³9´(Š,"r8ä çñãŽÞGŸ‡é½Ý\®K˜K°­,o–e±Å}{ZXÙÆèe)Uü¶ªih[´ä%ø¯ªß!QP ”ÿtÆ'“å÷U[Ð í}Þ†Vé—‘êÈuñ~_ÖEC½|½&r4PzàƒÎ*os?^eáLâyKÚVqWÔóÎë}±bÝ™5N™ÂêyÃþ‹z*m¬f–û,x5‘%Ë„v[ƒõP»T۰y;0bŠF%Ñulâª`ÚĿ˖÷ågÝs³£}.KLÇÂK##¥á †ñ ´|ªOÙ•p¦í0JF.·M›o—Á{ÇVVtˆ¹:á}²n–]°®a‰öæs>aa)Xp¨ñ™;0ˆÈ} ä¨€(›¢%ª |øÁ°›²^Œºä÷ËN©ÈSÈâàbûJ¦Ìvq€p”¥½`²TÝi€"GkJº%:çÝ•Ïa§¢a_¦àXŠñTæC«Š^ã…g=.)fðØc†ªƒrj;xVtWèyoH‘&q³ßíÖÏVÅÆa£°lQ+—i 6‡aÖh„t§Ã»˜ÂÎ s;‚û’`hÔùöÎëðÚkmF‘[ëN¬$™rgÊTêY®¿¿yó÷/™Ø¾JXBî™ònQZ±Ä Ýò§ß#€wëÿŠ6S*¾~;µ„YÃy˜Dú—©³ò=L®|–{Lˆœ7Í~ãÎÄÙ‚9º2b:¶2[òdl¦xÔqà¥ÂZ¸S8±þÐQá €ÓÇŸwEC@3ÂÅåQõxjújƆSQ/{0?F•jB„êiŠX‚Ô6(Ò!Íhô"Òdœ ui2fôiF‚ÝÝ…zˆAL;é F§¸Ê4Ä(å!Æœƒ7Òb}p1Ã0ømb#y:JefÂEt]uEÂêD`QísÅ›ø¥b3ó»×É ´„Ô²™ôp„C£E`˜T“¦=!ë×™{(ðÈY4µàð:¹št²f\?€.„œˆì#€°Bœ9õiñ™‘-‘MCÄ .í ÜÞƒL˜5ÇuHb.€@{oC¸!N%ÜóÓ!:ŒK1è ;¬C°÷–¾T¨A£¯C†£Ñ+Qsl_®º:Ôê»üÀ†/¡¡uX€Ì%ç, °š©Q=r©QP?x%öÇ!7;ýdp™¥.¡þ û×Ô_¸=PRcß•¬ø¥ ‰ßy:¾tâÀm¿¨çIbp¾„à‹<ÞÎ ÷t š ,í„%ƒŠ{}• ¬#ÁÑÒ?ÑhÃR>´hwÕñ%6_O™Vsœr.½>ŶvhÛ©Çf̤úû©ÏŒÐ)Jc>ªcwÙ!HÁYÏ‹ %¬¾RUº·ax¹<iOÖ0ÂJ¡¬¥Š8„ß6¨Ò¡T?ªcJ \ÖœB)Éñ (Õ)Yzu¼`Cyˆ B);¬a m(^”Ý] /’þ=ƒºƒ»”Ý¥j%3ä…»”=q— QÿÏw©Qa(ý¯cÐgÆþNñéW©‚†?v$Ñ܃O÷›ˆ2‰®?ü™CGôJPÁÜ¿ Ü–„¿j¯í‰æß÷r“Þ^}÷÷Xz@Dnvëbƒ¯Pö‡WÜ$¥Šˆ'á­8Ããdæž=qjC,‹¼)<ÉÍRNݿѧ…(oÖaqžørË?)8B]Þ•[|ÍFòË^ØjœF„e¸~~f—6Å—ò {jÏèC@ÙØâC]¶má—öÏΔ`q‘ QûºÜ”m]«ñ¨£v÷Bmè…Z…jÇKæ{ÜŒâô^!ªdx=Gf"8pÃ×å¿ßãàiÔþ¦Úæ¼[â±Ä¡wM[”ž7|É”À²»wíÚyëšè%À_™¯G¯Å!X†Ñ,DŠh07pUOé½\dûÇ?üÐf< endstream endobj 181 0 obj <> stream xÚXmsÜ4þί¸ø˜œjËò¥)f`JZhøÄ1A±u9Ó;û°å\ÚÂgW+Ù¾œÓ&™±^Vûúhwu³¿fÁ̇¿`–pø÷gùvöíÅìÉËhø,ó³ÙÅjD,³.ij‹â7ïb­æ‹0 ½läViÕÌ¿øNáèX"XŒÜñDÞÈvm‰Æ¬CÎxbiÊ–˜ÊоõN—µëµÔ8^»›/xꩼ\úPöLY•º”›òƒ΀bëÚ_Ñ`AÌÒ¾)‹B#Ó'Ò¿éS¨•ì6VÐK§bתâ©áé¹Üd—»“scVCëêžå«)׈ǹ6`1·4ÏÀ Iè'èŽèHÜCex"<ëÞfU7[UÐÞ¾ÔkÚ•´0Anh…´  y=WE×(Ú¾’­cF… 3έ›ž´ëºQ­&?ˆ€²(2ì$ªfaeóEÌ#€£ñd&ÈÀ˜ÖB¯Qy½Ýªª@p,£AŠsŠ8P‚âWµµ¼ök…Úã†6xÇ=@²£:4ô*ƒ5@Û”¾›ºº&D4]U•4 åVµ„#Ðm ¢om¸Ûz3¸E @â')~Æ®\Ë<]ÓÞ~]æs{Œ@XÏÀzSwº¬ì¤ÕJ÷õÕ|EÞŸ Â}ƒ,¬U7sX•›ÎN—î®Ã‘²=±×¬H²±sµKAºÖˆAæu«—sòîªî*ćâ¾;$,|Ðc)¿“Î}õêÄ%%EÂxV·±i£û^ÕšÆOýÕç ƒ£Àó,} ð!K#«¤¼¼6Cˆqà“qày–Ñ]„o ‹a«4‰­W´ªIÌ3G6Å]4ø½e;éè$b¾“_Ôܱ©t• è,+Ñ –MNƒBjI{W¥(þFÄ J‘ŒPšx”!¸6†Ï€[ÖÙŒ´K&œ“‹9TL–%¸3ŽW–ŸòÏ LÙ=É] q|Õ¨ûžæ2gA|„€ýÉ®3¡\°Èyß?Ô-<Ò-&ÝøÃ7狎ág›½q É¾#–Š{J0øŽð³}µSdÀwâ»ã›3‘<ßáÞq:È%xƒL oX:‚7O‚w<oÁ’øÞ<xó˜÷iÇTéÜÔfXÅ J#S$q?¯8D^­«ÂT,$ a0,Xz­Rnb>F*²™{o»«VÙ¾È,¿•¦ ¼»néŸ/ç츔ÞÛeÐ8~Ì"ñßûÆUÛË}çaÈüpŒóóZ£?„°• ¼4@áé¬7`Šó´ªÐ§Ø>àÉ¥ Иb$é/ãÉ8@p`P붪‚ÎT¶‘²¬­lmeCsÓšø%jÖiðÅA›ÚèÊ\Ê S¹œË&›=Ë9ˆz?tG(P]«fvÄÆëÐ'/ÓQ¼úí_”+AÊã¶ÇÇýÄEù5ôˆ[×2 îåÚ ¨-à8r IðÙ«7—§ç¯ß¼|;•è¤óÚ¦Mè,Q$õ& FɶÄ,q¤‚ðÔmÙêöÓ:ðA‡ï_\¼ø” ¿VÒâiBÙ¾­–¶Kk»×*„ ¦„HC@)JxœX’zkG¶O¦‰MY02æ)œ‚ç‚jhÑÜÜ 1Aµ8¾ê¦9Ç×_g/æaƒ&Y]«G;æ—çg§ñ õîÏæÁ3„îCÇ Š±…DjJåÍÜ<§ì%L½ýªAÆbòÁé­Üî&«Èôã@D žI†º†šJ«ñÆ%i¤n”,ZÚÖŽÃ4[T¹3›ñ,?Š8NÊ üTåÊÍèûý?½@ß½¥Ãø~”úžt±jjS=”{LWDŒ§®¸(:áš(¿4(æx·(E¶T@KưOW¸ÖµTÓÒÐ]Þg®©¢# és­àõfw Ú £.µ‘·b*f>T„Ìž°ŠQIû¦Ô¤ÝH|Ÿ¨ D!;¨î&MYìUwJ†¦Ma&†¬Mˆ;½ _v‚t–²,ŽmšЖe™áûX²é°D\xß´º€÷.[?ï/iÿÐ1eY?’pS^=†<ûnDÇ–ÑíÖïw Ô"²V7]®qyéc03nÖíSýCŸ›KLWO¥ÿ®›zB£\îÜ`‡·öÛ䇲å¡l´( ËA°)“(»ª µôn°Tà¡%ü‘Ò4ÿj97KËùâ9®Ât>áË1GH_KO"ÃÀ|ÃQs”S¯—•&n[YV ¿.‹)ÁM!̽€´[[gd6OéÔÓ#Ýj´ºµ„7Öy_í'‚„Ô¦«1Sa´jF^é‚ ôY4nÒ ܵ Fg´ùŒ>(8‡”©Y-nùAÕ+›åÜŠsËòÒ¹ò30ÿºÌ±ôÎìñzµ‚ÇÉÀ÷¤‡1J0? „cfÃ9ˆÑ^©I^ÇÕ¥†ƒG òÍ"N|;£¬ÐwÔ?ö/…Ü€ endstream endobj 185 0 obj <> stream xÚ­XmsÛ6 þ¾_¡å®«¼Vœø¦—võÝvmsk»ÜÚdŸê^ÊȲ­Õ–\IŽÓ½ü÷eÉ–âK³]r @Á8ŸêøðCÁ¯ï$+çç 燗4r"s1s#\¼A(ï"•iìÏð3_®/AB#]–éR݈‰{j[­×­Vé–‹J+Õø=ø[ ]Ûƒ,ÒMÔºAõ¿vë¾ý~WËãZntÈc:Êd2ºÝ“ë2Ëk99téƒéS€5û r>™ä'ÓúñޝQ³·õYQ"ÃÄÍö€¨U`©?Zò©7ί›¥G&£>ä_#˜Hß½ÞÃÁë÷Ù‡§Ã1µf0Cí‰]{ãbS[…vé[»vöû›7û+vAyãú2Ooê[ͱ»=Y¤jÚšÇã Êí|0õƦOlÄC`­Bæ~luÀN3›ÛfvA‚¸j2òÆ7=ŠÎ›9,"LtÑþée”ìÐ÷¢ç4]¦uz9/Õz‡s0U ™6enOÃq½?¼”ަù±.5T’X3EDrÃôËläq?r?Zf0±ÃÍI‚fÍØ–›XÖ0>DÀ¬Âo½Hõ vÓƒ€T}ìp4ñ©XZ–YY¬¤ªÍU•&uVäV0­’2»ÊòùÁ,IYC´3KH¤¦à ØSË1å”ÍÆŸBD»ŠiËÆ¦^oàìsÎÝ•±Ðý¢' ÊݼïŸôª_öI/¦¸8+–°ómõÄ¿¸èß\ÆáÌ(zFë šã=c½ ö J+ŽÖeqµLW8AwãB=úØFì!!¤ŸD/-–pó´Þå'”[¨ 1~ò|nó=ŸÚŠ$v ê3a¯,o$·i™6uPMeží’ºWS© ¥Ë(ïKïJõÆ¢Wõ}—ò~!`ÖtŽõá´Tx4¹Æ :»=D;¶U@ãÿÁ¶4î£a4y?49ŒÆî±S1ˆvï Jo'д‡ n±ŽÞÏ:öuIr̸àÖ°Š»Böл§œñܱ¸†Þ8þ= Âi©ø(Ú® ‡Rس´YHA",ÈŒPB¢ØA7bŸÂãÈÙ:2&‘@‰€9+'à$ wó¥sî¼ÐÑá²z ÏS}ÑA¡û?¯¡ˆÎW*XáXFœBÇLÉæ¡hïÍi©jèâð¾‹:÷gu2IdhTžÉ‹u•Uû®ØkBW•'b¸­ÐLhÀÚ×Ú<1cÓ³àÒ÷Í«bÇ|} /‰C¢º„‡À.<ìÍ"hXh÷Nм²wÅN`­ÊÕ{úˆÊM·t°mêsÃNßóÜôkÓXÜ¡MºÐýˆ`[B×ÚPó0âÞÃF³PíIdÔm’ÆUúº§o~{„kÓC”•é|4¡˜á·nLÑ©ŸíH÷:D·-Ðhm*iŠ Ëb 'S¤_i˜/¶Kå±6®ãðç%Ñ‘tŸ«r›å8nÒ’4yƒÜw§vPÎm&Á«—Ä¡ñ©šUÂi¡˜H²•Ö‚Vf/4 ¡!H\?ÂŽµFemI ¥¨Ó†¸VIVÃ|ŠÓ²èÁ&ï­Ag”­´G6úèP|eât¥²@ïš•‰«¨WêRå•ge­kU-²õ ‚ ø^Õ- YcX‚~écl#Ñ:=¨ªlžIˆ0ŠÙPVèãá”ä1×Ù¯Vðd(‡’2”m®eºOüf½²i‘dº)×­›†ÇV<®=ÝšV\ÁÁ Ü? 3‡ݰÈ´]d‰Þ½adaLEãzmó®bÁš} yaÚêë¦}Ö®\÷ÙÖœúT·ù]¿C’§SHT!„{V˜tàÚvUcSnÞ@±±)mëŽöñvs|osH0O-[ªÊlø·Y½htXeGJç&çÛÚ` l½ì‹r“ÞmwSÀ"#¸ih‡j7ïÞ4Ò021fD]û9a|ÿà!oؾD £e¬yCâ <ÿúøóhwäMêÆîO¿gj¥¥%Ú|ŽÝWvõ¼ÞÔê°Héž½¸8}qöÄŠ#(ä8a…4óŸMµÉbÞ@za©ÊyŠÃ*Qæµ\ûçYko$äc›+¸¡¶a¸å4Šæ4 vPm ðØÂ™Â¬¦G»"\™½î¯*Wó´1YÏ“,Í“'Ì·x.C¥ÈóÉ^xº™Áà•)ï!> stream xÚÅYKÛ6¾÷Wø(£kU")QJšKhÚî- ­LÛÂÚ’#RÙ¤¿¾3|HÔš^ÛÁEX‡Ão8çÁ]|^¤‹þ¥ Nನ‹_î?ý–-Ò$.“rq¿Y¤Y\²Å ?ä‹ûõûè~'–+Jht¬úê ”è—ïÿ€Y)õ¦qÓtãŒ/Ÿú´B¾jJâ4·2ò¸\‘"uó!I™f‰ª5¿|¤R(|cQ·1_•AÂ"=e¿¶²óQ- ¾¡Z‰Ä”ó˜Øå×Ýð°!Œ<.œM;[—F_–$D¯ÄW|'ѺR•yØwÚžA<ÞáÇ,R^`EAiVÀžÒ8Ë´æ§]£%w H‰]€Ò¨ïÕ´ú…ERu½ÞJ' 9ûoF ëÍ·µ8TíÚ<Yf,ªöƒˆ—+Æhôû&´„'1áw¥éÜ_¤°B?ö*Mã,µãÉÝ3 #cbc i;åY·ŽÍ‘²ˆS;TÄXÇru9N3ªOuu y”Æ õYÇ}ÖáÈ:–ø¬Óo3ª :±¿šQzë §YWÄ<óX7[·êkó`è†c'tci9Ñqs„_nzm…½­êÆX»,hô2½R‚NýrB/~^ä½fx<†1Ç0úŒa,‰yyÂ0Ê/1,‹Y6YÒIv;O1\C6øõ7$Â_c÷(6½L±4fì Ž udãé´°ñ3CpŒ©Ç±2ÎË×á˜Íýjhë:½ÏzF³9ÇHØ«¬ÃŸ^æb‘Ç%ypNÆâ&&޲+½ã(Ip¯N¨mê+Ãä€Y2áªøHŽšHݵKØNU5­téAÖ}sTMךÝ|OáÈͱ'œØõÖÀÎ >÷˜)[ÑŠ¾Rbý&u6Ã0I´¿O>†ö4aqâ2íxf)ÖAÍVÜ#œV~\®Òœ$°÷bœyv™bµn¶Žc†vlTóe©–6»‡TÚì¾à÷á€Ûò`ŽŸÍ¸ÞbWÁ$f{컇Û`„½8X†­Ï»át@ŽKpT§ª½evxCØH©ÖÄŒIëUx؈Gvp¼_솾'Øôûƒõ~X7íÖLRà{)wÍñ ´be1Íû°¼Åªl²ªi_Õ*Ô÷¿Ø”ç âðEæœ=?Ʀƒù «s·ú¬ fâÙò Õ,mõ”V6®vö̸ B1B¨¾^¡úúêÊÑ ºxe{‡[Âk‚k%eµêš£yÑágèxæ˜Þ‚4õ^qܾièè]ÂÉ<œÄálŽX1]€i«>Øœ{OUmmšCÁ£îI÷B™ìN L~÷2¸Ío,ÚÚl×>+cÂL½Åt²,܉Ýf™³ƒY;è¼± Ö"7¡d%ÆË0Obœ![¯ú ºÁ5àöX³Àï:çi6B…XsÔç|¨Å )Ô°ÐLcgkØ¿…ú6˜ ìEÒXîþŽŽ-™¥ò¤•ªjkûö„Ð+idäP×BÊͰח0Km½ÝÍÆNÄ+n±Õ 6пìßñ®IGî3‰ˆ¦qân ¶ÉðäÈp®$%¹Sò.¨ÄkýêyÖL’"Î]«ý6hSÌÆDt.±R>ݨ¾C>QZ,õúÛ·=ÞZxK¼®™NÉÙìù=pÞôÀqÉñŠuEJ†b)•”†R„&¥)}JáÞ¤àçJÊfÛì‘ÁoÅD'Ä›T£Vñyhzáò¹4stÔŠ­xˆ«8î”ë3ïŽÅxäÇÃ|¶qƒÍò9eELfs_`tÎ/‘ñ"£½KÜ+ü®¦¼ËdÐÉÁ`/’#1×tÄì EfÇŒ¢ð˜/ÕÞä ,⾡; >c ˆ@`mE­ó¾nû긓Vé?ZRrÃUn•±8ä:gæ:ƒâ@g%‘JBŽjM©‚O»Ê>ØZÅ&›S¾ô¢2×e:;p™|îÒ#÷2žyõ²%¾IóknNàÁ¥JxÖ—vÙ¤q Õ|ªa¬²jÄ“•‡ jè#Ñ€dÎu]™¥©ÌàW´rОÇÕ[Hà°Õyš‚ÿôŽÊ;ïje«Z º;)“39é‚…Çeý×w ì|ˆ'[áåPa”°"ÞMêÌ®-8E¹bIíªöÙ5™çõÚôYw+Mâýõþôm|ô}`ÎõŸœ4݉“þë‡ÿ”Eä endstream endobj 191 0 obj <> stream xÚ•XMo7½÷Wì­+4b83$‡DO-ÚZ mßâ Pd%jIޤ$Ðßá’+ïZ£ÞññÍÇ›ÊÍÇ+?Ð0ʯm–›æ×«æù p €IÞ7Wïåó9X“BsuóºE&ÎæèÛw÷³7W4¿_5C)6_ŸLt€C³i™Èýã]óªy©<,ª$ÛÕñÃj{¶7XYè6Ë&Æoí>XU·¿ßïÞÍæÄ¾ý¯\þ¼[o?lÛåùp\loû›ò$ÖÌȶ_f„ínÿo~éº=îV›²b½Íˆåª³øù‹Ød.›2û¼§GoåeŸÏlÏ‚$K.d²„²Õ«íj¿8ö;^ {5ãdÏ„ÿ€ÁÄó(¾{6ÈuáõìYÙùËíz™£p[,½é$ó;n×.jHd+O›œÝäs7»½lMïu4à•äb«¹ÇΨFo/$•pàX êš0XƒdBŸøk‹N¥T¸Â%®‡}F2ã{“ÁÛëY à}‰êr}mÁ­£;=x5ØYQŸ6YR93Ü®ö}Tc0Ϣ괋ý~‘q_5O=:•T±â²aªK–R®B{\ˆ]yw[uR Y^`W(ùz,üøX!"7â°ænŠïòó×rW½›ÙœÙJN_Ì¢Ô⾬ºY‰!w‚ïBØX–ÓÈ´a Ëî‡>ØÊùTqËÝf³*Îö Ú=½1!zj-ƺЈB”æI.férûÏI"åLÖ­ø±7Ö‡ãzyøŽ–*þ,d¯r[ËýnWV"r[žj[+=bÌ6 ۅˆ!ªíÂ(Ê–t²Ø-UëÃØ÷Øþµë,îú68aûe¿ìnShÿ–ÌojÁ<žñ(Í$É®Xf< Tsÿb0ä‡1tRÏEÖÄbLn1s Zo­Í6Q‹ž(È[HÐùÃ:~[´é*5`d1>‘ˆÁ¹!ÒW$iHïóqI19öž4¨Ó Î)í ÀOýM–+3Ô¸~…0[+×n$é²aLíÕ@aõ—Ävô5£Ã0²­!v9h@>ÇLÙ™qH0ž½%›*0:ë™TSÓ=¦˜ É6V‚Õ|Dß3&öÖiŒšûà°HADG F5hš³'ÆÞ¡¦`-ÐWµ &ëƒÊ•tH@zÉYç£SÓ‘TÉAdtÀšVÑjé {Òª÷¨JµÎÕÝvå_‰“H)””U¯!i)=/FfÖn ­ô1­ç¡ŸF:‰}À’”ƒ_ Q2@§ ]œ6éaÚ°>mÒpºl±Ô|kÜ`ÂxÞ`‘4”émŸnˆÑʦQ)?ä3¤|©­±î›Ü½uId؃*u÷=kD=-䬗ɪպ·“y’Þ+G`9[ŽþÓ7$ÙßÌeS·)Q¿úåÿo›ð endstream endobj 197 0 obj <> stream xÚ½YY“Û6~ϯà#•a‚àáìS*É”TvãÌKÊãrqDHÂZ"V¼•¿Ýh€‡ÄÊÉ–]CW__CÞï÷øÇ½$„ÿ·Ú{ßÞ{·?ðÈãœeRz÷kè_ò€e±w_¼óCí‹%ç¡ô7»Ãâýýïû{ïw‰,õŽžÌX™ Iìí½X°4qŸ;ïWï—à +dSëb£ÊÅR$Òÿ“ضÜé Á}…M‘_ªv!ÿˆMUý‘uõ¸S{;I•ªÎÛª6zÞþz($ÈPêÒŠ %“‰ûëç²:4ºqF‘¦b4‡'Œ§ÞRJÐ]¶‹¥$_|°j?Øü°¥¾¯ïnè¥ýéC½mNó«ü0ÓX5íQ)ã,Fß &##}U• y½ÇÿÁ£÷‹oæÌæAÊÒž©[æ;Õ¬j}huUÚ rl³dYDÃ…~¿Eÿ‡©_W]«KeçL0ÈB@މæàš™åã˜ÉÔŽ×ÉŸÓúw?ýûGzû´c_Õ jhFTkêh.=< SÑ„<Žø‡à/BdŒ÷YÊæ”ó ¤4nG°ÀǃÎÑ.·ÛöRü#Häv)“¥fÄ 8â1Ò B==+hB¿@Ž¢Më< fÊ®°c×Ôh6íg ­9y’0盢ês:&,uvèr"W¸tÒª?ð;t€‚žÇ]eì1˜üxƒ1e|*`Q9ѽ:†ÐšÐ¬5'ÁoºÃa÷Ùb­¦¶Bím¶@eäç»NŒ ÿõzÎa`J8çÓx….ÅþsnOs&|‚›E{EÈD‡í²jGÖua–"nO‹(/ .ànŽÁ¹ˆ ˆ'3Š@ÔEÁuækM½-i"Ôa+õŠ .¿ˆº”%r„º‰Ü¼^Ñ Á ûÎàñl€[”ØÎ'}ÜŒlìßæ+MÖ.Rá?/¢çq9ƒWr^áSðšè3BXä&N•ÌÎéH^<×"9Xœj>|ÑÓC&±Ás”Ø>ɪd±Iïeˆqä—1Ö+i2[ÂÁç¤OiÉ ÆDÊGËXœý5³'A½ìJm“ƒñ3‰ëÉèÈ!ÒøJV†¨=Å4F>4Á)Ó«8:ÑGº>›ãD ¯ÎhvY’ç(q0è$}F¿0Æ•ÇíHps]Zuz|ÛïêÔ¥áM-á–®J„ÈLéÙÕ«9M—pÀÂiÎP§ï»àýŒÊø¥³ªß±Òž¹…iômT­\ZxdÖÒ<ÈË YH²Ñe¡WÈçɬ`,‰Ó?ÇpŒ|`âûÉô$GUD×€lêˆv|°ÙVÝ®¡œ½åpýÖîdb÷{7”PÆDç¦_<ß ´Üiru®<µ{LVÎíîiK× ù~.|W¥vþÐ#¶¯ÕÿâïÁŸ+_bW¾¼‡a·6/Åá‹B9§ç.ˆþž•o§öG'´ð%xœÜW'‚%ÜQनå[ÕvuÙ¼äªú5PFöT–xMÞ´y¹2_’®†ó†ºšn§X³îv†ÈÑ$Ã*ÏÜÜ…xY›¼ôæ;íù›µÉ,ÿ_UWß H9E«‚^»ºM21 ñI½j{Z3äuÏððÇرè~àD7Ï•{ƒv¸„Ë2奪®6VŽ…±³‡€7ÅXã$ÞÒ0Þâ¹ïñOCÒƒ0&© (]ÀÇB°PLo¾ilâÁ&Šcº&g2ñ ˆ:ýưØÍì]|Ø»xhyèÁ^Å/e–úwo_w÷ýÏ4 ÿe€ÝÐM Ï2nR¹ƒªZotiÎsXËØÝÔiŠHh>@¯WRÐji†Øé]Ž>4§þº®ö—~HS£ Ã'¶®ÛëÛÛBïóUÓ_Ó(Da¤îZ`ô SEw zÝG]ïªãmomƒMG «·cØžþÎ0öz(ˆ1¨‚—UÙèÚ…hR߆©)㤯,EäFÿòÕÿ²Iu endstream endobj 201 0 obj <> stream xÚµYKsܸ¾çWðNE‚dŽIÖŽsˆk7ºÅ{ f0#9&©Uôï·Ý$Áñ<\’¶¬ò@£ßýhFß"%ðOF™‚¿$Ú죿ÝF>æ‘LD‘Ñí¦×øb£Ûíã¿·û½kVZÆC¿úõö_ÑO·Ìá—OüÐÝ ,E‘!‹4ÆDëÌ³Èæu¸„©Ó@¢LE䪦ðKnª~µÖ…Œ7¬T?¯T·Ý#&ñ½k\WmG4üêü—<ÚUÛu]=ârGëN0“ñ¡~bY¼°:¬Ö@á˜}Óú×­«µ•Yü¹a9Ûm5TmSÖD7´üûà¼Åk6Kj‘¦Þ¬²Û ¨¤ˆ7mÓ¸ÍP5÷ôŽkÖZ&$,a=½WÍšuƒÇ:GÓ“—L’èa×µ{šråÀñ<Ô/L4EµG"‰#ú²Ùz{“ÐT–«4³QfÉ&B60íÅÂo 'mÝù_ZpÿTv`7¬œ#Ê+ûê®®|¸_V¹‰!vÆHH,×3 <”HöÛ˜(Já³=_èí¡º ÊMÛs,Œ% µf~Vñ]…ÑÕ°¬<”È× ¿xLŒ\¤šóÝ‘~ÕÖ•ø¤âvG¿ƒ/|š³7£ì5fQ H3Ò–ü»këºõ«ú¿BöZ¬º~€2¶ˆY¦Ô$õƒZ–Ay‚åB¦`2ªÚŒsµ[ôÃZ KÆH¦°‹ ž(¾&‰:%HJ‘ý°˜‘C$’L£3F|ØBdY\å`jGEªs%tFÓý¿Üj‡E–¤qzšT‰4gE[–i™DcòA>ø(«"( žÞËnœÀP=íŸî<@o™†i%þä>ùýkêõ´”ƒ82ŒR¨ÞGP88Qõ?"íT"¤‰Hí›ÁŠɃÀy¯K„…˜¿¬Šu,©ø % ¡mq à¦?(ö`Õ¼a8¢É÷ÿWnц mÇ'™y:öµ “aÑ(k2U>{êV¬R9Ö²G™-iƒ‰€“=ƒë¦Ú½|P®ÂÍ3E3¾ëI9wƵPâ3"Y¢¦‹”÷¿C2û™ÏuÞá9f›ô:`[vn©»©©ßøpgBÁÄtÌs Xh¾!$hH›p4ñ¶êpn›Úçž«º¦™@º™¥ œN TÓs·Ä]¥ 2Zì›&>”ÅÞ]iüÃó\õŽUi¿9Úãåò–nHÍï"ÌL'ƒ0ïŒÎ)Róf‚ô;îÎ÷(žÍc c×ÈÐ5R/\ƒL.ë@Ç[^MÛªT³ÃY‰’¹÷”×¼œEp²ó– Ek¦U&”Y  œb 8­jP™Èe¤DF…ÿa$‘3I¸òa<•~‹„.òèvå\ÊÀ¶ 0¢¢}$ó ¤ã@ý'ú™¯¡L »‘  Çâk"³ ¢§é¥ô›ý4 s+¬ ¥/ö™"·¯\ ›.ððØ1¯öK‘£ù³_”Ê…ÊOù%ÔLi)T¶ÐL¿wÈ”.D¶PÍ"ɯ…Lióæx…<öôv9R*S"Yúü»?ÀìTþDùÕPAmŠ|©ZzB5å}­¬(^í5 Gß´7\Éò±ú,£[¥=­ ~£‚S¨ý,(C¥4ž}®”a `vBA¸DàÑcŠn{A½ö,@) 9b€âsUh¡&#ë/Ä~9Qÿ~ý L ~Wª?pH~Î!é«ÂÈ49dD¦Ë¡Ò¥¿­üÇ$¡·‹2–àâÝ2âáìÆÃ+ÉŒÈß!¼~Fÿ³ §|³pˆLNyDx­G'è$ÃËìL8õ¶,9b3ÃÝ41a¨cš1ùþÇ›ˆÜ 1"³MüÃ8pN7ÀœìH7õîûX"q#šuS*EÐíÒ±s_tö/ø+lÀœôÈ!ú`Ê(ßPýa-ÂÄ•Xaõ{d TûÎä³nS…]ŒÕˆ¯Õ¸~‚à¿k˜8„N:€2ÆÇZã;7T:vTÒ‚ïCÊ&g.*Í™Ø.»¦¸8l¤÷k€nâÞ·OÝÆ}è«æ‘f¶¾S›×n·ŽWû¶ íù¦ —+?C¬ã®íœ8ÓÆ{¡Ê,ëeزG-!¢hwDÀ.€§~ðwB|Ü’i®oþ<ÐH7ß´ü;÷í .£¶7¸.[tÒ—Bž'Ó½Ó°€õjüBÏOMÖîë CåõyôweЏƒ`‹Z¥£éuº˜Ã]ø–zì8ìÛf#5ü’îˆïÀ³‡ÎÑÕ·Ag4¹÷·z¨µ£65=›RHÓŒ6 *G |HBí¹»¼°ûŸíÌï7ÿwCÝéñë6ãí^‡mMývœî]½[s/†¿ÆóóðPDD½Æ¶òw{x¿£xda̪Æ…eUÏR|]|]Ñ€ï"hÃm¤X~¶¹ÔC×¹ä:¢gêÌç*¦ªÂ¡°ùêI¼ÄÕnC½ žsÉOz¥rÉJåüaÊNJÝð7¡QÞDWù˜ß•uÙlF‘9üŠätu.aá*z%Íñ¡îÙ¿eßW÷(šþó‡ÛCdÛªºêî ‹N|­@¶86ÑCMffi¾Yî÷]Ú¬1Ø·]|ó#Ú,‚ƒºµžÖú5ÔÍ?öïËÁu•ÿžÆß2´+ÊÞd°ëHSú*‰â‰øã›ûYø)£«î+ú6gü‡Lý¾9øÀħ_>ÿãÓOÿ }Omï6ƒM’¶ ŽÔ?ÿéwkq ø endstream endobj 204 0 obj <> stream xÚíÛnÜÆõ½_Á§€‹zÇœû0n jQØpƒm€ÊôŠ’hïE^®$;_ßsæB¹ÃÝ•ä¤ `$ˆ¸Ãá¹_gN²OÍ ø‡fšÁ¿E¶Xe?¾ÍžŸ•„ •½½„×sZž/þ›3ÂfsJ™È_WŸ›ÕŒùíj6çZäç•\¸w¿o¶›÷Ëz5{÷öÙ_ß:¸Td”’RJXD•0¡´Ì¬3NóWÛÍíúÂx~&3¤¢(ñK*I)²9“DûõÛëÚo£E´1ÀxpË éEZEA­÷øÌ€Î™,òžÖ*À¥=ˆóüõËŸÏ^½™1ÿç|lš"oZüËòvWíê |¦yÕº¿—›år3c*¿oÉl.Î_Õ;÷jw]ok÷åûÙœ™¼vëWÍ‚¯×zå¶\4Ûzà‘À9•‚Èþr‚’Ê®¶ÕÍ5l• ˆtŠ ÷ne 8í/øÏfû÷¢¢1Ÿ…  oÇèßR‚`¤þý˜"ª$$E¨ñÿ \ËüèUéüe*+‚lgϨbù½L®à¤àÜ$*àµJÖQ|Rç­•:f/ëµÂ‡–¦&k½mÖWá+›nái€•Åjà>Àj³^lVÝǘw=¢üfy›tY Á]ê?K†Î¥Ÿ¹²¹ôÈ£Ú`9§%4Ù*ÿ´ ¿—Ù¿²ŸÜiB,6ÆTØ`ŸÙó=Œ¬òÊc,BsAЄzâ MYÑ‘Â2 ú!­ú…B¡Ä'Xév)…eöCŒ ‰Ý‰°;šcξö‰Â`Åàwš¦yBÓsaÑó†:]³}ÉcÑÉÇý:(·åi’‰a¤û2‰mV1R ¶‹×òböÁ ™ÿä°Ñš’ö»…ÊÝÐéÞ¤‚!-ú@›IWžCK®õ¬»Êžü9Gš@Ø.½öÇ ¡á‰5VŽÅÄÆxm(X(VP@ uQô»rý.E4b”Ò§(O 0Mô@1`…ûÊ9Ô£åqÅðAŽMÄØ"ä*&ôÚëxü‘9t~Š”0ï8­òÔ÷ƒ­)í räÀ¶RÊ1“ÊIQž&ò)üŒB”OöÔÚ4Æ'äJbïü1&ö[Ú;¬ˆÃöN%ņ’ê «ãÖ®RJaî@@†»„DÄ/½€#“)ž'ÃsØôÄt3!—P¢MæœRb j›SûI4/È4í¾:ƘKµûÍ®ÞLã¥aîeîa³%ªˆ…ðdŽÖæ|P›ÇäÏñhý+”ÈŠX O”ÎãNKE˜UvìñÜ*Ž—ÉLM–ÉLSp²¾Lv¿•ÉnÇãËä€1v´˜Ô؉ò)'‡ @rj JaLâ´#ÿ…}ÍíÙ%'J¥åÉ;¿ââÈ–EItžáýî€FÞ%8.ì2¬¡§^¤_ïó¡• FÙ›[_G39‘B’à§«ãYÿ×*MÔÉäðÇ1#ÿ(,ÈÖ¥º ²×Ÿt¾«|ùw0Zø~âÑCiìªz¤xGû“‡Ä }JüÍÖŽ—êUptÅð#°¦NMáµ´'ŸŒag·ù³1†gcS'ŸÂŸ|ò‡Ÿ|º·9d_<¥ò¨è&CR€X¤F€ÜîEåÏôÞÛ[OݺÚÝn«åò‹Ût¹Ù:ˆK?úkU;b Ÿq'Ó€éÕ?Ý+ñ{K:¤€BÙÖÏ÷äÝMQ²rö­ww²|–¼¥ýiïy.º³|î2}{ûÞNj|¨;O¸Áar8ƒAmôV÷ýrŽîç4 <â}‚ÑÝá؇QâqÐèîjþkVŽ.MY”ÝÛdg°GÁ™‡ÞwªÁUôÝ–ó¢(R⢠wà$: .Tä1qu ˜ÑüE³Ç`5sHdüISÇ$&"‰}[Òy“º‘,“nãI¡Ù³{Æ‚ÐL¸!µ¹WþÒÝ™–¡Mø>=Âmø÷uÞŸÓ¼‰þ ]ýErJ k· g$ÒSOÝ]l“¼±è®>ÞX¤.fæ’!c/’Gô¸©”_C‘D\¸xµ\&/Æ(¶CvÔslz†˜n2ý÷ëË eÐú²ÔÈ£ÛwåÇãptJÄ¢Šüów¯ü]rÞQ 7ôó6ç¹ Áœ•o‚±?ò^U¤Çfúa2&Ž]í}>}æH¥Ü›ÅÄž6ÝDmïÛíñæÌüÓc®‰ü*ÓcLŸjÿ/'4Ê: ¹ Ú°Ž©¹¯¯&ïrÁE¥]]¥êu.ÓS;Ê‹ág¨ª‹‹Ç,ì=¬»y˜mS½—Õ7K{kÿ¥+o|é#òífx¡ÍûW›¾Þð£f$Ô&ØàGeÐËõÇëpŒ†ºÊ‰ÑAååf@`Ñ"aÔ#_ò)Wò±bX;†èÖœq?hä&aó…9°B°ÈpÍz±¼µƒŒõ¸Ü@Š—KjVG@rê 3è•ËÁô@3Q[j[[º¨Ù©5¤£9ª_Òd™Qä&kcM}ºTD˜”7mª T>¥”§T7º<1ôµ¡D…¾‰ŠP[lGDæ;¬T„mªˆîfµŠðd™¹’°MÇ ’G‚›ÈP&«ÓÜÇ3K…Âs·aõ¸ùá4èàäæÇÎ(ÿþ»ùÔZþ[÷óõº6„J‰‡·5ê@[s ·³.·?±Uø4CÎ0ߺ¡ýnˆ‡nˆÿÁº¡Ò# ÿ× ](‚yÏ•Ö᎖ww£?ýéd/S endstream endobj 207 0 obj <> stream xÚÅXYoÜ6~ï¯Pójƒˆ]HûÐ6¤)Ò¸OÝ•µZ[É®´‘´±¶ÿ½3œ¡¤õÊI€¢(l`Ijîù†Ò{ïI/„?é% þC¯Øz?œz'O¥ñ¤Yy§køÈPd±wºúÍWþ”*ò/6»Åï§/¼'§Þ{Oè,õ®¼(©± Iìm½X‹4qÓ÷Æ{=£`$b%m™¯Ž$g¡Ðj”œ¡£ÏI‰Xò6¿^†2jZúW‹@'Æÿ "ÒiG@Sm:ô÷[¢`ŽÐqìÚæ|Sn‰z•÷9ªš~?ÿé{¤þñõ!ˆ´Ph„«¬ë¦Ýæ½ýxò4õк0Cs#…ô‰(±”onêf×U y¨',22õ‚8¡´,UÝ/‚ˆ²s†N?ëMsµ´+m¾»$‚ÏÒ``yЭô·Wò³"ß=´I •XÏ"ò¬hêŽéŠË¼eë:ß–ËÅ£9¥N„Áè¤"ÒVÆã²+Új×WMÍ ÑÔßHdfJ~zYBØcí·Í¾¯ê’y‚‡"ÎÇH;,3:²HÄ’É‘´#=i2 •@bÅQ±ÌG€5Fë¶Ù’(^èËëžF ÁlØ‹#X{ü< ÉjÎLã õ°@kÅx”“ùøÈÐßå-¤¡/Û¹%FHÅ.?› Éø¹Û-P^]bp¤äàÀ€†ÃæùoËQ¤eì÷ }¹º¬ ôà’L˜ÇÀÁ„£Ë‰?,Tê³3Nhp‹Òïú¦-Wbø¯šž°d™-‘1zý%T_`ŒvìÀ’0ÝU}A2ÀCâR±oÛ²Fk¬…ˆÇÄ÷¸˜ºÅf}‹ƒ‚C”Ø… ºIt³Ým ?›b.Û¼+Wôíªê™E¢WáÔ¡O@ÊkÀ2BßJå]à8Í) ‡‰c/Lp3:”Òþί©(ó¸ÂãÀ©ïfq¥â»q¥¨R”ñ7ýXä¸- ˜ƒ H¦`RŠÁ<.*–ÈbƒeM ÉÎ7´ZsEƒOçdIËTë6ÕìÛ‚Áƒw’‹š,]•ˆCùÏ×sq>RŸŒ‹vq©º98J˜âÕ¯/_ÎÈPJd.ö2í\Ѓ vl-NÁbž"žâ  ¨D›–6C½Ù@Ä©HÕ1NÒ/ÃI Ÿf[ûÙx ®Ìà$5' kC¾Œ8É'@2ÅIêb‘ê NR3âd¤˜â&ó8r‹“ÔŒl]U¿c”Ä"KÿJúÿ%èÀŽªÏNñxúØöcÆ ­E¨ïDªÈkü…4Á¢îÊžgkúJ[5,X–ÍŠVé+Ds~ÃbgÂÊêWͱ9S‘D._õ-½y[ЀOøvîÐŒÚßArŒÌÍ6–Ú$tÒ˜šâ[«1‹#¾õ€ovAN]€´Ä,{¦Pp/@a‰R"bC¼ñ0Á~p ¹ 'ë" …yQQPP9‚N¼ù"aˆŽ§ÿÀz­P5};×7B)¹…‡†™; ³Q$@h}hۛŢ¡: ,èóQ K°¶Ø[Ìú8é¿l»<q•Ý qÜ\Iyâ[ vd ¿9YE'.¸ŽÓò5ô;tSHJ"\®jHP,1E‡š¦b» wlxÖ"E~YÛ†FÔÕàˆ2ƒnãkšü1*Ètšº&åâã\®áNäõ-›pÔ0tÚ0®Ø¼ëö[쵬- ýŽ­%L°9ƒº†ŒåÙ&}°EÛ¢Ë ¨+o¹4mÎ 0¡®L«rÍ{gÅH[.›šÀ7T^4nî‰åbæ*NaøKÙïÛºû’ ¦T×Ác÷J6tŠöf×®°$r4Є¤¢{×û ’ës‘lÜjpÂ6ØÉDzm°ÌãÌÿÈÛ«ª+™ÛúkðÖÄ-BG嬻lÛ¦¥¥-¨Í/†XÞÚózÅ;Þ ÙEu@Ú?³'×9và‡wíÔK¡Âc&6a„[¸=ovåª\ãwÕv_ôCc><7ü ‘Œáûɾ<ãFƒÚäq›|ñŽ/Ê'V‚Ji§¤!ŽEó)Cwí|÷è˜Â±dûßdu~†f œJŠLMßð¦[ÕKÿCS­r³Þ½+<š÷cxCpÏ îqò5cÿ3úøÝøœQÀžÔóíe‰þ1W},›õ’Z.Ü[Cxø¨Ô <|qï!÷}÷Íz èâá÷å‚ßB 6°u÷:‹&Òï9{‚#ªjM’–£y_³}!„œ mpKÂÑ,>•æ)”›¾‹&ˆ“D¤™%Ö‰£~ýÕ?4± endstream endobj 212 0 obj <> stream xÚ­ZÝsÛ6¿¿BsOÔL„’é“ë$­¯w½4öLê>ÀlñJ‘ )Çñ»Ø?$*Nf:ÉŒð±X`?ðÛÅÒ‹O‹dÿd‘Iø/Ö»Å7‹×ïóE‹".7÷0½ÂŽYÜlþˆÞ^ýçb©’èòz¹R¹ŒvöK¹ÃÇ ÜÆ‰npà û*Ú·Í]åvÔ¹oÚ=,ÿ¼ù×âÝ ïüñ'n´´wGE†[KiD²Xe~ë|X‡K˜ZNšhQ¤‹•,DZø%7[g’Ž-3:6ôËzÿx &8­˜¬ìðWE–ºûÊ–5\\_^-W2®hêà¾LÖ‹åJ]ˆ|ÝÔ¸ÝÖwþØ V<:©Š•¨{ïál0ÚÑØÆuë¶¼óçuÏy¥Òm¸J”ÐÚ³¼£5U³”&zB¤Ž.€ƒIü‘¨åU¿×îÊÚ€Ÿï?•‡-µ,ªÈÄ‘«7«æ~5,]ãѶ¶µkXìù›è}éª ³ôº…_g‰’Ø ëmËÎíK¿õ™¨Ù›â±`•³ÚA©¨ñ¼ qWÙú/l¦Q··k´Wš¦Ñ»ak%ÃÖ@ú{@óùõ,®"ß à¼šH,@õ娩i‰úÐy¹qäåý3Q¶¼WØUMm)¼`ìÒI.´òÂýÚ:)€=P‹¼Ûw'yÔºOeë½A‚ŠªŠÈüw®-×–‡>=Z>Ö¡ôô°ÚÖ±ˆ°$2÷àÚ®ác8¢omýÀÔ°7›±ËçZ$»ómÇ3Ÿ‹4g ®Í€Z¤f¡©$P$èä=ѳ›¨ô«›è™MÆ’$‰€Æ°Éa eÂõMþ¤[˜êBh9vÖ§mY±ùú÷‡_ØÇ*¼•YôÄÞǾ¢NíÕ»˜Ù :†í¡¬V{?Þ°Éùjt€l˜`h;Á2cïz—Ín^ ØÎ(çK̈^ÄBÑyï-S†;hšè¡$4£‰-ù§­W­³{çõ˜TÖ7ʦ¦K¢6¡Ï.¨,Þ¶Þ0uø<ÔMðŽ8CF•Ì`Ðzhí®CÐÊt/‚!ÁM/B–Ekа{¾¸¯~–Gd©ç§­ó€e%“Òy¡1ÄØÅc‘ñX´ë‰ÚxOZ5'`pÂCÌ !yšÚµ«µí¹À¼ø¨± !ÃEYÏY‹Lñ´¡™ø˜K’‰$‡óh)rż|¤¹ÙbhÁVøµôC’¨ã¥>õËU`Û;ç‡>ÏÈ ¿jÎ/³\ä’Ï|Ãv‘Å8‡h’Õ$ £›DPG{°Ôê͘¦ŠsŽóLvþêùÌÈkröÕ£.x<Ó[ïxÏäµ$ÀȺuãnñ$„Û®©A©ÀžãQ®¬~W$·¶£Éfî›@ a¯à› -!³IS¶=™RDjüúß·ï®9Íø±êÔ>§fõÚL‹bÖqüE7N$ðd›ïç`:Á-icw‰ÖÄÛÜ)ÆRË»i{oÁKÝÞÌþ”ÞñVEðZÙº“\'ÂJoÙDåBæcÓŽR‰±t*ÂåDÏd²'’^¶€B)U@MlÛŽ~}k|ë]tìªkÏfÍ€ŒÔ„Æ{ô7lð&?<À7z(x›’k1Ÿµƒ¾ª´×æŒL.2ÍR’{*BÉ>éá+Œ q6ÍÐýˆò8÷©Ž¡TLôy©SÉŽè5Ü?ÓõˆYNlp’5ެ4á3x$7¶ë·;âà>#GMû—`ÿˆcu¤ 3*A»‰Ï\3xUi}¢¥Ž•QÂ+ó×!ÿ£‰±R {ª”qÚ2“np~~ßãU×ot´vNGÑ Í1{›dɘˆzXLãl„‚³éJK‘Œ¸yBIq½–d¬œàU¡©R­Èã±A‡É®yl×¼’,ý3†zÖÌ€.‡ ¸`’MètØ!ü¡GA‰þyôW#ô÷7ê™Fw6¤>J$ÕÄA’áÚf6®}Åã“'Tx'ý=ÁDp’,ZSà¸zK¿¿ÿ|uùówDe†’"@ e]_ ZÄá¾Ôó™~Z̆Ø–CˆÊ8„`ËÒÏ(xcwl-ìs0ÉôYø“ Þ!xjfŽf†:CÕ‘yH½ù”–~§¢A`¢Æ>6 %ë>)à£ÕDä!×{ ‘òCd°`¸ßÎ1³„V൙;*yöe.ÌŸúýÎi1ÇÔ”(Ïù•’"9…Là9Ò#vû[mKBÌd.sN–‚La‡¹jÐ*5RÈŒŒA Ö|fóÊ0£Ã×óöW=LøLã¸G¦†A1ìÍ·®cœZP`õêy™§Ñ,L'…8wó‚€*y  ‹‘ö9o—yî31™”·ã€>_%œ ôgîÃëŸ[2φ•w8íU€>þd£ø³J!+¿ úüh§bTÌ[Ñ©ÇݺiØ;ÆHÓc¤üfŒLãë"ž?aãõÇKj¼½¾¡ÆåҰ2=ƒ•ù Vf/cep/û}X©{¬4#¬,BÕü‹šÇÆ.Í—*z¿ÌeDã:@Û¦lÁIÝæˆËm4WFRI:T0Ê–«ÄdÑÿæÄQÃmº]r‘ÇÀ _ÔÃ<ðÀ}è³W4Ú ˆ%"+Nà{ ;Ø¥41vŸ‘d.›‘<ÉÀ² ù|ù,  eùãí!s¬¨åêÍ´ðôŠžÇE<é¤EÿnAÿ×I~ª9§²¤ÎZCÓÅ\›ÕRlD1ç€téXKX«¦Ûn’hë즯™OµÄeø«¯ð¤rÇ¥p*—ÇãLG‹8y€Œ­¡@‹kçí*I´H&‡¯…Ûtna×sá¶r–y` ''I slu(={Ñ×üÉÁîíº¤:ú2W>À•‰¾1“Á:æÊÀ[#K¦ ‰6ì ¯,] ­Æ¯;”Iy÷—¹¶´õhRª 5)@‡R–™íPhÆþí-åe0ô¾l±B€£t%rºøaºÆìUûh6¼¨š%;¦B úì.ÖÖV•«Ü®.Dƒ~‡úz*£·/i]âzÄâ×qî_L«„Ý?_ÑäÓ¶ì«)\†ÅûÇ»ª\WÏÌ ù¼Ô•—‚µ/ÿáÀèÆÉÜøÀeRƒßQ‚íá°óúõ¦ÜÙu'ÚÇÆGá6¯{á»×³c06ujàÆÓ{?­Áæ>ó0Y&rú“Õ{Ñoÿø?6„ endstream endobj 215 0 obj <> stream xÚÅWKÛF ¾÷WèV¹ˆ&š‡^hsHºM°Eƒ"Í ÔÅvV–w•Ø’+°IÐ_rHye¯¼nÑC‘Eæõ‘C~äPtðg ƒþÉ Sðå6xu<-ó EšWk8Žd ‹àjõ[X.~¿úñpË.¢D™PℊiÎ ãõI «Ò¬1ž“ h”q‡ÅI¬*aê0g`~h4ªô$09¤Gž¦ŒOÎ3öú4áé!0;̘Ÿ$<#`ÁΜ¶1?ªø1°œÛò²U»ög?\qNš@J0$á¤T*d•J@Ĥ„;n7»QêÏ@è"¹!lƒT‹<—›à}ðnæ‚ ˆ.¹ïjW=R]Qª‹BÄêœê ˆToí§e,“v¡ex¿ˆtf¿pHøR?P½]è8¶a‘xÙuíͦÚze¥YÝÐxqùö%¢¿L`…Ô¢0ÞŠuÛm­ó‡Ï_çÆ#.ÐÞÈH!ÁÞD$¹G¾ÿÜ´»¾îã'"2PB"•å"!ëÆQ@€®½[×àÑzÓÞ/ýÖmgww„øæÍ3šìeúã w¼a¯K»{æ ’*õnñÅeÛô *ïlÇW¬»­–‹oçÜ•F{ë%¯½Ž‹ª/»zçê¶adêl‚NàWw³\‡];¸º©X怡8ÕÆˆDÉÜ%±IÊÜÓŽ.3œ *£Jظ§õC‚šf®¥q\VŸÍ@ÞlX¹Ï"/.#J ¡Mõ”hH/¸ Ò+ÒZq6 ŠÈ,AFáÎvWuse©(FŠÞÌR"ÅçŒ^¡gØ8ä|½eØTŽx€ÿÚîãr9°- ´7Iø¡*1¹L ð»ºD‰;B÷»E¤ò°*k$éG17ºÂô§ž~ÄOè'Æb EcÊØC@´†{g›²zŠ2Ä=M™©dJúÊ ¡ÇòîdSw´6œMpMÛ­êÆnhѰ_àþ IuŒZÓÈb&ìÛ¡+YEÓzÂVìR”C©Éþ›Oîñ©n>þ+âô¬Gñ˜Ø¾pÍx¥ás‘OÝ:È<¼ÂⓌ!¡aS÷•ãÕšF²&^d³::żüÌlÍ™(³Dd#­«v€<32Ù_!À¬ýŶ+iÂ¥f7›Ö_Y"÷á™i)'ÏÌsªu"Œ:ªàxî,<‘ÑV9±ʵ*ØŠ úYŒ VZ¡ð%‰”>sõ‡G2¡²`Aà ~Ú:+ÂaÇèh}ãWíЬhMt"@®Ãä ãzñ·eMY.T¡\†—ë#•çlÀˆãQ®¬øcŸŠ|J©ígƒçÌãÅ«Ÿ®ß¾üu†*‹xd‰2Pº=¶ï‡mµ¢…»Û7Q+Ra²'£–œ‹ÌÌ$l/’N!p:Z+çUrê ôžwd²±p C>V‡†£f]µbôåz–ÓøÊgûØôÝœ™7âÑÎÖÍžuzE…Æš4 ù©8(ü=úÉ8è`yO<ßyX2¡ *j7\xÌžë§2¤ýø‹ BªPDKGuY†½ëêæv–cèâ±ðÝ\­‚_ éé‚ wZ¼¼Ÿ} ÔØÁlßánK#=IÞÄÍU R‡IAZÒËF©QéTÕÞvhB ¡Ê`Õ¬°çÀŠY;ìI¤ û¤ÓO´ýÇ79PÌ^‹Û/sÁó­:!¾ÆÎ¨¦¦T޶á]¾Å‚qÿº€¾ãæÞwÜ,Ûí®«ú¾Z±>ü6 jÚQ!Îö,Áª}Çìü}ê°—ìÇ&JâK™–²ÁµÐiÖ%Q=Þ­:qÏ#óÇ'cí4{ÿxšŒ¿TnèšþŸtü>¨FŽRg¬ÖÖ‘%°çÛOë_k ‘+K0s=lžÑóÝ‹î)ð ¶Á/¾T]‹y”áÏïîë¾bi*@¼ÿ±ìÉ ËwW]ç"lmáZ{;¦{ò@§ÿ _7ûƧ‰èöéO¾)%JùŸzQše"/¼*]Œèw_ý fØ· endstream endobj 218 0 obj <> stream xÚÅXmoÜ6þÞ_!¤@«-¼¬(’¢ti ´Í Z89ñn WÞÕÆªµÒF¢âæ.ýïrȵKÇMïÃÁ “"‡œ™g^8dô&¢Q4’)ü’h½‹¾»Œ¾|FyD))„ˆ.·0¿¤ )²èróï8%)á‹%¥©ˆ_7ûÅ/—?FO/£7aEÝE¢ 97 dí¢Œ‘\ºÏ&zý`0Y&»ò÷UBE·`4¾;aA)#I6ñ T’¤xˆ‰Ge¹€ôK&Eü›u×.X¿]°4®z¥¹–¤Þéáq‡V®ä2ßû¾»nªn¡:lÏ/ŒÐ_>Ë#ÍØ‚K'A*ˆF‚WïÚn?ÔƒS¥fÞ"XBóh)IpÉÛ®Þ,–Ñ¿ñ¶MwwÕìWæ[Kƒ³_\œMd¯ûrcÇŸÛñºUØiË]5ž ¨3#$¥œžK0àF KÁãòj]îW‹ÇAÕ%’A›»eOªaÝ×{Uê¸@øj Rp$g†üò¦hs÷ݨ궲kfXe”¤)x«¦Ÿƒàs©%¾ëf3àþ`:ÓNvÍóxËÕâý*.V À…'à•7õz‘fñ&ÈÀwú¾ÀŸÒ<îZÜ+Gw€½ ŸÇ–¢Z×àF¼Ú¹–Òǽ.•èuàèu0 ½Ž1'A›L`q,ZÄû²㪪Á%9I ‹ÀE¡‚¤ zÀý”Û”U¶Z$)4Gà4Ïpða¼1‹«ÖÊîÐa{@ØÀ_–ñËNUŽYi‹˜¶j5䪇keÅZ€¾•Å Z„sPÛzZSåFbÕhÅ8{9€- °wµºÁê Óð8šù.g¶Â( ¸\B¨-·LÓœdòÄvˆÛ.#³[=ÅOBDêOohâ<‰m6Ðc«¸­úüëúÛÕBOäÚŠ@¶ÃÆŠÂXQ»&­ûËø©üzÀeÊ©bÝ93î¬é=wÆHävß`“)êv_[W'î>Ë É ’q ‰IyØXJdîûùîüêÅ·?ÿ…tÇiº°…\6îLuÄ–d«áòƒVY zÜ3Û×–$óI`ÖIKÃ[Ô×®/¤Òg†t‰C+dlåi8¶Öj¥Ò)ÛPƒÉ‚åà•‚}Ì}ÓS#qrÎPçÔ1Š ¦s’gòû첩Æù›Ñ=æ›B\Ú&en»³hÙ4îÈ[$táÏÒ÷Ö)›>ý½Ü탉'\ÏqÈ*•]c>¦ŠÔÖ>‹G=ÖW¥¾xé®r;Ì.RzÀb×ÚC ¢'uÚã0÷ä‡ßjšï_!è½ÓwM³í»R阴 - ýò6ƒÑŒ€|D„IaHø¹)C¤Kœo&o˜‚Œ¹ͲC‰ŒÄ&‰Á(ZyŠ…Œ€3fcgoªçïúZáÉ*§­Žïv¸å‚í÷çOÆe#M‡hdÚ‡<0,RÆc‚À¤ÉTØ[; ÞÚgÈù³Iå¤È2[íñD†ì?­Ûu3n*|¦øjP›Mµ%7ߘå³Ç­#J¸ÑÝzt)ãéüÍcçØÊ¼ÉÀÅéd»ÿê ¨Nž`ðî~)÷é_pŸnyò@£fD¶¾Å©¯§ 5‡ªPˆ•É:fú?U·]Ùš`µp7ɱP:´ÜsÊ*v/HŸ9>S¶ã6~4¹÷£à¦÷I¨Õ_Å÷ â¿w¹.'^±ÎŽàq’Ý»å¦jª šç÷Ò™X™1~ù¯ós§ðäµâ„*^ÉúJ}kE~l¯ÇnòÇ_I¢¦è "ošR|t& ñ-H¸· /KëQ[Òl zê’ælÕ¾¯ÞÖÝh7Æë.~uמÍ^šà~;ªý¨>  ƒä!ùG'Ä–g«þC®Ú•¦xâï½24õíÂÙö4lìù3üc–‰|žúGß¶3)I^> stream xÚ¥Xm›FþÞ_ú ·fþ²ôMÊÛEIÓ(¹ø[]8›;“³Áœ»VýñÙYllÈÅR•H°ÃÌ<3Ï>;à ><ˆáÿã`± žÍ‚'Ü–¥Æ³xñÁlùgøGöPlŠòÉ_³7b ï?¬®?ý4‰´PáxÑáÃ<äS5ŸÐªo`Ä圥Âåø¸»þ”/ZJ3«Np´ó©¯øŽÃÙƒÿö+]c—ñ¨§úJøtÑ>R¥S9fÜcDcÕ<†+mÈ©BÈ©BôŠy B Ô"úVê=€eOO͘1âŽVØcæ±bÌ s€èG(íUøD2€H¦é0›k­×ïcvaÇ!ìQöˆt ùQˆ^k¿¥ë\îR>«vå² 1Au Ž¥ÕY…–9(N¹:'P Óóâä0>'°·û@{^ ŠsÕ0P˜~ þJ`O•õ,N{f¨Ï î"?'Ð IµçÅ :LΉ‘??«C; ñø+ïe¹t^ÎüËWjíß¾2‘«`‚éIÄ9¤»]o»°Ï“© î2«(Þè›ÀHf“ýz| >Œ`ô¼<Î&{˜Ç\WÉÃû ç’ŦÃyÂâô›8}7(2[ßNÀ¦ÃéÒTë/‡9.ÖRl°Ý† ¾²*sëm]]¯ó ßíŠî.&© «z¹›Ýún"E˜×MUÒ6$š¥P ôâÏÔQÕ¾qÏŸ\Ø7 †Ò#Ånšf:¡ï”¿ËjÛÍñÎÉ^4 ŸQ‘’Ð?ÅeKJ€­»‚¶nÖÕýÕÍ àÎé¶Î¶+òøáÕ”nö1Í©¡=5dW‹lëËjœø\@èÔÕÉ…q k}\OvõpšìËÕb×Î'?qÁ•t­qË´t™^äÍ¢.¶máÉ}r¡ûLÓªï>[Ai"µa]íÚ¢Ì}Ì} e‘€üÑßñU”‹ªi‰¯18fFøˆÂ—€$aum²5.R×ΕéðÛŠ¬mW‰M$Nlh ±áž’íņa$6—hEMDdeeŸå‹‰íthI‡ÂzFJÙƒìX§%ú$¿|åoê[¯.øFwR‚fAˆRƒ¸RÁ8‰+=Dc 9bHZ7yTj§xWµ9V d-ÕÓ®@ÕÎÖí-òÏ»¢Îý£l½îâüó=1¸Xfmæ³Ud¹žlè}‹móÛ¼ŽEY9ßeN-EV2iþ_OíHO Îý¯÷¤ÅödFz’§=©°)Ê;S¹=ë:ê¿xácÀÀ¦÷ε ûuÿ•«Ø×ÄÒœ` vØÃôhLorøÏ Ó)ú[:/oßÿŽÖ„Åf ÊËéØf4?ÑŽm(•tS Áa§»a§iØ¥‡agzïXçN“& ¯³&_ÒÀ Ï^Ê›j½®Áû¢¼¥,È%œ7ÇSu?dŒ1á[Fþ—l_ŠSØ”bÞÔ ïfþ{+ò>ã^0L™º"ÃC~bOiîÏçk:™ %]ßá˜À‹åÕwÍô{ØÓ8ö³ 3?}÷‚r?¯ê-V$c^æ4ªº¥‡—ø½¿¤Õ<|º»Ý5þO |> stream xÚX{oã6ÿÿ>…o‹Û“[›)QË6Àöº ö°Ý{¥ÀëEN±äX­-ù$Êɶ¸ï~3R›ÙäŠ Eg†3¿yгÿÌøÌ‡?>‹üû³õ~öíõìëïåŒû,õÓÙõfÆ%KÃÙ¢ÙuþÁ»ÞóeàGÞ!k²}¡Šfþñú/pŠ£cqÈüxã‰ìf јuÀYššö0_ŠÄ+ÖåÊçaÑ’ˆ¬Â1öjX ÚB™¯ Š4‰=}d—ŸìÎEì}B¶±W¸Tä±dqdäçuw»+\JÆ,憨¬H­^pÖ¬i’g*£Ùí®Ö"×sy?/`‘sï~[®Q­° ÉBF ˜”šóº®p_eeÕZ]ùH‹0`ÖšÙà3–Ƹ1!‹Ró'Ç=b&¢YO‚z¥Â\$á^w0öoèûVߡ¾UmF:à››Ã Ø^Ö¨û=m¬¦†Æ÷ÀýÙºTh‘O«9›/e"Ge;Kza¾·G®EoÇ©Ù5,K2SqGŠú¸ M*#–ð±EI‹ 𚬺3Óþ„(`Ql¬ûöýõͯÿå0`è3˜ÕGF ßn\ü„Ï"ô' û¯Ò8gÒÂÎ_´R™í„^ֶݾÈiQm3åÄ}ÎÂÏB'| :0 è|ƒÐˆ=Nb7uc”Ùíh¼Þ2rŠˆ}Æ™ “Á(ypùdòîm½s¨„&§€áÈ#OGcTe]éhL ̰GQATÂghëMÝ©²2­ªâ 5€RJï§b­Ê#²0·:Îa5ÛuæsE^ÑGÊ–°·äp‹8uBUÕ*3Vœ„Ú¹©÷.÷¦,ØZ‡¡K³ ×váX|(WþÃôOÛ«¹õ9„*D@†D€ -O80±$<Þûß½[X4«KÇž1ÕØÒèC¢ªMŒh·å‡<¸ŸÁP¤É0 X"û@~pß" Ç0ŒÇ0iª+ŽCC±X£pU‘éPÁ&»Ï©`~øŒ ÖÇJY‘ˆ^°ÎÑ8¡ †{·6fP¼®`¾Ô1ƒd§•L–¸Á””^ay—QcXìvE®Ï`†ËiS+ÊG™ôJ mKk¾aò”சˆÆ¨M„é&€l ÝhM} §}¦»Îñ•Cê…Z<+´Íh:u™» ö´k`Ì1˜öäqA@3°õ'°õ‡ÐjãD0±;ÊdÌ[0Ñ$BNºa*Ìhh»[zÁ\¿xu^´r¿­íj«iQåg56ÑÐÌô|)…àCgò&™XÜäÒÊt›5Ü»™v£™>ŸLáÑ#¥#ÛœõÅñÿÙ÷étì?ÐhðŸ#ƒ†'-<‚Ið¾VÚr±mâ`FM.ˆ…"¾õê½å‚(ÚQÿÂ-WËø‘A ÚÂÂ>-E<* ­nÀ`†ò:UÊ[B¸Þ1ââ>-Ñå̾wmoŒlwúB$Þ'c©Ñk ÚEZ;c§¯¿OFÎðÇöúG¡º¦rõ @URprš&ˆmIükŸà‚I‚ê³JK*° „æqõîo7o¾{}ýÚÕXA?V¶Gक़š[•5Ê,mÍ^[ å1Ñ/°ã‰ìûs錡Iê½™Aª¦{ú0T“yE§JŠ\Ô¸Ãɉ}ÉûùyR®M€'Íd3zѺü¡íÂSƒ7Ùþàl - NÞeÐçæ ýÂÓgRøh·„Šmnè»XkŠ,o'?‘D€Ê=^¸ÛѤ ƒïÞ†H]Và“j]Ø/¿{ûÃk<ñçÒxt.Aö^‡ª/èÁ¤gØxÐïßÎ÷<´p­¾>­ÝYºONÔ±ÎÔc´$­4ò»– ’oó¬ƒò,;†C—~·;Ü€›]}³Ùd»;‡.)TŒxT1@Ê ç¾)Uq"»-êoà*~<6ÜÆüþ˜.dœWÑ'yÖ˜"—€ìCø{sM¿ò^ši™p"ŸNÈ÷‹²Zï:LɊЫVåy±aÛËïý‹ç”eýLÂ]yûJ°ëÏ#:hSÊ êÓ¡µˆ¬UM·V8—Þ¯4`ã©'Pµ.hö_Ž7öcÑòY,Ís¸f‡Í¦Ü³)÷Aá/€µîA¤n[òbå±:à¡ü‘Zôýåj®—Vóå%®ÂçÜaª1GH+/C†Ü—¾æ˜sÌ\ÑBˆÉ²ùu™»ƒ=DTzÈ6‡­‘qE× ½{z¤;šŽ^í¾¼¿8çŽÔº”j —£zß–†OkFeƦPÆcÿAl9(®hóP‘5$HUÐ-W^[þRÔë«ÕÜŠ7ËÙ5í#×ÂlkÓÄÊ»2Ç_Zõ_ZýëÍZÅå¢ÊDÖ> stream xÚkÛ6ò{… ˆÜÆ\ñ!‘J¯ ¤h³h›¤×t‹.Î¥²$ÛêÚ–+Éñ.Ðûï7á,Ù–×éa05œçMzzÜ à{ZÀà¥+ïÛ[ïê7žaqy·3/Œ˜Š½1àÝfïýMU¬›ÙÄrÿþi6¾~š}C¡üoð'ôŸ†sZLü§Ùd4™¬Ÿ<'À§ñuá–;»üpû£Çã¢Ï>©Ò‰ŸLFãëûçÄx]fùÄÿ„ tÛƒÿÐmíÜÖdôµå9† Õgú_‚£0y ZÐ|¹ù˜å˼É?Ϋd³˜ø7-ß OZåͶZ“Áãr¯^…‚ ÊC#’a¡´H?ÌFcÿw‡ *ö°%‹4HFÄ:Ym–9[%÷lCÍD‹øŒ5ý6‹±Ÿß[Í’&¡Õ$àjéPfU¹:¢ª·Ó:O›¢\;¼N«bZ¬çC ‹H3cœ"hÌ*O² ólYîôŽ9‹”C‡K.­dkO¥ øÀT’…äœrÛl0¤”þ* í?à‡ð—å¬ï—w´·,îF"òsÚœ•KØä]ýÂ2þþö4ÎѹB1M>yJãm‚òÅj»"_ÛcØÕ¦*§ËÜÉšÁZW¿w{Æ;¡WŽÄxÞìÊêŽèIM‹¸‹rIÖ-¸r€*­O El—ź¥ÜåUN+tÈ`<ä1Ä´ý­Ë%-.xø">%¾ÏÇת+‘Çm!&£34â˜&¸@#åD¨é’°#‘gÅða1r|mþ®j@žSíŒuHòYV Ç×úHŒº H¢c1áe1â3 Ý’D‡FCsA³èô0ú IëN=¾ŽÃ/hfhÌ1;*(sº² UÈ•Á‹FcÎj[Kö§Çdl¼ÆÌ(¢¤·ò"ÉŒÞ/½_½_dô°œœj5›çXnuèÿE?7å2›%ÕôYMß¶($÷±0I­°Š‡åHþ޾÷å ±[^%MY¹ lzxìä‹…ÚŠÿõa]nê¢>4ËA[Ò ŠçXš˜IR†2¨­ùVÿ‰]Û.J[_Þ¸þ¿Gþ²>4Çäcšl0-×us´¿IªÕ{þUø¡íÓGÇsºv ÷;ÛÀ6¶£=ÚŸ•E¿¥Fù´(¨C]¯Â~Ó#žrI‡Hý9òmÖþÍëþD«Oجòªv-7òËm¸ž¬÷Ëz0ÈûØãè»ó>`wÞ·ŸYN–å’™dÄAý–Ž>íµØïõÖ6ñKQCBð›v»*æeU@û¬Y?4d¾»q‹jî" ¦Nkkô2'„Ž/Áú±• õvOŽ”ŽHôˆ´aF}ý7DŽ£ÕH~Qdlý÷ÿŠŒ%SæP¤9*4Lé^DÆC?YÁ¨Z Ť:áBíf(Ðô¶-]$¤ƒ83 { ·Xù.‡V‚ãÃÈÿ&BÈI…ƒbIH»E‘b¼XDÑ#¦èË3§ó>2aÏ ¡^ØqŽÓ1(igjG;7ò€ãxÙ› kˆë<ƒèSJùoË&§8lIC!j“ À¼©\<“~²;œ<8lŠ"m•Ôö€¿+šE+à {¤2Hã §+ –•«Š§N1à4î°™›‚ƒ˜q¿€Yÿ+hbšz :TŒ! ¢µóx}& b·Ù<4ÓsŒ@Bi†Yð“@š=Žn4O¬·Xî×Ö·*à‡1“A‘¨5¨E²®iÃa°ÜV©Ã¶Eu±¾£íuiõÈÚ°Ô㺰Y»ê ªMIå •³ÞÌk2,Þz\©|éÛ “xaº©‰€éøCC«ŒÜvY¹ëIýˆ™{ ŠAOãªeðö·×¯xÑÅ—;nZVîÄr…®=ç éóÔ`ýA|—4mF’åu`‹ôIôŠ Õ+êÒÆN‡‘Ǫs E$kü…Ä ¬ñŠc¿f´ë‚IÚp¾ÌJ»Ý¶ù9¶ƒæ6j÷Y¹…ª6¤£aº Šõ‘\¸½Ñ‚ê îMÛ|Aéw6]bLkL©4 'û0î'PWÔºŠd=Ó&ÐAͲ²ql›¤öb” .ºZÐ÷ çýC‹î1âCƒ³°unðüH±}ì©°þü ÓzhÓ fon4ûïþìzPdµ±å–Á/à@jO„«»±ÊpM\ÐÉèA¤7ÁMDAL-îOFö¡î“—´•–«Í¶±2Y‚’ª¨ÛWãv¶ÅºH æD|F Pľ}N@`]à+Ä=}@¾-0Àb?s¯C3WŒÆî|Ý½É ™††L%Ú!Óø;ö‚:åË5(\Ó®Õçç FP¨ýwyíV\:p½5f2zN˜ÄD¸‘¶B·¡tâ ˜àã íœ{"—8ùç7àj˜\s°<>ƒhéPø/F€7y‘W O7§Éä4ÕÊM ô¤¹uðÔ-¯æÏjbÖ÷§nDL–èáf±z1ÇÐæ^’Œ#÷"5µìO証nйÝ«{âßyÑÔ)Z~Q³†Œ6³ubµ… îXŽá÷çÓ”.á‚+rLxW)MJòuI|ê >Êô9>}"5 z—)a Ó€O ka0ìa2»IÁŽ¿ïÞ¼B•o¾KDÅÞ=0vâ<†HSüz „Û‘ ã Ðpë[H¶Ô­ ÷»B]¤ËúrSg«b™` ·`ûˆwa®ï=J¸¾€5ú5›WWY±JÒšUÛfó…k‰-vçß<Û^^W¿ø¾xµ¿°ÕWîeAp©¼,X<†ÛI—Œn€ls8ì ãHkf¨ò)ÙbÿòÅÿ~6¥ endstream endobj 237 0 obj <> stream xÚ­X[oÛ6~߯УŒVŒH‘”´½mh‹Ø€¶y«ƒA‘i‡¨-¹Ý´E|yHY¶•º–E~ç~Q’ Mrø¥IÉà/OÚ]òçmróR$4'u^'·ë„ Ró$s2¹]½OoÔ"+Š"mŒi¬L¿,înÿ†[´˜\°*ÛÝØ7fh¦ÈL!IÛw V¥¶ÑÝ€è+5´Fï­†¿Ñ¯ñi‘?O;eûGw±7Ü&Km‡÷‹ ¶ƒ¤Õ)ÓXµú}NÔ¬,‰` bIªzø}~7#s%IMƒÌ]oþ0¨Õ,0Rg´ ‚éÝÌY‹tPã½§x˜¦[õ;dÓ9m;§®Ó®L•Áãµ^¦ ní½úý ­þä®)´Ž ™ZµQf¹¸&²8ŠÌ¢ÈÍyצÙ£ú«úEdq…ÅJííÃ/óÜÒ+È;Ýé]³ÑÝâ¢möM«í“‘þ[1²eר6ŸŽm5åJsF*á£Vç­²ésÉ-æpI_»\ªyÈ%ÒÎ6]Þ×f@šáжjÖ‡íö éô|‘qšQL°º›õ:“’°¨ñf»ÿ²pf„•”ˆ*†PÉ òU™þàÜKó¨$Ðk”¼ e1õŰÇTiõ2§<æ xâÔ*3D«‡ ÕT¢AVùl³ÏOjN1jˆ/£t¯ë»Ì ŠoʘÞàyÛû”\)2ãÍ|ꜿúÝØ4µèÌ·¡L¿}fƒ…šBÝvuÖÜŠpçc™“²ô8´8Þv7O÷ª 줺OœŒ¯3Å¢fÀgžë~»í=Ù@À1¼N_[jû€+¸¬ .;¥7Îè…þà«,!ÐM¼ ÷N°2ý°\8烛Pb X­´cP³r£»QÜJ¦Ø¨Gq«ÓpÒà#*ëvLXL×ÞצªÄ9è¸!£Š°ú †úlgÂó0èns"P˜Nœ^ùI a»ó‘l›¹!®Ôe4cm¼hWX”J˜˜À mXûâSŠ ,BéYÄŒ)yºUk‹‡QWõO¼ ¥<ÞvíÁ Úký|j.Ç\wž`}ØãÀ…|¡†Èù!óc 8K˜Ë¹’6™w-ØÒËMbÙÇqÒ…EI`ÖÏX]<„†¥ nF°|–áϳK÷~ó[<'yL}‚[îMÞo`ɸ«‡‚‰pÓÍ,´š"Þ¸Y ê¥#§yŽï"ô⬩²Ý ,éŸ÷s²"â·ˆxC‚ ”p1¥l÷„|“}Ê‚Ì7”çô—È—ÜFôPt^! ÍõhèZäE2Tㄨ1yãSñ–~Zsd.ø\º¹¬N¾ÜYÿ‰QÅ9!6 Ö„"}?ª4ð2¶è6R§îà 4Àp sÜ!Œ$0áQ)ç° #”,6›S¨;\w¨“=n8Ñ{›@¶*å4‹£dM8;éËPg±ºÉnµQC˜] ˜Ñ«ž ²×MÃfš+¤‰8ªýuÖ~‚pyÖ¡§s!)eRÄw6?d]G’uoΆ^ÝeãwGÍÇó1!E]%.îeá?¤w ­J¦âû6y—¼ ÅH€> stream xÚÍZKÜ6¾ï¯ÐajÀbÄ7¹A `»H°›d29ÈÝšnMº¥IKãûã·Š=zØ={ó€ ·$’Åb±ê«¯Hg¿d4+áÍ4ƒ¿e¶>d_]eŸ½±„ •]Ý@sAKbáyócÎ_”2‘Ù÷Ͷ=Ô튗ù°*¸ùݱ{·¯«Ÿ®þ•½¾ò¢¨È(%VÊ K”DÙ(‹P'Mæ_Uë§ùÏÛcwßnœ€ÏÞÈ '.-ޤ’X‘LiÜè¯k7)χ]}¬ýã»UÁt^¶ÍûS9(¯,¯ZÿÄ7Çz=Ô›0¦¹«ŽC3ÄQÇênæ§t¦ã–P +ÀÉߦ4„õðÐþ<¿ÎS’¨"„Žß…jÞNIÛL °ÄÆöïaÅùç`D¥ó× ¥XI˜ }¯W¯@-Ãòg±„`Á‰`'š,QˆÐ^Û´4%JŽÊ%DP£òUÜ·MÓßvM»‚ÍܘB€ÿç”ôèÜ×C½K–w7øËó÷Ø¿†½[סå:o;0ˆÉ7uïW[ÚsŠR.Ió:½ šFÓ•Œ%…P"Ù¥­, e£Œ2-c¶EI‹AÀDMXhå-눇h’z³­{²*!@àcµï;?ì¦;†~n;|£nTR3£ S× Õ ¡tòx¦õ9—DÇ%6Î[U~›Z*'šÞš°§&L‡ös¶ä'[zâ|6†ð0A!„›wæl#0-=h$ @®A?Äïë®RJh3Å÷:t`€¯ÄjdÀ¶€0áÞ)C¸uŽ]pCqãdåbˆ‰¦=TÃz×´Û„@¡ ý7¸ÿnEmXPÕ‡%£?áï %8ºÇ&Á;—½ß×›”ŽŒj"G܈ycH¨)&‡X—°(é›TÀ b~C̦œ¤Ò¢Û;w~Ú¤ 6­êLB(ù¸Ô$Ü]5ø¾Mü„Ї"ò€ÿt³q¡sr! “¦ß¤“/‹&ëw¶§Å¬»Ã¡ký'ŸrCýèPH§…lH‰aóCgE%Ña_!hÛà–Ú»¥™zÔ½ÿ†öù±É;¬Å¨öÎUƒ\ï«6z¨{®’Žj t£ÿÝ­d “ÜÔ+IóµÃRu)Ä´&J…±.beþïwhŽ÷Mwßï?¬ŒÈƒB•×áÎå*œbÒWŠPyÎL g.Z9_€û³Ä…r5%¡·iTT/†qu9Ûi{™¸è‰·Ðçx‹˜€À-xS_—T´Î—áµïu´Ä-X°éÒQ ZK}™nÅ™þž¶2Ïóùy–#IØE°¸¤°‹†HàW»:éoŒXú nŽèŸ^Nj )£©wZDë1ò‹|­€WÅ8ä¹ýpð߯¤êÕ!†žÒ ðýOÇ ”†Æ>öƒÿ ƒälP˜/v¼ß½8¨CAÝ$'P°}ÑŠËþ}=™Â_:@Õð4œxµŽ©à•—ìñÅÓx=TÍ¡ù5ú“_ DRøGLÛ › ‚êå¢Ô¢^Sn/ =Y¨R€¼ªkŸŽ}"º}*ÄÎ8c\;S³áü„ÍdK¢NrJ z´y–ˆóì„ZK ÍÆN×9-ƒ¦À¥ ¢ ì<)YhuôÓUjÞ7øÂ|~ƒ -6¾ O°±¶Ò!D¤ó‘ÿÀ†Þ£Z‘?ÔÍvàA„¬L|A:pîÞ.‡c°¤$ÝÑÕR…òOÊ cN§PyR. 8ª?*…žÖ±jÊ O¥(¤7Ï%bVÒ‹DLc"ªç1%Öïn~Šd9àC—Ü$(9À‚À#ƒ »Äþ"Dç»ôì{RÐÀ &ó–L¤Ñz5±Á“îg6›^: –jÚjãŸi7 h[D÷29÷xÞ1[ñ“ó²8ýÇÇQ]4m 0)%#byÀ¬ÿœfn¦EÀnˆÓ²"­ô zö[Ê‹öæÏ– Wg:4Pĺjk ‡ˆg­j(1ú¶ê‹Jy~ööIc~Û•e;óÂ+vñÄ{v›ðE¶°œê?Õ¸$ÞÜúKáïÞ†‡ã6ÜåÎ_H¼+,„qèë‚VLÃqä6û%#Üšìï}Sxwp·Jl|ßgßgßéÞâá .~ Å9BçR¸ï«¡‹U*ܧJ‹5Êm·À°»¶ŽUO­ðòcóˆÏþÞ ¿!7ÆwO¶#Ûxžè=«úog×Ï(CÓÐ ©[¼Ynxbó ŒwP°nîkߥ•2¡‹˜N…?O Ó$Mh1½MŒÖ‰¾Ùa<Ó×ùΘPIUxî‚5ázþ¿únûC>±<¬1ˆ¢…‚×xS{û·ÿ™†ðÌ endstream endobj 245 0 obj <> stream xÚÝ\YoG~ß_1û62³}YäÁœ`wýÄÎbhh‰’i”BÉÇþñ[ÕÇ\ì&‡"EÊ QS]]Õ]UýUu÷PÅï-ü£…fðŸ—Ëâû7Åß~ ´ ¤¶Äo® ªLMTQQ^+ \ýV~œü÷Í?‘ zÕV#“¬™–ZqÇA#‡„«c‘ØŸÕ"°pÇóòMñ{QskŠO5´&Ä€nU, ÆlMD|^¯‹Ÿ[fÆUmD‡ÙˆÚÐ>³ŸLg Q"§n ¬§-,tãÈS‰Z«BÔÒ±üê8€ÆYAëÐo@d£9é dòQ2-XL öª’y퀨RDÇiëžä%sƒØ÷u%x q œÂÏ‘”·im Š=Ç÷^6¯-8†bŸÈF)aµ„Å`yMiŸY`æb@ÔHäÇå4)NýœO6#þšn€œÆ8ăg>7mJLE™¬ •kœ$6Y…®©é °Î pÃlÊï1o"0Qµ…U© öÅa˜43´髯ä0zjú4iDÇhG0æ{wiÖÖ Ì¢HMd—UÔÄ Aõ€¨‘¨ž€ólŠLªûœãº÷ã ÆDWDç Hw@m8OÇ0²#Í1Ö{çx¶d‰@Å@9ˆ<ÅÉÛ]¥ºë?U÷8+ÀŽs€;TùÂMî:&µxL*;^ŽeS4:†ÈOØ{c¾è›1NÏ`Ç*)^êf3:bç˶óU‰e…"´R(}üµúzË´c®ñS» a?Û"ÍCöÍ4ðÍ‘kàÛލCì­<«ã(¢N§ãyñ Ž¢Ä`ÉC•ˆ ½>áš9M·›tšk8>© á ®19sHF•8PéÔ%Ç 1àT¸-´i˜Ê ”òÖØô³R{7$E툦#"Bv]ˆè8:¦ýàrÖô𠔟"ùV°²îÚµ°2£ÁJ ¬L¬˜Ä£'©ð% ··I¡•;WñÐ&'㬹q t³AçLxw¼¨ýôñD%(xBjwá¨Ìf.¼6ä±Ô1D©s*ß1*u#î3ÁçéÚçìÁ§S>¸u·øÒâ%}8Gn}CŽNÇw`[} §øh Ž èl ²¦HÙnG-.s¡úؽGuGjGÜ麉›±¯æ©d™å¹öy‡•Æ-¡ì•kÊâ6F$}åóÃü¦žTœó’ç²|±òϳÏÓåÝbæn¯ñS”ïaz?¿Y-g« ÓåÒXy·¾}»˜-ko$J$ÞWLÄK¦×óå|1]/þ71¼üfRIƼ@aDy7©˜)gëëÙ僧tT¨ÒÑxT²¼œ®<ç[ß×SWÓ‡ëé´¸¶ëÛõ|XLfW^ÊôÞ³6ʯo‹[œÉ§ùêÆ“^ý¦À.Ü·ô¤?º CøÖ5ãj¢&Býr¾‚)þLtQÞ®ýoËégG¿˜¤œKÁBh'w$Ÿ|SzÃóySŠÂ7%Rzö4B¦ ÈãaÆ× ß[¨¸Š¯¸Ü€”²|ï‚]þp›ôijºÍMl·›C?ÎO|«›Ä7™ö[ìKp Ïw°‚µ)é`ƒ\´f‹ä¥€Å}.é½^¢ºßÀêO°¿äHc€_Rƒ“D¢çUkÚ2-Üû¥°y oGœÍŸG\wiò+mÚ°8‡êG9ô}¡±q‡C£Ã^'=ªZw긙vÝ*Î"‚“¤n{AXòÌ–RÌqd_ÀQYóuÉŒž¤iCâIšØ½ac :+]&ýÈ[W4±¦úøªG.®—Iù¦xÃDoa¬2Ÿg?½›­C&ý8l®çSH¼÷IÈï,ømá»:xônŠÕÀlj/+ ÇÊç~º ¿-gÓ•«°2š‰;`jôbò>ÌÐó`¡¢Ë[¬G¼ìP+iß8‘^ÿ?°Ó¤üñÕOÿò¿MåÃêj¾†4ƒµ >¿ßM×󇙼YOïÞ%½b¡ &ú15†oAÇ †k2qDÃõÁSõc”ÄÅö[òðÿ@\ª+C,¦b…A–m,BƵåüÞÏt=»[ÏîCuè¬ÓÐØ·Qkÿ‚¡àªøT¡Ýº”Ê¥ãe!ðMAÖºo vÇßôÓ<~v·A}„ã©ë“i ”ï{þÛÕÁD/’&jìó Ú€……“Ëñ&ÊMX ŠÌ!ÌY±Íõ¤umÆõFmCiÚ¦Ýéê*yÍF1Yy–iŠæ 2S¸Nô—-Hf}ÓGQ•EQÖ\ªÊoñCç–•i—Õ.Á;àYíª}ôŸûéNŰ½Ùn oó`¬’T”³¸gkØzqˆÚÙÕ ¢’ÌMJl+Ï5åAàËTóUz†½=›°¼¼]0Ýy¨_]݇µ‘§UwíÃÁçíõå¶¼Íe›ÛvÔºM·ÿ>éPJw¤{32Ýg¤a}ÛvA˜îS¤u]e üÌB„c?EÜF"ç—ζ¹Žº°„2ƒ>©¤a¾ŽÐ| ìç¿ü%‚Pã endstream endobj 248 0 obj <> stream xÚµXYsÛ6~ï¯`ó*cÂ^MûÐ4Ǥ3m'±ßªŽËP”ÍD"’²ã4ýïÝÅ.xHtœIÛ‘f‹=¿vé¼w¤ãÃO:qßɷΓsçô¹ÔŽ”" Cç| ëžôE9ç«ßÝ@(,<)ƒÐ½Üìœÿì<;wÞ;B¥‰sã„©H´ÙGÎÖ‰”HbûºqΜW3"ÒÙêˆsê  œS-Txçˆ9gmµkê7 OÅ¡û‰Fšem[^VÛ¢Z(év8§]$ß["Xe]F£²¢çÓ—¿ü¸P¾ûÓ‘¯ëf›uFùÓ牃’ýUñX—@ 0u9»­ê][¶ÖRR_öÈXÈÄñBãÜRV UH®¿@½/Ø ¥™¹l²ÝÆøB1ÆÑº©Íœty¢+>t4±ô¥Þ0G„> €)@ÕòdĹ DHæ8„Yž÷…’ Mրǻ¢™óF¬… ؼsæËíôŠÝ"/QÛ¢Eî’ 1!ÂÐ}[ä%#·«iåæªÌѦ+R­ß—¶‰ÐêîËdd=‡´5okz’¥±Òv²zÚJ¡5Ë_Õ{¸0îQ’Š*9Κœ„ÙÂ+8NY•È!eu*¢ÿ(e‹Õ%/Ü;Eo¢ElÏ¥œ)¨¤Eã:¬bÁ*"ŠlùvàAäô$‚n”; Ò&1ŸB:ùZ<[ƒüà ÀÝRß9pÏæxÙB™åˆ`˜ akƒ7öl®ŽªSoÎ_BAz÷%„7= ]ÃÁŒÌÏŒ´¢'lgöÕôìk$¥®§Ë ƒK ÌTÒ˜M¯·'¡b7}GCÒH¥¡[TX’âˆjQ`Ðîaô^þœuY‰ ±¸ü8äx¸-âÖniØ+Œã’’x¿Å ÆèRÓs(ØÒДn÷xGÜþ&­¯/P‡~'Tåiðõ¶™ÛÿßËþÌÑ~©qáØ¸ì.ãØkÚÝfeµt¯ërÅGÔ¬yG_jÏÒ£™ Æ Züaø ”C:uÜ3.ݶüXÔë%Çd¹à> stream xÚ•ZÝsÛ8¿¿ÂsOòLÅŠ¢¤îS·i;¹ÛÛ&o›}PlÅÖž,¹’Ò4ÿý¨[nr“̈"A €Ê«¯+¹ŠàO®ÿÑjsXý|»zû)]ÉHdQ¶º}€á_ìêvûgpuýŸ÷k-ƒ7ëP§*È»®ÜÕ‡¢ÆÎžúŽms_|1ÁCÓò~ý×í¿Voy³/Ÿ¹Ñîh; »‹,ÁÝTd…Z…‰ÛMÆãDœÃäñ„;‹Ì¬B• “¹9·ûvN±ªbÞËúøØSó.’¦b²²Ã§rz=VyYSÏû›×ëP¥Á5 õÅ÷Ù|±c«‚ëžÈ7MÛõ0¿slƒ\Ñ„Si¡ð¼‘˪¬ O5GÅ"õ4ÍíÖßpá¢Í+f_ŸÀôvÔ·-ºM[Þ;~‹­[9ÔÆ ÞB©E»%ïiNÕ¬• žPïa+KÔrGϾhe÷°ž{*û=µr<"E½ ›‡pœºAÖöy›o`²[ߟʢÚò’îláYäDIËŒóó–]q„U†­ïÈDÍæM«Š¼C=h4n-hÜWyý_lš ;æÔ—1&ø8n­•ßhøìv¨>7ŸÅÕd@+‡3i 8zð¼oZ¢î"/·YDùðL”ýž÷ò»ê¹.…ŒMZ¦"ÖN¸_›©e ä=µÈº-Y·Lƒ¶øúX¶ÎQU™càñP´å&箯9³Õ—Žf;–aŸ–DV슶z˜‚èÛ¼Þ1õŸlÍvjòi,dÆæ|Eтŧ¤L¡¼ÛŒp cWÚ£–žBÎV@#ˆ~ZÜD›n/l2•DJq“ Â@Ëz÷•‘š8±šëÓ¾¬XýŸùýßlcze<±õ±­ès} &¦'ú‚@¥¸Éû²Þ…G×ß°Éøj4—ÇÃÚN° §x?˜Þ‡æ0w@9\bAô,±gñÞÊ0ÜAÓ»’ÐŒödŸy¶E¾Íïݹ&•5޲©©#'QáðÎ&Xkçõ–©[¿Î®nZ‡Äâ U‹Qk׿‡A+‰, n’$Ø8øƒF~dÇÍÑõ“4 M=?í ÇL+™”ø…Æ;`‡EÖaÐnfÇÆ{Ò¬98Aƒ2±€†dI¨ê¢ 7yW ÌÁ‹ý@O•˜ åe³ äX$š‡…ÍÁ§«ÈDÈø‰•H5¯å"ÍíC ¶ü3§IÞÓ‹“úÜ.C¿ì`œ¿‰F’¹YKv™¤"UÌó-ëEeãtä£E4ÉZô€Ž<‰ > ¶yŸSkP£1šsŽË‹œë¹‹‘Õ¤l5z@]°x¦Ïá=“Õ’íÖ3º-ÇvòvC JŽŒwYü®9HîóŽ˜yh<€ø.tÁw/*ZAfcŒãíÈjíjjüúÛÕÇj~¼ú ÍsëէɲE;ÆþíX*X“•~\Âi‰[Ò8ïÕ‰î«S¥–³Ó(ræ‚=9½zv\:Ë 3o4³-Î’ð3j¥N…J§ºä bCE–ÙÆ#^È#%LAù÷A:e9®(;§²&È;zNrXg8¡ckݸe6ŒÉH=iìx@“Ãob&õ!).ÈG ؼ•'G€g¸ »RI2²ªséµÄÌɧ s…ñ RóÜÜõ8ô4É¡oëì·z,èu”þá™#òy\„q¸wi49Óš†WpiOæŠX&ôÝRzd ÍñøeÉ”0~èÂJ ëI–Î=Úß­1´Åé%5j,ïˆô h%lv¦Å$"-ÚA‹ÐCXžh:¦Zºs-Mï+ÅeÕU`P­lw¾ÎòÚq*dBê èÔéñ™•á¤óf‡â&VÐ^Ì®dd0w‘t“ß»ü>›¾ž@¦‡¤š'¤‹A0oƒ2}ƒ2Í%4Pø¬ê¶Jê™ÓËñj1<ÑÉUe×Ïã’gó€s,éŠ~ÑTaû'.˜{4TØuõ¼Nuð†#¨Kµ—c+°Ñ.óA)¦vÖv^ûÍó—X6êUîÅ i¬ÁÚeŽš­ß®›ÂæÇ ГbôÁ뤘ÕÈÝãø¦ÇÕÞíX&ŸævÈ%Ô«s m"”ÖÙ å ×W¯O0_L~¡ÿIƒÒ‡¥àš‰Ô.% ”ß»Ê<ñIîHÏŒ®–Ò™¯&é\ È7¥q] òoÏÁâ±ÈXÄé9t¦TuÙÀs{ÆÝ¥ëä‰UWÓØÏÕä)f²=8LÖ§‘¦°Oô¬˜Rðbrô¿E±Õ˜­] ý*ÖÌœä¤zP6¢\,”|SáŸ9_A°Š g¦]e½ëP˧uª¨$Ã#ŒNæCê,Æp¿Ô—×åOëP‚Âÿ^²G-’1ßB·Ãsv¹°,è $gn½pÃAFž^‘ÉùÕVúB©_N#c/ßß ,€ Û—XЯ‹“x(6uf¾„(VH¿ÚìœH¬JNÔÊáúÊ_‘;³µŠ‘Òž"%,g—0Åù¢ÅŠÃuöÅ÷ÅCƒÂgÐL¹”.1¥¦<ƪKâCE`½'\-úçñÕD|ÊCTtò…Áˆ‰â ¡G†¡k-ëÄDÖ>| 2‰å‰Í/©ä˜.…Tpý2/“KQbÂA&6æ×à8‰){—á¸<£àå$=.²8ñÿÇ–“½ %ò€€,H5GÅj}Z!O?VlšáÓ GF2[F2i²1`¾„dzR9.Åm E½œÅíïùáX-^öÅÙ?>”@¶&\Ç'âºÑ HZ: “ìtå‡-a‚sÊšú¦qþÜéÆ6MÛ\y6õÖÅW·t3nA•½ãz¢ßÉ­Ép}?¹ZÔA·§ôšó§†S®OåŽÔ¢OngS÷‘Ärk—* ³P™Ð‰ú;¥Ù'ßÍR—›µpË9ûp¤ø‚Gû+{ºdñøÂw _Üy_Ú±äõñØ?ð½"¹xãGZf¸ž” =•zaz•-bö’ŧdñøqœî‹¶v°ê7|_íš*ÃS¡9xƒöø‹~³‡Z»¨wÅ;ÎbI¢ñ`Ç;~£‚«}°.q¾Ë½}Íc7È|6¿¦ìþù†Ÿöå‰þÀ “÷U¹©žy)äÛ:†ò¨¬øSÌ}ù× ïR©ÅèZcñ»&J°ïûã»·o·å!ßt¢}ì1ˆbûøv¾{»ø;‡©ª ”/*›-<÷ñÊC( m’ˆ”~aROýÇ?þ·š endstream endobj 256 0 obj <> stream xÚµW[›F~ï¯àWñ„¹CÓ>´M¥RÒõ[·ZÌÚ¤68Àf)?¾çÌ0ذ¬TU»Ò0s¾sÿ怃O"øãðÙ1øe¼|Ãã f‰1ÁæÄkÁ&Ølÿ ËÕZ ÊÕß›ß'%jV¢g%f(ÑC‰Õ‰¯%ÙõQêÁ|g: Üê˧ùUðE¤ d4‹c› ±„o¼ˆ”ä}¢„i×*¤xżw9¶ÉçsWõO!‡U’fI«Ð³H=ÎHñE$yWÑ"r9w}ŽÓÕ@ÍV¾CêÅnvHCUZÎÝr¾òæÙœ·üLf‘ñ)—‘¼¯Ás®kæ•óêÞÉ~ÛÐ4RçP\MãHZÉá4“ zÆ98ÙNÚ§€É$°Xy qÇÀHÛ~n‚÷>(òóXm~e=Q,IÖ“„EbÑúEÖÓ¦<ÕÕ‡ÕZê$ü‹‰È£{L›¦Ø•Ǽ\É(l= ñ‡üè7Û´M=´(ýúúÝ?#ú×DÄá}UÓÖ%ðòM`É£ƒYS4B3»`n¾–Õ©)šq ä@‡[/ˆµâ1‹¤Ó)ÊÖ7zpç"¿£œnÝÑ®NO{øþí ÿÐë|¾kòöò0½Ëª¦;ͪ²¡ólŸÖdè¾LùíêÕTV"D¨}„¯ó&«‹S[T%áõ0#Í5„oöX{.ºzh‹2'Q€[Ú•÷”“(b¶Spà}ð°õÎä ÑºFƒðÜhˆ† OmE*´Í¿´þé6âê@Á;6ÀêØ& TÇ0å‘Lû‘åùÁœxº"1á)­¡äm^O•èsÊîíDúøAAb —³×zÃ6$~8u»£?Ç;¡Mø1Ï 2Ráã¾È0‡Öas‚5ó¬À¼óÆ«õv/ Š*}AP±Ò2Ë}æëX`‡®y,¤®˜ìRwlžH_ Æa\ÔvµpÍK廒C‰FÜ)ÌB·¶]$Nå°Há°] ~E³&œ$+¶<îë_NE("fl »Î+8úŒÌkà™tLL‡ÊõÀµål“ƒ6¹ºŽ%C¾Áv-I¡ !y’2,½¹-m}!¤‚¶E–¶UýÃ4K#ÿæ2§¼9K攣Ê]‚džÊÅGw.w×®?'Ù,»j¾¢K3'Íþ¿Et3‘=sØÌå%ßÝOr#:ßÜ!}Gþ‘¿;~œšnœéÎHäXÓÜq˜R„®ãÃ1ßúM»OIœúeXØîSäôç¢ÜyJ¡Ø+³êH§ [gÍØ‰«#¬3yÀ`F=ÝÙ.OJ#-·KÚ>PG`Oz u’^%»ÊàÏ9v~Ä5Ïxß&O3@Œ/wu=τՋ£\j²ä_ÄSÍž u=Є5n ¡¯ó@ÃSY¸¶](ý@;KõsšÄï[=ÀL_² pȱÁø?ÌPv5ÌDlh˜™~˜ÑHÏN³‰Î)¸‡]ã2øÅÍëÄøµ¸æÌÐÇÔÇÉÞ ô#%ßîh\b³Øj­”š¹ì±Å¹9ÑÛñm®º^uän;æòùªKºê“Œæð%ýß Oò\˜Ÿ°ÖO^…_5Íáà°P }ÚŽ^"Æž®…Yž8‹*éÐï¿û¥U endstream endobj 259 0 obj <> stream xÚµX[sã4~çWø ‡i„%Y¾°<1À ³ì%o”)®ã6¦‰µvwg<çèùÒ¸ÉÓi¦²äsӹ铽÷žôø“^¬àxùÎûaå}û³ñd Ò õV7ž4" ½%.DÞjý‡¿Ú‹¥ÖÊÏ*ö7Y“å]Ñà’ôÛ®)«ÛÅŸ«_AŠÔc1e(â¦ÊvSui%TÄ4í~±T‰_äåe â% –ß>Õ78j¿sVuÅ‡ŽžoëVk¯I(Mš²ëŠŠÔ‡N,–aú—þ/7Ì儎Eõ¶/e˜ ¥`ÔÂktQ­ÁÐPJÿ¡ì6ø¤üöÜÑZþkÎ7I(œgÄí§¿ÈXÈ„)¾¾IàjkŠt¶¡®²¥1kÛîXîû½ãb^ïöMѶŚå•Q=lJ ,Óe-s°Bå7લâ F)ö‹æ¦nv-»B­“±[²CWï²[W;Ýeí|Ï#ó&¡_vârÁÎHFÎ@r"Œ¶’_ÕÝ\"¹¤íé(iMÜ?†(&f/ßn÷WhMq•µÕ¾©¯ç”À>ût]×äÝ–ÔT5&¡I°H"SÀøwô®Ûd{*ˆêQ²¯iõ¶Éöz–Æø¹“[7 L¶iÚû%{?ŽE½®†$‡(u`œQ‹È(ã_—û¬é`8 I”l+ñW‹j‹ÈwÙr3Y{hø‰ö’ì>p =µ-v´ºÎºŒ–3b1ÎjH9+ÿÐö’øý‰èã-axrðê݉ð¤±Ð.:b&–D0J’·EwhªöKòÉvˆ‹B‡à+Ž`inÓÖÐmfD€ßòrþæ°½À…p`íëÉNØ;ùT456¥(õòæ¡l æ.;"ÙCÃu±Eƒ2Ö]4MÝÐÒÔf·®gñN†Ú¬ÖT|ƒf˜Tuµ$íÈõÓŠÎzRŠ9¹µB+F -BH Q„è8¶÷žÐiâ=x&‰õ ÂqçEZ$q?ßzï¼73:zª^O¾€^…õÃÝ‘–4&i‘A "}VÍ@ÖëqyµÔqèÆÁ î`ÐmßpBWàb¢±çŒÐËÛj…<÷Õ¶:f²ÒÙ¢ v#4åÝǪ޷e; …>:–JÁHæ——æQ¥\Ú%n-HñÍË zèyî¯Ú¢»\¼˜5T •ðcÑæM¹·YÿÅ8–gq2nÄç*qèNPÛimÃý;”ÀuÜØèð0ÓqÁ(×qÀv܈:îžI"áºË˹î#bwb[5n¼ØsGްjmUBvˆHNÊ’êpÔ£qÊ=yžð¬L}àˆ‚˜lÆnP¤%fã<äðxÃT@]TÕ°¨Qˆ]µ¹¯v2¼¶,Ûõè-,v¸ñ(6ògÃ/ãH$η˜”Ç*¨‘¸§`¹V+(º·§U@^Ð9„O×[:¥)9°“ª1à¡PÈT¤ãHä55ج¬Ú ,Ä.iÅ­yJŽ@èR­Ë<ëêæ»ùPDÿy]C³¸Ð‚9|_Vƒxv—œd*Œ ×Ûg%Ã9ø‚¨âdRÅòÙ,z7cQ<ä `‹ ç,jŸ°³×‘Ì¥ïD?æ¯ËŽïçú…Æ l:Oo!‹CкG:v™†±_`ºÉ0§ï ºBJák+¬¨Ë«ˆ‚òvªÄú1Õü>TjDžŽ¬Û'oƒN󓆯½¡6)é ø}œôМok†âÚYŽ‘Ÿd@øt$žNf€:…Í$ÔL(ÿ#8{¢¼¸Øýî&b[3•EðÁ%®‡çÌ ¿¯wó½Á9ÎænjŒÄVŽýß\8]Y7+b“µîºÄÖ8í»Úmh”qš2n²7ÆjÏ´7ù¼{çäÌÞ(nú™öVÚóú~ Û–kþ,àWE‰Àœ„N —CM, ':ÅG½¶÷]Ûküœð8ÂÚ¡÷p¦`OCw¸v mzènÎCwäf€î> stream xÚµXmÛÆþž_!¸J§-—ﬓnb\œ/j| TÅ•–Vc‰¼ÔÏvþ{gvfÉ¥´ê9)‚;€ârvÞç™Ùü<‘þä$ àߟ,÷“¿ÞLþô*žH_ä~>¹YOd,òh2Ã…dr³ú—w³UÓY(sï®hнêT3ý÷Íß`— ­mi$‚xãŽ9ØlsHþ\¶Ä¯3ŒÕv]QMƒÔëp)ó®æ,³©ßíÔž^êwÓYœx?©eÇjzÂzyÌíÝ¡Üub:‹ÂÜ»®;e„¼©®è©@^âuÍ#I,;Vkyhź ³<z$q¬ XÖô©2­qUa䩦hÕ ‡ÞCÙméÙ Ÿ›úЕ•r¹P&‘ˆvÒfww«YÝ¢ Í|!Ã)™HRÐ4qhÅä?»Äg]7{‡´ qÄ$+µðeT©–Ü–Kt[ª#OÍ–»¢+µÏÁIí¶>ìVä‰!h@}ŸýÙ¥$¢2¶º¼šß¾x{}ûæõµCÓ$‰Ñô3I½#IÍšdt.« Ñ,</¦Ÿá‘-¦¤Ô¾¬Ê}ùQëÿÜ© séö⟿³nŇ߬ۛù—é¦e`‘ö´ð€z©r³Õyo²Ü©°$…£Å”“óD›Až<‘›¡ÈLn^ºÊajÀä×ãÔÛ4ÅÝ–e45¼íiÝÂô¦Ù9ä±×rT–%fºji[Ï·hÛrSí Hè-=P!AYµgKŦgHe™ùO˜©€¬u˜ëÌÆU`ZàCz z\lã,ñ^¯i±ìˆ¦l]3)2@˜-?¸ ,ŒD˜2ÑqëŒ=Ý´,¨iÖ¨}Ôi„Ÿxõ|­ È(MQ³~ÌIrìÖ"‘×`À¸o) òC¡­Ö5˜ÇÜ!kmR­Mj´£ P˜]Ü¡RnG‰ÝŽÒ³Zd¬ðiuÊÈýÌÐá÷}Ú#ð®Ø¸8´2ÝUñQâþ÷ŽÒA|õÊÁ|êçV¡Ž«šž.ÿ.ÿEÑ0l“[ÕÊ4 èª¿xvè­¿¿mUçNtiR³¥X[åöÜ×kX ‘‰^Õ‰øÃ°¡·èd¾ât€9óx§óÓÝ›ÓDd½û+—†v¾¡°Gt¯‘³éÔú°*º‚Ç•]­sFãÏ{ EXx¤ý t"wM  Ang:}EìVüJŽ€ð•Õª\]ÝP›5c^*Ÿè?Í+š]Êì"žrB2Ù³»¤í.?± ×NØî“™º×LÊTd™­‘üÝ4zëÐ(r³Y†Ç¸ eìÊ hQvúŽäcþšìøÆ!^J&¾Î‚˜À:`á ÕvØë® /<Ðâ2=l¿Àë¶Àœ¾§ž )¥«™US¼ {›e;¢ýÏ3v@¯ºÒ™ÈÚÝÌ(ªÕSЦ½¢:)écðûõݦæ#4šcäGÏ€l€¼3Œ3'ÿÓÆ¤ñ“3K3§âvY·N@KGZ&ÐPÖh¸Š…ÏΨÒÚð5þ@ …oÌ]ÕhkO(Y²:,8ÁÐ3üvfÌfIfÀÔÏ¢™#rÔ¡ Ü’ 8ÁŠ<ÕŸggÓRëù“3¶A2éI.Ž E­6 —,ìÙQt¦Ø³qÓÛqµgO”z`—:æn7Îå¡ÔC.ugFKþŸŽ_áà˜o1Œ)!o„G8Öf·£è¨V0›Ìž=B¨®ñ|ÿ£êMåZOzG}“öyÞ’ö¼åP´´J“‰R½¶‡åRµíú°Û=¥¾¸à xÊÿuò†$@ OÞE[¡èÛÝ á qMQ4l¤ûQ55K­Al3ã„îr”ðe«ú¡«šá>z[x©_qcå"H-½—[µ|o´wÝÂXõlNfG ¢ãƒÚËÅþÎ '¤y2HñýÒ¾ð…ýÃ\KÀ‹Åª¥Ïáp|ÈBº!ÒáeÞð™yß¿~ów|÷–¶à5„n”@³nê=·vV¼‚¨V7ʼÿ8SÄÇY€áZÛ&ÀÍŸÄé’?bãÀÜýTõõÙ$2¦F¹m ˆ×‡ˆ¯Àà9:L3Cj©°õ¡);=ãÆ-sîÓí¹(í™i7Áó»ùÕKº¡˜¥ÐG¾è]†YhÓø~;ý“äÃÝ^àe€p–OïPþ½¼¡KH™éÃ|‚4>fàÀ“iº?ÀȲ;à¸øðMÛ­Vj-¶Ñ»}ûªòˆ*â½EH‘š®{¼SÀƒÈÚ®9à .†Qå=pÀ×? ë>§_¿Ðãþ›ÝóSÑO±ä«c׳-ÆlQSÙ54Ë=4Ç…w_—«ÅôTú'lô@…À·ÈöëKbd"Ýé"†"›; º¤oßÒCƒ ”i§ˆ?UùQÕë{Dg¦ö/¼¼˜:x#7¬yƒT ï’·×ë5ø|à{ÑÇ%èƒ œ1C›Ù°¥¶DÚɽVφ’}f4špšŸ3™t> stream xÚ¥WMoÚ@½÷WøV[ÁÛý´£ö)•Z©‡ªÜ’Š0 `Љšö×wÍâ°xÇŽë $ð¾y3ofgvåàg543_ÌÖÁÕ8x÷Q@IJÓ`¼@’Tqµ ‚ñü&ü´ˆb:ü}6ÆÀ]kN´6.+Ã2[oW9ÉÊÍÑÒu+5aµáÛÊa.KëxŸÛ…üùàÁ>̳}fÿÝRõêbW¬¬òiZæ³ý²Ø‰y9Û-§ËÍ&˜©„¤pr·ÚNvy6ŸÍÛ]1Et§@”8šLFk=•m,„&’›rq"åÁ-'”¬³ýìÞˆ#«-Nq§FœëˆéðwõÀÂUÅ, ‹G‹­–SanÁE±2¸1þU^_íæB˜”•ªÜS£˜a•~Éž—ë囉 Ü]/¦—Q,™/ª2jŸoC»ìc‚‹Ò ÜAÓ&U½€l¼&.XE­ÄRWé…• ̵ôœôq?c. MT¾ b¢rå¢= ¯ üÊè&*]TµÖÈ€² çòä™> stream xÚµYmoã¸þÞ_!ô“ÜÆ<‘’(é¶-šîn‚Ües¹l(p>Z[¶u±%¯$g³ÅþøÎ ©GNÒ‡ V9Égfž¡ÏŽt<ø'HÁŸç̷οnïÎdàH)’0tn—Ð?•žH´s»øÕUÂz2•R…îj³›üvûƒóþÖùì?‰/N˜ˆ8 ‘v¶ŽöEÙÏóÑùyd‚NÈL’ÖÅ®*?=Q.aŒ ;íR†B&/©ïIýåýD+7ݬ&S? ÜoøݺÜÜÕYsؘÞÍËZÑ.©4-0ä.Ê=ìÑ{ùtèãlòflõ2ði12¡OºÞeõ¼ÊwM^f@Ø_{(’ /~»†yƒÀs+8‰¼È̘Á†i@nXFy\û6/p)¼Ec“xJH;`æÉ XÔïó*3]éfcÇ™þv3ðc‘6©é/ùù ‘kdsØEí6Ù*«¦“Pƒº}¶f×<ðÿ *|ßwwi•n3뚸GÕÒ3ºÇ”a`Da„ª¿¬ó9íš?/¯ùIŠ y¿I¾¯Üz]î7 |h]±kìÛ×Ùâû1Û`Q&ോ:¿¼¾;ýxu÷áâjÄR­…¶–~ãYwbvŒ »Ùù´u¬È5±æ¨JøÚr;¤Õ)¸Îï°å¸›^ÐǰJ šS™çˆtöܨÓ{ÑpHω#ðÒºI‹yf–+EOÝR&/º¥o—N™hdù>DhedÈê¨oµ¯<7-xª}TB­å’Ÿµ„†kÚ^hlðð¿¢ZíŽfi·û_ŒY¨<¡£VÂè¥Ya¢TÕdÜÁÑß>mJ::–{<&¥zÇDû r‚ †Ô¼ä#Iበ€«[˜OÞð¶¼Xäó´)+Ž>½¼Ê*=–ÿÆ£.`u‘Qô°Ÿhԛ풃„šˆÐ×Í(š}»›oLL–ˆüÃ,ú8bQÔaÐfÿÎËQlxçöá;˜ßï1Œ¿Q)B«Ä#" ›%*b©û-#øàlLÍüèï |®SÄô‡*€v“2 B[Ó c«y=œ„öžGÖ!  ŸGNÖ®Ó,#-/µ†€ô!ìû3Z•&ôúÖr<ù‚㈑¦?‹5D@’ˆài< BùB<‹°aML¢Çð²äh@Ã90 ¡ê4úZr/ÓNhh¶r¯Â€q@‹Ž´¸wP†Î?od^L 'À/̰ï0˜ñAjOxŽÛgRÚF³‘“ëÓ¶¹PÕ T´S)4ŸQþûèÙªÈiE˜:6!EK7[¬èM¹xXk˜Κ€À?CâŸ,Íl¯nØøŽÝdÎ AÖʽ„I­º©ª´°sý:v. Mä›ÅN/®n0¬ ±jýl¬ÂÝáþ¿¾NÍoõ–œÚts4î%r æÃÀÿ/Qݸö.êQH8·Á+ ‡¼Ö[™¿£ïÄ6 É7Ö`Uƒæ!fj›)áq2B|‰²g ÅåR1 =²†Юu<âÉ'†}”ÜÇî¦ÉÝd`©îŠ7ü¨°NÝI ‰@æ"G4iß#àsf³ Éë›Ð=%}·o9JS6é†_6³ oé²ÜPâA…ƒÿÅk×Çpk]ãê—ËË1%ªƒöÉ€ø}R3­c{Ø=O ߢ4x¦ n+ØPóÑbâ—Š(l}îqÌt)üä8bâ‰r¬ûD¿–üäuÂKG”ÛÞðDj>O”{R|D½vVJ*øb2¼qR‰\Â01d¼‚(y`‡mÔ#¬Æ@סY"£}$’Ä‘¬ýO#‰*x)’@²Ñ] yÐ1úÈáyWÐÇb¨ÄPe.hu}Oíq%ƒJ€ÊëºPqÞn1z“5ûªÍÑ}#˜ˆ¤ß­q¡ÿÜ5¬ŒzKw;_góû»þÿp“¨+ éHK#¨’Q£W‚lîcÀ@éDè>‡¡†a Ø«ûæôêüýsçÝ^h„8ðŽEß–ÕN¾òáŽ×‚ "ð'Âéõ š¹§ûŠø%­(¨áÈ·ëtÆFÊw/HEû?ª™Í>à|ºiñÝ.õmI…g‹Ü”l3|I÷šqO–û`Õ£˜”>C1@ÌêÆè;SEXÃà¡o¥þÓO⦪ endstream endobj 273 0 obj <> stream xÚ¥Y{ã¶ÿ¿ŸÂ¹"­Ü[±")QR6Yà’¦‹w‡$» ÄÁVkѶnmÉ‘dï^‚~÷Îð!ѶüÈ^¬ørÎoHŽ~ÑQ?:Šü£éjôõýèïÿLF4 iŽîgÐícEŒîóŸ¼oªÕJ–cN½¶ÿ|ÿ/ Z‘4ú„D\ÑßåTŽý0æ^»0…jÓúÕÌ*–­¬±)ô²å¼ª‹v±ÒE£¿¹lŠy)sMÔVºuаÌu9Ó]«¢,VÙR·M«¦ÕÍÓ¢žn–Y[TåÕØ‚¤¢)ŠR(w”ð­œD‘Òb¾\?dM¹®«Ç‡ê „R=`„†`-0­Ê1‹½í˜%ž¬[T‡Ç†9O<Ðu^”J^hž×Ùz¡;”ŠðÍô§”-NóŒÓTõ“&o6E›=.ÍT³ª6CÊj8Ø1&Ð¥%ÐÚúFRG¿Yµ\VŠSQÎÇ>ç yÆ 0þø…öí½q•oM¡žkg¡à;$Ñ"&Q2ò#F„^÷ƒqœ2à3qD`"5f2‰Cp\Æ0ôj¹^fSÙèV™MÇLxh±y2ŸKM5ñìbRwvfV¥¸ûTïÃÐòq[:Ëÿù|Ô|²zzŠM˜j¹˜~át'$NM÷gƒR‚ "C0$؆vÂ]¡SÜ‘^´¡¹ ÜÎøb˜³P„qð»LÅ IríhÚì™ùB›æyQL‘·©.2³8¿ÊºÒv2…ÿÔ.>Ž}tä l^åˆ,8áúáÛf÷ÕòPN˜8« %Pèh¾/P¦äIâmJp5½Ö<Þf½V’¢Ü<ޕܱ–êÉQOK·«´4yôi‚ÒNÐÌŠ°V"ÉÚW¢«&öPÞ×Ç6BÐŧCñBôÿóâñ¤o¢b rœfÔ¥j6R#NR»»nß~ÿðæîýûïÞ°€©?W3Ö wuGÁÆ ““úžÝ~(c¨¤(¿£3çVg(Ñ™õü;ßügHgA„]™Ìl޽É%ŒîOöîûÓ¼6ñ>‰ O]TfáPrÀ£ò"HœçѪ4êe›—bYdõGM1“2ÌÔîÒXQVj»ärhX¹ž†¤%õ #-£1¶9Òr%mH5Öq ú™ >ØÜ£)ÖN CY@’SZ én68A@Ba~Ž™ô îQ$›k(١ٵ+t4v–¦¬ÐiŽ„š$"|Ϫ®iyÃhöBJŠ]òshÃIžG›86"cð*† ìÊŽÐBŽrŒÚ;¸pA²=5 —²1µa ¦ ¢óÁð¼ÀœÖ ;¢" 2t¼F)$äc:Ù*}ÑI-P´º‘ž’–†´÷Ëa Œ>MÜaï §a,Üã%~‡i(&â”ê¬KEQ´ÄpMãË#!49Eý0‚ýË\:™¹›¦©§²møê„ &áÒ~“&n£H2[Ð G¬’K¬®-žã)%ØI8°>ìL0’°?˜qÌYÜ„#ŠB/¸ä—ôæ7ƒì”O„ò T×øš{Ð'|Û7ƒËx!&†2™PŒ¼¦Xˬ†Hœ0ƒŸˆ ðê:À#ÎH÷ÒûÝãˆÎ Žõì»á¨ÉÄè€p=è€ltÄ.è@5—+Sb—qtR†F¿H‹c°†—åvDrvð|‹AÆq„óèóœ,À›‹Côñy \¬Á*b bk°vüz&e—ʼQäÇ l»^H(X°Q"Y°Q­þÒÓâ&]rq"ª8ÒÆG¥åç°†’ˆ]Œ5§yZã §LgìAwJ ŽRbHö“‹°Æsp Ïdí ¿ìà O4ÐàW Ä;4Xê€ÆœPjç„ $™-8@ƒt.Ð`· PØh5“ø‚ô#9·L£nGˆÇÛ˜CØ4ü×ø4žèaj×Åk€IŽBŽÐ'Áß9Ät»—ª¾à.ú|û’­ÖKyÉê½ ð °ÈŒQ•u]Íël¥+Í¢ÂÛŒgÔÙE–ÖmT[-3…@­ƒÁ¡£ÁÛV¼ÞºVÓá•çR®4AQ6m¦îsqœ2|ÿñÝ»78â›;]°\A ÑGÏý›ÔY]©ÉB˜´ô¡÷ß!“‡‚P šR•dM9t9f½ó¯¸åA÷¦ZnU&¦”4Ç[àôh7”7¾í„¢±AxêZ˜F´?3\r#œÆ'š^‰eÎÈç¹.Z-[ǧxJÄiÿ\”Óåò?i¾lÚ<—3²¸Q£wnÿ)‹êBÂeñx %ØõÉ¡cݽKûq-A,MÖ´õfÚb9ò~ÓŸ¢4õF¶×ºô?ýÙ>äY›]²>7e^mÔ5;–ç¯÷8½ìò‘»|PtªU&*C>e•ˉ·Å0ƒ&ðÓêúß&cÕ4û7Ø Õñ€ÑÜñ|âIwFy8£š±7¯Q*ôVYQÿªÈ‡ÿ†§= B÷7ÏŠÇ­V2•;z¤Ûʺ•/†p;°j/aî©(äEgòâJk\ä2wÁ`/íP˜˜­;¿Òd<…HØJ­Ì’ÿ_e5³K¢²P5™i–Ö‚GÔÀ°jãÂÄ»5ë٠¼²Ÿ÷ªóTä€á™›»“õCd?$TnØIõªŠ¯ú˾ý™ÀTJïD®‰‹dfêÛ³bm]±Œ&{ÊJWÙÉÿ«suhÁ#J¿ô?To]ƒsÀˆWûz~ž_wž°ÛÍ'“òUïIWÝສßÞYÅÎDÔýùÒ4ßú7åÖv½~}dÑ ¼íÎ|0pûSñóõ¾é#W |€’;öþ „{ÃÐt}fúÞÿûíÛÝÓ!ý›ö¡”/­Ù±A»ê6dü9ËYþ… Ã&Ÿî6{0úeDxšŒžÑ$Kð8±á5ëêËÑÝèƒZÑrLÞÔ+Z‚™S`#kÿº¨iãᨠQŠÄêtÕ%Nøªg|œM!npU»}?Å{0‘Q×tا†´²†ã>^ÒªwÖÒtæ•aÆ—Uk©cVªÊcï¿©ûþÛ¥qŠêQ%µä´Õ„kÈЬ@ö¥¸ÕÕ ;_§2»I€›Ÿ0×Yø"ŽI’ª1Qh©øÓÿÓôÍ endstream endobj 278 0 obj <> stream xÚµXQoÛ6~߯öRz‹Y‘EªC dëšu@€5ÉÛ<¤Š­ÄZeÉ•ä&ºÿ¾;eˉêØE EÞ}w¼;’w >"á'#áÓEðóEðü°åI× y,‚±a ¸˜ýɲñ«6Í‹ñ«üh4Ö2Ây–κͲÙM6aÙd4~u÷xhZ5ídôÓ诋߃q$¹2}ôÝxغ)–—³¬ÈÚìò¦N—ó ;éø·èê¬]Õ%É =¾´\FD¤{øÏßèÇ—(4OÈr9¢·×£± -{êS+Œ„MºXO›rV.;Âg˜7Ô¶ó ; ËîÎÒ6¥Þ$QáI®ëjñ€«Y]5Ù´Í«Ò3fʹίòòfHan­WYƒ·.Açe]] èGžܧ„r’É_QÌÑTª3Uµj—«¨”b‹t$ »ÇÉŠjÖgÕš+ò#³Œ&¯«æø¶yွxyι’[áÒ¸@riÓä7å"+[r7®¤ÈôAfÄ™{ï7žzÆ9<Ç[ˆÑ6â‚z!bo}y°j0»U*BEqà Îê†êEzbK…tÞŒ¬dUÝÖiI…Ã+‚^Ü(o—Ó_¤8°’›šl–‘Eå×8#¡Wë*F±·œÚsß¾^T«T<ŸøN}㣪iž'/޹…M«CÁ ULÂnØ‘Ó3mii4·¹47ë: ÄßÎsr-Y#Çšjji;Þ/~ƒ0zÖ@ZÜTuÞÎ|ÿ5˜„زb[ÒþÉ“KðA+ƒgÓz' :éªùzÈ‹&ÂçrÐÉPðsûé¼[“‡¥z3'k:…Rõ ¤üá€a› ¾>ö®à(Ðìo¨«É6c«Ð÷²É“+PÝ Üa3†``ÿ†°½ÃpQ2d.àAT…ñ† nÔmhÛNÇRÌz³0Øb¥}°Xp=aˆÊµË! e¸yåȽ.$ùÛfw4á. wåË~¥0j¥ìE-E¨HxÒÐiE>Kó²¡À^{«$¸™ÿ$C€ëòr–OÓ¶ªéùàѱýç-çGg<\´Ž ¼ÜÀ{s‰¾¹Â„ëÎ]gƲ› ôïNB¸7—žFâÓè|@#³‰Aþ(“€¼&‹Å“k¸\÷s€Qqïâú ÇÒžÛgњͫˆ¹N8Æ[ʽ¦ÁÙ©…ug(¶t†âKvÜH8é°Á’†–ýA1¶É„­Úï[|†]W5ÿ“ÕÕøºÎ2ÂåéMšCVìxóË)ñ\ŒlÄài@‡ÄÂn/‰ç4mçn(bçÕµ» o=‰!Š œvVLFGÝUç–·É?—K¼"É”5c•„¼ó×#ûLß¶Ï/Z/"Ózl<¨;™clDªo:ütfAŠ×ywä´¥á³lYg Þ–¡?a'k޾ÇiÁŽxKkÓYÂu+¢ž÷„+/T×1ÚÂAû¥ƒ©D<6ñ[ËÚ:M¤ÅÍ>Ž l ºC´î¨ß}÷ÏK^Œ endstream endobj 281 0 obj <> stream xÚ•Xm“Ó6þÞ_‘ÃÔ)gÕ²-¿½Jé•ÎÁP¸~"LêÄJbαƒ­äBþ{wµrâ\tÜ1Ç Y»Ú}´oZeðiÀüñAìÃ?o0]~»üò‡p¥^:¸œÙÅhp™¿w^Ά.ÿôX`– $äØŒ[©:&Þc |ÆcÃôÔ0ôõpÎD'Ä;º/œBá:EKcÖ¶ë¥ÌéC-2CÎh¨ê¡ëÇN.és‘ ýÈÙÕ¿}MÖªi½4«°·™¶‡JŠŠÆ[Îá§‚E¡úÖr„Ý9Í1²*¿ h¼ ¥ºH˜ëL-®^«yMlAÐ!‡Yш<¸9÷3‚ö΂š"7t6C/×ò0 «Zõ ‘3#7éÉu¹ð™—ôcô­Të¦jm KÃãp(Ù-‡<æu…i^®ÆY[­šz2^deiÑåÁïò¿1HÌi®iÖäE••…).r ]8éŽk™) “ðÜ™Õë*7~ú³FÚõóf£ÿoŒQ‹Ù^6sæ›N¸x—p˜<"pæM¶ZàÔ'û㥲iäTÇ 0rÈü©êvN°~á97øEð-‹úQÄxߤӅœ^u†µÙ4Þ×ÔÑ*¢.zD?gZÓó¾D “þÙ3Yrž©bƒÀ½!C‚¶(óúAó¼^.e5¨ï2pZ ÓÌê ×XVB®î ¤ ù†(õDep²œH×…ZкêD~ËÊ"b±%n뫬œÛp{‹’±2D[C*.ÞÐ KĹ.3 Ý¢Ò â€ÅQßÞçoÆÏÞ½¿zõÆ¢3ŠY²»(ð– C¬%Md>—4›Ö-Øš?­3CÇêŠ# !-â8½%-ÂØd2ß—žÿ©±pwE´”˜K°ž¢nSìÃÀcÁMfY çqöb›-W¥¼ˆùÜ‘fþìÔKúhdÝÝx:ÌÀ¯$À"¶V5k¼ä4ë_hÀ¦PO õ|B³¯4lÆØô=9V}o‘[ÈE¼“(%îA>qúbúÕË‘³ iÓþ }ÿ<ê¥ÑÐ=ÃUøZÌÓ—ˆõuäȾDy,QÚ$"F¾ëžµ´%ÜT ¿.r›â/ØŒ†µé4´Žs:¶ŸPǺãG¾l”ÜÆÅâ:G°×Ò±³yqJ#f®…¿Ò {¨†JÖ‘ÓÿÉzÖY\÷ :8̲wº%–Ö.GιÙ^Ïf^{¹§»Ûipù©–ÈCƃ¾Ô“}ù;éÔºG\SÃ7ŽÖ/+÷sƒyî¶Èý–ÐÙî qŒhÕ€O`ÇÉ´‡ùhTôüdµ¦îK(\‹ƒíܤ©Y}j–ÏݳjÓ‘=º%6¹'íÏK|óx‰½e€+5Š¿»e ú…#Ý‹^Úë¯`Õ<þaÖõ-ÈBÝÌÁ®v=iá½D7/n”í´)&Ø"XÛP芓^Ú/÷hx°ü…!ô¨7~C‚«œ®õý»:ýóEâÔWÔ”ÅUïq4«KÓ)¶º€ƒ_LÀy ÅbÀŸjm"ê¸ÿþážM^ endstream endobj 284 0 obj <> stream xÚ¥•QKÃ0Çßýy³C“4iRÁ}ðM雋KV m:Û~|»] –nÙhiá.éýþw—4}#ŠH÷P$Y÷´®Ðc†nŸ©B §I‚²M÷yII7@™yÞ¬6…ËKÁx¤Û¶È]eÝn?Ѷ©?K[ÁÀèoÓÔ~nÕêj[Z¬[w1^|d/Cù‡"*~éæL æ •`]m¬×΀ØŸhÖí8w¬ gY¸žü±¯éú#kÝ€|vù?Fb¬É; JxQ_"»çwXùXÿK޲äK‰ Q:õKFã 5³`¿—åÒo¬ù2–Nè—û ~ž§Ø)kÅgì¯èÍ„~{6™‘WÌ`ù 6žÁ²,=ÏŽþ$¸¿á=’ÁsfÕå5ŸdCç÷)ƒÛF ½I÷· c –‰”X¥U!ûè׫?7¦ƒè endstream endobj 288 0 obj <> stream xÚÅ[Y“ܶ~ϯ˜ø‰S¥¡ˆ›Lì]+Y–+²­ÊK6Ô,µ;Òò̬u8?>ݸÁ!È=줴%r@ À×Ýh ³_gdVÁ?2SþªÙr3{üföð¬™^2.goÞÁç©ÊÞ/þUÐ’Ï„P^<Ù¯Ž«e»ž/˜ÅÇöxeßö»·ën3ÿ÷›—³go 9Âg„”–¯JÙ8z%ÑEñ¸]Î)>\îw×Û Màᙘ!óªÁ–D” Ÿ-¨(E­[¿¹êl5REõ(- «,u7為«¼.>꺻øk?C—{+è©#u^ "–œ÷š‰ƧÇ}·²KëFË mªXli]£Øâ×ûnÙ]tÛegjí»u{\í¶Ã¨‚?LÌw XÑaŒaªúÇ$êR(O¢$Ñ j7Ô#ÚÔ G~.΋!‚ú䆵ú;X8 2>4Á¬TNþÀ¶œv^•TM xoúúbä¾oºv{0H¯Ú£'£x ,A_ïD"ÓÎÕfÓ]¬À ®¿X3R5(»Zú¸®b%â`ln†¥¤XÝК*QY3æ«ìP3PäpX±…a¼ÉñA£îEnˆQƶl·ÛÝÑtLýÞ¾^oQì«õè€H%ËšŒL¢*…³ÞW­œ·f$z%€ŸËÝæãºÓskW¯0ÐîGºu%¥JôÞ-Ç VµÅçqgžçáÛ ó®Gg¦k€ñ; ŽIÀ˜JŸOÍŸDsŠæˆŽ’3_‚,ëh=Àd¦T6ìžËÁ×KÂìz)M¯@ÀŽÞ}Ig­®~‰íþövOÿj­Oþ _( DvµY}ÅfŒYzø²;j§…ñââzïHÁ‡óbÓ~І÷ð±Ýj—„Q½Dc]ß>vJÍÛzP¤F£à<(]7ø,F˜u€^k¹vŸ[”Eóã„Ù2øƒÈÚ8XPÁ àßœCøë¬dM=û–©A¹ Š–õl3éÆuÑþ^Ï~™ý4P¹Ö Ö&jÍl]íi&¦E…mÀË4ãK+UI?€¯T1iW0BZp”ߘôÓî°_}ôË\̲¦¬eÄÁä9P.PÏboœC’ÐV2í½/¡ 4{½½Á]v‡Ãn8áá‘q<Tl (°D›¤1dªS°É¼‰q…ê ÏÎ?«Ê GЀ/e$ùQØ@;Bz„¶Ã6Ð~öyÙg ´ º,žU yž—¼˜Ë"hGçi³J•UÐþOYO;F«É£…û¡eÛ Eõ쀛eäíq-O;…o­ˆö+ÕcÄÞá^²UKϱ‡âhGžÍÓNQÌ‚Ó/Úò 9Ú=s Q…ÏMÅЈnÆÜbñ$š§¢8Z ýóîúòÊ®ëë "øW¢,hŽcÅ)ÐÇMó´SG@“uBûq4G»‡b4ØGDÓLûì’×àIÍ‚2­üz]ʃæi§(NhŸÍkVìÛ͈AtfsÜzN¸É<`žvŠà`ö`ŽvÁ`(Y¢h¦ý„kGÔÈ΋<`žvŠà`ö/W>›Àp· ¦O!>äQs,{0N¡XŽ˜GO;…1»ƒ…L$´Ÿ<0cyfŸgöù<¦ãÙƒ7ƒ&JJ¨ŸiŸE“–Db3^ÖF°¾Ï¢h§ðN ÓŽÍæ²²;²Pz~=l' Œø‰,”vŠí„ãÑ~‘…ÌÓîa˜ƒŒR lúf!#%ß„mÂQÙ džvŠád¶ µ«-.nÇÏ]í®ë/óšë¸n]™pø³iê….i×;º¯ŸVÝÀ7[_¥1oøb?økÙÚÝsu Õ¡3±DL"ABÔìÌãb„íǺ¸Ü·¯†âZ Ùñ1¥çÃÁ`ŸÍò¦Ÿ¨Lô¨©WBDa#؃æÆÍ0…1å%Èow1”šÃJgeC“sQ»÷Ý\ÐgVÔ¶O»ý‡¡ØE'ŠÂ7> ß8›:°5:s1˜À^ó½SJ&R&ùån›˜ín{q0}ÅÀ!>[óx¿{kǃ!Bóe¿4/x8? ,g†ð×A,ä;L„ÚÿŒ¤„Û Yµ¹ ’¸ÜI²¹ ÷c¹ ^ÊãÜM2d"PI³{Jpù¸Ñü”Φ™DºŸŸÛ—ý¥Í} ±q}ªYV×=yUh /L5e%—ØJ–U‚¶f0h¤„7RÕGqçzÅø€…• ±ã×£kèC¹XÚ£¥™f+;I‡+ÞÚðµíPÀÎ…¥ÏV—¥yãå`2W%Ц/`v©Œ" 'Ù:cSë„-æÒ*ÌßÁt*øÌK¥·ÄîÀÐÉ?%¡RÕ×&|[0T-æzøÔ&T¡Ë¯Ãöh¡¼{ó¾N¨RJKE"ç6XQJq³‰C«hŠÙJXåáÈ´><]æa¯=[pX®‰Òë6Ckî ¢u;ã²d íEû›^ŠX…Ç 7™@×!™oFÆöMFdŠLte§ËæÍ†B5TXg Å›ŸÔì» !¦¸.òhPÉ}ÔmqW©QµîG·M¢K]iÃé rBC*mž¼!.ÍøñàÀjzw¡©un ",:Š™’Ž‹Ô‚”µ™úµM3ù˜ú‘–²‘Rq‹º|Û}(ܦgÿÛ±–¦ÒÚœMbÖ×}ôžô”TŠ}4…ê&…ò~ÍÅ„â×mªpýÏuCÞPéë1¥§wPzJ…v ½ÖSÜ òI­ÇÐ1"iý‹‘éøøÝGÆ0—&ÌïF†öݰĠw⽋ßh OÒµ÷¥|¨p¸êŸRÚS…Ù%xy£¾«gƒg©ïg{¾ã…ü¦ïÑúd+•‚²ü8œ¡®ÔíV’t!¦Baü,ÌìÓAÁeüfLlÆDOr›²"‘ä~;Þ·Y[·ðÆî‹77FHå`©ê•Š[Ô+•ƒtãº'–'¸ÆSÜÛ›$¢ôžd!ÀETÚ$#"¤/ˆLR´‡J’¢;òÇ/0}»Ï‡– ~ãeƒßxÕá #˜îuælx“Çîá±sÔ¸{™aÌ2ò¦è«7±Åým¾þ¿¥ý½žÄ$øØ¢²—^B*ûÝ6{Ú ¹ãf¯ÁU2¨ ã\«è©ºô6{Jë·ÿ7Q`¤?0>á·óÞÑT22‰ª|?;H";ø5Ú„Ô/퉙hnQ÷~tOΉ¥ÉÅÄÕ{~¯39¼ÖH5SÂímÎFæølhŽ©qøp[n.mnϞб„;ý s&ZÐ[´øÃ™g[Ð?•ùíHõok…§Ë ¦¯1šctî·àœN¯Œp{e„ ßO1%áøRáñeyb[ªÙB5›ŽPÿ;¶*ŸFÕF’á¹”º ™päjê*¼î%¥» Ù`eé¬Ã`àx=éóêp<˜÷v»ÃËø£1}®±Ï9rÅ!´SGÂrœ|ê9ÀÖáÚ ›k3úÍ\›y€?… tps1Êö" .XÂ;S­Ý/mµOW«µ½f®sû8‰¾Æúñ Shî9Ñ¢sw=ßñ`ÊlÞ†Mº¸^ê»ÐðÁ4B À‰°µíM)Ö»)Å|´L‹ƒiÇ€ùПG}1«*ðLÚNzgïÀ>ˆ/¹±bƒ¥×Kü_ßÞ"Å;‚‘\i_î4õß4©íÊòÂÛv:¡ïá9¡…—ݶCFœ:P°Ð€‚…­+Jz®g¿ÌÇdÞ¹½MÅià„ªNa > stream xÚíYKã6¾çWè(ïN+")ŠR— › ÁØ$}Û^›žÖD–<’ÜöÇo=H‰²åö ö²‡Å Ð|©ªXϯèèC$¢þ‰ÈHøŸFÛCôÍ}ôùw:iR¦et¿„NÊ,ºÃ…<ºßý3þ©ÚH¿lîTšÅm7Zéx|¬F?rKǾÛÜé<~o·n«µ#~ü¼‘EÜõ¿3ÃFæñiyövs'ˆBWÛ—mSo¿„™Èâ(÷Ïõ`ßà\ĵ£úŒ4»S³›)±“¡>iÚ Cý¶ñ²vüw¨ÆzØ¿lþuÿ#ÜÐ]T%ZÓEé”Rî>08övkw¶Ýºyo е8Ëâ}×órÕzÁä}÷ÖS!ýÀÈÉ×tí»ÁíuL¢â)^Ú&$•ªH´"¡î½0Û¾ëmÕ8Ѫñ‘i€Òážw¨j`ýÁφ®9a)$¢"ÞÙ‡Td­õ›üT« ŒÓF\7å¤.l "4þΚc|ÊÖÇ1–¼•jŠñ¹ë±B ñD++Ëžò¼še T1F ¶g~±¹3Y:C… 6¾ÐàÊJ*µàKóD”¯%ç ‰»?Öl”vªÙ8ÙÙmo«ë3rëZ¬Þ| Гƒ0*“xyR{¼ûŒk6äzŽƒú`‡uÇLçu;®åƒGÎ2°(4ðˆ S(Mf`†`!ܾjw¼¶¬EfqWÑ̺ À +üjào&†–¢î­%–˜¡Øßî‹ F‰çö &ˆDÀ:†#=ɹAb:~×ýg"À/Eôé2)2þB™èåãÌ4o¢_£ŸWx§Ÿí\Uÿ›ÿ@ô=m” |g²P°é ¡Ñ4d‹aºxx¿¾´Ýq¨‡åÕÕ¢ˆ'3tY`B"gëN±5_ÿ7óïúêøÈëùþ êväÁÓoãå’.ךáaóåšðN’$kÐÁ1ÇµŽ¦ðAB4}I¬ ªZæûÔg(w·ÒY6WO2 ð€Ä”F.³ypÆæ¡‘Gî$Š…nc@7…0¡¨˜ƒ3ïÆ8 èN£n¶µÈPìãjV˜걋Ž#Ô´[Ǫ¯v´ýš~LŽÏפï×sb}¤Fµˆ{Àñ±ëÒ\¡´‰îŽ^çI¸ÖÍP|%÷Jž\>ßÖXŒÈ B̤–Ý)®>ò@w9¾ûGÐKÄÐ8ˆ¸…¢.z£E¿åºX —e:þéÔŒõ±ñ{ýÖµZTyâè&»pC¦|[욯Œ {½³½ß¯\+‰©žigDûµ6RÅ £ª$÷î aºVm ©odPµü·ƒE5€†aV’»âêèå O°ƒ_ìRî>º…ÉÈ•i˜~.…TfÆwu{Ƙ1N?Ú?x¾«ÆŠGoÂ-1ùÔï„lòÀǸâJ¾0 ¹0`.4Ia¨Ô®BÈ«ÁÓs˜B·rnܬµvGŽº¦·t~8¥àζë!±ö»vÇ®ëX]W›y™Hß¾_‘¶L„~‹×»FÈòn#3-ãök>‘>»`'2ä«[ÃÜ’J~k‚Ë׫«†ÓaÒ!¾í¬u1*7I^,•>ÚÐújsù5šÄÄâüÝÉw€´8——¯G:»ößp¼ '˜¸ˆ{èoL÷&Œ{¥ ž§9îi¶ç¿£dŠûÅîí¸$UÜŒû+Î÷ ÆaÜ+­\ÜãÎEÜ+]úw$Я&¤4[4¨:¦5˜ ;Œ]OšÁÔðh×z iJølk©Áé›ÚREÉ0VýÈ¢ %¼n%/<ÀlâbbX¡z$¯D‘€Ì.³K'XRð¦ôÕ•ÆZ„šk¯¼­ù•¶sPE sI eRàîÕGÑOsëæÿnýÑn{·Î‹À­s3»u^\wër†øÂL]“C—éU‡pQ,:¿âÐÀžZgùU‡–I^^šÿܡ˕a‚äÐF{‡F °Cƒ~%ph¨9ú íOÌs?:L¯3r·–ÞøSÿV/f-Øh@¤vÎ&jÎ&0ä—’£ânwp¤ÜÏ‚oÝ‘¬ÇaÍâªs 9ÎîñIZšþiÍÖšª¡/ïüì“g¸èìÛå#€0ô‹‰0NLQÄÏ5˜£å1ŠG'Œzâï^µðÃÇ„u'Ñ^4¨Hí[7cÍÂñ³_´`Ë?ûPvôÔE¼÷g_^ʳ yìÚ‹tñ;ˆí»7g??­zþüSæl4ÿ4”¬4Ëièf¿ØñÔ·Ãë=rØ0ñ¿bºÀŸcnöÈ óùTï Ê£g1½´ád©r\ T. ðÂÄb%“2ü®t ÇóíŽw]f´ë^€ ¾}6Xà)ÕíÙÏbן‰eEHÚI“%×¥?ýógÿ3|o endstream endobj 294 0 obj <> stream xÚ­X[oÛ6~߯: šIu³¼´šÄv.°­Æ^ª"%:Ö*KªD¹É†ý÷‘:¤-[t*± ð¢Ãï;’:ÇÊ7)&ý"e`ÑŸ©D+å|¦œŽ}™ÆÐ*³}¬³§ÌâÏêè1\)Ö¾Ìn¨˜ÛC®1t¨¨o¸v#:[bMw\[Å| 8jQæe¸‚Á\Ó-_Åi®Yõ;HWyºfC\Á˜,ùʨLH…)Ç Érƒ8O1G¬–€•Áâ<ƒéqò`@ÏsÍòÔ'è×U’=lɘiº°Æ6\·±¦Ìk’dÂpd·,·†ÇüÈÄÒâ>* ‰Û N©0‹5ݶmõ;µ‰Êú¡¶í0P.¦:›^䵆)GHR_Š–âqMŠš ÷hD¾âÓØy<.ø ?'Y”Ö1r-G}W‘8Æ cù¡Y½ò®d’÷L“yIê´¯-9 CÔÈ‘§Sµ@¬"eÖwÕ¡‰ózžbè“_¡Åï¤Õtþƒf}‡$-1æ¢e}íeÅPBàî\Ë…t/aRõ¢Aæ!žönºá<¿‡›{éG¸èP Û¸·Ûí¦/8 Hv¬­}–i—…Åš”òXwYì>¶ÜÉb±Hó¼|Öq]†eÔº)yk± sïöãn*qDß—<ÈçGâ[¼µ»øç2ü‹â;=ñ/Ÿ9)¾Ã[·‹)é¿À÷zâ_ˆ?è‰?9ßæ­ßÅ¿á_‰ïƽ¾wüøƒÃø“×À÷y;ìâ_Éð¯_ˆL hßCR‚›# †‚u ®e·Gž`dŠÜq¬»yÛȦÇ^¡h'ëÜ!¸•ÜK`&˜IÐ$æÝ$¼(¶tùbQa²ÍÂEJ¿ÉÆÐœJ0Fä´–m±JW8´n`•Î/Ž÷ôuFè’7w4\mÞÚeþ7[\—­œ9áæÿbX‹ ÈèïM»‘–’›|Îwß,YAEŽLZ+ xu=úÔÔUôÚóÎTÌLÇŒjk,“‘èº é͇X1h?÷Û<;f,DR¨Én¾Î÷ Ÿ}ǧi¶‘­Å£““Ý:ÒudãŽÝd¤•¬$«œÉC{Ñ9¸W3DUþ^ì(hOžçÞHÀ›r^ñ_FûߋǮ«èÞ``øÃÎ3…ô?ýÕ\¸1 endstream endobj 297 0 obj <> stream xÚVmœ6þÞ_N:ɤ‹ãW }I¥V¹JQû¡Ê~ QÄ-Þ, [`›öCÿ{m¹3ôªÞžäa<~žgÆÃìF¿G4"æC#ÅÌ?‰çèÇ}ôòŽfQ†ó4öÇH0ÌU”PbѾz‡šcœH&Ð÷v‘¨`ý–¶«t~N^ýñ®~_ÄÉ«ñÛøýþa .}ÝŽÇÝÜò ÀnSÌŽ€pëC×¶YíÍÎ1P) Yê`»¹Òí¿ƒ…`B(˜?ÀróâŒoü³_vÓùÉ8>LƱˆ!í„e˜ÉPÕßa9¤s}l.*ÝèQøØ——“©ßt~V¶^×¾õr|±Äy'#ë#¹½C*qnƒ2,¹ ÚŸtœpÅPw/×ìcßÁa›#ýgy¾4>öÒwFžN]ÌRô¥µÝÇF Òq*ô|u{h®•-³…úÔÝÃÉÖ†\ϱ‰·§Ò½)ÏhQŸ½€VëJWÞÛAÊS6K¨ßÅûީËP ‹átÐ9ÒeßÔzÁ?ŒeïLõ@•¡ùÊQ–.U8cæ,Ñë·kÅ¥XHPÄ; ù*m=œ`ïYJ’a•N”w”éœR¡¦ÿO‚¹ÉOx¬_ÞþW²²­Ô³º‹VxÞL8ç“c­K‘®—½”çó(sé`èò`;Ëq1ßn\˜.ôä'ÏmÚØ¼B)ú¤#Ž!ú©¯ÇúP6p ´ìý™sÙ¶íîZÑ ß[¦¿|Ð0ê¾>Ø)~½_ÎPûs“\æ”ÿZ·õÙ’ÙádÔX!ðRW×¾ëοâµP"5£išŒâœ9˜76CJDŽö¶®v_œÒÇ^MXjLYCÚÛõÔ6ð`v$Iª÷g॒nvþ»mas,f ÔÃp›… ~á=Äy‚ÍUïb 2¿+€ŠZÅVO¡Kù,ЕÈ'’ JmÆ[®ªóc¡¼T-¤>º˜ÒGf3ÈçQЖšÎÊÈ(yrŠnØëhÊ£¥h<Ж?‹–m&&Éùzò|½or* !ÏÖ ÀsÏ~Q¸Há]LAVeRêáÄRg€$Ø:ø—¨Ì£²@döTÌŠÍV_Ê7E†Â`tmùÃqŽyf~Ô˜/$Uæ»)‡f¥Sôo_ý'ÌhA endstream endobj 10 0 obj <> stream xÚí\Ûn¹}ÏWô£æ…CVñ, ìYÁîHbøA–Æ^cmi!ËØäïsÙšn¹{,Ë¢$Ƀ=lu“UuXW’Ýe°ƒ CÁÿypÑ® ó vÐ$ƒ¸Á§8ˆ !ÛAtˆÙ⇔ñHrÁ#q(¤Á9‹g0ŒX–ƒ I€‚säÓê0…)€‡9LÉ¡ô!eN3T Ì›Ãg æ3»Â¿”!+oaº²Ô ;äȃ 9‡™Èð¹@î-y(”Š3TÔ,U Ú«NᙥpBj…ÄT8`å¬@ ]ªòZüœœõÚ‡V¨@Ÿ°Î‚e´ø\Á,;è:4úà€¥¸. aî JÔfÊéB¡ ¡ˆCcɪËHl }€¡Ð"°Ê™(„“Š£‡Pâ ¥!’Ÿ#ÜÏìÖÈ0ZF`D@ý„6¨ž–P­0QÒÁ4€gá)¦ -áŒ(ï‚oOõh0Zušè KÉ}µMb ÝE ö«ÕJ-t@«• Ñb,¢sþê«íÓó³KþÀÍ#dþ¸} ¿ÜpŸ­ÉÆ“'Û¿^œŸü´»|¶ýëwO·?ïþu¹ýþíñ«Ý·íç›öóýó'Oþ0™Ž¡ DCþœ‘~þ÷o»í×ggç—ÛŸÞ¿¸äÕ¯Ï~Ý~s~qº»xf1¦}¾ýö™k¯Ñå§íŸÎ>ß~wd7 öãîäòYP54¡ƒ±Ê0„”ÄØè:Ðq3:Þ Ä!¼9ã1A•NȤYÒÑdèì*ï âF:º¤#Þhé(ds¾¿¤ã¬/it\2ðè„_’¡­t,ds=èÄ% ½ƒK _¬I1v “–t’5p©N‚l.u “—tB4î¬Ò‰jbÌè”%¯Ææ‘N€l®t s¼¤#Å$p•ŽFb:/–t\0e$#­‡78YR±b¼oÞ ™ñ©‡w;è-[f³a™D:Z ™ôg·¤“‚aP¬t²¤Éè¼\Ò‰Î0(W:²I:Î. ùlÄ7÷†˜lùõ ä–„ ±4ÿ†±¯‡s²$$Î8ßòDƒ³!]²É„2rNzx8焤xc}s¥j±© ¡°$”­ñ¥ù8¤ñ&H_êâ’PPÓtUŠñ]t;-©H4j›ó¤[(ÛzÊKBN jšFÈ“rïãÊ‚rl#¶¹±Ñ@ª„Ž—„r0,#H%‰¹‹[x±$„”×Ù‘P*utB³H$ÉxÎ'G·€bÃÄ>naŠ-ÍZë㖱ȉEŒmÖ "&¤.Öº FÆê[ªà,Ì5PR¥«}k]UYY[É2º!àÀ¡5ÃLHEB—´@–Ñ-fgPÇWB¹Hé’È2ºÁ(MãuD’S{‘etC43i´—•N]ìE–Ñ-"tºÑ^"b·t±YF·Ý£½DÄîØÅ^dÝB§Ãh@ìvÒ#…—e€ IM-3 v‡Ô…Ð2À…h‘ɺhö2¶Sì¸@¡Åíb«ËØl0y ¢‘;w ¢²ŒmðwÔ ìXS ³Jt&Ô]É:Ñ#õpH~¹”îä ¦lS¸GC¤L\òB,†%†€ºêÖI*ïÁ]ûÛßóßÑ/——¿ýq»=}ýöøä¹xùjwñÎìNßo¿ýåøÍ›ÝÙ«Ý»=?×<€hjyÜ\%‰Cʳzk¹E:÷'“aÏàžœÐÌKÍldæy®Ü šõèÆ]´`¹ÐpÈ7ÖöÝ4ÙÏqN+η+Â3mØC‰(Æ3/#ÄõÄŒûúφ{FåN(ÌÔóîçfDo½‡Ö},M˜ÁrSÆ0Ás4þny²°Cðh‹KÛœ\¼ø¸DlbïšÛ˜ä“ºœ;¶ë ©ƒǪ¶ŠfhMflͰážj3nø ²•AÓ†¯|Nƒ¦º‘§¼á¡þÚ,hJko´Í8û©ókƒžlŽd6æÉ†®©]N7êF–v~n§6_nø½6!SSã%†ñϯOß=ã·ˆðDýQýmsV¿B´ì)ìê'npÍOúTb€Z‚B A˜ÒØE?~ÖgeаáûQÓ €ZF u³P¾¦Í@ùÂ?T›SumÐã ß³™Ô:ò¨uä hjƒP€¦6ÑOµ¬ úrÃWC¦Au³Ý#ÈéK L|ÃD‰o˜ ›¶½ˆHušÉ ~õí×Ûñ7®ôUÝðõ„=?J.š ´}Qgh *ð #ÃÀ3¬™†æ ®Lƒí0 ´CQgh *ð DôC©³6è醻¢Ó @;Ž<í8òn˜+O í4 ´SÑÏÔ@D¹ªiäx¦5ë@Þy4`§Q€†H´ †Xm¡Ý4¯ÙØœq &sc<6ç|[Ô;‡mñ]4¯ø{9öJcܕƘ+ ðV ˜é`ør­!ÖPFk(sk GFCIã ×eê3i°oÿþ9ÌiæÁpöþÍ›ç¸=¿é¶C’ éÇû®Ùb½Ñ}áÃtÓ_»)Î`®n6õ¹º™à•×ïð#˜²«›1\“'ë'nRœß¬¯ýïïÉÅ~TAе¿Yì!fЏ#öÚúšy˜nÆCÝÜ5Pê¯ÓÍt¨›\ãPùÅ07ݼÖǕʞ•|P4èÎõ.ÂnqÓß=ûjM ë÷\ˆü¢å#hùƒb‡ð±›[Ýó‚ÉåÀM~žÃOjL× òxn\ÁeÅVœÓn5åJáÿúÉ«† endstream endobj 399 0 obj <> stream xÚ¥[[·~ï¯à[ík‡w 8IMÃ1Š´kÃK³»êJš­¤õ¥¿¾ß!)‰3"•Ùôa=³Ãá9ß¹}<䎥¶¬aR;&9“¦aFâ™W¸Æ…ÆU1® ®†qg™l&8&8É„Âs¯™°˜Ýàê1Îq/ Æa®ò¸â‹ç˜«ðŽtŽ)Iãž)qÏ™Â3éÓïyÉ´Â{À I®Ì4R1#ð>Þ1ˆ ᑞYyš3‹{Ùàj0¿Ì’bŽð4†9È’eÎ^Ç<‡\üxšg,ó4Ïà¹'{=ã€"ÛྑVâ0¥…K8É´7&-œÃÉbXÊ'“1](r,ùÑpL'­’cº”äH&¿ª†n<°\ñè)®àZØ\ßaºA|DpkéeOû`÷ô2|/8Ä+(B5¸A”( O.ºAœ´¥Ä!ïÃ#Â:šåBACäG T‚¤ipRB A.Dz_y¼,(Y3e‹…û”€{=€+A¸L?B½Œr¹ÿ NŠ®$n ²²CYI7ŠR/KÍ4ÅBIƒ$1ôÄ2 d¸qLkÄ\!†Ú© 'Èá ž z˜öÈM¥$rÉÐ %© ØPê(¤²QäU…ü¢DS fM÷”iÐ¥Q ž R®5Žnd‚¬ÔÙG’á,«<Ù¤‘‡$ nA±YGaBúZÊ5…ºr ÝȆ9î0 –¸PB¸@ îÅPÁõNQra†mèF,Í€¥C P|ƒX(ÈCbCiÊÆsÄš½*…$ò!FÂy*;ÞPÅGúy-(ÍQ š*Ù ¤”æfáQEõaáLXÞq"Q(* ”a"Y!`†Š‡S6#4¸kp* ^å0RC‘IÔ%—\Í=C¸qGïi²Ö\—ròNc¨z,ÝY¸€xŠ7Nc‘ç!x¬ñšÞ£²mÀ܃(ᨦ9™¢B ó0ÃSySM†QTÁõ€‹Ã{’¼EåË)U䆜Os5Í£†pÍ(ÝP­¸³déáŽ*šáÈ6üÙåi†‡NüÓ©ÀéÞÄì€;rº ÿ‘çD@êÈ×D邸A5 bAœø‰B¬Í¥ 9½g€\…Õ6p3\€”縣tu$Ù£6 ˆîÈ»dQ !)²¢¹˜$AŠ´FP,¥«r"{ed&’B @™ 7™QŠÂ  "?HCv˜)„ŠÖ'i)W=Íp˜'(ÿd@êi”*JY «îˆeP [¢FŠ ´IqƒIvM)Ö°7W¿ÿó_(±Béå `6«Õû¿\S ‡‘·3¸ë8îÇÓÅ ÏÃÌ%éðÐ¥aÿÃcÝNÌüQ7l<Œ¢ ´ðlø$³HŽƒÌÆÖFxS¦22Tc¼žX‹cÊ›Z“ÒÍ{BÈ«Ø#Ú˜™w•AiùLùÊ Â2Ëô©ª¾ÁˆÖ|9i5T·]ø/A 3ÔâA¬º8â…2ªÈʈ3Ó¢=9Ô‚Ï´« ‚Ôs †©‚åtfteKÍŒóÊ °Í ôw̳ªíÍYÂ’#"¿KEL¤7—vfÍ…q®gNÕÇuJüy^§®¸ÓlyÖÍEÛŒ½l›=ã7“‡J\HÓÑ šŽŒ^h]Ïg¢ Nq$ª½€ê›o®¾ïvû“±Ò_¾¤Go—ûU÷ì·ýöq¾ÜvìvõðávÛ>Ü=¿z…áß®~ìßöWß?Ï_¾¼zÝn»Í>t̤è×îË>4Ô¥}ê¶ûîËHœ,ˆ{½í>…F=“m.Ën·ó‘`U|†óG²“=l{¼fýÇwóýH'q?,·»ýÙÏíîˆìê»þŠ^È“J‘÷c•z¾íÚ}½ÌÞ ˆOXÉïf`Í…û’ð]·’?lÚuÅ·»ÝòvÃÞ=›ßµ›ÛîÝó¨‰Ñ#u¶ .¹Ïeº#cŒu·‹EˆörÞí’æÅ‚mºÏìøtß­tuµ>WËk&Ç$»hs|¥d´¯jO̘´‹šÑHá½ô bj[WÆse²¤lÑ­FÆ“©s|x³í×E½ëzó”媦÷hdRI¿WµÍëÚrî຤­Û¶»A}„)içýf©#}‹º¾œO¸©X× 2™X²¬«kªL¨îåæ–µ›[÷‹åÍWúmÛ?âi·É×9㸌qø€qü˜qR¹ ¼{‰~>}Xn¨‡œ€²aat̆Mn<ÏÙˆÙèRRmFEôà æãW¶ÄrT(HÎ z’“sÍ…p ÌÊ䢢®Ø—£»ëPwz“”çM Rm IÍ,Šü‡Ø-òä¥ßS±„úÜÓÜ›åêÌ˃µRäì#Šìóy»–IxTtAQ4OäÜ#TÕ¼ù|ÑîÛ?°!eßÿôË«ï~cóÕò?ÝÕ¼_õ[Äæ¦ß®Û³µÝÔaåe$tÝ9®š7ž ËÖa©r’G îŠ\ÈD.³TLžO©¨óTTåTÔ»(2é箽ÿ0ï×Yµ·«£ç«¯ÄÝôXÝ‚Ñ;ý:v¬¿)ò,¬Ê©)Nº]± ØoûÍmI{yªþ¶ ?…aàˆ"ñí{ê·ûˆ¿!â·Ëy 0xJ1‚Úvþ 1g‹eÀÇ:W΃vÓ®¾î–»j¸<lž~ÓÏ·íø£òW¯boÊz›|M“¹ÚÁš¦Ojs2’͹Úùý-lÜ,ÆVg9"«ä²^næýnŸ± ž,×k߬úÏ´Kø¸êÖ,”û± Ë|S=(sº“ªÎ+H‘Xþ/L¢©cʹN¹.¡ù°J•…:¢•ô$ðßϯÇxCÞ¤Is Cß®n#Œ]¿útÉ/Ÿ—û;†Œ|Ñß¼¸_®öh#W· ÞýÝz MÔ¡éš½mÛ­Ú/ê ØÂô†ýfÝíïú‘·pì®»ow¡]|»ëÀïž½ùÛϯ~ñÓ?Þ=#—uä9gÊ"gnºým·‰ˆÿ¾-­ÛÍ_Ñ’uûÏýöþïÀwû~;V®êÊsŽ”¾®ü)9C°ÛÃúv»8ƒ²ÜÐÐ|Üb]G’wŒªØ1Þn—‹£è—«å}7Ý ¦®üÌò_j)1f‘EFš2_¬USÞÈ|³ªød҃ݷÊIS] ÍöK@Ÿ‘fû%XödnòýÑ}*çKu‰/s4‰/ÿ,œ¶'§JU¦Êäœ*KhŠ,ù±®>gIe.©¿¹³dI ¡úíâÅ«ûn»ë7U†œ×aå ©Š ¹]ßëëÇ~µ¸i·QåEPÕ*[Ôœùâ—‚ä±<›˜˜Í ÌŒ ,Uö NÜôjt*''ÝT«­ÝmN<ª-p­IJ9¹Y1»eSPŸ¼˜µi^/¶˜Xl ¯¢Ñ9›éâÑÛü®›ßÑ„G(ºí}>ÑÐÞWÀ±ˆ:–<ֺȉ ÅYÝt—ª^ʺòœµº¤ü¬7*hŸÞIUÇ”¡Ö—0ÝÑì´û¸|h± ü¼ç&ˆÐæXò—à åþ댮ƒ9óÉ«3³ÇEØåµï³Ú׃°-×þ`ÔfríËÁÖ^çý™.ögó‡‡<œsÚßÓ&ò¡ÝßUL“® #9ꌛ¿›"Ðd¾Òù¦1b>øJT|ufد©­êöËõò¿¡ÿ »ÇÚ®užwB<`*ÇùâÐdÜq؃æl/óvJÄ÷Þt»þqKçé17Þ~}è ý¶;ª0<Í §Ñ»ë`åûñìx$QX“J-þ圥ïWÎѤ¿@ÐØšX¼‘'y’š*y,ÓM–iG ìJ ÌÅd‚—Íz²õt§§ÏxÂç£ñi&}ÁSÆO§®‘Ý¢´Ä¿‡ú:$ÆkÁ¸š¿m36®"AÊ©d¥.¤™,A_òI¶|d.I_æ„ÏlÃUª ŒZqÙñª/+mƒ’S%¨Š+t3Y‚?•T"BWÄqIi=Uf\JO%e/-ÖªìíÔ‚¤/ó§Ê[¥ºt5å]% Ÿ*!Ö]A‚š,Až¼nŠf&ÛcFfÕÓ½Úž:žššô)nÄ«hŒÓÖxÑêΘ&NS$Z«' ̺æbsÄ«Ýѹ¬Q{dmœ›l­ã9<Cj yjÓ§Ìá‹ø?Áá©ÃLõyȜִÛP%¿¹*“ú±™zè7×”ýæ' ¬p¢S%x>ÜcÈ“ç]ò¸K´ã›“|¢žØâZ,X_+X7¦G?*Xw ÇkÑ”jL4b¢hÑŒjÌÉR8D£' ,/r¢q“%Øi…0‡Oáð‡mpÚò6§m›à‡½1/ùŒ×ÖИñÀØ~f>+î`7“–»nÁýd îd¦(š'&›'Ææ™IËCŽô­wøÿ.ñšNDy!¢ê+;F§3KÓ¡Ej°D:¶éÜB¤¾o¤Kª©ºb‡™yÂëNš¢h7Yô¸¤ýQ´*–tµÅ;­FñóÍÓãw8*:œ¥Óžôü“וtäÒºâÒá+7VBÕ²!qzfk¥r”Ÿ,!«òFóF«©2õ(o|™Tµ,pâ!E:„‰1L °H§jéÿ(„ÿÏUô™©mü˜!´¯HS%Q‘`&KÈx ¶¾ãxÙÉöÄ.*‹—žT1o§?‘öÁ"ë‰Óþ÷ZØb^Ùj^ÎV„ç•=’†=œæÚ¢ ?YŨ­õÅà QmkÏžÚÚÿÕEÐ endstream endobj 502 0 obj <> stream xÚí\»ŽäD­–Køì/`¦ga–,- 1D|ÀBH°+ˆ]+B>‰ZðâLVA©ÌôÛ{«Nõ^Dk5§­ã{Ï=uêáë¹ß<ÿèysÛlîšÍ³æþö¾¹{qß|·Y¿^òâãÇn›»OŸ~~õÃúåÃúæÛæñ§õÍ—Û_Ö7_5?¾ùéûõÍ˯?k6ë‡Ï›arõÕ u©R É©N Êrù‰QåU+Õ+±ü¬Uº¼BÖƒª¯°€‚Z—Ô‚”Y W8˜µ /”W$Ç ñ BÕrCð‡ê%¡Ú+„²OP¸‰>A=Aý'PõÔÿ%6¥Úª¼B¨þJ¡ÄVÈîJ¡Ä6&^JlçD¡Äv©¢P-_]•åš…Òj{­r j.\•‰ÅÍú…çÈØ¨Uç«{/(?B‚G)mXz …®PHÃê'H¨;R.Ôìê.¶;‡ª.Ï‹ @mãyšáâ¾ePh†‹AHf¸9ŠººKäîH¨ƒ*#BÏRéLî^Ñ×3¡Ea3Çálúš,ϵ¦u3bL–ÓL‚7ótYw_+ä(k¼twKa» e…eˆR\YcaQ• ø0 ‹^mY˜÷‘°,ÉH€EÎw1ê±°HOÕáÞ˜w}|`_°zy7Çêš§ãÝ)z ã½?ÆþgäLïÀ*9€¼ vú {ò®Óò  Ï€ƒ•Ð4ôØÐéVBР¡"jØÙƒŒvß!j(‘ç!%4 ,á ª3»ChðP =Dd¤2##WÂ^®„ŠÝ‚4TB%Ähðbf„Ç>ÈÅyò rˆ$vèÄ+!t ‹ÉÏA+#…=°€JÍãHq,¨™öï­ïÐ áò^Iñ 5Œw¤ÎïÛê`v‹m|¡³“âëf‚xÇz¬°iNWb¼›RŒw¬KNCK#è(ËbK#ìÌ +@ÂòYØÙ-´¬Óˆ°0‘šj©…Îêâ¤=$¬€å±3R mÁP¤i²°ãVˆ,ÝŠ‘ej1²l…’•>'À^U8`:ìeL¶D|£¨ÓžÀ× Yà+"dÿˆÙÌn³-c3ôyíE6m¶{ðÕœOËÁ¡/2Ór@…µ•C%#¬íØ)d„µ“C'#¬­ja¢ÂÚÅÉ ÈÖVð…Œ°Ò¼q!™¡nÅ24uN†ÀüuȰ˜¿®æ/$CŸÑÆ‘È0C Ô˽Ëlfï4µ„Íì½´°™ýlãÃæ´¥é(ñ.§,.-ŸÕµ%>dµZʼnÏꊯÛ!øRÀfŠW2jØ_½ÿ¤“ÔCžvVS‹¨a§‡•ˆözhEÔ°sÀBD Ѱln{/–Ëí~åÃòÙlX!» “+¿w’ +W ‘°x58îÍ9û=2ß Ã…Å©!Ö²eè‘è Î0ùæ(Æ h5ØxÏcº£Ùˆ¶’ÑvjÚhztŠ=9ùØš¼1ÑÃGN>„€Æ;G»TC´R‚«StXb^±aQÌÏÕ`À6E¢3b¦†@¶´øf)öu‚t®mË.RtUŠt®çGÏIœèÀ4OªHqª†žƒªèåÈ4s¬Û·ef7³„™×¶q}Æ:1ý´"ãZŠžf¦E¾LJ!Ò{gƹ‡bFUI: ·ÒÖã€ßN©j)WŽtŽŸb&Tµ¼ò+Ô#Ö¹„3ŸÛ˜GX§=?0 `£v8ñâ«3UUdã—´ás(ÏTÅ}¾ˆm4vÜ'T”l –h½¯‹9Aw‰™¬ˆnù±Ý™"5éÇŽÜèú s«à9ÎP–r¸ãïÌ?yð„7È,Þ¹oWÄ!QÅhPõ!Ñxm€¯AÅv¿cþô_b»0ŒùSÝtR~‰ݹ?;±³IUñÜQV©Í|Âæ¢&ždŠŠšÆjfq”ªZ>ª 'é!=Õ"èsÒ9ûàøš6d¼…6•´&f°X)ffRó`c °žpÐ9ˆCV&=¶µÀâÒf<%–ï²N¢ºÿ9÷Ô_rÉýÇP‹AùV ÊubP½Òð—ÔïrP¿ÈAU×(« '+/'+'Çú?rP_¥BÿƒúUJN¡ƒœB‡ßä Ö_<¬¿ù;¡wù endstream endobj 503 0 obj <> stream xÚí\ÍŽä4®(‡H}É#$OÀLÏÂ,{Š´€ÄàÄG 8'ˆG^Ɉ¯aÄ „›–ÃÌjº;?.×çî’h­&·Õd?W}þ\U¶+}¿ýÁëö¶ÝßµûWíýí}{÷æ¾ýv¿ûa÷Ñ›ÿpÛÞ}üêùÏß|¿{û°»ùº}üÓîæó§¿ìn¾húñçïv7o¿ü¤Ýï>m§³_NZ£N k¨Ô FRƒòŠR­eôæp,åÐ_!ïškœBE½+ªÁè©ÁÒ5.èQO£ŠÑOÊëÉ]ªÖ[ÏŠPÕû¥®ªx‚¡èêJ*¼@ýP^ªx¿¡Ü•B•W5jBUWe5¡ÔjQ£ ¥V·šP]ÎÚ§Ä,Q”¥wOÏBõ™HÜà‡òt|ú ³Äp‚*. ¢#Ížú"(Z<ýáÊ-¡Ê ÂÕ°„Š1~…á v µ5 ]͉f«yã_Ä,p5ÛTqÞ"P+#ÀubH«¹Åî¢PK‡ÀŠÁÄ¡ê3ľ&ÛEˆÇ²`$RÙ ñXê:Å—}U¶BMŒg¿„“ÄÕ·[xˆEöÕÑ;¾ªÌ¢Ýmˆ:Ml¦¬,ìüÌCLV†Í23-a²âŒzb±È’•çSߣ[Ýq¼eyñ`K€deãÓ÷lVy4½Y¯YÍõÓQÖÙ!í´Ô:¯™p`¡Yodj0Â,4ë%ÀB‡E˜qM B(¶lJ€Ð›À ´Ä&°­¡ ,&- Ä4L „¼å<"…'B¡ æÆ‚X#„VÈx¡Ðx Ò!­GÆ«•&ÐC¦[p1÷Jl 2žs­ÅZ @Úƒê¯aaš@‡¼„Ê+å B;hÙ@2î•XŸ@ÖK„ÐR‹u²ÕÆë#XõB›-Ö¡Æ—@Ðæf€Ö´ÑS´;m´X÷XpDXw¤ÆúX¨±n¡r:µ2Py Bv>¡È¡NX±“OZ\¡%Ðãf=A¡sc[#T! ²áU;€*ìà_¥*U¾P£Ê!'Uc,@ì6B1–Ð+ñµ½ä—µHi!KTÉâ8ôdqœGz2Ä䑞 1.ô” åµÉñéÆg’žÐB¦ZD™­m¬,å¶„&ºÑ2»Y-Œ”Û̦›l£&WiÅj!ß(N gÅiá £-œc£…sŒŠ#Ì5¦š5ãZˆ’ –ÓXÇWñHVL LH ¡YsèÑ`HhÖ$4x:š5CM3eÒ½¸‹-ÄÓ̺ׯD´•Núüžk0!l7f™.Âyµ%a£…8çVl?Üj!Þoe\½SnÝ«ã«XêûôÕÆ½b5%~µ˜-×( 4X.µÀ¸ï]{hú•%SÐÈë¥ÏTYÌ3«XMS7M ÖÎ'Ðq™a䡿ÿ½^Rrɇ{fNÍ ¶´eŸÓ¬Ù~>tÏÕÛ±ø²îÿ3ó÷;¶´·ë.É*fH [os!oNÖa1'B"xÎ#·¯–6|i›X+§»æ0n“8åsÖì^`ìžg¢Kì¼RñütaožYåwDɸ9ïÖýÅóm¦1£ºˆèºÙ˜©­IÉýØMAÂÎj¾R˜}k.íöÄO:=|@ØWYɽéôƒ¶Î儊êôK"é p#ÌÞÒ³”Y.™ÕOVjsyçÍÿL†…Ü›ï9ËA÷æ¦w$€î-*4Cr@OÊÏÎRM)é ½$f 0òåAÄ+Ñ6½YX{ñbaÝ:1NÔ"®Q°Š¼÷kų:Ò;ÓAuôyKÔØ•u‰à‰Ó¯bq8ý!i<ã(&YLeð9‡”9j¸è Ô¤÷CQÓozPêAý­5êA9=aùë–"ÔïzPéAý£õïujTÊëÉ=èÉ}R„êwŸ=ì¾ús1xª endstream endobj 504 0 obj <> stream xÚ훽ŽäD…]rPR'~û ˜™e™…ÈÒ AÄ!bòJ…xB¼@‘UP*3ÝÓžnÛõsªu­Õt´Ûã>¾÷ÔwoÙÝ×÷woÞ{ÓÝvw¯º»îþö¾{õáëî›»Ý÷»>zýøþíãï?ýõëïvov7_uÙÝ|¶ÿÃîæáóîÇ~úvwóö‹»»ÝÃ'ÝD{ <©ž¦äyRŽ— åYexRÿð¤þæIýÉ“ú'ÕòåI9ìv¸FBÿâIýÁ“ú•'Õ\#V6ˆÕX=½Š˜3[¬TuþÂ¥tZèñ%P©ßWeT^ ¿,«‚/ - ”0-׬•š²Œw¾^k±<ÉúÄ‚_{,ô^T&±Èõµ4fë‡*áË×§ôê)Ã}ÚzÛœ>•ªEÀ.Ý>/Xð8_Áõ¨fbÑ[8ÅyYLô„z¡o:NÌyÄ S4ÇUÓ‰…STòTjm”âQB'éó¨îxŽL}i ®çuË Ôâ(N‡¦ö“MÑÏÁäñË¥hæ7v™Ê_†È`œßSÇÀ°ªíúÍo™þHb†UoЛS²íŒO †Õ¬ƒ’Ëm'¥¥S»¬:ýî¥c\˯w³~Y¥ÃºÃ'´T\k±úê¼÷‘"«"~-¡<í†q&Æíöß?÷ S*¦]xô­*V—§çHð)K'—goLc½U¬>Ò#<„)×ëñ¬I5¬\©!B%©ÛõgŒ‡m™fSqÎÃâP'7ç0uäâ(™¢©€kñ*ð¡äaíè°µ¸Î·­Ðþ¢úÀÊ·PXCìšmÖ&v+CË%°65æê EC6¬íç¼Â]gÙ \…k®Ï ¬¯!è±H7ˆàÅjêM¦ÜLÙHS=0¼9YéçM\+r‰áêX?½/ã¯V汰蛆™†ž–j'VXº™XaY9±Ârbb…嫉VôZ»<¬±_Ò Ñq ‡°ê²¯m£‡»Òoý¬HÝóJ ±Íç›OC¡á€© ÐðÄCO¡¡˜“X%Wf¼MÙQf¼«Ò_ˆ°†‰e|òX]DüØNiã94Œo)4¢e뉕¡K/wI†>}VS’aº6|I†c:U¡jhj9±24™“dh3Åoð:tÕÄÊÐç:åˆwšÜfÀÚסà€uÈp €uè4 ¬ýÕCÍëp5Éë|ÏkCÃk¼à€U€C¬=Xw0Ùº°híØzb™åò‡)Ð,ŸРfåÏèP³Æ<˨Yª¥™¥šY¦žXfYÀ°g9 )¬gyÀRö,à( ö¬|›Ù—aÍi3ûžAªj RœÐbÚ Yfl°‰óÝ#±ƒ"ÌÌ÷QÒ|W‚æ»Fl!ß bæ»ElÀ|wÈ:ÈwØà±>•=æûˆù. z–ïô½Gh,ßè;v‰å;dƒ®°Zm >1#Y¥c@h±¼Øu%Xøh ¡mµÛ¢!HQÒb7Û9û†]Bì’[B‰,atÝ `›/<ÚŒ€3*t kZ3VÚ‚=ÈÐ=È£Á@B4Xl¶¡ÁWÉ }AAOé1m]BƒJM¢Ï·² :5+<ßöc4ØÔ”ö.FƒKÌ÷šgìþ$><îOg€h8ŽÃˆ 2ðϬï°Î¯B – |/Ÿc@Àò‘¡¯Å{»[ƒSmv±yìnU…‡Ü*gìÛ‘³ë”G,·hÒ›Q" ¬i=ge3WX±¡Îféô‘†'1°"cŠò‚û¡È|hÁýPxâQlÖa48Ûn"ï/ÌPli/̰݃I¹ü“hý-fÌ>‡fÐ_ùln Å}ä°°”Éa:|ŽcÌŒaH¹Ì¦/øÝ^§Ç0}ÉüŒN?ÇV4Šã’ÏÅNy¥×…(Õ²¤SŠöè®fJI–”¹R©š%e¯TJ\¡”{÷¥*–”‘ú?¤¦©©ÿDJ¼HÁRõJy¦”|×¥h×¢Ž)Õ^¡”åÝã¥LÙ31i)Z5kž”âµ+ÅkW#­'^ÝxfÝaçz•,0_…ÅÌcØ÷6Ï#ï>}Ø}ù/b7xA endstream endobj 505 0 obj <> stream xÚ휽ŽäDÇÛr`i?‚ç ØÝãØƒ¨¥$6@‚ˆBÄnD@È#Ñ'ƒF¼€É:°ÚÌÞÍìø£»ê_{%1:­£e>ÊUÿþÕGûz¸½yñÞ‹ýõþæÙþf{}»öáóý77»ïw|ôüðúõá…÷ß¼ûõw»—w»«¯ö‡wvWŸÝ¿±»ºû|ÿã?}»»zùÅÇû›ÝÝ'ûß'µËê™êôLý¦gêO=Sè™úGÏÔ¿z¦¢ž©±W3•ôMŠŒ¶z¦~½HFÿÖ35(2ªÖx™`5z¦~}Ú¯¬Â¯p;Þ̯íû5ÌúÚ€…ÑLæZ%p„–0šìµ\³±}¼¥µ­æ–š‡eX|ûg>#Š®ø¥^^ªx¿ôw¦uà²ÐQĹé¡ñ´Õ±>+ÑH$ÏT¼sˆ©Õgó霢xÞuù»=Äå,^SúÐÉBhù¢òú**áOÊ5ž-3Üü{«ð^Vd³Hx†\ç£[¦Eà$I>¹åk ‹+&Oíñî=Ÿ{–I {ü£cë¹>d‘Ôl‘b1¶'«=³z5S9ÚПHli8 §ÜNüÙð¦r€NØ­ÏѶd5·T º_³ÔÌ^¡ªyEY²Ëè–¶îUa©_Uõ°‚6–f½&ιÑ`~Ç~ÓÓ¹Šdºy_¤Àfú²3å«)VÅs«©©á‰!aX>o€±l©. ù×[f#HXÝb1,ø¢©’P‹ÿîËIG“0¬tì¬Y a\ßa5+8œ·Îʱ¦Ê ABØø[~š.Uê•€ë̓$¸í ¼åê*¿zë¥p==sæJ9>ÌD×ó¼S>ójfnœŠ¹EÍĹUe5Ï|¯e't i~­ãš{“-¼åFŽìÛ¹>æ¸AÈfAèr‡™; „m2ol”Ì©j\ª ¥3ûú ~Vrjòâ(%§ÈÌ©ÉôZN%£æÔXi9E° uŠÜÊœ’²@8%e!Û% ‰ØÃ Y§„,”G[rç]¨eEX9j .ba,ÎÛb¹±@îæE, än^Ä‚#H8¬n­%ºˆZôÉ·J¢Âï$¤“Â+OŠ~`¡—”êÃ&> L|ÓÐhÅ'h7ó´IPb<ó\/1‰~X(ao4jñÅJ+>¼ÝD.>¼Ä°ñá%†ã/1||p‰ Lþ °rl|(V#÷Çj Ö‹°ò†ÅŠEÆjäQ@± ,ê0V< (V‰GÅ*ò(  ‘ ì\ŽGì\ @ì\‘­ pç `c‘ Ž!©°’ +1"Vb< Xb©°3 –˜H@°Ä| +1ÎÈ ( U¨1@Åñ “kµMˆçÕk„=«¥zD°ÂTS¸¡¯´TŸ\­¥zBôLH=, ô!Dõû¢z@° ˜êÈý Õ'¤ M êµ–êË-LõVKuGPP¤8"*Œˆ XÚDD…Ñ`×Z ©Õ1¼ÆëP£LXcÆÆd "hïW#*TTÒzˆh (h‡è‰%30ú0™{@l‘ 6ª÷ ˜Ì ‚V[$>¤¤!OŒÁ¦^Þuo XÒ øA2ÿEÇ× XxEñ -à Å èh0ÕÏ,7ëž?»b¡´ëHT}ÆBa½uú°ÀBÈ®RNìžjZ•ùsã¶¹©É‰4!'’O7]üöÀf—R}qZ7óy9qý€U·h+M.<¨Â,L¿^uœ(ŸÝ¶_…Ól„‚*̺Ä,WËqÇcKXÍ jf£€.°šrÇua©X-cPÞ·DüP+»oAÏæµÙìü$àìD?åùæOJS„–ÜêAS…ª"ŽoÌ|.<*¾Å/‡ŠnAñ­aŸ5c!Ÿ÷ßjJÝX”ÅMúÿ¤ƒßï±Råý¾.ߺ²çR?Páʧф–¨§QÝ”ÿùË㮤jJÉ2ã¦*-SQÓT}¦MSÍš jª}·MyMSÝ“©ÿÔ}2õdJÝTx2%胗iJ­ÈÄwÝÔ¨iJ­¥¦‹45éÍWš¦œÚ„\ú><Ê”ÚÆ;ø‚–†I/ {½Ì±z¸wzŒêeŽÓÃ=Ô—HƒâjꮘЊ¼kV¿ámÄÚ}z·ûò?D…w endstream endobj 510 0 obj <> stream xÚV TSg~1øòP—ú,XÌ‹ËT¨Š ­K]¦*vPêTemd È*"²/á†$a±€UT”U´7\kë2ZlOm;¶´¶Ò3UÛê}™Ÿ3gþì)33“sÞË[¿{ïw¿û½_Â891‰dôjßUÁK§/_¸l“·ýÚ˾Äð/l ÃÅçÑ]"N&*¤â8§‰ #y}Œ}?jÝ3ß¶ï_¤»gîŽeœ$ng¶ÑÛ{Ž—·÷ìå ‰iIÑê(Ò#ÌSé³`Á¼ÊÙÞÞ ”Kã"’¢ÃTñÊÕ*MTDœJCOb• aÑš4¥Ç¢(&ñ•Y³´Z­—*.Ù+!I½Äs†R­‰RD$G$¥F„+_Kˆ×(רâ"”OÓözz°Ìf.³Œñe^cü(Â*æuf ³–¢¬g™ Š´ÙÄlf„aŒ„q¢'•¬•ô ›5¬uØgÒW¥Zi¯“‡“ÙéÞðmÃo³¯ÊÆÈeÝÜT®Ýy¤s€óÅ£G9a¤f¤è²N,–‹ÝÐ+Z/Ÿª—`&]ñ ì XôP°.’¡ôÔžÚÔx ÜÞcªá  ?â-{šQî^<&û½œð¾§B¶·d_¨Bnk}šÛ(Q‚£¤xÁ6™O=g—§×ÐW›oŠz8ÔvêÁíoƒWûáÙˆœÝQÂ@c‰Ln  ª‡O±Ú®ÁiXg×`.6ð8ƒEŸï¯ãTœîyx Ä𻼡‹x‘Çç¬kWøeû“ ‘c5ë=Þ‹)vЩXOAE-Þæ?¨éïÍa0‰ƒ- ’?óä f-Je8Ÿ­N®„Fp»ÌÖ×Á!a`.>â1ÇËk]¹.ó 2ÊÞ·”>ññJñ ºKm/=mtØ`•ódžTßrÂÅ^þI!ÎÊøK2¢ÆW¶á³ÈⲌSÈÅÆì^|p]ÒŒãq!Ãñ&³É }°"‚‹üRs ‹!òËÖëóô¦ÂrªKý?qºñ}àÎÕn_'DÉ¢HŽL[qaé×B |lé¾Éie1建íŽ*‰û#Þk«Û:ðwÊè9¹˜‘}ïÞ‘´Û#‡žæ¡²è]•3è,9Š"ê=99é!Û7\ýÜôÅCá4íj‹«Ê.¥CjÒ ½±Ôl¹@S¢N™nÞÜgYAGÄÓkYN^é{§ MðžþF˽,4¢™Ö;³Ý{iÉ<†£T*.ÇíüÞ}úȯí#žä¥E>d™ß¿}„¸hº~¤±²ÜUP^|°Ä\Ô\¢Ï{rÙ9ë6­Í2²î_åô=¼áJýÇ_ÁgP³Þ°˜Æê&ÛzÑ%ïöâÚ^Éq‡†‡R ùŽWC&dVÓk`?”ëKõeÝ;.CpÇpà.¥´æVÖA+teuå:pfSY¹ÆÂ·u–¢·¡4 b!8+BÒ¼Ñø&p*2}/¬2¸c{b$„C!ì,ÛÞ˜Q°1 ü!¶fãñwÜ(éî2NFoj‚äy¡Gð+Š;Ο7tÞºeˆ *_!œ#Zþóc™j?ÂBL˜nu7Ã^:З AtéEU½ä=tÇEö®ãþ§­]PLƒÐ×2¸êàO49TíGÕ¾CöÕ¥®³'-šM rÀ!‘Á[r4Sø—ëïãDjÙnÒ‡6>fWA˜*‹±ìnWœeOBC7Ý6 ]¤ƒÿmòOGA±ÉÅ&‡…ÜDg)^Ç}<5Ø)U•˜ö¶žMƒ I%SÉWüÁ1%©C3ÞãûYÖ}Ç“%u)´ÿàv’­n„FJ¡<ÇJMÿ±’OøXìØ¤¶î§œøBÐvõÊ]?Ì5¨h8lÙ«ÑÆägp%§Ù!Žêôï$}s¥ãÔÉÊÔ v’þÏ[OÛó;½™ [þ¸;ñGý¯­»é Þ³ÏŒ;ÆØ¡k0…Çù ûÈ<²pÉlò2™×· }Ðç«^œ¯ Ed6Oøæ³OàÞcd`ÎâEà­´gH64àÜ^ûÌ_¡P ƒ;ùÁç¡8Œ :} p=Y)¬ƒ Éêh®=Óý«–z†$,ê*-GöŒØd.h ÍœU‘\G=aAŽzóƒþ'‚ ˜ÎCÿ§÷èKösݲz(OS$À²œÂp%×üÄ åçWU- $|ó¡¤ýgôþQ**qâZÓjÃÚ¢ÊTæ K˜:¹®#æNÅ hKÚŸbÉù›ªÝPm «ŒÑïn ™dŠnŒkJnéÌ¿˜}°ðL.låBÂóÃ[!Ðr¡ÐTl(ºFÌ-)ÐefÐô4ú’óé]PÜkDš›Í­·¥õ’¯é7ãÅñü=¶ª®;Õ%̾ë¨,ÖQÙ|,;’.OÛ J¨'eì moÞTTÀ;p¶¶Îtiýˆtå …õº²\ê$%%Ùy‰)*à’3ê®Ûû˜}Etý­ ˆ^C>C$G¶2*À7° ºGïÊo9fµ]¦¼÷³¢ >„î/¹C>r[Ƽmó—ÚÂÄe|ñ»Õ…@VqæÆ”%[‰wFÀ\ìq-hÌß  LMnÆV²4Š8/Ä6ל–ìÊmÀiÙ Å ƹZC÷Ã>à°Ý`®©<º÷nåì¬^ïZð™m ©T›vžî/ìq°TYZ¨fá6^»-i½¤âq,o±–ÒÎqÇb!]AN±tey˜.zÃ祇kgéÊðýœÝºBØå¦j†:Þ`­­ÐÞ ñB0lÐÊÊSÅ-u˜ÐÈ’mU2ŧyõ.Îå.#ô.#¿î#õ.rt¯tyF6î_¶q³ü endstream endobj 512 0 obj <> stream xÚeTyTSW¿$/OŠ VŸ µM¢c- b-uE"Aq«R ,QPܰR¸€ µ‚J…j]\ [Y4¬%D¡JOµŽèt¦Ëé|/½át.23çÌ™¾wÞ½÷÷û~ß÷»ßeXŒ†‘EG¬Yëà¡ ˆ˜é3¼2'œýîkÏ—ð#¼é$(EÂkâ7bÞ3%rÑc×áèA7áU$f.s;Öh¼½4šYZÓæì´Äø³Ú]?U=sî\Oõ,f®Ú/Å–¨IU‡Æ˜ )1fú“¬Ž0é ælµû‚³yó¼3²²²¼bRÒ½Liñ‹¦zª³Í ꕆtCZ¦!NhJ5«—ǤÔ#¢½F>ZSÊæ ³!MjŠ3¤¥R®^Hƒæ ¥(„YŽV •( Å 8§& ¥:¥‰²¨|9ƒÆ#w䉦£h&òF>È-AŒth £ÈpV¡HŠ_ƒ^wB #aô³Ie0ß8¹:mt*v"¢HÑUÑOâiâñVq•$¡³ä[Ö cÿ,ì—A)îg~èÁ¢~~þü~V&·Y„ sÅ{l"A ý¾žþµ¾¤_|1¶t1ÝŽ"£H "‹Á™è LeÅmeÍ•”\‰ËíO2©ÖŸ á¬Äƒ%ÈøÃgH7R nA~—<£=ˆÛ„ßF¥m|ÎÉÏÁ\”Ý™žÆ´±2»Ç¿À£"ȶ¿ÅgWIˆ|H÷@b gØ}u–†²÷% ·ë:†ØüüÊö}ûÄM&¼ÀåPÞ7˜'¡®Oá.?>'@ÓÉxÙ9¬ë ãàg¸[þþK×/".*2nP…¿P‚›(yIÐÐ'”ÐÇ€æv ü©Ûs§d²’˜‡tÁ o³°„X%¬ÃSñP¯Ial6W‘_€ ÷WâëâVíÔãx{?ˆ¹âz¾¤þÆW ø¶æ•MâdPM=úµ â-Ì`ÿSÓdÇvÝ>Z©<‚ÏâË;¹v©ù ©(s^:_wÕ´ÀðN×#¥ES¬ð²èž¥Í5|ËöGD¢\†c“S9èñÒÙ`¯´åÔ½o­HT’*›Ti¸\p; “(RÓíSxŸv/™Ìû9ü{¨oFÌePÆÃ ˜;< Z²\"DQÎnPK;º`"‰—|ÇþG Ócƒÿ‘‚cŒ¦D®Ùß±äÿUÆÜè³0glpœ¢–ƒ‘‡qžÿ b"õšLƱ/> stream xÚ]QLÔe~¿Üq÷ÎSŒ¯*÷Í`C`Çq6"¡ü:·œpüªãÎã8¤tˆéD>à%H–ƒ¤L- ¨p”Ê"åñãFÒ)mQY`…«¶èóŶ¾ämmïžwŸg{žÏó>/C¤RÂ0ŒR—–]°Ë‘¬Ïɉ֮11zê|TºÜä-l&ÂFØê%K„'¥[ a|ýE$Kë×ðþ†5ŒA½‘H†uæYµF£M¶Xëleåv>¬x;Ék5š8>Él²U«x½Ñ^n2íâð Ÿc)®0Ùëø°ør»Ýº#*ª¶¶Vm4W«-¶²Äí‘|m…½œßcª6Ù¦>ÕRe糌fÿ8´úñ•l1[kì&¯·”˜lUbZ6ŒÑ-I!û1›ׇøò %É"ŸJ²Hñó" ‘ŠÄë™ ¦…™÷ÒzµzÍKÖ Jauv=Ê=ÏÜóHðå£ §A&Z4hÊ5`(åX—¬¤/ë^9z[jxó€7þÂÉQö?9:D½Œ:9 Ç O°00¥ 49öEÙ§e# ½Ôû’¶]  7¶Ñ4½¨?ìp 3.æªÛ<!g9˜l¼{`º¥ ïåC:dV–ÆW¦ß1@™3ú+;?Ô}U<0Ö×ãî™n½YZHû9hüEã0ÒùÅ…éÏ.\€fE© tuzkDΑ°¶¦„QW¾• Žq™Âæ)š*¯‡ú¦z`yÙÅKÆ¿œ…%‰ÒÀ`J 7Ū¾R 'ÏÔ¿ÿ÷ǃ3Àþ0œ£‚Çî4«\Î…aav˜™Ÿ‚æ$óËéÜj:¶Ëñ Â܃ô)ÔÒxMZÝÈ ³.Ç %*§:šA%!”S)…¦.ºÐ*~Å ÛŒ]’VÓ=ŸË®éö×q ®×!Q«ª ã¸~/Û’Åu^îû`Ø‘¯÷Qº)®(KeƒíuoWwè„ñ¹»Fñá(Ó+öŠ„ÛWj8˜ìóy3‹ßõÏÿ®š„˯ TÜÝSÙ– , N J*£ ÛP¡„á³·úáTcw“ó_/&¡ÂÅ|ô »-"°†ƒ#/ßÜïÞÙV%ÊIô3t ü-YÕ5¸õ–¨v6vCKSóÉwÁ™½7û˜Aç>¹Äžâ:&¯ß¼ Ýà>Üñ´Xã9è|\Ì]ÖŽdYCœ»nŽú?/eª©Ëí,€8(ÊÕÁºSVò<Ø"Ÿ¸8{gáÌÒ`zýÿ£\‰ß‹žÑk­Š•¢…ƒ?<?7³“rMS~¾µ„½Ÿº’7#W:º„ìshèêì’Qã›ò`_iìy…O«Â·Yáçòõø V(<íŠu8ðòvû9 endstream endobj 515 0 obj <> stream xÚ]PÁj„0½ç+渥”¨…žD¨n kËêö“Ñ Ô$Äxðï›DÙCf&ï=ÞZ5çFIôÛjÞ¡ƒQ*aqÑ«åNR‘4!¹;¦XùÌ ¡Õ…™–Í´m?Êþ¹º\ÓäåÖ×éwD¿„옛s·-çFòœÐ«\œÝàô.ô€Oa÷eZ©&8ݪ.nºÕ˜_œQ9HHQD¹t·ÄµÀÅ0Ž–© Iž$äu]Tâß_¶3†‘ß™õÈ2 KOðýÇÞ¿FÞ !ê#)_­õâ=bº`D*|œÌhXñýÎo¤ endstream endobj 517 0 obj <> stream xÚ­Zxײ^![»4V6‘I²¢w%´BKèÝt ÆÝ¸7ánËE¶¤‘äÞ‹,[.ÈÆ66¦ƒé  ”PC» „gÍñÍ{gm÷}—›w¿ûž?¾å³töÌÌ?3ÿÌœceeE‰D¢î‹Ï_5sÅðY‹–-|0Þ^©Zâ­ù)þ#ÿq'žóX}LQ¢‚^äI½ì!C\†ö3yòÄ}ÆŽ=¹Ï _· Í.N~}9…xºù:…_|úØû»lv ï3dŠgHHÀgŸ|:ÊÉ7x”ÇCGô ÝâÙg¹[°[Ð7×>³ýýBú,vòuëÓ¦ó¨¶ç,ßEˆ[PŸEþ®nA~D×.]Åý¨Á†÷œJM﹜^ßiSï(ácÊ—òu¥B)†êLu¡ºQÝ)ªÕ“êEÙRRê=Š¥Þ§> d”Õ›úúˆâ¨¾T?ª?5€H ¢SC¨¡Ô0j85‚I¢>¡FSc¨qÔ§Ôxj5‘šDM¦>£¦P›©/¨ÔLjõ%õ5›šCÍ¥æQó©ÔBjµ˜ZB-¥–QË){jµ’ZE­¦ÖPk©uÔzJCÙw¢D”uB´Yô_ž‹•âo­†Y%Y·îm=ÒzµZb%Y 9B»Òûÿ΢Îî_vÑw9Úµ_W×nŸuÛ×}J÷ý6lòzHzTôü¼gRÏû½ ×mÛ`Û—ÒyÒ†÷|Øalþû=ßW~0öƒßd!²t;¹ÝT;è=¢÷ι«?zÿ£èý?þ•›É•Ë?—‡ôݧ©¯]ßÊ~ƒúeöŸß?µÿoöxhвA–Aͼچ¿ÞÚ‚RM¢g‘ûÙGwÅü ~‹h î‚ɽ}{wsȇüÄØäðbB B+ªòeužÛì¹¥àè–”ìWoŸÌ̬ƔK¦ø\ÃWèJ˜ËùÐ5ºCz³y¿¦¾Û =W »åè rû}ƒn¯¾²q/4’ï·Ð34Ùur\^°Èš~|£én?T†é€ÑÒšÐð•.¨"^ñË`š¶á›Û,ðÙ‰è{u&[bŇóÏJ ›ÄŒ=é1Îr\ú¯uáÅ4¶Ô’°“ÞÔh5 1ÝZòäNã×ÜV¨‹3†8kTþÉx•Ç—–l=±¢iÆ(Üu qÿ†±oTDÉFe›‚g¥y)Qï¯^äÿ¤=TÖÒ“A«KÖ{ç9ƒ˜~XdßÿßA˜F{3ý°ç— PŸžU¨blZ.½îaM‡^íØTòü›à¹ª×%'Àúd;é-êßË]£BjŒk‰;(ÿ­¸ñø_¬ž×aôÓ» '¸2¨MªðwÕÄC((r"‹’^ÍËK¶ æ¾/lkP7…é’ðþ‰FòwØ“Á»7y†ÔqFÈËJKÓéu:|zˆN–ƒw⬅‹bcAj&1595ûæ¨ ‡V½ÿŸ½hƒ¶¾ÑåN›„[´`xãCÉVÍåLk>í¡ŽÃyûHj w¡±ñ.Ô’Äó¦Ç¨³ëåÂ6WÐóç¿YlhÚ’i^¦°*‹ÑTuÀ¢8Ëþ³¹uÀì8¢#‡XͲ@Gßõ›ÕAÚm°&´‰Zˆc¤­Je:r»$7êç ÅÍös”o‚é…ž'j“,&ØÎÔý‚½£G?š‡DÈæÁƒß9"n,¼Ú¿¤_ÔÛÂ;€÷^!£Éì§´‡F9ƒÛâ#Ùah†¦¦C°ãmí»ûÔ2˜_O`O‹äâI¬$Äâ“­›e>42nSKšïlÝf8êô+ZhBÜ´=ðd½…Ý“¾äW¢ ,ê:ù)¦¸õ°)ÒÓA«i£ª&±ÔãüƒÜ4uj¢\KPMR‡Æ¯ .°!Ý¡$Á !Ÿ1q)ÇûépHÈãÒAoHIË.¨?ü#4ƒyCFx»ÞÖ2ÒWà K‚‚]Ý7ÀLX~(â„AkÐfSSh.+‹0{E{&nn²’K_"æ÷_TÞ¦3߯ôæƒFâ¨ûÈõáüûÒV$C?²e4JC=ëÆnR™63Q.°Ñ§,ÊT°5³á¤ã¾Iø=ü!fq \ú óå#$þùoäMéØ_°˜“¶Î÷5¡ëÔ_f‚ïIU~ø^¸EÌÕê§÷IÊïË¢"wXë`=¬ðð]²!)¤=|Jøo®ˆŽš~(æøl¦ÀŒ% N–`Ðä&3A/ìlm– 2Oçæ¤§]…\¥‹D9‹^cð‡^X t÷ìÝYÜAŽŽdN)Í»³ëëöEßC…Äê!»Pù®ÒÇh"¿Ý°5y2§¾iºpñÌêY,w]¿Ä“1E±ß×ïo†³ÌñÇFþlÆ(Âõ›²cëƒÌŒôÙ2¿ñö0„éûûÜçÈúç›/9¨Sîvk +‰ÌZÐÈ vbQ©•a{}a±ÝŒé«'ŸõõMŽWŸ¹½·]Ÿº‡·Jù‚æ?D®÷IàˆÑÖ›Æ1ý7,ã"`¥>`³+£ªÐœ¯ˆôw{Øù6b‘ úy/ ¦¿Ë­€uá›6:o q‚é îõÓPdÅI_ž‚M¥ÇÜó 66€Ïéðz8_í-©¯8°=·–8¤fsáÆï”…°™´yØ8®_‘Åò6ÿ̱øªÕ?ónã£é›¶w^„™¤¿½ûe飰V1KºÇ© f$&¼-ß_GL•æÒÊ7õ!•ø_§K×eë3Ò…Ú„ìѨFÑÑ–‘â–Yè:›ÿº,µþ"é(Cùrþg¼Ší(XQòÖ¿I¢^(²ƒÒ„:›Ðãiájˆ:‡òÎ!Ê,æo“(ÕêB¸I$éòTéN¯ÎsfÀˆQØÛþ<ê™ü0ì«ÚÚ”µº9l;0?å={‰bð4d‡Çãx‡×㥈Ã_ y3œI?“_ž†ºÕB“•„?ȶB¦Op<’4fóñûh šƒìQ4MB£i¸V}’8fž'Ì—ÏÞÃB8$Goq\¸F ̬%w‰Oܹ(¯†}‘uö¹a„‘ .ñ„ÕÖZøyFQuË 1߯e!›”«I„HP«’¢±Këϲð5.Q+µ¤„”êvêë,Íšj¡S[d.—ƒA—¥ÓïAÈHᑤÁUA²¯=ήÎp¶ïÜ£m"ëÃé%®¬a°‰Ï"3¾j›–5D³&Ô`±Eò›èøã™OIÅ â;±HK×èÓ÷r¨§äqí„U ÖMÄbùƒxöqñ¹3p‰¹ûÉ ü>×ÚɧLrE¯ô·–ÑÒ焎¿à‚}ø$Èîþ½¿ÉáîäËXœÃ,Â×XÜKâ I¯‘£r´”~Ò4jî—«' ~uWXZFZl>ã½kI¹{týÌb4A‹ÑÄ_‘1YÃ)TڸܿÏd,f1^³ ”“8mF«·âî6âAúhPçS†9Š£ !]É%C2¡ÿµ3dîuk Fú/!އ7ù)`iYDˆ»ÃKŸŠk[¦±>eôk“^ÔI‚¦  AKÑrü!ƒ§Éñ{ïöYÄooGê©äk8§8øåÎ¥™ãa*`qØu¡Ë— "Ù2…}Ò‚j¶‰ÐG÷Ð:3n6˜Å裫ìk!—$M(›”æ <*d&žNâÌ®2ã}úq¶÷¹IÆ+}†qcP¢¤Ý=¬„t¤+ °œ1Kü‘ºõäkŸØ´ô!B÷ZОv¡+̨?É–k-SØÖ=oWòÚJÒ\…† ŽÄ‹=rkåH{‡þ%ëµè‰q^ùñ(­Ct7 fûÌÑ6-f…%Þˆ‚,üÀ6wN¸çY+âïŸfs.¤¦eBF¾ͤRR¿á,´»v…Æ×extàSMß7(Ýå hé^l…¥ñþóñºZtøvmÍIî%<căÿÒµÞÕ+!-ÆðXì„ЧxZ.—F]„ëåÛNtäÚ×´ÍÒFó=1ßÂÿÎÖ鳯pe‰§z¸¹MO¢NGàÜŒbè¿Xñ6Dx—`ûöËmÝ\0ý…Ђ |ÔŒóÿj… ú{Gø}tOŒ‚:†ìk\¹ l ¸¹NiVN_3tS+§pÂV×`{õ¶­é)ja+>Ka:ެø-Ñd…†Þ£#hûÉZûUœ æ€Çq¦9gky¿Ñ_±9ÚqÆ…%÷ä¿ÃÅóÙ—u„¬·1üRzGœ&®qÔ¸iœÆ^Gÿ 1ž¿Õ”ÀOdÑ\4##ãÐÁuv:Pí Ëa3yƒnÔ¦…@x꛵ùÚRµN aLkñ_¨VH§&é´)*~DëcYf¬N›L¤Ëùýtì}FÂÁS»NãåµN/D?‡yë4š„¢¼eb¹ˆ¤ºã3q‹zÈ¢Mx8aîùx‰?ÅÎ$ GáÑh6š†£qh#‡oãŸØá¸÷O(å Aßݼ‹ú‰3qþxâ'òv’Ü^ŽN ||í}&F¡è‹¦JP7Dýøô×!?áåøÅ?¿ˆ5*dQi;7ß“ qÐw` #‚B&"ê 5“ÂÇÝAZd=íÙ/å¤# ŽÌrh(…“!K_F`î#«d¸ìpÛáqDµ˜«…7*Ó ;FN*]¼6Qõ¥gxi´F?й. ?³®fE1é:›I½]i{´<ð úî̪réEô;/cñ{–Eù®‡á¸Ýùç®rès0áIiu*PêÍ…Ôb9ÚÐΙ‰ Õ&Æz.—ùV9ïKF=tCÍ!Ëæ3÷H{ßùú¯¨“\zžÎ»1ÑHÒÓLÉ“KÐŒzQeÜCfq˨–Él+’„aòÐøü4Š ²4%É „†»¢ûq.¤÷;ìÙó¬mÒs¡ûAÞ6!Iˆ“òŠR²õP äå|¯<<¾­&Å´>hç‚‹À‘,î7ìó¸‹-çø^ILÝiÜ1˜¼Î!î?*Dƒ2¡‘AéØ-$‡‡v½f³çz½Ç›ä¤–´ôµˆŠ[Ö‹[Dü 6¯¾¢ê;c¡}4.Ú@ßeú@aq³¶$pH‚Z¥Qá­[d؞׫òëíªŽYØ\=ÜÖojßüb\žŠj}%KKUçB!èSSó›W9íòŠ^‹_õ%òŠŽíÌj"ÏWã£õõ[Ð.ï[­Ñ Â@¥N ò†µ:Ëð§|Œ6E“©v[Cy›¼9„Mzgaý1(ÓW2,oÇóJ2š¦ƒák/CJRŽ;rhm‘â q¹@ÌHOÉE“ùTú¬5­ýC»öO™7ôUÖ²\ÌâßgI ½ÁT½­úžPL\µš —õàÒ^LL ‚RœF“¨ÄþÝQ*¥*&Y…'㞇ö%f÷¦Ú•˜Sv·A8\6èœÈò"ú;ÈP"wü³ ¯~'“„Ð_¨³äh¥pŒ† ¯F4ŠP—F1ÊÀ¶qØ«ñÇFÑÂé,÷¢/j5Ú¢&êvIxHÿDfÞž-¨ðàB!:N¥Òj„ózFy)r¨Nÿþô×9GšI)IÊIÓp—%ewÖU” dzÿÙ‹ÿ jW¢ê¸–xìòøÏÃ\ÐÇáðöµªß·)É“Éó?U’®4EX·©üþ˜‡{L¶MWÖ?DÏ]4K}¡;?°).N{)9•÷£üh=½,H¥ôJÞÊ!šsƒG½kÃÚ‚õ¤M˜í0Ï×Q^Yd$cVNRÍ]EíþlâåýÇ\ÇÊÝiéÎCkÔ_©úNß´™Ï戔³°§±x/“ˆ&±ƒé³6o\ç\{€ƒ#M7Ñä4¿•&e ß߄ܛl_œC7¥Qh:ßEçi<@iíCŸÏH\'o}d¦uºŒ¼Š½Œt~HÓÚK„M»þñ+b‘tè,!}íTØäÎp‹œi ºì‚†£G2Ê`7Ô–¹•;–ƒ3¸k–ømÜâãæµ6‚GYp}t  ˆh²TiF5ëͶÛn¢Õ£…£ÆÎÈEo4â2á´¶ÖÃY­ò…&°(´²ÜX¸õ»i _à^ŸÚ““>Çï=BZ³ÞÕ¨[VV¨¹xÐ$kT~£æÇº“!‹_5n'/o³XÑÄÛµYLDœ#SAÏ#ì< ζ¶Ð_%¤ï—K÷óü£ý؇ö«ÛT¾R¸é7³Xúë$X}vo3W3¨Ä ;ÑdÈÖ(#|×oTlŒ+Þ¸C} v@½þdÕîËöšÃP MQ–Ùd€ï0Ú·Í4ÙVÞDñgÛX­P*›††Þ2oæYþÐUŽã·gç&”êìò×gÄlõŽ>¾¬=›D/Ί_¼¬†DVÕÖFmãÀžÑgŽ\éÛdávaÉadM¥î„¾¤ªJ[%¬q¸ÂR4G¦Õ'¥2I¹p2+ãôÁ&}‰P‹ýÔ1àï±H-ÔÀbm–b 4:–Œ‚}±Œù'4[DÄ‘â³bôUË|ö9°ð__Qv\º6)L¶í1@þI÷“1ñ1‹KèÿK,üÄLôÝÙa&8lò_ÄH|NÚHÁ*éþv£Û¯±ßê.Ýýÿ¡ø»z­Ä•7JìîPB­4ó£M"Bƒ[oŠyoäÅ¢÷¿ÀÝq¯aXD(ýc8©ÝûI9ˆØMàX°'hœ‚:h€Ãe»*öì-i„]°SQ¾©|,7ð€• GÅFG¿µÂ½@3^e! o×dî¨vIµëƞ툂 é*G¹ôÇVÏ×&mÓ5ëË+¶O¨í¦O¡3éÔȦ•?¼-Þ`+¹ôñTpr U˜Ï¢`ºêàþªƒÀ\<5[ãî_Mœ!w7cÀRðt@†¾¬C›afÒl´W¢ùž§X<ç_Kç)h·ÑÖÒÇ1•Χ?˜²ß0ü>îõxbˆâçaÇNSc@>,îKƒw¸¿"8&Ú;À˜™‹ï‘JÑõüÍK×›>]Eÿðµ×_œ}qGz}Žn³¨åo"^ºûm ¼‹ñGÑOšîý \(^«Ö†ÆB ã_e*2çTWûTmâ¤Wf‚ÇÜèMÄXNiâ'ÛÖ˜ƒö¡psÈ>é=äŠV±¦ä‘0‹Yãé2•›ÇÂn«sµ)q¯g9Yû,— :]q±žˆ)*Þå´[[B §÷|û½ùnÍñªvÍpÊ AeŸ=7Ž3µå;îp¨¤ŽÑûèâ3‰zíçoíg©½1±ê䏸dµ[¥3DmÜæÚËÁ³À¿BÁHïUVª¾&ZËHylDþ4É(úãêm£ŸÑô·àþhaD;Ù·ÏÐdFqWѸǣغ •ÎpÇ‚VÐ3|ÝÜçƒBîuÇaÝô:¿Âø¯±ch4àm¿±!~Ûo̦?]?gæÄä½ÍºÝñÍUP•ãaôTFpÒ°£°«²J¸‰*#\o2ßñÑbþSt‡Í,-ÜyVྟ6$xƒ>Bà¾zmv™·â5ÉÉÊ8C†­Pµ*·m¼+o€"Òÿûjí5!.:_aùiHQåúÒ‡diÑú¤\È…”Ì”,ahnW$ÜüºÇ°äÖ âDœÂo£>Lx¿Nk ?P&)f4Δ AÕÉ9ZaÚ¨h#‘æ§]£ öõk—Vš¬˜TU¶ozØxœ$ŒIBWòzu›nÉ«tm£çÈQçx#[üR–mHtÓ§¥æý†êd¿ãú¥ð‘].Úôí¨4¢^'F(–ݺ}ûþ²rKÝŽü½‚Ö_2¯ÒÇ;—h2b "ãb’T‹¦Ê¦þ/LHivŸŸil[­§‰Üâ  VŸvï’'˜•Ä]×/[ªÙ"Ìuåz‹®¼ªIS&d­Â˜K:+SUÍ©ï,ËPæFLâ㣄n«î¨ÞTÑ ÝÚ~h®©j#'SÑ-^A\zKÌ#—Ÿ>¨+€× wÐ+ñmAaÙ8­&)vÖʰ™’³4)µòz(æÚµxíÑ}ÂÀµŠdI1Ñ^ªÅ ÿÙ @(ßaE–” 0åa!¡ŠßM¸Ó°ãXÙ1¡K3ÿžIÔdF_›Å|o~ ›™-8‡ÉM€p_”(ñxk³$í÷âz’v ’Hpuk÷xá–?É.:¨‚nJ Ñë I<î²Å3B#-±y…H3 ¯"ů"Qkú3RAÛ(Lü¬Bä—f’`çÚÒå\WSf·nçŒÝºs]¬&»uFwÞûo,Øn endstream endobj 518 0 obj <> stream xÚ]P±jÃ0Ýõ7¦”bÙ…4c(v ’–*ÒM–ή –„,þûZ²ÉÐAǻӻÇ{—”MÕhå!ùtF0ôÐ)-Žfr¡Å^i’f •ð[«¸%Iyæö„„Ý¿Oåå¹<³{J_n×:݃Än¥\g‹m}S±yô84º3ç ùZGïfؽKÓâS˜}8‰Név·’Å ›¬ýŵJŠ"Ê¥«'a$Ž– t\÷HrJ Èëº ¨å¿¿×u£íÄw ³Z˜­ª‚äûCÀo§CÀÇ£ÆÆj!÷#¶˜œ[üÄãĤÁ”Òø¸Ÿ56lÅ÷S2ru endstream endobj 520 0 obj <> stream xÚ­U{L[׿×6ö…ºtu1}ØN»†ÐeÄl y š¬,ÑL ¯Æ˜ xCì ®)‰/6øõaã6´ CHRº ÄÉ”($RÇZM©Ê:m]¦-ëMë¢u‘*Uѹæ8ÙŽq)¦ý7]Ýsï9ç»ßïw~ßãÒ”DBÑ4Ws¬vOåÁïV¨9V¢I¯”^ú"ùV–° ia£H( ùåÝKþ•+z–¢è©ué±ï±ôØò-2RÈÀÜyœzŒ¦×¢ ƒÏ‹¡:T§@:¬óyCÎ Ä‘¨ |0ìx}x *9víCûà›£àoxBLÔ±)àrñ<“·Ô‡ ‰ä½½H^Oˆ—^&TÑnDZìÄ‚ªÃ1<†±9‘Õ#Š)SÕ©rÌá*tñÈN ªÑ Ä¡*|óØŽ÷áj|BEˆŸM â„à"Z%ˆT½U©ð”ïÆOã|\Š¿”XŽv¨Ð”tu?.%;b”è$%×f=¬’-°0±j½‚5)\ˆgâ²MøL „ËØ v—Ë“ºÇ½÷8ÀnàQÅè€üÀD#iõ"®`o8G^…LY2„{ O•š“öõ¬Äö¿à~€þ  CWðPê:Uœ ¹ÀŒÍ‘Ž¥-ìŒ:…) ŠTƒÅîuÀ`±G•~±Ñ#\À ÿn©/o K9âäïI¾Öv59N5îuì/c‹AX9$¸§ïð”u-6ì÷ABƒ~ÏÐkãxí •»c^/0ØTà‰ì¿òJ¼c¦íçíÌÃ7¤ÖŒ¢+8¨ –ÿâʹËáÑ«‡oÁ³CÙ ^ËÊUoÇYõ<` àq}y|qÇ,ñÛ†ÜãÀ„c#9h¿¥]´¼c¼p|–I–HÿŸŒ K~V(˜¥¦„ü…ü)±@Óò#¿¶½i8Ssµfâ(08{ál,û„¤L…dðégózïG±¾ó¦…ÆëM`Pöm$"é%«@b,Sal×Ôþ9«—_þí'_ ,`¼÷|IÑ+/mQ½ Wz&Mç¸óÿÈì=.oª¬Ø€‰Áú#_þíþ⿪އ«ÚÉž3]§ ¿*gò’źÑq¹E\ Wÿ£C”Kcè)$û­'4ßÈ÷R)Þ…ŸÁOâ­x+"O´K…J¿±¯‘âõ€eŸÛÐSiˆî„ðË8©ZÁ˜ Hø@Nh±€ÕªÄdøE¼­}·²öG~ò³óð!œcÐCÙ×&)‘ oBß«BëГhãoP¡2Opcÿ¤Ð2-èIG2,ŠÑœðP‰³":"#Hêxe!hŽz+üº š¡]÷Ó6#ëéö:½. BF¼¹®·Fký> stream xÚ•Xy\W¶®¶¡«4‚J§Șn4î¢B3®(š!â  ²”²ïÐ Ý}ºÙWQÙAh•E(1®Ñ“ü&ê$æ%/3‰8ÑD'>2æT{ɼw³Œ3ï÷–?¨þQuëžs¾óïžSÆÊŠ‘H$¶[×zû{Í[çí°ØÕrçU_R2ÝÊ`ηÈÓ%âËD…T|Þêe†‘ìœf¹2Sè•™j¹Î¥¾×ޱ’H¸Ôlpu]ºÐÕuɺø}‰»£c’gGÌq\¼|ù²ùŽK\]—;®Ý•¸;",ÎÑ;,9&joX2ýç-GßøˆÝQÉ޳WÄ$'ï{mÑ¢´´´…a{“Æ'F¯š3ß1mwrŒ£OTRTbjT¤ã†ø¸dÇÍa{£Ÿz½ðéϺø½ûR’£½ã#£㨟66ÌB+wf­ÕFæ÷Œ·d+ã#ñc¸ØIiR†‰c¦0S™iŒ#g^`f2¯0NÌ,Æ™™ÍÌe2‹˜ÅÌRÆYÆx0ë˜õŒ'³ÙȼN÷ñb61ÞÌff ³•ÙÆø0¾ÌvfãÇ0;™@&ˆY0dÅ”1'˜‡Iý„)ú¥ÎÒ+'«l«O¬÷[Ÿ‘yËþÌ®`ïp ÜØDã$ëI1“¾~Îç9ÓdýäïlVÙ\µm+mÿsJà”ϦzM횦šÖd'±«—Ï—“‰Z[³8*à>“ä12ø&2R±ÃìÅçë·C!èAcŒ­J€tàÈ äåpÂ*]Ö¨>&£Tl—áŒq``H×=ÙIØ€£øæ¿ÞeÉmqÿýþÁ¡÷šhu º¡^§ÛŸ§É,È+MmÈ-+dqά-Þt•|Ž®RÜÿ)?ÓÚ30ÐÓ3 °o’’¦'¾’ë¢T4š·òeµP®1«&G‘ E9šœ±)_h_”Ðsi êzE”Õ•àèËj“ø“dŸÇt|^*¶ãMþ ˆ†hô$ÎlÉB 1ó;)" ¾Í¹·òÏÁ÷pnÂû•çjG>ªn…З~x×Á7a,_p-ôÏY¸)g/XŒ€ j„ÓÌÃç¤øƒYÊ7Cu‚BMcÌ/\åã©À¥©e pÑpå07VO”*ötÉc~ §)dÄ‘µlƒÓð2Î8)H.£n@Z3õ˜È«dÚ´ü7r Õš5>Ž¸È„Sç£ìO×ø†Cö•?’Äf÷â­g²[»z›Ï*à\XCviGëÉp_m\£„ Q=ד`fŸ›GKã2ĵ«êwq::™îâT»ËøÒoÏãœ)ÿšæ‘]qÌVÄŸVË¡={´¨F× :Ömºš<¥–&W]ì“â§ …Õàw8¡*¿DoЗê,%d3 ·YQÆÒŠÊSCªû€¥¿SÊŸx€ ™¬H‚Mea—MÆŽVèã·HÊöÏßüꧯâT…üt{xm•¶f3%¬³ z5JúÌG¤bœÙW·çA&ÄCqAa1ŒýÕ^“­-X \ªJv’²±óÔ%8A¡eunP§CIµÁpmì±Iv•8[ϧ«J¾Þ;ÐCWÍeÉ}1–Gé´&é2[ójpЄ;tÁñÎ$,ºÈEìŸãñ z±­^ä=W‰²L™Ãï_…ÛÜ×nŸwÅØ2c#2ùߣ#eøÚŸî†»p©™÷>xÿƒ¯jÎ2ðÍêf"/I7èZ€k7Û•¶O¬)£G }ºø"ºHÑÅ,çÇF,Ѭcq'Î¥föà>2y¨óPÉP;6‹#èÌ~_¤{öTn„…@$y~±!A—fm¦•b.¦¨öX}Þ²õLt¤æhö\”}[ºV)`·J¶6?t®b;Vã|ºC»G±áÙ[¨±þQbù ê“ÙNfûdºZˆnÂHAœ$ØY›‹3‡åÙæçùÎ}W*€«‡ºJ þL`c´n¹m!ì˜ì¤B'gV.P©‹‹LNÈŽÕÄ‚;¸w^ ½˜{þhÕøÎ‰áÞ³·O| ?ü+TË>›wÖUûÓ0ôdq!$g‘EX£”g‡QãÙkT.^ÿÜ™Rì§À¢L…kç@pð·¸$£PËTl_ÉCz}…±¶O>ùéÍÙçÅqšT@{žŠíê65¤€I´ rU)z}¼6I«£ÕÁ%Zˆ~NõŸß'‘Öc¦!ÃG‹š9Q0°Ø6ö°*­¶¨¡ò@iv‰ÄÞ0žn™©äôõݓņ&˜H›jP'r¶OìŽå¼X|^ŠÌVo zG2þÿÎ4²bÑØÕy}8ª¥ø1 ÍÃÑ’Ö#®MEi} 2Ì©6öÔÒuh zHáÆæ°¶æ#”c•}8üaìÂe¼È£§ •ÈÝĉ8aöŸÉkÊ1÷ñ*µDy’"=0ðNŽGÉÒÓb˜'/á0þF†saõºõ°ŠÌ£24ª6% ØiÂÎq]˜Žù8×üå¬< Mø#8‰EwãÊ;ð[²\‰óRy䎽ý>|À="þD¶*ƦþbÕD­ö÷?ü [ìdågq¢¬NCçî®JIø=~´ûtʵb*›?ÔÝmhÎýÊTÐï×ç©âRöÂÈ¿QÔ¯«)øƒ¾,ç£í¡ ´Ì쨀ü}Àîú`ÈüÃUƒò[¢³¸„'³:#ª|»á]‡£×¾S|v·é¥I k®ÊZ”øÆS:€^¯Þ²Ë~ÛWU¥*×Í›©¯ãÁM)ÃÝ…(Iâä÷î¤Ô6§ÈnK€`.(aÃ+ŠÕ@æ7àý!(K. 4ÉJâŦCþ!E•CCöÞÓÐppù5´~¤”ß”¾ö¹ëaê·¹ É,$íæËRsºø#_^WZu ¸Ã4éú ݾˆ¤Ig«þ ò”P¬-ÒkIÈX=Ù-&Yß·0c„F.ƒºèk;~”Tf”‡¨ƒšVZz—4¦½n9† Lv]8q=pÝP&O'Ýæß‚àïgdµÐÚ’ ¹ÊÍúV G+|dýûdޱ-^º«'ýHgWS¿ŽÑØGË» µÀ}ܶZ¹›ªÈz-©È2‹›‡S3þ §~B_s?—‰‹ùùì¼E¹‰=§TtqIýÙK¦¨CMâË&ÜvÑî1ʰ Ÿ—gãqC,ñ,°V±×* R9ö@`‡/Yˇ+ †wŒPðæŒÞ¥lvXpŸÌ¢Úâ;ã’Ò¸rBi^Êé9Óq‘®±bã©lOˆŒ VÇ‚'D^Øoé‹*5½â”^ÉIÊtª$8&Îã3²t©Ïýã—„+ßF6®%,áˆÃýù¸_=†\E=¥ "ƒ6tE¹ ›‚Ò(;”€.C—_@^ÙµuÚŸBDéxh;eèlñÕ>Å7Ê­Ö»N)Å¿ýc˜ÄŸ•ï<å_¾‡îê^æn´cfbóˆÅ ŸTµ)Ê  *tÙê‚tHçB{ÒÛu5õõG®œC˜0b=Þþ›pþ·7L˜Üg×uߥ¸¥pÇóKùj¬D~)|88Þ¹¯‡„ÀëK•Äv??”ô¶®rÀéâ§ !ñxvñ†&cAW¤Ë —x0£½ýàáÖ–Ìž`E6¨´»b2jÚÖÒh¶¯¤¬ o ïJæäf&>F³‡6°Ù¥½±¹ZTØÄ\\ƒ*ôüôÊG´ Þ{½Û÷è˜T È°«B}AuéòJîÙÁSMëDkðŽŽÜA§‰ÉCCW߃zåøò”Ê|†¢LJBžBvÔpÕxòÔÝÑñ!#ŠEÉ—Ãïu7¥®V:m<û¸–ýÛŽS.Šy°-9‚Ãoþ‘P–ñBÀGGÐÕîSt%“‘ßÃdÑ'–EWÆYwîÙi6ö{[gÉ’7+T-~ÈŸŽîûyé7uŸ¦é}škÿ‹–ÉIJ› ý¼üL¥ž¥›0FÓ‰3ã›m@9ÛÑRYÞXÿˆØÙWå5¤–˧]±BÅ3~e(3uë-cS& ÚÒܲ£íñ…Gõ5U‚ƒÀîÓ&BÂ>/c²EûZ D[YÀÇ%ŽPä8‹ÉtxûgžÉlŸøŒm²;ìéŸ|˜þŠü8ÿ úWÃ׺›ÓVýw ÿ/kÙÑ€>'…+øïLN»·¨$ ÜÀ'$v'ÿ–¬±ø*~š£ñqôW×(äƒÿ“[ÿ.øù$pòÛ¿Ú|jK¼I•OþT*,á)ª øÒ¢Gdù­ë,â@¦ÞqÁßኯá©$›x"§‚ý•áíƒÝ‡Oô7 C?ôg5Ç4í†íĹaˆœöívÄOÀ&Qr1¢÷5ÿ÷á¿ópØ`¨¯ïí;WÞ Ü‡—6;2ÃÓßK™CÕ9䂺 p˜[i5sz¿åhœûãêîzŸ8)×€ß[ÉœüÁð¯4‹RŽþ9v:ËþäÀÔÞ´Æ_4÷¸gòÚìÔˆ­j:²zoypæ…«ŸœY±SY—ö=¶Å¢¹NKˆ’Ìxä†Jå0 ÖõÒ„ÿ¶%Þ§æöÒ´Õá+Û-GómiÖvá]­YòÚ¯’nÉá³¸Ž•ßþ¨ m¿SèõYÇ…w¥utt5õžßÑá¯zBÄÎäMTÃwjLâoºìNö‡ÝÀ{ÚÂX>0D¦'ÔÅ”G·—ÐQäE%D4îkÌì9©¹ÃÉGLšsa+·f¤(f@­¼¢ú"Èù¹o‘<í[*ÀMhz Ä8{ëÄ…€ÎJHë‰9JYÙ[¾²Ž:ìKÿpu£d”¦’ gðäëøUÊO/ßRœW°c“â·ÁõvЙ–8£¯ŠÕ»Ξ­å¢Ùñs3ú<-‡_‹!]ôºÉ¯dÑó—SS>(Rb¿ñ+Ⱦìò?UÚ¶ ¼ÿÌ“Öñó”¿*äéíp†>¥óâ&qª i37IÍ)âd¾¬®´ò p›¬Û«OÚ§2¦Œ7YÃzµ´Z^;“TÙ·¾$Èbõþº½aaÆ,ºæ Û´“¢¬§­]µ‚l·Ÿ‰5–Eáºp}ø[»Œ»ÇႱI™¥ûÛÀ¡ J«+>ÆZûǤö™{ÜÏÒ*i¯Jñ¯¨§ç¾PW_^ñ…Ectþú¢ÄÆx‹oõP««-,Ö€®¸xÙû9ÈZ÷ ²ý&]llˆq]rƒ¥b¿‰¼H\2Ó£!(ç emïè-2ÒËÊ•´è •PbÈ Ö‘*Y»á]ãñ®AÝqºfýxA©Lâ;Ô'd¥b Ū¢¾¤âº«$ŠUbbˆ1ÕâqÐÒê‹÷ëõ´[ÒÛ9¶X_d{t‹éðb´Œ*×YÜ26#9(%(vãzpÈ¡ ¤ª´¥z¸ãI­»ããÒ#„ð«ŠÛðε#—-=ôŠVT©D©¸ƒv„•5F#TqM9¡“ÊòÈ:kAV>ÚiîÏ2Ò5ÆäqrH©£…!N•Âk•,ß9k3±Î]f«®·VaHSuŒW°Â$”=×[1y2ÊŽN¶QL²ZÖ8y¢a²­(þ¿ãø£í endstream endobj 523 0 obj <> stream xÚ]PÁjÃ0 ½û+tìÃI;…ÀâÈ¡ÛhZXŽ­¤†Å6ŠsÈß/vC;H §÷$=qÑ[kðorªÃƒ±špv )„GcY^€6*ìUÊj’žqq’þSNüÖÅ­y§ú'/Þ®—&ÃrY=B±×í±[ç€SkeÉøy›8Záð¡]/û"d쇫èÒ-Þÿâ„6@ƪ*Ë7)§qöR!I;"+³¬‚²i*†VÿëíŠ~PwI³ŽÌzDîŽFUô÷´§¢mozBr—‹Ï?yç£*ÅË–m} endstream endobj 525 0 obj <> stream xÚX T×Òîa`ºED£¶B{pÇ£q1Š¢¨(Š ŠË€ ûŽ *û:S Ⱦ Ã"ë(¢2*$šhÔĸ¿gÔè3úÌ&­ÆËËùo&&yëah}ïÔ­ª¯ê«ª+cLM™Lf¹Öe…ýZ‡1öNs]'¾'½™²šd½kÞ™h&¾ÃˆïÊÄA&¢ û›bÙŽ·¤'Ó›>™û}¤çhúx§¥/c*“q‘;ÁÎnÒx;»÷ìƒC¢Ã|½}"ll7²™8}úÔ±6ïÙÙM·™èæ»Ù=ÈÆÉ=ÂÇ+Ð=‚þ`ã¼Ù×+"ÚÆöŸˆˆ&DEEw æýᨱ6Q¾>6+¼Â½Â"½¿œ\,‡ó¨0žÏÏ¿,Õ  Õd«w&$n‡HnsSôžÊæ’Ǽ[ç °2m]àæ½Ëa;pÄœŒð&=•#樮‘W*¶J{jk/C•Å0ƒ¾BÏ×o¯C]ý-¨¦o'³ä=ì)‹ÌÏ%'„}P”›Ÿµ!:{GqQ³&- ÒA ™!¹~OïC{‘ÿÝøß½ýÕø'ßV_Î>ªI@šôôøø´Ø )Q±“#ýYKüEÎÁa²;8YŽÞâ%^=ËÏÉecb’Fi\baBvñOwÐúK¿“.›Bü<½k¼Û„zØ]’›ËYŠŽ$K÷je… ™‡rÑœ$ñÚm»‰)šªpHŸµÇq š¢YaaFdq…q*$RóB#É0Â. K€,²ä"Y€C·g«òÛU…Ê߉(Ç[¨å—8à2¹ÐJê!àRã N i .FSbj ó@ú¬]G¦Sbg´"®v y …=:†ìW¸p!g‰óÊ ±CN0H:&Hþ£/†ÉqÛþ_£§§_€‡‡>àÀ}ã!ÁRèÈ>XÄuU¥ŠmÕþ mm/ •bJ±’4ÇóhÝnBktÆþrQ‹þ¼»"=2ÙygBRò,Š/G&(Zšþþ—’”óU;<âÐÜæ2±"f£]mØYÕØ¬;*@k€. ëàÑŽ,pd¯„Y«í=T$DY%HEsÛÅiÒ©q €}÷ÝÁþ­Í²h‚N8XŽÅx‡GSê¶F Ž™n{ y%ÐÀ ª÷p rŸðtöÆé_ÿý©Çþ'j¿­ýü,|Í]·?G”ÄtºóŒµvì©ßWN5ªJØ»>§õÐW Ü}pTB`ÚPßPµ—:N¥IS§¤C2…t{6TFR:Q—þerq>NäF‹s5š¬0!š·“<îZf¥Âý4_e*¶^ûš÷>ZêÓÑ,‘‰Á<¹L ÛÌËøŽÓÿHÃU ꣌Vr/–ò{“j¡ªáS¸p¨±üĨâvAaœ ‘25uÃŽuñ.°Ü Ö—%kÓµéÀÅAÂv%9Ìnƒø !´¹ù…Å͇ïRWøìa(é­ÜKŠ}?å:ŠV6‡Ön ô‹^?ùë©ØÇ?¾}ÐrÚ=2H¹Ü’TþœQ=$úOм®YÖ†ç®ð#`ÖªÈÈϽTV—ý ”‡Ž ‘Á±;œ —8Öq Û!W¨â¢œœ¢R(„ÀãŠÑôÜõnƒÅûÔÖ›xæ¦\ì%šòï9µnpÏ&&2b=oöhVÕ.»æIÌÖns€5”ÒŸº ÚÞ»‰œ({¿ÍµŽ# ŸñQÁUTÍ›/µUwmtÀ#ZµÂ#=ÞçQø@¿Í®Ö3g†ÙÛºt|-ÀÕ#GÕvkPæ'õø‹äò~è#åÛ@ÜÇϧ”Eìh‘òÎ,­ÏÖé ‰k©òõÛ¾iþI×gtïøo°à`ÙA„Q3É ¢|ôZ­ðqIÓeŽ(Vó¶pë‡GpeÊóPµ"+>?Pë~Üü Û©‚eçÚvÆÐ7vNç“w«w…C¨S“£IF×K«ä NKO“˜#Z¥Ø£=õµWüÏn/.Ȥœ§ÍêÀV¨Sœ#vfãTŠ&íchiú jè¶±,¹'îà‘#‡ÌHŒÂ²ó =óc=Vd8œfíßð]ùι¼êE×ãÁ*Ñ•Åé·î?RÂ÷Ó.’^y8¬¶î6´q§Þ$“²Š|Éc:²Ït³ÖÎ÷´§‹Œ"ßðø1º±Ø£Œ0—øÎ ¬Ò²³#΀k*p‘= ²³8XÌh•w&tNæ« s«ð‘½Ë±…ÕsÀš$‘ñd8ÙB‘Œ%üš‰°&ív9çÓâP€J®¶:ýiþ1¸ØË½ÌÓ&æÑèâª@[MxF‰ø15röߥF¶¼1r:‹+Ñ–d,ö&ÎJâü¼øG³÷à’ïþ5õåë€ð@zì\ã³ÞgÃB¿‰ÀYvFRçµ°ô˜$× §S›Vc¥æH2jË,2—Ò²¶žV<Ê÷˜­lÅwÅG îcg,E;Žý¢Âs­Š L0ëú™ªóp°ªÓŒ¢²† ®§Ÿ×‚'QÁæ³ø®ûÝ{õZTÀþŽûp\*ÖX’}”»in÷s“6Vb=Uà$¨™[LzÑ3,_q7ƒØ·€÷(Ïu&àvþ†A®¶ÿ¥Ž°Ôb˜ g!‚7‡EÅ$¸Sг-vºêy$üs@ xVvéHÇ¿÷3±ÿPåøºäPÇ^ÿOÃ3+„üRZô§¼Æf¨D½ui…1(¼Õ#ÁÝ}$xK:™v=&¦*¶YûZ[ŸB³dµ)kùÊô7T­ä¢¯8ƒÇDÜXT—{¬ ì2µ6΂0*‚­„jÍžNÃv™“+fxç… ¢f{{Û@]7†­/¡¹ù%ÔÓ£ûì[ô"MÚô¬TH³Ž_[Û¤ýZþϘu!ì*HÛ•PLcaêïTéäŒQì°ƒ¼G{Ά†’µA±Ný¬ÞBo?£FœxýÍ‘mâs‰d°O’Å}‰ºD „5ñ¥{/(`«Fš­ŽÒD¡RTio@]Ý×F5"ØZ”Â3ƒ²4Pɉ'3X¬éz¹+>;¡ ¬Ë ;W6tšXeH‡*jµÏaïÞçÆz8X|üÂ@|ÙHH„ÄHjG ½’ìèÎl“ª~=~Æã‡ œùÝÝgÈŒ½K¦+»Æv[ øƒËX|[|Ì㘾À¦’ J¢ÄÏ7ãô‘ܯÇfC_£ØÜo§¸¿ãñfýø„{:äqºÌ~ûœŠýù5ûÙ~DZ§â 4ÅU†6øRþ[H<Ú}OøÜÖT÷Sáƒâ²¤ÌXå6Ð$kbS×DÓ—|!é!×ogJGò5ÂÐ’5¸‚'=°™J©™ÓWj&“™”Ìâ ìAÙÙxõsÄ%¼meú(æÚõ§ áÞz˜ šràtY¥Dg¶rv É®ILP­³ Ó­=0šfûÐÙ‰L ›×ÇœXS—ò<âéÖBuedQl}0¸rªÈˆ©0 ˆ²! GhvCfp‘A ‡¶ É%BddäçäÕÔ|¶ávìZBí¾|ñB ÿçô€Èj(@U4\¾=!ÃR yÒ:ñ‘Š(’@+oÊrïâ0ànu}Kƨ7µÏ`ïç›RºŒ¿½ÉÒÅÜ©yÄDâƒÎ‰ºÎžY§O'Ãgeå_®Ì PÛCRð<ˆèNšýPŸcEÜ»|H€˜`öAá¯^þ¶Æ´zÀbý?zæEåiJÁº”6òy:ÎXȤˆýDgad~Q–VŸi½'3 êÛcPD¨gBpÀäîÌ,„ãÐGFW+JžfßHÉ?<|m!„®?f1Œœ'ˆ.1.=Ý'Ý:Lª .DÊ[P×ø7cecãÁ‚ iÅH´Â…$ÓlšTùžÒÊ÷̸>†¶{†=zÔâd½l/ÊÑCjUx‚8÷,ìBÌS§º7E×6ÔëZ(OÞ½½@ŸWMÛ+î«C^Ó•›YšË“6¹rQ•…ã­‡¹- úQhWèr¡’fkŒrIízª8";Å›í¿ÎCO{Ü¿#ÓøÃ.ê³½ø¶WµKó_ZÈÑ“€dN’™Š=›žÊ®[Ù²ò²òÒŠöÕ'ãRð…wha4îí aý6n—¿ï؉ݭtµ~ŽJØ+·¸­Oð‡°åXL%mdÒSšÅͲ´À«ø`¾0„ Ñ¤Æ%o Y8Fì`À±GNgà@˜sZª¤‹5cwBç¾w{®¥¨í6a³W‡ù´•cÉ»ßOÀ‘8±¹á÷&I'eS—âS©´vÛC6²[Ë7Õ;Ѓ†Œ˜DlÈÐ'SÐZyÚÊè¹5,:d›X§d8 EÚ™w=àÝ—ºÆzK#0`¿/•ÐW¶4ž:]‡àp´~5-?¥]êñC½¬‘ž™HQW 嫲¡F É×7´¹·º-—Šï”á¤/±yf‡cpÌ‘e%tVRûÓSbC9FºÑ-Ã5øÎ)e½©öPÆ]syÓ¾J¼„\JÇþجDí®ÌŠR:÷6‡Vùù†…û,?xåÎw'ž bÅ÷Awè¸I¹.Ç»¨ç±ïO…ùy¥Ö$T[B]ºY¶°:=I i)ij5YDFX‰*öŸ=E­¨½øÚSo³¥…%E•»±±³ÊI¢µ_Ã%DA íNªµ_Bm{±ñþ€ÝQŸ“™–O[Éâãönçþ‰x>û§û$ËW³Œ¸vƒº©ûWÞy—ûÐó­c#`ý‚þ;î.(Y c`S¤ÙDAfý&õ5YvëĹý•[gý ÿË2ûk¬ýË@³'ßþ7þc ‰§)w¾ÝÍ.…”¥ÅZ ¦}Ê„'d"™:y(@>‡qê½'ØW Z²œ'{Ü6ÒUysåÁ#» ð)4‡”WxÃpã¦åN^âK²Ú€Ãõ5?§&dKE`Ã;àJEÍÖÃaRÁôòÂøûäÊù®Q›ý¹ˆˆÜ?êì â÷ë(=ܧin·w]¬Tª2 Òåƒ7GþÊÑb™¸šß¢X=ͧ}]“#í1…¡ï“!dèÓ)h¥löÜÇ9²ñŸ<3Tjk?pŽõnñ²ÓøŽøKÛéGfl Mü¦n`ž?&Ѥ'nåõ98 {1ñÉÛ!šóÐo¯©Ñ—j_Sç&|¾1î*¹‚Lû3TäÉe´ÀØ4ÈZ¾Â_IW³ycë•Bƒ~gbZz|rjzpé–lZ2Éh ”0ûlmL­MÕ§dÁÁăaàÎ}h‘‚+,) ~œR¡ÉØþk×ÅþÚui¡¢tO¹ÕŸO`7p'ñ­BZ¦àX¨>j·Ç^ßìUù‹ –À1î‹û PÙóµa±¹Òàcì-EG3¬gWÈ~¢¸öj•®Vi© ×0tqWhlÝlmÓ9¿[¤‘|;âʵç® îkXÇÀ €ep¡êu-å~G¢øB\ú[%uego\:룴š“>b‰Ã¯%°#/½ªánq38çMU5•¨(U'ò´K-ùœ’¬ÜsÀXo:y„¨a…Ä@µ•©ÉJéÂ85ô ùV„ǽf'¥>m>„-‡Pºé‹óºúæmÓ¦VI­^®6¯‚¶4ݲ;=Å^|NYfÎg’ì u,x{Äg76ï8Äe§% !EV„ųO¥™ÓB\Õ°–î9Íf&í¢Œš™’© NOÖ¤Ï&Ë­ƒåÒÞõñwƒ@ã^×õVNtVr%XPr+^àn«¤4o«ô¯u%dfçìæ~e`>@à‘Cë‚¢¼Üo$òu¡¦û© XR¯\'™®NMV«'²²Å^f­¯ \eÜq™E;²‚&ýȸ˜ääi`­bÏhµÐXß uÉn‹Ü•£„ ÈÈÉ}ŠfV('«ÕÚ P×ÐaÜ3_Aª:_d•Rú%‰½ùìâ¬Üó’·|ÕioÈh“¼•žž¢I§Hì²"ý±AB"œjälDâ<‹N]ÃSãb‚Rã¬#7ú;̇4ˆƒølmFC!´púp]`@x¤ïúÃîg„ÛðÉ5Ú¨Z¾êĽ ^‰òW"ðú_D?Ö2®PtÎÃMù… ²!‡5˜£¬çÞ< ”UYôÌM§VXôȰ°{öÿDï¶7 endstream endobj 527 0 obj <> stream xÚ­W PSwº?ŠÇG©•f7¶»'ÔºZk±íÕºÚݶ”ZiQ¡ˆ„w@B!BBBBùäAB ó*È[žjA¬Þ¢}Ù+m¡½»;[wöq½íþCwö@wÛÝîLv˜9L2“óÿ}ßïñ}ˆÑh´àƒ¢ö?shﶈÅovçu_û*ïó?‚ùFóÿ|…Ÿðÿ4ø,:ðokWüÃh¿xzb·X|Þ\·ø|”z´ª¥Ï==4Ú ø€;Å„µ²¦ ö§RHŸr¢¬>Zùâ¾€.,l£kêj ¼†ª:9¡™Z¥“3*ÔR5U¯Ô–áZ…Œ•Jê°ÛL†Z%KƒL|Gßž÷Q Z…ž@›ÿ;Kd[ÀÎÃU·ƒé¼\LJLh8Õ†‚ô.¨µÚÛzºOv>h<Ç—\Ãy½‚—u–Q¡îƒNZq ±æü{ü÷Ó« jp‘ItÂërv¤v½N®#éäFòñ°©½ÿúôÏV­Ü$'ª©†Êe/=õLuàñ¼ÁI&Lx¿ô Ÿ¾2zjL0XcM×IºSúKþs÷Vz)a”û¸^Ö?q±ÌÄ=ÑmÕ¹ðý.ºüø¾]‡ÿWÖ pBÝR`9 •ºú.wˆëD»¨6]EÊî$G"z;¼S7l»ÑW@ey}#ùØãdÔ¶áí7ÿM‹¢¥ïžaB·qPïÅuNz?zþVðž\ö£äNÈe£©%3û…”•ÿ˱heti.µû7Ñ? j6B‹YeÌ‚,ÔµX¯ºL§)ÈŽ³(_).‚’%“¸ÝöSýi'Òˆpà‘?Q°ä ÆÞ ‘J¨¾Z)k¿|{UEŒ,­J°AÎ^´¶ „uRë?Y;¥_ÐEü/ô¢,ýéÅPÀ?úÂévRv›˜ã΄|‰~7Aì¨H¬°7¤'§C9Hà8pMvC£šqs¥­°ô¸8#½«tŽø®ÿ§í:¢ù£õVÊlõËf«¾¼šƒ‡Ü·q[S)‚É•dùèö³{(³}9ý½ød¡§Ñò¼}/Pf‹¯¹nbÂp;Zå8ë>70xð‹ ;äÌoImþBËô=›Œ »ý9C]£®¤ô/m(·07×™ê­è'úV­SçÐ:Nkj[:ìýo_£L^›"`BÌ1r8]ÂVU‚?Öš=üû“(\»¤B @Mu¹œË \ ¶R*t=—}¢Â$þÉ!gñääÏÇ)ú—ñoøx=zèÂÙó¬OBüh=Fÿæ«8Ü'©WÉÅ/<æNs×eôk†±ªÑ†ŸÏtg=Å&Õ2#h 3hjë- žßOn2)ùL(’rÂüç’Ü êOœYM©Ïp¥щž¨'B~£ôóéîƒXÀ-)àÙå{«­XÖeìߴ„-gå\Lþ4ä6ºŠÞ£Ú[ßül~ÿÁ°ÃäfÅ£A£kr¿Ýsipwmq)D*aµhËí’Ã/Ä@)ˆ 5šS¦º*wï*%«K0@\‡Ù+Žy<äzxa'½µXWÁ+**’K\.·ÓM,û‘ã½ö±y™é³—§æ8Óí o­mCÇ]ÊˈT«Ä”m Ã#ÏòºˆpvšlÎnËôòH½1’#Â=ÇçÖœ°3ᄾU£Õ:@f˜‰ò¾ÑpÂâpx}ãSg†FÁz©FÍR(s@ŽK„gkK·§ôd qRYìô{E¢œ2J”Žè}´/.Þ{]ÞV1ÔÕÊ(Ç—æo7ؽfwó)Ë廨•P*¥‚Ç(‹² ¾Á “K¤¡ìi´o¦ªa·§B6”ðEùÂtÉ~ŠØ».Ðh-×l#>À=À‘Þ‘â‹äÄw€¦¢nêˆùvùc in³¸?¼þc9'¼+þhÐ w SÓ¼ñZ€_‡|ô›û¯>ww|oz;æS´ÑÑF´™ u¤ž‘å{š€Ðq®kz¸ŠÒ‘Öcû™Z¼)/–sèHJÒâž` ûЖ¥wûcß ø-ù5Båª 5^YB…V©gzÛêZ;NúÖnÔ™ÁÖ(ñЙ Ó{ê›N£Çú2w•ˆ†Ö 0¾¸·0“ 5›Ã®˜Liä}¿ê«@¤(À§øtÃÉK7ÎçR'›70¡nÑ2ðRºzÃJÁ§æ¨ õR^DôÏ@ ­`çHUy \²b‹Ïrf<Ú”K¼ Ù‰¢béD†-÷PBÅIÛ‚-Rç[³hę̈sýõyÅ´þ­ä÷C¾F€é²AÄãyÜ]›ˆbˆÓŠÆÆ´ÐGÝ&1 øe)û&³ßEOt£à!>¡%­ùª@—m€~Ü嘙%¼Ð%3eäU˹TFIue®fOcÿPÚ™½äª´'ˆ¯áWWÄ­Ô ƒæ¥K÷ƒH;Õ~*TÌÔB1Ôl¢˜ªsWP [^7,MeÈÕå䳌íÿ¸Ì~cµOìLÿËØ]©W¨å¥¥o¦¿x€ÊAp7ÝÝèƒýwùô4ÚFm~Fÿ#‹—-•E&¹µ„È*?ä/“ƒ e)ÔTJ„œ|*KS*:™0Ýù[÷ŒÁ¡µP“m4×—º5‡ «úÆd3ø¼7—&›ªšl2®8£0ªð%HÀŸ›äœ#&àd»«½%¾¿Êv—¿¯ê41m¹€¶øeþµôS>ŸÇç Ñ+t Wa]åø‚d²ž\/í$`²ãsï{Ú&õ{£=¾½$’ñˆËœ)´{ýŸ‡^ØrçðmÓhë4Ê£N_‡vÓjˆqéñçGÁfÎy>ð}¢·i¿ÿa‰äÏ ¸À6°=Eƒªfè€Sæö1kVw .B_oû»í3gÐV˜À¿³ZHÏÛX–Vœ—vðDQo4.Ó@ÚÍÐ9=ÔJ·Ä)Ü9ÕÈt©Ó2‹ g-NÚÄ ðsüOÐÓeê¿{n,®‘C‚Ü$™°øb’øæxò§üÅZ˜‹[„¶ÉûÙø™ÀÛlütª–ФÊ,išºZzT-Ø *(‚2K»¡Á VÜ#ÐIx> stream xÚ¥Xy|Seº>!P 3IÇ1§€8 €,sá¢(BU6«,Z)méBšni›4i³''yOö½[šîMW(ûZ ,Šì2£rqp¹Žã8:_ê©wî—p¹èÏùÝ?zúk–ï{Þ÷yßçyßrˆ‘# ‡½tsÂÆ Ÿˆ‹_9wNä•Å9¬å›Žõ¨ð#DXÈ S#±Ü𤑛«Fþ+jÄ#ÁIüUä5?‰¯&Fž¿Ã˜¯Mð8œÑc&Vh;Rr·¥¥ägÍ™3öœ9óâòò¥…YÛ3űÓSgÄÎ]´háÌØysæ,Š]š›^˜•š"ŠOg¦ç¦ˆñ;b×ç¥f¥‹¥±ÓgŠÅùO=ùdiiéì”Ü¢Ùy…ÛŸ13¶4Kœ».½(½°$=-öÅ<‘8öå”ÜôØá(fÿŠËËÍ/§ÆÆç¥¥Š0âq|"†xjäÒ¨uœ"eD:‘5ªˆ+Ap š˜@Œ'!&1…˜Jñ{b!±Œˆ#ž'^$V«‰—ˆxâeââUâ5"Ø@l"6¯3ð™ÄHBÄ!8BNgç«/Œx‡+9z¤c””—0z*ùY9汓ƶSE匟5~wô–èÛÖN82qÍÄw~uà×Sxô›¦?ø.ßþÐćÎN¢ËÂttøzEÝÀì§/¬æ¢´Ÿ¿{Ê!vV•¸ªØ Í@yn†±ƒ,F3mUyt•Ú›>/(9õšo ú PjœF†êÐ9tË?cl+Û¬PètPSæWT «ÀåqºÉèðeú×)úð0Õ„ÇðÑ(^6;] +@ùÎ,w>È@]M€;˜u~ÑUx Z ÏqÜsŒD<ž¯:J@B±·xÅI[2Ó AOš@í:Álµ;¿s @öórØñ¯±ãSæhä`-)©Òø„màlñöø€Ùw„ŒFmð5çæ×\ôj¿µ¨A$**‰ŠZ[Z…ø]öµ:ôÜ×´2ÈEI ÿ|á®´ìÒ¼ü@A‡Ð >«Ûe13 $ØÊ)XšùJv¶R‰o£I­Í`ó\FÔ¤Õ…;œaÄXÖó½v‡ <¤GíR iüé íàQÖ/Pê5zP€Â©÷èÑ|Z3N<éq¹<x´6…}0ˆAt˜f-u߬pN†'që¶ðm>°3|¢´4­cÿö?ñLŽL¤Ò¥ö}`qثɡA¾Çæ´¼›Ò6xùJµZIÚ¦ókÃA– âG¹V¯uÌÐ0ƒÏTC%†Â/8h9ÍO]‘VžD+Lj ©³éÂæ¥¥£«=jŠÝµ5£¥Äæ"'4‚×îqúÿˆ +Ï\âg *2w]Z®‚R¥ÌÂÝ{-»ßlÄßôBÀ£‚ *ÀA·¾<0J` €µ d`ÐêT$+\ÉG›Ðvöƨè†t>ˆv…8á¯>æ¢ß¿ËW¥5‹,‹œì‚ ðÐ<4ý+WמzÜóÚ¯®Á§äµ•çØ(!û!O2üÉZÊ µPm¬1ºL€Ói¢iYÍšùo ÆÕe¶ì…Äçݪ[“4ÿ?f²Ñ»ž½Å/ǤêC3àÄ šm5—P»­åýwíÒäéógÇRÑ[‹C³Bœ£·¹ÌÀj¾ÅèPãj0™”Êž¨ý‰`¹@²El1[ÀÊÙEh,ËA³¨à½}>þSõm°n…:еHüü‹k_\ÿRÙ çN>†æPÐ_‡ü 9{å“#ù÷Óϲ$©´ gYå+.‰4ÌàE pBœä¸hþw¹R‚DÉzŸ‡Òpr·£<4yÉ>NE4üv€òAÉkª2ÚiPÞIПLüáäÿäýõF+ `s)ûŸ Ø¢ŒÅKØ 8°Q¼ÿ›% ¥3w&„::9Q9ßl³8ÀL2àVÕ`Ôu«Øé+Ø%ø„ÇîsÂEÔ$øœ÷g()¤@ m®Qo¢q;ê­:Ö‹ÍZÙ*v½M;t­(Y"? ä,Þ¤su1Ö}˜ÐÉ<Ý&ZDA ù 3i±Äè-Z—ÐŒÝ\@K–f=9hæ•Þ©”žR¸áŒz)+lü8á*^=0Œ£ ‡9 ‡y0„trÐIô.ÿ3Þœ2Ñwñ!¤Æn° Ý€1ל@¹‹÷›…4]*¡ Lzƒ¬ä±tsxçã.rM¨Ï~–1è|cÅýòŠ_„Ü ªõš¥µãFGÔ—ÇNpÎø’bÀg™EÚ >ŒÏn­ÄÁ5‡Py(<í÷|ÄeG£Ô>Øïê®<¨Åà*lÊpi3[Êlvï´ÕÕ¾#°VÛª­ÕžýŒ¹Ÿ!m¦Ö¡·j(ñZ¼ã™QSÔ ‚­Pol¢m4îYµr«*#Á>¤Ìò‰)ý¸ äF‹¾B¿øÙÙ϶7®b¦Þ¡NÜÖð—|W·Ùý6MN¬GJ ©¼8:Oô¼(jŠFy½0Ò¯°´€=Å;®n‹û*Äüòoãfb3Øy—©zX©¸bi:šðu@:#©IF–7°›mŒý"j S¼ö)ñLƒ\•#1Å)ÿ÷ÎÀ¾½zXÂc‡â·¸ß²Á µ^Üí”h)-Ê]–5E[1Ážflϸ*ŒF5ûð`·@A«0rñð­¸–Þ¶´¶]k‹š‚ïªõj ˜’âO—šKÌ+xÀiv𱩄O¢á²çm4‚Þþ'ßÙav²Êµ.EC¾Lf?•}ö&ªÜÐhl 4”ƒÎ¨5jØÑƒI‚¢Ç—'l€HpËŽYLXO€ÜÕÔÙÖžï.“nV,ïÛòõüã|ãç˜ï¿Ü ÖžÎ7Y ]ajü'ŠC >¹´ËÚfq2njH+íЋ é¢íiÛqün`í0.= Íëôƒ¿aû×ѵẉiÄ‚éÒ˜uß1óöS2ú}æïõâ}Xsø¾ÏšÃ´Túùú|ÇÐ D ɽù¥ŒÉM6©•Ê;ÞÚ»ÇÒ<Œšbó U£šÚÆT¸ä]8‹ïþ÷ážO€l&\Oe/¢³‡ Wü¢’½ç¸áT^0`¯~íX#jÆDR¨Æ:lÒkeYO&±ß#ÉzG] 8ˆõ¥/ˆŽát·^ïü˜þ†oo°¸k-.¦=2É^A\˜NA–ìÅ´´‚‚„œ¹X9GòPzÿ‹ w¾ oÎ=ÇN²;y¥êSF.[ZZ®´ 5ãÿ<ª q¼Û5ë3)kvèÄÚ!‡EäÜE³f¬f¹A4Q ¶ÆÎXñèm&ÝZFO1â †õ¬žÎ†­Ó†½Öë?Ü/Ø»öbù) Ñoñ¸ƒ&Rp)«Sî×Ë­óê‹íÛÝjs¾+«úÈÿºþçOoœMfG !Ç ÝðVáÆbŃsøzqÝÀdldø<ÿð»{,=f/ÃTã*vbˆèü쬜¨):ÜÐJ—ÉA5kUPry1˜Ø3ƒrÁòpÓ¨êzß¿gX„©Lo)Hiäi.wU¤^«¨“À¨-…ï ~+°”ZiTÕæôaÊ`xVÓ{…ŽæK{DÍ[qÚÆ°Ùß±Í:±ò]*G¬g®8Sº²AÔ×WµWwûÎFr¥:2=èò²UÒ5ۀ̧›ð²4;=û<{Ìn×În+p´àî´’Õ w™°äÅt1¹ŠõòõR0ÊË’^Ý&ËrSù Ìô‘vÌÆ°SÙÉsO-þšúþ×^;^l#õeÔiOg9xC#_Ê?|†‚ÝÏ:ßõŸØ{:ag…?_•ޝÊ¢§ƒœWQu½‚düV¸f>Rw¹Ívüä¾ôÝ/²\ö‰ÇÙ¸i§ÿõ§®xFý~;^&Ty–´ù»ÐÌ/#±leMeÛ¨hôÙp‚úsýÌÞ3\Ô30Š(¯ççäKüe õmõmÂ%ƒQ|o+˜ÝÍ΀͵äþœžM³ÒÙij•›.n³­ªù“Þ¶NìþÕCA‰¶Ä ÒleIY²ª "JÈ-™‡>éAÓ\wêh½\úRö˱¼kÝõ4ÚýõgqøO²)A÷a˪ŠèMnx2†U[^]$Îç–úeõÍÍMÍB6ñÛ…|É’××­^þ¥®6/@V)kó E%ÛS{‹ /ÃÇ}Ÿ!°°’XÈþ”®MÓÖÝÅî î¬m<{à,ž ü5†<õÒJCÆQi8óïPõ¡½Ná°÷ç«.e§ ¾m²žq@ïÂ`¥Ëîµ¹ö£x{c'ý'¬Äó¹VF(É5½©Ç„mÐ\ìiÜç9ñÃî*]&Þ˜¤¤ÂÓMAµµÞZe­Æ¢ï†·^j]à Õ´·×7ê;°÷0ر'šM^#«M`2É×iu(H™GÒÜÔÜÕ&îØ*̃DMÜÓYéi©ér2Uø{8Þä"Ï}“J7ŒQk"ýz¦•F-ÈbÖíË<(ì€Æ@uwÍNï©+‚dM*¹Ðî§ ±Ùj±íŽV› g*ÏqoæÓr/CR¿ºRè…§#À˜½íÁ¿ìA{ÐVo­v¶2ÖÊPßíOÜïÊȦ P›§ÉÍcIAéC©: ô1C_½ÑÙî?Ùƒsí²øúPâ¹×“µ‚u),¯4A]dÀÓ ¹¥+ó .¿Çœß+?yBÎó¯Þ+?Wƒ+X{l6Ê~ò­Ô=Ï ŸƒI &Ý™×PX—c+„¹°yu™XߟҶA’¦–J3+Ö`³¸ÛŒ=X}%p¨O˜•štÜ´²b®¥á6ã oþˆßÌ>(KV‹M‘¹_8¥Ë³×oþa8}{ÐÎ…äÞ8áð'·…‡À«¤²¬ò5`¸ø€§"û;ð™Ê`ß-4ýíƒ8€˜~4£Ÿ~8<–Ÿg*-†b²Ü%ªwíOÞ½„dLKÂ3×ä­ºcªcJx•,/d£„åð,ˆûvêÛ …¬—yK rK¶®ëO½‰ìBã÷ ¡[Ò¨ðæ·ˆlI®íÎTì'[ÎÞ6Âme®ÕoqcB(.À9‡Ëu[øQþ'¼€{ht“RóyÝh noû°ÛÐgRg¦±ó³"Û©D7%ê/Ží1”áv}mgúñ¿÷GR§Cdp¤õÊä© EY@–¨|¸lÍŽ!¯¾t‡4âœ+ã—'ùžm]{Ò Ë×K–§Ü=#è=èìjA„ÀRéÞi­´Õ»wbx58YX£ Lš,ɲ$6N‘`2¤>½ È ªý=œly¯é’·ížÄÎÌø¡Ä6~°³g'®*–Ø"¥H'Ϙ^›É™— ÏC÷þê Æ-¹ƒ›sÎ}Mú„Î “üãUÒ¢‚b!TØte]©¯¶“)/³RvÌFq×1!œl~;tÃQý“ßúÅÞúÖ»_¨Ê×J“X²"’ñ0wKv-îGïF‡/*ƒ¾Qʇ¾ §õ#tá#.úàÛ›ê?º 6h€ºŠ<}i! iS°½¦÷Ø–p-d&(Ä…ç_s‹€œºŽåF®¦ðìn6»:¿>߈½¥¶K½–‚e+2ØXY|fJÖ}1”ømÁ:\WÍÅNynaANâ‘Ò}‘l\¶Ø½Ýig€ü²ñ#TQxÐ4µÙ±Ë‹r€L“µwbªìAÏ>œ¶ ì;{níùçá²ð¯øV?žcÃÔ©@¦SËz̓T[ Í×åoeW òäV¹Q¹sx úÎ[U»ñn¸/‡?°ÉBUV’:Yº¶óÞÌ=-ÜÕ--›S ²ÒE‰xÂØj)ÛU>ð{Ý.·“Ê·ªÄٲ͛öe¼!ü¾¼Ý‚F œAä :/à6½Á?~ªµ±;Ì}ÝÝŸ~<„g1œ£P ´Q¯Î}½DVE ¨”WKêËÙ@>—8»Doѹ(Þ+ÌöÚ§'Þkµõš^¹š`{òÂ8‰lîBÁò™ëðÄ3•Ìf»§¾«­¹/8nu£¨º¤F†ëäóSèf›Á¦¡†þG¦¯Z-ɆRÚKY>¹µ»¤ Ô4] Çy<>”ä±)žÑ±#¢Æ8¢Æ2QãBc¯Žk´GE¡›þ/“ÑäL endstream endobj 531 0 obj <> stream xÚM”{TSWÅo$G¤(¶×'ÞÄ–Né!ÐåRZ©¨mqjQÆ€!A¸òySHòA@Þ/›€Hx¤Š " ŠLUF*¢¶:hAGG=—g­¹ØºÎZ{­óÏ>{ÿÎwŽ€²¶¦ÝŽ`¿Ïƒ‚?òõÿzÝÜ~M41ür~6dž[AqŽn¥Ç¹%Ö+)J@9ðJýcÁœÞ[8§ïó"]DY ˆM)É>v•É<|5ñ© ªh%+uŽøPê¾~ýZ©‡L¶^úiœ"A®–ú‡³JE\8Ëob¥š•‚M•:{)Y6ÞÓÍ-99Ù5<.ÑU“íý¡‹4YÅ*¥_+ IŠH©ŸFÍJ·†Ç)¤s‘]çÄW¿ŸU$Hý5‘Š5ŸTèD9 dó(ʆšGÙRÔ"êmêЦSK¨¥Ô2j9eoŲ¦´ A0cµÆªUè!üÆzµõ°³Í)‘7§µçÌ&s¶™ºûltj¦­Å(ÂŽ¼bHˆÍzУº¿jLµ…ù ´/)UÛ”Ö`8 ƒx¼yœØB½1»Äd~ÎgnàŠÊž°S»Oæ f!rFìR,¿1T¬/ ó·ÆfK|M²6 ‚$à|u^‡ä–3b,®{OaLÑw°^~6²lgŠ)£÷"Vð¸2<|·YÈk‹X“'DÀ—»6}œ…ì9wb0ý`<âÄ@—UA•Šõ…Õd%¦Ux+`7À]x>^1Ð[S]X%¨¤ 4›Iƒà¹9d9‘jÈf v@Ø)²;~ôW¬åm/a OÒ°ÈÛ†LÊ~J”­ÍË—@èª2±”,k'_qÒIæÇòŒ ½òQ¾!¯‚©ƒþ²r¼KÍx3`;ÞÜœdžµ5 ºáÆGB.ß áUÖhÌ•°Ÿ=¶YòÕéšè :g‚-†ßõý¡÷Ó±”sÐjûg:nÁ(",¥UàW—ô"k¦`®Ãß*Ï›žÝ©h‚ïàú£¬j;|›à+pÏ Hz×/=æÎ ×n9Í7˼+ÄWgèf]a<³'"0ÑPŒ¸†àb3z]!ŽÒfº0ÊQ—áôô<„.;'‹R좭êÌÙÜÃO_üÛ"8÷³Oø)Á»éºÚnK]Í¥á‘óðO„çp›8;/™GÈɼS[í‰Á`ÈdZn^m: èqŸ×Z ¼·Á‡Ø’·È"²xif?\ ˆ“ˆZð&›X‘69783å›\HDüDsØZob!>ñüâQÁØ3¼ç¿B|?¤ïöo{—8|(áû•çÐñ¦FK;Û¸7^s Âå™?áe'ŸJàþ–ñ÷îšG®ÁèG÷á÷¤žÛ|¢šÒ޶ZèØ[³¿°ûümÃa@GÇs$°QžžË궤èsõÒË¡žyÃ/±p¡<Ä·„3»‚6BY“z}v:¹ñ:bi >¶Ž'˜åͰ1¢ C ÁO{k+;$÷_ZV‰?álè×6¤Tü¦Û‹ìgÆôD•QðÊ‚u“B,åFèê‚Îìn@ØaüçÚʹ25ìÍT'™¸‘{<9¼mJȸ—ty%A"¥¢ˆ-L( *Ö—këP¬HE¢mÚDEµ•×kÊ*KnA-W)r" —Dâ^˲A~æ ôT1}bÀNG°íÙÑ_«ÏÚòµ‡ñÅ~!žÀÿ£/4_ë‡;èÉï‡\W­Ù°š¨jU“º>©Xw)’,Ü¿±ÂÂ/±/˜¹ÿ’˪î´úuúÂ5Cˆ¸MÑêúÄ8†._ïüáΕÀ l ùJ|üébm¬ÏªËÜ BÞž^ïáóý=n]¹Þþkš¶é{fΑO4…Kþ%äqM´…oc’ ÈßvºØ` ÔÊÖ'¦ª³›.ì™Ä+ñbìˆcp5;ÛUnd ¡§Wcæ8Õsd‘å›h9¨Mû;ØþÇ€ènîj:Þn<W¡e‹!ßRøGHF^»]<{ž»o-ÖT”™D$¼Rl±Ÿo.±³¯³{‹±µ^k´›‡_½ój8›« endstream endobj 533 0 obj <> stream xÚyXg×ö,evTa3 ‰™!š¨Qcˆ-JŒŠ-ÅXŒQé ËÒY:{è HÝ¥ƒ(ÁØ V,kI²–øÅDS£yc¢&æ=ëûðþßÿ,m7oòýÿÇÅ50;3ç9å>÷¹ŸY caÁH$ënkWxzNZèîáñ–“á“;ˆR¿÷ù2KýKŒ~´Dÿ²™^0ײx™a$¶ôÈü·áxo„áø =ˆZ;ÆB"á¢ÀÉiÚ'§© öÇÊüü޶¼îøÖìÙoOvœêä4ÛÑ%ÄW°Å'ÔÑÝGáï⣠'ÁŽ«Ã¶ø*b'ÌñW(¶;¿ùfttôŸˆ)ar¿¹¯OvŒPø;®òð•Gùnu\ªp\îâëØçô”¾? ÃB¶G*|åŽîa[}å¡ÔÛálß‘Ìeæ]f±ŠýˆÙÀld|läl“@ e†1VÌpÆš±aF0¶Œ#c^`xf$3бg˜™ÑÌˌȼŒaÆ2¯2¯1ã˜ñÌæuf"3‰yƒ™Â¼É81o1Ó˜éÌ f&ó63‹™ÍÌaèŠÌf!³ˆYÌ,aÞcÞg\7f)³Œqg–30+˜•ÌjƃYÃx2^ÌZæCÆà›«#aÌè •‰JrYò«Ùp³÷ÌŠÌî™`~Ïb©ÅeË–ûÙ‰ìAééZi37‘«2rHú›CW=9lɰKV¶V>VÃW ?iího3ÆæêˆI#²Güd v6v®v©võ²é2ìÙ ~/œäÇŒ”ŒŒyu”˨sö–ö{Æ9ø9Ü~ÑåÅï^r~©e´åèò—Å—•/×YÏÖÃó<à° ÷ý{ޘߜ<#:M„„Òô‚,œE$d¸ÁømD$/9%¤¤eB—VÝЂ›ÐKëûš(ýBòðÚ\º¦¶ûBoO¢?“ý<‚…¼6`›úªOS|.§ÞU]!BURIv޼ê½=áåÈœ·/+ÚU5\>´lȈ…¹9ŸA‹C ì „ÀTBs\sà sÉ^Y’ éÀE'Æ&ˆSš±+%+ì ³")=1¢v@è~G\ÏW¹B¨C*îÙ{hø-ªÏ²9ëÛ|÷*Î¥QG_5ÇãXÏ㶬ÚÛý!I$cp,[íþþàŸ$±dŒ4‰þëße"Ž!cÙ$ðo§7— ÖDÔDa±ÕØáz·ô²Líy|‚ûúø¤)Y±™Í%TÄUµ==fÚ­ŸlÜ¢ òm‘ï ¡(§(—³Æú«’.½“¹~6uÂèÁ5vpEk@[ µnkŽ·.ò!A¾òààm­ámûvï¬giž+Ô’súÉæzïç6|Qe@1WP-DBzBF"ùößKìÓãUi\lEœZ¨…¢ŠÂ]œu²V_¬•×á'F¡xŽÇå¯á(bF,Æ“‰Yþ”ŒB3´xŒ/¢›@üI1ÿ®Å 8N÷ë—7®¾NÆ“ ndè»ÔG­ÞZû”æ3“¢è²þ_ !B d$e&ùÎôJŽÉŽWEeC'¯Î¬jà@áá}\³“4>‚C BÄ|¶¢ZwG@¼èÄ fi%'ob‹Îüós|jZF&(¹à¨ð»§¨¤Ml”Ö@m€?Ä„ $•=â盇ö_ê:z¾áÐjÜMbM†Î™=s[sr•¦®ªY€²Ì]©EGí>ܯ6Lañº•®†<`îôÖÚîþ ·ë¶èdôæx—ïú¸ù,œæ¾\ð9‘«Å- lPªûŒ•gìÌÊÛ½û”÷Åq?oBü·G…˳ý²WíHåd¿×S²¿žxåòÕËœÄ-0·4üXAAQ!¨¹úµ\™4õÑJ´ÁQß?x(ÈÁµõç][9?2Zýµ¤å*Ê»Ì÷aŸšÙO%é», Œ;kLÞûÆä¹#sËxö.>c÷¤aldª£9òNÇ£ŸZ’§R{×w(hq†Öîd·§U:Ù?±UïÀûÃÆôÍ‘®Âté 5R˦§‰¤F Š6¡ò Šw6µ¨>œì_wŽ,p{gÑo‹a°´8ìLAAq³EQ•’ºuÖw‹Ñm½æ‚ìŸOæþB† †Üw\ÄÙZ»S_£²ÛKGhþÈ—ã+?ݹ{¡2¹ “þd@,QÝØ ®jíô;=‘âóE2œx ²g$-üŠ’_¾C+d§u3A¦÷¯8ïÍ:’¼líŒÖfª ³ 9U>Пœ€ãVcUEÙUPÄ]¼pü¿nŸzße†ëª…Ô'¾C+9¬;KÛb¸þO\Ȳ²ˆ§„ÀöªªÒ¡;ð \ =¯®ÎÍ…rÎ|ËfTÆBp#úHc ro;Ô4÷Æ™«Å c:ÖуìV`¿ÀýH×É®O¿¾uö#¯Uîˆ_óß4鄳ܙ·È0bõögVýðëpЍùQKWÀ|nâÃih‹vî=à¦Ûy 7‡´ñ³\»tÚs—~|pvÙò%®«g‰†eg_Äš^W7&Þ¢À~ù2âÝ “ ür¢*ó ¡Š«U‡Ë£ãB‚ªá ”Ìmèëh~1ƒ˜ë&óq³hÂÙ{S‘æ÷ÑI8YuäG^Íç=?ÿòîµ®ëâ!hVTF7–­… ÈVeC&dæÇC*ç±fÕ¬^ª¤Üa‹®hk KÛçeOð–Þ⯔&{¸¢Ç‚O\ã“–‘¥L‡ø^­ýù4Z|ÒæëVåß)XwiôÕ}ü¹BÏ—í*¦ó£.¦,^H…,•2•Ü![ìS3Ó ‹“w¦ãÄ×¾<5OEû¶²¦¬N„úyÙ®ö¦æVÑ,•ÌÁ®´Ò”"òúÒ±“•“ \|L’‚Žúy:î'®ö„’Ó k8(j’*…ÈË)/á¬3´'´ØJ’Ã]?váâ.sý«úX>+7¬:¸wÜfK2ìªó—?D—+€ñdMFQä}òZt¼ÿÝÙ–æ0Hã RRüƒ|“€#ÌDdp ¾þäéob3I©[Î-%×øõ>n}wôÌÁ#‡W:;{¯Údàåßµ¨»-iÒš£N›OÝ§Ì †P uñ%Ã{4öJP@FvrFF $r!P%‡½Bt–ÄÞ@Ý¥5Ðé:LÐ}dhé鴋Жý¾Ö=psëDñUׄñ—kŸ„‹Üåwˆ¹@¢Xe8„^lêQ²²gÛÙx9]µÊET±hy¡û–º®8×p®¤Œ'2ŒBý¾u÷º­+¦‹ýãl¿¿¸`®˜A±™’™ž½²åÍÔk©¿<±èpK‘þÅ‘ÈýÐ}O$‹©4Ù¡é¯;GlÎiÆ8_¿ûG·xÎl(w΋Ëo®4êÞ‰§ÔJîè°Zg~A|¿¯bm2’<ÃÍ,Žº‡Ž8§ÏÀ‰ÄA$Òžc¼^ù³-»ˆáȕĆ˜,b¤7jíép”îˆn½Nö¯GZ>ÄhL/öM¾îþÉ-,!j©¬#q”t3Ä·ï…ÚáaÿåøÍà1Û“í#"Z¸!ݱ3@èÂ&²m°ÚÚ[²@ïä©GÓ¥Íq6ó8šý[›£1óþƦ­ÑÓ==Ê@“$L1$/Ö@JÓ´xX+Ù§ÃFʱkЗ¯¯ƒÝ­á ’al‚œzF'§xM"ëÖ{ç<~<¾ñÍo·Äv¸¤¨"Ln\aRc5P”ö; 2“ü[·TøÐ2[½J^"®dÙï´“†‰gá`«ºŽ‹„辈q*¹«Cƒ¦ m0:jêHñ&þèý竃ӷ¡G)7™ÅÃŒwÉ)DýI”ÜhéOWÙ~a ÍøqC0lm¯Ý½‰Øg,2=J˜œï3¹1dÔ –®uãÇ$j¨•­lH¨«ñ¹;=SØ™³3c„4øBó ò  rPˆ,ûlýãîÛ§Ü’è0ƒz¶„ìbË›œi ¶£G¹Íx¦·À§4,ÑQŸRC¦Çê(J®vaC—9Ò[òI~©¡¡œŠM96 ˲ Sêå nu_ª4Ð&ö(¥AQý–ïôe- ‚D}xŽ´tÃe⑟X¬Øå[^˜V–^» ¼¸¸<¯ð{,,;Ååô„³û°RÚ¦¡‰‘Ó8VStïP¦†sýá>ìÂ(êÜ*ýu>iOBÞvàÞ3A€¡Æƒg˜Q–ÃⲞ¬]þ•ªFph-ËÛ'ê Œ¢éS¤„©Ø~¢êÒa­–¿AwŒj&îÄ=j;9Dj¶£;.«mƒÙL5÷4k’Ž'€»p.Â¥Gwß]vnB{j…GÙz˜ËÁ%¯I^5zÅã2-RDP&ɦtÆlý"wãþÇ.÷‰T$ “þïQšp òFh…°z¥Åìχ–xznZ2‰FB}ÿ°Ÿ+ìhÛ¸ê|tj,(D®³¯øh÷J'q!‹Aüg5Z8Àý0ïUzdñÿ®aYÙñ[l ´B[XmD‚Ýp†ÔU…4ÇïîRýgûÚ TB©ZÂ¥eo‹ ƒ£§¸Å©uI- ²´kcwò V^ñ½"{ˆØÄ7g| Ó9¯M+æa°.K“OÓŽƒªjU•ª:8ŠÄ^òVºE*,/iÛ¢¿ r×ïu‹pÙï`Ò®Íû·½[ÍÉž8Wû”ù¶Ã1‡Ÿ^p(T¼QœYš¡à$û>N¢²;.-dsûš2oÊIæóçÌáý£®ßFp²‡ùªGŠò¬6êÐA‡ö\`ÿ7û˜–(.^9…=J/©‘`\þƒk ÌpS‡É¢ýfàM@@~b]½¼<ÝNþSÀŸZ¥wׯ,±¹ûæãÇw `¦ÑïÕJªõ }¶?Öô?óZß#hç’ó‰ž1óÒ79¨ØÌöU©õöí¹ócš°žª¾•ÐMTv•tpÔ>Ò±T+)Õ«Ìõat‰Òšc'v#ù!myº—*Œ.’qy=®S¦Ö)¨¾MhH‰ÌJ_OÖgºS²UMúi/½£½ —Ï1øÒ %b{½G]à_eàPjØ©Î+:‰ùû¹6ßû4‰ÍÉ.’7B½^í•Û§÷6ÇÃø5–¨°¬5vÐØ>Ψƒ:q7ÇYªëúég¬1­u,Z‘H*ª,#aýÞg&âôü•xZ*"ÿ|ɰ‚‚µž¥}>–²µœVøƒçÃyãŒríÛ­ý{©4¸0e¯€®&ókòó±ƒO*)äÎ<…ïŘa^ ‚iò¿Ç’É&ç®}o=yà­Åäÿá¥E†ÖC‹oikíÎè6u£»N¥7kãkƒ?Uí®¹¶? >R–Ça°ôÚšïÈ«›^ƒ!šøz¡šKr: 8'G[ž³Ë°Ëþ¯“Á‹DÙ1²8‹Ø|“¸%—Üž ²¨¸Xtl7—ŒËù·¥”¢¶ÆúÅyö`î›÷~"BçøZ¾AŒ{hµhÙ«¯ u²tÖÛóèÖ×Y ŒbóHO! QT%¨YçŸC©m”$þ2´™úË+¢,á#ðŽ æÈ‡7¤çϺôå¹Ó'-v[ü®ÿ½Oº~¥•ÜÐaD·¹~JøæPÈâ!%;=:#1f½ p3^ýñÓf”âKšO UÌñ¯QÖW¯©j¹1¼ÉüÈèiÄê§×ÐŽ¿Tõ'ô‹^ÿ?î÷ÿ_Çy?Pîn ´´RôÖ²‰‡Lee-›+7Q’LšLddÄý‰Ð0ºà`Ss ‡A‹¤«½gÍ]ôÁµîŸ¯^¹z¹sµGo£/à ZÉÖSpÍÁÕ¼¦:]ú I†MO…«õ“qH¹êØýC"Ýýf¥ÇD®]“FçÒüãñ?p9øòçÏ\*öå%¯öާ‹Z´¥À[¦{t× õ,Ö&Ø´>ÆÞúZ…%[ÛÕu•ÍÞøwæn˜.xŽ—ö†eè'äâ8ETol‰q¬5‰½€.gÏ\À ìZÎÅèÐC÷ɹ•×eÿLF%.â×ø;uöðá“§®÷\µq£—ø–?Ÿ—½OÑ Üƒ×)×·¦¶Ä5kÊêówån¯Kß \U]YK]Ìî5b2¬Smˆ/õ¯ÙÜ‹æS:ßTXÃÉ“Ÿ !à_./Irñ†÷ ™›ñl9ÝN¿ðìâ÷tÄ_Û”XäSûp‹Ù4H„´ÜºYN*O.W©!òsËówr8Œ\âÇÏ?tX„ê’¶6uCe Ü®-aÆÆù›Æ÷nz¡`ð´2óð(ÿdí¡9ÂûàÃáò¿Aµr£É†j[nH—œ¦{#.f¹ïÄ©ò°½µ/ÅM†»Þ0¹‹í«ÛíÇvèûx‰ŽÕ‹úû)cŒI!,ÉE2ÜDO|j,ÌVöDŸmÑYVÙÜ\[Û,X“-$Ôô§Ý8Ê`ü™ÞbÐøTv°æ8²ç âÀ7Ü»o0íöPHÊMÈÍÉ£¹+âšUQŠÈ¸Ðy¿À|íc´º,Èêû›õú8Œ"ÐŒ*¾ýXÌ£ J-ÛMTõ‘Ë’™d²%>ëKª›‘;{”ëLØÑd›³î6ûÍ—´oöm{j4üÒÿó?ÇÚ[¢‘Tóó&çwL:dd5<´v§ºp˜áWv%ú×øìÖhˆ.È8WÉE©_TEïõ¹E÷öøžTÖÙ}àØºò87(¥1e¿ù§›þ¿·dRµìT!6'†mMØÛûvCv;B”‘Ü Ÿ½P•}EY÷¾ *¶ü™¢.þ?À);ò¿€'&°½ ûª¿úYø¬h‡øa0•ÀS~¥;‹)ˆ-‘ýc2š¡Ù?~F;ø¼‹û͇?^¹ríúe7§)îó]Dk"×⛆Nó˜·©”®âÿBødœÅßL‰þ!{Ô’]îûçVlþŸ¢5–ßÐá’»²#(§“í§ó?ãp!'¢*º¸Zue“:éà,q-,õXÆÉ¾ÚÛLbfÄâmrÑÙ™å&È6gûRcw]‹IÚ`­ì ž  ÈΓ„æ¿WŸpm»ÿ!| å!yá9q¹q»û5­n@ÒîPf§oÔl„:QÞQÌöáÍgq”TÒv¦}“žÜ¶mNÂzX]*¿•Y½£4¼__Oì“×%P™SÖÑéw*»™æljÛ·ŸŠ²'ð;á5A½…ûBû›ZbHÁTÚrÃ|˜e‚þYwØÁ ³§GÂ=’ÅNúÂïÆ—·uWƒÆ?P'¨ÜW¥(€› 'ú§èÅ0Æà¿Úøœ Tg:Di«ýuˆP¾åœ4ö´ X÷W‚%%ì$]Ä Asììhæ¬wœÄ›ZI½~»¹~¡Õ$„!Æâ4³DBn Þ´lþÓƒÔÊ¢”<,  »jp¨:(ÝCkÐE‡æZI¥>Ù\¿Á`ß ª# V$R66¢WvÖˆì‡ä„¥ŠÝјx4é@쥬RªŠc ™ªâ-DØMU±ž°ìì{ë§€˜ÁÇ5Ð*^ Ýùм„ýà°òJªµ ÷rÊój©.ðê CòÓÊ⪩ÊüÚþ^—4é ¤*ç‘Å –ûMÞôG] M¢Ë¸yO,t Ò§Á m½ŸÅ¡dAfXn1~ŠCvñÁâhÓMl,Ãä0½6¸Æ–þ’têð@ïË¥ç¼FM'D·7bò°o µÁ¸…jÄ\)¹B:£¢UYçP 5‚Þ†­-¤€ îœñe›/©•ößÖ÷Åáó—øÁï ÿ=Ojü^0¹T¿°畲$¶Hªª¦µ²ÒY †ZĆY Ñ׾𱤠endstream endobj 535 0 obj <> stream xÚ-’}PSW‡ï%!9([ë­XëM¶Eª–j ¢­RXµHQ ÕÁR”Hb Á¾åsMCò¾-Ä ¨wi©ˆ@¥®Nµ[Ñ)E«í v´Ûs™ÓÎnb÷ŸßÌ{þ8çù=ï¡)¡¢iÚ{ûû[Þ‰|-*6.Ô=‡æ‘ê—„öù O~Å¿DóË=xVÀ/.§(Šøºó¾;§þìή™QBšFÚ|}HȺ µQê¬Mš2U+]™²Jº&<<,Pº6$$\úŽJ¡IK‘eJceÚT…J¦u ÒxuJšB[ ]ùVªV›µ!88///H¦ÊRk”›VJóÒ´©Ò8E¶B“«K·ª3µÒ2•BêfrG”Z••£Uh¤±j¹B“IQ´‡?âEQž”/µˆzžZL1Ô ÔÊZJ½Hy{P4%¤†èWètú{Ǹ@- Ó…óž•|ås<Ž·tôü:÷5\œûwÏI3}{ ¿Êá€1žœd&+¯d˜w¡ýK?’j+6×}V5 ÑÌ'$üÓ2“Ñ­È&ÿHLÐÑP€è3ûÚsÏ'Q>\†ÈñÆš÷ºò®£þš³g2š uɆ ìi' qTAƒÑd„B¤æúÄØ»áî <…áœ~9—ôERãžf$¯g2j ê€Y›©G! ^o‹€ý°=î½µÈÅžë˜÷pÐc³xhVÀ÷áÌMÀVb  ÖÈ( lÀÀ–¬ëpœ‘Á6söTÑEx—áŸpë“/O>øöX7œƒ«9í›[ö˜"aÄ@@a¼ú¨’tp?oæzÍ4¶Þ`2ïÃØõ b£cV€\l…«0fC¿U‰Ó¡ÄŸM–‹†k&add†½ý¹d±?sJÜ×<À?aê>GßÀnüYÀwãÌA‘¡¸<úHÙQÝ(DvŠðâ§]÷'NÙ—Úí=ð5¾Äó&y‘0kB_Oø\×tòïm§ÛKûÙãg¯úeäí øëG‘[bH9Qù•—øm"·žÓW°Kœ˜þeÈIÏþ—b÷áifz4nñˆNŒ”dí¾‹\ͧVèD]Ù'Ò³T…²•Ø#?W>š}ÄÂÍø[d¡ý¶ub¾Cw^#ÞÄkíîðdg©ÙÚÙÖÍ©œ¶¬š¾Á¡ÐÀDöz |ñÚ«ºc–¡ÊeF8‚Šš •}¦ûr|‚™æ©)?Ž×3ñâwˆO@†-CeE)yü[’ŸOlt)- c3å"³i¦º·w¦ÒìRš)ƒf§äŽx=Àÿ›øYQ9°ÏÍ®=-á°å±oâgE·¾ Úa®t·6^î :V^­g+ÁezeqBñvøv7ìk-¯ÑWéCY‘„ ‰ ¡´m€êšºú“ŽÞ®I@ØÈêCWƧÈP$%ÃVØz6ûb¿©–ƒfÔ™Û‘Q!ûxoð½ux^ŽÑöŢৄa·ÃÞÜCYèLÇä¬ÓI_y‚»\aø{Æt¡jªûrï·WícpÎé;ÔuºÃP„·åØíÇŸOº°‚“@²Œ¤=ö Ä~,×jÇ/9Ü?àèÒOìMuìï…- LÛ…°?¹Î¿ŽàîŽ~÷@2öÜŽC69ìƒ=°Õ––’­:T”øìƒçZønq9sþÿ3ÓÐU`C¤It²Mòê«KMw ƒ"%Q{žU[/µ4Õ×Þ…—–\QYñî˜ìÌÕÄkyH ª€Äóýpîkþ çá…±ÿWÿÝU{OxÿÎ|ãé‡èá˃¯ÏUÛXˆíIüLÓ¨ë(iÔEk‚â!/ìû>Fx)ö¸ƒ,\—õiÉoÛkSš‰~ÄL 68‡¾ºíøfòVr ›ÖP£7ßešt¿îì,¶” « ½| 4èÍ/§Y˜¾32lþÇ6wÛÁûºã®'>_c`óÑåN> stream xÚÎ]LRqðÿª£‘}Lª­‚³nÒÕ¬ÍQ®å¨¶lTö9ËR†'¡„td¤€hG^A8Õ)aBRPV^´ÖÇZ¶>ÖE—^äZ[󢺩»þÇh+ðæ·½Ïö¼{$“!‚ V:yüÄÑ–­:½þ ¶4Z‹‘?ïKÄ HÜHˆ›$¢R*®“)¿6ËþÉ%›B¿W—ýµ²ì·Ue·”Ü[ƒdA:=Ã͵FS¯cl½s—‰¥jŒµÔv­¶aU¯Ñh©& í0 VJo`M´ÅÀ–Žnê8c4Ól/UÓhbYÛ®º:—Ë¥6X.«GמÚm”ËÌš¨côeÚÑCwR+K6XhjqºzQc±9YÚAé™NÚaEˆîFMÈ]š¸mF­H&A’•¢D^äªðtñäm¼#7g¥¸9¡€‹ mÚ78!¸Jù¡˜ðù®øà|ÒavÙ&eŸRÆ!½!U 𹂸?Ujã Å™Ý휑 †† @Žo(“Ï"ÉôLZ¾9v ÆoöpªÀ†<Œ ÉHt+Öã±¥6bŽ8F;cíÀ‘Þ+žôú® óÊ$dÂ)HAf$÷! ™P"4JY~wËýª#â¹»û$ë‡Ó¡¨®À`p ,zÿPàóøË£â—%Uâœ/ŸÇ­óñ,‘ÿŽgHEŸX£¸ô]/éódïä2ž¶N´)€éTûE{ö,TK±Úà9^u"Ñp¬ðócaÈ»“î6tuwöè¶èO€ zx,MMÀ$™u n«Ýa>3ãz¬| SÏã¹ìÁw½Ák3QŽ÷«|º:äuêZZOiµ?WAzìõõéÑñFaþæÃü«—0I.î'«œiQ'fÒK‹a™²RÖ’WðòÊùòBåìòlL.Ç_«ÿy/Ì endstream endobj 538 0 obj <> stream xÚ]PÁjÃ0 ½û+tì#IƒA¬.¡.dMûŽ­¤†Å6ŠsÈß/vC;H §÷$=e\…5²rªÅ½±špr3)„cY±mTت”Õ(=Ëx#ý—²F4§3åÍåãív­‹wÐØ?×Å#ì·ZÛe 8 Û;(K]ÖyS vŸÚuø±oÒHư»ñ6!íìý/Žh䬪Ҹâq‘r'/’´²2Ï+(ëºbhõ¿Þ¦èzu—´2‘yX‘»¡QÝ=Í©™hÝ›^ÅåÆâóKÞù¨Jñù”lã endstream endobj 540 0 obj <> stream xÚy\TWÓ÷]WöÞÄèzLr{WÔØb±‹»ŠHQz¥ïîìÒ;Ò—¶HQ)vIl‰I4>±ÅD{BŠsñçû΂1yŸÇä{¿páþ€½gÎÌæÌf®„éÙ“‘H$¦6Km–,³kmc;Óø÷Ô$áyaG”‰ø&#¾%ßî! Rq`Ï·F¢íKïLGãýË7Œ÷áô6ôË~LO‰„ Ž·²š2ÁÊj²µ·Oˆß.W·ËQN£-'Íœ9}œåd+«™– <ýv99zYÚ8¸9{:Ð?<,×z;ír±5Û- Àç݉ƒ‚‚&8zúOðös;zœeЮ7K[gg¿=Î;-y{X®tôt¶4ª<Áx³ööô pö³´ñÞéìçE5íýz!ÌÈãzXõZÐÇVº‘Ù,ÙÊ8Zìc"臽OÆ‹ b8æ5¦Ó›1cú0}™~ŒœéÏðÌf cÎX0ƒ˜7™!ÌPf3œÁŒdF1£™1ÌXf3ž™ÀLd¬˜IÌæf*3™Á¼ËÌbv1ï1ÖÌûÌBf³˜YÂ,e–1Ë™Œ ³’YŬfÖ0¶ÌZf³žÙÀld61›™-Œ£f¢™e= Ó“9-±“<îá×ã¨t Ô_Z-=)ýº§}Ïb“þ&‡d2Y%;ÍãÆq§¸ç¯í{í·^~½n¼¾ìõzÓ%¦·{î­1³2‹êcÞ'¡Ï7–õ}­ïñ~ãûeË×˯÷ŸÒ¿™_Ë6Àj@ãÀ÷™Û˜_²n¡4`Ъ7_{Þ|ú–ï[÷Þ¶y›ó„bE_ÅYËøÁü`¯Áу›E•™ø ¢‰uzɳ˸ûòƒo¥â5qo ¦hÂÞkmn rb#ãC#ÀóÍÑ—åå—Ö¹V¯À>ÖÉuÞiÿZà†ví1™íqƒ|ÁÚ+a©àÁ¶èòµÍ-û5GM‡Ø¥JhVà¸ûÏOê²´Ç—h.ÐσØ÷Tu ¼Ê’zÌÿxçàGB&Tk*C£Tþ‘à‘ AÅ‘ªˆ‚ްē5/ukß÷Aå ý¥xG\ćjè¨5jŽ˜aÙÏjÚ„b8«÷ßëA%x–ì-.+Ì/o[×4k$1]o)üotŸÊ¶$‡ïP¢¿~Jìñ‡b¿Ã*çv¼Ï«@£NðÈtÖ†Rµd„Y5âÿ°Wl÷Å‹ŒçŸÜ®ÿL(„BuQlXLT(„BXJhnG¦w!•.¾]ˆó‘‘à@=Zë¥h%~Í_ômpt öññÉ÷©² +1#M§ÓjµÀé 6JK=WÚ9¨Õ*ÄqqÉ1)é_ÿ MÜ:àŸ-4Ã/µ°¡*¸ücÌÄ¡DWøÜ¶@òã)> Q<$©bS½vâ@kÀ‰•¸ã ÄD]$q)q‰1BL²^O$vcý‡y¬Óˆì4éõ!ésÿ½LàR’SˆÆ*û8&òðeö؈ÒÕØgÂçÀEª£U ˆÓ©Rb>؈=È[@êKìÈpò¦ZO•Ué¢ÓiüÞ»r %­J~4å(dý –Q–åò°fÎ³ŽƒxÐt˜qëöúÔ·nçï¨èsr´:›ó’ ,“âA´áÏ“2– *èd¤¸é_á¯÷ôô÷óò,ñ¯¬,)©¤¥ê;úé%‡ï`ö©è‰ŸópIuÇí_ÛÌ+Y«`žÿ¶±î‹âÞ…y°L7¦qvË´ë¡Íð\-oø¾òRò¿à&G<Èg¼'Xg£Iä‡pÚฑyºàÛ‹yÕp.åOÈXs`ØÀôÈÕ{ˆlA¤ptszê  º&Ŷ9¯×èü›åéAæ<Ø|8§J¹ÎlÖE1Ap÷Õ&| õõ÷ –F¶;;A•Y§0 ¹‰í?·$ÇF÷ï¥â\È{ËÔáÑ«ÃCc£A=G‹dOà rî$´[ ;î&éCØ9VV›ãÒŠ*sk+÷yq ‚xMÉå‹U§€k¯·HÃçΰÛH–“-æJ%¨!€å2#få7Á!¥Øë‡óú~(ÁÍ÷´Ëÿà/üýš#ŸÃ§Üµig‡³zÞî¢àŠŠÂŠÿœ]Biù‚£ÀÝÎ]ºUž±v~Înj/µŸZ ÑÀÉ‹ÒDk@É…§Â~¡Ev÷àÂq¤ÿb×MŠ`“äpµ6®\ÕÜ¿B/?Ï}Ž“ï/BûÞ¿×.Èÿ w][Ø *2ˆŽ48Ï]•Và&ÞK§R •ó…@Ù…„Ï %é Ói ;ߘNï´†‹[ØH ¦Ñ¯ÑD…qä@§ ÊL:el—Å(yBãÞ–¯É3`ä=éÏø„e¶ ‰Éi• ­%'€{d‚«‚zÐÆÛÁÇÑ1x'¬†%uþWµ¬N® "«Ö˜ç³Ç;ÂÉꋉ(ÅÞ?=Á7°÷Ô§D¢°ƒ-¡n®nf+£ qà°Ï•o³ÒbãjŠTÜÖ`ûhGØ©öù‘IjБ{]*Š ýíïS‡|‡ž÷—}'ïÄAøíme' ê~p  9¾Ø•s öñÍ */ÏÏ«<ãtÒŠðd0‘…ü9)A³%PúÃ}4GùÄGÄDw®‚ínÞ«8|ƒ\çmawKDEp“æ6är— È<rá(TÙä;ð£×–`Ûm1>]X(ž¿)i3<¸/ÃÅg|Zè #:éª,U>ç-ÛMœMÊe‰Å©g²2S’o@6µÛE6– $Èâ2l-”àÐÜG²„£,àÈ"äN^é’^ÞчÚ{Ê·Ë[}Oɯá|q ï™PuÜGŸúøÚùõ X¸ÊÞ)€Ó‡òÇJ>?·¸ãOO2sþDœ³]K¼ö'ÇàÂÉ¿â¸z%Ìäÿ²„†7÷äKdx¼ Õ/W™ê•‘ ßÎc¿9Åû޹ÃJ‹Ù³ìf¿óÞùÛ\9vö³Únuê¾ÿJ/6º`Ù}ôüNþL샟ð,Qév[Z lJô=À%ÊRÕ‡Rá0WRàíâ¹ôäö{ÈÓ˽ùs,!¦O"ìð ù÷c‘:áÙçpød^#Gø÷ùPŠ´ûùàƒ÷Vz+Òc¡ý /?ZøT.bˆ|µ.¥EÀ²'õsVÍ]²h¼‚L’¡ZÉ?-øì\å¾{‹˜ œG±ìšNé¢è,b]ÔʹB€‡Lþ‹8L†o>øö¾î½ó9‘frd¹ÁoU§T+°×°È½rîªyÃf{ ã ’¶v1®L*¶‹ÿæÝ ¶gFЄºÌ S‰Ùï’ɸßý ߯×Ò!-L£‰Š&ãˆé‚aÀM#KOâ¬Âe'o+žÂ/óKÈ4]¸6. ¸\H*T`8»Ò"„P©b£8³ŽR0tH() ¹+}*½ÐaÉÿ‡"'Ã8GQî¶% œDÞWPceõ›¤Û±–í‚è™ì1œÝTæzdMŽ5Œ‚0dÝ‹­÷¬ G³cE÷¬TKÐòn+—гùÎ+/Q˹áײFÌ0ñ–ù‘‰¾ÖdµßRÖXþ}öI¦ÇTE9æy˦FxŒ&`´¬Û?ƒdhåës‰%W.3ë˜L÷k1`s÷~[è~Œû}ðßûÉšÎCóáï ¦‹ç¬â)Ï¡úû8Ã}Z÷NÓ”îc„I˜ôb§~2úµ¹DèÚ©%ЀáqX—çß“vÌï˜Åÿ äMóÍÿÓÛq:y7)À•Úò£û}jÝÒË€´\Îg'&] ì2•6ìœ n¦Ã<ªØû .Š,1#ã |&Y}ëº,¼ÂÉݧ鼫 ]Ö_¸'ëD–'0LV§Ë¸&dªµ`o¿¨übö?#·)á 47Ÿ&ŠI;Wml²ñÉþ»'Ä"öo¤›‰²±fyOŠ{ÅùZ]æMAoíP-†íÛÃú°ž½©‹p5ªâªŽ˜%øyÈê>ÆÆO žnäÇÎRgÖRQú@}2b°AÒJë‰w¥âPzRësà…n)mIÖ;Mé‚®š}h„®ÓޏqÃFÁ ìòýŠ/.WXâîá¿Çí½ÏV~/| ßžÈ~¤M…#PJãõðºŠÄoø ž×î×rÖKµ"]´FËØrMN8C´*:.†Ü!çÌñSöŸ`7œšuZ—­=Úš£9e4k8´–)Ä*V«EÍoLRxbT&Xd@RZb×ÏÝvÄù)*;¦ðÑ™*ŠÝ–píZ£OÛÁÎGÑ9¥1XÑ1©Âx¬Ú¥!ø=ÛÉDœFVÑk"mã¶‘mhE3òJzYádÜ&‡ä+~Q|ƒ¨Â¡7?Æ¡³)gÅ”Šî4X[ŽŒ÷žm§q‹—x´l¿ûèé°»D¡ ä<òª`‰`Ux¬››Ép&ôFÞUa4+©õ*×ãqÊgCîbÆ6íO ò½‚ÏxLg¡T—–Ÿ˜¦«‚Bàî Èè©ÛV·(ÙÇ?,»þ!\çž’Þ·ÈH\y…J-4&[[éÏŸTJ`åÕh*»UΉñ•.°Þ‡%°­Õ¹Åå,d÷UÎÝ’dÈì"-ZzÇ­ðð÷wPDï*Šú$¶)ú|Ô%"­¡ÅÍ%Ê…Vå’¶‹x뢔²ð4~VïE8Â]:uñ+y816{DB°6Ž6‰ÙB‰m=­¨S9W£‰‰IÏÚ½qoÁÆcãiˆ¼6Ýj¸æ´Ø%Å5mË‹Ã×½o§©ìÒjª]`5·xË|+a.EU4ÎÔä@r8pa¤ ëÙ ˆÎR@«MÉÌÊ‹ ?pâüª‘´§@³[?Eó:öx„±ï¨‰©b1luó÷áä[ñKF)M<ØOÒb¶(:ï—ÓV~«²k¿«(—TßÁm´)eÄ·ù=ñAaàÅù•–î7œ_xp é?Ö’ô%üÏ£i3¢¨ÂÞi™JP J ÍÏÞ€Ek}7·|æ Z„[Ýl9«È‚Sê:¿ÆÄ]ÆÑô—åD 4å!Tûöx8Ø;ÑöݩķÁ·Qý!TAKòÉÒÃEUõ†“Ї÷”9g†ÒÌ%œãã’NΡAÕÇr4íÐûþ0_W|My…Ô¶å,ŽÍ01°‹£RŽ*ÄŸÿl¨™hOt+Á¹zIÅT}"‡a_”…?­}HúÓñCÉdà/#iucvôYqJ\r”"T1šø]Ã'«÷Ñ&~GY@õ³ÐÀiKø4œp/·NÃYG-éÏ™á³[4¹|ÿ[)žìˆ¿Ž&ìwG›…tšPÓãÿc ~ÐùÀº93WSþbÿÇ@÷ÕnÂdG®¸p³ cÊ$gpßµê3Rì‹‹y}¨a_3p¯|rCG½«Ã³×¶@&ÄѲB8eJpqvnza~˜ÁI𥛫OÑÎlGàÆY/ž­€M•®¹ûÔjo7°‡]¹®e!›B\`+÷þS[ì}~9yM€úà#.%kkÖÀ8¢1­óJ.£þÊMÊIËâÚãùÉð¤Heºêý%9e9åÀ݃10f’¢™Ìå«°æ]Û¹ãG/h9›þñE÷Ä»+4$Øó*º\•âòŽeüŸC4÷ÏCìÖÖ,ÍÉ?†ÜËØ_ÿuâ‡Y[V $ô•Ïm?Ð8\ÇÂm¨ð® (wÎÚL ‹›ÇZN#3¨ÛЙ~7YpY~Wˆ+y2̨ÁÅ´Ø- Rø»ä&]¡öHntÑ—Å'RÈLv<ü¼¼Šý Ý£¼Dõâµn¹;ïŸAæýËò_ÐË(ÙÊ(ù‹.Û¬WüÈÅ‚ |Á?³*Êi²- .ðñ òÙøwÛ }/ÈïwŒëùû„âOsÚCTsY%ú6Hž]–â"ôäE_ö•ÈÑéµ õzMÓKä~d/žzLæ¦F@˜E¤*£˼í¡Š*¨0>¶üµ®­d®7òuó¡O8#w¨ÁÅÓW»ÞÈ9šÌ…àÐð¨h® ÇIƒ1ö¥¸âï\ø?ßC˜u<î:7aú~Æp5~ËÒR5“Gæú±³§óv.ü+ßþÿÏÿw¡|wÝž§L{°†-ŽÞ">tª³`ËÆ=öœü–扌 ©9)øë[óBs—«ò¦.µÿYDN€í‹Â¼iDʯ=fÿפ+ËÅ1]­öŽT Æ]<ú3éCä#,iRëûó(ìƒòÄ> "›øÍà¨8äÛ 9 ÍPmúúÊãÇrj)¿Õ»ì*vÔnGp5~Û¼ííƒãÊKdƒÇéņ½åýž]Å¢;”D–â·|õ§ €»~vaˆlñ”w”‰Jýk hÍÏ-îYê[½ûã?ˆ¨ßèH/ÅzØ較“¸ð"T/'ÇnWtºý•‡^¨0¬‹¡Š®s÷3~ë Û47J½ˆÄ8•·Â× p<§ñ4GÞÿkyâ?Öž´é'~ŸßvG÷ À-Xñ mj¹Ë·¯]ož±Žî9âwß>»üìêÙE”-ê3p$Ê «ÖÐ$îÏùî-.,Ω¬ò¬tV£c€M—)ó y…_‘ÓÍÄÑJ½hU$©>ŽáÇ¥øX|·{*GKªðµ:**6ΣÈ#y5Ô|÷{›àží[Xíq0æxÔñÈýª¢½éÑú`p榌€0a8ø~qJ•®IŽèjB¤?»¢2…dÚäå'&gd%%5ìhVéƒôÆ+—ÐTX¼ë€kÊ‚lߤ÷² «*nøN@Rfèü´›ÕÕ¾äßqÑx“pFä׫8¨\Š×»8n8®ðf5Ó݆Qq~wIKzÞ 8y©æâe¡Í{=»ÀÃÕu |“'`%û{9`ÒðòÔˆ–8‹Ÿ¼y¹õŒ¸ÆS~Å’±Fô®j²‚Œaa86»UÕdžp´¸â,'ÖÎᨗ\øbÍ ®?¤,$¢ZŠKyU²:R¸ÒZȧ…ôvu€f››¸³X -±r\pAóäÐTU¤Ñr>e?¾…·Ì ×dÖ wO•¨½=´ÞÆêýûh¾¦íB¼r(I2§-Õ‹í:ÖH;úâ]¾è\}b¡qÍ—»ÃÀɸ®Q“íCy3R«Š™HÌG`m3h›QjЕR½ìU; Ôà ÜOWA&#,M™å*PÇ)A3“šÃ¬Øz¼-ÊuÙbOmqÚM+zãšVÈRgîBžüjž‘™9˜‘˜ÞŽÌ"#•9`‘ é‰é\7}˜$Ùb†?À@>&VZÐ]˜šj¨®.9×=Hò/çn rÔYÑÔ‚Ð(e\ìòÙæsžÆ¤©ub™™ÅƧվµ-ì4>ý)èÔÍ«"¼y ï†¥~›WÙª÷_âU$”AEU•¦Êx$ýTû!“Wb(­ÔWÞažHÃ?”‘áþÆIzå¥F]2.pO,7êO6÷+1€ÿµ—á¯|l6$Ž+­†B ÍuÆQõB™&ÚëeúàäNÖÜouà¯ÅËÀÂöf©t©ÚòT¨¦¬›àêãÐàrBø?(9KÅYæ¥yõuÔ6w•„ÿÍjp…xPÒr.z‰2§54”‹fzI£ÏÑÞi¸8´ûµN"— {ò%ífÐÞ)¹=¯MèÙë)#5\”ñbœEhÐÃqŸ¶N¶´uŠ$ÒðM¤¯q& 3{ž‰)z <Ï”ãõÿÎôëz-ÿQ»ä×öÇíRÜ)þ¾< ØÛ; ÀÛ»8 ¼¼¸¸\@»ÿõ?³À"Ñz?ze$ÉÈŽLÖÐëêëúdSÓ«¹¦½…^=§˜¾†ûÿ_2‘ endstream endobj 542 0 obj <> stream xÚ¥yt×ÖîY£ŒC̹„JB1˜încK¶%Ü›\¥-¹÷*÷^À`LÇ!`¢# $¤B$7²’3üÇYïÙ97É]ï­ ­5>gv;ßþöÞÇ"ÊÊŠ‰DC–lÙ´ÆnóÔe6Ì7ÿbnŽ<_+ÆQ«"áµ'F[½FQ¢âaä›zöŠùûë¡æïñäkb×pÊJ$bTaš™3ç̘9sö2¹"4ÐÛÓKi;ÙõMÛYóçÏ›f;{æÌù¶Küܽ]wûÛ:ìVz¹ûíV’‡½¶É]½Ý•¡¶“z)•Šo½2dÐØ!¿ØÙ W½’2ÔzèÖ¡ÿ3,tØÝás‡9B;âþÈ¥#ËÙ ì66‡½2jì¨÷FEŽB£G·É8Ù>ÙÝ1ÅcGŒõ{gܶqE¯¾ûjí«^sy­ƒsâšøá¼ßm5~Âø¨ñÝÂlàé—Á¶T„<ŸŠÑ%á{zWjœzwÒ&œÓðT½“.\çá:?]h´®Hפ?£;§;£;•Ú §˜î«e¹\®TÊååÊššòòÎ}a@饢ÿCE\ûñÇ/~#…pmöÏ ã"ÁSâ’‡·ÉôYÑåP ¹¹º ­Gÿuƒ  ¿…ˆ­'X³t^+ìou‡Þ“ÎGÒæ„ÁHòÕÆD಩ûÛetŒ;x¸·BžÃã%;é(p÷Ø9|3‰4̾°2®R«R[ÒšSªS[˜ÿËÚM:g?´î÷€(ÞÆo¡ñì=¢§Ò6ï^Bc/¡äKhÜ%QsWg×oä¿XXñ܆MÍÒ§CSRÊ@\pR ®þc™L“œjf_Q˜«„ŒÒ´Ý{ÊÞôìrÞìå¸ti‹ãÉSÍ]7¹·W³q!凗”gf–(wî QÆñx£`boyž#;–ÐâDv^¸nÞ©­hï ;³Šƒví0ï´‰1"£ 7ŠžtÝëBC‰MïØ::¿ÁÏ£#àËCP~|‘&hß;ò-‘å]ÁGoÞ®; ç™K7W­Û²i:òì vE†{xF…+|bÝÀ‹Yxlù-î ´µT74¹ðëæJõõŽ&9häE¯ñ /ð>UÔx¶´3%ƒÁëЫløÇp²˜ÓµåͰD˸ߖuŒ dóÇæ•úøË=qù¸‘‡¶Ì²ŽÃŒ :m@NOE¨Î(F…xÖäup§g¸¿ŠƒýîãÉ:ÈÑé´z-$EœÝòݱ‰± Ê„EVü~älÞ5^óxë÷»€‘'ªâxÏŽÏJ@²·b^‡ÅûìT;\oݳmo\Bb,€:}_5W_=óíé/‹îÃuÆæAKì ¾&FGѬ¾Rg„j&š½¼À+Ž…ÎN8ñ¼,*C£WÂCtZtqìoÉÆ¯WFC$Ž )/å² -%-Qeš@­(˜8ðjn†æLªµFMeIÌEuXE„²€)-(,á¡423!E•·è`lÚoŸÈÊs¡Ò™’ˆÂ`N ‰É‰ÉŒÍçôÞ-´˜¨º%F§‘E܋̈æ1‡x:ö{ô‹æ0yi_&æòˆ<Ñ1àÞJ6çr6˜7 Ah„¹ ÉbÔ gU¡îÎaêäÐP1¡% ÏN#«³íÛÜý|<ª­\dèô:‚Ã-Ña¦X˜Gô[”_¦_*³^Ñ#Äèî§lëÞj_Å^_zECku}à 8œ¦‰…Ï­ÙÌBнÈÓ P‡$ÆâÏþX*‹ -Ä3Ê’ˆb®²ŠIž’¤À(:fBJ rîhí$4[aÉx,¶ÃkŸâÑÈ Iž ±ÈŽÃ>8•}ßx:MºòãW¦à‰x’ø>±Ñ(ÐÆ§$”ñB—…;lTûra§NˆÚ»ÂUáš¡UiÀ Ή®àÚà€¡¼”é~k¶4<||«¡€GitA5IæçgÓf1FÑ©‡(Ý$¾|‹‡Ƨ 9ôݘ•ÙÄ×JK ÜÃö)8¬¢OAV÷+Ë[[n\†Ÿ4xògx(øÞ{ï¸6Ä”VÕq`ˆËHL+:|¸ê$0Ÿ›¶ÏåaÅFGWs P’m6Šn>ìq `Ÿ^ál¿Þi.‹S½Ž9-Б„Òë³u:ÐC*SlRFxÏy´ C£¾ýþ1÷Îl3Ü<•q‰ ýÎâKX‚_Y³u•_Yhe¥¡´Šƒ¬äœÄŒÆj#¤s­Ãcò¨=na¡ÚmÉnš`sˆˆ“ À3£ÀˆÞèïGÀª£›ïcüS#÷sH7Ñ‘Ž”ƒ¯OOäV[hÐñ™Éò°=¥›â²¼8:´Qû<§›f‘/z$Á¤f·Ëh–Qôµ ÅðB;ûòe\J{«ãÜyœ' †€f®ÒÒ2³ëZ:òs÷ðŠ­tšÏ»ÂæBU»N'ËÈÖéõ¹}‘© . ‘G»/¸·Iа_ ñÓ…?áœìIÜ¥b}òÚKh®Qtâ+TBb>=b Иû_> 9\ …á ñÉ1„X”EÊÚêÒ’º#¾ç&áqäçì‚cøƒ_‘è—/Ñ$™ý[qÀ9d'“‹ßd!+)Š™O>9yçóSvËæ¸~Ù©ãlb B£QtØtœ8+!Î:­qùÀkÁflGjåv& <[[tM…\*R!Zùë“’â=0æ€pø_„©<@Â²µ Õœ?gM(øò}Éž-ºÜW™{óîbkl=oá|V^Þ~6Ü.dÉXÀ¼ùÃâòðîÿÄÁ—‹;í‹™… ì ÇöOt½}»sÛ– Ž»Vðø¼Õû3—ÎÒõíwg×®±ÿhAO-œ{ Õ’È™PÉWba*g£ðˆ…³gCøë‚ RÓRÓ ˆ)+÷W‡ømopB4‡^A#Ðfƒ©[o`ɤyÄ,ÉýYÈŠë€ÓyÇ11h «‹×‡–X·ÞyÑ{›7¾ºúñ î24m(Ú¤OÐ%è]"Úx€Ö¯›¹ ­°ð“ þ+AáO¬þJZ}”ùâ]Ù?¼kß-fÕÞAr¿ˆøäˆxé!Ó²Ÿ:‘ä¼bÿnO…Ü‹#ßý„†±9e!Ên©fµnæèeÚOÔ.EU,õ÷jG!7”ø7j‡Òá ‚‹‚‹†n•¯å Í¢ók Jä¤9Óf¦›fDŒ¢V*"œ½ía UÐØ`^ÇÖìµÑq ½–®fñâ_ѿЛwžÝæ;áˆKÎ"}„>´±ï/í9`%$DDÉ•%È[O$Ee vøËÐ`þ,´Õ1Ù1Õ=&[ðø• ¹ìIݨ°`ÛÐ/[˜ ìŒÝóŸW_ÚXÑ­ ê—-6–]A–nXd‘ô§Uº=HEÂ}ЍG”%J¸Žô'2{¢Gu«0Õï¹½ß>ÊNsOuù!ZBü˜JÕÒ½åžXê`Ñ~¯{*½ðý„`.vêä†Ôô”4R+BËäò`ùšË;ž|óÍÉÇ\ŸYßv‰Qz΢)h¤Õ@NÇÜ>Ì2cÉÇ·²y¼gIP–AúRÙ$úðÿÔbÐ>4’~@º‡Wq‚$Æ¿oýNoX”à÷"¥~3¡(–ÕÄ›ûy3ßé–n•§åI°îö¦¦A!ÜJ%í“v¥ ˆ;Ç„×Ø(ר= {-P[Óh‡\d±µê,2Ï­ëµ·êøn•Ô/¨»÷zÕÛO4-(Ë?Ëÿ ©9©Ñ™uP™U©¹Ÿ¢2ЕßH«`tÝžôß¾¬’ÖUôa|íE¸6Öé³ïû.HìÛ,\c#÷ï0Ëÿ`T? Þ::G‘KÑ6ÄbA–ïn€ 2ûëò‚®BjÁ+Õ_œ·–Žì;vôŨp¦7 ½Ì£Â¡}5Ø;ìSàv|È @Ⱦ¬âð2&ÌeYÌ‘èSð9tÁ§p#·#ïdmîgpê£ó6æl'C¨#¬‚•Ñ›b]‚Ts¡‡ö—Q|Ÿ©{Ø,%Y€_øÃËâÁ<éñÿ¬Ìròþ´ ²zJ?>¸jóæ=«¦¨Û7ö±Öp’ÃKM‡L#¢Ð¯è {ª±î$|Ì|³èKÒšâUÿo©êF8y‹®€ mm@a6ØkÁ§Ø·Ä·6¼˜ ÕŸ¶7ÉAÍÇBh}˜gD =ÎÁEHWW0#¢¢ýË“R<´™]‰Ü®Ò?´9íØéæ8ãE9:u 5^#mƒ¥©£âý6¶9¥¶-^Hæ–µÙÑwÖÅß ËN¾žƒKœÁ›Ù¼ë£%ÜpÍRn¯I:¨-ÑjK½z:Ö`³ÒP4pe•—Aúic ™ƒsã»<4¨Ûöp;º-Ç3s_ÚÒ¢¨Ô9ž-p˜9~ôèI¡`Fj`ª_‘¶ðÏ­Ê„†™?}¼4ìo¸~´yŒðâK_®t¢aÝ*g©…¦–ÿé›Yê† E¨9ÿKÉ,µ¢? 'ÚoÞ´ÉþÔ3=¨•þîG4væ“'÷¿GÃ8µA¨7ŠŠ…±°Èn2gš?éë&ô©šø¸5j³jfâž1ZZSߘP5]-k*ïËÉ ½[Av¢‘ÝyÙn¥Pcª€„µåEž¢£è.¡i¤”YÆ1Û^HU‚ÿ]ÆJŠªûdŽ·€¹ŒF Và‘8_¢²`ð÷^1 â¿Fößc{I¨ÙÃZÒkþf жy×ø|ÑïOb·öù@¶ Wé[íhuœ7ÿÇ©O¦º‰Cv´emÊóqt¿{4æùt61G]D:Ôs‡—§KFŸÿ±R–½/W]Dúås¿œ™”©Ma^è$ç…Î=·e{Îè³ ¨Sþ‡§ô{¶ëå`ÁËð´Tôoô…µOØèŒ$H„xHÒÄ$`ëeQñêDƒè¬È”¤¬èl M®õUÙokóâôcª³³x(R§Ee06S^\£Lù‡[~ŠÖ‘qÚÎh¾7žÏBºæÐÖ-Ähµ:ŽÌãéPi¼~(;-;LÅaáA¶«ðÈ%Í{·Ö–q6‰æYù£è´É\‰…E¨…ýÌñ3l»ý øÀ¿,´¢°>ýW“Rl¾ƒº{Äg-ßÓ`Ù6x“Y|Õá'.nCç ïN ýHMEO ç#`„d0K®²„Jö¹{†í€$`œö4¶ñpüIªcÌš/Ñ€rÔ™ÉQ¸ÔåÅ– î:¸7ÅJ¹z¿¡‡Ir‹zL¦ÌÁsŸ`+~ìóògð«s玟¿znÕÛ³íV/]îöÅ©×.E×MhïC±àD¬!"KÅEA$¨Uña»WóÎʫߞ¬ÿä‹ _› ¥V§Nñ®Ž%œP]ZZ}klÃKÖâqs°Í¿'“ióõúŸ x‹íM=¶ KÿÎvCÙ¤£_€Ö±¥e°1v?bÛL›„ã¡¿NF#ÑØŽfùH23«UAë?$3â:˜×ü˜Ñ]dKî}zืg|ÐS›:Èš@ÜŽ?KÀ¢kðÀ#ôÍóº:.Ea'“VIU~Ã…ù±hÁ®·ø-S¥=Tdöò'ÜùF¿æ¬ÖÂzoÐ68ä"ZpþäE´é¢ÈhBN¦† bäù)Gì‹K '˜ˆÉUg%ç‘$H…Ü´¬êˆzu=0L7¿3³wMXUYn>_—`ˆË¦¼¤¸¢ZU¿‰WÂÎy±w)Ó—,ÃGžoq:<6€T¨Ý¹^³jw²D0s~s$ùðß»¾C¯c{ðç¶")뼫½³³½ýäÉö]7îÚåÌëðröÁ»®+v½ñæÒƒí<´6<™Ú¦s/Pêd>iÔÁþ¼µc>· ¶‡¹û0èCé_A«ÚÙÞéwÆh ýïÛÍÇç9q8È·_¹˜Ò ½‡s÷©¨§k0 gÿ:ÉbG<Ê2p! î$m¹Ei§å& ;t‰68Ø(TšÅ{ˆf_¤+x—YðË6aT÷dÂÁ=À3ÀÛŸds$$@„.\¯ÕA¦ö€OV40ªÀpßE¿@š´ ºÂ K{#Ò‡0)AEÚ»C(ƒEƒ‘•¤¹ß$1ÓR"i< ¿.A?÷¾½ÆªcÝ*—~›iqÍå}ç&ñ}²Ä7¨¯p k‹ø½ÿ1dôå(~‡îïŸ ê÷üm?ëFõ„èd¢Í±°}Ì–²šMÆسE“rd# ‹Oœ@Rm0„ãÓ+­ šyÜ)}yWðÀr‘€–K¿:x¤­4/ÒÃaRµß©]ÿÿÚÒ ÍÂe¶hÏŸÙ¨ó Ê^>ýØd¾Ù¼Ñ^ þ3–`ÉôÉx(úx ²BVBC9ìŠg²Ko>¸ñÂÕkŸ:Ìžå¸t)oƒ{Fßs/)ß ²ýìØFÿŠo‰Jóÿs–•öwhÊþµôšBt)‘=ûäò7ˆâR”T¼´upÿK"ÂI 0KâÚïªeð‹;þ.bîaFôkf®t_Qµ›zc]Dúþ4}¦>?ÊÒH‡q˜¦Ãäæ¿BG¥G$¥iHha+ž"“ÏñN &±ˆ¯ >pm#âe$Èéú¼´Œ(`ˆ©¡æ—ÃýÍ/‡˜ }š¦–xŽ^ÿÊtšÔhЂV¹0Â_åê¨É(‘iš³ ƒÊCC®õ»Nñ× óBí7/¢t܄ꉕÛÑl~˜ÿ ܪ„`ßïÆ\,ÃXŠ‘b#>IÚ ˆCPÊ¡ç½ýùyËåŸ;Î’’>6úŠre¡ŽTw¦ŽA ƒÞ–§ö£Ñz&·7j¡| ¬Öl Xç[!„ÁdCìÄc4L¬B»×·Z›Å£±É°{ÖôÛ?õëP]ÒT£ ëåº8ÕC T3Ѿ“… 8ŒÆè™ìj]}ƒB§&{SàTöXR¥9b_·£lÞ<ÄÃÞ[£Í$Ú4žŠm!°õŒßG¾¤6õZîx´†‰î…K1_ —õ'ªÎÖÁqâ›MLް,}Cãt©qi°ÑÚÚd=„d*·(”ü¿ÞŸ> endstream endobj 544 0 obj <> stream xÚmÔÿoeðûôÚ©ÐÁ¶X,_$Ås]×ÝVÜPªa“m¦‚,–cn™ÛøRw[b¬àº~ñÖöZ]˜ø•Å_ËbL á/0ìü]0‘ì" ÉçIž'às­ ëSÓÜ“»{Þ¯ÏsOsŸÉn—À:ØÝq°ë•ýoî wþhÔšhÖÙÂÒ&‘v {md¯Lž³?/Ip±Öl´Fµ†R5žî®“vÈUÏ87Ö¹Ü[·ïØùRý®Æ&ÕßöÚÝ¡÷Þïëÿ`d|bñWMÑ”FMñjJ“¦ø4EÕ|^ÍפùüZs£ÖÜ¢5û5UÑTŸ¦ªšÚ¢©­šê×ZT­¥EkmæÖ:Zùá׫ÂëY¥¬Z^~î啽üÚk]«Êî¦Ö¦ýãcaOÿøØÄà©ðà€'<îywêÄ Gñ›òŒ÷ž+ ýÔp8<8fÝ õ‡Ãžmdxlwñßá»­iä´ÕHõ €_zUj—^—òÛpP–>”O”ü Å  HÂç`À,¤ 0! 9ø¾„9ÈÃWð5œƒópæá¸ßÂwð=ü?ÂOp ¤lH6É' Iç¤ß¤GàƒãݰÙm>Û1[ÆvÝv_Þ.÷Ègå_ä{ö­ööˆ}Ñ~×árt:Î8TUWí©Ú@Fp•¸\Ñd4‹ÑUq~jD²ÓùäfÓ0Sé4Ÿ‡?Mæ§³có¼£ã /‘·¸š‰ÏÄèϬM4 D]k®ëxMÆ9T2s,(š9\#.ë¸(c‚)=›ÁºDa®5⢎ 2FÈ1×´µÆ =ÃB¢8KBF6‘š‘Y.":fd"£Å58¢C¬W0)“'z “«â:û&ñ¨ŒlÔ•4ér:–ަ8INO'#›(úÙéL,Ï&ó³YÓÈsÑ3‰#2fC–è c¢ØÏÆqy¯È8Ï‚\ÄMš AÁ¤¢˜`ÁtŒÏ&óF6[P×'ñªŒ ,PT9¨T9°Öz¢HÞeI¶‰ùeæòø€9­|†®Z1¿ÂjÖ>¿1(V¿Obú>s”¥“d#ý§˜~ŒÅôcúPHo¡«®üSqs&ͪð/!ŸŽ'ýÛLÎf&•+ä=ôN¡z,Íœx§2_Gÿ,«ÿ"½UØi,ÃêðÖÿå7e¢.—„—+…›.—ï.à5 ‡h®Ä‚8'¢ +#ó¸äM”öÒ…†Hº¨QFÚñ Qúò$šb:Ö—3NtZÿ„Lb“ØÎ›ƒé´!+û4¬æxÒ€–Ðôã€%†iHêŸ9Š',1@ûD1€}éL*S.Ò@zñcKôÑQÅ‘LiB“[â<Æ-ÑKuQôâDal©Á-qHç Ÿ¤ Á˜)>›¨ÜËU \(ªÍUªæÄý7Þ-Šmô¦˜çoPE¾W­|‚m¢·Åü&¼-¤ø ðÉeµtEL×àJùÈ^;ž‹f>5¢I7Gëé=­Ç{)ÓÁÃH‰½ðà”·¥BÞ¼kK/­[r:—Ö/9«IüÙ  " endstream endobj 546 0 obj <> stream xÚeTmLSW¾§-YeRTvݽ‹JçÇÐ9¶´à›_8L;ÔM@·ˆ·"2À‘"!eÒÛ¯{ÛÛÛ¡V‡hX\ˆCibÄ,™&dÙ˜¿ü·e[d[¶ì¯.{›½Ù½4ÃVs’“œ{ÞçyŸóœûBét!„ÞQõîžêmë×n;¸Ç¾ám×ÔÑ¢nØR‰T"©Œœ¤™JZH²L“,Ó&_Ô-§(rp±:¯ÉWçœEÊL-W¦çôK¨—Ñ=—›·¨`)»¬påšµë‹Meå›*·îxs_@âLVÎlâ,¥œÅÌY,œ¥Œ³TpeåœÕÄYÍœµŒ³Z9«³•r6g3s¶2®¼”+7qå¹n£•3™L¥¥¦bK…eW[«Óx¼­õŒ£ÝéàŒÎ6ãA×i‡Ñdlp[N˜O;M¯;Û›œNG«úéÀñ6§Óh?ÖÜÔZœ>¬¢=?Ÿ¢©”Qó UBYˆM³E³•ÚEöSG©¨6¥ÀGü$@‚D " ‘0‘H„È$J>!ä<¹@bd ‘aò)‰“‹£¡¥¡*©~ê•$fÒA>'³šµš.Í-Í¿ÚMÚNíMí#Ý«º:]Lw?gqNUNŸ '´P’ŒÓ|÷û|5«lXßVtG=± ,2rX’ÂòÐ,yPS¬(cž¨[d {‘ImK2A{‚^¿×ðòŽs•Â묀Ë/£a´"Ì3’Oö+õb4*ÆXþšP-ÌDf¾ ÄxÙÒ0£Z %›é14 ¯Þ=$û™yïÒ‘ÉÍPÜðËÉßøeÆ'ña^t=ž ›5àø„Vè¤ÓµA™ñËU?Ù«û‹µCnÏ7žaŸÄd”ÇWÃ1|<ý±Òôö„o'kèHÛC„í¸=³gPµÐø4º¯°OuœQ3ÉÝ´è<5|*ÞÌŽ4Íàj¨ÄÊg(¡q'4ö²ÞˆwŽ‚÷ŠlÁ®‹¸(´A4»Ó=\.tÎ:ôê‘TJhQÙ—|j ÞŽn6ƒE…Z‡0Ç)(bŸÈmJH“$5òíxø [ä™0ñEü?w€¡– ìÂ7d9̨·<·Õ窽ÕîNt…õ†£“îÉ%}©DPÑšcHœƒœnÈØ‚­@ @†ïÄžf)è«ëßÒ…Ë„*¡JÞu¡v€IËÒ*$uýÅðWò^éÿSX¨ÀþõÃ’ÄdpœñcÉ~ì89)m¡Þ𲂿f›óCÕr!0*\Rz8qò³l†N?Ú+pH8«1íƒÞpV±t—Ò0"Aã¯S—³1|põûH>D‹-êyCì ð~Æçó+IçBùš_»±™z} ;Aÿ4EKnÃpâ=VMV¸÷:Iµc/ 5ã‡u‰DXfžÙ×z öÊ!+mXøQŸÏëeÞ g®D†¤š1Dƒi ®‚éîÝl>AF–¦Kù Ãû7UYìêX̵Û{z<>“Qý0áØùi½! âr!…»1Š66‹VÜ'¸n̪þjñqj%­†n°Á828ÆfØ£š‚ á\àv³Yw(è’T|-IÓ@}l†µo¯UÆ<,Â)ö _×Boªn†\ñã >ÌÌçA:óeë÷X™X9†…R_ÄËDÑÿck€.åA¡ÓåsiýØs bílÖcÖ ±þ94 WÕ’dKh5ô>iÕ4Ö?@GœÍ Q¡³½'ñó$†Dî¸$†DÈÿ¾¹paâù¹UòÔeÞré? endstream endobj 548 0 obj <> stream xÚuÔmLG཭UD t§¡z¶U«èyÇ}€F‰hÔ~øEÓB¥7'bP/J®²ì±÷±,ö<ð@1´õ‹TšÖš46mZÓÆ4¶iRõGkúÃ4ñG5mú^òò£»=@ŽÚL2ÉÎÎ3ïì;ûáŒFŽ’]¶{צÍòví^WöJÉò-nVÓT«¿pŽŽŒŽ$´––Èç6’°ó »!ñŒñ9Ž#esô~ál½OËÔz.WëÒïfqÏbœ6cVæÜš;ÿù…/å™­ö‚Uk֮ߴµCaVË·2›…Ùò™ÍÆlvf+döæ°2G>sØ™ÃÁNæ´0§•9ó™ÓÎ ,¬ÀÊ V²•6¶ÒÁ¬V«Åb5Û mëë<&W}]³»Ñãf&O½©ìÈA·Éjzûˆ©voþAu™©¥±Æãq×éCÛ]õ©¤êš:sòcµ½ÏžÍesó8¿ˆ[ÁÙˆ“_ͯå6’m\÷W¯MˆŸt™H„H˜(¤“¨¤‹œ$ï‘9E¢¤›ôÓ$FzI'ðáx®ˆórW¹Gd1qkÃwø9| à¿á§¡Éð±áãbc¥ñ´ñNZNÚë¸vúsšAÁ,ycbXƒ­r[›ÜJƒ¢zü!_A‰FŠü‘NŸ" ª_•£Á®®`”fx‡5é?cWÑ6ñäÞˆ’¾C;t¿¨3¾éx˜*ÒdÜ×Iެ 5žCã}̽E==8ÿÛj5=( aQ‘ζBõvhÀí4ŒáÒ¯ñ‚aé9šÂTÿï‡îï»·‡BÞêáʸ”„Ó5¨ŽÁšKØ«Á]Ç ºç‡´$ÌCÂß;?sõ½«Ê„C’òÂ-Üö]—¦†ƒ,̪‚ôRú³k¸¡[|²®<‹ì7T¦ê¡vhˆ@/N£¿Q?èÏF¥C˜åõúEAÖrÛÕ•©ìV¡ø!HWèíˆO;EÂjPÓm]­Aýhtº_Ä~ä± ;Ú¹mÂv†¡Þ€ò//÷QEù¯å%.,² Íôða¿8)¬>s¦]‚R­mþñÓÿáX²wàþú7éR|qàk—„{¿>øé¯OܱÊ'pÎÃ='¼4%pO¤A (`Ÿu4s43;9Q jXQÀ 'aßñ84ÏéF/z^ÃyÓ3ð»ó†±h«V™Ñ¸—ÐãMÍÇöÉmB¨UM®Ôîë»UP µ“×ÉÀkðý8//_éëq=ZW¼ß›²èàM¨†ÝPÊ/ÀõqÞØhAãFÌ¥Ç<[p¾XÊÏ~¥qíïOå!祥Ú]hÄ¥4†ÕÁß/ßÿä½ yW‡•x’N× v J’§ÒŽLÂÁ©²sÈ 0 zéã F´BO>ˆ² kïbt´‹!°Cö hå¥v…¢r, 7èùJÂýz±í4´²ã¨@†b^Õ/LüÞ²*v/‚bõÝûÚ#’"h×ÅøÕóoމ†õ;äz9¤¯€ëéG¯ˆù“KȪ —Ô¡(VßD-Ë4…÷ëxó£5ðT)½Ø–—??‘‚›NáÞkè…­)¸E/¼–lP€X,¬ ¹åã"/B‰Ñ"_DÛ¸$ “ $cdÆùNÌçß}xzæÌ‘§'=Íú‰Ú&© endstream endobj 550 0 obj <> stream xÚ•ypõÇW–#~$ƤMeŽ]Å 4˜¥”„™$B‚s8ˆ1ÄŠí[Öa[²eÉ+ëXíÓê–uØV|+6rl‡BÒ98’(Ǧd¤”2Óß:+ÚþlŽ2ý§y3»³»¿ïç½ï{OFåæR2™ìª lzxÛ†ÛÖ?üÛ¹« ’ïò¥YûñzJ¼A&Þ˜#ÒrñW¹ôgsÿ•—s#EÉT¿ ‘š½z.^\<—‘°pÕ/©\™ 5¶xŠŠî\YT´j½¶Á¬¯­®1ªo©Z®¾ãÞ{ïY¡^UTt¯zmF_[UQ¯.®0Öhê*Œäf¯z»¶ªVc4«oY]c46üîöÛ›››WVÔVjõÕ÷/_¡n®5Ö¨K4¾IóŒúAm½Q½¹¢N£ž—¾r>®×Ö545zu±ö¾žhE÷Q÷Sk©ßËŠ©JY­ÜCQWQ UH-¥–Q+©õÔÔFjõUL=Jí £çP2*—|ä—ÝœsmŽ(/·>÷ÝÕ þ®8wŃWœA¡oE.–ëÅk±\†·¤åxKR ÛJŠ‹ÝœÇ.Ôv†bŸ|„¯|Ã0½«¦YÛ Mi'’ /?ûö¦^ñÓ}²Ïg¯—Ï–ãFe, Bâö -˜ýPYCàYYÖÊ€5âŒ9Å—¥”*K‚Íiw‚µÀeã´ˆ‡Pþì8dpiF\·O†‹ñ"åSë*ÙjŽåm<´ NhÑ‘ ïÜ™þ@^a ©¸Õëbš¼Maèƒd8žÚç¨ð°¢WZ³ Íl)³XÁÄ{­]t&…ˆV\€n. Èß©„Z™Gpƒ«Åª¸>>Ôfp²NI¶ì:%®Â秤ó ògSDÕñ —ͲآüBüHàcmt;ðÛ¸IZZ¶]º´Qa8€„…°<‹‡Tß*ÞMÚže€‡V‡ÖãâÀ!"*AÇ@ú»aÊëó%A@ÑŽ€ƒ¶ïpµ4¯i°Ü h™â{…CP€‹8oÒp'M.=˜-ä Ó ðF„î|¿Ê ‡PÂf:; 0ÙÀÔ‡nÆ=ÐíéõUvpyœ¼Kº.›QÙ5žŽµ€~zMœT ‚Â=¤wÜé ~a\†Ïâ”ÿPœ÷·Ö3àÖ¡ãÝ|ÇX“ÀõÅá=*¯à‹ƒù¹¨•¶ÇÎÙš×ͫݪ8?,SàEcú»çtÿ ª0[Ál‰e!HÌø<À‚‹wsíRAvÿÏÜ>6Îô€¯¦)~Ü“JÛ ‰i‚0 >Î1‚ô'QþådÄï2²Ë»Ä¯”уBä þؼ)ÌŒ¤T4×Z›³WeϨV‰'݃¼PÒõsªæòÕ•ÙOÌnžç¬Ò5٠ʶS׸Áƒœ6Þì tD¿ï’‘¼B?±i¬]p0ÕÞº €€ãÄçU^Å—Yìkõ¶'  ¡Î`D¼}V¡òòÒ’ìéïé ~¢‹Ãˆð¢7_ÀLÌkma8bÙ¡Iðø !è  |±”M‹Lkfd/ŸÁž嘛]¡ü¡FwÄF»a/gôlw«=,fÔ–€ØapÚibÿ*§ñ.ékUG-XHÓÝtzëøj|-.Ä7µéÍûèíP^ÝhB‰l®²º:ý.ÃþÁØáÐþP:¼?ÐB,9653:èHªôiv7ªë¶êv<¹« ˆ°r6/ަeÓã–Krñ×â5ÊJ—u/4£ú¡Žxà¨ÿäɇ·H…M.õŠ7×`9^õÉ×ñrÒ¤s8—sõJ)—@£å™÷˜Þ÷ÍK§¦_=Òs÷E~¨åãï¾ÇW^”ýålæœÍUöµvuõ†ºÆ®Öþ¡ý#´´4+Wîh—Åeƒ–‚ÒÉêc_Âêx´Ãç˜ó°ƒc÷UVV²Ùà „zâ£ÑáèpçðèǪHlºÑ‘ªOÜZ!©­ö;L“ô}Ñô¥‡G%¢.-,߯ÖðµRyZül^“å6¾#ï ¢R–”¡N§Õ™’¦‘¡ô-i¾ûÒ²¹tãfh‹ßãMú‡!‚Ìñ¦úýÍ„þ8}pÎäλ€/«|1! IôÊ®ƒÛ–ÿ¨£¼¾PräìÑ£GõÆÚö0ÐÆ‘‹è8B ðÂ…ä¼7ðñ÷_ý«ÏüßÞàÀã2K…Ù·Tn 8G-‰¶=áçü‰èÔÐ7S¯8ß6A ¸È a9«§¬­Óå¯ÑS04O Lt€ ú1ÃN·ÙZ¦Û@Œ¡sö‘ ǽ±@¿×Ofs'œ¿©ç‰ÐDߨX,þÊg&“¥ãÂ씑s»-}Ã#}‡Æ ã;émðø®’’m%úöV)þ96=›7#›yGŽ“ÿE¶´c7×A þiqÖ¡r“„“_}öýôuöõd’¯“äBV;çâiç2sí–m¦Šj@Gÿ)_§/NÒjcÓÓñML¦eø†“øÎSrq™˜§4º›Ì G昵/9Ú9sjã`±t]ÅŠ'h2ɪ'´ýænîìÇqiÖ´ÛPÊ·‚òëŸ?*„A 4„l­•¶G·žÒ|×Mà«§h¸°<µ;ôdä™L¡žî·¾¤'á`{RG„\C¬¿8ƒÉþüI€N,TþM‘Šý0+Šãxn À[ÐÛm¡kÁÑÐþô^)_u›Âdýa\Pl‘N½½Ú ¶¼\{ìÛ“xI¬Ó.8çvÛai~rç›5Ù™ÿ$@šo9^Hœ½Ë”.SÙú €J[ÆgxýÀ…¾W£ƒ¾ô§Ž”Ü7žxìß ;d›ó‘Ë©³î4—T2ÚSiº#cÁÁà`ò„¿gßûªàpì%bºÁæ nƒF»Ã€ò›zÅõÑÎNÜЫʣWÐ sïÙ—we(o¡7oÑs ?\”öçåáÏ®ý7¾ ó¸ endstream endobj 552 0 obj <> stream xÚcd`aa`dd w puÒŽˆt ôÑõMMÉ,ÍI˜ýáüÃùYÈ3üP`ü¡ÈôC‘ù‡8‹,ÃAy˜Dî‘ &ã.!vFFv.>Ñ€°CÓósËCCCC=c c·ü¼…äü¼²Ô¢’Ô…’|…Ê‚TC…¤J…Ü4£‚C…ò¢Ì’’Ô> stream xÚ-ÏoHqÇñßmg]zj…Ãz»'‘’ÌiØ?’Q”ºL ›õÄå.7Ümóvû矉«ÉæoîpîOÛŠÍ\ÙaO‚¢Òg=-óI>z aâÎŽ¨Mzò‚ï÷Ñûƒ‚”w]íêêî=¥Öh®)>.ÄÄP-º¹ï-j€P‹u Õ(±ÝþÅ%u€_ÇŠþ¨,úýhÑ“$¦ãEÌ>P©N+UªµÅêfŒC–¬l ›ÛÚZÉ•ªl§)Æ8¨3“k h[8LäMË ‘bÝdýyËZÏ659N¥Ž¶)-ÌÐņFÒid d/e£¥'¯XÌ,y]GSäA»ò@µ…¶ÚYŠ!5=Ř@$瀠t€N€JPо"¿B¨û2|;#üX^Ê&d°±ÿcŸšò óF¼ó‰-¾rcäÍ]½Ãd¦3¦U" \,ŠU=Sy¡:ÏWe>¤^þåùg)¿·ÊÝ)Öj13OÆòÙ\–èʸhd‘‹„"\>ÆÖû—ûOÜåöiΛ 04Š,í¾º±tØÃ* Ó7xx[¬’OšaÀcôÐÓ8Ši_­í½åå ³3q71g¦}®1í½n-ÄÜÞø¢¦ç’– aóâ@^Øü_ßå½[RA_(ËÙ¢cÃŒÉæH¹²ÏrÙ!ÿ4Ë\—nh{ æ·9 †fa0§`Ë„'¬´ý~߯ä+âäñ—9ßáËg£¡Lf¬vŠ%—Å—{PÜä‰×ß­A,fô&füX…##¨£±oÍ¢‡‰R´5 ã¥A¼l¥ô[Ù ‡ãüvÕ?ë ä endstream endobj 555 0 obj <> stream xÚ]PÁjÃ0 ½û+tì#q`cé9tK»uGÇV2ÃbÅ9äﻡ‡$ÐÓ{’ž²ªÙ7ÖÈÞÉ©ôÆjÂÉͤ:Œe¼mTت”Õ(=˪ƒôorÄUýõýylî«Ãë…ççSÍŸ@c¥œPlu³o—)àØØÞ ûX'Nؽh×á]ÄŽ¤‘Œ`w®Ú„´³÷¿8¢ ³²Lãøõ&å4N^*$id"ÏKu]2´ú_oSt½ú‘ÄÄãóÊ, ÎwC£*ú»ÙS3Ѻ7=!9ŠËÅÛŸ¼óQ•âÏ me endstream endobj 557 0 obj <> stream xÚUoHqÇïôv;m[)ŽiÛ™TJ2ç|aNrdIY™a Ý¶Ó ·Ý¼®K"³Òy¿SÊ2$™lÒ}QoB+ˆ^ö¢^I‘/ŠÞýßÍß’nHV/žïóåçóüÁ1‚Àp7<ÓÝy¢u¿»íPW#[©‹Ò?#´n)=£Sm˜ÊàjYŽº;Wµ¥†Û ²ºg{Vwíгj’ó¼£pÜ`)¯uÝ_zâX/äzD1²e=â– |ÑPˆ|؈F‚¬äpÔÚ§›HB ×/2ÞJ¦¦¾¾®Šq:õÌÁ'¼l˜icE?—mõ²A¦ƒ÷8Qb*ýÚ(Wuu,³³¡¨z›*«˜X@ô3§¸(' r>¦…‹Ìq6Ä1›ÇÚ7“›EDN`Úx'„µ»ˆ˜ kĺ4;†Çñq\Æt9ŽX+6¥}hL›Ö Åsé/ \-‚†\UÉt›Á»{°¶À™iE³Ô¼¬Ö!õ!ª µ´Ê4ëûyÁú‚\P””- ±ü…¤lXÌIE™·YY› λŸžýä{[k”Ú¬OÉJÄz”ŒÈr¿M#T±ŠÚaÒSˆVÕ9š|ÿgŸ":gþw–êÒhì‚ç‘i8KC€ù”VÿÛ uò¡cˆ‘e I‘b¯:Wö>hH8“2Ѻ$½_£‰o+8M|×¼ák@úÊË#}hp´²Tæ+©ÞT?OÝš˜7JÀ˜¼6éI«H¸|¼t{üÙÕµ‹o»“C/Ï-º¨$‰ŒpQG#)YŽ_—ãàVS¿üÅ™»™W.ƒQ — ß³VS,AÒHJè—ó—·=œ2´0Zó ‰7äÁE¿¦Ã$„ endstream endobj 559 0 obj <> stream xÚcd`aa`ddäõðpóÒvö Ž´ Øæþó—aYøs>놲Œ?ä˜~È3ÿg‘{èÅòŸ‡I–á» ˆüÂ"?€Hu Á˜,ÄÀÊÈÈÁ_Ó8!5'575¯ÄÀÀXÏÀÀÈ9¿ ²(3=£DA#YSÁÐÒÒ\GÁÈÀÀRÁ17µ(391OÁ7±$#57±ÈÉQÎOÎL-©TаÉ())°Ò×///×KÌ-ÖË/J·ÓÔQ(Ï,ÉPJ-N-*KMQpËÏ+QðKÌMUûAL:çç”–¤)øæ§¤åÇh$Ú˜YÒtðýŒðÞù½„Ÿìbþqó{¹èì…Ý‹•vWËÿ b›ñ]þ;Ç×ï:Ýß-Ùà¿mØ~{üVý­ðÛé·ówµßòßÝå¿Û É[²ýÖéþÍñµî»<_ñâŸö Ø~ËMg—ãbž¦úŸ‡sW÷N®Ü;çòð1ï÷‡"€fŠ endstream endobj 561 0 obj <> stream xÚMmHSaÇŸ;ï¶'/ERn—>„+ÙÖBde…-%# H[VÌyÛ&î¥ykMC·™:w®kÚ6 3M4,¡`–Adô©o~ê“Їè¹ríe“9çüàœçÿ?¢iDQT~c]£Ù\ÈXo2²ƒãîß %tÇÆ©P‚„RJPJUް‡V®¥ÿ($¥¡_;³üY˜å÷¢,d ¹¿ I) ÞÅÙ6Öź9îˆF§Ó=Þ€ÏiwpL™MÍ6*˽Ng`ª]¬Ïi³º™z+ç`]V.Ó´1&ÍÉr¦¬ÊÁqÞ£Z­ßï×X]íÏ~B]Îøœƒi`ÛYßM¶…©õ¸9æ¼ÕÅ2[?h¶hô¸¼78ÖÇÔ{ZXŸ!J¢G×(Dõ£&tÑD!9Ð&"ÕÓ$”Mjm1GxGÅãðpòT›FY’D¤D ˜èeÿ7b…L<-*3Q)#Œ¸œR‘Šm{½LÔC¤!R„ „¤›š ÍÓ¹þ9‡¼¾Ã{x4?71>7ö*–âï¤ðhº”jP7E«°˜Gîºý}áh/ôâîdôžr5òÚ–l Ã8°h‘C XVío=¢)À£ M…ø>•v¨íÍ™È Â&å0 ËÑDhÅ2o#x>Áâ6O¶©žÈÞbþéìÇñw†ðHˆïQÖÄ.½- $2·ža’Q|Ë5 3烀»CÐLFãªo½OÌÃÞXwÆ—‹E7XøpҴܺÒ)âV¨…«X<#‡ Àµºü®ÎË‘`´ ˆ»’0¢\‡õ%þ+.hŸÚ89)KRre.]9¡Ø1¬ÈåyéÜt^z\¡ÈT>YÛý¤!þ endstream endobj 499 0 obj <> stream xÚÝ[YS9~Ÿ_QokÇ„»uŽà`ÀÆm½Ð¶;Ö´w½ÿ~¿L©Î®fÊ6f'*ºJ%¥R©OyI*èB&ºÂ¹Â YH£ \!-žQJœ~ ÛÍìjÁ¦B ×W ¼ß¾ƒTqþüùOàPÑß‚â+Ñ×%wüm~‰Nž_ åmzb¦é©Kf`ì¹üSG°Ø/eG°ÀýÇkWW׋[¶n¼'9 £Ê0Íà|™ƒÌÁ¬àsð÷@;¸„nÌ(GŸî.fÒUÜl¬¹™†0ù™¸gYWqs2wwIãbzúÙ$tdzËùtýúÛ;¢sì Tfºq3›.®ožìOggÅ¿ç‹ÅGŒss3{_|™^üÃ=Þ\_~½˜Ý<¹ü×üËåûÏߊߟ(s×*üþôib2¿¾Úœ.fO6ÿ®àŒax&+døYè¿ ñ·§i¼—_fWkDüŽoÏç<«ƒëËÙøÍíìå×ŧù&ùbú iòz•Õ䙹‚‘¨pdp6¦‹é§ëi¤of &MüfÖQÖ¹¼²ÉåM”m­ÄÌfëêâúr~õa¼9ÿ~†å‚B½ó†8'â@=Ù¤œô#xùîýü§wÖÂÝX~õåµéò.Ô(´êâ’‘*x§Gä”ò[4#’¿ìQ÷LtýcYEó4!0båˆpd)••µÌÝæ1ƒs˜Mj«© “W#„E%Ñj„©ªq‰åÂ(Þ 0PhQü.ø)rkómõ唫fã,I…Ï3u˜'K#Ëê„Ë#S/3²½ü x$~&N+…´ xÆ:Õ)¥˜£±´– Z–9•è£ÀHZ“ e‹33×X+¤|oÉ’Äåó.„õºU,ý¶iò³5‚oŽ 5t‰´7ZÖ‰tY'‡Z—•÷ŒéÎÚç¹.·0ßT¦~CªÁ£ä(ª’·„] »R¤¯É2[³d/H)±ÂD§“ŽK¢H½‘¬!r¹=ו֧[a’y ~Hvª¡m=õZØv]baØhše-ôŠ"ÔjU=é´ y‰*êD¡#™§fG‘@o¶&±S9ÝM6]øtÕo®Ol÷"â†5bu§F·Vÿ^*Ç>H<ðµšk©[MmU©XFÇé°ÒË¿´Œ´ð”v7~<Š·+úG}‚ ÐÀÀ~:IZ›}wdLvîØ?& Y"cíCjNÁuÕIŒ{!A€Mt)dä2´FÚÊ<…T›¦”Üqù-aîUQ& ã5i½å»ñ½”(M.Q¥;Nà[Gü` NÙ{ÁN37ÚW÷\ÙR›elD~~ï½³`&¢û1²WæNÈSÈÀÆ šsÉÉ3çá¼ѾÈù¼ŽÞfm$OÝÅ`§!êggù CzÒk~JrÚh2þ¤ªœz®tO5‘!â~mjGæErSSq[šj*§;k"ö[ZVû†?Û•tžlúÕoZ ©ëÒ{]›’© }Yeº2í*Ó'¶ÍíºìëùbÃËËéD ÇY&ÿãóRKžÔ£D9†‘ÊyIa2(J•Hk`Œ${è®–œ^DN(ñ"5Ô9XF$M²Ž–[ ~)iΩ›ªò*RÊ¥Srkœ­&mh$,)~ÑHØî‘cÄÆÇ‰Vªé(aÌÞ³åsØ'%½EJäÀ›0æ¹ä~,¥©d­$cš{Ýi2ø‰NIܳ÷×Ö­bi<ñ€óXÝÊwòûÙrzzŠL÷¹Ó&6f[ ±x„¤ãN/WÎVÉ¥Ò‘šõò;|TsÓ—f£ÁÉç{£ÖÐæ¦œoêw¿{³5Ÿü„á"åÎSL ðŽ6Óiš£¢4†b#ùê*ù¤~1åÞºŒKæœWH ëØ@S…c†]@²Øèl@r‰¯–¦Ñš!¢:C‘5½‡jèš2µ¤Üd˜ë–$d*gZ¹Ú!Tbu|‚(ÊCü¸õý¨'8ñ}”@9Å¥\0+ŒŠŽuš|µÊqFi³"#¾û’žr|Ë>2ïè:#\Êýr&ZË™¶ÐÝMoßfeõÖ{Ø&}yŒ»FkQYQüŸ_‘9¨hs| ª< 󨫎} éUG«éËÙw(ºá$ij+1¢ËsÂæéÓûVß ×&’ h$}tFjGê/¼öÃNòî{Ã7HV(Eù­û¼Ï%ùÔ‡Ž{è Œr¬`Ì>ÌΪÊ&Ϋ“÷íë«Åøèë?ôB5z¼ñqzsxs}qËßéоúȃ^Ôr4[¼nnw?O?ÌÖÏŸ?¯Nðù[1eãuú"ék²´cpçãÓùåâã-I.©¦‹›ù·w#þ¼‘bš/çãíùÍí‚ÄB ïO˲o|AXš‡¬‡Šù³GÉÄÄš‰Tj¼>½qÿƒÍ½ÉÑÚÏGGëgR0ÓÍÙíÅÍüËâú†?·¿[´ ÆÓ/;³ù‡ äQf¼v{AߨH4T~&ñ²»˜~š_¬]}ø4+Äøh1û|Bß1ÇÛŸ¦n •´¢†ï’œgŠÏ:#ò¼@p m{þi†ŒGŠ FúxÓÁ0€¤ìäÉX49:{»¾Éì¥_†Gÿ8<¶_¢ãÀØ€‰šŽãBÕÆ¥%ø@TtÑDÅÔ¨ìîžþz–˜«eTÌc)M/*ÐÑgô‡чeTL•–àw£r|ýæjŸÑŸ^0— '×ÁIʦy5pzñbïdýýî³-;¦ ¿ &{`2¢´*AÚÓ±*߯©)øp˜B¦®ji“¨Q:š¼ÝÚxA‹2éƒÉÝ&Q$Z=“f$L† ê`òMï£bñ,::IÄ:{o[8©Ž÷i‰>ÌÊT×÷H½Â9¾];8Ýó~×ì‡ãâ¾Ï5ÃÔW¸fë²IúS Ž©Ž jÉ?X‹”ni‘2Cmrôzc²†ëqJáÑàq%\:¹&)õ²Í)ÛõØ ùê’»S—dÃÆ^Ÿžn‚ùñnŸ.ŇvE-Cs¡Ïд-uIõèRÇ!µäN耣ä C[{{rvJQá > |ÅV—11ëT̪Ô&]F¦ãq›âÞºêxgðnèÏÁîÁÎÞ­CV–(W0µÜL…Öº‹’én?k¹‡é馺²m#*MNv÷NÙ\{0qåez1qÙË`Û[,ÓÉúšb„¤»ïl)‰k$1o^þúæÅÏg“͵£gô§_?/#38/´[ÝB×ÍÐ~ ÿÚ˜t¶}‚ÄÆv±±Í]T#ÃÛØ:ÙÝ_ÃkÇ»‡+Á ÿphMù–mt\>ɢ㇢s<9ûu c¬ß…Nü3 ÚèôI>xW¨’ ﻳÿÛî«öõËY^xäü·ws LÄår®g;N¸)þ0h¬ª8§§›‡[ëÿÑ«ýUŠäƒ+N}¡ ©ßò¯JÇ÷I>}—∆GÞßÙßùš‘_Îû‚º—âØŠlâÈòì˜þWfIo:n¹)ýàǶíR>ØÈ±ˆõ®átròrƒmõæýð®Ç÷E-²+>Þ2@Ã{Õ¨“¶d¨;Ý]·ml£l#=ÞÙùõ„Á?šôøóh‡~®w»`-ýGX ?‰mT:Ûí¦äÃ@qâPgÖ¨œìžL&Ì{9é öÑPÑ+B-ý×›¡£PßBÅu6ÜMÉ!â£á+$ endstream endobj 586 0 obj <<5cd0e85494d6ca4b1c7df3aba87382f2>]/Size 587/W[1 3 2]/Filter/FlateDecode/Length 1417>> stream xÚ5ÖgL•gÆñç~*CÀÁPDAœ¨ ¸ˆ¢"NêhÝÕVKµ.­VÅYÜ£Ú:Pq‹Uq T´Æ&mÓ&Mš´I5~hÒ&mRM:Ò†Âÿ¾ùòË•ëyÎἜ÷<÷ëœsµµž“—®6­s·[H˜Œ]Ĺç<çš:'òmU}®Û¿ˆÕnØCœ,±=Âj}O}Ø£úc6Á¦Ø 1ƒ1›c(†a8¶À–Ø [cFbFcl‹1Øc±½8ß7v]¸®%ä8ŒÇŽ˜€0“0;cìŠÝ°;öÀÔÿX/쩘†}03°/ö¸Ò>g>çRþÿ½1 ÓQ÷ ÷Ç8‡Š /·÷Èû,õ‹5ƒh–‹ëÐÐ ¦Y).a5Ch ÅuëdÍPšUâR/Z3Œfµ¸Œxk2iÖˆØßš,š÷ÉÃùl™älq™¡¶g{Ö±:\\ÞTëGÒ¯7±Èššâ¦æX3Šf¯9âfæÚêhV‹ÅŒ°f ÍqË®4—f+¯-nm‰õcé·ÑçbŽÇ‰âŠÚÎQ¨ö8Yç¬~¿Ohô Ah>&{èC}¸OÖ'OÈ~¨s6ãQ'¬ž'i°&bê´=EîŒ:aËñ<>iœ&bcêÓE9Ã0[ >«œÁ³xNä…Øµ÷@=…tšôÆ쉽Pçl*¦aLÇ ì‹ýPçûÔÙªsYg±ÎßlÔ9«³UçépÔÙ§ÓSg¥ÎG=Eu‚è¼Ó§M§Õ8:¡t*é$Ò‘:q¦ N,Óqê™:5tRèt˜ƒsQÏ|óùE7!ë ¦gµžê+p1êÉ\„zúé™y7£ž?Ûq–àaÜ‹ð&êý|Ï Þ½zg^³xo༆×ùüä{¨¿Ð‡Xͪ>E×àcñÅíã¾zÉyõÒy"l¬?!ÿN¯·öÏ:=¿RÛˆAŒ!âeÙjsñ"žZ/¶¢þµ­ /aZ}“õƒ5áâeGYn!^neýê¬kZŠ7;Ír+ñ µÜZ¼â*Ëâj9R¼7,G‰wû™åhñªËêß¹æ‰5mÄ{ôÊr[ñžû[ŽïßËíÄ'Û-ÇŠÏ¿»åöâ œm¹ƒøZVZŽ_ë/ëþŠ/ªÂšxñE¿°ÜQ|1?YN_l™å$ìŒ]±;¦`/LÅ>˜ýPŸ´á†Y˜#qŽÁ±8'à$Ì_JÝËÿ©—ØL endstream endobj startxref 209220 %%EOF glpk-5.0/doc/graphs.tex0000644000062000006210000037435513766346220014276 0ustar maomkpasswd%* graphs.tex *% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % The GLPK package is part of the GNU Project released under the aegis % of GNU. % % Copyright (c) 2007-2020 Free Software Foundation, Inc. % % Author: Andrew Makhorin . % % Permission is granted to copy, distribute and/or modify this % document under the terms of the GNU Free Documentation License, % Version 1.3 or any later version published by the Free Software % Foundation. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % To make graphs.pdf from graphs.tex run the following two commands: % latex graphs.tex % dvipdfm -p letter graphs.dvi % Note: You need TeX Live 2010 or later version. \documentclass[11pt]{report} \usepackage{amssymb} \usepackage[dvipdfm,linktocpage,colorlinks,linkcolor=blue, urlcolor=blue]{hyperref} \usepackage{indentfirst} \usepackage{niceframe} \usepackage[all]{xy} % US Letter = 8.5 x 11 in \setlength{\textwidth}{6.5in} \setlength{\textheight}{9in} \setlength{\oddsidemargin}{0in} \setlength{\topmargin}{0in} \setlength{\headheight}{0in} \setlength{\headsep}{0in} %\setlength{\footskip}{0.5in} \setlength{\parindent}{16pt} \setlength{\parskip}{5pt} \setlength{\topsep}{0pt} \setlength{\partopsep}{0pt} %\setlength{\itemsep}{\parskip} %\setlength{\parsep}{0pt} %\setlength{\leftmargini}{\parindent} %\renewcommand{\labelitemi}{---} \newcommand{\Item}[1]{\parbox[t]{\parindent}{#1}} \def\para#1{\noindent{\bf#1}} \def\synopsis{\para{Synopsis}} \def\description{\para{Description}} \def\note{\para{Note}} \def\returns{\para{Returns}} \renewcommand\contentsname{\sf\bfseries Contents} \renewcommand\chaptername{\sf\bfseries Chapter} \renewcommand\appendixname{\sf\bfseries Appendix} \newenvironment{retlist} { \def\arraystretch{1.5} \noindent \begin{tabular}{@{}p{1in}@{}p{5.5in}@{}} } {\end{tabular}} \begin{document} \thispagestyle{empty} \artdecoframe{ \begin{center} \vspace*{1.5in} \begin{huge} \sf\bfseries GNU Linear Programming Kit \end{huge} \vspace{0.5in} \begin{LARGE} \sf Graph and Network Routines \end{LARGE} \vspace{0.5in} \begin{LARGE} \sf for GLPK Version 5.0 \end{LARGE} \vspace{0.5in} \begin{Large} \sf (December 2020) \end{Large} \end{center} \vspace*{3.2in} } \newpage \vspace*{1in} \vfill \noindent The GLPK package is part of the GNU Project released under the aegis of GNU. \noindent Copyright \copyright{} 2007-2020 Free Software Foundation, Inc. \noindent Author: Andrew Makhorin $\langle$mao@gnu.org$\rangle$. \noindent Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newpage {\setlength{\parskip}{0pt}\tableofcontents} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Basic Graph API Routines} \section{Graph program object} In GLPK the base program object used to represent graphs and networks is a directed graph (digraph). Formally, {\it digraph} (or simply, {\it graph}) is a pair $G=(V,A)$, where $V$ is a set of {\it vertices}, and $A$ is a set {\it arcs}.\footnote{$A$ may be a multiset.} Each arc $a\in A$ is an ordered pair of vertices $a=(x,y)$, where $x\in V$ is called {\it tail vertex} of arc $a$, and $y\in V$ is called its {\it head vertex}. Representation of a graph in the program includes three structs defined by typedef in the header \verb|glpk.h|: %\vspace*{-8pt} %\begin{itemize} \Item{---}\verb|glp_graph|, which represents the graph in a whole, \Item{---}\verb|glp_vertex|, which represents a vertex of the graph, and \Item{---}\verb|glp_arc|, which represents an arc of the graph. %\end{itemize} %\vspace*{-8pt} All these three structs are ``semi-opaque'', i.e. the application program can directly access their fields through pointers, however, changing the fields directly is not allowed --- all changes should be performed only with appropriate GLPK API routines. \newenvironment{comment} {\addtolength{\leftskip}{16pt}\noindent} {\par\addtolength{\leftskip}{-16pt}} \subsection{Structure glp\_graph} %\para{\bf glp\_graph.} The struct \verb|glp_graph| has the following fields available to the application program. \noindent \verb|char *name;| \begin{comment}Symbolic name assigned to the graph. It is a pointer to a null terminated character string of length from 1 to 255 characters. If no name is assigned to the graph, this field contains \verb|NULL|. \end{comment} \noindent \verb|int nv;| \begin{comment}The number of vertices in the graph, $nv\geq 0$. \end{comment} \noindent \verb|int na;| \begin{comment}The number of arcs in the graph, $na\geq 0$. \end{comment} \newpage \noindent \verb|glp_vertex **v;| \begin{comment}Pointer to an array containing the list of vertices. Element $v[0]$ is not used. Element $v[i]$, $1\leq i\leq nv$, is a pointer to $i$-th vertex of the graph. Note that on adding new vertices to the graph the field $v$ may be altered due to reallocation. However, pointers $v[i]$ are not changed while corresponding vertices exist in the graph. \end{comment} \noindent \verb|int v_size;| \begin{comment}Size of vertex data blocks, in bytes, $0\leq v\_size\leq 256$. (See also the field \verb|data| in the struct \verb|glp_vertex|.) \end{comment} \noindent \verb|int a_size;| \begin{comment}Size of arc data blocks, in bytes, $0\leq v\_size\leq 256$. (See also the field \verb|data| in the struct \verb|glp_arc|.) \end{comment} \subsection{Structure glp\_vertex} %\para{\bf glp\_vertex.} The struct \verb|glp_vertex| has the following fields available to the application program. \noindent \verb|int i;| \begin{comment}Ordinal number of the vertex, $1\leq i\leq nv$. Note that element $v[i]$ in the struct \verb|glp_graph| points to the vertex, whose ordinal number is $i$. \end{comment} \noindent \verb|char *name;| \begin{comment}Symbolic name assigned to the vertex. It is a pointer to a null terminated character string of length from 1 to 255 characters. If no name is assigned to the vertex, this field contains \verb|NULL|. \end{comment} \noindent \verb|void *data;| \begin{comment}Pointer to a data block associated with the vertex. This data block is automatically allocated on creating a new vertex and freed on deleting the vertex. If $v\_size=0$, the block is not allocated, and this field contains \verb|NULL|. \end{comment} \noindent \verb|void *temp;| \begin{comment}Working pointer, which may be used freely for any purposes. The application program can change this field directly. \end{comment} \noindent \verb|glp_arc *in;| \begin{comment}Pointer to the (unordered) list of incoming arcs. If the vertex has no incoming arcs, this field contains \verb|NULL|. \end{comment} \noindent \verb|glp_arc *out;| \begin{comment}Pointer to the (unordered) list of outgoing arcs. If the vertex has no outgoing arcs, this field contains \verb|NULL|. \end{comment} \subsection{Structure glp\_arc} %\para{\bf glp\_arc.} The struct \verb|glp_arc| has the following fields available to the application program. \noindent \verb|glp_vertex *tail;| \begin{comment}Pointer to a vertex, which is tail endpoint of the arc. \end{comment} \newpage \noindent \verb|glp_vertex *head;| \begin{comment}Pointer to a vertex, which is head endpoint of the arc. \end{comment} %\newpage \noindent \verb|void *data;| \begin{comment}Pointer to a data block associated with the arc. This data block is automatically allocated on creating a new arc and freed on deleting the arc. If $v\_size=0$, the block is not allocated, and this field contains \verb|NULL|. \end{comment} \noindent \verb|void *temp;| \begin{comment}Working pointer, which may be used freely for any purposes. The application program can change this field directly. \end{comment} \noindent \verb|glp_arc *t_next;| \begin{comment}Pointer to another arc, which has the same tail endpoint as this one. \verb|NULL| in this field indicates the end of the list of outgoing arcs. \end{comment} \noindent \verb|glp_arc *h_next;| \begin{comment}Pointer to another arc, which has the same head endpoint as this one. \verb|NULL| in this field indicates the end of the list of incoming arcs. \end{comment} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newpage \setlength{\parskip}{4.6pt} \section{Graph creating and modifying routines} \subsection{glp\_create\_graph --- create graph} \synopsis \begin{verbatim} glp_graph *glp_create_graph(int v_size, int a_size); \end{verbatim} \description The routine \verb|glp_create_graph| creates a new graph, which initially is empty, i.e. has no vertices and arcs. The parameter \verb|v_size| specifies the size of vertex data blocks, in bytes, $0\leq v\_size\leq 256$. The parameter \verb|a_size| specifies the size of arc data blocks, in bytes, $0\leq a\_size\leq 256$. \returns The routine returns a pointer to the graph object created. \subsection{glp\_set\_graph\_name --- assign (change) graph name} \synopsis \begin{verbatim} void glp_set_graph_name(glp_graph *G, const char *name); \end{verbatim} \description The routine \verb|glp_set_graph_name| assigns a symbolic name specified by the character string \verb|name| (1 to 255 chars) to the graph. If the parameter \verb|name| is \verb|NULL| or an empty string, the routine erases the existing symbolic name of the graph. \subsection{glp\_add\_vertices --- add new vertices to graph} \synopsis \begin{verbatim} int glp_add_vertices(glp_graph *G, int nadd); \end{verbatim} \description The routine \verb|glp_add_vertices| adds \verb|nadd| vertices to the specified graph. New vertices are always added to the end of the vertex list, so ordinal numbers of existing vertices remain unchanged. Note that this operation may change the field \verb|v| in the struct \verb|glp_graph| (pointer to the vertex array) due to reallocation. Being added each new vertex is isolated, i.e. has no incident arcs. If the size of vertex data blocks specified on creating the graph is non-zero, the routine also allocates a memory block of that size for each new vertex added, fills it by binary zeros, and stores a pointer to it in the field \verb|data| of the struct \verb|glp_vertex|. Otherwise, if the block size is zero, the field \verb|data| is set to \verb|NULL|. \returns The routine \verb|glp_add_vertices| returns the ordinal number of the first new vertex added to the graph. \setlength{\parskip}{5pt} \newpage \subsection{glp\_set\_vertex\_name --- assign (change) vertex name} \synopsis \begin{verbatim} void glp_set_vertex_name(glp_graph *G, int i, const char *name); \end{verbatim} \description The routine \verb|glp_set_vertex_name| assigns a given symbolic name (1 up to 255 characters) to \verb|i|-th vertex of the specified graph. If the parameter \verb|name| is \verb|NULL| or empty string, the routine erases an existing name of \verb|i|-th vertex. \subsection{glp\_add\_arc --- add new arc to graph} \synopsis \begin{verbatim} glp_arc *glp_add_arc(glp_graph *G, int i, int j); \end{verbatim} \description The routine \verb|glp_add_arc| adds one new arc to the specified graph. The parameters \verb|i| and \verb|j| specify the ordinal numbers of, resp., tail and head endpoints (vertices) of the arc. Note that self-loops and multiple arcs are allowed. If the size of arc data blocks specified on creating the graph is non-zero, the routine also allocates a memory block of that size, fills it by binary zeros, and stores a pointer to it in the field \verb|data| of the struct \verb|glp_arc|. Otherwise, if the block size is zero, the field \verb|data| is set to \verb|NULL|. \subsection{glp\_del\_vertices --- delete vertices from graph} \synopsis \begin{verbatim} void glp_del_vertices(glp_graph *G, int ndel, const int num[]); \end{verbatim} \description The routine \verb|glp_del_vertices| deletes vertices along with all incident arcs from the specified graph. Ordinal numbers of vertices to be deleted should be placed in locations \verb|num[1]|, \dots, \verb|num[ndel]|, \verb|ndel| $>0$. Note that deleting vertices involves changing ordinal numbers of other vertices remaining in the graph. New ordinal numbers of the remaining vertices are assigned under the assumption that the original order of vertices is not changed. %\newpage \subsection{glp\_del\_arc --- delete arc from graph} \synopsis \begin{verbatim} void glp_del_arc(glp_graph *G, glp_arc *a); \end{verbatim} \description The routine \verb|glp_del_arc| deletes an arc from the specified graph. The arc to be deleted must exist. \subsection{glp\_erase\_graph --- erase graph content} \synopsis \begin{verbatim} void glp_erase_graph(glp_graph *G, int v_size, int a_size); \end{verbatim} \description The routine \verb|glp_erase_graph| erases the content of the specified graph. The effect of this operation is the same as if the graph would be deleted with the routine \verb|glp_delete_graph| and then created anew with the routine \verb|glp_create_graph|, with exception that the pointer to the graph remains valid. The parameters \verb|v_size| and \verb|a_size| have the same meaning as for \verb|glp_create_graph|. \subsection{glp\_delete\_graph --- delete graph} \synopsis \begin{verbatim} void glp_delete_graph(glp_graph *G); \end{verbatim} \description The routine \verb|glp_delete_graph| deletes the specified graph and frees all the memory allocated to this program object. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newpage \section{Graph searching routines} \subsection{glp\_create\_v\_index --- create vertex name index} \synopsis \begin{verbatim} void glp_create_v_index(glp_graph *G); \end{verbatim} \description The routine \verb|glp_create_v_index| creates the name index for the specified graph. The name index is an auxiliary data structure, which is intended to quickly (i.e. for logarithmic time) find vertices by their names. This routine can be called at any time. If the name index already exists, the routine does nothing. \subsection{glp\_find\_vertex --- find vertex by its name} \synopsis \begin{verbatim} int glp_find_vertex(glp_graph *G, const char *name); \end{verbatim} \returns The routine \verb|glp_find_vertex| returns the ordinal number of a vertex, which is assigned (by the routine \verb|glp_set_vertex_name|) the specified symbolic \verb|name|. If no such vertex exists, the routine returns 0. \subsection{glp\_delete\_v\_index --- delete vertex name index} \synopsis \begin{verbatim} void glp_delete_v_index(glp_graph *G); \end{verbatim} \description The routine \verb|glp_delete_v_index| deletes the name index previously created by the routine \verb|glp_create_v_index| and frees the memory allocated to this auxiliary data structure. This routine can be called at any time. If the name index does not exist, the routine does nothing. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newpage \section{Graph reading/writing routines} \subsection{glp\_read\_graph --- read graph from text file} \synopsis \begin{verbatim} int glp_read_graph(glp_graph *G, const char *fname); \end{verbatim} \description The routine \verb|glp_read_graph| reads a graph from a text file, whose name is specified by the parameter \verb|fname|. It is equivalent to \begin{verbatim} glp_read_ccdata(G, -1, fname); \end{verbatim} Note that before reading data the current content of the graph object is completely erased with the routine \verb|glp_erase_graph|. \returns If the operation was successful, the routine returns zero. Otherwise it prints an error message and returns non-zero. \subsection{glp\_write\_graph --- write graph to text file} \synopsis \begin{verbatim} int glp_write_graph(glp_graph *G, const char *fname); \end{verbatim} \description The routine \verb|glp_write_graph| writes the graph to a text file, whose name is specified by the parameter \verb|fname|. It is equivalent to \begin{verbatim} glp_write_ccdata(G, -1, fname); \end{verbatim} \returns If the operation was successful, the routine returns zero. Otherwise it prints an error message and returns non-zero. \subsection{glp\_read\_ccdata --- read graph from text file in DIMACS clique/coloring\\format} \synopsis \begin{verbatim} int glp_read_ccdata(glp_graph *G, int v_wgt, const char *fname); \end{verbatim} \description The routine {\tt glp\_read\_ccdata} reads a graph from a text file in DIMACS clique/coloring format. (Though this format is originally designed to represent data for the minimal vertex coloring and maximal clique problems, it may be used to represent general undirected and directed graphs, because the routine allows reading self-loops and multiple edges/arcs keeping the order of vertices specified for each edge/arc of the graph.) \newpage The parameter {\tt G} specifies the graph object to be read in. Note that before reading data the current content of the graph object is completely erased with the routine {\tt glp\_erase\_graph}. The parameter {\tt v\_wgt} specifies an offset of the field of type {\tt double} in the vertex data block, to which the routine stores the vertex weight. If {\tt v\_wgt} $<0$, the vertex weights are not stored. The character string {\tt fname} specifies the name of a text file to be read in. (If the file name ends with the suffix `\verb|.gz|', the file is assumed to be compressed, in which case the routine decompresses it ``on the fly''.) \returns If the operation was successful, the routine returns zero. Otherwise, it prints an error message and returns non-zero. \para{DIMACS clique/coloring format\footnote{This material is based on the paper ``Clique and Coloring Problems Graph Format'', which is publicly available at \url{http://dimacs.rutgers.edu/Challenges}.}} The DIMACS input file is a plain ASCII text file. It contains {\it lines} of several types described below. A line is terminated with an end-of-line character. Fields in each line are separated by at least one blank space. Each line begins with a one-character designator to identify the line type. Note that DIMACS requires all numerical quantities to be integers in the range $[-2^{31},2^{31}-1]$ while GLPK allows the quantities to be floating-point numbers. \para{Comment lines.} Comment lines give human-readable information about the file and are ignored by programs. Comment lines can appear anywhere in the file. Each comment line begins with a lower-case character \verb|c|. \begin{verbatim} c This is a comment line \end{verbatim} \para{Problem line.} There is one problem line per data file. The problem line must appear before any node or edge descriptor lines. It has the following format: \begin{verbatim} p edge NODES EDGES \end{verbatim} \noindent The lower-case letter \verb|p| signifies that this is a problem line. The four-character problem designator \verb|edge| identifies the file as containing data for the minimal vertex coloring or maximal clique problem. The \verb|NODES| field contains an integer value specifying the number of vertices in the graph. The \verb|EDGES| field contains an integer value specifying the number of edges (arcs) in the graph. \para{Vertex descriptors.} These lines give the weight assigned to a vertex of the graph. There is one vertex descriptor line for each vertex, with the following format. Vertices without a descriptor take on a default value of 1. \begin{verbatim} n ID VALUE \end{verbatim} \noindent The lower-case character \verb|n| signifies that this is a vertex descriptor line. The \verb|ID| field gives a vertex identification number, an integer between 1 and $n$, where $n$ is the number of vertices in the graph. The \verb|VALUE| field gives a vertex weight, which can either positive or negative (or zero). \para{Edge descriptors.} There is one edge descriptor line for each edge (arc) of the graph, each with the following format: \begin{verbatim} e I J \end{verbatim} \noindent The lower-case character \verb|e| signifies that this is an edge descriptor line. For an edge (arc) $(i,j)$ the fields \verb|I| and \verb|J| specify its endpoints. \newpage \para{Example.} The following undirected graph \bigskip \noindent\hfil \xymatrix %@C=32pt {&{v_1}\ar@{-}[ldd]\ar@{-}[dd]\ar@{-}[rd]\ar@{-}[rr]&&{v_2}\ar@{-}[ld] \ar@{-}[dd]\ar@{-}[rdd]&\\ &&{v_7}\ar@{-}[ld]\ar@{-}[rd]&&\\ {v_6}\ar@{-}[r]\ar@{-}[rdd]&{v_{10}}\ar@{-}[rr]\ar@{-}[rd]\ar@{-}[dd]&& {v_8}\ar@{-}[ld]\ar@{-}[dd]\ar@{-}[r]&{v_3}\ar@{-}[ldd]\\ &&{v_9}\ar@{-}[ld]\ar@{-}[rd]&&\\ &{v_5}\ar@{-}[rr]&&{v_4}&\\ } \bigskip \noindent might be coded in DIMACS clique/coloring format as follows. \begin{footnotesize} \begin{verbatim} c sample.col c c This is an example of the vertex coloring problem data c in DIMACS format. c p edge 10 21 c e 1 2 e 1 6 e 1 7 e 1 10 e 2 3 e 2 7 e 2 8 e 3 4 e 3 8 e 4 5 e 4 8 e 4 9 e 5 6 e 5 9 e 5 10 e 6 10 e 7 8 e 7 10 e 8 9 e 8 10 e 9 10 c c eof \end{verbatim} \end{footnotesize} \newpage \subsection{glp\_write\_ccdata --- write graph to text file in DIMACS clique/coloring\\format} \synopsis \begin{verbatim} int glp_write_ccdata(glp_graph *G, int v_wgt, const char *fname); \end{verbatim} \description The routine {\tt glp\_write\_ccdata} writes the graph object specified by the parameter {\tt G} to a text file in DIMACS clique/coloring format. (Though this format is originally designed to represent data for the minimal vertex coloring and maximal clique problems, it may be used to represent general undirected and directed graphs, because the routine allows writing self-loops and multiple edges/arcs keeping the order of vertices specified for each edge/arc of the graph.) The parameter {\tt v\_wgt} specifies an offset of the field of type {\tt double} in the vertex data block, which contains the vertex weight. If {\tt v\_wgt} $<0$, it is assumed that the weight of each vertex is 1. The character string {\tt fname} specifies a name of the text file to be written out. (If the file name ends with suffix `\verb|.gz|', the file is assumed to be compressed, in which case the routine performs automatic compression on writing it.) \returns If the operation was successful, the routine returns zero. Otherwise, it prints an error message and returns non-zero. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newpage \section{Graph analysis routines} \subsection{glp\_weak\_comp --- find all weakly connected components of graph} \synopsis \begin{verbatim} int glp_weak_comp(glp_graph *G, int v_num); \end{verbatim} \description The routine \verb|glp_weak_comp| finds all weakly connected components of the specified graph. The parameter \verb|v_num| specifies an offset of the field of type \verb|int| in the vertex data block, to which the routine stores the number of a weakly connected component containing that vertex. If \verb|v_num| $<0$, no component numbers are stored. The components are numbered in arbitrary order from 1 to \verb|nc|, where \verb|nc| is the total number of components found, $0\leq$ \verb|nc| $\leq|V|$. \returns The routine returns \verb|nc|, the total number of components found. \subsection{glp\_strong\_comp --- find all strongly connected components of graph} \synopsis \begin{verbatim} int glp_strong_comp(glp_graph *G, int v_num); \end{verbatim} \description The routine \verb|glp_strong_comp| finds all strongly connected components of the specified graph. The parameter \verb|v_num| specifies an offset of the field of type \verb|int| in the vertex data block, to which the routine stores the number of a strongly connected component containing that vertex. If \verb|v_num| $<0$, no component numbers are stored. The components are numbered in arbitrary order from 1 to \verb|nc|, where \verb|nc| is the total number of components found, $0\leq$ \verb|nc| $\leq|V|$. However, the component numbering has the property that for every arc $(i\rightarrow j)$ in the graph the condition $num(i)\geq num(j)$ holds. \returns The routine returns \verb|nc|, the total number of components found. \para{References} I.~S.~Duff, J.~K.~Reid, Algorithm 529: Permutations to block triangular form, ACM Trans. on Math. Softw. 4 (1978), 189-92. \newpage \para{Example} The following program reads a graph from a plain text file `\verb|graph.txt|' and finds all its strongly connected components. \begin{footnotesize} \begin{verbatim} #include #include #include #include typedef struct { int num; } v_data; #define vertex(v) ((v_data *)((v)->data)) int main(void) { glp_graph *G; int i, nc; G = glp_create_graph(sizeof(v_data), 0); glp_read_graph(G, "graph.txt"); nc = glp_strong_comp(G, offsetof(v_data, num)); printf("nc = %d\n", nc); for (i = 1; i <= G->nv; i++) printf("num[%d] = %d\n", i, vertex(G->v[i])->num); glp_delete_graph(G); return 0; } \end{verbatim} \end{footnotesize} \noindent If the file `\verb|graph.txt|' contains the following graph: \medskip \noindent\hfil \xymatrix {1\ar[r]&2\ar[r]&3\ar[r]\ar[dd]&4\ar[dd]\\ 5\ar[u]&6\ar[l]\\ 7\ar[u]&&8\ar[lu]\ar[ll]\ar[r]&9\ar[r]&10\ar[r]\ar[d]&11\ar[d]\\ 12\ar[u]\ar[rru]\ar@/_/[rr]&&13\ar[ll]\ar[u]\ar[rr]&&14\ar[lu]&15\ar[l] \\ } \medskip\medskip \noindent the program output may look like follows: \begin{footnotesize} \begin{verbatim} Reading graph from `graph.txt'... Graph has 15 vertices and 30 arcs 31 lines were read nc = 4 num[1] = 3 num[2] = 3 num[3] = 3 num[4] = 2 num[5] = 3 num[6] = 3 num[7] = 3 num[8] = 3 num[9] = 1 num[10] = 1 num[11] = 1 num[12] = 4 num[13] = 4 num[14] = 1 num[15] = 1 \end{verbatim} \end{footnotesize} \subsection{glp\_top\_sort --- topological sorting of acyclic digraph} \synopsis \begin{verbatim} int glp_top_sort(glp_graph *G, int v_num); \end{verbatim} \description The routine \verb|glp_top_sort| performs topological sorting of vertices of the specified acyclic digraph. The parameter \verb|v_num| specifies an offset of the field of type \verb|int| in the vertex data block, to which the routine stores the vertex number assigned. If \verb|v_num| $<0$, vertex numbers are not stored. The vertices are numbered from 1 to $n$, where $n$ is the total number of vertices in the graph. The vertex numbering has the property that for every arc $(i\rightarrow j)$ in the graph the condition $num(i) #include #include #include typedef struct { int num; } v_data; #define vertex(v) ((v_data *)((v)->data)) int main(void) { glp_graph *G; int i, cnt; G = glp_create_graph(sizeof(v_data), 0); glp_read_graph(G, "graph.txt"); cnt = glp_top_sort(G, offsetof(v_data, num)); printf("cnt = %d\n", cnt); for (i = 1; i <= G->nv; i++) printf("num[%d] = %d\n", i, vertex(G->v[i])->num); glp_delete_graph(G); return 0; } \end{verbatim} \end{footnotesize} \newpage \noindent If the file `\verb|graph.txt|' contains the following graph: \medskip \noindent\hfil \xymatrix @=20pt { 1\ar[rrr]&&&2\ar[r]\ar[rddd]&3\ar[rd]&&&&\\ &&&4\ar[ru]&&5\ar[r]&6\ar[rd]\ar[dd]&&\\ 7\ar[r]&8\ar[r]&9\ar[ruu]\ar[ru]\ar[r]\ar[rd]&10\ar[rr]\ar[rru]&& 11\ar[ru]&&12\ar[r]&13\\ &&&14\ar[r]&15\ar[rrru]\ar[rr]&&16\ar[rru]\ar[rr]&&17\\ } \medskip\medskip \noindent the program output may look like follows: \begin{footnotesize} \begin{verbatim} Reading graph from `graph.txt'... Graph has 17 vertices and 23 arcs 24 lines were read cnt = 0 num[1] = 8 num[2] = 9 num[3] = 10 num[4] = 4 num[5] = 11 num[6] = 12 num[7] = 1 num[8] = 2 num[9] = 3 num[10] = 5 num[11] = 6 num[12] = 14 num[13] = 16 num[14] = 7 num[15] = 13 num[16] = 15 num[17] = 17 \end{verbatim} \end{footnotesize} \noindent The output corresponds to the following vertex numbering: \medskip \noindent\hfil \xymatrix @=20pt { 8\ar[rrr]&&&9\ar[r]\ar[rddd]&10\ar[rd]&&&&\\ &&&4\ar[ru]&&11\ar[r]&12\ar[rd]\ar[dd]&&\\ 1\ar[r]&2\ar[r]&3\ar[ruu]\ar[ru]\ar[r]\ar[rd]&5\ar[rr]\ar[rru]&& 6\ar[ru]&&14\ar[r]&16\\ &&&7\ar[r]&13\ar[rrru]\ar[rr]&&15\ar[rru]\ar[rr]&&17\\ } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Network optimization API routines} \section{Minimum cost flow problem} \subsection{Background} The {\it minimum cost flow problem} (MCFP) is stated as follows. Let there be given a directed graph (flow network) $G=(V,A)$, where $V$ is a set of vertices (nodes), and $A\subseteq V\times V$ is a set of arcs. Let for each node $i\in V$ there be given a quantity $b_i$ having the following meaning: if $b_i>0$, then $|b_i|$ is a {\it supply} at node $i$, which shows how many flow units are {\it generated} at node $i$ (or, equivalently, entering the network through node $i$ from outside); if $b_i<0$, then $|b_i|$ is a {\it demand} at node $i$, which shows how many flow units are {\it lost} at node $i$ (or, equivalently, leaving the network through node $i$ to outside); if $b_i=0$, then $i$ is a {\it transshipment} node, at which the flow is conserved, i.e. neither generated nor lost. Let also for each arc $a=(i,j)\in A$ there be given the following three quantities: $l_{ij}$, a (non-negative) lower bound to the flow through arc $(i,j)$; $u_{ij}$, an upper bound to the flow through arc $(i,j)$, which is the {\it arc capacity}; $c_{ij}$, a per-unit cost of the flow through arc $(i,j)$. The problem is to find flows $x_{ij}$ through every arc of the network, which satisfy the specified bounds and the conservation constraints at all nodes, and minimize the total flow cost. Here the conservation constraint at a node means that the total flow entering this node through its incoming arcs plus the supply at this node must be equal to the total flow leaving this node through its outgoing arcs plus the demand at this node. An example of the minimum cost flow problem is shown on Fig.~1. \newpage \noindent\hfil \xymatrix @C=48pt {_{20}\ar@{~>}[d]& v_2\ar[r]|{_{0,10,\$2}}\ar[dd]|{_{0,9,\$3}}& v_3\ar[dd]|{_{2,12,\$1}}\ar[r]|{_{0,18,\$0}}& v_8\ar[rd]|{_{0,20,\$9}}&\\ v_1\ar[ru]|{_{0,14,\$0}}\ar[rd]|{_{0,23,\$0}}&&& v_6\ar[d]|{_{0,7,\$0}}\ar[u]|{_{4,8,\$0}}& v_9\ar@{~>}[d]\\ &v_4\ar[r]|{_{0,26,\$0}}& v_5\ar[luu]|{_{0,11,\$1}}\ar[ru]|{_{0,25,\$5}}\ar[r]|{_{0,4,\$7}}& v_7\ar[ru]|{_{0,15,\$3}}&_{20}\\ } \noindent\hfil \begin{tabular}{ccc} \xymatrix @C=48pt{v_i\ar[r]|{\ l,u,\$c\ }&v_j\\}& \xymatrix{\hbox{\footnotesize supply}\ar@{~>}[r]&v_i\\}& \xymatrix{v_i\ar@{~>}[r]&\hbox{\footnotesize demand}\\}\\ \end{tabular} \noindent\hfil Fig.~1. An example of the minimum cost flow problem. \medskip The minimum cost flow problem can be naturally formulated as the following LP problem: \noindent \hspace{1in}minimize $$z=\sum_{(i,j)\in A}c_{ij}x_{ij}\eqno(1)$$ \hspace{1in}subject to $$\sum_{(i,j)\in A}x_{ij}-\sum_{(j,i)\in A}x_{ji}=b_i\ \ \ \hbox {for all}\ i\in V\eqno(2)$$ $$l_{ij}\leq x_{ij}\leq u_{ij}\ \ \ \hbox{for all}\ (i,j)\in A \eqno(3)$$ \subsection{glp\_read\_mincost --- read minimum cost flow problem data in DIMACS\\format} \synopsis \begin{verbatim} int glp_read_mincost(glp_graph *G, int v_rhs, int a_low, int a_cap, int a_cost, const char *fname); \end{verbatim} \description The routine \verb|glp_read_mincost| reads the minimum cost flow problem data from a text file in DIMACS format. The parameter \verb|G| specifies the graph object, to which the problem data have to be stored. Note that before reading data the current content of the graph object is completely erased with the routine \verb|glp_erase_graph|. The parameter \verb|v_rhs| specifies an offset of the field of type \verb|double| in the vertex data block, to which the routine stores $b_i$, the supply/demand value. If \verb|v_rhs| $<0$, the value is not stored. The parameter \verb|a_low| specifies an offset of the field of type \verb|double| in the arc data block, to which the routine stores $l_{ij}$, the lower bound to the arc flow. If \verb|a_low| $<0$, the lower bound is not stored. The parameter \verb|a_cap| specifies an offset of the field of type \verb|double| in the arc data block, to which the routine stores $u_{ij}$, the upper bound to the arc flow (the arc capacity). If \verb|a_cap| $<0$, the upper bound is not stored. The parameter \verb|a_cost| specifies an offset of the field of type \verb|double| in the arc data block, to which the routine stores $c_{ij}$, the per-unit cost of the arc flow. If \verb|a_cost| $<0$, the cost is not stored. The character string \verb|fname| specifies the name of a text file to be read in. (If the file name name ends with the suffix `\verb|.gz|', the file is assumed to be compressed, in which case the routine decompresses it ``on the fly''.) \returns If the operation was successful, the routine returns zero. Otherwise, it prints an error message and returns non-zero. \para{Example} \begin{footnotesize} \begin{verbatim} typedef struct { /* vertex data block */ ... double rhs; ... } v_data; typedef struct { /* arc data block */ ... double low, cap, cost; ... } a_data; int main(void) { glp_graph *G; int ret; G = glp_create_graph(sizeof(v_data), sizeof(a_data)); ret = glp_read_mincost(G, offsetof(v_data, rhs), offsetof(a_data, low), offsetof(a_data, cap), offsetof(a_data, cost), "sample.min"); if (ret != 0) goto ... ... } \end{verbatim} \end{footnotesize} \para{DIMACS minimum cost flow problem format\footnote{This material is based on the paper ``The First DIMACS International Algorithm Implementation Challenge: Problem Definitions and Specifications'', which is publicly available at \url{http://dimacs.rutgers.edu/Challenges}.}} \label{subsecmincost} The DIMACS input file is a plain ASCII text file. It contains {\it lines} of several types described below. A line is terminated with an end-of-line character. Fields in each line are separated by at least one blank space. Each line begins with a one-character designator to identify the line type. Note that DIMACS requires all numerical quantities to be integers in the range $[-2^{31},\ 2^{31}-1]$ while GLPK allows the quantities to be floating-point numbers. \para{Comment lines.} Comment lines give human-readable information about the file and are ignored by programs. Comment lines can appear anywhere in the file. Each comment line begins with a lower-case character \verb|c|. \begin{verbatim} c This is a comment line \end{verbatim} %\newpage \para{Problem line.} There is one problem line per data file. The problem line must appear before any node or arc descriptor lines. It has the following format: \begin{verbatim} p min NODES ARCS \end{verbatim} \newpage \noindent The lower-case character \verb|p| signifies that this is a problem line. The three-character problem designator \verb|min| identifies the file as containing specification information for the minimum cost flow problem. The \verb|NODES| field contains an integer value specifying the number of nodes in the network. The \verb|ARCS| field contains an integer value specifying the number of arcs in the network. \para{Node descriptors.} All node descriptor lines must appear before all arc descriptor lines. The node descriptor lines describe supply and demand nodes, but not transshipment nodes. That is, only nodes with non-zero node supply/demand values appear. There is one node descriptor line for each such node, with the following format: \begin{verbatim} n ID FLOW \end{verbatim} \noindent The lower-case character \verb|n| signifies that this is a node descriptor line. The \verb|ID| field gives a node identification number, an integer between 1 and \verb|NODES|. The \verb|FLOW| field gives the amount of supply (if positive) or demand (if negative) at node \verb|ID|. \para{Arc descriptors.} There is one arc descriptor line for each arc in the network. Arc descriptor lines are of the following format: \begin{verbatim} a SRC DST LOW CAP COST \end{verbatim} \noindent The lower-case character \verb|a| signifies that this is an arc descriptor line. For a directed arc $(i,j)$ the \verb|SRC| field gives the identification number $i$ for the tail endpoint, and the \verb|DST| field gives the identification number $j$ for the head endpoint. Identification numbers are integers between 1 and \verb|NODES|. The \verb|LOW| field specifies the minimum amount of flow that can be sent along arc $(i,j)$, and the \verb|CAP| field gives the maximum amount of flow that can be sent along arc $(i,j)$ in a feasible flow. The \verb|COST| field contains the per-unit cost of flow sent along arc $(i,j)$. \para{Example.} Below here is an example of the data file in DIMACS format corresponding to the minimum cost flow problem shown on Fig~1. \begin{footnotesize} \begin{verbatim} c sample.min c c This is an example of the minimum cost flow problem data c in DIMACS format. c p min 9 14 c n 1 20 n 9 -20 c a 1 2 0 14 0 a 1 4 0 23 0 a 2 3 0 10 2 a 2 4 0 9 3 a 3 5 2 12 1 a 3 8 0 18 0 a 4 5 0 26 0 a 5 2 0 11 1 a 5 6 0 25 5 a 5 7 0 4 7 a 6 7 0 7 0 a 6 8 4 8 0 a 7 9 0 15 3 a 8 9 0 20 9 c c eof \end{verbatim} \end{footnotesize} \newpage \subsection{glp\_write\_mincost --- write minimum cost flow problem data in DIMACS\\format} \synopsis \begin{verbatim} int glp_write_mincost(glp_graph *G, int v_rhs, int a_low, int a_cap, int a_cost, const char *fname); \end{verbatim} \description The routine \verb|glp_write_mincost| writes the minimum cost flow problem data to a text file in DIMACS format. The parameter \verb|G| is the graph (network) program object, which specifies the minimum cost flow problem instance. The parameter \verb|v_rhs| specifies an offset of the field of type \verb|double| in the vertex data block, which contains $b_i$, the supply/demand value. If \verb|v_rhs| $<0$, it is assumed that $b_i=0$ for all nodes. The parameter \verb|a_low| specifies an offset of the field of type \verb|double| in the arc data block, which contains $l_{ij}$, the lower bound to the arc flow. If \verb|a_low| $<0$, it is assumed that $l_{ij}=0$ for all arcs. The parameter \verb|a_cap| specifies an offset of the field of type \verb|double| in the arc data block, which contains $u_{ij}$, the upper bound to the arc flow (the arc capacity). If the upper bound is specified as \verb|DBL_MAX|, it is assumed that $u_{ij}=\infty$, i.e. the arc is uncapacitated. If \verb|a_cap| $<0$, it is assumed that $u_{ij}=1$ for all arcs. The parameter \verb|a_cost| specifies an offset of the field of type \verb|double| in the arc data block, which contains $c_{ij}$, the per-unit cost of the arc flow. If \verb|a_cost| $<0$, it is assumed that $c_{ij}=0$ for all arcs. The character string \verb|fname| specifies a name of the text file to be written out. (If the file name ends with suffix `\verb|.gz|', the file is assumed to be compressed, in which case the routine performs automatic compression on writing it.) \returns If the operation was successful, the routine returns zero. Otherwise, it prints an error message and returns non-zero. %\newpage \subsection{glp\_mincost\_lp --- convert minimum cost flow problem to LP} \synopsis \begin{verbatim} void glp_mincost_lp(glp_prob *P, glp_graph *G, int names, int v_rhs, int a_low, int a_cap, int a_cost); \end{verbatim} \description The routine \verb|glp_mincost_lp| builds LP problem (1)---(3), which corresponds to the specified minimum cost flow problem. The parameter \verb|P| is the resultant LP problem object to be built. Note that on entry its current content is erased with the routine \verb|glp_erase_prob|. The parameter \verb|G| is the graph (network) program object, which specifies the minimum cost flow problem instance. The parameter \verb|names| is a flag. If it is \verb|GLP_ON|, the routine uses symbolic names of the graph object components to assign symbolic names to the LP problem object components. If the flag is \verb|GLP_OFF|, no symbolic names are assigned. The parameter \verb|v_rhs| specifies an offset of the field of type \verb|double| in the vertex data block, which contains $b_i$, the supply/demand value. If \verb|v_rhs| $<0$, it is assumed that $b_i=0$ for all nodes. The parameter \verb|a_low| specifies an offset of the field of type \verb|double| in the arc data block, which contains $l_{ij}$, the lower bound to the arc flow. If \verb|a_low| $<0$, it is assumed that $l_{ij}=0$ for all arcs. The parameter \verb|a_cap| specifies an offset of the field of type \verb|double| in the arc data block, which contains $u_{ij}$, the upper bound to the arc flow (the arc capacity). If the upper bound is specified as \verb|DBL_MAX|, it is assumed that $u_{ij}=\infty$, i.e. the arc is uncapacitated. If \verb|a_cap| $<0$, it is assumed that $u_{ij}=1$ for all arcs. The parameter \verb|a_cost| specifies an offset of the field of type \verb|double| in the arc data block, which contains $c_{ij}$, the per-unit cost of the arc flow. If \verb|a_cost| $<0$, it is assumed that $c_{ij}=0$ for all arcs. \para{Example} The example program below reads the minimum cost problem instance in DIMACS format from file `\verb|sample.min|', converts the instance to LP, and then writes the resultant LP in CPLEX format to file `\verb|mincost.lp|'. \begin{footnotesize} \begin{verbatim} #include #include typedef struct { double rhs; } v_data; typedef struct { double low, cap, cost; } a_data; int main(void) { glp_graph *G; glp_prob *P; G = glp_create_graph(sizeof(v_data), sizeof(a_data)); glp_read_mincost(G, offsetof(v_data, rhs), offsetof(a_data, low), offsetof(a_data, cap), offsetof(a_data, cost), "sample.min"); P = glp_create_prob(); glp_mincost_lp(P, G, GLP_ON, offsetof(v_data, rhs), offsetof(a_data, low), offsetof(a_data, cap), offsetof(a_data, cost)); glp_delete_graph(G); glp_write_lp(P, NULL, "mincost.lp"); glp_delete_prob(P); return 0; } \end{verbatim} \end{footnotesize} If `\verb|sample.min|' is the example data file from the subsection describing \verb|glp_read_mincost|, file `\verb|mincost.lp|' may look like follows: \begin{footnotesize} \begin{verbatim} Minimize obj: + 3 x(2,4) + 2 x(2,3) + x(3,5) + 7 x(5,7) + 5 x(5,6) + x(5,2) + 3 x(7,9) + 9 x(8,9) Subject To r_1: + x(1,2) + x(1,4) = 20 r_2: - x(5,2) + x(2,3) + x(2,4) - x(1,2) = 0 r_3: + x(3,5) + x(3,8) - x(2,3) = 0 r_4: + x(4,5) - x(2,4) - x(1,4) = 0 r_5: + x(5,2) + x(5,6) + x(5,7) - x(4,5) - x(3,5) = 0 r_6: + x(6,7) + x(6,8) - x(5,6) = 0 r_7: + x(7,9) - x(6,7) - x(5,7) = 0 r_8: + x(8,9) - x(6,8) - x(3,8) = 0 r_9: - x(8,9) - x(7,9) = -20 Bounds 0 <= x(1,4) <= 23 0 <= x(1,2) <= 14 0 <= x(2,4) <= 9 0 <= x(2,3) <= 10 0 <= x(3,8) <= 18 2 <= x(3,5) <= 12 0 <= x(4,5) <= 26 0 <= x(5,7) <= 4 0 <= x(5,6) <= 25 0 <= x(5,2) <= 11 4 <= x(6,8) <= 8 0 <= x(6,7) <= 7 0 <= x(7,9) <= 15 0 <= x(8,9) <= 20 End \end{verbatim} \end{footnotesize} %\newpage \subsection{glp\_mincost\_okalg --- solve minimum cost flow problem with out-of-kilter\\algorithm} \synopsis \begin{verbatim} int glp_mincost_okalg(glp_graph *G, int v_rhs, int a_low, int a_cap, int a_cost, double *sol, int a_x, int v_pi); \end{verbatim} \description The routine \verb|glp_mincost_okalg| finds optimal solution to the minimum cost flow problem with the out-of-kilter algorithm.\footnote{GLPK implementation of the out-of-kilter algorithm is based on the following book: L.~R.~Ford,~Jr., and D.~R.~Fulkerson, ``Flows in Networks,'' The RAND Corp., Report R-375-PR (August 1962), Chap. III ``Minimal Cost Flow Problems,'' pp.~113-26.} Note that this routine requires all the problem data to be integer-valued. The parameter \verb|G| is a graph (network) program object which specifies the minimum cost flow problem instance to be solved. The parameter \verb|v_rhs| specifies an offset of the field of type \verb|double| in the vertex data block, which contains $b_i$, the supply/demand value. This value must be integer in the range [$-$\verb|INT_MAX|, $+$\verb|INT_MAX|]. If \verb|v_rhs| $<0$, it is assumed that $b_i=0$ for all nodes. The parameter \verb|a_low| specifies an offset of the field of type \verb|double| in the arc data block, which contains $l_{ij}$, the lower bound to the arc flow. This bound must be integer in the range [$0$, \verb|INT_MAX|]. If \verb|a_low| $<0$, it is assumed that $l_{ij}=0$ for all arcs. The parameter \verb|a_cap| specifies an offset of the field of type \verb|double| in the arc data block, which contains $u_{ij}$, the upper bound to the arc flow (the arc capacity). This bound must be integer in the range [$l_{ij}$, \verb|INT_MAX|]. If \verb|a_cap| $<0$, it is assumed that $u_{ij}=1$ for all arcs. \newpage The parameter \verb|a_cost| specifies an offset of the field of type \verb|double| in the arc data block, which contains $c_{ij}$, the per-unit cost of the arc flow. This value must be integer in the range [$-$\verb|INT_MAX|, $+$\verb|INT_MAX|]. If \verb|a_cost| $<0$, it is assumed that $c_{ij}=0$ for all arcs. The parameter \verb|sol| specifies a location, to which the routine stores the objective value (that is, the total cost) found. If \verb|sol| is NULL, the objective value is not stored. The parameter \verb|a_x| specifies an offset of the field of type \verb|double| in the arc data block, to which the routine stores $x_{ij}$, the arc flow found. If \verb|a_x| $<0$, the arc flow value is not stored. The parameter \verb|v_pi| specifies an offset of the field of type \verb|double| in the vertex data block, to which the routine stores $\pi_i$, the node potential, which is the Lagrange multiplier for the corresponding flow conservation equality constraint (see (2) in Subsection ``Background''). If necessary, the application program may use the node potentials to compute $\lambda_{ij}$, reduced costs of the arc flows $x_{ij}$, which are the Lagrange multipliers for the arc flow bound constraints (see (3) ibid.), using the following formula: $$\lambda_{ij}=c_{ij}-(\pi_i-\pi_j),$$ where $c_{ij}$ is the per-unit cost for arc $(i,j)$. %\newpage Note that all solution components (the objective value, arc flows, and node potentials) computed by the routine are always integer-valued. \returns \begin{retlist} 0 & Optimal solution found.\\ \verb|GLP_ENOPFS| & No (primal) feasible solution exists.\\ \verb|GLP_EDATA| & Unable to start the search, because some problem data are either not integer-valued or out of range. This code is also returned if the total supply, which is the sum of $b_i$ over all source nodes (nodes with $b_i>0$), exceeds \verb|INT_MAX|.\\ \verb|GLP_ERANGE| & The search was prematurely terminated because of integer overflow.\\ \verb|GLP_EFAIL| & An error has been detected in the program logic. (If this code is returned for your problem instance, please report to \verb||.)\\ \end{retlist} \para{Comments} By design the out-of-kilter algorithm is applicable only to networks, where $b_i=0$ for {\it all} nodes, i.e. actually this algorithm finds a minimal cost {\it circulation}. Due to this requirement the routine \verb|glp_mincost_okalg| converts the original network to a network suitable for the out-of-kilter algorithm in the following way:\footnote{The conversion is performed internally and does not change the original network program object passed to the routine.} 1) it adds two auxiliary nodes $s$ and $t$; 2) for each original node $i$ with $b_i>0$ the routine adds auxiliary supply arc $(s\rightarrow i)$, flow $x_{si}$ through which is costless ($c_{si}=0$) and fixed to $+b_i$ ($l_{si}=u_{si}=+b_i$); 3) for each original node $i$ with $b_i<0$ the routine adds auxiliary demand arc $(i\rightarrow t)$, flow $x_{it}$ through which is costless ($c_{it}=0$) and fixed to $-b_i$ ($l_{it}=u_{it}=-b_i$); 4) finally, the routine adds auxiliary feedback arc $(t\rightarrow s)$, flow $x_{ts}$ through which is also costless ($c_{ts}=0$) and fixed to $F$ ($l_{ts}=u_{ts}=F$), where $\displaystyle F=\sum_{b_i>0}b_i$ is the total supply. \newpage \para{Example} The example program below reads the minimum cost problem instance in DIMACS format from file `\verb|sample.min|', solves it by using the routine \verb|glp_mincost_okalg|, and writes the solution found on the standard output. \begin{footnotesize} \begin{verbatim} #include #include #include #include typedef struct { double rhs, pi; } v_data; typedef struct { double low, cap, cost, x; } a_data; #define node(v) ((v_data *)((v)->data)) #define arc(a) ((a_data *)((a)->data)) int main(void) { glp_graph *G; glp_vertex *v, *w; glp_arc *a; int i, ret; double sol; G = glp_create_graph(sizeof(v_data), sizeof(a_data)); glp_read_mincost(G, offsetof(v_data, rhs), offsetof(a_data, low), offsetof(a_data, cap), offsetof(a_data, cost), "sample.min"); ret = glp_mincost_okalg(G, offsetof(v_data, rhs), offsetof(a_data, low), offsetof(a_data, cap), offsetof(a_data, cost), &sol, offsetof(a_data, x), offsetof(v_data, pi)); printf("ret = %d; sol = %5g\n", ret, sol); for (i = 1; i <= G->nv; i++) { v = G->v[i]; printf("node %d: pi = %5g\n", i, node(v)->pi); for (a = v->out; a != NULL; a = a->t_next) { w = a->head; printf("arc %d->%d: x = %5g; lambda = %5g\n", v->i, w->i, arc(a)->x, arc(a)->cost - (node(v)->pi - node(w)->pi)); } } glp_delete_graph(G); return 0; } \end{verbatim} \end{footnotesize} If `\verb|sample.min|' is the example data file from the subsection describing \verb|glp_read_mincost|, the output may look like follows: \begin{footnotesize} \begin{verbatim} Reading min-cost flow problem data from `sample.min'... Flow network has 9 nodes and 14 arcs 24 lines were read ret = 0; sol = 213 node 1: pi = -12 arc 1->4: x = 13; lambda = 0 arc 1->2: x = 7; lambda = 0 node 2: pi = -12 arc 2->4: x = 0; lambda = 3 arc 2->3: x = 7; lambda = 0 node 3: pi = -14 arc 3->8: x = 5; lambda = 0 arc 3->5: x = 2; lambda = 3 node 4: pi = -12 arc 4->5: x = 13; lambda = 0 node 5: pi = -12 arc 5->7: x = 4; lambda = -1 arc 5->6: x = 11; lambda = 0 arc 5->2: x = 0; lambda = 1 node 6: pi = -17 arc 6->8: x = 4; lambda = 3 arc 6->7: x = 7; lambda = -3 node 7: pi = -20 arc 7->9: x = 11; lambda = 0 node 8: pi = -14 arc 8->9: x = 9; lambda = 0 node 9: pi = -23 \end{verbatim} \end{footnotesize} \subsection{glp\_mincost\_relax4 --- solve minimum cost flow problem with relaxation\\method of Bertsekas and Tseng (RELAX-IV)} \synopsis \begin{verbatim} int glp_mincost_relax4(glp_graph *G, int v_rhs, int a_low, int a_cap, int a_cost, int crash, double *sol, int a_x, int a_rc); \end{verbatim} \description The routine \verb|glp_mincost_relax4| finds optimal solution to the minimum cost flow problem with the relaxation method RELAX-IV developed by Bertsekas and Tseng.\footnote{GLPK implementation of this method is based on a C translation of the original Fortran code {\tt RELAX4} written by Dimitri P. Bertsekas and Paul Tseng, with a contribution by Jonathan Eckstein in the phase II initialization.} This method is one of most efficient methods for network optimization. Note that this routine requires all the problem data to be integer-valued. The parameter \verb|G| is a graph (network) program object which specifies the minimum cost flow problem instance to be solved. The parameter \verb|v_rhs| specifies an offset of the field of type \verb|double| in the vertex data block, which contains $b_i$, the supply/demand value. This value must be integer in the range [$-$\verb|INT_MAX|/4, $+$\verb|INT_MAX|/4]. If \verb|v_rhs| $<0$, it is assumed that $b_i=0$ for all nodes. The parameter \verb|a_low| specifies an offset of the field of type \verb|double| in the arc data block, which contains $l_{ij}$, the lower bound to the arc flow. This bound must be integer in the range {\linebreak} [$0$, \verb|INT_MAX|/4]. If \verb|a_low| $<0$, it is assumed that $l_{ij}=0$ for all arcs. The parameter \verb|a_cap| specifies an offset of the field of type \verb|double| in the arc data block, which contains $u_{ij}$, the upper bound to the arc flow (the arc capacity). This bound must be integer in the range [$l_{ij}$, \verb|INT_MAX|/4]. If \verb|a_cap| $<0$, it is assumed that $u_{ij}=1$ for all arcs. The parameter \verb|a_cost| specifies an offset of the field of type \verb|double| in the arc data block, which contains $c_{ij}$, the per-unit cost of the arc flow. This value must be integer in the range [$-$\verb|INT_MAX|/4, $+$\verb|INT_MAX|/4]. If \verb|a_cost| $<0$, it is assumed that $c_{ij}=0$ for all arcs. \newpage The parameter \verb|crash| is an option that specifies initialization method: 0 --- default initialization is used; 1 --- auction initialization is used. \noindent If \verb|crash| = 1, initialization is performed with a special crash procedure based on an auction/shorest path method. This option is recommended for difficult problems where the default initialization results in long running times. The parameter \verb|sol| specifies a location, to which the routine stores the objective value (that is, the total cost) found. If \verb|sol| is NULL, the objective value is not stored. The parameter \verb|a_x| specifies an offset of the field of type \verb|double| in the arc data block, to which the routine stores $x_{ij}$, the arc flow found. If \verb|a_x| $<0$, the arc flow value is not stored. The parameter \verb|a_rc| specifies an offset of the field of type \verb|double| in the arc data block, to which the routine stores the reduced cost for corresponding arc flow (see (3) in Subsection ``Background''). If \verb|a_rc| $<0$, the reduced cost is not stored. Note that all solution components (the objective value, arc flows, and node potentials) computed by the routine are always integer-valued. \returns \begin{retlist} 0 & Optimal solution found.\\ \verb|GLP_ENOPFS| & No (primal) feasible solution exists.\\ \verb|GLP_EDATA| & Unable to start the search, because some problem data are either not integer-valued or out of range.\\ \verb|GLP_ERANGE| & Unable to start the search because of integer overflow.\\ \end{retlist} \para{Example} The example program below reads the minimum cost problem instance in DIMACS format from file `\verb|sample.min|', solves it by using the routine \verb|glp_mincost_relax4|, and writes the solution found on the standard output. \begin{footnotesize} \begin{verbatim} #include #include #include #include typedef struct { double rhs; } v_data; typedef struct { double low, cap, cost, x, rc; } a_data; #define node(v) ((v_data *)((v)->data)) #define arc(a) ((a_data *)((a)->data)) int main(void) { glp_graph *G; glp_vertex *v, *w; glp_arc *a; int i, ret; double sol; G = glp_create_graph(sizeof(v_data), sizeof(a_data)); glp_read_mincost(G, offsetof(v_data, rhs), offsetof(a_data, low), offsetof(a_data, cap), offsetof(a_data, cost), "sample.min"); ret = glp_mincost_relax4(G, offsetof(v_data, rhs), offsetof(a_data, low), offsetof(a_data, cap), offsetof(a_data, cost), 0, &sol, offsetof(a_data, x), offsetof(a_data, rc)); printf("ret = %d; sol = %5g\n", ret, sol); for (i = 1; i <= G->nv; i++) { v = G->v[i]; for (a = v->out; a != NULL; a = a->t_next) { w = a->head; printf("arc %d->%d: x = %5g; rc = %5g\n", v->i, w->i, arc(a)->x, arc(a)->rc); } } glp_delete_graph(G); return 0; } \end{verbatim} \end{footnotesize} If `\verb|sample.min|' is the example data file from the subsection describing \verb|glp_read_mincost|, the output may look like follows: \begin{footnotesize} \begin{verbatim} Reading min-cost flow problem data from `sample.min'... Flow network has 9 nodes and 14 arcs 24 lines were read ret = 0; sol = 213 arc 1->4: x = 13; rc = 0 arc 1->2: x = 7; rc = 0 arc 2->4: x = 0; rc = 3 arc 2->3: x = 7; rc = 0 arc 3->8: x = 5; rc = 0 arc 3->5: x = 2; rc = 3 arc 4->5: x = 13; rc = 0 arc 5->7: x = 4; rc = -1 arc 5->6: x = 11; rc = 0 arc 5->2: x = 0; rc = 1 arc 6->8: x = 4; rc = 3 arc 6->7: x = 7; rc = -3 arc 7->9: x = 11; rc = 0 arc 8->9: x = 9; rc = 0 \end{verbatim} \end{footnotesize} \subsection{glp\_netgen --- Klingman's network problem generator} \synopsis \begin{verbatim} int glp_netgen(glp_graph *G, int v_rhs, int a_cap, int a_cost, const int parm[1+15]); \end{verbatim} \description The routine \verb|glp_netgen| is a GLPK version of the network problem generator developed by Dr.~Darwin~Klingman.\footnote{D.~Klingman, A.~Napier, and J.~Stutz. NETGEN: A program for generating large scale capacitated assignment, transportation, and minimum cost flow networks. Management Science 20 (1974), 814-20.} It can create capacitated and uncapacitated minimum cost flow (or transshipment), transportation, and assignment problems. The parameter \verb|G| specifies the graph object, to which the generated problem data have to be stored. Note that on entry the graph object is erased with the routine \verb|glp_erase_graph|. \newpage The parameter \verb|v_rhs| specifies an offset of the field of type \verb|double| in the vertex data block, to which the routine stores the supply or demand value. If \verb|v_rhs| $<0$, the value is not stored. The parameter \verb|a_cap| specifies an offset of the field of type \verb|double| in the arc data block, to which the routine stores the arc capacity. If \verb|a_cap| $<0$, the capacity is not stored. The parameter \verb|a_cost| specifies an offset of the field of type \verb|double| in the arc data block, to which the routine stores the per-unit cost if the arc flow. If \verb|a_cost| $<0$, the cost is not stored. The array \verb|parm| contains description of the network to be generated: \begin{tabular}{@{}lll@{}} \verb|parm[0] |& ¬ used\\ \verb|parm[1] |&\verb|iseed |&8-digit positive random number seed\\ \verb|parm[2] |&\verb|nprob |&8-digit problem id number\\ \verb|parm[3] |&\verb|nodes |&total number of nodes\\ \verb|parm[4] |&\verb|nsorc |&total number of source nodes (including transshipment nodes)\\ \verb|parm[5] |&\verb|nsink |&total number of sink nodes (including transshipment nodes)\\ \verb|parm[6] |&\verb|iarcs |&number of arc\\ \verb|parm[7] |&\verb|mincst|&minimum cost for arcs\\ \verb|parm[8] |&\verb|maxcst|&maximum cost for arcs\\ \verb|parm[9] |&\verb|itsup |&total supply\\ \verb|parm[10]|&\verb|ntsorc|&number of transshipment source nodes\\ \verb|parm[11]|&\verb|ntsink|&number of transshipment sink nodes\\ \verb|parm[12]|&\verb|iphic |&percentage of skeleton arcs to be given the maximum cost\\ \verb|parm[13]|&\verb|ipcap |&percentage of arcs to be capacitated\\ \verb|parm[14]|&\verb|mincap|&minimum upper bound for capacitated arcs\\ \verb|parm[15]|&\verb|maxcap|&maximum upper bound for capacitated arcs\\ \end{tabular} \returns If the instance was successfully generated, the routine \verb|glp_netgen| returns zero; otherwise, if specified parameters are inconsistent, the routine returns a non-zero error code. \para{Notes} 1. The routine generates a transportation problem if: $${\tt nsorc}+{\tt nsink}={\tt nodes}, \ {\tt ntsorc}=0,\ \mbox{and}\ {\tt ntsink}=0.$$ 2. The routine generates an assignment problem if the requirements for a transportation problem are met and: $${\tt nsorc}={\tt nsink}\ \mbox{and}\ {\tt itsup}={\tt nsorc}.$$ 3. The routine always generates connected graphs. So, if the number of requested arcs has been reached and the generated instance is not fully connected, the routine generates a few remaining arcs to ensure connectedness. Thus, the actual number of arcs generated by the routine may be greater than the requested number of arcs. \newpage \subsection{glp\_netgen\_prob --- Klingman's standard network problem instance} \synopsis \begin{verbatim} void glp_netgen_prob(int nprob, int parm[1+15]); \end{verbatim} \description The routine \verb|glp_netgen_prob| provides the set of parameters for Klingman's network problem generator (see the routine \verb|glp_netgen|), which describe a standard network problem instance. The parameter \verb|nprob| ($101\leq$ \verb|nprob| $\leq 150$) specifies the problem instance number. The array \verb|parm| contains description of the network, provided by the routine. (For detailed description of these parameters see comments to the routine \verb|glp_netgen|.) \para{Problem characteristics} The table below shows characteristics of Klingman's standard network problem instances. $$ \begin{array}{crrr} {\rm Problem} & {\rm Nodes} & {\rm Arcs} & {\rm Optimum} \\ \hline 101 & 5000 & 25336 & 6191726 \\ 102 & 5000 & 25387 & 72337144 \\ 103 & 5000 & 25355 & 218947553 \\ 104 & 5000 & 25344 & -19100371 \\ 105 & 5000 & 25332 & 31192578 \\ 106 & 5000 & 12870 & 4314276 \\ 107 & 5000 & 37832 & 7393769 \\ 108 & 5000 & 50309 & 8405738 \\ 109 & 5000 & 75299 & 9190300 \\ 110 & 5000 & 12825 & 8975048 \\ 111 & 5000 & 37828 & 4747532 \\ 112 & 5000 & 50325 & 4012671 \\ 113 & 5000 & 75318 & 2979725 \\ 114 & 5000 & 26514 & 5821181 \\ 115 & 5000 & 25962 & 6353310 \\ 116 & 5000 & 25304 & 5915426 \\ 117 & 5000 & 12816 & 4420560 \\ 118 & 5000 & 37797 & 7045842 \\ 119 & 5000 & 50301 & 7724179 \\ 120 & 5000 & 75330 & 8455200 \\ 121 & 5000 & 25000 & 66366360 \\ 122 & 5000 & 25000 & 30997529 \\ 123 & 5000 & 25000 & 23388777 \\ 124 & 5000 & 25000 & 17803443 \\ 125 & 5000 & 25000 & 14119622 \\ \end{array} \hspace{.5in} \begin{array}{crrr} {\rm Problem} & {\rm Nodes} & {\rm Arcs} & {\rm Optimum} \\ \hline 126 & 5000 & 12500 & 18802218 \\ 127 & 5000 & 37500 & 27674647 \\ 128 & 5000 & 50000 & 30906194 \\ 129 & 5000 & 75000 & 40905209 \\ 130 & 5000 & 12500 & 38939608 \\ 131 & 5000 & 37500 & 16752978 \\ 132 & 5000 & 50000 & 13302951 \\ 133 & 5000 & 75000 & 9830268 \\ 134 & 1000 & 25000 & 3804874 \\ 135 & 2500 & 25000 & 11729616 \\ 136 & 7500 & 25000 & 33318101 \\ 137 & 10000 & 25000 & 46426030 \\ 138 & 5000 & 25000 & 60710879 \\ 139 & 5000 & 25000 & 32729682 \\ 140 & 5000 & 25000 & 27183831 \\ 141 & 5000 & 25000 & 19963286 \\ 142 & 5000 & 25000 & 20243457 \\ 143 & 5000 & 25000 & 18586777 \\ 144 & 5000 & 25000 & 2504591 \\ 145 & 5000 & 25000 & 215956138 \\ 146 & 5000 & 25000 & 2253113811 \\ 147 & 5000 & 25000 & -427908373 \\ 148 & 5000 & 25000 & -92965318 \\ 149 & 5000 & 25000 & 86051224 \\ 150 & 5000 & 25000 & 619314919 \\ \end{array} $$ \newpage \subsection{glp\_gridgen --- grid-like network problem generator} \synopsis \begin{verbatim} int glp_gridgen(glp_graph *G, int v_rhs, int a_cap, int a_cost, const int parm[1+14]); \end{verbatim} \description The routine \verb|glp_gridgen| is a GLPK version of the grid-like network problem generator developed by Yusin Lee and Jim Orlin.\footnote{Y.~Lee and J.~Orlin. GRIDGEN generator., 1991. The original code is publicly available from \url{ftp://dimacs.rutgers.edu/pub/netflow/generators/network/gridgen}.} The parameter \verb|G| specifies the graph object, to which the generated problem data have to be stored. Note that on entry the graph object is erased with the routine \verb|glp_erase_graph|. The parameter \verb|v_rhs| specifies an offset of the field of type \verb|double| in the vertex data block, to which the routine stores the supply or demand value. If \verb|v_rhs| $<0$, the value is not stored. The parameter \verb|a_cap| specifies an offset of the field of type \verb|double| in the arc data block, to which the routine stores the arc capacity. If \verb|a_cap| $<0$, the capacity is not stored. The parameter \verb|a_cost| specifies an offset of the field of type \verb|double| in the arc data block, to which the routine stores the per-unit cost if the arc flow. If \verb|a_cost| $<0$, the cost is not stored. The array \verb|parm| contains parameters of the network to be generated: \begin{tabular}{@{}ll@{}} \verb|parm[0] |¬ used\\ \verb|parm[1] |&two-ways arcs indicator:\\ &1 --- if links in both direction should be generated\\ &0 --- otherwise\\ \verb|parm[2] |&random number seed (a positive integer)\\ \verb|parm[3] |&number of nodes (the number of nodes generated might be slightly different to\\&make the network a grid)\\ \verb|parm[4] |&grid width\\ \verb|parm[5] |&number of sources\\ \verb|parm[6] |&number of sinks\\ \verb|parm[7] |&average degree\\ \verb|parm[8] |&total flow\\ \verb|parm[9] |&distribution of arc costs: 1 --- uniform, 2 --- exponential\\ \verb|parm[10]|&lower bound for arc cost (uniform), $100\lambda$ (exponential)\\ \verb|parm[11]|&upper bound for arc cost (uniform), not used (exponential)\\ \verb|parm[12]|&distribution of arc capacities: 1 --- uniform, 2 --- exponential\\ \verb|parm[13]|&lower bound for arc capacity (uniform), $100\lambda$ (exponential)\\ \verb|parm[14]|&upper bound for arc capacity (uniform), not used (exponential)\\ \end{tabular} \returns If the instance was successfully generated, the routine \verb|glp_gridgen| returns zero; otherwise, if specified parameters are inconsistent, the routine returns a non-zero error code. \newpage \para{Comments\footnote{This material is based on comments to the original version of GRIDGEN.}} This network generator generates a grid-like network plus a super node. In additional to the arcs connecting the nodes in the grid, there is an arc from each supply node to the super node and from the super node to each demand node to guarantee feasiblity. These arcs have very high costs and very big capacities. The idea of this network generator is as follows: First, a grid of $n_1\times n_2$ is generated. For example, $5\times 3$. The nodes are numbered as 1 to 15, and the supernode is numbered as $n_1\times n_2+1$. Then arcs between adjacent nodes are generated. For these arcs, the user is allowed to specify either to generate two-way arcs or one-way arcs. If two-way arcs are to be generated, two arcs, one in each direction, will be generated between each adjacent node pairs. Otherwise, only one arc will be generated. If this is the case, the arcs will be generated in alterntive directions as shown below. \medskip \noindent\hfil \xymatrix {1\ar[r]\ar[d]&2\ar[r]&3\ar[r]\ar[d]&4\ar[r]&5\ar[d]\\ 6\ar[d]&7\ar[l]\ar[u]&8\ar[l]\ar[d]&9\ar[l]\ar[u]&10\ar[l]\ar[d]\\ 11\ar[r]&12\ar[r]\ar[u]&13\ar[r]&14\ar[r]\ar[u]&15\\ } \medskip Then the arcs between the super node and the source/sink nodes are added as mentioned before. If the number of arcs still doesn't reach the requirement, additional arcs will be added by uniformly picking random node pairs. There is no checking to prevent multiple arcs between any pair of nodes. However, there will be no self-arcs (arcs that poins back to its tail node) in the network. The source and sink nodes are selected uniformly in the network, and the imbalances of each source/sink node are also assigned by uniform distribution. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newpage \section{Maximum flow problem} \subsection{Background} The {\it maximum flow problem} (MAXFLOW) is stated as follows. Let there be given a directed graph (flow network) $G=(V,A)$, where $V$ is a set of vertices (nodes), and $A\subseteq V\times V$ is a set of arcs. Let also for each arc $a=(i,j)\in A$ there be given its capacity $u_{ij}$. The problem is, for given {\it source} node $s\in V$ and {\it sink} node $t\in V$, to find flows $x_{ij}$ through every arc of the network, which satisfy the specified arc capacities and the conservation constraints at all nodes, and maximize the total flow $F$ through the network from $s$ to $t$. Here the conservation constraint at a node means that the total flow entering this node through its incoming arcs (plus $F$, if it is the source node) must be equal to the total flow leaving this node through its outgoing arcs (plus $F$, if it is the sink node). An example of the maximum flow problem, where $s=v_1$ and $t=v_9$, is shown on Fig.~2. \medskip \noindent\hfil \xymatrix @C=48pt {_{F}\ar@{~>}[d]& v_2\ar[r]|{_{10}}\ar[dd]|{_{9}}& v_3\ar[dd]|{_{12}}\ar[r]|{_{18}}& v_8\ar[rd]|{_{20}}&\\ v_1\ar[ru]|{_{14}}\ar[rd]|{_{23}}&&& v_6\ar[d]|{_{7}}\ar[u]|{_{8}}& v_9\ar@{~>}[d]\\ &v_4\ar[r]|{_{26}}& v_5\ar[luu]|{_{11}}\ar[ru]|{_{25}}\ar[r]|{_{4}}& v_7\ar[ru]|{_{15}}&_{F}\\ } \medskip \noindent\hfil Fig.~2. An example of the maximum flow problem. \medskip The maximum flow problem can be naturally formulated as the following LP problem: \noindent \hspace{1in}maximize $$F\eqno(4)$$ \hspace{1in}subject to $$\sum_{(i,j)\in A}x_{ij}-\sum_{(j,i)\in A}x_{ji}=\left\{ \begin{array}{@{\ }rl} +F,&\hbox{for}\ i=s\\ 0,&\hbox{for all}\ i\in V\backslash\{s,t\}\\ -F,&\hbox{for}\ i=t\\ \end{array} \right.\eqno(5) $$ $$0\leq x_{ij}\leq u_{ij}\ \ \ \hbox{for all}\ (i,j)\in A \eqno(6)$$ \noindent where $F\geq 0$ is an additional variable playing the role of the objective. Another LP formulation of the maximum flow problem, which does not include the variable $F$, is the following: \noindent \hspace{1in}maximize $$z=\sum_{(s,j)\in A}x_{sj}-\sum_{(j,s)\in A}x_{js}\ (=F)\eqno(7)$$ \hspace{1in}subject to $$\sum_{(i,j)\in A}x_{ij}-\sum_{(j,i)\in A}x_{ji}\left\{ \begin{array}{@{\ }rl} \geq 0,&\hbox{for}\ i=s\\ =0,&\hbox{for all}\ i\in V\backslash\{s,t\}\\ \leq 0,&\hbox{for}\ i=t\\ \end{array} \right.\eqno(8) $$ $$0\leq x_{ij}\leq u_{ij}\ \ \ \hbox{for all}\ (i,j)\in A \eqno(9)$$ \newpage \subsection{glp\_read\_maxflow --- read maximum flow problem data in DIMACS\\format} \synopsis \begin{verbatim} int glp_read_maxflow(glp_graph *G, int *s, int *t, int a_cap, const char *fname); \end{verbatim} \description The routine \verb|glp_read_maxflow| reads the maximum flow problem data from a text file in DIMACS format. The parameter \verb|G| specifies the graph object, to which the problem data have to be stored. Note that before reading data the current content of the graph object is completely erased with the routine \verb|glp_erase_graph|. The pointer \verb|s| specifies a location, to which the routine stores the ordinal number of the source node. If \verb|s| is \verb|NULL|, the source node number is not stored. The pointer \verb|t| specifies a location, to which the routine stores the ordinal number of the sink node. If \verb|t| is \verb|NULL|, the sink node number is not stored. The parameter \verb|a_cap| specifies an offset of the field of type \verb|double| in the arc data block, to which the routine stores $u_{ij}$, the arc capacity. If \verb|a_cap| $<0$, the arc capacity is not stored. The character string \verb|fname| specifies the name of a text file to be read in. (If the file name name ends with the suffix `\verb|.gz|', the file is assumed to be compressed, in which case the routine decompresses it ``on the fly''.) \returns If the operation was successful, the routine returns zero. Otherwise, it prints an error message and returns non-zero. \para{Example} \begin{footnotesize} \begin{verbatim} typedef struct { /* arc data block */ ... double cap; ... } a_data; int main(void) { glp_graph *G; int s, t, ret; G = glp_create_graph(..., sizeof(a_data)); ret = glp_read_maxflow(G, &s, &t, offsetof(a_data, cap), "sample.max"); if (ret != 0) goto ... ... } \end{verbatim} \end{footnotesize} \newpage \para{DIMACS maximum flow problem format\footnote{This material is based on the paper ``The First DIMACS International Algorithm Implementation Challenge: Problem Definitions and Specifications'', which is publicly available at \url{http://dimacs.rutgers.edu/Challenges/}.}} \label{subsecmaxflow} The DIMACS input file is a plain ASCII text file. It contains {\it lines} of several types described below. A line is terminated with an end-of-line character. Fields in each line are separated by at least one blank space. Each line begins with a one-character designator to identify the line type. Note that DIMACS requires all numerical quantities to be integers in the range $[-2^{31},\ 2^{31}-1]$ while GLPK allows the quantities to be floating-point numbers. \para{Comment lines.} Comment lines give human-readable information about the file and are ignored by programs. Comment lines can appear anywhere in the file. Each comment line begins with a lower-case character \verb|c|. \begin{verbatim} c This is a comment line \end{verbatim} \para{Problem line.} There is one problem line per data file. The problem line must appear before any node or arc descriptor lines. It has the following format: \begin{verbatim} p max NODES ARCS \end{verbatim} \noindent The lower-case character \verb|p| signifies that this is a problem line. The three-character problem designator \verb|max| identifies the file as containing specification information for the maximum flow problem. The \verb|NODES| field contains an integer value specifying the number of nodes in the network. The \verb|ARCS| field contains an integer value specifying the number of arcs in the network. \para{Node descriptors.} Two node descriptor lines for the source and sink nodes must appear before all arc descriptor lines. They may appear in either order, each with the following format: \begin{verbatim} n ID WHICH \end{verbatim} \noindent The lower-case character \verb|n| signifies that this a node descriptor line. The \verb|ID| field gives a node identification number, an integer between 1 and \verb|NODES|. The \verb|WHICH| field gives either a lower-case \verb|s| or \verb|t|, designating the source and sink, respectively. \para{Arc descriptors.} There is one arc descriptor line for each arc in the network. Arc descriptor lines are of the following format: \begin{verbatim} a SRC DST CAP \end{verbatim} \noindent The lower-case character \verb|a| signifies that this is an arc descriptor line. For a directed arc $(i,j)$ the \verb|SRC| field gives the identification number $i$ for the tail endpoint, and the \verb|DST| field gives the identification number $j$ for the head endpoint. Identification numbers are integers between 1 and \verb|NODES|. The \verb|CAP| field gives the arc capacity, i.e. maximum amount of flow that can be sent along arc $(i,j)$ in a feasible flow. \para{Example.} Below here is an example of the data file in DIMACS format corresponding to the maximum flow problem shown on Fig~2. \begin{footnotesize} \begin{verbatim} c sample.max c c This is an example of the maximum flow problem data c in DIMACS format. c p max 9 14 c n 1 s n 9 t c a 1 2 14 a 1 4 23 a 2 3 10 a 2 4 9 a 3 5 12 a 3 8 18 a 4 5 26 a 5 2 11 a 5 6 25 a 5 7 4 a 6 7 7 a 6 8 8 a 7 9 15 a 8 9 20 c c eof \end{verbatim} \end{footnotesize} \subsection{glp\_write\_maxflow --- write maximum flow problem data in DIMACS\\format} \synopsis \begin{verbatim} int glp_write_maxflow(glp_graph *G, int s, int t, int a_cap, const char *fname); \end{verbatim} \description The routine \verb|glp_write_maxflow| writes the maximum flow problem data to a text file in DIMACS format. The parameter \verb|G| is the graph (network) program object, which specifies the maximum flow problem instance. The parameter \verb|s| specifies the ordinal number of the source node. The parameter \verb|t| specifies the ordinal number of the sink node. The parameter \verb|a_cap| specifies an offset of the field of type \verb|double| in the arc data block, which contains $u_{ij}$, the upper bound to the arc flow (the arc capacity). If the upper bound is specified as \verb|DBL_MAX|, it is assumed that $u_{ij}=\infty$, i.e. the arc is uncapacitated. If \verb|a_cap| $<0$, it is assumed that $u_{ij}=1$ for all arcs. The character string \verb|fname| specifies a name of the text file to be written out. (If the file name ends with suffix `\verb|.gz|', the file is assumed to be compressed, in which case the routine performs automatic compression on writing it.) \returns If the operation was successful, the routine returns zero. Otherwise, it prints an error message and returns non-zero. \newpage \subsection{glp\_maxflow\_lp --- convert maximum flow problem to LP} \synopsis \begin{verbatim} void glp_maxflow_lp(glp_prob *P, glp_graph *G, int names, int s, int t, int a_cap); \end{verbatim} \description The routine \verb|glp_maxflow_lp| builds LP problem (7)---(9), which corresponds to the specified maximum flow problem. The parameter \verb|P| is the resultant LP problem object to be built. Note that on entry its current content is erased with the routine \verb|glp_erase_prob|. The parameter \verb|G| is the graph (network) program object, which specifies the maximum flow problem instance. The parameter \verb|names| is a flag. If it is \verb|GLP_ON|, the routine uses symbolic names of the graph object components to assign symbolic names to the LP problem object components. If the flag is \verb|GLP_OFF|, no symbolic names are assigned. The parameter \verb|s| specifies the ordinal number of the source node. The parameter \verb|t| specifies the ordinal number of the sink node. The parameter \verb|a_cap| specifies an offset of the field of type \verb|double| in the arc data block, which contains $u_{ij}$, the upper bound to the arc flow (the arc capacity). If the upper bound is specified as \verb|DBL_MAX|, it is assumed that $u_{ij}=\infty$, i.e. the arc is uncapacitated. If \verb|a_cap| $<0$, it is assumed that $u_{ij}=1$ for all arcs. \para{Example} The example program below reads the maximum flow problem in DIMACS format from file `\verb|sample.max|', converts the instance to LP, and then writes the resultant LP in CPLEX format to file `\verb|maxflow.lp|'. \begin{footnotesize} \begin{verbatim} #include #include int main(void) { glp_graph *G; glp_prob *P; int s, t; G = glp_create_graph(0, sizeof(double)); glp_read_maxflow(G, &s, &t, 0, "sample.max"); P = glp_create_prob(); glp_maxflow_lp(P, G, GLP_ON, s, t, 0); glp_delete_graph(G); glp_write_lp(P, NULL, "maxflow.lp"); glp_delete_prob(P); return 0; } \end{verbatim} \end{footnotesize} If `\verb|sample.max|' is the example data file from the previous subsection, the output `\verb|maxflow.lp|' may look like follows: \newpage \begin{footnotesize} \begin{verbatim} Maximize obj: + x(1,4) + x(1,2) Subject To r_1: + x(1,2) + x(1,4) >= 0 r_2: - x(5,2) + x(2,3) + x(2,4) - x(1,2) = 0 r_3: + x(3,5) + x(3,8) - x(2,3) = 0 r_4: + x(4,5) - x(2,4) - x(1,4) = 0 r_5: + x(5,2) + x(5,6) + x(5,7) - x(4,5) - x(3,5) = 0 r_6: + x(6,7) + x(6,8) - x(5,6) = 0 r_7: + x(7,9) - x(6,7) - x(5,7) = 0 r_8: + x(8,9) - x(6,8) - x(3,8) = 0 r_9: - x(8,9) - x(7,9) <= 0 Bounds 0 <= x(1,4) <= 23 0 <= x(1,2) <= 14 0 <= x(2,4) <= 9 0 <= x(2,3) <= 10 0 <= x(3,8) <= 18 0 <= x(3,5) <= 12 0 <= x(4,5) <= 26 0 <= x(5,7) <= 4 0 <= x(5,6) <= 25 0 <= x(5,2) <= 11 0 <= x(6,8) <= 8 0 <= x(6,7) <= 7 0 <= x(7,9) <= 15 0 <= x(8,9) <= 20 End \end{verbatim} \end{footnotesize} \subsection{glp\_maxflow\_ffalg --- solve maximum flow problem with Ford-Fulkerson\\algorithm} \synopsis \begin{verbatim} int glp_maxflow_ffalg(glp_graph *G, int s, int t, int a_cap, double *sol, int a_x, int v_cut); \end{verbatim} \description The routine \verb|glp_mincost_ffalg| finds optimal solution to the maximum flow problem with the Ford-Fulkerson algorithm.\footnote{GLPK implementation of the Ford-Fulkerson algorithm is based on the following book: L.~R.~Ford,~Jr., and D.~R.~Fulkerson, ``Flows in Networks,'' The RAND Corp., Report R-375-PR (August 1962), Chap. I ``Static Maximal Flow,'' pp.~30-33.} Note that this routine requires all the problem data to be integer-valued. The parameter \verb|G| is a graph (network) program object which specifies the maximum flow problem instance to be solved. The parameter $s$ specifies the ordinal number of the source node. The parameter $t$ specifies the ordinal number of the sink node. \newpage The parameter \verb|a_cap| specifies an offset of the field of type \verb|double| in the arc data block, which contains $u_{ij}$, the upper bound to the arc flow (the arc capacity). This bound must be integer in the range [0, \verb|INT_MAX|]. If \verb|a_cap| $<0$, it is assumed that $u_{ij}=1$ for all arcs. The parameter \verb|sol| specifies a location, to which the routine stores the objective value (that is, the total flow from $s$ to $t$) found. If \verb|sol| is NULL, the objective value is not stored. The parameter \verb|a_x| specifies an offset of the field of type \verb|double| in the arc data block, to which the routine stores $x_{ij}$, the arc flow found. If \verb|a_x| $<0$, the arc flow values are not stored. The parameter \verb|v_cut| specifies an offset of the field of type \verb|int| in the vertex data block, to which the routine stores node flags corresponding to the optimal solution found: if the node flag is 1, the node is labelled, and if the node flag is 0, the node is unlabelled. The calling program may use these node flags to determine the {\it minimal cut}, which is a subset of arcs whose one endpoint is labelled and other is not. If \verb|v_cut| $<0$, the node flags are not stored. Note that all solution components (the objective value and arc flows) computed by the routine are always integer-valued. \returns \begin{retlist} 0 & Optimal solution found.\\ \verb|GLP_EDATA| & Unable to start the search, because some problem data are either not integer-valued or out of range.\\ \end{retlist} \para{Example} The example program shown below reads the maximum flow problem instance in DIMACS format from file `\verb|sample.max|', solves it using the routine \verb|glp_maxflow_ffalg|, and write the solution found to the standard output. \begin{footnotesize} \begin{verbatim} #include #include #include #include typedef struct { int cut; } v_data; typedef struct { double cap, x; } a_data; #define node(v) ((v_data *)((v)->data)) #define arc(a) ((a_data *)((a)->data)) int main(void) { glp_graph *G; glp_vertex *v, *w; glp_arc *a; int i, s, t, ret; double sol; G = glp_create_graph(sizeof(v_data), sizeof(a_data)); glp_read_maxflow(G, &s, &t, offsetof(a_data, cap), "sample.max"); ret = glp_maxflow_ffalg(G, s, t, offsetof(a_data, cap), &sol, offsetof(a_data, x), offsetof(v_data, cut)); printf("ret = %d; sol = %5g\n", ret, sol); for (i = 1; i <= G->nv; i++) { v = G->v[i]; for (a = v->out; a != NULL; a = a->t_next) { w = a->head; printf("x[%d->%d] = %5g (%d)\n", v->i, w->i, arc(a)->x, node(v)->cut ^ node(w)->cut); } } glp_delete_graph(G); return 0; } \end{verbatim} \end{footnotesize} If `\verb|sample.max|' is the example data file from the subsection describing \verb|glp_read_maxflow|, the output may look like follows: \begin{footnotesize} \begin{verbatim} Reading maximum flow problem data from `sample.max'... Flow network has 9 nodes and 14 arcs 24 lines were read ret = 0; sol = 29 x[1->4] = 19 (0) x[1->2] = 10 (0) x[2->4] = 0 (0) x[2->3] = 10 (1) x[3->8] = 10 (0) x[3->5] = 0 (1) x[4->5] = 19 (0) x[5->7] = 4 (1) x[5->6] = 15 (0) x[5->2] = 0 (0) x[6->8] = 8 (1) x[6->7] = 7 (1) x[7->9] = 11 (0) x[8->9] = 18 (0) \end{verbatim} \end{footnotesize} \subsection{glp\_rmfgen --- Goldfarb's maximum flow problem generator} \synopsis \begin{verbatim} int glp_rmfgen(glp_graph *G, int *s, int *t, int a_cap, const int parm[1+5]); \end{verbatim} \description The routine \verb|glp_rmfgen| is a GLPK version of the maximum flow problem generator developed by D.~Goldfarb and M.~Grigoriadis.\footnote{D.~Goldfarb and M.~D.~Grigoriadis, ``A computational comparison of the Dinic and network simplex methods for maximum flow.'' Annals of Op. Res. 13 (1988), pp.~83-123.}$^{,}$\footnote{U.~Derigs and W.~Meier, ``Implementing Goldberg's max-flow algorithm: A computational investigation.'' Zeitschrift f\"ur Operations Research 33 (1989), pp.~383-403.}$^{,}$\footnote{The original code of RMFGEN implemented by Tamas Badics is publicly available from \url{ftp://dimacs.rutgers.edu/pub/netflow/generators/network/genrmf}.} The parameter \verb|G| specifies the graph object, to which the generated problem data have to be stored. Note that on entry the graph object is erased with the routine \verb|glp_erase_graph|. The pointers \verb|s| and \verb|t| specify locations, to which the routine stores the source and sink node numbers, respectively. If \verb|s| or \verb|t| is \verb|NULL|, corresponding node number is not stored. The parameter \verb|a_cap| specifies an offset of the field of type \verb|double| in the arc data block, to which the routine stores the arc capacity. If \verb|a_cap| $<0$, the capacity is not stored. \newpage The array \verb|parm| contains description of the network to be generated: \begin{tabular}{@{}lll@{}} \verb|parm[0]|& ¬ used\\ \verb|parm[1]|&\verb|seed|&random number seed (a positive integer)\\ \verb|parm[2]|&\verb|a |&frame size\\ \verb|parm[3]|&\verb|b |&depth\\ \verb|parm[4]|&\verb|c1 |&minimal arc capacity\\ \verb|parm[5]|&\verb|c2 |&maximal arc capacity\\ \end{tabular} \returns If the instance was successfully generated, the routine \verb|glp_netgen| returns zero; otherwise, if specified parameters are inconsistent, the routine returns a non-zero error code. \para{Comments\footnote{This material is based on comments to the original version of RMFGEN.}} The generated network is as follows. It has $b$ pieces of frames of size $a\times a$. (So alltogether the number of vertices is $a\times a\times b$.) In each frame all the vertices are connected with their neighbours (forth and back). In addition the vertices of a frame are connected one to one with the vertices of next frame using a random permutation of those vertices. The source is the lower left vertex of the first frame, the sink is the upper right vertex of the $b$-th frame. \begin{verbatim} t +-------+ | .| | . | / | / | +-------+/ -+ b | | |/. a | -v- |/ | | |/ +-------+ 1 s a \end{verbatim} The capacities are randomly chosen integers from the range of $[c_1,c_2]$ in the case of interconnecting edges, and $c_2\cdot a^2$ for the in-frame edges. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newpage \section{Assignment problem} \subsection{Background} Let there be given an undirected bipartite graph $G=(R\cup S,E)$, where $R$ and $S$ are disjoint sets of vertices (nodes), and $E\subseteq R\times S$ is a set of edges. Let also for each edge $e=(i,j)\in E$ there be given its cost $c_{ij}$. A {\it matching} (which in case of bipartite graph is also called {\it assignment}) $M\subseteq E$ in $G$ is a set of pairwise non-adjacent edges, that is, no two edges in $M$ share a common vertex. A matching, which matches all vertices of the graph, is called a {\it perfect matching}. Obviously, a perfect matching in bipartite graph $G=(R\cup S,E)$ defines some bijection $R\leftrightarrow S$. The {\it assignment problem} has two different variants. In the first variant the problem is to find matching (assignment) $M$, which maximizes the sum: $$\sum_{(i,j)\in M}c_{ij}\eqno(10)$$ (so this variant is also called the {\it maximum weighted bipartite matching problem} or, if all $c_{ij}=1$, the {\it maximum cardinality bipartite matching problem}). In the second, classic variant the problem is to find {\it perfect} matching (assignment) $M$, which minimizes or maximizes the sum (10). An example of the assignment problem, which is the maximum weighted bipartite matching problem, is shown on Fig. 3. The maximum weighted bipartite matching problem can be naturally formulated as the following LP problem: \noindent \hspace{1in}maximize $$z=\sum_{(i,j)\in E}c_{ij}x_{ij}\eqno(11)$$ \hspace{1in}subject to $$\sum_{(i,j)\in E}x_{ij}\leq 1\ \ \ \hbox{for all}\ i\in R\eqno(12)$$ $$\sum_{(i,j)\in E}x_{ij}\leq 1\ \ \ \hbox{for all}\ j\in S\eqno(13)$$ $$\ \ \ \ \ \ \ \ 0\leq x_{ij}\leq 1\ \ \ \hbox{for all}\ (i,j)\in E \eqno(14)$$ \noindent where $x_{ij}=1$ means that $(i,j)\in M$, and $x_{ij}=0$ means that $(i,j)\notin M$.\footnote{The constraint matrix of LP formulation (11)---(14) is totally unimodular, due to which $x_{ij}\in\{0,1\}$ for any basic solution.} \newpage \noindent\hfil \xymatrix @C=48pt {v_1\ar@{-}[rr]|{_{13}}\ar@{-}[rrd]|{_{21}}\ar@{-}[rrddd]|(.2){_{20}}&& v_9\\ v_2\ar@{-}[rr]|{_{12}}\ar@{-}[rrdd]|(.3){_{8}} \ar@{-}[rrddd]|(.4){_{26}}&&v_{10}\\ v_3\ar@{-}[rr]|(.2){_{22}}\ar@{-}[rrdd]|(.3){_{11}}&&v_{11}\\ v_4\ar@{-}[rruuu]|(.6){_{12}}\ar@{-}[rr]|(.2){_{36}} \ar@{-}[rrdd]|(.7){_{25}}&&v_{12}\\ v_5\ar@{-}[rruu]|(.42){_{41}}\ar@{-}[rru]|(.4){_{40}} \ar@{-}[rr]|(.75){_{11}}\ar@{-}[rrd]|(.6){_{4}}\ar@{-}[rrdd]|{_{8}} \ar@{-}[rrddd]|{_{35}}\ar@{-}[rrdddd]|{_{32}}&&v_{13}\\ v_6\ar@{-}[rruuuuu]|(.7){_{13}}&&v_{14}\\ v_7\ar@{-}[rruuuuu]|(.15){_{19}}&&v_{15}\\ v_8\ar@{-}[rruuuuuu]|(.25){_{39}}\ar@{-}[rruuuuu]|(.65){_{15}}&& v_{16}\\ &&v_{17}\\ } \medskip \noindent\hfil Fig.~3. An example of the assignment problem. \medskip Similarly, the perfect assignment problem can be naturally formulated as the following LP problem: \noindent \hspace{1in}minimize (or maximize) $$z=\sum_{(i,j)\in E}c_{ij}x_{ij}\eqno(15)$$ \hspace{1in}subject to $$\sum_{(i,j)\in E}x_{ij}=1\ \ \ \hbox{for all}\ i\in R\eqno(16)$$ $$\sum_{(i,j)\in E}x_{ij}=1\ \ \ \hbox{for all}\ j\in S\eqno(17)$$ $$\ \ \ \ \ \ \ \ 0\leq x_{ij}\leq 1\ \ \ \hbox{for all}\ (i,j)\in E \eqno(18)$$ \noindent where variables $x_{ij}$ have the same meaning as for (11)---(14) above. In GLPK an undirected bipartite graph $G=(R\cup S,E)$ is represented as directed graph $\overline{G}=(V,A)$, where $V=R\cup S$ and $A=\{(i,j):(i,j)\in E\}$, i.e. every edge $(i,j)\in E$ in $G$ corresponds to arc $(i\rightarrow j)\in A$ in $\overline{G}$. \newpage \setlength{\parskip}{4.4pt} \subsection{glp\_read\_asnprob --- read assignment problem data in DIMACS format} \synopsis \begin{verbatim} int glp_read_asnprob(glp_graph *G, int v_set, int a_cost, const char *fname); \end{verbatim} \description The routine \verb|glp_read_asnprob| reads the assignment problem data from a text file in DIMACS format. The parameter \verb|G| specifies the graph object, to which the problem data have to be stored. Note that before reading data the current content of the graph object is completely erased with the routine \verb|glp_erase_graph|. The parameter \verb|v_set| specifies an offset of the field of type \verb|int| in the vertex data block, to which the routine stores the node set indicator: 0 --- the node is in set $R$; 1 --- the node is in set $S$. \noindent If \verb|v_set| $<0$, the node set indicator is not stored. The parameter \verb|a_cost| specifies an offset of the field of type \verb|double| in the arc data block, to which the routine stores the edge cost $c_{ij}$. If \verb|a_cost| $<0$, the edge cost is not stored. The character string \verb|fname| specifies the name of a text file to be read in. (If the file name name ends with the suffix `\verb|.gz|', the file is assumed to be compressed, in which case the routine decompresses it ``on the fly''.) \returns If the operation was successful, the routine returns zero. Otherwise, it prints an error message and returns non-zero. \para{Example.} Below here is an example program that read the assignment problem data in DIMACS format from a text file `\verb|sample.asn|'. \begin{footnotesize} \begin{verbatim} typedef struct { /* vertex data block */ ... int set; ... } v_data; typedef struct { /* arc data block */ ... double cost; ... } a_data; int main(void) { glp_graph *G; int ret; G = glp_create_graph(sizeof(v_data), sizeof(a_data)); ret = glp_read_asnprob(G, offsetof(v_data, set), offsetof(a_data, cost), "sample.asn"); if (ret != 0) goto ... ... } \end{verbatim} \end{footnotesize} \setlength{\parskip}{5pt} \newpage \para{DIMACS assignment problem format\footnote{This material is based on the paper ``The First DIMACS International Algorithm Implementation Challenge: Problem Definitions and Specifications'', which is publicly available at \url{http://dimacs.rutgers.edu/Challenges/}.}} \label{subsecasnprob} The DIMACS input file is a plain ASCII text file. It contains {\it lines} of several types described below. A line is terminated with an end-of-line character. Fields in each line are separated by at least one blank space. Each line begins with a one-character designator to identify the line type. Note that DIMACS requires all numerical quantities to be integers in the range $[-2^{31},\ 2^{31}-1]$ while GLPK allows the quantities to be floating-point numbers. \para{Comment lines.} Comment lines give human-readable information about the file and are ignored by programs. Comment lines can appear anywhere in the file. Each comment line begins with a lower-case character \verb|c|. \begin{verbatim} c This is a comment line \end{verbatim} \para{Problem line.} There is one problem line per data file. The problem line must appear before any node or arc descriptor lines. It has the following format: \begin{verbatim} p asn NODES EDGES \end{verbatim} \noindent The lower-case character \verb|p| signifies that this is a problem line. The three-character problem designator \verb|asn| identifies the file as containing specification information for the assignment problem. The \verb|NODES| field contains an integer value specifying the total number of nodes in the graph (i.e. in both sets $R$ and $S$). The \verb|EDGES| field contains an integer value specifying the number of edges in the graph. \para{Node descriptors.} All node descriptor lines must appear before all edge descriptor lines. The node descriptor lines lists the nodes in set $R$ only, and all other nodes are assumed to be in set $S$. There is one node descriptor line for each such node, with the following format: \begin{verbatim} n ID \end{verbatim} \noindent The lower-case character \verb|n| signifies that this is a node descriptor line. The \verb|ID| field gives a node identification number, an integer between 1 and \verb|NODES|. \para{Edge descriptors.} There is one edge descriptor line for each edge in the graph. Edge descriptor lines are of the following format: \begin{verbatim} a SRC DST COST \end{verbatim} \noindent The lower-case character \verb|a| signifies that this is an edge descriptor line. For each edge $(i,j)$, where $i\in R$ and $j\in S$, the \verb|SRC| field gives the identification number of vertex $i$, and the \verb|DST| field gives the identification number of vertex $j$. Identification numbers are integers between 1 and \verb|NODES|. The \verb|COST| field contains the cost of edge $(i,j)$. \para{Example.} Below here is an example of the data file in DIMACS format corresponding to the assignment problem shown on Fig~3. \begin{footnotesize} \begin{verbatim} c sample.asn c c This is an example of the assignment problem data c in DIMACS format. c p asn 17 22 c n 1 n 2 n 3 n 4 n 5 n 6 n 7 n 8 c a 1 9 13 a 1 10 21 a 1 12 20 a 2 10 12 a 2 12 8 a 2 13 26 a 3 11 22 a 3 13 11 a 4 9 12 a 4 12 36 a 4 14 25 a 5 11 41 a 5 12 40 a 5 13 11 a 5 14 4 a 5 15 8 a 5 16 35 a 5 17 32 a 6 9 13 a 7 10 19 a 8 10 39 a 8 11 15 c c eof \end{verbatim} \end{footnotesize} \subsection{glp\_write\_asnprob --- write assignment problem data in DIMACS format} \synopsis \begin{verbatim} int glp_write_asnprob(glp_graph *G, int v_set, int a_cost, const char *fname); \end{verbatim} \description The routine \verb|glp_write_asnprob| writes the assignment problem data to a text file in DIMACS format. The parameter \verb|G| is the graph program object, which specifies the assignment problem instance. The parameter \verb|v_set| specifies an offset of the field of type \verb|int| in the vertex data block, which contains the node set indicator: 0 --- the node is in set $R$; 1 --- the node is in set $S$. \noindent If \verb|v_set| $<0$, it is assumed that a node having no incoming arcs is in set $R$, and a node having no outgoing arcs is in set $S$. The parameter \verb|a_cost| specifies an offset of the field of type \verb|double| in the arc data block, which contains $c_{ij}$, the edge cost. If \verb|a_cost| $<0$, it is assumed that $c_{ij}=1$ for all edges. \newpage The character string \verb|fname| specifies a name of the text file to be written out. (If the file name ends with suffix `\verb|.gz|', the file is assumed to be compressed, in which case the routine performs automatic compression on writing it.) \para{Note} The routine \verb|glp_write_asnprob| does not check that the specified graph object correctly represents a bipartite graph. To make sure that the problem data are correct, use the routine \verb|glp_check_asnprob|. \returns If the operation was successful, the routine returns zero. Otherwise, it prints an error message and returns non-zero. \vspace*{-4pt} \subsection{glp\_check\_asnprob --- check correctness of assignment problem data} \synopsis \begin{verbatim} int glp_check_asnprob(glp_graph *G, int v_set); \end{verbatim} \description The routine \verb|glp_check_asnprob| checks that the specified graph object \verb|G| correctly represents a bipartite graph. The parameter \verb|v_set| specifies an offset of the field of type \verb|int| in the vertex data block, which contains the node set indicator: 0 --- the node is in set $R$; 1 --- the node is in set $S$. \noindent If \verb|v_set| $<0$, it is assumed that a node having no incoming arcs is in set $R$, and a node having no outgoing arcs is in set $S$. \returns 0 --- the data are correct; 1 --- the set indicator of some node is 0, however, that node has one or more incoming arcs; 2 --- the set indicator of some node is 1, however, that node has one or more outgoing arcs; 3 --- the set indicator of some node is invalid (neither 0 nor 1); 4 --- some node has both incoming and outgoing arcs. \subsection{glp\_asnprob\_lp --- convert assignment problem to LP} \synopsis \begin{verbatim} int glp_asnprob_lp(glp_prob *P, int form, glp_graph *G, int names, int v_set, int a_cost); \end{verbatim} \description The routine \verb|glp_asnprob_lp| builds LP problem, which corresponds to the specified assignment problem. \newpage The parameter \verb|P| is the resultant LP problem object to be built. Note that on entry its current content is erased with the routine \verb|glp_erase_prob|. The parameter \verb|form| defines which LP formulation should be used: \verb|GLP_ASN_MIN| --- perfect matching (15)---(18), minimization; \verb|GLP_ASN_MAX| --- perfect matching (15)---(18), maximization; \verb|GLP_ASN_MMP| --- maximum weighted matching (11)---(14). The parameter \verb|G| is the graph program object, which specifies the assignment problem instance. The parameter \verb|names| is a flag. If it is \verb|GLP_ON|, the routine uses symbolic names of the graph object components to assign symbolic names to the LP problem object components. If the \verb|flag| is \verb|GLP_OFF|, no symbolic names are assigned. The parameter \verb|v_set| specifies an offset of the field of type \verb|int| in the vertex data block, which contains the node set indicator: 0 --- the node is in set $R$; 1 --- the node is in set $S$. \noindent If \verb|v_set| $<0$, it is assumed that a node having no incoming arcs is in set $R$, and a node having no outgoing arcs is in set $S$. The parameter \verb|a_cost| specifies an offset of the field of type \verb|double| in the arc data block, which contains $c_{ij}$, the edge cost. If \verb|a_cost| $<0$, it is assumed that $c_{ij}=1$ for all edges. \returns If the LP problem has been successfully built, the routine \verb|glp_asnprob_lp| returns zero, otherwise, non-zero (see the routine \verb|glp_check_asnprob|). \para{Example} The example program below reads the assignment problem instance in DIMACS format from file `\verb|sample.asn|', converts the instance to LP (11)---(14), and writes the resultant LP in CPLEX format to file `\verb|matching.lp|'. \begin{footnotesize} \begin{verbatim} #include #include typedef struct { int set; } v_data; typedef struct { double cost; } a_data; int main(void) { glp_graph *G; glp_prob *P; G = glp_create_graph(sizeof(v_data), sizeof(a_data)); glp_read_asnprob(G, offsetof(v_data, set), offsetof(a_data, cost), "sample.asn"); P = glp_create_prob(); glp_asnprob_lp(P, GLP_ASN_MMP, G, GLP_ON, offsetof(v_data, set), offsetof(a_data, cost)); glp_delete_graph(G); glp_write_lp(P, NULL, "matching.lp"); glp_delete_prob(P); return 0; } \end{verbatim} \end{footnotesize} \newpage If `\verb|sample.asn|' is the example data file from the subsection describing \verb|glp_read_asnprob|, file `\verb|matching.lp|' may look like follows: \begin{footnotesize} \begin{verbatim} Maximize obj: + 20 x(1,12) + 21 x(1,10) + 13 x(1,9) + 26 x(2,13) + 8 x(2,12) + 12 x(2,10) + 11 x(3,13) + 22 x(3,11) + 25 x(4,14) + 36 x(4,12) + 12 x(4,9) + 32 x(5,17) + 35 x(5,16) + 8 x(5,15) + 4 x(5,14) + 11 x(5,13) + 40 x(5,12) + 41 x(5,11) + 13 x(6,9) + 19 x(7,10) + 15 x(8,11) + 39 x(8,10) Subject To r_1: + x(1,9) + x(1,10) + x(1,12) <= 1 r_2: + x(2,10) + x(2,12) + x(2,13) <= 1 r_3: + x(3,11) + x(3,13) <= 1 r_4: + x(4,9) + x(4,12) + x(4,14) <= 1 r_5: + x(5,11) + x(5,12) + x(5,13) + x(5,14) + x(5,15) + x(5,16) + x(5,17) <= 1 r_6: + x(6,9) <= 1 r_7: + x(7,10) <= 1 r_8: + x(8,10) + x(8,11) <= 1 r_9: + x(6,9) + x(4,9) + x(1,9) <= 1 r_10: + x(8,10) + x(7,10) + x(2,10) + x(1,10) <= 1 r_11: + x(8,11) + x(5,11) + x(3,11) <= 1 r_12: + x(5,12) + x(4,12) + x(2,12) + x(1,12) <= 1 r_13: + x(5,13) + x(3,13) + x(2,13) <= 1 r_14: + x(5,14) + x(4,14) <= 1 r_15: + x(5,15) <= 1 r_16: + x(5,16) <= 1 r_17: + x(5,17) <= 1 Bounds 0 <= x(1,12) <= 1 0 <= x(1,10) <= 1 0 <= x(1,9) <= 1 0 <= x(2,13) <= 1 0 <= x(2,12) <= 1 0 <= x(2,10) <= 1 0 <= x(3,13) <= 1 0 <= x(3,11) <= 1 0 <= x(4,14) <= 1 0 <= x(4,12) <= 1 0 <= x(4,9) <= 1 0 <= x(5,17) <= 1 0 <= x(5,16) <= 1 0 <= x(5,15) <= 1 0 <= x(5,14) <= 1 0 <= x(5,13) <= 1 0 <= x(5,12) <= 1 0 <= x(5,11) <= 1 0 <= x(6,9) <= 1 0 <= x(7,10) <= 1 0 <= x(8,11) <= 1 0 <= x(8,10) <= 1 End \end{verbatim} \end{footnotesize} \newpage \subsection{glp\_asnprob\_okalg --- solve assignment problem with out-of-kilter\\algorithm} \synopsis \begin{verbatim} int glp_asnprob_okalg(int form, glp_graph *G, int v_set, int a_cost, double *sol, int a_x); \end{verbatim} \description The routine \verb|glp_mincost_okalg| finds optimal solution to the assignment problem with the out-of-kilter algorithm.\footnote{GLPK implementation of the out-of-kilter algorithm is based on the following book: L.~R.~Ford,~Jr., and D.~R.~Fulkerson, ``Flows in Networks,'' The RAND Corp., Report R-375-PR (August 1962), Chap. III ``Minimal Cost Flow Problems,'' pp.~113-26.} Note that this routine requires all the problem data to be integer-valued. The parameter \verb|form| defines which LP formulation should be used: \verb|GLP_ASN_MIN| --- perfect matching (15)---(18), minimization; \verb|GLP_ASN_MAX| --- perfect matching (15)---(18), maximization; \verb|GLP_ASN_MMP| --- maximum weighted matching (11)---(14). The parameter \verb|G| is the graph program object, which specifies the assignment problem instance. The parameter \verb|v_set| specifies an offset of the field of type \verb|int| in the vertex data block, which contains the node set indicator: 0 --- the node is in set $R$; 1 --- the node is in set $S$. \noindent If \verb|v_set| $<0$, it is assumed that a node having no incoming arcs is in set $R$, and a node having no outgoing arcs is in set $S$. The parameter \verb|a_cost| specifies an offset of the field of type \verb|double| in the arc data block, which contains $c_{ij}$, the edge cost. This value must be integer in the range [\verb|-INT_MAX|, \verb|+INT_MAX|]. If \verb|a_cost| $<0$, it is assumed that $c_{ij}=1$ for all edges. The parameter \verb|sol| specifies a location, to which the routine stores the objective value (that is, the total cost) found. If \verb|sol| is \verb|NULL|, the objective value is not stored. The parameter \verb|a_x| specifies an offset of the field of type \verb|int| in the arc data block, to which the routine stores $x_{ij}$. If \verb|a_x| $<0$, this value is not stored. \returns \begin{retlist} 0 & Optimal solution found.\\ \verb|GLP_ENOPFS| & No (primal) feasible solution exists.\\ \verb|GLP_EDATA| & Unable to start the search, because the assignment problem data are either incorrect (this error is detected by the routine \verb|glp_check_asnprob|), not integer-valued or out of range.\\ \verb|GLP_ERANGE| & The search was prematurely terminated because of integer overflow.\\ \verb|GLP_EFAIL| & An error has been detected in the program logic. (If this code is returned for your problem instance, please report to \verb||.)\\ \end{retlist} \newpage \para{Comments} Since the out-of-kilter algorithm is designed to find a minimal cost circulation, the routine \verb|glp_asnprob_okalg| converts the original graph to a network suitable for this algorithm in the following way:\footnote{The conversion is performed internally and does not change the original graph program object passed to the routine.} 1) it replaces each edge $(i,j)$ by arc $(i\rightarrow j)$, flow $x_{ij}$ through which has zero lower bound ($l_{ij}=0$), unity upper bound ($u_{ij}=1$), and per-unit cost $+c_{ij}$ (in case of \verb|GLP_ASN_MIN|), or $-c_{ij}$ (in case of \verb|GLP_ASN_MAX| and \verb|GLP_ASN_MMP|); 2) then it adds one auxiliary feedback node $k$; 3) for each original node $i\in R$ the routine adds auxiliary supply arc $(k\rightarrow i)$, flow $x_{ki}$ through which is costless ($c_{ki}=0$) and either fixed at 1 ($l_{ki}=u_{ki}=1$, in case of \verb|GLP_ASN_MIN| and \verb|GLP_ASN_MAX|) or has zero lower bound and unity upper bound ($l_{ij}=0$, $u_{ij}=1$, in case of \verb|GLP_ASN_MMP|); 4) similarly, for each original node $j\in S$ the routine adds auxiliary demand arc $(j\rightarrow k)$, flow $x_{jk}$ through which is costless ($c_{jk}=0$) and either fixed at 1 ($l_{jk}=u_{jk}=1$, in case of \verb|GLP_ASN_MIN| and \verb|GLP_ASN_MAX|) or has zero lower bound and unity upper bound ($l_{jk}=0$, $u_{jk}=1$, in case of \verb|GLP_ASN_MMP|). \para{Example} The example program shown below reads the assignment problem instance in DIMACS format from file `\verb|sample.asn|', solves it by using the routine \verb|glp_asnprob_okalg|, and writes the solution found to the standard output. \begin{footnotesize} \begin{verbatim} #include #include #include #include typedef struct { int set; } v_data; typedef struct { double cost; int x; } e_data; #define node(v) ((v_data *)((v)->data)) #define edge(e) ((e_data *)((e)->data)) int main(void) { glp_graph *G; glp_vertex *v; glp_arc *e; int i, ret; double sol; G = glp_create_graph(sizeof(v_data), sizeof(e_data)); glp_read_asnprob(G, offsetof(v_data, set), offsetof(e_data, cost), "sample.asn"); ret = glp_asnprob_okalg(GLP_ASN_MMP, G, offsetof(v_data, set), offsetof(e_data, cost), &sol, offsetof(e_data, x)); printf("ret = %d; sol = %5g\n", ret, sol); for (i = 1; i <= G->nv; i++) { v = G->v[i]; for (e = v->out; e != NULL; e = e->t_next) printf("edge %2d %2d: x = %d; c = %g\n", e->tail->i, e->head->i, edge(e)->x, edge(e)->cost); } glp_delete_graph(G); return 0; } \end{verbatim} \end{footnotesize} If `\verb|sample.asn|' is the example data file from the subsection describing \verb|glp_read_asnprob|, the output may look like follows: \begin{footnotesize} \begin{verbatim} Reading assignment problem data from `sample.asn'... Assignment problem has 8 + 9 = 17 nodes and 22 arcs 38 lines were read ret = 0; sol = 180 edge 1 12: x = 1; c = 20 edge 1 10: x = 0; c = 21 edge 1 9: x = 0; c = 13 edge 2 13: x = 1; c = 26 edge 2 12: x = 0; c = 8 edge 2 10: x = 0; c = 12 edge 3 13: x = 0; c = 11 edge 3 11: x = 1; c = 22 edge 4 14: x = 1; c = 25 edge 4 12: x = 0; c = 36 edge 4 9: x = 0; c = 12 edge 5 17: x = 0; c = 32 edge 5 16: x = 1; c = 35 edge 5 15: x = 0; c = 8 edge 5 14: x = 0; c = 4 edge 5 13: x = 0; c = 11 edge 5 12: x = 0; c = 40 edge 5 11: x = 0; c = 41 edge 6 9: x = 1; c = 13 edge 7 10: x = 0; c = 19 edge 8 11: x = 0; c = 15 edge 8 10: x = 1; c = 39 \end{verbatim} \end{footnotesize} \subsection{glp\_asnprob\_hall --- find bipartite matching of maximum cardinality} \synopsis \begin{verbatim} int glp_asnprob_hall(glp_graph *G, int v_set, int a_x); \end{verbatim} \description The routine \verb|glp_asnprob_hall| finds a matching of maximal cardinality in the specified bipartite graph. It uses a version of the Fortran routine \verb|MC21A| developed by I.~S.~Duff\footnote{I.~S.~Duff, Algorithm 575: Permutations for zero-free diagonal, ACM Trans. on Math. Softw. 7 (1981),\linebreak pp.~387-390.}, which implements Hall's algorithm.\footnote{M.~Hall, ``An Algorithm for Distinct Representatives,'' Am. Math. Monthly 63 (1956), pp.~716-717.} The parameter \verb|G| is a pointer to the graph program object. The parameter \verb|v_set| specifies an offset of the field of type \verb|int| in the vertex data block, which contains the node set indicator: 0 --- the node is in set $R$; 1 --- the node is in set $S$. \newpage \noindent If \verb|v_set| $<0$, it is assumed that a node having no incoming arcs is in set $R$, and a node having no outgoing arcs is in set $S$. The parameter \verb|a_x| specifies an offset of the field of type \verb|int| in the arc data block, to which the routine stores $x_{ij}$. If \verb|a_x| $<0$, this value is not stored. \returns The routine \verb|glp_asnprob_hall| returns the cardinality of the matching found. However, if the specified graph is incorrect (as detected by the routine \verb|glp_check_asnprob|), this routine returns a negative value. \para{Comments} The same solution may be obtained with the routine \verb|glp_asnprob_okalg| (for LP formulation \verb|GLP_ASN_MMP| and all edge costs equal to 1). However, the routine \verb|glp_asnprob_hall| is much faster. \para{Example} The example program shown below reads the assignment problem instance in DIMACS format from file `\verb|sample.asn|', finds a bipartite matching of maximal cardinality by using the routine \verb|glp_asnprob_hall|, and writes the solution found to the standard output. \begin{footnotesize} \begin{verbatim} #include #include #include #include typedef struct { int set; } v_data; typedef struct { int x; } e_data; #define node(v) ((v_data *)((v)->data)) #define edge(e) ((e_data *)((e)->data)) int main(void) { glp_graph *G; glp_vertex *v; glp_arc *e; int i, card; G = glp_create_graph(sizeof(v_data), sizeof(e_data)); glp_read_asnprob(G, offsetof(v_data, set), -1, "sample.asn"); card = glp_asnprob_hall(G, offsetof(v_data, set), offsetof(e_data, x)); printf("card = %d\n", card); for (i = 1; i <= G->nv; i++) { v = G->v[i]; for (e = v->out; e != NULL; e = e->t_next) printf("edge %2d %2d: x = %d\n", e->tail->i, e->head->i, edge(e)->x); } glp_delete_graph(G); return 0; } \end{verbatim} \end{footnotesize} If `\verb|sample.asn|' is the example data file from the subsection describing \verb|glp_read_asnprob|, the output may look like follows: \newpage \begin{footnotesize} \begin{verbatim} Reading assignment problem data from `sample.asn'... Assignment problem has 8 + 9 = 17 nodes and 22 arcs 38 lines were read card = 7 edge 1 12: x = 1 edge 1 10: x = 0 edge 1 9: x = 0 edge 2 13: x = 1 edge 2 12: x = 0 edge 2 10: x = 0 edge 3 13: x = 0 edge 3 11: x = 1 edge 4 14: x = 1 edge 4 12: x = 0 edge 4 9: x = 0 edge 5 17: x = 1 edge 5 16: x = 0 edge 5 15: x = 0 edge 5 14: x = 0 edge 5 13: x = 0 edge 5 12: x = 0 edge 5 11: x = 0 edge 6 9: x = 1 edge 7 10: x = 1 edge 8 11: x = 0 edge 8 10: x = 0 \end{verbatim} \end{footnotesize} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newpage \section{Critical path problem} \subsection{Background} The {\it critical path problem} (CPP) is stated as follows. Let there be given a project $J$, which is a set of jobs (tasks, activities, etc.). Performing each job $i\in J$ requires time $t_i\geq 0$. Besides, over the set $J$ there is given a precedence relation $R\subseteq J\times J$, where $(i,j)\in R$ means that job $i$ immediately precedes job $j$, i.e. performing job $j$ cannot start until job $i$ has been completely performed. The problem is to find starting times $x_i$ for each job $i\in J$, which satisfy to the precedence relation and minimize the total duration (makespan) of the project. The following is an example of the critical path problem: \bigskip \begin{center} \begin{tabular}{|c|l|c|c|} \hline Job&Desription&Time&Predecessors\\ \hline A&Excavate&3&---\\ B&Lay foundation&4&A\\ C&Rough plumbing&3&B\\ D&Frame&10&B\\ E&Finish exterior&8&D\\ F&Install HVAC&4&D\\ G&Rough electric&6&D\\ H&Sheet rock&8&C, E, F, G\\ I&Install cabinets&5&H\\ J&Paint&5&H\\ K&Final plumbing&4&I\\ L&Final electric&2&J\\ M&Install flooring&4&K, L\\ \hline \end{tabular} \end{center} \bigskip Obviously, the project along with the precedence relation can be represented as a directed graph $G=(J,R)$ called {\it project network}, where each node $i\in J$ corresponds to a job, and arc $(i\rightarrow j)\in R$ means that job $i$ immediately precedes job $j$.\footnote{There exists another network representation of the critical path problem, where jobs correspond to arcs while nodes correspond to events introduced to express the precedence relation. That representation, however, is much less convenient than the one, where jobs are represented as nodes of the network.} The project network for the example above is shown on Fig.~4. \hspace*{.5in} \xymatrix {&&&C|3\ar[rd]&&I|5\ar[r]&K|4\ar[rd]&\\ A|3\ar[r]&B|4\ar[rru]\ar[rd]&&E|8\ar[r]&H|8\ar[ru]\ar[rd]&&&M|4\\ &&D|10\ar[ru]\ar[r]\ar[rd]&F|4\ar[ru]&&J|5\ar[r]&L|2\ar[ru]&\\ &&&G|6\ar[ruu]&&&&\\ } \medskip \noindent\hfil Fig.~4. An example of the project network. \newpage May note that the project network must be acyclic; otherwise, it would be impossible to satisfy to the precedence relation for any job that belongs to a cycle. The critical path problem can be naturally formulated as the following LP problem: \medskip \noindent \hspace{.5in}minimize $$z\eqno(19)$$ \hspace{.5in}subject to $$x_i+t_i\leq z\ \ \ \hbox{for all}\ i\in J\ \ \ \ \eqno(20)$$ $$x_i+t_i\leq x_j\ \ \ \hbox{for all}\ (i,j)\in R\eqno(21)$$ $$x_i\geq 0\ \ \ \ \ \ \ \hbox{for all}\ i\in J\ \ \eqno(22)$$ The inequality constraints (21), which are active in the optimal solution, define so called {\it critical path} having the following property: the minimal project duration $z$ can be decreased only by decreasing the times $t_j$ for jobs on the critical path, and delaying any critical job delays the entire project. \subsection{glp\_cpp --- solve critical path problem} \synopsis \begin{verbatim} double glp_cpp(glp_graph *G, int v_t, int v_es, int v_ls); \end{verbatim} \description The routine \verb|glp_cpp| solves the critical path problem represented in the form of the project network. The parameter \verb|G| is a pointer to the graph object, which specifies the project network. This graph must be acyclic. Multiple arcs are allowed being considered as single arcs. The parameter \verb|v_t| specifies an offset of the field of type \verb|double| in the vertex data block, which contains time $t_i\geq 0$ needed to perform corresponding job $j\in J$. If \verb|v_t| $<0$, it is assumed that $t_i=1$ for all jobs. The parameter \verb|v_es| specifies an offset of the field of type \verb|double| in the vertex data block, to which the routine stores the {\it earliest start time} for corresponding job. If \verb|v_es| $<0$, this time is not stored. The parameter \verb|v_ls| specifies an offset of the field of type \verb|double| in the vertex data block, to which the routine stores the {\it latest start time} for corresponding job. If \verb|v_ls| $<0$, this time is not stored. The difference between the latest and earliest start times of some job is called its {\it time reserve}. Delaying a job within its time reserve does not affect the project duration, so if the time reserve is zero, the corresponding job is critical. \para{Returns} The routine \verb|glp_cpp| returns the minimal project duration, i.e. minimal time needed to perform all jobs in the project. \newpage \para{Example} The example program below solves the critical path problem shown on Fig.~4 by using the routine \verb|glp_cpp| and writes the solution found on the standard output. \begin{footnotesize} \begin{verbatim} #include #include #include #include typedef struct { double t, es, ls; } v_data; #define node(v) ((v_data *)((v)->data)) int main(void) { glp_graph *G; int i; double t, es, ef, ls, lf, total; G = glp_create_graph(sizeof(v_data), 0); glp_add_vertices(G, 13); node(G->v[1])->t = 3; /* A: Excavate */ node(G->v[2])->t = 4; /* B: Lay foundation */ node(G->v[3])->t = 3; /* C: Rough plumbing */ node(G->v[4])->t = 10; /* D: Frame */ node(G->v[5])->t = 8; /* E: Finish exterior */ node(G->v[6])->t = 4; /* F: Install HVAC */ node(G->v[7])->t = 6; /* G: Rough elecrtic */ node(G->v[8])->t = 8; /* H: Sheet rock */ node(G->v[9])->t = 5; /* I: Install cabinets */ node(G->v[10])->t = 5; /* J: Paint */ node(G->v[11])->t = 4; /* K: Final plumbing */ node(G->v[12])->t = 2; /* L: Final electric */ node(G->v[13])->t = 4; /* M: Install flooring */ glp_add_arc(G, 1, 2); /* A precedes B */ glp_add_arc(G, 2, 3); /* B precedes C */ glp_add_arc(G, 2, 4); /* B precedes D */ glp_add_arc(G, 4, 5); /* D precedes E */ glp_add_arc(G, 4, 6); /* D precedes F */ glp_add_arc(G, 4, 7); /* D precedes G */ glp_add_arc(G, 3, 8); /* C precedes H */ glp_add_arc(G, 5, 8); /* E precedes H */ glp_add_arc(G, 6, 8); /* F precedes H */ glp_add_arc(G, 7, 8); /* G precedes H */ glp_add_arc(G, 8, 9); /* H precedes I */ glp_add_arc(G, 8, 10); /* H precedes J */ glp_add_arc(G, 9, 11); /* I precedes K */ glp_add_arc(G, 10, 12); /* J precedes L */ glp_add_arc(G, 11, 13); /* K precedes M */ glp_add_arc(G, 12, 13); /* L precedes M */ total = glp_cpp(G, offsetof(v_data, t), offsetof(v_data, es), offsetof(v_data, ls)); printf("Minimal project duration is %.2f\n\n", total); printf("Job Time ES EF LS LF\n"); printf("--- ------ ------ ------ ------ ------\n"); for (i = 1; i <= G->nv; i++) { t = node(G->v[i])->t; es = node(G->v[i])->es; ef = es + node(G->v[i])->t; ls = node(G->v[i])->ls; lf = ls + node(G->v[i])->t; printf("%3d %6.2f %s %6.2f %6.2f %6.2f %6.2f\n", i, t, ls - es < 0.001 ? "*" : " ", es, ef, ls, lf); } glp_delete_graph(G); return 0; } \end{verbatim} \end{footnotesize} The output from the example program shown below includes job number, the time needed to perform a job, earliest start time (\verb|ES|), earliest finish time (\verb|EF|), latest start time (\verb|LS|), and latest finish time (\verb|LF|) for each job in the project. Critical jobs are marked by asterisks. \begin{footnotesize} \begin{verbatim} Minimal project duration is 46.00 Job Time ES EF LS LF --- ------ ------ ------ ------ ------ 1 3.00 * 0.00 3.00 0.00 3.00 2 4.00 * 3.00 7.00 3.00 7.00 3 3.00 7.00 10.00 22.00 25.00 4 10.00 * 7.00 17.00 7.00 17.00 5 8.00 * 17.00 25.00 17.00 25.00 6 4.00 17.00 21.00 21.00 25.00 7 6.00 17.00 23.00 19.00 25.00 8 8.00 * 25.00 33.00 25.00 33.00 9 5.00 * 33.00 38.00 33.00 38.00 10 5.00 33.00 38.00 35.00 40.00 11 4.00 * 38.00 42.00 38.00 42.00 12 2.00 38.00 40.00 40.00 42.00 13 4.00 * 42.00 46.00 42.00 46.00 \end{verbatim} \end{footnotesize} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \end{document} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Graph Optimization API Routines} \section{Maximum clique problem} \subsection{Background} The {\it maximum clique problem (MCP)} is a classic combinatorial optimization problem. Given an undirected graph $G=(V,E)$, where $V$ is a set of vertices, and $E$ is a set of edges, this problem is to find the largest {\it clique} $C\subseteq G$, i.e. the largest induced complete subgraph. A generalization of this problem is the {\it maximum weight clique problem (MWCP)}, which is to find a clique $C\subseteq G$ of the largest weight $\displaystyle\sum_{v\in C}w(v)\rightarrow\max$, where $w(v)$ is a weight of vertex $v\in V$. An example of the maximum weight clique problem is shown on Fig.~5. \begin{figure} \noindent\hfil \begin{tabular}{c} {\xymatrix %@C=16pt {&&&{v_1}\ar@{-}[lllddd]\ar@{-}[llddddd]\ar@{-}[dddddd] \ar@{-}[rrrddd]&&&\\ &{v_2}\ar@{-}[rrrr]\ar@{-}[rrrrdddd]\ar@{-}[rrddddd]\ar@{-}[dddd]&&&& {v_3}\ar@{-}[llllldd]\ar@{-}[lllldddd]\ar@{-}[dddd]&\\ &&&&&&\\ {v_4}\ar@{-}[rrrrrr]\ar@{-}[rrrddd]&&&&&&{v_5}\ar@{-}[lllddd] \ar@{-}[ldd]\\ &&&&&&\\ &{v_6}\ar@{-}[rrrr]&&&&{v_7}&\\ &&&{v_8}&&&\\ }} \end{tabular} \begin{tabular}{r@{\ }c@{\ }l} $w(v_1)$&=&3\\$w(v_2)$&=&4\\$w(v_3)$&=&8\\$w(v_4)$&=&1\\ $w(v_5)$&=&5\\$w(v_6)$&=&2\\$w(v_7)$&=&1\\$w(v_8)$&=&3\\ \end{tabular} \bigskip \begin{center} Fig.~5. An example of the maximum weight clique problem. \end{center} \end{figure} \subsection{glp\_wclique\_exact --- find maximum weight clique with exact algorithm} \synopsis \begin{verbatim} int glp_wclique_exact(glp_graph *G, int v_wgt, double *sol, int v_set); \end{verbatim} \description The routine {\tt glp\_wclique\_exact} finds a maximum weight clique in the specified undirected graph with the exact algorithm developed by Patric \"Osterg{\aa}rd.\footnote{P.~R.~J.~\"Osterg{\aa}rd, A new algorithm for the maximum-weight clique problem, Nordic J. of Computing, Vol.~8, No.~4, 2001, pp.~424--36.} The parameter {\tt G} is the program object, which specifies an undirected graph. Each arc $(x\rightarrow y)$ in {\tt G} is considered as edge $(x,y)$, self-loops are ignored, and multiple edges, if present, are replaced (internally) by simple edges. The parameter {\tt v\_wgt} specifies an offset of the field of type {\tt double} in the vertex data block, which contains a weight of corresponding vertex. Vertex weights must be integer-valued in the range $[0,$ {\tt INT\_MAX}$]$. If {\tt v\_wgt} $<0$, it is assumed that all vertices of the graph have the weight 1. \newpage The parameter {\tt sol} specifies a location, to which the routine stores the weight of the clique found (the clique weight is the sum of weights of all vertices included in the clique.) If {\tt sol} is {\tt NULL}, the solution is not stored. The parameter {\tt v\_set} specifies an offset of the field of type {\tt int} in the vertex data block, to which the routines stores a vertex flag: 1 means that the corresponding vertex is included in the clique found, and 0 otherwise. If {\tt v\_set} $<0$, vertex flags are not stored. \returns \begin{retlist} 0 & Optimal solution found.\\ \verb|GLP_EDATA| & Unable to start the search, because some vertex weights are either not integer-valued or out of range. This code is also returned if the sum of weights of all vertices exceeds {\tt INT\_MAX}. \\ \end{retlist} \para{Notes} 1. The routine {\it glp\_wclique\_exact} finds exact solution. Since both MCP and MWCP problems are NP-complete, the algorithm may require exponential time in worst cases. 2. Internally the specified graph is converted to an adjacency matrix in {\it dense} format. This requires about $|V|^2/16$ bytes of memory, where $|V|$ is the number of vertices in the graph. \para{Example} The example program shown below reads a MWCP instance in DIMACS clique/coloring format from file `\verb|sample.clq|', finds the clique of largest weight, and writes the solution found on the standard output. \newpage \begin{footnotesize} \begin{verbatim} #include #include #include #include typedef struct { double wgt; int set; } v_data; #define vertex(v) ((v_data *)((v)->data)) int main(void) { glp_graph *G; glp_vertex *v; int i, ret; double sol; G = glp_create_graph(sizeof(v_data), 0); glp_read_ccdata(G, offsetof(v_data, wgt), "sample.clq"); ret = glp_wclique_exact(G, offsetof(v_data, wgt), &sol, offsetof(v_data, set)); printf("ret = %d; sol = %g\n", ret, sol); for (i = 1; i <= G->nv; i++) { v = G->v[i]; printf("vertex %d: weight = %g, flag = %d\n", i, vertex(v)->wgt, vertex(v)->set); } glp_delete_graph(G); return 0; } \end{verbatim} \end{footnotesize} For the example shown on Fig.~5 the data file may look like follows: \begin{footnotesize} \begin{verbatim} c sample.clq c c This is an example of the maximum weight clique c problem in DIMACS clique/coloring format. c p edge 8 16 n 1 3 n 2 4 n 3 8 n 5 5 n 6 2 n 8 3 e 1 4 e 1 5 e 1 6 e 1 8 e 2 3 e 2 6 e 2 7 e 2 8 e 3 4 e 3 6 e 3 7 e 4 5 e 4 8 e 5 7 e 5 8 e 6 7 c c eof \end{verbatim} \end{footnotesize} The corresponding output from the example program is the following: \begin{footnotesize} \begin{verbatim} Reading graph from `sample.clq'... Graph has 8 vertices and 16 edges 28 lines were read ret = 0; sol = 15 vertex 1: weight = 3, flag = 0 vertex 2: weight = 4, flag = 1 vertex 3: weight = 8, flag = 1 vertex 4: weight = 1, flag = 0 vertex 5: weight = 5, flag = 0 vertex 6: weight = 2, flag = 1 vertex 7: weight = 1, flag = 1 vertex 8: weight = 3, flag = 0 \end{verbatim} \end{footnotesize} \end{document} glpk-5.0/doc/miplib2.txt0000644000062000006210000002057213766346220014354 0ustar maomkpasswdSolver: GLPSOL 4.40 (options used: --pcost) Computer: Intel Pentium 4, 3.0 GHz Platform: Cygwin 1.5.25 Compiler: GCC 3.4.4 (options used: -O3) Test set: MIPLIB 2.0 Problem Optimal Solution Cuts Used Nodes Iters Time,s Mem,MB -------- ---------------- --------- -------- ------ ------ ------ air01 +6.796000000e+03 3 41 < 1 1.2 air02 +7.810000000e+03 43 201 6 13.8 air03 +3.401600000e+05 33 414 12 21.0 air04 +5.613700000e+04 1901 109800 396 32.4 air05 +2.637400000e+04 6445 201649 452 45.0 air06 +4.964900000e+04 11 6868 31 18.1 bell3a +8.784303160e+05 --gomory 7965 42363 17 6.1 bell3b +1.178616062e+07 --gomory 6031 30467 19 3.2 bell4 +1.854148420e+07 --gomory 7203 25019 16 2.9 bell5 +8.966406492e+06 --gomory 5605 18555 8 1.5 bm23 +3.400000000e+01 373 878 < 1 0.2 cracpb1 +2.219900000e+04 47 5258 2 1.3 dcmulti +1.881820000e+05 743 3366 2 1.1 diamond infeasible 3 4 < 1 0.1 dsbmip -3.051981750e+02 --mir 217 46088 24 4.5 egout +5.681007000e+02 91 137 < 1 0.3 enigma +0.000000000e+00 16419 55071 6 3.2 fixnet3 +5.197300000e+04 81 380 < 1 1.4 fixnet4 +8.936000000e+03 211 1095 1 1.4 fixnet6 +3.983000000e+03 1031 3136 2 1.7 flugpl +1.201500000e+06 397 231 < 1 0.1 gen +1.123133627e+05 195 3991 1 1.7 khb05250 +1.069402260e+08 2163 14498 5 2.8 l152lav +4.722000000e+03 7419 95299 68 12.0 lp4l +2.967000000e+03 173 1331 2 1.7 lseu +1.120000000e+03 10821 31954 5 2.5 misc01 +5.635000000e+02 769 4593 1 0.5 misc02 +1.690000000e+03 29 282 < 1 0.2 misc03 +3.360000000e+03 957 6742 2 1.1 misc04 +2.666699247e+03 17 2052 1 7.0 misc05 +2.984500000e+03 293 2520 1 1.1 misc06 +1.285086074e+04 57 941 < 1 2.7 misc07 +2.810000000e+03 --mir 66075 579129 424 33.4 mod008 +3.070000000e+02 8185 24245 8 2.3 mod010 +6.548000000e+03 315 6283 7 5.3 mod011 mod013 +2.809500000e+02 545 1155 < 1 0.3 modglob +2.074050809e+07 --mir 5197 31985 20 2.8 noswot p0033 +3.089000000e+03 305 955 < 1 0.2 p0040 +6.202700000e+04 17 66 < 1 0.1 p0201 +7.615000000e+03 521 3660 1 0.9 p0282 +2.584110000e+05 623 1204 1 0.8 p0291 +5.223749000e+03 71 154 < 1 0.7 p0548 +8.691000000e+03 7617 23556 9 2.9 p2756 +3.124000000e+03 --mir 3911 15157 57 10.9 p6000 -2.451377000e+06 19209 40906 570 15.8 pipex +7.882630000e+02 1569 2469 < 1 0.4 qiu -1.328731369e+02 80473 1918742 1174 69.2 rentacar +3.035676098e+07 43 1649 3 12.1 rgn +8.219999924e+01 3325 18700 2 1.2 sample2 +3.750000000e+02 163 347 < 1 0.2 sentoy -7.772000000e+03 335 723 < 1 0.4 set1al +1.586975000e+04 --mir 17 532 < 1 1.5 set1ch set1cl +6.484250000e+03 --mir 1 502 < 1 1.1 stein15 +9.000000000e+00 87 375 < 1 0.2 stein27 +1.800000000e+01 3255 15327 2 1.0 stein45 +3.000000000e+01 52301 389140 139 19.2 stein9 +5.000000000e+00 17 45 < 1 0.1 vpm1 +2.000000000e+01 --mir 9 836 < 1 0.9 PROBLEM CHARACTERISTICS Problem Rows Cols ( Int 0/1) Nonz Best Solution -------- ------ ---------------------- ------ -------------------------- air01 24 771 ( all all) 4986 6796 (opt) air02 51 6774 ( all all) 68329 7810 (opt) air03 125 10757 ( all all) 101785 340160 (opt) air04 824 8904 ( all all) 81869 56138 (opt) air05 427 7195 ( all all) 59316 26402 (not opt) air06 826 8627 ( all all) 79433 49649 (opt) bell3a 124 133 ( 71 39) 441 878430.32 (opt) bell3b 124 133 ( 71 39) 441 11786160.62 (opt) bell4 106 117 ( 64 34) 385 18541484.20 (opt) bell5 92 104 ( 58 30) 340 8966406.49 (opt) bm23 21 27 ( all all) 505 34 (opt) cracpb1 144 572 ( all all) 4730 22199 (opt) dcmulti 291 548 ( 75 all) 1833 188182.0000 (opt) diamond 5 2 ( all all) 9 integer infeasible dsbmip 1855 1886 ( 192 160) 9768 -305.198 (opt) egout 99 141 ( 55 all) 392 568.101 (opt) enigma 22 100 ( all all) 298 0.0 (opt) fixnet3 479 878 ( 378 all) 2631 51973 (opt) fixnet4 479 878 ( 378 all) 2621 8936 (opt) fixnet6 479 878 ( 378 all) 2550 3983 (opt) flugpl 19 18 ( 11 none) 64 1201500 (opt) gen 781 870 ( 150 144) 3174 112313 (opt) khb05250 102 1350 ( 24 all) 3973 106940226 (opt) l152lav 98 1989 ( all all) 11911 4750 (not opt) lp4l 86 1086 ( all all) 5763 2967 (opt) lseu 29 89 ( all all) 394 1120 (opt) misc01 55 83 ( 82 all) 746 563.5 (opt) misc02 40 59 ( 58 all) 414 1690 (opt) misc03 97 160 ( 159 all) 2054 3360 (opt) misc04 1726 4897 ( 30 all) 17253 2666.699 (opt) misc05 301 136 ( 74 all) 2946 2984.5 (opt) misc06 821 1808 ( 112 all) 5860 12850.8607 (opt) misc07 213 260 ( 259 all) 8620 2810 (not opt) mod008 7 319 ( all all) 1562 307 (opt) mod010 147 2655 ( all all) 13858 6548 (opt) mod011 4482 10958 ( 96 all) 37425 -54558535 (opt) mod013 63 96 ( 48 all) 288 280.95 (opt) modglob 292 422 ( 98 all) 1390 20740508 (opt) noswot 183 128 ( 100 75) 760 -43 (opt) p0033 17 33 ( all all) 131 3089 (opt) p0040 24 40 ( all all) 150 62027 (opt) p0201 134 201 ( all all) 2124 7615 (opt) p0282 242 282 ( all all) 2248 258411 (opt) p0291 253 291 ( all all) 349 5223.7490 (opt) p0548 177 548 ( all all) 2127 8691 (opt) p2756 756 2756 ( all all) 11103 3124 (opt) p6000 2177 6000 ( all all) 54238 -2451377 (opt) pipex 26 48 ( all all) 240 788.263 (opt) qiu 1193 840 ( 48 all) 3432 -132.873137 (opt) rentacar 6804 9557 ( 55 all) 42019 30356761 (opt) rgn 25 180 ( 100 all) 540 82.1999 (opt) sample2 46 67 ( 21 all) 179 375 (opt) sentoy 31 60 ( all all) 1860 -7772 (opt) set1al 493 712 ( 240 all) 1884 15869.7 (opt) set1ch 493 712 ( 240 all) 1884 54537.7 (opt) set1cl 493 712 ( 240 all) 1884 6484.25 (opt) stein15 37 15 ( all all) 135 9 (opt) stein27 119 27 ( all all) 405 18 (opt) stein45 332 45 ( all all) 1079 30 (opt) stein9 14 9 ( all all) 54 5 (opt) vpm1 235 378 ( 168 all) 917 20 (opt) glpk-5.0/doc/miplib3.txt0000644000062000006210000002041613766346220014352 0ustar maomkpasswdSolver: GLPSOL 4.40 Computer: Intel Pentium 4, 3.0 GHz Platform: Cygwin 1.5.25 Compiler: GCC 3.4.4 (options used: -O3) Test set: MIPLIB 3.0 Problem Optimal Solution Options Used Nodes Iters Time,s Mem,MB -------- ---------------- ---------------- -------- ------ ------ ------ 10teams +9.240000000e+02 --pcost --gomory 6013 349276 207 12.7 air03 +3.401600000e+05 --pcost 33 414 12 21.0 air04 +5.613700000e+04 --pcost 1901 109800 396 32.4 air05 +2.637400000e+04 --pcost 6445 201649 452 45.0 arki001 bell3a +8.784303160e+05 --pcost --gomory 7965 42363 17 6.1 bell5 +8.966406492e+06 --pcost --gomory 5605 18555 8 1.5 blend2 +7.598985000e+00 --pcost 7185 24256 7 2.1 cap6000 -2.451377000e+06 --pcost 19209 40906 569 15.8 dano3mip danoint dcmulti +1.881820000e+05 --pcost 743 3366 2 1.1 dsbmip -3.051981750e+02 --pcost --mir 217 46088 24 4.5 egout +5.681007000e+02 --pcost 91 137 < 1 0.3 enigma +0.000000000e+00 --pcost 16419 55071 6 3.2 fast0507 fiber +4.059351800e+05 --pcost --mir 407 3108 4 2.4 fixnet6 +3.983000000e+03 --pcost 1031 3136 2 1.7 flugpl +1.201500000e+06 --pcost 397 231 < 1 0.1 gen +1.123133627e+05 --pcost 195 3991 1 1.7 gesa2 +2.577985637e+07 --pcost --mir 59 2723 4 4.1 gesa2_o +2.577985637e+07 --pcost --mir 69 2588 5 3.7 gesa3 +2.799104265e+07 --pcost --mir 93 2774 5 3.7 gesa3_o +2.799104265e+07 --pcost --mir 117 3271 6 3.6 gt2 +2.116600000e+04 --pcost 5613 26115 2 1.2 harp2 khb05250 +1.069402260e+08 --pcost 2163 14498 5 2.8 l152lav +4.722000000e+03 --pcost 7419 95299 68 12.0 lseu +1.120000000e+03 --pcost 10821 31954 5 2.5 marksh1 marksh2 mas74 mas76 misc03 +3.360000000e+03 --pcost 957 6742 2 1.1 misc06 +1.285086074e+04 --pcost 57 941 < 1 2.7 misc07 +2.810000000e+03 --pcost --mir 66075 579129 424 33.4 mitre mkc mod008 +3.070000000e+02 --pcost 8185 24245 8 2.3 mod010 +6.548000000e+03 --pcost 315 6283 7 5.3 mod011 modglob +2.074050809e+07 --pcost --mir 5197 31985 20 2.8 noswot nw04 +1.686200000e+04 (none) 361 5544 345 138.3 p0033 +3.089000000e+03 --pcost 305 955 < 1 0.2 p0201 +7.615000000e+03 --pcost 521 3660 1 0.9 p0282 +2.584110000e+05 --pcost 623 1204 1 0.8 p0548 +8.691000000e+03 --pcost 7617 23556 9 2.9 p2756 +3.124000000e+03 --pcost --mir 3911 15157 57 10.9 pk1 pp08a +7.350000000e+03 --pcost --mir 663 9196 4 1.3 pp08acut +7.350000000e+03 --pcost --mir 17233 260160 154 21.1 qiu -1.328731369e+02 --pcost 80473 1918742 1174 69.2 qnet1 +1.602969268e+04 --pcost --mir 183 20352 16 3.6 qnet1_o +1.602969268e+04 --pcost --mir 75 7645 9 3.3 rentacar +3.035676098e+07 --pcost 43 1649 3 12.1 rgn +8.219999924e+01 --pcost 3325 18700 2 1.2 rout set1ch seymour stein27 +1.800000000e+01 --pcost 3255 15327 2 1.0 stein45 +3.000000000e+01 --pcost 52301 389140 139 19.2 swath vpm1 +2.000000000e+01 --pcost --mir 9 836 < 1 0.9 vpm2 +1.375000000e+01 --pcost --mir 11729 164856 91 9.2 PROBLEM CHARACTERISTICS Problem Rows Cols ( Int 0/1) Nonz Best Solution -------- ------ ---------------------- ------ -------------------------- 10teams 230 2025 ( 1800 all) 12150 924 (opt) air03 125 10757 ( all all) 101785 340160 (opt) air04 824 8904 ( all all) 81869 56138 (opt) air05 427 7195 ( all all) 59316 26402 (not opt) arki001 1048 1388 ( 538 415) 20439 7580813.0459 (not opt) bell3a 124 133 ( 71 39) 441 878430.32 (opt) bell5 92 104 ( 58 30) 340 8966406.49 (opt) blend2 274 353 ( 264 231) 1409 7.598985 (opt) cap6000 2176 6000 ( all all) 48249 -2451377 (opt) dano3mip 3202 13873 ( 552 all) 79655 728.1111 (not opt) danoint 664 521 ( 56 all) 3232 65.67 (opt) dcmulti 291 548 ( 75 all) 1833 188182.0000 (opt) dsbmip 1855 1886 ( 192 160) 9768 -305.198 (opt) egout 99 141 ( 55 all) 392 568.101 (opt) enigma 22 100 ( all all) 298 0.0 (opt) fast0507 507 63009 ( all all) 409439 174 (opt) fiber 363 1298 ( 1254 all) 2944 405935.18000 (opt) fixnet6 479 878 ( 378 all) 2550 3983 (opt) flugpl 19 18 ( 11 none) 64 1201500 (opt) gen 781 870 ( 150 144) 3174 112313 (opt) gesa2 1392 1224 ( 408 240) 5064 25779856.372 (opt) gesa2_o 1248 1224 ( 720 384) 3672 25779856.372 (opt) gesa3 1368 1152 ( 384 216) 4944 27991042.648 (opt) gesa3_o 1224 1152 ( 672 336) 3624 27991042.648 (opt) gt2 29 188 ( all 24) 376 21166.000 (opt) harp2 112 2993 ( all all) 5840 -73899798.00 (opt) khb05250 102 1350 ( 24 all) 3973 106940226 (opt) l152lav 98 1989 ( all all) 11911 4750 (not opt) lseu 29 89 ( all all) 394 1120 (opt) marksh1 7 62 ( 50 all) 324 marksh2 8 74 ( 60 all) 448 mas74 13 151 ( 150 all) 1705 11801.1857 (opt) mas76 12 151 ( 150 all) 1639 40005.0541 (opt) misc03 97 160 ( 159 all) 2054 3360 (opt) misc06 821 1808 ( 112 all) 5860 12850.8607 (opt) misc07 213 260 ( 259 all) 8620 2810 (not opt) mitre 2054 10724 ( all all) 39704 115155 (opt) mkc 3412 5325 ( 5323 all) 20621 mod008 7 319 ( all all) 1562 307 (opt) mod010 147 2655 ( all all) 13858 6548 (opt) mod011 4482 10958 ( 96 all) 37425 -54558535 (opt) modglob 292 422 ( 98 all) 1390 20740508 (opt) noswot 183 128 ( 100 75) 760 -43 (opt) nw04 36 87482 ( all all) 636666 16862 (opt) p0033 17 33 ( all all) 131 3089 (opt) p0201 134 201 ( all all) 2124 7615 (opt) p0282 242 282 ( all all) 2248 258411 (opt) p0548 177 548 ( all all) 2127 8691 (opt) p2756 756 2756 ( all all) 11103 3124 (opt) pk1 45 86 ( 55 all) 915 11 (opt) pp08a 136 240 ( 64 all) 480 7350 (opt) pp08acut 246 240 ( 64 all) 839 7350 (opt) qiu 1193 840 ( 48 all) 3432 -132.873137 (opt) qnet1 503 1541 ( 1417 1288) 4622 16029.692681 (opt) qnet1_o 456 1541 ( 1417 1288) 4214 16029.692681 (opt) rentacar 6804 9557 ( 55 all) 42019 30356761 (opt) rgn 25 180 ( 100 all) 540 82.1999 (opt) rout 291 556 ( 315 300) 2431 1077.56 (opt) set1ch 493 712 ( 240 all) 1884 54537.7 (opt) seymour 4944 1372 ( all all) 33549 423 (not opt) stein27 119 27 ( all all) 405 18 (opt) stein45 332 45 ( all all) 1079 30 (opt) swath 885 6805 ( 6724 all) 34966 vpm1 235 378 ( 168 all) 917 20 (opt) vpm2 234 378 ( 168 all) 917 13.75 (opt) glpk-5.0/doc/netlib.txt0000644000062000006210000001617413766346220014276 0ustar maomkpasswdSolver: GLPSOL 4.40 (default options used) Computer: Intel Pentium 4, 3.0 GHz Platform: Cygwin 1.5.25 Compiler: GCC 3.4.4 (options used: -O3) Test set: Netlib LP collection Problem Rows Cols Nonz Optimum Iters Time,s Mem,MB -------- ----- ----- ------ ---------------- ------ ------ ------ 25fv47 822 1571 11127 +5.501845888e+03 1651 < 1 2.1 80bau3b 2263 9799 29063 +9.872241924e+05 5358 3 6.4 adlittle 57 97 465 +2.254949632e+05 71 < 1 0.1 afiro 28 32 88 -4.647531429e+02 10 < 1 0.1 agg 489 163 2541 -3.599176729e+07 100 < 1 0.5 agg2 517 302 4515 -2.023925236e+07 178 < 1 0.8 agg3 517 302 4531 +1.031211594e+07 182 < 1 0.8 bandm 306 472 2659 -1.586280185e+02 252 < 1 0.6 beaconfd 174 262 3476 +3.359248581e+04 61 < 1 0.4 blend 75 83 521 -3.081214985e+01 41 < 1 0.1 bnl1 644 1175 6129 +1.977629562e+03 581 < 1 1.4 bnl2 2325 3489 16124 +1.811236540e+03 1730 1 3.7 boeing1 351 384 3865 -3.352135675e+02 419 < 1 0.7 boeing2 167 143 1339 -3.150187280e+02 161 < 1 0.3 bore3d 234 315 1525 +1.373080394e+03 38 < 1 0.3 brandy 221 249 2150 +1.518509896e+03 191 < 1 0.5 capri 272 353 1786 +2.690012914e+03 203 < 1 0.4 cycle 1904 2857 21322 -5.226393025e+00 953 < 1 3.5 czprob 930 3523 14173 +2.185196699e+06 754 < 1 2.6 d2q06c 2172 5167 35674 +1.227842108e+05 5368 7 6.2 d6cube 416 6184 43888 +3.154916667e+02 6596 6 6.0 degen2 445 534 4449 -1.435178000e+03 506 < 1 1.0 degen3 1504 1818 26230 -9.872940000e+02 2205 2 4.1 dfl001 6072 12230 41873 +1.126639605e+07 39863 117 11.0 e226 224 282 2767 -2.586492907e+01 206 < 1 0.5 etamacro 401 688 2489 -7.557152333e+02 444 < 1 0.7 fffff800 525 854 6235 +5.556795648e+05 167 < 1 1.0 finnis 498 614 2714 +1.727910656e+05 338 < 1 0.6 fit1d 25 1026 14430 -9.146378092e+03 488 < 1 1.7 fit1p 628 1677 10894 +9.146378092e+03 1379 < 1 1.9 fit2d 26 10500 138018 -6.846429329e+04 5751 16 15.8 fit2p 3001 13525 60784 +6.846429329e+04 11960 17 11.3 forplan 162 421 4916 -6.642189613e+02 170 < 1 0.7 ganges 1310 1681 7021 -1.095857361e+05 724 < 1 1.9 gfrd-pnc 617 1092 3467 +6.902236000e+06 416 < 1 1.0 greenbea 2393 5405 31499 -7.255524813e+07 3012 3 5.8 greenbeb 2393 5405 31499 -4.302260261e+06 2153 2 5.8 grow15 301 645 5665 -1.068709413e+08 358 < 1 1.1 grow22 441 946 8318 -1.608343365e+08 606 < 1 1.6 grow7 141 301 2633 -4.778781181e+07 159 < 1 0.5 israel 175 142 2358 -8.966448219e+05 123 < 1 0.4 kb2 44 41 291 -1.749900130e+03 38 < 1 0.1 lotfi 154 308 1086 -2.526470606e+01 104 < 1 0.3 maros 847 1443 10006 -5.806374370e+04 703 < 1 1.8 maros-r7 3137 9408 151120 +1.497185166e+06 2340 5 16.7 modszk1 688 1620 4158 +3.206197291e+02 705 < 1 1.4 nesm 663 2923 13988 +1.407603649e+07 2240 1 2.4 perold 626 1376 6026 -9.380755278e+03 1103 < 1 1.5 pilot 1442 3652 43220 -5.574831533e+02 5726 11 7.8 pilot-ja 941 1988 14706 -6.113136466e+03 1697 1 2.5 pilot-we 723 2789 9218 -2.720107533e+06 1382 1 2.3 pilot4 411 1000 5145 -2.581139259e+03 532 < 1 1.3 pilot87 2031 4883 73804 +3.017103744e+02 7573 28 12.2 pilotnov 976 2172 13129 -4.497276188e+03 988 1 2.5 recipe 92 180 752 -2.666160000e+02 17 < 1 0.2 sc105 106 103 281 -5.220206121e+01 51 < 1 0.2 sc205 206 203 552 -5.220206121e+01 124 < 1 0.3 sc50a 51 48 131 -6.457507706e+01 25 < 1 0.1 sc50b 51 48 119 -7.000000000e+01 30 < 1 0.1 scagr25 472 500 2029 -1.475343306e+07 352 < 1 0.7 scagr7 130 140 553 -2.331389824e+06 94 < 1 0.2 scfxm1 331 457 2612 +1.841675903e+04 281 < 1 0.6 scfxm2 661 914 5229 +3.666026156e+04 587 < 1 1.1 scfxm3 991 1371 7846 +5.490125455e+04 881 < 1 1.7 scorpion 389 358 1708 +1.878124823e+03 146 < 1 0.4 scrs8 491 1169 4029 +9.042969538e+02 545 < 1 1.1 scsd1 78 760 3148 +8.666666674e+00 91 < 1 0.6 scsd6 148 1350 5666 +5.050000008e+01 182 < 1 1.0 scsd8 398 2750 11334 +9.049999999e+02 397 < 1 2.1 sctap1 301 480 2052 +1.412250000e+03 196 < 1 0.5 sctap2 1091 1880 8124 +1.724807143e+03 425 < 1 1.7 sctap3 1481 2480 10734 +1.424000000e+03 729 < 1 2.4 seba 516 1028 4874 +1.571160000e+04 883 < 1 1.0 share1b 118 225 1182 -7.658931858e+04 167 < 1 0.3 share2b 97 79 730 -4.157322407e+02 87 < 1 0.2 shell 537 1775 4900 +1.208825346e+09 467 < 1 1.2 ship04l 403 2118 8450 +1.793324538e+06 373 < 1 1.5 ship04s 403 1458 5810 +1.798714700e+06 262 < 1 1.0 ship08l 779 4283 17085 +1.909055211e+06 516 < 1 2.9 ship08s 779 2387 9501 +1.920098211e+06 274 < 1 1.7 ship12l 1152 5427 21597 +1.470187919e+06 686 < 1 3.7 ship12s 1152 2763 10941 +1.489236134e+06 383 < 1 2.0 sierra 1228 2036 9252 +1.539436218e+07 857 < 1 2.1 stair 357 467 3857 -2.512669512e+02 399 < 1 1.0 standata 360 1075 3038 +1.257699500e+03 140 < 1 0.7 standgub 362 1184 3147 +1.257699500e+03 140 < 1 0.8 standmps 468 1075 3686 +1.406017500e+03 299 < 1 0.9 stocfor1 118 111 474 -4.113197622e+04 24 < 1 0.2 stocfor2 2158 2031 9492 -3.902440854e+04 499 < 1 2.6 stocfor3 16676 15695 74004 -3.997678394e+04 4456 11 19.7 truss 1001 8806 36642 +4.588158472e+05 4744 4 6.5 tuff 334 587 4523 +2.921477651e-01 61 < 1 0.8 vtp-base 199 203 914 +1.298314625e+05 69 < 1 0.2 wood1p 245 2594 70216 +1.442902412e+00 326 < 1 7.1 woodw 1099 8405 37478 +1.304476333e+00 1093 < 1 6.0 glpk-5.0/doc/notes/0000755000062000006210000000000013766346220013377 5ustar maomkpasswdglpk-5.0/doc/notes/gomory.pdf0000666000062000006210000022326513766346220015424 0ustar maomkpasswd%PDF-1.5 %äðíø 19 0 obj <> stream xÚÍZ[¯· ~ﯘÇ]䌢+%9mQHú` éy(’Ó‡ØM 9Nc4¨~)‰”4³œ=ë6) ãx/#‘I}üHíòóbÿÌí£^^?./î—O¿0‹‰Êš°Ü¿$¯Ü²•‹Ëýß¿9=8«ÏðÕüÓ.8üÃWÛg€ö9ÆóêŒÃ‘`ðßfDM³ýÁÚ¦”‡U¾‡ØDÔ‰ŽžÑ_ÄÏλÿó½òqY­QÙÐâêlÛf–YERŸ]Ô^”vç˜hFY\YFè*ûÓ/ìbPp¨f° ü²:­¬%EZ+”T a`¼õdƒÐl4„–%`·D•csyƒ&öMªÆE]*_“Q!ã>“ŠžÕ“9ƒ=ÛxjJ½iÊ¢/Ë '«uqA{îÎÉœI÷‹)J¡J7.*Œ€ŒJ¡ŠG¡Çó¼Kê¦ÏÕAdÞê(\J¦=û€Š!ð'C–0ìsüÎNq ëŒ¶¶°­²Îem7=¬S#7[dq\u§³¥‹œþµ#ðs„"ÚžF¸ûj’¶°2Ü3Ú L;1.à‘Âí8•ÚAz|ûŽÆÅy\R&á¾Ëˆïéyšžå=~Ms'¯¢ÃÿB; ÷ÂtP°¬}Äa¡YÙH ž‰4ÐãÂòq6?¶Âl|çèñ_ÅÙ™ž¾¹¾õÏ$ —H¡ç'ópD`4YÉ °YÇV”Ê–DýAr’)¼ê¤4’Ñ;+±ø¯/œjpÍ…ÿ`¦ÀCƒoÛî>Õãâ­‚À˜s´ˆÌ‹øêbYy3ñîØ‚2ž}¡µ¾˜ÐôÑV40Fòå66NÂ}ر'‚õ¹ë˜æ¼ßù9íüÌqðJ°¤W®,\ Øl”N=`mØW„—°¸[ο˜ V¯+ö… ;-ãT\´Œƒwe(02•¯¡|Só^¤É®!Û&SöQº=%÷Ž‹a€<ÉâEtŃD/Í=rؤap®‰ëZáX”WS¼^«ÕtIc*PHw RLEhí÷àO\à*–}ÇCÀž“=•DïL%?õ­c/8â;ul lì’x›9IÊÁ¶ÛÜÊ•Ü.©ÇiáÀêAOO ›nkÆ&/p†ÖS¯#EËM kuÉÐ7¾Ø1¹+ñ)M–B”Þ"Š×ç g/ä!âáÕÊä~x‘m º“$Æ)ý ‘-üVA®^ ãGñr#A’©Çyˆz)¬9)‡(ñÄ{e9Ëݱ |7'FaãÞõà+œm=¦Ý]@\‹9‘'æÆ¤˜¿kdÿˆ(“VkkòÛ§§£M@?§2û繜dÓH²«GÂ*û/–ÒCoÜ·q'?ó}aµúÐ%È9øñ þð&72mŽۨ‚Û­9lØ éÑËí‡ÅÒ!ÔõÌ7ë æ 9¼© Å)[Õ‘vd®ÈðfYfäœÇêüÙ¤›-ØV/Ѩ'Эih*'ž ”Ý hY`‡É¾ø°¡õmpɣ㨫º,¿=çÍ?ùzä¬:†»:PÖò=Ÿ–§§Úm*ÀNn³¥ô'Á(Yû^…Ê°åÆšŠª%(=‡öý>±w4Ô“EÈ7Ñu™´^Ð[­—ƒuZª6Þ-QP§•ws½ñ›Q¬æ³ï(%à‘Uå ôj–òWP:©p –ÈEûˆOä ¯— /K!Iª ,çzªÄ-Oª~k£ÜL à¢N»XcY3è«ñ€¾¢:6qB¨ä†…­ËùöAY,ׇ µª>“Šù:œ8îªüxÒe¼”ØíÔ>kôÖF³)‹ù›m9ÓÝyKÅÑvJñµ'RÒÛkS”¦69ßY0?&ÆTv;Ê˙ގ’$w0ÊûböŒ1^ˆçˆT9åÒÿgÀ¼&• ÍñâZµò±d‘r¥UÂ÷öòõT”BÚ&é{êØ%oiãJdª½.*2ŸTÅ)…”›‰Æ;.Žz÷¬–ë<Ú×sâŸèÍ•äÖFµœJ†äôû2þæÖ2„F¶˜ÄÑá¸m'pú¹wÑžµj@Ï)Ç0ÐëMŽtÜÀBó…ªÜí*ì>J¬€oóîzAa7í¼©Ò 1ýúk4êúœMFï—†QÉÒ’¸Ü’iˆõ¥h˜h·‹ã[iÈD¸œ˜[•:¥z ˜ÂŽ0otyIWÞ^LØë}6K©~×fs»6Û­z›p¬g@#¾$yßhaín¢5f@¡/  “¹r…UøÃò×iѸJœ»ÓF÷î´1ÔÚ¦“ÒÛÚç6éÊa¯ç¤Ê»å°·Ñö´…×ö”åü'}ÊÎÚÛJ,£Å”üa€×A‡{sf‹08Î…ÜÜ+ùò;€‹ v]Éq¹3rMíŒWó%AðrUÇK-ñà¦3gÛ¬ýL nU ÈÙõ•6VÞ%$2ÝWDMæU ìZç.Ö|A5R,r´˜›Gý¾(Ðs54žšG7ÜQUöà;Øì"¢Ö><'wvrñâBŽulf¸yWï½ ß{Í—\çöÃŽÏï—Ÿå°žø×‚€Åö Jƒûy^V6÷/~\þ²|I?÷q9¦ ©Ôe+8§`°Æ#tf€Fê°êDR—øw7†xø© ÙÎÏj}Øœ*ÁÝÔŠœwÖgÅÐäõÑì~|Ò ù;V`¼µLozÝoxFG&½³(\JÚ„Þ6ý¸…\/P1Âé`9ÌT¹Ô¨}޵C˜~ÜÂü¡ÿ¸¥tÁroNŸ¯ß¾ý‘©€ ãàúýã·?ý Zõþõ»ïþ©ÞÿòGÁ Þîzc³Ä ÀÍß¼ûEýôþ$ ¦6š’ò•‡rTW›UÊS•€Áúåïþ |*½Q endstream endobj 23 0 obj <> stream xÚíZÉŽ¹½û+òX wq¸3S^`|x€>žòa¬Œìƒ/†>ߌ ƒ fE.¥e ¡ÕÕ•\‚±¼xÌé¿“™tþg¦d§”ôôæ?Ó·/Ó7 “ÑjÑËôòvŠV¥8]cP)L/?ýp¹9n.š› .ÿè§¼ü5ϙٻ(»ä…aøûúÜMI- WTÖON-±,§µ«Cø¶‹JiºöQ.¥›ó¶lŠŸA ‚<Ù„ÏŸ®>êü)ÆòÅËŸc1»ÈøŒ~"̲y–÷etÈ££{²ñRfÀ0;äç Vôm]ÖJš­IŸý3-íÓl/ þ4°OPô¤m‡[\Q ׬o릫q*¾ak¯ëÑ}Ù(áAÚ¢©|ëu<"åàH[Ž…ê MÆT;÷™LѾ7zmÄ%#š•DEíÍ×ô¨;Y5Î&pK1ZúÞQ£ÿX/ÕfðÒ¼ Ä{ò¯ªò õ€ÿ¹Åøw¬ª)#G·ÙvðT·¸CO%-Á:ÞGJM¹Å3SŽê0èþbnO7mãíboOàðz©.2¦@š/2樺z£ë ]­cÍÐ[£ƒà$m°U㺌"w]z-á„¢M´å"7l_€LˆAÛ’—EW£ ·ü²ÄcþmªJÀr3*9”oÊîë§Þ€9á¯Yp°l(Zåöšv˜OÄpýÜE8ö?ôû@38<¥O×-­×Ì“ ÀÀñÂl»­‚©£H#®ž ÑÆä¿Lº²ƒ¹ÑguQžDßžhÛSñX ÕwÀX=þT“¤†>"Õ¡šžiHL §è›zp¯eMÙî5 ‹¡~dË>:ÔÌÒ<Š~ãAi½â}E´äi^ k2y³Ÿ‡±Á½y^Ýÿ¬çõáh~³:~£ Œ]|óSQwGÐ Þgö뎀TG®2kùç†m}P~¬£OfSH2¤”è»fETœ ü¬Š©÷ކ¢!ay–ôv&;¿lçïkþo7g+btóϴ6Q´Ä(øfݹ…Mq’™ÅHŸ&FŠ gˆ'?³¬€rL§C£r’È8‰±IÅPyÍí"°Ôfä= ç=@?UœqÀ·ÂIÙ¼ȹ^7€5ŽøY`NN¹ej#žù©£®:J¡ÜËೞñ·ëGÈöKJû=¤¼„ÞÓAt0®¡ç®ƒ?§0V™™Ž©¬e’° _c†Zìn—ÄFäùÖÔ]l}n4CÃveÀßcf‡£ÇhÉ™—=ŰXöГîÕ˜/cgk,ý#ç´);ʼï‡ê;^Åe œcÔ ¤"7°Ì¨h˜5]XÄ„G0Â$ìJl{KäµÒ\É·²¹œ‰,uqÈ ó´l씵Ó`§Ý6žP6 PU~˜ÛLÏwˆWFnäª>ÊžFÑç6\÷!D1º`hsÿJ‚3ƒÑzµÍ…?Ó -‡˜¶bšßŒç¨¼™Ú1ž æT<»ðh jf»d𢌱¹]@I6B½¾Û'oá2~–0Ìê±í5´ÝJÉWJîKè)ºAO#…6LÊ»»^Öf«w½a¸ë-zgZ¸ìŸùe¿_V·o”ɽ'Âî+–ÀÞàœ|v´iØØx¸Ê,žTˆçßNñ¼#PÄ;ºÞoäq캰¹–í7ðºäá1´ƒc僫¹½,äÞE)VÌpªç±Sêë9:þ —'œŒk¬—Ñ;•Z”+5¹ÞÚ-q¡‡Øê±m^ªñª<õàÉ2UêþÆðÞFYÇ“Öw+¼fïm¬o¹è þÚg|1PïÓgÊ|GyzÑ«ðˆ›á!ÈY,,äLR™¸ #êxОÁ :é”Ñ×6Fl˜NÅß ‚„~˰Ñ&Nµ‰×NB›¿2‚†Ð¯£CúÑyÿêºÍ»DTvñGñF¼Ç¬»ÞÍWþ%»RÜ!çsdEßei‡àKdŒÄÌ Ü<ÚÍàc[ŽŒ¯ñõêàà’£Œøýg é Ö*õ¢Õè4ãðÊîjp퇮ð‰b÷€/«3¯Ûz×*$¥TƬòÜz^Ã"q±ã‹éWrëT»0ó‘šœ?I',w¾ÞVþ‚cŽ!gtn£#¼JÖpÂÈ8a¢…nÇ5Ã…3Ì~™¾ÿÍÿCý› endstream endobj 27 0 obj <> stream xÚí[I5¾ó+úøF™6ÞHr@‚DÄ"er€DHDLP.ÀϧÊ[Ûýì^òz’B¥_wy«rÕ÷UÙ3|Ø@á?6>C‡7Ã7w×ߩQâ¨î~¤"V £VĨáîí«Ó½0æ^H~/”ˆÏê^hø­Ù 7þûÍȵ†'_5 [ÐØJ¿ÐÊÀ³’(í¤L}Þ¼¾ûæa‹y0ÁˆÓ0[œÃË(À`êÄüîˆJà÷'ñ{¹C¨Æ,BÒ¨ æ¡tú…ëPæ"ÂZpN’æõà:L”=1v“Û±ü+Ð…V°·¼Æ“)›„å¢ £Ó¾á§Û4.öúò ™´ÄIøW•¬‚úôM }ão|Ca{oýUC½JêáÒ÷ök”Ð…„&ŠGõߟ=HãwÊd”pÙ@š03&Zx™ßC" Ç$š "¦š…6yJÓ>àhl…®á§©vÊ4˜‚P°RNhPÝ»("²ˆ ÖÆAøY{E´Šh¨ÁápB%Uˆ†*œ-Uñ®¡ ƒ«˜t±¢ñ¿cpéÇpÕTË!,¡fÈYÝS2õ!*E™jš’Ó¤\6blÚ;´Ñ ƒà’¾ß6L ¶RüêMj6˜ÔüMªZá¸0i'Z°Çî,Z‡/ÒÀŒg”P0 ÷…"!!~BÈ á1 c¥¾áÖ‡cˆÂήàžN¸ç%7ãžs«¸§5Úc÷ì:ð¹ðùa) '`/LGy`¼Mâµ~òJyX{|ÛÚ(œ0»ÉÔ²2µª£¾²DÔ|Ä4SéµîÂÆ•‚ZD•s¨¤Á`B°S–åú³~n“XÁõ*­A–D<å*xÊÚõm€’%žwÂ4›…éÒ ŠÈDÀHÒ3Aߦb;žÌD‰ËxɈÛǬ“KC=„˜èubbÅØŒécºcn ÆäÕ0µcÂaWaÌî„1Û…±ç›h £zr€±>¶$E’íIŠ$Ûé‰×¼<Û-56Ûr!/ºM£'{æÞ›•,²¡°Ìy‚l/çñ_Cηä<±÷)çI‹ÜLO³ ‘×PGfDГ=Æ'~tš#WiŽ<$ö¬‡õ¹C\=òÒÐsƒ–« ZÎt/ú°IQ¹PÁˆÑ0”°WÇ:¾½> `r;ü5p•¶–b„òáaàà©Fç¿? /BÙ©ì77Ó mÖS’™Â_±ó+7†§OAÌv“‡Ò=-Ѱa aîÓe¸µ_)Súç©¡êJMU["ݤ«C<ü¦i”b ëóñƒ³du´ƒ£VÉìÎyrÃ7äÆåo¡?1ØHbb¶œƒÿóú³›ýÈ&°cØDÊ9©œReO_T•áÐ4kטø“_+J°9Ý™k‡6 |ÅüŠå”gHk¦Ã!Ã$‹(q ¼)¼Ó´þêg(“œ¤$½Äd.M±L¯c“Ítªi*HÃSåöçF|2mt×è8Ž·“ªÜÞT$COÎÒsÇÌa~ilKT®mÛÑj׎6¨w4Ätã‰fÅ\e*¿Äý’ý­Vµl…aeÐqÃ2~l¯râ#ÌòH=ì³K­lédä7¨jÄäKFÖ]#ÃÕ+VK |ÛX¿Ã½–{ÐI›­htmEx£:63[mÆÀhÙ*/šFËeÍ£`0Œêó8`ùiÊ’l‘³…ø²?'ªÒð L|™$¢ÃTBÖbM…zÆÉô*;(óðóßMøãÃïbÌX®ÈŠz} اucc:¤?ç=énOÍêÚ¶Ìã#êáá·÷mµq¤Î1ÌÅE¿mõ¶Êô#¬Èi¬häú‡Z©€Väžp¶àfÀçŽà¶p4Ý Ž-'³ŠˆY`œÅ—¶Û«fk<SìLaQ …»)K~óÇ{ÔËŸ`Ñæ~¶ ?t¶5Ö¼6ýìØZLŒ7ÜPÌRªxöƒEˆ›áD&FÌ-ç)ÇÇf½O¹Ëxs›f@WEåtrÁ¼3V _R0·™ÖÜÑnþiÇ)0¶¿H°ã­R’4±¥ó‡¸žž<·Ö3OÊ {®P&Íþ;rª¥°îYç2ªØûo£‰‚ÊàVž Éø6e^¹YŠ_ŒÒF£FGæ>Y½O÷ë}€ï­Å!7S0°Cu!Þ—ñ‘rµ4öY ·eiŒYØÏÃ(!5‚é> ˜ `Ý!¾èTÆR+c1ß¹¬0Æ®°2m'Ý…¥({@)Ê”ö{ÝTCyhúÈW6>1êQ\BSÜ™sêÎÉÝÅ9­ÙC ¬›ÿÆß ˆ½j°/'zr ôþþ’kàD80qô FÐŵ=];(«@%ŽÔÝ÷Ayl‰ÖqZ&V‘GNð¬}b&Ý^¢4£´¢ùWí¨%í±¿Q WäÎé~‹é~‹™ßo)•¢øDÃ;aV¦´ð)ôªlÓù8=¤¼û¢Î²ƒ?m™_LªgË×Cn“úºfû¥¼Ês™Î(ÏZ¶ŸVüªy„çÃú2 ³œ¦=êÁv5¼n—Ô¸Yº9TlÕ›CÝêUŸËÕŽF Ó*—j ,Snâb‘eê²tË|¿®X&•HòG¥¾PœAN/z435ƒl"žux¦¹ž¹ó:ñLûIŽ<·ß§¹19àT¡žwÁŽŽÌß&œ· Ξ§7K®åÈ "Õ\(,¿sÆJ&,³î<3L'ÎŽ’‹ á2f›¨Lâ{fuF6¶”[ÙºCü2x qn¯î6t}ƒü9ÞÃPþÜ)¾èÞí¬¾üÆ9 Ø¢€ÙÎFZNÄ4Ög߉l׉žnò î·H¤»“'fVr>—"W}-p*Âùä(eƒzžæË&ù"ÍÂßùœ{gñ-¶9k¾IžúY<ÊWÕ%‡˜‘†Òa«¤§^ñ!ÓÞÁÛ(ÑQ9O•„Ëo1 o±ù†g½ä :Â_†wOãNþ#Š2¦[”y×tói”ù›#.©F½¦ŽvE$zÒ,™uýwû˜µ„ £Š(‹"†Óô¢[À ­¤ÂSë¿Ù·ûO.êsY¼ÚgüÖ츢縅*ÍÙžþßy·[ù¦b+»ú?j0Šª›= @ζAšiŽ;ЃtÈJD /¾øBå… endstream endobj 31 0 obj <> stream xÚÕ\K#·¾çWè¨G ‹oîÚb 9äÀðX{‰6²|Š~X$‹n²[ÒH³³XÌŽFM²Éz|õì>üv€ÿà`ÅÁZ~øñÓáÛ‡?þU€3ÏýáÃÏ¥™“‡“ÑÌêÇŸ~8ž¥’OÂâo~ôÓÇ s\3ó.,ŒÃÿž¯C¸ ó/{æÍAâ8à«<À´ pƟʘoòÛŽ¦E¾ÉσMh¦t¾üë`ºc@—ÅèœÉÅ º æ}¾þn0Ý0nòå3™GøBƒ:3*Žùe´ÃðIøCsæBvÒViÈðï|Y÷—i£ÏÃs˜%dËG]ùxæœOX).`%l³Òl³Rí°vxéÀË•8•!_OøÛ|4Û|$6³xù$¤E?dš4—‹§“t<|Ò&üس4"üæáu˳´á³Öy „ÖóÈð ³´xæ8Óþ@PNGù}%5† ÙIÇ1ç¡9ãýwÉòvŽêüt~¢½ánUø1kJĸnܧLÊûí=I—‚œf£“%_­ž¯õ—LJ‘•™§L6`xo¢/Ñii®4œö˜0ô4#ìýóï#;l™¥eÞ–â´TL1ã;ŽÕÿ²ÈHPC$H•…™£hþ¤‹üÇù=hevž©…a®–}PÁ™ò/õ¹¥n}î|0Ä6(þw³ÕN¡‘»¦ÂHñ^É‘kÅ ‘•RLàÙŽáytzŴ߀RÏœ_†G‚™…ë× ‘ՔՔݗÓä«­!Ó¥3øFi©Dn`:†#a-K³T¹Û‰£"Ç)ỪÚÕ´ÈsÙ…€&‹]pãeO”¢LÑêJÀZ_håÓÚ+´ëµø×E¢šfY5™ÖDD·ç§gšAxKJÛ:<¨’qF>a™3ˆ‰ux“cÃ@ÉÑ#éMÜ~:)ˆËg®F<È&B>öqA$¼J?ñv¦!A$àð¤dÊî¤+ì(]¡W°9pX5i´¹ !ªö< }aAý~d´;±¦ñ¾/µ·7ª«5‹Uô>}ŸH2? ”ãöPFìÇ"¿¸£yòš²=Ê€,™Gj-”,$}_”Zh~{]ÇL=£@ÔÑʽiÜ7±ˆÛ«Eè†L©MÝ(óÚý_—µ)Õ†Ñy0ëÇðÍãáZÑyAJÄ>C ¨ÖäîÅAVçµE:¾ïD9HAl5d þ LøÌÈA8ÅVêôq9C¯Ëˆ±ð»zVeÃ1fKŸl£¨Es>ÈÏÀTÃEF—‹uõ%.¥Ãí%\C€‡é‹iÆ5F0ÆÀ–oV9¬^è Íf G<¾†ãvj8OÿÍ`…F[€¡W + ‘£qc%Kß™ ‡Òxc²é™bO±Mìq¤t?ÁG¿œ-­Nþk¸I;›TÛ©ƒ=´Ð¾ Ì”ê8ªT‰¦Í˜pÔoáh{µ}†q‡íX4PêŽm•—SòJvu—g ‘”_vG¶Jºé·Ð¼ñA{­:º&Ï®:Tß…¥cþÿ(ìáN |)é5oàK[±º%‚[-ŠŸß´p¿ÙËcœh\J‚iW½³¸AG^ÕZÆjÍF‚ª¾¬ýS©¶Æ£êúÙZ §ÓÊ}ËtMM]3¬AâëR‡D“ðrá ¯Ž×÷±¤.Jõ’ò´²>OrSªòõi½›ªÔn™ªÌ¿<¿‘˜î9æ›»ºµÒÀ$̴Ǧ¸"úôlʉôm4ªÉuP7šÎýJF¾ÐÇDï`©ñ™ÜЧ_þ;²Gs?=tôò¼è]Axr›÷ñ2h,R[L&>¼-_î&3»ÿåÃá·CÀ_wø_0±€•À“ ú|ÆO¡vÉå¿ÿsøþð]z‚­S.š% ÊøÌÄZ|ä„ï«ð¶ò½qHfžró\v»õÓ½1Ñý8óÖúç & 8RsKbt ðC%¦eB$€h5"˜a[‹_©—À¦ZÊ–­ºúTÓh¦jù%A\•vC6È‚–>B½l .~–Ó$?6írM«_ÆæˆÇ@™Âìšð¶½&N–†wãbPÂM÷xÙQû²³¨MDçÌ…7ŠÀ. ~–ÊV ƒŒ>µ£¬b" r¦|1ÁÁ2-=5öYqpFîStkßÊ¿á5€p[˜Í¨¬ç–O?õHטP>68#ˆyjp¾ì´¬ÜÌ[/ø6 þõΣҰ߾!aÙ¾ÑyP²IoV‹îCRwŸç ‘ôúG‘Ff'„ã»:O³ýC3ÏWkëyº\Ä+ ÏÃú 𖣉½šá3;ÊäÉ«Ë×):˜¿Èá}›f)Å›:Íà0ÁØØ×Ï»zœ“Û¼-«y[üõy,5æ‹ØG ÍÂ)PLoáÁœI€#8rpä¡WÆÞ4Û¨èÞ|:€qX  /fé@š¦êûÒ~T‘÷)‹À篋˜Q]d’¨y?~?—WE›×(dvoé –È7 ®ig}œ–úuBZã[ÿâ»,Ó½œÀ|Té„y§©ùwø?¤ï½ endstream endobj 39 0 obj <> stream xÚíko·ñ{Å~¼C´,ß·.à´i€´ U‚Da;²-C²Áh܇ÃÇŠ{w’å¤i A¸} ‡Ãy9;ý8‰‰Ç?1999ǧg—Ó§'Óÿn&ÁYàa:y>iüšfk˜3ÓÉßmN7§Š»S¥ù©2:þšSee¼N÷GÛYšA´¤+›­È€q€±Í=‡A–gÐôÈ4@‚3 ÝV:cð7Ž‘FhœÂÁAxŒ$¨øpjüO˜,þÂ\&­fûýÉ‘¾áƒôœi¹•xÀ…Ê0ar,8€°,øiÌêsþ*C´ÜŒWb* ‘àÄå¥ëÌLZœs°X©ÍœpÎ28fdœL1“¥‚²ÈCÃ+×hU…'UF…ÕÈT“… ¬ˆŒhS ²ÚeVØ+q"«Ä]E@ Z¢¶Fgܺ{k9Ò <ıíjh\â®e§ÛÄ=¥zÞq@h!„»Åp˳yI¡e˘úH oyϳ(+£ÍˆøjéYÒw-NøH{¦P;z#òlÖ5lA‰²&1âLÛ‚7oÀ»} `£Ô·V„KnG;\GòÒ“8\ó‘“q ˜êÇÆÐHƒ!ÙÚ<›¬’C“­Ï Ò ,ã nEsÐÖ“Vžeó·Ú–æ Èä }Íí!‚;Óñ¤—'údš1òŸÆÙ^‰ã®ÕjÒúê®3„ë@Ž#¼Ø5$”IIÄiI”#†‘²‚Ú'•–ùþ¦§Dw+\ãoM`RÓN°fSÅí2ñ$vcgÒª­´CŸš ýêvV(A[5B›jŸä {‚+#¸Ú:“eGR.¬áƒ8"g^æ…= •Ë)°`ÌR žY—À¾¹±fÍt„Ä`DáJ•׊yŸ§7ÆfM~ùÍoãÓà<¼ŽñÉE§þ„ |…˜™71¯"äÛAÌõsÇ$*Ãó b4>Ëw3@¡™¼SÐn爸&ho‡y¦‰Yï³D*`–Ð1Ìvã¹ DU- l¨”¾2ÃW:?%1‚™ˆPù{⧬4Ú_ÃÏÁ æoØ™@>;™~œ˜ŠÂøiA0"–h½ÂL—è²TåÁÅôïékÌT[¼e˜ LÙ„\äé]'Í¢Õ§œóÁáŠœÆ Ä½ðHíå‘굡µp!˜Ó`"ì0o¿Û¾Ã.ûÖKûVköÝ0òïmKˆÆÄ¿I ®Þ[b¿„—°­Z?œ)J­2ôj¿Ÿpïë'Ó⦣èÃG¬ûb Ž¿  _-|øýáMäx 7‹ðñj Ÿº‹àÝjxx5´æ:Ëõû;Þ3vxɬ5¤ß;dd`(ÖbG&¹bâ7;vò(ÜàÑÍØ¡Rìð¿bìðÅŽ]öäGûÞaßnÕçŸriV¢ÓýÅÑû³ð³PìøÓƒÖŒÇÄH¾%R*EÁÓQ³R‚ö¬-Ó6׈ZÕòYxä S wBz‰Å8Ië àL43¡_y HÛæx»šEY(ìÀðûp” ÄÕ’j`Y|U%<zaà W¦ÄÂŒ;%• ³tn¬€ç=µoÆ£o¥ý´ZÁW–;*F³¶hݬƒZˆÐ•)k&böx$wÛ‚tÍiÑ4RïÉD?P¤òw³u7žåÅXÃ{W#x”€…_0ÓV§ÔŠy¶h`¡þý]X¨ßk¡~¯…ª½ª~;ªö[¨Zb…þe3¤Öž[ì6Ã[o6Ü›Ê÷“Ù÷Fø?&ËL÷68´!‘4fOâ¯dæ¬v%Žñ–F7_ì~V]á$³b¤ºwŒ èîÇïÿAyýºòþùƒjîƒö @}•€s¢\ÉÝe‰ÂÖ¥ÇC6§¨Z×óm:iVx¨Oy‹NøuÐi n4vä'tÄfñPÝçn‡ŒöÀãÅ‚k¼x-ìªP¥»`yüékŽñîÛ'FçºtÆgzÞÝv ÞçSþ£|SÁUfh>‚ÄóP‚¢ÓQ˜Äª|¢¹h:@H× Çtã÷Yi¢«rvëðL×nVªe¥XuïT¿á­ SÈ~T Ô(Øê‰ž|a>n¹‰' ›ƒàJvÍð$5FÐ(COLy×ò c™µgÎý[$·Î×Ì8‡¥¶—Y ûõ­ÖJ¾õrâc÷¡½ÜÔãþæ:ºþPšB™sjHMÍ„H^ã$g:T‹!©NEÈÓõ‚y±¡I`‹¦%üOÇ›Ãýeÿ§ž™Zk,É­™ÃÎ';wÒ~Ï-B.ë]j+¦66º04ÿÒ¡‘¦3ÔÓÓIÝm »BÈJWHßxðÏz—a)#Dc‹ž&\„= ç!³há5©W&3gVrÉ•Ÿ{VTöüQß Ž%^Yéô)Ø-j“mµ€¨Ÿ÷úÈÁ‰‰MÛ×h†Þ«;KéÕÑ·‘pÆ‹ïŸm§ ?j×D}A$ù"i—û¸—à?:a8Û7mi.©Å4þÖ6i@ÆùT4bÀ7úC=E8*fíÕÄí2¤jûØJ#iÁA<(}©Õ{´Ú® áZó „ªíKÛ9žj‡Ä^}€#ÐF6}Ú¨Mu±ÔŸEVÕÑžÆ-ÝxLÄAÞ<&ðôfÑO‡ÐáÙM‹§íf;j§³k—ÖÁî;ÊôÙ wÂêÜÉe6EÓe ‹ŠH/Ïžú,_V³ûvÔ„›ê;j K¾Ca|@>èÖ’šYÁ&RhÍgDhʪ«½öÇé–e ûW N+à>@ 0+ 9NU/yK®«ï6ðý©µ.%¿nÓûŠÅý¹ADâM^»ž:Té³myâuª®†XNÐÔ[›¢ §4„¬¾ë¼ÕyÝ„G’^ϵÖÐÔüªj*6VÚœé"RCf^²ÜÚø °Ÿÿó_ÿha[·ÛµS>%çaýÐø µ4[›]Æ-M>ŽR0Ñ)¯qâÅÅ›Çgÿyrñøí“§¯¯~)^,]›¨‚”¬4nj*2ùkòÝB´M›}»^k•Eƒ>6’éý²»vY³Ö°Vª3LöÝ·5'zp3‹<}ýPrT9å2Ç4NÙ[ÞÑýƒû蟎÷•ýmvÚχJ»ÓþpÔ ™wñÖ­vþ°éYJ8˜¾ŸîŸ~:dñ\ñQ$¹í.ü]ŽæÕ:úèiÀ† µº—……®e¥T»7r”bÎ6.wT8ÈàVÍ€ÞÒÞŒÛôû+ý×qT³£C3ÄAÕ¢¡””v-š/‚tN^Ï m¥¢OP“¾Œ´)V~Tfo‹Èô$¹&]óW§W»ÎMSü´á© —Ò©?'@hÝ4w'®2¯Ïâ“*§ËÓÔ«L4ÊvúÀ#%¯¶Od×°àIÑï¨L·ø6sÏyS%y¶Ù¹²<‡ÝE:¡vQ¡„ÛÔí·TeÖ' áúޤÆúŒ’ëgÊ 31®DÞ’—÷UË ñ¥8L7–iô!0:^ÆÚ/¤Æ´ü iL“²¶AŸ,ÚFW›w’iEhh€²=l;D—‹û˜á÷Ÿåßϯ.¯®ÿ»õ«,µyô_<¹xqu}þöå%Þ>¿ºÆ‹·/ÏðòüÝÙøìü5ðæíÙ‹³k|÷æúêéÅÙeþ¶ãП=ƒÈýòõù³'X‹Ÿ½ËÛ\]¿E¸ã/ë§DÂ7/QÕ—ò8êÑWë¿^]¿aé©Úˆ`9åÁ-À9*8h¦/ Ö9¥èú탢(¢±~ƒDPǺ[·Ø2´7ë3 ºnΚœz–ºª~¹#¬›o°2ž6õM* _å]вQ½Ù–r“@ç¨E;¿þÃÏ~'= endstream endobj 43 0 obj <> stream xÚå[K‹-·ÞçWœåùc3 /¯ŒþŒ‹¢ŸÐ Mž&Àqªð.>­[/.wN“vÄ)üøôûÈË›PÌ£´ÃþqéVÑ,œŸ…­sÎ$yÆÂ¼]fR^®Q8bzk Vö:GÝf¦Á_þºfŽæD-íµíñwîÉMÝS$ufͨ!ͳ“e" ½ÃJC>&pä»ËÜHóÀµ[qËË¡%è²øÞfvHg)ý*À›4l†;†¥d :}AfÁD´Ðù?`xÓʦÑÔ<­Àby¤Ä‡Ä¿8¨ƒ!Då.M¼åÖmÄ&S4íá¦/k„¿’žqœˆÃÉÀ`:‹iä€,—&UÅ*÷• TôúÓª®¹ˆIÓæ!®uÙIsÍB©Ò2ÙóCZ’°,¨~Yb!…k‹ÃØPõá¦LØ¢Y±(9š·ÆÛ\¥Š#c SÛŠ…á2™©Ž‚9±ç0) ï«©9kIFÆõHØŒ0è6àY³l¥(ëMPø‚rTšÖ H`¹BÓÒг¿õªh“sÝÁ°Æxs  VzM¯_*¬ zС­Î-fJ+(X(7<(M&„¬÷QŒõ¯ €“Æ\›ø‰chz êP"*]ÐgÍ€é ™÷K òLFšä6€’æ PÒØ3@!9¯$Žd_(ËLèhÒ-NåZƒÞ{#Fñä4iäô.µæÝŽ( ì2L³LÊ% ™œ5‰_lle`ò»Z´ –ƒ`Ã1ô°h ]6Ë}í­s ýÄ0çÕs“'_nðõMú³Y©åØÍÌN(îâ}(Nh ÑI‘ük¥>V Å žq×hÀêM}¨Dñó@‹ÓÉ]«Žç·-™µ{±qÙa¶¶0õbCJ,jí!Hôëì›{ãqù*rA¼‚? ‚íA û„Œ¡R€—ö)ɬL4žTÁ§Qâ›ßÒ›@†Õ?A“ßüº(™ƒ­Ïl³™7#"´^]”·½‡‘AŒþ¶â¯‚¯¥(z#Ë|Â(S|5riñ—Àiþ{5„aÊ †è—©|âÛQtbêî`•¯Zw(ã 4£Ÿ‡{A|•ã©YýÀe7盨|10ðþr_;¨7YÑÃûÌ9'„“¶|D„?!¬§þç€oBÜÉÓx¯6yVècòþÓˆ'ñ×E*:Üæšýmn|x}fŸŽE]í­¾‰+¸4ãd‡$òÁÔÓÅÚáN9`ìP±Û22¦è{8ÔS™ùÇ’gĺ%K[¥E „§a1à1šŒw©6뛘6‡V1œR~bA êƒeêÇaP«ëû(žzS_m:cBkÌeǧœƒXlaÓ×í-,P„³» µÎÌ–À–ÃjÖõ«Á6D =½ BÆ%Äøs ýï[@æÁ³. Ë+?Ê> ÕtZ˜“Ð!Ï'7Š-Be{õd‘Û:1ÅE¼³[Ýš~‰œQa‘½°'²¹u›½pÃìQ.‘™K [L"k4_"w•I!¦… tªº(Ó–éíþFx½ßõƒÖèsd³e/5- ô'f9 Âvéû(«ÌÍGäT€¡za.¨J*ô‹ì™z¡âGõBê…Ãmj g¢½ŽáÖ R ªQÇï†iéϨã_G}TUæ ìsÖ;þ´ᦘ‹VCJÆM§òªñá%«%FÇ.“ºqÙq×ê|f‚KLPºÛ4úŽ ÊAV äuð£cäÃ8§"^Ü+ÿfð2Çi…uV¡CL³ ÷ÓŒß1Ù öyˆX˜AÌO fïØA ÈÌ’ÙCÄübf±OCÄâÎôÿ1J¯¶f1šrIÛ› b>´—âãL?a0Õ±ÁÌ$_†h&šÍ=N–Û£d¹9H–£ÅT/ÍÃnÐgŠ~Œ;9)‡Š.9ð~O:ô›éù®e~[Ñøå^u”£œS'/Ëᾂtøu`; ü9a;vŸpêØ¨)G0Ü«Êwª³Ý¤×MŽ@nŸ»’L”T¤Ð —Òi6¤³“ œÜ DÐ×´)ýÑ,8ü"KN™ 5Xiʃߔ‡i5;—®¿ iR…7>Ü|b›{¦ n¨rº¿Êð'eð÷·["A(ÛŠUÙÖ¾jmõ ʶnQ¶ÕmÙvll=Ó¥ rÆùlËÒ°f¦>LÑÆ•D½M"[+¢_½„mú˜múmŸ§Ø6š¤aÚâ(£õÊ}~Ä%ÚHÛGoÞølq{íH7éBJ.iŸÚuQnà¢úØZ˃ƒ(NÖ¾gIï‡üti:è}çZ—:LG¨;gÞdŸò¦ý·µ®ÉœßÉì«'^KÇ6ö öí»[ë\,:ªDÓk]½pàöObHWsfÏŠ/Î ÐAìt£Ms…µ/‹'–5×'îL¥ O¢ô3¾¥•ûÌw¥°û½{¤©«¶ž¤u`4uTSà¡J_^­·x¨\»Q- ¦Ò«§K¬{½Lõ‚C½|² û¦ îSwƌђwï¿V®WÛ;…ëT)K0ÂÝÒÜn)UýO¢ÏpS}ܘæêbÝø¾âÃMZ z%@B¥u•íâ ²¿6=Õ[£ei¥lŒ©Ë›{Ïͱ <‹zÛ !~!q¥K¦¸28¤GpÇóël]{Ïu| þŒ@wf8óÿ4ôUFNžÙ:·K–½À-g3Êc¹îwöo2‹sâêEçô_C«ÍV/Ž45—Es’Î4l+]ý…¤‰ÈåŸç•/ÕÿîéòÇ_ý]¾§E endstream endobj 46 0 obj <> stream xÚåM¯#·íÞ_1·ÚX[‘H}Œ6Ý 4ÚE4oëŠRd9Mÿ}EIÔ‡Gã¿çn¶ ‚‡ÏERü3ý8©I†ÿÔä`rNNû0ýîiúì 3))¼ôÓÓw“áìt¶F83=ýýýá‚J^Ъ þløÃ :}AkƘðþÕæxÖf˜V'K_óţчL Ê.P—#ch¿:~càîè8“hFºÄ•åÓ꘣BÛVÚF槸~EiX8~ûôÇ鬬ðþAaXqA]]6±p ¥=$y8L»Ž”mÚA7™KS1è‰`h‰H>KÌd¹[àI–÷M”T³ÚH+&sdxHÓ$Ì‚Åz^B»Ê•6ç($y%Ýo0xA?ûBÁä…·H¦ô,¼ŸÎ(æ„ü— ä''¼#³z:™`þ‘a°Àô90AaAÀkòÇ/óGÀðÖ»9¹'à¬êòvAÜc§òýýˆ¾¾Múï"È'~žþ5èð]Jjú0*¡°¼øaúfú:̹9™ÇŠDô× ¦\$ÂB'²–†8Oâ߃}¡!Æ­îH¸†„¦q‘`–»3^8ßn0¸½½Á‚Æ{¼H„Ï3¶TÍò§y§9µžìŒè_^Лh¦óYŒæºàÜFóóƒ“SÂÿ\ášQ0lѯkF4c:±‹+A¬ö‡g8@r¬àÕŸåÜid™Âº*À¨²Û2(HU¤ºæf‚KŠ{3°Ož¾7@·õóå0´oàsy‘J/a…r}?XIÕ¾C]éb}YQªõʲz_ŠcIQøÙÃF5é¢àM5‰–‚cq½ßU®±Œþr¨ @5ŽÂjtù¦|ɪ ìÑw³»LBmQ:½%ÚiCGˆÁT6á ªíjy*èWñ*2mª´³Ñ'&`.Ç×UÏNÈp¨Èâ6½vÇÎöªTSx3 WÑ$)¢ÌÌÑ/D1ßü–ßÅ5zó›!+zèõȱ…¨†“š…´7œƒÛO ‡z¬ï¢S¥› D±ðJ#ž¢eèâ¬ê)yL`Ì­2B1»?,–Â衷ص[쎂Ö"îˆÏg:°é9ŸÈÖ¯ò‰‚€TEɹnFB‘%~}¹ØÏœ9ïøí@&ÁÉ‘[ž‹§Ú0•ŽLE?ÌTpUl*˜¦”#ÃOj§gÿé™;ÙiE¸iE¸nEñtŠVôn$“ðD.GyΤüíL µpÙÚb”*õ–ÊiÇlFõ×õ"Tt,^E½¦B‚Ùî*¿êꌳUKe>d rám cÞJ5ÚTCc_í4*’º:ꞢÉZä× ëóÿ²h‚›E“Ò* LÜá‡XIjW^¬$§m¦4ü® ýñµ“Ú¨”Ëe\Ùä ñ$ol² •M6¸» t졎K;{™ŠQωÕÀÔP8õ‘-­RXy 0+JèƒBuâMy±&¤‚æÈÝUEÛUKx?ŒWa…ùçHÒÜj’ö€È;ÌßÌvb6ÒÍ>û6¥›¯Ö !$ºðÓ­Y®rÛrý-Ë}‘ D¡Z.èÀì¼e¹í¶åêÇX®»•3šÿEËýÙ ¥ qßZîh¯!3•ë!d4B›Æd0„½€ºa2­˜ E„×£ü¼%›8£"””«gà’rö¤×ªxî:}*%üŽ”-õ!¸qbšKÓ·å3MÑzÜY–d»çP²Ïþ—ÔZ¾>ÀRH;­¿âîp¸ŸTbG3zÙT,~b­£¬¬0¥þ? Üh)ײ{ÔR¾.Ó|¼ðKé߆Jn¶ª`»U¥VZUnÑ…š_ÞªÒM«êÕ2ÖÉ Á ³Pfj¤P§¢Ùò‹µPÇX±×û lýAµ:Ü®ÕõF­®nëvÐòiéŸg“.#æEX]KI$«Ðó‹ÛB×Òò¥Ü/Oèï†)F¼¥l{$¨Šk˜»¢2¨Å}7 ]acl Ú´P¤>e!Æúüb­°a4”ä”o®.yõWÃ*¬º•>‡Âïe±óŽØ6¨û¼§•«x ¬Ú£Uñ< {~V±d?Nò<̯íáS®“ÐÉo4í|{2Öü£mh¢éÔZß{­1ŠÒ.è±Ik`%­ zŽ-²æ¦TíSÆ>(MÏ8yÏ숓»{ž 'aºUºU¾æÎw¨é]ÆHIcçÉ#ÍÝåB7õªk7:×‹Êø¼6Ä SD– £ø;·»yCqéjÔVÊù-IQç’¦›®*œWޏ“Í“Wu™Bo‡”3S:‹9=¥~ÇLC"]Èê, Á6\ySFœòU×úþÃÛ¯þt¤SÉMu›«>Ìw•hð2W} £•zÄ„lŽñ‚¸Q´ìÑ–é—ã)£¥%m›ºüÛVVœj¦Ú;ÐÏÁ±hHŒK†—f2žŸjTª5ìV©`pÜÇhWå5Ÿ"æ0Š1-·ó¼Å]Ÿ·´0ë™?¶_›ù!S8$ÐŽþ?~esÚ6–£ Ć+ªÐø‚£ÖSÙÒK†^úb°VHü/_r¾¸aÕßQ¼¡]»Õ›}g÷vþ<"þõv¿Ä®~\çÔ©ÚðàT:qÔCZÌÏhæ]\îR‘žy:†ŸêlMémí>,§¶uµgØÆ•aÕ Û¸»†mÆõº¤¦ê”0þ1=ÓGê´§Ñ›àÚPÎzújb›:lužW“'z²Tªóו\ fVÇÇÜv£l÷©þf(é›)Ž;`šì’*âÆ(€âvÑž˜£±&y§˜Ûu=•†m£¦îÀÃZÌUæùÇ¥‰µ;/5%ð$R|ŠÎôTˆ^œ‡¥¢˜³¥ò˜°³Ë” ±«+{<Ñ[,¿Œ†ÛÕÙ# %´Zi“c3&gþ”j™”óq•a/l¡û‰Äž}–é22­k8óo ¤¿i젯ƴ‹/5v ¹Ü–¾Q;mMf“2CuOÛB¦¡nå,µ\©õ’ï,7þþÕ— endstream endobj 49 0 obj <> stream xÚ}S»NÅ0 Ýù ­DƒãWÚ 6D7Êbâwâ÷ÉÃ)å‚PU9uìcŸcÎó!¤„ðz‚Ûnî"†XßÁ($ƒÉ4$…õíyØ8¦Õ6¶˜-o,:N¤’o´ÞŒ”òY¤Eù7æ;m™BÙ–K& ÍSñ[Å#y$ól£R«ÕLÒÐR>[­Ï^¿Dz¤¸Õ?£­a–º5+¢ñÀk`ÜÆ#Ç‚¯8/ëLÑÂÂÙpЮPG¨õ½—¬ÃD)z]uUê¹×þ‡£Æž]µ+˜r]\M¼šš\ZµØ%ýÑ@Åî‘6¸*u¶ópÙ´D—Jc»·):Qê+q¬@­3?™ô¾š€x¡]ÙU‡U¸v mo|Ÿòt˜qðˆØ¼yº®«“ï­+2×¶]m©óñ̲yjKw+œ!È2Ã'D›ƒX3c8Í1̺;>à ÿ7DDò“æ@V¹Íûñê ýºÈ¢ endstream endobj 57 0 obj <> stream xÚÅVyTSgÏ#𾤌#ÍT›g=gÎtƶ¨u$Ö.VgÔb‘VQk«lBlšÂ*d¿/KB;¨mE*ê µBÝÚºŒÚe:zjž.ó¥ózŽó¦ËŒ3óלä}çž—{¿{wùÝP‚à`EQ3Ÿ[ýüÊ­ñ 6®Þ»(z±Ôÿn‰/Jà[ä[$ôÝÌ­äÎÏ YõgC(ø¥ÿLú…ÿ\;“?¿ãpÃ,Á}9÷×F¯xvÃË©rU™ÑQßÞóÆÐÄÕdYFÆ¢… /¼#<¶äްô÷w„èÀOÑ„€Nô÷:ÑA–ݤsé‸G¸G0—Ì¥óeóe«eÑ }lU–<[™Ÿ–;/6+5-W1oC–‘ôªÛÞ&ùš£¥=;ÚŽTáùë¶pHq›zïØ[Ú.ßãêYO‘¤ÑÍäáÈ[7ÈMQý¡C=ÀÏõýñYf'Z¥~iyy¡.T¸9b.æ‡Q8ÕÕ0†YšMéNÙ¸ŠŽœ°wôÚúñ»…[Ñ+úD™$ò–Ì4ÒÁt›»Š;²†7vÅÃØ”­Ü¨/ÓA1έ/jmñ¸[[ŠÀ£M§7tHlOëWïÑôúà*acÍ—peéë±6ákjUùVª©¯FIÊQa¿o•¨Äƒ:¼Æ4†»€d9ÆI‰óT ]9–×KMM£jð¨xÿ‰¡ûO:jªkìµ,×+ÎÔ–ÆM)–¡¬lËC. ÞæªC7WâB]&²´ÂœÌ„ÌDþIë**+ô»ÍdŸx¯Ãý–Ħ#Y2‘Oij¦‚‰¼ôŒ†ÜM”•'Óí„ H¯ÎmÅÍõLäPsQ“2_S˜s9÷È‘+mï´kóó‹T9m¥mB­Ê·^Mù£Bá¾y;é <®‹Ö,¯H(Xö"ƒÆQîÄM ®OyƒJ]R¬NÈdŽBûE×á–ácûu\‹ ÑÖØbÁ7èG‰Šá® 4¹YvWT~JÊÍß>]ÇošÉÃÂA¿o'êê2í`¸^ôbnN2oú¨­5;È@;ÛÁ?$SìÜÙîNˆÚ5e­´–Öšë¡é´kÏÀä듽ŸÙ]§ÕÅr_‹Ó5Ú­ü1ž"”›cí÷ûîku ñ %X4ÚÒDŽ~‘&sˆ[à —ZB~ÜY;F¶³ Pn¾mˆ!R²ƒ“¢LSQÌÏU΃¼~ãÙÜ2õ6TLA÷óÒ!?M:Ç…$Ç'â‹×<óðüsü`Ï!3®ô÷•$œ›-áæp ‚js5TÃç§î­wxlõp †ž®^ÁjØB(„xÃs²„<ùÎ,‡¤K•g±©êLuþyá6y}_ª©¯GIݸpÀÇsqzµÝÀ|—€@Ë“p%–e›’²çÕÐÙùÖ†%›Z·åï‡_‘ð«$˜3ð—ä TX x’{N¡L4¿+&nN'Ò¯JåB¿þø0C¢8Í.pá±³GÆ>{›µ\:Йõ?0 }€Çí#_‰ ¬Ÿ=°ªD£V5777Ôw¼ÿÄðZnÖ*îžy\èµùd&3'Fß¶XY;OqVd3°Fžä ØX¡Ü’˜ºÔ ²ºb ¯Ã9|ÙKî%A’Ã0¢hLÀÓÙž.+IöðEÝÍE…4Ò–öÍ–¶¦¶[7à>ÚË2Ü8¥^%7ªjþV\D ž,$“ûË=ŽÙ&¯¤_|½;Áï¼Ý$ŠßyÔÍ㧸üƒŽGÙ‘Ù&oS´É{Å6}µ–G¯«ÔõÉâ”­/IŸ0ó7/ð MË3%:wdÏ›üªéÙ6ܳÍj°ðúP\¼»Ø¯ö ¯Æ—·¨Jå,m)iL?”v0}Ø`¯¨~W9l¶WÅû‡ß¸r™ÅnnA jÒ;ÊùMŒ}Y‘ j/èT{ó÷ˆ+j+à„z·ÓcÁSÄÅÍSù>ùÏ~À¨®nµCaUX<ܲ:DC˳­üÙøQ—O¾‡”BÂÏê všÒçØ÷2ä}Ô]í>ñ=cþt¦f>•YŒÖ¼•wZâ¢_‡!¶¿ s÷Oÿ?¨Ä©9ÆäŸ›°:ÔÙiLf81Ê^jJ‘(é-Ú£=ÌÇȶ§›åËjwÓ<Ó|ƒß{ÝìÿÞð·OÞ}†è Lj…DÇÏ‹Ò!Ý”Xùtÿ“²Ÿ;÷훊˿<^!Û6FÞº{%,è”íZ_õE\ƒà@fŸ¬9µ%™M¼„̦ï°ÊZn»h’>q:5fÝ Ië™´Z›rØG‹JÜ(r²£‹çtîßËS”ü¼G²•öc ¸Y7¸1Æ5õÝͤé|“Ü7…|lÙ¢ø§žáîùƒžoÈežrT®aëp6´ÕºÚ÷¶õ´ïmé;j¬UnÀg¸9ôÂ¥©ôÛx_±ÿžÖuHÊ1•3°âSÅI&sëDJPš•€c±NžkºÎ§Û,*5Qìñ­t¹¥©™æ¶W#I˜ÐùtxhUx>ãfØÈ É¢Çi™L¶óö½ÿ‡¬Üâ endstream endobj 59 0 obj <> stream xÚU PSW¾WàÞ â‹˜mܱ¹mwÛ©Z|¢Ö¶ŠV±V]QÔ*U‚yðLx„GBHþ7 „@$(âƒ*Øú®ÚâRû»»µî¶µµµ³Ý®Î =ì¸7.tºufçÌœûÍÿžûýÿÿýß!‰ÈH‚$Éɯ&&oLÙ2kóêäõsçÅLJß-Í$B³Æ…fG„‰ÄëñÇÓ£ ?%F=Jdú”ð¾tRxÿÍdn'frÛøoãˆ8’ŒáMrNÂòµÉ;÷ˆeÕõà;œž“37>~nÂ(˜7wÌóFÁ¢…c`ÑX< Æ‚Œ±˜„%£`ñXÌâ±ýtÉ‚ø9óWJÅù%ÅY…­—îÉ*”<–,§K~õ’ËiÊ"ž˜G$çˆ‹Ä q•¸I~A|E|C|K|Oþ@Ü#F¸”'S! ëÈzRGêI di$M¤™´VÒFÚÉFbê8‚$Æ ‰ÓäjòÝqOG|YõHÔ*ŽRÑ“è^f&Óý|ôý˜×&Þ''Ý1¶É¾“ûäq¼sh꾬N^…LA[q à÷v y¾@‰¿@È;W:}=0Ü'·e'åÞáßz ò¸Þ!dâ]GÃsø8¹L•0‹Ávâh•ÐI¡äÖ¤€ï^?š.A»q¢w] uz-0˜™Á×ÛÀ6€?šŒ½æ>ÿ!ßÁž¶#À é*œù »‚†uËò·•íͧ£¡pl£ -PÝåaø04$QèFÄg!/ß;pêìûÀ|ùFÂ2žL\òÊÊ•K²bY‘¬¨¸@ ©­­ƒ*Ð8Lˆ hYT U›jÜ™R褧¥ÔÙ³§Ïœ?õÁ•o‡à.ƒâf~„‰óŸ{JÒFÙa ÓÝâï`Á_鑚ՠµnŒˆ,tëÃr­ü<âæð¾§FµQæ.ó)·ÃbvÜÀôR.îáârÛDɤ¥¹¤8·(W¶ïeLdàÉ€yL m”µVø€i YºüìIÐ8šòöw.³¯¹í¯hŠÀæ°ZÀÍ8ñãtdÔgÂFH¶è‚qŸ}ºÈDiÁÐv9y ‹/A;‚t~¦ë N‹ÓÔdñX¹eï0iå8(¨&0ÔU¾[±­ÈVlT›TPËHvêó…d ÓÅPl¨jªnÒzµ-«PÊËhkJѶÖûeP µ®¦¶D°oHÂÖâ Š×ä/pçnA•|Ä ›ˆÁ7£8RÃ1…x¹ m=0Á5ªË‡t‰@k‡—ó%ÝtwW]6 x‘ËðD<#?G\“LU€K¸âÙÞ2~rì`O×› }ܹ÷¨ø@íޱϘmÎfÚ¨TR Uú*˜¶/Ï|˜‹Á &ÔBë²t àÔ;€ Òø¥ç×—–éʹöÞ¤TJp²àò¶4ºD³œh; L#°ÙÑÊëÕç°#nT%¨@­ç3ñ'¾!8ÅÑgÛCÍ×"ú~É^­×€†QÑ붪ӹÂåé×vد²†Ðqs¹­ÜR>ížq?}ÏèÇÑS•Iî®g ”L~“½Ê4õ4õ¸zœÝ£Õhm°F.  ÖnF–H+VC5G†‘ –`+2eÁj°ü\ñº¼^ž†3FŽFé(œ:*?Qn|Є̕rÿð2¿^wþ›Pö×Ü8ÞNáãç*ðøw€3œ€"ñ«H„¶">Z‹’¸9Ek0mÀ;…¼~ hŒ¬h$–߉2&ÀEE_ex×÷»ºìàKø`cïÒý›íka`þ>¼ÏÝSU_©«Ì 4CÆë8ÔÆ;u7Éo?ÚçåZ}ñä¦-l ý^%ŲJÚ¾æFÁe8 ƒÝ¸ÂñÆÔC9½pº›^g>.ÙAK´i¹yêBpà`KsÈÉ¡Û Î-Y·4ëy‰§¢½½Åãï(m.¢LÌãϦy§VíZ·*k{×!|ñçþNWƒKï2Ž2Tµ…â}¨A×å/¾†º®óîžG×øú0rëOϯœúú#´"3p±Ð­Q#¬yB› ~B³fÓÊ•81%´¾Âë™îgïínW´œ”éî š4xûÌßR´š9‹ù|ÞÎÃë}ë­ë‡[lS+…#åâž ÓfØ›õë²R EÙeY°Ò®Õ~ÂèÁ¡o Sîú„Áš#'ŒØZÉ/m£;ui,>CgUÔnÊQWJg‹Mý,ºLƒ×ÔÔad©«p^cÆÓ¸yªAó¢œãâRŸë%ƒŸ"啈{áq>F5šM?nùÇàØE˜Ä óߘ÷·½~e‡šËÈH} öù>1L`b̳–S­6_]U¸+5/² ÇWÔ™ùfÝx›1xøCÇ¿¿ñEûïW 9i²Ÿîã2Þ}u±WNK¥¦#lƒÝn3[{Ï ú.ö¿uâ’Åfµší숔UkG%ù¦ã,:C÷¶Z/ =X\ꡃõ{XJU«UgnìNÞµ9m“¦V­ÖªôÈ'8`s½'ôÐÿEæÊC˜äye´¸Ðt‚½Kƒ³ÉÚhmnjvµ8ËÜΊýû:÷öZUvT1• •œû ÙK§€ü@~Oú…Œ i46Uko¶»].ç™ãƒ—ßƃ–Òöz+'"ÐLƒìmRiñQ¦(+»i°„EÁt»¿æ8ˆ2Z0Y¸½,Ø 6Î*Ðãœè§Ac¨ål%M¬O}x±ºö×g°xÎDèƒvçÕ¿‰6ÎB‚CáyèGå¡dþcÊg愯.L}Ž#ÅÞ¾‡¢Ãæ¹MÀÓ8ï¨ã¼£ŽóŽÉØÂÿ¥¾9óø$þ³ÂÉ㔠zÖšÝFþs¹¯Gt†ù’Vº«³>I §§5“%Öå +%H,¡¤¦Ã¬­éH¿Pr¦¡ ·‰bPdŠà†o ìÊß›É\¥Q3ÖðµIEË“ö*ÔuÜ]‘úÒÉ3,zކ&½š˜·Þ;}ù‡,X-än}^&Ùyû?p‡{à /B‹(Ó.ò絋•åMÕŒž®Qª*•Õé)‚=¯¦¥&é9Zá¥e&• Z ½¥ÅÕâ ´uxœ±ùr¢vQcuk)Ô0ZÊåÊŠpü¯’Þò¶½§Å½â×EÇ´6Mme ô;ïô!ênX@‰¥´×QZÁB‰BQ]^­¨VÔ(è»–ÑSe%y@é,õry4p£ï±·˜±¦þ¬¥ìëÑ’Ž~Qþ°0´°wµ™Á4ÕÅ‹x7ÿ+êÒ@Ö+¬š®MNÍü0IT‘Öq(÷…›‘¤ÁÝNá …1Žc£­±1†Øñ9=^8/7Þl6[îOý7Š o endstream endobj 61 0 obj <> stream xÚUßKSaÇÏÙ™ÛQç,ÑÚÊÎ9A–£1§!6ñ:(3œ¨YÝ,=¸•g³íÌ9¦¦ÓµcoÎü1Ýš:§RPtq"¨›¼èBè*¢+Aè/÷ŒW²3/úïûçý¾ßçù>8¦Tb8Žt·Ú:¬¶‹Ö¶®îËÙ‡zîW{©2IåH&ѸÄ(¤³„tRIí¶*5Š3†Ÿ8žeAa–Ä1™ØŠwE˜ZîX¬g¦çÒv/ÏzœÞûœw°ý,ǺxŸËév™Í—Lfs•Õ=ð8ûÀ”×9x~ ¶¢Âï÷›ìœ×äöô5ŒŒßÉ;˜NÖËzÙ^æŠÛÅ36;Ç2Gk™Žhus>9Óæîe=.9ºÃ¬ »-çŽGpŸÂrŽ)1ö ¯Åg%A›Ù~ßËœ&2íÐ_’LƒõuÒ_UAàù4HÒZéÅÖšt*…ñτT u% á(x Èd"¾BƒÕñ™á¹–—ÞÅ[)˜ûI7]]˜Æf£1°@.…W9 3$`ùôòÔ¦ è`d8:B>T'é†fðèƒ#£ Å"Ï&wú7Æ>øQî Ý„0šÆÃÂ8‘Äh’šÓ`sªè†QuŽ9//¤(‹¼z¼ÙÞ¯ImææuNe¾÷ž¾ÿ·V§*iHîC# ¡EõG@u*Ԃʃš‘žG4¼Jút‹ "÷G!1(JSø¶(…E"S*m—$Ašç/H¡5x:¬wl½M“wÁ=Ð> stream xÚ­V tSeÎ#í{?e“†`xëè  -P ŒÊb)PÙK«¥EKíÝ—tß’6ym’›4{÷t'¶i‹–Z¶Rh«Œ::(.€¢ˆÃ Ì8‹eþ8ó Žž9G=9ùÏ=ïýÿ»÷~ÿ÷Ý{ ‡‡€ ˆûV­[½e놹ÛÖ<¾ÀßßÏõÌßé'p.ç\(tNóàR¹÷g’Yÿþ½ç,€hšêZÓ§¸ÖˆûøUð(¿LòHÂK4ó‘ùKW‡DƦäÈTƺ¶îþ£Ã美OHXàç·pÁ˜±ÈoÌX²Øm,qKÇŒ¥î=K¹ ·áÞ¼ôÎæ·±lÌpp; Xè6Ü p0À}j™ûÕ2÷«eKýæ/ LKIÏΊ˜½1-6.3uö3iɱ³ƒò²âRcãbö’ÇÅkñ†à]Áùq_GXÀ7y ¼"¢‚PjBC¡%tD%¡' „‘0fÂBX‰*¢š¨!j‰:¢^ ' ãkCÄrâ‹q9™ÂW=žð¸àé c( uÙÆÏÀ+Ðëð„E>™Ø5éñIßN¾9î‘sõÚ>ç\çcBø¥ó¢8†€#úCuèÆËܬçÔ>n†óc ôZQm¹¹ˆÎƒÜ¬œÒ°ÌÍì@cßÀžNè#FðTŠ' 1å<&¶ïh= èüà3ËÅ>±òéëCC¶n ߬P¨ËAŽrœ~”Ç{Æ‘ìKÚçbAª’‚÷9thèðHÿ#ß„Q„%Ü´×ö娰ÙÑÒîÞ¶ÎîÞ´¶xzòMáŽá‰ÜÊüÜ~çå>÷b ž*ÄáߊcF)ࢠ¸rîIîQe9ËÊ¡ʵå€ÂÈt®Ô³—4¿¡ïè«}ú#€œÓÉÃpDÕ›v4Þ°Ö¼õ’é¸Ô“CÎË£}äs¸_ŒàM˜°åÆeròM‘W%Ý5Þó#ýÎK˜öÝr|ã•£N “c°¡/ŽLLÐÙ­óc}^uŽ%ïϹug¸àO¹gME•¹­Ð ú&Sý9¼ñ3¼ñ,Þd¶Ym›öÆ5‰O >Ýçã¼6ÚÇ¥EÀ*Ùb¹T²Žó[Ãù®å|•…ŠB¶©I¶±Ô¦°ãùkð<~•·IØZÖT侘rŽm;€ç%;¼÷^_ƒ=°ÿèë½¢³xžs¾¸Ãd7vÊða(n’ÁMóÇDö»Ì|d·½…´äó¯%:æ8F¿B(3s²Y{c©KA'¸iÑ×ë9B¾x·=·ÃÑÞÚÅ@[I]^-¡Üjñ‹‘ð”S †+>}¡åë6üÔ.ÀS‰R[* ¥qEIJŸNbyèÅeš‡`>Ú@Uqcj#ˆ§Ü„±/'Ó?غ?ªg[m(¬†yÒø`t’ QpTûÇ}½­­ÝU]ð DšWèrµ¹‡¤D¨CRâ¤)ñÅñ±uYŽŒnè¯Øçfu'~ÁŽÙ½¯ŽâÀë‹ñ8Ñh—s«8²@µ¶ P“MUÀpW¨Â|U-™¶ P2>@½‡'ÕbŠhqï9÷5œ¬wÐ%njM½˜K_%E£o;¢BH’gäädæ$kRm#KåPÇàݘ¦êÍújúRäØŸ\¸™|“¿¹¼‡ÛñŠ.¢“¸ä+!þÎã·È½© ž»ÆÍc ´hgbhtúXƒ¸‡1±Óô)8çp|¦Õë*A,e9/ãò EqÆKáÙ‘ð<„·eäõj@?²{ÀÀý•f{O}7 ¯Zç®t9¿tü{Þy”8¼ñ—×ãḂObx_ã9+œ@׸¹–ÕtìR'—(Õl¹RÃÓ³òZ •U”)^PVR2²‰nÍkížýCV¾H }([ø”,ŒI$ËXU™Ì ªfºIÑ¥‘/ع K)žÜT›àiSÉiT£¬,¥YR¦bËÃÂÜSÌ_ MÝç U•ÕÚjx{gw¸­ÄPl(Ѻ®ñ%œ«ítÞo'.âÈëÂÎ_¾?µ#ÊÍÕš°:^«oí9Ú}¬ûhµ­º¡Êf0Mz‹–;"ùùªJ4r@¹•õ _,õ<Êø •o54U6ÓUP¥1z™S§Ù©FhÔT*š…’­`Cm\¶°\Á*+Ê4xPbkªlºs€º“Æô—‰ËWî&ÖAÉA>P-ó Pg1XµÖšš:³^i` lK†¤+¦;¶+¦²ÂÈ‹J² „NÆÙŽ<*Jª š¹Å8\šÊÍJ#ÒRŸ ž8Á•ÃJ>[E)E;Òs ÃcÃãÂcþÕô?Wàœ·+xo¼«‡/@¢ƒ˜¾•B5¸. 55¨ò™H ü5¾ÒeI<%Y%(@©«³XÀ†:¤-i©ÙÙIáý)ƒ4žf<Çðî î=Ÿ–Õ› õô(Y_­Îg¸«”(¯8W•Kóh÷|=® ?Ÿs]ëpN·×ûÓþ&|åV´Ö1ÀTy wJOPgÐ¥ÉøYG™–¨ëd´ø¼5±1±6ñ‹ÜNk–5Ûšõ€AnÕjŽl‡ú·êº:ßë|ßõ—k͵úZ-÷ƒ¤(ÿV¤%·#-¾'"ùRi )REùÆ?5_¥¨P¨ÊxÍ©,üO:,IâL 1çôÊJ‹!¥5¥vÓFr¯­ÃþWnš6žQ“[aKñ ñÏïL_ kG_õÃ3é“ðQ§ãD¥Éh3²(tJZIæ®H)ËŽ|Q hÎ ŸaϳV<OeÚ¡½¢µÂu=(䢶 —ãåü`ÓÕ}FEgzù+’sËùÑNtðMã§ÿ¤ÛI«®¼Ì…w¡L-ã[Fdk²\ˆ;(ÞÖò6ßGdºz_tƒmÑ,tÙ {•Ht¦)M·ÒøPŽ—{ÞÑÐb;Žü©†\Õgt³«:øS95yQ'J`×nAÜÚßH4Í|¹äî§R+إ졿¡ê][­?2DøàªöÿVz&O߇ë©!Ò ìém¶÷Á~4ÊMn^HÏųȟªWL¿›ªqל¾1ÂEçÈãÇÖ3 UH ó3SbUñ®‘¨LUia~:Žeôæô‹îW¡uàm-x•x—¯GW„XŠ¥â´øÔ]©»£%IRÅ.—ËBG1åªç*#ÒQPÝÚZÝÐÒÙÚÑÚik“Œ•FÞa·‚,É»ÅÙm.°÷Ä…|*‚`SjRQf ìBO—0Lãù-â`rë*ý t«öíÚ=€^'«tl)3Y^íÜbÁ/êíÕ$i¤h/aÕŠ‰ãM½´'\öœ@/I ¿9í?EÐv« endstream endobj 65 0 obj <> stream xÚÕz xSUúw.¥÷\A¢Ç{Å dQdÙÙ·¶,ÝÒ½I÷%{ò¦Iš4ÝÛ$M›6ÝKK)û. ( "(Ê(â‚:*Žã søþó´Ž3ãŒßóü¿çûOûä¹”{ßóžwùý~ï¹aDІ¹gîºEóW-»rÞŠÅÆO{Îÿ·I¾%"ßÒ¾eA¾û’eäÝ?×ýuVðC"Qü^ú9àÚ0ÿg÷=ôS4†~Œû,D4y€ˆÝ%.zHô„hœhªèeÑ«¢•¢¢í¢8‘\”'Ò‹¬¢ Q­¨EÔ-:,zCtAôèSÑ7¢¿ˆþ‹AÌ=ÌÌ#ÌXf3™Ç,eÖ2aL4“Ìd1jÆÄ”0NÆËìbö3'˜·˜óÌgÌÛ¥ÛÂ’#Ÿ‰HO Û5aüø SÓú/ž¸˜¸x6pñ\àbrà"ðÔÄÀSOM <5qbàbRà"`gbÀÎÄ€“O üeràæÉ›'ÿü_S7¦ܘX}J`õ)Õ§ N œ08%`pJÀàÔ€Á©Ǧ,O Xž°<5`yjÀòÔ€å©ËS–§,O Xž°<-`yZÀò´€åiËÓ¦ŒfâìxiBjÊö¤‡ÇoÛž÷ðŠxiXÜ?üQ$bÄ÷‰F3O ?x¾h!³L&Ú&ŠÅŠd¢#¢cA§˜3ÜeÑG¢£  Ý-*&ºW"ÓÊ”ˆîÝ/ = !zP4Zô”èiÑÑ,Ñ\Z©‹Ek£g 0F¦€Öœ™±0…Œ•±1EŒ)¦5XÊ”1åLSÉT1ÕŒƒÖ¤‹©aÜL-SÇx˜z¦Öh#ÓÄ43-L+ÓÆ´3´f;™.f7ÓÍìaz˜½¢Åþ6@]Qоef1Ë們2ƒPPÛÀ'Þ¶°Ø}h+ÚÍEš?hÏàWã»Ôw}2døÕÝ÷ÝýýеÃB‡uÞ£½W²@ü ø›áÙ’'${ï›sßë÷+Cg?0ø=#"F|õàø/ÿaöCQü(¾UÈ|xôÃ-#×|÷‘)T<*qbÔ‹£ŽŒÞ0úƒ'¥O¾;¦xìì±ç‡þ-h$߃‹œLöJd·KhèßÅ13I—ý5K|wB|Ÿ¿­dkÒå¹¹d¶žÌòŧȫøqrYW¨)®Ðd1 PœàÌ+}‰ÂÓü|^‚ïÁ÷X,%6(âÄíYËÏ@o0׿Zš5§Ÿzƒ.¥Õt ƒ¼Ú4{î_HHy È$ OE“IcÈÐä„P•*W NcÖYx[Ràp–”à{ñ½ðLÀÓ/\†“'ð0­ImQƒü‹ù—¾ALfÈð^yȧ8Hæ¤;›[%1ªÀÿ³$iyøN©5§´èÌ|9¸[‹«k;ËöÃ>n—âì^üqLzRbœ[^'T@©Õnç†âe'˜b¬—¬ÀU'Pß .Ù·þÀ‰àû¿“Äk³S •K©Hhj¬®­åÅΚLO />B7hÐ÷îÿÖ“7d®Û¡N£<¤ólÿ@|çÜ~FB–e¨IŒ„gŠÈÀ7ç6o?œrðX8ŽÇ`ªŒUP78hÉNܽkMíàÄW4 1h€#ì18ý9 §-§MæÝÎfWs«{x¡!Û™²g£y:Ìæ–!H4ÆC}§•¢áÜO‚®ßž&‰![‚ݬm¯þ@73[î‚àðrvÓ+k†ÍYúØ2„zÅå!Sju– ¸†Òš¡BâÜ»Ï|£û¬Í^h…2®M†ÅºGa9,+Ô5üRúw×…tí—wãºÝ²âx9þ\b@3£f-…ñÜ£?Ì¿õfÎã»x8)=º±%¹2¡4¥šVë©ÚÓ'á¸þâñI…\.;a«£˜sxɹXn4Y'ß3-3\<|äx›¹Àb¶€¬j‹nwBè¡È·Á|î¹—ÖMçgÀÌýùŸPƒ.ßý’"tîýÖc§¯DLåaņ5[“µ:ú¹©ÕÅë›×*ßøÙoíð=VËtýë?òã÷$F&F/›½#e3DB¸-¥«u—6¸²\ñB*¤eêS85šs.ê'Çxž ?ÁUÑh¡ü üzJq¢%fÃ’mË·+¶ÀfîáK$â‹Ø“p|OÙ NOëòŒ¹§ûÄ8àÍÅÃ>ºêÀèǯ]$d™ZJ`Z.À¾—ý„pãO”oî÷ÍúgNhïã„óýœ@® ü‡[zÿ?À·r/ÎòúFy™c_ùf}äûü-IIR˶2à¬Fk¡€§#(4XigµÕôð^Ò E”0*€ëlU‡  0(A ¹t9ÜÌÙ&òcaÒ± ×cN¨.ÂøÚõ—«oïé8Qsð@xo|`N×E:€+)° ¸Y v¯u®V•œ‘’“´þðêæ¹.%KÉ2‘l!‹ñcd.ÁÇá·h$‚~~Á\§”Ýé Áü5q{×íé’äGÏbàZê5ÂJD¡GEùwg´&†§á5æS`¥Ì‚(³¸) ñ6rüX“@™¿€ ªÁYZì©­­¯¯1ç[•…ŠƒsöÍ90»8½6’¸äxmï·0ˆZpš‚ÿìa# ÞÛ™åÈqf;}¶ìæ¢Oõ&‰©µÔf±ìéÚ³gO×á{;Ïç%¥ÈY.@RdbZÆSŸzvÜ8_Fݦ=¼ËK›¬ ú·Ò¤Æ†Û=&yïæÎïöo®57jw  6ø÷DwC·•×·-©ÏŠ<ØN9,œ‚ªš˜x5%aàf±òLK½àëF-–F vE†"à<¬¸ÝKþ€ÄçûÖ«_ì&¾P‹ÏÐx ×ðñ¯ÄºoÏ”Hÿíªâ,)f‘ø€?˜yØ\è%Θx0ux ºiŃßð§ýÖ“çÇ”¦¤C­Ç1ä¦7£ÚŠB'ïb/_ÚA °S»-%nçÖåŠ5 U8em´#ñTgH÷{8üÜ%·øf|œ¤®©Ý¹¸‹‹ç ш°ä…íD<óSé¡”=`>ÖVº—3²¦ðúˆ½Ð --ænîÝäuHœ“  ‹ŽUuÖòPl,bó¨÷ª„ûrâÑ©‹ž‹z1¡2­Î]]U[“îHâõ}‚cÈý’QH|æn\µ@ËiÙaíû *üæ/»nš¨³FoÒ+œ¾±.l•3-W±ãl>é^1ê¬Õ/HŠîw¯¦{2ê r/ ú˜"À½ÂQèªÙÕÍ-@ø1{°7ÅHMûß_ùøH(â^²_º°ÏQâ²P>taÛ"+-XŽ< [£Tæ%mÛ¿ fÀæwòßÖ—A™¾¬$Œ^ßhÚ+ñ€³â/;(NH+P“[³Y ^‘¤_ËKño&JH45 ¾»Ð*œúÏHr¥I¾üE]öÚ¾ý¥“gƒZü{¬BMuÚ´#AÇË¥XêMaã“LmÂí`Jõ†/-‘ùžñ2Õ¾Ùi5:æØºEc;Ç´±äš³Ë¡ª/–·×_ð¾SÁuÜÝr”ö š« ž˜ÀÖj²)Å¥å§+ÓS—'­HY®ÊP§+3¢¾ØþÙöÏtVmØ83*t5€Ãÿ]ïæâ^¼Ùë[+gš%Rz‰âÃË[„åö*KyisE‡µ‰Ãz¶ìk‹íR×qÒ ÏûÁÁe ~‡=  ö&"¤d—ä”jšŠÕxý]‹G¯À“C5źÂƒ>U•>Ÿ,]H–¾B–g†gF¼@ f Î’àAøU+×üíu„ûÖØ@eÖ·Ü奺?ü>>ûÙ«_Š»{[ìw –¿Ä©Õà08àSøÑÛñ“¹ÔDŸ,:1Ûf•[ät‚¨4–QÑ×z¶æÄJ£—]T³½,ÂAuw¤hó"ŸKðˬ´'3exuómøÍn ׂð¾ÅZ¼ÚWrÈV2ˆŒŽÛ›·¸6ÈýBçhÁ¥®–Vïþ‚š™¿²gá¢Ò5ÍeŠ´DöÚ—ÓA‚êü¢¤–6Á׌v56ò4#†b=‘ÿk°D›–j ±!d•y`Œ¨ ¢ª¬¨ 3xb£#"W]Pº›ÇϱN'D wÊ(è^ 2¨ j®`iMžöâ6ê> otýçPI}o¢Î^LÏ[¢ž¹eËæMs ˨÷²Éé¦f{n èÔ;ÊSRªn\™¬@`f¥Ê"ôQÀ=‹ ØÆjS?ÇᜡcSK„y…uÝÏ¡°¥p7œø oˆoÕg ¿ïCø¶Äj¶mî¢ÐSu§ÂEßKø×ç—Ú¬‘z½N¯3p ùQDz€£@%uTQ«KøjÐ5š+·¾Ø÷p—ß[ðnÁ¨¦8Fã’FR(—[Ž\hjmj9n¢\ÞÎÖÔécü‘ê…7 ߦ‰ìͧ¸ØÞÄ1Tg4ÐXÍó,a·o7ÓŒºý£l!MKSMA ßž‚wT®©¶(ÓN“_ ¤õQ"UòºD¼Ä—E³ò=õü=Z\Pc(Ë/ϳee}FF}Nžü”!)5vÆ™ïñX '0׃‡ua–þîÆ¬óDuÛ9?v¬–¢†]YQ‚é³”™šì­….Œp”k3ZSšäÍ+¾^þõò¯Ôö<ÿÜR€ \»¨~¦Or(5€þ½gzGêðUÏ?âLê¬×‡ ä9ô fV}È_wMïz8bGÿ}àAº©AMÁC‹¢I¨êU~»ÕÙšÛ©¥­ ežŒÀ]Xé59 œ~Õþ+Xé­D/þ° ð2¾3´Ïà$9ºUŽN®‘éätªM´$o©+_ܶ9R4šBWÀV£´.é—á /ßãV,È_¹|ËœYk'k8û(Œ>Žp6d7çæëj^ƒŠÈ,žŽ‡Q1±?‹'ãõxg“uÂ+ðrÒ¦5²Zéál ÐúŽcP>(+ø €fSiíõ®þ×àêÆ}󺖔τYÿ¿Í¯½Îº}O»p<Ä[—ø>nº*þñ8¾"±"xÏõá_ßÿAÁ…ªN[WeÉ®Yµ&%d9š8eœBªZš=?ksØüÅÙ$˜*·DG 9¤qÈ6ò£Ñx°†£°q×·ßâ{ñ  ˜%÷ 3aüÚ¤9Ü*ÓûbÁÆ}PE9bèŸ[Gåáù|"&ÃÔœš}6œW½¯ÿÕ‘¦‡Ñ°:B~<‡_{oÕñ t´”»P}–÷Ažªy—a#ºˆÙrÌ Ê7'5o°sbßž²+Uðì[ç‰,-Ž1Æ7‘l•üÀŠ<³7lÉâ¥+…yl²I[^¿2GPiªp™¸S¬ØwèDÊòY£ó#êÆÞŸF¾ÌŸÏÕÿËÕUÎx–X¸[À'Pµ¥ª–?þ G4…dEš<<1¸ïà€<,Ó{-á 5x¹ùxRæ·Xt‚‘ÐL²Lá3ÉBŠ‚¦Ó)¯·ÎÝaj¡ÉM`À1½s¶5Î$-ˆ£–3ñB:1ÄÆ™»|u¹,Gy"ß ‘$gè2x²žUÕ&°‚½²ÌVràbÙp•¶²¿žê-îFþ[cÏKÈYÊ“þ\ïfUt¸ˆsà™N¦áC¬8DgŸl ÞÍÚ-û·«¿%CÉÝ Ca> Cñá2œé¬ßh.0™+T[4|&¨£ÔyIa›âÖÃJX¿+õPF§¡º9£Cò~÷ÍkŸÔšÍSüzq«¨/°¾{Îuøã€NÁéUÃ+r›S(Òh”*­fÛÚЈµÛ–nÙ"“¥©¤ÀÉðkN”ži­ ´¨ÜZäi«o­o+©(+·WVä–çTäÚU¥*ÈåAÑšì94ARgŠM4u ß!píóÔ:ìeY%™õ;ë#=;­Š¢,Èá²r”2¾×ôZHõîÜßßß¶íP¨Ö¢´‚…3RBi®©(9ØuúØ)àh±.øñ ¶D[¨|ÈÉËR)•ÊЭÛ×EnÞ‘§ÈSä*9<¢ï<ÕÆín(ØÏ;ˆTîD í6¿¤UÒ’h[cDã¶ÆŒ²´ÒÌr¥-TeË+‡R°ZJÌt¾ò£‰tàyÎ|éò+ï‹¿ÇX!驺Q ïp·ÈøÂM| Di¥YjZ­òÏjùÖ@Á\©ËW ½o¾tÜ È/w‹ oJÀXl²;Ïœt¾ÜáËs—.Œ]-¬fU*R0*­Ôc®™y .g½È)Ðä™)Kø•0»<ó-mqaM:Ït*¥±•Ñ.Y[ÌÕ>øð°²b,‚·×4­ªÌ5ç˜sŒýçeæÁ¿Õ? Ît”kìŒE6[¡u×ÁÐÆÎÆ]ŽÚjÓÍ‘*‘¤[Û{c*ŠO4ÓF;Ø_ï$Aîð‡t‡`P(”Õ¶u¡k®eõ"W¡– û)ÞÄŸÝèlŒÅ#Cz}óÿÄ<èºÄ€âscuRˆ©)®Äi­.'þÜi5‰F.*+)iÖŸÒ{N^¯=çÎpG ‰úŒHY™¬Nû똞ý€þ©÷þÈg»~wCúPO܃ïò;]štáÌÕÌΛ£X1~9dC–%¯¨º€Æ£†«É¬LHÊOÎØÜ.íæß„Ús%‡ªÞ-üÞãÊéj¬ôX¹›¬Ç–“,“Hœž®^þ/“âw¢øÄ7F§Qæ{š:!ò࿾!îiôûà@õ ÚíÉD½oer¹E;Óè•N±£üMÁˆÛ¢œ‘eQtŒß5¾c<LJK.Ãl1˜KÍEÞ‹¡7Ú?ëø´°ÌZn)7’¯CÅ=a‘à·í÷%¡Ï—ÝnóZ ÃQ è²4Y ³•­'¢õ˜ÙŠlÄŒ¦\Wž?§·öþC×ÈP\‚¹S›ÑFåpü3’Nµ[¥†¿U¤„ê(‘»I¾µUXûºÄO¸ùµT0 P]„s|+$dxÖK æF~Dã‡ð½7ƒñàgq0Á“‰UòÂé¿NŸ@[I=_Á¶C[A;pµM”@N£©~ÓofÛOµ¯yñ3Nß“n† ‡Šƒü§â½Û¦sa" 7là¥8Á›‚â’Ím4Ïs\á¯ËöÀøîo~ÂwáS©v*¬„M²ˆÍÜ[WD;#üÑq*ª-7Ìë9Ôû©”’i)wôíƒoÜj%’YªÇÜ÷VÎFã²?¯.&ð} §ŽÖ8¥‰èsâö6Ú<2‰Êˆ‚6ãa—»ÚÕd©®‘­3gÈrA’Z­ãÄ ):?¼PZÜÿ¶ì:SUE¡ðhË^AseßÈvCW^ÉJKrA²1¹W×L î;ó'[œ¾Ûr¦Ú7S’aCG 0½}Rý+u ê_ižjRZó@™IêLÙé¬W!2­ÙÅÕ¦ —;³ªR“23S6ì•öð— ýRÝ›øaüE¨ë°óú{~Ô™£ ž”ÁÖWÉ’PèóuŠä¥‰Ë’—¥oÕ*´ ‚²².×W›x&þLÒY­Mëÿ¶Pc+8yÇ8”8¿ø¹ ü/nZ?ÀÊ·°òÃ ÜØ÷îfW~¹` ›Ó›6Uî€Ƚã¨ÂáÈÝz‡»¡ÞQÛÀýÒZ´zÖó½/?4ÙÜñKÿ¡Ú¸z9•ûxè·ð0]£ÓhÔNO'¹7‡N&z…JèÿNÞL*ÿ "ΖÍ.KQ힃ž#À]ß?j^F‚!]÷l‚„†õÀ¥.S'ëÌZ³`«Åÿ2äJ7ÔïÜÍÐTÖXâ‡Ã›Ö wv¨ÔNªô¼ê?âã™$}bç_b Èq’SŽâ¥9eå0ÿ#·t‰ÜÁAxàÇTý Ix0y€&LI©WéôJàn¼&éBp¡ôÊ•– k…©vAGz­´5¼ÖÂÝôy›d9)ê˜ëÎæ_3ü¬…FXÞ¦0êdÎ_ÅñtÐNÆñ’ìd¹<#5lõ† ô{×8QZ” P\î°—4t¶vzºl6ca)p§iïôCQD¼nÝAü?ÃEšDF©žœùSÌ>?^!é7> stream xÚ­VyTSW!÷DD!¾)j}¡S;îXG±nHëV­ »€¬a ‰ì@’‘UD’@PHD„÷uªÖ¶Z•V;J«Ö¥ïÓëé™—YÎÌ3ç¼óóîýÞïûÝß÷å—Ë#¬­ 7bçªM|¦zy¯qsµ,Ì ÃÚ—Š96ì8‚}ŸÇŽ·b>ûžõx‚àMwà"ñr¤%þ0Ê?â‚Ý2Gšǣdé*W×™.®®î^ ‰i’èÈ(©ó¤°ÉÎn³§9»»ºz8{Š#$Ña¡ñÎÞ¡Ò¨q¨”{‰söK‹Ž¦9Oš%•&Î1#%%Å%Tœì’ ‰\0yšsJ´4ÊyMDr„dkD¸ó’„x©óªPq„ókÎ.¯£W‚8Q&8{'„GHâ9®v“xS WÛù„?H„aD4!¶ÚJ¤r¤‡¶„á@8Bb4A Þ#œˆ1ÄXbÁóˆÄbâSb±Šð!Vë‰ÄX+‚GX!DäåòÎ[yZýÈŸËl-·¾g#Ø  òµ‚cd(yŽb¨ï†;aënû#«´g°VÿÒOÇ{|оÇy4hA“^c,ò4Ðâh1‰*+@ZjgVÁl·¥«±p¶ÊÆ|˜ óËñˆãØæ ygEPÅEÚ¢b£ ¼ii¸!G#Ö"4rÖÅí@) "P‚ª&í—I'ñLÀ€nÁŸâQØq[6¨@I)Š Š™2¸÷åi$<‚¬*¾§ì_왣G‡Í¨KÇcmÌ|v:J§Q“`W èt©%ÂM¨Y° jRR 5‹Á͸™ÌJ…””Ø%BÜ› Ru:¨ÙÅØ³J™á…“×ÞJúùlºFÃÍü›Q_>ôØ >°8i³Kì’üùð ,*r;¸ðÐÜk)=Ðßê;4]Þq¾£p$¾F‡ÃjcÚCù€Óp.•ôÕ áß”¡.¥ÕL*óƒ…°ÁRùç™ÓÖˆƒ€âjƒ‰m3ur%~ÍGÝ/FÓu ‘2ÞŸÏ„X âHu´žzUEF*³Ý˜Ø8A‹ö.˜Íw¡Ån‚)–tS–·‰,0×ÑààS“cï ¾/1 Y$¼NýŠ\s¦žŒA·›ØÛxÎp÷ëmuKÅÁú´ú(&×¢±ºöb_Û) îšë!‚O6Î[ë×â'¹œÛM¦„ƒ,)؇ÛHùâ¼àí™y¹ËAöš½lßUD¡ µÈöé9£c²þó3ôÉÀÂ_…˜@‡Ð }{ï©+œ<·gž˜ú§…> c © &¡¡72SÏ¥ÊV —¹‰ [å›,öVJÔ¹êdUäªóÔ°¾’ËwB5Ó)¸Ý¶t2~I|°(UGnÉ7àÕš¨‹OŽÍ výi9â!ûû÷Ÿ1\q¸½òƇú7ú¢±&6”¸û:'0ò ?&#UrOfkœà ö(ttƒƒœ”[IOUy«èîÓDÖŸ“½8ƒÉá&37ŸyíG"£‰ÆJR²Ãl^Yý‚VÐ{ý޽ýM(õoÂçì:H£áO0ÁøCHFd…Ö“:Es^Phä•û•ÅÊy"5§j¾2%gSÊ2ƒÀú\­Š[£¶Cn†÷i»‹Ù mQqùî¶¾[pŒ%i»·hÂa#%| Qà“š¾%)Úcé§µj­º¨æjc]]º1&+*/pÖå)ÈZ$|ލg‘Pôš3ûÇÚþûf®Q÷PøÀŠ{ÂWÈ Ý¢ëHTŒFµaê Caˆ¦2à (®.Ó°»±´ýLð_æàÑx¦q’HøëõéOˆÿàgîK¡ûCÌg„¯–– )þŽ¿¡W‚øŒ¢*­nÂêFÓ“{Ìnè“÷ž-°6?lLûæKߌž½xwÂø`€Ï&²Ct©Åbô.`{PUÔPA Þlchw—ž¯¬ØY|*9)ÃòŒy˜'‹qÃãb°>⤠êê‚ÃeÌŽk—ôÕîºÓyîÍŒ¢¿žDÕÜ©{¥¨¾SÚ+|„f³t`cÁ~¨¦Î^ì¸zíÂz/Ö„ûûDQ†Lú«¶ž£p‰p?é:q®§ iš Ž€òì6‰1þê?Ë&Q<[6ˆlô?g U~8¢#UŸQö¹™šJ£‘ó÷¥v‹aÕÏEë=fyëgàTÓ…ºßðiø¾–`iÊ~>ºJÇ’xÛ‡¾L:¬Ó$î§:KªMÉU² qNø²¾Í? Ù£÷Q,×dÀä—îÌZØ”´9H ‹(ìðãddÍŸŸ…ƒµ§(­ zÁâWÝú¶½½*[¸†4GWUÄ­„@jNô”™Œ=j„!”0Ä»3ÄGkY{º!¹.>>99>¾.¹¡¡®®Á7¬ÿcsa4ÆŒ\̼/¦ó_x¡›tÕ;~õPðÖp«DìüýÖš3E¯~d¾³b®.Öš_N3ó­™J°–6Oy9í‘ÿ=“ü—ÝáÜîÌ94öè÷iSÂÐx'¥ÜnB±†ú{n]ÇŽëþhöåkF¡øºó-]¶7´(ýÙ]·D'$~¤¯D!)8¼ƒA$t@{d[xûÆÝþ@y, X.Ö¥×ïÛ£«AE~s`áÞ–žrîGÛs2Ü]´…:¶Aù™r¥xQ´d=SsIÎ3\•KÐe®é¦òÐz"9Í+:hÓæ–^Žwô#b®×«åFÔ<ÐftÜßÖdYlyЧÑìÛǘR8¯n‰Ü¬Tˆa•´'e_½®ºñË…í °Ã LàQŒp~<‰ó×±MÈ®¬l;(9KR¨ñ.+²·%d¿˜yͲˆÈý‹Øt CŽß }vIøúŒ]Ecg¹My±T±I„ d–1qdSaŸ¦®¥EµŸ³£¾‰ëíׯAeGduEXa²Bh¬‡ÖRxD³·þè´er8,B+Éß®ž¸p¾|ÝgýOyëAêF ù‘pLq­YÕ1:_î®ì“‘u׳<ˆó¾€oJxkÄX+ì¹R’·‰óº£ÿÎ]xøÿAü¿zGâú?H~KB)7²®Þ¾~ÔÈÝ+bQ FOÂ#°ÃÌØþm*7#žþ‚„ NÂtë»$pZ¡úê:÷vuëÍÐ ‡dõ!õ!à  ëdÁ² àø ­“ëÙ±&^ ›Åg?FwèÒÚêC— ))UÅ«¥Éšt» qd›º\ ©£*(„Kœ°5jRTr^«Sß{)Vû©¤‰a…bKúy(RTÆ¡ 9giò+9Ï-*-*³”³èjâU°…|dFÙtã=uõ¦ÖƒUÝ–¢I*±:Iü…f›E¯*Ù±}[¾Â{¾Óü§9e\Åâ1PUUª{­^®ÊØP˜hɾ…ênŸÇ˜všŽ‡ûû®Vm…1qd½ÆTXßСª³è/ÓæUBšÏ~õíD§ye( ''3QÍÝ” Oh {ÛÕ–ÔuœcK({™õªFñåÅÞ\Ašl/7”ÚÙ]ÖÙ`l­gë송;£ÿ¬ô endstream endobj 68 0 obj <> stream xÚ]Ënƒ0E÷þŠY¦ª*I£FBH)‰Eú",²4ö@-Û2fÁßÛ(‹.lϽߨ¨ËZ ѧQ¬A ½Üà¤fÃ:„$I \0»Uþf#Õ$*.T¿Ó!zkÛÛWùX\š[?µ×*9Ç>Œ\nu]6Ëdq¬e¯ Ë@ô½:NÖ,°;sÕáƒë}ŽFÈvmÑøN3ký‹#J 1Éso—„˜â8iÊÐP9 Éâ8‡¬ªr‚’ÿ{;E׳jHvL×ÉtŸó•÷_¿8~|ò~›Ò9» î°Ù˜u7”ÿµ[PH¼g©•v*þSt{ endstream endobj 70 0 obj <> stream xÚuTlç¾³û²Pªœvµ]M#вÄÊÆJøU (U!´% ArÌáÿÛ‰qða'9ÛïÿˆRR›¦¥I©4DšM+ªP'uÚÔŠª¨R[©•ºÚï’ϰ}¶¥š¦Ó}÷}ß½ï÷<ïsÏ{4¥PP4M×îxñŶ½ÛŸÞ¶§µm­¡´³Éqwÿ¿ç_­’~KI+i©^&­’K+ÚÛ»ÿ©‘=AQ4,+G—–Æ“‘ZI•殺¦«—ÿ¦qö?߯Ú>ûòëv³Ç{Œ6³‹5zXWynt¹œÞÃ]6—ÅÜí¹·èrzºYkgž‡Åé8bs:]6öˆ§<)‡šX‹Íâ0—6§åmƒa]ƒÁдÍyÌW^ëW™Vë×67o\£o2šõ[ì¬Ëb2:ô{ŒÂnô…Mßê4YXO¿jS·Çsì÷^¯·Áhw78]ægV¯Ñ{-žný>ÖͺzÙÃúgþy£ÕW”j¨<¶9íÇzHYú=ÎìËAô`(Ù£ôjj ÕDuP]UG‰8ç)5IótˆÓhé(£‡©ƒÔ!ª“Z&£hJA­¦vR7é?ÒÓ² ²Ÿämò¼ü–b©b«ÂSU]•«úP ÕΣ¾ý…„äóõ¨O}v²Yô銕}>ðzÇᬮM¡¶éÛ?ÊÑ~UOº'·Ûá˜pONNLLjÉ!©œ´'K£zÉ+—êÐÛj|uø3a1u§O8 ˆá4‡âN &Ç…Ã0PÇF´IÅLu  2a“I Å¡.“L¥u B,4ñ:´¶míF»5Ãñ±ÑḠÆb`ÒÁ”_žç8†ÀOPCNº­Ô³QúZNC¦8žßÃg4}ÁÐ!83(½‡G5£"DI§J¨)>Þ—,fQD#ŋފ&½Ð¯+Î(û{ïiò?pпÔgâñ¤`„¿’(^E£š“ ÂÀøƒ% üÉ¡ôtƒ¦˜Åà D‚0XÇ¥im”T:š`¤ ¸óÿÀ-ô£:W ç¢ÏÕïšçŽO÷›_i?ÞÕÍÜYªì;±'}¥ìè|yœb¸QˆmKæ.¾õ—ë|òáÍó;Q(A’+"†DMXˆ'âøñBý×­?qÙˆp˜ÁS@(Ÿš[?{)~U1Ãk¿`‚’\}íúÔ§d2´ý‘€·«qK#^Ñzr0R|X‹ @²Î[æ0 Ä"`RiÈè iÿtßuFò+÷í²o… ãOCJ; ¤²—¿ùÇ7hÅûgâQ”Qæ#‚7…eWš¿<€>Å ~`øuœÚzmS<_RÛ'-]ÍO½‘Í2Ò å”ã÷e÷~«ÝåõŸ4˜ ÄóeÛ_–Kú…ë7)3è1¤ú= 2(ï¿ÀMJ¼ÿ/ÇëñzDžh³5=ðÞ ÄOV}çG• z Òµ,ý~Arä’þ¦‡q¯|>-¾«ÂOáÖí!x.õÒ;ÏÌÂÇpžAwT÷CŠ2^ƒ~·-CËѪ¿£zm­ôŽZH‹m%.ÇQõXnÑ&¸eÁ ¬äöökï®WYc|þÁ _AŽÎÍRÿcÀ-ª²µr0¦C;”ùhtZWÎÈ-l.,bÌ·?€±]iåy«ŽœÞ½Ù,Œk ªRîL‡¢V-Þ¡üùø–»åý¤Z)D2¤#’…0³Ý”£éŽ o~Œèİ@º:Nš8m=D¶0ø„ ƒÕt´ÛÁ†{"Cž‡A8‡‘È þª9ÝåˆÅÌ nW¬WÙKöÜ%ÒÈI > stream xÚ]PÁnƒ0 ½ç+|l5M&u„T¥câÀVò!1,RI"üý E=ì`K~~Ïös"ªKeM€äJN5 7VNn&…Ðá`,K3ÐF…½ŠYÒ³DÔÒÉ!iëúóúñ"êºJùk{+Óhì”Ûâ²½®.Í2+Û;Èsü¬§@ ÎÚuxܰoÒHÆphE‘föþŽ#ÚœE—>nRNãä¥B’v@–s^@^–C«ÿõvE׫_I,ÏÞW&§ÈÝÑMµù{ÚS3Ѻ7>!:Ú–‹Ï?yç7UŒ?©4mM endstream endobj 73 0 obj <> stream xÚ¥WitW–.!cÆ’N%2™¨ „f {&Ã@X„€C̾‚1Æ»±lÙ–-yÓ¾_I–¬Õ‹$Ë–÷c0[B³Ä,MÂ’Ð9‡ É$Ý™,ä•»Èdžñ$gºOÏ9óCOGR©ê»ßýîwïåQNjٙ°~˺—Ö&$Ä/Z8òÍòCœí¯Ãê±ìTŠÆc§a_ä³ÏEï½ñsô˜(Š—þÔÈùÒ¤‘sÜdrR3ÉñtÙÓT5é©gŒÕÙœ#ÎL>˜&INMË‘$˲ 2óÄ™Y‹.|yþÂ…‹×æ‰K ²22%q³RfÇ-ZºtÉܸŠ.[-J+ÈJIÎKH–d¦‰’%äCNÜö¼”¬4IIܬ噉xÙ‚R©t~²¨p~^AÆÊÙsã¤Y’̸mi…iÅi©qoäåJâ6%‹ÒâF›?ú¶6O$.’¤Ä%䥦äøOMàÅPj 5“Z±š·‰ÚÂ{›Jæ§SY¼ª*¢d<Šgày&ž™< 5‰šH½@M¦j5Z@-¢SK©5ÔZêujµžz“ÚH%P;¨]Ôj/%Cñ¨ÊÏËçýÈÿ ¿2b^ÄÆgă±SÇDŽl·cÜèøøÃQ{£LØ<á§hÿÄ…c¦Æ4MJœLO¾Åc†£ ±óB¼#·ð‰?ðÙ|¬¤ñ¢ù§Vs/pn:7uþЪo…—áFÃG}»:si?[[¥³é-FmÉÞ 0Ê; ÔƒÕíýGÕcd5;•B€Q_RòVöª}[І×è—W®T¦Ú,¼ÂÀ©&Lu¼{âæïÝ€þÜs+H‡­ÖRÃ^âvÕãWBøçPuÛC¼ŸÇLº;x™ÏÞ`¯Ò·w\Z&Ü ye™ù;RvÌ‘­â^þi’Àl°ëœà›Õb»Ž[ÍÇÒoÂM¸Ý=xìäñŽ+p n¤¿—¾ÐyþÜ@Ün-×+M…PR³Ênu÷˜<$øôOÆ[iX—¶vwŽØ-µŠo·d3æ¼÷l~è…K›·/ÞcI´n-|-/5u熌m€V¥]ø7ÔØW°Cºw¿Œ£]èÎÙÌİ[¡áE¼Kß4sëØxš{J4‡{¸‰è¥+k¿ÄãïâEX(„ÏSNg f n¹ ÇP(ØØ-lƒ ¼¾"¨Êk…kk•Ù2œ»=PhEÆÍ ìlÝÞ¾ y‹èpbÛNX‹âÓ¸Wçï88ð‘.÷â-øùBl<—bsFXÍ&Ç… ¯ñÝ–O>mk<ËÇóñû4Ç[[42àæ<«±#Ûe¸‡'îÔhƒZÈE’QŽ0 ²•N]¥Ùb¤1i Š3ç. \8ÅÀÉt¿Ò^aÏòÉíR§ÔY\µ¹Q°ß/j…8røÓ? ôÊÛèí2´‡XS™È…tE~“¡p®çãÛ½þ¢h !^ö¦$K*#‡BÈ×#£ËTuPm';=Ý©·kK Ñ(©£Übˆ­VBº?ù„áÙ¸•®%z  *Í~½Æ¨Ò'  t¡\Ýà·›üý¢Æ 2$‚ÔPâ$äTs9õø­'%Á®¹ÁïäVÓF¸ •{uÂzðú­6»«OiÆT0¥C|i<Ï~~ 3¦Íq1D?\½®ì•ö Íׂ#Ü=¡þ£7O‡Úõvä¾ÁÀŽ\.B¼7û­w¥ŠžÆåÖãMðgx§›Xo ¯äVÒ¹ÙzTй…vÙÜ 6§½³Os™«ÌuäéËHÚáÅwR‡^c¸°™Ûµ™ÛÍQÁíçà´4à1Cל.°‚Ušª¼•ÜŒ—„0ïêš п¢5$8)ÌÖºÏm5íø™;_=t­yç;ÜXŽæb¸ùL nƒG¼{øxǺµ°17·°07·±°µµ±±UH~åvÖã×ñp|ˆ“,ôՂéÙÒ‚­l€<.—‡Ö®p<a‹ †5r¶ú¿nòαÏñÙÃûh»*‰9=¹£´F£Žûæ?z9ÀŒ”.µGè[•£ý,£=v§¼àÕØ•öÇïâj¼ŠH©V+PÛuÕZ6ÄYÉQ¡Õë@ûä†6B¿¯ŠÜP í8±]äáõx²!µ"ɨ0«dHg×;…Íí¶–ÎîŽèiŽ¿Å=ÇpGÊ” S¸ ÈøÀoöškM#(GA$ø%#—yÁÆ´À‡¶bœ!3yAÈD,´Š€ó¨A–žGR«Ýâ@x ;HR¾Š¼{FLL&UúJjÆžý›5I€¸©‘1ÃíÜ®¯o‡ñ¤Ûæ¾ÿCˆ}ö>Ÿ}ÓAãïã™ø À;~e*¦¸Ù\'æ¤\· Gü¿( CWåa!a¤Ñ!XqO8‰7zª´6ƒ‰Þ¤+|}kA&$By³ê#ÄmuÒ+Ú³îÀgp­ OûS7¿ýòøM@ßÜ\ÁMa`æÛœœ[>Oß­º¹Ю½{v3ÄΕ¤ /)éŠCp´¿¯` P¸‰r³YeÈWŠ´y#NymTl »€^‚ß1:M¤¤cÁQ¨t[ܨC^…“  ~Õ†‡ÊU„£¸—ÁIåʽ»ö•½mŒ•Ö T>a[§­½÷pÏh%¹U£¶äX¡jkj½¾o1%øìÏÿÁi*•3˜bA#+M5(Íj3”"…*…-×m-ዤ«¼ðª@Ãl°˜l¥ý©_lÀ %C\ÿOèhimìk²ù,.€Q²P”mÌIOË hå e@k7V™]æväA…R®Q“öÖú?ä³ãÙº¤7·y?Iëxn27“ûí¼³ñw˜ œ®úЙÜ}º¡¡¡¶£®Çw‘¸¿[MQÙ`¬(}³dËA@bcSŒV§ç˜gÀêvõõà8AU 1«JT§p— ¡¼ÈX„Þä¼´¾Lå¥I;–‘ ì©8{˜ÓxRÃñö÷{ûý¾z©ŽIgÖœ«ŸàÄé¼CXyƒ5ëè'AJ`&ߤ1+ÍP‚H Ôœ´jUBЪ³ôÅK¹? { e‰æžI¸E,géå/~¾ëÚ«ÂD8˜+ÊAÒ•4éÝV—çÔïkšõ4‹62°%›W’–½!1#PVvó-†Q ö2Aòº2„»î÷?™ps¿à³qìdºŒ |eå¦RТB¿2ÐÚÜØj_ïëÜó\ìÈÔ»èÂòïñô?=ò:tU:¡L&fù,ŽGZzK|jˆ#Á¯».µŸ?{ô,™1úäÕbò¨º_ƒÉï—ˆËa®º”D¬Ó“¢ù5b£t3§Í_ìÿ/ÖªÊ:´±úÿ˜¢ 2î³âv<ã?Ä;óðÏòÙé{‘A÷“RÊükd=ެ¬¯þÐáuêjêIïl‚@I’A• åHâWšZC}Ç ³à­Ñ,]±QUÈ=ÞøÅãÌÕÈ×3%sJî†X€ÌÜæêÔPâ•åç¥í?VxDxúß÷÷u\nÀ-¤Uâ¯GÙ|öï“¡£C|Ü;<–VÔJÄâ|±¬º´±¡­¡M¸êq4ím%[G³3h¯&…4x¨wϼ4n†Zå&=Ñ «½¶ùËþ¶.@Î:8Ä@±¶Ø ÒäïçPÙU¾<ŠÑ¾®Ì“_öâ®ÿf˜,,ådaÙô61`­»°£ºá"¡l¡Ìý)k{‚Jþç’ud*¨¨+”ˆ$"iuYCssS³Küi -[õÎ¶í ƒr(qµU±Q­2 .È-ÎHé/:)¼_œ ÿå!;F`B5ØÐùäî=3¶ý‚Ý‹3¾xüâY@Õ~C2£Ò@V#ü®24LðŽ_æcÏ?¨+"VWsÒ¢Ö•qO?6•&-”Ån;–yBØ á`]¿Ï{áï%%ÛBö2tTIYìö 8S:sϺy"Äñçñìó|öy6ŠÎ3K‹ U¸ÊC¡ÆºÃƒެâé3’„°âVy«î=Õ{JØò%KÈxPAÆrÉ™>}¸ ZPC™·8_T¼Ûù”{ø_㉃Bè‘…^qK®=É•áL©‚AÔÚxñ>i5§µ5©õQËÃÔQÁwçhÏÁîü£ÿkiTl—­O&ËšÊ×I¬Í{ÂÙÝB ÛVã±7¸ûÀü8)ê|³&K¶&‰[«Øe6¤¼J:ÐnÕ`/çZþØtÍÛö«œæ¦ÿ­œÂŸöõörÕš‰œ •¹ºòôYÅ °ͽVð;áUè¬ Ü(C¾8ù/Äk}ˆÿð?ÅgiGSÃÃë`‡F¨—çé¥PˆÊ<²æP‡¿ÿ½-ÕYd©ÍÜ¥\ÝéÎ4}GŒ<™Yj­®®GWÃDÈnõVrJ7¤sqe ™ÉIDd(ö…í¡zBrs‘³\T(ñ´ôØœë6‡7½'uÐwç1áŠQƒÉ`ÒfÇ­/<(µ¬£‹påyŽÜr"òûÿƒt¶”}Š®¬&m¡j”;”éÔå&½&ÇP¢Í׊uâýÜ¡üÀºx@o+×]êº_{¤ÒCTÿHü›š,Påke)SK¶Á>´ø²è}áaèªki‘ïVìMÙ•Ÿ•–›H {¿­ôp-ø Úëv¹ÉpŒÚÅ•*IvÙÞ=ÇÒ/ ¿ƒï>oÁcQLQˆ]ëñø°(É%{Æ £"–£ÇWEGY¢'´GݘvDGã{ÏüY#; endstream endobj 75 0 obj <> stream xÚ}” lSçǯc×ù nÒ.N×úz@[^ i¡@€U¢´ $åÑòÌ y˜<¨Çvœ;¶?¯}ý~ÄILâ@CFGËÊkk‹:ª±  £êD)CTÖ¡Mû®{öKX%´NÓ•Žt?}Ò÷;ÿÿù!<ïñ›·¬Y³eAiyùÏ–?8X¥aéoog»c~H0Oó˜gr)Ÿ™)^/üK”ó AðòÀU<¨·žxPŸç :1ðx¨eU\¼¸¨¸øÅÒ&U»º¡®^+›[3OöBIɲ…²‹‹Kd«ruCM•RV^¥­—+ª´ÜÏÛ²ÍM5 rm»lîªz­VµbÑ¢ÖÖÖ¢*…¦¨I]÷ò¼…²Öm½l“\#Wëäµ²µMJ­¬¢J!—M¢MÖÒ&…ªE+WËÊ›jåj%Çšû ±ž¨ 6ñxJBÅ¡Î&~L,"Kˆ—ˆ¥D±ŽxØHˆr! zxÏñ.äœæû?üý1‡°@x9×Ç8ó³ïBŸKáÃ^¶ðÿä3q—œ²¬Ôf‚¶Žô’L®—à<å —Öü|£o>…èÊ+çÙiRöž°ÝÈ]Bofô$8\.§ ° >‡¡Ãnúâ9»몗³3HVÇþYÜåq è züqZ‚w ¿Y¿yÞ‚bVDæg÷@†¹Ÿá1æž8tع(†„‡ŠH(( • gƒ†¶rè'I{yž}jâ°ä{´ €ÛL„S—ð£Åg•š²Z uE»Yû* vºðQ4”Ÿ½ö%›aÆÄÑSƒã4 ý1¿=ØIZÛœ«W»D³ôN³Ås…Ès¨ ì`wèÙœ‰2 kc–> 4PÈ>ùTýdÒ´Mrš¶7·¼F!›ÉÕnóY¤7I‰fy㈚=V²Î­ðÃðÑÝàÆ3™„Ä-Ä#_ôn*…Ü¡×Ûˑӥ¬|2…Od¦1ç®ßnàÌŠš€>þéº$ìÒ®ùyãΆMæ\»BlÔ‹qÁÈ×Wà ôå¼ó,)eO>äüÿš:èΙ€¤g¿}"ü †~@þnHtaé„vØçÑy(BàóøÝ¾ó¸G2ý~Rx3µ³š„k“]gQvÖ@;zù÷—¿ypx0-eŸ›à‹ßd¥vƒÝû w­ûÍcX [h«ÔÄ- g§veuu “É7DÂ` /6 E†F>—„’ÑèE§kŽl›_ÅÊŒ]GP·Ÿ§n¿?”Ô¶7‘ÐéêèTp®¯fw§˜ë“L†ÛX;Îg^à †„FÑÜÔÜoLL”²òûKņŠe ƒ—rĽCBƒí1R¥n”ÿB}VzpÎÑ4ÝÄßJè¨'qôá®w6þ¨ü;ޏé@<}á̙Ӏú£\ÜÇY)™”†ÇL¿àçãJ¼\LÇÃGéx÷àNf2§Nÿ Ñ~]% oT±Â¶ÆF°m:ÑôÞÝÿ’GSRU+¤·„“$$ƒáñ£Çq.|„®l-•®€­;”r뇻mƒ:Pkõok*;·s£ýVÞÀÁ詾ßtЯn!¡ÝÞfi¤,† ŽŽ=ì|.…65—m“öA<ˆÒþàa·˜vK/xØIÅUþ¯ÙÇÅ–½”…óªƒ[Z]!» {éËãý‡ ¶»L;Á"!Ð7–ÆSbÚ‘º¸,p33 ?û—uçW’¯ÃÎj¥B7ötþWû–y·Áé;Ëåõ@@«á¬uh( ׋}½à‰÷ýÕ{ÉQ@§;Þ"aO‹L±¡ùÍ»*½ª¿ Á㉸i”¯ëgJÑVõ ÙÝá\éTÁ²ý¢)ÑT·(ïÐÔ«y)¯H„¯Ïø7ù0^ endstream endobj 77 0 obj <> stream xÚ%ÎoHqÇñßm·Û¹Ö¥ÎÒœ¿BþkžJÙú9 z É&²¢1wÔþtÞ¶¤–s#³}—„æ*$J¤ù`A á@TdO{`¬=èwãµá“×—ïçÑ›B4(ŠâÎŒ\ðt¸û/vóÕåˆG›³ÑÙRÊ @ªR›tª]¯6ÐM¡ŸuU쫺][µ½õ¯ÑÅÆnÏ÷:x¾ÇŽLJâx@Æ­þ6ÜítöuâžwâÓAAý¾ôÉ!è“+Ï5ì ûEAžÄ­'²9ÖÕǾà„#,ŸjëÄqQ`·0!H1a Ÿ ‡d<ä x·Ú±{\á`$*  R¨’¥s£ÑJb/:Žô:D!­RŒ:Ë•~' ’Bò’WêÉAb#)ÒŽÉ¡ïë–›¤@þZIž˜Œäðý“C8ª9›IGÌJØ—ïáûKÓmiÃör­— ò¶†¼LanŠÅ(˜[ ‘¼Ñ²Nj˜'°yq57 ÎÁ覸}w÷ °[ZNÀts 2Ó™Û3ÞP4ç!õy¦x/—þ”yØÉ_Yb¹’6Ô¯ õEQ¯*ú’©Tg]xYȱ/’³—sÌ”vÇ 0 ¤ñã[‚%û™rKy+=³l¼¾Ëvu…yJ^¼LZÓ'4Nó«a†KæÔá‡äòóÅ£]š7*&Âìy=o6fż×n¢ûž™k²fNµ4üyÛÞ endstream endobj 79 0 obj <> stream xÚcd`aa`ddäq tq sÒvö ²ñMÓ÷ý:ô³‰õ‡4ÃÆ²L?䘈³È200¼‘ùAä]© $[„X9J*Ú Œõ Œœó *‹2Ó3J4’5 --ÍuŒ ,sS‹2“ó|K2RsK€œ…àüäÌÔ’J ›Œ’’+}ýòòr½ÄÜb½ü¢t;M…òÌ’ … ÔâÔ¢²Ô·ü¼¿ÄÜT“õ@„s~nAiIj‘‚o~JjQÐILÚ †@çñ01032²øOûÑÁ÷óœò‚ï§v~?=Ÿñ‡ÔNæßËE¿ïb›¹°{Ñ¢ÒîZùß»¾ïf›Ù½°¤¤»´Vî÷îß»ÙkK»KJvÏ”ÿä±Õv—.ZÔ½p¦ßåÝk~¬^³}>ã÷ú[ÌßÏý]ÖÙS —”V¬Ó͑ž¬û`÷Ñe¦²§uÔëÈed±mé{ؽcÇ£î-<*k2Øu:¦oç+[ðÃyÖ÷ü©“°ýNœÆ¾†ë:÷ò <<×góðÊq±˜ÏçáüþM‹–žH endstream endobj 80 0 obj <> stream xÚ]PÁj„0½ç+渥M ¥Š[ÁÃvËf·”½Åd´š„þ}M=d˜™¼÷xo²ª96FÈ>½•tÚ(£¼Dh±×†PJ˰M©ÊA8’U'á>Ä€}Õü|¿> stream xÚ]oLeÇïözc¥º…†bŽö”é@è0ŠÀ$nD6ƒìlȈQÛÞ±^ÖkËõàhq cƒrÏÁ”Á6 XFÚ¹-Ù’Y3Ͷ쉯öBILœKŒ1߸¨Kž§<ñ*§/žïó}~/>ßß÷”ÉDlíMm»:[Ÿklyµc³;7©‰°¬ùbæ”?Eá2€7äá§óq±©”¢@纜6?–ÓúÇ ¥œ†äÿ´žZ €µ¸ìÙší»ßøêö]¯ìñ ¡KQ«֫¬ZIäÿöB_¤G’<Š *BŸ²úàÅH8à‰*b€T‘Üîç+ÝîêÆP8*‹ü Wî«à6×ÖÖlâªÝîZn«$È¢ÏäZ<Š_È1|ž×ò‰‚åÊ·ø=ꪪTU­ôH‘Ê| ¡b§ŠŠŸk"‚Ü+ð\“±·Ó# ÜÊgT®\!)Ü£2×â9hô¶¼DÕQ[¨j7ÕA Æ`ÄÁ(Ð:£˜< P&ê5jÂøÍ*0çÊëÅqÛ’uÙ1—ù-p²æc=»ß8ÚPZjJ×á,3¯é²³Ÿ& Ó@ö@²‘Én³tëÚçmúŒ®§\9Hñ¿ÌŽåb{R×ç]pVÓGÆó×ßü…ÿN½¼Í’Òô°³™kZ·Ë AR~‡ìA‰…1@,Æs,ýã?û±™5öG³p¢ÂôQ‹zQé5ä…¨€1æÿáÖ[`M”ðäu Ö4…Q];q8¥~Ó~õ™OëÕ°:GnΡ“«åcöGäãÿµL/¿ûåRiàÚìy;AÙæ¡AmŽ” LÂYgf¾‡ÆÌ2-¿²cç‹Áþá¦Ù™ìË4º·NLŽÃc%ð˜¦$ßãVæhDC;²@v1IúôžùáB.8ಱæ$»_dM¿_¬éÃÛQ!úÖ€óeOn'©w¸¢›ì5è÷iü!þuâ¸Aÿ ŽÁñ#SÙ®Ì:þ‚FOÀŸMŽÞZŒÝÝŸìÿú­ uF)DÌ,ñÒ Ô´øQ-ûàN=ô;²eÿ|Cm¥ ßÀ.r@|#_ÊtÙ;½íRôÁàŒ?œ Ìø  »‡zÕAu vhßÛŽéØµÏnž»KÒðlì¢z6v>–†I˜:~z*1•813}ës‡MMÐ,‰&,W ®¬MOX­Æ)t˜¢!ët¯è/¼6±Ú endstream endobj 84 0 obj <> stream xÚcd`aa`ddäõ‰ŠpóÔvö Ž4 ضÿóa5ü¹Œõ‡ ÃYÆrL?䙈³È=ôbùÏÃ$ËÀÀÈ $~óƒÈ¯ R$üYˆh¢HcÛÔÄâ’Ô¢ÌâìÜÄ’ c=#çü‚Ê¢ÌôŒdMCKKs#KÇ\ ÒäÄ<_ âT  'G!8?93µ¤RAÃ&£¤¤ÀJ_¿¼¼\/1·X/¿(ÝNSG¡<³$C!(µ8µ¨,5EÁ-?¯DÁ/17Uì=0霟[P t‡‚o~JjQÐ…L Ì@×.clg`fddÑzû£ƒïWØ÷’ýŒßÆ0ÿÜð½Dtö’î¥K‹º«åÿr±Uu.éž-Ï÷Shí‚Ró¤~W]ZÙÛ=©›cÎìYóå»ç×LlîX± |Þǭ˧Îyæäµ gLY³`úäÓ»jÛ3ºêµ$ªf×Í™;kƹ§]º¦µoìšÁÁW¼ø§ý¶ßŠÓÙ帘§©þçáœÄÃÕÃýŸk?÷þ<<@Ìûý¡,ÐÎÄ endstream endobj 86 0 obj <> stream xÚÝYyXS×¶?9ç8Ô4-v8Ç:µWm«µu¸­Cµ¶N8Ï3"Hd@Æ2•y$™œµµuª×©¶¶Z¯ÚöÖγ;ÞÍ{};½¶××¾ûþ¹ï{p¾óñí½³†ßú­ßÚP}úP`ð²ù V¬Z1vù«ËBÇO?Þÿ¿ç}/P¾I¾É¾‡ûà5øÝÇ‚®ý}ZÐã°qy ÞäÖ &Oj y<µ$˜z<€Pý(!õ5Šz†šLͤæQ˨õTG)¨ Ê@Ù¨RÊI5P{¨CÔqêõ>u“ú‚úZ(Û=aüøç¦ô¼Lßû2±÷åùž—I/ô¾Lê}™Üû2µçerïöɽ»&÷îšÜ»krï®É½:¹wû”ÞíS&ô¾<×ûÒkϔޓ§ôž<¥÷ä)½Né=pjﮩ“Ç?3q¶$N*OŠ” •DDÊâ‡-“Ä…ÅÿæŸ$¾CÇŒx!`ªàejvÀkÔ‚À%$ž+¨0VÜGF%Q*Á)êmê¬àzÀÇ‚[n 0õ3IÇÔ@j5„ &™xˆz˜ ¡¡¥†S#IVFSOQ㨧Ivž¥&P©¨YÔlêjõ*õ5—äk>J-¢SK¨¥Ôrj%µ–Z'Ð ‚Q“À,ÈXVM`ä ò‚BA‘ XP"(” Ê‚JA•ÀA½âC9h#e<)Hü=àPà†Àú@ŸAñ4KïeBÙ~ìžÏöý{¿´~?ôo ÐúÀ³xNèôØà1ƒ÷ é;dv° Xüw¡AøÍƒ‹ED¿øðî§BN Õ>"zdÿ£=ýØÎÇW=þ!gâ‡òöa +{â¡'äà Ç#L#Ù:*jàÏ‚ÇÅex†U„úË\Âëh~¹æª¬]«×gkAËfÛuV®œÍE•µm%àÛ®>½$N/‹«I¬ç„çÊ ÄZXÈD¡'…D¡¨î$s÷èj¢”‚ˆA”HfPÈAÂ&TIvº¼ÍuŠºÎ9`0²¼!•×Þ ®5*ƒ[o ’ÂN¤»ó¬OJÙŠ_üŒ±aæÜ̦mG’ÃÇpö ï•Ú³–‹p^F#cÐz¼€vê@gÔ‹™®±"cäCœ‚ÓÖS¹»,{ªw’¥Ž†–êÝðWhø³ýUë:ÓZXËÎdS0-*=;Å ìÍŒY{ͺ½=–™¼w)Hy9ð–9MùËÙ®RfcdÎr.ZŒnxétH1¦»*ÎÒÉûÎ0Ez[:—;24ãWhVAïYW}‡¼‚C? ˜[óÕ‹ÊŽŸm?ì7c¦óê‘ _?gÅâ —.ÍÊÒk!Íô 7š$¡³ÃL"µ£²€•ÑñF‰1"! 'Ÿ:öö±“GÏž¶|Äæ3(xØÜçOOOS“ä­«©ñÔªjc8=ŸÞ`+ܾ¡.ôð5¯Ò¡ >ôÕ&/R"üêê'²-F+°nG•§Vé”Jâ1WŸ¿|ÿ‚¨—Q Ä ¿Xë“££Y´–©Óº´î¶˜>gë÷±Úl6ÈcÍLŽMoÑÔÚìœØ”ÕYá°¶„•±Âtf].ÉS­½Î¨eñFcÎ,⊡ Újõ4ì©è0±fú{~|! 2gÍRe*t ˜k:%gþá_û!š s·ŠôŸ ¯¢ÇÐu‘‘†l_œ8ïil«î„FhHwHY O‰ç…_&–'yÜ••;/Îm ÅsÆâ%xñà(´Œû>|·ú†Õa®†j¼„‚ð n,Û–¼„5aZ”ÇÀ‰ºo.˜ó¡¾2àþ0‡Õ23õx îËá@ÈA\ö;=ÖÂwíÊN›ù·?¹3Uƒ#ƒÜ´Í“»·¼ÔjÍ7ÚM¬›v‚Ëì-¦ãbEÜ8üàt<ð 6¶Bîá,t[¾©Üì.eG¢SŸ5i;Ø|¨®9Ä–Ÿo‡2¶§3é°Ã˜ ›`µ%ÇóKl$hÂ_¾áµ=±9à{™hxÞ0zÑ«‰ÒXÅ6›EGA˜=±žµÑµ/Lu©R‰J;óý¸ÓhÆÇh)Ç”Цá‘ûwXU¹*yýéI<„ð¦Ð`›O¿‡Ú*޲9èahLY a³ÝÉSO“Õ”=t•‡3öó§v•åUX+€ý¶‹–óг½lá{ÙEÂÂsè߬^Â:¤ —“MK­ÒK8Çн‘Åïöù]N H+0yÑ:¯oƒRи“ÔíÉÜ 4ÎMÇo)ná¡ØZl-*ßWrª’Ä_CW@Ñòi¾´*TlÜ rbTç•0rH4g¥ë+µe³ÑʹhÍ+he–#D_¨ÏOèµ)‹ðôExf(ž–¼&D±0\¹‚œ¸%‹P?tõÃW‚HNþöÈË ï§½‚cßù´î@ß·¾ÿIöMm™oa3i¼OÂSðz~SŒW£gð8´ŒœÁ£‡‘æó£=Û’ ¬FŸ­á³õ¨Y¸~¦Á´Öõ§Ö¾~ .Ã×®¯ßûKÇ®ãη‰à}T…Íé9ªr`KÍyù<’1g"¤È‹3¸ ]’ïÓàw¿3y3w†{ ù¢á7}ÿ–·Þ™I&l(‚bS1°õÚ¾«žÙeŒä$b´›ŠI•«=hì›Ѽü–ÐÀ¢×ð`4GrÂò$H2ʉG»‹^< ÅÆjÄìstR²Õ˃ÝdëËd ßX@Lóä–íáªha9ÜT ïÀ{™Ç§žŸÿ,ñ•PŸQã‡÷þI¡$¯Ç×+@Ã>A›Ý»îL‰w3;½†p¾«Ž‰ˆÑÆpnÊVì»Î´£B ™¡šWÂ6m\?Û¸ˆ '˜–Ë¡™GÎ/˜Fh5TÄ—(LñÀjܨB¢a`yÚ¦E:UŽâç ºÑaªæÐÄå>04O+‹²DX#IKœ¤7pô¼‘ /JwûžìÎðÜ}è´¨(¡%ªØ|SžGÓ°í`g[êMÍœÍKÏ6á8 ]å&’¤=ÍÚÍ4ìǵèAò»=8T]›U¦³$ÃÐ^b¼›o¯o†÷n¤Þe것ºHÓ˜4 fç.ËÚx×…MKígy+¢¦L¾ô"y™²Tù5ö9~‚4?}p´Å#ñ‡"TÂ8 Šk¹wékß«ðPܬ÷áï¶S½ï?H°>ø$ðØ?‹”XNäDîÖwÛ܇ÌíÀ6Ó.gÎv¿ñá[µQ1é&5°±bß@ï<:"‚@Æ[fkåéÓp1Û1Þk‰1ÇSv³˜_8¨]²VTž&¢ªíмtÑ-Ü„úBDu®¶‚fh¯ª*®RbC,›ÌLÕL…WWÇÈ" œýóW’3ÜIØëõÎ wnÛ ìñºC¯ó’µŒD)ŽÉé ºšùqÂáçBŸIx‰6IËÍœËTV5P§(I²²( ?)zŠymÝ’W¹,zƒ5ª :ÙϽ÷sŽØ÷ç÷'©]¾QµÈ¦ܾ€œ7ëý¹+e<† |×׌ÛÜòVóÚýò£0 ùö'ôÀíI¤?į€Mª-[Xt–A5]9"ý]X|”4v«<¶@¸+©9«P[Å,Jdò:.ì>DºV_žIjšTu¶_£œhlW»Q3zRân¼I4ÊÏ>N$ÏJÎ)›X.÷Ô:*ë9¸0ɵÈ̪iÌ‧ñcxàO ùópºÅ}Ál³æúÏ#­œP³1!+-qÓæx"°  ¹Ì [>tÉÄÕGïÊ´l:»ýÛ7‘óB :ë÷»i­ÍYÂãH&f÷†ªµä Á#FàA˜¾…Ñ~œ®qµ™„ ±…AÞT&&>wï»ÃàÏ»Œ¢æjzºÊu<ÅSH×i²ÕÒˆM’ QU‰Þø}§®Ó“ƒO’lw¢i.û#¤?ˆ´C„ÐEV[!2ý½'ðÀqäúrzœ¿V3åš,`aí:[— Æ8uZbغøuÀfÓ«Í›äûT­9ÐΚœ"Ó÷å‹5yf coì|îE‚|ÁT¤´¸Õ ß/šˆXKtA؆‚|³E/НàktT|N —J “üzå‘x/»cè(©¥G—¡ÅþcÞ.ûì=® sòõ)YêTHf…m²J•«¾´Êµo3Œ›¡›äót*"£U= ‡Õ‘¡öŠ©Ý…Ê`ωï£×.7¼!ü*Qh•ÈÈ(•™Ñ ˜’mžäªMXÅŽF¤¯£'ê¿EðàšÑÜx:Ú"¯‡l±ÍÏ™éCqf ‘’U†*`?¸ùÆG<4¥·JjHûk¨©+ÞYZmiý;JÒÊå% ñå ¤Äz±Z¦0ô:25él—¦ÚÈ•©ÊSä*€:qùx¶•‡×2ú)3 {DvæÈaÏ>¿ÓDX±‡ˆB¿¥+˜Mdùóxtº”[ckÕçýGE]¢Bæõâóït¯~eY²œ d;)U—ÁÕƒ¿î<ï" F}. èKÂM~–3^~=ßeb Û” YlX¼q §¥…©$üÙ˜àN¢ãe–Íe.wÞüühÙÚPg0½i»g¡ŠŽÏ%’LÁ@½±>µ.±cMÉX¯Æ&-2¢¯CîN ¤u+ƒ?øñ• Âs­â2f§K·‰ÇõÌV©q-iZqÞFš»“÷õg–"•Hx=A¯PA!Þ™XÏÙéZ‹ÃA†*O¢3Žûå̱dT ºØì÷ªˆiöä¬ý'¯ÄHî•ÑR™¥‰¿Óǯ ÖÌ9ß•³¯]BQþ_a{Ó]³ê½„•°‡ O0®á„ âhÓ¯#²‘±]Øñ°§íóÉÊÅ¿¶ý¼©Èj¯Šùuôö­.\‹aÁVÅ ͹ùµ‹a>,ŒJ\hôÇòž´öX¿í’°í¾¦ÿRZ”Lÿ¶û$Ó“Z'Û·ºh„ÂÂpùÒ»Ÿïï6nߟüw>õ7áÔN¤ó­a6cìÓ€dG^Æ 1¨/ ¸…â„—QÿgP_üh÷=¾ûž'ˆÚáå\(±Ü8°0ÿ%³ü?« K£Âd∔H˜k^O¿b,†¢œâ<ãeÄs´Àåá¾} U}$¬¤ù–BMyyiYE£ºÜIäpí¶Û뢬ڼ,Ð@ª"+ÝHÄïV‚òµìHòFuDwFu¬2QAÛ]R¶ÿÍ=‡ß÷‹õÕd®‘¹ª`GJ2=¤íPª©r6‡NÜÑ lÎÉ5Z JªòKLÝâÞo<Þâ’¡!¾Do°Ðáð»P´@…º$Ú±&Ä=׳À=·aZHnV^&1'-]©MÏ„¨6‰—.ÏI†kZ¡ÓZT V¸Å™R'ÍHT®ÛÛÉ}{Ðãõ—Ú¿oÿ¶ó»ŠöêŽ~¥>YÌÔifH“"2âeK–%-¸ýQä»Î/ kL®{îøÿ2œý îÍ úÛ¦%‚¾ûyÕþØXoUn‡ÌtUN©âÙ®]LxŒ>Š‹¹wñoŒcþmCÓÿõ¡ §¸(ƒ½žøëþNòã ÿE°™y.«¹ÔÒvúü§p­¢½ µ´ø0˜M&0³Ej“†KÏÙ‘¦›7Ê0cùôåêáÙ/³ ²Y9cô—ƒ’dì8èÓ?!!!ü Ä^G8‘¡b¼³e‰6[›eаÂ/_ÇOfô/¶"ÿ7.´Á‰Æ»ü}hÕÕEþèo²j¦Þ¥çq;–hXÅÉPs— >¼É:õlÓV+kf„>§ùÓzÓо͵½bkùS°Óp˜è6-üñ­ýáKø,F»de 2fÓŠ\B³õ,š×=À@…¥Ä‘Ëž …¾o©–Ρå{Zã0šäò v Ðfšx) ýöT2!Š'®3êX £Ã}ñ\ü ìÀ‹CÜ´u/¼Õà­sî67’@)é×ᘡr–]bŽÏ'æ´8(‘Ž‘øÁ¸‡ÙãÌ=¹<®kH¾C¿ƒÃ[h]–ÙÎC^yi^áÉ›6ô\e…NîSº¦ 3‰ÇÇЖ|ô¿kéÖKÕzZð—ÐöKÂN÷}%T‘>ÚÙ-ªU´$.·‰7åççÙlíGöé8âpUÕV;YleÄ™ó~µZNÇÉ,m¤…Òw A—‚‰—ZZù/p¨/("¢yõ¾»VÛ4…©dÚMQêÒýÛÐz²ÑÅÌ€eßÍ»’\­r¤Ô¼ÝüþDi»ðK2¦@gÑFHKKÑj5šå›—†/ßÌ"QïmîžFè nÎ1M¥ïššZ—UMÊ'ønùU;Èoo ãqë£øléf-Ê M}r>¤A:éËlMiMeuZ•$I™"]½;¾ƒÿŠÐxÛ%ËAóaóA¨Ê-sæ²_Ò®‚L3BÕ]J`îŸ?"û¤™\…ï)bF€×xFØÙÐc…KÉã$2MÁ.Þ®ÚBÈ%ÔÅl‰®|“7¡Ž‚誈²íCwOÜõÜ®‰¬PeÑXÔ…þ»½ sÕ‰bï®OvÒú±µØ^l)6áOB„‘Ã:bÌ9b̘FI#HÉJ5=fZf|zLªdãíu·7#*«ÜX*…{ŒäÝDx¾î ßTY¯ ¯N¢%RËnÿ—y¤§¢ÇÐvüZ“Ÿ¾·DÃæ_-¾/z‰Ö'±`ðvÄ0MU¶cwc÷ïœKþE‚!!Hð{uqÚKë8‚G£vÁ.ó.`]¬Ÿ6ãÿˆg˜ÿs#Ñ¿ñ®­»!w7?É¥Àâ&žä¦M͹‡ÎÊê«Ø ÚUnˆáñ>fC¸a§¡N×v:<ÆÚÉ£}ŒË^ØÄUÐ{`ºh•MfN0ÉHÌDS‚~5h$»z Y Ó eêÒ¨šUþAc.4¦ÿëƒÆÐŽF¸ÏvüÐþ]çwå{j÷ó×dã-M’ódΈ̈#sÆRÿœùqôMCž.Ìž&¨êF@ ?žºþ‹žÆ›Hé>F­w¯w¹s–ñx#öŠK#H,`ÁSìŽD|;x*]n¶·³Ø­qÆõœ0ƒÀå°p}Ö-§ !·ðÝ_Qù –qI<ªv‚š!ˆúŽ<Œú ù§ŠÅ,:Ìà¿t©EÅ̵ýˆýŽk†£Q¹Q¦lÿ,¤Óü÷•¯2ëWElåÆÀæŸ4WYߣ(kÊÆ‘ã€XÙJr¡gòÚ»‰ùú f_òKm7¾îU9չʞbûÒí›)’ÿVvùÌQ8n¬šù{RFxÕÅ¿|…Ìä5´»ÖÀA&1;UÊkM:ˆ„ÈœH`Ö<:Æxü­ñ—M÷ðßR'ZAŠÿî ¶žâ÷Ôê·ñóBª¢äº°×Õ{á´vV±xždXùG<ç`Ünr¦P&ÓtÛÔ[Ęõ‡›y("ÓW!¡|†6—¥‡ü_7ôÈR‰NôÍk—Ý÷U¥Zfì7µ;[ªšš¡Úc›£*79×›×ûbèVEÉýóV•KÎü†‰º¼D»~B¿~6v>¯!Êuq,™A^¡FG¥_Ëû¬;Lâ*¢ü‚/Ü@ „ Å‰Ä‘âˆØm©©! qÑâ0#{7$GIHžªÖÒ) S1…åUEÎú¯³¾ÊbÏϵ’Áó$AßÄ»"Õ/ ü“y8š™x´6ëxñVÜi‹ÆT‰^¦çOͽÉÃn‡{Ímsû¿0ÜGW¬é `*ª}³*P¼©¸–Æ+áúÎÐ×> Ÿi@ÿoúìÏ=?fIþÄÂ??ø_:*ý endstream endobj 88 0 obj <> stream xÚUiPTW~MÃ{W4¨<[{&úžZŽ“2QQ1£ŽѸÄÄeeÜ ÆÙ¡Wš^èf?ÝÐÐÝÐÐ@/€Í"j4A@EÁcË81K™Ñ*S­ÛS÷ÇÌk35?æçT½:?î=÷s¾û}ßQáá”H$š´=þƒ½›ãßÞ¹!>>fyLLh-6ø&œœ!N 'G ™ññ?ÿ1ƒ¢¨É¡èŠ…“Bñ-!Œ ‹¦Ä"Q87?fÁ’ui™rÙ‘ì™[2ÉNŸ¯Î<¢ÌNVþg‡¢Do, S+©ÕÔê uˆ:B£’©´°lJ&¢¨‰KÍ xjµ–zŸÚ@m¢6S[©mÔvj'µ‹ÚMM£DT5Ÿò‰¦ŠÊÂÞë/ÛÃ[#fD|O'Ó×™õÌiôÛ(¯OQŠð^ÙírYê®ñ8ÝÎ:»ÛT¯u©¹"Z_šoÊ/ÜqL»{i|ìnQg‚\TÊXÒû~õ­ƒ_~|ëàÐ1©£Ðaª)CVºÁéªçÁ«¨Ê«þèœtÇé?Þq6Ï®©ÑT¡ÿÔ Fâk’ÄôÄÌÄŒØ]R¥^¡SêòŒJ#(Pn­¦³Ò5‡ÍQ9tFú¤ÿÛ'ýN»ÓõÈ”¶&x26žßpaãùg¤ù•ù6½Ñj&—¹§ Îpã°tèø•ãCGëŒ.½«E•Œ\Åž›GE†_Åq×ÄA.¨•¨«•r@s“ÈÄU‹.êïüè©¿aë0·Ã)„#x-‰! f‘Åä2÷Y†WrWaÐÛ}Îf³ÚÁZrÊ5\|²û#@FšD×m‘€#¦¾Â3ðî´©¼IˆÌ% ¨(«+hûfèzÓÒý»³—oᶃüaqŠ*Åvµy4º?€å8¼†íÂk‚ŒÄmv[Ü€zî¨×ð„&[rȤE?î¿Ï_€›ŽÖVÊÙÒs€Ü´ËWÞæWThx-ÍÞË‘›Ç‹pšà„G‡VÕ*ËU ´kqɺ ¯ª¹£¶ÅÏãMd¾d5³u“*þð‡ —9¸ô]cWU‡µ£¼BmÆs°îfô¯ÙLì~(!aºK€¼f> 4žÃ—-þëörØ‘G]¥æØ³ à^ù w7ñÐ×Üw±­µ±½â FÚU_fà‹kvƒÆ¨Åãiü¾|?¯§   Ê„Š#xêž ˆ@zWŒ§âü9í¯q6¿ÜùŠÌ"ãß™MyGÆâqü0|áë¼\娪gˆn­MiP¦2h”©G´Ç!Þ4yDR;:0ð\ƒ«PQŽàÃ}7ð^¬‰n½žÀÛ×ÙW†$Ÿ¨ÓvÂ>D(<çÐî;ÀÓ;«ÿì!íý¦!–[MA±¥PÍþbÈѶxx°[ìå6^‡©ÐÝ_ñv¦ä¤±IÛä´ÖÛ…æÀ’,Lïu74ñpæ„;Ù"ÎY‘ܘ£——A ”ZJ,úJ)ûÌSU™(vÅÆ…ëåþçUîCF&!)i·Z؃ëÁý£ðàg¥Gö%6Ã$¤ŸLf2õz%G^C)Âc´¯ÆÙèÖ×fñ&0•ZŠÐm›Œ#óé­^¡®ÑzyÌá2IF±F2$kÌh=åi:ɱÏ}*Ǿ,’²_æ›xh4ºÛv G…>ö9 Α´æXTÜQZ¥6É^v• öa;é§ÌBIö¹\c«ªµMüÏ´§ÞîóæÖ(øƒ áf°æià´y_*G&F–—/“Õ=ü´§ÎÙèÉuÊÿŸTsMÿxwªTåÙ¬ºdHy2ůØÝŽ¶áØ¸‘اxepª€öi™YÉ­¢jS¶ÂehäÙ{—HÍ>•ëóÔBWÐM.‡·A_'çð2:­ž–¦¶3‚¢Ï¶änå‰2™ÉÖ¼îJH¡›êþ›žFe}3›ÛûÕÇR^»ÇÍQÑÀרcsHªáºÕ ‹g¢|†ˆ‘0ÍÕÐ8ÂqïYÅ/ÈÆ`ñJL“©™FT!W²B»Ï™é1èYoÛ(œ‹Û³„[ ‰ n…†LT™kVeôI¼'.À¶b&’¦%¿6ƒ#Q´27_®¨Ó7ñlócÒK³Çe:­J]›çåÙÖJ°š+½tƒÙáfÈäB ]ˆýxà%žÀezr}>O½Ÿc—·8ŽsÀ®Ô~õ¡UøÀ(ž(s^€UáyÁu’X:[§S*kõ^þ{´mõÀ‡€{ÿê6¹Òø$hLU@l·6+S›h›®«‹Ç9xã*·×AÌ2—#Ë¿¥[smJ…Æ(¼…Å·ˆ~ ]£ø§ÿ H·¤×çø_2vCt;N5›UNƒÐÚ]ïðy4Õ*þÏ‚|¦ºn+/ÎPWçùø>’Dÿq›<þØÑŠ+v3M¦úTî]Z‘gg» <|T~up­ ÇUÓDae¸Hqõ{ÆUMˆ4Oÿ"²w<·csñ4{±ô_Sþ Ÿò<õ endstream endobj 90 0 obj <> stream xÚÎÏKÂPÀñ=]Z¶~RtÈï(Ê\ŠA º-Än݆>ThÎ=_.;Ô¥`С(Xz˜‡èÖ?àŸ1O‚.õìÕ.m—|o_À°,àªçbUªeE©V º¨{÷qöí÷fŽn34h"D“aºÅ&†ùZ ü\ œ­îø€Ê:Ã0O®na„‚¨v¸Ýl˜®gàn¹\ÊÁ‚ ”᱂p».w $“RdâÇ> stream xÚÕWipSWšµl"ݲ4BÍTú=B–Édk0¤& „­1Ø€/Øx—mÉ’%Yû“ôi{ڬݲå}‘ ³Ø˜°³„ I“@ÖîLR“©I&Oé×5™+'ù=¦Tõê–êÝûî=ßùÎ9—“2cF ‡ÃyhCFÖú×V>óÆš-ëÌ_úBò¿?&ÒS S‹ÒˆO2fü4+5ñðŒçØ÷¹Gú·—îù]J çào’OõƒÉgùCø™ò4~Ì97;åŸ9œûø<ñüâåë6ï,(7é@¬ïðØù«×¾Jä•”,˜??}þÝÁ^˜üaz°dz°ôî`ñôË‹M¦g-^<=˜žµxzÖ’éYKLÒ§ §Ó .™^gÉô:K¦×Y:½ÎÒéu–NO_ºxþó WV–WÕÕŠæn¬,(UÌ]W›WV’ÿ¿þÅ Ýû\Ê™”;œÏRÿÊùš÷_3Ø”Ÿ0fp(Ž‘câ˜9À±p¬ÇÎqphŽ“ãâ¸9Ž—ÓÄñqüœ'È qÂ)ÿ”šÂIIMIOù'–š‘ú×4׌y3¾¼çî!Þ dA¿÷ô}#3Íúý¬ÄýŸ?Ðýàá‡~œÍ™ýÑLæiηŒA ÒS¥@!OG]³qtH+Ï­±è¶kü3£~J­x¤ÚÖ©·ˆ|´{ös[kGø>Fûã+ƒ‰Ò©i£›háF[Ì2úzƒœ½ÿï BU®­j5P`°©´:%É_¢£)šàû‚´1OrùÙÀTù˜*O™¹è¥‘e_13iÌ"fÎÍÝŸäw†xÊ™–¬$hA;äp÷M”©Š2ËZ0–ÿv…¡ø·˜[KöaÅìL`çÂòÞg¿Ñ¡&î øâàÐ%›ÍjÇtuh½ZÂÄÕ)ÁP¸}u^ Mõã£cî aÒ³ ÐMf‰¹ŸäszGw6Á¿u!öq6SÀÿ&psâË?ì¬.žÇ>oþ¦_êsg|S}‹}òËNMGB€}t ©®5@B›³Ž2ÙBg»/­( òʉ*P×RuëYШ1kŒZI~nöV@nŽS}áΑ[Þ·º,.p¡û{ö¯Bñâ†m&ƒI…Cç4:¡€™÷`ùVY•¸Û¡^'ÑËD+‹^†WÐꑜw‰!èt¶»\N·Û…þá =]Ì²Ùø ï|Ë¿õÿñ,óÚä49uvµw·Iý’<ÉÞ¢MgËN“ðvOÇ9«Ãî'rP´žP±R#þ7Õy[ë¶Ã>Èk’Ç“xÌ){M3æÍèl~îí#‚X{ '¨öו(Š+Ê‚%ƒäÛ0z­uÂÕêÀBç?‰ ‡úÛOõjoª¬#A¢ê÷± uUê*s%2ò Ú²O¡ùT`ÔÝ'ÄX:ÀlØ?@Gð£`aÝ”Ô^ eÓÓBƒÓäwXgì0󲎺Z¡äôä{¡¦²¾¼8«êuéë’5òù«öëŒZ£PƒÊN2òö“Ë5Q³8±Q•àí3Ç+TÞQÝv6G¨ØV»z‹HgÔ™t€ ž(Ù u…>Y‰¼´¢$Z žœ<½¹’:,‹Œ’74¬.Toˆ±˜ZÛ­tìm&&´Ò6¬kÈ­±j‰F.ßaÀÔÐC-4–)¥¯§¿–ž¹@­ÐÊUʆ#b8r†ƒøQc“-"†ŸiTŠMNâUF.0))¥Q)]#4Ê G9}ù£ÄiˆŽû‡ÝB«Ý2U³CoÓƒ@lT¨ ekðÎdÚæ ]žg×8£Z½v/xÍ•[5 ‘éjDOaâMJÄnæº;]Ýö.äå” g/«eŸÔêœ&Ñ Ðf z— ´Ôª@z7îÓ–d² ¡IkÔ€.•ßtì=tû!f©Ðæ2{}?kô¤Ò|y…ñ]Ŧœ”¼ß*Ø,x¬½2´ð;ÂËeñ}Ï<ÌÃèƒÝ·Ÿ >`è^®fg¬Í¬«¯”•›Ñæº3ÇHv,gÜÓy·ïÖÝcóXÐÅè¶lôرôwákÂ9&±<:;±ã<ifþ[@ —ìôb KÈ“‡"ñ¡ÚíA÷`äBPÐ-“P¥«Ö‹²ÙÝB]µ²DHîi ànµ·žaª…¡·Ï}u ›Û§uUC9¬*}¹f­¦V#‚įÚ/?H¼ƒ·ý'ïv‰•çÔbÍ‘Uf"þ <·fûNPX)ø` ÷öû›x8;œЉ®îìÝ‚ {Oñ¾=IÔ~H ²Ëñ1˜õIìf'²®ðë™ì7®¯p°fçªyŸ3™ß_Ûw'̆ÜâýE†Ã%Ý8r,®gŸ³à¸G“˜‚`s†½Ÿ¡kå$äËó5ùéìBƒÄXÝØ Õ*AeFj®Fej M< l”ÝŒ|\O¥-¨h ôÜ>è7öáçÀ ÚÖÔÛ0ãpvsY½ _h9‚¶b\ŒO`,Ш ëWìbÓ^´«êÜiçYp±¬ž~æwBoœn<Ôíõrr|;-Å?—oÊ'+$˜.i‰…‰™‘©NUHP{C½„n|Wlö¶y,‡]Äò—cþ7àF|ôœÝárã¶³òL8Sè°õRÊ  ÷îÙP¾ [uÝÙ#¤—çþ˳œ¹·Ë9©â}“Êñ‡ÓžyæÓ&qbE”“Ø1Îl;Ÿ–ð2ß ÌÜóY];ˆu·¯(wŠD+@ö˜¦ØL™ 8Yk“ ò ÐG5Óâzê b½x-Û&4ipw¨QƒOã'ìܘѱ3L0üÞÄgØ“¸KÊIثܫÎÏa7aÏ1ªñÛò&µŸèg¯£ýS* ½sñÎûDsûÜ…Õ$°©+Ø{a#¢xö½eÃpÆ>s]Àå˜Lˆõ`ÂiU±WôZ ·Ñjh/²ó ™nvFÚnú®¡wv÷o"2aCQeÖ”q\¾RÚ^ØæábÒ¼ : ®¬UoKÓE‡áîè¡ðþö ¸ãíoÙ]6Æ{2O7((•l{Ο6*ô Ðíîvuu23„þ3Ñ®A"†Ö©êP]PꈴǎnÛ ¢´¬ ñèÎö=°Ö¯¯3Œ:Ð#mòÖ³Ïîi;üö%@CÍû I(W—j+*Ù4¡ü É‹+q~—:eÎäAÒ¯oe׉™--SÉæô˺¡Nkȶ‡,[Òzí<“²R õs˜Lj5´†Ý=ÊlÒmMІš&Qz‘‡·P™µs=„âæÈcH>>r»õº §‡±ýÝùÄZؽXõ«ôÐfÞà7Ù• „â†rÕþºÌê Ø€VØõ.ñ&Ä»zú~v{æå(SŽ)ûS,0©Œø§Ø,¤äF9¶‰]ñüℾóÆïZׯBP±‡ /έg™Ðê²»Áü:=Qj™^„½A'2*ÅR±´RY ¥ RÝÈÁƒÑÀÃpEW>l„²•ò,“–Ây ©&á»Ýê¢c¦á‹X{B…’„ÜÊ=^?WsŽè‡>wgônÓMuûd }ê-·Î*m–Gmúœ† ñŽ#ž=±âÑd˜ûÞÙg’Ö°`U [° a|ƒsó âh¶‡¯0ÍB«Ûæ (= œž«MÚ:CÍ&V.lÈX»b ¦¨&ÞEÂ!ßçà1fýÝ·ÍA•Ke «4Tg±yX%MC½"okæÉnWö“>žõdôldÌ÷uÂ*î.$2 hmýæI´HãÀ¤€5jú‡Û&F’÷Ø&“]mU%mSª“jV¼„ƒàÊÑ]×pAOô¶'±˜ÿÒú$y·NuâïÏ'Ƈ'!qK­ ys}§®Cr¢wà0ÚÝ_1D´@Äü¿¡³ 4D.tûú]çJhK"âŸÎ«°a©}¶úWöOx”ÉH¾îÁô 4â ]öÒ,6_h¨OH)Õ:UmIQYîd+(1Œ^žító©ðXpXHA¡~ÙèbdÏ×o³Ùf¤u›i" Ö˜ÍïŠ]<‘d’3©¤a¿ª´.S´Ö£e§ .'ádß$†©®¹nÜÑ(3CøÌ9Ær0ñ1Ww zбÒÞ\b%ä§«²'DzdÏE:è o¨}³µÉ£Æ^©(×TÉó•{÷êDÚj¨¶­;²ý o¿ùì?ßÙ6šAª¹"c­F¬@ÌœU]F%ûà Ê—ÆûIšgö‡âþÖÃ}ƒ€zZªŠH ð}ŒBL#T™Œ"]ízÖ+¤“jàÙvÅ÷ÁªêÿÖw_÷“ÛT|ÀaG^}'ºuEÉ«KÄOþÂóè4s'3 L¸_Ä¡º™Yµà4}•g3/Oµ«¤>Oº§1} eCS3ÙÖî"͹§P‰|ÅÞŽê8yNŒµŒ¹ÂÖ¨7Ôqì|÷ »^f”¤ªÝX[(¹9¹åü¶ícÆŸǦƒ±Ö¦%öƒ——%™j1 Ï;èî¿ÄÐøæ0R]z»†àß1L]O·qùW¥ µH­cS3Û[eo’ß5 ^åVì°%a(r0Aü;­MmÐè"·æÙ{4'6Z˜ZƸìà÷¥y_™u¯sÖ}–Y3¿½ïÄLâ…i’tôOsþ©Þï‰ endstream endobj 94 0 obj <> stream xÚcd`aa`ddäuörsÔvöuŠ0 ˜Eýî“a ÿÙÊúCšá‡ ãY¦rÌ?DXdÞ‚Èçü ò¡ˆÔŒ/…X9J«: Œõ Œœó *‹2Ó3J4’5 --ÍuŒ ,sS‹2“ó|K2RsK€œ…àüäÌÔ’J ›Œ’’+}ýòòr½ÄÜb½ü¢t;M…òÌ’ … ÔâÔ¢²Ô·ü¼¿ÄÜT°£õÀ¤s~nAiIj‘‚o~JjQÐQLA Q@3X3032²,þþ£ƒïWí¾´ãß§íû>õ¸Ðw÷ïjßß·®ùiòý…è£Å·vßæøÎø[îÖïD¹?Öþ_ÿœRôg;Þw¬çøÑÓ]GxTŽ+~ŸÆ.¼ç»Û–îK+·æt—tûuÛwÇžN_Wq¤þ^7ÇwÁ¹O/­è®’¯í®èî,kóIl«ívïn<]{C¸¦éDÓaÃM¿ýVˆþ6ý>õ»Ûwã¥ÁΞå>¿­äù~Þï>óãèqÆŸõ?YD§ÍèîïžÁ±º¦»LîÏG¶Úß嬗ئ·þnß½h1ÛŸŒ?Çë»;º«%³§w-–ûɶðû\V¶êßöjy¿ù»9~;±ñÕÎü0í{üÌ™3Ù~ÇMf?Îõ]Œ{ßžïb‹xxå¸XÌçópöððýÈNÓ> endstream endobj 96 0 obj <> stream xÚcd`aa`ddäõ‰òô ôÒvöuа ˜üî“a¹ü³‰õ‡4ÃÆ²L?䘈°È200¼‘ÏùAäC©$_ 1°02r”Vuë9çTe¦g”(h$k*ZZšë(X*8æ¦e&'æ)ø&–d¤æ&–99 ÁùÉ™©%• 6%%Vúúåååz‰¹ÅzùEévš: å™% A©Å©Ee©) nùy% ~‰¹© `GëIçü܂ҒÔ"ßü”Ô¢< £˜‚¢€4f°f`fddYúóGß/õÚ­ùû¿/Úú}Ñ~¡ïúß•¿þn"\óãÅ÷¢_V?Þ}‘ãëoþ;¿Cåþ(…gøsë7C8Û¦¾7ÝÛ·¿îÞÄ£²ÿ7Ã÷EìÂ{¾‹°mì^׸,e^wY·{·GwÜé´íE—Zwus|g™ódÑÂê¾zù²îÖ¦®Ú6ߤƪnŸîæÓ 8„kšÏ5ÓÜÀñÛf±èo±ï‹¾K²}7ŸääÐfÿÛFžïgC÷‘W÷3þ4üÉ%:mfwo÷tŽåµÝårv°Õýng=Ì6í»ñÇÕß™öȰý±þs¥±®»³»V2oF÷¹'ÙæßÄÌÖø[9Ñô·O7Çou6¾Ú™?¦}Ÿ;u&Ûï¸Éìû¹¾óqoÊÃóo¯‹ù|ξ:" Ô‹ endstream endobj 98 0 obj <> stream xÚcd`aa`ddð ñòrÓv ò5°00‰™üfø!ÃôC–ù‡8ËïøßWdØ„~Ù±Ê200t ‚È~Ù "Õ€c²3##‹¤†ž±s~nAiIj‘‚o~JjQžBP~nbš P £!#ƒƒ0H#“ß¾ÿLÂr;zÖüä)gü^›ùÍw¢Yì»»wNÚ>ŸãÏ4öè¤î ¹Œ¬ïïÖ°ÕvWwUus„göí”ÿq’}JûÔz¹òîÆšÚÆ˜Üà¦n¨Y÷ìXÃxàó÷ÒW̯¬üÔ¦“ÝÏöZÚÈ×±7«9:x¸9;Häääfåä45µ´uWsÔýg_ñ݃5‡­-¯=¦º¶¥ lU6[fWfwV7‡:ÛÉÃ'ž9pþÈå3Ýï8¾‹þæ:£(§Ö­ãÒ®ÌÑž³ tÕª‹–¯/˜)ÇW¾à‡Ó¬ïù½3³ýíf—ãbžfÏÃ9‰‡«‡‡û=×^n9S/Žÿ"—¸¡ endstream endobj 100 0 obj <> stream xÚ•”mPTçÇŸËËsŸBÂfSœÄ{Óf’Iã„b©:uŠ!­šHe[HÕð&°ìî]vÙ7dÏÝWvï¾±»°¼ˆbDZ©T èR?ˆíDMÈ0'Í0mÓLê<ëÜtÒÝ4Ÿú¡3ýr>üŸ3Ï9sþ¿s”“ƒ†ytûžW÷ì«Ú°¿¢ºúå[~Ñ6¥žD©§²Rë³SßÉ‘ëå=•[ùðO¹ëBï>–‰¡ÂL´>š‰Ï§~P„²&‡{qcÉ+;ÛZNt©;žÞÛv¤±£õéjáD£¦ãxZù¯„˜GêÐa¦Eͨé@*¤f*G;ÐNT^C{Ñ>T…ö£tÕ¢µYˆAY¨Ý`ö1—³.g}]—ý0ÇšóYn ~¶ d‰ù¤])œìÓƒž¨#½ã½ƒÇ"Á8ãÖAäel Xí¤À–¤w“ÌÜU/eÓ-©|eÌwÄÌýQØÄËX~­].(½_‹Ÿ† ÞsQ¯Ë7è7»C¶Ñ¾3ö AœðE†x'kN Öµ‹éRnÑ.B÷²°Z~­ÄCŽâÚ­ÖŸ¶Å»‰X,Áƒœv'¡{ä—•›Ø]›- »£³œÈÂüýáiï”{Ê9¤ÀºHo-R6ɬ.Qñföjê²ò«(Û·EƼC1Nb§šÎw]BÉ e(þgeåBþçpHÛÔDèAö”Æ)peX7`4€Ž!cŒKeÉ_(­;”oRQ÷:’(${äú®\[y¯´‚›Ý¶o&Ä]¥Ê$C£5J:ƒGþq® ×_öò…Ù¸÷aúˆ§†˜Ø7ß>p«…†w­¿'b2eHZ•fQ•qÚ ¯gµ&½ž‡žÁÞðIB?ÃñðàðH¯“—©(׺N~wwl×zbü·@Ïß ‰Ùt µG)çévm9‹ô²žgn‘0ÍÝü("kùr;ErZ•‹eA .»;ííù?âD¼ü~ÙŽm5¥[yÞæ­»m¹•¶¨=I_JC9W½X *3X*VéSO(%6aTÜV¬íîÓhƒÆ8¯øôÊW“µXqOè1š`ß(O7á‘°o8ÚøZÚˆÿ'¾¢¼ûÿUL¾­N±ÉšÅ¢)úzå’b’¶ÑJûtnÜ:ÔÊÉ,K—:Ó„bìcùúf¬8¦2!Øã“îôºÓT§å0Dìa §cžñ!c°ƒWÍ`¶[€”ÒB¼—ηÝÑ@†cÑįûÞá߀mÇ[k¿Yš›IZ¨aè KtcÚÎR;•¥¸Ó`Ôh¦ÿ©,à*)}üÎÝKËé-×yU_¯Š³°‡êÔ¿¬Ò{£FZÆFGœ<„Ì!}úlUÞǧº=:m·¥+R§ò’Ì_R¬ÒÝéïTýNþnq°!ÒhóÛNÁ4¸cw&W&VN¯¸$—ß!‘)œùã1ƒÔÁËk±ºÇ¨UGLqþ4–‘ü¡Œè‡¹§ñp(íŽ1 ÊdtŒÚ®!sœÿO1QS¤˜¥Aº_)bxs|o Î4Ò?30°è› -‡—CËÿ€É%I «î–º8Åì·3| :K— õŽðó¸Vž˜.ö]Xgš´Žö„;`Ýq°ª,*S³©ÅÜlÓY»p€ÎÏã)ÑyþûX1l“h¢Ò÷©yÅ,èý½áô%ö€Ç.Z¼-®wK°<´=Xînò¨ÏÁ¡ó¾©béBhÚu‘ôI©>Z.aYãa¹5ÙÒóñæ¯óó>_s%«zGuDÛ_úõãÿïC¨ endstream endobj 102 0 obj <> stream xÚcd`aa`ddp r÷ðÕv ò5030‰™üfø!ÃôC–ù‡8Ëï´ßWdضÿra•e``è‘-ü ²ADj Æ*!fFFI =cçü܂ҒÔ"ßü”Ô¢<… üÜÄ<4A FCF!aF¦Œ×|ÿ™’¾Ù÷o*+û©[.ô}éCá ßy¼Mf?нwÒž&²w§çu—tætfwçts$?aÞ°»õ{0›pÁÞÖÍìåÝÅ]eÝñiÖËÿ8Î>«eR­\ew]uMSD¶_K@7Ä–žg?Vmf¼üáûÔÌß~¬]sôðÊSÝ—žF)Êwÿf4°uôŽ ¨©©hî.íníiénãøáζê»?k[k^G\eu[[eWE7G›K—k·K÷ù£—^>x~ÿÕãÝo9¾+ÿ–9ü›Eý7—÷oöŒÅ¥+W-Z¼jMáü\9¾²…?œf}Ïï±”íwh7»ó4{ÎI<\=<Üï¹örË9f…‰[ ÿL;¡; endstream endobj 104 0 obj <> stream xÚ%‘_LSWÇÏ¥×zV*âfÝðöÆq"T0"f[¦Ä¿Y AљŊг´ÜžZ¡¥Ðbo·WÚ®å˜&Æ©#ÑÄÅニÉ^tnÉÜf–-Ó§s›c²]ðå“üN~çœïï÷áÏ#ŽãV=Ѻw·sK‹ÓypÇâÁ'¦UóÏKCËô‘^ÍéÊtÁ¤¯ã…—‡øÿ¬eBtÕ"_¯\ä«ÊEn2`Úºñ‡aÅáh¬s8Z¼¾ÜÕé&bMûfq[ssS­Øàp4‹»=’ÜÕîê.â–<.bçÅ#Þö.‰„Ě݄øvÕ×÷ööÖ¹<þ:¯ÜùéæZ±·‹¸Å6É/ÉA鬸ÏÛMÄÃ.$.e¯[b‹×ã IÞ³’ÜgúAÇŒˆ[Ñv´ñeˆC<Êrî²ôdEéwXÐß,pú>ýŸªÜÍô7oÏÁ¼¦ŒõÛýГôöu§|„ëF=œ¸rÿ8LÛ‹03qˆAââ¶îmÑ6Ô©Ä?L"K E»~Íü-¨jv:?ÿœž‚ Îg…$ã#ѯزµì`¶ÒÜ D5\QJJÂmŽzžÒ'OM¥h©©Jƒ4¨8†AQ£Ñ€?:óhÿÔaãv [Ëxf¶Ã—³ç¦Âw¤ñŸú¯Ž< eS÷ﺡ ï¬w0ˬ6Oß@…™ÑYõ’ª‚†ÇcéaÁŸé;ÎÎÙ5:!dŒ¸ãªzÿaZ{Ôúwì!`º®¦k¨Å}·c×=ÿèž©¯³'ó=™cãßÁüìÏ”ÿã×V.@X BL‚&L‚::Z4¦ú٘ʼÀQî•©4¤ÿXU¸;uýãÿ\îr>‘‰{n½è‡£ª- A- 8<‰ö_†œý‡Ôtz %ÞÀtÛyVÉ*™pkã5ÙaN›ÍÌþ¥WØ u¹€‹0—OÁŸ T`I]dͨaÃ̤aæºTŸ-êH@£­…2D ºž•¿n¦´è¦¿§[pEpFoÉ Ô7cf§óË ßtÅú^ÖjQ­å·,¿•ߺdµÒ—kÿú½hd endstream endobj 106 0 obj <> stream xÚ]QËnƒ0¼û+ö˜*ŒI“ÂAâЇJòÆ^R1–!‡ü}ý 9ô`kv¼3»'UÃ=®|ÙY¶¸B?jeq™ïV"t8Œš¤ Ô(×­ ·œ„!Iõ.̇˜’ +ÏZÎjÔÃëõR§PØÇ†Ëà °­nxûXVœÝÏç ùv~Ëj°+ÕÜá‹ç>­Bë¼`w­ÚÀ´wc~pB½%EìÒ¸‘‹‹­Ð’œÒòº.jõïí]/oÂ’<=¸NFÓ}AòÊ«è>¥#>z|Šøä0<ó<çó0gsÌþü·U*暪·èÀ¼[é0Ï"Q:â¼-뉌n^Qí×÷1?S–wk]á/B´>…Qãó»Ìl¼*œ_$8t endstream endobj 21 0 obj <> stream xÚí[[oÜ6}ï¯à[ÙåýRâ[ÇN|‹›KóàÏÞ$ $v`oŠößgH‰¢¸ZGNì Áb%Š"gg†CiWrÆ™ÔLr|=S_É WLsfµcZ3CIðx‡ a SLH´—ç ˜ÁYˆ0Lh!˜ 8;Í Ú嘢s0L †Þž¡©pR0öÎA¼gÂkˆÇuà†´ V1IÀЗI[Æâì-ƒig–3%¬eVBŵfÊ›ÀP¥-PX Q‚  msaÎbQï1«óŠçóPå<®Q€k‰›¨µ8‘Ü1 ÈIe‰’Pžœ„PÁ¡SÅZ*nâ œ! zÀ÷Ab™çàP*0,ЍæÌk/™gž&C`PÞA š(B²À£"$ @©õ:b]–Å„QK+ p’,E8 !Å4›tÁUÀ¥ é6@‡Ö‚cð¨"-žCtÄIh)äm Z” Iµò8RCó‹i† p$©‹·d2’:ƒ£ ze²(Ëâ…&ñ’J“¨HŠSTE%©¢ Å I…ÀÆhLJ‘x*iOÖ€‚%›%l€%™&K 4 h£ÜÓ¬ÕJHýí·éÖÅù‚N°MxÆÁt ¶“ ³ ˜ÌT€å¤L ˆ¶T¢á§R îc ÷Àz* b;%±œŠŠØMEò¦hˆM>œî]^œÎ¯§{[Ó£Ù?‹éã'ïfëé´–Nß<|øS1–Œ³•“¡w0»A”€ ”-ö[ÄSðq=¢F(“¶"ðŽ¡u€:Gv݇{‹x {P´‚ í+ÇPš]a—Ññj;€ƒ«Úàáª-Jrº¾ßâØol+ZÞ ˆBúÀœg=%ÚZƒûAÜ´ûÁìêâóåéì «hÄqôï§Ùt-p¸œ/hݦúuèÁåÕka.w×ãºKUtÏ­¯Ðà3ZËÜ-ñód~võ:ö (ƒ­´M]Û'–cËNŠfrO¤ý ‰ó×bæ~Þü„ð%&äÚ‡¤³97HzW?>éã”ʳål=ó>¸T?Ñ#d%†3ûÊDKjϘ'tµç¶Ôöèêã=aó ò1Ïv“ð%¾hßÈlKÝTŒÄè@¶?lñKoyaé#¸;=%Ùå†'ÓòmcÆy]CÆRjÝÖ§¶FòÂ0RÏ8µA£¾ïy Nž‹Q ‘òÒÓ1>Trdì †n›2…Dd_wle¬0LŸKNÒ˜¥˜ÈvŒ×öÌNµÄ‘Y´ïô®B`¤^šÞÿDˆÔ&δãºá£á¦‡ås“ê:æ‚À¼7eçTÕËa'¿ì®_¡Wø‚ÑÞ1>â#v©ä¥oJ©nùh­$‹M=¢„ò.õljã $´©\¶óœÜ/›1a‡ˆÆb’ýÄÂÞ¼;ßx¤±¹2´óq_™{õûßüÓJ’…œÆóµîYcÙÂ#À—M¯­Õ5) ÎoB˜zEënÔ:…;^ß´õbyŸe©‰­åc;c™A0BÉ¢cÆ{Ë1›Ùn˜½67šé‚Qž¯—6¾çª¹ìÍMª ºMÙªÍ3º7èG¶K«p(ò£°"o ço|°Bê–T.Ë⑼ÛAIùù±¿ÁJ,å7<Æ¢uH1íDZ‰EÌã•Víccâjiš¬FQÆçâÖ=Õ¥öM+z{zÑîR“2ÍXN÷¼°±…5¡³nº\„¥NKíòƒ0KÇé”\Ò²"ââ"èªyRÎÝsƒ~ýòs…~ûásŽ<]‘'åד·ùrç÷£gÉž9ƼDžøÎ¾è[_Ô¦öEkúäUØÇ‘·´ Îî˜yþèé«Ï`ÔbÀ¦äWx£ º¤EÒbÃ-Î(M|h;Ýc¥ ï%îë)é̦ðÞrVÇ+Pa<ÏŸ¿Ü߈~?Ä‘º³ˆÅ‡"– ˆX–~Ã%èÉ`Ïï¯L§D>–%'J–\Ä(-©ˆëÏwwßÛ„²ÝÇC4éÛ6¥WNFwÙ”öµA¹*Fõàr2WG([d ðŽšýÃãÍÍã({yÉk}tWÌøA+Ò 3´nÔÌT¨D?Ž˜:úø"t‡"ølloB2Ö…“±ã‰±7Š>°Æ†i¥0%1ÈŸb°ÕÄT1¨3K ¦ê˜Av™ÙÚßX;^£ð6`0²³QYµŒp·l*UÞXÀnLí?ú듃í'GÇi“ÃÃÀMòï›KI!ý†‘Kú‰x9Ûg®Â>ŽgÚþóÉÓušÇƒÛ3©nÛûql0ѺݣqQ»c¨"{5€q ª‘YÒúáöúñ£˜f ˜”¾³$IñUI’a)Kÿ–Q=jª_¢Ç‹ÉËΫÇ;ûÛQòr’$Íñ"åÊä±åE*³äp¶^û:ôãxq×Á¤µ¦6Î_ÍóõÆüíÛÙåìütvõuöñìäêýäô_ 5ÈéÉÛù¶KÿZêö*´%ÉsIä2çе0¹d™äY¢ô¹”Ûª,Mei*÷P*—2•¥+›KŽþÛ^0ÙaÓ¸'so›[ÙÜÛº\ÊmFè2B—q¹ŒËeÉ.KvY²Ë’]–ì²dŸ%ûŒÖg>ëðY‡Ï:|Ö᳟uø¬#d!ëèæ8dÝL‡¬#dÁÑŸ@þ[`… endstream endobj 130 0 obj <<522e232b9603991101f9e44bb0878b11>]/Size 131/W[1 3 2]/Filter/FlateDecode/Length 343>> stream xÚ5й.„qÅáslcìfŒ±ïŒ}ßwƾ3v‰V\J$zTƒR§K!á J‘à 0'ï4O~9y¿¯øÀïoàAºôÈXY+ëe£l–­²]vÊnÙ+ûå ’#rLNHÔ ½k'áܳ¦Œ—S„ûÕö™ gˆÜ#Û#e’œ“ rQ.ËU¢ªÀî£d²\'ZŸm–©Ä@»-1ÒEL¶Ùâi2N&Êé–^bêÍî3ˆåpg[~ë,b{Ì:›Ø½²Î!Žÿ_'—¶ä§¡%¸oKq¾Ï'®S­ ˆŸu!q{úê>hKñðb]L<ÞY—OµÖ¥Ä{¿uñõmí#~άËÉЃ«+ÈèëJÒþé¼°®&SÂ75¤kÓz“ô|Z×ÉÙ$[d›ì]²GöÉé—ÃrTŽËI9-gå¼ È%¹"×äYrü§°=@ endstream endobj startxref 74887 %%EOF glpk-5.0/doc/notes/keller.pdf0000666000062000006210000024774113766346220015373 0ustar maomkpasswd%PDF-1.5 %äðíø 20 0 obj <> stream xÚí[«-¹q€ßó+Öã9pv[*Ý+ ã@BL†¼Ì̃ÉÅ„xÇ8ò÷SWIkµjÏ1$Ûaسw—j©ÕR©TúZ«Îã7øø_|4x´ÿøþøËo?ùY|ÄvA,oÿåQÃ5òã-†q¥öøöŸ¾ûô}ŠíûT*þÀ÷©†ïSKøÿ.øw.ŸßR„OR’ þDù]•d,ÉIKñ§fúM% KJ)ÕT²|Žd ÿnSnÚµ‰¤âJÒ6åÏ?|û72®Ðo¯µÕÔZÖ¢:à§V ß.I£¨‚ª·áš·Š Iª]T3k Üp¾õO~ˆ÷-ÒåÂŽ|KáІ„paµP©ÚºþÔšjùÌ×{[JÑšÓ£]£Q½mÐùJYj !îþÖãUöC¿Z¶Û[¿ÂghÚ4F<’ôÀP>Aƒþâòô¹ÇO—Öž‘nZ¹ö˜Ú…¶óVîBÕÇÏd*ƒnC=¦½–·¡T#‘ÚÊ#¢}…Aµl&V]6#«IšHLã!ÍcjÚðÙÿÒðï͈ÊsÚÝÍLY^µ…:~lh4¾ñûÏ6*Ϧª­®[«!¤+Ó<¢Vÿµ*´M£ZùŸ~~ƒ†ôéPQ,W«ª÷ŸßJùôÇØ—µ~úæP)„«¨.¶õÞ—ù‚¬å_´che<ó6OR®Üg î•F kÓ»¨V1Í7Àßý“Î9êg,§Jß`$ª­ç*6Úf)l„Óê¿Z™±¿­ßœ[^ZúK+ëÇ­ÄO´£³IÐ÷û°»±—X.FRå*öy¾ –¿¿p9CW’ÕÍžæ|K©qš:ý‚¯¬¾¢~~®K|ÿ*vuº7.€½¼Ü=†×Û·Î ÿvš×8eSã8iw-WzuÎO•¦åtÕâª6oK̸ÃüÏø«Š»Ï0¯#–{Ý&©@ÝÛù´Ä¾LÑVÖLcÆå¥„cß|¡"ØÜ˜"Iã§—X@½…5YªÜL}Ëi ëW5¿öÏ6ÊñÉ£Çið àÛã•—·¥^¬›_°xÀâ3ö<¡í1)¶Z>Jü?¹N)Ÿ4»ds~6‚è0µ;^f³¬(EÝiïHÏî”͉æ ®iûTXÑŒ9ç}Dõ?âg2Å”âhÂSh$7©MV•UwA\d•ÕõN·•W[T^¶&Wýl ö‰×¨<‡³ ürò§§™a‹­-jå´J¤¨«„ôŽI^M•—ÓǨñÞߪy›A²öcÀ>Òs“ãn†yÛëpc>šê¼j'w¯ä4dÖ|2Á9B¤žî2·©Uönš+a¼äfÑŸÜwàÇÉ8â•ÐiãF$4‹¶E\øSð'®!0àOÄÀÙ¤äBq~øŸüT¡M‡÷©ú[ß G¸^¡ê=ßžî›o¿y\iôÇáV\è¬îq)|ÄæÕ¯ÿøù®Ú®¢º=‘nãÅÏ7õ¢ê’«UgÁM'U—Ò$µ§k,ÁM=ÒZÃ¥Òð†µ.Á«z¿`i¢€Ô×঎I“RŒPP½v ÏLpSGk¡m~Ï´Ñ~gnSLpSÏZY¡Íá; êÜÔÜ –VÚg¿³`,ÁM=hÛUJêQoÇ‚Wõ2.àÊúÕ¹í(¨KpSÇ=?ì>Vî.Îz}Ó­WäÂH+â; ÊÜÔ±³èƵžðõMǫʼ³ -ÁM˜¥QÕQ—à¦Îñ*–ÒÓ’v”NâëWå<¤Kù;8Îë›2ÆHðxËå?–à¦ÞT=Q_¼óçÃÜÔëÕ"•üxœ×7årõA…M•ëóú Lƒ‘ø¢´»°Uªà¦ž9`ͳAgõL,Î7õÄ®!Ǥ}ˆêi êR{!S}—Ï/ÁA›ˆ¥M ‹>^íú¦ŒÖF ŒW´ÓÔqS‚¥8IAÕãœÔéÖ¯ÞM½LÁAç –‘UuX‚Ã’Ì0®’T=/ÁA=QiBÿ­Úm^”¥0ë Â!Š0V¯Öò,–,‚ƒzçÒNã.æKp°F6 ÌÔ^Š€Ó‚-»375õº‡Ii°Q¹è4*Kp˜ÒÜXij:GËÜ8j¨(KppEä½3þQÝK]‚›:»V,ÄfÅuõ%8øEUr§EÝ(?Œ.:ð½3M’wÈíXpS/Ô½XŠË¡zô>¯«½kȴˆÿobž"¸©w­{‹“¥¨/ÁaUä–× áþÁ-ÁM=^¬ÕpÉóú¦ÌKyMygA_‚›zó’½³ ,Á!¸`ßXyF½sp’–à¦Þ ¦PáP×÷y}‹¢‚̃ÊÎüê°7u øK+ù‰ÑÂÜÔqhR*Š‚±7õªÝ€“SB:{rÜÔ;T*ö‚‚ѧàU½¹” £Ö°7uà(h5#¿PÜÆ` gêÜëÉ…y}S®WÝ{±7· 1+IÇC*î¼UÁ«:†aöÑGA÷‡#+(jI<‡=u>¹" ­ä¡’<ä`w¨×7岿{ÅÁŽß7õ&f˜TÞÄ£‹à¦®N”f¯´\¨^Ô!-Ù7 6`°³]ß”A=®:"Ôæ9"zÔ²8µ$êY+gÁM]©ÂÑ; ÊÜÔ+Ç©ÓA“ wÏAÆnò ‘ARïz;ÜÔ»ø\\‚†´}ð˼ªÇ@»bY©H;ªå뛲ºZ+kãH.ÁMĸhͬb]"8¨s˜F+¸Ô®ašnêIü@©gm nê™w}dUç0Ouö<Û°va8"×7å"#JqSTí¾u)j±Rm‚›zÕðsÐ|uvÂ"8¨§¦ñ¤j·y}PΫVÕîKpR„M{^”ù©(Êîª]—à ²„ðÝz%/Á¡yøéwVõ°u޲i÷aZ—à0üR»îéH=,ÁA=ØÎ©¨qå%8˜nв- C-½-Áabð, ÅÔA·yå¨Å+Ëã³C7A“ÏŽ&XäÌgÑ‹†}ûO‚ìnÿÉÇò–kòYtðø,ù%çÉ᳌EÆ+a¹³òYZÆ<>Kkš+峯ƒÇgi½eQgÈÝçžcî.¯]ŒÐÒò«Ghy—¡å]x„–vX¼C3BK‚=BKÛ½X6HG‚Rkcº‚øccR˜êÜíxD èaŸ{1ÝN/¦$Æ0- Ï…îaZHE(Ë´ô¹±¹šbwÅ´ºÇh! 키9Ã-ä¸f¢((Õc´@o#ëÆhÞFVÑ‚½6FK‚á"ZôÅq#´xY<@K/ÅÓî‰è¥¸û¦è…ÛÎgñš əϖp=áY¼.¥—ky§³$d;ÓYz¹¶ÃY¼öÙ,Þ1íh–ŽG¸d–Þ´ÅÌ¥ïG2[”ãM2‹~Œ3™Å^Í;˜-|\×á²¥ë:o\¶htvæ²ôM²sYäârY,eÖ>¹,ÚRÌ.—­‚K&—Åë–=.[u1œ\¶êjxæ²³Ô¸l•m½Ãe±´¤Ë¢`$—ËV¡“ËÒûGð¸lå첨 .•¥šÛFe©ææQÙª;ŽIe+Èbt¦²¨ÎØ|RÙÊ}áQY,ˆkTVüˆGeq€8´žT–¾6\*Ko|ËNekÐÚT– o‡²xÝ]&KF]w&Kv\]&K3&ïL–fIv™l‘c¦‹ÉÚ›ð3“Ź.êÆdɱ%—É¢éOP?î~˜|TÛ¡,~<ºL¶Èvv1Yôæ2Yt|±íL¶v˜læ!YH–ŽF¸D6Kس l–С²èú˜5Á5ªGMèÜåŽeñºyT–ÉÚ7*KË`h•… ’¥%×%²€>úΨPP»Ë¨ÐGî@–®‡Çc)"©m㱄„æñXŠw:ìä.•Éæä.¤4.˜Ò¤Ží¹ÙÉQÙ MÕ¥Žu+D›†Çc)È”ƒ¦“˜6Ž:bÚÂä©Òv´èòØyrÔj¯]{öX;Æ—¢n<¶Ú@y,cï™*ž© ï¬ßQвÛïê1רÒ™ÝQE¯&GxÇ–®={ä±è¦Ú~j–Ü\,.‘-Y+3k/E‡éhíEbÓ…dQP«ËdÉóôÉ¢`t—ÉRVw&‹¾(U—É¢ïÉ»séâÈŽ¾¥^û™YrDÉå±èxrÝ€,鬑e¿³™%Av̒둵JdÉ‘ÅáYÛ:’¥ëá1YrT9îk º{h–61sAkº«iÉc²äØærYÔÓµä1YòlŒ”ÉÒu‡É²_\H„ ·“¢ Åä±ôI¨59y, *x<–ü-GÕÆcI=4Çòv6ËŸÇòvv;0Ëo%eŽ{Ç’vH%uÞ}å› Ç²ú~`–Õ«Çc©”QŠñXŒâñX*å ñXj{Ìå'Ë‹ÇÒuöÌ®Bå±¼F&ÇRéØÌÒˆ¦äñX*åý„ñXŒäñX6>Øx,Û1x£Øš&ˆˆ‚.DÄJ ï(Õ=. µi7ý¬mªötx?.K‚:\Û¢xŸ‰bQÐÜã²ÐÒ„ÌÒ˜–”¸ÓÊTçNoejßû¼5ÅëÖ(hî©chCöÖ“ÅÒWܲËb1 i7€®¤æl(ÏÓØ<©{Z§±ï“šBÙºáØ¾ý¾+W}í`Ž\Û»xΉcéu¡{dìïıöÆ÷Ìce›¼€,^w—ÈÚ[ðéŽì-øÙÙÁá‰dGÖÊHvh(5™ìÐPê e1âäw²ÓMÓÙâáºéÑ×7&¤ö®9bÙ1ôU¥rYJèŠf©”]©‚ÙÔ“žÀ,ö˦ ïˆe©°Õ˦ _%:‚Y*å0ÍÀl YÞSÁ,•æËÒu÷°l zÞѰ, òð°,•²çQ,›‚Æn`–oV<0Kê;—å^ò°,&G؆eI;¹‡eÙ46*K×݃²du­nT6…íkˆå¤._ŽT,ËV –¥)•¥ëâž”åÉØ7*K‚Ú=*Ksö“²$¨Ý£²ä'`ß“ ú;â1ô—aÙ1ôPÓ‘ËÙÒ..;díp¸ì…hqÙ! ‘ÃeÇú¢®€ÙQôTÙ‘Ì9¿¼È,Ö£KféK*qƒ'´cNô…óËËI—­P\6KgfÒÎféÌLrÙ,JSÙñloаŽ|–ÀÔÓÂ^?:Cˆ‘D´ø—ÐÎS£FhQ“Kh{Ö>Y JsY^ëŠÏŒ¶®øìH [Õã»Æ!QÐÀå-O)öØòä{l†-¡6ÖÇÌô^I×Íaç KŸ‚ÃqÌÔ7uÚÖñVú¬^4žê]#ë³új–³AQ o:sH#[O•óµ×rS¶†Ÿ”g¯¨ò씣2¡XØZ={«%]dZIAè0”|€¿Ëi)bk’SCy,ýß)(¿õ'~· öDtšŠvM;1Á‡=΀~×z¼üŸèñ,'ŒW›àãïúŤÿ·ñ¯*üvŒ¾änûs¿¨ÿ¾ ù¤‘¼ ø|öò‡úèÏiíÞbäÂîÍZu30ÒË6>B´§x|JgÈÛÇ©âgqLn†=ª¢|}锌òÐ60\Õ$hpH¦ÙÄüühðUùÑâÿJ~4Éh†»N Rùì°æs³ iðœVÅQ"Å ÏyAUBIó´LSßQž¿j9ç(•bN{Þº¥Ò³4|I’][ŠÖZfí/*©KgéKF»¬Ý§¥¤Äø³ j’þ½%˜m’%QÒ¢­üw’ôoÿîmÄô’+±ŽOßÁ¥=[âð=s% GM¦a}“5ƒîÌ×ܶԕ*³;¬…uË+Ú·z5µ ê–o{öV5gdí6ªR‡¦Lœa{Ú|ÊfHÏ™aO¨÷ñqCÉEùaVrÍ[öÔ-<çØæÉÃu=õv´Ï½ÚD›©¿Ø Ø_¯9뼽ͬ״¿f¼©„½”»ëÍˤkO¸Y&(üÑ,íâj¾*K»›É1PÖKñ7qMIËœg>ÇibÖ©åuZ=OdKœåQl°³¦„M?>à_öÛïv,iïï­_Ò<ë­?ÛŸY9çCmä•,•ª1É­i[îjë!32iâ¬+Ûä3ɇF-=k=¤gÅÛ¼$£æ‡‹ÏibŸTß>í¹K™¬bÒÚјO ]y×ÅÍö½ô› ÐsÂ|µ ùÔþtE—ƒ-íøL vÇõ—­Šìät$øAt¾ÊöQÁÒ¯Zéwñ‡Ëôb}ëÕ²íίÛ.:¢„V)ǰ¯Ž)Øw]ùA8¡SÔ¡y+ð×S_þ̓X·gUòT3‡¢÷Ï++û Ìÿ[ýÊk&a°´µ‡Ü¿¹î«MÞŒ(o†eµpÖe¾AÌÛò±ž%¯}ZÒøsQ /yvë}rëCX³öE4Ͻ|ršcCüe΢B‘O\Zt'že& Ž6/™ß¼½ÿâ_õSºF£27–¥òþ‹_ÿÅ/ÿý?¯_ÿÇ/ÿì0r> stream xÚå]K%ËQÞó+z9#¦Ëù~€ÌËFB°°¸!å–-cÆ’W ñçɈø"£Î©¨ž[6èêª'¿ŒS••ïª|ùíK| ë¿øÒÓKïáåß¾¼üíw/ßûQ}‰á˜a¾|÷‹—R‘_^[=z}ùîç?ùð9·ð9ú?~ε­vZÿ®_si~’*ÿîž ýß­]~TÓÇÄTt¡.k¥¾ODZé>]®-?î„dùa÷~Xåß½ëïõ|»‚ñ£”kËó\­×.ôË ÷lŒé£tº+={’ëÒß^?þô»¿_³úóQuÊh É·­r¡"—Å„¶(ÿó`1@ܾ8®RðP‘®0Þl% ™¥µ«Ó5¸èsð•1‰|¥bOÜ׿ûƽù¡±VÌ€ð S¾æÌ×M@é÷é x.8âAzµµ¤Û¶¬©ÓÏ\*=Šæ(O”}‡„‡Èvlä?Ù8áÎÌÅ» nªf<ÀÿŽvëeíz\”Ö5Rræ‹9åŸS_W,í´· Ö€¨êêïz š¶râ0æ>åƒô æëx~úw>í¿jð{øâÄdÍa}PÕ^t"öý’þëýÛÂÝsÏ;%çøæN9ø"ßûQy‰åXsHÒo]2¯FçK®Å0™/¶F·ePµþUãÛËÏòvÝ1­;êC7̸.P/ø];ý.çõSúÍ?£³Ÿ:c˜à×.¿(ÅEbmQW]—ÔSW÷§*õÕõ<W›ê-7֨ξ¡2×ù÷w’”þ’¢k$ab½±Û…EÒ“š:ÏG>ºîzU1ró‹ŠyT% Uº'tä'›`ëkhÿ’t¯”M*oX´-{Â8D3‡~å†&‹K:™|ñ âû6R\©~8ÝOyVsê ?‚ü«3+è<=Rˆ{ê=ÅX;V׿‡¾NIfߊÛyfŒvÃæ5ieœ×ç-e[þ÷”íW„€Ø™[¢ê|Š[)†[wâÀ·Spm¯d,ÛG>Kè‡h^– Ýú50Ð50p’Þß`À¤°×xÓ€éΜ>è­Fœ°Iîmíߨ !]myªoµAâ㮄™ZÜ–†nò·“THâ¾é¸··­’ú{Y%íÞ*Ù­·¬’4ÞgOWh¦ÓÙqt!…¦ð[DrïÉ9´½ì§`YÓ_R0á“^ì¼jÚ‘O½•£…3>é}xˆúõp­ø‹±‘ý|qÕ™“àßÇ×»«_?Q×xÃ6ëpïäg ɺæ¤wΧ†åWôH¸Ë×Tou-°y„øG¦¼±ô‹3Îâ±lƒ´íÅRÔ,‡=ìÓR=,ßi³CÈn®ÆvYp0ÒB¯‡@I‚?üîå·/KÝ—ÿ\ò¯Ós¿®ù;J|ùÂ@1à?^þéåÇgòr´†ÞÂäõ\È—YQ¤· y"%¢À…&•ñ_(\È×lÒ;„¼SÌI y¡{R®é(L]¼ÛââÆ¤¤íJ0ˆv4D¤±*ðLÞ×#roÇ#. p!ïGœÔ»‘©;™#h_ˆ+Û«Ô9&SWŠÑ*p!Ï´/Wï¤%$ò‚égàBI][¬ÉX’<¨òpäD½Q¸œrw<“·qtºw]{€¨Û<ân_ˆû‘ˆéjq§`ÚbLB-Hk2§\È‹lõZƾ€aÀ…|mêl4ü/Ü®»}!ŽÇ ^©ŒN¢^±ò5cÔ9Iš|áŸÇÝ~&^h£Þõ£Ô™:ˆàB>ºñº¤ìãÕžsê.n·O.äM¦lM]òµ`8äÌwk¥XÜP ¸WÙåk;Ï˺ò"qqXÌ m9/ÉbÀ*äî\È3‰š×e3Òîòd€C^‰Siï0,`à³ÜY[u÷Ýv¨—È^½,Ø„ºà‘óH×j)õn;ļåú8’R7rZÀ%ܺŽ{ì¶CܨwINÑAkC߀³BÌ.KD‹ Z@1À!§§ZÒ?$PÏÝvx‹Å󀎨U¤óðtI¾ÔfÄFì­€Ãæ…$â€,×]2Ùƒà¨ÛȽÛûÂ@5àBž]½‰öÒÖîÑ€ y!Ï{õfÕμ+оP7Úã«Wí²4.äƒ<äÕ[!qP pL¢9¥f\`;ÀÅàŠ˜¶Ma:.äY¬“°ûÂV`Þí qŵ;L¢µ“³òŽ‘’ùD>0r.Öp8¢tÊÅ'eƒµ}!^¦A¡^6„¾0Ð ¸J×p/dµÇn_ˆÙ4åÎ!fyg‘ àB>x —W'vÈâï¼Ûw% ß­Þ$ÞMd%àBžy?RoîLžÉVUàB.µqÔ[2“7–“.äcäcÆ!§lL:†Ùt;˜˜ö`äQ£(É›GU¶…Î#5ÞNdgf/½Ý-RŠSžŒ\È'‹'Ïä)î‹1{¥”Ø*òÙ+%ö׌wUÌÄ;æM©‘r•}ÀšD÷¸Š7Ú¶# Œ»mG‰!‘/†ü…jÀ…<±Øƒ¹º'0R.;Ä%݉£”ë1O².å&òÅu)óóˆÜ”‘³ ªÀ…|Š€€¦ö­N% ó©  ¥; J’}¦ú…R®iÞé—´\jÞ§¤¬x,äcp!_ Oº‘€’ïtcZÎ/-àV¼Ìx§yÓògg:iõ´<Öœî´:…Ä"i˜òX ¸G˜7•ìá/ L.ä  ìDvu¹³w¨WÌ›L^(‘ŒŽ yÁ£F 3yÅ£2p!¯b°ˆ˜*3£kRûÅdP&&F¬A€ yg‡q°n'ê±[Ò¥3Ì`Æ œ9GPÜ¿T§8xÃsÿ¨—yE zf¼³è¹·Ã9`òƲ\grê-p=&È»9{ÝäØ0¯,c7àóœ«EäqÞyQDÎñxhDÚ‡ÆÄÎ^Rj¼¡œ]KJ¼ó-‰œíæÎ9Q™—a€CÎ?u‹ ¨ýÎ-¦EêêcGrö±Éƒ/`f€Ã`MãäÁ‡ÓÙ®'W!}³y:;x§Ü;xKžC)¼oC)´¡Ynj †€‘ï5$.Š}¤Ë0ÀF¼SiB:dïTQ5\%cOG5À‘»,»48F‚4§»è ñ¦¶ 1 p”³7ù÷¢b¢€ÅÓ⎢*&p!¯ìòh<’ÚmÜÄ#IužB›¢ãm¬“ToœòšøÀ\ȃ°_A0…€nÀÅhë’Õ.F«bn_ˆ›pâËd ¤|_&Cˆ7Féj½TŒ¬»ÖK–(Â…<Ëc p!‡W"îÔª~Ä=¥ B‰ÑP»ÞÅñSêr”~—# ³VžnJúˆž§KF3 hÍoœÚ]~#¥ #Ížæ]ö$Å!2·¨©‡ÈÜâš ±áÞÈüÀRÑÍü³ÂßW¢üy—WJT=ÏY«˜0v?k5EËZNlî¼”—ëlt?fÜÒSÆß”zHP’K•D2/ÁtWÈEûþ©Tìœî£ð„F·“æd‚N4„#q-‰¢¥¤L0À µ(yER&ì¶ÆáÍÛ¸„TÂ8Á'É‹ҲŽ %€—dAïÐ$Ën;±0ŽLSB¤!Ë’ p"m,òÖß”i«»í„ñäZMb¡ iDn;EQ¨ä¦„ƒNxS>Ä=¤xe6À ²RZ“‘3b§,Íp¢¸¬®×ÔWÍmĺ'F,é€k­²){¼É ayj:Á€ y’ðt/ȯ.`p!â™,®BWG€gòÚây2˜€tÄpäO\:Cf†çÿ ÿ>p!ï;êϦ3ý>p!o ç¬åþ}0àB^EÜ,B–iý>p!/’Ü]É«$7pÈyU¨fžYlÍ€ yãwùl…&õ`€CÎbfÈ,ÂP€ yÂÕ"…$ï pÈYÅÏ+I”òˆ0R@`¹p¦J‡|‰Q„òd€GŽØJîJ7à a!Š6Ç µL .8ä¹¥E•n€C.½;© Ü.€³¢[YYןãçÜvˆwÄÃ‰Û px‘–¿,ãÜRxù8ƒ»,Óe6pz7ÀÙv_%è`5œMÍÓF²K«ŽÈàÕN,rE4D‚¼P¼¦ïöEØ!˜›™£DzMÙÈ+šwª5É£äÛ\+ßzç¬3nçç¬ ç} ÙÛ*×§W%C];ÕÚ„7³Ÿjí¸ô=ÐGs·ÝÈÃ^.„ØY)¼ J‰X} p“Ë+"€,—À)µ`Þ"iˆT^ÛmÇá°ìâîž›+8ɹÁ­ù'Û'à$çx.Ej•h€“œk]z¥|bÙmÁ¯Ò&KïÔB›Ývªx„X3V]ŸÜMY-ã“s9«Wê>–ræ\ŽN²,F#Aä¤ONº8ž3’ÄÞýÁŒ reóQ@î²ùÒÅ­§q46¼o¦Qt±¬IF½×4À©&ã0ÿfŒqËKsF£È¢©Ï^àTÊ÷Sxsí‰@záÍ¡ñÊ„ Õ7u¾ óR̬Â}ŽãÞ×}x©#I]m<Ô¤H]§@f¢dUÒ© R¨{œ§Õ6Ô+饄%ínùMD´ª”pâúR“0ðÁÑ; Šën;¢5M^’w‰iGåœÔ •M5ɧ á7 p„ŸÈf Tž àH3)(ç%á— pÌA{EP@ŽNG¢1[SI_†­ pdšè¨~4ˆ´ºÛŽDk(å+,XË1¾YfÏ %Æ«ÍÒÛŽ@(öP»>í¶ç4ˆŠÆ»9MÒEÓ7§JºˆþÂ!i»í¸/R_ܘ;Í Ld-æ@eôŠŽ´ jåTHËb€÷V‘V:éKE»í‰V)°j*Xµé8Œìt­-R;À‘Âh¡¸òœ6àg”ÊŽ!%»xµ¥l²fõ¼¥ª€çóÅôå&)b¶C,¦3l^Ø£‹žÍK½I\‰¤òжC»øRþM#3À»vïF¼îxFr½îÕËŒ‘ºeà³ùœ¨bUæ0î¶³@Ü™õR³8ä Î'F.o¯p˜‹’¼«œ'~ïW9ODñºn¸€Øgw7œTó/‘· 7Rg1·ÍJM¸‘ÅÍJ­íÈŒB ûsàì~ ^T¤dìÙÂÁp C…Ýv¤–Äp&¢ºKIezQÝ%?yMkÀ¬/ àÄQØ]£¼Z‚¼xq²Kj>ve·½0 1v­’aà0Š^…¯Õ ²$¸í˜ö2î‹‚l}<·v4UÞõ pœNÒT0éõd€ã!1sµphxdî¶ã¬‘UUZ”°.ÝÇsäNÓ²‚4|¹´,Q]8Èh;×gmuÂQj8ÕòXXüeæÝv*?„¸ÀVIÔųU¸·D:¿L…ö…´ŠÔ1ê*"ò†\êaø¾çzN­ã!W› @ÿ!—œ|œÀ”x;9IDg¯N–—‹o–'㆖PËŸ«< àT6µÆÊúä.cåiÓ®öèwL[™ÿ¥"«Ýoˆ‚7Vöv+xcÅßnÈóÞM¨Ìfñ)€S©Æ)«]Û (MÂÿ[Q}Þ ¡2pm¹ ¨8|Ò«Ují)™œîj§¨6Z‚:‡¡üj»Ã¼^³£þ1aÁ à„Xš%¸]äµGœ8< ïP0 pâð ½e ˜¢àÄá9*–†ˆyªN(žkPÈ¢Ï()8e&)r©ëëg à±°,^½R Ùµ†)x’TÓÄX Q/¢Vpª¤ã”L¾Tøö$öÞ§hPÚ…±‡]ë匽I98õJеMŒÎýh³cf{EÒsN‘tQ{k HzàTIOÔNH˜¦á­[¼ò+Ô‰…]~e€SVÍ‘º%òP±-gà•U£RLv^“/üpʪ; V$T%î À©bë¨ý’5Rà¸kT®Nçh¶N¶Œ½¢x¬â½~òˆÔþdL5À+îã,þ0"Šû ð¾_?GjÍ*ÞÝÀû: ÷ꇔöïÝ)‘ãSÅC&¨òÅ ^#;aê ðÈá\¢$\>ÀûjLÏUj¼éa ð¾ÓÅNzõa€W,ŸÄGñT,Àû²O—xAÒÌf€C>,êZ¹Ÿ px†‹­êGlPœ$€ÃÀëhÊ3MÜ<¼ÏÁ0y‡p¯òÉ+Îæò)_&àÏ=àlmLú5(±‚8U¡ü¨]+÷[ppw+÷é«WÜ›´ˆ4IøDGèqgÑ—=2gºg¿qÉ(÷ê¬7ùô§ˆ”¯Ý•oM®Ý¼¤|ëwG¨™JH ¸û¾KÇK©ü}—¸§„”=à>U)É VœRÖîš3& àè_ÅöêÐ<8¯4±vQR̤î³ÞGì¢ôŠëSÌ$œ"Rèªùp/§ˆ”w1}‚M›N)«[ú@JØóç¶“ jÒ× Ú-'ý2@+O8ƒp$¬}ÈÉÐ&§p2U:E½LùøŽ´¬îx¤FÊì†\Þéâ;ïü²NV¢žž“Úóî1)Ñëi)ÍÀé•›R©*éS,er¿YþTKµUç©z³ìTvÀ¢\9Š‹¸ÚGqY{v- +ðJß:˜_ »N}Gìt¯ÐóÝ^£¼AÒ›PýÑ p2ìߨœ €McWNP^A„¾vGe+Éç»."´ºÔÈ&XœÜvR ¼D$.#R ÕÇ)VisHª!ผruõÜÒ¯®äç·~ÏZ…€y«UÈÝåbà®e{˳H\sÐ~Q?³ÛŽ×Îñ²65&€Bð6ݘ*â[Gè&ãS\8!µdè;×Ňœ³éœgÑxÍòÕɃ|TM¨‡Nô#¨½4ý(xÁ’ kLc%»íoKo “ pÒ5’¶è:ryW€C‘Lzõ:6à‘WØÀQÉ pÆ>‘ö úUŸl€÷ x2èùvñΠ'röùj·ì÷Áyë–}[ÉÔy4À!H‹Ä¨8üÅܧ©ýÍpnjŸy»Á+Ë`öi€³•ðhƒ¤Y¼ÔaE ¥cƒÎÝv"eïBÝúÃïëRg·˜¿.uë“”åät“JåÎéætk<¹ôŒ[—ž$쌧€ ÕïüU®| GÐó]8‚tƒD/4»+_l¶—–tæ¯ÑrJ!¥ŽÑþ4Y¹‹ÎP–7ºÆ~hý.öÃ%òùYâù|Y¢úVý·ÒRu?nÅå§ W#ÜÅÄøE‰›–7V¼oÔS<‹½ë]Ö¥Xl#,pþé܈‘"Íòr3uüã\H’t}þl°þg8æwa¯q)Ý¥Ä%üg‚KÅ8@ÃØ«¼tÄ9Bÿ[ÐÊÎR‡úbÅ¡%¤¸ùË‚gùDQb0UíøÙÇÅ&Ñû“. ý>þ:•ê…û¾!)Ø*Oø—:º:å[Iv4Ñ+·ùÌ!ÿQŸyÍ š°Åüµ²ƒýx7:"š¿=÷gÆÌHÖKÿŸïøÊ)ć.ö˹ÐÙ¸EÒµãè'f‘ WS[N˜¯8+iÜÒ9€EÜý­|Êwþ\Íö‡Gf›®Ñýyd{Ž4ôÐĽåž˜¯2F•Ú¬Ã\Ï6éìäP6*·'ÉÓ\É3]ÉÓÐ狞r=’§æèýIoô}„·U•ðÃBª{BjxBª? ©ü’ÔW)…ÑÞI)˜0ÏhûÚú§w]ª)•©šÿÿ<ö+žû ‘6EZ}¯H›žH«"í°aLøÅÌïê¹Ò¯>J¿þ†ô›oK?¼ÀJiÊßý¸WŠð«Ì}¯PNÎ!l8Ÿ-Þtw>ÇœÈÌáÃé„ó›ûô¾œ“{ ŸöÔÛãf©ë›Î6äçxûlÃ2.Ë«N¹«‰eG¼óé¬ÝNj­8´íÔ޵”£—y>‹Ðz®¼ò…ç;Î"Ìgö¯œEh§ö7§¸sñà7M±\ñÍ)þ„)ž²‰N</þHHÖ£uù¨\ï`ON’C•pž„O~ÂsàtÎ÷ÎüÎv‚ñç©œõnÄO%Ÿotk䯿ê,.Û¥}øúÓ÷êã!¦ežúlº÷mº~–Ó9¿ÿâ=aµA¿ïAùƒg¨Þ’êÍ ¿V´`”Õ]È¥ú¿ã‚<Œ—cô÷§²žoôÃ%®ùÖš†,D^ˆ‡KÃÜŸÈ:÷!èôTF}>ÏÓNÃŹ¶9ð'=¯¾="w]¶÷ÛC«©w¼ã˜fw{G ãÏo>LøÁ€ž_1 ÇÛ4—Çš»ò·Ê€Òì0ì¶Ÿ–Òîó£¼YLG÷\c޼)ÒÎÇìòýV…Diõf’¢•éé¼úk(úÅÝv\îðÕS™¹üqw×§«¤-Ÿ„Ûè«¶å‰Û¾&±"[÷ßøÚ´ñòáò“¥î>ì˜sÛGrø²lj\§µœzþv;¿ýØk;LÏ]—7Óí2þ™žêÝ›dj_6› Þ»]ϸ–éžç‰zCñMœµ.Ñ쮯ء{|¦xï§ÃÃK??ŸuÂal>P^œ–ò ¤šI¯ý<éQ7ÌNÛA˜œÒó _mñDø›öüÉoî(ýø/þ¹Ñðù endstream endobj 27 0 obj <> stream xÚí]‹$·ñ=¿¢ó6K¶}”¾lò’# B0^Áò`ð9{ÁÈCþ|T’J*õ¨{{voÏ0ÇÜì¨KªR}WI½ü¸¨E¦jñzñ^.Z~û°üú÷vQRD—‡ï§…wËê¬ðvyøÇ·—G£ü£qæNûô·S飇»Õw)¿À>ëË·“ùé_¾J+;¶²—Â"¸è»ú<.^DŸŸŠ°¬J8ÈÏU}Î)áÍÒ îg„†>2 ú†´Cw«r¶|9úša×AÄ-z%·ô!ü0A…¥A÷œ ÑÔç_üfF&g6 (5ìC]>L0XDÀãe‚ŽÕ}fO~/TìêþíCDƒ8‡A¿ÃÅ´Ú׌cV¨PÁOÒû¬ŽWšYàÝÔG4¦7ÝÒú.èKÑ/HŽ2 nAÖúl/FÔ¥Á^’q”E |±ÃMÔUÇ',éÒûë‚PD·ž)«Fm”ÕŽœ—ÄùD‚ÊÁZÚh5æB8šx65×=ù›ÑkÕg’Å)™3ÉxdÆ53@èÚðœ|ÿeQ«÷³…’¿ ÞíÉœ ñž6‰òs—¾Éü-ë¦lƒr´e’vu¡: `£¦O(¼Èl¯™«ºª„©\ÃY ÜcG+ýÉâ2Ëzhë`èòœöŠ<ƒDoŸ}¿$¿N!É»âùí nØUÁãsÀ+¼’›@Ã4ÈÕeÜÊB€¹Šƒø}ßU>ø!f%#ÚÊR9§°¨‹D»}—ØQÂo™IªŸcŒªÝ×&Å'Îï‘,ð¤GÒ—¥,°ÈßOYäig‰¯‘Œ4ËÀÓé/÷?ÅÑ<8¡;ã ;ן‰Å…ØMóMM7ëšÛBö¥Œ‚8Ýc{2?Ù8¦8ì‘\Mt¹µ¬†ž<'&Ô£ï%4/Åt-®#«†F—”²Tõ“Eë+*š©{’ƒÆØAÜ–h…ÝA¢å„cÜÆ¥ž$½Ÿ,n÷¬Î±È¸õ¬-:æÌ4’‚I G×évN¶:j¨Â’)±õ£°‡­6ØÈC"a°·®7 ÷¨lþ @0½Éª=Sùm \XõÍõ¼ÖV¿$I›¹bxâ€%ˆæ™UË‘‰Ž«†˜§¾™4 e­;²¶¢ØÀÊ“Á+°j#¨j´Žl0TBQÝ[–èØžVCÙÎ ’êú$JÅUÖ˜1*?6õÌäêOgœ­eÞÈ:ŤûQžàgéTYÅ«8ß‹:ÂëI{)Ö» m]^EçãPÜ…8²cšÅdYö4Ó${` $ÙÄÂÐB5Ó8î7ki— Õ Ä“G­ë_»êIåÏK½ýÂ# ÀÓÄ&È\(™¡·áGª)×U;ÅdKR¥†yAÚÖxÚ)¯L8¿ÆÓˆ ™C/s]Z;®½ºµâƒc±6€™%å²Ü%›µR_ÆI8û«ÖÄ”QX¿‰Unè*ÈãrÞŠ&€Çy‰u¢?Tkå§y9Y9ý~žî¨Ѭ’oÏk°î¬T•¿<¶9Õ“Ûò;])8Šy}Y~6±X±‹œE‰—jT óX[U¶ÄEÅ#5HƘIé+f\ªõÂÒVü5Kz(íÆLÇ6aSÓÇ;Aø¨QÅXûA8½ßw°³N€–Â߬¦vôD)çn µ©'ÝÉJÈ==®²»¦ÉiôG¶B_N}ÌM­%çUq‰™µA›IyºŸÙÝ·°)ºíYØgþ³Û@Q×:ï–¦‘–±w…fùýŠ…x]“úS¢™©Í›­µKúEÕï]çòÊÚC:·ÙXüÌŸ:%‚;êY±þê=-×êâ&JõJ^ÛÝe®• ±5$Ògúe°kx¬¡ Ž54øWjh4´U»M0(äÖ.”I“à:CÍÎZöCò•)4Ï+ÝÚ¶Û¯kËÄç »åY©ÍëY~hPÐíWhˆ]^ß3—Ž$øÆÁÝ Ó‹ísuTͨ¼€8?®*+9¢;ªˆTn@©‹)qTMÛ)%h…(kA]Æ %[–aý¦½Ø§‚Úº8ìá¡‹ëB:}èâæ‡.ïæ V`ù-Ƚò¨dóüIJ![OâZkPyºUC²ÓÀ%8õw®wSŽ:=è £Ùí ÎL”Êò2ïlƒÖž-}Åi—9vLLëIN’V@lŒÚL²î]§h-Záh.¦ï’pS#€w¦Zí’\ÌAÍÙ1F §:Š<Ð…—ñºðu¤Fˆq§×Îè"ø‰÷.óO•º*¸~¸ú¢3¶€™Zƒ˜Ú°êgYïæ‘Î¦ç´§äEÀ2Õʇ-Ù|š‚ü—›â¦Œ–óŠHÑÒòÎ[Í7 °³}j-\8>tãš1éÃ5]TãyÊ‘éç-´ä o£'Ç @ݾ¥.J[w]lSÄaIÉÈéYú`÷аz¡l°Ü6Á”B´\ ØŸ”Øñ[)Ùi•5(ÎõÆ0ÔK‘©Æ'¥ä7q¹Q±—e9Œ%wwu·Æ”“–±Ž[¶â€~ZÖ6[µ¡7á{€[‚žg«ç|°QCb#zÏ£³Õjô‡ÒÎkWK`—ë#^aë®ýLvÛ½§6¿bBï© ZC'q0ÅUX¦4˜« Öô±¹f1'•Z¦J>E·A£“JžG{ãT™çÙ·M[_²Î}µ/!61ÚtFûˆbKÞÌçe¾ª~31MJùâAxãé¿{X~\„‰aùO*" nûáBªå©$ë¿üsùfùº\ªãûGLk®àƒ(,øw^zD7ŽÁG†{ÉÜÕ¼ö‘ÂTd Éë†KmNC¾Åô=Á)0 ë‚k‡‚SQ£óÇ qØYeœÙ`ÜŽÂ °¯_áyXïò=ŒÇ–]J` 6ƒf6øfö'Åþ2ÈA»œÆæAÒ.ƒ>ÁD¡}ùµ«W©˜×¨WÛBÅ·*`$¬ Ýð@ï=¸}ÆG\êóœqÛRåÆàZŒÂ?1l íMÐðI¡?5Ê5E×|¢Øíj#ÝW˜ þ ù¬KR9‘f^© ÇÔ)óUÌPŒCð:`B¾£³çÇšãS¤Ûÿ*Ö„BÕxº0ŒÅÉXxí˜}ÙÜ7¡å-ñ®^ã; ¯ÆáèŸ:äÚØ°Ü@ÆÙ`øTƒñ4o‡ýütNçj#²Þ[Q ¡¿•ш‡‚ ÖiÖîZË›&+Týo]A€«Ïª¤ú\8\Éw4¥©=^ƒÐVSQ®ÖÈò¥®~åψˆ!,a¢¥|Ceo"ÇEÙ¸4z¾d´gRqð´ÍD’‰c©€â©‘áEE,ÝŽšFO­ ¤Æ{/زõ?%k%Ó‹ Còˆ‘®3?9î$t* ï^e]Óÿžñ>d]tÁù>«ªÇóŠ¡!Võ°6š®«HA¦¥+j&Àa‡uPÓLBè/'™Y·}Jƒ›¨ôž? cm…n‰M oi;lýu®‡Xh¨ækYn‚F¦ TæwØ«æÁ ‰‘TzÜíçYºÏàV£ÑLVׯ?ÏDôÿ#É=W&¬x¯Ì`ß…ÂGßU{òxÜ[MoóãX؃;1w^1ww=ÿóÞ†1 2yº`Õ÷¦4ºsð4Ïí0êO07Aë9´yCèÏå ¬Ê/!®>ùê~Yä#2¬‡޹s`þÅ`Á§^m;´¹2¦ âM–UC–óh4¿R‚ÇBFÐÁ‘Þ9{ä×Ùû¥Év¨4ym¢¬7{ŠzÙØð5¾¥FÒEÃh¨×çóUN×_`_™²v~ÑÀ{{š^½pt­tx}…—ó5šö†N>ä/,ÛÌÃm>ËÞ¦ù0½?ԮƬõ5G7ì;2†zÉ s0¿7çúý×ZPø ÜübéÎÝî$9¹ù–§µtÏ=;gü0½Ðrª±w¡AmpìÜA¡‘´aäïÖNf÷²™}¸ÊMÉÞ‡¬H³+sý'^"¤â—_ »Íìd{8ò¥µè2°+Óùœ¾Iop P8 RÁíRPÏ] ¥ï_ÿâç‡$I endstream endobj 32 0 obj <> stream xÚíZKoÜ6¾÷W踛®rø’´¤z `ćlN‰Ý8®´Hѿ߾DiG»NÒCaò®Hçõ}3Ô64ª‘ø§÷²ywÛütÞ<ýÙ6JŠ^öÍùUcp]ÓöJ8ל¿³;j)Zi¼ã¥ÜQ}Æ ïfßj­p”ÂOÒÆ‘a´M#MZÁÒ}ÿöüW”¨|%R6­ÒÂÚ,rv¯ÿ·n7F¤™õ^M'zÓÓ<êPÁË™4ÜUõ‡ÿ’ž×ûP¨³JÏØ·àýî¸cÖQVx—ƽ޷Öîží[åüî%³(Haó÷œLz~Ȧ4z.h—evV8(;`5é h’L®ÆlVõŠYÀ “5TŒ||œ•zÆÌ6¢Ëamv0ÜÝ\¼ù|{¿¼ãö®ô}Zã7ƪÕþr-hON< <¯·ŸÅ-è| ÈU8Ǥ;~vtášÂZ­é5­JŸPŠ•ô?cž30ëö"=ïO¡ŽO½ÀìÄ@5#çŒ# ÷UF8 Âl\6¬ôä,o.ß8ÙZ péJVâѯ(ßwaÄ ë[Mq(võdåh_‚ò$YžàÀã÷^E›£wq†Ùŧ.ø-¯à½gT†’ ¿LyiÇÑb|\;$)ùÒ¦ËQGçt®‰î‚1Ìo˜¬êi Ñpg ž$c£Ìl¡Ÿlý铼1Ú* l†ÿ­Ê£œËÁJKßÂîÉÓU ¿úô'‡Ý€×Œ’nÈë¬$@%OàÇ,ëágŒ;n?~€ŸZ‚6Âdø|ÿ‰‘Ñú^è¼\p0]åÓ†æqzJ?2:¡ÊúÌl'äà‹`ëéÖáZ-°¦¥ìí2èqÜXÑÙu².·1´Ëž{Ns?p5çDü/ÏÉM見ÙÄ)MRŠ>O(¨c"{®²ÀŒÖÝ$ªkqzú¶N­€G/‘ÓMÆT;J(HÂaÍ÷&C°‰õ-åɰTÝ ›¸Â‘„”Á„¾ cAà€ËÌ>¬è§>ñ³²ÛÂä‚ÙºÉzòÖj©ˆšª¸¸æQf"i.ÕK¦w“Š,›ò9·”!çó‡Ë;F›V÷"aŽ™F°ŠÁ ,VˆèˆúL14!Ï ð¢+Q]Übªûò—›‚›`]6á fë¾G|`«åxÇä0Bfl»«½¾`eÙœÏo¸"FH½°SGH¿€Ê£;öNmC÷k¶ `eÈMca ™âݧ;*y?_ßQü×%º»“3Lî:*Á6a/½Ó¤^%ýòî}Œ¯’av.¾ª&C¢Ïp˜z'™¡‘byÝn <¹§â"ÜÊLó¨ Í^&X¦Ïš _«ƒx¡‡fÕ@š”d>ã`Õ58=®]©Ré9î"2[̤f«:%dWp­k<ãAª*Gž3*bju‹>×7U‰ÙV·ÜNA¸ºQïØ"¡ <¬M½GxÃÖ‰ZtÙ ¸þý’ÃÄu7éå§½zq‹cÔZq3¬rÁ² j©Ç•lKåµ÷¢¼‡¡·,[”Ùo9«Tµ+VH0£»ZÓÝœRê(s¬Z?[¬jªp–‰,¾™µ+&z¹÷Š?Sn…°ìýkäŒÄÃ@ÌÍ`Ø\¾Z0e/ü²ü£úÁò³g8„Y¢Ô–Æ*vÄ€Ä ëNëÉÀ•jC!4ž?æ*d±V›ÏS±×‡zO¶®oóQœ{Ê5n$ÑÅvŠˆu¡¥ÊOgé–zxP÷?©kÌp·\?¾fÙºœµ¤&؆ \®³f[Ï|šD˜O¹-»+7ñY¬Ä$kÝC1¼I‹Êx®‚K†ò«Z$l®:Àš¸˜­“6`-¶_tKåØ-„}Òª}`9zu¶§¦|tVIï^b—R­†³[Ú:7 ßóì› g'o*&e°N0+5Ò-ëOÚ´…5Ô¤#´|GxȦ¯C²3bàOç±`(clJ _Üæ¦²1­å«c%[³øÉéÞs*·ÊŸWQôqÙ³3–+™p<²o"´úš5©FÊôl5ÒgWÞ§¦Q§ÿ©Ô€Î'÷˜øn'> stream xÚ­[K¹ ¾çWt6—îÍ´"J¢¤Â"—~ ·Æ^]~~xýòŸi0íÔ„˜— wGãÚô ÒÀ¸$NoŠK“†<)˜ºÄ²<[¿—‘ŽT–O£ó"¡þž·‘¥ºô~ÈïKÌ¿” Ò|,%Í{à „h5é‰7 NeIoi ´Ò‘wõÍÁÂþDU¨Ñ'B}‘ù—û‡›¼½=üþ§w¸ýª~û©¼—‚UXÕwÿðµúpûñãí—Oo®ù·°¸ªŸmÐõþç»?n®×ûÿ}¾[Ÿþ|ÿp÷y>2}¹ªoôÞ¾z}}¸*K°VE3.ƒ¥ù™´´î¿ûòæ÷ßh¢ׇ_$}Iž‰*)p°ZµhQ¤'Eçߊ­$⺠Xþ`B6„«Æ*¶ökžmî°(x>‰Î2›¶…ÉÑ*?Ñ8’-8”·´ž‚³ÃÑøìz+òЯûÎóoH¿e ›g]‘GmûαìæfRGóv§rÞ±meW˜i‹ë¶²ºcéëèÑdõ-7*†¥`7L’ÂòÉy‘”“˜Óå1S¹ dy£Ùýhr?XÒjP>’)ŸÓ€¸‰Vµ£çO ×:¹˜ ¢†Ä¯iîI¤çÃþ© 4#—ásðuLÖRöa¾!72ÌVrõ÷Bz™F›#1Ä@ÓŸ€Yæ0U–^Mv>-„ΜìAÑù7AI–³´;v€aÀ¤5~­ JJ…@C´ ŸIéÐÜo‰r7ab‹ Ù½ßK`PÚ6 ïG¦Åë(¿~µn~âLwˆ Ù´ù©¹¼)¦ªiZ€g nš®ö=š, s 7ð‰*Ç žš›>–iÁNʱ sÀVoPM朙yUŽi€VÆä„a³Æ‹þu‰IÒ°1Š—ðTXb2€Æ¾Ä‹Çvl?—}_+ç&bø”»Z’I’Â0$ÖsvOf€¾N‰’Ýó’ƒþ6Ú.§.M[E'<ª‰Y²«6!áÁ? &ú¦èÍÈ‹yPžG1-­OÒ›@“9‘Ó¿(ÎyøUËy´ùà§ð/?ÄL±ÛÀ7yIÚôÌ ƒ²%3xhY1ð&986ÞÖM"ÒXS­Ç¶m*ñENå'Ý‚7d+Ø8…½ ʲ¿ß‹ä°mù4"` ˜ 3³BйR¡YÌ?á;¹oˆ€E`Ùì[8š ”‹(!å—²x’ëɇ ¥aÝZ¦YŸüφיº…>šËaùžXÖ•·4¯à‘|×L à”òZ^œý'ÒûÏîos_®hâГƒM6÷(æÑsÈã¸jâf‰K˜ðçÒd ‡iôwÕ(Ö&q–=›ux7ÔmMÝsëÀŒÔº;&¾¾ú¦3k+µúy0n‚3ÿ¶Šk£{‹Z†ˆ{V/- 6kF F¿ZÝ¡']-±ºqÃwÔ0A¬aLÝÂÕZâq÷M.F›rÔ#åÚÎÄ ¼Y”Cš9ë%(: 'É·ÀìÁ÷tí…Üü3¾7ÿì„+ͿЛ„bç(…`7ôƒÕ“œàpóð™AÙÍî¡ë›ºbU4.½»-fÍ„¦@îþ ,Z¼ÜpÍ=‚I6Û¼Øä…µ %Ë>‡Ôû-A%è {¿6\Þ>KiFt^6·×)mù̈ÃòNϳ˜ó u!ÊSÞg¥±Cݸ~â"ø›Val Zã&‰ ‰ó&ÉBmñ¥ù LÂµî ²b'wòcÏÔœÔ ‡î(tˆ”üÙš½€ïř߸â»òÛ–³OûkéOÇY¸úDòš,-P„€´9 §âñ´R¼Ã7_nß|½]äû‰DéØÖ7àB¸ÍI!¥Ž9©AøÜ yÄZGÞÿ!}‡\æe÷y¦1h{³xÖ<ÐóÞŸƒi?€ÁP–<Ô@Îèˆn4jžQ{¹ŸÁ4Š>ÞófqUä­°9Ö heW˜‡7>Qô-=íÆ““W]œ ðÛ›•Õ4òÎí—7ÿ]\týx%7›½f mÐó”¢=­º,/Ûý+÷Z¥G‚ôz·±Œ–s·Ë|gŽ=Îæôr®¢Z¢ $†½ýUîYDß¡·Â—R°2aše;t+‰Í쭨嗞ÀÀd§ÁyÜ‹C~s­áåèˆ¡Žª%~ÀšœÎØ …¼Ùg$Íó· OKÌVˆ†áø¶VØ&â~8 ÅqØŸÿêñ%ÿâ~Ï®î9ku½6ï— o­õ$Ó,pU? }^ÞÐÊy¥¿¸óPW²å'´g³Ñç÷ñÄ1F<Š’ò¨Ö y"Ÿ’ ‡6ßχΤ£í从œmûhá¹1çã THÊ…°€B @’e(mÓT¦oƒ®¥nãÔK¨¿& ÚÐN@f*ö½\– äU mObÎN’/),@L‰XŽÊ˜KW öà4Cèƒè ÚÌW– f ÞÒš|'öbr§yÛëkÚæ^h–YÅÖ)ºSPò*Û·­ 0)³ÏÃÚå8ÝïÝPþAq-*¿àÙe ï§¾uYm°ÁîVn°Á\[¶Í³•ƒ‚¸hþè îí 1/[ ˜3MÒ¼†%Iå·!90C…C¸œÌ‰ùÜŸ¯•–"tlu±t%gw¢óápÇÉ„°ÒæÀ~|uî õÏÒûVMnqf~ÈÛÜñ‚ÆíÝöÜRvr× rnÑk@ÜNþü˜œ ˆ½Éð^>˼lþ'Û=Ц“µ}¾&@£üÊ‘S¯•¢íBó#O7h ÆÍlQ vFëœ%Œg„ÂvB? > stream xÚ­Xms5þί8à‹®c ½ëŽ34„Ц-o¡|ˆ;Lp®‰‰_RÛ¡“V»º“cej¦“¹óIZí>ûì£U«÷•¬Dø'+¯*ïE5]TÏΪ/¾—¾’‚·¢­ÎÞUÆòFWcg¹·ÕÙå9›h¡&Úº‰6>ü…w'Â3üy‰Ocø¡9¶ëF0œm-̨µ ¿§™ðWÕoÏ^„ím¶»¨ÆJpGK0ájåÁlàq󸑉››¸šT"³é=·&X›7Ý|Þ­ËÂÞÖráhú±  Á¶~7Øèí£ÁºlC)Z®“c‡Â›îÊÁfŽ‘[’\±„y›¶…í\±:‚G#VÑ€KânceW®KÍmJv2žâ…È\XènÍÆ˜TBÂ+1;6£Bœe=~±„£‡Ü©™0K†qGCYµ™­ ÎÌrïò¼çè*+¸h¾“¼ ·i˜Ó°l+)y `¼xî<ªå*NÓ<$\Je (ŠžQä‚â2ÁSoÁŠx ivÂ(‹1x³&.°JÇJã4×%ë´ÖâjšaŰ2Ì®SdþÑ*S3}s…ITÁâÖiÌûR•¡MÛF£ŸÏ–ÓùÝeW­tì««ùí ¿þ&.9ÝfË-N 3þèks^­/n¯aÔ³''#|ÙùîØ“&õÓÇlx#“ŽØËÿQ’(°ÿM“¥Z"ßNìÂ\í{]òëȤú¡Ü'vQÞ{fYëû ¬•;Ôk[òZšôâãR:ÖÂóVí( ±Û^ÖlpÂÉÔðŒrCR$7Úd!$àsŠ%‚eV'ë('ýꤊ¤ƒ gûéÇÒÅNåÒ3Jfa¥‰FõoåÊ ’(;=Þ¯ò†ÑÙûŒI ’«†4)‰™àŠ]a,9’Ký@óÊ‘Š7‰˜_ÃáºT2ä¹H‡ê`{¤Ñyv\0 õ“\•ØéžàYA’ˆy'ÂdO‘{:¦öHP,+“Vìãeðàø‰‡¦t‚‡s¢xhú$÷*÷9Àh4Ž<ë“êËg²€ZWhU÷ ±Q2Ðùi"uTvT1¬tÙiEÅPȼl¹T‡ž«ä›$•2nð/œ#äO*z£{ÈöIä—Én‘’†«ÄÈY:dn€ I㟖â2\&mû«°¿¢.’x Òfä.1€€ª‘¤ÛIR@ðë¡ÄêQª!©Ñf/2)îݾCPy;È äDÅö=ç‡UékÞï¡ßä£Ç»|êŠ0£žDÚîÈnQ­ÍèaKõ’K_Ú)Oa…µu!u­æÒJ¨c®Hà¦ßãÀŽõu©ŠòË}âØq©ãWCíØæj3Ðú€jŒÐÉĺ¦/°“ ¦ŒE–j:ˆ$r£!nă”äYJ›%ùŒAY2í x)!im ÷íî!Ù±nð1Ý""ë£Ã2ªœ}Ћáþ²ËôI=‚ÅñÞôÀUü ðÐ[vÌ[pܾ)†4rPþ_–-Sn#ò<èR%Ó×LyðˆÂ[Ö~H“:]” ÈePsj C‹J ².B©>û8zFVÃe ìFSçòm8§Û–s™†¦Žò·ÚÉwÝ6|˜-/¶³Õ'­ÞÁÓ‡ u€¡»ÿÕú>:6]-'BÚÙtË?ƒ¶L°çÏ^áü³:ÈX7b_C‡žßÍ6Óù Q–Ž·>Gzs·î)ÍžÝÍç°"eúDº=…Cöân~ï² ðÖ4~{K+¬1cãxj-â&*¨^8ÏAð Uõãz>‹áûÃÉQ:¤vÛ-Áí킞0Õ„»>龫·×Ýj}ÿ%t?–­š¿aE·ž-¯²Ù|ÿ0ÛÒÂé|öþ®ÛЊX<_^^\Åt öÕÅöš"Ô-†<«~þäÿ õ endstream endobj 46 0 obj <> stream xÚV pežÎLúÿI²‘Mœ]Ýi–*·Ö@Ö$à*’R ,÷™“d3Wn’Ìù÷ÜÉL&3™I “È Ä@@š¬Qøžj3Ø­I—ˆc¯Kô'Ú¼ NCGy[áðÚŽuh#Z_$[«©Ò”¡rXÜTÖÚâvµ¶”¹b-Ò´ˆwžð1€R²V¼ j:-£çø ¿`&!7Éo­VÄtùgqû¹Ø‰<.´ô±ïÛ ¯ w:N¹Ž4s6³FÄ]Т3©Å¥HZ¦R?_œP½"=n™–<†fÃ…€ð¾üà¨K˜Â1Âüg0Ÿ+¬¥ŸFI«eÉpˆLÆ^DvƒÙÑ»Ž}ÜÝdu››Ðe4ô¬}[ʪ ­Ó¾(I{)‡R‚¢Œ‹µç¡¾5ê¹Â¥ZµZ®+¨›#ü¾@²°Â Úüº†¼ $R]–¸ g¸`g¾iˆÁoŸÅÓ.~“Æ<ç²ÅL3½?~ÇÇ—<°AAuãÊQþ5\-Ä]t½ÙØpmãUN"q Å Yïi8J íôyôæïÖÄš9¿V\‰´Eê*YFÚÎͨírÈ|k†5ÑyȺ…ÆþýOtu>c]e¬2T«`tÀ‚³NÞù*w Ø%5bŒõõõVÛÀIÑàØÐØà?¬õözKKºEyu•«î(VÂ"c?ƒßÝ>Û1±‹¬ªp‚Žv½„AJIŽJš—–—Î=i"uMmf÷ŠZ]oˆ]àH^¹ŒîrP\d⼇ÔØdo°77yšš] ¥åβŽìýÙÛm5 e¨î©­’q‰n°)”H=zvÛƒÑÀrubÈb·˜M=¢c‡Æ^5A™Ut65ÚƒTrY]ݺËÓÖl‚8t=ç&Ñ5È+T€7ÂÇÑA|ÍÀß®ËeÐuBéš4eÒ&TŽJ­Õèõ8[ÜÕ¹¢¢\‘Ñ_2ÀœDû>poù}nù6püdnn1«t›µBÎ@N¾ArÏôŽOŠKR'ó½_=Îîíúí 雊¥™œiœ,5œ:Ê }l÷à<‘c‡'וÛßßoª5U6š÷¬ó@ÿÄá‰î¯,N«ÃädÉw¢ÜҺ͜ƒw(–šú‚{÷´Z‡¸£ã2–ÖU¦zág@D•ÆðŸÍö‘û—˜¹rOÄÛI"ÈÓ—¥Ü¯DÜÀß4žA¶ã Ûc;q'ô L5DøXX%$QåKþˆfÂYosMð0Žü‡ã°ÿ,ÆQd†˜™ ½Ÿ‹;€o µ¬†Õ"(¯(UÈ=å>Ÿ§©íý§‡—’˜dò›™dÚåYx:3ŽÆN4Ÿ1šX G&`Ö²:ŽP¹®F¶1={-R ¹EåLéW}‚Þ†úñƒ8L|(hNƒ“ÙžŒ†Ø>/$¿Ÿõµ0[ªË¼_4‚öv]&CD è)}–XFo¬;ÙÅ|Ì:Y.ëWðÇâ{¨»»ë†à}ïλõ·{·Ø¤Ö Ô+ Äj®œ5(åêw"(SZ2ø}ÐiwýBå Aµ÷öÞÁÃáÚ·m‰½~oJ0‚ÓæË=ö`=@/çõH|Ù-™l‚óñ zªé—’Tá=v6;eùꌕÌ"Z†Z} > ….;ÑÖÁQ.¹È•ÚÆü;7S‹d–S r±.ä‚Ü}õα»ìñFò¯]î,vâ|£×G“T;GðÏFM³EE°Q‘ßDœˆÏ]@K$’?>ø_^uö endstream endobj 48 0 obj <> stream xÚV PSW¾WàÞ#‚¶ÄlcÇæ¶ÝÚ©Õ**ŠZûPñµV­(j•*oD“€òBx$$ä¿ä ᙄ@$øÀõÕú®ºbY«mº«ÖÙ>mí¬íêœÐÃŽ{ãB§ÛYgvÎÌ™oîü÷ÜïÿÿïÿÎ¥©ÐPЦé'âãÞ^>÷­ «Æ/›25::ø,&ð2˜0,01$ðT(YF>Æÿ2/슢“Ÿ î³G÷?¤GÝ5µü ô(£D§ñè»â‚JåØŽ¶µäù|^w»Täñå{·IE§«À`¬$¼r§à˜ÒÝÿ´›WFuõbG¯¨÷O“øF¢† ˆ<ÓNÖã8©“ÁñÍÕX?"ÑQó{è³üõ¬BŸ´e«öp›jùZ¨E˜cäИӳ–ÎNMá*nmmryÛ s¥8•ˆÄYÑñ¸KãÒ×uœ”—;zËY_]o¬7 2Ô´¢=¸ZÕáÍ»Ž;úD÷Ïàëbc5˜„õWß—Žû)ž›ê{€¬¬UoÒIK@Y®ÒÇÊŸ×-Z9E 3P>k̇àzeÏä›Z5>}› eöÞ],£&bŠDr¯Ã´Õ¹ Ñ)"‹î ^\Wlßôík²»ÌÍpöµÉ;SÌ«`-¬2.MOÜ.ËØ‘3!ézÅ5d¨ZcMr×èçyw`’’þ¹'dg`¾¸°…m÷U&qä$›^\±BªÄåîl6Cn>Êá ,¸Íum&ÔÃ\†3: #ÌS9žöèœz!õ)nÚÿ9V_ yçƒLÅ\óóêH8‰˜Ah‚8˜öþÔ¿gzÕmZ!#ó|rÄs7U›ÁŒ,:‹^P­>G[º}câÖH‡,On{ê•—àψw‰{ýxëËÖ⤂4¹Ï7 ñÆ)y u¹[Éfg›÷sÕ‡Ýbë:%9rî臇Ï[í6›ÅÁD¦.]2¨È1âðI¶«Ùv^ê"òBëo¯Jã M…^›ºV²)~㪤•º ­V¯1bd—½þc©‹ý/2—Ãd«»€•o7æî³à¬³ÕØë뛜5;ŠÅ;7·gú2m‡ JQ‰J£^ˆw³  Ü•Ó™|6ålÒY]gÓ; õõΓ‡z.\ä"Ó YG•MèÆ@ÆÚìì¼4Yª,}«pE²` Šíi¨íþ=ÇœÚóØ‚ëÐÅ· VŸDÿ :¾B°•$¹1ññÅêØY•‘H’Š#ÙÝçåGŸ‰ÁBü½Áy8Š‹ñâgÕ¯L"®ú/H–àˆ;ðð y„ÎÄ‘dŒà•‚wT Þñ±Š«oÁ<þ‰ÿªð`â$Á'»[èöà†¾öÀ<±¢™íh¯Jæ’‚éiA‹Òå†-Ò–ûó™ìmæ}µ%ŸÍ?cpä7˜Æá84‡÷6æd¦¢Ë,n$:±~q3UÚâJá®H\pì$‡_e¡Îè„:ôáÇ'.Üë$’…Rá—@gÔ …¶ßùO'‚=¨eÏA“Ì—Õ*ónm•Õ–ÔÕ•!#[®Ö”¨Ë’$iï$%.6"%žëf Ìšzh‚Ö¦¦ú&—¯¥ÍåŒÍ³Å'k•Õ”5B9Ò³P¤Tã×»Õì:P¶džwÉß“ÔÛuv­ ñìÅ‹G0s?( y…¬»¶°˜ƒ|•ª¬¨LU¦*W=Òw22;Úó}JŸÚYèò¨FßåhæÑPSÕRFßc´d`¯`Æû½Ó»Z‘àHfPoM⯙óÝéoqZ¶">1õm@‹™\}ínn¤Ò˜×ˆÕ ­ IVRûFÄp[D81âá'FH§n‰¶X,Ö‡£ÿ |!¬… endstream endobj 50 0 obj <> stream xÚcd`aa`ddä ñö Ðvö Ž´ Øæþó—aYøs>놲Œ?ä˜~È3ÿg‘{èÅòŸ‡I–‘AH2üæ‘_@¤:Hø®+ÐD‘ƶ©‰Å%©E™ÅÙ¹‰%ÆzFÎù•E™é% Éš †––æ: F– ޹@¥É‰y ¾@Å©@@NŽBp~rfjI¥‚†MFII•¾~yy¹^bn±^~Qº¦ŽByfI†BPjqjQYjŠ‚[~^‰‚_bnªØ#z`Ò9?· èßü”Ô¢<  ™˜®]ÆØÎÀÌÈÈ¢yýGßÏsßËw2>ù)ÍüÓÿ{¹èì…Ý‹•vWËÿ¹ÈV]Ú]R²°{¶<ßåküšÏø½á(óÃï¢SZûº'tsÌž9c®|÷¼ÆþšI«Š§EÍÿÎy@brß¼)“û¦Nì›Ú=…czë¼\¹ß*š3¿kôÎé\’×-YÙ][ÓWËQÏ>ó·æoÉçM;ºÛº%«kë*å»+¦¶Ïj9—³¸aOùoÎ0‰æŽŠ¦æŽÆÖŽÆî&ŽÊ™u³å&w÷v/™ûý¶DÍoSÖò9M3fÌ™2_®{jûê®éík;6v¬ãà+^üÓ~Ûo¹éìr\ÌÓTÿópNâáêááÞɵ“{ç\ æýþP=»Ãc endstream endobj 52 0 obj <> stream xÚ¥VyTg¶ï¢¡ê‹¨‰´Á«LÞ3Ï]Qɪ‰ûn‰¨,‚@Ë¾Ó MÝ·zºiö¥Áš-@ˆ"¢€É'¢“x2‰1“1&Çy“`ÐÛy圼jµ3gòþ˜äÍ©Óß¹§ºîwß½¿û»%ñô”PõÈ‹Á¯lܸ`ïÆ—‚—ùû/u½ów.“8—{8WH3=…Dáâãtêÿü§×‰„ê™áZsv­‘ˆ«ä?Äå‘É,Šš"{üÉÅ«×nÙ™®,-«ié8sþ÷7]¶té²§ËÝÆŠånÃÿ±j¥ÛXí6܆ÛkõR·±Âm¸ÝW»½V»½V»½Ü^Ë܆;z€{Ÿ÷>nî}ž^½tñŠuŠ„£i©QÉsw("£’群ˆœ»!35*12*ògŠò^æ1&yW2.¹(¹&ù³ôu“Ü‘ü(&ÍG"“̤J¨RJKé( xJO(#e¢Ê¨rª‚2Sª’²RUT5UCÕRu’Ç<$”ÄC²Q2B¥yøx¥¬´Ès¶g—Ìë:}ñe>'懎L™5Åê½ÂûìÔUS{¦…L÷ž>>ýG'¯Öòýλf!%ýÂy]~ˆ‚ÓÆÁr÷¸0çsF¿0Ûù!F¾ÊHuqE.› ©éAÉ»4»<ؽœÐOá ÄéRdœgåö¾!Û) ׆_zS2šEkŸß±-pÏË{ƒw©ÕÚbP‘tçRÆŽÑ^Q´æ ÿJ$¤”¦@ á9zdpäÔØÀc×ÏÃ$A_aæ¹yK&hîö”ÎÞ–öÎ^EK4{?²êuçz ‹íòDß'ða\„ÓŸÀY²7ð·Î+ò¶¶Áê@F_ßũؑúÜú¼”’3$ £WU‚Y|*ø tt4!²šãõû!šìT/y’}"­¡vÂ3]Æ–cÐéí1&¢¦&%F ž87á”à£gpß­¸°ÄBdï]lûtþJ¾¼»ýŸ¤‘ Kìéiµww¥‹AK§u_æûqÔö~œ‡á[8ã)”Ë&{X'?4y÷–ß!ç"æ: Ä2z£ºµÜÇÉ'.ÎgeΫM_¾ƒñð‘]ö`[ ñDXý÷Çä8Š;˜VhÑÙ”D69’Ô´!$+$ühlF´.JÌér¼&G;>#~uL×"~å|3­1 öAHzxDÒá´ƒpÈUKé¾Ñ©ªÞ( 6÷;oõû´£/ÊúŽö¢gÈjq¯ !z0²z˜§õ+˜§ÙZ´9s{nhòöm™åÙ5d µ£›“…÷$¶ÅD*6 ºÂ~Ý—Æ/Vü±ì"{Ö<¡Ÿ€ ‚f×QñË~?ç­É~Z þôxŠªûyõú:·âcRçìvÉŸ/Ü‘»+béæHÁXt|áøÆñM7ßÀ-¸Óó‡«gßm¹W †>¸JÈg…˜»Óäºr¨Ÿf¤>|¿·k¨î4œƒ·Rû#~·µb<~*¨ Y±…±°vvD%ñù#ê³Úf°•6»xý­ŸŸX¨¦n<×OáoqžÂYÒžŸŠäBŽMÈL–£Ï0àoAò©Èæ³![Lú"á¦Ïátæ Œiû"í Qá¡qÑ©¯é"ÜÝSìÀÈ–¸0ÞáÓ}{#z¢ÿä¹^ÙŸp¡s±¼­Ü^Ö&Rx$É‹eoaO’0Ó©´÷¸1¸l¯‡ðô«oÄ žuœe/Día²‹’ÓÓ4ö#™¯7Œ ±²ÛJµò°=£ÍÑjëà %¿&³šˆE^/_Èl ÝÆÊnØ×6ÌÁÊ?.w7u;†Ûq…Ýgb×Ý^‰²ÉçËrc+_)öL}i6'|Çäd•f²JPò…@âñó>N«F†ƒK+{÷•‹Lë«»Tï’¯…UØ•B¬|‚–M^pìäàˆ*)==9=^—d/] ‚{"ËÔV­ì»´Ì9ôfZЖ-9{¹éÎD¾Ýù;õí¤´ý_èq0Îg)¦U*}5'*˜ o0uVÞÂÒíЮ³ç$ƒôûI/­Âg½ÄsÄ a%Å;œÚ}ðp.›”D¿{-b@ ¦ºÒ i„™[’ãŽ&‡É s„ ¯^ÚpÒt¾ÃNd™Ç[{M=@0ž~ .i›ÖÙI³Â¯O#å`P–È,~V1]P`xÍHð I´ê Ml%TêDe:ÎÜÝvw‘\Ï4TÕ¶ZO_­DøŠX™ÆrS‹]]¡Íá„[Ln¡6^¤ @¥SA¾˜•Q¬$5ùЮâ. ¶ãšªiÌÿJŠO`šß¡«ŒåV”¼rKXÈA`nD\à£a#æ!µYö#¸êp|Êõ”¹Ð¤µ¿8I—t08- ^…à–ä¡Ì^Ý  vO8a²÷4Ù»j;|e[°–ƒýöbðýv pøà·ŸIô^B¼¯áªÆÉ-ay= 1Úøü"­¦¸HG´tdÚr€–ª9(æK „¬e”ú¢F¶tÇ,ÕÇÞ±ˆ“eäÊMëžSqqt¡¦´Pi*µr´ìë±Ï5 8 £~vgîØ Ï—çLªŠ ¬†V–j ŸBiÆGÜŸ¥å×L•+o… Áõù¦Oî“ÀÍ5 »ýKè¦u(˜Œ ¾‚‹ãZ[יγg¬õÖºÊzSEY¹ÑÌ §}îÂ@¾X*’‘m¨ý$´ ;Ó :ƒšhPiJ4+v¬ Z^¬Ö•êpØ·¾ÑÐøÖÜ?†g >íÎGû`L—¨+"—Ù{§±‚ëܤ±®4‹ cÀ_·$eMá±²š"PC‘¾Æl®ƒzÒ–Ò¬HLK;<0Ì¢7Tà|Ó÷ú“úA8 F]™x%¨­0Õ²“t­U›Å Œ,3/£4ƒUŠWÿêSº@6ÿ6ïj>êö€sæ7ÒžŸ:¯òÚLNø’9«Mb âq«£VÄéÛ9¯Yââªãf]",©–4Kê,“ʤ¬Ö=Ý µïÔt´¿ß~Ñõó-«®¨6VóÂß}s³î!Í¿4ïWÕc £]nQîþ%Ñÿµq©ºD]Z(R·Ô\">)£¾qùøð‡E5ºüD©ûzêbÕ¾É_Æ*’ò¤j·ã>a;óo$X¤‘˜K‹KÅšë]¹œ#ìÃ9LÃÏ™ãJ]N®rˆ‚aA"E³3T.LÍ÷ÛÂØÜºyìÀàáóyo‹7 §£?cÙoG„¾µ¶q8úêå# œá××k³uVvÀe «X£Ï%9“¤0ªÝ“•’-ÎÄÈšTGR' ”ôý£ý=þ«¥U$=ÛP÷S¾d Êd¬Ô  +Í÷ úoÒÓ5‚úq¾Ã9»Ë§×ùM¢×dÜ%?ÔÊÈþÚlÓÆqwëÅW¡¶†Ð݉ý§á#ø¤uð÷moT Ã0A¯ H Ù½šKF/Æé)ðrͺd¿y°"Z“ûJÄö ÕŒ©ãRï0;ÂÌÍh H§!nqqP=ÈHQp.•ç( ò (;Ù2º»¾Íþa&Íié—aw^xô«G7Á&"°Kñqö\nwŒÊË,PAÌj}[Dg‚>·H™öZJù២ן,âu× ­%¶WyÈžë|ã â}¥£ý&eWzÅ©„Ä (;y¾ì“¿±­´E_\èÊwŽR«•7Òt©®Œ:ÑæE[”c¥¾–Ãëîd›&3Û"æî¢†$"»Ò¨Ð‡€âÞl~Á5›×Ç}%„9œŸ§šnI›]¬°1ÕP¥«ÐT«jC«§æ =yrž¾D/N Pæ$©sÒBvo/&%´ *CmU­ìÄ‘ÖÃÆkòÒ!‰ì9§8ÅþN|æ¸xgŸÇÇŵ¼¦¬±ÊR[eã]=³RÁÔA[‰!Û¥¼¹i‡ R·(6Ùw)árÜ¥”3¾Z£«TÄjãتãô–ÌMÇU÷„ì³øñ4µ| ŒÂ…‚†­ÿßû‚«Çÿ)ÌÊÒR¥–ÏÒJÈrüïÿÛñëo†òÜÛŒ/Ú©÷ĦýNŠ)˜"WD'Æ$ÆÄðM:’¢Žq¡Ìqä1.Ñ,-#z¬6›µ®¹ÝÖfk¯oñ5•ÊÄ;„5t~æ½>SÞï3ͯR©,f l€‰Gr“ †<ÿ}ì(‹‹›å[è—_4~ÎA‡Éq²òX™?ä]©×pÓUVçn3¾f´[i!¬Œa§H+×L}¨|ê~ª÷·S†½ÙUqÁ?Îü_iaí¯ endstream endobj 54 0 obj <> stream xÚÕzxUº¶ÆŽg&…,Jv™¡l–J*)@ ¤‡t§9=îU¶lÙ’eË–¬.uY²-7Ù²eËݱã8§@€’R !› 5,ÈRŽÂäîþgl+À²ìæ>Ïÿß{ÿG~ôŒ¥™ï|õýÞïaœ#8†Ý»qÕŠ¯D?¹~IÔªiSç>Ë~63Å ® n>8‚Y˼÷ûˆ†D<Äá„¿qû>qzûö^ôΙŒÞf|Éy.ŒƒqFs~Ïy†3›3Ÿ³œÅÙÆ‰ç8bŽœ£çØ9ŽÓÊÙË9Â9É9ÃyŸsóÎwœÿÄplÆÇÁ&c3°°ÅØjl3¶KÁ²±L™17Vƒ5a]Øì86€Ç®bŸaß`·ÂÂÂ"Â&„=‘ ˆ%?'ÍNÊMIOOdæ¤'$æüâƒì”¤äÁObSR¦M:mvèbNèbîðÅô©¡‹i¡‹é¡‹gC³B¡Ç§‡Ÿz|Fèñ¡ÇgÌ]Ì ]„Î œ83$gfHÕY¡›g…nžuç«ÐS³BjÌ=>;´úìÐê³C«Ï œ8;$pvHàìÀ9!sBvÍ Iž’<'$yNHòœä9!ÉsB’ç„$Ï Iž’<7$ynHòÜä¹!ÉsC’çΞúÌŒ…™anNBöë2ã²3ŽÊÄdüÇÆ€3)ì©ðiÏsVsÖ¢ôÜÁ‰áÄq8IœNJÕLÎâ$öùççCÎ5šƒé8#9£PZßÃËǹ—Éárîçð8pD©>…3óçEÎÎ"ÎÎ2Î+œ•¬dL0#0J_ fÅl˜s`N¬s¡t.Åʰr̃U`•XVÒÛ‹Õbu˜«Ç0?ÖˆÒ=€5c-X+Ö†µcX'Jÿ=X7ÖƒíÅz±}X¶•ÃAìv˜ÅÖ]RIÅù*ìž°˜°Ì°ºpNøÖðOGX"Ȉãx&~ƒˆ%¾'ï'g×FF<2êÄè‡GwŽY;¦ûûØÌqظ“÷ÖÞ7ò¾7#ã¹sîŸÅãò.>x0Ÿ?šß3~éøw'løÝÜß}ýûÞ‡â¨q”›ºB«è¯á=rîÑ­=þØ{Ø2Ÿ¨˜øÑ—þñÔãóï™ýÄŒ'nNNþüÉô§ˆ§´OZñÌ‚g¾ž"û÷ðG¨>XâÅÊa€'¾Uæ%ÆþS³2Rñ2‰Wùõ îxæ–’W¨•Järf3n+³0ÏfÕIæ8‘¹×ª·k퀴[lV¸…^EÙá˜8À)>×WÃ{á½6[©”ÜN›Öª¥¸gŒÀ`4rxµXyÈæ¶º-¥¤]gÓP(€1”V¿R|ëi”Ùïr;? ~Å@‡ó@y»†ˆMÔ'QÑ8W(€ngƒ%Îðã@j,d\н‹¾G”èÅÈó2©\¹+c“*:¤·é|ðµoÿ9üZ°–çyëäÁS€üdÿìé"B3eõËk—oÙ°u}ô±ˆ¯Q©t hMZ #ƒ¸¾!Â5ýÖ…V+7ÊÑjx¡±ÝC2³ñþþ£¯?ræÍk§m%û‡sLž:ïÂòÌv¿×ë÷åû2(ä£6¤‹Äkl}dÏ7 nÀÅ×—}Áýüûày^ çpÝpìK±,&ÕX™óâÊ\añ*7ʃ“rã(aM(+¹ÿ´Î6- UĂ̧Ÿ¡–µ-©ÇȼÁïi¥/¿>ËBjð„B¡Á`DôÇpÄ×Âp|:óÚ\‹ÛVjuÛHî¥×O‚wÉO'œ;oRì´Œê\¿ÏWÕØšUžNý ø\ (B9r–ÛןçÁê§ñ¸Ã.JŠsó0ŒàöÕ¡@Œ÷ã 7*™&°uÑ7¾<Œ"€ÕdvÒ­w((H\$J\Âàó˜ ™°"‰BòƤA™âð .82âöHbØC Á‡¼º`7aáÕðËpÏf´m€l¨®©÷åÕfg‰óSÎOýŽùâ&¼çëWàHæ^Z‰ï0Ä奥‘0†hR6i›À;àMß‘c6›Ý¨d6­€oËß] v¸’8Ö¬±hMèC-ÐëŒZ’9G¨Ì*åÎJ§«©uoÕ>@Zñ½Ææ¤ò¤òDs,ˆ 5ÏÏ-Pè Àr°¢?ÿÔppÅÁGka*Šï5˜ñçU×¹AÈ…ðŒ8¸aûáÜ٦ƎŠ= ´+ª3IQ–"=§BÜ@ך “´ï®éx…yáIf%3…̨2æYÈÛP«ôi}à=p¼·ë8Éý®¡«dè#aØKp3šZ6Æç­"M ‡ç$.n~G-ómÍB€^äR 3†!( >Ã)þR{¸€Ëèú an…±0„1MÿEŒ9ó³#8õ×0Ò9#gîÀHØU¿3n…£r¤üÁéþð½·æóÝD Á £o7K6ivS˜ vm* Ë„t&ƒÅDµØ“éÉ8³Že@’Yä(¶”Ò„»Ì%v:ø&1Ðïì¥L¦€èíW½Bß^F0W‚ÅiûòÍháúÌUÖ•ž­‡§‘¾ Á=ÔË.ßJ´6ë’h 1ª‘Å·+‰¸4m¥ S1ª8™â÷eúC~6 i™r ®&n8à¨7n>qfrYžY ò4Lfnð`+Q_a÷Rp4~ñ|"3ŠIºøœŒ¤Ýë”›A( fïQ^ìÛðoo©x“ÁÉÞY?F]ó¿øúûp/úZ|íoQ³Äpò²áRQzÅ0µÎñFö^€±§Ïû¸G $y -Þ½€<×µj J08ó|Ãÿ‘à,]†²ë(Ûüf‰mŒÛzA[›µ—|O´…à u1©éêîz ¸M¥ÀMBм*%?ŸqtÎÊgS^Væ5øª«êë¤5Ù”a(¬0y÷8Á=oß°\Gêðí1iaÿòû=7,¬©ûx\é >éÃÚ.‡Ã¿Çñ²ÅY9Õ¹>_uµŸvŧûÖ#¿›ÆD0#™‘Ÿ2x/=Þîl8k±[œ¨~­„Á¦3kAÐÄÊe¢ÄØÜ]€|$×iða#$¿qN¼T4¤ ­¨Vú`F œïÅš®@å@8Ä`!îÅ]6›ë«M_1c™{f0C0ØÌX8¾Nu7¾o²š-ÀJÚ56-…–JÑ(²cvdlëÁÖ=¹Gò»} —4ÕðÞï½qõÏ /ÆK&¦®?ñ§:¨÷¹%‘Gt8p„ûí÷pÏHH$ŠdT‰•Y Y$÷ûÊ]1`ùœ%zýcø@û—0‚Á£–àÜ¿lÉòï¥AUI¹½¼1¿IÞj@F]g•]#]h•·ˆë ƒXž•Õì¯lV`1ZZ£Ñ”¤Ž((“{ªåå-•RdY¹z½^§¤×I¥ÌŠ48ÅV1xÌߨ|,FÄÓ,"…L3‚‘c‡ýÔø1p±Èµu£ù VRËÁ”@ñi²Þæ•GK/\ð­[±¥há|* ˆ¨§³)œùƒÄ† p?ï .à *ˆŸv'͈¸lC4ªîÄ@!̲´ÐÁÑĘûkظ4ŸÿcŽ—!ÙxVJ°ï›ز­"Zt;èÛMDb¶.‹ÊÀ´@.ȱî¡o ¶§¡®¦¤ ¬À-;7‘oW:‹€œ”Jt…HõBrÍ"Ÿ¬B^UT•r(õPÒA­CçÐØI1Ðûꇟ2À,•n¹œ¢ìü‚ÂøÄÝI±)d0_ø »9HŸñ^ b§a<ûÞ:dk  ßÎÚ›iŒ¡4(D:eˆ¬4\CœÝóé—'KWo¦%‘,Ô ©Ü»û^˜eÚCCZŒ­ù¢Þh÷@*ðMÚÕ±…Ñ(®Šs«ë×€•`UœdµñþPFן®Åš>€-¨äŠ‚Q<æ~Ù‹&‚|äCf|Þwã8 ŽšŽ²oÅüŽqðŒh4@ öƒ*x?ûmû¤')ð\1ÃeÆi§xl;£~ßê!a“vêÄÁ—Ѹð=²\©SkÔ«—Ï_½h³V¯Ö5â€EK^uá©­'6œˆBtP:¸Íj±¡é$ǧ(KíNîJêø:‹Úf´!Ï{£¯¼|ÿþžÃ{Y¬K–5hLæ‰ßÆò4z­Z« øq±1ñ»’ôz­nmš• ùeòýñÝ;zw[õèÅ®ÄÎA®‚*µK¸'½3½CgÕZ 6T7À^]]‚Z{C[}‡Íá,1— µíÚ¡…†¦!ÖºZvBÁà:dÝð$$÷帊ZãÚ:’¾Uï@<‘4@“‘-—ïܹ}[âfVöM$ÌN™ÐHT¨ð¼vôõ£û­V‡"3¡w§U畯<´îØúãH§ÁÉhо?ÄòtF»¬=¦ ‘ƒ*q¥¤\Æ7,z :N¯G5K–“ªVÊ€‚ÔÚtvÊm®¬/-íÙ××Õ×üËÈ™®5û2ý¢º_®OkWzŠÁOÖ va¸3Œ–`-Í<º$2c=m4rŽÇUeó”µVt9ZHhÀ«+º$Ë%¨ÝĤ`ÈDõCµ–ˆwñCúˆ@!F•TXZT¦«ÑVl‚£¿h8) ÎâkÝz{C®Zº”Y³‚Y³ŒYW[÷yåsnïÝ[òÁÍ­´ä#ð] ëk™¥”ƒ?¯<±Ð—çØ$ˆoUšÊo¨;ÑÞçW]Y—Pg‰CteoÈ3"g>åÁ—q?ð|òcÂæµ`-9eÁ+“©|oÊä<\"µúiøÚh#š<öZ FâÜÞ3à|šýqû3ž_ýì R fŒàyKŸn=‚‚C]åvîý÷ÄI8Hœ:ëqzÖ¿ON±vÓÁ^¢©ÒZCA? ÞÖ6Ow¥ZRïxëˆOÏ2óÅpSë-∭>®†ÃC‹µt‰4`–1»G˜”‘”®Ø È"\ÈH"|¸ó¨ù|O[{à ¹å×ø8§ªëJ±$Û’åKÐhˆ&·ñ)[l%ö4Û›)#ŠH€`–ÿç(ž./׈|Ãü W)€‹6抪ò’rÄf”Àç‘Õæ²½|÷zA2}»œJd«¨j£†¢™¨²Þ À–â^…Û}áÿÞUÄ^»¡ MšŠÕšù»víܱظ©q.’ZZièÿ˜hݯГk ^ˆM¥HI¡Q Ë ã )€œÍxsµ¥Ž ãqpÚØµ£-ÎåØrǵa»ì+%ø±¾ˆ nødÅgÜo‚¼ÅsX&§ÙWÂ?Ùpò08GÂûêõ‰Ô:°Y¶=Ù`ÐôFÔcä å˜ J£JM3[ÐŒ¤)¥ª¾ÙZQsó³Ÿòâ…U¨Vì\ºP*ÖŠ¹€Ü€+‹JÚ@˜TNƒ“Ýû0Yy¯Pa$¹ŸÿI}îe0‹œ4{ñSÔ40±M|SçµùQò*µ:%­%À¦úM{’ï~WŽv§¾FdQû&âäPº ¦å£  ›˜ðÃ?q[{nÍã ï¢Ö¸é,”q[YjOù3pHµèêÑ$JËÊ®ó¼É Ÿ‚¦ÝM|Ô¬¹Þ7¨¹iÞÐ"8C¸Á‚œX±Iµ õÖ,4úntœF‰}MA'ß&.ÉsJöLâ¿ÎL~yò8ó”Ma¡"2Ù|VwÉ?'…Ñ{I­«Ö^kº}”T&%P‘ éƒQ/j-á«þ„»RŸ™MHõJ“yûF|Gé‘Z~–rðóì ÕÜÕ«ÜÞ»N=ñ`êõû14NgØÁ­†W™j"6UCåâÿpã]ÔVû`iôÕ>¬Jk“6žfÔÌU¨&º[-{©Züg7"ƒ"žÚ%©¿5§Þ(‰<öE0ý n_0âÖFÞ“S‹˜‘I«óƒÅ$3ŽaÖÁ4¸ 1ãUp1QàRf<\Ål¥¸} EA$‘«ÆðÑÛ _†ÏµÜKn³ )ñ)8»jϼ¦õÎå` `îOf–2Sc u2ƒ 0/Ãg !×X<†ròWEÍ:·¯ç.É»+‡,ëòY:—e顃õ°Y‡5UX»(¨Ãk å:IÞÞK å5þËçî2¹ÿ½|SÒ|ë©vì‹ðൠÃÛrtMÇ èéMèù—™õÌø3n¡KqÈwAüÏnQ*))°íÖJD§Í,Kš·[wFú¸nT}qö\ï¾wšÞð~ð.áeÂLrc^ ËÌŽÚ ›Ñ¥¤”@#×id¢üœ¢ìaU†:SS$<‹°ùòK“ƒˆŠ­ß|¶¥½¥í¸•N¼®ÁÆzj|Dl¼6y0žJ@¦nxOF8Û„|µÄ¿OH°¢ˆúÐc´£°´Ô™Û¨6ü$xW];Ç™bI²°T'oˆJ¡ÕêÂß3£ÄÁÓp„ yì3˜÷>ÌûŒk…6LýD{«.–YúlS–>J½®`{ê†ø¬%`)X^·üÕØÃñoªë µ Î@Æ»St)Ô&œ;{pÞÊîÂÏôGãI)Ö^º›¨3£ÛÌpL9äðEp:ë̆=Û[×UD9²,ÙÆ, YEtuX[¨þ3ÏÔG<ƒs7à ·»xÁEÄYð¡´oECœ-ì[Tk“vlYP°ñÔà"ÞíEC2#úà 4xÝyòÀþÞÞ îc€ü_Ä~G_þŽ1à¶çŸULj°‚ õ3î’(r¯ ‚Ç—C(ÓŒw7ècéÛuÐʈ )£ÃóÍfÐH{ˆžvKåÅöÜpžà•x(€O¡\=ÿÊ+Ò©‹ô­X/™ Ë–íÞUãÙÈø—ŠhÈ0kíFÒŒWš²jpœŒºƒãž}>åòâµÉëv-Z=KK*ñÇÀ¤·¤0Œt.£[^lPj(-QÂL€ÜypâQQp:œ·Â(f\Èl¡——³wl× ^-d7‰´Æ¡}ð4¢¨*¨ Z-eõ×?¸ü¸ .o?°¤gµg>X@þÿ¶É*ë >] Í’È@CÖû°å2÷»ãðÏA€ µWÞ8üúÁÌg«º=•¥‡H;áÐYThXåk3TJzMáRÙΘ¥« ™DZs4eI@* ç#N‚£´$•Ñ_}ïƒ#§Aœy€ž¦Fg/"û>ûåeoeðÐÊ c[k"¿; 7^Øp‰û]Sp!ORK46èbhæ0›«ÝH‰¡‰8q$iÕ›3[·¹Hnp_ù¥*ð8°ÅŸìIw§™Ò9ƒÙÍû+ÎýîÔþ˜Õ«ÖÄ­§—à"‹®H¸l¼Ÿ•–ŠZ yçœÈY·`Rq=´kkòÇ×`ßžoü§««½™DL–}/ OÕ¶ªzêþè×Ú™ ¨’pFÄÐV ó°Î”·ÕÁi§—™áp+±‚hnÒÇÑ‚á0ñÌlª€Y0ÒÒg94øº,m(¸B¼3x:2,s’\W a)=áš¿f×.±8O-¤nôÒG ÊJ<ŽGc{cGiE¹ÇUY!÷UÈ]ê25“©ÚÂE(@o‘že饿&@í}+¿\VZИԘìOr(Kd ˆ”©ÄÔ èhHÚ—Ù‘Ù™Ù„¯³©C{IöÖºŠÒÃ=o; Èb•>bb>^ª³kA1(RÈÔ*•Š¿;aKòÎD…R¡”«HÔP‹r „ßÛd>HÕ0‰—hòëâY«B2ˆøæ¸æøæüò¼²ÊÉW;P\v[©­:4€É5p‰7ž¿¸ì}î7°*y}U»Á»äMfª}•Rt™F¯Ñ¨Ù1µä5!6¡ÒkèÁc\=‰&D†KŒoJÉmqyO½æ}¯^Ì_¼fEú&z®VëU´Iå@“­8÷ó“àbAÉ ¤’˜5?g5µ,ô¼­sÛë¤h4Õ«U4H¯L­w¤RWWî†ðÎæ– •rk‘µÈ4¼ƒ*÷[õ#ôJ aº©‹6•8vÇžÃüæîæ=ÍÝ5õÕ~¯dªˆ¸l}ôà¹Df–Úáá|g„’Ö¥‰´Q©TiÕñ[øÑ+¶.Û´’„UD[…ë$Å:ñŽÝÍéð‘ÈA]¸_þ(G^ç‰Lyº^ÒÀ’QêuT—?ê©À—W—e"SdÙÙ þCÚ÷ÚõúÓ¾|_2eÈÏ9@\.nÐýÒ§¿áÐÿ%ù>ìùBŸ’U7rõ¸}p4«t5ÑÒ„XX¬]¨X¤Ü”?u(2›¢¤ÚŒüQGÖT ³‹Eù;;½Ô› þt鑪÷ìWÀq˜.S¥ßAÞÀýÎ"ͼFpób¥šuÿ4(¬î_š¼&qði¤Ç|ƒÛ×ÌêPC46!êLj! N®L’Æ )˽D\¢çMÚ_u¦x“ËSÆwMÝ3µk*š-,*›ÜŸºµÌZ8Çïú¸ó“®ìåÍcbþÂçöÅ$VJ*«‹pH—½>k?Jû‰ —ieÛl7¾•ál…Øn¶bZÞ“î„w¨íý›ªBk7 œ&'¢Á†q Íò;ö@»Æí¿•¤„1÷0qð¢£Â1T%ÿMç%wƒ!¥O~gi#Uw‚s' ëk´)4ó'0ìøÍh³­vc>ã >áÃq¨¸ÞÄK š¦Æ,öXj5xªDdˆ¬(΋jc_ïãá=_þGð9ˆ»Œ¥×ƒâ¸äÛ¬f´<ÝK±MQ#n¹mIß‘Á=¢2ÔLËÈ£ï~ãf;Ã[@ÝÙÿ8êe®âÕ£Gm"õ4·³¹VÁÌD4ÂÜazµÖW]Ûbkd3Þ`Í—ÐL?²5’T=ÉæèYxAmuÔðnØ£hâªJ!bSmûiØOÔX+¨f¼ô(J×ÛDf‘I4ÈkfF I2»¼Á[¬:8Ÿ—ï$ú]Ú9³qYÃòÆe­óø•C”  ?[S Þ,Xð ÈŽBwµ¥‚­r¯¬*7»  gÛ~Autžox> ?ã×¾ê½~EEúˆ™ùxc•8›JC±^)Z“µV´Vº“¯Sê”z%êvª¹OQŸu*óTö€Î©cÙ×ܼTÍBÚݸ“Ð!ÁÚ?€ª·¡êJ8lf@7±§Á°Ž62;¥-;*Áxæ¾)ˆáÌ=ÿñŒ¤÷‚Æšú&ò§ÒBÙ³ee@díú©þˆúŒF ¢ûpì_oÂqpÄTT$\:ìÈ—¦áq>óÚm%ÏE\íƒãnR{ÀTGɈ­›â©—Áæ ²Ó:±ÂàA“‘§™»í‘g¹kÛÞ>çÞͨ¾>ÈŒ™Ëžµ ñµÁ#áÁzª`+ÉMU"_zËîÖÝm1m ûC–CéRcø;×ï\0‹ ó"/!)®BìÉ_W[YSY[Y[åu¹% ¤B⑸äUR Ò\¥ÌˆnßéU›´NÔ" ä4碡t²›)»ÅÚÒÍï=Ú7ð ³HBxu%…(Äi É‘Z©,Ö£åvÇvät¬F+°‚Êw…‰¼S©wHñ¿B†8 kj–þKî‹­Œho4î ™ãD¶F–I¡a‘ŸDhHdvž­•†§ˆöÇñŸ±øb Üö‹Õˈ¶&C,½„@“Ô%mˆ9¦Ü‚ƒÖ}5$óàЭ&c†ßØ:Â?°÷Y“5[7©úÛ©ÓD·ßrhpÝð‡__s7±áþa«ýCVLjt›(ñ­¢_7ì;w½Fd«‹„óž«*óÑð-¢Ãk?~W· ëð ×ÿ =‚7QQ¿®©XâÈü§Þÿ¿¬{D3Ôg{1e0ùrøo‚Y½M†&˜D¬D…¢QHì}¦½u5m`yqÊþå3á|–8ȶ* ‚" ‚ŸàÇßNZA+ Íêµi¹½ôжÄÏûoÒå+¿•• ÄYëgÝh¨º4³{± ±yx>ÜM_\âÄ)´„ŠÐn‹IÜ¡.4"†CnZ F°$¨¹A¿›fŽ ‘:Vdjê±2Û›4l$ÚÝ¥oßiÌ¿TéÿBCM«¸.ߣoÓ}‘ðòeî%xfóÀsâéÓR‹ Å ÕøkB›è¸¡D_ŠþÕhuhÆØuxÓ¾<öWzu,ú}9pÔ/ÁqÌCtHReJµz­Vc$ h2‘ŠÐdbPªéá˜Î'€š=#mx©ÉZk+©ßwØßÈë_’/4Jinß lÚ Èܵ‘Þª³Ò.à°±ç@—zAcÒÐ ZÊ›KôË•¾ÂaWi¼ˆéw™ÝâÀùð†ÈοHÄP’Ãl¯„È„蔃„Ôw·ƒ!Î3÷ÀGa8q ±b&ÅŒ§ÓfK1¨õ ?ÞÈë!ÀÙ²K—Ú*– °tIëíqÖ( éç-Ù!.ÊÑä€y`Ë@ñUã.4Áö‚¾;sf¢A[3y…"‰$?7fÓ¶—–önöyÙÀC·§ÆUÚÔÝÞíïq:Mö2@¾…jgŠâ2õ[™¿†‹8b&ó¸ú‰ù?¤ áÄ Þð±ø¢©¦gßrH÷â5nm2=Vâ .ðÀLsy=ÎìrÔ¨p÷KcF:ÆŒ2ýõ¨Ã£©6Š$#¿ÿÿ`'€y endstream endobj 56 0 obj <> stream xÚ¥Vypå_Y޲ Æ¡ ¹-»N !!—„@È“Ð&i’ær8¶X²eÙ’|È:,i¥·«û°dY²ä[¶c'&‡cn.§áÈph¸ ¥S¦™OκÓ~v…íÐéûv¤Ý÷ö÷Þû½ßûDj*!Ò·íÚ±qUöÜ윜u‹²ÆÿYVÂÛoôŒ&%E$-HÞ›’¤„É{R©«ëSÿ‘–r/A¦ÿ[âÆ´qûÕãölnß~'‘*Uµ•õð‚¬¬‡²åeEÑBeæì¼9™‹–.]2/󡬬¥™«J¥Š¢¼\YfN®²PZš«Ä?žËÜ*Ï+’*5™³—*•e.\¨R©ä–V,+,Ÿ3/SU¤,ÌÜ"­*ª¤ù™kå2eæS¹¥ÒÌ›ØܼeËKË*•REfŽ<_ªa´“,'²‰5Âí‚ü”¢I1¸ ‰û‰YÄÄlb±„x„XC¬%ž$ÖˆDñ±‰¸+…©Ä ¢˜¬M™/œ*|'õ½I¹¢¹¢+“×LþŒTO!¦\ºþ¶iS’L:ê‚ë‚«×…hÛ°¸³¢U&«¨ÉZ+:;[[;)ü”ÿ} Zy]€ÖÅ„h/+~Mq8¿X¥—EË{¨4:|^;Dz,,k«£aUá¦âb¬À N‹Óÿþ»h •>ڜߒì >L"áè¤û' `têœc/¡ DëÆ.@ê  §)ØŒñ¬d ›º³ :¯ÁOÙƒF7™>º§21:?!xésá(;ºAl·º 6›N·f¹ÄÜý6/’¯à+ùr¾–_Цò4ŸþÞüâƒðç`'}z°R&0[­FƒL¹zíïÖnÝX½ÈEÓ_FY4œiA‹ÿ‚¦œ¿ôåÉOüë¹åÈgÏ<·ìÏè¾®\&·‰2ƒÕj2.›Í  ÈÇ uÓ`¡ó¤+&>Œæ}jòD‡¬è>þ7°ŸNOÖñ¹±È'ɲšùisL0| ]¼&L “÷‹¯Š¢¸a~=TÓˆZÈѼä dx#áP 8 "š½}!Ô’ÊæúH{gìÐàîø~ª6jJg›ª}'¹V¤¾¥Æ¯‰VŽÑš«³v@†롺yÐîíƒ×Ôå²Jéžc/P§`à\ó¡î qt;‹7%úúfçîþTðþÈÑ!ê$ŽÖ5)ËÊÊËÔÁêÖxW¼‹Z1–&tçëðDALÎã%ý»æKù™½8¬é,çlêør «O\Jh¨j¨²èå{x²fŸ¾\[ Uä³½…C_ö£™Þïº Œ¹V³±ø©X—|qÚ\ÁøyÜž…¸d¾“ö TÚkHvA˜œŽaEêÂÊRe©*Xïèhï øÝ_"V¯xfËV0A-h¼]n\þ(Ù¤‹”)dUò*‡¨7à‹á¶o®%S$Î(ñÂ9“{p×Ì-·°{ñóDÚΞ?d°Ù’‹7 £³Tß$5ù,0Aktôõ³_ÑÀ-f+á c9f¶Îš2›Ÿ9ö¦eb‹g(£f/VÝ×pz£W[/óA ¬Ã;ÑÂè­õÖzБ›ò^¦º £)ÖßvÌêÇ\W=¡Ü¹HµÖßGCØw49˜>xucçb¢¹»;Þ:4"¼ DþŸHLMbí ±ãxbwŽ1ŒÎÚ5[Žž z -îk>8ûïó©Þœd)tñ|²Ng ]ÊÉ£ÓFB¯?9'fjMJ|Ñ !|Llö¸£,8áj‹}&qÅ\1gÜöt²ŽPbøó¯€<î-(¦AÑ 7–ÊyR¢ZaQŠÀœ1ážW›§;xºÍò¶7£4$ò¨¿è [ry‘j»¡Â‚wùìÁ˜~³ƒÒ6NœŸJGõdñÖ§œÎð”‚Óy}ß@6õøÓû»'Àë55Eu›Áòà£~mñ÷à+cÉl¿¿•ÆD|®255uI4mŠ;m*›v[bêåÛÚ\iièê]ÿÆ&‹õ endstream endobj 58 0 obj <> stream xÚ­ywtTåÖþ™L2çH‰áh"x& JC!€4齦7ÒÛBÊd’™Ù3“F)“I&…IH!4PEA¸€€ñ‚pEÜ'¼¹~ß; ˆ¿uýüãû}keµròžwïý콟]"aìí‰DÒ{¶ûŒysWŽ˜±`éh7Û‹ñ¾ÄøTÝ‘æ ögÄñu;QŠ¯Ú¿Î0’ô¾ôÉüþ²íùMÛóMúp­pbì%N™¨us;ÊÍmÌŒˆÈ„èA±®C}‡¹Žž4iâH×1nn“\ÝÃü£7úz‡».ðŽ ò󎥿„º.‹ðÝè›à:trPllä{ï¼7Ê;,fTDtàÃFºÆmŒ r]êã½ÉßÏuVDx¬ëBï0×.Gu=gD„E*cý£]DøùG‡S]{3ƒ˜¡’R·SwûÙÌ\v©Ã:;o.¤WU<œ‰c^bz0½˜ÞŒ#ó2Ó—qbäL?†g^a^eœæ5¦?#Ð;Þ`3o2o1C™áÌf$ó63Šy‡qcF3c™qÌxf3‘y—™Ìld>`¦33˜™Ì‡Ì,f63‡™ËÌcæ3 ˜…Ì"f1³„YÊ,c–3+˜•Ì*f5³–™aÇH{f›ä-Išä¦Ý0»h;µ]µT! Þ°Oµ¿ì “ maû²õìMΕ3¿4襪=z¤öTô îùY¯ˆ^'z¯ê}ÍñmÇ—÷qì“Òçq_?§WœÆ9uº%WõëÑ/ºßñÁüùWŽ¿êþj¡óHg—.µ¯õx­¸ÿ«ýÕÞ°eÀí× Œ+jÅv°ŠVÌ2©ÌNOÎbàYùQ.æÉÖCs„P¶QÄ`±Ô¶ôleç¨`ŸBü T;ȯgNŸe)ñpƒˆdÙ "›zíï¾Å+,ZyŒ²û_í¿$l…Z¨KKËÚ¼¢ !?©LÍ9ŠQQ¹ Û>qjÄ^Jó%ÛCþ;¾-ÞæOÅìó JˆŒŠ*‹lLPR›«7èõzà œ¥€Œó¤¦‚4\FNVNáͯ°‡€+_ùß}è(:cåÓe&ÉO'¥x‹dð`Cbé‹N!¸ðmÀé;q:¾Œ}‹‹ÀF./˨¶ÀèÙ‹‰|5±K%R˜S IïcÄáyùö¼àr³yŠwãfzyy¸ªÂÞËÑa¾<þó-À©³²Ô Ѐ¶"áÇ¡'ÈX þ@¦™¤qJéVV•+ÀÝ/?Aùa´+B)Üâ;Êß­Ä}­¸ß$Z¥âÛ˜Ècƒ¬¤L¦xHVl”•@E\Ä' ¤‘4²ÉñW% ¤¿É’!Þd‚ŠÁ·“]î¨tº/QOˆè©çÏÄìöýÏR(Ê-È7œõz]²>ŠXè¹^­Öé « Ë¢k×¥-:))Är)Öã"þ$)_ÂÒ»á‰äö).?Â×ÇT‡‡ÇÄ„‡WÇÔ×WW×Sð5Js‡³Y²ë&æß”Š^x‘‡¯3¿º´á‡I¥Þ°¦GùŒ ™•9Þ‡iÙ£wOÝóÞŸƒp¾ªÜû}ùœ«p#ä"ï‹- ?¨NÁ=øÎÀÙü£ØóòV 4ÂÙ„Š¡Ë`*̇i0[õQÒÈ¥a` Bš-Ö½Ô;‘—¤x £_ †XaÁGc!¸PÖD¯j¯á:·±šÔÑBH¨¬Éø-´¶~ M4ÜCØÑšÂ…íš+øøñÏV§CÑó»h EO~…òÝP8uº lô×Ä‘8¸¿3fÙ!0–5í®I¨ ÒmÞÕU}~´å$pßíyo’Þ_3yù²œ;«Tô¯1œü±ÈÊêpºC´,3,ÃsKRFú\Pvi¯¬»€®Â?fqjCû ¿àû÷¦>’÷àcþFíÉóžcxkꢩÁæøz«É\h=$ Öƒg‹›Û}L9Z©Ú%Qžaë6j¢uéºm¤ë2t°…“wªTyP&ì•Ýh™=Œ ˜î©ð‚ieAŸ4eZͰ“kŽ4…Ç„${ºÝŸ‹tüî»_*nÌ¿úFe7¾øšUô¦¸BÆIü86P«r6…ÊvÛ¡­íì¦Pnbݵ…ÍŠoZ‡ˆë(ì¹›…4šé©äTçFçP-”P42Ôˆ/9tŽv?â|3¾zÓéÐOë¬Gþ›¸7ðØsÒCÂëÀks`‡«X“º1£8|ùüwÅ¹šœ …Ž¢š©‰K[7|aCÞúÊt£–¾ã¶@úf9È&@z‰cvnaiËÑëЖ ù ¥?XÃÉŸB,ŠñŽñ ˆÚÓaé‘ÄOŒ:£®¸Æ2Kuu¢%89(cÃøsÃÑ^!ÿ ¹_~@¹¢KgqPÕÍïZ©£î¢ß½ywåèŒ×ùjs±Oóa¡ÚÔæ\’/x„V'™K·oÝuÊóãwI?ÒŸð$J!JLÈͼÒïÿE¿”ùHyçlX·ŽÃžä2?ÂN©·%€¯¡œ»Úðð.ÍÚý`]P«a-¬ƒ5‰a‹6dÆv‡O¥øùÉqË÷÷¤b¤ø„ßj#·JŽdɈ#h‹³*¸hY0ñq°ÈŒ¥[Oåå^…b ¥¯Lµy2‘(ƒG“þÁDoRè<öï‡}ÂaŽåÍ®*¹½÷³îÅ/N`µúPì^¬Ù{Hþ'Šø Û³v@÷éçm.žY5C€¥~ëqæ$þ-Ûá,woÌ ·!ï¹ ÁàѶ¾0µ%Ú’ÈÉ- ¿ †r™ó¾¿ù›Íª}þmñ•› >jå†xóøò”ºøa°ÐÅ}ÚªIãg|vS€“ g¾9ЭOó½[Uâ`›æÝC¿»4p¤xaIÊ–‰°Â¹ƒÛ›__f٦ܖæ7ç¨Ï7È£#Àê4öË1ÂrX›àåáãë Ó8Ò÷ŸÃÐ^ÿö)ìn«:É‘>ð›a„žNhC`ã«•-µ‡v7Q‡4n,ó( Éž¸w7+tQ$F²MV~´v"‘*¾KãTœ;—¸oß¹A^:íB«eW ª@Eg5+L™å!&T C—»wþ¥€o']&Ò"n¹Æ“¾²õÚ¼FÖàbö§¶Qsf®š4˜" ´v¼mu:þH i¢Ì}ÿ8~Ï_œ@FãBœø#*+€¼A ÖmI'o¸N"à’Õ;ð°Bþ3¶ãªŸ (;n&ò–!4%À•‚±R[Ø2ÈS YE™l»s@óêC#€“ß'‹Èx2–xQùÙ`íX%(Üå¥MSùÐjö¹IÏ ²“ádp(.Æ¥¤?Ž&S¤ß¿]ù.‹ÄÝH=”}甇gîY¼u( ™ °`y´l¼*t¸03dÝîáe´?ª]^JœEJ‡ÎSÏ}âØaQZÓLmßìBx &y’x÷4_¬lõ¥Œ¹ò·)p:»+;çsÁÊè–kÃ|'@`¯Á¡ ì]£*@ñ+?@ì‰<-bYÛ„‡)ÜkO ¿Áw£MdÈߢÒ°âèPjÅB2Œ!ÞÄÇ‘±¸T!Oº_×ìø„sÄ?À)*Å_øfcá5¡Æ* ÒL¿ÉD©a¯ŸyC£š,DÙz€k°s×µ® Ь¡…ËQ,PšO¢½¸É*Ùö8ì¶áPþ5ËV j˜ '¹ö¢í5ͦåÆdO÷ ‹î(~‹ç /ëó)ëîàÄÅìî8MQðÔúëÖ{*¼™ýR‚(’å/4‹yœƒîùùG_×»XÙ(MD.…ô ¶U— i°yË–ô r–´;ã¶ÙPxE¨¶ÙåþþÓºìú(£v]‚;/wÙÃ~`+È8ƒ¥†Î%•¹i[S Õ%Ìâhn7Ùr»igWn³+`SvØ^d4È|M¢Ð¥(~c‘Š×°–©ÞL&}ÉLà&uG”¸Ý%ß VY Æ |ü¦üµJb¹ÌñéÐg¦»Ö‰Õ×¥¨îƧ™5@k™òGúkØHX?ئ˜þ ¡±ñ Öf;Ô*Äf=‹êÛå¤ä¤€K!ó³ Q×ÑÛYßyAöÜøã—°k×ÐòÂx±ú9pdŠ, @—‘@":O9wÑf·7êÄIuRLêçéôñT¥BëeÛÀ¤Û¦«ÒèuÏuVüjelN¦^—­Gv>pÞšª×åWy ñ [ ÑpÒ­Õ¯5ØbÁúHEçT–„²¦cb„f•ç#i‡?ÞãÑ‹Œ ¼5Ì&o“qćü(↳pŽÀ±è!oÈ?ùäµb á[_ÞüߘI¶’ròúÄwݱ³OÛØèx$Å8<ÇãöBæúÇþ“¼® OþD¹9,㱪›™îÈp, \»CÆRA±J3uÄŒí”ö…Û¨C‡©~¨¡¥5ŸðXÄB™†z0wí³È›³bÞ#CSøÕW?…«ÜDv‹ È¡N³ñõåhþS ç"ËÊÿ] mдqg „˜¾»ýwSoîjÙº\(LQPžOÓe¨g%DÓŽ)ýpòý”¯άm\^AÛ‡vZ-Ü꜎×DÁ/Ϭ¬‘_Ä_Dgžô³.ØæwNºœ?úéUß3y7×C¯5e¹bÈ©Pà†nzÊ.#5h©sX½Ïî14`¤ÇTÀ»G¦_,Ì:œzž¶8÷k3¶gÔTFC07sÍŒ‰B8LÍYypÉQÍ]³® öÆ\ d$(Èz62 i¿ª7ä‚Þhl[rêÖi7­3þ‘6©•­’ŠŽuÒ‰xƒ/i©­ÿRÏYÙP­¯.*l‰!Êv¸]WE9$]£ÖªÉG›œÉ2Ñ .¡\lp©?ÛåšYà¿Î«ûòÏ©q%þ˜ÔùÔ9/>GS e`ÈÉ)áŸuË+#}:Ê+?±§`PyaÚP]XøGÝò¾Ð™‚!Ôšt*ox§3'¦è²µ¹ã²ý$ÔtÉ›MAð2øØÎŸ€J( 4èLîd¼¨¢3FÿòìeÈÎ, ÀõÎÆ4ã–b fäeã$1ÇßëÌí~éÒý–³ ûÆÖ§#[%Ø£UŠùÄÈ·:òA+yý÷$Ö¶™ž Äö8“Ž4+±×%ÛCþ;ZÄe|Mbm É[èä¯ÕÑáŸÓBI¶òþqú³¢gË‘ÌìLÕ»SIEÕ{šÊkkl«™ÿ݇Rµ'UulGO^÷}ðûÈá¾øºŒªª2'Z1Ä\swô½ýf§¶+ëîáÄs-ò°#xû+>Û·Öûp•Ÿ–\W^Æ.‰V«‚³ö帞¥D°+°ÅoךÒu´,ÍZ?7Ì”XSWn¢MmQfã}mÓÁB:7<á7FÀÊ÷Y­ùP3?lÚÆèUàɽ÷ ú´@¥œ…ý­¸ |—ÂŽœ±Ñc­OÓ!޵ÝÄI¹6¾P™U•âf hszrKoÊ“pšØ›Çó,¬reÏçg¬UtÞ·°z}~IíN~p[lÛšK4{{þú#:äÃ~"2Ú²L¯õ›8#)åч¥±¨/,ÝuüX~5ìƒæ¨jÿãRðí¢pM¡þÁ+À«cZ’+ÁHgAGq±Ê‚÷Z,N;nâª{ɶÅKÎãÄmG„­pZ×è£Q‡A UWWc*ÛþåÔ]¾ïPÎî#È“~? ¥­Àk Ø« ` hè|®ÍÒªÃGÍK  -­¸rì¯è²XÙ&ºtYLE•ž£ _Ÿcü\‡:XÙÓó*äÅ_ÿl? eÛ½jVP6ì1hvå?E›Õg`ßK‡•öÄ›…ЪÃÖy(½lÆÕÄìŒÚ­9»¡Åpª~_¥ugãQh‚¶$«Ga"çžV‰ÓÍNu71íl×fÆsø\v˲¸G¤¿Ÿ‚¤m²íÍÌF¨üiÅÚ¨pï &}Ôæ×G÷¡´¢ Ýi³Y­M<¶ÀðÝÛö1œ…fšS'»·¬ãnå›%höÞ·Rœ!Îà‘cÿùñÇ{#lƒm©Y )ÍÅ–ÆÕÖo3U·4®üpÂÊaÿŸê.ýC]ëh}±ÁË(³Ú’“øTáÒ“·ªªœêÚã.ãôËMíž'å¿©0§ñãàa•jõ Û,ùEUu­À} Cb© IŠNOð¥ s~Ïg½püÌéÂK’ÌþÕ¹UT¼n;‡ËX¸ ÖÐæä²`Ó˜ž‹ý9|ôçÀ´ æÔ­mØû‰Óå'ž•ßÇÅ……fØG«÷Öî?PÙ {a²Æ«Æ –€? ¥§ÒÃ3|mÛ×NVZi=]Ú¢-ÏJÑZŠzñgŸEÁ…<µ§B~½3è¹I;ô톚ÚÃÝãJ·é“Ù­lÎæ¶_½¨OÃ"ö ùƒ)àí§¤õi1lýáƒõ‡»øéXâ@z8Ñ]á þ¦ÈÝ´év¢bõ3m†[h›Ñ]&®‹}>åÉìÿYºxBÉú»9ȤÔùœ~ßFcƒ†“WHßo!G?»÷˜ë9#†òd ! ʘ”äÈõÀM_x‡ÒxÏó7/}Ý6n%¼ÿs¯?9ûä¶ü ¾ßðhÇÅ/ß÷"þŠŽG±?µÝùʶ&ƒN£‹K…(.¢2É\n)jh­÷äW¦Càœd/j¬ 2‹*œ-Ñc‚%öcùôÕ¼9ëÆf˜Á­ò"L„ÀñßhŠuÙ[ž7öÎÝ}èõ*¦¼b¯÷>]%…žÝÿÅ?p$l{jQpƒ_¾w> ªe…sŠá$×T³û¶€v3ÚªOÛJÕë?~îž>2iaLIÕdmIËÒø×ù@…ÑÑÎ2•FÔ*9ù†¨:õ?’©Öδv1a„ß5I~=‡¯Y¤è.æñ +yçGËt“Â\‡eqÊoH=K^¾ŸÚ|¡îÂáDôrÖ=Ì?`|W&‚L:PÅ—[³óÍPÊÕÄ—ÆÆ)SÂ<Ú §a÷‰êœ£Ò,Î(ÃðÂ\³Œø±Öçzš·öêuÎÔ«·ÐÃ~¢©×Kx»ßÉôò³ endstream endobj 60 0 obj <> stream xÚÝ—‰wTu–ÇS VýÛ…¢´æû=Dô8:,ÒÀ¤EPE!@ {H [%©Tjß^­·ÖW{UjIª²'•°!e‹ˆ‚" .Ø `÷ØÍ9œ3íñÕô›çW ÑžùfNóÎMåWU¿{÷~¿Ÿ'gÖ¬‡ópÑŽ· ×-úýú­—,^µ<ûÞ?gžËÉ<Ÿ›ù§<â›M³~z 7óجçØO¿Oú·ïûuNGõHöYøPö™ÿ0~æü?øGçæ8œÙüÇŸz~Åš[vUÖ·©Íîp²g⃲êÚÚ%‹/]y/øíò™à·÷‚‹g‚f‚™5+~^³b&˜ùž«î+g>¾rÉL°t&X6Ì|óª™Å«fþµjÅâç—½ÒXß$n­jž¿¹±²ª¹aþÆÖ²ºÚŠÿõ.NyvuNmNçBÎMÎw9ÿ:;“Ãæü„k°!gSΛ9Ç̱p¬àØ8vŽƒãä¸8nÍñp¼ÇÏ p‚9åæprrsF9Õ¹ÏæÒ³¶ÎúÏûRÜe\ñÐîï˜Ý=§uÎí~•|ðñ‡{øÉGÍå=øgñ®z¶$‘ùªŸé‘p˜úÌ+‚|.e1é€BZÚâ!.sMJ ~Õ³OŠÙ…5ìmµnM (AJëüQWgúPBî‘×ÉE­åZW`ô›ø…î¡[ß?ì¸è¹ˆþÌ¥í.xOo§ˆå\ß„gÜ?áu]>aëýZ‰A¢Røä½±žÔ‘’DAqÙ\¥š]©zÝ¢1k¬4½[]"ól‚©•$$sù7™]™Í‚Mº}/)Š,F‹Œˆ¢M" ¶nW8p¸÷½·…iœ‘¶Eß,+–K‹Õµ’J¨EU]åï4÷#÷à×á ›Ëîòêl¡ e¡Ô;Wo¤Òù"$¤|½Þdt¼ãxÇx`(–†atP|d+ñ9S+˜ÛÛ¡ ICÊhg²³“àU„¤ÿ¦,V à]ç>w&hëlˬIÌÍì|?ÊÄ™ÿ˜Æöìô»–PP´ÅEvt;#ÞÑØûi@¯LBB%24±{„”HU ͸>êÑ Þ.g×F$ìøèÜ÷×y¹CzêáÕý«[6èZuÍЂøM»Óõ‰OaôFè›s*;;Ö;(B¦:£ñG¥-;vÒn BF¢iÿph4pÀw€î¡{ }¼kp+ñ”Ôì-ÉÖžÇNÕžÃp.1󘻸ö¬Pù»ØGÑK‡–ý•ðs™ðÿÈ< Ì£èZÅ·ó‰/ا†7KØVV¨P|fœôñkútÿ ¡!LELŸËãñЌɞ9þα+äó8Â$¸,N£©¹2Yd M¨kü²!—oÆ=F2pµ”AMB[:"U4µ¶³v‡°¾¹®¥AäNÑÝîÔi¦IÈwùFŒŸà=¹­.| NÚîÇçÄ7Ó'…“1ÉjÔÂm±ˆ —Io£5ru  ‰§Ñf¤6ê5$ˆ¿ŠA3´i›mì#ÿaê´Ú"ÀëðLëAL<~Ýಸq]\!ÛB6tœëÆ•rƒh«ðŸü‚Y"€“vI¾Ë¯µé‰v®¤ÅÖA‚Ûî¶9q‡t»{:o AÚíóüésaÀç÷=Ù>ù¾(gºOn˜Ç|}^ப? W!òƒ/msØ\àD89=¡£ÉbP•¨–í†v0Ç,aDó éîrwM2Z¡ÃçôÛü(¡öʉfЉM²öáæd öá§Ø|vÞ¦Á% ÏÂpz8N3UcÒ˜µ5ì|¡Ye‘Ôm»¶•Õw_ aÔÐ3ÿü0óè×€Žuì#ñF¯…é’™L0´„óÝ%¦ãb³Šù‹¢á_gשáwÞøæ$óŒdü/xÛvp š²#kŸVi\ZÇæjÖ½žÿj#ûp㓚2U”¢Çó¿g2yÌ Ì¼k{¾Y„ÇgKMi©Á@LzÄx+ñ0T±R–´gïó$ÍsŒx†=éðdtrüHgl ÜèÄ`éö_&‚3Ö¿S—`šL~§U2÷Ï—Óÿ:s=;|)Ÿbç;Ö >{‡BîUøîà¡;îräÒûõ„…K™M:£±jǺ²MxÛ''Nzß’NpY€®1+̯HþÓ;û‹þu­&\ã…l€'|íü¿4Ú+ªYÀ>oýrZÌîÉÀóçó2Ož¸ª4ŽÂˆÿèÂB“ýešÂ2Saö‰€¤TžœlÇ''˜"!ÝLC kü ¢ ´­&ñk¬OhÖYuf½¤¢´è-@:n1­=£póè—ŸÛ=¶¬wœØ7PN¼ 5+äÛ¦¥ÞFÑfú˜_²sCàÖØUˆâA;%1Èš_©^ /¡uãÅŸ‡`8ÜÛ'Úëõ ¿Ëa ¯ÉŸ‹¹|—ýÿb.‹3jÛB[°Ìõöu÷§¤!I™¤¼ºðlÝiò<|4ÐsÎîrÒ@#—ÉmÀÆf–›´ˆGTö–xì…²€"ý?¥bd‚·Íga;(Œr‹©yñÂ3ÄÐwÛOìÈmÄã[ !vÁZ,M¦®( }¾Gov~¯æ§Þr!ï“S ù-øÁgöhÅfI;´"y@ï‹vwª6,¶³‹V7xû|Ã0€¼<ÓÑ}C{­”°OëI›Á5*Ðå cK¼8(ænUP¯«§7³6¡YkÖ‚ š] 0®>º'ÍBGȶ‡³Ç<¯î ]¢0ï&æòKo$»ÃmH\«¬i¨‹ÔŽ’ÁÄ•®óž.–6÷äXÇp÷©a@ÝF1 ªÍؾ—](¤š´MÖFdæU¦ŠN ~*<áÞóUÏ‹y‰à'ÀÆ>QX´m&‡Á-4Ò– x³ýB'0«…î„§ :Ñxñ@1Q-íõ5Û›Þ”¾)Y¯Xüê>ʬ7ëÉ5¡hvÐn<½F—°¶e6O¡N)s³™IŒw$ÞÁ •ÛZ×mm¦Ì˜T)å¾™Jvôu(ƒ²ZÅþ†ÚDÍ(yÒC‰ÔØ)ÿåȇñ/fêbã:ö{ê\ûCù‘|¾CkUE  R'c½'¯M|yê³@4õÅð2S“NdU±¿šäF¹U†»‘Ÿ€==Õ†/!ðmdš*œÈ“UE Ød&…ºR¾®¢1ÁÒfO¹ºÜɘ¤Ðîv`sÁte×j.ßeœ²¬VPש¤o.}ciÁ­R¯Ð¨ä §™á(â'ÌG¬ ~žÖ¬J8™—…À¢2©Ì*éz¡Ya–ƒUL§!1óŽíNÛô¡X]‡$mf¥¶J¶ïL¦Ç²Í:@÷M2*¡ÝïôƒßÖx•Ø\u2ª¥ùl&µE…Ø-\o¯§ßÙ‡ü¼ñº±¢üVÜ—YP#0¨¥ßHôƒè·Ô®DÔ¨÷êk X¥Ð¢7ë0œ(=šå8Ü݇™UB‡ÇêfÓ™²©aûã%&ˆ1ê묒?ªds°Ž³ÂŸ9êñàÌB`C_ì¹ñ樅jµˆµ¡@ÜÞ(«·¢-â3Ç0L9Fè´o8öÉÐõ«>§Ï᳡ ‰mE$&ÊjøÿCŸ?æEØ58 æµlíæf¶_â·3Eï lÜ`ÕhË!@Ì‚ÛLÁWöÞ\JAi;jã‘Ú~ +ÚÙçl”Ûì&q ‚Ãóß>6£&Š ]ÅRöG¡Qb©åz½ 4V¤åê49iáÉarZQR&Ñð=RBü·‡`Ø<„ ÉåñaCXßbNáŽÚî±Óƒ _èìpEˆñ0A¹RW©©j_»›Íû ÝMçFH'φËîf~-ô§Ý£‡ã‰Áä š{ØÜe«ùùø¦í?³V‚Û%/³,3GÐlË  ÉÂÊÈ`Ç`/AMîNâ‹ »€å°/°ü5¸È«p5=qÎéòxñØÙyÚ@ct“Îd”¶ ËK^¯/´U|ö(éçyÿ4¬aîÌi’Šp=þá¼E‹¾ ´eÖ&8™“̶÷ò2~æ•ûÞö¾ÄF(Û[]:ÝDkAö¤®Æj²Á„ôÙù¥Ðøúw·µc.5¶Ú6°)¡E‡§C‹äA]ˆpr“Nw‡;y†iF?= £Æom= åªrmE1[ˆ­tJämˆzÐÕ}ŠÙ/ì¸|áæç6äæy«D$°¹kÙûa3¶gyoÝ\‚“·<ïãã˜âµv°`vT–7¿Q ÈÈUÛð#'âî8K];|® Ë{† ‰x½ºqû½Ô§k>Å8Ï\øÅvi\S¦ I8 ï§{ŽúJ’5YRø²O7øß ¡¦R†…PÆ(¦Z/b®¸3z‰‰ í^‡|(¬ò)1š‰,z±±¥Uå›6¬]¨R—î#ápðïà1æµ{«­G u@5EÛÙ2Ü«‰±]YöVÁ;´Ãdg'q6v2˜öÂ!t¨¦¿ŠØÕÚ·Xô&Ut.³‡ˆ=ጄÆRçÇ9¹‹Sk×dÅKJIŒò–µ•/bÊxeb÷â]81Ø=–•Ï|/VßD‚™ƒñ`Ñ9Æv0 2½O¸ûö±ýƒ¥Ä+P±TS4ÕXس(èqG‚‡º'ñ¬|ZÜÊz]“¢BU®.§šõøRäØxtÇû€îÞ¹õo—·Ml"µÜfs«®M‰˜y¯ ¨MìCËM¨Bš&Ý<ÇXh²#ê:24 h ³©šÄ#쳈©cÚMs3Õúëš”fv#ϱ;½÷(|¡»Áƒß³$ç˜ LAØ4 -Bì «³L ‘¿œQb¦êS®ðË%~ &QœY’ÈÞK?f&¥ÀÊ+Óì®m/“–¨—n¤’âd*í#­1…O¨V±¯¡¼G”&ÏÁ‰“'=Q{ÂßÑsì½þNƒÌ,5J5{„&…IaÍn¹"µã$­õVä䌵êzbøÙ›ðÉÔi ÃÔ;üãÆì1esƒSGðo§¹}—ÿ±¤6) ì#-‹·]¬{—ük\ð2·a§ýmŦcˆ³+‚  Ü–gï{PÏl¶1­IrÙà³óü/=p?ýÀlÛsîÎ>1‡X¾3O²œrÿ4ï¿Ã4oD endstream endobj 62 0 obj <> stream xÚcd`aa`ddäñ uttôÓvö ²ñMÓ÷ý:ô³‰õ‡4ÃÆ²L?䘈³È200¼‘ùAä]© $˜l„X9J*Ú Œõ Œœó *‹2Ó3J4’5 --ÍuŒ ,sS‹2“ó|K2RsK€œ…àüäÌÔ’J ›Œ’’+}ýòòr½ÄÜb½ü¢t;M…òÌ’ … ÔâÔ¢²Ô·ü¼¿ÄÜT“õ@„s~nAiIj‘‚o~JjQІL B  " ,L Œ , Þ û=~tðýXÞ½æÇê5Ûç3~¯¿ÅüýÜOAÑe=rIÉaÅ:ÝYì˺v]Æñg*{ZG½Ž\FÛ–¾‡Ý;v<êÞ£²&ƒ]§cúy1w¿¿ÿòv ã/ßK^1_÷=Atö¬­kfÏ›‡WŽ‹Å|>ç÷o"?Tø endstream endobj 64 0 obj <> stream xÚ­’]L[eÆÏi+YÅObÍÜéÑÝ&al&pÑL’ØÊF·ƺAG>Bi{z ý„úÉ¿´Ðrh)ƒA±­| ˜1pıé¼Ð³DcÔ ¢Ë"ºKst‹X¸™‹WæMžäý_¼ïïyž?ŠˆDŠ¢ÏÈ>,,,(y;_&+ÌÙÐ%}ë«kmOqÛîU”Û!àp!÷²_)ý-ì@„{~Cï?»¡÷žÛзxýþ"BQLoòdg¿“•½/_­1Ru5µ4±³j±77w&±/;;—8¨"©º*e#!SÒµ¤JIó—⸺ªŽ¤Äε4­ÉÛ³§¹¹9K©Òe©©š÷weÍut-!'u$ÕDV‡Ô4Q¬T‘Ä&zÖ¦æ«U=MR„L]MR‚ ê*AŠÃȤ9Ф!!T*@…Û…+œ;}hKpÒ›qýuyâ;!»¸&Ê6÷ÓÚFJßoŽÆ>Å“o>fœLâN‹³L¯”ÏÔ|ñç%–3í>;Þ »ÛF¿wî\`­­]q)ŒÂcLœ‰÷ÆÇ~–ôDCcp[¨ú´l·2I´´\A< Þn“Xý<> XãTKÁÖaµ©°tî`²2Á­l2YVYúŽÛËC Zu*­ZkˆFFc‰ž$¾›a)./*3XüïXćlÄnjÔPõä4uÿXÁÌ(+¾Ë®K|¡Î D°¥ŠÏJ^“mqô‚׈Œ./..6²ÖKÁêæϱ`K°—ïF,9²7¸ñ‡_ËÌðvúxx¬ËÕÓŠ» ÁM{Ž»$z­Œ˜µBWÁцƒá°7ÔõúýýÐ ¿¼1P˜žœ …—®ÏO_…0„ÜAÛI;(øõ,ÃñÑáK“º©Sx ”VÈå%rê¼ÙŽ¥¯°Y>º–·ÜuGÈ*Øœ _„™ñE|L÷H'ÓÙ5ñÍÜÄdl"˜lú¢þŒtúüY»ÖTàÐXŽJœ&»Š§¦ÛÃøDB¯;8Ù5ýMòè¾ëàNL\»2w°©¡&…N(“©†Ó6­ÛL~E}ùþc‹¤ËQ’$`æv&*…hp˜ù823Ǧ ìûÒ©|üÈkÎÊÚ:
::= * ::=
| * */ static void parse_integer(struct csa *csa) { int j, binary; /* parse the keyword 'general', 'integer', or 'binary' */ if (csa->token == T_GENERAL) binary = 0, scan_token(csa); else if (csa->token == T_INTEGER) binary = 0, scan_token(csa); else if (csa->token == T_BINARY) binary = 1, scan_token(csa); else xassert(csa != csa); /* parse list of variables (may be empty) */ while (csa->token == T_NAME) { /* find the corresponding column */ j = find_col(csa, csa->image); /* change kind of the variable */ glp_set_col_kind(csa->P, j, GLP_IV); /* set bounds for the binary variable */ if (binary) #if 0 /* 07/VIII-2013 */ { set_lower_bound(csa, j, 0.0); set_upper_bound(csa, j, 1.0); } #else { set_lower_bound(csa, j, csa->lb[j] == +DBL_MAX ? 0.0 : csa->lb[j]); set_upper_bound(csa, j, csa->ub[j] == -DBL_MAX ? 1.0 : csa->ub[j]); } #endif scan_token(csa); } return; } int glp_read_lp(glp_prob *P, const glp_cpxcp *parm, const char *fname) { /* read problem data in CPLEX LP format */ glp_cpxcp _parm; struct csa _csa, *csa = &_csa; int ret; xprintf("Reading problem data from '%s'...\n", fname); if (parm == NULL) glp_init_cpxcp(&_parm), parm = &_parm; /* check control parameters */ check_parm("glp_read_lp", parm); /* initialize common storage area */ csa->P = P; csa->parm = parm; csa->fname = fname; csa->fp = NULL; if (setjmp(csa->jump)) { ret = 1; goto done; } csa->count = 0; csa->c = '\n'; csa->token = T_EOF; csa->image[0] = '\0'; csa->imlen = 0; csa->value = 0.0; csa->n_max = 100; csa->ind = xcalloc(1+csa->n_max, sizeof(int)); csa->val = xcalloc(1+csa->n_max, sizeof(double)); csa->flag = xcalloc(1+csa->n_max, sizeof(char)); memset(&csa->flag[1], 0, csa->n_max * sizeof(char)); csa->lb = xcalloc(1+csa->n_max, sizeof(double)); csa->ub = xcalloc(1+csa->n_max, sizeof(double)); #if 1 /* 27/VII-2013 */ csa->lb_warn = csa->ub_warn = 0; #endif /* erase problem object */ glp_erase_prob(P); glp_create_index(P); /* open input CPLEX LP file */ csa->fp = glp_open(fname, "r"); if (csa->fp == NULL) { xprintf("Unable to open '%s' - %s\n", fname, get_err_msg()); ret = 1; goto done; } /* scan very first token */ scan_token(csa); /* parse definition of the objective function */ if (!(csa->token == T_MINIMIZE || csa->token == T_MAXIMIZE)) error(csa, "'minimize' or 'maximize' keyword missing\n"); parse_objective(csa); /* parse constraints section */ if (csa->token != T_SUBJECT_TO) error(csa, "constraints section missing\n"); parse_constraints(csa); /* parse optional bounds section */ if (csa->token == T_BOUNDS) parse_bounds(csa); /* parse optional general, integer, and binary sections */ while (csa->token == T_GENERAL || csa->token == T_INTEGER || csa->token == T_BINARY) parse_integer(csa); /* check for the keyword 'end' */ if (csa->token == T_END) scan_token(csa); else if (csa->token == T_EOF) warning(csa, "keyword 'end' missing\n"); else error(csa, "symbol '%s' in wrong position\n", csa->image); /* nothing must follow the keyword 'end' (except comments) */ if (csa->token != T_EOF) error(csa, "extra symbol(s) detected beyond 'end'\n"); /* set bounds of variables */ { int j, type; double lb, ub; for (j = 1; j <= P->n; j++) { lb = csa->lb[j]; ub = csa->ub[j]; if (lb == +DBL_MAX) lb = 0.0; /* default lb */ if (ub == -DBL_MAX) ub = +DBL_MAX; /* default ub */ if (lb == -DBL_MAX && ub == +DBL_MAX) type = GLP_FR; else if (ub == +DBL_MAX) type = GLP_LO; else if (lb == -DBL_MAX) type = GLP_UP; else if (lb != ub) type = GLP_DB; else type = GLP_FX; glp_set_col_bnds(csa->P, j, type, lb, ub); } } /* print some statistics */ xprintf("%d row%s, %d column%s, %d non-zero%s\n", P->m, P->m == 1 ? "" : "s", P->n, P->n == 1 ? "" : "s", P->nnz, P->nnz == 1 ? "" : "s"); if (glp_get_num_int(P) > 0) { int ni = glp_get_num_int(P); int nb = glp_get_num_bin(P); if (ni == 1) { if (nb == 0) xprintf("One variable is integer\n"); else xprintf("One variable is binary\n"); } else { xprintf("%d integer variables, ", ni); if (nb == 0) xprintf("none"); else if (nb == 1) xprintf("one"); else if (nb == ni) xprintf("all"); else xprintf("%d", nb); xprintf(" of which %s binary\n", nb == 1 ? "is" : "are"); } } xprintf("%d lines were read\n", csa->count); /* problem data has been successfully read */ glp_delete_index(P); glp_sort_matrix(P); ret = 0; done: if (csa->fp != NULL) glp_close(csa->fp); xfree(csa->ind); xfree(csa->val); xfree(csa->flag); xfree(csa->lb); xfree(csa->ub); if (ret != 0) glp_erase_prob(P); return ret; } /*********************************************************************** * NAME * * glp_write_lp - write problem data in CPLEX LP format * * SYNOPSIS * * int glp_write_lp(glp_prob *P, const glp_cpxcp *parm, const char * *fname); * * DESCRIPTION * * The routine glp_write_lp writes problem data in CPLEX LP format to * a text file. * * The parameter parm is a pointer to the structure glp_cpxcp, which * specifies control parameters used by the routine. If parm is NULL, * the routine uses default settings. * * The character string fname specifies a name of the text file to be * written. * * RETURNS * * If the operation was successful, the routine glp_write_lp returns * zero. Otherwise, it prints an error message and returns non-zero. */ #define csa csa1 struct csa { /* common storage area */ glp_prob *P; /* pointer to problem object */ const glp_cpxcp *parm; /* pointer to control parameters */ }; static int check_name(char *name) { /* check if specified name is valid for CPLEX LP format */ if (*name == '.') return 1; if (isdigit((unsigned char)*name)) return 1; for (; *name; name++) { if (!isalnum((unsigned char)*name) && strchr(CHAR_SET, (unsigned char)*name) == NULL) return 1; } return 0; /* name is ok */ } static void adjust_name(char *name) { /* attempt to adjust specified name to make it valid for CPLEX LP format */ for (; *name; name++) { if (*name == ' ') *name = '_'; else if (*name == '-') *name = '~'; else if (*name == '[') *name = '('; else if (*name == ']') *name = ')'; } return; } static char *row_name(struct csa *csa, int i, char rname[255+1]) { /* construct symbolic name of i-th row (constraint) */ const char *name; if (i == 0) name = glp_get_obj_name(csa->P); else name = glp_get_row_name(csa->P, i); if (name == NULL) goto fake; strcpy(rname, name); adjust_name(rname); if (check_name(rname)) goto fake; return rname; fake: if (i == 0) strcpy(rname, "obj"); else sprintf(rname, "r_%d", i); return rname; } static char *col_name(struct csa *csa, int j, char cname[255+1]) { /* construct symbolic name of j-th column (variable) */ const char *name; name = glp_get_col_name(csa->P, j); if (name == NULL) goto fake; strcpy(cname, name); adjust_name(cname); if (check_name(cname)) goto fake; return cname; #if 0 /* 18/I-2018 */ fake: sprintf(cname, "x_%d", j); #else fake: /* construct fake name depending on column's attributes */ { GLPCOL *col = csa->P->col[j]; if (col->type == GLP_FX) { /* fixed column */ sprintf(cname, "s_%d", j); } else if (col->kind == GLP_CV) { /* continuous variable */ sprintf(cname, "x_%d", j); } else if (!(col->lb == 0 && col->ub == 1)) { /* general (non-binary) integer variable */ sprintf(cname, "y_%d", j); } else { /* binary variable */ sprintf(cname, "z_%d", j); } } #endif return cname; } int glp_write_lp(glp_prob *P, const glp_cpxcp *parm, const char *fname) { /* write problem data in CPLEX LP format */ glp_cpxcp _parm; struct csa _csa, *csa = &_csa; glp_file *fp; GLPROW *row; GLPCOL *col; GLPAIJ *aij; int i, j, len, flag, count, ret; char line[1000+1], term[500+1], name[255+1]; xprintf("Writing problem data to '%s'...\n", fname); if (parm == NULL) glp_init_cpxcp(&_parm), parm = &_parm; /* check control parameters */ check_parm("glp_write_lp", parm); /* initialize common storage area */ csa->P = P; csa->parm = parm; /* create output CPLEX LP file */ fp = glp_open(fname, "w"), count = 0; if (fp == NULL) { xprintf("Unable to create '%s' - %s\n", fname, get_err_msg()); ret = 1; goto done; } /* write problem name */ xfprintf(fp, "\\* Problem: %s *\\\n", P->name == NULL ? "Unknown" : P->name), count++; xfprintf(fp, "\n"), count++; /* the problem should contain at least one row and one column */ if (!(P->m > 0 && P->n > 0)) { xprintf("Warning: problem has no rows/columns\n"); xfprintf(fp, "\\* WARNING: PROBLEM HAS NO ROWS/COLUMNS *\\\n"), count++; xfprintf(fp, "\n"), count++; goto skip; } /* write the objective function definition */ if (P->dir == GLP_MIN) xfprintf(fp, "Minimize\n"), count++; else if (P->dir == GLP_MAX) xfprintf(fp, "Maximize\n"), count++; else xassert(P != P); row_name(csa, 0, name); sprintf(line, " %s:", name); len = 0; for (j = 1; j <= P->n; j++) { col = P->col[j]; if (col->coef != 0.0 || col->ptr == NULL) { len++; col_name(csa, j, name); if (col->coef == 0.0) sprintf(term, " + 0 %s", name); /* empty column */ else if (col->coef == +1.0) sprintf(term, " + %s", name); else if (col->coef == -1.0) sprintf(term, " - %s", name); else if (col->coef > 0.0) sprintf(term, " + %.*g %s", DBL_DIG, +col->coef, name); else sprintf(term, " - %.*g %s", DBL_DIG, -col->coef, name); if (strlen(line) + strlen(term) > 72) xfprintf(fp, "%s\n", line), line[0] = '\0', count++; strcat(line, term); } } if (len == 0) { /* empty objective */ sprintf(term, " 0 %s", col_name(csa, 1, name)); strcat(line, term); } xfprintf(fp, "%s\n", line), count++; if (P->c0 != 0.0) xfprintf(fp, "\\* constant term = %.*g *\\\n", DBL_DIG, P->c0), count++; xfprintf(fp, "\n"), count++; /* write the constraints section */ xfprintf(fp, "Subject To\n"), count++; for (i = 1; i <= P->m; i++) { row = P->row[i]; if (row->type == GLP_FR) continue; /* skip free row */ row_name(csa, i, name); sprintf(line, " %s:", name); /* linear form */ for (aij = row->ptr; aij != NULL; aij = aij->r_next) { col_name(csa, aij->col->j, name); if (aij->val == +1.0) sprintf(term, " + %s", name); else if (aij->val == -1.0) sprintf(term, " - %s", name); else if (aij->val > 0.0) sprintf(term, " + %.*g %s", DBL_DIG, +aij->val, name); else sprintf(term, " - %.*g %s", DBL_DIG, -aij->val, name); if (strlen(line) + strlen(term) > 72) xfprintf(fp, "%s\n", line), line[0] = '\0', count++; strcat(line, term); } if (row->type == GLP_DB) { /* double-bounded (ranged) constraint */ sprintf(term, " - ~r_%d", i); if (strlen(line) + strlen(term) > 72) xfprintf(fp, "%s\n", line), line[0] = '\0', count++; strcat(line, term); } else if (row->ptr == NULL) { /* empty constraint */ sprintf(term, " 0 %s", col_name(csa, 1, name)); strcat(line, term); } /* right hand-side */ if (row->type == GLP_LO) sprintf(term, " >= %.*g", DBL_DIG, row->lb); else if (row->type == GLP_UP) sprintf(term, " <= %.*g", DBL_DIG, row->ub); else if (row->type == GLP_DB || row->type == GLP_FX) sprintf(term, " = %.*g", DBL_DIG, row->lb); else xassert(row != row); if (strlen(line) + strlen(term) > 72) xfprintf(fp, "%s\n", line), line[0] = '\0', count++; strcat(line, term); xfprintf(fp, "%s\n", line), count++; } xfprintf(fp, "\n"), count++; /* write the bounds section */ flag = 0; for (i = 1; i <= P->m; i++) { row = P->row[i]; if (row->type != GLP_DB) continue; if (!flag) xfprintf(fp, "Bounds\n"), flag = 1, count++; xfprintf(fp, " 0 <= ~r_%d <= %.*g\n", i, DBL_DIG, row->ub - row->lb), count++; } for (j = 1; j <= P->n; j++) { col = P->col[j]; if (col->type == GLP_LO && col->lb == 0.0) continue; if (!flag) xfprintf(fp, "Bounds\n"), flag = 1, count++; col_name(csa, j, name); if (col->type == GLP_FR) xfprintf(fp, " %s free\n", name), count++; else if (col->type == GLP_LO) xfprintf(fp, " %s >= %.*g\n", name, DBL_DIG, col->lb), count++; else if (col->type == GLP_UP) xfprintf(fp, " -Inf <= %s <= %.*g\n", name, DBL_DIG, col->ub), count++; else if (col->type == GLP_DB) xfprintf(fp, " %.*g <= %s <= %.*g\n", DBL_DIG, col->lb, name, DBL_DIG, col->ub), count++; else if (col->type == GLP_FX) xfprintf(fp, " %s = %.*g\n", name, DBL_DIG, col->lb), count++; else xassert(col != col); } if (flag) xfprintf(fp, "\n"), count++; /* write the integer section */ flag = 0; for (j = 1; j <= P->n; j++) { col = P->col[j]; if (col->kind == GLP_CV) continue; xassert(col->kind == GLP_IV); if (!flag) xfprintf(fp, "Generals\n"), flag = 1, count++; xfprintf(fp, " %s\n", col_name(csa, j, name)), count++; } if (flag) xfprintf(fp, "\n"), count++; skip: /* write the end keyword */ xfprintf(fp, "End\n"), count++; #if 0 /* FIXME */ xfflush(fp); #endif if (glp_ioerr(fp)) { xprintf("Write error on '%s' - %s\n", fname, get_err_msg()); ret = 1; goto done; } /* problem data has been successfully written */ xprintf("%d lines were written\n", count); ret = 0; done: if (fp != NULL) glp_close(fp); return ret; } /* eof */ glpk-5.0/src/api/cpp.c0000644000062000006210000001413113766346220013770 0ustar maomkpasswd/* cpp.c (solve critical path problem) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2010-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "glpk.h" /*********************************************************************** * NAME * * glp_cpp - solve critical path problem * * SYNOPSIS * * double glp_cpp(glp_graph *G, int v_t, int v_es, int v_ls); * * DESCRIPTION * * The routine glp_cpp solves the critical path problem represented in * the form of the project network. * * The parameter G is a pointer to the graph object, which specifies * the project network. This graph must be acyclic. Multiple arcs are * allowed being considered as single arcs. * * The parameter v_t specifies an offset of the field of type double * in the vertex data block, which contains time t[i] >= 0 needed to * perform corresponding job j. If v_t < 0, it is assumed that t[i] = 1 * for all jobs. * * The parameter v_es specifies an offset of the field of type double * in the vertex data block, to which the routine stores earliest start * time for corresponding job. If v_es < 0, this time is not stored. * * The parameter v_ls specifies an offset of the field of type double * in the vertex data block, to which the routine stores latest start * time for corresponding job. If v_ls < 0, this time is not stored. * * RETURNS * * The routine glp_cpp returns the minimal project duration, that is, * minimal time needed to perform all jobs in the project. */ static void sorting(glp_graph *G, int list[]); double glp_cpp(glp_graph *G, int v_t, int v_es, int v_ls) { glp_vertex *v; glp_arc *a; int i, j, k, nv, *list; double temp, total, *t, *es, *ls; if (v_t >= 0 && v_t > G->v_size - (int)sizeof(double)) xerror("glp_cpp: v_t = %d; invalid offset\n", v_t); if (v_es >= 0 && v_es > G->v_size - (int)sizeof(double)) xerror("glp_cpp: v_es = %d; invalid offset\n", v_es); if (v_ls >= 0 && v_ls > G->v_size - (int)sizeof(double)) xerror("glp_cpp: v_ls = %d; invalid offset\n", v_ls); nv = G->nv; if (nv == 0) { total = 0.0; goto done; } /* allocate working arrays */ t = xcalloc(1+nv, sizeof(double)); es = xcalloc(1+nv, sizeof(double)); ls = xcalloc(1+nv, sizeof(double)); list = xcalloc(1+nv, sizeof(int)); /* retrieve job times */ for (i = 1; i <= nv; i++) { v = G->v[i]; if (v_t >= 0) { memcpy(&t[i], (char *)v->data + v_t, sizeof(double)); if (t[i] < 0.0) xerror("glp_cpp: t[%d] = %g; invalid time\n", i, t[i]); } else t[i] = 1.0; } /* perform topological sorting to determine the list of nodes (jobs) such that if list[k] = i and list[kk] = j and there exists arc (i->j), then k < kk */ sorting(G, list); /* FORWARD PASS */ /* determine earliest start times */ for (k = 1; k <= nv; k++) { j = list[k]; es[j] = 0.0; for (a = G->v[j]->in; a != NULL; a = a->h_next) { i = a->tail->i; /* there exists arc (i->j) in the project network */ temp = es[i] + t[i]; if (es[j] < temp) es[j] = temp; } } /* determine the minimal project duration */ total = 0.0; for (i = 1; i <= nv; i++) { temp = es[i] + t[i]; if (total < temp) total = temp; } /* BACKWARD PASS */ /* determine latest start times */ for (k = nv; k >= 1; k--) { i = list[k]; ls[i] = total - t[i]; for (a = G->v[i]->out; a != NULL; a = a->t_next) { j = a->head->i; /* there exists arc (i->j) in the project network */ temp = ls[j] - t[i]; if (ls[i] > temp) ls[i] = temp; } /* avoid possible round-off errors */ if (ls[i] < es[i]) ls[i] = es[i]; } /* store results, if necessary */ if (v_es >= 0) { for (i = 1; i <= nv; i++) { v = G->v[i]; memcpy((char *)v->data + v_es, &es[i], sizeof(double)); } } if (v_ls >= 0) { for (i = 1; i <= nv; i++) { v = G->v[i]; memcpy((char *)v->data + v_ls, &ls[i], sizeof(double)); } } /* free working arrays */ xfree(t); xfree(es); xfree(ls); xfree(list); done: return total; } static void sorting(glp_graph *G, int list[]) { /* perform topological sorting to determine the list of nodes (jobs) such that if list[k] = i and list[kk] = j and there exists arc (i->j), then k < kk */ int i, k, nv, v_size, *num; void **save; nv = G->nv; v_size = G->v_size; save = xcalloc(1+nv, sizeof(void *)); num = xcalloc(1+nv, sizeof(int)); G->v_size = sizeof(int); for (i = 1; i <= nv; i++) { save[i] = G->v[i]->data; G->v[i]->data = &num[i]; list[i] = 0; } if (glp_top_sort(G, 0) != 0) xerror("glp_cpp: project network is not acyclic\n"); G->v_size = v_size; for (i = 1; i <= nv; i++) { G->v[i]->data = save[i]; k = num[i]; xassert(1 <= k && k <= nv); xassert(list[k] == 0); list[k] = i; } xfree(save); xfree(num); return; } /* eof */ glpk-5.0/src/api/cpxbas.c0000644000062000006210000002132713766346220014473 0ustar maomkpasswd/* cpxbas.c (construct Bixby's initial LP basis) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2008-2018 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "prob.h" struct var { /* structural variable */ int j; /* ordinal number */ double q; /* penalty value */ }; static int CDECL fcmp(const void *ptr1, const void *ptr2) { /* this routine is passed to the qsort() function */ struct var *col1 = (void *)ptr1, *col2 = (void *)ptr2; if (col1->q < col2->q) return -1; if (col1->q > col2->q) return +1; return 0; } static int get_column(glp_prob *lp, int j, int ind[], double val[]) { /* Bixby's algorithm assumes that the constraint matrix is scaled such that the maximum absolute value in every non-zero row and column is 1 */ int k, len; double big; len = glp_get_mat_col(lp, j, ind, val); big = 0.0; for (k = 1; k <= len; k++) if (big < fabs(val[k])) big = fabs(val[k]); if (big == 0.0) big = 1.0; for (k = 1; k <= len; k++) val[k] /= big; return len; } static void cpx_basis(glp_prob *lp) { /* main routine */ struct var *C, *C2, *C3, *C4; int m, n, i, j, jk, k, l, ll, t, n2, n3, n4, type, len, *I, *r, *ind; double alpha, gamma, cmax, temp, *v, *val; xprintf("Constructing initial basis...\n"); /* determine the number of rows and columns */ m = glp_get_num_rows(lp); n = glp_get_num_cols(lp); /* allocate working arrays */ C = xcalloc(1+n, sizeof(struct var)); I = xcalloc(1+m, sizeof(int)); r = xcalloc(1+m, sizeof(int)); v = xcalloc(1+m, sizeof(double)); ind = xcalloc(1+m, sizeof(int)); val = xcalloc(1+m, sizeof(double)); /* make all auxiliary variables non-basic */ for (i = 1; i <= m; i++) { if (glp_get_row_type(lp, i) != GLP_DB) glp_set_row_stat(lp, i, GLP_NS); else if (fabs(glp_get_row_lb(lp, i)) <= fabs(glp_get_row_ub(lp, i))) glp_set_row_stat(lp, i, GLP_NL); else glp_set_row_stat(lp, i, GLP_NU); } /* make all structural variables non-basic */ for (j = 1; j <= n; j++) { if (glp_get_col_type(lp, j) != GLP_DB) glp_set_col_stat(lp, j, GLP_NS); else if (fabs(glp_get_col_lb(lp, j)) <= fabs(glp_get_col_ub(lp, j))) glp_set_col_stat(lp, j, GLP_NL); else glp_set_col_stat(lp, j, GLP_NU); } /* C2 is a set of free structural variables */ n2 = 0, C2 = C + 0; for (j = 1; j <= n; j++) { type = glp_get_col_type(lp, j); if (type == GLP_FR) { n2++; C2[n2].j = j; C2[n2].q = 0.0; } } /* C3 is a set of structural variables having excatly one (lower or upper) bound */ n3 = 0, C3 = C2 + n2; for (j = 1; j <= n; j++) { type = glp_get_col_type(lp, j); if (type == GLP_LO) { n3++; C3[n3].j = j; C3[n3].q = + glp_get_col_lb(lp, j); } else if (type == GLP_UP) { n3++; C3[n3].j = j; C3[n3].q = - glp_get_col_ub(lp, j); } } /* C4 is a set of structural variables having both (lower and upper) bounds */ n4 = 0, C4 = C3 + n3; for (j = 1; j <= n; j++) { type = glp_get_col_type(lp, j); if (type == GLP_DB) { n4++; C4[n4].j = j; C4[n4].q = glp_get_col_lb(lp, j) - glp_get_col_ub(lp, j); } } /* compute gamma = max{|c[j]|: 1 <= j <= n} */ gamma = 0.0; for (j = 1; j <= n; j++) { temp = fabs(glp_get_obj_coef(lp, j)); if (gamma < temp) gamma = temp; } /* compute cmax */ cmax = (gamma == 0.0 ? 1.0 : 1000.0 * gamma); /* compute final penalty for all structural variables within sets C2, C3, and C4 */ switch (glp_get_obj_dir(lp)) { case GLP_MIN: temp = +1.0; break; case GLP_MAX: temp = -1.0; break; default: xassert(lp != lp); } for (k = 1; k <= n2+n3+n4; k++) { j = C[k].j; C[k].q += (temp * glp_get_obj_coef(lp, j)) / cmax; } /* sort structural variables within C2, C3, and C4 in ascending order of penalty value */ qsort(C2+1, n2, sizeof(struct var), fcmp); for (k = 1; k < n2; k++) xassert(C2[k].q <= C2[k+1].q); qsort(C3+1, n3, sizeof(struct var), fcmp); for (k = 1; k < n3; k++) xassert(C3[k].q <= C3[k+1].q); qsort(C4+1, n4, sizeof(struct var), fcmp); for (k = 1; k < n4; k++) xassert(C4[k].q <= C4[k+1].q); /*** STEP 1 ***/ for (i = 1; i <= m; i++) { type = glp_get_row_type(lp, i); if (type != GLP_FX) { /* row i is either free or inequality constraint */ glp_set_row_stat(lp, i, GLP_BS); I[i] = 1; r[i] = 1; } else { /* row i is equality constraint */ I[i] = 0; r[i] = 0; } v[i] = +DBL_MAX; } /*** STEP 2 ***/ for (k = 1; k <= n2+n3+n4; k++) { jk = C[k].j; len = get_column(lp, jk, ind, val); /* let alpha = max{|A[l,jk]|: r[l] = 0} and let l' be such that alpha = |A[l',jk]| */ alpha = 0.0, ll = 0; for (t = 1; t <= len; t++) { l = ind[t]; if (r[l] == 0 && alpha < fabs(val[t])) alpha = fabs(val[t]), ll = l; } if (alpha >= 0.99) { /* B := B union {jk} */ glp_set_col_stat(lp, jk, GLP_BS); I[ll] = 1; v[ll] = alpha; /* r[l] := r[l] + 1 for all l such that |A[l,jk]| != 0 */ for (t = 1; t <= len; t++) { l = ind[t]; if (val[t] != 0.0) r[l]++; } /* continue to the next k */ continue; } /* if |A[l,jk]| > 0.01 * v[l] for some l, continue to the next k */ for (t = 1; t <= len; t++) { l = ind[t]; if (fabs(val[t]) > 0.01 * v[l]) break; } if (t <= len) continue; /* otherwise, let alpha = max{|A[l,jk]|: I[l] = 0} and let l' be such that alpha = |A[l',jk]| */ alpha = 0.0, ll = 0; for (t = 1; t <= len; t++) { l = ind[t]; if (I[l] == 0 && alpha < fabs(val[t])) alpha = fabs(val[t]), ll = l; } /* if alpha = 0, continue to the next k */ if (alpha == 0.0) continue; /* B := B union {jk} */ glp_set_col_stat(lp, jk, GLP_BS); I[ll] = 1; v[ll] = alpha; /* r[l] := r[l] + 1 for all l such that |A[l,jk]| != 0 */ for (t = 1; t <= len; t++) { l = ind[t]; if (val[t] != 0.0) r[l]++; } } /*** STEP 3 ***/ /* add an artificial variable (auxiliary variable for equality constraint) to cover each remaining uncovered row */ for (i = 1; i <= m; i++) if (I[i] == 0) glp_set_row_stat(lp, i, GLP_BS); /* free working arrays */ xfree(C); xfree(I); xfree(r); xfree(v); xfree(ind); xfree(val); return; } /*********************************************************************** * NAME * * glp_cpx_basis - construct Bixby's initial LP basis * * SYNOPSIS * * void glp_cpx_basis(glp_prob *lp); * * DESCRIPTION * * The routine glp_cpx_basis constructs an advanced initial basis for * the specified problem object. * * The routine is based on Bixby's algorithm described in the paper: * * Robert E. Bixby. Implementing the Simplex Method: The Initial Basis. * ORSA Journal on Computing, Vol. 4, No. 3, 1992, pp. 267-84. */ void glp_cpx_basis(glp_prob *lp) { if (lp->m == 0 || lp->n == 0) glp_std_basis(lp); else cpx_basis(lp); return; } /* eof */ glpk-5.0/src/api/graph.c0000644000062000006210000003630713766346220014320 0ustar maomkpasswd/* graph.c (basic graph routines) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2009-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "avl.h" #include "dmp.h" #include "env.h" #include "glpk.h" /* CAUTION: DO NOT CHANGE THE LIMITS BELOW */ #define NV_MAX 100000000 /* = 100*10^6 */ /* maximal number of vertices in the graph */ #define NA_MAX 500000000 /* = 500*10^6 */ /* maximal number of arcs in the graph */ /*********************************************************************** * NAME * * glp_create_graph - create graph * * SYNOPSIS * * glp_graph *glp_create_graph(int v_size, int a_size); * * DESCRIPTION * * The routine creates a new graph, which initially is empty, i.e. has * no vertices and arcs. * * The parameter v_size specifies the size of data associated with each * vertex of the graph (0 to 256 bytes). * * The parameter a_size specifies the size of data associated with each * arc of the graph (0 to 256 bytes). * * RETURNS * * The routine returns a pointer to the graph created. */ static void create_graph(glp_graph *G, int v_size, int a_size) { G->pool = dmp_create_pool(); G->name = NULL; G->nv_max = 50; G->nv = G->na = 0; G->v = xcalloc(1+G->nv_max, sizeof(glp_vertex *)); G->index = NULL; G->v_size = v_size; G->a_size = a_size; return; } glp_graph *glp_create_graph(int v_size, int a_size) { glp_graph *G; if (!(0 <= v_size && v_size <= 256)) xerror("glp_create_graph: v_size = %d; invalid size of vertex " "data\n", v_size); if (!(0 <= a_size && a_size <= 256)) xerror("glp_create_graph: a_size = %d; invalid size of arc dat" "a\n", a_size); G = xmalloc(sizeof(glp_graph)); create_graph(G, v_size, a_size); return G; } /*********************************************************************** * NAME * * glp_set_graph_name - assign (change) graph name * * SYNOPSIS * * void glp_set_graph_name(glp_graph *G, const char *name); * * DESCRIPTION * * The routine glp_set_graph_name assigns a symbolic name specified by * the character string name (1 to 255 chars) to the graph. * * If the parameter name is NULL or an empty string, the routine erases * the existing symbolic name of the graph. */ void glp_set_graph_name(glp_graph *G, const char *name) { if (G->name != NULL) { dmp_free_atom(G->pool, G->name, strlen(G->name)+1); G->name = NULL; } if (!(name == NULL || name[0] == '\0')) { int j; for (j = 0; name[j] != '\0'; j++) { if (j == 256) xerror("glp_set_graph_name: graph name too long\n"); if (iscntrl((unsigned char)name[j])) xerror("glp_set_graph_name: graph name contains invalid " "character(s)\n"); } G->name = dmp_get_atom(G->pool, strlen(name)+1); strcpy(G->name, name); } return; } /*********************************************************************** * NAME * * glp_add_vertices - add new vertices to graph * * SYNOPSIS * * int glp_add_vertices(glp_graph *G, int nadd); * * DESCRIPTION * * The routine glp_add_vertices adds nadd vertices to the specified * graph. New vertices are always added to the end of the vertex list, * so ordinal numbers of existing vertices remain unchanged. * * Being added each new vertex is isolated (has no incident arcs). * * RETURNS * * The routine glp_add_vertices returns an ordinal number of the first * new vertex added to the graph. */ int glp_add_vertices(glp_graph *G, int nadd) { int i, nv_new; if (nadd < 1) xerror("glp_add_vertices: nadd = %d; invalid number of vertice" "s\n", nadd); if (nadd > NV_MAX - G->nv) xerror("glp_add_vertices: nadd = %d; too many vertices\n", nadd); /* determine new number of vertices */ nv_new = G->nv + nadd; /* increase the room, if necessary */ if (G->nv_max < nv_new) { glp_vertex **save = G->v; while (G->nv_max < nv_new) { G->nv_max += G->nv_max; xassert(G->nv_max > 0); } G->v = xcalloc(1+G->nv_max, sizeof(glp_vertex *)); memcpy(&G->v[1], &save[1], G->nv * sizeof(glp_vertex *)); xfree(save); } /* add new vertices to the end of the vertex list */ for (i = G->nv+1; i <= nv_new; i++) { glp_vertex *v; G->v[i] = v = dmp_get_atom(G->pool, sizeof(glp_vertex)); v->i = i; v->name = NULL; v->entry = NULL; if (G->v_size == 0) v->data = NULL; else { v->data = dmp_get_atom(G->pool, G->v_size); memset(v->data, 0, G->v_size); } v->temp = NULL; v->in = v->out = NULL; } /* set new number of vertices */ G->nv = nv_new; /* return the ordinal number of the first vertex added */ return nv_new - nadd + 1; } /**********************************************************************/ void glp_set_vertex_name(glp_graph *G, int i, const char *name) { /* assign (change) vertex name */ glp_vertex *v; if (!(1 <= i && i <= G->nv)) xerror("glp_set_vertex_name: i = %d; vertex number out of rang" "e\n", i); v = G->v[i]; if (v->name != NULL) { if (v->entry != NULL) { xassert(G->index != NULL); avl_delete_node(G->index, v->entry); v->entry = NULL; } dmp_free_atom(G->pool, v->name, strlen(v->name)+1); v->name = NULL; } if (!(name == NULL || name[0] == '\0')) { int k; for (k = 0; name[k] != '\0'; k++) { if (k == 256) xerror("glp_set_vertex_name: i = %d; vertex name too lon" "g\n", i); if (iscntrl((unsigned char)name[k])) xerror("glp_set_vertex_name: i = %d; vertex name contain" "s invalid character(s)\n", i); } v->name = dmp_get_atom(G->pool, strlen(name)+1); strcpy(v->name, name); if (G->index != NULL) { xassert(v->entry == NULL); v->entry = avl_insert_node(G->index, v->name); avl_set_node_link(v->entry, v); } } return; } /*********************************************************************** * NAME * * glp_add_arc - add new arc to graph * * SYNOPSIS * * glp_arc *glp_add_arc(glp_graph *G, int i, int j); * * DESCRIPTION * * The routine glp_add_arc adds a new arc to the specified graph. * * The parameters i and j specify the ordinal numbers of, resp., tail * and head vertices of the arc. Note that self-loops and multiple arcs * are allowed. * * RETURNS * * The routine glp_add_arc returns a pointer to the arc added. */ glp_arc *glp_add_arc(glp_graph *G, int i, int j) { glp_arc *a; if (!(1 <= i && i <= G->nv)) xerror("glp_add_arc: i = %d; tail vertex number out of range\n" , i); if (!(1 <= j && j <= G->nv)) xerror("glp_add_arc: j = %d; head vertex number out of range\n" , j); if (G->na == NA_MAX) xerror("glp_add_arc: too many arcs\n"); a = dmp_get_atom(G->pool, sizeof(glp_arc)); a->tail = G->v[i]; a->head = G->v[j]; if (G->a_size == 0) a->data = NULL; else { a->data = dmp_get_atom(G->pool, G->a_size); memset(a->data, 0, G->a_size); } a->temp = NULL; a->t_prev = NULL; a->t_next = G->v[i]->out; if (a->t_next != NULL) a->t_next->t_prev = a; a->h_prev = NULL; a->h_next = G->v[j]->in; if (a->h_next != NULL) a->h_next->h_prev = a; G->v[i]->out = G->v[j]->in = a; G->na++; return a; } /*********************************************************************** * NAME * * glp_del_vertices - delete vertices from graph * * SYNOPSIS * * void glp_del_vertices(glp_graph *G, int ndel, const int num[]); * * DESCRIPTION * * The routine glp_del_vertices deletes vertices along with all * incident arcs from the specified graph. Ordinal numbers of vertices * to be deleted should be placed in locations num[1], ..., num[ndel], * ndel > 0. * * Note that deleting vertices involves changing ordinal numbers of * other vertices remaining in the graph. New ordinal numbers of the * remaining vertices are assigned under the assumption that the * original order of vertices is not changed. */ void glp_del_vertices(glp_graph *G, int ndel, const int num[]) { glp_vertex *v; int i, k, nv_new; /* scan the list of vertices to be deleted */ if (!(1 <= ndel && ndel <= G->nv)) xerror("glp_del_vertices: ndel = %d; invalid number of vertice" "s\n", ndel); for (k = 1; k <= ndel; k++) { /* take the number of vertex to be deleted */ i = num[k]; /* obtain pointer to i-th vertex */ if (!(1 <= i && i <= G->nv)) xerror("glp_del_vertices: num[%d] = %d; vertex number out o" "f range\n", k, i); v = G->v[i]; /* check that the vertex is not marked yet */ if (v->i == 0) xerror("glp_del_vertices: num[%d] = %d; duplicate vertex nu" "mbers not allowed\n", k, i); /* erase symbolic name assigned to the vertex */ glp_set_vertex_name(G, i, NULL); xassert(v->name == NULL); xassert(v->entry == NULL); /* free vertex data, if allocated */ if (v->data != NULL) dmp_free_atom(G->pool, v->data, G->v_size); /* delete all incoming arcs */ while (v->in != NULL) glp_del_arc(G, v->in); /* delete all outgoing arcs */ while (v->out != NULL) glp_del_arc(G, v->out); /* mark the vertex to be deleted */ v->i = 0; } /* delete all marked vertices from the vertex list */ nv_new = 0; for (i = 1; i <= G->nv; i++) { /* obtain pointer to i-th vertex */ v = G->v[i]; /* check if the vertex is marked */ if (v->i == 0) { /* it is marked, delete it */ dmp_free_atom(G->pool, v, sizeof(glp_vertex)); } else { /* it is not marked, keep it */ v->i = ++nv_new; G->v[v->i] = v; } } /* set new number of vertices in the graph */ G->nv = nv_new; return; } /*********************************************************************** * NAME * * glp_del_arc - delete arc from graph * * SYNOPSIS * * void glp_del_arc(glp_graph *G, glp_arc *a); * * DESCRIPTION * * The routine glp_del_arc deletes an arc from the specified graph. * The arc to be deleted must exist. */ void glp_del_arc(glp_graph *G, glp_arc *a) { /* some sanity checks */ xassert(G->na > 0); xassert(1 <= a->tail->i && a->tail->i <= G->nv); xassert(a->tail == G->v[a->tail->i]); xassert(1 <= a->head->i && a->head->i <= G->nv); xassert(a->head == G->v[a->head->i]); /* remove the arc from the list of incoming arcs */ if (a->h_prev == NULL) a->head->in = a->h_next; else a->h_prev->h_next = a->h_next; if (a->h_next == NULL) ; else a->h_next->h_prev = a->h_prev; /* remove the arc from the list of outgoing arcs */ if (a->t_prev == NULL) a->tail->out = a->t_next; else a->t_prev->t_next = a->t_next; if (a->t_next == NULL) ; else a->t_next->t_prev = a->t_prev; /* free arc data, if allocated */ if (a->data != NULL) dmp_free_atom(G->pool, a->data, G->a_size); /* delete the arc from the graph */ dmp_free_atom(G->pool, a, sizeof(glp_arc)); G->na--; return; } /*********************************************************************** * NAME * * glp_erase_graph - erase graph content * * SYNOPSIS * * void glp_erase_graph(glp_graph *G, int v_size, int a_size); * * DESCRIPTION * * The routine glp_erase_graph erases the content of the specified * graph. The effect of this operation is the same as if the graph * would be deleted with the routine glp_delete_graph and then created * anew with the routine glp_create_graph, with exception that the * handle (pointer) to the graph remains valid. */ static void delete_graph(glp_graph *G) { dmp_delete_pool(G->pool); xfree(G->v); if (G->index != NULL) avl_delete_tree(G->index); return; } void glp_erase_graph(glp_graph *G, int v_size, int a_size) { if (!(0 <= v_size && v_size <= 256)) xerror("glp_erase_graph: v_size = %d; invalid size of vertex d" "ata\n", v_size); if (!(0 <= a_size && a_size <= 256)) xerror("glp_erase_graph: a_size = %d; invalid size of arc data" "\n", a_size); delete_graph(G); create_graph(G, v_size, a_size); return; } /*********************************************************************** * NAME * * glp_delete_graph - delete graph * * SYNOPSIS * * void glp_delete_graph(glp_graph *G); * * DESCRIPTION * * The routine glp_delete_graph deletes the specified graph and frees * all the memory allocated to this program object. */ void glp_delete_graph(glp_graph *G) { delete_graph(G); xfree(G); return; } /**********************************************************************/ void glp_create_v_index(glp_graph *G) { /* create vertex name index */ glp_vertex *v; int i; if (G->index == NULL) { G->index = avl_create_tree(avl_strcmp, NULL); for (i = 1; i <= G->nv; i++) { v = G->v[i]; xassert(v->entry == NULL); if (v->name != NULL) { v->entry = avl_insert_node(G->index, v->name); avl_set_node_link(v->entry, v); } } } return; } int glp_find_vertex(glp_graph *G, const char *name) { /* find vertex by its name */ AVLNODE *node; int i = 0; if (G->index == NULL) xerror("glp_find_vertex: vertex name index does not exist\n"); if (!(name == NULL || name[0] == '\0' || strlen(name) > 255)) { node = avl_find_node(G->index, name); if (node != NULL) i = ((glp_vertex *)avl_get_node_link(node))->i; } return i; } void glp_delete_v_index(glp_graph *G) { /* delete vertex name index */ int i; if (G->index != NULL) { avl_delete_tree(G->index), G->index = NULL; for (i = 1; i <= G->nv; i++) G->v[i]->entry = NULL; } return; } /* eof */ glpk-5.0/src/api/gridgen.c0000644000062000006210000000077413766346220014635 0ustar maomkpasswd/* gridgen.c */ #include "env.h" #include "glpk.h" int glp_gridgen(glp_graph *G_, int v_rhs_, int a_cap_, int a_cost_, const int parm[1+14]) { static const char func[] = "glp_gridgen"; xassert(G_ == G_); xassert(v_rhs_ == v_rhs_); xassert(a_cap_ == a_cap_); xassert(a_cost_ == a_cost_); xassert(parm == parm); xerror("%s: sorry, this routine is temporarily disabled due to li" "censing problems\n", func); abort(); return -1; } /* eof */ glpk-5.0/src/api/intfeas1.c0000644000062000006210000002323613766346220014726 0ustar maomkpasswd/* intfeas1.c (solve integer feasibility problem) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2011-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "npp.h" int glp_intfeas1(glp_prob *P, int use_bound, int obj_bound) { /* solve integer feasibility problem */ NPP *npp = NULL; glp_prob *mip = NULL; int *obj_ind = NULL; double *obj_val = NULL; int obj_row = 0; int i, j, k, obj_len, temp, ret; #if 0 /* 04/IV-2016 */ /* check the problem object */ if (P == NULL || P->magic != GLP_PROB_MAGIC) xerror("glp_intfeas1: P = %p; invalid problem object\n", P); #endif if (P->tree != NULL) xerror("glp_intfeas1: operation not allowed\n"); /* integer solution is currently undefined */ P->mip_stat = GLP_UNDEF; P->mip_obj = 0.0; /* check columns (variables) */ for (j = 1; j <= P->n; j++) { GLPCOL *col = P->col[j]; #if 0 /* binarization is not yet implemented */ if (!(col->kind == GLP_IV || col->type == GLP_FX)) { xprintf("glp_intfeas1: column %d: non-integer non-fixed var" "iable not allowed\n", j); #else if (!((col->kind == GLP_IV && col->lb == 0.0 && col->ub == 1.0) || col->type == GLP_FX)) { xprintf("glp_intfeas1: column %d: non-binary non-fixed vari" "able not allowed\n", j); #endif ret = GLP_EDATA; goto done; } temp = (int)col->lb; if ((double)temp != col->lb) { if (col->type == GLP_FX) xprintf("glp_intfeas1: column %d: fixed value %g is non-" "integer or out of range\n", j, col->lb); else xprintf("glp_intfeas1: column %d: lower bound %g is non-" "integer or out of range\n", j, col->lb); ret = GLP_EDATA; goto done; } temp = (int)col->ub; if ((double)temp != col->ub) { xprintf("glp_intfeas1: column %d: upper bound %g is non-int" "eger or out of range\n", j, col->ub); ret = GLP_EDATA; goto done; } if (col->type == GLP_DB && col->lb > col->ub) { xprintf("glp_intfeas1: column %d: lower bound %g is greater" " than upper bound %g\n", j, col->lb, col->ub); ret = GLP_EBOUND; goto done; } } /* check rows (constraints) */ for (i = 1; i <= P->m; i++) { GLPROW *row = P->row[i]; GLPAIJ *aij; for (aij = row->ptr; aij != NULL; aij = aij->r_next) { temp = (int)aij->val; if ((double)temp != aij->val) { xprintf("glp_intfeas1: row = %d, column %d: constraint c" "oefficient %g is non-integer or out of range\n", i, aij->col->j, aij->val); ret = GLP_EDATA; goto done; } } temp = (int)row->lb; if ((double)temp != row->lb) { if (row->type == GLP_FX) xprintf("glp_intfeas1: row = %d: fixed value %g is non-i" "nteger or out of range\n", i, row->lb); else xprintf("glp_intfeas1: row = %d: lower bound %g is non-i" "nteger or out of range\n", i, row->lb); ret = GLP_EDATA; goto done; } temp = (int)row->ub; if ((double)temp != row->ub) { xprintf("glp_intfeas1: row = %d: upper bound %g is non-inte" "ger or out of range\n", i, row->ub); ret = GLP_EDATA; goto done; } if (row->type == GLP_DB && row->lb > row->ub) { xprintf("glp_intfeas1: row %d: lower bound %g is greater th" "an upper bound %g\n", i, row->lb, row->ub); ret = GLP_EBOUND; goto done; } } /* check the objective function */ #if 1 /* 08/I-2017 by cmatraki & mao */ if (!use_bound) { /* skip check if no obj. bound is specified */ goto skip; } #endif temp = (int)P->c0; if ((double)temp != P->c0) { xprintf("glp_intfeas1: objective constant term %g is non-integ" "er or out of range\n", P->c0); ret = GLP_EDATA; goto done; } for (j = 1; j <= P->n; j++) { temp = (int)P->col[j]->coef; if ((double)temp != P->col[j]->coef) { xprintf("glp_intfeas1: column %d: objective coefficient is " "non-integer or out of range\n", j, P->col[j]->coef); ret = GLP_EDATA; goto done; } } #if 1 /* 08/I-2017 by cmatraki & mao */ skip: ; #endif /* save the objective function and set it to zero */ obj_ind = xcalloc(1+P->n, sizeof(int)); obj_val = xcalloc(1+P->n, sizeof(double)); obj_len = 0; obj_ind[0] = 0; obj_val[0] = P->c0; P->c0 = 0.0; for (j = 1; j <= P->n; j++) { if (P->col[j]->coef != 0.0) { obj_len++; obj_ind[obj_len] = j; obj_val[obj_len] = P->col[j]->coef; P->col[j]->coef = 0.0; } } /* add inequality to bound the objective function, if required */ if (!use_bound) xprintf("Will search for ANY feasible solution\n"); else { xprintf("Will search only for solution not worse than %d\n", obj_bound); obj_row = glp_add_rows(P, 1); glp_set_mat_row(P, obj_row, obj_len, obj_ind, obj_val); if (P->dir == GLP_MIN) glp_set_row_bnds(P, obj_row, GLP_UP, 0.0, (double)obj_bound - obj_val[0]); else if (P->dir == GLP_MAX) glp_set_row_bnds(P, obj_row, GLP_LO, (double)obj_bound - obj_val[0], 0.0); else xassert(P != P); } /* create preprocessor workspace */ xprintf("Translating to CNF-SAT...\n"); xprintf("Original problem has %d row%s, %d column%s, and %d non-z" "ero%s\n", P->m, P->m == 1 ? "" : "s", P->n, P->n == 1 ? "" : "s", P->nnz, P->nnz == 1 ? "" : "s"); npp = npp_create_wksp(); /* load the original problem into the preprocessor workspace */ npp_load_prob(npp, P, GLP_OFF, GLP_MIP, GLP_OFF); /* perform translation to SAT-CNF problem instance */ ret = npp_sat_encode_prob(npp); if (ret == 0) ; else if (ret == GLP_ENOPFS) xprintf("PROBLEM HAS NO INTEGER FEASIBLE SOLUTION\n"); else if (ret == GLP_ERANGE) xprintf("glp_intfeas1: translation to SAT-CNF failed because o" "f integer overflow\n"); else xassert(ret != ret); if (ret != 0) goto done; /* build SAT-CNF problem instance and try to solve it */ mip = glp_create_prob(); npp_build_prob(npp, mip); ret = glp_minisat1(mip); /* only integer feasible solution can be postprocessed */ if (!(mip->mip_stat == GLP_OPT || mip->mip_stat == GLP_FEAS)) { P->mip_stat = mip->mip_stat; goto done; } /* postprocess the solution found */ npp_postprocess(npp, mip); /* the transformed problem is no longer needed */ glp_delete_prob(mip), mip = NULL; /* store solution to the original problem object */ npp_unload_sol(npp, P); /* change the solution status to 'integer feasible' */ P->mip_stat = GLP_FEAS; /* check integer feasibility */ for (i = 1; i <= P->m; i++) { GLPROW *row; GLPAIJ *aij; double sum; row = P->row[i]; sum = 0.0; for (aij = row->ptr; aij != NULL; aij = aij->r_next) sum += aij->val * aij->col->mipx; xassert(sum == row->mipx); if (row->type == GLP_LO || row->type == GLP_DB || row->type == GLP_FX) xassert(sum >= row->lb); if (row->type == GLP_UP || row->type == GLP_DB || row->type == GLP_FX) xassert(sum <= row->ub); } /* compute value of the original objective function */ P->mip_obj = obj_val[0]; for (k = 1; k <= obj_len; k++) P->mip_obj += obj_val[k] * P->col[obj_ind[k]]->mipx; xprintf("Objective value = %17.9e\n", P->mip_obj); done: /* delete the transformed problem, if it exists */ if (mip != NULL) glp_delete_prob(mip); /* delete the preprocessor workspace, if it exists */ if (npp != NULL) npp_delete_wksp(npp); /* remove inequality used to bound the objective function */ if (obj_row > 0) { int ind[1+1]; ind[1] = obj_row; glp_del_rows(P, 1, ind); } /* restore the original objective function */ if (obj_ind != NULL) { P->c0 = obj_val[0]; for (k = 1; k <= obj_len; k++) P->col[obj_ind[k]]->coef = obj_val[k]; xfree(obj_ind); xfree(obj_val); } return ret; } /* eof */ glpk-5.0/src/api/maxffalg.c0000644000062000006210000001031213766346220014770 0ustar maomkpasswd/* maxffalg.c (find maximal flow with Ford-Fulkerson algorithm) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2009-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "ffalg.h" #include "glpk.h" int glp_maxflow_ffalg(glp_graph *G, int s, int t, int a_cap, double *sol, int a_x, int v_cut) { /* find maximal flow with Ford-Fulkerson algorithm */ glp_vertex *v; glp_arc *a; int nv, na, i, k, flag, *tail, *head, *cap, *x, ret; char *cut; double temp; if (!(1 <= s && s <= G->nv)) xerror("glp_maxflow_ffalg: s = %d; source node number out of r" "ange\n", s); if (!(1 <= t && t <= G->nv)) xerror("glp_maxflow_ffalg: t = %d: sink node number out of ran" "ge\n", t); if (s == t) xerror("glp_maxflow_ffalg: s = t = %d; source and sink nodes m" "ust be distinct\n", s); if (a_cap >= 0 && a_cap > G->a_size - (int)sizeof(double)) xerror("glp_maxflow_ffalg: a_cap = %d; invalid offset\n", a_cap); if (v_cut >= 0 && v_cut > G->v_size - (int)sizeof(int)) xerror("glp_maxflow_ffalg: v_cut = %d; invalid offset\n", v_cut); /* allocate working arrays */ nv = G->nv; na = G->na; tail = xcalloc(1+na, sizeof(int)); head = xcalloc(1+na, sizeof(int)); cap = xcalloc(1+na, sizeof(int)); x = xcalloc(1+na, sizeof(int)); if (v_cut < 0) cut = NULL; else cut = xcalloc(1+nv, sizeof(char)); /* copy the flow network */ k = 0; for (i = 1; i <= G->nv; i++) { v = G->v[i]; for (a = v->out; a != NULL; a = a->t_next) { k++; tail[k] = a->tail->i; head[k] = a->head->i; if (tail[k] == head[k]) { ret = GLP_EDATA; goto done; } if (a_cap >= 0) memcpy(&temp, (char *)a->data + a_cap, sizeof(double)); else temp = 1.0; if (!(0.0 <= temp && temp <= (double)INT_MAX && temp == floor(temp))) { ret = GLP_EDATA; goto done; } cap[k] = (int)temp; } } xassert(k == na); /* find maximal flow in the flow network */ ffalg(nv, na, tail, head, s, t, cap, x, cut); ret = 0; /* store solution components */ /* (objective function = total flow through the network) */ if (sol != NULL) { temp = 0.0; for (k = 1; k <= na; k++) { if (tail[k] == s) temp += (double)x[k]; else if (head[k] == s) temp -= (double)x[k]; } *sol = temp; } /* (arc flows) */ if (a_x >= 0) { k = 0; for (i = 1; i <= G->nv; i++) { v = G->v[i]; for (a = v->out; a != NULL; a = a->t_next) { temp = (double)x[++k]; memcpy((char *)a->data + a_x, &temp, sizeof(double)); } } } /* (node flags) */ if (v_cut >= 0) { for (i = 1; i <= G->nv; i++) { v = G->v[i]; flag = cut[i]; memcpy((char *)v->data + v_cut, &flag, sizeof(int)); } } done: /* free working arrays */ xfree(tail); xfree(head); xfree(cap); xfree(x); if (cut != NULL) xfree(cut); return ret; } /* eof */ glpk-5.0/src/api/maxflp.c0000644000062000006210000000755113766346220014505 0ustar maomkpasswd/* maxflp.c (convert maximum flow problem to LP) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2009-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "glpk.h" /*********************************************************************** * NAME * * glp_maxflow_lp - convert maximum flow problem to LP * * SYNOPSIS * * void glp_maxflow_lp(glp_prob *lp, glp_graph *G, int names, int s, * int t, int a_cap); * * DESCRIPTION * * The routine glp_maxflow_lp builds an LP problem, which corresponds * to the maximum flow problem on the specified network G. */ void glp_maxflow_lp(glp_prob *lp, glp_graph *G, int names, int s, int t, int a_cap) { glp_vertex *v; glp_arc *a; int i, j, type, ind[1+2]; double cap, val[1+2]; if (!(names == GLP_ON || names == GLP_OFF)) xerror("glp_maxflow_lp: names = %d; invalid parameter\n", names); if (!(1 <= s && s <= G->nv)) xerror("glp_maxflow_lp: s = %d; source node number out of rang" "e\n", s); if (!(1 <= t && t <= G->nv)) xerror("glp_maxflow_lp: t = %d: sink node number out of range " "\n", t); if (s == t) xerror("glp_maxflow_lp: s = t = %d; source and sink nodes must" " be distinct\n", s); if (a_cap >= 0 && a_cap > G->a_size - (int)sizeof(double)) xerror("glp_maxflow_lp: a_cap = %d; invalid offset\n", a_cap); glp_erase_prob(lp); if (names) glp_set_prob_name(lp, G->name); glp_set_obj_dir(lp, GLP_MAX); glp_add_rows(lp, G->nv); for (i = 1; i <= G->nv; i++) { v = G->v[i]; if (names) glp_set_row_name(lp, i, v->name); if (i == s) type = GLP_LO; else if (i == t) type = GLP_UP; else type = GLP_FX; glp_set_row_bnds(lp, i, type, 0.0, 0.0); } if (G->na > 0) glp_add_cols(lp, G->na); for (i = 1, j = 0; i <= G->nv; i++) { v = G->v[i]; for (a = v->out; a != NULL; a = a->t_next) { j++; if (names) { char name[50+1]; sprintf(name, "x[%d,%d]", a->tail->i, a->head->i); xassert(strlen(name) < sizeof(name)); glp_set_col_name(lp, j, name); } if (a->tail->i != a->head->i) { ind[1] = a->tail->i, val[1] = +1.0; ind[2] = a->head->i, val[2] = -1.0; glp_set_mat_col(lp, j, 2, ind, val); } if (a_cap >= 0) memcpy(&cap, (char *)a->data + a_cap, sizeof(double)); else cap = 1.0; if (cap == DBL_MAX) type = GLP_LO; else if (cap != 0.0) type = GLP_DB; else type = GLP_FX; glp_set_col_bnds(lp, j, type, 0.0, cap); if (a->tail->i == s) glp_set_obj_coef(lp, j, +1.0); else if (a->head->i == s) glp_set_obj_coef(lp, j, -1.0); } } xassert(j == G->na); return; } /* eof */ glpk-5.0/src/api/mcflp.c0000644000062000006210000001013713766346220014311 0ustar maomkpasswd/* mcflp.c (convert minimum cost flow problem to LP) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2009-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "glpk.h" /*********************************************************************** * NAME * * glp_mincost_lp - convert minimum cost flow problem to LP * * SYNOPSIS * * void glp_mincost_lp(glp_prob *lp, glp_graph *G, int names, * int v_rhs, int a_low, int a_cap, int a_cost); * * DESCRIPTION * * The routine glp_mincost_lp builds an LP problem, which corresponds * to the minimum cost flow problem on the specified network G. */ void glp_mincost_lp(glp_prob *lp, glp_graph *G, int names, int v_rhs, int a_low, int a_cap, int a_cost) { glp_vertex *v; glp_arc *a; int i, j, type, ind[1+2]; double rhs, low, cap, cost, val[1+2]; if (!(names == GLP_ON || names == GLP_OFF)) xerror("glp_mincost_lp: names = %d; invalid parameter\n", names); if (v_rhs >= 0 && v_rhs > G->v_size - (int)sizeof(double)) xerror("glp_mincost_lp: v_rhs = %d; invalid offset\n", v_rhs); if (a_low >= 0 && a_low > G->a_size - (int)sizeof(double)) xerror("glp_mincost_lp: a_low = %d; invalid offset\n", a_low); if (a_cap >= 0 && a_cap > G->a_size - (int)sizeof(double)) xerror("glp_mincost_lp: a_cap = %d; invalid offset\n", a_cap); if (a_cost >= 0 && a_cost > G->a_size - (int)sizeof(double)) xerror("glp_mincost_lp: a_cost = %d; invalid offset\n", a_cost) ; glp_erase_prob(lp); if (names) glp_set_prob_name(lp, G->name); if (G->nv > 0) glp_add_rows(lp, G->nv); for (i = 1; i <= G->nv; i++) { v = G->v[i]; if (names) glp_set_row_name(lp, i, v->name); if (v_rhs >= 0) memcpy(&rhs, (char *)v->data + v_rhs, sizeof(double)); else rhs = 0.0; glp_set_row_bnds(lp, i, GLP_FX, rhs, rhs); } if (G->na > 0) glp_add_cols(lp, G->na); for (i = 1, j = 0; i <= G->nv; i++) { v = G->v[i]; for (a = v->out; a != NULL; a = a->t_next) { j++; if (names) { char name[50+1]; sprintf(name, "x[%d,%d]", a->tail->i, a->head->i); xassert(strlen(name) < sizeof(name)); glp_set_col_name(lp, j, name); } if (a->tail->i != a->head->i) { ind[1] = a->tail->i, val[1] = +1.0; ind[2] = a->head->i, val[2] = -1.0; glp_set_mat_col(lp, j, 2, ind, val); } if (a_low >= 0) memcpy(&low, (char *)a->data + a_low, sizeof(double)); else low = 0.0; if (a_cap >= 0) memcpy(&cap, (char *)a->data + a_cap, sizeof(double)); else cap = 1.0; if (cap == DBL_MAX) type = GLP_LO; else if (low != cap) type = GLP_DB; else type = GLP_FX; glp_set_col_bnds(lp, j, type, low, cap); if (a_cost >= 0) memcpy(&cost, (char *)a->data + a_cost, sizeof(double)); else cost = 0.0; glp_set_obj_coef(lp, j, cost); } } xassert(j == G->na); return; } /* eof */ glpk-5.0/src/api/mcfokalg.c0000644000062000006210000001634013766346220014775 0ustar maomkpasswd/* mcfokalg.c (find minimum-cost flow with out-of-kilter algorithm) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2009-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "glpk.h" #include "okalg.h" int glp_mincost_okalg(glp_graph *G, int v_rhs, int a_low, int a_cap, int a_cost, double *sol, int a_x, int v_pi) { /* find minimum-cost flow with out-of-kilter algorithm */ glp_vertex *v; glp_arc *a; int nv, na, i, k, s, t, *tail, *head, *low, *cap, *cost, *x, *pi, ret; double sum, temp; if (v_rhs >= 0 && v_rhs > G->v_size - (int)sizeof(double)) xerror("glp_mincost_okalg: v_rhs = %d; invalid offset\n", v_rhs); if (a_low >= 0 && a_low > G->a_size - (int)sizeof(double)) xerror("glp_mincost_okalg: a_low = %d; invalid offset\n", a_low); if (a_cap >= 0 && a_cap > G->a_size - (int)sizeof(double)) xerror("glp_mincost_okalg: a_cap = %d; invalid offset\n", a_cap); if (a_cost >= 0 && a_cost > G->a_size - (int)sizeof(double)) xerror("glp_mincost_okalg: a_cost = %d; invalid offset\n", a_cost); if (a_x >= 0 && a_x > G->a_size - (int)sizeof(double)) xerror("glp_mincost_okalg: a_x = %d; invalid offset\n", a_x); if (v_pi >= 0 && v_pi > G->v_size - (int)sizeof(double)) xerror("glp_mincost_okalg: v_pi = %d; invalid offset\n", v_pi); /* s is artificial source node */ s = G->nv + 1; /* t is artificial sink node */ t = s + 1; /* nv is the total number of nodes in the resulting network */ nv = t; /* na is the total number of arcs in the resulting network */ na = G->na + 1; for (i = 1; i <= G->nv; i++) { v = G->v[i]; if (v_rhs >= 0) memcpy(&temp, (char *)v->data + v_rhs, sizeof(double)); else temp = 0.0; if (temp != 0.0) na++; } /* allocate working arrays */ tail = xcalloc(1+na, sizeof(int)); head = xcalloc(1+na, sizeof(int)); low = xcalloc(1+na, sizeof(int)); cap = xcalloc(1+na, sizeof(int)); cost = xcalloc(1+na, sizeof(int)); x = xcalloc(1+na, sizeof(int)); pi = xcalloc(1+nv, sizeof(int)); /* construct the resulting network */ k = 0; /* (original arcs) */ for (i = 1; i <= G->nv; i++) { v = G->v[i]; for (a = v->out; a != NULL; a = a->t_next) { k++; tail[k] = a->tail->i; head[k] = a->head->i; if (tail[k] == head[k]) { ret = GLP_EDATA; goto done; } if (a_low >= 0) memcpy(&temp, (char *)a->data + a_low, sizeof(double)); else temp = 0.0; if (!(0.0 <= temp && temp <= (double)INT_MAX && temp == floor(temp))) { ret = GLP_EDATA; goto done; } low[k] = (int)temp; if (a_cap >= 0) memcpy(&temp, (char *)a->data + a_cap, sizeof(double)); else temp = 1.0; if (!((double)low[k] <= temp && temp <= (double)INT_MAX && temp == floor(temp))) { ret = GLP_EDATA; goto done; } cap[k] = (int)temp; if (a_cost >= 0) memcpy(&temp, (char *)a->data + a_cost, sizeof(double)); else temp = 0.0; if (!(fabs(temp) <= (double)INT_MAX && temp == floor(temp))) { ret = GLP_EDATA; goto done; } cost[k] = (int)temp; } } /* (artificial arcs) */ sum = 0.0; for (i = 1; i <= G->nv; i++) { v = G->v[i]; if (v_rhs >= 0) memcpy(&temp, (char *)v->data + v_rhs, sizeof(double)); else temp = 0.0; if (!(fabs(temp) <= (double)INT_MAX && temp == floor(temp))) { ret = GLP_EDATA; goto done; } if (temp > 0.0) { /* artificial arc from s to original source i */ k++; tail[k] = s; head[k] = i; low[k] = cap[k] = (int)(+temp); /* supply */ cost[k] = 0; sum += (double)temp; } else if (temp < 0.0) { /* artificial arc from original sink i to t */ k++; tail[k] = i; head[k] = t; low[k] = cap[k] = (int)(-temp); /* demand */ cost[k] = 0; } } /* (feedback arc from t to s) */ k++; xassert(k == na); tail[k] = t; head[k] = s; if (sum > (double)INT_MAX) { ret = GLP_EDATA; goto done; } low[k] = cap[k] = (int)sum; /* total supply/demand */ cost[k] = 0; /* find minimal-cost circulation in the resulting network */ ret = okalg(nv, na, tail, head, low, cap, cost, x, pi); switch (ret) { case 0: /* optimal circulation found */ ret = 0; break; case 1: /* no feasible circulation exists */ ret = GLP_ENOPFS; break; case 2: /* integer overflow occured */ ret = GLP_ERANGE; goto done; case 3: /* optimality test failed (logic error) */ ret = GLP_EFAIL; goto done; default: xassert(ret != ret); } /* store solution components */ /* (objective function = the total cost) */ if (sol != NULL) { temp = 0.0; for (k = 1; k <= na; k++) temp += (double)cost[k] * (double)x[k]; *sol = temp; } /* (arc flows) */ if (a_x >= 0) { k = 0; for (i = 1; i <= G->nv; i++) { v = G->v[i]; for (a = v->out; a != NULL; a = a->t_next) { temp = (double)x[++k]; memcpy((char *)a->data + a_x, &temp, sizeof(double)); } } } /* (node potentials = Lagrange multipliers) */ if (v_pi >= 0) { for (i = 1; i <= G->nv; i++) { v = G->v[i]; temp = - (double)pi[i]; memcpy((char *)v->data + v_pi, &temp, sizeof(double)); } } done: /* free working arrays */ xfree(tail); xfree(head); xfree(low); xfree(cap); xfree(cost); xfree(x); xfree(pi); return ret; } /* eof */ glpk-5.0/src/api/mcfrelax.c0000644000062000006210000002076013766346220015014 0ustar maomkpasswd/* mcfrelax.c (find minimum-cost flow with RELAX-IV) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2013-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "glpk.h" #include "relax4.h" static int overflow(int u, int v) { /* check for integer overflow on computing u + v */ if (u > 0 && v > 0 && u + v < 0) return 1; if (u < 0 && v < 0 && u + v > 0) return 1; return 0; } int glp_mincost_relax4(glp_graph *G, int v_rhs, int a_low, int a_cap, int a_cost, int crash, double *sol, int a_x, int a_rc) { /* find minimum-cost flow with Bertsekas-Tseng relaxation method (RELAX-IV) */ glp_vertex *v; glp_arc *a; struct relax4_csa csa; int i, k, large, n, na, ret; double cap, cost, low, rc, rhs, sum, x; if (v_rhs >= 0 && v_rhs > G->v_size - (int)sizeof(double)) xerror("glp_mincost_relax4: v_rhs = %d; invalid offset\n", v_rhs); if (a_low >= 0 && a_low > G->a_size - (int)sizeof(double)) xerror("glp_mincost_relax4: a_low = %d; invalid offset\n", a_low); if (a_cap >= 0 && a_cap > G->a_size - (int)sizeof(double)) xerror("glp_mincost_relax4: a_cap = %d; invalid offset\n", a_cap); if (a_cost >= 0 && a_cost > G->a_size - (int)sizeof(double)) xerror("glp_mincost_relax4: a_cost = %d; invalid offset\n", a_cost); if (a_x >= 0 && a_x > G->a_size - (int)sizeof(double)) xerror("glp_mincost_relax4: a_x = %d; invalid offset\n", a_x); if (a_rc >= 0 && a_rc > G->a_size - (int)sizeof(double)) xerror("glp_mincost_relax4: a_rc = %d; invalid offset\n", a_rc); csa.n = n = G->nv; /* number of nodes */ csa.na = na = G->na; /* number of arcs */ csa.large = large = INT_MAX / 4; csa.repeat = 0; csa.crash = crash; /* allocate working arrays */ csa.startn = xcalloc(1+na, sizeof(int)); csa.endn = xcalloc(1+na, sizeof(int)); csa.fou = xcalloc(1+n, sizeof(int)); csa.nxtou = xcalloc(1+na, sizeof(int)); csa.fin = xcalloc(1+n, sizeof(int)); csa.nxtin = xcalloc(1+na, sizeof(int)); csa.rc = xcalloc(1+na, sizeof(int)); csa.u = xcalloc(1+na, sizeof(int)); csa.dfct = xcalloc(1+n, sizeof(int)); csa.x = xcalloc(1+na, sizeof(int)); csa.label = xcalloc(1+n, sizeof(int)); csa.prdcsr = xcalloc(1+n, sizeof(int)); csa.save = xcalloc(1+na, sizeof(int)); csa.tfstou = xcalloc(1+n, sizeof(int)); csa.tnxtou = xcalloc(1+na, sizeof(int)); csa.tfstin = xcalloc(1+n, sizeof(int)); csa.tnxtin = xcalloc(1+na, sizeof(int)); csa.nxtqueue = xcalloc(1+n, sizeof(int)); csa.scan = xcalloc(1+n, sizeof(char)); csa.mark = xcalloc(1+n, sizeof(char)); if (crash) { csa.extend_arc = xcalloc(1+n, sizeof(int)); csa.sb_level = xcalloc(1+n, sizeof(int)); csa.sb_arc = xcalloc(1+n, sizeof(int)); } else { csa.extend_arc = NULL; csa.sb_level = NULL; csa.sb_arc = NULL; } /* scan nodes */ for (i = 1; i <= n; i++) { v = G->v[i]; /* get supply at i-th node */ if (v_rhs >= 0) memcpy(&rhs, (char *)v->data + v_rhs, sizeof(double)); else rhs = 0.0; if (!(fabs(rhs) <= (double)large && rhs == floor(rhs))) { ret = GLP_EDATA; goto done; } /* set demand at i-th node */ csa.dfct[i] = -(int)rhs; } /* scan arcs */ k = 0; for (i = 1; i <= n; i++) { v = G->v[i]; for (a = v->out; a != NULL; a = a->t_next) { k++; /* set endpoints of k-th arc */ if (a->tail->i == a->head->i) { /* self-loops not allowed */ ret = GLP_EDATA; goto done; } csa.startn[k] = a->tail->i; csa.endn[k] = a->head->i; /* set per-unit cost for k-th arc flow */ if (a_cost >= 0) memcpy(&cost, (char *)a->data + a_cost, sizeof(double)); else cost = 0.0; if (!(fabs(cost) <= (double)large && cost == floor(cost))) { ret = GLP_EDATA; goto done; } csa.rc[k] = (int)cost; /* get lower bound for k-th arc flow */ if (a_low >= 0) memcpy(&low, (char *)a->data + a_low, sizeof(double)); else low = 0.0; if (!(0.0 <= low && low <= (double)large && low == floor(low))) { ret = GLP_EDATA; goto done; } /* get upper bound for k-th arc flow */ if (a_cap >= 0) memcpy(&cap, (char *)a->data + a_cap, sizeof(double)); else cap = 1.0; if (!(low <= cap && cap <= (double)large && cap == floor(cap))) { ret = GLP_EDATA; goto done; } /* substitute x = x' + low, where 0 <= x' <= cap - low */ csa.u[k] = (int)(cap - low); /* correct demands at endpoints of k-th arc */ if (overflow(csa.dfct[a->tail->i], +low)) { ret = GLP_ERANGE; goto done; } #if 0 /* 29/IX-2017 */ csa.dfct[a->tail->i] += low; #else csa.dfct[a->tail->i] += (int)low; #endif if (overflow(csa.dfct[a->head->i], -low)) { ret = GLP_ERANGE; goto done; } #if 0 /* 29/IX-2017 */ csa.dfct[a->head->i] -= low; #else csa.dfct[a->head->i] -= (int)low; #endif } } /* construct linked list for network topology */ relax4_inidat(&csa); /* find minimum-cost flow */ ret = relax4(&csa); if (ret != 0) { /* problem is found to be infeasible */ xassert(1 <= ret && ret <= 8); ret = GLP_ENOPFS; goto done; } /* store solution */ sum = 0.0; k = 0; for (i = 1; i <= n; i++) { v = G->v[i]; for (a = v->out; a != NULL; a = a->t_next) { k++; /* get lower bound for k-th arc flow */ if (a_low >= 0) memcpy(&low, (char *)a->data + a_low, sizeof(double)); else low = 0.0; /* store original flow x = x' + low thru k-th arc */ x = (double)csa.x[k] + low; if (a_x >= 0) memcpy((char *)a->data + a_x, &x, sizeof(double)); /* store reduced cost for k-th arc flow */ rc = (double)csa.rc[k]; if (a_rc >= 0) memcpy((char *)a->data + a_rc, &rc, sizeof(double)); /* get per-unit cost for k-th arc flow */ if (a_cost >= 0) memcpy(&cost, (char *)a->data + a_cost, sizeof(double)); else cost = 0.0; /* compute the total cost */ sum += cost * x; } } /* store the total cost */ if (sol != NULL) *sol = sum; done: /* free working arrays */ xfree(csa.startn); xfree(csa.endn); xfree(csa.fou); xfree(csa.nxtou); xfree(csa.fin); xfree(csa.nxtin); xfree(csa.rc); xfree(csa.u); xfree(csa.dfct); xfree(csa.x); xfree(csa.label); xfree(csa.prdcsr); xfree(csa.save); xfree(csa.tfstou); xfree(csa.tnxtou); xfree(csa.tfstin); xfree(csa.tnxtin); xfree(csa.nxtqueue); xfree(csa.scan); xfree(csa.mark); if (crash) { xfree(csa.extend_arc); xfree(csa.sb_level); xfree(csa.sb_arc); } return ret; } /* eof */ glpk-5.0/src/api/minisat1.c0000644000062000006210000001214213766346220014733 0ustar maomkpasswd/* minisat1.c (driver to MiniSat solver) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2011-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "minisat.h" #include "prob.h" int glp_minisat1(glp_prob *P) { /* solve CNF-SAT problem with MiniSat solver */ solver *s; GLPAIJ *aij; int i, j, len, ret, *ind; double sum; #if 0 /* 04/IV-2016 */ /* check problem object */ if (P == NULL || P->magic != GLP_PROB_MAGIC) xerror("glp_minisat1: P = %p; invalid problem object\n", P); #endif if (P->tree != NULL) xerror("glp_minisat1: operation not allowed\n"); /* integer solution is currently undefined */ P->mip_stat = GLP_UNDEF; P->mip_obj = 0.0; /* check that problem object encodes CNF-SAT instance */ if (glp_check_cnfsat(P) != 0) { xprintf("glp_minisat1: problem object does not encode CNF-SAT " "instance\n"); ret = GLP_EDATA; goto done; } #if 0 /* 08/I-2017 by cmatraki */ #if 1 /* 07/XI-2015 */ if (sizeof(void *) != sizeof(int)) { xprintf("glp_minisat1: sorry, MiniSat solver is not supported " "on 64-bit platforms\n"); ret = GLP_EFAIL; goto done; } #endif #else if (sizeof(void *) != sizeof(size_t)) { xprintf("glp_minisat1: sorry, MiniSat solver is not supported " "on this platform\n"); ret = GLP_EFAIL; goto done; } #endif /* solve CNF-SAT problem */ xprintf("Solving CNF-SAT problem...\n"); xprintf("Instance has %d variable%s, %d clause%s, and %d literal%" "s\n", P->n, P->n == 1 ? "" : "s", P->m, P->m == 1 ? "" : "s", P->nnz, P->nnz == 1 ? "" : "s"); /* if CNF-SAT has no clauses, it is satisfiable */ if (P->m == 0) { P->mip_stat = GLP_OPT; for (j = 1; j <= P->n; j++) P->col[j]->mipx = 0.0; goto fini; } /* if CNF-SAT has an empty clause, it is unsatisfiable */ for (i = 1; i <= P->m; i++) { if (P->row[i]->ptr == NULL) { P->mip_stat = GLP_NOFEAS; goto fini; } } /* prepare input data for the solver */ s = solver_new(); solver_setnvars(s, P->n); ind = xcalloc(1+P->n, sizeof(int)); for (i = 1; i <= P->m; i++) { len = 0; for (aij = P->row[i]->ptr; aij != NULL; aij = aij->r_next) { ind[++len] = toLit(aij->col->j-1); if (aij->val < 0.0) ind[len] = lit_neg(ind[len]); } xassert(len > 0); #if 0 /* 08/I-2017 by cmatraki */ xassert(solver_addclause(s, &ind[1], &ind[1+len])); #else if (!solver_addclause(s, &ind[1], &ind[1+len])) { /* found trivial conflict */ xfree(ind); solver_delete(s); P->mip_stat = GLP_NOFEAS; goto fini; } #endif } xfree(ind); /* call the solver */ s->verbosity = 1; if (solver_solve(s, 0, 0)) { /* instance is reported as satisfiable */ P->mip_stat = GLP_OPT; /* copy solution to the problem object */ xassert(s->model.size == P->n); for (j = 1; j <= P->n; j++) { P->col[j]->mipx = s->model.ptr[j-1] == l_True ? 1.0 : 0.0; } /* compute row values */ for (i = 1; i <= P->m; i++) { sum = 0; for (aij = P->row[i]->ptr; aij != NULL; aij = aij->r_next) sum += aij->val * aij->col->mipx; P->row[i]->mipx = sum; } /* check integer feasibility */ for (i = 1; i <= P->m; i++) { if (P->row[i]->mipx < P->row[i]->lb) { /* solution is wrong */ P->mip_stat = GLP_UNDEF; break; } } } else { /* instance is reported as unsatisfiable */ P->mip_stat = GLP_NOFEAS; } solver_delete(s); fini: /* report the instance status */ if (P->mip_stat == GLP_OPT) { xprintf("SATISFIABLE\n"); ret = 0; } else if (P->mip_stat == GLP_NOFEAS) { xprintf("UNSATISFIABLE\n"); ret = 0; } else { xprintf("glp_minisat1: solver failed\n"); ret = GLP_EFAIL; } done: return ret; } /* eof */ glpk-5.0/src/api/mpl.c0000644000062000006210000002163013766346220014000 0ustar maomkpasswd/* mpl.c (processing model in GNU MathProg language) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2008-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "mpl.h" #include "prob.h" glp_tran *glp_mpl_alloc_wksp(void) { /* allocate the MathProg translator workspace */ glp_tran *tran; tran = mpl_initialize(); return tran; } void glp_mpl_init_rand(glp_tran *tran, int seed) { /* initialize pseudo-random number generator */ if (tran->phase != 0) xerror("glp_mpl_init_rand: invalid call sequence\n"); rng_init_rand(tran->rand, seed); return; } int glp_mpl_read_model(glp_tran *tran, const char *fname, int skip) { /* read and translate model section */ int ret; if (tran->phase != 0) xerror("glp_mpl_read_model: invalid call sequence\n"); ret = mpl_read_model(tran, (char *)fname, skip); if (ret == 1 || ret == 2) ret = 0; else if (ret == 4) ret = 1; else xassert(ret != ret); return ret; } int glp_mpl_read_data(glp_tran *tran, const char *fname) { /* read and translate data section */ int ret; if (!(tran->phase == 1 || tran->phase == 2)) xerror("glp_mpl_read_data: invalid call sequence\n"); ret = mpl_read_data(tran, (char *)fname); if (ret == 2) ret = 0; else if (ret == 4) ret = 1; else xassert(ret != ret); return ret; } int glp_mpl_generate(glp_tran *tran, const char *fname) { /* generate the model */ int ret; if (!(tran->phase == 1 || tran->phase == 2)) xerror("glp_mpl_generate: invalid call sequence\n"); ret = mpl_generate(tran, (char *)fname); if (ret == 3) ret = 0; else if (ret == 4) ret = 1; return ret; } void glp_mpl_build_prob(glp_tran *tran, glp_prob *prob) { /* build LP/MIP problem instance from the model */ int m, n, i, j, t, kind, type, len, *ind; double lb, ub, *val; if (tran->phase != 3) xerror("glp_mpl_build_prob: invalid call sequence\n"); /* erase the problem object */ glp_erase_prob(prob); /* set problem name */ glp_set_prob_name(prob, mpl_get_prob_name(tran)); /* build rows (constraints) */ m = mpl_get_num_rows(tran); if (m > 0) glp_add_rows(prob, m); for (i = 1; i <= m; i++) { /* set row name */ glp_set_row_name(prob, i, mpl_get_row_name(tran, i)); /* set row bounds */ type = mpl_get_row_bnds(tran, i, &lb, &ub); switch (type) { case MPL_FR: type = GLP_FR; break; case MPL_LO: type = GLP_LO; break; case MPL_UP: type = GLP_UP; break; case MPL_DB: type = GLP_DB; break; case MPL_FX: type = GLP_FX; break; default: xassert(type != type); } if (type == GLP_DB && fabs(lb - ub) < 1e-9 * (1.0 + fabs(lb))) { type = GLP_FX; if (fabs(lb) <= fabs(ub)) ub = lb; else lb = ub; } glp_set_row_bnds(prob, i, type, lb, ub); /* warn about non-zero constant term */ if (mpl_get_row_c0(tran, i) != 0.0) xprintf("glp_mpl_build_prob: row %s; constant term %.12g ig" "nored\n", mpl_get_row_name(tran, i), mpl_get_row_c0(tran, i)); } /* build columns (variables) */ n = mpl_get_num_cols(tran); if (n > 0) glp_add_cols(prob, n); for (j = 1; j <= n; j++) { /* set column name */ glp_set_col_name(prob, j, mpl_get_col_name(tran, j)); /* set column kind */ kind = mpl_get_col_kind(tran, j); switch (kind) { case MPL_NUM: break; case MPL_INT: case MPL_BIN: glp_set_col_kind(prob, j, GLP_IV); break; default: xassert(kind != kind); } /* set column bounds */ type = mpl_get_col_bnds(tran, j, &lb, &ub); switch (type) { case MPL_FR: type = GLP_FR; break; case MPL_LO: type = GLP_LO; break; case MPL_UP: type = GLP_UP; break; case MPL_DB: type = GLP_DB; break; case MPL_FX: type = GLP_FX; break; default: xassert(type != type); } if (kind == MPL_BIN) { if (type == GLP_FR || type == GLP_UP || lb < 0.0) lb = 0.0; if (type == GLP_FR || type == GLP_LO || ub > 1.0) ub = 1.0; type = GLP_DB; } if (type == GLP_DB && fabs(lb - ub) < 1e-9 * (1.0 + fabs(lb))) { type = GLP_FX; if (fabs(lb) <= fabs(ub)) ub = lb; else lb = ub; } glp_set_col_bnds(prob, j, type, lb, ub); } /* load the constraint matrix */ ind = xcalloc(1+n, sizeof(int)); val = xcalloc(1+n, sizeof(double)); for (i = 1; i <= m; i++) { len = mpl_get_mat_row(tran, i, ind, val); glp_set_mat_row(prob, i, len, ind, val); } /* build objective function (the first objective is used) */ for (i = 1; i <= m; i++) { kind = mpl_get_row_kind(tran, i); if (kind == MPL_MIN || kind == MPL_MAX) { /* set objective name */ glp_set_obj_name(prob, mpl_get_row_name(tran, i)); /* set optimization direction */ glp_set_obj_dir(prob, kind == MPL_MIN ? GLP_MIN : GLP_MAX); /* set constant term */ glp_set_obj_coef(prob, 0, mpl_get_row_c0(tran, i)); /* set objective coefficients */ len = mpl_get_mat_row(tran, i, ind, val); for (t = 1; t <= len; t++) glp_set_obj_coef(prob, ind[t], val[t]); break; } } /* free working arrays */ xfree(ind); xfree(val); return; } int glp_mpl_postsolve(glp_tran *tran, glp_prob *prob, int sol) { /* postsolve the model */ int i, j, m, n, stat, ret; double prim, dual; if (!(tran->phase == 3 && !tran->flag_p)) xerror("glp_mpl_postsolve: invalid call sequence\n"); if (!(sol == GLP_SOL || sol == GLP_IPT || sol == GLP_MIP)) xerror("glp_mpl_postsolve: sol = %d; invalid parameter\n", sol); m = mpl_get_num_rows(tran); n = mpl_get_num_cols(tran); if (!(m == glp_get_num_rows(prob) && n == glp_get_num_cols(prob))) xerror("glp_mpl_postsolve: wrong problem object\n"); if (!mpl_has_solve_stmt(tran)) { ret = 0; goto done; } for (i = 1; i <= m; i++) { if (sol == GLP_SOL) { stat = glp_get_row_stat(prob, i); prim = glp_get_row_prim(prob, i); dual = glp_get_row_dual(prob, i); } else if (sol == GLP_IPT) { stat = 0; prim = glp_ipt_row_prim(prob, i); dual = glp_ipt_row_dual(prob, i); } else if (sol == GLP_MIP) { stat = 0; prim = glp_mip_row_val(prob, i); dual = 0.0; } else xassert(sol != sol); if (fabs(prim) < 1e-9) prim = 0.0; if (fabs(dual) < 1e-9) dual = 0.0; mpl_put_row_soln(tran, i, stat, prim, dual); } for (j = 1; j <= n; j++) { if (sol == GLP_SOL) { stat = glp_get_col_stat(prob, j); prim = glp_get_col_prim(prob, j); dual = glp_get_col_dual(prob, j); } else if (sol == GLP_IPT) { stat = 0; prim = glp_ipt_col_prim(prob, j); dual = glp_ipt_col_dual(prob, j); } else if (sol == GLP_MIP) { stat = 0; prim = glp_mip_col_val(prob, j); dual = 0.0; } else xassert(sol != sol); if (fabs(prim) < 1e-9) prim = 0.0; if (fabs(dual) < 1e-9) dual = 0.0; mpl_put_col_soln(tran, j, stat, prim, dual); } ret = mpl_postsolve(tran); if (ret == 3) ret = 0; else if (ret == 4) ret = 1; done: return ret; } void glp_mpl_free_wksp(glp_tran *tran) { /* free the MathProg translator workspace */ mpl_terminate(tran); return; } /* eof */ glpk-5.0/src/api/mps.c0000644000062000006210000013607513766346220014021 0ustar maomkpasswd/* mps.c (MPS format routines) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2008-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "misc.h" #include "prob.h" #define xfprintf glp_format /*********************************************************************** * NAME * * glp_init_mpscp - initialize MPS format control parameters * * SYNOPSIS * * void glp_init_mpscp(glp_mpscp *parm); * * DESCRIPTION * * The routine glp_init_mpscp initializes control parameters, which are * used by the MPS input/output routines glp_read_mps and glp_write_mps, * with default values. * * Default values of the control parameters are stored in the glp_mpscp * structure, which the parameter parm points to. */ void glp_init_mpscp(glp_mpscp *parm) { parm->blank = '\0'; parm->obj_name = NULL; parm->tol_mps = 1e-12; return; } static void check_parm(const char *func, const glp_mpscp *parm) { /* check control parameters */ if (!(0x00 <= parm->blank && parm->blank <= 0xFF) || !(parm->blank == '\0' || isprint(parm->blank))) xerror("%s: blank = 0x%02X; invalid parameter\n", func, parm->blank); if (!(parm->obj_name == NULL || strlen(parm->obj_name) <= 255)) xerror("%s: obj_name = \"%.12s...\"; parameter too long\n", func, parm->obj_name); if (!(0.0 <= parm->tol_mps && parm->tol_mps < 1.0)) xerror("%s: tol_mps = %g; invalid parameter\n", func, parm->tol_mps); return; } /*********************************************************************** * NAME * * glp_read_mps - read problem data in MPS format * * SYNOPSIS * * int glp_read_mps(glp_prob *P, int fmt, const glp_mpscp *parm, * const char *fname); * * DESCRIPTION * * The routine glp_read_mps reads problem data in MPS format from a * text file. * * The parameter fmt specifies the version of MPS format: * * GLP_MPS_DECK - fixed (ancient) MPS format; * GLP_MPS_FILE - free (modern) MPS format. * * The parameter parm is a pointer to the structure glp_mpscp, which * specifies control parameters used by the routine. If parm is NULL, * the routine uses default settings. * * The character string fname specifies a name of the text file to be * read. * * Note that before reading data the current content of the problem * object is completely erased with the routine glp_erase_prob. * * RETURNS * * If the operation was successful, the routine glp_read_mps returns * zero. Otherwise, it prints an error message and returns non-zero. */ struct csa { /* common storage area */ glp_prob *P; /* pointer to problem object */ int deck; /* MPS format (0 - free, 1 - fixed) */ const glp_mpscp *parm; /* pointer to control parameters */ const char *fname; /* name of input MPS file */ glp_file *fp; /* stream assigned to input MPS file */ jmp_buf jump; /* label for go to in case of error */ int recno; /* current record (card) number */ int recpos; /* current record (card) position */ int c; /* current character */ int fldno; /* current field number */ char field[255+1]; /* current field content */ int w80; /* warning 'record must not be longer than 80 chars' issued */ int wef; /* warning 'extra fields detected beyond field 6' issued */ int obj_row; /* objective row number */ void *work1, *work2, *work3; /* working arrays */ }; static void error(struct csa *csa, const char *fmt, ...) { /* print error message and terminate processing */ va_list arg; xprintf("%s:%d: ", csa->fname, csa->recno); va_start(arg, fmt); xvprintf(fmt, arg); va_end(arg); longjmp(csa->jump, 1); /* no return */ } static void warning(struct csa *csa, const char *fmt, ...) { /* print warning message and continue processing */ va_list arg; xprintf("%s:%d: warning: ", csa->fname, csa->recno); va_start(arg, fmt); xvprintf(fmt, arg); va_end(arg); return; } static void read_char(struct csa *csa) { /* read next character */ int c; if (csa->c == '\n') csa->recno++, csa->recpos = 0; csa->recpos++; read: c = glp_getc(csa->fp); if (c < 0) { if (glp_ioerr(csa->fp)) error(csa, "read error - %s\n", get_err_msg()); else if (csa->c == '\n') error(csa, "unexpected end of file\n"); else { warning(csa, "missing final end of line\n"); c = '\n'; } } else if (c == '\n') ; else if (csa->c == '\r') { c = '\r'; goto badc; } else if (csa->deck && c == '\r') { csa->c = '\r'; goto read; } else if (c == ' ') ; else if (isspace(c)) { if (csa->deck) badc: error(csa, "in fixed MPS format white-space character 0x%02" "X is not allowed\n", c); c = ' '; } else if (iscntrl(c)) error(csa, "invalid control character 0x%02X\n", c); if (csa->deck && csa->recpos == 81 && c != '\n' && csa->w80 < 1) { warning(csa, "in fixed MPS format record must not be longer th" "an 80 characters\n"); csa->w80++; } csa->c = c; return; } static int indicator(struct csa *csa, int name) { /* skip comment records and read possible indicator record */ int ret; /* reset current field number */ csa->fldno = 0; loop: /* read the very first character of the next record */ xassert(csa->c == '\n'); read_char(csa); if (csa->c == ' ' || csa->c == '\n') { /* data record */ ret = 0; } else if (csa->c == '*') { /* comment record */ while (csa->c != '\n') read_char(csa); goto loop; } else { /* indicator record */ int len = 0; while (csa->c != ' ' && csa->c != '\n' && len < 12) { csa->field[len++] = (char)csa->c; read_char(csa); } csa->field[len] = '\0'; if (!(strcmp(csa->field, "NAME") == 0 || strcmp(csa->field, "ROWS") == 0 || strcmp(csa->field, "COLUMNS") == 0 || strcmp(csa->field, "RHS") == 0 || strcmp(csa->field, "RANGES") == 0 || strcmp(csa->field, "BOUNDS") == 0 || strcmp(csa->field, "ENDATA") == 0)) error(csa, "invalid indicator record\n"); if (!name) { while (csa->c != '\n') read_char(csa); } ret = 1; } return ret; } static void read_field(struct csa *csa) { /* read next field of the current data record */ csa->fldno++; if (csa->deck) { /* fixed MPS format */ int beg, end, pos; /* determine predefined field positions */ if (csa->fldno == 1) beg = 2, end = 3; else if (csa->fldno == 2) beg = 5, end = 12; else if (csa->fldno == 3) beg = 15, end = 22; else if (csa->fldno == 4) beg = 25, end = 36; else if (csa->fldno == 5) beg = 40, end = 47; else if (csa->fldno == 6) beg = 50, end = 61; else xassert(csa != csa); /* skip blanks preceding the current field */ if (csa->c != '\n') { pos = csa->recpos; while (csa->recpos < beg) { if (csa->c == ' ') ; else if (csa->c == '\n') break; else error(csa, "in fixed MPS format positions %d-%d must " "be blank\n", pos, beg-1); read_char(csa); } } /* skip possible comment beginning in the field 3 or 5 */ if ((csa->fldno == 3 || csa->fldno == 5) && csa->c == '$') { while (csa->c != '\n') read_char(csa); } /* read the current field */ for (pos = beg; pos <= end; pos++) { if (csa->c == '\n') break; csa->field[pos-beg] = (char)csa->c; read_char(csa); } csa->field[pos-beg] = '\0'; strtrim(csa->field); /* skip blanks following the last field */ if (csa->fldno == 6 && csa->c != '\n') { while (csa->recpos <= 72) { if (csa->c == ' ') ; else if (csa->c == '\n') break; else error(csa, "in fixed MPS format positions 62-72 must " "be blank\n"); read_char(csa); } while (csa->c != '\n') read_char(csa); } } else { /* free MPS format */ int len; /* skip blanks preceding the current field */ while (csa->c == ' ') read_char(csa); /* skip possible comment */ if (csa->c == '$') { while (csa->c != '\n') read_char(csa); } /* read the current field */ len = 0; while (!(csa->c == ' ' || csa->c == '\n')) { if (len == 255) error(csa, "length of field %d exceeds 255 characters\n", csa->fldno++); csa->field[len++] = (char)csa->c; read_char(csa); } csa->field[len] = '\0'; /* skip anything following the last field (any extra fields are considered to be comments) */ if (csa->fldno == 6) { while (csa->c == ' ') read_char(csa); if (csa->c != '$' && csa->c != '\n' && csa->wef < 1) { warning(csa, "some extra field(s) detected beyond field " "6; field(s) ignored\n"); csa->wef++; } while (csa->c != '\n') read_char(csa); } } return; } static void patch_name(struct csa *csa, char *name) { /* process embedded blanks in symbolic name */ int blank = csa->parm->blank; if (blank == '\0') { /* remove emedded blanks */ strspx(name); } else { /* replace embedded blanks by specified character */ for (; *name != '\0'; name++) if (*name == ' ') *name = (char)blank; } return; } static double read_number(struct csa *csa) { /* read next field and convert it to floating-point number */ double x; char *s; /* read next field */ read_field(csa); xassert(csa->fldno == 4 || csa->fldno == 6); if (csa->field[0] == '\0') error(csa, "missing numeric value in field %d\n", csa->fldno); /* skip initial spaces of the field */ for (s = csa->field; *s == ' '; s++); /* perform conversion */ if (str2num(s, &x) != 0) error(csa, "cannot convert '%s' to floating-point number\n", s); return x; } static void skip_field(struct csa *csa) { /* read and skip next field (assumed to be blank) */ read_field(csa); if (csa->field[0] != '\0') error(csa, "field %d must be blank\n", csa->fldno); return; } static void read_name(struct csa *csa) { /* read NAME indicator record */ if (!(indicator(csa, 1) && strcmp(csa->field, "NAME") == 0)) error(csa, "missing NAME indicator record\n"); /* this indicator record looks like a data record; simulate that fields 1 and 2 were read */ csa->fldno = 2; /* field 3: model name */ read_field(csa), patch_name(csa, csa->field); if (csa->field[0] == '\0') warning(csa, "missing model name in field 3\n"); else glp_set_prob_name(csa->P, csa->field); /* skip anything following field 3 */ while (csa->c != '\n') read_char(csa); return; } static void read_rows(struct csa *csa) { /* read ROWS section */ int i, type; loop: if (indicator(csa, 0)) goto done; /* field 1: row type */ read_field(csa), strspx(csa->field); if (strcmp(csa->field, "N") == 0) type = GLP_FR; else if (strcmp(csa->field, "G") == 0) type = GLP_LO; else if (strcmp(csa->field, "L") == 0) type = GLP_UP; else if (strcmp(csa->field, "E") == 0) type = GLP_FX; else if (csa->field[0] == '\0') error(csa, "missing row type in field 1\n"); else error(csa, "invalid row type in field 1\n"); /* field 2: row name */ read_field(csa), patch_name(csa, csa->field); if (csa->field[0] == '\0') error(csa, "missing row name in field 2\n"); if (glp_find_row(csa->P, csa->field) != 0) error(csa, "row '%s' multiply specified\n", csa->field); i = glp_add_rows(csa->P, 1); glp_set_row_name(csa->P, i, csa->field); glp_set_row_bnds(csa->P, i, type, 0.0, 0.0); /* fields 3, 4, 5, and 6 must be blank */ skip_field(csa); skip_field(csa); skip_field(csa); skip_field(csa); goto loop; done: return; } static void read_columns(struct csa *csa) { /* read COLUMNS section */ int i, j, f, len, kind = GLP_CV, *ind; double aij, *val; char name[255+1], *flag; /* allocate working arrays */ csa->work1 = ind = xcalloc(1+csa->P->m, sizeof(int)); csa->work2 = val = xcalloc(1+csa->P->m, sizeof(double)); csa->work3 = flag = xcalloc(1+csa->P->m, sizeof(char)); memset(&flag[1], 0, csa->P->m); /* no current column exists */ j = 0, len = 0; loop: if (indicator(csa, 0)) goto done; /* field 1 must be blank */ if (csa->deck) { read_field(csa); if (csa->field[0] != '\0') error(csa, "field 1 must be blank\n"); } else csa->fldno++; /* field 2: column or kind name */ read_field(csa), patch_name(csa, csa->field); strcpy(name, csa->field); /* field 3: row name or keyword 'MARKER' */ read_field(csa), patch_name(csa, csa->field); if (strcmp(csa->field, "'MARKER'") == 0) { /* process kind data record */ /* field 4 must be blank */ if (csa->deck) { read_field(csa); if (csa->field[0] != '\0') error(csa, "field 4 must be blank\n"); } else csa->fldno++; /* field 5: keyword 'INTORG' or 'INTEND' */ read_field(csa), patch_name(csa, csa->field); if (strcmp(csa->field, "'INTORG'") == 0) kind = GLP_IV; else if (strcmp(csa->field, "'INTEND'") == 0) kind = GLP_CV; else if (csa->field[0] == '\0') error(csa, "missing keyword in field 5\n"); else error(csa, "invalid keyword in field 5\n"); /* field 6 must be blank */ skip_field(csa); goto loop; } /* process column name specified in field 2 */ if (name[0] == '\0') { /* the same column as in previous data record */ if (j == 0) error(csa, "missing column name in field 2\n"); } else if (j != 0 && strcmp(name, csa->P->col[j]->name) == 0) { /* the same column as in previous data record */ xassert(j != 0); } else { /* store the current column */ if (j != 0) { glp_set_mat_col(csa->P, j, len, ind, val); while (len > 0) flag[ind[len--]] = 0; } /* create new column */ if (glp_find_col(csa->P, name) != 0) error(csa, "column '%s' multiply specified\n", name); j = glp_add_cols(csa->P, 1); glp_set_col_name(csa->P, j, name); glp_set_col_kind(csa->P, j, kind); if (kind == GLP_CV) glp_set_col_bnds(csa->P, j, GLP_LO, 0.0, 0.0); else if (kind == GLP_IV) glp_set_col_bnds(csa->P, j, GLP_DB, 0.0, 1.0); else xassert(kind != kind); } /* process fields 3-4 and 5-6 */ for (f = 3; f <= 5; f += 2) { /* field 3 or 5: row name */ if (f == 3) { if (csa->field[0] == '\0') error(csa, "missing row name in field 3\n"); } else { read_field(csa), patch_name(csa, csa->field); if (csa->field[0] == '\0') { /* if field 5 is blank, field 6 also must be blank */ skip_field(csa); continue; } } i = glp_find_row(csa->P, csa->field); if (i == 0) error(csa, "row '%s' not found\n", csa->field); if (flag[i]) error(csa, "duplicate coefficient in row '%s'\n", csa->field); /* field 4 or 6: coefficient value */ aij = read_number(csa); if (fabs(aij) < csa->parm->tol_mps) aij = 0.0; len++, ind[len] = i, val[len] = aij, flag[i] = 1; } goto loop; done: /* store the last column */ if (j != 0) glp_set_mat_col(csa->P, j, len, ind, val); /* free working arrays */ xfree(ind); xfree(val); xfree(flag); csa->work1 = csa->work2 = csa->work3 = NULL; return; } static void read_rhs(struct csa *csa) { /* read RHS section */ int i, f, v, type; double rhs; char name[255+1], *flag; /* allocate working array */ csa->work3 = flag = xcalloc(1+csa->P->m, sizeof(char)); memset(&flag[1], 0, csa->P->m); /* no current RHS vector exists */ v = 0; loop: if (indicator(csa, 0)) goto done; /* field 1 must be blank */ if (csa->deck) { read_field(csa); if (csa->field[0] != '\0') error(csa, "field 1 must be blank\n"); } else csa->fldno++; /* field 2: RHS vector name */ read_field(csa), patch_name(csa, csa->field); if (csa->field[0] == '\0') { /* the same RHS vector as in previous data record */ if (v == 0) { warning(csa, "missing RHS vector name in field 2\n"); goto blnk; } } else if (v != 0 && strcmp(csa->field, name) == 0) { /* the same RHS vector as in previous data record */ xassert(v != 0); } else blnk: { /* new RHS vector */ if (v != 0) error(csa, "multiple RHS vectors not supported\n"); v++; strcpy(name, csa->field); } /* process fields 3-4 and 5-6 */ for (f = 3; f <= 5; f += 2) { /* field 3 or 5: row name */ read_field(csa), patch_name(csa, csa->field); if (csa->field[0] == '\0') { if (f == 3) error(csa, "missing row name in field 3\n"); else { /* if field 5 is blank, field 6 also must be blank */ skip_field(csa); continue; } } i = glp_find_row(csa->P, csa->field); if (i == 0) error(csa, "row '%s' not found\n", csa->field); if (flag[i]) error(csa, "duplicate right-hand side for row '%s'\n", csa->field); /* field 4 or 6: right-hand side value */ rhs = read_number(csa); if (fabs(rhs) < csa->parm->tol_mps) rhs = 0.0; type = csa->P->row[i]->type; if (type == GLP_FR) { if (i == csa->obj_row) glp_set_obj_coef(csa->P, 0, rhs); else if (rhs != 0.0) warning(csa, "non-zero right-hand side for free row '%s'" " ignored\n", csa->P->row[i]->name); } else glp_set_row_bnds(csa->P, i, type, rhs, rhs); flag[i] = 1; } goto loop; done: /* free working array */ xfree(flag); csa->work3 = NULL; return; } static void read_ranges(struct csa *csa) { /* read RANGES section */ int i, f, v, type; double rhs, rng; char name[255+1], *flag; /* allocate working array */ csa->work3 = flag = xcalloc(1+csa->P->m, sizeof(char)); memset(&flag[1], 0, csa->P->m); /* no current RANGES vector exists */ v = 0; loop: if (indicator(csa, 0)) goto done; /* field 1 must be blank */ if (csa->deck) { read_field(csa); if (csa->field[0] != '\0') error(csa, "field 1 must be blank\n"); } else csa->fldno++; /* field 2: RANGES vector name */ read_field(csa), patch_name(csa, csa->field); if (csa->field[0] == '\0') { /* the same RANGES vector as in previous data record */ if (v == 0) { warning(csa, "missing RANGES vector name in field 2\n"); goto blnk; } } else if (v != 0 && strcmp(csa->field, name) == 0) { /* the same RANGES vector as in previous data record */ xassert(v != 0); } else blnk: { /* new RANGES vector */ if (v != 0) error(csa, "multiple RANGES vectors not supported\n"); v++; strcpy(name, csa->field); } /* process fields 3-4 and 5-6 */ for (f = 3; f <= 5; f += 2) { /* field 3 or 5: row name */ read_field(csa), patch_name(csa, csa->field); if (csa->field[0] == '\0') { if (f == 3) error(csa, "missing row name in field 3\n"); else { /* if field 5 is blank, field 6 also must be blank */ skip_field(csa); continue; } } i = glp_find_row(csa->P, csa->field); if (i == 0) error(csa, "row '%s' not found\n", csa->field); if (flag[i]) error(csa, "duplicate range for row '%s'\n", csa->field); /* field 4 or 6: range value */ rng = read_number(csa); if (fabs(rng) < csa->parm->tol_mps) rng = 0.0; type = csa->P->row[i]->type; if (type == GLP_FR) warning(csa, "range for free row '%s' ignored\n", csa->P->row[i]->name); else if (type == GLP_LO) { rhs = csa->P->row[i]->lb; #if 0 /* 26/V-2017 by cmatraki */ glp_set_row_bnds(csa->P, i, rhs == 0.0 ? GLP_FX : GLP_DB, #else glp_set_row_bnds(csa->P, i, rng == 0.0 ? GLP_FX : GLP_DB, #endif rhs, rhs + fabs(rng)); } else if (type == GLP_UP) { rhs = csa->P->row[i]->ub; #if 0 /* 26/V-2017 by cmatraki */ glp_set_row_bnds(csa->P, i, rhs == 0.0 ? GLP_FX : GLP_DB, #else glp_set_row_bnds(csa->P, i, rng == 0.0 ? GLP_FX : GLP_DB, #endif rhs - fabs(rng), rhs); } else if (type == GLP_FX) { rhs = csa->P->row[i]->lb; if (rng > 0.0) glp_set_row_bnds(csa->P, i, GLP_DB, rhs, rhs + rng); else if (rng < 0.0) glp_set_row_bnds(csa->P, i, GLP_DB, rhs + rng, rhs); } else xassert(type != type); flag[i] = 1; } goto loop; done: /* free working array */ xfree(flag); csa->work3 = NULL; return; } static void read_bounds(struct csa *csa) { /* read BOUNDS section */ GLPCOL *col; int j, v, mask, data; double bnd, lb, ub; char type[2+1], name[255+1], *flag; /* allocate working array */ csa->work3 = flag = xcalloc(1+csa->P->n, sizeof(char)); memset(&flag[1], 0, csa->P->n); /* no current BOUNDS vector exists */ v = 0; loop: if (indicator(csa, 0)) goto done; /* field 1: bound type */ read_field(csa); if (strcmp(csa->field, "LO") == 0) mask = 0x01, data = 1; else if (strcmp(csa->field, "UP") == 0) mask = 0x10, data = 1; else if (strcmp(csa->field, "FX") == 0) mask = 0x11, data = 1; else if (strcmp(csa->field, "FR") == 0) mask = 0x11, data = 0; else if (strcmp(csa->field, "MI") == 0) mask = 0x01, data = 0; else if (strcmp(csa->field, "PL") == 0) mask = 0x10, data = 0; else if (strcmp(csa->field, "LI") == 0) mask = 0x01, data = 1; else if (strcmp(csa->field, "UI") == 0) mask = 0x10, data = 1; else if (strcmp(csa->field, "BV") == 0) mask = 0x11, data = 0; else if (csa->field[0] == '\0') error(csa, "missing bound type in field 1\n"); else error(csa, "invalid bound type in field 1\n"); strcpy(type, csa->field); /* field 2: BOUNDS vector name */ read_field(csa), patch_name(csa, csa->field); if (csa->field[0] == '\0') { /* the same BOUNDS vector as in previous data record */ if (v == 0) { warning(csa, "missing BOUNDS vector name in field 2\n"); goto blnk; } } else if (v != 0 && strcmp(csa->field, name) == 0) { /* the same BOUNDS vector as in previous data record */ xassert(v != 0); } else blnk: { /* new BOUNDS vector */ if (v != 0) error(csa, "multiple BOUNDS vectors not supported\n"); v++; strcpy(name, csa->field); } /* field 3: column name */ read_field(csa), patch_name(csa, csa->field); if (csa->field[0] == '\0') error(csa, "missing column name in field 3\n"); j = glp_find_col(csa->P, csa->field); if (j == 0) error(csa, "column '%s' not found\n", csa->field); if ((flag[j] & mask) == 0x01) error(csa, "duplicate lower bound for column '%s'\n", csa->field); if ((flag[j] & mask) == 0x10) error(csa, "duplicate upper bound for column '%s'\n", csa->field); xassert((flag[j] & mask) == 0x00); /* field 4: bound value */ if (data) { bnd = read_number(csa); if (fabs(bnd) < csa->parm->tol_mps) bnd = 0.0; } else read_field(csa), bnd = 0.0; /* get current column bounds */ col = csa->P->col[j]; if (col->type == GLP_FR) lb = -DBL_MAX, ub = +DBL_MAX; else if (col->type == GLP_LO) lb = col->lb, ub = +DBL_MAX; else if (col->type == GLP_UP) lb = -DBL_MAX, ub = col->ub; else if (col->type == GLP_DB) lb = col->lb, ub = col->ub; else if (col->type == GLP_FX) lb = ub = col->lb; else xassert(col != col); /* change column bounds */ if (strcmp(type, "LO") == 0) lb = bnd; else if (strcmp(type, "UP") == 0) ub = bnd; else if (strcmp(type, "FX") == 0) lb = ub = bnd; else if (strcmp(type, "FR") == 0) lb = -DBL_MAX, ub = +DBL_MAX; else if (strcmp(type, "MI") == 0) lb = -DBL_MAX; else if (strcmp(type, "PL") == 0) ub = +DBL_MAX; else if (strcmp(type, "LI") == 0) { glp_set_col_kind(csa->P, j, GLP_IV); lb = ceil(bnd); #if 1 /* 16/VII-2013 */ /* if column upper bound has not been explicitly specified, take it as +inf */ if (!(flag[j] & 0x10)) ub = +DBL_MAX; #endif } else if (strcmp(type, "UI") == 0) { glp_set_col_kind(csa->P, j, GLP_IV); ub = floor(bnd); } else if (strcmp(type, "BV") == 0) { glp_set_col_kind(csa->P, j, GLP_IV); lb = 0.0, ub = 1.0; } else xassert(type != type); /* set new column bounds */ if (lb == -DBL_MAX && ub == +DBL_MAX) glp_set_col_bnds(csa->P, j, GLP_FR, lb, ub); else if (ub == +DBL_MAX) glp_set_col_bnds(csa->P, j, GLP_LO, lb, ub); else if (lb == -DBL_MAX) glp_set_col_bnds(csa->P, j, GLP_UP, lb, ub); else if (lb != ub) glp_set_col_bnds(csa->P, j, GLP_DB, lb, ub); else glp_set_col_bnds(csa->P, j, GLP_FX, lb, ub); flag[j] |= (char)mask; /* fields 5 and 6 must be blank */ skip_field(csa); skip_field(csa); goto loop; done: /* free working array */ xfree(flag); csa->work3 = NULL; return; } int glp_read_mps(glp_prob *P, int fmt, const glp_mpscp *parm, const char *fname) { /* read problem data in MPS format */ glp_mpscp _parm; struct csa _csa, *csa = &_csa; int ret; xprintf("Reading problem data from '%s'...\n", fname); if (!(fmt == GLP_MPS_DECK || fmt == GLP_MPS_FILE)) xerror("glp_read_mps: fmt = %d; invalid parameter\n", fmt); if (parm == NULL) glp_init_mpscp(&_parm), parm = &_parm; /* check control parameters */ check_parm("glp_read_mps", parm); /* initialize common storage area */ csa->P = P; csa->deck = (fmt == GLP_MPS_DECK); csa->parm = parm; csa->fname = fname; csa->fp = NULL; if (setjmp(csa->jump)) { ret = 1; goto done; } csa->recno = csa->recpos = 0; csa->c = '\n'; csa->fldno = 0; csa->field[0] = '\0'; csa->w80 = csa->wef = 0; csa->obj_row = 0; csa->work1 = csa->work2 = csa->work3 = NULL; /* erase problem object */ glp_erase_prob(P); glp_create_index(P); /* open input MPS file */ csa->fp = glp_open(fname, "r"); if (csa->fp == NULL) { xprintf("Unable to open '%s' - %s\n", fname, get_err_msg()); ret = 1; goto done; } /* read NAME indicator record */ read_name(csa); if (P->name != NULL) xprintf("Problem: %s\n", P->name); /* read ROWS section */ if (!(indicator(csa, 0) && strcmp(csa->field, "ROWS") == 0)) error(csa, "missing ROWS indicator record\n"); read_rows(csa); /* determine objective row */ if (parm->obj_name == NULL || parm->obj_name[0] == '\0') { /* use the first row of N type */ int i; for (i = 1; i <= P->m; i++) { if (P->row[i]->type == GLP_FR) { csa->obj_row = i; break; } } if (csa->obj_row == 0) warning(csa, "unable to determine objective row\n"); } else { /* use a row with specified name */ int i; for (i = 1; i <= P->m; i++) { xassert(P->row[i]->name != NULL); if (strcmp(parm->obj_name, P->row[i]->name) == 0) { csa->obj_row = i; break; } } if (csa->obj_row == 0) error(csa, "objective row '%s' not found\n", parm->obj_name); } if (csa->obj_row != 0) { glp_set_obj_name(P, P->row[csa->obj_row]->name); xprintf("Objective: %s\n", P->obj); } /* read COLUMNS section */ if (strcmp(csa->field, "COLUMNS") != 0) error(csa, "missing COLUMNS indicator record\n"); read_columns(csa); /* set objective coefficients */ if (csa->obj_row != 0) { GLPAIJ *aij; for (aij = P->row[csa->obj_row]->ptr; aij != NULL; aij = aij->r_next) glp_set_obj_coef(P, aij->col->j, aij->val); } /* read optional RHS section */ if (strcmp(csa->field, "RHS") == 0) read_rhs(csa); /* read optional RANGES section */ if (strcmp(csa->field, "RANGES") == 0) read_ranges(csa); /* read optional BOUNDS section */ if (strcmp(csa->field, "BOUNDS") == 0) read_bounds(csa); /* read ENDATA indicator record */ if (strcmp(csa->field, "ENDATA") != 0) error(csa, "invalid use of %s indicator record\n", csa->field); /* print some statistics */ xprintf("%d row%s, %d column%s, %d non-zero%s\n", P->m, P->m == 1 ? "" : "s", P->n, P->n == 1 ? "" : "s", P->nnz, P->nnz == 1 ? "" : "s"); if (glp_get_num_int(P) > 0) { int ni = glp_get_num_int(P); int nb = glp_get_num_bin(P); if (ni == 1) { if (nb == 0) xprintf("One variable is integer\n"); else xprintf("One variable is binary\n"); } else { xprintf("%d integer variables, ", ni); if (nb == 0) xprintf("none"); else if (nb == 1) xprintf("one"); else if (nb == ni) xprintf("all"); else xprintf("%d", nb); xprintf(" of which %s binary\n", nb == 1 ? "is" : "are"); } } xprintf("%d records were read\n", csa->recno); #if 1 /* 31/III-2016 */ /* free (unbounded) row(s) in MPS file are intended to specify * objective function(s), so all such rows can be removed */ #if 1 /* 08/VIII-2013 */ /* remove free rows */ { int i, nrs, *num; num = talloc(1+P->m, int); nrs = 0; for (i = 1; i <= P->m; i++) { if (P->row[i]->type == GLP_FR) num[++nrs] = i; } if (nrs > 0) { glp_del_rows(P, nrs, num); if (nrs == 1) xprintf("One free row was removed\n"); else xprintf("%d free rows were removed\n", nrs); } tfree(num); } #endif #else /* if objective function row is free, remove it */ if (csa->obj_row != 0 && P->row[csa->obj_row]->type == GLP_FR) { int num[1+1]; num[1] = csa->obj_row; glp_del_rows(P, 1, num); xprintf("Free objective row was removed\n"); } #endif /* problem data has been successfully read */ glp_delete_index(P); glp_sort_matrix(P); ret = 0; done: if (csa->fp != NULL) glp_close(csa->fp); if (csa->work1 != NULL) xfree(csa->work1); if (csa->work2 != NULL) xfree(csa->work2); if (csa->work3 != NULL) xfree(csa->work3); if (ret != 0) glp_erase_prob(P); return ret; } /*********************************************************************** * NAME * * glp_write_mps - write problem data in MPS format * * SYNOPSIS * * int glp_write_mps(glp_prob *P, int fmt, const glp_mpscp *parm, * const char *fname); * * DESCRIPTION * * The routine glp_write_mps writes problem data in MPS format to a * text file. * * The parameter fmt specifies the version of MPS format: * * GLP_MPS_DECK - fixed (ancient) MPS format; * GLP_MPS_FILE - free (modern) MPS format. * * The parameter parm is a pointer to the structure glp_mpscp, which * specifies control parameters used by the routine. If parm is NULL, * the routine uses default settings. * * The character string fname specifies a name of the text file to be * written. * * RETURNS * * If the operation was successful, the routine glp_read_mps returns * zero. Otherwise, it prints an error message and returns non-zero. */ #define csa csa1 struct csa { /* common storage area */ glp_prob *P; /* pointer to problem object */ int deck; /* MPS format (0 - free, 1 - fixed) */ const glp_mpscp *parm; /* pointer to control parameters */ char field[255+1]; /* field buffer */ }; static char *mps_name(struct csa *csa) { /* make problem name */ char *f; if (csa->P->name == NULL) csa->field[0] = '\0'; else if (csa->deck) { strncpy(csa->field, csa->P->name, 8); csa->field[8] = '\0'; } else strcpy(csa->field, csa->P->name); for (f = csa->field; *f != '\0'; f++) if (*f == ' ') *f = '_'; return csa->field; } static char *row_name(struct csa *csa, int i) { /* make i-th row name */ char *f; xassert(0 <= i && i <= csa->P->m); if (i == 0 || csa->P->row[i]->name == NULL || csa->deck && strlen(csa->P->row[i]->name) > 8) sprintf(csa->field, "R%07d", i); else { strcpy(csa->field, csa->P->row[i]->name); for (f = csa->field; *f != '\0'; f++) if (*f == ' ') *f = '_'; } return csa->field; } static char *col_name(struct csa *csa, int j) { /* make j-th column name */ char *f; xassert(1 <= j && j <= csa->P->n); if (csa->P->col[j]->name == NULL || csa->deck && strlen(csa->P->col[j]->name) > 8) sprintf(csa->field, "C%07d", j); else { strcpy(csa->field, csa->P->col[j]->name); for (f = csa->field; *f != '\0'; f++) if (*f == ' ') *f = '_'; } return csa->field; } static char *mps_numb(struct csa *csa, double val) { /* format floating-point number */ int dig; char *exp; for (dig = 12; dig >= 6; dig--) { if (val != 0.0 && fabs(val) < 0.002) sprintf(csa->field, "%.*E", dig-1, val); else sprintf(csa->field, "%.*G", dig, val); exp = strchr(csa->field, 'E'); if (exp != NULL) sprintf(exp+1, "%d", atoi(exp+1)); if (strlen(csa->field) <= 12) break; } xassert(strlen(csa->field) <= 12); return csa->field; } int glp_write_mps(glp_prob *P, int fmt, const glp_mpscp *parm, const char *fname) { /* write problem data in MPS format */ glp_mpscp _parm; struct csa _csa, *csa = &_csa; glp_file *fp; int out_obj, one_col = 0, empty = 0; int i, j, recno, marker, count, gap, ret; xprintf("Writing problem data to '%s'...\n", fname); if (!(fmt == GLP_MPS_DECK || fmt == GLP_MPS_FILE)) xerror("glp_write_mps: fmt = %d; invalid parameter\n", fmt); if (parm == NULL) glp_init_mpscp(&_parm), parm = &_parm; /* check control parameters */ check_parm("glp_write_mps", parm); /* initialize common storage area */ csa->P = P; csa->deck = (fmt == GLP_MPS_DECK); csa->parm = parm; /* create output MPS file */ fp = glp_open(fname, "w"), recno = 0; if (fp == NULL) { xprintf("Unable to create '%s' - %s\n", fname, get_err_msg()); ret = 1; goto done; } /* write comment records */ xfprintf(fp, "* %-*s%s\n", P->name == NULL ? 1 : 12, "Problem:", P->name == NULL ? "" : P->name), recno++; xfprintf(fp, "* %-12s%s\n", "Class:", glp_get_num_int(P) == 0 ? "LP" : "MIP"), recno++; xfprintf(fp, "* %-12s%d\n", "Rows:", P->m), recno++; if (glp_get_num_int(P) == 0) xfprintf(fp, "* %-12s%d\n", "Columns:", P->n), recno++; else xfprintf(fp, "* %-12s%d (%d integer, %d binary)\n", "Columns:", P->n, glp_get_num_int(P), glp_get_num_bin(P)), recno++; xfprintf(fp, "* %-12s%d\n", "Non-zeros:", P->nnz), recno++; xfprintf(fp, "* %-12s%s\n", "Format:", csa->deck ? "Fixed MPS" : "Free MPS"), recno++; xfprintf(fp, "*\n", recno++); /* write NAME indicator record */ xfprintf(fp, "NAME%*s%s\n", P->name == NULL ? 0 : csa->deck ? 10 : 1, "", mps_name(csa)), recno++; #if 1 /* determine whether to write the objective row */ out_obj = 1; for (i = 1; i <= P->m; i++) { if (P->row[i]->type == GLP_FR) { out_obj = 0; break; } } #endif /* write ROWS section */ xfprintf(fp, "ROWS\n"), recno++; for (i = (out_obj ? 0 : 1); i <= P->m; i++) { int type; type = (i == 0 ? GLP_FR : P->row[i]->type); if (type == GLP_FR) type = 'N'; else if (type == GLP_LO) type = 'G'; else if (type == GLP_UP) type = 'L'; else if (type == GLP_DB || type == GLP_FX) type = 'E'; else xassert(type != type); xfprintf(fp, " %c%*s%s\n", type, csa->deck ? 2 : 1, "", row_name(csa, i)), recno++; } /* write COLUMNS section */ xfprintf(fp, "COLUMNS\n"), recno++; marker = 0; for (j = 1; j <= P->n; j++) { GLPAIJ cj, *aij; int kind; kind = P->col[j]->kind; if (kind == GLP_CV) { if (marker % 2 == 1) { /* close current integer block */ marker++; xfprintf(fp, "%*sM%07d%*s'MARKER'%*s'INTEND'\n", csa->deck ? 4 : 1, "", marker, csa->deck ? 2 : 1, "", csa->deck ? 17 : 1, ""), recno++; } } else if (kind == GLP_IV) { if (marker % 2 == 0) { /* open new integer block */ marker++; xfprintf(fp, "%*sM%07d%*s'MARKER'%*s'INTORG'\n", csa->deck ? 4 : 1, "", marker, csa->deck ? 2 : 1, "", csa->deck ? 17 : 1, ""), recno++; } } else xassert(kind != kind); if (out_obj && P->col[j]->coef != 0.0) { /* make fake objective coefficient */ aij = &cj; aij->row = NULL; aij->val = P->col[j]->coef; aij->c_next = P->col[j]->ptr; } else aij = P->col[j]->ptr; #if 1 /* FIXME */ if (aij == NULL) { /* empty column */ empty++; xfprintf(fp, "%*s%-*s", csa->deck ? 4 : 1, "", csa->deck ? 8 : 1, col_name(csa, j)); /* we need a row */ xassert(P->m > 0); xfprintf(fp, "%*s%-*s", csa->deck ? 2 : 1, "", csa->deck ? 8 : 1, row_name(csa, 1)); xfprintf(fp, "%*s0%*s$ empty column\n", csa->deck ? 13 : 1, "", csa->deck ? 3 : 1, ""), recno++; } #endif count = 0; for (aij = aij; aij != NULL; aij = aij->c_next) { if (one_col || count % 2 == 0) xfprintf(fp, "%*s%-*s", csa->deck ? 4 : 1, "", csa->deck ? 8 : 1, col_name(csa, j)); gap = (one_col || count % 2 == 0 ? 2 : 3); xfprintf(fp, "%*s%-*s", csa->deck ? gap : 1, "", csa->deck ? 8 : 1, row_name(csa, aij->row == NULL ? 0 : aij->row->i)); xfprintf(fp, "%*s%*s", csa->deck ? 2 : 1, "", csa->deck ? 12 : 1, mps_numb(csa, aij->val)), count++; if (one_col || count % 2 == 0) xfprintf(fp, "\n"), recno++; } if (!(one_col || count % 2 == 0)) xfprintf(fp, "\n"), recno++; } if (marker % 2 == 1) { /* close last integer block */ marker++; xfprintf(fp, "%*sM%07d%*s'MARKER'%*s'INTEND'\n", csa->deck ? 4 : 1, "", marker, csa->deck ? 2 : 1, "", csa->deck ? 17 : 1, ""), recno++; } #if 1 if (empty > 0) xprintf("Warning: problem has %d empty column(s)\n", empty); #endif /* write RHS section */ xfprintf(fp, "RHS\n"), recno++; count = 0; for (i = (out_obj ? 0 : 1); i <= P->m; i++) { int type; double rhs; if (i == 0) rhs = P->c0; else { type = P->row[i]->type; if (type == GLP_FR) rhs = 0.0; else if (type == GLP_LO) rhs = P->row[i]->lb; else if (type == GLP_UP) rhs = P->row[i]->ub; else if (type == GLP_DB || type == GLP_FX) rhs = P->row[i]->lb; else xassert(type != type); } if (rhs != 0.0) { if (one_col || count % 2 == 0) xfprintf(fp, "%*s%-*s", csa->deck ? 4 : 1, "", csa->deck ? 8 : 1, "RHS1"); gap = (one_col || count % 2 == 0 ? 2 : 3); xfprintf(fp, "%*s%-*s", csa->deck ? gap : 1, "", csa->deck ? 8 : 1, row_name(csa, i)); xfprintf(fp, "%*s%*s", csa->deck ? 2 : 1, "", csa->deck ? 12 : 1, mps_numb(csa, rhs)), count++; if (one_col || count % 2 == 0) xfprintf(fp, "\n"), recno++; } } if (!(one_col || count % 2 == 0)) xfprintf(fp, "\n"), recno++; /* write RANGES section */ for (i = P->m; i >= 1; i--) if (P->row[i]->type == GLP_DB) break; if (i == 0) goto bnds; xfprintf(fp, "RANGES\n"), recno++; count = 0; for (i = 1; i <= P->m; i++) { if (P->row[i]->type == GLP_DB) { if (one_col || count % 2 == 0) xfprintf(fp, "%*s%-*s", csa->deck ? 4 : 1, "", csa->deck ? 8 : 1, "RNG1"); gap = (one_col || count % 2 == 0 ? 2 : 3); xfprintf(fp, "%*s%-*s", csa->deck ? gap : 1, "", csa->deck ? 8 : 1, row_name(csa, i)); xfprintf(fp, "%*s%*s", csa->deck ? 2 : 1, "", csa->deck ? 12 : 1, mps_numb(csa, P->row[i]->ub - P->row[i]->lb)), count++; if (one_col || count % 2 == 0) xfprintf(fp, "\n"), recno++; } } if (!(one_col || count % 2 == 0)) xfprintf(fp, "\n"), recno++; bnds: /* write BOUNDS section */ for (j = P->n; j >= 1; j--) if (!(P->col[j]->kind == GLP_CV && P->col[j]->type == GLP_LO && P->col[j]->lb == 0.0)) break; if (j == 0) goto endt; xfprintf(fp, "BOUNDS\n"), recno++; for (j = 1; j <= P->n; j++) { int type, data[2]; double bnd[2]; char *spec[2]; spec[0] = spec[1] = NULL; type = P->col[j]->type; if (type == GLP_FR) spec[0] = "FR", data[0] = 0; else if (type == GLP_LO) { if (P->col[j]->lb != 0.0) spec[0] = "LO", data[0] = 1, bnd[0] = P->col[j]->lb; if (P->col[j]->kind == GLP_IV) spec[1] = "PL", data[1] = 0; } else if (type == GLP_UP) { spec[0] = "MI", data[0] = 0; spec[1] = "UP", data[1] = 1, bnd[1] = P->col[j]->ub; } else if (type == GLP_DB) { if (P->col[j]->lb != 0.0) spec[0] = "LO", data[0] = 1, bnd[0] = P->col[j]->lb; spec[1] = "UP", data[1] = 1, bnd[1] = P->col[j]->ub; } else if (type == GLP_FX) spec[0] = "FX", data[0] = 1, bnd[0] = P->col[j]->lb; else xassert(type != type); for (i = 0; i <= 1; i++) { if (spec[i] != NULL) { xfprintf(fp, " %s %-*s%*s%-*s", spec[i], csa->deck ? 8 : 1, "BND1", csa->deck ? 2 : 1, "", csa->deck ? 8 : 1, col_name(csa, j)); if (data[i]) xfprintf(fp, "%*s%*s", csa->deck ? 2 : 1, "", csa->deck ? 12 : 1, mps_numb(csa, bnd[i])); xfprintf(fp, "\n"), recno++; } } } endt: /* write ENDATA indicator record */ xfprintf(fp, "ENDATA\n"), recno++; #if 0 /* FIXME */ xfflush(fp); #endif if (glp_ioerr(fp)) { xprintf("Write error on '%s' - %s\n", fname, get_err_msg()); ret = 1; goto done; } /* problem data has been successfully written */ xprintf("%d records were written\n", recno); ret = 0; done: if (fp != NULL) glp_close(fp); return ret; } /* eof */ glpk-5.0/src/api/netgen.c0000644000062000006210000000077113766346220014473 0ustar maomkpasswd/* netgen.c */ #include "env.h" #include "glpk.h" int glp_netgen(glp_graph *G_, int v_rhs_, int a_cap_, int a_cost_, const int parm[1+15]) { static const char func[] = "glp_netgen"; xassert(G_ == G_); xassert(v_rhs_ == v_rhs_); xassert(a_cap_ == a_cap_); xassert(a_cost_ == a_cost_); xassert(parm == parm); xerror("%s: sorry, this routine is temporarily disabled due to li" "censing problems\n", func); abort(); return -1; } /* eof */ glpk-5.0/src/api/npp.c0000644000062000006210000001230113766346220014000 0ustar maomkpasswd/* npp.c (LP/MIP preprocessing) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2017 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "npp.h" glp_prep *glp_npp_alloc_wksp(void) { /* allocate the preprocessor workspace */ glp_prep *prep; prep = npp_create_wksp(); return prep; } void glp_npp_load_prob(glp_prep *prep, glp_prob *P, int sol, int names) { /* load original problem instance */ if (prep->sol != 0) xerror("glp_npp_load_prob: invalid call sequence (original ins" "tance already loaded)\n"); if (!(sol == GLP_SOL || sol == GLP_IPT || sol == GLP_MIP)) xerror("glp_npp_load_prob: sol = %d; invalid parameter\n", sol); if (!(names == GLP_ON || names == GLP_OFF)) xerror("glp_npp_load_prob: names = %d; invalid parameter\n", names); npp_load_prob(prep, P, names, sol, GLP_OFF); return; } int glp_npp_preprocess1(glp_prep *prep, int hard) { /* perform basic LP/MIP preprocessing */ if (prep->sol == 0) xerror("glp_npp_preprocess1: invalid call sequence (original i" "nstance not loaded yet)\n"); if (prep->pool == NULL) xerror("glp_npp_preprocess1: invalid call sequence (preprocess" "ing already finished)\n"); if (!(hard == GLP_ON || hard == GLP_OFF)) xerror("glp_npp_preprocess1: hard = %d; invalid parameter\n", hard); return npp_process_prob(prep, hard); } void glp_npp_build_prob(glp_prep *prep, glp_prob *Q) { /* build resultant problem instance */ if (prep->sol == 0) xerror("glp_npp_build_prob: invalid call sequence (original in" "stance not loaded yet)\n"); if (prep->pool == NULL) xerror("glp_npp_build_prob: invalid call sequence (resultant i" "nstance already built)\n"); npp_build_prob(prep, Q); return; } void glp_npp_postprocess(glp_prep *prep, glp_prob *Q) { /* postprocess solution to resultant problem */ if (prep->pool != NULL) xerror("glp_npp_postprocess: invalid call sequence (resultant " "instance not built yet)\n"); if (!(prep->m == Q->m && prep->n == Q->n && prep->nnz == Q->nnz)) xerror("glp_npp_postprocess: resultant instance mismatch\n"); switch (prep->sol) { case GLP_SOL: if (glp_get_status(Q) != GLP_OPT) xerror("glp_npp_postprocess: unable to recover non-optim" "al basic solution\n"); break; case GLP_IPT: if (glp_ipt_status(Q) != GLP_OPT) xerror("glp_npp_postprocess: unable to recover non-optim" "al interior-point solution\n"); break; case GLP_MIP: if (!(glp_mip_status(Q) == GLP_OPT || glp_mip_status(Q) == GLP_FEAS)) xerror("glp_npp_postprocess: unable to recover integer n" "on-feasible solution\n"); break; default: xassert(prep != prep); } npp_postprocess(prep, Q); return; } void glp_npp_obtain_sol(glp_prep *prep, glp_prob *P) { /* obtain solution to original problem */ if (prep->pool != NULL) xerror("glp_npp_obtain_sol: invalid call sequence (resultant i" "nstance not built yet)\n"); switch (prep->sol) { case GLP_SOL: if (prep->p_stat == 0 || prep->d_stat == 0) xerror("glp_npp_obtain_sol: invalid call sequence (basic" " solution not provided yet)\n"); break; case GLP_IPT: if (prep->t_stat == 0) xerror("glp_npp_obtain_sol: invalid call sequence (inter" "ior-point solution not provided yet)\n"); break; case GLP_MIP: if (prep->i_stat == 0) xerror("glp_npp_obtain_sol: invalid call sequence (MIP s" "olution not provided yet)\n"); break; default: xassert(prep != prep); } if (!(prep->orig_dir == P->dir && prep->orig_m == P->m && prep->orig_n == P->n && prep->orig_nnz == P->nnz)) xerror("glp_npp_obtain_sol: original instance mismatch\n"); npp_unload_sol(prep, P); return; } void glp_npp_free_wksp(glp_prep *prep) { /* free the preprocessor workspace */ npp_delete_wksp(prep); return; } /* eof */ glpk-5.0/src/api/pript.c0000644000062000006210000001653313766346220014354 0ustar maomkpasswd/* pript.c (write interior-point solution in printable format) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2009-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "prob.h" #define xfprintf glp_format int glp_print_ipt(glp_prob *P, const char *fname) { /* write interior-point solution in printable format */ glp_file *fp; GLPROW *row; GLPCOL *col; int i, j, t, ae_ind, re_ind, ret; double ae_max, re_max; xprintf("Writing interior-point solution to '%s'...\n", fname); fp = glp_open(fname, "w"); if (fp == NULL) { xprintf("Unable to create '%s' - %s\n", fname, get_err_msg()); ret = 1; goto done; } xfprintf(fp, "%-12s%s\n", "Problem:", P->name == NULL ? "" : P->name); xfprintf(fp, "%-12s%d\n", "Rows:", P->m); xfprintf(fp, "%-12s%d\n", "Columns:", P->n); xfprintf(fp, "%-12s%d\n", "Non-zeros:", P->nnz); t = glp_ipt_status(P); xfprintf(fp, "%-12s%s\n", "Status:", t == GLP_OPT ? "OPTIMAL" : t == GLP_UNDEF ? "UNDEFINED" : t == GLP_INFEAS ? "INFEASIBLE (INTERMEDIATE)" : t == GLP_NOFEAS ? "INFEASIBLE (FINAL)" : "???"); xfprintf(fp, "%-12s%s%s%.10g (%s)\n", "Objective:", P->obj == NULL ? "" : P->obj, P->obj == NULL ? "" : " = ", P->ipt_obj, P->dir == GLP_MIN ? "MINimum" : P->dir == GLP_MAX ? "MAXimum" : "???"); xfprintf(fp, "\n"); xfprintf(fp, " No. Row name Activity Lower bound " " Upper bound Marginal\n"); xfprintf(fp, "------ ------------ ------------- ------------- " "------------- -------------\n"); for (i = 1; i <= P->m; i++) { row = P->row[i]; xfprintf(fp, "%6d ", i); if (row->name == NULL || strlen(row->name) <= 12) xfprintf(fp, "%-12s ", row->name == NULL ? "" : row->name); else xfprintf(fp, "%s\n%20s", row->name, ""); xfprintf(fp, "%3s", ""); xfprintf(fp, "%13.6g ", fabs(row->pval) <= 1e-9 ? 0.0 : row->pval); if (row->type == GLP_LO || row->type == GLP_DB || row->type == GLP_FX) xfprintf(fp, "%13.6g ", row->lb); else xfprintf(fp, "%13s ", ""); if (row->type == GLP_UP || row->type == GLP_DB) xfprintf(fp, "%13.6g ", row->ub); else xfprintf(fp, "%13s ", row->type == GLP_FX ? "=" : ""); if (fabs(row->dval) <= 1e-9) xfprintf(fp, "%13s", "< eps"); else xfprintf(fp, "%13.6g ", row->dval); xfprintf(fp, "\n"); } xfprintf(fp, "\n"); xfprintf(fp, " No. Column name Activity Lower bound " " Upper bound Marginal\n"); xfprintf(fp, "------ ------------ ------------- ------------- " "------------- -------------\n"); for (j = 1; j <= P->n; j++) { col = P->col[j]; xfprintf(fp, "%6d ", j); if (col->name == NULL || strlen(col->name) <= 12) xfprintf(fp, "%-12s ", col->name == NULL ? "" : col->name); else xfprintf(fp, "%s\n%20s", col->name, ""); xfprintf(fp, "%3s", ""); xfprintf(fp, "%13.6g ", fabs(col->pval) <= 1e-9 ? 0.0 : col->pval); if (col->type == GLP_LO || col->type == GLP_DB || col->type == GLP_FX) xfprintf(fp, "%13.6g ", col->lb); else xfprintf(fp, "%13s ", ""); if (col->type == GLP_UP || col->type == GLP_DB) xfprintf(fp, "%13.6g ", col->ub); else xfprintf(fp, "%13s ", col->type == GLP_FX ? "=" : ""); if (fabs(col->dval) <= 1e-9) xfprintf(fp, "%13s", "< eps"); else xfprintf(fp, "%13.6g ", col->dval); xfprintf(fp, "\n"); } xfprintf(fp, "\n"); xfprintf(fp, "Karush-Kuhn-Tucker optimality conditions:\n"); xfprintf(fp, "\n"); glp_check_kkt(P, GLP_IPT, GLP_KKT_PE, &ae_max, &ae_ind, &re_max, &re_ind); xfprintf(fp, "KKT.PE: max.abs.err = %.2e on row %d\n", ae_max, ae_ind); xfprintf(fp, " max.rel.err = %.2e on row %d\n", re_max, re_ind); xfprintf(fp, "%8s%s\n", "", re_max <= 1e-9 ? "High quality" : re_max <= 1e-6 ? "Medium quality" : re_max <= 1e-3 ? "Low quality" : "PRIMAL SOLUTION IS WRONG"); xfprintf(fp, "\n"); glp_check_kkt(P, GLP_IPT, GLP_KKT_PB, &ae_max, &ae_ind, &re_max, &re_ind); xfprintf(fp, "KKT.PB: max.abs.err = %.2e on %s %d\n", ae_max, ae_ind <= P->m ? "row" : "column", ae_ind <= P->m ? ae_ind : ae_ind - P->m); xfprintf(fp, " max.rel.err = %.2e on %s %d\n", re_max, re_ind <= P->m ? "row" : "column", re_ind <= P->m ? re_ind : re_ind - P->m); xfprintf(fp, "%8s%s\n", "", re_max <= 1e-9 ? "High quality" : re_max <= 1e-6 ? "Medium quality" : re_max <= 1e-3 ? "Low quality" : "PRIMAL SOLUTION IS INFEASIBL" "E"); xfprintf(fp, "\n"); glp_check_kkt(P, GLP_IPT, GLP_KKT_DE, &ae_max, &ae_ind, &re_max, &re_ind); xfprintf(fp, "KKT.DE: max.abs.err = %.2e on column %d\n", ae_max, ae_ind == 0 ? 0 : ae_ind - P->m); xfprintf(fp, " max.rel.err = %.2e on column %d\n", re_max, re_ind == 0 ? 0 : re_ind - P->m); xfprintf(fp, "%8s%s\n", "", re_max <= 1e-9 ? "High quality" : re_max <= 1e-6 ? "Medium quality" : re_max <= 1e-3 ? "Low quality" : "DUAL SOLUTION IS WRONG"); xfprintf(fp, "\n"); glp_check_kkt(P, GLP_IPT, GLP_KKT_DB, &ae_max, &ae_ind, &re_max, &re_ind); xfprintf(fp, "KKT.DB: max.abs.err = %.2e on %s %d\n", ae_max, ae_ind <= P->m ? "row" : "column", ae_ind <= P->m ? ae_ind : ae_ind - P->m); xfprintf(fp, " max.rel.err = %.2e on %s %d\n", re_max, re_ind <= P->m ? "row" : "column", re_ind <= P->m ? re_ind : re_ind - P->m); xfprintf(fp, "%8s%s\n", "", re_max <= 1e-9 ? "High quality" : re_max <= 1e-6 ? "Medium quality" : re_max <= 1e-3 ? "Low quality" : "DUAL SOLUTION IS INFEASIBLE") ; xfprintf(fp, "\n"); xfprintf(fp, "End of output\n"); #if 0 /* FIXME */ xfflush(fp); #endif if (glp_ioerr(fp)) { xprintf("Write error on '%s' - %s\n", fname, get_err_msg()); ret = 1; goto done; } ret = 0; done: if (fp != NULL) glp_close(fp); return ret; } /* eof */ glpk-5.0/src/api/prmip.c0000644000062000006210000001366113766346220014344 0ustar maomkpasswd/* prmip.c (write MIP solution in printable format) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2009-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "prob.h" #define xfprintf glp_format int glp_print_mip(glp_prob *P, const char *fname) { /* write MIP solution in printable format */ glp_file *fp; GLPROW *row; GLPCOL *col; int i, j, t, ae_ind, re_ind, ret; double ae_max, re_max; xprintf("Writing MIP solution to '%s'...\n", fname); fp = glp_open(fname, "w"); if (fp == NULL) { xprintf("Unable to create '%s' - %s\n", fname, get_err_msg()); ret = 1; goto done; } xfprintf(fp, "%-12s%s\n", "Problem:", P->name == NULL ? "" : P->name); xfprintf(fp, "%-12s%d\n", "Rows:", P->m); xfprintf(fp, "%-12s%d (%d integer, %d binary)\n", "Columns:", P->n, glp_get_num_int(P), glp_get_num_bin(P)); xfprintf(fp, "%-12s%d\n", "Non-zeros:", P->nnz); t = glp_mip_status(P); xfprintf(fp, "%-12s%s\n", "Status:", t == GLP_OPT ? "INTEGER OPTIMAL" : t == GLP_FEAS ? "INTEGER NON-OPTIMAL" : t == GLP_NOFEAS ? "INTEGER EMPTY" : t == GLP_UNDEF ? "INTEGER UNDEFINED" : "???"); xfprintf(fp, "%-12s%s%s%.10g (%s)\n", "Objective:", P->obj == NULL ? "" : P->obj, P->obj == NULL ? "" : " = ", P->mip_obj, P->dir == GLP_MIN ? "MINimum" : P->dir == GLP_MAX ? "MAXimum" : "???"); xfprintf(fp, "\n"); xfprintf(fp, " No. Row name Activity Lower bound " " Upper bound\n"); xfprintf(fp, "------ ------------ ------------- ------------- " "-------------\n"); for (i = 1; i <= P->m; i++) { row = P->row[i]; xfprintf(fp, "%6d ", i); if (row->name == NULL || strlen(row->name) <= 12) xfprintf(fp, "%-12s ", row->name == NULL ? "" : row->name); else xfprintf(fp, "%s\n%20s", row->name, ""); xfprintf(fp, "%3s", ""); xfprintf(fp, "%13.6g ", fabs(row->mipx) <= 1e-9 ? 0.0 : row->mipx); if (row->type == GLP_LO || row->type == GLP_DB || row->type == GLP_FX) xfprintf(fp, "%13.6g ", row->lb); else xfprintf(fp, "%13s ", ""); if (row->type == GLP_UP || row->type == GLP_DB) xfprintf(fp, "%13.6g ", row->ub); else xfprintf(fp, "%13s ", row->type == GLP_FX ? "=" : ""); xfprintf(fp, "\n"); } xfprintf(fp, "\n"); xfprintf(fp, " No. Column name Activity Lower bound " " Upper bound\n"); xfprintf(fp, "------ ------------ ------------- ------------- " "-------------\n"); for (j = 1; j <= P->n; j++) { col = P->col[j]; xfprintf(fp, "%6d ", j); if (col->name == NULL || strlen(col->name) <= 12) xfprintf(fp, "%-12s ", col->name == NULL ? "" : col->name); else xfprintf(fp, "%s\n%20s", col->name, ""); xfprintf(fp, "%s ", col->kind == GLP_CV ? " " : col->kind == GLP_IV ? "*" : "?"); xfprintf(fp, "%13.6g ", fabs(col->mipx) <= 1e-9 ? 0.0 : col->mipx); if (col->type == GLP_LO || col->type == GLP_DB || col->type == GLP_FX) xfprintf(fp, "%13.6g ", col->lb); else xfprintf(fp, "%13s ", ""); if (col->type == GLP_UP || col->type == GLP_DB) xfprintf(fp, "%13.6g ", col->ub); else xfprintf(fp, "%13s ", col->type == GLP_FX ? "=" : ""); xfprintf(fp, "\n"); } xfprintf(fp, "\n"); xfprintf(fp, "Integer feasibility conditions:\n"); xfprintf(fp, "\n"); glp_check_kkt(P, GLP_MIP, GLP_KKT_PE, &ae_max, &ae_ind, &re_max, &re_ind); xfprintf(fp, "KKT.PE: max.abs.err = %.2e on row %d\n", ae_max, ae_ind); xfprintf(fp, " max.rel.err = %.2e on row %d\n", re_max, re_ind); xfprintf(fp, "%8s%s\n", "", re_max <= 1e-9 ? "High quality" : re_max <= 1e-6 ? "Medium quality" : re_max <= 1e-3 ? "Low quality" : "SOLUTION IS WRONG"); xfprintf(fp, "\n"); glp_check_kkt(P, GLP_MIP, GLP_KKT_PB, &ae_max, &ae_ind, &re_max, &re_ind); xfprintf(fp, "KKT.PB: max.abs.err = %.2e on %s %d\n", ae_max, ae_ind <= P->m ? "row" : "column", ae_ind <= P->m ? ae_ind : ae_ind - P->m); xfprintf(fp, " max.rel.err = %.2e on %s %d\n", re_max, re_ind <= P->m ? "row" : "column", re_ind <= P->m ? re_ind : re_ind - P->m); xfprintf(fp, "%8s%s\n", "", re_max <= 1e-9 ? "High quality" : re_max <= 1e-6 ? "Medium quality" : re_max <= 1e-3 ? "Low quality" : "SOLUTION IS INFEASIBLE"); xfprintf(fp, "\n"); xfprintf(fp, "End of output\n"); #if 0 /* FIXME */ xfflush(fp); #endif if (glp_ioerr(fp)) { xprintf("Write error on '%s' - %s\n", fname, get_err_msg()); ret = 1; goto done; } ret = 0; done: if (fp != NULL) glp_close(fp); return ret; } /* eof */ glpk-5.0/src/api/prob.h0000644000062000006210000002562713766346220014171 0ustar maomkpasswd/* prob.h (LP/MIP problem object) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2000-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef PROB_H #define PROB_H #include "avl.h" #include "bfd.h" #include "dmp.h" #if 1 /* 28/III-2016 */ #define GLP_UNDOC 1 #endif #include "glpk.h" typedef struct GLPROW GLPROW; typedef struct GLPCOL GLPCOL; typedef struct GLPAIJ GLPAIJ; #if 0 /* 04/IV-2016 */ #define GLP_PROB_MAGIC 0xD7D9D6C2 #endif struct glp_prob { /* LP/MIP problem object */ #if 0 /* 04/IV-2016 */ unsigned magic; /* magic value used for debugging */ #endif DMP *pool; /* memory pool to store problem object components */ glp_tree *tree; /* pointer to the search tree; set by the MIP solver when this object is used in the tree as a core MIP object */ #if 0 /* 08/III-2014 */ void *parms; /* reserved for backward compatibility */ #endif /*--------------------------------------------------------------*/ /* LP/MIP data */ char *name; /* problem name (1 to 255 chars); NULL means no name is assigned to the problem */ char *obj; /* objective function name (1 to 255 chars); NULL means no name is assigned to the objective function */ int dir; /* optimization direction flag (objective "sense"): GLP_MIN - minimization GLP_MAX - maximization */ double c0; /* constant term of the objective function ("shift") */ int m_max; /* length of the array of rows (enlarged automatically) */ int n_max; /* length of the array of columns (enlarged automatically) */ int m; /* number of rows, 0 <= m <= m_max */ int n; /* number of columns, 0 <= n <= n_max */ int nnz; /* number of non-zero constraint coefficients, nnz >= 0 */ GLPROW **row; /* GLPROW *row[1+m_max]; */ /* row[i], 1 <= i <= m, is a pointer to i-th row */ GLPCOL **col; /* GLPCOL *col[1+n_max]; */ /* col[j], 1 <= j <= n, is a pointer to j-th column */ AVL *r_tree; /* row index to find rows by their names; NULL means this index does not exist */ AVL *c_tree; /* column index to find columns by their names; NULL means this index does not exist */ /*--------------------------------------------------------------*/ /* basis factorization (LP) */ int valid; /* the factorization is valid only if this flag is set */ int *head; /* int head[1+m_max]; */ /* basis header (valid only if the factorization is valid); head[i] = k is the ordinal number of auxiliary (1 <= k <= m) or structural (m+1 <= k <= m+n) variable which corresponds to i-th basic variable xB[i], 1 <= i <= m */ #if 0 /* 08/III-2014 */ glp_bfcp *bfcp; /* basis factorization control parameters; may be NULL */ #endif BFD *bfd; /* BFD bfd[1:m,1:m]; */ /* basis factorization driver; may be NULL */ /*--------------------------------------------------------------*/ /* basic solution (LP) */ int pbs_stat; /* primal basic solution status: GLP_UNDEF - primal solution is undefined GLP_FEAS - primal solution is feasible GLP_INFEAS - primal solution is infeasible GLP_NOFEAS - no primal feasible solution exists */ int dbs_stat; /* dual basic solution status: GLP_UNDEF - dual solution is undefined GLP_FEAS - dual solution is feasible GLP_INFEAS - dual solution is infeasible GLP_NOFEAS - no dual feasible solution exists */ double obj_val; /* objective function value */ int it_cnt; /* simplex method iteration count; increases by one on performing one simplex iteration */ int some; /* ordinal number of some auxiliary or structural variable having certain property, 0 <= some <= m+n */ /*--------------------------------------------------------------*/ /* interior-point solution (LP) */ int ipt_stat; /* interior-point solution status: GLP_UNDEF - interior solution is undefined GLP_OPT - interior solution is optimal GLP_INFEAS - interior solution is infeasible GLP_NOFEAS - no feasible solution exists */ double ipt_obj; /* objective function value */ /*--------------------------------------------------------------*/ /* integer solution (MIP) */ int mip_stat; /* integer solution status: GLP_UNDEF - integer solution is undefined GLP_OPT - integer solution is optimal GLP_FEAS - integer solution is feasible GLP_NOFEAS - no integer solution exists */ double mip_obj; /* objective function value */ }; struct GLPROW { /* LP/MIP row (auxiliary variable) */ int i; /* ordinal number (1 to m) assigned to this row */ char *name; /* row name (1 to 255 chars); NULL means no name is assigned to this row */ AVLNODE *node; /* pointer to corresponding node in the row index; NULL means that either the row index does not exist or this row has no name assigned */ #if 1 /* 20/IX-2008 */ int level; unsigned char origin; unsigned char klass; #endif int type; /* type of the auxiliary variable: GLP_FR - free variable GLP_LO - variable with lower bound GLP_UP - variable with upper bound GLP_DB - double-bounded variable GLP_FX - fixed variable */ double lb; /* non-scaled */ /* lower bound; if the row has no lower bound, lb is zero */ double ub; /* non-scaled */ /* upper bound; if the row has no upper bound, ub is zero */ /* if the row type is GLP_FX, ub is equal to lb */ GLPAIJ *ptr; /* non-scaled */ /* pointer to doubly linked list of constraint coefficients which are placed in this row */ double rii; /* diagonal element r[i,i] of scaling matrix R for this row; if the scaling is not used, r[i,i] is 1 */ int stat; /* status of the auxiliary variable: GLP_BS - basic variable GLP_NL - non-basic variable on lower bound GLP_NU - non-basic variable on upper bound GLP_NF - non-basic free variable GLP_NS - non-basic fixed variable */ int bind; /* if the auxiliary variable is basic, head[bind] refers to this row, otherwise, bind is 0; this attribute is valid only if the basis factorization is valid */ double prim; /* non-scaled */ /* primal value of the auxiliary variable in basic solution */ double dual; /* non-scaled */ /* dual value of the auxiliary variable in basic solution */ double pval; /* non-scaled */ /* primal value of the auxiliary variable in interior solution */ double dval; /* non-scaled */ /* dual value of the auxiliary variable in interior solution */ double mipx; /* non-scaled */ /* primal value of the auxiliary variable in integer solution */ }; struct GLPCOL { /* LP/MIP column (structural variable) */ int j; /* ordinal number (1 to n) assigned to this column */ char *name; /* column name (1 to 255 chars); NULL means no name is assigned to this column */ AVLNODE *node; /* pointer to corresponding node in the column index; NULL means that either the column index does not exist or the column has no name assigned */ int kind; /* kind of the structural variable: GLP_CV - continuous variable GLP_IV - integer or binary variable */ int type; /* type of the structural variable: GLP_FR - free variable GLP_LO - variable with lower bound GLP_UP - variable with upper bound GLP_DB - double-bounded variable GLP_FX - fixed variable */ double lb; /* non-scaled */ /* lower bound; if the column has no lower bound, lb is zero */ double ub; /* non-scaled */ /* upper bound; if the column has no upper bound, ub is zero */ /* if the column type is GLP_FX, ub is equal to lb */ double coef; /* non-scaled */ /* objective coefficient at the structural variable */ GLPAIJ *ptr; /* non-scaled */ /* pointer to doubly linked list of constraint coefficients which are placed in this column */ double sjj; /* diagonal element s[j,j] of scaling matrix S for this column; if the scaling is not used, s[j,j] is 1 */ int stat; /* status of the structural variable: GLP_BS - basic variable GLP_NL - non-basic variable on lower bound GLP_NU - non-basic variable on upper bound GLP_NF - non-basic free variable GLP_NS - non-basic fixed variable */ int bind; /* if the structural variable is basic, head[bind] refers to this column; otherwise, bind is 0; this attribute is valid only if the basis factorization is valid */ double prim; /* non-scaled */ /* primal value of the structural variable in basic solution */ double dual; /* non-scaled */ /* dual value of the structural variable in basic solution */ double pval; /* non-scaled */ /* primal value of the structural variable in interior solution */ double dval; /* non-scaled */ /* dual value of the structural variable in interior solution */ double mipx; /* non-scaled */ /* primal value of the structural variable in integer solution */ }; struct GLPAIJ { /* constraint coefficient a[i,j] */ GLPROW *row; /* pointer to row, where this coefficient is placed */ GLPCOL *col; /* pointer to column, where this coefficient is placed */ double val; /* numeric (non-zero) value of this coefficient */ GLPAIJ *r_prev; /* pointer to previous coefficient in the same row */ GLPAIJ *r_next; /* pointer to next coefficient in the same row */ GLPAIJ *c_prev; /* pointer to previous coefficient in the same column */ GLPAIJ *c_next; /* pointer to next coefficient in the same column */ }; #endif /* eof */ glpk-5.0/src/api/prob1.c0000644000062000006210000014742413766346220014245 0ustar maomkpasswd/* prob1.c (problem creating and modifying routines) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2000-2018 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "ios.h" /* CAUTION: DO NOT CHANGE THE LIMITS BELOW */ #define M_MAX 100000000 /* = 100*10^6 */ /* maximal number of rows in the problem object */ #define N_MAX 100000000 /* = 100*10^6 */ /* maximal number of columns in the problem object */ #define NNZ_MAX 500000000 /* = 500*10^6 */ /* maximal number of constraint coefficients in the problem object */ /*********************************************************************** * NAME * * glp_create_prob - create problem object * * SYNOPSIS * * glp_prob *glp_create_prob(void); * * DESCRIPTION * * The routine glp_create_prob creates a new problem object, which is * initially "empty", i.e. has no rows and columns. * * RETURNS * * The routine returns a pointer to the object created, which should be * used in any subsequent operations on this object. */ static void create_prob(glp_prob *lp) #if 0 /* 04/IV-2016 */ { lp->magic = GLP_PROB_MAGIC; #else { #endif lp->pool = dmp_create_pool(); #if 0 /* 08/III-2014 */ #if 0 /* 17/XI-2009 */ lp->cps = xmalloc(sizeof(struct LPXCPS)); lpx_reset_parms(lp); #else lp->parms = NULL; #endif #endif lp->tree = NULL; #if 0 lp->lwa = 0; lp->cwa = NULL; #endif /* LP/MIP data */ lp->name = NULL; lp->obj = NULL; lp->dir = GLP_MIN; lp->c0 = 0.0; lp->m_max = 100; lp->n_max = 200; lp->m = lp->n = 0; lp->nnz = 0; lp->row = xcalloc(1+lp->m_max, sizeof(GLPROW *)); lp->col = xcalloc(1+lp->n_max, sizeof(GLPCOL *)); lp->r_tree = lp->c_tree = NULL; /* basis factorization */ lp->valid = 0; lp->head = xcalloc(1+lp->m_max, sizeof(int)); #if 0 /* 08/III-2014 */ lp->bfcp = NULL; #endif lp->bfd = NULL; /* basic solution (LP) */ lp->pbs_stat = lp->dbs_stat = GLP_UNDEF; lp->obj_val = 0.0; lp->it_cnt = 0; lp->some = 0; /* interior-point solution (LP) */ lp->ipt_stat = GLP_UNDEF; lp->ipt_obj = 0.0; /* integer solution (MIP) */ lp->mip_stat = GLP_UNDEF; lp->mip_obj = 0.0; return; } glp_prob *glp_create_prob(void) { glp_prob *lp; lp = xmalloc(sizeof(glp_prob)); create_prob(lp); return lp; } /*********************************************************************** * NAME * * glp_set_prob_name - assign (change) problem name * * SYNOPSIS * * void glp_set_prob_name(glp_prob *lp, const char *name); * * DESCRIPTION * * The routine glp_set_prob_name assigns a given symbolic name (1 up to * 255 characters) to the specified problem object. * * If the parameter name is NULL or empty string, the routine erases an * existing symbolic name of the problem object. */ void glp_set_prob_name(glp_prob *lp, const char *name) { glp_tree *tree = lp->tree; if (tree != NULL && tree->reason != 0) xerror("glp_set_prob_name: operation not allowed\n"); if (lp->name != NULL) { dmp_free_atom(lp->pool, lp->name, strlen(lp->name)+1); lp->name = NULL; } if (!(name == NULL || name[0] == '\0')) { int k; for (k = 0; name[k] != '\0'; k++) { if (k == 256) xerror("glp_set_prob_name: problem name too long\n"); if (iscntrl((unsigned char)name[k])) xerror("glp_set_prob_name: problem name contains invalid" " character(s)\n"); } lp->name = dmp_get_atom(lp->pool, strlen(name)+1); strcpy(lp->name, name); } return; } /*********************************************************************** * NAME * * glp_set_obj_name - assign (change) objective function name * * SYNOPSIS * * void glp_set_obj_name(glp_prob *lp, const char *name); * * DESCRIPTION * * The routine glp_set_obj_name assigns a given symbolic name (1 up to * 255 characters) to the objective function of the specified problem * object. * * If the parameter name is NULL or empty string, the routine erases an * existing name of the objective function. */ void glp_set_obj_name(glp_prob *lp, const char *name) { glp_tree *tree = lp->tree; if (tree != NULL && tree->reason != 0) xerror("glp_set_obj_name: operation not allowed\n"); if (lp->obj != NULL) { dmp_free_atom(lp->pool, lp->obj, strlen(lp->obj)+1); lp->obj = NULL; } if (!(name == NULL || name[0] == '\0')) { int k; for (k = 0; name[k] != '\0'; k++) { if (k == 256) xerror("glp_set_obj_name: objective name too long\n"); if (iscntrl((unsigned char)name[k])) xerror("glp_set_obj_name: objective name contains invali" "d character(s)\n"); } lp->obj = dmp_get_atom(lp->pool, strlen(name)+1); strcpy(lp->obj, name); } return; } /*********************************************************************** * NAME * * glp_set_obj_dir - set (change) optimization direction flag * * SYNOPSIS * * void glp_set_obj_dir(glp_prob *lp, int dir); * * DESCRIPTION * * The routine glp_set_obj_dir sets (changes) optimization direction * flag (i.e. "sense" of the objective function) as specified by the * parameter dir: * * GLP_MIN - minimization; * GLP_MAX - maximization. */ void glp_set_obj_dir(glp_prob *lp, int dir) { glp_tree *tree = lp->tree; if (tree != NULL && tree->reason != 0) xerror("glp_set_obj_dir: operation not allowed\n"); if (!(dir == GLP_MIN || dir == GLP_MAX)) xerror("glp_set_obj_dir: dir = %d; invalid direction flag\n", dir); lp->dir = dir; return; } /*********************************************************************** * NAME * * glp_add_rows - add new rows to problem object * * SYNOPSIS * * int glp_add_rows(glp_prob *lp, int nrs); * * DESCRIPTION * * The routine glp_add_rows adds nrs rows (constraints) to the specified * problem object. New rows are always added to the end of the row list, * so the ordinal numbers of existing rows remain unchanged. * * Being added each new row is initially free (unbounded) and has empty * list of the constraint coefficients. * * RETURNS * * The routine glp_add_rows returns the ordinal number of the first new * row added to the problem object. */ int glp_add_rows(glp_prob *lp, int nrs) { glp_tree *tree = lp->tree; GLPROW *row; int m_new, i; /* determine new number of rows */ if (nrs < 1) xerror("glp_add_rows: nrs = %d; invalid number of rows\n", nrs); if (nrs > M_MAX - lp->m) xerror("glp_add_rows: nrs = %d; too many rows\n", nrs); m_new = lp->m + nrs; /* increase the room, if necessary */ if (lp->m_max < m_new) { GLPROW **save = lp->row; while (lp->m_max < m_new) { lp->m_max += lp->m_max; xassert(lp->m_max > 0); } lp->row = xcalloc(1+lp->m_max, sizeof(GLPROW *)); memcpy(&lp->row[1], &save[1], lp->m * sizeof(GLPROW *)); xfree(save); /* do not forget about the basis header */ xfree(lp->head); lp->head = xcalloc(1+lp->m_max, sizeof(int)); } /* add new rows to the end of the row list */ for (i = lp->m+1; i <= m_new; i++) { /* create row descriptor */ lp->row[i] = row = dmp_get_atom(lp->pool, sizeof(GLPROW)); row->i = i; row->name = NULL; row->node = NULL; #if 1 /* 20/IX-2008 */ row->level = 0; row->origin = 0; row->klass = 0; if (tree != NULL) { switch (tree->reason) { case 0: break; case GLP_IROWGEN: xassert(tree->curr != NULL); row->level = tree->curr->level; row->origin = GLP_RF_LAZY; break; case GLP_ICUTGEN: xassert(tree->curr != NULL); row->level = tree->curr->level; row->origin = GLP_RF_CUT; break; default: xassert(tree != tree); } } #endif row->type = GLP_FR; row->lb = row->ub = 0.0; row->ptr = NULL; row->rii = 1.0; row->stat = GLP_BS; #if 0 row->bind = -1; #else row->bind = 0; #endif row->prim = row->dual = 0.0; row->pval = row->dval = 0.0; row->mipx = 0.0; } /* set new number of rows */ lp->m = m_new; /* invalidate the basis factorization */ lp->valid = 0; #if 1 if (tree != NULL && tree->reason != 0) tree->reopt = 1; #endif /* return the ordinal number of the first row added */ return m_new - nrs + 1; } /*********************************************************************** * NAME * * glp_add_cols - add new columns to problem object * * SYNOPSIS * * int glp_add_cols(glp_prob *lp, int ncs); * * DESCRIPTION * * The routine glp_add_cols adds ncs columns (structural variables) to * the specified problem object. New columns are always added to the end * of the column list, so the ordinal numbers of existing columns remain * unchanged. * * Being added each new column is initially fixed at zero and has empty * list of the constraint coefficients. * * RETURNS * * The routine glp_add_cols returns the ordinal number of the first new * column added to the problem object. */ int glp_add_cols(glp_prob *lp, int ncs) { glp_tree *tree = lp->tree; GLPCOL *col; int n_new, j; if (tree != NULL && tree->reason != 0) xerror("glp_add_cols: operation not allowed\n"); /* determine new number of columns */ if (ncs < 1) xerror("glp_add_cols: ncs = %d; invalid number of columns\n", ncs); if (ncs > N_MAX - lp->n) xerror("glp_add_cols: ncs = %d; too many columns\n", ncs); n_new = lp->n + ncs; /* increase the room, if necessary */ if (lp->n_max < n_new) { GLPCOL **save = lp->col; while (lp->n_max < n_new) { lp->n_max += lp->n_max; xassert(lp->n_max > 0); } lp->col = xcalloc(1+lp->n_max, sizeof(GLPCOL *)); memcpy(&lp->col[1], &save[1], lp->n * sizeof(GLPCOL *)); xfree(save); } /* add new columns to the end of the column list */ for (j = lp->n+1; j <= n_new; j++) { /* create column descriptor */ lp->col[j] = col = dmp_get_atom(lp->pool, sizeof(GLPCOL)); col->j = j; col->name = NULL; col->node = NULL; col->kind = GLP_CV; col->type = GLP_FX; col->lb = col->ub = 0.0; col->coef = 0.0; col->ptr = NULL; col->sjj = 1.0; col->stat = GLP_NS; #if 0 col->bind = -1; #else col->bind = 0; /* the basis may remain valid */ #endif col->prim = col->dual = 0.0; col->pval = col->dval = 0.0; col->mipx = 0.0; } /* set new number of columns */ lp->n = n_new; /* return the ordinal number of the first column added */ return n_new - ncs + 1; } /*********************************************************************** * NAME * * glp_set_row_name - assign (change) row name * * SYNOPSIS * * void glp_set_row_name(glp_prob *lp, int i, const char *name); * * DESCRIPTION * * The routine glp_set_row_name assigns a given symbolic name (1 up to * 255 characters) to i-th row (auxiliary variable) of the specified * problem object. * * If the parameter name is NULL or empty string, the routine erases an * existing name of i-th row. */ void glp_set_row_name(glp_prob *lp, int i, const char *name) { glp_tree *tree = lp->tree; GLPROW *row; if (!(1 <= i && i <= lp->m)) xerror("glp_set_row_name: i = %d; row number out of range\n", i); row = lp->row[i]; if (tree != NULL && tree->reason != 0) { xassert(tree->curr != NULL); xassert(row->level == tree->curr->level); } if (row->name != NULL) { if (row->node != NULL) { xassert(lp->r_tree != NULL); avl_delete_node(lp->r_tree, row->node); row->node = NULL; } dmp_free_atom(lp->pool, row->name, strlen(row->name)+1); row->name = NULL; } if (!(name == NULL || name[0] == '\0')) { int k; for (k = 0; name[k] != '\0'; k++) { if (k == 256) xerror("glp_set_row_name: i = %d; row name too long\n", i); if (iscntrl((unsigned char)name[k])) xerror("glp_set_row_name: i = %d: row name contains inva" "lid character(s)\n", i); } row->name = dmp_get_atom(lp->pool, strlen(name)+1); strcpy(row->name, name); if (lp->r_tree != NULL) { xassert(row->node == NULL); row->node = avl_insert_node(lp->r_tree, row->name); avl_set_node_link(row->node, row); } } return; } /*********************************************************************** * NAME * * glp_set_col_name - assign (change) column name * * SYNOPSIS * * void glp_set_col_name(glp_prob *lp, int j, const char *name); * * DESCRIPTION * * The routine glp_set_col_name assigns a given symbolic name (1 up to * 255 characters) to j-th column (structural variable) of the specified * problem object. * * If the parameter name is NULL or empty string, the routine erases an * existing name of j-th column. */ void glp_set_col_name(glp_prob *lp, int j, const char *name) { glp_tree *tree = lp->tree; GLPCOL *col; if (tree != NULL && tree->reason != 0) xerror("glp_set_col_name: operation not allowed\n"); if (!(1 <= j && j <= lp->n)) xerror("glp_set_col_name: j = %d; column number out of range\n" , j); col = lp->col[j]; if (col->name != NULL) { if (col->node != NULL) { xassert(lp->c_tree != NULL); avl_delete_node(lp->c_tree, col->node); col->node = NULL; } dmp_free_atom(lp->pool, col->name, strlen(col->name)+1); col->name = NULL; } if (!(name == NULL || name[0] == '\0')) { int k; for (k = 0; name[k] != '\0'; k++) { if (k == 256) xerror("glp_set_col_name: j = %d; column name too long\n" , j); if (iscntrl((unsigned char)name[k])) xerror("glp_set_col_name: j = %d: column name contains i" "nvalid character(s)\n", j); } col->name = dmp_get_atom(lp->pool, strlen(name)+1); strcpy(col->name, name); if (lp->c_tree != NULL && col->name != NULL) { xassert(col->node == NULL); col->node = avl_insert_node(lp->c_tree, col->name); avl_set_node_link(col->node, col); } } return; } /*********************************************************************** * NAME * * glp_set_row_bnds - set (change) row bounds * * SYNOPSIS * * void glp_set_row_bnds(glp_prob *lp, int i, int type, double lb, * double ub); * * DESCRIPTION * * The routine glp_set_row_bnds sets (changes) the type and bounds of * i-th row (auxiliary variable) of the specified problem object. * * Parameters type, lb, and ub specify the type, lower bound, and upper * bound, respectively, as follows: * * Type Bounds Comments * ------------------------------------------------------ * GLP_FR -inf < x < +inf Free variable * GLP_LO lb <= x < +inf Variable with lower bound * GLP_UP -inf < x <= ub Variable with upper bound * GLP_DB lb <= x <= ub Double-bounded variable * GLP_FX x = lb Fixed variable * * where x is the auxiliary variable associated with i-th row. * * If the row has no lower bound, the parameter lb is ignored. If the * row has no upper bound, the parameter ub is ignored. If the row is * an equality constraint (i.e. the corresponding auxiliary variable is * of fixed type), only the parameter lb is used while the parameter ub * is ignored. */ void glp_set_row_bnds(glp_prob *lp, int i, int type, double lb, double ub) { GLPROW *row; if (!(1 <= i && i <= lp->m)) xerror("glp_set_row_bnds: i = %d; row number out of range\n", i); row = lp->row[i]; row->type = type; switch (type) { case GLP_FR: row->lb = row->ub = 0.0; if (row->stat != GLP_BS) row->stat = GLP_NF; break; case GLP_LO: row->lb = lb, row->ub = 0.0; if (row->stat != GLP_BS) row->stat = GLP_NL; break; case GLP_UP: row->lb = 0.0, row->ub = ub; if (row->stat != GLP_BS) row->stat = GLP_NU; break; case GLP_DB: row->lb = lb, row->ub = ub; if (!(row->stat == GLP_BS || row->stat == GLP_NL || row->stat == GLP_NU)) row->stat = (fabs(lb) <= fabs(ub) ? GLP_NL : GLP_NU); break; case GLP_FX: row->lb = row->ub = lb; if (row->stat != GLP_BS) row->stat = GLP_NS; break; default: xerror("glp_set_row_bnds: i = %d; type = %d; invalid row ty" "pe\n", i, type); } return; } /*********************************************************************** * NAME * * glp_set_col_bnds - set (change) column bounds * * SYNOPSIS * * void glp_set_col_bnds(glp_prob *lp, int j, int type, double lb, * double ub); * * DESCRIPTION * * The routine glp_set_col_bnds sets (changes) the type and bounds of * j-th column (structural variable) of the specified problem object. * * Parameters type, lb, and ub specify the type, lower bound, and upper * bound, respectively, as follows: * * Type Bounds Comments * ------------------------------------------------------ * GLP_FR -inf < x < +inf Free variable * GLP_LO lb <= x < +inf Variable with lower bound * GLP_UP -inf < x <= ub Variable with upper bound * GLP_DB lb <= x <= ub Double-bounded variable * GLP_FX x = lb Fixed variable * * where x is the structural variable associated with j-th column. * * If the column has no lower bound, the parameter lb is ignored. If the * column has no upper bound, the parameter ub is ignored. If the column * is of fixed type, only the parameter lb is used while the parameter * ub is ignored. */ void glp_set_col_bnds(glp_prob *lp, int j, int type, double lb, double ub) { GLPCOL *col; if (!(1 <= j && j <= lp->n)) xerror("glp_set_col_bnds: j = %d; column number out of range\n" , j); col = lp->col[j]; col->type = type; switch (type) { case GLP_FR: col->lb = col->ub = 0.0; if (col->stat != GLP_BS) col->stat = GLP_NF; break; case GLP_LO: col->lb = lb, col->ub = 0.0; if (col->stat != GLP_BS) col->stat = GLP_NL; break; case GLP_UP: col->lb = 0.0, col->ub = ub; if (col->stat != GLP_BS) col->stat = GLP_NU; break; case GLP_DB: col->lb = lb, col->ub = ub; if (!(col->stat == GLP_BS || col->stat == GLP_NL || col->stat == GLP_NU)) col->stat = (fabs(lb) <= fabs(ub) ? GLP_NL : GLP_NU); break; case GLP_FX: col->lb = col->ub = lb; if (col->stat != GLP_BS) col->stat = GLP_NS; break; default: xerror("glp_set_col_bnds: j = %d; type = %d; invalid column" " type\n", j, type); } return; } /*********************************************************************** * NAME * * glp_set_obj_coef - set (change) obj. coefficient or constant term * * SYNOPSIS * * void glp_set_obj_coef(glp_prob *lp, int j, double coef); * * DESCRIPTION * * The routine glp_set_obj_coef sets (changes) objective coefficient at * j-th column (structural variable) of the specified problem object. * * If the parameter j is 0, the routine sets (changes) the constant term * ("shift") of the objective function. */ void glp_set_obj_coef(glp_prob *lp, int j, double coef) { glp_tree *tree = lp->tree; if (tree != NULL && tree->reason != 0) xerror("glp_set_obj_coef: operation not allowed\n"); if (!(0 <= j && j <= lp->n)) xerror("glp_set_obj_coef: j = %d; column number out of range\n" , j); if (j == 0) lp->c0 = coef; else lp->col[j]->coef = coef; return; } /*********************************************************************** * NAME * * glp_set_mat_row - set (replace) row of the constraint matrix * * SYNOPSIS * * void glp_set_mat_row(glp_prob *lp, int i, int len, const int ind[], * const double val[]); * * DESCRIPTION * * The routine glp_set_mat_row stores (replaces) the contents of i-th * row of the constraint matrix of the specified problem object. * * Column indices and numeric values of new row elements must be placed * in locations ind[1], ..., ind[len] and val[1], ..., val[len], where * 0 <= len <= n is the new length of i-th row, n is the current number * of columns in the problem object. Elements with identical column * indices are not allowed. Zero elements are allowed, but they are not * stored in the constraint matrix. * * If the parameter len is zero, the parameters ind and/or val can be * specified as NULL. */ void glp_set_mat_row(glp_prob *lp, int i, int len, const int ind[], const double val[]) { glp_tree *tree = lp->tree; GLPROW *row; GLPCOL *col; GLPAIJ *aij, *next; int j, k; /* obtain pointer to i-th row */ if (!(1 <= i && i <= lp->m)) xerror("glp_set_mat_row: i = %d; row number out of range\n", i); row = lp->row[i]; if (tree != NULL && tree->reason != 0) { xassert(tree->curr != NULL); xassert(row->level == tree->curr->level); } /* remove all existing elements from i-th row */ while (row->ptr != NULL) { /* take next element in the row */ aij = row->ptr; /* remove the element from the row list */ row->ptr = aij->r_next; /* obtain pointer to corresponding column */ col = aij->col; /* remove the element from the column list */ if (aij->c_prev == NULL) col->ptr = aij->c_next; else aij->c_prev->c_next = aij->c_next; if (aij->c_next == NULL) ; else aij->c_next->c_prev = aij->c_prev; /* return the element to the memory pool */ dmp_free_atom(lp->pool, aij, sizeof(GLPAIJ)), lp->nnz--; /* if the corresponding column is basic, invalidate the basis factorization */ if (col->stat == GLP_BS) lp->valid = 0; } /* store new contents of i-th row */ if (!(0 <= len && len <= lp->n)) xerror("glp_set_mat_row: i = %d; len = %d; invalid row length " "\n", i, len); if (len > NNZ_MAX - lp->nnz) xerror("glp_set_mat_row: i = %d; len = %d; too many constraint" " coefficients\n", i, len); for (k = 1; k <= len; k++) { /* take number j of corresponding column */ j = ind[k]; /* obtain pointer to j-th column */ if (!(1 <= j && j <= lp->n)) xerror("glp_set_mat_row: i = %d; ind[%d] = %d; column index" " out of range\n", i, k, j); col = lp->col[j]; /* if there is element with the same column index, it can only be found in the beginning of j-th column list */ if (col->ptr != NULL && col->ptr->row->i == i) xerror("glp_set_mat_row: i = %d; ind[%d] = %d; duplicate co" "lumn indices not allowed\n", i, k, j); /* create new element */ aij = dmp_get_atom(lp->pool, sizeof(GLPAIJ)), lp->nnz++; aij->row = row; aij->col = col; aij->val = val[k]; /* add the new element to the beginning of i-th row and j-th column lists */ aij->r_prev = NULL; aij->r_next = row->ptr; aij->c_prev = NULL; aij->c_next = col->ptr; if (aij->r_next != NULL) aij->r_next->r_prev = aij; if (aij->c_next != NULL) aij->c_next->c_prev = aij; row->ptr = col->ptr = aij; /* if the corresponding column is basic, invalidate the basis factorization */ if (col->stat == GLP_BS && aij->val != 0.0) lp->valid = 0; } /* remove zero elements from i-th row */ for (aij = row->ptr; aij != NULL; aij = next) { next = aij->r_next; if (aij->val == 0.0) { /* remove the element from the row list */ if (aij->r_prev == NULL) row->ptr = next; else aij->r_prev->r_next = next; if (next == NULL) ; else next->r_prev = aij->r_prev; /* remove the element from the column list */ xassert(aij->c_prev == NULL); aij->col->ptr = aij->c_next; if (aij->c_next != NULL) aij->c_next->c_prev = NULL; /* return the element to the memory pool */ dmp_free_atom(lp->pool, aij, sizeof(GLPAIJ)), lp->nnz--; } } return; } /*********************************************************************** * NAME * * glp_set_mat_col - set (replace) column of the constraint matrix * * SYNOPSIS * * void glp_set_mat_col(glp_prob *lp, int j, int len, const int ind[], * const double val[]); * * DESCRIPTION * * The routine glp_set_mat_col stores (replaces) the contents of j-th * column of the constraint matrix of the specified problem object. * * Row indices and numeric values of new column elements must be placed * in locations ind[1], ..., ind[len] and val[1], ..., val[len], where * 0 <= len <= m is the new length of j-th column, m is the current * number of rows in the problem object. Elements with identical column * indices are not allowed. Zero elements are allowed, but they are not * stored in the constraint matrix. * * If the parameter len is zero, the parameters ind and/or val can be * specified as NULL. */ void glp_set_mat_col(glp_prob *lp, int j, int len, const int ind[], const double val[]) { glp_tree *tree = lp->tree; GLPROW *row; GLPCOL *col; GLPAIJ *aij, *next; int i, k; if (tree != NULL && tree->reason != 0) xerror("glp_set_mat_col: operation not allowed\n"); /* obtain pointer to j-th column */ if (!(1 <= j && j <= lp->n)) xerror("glp_set_mat_col: j = %d; column number out of range\n", j); col = lp->col[j]; /* remove all existing elements from j-th column */ while (col->ptr != NULL) { /* take next element in the column */ aij = col->ptr; /* remove the element from the column list */ col->ptr = aij->c_next; /* obtain pointer to corresponding row */ row = aij->row; /* remove the element from the row list */ if (aij->r_prev == NULL) row->ptr = aij->r_next; else aij->r_prev->r_next = aij->r_next; if (aij->r_next == NULL) ; else aij->r_next->r_prev = aij->r_prev; /* return the element to the memory pool */ dmp_free_atom(lp->pool, aij, sizeof(GLPAIJ)), lp->nnz--; } /* store new contents of j-th column */ if (!(0 <= len && len <= lp->m)) xerror("glp_set_mat_col: j = %d; len = %d; invalid column leng" "th\n", j, len); if (len > NNZ_MAX - lp->nnz) xerror("glp_set_mat_col: j = %d; len = %d; too many constraint" " coefficients\n", j, len); for (k = 1; k <= len; k++) { /* take number i of corresponding row */ i = ind[k]; /* obtain pointer to i-th row */ if (!(1 <= i && i <= lp->m)) xerror("glp_set_mat_col: j = %d; ind[%d] = %d; row index ou" "t of range\n", j, k, i); row = lp->row[i]; /* if there is element with the same row index, it can only be found in the beginning of i-th row list */ if (row->ptr != NULL && row->ptr->col->j == j) xerror("glp_set_mat_col: j = %d; ind[%d] = %d; duplicate ro" "w indices not allowed\n", j, k, i); /* create new element */ aij = dmp_get_atom(lp->pool, sizeof(GLPAIJ)), lp->nnz++; aij->row = row; aij->col = col; aij->val = val[k]; /* add the new element to the beginning of i-th row and j-th column lists */ aij->r_prev = NULL; aij->r_next = row->ptr; aij->c_prev = NULL; aij->c_next = col->ptr; if (aij->r_next != NULL) aij->r_next->r_prev = aij; if (aij->c_next != NULL) aij->c_next->c_prev = aij; row->ptr = col->ptr = aij; } /* remove zero elements from j-th column */ for (aij = col->ptr; aij != NULL; aij = next) { next = aij->c_next; if (aij->val == 0.0) { /* remove the element from the row list */ xassert(aij->r_prev == NULL); aij->row->ptr = aij->r_next; if (aij->r_next != NULL) aij->r_next->r_prev = NULL; /* remove the element from the column list */ if (aij->c_prev == NULL) col->ptr = next; else aij->c_prev->c_next = next; if (next == NULL) ; else next->c_prev = aij->c_prev; /* return the element to the memory pool */ dmp_free_atom(lp->pool, aij, sizeof(GLPAIJ)), lp->nnz--; } } /* if j-th column is basic, invalidate the basis factorization */ if (col->stat == GLP_BS) lp->valid = 0; return; } /*********************************************************************** * NAME * * glp_load_matrix - load (replace) the whole constraint matrix * * SYNOPSIS * * void glp_load_matrix(glp_prob *lp, int ne, const int ia[], * const int ja[], const double ar[]); * * DESCRIPTION * * The routine glp_load_matrix loads the constraint matrix passed in * the arrays ia, ja, and ar into the specified problem object. Before * loading the current contents of the constraint matrix is destroyed. * * Constraint coefficients (elements of the constraint matrix) must be * specified as triplets (ia[k], ja[k], ar[k]) for k = 1, ..., ne, * where ia[k] is the row index, ja[k] is the column index, ar[k] is a * numeric value of corresponding constraint coefficient. The parameter * ne specifies the total number of (non-zero) elements in the matrix * to be loaded. Coefficients with identical indices are not allowed. * Zero coefficients are allowed, however, they are not stored in the * constraint matrix. * * If the parameter ne is zero, the parameters ia, ja, and ar can be * specified as NULL. */ void glp_load_matrix(glp_prob *lp, int ne, const int ia[], const int ja[], const double ar[]) { glp_tree *tree = lp->tree; GLPROW *row; GLPCOL *col; GLPAIJ *aij, *next; int i, j, k; if (tree != NULL && tree->reason != 0) xerror("glp_load_matrix: operation not allowed\n"); /* clear the constraint matrix */ for (i = 1; i <= lp->m; i++) { row = lp->row[i]; while (row->ptr != NULL) { aij = row->ptr; row->ptr = aij->r_next; dmp_free_atom(lp->pool, aij, sizeof(GLPAIJ)), lp->nnz--; } } xassert(lp->nnz == 0); for (j = 1; j <= lp->n; j++) lp->col[j]->ptr = NULL; /* load the new contents of the constraint matrix and build its row lists */ if (ne < 0) xerror("glp_load_matrix: ne = %d; invalid number of constraint" " coefficients\n", ne); if (ne > NNZ_MAX) xerror("glp_load_matrix: ne = %d; too many constraint coeffici" "ents\n", ne); for (k = 1; k <= ne; k++) { /* take indices of new element */ i = ia[k], j = ja[k]; /* obtain pointer to i-th row */ if (!(1 <= i && i <= lp->m)) xerror("glp_load_matrix: ia[%d] = %d; row index out of rang" "e\n", k, i); row = lp->row[i]; /* obtain pointer to j-th column */ if (!(1 <= j && j <= lp->n)) xerror("glp_load_matrix: ja[%d] = %d; column index out of r" "ange\n", k, j); col = lp->col[j]; /* create new element */ aij = dmp_get_atom(lp->pool, sizeof(GLPAIJ)), lp->nnz++; aij->row = row; aij->col = col; aij->val = ar[k]; /* add the new element to the beginning of i-th row list */ aij->r_prev = NULL; aij->r_next = row->ptr; if (aij->r_next != NULL) aij->r_next->r_prev = aij; row->ptr = aij; } xassert(lp->nnz == ne); /* build column lists of the constraint matrix and check elements with identical indices */ for (i = 1; i <= lp->m; i++) { for (aij = lp->row[i]->ptr; aij != NULL; aij = aij->r_next) { /* obtain pointer to corresponding column */ col = aij->col; /* if there is element with identical indices, it can only be found in the beginning of j-th column list */ if (col->ptr != NULL && col->ptr->row->i == i) { for (k = 1; k <= ne; k++) if (ia[k] == i && ja[k] == col->j) break; xerror("glp_load_mat: ia[%d] = %d; ja[%d] = %d; duplicat" "e indices not allowed\n", k, i, k, col->j); } /* add the element to the beginning of j-th column list */ aij->c_prev = NULL; aij->c_next = col->ptr; if (aij->c_next != NULL) aij->c_next->c_prev = aij; col->ptr = aij; } } /* remove zero elements from the constraint matrix */ for (i = 1; i <= lp->m; i++) { row = lp->row[i]; for (aij = row->ptr; aij != NULL; aij = next) { next = aij->r_next; if (aij->val == 0.0) { /* remove the element from the row list */ if (aij->r_prev == NULL) row->ptr = next; else aij->r_prev->r_next = next; if (next == NULL) ; else next->r_prev = aij->r_prev; /* remove the element from the column list */ if (aij->c_prev == NULL) aij->col->ptr = aij->c_next; else aij->c_prev->c_next = aij->c_next; if (aij->c_next == NULL) ; else aij->c_next->c_prev = aij->c_prev; /* return the element to the memory pool */ dmp_free_atom(lp->pool, aij, sizeof(GLPAIJ)), lp->nnz--; } } } /* invalidate the basis factorization */ lp->valid = 0; return; } /*********************************************************************** * NAME * * glp_check_dup - check for duplicate elements in sparse matrix * * SYNOPSIS * * int glp_check_dup(int m, int n, int ne, const int ia[], * const int ja[]); * * DESCRIPTION * * The routine glp_check_dup checks for duplicate elements (that is, * elements with identical indices) in a sparse matrix specified in the * coordinate format. * * The parameters m and n specifies, respectively, the number of rows * and columns in the matrix, m >= 0, n >= 0. * * The parameter ne specifies the number of (structurally) non-zero * elements in the matrix, ne >= 0. * * Elements of the matrix are specified as doublets (ia[k],ja[k]) for * k = 1,...,ne, where ia[k] is a row index, ja[k] is a column index. * * The routine glp_check_dup can be used prior to a call to the routine * glp_load_matrix to check that the constraint matrix to be loaded has * no duplicate elements. * * RETURNS * * The routine glp_check_dup returns one of the following values: * * 0 - the matrix has no duplicate elements; * * -k - indices ia[k] or/and ja[k] are out of range; * * +k - element (ia[k],ja[k]) is duplicate. */ int glp_check_dup(int m, int n, int ne, const int ia[], const int ja[]) { int i, j, k, *ptr, *next, ret; char *flag; if (m < 0) xerror("glp_check_dup: m = %d; invalid parameter\n"); if (n < 0) xerror("glp_check_dup: n = %d; invalid parameter\n"); if (ne < 0) xerror("glp_check_dup: ne = %d; invalid parameter\n"); if (ne > 0 && ia == NULL) xerror("glp_check_dup: ia = %p; invalid parameter\n", ia); if (ne > 0 && ja == NULL) xerror("glp_check_dup: ja = %p; invalid parameter\n", ja); for (k = 1; k <= ne; k++) { i = ia[k], j = ja[k]; if (!(1 <= i && i <= m && 1 <= j && j <= n)) { ret = -k; goto done; } } if (m == 0 || n == 0) { ret = 0; goto done; } /* allocate working arrays */ ptr = xcalloc(1+m, sizeof(int)); next = xcalloc(1+ne, sizeof(int)); flag = xcalloc(1+n, sizeof(char)); /* build row lists */ for (i = 1; i <= m; i++) ptr[i] = 0; for (k = 1; k <= ne; k++) { i = ia[k]; next[k] = ptr[i]; ptr[i] = k; } /* clear column flags */ for (j = 1; j <= n; j++) flag[j] = 0; /* check for duplicate elements */ for (i = 1; i <= m; i++) { for (k = ptr[i]; k != 0; k = next[k]) { j = ja[k]; if (flag[j]) { /* find first element (i,j) */ for (k = 1; k <= ne; k++) if (ia[k] == i && ja[k] == j) break; xassert(k <= ne); /* find next (duplicate) element (i,j) */ for (k++; k <= ne; k++) if (ia[k] == i && ja[k] == j) break; xassert(k <= ne); ret = +k; goto skip; } flag[j] = 1; } /* clear column flags */ for (k = ptr[i]; k != 0; k = next[k]) flag[ja[k]] = 0; } /* no duplicate element found */ ret = 0; skip: /* free working arrays */ xfree(ptr); xfree(next); xfree(flag); done: return ret; } /*********************************************************************** * NAME * * glp_sort_matrix - sort elements of the constraint matrix * * SYNOPSIS * * void glp_sort_matrix(glp_prob *P); * * DESCRIPTION * * The routine glp_sort_matrix sorts elements of the constraint matrix * rebuilding its row and column linked lists. On exit from the routine * the constraint matrix is not changed, however, elements in the row * linked lists become ordered by ascending column indices, and the * elements in the column linked lists become ordered by ascending row * indices. */ void glp_sort_matrix(glp_prob *P) { GLPAIJ *aij; int i, j; #if 0 /* 04/IV-2016 */ if (P == NULL || P->magic != GLP_PROB_MAGIC) xerror("glp_sort_matrix: P = %p; invalid problem object\n", P); #endif /* rebuild row linked lists */ for (i = P->m; i >= 1; i--) P->row[i]->ptr = NULL; for (j = P->n; j >= 1; j--) { for (aij = P->col[j]->ptr; aij != NULL; aij = aij->c_next) { i = aij->row->i; aij->r_prev = NULL; aij->r_next = P->row[i]->ptr; if (aij->r_next != NULL) aij->r_next->r_prev = aij; P->row[i]->ptr = aij; } } /* rebuild column linked lists */ for (j = P->n; j >= 1; j--) P->col[j]->ptr = NULL; for (i = P->m; i >= 1; i--) { for (aij = P->row[i]->ptr; aij != NULL; aij = aij->r_next) { j = aij->col->j; aij->c_prev = NULL; aij->c_next = P->col[j]->ptr; if (aij->c_next != NULL) aij->c_next->c_prev = aij; P->col[j]->ptr = aij; } } return; } /*********************************************************************** * NAME * * glp_del_rows - delete rows from problem object * * SYNOPSIS * * void glp_del_rows(glp_prob *lp, int nrs, const int num[]); * * DESCRIPTION * * The routine glp_del_rows deletes rows from the specified problem * object. Ordinal numbers of rows to be deleted should be placed in * locations num[1], ..., num[nrs], where nrs > 0. * * Note that deleting rows involves changing ordinal numbers of other * rows remaining in the problem object. New ordinal numbers of the * remaining rows are assigned under the assumption that the original * order of rows is not changed. */ void glp_del_rows(glp_prob *lp, int nrs, const int num[]) { glp_tree *tree = lp->tree; GLPROW *row; int i, k, m_new; /* mark rows to be deleted */ if (!(1 <= nrs && nrs <= lp->m)) xerror("glp_del_rows: nrs = %d; invalid number of rows\n", nrs); for (k = 1; k <= nrs; k++) { /* take the number of row to be deleted */ i = num[k]; /* obtain pointer to i-th row */ if (!(1 <= i && i <= lp->m)) xerror("glp_del_rows: num[%d] = %d; row number out of range" "\n", k, i); row = lp->row[i]; if (tree != NULL && tree->reason != 0) { if (!(tree->reason == GLP_IROWGEN || tree->reason == GLP_ICUTGEN)) xerror("glp_del_rows: operation not allowed\n"); xassert(tree->curr != NULL); if (row->level != tree->curr->level) xerror("glp_del_rows: num[%d] = %d; invalid attempt to d" "elete row created not in current subproblem\n", k,i); if (row->stat != GLP_BS) xerror("glp_del_rows: num[%d] = %d; invalid attempt to d" "elete active row (constraint)\n", k, i); tree->reinv = 1; } /* check that the row is not marked yet */ if (row->i == 0) xerror("glp_del_rows: num[%d] = %d; duplicate row numbers n" "ot allowed\n", k, i); /* erase symbolic name assigned to the row */ glp_set_row_name(lp, i, NULL); xassert(row->node == NULL); /* erase corresponding row of the constraint matrix */ glp_set_mat_row(lp, i, 0, NULL, NULL); xassert(row->ptr == NULL); /* mark the row to be deleted */ row->i = 0; } /* delete all marked rows from the row list */ m_new = 0; for (i = 1; i <= lp->m; i++) { /* obtain pointer to i-th row */ row = lp->row[i]; /* check if the row is marked */ if (row->i == 0) { /* it is marked, delete it */ dmp_free_atom(lp->pool, row, sizeof(GLPROW)); } else { /* it is not marked; keep it */ row->i = ++m_new; lp->row[row->i] = row; } } /* set new number of rows */ lp->m = m_new; /* invalidate the basis factorization */ lp->valid = 0; return; } /*********************************************************************** * NAME * * glp_del_cols - delete columns from problem object * * SYNOPSIS * * void glp_del_cols(glp_prob *lp, int ncs, const int num[]); * * DESCRIPTION * * The routine glp_del_cols deletes columns from the specified problem * object. Ordinal numbers of columns to be deleted should be placed in * locations num[1], ..., num[ncs], where ncs > 0. * * Note that deleting columns involves changing ordinal numbers of * other columns remaining in the problem object. New ordinal numbers * of the remaining columns are assigned under the assumption that the * original order of columns is not changed. */ void glp_del_cols(glp_prob *lp, int ncs, const int num[]) { glp_tree *tree = lp->tree; GLPCOL *col; int j, k, n_new; if (tree != NULL && tree->reason != 0) xerror("glp_del_cols: operation not allowed\n"); /* mark columns to be deleted */ if (!(1 <= ncs && ncs <= lp->n)) xerror("glp_del_cols: ncs = %d; invalid number of columns\n", ncs); for (k = 1; k <= ncs; k++) { /* take the number of column to be deleted */ j = num[k]; /* obtain pointer to j-th column */ if (!(1 <= j && j <= lp->n)) xerror("glp_del_cols: num[%d] = %d; column number out of ra" "nge", k, j); col = lp->col[j]; /* check that the column is not marked yet */ if (col->j == 0) xerror("glp_del_cols: num[%d] = %d; duplicate column number" "s not allowed\n", k, j); /* erase symbolic name assigned to the column */ glp_set_col_name(lp, j, NULL); xassert(col->node == NULL); /* erase corresponding column of the constraint matrix */ glp_set_mat_col(lp, j, 0, NULL, NULL); xassert(col->ptr == NULL); /* mark the column to be deleted */ col->j = 0; /* if it is basic, invalidate the basis factorization */ if (col->stat == GLP_BS) lp->valid = 0; } /* delete all marked columns from the column list */ n_new = 0; for (j = 1; j <= lp->n; j++) { /* obtain pointer to j-th column */ col = lp->col[j]; /* check if the column is marked */ if (col->j == 0) { /* it is marked; delete it */ dmp_free_atom(lp->pool, col, sizeof(GLPCOL)); } else { /* it is not marked; keep it */ col->j = ++n_new; lp->col[col->j] = col; } } /* set new number of columns */ lp->n = n_new; /* if the basis header is still valid, adjust it */ if (lp->valid) { int m = lp->m; int *head = lp->head; for (j = 1; j <= n_new; j++) { k = lp->col[j]->bind; if (k != 0) { xassert(1 <= k && k <= m); head[k] = m + j; } } } return; } /*********************************************************************** * NAME * * glp_copy_prob - copy problem object content * * SYNOPSIS * * void glp_copy_prob(glp_prob *dest, glp_prob *prob, int names); * * DESCRIPTION * * The routine glp_copy_prob copies the content of the problem object * prob to the problem object dest. * * The parameter names is a flag. If it is non-zero, the routine also * copies all symbolic names; otherwise, if it is zero, symbolic names * are not copied. */ void glp_copy_prob(glp_prob *dest, glp_prob *prob, int names) { glp_tree *tree = dest->tree; glp_bfcp bfcp; int i, j, len, *ind; double *val; if (tree != NULL && tree->reason != 0) xerror("glp_copy_prob: operation not allowed\n"); if (dest == prob) xerror("glp_copy_prob: copying problem object to itself not al" "lowed\n"); if (!(names == GLP_ON || names == GLP_OFF)) xerror("glp_copy_prob: names = %d; invalid parameter\n", names); glp_erase_prob(dest); if (names && prob->name != NULL) glp_set_prob_name(dest, prob->name); if (names && prob->obj != NULL) glp_set_obj_name(dest, prob->obj); dest->dir = prob->dir; dest->c0 = prob->c0; if (prob->m > 0) glp_add_rows(dest, prob->m); if (prob->n > 0) glp_add_cols(dest, prob->n); glp_get_bfcp(prob, &bfcp); glp_set_bfcp(dest, &bfcp); dest->pbs_stat = prob->pbs_stat; dest->dbs_stat = prob->dbs_stat; dest->obj_val = prob->obj_val; dest->some = prob->some; dest->ipt_stat = prob->ipt_stat; dest->ipt_obj = prob->ipt_obj; dest->mip_stat = prob->mip_stat; dest->mip_obj = prob->mip_obj; for (i = 1; i <= prob->m; i++) { GLPROW *to = dest->row[i]; GLPROW *from = prob->row[i]; if (names && from->name != NULL) glp_set_row_name(dest, i, from->name); to->type = from->type; to->lb = from->lb; to->ub = from->ub; to->rii = from->rii; to->stat = from->stat; to->prim = from->prim; to->dual = from->dual; to->pval = from->pval; to->dval = from->dval; to->mipx = from->mipx; } ind = xcalloc(1+prob->m, sizeof(int)); val = xcalloc(1+prob->m, sizeof(double)); for (j = 1; j <= prob->n; j++) { GLPCOL *to = dest->col[j]; GLPCOL *from = prob->col[j]; if (names && from->name != NULL) glp_set_col_name(dest, j, from->name); to->kind = from->kind; to->type = from->type; to->lb = from->lb; to->ub = from->ub; to->coef = from->coef; len = glp_get_mat_col(prob, j, ind, val); glp_set_mat_col(dest, j, len, ind, val); to->sjj = from->sjj; to->stat = from->stat; to->prim = from->prim; to->dual = from->dual; to->pval = from->pval; to->dval = from->dval; to->mipx = from->mipx; } xfree(ind); xfree(val); return; } /*********************************************************************** * NAME * * glp_erase_prob - erase problem object content * * SYNOPSIS * * void glp_erase_prob(glp_prob *lp); * * DESCRIPTION * * The routine glp_erase_prob erases the content of the specified * problem object. The effect of this operation is the same as if the * problem object would be deleted with the routine glp_delete_prob and * then created anew with the routine glp_create_prob, with exception * that the handle (pointer) to the problem object remains valid. */ static void delete_prob(glp_prob *lp); void glp_erase_prob(glp_prob *lp) { glp_tree *tree = lp->tree; if (tree != NULL && tree->reason != 0) xerror("glp_erase_prob: operation not allowed\n"); delete_prob(lp); create_prob(lp); return; } /*********************************************************************** * NAME * * glp_delete_prob - delete problem object * * SYNOPSIS * * void glp_delete_prob(glp_prob *lp); * * DESCRIPTION * * The routine glp_delete_prob deletes the specified problem object and * frees all the memory allocated to it. */ static void delete_prob(glp_prob *lp) #if 0 /* 04/IV-2016 */ { lp->magic = 0x3F3F3F3F; #else { #endif dmp_delete_pool(lp->pool); #if 0 /* 08/III-2014 */ #if 0 /* 17/XI-2009 */ xfree(lp->cps); #else if (lp->parms != NULL) xfree(lp->parms); #endif #endif xassert(lp->tree == NULL); #if 0 if (lp->cwa != NULL) xfree(lp->cwa); #endif xfree(lp->row); xfree(lp->col); if (lp->r_tree != NULL) avl_delete_tree(lp->r_tree); if (lp->c_tree != NULL) avl_delete_tree(lp->c_tree); xfree(lp->head); #if 0 /* 08/III-2014 */ if (lp->bfcp != NULL) xfree(lp->bfcp); #endif if (lp->bfd != NULL) bfd_delete_it(lp->bfd); return; } void glp_delete_prob(glp_prob *lp) { glp_tree *tree = lp->tree; if (tree != NULL && tree->reason != 0) xerror("glp_delete_prob: operation not allowed\n"); delete_prob(lp); xfree(lp); return; } /* eof */ glpk-5.0/src/api/prob2.c0000644000062000006210000003210313766346220014231 0ustar maomkpasswd/* prob2.c (problem retrieving routines) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2000-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "prob.h" /*********************************************************************** * NAME * * glp_get_prob_name - retrieve problem name * * SYNOPSIS * * const char *glp_get_prob_name(glp_prob *lp); * * RETURNS * * The routine glp_get_prob_name returns a pointer to an internal * buffer, which contains symbolic name of the problem. However, if the * problem has no assigned name, the routine returns NULL. */ const char *glp_get_prob_name(glp_prob *lp) { char *name; name = lp->name; return name; } /*********************************************************************** * NAME * * glp_get_obj_name - retrieve objective function name * * SYNOPSIS * * const char *glp_get_obj_name(glp_prob *lp); * * RETURNS * * The routine glp_get_obj_name returns a pointer to an internal * buffer, which contains a symbolic name of the objective function. * However, if the objective function has no assigned name, the routine * returns NULL. */ const char *glp_get_obj_name(glp_prob *lp) { char *name; name = lp->obj; return name; } /*********************************************************************** * NAME * * glp_get_obj_dir - retrieve optimization direction flag * * SYNOPSIS * * int glp_get_obj_dir(glp_prob *lp); * * RETURNS * * The routine glp_get_obj_dir returns the optimization direction flag * (i.e. "sense" of the objective function): * * GLP_MIN - minimization; * GLP_MAX - maximization. */ int glp_get_obj_dir(glp_prob *lp) { int dir = lp->dir; return dir; } /*********************************************************************** * NAME * * glp_get_num_rows - retrieve number of rows * * SYNOPSIS * * int glp_get_num_rows(glp_prob *lp); * * RETURNS * * The routine glp_get_num_rows returns the current number of rows in * the specified problem object. */ int glp_get_num_rows(glp_prob *lp) { int m = lp->m; return m; } /*********************************************************************** * NAME * * glp_get_num_cols - retrieve number of columns * * SYNOPSIS * * int glp_get_num_cols(glp_prob *lp); * * RETURNS * * The routine glp_get_num_cols returns the current number of columns * in the specified problem object. */ int glp_get_num_cols(glp_prob *lp) { int n = lp->n; return n; } /*********************************************************************** * NAME * * glp_get_row_name - retrieve row name * * SYNOPSIS * * const char *glp_get_row_name(glp_prob *lp, int i); * * RETURNS * * The routine glp_get_row_name returns a pointer to an internal * buffer, which contains symbolic name of i-th row. However, if i-th * row has no assigned name, the routine returns NULL. */ const char *glp_get_row_name(glp_prob *lp, int i) { char *name; if (!(1 <= i && i <= lp->m)) xerror("glp_get_row_name: i = %d; row number out of range\n", i); name = lp->row[i]->name; return name; } /*********************************************************************** * NAME * * glp_get_col_name - retrieve column name * * SYNOPSIS * * const char *glp_get_col_name(glp_prob *lp, int j); * * RETURNS * * The routine glp_get_col_name returns a pointer to an internal * buffer, which contains symbolic name of j-th column. However, if j-th * column has no assigned name, the routine returns NULL. */ const char *glp_get_col_name(glp_prob *lp, int j) { char *name; if (!(1 <= j && j <= lp->n)) xerror("glp_get_col_name: j = %d; column number out of range\n" , j); name = lp->col[j]->name; return name; } /*********************************************************************** * NAME * * glp_get_row_type - retrieve row type * * SYNOPSIS * * int glp_get_row_type(glp_prob *lp, int i); * * RETURNS * * The routine glp_get_row_type returns the type of i-th row, i.e. the * type of corresponding auxiliary variable, as follows: * * GLP_FR - free (unbounded) variable; * GLP_LO - variable with lower bound; * GLP_UP - variable with upper bound; * GLP_DB - double-bounded variable; * GLP_FX - fixed variable. */ int glp_get_row_type(glp_prob *lp, int i) { if (!(1 <= i && i <= lp->m)) xerror("glp_get_row_type: i = %d; row number out of range\n", i); return lp->row[i]->type; } /*********************************************************************** * NAME * * glp_get_row_lb - retrieve row lower bound * * SYNOPSIS * * double glp_get_row_lb(glp_prob *lp, int i); * * RETURNS * * The routine glp_get_row_lb returns the lower bound of i-th row, i.e. * the lower bound of corresponding auxiliary variable. However, if the * row has no lower bound, the routine returns -DBL_MAX. */ double glp_get_row_lb(glp_prob *lp, int i) { double lb; if (!(1 <= i && i <= lp->m)) xerror("glp_get_row_lb: i = %d; row number out of range\n", i); switch (lp->row[i]->type) { case GLP_FR: case GLP_UP: lb = -DBL_MAX; break; case GLP_LO: case GLP_DB: case GLP_FX: lb = lp->row[i]->lb; break; default: xassert(lp != lp); } return lb; } /*********************************************************************** * NAME * * glp_get_row_ub - retrieve row upper bound * * SYNOPSIS * * double glp_get_row_ub(glp_prob *lp, int i); * * RETURNS * * The routine glp_get_row_ub returns the upper bound of i-th row, i.e. * the upper bound of corresponding auxiliary variable. However, if the * row has no upper bound, the routine returns +DBL_MAX. */ double glp_get_row_ub(glp_prob *lp, int i) { double ub; if (!(1 <= i && i <= lp->m)) xerror("glp_get_row_ub: i = %d; row number out of range\n", i); switch (lp->row[i]->type) { case GLP_FR: case GLP_LO: ub = +DBL_MAX; break; case GLP_UP: case GLP_DB: case GLP_FX: ub = lp->row[i]->ub; break; default: xassert(lp != lp); } return ub; } /*********************************************************************** * NAME * * glp_get_col_type - retrieve column type * * SYNOPSIS * * int glp_get_col_type(glp_prob *lp, int j); * * RETURNS * * The routine glp_get_col_type returns the type of j-th column, i.e. * the type of corresponding structural variable, as follows: * * GLP_FR - free (unbounded) variable; * GLP_LO - variable with lower bound; * GLP_UP - variable with upper bound; * GLP_DB - double-bounded variable; * GLP_FX - fixed variable. */ int glp_get_col_type(glp_prob *lp, int j) { if (!(1 <= j && j <= lp->n)) xerror("glp_get_col_type: j = %d; column number out of range\n" , j); return lp->col[j]->type; } /*********************************************************************** * NAME * * glp_get_col_lb - retrieve column lower bound * * SYNOPSIS * * double glp_get_col_lb(glp_prob *lp, int j); * * RETURNS * * The routine glp_get_col_lb returns the lower bound of j-th column, * i.e. the lower bound of corresponding structural variable. However, * if the column has no lower bound, the routine returns -DBL_MAX. */ double glp_get_col_lb(glp_prob *lp, int j) { double lb; if (!(1 <= j && j <= lp->n)) xerror("glp_get_col_lb: j = %d; column number out of range\n", j); switch (lp->col[j]->type) { case GLP_FR: case GLP_UP: lb = -DBL_MAX; break; case GLP_LO: case GLP_DB: case GLP_FX: lb = lp->col[j]->lb; break; default: xassert(lp != lp); } return lb; } /*********************************************************************** * NAME * * glp_get_col_ub - retrieve column upper bound * * SYNOPSIS * * double glp_get_col_ub(glp_prob *lp, int j); * * RETURNS * * The routine glp_get_col_ub returns the upper bound of j-th column, * i.e. the upper bound of corresponding structural variable. However, * if the column has no upper bound, the routine returns +DBL_MAX. */ double glp_get_col_ub(glp_prob *lp, int j) { double ub; if (!(1 <= j && j <= lp->n)) xerror("glp_get_col_ub: j = %d; column number out of range\n", j); switch (lp->col[j]->type) { case GLP_FR: case GLP_LO: ub = +DBL_MAX; break; case GLP_UP: case GLP_DB: case GLP_FX: ub = lp->col[j]->ub; break; default: xassert(lp != lp); } return ub; } /*********************************************************************** * NAME * * glp_get_obj_coef - retrieve obj. coefficient or constant term * * SYNOPSIS * * double glp_get_obj_coef(glp_prob *lp, int j); * * RETURNS * * The routine glp_get_obj_coef returns the objective coefficient at * j-th structural variable (column) of the specified problem object. * * If the parameter j is zero, the routine returns the constant term * ("shift") of the objective function. */ double glp_get_obj_coef(glp_prob *lp, int j) { if (!(0 <= j && j <= lp->n)) xerror("glp_get_obj_coef: j = %d; column number out of range\n" , j); return j == 0 ? lp->c0 : lp->col[j]->coef; } /*********************************************************************** * NAME * * glp_get_num_nz - retrieve number of constraint coefficients * * SYNOPSIS * * int glp_get_num_nz(glp_prob *lp); * * RETURNS * * The routine glp_get_num_nz returns the number of (non-zero) elements * in the constraint matrix of the specified problem object. */ int glp_get_num_nz(glp_prob *lp) { int nnz = lp->nnz; return nnz; } /*********************************************************************** * NAME * * glp_get_mat_row - retrieve row of the constraint matrix * * SYNOPSIS * * int glp_get_mat_row(glp_prob *lp, int i, int ind[], double val[]); * * DESCRIPTION * * The routine glp_get_mat_row scans (non-zero) elements of i-th row * of the constraint matrix of the specified problem object and stores * their column indices and numeric values to locations ind[1], ..., * ind[len] and val[1], ..., val[len], respectively, where 0 <= len <= n * is the number of elements in i-th row, n is the number of columns. * * The parameter ind and/or val can be specified as NULL, in which case * corresponding information is not stored. * * RETURNS * * The routine glp_get_mat_row returns the length len, i.e. the number * of (non-zero) elements in i-th row. */ int glp_get_mat_row(glp_prob *lp, int i, int ind[], double val[]) { GLPAIJ *aij; int len; if (!(1 <= i && i <= lp->m)) xerror("glp_get_mat_row: i = %d; row number out of range\n", i); len = 0; for (aij = lp->row[i]->ptr; aij != NULL; aij = aij->r_next) { len++; if (ind != NULL) ind[len] = aij->col->j; if (val != NULL) val[len] = aij->val; } xassert(len <= lp->n); return len; } /*********************************************************************** * NAME * * glp_get_mat_col - retrieve column of the constraint matrix * * SYNOPSIS * * int glp_get_mat_col(glp_prob *lp, int j, int ind[], double val[]); * * DESCRIPTION * * The routine glp_get_mat_col scans (non-zero) elements of j-th column * of the constraint matrix of the specified problem object and stores * their row indices and numeric values to locations ind[1], ..., * ind[len] and val[1], ..., val[len], respectively, where 0 <= len <= m * is the number of elements in j-th column, m is the number of rows. * * The parameter ind or/and val can be specified as NULL, in which case * corresponding information is not stored. * * RETURNS * * The routine glp_get_mat_col returns the length len, i.e. the number * of (non-zero) elements in j-th column. */ int glp_get_mat_col(glp_prob *lp, int j, int ind[], double val[]) { GLPAIJ *aij; int len; if (!(1 <= j && j <= lp->n)) xerror("glp_get_mat_col: j = %d; column number out of range\n", j); len = 0; for (aij = lp->col[j]->ptr; aij != NULL; aij = aij->c_next) { len++; if (ind != NULL) ind[len] = aij->row->i; if (val != NULL) val[len] = aij->val; } xassert(len <= lp->m); return len; } /* eof */ glpk-5.0/src/api/prob3.c0000644000062000006210000001177513766346220014246 0ustar maomkpasswd/* prob3.c (problem row/column searching routines) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2000-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "prob.h" /*********************************************************************** * NAME * * glp_create_index - create the name index * * SYNOPSIS * * void glp_create_index(glp_prob *lp); * * DESCRIPTION * * The routine glp_create_index creates the name index for the * specified problem object. The name index is an auxiliary data * structure, which is intended to quickly (i.e. for logarithmic time) * find rows and columns by their names. * * This routine can be called at any time. If the name index already * exists, the routine does nothing. */ void glp_create_index(glp_prob *lp) { GLPROW *row; GLPCOL *col; int i, j; /* create row name index */ if (lp->r_tree == NULL) { lp->r_tree = avl_create_tree(avl_strcmp, NULL); for (i = 1; i <= lp->m; i++) { row = lp->row[i]; xassert(row->node == NULL); if (row->name != NULL) { row->node = avl_insert_node(lp->r_tree, row->name); avl_set_node_link(row->node, row); } } } /* create column name index */ if (lp->c_tree == NULL) { lp->c_tree = avl_create_tree(avl_strcmp, NULL); for (j = 1; j <= lp->n; j++) { col = lp->col[j]; xassert(col->node == NULL); if (col->name != NULL) { col->node = avl_insert_node(lp->c_tree, col->name); avl_set_node_link(col->node, col); } } } return; } /*********************************************************************** * NAME * * glp_find_row - find row by its name * * SYNOPSIS * * int glp_find_row(glp_prob *lp, const char *name); * * RETURNS * * The routine glp_find_row returns the ordinal number of a row, * which is assigned (by the routine glp_set_row_name) the specified * symbolic name. If no such row exists, the routine returns 0. */ int glp_find_row(glp_prob *lp, const char *name) { AVLNODE *node; int i = 0; if (lp->r_tree == NULL) xerror("glp_find_row: row name index does not exist\n"); if (!(name == NULL || name[0] == '\0' || strlen(name) > 255)) { node = avl_find_node(lp->r_tree, name); if (node != NULL) i = ((GLPROW *)avl_get_node_link(node))->i; } return i; } /*********************************************************************** * NAME * * glp_find_col - find column by its name * * SYNOPSIS * * int glp_find_col(glp_prob *lp, const char *name); * * RETURNS * * The routine glp_find_col returns the ordinal number of a column, * which is assigned (by the routine glp_set_col_name) the specified * symbolic name. If no such column exists, the routine returns 0. */ int glp_find_col(glp_prob *lp, const char *name) { AVLNODE *node; int j = 0; if (lp->c_tree == NULL) xerror("glp_find_col: column name index does not exist\n"); if (!(name == NULL || name[0] == '\0' || strlen(name) > 255)) { node = avl_find_node(lp->c_tree, name); if (node != NULL) j = ((GLPCOL *)avl_get_node_link(node))->j; } return j; } /*********************************************************************** * NAME * * glp_delete_index - delete the name index * * SYNOPSIS * * void glp_delete_index(glp_prob *lp); * * DESCRIPTION * * The routine glp_delete_index deletes the name index previously * created by the routine glp_create_index and frees the memory * allocated to this auxiliary data structure. * * This routine can be called at any time. If the name index does not * exist, the routine does nothing. */ void glp_delete_index(glp_prob *lp) { int i, j; /* delete row name index */ if (lp->r_tree != NULL) { for (i = 1; i <= lp->m; i++) lp->row[i]->node = NULL; avl_delete_tree(lp->r_tree), lp->r_tree = NULL; } /* delete column name index */ if (lp->c_tree != NULL) { for (j = 1; j <= lp->n; j++) lp->col[j]->node = NULL; avl_delete_tree(lp->c_tree), lp->c_tree = NULL; } return; } /* eof */ glpk-5.0/src/api/prob4.c0000644000062000006210000001063613766346220014242 0ustar maomkpasswd/* prob4.c (problem scaling routines) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2000-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "prob.h" /*********************************************************************** * NAME * * glp_set_rii - set (change) row scale factor * * SYNOPSIS * * void glp_set_rii(glp_prob *lp, int i, double rii); * * DESCRIPTION * * The routine glp_set_rii sets (changes) the scale factor r[i,i] for * i-th row of the specified problem object. */ void glp_set_rii(glp_prob *lp, int i, double rii) { if (!(1 <= i && i <= lp->m)) xerror("glp_set_rii: i = %d; row number out of range\n", i); if (rii <= 0.0) xerror("glp_set_rii: i = %d; rii = %g; invalid scale factor\n", i, rii); if (lp->valid && lp->row[i]->rii != rii) { GLPAIJ *aij; for (aij = lp->row[i]->ptr; aij != NULL; aij = aij->r_next) { if (aij->col->stat == GLP_BS) { /* invalidate the basis factorization */ lp->valid = 0; break; } } } lp->row[i]->rii = rii; return; } /*********************************************************************** * NAME * * glp_set sjj - set (change) column scale factor * * SYNOPSIS * * void glp_set_sjj(glp_prob *lp, int j, double sjj); * * DESCRIPTION * * The routine glp_set_sjj sets (changes) the scale factor s[j,j] for * j-th column of the specified problem object. */ void glp_set_sjj(glp_prob *lp, int j, double sjj) { if (!(1 <= j && j <= lp->n)) xerror("glp_set_sjj: j = %d; column number out of range\n", j); if (sjj <= 0.0) xerror("glp_set_sjj: j = %d; sjj = %g; invalid scale factor\n", j, sjj); if (lp->valid && lp->col[j]->sjj != sjj && lp->col[j]->stat == GLP_BS) { /* invalidate the basis factorization */ lp->valid = 0; } lp->col[j]->sjj = sjj; return; } /*********************************************************************** * NAME * * glp_get_rii - retrieve row scale factor * * SYNOPSIS * * double glp_get_rii(glp_prob *lp, int i); * * RETURNS * * The routine glp_get_rii returns current scale factor r[i,i] for i-th * row of the specified problem object. */ double glp_get_rii(glp_prob *lp, int i) { if (!(1 <= i && i <= lp->m)) xerror("glp_get_rii: i = %d; row number out of range\n", i); return lp->row[i]->rii; } /*********************************************************************** * NAME * * glp_get_sjj - retrieve column scale factor * * SYNOPSIS * * double glp_get_sjj(glp_prob *lp, int j); * * RETURNS * * The routine glp_get_sjj returns current scale factor s[j,j] for j-th * column of the specified problem object. */ double glp_get_sjj(glp_prob *lp, int j) { if (!(1 <= j && j <= lp->n)) xerror("glp_get_sjj: j = %d; column number out of range\n", j); return lp->col[j]->sjj; } /*********************************************************************** * NAME * * glp_unscale_prob - unscale problem data * * SYNOPSIS * * void glp_unscale_prob(glp_prob *lp); * * DESCRIPTION * * The routine glp_unscale_prob performs unscaling of problem data for * the specified problem object. * * "Unscaling" means replacing the current scaling matrices R and S by * unity matrices that cancels the scaling effect. */ void glp_unscale_prob(glp_prob *lp) { int m = glp_get_num_rows(lp); int n = glp_get_num_cols(lp); int i, j; for (i = 1; i <= m; i++) glp_set_rii(lp, i, 1.0); for (j = 1; j <= n; j++) glp_set_sjj(lp, j, 1.0); return; } /* eof */ glpk-5.0/src/api/prob5.c0000644000062000006210000001275313766346220014245 0ustar maomkpasswd/* prob5.c (LP problem basis constructing routines) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2000-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "prob.h" /*********************************************************************** * NAME * * glp_set_row_stat - set (change) row status * * SYNOPSIS * * void glp_set_row_stat(glp_prob *lp, int i, int stat); * * DESCRIPTION * * The routine glp_set_row_stat sets (changes) status of the auxiliary * variable associated with i-th row. * * The new status of the auxiliary variable should be specified by the * parameter stat as follows: * * GLP_BS - basic variable; * GLP_NL - non-basic variable; * GLP_NU - non-basic variable on its upper bound; if the variable is * not double-bounded, this means the same as GLP_NL (only in * case of this routine); * GLP_NF - the same as GLP_NL (only in case of this routine); * GLP_NS - the same as GLP_NL (only in case of this routine). */ void glp_set_row_stat(glp_prob *lp, int i, int stat) { GLPROW *row; if (!(1 <= i && i <= lp->m)) xerror("glp_set_row_stat: i = %d; row number out of range\n", i); if (!(stat == GLP_BS || stat == GLP_NL || stat == GLP_NU || stat == GLP_NF || stat == GLP_NS)) xerror("glp_set_row_stat: i = %d; stat = %d; invalid status\n", i, stat); row = lp->row[i]; if (stat != GLP_BS) { switch (row->type) { case GLP_FR: stat = GLP_NF; break; case GLP_LO: stat = GLP_NL; break; case GLP_UP: stat = GLP_NU; break; case GLP_DB: if (stat != GLP_NU) stat = GLP_NL; break; case GLP_FX: stat = GLP_NS; break; default: xassert(row != row); } } if (row->stat == GLP_BS && stat != GLP_BS || row->stat != GLP_BS && stat == GLP_BS) { /* invalidate the basis factorization */ lp->valid = 0; } row->stat = stat; return; } /*********************************************************************** * NAME * * glp_set_col_stat - set (change) column status * * SYNOPSIS * * void glp_set_col_stat(glp_prob *lp, int j, int stat); * * DESCRIPTION * * The routine glp_set_col_stat sets (changes) status of the structural * variable associated with j-th column. * * The new status of the structural variable should be specified by the * parameter stat as follows: * * GLP_BS - basic variable; * GLP_NL - non-basic variable; * GLP_NU - non-basic variable on its upper bound; if the variable is * not double-bounded, this means the same as GLP_NL (only in * case of this routine); * GLP_NF - the same as GLP_NL (only in case of this routine); * GLP_NS - the same as GLP_NL (only in case of this routine). */ void glp_set_col_stat(glp_prob *lp, int j, int stat) { GLPCOL *col; if (!(1 <= j && j <= lp->n)) xerror("glp_set_col_stat: j = %d; column number out of range\n" , j); if (!(stat == GLP_BS || stat == GLP_NL || stat == GLP_NU || stat == GLP_NF || stat == GLP_NS)) xerror("glp_set_col_stat: j = %d; stat = %d; invalid status\n", j, stat); col = lp->col[j]; if (stat != GLP_BS) { switch (col->type) { case GLP_FR: stat = GLP_NF; break; case GLP_LO: stat = GLP_NL; break; case GLP_UP: stat = GLP_NU; break; case GLP_DB: if (stat != GLP_NU) stat = GLP_NL; break; case GLP_FX: stat = GLP_NS; break; default: xassert(col != col); } } if (col->stat == GLP_BS && stat != GLP_BS || col->stat != GLP_BS && stat == GLP_BS) { /* invalidate the basis factorization */ lp->valid = 0; } col->stat = stat; return; } /*********************************************************************** * NAME * * glp_std_basis - construct standard initial LP basis * * SYNOPSIS * * void glp_std_basis(glp_prob *lp); * * DESCRIPTION * * The routine glp_std_basis builds the "standard" (trivial) initial * basis for the specified problem object. * * In the "standard" basis all auxiliary variables are basic, and all * structural variables are non-basic. */ void glp_std_basis(glp_prob *lp) { int i, j; /* make all auxiliary variables basic */ for (i = 1; i <= lp->m; i++) glp_set_row_stat(lp, i, GLP_BS); /* make all structural variables non-basic */ for (j = 1; j <= lp->n; j++) { GLPCOL *col = lp->col[j]; if (col->type == GLP_DB && fabs(col->lb) > fabs(col->ub)) glp_set_col_stat(lp, j, GLP_NU); else glp_set_col_stat(lp, j, GLP_NL); } return; } /* eof */ glpk-5.0/src/api/prrngs.c0000644000062000006210000002530713766346220014530 0ustar maomkpasswd/* prrngs.c (print sensitivity analysis report) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2009-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "prob.h" #define xfprintf glp_format static char *format(char buf[13+1], double x) { /* format floating-point number in MPS/360-like style */ if (x == -DBL_MAX) strcpy(buf, " -Inf"); else if (x == +DBL_MAX) strcpy(buf, " +Inf"); else if (fabs(x) <= 999999.99998) { sprintf(buf, "%13.5f", x); #if 1 if (strcmp(buf, " 0.00000") == 0 || strcmp(buf, " -0.00000") == 0) strcpy(buf, " . "); else if (memcmp(buf, " 0.", 8) == 0) memcpy(buf, " .", 8); else if (memcmp(buf, " -0.", 8) == 0) memcpy(buf, " -.", 8); #endif } else sprintf(buf, "%13.6g", x); return buf; } int glp_print_ranges(glp_prob *P, int len, const int list[], int flags, const char *fname) { /* print sensitivity analysis report */ glp_file *fp = NULL; GLPROW *row; GLPCOL *col; int m, n, pass, k, t, numb, type, stat, var1, var2, count, page, ret; double lb, ub, slack, coef, prim, dual, value1, value2, coef1, coef2, obj1, obj2; const char *name, *limit; char buf[13+1]; /* sanity checks */ #if 0 /* 04/IV-2016 */ if (P == NULL || P->magic != GLP_PROB_MAGIC) xerror("glp_print_ranges: P = %p; invalid problem object\n", P); #endif m = P->m, n = P->n; if (len < 0) xerror("glp_print_ranges: len = %d; invalid list length\n", len); if (len > 0) { if (list == NULL) xerror("glp_print_ranges: list = %p: invalid parameter\n", list); for (t = 1; t <= len; t++) { k = list[t]; if (!(1 <= k && k <= m+n)) xerror("glp_print_ranges: list[%d] = %d; row/column numb" "er out of range\n", t, k); } } if (flags != 0) xerror("glp_print_ranges: flags = %d; invalid parameter\n", flags); if (fname == NULL) xerror("glp_print_ranges: fname = %p; invalid parameter\n", fname); if (glp_get_status(P) != GLP_OPT) { xprintf("glp_print_ranges: optimal basic solution required\n"); ret = 1; goto done; } if (!glp_bf_exists(P)) { xprintf("glp_print_ranges: basis factorization required\n"); ret = 2; goto done; } /* start reporting */ xprintf("Write sensitivity analysis report to '%s'...\n", fname); fp = glp_open(fname, "w"); if (fp == NULL) { xprintf("Unable to create '%s' - %s\n", fname, get_err_msg()); ret = 3; goto done; } page = count = 0; for (pass = 1; pass <= 2; pass++) for (t = 1; t <= (len == 0 ? m+n : len); t++) { if (t == 1) count = 0; k = (len == 0 ? t : list[t]); if (pass == 1 && k > m || pass == 2 && k <= m) continue; if (count == 0) { xfprintf(fp, "GLPK %-4s - SENSITIVITY ANALYSIS REPORT%73sPa" "ge%4d\n", glp_version(), "", ++page); xfprintf(fp, "\n"); xfprintf(fp, "%-12s%s\n", "Problem:", P->name == NULL ? "" : P->name); xfprintf(fp, "%-12s%s%s%.10g (%s)\n", "Objective:", P->obj == NULL ? "" : P->obj, P->obj == NULL ? "" : " = ", P->obj_val, P->dir == GLP_MIN ? "MINimum" : P->dir == GLP_MAX ? "MAXimum" : "???"); xfprintf(fp, "\n"); xfprintf(fp, "%6s %-12s %2s %13s %13s %13s %13s %13s %13s " "%s\n", "No.", pass == 1 ? "Row name" : "Column name", "St", "Activity", pass == 1 ? "Slack" : "Obj coef", "Lower bound", "Activity", "Obj coef", "Obj value at", "Limiting"); xfprintf(fp, "%6s %-12s %2s %13s %13s %13s %13s %13s %13s " "%s\n", "", "", "", "", "Marginal", "Upper bound", "range", "range", "break point", "variable"); xfprintf(fp, "------ ------------ -- ------------- --------" "----- ------------- ------------- ------------- ------" "------- ------------\n"); } if (pass == 1) { numb = k; xassert(1 <= numb && numb <= m); row = P->row[numb]; name = row->name; type = row->type; lb = glp_get_row_lb(P, numb); ub = glp_get_row_ub(P, numb); coef = 0.0; stat = row->stat; prim = row->prim; if (type == GLP_FR) slack = - prim; else if (type == GLP_LO) slack = lb - prim; else if (type == GLP_UP || type == GLP_DB || type == GLP_FX) slack = ub - prim; dual = row->dual; } else { numb = k - m; xassert(1 <= numb && numb <= n); col = P->col[numb]; name = col->name; lb = glp_get_col_lb(P, numb); ub = glp_get_col_ub(P, numb); coef = col->coef; stat = col->stat; prim = col->prim; slack = 0.0; dual = col->dual; } if (stat != GLP_BS) { glp_analyze_bound(P, k, &value1, &var1, &value2, &var2); if (stat == GLP_NF) coef1 = coef2 = coef; else if (stat == GLP_NS) coef1 = -DBL_MAX, coef2 = +DBL_MAX; else if (stat == GLP_NL && P->dir == GLP_MIN || stat == GLP_NU && P->dir == GLP_MAX) coef1 = coef - dual, coef2 = +DBL_MAX; else coef1 = -DBL_MAX, coef2 = coef - dual; if (value1 == -DBL_MAX) { if (dual < -1e-9) obj1 = +DBL_MAX; else if (dual > +1e-9) obj1 = -DBL_MAX; else obj1 = P->obj_val; } else obj1 = P->obj_val + dual * (value1 - prim); if (value2 == +DBL_MAX) { if (dual < -1e-9) obj2 = -DBL_MAX; else if (dual > +1e-9) obj2 = +DBL_MAX; else obj2 = P->obj_val; } else obj2 = P->obj_val + dual * (value2 - prim); } else { glp_analyze_coef(P, k, &coef1, &var1, &value1, &coef2, &var2, &value2); if (coef1 == -DBL_MAX) { if (prim < -1e-9) obj1 = +DBL_MAX; else if (prim > +1e-9) obj1 = -DBL_MAX; else obj1 = P->obj_val; } else obj1 = P->obj_val + (coef1 - coef) * prim; if (coef2 == +DBL_MAX) { if (prim < -1e-9) obj2 = -DBL_MAX; else if (prim > +1e-9) obj2 = +DBL_MAX; else obj2 = P->obj_val; } else obj2 = P->obj_val + (coef2 - coef) * prim; } /*** first line ***/ /* row/column number */ xfprintf(fp, "%6d", numb); /* row/column name */ xfprintf(fp, " %-12.12s", name == NULL ? "" : name); if (name != NULL && strlen(name) > 12) xfprintf(fp, "%s\n%6s %12s", name+12, "", ""); /* row/column status */ xfprintf(fp, " %2s", stat == GLP_BS ? "BS" : stat == GLP_NL ? "NL" : stat == GLP_NU ? "NU" : stat == GLP_NF ? "NF" : stat == GLP_NS ? "NS" : "??"); /* row/column activity */ xfprintf(fp, " %s", format(buf, prim)); /* row slack, column objective coefficient */ xfprintf(fp, " %s", format(buf, k <= m ? slack : coef)); /* row/column lower bound */ xfprintf(fp, " %s", format(buf, lb)); /* row/column activity range */ xfprintf(fp, " %s", format(buf, value1)); /* row/column objective coefficient range */ xfprintf(fp, " %s", format(buf, coef1)); /* objective value at break point */ xfprintf(fp, " %s", format(buf, obj1)); /* limiting variable name */ if (var1 != 0) { if (var1 <= m) limit = glp_get_row_name(P, var1); else limit = glp_get_col_name(P, var1 - m); if (limit != NULL) xfprintf(fp, " %s", limit); } xfprintf(fp, "\n"); /*** second line ***/ xfprintf(fp, "%6s %-12s %2s %13s", "", "", "", ""); /* row/column reduced cost */ xfprintf(fp, " %s", format(buf, dual)); /* row/column upper bound */ xfprintf(fp, " %s", format(buf, ub)); /* row/column activity range */ xfprintf(fp, " %s", format(buf, value2)); /* row/column objective coefficient range */ xfprintf(fp, " %s", format(buf, coef2)); /* objective value at break point */ xfprintf(fp, " %s", format(buf, obj2)); /* limiting variable name */ if (var2 != 0) { if (var2 <= m) limit = glp_get_row_name(P, var2); else limit = glp_get_col_name(P, var2 - m); if (limit != NULL) xfprintf(fp, " %s", limit); } xfprintf(fp, "\n"); xfprintf(fp, "\n"); /* print 10 items per page */ count = (count + 1) % 10; } xfprintf(fp, "End of report\n"); #if 0 /* FIXME */ xfflush(fp); #endif if (glp_ioerr(fp)) { xprintf("Write error on '%s' - %s\n", fname, get_err_msg()); ret = 4; goto done; } ret = 0; done: if (fp != NULL) glp_close(fp); return ret; } /* eof */ glpk-5.0/src/api/prsol.c0000644000062000006210000001764113766346220014356 0ustar maomkpasswd/* prsol.c (write basic solution in printable format) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2009-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "prob.h" #define xfprintf glp_format int glp_print_sol(glp_prob *P, const char *fname) { /* write basic solution in printable format */ glp_file *fp; GLPROW *row; GLPCOL *col; int i, j, t, ae_ind, re_ind, ret; double ae_max, re_max; xprintf("Writing basic solution to '%s'...\n", fname); fp = glp_open(fname, "w"); if (fp == NULL) { xprintf("Unable to create '%s' - %s\n", fname, get_err_msg()); ret = 1; goto done; } xfprintf(fp, "%-12s%s\n", "Problem:", P->name == NULL ? "" : P->name); xfprintf(fp, "%-12s%d\n", "Rows:", P->m); xfprintf(fp, "%-12s%d\n", "Columns:", P->n); xfprintf(fp, "%-12s%d\n", "Non-zeros:", P->nnz); t = glp_get_status(P); xfprintf(fp, "%-12s%s\n", "Status:", t == GLP_OPT ? "OPTIMAL" : t == GLP_FEAS ? "FEASIBLE" : t == GLP_INFEAS ? "INFEASIBLE (INTERMEDIATE)" : t == GLP_NOFEAS ? "INFEASIBLE (FINAL)" : t == GLP_UNBND ? "UNBOUNDED" : t == GLP_UNDEF ? "UNDEFINED" : "???"); xfprintf(fp, "%-12s%s%s%.10g (%s)\n", "Objective:", P->obj == NULL ? "" : P->obj, P->obj == NULL ? "" : " = ", P->obj_val, P->dir == GLP_MIN ? "MINimum" : P->dir == GLP_MAX ? "MAXimum" : "???"); xfprintf(fp, "\n"); xfprintf(fp, " No. Row name St Activity Lower bound " " Upper bound Marginal\n"); xfprintf(fp, "------ ------------ -- ------------- ------------- " "------------- -------------\n"); for (i = 1; i <= P->m; i++) { row = P->row[i]; xfprintf(fp, "%6d ", i); if (row->name == NULL || strlen(row->name) <= 12) xfprintf(fp, "%-12s ", row->name == NULL ? "" : row->name); else xfprintf(fp, "%s\n%20s", row->name, ""); xfprintf(fp, "%s ", row->stat == GLP_BS ? "B " : row->stat == GLP_NL ? "NL" : row->stat == GLP_NU ? "NU" : row->stat == GLP_NF ? "NF" : row->stat == GLP_NS ? "NS" : "??"); xfprintf(fp, "%13.6g ", fabs(row->prim) <= 1e-9 ? 0.0 : row->prim); if (row->type == GLP_LO || row->type == GLP_DB || row->type == GLP_FX) xfprintf(fp, "%13.6g ", row->lb); else xfprintf(fp, "%13s ", ""); if (row->type == GLP_UP || row->type == GLP_DB) xfprintf(fp, "%13.6g ", row->ub); else xfprintf(fp, "%13s ", row->type == GLP_FX ? "=" : ""); if (row->stat != GLP_BS) { if (fabs(row->dual) <= 1e-9) xfprintf(fp, "%13s", "< eps"); else xfprintf(fp, "%13.6g ", row->dual); } xfprintf(fp, "\n"); } xfprintf(fp, "\n"); xfprintf(fp, " No. Column name St Activity Lower bound " " Upper bound Marginal\n"); xfprintf(fp, "------ ------------ -- ------------- ------------- " "------------- -------------\n"); for (j = 1; j <= P->n; j++) { col = P->col[j]; xfprintf(fp, "%6d ", j); if (col->name == NULL || strlen(col->name) <= 12) xfprintf(fp, "%-12s ", col->name == NULL ? "" : col->name); else xfprintf(fp, "%s\n%20s", col->name, ""); xfprintf(fp, "%s ", col->stat == GLP_BS ? "B " : col->stat == GLP_NL ? "NL" : col->stat == GLP_NU ? "NU" : col->stat == GLP_NF ? "NF" : col->stat == GLP_NS ? "NS" : "??"); xfprintf(fp, "%13.6g ", fabs(col->prim) <= 1e-9 ? 0.0 : col->prim); if (col->type == GLP_LO || col->type == GLP_DB || col->type == GLP_FX) xfprintf(fp, "%13.6g ", col->lb); else xfprintf(fp, "%13s ", ""); if (col->type == GLP_UP || col->type == GLP_DB) xfprintf(fp, "%13.6g ", col->ub); else xfprintf(fp, "%13s ", col->type == GLP_FX ? "=" : ""); if (col->stat != GLP_BS) { if (fabs(col->dual) <= 1e-9) xfprintf(fp, "%13s", "< eps"); else xfprintf(fp, "%13.6g ", col->dual); } xfprintf(fp, "\n"); } xfprintf(fp, "\n"); xfprintf(fp, "Karush-Kuhn-Tucker optimality conditions:\n"); xfprintf(fp, "\n"); glp_check_kkt(P, GLP_SOL, GLP_KKT_PE, &ae_max, &ae_ind, &re_max, &re_ind); xfprintf(fp, "KKT.PE: max.abs.err = %.2e on row %d\n", ae_max, ae_ind); xfprintf(fp, " max.rel.err = %.2e on row %d\n", re_max, re_ind); xfprintf(fp, "%8s%s\n", "", re_max <= 1e-9 ? "High quality" : re_max <= 1e-6 ? "Medium quality" : re_max <= 1e-3 ? "Low quality" : "PRIMAL SOLUTION IS WRONG"); xfprintf(fp, "\n"); glp_check_kkt(P, GLP_SOL, GLP_KKT_PB, &ae_max, &ae_ind, &re_max, &re_ind); xfprintf(fp, "KKT.PB: max.abs.err = %.2e on %s %d\n", ae_max, ae_ind <= P->m ? "row" : "column", ae_ind <= P->m ? ae_ind : ae_ind - P->m); xfprintf(fp, " max.rel.err = %.2e on %s %d\n", re_max, re_ind <= P->m ? "row" : "column", re_ind <= P->m ? re_ind : re_ind - P->m); xfprintf(fp, "%8s%s\n", "", re_max <= 1e-9 ? "High quality" : re_max <= 1e-6 ? "Medium quality" : re_max <= 1e-3 ? "Low quality" : "PRIMAL SOLUTION IS INFEASIBL" "E"); xfprintf(fp, "\n"); glp_check_kkt(P, GLP_SOL, GLP_KKT_DE, &ae_max, &ae_ind, &re_max, &re_ind); xfprintf(fp, "KKT.DE: max.abs.err = %.2e on column %d\n", ae_max, ae_ind == 0 ? 0 : ae_ind - P->m); xfprintf(fp, " max.rel.err = %.2e on column %d\n", re_max, re_ind == 0 ? 0 : re_ind - P->m); xfprintf(fp, "%8s%s\n", "", re_max <= 1e-9 ? "High quality" : re_max <= 1e-6 ? "Medium quality" : re_max <= 1e-3 ? "Low quality" : "DUAL SOLUTION IS WRONG"); xfprintf(fp, "\n"); glp_check_kkt(P, GLP_SOL, GLP_KKT_DB, &ae_max, &ae_ind, &re_max, &re_ind); xfprintf(fp, "KKT.DB: max.abs.err = %.2e on %s %d\n", ae_max, ae_ind <= P->m ? "row" : "column", ae_ind <= P->m ? ae_ind : ae_ind - P->m); xfprintf(fp, " max.rel.err = %.2e on %s %d\n", re_max, re_ind <= P->m ? "row" : "column", re_ind <= P->m ? re_ind : re_ind - P->m); xfprintf(fp, "%8s%s\n", "", re_max <= 1e-9 ? "High quality" : re_max <= 1e-6 ? "Medium quality" : re_max <= 1e-3 ? "Low quality" : "DUAL SOLUTION IS INFEASIBLE") ; xfprintf(fp, "\n"); xfprintf(fp, "End of output\n"); #if 0 /* FIXME */ xfflush(fp); #endif if (glp_ioerr(fp)) { xprintf("Write error on '%s' - %s\n", fname, get_err_msg()); ret = 1; goto done; } ret = 0; done: if (fp != NULL) glp_close(fp); return ret; } /* eof */ glpk-5.0/src/api/rdasn.c0000644000062000006210000001340113766346220014314 0ustar maomkpasswd/* rdasn.c (read assignment problem data in DIMACS format) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2009-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "dimacs.h" #include "glpk.h" #include "misc.h" #define error dmx_error #define warning dmx_warning #define read_char dmx_read_char #define read_designator dmx_read_designator #define read_field dmx_read_field #define end_of_line dmx_end_of_line #define check_int dmx_check_int /*********************************************************************** * NAME * * glp_read_asnprob - read assignment problem data in DIMACS format * * SYNOPSIS * * int glp_read_asnprob(glp_graph *G, int v_set, int a_cost, * const char *fname); * * DESCRIPTION * * The routine glp_read_asnprob reads assignment problem data in DIMACS * format from a text file. * * RETURNS * * If the operation was successful, the routine returns zero. Otherwise * it prints an error message and returns non-zero. */ int glp_read_asnprob(glp_graph *G, int v_set, int a_cost, const char *fname) { DMX _csa, *csa = &_csa; glp_vertex *v; glp_arc *a; int nv, na, n1, i, j, k, ret = 0; double cost; char *flag = NULL; if (v_set >= 0 && v_set > G->v_size - (int)sizeof(int)) xerror("glp_read_asnprob: v_set = %d; invalid offset\n", v_set); if (a_cost >= 0 && a_cost > G->a_size - (int)sizeof(double)) xerror("glp_read_asnprob: a_cost = %d; invalid offset\n", a_cost); glp_erase_graph(G, G->v_size, G->a_size); if (setjmp(csa->jump)) { ret = 1; goto done; } csa->fname = fname; csa->fp = NULL; csa->count = 0; csa->c = '\n'; csa->field[0] = '\0'; csa->empty = csa->nonint = 0; xprintf("Reading assignment problem data from '%s'...\n", fname); csa->fp = glp_open(fname, "r"); if (csa->fp == NULL) { xprintf("Unable to open '%s' - %s\n", fname, get_err_msg()); longjmp(csa->jump, 1); } /* read problem line */ read_designator(csa); if (strcmp(csa->field, "p") != 0) error(csa, "problem line missing or invalid"); read_field(csa); if (strcmp(csa->field, "asn") != 0) error(csa, "wrong problem designator; 'asn' expected"); read_field(csa); if (!(str2int(csa->field, &nv) == 0 && nv >= 0)) error(csa, "number of nodes missing or invalid"); read_field(csa); if (!(str2int(csa->field, &na) == 0 && na >= 0)) error(csa, "number of arcs missing or invalid"); if (nv > 0) glp_add_vertices(G, nv); end_of_line(csa); /* read node descriptor lines */ flag = xcalloc(1+nv, sizeof(char)); memset(&flag[1], 0, nv * sizeof(char)); n1 = 0; for (;;) { read_designator(csa); if (strcmp(csa->field, "n") != 0) break; read_field(csa); if (str2int(csa->field, &i) != 0) error(csa, "node number missing or invalid"); if (!(1 <= i && i <= nv)) error(csa, "node number %d out of range", i); if (flag[i]) error(csa, "duplicate descriptor of node %d", i); flag[i] = 1, n1++; end_of_line(csa); } xprintf( "Assignment problem has %d + %d = %d node%s and %d arc%s\n", n1, nv - n1, nv, nv == 1 ? "" : "s", na, na == 1 ? "" : "s"); if (v_set >= 0) { for (i = 1; i <= nv; i++) { v = G->v[i]; k = (flag[i] ? 0 : 1); memcpy((char *)v->data + v_set, &k, sizeof(int)); } } /* read arc descriptor lines */ for (k = 1; k <= na; k++) { if (k > 1) read_designator(csa); if (strcmp(csa->field, "a") != 0) error(csa, "wrong line designator; 'a' expected"); read_field(csa); if (str2int(csa->field, &i) != 0) error(csa, "starting node number missing or invalid"); if (!(1 <= i && i <= nv)) error(csa, "starting node number %d out of range", i); if (!flag[i]) error(csa, "node %d cannot be a starting node", i); read_field(csa); if (str2int(csa->field, &j) != 0) error(csa, "ending node number missing or invalid"); if (!(1 <= j && j <= nv)) error(csa, "ending node number %d out of range", j); if (flag[j]) error(csa, "node %d cannot be an ending node", j); read_field(csa); if (str2num(csa->field, &cost) != 0) error(csa, "arc cost missing or invalid"); check_int(csa, cost); a = glp_add_arc(G, i, j); if (a_cost >= 0) memcpy((char *)a->data + a_cost, &cost, sizeof(double)); end_of_line(csa); } xprintf("%d lines were read\n", csa->count); done: if (ret) glp_erase_graph(G, G->v_size, G->a_size); if (csa->fp != NULL) glp_close(csa->fp); if (flag != NULL) xfree(flag); return ret; } /* eof */ glpk-5.0/src/api/rdcc.c0000644000062000006210000001304713766346220014126 0ustar maomkpasswd/* rdcc.c (read graph in DIMACS clique/coloring format) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2009-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "dimacs.h" #include "glpk.h" #include "misc.h" #define error dmx_error #define warning dmx_warning #define read_char dmx_read_char #define read_designator dmx_read_designator #define read_field dmx_read_field #define end_of_line dmx_end_of_line #define check_int dmx_check_int /*********************************************************************** * NAME * * glp_read_ccdata - read graph in DIMACS clique/coloring format * * SYNOPSIS * * int glp_read_ccdata(glp_graph *G, int v_wgt, const char *fname); * * DESCRIPTION * * The routine glp_read_ccdata reads an (undirected) graph in DIMACS * clique/coloring format from a text file. * * RETURNS * * If the operation was successful, the routine returns zero. Otherwise * it prints an error message and returns non-zero. */ int glp_read_ccdata(glp_graph *G, int v_wgt, const char *fname) { DMX _csa, *csa = &_csa; glp_vertex *v; int i, j, k, nv, ne, ret = 0; double w; char *flag = NULL; if (v_wgt >= 0 && v_wgt > G->v_size - (int)sizeof(double)) xerror("glp_read_ccdata: v_wgt = %d; invalid offset\n", v_wgt); glp_erase_graph(G, G->v_size, G->a_size); if (setjmp(csa->jump)) { ret = 1; goto done; } csa->fname = fname; csa->fp = NULL; csa->count = 0; csa->c = '\n'; csa->field[0] = '\0'; csa->empty = csa->nonint = 0; xprintf("Reading graph from '%s'...\n", fname); csa->fp = glp_open(fname, "r"); if (csa->fp == NULL) { xprintf("Unable to open '%s' - %s\n", fname, get_err_msg()); longjmp(csa->jump, 1); } /* read problem line */ read_designator(csa); if (strcmp(csa->field, "p") != 0) error(csa, "problem line missing or invalid"); read_field(csa); if (strcmp(csa->field, "edge") != 0) error(csa, "wrong problem designator; 'edge' expected"); read_field(csa); if (!(str2int(csa->field, &nv) == 0 && nv >= 0)) error(csa, "number of vertices missing or invalid"); read_field(csa); if (!(str2int(csa->field, &ne) == 0 && ne >= 0)) error(csa, "number of edges missing or invalid"); xprintf("Graph has %d vert%s and %d edge%s\n", nv, nv == 1 ? "ex" : "ices", ne, ne == 1 ? "" : "s"); if (nv > 0) glp_add_vertices(G, nv); end_of_line(csa); /* read node descriptor lines */ flag = xcalloc(1+nv, sizeof(char)); memset(&flag[1], 0, nv * sizeof(char)); if (v_wgt >= 0) { w = 1.0; for (i = 1; i <= nv; i++) { v = G->v[i]; memcpy((char *)v->data + v_wgt, &w, sizeof(double)); } } for (;;) { read_designator(csa); if (strcmp(csa->field, "n") != 0) break; read_field(csa); if (str2int(csa->field, &i) != 0) error(csa, "vertex number missing or invalid"); if (!(1 <= i && i <= nv)) error(csa, "vertex number %d out of range", i); if (flag[i]) error(csa, "duplicate descriptor of vertex %d", i); read_field(csa); if (str2num(csa->field, &w) != 0) error(csa, "vertex weight missing or invalid"); check_int(csa, w); if (v_wgt >= 0) { v = G->v[i]; memcpy((char *)v->data + v_wgt, &w, sizeof(double)); } flag[i] = 1; end_of_line(csa); } xfree(flag), flag = NULL; /* read edge descriptor lines */ for (k = 1; k <= ne; k++) { if (k > 1) read_designator(csa); if (strcmp(csa->field, "e") != 0) error(csa, "wrong line designator; 'e' expected"); read_field(csa); if (str2int(csa->field, &i) != 0) error(csa, "first vertex number missing or invalid"); if (!(1 <= i && i <= nv)) error(csa, "first vertex number %d out of range", i); read_field(csa); if (str2int(csa->field, &j) != 0) error(csa, "second vertex number missing or invalid"); if (!(1 <= j && j <= nv)) error(csa, "second vertex number %d out of range", j); glp_add_arc(G, i, j); end_of_line(csa); } xprintf("%d lines were read\n", csa->count); done: if (ret) glp_erase_graph(G, G->v_size, G->a_size); if (csa->fp != NULL) glp_close(csa->fp); if (flag != NULL) xfree(flag); return ret; } /**********************************************************************/ int glp_read_graph(glp_graph *G, const char *fname) { return glp_read_ccdata(G, -1, fname); } /* eof */ glpk-5.0/src/api/rdcnf.c0000644000062000006210000001133613766346220014306 0ustar maomkpasswd/* rdcnf.c (read CNF-SAT problem data in DIMACS format) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2010-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "dimacs.h" #include "misc.h" #include "prob.h" #define xfprintf glp_format #define error dmx_error #define warning dmx_warning #define read_char dmx_read_char #define read_designator dmx_read_designator #define read_field dmx_read_field #define end_of_line dmx_end_of_line #define check_int dmx_check_int int glp_read_cnfsat(glp_prob *P, const char *fname) { /* read CNF-SAT problem data in DIMACS format */ DMX _csa, *csa = &_csa; int m, n, i, j, len, neg, rhs, ret = 0, *ind = NULL; double *val = NULL; char *map = NULL; #if 0 /* 04/IV-2016 */ if (P == NULL || P->magic != GLP_PROB_MAGIC) xerror("glp_read_cnfsat: P = %p; invalid problem object\n", P); #endif if (fname == NULL) xerror("glp_read_cnfsat: fname = %p; invalid parameter\n", fname); glp_erase_prob(P); if (setjmp(csa->jump)) { ret = 1; goto done; } csa->fname = fname; csa->fp = NULL; csa->count = 0; csa->c = '\n'; csa->field[0] = '\0'; csa->empty = csa->nonint = 0; xprintf("Reading CNF-SAT problem data from '%s'...\n", fname); csa->fp = glp_open(fname, "r"); if (csa->fp == NULL) { xprintf("Unable to open '%s' - %s\n", fname, get_err_msg()); longjmp(csa->jump, 1); } /* read problem line */ read_designator(csa); if (strcmp(csa->field, "p") != 0) error(csa, "problem line missing or invalid"); read_field(csa); if (strcmp(csa->field, "cnf") != 0) error(csa, "wrong problem designator; 'cnf' expected\n"); read_field(csa); if (!(str2int(csa->field, &n) == 0 && n >= 0)) error(csa, "number of variables missing or invalid\n"); read_field(csa); if (!(str2int(csa->field, &m) == 0 && m >= 0)) error(csa, "number of clauses missing or invalid\n"); xprintf("Instance has %d variable%s and %d clause%s\n", n, n == 1 ? "" : "s", m, m == 1 ? "" : "s"); end_of_line(csa); if (m > 0) glp_add_rows(P, m); if (n > 0) { glp_add_cols(P, n); for (j = 1; j <= n; j++) glp_set_col_kind(P, j, GLP_BV); } /* allocate working arrays */ ind = xcalloc(1+n, sizeof(int)); val = xcalloc(1+n, sizeof(double)); map = xcalloc(1+n, sizeof(char)); for (j = 1; j <= n; j++) map[j] = 0; /* read clauses */ for (i = 1; i <= m; i++) { /* read i-th clause */ len = 0, rhs = 1; for (;;) { /* skip white-space characters */ while (csa->c == ' ' || csa->c == '\n') read_char(csa); /* read term */ read_field(csa); if (str2int(csa->field, &j) != 0) error(csa, "variable number missing or invalid\n"); if (j > 0) neg = 0; else if (j < 0) neg = 1, j = -j, rhs--; else break; if (!(1 <= j && j <= n)) error(csa, "variable number out of range\n"); if (map[j]) error(csa, "duplicate variable number\n"); len++, ind[len] = j, val[len] = (neg ? -1.0 : +1.0); map[j] = 1; } glp_set_row_bnds(P, i, GLP_LO, (double)rhs, 0.0); glp_set_mat_row(P, i, len, ind, val); while (len > 0) map[ind[len--]] = 0; } xprintf("%d lines were read\n", csa->count); /* problem data has been successfully read */ glp_sort_matrix(P); done: if (csa->fp != NULL) glp_close(csa->fp); if (ind != NULL) xfree(ind); if (val != NULL) xfree(val); if (map != NULL) xfree(map); if (ret) glp_erase_prob(P); return ret; } /* eof */ glpk-5.0/src/api/rdipt.c0000644000062000006210000001500713766346220014333 0ustar maomkpasswd/* rdipt.c (read interior-point solution in GLPK format) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2010-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "dimacs.h" #include "env.h" #include "misc.h" #include "prob.h" /*********************************************************************** * NAME * * glp_read_ipt - read interior-point solution in GLPK format * * SYNOPSIS * * int glp_read_ipt(glp_prob *P, const char *fname); * * DESCRIPTION * * The routine glp_read_ipt reads interior-point solution from a text * file in GLPK format. * * RETURNS * * If the operation was successful, the routine returns zero. Otherwise * it prints an error message and returns non-zero. */ int glp_read_ipt(glp_prob *P, const char *fname) { DMX dmx_, *dmx = &dmx_; int i, j, k, m, n, sst, ret = 1; char *stat = NULL; double obj, *prim = NULL, *dual = NULL; #if 0 /* 04/IV-2016 */ if (P == NULL || P->magic != GLP_PROB_MAGIC) xerror("glp_read_ipt: P = %p; invalid problem object\n", P); #endif if (fname == NULL) xerror("glp_read_ipt: fname = %d; invalid parameter\n", fname); if (setjmp(dmx->jump)) goto done; dmx->fname = fname; dmx->fp = NULL; dmx->count = 0; dmx->c = '\n'; dmx->field[0] = '\0'; dmx->empty = dmx->nonint = 0; xprintf("Reading interior-point solution from '%s'...\n", fname); dmx->fp = glp_open(fname, "r"); if (dmx->fp == NULL) { xprintf("Unable to open '%s' - %s\n", fname, get_err_msg()); goto done; } /* read solution line */ dmx_read_designator(dmx); if (strcmp(dmx->field, "s") != 0) dmx_error(dmx, "solution line missing or invalid"); dmx_read_field(dmx); if (strcmp(dmx->field, "ipt") != 0) dmx_error(dmx, "wrong solution designator; 'ipt' expected"); dmx_read_field(dmx); if (!(str2int(dmx->field, &m) == 0 && m >= 0)) dmx_error(dmx, "number of rows missing or invalid"); if (m != P->m) dmx_error(dmx, "number of rows mismatch"); dmx_read_field(dmx); if (!(str2int(dmx->field, &n) == 0 && n >= 0)) dmx_error(dmx, "number of columns missing or invalid"); if (n != P->n) dmx_error(dmx, "number of columns mismatch"); dmx_read_field(dmx); if (strcmp(dmx->field, "o") == 0) sst = GLP_OPT; else if (strcmp(dmx->field, "i") == 0) sst = GLP_INFEAS; else if (strcmp(dmx->field, "n") == 0) sst = GLP_NOFEAS; else if (strcmp(dmx->field, "u") == 0) sst = GLP_UNDEF; else dmx_error(dmx, "solution status missing or invalid"); dmx_read_field(dmx); if (str2num(dmx->field, &obj) != 0) dmx_error(dmx, "objective value missing or invalid"); dmx_end_of_line(dmx); /* allocate working arrays */ stat = xalloc(1+m+n, sizeof(stat[0])); for (k = 1; k <= m+n; k++) stat[k] = '?'; prim = xalloc(1+m+n, sizeof(prim[0])); dual = xalloc(1+m+n, sizeof(dual[0])); /* read solution descriptor lines */ for (;;) { dmx_read_designator(dmx); if (strcmp(dmx->field, "i") == 0) { /* row solution descriptor */ dmx_read_field(dmx); if (str2int(dmx->field, &i) != 0) dmx_error(dmx, "row number missing or invalid"); if (!(1 <= i && i <= m)) dmx_error(dmx, "row number out of range"); if (stat[i] != '?') dmx_error(dmx, "duplicate row solution descriptor"); stat[i] = GLP_BS; dmx_read_field(dmx); if (str2num(dmx->field, &prim[i]) != 0) dmx_error(dmx, "row primal value missing or invalid"); dmx_read_field(dmx); if (str2num(dmx->field, &dual[i]) != 0) dmx_error(dmx, "row dual value missing or invalid"); dmx_end_of_line(dmx); } else if (strcmp(dmx->field, "j") == 0) { /* column solution descriptor */ dmx_read_field(dmx); if (str2int(dmx->field, &j) != 0) dmx_error(dmx, "column number missing or invalid"); if (!(1 <= j && j <= n)) dmx_error(dmx, "column number out of range"); if (stat[m+j] != '?') dmx_error(dmx, "duplicate column solution descriptor"); stat[m+j] = GLP_BS; dmx_read_field(dmx); if (str2num(dmx->field, &prim[m+j]) != 0) dmx_error(dmx, "column primal value missing or invalid"); dmx_read_field(dmx); if (str2num(dmx->field, &dual[m+j]) != 0) dmx_error(dmx, "column dual value missing or invalid"); dmx_end_of_line(dmx); } else if (strcmp(dmx->field, "e") == 0) break; else dmx_error(dmx, "line designator missing or invalid"); dmx_end_of_line(dmx); } /* store solution components into problem object */ for (k = 1; k <= m+n; k++) { if (stat[k] == '?') dmx_error(dmx, "incomplete interior-point solution"); } P->ipt_stat = sst; P->ipt_obj = obj; for (i = 1; i <= m; i++) { P->row[i]->pval = prim[i]; P->row[i]->dval = dual[i]; } for (j = 1; j <= n; j++) { P->col[j]->pval = prim[m+j]; P->col[j]->dval = dual[m+j]; } /* interior-point solution has been successfully read */ xprintf("%d lines were read\n", dmx->count); ret = 0; done: if (dmx->fp != NULL) glp_close(dmx->fp); if (stat != NULL) xfree(stat); if (prim != NULL) xfree(prim); if (dual != NULL) xfree(dual); return ret; } /* eof */ glpk-5.0/src/api/rdmaxf.c0000644000062000006210000001327613766346220014500 0ustar maomkpasswd/* rdmaxf.c (read maximum flow problem data in DIMACS format) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2009-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "dimacs.h" #include "glpk.h" #include "misc.h" #define error dmx_error #define warning dmx_warning #define read_char dmx_read_char #define read_designator dmx_read_designator #define read_field dmx_read_field #define end_of_line dmx_end_of_line #define check_int dmx_check_int /*********************************************************************** * NAME * * glp_read_maxflow - read maximum flow problem data in DIMACS format * * SYNOPSIS * * int glp_read_maxflow(glp_graph *G, int *s, int *t, int a_cap, * const char *fname); * * DESCRIPTION * * The routine glp_read_maxflow reads maximum flow problem data in * DIMACS format from a text file. * * RETURNS * * If the operation was successful, the routine returns zero. Otherwise * it prints an error message and returns non-zero. */ int glp_read_maxflow(glp_graph *G, int *_s, int *_t, int a_cap, const char *fname) { DMX _csa, *csa = &_csa; glp_arc *a; int i, j, k, s, t, nv, na, ret = 0; double cap; if (a_cap >= 0 && a_cap > G->a_size - (int)sizeof(double)) xerror("glp_read_maxflow: a_cap = %d; invalid offset\n", a_cap); glp_erase_graph(G, G->v_size, G->a_size); if (setjmp(csa->jump)) { ret = 1; goto done; } csa->fname = fname; csa->fp = NULL; csa->count = 0; csa->c = '\n'; csa->field[0] = '\0'; csa->empty = csa->nonint = 0; xprintf("Reading maximum flow problem data from '%s'...\n", fname); csa->fp = glp_open(fname, "r"); if (csa->fp == NULL) { xprintf("Unable to open '%s' - %s\n", fname, get_err_msg()); longjmp(csa->jump, 1); } /* read problem line */ read_designator(csa); if (strcmp(csa->field, "p") != 0) error(csa, "problem line missing or invalid"); read_field(csa); if (strcmp(csa->field, "max") != 0) error(csa, "wrong problem designator; 'max' expected"); read_field(csa); if (!(str2int(csa->field, &nv) == 0 && nv >= 2)) error(csa, "number of nodes missing or invalid"); read_field(csa); if (!(str2int(csa->field, &na) == 0 && na >= 0)) error(csa, "number of arcs missing or invalid"); xprintf("Flow network has %d node%s and %d arc%s\n", nv, nv == 1 ? "" : "s", na, na == 1 ? "" : "s"); if (nv > 0) glp_add_vertices(G, nv); end_of_line(csa); /* read node descriptor lines */ s = t = 0; for (;;) { read_designator(csa); if (strcmp(csa->field, "n") != 0) break; read_field(csa); if (str2int(csa->field, &i) != 0) error(csa, "node number missing or invalid"); if (!(1 <= i && i <= nv)) error(csa, "node number %d out of range", i); read_field(csa); if (strcmp(csa->field, "s") == 0) { if (s > 0) error(csa, "only one source node allowed"); s = i; } else if (strcmp(csa->field, "t") == 0) { if (t > 0) error(csa, "only one sink node allowed"); t = i; } else error(csa, "wrong node designator; 's' or 't' expected"); if (s > 0 && s == t) error(csa, "source and sink nodes must be distinct"); end_of_line(csa); } if (s == 0) error(csa, "source node descriptor missing\n"); if (t == 0) error(csa, "sink node descriptor missing\n"); if (_s != NULL) *_s = s; if (_t != NULL) *_t = t; /* read arc descriptor lines */ for (k = 1; k <= na; k++) { if (k > 1) read_designator(csa); if (strcmp(csa->field, "a") != 0) error(csa, "wrong line designator; 'a' expected"); read_field(csa); if (str2int(csa->field, &i) != 0) error(csa, "starting node number missing or invalid"); if (!(1 <= i && i <= nv)) error(csa, "starting node number %d out of range", i); read_field(csa); if (str2int(csa->field, &j) != 0) error(csa, "ending node number missing or invalid"); if (!(1 <= j && j <= nv)) error(csa, "ending node number %d out of range", j); read_field(csa); if (!(str2num(csa->field, &cap) == 0 && cap >= 0.0)) error(csa, "arc capacity missing or invalid"); check_int(csa, cap); a = glp_add_arc(G, i, j); if (a_cap >= 0) memcpy((char *)a->data + a_cap, &cap, sizeof(double)); end_of_line(csa); } xprintf("%d lines were read\n", csa->count); done: if (ret) glp_erase_graph(G, G->v_size, G->a_size); if (csa->fp != NULL) glp_close(csa->fp); return ret; } /* eof */ glpk-5.0/src/api/rdmcf.c0000644000062000006210000001543013766346220014304 0ustar maomkpasswd/* rdmcf.c (read min-cost flow problem data in DIMACS format) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2009-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "dimacs.h" #include "glpk.h" #include "misc.h" #define error dmx_error #define warning dmx_warning #define read_char dmx_read_char #define read_designator dmx_read_designator #define read_field dmx_read_field #define end_of_line dmx_end_of_line #define check_int dmx_check_int /*********************************************************************** * NAME * * glp_read_mincost - read min-cost flow problem data in DIMACS format * * SYNOPSIS * * int glp_read_mincost(glp_graph *G, int v_rhs, int a_low, int a_cap, * int a_cost, const char *fname); * * DESCRIPTION * * The routine glp_read_mincost reads minimum cost flow problem data in * DIMACS format from a text file. * * RETURNS * * If the operation was successful, the routine returns zero. Otherwise * it prints an error message and returns non-zero. */ int glp_read_mincost(glp_graph *G, int v_rhs, int a_low, int a_cap, int a_cost, const char *fname) { DMX _csa, *csa = &_csa; glp_vertex *v; glp_arc *a; int i, j, k, nv, na, ret = 0; double rhs, low, cap, cost; char *flag = NULL; if (v_rhs >= 0 && v_rhs > G->v_size - (int)sizeof(double)) xerror("glp_read_mincost: v_rhs = %d; invalid offset\n", v_rhs); if (a_low >= 0 && a_low > G->a_size - (int)sizeof(double)) xerror("glp_read_mincost: a_low = %d; invalid offset\n", a_low); if (a_cap >= 0 && a_cap > G->a_size - (int)sizeof(double)) xerror("glp_read_mincost: a_cap = %d; invalid offset\n", a_cap); if (a_cost >= 0 && a_cost > G->a_size - (int)sizeof(double)) xerror("glp_read_mincost: a_cost = %d; invalid offset\n", a_cost); glp_erase_graph(G, G->v_size, G->a_size); if (setjmp(csa->jump)) { ret = 1; goto done; } csa->fname = fname; csa->fp = NULL; csa->count = 0; csa->c = '\n'; csa->field[0] = '\0'; csa->empty = csa->nonint = 0; xprintf("Reading min-cost flow problem data from '%s'...\n", fname); csa->fp = glp_open(fname, "r"); if (csa->fp == NULL) { xprintf("Unable to open '%s' - %s\n", fname, get_err_msg()); longjmp(csa->jump, 1); } /* read problem line */ read_designator(csa); if (strcmp(csa->field, "p") != 0) error(csa, "problem line missing or invalid"); read_field(csa); if (strcmp(csa->field, "min") != 0) error(csa, "wrong problem designator; 'min' expected"); read_field(csa); if (!(str2int(csa->field, &nv) == 0 && nv >= 0)) error(csa, "number of nodes missing or invalid"); read_field(csa); if (!(str2int(csa->field, &na) == 0 && na >= 0)) error(csa, "number of arcs missing or invalid"); xprintf("Flow network has %d node%s and %d arc%s\n", nv, nv == 1 ? "" : "s", na, na == 1 ? "" : "s"); if (nv > 0) glp_add_vertices(G, nv); end_of_line(csa); /* read node descriptor lines */ flag = xcalloc(1+nv, sizeof(char)); memset(&flag[1], 0, nv * sizeof(char)); if (v_rhs >= 0) { rhs = 0.0; for (i = 1; i <= nv; i++) { v = G->v[i]; memcpy((char *)v->data + v_rhs, &rhs, sizeof(double)); } } for (;;) { read_designator(csa); if (strcmp(csa->field, "n") != 0) break; read_field(csa); if (str2int(csa->field, &i) != 0) error(csa, "node number missing or invalid"); if (!(1 <= i && i <= nv)) error(csa, "node number %d out of range", i); if (flag[i]) error(csa, "duplicate descriptor of node %d", i); read_field(csa); if (str2num(csa->field, &rhs) != 0) error(csa, "node supply/demand missing or invalid"); check_int(csa, rhs); if (v_rhs >= 0) { v = G->v[i]; memcpy((char *)v->data + v_rhs, &rhs, sizeof(double)); } flag[i] = 1; end_of_line(csa); } xfree(flag), flag = NULL; /* read arc descriptor lines */ for (k = 1; k <= na; k++) { if (k > 1) read_designator(csa); if (strcmp(csa->field, "a") != 0) error(csa, "wrong line designator; 'a' expected"); read_field(csa); if (str2int(csa->field, &i) != 0) error(csa, "starting node number missing or invalid"); if (!(1 <= i && i <= nv)) error(csa, "starting node number %d out of range", i); read_field(csa); if (str2int(csa->field, &j) != 0) error(csa, "ending node number missing or invalid"); if (!(1 <= j && j <= nv)) error(csa, "ending node number %d out of range", j); read_field(csa); if (!(str2num(csa->field, &low) == 0 && low >= 0.0)) error(csa, "lower bound of arc flow missing or invalid"); check_int(csa, low); read_field(csa); if (!(str2num(csa->field, &cap) == 0 && cap >= low)) error(csa, "upper bound of arc flow missing or invalid"); check_int(csa, cap); read_field(csa); if (str2num(csa->field, &cost) != 0) error(csa, "per-unit cost of arc flow missing or invalid"); check_int(csa, cost); a = glp_add_arc(G, i, j); if (a_low >= 0) memcpy((char *)a->data + a_low, &low, sizeof(double)); if (a_cap >= 0) memcpy((char *)a->data + a_cap, &cap, sizeof(double)); if (a_cost >= 0) memcpy((char *)a->data + a_cost, &cost, sizeof(double)); end_of_line(csa); } xprintf("%d lines were read\n", csa->count); done: if (ret) glp_erase_graph(G, G->v_size, G->a_size); if (csa->fp != NULL) glp_close(csa->fp); if (flag != NULL) xfree(flag); return ret; } /* eof */ glpk-5.0/src/api/rdmip.c0000644000062000006210000001367313766346220014333 0ustar maomkpasswd/* rdmip.c (read MIP solution in GLPK format) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2010-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "dimacs.h" #include "env.h" #include "misc.h" #include "prob.h" /*********************************************************************** * NAME * * glp_read_mip - read MIP solution in GLPK format * * SYNOPSIS * * int glp_read_mip(glp_prob *P, const char *fname); * * DESCRIPTION * * The routine glp_read_mip reads MIP solution from a text file in GLPK * format. * * RETURNS * * If the operation was successful, the routine returns zero. Otherwise * it prints an error message and returns non-zero. */ int glp_read_mip(glp_prob *P, const char *fname) { DMX dmx_, *dmx = &dmx_; int i, j, k, m, n, sst, ret = 1; char *stat = NULL; double obj, *prim = NULL; #if 0 /* 04/IV-2016 */ if (P == NULL || P->magic != GLP_PROB_MAGIC) xerror("glp_read_mip: P = %p; invalid problem object\n", P); #endif if (fname == NULL) xerror("glp_read_mip: fname = %d; invalid parameter\n", fname); if (setjmp(dmx->jump)) goto done; dmx->fname = fname; dmx->fp = NULL; dmx->count = 0; dmx->c = '\n'; dmx->field[0] = '\0'; dmx->empty = dmx->nonint = 0; xprintf("Reading MIP solution from '%s'...\n", fname); dmx->fp = glp_open(fname, "r"); if (dmx->fp == NULL) { xprintf("Unable to open '%s' - %s\n", fname, get_err_msg()); goto done; } /* read solution line */ dmx_read_designator(dmx); if (strcmp(dmx->field, "s") != 0) dmx_error(dmx, "solution line missing or invalid"); dmx_read_field(dmx); if (strcmp(dmx->field, "mip") != 0) dmx_error(dmx, "wrong solution designator; 'mip' expected"); dmx_read_field(dmx); if (!(str2int(dmx->field, &m) == 0 && m >= 0)) dmx_error(dmx, "number of rows missing or invalid"); if (m != P->m) dmx_error(dmx, "number of rows mismatch"); dmx_read_field(dmx); if (!(str2int(dmx->field, &n) == 0 && n >= 0)) dmx_error(dmx, "number of columns missing or invalid"); if (n != P->n) dmx_error(dmx, "number of columns mismatch"); dmx_read_field(dmx); if (strcmp(dmx->field, "o") == 0) sst = GLP_OPT; else if (strcmp(dmx->field, "f") == 0) sst = GLP_FEAS; else if (strcmp(dmx->field, "n") == 0) sst = GLP_NOFEAS; else if (strcmp(dmx->field, "u") == 0) sst = GLP_UNDEF; else dmx_error(dmx, "solution status missing or invalid"); dmx_read_field(dmx); if (str2num(dmx->field, &obj) != 0) dmx_error(dmx, "objective value missing or invalid"); dmx_end_of_line(dmx); /* allocate working arrays */ stat = xalloc(1+m+n, sizeof(stat[0])); for (k = 1; k <= m+n; k++) stat[k] = '?'; prim = xalloc(1+m+n, sizeof(prim[0])); /* read solution descriptor lines */ for (;;) { dmx_read_designator(dmx); if (strcmp(dmx->field, "i") == 0) { /* row solution descriptor */ dmx_read_field(dmx); if (str2int(dmx->field, &i) != 0) dmx_error(dmx, "row number missing or invalid"); if (!(1 <= i && i <= m)) dmx_error(dmx, "row number out of range"); if (stat[i] != '?') dmx_error(dmx, "duplicate row solution descriptor"); stat[i] = GLP_BS; dmx_read_field(dmx); if (str2num(dmx->field, &prim[i]) != 0) dmx_error(dmx, "row value missing or invalid"); dmx_end_of_line(dmx); } else if (strcmp(dmx->field, "j") == 0) { /* column solution descriptor */ dmx_read_field(dmx); if (str2int(dmx->field, &j) != 0) dmx_error(dmx, "column number missing or invalid"); if (!(1 <= j && j <= n)) dmx_error(dmx, "column number out of range"); if (stat[m+j] != '?') dmx_error(dmx, "duplicate column solution descriptor"); stat[m+j] = GLP_BS; dmx_read_field(dmx); if (str2num(dmx->field, &prim[m+j]) != 0) dmx_error(dmx, "column value missing or invalid"); dmx_end_of_line(dmx); } else if (strcmp(dmx->field, "e") == 0) break; else dmx_error(dmx, "line designator missing or invalid"); dmx_end_of_line(dmx); } /* store solution components into problem object */ for (k = 1; k <= m+n; k++) { if (stat[k] == '?') dmx_error(dmx, "incomplete MIP solution"); } P->mip_stat = sst; P->mip_obj = obj; for (i = 1; i <= m; i++) P->row[i]->mipx = prim[i]; for (j = 1; j <= n; j++) P->col[j]->mipx = prim[m+j]; /* MIP solution has been successfully read */ xprintf("%d lines were read\n", dmx->count); ret = 0; done: if (dmx->fp != NULL) glp_close(dmx->fp); if (stat != NULL) xfree(stat); if (prim != NULL) xfree(prim); return ret; } /* eof */ glpk-5.0/src/api/rdprob.c0000644000062000006210000003266013766346220014505 0ustar maomkpasswd/* rdprob.c (read problem data in GLPK format) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2010-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "dimacs.h" #include "misc.h" #include "prob.h" #define xfprintf glp_format #define error dmx_error #define warning dmx_warning #define read_char dmx_read_char #define read_designator dmx_read_designator #define read_field dmx_read_field #define end_of_line dmx_end_of_line #define check_int dmx_check_int /*********************************************************************** * NAME * * glp_read_prob - read problem data in GLPK format * * SYNOPSIS * * int glp_read_prob(glp_prob *P, int flags, const char *fname); * * The routine glp_read_prob reads problem data in GLPK LP/MIP format * from a text file. * * RETURNS * * If the operation was successful, the routine returns zero. Otherwise * it prints an error message and returns non-zero. */ int glp_read_prob(glp_prob *P, int flags, const char *fname) { DMX _csa, *csa = &_csa; int mip, m, n, nnz, ne, i, j, k, type, kind, ret, *ln = NULL, *ia = NULL, *ja = NULL; double lb, ub, temp, *ar = NULL; char *rf = NULL, *cf = NULL; #if 0 /* 04/IV-2016 */ if (P == NULL || P->magic != GLP_PROB_MAGIC) xerror("glp_read_prob: P = %p; invalid problem object\n", P); #endif if (flags != 0) xerror("glp_read_prob: flags = %d; invalid parameter\n", flags); if (fname == NULL) xerror("glp_read_prob: fname = %d; invalid parameter\n", fname); glp_erase_prob(P); if (setjmp(csa->jump)) { ret = 1; goto done; } csa->fname = fname; csa->fp = NULL; csa->count = 0; csa->c = '\n'; csa->field[0] = '\0'; csa->empty = csa->nonint = 0; xprintf("Reading problem data from '%s'...\n", fname); csa->fp = glp_open(fname, "r"); if (csa->fp == NULL) { xprintf("Unable to open '%s' - %s\n", fname, get_err_msg()); longjmp(csa->jump, 1); } /* read problem line */ read_designator(csa); if (strcmp(csa->field, "p") != 0) error(csa, "problem line missing or invalid"); read_field(csa); if (strcmp(csa->field, "lp") == 0) mip = 0; else if (strcmp(csa->field, "mip") == 0) mip = 1; else error(csa, "wrong problem designator; 'lp' or 'mip' expected"); read_field(csa); if (strcmp(csa->field, "min") == 0) glp_set_obj_dir(P, GLP_MIN); else if (strcmp(csa->field, "max") == 0) glp_set_obj_dir(P, GLP_MAX); else error(csa, "objective sense missing or invalid"); read_field(csa); if (!(str2int(csa->field, &m) == 0 && m >= 0)) error(csa, "number of rows missing or invalid"); read_field(csa); if (!(str2int(csa->field, &n) == 0 && n >= 0)) error(csa, "number of columns missing or invalid"); read_field(csa); if (!(str2int(csa->field, &nnz) == 0 && nnz >= 0)) error(csa, "number of constraint coefficients missing or inval" "id"); if (m > 0) { glp_add_rows(P, m); for (i = 1; i <= m; i++) glp_set_row_bnds(P, i, GLP_FX, 0.0, 0.0); } if (n > 0) { glp_add_cols(P, n); for (j = 1; j <= n; j++) { if (!mip) glp_set_col_bnds(P, j, GLP_LO, 0.0, 0.0); else glp_set_col_kind(P, j, GLP_BV); } } end_of_line(csa); /* allocate working arrays */ rf = xcalloc(1+m, sizeof(char)); memset(rf, 0, 1+m); cf = xcalloc(1+n, sizeof(char)); memset(cf, 0, 1+n); ln = xcalloc(1+nnz, sizeof(int)); ia = xcalloc(1+nnz, sizeof(int)); ja = xcalloc(1+nnz, sizeof(int)); ar = xcalloc(1+nnz, sizeof(double)); /* read descriptor lines */ ne = 0; for (;;) { read_designator(csa); if (strcmp(csa->field, "i") == 0) { /* row descriptor */ read_field(csa); if (str2int(csa->field, &i) != 0) error(csa, "row number missing or invalid"); if (!(1 <= i && i <= m)) error(csa, "row number out of range"); read_field(csa); if (strcmp(csa->field, "f") == 0) type = GLP_FR; else if (strcmp(csa->field, "l") == 0) type = GLP_LO; else if (strcmp(csa->field, "u") == 0) type = GLP_UP; else if (strcmp(csa->field, "d") == 0) type = GLP_DB; else if (strcmp(csa->field, "s") == 0) type = GLP_FX; else error(csa, "row type missing or invalid"); if (type == GLP_LO || type == GLP_DB || type == GLP_FX) { read_field(csa); if (str2num(csa->field, &lb) != 0) error(csa, "row lower bound/fixed value missing or in" "valid"); } else lb = 0.0; if (type == GLP_UP || type == GLP_DB) { read_field(csa); if (str2num(csa->field, &ub) != 0) error(csa, "row upper bound missing or invalid"); } else ub = 0.0; if (rf[i] & 0x01) error(csa, "duplicate row descriptor"); glp_set_row_bnds(P, i, type, lb, ub), rf[i] |= 0x01; } else if (strcmp(csa->field, "j") == 0) { /* column descriptor */ read_field(csa); if (str2int(csa->field, &j) != 0) error(csa, "column number missing or invalid"); if (!(1 <= j && j <= n)) error(csa, "column number out of range"); if (!mip) kind = GLP_CV; else { read_field(csa); if (strcmp(csa->field, "c") == 0) kind = GLP_CV; else if (strcmp(csa->field, "i") == 0) kind = GLP_IV; else if (strcmp(csa->field, "b") == 0) { kind = GLP_IV; type = GLP_DB, lb = 0.0, ub = 1.0; goto skip; } else error(csa, "column kind missing or invalid"); } read_field(csa); if (strcmp(csa->field, "f") == 0) type = GLP_FR; else if (strcmp(csa->field, "l") == 0) type = GLP_LO; else if (strcmp(csa->field, "u") == 0) type = GLP_UP; else if (strcmp(csa->field, "d") == 0) type = GLP_DB; else if (strcmp(csa->field, "s") == 0) type = GLP_FX; else error(csa, "column type missing or invalid"); if (type == GLP_LO || type == GLP_DB || type == GLP_FX) { read_field(csa); if (str2num(csa->field, &lb) != 0) error(csa, "column lower bound/fixed value missing or" " invalid"); } else lb = 0.0; if (type == GLP_UP || type == GLP_DB) { read_field(csa); if (str2num(csa->field, &ub) != 0) error(csa, "column upper bound missing or invalid"); } else ub = 0.0; skip: if (cf[j] & 0x01) error(csa, "duplicate column descriptor"); glp_set_col_kind(P, j, kind); glp_set_col_bnds(P, j, type, lb, ub), cf[j] |= 0x01; } else if (strcmp(csa->field, "a") == 0) { /* coefficient descriptor */ read_field(csa); if (str2int(csa->field, &i) != 0) error(csa, "row number missing or invalid"); if (!(0 <= i && i <= m)) error(csa, "row number out of range"); read_field(csa); if (str2int(csa->field, &j) != 0) error(csa, "column number missing or invalid"); if (!((i == 0 ? 0 : 1) <= j && j <= n)) error(csa, "column number out of range"); read_field(csa); if (i == 0) { if (str2num(csa->field, &temp) != 0) error(csa, "objective %s missing or invalid", j == 0 ? "constant term" : "coefficient"); if (cf[j] & 0x10) error(csa, "duplicate objective %s", j == 0 ? "constant term" : "coefficient"); glp_set_obj_coef(P, j, temp), cf[j] |= 0x10; } else { if (str2num(csa->field, &temp) != 0) error(csa, "constraint coefficient missing or invalid" ); if (ne == nnz) error(csa, "too many constraint coefficient descripto" "rs"); ln[++ne] = csa->count; ia[ne] = i, ja[ne] = j, ar[ne] = temp; } } else if (strcmp(csa->field, "n") == 0) { /* symbolic name descriptor */ read_field(csa); if (strcmp(csa->field, "p") == 0) { /* problem name */ read_field(csa); if (P->name != NULL) error(csa, "duplicate problem name"); glp_set_prob_name(P, csa->field); } else if (strcmp(csa->field, "z") == 0) { /* objective name */ read_field(csa); if (P->obj != NULL) error(csa, "duplicate objective name"); glp_set_obj_name(P, csa->field); } else if (strcmp(csa->field, "i") == 0) { /* row name */ read_field(csa); if (str2int(csa->field, &i) != 0) error(csa, "row number missing or invalid"); if (!(1 <= i && i <= m)) error(csa, "row number out of range"); read_field(csa); if (P->row[i]->name != NULL) error(csa, "duplicate row name"); glp_set_row_name(P, i, csa->field); } else if (strcmp(csa->field, "j") == 0) { /* column name */ read_field(csa); if (str2int(csa->field, &j) != 0) error(csa, "column number missing or invalid"); if (!(1 <= j && j <= n)) error(csa, "column number out of range"); read_field(csa); if (P->col[j]->name != NULL) error(csa, "duplicate column name"); glp_set_col_name(P, j, csa->field); } else error(csa, "object designator missing or invalid"); } else if (strcmp(csa->field, "e") == 0) break; else error(csa, "line designator missing or invalid"); end_of_line(csa); } if (ne < nnz) error(csa, "too few constraint coefficient descriptors"); xassert(ne == nnz); k = glp_check_dup(m, n, ne, ia, ja); xassert(0 <= k && k <= nnz); if (k > 0) { csa->count = ln[k]; error(csa, "duplicate constraint coefficient"); } glp_load_matrix(P, ne, ia, ja, ar); /* print some statistics */ if (P->name != NULL) xprintf("Problem: %s\n", P->name); if (P->obj != NULL) xprintf("Objective: %s\n", P->obj); xprintf("%d row%s, %d column%s, %d non-zero%s\n", m, m == 1 ? "" : "s", n, n == 1 ? "" : "s", nnz, nnz == 1 ? "" : "s"); if (glp_get_num_int(P) > 0) { int ni = glp_get_num_int(P); int nb = glp_get_num_bin(P); if (ni == 1) { if (nb == 0) xprintf("One variable is integer\n"); else xprintf("One variable is binary\n"); } else { xprintf("%d integer variables, ", ni); if (nb == 0) xprintf("none"); else if (nb == 1) xprintf("one"); else if (nb == ni) xprintf("all"); else xprintf("%d", nb); xprintf(" of which %s binary\n", nb == 1 ? "is" : "are"); } } xprintf("%d lines were read\n", csa->count); /* problem data has been successfully read */ glp_sort_matrix(P); ret = 0; done: if (csa->fp != NULL) glp_close(csa->fp); if (rf != NULL) xfree(rf); if (cf != NULL) xfree(cf); if (ln != NULL) xfree(ln); if (ia != NULL) xfree(ia); if (ja != NULL) xfree(ja); if (ar != NULL) xfree(ar); if (ret) glp_erase_prob(P); return ret; } /* eof */ glpk-5.0/src/api/rdsol.c0000644000062000006210000001775013766346220014343 0ustar maomkpasswd/* rdsol.c (read basic solution in GLPK format) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2010-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "dimacs.h" #include "env.h" #include "misc.h" #include "prob.h" /*********************************************************************** * NAME * * glp_read_sol - read basic solution in GLPK format * * SYNOPSIS * * int glp_read_sol(glp_prob *P, const char *fname); * * DESCRIPTION * * The routine glp_read_sol reads basic solution from a text file in * GLPK format. * * RETURNS * * If the operation was successful, the routine returns zero. Otherwise * it prints an error message and returns non-zero. */ int glp_read_sol(glp_prob *P, const char *fname) { DMX dmx_, *dmx = &dmx_; int i, j, k, m, n, pst, dst, ret = 1; char *stat = NULL; double obj, *prim = NULL, *dual = NULL; #if 0 /* 04/IV-2016 */ if (P == NULL || P->magic != GLP_PROB_MAGIC) xerror("glp_read_sol: P = %p; invalid problem object\n", P); #endif if (fname == NULL) xerror("glp_read_sol: fname = %d; invalid parameter\n", fname); if (setjmp(dmx->jump)) goto done; dmx->fname = fname; dmx->fp = NULL; dmx->count = 0; dmx->c = '\n'; dmx->field[0] = '\0'; dmx->empty = dmx->nonint = 0; xprintf("Reading basic solution from '%s'...\n", fname); dmx->fp = glp_open(fname, "r"); if (dmx->fp == NULL) { xprintf("Unable to open '%s' - %s\n", fname, get_err_msg()); goto done; } /* read solution line */ dmx_read_designator(dmx); if (strcmp(dmx->field, "s") != 0) dmx_error(dmx, "solution line missing or invalid"); dmx_read_field(dmx); if (strcmp(dmx->field, "bas") != 0) dmx_error(dmx, "wrong solution designator; 'bas' expected"); dmx_read_field(dmx); if (!(str2int(dmx->field, &m) == 0 && m >= 0)) dmx_error(dmx, "number of rows missing or invalid"); if (m != P->m) dmx_error(dmx, "number of rows mismatch"); dmx_read_field(dmx); if (!(str2int(dmx->field, &n) == 0 && n >= 0)) dmx_error(dmx, "number of columns missing or invalid"); if (n != P->n) dmx_error(dmx, "number of columns mismatch"); dmx_read_field(dmx); if (strcmp(dmx->field, "u") == 0) pst = GLP_UNDEF; else if (strcmp(dmx->field, "f") == 0) pst = GLP_FEAS; else if (strcmp(dmx->field, "i") == 0) pst = GLP_INFEAS; else if (strcmp(dmx->field, "n") == 0) pst = GLP_NOFEAS; else dmx_error(dmx, "primal solution status missing or invalid"); dmx_read_field(dmx); if (strcmp(dmx->field, "u") == 0) dst = GLP_UNDEF; else if (strcmp(dmx->field, "f") == 0) dst = GLP_FEAS; else if (strcmp(dmx->field, "i") == 0) dst = GLP_INFEAS; else if (strcmp(dmx->field, "n") == 0) dst = GLP_NOFEAS; else dmx_error(dmx, "dual solution status missing or invalid"); dmx_read_field(dmx); if (str2num(dmx->field, &obj) != 0) dmx_error(dmx, "objective value missing or invalid"); dmx_end_of_line(dmx); /* allocate working arrays */ stat = xalloc(1+m+n, sizeof(stat[0])); for (k = 1; k <= m+n; k++) stat[k] = '?'; prim = xalloc(1+m+n, sizeof(prim[0])); dual = xalloc(1+m+n, sizeof(dual[0])); /* read solution descriptor lines */ for (;;) { dmx_read_designator(dmx); if (strcmp(dmx->field, "i") == 0) { /* row solution descriptor */ dmx_read_field(dmx); if (str2int(dmx->field, &i) != 0) dmx_error(dmx, "row number missing or invalid"); if (!(1 <= i && i <= m)) dmx_error(dmx, "row number out of range"); if (stat[i] != '?') dmx_error(dmx, "duplicate row solution descriptor"); dmx_read_field(dmx); if (strcmp(dmx->field, "b") == 0) stat[i] = GLP_BS; else if (strcmp(dmx->field, "l") == 0) stat[i] = GLP_NL; else if (strcmp(dmx->field, "u") == 0) stat[i] = GLP_NU; else if (strcmp(dmx->field, "f") == 0) stat[i] = GLP_NF; else if (strcmp(dmx->field, "s") == 0) stat[i] = GLP_NS; else dmx_error(dmx, "row status missing or invalid"); dmx_read_field(dmx); if (str2num(dmx->field, &prim[i]) != 0) dmx_error(dmx, "row primal value missing or invalid"); dmx_read_field(dmx); if (str2num(dmx->field, &dual[i]) != 0) dmx_error(dmx, "row dual value missing or invalid"); dmx_end_of_line(dmx); } else if (strcmp(dmx->field, "j") == 0) { /* column solution descriptor */ dmx_read_field(dmx); if (str2int(dmx->field, &j) != 0) dmx_error(dmx, "column number missing or invalid"); if (!(1 <= j && j <= n)) dmx_error(dmx, "column number out of range"); if (stat[m+j] != '?') dmx_error(dmx, "duplicate column solution descriptor"); dmx_read_field(dmx); if (strcmp(dmx->field, "b") == 0) stat[m+j] = GLP_BS; else if (strcmp(dmx->field, "l") == 0) stat[m+j] = GLP_NL; else if (strcmp(dmx->field, "u") == 0) stat[m+j] = GLP_NU; else if (strcmp(dmx->field, "f") == 0) stat[m+j] = GLP_NF; else if (strcmp(dmx->field, "s") == 0) stat[m+j] = GLP_NS; else dmx_error(dmx, "column status missing or invalid"); dmx_read_field(dmx); if (str2num(dmx->field, &prim[m+j]) != 0) dmx_error(dmx, "column primal value missing or invalid"); dmx_read_field(dmx); if (str2num(dmx->field, &dual[m+j]) != 0) dmx_error(dmx, "column dual value missing or invalid"); dmx_end_of_line(dmx); } else if (strcmp(dmx->field, "e") == 0) break; else dmx_error(dmx, "line designator missing or invalid"); dmx_end_of_line(dmx); } /* store solution components into problem object */ for (k = 1; k <= m+n; k++) { if (stat[k] == '?') dmx_error(dmx, "incomplete basic solution"); } P->pbs_stat = pst; P->dbs_stat = dst; P->obj_val = obj; P->it_cnt = 0; P->some = 0; for (i = 1; i <= m; i++) { glp_set_row_stat(P, i, stat[i]); P->row[i]->prim = prim[i]; P->row[i]->dual = dual[i]; } for (j = 1; j <= n; j++) { glp_set_col_stat(P, j, stat[m+j]); P->col[j]->prim = prim[m+j]; P->col[j]->dual = dual[m+j]; } /* basic solution has been successfully read */ xprintf("%d lines were read\n", dmx->count); ret = 0; done: if (dmx->fp != NULL) glp_close(dmx->fp); if (stat != NULL) xfree(stat); if (prim != NULL) xfree(prim); if (dual != NULL) xfree(dual); return ret; } /* eof */ glpk-5.0/src/api/rmfgen.c0000644000062000006210000000073713766346220014473 0ustar maomkpasswd/* rmfgen.c */ #include "env.h" #include "glpk.h" int glp_rmfgen(glp_graph *G_, int *s_, int *t_, int a_cap_, const int parm[1+5]) { static const char func[] = "glp_rmfgen"; xassert(G_ == G_); xassert(s_ == s_); xassert(t_ == t_); xassert(a_cap_ == a_cap_); xassert(parm == parm); xerror("%s: sorry, this routine is temporarily disabled due to li" "censing problems\n", func); abort(); return -1; } /* eof */ glpk-5.0/src/api/strong.c0000644000062000006210000000672213766346220014531 0ustar maomkpasswd/* strong.c (find all strongly connected components of graph) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2009-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "glpk.h" #include "mc13d.h" /*********************************************************************** * NAME * * glp_strong_comp - find all strongly connected components of graph * * SYNOPSIS * * int glp_strong_comp(glp_graph *G, int v_num); * * DESCRIPTION * * The routine glp_strong_comp finds all strongly connected components * of the specified graph. * * The parameter v_num specifies an offset of the field of type int * in the vertex data block, to which the routine stores the number of * a strongly connected component containing that vertex. If v_num < 0, * no component numbers are stored. * * The components are numbered in arbitrary order from 1 to nc, where * nc is the total number of components found, 0 <= nc <= |V|. However, * the component numbering has the property that for every arc (i->j) * in the graph the condition num(i) >= num(j) holds. * * RETURNS * * The routine returns nc, the total number of components found. */ int glp_strong_comp(glp_graph *G, int v_num) { glp_vertex *v; glp_arc *a; int i, k, last, n, na, nc, *icn, *ip, *lenr, *ior, *ib, *lowl, *numb, *prev; if (v_num >= 0 && v_num > G->v_size - (int)sizeof(int)) xerror("glp_strong_comp: v_num = %d; invalid offset\n", v_num); n = G->nv; if (n == 0) { nc = 0; goto done; } na = G->na; icn = xcalloc(1+na, sizeof(int)); ip = xcalloc(1+n, sizeof(int)); lenr = xcalloc(1+n, sizeof(int)); ior = xcalloc(1+n, sizeof(int)); ib = xcalloc(1+n, sizeof(int)); lowl = xcalloc(1+n, sizeof(int)); numb = xcalloc(1+n, sizeof(int)); prev = xcalloc(1+n, sizeof(int)); k = 1; for (i = 1; i <= n; i++) { v = G->v[i]; ip[i] = k; for (a = v->out; a != NULL; a = a->t_next) icn[k++] = a->head->i; lenr[i] = k - ip[i]; } xassert(na == k-1); nc = mc13d(n, icn, ip, lenr, ior, ib, lowl, numb, prev); if (v_num >= 0) { xassert(ib[1] == 1); for (k = 1; k <= nc; k++) { last = (k < nc ? ib[k+1] : n+1); xassert(ib[k] < last); for (i = ib[k]; i < last; i++) { v = G->v[ior[i]]; memcpy((char *)v->data + v_num, &k, sizeof(int)); } } } xfree(icn); xfree(ip); xfree(lenr); xfree(ior); xfree(ib); xfree(lowl); xfree(numb); xfree(prev); done: return nc; } /* eof */ glpk-5.0/src/api/topsort.c0000644000062000006210000001024313766346220014720 0ustar maomkpasswd/* topsort.c (topological sorting of acyclic digraph) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2010-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "glpk.h" /*********************************************************************** * NAME * * glp_top_sort - topological sorting of acyclic digraph * * SYNOPSIS * * int glp_top_sort(glp_graph *G, int v_num); * * DESCRIPTION * * The routine glp_top_sort performs topological sorting of vertices of * the specified acyclic digraph. * * The parameter v_num specifies an offset of the field of type int in * the vertex data block, to which the routine stores the vertex number * assigned. If v_num < 0, vertex numbers are not stored. * * The vertices are numbered from 1 to n, where n is the total number * of vertices in the graph. The vertex numbering has the property that * for every arc (i->j) in the graph the condition num(i) < num(j) * holds. Special case num(i) = 0 means that vertex i is not assigned a * number, because the graph is *not* acyclic. * * RETURNS * * If the graph is acyclic and therefore all the vertices have been * assigned numbers, the routine glp_top_sort returns zero. Otherwise, * if the graph is not acyclic, the routine returns the number of * vertices which have not been numbered, i.e. for which num(i) = 0. */ static int top_sort(glp_graph *G, int num[]) { glp_arc *a; int i, j, cnt, top, *stack, *indeg; /* allocate working arrays */ indeg = xcalloc(1+G->nv, sizeof(int)); stack = xcalloc(1+G->nv, sizeof(int)); /* determine initial indegree of each vertex; push into the stack the vertices having zero indegree */ top = 0; for (i = 1; i <= G->nv; i++) { num[i] = indeg[i] = 0; for (a = G->v[i]->in; a != NULL; a = a->h_next) indeg[i]++; if (indeg[i] == 0) stack[++top] = i; } /* assign numbers to vertices in the sorted order */ cnt = 0; while (top > 0) { /* pull vertex i from the stack */ i = stack[top--]; /* it has zero indegree in the current graph */ xassert(indeg[i] == 0); /* so assign it a next number */ xassert(num[i] == 0); num[i] = ++cnt; /* remove vertex i from the current graph, update indegree of its adjacent vertices, and push into the stack new vertices whose indegree becomes zero */ for (a = G->v[i]->out; a != NULL; a = a->t_next) { j = a->head->i; /* there exists arc (i->j) in the graph */ xassert(indeg[j] > 0); indeg[j]--; if (indeg[j] == 0) stack[++top] = j; } } /* free working arrays */ xfree(indeg); xfree(stack); return G->nv - cnt; } int glp_top_sort(glp_graph *G, int v_num) { glp_vertex *v; int i, cnt, *num; if (v_num >= 0 && v_num > G->v_size - (int)sizeof(int)) xerror("glp_top_sort: v_num = %d; invalid offset\n", v_num); if (G->nv == 0) { cnt = 0; goto done; } num = xcalloc(1+G->nv, sizeof(int)); cnt = top_sort(G, num); if (v_num >= 0) { for (i = 1; i <= G->nv; i++) { v = G->v[i]; memcpy((char *)v->data + v_num, &num[i], sizeof(int)); } } xfree(num); done: return cnt; } /* eof */ glpk-5.0/src/api/wcliqex.c0000644000062000006210000001006713766346220014666 0ustar maomkpasswd/* wcliqex.c (find maximum weight clique with exact algorithm) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2009-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "glpk.h" #include "wclique.h" static void set_edge(int nv, unsigned char a[], int i, int j) { int k; xassert(1 <= j && j < i && i <= nv); k = ((i - 1) * (i - 2)) / 2 + (j - 1); a[k / CHAR_BIT] |= (unsigned char)(1 << ((CHAR_BIT - 1) - k % CHAR_BIT)); return; } int glp_wclique_exact(glp_graph *G, int v_wgt, double *sol, int v_set) { /* find maximum weight clique with exact algorithm */ glp_arc *e; int i, j, k, len, x, *w, *ind, ret = 0; unsigned char *a; double s, t; if (v_wgt >= 0 && v_wgt > G->v_size - (int)sizeof(double)) xerror("glp_wclique_exact: v_wgt = %d; invalid parameter\n", v_wgt); if (v_set >= 0 && v_set > G->v_size - (int)sizeof(int)) xerror("glp_wclique_exact: v_set = %d; invalid parameter\n", v_set); if (G->nv == 0) { /* empty graph has only empty clique */ if (sol != NULL) *sol = 0.0; return 0; } /* allocate working arrays */ w = xcalloc(1+G->nv, sizeof(int)); ind = xcalloc(1+G->nv, sizeof(int)); len = G->nv; /* # vertices */ len = len * (len - 1) / 2; /* # entries in lower triangle */ len = (len + (CHAR_BIT - 1)) / CHAR_BIT; /* # bytes needed */ a = xcalloc(len, sizeof(char)); memset(a, 0, len * sizeof(char)); /* determine vertex weights */ s = 0.0; for (i = 1; i <= G->nv; i++) { if (v_wgt >= 0) { memcpy(&t, (char *)G->v[i]->data + v_wgt, sizeof(double)); if (!(0.0 <= t && t <= (double)INT_MAX && t == floor(t))) { ret = GLP_EDATA; goto done; } w[i] = (int)t; } else w[i] = 1; s += (double)w[i]; } if (s > (double)INT_MAX) { ret = GLP_EDATA; goto done; } /* build the adjacency matrix */ for (i = 1; i <= G->nv; i++) { for (e = G->v[i]->in; e != NULL; e = e->h_next) { j = e->tail->i; /* there exists edge (j,i) in the graph */ if (i > j) set_edge(G->nv, a, i, j); } for (e = G->v[i]->out; e != NULL; e = e->t_next) { j = e->head->i; /* there exists edge (i,j) in the graph */ if (i > j) set_edge(G->nv, a, i, j); } } /* find maximum weight clique in the graph */ len = wclique(G->nv, w, a, ind); /* compute the clique weight */ s = 0.0; for (k = 1; k <= len; k++) { i = ind[k]; xassert(1 <= i && i <= G->nv); s += (double)w[i]; } if (sol != NULL) *sol = s; /* mark vertices included in the clique */ if (v_set >= 0) { x = 0; for (i = 1; i <= G->nv; i++) memcpy((char *)G->v[i]->data + v_set, &x, sizeof(int)); x = 1; for (k = 1; k <= len; k++) { i = ind[k]; memcpy((char *)G->v[i]->data + v_set, &x, sizeof(int)); } } done: /* free working arrays */ xfree(w); xfree(ind); xfree(a); return ret; } /* eof */ glpk-5.0/src/api/weak.c0000644000062000006210000001231013766346220014132 0ustar maomkpasswd/* weak.c (find all weakly connected components of graph) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2009-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "glpk.h" /*********************************************************************** * NAME * * glp_weak_comp - find all weakly connected components of graph * * SYNOPSIS * * int glp_weak_comp(glp_graph *G, int v_num); * * DESCRIPTION * * The routine glp_weak_comp finds all weakly connected components of * the specified graph. * * The parameter v_num specifies an offset of the field of type int * in the vertex data block, to which the routine stores the number of * a (weakly) connected component containing that vertex. If v_num < 0, * no component numbers are stored. * * The components are numbered in arbitrary order from 1 to nc, where * nc is the total number of components found, 0 <= nc <= |V|. * * RETURNS * * The routine returns nc, the total number of components found. */ int glp_weak_comp(glp_graph *G, int v_num) { glp_vertex *v; glp_arc *a; int f, i, j, nc, nv, pos1, pos2, *prev, *next, *list; if (v_num >= 0 && v_num > G->v_size - (int)sizeof(int)) xerror("glp_weak_comp: v_num = %d; invalid offset\n", v_num); nv = G->nv; if (nv == 0) { nc = 0; goto done; } /* allocate working arrays */ prev = xcalloc(1+nv, sizeof(int)); next = xcalloc(1+nv, sizeof(int)); list = xcalloc(1+nv, sizeof(int)); /* if vertex i is unlabelled, prev[i] is the index of previous unlabelled vertex, and next[i] is the index of next unlabelled vertex; if vertex i is labelled, then prev[i] < 0, and next[i] is the connected component number */ /* initially all vertices are unlabelled */ f = 1; for (i = 1; i <= nv; i++) prev[i] = i - 1, next[i] = i + 1; next[nv] = 0; /* main loop (until all vertices have been labelled) */ nc = 0; while (f != 0) { /* take an unlabelled vertex */ i = f; /* and remove it from the list of unlabelled vertices */ f = next[i]; if (f != 0) prev[f] = 0; /* label the vertex; it begins a new component */ prev[i] = -1, next[i] = ++nc; /* breadth first search */ list[1] = i, pos1 = pos2 = 1; while (pos1 <= pos2) { /* dequeue vertex i */ i = list[pos1++]; /* consider all arcs incoming to vertex i */ for (a = G->v[i]->in; a != NULL; a = a->h_next) { /* vertex j is adjacent to vertex i */ j = a->tail->i; if (prev[j] >= 0) { /* vertex j is unlabelled */ /* remove it from the list of unlabelled vertices */ if (prev[j] == 0) f = next[j]; else next[prev[j]] = next[j]; if (next[j] == 0) ; else prev[next[j]] = prev[j]; /* label the vertex */ prev[j] = -1, next[j] = nc; /* and enqueue it for further consideration */ list[++pos2] = j; } } /* consider all arcs outgoing from vertex i */ for (a = G->v[i]->out; a != NULL; a = a->t_next) { /* vertex j is adjacent to vertex i */ j = a->head->i; if (prev[j] >= 0) { /* vertex j is unlabelled */ /* remove it from the list of unlabelled vertices */ if (prev[j] == 0) f = next[j]; else next[prev[j]] = next[j]; if (next[j] == 0) ; else prev[next[j]] = prev[j]; /* label the vertex */ prev[j] = -1, next[j] = nc; /* and enqueue it for further consideration */ list[++pos2] = j; } } } } /* store component numbers */ if (v_num >= 0) { for (i = 1; i <= nv; i++) { v = G->v[i]; memcpy((char *)v->data + v_num, &next[i], sizeof(int)); } } /* free working arrays */ xfree(prev); xfree(next); xfree(list); done: return nc; } /* eof */ glpk-5.0/src/api/wrasn.c0000644000062000006210000000663713766346220014354 0ustar maomkpasswd/* wrasn.c (write assignment problem data in DIMACS format) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2009-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "glpk.h" #define xfprintf glp_format /*********************************************************************** * NAME * * glp_write_asnprob - write assignment problem data in DIMACS format * * SYNOPSIS * * int glp_write_asnprob(glp_graph *G, int v_set, int a_cost, * const char *fname); * * DESCRIPTION * * The routine glp_write_asnprob writes assignment problem data in * DIMACS format to a text file. * * RETURNS * * If the operation was successful, the routine returns zero. Otherwise * it prints an error message and returns non-zero. */ int glp_write_asnprob(glp_graph *G, int v_set, int a_cost, const char *fname) { glp_file *fp; glp_vertex *v; glp_arc *a; int i, k, count = 0, ret; double cost; if (v_set >= 0 && v_set > G->v_size - (int)sizeof(int)) xerror("glp_write_asnprob: v_set = %d; invalid offset\n", v_set); if (a_cost >= 0 && a_cost > G->a_size - (int)sizeof(double)) xerror("glp_write_asnprob: a_cost = %d; invalid offset\n", a_cost); xprintf("Writing assignment problem data to '%s'...\n", fname); fp = glp_open(fname, "w"); if (fp == NULL) { xprintf("Unable to create '%s' - %s\n", fname, get_err_msg()); ret = 1; goto done; } xfprintf(fp, "c %s\n", G->name == NULL ? "unknown" : G->name), count++; xfprintf(fp, "p asn %d %d\n", G->nv, G->na), count++; for (i = 1; i <= G->nv; i++) { v = G->v[i]; if (v_set >= 0) memcpy(&k, (char *)v->data + v_set, sizeof(int)); else k = (v->out != NULL ? 0 : 1); if (k == 0) xfprintf(fp, "n %d\n", i), count++; } for (i = 1; i <= G->nv; i++) { v = G->v[i]; for (a = v->out; a != NULL; a = a->t_next) { if (a_cost >= 0) memcpy(&cost, (char *)a->data + a_cost, sizeof(double)); else cost = 1.0; xfprintf(fp, "a %d %d %.*g\n", a->tail->i, a->head->i, DBL_DIG, cost), count++; } } xfprintf(fp, "c eof\n"), count++; #if 0 /* FIXME */ xfflush(fp); #endif if (glp_ioerr(fp)) { xprintf("Write error on '%s' - %s\n", fname, get_err_msg()); ret = 1; goto done; } xprintf("%d lines were written\n", count); ret = 0; done: if (fp != NULL) glp_close(fp); return ret; } /* eof */ glpk-5.0/src/api/wrcc.c0000644000062000006210000000626513766346220014155 0ustar maomkpasswd/* wrcc.c (write graph in DIMACS clique/coloring format) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2009-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "glpk.h" #define xfprintf glp_format /*********************************************************************** * NAME * * glp_write_ccdata - write graph in DIMACS clique/coloring format * * SYNOPSIS * * int glp_write_ccdata(glp_graph *G, int v_wgt, const char *fname); * * DESCRIPTION * * The routine glp_write_ccdata writes the specified graph in DIMACS * clique/coloring format to a text file. * * RETURNS * * If the operation was successful, the routine returns zero. Otherwise * it prints an error message and returns non-zero. */ int glp_write_ccdata(glp_graph *G, int v_wgt, const char *fname) { glp_file *fp; glp_vertex *v; glp_arc *e; int i, count = 0, ret; double w; if (v_wgt >= 0 && v_wgt > G->v_size - (int)sizeof(double)) xerror("glp_write_ccdata: v_wgt = %d; invalid offset\n", v_wgt); xprintf("Writing graph to '%s'\n", fname); fp = glp_open(fname, "w"); if (fp == NULL) { xprintf("Unable to create '%s' - %s\n", fname, get_err_msg()); ret = 1; goto done; } xfprintf(fp, "c %s\n", G->name == NULL ? "unknown" : G->name), count++; xfprintf(fp, "p edge %d %d\n", G->nv, G->na), count++; if (v_wgt >= 0) { for (i = 1; i <= G->nv; i++) { v = G->v[i]; memcpy(&w, (char *)v->data + v_wgt, sizeof(double)); if (w != 1.0) xfprintf(fp, "n %d %.*g\n", i, DBL_DIG, w), count++; } } for (i = 1; i <= G->nv; i++) { v = G->v[i]; for (e = v->out; e != NULL; e = e->t_next) xfprintf(fp, "e %d %d\n", e->tail->i, e->head->i), count++; } xfprintf(fp, "c eof\n"), count++; #if 0 /* FIXME */ xfflush(fp); #endif if (glp_ioerr(fp)) { xprintf("Write error on '%s' - %s\n", fname, get_err_msg()); ret = 1; goto done; } xprintf("%d lines were written\n", count); ret = 0; done: if (fp != NULL) glp_close(fp); return ret; } /**********************************************************************/ int glp_write_graph(glp_graph *G, const char *fname) { return glp_write_ccdata(G, -1, fname); } /* eof */ glpk-5.0/src/api/wrcnf.c0000644000062000006210000000565413766346220014337 0ustar maomkpasswd/* wrcnf.c (write CNF-SAT problem data in DIMACS format) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2010-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "prob.h" #define xfprintf glp_format int glp_write_cnfsat(glp_prob *P, const char *fname) { /* write CNF-SAT problem data in DIMACS format */ glp_file *fp = NULL; GLPAIJ *aij; int i, j, len, count = 0, ret; char s[50]; #if 0 /* 04/IV-2016 */ if (P == NULL || P->magic != GLP_PROB_MAGIC) xerror("glp_write_cnfsat: P = %p; invalid problem object\n", P); #endif if (glp_check_cnfsat(P) != 0) { xprintf("glp_write_cnfsat: problem object does not encode CNF-" "SAT instance\n"); ret = 1; goto done; } xprintf("Writing CNF-SAT problem data to '%s'...\n", fname); fp = glp_open(fname, "w"); if (fp == NULL) { xprintf("Unable to create '%s' - %s\n", fname, get_err_msg()); ret = 1; goto done; } xfprintf(fp, "c %s\n", P->name == NULL ? "unknown" : P->name), count++; xfprintf(fp, "p cnf %d %d\n", P->n, P->m), count++; for (i = 1; i <= P->m; i++) { len = 0; for (aij = P->row[i]->ptr; aij != NULL; aij = aij->r_next) { j = aij->col->j; if (aij->val < 0.0) j = -j; sprintf(s, "%d", j); if (len > 0 && len + 1 + strlen(s) > 72) xfprintf(fp, "\n"), count++, len = 0; xfprintf(fp, "%s%s", len == 0 ? "" : " ", s); if (len > 0) len++; len += strlen(s); } if (len > 0 && len + 1 + 1 > 72) xfprintf(fp, "\n"), count++, len = 0; xfprintf(fp, "%s0\n", len == 0 ? "" : " "), count++; } xfprintf(fp, "c eof\n"), count++; #if 0 /* FIXME */ xfflush(fp); #endif if (glp_ioerr(fp)) { xprintf("Write error on '%s' - %s\n", fname, get_err_msg()); ret = 1; goto done; } xprintf("%d lines were written\n", count); ret = 0; done: if (fp != NULL) glp_close(fp); return ret; } /* eof */ glpk-5.0/src/api/wript.c0000644000062000006210000001073513766346220014361 0ustar maomkpasswd/* wript.c (write interior-point solution in GLPK format) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2010-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "prob.h" /*********************************************************************** * NAME * * glp_write_ipt - write interior-point solution in GLPK format * * SYNOPSIS * * int glp_write_ipt(glp_prob *P, const char *fname); * * DESCRIPTION * * The routine glp_write_ipt writes interior-point solution to a text * file in GLPK format. * * RETURNS * * If the operation was successful, the routine returns zero. Otherwise * it prints an error message and returns non-zero. */ int glp_write_ipt(glp_prob *P, const char *fname) { glp_file *fp; GLPROW *row; GLPCOL *col; int i, j, count, ret = 1; char *s; #if 0 /* 04/IV-2016 */ if (P == NULL || P->magic != GLP_PROB_MAGIC) xerror("glp_write_ipt: P = %p; invalid problem object\n", P); #endif if (fname == NULL) xerror("glp_write_ipt: fname = %d; invalid parameter\n", fname) ; xprintf("Writing interior-point solution to '%s'...\n", fname); fp = glp_open(fname, "w"), count = 0; if (fp == NULL) { xprintf("Unable to create '%s' - %s\n", fname, get_err_msg()); goto done; } /* write comment lines */ glp_format(fp, "c %-12s%s\n", "Problem:", P->name == NULL ? "" : P->name), count++; glp_format(fp, "c %-12s%d\n", "Rows:", P->m), count++; glp_format(fp, "c %-12s%d\n", "Columns:", P->n), count++; glp_format(fp, "c %-12s%d\n", "Non-zeros:", P->nnz), count++; switch (P->ipt_stat) { case GLP_OPT: s = "OPTIMAL"; break; case GLP_INFEAS: s = "INFEASIBLE (INTERMEDIATE)"; break; case GLP_NOFEAS: s = "INFEASIBLE (FINAL)"; break; case GLP_UNDEF: s = "UNDEFINED"; break; default: s = "???"; break; } glp_format(fp, "c %-12s%s\n", "Status:", s), count++; switch (P->dir) { case GLP_MIN: s = "MINimum"; break; case GLP_MAX: s = "MAXimum"; break; default: s = "???"; break; } glp_format(fp, "c %-12s%s%s%.10g (%s)\n", "Objective:", P->obj == NULL ? "" : P->obj, P->obj == NULL ? "" : " = ", P->ipt_obj, s), count++; glp_format(fp, "c\n"), count++; /* write solution line */ glp_format(fp, "s ipt %d %d ", P->m, P->n), count++; switch (P->ipt_stat) { case GLP_OPT: glp_format(fp, "o"); break; case GLP_INFEAS: glp_format(fp, "i"); break; case GLP_NOFEAS: glp_format(fp, "n"); break; case GLP_UNDEF: glp_format(fp, "u"); break; default: glp_format(fp, "?"); break; } glp_format(fp, " %.*g\n", DBL_DIG, P->ipt_obj); /* write row solution descriptor lines */ for (i = 1; i <= P->m; i++) { row = P->row[i]; glp_format(fp, "i %d %.*g %.*g\n", i, DBL_DIG, row->pval, DBL_DIG, row->dval), count++; } /* write column solution descriptor lines */ for (j = 1; j <= P->n; j++) { col = P->col[j]; glp_format(fp, "j %d %.*g %.*g\n", j, DBL_DIG, col->pval, DBL_DIG, col->dval), count++; } /* write end line */ glp_format(fp, "e o f\n"), count++; if (glp_ioerr(fp)) { xprintf("Write error on '%s' - %s\n", fname, get_err_msg()); goto done; } /* interior-point solution has been successfully written */ xprintf("%d lines were written\n", count); ret = 0; done: if (fp != NULL) glp_close(fp); return ret; } /* eof */ glpk-5.0/src/api/wrmaxf.c0000644000062000006210000000654013766346220014517 0ustar maomkpasswd/* wrmaxf.c (write maximum flow problem data in DIMACS format) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2009-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "glpk.h" #define xfprintf glp_format /*********************************************************************** * NAME * * glp_write_maxflow - write maximum flow problem data in DIMACS format * * SYNOPSIS * * int glp_write_maxflow(glp_graph *G, int s, int t, int a_cap, * const char *fname); * * DESCRIPTION * * The routine glp_write_maxflow writes maximum flow problem data in * DIMACS format to a text file. * * RETURNS * * If the operation was successful, the routine returns zero. Otherwise * it prints an error message and returns non-zero. */ int glp_write_maxflow(glp_graph *G, int s, int t, int a_cap, const char *fname) { glp_file *fp; glp_vertex *v; glp_arc *a; int i, count = 0, ret; double cap; if (!(1 <= s && s <= G->nv)) xerror("glp_write_maxflow: s = %d; source node number out of r" "ange\n", s); if (!(1 <= t && t <= G->nv)) xerror("glp_write_maxflow: t = %d: sink node number out of ran" "ge\n", t); if (a_cap >= 0 && a_cap > G->a_size - (int)sizeof(double)) xerror("glp_write_mincost: a_cap = %d; invalid offset\n", a_cap); xprintf("Writing maximum flow problem data to '%s'...\n", fname); fp = glp_open(fname, "w"); if (fp == NULL) { xprintf("Unable to create '%s' - %s\n", fname, get_err_msg()); ret = 1; goto done; } xfprintf(fp, "c %s\n", G->name == NULL ? "unknown" : G->name), count++; xfprintf(fp, "p max %d %d\n", G->nv, G->na), count++; xfprintf(fp, "n %d s\n", s), count++; xfprintf(fp, "n %d t\n", t), count++; for (i = 1; i <= G->nv; i++) { v = G->v[i]; for (a = v->out; a != NULL; a = a->t_next) { if (a_cap >= 0) memcpy(&cap, (char *)a->data + a_cap, sizeof(double)); else cap = 1.0; xfprintf(fp, "a %d %d %.*g\n", a->tail->i, a->head->i, DBL_DIG, cap), count++; } } xfprintf(fp, "c eof\n"), count++; #if 0 /* FIXME */ xfflush(fp); #endif if (glp_ioerr(fp)) { xprintf("Write error on '%s' - %s\n", fname, get_err_msg()); ret = 1; goto done; } xprintf("%d lines were written\n", count); ret = 0; done: if (fp != NULL) glp_close(fp); return ret; } /* eof */ glpk-5.0/src/api/wrmcf.c0000644000062000006210000001015113766346220014322 0ustar maomkpasswd/* wrmcf.c (write min-cost flow problem data in DIMACS format) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2009-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "glpk.h" #define xfprintf glp_format /*********************************************************************** * NAME * * glp_write_mincost - write min-cost flow probl. data in DIMACS format * * SYNOPSIS * * int glp_write_mincost(glp_graph *G, int v_rhs, int a_low, int a_cap, * int a_cost, const char *fname); * * DESCRIPTION * * The routine glp_write_mincost writes minimum cost flow problem data * in DIMACS format to a text file. * * RETURNS * * If the operation was successful, the routine returns zero. Otherwise * it prints an error message and returns non-zero. */ int glp_write_mincost(glp_graph *G, int v_rhs, int a_low, int a_cap, int a_cost, const char *fname) { glp_file *fp; glp_vertex *v; glp_arc *a; int i, count = 0, ret; double rhs, low, cap, cost; if (v_rhs >= 0 && v_rhs > G->v_size - (int)sizeof(double)) xerror("glp_write_mincost: v_rhs = %d; invalid offset\n", v_rhs); if (a_low >= 0 && a_low > G->a_size - (int)sizeof(double)) xerror("glp_write_mincost: a_low = %d; invalid offset\n", a_low); if (a_cap >= 0 && a_cap > G->a_size - (int)sizeof(double)) xerror("glp_write_mincost: a_cap = %d; invalid offset\n", a_cap); if (a_cost >= 0 && a_cost > G->a_size - (int)sizeof(double)) xerror("glp_write_mincost: a_cost = %d; invalid offset\n", a_cost); xprintf("Writing min-cost flow problem data to '%s'...\n", fname); fp = glp_open(fname, "w"); if (fp == NULL) { xprintf("Unable to create '%s' - %s\n", fname, get_err_msg()); ret = 1; goto done; } xfprintf(fp, "c %s\n", G->name == NULL ? "unknown" : G->name), count++; xfprintf(fp, "p min %d %d\n", G->nv, G->na), count++; if (v_rhs >= 0) { for (i = 1; i <= G->nv; i++) { v = G->v[i]; memcpy(&rhs, (char *)v->data + v_rhs, sizeof(double)); if (rhs != 0.0) xfprintf(fp, "n %d %.*g\n", i, DBL_DIG, rhs), count++; } } for (i = 1; i <= G->nv; i++) { v = G->v[i]; for (a = v->out; a != NULL; a = a->t_next) { if (a_low >= 0) memcpy(&low, (char *)a->data + a_low, sizeof(double)); else low = 0.0; if (a_cap >= 0) memcpy(&cap, (char *)a->data + a_cap, sizeof(double)); else cap = 1.0; if (a_cost >= 0) memcpy(&cost, (char *)a->data + a_cost, sizeof(double)); else cost = 0.0; xfprintf(fp, "a %d %d %.*g %.*g %.*g\n", a->tail->i, a->head->i, DBL_DIG, low, DBL_DIG, cap, DBL_DIG, cost), count++; } } xfprintf(fp, "c eof\n"), count++; #if 0 /* FIXME */ xfflush(fp); #endif if (glp_ioerr(fp)) { xprintf("Write error on '%s' - %s\n", fname, get_err_msg()); ret = 1; goto done; } xprintf("%d lines were written\n", count); ret = 0; done: if (fp != NULL) glp_close(fp); return ret; } /* eof */ glpk-5.0/src/api/wrmip.c0000644000062000006210000001053413766346220014347 0ustar maomkpasswd/* wrmip.c (write MIP solution in GLPK format) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2010-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "prob.h" /*********************************************************************** * NAME * * glp_write_mip - write MIP solution in GLPK format * * SYNOPSIS * * int glp_write_mip(glp_prob *P, const char *fname); * * DESCRIPTION * * The routine glp_write_mip writes MIP solution to a text file in GLPK * format. * * RETURNS * * If the operation was successful, the routine returns zero. Otherwise * it prints an error message and returns non-zero. */ int glp_write_mip(glp_prob *P, const char *fname) { glp_file *fp; GLPROW *row; GLPCOL *col; int i, j, count, ret = 1; char *s; #if 0 /* 04/IV-2016 */ if (P == NULL || P->magic != GLP_PROB_MAGIC) xerror("glp_write_mip: P = %p; invalid problem object\n", P); #endif if (fname == NULL) xerror("glp_write_mip: fname = %d; invalid parameter\n", fname) ; xprintf("Writing MIP solution to '%s'...\n", fname); fp = glp_open(fname, "w"), count = 0; if (fp == NULL) { xprintf("Unable to create '%s' - %s\n", fname, get_err_msg()); goto done; } /* write comment lines */ glp_format(fp, "c %-12s%s\n", "Problem:", P->name == NULL ? "" : P->name), count++; glp_format(fp, "c %-12s%d\n", "Rows:", P->m), count++; glp_format(fp, "c %-12s%d\n", "Columns:", P->n), count++; glp_format(fp, "c %-12s%d\n", "Non-zeros:", P->nnz), count++; switch (P->mip_stat) { case GLP_OPT: s = "INTEGER OPTIMAL"; break; case GLP_FEAS: s = "INTEGER NON-OPTIMAL"; break; case GLP_NOFEAS: s = "INTEGER EMPTY"; break; case GLP_UNDEF: s = "INTEGER UNDEFINED"; break; default: s = "???"; break; } glp_format(fp, "c %-12s%s\n", "Status:", s), count++; switch (P->dir) { case GLP_MIN: s = "MINimum"; break; case GLP_MAX: s = "MAXimum"; break; default: s = "???"; break; } glp_format(fp, "c %-12s%s%s%.10g (%s)\n", "Objective:", P->obj == NULL ? "" : P->obj, P->obj == NULL ? "" : " = ", P->mip_obj, s), count++; glp_format(fp, "c\n"), count++; /* write solution line */ glp_format(fp, "s mip %d %d ", P->m, P->n), count++; switch (P->mip_stat) { case GLP_OPT: glp_format(fp, "o"); break; case GLP_FEAS: glp_format(fp, "f"); break; case GLP_NOFEAS: glp_format(fp, "n"); break; case GLP_UNDEF: glp_format(fp, "u"); break; default: glp_format(fp, "?"); break; } glp_format(fp, " %.*g\n", DBL_DIG, P->mip_obj); /* write row solution descriptor lines */ for (i = 1; i <= P->m; i++) { row = P->row[i]; glp_format(fp, "i %d %.*g\n", i, DBL_DIG, row->mipx), count++; } /* write column solution descriptor lines */ for (j = 1; j <= P->n; j++) { col = P->col[j]; glp_format(fp, "j %d %.*g\n", j, DBL_DIG, col->mipx), count++; } /* write end line */ glp_format(fp, "e o f\n"), count++; if (glp_ioerr(fp)) { xprintf("Write error on '%s' - %s\n", fname, get_err_msg()); goto done; } /* MIP solution has been successfully written */ xprintf("%d lines were written\n", count); ret = 0; done: if (fp != NULL) glp_close(fp); return ret; } /* eof */ glpk-5.0/src/api/wrprob.c0000644000062000006210000001324113766346220014522 0ustar maomkpasswd/* wrprob.c (write problem data in GLPK format) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2010-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "prob.h" #define xfprintf glp_format /*********************************************************************** * NAME * * glp_write_prob - write problem data in GLPK format * * SYNOPSIS * * int glp_write_prob(glp_prob *P, int flags, const char *fname); * * The routine glp_write_prob writes problem data in GLPK LP/MIP format * to a text file. * * RETURNS * * If the operation was successful, the routine returns zero. Otherwise * it prints an error message and returns non-zero. */ int glp_write_prob(glp_prob *P, int flags, const char *fname) { glp_file *fp; GLPROW *row; GLPCOL *col; GLPAIJ *aij; int mip, i, j, count, ret; #if 0 /* 04/IV-2016 */ if (P == NULL || P->magic != GLP_PROB_MAGIC) xerror("glp_write_prob: P = %p; invalid problem object\n", P); #endif if (flags != 0) xerror("glp_write_prob: flags = %d; invalid parameter\n", flags); if (fname == NULL) xerror("glp_write_prob: fname = %d; invalid parameter\n", fname); xprintf("Writing problem data to '%s'...\n", fname); fp = glp_open(fname, "w"), count = 0; if (fp == NULL) { xprintf("Unable to create '%s' - %s\n", fname, get_err_msg()); ret = 1; goto done; } /* write problem line */ mip = (glp_get_num_int(P) > 0); xfprintf(fp, "p %s %s %d %d %d\n", !mip ? "lp" : "mip", P->dir == GLP_MIN ? "min" : P->dir == GLP_MAX ? "max" : "???", P->m, P->n, P->nnz), count++; if (P->name != NULL) xfprintf(fp, "n p %s\n", P->name), count++; if (P->obj != NULL) xfprintf(fp, "n z %s\n", P->obj), count++; /* write row descriptors */ for (i = 1; i <= P->m; i++) { row = P->row[i]; if (row->type == GLP_FX && row->lb == 0.0) goto skip1; xfprintf(fp, "i %d ", i), count++; if (row->type == GLP_FR) xfprintf(fp, "f\n"); else if (row->type == GLP_LO) xfprintf(fp, "l %.*g\n", DBL_DIG, row->lb); else if (row->type == GLP_UP) xfprintf(fp, "u %.*g\n", DBL_DIG, row->ub); else if (row->type == GLP_DB) xfprintf(fp, "d %.*g %.*g\n", DBL_DIG, row->lb, DBL_DIG, row->ub); else if (row->type == GLP_FX) xfprintf(fp, "s %.*g\n", DBL_DIG, row->lb); else xassert(row != row); skip1: if (row->name != NULL) xfprintf(fp, "n i %d %s\n", i, row->name), count++; } /* write column descriptors */ for (j = 1; j <= P->n; j++) { col = P->col[j]; if (!mip && col->type == GLP_LO && col->lb == 0.0) goto skip2; if (mip && col->kind == GLP_IV && col->type == GLP_DB && col->lb == 0.0 && col->ub == 1.0) goto skip2; xfprintf(fp, "j %d ", j), count++; if (mip) { if (col->kind == GLP_CV) xfprintf(fp, "c "); else if (col->kind == GLP_IV) xfprintf(fp, "i "); else xassert(col != col); } if (col->type == GLP_FR) xfprintf(fp, "f\n"); else if (col->type == GLP_LO) xfprintf(fp, "l %.*g\n", DBL_DIG, col->lb); else if (col->type == GLP_UP) xfprintf(fp, "u %.*g\n", DBL_DIG, col->ub); else if (col->type == GLP_DB) xfprintf(fp, "d %.*g %.*g\n", DBL_DIG, col->lb, DBL_DIG, col->ub); else if (col->type == GLP_FX) xfprintf(fp, "s %.*g\n", DBL_DIG, col->lb); else xassert(col != col); skip2: if (col->name != NULL) xfprintf(fp, "n j %d %s\n", j, col->name), count++; } /* write objective coefficient descriptors */ if (P->c0 != 0.0) xfprintf(fp, "a 0 0 %.*g\n", DBL_DIG, P->c0), count++; for (j = 1; j <= P->n; j++) { col = P->col[j]; if (col->coef != 0.0) xfprintf(fp, "a 0 %d %.*g\n", j, DBL_DIG, col->coef), count++; } /* write constraint coefficient descriptors */ for (i = 1; i <= P->m; i++) { row = P->row[i]; for (aij = row->ptr; aij != NULL; aij = aij->r_next) xfprintf(fp, "a %d %d %.*g\n", i, aij->col->j, DBL_DIG, aij->val), count++; } /* write end line */ xfprintf(fp, "e o f\n"), count++; #if 0 /* FIXME */ xfflush(fp); #endif if (glp_ioerr(fp)) { xprintf("Write error on '%s' - %s\n", fname, get_err_msg()); ret = 1; goto done; } xprintf("%d lines were written\n", count); ret = 0; done: if (fp != NULL) glp_close(fp); return ret; } /* eof */ glpk-5.0/src/api/wrsol.c0000644000062000006210000001370013766346220014355 0ustar maomkpasswd/* wrsol.c (write basic solution in GLPK format) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2010-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "prob.h" /*********************************************************************** * NAME * * glp_write_sol - write basic solution in GLPK format * * SYNOPSIS * * int glp_write_sol(glp_prob *P, const char *fname); * * DESCRIPTION * * The routine glp_write_sol writes basic solution to a text file in * GLPK format. * * RETURNS * * If the operation was successful, the routine returns zero. Otherwise * it prints an error message and returns non-zero. */ int glp_write_sol(glp_prob *P, const char *fname) { glp_file *fp; GLPROW *row; GLPCOL *col; int i, j, count, ret = 1; char *s; #if 0 /* 04/IV-2016 */ if (P == NULL || P->magic != GLP_PROB_MAGIC) xerror("glp_write_sol: P = %p; invalid problem object\n", P); #endif if (fname == NULL) xerror("glp_write_sol: fname = %d; invalid parameter\n", fname) ; xprintf("Writing basic solution to '%s'...\n", fname); fp = glp_open(fname, "w"), count = 0; if (fp == NULL) { xprintf("Unable to create '%s' - %s\n", fname, get_err_msg()); goto done; } /* write comment lines */ glp_format(fp, "c %-12s%s\n", "Problem:", P->name == NULL ? "" : P->name), count++; glp_format(fp, "c %-12s%d\n", "Rows:", P->m), count++; glp_format(fp, "c %-12s%d\n", "Columns:", P->n), count++; glp_format(fp, "c %-12s%d\n", "Non-zeros:", P->nnz), count++; switch (glp_get_status(P)) { case GLP_OPT: s = "OPTIMAL"; break; case GLP_FEAS: s = "FEASIBLE"; break; case GLP_INFEAS: s = "INFEASIBLE (INTERMEDIATE)"; break; case GLP_NOFEAS: s = "INFEASIBLE (FINAL)"; break; case GLP_UNBND: s = "UNBOUNDED"; break; case GLP_UNDEF: s = "UNDEFINED"; break; default: s = "???"; break; } glp_format(fp, "c %-12s%s\n", "Status:", s), count++; switch (P->dir) { case GLP_MIN: s = "MINimum"; break; case GLP_MAX: s = "MAXimum"; break; default: s = "???"; break; } glp_format(fp, "c %-12s%s%s%.10g (%s)\n", "Objective:", P->obj == NULL ? "" : P->obj, P->obj == NULL ? "" : " = ", P->obj_val, s), count++; glp_format(fp, "c\n"), count++; /* write solution line */ glp_format(fp, "s bas %d %d ", P->m, P->n), count++; switch (P->pbs_stat) { case GLP_UNDEF: glp_format(fp, "u"); break; case GLP_FEAS: glp_format(fp, "f"); break; case GLP_INFEAS: glp_format(fp, "i"); break; case GLP_NOFEAS: glp_format(fp, "n"); break; default: glp_format(fp, "?"); break; } glp_format(fp, " "); switch (P->dbs_stat) { case GLP_UNDEF: glp_format(fp, "u"); break; case GLP_FEAS: glp_format(fp, "f"); break; case GLP_INFEAS: glp_format(fp, "i"); break; case GLP_NOFEAS: glp_format(fp, "n"); break; default: glp_format(fp, "?"); break; } glp_format(fp, " %.*g\n", DBL_DIG, P->obj_val); /* write row solution descriptor lines */ for (i = 1; i <= P->m; i++) { row = P->row[i]; glp_format(fp, "i %d ", i), count++; switch (row->stat) { case GLP_BS: glp_format(fp, "b"); break; case GLP_NL: glp_format(fp, "l"); break; case GLP_NU: glp_format(fp, "u"); break; case GLP_NF: glp_format(fp, "f"); break; case GLP_NS: glp_format(fp, "s"); break; default: xassert(row != row); } glp_format(fp, " %.*g %.*g\n", DBL_DIG, row->prim, DBL_DIG, row->dual); } /* write column solution descriptor lines */ for (j = 1; j <= P->n; j++) { col = P->col[j]; glp_format(fp, "j %d ", j), count++; switch (col->stat) { case GLP_BS: glp_format(fp, "b"); break; case GLP_NL: glp_format(fp, "l"); break; case GLP_NU: glp_format(fp, "u"); break; case GLP_NF: glp_format(fp, "f"); break; case GLP_NS: glp_format(fp, "s"); break; default: xassert(col != col); } glp_format(fp, " %.*g %.*g\n", DBL_DIG, col->prim, DBL_DIG, col->dual); } /* write end line */ glp_format(fp, "e o f\n"), count++; if (glp_ioerr(fp)) { xprintf("Write error on '%s' - %s\n", fname, get_err_msg()); goto done; } /* basic solution has been successfully written */ xprintf("%d lines were written\n", count); ret = 0; done: if (fp != NULL) glp_close(fp); return ret; } /* eof */ glpk-5.0/src/bflib/0000755000062000006210000000000013766346220013347 5ustar maomkpasswdglpk-5.0/src/bflib/btf.c0000644000062000006210000005043213766346220014272 0ustar maomkpasswd/* btf.c (sparse block triangular LU-factorization) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2013-2014 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "btf.h" #include "env.h" #include "luf.h" #include "mc13d.h" #include "mc21a.h" /*********************************************************************** * btf_store_a_cols - store pattern of matrix A in column-wise format * * This routine stores the pattern (that is, only indices of non-zero * elements) of the original matrix A in column-wise format. * * On exit the routine returns the number of non-zeros in matrix A. */ int btf_store_a_cols(BTF *btf, int (*col)(void *info, int j, int ind[], double val[]), void *info, int ind[], double val[]) { int n = btf->n; SVA *sva = btf->sva; int *sv_ind = sva->ind; int ac_ref = btf->ac_ref; int *ac_ptr = &sva->ptr[ac_ref-1]; int *ac_len = &sva->len[ac_ref-1]; int j, len, ptr, nnz; nnz = 0; for (j = 1; j <= n; j++) { /* get j-th column */ len = col(info, j, ind, val); xassert(0 <= len && len <= n); /* reserve locations for j-th column */ if (len > 0) { if (sva->r_ptr - sva->m_ptr < len) { sva_more_space(sva, len); sv_ind = sva->ind; } sva_reserve_cap(sva, ac_ref+(j-1), len); } /* store pattern of j-th column */ ptr = ac_ptr[j]; memcpy(&sv_ind[ptr], &ind[1], len * sizeof(int)); ac_len[j] = len; nnz += len; } return nnz; } /*********************************************************************** * btf_make_blocks - permutations to block triangular form * * This routine analyzes the pattern of the original matrix A and * determines permutation matrices P and Q such that A = P * A~* Q, * where A~ is an upper block triangular matrix. * * On exit the routine returns symbolic rank of matrix A. */ int btf_make_blocks(BTF *btf) { int n = btf->n; SVA *sva = btf->sva; int *sv_ind = sva->ind; int *pp_ind = btf->pp_ind; int *pp_inv = btf->pp_inv; int *qq_ind = btf->qq_ind; int *qq_inv = btf->qq_inv; int *beg = btf->beg; int ac_ref = btf->ac_ref; int *ac_ptr = &sva->ptr[ac_ref-1]; int *ac_len = &sva->len[ac_ref-1]; int i, j, rank, *iperm, *pr, *arp, *cv, *out, *ip, *lenr, *lowl, *numb, *prev; /* determine column permutation matrix M such that matrix A * M * has zero-free diagonal */ iperm = qq_inv; /* matrix M */ pr = btf->p1_ind; /* working array */ arp = btf->p1_inv; /* working array */ cv = btf->q1_ind; /* working array */ out = btf->q1_inv; /* working array */ rank = mc21a(n, sv_ind, ac_ptr, ac_len, iperm, pr, arp, cv, out); xassert(0 <= rank && rank <= n); if (rank < n) { /* A is structurally singular (rank is its symbolic rank) */ goto done; } /* build pattern of matrix A * M */ ip = pp_ind; /* working array */ lenr = qq_ind; /* working array */ for (j = 1; j <= n; j++) { ip[j] = ac_ptr[iperm[j]]; lenr[j] = ac_len[iperm[j]]; } /* determine symmetric permutation matrix S such that matrix * S * (A * M) * S' = A~ is upper block triangular */ lowl = btf->p1_ind; /* working array */ numb = btf->p1_inv; /* working array */ prev = btf->q1_ind; /* working array */ btf->num = mc13d(n, sv_ind, ip, lenr, pp_inv, beg, lowl, numb, prev); xassert(beg[1] == 1); beg[btf->num+1] = n+1; /* A * M = S' * A~ * S ==> A = S' * A~ * (S * M') */ /* determine permutation matrix P = S' */ for (j = 1; j <= n; j++) pp_ind[pp_inv[j]] = j; /* determine permutation matrix Q = S * M' = P' * M' */ for (i = 1; i <= n; i++) qq_ind[i] = iperm[pp_inv[i]]; for (i = 1; i <= n; i++) qq_inv[qq_ind[i]] = i; done: return rank; } /*********************************************************************** * btf_check_blocks - check structure of matrix A~ * * This routine checks that structure of upper block triangular matrix * A~ is correct. * * NOTE: For testing/debugging only. */ void btf_check_blocks(BTF *btf) { int n = btf->n; SVA *sva = btf->sva; int *sv_ind = sva->ind; int *pp_ind = btf->pp_ind; int *pp_inv = btf->pp_inv; int *qq_ind = btf->qq_ind; int *qq_inv = btf->qq_inv; int num = btf->num; int *beg = btf->beg; int ac_ref = btf->ac_ref; int *ac_ptr = &sva->ptr[ac_ref-1]; int *ac_len = &sva->len[ac_ref-1]; int i, ii, j, jj, k, size, ptr, end, diag; xassert(n > 0); /* check permutation matrices P and Q */ for (k = 1; k <= n; k++) { xassert(1 <= pp_ind[k] && pp_ind[k] <= n); xassert(pp_inv[pp_ind[k]] == k); xassert(1 <= qq_ind[k] && qq_ind[k] <= n); xassert(qq_inv[qq_ind[k]] == k); } /* check that matrix A~ is upper block triangular with non-zero * diagonal */ xassert(1 <= num && num <= n); xassert(beg[1] == 1); xassert(beg[num+1] == n+1); /* walk thru blocks of A~ */ for (k = 1; k <= num; k++) { /* determine size of k-th block */ size = beg[k+1] - beg[k]; xassert(size >= 1); /* walk thru columns of k-th block */ for (jj = beg[k]; jj < beg[k+1]; jj++) { diag = 0; /* jj-th column of A~ = j-th column of A */ j = qq_ind[jj]; /* walk thru elements of j-th column of A */ ptr = ac_ptr[j]; end = ptr + ac_len[j]; for (; ptr < end; ptr++) { /* determine row index of a[i,j] */ i = sv_ind[ptr]; /* i-th row of A = ii-th row of A~ */ ii = pp_ind[i]; /* a~[ii,jj] should not be below k-th block */ xassert(ii < beg[k+1]); if (ii == jj) { /* non-zero diagonal element of A~ encountered */ diag = 1; } } xassert(diag); } } return; } /*********************************************************************** * btf_build_a_rows - build matrix A in row-wise format * * This routine builds the row-wise representation of matrix A in the * right part of SVA using its column-wise representation. * * The working array len should have at least 1+n elements (len[0] is * not used). */ void btf_build_a_rows(BTF *btf, int len[/*1+n*/]) { int n = btf->n; SVA *sva = btf->sva; int *sv_ind = sva->ind; double *sv_val = sva->val; int ar_ref = btf->ar_ref; int *ar_ptr = &sva->ptr[ar_ref-1]; int *ar_len = &sva->len[ar_ref-1]; int ac_ref = btf->ac_ref; int *ac_ptr = &sva->ptr[ac_ref-1]; int *ac_len = &sva->len[ac_ref-1]; int i, j, end, nnz, ptr, ptr1; /* calculate the number of non-zeros in each row of matrix A and * the total number of non-zeros */ nnz = 0; for (i = 1; i <= n; i++) len[i] = 0; for (j = 1; j <= n; j++) { nnz += ac_len[j]; for (end = (ptr = ac_ptr[j]) + ac_len[j]; ptr < end; ptr++) len[sv_ind[ptr]]++; } /* we need at least nnz free locations in SVA */ if (sva->r_ptr - sva->m_ptr < nnz) { sva_more_space(sva, nnz); sv_ind = sva->ind; sv_val = sva->val; } /* reserve locations for rows of matrix A */ for (i = 1; i <= n; i++) { if (len[i] > 0) sva_reserve_cap(sva, ar_ref-1+i, len[i]); ar_len[i] = len[i]; } /* walk thru columns of matrix A and build its rows */ for (j = 1; j <= n; j++) { for (end = (ptr = ac_ptr[j]) + ac_len[j]; ptr < end; ptr++) { i = sv_ind[ptr]; sv_ind[ptr1 = ar_ptr[i] + (--len[i])] = j; sv_val[ptr1] = sv_val[ptr]; } } return; } /*********************************************************************** * btf_a_solve - solve system A * x = b * * This routine solves the system A * x = b, where A is the original * matrix. * * On entry the array b should contain elements of the right-hand size * vector b in locations b[1], ..., b[n], where n is the order of the * matrix A. On exit the array x will contain elements of the solution * vector in locations x[1], ..., x[n]. Note that the array b will be * clobbered on exit. * * The routine also uses locations [1], ..., [max_size] of two working * arrays w1 and w2, where max_size is the maximal size of diagonal * blocks in BT-factorization (max_size <= n). */ void btf_a_solve(BTF *btf, double b[/*1+n*/], double x[/*1+n*/], double w1[/*1+n*/], double w2[/*1+n*/]) { SVA *sva = btf->sva; int *sv_ind = sva->ind; double *sv_val = sva->val; int *pp_inv = btf->pp_inv; int *qq_ind = btf->qq_ind; int num = btf->num; int *beg = btf->beg; int ac_ref = btf->ac_ref; int *ac_ptr = &sva->ptr[ac_ref-1]; int *ac_len = &sva->len[ac_ref-1]; double *bb = w1; double *xx = w2; LUF luf; int i, j, jj, k, beg_k, flag; double t; for (k = num; k >= 1; k--) { /* determine order of diagonal block A~[k,k] */ luf.n = beg[k+1] - (beg_k = beg[k]); if (luf.n == 1) { /* trivial case */ /* solve system A~[k,k] * X[k] = B[k] */ t = x[qq_ind[beg_k]] = b[pp_inv[beg_k]] / btf->vr_piv[beg_k]; /* substitute X[k] into other equations */ if (t != 0.0) { int ptr = ac_ptr[qq_ind[beg_k]]; int end = ptr + ac_len[qq_ind[beg_k]]; for (; ptr < end; ptr++) b[sv_ind[ptr]] -= sv_val[ptr] * t; } } else { /* general case */ /* construct B[k] */ flag = 0; for (i = 1; i <= luf.n; i++) { if ((bb[i] = b[pp_inv[i + (beg_k-1)]]) != 0.0) flag = 1; } /* solve system A~[k,k] * X[k] = B[k] */ if (!flag) { /* B[k] = 0, so X[k] = 0 */ for (j = 1; j <= luf.n; j++) x[qq_ind[j + (beg_k-1)]] = 0.0; continue; } luf.sva = sva; luf.fr_ref = btf->fr_ref + (beg_k-1); luf.fc_ref = btf->fc_ref + (beg_k-1); luf.vr_ref = btf->vr_ref + (beg_k-1); luf.vr_piv = btf->vr_piv + (beg_k-1); luf.vc_ref = btf->vc_ref + (beg_k-1); luf.pp_ind = btf->p1_ind + (beg_k-1); luf.pp_inv = btf->p1_inv + (beg_k-1); luf.qq_ind = btf->q1_ind + (beg_k-1); luf.qq_inv = btf->q1_inv + (beg_k-1); luf_f_solve(&luf, bb); luf_v_solve(&luf, bb, xx); /* store X[k] and substitute it into other equations */ for (j = 1; j <= luf.n; j++) { jj = j + (beg_k-1); t = x[qq_ind[jj]] = xx[j]; if (t != 0.0) { int ptr = ac_ptr[qq_ind[jj]]; int end = ptr + ac_len[qq_ind[jj]]; for (; ptr < end; ptr++) b[sv_ind[ptr]] -= sv_val[ptr] * t; } } } } return; } /*********************************************************************** * btf_at_solve - solve system A'* x = b * * This routine solves the system A'* x = b, where A' is a matrix * transposed to the original matrix A. * * On entry the array b should contain elements of the right-hand size * vector b in locations b[1], ..., b[n], where n is the order of the * matrix A. On exit the array x will contain elements of the solution * vector in locations x[1], ..., x[n]. Note that the array b will be * clobbered on exit. * * The routine also uses locations [1], ..., [max_size] of two working * arrays w1 and w2, where max_size is the maximal size of diagonal * blocks in BT-factorization (max_size <= n). */ void btf_at_solve(BTF *btf, double b[/*1+n*/], double x[/*1+n*/], double w1[/*1+n*/], double w2[/*1+n*/]) { SVA *sva = btf->sva; int *sv_ind = sva->ind; double *sv_val = sva->val; int *pp_inv = btf->pp_inv; int *qq_ind = btf->qq_ind; int num = btf->num; int *beg = btf->beg; int ar_ref = btf->ar_ref; int *ar_ptr = &sva->ptr[ar_ref-1]; int *ar_len = &sva->len[ar_ref-1]; double *bb = w1; double *xx = w2; LUF luf; int i, j, jj, k, beg_k, flag; double t; for (k = 1; k <= num; k++) { /* determine order of diagonal block A~[k,k] */ luf.n = beg[k+1] - (beg_k = beg[k]); if (luf.n == 1) { /* trivial case */ /* solve system A~'[k,k] * X[k] = B[k] */ t = x[pp_inv[beg_k]] = b[qq_ind[beg_k]] / btf->vr_piv[beg_k]; /* substitute X[k] into other equations */ if (t != 0.0) { int ptr = ar_ptr[pp_inv[beg_k]]; int end = ptr + ar_len[pp_inv[beg_k]]; for (; ptr < end; ptr++) b[sv_ind[ptr]] -= sv_val[ptr] * t; } } else { /* general case */ /* construct B[k] */ flag = 0; for (i = 1; i <= luf.n; i++) { if ((bb[i] = b[qq_ind[i + (beg_k-1)]]) != 0.0) flag = 1; } /* solve system A~'[k,k] * X[k] = B[k] */ if (!flag) { /* B[k] = 0, so X[k] = 0 */ for (j = 1; j <= luf.n; j++) x[pp_inv[j + (beg_k-1)]] = 0.0; continue; } luf.sva = sva; luf.fr_ref = btf->fr_ref + (beg_k-1); luf.fc_ref = btf->fc_ref + (beg_k-1); luf.vr_ref = btf->vr_ref + (beg_k-1); luf.vr_piv = btf->vr_piv + (beg_k-1); luf.vc_ref = btf->vc_ref + (beg_k-1); luf.pp_ind = btf->p1_ind + (beg_k-1); luf.pp_inv = btf->p1_inv + (beg_k-1); luf.qq_ind = btf->q1_ind + (beg_k-1); luf.qq_inv = btf->q1_inv + (beg_k-1); luf_vt_solve(&luf, bb, xx); luf_ft_solve(&luf, xx); /* store X[k] and substitute it into other equations */ for (j = 1; j <= luf.n; j++) { jj = j + (beg_k-1); t = x[pp_inv[jj]] = xx[j]; if (t != 0.0) { int ptr = ar_ptr[pp_inv[jj]]; int end = ptr + ar_len[pp_inv[jj]]; for (; ptr < end; ptr++) b[sv_ind[ptr]] -= sv_val[ptr] * t; } } } } return; } /*********************************************************************** * btf_at_solve1 - solve system A'* y = e' to cause growth in y * * This routine is a special version of btf_at_solve. It solves the * system A'* y = e' = e + delta e, where A' is a matrix transposed to * the original matrix A, e is the specified right-hand side vector, * and delta e is a vector of +1 and -1 chosen to cause growth in the * solution vector y. * * On entry the array e should contain elements of the right-hand size * vector e in locations e[1], ..., e[n], where n is the order of the * matrix A. On exit the array y will contain elements of the solution * vector in locations y[1], ..., y[n]. Note that the array e will be * clobbered on exit. * * The routine also uses locations [1], ..., [max_size] of two working * arrays w1 and w2, where max_size is the maximal size of diagonal * blocks in BT-factorization (max_size <= n). */ void btf_at_solve1(BTF *btf, double e[/*1+n*/], double y[/*1+n*/], double w1[/*1+n*/], double w2[/*1+n*/]) { SVA *sva = btf->sva; int *sv_ind = sva->ind; double *sv_val = sva->val; int *pp_inv = btf->pp_inv; int *qq_ind = btf->qq_ind; int num = btf->num; int *beg = btf->beg; int ar_ref = btf->ar_ref; int *ar_ptr = &sva->ptr[ar_ref-1]; int *ar_len = &sva->len[ar_ref-1]; double *ee = w1; double *yy = w2; LUF luf; int i, j, jj, k, beg_k, ptr, end; double e_k, y_k; for (k = 1; k <= num; k++) { /* determine order of diagonal block A~[k,k] */ luf.n = beg[k+1] - (beg_k = beg[k]); if (luf.n == 1) { /* trivial case */ /* determine E'[k] = E[k] + delta E[k] */ e_k = e[qq_ind[beg_k]]; e_k = (e_k >= 0.0 ? e_k + 1.0 : e_k - 1.0); /* solve system A~'[k,k] * Y[k] = E[k] */ y_k = y[pp_inv[beg_k]] = e_k / btf->vr_piv[beg_k]; /* substitute Y[k] into other equations */ ptr = ar_ptr[pp_inv[beg_k]]; end = ptr + ar_len[pp_inv[beg_k]]; for (; ptr < end; ptr++) e[sv_ind[ptr]] -= sv_val[ptr] * y_k; } else { /* general case */ /* construct E[k] */ for (i = 1; i <= luf.n; i++) ee[i] = e[qq_ind[i + (beg_k-1)]]; /* solve system A~'[k,k] * Y[k] = E[k] + delta E[k] */ luf.sva = sva; luf.fr_ref = btf->fr_ref + (beg_k-1); luf.fc_ref = btf->fc_ref + (beg_k-1); luf.vr_ref = btf->vr_ref + (beg_k-1); luf.vr_piv = btf->vr_piv + (beg_k-1); luf.vc_ref = btf->vc_ref + (beg_k-1); luf.pp_ind = btf->p1_ind + (beg_k-1); luf.pp_inv = btf->p1_inv + (beg_k-1); luf.qq_ind = btf->q1_ind + (beg_k-1); luf.qq_inv = btf->q1_inv + (beg_k-1); luf_vt_solve1(&luf, ee, yy); luf_ft_solve(&luf, yy); /* store Y[k] and substitute it into other equations */ for (j = 1; j <= luf.n; j++) { jj = j + (beg_k-1); y_k = y[pp_inv[jj]] = yy[j]; ptr = ar_ptr[pp_inv[jj]]; end = ptr + ar_len[pp_inv[jj]]; for (; ptr < end; ptr++) e[sv_ind[ptr]] -= sv_val[ptr] * y_k; } } } return; } /*********************************************************************** * btf_estimate_norm - estimate 1-norm of inv(A) * * This routine estimates 1-norm of inv(A) by one step of inverse * iteration for the small singular vector as described in [1]. This * involves solving two systems of equations: * * A'* y = e, * * A * z = y, * * where A' is a matrix transposed to A, and e is a vector of +1 and -1 * chosen to cause growth in y. Then * * estimate 1-norm of inv(A) = (1-norm of z) / (1-norm of y) * * REFERENCES * * 1. G.E.Forsythe, M.A.Malcolm, C.B.Moler. Computer Methods for * Mathematical Computations. Prentice-Hall, Englewood Cliffs, N.J., * pp. 30-62 (subroutines DECOMP and SOLVE). */ double btf_estimate_norm(BTF *btf, double w1[/*1+n*/], double w2[/*1+n*/], double w3[/*1+n*/], double w4[/*1+n*/]) { int n = btf->n; double *e = w1; double *y = w2; double *z = w1; int i; double y_norm, z_norm; /* compute y = inv(A') * e to cause growth in y */ for (i = 1; i <= n; i++) e[i] = 0.0; btf_at_solve1(btf, e, y, w3, w4); /* compute 1-norm of y = sum |y[i]| */ y_norm = 0.0; for (i = 1; i <= n; i++) y_norm += (y[i] >= 0.0 ? +y[i] : -y[i]); /* compute z = inv(A) * y */ btf_a_solve(btf, y, z, w3, w4); /* compute 1-norm of z = sum |z[i]| */ z_norm = 0.0; for (i = 1; i <= n; i++) z_norm += (z[i] >= 0.0 ? +z[i] : -z[i]); /* estimate 1-norm of inv(A) = (1-norm of z) / (1-norm of y) */ return z_norm / y_norm; } /* eof */ glpk-5.0/src/bflib/btf.h0000644000062000006210000002072113766346220014275 0ustar maomkpasswd/* btf.h (sparse block triangular LU-factorization) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2013-2014 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef BTF_H #define BTF_H #include "sva.h" /*********************************************************************** * The structure BTF describes BT-factorization, which is sparse block * triangular LU-factorization. * * The BT-factorization has the following format: * * A = P * A~ * Q, (1) * * where A is a given (unsymmetric) square matrix, A~ is an upper block * triangular matrix (see below), P and Q are permutation matrices. All * the matrices have the same order n. * * The matrix A~, which is a permuted version of the original matrix A, * has the following structure: * * A~[1,1] A~[1,2] ... A~[1,num-1] A~[1,num] * * A~[2,2] ... A~[2,num-1] A~[2,num] * * . . . . . . . . . (2) * * A~[num-1,num-1] A~[num-1,num] * * A~[num,num] * * where A~[i,j] is a submatrix called a "block," num is the number of * blocks. Each diagonal block A~[k,k] is a non-singular square matrix, * and each subdiagonal block A~[i,j], i > j, is a zero submatrix, thus * A~ is an upper block triangular matrix. * * Permutation matrices P and Q are stored in ordinary arrays in both * row- and column-like formats. * * The original matrix A is stored in both row- and column-wise sparse * formats in the associated sparse vector area (SVA). Should note that * elements of all diagonal blocks A~[k,k] in matrix A are set to zero * (i.e. removed), so only elements of non-diagonal blocks are stored. * * Each diagonal block A~[k,k], 1 <= k <= num, is stored in the form of * LU-factorization (see the module LUF). */ typedef struct BTF BTF; struct BTF { /* sparse block triangular LU-factorization */ int n; /* order of matrices A, A~, P, Q */ SVA *sva; /* associated sparse vector area used to store rows and columns * of matrix A as well as sparse vectors for LU-factorizations of * all diagonal blocks A~[k,k] */ /*--------------------------------------------------------------*/ /* matrix P */ int *pp_ind; /* int pp_ind[1+n]; */ /* pp_ind[i] = j means that P[i,j] = 1 */ int *pp_inv; /* int pp_inv[1+n]; */ /* pp_inv[j] = i means that P[i,j] = 1 */ /* if i-th row of matrix A is i'-th row of matrix A~, then * pp_ind[i] = i' and pp_inv[i'] = i */ /*--------------------------------------------------------------*/ /* matrix Q */ int *qq_ind; /* int qq_ind[1+n]; */ /* qq_ind[i] = j means that Q[i,j] = 1 */ int *qq_inv; /* int qq_inv[1+n]; */ /* qq_inv[j] = i means that Q[i,j] = 1 */ /* if j-th column of matrix A is j'-th column of matrix A~, then * qq_ind[j'] = j and qq_inv[j] = j' */ /*--------------------------------------------------------------*/ /* block triangular structure of matrix A~ */ int num; /* number of diagonal blocks, 1 <= num <= n */ int *beg; /* int beg[1+num+1]; */ /* beg[0] is not used; * beg[k], 1 <= k <= num, is index of first row/column of k-th * block of matrix A~; * beg[num+1] is always n+1; * note that order (size) of k-th diagonal block can be computed * as beg[k+1] - beg[k] */ /*--------------------------------------------------------------*/ /* original matrix A in row-wise format */ /* NOTE: elements of all diagonal blocks A~[k,k] are removed */ int ar_ref; /* reference number of sparse vector in SVA, which is the first * row of matrix A */ #if 0 + 0 int *ar_ptr = &sva->ptr[ar_ref-1]; /* ar_ptr[0] is not used; * ar_ptr[i], 1 <= i <= n, is pointer to i-th row in SVA */ int *ar_len = &sva->ptr[ar_ref-1]; /* ar_len[0] is not used; * ar_len[i], 1 <= i <= n, is length of i-th row */ #endif /*--------------------------------------------------------------*/ /* original matrix A in column-wise format */ /* NOTE: elements of all diagonal blocks A~[k,k] are removed */ int ac_ref; /* reference number of sparse vector in SVA, which is the first * column of matrix A */ #if 0 + 0 int *ac_ptr = &sva->ptr[ac_ref-1]; /* ac_ptr[0] is not used; * ac_ptr[j], 1 <= j <= n, is pointer to j-th column in SVA */ int *ac_len = &sva->ptr[ac_ref-1]; /* ac_len[0] is not used; * ac_len[j], 1 <= j <= n, is length of j-th column */ #endif /*--------------------------------------------------------------*/ /* LU-factorizations of diagonal blocks A~[k,k] */ /* to decrease overhead expenses similar arrays for all LUFs are * packed into a single array; for example, elements fr_ptr[1], * ..., fr_ptr[n1], where n1 = beg[2] - beg[1], are related to * LUF for first diagonal block A~[1,1], elements fr_ptr[n1+1], * ..., fr_ptr[n1+n2], where n2 = beg[3] - beg[2], are related to * LUF for second diagonal block A~[2,2], etc.; in other words, * elements related to LUF for k-th diagonal block A~[k,k] have * indices beg[k], beg[k]+1, ..., beg[k+1]-1 */ /* for details about LUF see description of the LUF module */ int fr_ref; /* reference number of sparse vector in SVA, which is the first row of matrix F for first diagonal block A~[1,1] */ int fc_ref; /* reference number of sparse vector in SVA, which is the first column of matrix F for first diagonal block A~[1,1] */ int vr_ref; /* reference number of sparse vector in SVA, which is the first row of matrix V for first diagonal block A~[1,1] */ double *vr_piv; /* double vr_piv[1+n]; */ /* vr_piv[0] is not used; vr_piv[1,...,n] are pivot elements for all diagonal blocks */ int vc_ref; /* reference number of sparse vector in SVA, which is the first column of matrix V for first diagonal block A~[1,1] */ int *p1_ind; /* int p1_ind[1+n]; */ int *p1_inv; /* int p1_inv[1+n]; */ int *q1_ind; /* int q1_ind[1+n]; */ int *q1_inv; /* int q1_inv[1+n]; */ /* permutation matrices P and Q for all diagonal blocks */ }; #define btf_store_a_cols _glp_btf_store_a_cols int btf_store_a_cols(BTF *btf, int (*col)(void *info, int j, int ind[], double val[]), void *info, int ind[], double val[]); /* store pattern of matrix A in column-wise format */ #define btf_make_blocks _glp_btf_make_blocks int btf_make_blocks(BTF *btf); /* permutations to block triangular form */ #define btf_check_blocks _glp_btf_check_blocks void btf_check_blocks(BTF *btf); /* check structure of matrix A~ */ #define btf_build_a_rows _glp_btf_build_a_rows void btf_build_a_rows(BTF *btf, int len[/*1+n*/]); /* build matrix A in row-wise format */ #define btf_a_solve _glp_btf_a_solve void btf_a_solve(BTF *btf, double b[/*1+n*/], double x[/*1+n*/], double w1[/*1+n*/], double w2[/*1+n*/]); /* solve system A * x = b */ #define btf_at_solve _glp_btf_at_solve void btf_at_solve(BTF *btf, double b[/*1+n*/], double x[/*1+n*/], double w1[/*1+n*/], double w2[/*1+n*/]); /* solve system A'* x = b */ #define btf_at_solve1 _glp_btf_at_solve1 void btf_at_solve1(BTF *btf, double e[/*1+n*/], double y[/*1+n*/], double w1[/*1+n*/], double w2[/*1+n*/]); /* solve system A'* y = e' to cause growth in y */ #define btf_estimate_norm _glp_btf_estimate_norm double btf_estimate_norm(BTF *btf, double w1[/*1+n*/], double w2[/*1+n*/], double w3[/*1+n*/], double w4[/*1+n*/]); /* estimate 1-norm of inv(A) */ #endif /* eof */ glpk-5.0/src/bflib/btfint.c0000644000062000006210000003416713766346220015014 0ustar maomkpasswd/* btfint.c (interface to BT-factorization) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2013-2014 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "btfint.h" BTFINT *btfint_create(void) { /* create interface to BT-factorization */ BTFINT *fi; fi = talloc(1, BTFINT); fi->n_max = 0; fi->valid = 0; fi->sva = NULL; fi->btf = NULL; fi->sgf = NULL; fi->sva_n_max = fi->sva_size = 0; fi->delta_n0 = fi->delta_n = 0; fi->sgf_piv_tol = 0.10; fi->sgf_piv_lim = 4; fi->sgf_suhl = 1; fi->sgf_eps_tol = DBL_EPSILON; return fi; } static void factorize_triv(BTFINT *fi, int k, int (*col)(void *info, int j, int ind[], double val[]), void *info) { /* compute LU-factorization of diagonal block A~[k,k] and store * corresponding columns of matrix A except elements of A~[k,k] * (trivial case when the block has unity size) */ SVA *sva = fi->sva; int *sv_ind = sva->ind; double *sv_val = sva->val; BTF *btf = fi->btf; int *pp_inv = btf->pp_inv; int *qq_ind = btf->qq_ind; int *beg = btf->beg; int ac_ref = btf->ac_ref; int *ac_ptr = &sva->ptr[ac_ref-1]; int *ac_len = &sva->len[ac_ref-1]; SGF *sgf = fi->sgf; int *ind = (int *)sgf->vr_max; /* working array */ double *val = sgf->work; /* working array */ int i, j, t, len, ptr, beg_k; /* diagonal block A~[k,k] has the only element in matrix A~, * which is a~[beg[k],beg[k]] = a[i,j] */ beg_k = beg[k]; i = pp_inv[beg_k]; j = qq_ind[beg_k]; /* get j-th column of A */ len = col(info, j, ind, val); /* find element a[i,j] = a~[beg[k],beg[k]] in j-th column */ for (t = 1; t <= len; t++) { if (ind[t] == i) break; } xassert(t <= len); /* compute LU-factorization of diagonal block A~[k,k], where * F = (1), V = (a[i,j]), P = Q = (1) (see the module LUF) */ #if 1 /* FIXME */ xassert(val[t] != 0.0); #endif btf->vr_piv[beg_k] = val[t]; btf->p1_ind[beg_k] = btf->p1_inv[beg_k] = 1; btf->q1_ind[beg_k] = btf->q1_inv[beg_k] = 1; /* remove element a[i,j] = a~[beg[k],beg[k]] from j-th column */ memmove(&ind[t], &ind[t+1], (len-t) * sizeof(int)); memmove(&val[t], &val[t+1], (len-t) * sizeof(double)); len--; /* and store resulting j-th column of A into BTF */ if (len > 0) { /* reserve locations for j-th column of A */ if (sva->r_ptr - sva->m_ptr < len) { sva_more_space(sva, len); sv_ind = sva->ind; sv_val = sva->val; } sva_reserve_cap(sva, ac_ref+(j-1), len); /* store j-th column of A (except elements of A~[k,k]) */ ptr = ac_ptr[j]; memcpy(&sv_ind[ptr], &ind[1], len * sizeof(int)); memcpy(&sv_val[ptr], &val[1], len * sizeof(double)); ac_len[j] = len; } return; } static int factorize_block(BTFINT *fi, int k, int (*col)(void *info, int j, int ind[], double val[]), void *info) { /* compute LU-factorization of diagonal block A~[k,k] and store * corresponding columns of matrix A except elements of A~[k,k] * (general case) */ SVA *sva = fi->sva; int *sv_ind = sva->ind; double *sv_val = sva->val; BTF *btf = fi->btf; int *pp_ind = btf->pp_ind; int *qq_ind = btf->qq_ind; int *beg = btf->beg; int ac_ref = btf->ac_ref; int *ac_ptr = &sva->ptr[ac_ref-1]; int *ac_len = &sva->len[ac_ref-1]; SGF *sgf = fi->sgf; int *ind = (int *)sgf->vr_max; /* working array */ double *val = sgf->work; /* working array */ LUF luf; int *vc_ptr, *vc_len, *vc_cap; int i, ii, j, jj, t, len, cnt, ptr, beg_k; /* construct fake LUF for LU-factorization of A~[k,k] */ sgf->luf = &luf; luf.n = beg[k+1] - (beg_k = beg[k]); luf.sva = sva; luf.fr_ref = btf->fr_ref + (beg_k-1); luf.fc_ref = btf->fc_ref + (beg_k-1); luf.vr_ref = btf->vr_ref + (beg_k-1); luf.vr_piv = btf->vr_piv + (beg_k-1); luf.vc_ref = btf->vc_ref + (beg_k-1); luf.pp_ind = btf->p1_ind + (beg_k-1); luf.pp_inv = btf->p1_inv + (beg_k-1); luf.qq_ind = btf->q1_ind + (beg_k-1); luf.qq_inv = btf->q1_inv + (beg_k-1); /* process columns of k-th block of matrix A~ */ vc_ptr = &sva->ptr[luf.vc_ref-1]; vc_len = &sva->len[luf.vc_ref-1]; vc_cap = &sva->cap[luf.vc_ref-1]; for (jj = 1; jj <= luf.n; jj++) { /* jj-th column of A~ = j-th column of A */ j = qq_ind[jj + (beg_k-1)]; /* get j-th column of A */ len = col(info, j, ind, val); /* move elements of diagonal block A~[k,k] to the beginning of * the column list */ cnt = 0; for (t = 1; t <= len; t++) { /* i = row index of element a[i,j] */ i = ind[t]; /* i-th row of A = ii-th row of A~ */ ii = pp_ind[i]; if (ii >= beg_k) { /* a~[ii,jj] = a[i,j] is in diagonal block A~[k,k] */ double temp; cnt++; ind[t] = ind[cnt]; ind[cnt] = ii - (beg_k-1); /* local index */ temp = val[t], val[t] = val[cnt], val[cnt] = temp; } } /* first cnt elements in the column list give jj-th column of * diagonal block A~[k,k], which is initial matrix V in LUF */ /* enlarge capacity of jj-th column of V = A~[k,k] */ if (vc_cap[jj] < cnt) { if (sva->r_ptr - sva->m_ptr < cnt) { sva_more_space(sva, cnt); sv_ind = sva->ind; sv_val = sva->val; } sva_enlarge_cap(sva, luf.vc_ref+(jj-1), cnt, 0); } /* store jj-th column of V = A~[k,k] */ ptr = vc_ptr[jj]; memcpy(&sv_ind[ptr], &ind[1], cnt * sizeof(int)); memcpy(&sv_val[ptr], &val[1], cnt * sizeof(double)); vc_len[jj] = cnt; /* other (len-cnt) elements in the column list are stored in * j-th column of the original matrix A */ len -= cnt; if (len > 0) { /* reserve locations for j-th column of A */ if (sva->r_ptr - sva->m_ptr < len) { sva_more_space(sva, len); sv_ind = sva->ind; sv_val = sva->val; } sva_reserve_cap(sva, ac_ref-1+j, len); /* store j-th column of A (except elements of A~[k,k]) */ ptr = ac_ptr[j]; memcpy(&sv_ind[ptr], &ind[cnt+1], len * sizeof(int)); memcpy(&sv_val[ptr], &val[cnt+1], len * sizeof(double)); ac_len[j] = len; } } /* compute LU-factorization of diagonal block A~[k,k]; may note * that A~[k,k] is irreducible (strongly connected), so singleton * phase will have no effect */ k = sgf_factorize(sgf, 0 /* disable singleton phase */); /* now left (dynamic) part of SVA should be empty (wichtig!) */ xassert(sva->m_ptr == 1); return k; } int btfint_factorize(BTFINT *fi, int n, int (*col)(void *info, int j, int ind[], double val[]), void *info) { /* compute BT-factorization of specified matrix A */ SVA *sva; BTF *btf; SGF *sgf; int k, rank; xassert(n > 0); fi->valid = 0; /* create sparse vector area (SVA), if necessary */ sva = fi->sva; if (sva == NULL) { int sva_n_max = fi->sva_n_max; int sva_size = fi->sva_size; if (sva_n_max == 0) sva_n_max = 6 * n; if (sva_size == 0) sva_size = 10 * n; sva = fi->sva = sva_create_area(sva_n_max, sva_size); } /* allocate/reallocate underlying objects, if necessary */ if (fi->n_max < n) { int n_max = fi->n_max; if (n_max == 0) n_max = fi->n_max = n + fi->delta_n0; else n_max = fi->n_max = n + fi->delta_n; xassert(n_max >= n); /* allocate/reallocate block triangular factorization (BTF) */ btf = fi->btf; if (btf == NULL) { btf = fi->btf = talloc(1, BTF); memset(btf, 0, sizeof(BTF)); btf->sva = sva; } else { tfree(btf->pp_ind); tfree(btf->pp_inv); tfree(btf->qq_ind); tfree(btf->qq_inv); tfree(btf->beg); tfree(btf->vr_piv); tfree(btf->p1_ind); tfree(btf->p1_inv); tfree(btf->q1_ind); tfree(btf->q1_inv); } btf->pp_ind = talloc(1+n_max, int); btf->pp_inv = talloc(1+n_max, int); btf->qq_ind = talloc(1+n_max, int); btf->qq_inv = talloc(1+n_max, int); btf->beg = talloc(1+n_max+1, int); btf->vr_piv = talloc(1+n_max, double); btf->p1_ind = talloc(1+n_max, int); btf->p1_inv = talloc(1+n_max, int); btf->q1_ind = talloc(1+n_max, int); btf->q1_inv = talloc(1+n_max, int); /* allocate/reallocate factorizer workspace (SGF) */ /* (note that for SGF we could use the size of largest block * rather than n_max) */ sgf = fi->sgf; sgf = fi->sgf; if (sgf == NULL) { sgf = fi->sgf = talloc(1, SGF); memset(sgf, 0, sizeof(SGF)); } else { tfree(sgf->rs_head); tfree(sgf->rs_prev); tfree(sgf->rs_next); tfree(sgf->cs_head); tfree(sgf->cs_prev); tfree(sgf->cs_next); tfree(sgf->vr_max); tfree(sgf->flag); tfree(sgf->work); } sgf->rs_head = talloc(1+n_max, int); sgf->rs_prev = talloc(1+n_max, int); sgf->rs_next = talloc(1+n_max, int); sgf->cs_head = talloc(1+n_max, int); sgf->cs_prev = talloc(1+n_max, int); sgf->cs_next = talloc(1+n_max, int); sgf->vr_max = talloc(1+n_max, double); sgf->flag = talloc(1+n_max, char); sgf->work = talloc(1+n_max, double); } btf = fi->btf; btf->n = n; sgf = fi->sgf; #if 1 /* FIXME */ /* initialize SVA */ sva->n = 0; sva->m_ptr = 1; sva->r_ptr = sva->size + 1; sva->head = sva->tail = 0; #endif /* store pattern of original matrix A in column-wise format */ btf->ac_ref = sva_alloc_vecs(btf->sva, btf->n); btf_store_a_cols(btf, col, info, btf->pp_ind, btf->vr_piv); #ifdef GLP_DEBUG sva_check_area(sva); #endif /* analyze pattern of original matrix A and determine permutation * matrices P and Q such that A = P * A~* Q, where A~ is an upper * block triangular matrix */ rank = btf_make_blocks(btf); if (rank != n) { /* original matrix A is structurally singular */ return 1; } #ifdef GLP_DEBUG btf_check_blocks(btf); #endif #if 1 /* FIXME */ /* initialize SVA */ sva->n = 0; sva->m_ptr = 1; sva->r_ptr = sva->size + 1; sva->head = sva->tail = 0; #endif /* allocate sparse vectors in SVA */ btf->ar_ref = sva_alloc_vecs(btf->sva, btf->n); btf->ac_ref = sva_alloc_vecs(btf->sva, btf->n); btf->fr_ref = sva_alloc_vecs(btf->sva, btf->n); btf->fc_ref = sva_alloc_vecs(btf->sva, btf->n); btf->vr_ref = sva_alloc_vecs(btf->sva, btf->n); btf->vc_ref = sva_alloc_vecs(btf->sva, btf->n); /* setup factorizer control parameters */ sgf->updat = 0; /* wichtig! */ sgf->piv_tol = fi->sgf_piv_tol; sgf->piv_lim = fi->sgf_piv_lim; sgf->suhl = fi->sgf_suhl; sgf->eps_tol = fi->sgf_eps_tol; /* compute LU-factorizations of diagonal blocks A~[k,k] and also * store corresponding columns of matrix A except elements of all * blocks A~[k,k] */ for (k = 1; k <= btf->num; k++) { if (btf->beg[k+1] - btf->beg[k] == 1) { /* trivial case (A~[k,k] has unity order) */ factorize_triv(fi, k, col, info); } else { /* general case */ if (factorize_block(fi, k, col, info) != 0) return 2; /* factorization of A~[k,k] failed */ } } #ifdef GLP_DEBUG sva_check_area(sva); #endif /* build row-wise representation of matrix A */ btf_build_a_rows(fi->btf, fi->sgf->rs_head); #ifdef GLP_DEBUG sva_check_area(sva); #endif /* BT-factorization has been successfully computed */ fi->valid = 1; return 0; } void btfint_delete(BTFINT *fi) { /* delete interface to BT-factorization */ SVA *sva = fi->sva; BTF *btf = fi->btf; SGF *sgf = fi->sgf; if (sva != NULL) sva_delete_area(sva); if (btf != NULL) { tfree(btf->pp_ind); tfree(btf->pp_inv); tfree(btf->qq_ind); tfree(btf->qq_inv); tfree(btf->beg); tfree(btf->vr_piv); tfree(btf->p1_ind); tfree(btf->p1_inv); tfree(btf->q1_ind); tfree(btf->q1_inv); tfree(btf); } if (sgf != NULL) { tfree(sgf->rs_head); tfree(sgf->rs_prev); tfree(sgf->rs_next); tfree(sgf->cs_head); tfree(sgf->cs_prev); tfree(sgf->cs_next); tfree(sgf->vr_max); tfree(sgf->flag); tfree(sgf->work); tfree(sgf); } tfree(fi); return; } /* eof */ glpk-5.0/src/bflib/btfint.h0000644000062000006210000000452513766346220015014 0ustar maomkpasswd/* btfint.h (interface to BT-factorization) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2013-2014 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef BTFINT_H #define BTFINT_H #include "btf.h" #include "sgf.h" typedef struct BTFINT BTFINT; struct BTFINT { /* interface to BT-factorization */ int n_max; /* maximal value of n (increased automatically) */ int valid; /* factorization is valid only if this flag is set */ SVA *sva; /* sparse vector area (SVA) */ BTF *btf; /* sparse block triangular LU-factorization */ SGF *sgf; /* sparse Gaussian factorizer workspace */ /*--------------------------------------------------------------*/ /* control parameters */ int sva_n_max, sva_size; /* parameters passed to sva_create_area */ int delta_n0, delta_n; /* if n_max = 0, set n_max = n + delta_n0 * if n_max < n, set n_max = n + delta_n */ double sgf_piv_tol; int sgf_piv_lim; int sgf_suhl; double sgf_eps_tol; /* factorizer control parameters */ }; #define btfint_create _glp_btfint_create BTFINT *btfint_create(void); /* create interface to BT-factorization */ #define btfint_factorize _glp_btfint_factorize int btfint_factorize(BTFINT *fi, int n, int (*col)(void *info, int j, int ind[], double val[]), void *info); /* compute BT-factorization of specified matrix A */ #define btfint_delete _glp_btfint_delete void btfint_delete(BTFINT *fi); /* delete interface to BT-factorization */ #endif /* eof */ glpk-5.0/src/bflib/fhv.c0000644000062000006210000005465213766346220014312 0ustar maomkpasswd/* fhv.c (sparse updatable FHV-factorization) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2012-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "fhv.h" /*********************************************************************** * fhv_ft_update - update FHV-factorization (Forrest-Tomlin) * * This routine updates FHV-factorization of the original matrix A * after replacing its j-th column by a new one. The routine is based * on the method proposed by Forrest and Tomlin [1]. * * The parameter q specifies the number of column of A, which has been * replaced, 1 <= q <= n, where n is the order of A. * * Row indices and numerical values of non-zero elements of the new * j-th column of A should be placed in locations aq_ind[1], ..., * aq_ind[aq_len] and aq_val[1], ..., aq_val[aq_len], respectively, * where aq_len is the number of non-zeros. Neither zero nor duplicate * elements are allowed. * * The working arrays ind, val, and work should have at least 1+n * elements (0-th elements are not used). * * RETURNS * * 0 The factorization has been successfully updated. * * 1 New matrix U = P'* V * Q' is upper triangular with zero diagonal * element u[s,s]. (Elimination was not performed.) * * 2 New matrix U = P'* V * Q' is upper triangular, and its diagonal * element u[s,s] or u[t,t] is too small in magnitude. (Elimination * was not performed.) * * 3 The same as 2, but after performing elimination. * * 4 The factorization has not been updated, because maximal number of * updates has been reached. * * 5 Accuracy test failed for the updated factorization. * * BACKGROUND * * The routine is based on the updating method proposed by Forrest and * Tomlin [1]. * * Let q-th column of the original matrix A have been replaced by new * column A[q]. Then, to keep the equality A = F * H * V, q-th column * of matrix V should be replaced by column V[q] = inv(F * H) * A[q]. * From the standpoint of matrix U = P'* V * Q' such replacement is * equivalent to replacement of s-th column of matrix U, where s is * determined from q by permutation matrix Q. Thus, matrix U loses its * upper triangular form and becomes the following: * * 1 s t n * 1 x x * x x x x x x * . x * x x x x x x * s . . * x x x x x x * . . * x x x x x x * . . * . x x x x x * . . * . . x x x x * t . . * . . . x x x * . . . . . . . x x * n . . . . . . . . x * * where t is largest row index of a non-zero element in s-th column. * * The routine makes matrix U upper triangular as follows. First, it * moves rows and columns s+1, ..., t by one position to the left and * upwards, resp., and moves s-th row and s-th column to position t. * Due to such symmetric permutations matrix U becomes the following * (note that all diagonal elements remain on the diagonal, and element * u[s,s] becomes u[t,t]): * * 1 s t n * 1 x x x x x x * x x * . x x x x x * x x * s . . x x x x * x x * . . . x x x * x x * . . . . x x * x x * . . . . . x * x x * t . . x x x x * x x * . . . . . . . x x * n . . . . . . . . x * * Then the routine performs gaussian elimination to eliminate * subdiagonal elements u[t,s], ..., u[t,t-1] using diagonal elements * u[s,s], ..., u[t-1,t-1] as pivots. During the elimination process * the routine permutes neither rows nor columns, so only t-th row is * changed. Should note that actually all operations are performed on * matrix V = P * U * Q, since matrix U is not stored. * * To keep the equality A = F * H * V, the routine appends new row-like * factor H[k] to matrix H, and every time it applies elementary * gaussian transformation to eliminate u[t,j'] = v[p,j] using pivot * u[j',j'] = v[i,j], it also adds new element f[p,j] = v[p,j] / v[i,j] * (gaussian multiplier) to factor H[k], which initially is a unity * matrix. At the end of elimination process the row-like factor H[k] * may look as follows: * * 1 n 1 s t n * 1 1 . . . . . . . . 1 1 . . . . . . . . * . 1 . . . . . . . . 1 . . . . . . . * . . 1 . . . . . . s . . 1 . . . . . . * p . x x 1 . x . x . . . . 1 . . . . . * . . . . 1 . . . . . . . . 1 . . . . * . . . . . 1 . . . . . . . . 1 . . . * . . . . . . 1 . . t . . x x x x 1 . . * . . . . . . . 1 . . . . . . . . 1 . * n . . . . . . . . 1 n . . . . . . . . 1 * * H[k] inv(P) * H[k] * P * * If, however, s = t, no elimination is needed, in which case no new * row-like factor is created. * * REFERENCES * * 1. J.J.H.Forrest and J.A.Tomlin, "Updated triangular factors of the * basis to maintain sparsity in the product form simplex method," * Math. Prog. 2 (1972), pp. 263-78. */ int fhv_ft_update(FHV *fhv, int q, int aq_len, const int aq_ind[], const double aq_val[], int ind[/*1+n*/], double val[/*1+n*/], double work[/*1+n*/]) { LUF *luf = fhv->luf; int n = luf->n; SVA *sva = luf->sva; int *sv_ind = sva->ind; double *sv_val = sva->val; int vr_ref = luf->vr_ref; int *vr_ptr = &sva->ptr[vr_ref-1]; int *vr_len = &sva->len[vr_ref-1]; int *vr_cap = &sva->cap[vr_ref-1]; double *vr_piv = luf->vr_piv; int vc_ref = luf->vc_ref; int *vc_ptr = &sva->ptr[vc_ref-1]; int *vc_len = &sva->len[vc_ref-1]; int *vc_cap = &sva->cap[vc_ref-1]; int *pp_ind = luf->pp_ind; int *pp_inv = luf->pp_inv; int *qq_ind = luf->qq_ind; int *qq_inv = luf->qq_inv; int *hh_ind = fhv->hh_ind; int hh_ref = fhv->hh_ref; int *hh_ptr = &sva->ptr[hh_ref-1]; int *hh_len = &sva->len[hh_ref-1]; #if 1 /* FIXME */ const double eps_tol = DBL_EPSILON; const double vpq_tol = 1e-5; const double err_tol = 1e-10; #endif int end, i, i_end, i_ptr, j, j_end, j_ptr, k, len, nnz, p, p_end, p_ptr, ptr, q_end, q_ptr, s, t; double f, vpq, temp; /*--------------------------------------------------------------*/ /* replace current q-th column of matrix V by new one */ /*--------------------------------------------------------------*/ xassert(1 <= q && q <= n); /* convert new q-th column of matrix A to dense format */ for (i = 1; i <= n; i++) val[i] = 0.0; xassert(0 <= aq_len && aq_len <= n); for (k = 1; k <= aq_len; k++) { i = aq_ind[k]; xassert(1 <= i && i <= n); xassert(val[i] == 0.0); xassert(aq_val[k] != 0.0); val[i] = aq_val[k]; } /* compute new q-th column of matrix V: * new V[q] = inv(F * H) * (new A[q]) */ luf->pp_ind = fhv->p0_ind; luf->pp_inv = fhv->p0_inv; luf_f_solve(luf, val); luf->pp_ind = pp_ind; luf->pp_inv = pp_inv; fhv_h_solve(fhv, val); /* q-th column of V = s-th column of U */ s = qq_inv[q]; /* determine row number of element v[p,q] that corresponds to * diagonal element u[s,s] */ p = pp_inv[s]; /* convert new q-th column of V to sparse format; * element v[p,q] = u[s,s] is not included in the element list * and stored separately */ vpq = 0.0; len = 0; for (i = 1; i <= n; i++) { temp = val[i]; #if 1 /* FIXME */ if (-eps_tol < temp && temp < +eps_tol) #endif /* nop */; else if (i == p) vpq = temp; else { ind[++len] = i; val[len] = temp; } } /* clear q-th column of matrix V */ for (q_end = (q_ptr = vc_ptr[q]) + vc_len[q]; q_ptr < q_end; q_ptr++) { /* get row index of v[i,q] */ i = sv_ind[q_ptr]; /* find and remove v[i,q] from i-th row */ for (i_end = (i_ptr = vr_ptr[i]) + vr_len[i]; sv_ind[i_ptr] != q; i_ptr++) /* nop */; xassert(i_ptr < i_end); sv_ind[i_ptr] = sv_ind[i_end-1]; sv_val[i_ptr] = sv_val[i_end-1]; vr_len[i]--; } /* now q-th column of matrix V is empty */ vc_len[q] = 0; /* put new q-th column of V (except element v[p,q] = u[s,s]) in * column-wise format */ if (len > 0) { if (vc_cap[q] < len) { if (sva->r_ptr - sva->m_ptr < len) { sva_more_space(sva, len); sv_ind = sva->ind; sv_val = sva->val; } sva_enlarge_cap(sva, vc_ref-1+q, len, 0); } ptr = vc_ptr[q]; memcpy(&sv_ind[ptr], &ind[1], len * sizeof(int)); memcpy(&sv_val[ptr], &val[1], len * sizeof(double)); vc_len[q] = len; } /* put new q-th column of V (except element v[p,q] = u[s,s]) in * row-wise format, and determine largest row number t such that * u[s,t] != 0 */ t = (vpq == 0.0 ? 0 : s); for (k = 1; k <= len; k++) { /* get row index of v[i,q] */ i = ind[k]; /* put v[i,q] to i-th row */ if (vr_cap[i] == vr_len[i]) { /* reserve extra locations in i-th row to reduce further * relocations of that row */ #if 1 /* FIXME */ int need = vr_len[i] + 5; #endif if (sva->r_ptr - sva->m_ptr < need) { sva_more_space(sva, need); sv_ind = sva->ind; sv_val = sva->val; } sva_enlarge_cap(sva, vr_ref-1+i, need, 0); } sv_ind[ptr = vr_ptr[i] + (vr_len[i]++)] = q; sv_val[ptr] = val[k]; /* v[i,q] is non-zero; increase t */ if (t < pp_ind[i]) t = pp_ind[i]; } /*--------------------------------------------------------------*/ /* check if matrix U is already upper triangular */ /*--------------------------------------------------------------*/ /* check if there is a spike in s-th column of matrix U, which * is q-th column of matrix V */ if (s >= t) { /* no spike; matrix U is already upper triangular */ /* store its diagonal element u[s,s] = v[p,q] */ vr_piv[p] = vpq; if (s > t) { /* matrix U is structurally singular, because its diagonal * element u[s,s] = v[p,q] is exact zero */ xassert(vpq == 0.0); return 1; } #if 1 /* FIXME */ else if (-vpq_tol < vpq && vpq < +vpq_tol) #endif { /* matrix U is not well conditioned, because its diagonal * element u[s,s] = v[p,q] is too small in magnitude */ return 2; } else { /* normal case */ return 0; } } /*--------------------------------------------------------------*/ /* perform implicit symmetric permutations of rows and columns */ /* of matrix U */ /*--------------------------------------------------------------*/ /* currently v[p,q] = u[s,s] */ xassert(p == pp_inv[s] && q == qq_ind[s]); for (k = s; k < t; k++) { pp_ind[pp_inv[k] = pp_inv[k+1]] = k; qq_inv[qq_ind[k] = qq_ind[k+1]] = k; } /* now v[p,q] = u[t,t] */ pp_ind[pp_inv[t] = p] = qq_inv[qq_ind[t] = q] = t; /*--------------------------------------------------------------*/ /* check if matrix U is already upper triangular */ /*--------------------------------------------------------------*/ /* check if there is a spike in t-th row of matrix U, which is * p-th row of matrix V */ for (p_end = (p_ptr = vr_ptr[p]) + vr_len[p]; p_ptr < p_end; p_ptr++) { if (qq_inv[sv_ind[p_ptr]] < t) break; /* spike detected */ } if (p_ptr == p_end) { /* no spike; matrix U is already upper triangular */ /* store its diagonal element u[t,t] = v[p,q] */ vr_piv[p] = vpq; #if 1 /* FIXME */ if (-vpq_tol < vpq && vpq < +vpq_tol) #endif { /* matrix U is not well conditioned, because its diagonal * element u[t,t] = v[p,q] is too small in magnitude */ return 2; } else { /* normal case */ return 0; } } /*--------------------------------------------------------------*/ /* copy p-th row of matrix V, which is t-th row of matrix U, to */ /* working array */ /*--------------------------------------------------------------*/ /* copy p-th row of matrix V, including element v[p,q] = u[t,t], * to the working array in dense format and remove these elements * from matrix V; since no pivoting is used, only this row will * change during elimination */ for (j = 1; j <= n; j++) work[j] = 0.0; work[q] = vpq; for (p_end = (p_ptr = vr_ptr[p]) + vr_len[p]; p_ptr < p_end; p_ptr++) { /* get column index of v[p,j] and store this element to the * working array */ work[j = sv_ind[p_ptr]] = sv_val[p_ptr]; /* find and remove v[p,j] from j-th column */ for (j_end = (j_ptr = vc_ptr[j]) + vc_len[j]; sv_ind[j_ptr] != p; j_ptr++) /* nop */; xassert(j_ptr < j_end); sv_ind[j_ptr] = sv_ind[j_end-1]; sv_val[j_ptr] = sv_val[j_end-1]; vc_len[j]--; } /* now p-th row of matrix V is temporarily empty */ vr_len[p] = 0; /*--------------------------------------------------------------*/ /* perform gaussian elimination */ /*--------------------------------------------------------------*/ /* transform p-th row of matrix V stored in working array, which * is t-th row of matrix U, to eliminate subdiagonal elements * u[t,s], ..., u[t,t-1]; corresponding gaussian multipliers will * form non-trivial row of new row-like factor */ nnz = 0; /* number of non-zero gaussian multipliers */ for (k = s; k < t; k++) { /* diagonal element u[k,k] = v[i,j] is used as pivot */ i = pp_inv[k], j = qq_ind[k]; /* take subdiagonal element u[t,k] = v[p,j] */ temp = work[j]; #if 1 /* FIXME */ if (-eps_tol < temp && temp < +eps_tol) continue; #endif /* compute and save gaussian multiplier: * f := u[t,k] / u[k,k] = v[p,j] / v[i,j] */ ind[++nnz] = i; val[nnz] = f = work[j] / vr_piv[i]; /* gaussian transformation to eliminate u[t,k] = v[p,j]: * (p-th row of V) := (p-th row of V) - f * (i-th row of V) */ for (i_end = (i_ptr = vr_ptr[i]) + vr_len[i]; i_ptr < i_end; i_ptr++) work[sv_ind[i_ptr]] -= f * sv_val[i_ptr]; } /* now matrix U is again upper triangular */ #if 1 /* FIXME */ if (-vpq_tol < work[q] && work[q] < +vpq_tol) #endif { /* however, its new diagonal element u[t,t] = v[p,q] is too * small in magnitude */ return 3; } /*--------------------------------------------------------------*/ /* create new row-like factor H[k] and add to eta file H */ /*--------------------------------------------------------------*/ /* (nnz = 0 means that all subdiagonal elements were too small * in magnitude) */ if (nnz > 0) { if (fhv->nfs == fhv->nfs_max) { /* maximal number of row-like factors has been reached */ return 4; } k = ++(fhv->nfs); hh_ind[k] = p; /* store non-trivial row of H[k] in right (dynamic) part of * SVA (diagonal unity element is not stored) */ if (sva->r_ptr - sva->m_ptr < nnz) { sva_more_space(sva, nnz); sv_ind = sva->ind; sv_val = sva->val; } sva_reserve_cap(sva, fhv->hh_ref-1+k, nnz); ptr = hh_ptr[k]; memcpy(&sv_ind[ptr], &ind[1], nnz * sizeof(int)); memcpy(&sv_val[ptr], &val[1], nnz * sizeof(double)); hh_len[k] = nnz; } /*--------------------------------------------------------------*/ /* copy transformed p-th row of matrix V, which is t-th row of */ /* matrix U, from working array back to matrix V */ /*--------------------------------------------------------------*/ /* copy elements of transformed p-th row of matrix V, which are * non-diagonal elements u[t,t+1], ..., u[t,n] of matrix U, from * working array to corresponding columns of matrix V (note that * diagonal element u[t,t] = v[p,q] not copied); also transform * p-th row of matrix V to sparse format */ len = 0; for (k = t+1; k <= n; k++) { /* j-th column of V = k-th column of U */ j = qq_ind[k]; /* take non-diagonal element v[p,j] = u[t,k] */ temp = work[j]; #if 1 /* FIXME */ if (-eps_tol < temp && temp < +eps_tol) continue; #endif /* add v[p,j] to j-th column of matrix V */ if (vc_cap[j] == vc_len[j]) { /* reserve extra locations in j-th column to reduce further * relocations of that column */ #if 1 /* FIXME */ int need = vc_len[j] + 5; #endif if (sva->r_ptr - sva->m_ptr < need) { sva_more_space(sva, need); sv_ind = sva->ind; sv_val = sva->val; } sva_enlarge_cap(sva, vc_ref-1+j, need, 0); } sv_ind[ptr = vc_ptr[j] + (vc_len[j]++)] = p; sv_val[ptr] = temp; /* store element v[p,j] = u[t,k] to working sparse vector */ ind[++len] = j; val[len] = temp; } /* copy elements from working sparse vector to p-th row of matrix * V (this row is currently empty) */ if (vr_cap[p] < len) { if (sva->r_ptr - sva->m_ptr < len) { sva_more_space(sva, len); sv_ind = sva->ind; sv_val = sva->val; } sva_enlarge_cap(sva, vr_ref-1+p, len, 0); } ptr = vr_ptr[p]; memcpy(&sv_ind[ptr], &ind[1], len * sizeof(int)); memcpy(&sv_val[ptr], &val[1], len * sizeof(double)); vr_len[p] = len; /* store new diagonal element u[t,t] = v[p,q] */ vr_piv[p] = work[q]; /*--------------------------------------------------------------*/ /* perform accuracy test (only if new H[k] was added) */ /*--------------------------------------------------------------*/ if (nnz > 0) { /* copy p-th (non-trivial) row of row-like factor H[k] (except * unity diagonal element) to working array in dense format */ for (j = 1; j <= n; j++) work[j] = 0.0; k = fhv->nfs; for (end = (ptr = hh_ptr[k]) + hh_len[k]; ptr < end; ptr++) work[sv_ind[ptr]] = sv_val[ptr]; /* compute inner product of p-th (non-trivial) row of matrix * H[k] and q-th column of matrix V */ temp = vr_piv[p]; /* 1 * v[p,q] */ ptr = vc_ptr[q]; end = ptr + vc_len[q]; for (; ptr < end; ptr++) temp += work[sv_ind[ptr]] * sv_val[ptr]; /* inner product should be equal to element v[p,q] *before* * matrix V was transformed */ /* compute relative error */ temp = fabs(vpq - temp) / (1.0 + fabs(vpq)); #if 1 /* FIXME */ if (temp > err_tol) #endif { /* relative error is too large */ return 5; } } /* factorization has been successfully updated */ return 0; } /*********************************************************************** * fhv_h_solve - solve system H * x = b * * This routine solves the system H * x = b, where the matrix H is the * middle factor of the sparse updatable FHV-factorization. * * On entry the array x should contain elements of the right-hand side * vector b in locations x[1], ..., x[n], where n is the order of the * matrix H. On exit this array will contain elements of the solution * vector x in the same locations. */ void fhv_h_solve(FHV *fhv, double x[/*1+n*/]) { SVA *sva = fhv->luf->sva; int *sv_ind = sva->ind; double *sv_val = sva->val; int nfs = fhv->nfs; int *hh_ind = fhv->hh_ind; int hh_ref = fhv->hh_ref; int *hh_ptr = &sva->ptr[hh_ref-1]; int *hh_len = &sva->len[hh_ref-1]; int i, k, end, ptr; double x_i; for (k = 1; k <= nfs; k++) { x_i = x[i = hh_ind[k]]; for (end = (ptr = hh_ptr[k]) + hh_len[k]; ptr < end; ptr++) x_i -= sv_val[ptr] * x[sv_ind[ptr]]; x[i] = x_i; } return; } /*********************************************************************** * fhv_ht_solve - solve system H' * x = b * * This routine solves the system H' * x = b, where H' is a matrix * transposed to the matrix H, which is the middle factor of the sparse * updatable FHV-factorization. * * On entry the array x should contain elements of the right-hand side * vector b in locations x[1], ..., x[n], where n is the order of the * matrix H. On exit this array will contain elements of the solution * vector x in the same locations. */ void fhv_ht_solve(FHV *fhv, double x[/*1+n*/]) { SVA *sva = fhv->luf->sva; int *sv_ind = sva->ind; double *sv_val = sva->val; int nfs = fhv->nfs; int *hh_ind = fhv->hh_ind; int hh_ref = fhv->hh_ref; int *hh_ptr = &sva->ptr[hh_ref-1]; int *hh_len = &sva->len[hh_ref-1]; int k, end, ptr; double x_j; for (k = nfs; k >= 1; k--) { if ((x_j = x[hh_ind[k]]) == 0.0) continue; for (end = (ptr = hh_ptr[k]) + hh_len[k]; ptr < end; ptr++) x[sv_ind[ptr]] -= sv_val[ptr] * x_j; } return; } /* eof */ glpk-5.0/src/bflib/fhv.h0000644000062000006210000001026013766346220014302 0ustar maomkpasswd/* fhv.h (sparse updatable FHV-factorization) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2012-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef FHV_H #define FHV_H #include "luf.h" /*********************************************************************** * The structure FHV describes sparse updatable FHV-factorization. * * The FHV-factorization has the following format: * * A = F * H * V, (1) * * F = P0 * L * P0', (2) * * H = H[1] * H[2] * ... * H[nfs], (3) * * V = P * U * Q, (4) * * where: A is a given (unsymmetric) square matrix; F, H, V are matrix * factors actually computed; L is a lower triangular matrix with unity * diagonal; U is an upper tringular matrix; H[k], k = 1, 2, ..., nfs, * is a row-like factor, which differs from unity matrix only in one * row called a non-trivial row; P0, P, Q are permutation matrices; and * P0' is a matrix transposed to P0. * * Matrices F, V, P, Q are stored in the underlying LUF object. * * Non-trivial rows of factors H[k] are stored as sparse vectors in the * right (static) part of the sparse vector area (SVA). Note that unity * diagonal elements of non-trivial rows are not stored. * * Matrix P0 is stored in the same way as matrix P. * * Matrices L and U are completely defined by matrices F, V, P, and Q, * and therefore not stored explicitly. */ typedef struct FHV FHV; struct FHV { /* FHV-factorization */ LUF *luf; /* LU-factorization (contains matrices F, V, P, Q) */ /*--------------------------------------------------------------*/ /* matrix H in the form of eta file */ int nfs_max; /* maximal number of row-like factors (this limits the number of * updates of the factorization) */ int nfs; /* current number of row-like factors, 0 <= nfs <= nfs_max */ int *hh_ind; /* int hh_ind[1+nfs_max]; */ /* hh_ind[0] is not used; * hh_ind[k], 1 <= k <= nfs, is number of non-trivial row of * factor H[k] */ int hh_ref; /* reference number of sparse vector in SVA, which is non-trivial * row of factor H[1] */ #if 0 + 0 int *hh_ptr = &sva->ptr[hh_ref-1]; /* hh_ptr[0] is not used; * hh_ptr[k], 1 <= k <= nfs, is pointer to non-trivial row of * factor H[k] */ int *hh_len = &sva->len[hh_ref-1]; /* hh_len[0] is not used; * hh_len[k], 1 <= k <= nfs, is number of non-zero elements in * non-trivial row of factor H[k] */ #endif /*--------------------------------------------------------------*/ /* matrix P0 */ int *p0_ind; /* int p0_ind[1+n]; */ /* p0_ind[i] = j means that P0[i,j] = 1 */ int *p0_inv; /* int p0_inv[1+n]; */ /* p0_inv[j] = i means that P0[i,j] = 1 */ }; #define fhv_ft_update _glp_fhv_ft_update int fhv_ft_update(FHV *fhv, int q, int aq_len, const int aq_ind[], const double aq_val[], int ind[/*1+n*/], double val[/*1+n*/], double work[/*1+n*/]); /* update FHV-factorization (Forrest-Tomlin) */ #define fhv_h_solve _glp_fhv_h_solve void fhv_h_solve(FHV *fhv, double x[/*1+n*/]); /* solve system H * x = b */ #define fhv_ht_solve _glp_fhv_ht_solve void fhv_ht_solve(FHV *fhv, double x[/*1+n*/]); /* solve system H' * x = b */ #endif /* eof */ glpk-5.0/src/bflib/fhvint.c0000644000062000006210000001232313766346220015012 0ustar maomkpasswd/* fhvint.c (interface to FHV-factorization) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2012-2014 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "fhvint.h" FHVINT *fhvint_create(void) { /* create interface to FHV-factorization */ FHVINT *fi; fi = talloc(1, FHVINT); memset(fi, 0, sizeof(FHVINT)); fi->lufi = lufint_create(); return fi; } int fhvint_factorize(FHVINT *fi, int n, int (*col)(void *info, int j, int ind[], double val[]), void *info) { /* compute FHV-factorization of specified matrix A */ int nfs_max, old_n_max, n_max, k, ret; xassert(n > 0); fi->valid = 0; /* get required value of nfs_max */ nfs_max = fi->nfs_max; if (nfs_max == 0) nfs_max = 100; xassert(nfs_max > 0); /* compute factorization of specified matrix A */ old_n_max = fi->lufi->n_max; fi->lufi->sva_n_max = 4 * n + nfs_max; fi->lufi->sgf_updat = 1; ret = lufint_factorize(fi->lufi, n, col, info); n_max = fi->lufi->n_max; /* allocate/reallocate arrays, if necessary */ if (fi->fhv.nfs_max != nfs_max) { if (fi->fhv.hh_ind != NULL) tfree(fi->fhv.hh_ind); fi->fhv.hh_ind = talloc(1+nfs_max, int); } if (old_n_max < n_max) { if (fi->fhv.p0_ind != NULL) tfree(fi->fhv.p0_ind); if (fi->fhv.p0_inv != NULL) tfree(fi->fhv.p0_inv); fi->fhv.p0_ind = talloc(1+n_max, int); fi->fhv.p0_inv = talloc(1+n_max, int); } /* initialize FHV-factorization */ fi->fhv.luf = fi->lufi->luf; fi->fhv.nfs_max = nfs_max; /* H := I */ fi->fhv.nfs = 0; fi->fhv.hh_ref = sva_alloc_vecs(fi->lufi->sva, nfs_max); /* P0 := P */ for (k = 1; k <= n; k++) { fi->fhv.p0_ind[k] = fi->fhv.luf->pp_ind[k]; fi->fhv.p0_inv[k] = fi->fhv.luf->pp_inv[k]; } /* set validation flag */ if (ret == 0) fi->valid = 1; return ret; } int fhvint_update(FHVINT *fi, int j, int len, const int ind[], const double val[]) { /* update FHV-factorization after replacing j-th column of A */ SGF *sgf = fi->lufi->sgf; int *ind1 = sgf->rs_next; double *val1 = sgf->vr_max; double *work = sgf->work; int ret; xassert(fi->valid); ret = fhv_ft_update(&fi->fhv, j, len, ind, val, ind1, val1, work); if (ret != 0) fi->valid = 0; return ret; } void fhvint_ftran(FHVINT *fi, double x[]) { /* solve system A * x = b */ FHV *fhv = &fi->fhv; LUF *luf = fhv->luf; int n = luf->n; int *pp_ind = luf->pp_ind; int *pp_inv = luf->pp_inv; SGF *sgf = fi->lufi->sgf; double *work = sgf->work; xassert(fi->valid); /* A = F * H * V */ /* x = inv(A) * b = inv(V) * inv(H) * inv(F) * b */ luf->pp_ind = fhv->p0_ind; luf->pp_inv = fhv->p0_inv; luf_f_solve(luf, x); luf->pp_ind = pp_ind; luf->pp_inv = pp_inv; fhv_h_solve(fhv, x); luf_v_solve(luf, x, work); memcpy(&x[1], &work[1], n * sizeof(double)); return; } void fhvint_btran(FHVINT *fi, double x[]) { /* solve system A'* x = b */ FHV *fhv = &fi->fhv; LUF *luf = fhv->luf; int n = luf->n; int *pp_ind = luf->pp_ind; int *pp_inv = luf->pp_inv; SGF *sgf = fi->lufi->sgf; double *work = sgf->work; xassert(fi->valid); /* A' = (F * H * V)' = V'* H'* F' */ /* x = inv(A') * b = inv(F') * inv(H') * inv(V') * b */ luf_vt_solve(luf, x, work); fhv_ht_solve(fhv, work); luf->pp_ind = fhv->p0_ind; luf->pp_inv = fhv->p0_inv; luf_ft_solve(luf, work); luf->pp_ind = pp_ind; luf->pp_inv = pp_inv; memcpy(&x[1], &work[1], n * sizeof(double)); return; } double fhvint_estimate(FHVINT *fi) { /* estimate 1-norm of inv(A) */ double norm; xassert(fi->valid); xassert(fi->fhv.nfs == 0); norm = luf_estimate_norm(fi->fhv.luf, fi->lufi->sgf->vr_max, fi->lufi->sgf->work); return norm; } void fhvint_delete(FHVINT *fi) { /* delete interface to FHV-factorization */ lufint_delete(fi->lufi); if (fi->fhv.hh_ind != NULL) tfree(fi->fhv.hh_ind); if (fi->fhv.p0_ind != NULL) tfree(fi->fhv.p0_ind); if (fi->fhv.p0_inv != NULL) tfree(fi->fhv.p0_inv); tfree(fi); return; } /* eof */ glpk-5.0/src/bflib/fhvint.h0000644000062000006210000000472713766346220015030 0ustar maomkpasswd/* fhvint.h (interface to FHV-factorization) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2012-2014 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef FHVINT_H #define FHVINT_H #include "fhv.h" #include "lufint.h" typedef struct FHVINT FHVINT; struct FHVINT { /* interface to FHV-factorization */ int valid; /* factorization is valid only if this flag is set */ FHV fhv; /* FHV-factorization */ LUFINT *lufi; /* interface to underlying LU-factorization */ /*--------------------------------------------------------------*/ /* control parameters */ int nfs_max; /* required maximal number of row-like factors */ }; #define fhvint_create _glp_fhvint_create FHVINT *fhvint_create(void); /* create interface to FHV-factorization */ #define fhvint_factorize _glp_fhvint_factorize int fhvint_factorize(FHVINT *fi, int n, int (*col)(void *info, int j, int ind[], double val[]), void *info); /* compute FHV-factorization of specified matrix A */ #define fhvint_update _glp_fhvint_update int fhvint_update(FHVINT *fi, int j, int len, const int ind[], const double val[]); /* update FHV-factorization after replacing j-th column of A */ #define fhvint_ftran _glp_fhvint_ftran void fhvint_ftran(FHVINT *fi, double x[]); /* solve system A * x = b */ #define fhvint_btran _glp_fhvint_btran void fhvint_btran(FHVINT *fi, double x[]); /* solve system A'* x = b */ #define fhvint_estimate _glp_fhvint_estimate double fhvint_estimate(FHVINT *fi); /* estimate 1-norm of inv(A) */ #define fhvint_delete _glp_fhvint_delete void fhvint_delete(FHVINT *fi); /* delete interface to FHV-factorization */ #endif /* eof */ glpk-5.0/src/bflib/ifu.c0000644000062000006210000003035313766346220014302 0ustar maomkpasswd/* ifu.c (dense updatable IFU-factorization) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2012-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "ifu.h" /*********************************************************************** * ifu_expand - expand IFU-factorization * * This routine expands the IFU-factorization of the matrix A according * to the following expansion of A: * * ( A c ) * new A = ( ) * ( r' d ) * * where c[1,...,n] is a new column, r[1,...,n] is a new row, and d is * a new diagonal element. * * From the main equality F * A = U it follows that: * * ( F 0 ) ( A c ) ( FA Fc ) ( U Fc ) * ( ) ( ) = ( ) = ( ), * ( 0 1 ) ( r' d ) ( r' d ) ( r' d ) * * thus, * * ( F 0 ) ( U Fc ) * new F = ( ), new U = ( ). * ( 0 1 ) ( r' d ) * * Note that the resulting matrix U loses its upper triangular form due * to row spike r', which should be eliminated. */ void ifu_expand(IFU *ifu, double c[/*1+n*/], double r[/*1+n*/], double d) { /* non-optimized version */ int n_max = ifu->n_max; int n = ifu->n; double *f_ = ifu->f; double *u_ = ifu->u; int i, j; double t; # define f(i,j) f_[(i)*n_max+(j)] # define u(i,j) u_[(i)*n_max+(j)] xassert(0 <= n && n < n_max); /* adjust indexing */ c++, r++; /* set new zero column of matrix F */ for (i = 0; i < n; i++) f(i,n) = 0.0; /* set new zero row of matrix F */ for (j = 0; j < n; j++) f(n,j) = 0.0; /* set new unity diagonal element of matrix F */ f(n,n) = 1.0; /* set new column of matrix U to vector (old F) * c */ for (i = 0; i < n; i++) { /* u[i,n] := (i-th row of old F) * c */ t = 0.0; for (j = 0; j < n; j++) t += f(i,j) * c[j]; u(i,n) = t; } /* set new row of matrix U to vector r */ for (j = 0; j < n; j++) u(n,j) = r[j]; /* set new diagonal element of matrix U to scalar d */ u(n,n) = d; /* increase factorization order */ ifu->n++; # undef f # undef u return; } /*********************************************************************** * ifu_bg_update - update IFU-factorization (Bartels-Golub) * * This routine updates IFU-factorization of the matrix A according to * its expansion (see comments to the routine ifu_expand). The routine * is based on the method proposed by Bartels and Golub [1]. * * RETURNS * * 0 The factorization has been successfully updated. * * 1 On some elimination step diagional element u[k,k] to be used as * pivot is too small in magnitude. * * 2 Diagonal element u[n,n] is too small in magnitude (at the end of * update). * * REFERENCES * * 1. R.H.Bartels, G.H.Golub, "The Simplex Method of Linear Programming * Using LU-decomposition", Comm. ACM, 12, pp. 266-68, 1969. */ int ifu_bg_update(IFU *ifu, double c[/*1+n*/], double r[/*1+n*/], double d) { /* non-optimized version */ int n_max = ifu->n_max; int n = ifu->n; double *f_ = ifu->f; double *u_ = ifu->u; #if 1 /* FIXME */ double tol = 1e-5; #endif int j, k; double t; # define f(i,j) f_[(i)*n_max+(j)] # define u(i,j) u_[(i)*n_max+(j)] /* expand factorization */ ifu_expand(ifu, c, r, d); /* NOTE: n keeps its old value */ /* eliminate spike (non-zero subdiagonal elements) in last row of * matrix U */ for (k = 0; k < n; k++) { /* if |u[k,k]| < |u[n,k]|, interchange k-th and n-th rows to * provide |u[k,k]| >= |u[n,k]| for numeric stability */ if (fabs(u(k,k)) < fabs(u(n,k))) { /* interchange k-th and n-th rows of matrix U */ for (j = k; j <= n; j++) t = u(k,j), u(k,j) = u(n,j), u(n,j) = t; /* interchange k-th and n-th rows of matrix F to keep the * main equality F * A = U */ for (j = 0; j <= n; j++) t = f(k,j), f(k,j) = f(n,j), f(n,j) = t; } /* now |u[k,k]| >= |u[n,k]| */ /* check if diagonal element u[k,k] can be used as pivot */ if (fabs(u(k,k)) < tol) { /* u[k,k] is too small in magnitude */ return 1; } /* if u[n,k] = 0, elimination is not needed */ if (u(n,k) == 0.0) continue; /* compute gaussian multiplier t = u[n,k] / u[k,k] */ t = u(n,k) / u(k,k); /* apply gaussian transformation to eliminate u[n,k] */ /* (n-th row of U) := (n-th row of U) - t * (k-th row of U) */ for (j = k+1; j <= n; j++) u(n,j) -= t * u(k,j); /* apply the same transformation to matrix F to keep the main * equality F * A = U */ for (j = 0; j <= n; j++) f(n,j) -= t * f(k,j); } /* now matrix U is upper triangular */ if (fabs(u(n,n)) < tol) { /* u[n,n] is too small in magnitude */ return 2; } # undef f # undef u return 0; } /*********************************************************************** * The routine givens computes the parameters of Givens plane rotation * c = cos(teta) and s = sin(teta) such that: * * ( c -s ) ( a ) ( r ) * ( ) ( ) = ( ) , * ( s c ) ( b ) ( 0 ) * * where a and b are given scalars. * * REFERENCES * * G.H.Golub, C.F.Van Loan, "Matrix Computations", 2nd ed. */ static void givens(double a, double b, double *c, double *s) { /* non-optimized version */ double t; if (b == 0.0) (*c) = 1.0, (*s) = 0.0; else if (fabs(a) <= fabs(b)) t = - a / b, (*s) = 1.0 / sqrt(1.0 + t * t), (*c) = (*s) * t; else t = - b / a, (*c) = 1.0 / sqrt(1.0 + t * t), (*s) = (*c) * t; return; } /*********************************************************************** * ifu_gr_update - update IFU-factorization (Givens rotations) * * This routine updates IFU-factorization of the matrix A according to * its expansion (see comments to the routine ifu_expand). The routine * is based on Givens plane rotations [1]. * * RETURNS * * 0 The factorization has been successfully updated. * * 1 On some elimination step both elements u[k,k] and u[n,k] are too * small in magnitude. * * 2 Diagonal element u[n,n] is too small in magnitude (at the end of * update). * * REFERENCES * * 1. G.H.Golub, C.F.Van Loan, "Matrix Computations", 2nd ed. */ int ifu_gr_update(IFU *ifu, double c[/*1+n*/], double r[/*1+n*/], double d) { /* non-optimized version */ int n_max = ifu->n_max; int n = ifu->n; double *f_ = ifu->f; double *u_ = ifu->u; #if 1 /* FIXME */ double tol = 1e-5; #endif int j, k; double cs, sn; # define f(i,j) f_[(i)*n_max+(j)] # define u(i,j) u_[(i)*n_max+(j)] /* expand factorization */ ifu_expand(ifu, c, r, d); /* NOTE: n keeps its old value */ /* eliminate spike (non-zero subdiagonal elements) in last row of * matrix U */ for (k = 0; k < n; k++) { /* check if elements u[k,k] and u[n,k] are eligible */ if (fabs(u(k,k)) < tol && fabs(u(n,k)) < tol) { /* both u[k,k] and u[n,k] are too small in magnitude */ return 1; } /* if u[n,k] = 0, elimination is not needed */ if (u(n,k) == 0.0) continue; /* compute parameters of Givens plane rotation */ givens(u(k,k), u(n,k), &cs, &sn); /* apply Givens rotation to k-th and n-th rows of matrix U to * eliminate u[n,k] */ for (j = k; j <= n; j++) { double ukj = u(k,j), unj = u(n,j); u(k,j) = cs * ukj - sn * unj; u(n,j) = sn * ukj + cs * unj; } /* apply the same transformation to matrix F to keep the main * equality F * A = U */ for (j = 0; j <= n; j++) { double fkj = f(k,j), fnj = f(n,j); f(k,j) = cs * fkj - sn * fnj; f(n,j) = sn * fkj + cs * fnj; } } /* now matrix U is upper triangular */ if (fabs(u(n,n)) < tol) { /* u[n,n] is too small in magnitude */ return 2; } # undef f # undef u return 0; } /*********************************************************************** * ifu_a_solve - solve system A * x = b * * This routine solves the system A * x = b, where the matrix A is * specified by its IFU-factorization. * * Using the main equality F * A = U we have: * * A * x = b => F * A * x = F * b => U * x = F * b => * * x = inv(U) * F * b. * * On entry the array x should contain elements of the right-hand side * vector b in locations x[1], ..., x[n], where n is the order of the * matrix A. On exit this array will contain elements of the solution * vector x in the same locations. * * The working array w should have at least 1+n elements (0-th element * is not used). */ void ifu_a_solve(IFU *ifu, double x[/*1+n*/], double w[/*1+n*/]) { /* non-optimized version */ int n_max = ifu->n_max; int n = ifu->n; double *f_ = ifu->f; double *u_ = ifu->u; int i, j; double t; # define f(i,j) f_[(i)*n_max+(j)] # define u(i,j) u_[(i)*n_max+(j)] xassert(0 <= n && n <= n_max); /* adjust indexing */ x++, w++; /* y := F * b */ memcpy(w, x, n * sizeof(double)); for (i = 0; i < n; i++) { /* y[i] := (i-th row of F) * b */ t = 0.0; for (j = 0; j < n; j++) t += f(i,j) * w[j]; x[i] = t; } /* x := inv(U) * y */ for (i = n-1; i >= 0; i--) { t = x[i]; for (j = i+1; j < n; j++) t -= u(i,j) * x[j]; x[i] = t / u(i,i); } # undef f # undef u return; } /*********************************************************************** * ifu_at_solve - solve system A'* x = b * * This routine solves the system A'* x = b, where A' is a matrix * transposed to the matrix A, specified by its IFU-factorization. * * Using the main equality F * A = U, from which it follows that * A'* F' = U', we have: * * A'* x = b => A'* F'* inv(F') * x = b => * * U'* inv(F') * x = b => inv(F') * x = inv(U') * b => * * x = F' * inv(U') * b. * * On entry the array x should contain elements of the right-hand side * vector b in locations x[1], ..., x[n], where n is the order of the * matrix A. On exit this array will contain elements of the solution * vector x in the same locations. * * The working array w should have at least 1+n elements (0-th element * is not used). */ void ifu_at_solve(IFU *ifu, double x[/*1+n*/], double w[/*1+n*/]) { /* non-optimized version */ int n_max = ifu->n_max; int n = ifu->n; double *f_ = ifu->f; double *u_ = ifu->u; int i, j; double t; # define f(i,j) f_[(i)*n_max+(j)] # define u(i,j) u_[(i)*n_max+(j)] xassert(0 <= n && n <= n_max); /* adjust indexing */ x++, w++; /* y := inv(U') * b */ for (i = 0; i < n; i++) { t = (x[i] /= u(i,i)); for (j = i+1; j < n; j++) x[j] -= u(i,j) * t; } /* x := F'* y */ for (j = 0; j < n; j++) { /* x[j] := (j-th column of F) * y */ t = 0.0; for (i = 0; i < n; i++) t += f(i,j) * x[i]; w[j] = t; } memcpy(x, w, n * sizeof(double)); # undef f # undef u return; } /* eof */ glpk-5.0/src/bflib/ifu.h0000644000062000006210000000704513766346220014311 0ustar maomkpasswd/* ifu.h (dense updatable IFU-factorization) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2012-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef IFU_H #define IFU_H /*********************************************************************** * The structure IFU describes dense updatable IFU-factorization. * * The IFU-factorization has the following format: * * A = inv(F) * U, (1) * * where A is a given (unsymmetric) nxn square matrix, F is a square * matrix, U is an upper triangular matrix. Obviously, the equality (1) * is equivalent to the following equality: * * F * A = U. (2) * * It is assumed that matrix A is small and dense, so matrices F and U * are stored by rows in dense format as follows: * * 1 n n_max 1 n n_max * 1 * * * * * * x x x x 1 * * * * * * x x x x * * * * * * * x x x x ? * * * * * x x x x * * * * * * * x x x x ? ? * * * * x x x x * * * * * * * x x x x ? ? ? * * * x x x x * * * * * * * x x x x ? ? ? ? * * x x x x * n * * * * * * x x x x n ? ? ? ? ? * x x x x * x x x x x x x x x x x x x x x x x x x x * x x x x x x x x x x x x x x x x x x x x * x x x x x x x x x x x x x x x x x x x x * n_max x x x x x x x x x x n_max x x x x x x x x x x * * matrix F matrix U * * where '*' are matrix elements, '?' are unused locations, 'x' are * reserved locations. */ typedef struct IFU IFU; struct IFU { /* IFU-factorization */ int n_max; /* maximal order of matrices A, F, U; n_max >= 1 */ int n; /* current order of matrices A, F, U; 0 <= n <= n_max */ double *f; /* double f[n_max*n_max]; */ /* matrix F stored by rows */ double *u; /* double u[n_max*n_max]; */ /* matrix U stored by rows */ }; #define ifu_expand _glp_ifu_expand void ifu_expand(IFU *ifu, double c[/*1+n*/], double r[/*1+n*/], double d); /* expand IFU-factorization */ #define ifu_bg_update _glp_ifu_bg_update int ifu_bg_update(IFU *ifu, double c[/*1+n*/], double r[/*1+n*/], double d); /* update IFU-factorization (Bartels-Golub) */ #define ifu_gr_update _glp_ifu_gr_update int ifu_gr_update(IFU *ifu, double c[/*1+n*/], double r[/*1+n*/], double d); /* update IFU-factorization (Givens rotations) */ #define ifu_a_solve _glp_ifu_a_solve void ifu_a_solve(IFU *ifu, double x[/*1+n*/], double w[/*1+n*/]); /* solve system A * x = b */ #define ifu_at_solve _glp_ifu_at_solve void ifu_at_solve(IFU *ifu, double x[/*1+n*/], double w[/*1+n*/]); /* solve system A'* x = b */ #endif /* eof */ glpk-5.0/src/bflib/luf.c0000644000062000006210000006070413766346220014310 0ustar maomkpasswd/* luf.c (sparse LU-factorization) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2012-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "luf.h" /*********************************************************************** * luf_store_v_cols - store matrix V = A in column-wise format * * This routine stores matrix V = A in column-wise format, where A is * the original matrix to be factorized. * * On exit the routine returns the number of non-zeros in matrix V. */ int luf_store_v_cols(LUF *luf, int (*col)(void *info, int j, int ind[], double val[]), void *info, int ind[], double val[]) { int n = luf->n; SVA *sva = luf->sva; int *sv_ind = sva->ind; double *sv_val = sva->val; int vc_ref = luf->vc_ref; int *vc_ptr = &sva->ptr[vc_ref-1]; int *vc_len = &sva->len[vc_ref-1]; int *vc_cap = &sva->cap[vc_ref-1]; int j, len, ptr, nnz; nnz = 0; for (j = 1; j <= n; j++) { /* get j-th column */ len = col(info, j, ind, val); xassert(0 <= len && len <= n); /* enlarge j-th column capacity */ if (vc_cap[j] < len) { if (sva->r_ptr - sva->m_ptr < len) { sva_more_space(sva, len); sv_ind = sva->ind; sv_val = sva->val; } sva_enlarge_cap(sva, vc_ref-1+j, len, 0); } /* store j-th column */ ptr = vc_ptr[j]; memcpy(&sv_ind[ptr], &ind[1], len * sizeof(int)); memcpy(&sv_val[ptr], &val[1], len * sizeof(double)); vc_len[j] = len; nnz += len; } return nnz; } /*********************************************************************** * luf_check_all - check LU-factorization before k-th elimination step * * This routine checks that before performing k-th elimination step, * 1 <= k <= n+1, all components of the LU-factorization are correct. * * In case of k = n+1, i.e. after last elimination step, it is assumed * that rows of F and columns of V are *not* built yet. * * NOTE: For testing/debugging only. */ void luf_check_all(LUF *luf, int k) { int n = luf->n; SVA *sva = luf->sva; int *sv_ind = sva->ind; double *sv_val = sva->val; int fr_ref = luf->fr_ref; int *fr_len = &sva->len[fr_ref-1]; int fc_ref = luf->fc_ref; int *fc_ptr = &sva->ptr[fc_ref-1]; int *fc_len = &sva->len[fc_ref-1]; int vr_ref = luf->vr_ref; int *vr_ptr = &sva->ptr[vr_ref-1]; int *vr_len = &sva->len[vr_ref-1]; int vc_ref = luf->vc_ref; int *vc_ptr = &sva->ptr[vc_ref-1]; int *vc_len = &sva->len[vc_ref-1]; int *pp_ind = luf->pp_ind; int *pp_inv = luf->pp_inv; int *qq_ind = luf->qq_ind; int *qq_inv = luf->qq_inv; int i, ii, i_ptr, i_end, j, jj, j_ptr, j_end; xassert(n > 0); xassert(1 <= k && k <= n+1); /* check permutation matrix P */ for (i = 1; i <= n; i++) { ii = pp_ind[i]; xassert(1 <= ii && ii <= n); xassert(pp_inv[ii] == i); } /* check permutation matrix Q */ for (j = 1; j <= n; j++) { jj = qq_inv[j]; xassert(1 <= jj && jj <= n); xassert(qq_ind[jj] == j); } /* check row-wise representation of matrix F */ for (i = 1; i <= n; i++) xassert(fr_len[i] == 0); /* check column-wise representation of matrix F */ for (j = 1; j <= n; j++) { /* j-th column of F = jj-th column of L */ jj = pp_ind[j]; if (jj < k) { j_ptr = fc_ptr[j]; j_end = j_ptr + fc_len[j]; for (; j_ptr < j_end; j_ptr++) { i = sv_ind[j_ptr]; xassert(1 <= i && i <= n); ii = pp_ind[i]; /* f[i,j] = l[ii,jj] */ xassert(ii > jj); xassert(sv_val[j_ptr] != 0.0); } } else /* jj >= k */ xassert(fc_len[j] == 0); } /* check row-wise representation of matrix V */ for (i = 1; i <= n; i++) { /* i-th row of V = ii-th row of U */ ii = pp_ind[i]; i_ptr = vr_ptr[i]; i_end = i_ptr + vr_len[i]; for (; i_ptr < i_end; i_ptr++) { j = sv_ind[i_ptr]; xassert(1 <= j && j <= n); jj = qq_inv[j]; /* v[i,j] = u[ii,jj] */ if (ii < k) xassert(jj > ii); else /* ii >= k */ { xassert(jj >= k); /* find v[i,j] in j-th column */ j_ptr = vc_ptr[j]; j_end = j_ptr + vc_len[j]; for (; sv_ind[j_ptr] != i; j_ptr++) /* nop */; xassert(j_ptr < j_end); } xassert(sv_val[i_ptr] != 0.0); } } /* check column-wise representation of matrix V */ for (j = 1; j <= n; j++) { /* j-th column of V = jj-th column of U */ jj = qq_inv[j]; if (jj < k) xassert(vc_len[j] == 0); else /* jj >= k */ { j_ptr = vc_ptr[j]; j_end = j_ptr + vc_len[j]; for (; j_ptr < j_end; j_ptr++) { i = sv_ind[j_ptr]; ii = pp_ind[i]; /* v[i,j] = u[ii,jj] */ xassert(ii >= k); /* find v[i,j] in i-th row */ i_ptr = vr_ptr[i]; i_end = i_ptr + vr_len[i]; for (; sv_ind[i_ptr] != j; i_ptr++) /* nop */; xassert(i_ptr < i_end); } } } return; } /*********************************************************************** * luf_build_v_rows - build matrix V in row-wise format * * This routine builds the row-wise representation of matrix V in the * left part of SVA using its column-wise representation. * * NOTE: On entry to the routine all rows of matrix V should have zero * capacity. * * The working array len should have at least 1+n elements (len[0] is * not used). */ void luf_build_v_rows(LUF *luf, int len[/*1+n*/]) { int n = luf->n; SVA *sva = luf->sva; int *sv_ind = sva->ind; double *sv_val = sva->val; int vr_ref = luf->vr_ref; int *vr_ptr = &sva->ptr[vr_ref-1]; int *vr_len = &sva->len[vr_ref-1]; int vc_ref = luf->vc_ref; int *vc_ptr = &sva->ptr[vc_ref-1]; int *vc_len = &sva->len[vc_ref-1]; int i, j, end, nnz, ptr, ptr1; /* calculate the number of non-zeros in each row of matrix V and * the total number of non-zeros */ nnz = 0; for (i = 1; i <= n; i++) len[i] = 0; for (j = 1; j <= n; j++) { nnz += vc_len[j]; for (end = (ptr = vc_ptr[j]) + vc_len[j]; ptr < end; ptr++) len[sv_ind[ptr]]++; } /* we need at least nnz free locations in SVA */ if (sva->r_ptr - sva->m_ptr < nnz) { sva_more_space(sva, nnz); sv_ind = sva->ind; sv_val = sva->val; } /* reserve locations for rows of matrix V */ for (i = 1; i <= n; i++) { if (len[i] > 0) sva_enlarge_cap(sva, vr_ref-1+i, len[i], 0); vr_len[i] = len[i]; } /* walk thru column of matrix V and build its rows */ for (j = 1; j <= n; j++) { for (end = (ptr = vc_ptr[j]) + vc_len[j]; ptr < end; ptr++) { i = sv_ind[ptr]; sv_ind[ptr1 = vr_ptr[i] + (--len[i])] = j; sv_val[ptr1] = sv_val[ptr]; } } return; } /*********************************************************************** * luf_build_f_rows - build matrix F in row-wise format * * This routine builds the row-wise representation of matrix F in the * right part of SVA using its column-wise representation. * * NOTE: On entry to the routine all rows of matrix F should have zero * capacity. * * The working array len should have at least 1+n elements (len[0] is * not used). */ void luf_build_f_rows(LUF *luf, int len[/*1+n*/]) { int n = luf->n; SVA *sva = luf->sva; int *sv_ind = sva->ind; double *sv_val = sva->val; int fr_ref = luf->fr_ref; int *fr_ptr = &sva->ptr[fr_ref-1]; int *fr_len = &sva->len[fr_ref-1]; int fc_ref = luf->fc_ref; int *fc_ptr = &sva->ptr[fc_ref-1]; int *fc_len = &sva->len[fc_ref-1]; int i, j, end, nnz, ptr, ptr1; /* calculate the number of non-zeros in each row of matrix F and * the total number of non-zeros (except diagonal elements) */ nnz = 0; for (i = 1; i <= n; i++) len[i] = 0; for (j = 1; j <= n; j++) { nnz += fc_len[j]; for (end = (ptr = fc_ptr[j]) + fc_len[j]; ptr < end; ptr++) len[sv_ind[ptr]]++; } /* we need at least nnz free locations in SVA */ if (sva->r_ptr - sva->m_ptr < nnz) { sva_more_space(sva, nnz); sv_ind = sva->ind; sv_val = sva->val; } /* reserve locations for rows of matrix F */ for (i = 1; i <= n; i++) { if (len[i] > 0) sva_reserve_cap(sva, fr_ref-1+i, len[i]); fr_len[i] = len[i]; } /* walk through columns of matrix F and build its rows */ for (j = 1; j <= n; j++) { for (end = (ptr = fc_ptr[j]) + fc_len[j]; ptr < end; ptr++) { i = sv_ind[ptr]; sv_ind[ptr1 = fr_ptr[i] + (--len[i])] = j; sv_val[ptr1] = sv_val[ptr]; } } return; } /*********************************************************************** * luf_build_v_cols - build matrix V in column-wise format * * This routine builds the column-wise representation of matrix V in * the left (if the flag updat is set) or right (if the flag updat is * clear) part of SVA using its row-wise representation. * * NOTE: On entry to the routine all columns of matrix V should have * zero capacity. * * The working array len should have at least 1+n elements (len[0] is * not used). */ void luf_build_v_cols(LUF *luf, int updat, int len[/*1+n*/]) { int n = luf->n; SVA *sva = luf->sva; int *sv_ind = sva->ind; double *sv_val = sva->val; int vr_ref = luf->vr_ref; int *vr_ptr = &sva->ptr[vr_ref-1]; int *vr_len = &sva->len[vr_ref-1]; int vc_ref = luf->vc_ref; int *vc_ptr = &sva->ptr[vc_ref-1]; int *vc_len = &sva->len[vc_ref-1]; int i, j, end, nnz, ptr, ptr1; /* calculate the number of non-zeros in each column of matrix V * and the total number of non-zeros (except pivot elements) */ nnz = 0; for (j = 1; j <= n; j++) len[j] = 0; for (i = 1; i <= n; i++) { nnz += vr_len[i]; for (end = (ptr = vr_ptr[i]) + vr_len[i]; ptr < end; ptr++) len[sv_ind[ptr]]++; } /* we need at least nnz free locations in SVA */ if (sva->r_ptr - sva->m_ptr < nnz) { sva_more_space(sva, nnz); sv_ind = sva->ind; sv_val = sva->val; } /* reserve locations for columns of matrix V */ for (j = 1; j <= n; j++) { if (len[j] > 0) { if (updat) sva_enlarge_cap(sva, vc_ref-1+j, len[j], 0); else sva_reserve_cap(sva, vc_ref-1+j, len[j]); } vc_len[j] = len[j]; } /* walk through rows of matrix V and build its columns */ for (i = 1; i <= n; i++) { for (end = (ptr = vr_ptr[i]) + vr_len[i]; ptr < end; ptr++) { j = sv_ind[ptr]; sv_ind[ptr1 = vc_ptr[j] + (--len[j])] = i; sv_val[ptr1] = sv_val[ptr]; } } return; } /*********************************************************************** * luf_check_f_rc - check rows and columns of matrix F * * This routine checks that the row- and column-wise representations * of matrix F are identical. * * NOTE: For testing/debugging only. */ void luf_check_f_rc(LUF *luf) { int n = luf->n; SVA *sva = luf->sva; int *sv_ind = sva->ind; double *sv_val = sva->val; int fr_ref = luf->fr_ref; int *fr_ptr = &sva->ptr[fr_ref-1]; int *fr_len = &sva->len[fr_ref-1]; int fc_ref = luf->fc_ref; int *fc_ptr = &sva->ptr[fc_ref-1]; int *fc_len = &sva->len[fc_ref-1]; int i, i_end, i_ptr, j, j_end, j_ptr; /* walk thru rows of matrix F */ for (i = 1; i <= n; i++) { for (i_end = (i_ptr = fr_ptr[i]) + fr_len[i]; i_ptr < i_end; i_ptr++) { j = sv_ind[i_ptr]; /* find element f[i,j] in j-th column of matrix F */ for (j_end = (j_ptr = fc_ptr[j]) + fc_len[j]; sv_ind[j_ptr] != i; j_ptr++) /* nop */; xassert(j_ptr < j_end); xassert(sv_val[i_ptr] == sv_val[j_ptr]); /* mark element f[i,j] */ sv_ind[j_ptr] = -i; } } /* walk thru column of matix F and check that all elements has been marked */ for (j = 1; j <= n; j++) { for (j_end = (j_ptr = fc_ptr[j]) + fc_len[j]; j_ptr < j_end; j_ptr++) { xassert((i = sv_ind[j_ptr]) < 0); /* unmark element f[i,j] */ sv_ind[j_ptr] = -i; } } return; } /*********************************************************************** * luf_check_v_rc - check rows and columns of matrix V * * This routine checks that the row- and column-wise representations * of matrix V are identical. * * NOTE: For testing/debugging only. */ void luf_check_v_rc(LUF *luf) { int n = luf->n; SVA *sva = luf->sva; int *sv_ind = sva->ind; double *sv_val = sva->val; int vr_ref = luf->vr_ref; int *vr_ptr = &sva->ptr[vr_ref-1]; int *vr_len = &sva->len[vr_ref-1]; int vc_ref = luf->vc_ref; int *vc_ptr = &sva->ptr[vc_ref-1]; int *vc_len = &sva->len[vc_ref-1]; int i, i_end, i_ptr, j, j_end, j_ptr; /* walk thru rows of matrix V */ for (i = 1; i <= n; i++) { for (i_end = (i_ptr = vr_ptr[i]) + vr_len[i]; i_ptr < i_end; i_ptr++) { j = sv_ind[i_ptr]; /* find element v[i,j] in j-th column of matrix V */ for (j_end = (j_ptr = vc_ptr[j]) + vc_len[j]; sv_ind[j_ptr] != i; j_ptr++) /* nop */; xassert(j_ptr < j_end); xassert(sv_val[i_ptr] == sv_val[j_ptr]); /* mark element v[i,j] */ sv_ind[j_ptr] = -i; } } /* walk thru column of matix V and check that all elements has been marked */ for (j = 1; j <= n; j++) { for (j_end = (j_ptr = vc_ptr[j]) + vc_len[j]; j_ptr < j_end; j_ptr++) { xassert((i = sv_ind[j_ptr]) < 0); /* unmark element v[i,j] */ sv_ind[j_ptr] = -i; } } return; } /*********************************************************************** * luf_f_solve - solve system F * x = b * * This routine solves the system F * x = b, where the matrix F is the * left factor of the sparse LU-factorization. * * On entry the array x should contain elements of the right-hand side * vector b in locations x[1], ..., x[n], where n is the order of the * matrix F. On exit this array will contain elements of the solution * vector x in the same locations. */ void luf_f_solve(LUF *luf, double x[/*1+n*/]) { int n = luf->n; SVA *sva = luf->sva; int *sv_ind = sva->ind; double *sv_val = sva->val; int fc_ref = luf->fc_ref; int *fc_ptr = &sva->ptr[fc_ref-1]; int *fc_len = &sva->len[fc_ref-1]; int *pp_inv = luf->pp_inv; int j, k, ptr, end; double x_j; for (k = 1; k <= n; k++) { /* k-th column of L = j-th column of F */ j = pp_inv[k]; /* x[j] is already computed */ /* walk thru j-th column of matrix F and substitute x[j] into * other equations */ if ((x_j = x[j]) != 0.0) { for (end = (ptr = fc_ptr[j]) + fc_len[j]; ptr < end; ptr++) x[sv_ind[ptr]] -= sv_val[ptr] * x_j; } } return; } /*********************************************************************** * luf_ft_solve - solve system F' * x = b * * This routine solves the system F' * x = b, where F' is a matrix * transposed to the matrix F, which is the left factor of the sparse * LU-factorization. * * On entry the array x should contain elements of the right-hand side * vector b in locations x[1], ..., x[n], where n is the order of the * matrix F. On exit this array will contain elements of the solution * vector x in the same locations. */ void luf_ft_solve(LUF *luf, double x[/*1+n*/]) { int n = luf->n; SVA *sva = luf->sva; int *sv_ind = sva->ind; double *sv_val = sva->val; int fr_ref = luf->fr_ref; int *fr_ptr = &sva->ptr[fr_ref-1]; int *fr_len = &sva->len[fr_ref-1]; int *pp_inv = luf->pp_inv; int i, k, ptr, end; double x_i; for (k = n; k >= 1; k--) { /* k-th column of L' = i-th row of F */ i = pp_inv[k]; /* x[i] is already computed */ /* walk thru i-th row of matrix F and substitute x[i] into * other equations */ if ((x_i = x[i]) != 0.0) { for (end = (ptr = fr_ptr[i]) + fr_len[i]; ptr < end; ptr++) x[sv_ind[ptr]] -= sv_val[ptr] * x_i; } } return; } /*********************************************************************** * luf_v_solve - solve system V * x = b * * This routine solves the system V * x = b, where the matrix V is the * right factor of the sparse LU-factorization. * * On entry the array b should contain elements of the right-hand side * vector b in locations b[1], ..., b[n], where n is the order of the * matrix V. On exit the array x will contain elements of the solution * vector x in locations x[1], ..., x[n]. Note that the array b will be * clobbered on exit. */ void luf_v_solve(LUF *luf, double b[/*1+n*/], double x[/*1+n*/]) { int n = luf->n; SVA *sva = luf->sva; int *sv_ind = sva->ind; double *sv_val = sva->val; double *vr_piv = luf->vr_piv; int vc_ref = luf->vc_ref; int *vc_ptr = &sva->ptr[vc_ref-1]; int *vc_len = &sva->len[vc_ref-1]; int *pp_inv = luf->pp_inv; int *qq_ind = luf->qq_ind; int i, j, k, ptr, end; double x_j; for (k = n; k >= 1; k--) { /* k-th row of U = i-th row of V */ /* k-th column of U = j-th column of V */ i = pp_inv[k]; j = qq_ind[k]; /* compute x[j] = b[i] / u[k,k], where u[k,k] = v[i,j]; * walk through j-th column of matrix V and substitute x[j] * into other equations */ if ((x_j = x[j] = b[i] / vr_piv[i]) != 0.0) { for (end = (ptr = vc_ptr[j]) + vc_len[j]; ptr < end; ptr++) b[sv_ind[ptr]] -= sv_val[ptr] * x_j; } } return; } /*********************************************************************** * luf_vt_solve - solve system V' * x = b * * This routine solves the system V' * x = b, where V' is a matrix * transposed to the matrix V, which is the right factor of the sparse * LU-factorization. * * On entry the array b should contain elements of the right-hand side * vector b in locations b[1], ..., b[n], where n is the order of the * matrix V. On exit the array x will contain elements of the solution * vector x in locations x[1], ..., x[n]. Note that the array b will be * clobbered on exit. */ void luf_vt_solve(LUF *luf, double b[/*1+n*/], double x[/*1+n*/]) { int n = luf->n; SVA *sva = luf->sva; int *sv_ind = sva->ind; double *sv_val = sva->val; double *vr_piv = luf->vr_piv; int vr_ref = luf->vr_ref; int *vr_ptr = &sva->ptr[vr_ref-1]; int *vr_len = &sva->len[vr_ref-1]; int *pp_inv = luf->pp_inv; int *qq_ind = luf->qq_ind; int i, j, k, ptr, end; double x_i; for (k = 1; k <= n; k++) { /* k-th row of U' = j-th column of V */ /* k-th column of U' = i-th row of V */ i = pp_inv[k]; j = qq_ind[k]; /* compute x[i] = b[j] / u'[k,k], where u'[k,k] = v[i,j]; * walk through i-th row of matrix V and substitute x[i] into * other equations */ if ((x_i = x[i] = b[j] / vr_piv[i]) != 0.0) { for (end = (ptr = vr_ptr[i]) + vr_len[i]; ptr < end; ptr++) b[sv_ind[ptr]] -= sv_val[ptr] * x_i; } } return; } /*********************************************************************** * luf_vt_solve1 - solve system V' * y = e' to cause growth in y * * This routine is a special version of luf_vt_solve. It solves the * system V'* y = e' = e + delta e, where V' is a matrix transposed to * the matrix V, e is the specified right-hand side vector, and delta e * is a vector of +1 and -1 chosen to cause growth in the solution * vector y. * * On entry the array e should contain elements of the right-hand side * vector e in locations e[1], ..., e[n], where n is the order of the * matrix V. On exit the array y will contain elements of the solution * vector y in locations y[1], ..., y[n]. Note that the array e will be * clobbered on exit. */ void luf_vt_solve1(LUF *luf, double e[/*1+n*/], double y[/*1+n*/]) { int n = luf->n; SVA *sva = luf->sva; int *sv_ind = sva->ind; double *sv_val = sva->val; double *vr_piv = luf->vr_piv; int vr_ref = luf->vr_ref; int *vr_ptr = &sva->ptr[vr_ref-1]; int *vr_len = &sva->len[vr_ref-1]; int *pp_inv = luf->pp_inv; int *qq_ind = luf->qq_ind; int i, j, k, ptr, end; double e_j, y_i; for (k = 1; k <= n; k++) { /* k-th row of U' = j-th column of V */ /* k-th column of U' = i-th row of V */ i = pp_inv[k]; j = qq_ind[k]; /* determine e'[j] = e[j] + delta e[j] */ e_j = (e[j] >= 0.0 ? e[j] + 1.0 : e[j] - 1.0); /* compute y[i] = e'[j] / u'[k,k], where u'[k,k] = v[i,j] */ y_i = y[i] = e_j / vr_piv[i]; /* walk through i-th row of matrix V and substitute y[i] into * other equations */ for (end = (ptr = vr_ptr[i]) + vr_len[i]; ptr < end; ptr++) e[sv_ind[ptr]] -= sv_val[ptr] * y_i; } return; } /*********************************************************************** * luf_estimate_norm - estimate 1-norm of inv(A) * * This routine estimates 1-norm of inv(A) by one step of inverse * iteration for the small singular vector as described in [1]. This * involves solving two systems of equations: * * A'* y = e, * * A * z = y, * * where A' is a matrix transposed to A, and e is a vector of +1 and -1 * chosen to cause growth in y. Then * * estimate 1-norm of inv(A) = (1-norm of z) / (1-norm of y) * * REFERENCES * * 1. G.E.Forsythe, M.A.Malcolm, C.B.Moler. Computer Methods for * Mathematical Computations. Prentice-Hall, Englewood Cliffs, N.J., * pp. 30-62 (subroutines DECOMP and SOLVE). */ double luf_estimate_norm(LUF *luf, double w1[/*1+n*/], double w2[/*1+n*/]) { int n = luf->n; double *e = w1; double *y = w2; double *z = w1; int i; double y_norm, z_norm; /* y = inv(A') * e = inv(F') * inv(V') * e */ /* compute y' = inv(V') * e to cause growth in y' */ for (i = 1; i <= n; i++) e[i] = 0.0; luf_vt_solve1(luf, e, y); /* compute y = inv(F') * y' */ luf_ft_solve(luf, y); /* compute 1-norm of y = sum |y[i]| */ y_norm = 0.0; for (i = 1; i <= n; i++) y_norm += (y[i] >= 0.0 ? +y[i] : -y[i]); /* z = inv(A) * y = inv(V) * inv(F) * y */ /* compute z' = inv(F) * y */ luf_f_solve(luf, y); /* compute z = inv(V) * z' */ luf_v_solve(luf, y, z); /* compute 1-norm of z = sum |z[i]| */ z_norm = 0.0; for (i = 1; i <= n; i++) z_norm += (z[i] >= 0.0 ? +z[i] : -z[i]); /* estimate 1-norm of inv(A) = (1-norm of z) / (1-norm of y) */ return z_norm / y_norm; } /* eof */ glpk-5.0/src/bflib/luf.h0000644000062000006210000002071213766346220014310 0ustar maomkpasswd/* luf.h (sparse LU-factorization) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2012-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef LUF_H #define LUF_H #include "sva.h" /*********************************************************************** * The structure LUF describes sparse LU-factorization. * * The LU-factorization has the following format: * * A = F * V = P * L * U * Q, (1) * * F = P * L * P', (2) * * V = P * U * Q, (3) * * where A is a given (unsymmetric) square matrix, F and V are matrix * factors actually computed, L is a lower triangular matrix with unity * diagonal, U is an upper triangular matrix, P and Q are permutation * matrices, P' is a matrix transposed to P. All the matrices have the * same order n. * * Matrices F and V are stored in both row- and column-wise sparse * formats in the associated sparse vector area (SVA). Unity diagonal * elements of matrix F are not stored. Pivot elements of matrix V * (which correspond to diagonal elements of matrix U) are stored in * a separate ordinary array. * * Permutation matrices P and Q are stored in ordinary arrays in both * row- and column-like formats. * * Matrices L and U are completely defined by matrices F, V, P, and Q, * and therefore not stored explicitly. */ typedef struct LUF LUF; struct LUF { /* sparse LU-factorization */ int n; /* order of matrices A, F, V, P, Q */ SVA *sva; /* associated sparse vector area (SVA) used to store rows and * columns of matrices F and V; note that different objects may * share the same SVA */ /*--------------------------------------------------------------*/ /* matrix F in row-wise format */ /* during the factorization process this object is not used */ int fr_ref; /* reference number of sparse vector in SVA, which is the first * row of matrix F */ #if 0 + 0 int *fr_ptr = &sva->ptr[fr_ref-1]; /* fr_ptr[0] is not used; * fr_ptr[i], 1 <= i <= n, is pointer to i-th row in SVA */ int *fr_len = &sva->len[fr_ref-1]; /* fr_len[0] is not used; * fr_len[i], 1 <= i <= n, is length of i-th row */ #endif /*--------------------------------------------------------------*/ /* matrix F in column-wise format */ /* during the factorization process this object is constructed * by columns */ int fc_ref; /* reference number of sparse vector in SVA, which is the first * column of matrix F */ #if 0 + 0 int *fc_ptr = &sva->ptr[fc_ref-1]; /* fc_ptr[0] is not used; * fc_ptr[j], 1 <= j <= n, is pointer to j-th column in SVA */ int *fc_len = &sva->len[fc_ref-1]; /* fc_len[0] is not used; * fc_len[j], 1 <= j <= n, is length of j-th column */ #endif /*--------------------------------------------------------------*/ /* matrix V in row-wise format */ int vr_ref; /* reference number of sparse vector in SVA, which is the first * row of matrix V */ #if 0 + 0 int *vr_ptr = &sva->ptr[vr_ref-1]; /* vr_ptr[0] is not used; * vr_ptr[i], 1 <= i <= n, is pointer to i-th row in SVA */ int *vr_len = &sva->len[vr_ref-1]; /* vr_len[0] is not used; * vr_len[i], 1 <= i <= n, is length of i-th row */ int *vr_cap = &sva->cap[vr_ref-1]; /* vr_cap[0] is not used; * vr_cap[i], 1 <= i <= n, is capacity of i-th row */ #endif double *vr_piv; /* double vr_piv[1+n]; */ /* vr_piv[0] is not used; * vr_piv[i], 1 <= i <= n, is pivot element of i-th row */ /*--------------------------------------------------------------*/ /* matrix V in column-wise format */ /* during the factorization process this object contains only the * patterns (row indices) of columns of the active submatrix */ int vc_ref; /* reference number of sparse vector in SVA, which is the first * column of matrix V */ #if 0 + 0 int *vc_ptr = &sva->ptr[vc_ref-1]; /* vc_ptr[0] is not used; * vc_ptr[j], 1 <= j <= n, is pointer to j-th column in SVA */ int *vc_len = &sva->len[vc_ref-1]; /* vc_len[0] is not used; * vc_len[j], 1 <= j <= n, is length of j-th column */ int *vc_cap = &sva->cap[vc_ref-1]; /* vc_cap[0] is not used; * vc_cap[j], 1 <= j <= n, is capacity of j-th column */ #endif /*--------------------------------------------------------------*/ /* matrix P */ int *pp_ind; /* int pp_ind[1+n]; */ /* pp_ind[i] = j means that P[i,j] = 1 */ int *pp_inv; /* int pp_inv[1+n]; */ /* pp_inv[j] = i means that P[i,j] = 1 */ /* if i-th row or column of matrix F is i'-th row or column of * matrix L, or if i-th row of matrix V is i'-th row of matrix U, * then pp_ind[i] = i' and pp_inv[i'] = i */ /*--------------------------------------------------------------*/ /* matrix Q */ int *qq_ind; /* int qq_ind[1+n]; */ /* qq_ind[i] = j means that Q[i,j] = 1 */ int *qq_inv; /* int qq_inv[1+n]; */ /* qq_inv[j] = i means that Q[i,j] = 1 */ /* if j-th column of matrix V is j'-th column of matrix U, then * qq_ind[j'] = j and qq_inv[j] = j' */ }; #define luf_swap_u_rows(i1, i2) \ do \ { int j1, j2; \ j1 = pp_inv[i1], j2 = pp_inv[i2]; \ pp_ind[j1] = i2, pp_inv[i2] = j1; \ pp_ind[j2] = i1, pp_inv[i1] = j2; \ } while (0) /* swap rows i1 and i2 of matrix U = P'* V * Q' */ #define luf_swap_u_cols(j1, j2) \ do \ { int i1, i2; \ i1 = qq_ind[j1], i2 = qq_ind[j2]; \ qq_ind[j1] = i2, qq_inv[i2] = j1; \ qq_ind[j2] = i1, qq_inv[i1] = j2; \ } while (0) /* swap columns j1 and j2 of matrix U = P'* V * Q' */ #define luf_store_v_cols _glp_luf_store_v_cols int luf_store_v_cols(LUF *luf, int (*col)(void *info, int j, int ind[], double val[]), void *info, int ind[], double val[]); /* store matrix V = A in column-wise format */ #define luf_check_all _glp_luf_check_all void luf_check_all(LUF *luf, int k); /* check LU-factorization before k-th elimination step */ #define luf_build_v_rows _glp_luf_build_v_rows void luf_build_v_rows(LUF *luf, int len[/*1+n*/]); /* build matrix V in row-wise format */ #define luf_build_f_rows _glp_luf_build_f_rows void luf_build_f_rows(LUF *luf, int len[/*1+n*/]); /* build matrix F in row-wise format */ #define luf_build_v_cols _glp_luf_build_v_cols void luf_build_v_cols(LUF *luf, int updat, int len[/*1+n*/]); /* build matrix V in column-wise format */ #define luf_check_f_rc _glp_luf_check_f_rc void luf_check_f_rc(LUF *luf); /* check rows and columns of matrix F */ #define luf_check_v_rc _glp_luf_check_v_rc void luf_check_v_rc(LUF *luf); /* check rows and columns of matrix V */ #define luf_f_solve _glp_luf_f_solve void luf_f_solve(LUF *luf, double x[/*1+n*/]); /* solve system F * x = b */ #define luf_ft_solve _glp_luf_ft_solve void luf_ft_solve(LUF *luf, double x[/*1+n*/]); /* solve system F' * x = b */ #define luf_v_solve _glp_luf_v_solve void luf_v_solve(LUF *luf, double b[/*1+n*/], double x[/*1+n*/]); /* solve system V * x = b */ #define luf_vt_solve _glp_luf_vt_solve void luf_vt_solve(LUF *luf, double b[/*1+n*/], double x[/*1+n*/]); /* solve system V' * x = b */ #define luf_vt_solve1 _glp_luf_vt_solve1 void luf_vt_solve1(LUF *luf, double e[/*1+n*/], double y[/*1+n*/]); /* solve system V' * y = e' to cause growth in y */ #define luf_estimate_norm _glp_luf_estimate_norm double luf_estimate_norm(LUF *luf, double w1[/*1+n*/], double w2[/*1+n*/]); /* estimate 1-norm of inv(A) */ #endif /* eof */ glpk-5.0/src/bflib/lufint.c0000644000062000006210000001316513766346220015022 0ustar maomkpasswd/* lufint.c (interface to LU-factorization) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2012-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "lufint.h" LUFINT *lufint_create(void) { /* create interface to LU-factorization */ LUFINT *fi; fi = talloc(1, LUFINT); fi->n_max = 0; fi->valid = 0; fi->sva = NULL; fi->luf = NULL; fi->sgf = NULL; fi->sva_n_max = fi->sva_size = 0; fi->delta_n0 = fi->delta_n = 0; fi->sgf_updat = 0; fi->sgf_piv_tol = 0.10; fi->sgf_piv_lim = 4; fi->sgf_suhl = 1; fi->sgf_eps_tol = DBL_EPSILON; return fi; } int lufint_factorize(LUFINT *fi, int n, int (*col)(void *info, int j, int ind[], double val[]), void *info) { /* compute LU-factorization of specified matrix A */ SVA *sva; LUF *luf; SGF *sgf; int k; xassert(n > 0); fi->valid = 0; /* create sparse vector area (SVA), if necessary */ sva = fi->sva; if (sva == NULL) { int sva_n_max = fi->sva_n_max; int sva_size = fi->sva_size; if (sva_n_max == 0) sva_n_max = 4 * n; if (sva_size == 0) sva_size = 10 * n; sva = fi->sva = sva_create_area(sva_n_max, sva_size); } /* allocate/reallocate underlying objects, if necessary */ if (fi->n_max < n) { int n_max = fi->n_max; if (n_max == 0) n_max = fi->n_max = n + fi->delta_n0; else n_max = fi->n_max = n + fi->delta_n; xassert(n_max >= n); /* allocate/reallocate LU-factorization (LUF) */ luf = fi->luf; if (luf == NULL) { luf = fi->luf = talloc(1, LUF); memset(luf, 0, sizeof(LUF)); luf->sva = sva; } else { tfree(luf->vr_piv); tfree(luf->pp_ind); tfree(luf->pp_inv); tfree(luf->qq_ind); tfree(luf->qq_inv); } luf->vr_piv = talloc(1+n_max, double); luf->pp_ind = talloc(1+n_max, int); luf->pp_inv = talloc(1+n_max, int); luf->qq_ind = talloc(1+n_max, int); luf->qq_inv = talloc(1+n_max, int); /* allocate/reallocate factorizer workspace (SGF) */ sgf = fi->sgf; if (sgf == NULL) { sgf = fi->sgf = talloc(1, SGF); memset(sgf, 0, sizeof(SGF)); sgf->luf = luf; } else { tfree(sgf->rs_head); tfree(sgf->rs_prev); tfree(sgf->rs_next); tfree(sgf->cs_head); tfree(sgf->cs_prev); tfree(sgf->cs_next); tfree(sgf->vr_max); tfree(sgf->flag); tfree(sgf->work); } sgf->rs_head = talloc(1+n_max, int); sgf->rs_prev = talloc(1+n_max, int); sgf->rs_next = talloc(1+n_max, int); sgf->cs_head = talloc(1+n_max, int); sgf->cs_prev = talloc(1+n_max, int); sgf->cs_next = talloc(1+n_max, int); sgf->vr_max = talloc(1+n_max, double); sgf->flag = talloc(1+n_max, char); sgf->work = talloc(1+n_max, double); } luf = fi->luf; sgf = fi->sgf; #if 1 /* FIXME */ /* initialize SVA */ sva->n = 0; sva->m_ptr = 1; sva->r_ptr = sva->size + 1; sva->head = sva->tail = 0; #endif /* allocate sparse vectors in SVA */ luf->n = n; luf->fr_ref = sva_alloc_vecs(sva, n); luf->fc_ref = sva_alloc_vecs(sva, n); luf->vr_ref = sva_alloc_vecs(sva, n); luf->vc_ref = sva_alloc_vecs(sva, n); /* store matrix V = A in column-wise format */ luf_store_v_cols(luf, col, info, sgf->rs_prev, sgf->work); /* setup factorizer control parameters */ sgf->updat = fi->sgf_updat; sgf->piv_tol = fi->sgf_piv_tol; sgf->piv_lim = fi->sgf_piv_lim; sgf->suhl = fi->sgf_suhl; sgf->eps_tol = fi->sgf_eps_tol; /* compute LU-factorization of specified matrix A */ k = sgf_factorize(sgf, 1); if (k == 0) fi->valid = 1; return k; } void lufint_delete(LUFINT *fi) { /* delete interface to LU-factorization */ SVA *sva = fi->sva; LUF *luf = fi->luf; SGF *sgf = fi->sgf; if (sva != NULL) sva_delete_area(sva); if (luf != NULL) { tfree(luf->vr_piv); tfree(luf->pp_ind); tfree(luf->pp_inv); tfree(luf->qq_ind); tfree(luf->qq_inv); tfree(luf); } if (sgf != NULL) { tfree(sgf->rs_head); tfree(sgf->rs_prev); tfree(sgf->rs_next); tfree(sgf->cs_head); tfree(sgf->cs_prev); tfree(sgf->cs_next); tfree(sgf->vr_max); tfree(sgf->flag); tfree(sgf->work); tfree(sgf); } tfree(fi); return; } /* eof */ glpk-5.0/src/bflib/lufint.h0000644000062000006210000000451013766346220015021 0ustar maomkpasswd/* lufint.h (interface to LU-factorization) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2012-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef LUFINT_H #define LUFINT_H #include "sgf.h" typedef struct LUFINT LUFINT; struct LUFINT { /* interface to LU-factorization */ int n_max; /* maximal value of n (increased automatically) */ int valid; /* factorization is valid only if this flag is set */ SVA *sva; /* sparse vector area (SVA) */ LUF *luf; /* sparse LU-factorization */ SGF *sgf; /* sparse Gaussian factorizer workspace */ /*--------------------------------------------------------------*/ /* control parameters */ int sva_n_max, sva_size; /* parameters passed to sva_create_area */ int delta_n0, delta_n; /* if n_max = 0, set n_max = n + delta_n0 * if n_max < n, set n_max = n + delta_n */ int sgf_updat; double sgf_piv_tol; int sgf_piv_lim; int sgf_suhl; double sgf_eps_tol; /* factorizer control parameters */ }; #define lufint_create _glp_lufint_create LUFINT *lufint_create(void); /* create interface to LU-factorization */ #define lufint_factorize _glp_lufint_factorize int lufint_factorize(LUFINT *fi, int n, int (*col)(void *info, int j, int ind[], double val[]), void *info); /* compute LU-factorization of specified matrix A */ #define lufint_delete _glp_lufint_delete void lufint_delete(LUFINT *fi); /* delete interface to LU-factorization */ #endif /* eof */ glpk-5.0/src/bflib/scf.c0000644000062000006210000004054513766346220014276 0ustar maomkpasswd/* scf.c (sparse updatable Schur-complement-based factorization) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2013-2014 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "scf.h" /*********************************************************************** * scf_r0_solve - solve system R0 * x = b or R0'* x = b * * This routine solves the system R0 * x = b (if tr is zero) or the * system R0'* x = b (if tr is non-zero), where R0 is the left factor * of the initial matrix A0 = R0 * S0. * * On entry the array x should contain elements of the right-hand side * vector b in locations x[1], ..., x[n0], where n0 is the order of the * matrix R0. On exit the array x will contain elements of the solution * vector in the same locations. */ void scf_r0_solve(SCF *scf, int tr, double x[/*1+n0*/]) { switch (scf->type) { case 1: /* A0 = F0 * V0, so R0 = F0 */ if (!tr) luf_f_solve(scf->a0.luf, x); else luf_ft_solve(scf->a0.luf, x); break; case 2: /* A0 = I * A0, so R0 = I */ break; default: xassert(scf != scf); } return; } /*********************************************************************** * scf_s0_solve - solve system S0 * x = b or S0'* x = b * * This routine solves the system S0 * x = b (if tr is zero) or the * system S0'* x = b (if tr is non-zero), where S0 is the right factor * of the initial matrix A0 = R0 * S0. * * On entry the array x should contain elements of the right-hand side * vector b in locations x[1], ..., x[n0], where n0 is the order of the * matrix S0. On exit the array x will contain elements of the solution * vector in the same locations. * * The routine uses locations [1], ..., [n0] of three working arrays * w1, w2, and w3. (In case of type = 1 arrays w2 and w3 are not used * and can be specified as NULL.) */ void scf_s0_solve(SCF *scf, int tr, double x[/*1+n0*/], double w1[/*1+n0*/], double w2[/*1+n0*/], double w3[/*1+n0*/]) { int n0 = scf->n0; switch (scf->type) { case 1: /* A0 = F0 * V0, so S0 = V0 */ if (!tr) luf_v_solve(scf->a0.luf, x, w1); else luf_vt_solve(scf->a0.luf, x, w1); break; case 2: /* A0 = I * A0, so S0 = A0 */ if (!tr) btf_a_solve(scf->a0.btf, x, w1, w2, w3); else btf_at_solve(scf->a0.btf, x, w1, w2, w3); break; default: xassert(scf != scf); } memcpy(&x[1], &w1[1], n0 * sizeof(double)); return; } /*********************************************************************** * scf_r_prod - compute product y := y + alpha * R * x * * This routine computes the product y := y + alpha * R * x, where * x is a n0-vector, alpha is a scalar, y is a nn-vector. * * Since matrix R is available by rows, the product components are * computed as inner products: * * y[i] = y[i] + alpha * (i-th row of R) * x * * for i = 1, 2, ..., nn. */ void scf_r_prod(SCF *scf, double y[/*1+nn*/], double a, const double x[/*1+n0*/]) { int nn = scf->nn; SVA *sva = scf->sva; int *sv_ind = sva->ind; double *sv_val = sva->val; int rr_ref = scf->rr_ref; int *rr_ptr = &sva->ptr[rr_ref-1]; int *rr_len = &sva->len[rr_ref-1]; int i, ptr, end; double t; for (i = 1; i <= nn; i++) { /* t := (i-th row of R) * x */ t = 0.0; for (end = (ptr = rr_ptr[i]) + rr_len[i]; ptr < end; ptr++) t += sv_val[ptr] * x[sv_ind[ptr]]; /* y[i] := y[i] + alpha * t */ y[i] += a * t; } return; } /*********************************************************************** * scf_rt_prod - compute product y := y + alpha * R'* x * * This routine computes the product y := y + alpha * R'* x, where * R' is a matrix transposed to R, x is a nn-vector, alpha is a scalar, * y is a n0-vector. * * Since matrix R is available by rows, the product is computed as a * linear combination: * * y := y + alpha * (R'[1] * x[1] + ... + R'[nn] * x[nn]), * * where R'[i] is i-th row of R. */ void scf_rt_prod(SCF *scf, double y[/*1+n0*/], double a, const double x[/*1+nn*/]) { int nn = scf->nn; SVA *sva = scf->sva; int *sv_ind = sva->ind; double *sv_val = sva->val; int rr_ref = scf->rr_ref; int *rr_ptr = &sva->ptr[rr_ref-1]; int *rr_len = &sva->len[rr_ref-1]; int i, ptr, end; double t; for (i = 1; i <= nn; i++) { if (x[i] == 0.0) continue; /* y := y + alpha * R'[i] * x[i] */ t = a * x[i]; for (end = (ptr = rr_ptr[i]) + rr_len[i]; ptr < end; ptr++) y[sv_ind[ptr]] += sv_val[ptr] * t; } return; } /*********************************************************************** * scf_s_prod - compute product y := y + alpha * S * x * * This routine computes the product y := y + alpha * S * x, where * x is a nn-vector, alpha is a scalar, y is a n0 vector. * * Since matrix S is available by columns, the product is computed as * a linear combination: * * y := y + alpha * (S[1] * x[1] + ... + S[nn] * x[nn]), * * where S[j] is j-th column of S. */ void scf_s_prod(SCF *scf, double y[/*1+n0*/], double a, const double x[/*1+nn*/]) { int nn = scf->nn; SVA *sva = scf->sva; int *sv_ind = sva->ind; double *sv_val = sva->val; int ss_ref = scf->ss_ref; int *ss_ptr = &sva->ptr[ss_ref-1]; int *ss_len = &sva->len[ss_ref-1]; int j, ptr, end; double t; for (j = 1; j <= nn; j++) { if (x[j] == 0.0) continue; /* y := y + alpha * S[j] * x[j] */ t = a * x[j]; for (end = (ptr = ss_ptr[j]) + ss_len[j]; ptr < end; ptr++) y[sv_ind[ptr]] += sv_val[ptr] * t; } return; } /*********************************************************************** * scf_st_prod - compute product y := y + alpha * S'* x * * This routine computes the product y := y + alpha * S'* x, where * S' is a matrix transposed to S, x is a n0-vector, alpha is a scalar, * y is a nn-vector. * * Since matrix S is available by columns, the product components are * computed as inner products: * * y[j] := y[j] + alpha * (j-th column of S) * x * * for j = 1, 2, ..., nn. */ void scf_st_prod(SCF *scf, double y[/*1+nn*/], double a, const double x[/*1+n0*/]) { int nn = scf->nn; SVA *sva = scf->sva; int *sv_ind = sva->ind; double *sv_val = sva->val; int ss_ref = scf->ss_ref; int *ss_ptr = &sva->ptr[ss_ref-1]; int *ss_len = &sva->len[ss_ref-1]; int j, ptr, end; double t; for (j = 1; j <= nn; j++) { /* t := (j-th column of S) * x */ t = 0.0; for (end = (ptr = ss_ptr[j]) + ss_len[j]; ptr < end; ptr++) t += sv_val[ptr] * x[sv_ind[ptr]]; /* y[j] := y[j] + alpha * t */ y[j] += a * t; } return; } /*********************************************************************** * scf_a_solve - solve system A * x = b * * This routine solves the system A * x = b, where A is the current * matrix. * * On entry the array x should contain elements of the right-hand side * vector b in locations x[1], ..., x[n], where n is the order of the * matrix A. On exit the array x will contain elements of the solution * vector in the same locations. * * For details see the program documentation. */ void scf_a_solve(SCF *scf, double x[/*1+n*/], double w[/*1+n0+nn*/], double work1[/*1+max(n0,nn)*/], double work2[/*1+n*/], double work3[/*1+n*/]) { int n = scf->n; int n0 = scf->n0; int nn = scf->nn; int *pp_ind = scf->pp_ind; int *qq_inv = scf->qq_inv; int i, ii; /* (u1, u2) := inv(P) * (b, 0) */ for (ii = 1; ii <= n0+nn; ii++) { i = pp_ind[ii]; #if 1 /* FIXME: currently P = I */ xassert(i == ii); #endif w[ii] = (i <= n ? x[i] : 0.0); } /* v1 := inv(R0) * u1 */ scf_r0_solve(scf, 0, &w[0]); /* v2 := u2 - R * v1 */ scf_r_prod(scf, &w[n0], -1.0, &w[0]); /* w2 := inv(C) * v2 */ ifu_a_solve(&scf->ifu, &w[n0], work1); /* w1 := inv(S0) * (v1 - S * w2) */ scf_s_prod(scf, &w[0], -1.0, &w[n0]); scf_s0_solve(scf, 0, &w[0], work1, work2, work3); /* (x, x~) := inv(Q) * (w1, w2); x~ is not needed */ for (i = 1; i <= n; i++) x[i] = w[qq_inv[i]]; return; } /*********************************************************************** * scf_at_solve - solve system A'* x = b * * This routine solves the system A'* x = b, where A' is a matrix * transposed to the current matrix A. * * On entry the array x should contain elements of the right-hand side * vector b in locations x[1], ..., x[n], where n is the order of the * matrix A. On exit the array x will contain elements of the solution * vector in the same locations. * * For details see the program documentation. */ void scf_at_solve(SCF *scf, double x[/*1+n*/], double w[/*1+n0+nn*/], double work1[/*1+max(n0,nn)*/], double work2[/*1+n*/], double work3[/*1+n*/]) { int n = scf->n; int n0 = scf->n0; int nn = scf->nn; int *pp_inv = scf->pp_inv; int *qq_ind = scf->qq_ind; int i, ii; /* (u1, u2) := Q * (b, 0) */ for (ii = 1; ii <= n0+nn; ii++) { i = qq_ind[ii]; w[ii] = (i <= n ? x[i] : 0.0); } /* v1 := inv(S0') * u1 */ scf_s0_solve(scf, 1, &w[0], work1, work2, work3); /* v2 := inv(C') * (u2 - S'* v1) */ scf_st_prod(scf, &w[n0], -1.0, &w[0]); ifu_at_solve(&scf->ifu, &w[n0], work1); /* w2 := v2 */ /* nop */ /* w1 := inv(R0') * (v1 - R'* w2) */ scf_rt_prod(scf, &w[0], -1.0, &w[n0]); scf_r0_solve(scf, 1, &w[0]); /* compute (x, x~) := P * (w1, w2); x~ is not needed */ for (i = 1; i <= n; i++) { #if 1 /* FIXME: currently P = I */ xassert(pp_inv[i] == i); #endif x[i] = w[pp_inv[i]]; } return; } /*********************************************************************** * scf_add_r_row - add new row to matrix R * * This routine adds new (nn+1)-th row to matrix R, whose elements are * specified in locations w[1,...,n0]. */ void scf_add_r_row(SCF *scf, const double w[/*1+n0*/]) { int n0 = scf->n0; int nn = scf->nn; SVA *sva = scf->sva; int *sv_ind = sva->ind; double *sv_val = sva->val; int rr_ref = scf->rr_ref; int *rr_ptr = &sva->ptr[rr_ref-1]; int *rr_len = &sva->len[rr_ref-1]; int j, len, ptr; xassert(0 <= nn && nn < scf->nn_max); /* determine length of new row */ len = 0; for (j = 1; j <= n0; j++) { if (w[j] != 0.0) len++; } /* reserve locations for new row in static part of SVA */ if (len > 0) { if (sva->r_ptr - sva->m_ptr < len) { sva_more_space(sva, len); sv_ind = sva->ind; sv_val = sva->val; } sva_reserve_cap(sva, rr_ref + nn, len); } /* store new row in sparse format */ ptr = rr_ptr[nn+1]; for (j = 1; j <= n0; j++) { if (w[j] != 0.0) { sv_ind[ptr] = j; sv_val[ptr] = w[j]; ptr++; } } xassert(ptr - rr_ptr[nn+1] == len); rr_len[nn+1] = len; #ifdef GLP_DEBUG sva_check_area(sva); #endif return; } /*********************************************************************** * scf_add_s_col - add new column to matrix S * * This routine adds new (nn+1)-th column to matrix S, whose elements * are specified in locations v[1,...,n0]. */ void scf_add_s_col(SCF *scf, const double v[/*1+n0*/]) { int n0 = scf->n0; int nn = scf->nn; SVA *sva = scf->sva; int *sv_ind = sva->ind; double *sv_val = sva->val; int ss_ref = scf->ss_ref; int *ss_ptr = &sva->ptr[ss_ref-1]; int *ss_len = &sva->len[ss_ref-1]; int i, len, ptr; xassert(0 <= nn && nn < scf->nn_max); /* determine length of new column */ len = 0; for (i = 1; i <= n0; i++) { if (v[i] != 0.0) len++; } /* reserve locations for new column in static part of SVA */ if (len > 0) { if (sva->r_ptr - sva->m_ptr < len) { sva_more_space(sva, len); sv_ind = sva->ind; sv_val = sva->val; } sva_reserve_cap(sva, ss_ref + nn, len); } /* store new column in sparse format */ ptr = ss_ptr[nn+1]; for (i = 1; i <= n0; i++) { if (v[i] != 0.0) { sv_ind[ptr] = i; sv_val[ptr] = v[i]; ptr++; } } xassert(ptr - ss_ptr[nn+1] == len); ss_len[nn+1] = len; #ifdef GLP_DEBUG sva_check_area(sva); #endif return; } /*********************************************************************** * scf_update_aug - update factorization of augmented matrix * * Given factorization of the current augmented matrix: * * ( A0 A1 ) ( R0 ) ( S0 S ) * ( ) = ( ) ( ), * ( A2 A3 ) ( R I ) ( C ) * * this routine computes factorization of the new augmented matrix: * * ( A0 | A1 b ) * ( ---+------ ) ( A0 A1^ ) ( R0 ) ( S0 S^ ) * ( A2 | A3 f ) = ( ) = ( ) ( ), * ( | ) ( A2^ A3^ ) ( R^ I ) ( C^ ) * ( d' | g' h ) * * where b and d are specified n0-vectors, f and g are specified * nn-vectors, and h is a specified scalar. (Note that corresponding * arrays are clobbered on exit.) * * The parameter upd specifies how to update factorization of the Schur * complement C: * * 1 Bartels-Golub updating. * * 2 Givens rotations updating. * * The working arrays w1, w2, and w3 are used in the same way as in the * routine scf_s0_solve. * * RETURNS * * 0 Factorization has been successfully updated. * * 1 Updating limit has been reached. * * 2 Updating IFU-factorization of matrix C failed. * * For details see the program documentation. */ int scf_update_aug(SCF *scf, double b[/*1+n0*/], double d[/*1+n0*/], double f[/*1+nn*/], double g[/*1+nn*/], double h, int upd, double w1[/*1+n0*/], double w2[/*1+n0*/], double w3[/*1+n0*/]) { int n0 = scf->n0; int k, ret; double *v, *w, *x, *y, z; if (scf->nn == scf->nn_max) { /* updating limit has been reached */ return 1; } /* v := inv(R0) * b */ scf_r0_solve(scf, 0, (v = b)); /* w := inv(S0') * d */ scf_s0_solve(scf, 1, (w = d), w1, w2, w3); /* x := f - R * v */ scf_r_prod(scf, (x = f), -1.0, v); /* y := g - S'* w */ scf_st_prod(scf, (y = g), -1.0, w); /* z := h - v'* w */ z = h; for (k = 1; k <= n0; k++) z -= v[k] * w[k]; /* new R := R with row w added */ scf_add_r_row(scf, w); /* new S := S with column v added */ scf_add_s_col(scf, v); /* update IFU-factorization of C */ switch (upd) { case 1: ret = ifu_bg_update(&scf->ifu, x, y, z); break; case 2: ret = ifu_gr_update(&scf->ifu, x, y, z); break; default: xassert(upd != upd); } if (ret != 0) { /* updating IFU-factorization failed */ return 2; } /* increase number of additional rows and columns */ scf->nn++; /* expand P and Q */ k = n0 + scf->nn; scf->pp_ind[k] = scf->pp_inv[k] = k; scf->qq_ind[k] = scf->qq_inv[k] = k; /* factorization has been successfully updated */ return 0; } /* eof */ glpk-5.0/src/bflib/scf.h0000644000062000006210000001736113766346220014303 0ustar maomkpasswd/* scf.h (sparse updatable Schur-complement-based factorization) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2013-2014 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef SCF_H #define SCF_H #include "btf.h" #include "ifu.h" #include "luf.h" /*********************************************************************** * The structure SCF describes sparse updatable factorization based on * Schur complement. * * The SCF-factorization has the following format: * * ( A A1~ ) ( A0 A1 ) ( R0 ) ( S0 S ) * ( ) = P ( ) Q = P ( ) ( ) Q, (1) * ( A2~ A3~ ) ( A2 A3 ) ( R I ) ( C ) * * where: * * A is current (unsymmetric) square matrix (not stored); * * A1~, A2~, A3~ are some additional matrices (not stored); * * A0 is initial (unsymmetric) square matrix (not stored); * * A1, A2, A3 are some additional matrices (not stored); * * R0 and S0 are matrices that define factorization of the initial * matrix A0 = R0 * S0 (stored in an invertable form); * * R is a matrix defined from R * S0 = A2, so R = A2 * inv(S0) (stored * in row-wise sparse format); * * S is a matrix defined from R0 * S = A1, so S = inv(R0) * A1 (stored * in column-wise sparse format); * * C is Schur complement (to matrix A0) defined from R * S + C = A3, * so C = A3 - R * S = A3 - A2 * inv(A0) * A1 (stored in an invertable * form). * * P, Q are permutation matrices (stored in both row- and column-like * formats). */ typedef struct SCF SCF; struct SCF { /* Schur-complement-based factorization */ int n; /* order of current matrix A */ /*--------------------------------------------------------------*/ /* initial matrix A0 = R0 * S0 of order n0 in invertable form */ int n0; /* order of matrix A0 */ int type; /* type of factorization used: * 1 - LU-factorization (R0 = F0, S0 = V0) * 2 - BT-factorization (R0 = I, S0 = A0) */ union { LUF *luf; /* type = 1 */ BTF *btf; /* type = 2 */ } a0; /* factorization of matrix A0 */ /*--------------------------------------------------------------*/ /* augmented matrix (A0, A1; A2, A3) of order n0+nn */ int nn_max; /* maximal number of additional rows and columns in the augmented * matrix (this limits the number of updates) */ int nn; /* current number of additional rows and columns in the augmented * matrix, 0 <= nn <= nn_max */ SVA *sva; /* associated sparse vector area (SVA) used to store rows of * matrix R and columns of matrix S */ /*--------------------------------------------------------------*/ /* nn*n0-matrix R in row-wise format */ int rr_ref; /* reference number of sparse vector in SVA, which is the first * row of matrix R */ #if 0 + 0 int *rr_ptr = &sva->ptr[rr_ref-1]; /* rr_ptr[0] is not used; * rr_ptr[i], 1 <= i <= nn, is pointer to i-th row in SVA; * rr_ptr[nn+1,...,nn_max] are reserved locations */ int *rr_len = &sva->len[rr_ref-1]; /* rr_len[0] is not used; * rr_len[i], 1 <= i <= nn, is length of i-th row; * rr_len[nn+1,...,nn_max] are reserved locations */ #endif /*--------------------------------------------------------------*/ /* n0*nn-matrix S in column-wise format */ int ss_ref; /* reference number of sparse vector in SVA, which is the first * column of matrix S */ #if 0 + 0 int *ss_ptr = &sva->ptr[ss_ref-1]; /* ss_ptr[0] is not used; * ss_ptr[j], 1 <= j <= nn, is pointer to j-th column in SVA; * ss_ptr[nn+1,...,nn_max] are reserved locations */ int *ss_len = &sva->len[ss_ref-1]; /* ss_len[0] is not used; * ss_len[j], 1 <= j <= nn, is length of j-th column; * ss_len[nn+1,...,nn_max] are reserved locations */ #endif /*--------------------------------------------------------------*/ /* Schur complement C of order nn in invertable form */ IFU ifu; /* IFU-factorization of matrix C */ /*--------------------------------------------------------------*/ /* permutation matrix P of order n0+nn */ int *pp_ind; /* int pp_ind[1+n0+nn_max]; */ /* pp_ind[i] = j means that P[i,j] = 1 */ int *pp_inv; /* int pp_inv[1+n0+nn_max]; */ /* pp_inv[j] = i means that P[i,j] = 1 */ /*--------------------------------------------------------------*/ /* permutation matrix Q of order n0+nn */ int *qq_ind; /* int qq_ind[1+n0+nn_max]; */ /* qq_ind[i] = j means that Q[i,j] = 1 */ int *qq_inv; /* int qq_inv[1+n0+nn_max]; */ /* qq_inv[j] = i means that Q[i,j] = 1 */ }; #define scf_swap_q_cols(j1, j2) \ do \ { int i1, i2; \ i1 = qq_inv[j1], i2 = qq_inv[j2]; \ qq_ind[i1] = j2, qq_inv[j2] = i1; \ qq_ind[i2] = j1, qq_inv[j1] = i2; \ } while (0) /* swap columns j1 and j2 of permutation matrix Q */ #define scf_r0_solve _glp_scf_r0_solve void scf_r0_solve(SCF *scf, int tr, double x[/*1+n0*/]); /* solve system R0 * x = b or R0'* x = b */ #define scf_s0_solve _glp_scf_s0_solve void scf_s0_solve(SCF *scf, int tr, double x[/*1+n0*/], double w1[/*1+n0*/], double w2[/*1+n0*/], double w3[/*1+n0*/]); /* solve system S0 * x = b or S0'* x = b */ #define scf_r_prod _glp_scf_r_prod void scf_r_prod(SCF *scf, double y[/*1+nn*/], double a, const double x[/*1+n0*/]); /* compute product y := y + alpha * R * x */ #define scf_rt_prod _glp_scf_rt_prod void scf_rt_prod(SCF *scf, double y[/*1+n0*/], double a, const double x[/*1+nn*/]); /* compute product y := y + alpha * R'* x */ #define scf_s_prod _glp_scf_s_prod void scf_s_prod(SCF *scf, double y[/*1+n0*/], double a, const double x[/*1+nn*/]); /* compute product y := y + alpha * S * x */ #define scf_st_prod _glp_scf_st_prod void scf_st_prod(SCF *scf, double y[/*1+nn*/], double a, const double x[/*1+n0*/]); /* compute product y := y + alpha * S'* x */ #define scf_a_solve _glp_scf_a_solve void scf_a_solve(SCF *scf, double x[/*1+n*/], double w[/*1+n0+nn*/], double work1[/*1+max(n0,nn)*/], double work2[/*1+n*/], double work3[/*1+n*/]); /* solve system A * x = b */ #define scf_at_solve _glp_scf_at_solve void scf_at_solve(SCF *scf, double x[/*1+n*/], double w[/*1+n0+nn*/], double work1[/*1+max(n0,nn)*/], double work2[/*1+n*/], double work3[/*1+n*/]); /* solve system A'* x = b */ #define scf_add_r_row _glp_scf_add_r_row void scf_add_r_row(SCF *scf, const double w[/*1+n0*/]); /* add new row to matrix R */ #define scf_add_s_col _glp_scf_add_s_col void scf_add_s_col(SCF *scf, const double v[/*1+n0*/]); /* add new column to matrix S */ #define scf_update_aug _glp_scf_update_aug int scf_update_aug(SCF *scf, double b[/*1+n0*/], double d[/*1+n0*/], double f[/*1+nn*/], double g[/*1+nn*/], double h, int upd, double w1[/*1+n0*/], double w2[/*1+n0*/], double w3[/*1+n0*/]); /* update factorization of augmented matrix */ #endif /* eof */ glpk-5.0/src/bflib/scfint.c0000644000062000006210000001751513766346220015012 0ustar maomkpasswd/* scfint.c (interface to Schur-complement-based factorization) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2013-2014 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "scfint.h" SCFINT *scfint_create(int type) { /* create interface to SC-factorization */ SCFINT *fi; fi = talloc(1, SCFINT); memset(fi, 0, sizeof(SCFINT)); switch ((fi->scf.type = type)) { case 1: fi->u.lufi = lufint_create(); break; case 2: fi->u.btfi = btfint_create(); break; default: xassert(type != type); } return fi; } int scfint_factorize(SCFINT *fi, int n, int (*col)(void *info, int j, int ind[], double val[]), void *info) { /* compute SC-factorization of specified matrix A */ int nn_max, old_n0_max, n0_max, k, ret; xassert(n > 0); fi->valid = 0; /* get required value of nn_max */ nn_max = fi->nn_max; if (nn_max == 0) nn_max = 100; xassert(nn_max > 0); /* compute factorization of specified matrix A */ switch (fi->scf.type) { case 1: old_n0_max = fi->u.lufi->n_max; fi->u.lufi->sva_n_max = 4 * n + 2 * nn_max; ret = lufint_factorize(fi->u.lufi, n, col, info); n0_max = fi->u.lufi->n_max; fi->scf.sva = fi->u.lufi->sva; fi->scf.a0.luf = fi->u.lufi->luf; break; case 2: old_n0_max = fi->u.btfi->n_max; fi->u.btfi->sva_n_max = 6 * n + 2 * nn_max; ret = btfint_factorize(fi->u.btfi, n, col, info); n0_max = fi->u.btfi->n_max; fi->scf.sva = fi->u.btfi->sva; fi->scf.a0.btf = fi->u.btfi->btf; break; default: xassert(fi != fi); } /* allocate/reallocate arrays, if necessary */ if (old_n0_max < n0_max) { if (fi->w1 != NULL) tfree(fi->w1); if (fi->w2 != NULL) tfree(fi->w2); if (fi->w3 != NULL) tfree(fi->w3); fi->w1 = talloc(1+n0_max, double); fi->w2 = talloc(1+n0_max, double); fi->w3 = talloc(1+n0_max, double); } if (fi->scf.nn_max != nn_max) { if (fi->scf.ifu.f != NULL) tfree(fi->scf.ifu.f); if (fi->scf.ifu.u != NULL) tfree(fi->scf.ifu.u); fi->scf.ifu.f = talloc(nn_max * nn_max, double); fi->scf.ifu.u = talloc(nn_max * nn_max, double); } if (old_n0_max < n0_max || fi->scf.nn_max != nn_max) { if (fi->scf.pp_ind != NULL) tfree(fi->scf.pp_ind); if (fi->scf.pp_inv != NULL) tfree(fi->scf.pp_inv); if (fi->scf.qq_ind != NULL) tfree(fi->scf.qq_ind); if (fi->scf.qq_inv != NULL) tfree(fi->scf.qq_inv); if (fi->w4 != NULL) tfree(fi->w4); if (fi->w5 != NULL) tfree(fi->w5); fi->scf.pp_ind = talloc(1+n0_max+nn_max, int); fi->scf.pp_inv = talloc(1+n0_max+nn_max, int); fi->scf.qq_ind = talloc(1+n0_max+nn_max, int); fi->scf.qq_inv = talloc(1+n0_max+nn_max, int); fi->w4 = talloc(1+n0_max+nn_max, double); fi->w5 = talloc(1+n0_max+nn_max, double); } /* initialize SC-factorization */ fi->scf.n = n; fi->scf.n0 = n; fi->scf.nn_max = nn_max; fi->scf.nn = 0; fi->scf.rr_ref = sva_alloc_vecs(fi->scf.sva, nn_max); fi->scf.ss_ref = sva_alloc_vecs(fi->scf.sva, nn_max); fi->scf.ifu.n_max = nn_max; fi->scf.ifu.n = 0; for (k = 1; k <= n; k++) { fi->scf.pp_ind[k] = k; fi->scf.pp_inv[k] = k; fi->scf.qq_ind[k] = k; fi->scf.qq_inv[k] = k; } /* set validation flag */ if (ret == 0) fi->valid = 1; return ret; } int scfint_update(SCFINT *fi, int upd, int j, int len, const int ind[], const double val[]) { /* update SC-factorization after replacing j-th column of A */ int n = fi->scf.n; int n0 = fi->scf.n0; int nn = fi->scf.nn; int *pp_ind = fi->scf.pp_ind; int *qq_ind = fi->scf.qq_ind; int *qq_inv = fi->scf.qq_inv; double *bf = fi->w4; double *dg = fi->w5; int k, t, ret; xassert(fi->valid); xassert(0 <= n && n <= n0+nn); /* (b, f) := inv(P) * (beta, 0) */ for (k = 1; k <= n0+nn; k++) bf[k] = 0.0; for (t = 1; t <= len; t++) { k = ind[t]; xassert(1 <= k && k <= n); #if 1 /* FIXME: currently P = I */ xassert(pp_ind[k] == k); #endif xassert(bf[k] == 0.0); xassert(val[t] != 0.0); bf[k] = val[t]; } /* (d, g) := Q * (cj, 0) */ for (k = 1; k <= n0+nn; k++) dg[k] = 0.0; xassert(1 <= j && j <= n); dg[fi->scf.qq_inv[j]] = 1; /* update factorization of augmented matrix */ ret = scf_update_aug(&fi->scf, &bf[0], &dg[0], &bf[n0], &dg[n0], 0.0, upd, fi->w1, fi->w2, fi->w3); if (ret == 0) { /* swap j-th and last columns of new matrix Q */ scf_swap_q_cols(j, n0+nn+1); } else { /* updating failed */ fi->valid = 0; } return ret; } void scfint_ftran(SCFINT *fi, double x[]) { /* solve system A * x = b */ xassert(fi->valid); scf_a_solve(&fi->scf, x, fi->w4, fi->w5, fi->w1, fi->w2); return; } void scfint_btran(SCFINT *fi, double x[]) { /* solve system A'* x = b */ xassert(fi->valid); scf_at_solve(&fi->scf, x, fi->w4, fi->w5, fi->w1, fi->w2); return; } double scfint_estimate(SCFINT *fi) { /* estimate 1-norm of inv(A) */ double norm; xassert(fi->valid); xassert(fi->scf.n == fi->scf.n0); switch (fi->scf.type) { case 1: norm = luf_estimate_norm(fi->scf.a0.luf, fi->w1, fi->w2); break; case 2: norm = btf_estimate_norm(fi->scf.a0.btf, fi->w1, fi->w2, fi->w3, fi->w4); break; default: xassert(fi != fi); } return norm; } void scfint_delete(SCFINT *fi) { /* delete interface to SC-factorization */ switch (fi->scf.type) { case 1: lufint_delete(fi->u.lufi); break; case 2: btfint_delete(fi->u.btfi); break; default: xassert(fi != fi); } if (fi->scf.ifu.f != NULL) tfree(fi->scf.ifu.f); if (fi->scf.ifu.u != NULL) tfree(fi->scf.ifu.u); if (fi->scf.pp_ind != NULL) tfree(fi->scf.pp_ind); if (fi->scf.pp_inv != NULL) tfree(fi->scf.pp_inv); if (fi->scf.qq_ind != NULL) tfree(fi->scf.qq_ind); if (fi->scf.qq_inv != NULL) tfree(fi->scf.qq_inv); if (fi->w1 != NULL) tfree(fi->w1); if (fi->w2 != NULL) tfree(fi->w2); if (fi->w3 != NULL) tfree(fi->w3); if (fi->w4 != NULL) tfree(fi->w4); if (fi->w5 != NULL) tfree(fi->w5); tfree(fi); return; } /* eof */ glpk-5.0/src/bflib/scfint.h0000644000062000006210000000567213766346220015020 0ustar maomkpasswd/* scfint.h (interface to Schur-complement-based factorization) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2013-2014 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef SCFINT_H #define SCFINT_H #include "scf.h" #include "lufint.h" #include "btfint.h" typedef struct SCFINT SCFINT; struct SCFINT { /* interface to SC-factorization */ int valid; /* factorization is valid only if this flag is set */ SCF scf; /* Schur-complement based factorization */ union { LUFINT *lufi; /* scf.type = 1 */ BTFINT *btfi; /* scf.type = 2 */ } u; /* interface to factorize initial matrix A0 */ /*--------------------------------------------------------------*/ /* working arrays */ double *w1; /* double w1[1+n0_max]; */ double *w2; /* double w2[1+n0_max]; */ double *w3; /* double w3[1+n0_max]; */ double *w4; /* double w4[1+n0_max+nn_max]; */ double *w5; /* double w5[1+n0_max+nn_max]; */ /*--------------------------------------------------------------*/ /* control parameters */ int nn_max; /* required maximal number of updates */ }; #define scfint_create _glp_scfint_create SCFINT *scfint_create(int type); /* create interface to SC-factorization */ #define scfint_factorize _glp_scfint_factorize int scfint_factorize(SCFINT *fi, int n, int (*col)(void *info, int j, int ind[], double val[]), void *info); /* compute SC-factorization of specified matrix A */ #define scfint_update _glp_scfint_update int scfint_update(SCFINT *fi, int upd, int j, int len, const int ind[], const double val[]); /* update SC-factorization after replacing j-th column of A */ #define scfint_ftran _glp_scfint_ftran void scfint_ftran(SCFINT *fi, double x[]); /* solve system A * x = b */ #define scfint_btran _glp_scfint_btran void scfint_btran(SCFINT *fi, double x[]); /* solve system A'* x = b */ #define scfint_estimate _glp_scfint_estimate double scfint_estimate(SCFINT *fi); /* estimate 1-norm of inv(A) */ #define scfint_delete _glp_scfint_delete void scfint_delete(SCFINT *fi); /* delete interface to SC-factorization */ #endif /* eof */ glpk-5.0/src/bflib/sgf.c0000644000062000006210000015666513766346220014315 0ustar maomkpasswd/* sgf.c (sparse Gaussian factorizer) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2012-2015 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "sgf.h" /*********************************************************************** * sgf_reduce_nuc - initial reordering to minimize nucleus size * * On entry to this routine it is assumed that V = A and F = P = Q = I, * where A is the original matrix to be factorized. It is also assumed * that matrix V = A is stored in both row- and column-wise formats. * * This routine performs (implicit) non-symmetric permutations of rows * and columns of matrix U = P'* V * Q' to reduce it to the form: * * 1 k1 k2 n * 1 x x x x x x x x x x * . x x x x x x x x x * . . x x x x x x x x * k1 . . . * * * * x x x * . . . * * * * x x x * . . . * * * * x x x * k2 . . . * * * * x x x * . . . . . . . x x x * . . . . . . . . x x * n . . . . . . . . . x * * where non-zeros in rows and columns k1, k1+1, ..., k2 constitute so * called nucleus ('*'), whose size is minimized by the routine. * * The numbers k1 and k2 are returned by the routine on exit. Usually, * if the nucleus exists, 1 <= k1 < k2 <= n. However, if the resultant * matrix U is upper triangular (has no nucleus), k1 = n+1 and k2 = n. * * Note that the routines sgf_choose_pivot and sgf_eliminate perform * exactly the same transformations (by processing row and columns * singletons), so preliminary minimization of the nucleus may not be * used. However, processing row and column singletons by the routines * sgf_minimize_nuc and sgf_singl_phase is more efficient. */ #if 1 /* 21/II-2016 */ /* Normally this routine returns zero. If the matrix is structurally * singular, the routine returns non-zero. */ #endif int sgf_reduce_nuc(LUF *luf, int *k1_, int *k2_, int cnt[/*1+n*/], int list[/*1+n*/]) { int n = luf->n; SVA *sva = luf->sva; int *sv_ind = sva->ind; int vr_ref = luf->vr_ref; int *vr_ptr = &sva->ptr[vr_ref-1]; int *vr_len = &sva->len[vr_ref-1]; int vc_ref = luf->vc_ref; int *vc_ptr = &sva->ptr[vc_ref-1]; int *vc_len = &sva->len[vc_ref-1]; int *pp_ind = luf->pp_ind; int *pp_inv = luf->pp_inv; int *qq_ind = luf->qq_ind; int *qq_inv = luf->qq_inv; int i, ii, j, jj, k1, k2, ns, ptr, end; /* initial nucleus is U = V = A */ k1 = 1, k2 = n; /*--------------------------------------------------------------*/ /* process column singletons */ /*--------------------------------------------------------------*/ /* determine initial counts of columns of V and initialize list * of active column singletons */ ns = 0; /* number of active column singletons */ for (j = 1; j <= n; j++) { if ((cnt[j] = vc_len[j]) == 1) list[++ns] = j; } /* process active column singletons */ while (ns > 0) { /* column singleton is in j-th column of V */ j = list[ns--]; #if 1 /* 21/II-2016 */ if (cnt[j] == 0) { /* j-th column in the current nucleus is actually empty */ /* this happened because on a previous step in the nucleus * there were two or more identical column singletons (that * means structural singularity), so removing one of them * from the nucleus made other columns empty */ return 1; } #endif /* find i-th row of V containing column singleton */ ptr = vc_ptr[j]; end = ptr + vc_len[j]; for (; pp_ind[i = sv_ind[ptr]] < k1; ptr++) /* nop */; xassert(ptr < end); /* permute rows and columns of U to move column singleton to * position u[k1,k1] */ ii = pp_ind[i]; luf_swap_u_rows(k1, ii); jj = qq_inv[j]; luf_swap_u_cols(k1, jj); /* nucleus size decreased */ k1++; /* walk thru i-th row of V and decrease column counts; this * may cause new column singletons to appear */ ptr = vr_ptr[i]; end = ptr + vr_len[i]; for (; ptr < end; ptr++) { if (--(cnt[j = sv_ind[ptr]]) == 1) list[++ns] = j; } } /* nucleus begins at k1-th row/column of U */ if (k1 > n) { /* U is upper triangular; no nucleus exist */ goto done; } /*--------------------------------------------------------------*/ /* process row singletons */ /*--------------------------------------------------------------*/ /* determine initial counts of rows of V and initialize list of * active row singletons */ ns = 0; /* number of active row singletons */ for (i = 1; i <= n; i++) { if (pp_ind[i] < k1) { /* corresponding row of U is above its k1-th row; set its * count to zero to prevent including it in active list */ cnt[i] = 0; } else if ((cnt[i] = vr_len[i]) == 1) list[++ns] = i; } /* process active row singletons */ while (ns > 0) { /* row singleton is in i-th row of V */ i = list[ns--]; #if 1 /* 21/II-2016 */ if (cnt[i] == 0) { /* i-th row in the current nucleus is actually empty */ /* (see comments above for similar case of empty column) */ return 2; } #endif /* find j-th column of V containing row singleton */ ptr = vr_ptr[i]; end = ptr + vr_len[i]; for (; qq_inv[j = sv_ind[ptr]] > k2; ptr++) /* nop */; xassert(ptr < end); /* permute rows and columns of U to move row singleton to * position u[k2,k2] */ ii = pp_ind[i]; luf_swap_u_rows(k2, ii); jj = qq_inv[j]; luf_swap_u_cols(k2, jj); /* nucleus size decreased */ k2--; /* walk thru j-th column of V and decrease row counts; this * may cause new row singletons to appear */ ptr = vc_ptr[j]; end = ptr + vc_len[j]; for (; ptr < end; ptr++) { if (--(cnt[i = sv_ind[ptr]]) == 1) list[++ns] = i; } } /* nucleus ends at k2-th row/column of U */ xassert(k1 < k2); done: *k1_ = k1, *k2_ = k2; return 0; } /*********************************************************************** * sgf_singl_phase - compute LU-factorization (singleton phase) * * It is assumed that on entry to the routine L = P'* F * P = F = I * and matrix U = P'* V * Q' has the following structure (provided by * the routine sgf_reduce_nuc): * * 1 k1 k2 n * 1 a a a b b b b c c c * . a a b b b b c c c * . . a b b b b c c c * k1 . . . * * * * d d d * . . . * * * * d d d * . . . * * * * d d d * k2 . . . * * * * d d d * . . . . . . . e e e * . . . . . . . . e e * n . . . . . . . . . e * * First, the routine performs (implicit) symmetric permutations of * rows and columns of matrix U to place them in the following order: * * 1, 2, ..., k1-1; n, n-1, ..., k2+1; k1, k1+1, ..., k2 * * This changes the structure of matrix U as follows: * * 1 k1 k2' n * 1 a a a c c c b b b b * . a a c c c b b b b * . . a c c c b b b b * k1 . . . e . . . . . . * . . . e e . . . . . * . . . e e e . . . . * k2'. . . d d d * * * * * . . . d d d * * * * * . . . d d d * * * * * n . . . d d d * * * * * * where k2' = n - k2 + k1. * * Then the routine performs elementary gaussian transformations to * eliminate subdiagonal elements in columns k1, ..., k2'-1 of U. The * effect is the same as if the routine sgf_eliminate would be called * for k = 1, ..., k2'-1 using diagonal elements u[k,k] as pivots. * * After elimination matrices L and U becomes the following: * * 1 k1 k2' n 1 k1 k2' n * 1 1 . . . . . . . . . 1 a a a c c c b b b b * . 1 . . . . . . . . . a a c c c b b b b * . . 1 . . . . . . . . . a c c c b b b b * k1 . . . 1 . . . . . . k1 . . . e . . . . . . * . . . e'1 . . . . . . . . . e . . . . . * . . . e'e'1 . . . . . . . . . e . . . . * k2'. . . d'd'd'1 . . . k2'. . . . . . * * * * * . . . d'd'd'. 1 . . . . . . . . * * * * * . . . d'd'd'. . 1 . . . . . . . * * * * * n . . . d'd'd'. . . 1 n . . . . . . * * * * * * matrix L matrix U * * where columns k1, ..., k2'-1 of L consist of subdiagonal elements * of initial matrix U divided by pivots u[k,k]. * * On exit the routine returns k2', the elimination step number, from * which computing of the factorization should be continued. Note that * k2' = n+1 means that matrix U is already upper triangular. */ int sgf_singl_phase(LUF *luf, int k1, int k2, int updat, int ind[/*1+n*/], double val[/*1+n*/]) { int n = luf->n; SVA *sva = luf->sva; int *sv_ind = sva->ind; double *sv_val = sva->val; int fc_ref = luf->fc_ref; int *fc_ptr = &sva->ptr[fc_ref-1]; int *fc_len = &sva->len[fc_ref-1]; int vr_ref = luf->vr_ref; int *vr_ptr = &sva->ptr[vr_ref-1]; int *vr_len = &sva->len[vr_ref-1]; double *vr_piv = luf->vr_piv; int vc_ref = luf->vc_ref; int *vc_ptr = &sva->ptr[vc_ref-1]; int *vc_len = &sva->len[vc_ref-1]; int *pp_ind = luf->pp_ind; int *pp_inv = luf->pp_inv; int *qq_ind = luf->qq_ind; int *qq_inv = luf->qq_inv; int i, j, k, ptr, ptr1, end, len; double piv; /* (see routine sgf_reduce_nuc) */ xassert((1 <= k1 && k1 < k2 && k2 <= n) || (k1 == n+1 && k2 == n)); /* perform symmetric permutations of rows/columns of U */ for (k = k1; k <= k2; k++) pp_ind[pp_inv[k]] = qq_inv[qq_ind[k]] = k - k2 + n; for (k = k2+1; k <= n; k++) pp_ind[pp_inv[k]] = qq_inv[qq_ind[k]] = n - k + k1; for (k = 1; k <= n; k++) pp_inv[pp_ind[k]] = qq_ind[qq_inv[k]] = k; /* determine k2' */ k2 = n - k2 + k1; /* process rows and columns of V corresponding to rows and * columns 1, ..., k1-1 of U */ for (k = 1; k < k1; k++) { /* k-th row of U = i-th row of V */ i = pp_inv[k]; /* find pivot u[k,k] = v[i,j] in i-th row of V */ ptr = vr_ptr[i]; end = ptr + vr_len[i]; for (; qq_inv[sv_ind[ptr]] != k; ptr++) /* nop */; xassert(ptr < end); /* store pivot */ vr_piv[i] = sv_val[ptr]; /* and remove it from i-th row of V */ sv_ind[ptr] = sv_ind[end-1]; sv_val[ptr] = sv_val[end-1]; vr_len[i]--; /* clear column of V corresponding to k-th column of U */ vc_len[qq_ind[k]] = 0; } /* clear rows of V corresponding to rows k1, ..., k2'-1 of U */ for (k = k1; k < k2; k++) vr_len[pp_inv[k]] = 0; /* process rows and columns of V corresponding to rows and * columns k2', ..., n of U */ for (k = k2; k <= n; k++) { /* k-th row of U = i-th row of V */ i = pp_inv[k]; /* remove elements from i-th row of V that correspond to * elements u[k,k1], ..., u[k,k2'-1] */ ptr = ptr1 = vr_ptr[i]; end = ptr + vr_len[i]; for (; ptr < end; ptr++) { if (qq_inv[sv_ind[ptr]] >= k2) { sv_ind[ptr1] = sv_ind[ptr]; sv_val[ptr1] = sv_val[ptr]; ptr1++; } } vr_len[i] = ptr1 - vr_ptr[i]; /* k-th column of U = j-th column of V */ j = qq_ind[k]; /* remove elements from j-th column of V that correspond to * elements u[1,k], ..., u[k1-1,k] */ ptr = ptr1 = vc_ptr[j]; end = ptr + vc_len[j]; for (; ptr < end; ptr++) { if (pp_ind[sv_ind[ptr]] >= k2) /* element value is not needed in this case */ sv_ind[ptr1++] = sv_ind[ptr]; } vc_len[j] = ptr1 - vc_ptr[j]; } /* process columns of V corresponding to columns k1, ..., k2'-1 * of U, build columns of F */ for (k = k1; k < k2; k++) { /* k-th column of U = j-th column of V */ j = qq_ind[k]; /* remove elements from j-th column of V that correspond to * pivot (diagonal) element u[k,k] and subdiagonal elements * u[k+1,k], ..., u[n,k]; subdiagonal elements are stored for * further addition to matrix F */ len = 0; piv = 0.0; ptr = vc_ptr[j]; end = ptr + vc_len[j]; for (; ptr < end; ptr++) { i = sv_ind[ptr]; /* v[i,j] */ if (pp_ind[i] == k) { /* store pivot v[i,j] = u[k,k] */ piv = vr_piv[i] = sv_val[ptr]; } else if (pp_ind[i] > k) { /* store subdiagonal element v[i,j] = u[i',k] */ len++; ind[len] = i; val[len] = sv_val[ptr]; } } /* clear j-th column of V = k-th column of U */ vc_len[j] = 0; /* build k-th column of L = j-th column of F */ j = pp_inv[k]; xassert(piv != 0.0); if (len > 0) { if (sva->r_ptr - sva->m_ptr < len) { sva_more_space(sva, len); sv_ind = sva->ind; sv_val = sva->val; } sva_reserve_cap(sva, fc_ref-1+j, len); for (ptr = fc_ptr[j], ptr1 = 1; ptr1 <= len; ptr++, ptr1++) { sv_ind[ptr] = ind[ptr1]; sv_val[ptr] = val[ptr1] / piv; } fc_len[j] = len; } } /* if it is not planned to update matrix V, relocate all its * non-active rows corresponding to rows 1, ..., k2'-1 of U to * the right (static) part of SVA */ if (!updat) { for (k = 1; k < k2; k++) { i = pp_inv[k]; len = vr_len[i]; if (sva->r_ptr - sva->m_ptr < len) { sva_more_space(sva, len); sv_ind = sva->ind; sv_val = sva->val; } sva_make_static(sva, vr_ref-1+i); } } /* elimination steps 1, ..., k2'-1 have been performed */ return k2; } /*********************************************************************** * sgf_choose_pivot - choose pivot element v[p,q] * * This routine chooses pivot element v[p,q], k <= p, q <= n, in the * active submatrix of matrix V = P * U * Q, where k is the number of * current elimination step, 1 <= k <= n. * * It is assumed that on entry to the routine matrix U = P'* V * Q' has * the following partially triangularized form: * * 1 k n * 1 x x x x x x x x x x * . x x x x x x x x x * . . x x x x x x x x * . . . x x x x x x x * k . . . . * * * * * * * . . . . * * * * * * * . . . . * * * * * * * . . . . * * * * * * * . . . . * * * * * * * n . . . . * * * * * * * * where rows and columns k, k+1, ..., n belong to the active submatrix * (its elements are marked by '*'). * * Since the matrix U is not stored, the routine works with the matrix * V = P * U * Q. It is assumed that the row-wise representation * corresponds to the matrix V, but the column-wise representation * corresponds to the active submatrix of the matrix V, i.e. elements, * which are not in the active submatrix, are not included in column * vectors. It is also assumed that each active row of the matrix V is * in the set R[len], where len is the number of non-zeros in the row, * and each active column of the matrix V is in the set C[len], where * len is the number of non-zeros in the column (in the latter case * only elements of the active submatrix are counted; such elements are * marked by '*' on the figure above). * * For the reason of numerical stability the routine applies so called * threshold pivoting proposed by J.Reid. It is assumed that an element * v[i,j] can be selected as a pivot candidate if it is not very small * (in magnitude) among other elements in the same row, i.e. if it * satisfies to the stability condition |v[i,j]| >= tol * max|v[i,*]|, * where 0 < tol < 1 is a given tolerance. * * In order to keep sparsity of the matrix V the routine uses Markowitz * strategy, trying to choose such element v[p,q], which satisfies to * the stability condition (see above) and has smallest Markowitz cost * (nr[p]-1) * (nc[q]-1), where nr[p] and nc[q] are, resp., numbers of * non-zeros in p-th row and q-th column of the active submatrix. * * In order to reduce the search, i.e. not to walk through all elements * of the active submatrix, the routine uses a technique proposed by * I.Duff. This technique is based on using the sets R[len] and C[len] * of active rows and columns. * * If the pivot element v[p,q] has been chosen, the routine stores its * indices to locations *p and *q and returns zero. Otherwise, non-zero * is returned. */ int sgf_choose_pivot(SGF *sgf, int *p_, int *q_) { LUF *luf = sgf->luf; int n = luf->n; SVA *sva = luf->sva; int *sv_ind = sva->ind; double *sv_val = sva->val; int vr_ref = luf->vr_ref; int *vr_ptr = &sva->ptr[vr_ref-1]; int *vr_len = &sva->len[vr_ref-1]; int vc_ref = luf->vc_ref; int *vc_ptr = &sva->ptr[vc_ref-1]; int *vc_len = &sva->len[vc_ref-1]; int *rs_head = sgf->rs_head; int *rs_next = sgf->rs_next; int *cs_head = sgf->cs_head; int *cs_prev = sgf->cs_prev; int *cs_next = sgf->cs_next; double *vr_max = sgf->vr_max; double piv_tol = sgf->piv_tol; int piv_lim = sgf->piv_lim; int suhl = sgf->suhl; int i, i_ptr, i_end, j, j_ptr, j_end, len, min_i, min_j, min_len, ncand, next_j, p, q; double best, big, cost, temp; /* no pivot candidate has been chosen so far */ p = q = 0, best = DBL_MAX, ncand = 0; /* if the active submatrix contains a column having the only * non-zero element (column singleton), choose it as the pivot */ j = cs_head[1]; if (j != 0) { xassert(vc_len[j] == 1); p = sv_ind[vc_ptr[j]], q = j; goto done; } /* if the active submatrix contains a row having the only * non-zero element (row singleton), choose it as the pivot */ i = rs_head[1]; if (i != 0) { xassert(vr_len[i] == 1); p = i, q = sv_ind[vr_ptr[i]]; goto done; } /* the active submatrix contains no singletons; walk thru its * other non-empty rows and columns */ for (len = 2; len <= n; len++) { /* consider active columns containing len non-zeros */ for (j = cs_head[len]; j != 0; j = next_j) { /* save the number of next column of the same length */ next_j = cs_next[j]; /* find an element in j-th column, which is placed in the * row with minimal number of non-zeros and satisfies to * the stability condition (such element may not exist) */ min_i = min_j = 0, min_len = INT_MAX; for (j_end = (j_ptr = vc_ptr[j]) + vc_len[j]; j_ptr < j_end; j_ptr++) { /* get row index of v[i,j] */ i = sv_ind[j_ptr]; /* if i-th row is not shorter, skip v[i,j] */ if (vr_len[i] >= min_len) continue; /* big := max|v[i,*]| */ if ((big = vr_max[i]) < 0.0) { /* largest magnitude is unknown; compute it */ for (i_end = (i_ptr = vr_ptr[i]) + vr_len[i]; i_ptr < i_end; i_ptr++) { if ((temp = sv_val[i_ptr]) < 0.0) temp = -temp; if (big < temp) big = temp; } xassert(big > 0.0); vr_max[i] = big; } /* find v[i,j] in i-th row */ for (i_end = (i_ptr = vr_ptr[i]) + vr_len[i]; sv_ind[i_ptr] != j; i_ptr++) /* nop */; xassert(i_ptr < i_end); /* if |v[i,j]| < piv_tol * max|v[i,*]|, skip v[i,j] */ if ((temp = sv_val[i_ptr]) < 0.0) temp = -temp; if (temp < piv_tol * big) continue; /* v[i,j] is a better candidate */ min_i = i, min_j = j, min_len = vr_len[i]; /* if Markowitz cost of v[i,j] is not greater than * (len-1)**2, v[i,j] can be chosen as the pivot right * now; this heuristic reduces the search and works well * in many cases */ if (min_len <= len) { p = min_i, q = min_j; goto done; } } /* j-th column has been scanned */ if (min_i != 0) { /* element v[min_i,min_j] is a next pivot candidate */ ncand++; /* compute its Markowitz cost */ cost = (double)(min_len - 1) * (double)(len - 1); /* if this element is better, choose it as the pivot */ if (cost < best) p = min_i, q = min_j, best = cost; /* if piv_lim candidates were considered, terminate * the search, because it is doubtful that a much better * candidate will be found */ if (ncand == piv_lim) goto done; } else if (suhl) { /* j-th column has no eligible elements that satisfy to * the stability criterion; Uwe Suhl suggests to exclude * such column from further considerations until it * becomes a column singleton; in hard cases this may * significantly reduce the time needed to choose the * pivot element */ sgf_deactivate_col(j); cs_prev[j] = cs_next[j] = j; } } /* consider active rows containing len non-zeros */ for (i = rs_head[len]; i != 0; i = rs_next[i]) { /* big := max|v[i,*]| */ if ((big = vr_max[i]) < 0.0) { /* largest magnitude is unknown; compute it */ for (i_end = (i_ptr = vr_ptr[i]) + vr_len[i]; i_ptr < i_end; i_ptr++) { if ((temp = sv_val[i_ptr]) < 0.0) temp = -temp; if (big < temp) big = temp; } xassert(big > 0.0); vr_max[i] = big; } /* find an element in i-th row, which is placed in the * column with minimal number of non-zeros and satisfies to * the stability condition (such element always exists) */ min_i = min_j = 0, min_len = INT_MAX; for (i_end = (i_ptr = vr_ptr[i]) + vr_len[i]; i_ptr < i_end; i_ptr++) { /* get column index of v[i,j] */ j = sv_ind[i_ptr]; /* if j-th column is not shorter, skip v[i,j] */ if (vc_len[j] >= min_len) continue; /* if |v[i,j]| < piv_tol * max|v[i,*]|, skip v[i,j] */ if ((temp = sv_val[i_ptr]) < 0.0) temp = -temp; if (temp < piv_tol * big) continue; /* v[i,j] is a better candidate */ min_i = i, min_j = j, min_len = vc_len[j]; /* if Markowitz cost of v[i,j] is not greater than * (len-1)**2, v[i,j] can be chosen as the pivot right * now; this heuristic reduces the search and works well * in many cases */ if (min_len <= len) { p = min_i, q = min_j; goto done; } } /* i-th row has been scanned */ if (min_i != 0) { /* element v[min_i,min_j] is a next pivot candidate */ ncand++; /* compute its Markowitz cost */ cost = (double)(len - 1) * (double)(min_len - 1); /* if this element is better, choose it as the pivot */ if (cost < best) p = min_i, q = min_j, best = cost; /* if piv_lim candidates were considered, terminate * the search, because it is doubtful that a much better * candidate will be found */ if (ncand == piv_lim) goto done; } else { /* this can never be */ xassert(min_i != min_i); } } } done: /* report the pivot to the factorization routine */ *p_ = p, *q_ = q; return (p == 0); } /*********************************************************************** * sgf_eliminate - perform gaussian elimination * * This routine performs elementary gaussian transformations in order * to eliminate subdiagonal elements in k-th column of matrix * U = P'* V * Q' using pivot element u[k,k], where k is the number of * current elimination step, 1 <= k <= n. * * The parameters p and q specify, resp., row and column indices of the * pivot element v[p,q] = u[k,k]. * * On entry the routine assumes that partially triangularized matrices * L = P'* F * P and U = P'* V * Q' have the following structure: * * 1 k n 1 k n * 1 1 . . . . . . . . . 1 x x x x x x x x x x * x 1 . . . . . . . . . x x x x x x x x x * x x 1 . . . . . . . . . x x x x x x x x * x x x 1 . . . . . . . . . x x x x x x x * k x x x x 1 . . . . . k . . . . * * * * * * * x x x x _ 1 . . . . . . . . # * * * * * * x x x x _ . 1 . . . . . . . # * * * * * * x x x x _ . . 1 . . . . . . # * * * * * * x x x x _ . . . 1 . . . . . # * * * * * * n x x x x _ . . . . 1 n . . . . # * * * * * * * matrix L matrix U * * where rows and columns k, k+1, ..., n of matrix U constitute the * active submatrix. Elements to be eliminated are marked by '#', and * other elements of the active submatrix are marked by '*'. May note * that each eliminated non-zero element u[i,k] of matrix U gives * corresponding non-zero element l[i,k] of matrix L (marked by '_'). * * Actually all operations are performed on matrix V. It is assumed * that the row-wise representation corresponds to matrix V, but the * column-wise representation corresponds to the active submatrix of * matrix V (or, more precisely, to its pattern, because only row * indices for columns of the active submatrix are used on this stage). * * Let u[k,k] = v[p,q] be the pivot. In order to eliminate subdiagonal * elements u[i',k] = v[i,q], i'= k+1, k+2, ..., n, the routine applies * the following elementary gaussian transformations: * * (i-th row of V) := (i-th row of V) - f[i,p] * (p-th row of V), * * where f[i,p] = v[i,q] / v[p,q] is a gaussian multiplier stored to * p-th column of matrix F to keep the main equality A = F * V * (corresponding elements l[i',k] of matrix L are marked by '_' on the * figure above). * * NOTE: On entry to the routine the working arrays flag and work * should contain zeros. This status is retained by the routine * on exit. */ int sgf_eliminate(SGF *sgf, int p, int q) { LUF *luf = sgf->luf; int n = luf->n; SVA *sva = luf->sva; int *sv_ind = sva->ind; double *sv_val = sva->val; int fc_ref = luf->fc_ref; int *fc_ptr = &sva->ptr[fc_ref-1]; int *fc_len = &sva->len[fc_ref-1]; int vr_ref = luf->vr_ref; int *vr_ptr = &sva->ptr[vr_ref-1]; int *vr_len = &sva->len[vr_ref-1]; int *vr_cap = &sva->cap[vr_ref-1]; double *vr_piv = luf->vr_piv; int vc_ref = luf->vc_ref; int *vc_ptr = &sva->ptr[vc_ref-1]; int *vc_len = &sva->len[vc_ref-1]; int *vc_cap = &sva->cap[vc_ref-1]; int *rs_head = sgf->rs_head; int *rs_prev = sgf->rs_prev; int *rs_next = sgf->rs_next; int *cs_head = sgf->cs_head; int *cs_prev = sgf->cs_prev; int *cs_next = sgf->cs_next; double *vr_max = sgf->vr_max; char *flag = sgf->flag; double *work = sgf->work; double eps_tol = sgf->eps_tol; int nnz_diff = 0; int fill, i, i_ptr, i_end, j, j_ptr, j_end, ptr, len, loc, loc1; double vpq, fip, vij; xassert(1 <= p && p <= n); xassert(1 <= q && q <= n); /* remove p-th row from the active set; this row will never * return there */ sgf_deactivate_row(p); /* process p-th (pivot) row */ ptr = 0; for (i_end = (i_ptr = vr_ptr[p]) + vr_len[p]; i_ptr < i_end; i_ptr++) { /* get column index of v[p,j] */ j = sv_ind[i_ptr]; if (j == q) { /* save pointer to pivot v[p,q] */ ptr = i_ptr; } else { /* store v[p,j], j != q, to working array */ flag[j] = 1; work[j] = sv_val[i_ptr]; } /* remove j-th column from the active set; q-th column will * never return there while other columns will return to the * active set with new length */ if (cs_next[j] == j) { /* j-th column was marked by the pivoting routine according * to Uwe Suhl's suggestion and is already inactive */ xassert(cs_prev[j] == j); } else sgf_deactivate_col(j); nnz_diff -= vc_len[j]; /* find and remove v[p,j] from j-th column */ for (j_end = (j_ptr = vc_ptr[j]) + vc_len[j]; sv_ind[j_ptr] != p; j_ptr++) /* nop */; xassert(j_ptr < j_end); sv_ind[j_ptr] = sv_ind[j_end-1]; vc_len[j]--; } /* save pivot v[p,q] and remove it from p-th row */ xassert(ptr > 0); vpq = vr_piv[p] = sv_val[ptr]; sv_ind[ptr] = sv_ind[i_end-1]; sv_val[ptr] = sv_val[i_end-1]; vr_len[p]--; /* if it is not planned to update matrix V, relocate p-th row to * the right (static) part of SVA */ if (!sgf->updat) { len = vr_len[p]; if (sva->r_ptr - sva->m_ptr < len) { sva_more_space(sva, len); sv_ind = sva->ind; sv_val = sva->val; } sva_make_static(sva, vr_ref-1+p); } /* copy the pattern (row indices) of q-th column of the active * submatrix (from which v[p,q] has been just removed) to p-th * column of matrix F (without unity diagonal element) */ len = vc_len[q]; if (len > 0) { if (sva->r_ptr - sva->m_ptr < len) { sva_more_space(sva, len); sv_ind = sva->ind; sv_val = sva->val; } sva_reserve_cap(sva, fc_ref-1+p, len); memcpy(&sv_ind[fc_ptr[p]], &sv_ind[vc_ptr[q]], len * sizeof(int)); fc_len[p] = len; } /* make q-th column of the active submatrix empty */ vc_len[q] = 0; /* transform non-pivot rows of the active submatrix */ for (loc = fc_len[p]-1; loc >= 0; loc--) { /* get row index of v[i,q] = row index of f[i,p] */ i = sv_ind[fc_ptr[p] + loc]; xassert(i != p); /* v[p,q] was removed */ /* remove i-th row from the active set; this row will return * there with new length */ sgf_deactivate_row(i); /* find v[i,q] in i-th row */ for (i_end = (i_ptr = vr_ptr[i]) + vr_len[i]; sv_ind[i_ptr] != q; i_ptr++) /* nop */; xassert(i_ptr < i_end); /* compute gaussian multiplier f[i,p] = v[i,q] / v[p,q] */ fip = sv_val[fc_ptr[p] + loc] = sv_val[i_ptr] / vpq; /* remove v[i,q] from i-th row */ sv_ind[i_ptr] = sv_ind[i_end-1]; sv_val[i_ptr] = sv_val[i_end-1]; vr_len[i]--; /* perform elementary gaussian transformation: * (i-th row) := (i-th row) - f[i,p] * (p-th row) * note that p-th row of V, which is in the working array, * doesn't contain pivot v[p,q], and i-th row of V doesn't * contain v[i,q] to be eliminated */ /* walk thru i-th row and transform existing elements */ fill = vr_len[p]; for (i_end = (i_ptr = ptr = vr_ptr[i]) + vr_len[i]; i_ptr < i_end; i_ptr++) { /* get column index and value of v[i,j] */ j = sv_ind[i_ptr]; vij = sv_val[i_ptr]; if (flag[j]) { /* v[p,j] != 0 */ flag[j] = 0, fill--; /* v[i,j] := v[i,j] - f[i,p] * v[p,j] */ vij -= fip * work[j]; if (-eps_tol < vij && vij < +eps_tol) { /* new v[i,j] is close to zero; remove it from the * active submatrix, i.e. replace it by exact zero */ /* find and remove v[i,j] from j-th column */ for (j_end = (j_ptr = vc_ptr[j]) + vc_len[j]; sv_ind[j_ptr] != i; j_ptr++) /* nop */; xassert(j_ptr < j_end); sv_ind[j_ptr] = sv_ind[j_end-1]; vc_len[j]--; continue; } } /* keep new v[i,j] in i-th row */ sv_ind[ptr] = j; sv_val[ptr] = vij; ptr++; } /* (new length of i-th row may decrease because of numerical * cancellation) */ vr_len[i] = len = ptr - vr_ptr[i]; /* now flag[*] is the pattern of the set v[p,*] \ v[i,*], and * fill is the number of non-zeros in this set */ if (fill == 0) { /* no fill-in occurs */ /* walk thru p-th row and restore the column flags */ for (i_end = (i_ptr = vr_ptr[p]) + vr_len[p]; i_ptr < i_end; i_ptr++) flag[sv_ind[i_ptr]] = 1; /* v[p,j] != 0 */ goto skip; } /* up to fill new non-zero elements may appear in i-th row due * to fill-in; reserve locations for these elements (note that * actual length of i-th row is currently stored in len) */ if (vr_cap[i] < len + fill) { if (sva->r_ptr - sva->m_ptr < len + fill) { sva_more_space(sva, len + fill); sv_ind = sva->ind; sv_val = sva->val; } sva_enlarge_cap(sva, vr_ref-1+i, len + fill, 0); } vr_len[i] += fill; /* walk thru p-th row and add new elements to i-th row */ for (loc1 = vr_len[p]-1; loc1 >= 0; loc1--) { /* get column index of v[p,j] */ j = sv_ind[vr_ptr[p] + loc1]; if (!flag[j]) { /* restore j-th column flag */ flag[j] = 1; /* v[i,j] was computed earlier on transforming existing * elements of i-th row */ continue; } /* v[i,j] := 0 - f[i,p] * v[p,j] */ vij = - fip * work[j]; if (-eps_tol < vij && vij < +eps_tol) { /* new v[i,j] is close to zero; do not add it to the * active submatrix, i.e. replace it by exact zero */ continue; } /* add new v[i,j] to i-th row */ sv_ind[ptr = vr_ptr[i] + (len++)] = j; sv_val[ptr] = vij; /* add new v[i,j] to j-th column */ if (vc_cap[j] == vc_len[j]) { /* we reserve extra locations in j-th column to reduce * further relocations of that column */ #if 1 /* FIXME */ /* use control parameter to specify the number of extra * locations reserved */ int need = vc_len[j] + 10; #endif if (sva->r_ptr - sva->m_ptr < need) { sva_more_space(sva, need); sv_ind = sva->ind; sv_val = sva->val; } sva_enlarge_cap(sva, vc_ref-1+j, need, 1); } sv_ind[vc_ptr[j] + (vc_len[j]++)] = i; } /* set final length of i-th row just transformed */ xassert(len <= vr_len[i]); vr_len[i] = len; skip: /* return i-th row to the active set with new length */ sgf_activate_row(i); /* since i-th row has been changed, largest magnitude of its * elements becomes unknown */ vr_max[i] = -1.0; } /* walk thru p-th (pivot) row */ for (i_end = (i_ptr = vr_ptr[p]) + vr_len[p]; i_ptr < i_end; i_ptr++) { /* get column index of v[p,j] */ j = sv_ind[i_ptr]; xassert(j != q); /* v[p,q] was removed */ /* return j-th column to the active set with new length */ if (cs_next[j] == j && vc_len[j] != 1) { /* j-th column was marked by the pivoting routine and it is * still not a column singleton, so leave it incative */ xassert(cs_prev[j] == j); } else sgf_activate_col(j); nnz_diff += vc_len[j]; /* restore zero content of the working arrays */ flag[j] = 0; work[j] = 0.0; } /* return the difference between the numbers of non-zeros in the * active submatrix on entry and on exit, resp. */ return nnz_diff; } /*********************************************************************** * sgf_dense_lu - compute dense LU-factorization with full pivoting * * This routine performs Gaussian elimination with full pivoting to * compute dense LU-factorization of the specified matrix A of order n * in the form: * * A = P * L * U * Q, (1) * * where L is lower triangular matrix with unit diagonal, U is upper * triangular matrix, P and Q are permutation matrices. * * On entry to the routine elements of matrix A = (a[i,j]) should be * placed in the array elements a[0], ..., a[n^2-1] in dense row-wise * format. On exit from the routine matrix A is replaced by factors L * and U as follows: * * u[1,1] u[1,2] ... u[1,n-1] u[1,n] * l[2,1] u[2,2] ... u[2,n-1] u[2,n] * . . . . . . . . . . . . . . * l[n-1,1] l[n-1,2] u[n-1,n-1] u[n-1,n] * l[n,1] l[n,2] ... l[n,n-1] u[n,n] * * The unit diagonal elements of L are not stored. * * Information on permutations of rows and columns of active submatrix * during factorization is accumulated by the routine as follows. Every * time the routine permutes rows i and i' or columns j and j', it also * permutes elements r[i-1] and r[i'-1] or c[j-1] and c[j'-1], resp. * Thus, on entry to the routine elements r[0], r[1], ..., r[n-1] and * c[0], c[1], ..., c[n-1] should be initialized by some integers that * identify rows and columns of the original matrix A. * * If the factorization has been successfully computed, the routine * returns zero. Otherwise, if on k-th elimination step, 1 <= k <= n, * all elements of the active submatrix are close to zero, the routine * returns k, in which case a partial factorization is stored in the * array a. */ int sgf_dense_lu(int n, double a_[], int r[], int c[], double eps) { /* non-optimized version */ int i, j, k, p, q, ref; double akk, big, temp; # define a(i,j) a_[(i)*n+(j)] /* initially U = A, L = P = Q = I */ /* main elimination loop */ for (k = 0; k < n; k++) { /* choose pivot u[p,q], k <= p, q <= n */ p = q = -1, big = eps; for (i = k; i < n; i++) { for (j = k; j < n; j++) { /* temp = |u[i,j]| */ if ((temp = a(i,j)) < 0.0) temp = -temp; if (big < temp) p = i, q = j, big = temp; } } if (p < 0) { /* k-th elimination step failed */ return k+1; } /* permute rows k and p */ if (k != p) { for (j = 0; j < n; j++) temp = a(k,j), a(k,j) = a(p,j), a(p,j) = temp; ref = r[k], r[k] = r[p], r[p] = ref; } /* permute columns k and q */ if (k != q) { for (i = 0; i < n; i++) temp = a(i,k), a(i,k) = a(i,q), a(i,q) = temp; ref = c[k], c[k] = c[q], c[q] = ref; } /* now pivot is in position u[k,k] */ akk = a(k,k); /* eliminate subdiagonal elements u[k+1,k], ..., u[n,k] */ for (i = k+1; i < n; i++) { if (a(i,k) != 0.0) { /* gaussian multiplier l[i,k] := u[i,k] / u[k,k] */ temp = (a(i,k) /= akk); /* (i-th row) := (i-th row) - l[i,k] * (k-th row) */ for (j = k+1; j < n; j++) a(i,j) -= temp * a(k,j); } } } # undef a return 0; } /*********************************************************************** * sgf_dense_phase - compute LU-factorization (dense phase) * * This routine performs dense phase of computing LU-factorization. * * The aim is two-fold. First, the main factorization routine switches * to dense phase when the active submatrix is relatively dense, so * using dense format allows significantly reduces overheads needed to * maintain sparse data structures. And second, that is more important, * on dense phase full pivoting is used (rather than partial pivoting) * that allows improving numerical stability, since round-off errors * tend to increase on last steps of the elimination process. * * On entry the routine assumes that elimination steps 1, 2, ..., k-1 * have been performed, so partially transformed matrices L = P'* F * P * and U = P'* V * Q' have the following structure: * * 1 k n 1 k n * 1 1 . . . . . . . . . 1 x x x x x x x x x x * x 1 . . . . . . . . . x x x x x x x x x * x x 1 . . . . . . . . . x x x x x x x x * x x x 1 . . . . . . . . . x x x x x x x * k x x x x 1 . . . . . k . . . . * * * * * * * x x x x . 1 . . . . . . . . * * * * * * * x x x x . . 1 . . . . . . . * * * * * * * x x x x . . . 1 . . . . . . * * * * * * * x x x x . . . . 1 . . . . . * * * * * * * n x x x x . . . . . 1 n . . . . * * * * * * * * matrix L matrix U * * where rows and columns k, k+1, ..., n of matrix U constitute the * active submatrix A~, whose elements are marked by '*'. * * The routine copies the active submatrix A~ to a working array in * dense format, compute dense factorization A~ = P~* L~* U~* Q~ using * full pivoting, and then copies non-zero elements of factors L~ and * U~ back to factors L and U (more precisely, to factors F and V). * * If the factorization has been successfully computed, the routine * returns zero. Otherwise, if on k-th elimination step, 1 <= k <= n, * all elements of the active submatrix are close to zero, the routine * returns k (information on linearly dependent rows/columns in this * case is provided by matrices P and Q). */ int sgf_dense_phase(LUF *luf, int k, int updat) { int n = luf->n; SVA *sva = luf->sva; int *sv_ind = sva->ind; double *sv_val = sva->val; int fc_ref = luf->fc_ref; int *fc_ptr = &sva->ptr[fc_ref-1]; int *fc_len = &sva->len[fc_ref-1]; int *fc_cap = &sva->cap[fc_ref-1]; int vr_ref = luf->vr_ref; int *vr_ptr = &sva->ptr[vr_ref-1]; int *vr_len = &sva->len[vr_ref-1]; int *vr_cap = &sva->cap[vr_ref-1]; double *vr_piv = luf->vr_piv; int vc_ref = luf->vc_ref; int *vc_len = &sva->len[vc_ref-1]; int *pp_inv = luf->pp_inv; int *pp_ind = luf->pp_ind; int *qq_ind = luf->qq_ind; int *qq_inv = luf->qq_inv; int a_end, a_ptr, end, i, ia, ii, j, ja, jj, ka, len, na, ne, need, ptr; double *a_; xassert(1 <= k && k <= n); /* active columns of V are not longer needed; make them empty */ for (jj = k; jj <= n; jj++) { /* jj is number of active column of U = P'* V * Q' */ vc_len[qq_ind[jj]] = 0; } /* determine order of active submatrix A~ of matrix U */ na = n - k + 1; xassert(1 <= na && na <= n); /* determine number of elements in dense triangular factor (L~ or * U~), except diagonal elements */ ne = na * (na - 1) / 2; /* we allocate active submatrix A~ in free (middle) part of SVA; * to avoid defragmentation that could destroy A~ we also should * reserve ne locations to build rows of V from rows of U~ and ne * locations to build columns of F from columns of L~ */ need = na * na + ne + ne; if (sva->r_ptr - sva->m_ptr < need) { sva_more_space(sva, need); sv_ind = sva->ind; sv_val = sva->val; } /* free (middle) part of SVA is structured as follows: * end of left (dynamic) part * ne free locations for new rows of V * na free locations for active submatrix A~ * unused locations, if any * ne free locations for new columns of F * beginning of right (static) part */ a_ptr = sva->m_ptr + ne; a_end = a_ptr + na * na; /* copy active submatrix A~ from matrix V to working array in * dense row-wise format */ a_ = &sva->val[a_ptr]; # define a(ia, ja) a_[((ia) - 1) * na + ((ja) - 1)] for (ia = 1; ia <= na; ia++) { /* clear ia-th row of A~ */ for (ja = 1; ja <= na; ja++) a(ia, ja) = 0.0; /* ia-th row of A~ = (k-1+ia)-th row of U = i-th row of V */ i = pp_inv[k-1+ia]; ptr = vr_ptr[i]; end = ptr + vr_len[i]; for (; ptr < end; ptr++) a(ia, qq_inv[sv_ind[ptr]]-k+1) = sv_val[ptr]; /* i-th row of V is no longer needed; make it empty */ vr_len[i] = 0; } /* compute dense factorization A~ = P~* L~* U~* Q~ */ #if 1 /* FIXME: epsilon tolerance */ ka = sgf_dense_lu(na, &a(1, 1), &pp_inv[k], &qq_ind[k], 1e-20); #endif /* rows of U with numbers pp_inv[k, k+1, ..., n] were permuted * due to row permutations of A~; update matrix P using P~ */ for (ii = k; ii <= n; ii++) pp_ind[pp_inv[ii]] = ii; /* columns of U with numbers qq_ind[k, k+1, ..., n] were permuted * due to column permutations of A~; update matrix Q using Q~ */ for (jj = k; jj <= n; jj++) qq_inv[qq_ind[jj]] = jj; /* check if dense factorization is complete */ if (ka != 0) { /* A~ is singular to working precision */ /* information on linearly dependent rows/columns is provided * by matrices P and Q */ xassert(1 <= ka && ka <= na); return k - 1 + ka; } /* build new rows of V from rows of U~ */ for (ia = 1; ia <= na; ia++) { /* ia-th row of U~ = (k-1+ia)-th row of U = i-th row of V */ i = pp_inv[k-1+ia]; xassert(vr_len[i] == 0); /* store diagonal element u~[ia,ia] */ vr_piv[i] = a(ia, ia); /* determine number of non-zero non-diagonal elements in ia-th * row of U~ */ len = 0; for (ja = ia+1; ja <= na; ja++) { if (a(ia, ja) != 0.0) len++; } /* reserve len locations for i-th row of matrix V in left * (dynamic) part of SVA */ if (vr_cap[i] < len) { /* there should be enough room in free part of SVA */ xassert(sva->r_ptr - sva->m_ptr >= len); sva_enlarge_cap(sva, vr_ref-1+i, len, 0); /* left part of SVA should not overlap matrix A~ */ xassert(sva->m_ptr <= a_ptr); } /* copy non-zero non-diaginal elements of ia-th row of U~ to * i-th row of V */ ptr = vr_ptr[i]; for (ja = ia+1; ja <= na; ja++) { if (a(ia, ja) != 0.0) { sv_ind[ptr] = qq_ind[k-1+ja]; sv_val[ptr] = a(ia, ja); ptr++; } } xassert(ptr - vr_ptr[i] == len); vr_len[i] = len; } /* build new columns of F from columns of L~ */ for (ja = 1; ja <= na; ja++) { /* ja-th column of L~ = (k-1+ja)-th column of L = j-th column * of F */ j = pp_inv[k-1+ja]; xassert(fc_len[j] == 0); xassert(fc_cap[j] == 0); /* determine number of non-zero non-diagonal elements in ja-th * column of L~ */ len = 0; for (ia = ja+1; ia <= na; ia++) { if (a(ia, ja) != 0.0) len++; } /* reserve len locations for j-th column of matrix F in right * (static) part of SVA */ /* there should be enough room in free part of SVA */ xassert(sva->r_ptr - sva->m_ptr >= len); if (len > 0) sva_reserve_cap(sva, fc_ref-1+j, len); /* right part of SVA should not overlap matrix A~ */ xassert(a_end <= sva->r_ptr); /* copy non-zero non-diagonal elements of ja-th column of L~ * to j-th column of F */ ptr = fc_ptr[j]; for (ia = ja+1; ia <= na; ia++) { if (a(ia, ja) != 0.0) { sv_ind[ptr] = pp_inv[k-1+ia]; sv_val[ptr] = a(ia, ja); ptr++; } } xassert(ptr - fc_ptr[j] == len); fc_len[j] = len; } /* factors L~ and U~ are no longer needed */ # undef a /* if it is not planned to update matrix V, relocate all its new * rows to the right (static) part of SVA */ if (!updat) { for (ia = 1; ia <= na; ia++) { i = pp_inv[k-1+ia]; len = vr_len[i]; if (sva->r_ptr - sva->m_ptr < len) { sva_more_space(sva, len); sv_ind = sva->ind; sv_val = sva->val; } sva_make_static(sva, vr_ref-1+i); } } return 0; } /*********************************************************************** * sgf_factorize - compute LU-factorization (main routine) * * This routine computes sparse LU-factorization of specified matrix A * using Gaussian elimination. * * On entry to the routine matrix V = A should be stored in column-wise * format. * * If the factorization has been successfully computed, the routine * returns zero. Otherwise, if on k-th elimination step, 1 <= k <= n, * all elements of the active submatrix are close to zero, the routine * returns k (information on linearly dependent rows/columns in this * case is provided by matrices P and Q). */ #if 1 /* 21/II-2016 */ /* If the matrix A is structurally singular, the routine returns -1. * NOTE: This case can be detected only if the singl flag is set. */ #endif int sgf_factorize(SGF *sgf, int singl) { LUF *luf = sgf->luf; int n = luf->n; SVA *sva = luf->sva; int vr_ref = luf->vr_ref; int *vr_len = &sva->len[vr_ref-1]; double *vr_piv = luf->vr_piv; int vc_ref = luf->vc_ref; int *vc_len = &sva->len[vc_ref-1]; int *pp_ind = luf->pp_ind; int *pp_inv = luf->pp_inv; int *qq_ind = luf->qq_ind; int *qq_inv = luf->qq_inv; int *rs_head = sgf->rs_head; int *rs_prev = sgf->rs_prev; int *rs_next = sgf->rs_next; int *cs_head = sgf->cs_head; int *cs_prev = sgf->cs_prev; int *cs_next = sgf->cs_next; double *vr_max = sgf->vr_max; char *flag = sgf->flag; double *work = sgf->work; int i, j, k, k1, k2, p, q, nnz; /* build matrix V = A in row-wise format */ luf_build_v_rows(luf, rs_prev); /* P := Q := I, so V = U = A, F = L = I */ for (k = 1; k <= n; k++) { vr_piv[k] = 0.0; pp_ind[k] = pp_inv[k] = qq_ind[k] = qq_inv[k] = k; } #ifdef GLP_DEBUG sva_check_area(sva); luf_check_all(luf, 1); #endif /* perform singleton phase, if required */ if (!singl) { /* assume that nucleus is entire matrix U */ k2 = 1; } else { /* minimize nucleus size */ #if 0 /* 21/II-2016 */ sgf_reduce_nuc(luf, &k1, &k2, rs_prev, rs_next); #else if (sgf_reduce_nuc(luf, &k1, &k2, rs_prev, rs_next)) return -1; #endif #ifdef GLP_DEBUG xprintf("n = %d; k1 = %d; k2 = %d\n", n, k1, k2); #endif /* perform singleton phase */ k2 = sgf_singl_phase(luf, k1, k2, sgf->updat, rs_prev, work); } #ifdef GLP_DEBUG sva_check_area(sva); luf_check_all(luf, k2); #endif /* initialize working arrays */ rs_head[0] = cs_head[0] = 0; for (k = 1; k <= n; k++) { rs_head[k] = cs_head[k] = 0; vr_max[k] = -1.0; flag[k] = 0; work[k] = 0.0; } /* build lists of active rows and columns of matrix V; determine * number of non-zeros in initial active submatrix */ nnz = 0; for (k = k2; k <= n; k++) { i = pp_inv[k]; sgf_activate_row(i); nnz += vr_len[i]; j = qq_ind[k]; sgf_activate_col(j); } /* main factorization loop */ for (k = k2; k <= n; k++) { int na; double den; /* calculate density of active submatrix */ na = n - k + 1; /* order of active submatrix */ #if 0 /* 21/VIII-2014 */ den = (double)nnz / (double)(na * na); #else den = (double)nnz / ((double)(na) * (double)(na)); #endif /* if active submatrix is relatively dense, switch to dense * phase */ #if 1 /* FIXME */ if (na >= 5 && den >= 0.71) { #ifdef GLP_DEBUG xprintf("na = %d; nnz = %d; den = %g\n", na, nnz, den); #endif break; } #endif /* choose pivot v[p,q] */ if (sgf_choose_pivot(sgf, &p, &q) != 0) return k; /* failure */ /* u[i,j] = v[p,q], k <= i, j <= n */ i = pp_ind[p]; xassert(k <= i && i <= n); j = qq_inv[q]; xassert(k <= j && j <= n); /* move u[i,j] to position u[k,k] by implicit permutations of * rows and columns of matrix U */ luf_swap_u_rows(k, i); luf_swap_u_cols(k, j); /* perform gaussian elimination */ nnz += sgf_eliminate(sgf, p, q); } #if 1 /* FIXME */ if (k <= n) { /* continue computing factorization in dense mode */ #ifdef GLP_DEBUG sva_check_area(sva); luf_check_all(luf, k); #endif k = sgf_dense_phase(luf, k, sgf->updat); if (k != 0) return k; /* failure */ } #endif #ifdef GLP_DEBUG sva_check_area(sva); luf_check_all(luf, n+1); #endif /* defragment SVA; currently all columns of V are empty, so they * will have zero capacity as required by luf_build_v_cols */ sva_defrag_area(sva); /* build matrix F in row-wise format */ luf_build_f_rows(luf, rs_head); /* build matrix V in column-wise format */ luf_build_v_cols(luf, sgf->updat, rs_head); return 0; } /* eof */ glpk-5.0/src/bflib/sgf.h0000644000062000006210000002017413766346220014303 0ustar maomkpasswd/* sgf.h (sparse Gaussian factorizer) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2012-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef SGF_H #define SGF_H #include "luf.h" typedef struct SGF SGF; struct SGF { /* sparse Gaussian factorizer workspace */ LUF *luf; /* LU-factorization being computed */ /*--------------------------------------------------------------*/ /* to efficiently choose pivot elements according to Markowitz * strategy, the search technique proposed by Iain Duff is used; * it is based on using two families of sets {R[0], ..., R[n]} * and {C[0], ..., C[n]}, where R[k] and C[k], 0 <= k <= n, are, * respectively, sets of rows and columns of the active submatrix * of matrix V having k non-zeros (i.e. whose length is k); each * set R[k] and C[k] is implemented as a doubly linked list */ int *rs_head; /* int rs_head[1+n]; */ /* rs_head[k], 0 <= k <= n, is the number of first row, which * has k non-zeros in the active submatrix */ int *rs_prev; /* int rs_prev[1+n]; */ /* rs_prev[0] is not used; * rs_prev[i], 1 <= i <= n, is the number of previous row, which * has the same number of non-zeros as i-th row; * rs_prev[i] < 0 means that i-th row is inactive */ int *rs_next; /* int rs_next[1+n]; */ /* rs_next[0] is not used; * rs_next[i], 1 <= i <= n, is the number of next row, which has * the same number of non-zeros as i-th row; * rs_next[i] < 0 means that i-th row is inactive */ int *cs_head; /* int cs_head[1+n]; */ /* cs_head[k], 0 <= k <= n, is the number of first column, which * has k non-zeros in the active submatrix */ int *cs_prev; /* int cs_prev[1+n]; */ /* cs_prev[0] is not used; * cs_prev[j], 1 <= j <= n, is the number of previous column, * which has the same number of non-zeros as j-th column; * cs_prev[j] < 0 means that j-th column is inactive */ int *cs_next; /* int cs_next[1+n]; */ /* cs_next[0] is not used; * cs_next[j], 1 <= j <= n, is the number of next column, which * has the same number of non-zeros as j-th column; * cs_next[j] < 0 means that j-th column is inactive */ /* NOTE: cs_prev[j] = cs_next[j] = j means that j-th column was * temporarily removed from corresponding set C[k] by the * pivoting routine according to Uwe Suhl's heuristic */ /*--------------------------------------------------------------*/ /* working arrays */ double *vr_max; /* int vr_max[1+n]; */ /* vr_max[0] is not used; * vr_max[i], 1 <= i <= n, is used only if i-th row of matrix V * is active (i.e. belongs to the active submatrix), and is the * largest magnitude of elements in that row; if vr_max[i] < 0, * the largest magnitude is unknown yet */ char *flag; /* char flag[1+n]; */ /* boolean working array */ double *work; /* double work[1+n]; */ /* floating-point working array */ /*--------------------------------------------------------------*/ /* control parameters */ int updat; /* if this flag is set, the matrix V is assumed to be updatable; * in this case factorized (non-active) part of V is stored in * the left part of SVA rather than in its right part */ double piv_tol; /* threshold pivoting tolerance, 0 < piv_tol < 1; element v[i,j] * of the active submatrix fits to be pivot if it satisfies to * the stability criterion |v[i,j]| >= piv_tol * max |v[i,*]|, * i.e. if it is not very small in the magnitude among other * elements in the same row; decreasing this parameter gives * better sparsity at the expense of numerical accuracy and vice * versa */ int piv_lim; /* maximal allowable number of pivot candidates to be considered; * if piv_lim pivot candidates have been considered, the pivoting * routine terminates the search with the best candidate found */ int suhl; /* if this flag is set, the pivoting routine applies a heuristic * proposed by Uwe Suhl: if a column of the active submatrix has * no eligible pivot candidates (i.e. all its elements do not * satisfy to the stability criterion), the routine excludes it * from futher consideration until it becomes column singleton; * in many cases this allows reducing the time needed to choose * the pivot */ double eps_tol; /* epsilon tolerance; each element of the active submatrix, whose * magnitude is less than eps_tol, is replaced by exact zero */ #if 0 /* FIXME */ double den_lim; /* density limit; if the density of the active submatrix reaches * this limit, the factorization routine switches from sparse to * dense mode */ #endif }; #define sgf_activate_row(i) \ do \ { int len = vr_len[i]; \ rs_prev[i] = 0; \ rs_next[i] = rs_head[len]; \ if (rs_next[i] != 0) \ rs_prev[rs_next[i]] = i; \ rs_head[len] = i; \ } while (0) /* include i-th row of matrix V in active set R[len] */ #define sgf_deactivate_row(i) \ do \ { if (rs_prev[i] == 0) \ rs_head[vr_len[i]] = rs_next[i]; \ else \ rs_next[rs_prev[i]] = rs_next[i]; \ if (rs_next[i] == 0) \ ; \ else \ rs_prev[rs_next[i]] = rs_prev[i]; \ rs_prev[i] = rs_next[i] = -1; \ } while (0) /* remove i-th row of matrix V from active set R[len] */ #define sgf_activate_col(j) \ do \ { int len = vc_len[j]; \ cs_prev[j] = 0; \ cs_next[j] = cs_head[len]; \ if (cs_next[j] != 0) \ cs_prev[cs_next[j]] = j; \ cs_head[len] = j; \ } while (0) /* include j-th column of matrix V in active set C[len] */ #define sgf_deactivate_col(j) \ do \ { if (cs_prev[j] == 0) \ cs_head[vc_len[j]] = cs_next[j]; \ else \ cs_next[cs_prev[j]] = cs_next[j]; \ if (cs_next[j] == 0) \ ; \ else \ cs_prev[cs_next[j]] = cs_prev[j]; \ cs_prev[j] = cs_next[j] = -1; \ } while (0) /* remove j-th column of matrix V from active set C[len] */ #define sgf_reduce_nuc _glp_sgf_reduce_nuc int sgf_reduce_nuc(LUF *luf, int *k1, int *k2, int cnt[/*1+n*/], int list[/*1+n*/]); /* initial reordering to minimize nucleus size */ #define sgf_singl_phase _glp_sgf_singl_phase int sgf_singl_phase(LUF *luf, int k1, int k2, int updat, int ind[/*1+n*/], double val[/*1+n*/]); /* compute LU-factorization (singleton phase) */ #define sgf_choose_pivot _glp_sgf_choose_pivot int sgf_choose_pivot(SGF *sgf, int *p, int *q); /* choose pivot element v[p,q] */ #define sgf_eliminate _glp_sgf_eliminate int sgf_eliminate(SGF *sgf, int p, int q); /* perform gaussian elimination */ #define sgf_dense_lu _glp_sgf_dense_lu int sgf_dense_lu(int n, double a[], int r[], int c[], double eps); /* compute dense LU-factorization with full pivoting */ #define sgf_dense_phase _glp_sgf_dense_phase int sgf_dense_phase(LUF *luf, int k, int updat); /* compute LU-factorization (dense phase) */ #define sgf_factorize _glp_sgf_factorize int sgf_factorize(SGF *sgf, int singl); /* compute LU-factorization (main routine) */ #endif /* eof */ glpk-5.0/src/bflib/sva.c0000644000062000006210000004556013766346220014316 0ustar maomkpasswd/* sva.c (sparse vector area) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2012-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "sva.h" /*********************************************************************** * sva_create_area - create sparse vector area (SVA) * * This routine creates the sparse vector area (SVA), which initially * is empty. * * The parameter n_max specifies the initial number of vectors that can * be allocated in the SVA, n_max > 0. * * The parameter size specifies the initial number of free locations in * the SVA, size > 0. * * On exit the routine returns a pointer to the SVA created. */ SVA *sva_create_area(int n_max, int size) { SVA *sva; xassert(0 < n_max && n_max < INT_MAX); xassert(0 < size && size < INT_MAX); sva = talloc(1, SVA); sva->n_max = n_max; sva->n = 0; sva->ptr = talloc(1+n_max, int); sva->len = talloc(1+n_max, int); sva->cap = talloc(1+n_max, int); sva->size = size; sva->m_ptr = 1; sva->r_ptr = size+1; sva->head = sva->tail = 0; sva->prev = talloc(1+n_max, int); sva->next = talloc(1+n_max, int); sva->ind = talloc(1+size, int); sva->val = talloc(1+size, double); sva->talky = 0; return sva; } /*********************************************************************** * sva_alloc_vecs - allocate new vectors in SVA * * This routine allocates nnn new empty vectors, nnn > 0, in the sparse * vector area (SVA). * * The new vectors are assigned reference numbers k, k+1, ..., k+nnn-1, * where k is a reference number assigned to the very first new vector, * which is returned by the routine on exit. */ int sva_alloc_vecs(SVA *sva, int nnn) { int n = sva->n; int n_max = sva->n_max; int *ptr = sva->ptr; int *len = sva->len; int *cap = sva->cap; int *prev = sva->prev; int *next = sva->next; int k, new_n; #if 1 if (sva->talky) xprintf("sva_alloc_vecs: nnn = %d\n", nnn); #endif xassert(nnn > 0); /* determine new number of vectors in SVA */ new_n = n + nnn; xassert(new_n > n); if (n_max < new_n) { /* enlarge the SVA arrays */ while (n_max < new_n) { n_max += n_max; xassert(n_max > 0); } sva->n_max = n_max; sva->ptr = ptr = trealloc(ptr, 1+n_max, int); sva->len = len = trealloc(len, 1+n_max, int); sva->cap = cap = trealloc(cap, 1+n_max, int); sva->prev = prev = trealloc(prev, 1+n_max, int); sva->next = next = trealloc(next, 1+n_max, int); } /* initialize new vectors */ sva->n = new_n; for (k = n+1; k <= new_n; k++) { ptr[k] = len[k] = cap[k] = 0; prev[k] = next[k] = -1; } #if 1 if (sva->talky) xprintf("now sva->n_max = %d, sva->n = %d\n", sva->n_max, sva->n); #endif /* return reference number of very first new vector */ return n+1; } /*********************************************************************** * sva_resize_area - change size of SVA storage * * This routine increases or decrases the size of the SVA storage by * reallocating it. * * The parameter delta specifies the number of location by which the * current size of the SVA storage should be increased (if delta > 0) * or decreased (if delta < 0). Note that if delta is negative, it * should not be less than the current size of the middle part. * * As a result of this operation the size of the middle part of SVA is * increased/decreased by delta locations. * * NOTE: This operation changes ptr[k] for all vectors stored in the * right part of SVA. */ void sva_resize_area(SVA *sva, int delta) { int n = sva->n; int *ptr = sva->ptr; int size = sva->size; int m_ptr = sva->m_ptr; int r_ptr = sva->r_ptr; int k, r_size; #if 1 if (sva->talky) xprintf("sva_resize_area: delta = %d\n", delta); #endif xassert(delta != 0); /* determine size of the right part, in locations */ r_size = size - r_ptr + 1; /* relocate the right part in case of negative delta */ if (delta < 0) { xassert(delta >= m_ptr - r_ptr); sva->r_ptr += delta; memmove(&sva->ind[sva->r_ptr], &sva->ind[r_ptr], r_size * sizeof(int)); memmove(&sva->val[sva->r_ptr], &sva->val[r_ptr], r_size * sizeof(double)); } /* reallocate the storage arrays */ xassert(delta < INT_MAX - sva->size); sva->size += delta; sva->ind = trealloc(sva->ind, 1+sva->size, int); sva->val = trealloc(sva->val, 1+sva->size, double); /* relocate the right part in case of positive delta */ if (delta > 0) { sva->r_ptr += delta; memmove(&sva->ind[sva->r_ptr], &sva->ind[r_ptr], r_size * sizeof(int)); memmove(&sva->val[sva->r_ptr], &sva->val[r_ptr], r_size * sizeof(double)); } /* update pointers to vectors stored in the right part */ for (k = 1; k <= n; k++) { if (ptr[k] >= r_ptr) ptr[k] += delta; } #if 1 if (sva->talky) xprintf("now sva->size = %d\n", sva->size); #endif return; } /*********************************************************************** * sva_defrag_area - defragment left part of SVA * * This routine performs "garbage" collection to defragment the left * part of SVA. * * NOTE: This operation may change ptr[k] and cap[k] for all vectors * stored in the left part of SVA. */ void sva_defrag_area(SVA *sva) { int *ptr = sva->ptr; int *len = sva->len; int *cap = sva->cap; int *prev = sva->prev; int *next = sva->next; int *ind = sva->ind; double *val = sva->val; int k, next_k, ptr_k, len_k, m_ptr, head, tail; #if 1 if (sva->talky) { xprintf("sva_defrag_area:\n"); xprintf("before defragmenting = %d %d %d\n", sva->m_ptr - 1, sva->r_ptr - sva->m_ptr, sva->size + 1 - sva->r_ptr); } #endif m_ptr = 1; head = tail = 0; /* walk through the linked list of vectors stored in the left * part of SVA */ for (k = sva->head; k != 0; k = next_k) { /* save number of next vector in the list */ next_k = next[k]; /* determine length of k-th vector */ len_k = len[k]; if (len_k == 0) { /* k-th vector is empty; remove it from the left part */ ptr[k] = cap[k] = 0; prev[k] = next[k] = -1; } else { /* determine pointer to first location of k-th vector */ ptr_k = ptr[k]; xassert(m_ptr <= ptr_k); /* relocate k-th vector to the beginning of the left part, * if necessary */ if (m_ptr < ptr_k) { memmove(&ind[m_ptr], &ind[ptr_k], len_k * sizeof(int)); memmove(&val[m_ptr], &val[ptr_k], len_k * sizeof(double)); ptr[k] = m_ptr; } /* remove unused locations from k-th vector */ cap[k] = len_k; /* the left part of SVA has been enlarged */ m_ptr += len_k; /* add k-th vector to the end of the new linked list */ prev[k] = tail; next[k] = 0; if (head == 0) head = k; else next[tail] = k; tail = k; } } /* set new pointer to the middle part of SVA */ xassert(m_ptr <= sva->r_ptr); sva->m_ptr = m_ptr; /* set new head and tail of the linked list */ sva->head = head; sva->tail = tail; #if 1 if (sva->talky) xprintf("after defragmenting = %d %d %d\n", sva->m_ptr - 1, sva->r_ptr - sva->m_ptr, sva->size + 1 - sva->r_ptr); #endif return; } /*********************************************************************** * sva_more_space - increase size of middle (free) part of SVA * * This routine increases the size of the middle (free) part of the * sparse vector area (SVA). * * The parameter m_size specifies the minimal size, in locations, of * the middle part to be provided. This new size should be greater than * the current size of the middle part. * * First, the routine defragments the left part of SVA. Then, if the * size of the left part has not sufficiently increased, the routine * increases the total size of the SVA storage by reallocating it. */ void sva_more_space(SVA *sva, int m_size) { int size, delta; #if 1 if (sva->talky) xprintf("sva_more_space: m_size = %d\n", m_size); #endif xassert(m_size > sva->r_ptr - sva->m_ptr); /* defragment the left part */ sva_defrag_area(sva); /* set, heuristically, the minimal size of the middle part to be * not less than the size of the defragmented left part */ if (m_size < sva->m_ptr - 1) m_size = sva->m_ptr - 1; /* if there is still not enough room, increase the total size of * the SVA storage */ if (sva->r_ptr - sva->m_ptr < m_size) { size = sva->size; /* new sva size */ for (;;) { delta = size - sva->size; if (sva->r_ptr - sva->m_ptr + delta >= m_size) break; size += size; xassert(size > 0); } sva_resize_area(sva, delta); xassert(sva->r_ptr - sva->m_ptr >= m_size); } return; } /*********************************************************************** * sva_enlarge_cap - enlarge capacity of specified vector * * This routine enlarges the current capacity of the specified vector * by relocating its content. * * The parameter k specifies the reference number of the vector whose * capacity should be enlarged, 1 <= k <= n. This vector should either * have zero capacity or be stored in the left (dynamic) part of SVA. * * The parameter new_cap specifies the new capacity of the vector, * in locations. This new capacity should be greater than the current * capacity of the vector. * * The parameter skip is a flag. If this flag is set, the routine does * *not* copy numerical values of elements of the vector on relocating * its content, i.e. only element indices are copied. * * NOTE: On entry to the routine the middle part of SVA should have at * least new_cap free locations. */ void sva_enlarge_cap(SVA *sva, int k, int new_cap, int skip) { int *ptr = sva->ptr; int *len = sva->len; int *cap = sva->cap; int *prev = sva->prev; int *next = sva->next; int *ind = sva->ind; double *val = sva->val; xassert(1 <= k && k <= sva->n); xassert(new_cap > cap[k]); /* there should be at least new_cap free locations */ xassert(sva->r_ptr - sva->m_ptr >= new_cap); /* relocate the vector */ if (cap[k] == 0) { /* the vector is empty */ xassert(ptr[k] == 0); xassert(len[k] == 0); } else { /* the vector has non-zero capacity */ xassert(ptr[k] + len[k] <= sva->m_ptr); /* copy the current vector content to the beginning of the * middle part */ if (len[k] > 0) { memcpy(&ind[sva->m_ptr], &ind[ptr[k]], len[k] * sizeof(int)); if (!skip) memcpy(&val[sva->m_ptr], &val[ptr[k]], len[k] * sizeof(double)); } /* remove the vector from the linked list */ if (prev[k] == 0) sva->head = next[k]; else { /* preceding vector exists; increase its capacity */ cap[prev[k]] += cap[k]; next[prev[k]] = next[k]; } if (next[k] == 0) sva->tail = prev[k]; else prev[next[k]] = prev[k]; } /* set new pointer and capacity of the vector */ ptr[k] = sva->m_ptr; cap[k] = new_cap; /* add the vector to the end of the linked list */ prev[k] = sva->tail; next[k] = 0; if (sva->head == 0) sva->head = k; else next[sva->tail] = k; sva->tail = k; /* new_cap free locations have been consumed */ sva->m_ptr += new_cap; xassert(sva->m_ptr <= sva->r_ptr); return; } /*********************************************************************** * sva_reserve_cap - reserve locations for specified vector * * This routine reserves locations for the specified vector in the * right (static) part of SVA. * * The parameter k specifies the reference number of the vector (this * vector should have zero capacity), 1 <= k <= n. * * The parameter new_cap specifies a non-zero capacity of the vector, * in locations. * * NOTE: On entry to the routine the middle part of SVA should have at * least new_cap free locations. */ void sva_reserve_cap(SVA *sva, int k, int new_cap) { int *ptr = sva->ptr; int *len = sva->len; int *cap = sva->cap; xassert(1 <= k && k <= sva->n); xassert(new_cap > 0); xassert(ptr[k] == 0 && len[k] == 0 && cap[k] == 0); /* there should be at least new_cap free locations */ xassert(sva->r_ptr - sva->m_ptr >= new_cap); /* set the pointer and capacity of the vector */ ptr[k] = sva->r_ptr - new_cap; cap[k] = new_cap; /* new_cap free locations have been consumed */ sva->r_ptr -= new_cap; return; } /*********************************************************************** * sva_make_static - relocate specified vector to right part of SVA * * Assuming that the specified vector is stored in the left (dynamic) * part of SVA, this routine makes the vector static by relocating its * content to the right (static) part of SVA. However, if the specified * vector has zero capacity, the routine does nothing. * * The parameter k specifies the reference number of the vector to be * relocated, 1 <= k <= n. * * NOTE: On entry to the routine the middle part of SVA should have at * least len[k] free locations, where len[k] is the length of the * vector to be relocated. */ void sva_make_static(SVA *sva, int k) { int *ptr = sva->ptr; int *len = sva->len; int *cap = sva->cap; int *prev = sva->prev; int *next = sva->next; int *ind = sva->ind; double *val = sva->val; int ptr_k, len_k; xassert(1 <= k && k <= sva->n); /* if the vector has zero capacity, do nothing */ if (cap[k] == 0) { xassert(ptr[k] == 0); xassert(len[k] == 0); goto done; } /* there should be at least len[k] free locations */ len_k = len[k]; xassert(sva->r_ptr - sva->m_ptr >= len_k); /* remove the vector from the linked list */ if (prev[k] == 0) sva->head = next[k]; else { /* preceding vector exists; increase its capacity */ cap[prev[k]] += cap[k]; next[prev[k]] = next[k]; } if (next[k] == 0) sva->tail = prev[k]; else prev[next[k]] = prev[k]; /* if the vector has zero length, make it empty */ if (len_k == 0) { ptr[k] = cap[k] = 0; goto done; } /* copy the vector content to the beginning of the right part */ ptr_k = sva->r_ptr - len_k; memcpy(&ind[ptr_k], &ind[ptr[k]], len_k * sizeof(int)); memcpy(&val[ptr_k], &val[ptr[k]], len_k * sizeof(double)); /* set new pointer and capacity of the vector */ ptr[k] = ptr_k; cap[k] = len_k; /* len[k] free locations have been consumed */ sva->r_ptr -= len_k; done: return; } /*********************************************************************** * sva_check_area - check sparse vector area (SVA) * * This routine checks the SVA data structures for correctness. * * NOTE: For testing/debugging only. */ void sva_check_area(SVA *sva) { int n_max = sva->n_max; int n = sva->n; int *ptr = sva->ptr; int *len = sva->len; int *cap = sva->cap; int size = sva->size; int m_ptr = sva->m_ptr; int r_ptr = sva->r_ptr; int head = sva->head; int tail = sva->tail; int *prev = sva->prev; int *next = sva->next; int k; #if 0 /* 16/II-2004; SVA may be empty */ xassert(1 <= n && n <= n_max); #else xassert(0 <= n && n <= n_max); #endif xassert(1 <= m_ptr && m_ptr <= r_ptr && r_ptr <= size+1); /* all vectors included the linked list should have non-zero * capacity and be stored in the left part */ for (k = head; k != 0; k = next[k]) { xassert(1 <= k && k <= n); xassert(cap[k] > 0); xassert(0 <= len[k] && len[k] <= cap[k]); if (prev[k] == 0) xassert(k == head); else { xassert(1 <= prev[k] && prev[k] <= n); xassert(next[prev[k]] == k); } if (next[k] == 0) { xassert(k == tail); xassert(ptr[k] + cap[k] <= m_ptr); } else { xassert(1 <= next[k] && next[k] <= n); xassert(prev[next[k]] == k); xassert(ptr[k] + cap[k] <= ptr[next[k]]); } cap[k] = -cap[k]; } /* all other vectors should either have zero capacity or be * stored in the right part */ for (k = 1; k <= n; k++) { if (cap[k] < 0) { /* k-th vector is stored in the left part */ cap[k] = -cap[k]; } else if (cap[k] == 0) { /* k-th vector has zero capacity */ xassert(ptr[k] == 0); xassert(len[k] == 0); } else /* cap[k] > 0 */ { /* k-th vector is stored in the right part */ xassert(0 <= len[k] && len[k] <= cap[k]); xassert(r_ptr <= ptr[k] && ptr[k] + cap[k] <= size+1); } } return; } /*********************************************************************** * sva_delete_area - delete sparse vector area (SVA) * * This routine deletes the sparse vector area (SVA) freeing all the * memory allocated to it. */ void sva_delete_area(SVA *sva) { tfree(sva->ptr); tfree(sva->len); tfree(sva->cap); tfree(sva->prev); tfree(sva->next); tfree(sva->ind); tfree(sva->val); tfree(sva); return; } /* eof */ glpk-5.0/src/bflib/sva.h0000644000062000006210000001462713766346220014323 0ustar maomkpasswd/* sva.h (sparse vector area) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2012-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef SVA_H #define SVA_H /*********************************************************************** * Sparse Vector Area (SVA) is a container for sparse vectors. This * program object is used mainly on computing factorization, where the * sparse vectors are rows and columns of sparse matrices. * * The SVA storage is a set of locations numbered 1, 2, ..., size, * where size is the size of SVA, which is the total number of * locations currently allocated. Each location is identified by its * pointer p, 1 <= p <= size, and is the pair (ind[p], val[p]), where * ind[p] and val[p] are, respectively, the index and value fields used * to store the index and numeric value of a particular vector element. * * Each sparse vector is identified by its reference number k, * 1 <= k <= n, where n is the total number of vectors currently stored * in SVA, and defined by the triplet (ptr[k], len[k], cap[k]), where: * ptr[k] is a pointer to the first location of the vector; len[k] is * the vector length, which is the number of its non-zero elements, * len[k] >= 0; and cap[k] is the capacity of the vector, which is the * total number of adjacent locations allocated to that vector, * cap[k] >= len[k]. Thus, non-zero elements of k-th vector are stored * in locations ptr[k], ptr[k]+1, ..., ptr[k]+len[k]-1, and locations * ptr[k]+len[k], ptr[k]+len[k]+1, ..., ptr[k]+cap[k]-1 are reserved. * * The SVA storage is divided into three parts as follows: * * Locations 1, 2, ..., m_ptr-1 constitute the left (dynamic) part of * SVA. This part is used to store vectors, whose capacity may change. * Note that all vectors stored in the left part are also included in * a doubly linked list, where they are ordered by increasing their * pointers ptr[k] (this list is needed for efficient implementation * of the garbage collector used to defragment the left part of SVA); * * Locations m_ptr, m_ptr+1, ..., r_ptr-1 are free and constitute the * middle (free) part of SVA. * * Locations r_ptr, r_ptr+1, ..., size constitute the right (static) * part of SVA. This part is used to store vectors, whose capacity is * not changed. */ typedef struct SVA SVA; struct SVA { /* sparse vector area */ int n_max; /* maximal value of n (enlarged automatically) */ int n; /* number of currently allocated vectors, 0 <= n <= n_max */ int *ptr; /* int ptr[1+n_max]; */ /* ptr[0] is not used; * ptr[k], 1 <= i <= n, is pointer to first location of k-th * vector in the arrays ind and val */ int *len; /* int len[1+n_max]; */ /* len[0] is not used; * len[k], 1 <= k <= n, is length of k-th vector, len[k] >= 0 */ int *cap; /* int cap[1+n_max]; */ /* cap[0] is not used; * cap[k], 1 <= k <= n, is capacity of k-th vector (the number * of adjacent locations allocated to it), cap[k] >= len[k] */ /* NOTE: if cap[k] = 0, then ptr[k] = 0 and len[k] = 0 */ int size; /* total number of locations in SVA */ int m_ptr, r_ptr; /* partitioning pointers that define the left, middle, and right * parts of SVA (see above); 1 <= m_ptr <= r_ptr <= size+1 */ int head; /* number of first (leftmost) vector in the linked list */ int tail; /* number of last (rightmost) vector in the linked list */ int *prev; /* int prev[1+n_max]; */ /* prev[0] is not used; * prev[k] is number of vector which precedes k-th vector in the * linked list; * prev[k] < 0 means that k-th vector is not in the list */ int *next; /* int next[1+n_max]; */ /* next[0] is not used; * next[k] is number of vector which succedes k-th vector in the * linked list; * next[k] < 0 means that k-th vector is not in the list */ /* NOTE: only vectors having non-zero capacity and stored in the * left part of SVA are included in this linked list */ int *ind; /* int ind[1+size]; */ /* ind[0] is not used; * ind[p], 1 <= p <= size, is index field of location p */ double *val; /* double val[1+size]; */ /* val[0] is not used; * val[p], 1 <= p <= size, is value field of location p */ #if 1 int talky; /* option to enable talky mode */ #endif }; #define sva_create_area _glp_sva_create_area SVA *sva_create_area(int n_max, int size); /* create sparse vector area (SVA) */ #define sva_alloc_vecs _glp_sva_alloc_vecs int sva_alloc_vecs(SVA *sva, int nnn); /* allocate new vectors in SVA */ #define sva_resize_area _glp_sva_resize_area void sva_resize_area(SVA *sva, int delta); /* change size of SVA storage */ #define sva_defrag_area _glp_sva_defrag_area void sva_defrag_area(SVA *sva); /* defragment left part of SVA */ #define sva_more_space _glp_sva_more_space void sva_more_space(SVA *sva, int m_size); /* increase size of middle (free) part of SVA */ #define sva_enlarge_cap _glp_sva_enlarge_cap void sva_enlarge_cap(SVA *sva, int k, int new_cap, int skip); /* enlarge capacity of specified vector */ #define sva_reserve_cap _glp_sva_reserve_cap void sva_reserve_cap(SVA *sva, int k, int new_cap); /* reserve locations for specified vector */ #define sva_make_static _glp_sva_make_static void sva_make_static(SVA *sva, int k); /* relocate specified vector to right part of SVA */ #define sva_check_area _glp_sva_check_area void sva_check_area(SVA *sva); /* check sparse vector area (SVA) */ #define sva_delete_area _glp_sva_delete_area void sva_delete_area(SVA *sva); /* delete sparse vector area (SVA) */ #endif /* eof */ glpk-5.0/src/colamd/0000755000062000006210000000000013766346220013530 5ustar maomkpasswdglpk-5.0/src/colamd/colamd.c0000644000062000006210000036777413766346220015163 0ustar maomkpasswd/* ========================================================================== */ /* === colamd/symamd - a sparse matrix column ordering algorithm ============ */ /* ========================================================================== */ /* COLAMD / SYMAMD colamd: an approximate minimum degree column ordering algorithm, for LU factorization of symmetric or unsymmetric matrices, QR factorization, least squares, interior point methods for linear programming problems, and other related problems. symamd: an approximate minimum degree ordering algorithm for Cholesky factorization of symmetric matrices. Purpose: Colamd computes a permutation Q such that the Cholesky factorization of (AQ)'(AQ) has less fill-in and requires fewer floating point operations than A'A. This also provides a good ordering for sparse partial pivoting methods, P(AQ) = LU, where Q is computed prior to numerical factorization, and P is computed during numerical factorization via conventional partial pivoting with row interchanges. Colamd is the column ordering method used in SuperLU, part of the ScaLAPACK library. It is also available as built-in function in MATLAB Version 6, available from MathWorks, Inc. (http://www.mathworks.com). This routine can be used in place of colmmd in MATLAB. Symamd computes a permutation P of a symmetric matrix A such that the Cholesky factorization of PAP' has less fill-in and requires fewer floating point operations than A. Symamd constructs a matrix M such that M'M has the same nonzero pattern of A, and then orders the columns of M using colmmd. The column ordering of M is then returned as the row and column ordering P of A. Authors: The authors of the code itself are Stefan I. Larimore and Timothy A. Davis (davis at cise.ufl.edu), University of Florida. The algorithm was developed in collaboration with John Gilbert, Xerox PARC, and Esmond Ng, Oak Ridge National Laboratory. Acknowledgements: This work was supported by the National Science Foundation, under grants DMS-9504974 and DMS-9803599. Copyright and License: Copyright (c) 1998-2007, Timothy A. Davis, All Rights Reserved. COLAMD is also available under alternate licenses, contact T. Davis for details. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Permission is hereby granted to use or copy this program under the terms of the GNU LGPL, provided that the Copyright, this License, and the Availability of the original version is retained on all copies. User documentation of any code that uses this code or any modified version of this code must cite the Copyright, this License, the Availability note, and "Used by permission." Permission to modify the code and to distribute modified code is granted, provided the Copyright, this License, and the Availability note are retained, and a notice that the code was modified is included. Availability: The colamd/symamd library is available at http://www.cise.ufl.edu/research/sparse/colamd/ This is the http://www.cise.ufl.edu/research/sparse/colamd/colamd.c file. It requires the colamd.h file. It is required by the colamdmex.c and symamdmex.c files, for the MATLAB interface to colamd and symamd. Appears as ACM Algorithm 836. See the ChangeLog file for changes since Version 1.0. References: T. A. Davis, J. R. Gilbert, S. Larimore, E. Ng, An approximate column minimum degree ordering algorithm, ACM Transactions on Mathematical Software, vol. 30, no. 3., pp. 353-376, 2004. T. A. Davis, J. R. Gilbert, S. Larimore, E. Ng, Algorithm 836: COLAMD, an approximate column minimum degree ordering algorithm, ACM Transactions on Mathematical Software, vol. 30, no. 3., pp. 377-380, 2004. */ /* ========================================================================== */ /* === Description of user-callable routines ================================ */ /* ========================================================================== */ /* COLAMD includes both int and UF_long versions of all its routines. The * description below is for the int version. For UF_long, all int arguments * become UF_long. UF_long is normally defined as long, except for WIN64. ---------------------------------------------------------------------------- colamd_recommended: ---------------------------------------------------------------------------- C syntax: #include "colamd.h" size_t colamd_recommended (int nnz, int n_row, int n_col) ; size_t colamd_l_recommended (UF_long nnz, UF_long n_row, UF_long n_col) ; Purpose: Returns recommended value of Alen for use by colamd. Returns 0 if any input argument is negative. The use of this routine is optional. Not needed for symamd, which dynamically allocates its own memory. Note that in v2.4 and earlier, these routines returned int or long. They now return a value of type size_t. Arguments (all input arguments): int nnz ; Number of nonzeros in the matrix A. This must be the same value as p [n_col] in the call to colamd - otherwise you will get a wrong value of the recommended memory to use. int n_row ; Number of rows in the matrix A. int n_col ; Number of columns in the matrix A. ---------------------------------------------------------------------------- colamd_set_defaults: ---------------------------------------------------------------------------- C syntax: #include "colamd.h" colamd_set_defaults (double knobs [COLAMD_KNOBS]) ; colamd_l_set_defaults (double knobs [COLAMD_KNOBS]) ; Purpose: Sets the default parameters. The use of this routine is optional. Arguments: double knobs [COLAMD_KNOBS] ; Output only. NOTE: the meaning of the dense row/col knobs has changed in v2.4 knobs [0] and knobs [1] control dense row and col detection: Colamd: rows with more than max (16, knobs [COLAMD_DENSE_ROW] * sqrt (n_col)) entries are removed prior to ordering. Columns with more than max (16, knobs [COLAMD_DENSE_COL] * sqrt (MIN (n_row,n_col))) entries are removed prior to ordering, and placed last in the output column ordering. Symamd: uses only knobs [COLAMD_DENSE_ROW], which is knobs [0]. Rows and columns with more than max (16, knobs [COLAMD_DENSE_ROW] * sqrt (n)) entries are removed prior to ordering, and placed last in the output ordering. COLAMD_DENSE_ROW and COLAMD_DENSE_COL are defined as 0 and 1, respectively, in colamd.h. Default values of these two knobs are both 10. Currently, only knobs [0] and knobs [1] are used, but future versions may use more knobs. If so, they will be properly set to their defaults by the future version of colamd_set_defaults, so that the code that calls colamd will not need to change, assuming that you either use colamd_set_defaults, or pass a (double *) NULL pointer as the knobs array to colamd or symamd. knobs [2]: aggressive absorption knobs [COLAMD_AGGRESSIVE] controls whether or not to do aggressive absorption during the ordering. Default is TRUE. ---------------------------------------------------------------------------- colamd: ---------------------------------------------------------------------------- C syntax: #include "colamd.h" int colamd (int n_row, int n_col, int Alen, int *A, int *p, double knobs [COLAMD_KNOBS], int stats [COLAMD_STATS]) ; UF_long colamd_l (UF_long n_row, UF_long n_col, UF_long Alen, UF_long *A, UF_long *p, double knobs [COLAMD_KNOBS], UF_long stats [COLAMD_STATS]) ; Purpose: Computes a column ordering (Q) of A such that P(AQ)=LU or (AQ)'AQ=LL' have less fill-in and require fewer floating point operations than factorizing the unpermuted matrix A or A'A, respectively. Returns: TRUE (1) if successful, FALSE (0) otherwise. Arguments: int n_row ; Input argument. Number of rows in the matrix A. Restriction: n_row >= 0. Colamd returns FALSE if n_row is negative. int n_col ; Input argument. Number of columns in the matrix A. Restriction: n_col >= 0. Colamd returns FALSE if n_col is negative. int Alen ; Input argument. Restriction (see note): Alen >= 2*nnz + 6*(n_col+1) + 4*(n_row+1) + n_col Colamd returns FALSE if these conditions are not met. Note: this restriction makes an modest assumption regarding the size of the two typedef's structures in colamd.h. We do, however, guarantee that Alen >= colamd_recommended (nnz, n_row, n_col) will be sufficient. Note: the macro version does not check for integer overflow, and thus is not recommended. Use the colamd_recommended routine instead. int A [Alen] ; Input argument, undefined on output. A is an integer array of size Alen. Alen must be at least as large as the bare minimum value given above, but this is very low, and can result in excessive run time. For best performance, we recommend that Alen be greater than or equal to colamd_recommended (nnz, n_row, n_col), which adds nnz/5 to the bare minimum value given above. On input, the row indices of the entries in column c of the matrix are held in A [(p [c]) ... (p [c+1]-1)]. The row indices in a given column c need not be in ascending order, and duplicate row indices may be be present. However, colamd will work a little faster if both of these conditions are met (Colamd puts the matrix into this format, if it finds that the the conditions are not met). The matrix is 0-based. That is, rows are in the range 0 to n_row-1, and columns are in the range 0 to n_col-1. Colamd returns FALSE if any row index is out of range. The contents of A are modified during ordering, and are undefined on output. int p [n_col+1] ; Both input and output argument. p is an integer array of size n_col+1. On input, it holds the "pointers" for the column form of the matrix A. Column c of the matrix A is held in A [(p [c]) ... (p [c+1]-1)]. The first entry, p [0], must be zero, and p [c] <= p [c+1] must hold for all c in the range 0 to n_col-1. The value p [n_col] is thus the total number of entries in the pattern of the matrix A. Colamd returns FALSE if these conditions are not met. On output, if colamd returns TRUE, the array p holds the column permutation (Q, for P(AQ)=LU or (AQ)'(AQ)=LL'), where p [0] is the first column index in the new ordering, and p [n_col-1] is the last. That is, p [k] = j means that column j of A is the kth pivot column, in AQ, where k is in the range 0 to n_col-1 (p [0] = j means that column j of A is the first column in AQ). If colamd returns FALSE, then no permutation is returned, and p is undefined on output. double knobs [COLAMD_KNOBS] ; Input argument. See colamd_set_defaults for a description. int stats [COLAMD_STATS] ; Output argument. Statistics on the ordering, and error status. See colamd.h for related definitions. Colamd returns FALSE if stats is not present. stats [0]: number of dense or empty rows ignored. stats [1]: number of dense or empty columns ignored (and ordered last in the output permutation p) Note that a row can become "empty" if it contains only "dense" and/or "empty" columns, and similarly a column can become "empty" if it only contains "dense" and/or "empty" rows. stats [2]: number of garbage collections performed. This can be excessively high if Alen is close to the minimum required value. stats [3]: status code. < 0 is an error code. > 1 is a warning or notice. 0 OK. Each column of the input matrix contained row indices in increasing order, with no duplicates. 1 OK, but columns of input matrix were jumbled (unsorted columns or duplicate entries). Colamd had to do some extra work to sort the matrix first and remove duplicate entries, but it still was able to return a valid permutation (return value of colamd was TRUE). stats [4]: highest numbered column that is unsorted or has duplicate entries. stats [5]: last seen duplicate or unsorted row index. stats [6]: number of duplicate or unsorted row indices. -1 A is a null pointer -2 p is a null pointer -3 n_row is negative stats [4]: n_row -4 n_col is negative stats [4]: n_col -5 number of nonzeros in matrix is negative stats [4]: number of nonzeros, p [n_col] -6 p [0] is nonzero stats [4]: p [0] -7 A is too small stats [4]: required size stats [5]: actual size (Alen) -8 a column has a negative number of entries stats [4]: column with < 0 entries stats [5]: number of entries in col -9 a row index is out of bounds stats [4]: column with bad row index stats [5]: bad row index stats [6]: n_row, # of rows of matrx -10 (unused; see symamd.c) -999 (unused; see symamd.c) Future versions may return more statistics in the stats array. Example: See http://www.cise.ufl.edu/research/sparse/colamd/example.c for a complete example. To order the columns of a 5-by-4 matrix with 11 nonzero entries in the following nonzero pattern x 0 x 0 x 0 x x 0 x x 0 0 0 x x x x 0 0 with default knobs and no output statistics, do the following: #include "colamd.h" #define ALEN 100 int A [ALEN] = {0, 1, 4, 2, 4, 0, 1, 2, 3, 1, 3} ; int p [ ] = {0, 3, 5, 9, 11} ; int stats [COLAMD_STATS] ; colamd (5, 4, ALEN, A, p, (double *) NULL, stats) ; The permutation is returned in the array p, and A is destroyed. ---------------------------------------------------------------------------- symamd: ---------------------------------------------------------------------------- C syntax: #include "colamd.h" int symamd (int n, int *A, int *p, int *perm, double knobs [COLAMD_KNOBS], int stats [COLAMD_STATS], void (*allocate) (size_t, size_t), void (*release) (void *)) ; UF_long symamd_l (UF_long n, UF_long *A, UF_long *p, UF_long *perm, double knobs [COLAMD_KNOBS], UF_long stats [COLAMD_STATS], void (*allocate) (size_t, size_t), void (*release) (void *)) ; Purpose: The symamd routine computes an ordering P of a symmetric sparse matrix A such that the Cholesky factorization PAP' = LL' remains sparse. It is based on a column ordering of a matrix M constructed so that the nonzero pattern of M'M is the same as A. The matrix A is assumed to be symmetric; only the strictly lower triangular part is accessed. You must pass your selected memory allocator (usually calloc/free or mxCalloc/mxFree) to symamd, for it to allocate memory for the temporary matrix M. Returns: TRUE (1) if successful, FALSE (0) otherwise. Arguments: int n ; Input argument. Number of rows and columns in the symmetrix matrix A. Restriction: n >= 0. Symamd returns FALSE if n is negative. int A [nnz] ; Input argument. A is an integer array of size nnz, where nnz = p [n]. The row indices of the entries in column c of the matrix are held in A [(p [c]) ... (p [c+1]-1)]. The row indices in a given column c need not be in ascending order, and duplicate row indices may be present. However, symamd will run faster if the columns are in sorted order with no duplicate entries. The matrix is 0-based. That is, rows are in the range 0 to n-1, and columns are in the range 0 to n-1. Symamd returns FALSE if any row index is out of range. The contents of A are not modified. int p [n+1] ; Input argument. p is an integer array of size n+1. On input, it holds the "pointers" for the column form of the matrix A. Column c of the matrix A is held in A [(p [c]) ... (p [c+1]-1)]. The first entry, p [0], must be zero, and p [c] <= p [c+1] must hold for all c in the range 0 to n-1. The value p [n] is thus the total number of entries in the pattern of the matrix A. Symamd returns FALSE if these conditions are not met. The contents of p are not modified. int perm [n+1] ; Output argument. On output, if symamd returns TRUE, the array perm holds the permutation P, where perm [0] is the first index in the new ordering, and perm [n-1] is the last. That is, perm [k] = j means that row and column j of A is the kth column in PAP', where k is in the range 0 to n-1 (perm [0] = j means that row and column j of A are the first row and column in PAP'). The array is used as a workspace during the ordering, which is why it must be of length n+1, not just n. double knobs [COLAMD_KNOBS] ; Input argument. See colamd_set_defaults for a description. int stats [COLAMD_STATS] ; Output argument. Statistics on the ordering, and error status. See colamd.h for related definitions. Symamd returns FALSE if stats is not present. stats [0]: number of dense or empty row and columns ignored (and ordered last in the output permutation perm). Note that a row/column can become "empty" if it contains only "dense" and/or "empty" columns/rows. stats [1]: (same as stats [0]) stats [2]: number of garbage collections performed. stats [3]: status code. < 0 is an error code. > 1 is a warning or notice. 0 OK. Each column of the input matrix contained row indices in increasing order, with no duplicates. 1 OK, but columns of input matrix were jumbled (unsorted columns or duplicate entries). Symamd had to do some extra work to sort the matrix first and remove duplicate entries, but it still was able to return a valid permutation (return value of symamd was TRUE). stats [4]: highest numbered column that is unsorted or has duplicate entries. stats [5]: last seen duplicate or unsorted row index. stats [6]: number of duplicate or unsorted row indices. -1 A is a null pointer -2 p is a null pointer -3 (unused, see colamd.c) -4 n is negative stats [4]: n -5 number of nonzeros in matrix is negative stats [4]: # of nonzeros (p [n]). -6 p [0] is nonzero stats [4]: p [0] -7 (unused) -8 a column has a negative number of entries stats [4]: column with < 0 entries stats [5]: number of entries in col -9 a row index is out of bounds stats [4]: column with bad row index stats [5]: bad row index stats [6]: n_row, # of rows of matrx -10 out of memory (unable to allocate temporary workspace for M or count arrays using the "allocate" routine passed into symamd). Future versions may return more statistics in the stats array. void * (*allocate) (size_t, size_t) A pointer to a function providing memory allocation. The allocated memory must be returned initialized to zero. For a C application, this argument should normally be a pointer to calloc. For a MATLAB mexFunction, the routine mxCalloc is passed instead. void (*release) (size_t, size_t) A pointer to a function that frees memory allocated by the memory allocation routine above. For a C application, this argument should normally be a pointer to free. For a MATLAB mexFunction, the routine mxFree is passed instead. ---------------------------------------------------------------------------- colamd_report: ---------------------------------------------------------------------------- C syntax: #include "colamd.h" colamd_report (int stats [COLAMD_STATS]) ; colamd_l_report (UF_long stats [COLAMD_STATS]) ; Purpose: Prints the error status and statistics recorded in the stats array on the standard error output (for a standard C routine) or on the MATLAB output (for a mexFunction). Arguments: int stats [COLAMD_STATS] ; Input only. Statistics from colamd. ---------------------------------------------------------------------------- symamd_report: ---------------------------------------------------------------------------- C syntax: #include "colamd.h" symamd_report (int stats [COLAMD_STATS]) ; symamd_l_report (UF_long stats [COLAMD_STATS]) ; Purpose: Prints the error status and statistics recorded in the stats array on the standard error output (for a standard C routine) or on the MATLAB output (for a mexFunction). Arguments: int stats [COLAMD_STATS] ; Input only. Statistics from symamd. */ /* ========================================================================== */ /* === Scaffolding code definitions ======================================== */ /* ========================================================================== */ /* Ensure that debugging is turned off: */ #ifndef NDEBUG #define NDEBUG #endif /* turn on debugging by uncommenting the following line #undef NDEBUG */ /* Our "scaffolding code" philosophy: In our opinion, well-written library code should keep its "debugging" code, and just normally have it turned off by the compiler so as not to interfere with performance. This serves several purposes: (1) assertions act as comments to the reader, telling you what the code expects at that point. All assertions will always be true (unless there really is a bug, of course). (2) leaving in the scaffolding code assists anyone who would like to modify the code, or understand the algorithm (by reading the debugging output, one can get a glimpse into what the code is doing). (3) (gasp!) for actually finding bugs. This code has been heavily tested and "should" be fully functional and bug-free ... but you never know... The code will become outrageously slow when debugging is enabled. To control the level of debugging output, set an environment variable D to 0 (little), 1 (some), 2, 3, or 4 (lots). When debugging, you should see the following message on the standard output: colamd: debug version, D = 1 (THIS WILL BE SLOW!) or a similar message for symamd. If you don't, then debugging has not been enabled. */ /* ========================================================================== */ /* === Include files ======================================================== */ /* ========================================================================== */ #include "colamd.h" #if 0 /* by mao */ #include #include #ifdef MATLAB_MEX_FILE #include "mex.h" #include "matrix.h" #endif /* MATLAB_MEX_FILE */ #if !defined (NPRINT) || !defined (NDEBUG) #include #endif #ifndef NULL #define NULL ((void *) 0) #endif #endif /* ========================================================================== */ /* === int or UF_long ======================================================= */ /* ========================================================================== */ #if 0 /* by mao */ /* define UF_long */ #include "UFconfig.h" #endif #ifdef DLONG #define Int UF_long #define ID UF_long_id #define Int_MAX UF_long_max #define COLAMD_recommended colamd_l_recommended #define COLAMD_set_defaults colamd_l_set_defaults #define COLAMD_MAIN colamd_l #define SYMAMD_MAIN symamd_l #define COLAMD_report colamd_l_report #define SYMAMD_report symamd_l_report #else #define Int int #define ID "%d" #define Int_MAX INT_MAX #define COLAMD_recommended colamd_recommended #define COLAMD_set_defaults colamd_set_defaults #define COLAMD_MAIN colamd #define SYMAMD_MAIN symamd #define COLAMD_report colamd_report #define SYMAMD_report symamd_report #endif /* ========================================================================== */ /* === Row and Column structures ============================================ */ /* ========================================================================== */ /* User code that makes use of the colamd/symamd routines need not directly */ /* reference these structures. They are used only for colamd_recommended. */ typedef struct Colamd_Col_struct { Int start ; /* index for A of first row in this column, or DEAD */ /* if column is dead */ Int length ; /* number of rows in this column */ union { Int thickness ; /* number of original columns represented by this */ /* col, if the column is alive */ Int parent ; /* parent in parent tree super-column structure, if */ /* the column is dead */ } shared1 ; union { Int score ; /* the score used to maintain heap, if col is alive */ Int order ; /* pivot ordering of this column, if col is dead */ } shared2 ; union { Int headhash ; /* head of a hash bucket, if col is at the head of */ /* a degree list */ Int hash ; /* hash value, if col is not in a degree list */ Int prev ; /* previous column in degree list, if col is in a */ /* degree list (but not at the head of a degree list) */ } shared3 ; union { Int degree_next ; /* next column, if col is in a degree list */ Int hash_next ; /* next column, if col is in a hash list */ } shared4 ; } Colamd_Col ; typedef struct Colamd_Row_struct { Int start ; /* index for A of first col in this row */ Int length ; /* number of principal columns in this row */ union { Int degree ; /* number of principal & non-principal columns in row */ Int p ; /* used as a row pointer in init_rows_cols () */ } shared1 ; union { Int mark ; /* for computing set differences and marking dead rows*/ Int first_column ;/* first column in row (used in garbage collection) */ } shared2 ; } Colamd_Row ; /* ========================================================================== */ /* === Definitions ========================================================== */ /* ========================================================================== */ /* Routines are either PUBLIC (user-callable) or PRIVATE (not user-callable) */ #define PUBLIC #define PRIVATE static #define DENSE_DEGREE(alpha,n) \ ((Int) MAX (16.0, (alpha) * sqrt ((double) (n)))) #define MAX(a,b) (((a) > (b)) ? (a) : (b)) #define MIN(a,b) (((a) < (b)) ? (a) : (b)) #define ONES_COMPLEMENT(r) (-(r)-1) /* -------------------------------------------------------------------------- */ /* Change for version 2.1: define TRUE and FALSE only if not yet defined */ /* -------------------------------------------------------------------------- */ #ifndef TRUE #define TRUE (1) #endif #ifndef FALSE #define FALSE (0) #endif /* -------------------------------------------------------------------------- */ #define EMPTY (-1) /* Row and column status */ #define ALIVE (0) #define DEAD (-1) /* Column status */ #define DEAD_PRINCIPAL (-1) #define DEAD_NON_PRINCIPAL (-2) /* Macros for row and column status update and checking. */ #define ROW_IS_DEAD(r) ROW_IS_MARKED_DEAD (Row[r].shared2.mark) #define ROW_IS_MARKED_DEAD(row_mark) (row_mark < ALIVE) #define ROW_IS_ALIVE(r) (Row [r].shared2.mark >= ALIVE) #define COL_IS_DEAD(c) (Col [c].start < ALIVE) #define COL_IS_ALIVE(c) (Col [c].start >= ALIVE) #define COL_IS_DEAD_PRINCIPAL(c) (Col [c].start == DEAD_PRINCIPAL) #define KILL_ROW(r) { Row [r].shared2.mark = DEAD ; } #define KILL_PRINCIPAL_COL(c) { Col [c].start = DEAD_PRINCIPAL ; } #define KILL_NON_PRINCIPAL_COL(c) { Col [c].start = DEAD_NON_PRINCIPAL ; } /* ========================================================================== */ /* === Colamd reporting mechanism =========================================== */ /* ========================================================================== */ #if defined (MATLAB_MEX_FILE) || defined (MATHWORKS) /* In MATLAB, matrices are 1-based to the user, but 0-based internally */ #define INDEX(i) ((i)+1) #else /* In C, matrices are 0-based and indices are reported as such in *_report */ #define INDEX(i) (i) #endif /* All output goes through the PRINTF macro. */ #define PRINTF(params) { if (colamd_printf != NULL) (void) colamd_printf params ; } /* ========================================================================== */ /* === Prototypes of PRIVATE routines ======================================= */ /* ========================================================================== */ PRIVATE Int init_rows_cols ( Int n_row, Int n_col, Colamd_Row Row [], Colamd_Col Col [], Int A [], Int p [], Int stats [COLAMD_STATS] ) ; PRIVATE void init_scoring ( Int n_row, Int n_col, Colamd_Row Row [], Colamd_Col Col [], Int A [], Int head [], double knobs [COLAMD_KNOBS], Int *p_n_row2, Int *p_n_col2, Int *p_max_deg ) ; PRIVATE Int find_ordering ( Int n_row, Int n_col, Int Alen, Colamd_Row Row [], Colamd_Col Col [], Int A [], Int head [], Int n_col2, Int max_deg, Int pfree, Int aggressive ) ; PRIVATE void order_children ( Int n_col, Colamd_Col Col [], Int p [] ) ; PRIVATE void detect_super_cols ( #ifndef NDEBUG Int n_col, Colamd_Row Row [], #endif /* NDEBUG */ Colamd_Col Col [], Int A [], Int head [], Int row_start, Int row_length ) ; PRIVATE Int garbage_collection ( Int n_row, Int n_col, Colamd_Row Row [], Colamd_Col Col [], Int A [], Int *pfree ) ; PRIVATE Int clear_mark ( Int tag_mark, Int max_mark, Int n_row, Colamd_Row Row [] ) ; PRIVATE void print_report ( char *method, Int stats [COLAMD_STATS] ) ; /* ========================================================================== */ /* === Debugging prototypes and definitions ================================= */ /* ========================================================================== */ #ifndef NDEBUG #if 0 /* by mao */ #include #endif /* colamd_debug is the *ONLY* global variable, and is only */ /* present when debugging */ PRIVATE Int colamd_debug = 0 ; /* debug print level */ #define DEBUG0(params) { PRINTF (params) ; } #define DEBUG1(params) { if (colamd_debug >= 1) PRINTF (params) ; } #define DEBUG2(params) { if (colamd_debug >= 2) PRINTF (params) ; } #define DEBUG3(params) { if (colamd_debug >= 3) PRINTF (params) ; } #define DEBUG4(params) { if (colamd_debug >= 4) PRINTF (params) ; } #if 0 /* by mao */ #ifdef MATLAB_MEX_FILE #define ASSERT(expression) (mxAssert ((expression), "")) #else #define ASSERT(expression) (assert (expression)) #endif /* MATLAB_MEX_FILE */ #else #define ASSERT xassert #endif PRIVATE void colamd_get_debug /* gets the debug print level from getenv */ ( char *method ) ; PRIVATE void debug_deg_lists ( Int n_row, Int n_col, Colamd_Row Row [], Colamd_Col Col [], Int head [], Int min_score, Int should, Int max_deg ) ; PRIVATE void debug_mark ( Int n_row, Colamd_Row Row [], Int tag_mark, Int max_mark ) ; PRIVATE void debug_matrix ( Int n_row, Int n_col, Colamd_Row Row [], Colamd_Col Col [], Int A [] ) ; PRIVATE void debug_structures ( Int n_row, Int n_col, Colamd_Row Row [], Colamd_Col Col [], Int A [], Int n_col2 ) ; #else /* NDEBUG */ /* === No debugging ========================================================= */ #define DEBUG0(params) ; #define DEBUG1(params) ; #define DEBUG2(params) ; #define DEBUG3(params) ; #define DEBUG4(params) ; #define ASSERT(expression) #endif /* NDEBUG */ /* ========================================================================== */ /* === USER-CALLABLE ROUTINES: ============================================== */ /* ========================================================================== */ /* ========================================================================== */ /* === colamd_recommended =================================================== */ /* ========================================================================== */ /* The colamd_recommended routine returns the suggested size for Alen. This value has been determined to provide good balance between the number of garbage collections and the memory requirements for colamd. If any argument is negative, or if integer overflow occurs, a 0 is returned as an error condition. 2*nnz space is required for the row and column indices of the matrix. COLAMD_C (n_col) + COLAMD_R (n_row) space is required for the Col and Row arrays, respectively, which are internal to colamd (roughly 6*n_col + 4*n_row). An additional n_col space is the minimal amount of "elbow room", and nnz/5 more space is recommended for run time efficiency. Alen is approximately 2.2*nnz + 7*n_col + 4*n_row + 10. This function is not needed when using symamd. */ /* add two values of type size_t, and check for integer overflow */ static size_t t_add (size_t a, size_t b, int *ok) { (*ok) = (*ok) && ((a + b) >= MAX (a,b)) ; return ((*ok) ? (a + b) : 0) ; } /* compute a*k where k is a small integer, and check for integer overflow */ static size_t t_mult (size_t a, size_t k, int *ok) { size_t i, s = 0 ; for (i = 0 ; i < k ; i++) { s = t_add (s, a, ok) ; } return (s) ; } /* size of the Col and Row structures */ #define COLAMD_C(n_col,ok) \ ((t_mult (t_add (n_col, 1, ok), sizeof (Colamd_Col), ok) / sizeof (Int))) #define COLAMD_R(n_row,ok) \ ((t_mult (t_add (n_row, 1, ok), sizeof (Colamd_Row), ok) / sizeof (Int))) PUBLIC size_t COLAMD_recommended /* returns recommended value of Alen. */ ( /* === Parameters ======================================================= */ Int nnz, /* number of nonzeros in A */ Int n_row, /* number of rows in A */ Int n_col /* number of columns in A */ ) { size_t s, c, r ; int ok = TRUE ; if (nnz < 0 || n_row < 0 || n_col < 0) { return (0) ; } s = t_mult (nnz, 2, &ok) ; /* 2*nnz */ c = COLAMD_C (n_col, &ok) ; /* size of column structures */ r = COLAMD_R (n_row, &ok) ; /* size of row structures */ s = t_add (s, c, &ok) ; s = t_add (s, r, &ok) ; s = t_add (s, n_col, &ok) ; /* elbow room */ s = t_add (s, nnz/5, &ok) ; /* elbow room */ ok = ok && (s < Int_MAX) ; return (ok ? s : 0) ; } /* ========================================================================== */ /* === colamd_set_defaults ================================================== */ /* ========================================================================== */ /* The colamd_set_defaults routine sets the default values of the user- controllable parameters for colamd and symamd: Colamd: rows with more than max (16, knobs [0] * sqrt (n_col)) entries are removed prior to ordering. Columns with more than max (16, knobs [1] * sqrt (MIN (n_row,n_col))) entries are removed prior to ordering, and placed last in the output column ordering. Symamd: Rows and columns with more than max (16, knobs [0] * sqrt (n)) entries are removed prior to ordering, and placed last in the output ordering. knobs [0] dense row control knobs [1] dense column control knobs [2] if nonzero, do aggresive absorption knobs [3..19] unused, but future versions might use this */ PUBLIC void COLAMD_set_defaults ( /* === Parameters ======================================================= */ double knobs [COLAMD_KNOBS] /* knob array */ ) { /* === Local variables ================================================== */ Int i ; if (!knobs) { return ; /* no knobs to initialize */ } for (i = 0 ; i < COLAMD_KNOBS ; i++) { knobs [i] = 0 ; } knobs [COLAMD_DENSE_ROW] = 10 ; knobs [COLAMD_DENSE_COL] = 10 ; knobs [COLAMD_AGGRESSIVE] = TRUE ; /* default: do aggressive absorption*/ } /* ========================================================================== */ /* === symamd =============================================================== */ /* ========================================================================== */ PUBLIC Int SYMAMD_MAIN /* return TRUE if OK, FALSE otherwise */ ( /* === Parameters ======================================================= */ Int n, /* number of rows and columns of A */ Int A [], /* row indices of A */ Int p [], /* column pointers of A */ Int perm [], /* output permutation, size n+1 */ double knobs [COLAMD_KNOBS], /* parameters (uses defaults if NULL) */ Int stats [COLAMD_STATS], /* output statistics and error codes */ void * (*allocate) (size_t, size_t), /* pointer to calloc (ANSI C) or */ /* mxCalloc (for MATLAB mexFunction) */ void (*release) (void *) /* pointer to free (ANSI C) or */ /* mxFree (for MATLAB mexFunction) */ ) { /* === Local variables ================================================== */ Int *count ; /* length of each column of M, and col pointer*/ Int *mark ; /* mark array for finding duplicate entries */ Int *M ; /* row indices of matrix M */ size_t Mlen ; /* length of M */ Int n_row ; /* number of rows in M */ Int nnz ; /* number of entries in A */ Int i ; /* row index of A */ Int j ; /* column index of A */ Int k ; /* row index of M */ Int mnz ; /* number of nonzeros in M */ Int pp ; /* index into a column of A */ Int last_row ; /* last row seen in the current column */ Int length ; /* number of nonzeros in a column */ double cknobs [COLAMD_KNOBS] ; /* knobs for colamd */ double default_knobs [COLAMD_KNOBS] ; /* default knobs for colamd */ #ifndef NDEBUG colamd_get_debug ("symamd") ; #endif /* NDEBUG */ /* === Check the input arguments ======================================== */ if (!stats) { DEBUG0 (("symamd: stats not present\n")) ; return (FALSE) ; } for (i = 0 ; i < COLAMD_STATS ; i++) { stats [i] = 0 ; } stats [COLAMD_STATUS] = COLAMD_OK ; stats [COLAMD_INFO1] = -1 ; stats [COLAMD_INFO2] = -1 ; if (!A) { stats [COLAMD_STATUS] = COLAMD_ERROR_A_not_present ; DEBUG0 (("symamd: A not present\n")) ; return (FALSE) ; } if (!p) /* p is not present */ { stats [COLAMD_STATUS] = COLAMD_ERROR_p_not_present ; DEBUG0 (("symamd: p not present\n")) ; return (FALSE) ; } if (n < 0) /* n must be >= 0 */ { stats [COLAMD_STATUS] = COLAMD_ERROR_ncol_negative ; stats [COLAMD_INFO1] = n ; DEBUG0 (("symamd: n negative %d\n", n)) ; return (FALSE) ; } nnz = p [n] ; if (nnz < 0) /* nnz must be >= 0 */ { stats [COLAMD_STATUS] = COLAMD_ERROR_nnz_negative ; stats [COLAMD_INFO1] = nnz ; DEBUG0 (("symamd: number of entries negative %d\n", nnz)) ; return (FALSE) ; } if (p [0] != 0) { stats [COLAMD_STATUS] = COLAMD_ERROR_p0_nonzero ; stats [COLAMD_INFO1] = p [0] ; DEBUG0 (("symamd: p[0] not zero %d\n", p [0])) ; return (FALSE) ; } /* === If no knobs, set default knobs =================================== */ if (!knobs) { COLAMD_set_defaults (default_knobs) ; knobs = default_knobs ; } /* === Allocate count and mark ========================================== */ count = (Int *) ((*allocate) (n+1, sizeof (Int))) ; if (!count) { stats [COLAMD_STATUS] = COLAMD_ERROR_out_of_memory ; DEBUG0 (("symamd: allocate count (size %d) failed\n", n+1)) ; return (FALSE) ; } mark = (Int *) ((*allocate) (n+1, sizeof (Int))) ; if (!mark) { stats [COLAMD_STATUS] = COLAMD_ERROR_out_of_memory ; (*release) ((void *) count) ; DEBUG0 (("symamd: allocate mark (size %d) failed\n", n+1)) ; return (FALSE) ; } /* === Compute column counts of M, check if A is valid ================== */ stats [COLAMD_INFO3] = 0 ; /* number of duplicate or unsorted row indices*/ for (i = 0 ; i < n ; i++) { mark [i] = -1 ; } for (j = 0 ; j < n ; j++) { last_row = -1 ; length = p [j+1] - p [j] ; if (length < 0) { /* column pointers must be non-decreasing */ stats [COLAMD_STATUS] = COLAMD_ERROR_col_length_negative ; stats [COLAMD_INFO1] = j ; stats [COLAMD_INFO2] = length ; (*release) ((void *) count) ; (*release) ((void *) mark) ; DEBUG0 (("symamd: col %d negative length %d\n", j, length)) ; return (FALSE) ; } for (pp = p [j] ; pp < p [j+1] ; pp++) { i = A [pp] ; if (i < 0 || i >= n) { /* row index i, in column j, is out of bounds */ stats [COLAMD_STATUS] = COLAMD_ERROR_row_index_out_of_bounds ; stats [COLAMD_INFO1] = j ; stats [COLAMD_INFO2] = i ; stats [COLAMD_INFO3] = n ; (*release) ((void *) count) ; (*release) ((void *) mark) ; DEBUG0 (("symamd: row %d col %d out of bounds\n", i, j)) ; return (FALSE) ; } if (i <= last_row || mark [i] == j) { /* row index is unsorted or repeated (or both), thus col */ /* is jumbled. This is a notice, not an error condition. */ stats [COLAMD_STATUS] = COLAMD_OK_BUT_JUMBLED ; stats [COLAMD_INFO1] = j ; stats [COLAMD_INFO2] = i ; (stats [COLAMD_INFO3]) ++ ; DEBUG1 (("symamd: row %d col %d unsorted/duplicate\n", i, j)) ; } if (i > j && mark [i] != j) { /* row k of M will contain column indices i and j */ count [i]++ ; count [j]++ ; } /* mark the row as having been seen in this column */ mark [i] = j ; last_row = i ; } } /* v2.4: removed free(mark) */ /* === Compute column pointers of M ===================================== */ /* use output permutation, perm, for column pointers of M */ perm [0] = 0 ; for (j = 1 ; j <= n ; j++) { perm [j] = perm [j-1] + count [j-1] ; } for (j = 0 ; j < n ; j++) { count [j] = perm [j] ; } /* === Construct M ====================================================== */ mnz = perm [n] ; n_row = mnz / 2 ; Mlen = COLAMD_recommended (mnz, n_row, n) ; M = (Int *) ((*allocate) (Mlen, sizeof (Int))) ; DEBUG0 (("symamd: M is %d-by-%d with %d entries, Mlen = %g\n", n_row, n, mnz, (double) Mlen)) ; if (!M) { stats [COLAMD_STATUS] = COLAMD_ERROR_out_of_memory ; (*release) ((void *) count) ; (*release) ((void *) mark) ; DEBUG0 (("symamd: allocate M (size %g) failed\n", (double) Mlen)) ; return (FALSE) ; } k = 0 ; if (stats [COLAMD_STATUS] == COLAMD_OK) { /* Matrix is OK */ for (j = 0 ; j < n ; j++) { ASSERT (p [j+1] - p [j] >= 0) ; for (pp = p [j] ; pp < p [j+1] ; pp++) { i = A [pp] ; ASSERT (i >= 0 && i < n) ; if (i > j) { /* row k of M contains column indices i and j */ M [count [i]++] = k ; M [count [j]++] = k ; k++ ; } } } } else { /* Matrix is jumbled. Do not add duplicates to M. Unsorted cols OK. */ DEBUG0 (("symamd: Duplicates in A.\n")) ; for (i = 0 ; i < n ; i++) { mark [i] = -1 ; } for (j = 0 ; j < n ; j++) { ASSERT (p [j+1] - p [j] >= 0) ; for (pp = p [j] ; pp < p [j+1] ; pp++) { i = A [pp] ; ASSERT (i >= 0 && i < n) ; if (i > j && mark [i] != j) { /* row k of M contains column indices i and j */ M [count [i]++] = k ; M [count [j]++] = k ; k++ ; mark [i] = j ; } } } /* v2.4: free(mark) moved below */ } /* count and mark no longer needed */ (*release) ((void *) count) ; (*release) ((void *) mark) ; /* v2.4: free (mark) moved here */ ASSERT (k == n_row) ; /* === Adjust the knobs for M =========================================== */ for (i = 0 ; i < COLAMD_KNOBS ; i++) { cknobs [i] = knobs [i] ; } /* there are no dense rows in M */ cknobs [COLAMD_DENSE_ROW] = -1 ; cknobs [COLAMD_DENSE_COL] = knobs [COLAMD_DENSE_ROW] ; /* === Order the columns of M =========================================== */ /* v2.4: colamd cannot fail here, so the error check is removed */ (void) COLAMD_MAIN (n_row, n, (Int) Mlen, M, perm, cknobs, stats) ; /* Note that the output permutation is now in perm */ /* === get the statistics for symamd from colamd ======================== */ /* a dense column in colamd means a dense row and col in symamd */ stats [COLAMD_DENSE_ROW] = stats [COLAMD_DENSE_COL] ; /* === Free M =========================================================== */ (*release) ((void *) M) ; DEBUG0 (("symamd: done.\n")) ; return (TRUE) ; } /* ========================================================================== */ /* === colamd =============================================================== */ /* ========================================================================== */ /* The colamd routine computes a column ordering Q of a sparse matrix A such that the LU factorization P(AQ) = LU remains sparse, where P is selected via partial pivoting. The routine can also be viewed as providing a permutation Q such that the Cholesky factorization (AQ)'(AQ) = LL' remains sparse. */ PUBLIC Int COLAMD_MAIN /* returns TRUE if successful, FALSE otherwise*/ ( /* === Parameters ======================================================= */ Int n_row, /* number of rows in A */ Int n_col, /* number of columns in A */ Int Alen, /* length of A */ Int A [], /* row indices of A */ Int p [], /* pointers to columns in A */ double knobs [COLAMD_KNOBS],/* parameters (uses defaults if NULL) */ Int stats [COLAMD_STATS] /* output statistics and error codes */ ) { /* === Local variables ================================================== */ Int i ; /* loop index */ Int nnz ; /* nonzeros in A */ size_t Row_size ; /* size of Row [], in integers */ size_t Col_size ; /* size of Col [], in integers */ size_t need ; /* minimum required length of A */ Colamd_Row *Row ; /* pointer into A of Row [0..n_row] array */ Colamd_Col *Col ; /* pointer into A of Col [0..n_col] array */ Int n_col2 ; /* number of non-dense, non-empty columns */ Int n_row2 ; /* number of non-dense, non-empty rows */ Int ngarbage ; /* number of garbage collections performed */ Int max_deg ; /* maximum row degree */ double default_knobs [COLAMD_KNOBS] ; /* default knobs array */ Int aggressive ; /* do aggressive absorption */ int ok ; #ifndef NDEBUG colamd_get_debug ("colamd") ; #endif /* NDEBUG */ /* === Check the input arguments ======================================== */ if (!stats) { DEBUG0 (("colamd: stats not present\n")) ; return (FALSE) ; } for (i = 0 ; i < COLAMD_STATS ; i++) { stats [i] = 0 ; } stats [COLAMD_STATUS] = COLAMD_OK ; stats [COLAMD_INFO1] = -1 ; stats [COLAMD_INFO2] = -1 ; if (!A) /* A is not present */ { stats [COLAMD_STATUS] = COLAMD_ERROR_A_not_present ; DEBUG0 (("colamd: A not present\n")) ; return (FALSE) ; } if (!p) /* p is not present */ { stats [COLAMD_STATUS] = COLAMD_ERROR_p_not_present ; DEBUG0 (("colamd: p not present\n")) ; return (FALSE) ; } if (n_row < 0) /* n_row must be >= 0 */ { stats [COLAMD_STATUS] = COLAMD_ERROR_nrow_negative ; stats [COLAMD_INFO1] = n_row ; DEBUG0 (("colamd: nrow negative %d\n", n_row)) ; return (FALSE) ; } if (n_col < 0) /* n_col must be >= 0 */ { stats [COLAMD_STATUS] = COLAMD_ERROR_ncol_negative ; stats [COLAMD_INFO1] = n_col ; DEBUG0 (("colamd: ncol negative %d\n", n_col)) ; return (FALSE) ; } nnz = p [n_col] ; if (nnz < 0) /* nnz must be >= 0 */ { stats [COLAMD_STATUS] = COLAMD_ERROR_nnz_negative ; stats [COLAMD_INFO1] = nnz ; DEBUG0 (("colamd: number of entries negative %d\n", nnz)) ; return (FALSE) ; } if (p [0] != 0) { stats [COLAMD_STATUS] = COLAMD_ERROR_p0_nonzero ; stats [COLAMD_INFO1] = p [0] ; DEBUG0 (("colamd: p[0] not zero %d\n", p [0])) ; return (FALSE) ; } /* === If no knobs, set default knobs =================================== */ if (!knobs) { COLAMD_set_defaults (default_knobs) ; knobs = default_knobs ; } aggressive = (knobs [COLAMD_AGGRESSIVE] != FALSE) ; /* === Allocate the Row and Col arrays from array A ===================== */ ok = TRUE ; Col_size = COLAMD_C (n_col, &ok) ; /* size of Col array of structs */ Row_size = COLAMD_R (n_row, &ok) ; /* size of Row array of structs */ /* need = 2*nnz + n_col + Col_size + Row_size ; */ need = t_mult (nnz, 2, &ok) ; need = t_add (need, n_col, &ok) ; need = t_add (need, Col_size, &ok) ; need = t_add (need, Row_size, &ok) ; if (!ok || need > (size_t) Alen || need > Int_MAX) { /* not enough space in array A to perform the ordering */ stats [COLAMD_STATUS] = COLAMD_ERROR_A_too_small ; stats [COLAMD_INFO1] = need ; stats [COLAMD_INFO2] = Alen ; DEBUG0 (("colamd: Need Alen >= %d, given only Alen = %d\n", need,Alen)); return (FALSE) ; } Alen -= Col_size + Row_size ; Col = (Colamd_Col *) &A [Alen] ; Row = (Colamd_Row *) &A [Alen + Col_size] ; /* === Construct the row and column data structures ===================== */ if (!init_rows_cols (n_row, n_col, Row, Col, A, p, stats)) { /* input matrix is invalid */ DEBUG0 (("colamd: Matrix invalid\n")) ; return (FALSE) ; } /* === Initialize scores, kill dense rows/columns ======================= */ init_scoring (n_row, n_col, Row, Col, A, p, knobs, &n_row2, &n_col2, &max_deg) ; /* === Order the supercolumns =========================================== */ ngarbage = find_ordering (n_row, n_col, Alen, Row, Col, A, p, n_col2, max_deg, 2*nnz, aggressive) ; /* === Order the non-principal columns ================================== */ order_children (n_col, Col, p) ; /* === Return statistics in stats ======================================= */ stats [COLAMD_DENSE_ROW] = n_row - n_row2 ; stats [COLAMD_DENSE_COL] = n_col - n_col2 ; stats [COLAMD_DEFRAG_COUNT] = ngarbage ; DEBUG0 (("colamd: done.\n")) ; return (TRUE) ; } /* ========================================================================== */ /* === colamd_report ======================================================== */ /* ========================================================================== */ PUBLIC void COLAMD_report ( Int stats [COLAMD_STATS] ) { print_report ("colamd", stats) ; } /* ========================================================================== */ /* === symamd_report ======================================================== */ /* ========================================================================== */ PUBLIC void SYMAMD_report ( Int stats [COLAMD_STATS] ) { print_report ("symamd", stats) ; } /* ========================================================================== */ /* === NON-USER-CALLABLE ROUTINES: ========================================== */ /* ========================================================================== */ /* There are no user-callable routines beyond this point in the file */ /* ========================================================================== */ /* === init_rows_cols ======================================================= */ /* ========================================================================== */ /* Takes the column form of the matrix in A and creates the row form of the matrix. Also, row and column attributes are stored in the Col and Row structs. If the columns are un-sorted or contain duplicate row indices, this routine will also sort and remove duplicate row indices from the column form of the matrix. Returns FALSE if the matrix is invalid, TRUE otherwise. Not user-callable. */ PRIVATE Int init_rows_cols /* returns TRUE if OK, or FALSE otherwise */ ( /* === Parameters ======================================================= */ Int n_row, /* number of rows of A */ Int n_col, /* number of columns of A */ Colamd_Row Row [], /* of size n_row+1 */ Colamd_Col Col [], /* of size n_col+1 */ Int A [], /* row indices of A, of size Alen */ Int p [], /* pointers to columns in A, of size n_col+1 */ Int stats [COLAMD_STATS] /* colamd statistics */ ) { /* === Local variables ================================================== */ Int col ; /* a column index */ Int row ; /* a row index */ Int *cp ; /* a column pointer */ Int *cp_end ; /* a pointer to the end of a column */ Int *rp ; /* a row pointer */ Int *rp_end ; /* a pointer to the end of a row */ Int last_row ; /* previous row */ /* === Initialize columns, and check column pointers ==================== */ for (col = 0 ; col < n_col ; col++) { Col [col].start = p [col] ; Col [col].length = p [col+1] - p [col] ; if (Col [col].length < 0) { /* column pointers must be non-decreasing */ stats [COLAMD_STATUS] = COLAMD_ERROR_col_length_negative ; stats [COLAMD_INFO1] = col ; stats [COLAMD_INFO2] = Col [col].length ; DEBUG0 (("colamd: col %d length %d < 0\n", col, Col [col].length)) ; return (FALSE) ; } Col [col].shared1.thickness = 1 ; Col [col].shared2.score = 0 ; Col [col].shared3.prev = EMPTY ; Col [col].shared4.degree_next = EMPTY ; } /* p [0..n_col] no longer needed, used as "head" in subsequent routines */ /* === Scan columns, compute row degrees, and check row indices ========= */ stats [COLAMD_INFO3] = 0 ; /* number of duplicate or unsorted row indices*/ for (row = 0 ; row < n_row ; row++) { Row [row].length = 0 ; Row [row].shared2.mark = -1 ; } for (col = 0 ; col < n_col ; col++) { last_row = -1 ; cp = &A [p [col]] ; cp_end = &A [p [col+1]] ; while (cp < cp_end) { row = *cp++ ; /* make sure row indices within range */ if (row < 0 || row >= n_row) { stats [COLAMD_STATUS] = COLAMD_ERROR_row_index_out_of_bounds ; stats [COLAMD_INFO1] = col ; stats [COLAMD_INFO2] = row ; stats [COLAMD_INFO3] = n_row ; DEBUG0 (("colamd: row %d col %d out of bounds\n", row, col)) ; return (FALSE) ; } if (row <= last_row || Row [row].shared2.mark == col) { /* row index are unsorted or repeated (or both), thus col */ /* is jumbled. This is a notice, not an error condition. */ stats [COLAMD_STATUS] = COLAMD_OK_BUT_JUMBLED ; stats [COLAMD_INFO1] = col ; stats [COLAMD_INFO2] = row ; (stats [COLAMD_INFO3]) ++ ; DEBUG1 (("colamd: row %d col %d unsorted/duplicate\n",row,col)); } if (Row [row].shared2.mark != col) { Row [row].length++ ; } else { /* this is a repeated entry in the column, */ /* it will be removed */ Col [col].length-- ; } /* mark the row as having been seen in this column */ Row [row].shared2.mark = col ; last_row = row ; } } /* === Compute row pointers ============================================= */ /* row form of the matrix starts directly after the column */ /* form of matrix in A */ Row [0].start = p [n_col] ; Row [0].shared1.p = Row [0].start ; Row [0].shared2.mark = -1 ; for (row = 1 ; row < n_row ; row++) { Row [row].start = Row [row-1].start + Row [row-1].length ; Row [row].shared1.p = Row [row].start ; Row [row].shared2.mark = -1 ; } /* === Create row form ================================================== */ if (stats [COLAMD_STATUS] == COLAMD_OK_BUT_JUMBLED) { /* if cols jumbled, watch for repeated row indices */ for (col = 0 ; col < n_col ; col++) { cp = &A [p [col]] ; cp_end = &A [p [col+1]] ; while (cp < cp_end) { row = *cp++ ; if (Row [row].shared2.mark != col) { A [(Row [row].shared1.p)++] = col ; Row [row].shared2.mark = col ; } } } } else { /* if cols not jumbled, we don't need the mark (this is faster) */ for (col = 0 ; col < n_col ; col++) { cp = &A [p [col]] ; cp_end = &A [p [col+1]] ; while (cp < cp_end) { A [(Row [*cp++].shared1.p)++] = col ; } } } /* === Clear the row marks and set row degrees ========================== */ for (row = 0 ; row < n_row ; row++) { Row [row].shared2.mark = 0 ; Row [row].shared1.degree = Row [row].length ; } /* === See if we need to re-create columns ============================== */ if (stats [COLAMD_STATUS] == COLAMD_OK_BUT_JUMBLED) { DEBUG0 (("colamd: reconstructing column form, matrix jumbled\n")) ; #ifndef NDEBUG /* make sure column lengths are correct */ for (col = 0 ; col < n_col ; col++) { p [col] = Col [col].length ; } for (row = 0 ; row < n_row ; row++) { rp = &A [Row [row].start] ; rp_end = rp + Row [row].length ; while (rp < rp_end) { p [*rp++]-- ; } } for (col = 0 ; col < n_col ; col++) { ASSERT (p [col] == 0) ; } /* now p is all zero (different than when debugging is turned off) */ #endif /* NDEBUG */ /* === Compute col pointers ========================================= */ /* col form of the matrix starts at A [0]. */ /* Note, we may have a gap between the col form and the row */ /* form if there were duplicate entries, if so, it will be */ /* removed upon the first garbage collection */ Col [0].start = 0 ; p [0] = Col [0].start ; for (col = 1 ; col < n_col ; col++) { /* note that the lengths here are for pruned columns, i.e. */ /* no duplicate row indices will exist for these columns */ Col [col].start = Col [col-1].start + Col [col-1].length ; p [col] = Col [col].start ; } /* === Re-create col form =========================================== */ for (row = 0 ; row < n_row ; row++) { rp = &A [Row [row].start] ; rp_end = rp + Row [row].length ; while (rp < rp_end) { A [(p [*rp++])++] = row ; } } } /* === Done. Matrix is not (or no longer) jumbled ====================== */ return (TRUE) ; } /* ========================================================================== */ /* === init_scoring ========================================================= */ /* ========================================================================== */ /* Kills dense or empty columns and rows, calculates an initial score for each column, and places all columns in the degree lists. Not user-callable. */ PRIVATE void init_scoring ( /* === Parameters ======================================================= */ Int n_row, /* number of rows of A */ Int n_col, /* number of columns of A */ Colamd_Row Row [], /* of size n_row+1 */ Colamd_Col Col [], /* of size n_col+1 */ Int A [], /* column form and row form of A */ Int head [], /* of size n_col+1 */ double knobs [COLAMD_KNOBS],/* parameters */ Int *p_n_row2, /* number of non-dense, non-empty rows */ Int *p_n_col2, /* number of non-dense, non-empty columns */ Int *p_max_deg /* maximum row degree */ ) { /* === Local variables ================================================== */ Int c ; /* a column index */ Int r, row ; /* a row index */ Int *cp ; /* a column pointer */ Int deg ; /* degree of a row or column */ Int *cp_end ; /* a pointer to the end of a column */ Int *new_cp ; /* new column pointer */ Int col_length ; /* length of pruned column */ Int score ; /* current column score */ Int n_col2 ; /* number of non-dense, non-empty columns */ Int n_row2 ; /* number of non-dense, non-empty rows */ Int dense_row_count ; /* remove rows with more entries than this */ Int dense_col_count ; /* remove cols with more entries than this */ Int min_score ; /* smallest column score */ Int max_deg ; /* maximum row degree */ Int next_col ; /* Used to add to degree list.*/ #ifndef NDEBUG Int debug_count ; /* debug only. */ #endif /* NDEBUG */ /* === Extract knobs ==================================================== */ /* Note: if knobs contains a NaN, this is undefined: */ if (knobs [COLAMD_DENSE_ROW] < 0) { /* only remove completely dense rows */ dense_row_count = n_col-1 ; } else { dense_row_count = DENSE_DEGREE (knobs [COLAMD_DENSE_ROW], n_col) ; } if (knobs [COLAMD_DENSE_COL] < 0) { /* only remove completely dense columns */ dense_col_count = n_row-1 ; } else { dense_col_count = DENSE_DEGREE (knobs [COLAMD_DENSE_COL], MIN (n_row, n_col)) ; } DEBUG1 (("colamd: densecount: %d %d\n", dense_row_count, dense_col_count)) ; max_deg = 0 ; n_col2 = n_col ; n_row2 = n_row ; /* === Kill empty columns =============================================== */ /* Put the empty columns at the end in their natural order, so that LU */ /* factorization can proceed as far as possible. */ for (c = n_col-1 ; c >= 0 ; c--) { deg = Col [c].length ; if (deg == 0) { /* this is a empty column, kill and order it last */ Col [c].shared2.order = --n_col2 ; KILL_PRINCIPAL_COL (c) ; } } DEBUG1 (("colamd: null columns killed: %d\n", n_col - n_col2)) ; /* === Kill dense columns =============================================== */ /* Put the dense columns at the end, in their natural order */ for (c = n_col-1 ; c >= 0 ; c--) { /* skip any dead columns */ if (COL_IS_DEAD (c)) { continue ; } deg = Col [c].length ; if (deg > dense_col_count) { /* this is a dense column, kill and order it last */ Col [c].shared2.order = --n_col2 ; /* decrement the row degrees */ cp = &A [Col [c].start] ; cp_end = cp + Col [c].length ; while (cp < cp_end) { Row [*cp++].shared1.degree-- ; } KILL_PRINCIPAL_COL (c) ; } } DEBUG1 (("colamd: Dense and null columns killed: %d\n", n_col - n_col2)) ; /* === Kill dense and empty rows ======================================== */ for (r = 0 ; r < n_row ; r++) { deg = Row [r].shared1.degree ; ASSERT (deg >= 0 && deg <= n_col) ; if (deg > dense_row_count || deg == 0) { /* kill a dense or empty row */ KILL_ROW (r) ; --n_row2 ; } else { /* keep track of max degree of remaining rows */ max_deg = MAX (max_deg, deg) ; } } DEBUG1 (("colamd: Dense and null rows killed: %d\n", n_row - n_row2)) ; /* === Compute initial column scores ==================================== */ /* At this point the row degrees are accurate. They reflect the number */ /* of "live" (non-dense) columns in each row. No empty rows exist. */ /* Some "live" columns may contain only dead rows, however. These are */ /* pruned in the code below. */ /* now find the initial matlab score for each column */ for (c = n_col-1 ; c >= 0 ; c--) { /* skip dead column */ if (COL_IS_DEAD (c)) { continue ; } score = 0 ; cp = &A [Col [c].start] ; new_cp = cp ; cp_end = cp + Col [c].length ; while (cp < cp_end) { /* get a row */ row = *cp++ ; /* skip if dead */ if (ROW_IS_DEAD (row)) { continue ; } /* compact the column */ *new_cp++ = row ; /* add row's external degree */ score += Row [row].shared1.degree - 1 ; /* guard against integer overflow */ score = MIN (score, n_col) ; } /* determine pruned column length */ col_length = (Int) (new_cp - &A [Col [c].start]) ; if (col_length == 0) { /* a newly-made null column (all rows in this col are "dense" */ /* and have already been killed) */ DEBUG2 (("Newly null killed: %d\n", c)) ; Col [c].shared2.order = --n_col2 ; KILL_PRINCIPAL_COL (c) ; } else { /* set column length and set score */ ASSERT (score >= 0) ; ASSERT (score <= n_col) ; Col [c].length = col_length ; Col [c].shared2.score = score ; } } DEBUG1 (("colamd: Dense, null, and newly-null columns killed: %d\n", n_col-n_col2)) ; /* At this point, all empty rows and columns are dead. All live columns */ /* are "clean" (containing no dead rows) and simplicial (no supercolumns */ /* yet). Rows may contain dead columns, but all live rows contain at */ /* least one live column. */ #ifndef NDEBUG debug_structures (n_row, n_col, Row, Col, A, n_col2) ; #endif /* NDEBUG */ /* === Initialize degree lists ========================================== */ #ifndef NDEBUG debug_count = 0 ; #endif /* NDEBUG */ /* clear the hash buckets */ for (c = 0 ; c <= n_col ; c++) { head [c] = EMPTY ; } min_score = n_col ; /* place in reverse order, so low column indices are at the front */ /* of the lists. This is to encourage natural tie-breaking */ for (c = n_col-1 ; c >= 0 ; c--) { /* only add principal columns to degree lists */ if (COL_IS_ALIVE (c)) { DEBUG4 (("place %d score %d minscore %d ncol %d\n", c, Col [c].shared2.score, min_score, n_col)) ; /* === Add columns score to DList =============================== */ score = Col [c].shared2.score ; ASSERT (min_score >= 0) ; ASSERT (min_score <= n_col) ; ASSERT (score >= 0) ; ASSERT (score <= n_col) ; ASSERT (head [score] >= EMPTY) ; /* now add this column to dList at proper score location */ next_col = head [score] ; Col [c].shared3.prev = EMPTY ; Col [c].shared4.degree_next = next_col ; /* if there already was a column with the same score, set its */ /* previous pointer to this new column */ if (next_col != EMPTY) { Col [next_col].shared3.prev = c ; } head [score] = c ; /* see if this score is less than current min */ min_score = MIN (min_score, score) ; #ifndef NDEBUG debug_count++ ; #endif /* NDEBUG */ } } #ifndef NDEBUG DEBUG1 (("colamd: Live cols %d out of %d, non-princ: %d\n", debug_count, n_col, n_col-debug_count)) ; ASSERT (debug_count == n_col2) ; debug_deg_lists (n_row, n_col, Row, Col, head, min_score, n_col2, max_deg) ; #endif /* NDEBUG */ /* === Return number of remaining columns, and max row degree =========== */ *p_n_col2 = n_col2 ; *p_n_row2 = n_row2 ; *p_max_deg = max_deg ; } /* ========================================================================== */ /* === find_ordering ======================================================== */ /* ========================================================================== */ /* Order the principal columns of the supercolumn form of the matrix (no supercolumns on input). Uses a minimum approximate column minimum degree ordering method. Not user-callable. */ PRIVATE Int find_ordering /* return the number of garbage collections */ ( /* === Parameters ======================================================= */ Int n_row, /* number of rows of A */ Int n_col, /* number of columns of A */ Int Alen, /* size of A, 2*nnz + n_col or larger */ Colamd_Row Row [], /* of size n_row+1 */ Colamd_Col Col [], /* of size n_col+1 */ Int A [], /* column form and row form of A */ Int head [], /* of size n_col+1 */ Int n_col2, /* Remaining columns to order */ Int max_deg, /* Maximum row degree */ Int pfree, /* index of first free slot (2*nnz on entry) */ Int aggressive ) { /* === Local variables ================================================== */ Int k ; /* current pivot ordering step */ Int pivot_col ; /* current pivot column */ Int *cp ; /* a column pointer */ Int *rp ; /* a row pointer */ Int pivot_row ; /* current pivot row */ Int *new_cp ; /* modified column pointer */ Int *new_rp ; /* modified row pointer */ Int pivot_row_start ; /* pointer to start of pivot row */ Int pivot_row_degree ; /* number of columns in pivot row */ Int pivot_row_length ; /* number of supercolumns in pivot row */ Int pivot_col_score ; /* score of pivot column */ Int needed_memory ; /* free space needed for pivot row */ Int *cp_end ; /* pointer to the end of a column */ Int *rp_end ; /* pointer to the end of a row */ Int row ; /* a row index */ Int col ; /* a column index */ Int max_score ; /* maximum possible score */ Int cur_score ; /* score of current column */ unsigned Int hash ; /* hash value for supernode detection */ Int head_column ; /* head of hash bucket */ Int first_col ; /* first column in hash bucket */ Int tag_mark ; /* marker value for mark array */ Int row_mark ; /* Row [row].shared2.mark */ Int set_difference ; /* set difference size of row with pivot row */ Int min_score ; /* smallest column score */ Int col_thickness ; /* "thickness" (no. of columns in a supercol) */ Int max_mark ; /* maximum value of tag_mark */ Int pivot_col_thickness ; /* number of columns represented by pivot col */ Int prev_col ; /* Used by Dlist operations. */ Int next_col ; /* Used by Dlist operations. */ Int ngarbage ; /* number of garbage collections performed */ #ifndef NDEBUG Int debug_d ; /* debug loop counter */ Int debug_step = 0 ; /* debug loop counter */ #endif /* NDEBUG */ /* === Initialization and clear mark ==================================== */ max_mark = INT_MAX - n_col ; /* INT_MAX defined in */ tag_mark = clear_mark (0, max_mark, n_row, Row) ; min_score = 0 ; ngarbage = 0 ; DEBUG1 (("colamd: Ordering, n_col2=%d\n", n_col2)) ; /* === Order the columns ================================================ */ for (k = 0 ; k < n_col2 ; /* 'k' is incremented below */) { #ifndef NDEBUG if (debug_step % 100 == 0) { DEBUG2 (("\n... Step k: %d out of n_col2: %d\n", k, n_col2)) ; } else { DEBUG3 (("\n----------Step k: %d out of n_col2: %d\n", k, n_col2)) ; } debug_step++ ; debug_deg_lists (n_row, n_col, Row, Col, head, min_score, n_col2-k, max_deg) ; debug_matrix (n_row, n_col, Row, Col, A) ; #endif /* NDEBUG */ /* === Select pivot column, and order it ============================ */ /* make sure degree list isn't empty */ ASSERT (min_score >= 0) ; ASSERT (min_score <= n_col) ; ASSERT (head [min_score] >= EMPTY) ; #ifndef NDEBUG for (debug_d = 0 ; debug_d < min_score ; debug_d++) { ASSERT (head [debug_d] == EMPTY) ; } #endif /* NDEBUG */ /* get pivot column from head of minimum degree list */ while (head [min_score] == EMPTY && min_score < n_col) { min_score++ ; } pivot_col = head [min_score] ; ASSERT (pivot_col >= 0 && pivot_col <= n_col) ; next_col = Col [pivot_col].shared4.degree_next ; head [min_score] = next_col ; if (next_col != EMPTY) { Col [next_col].shared3.prev = EMPTY ; } ASSERT (COL_IS_ALIVE (pivot_col)) ; /* remember score for defrag check */ pivot_col_score = Col [pivot_col].shared2.score ; /* the pivot column is the kth column in the pivot order */ Col [pivot_col].shared2.order = k ; /* increment order count by column thickness */ pivot_col_thickness = Col [pivot_col].shared1.thickness ; k += pivot_col_thickness ; ASSERT (pivot_col_thickness > 0) ; DEBUG3 (("Pivot col: %d thick %d\n", pivot_col, pivot_col_thickness)) ; /* === Garbage_collection, if necessary ============================= */ needed_memory = MIN (pivot_col_score, n_col - k) ; if (pfree + needed_memory >= Alen) { pfree = garbage_collection (n_row, n_col, Row, Col, A, &A [pfree]) ; ngarbage++ ; /* after garbage collection we will have enough */ ASSERT (pfree + needed_memory < Alen) ; /* garbage collection has wiped out the Row[].shared2.mark array */ tag_mark = clear_mark (0, max_mark, n_row, Row) ; #ifndef NDEBUG debug_matrix (n_row, n_col, Row, Col, A) ; #endif /* NDEBUG */ } /* === Compute pivot row pattern ==================================== */ /* get starting location for this new merged row */ pivot_row_start = pfree ; /* initialize new row counts to zero */ pivot_row_degree = 0 ; /* tag pivot column as having been visited so it isn't included */ /* in merged pivot row */ Col [pivot_col].shared1.thickness = -pivot_col_thickness ; /* pivot row is the union of all rows in the pivot column pattern */ cp = &A [Col [pivot_col].start] ; cp_end = cp + Col [pivot_col].length ; while (cp < cp_end) { /* get a row */ row = *cp++ ; DEBUG4 (("Pivot col pattern %d %d\n", ROW_IS_ALIVE (row), row)) ; /* skip if row is dead */ if (ROW_IS_ALIVE (row)) { rp = &A [Row [row].start] ; rp_end = rp + Row [row].length ; while (rp < rp_end) { /* get a column */ col = *rp++ ; /* add the column, if alive and untagged */ col_thickness = Col [col].shared1.thickness ; if (col_thickness > 0 && COL_IS_ALIVE (col)) { /* tag column in pivot row */ Col [col].shared1.thickness = -col_thickness ; ASSERT (pfree < Alen) ; /* place column in pivot row */ A [pfree++] = col ; pivot_row_degree += col_thickness ; } } } } /* clear tag on pivot column */ Col [pivot_col].shared1.thickness = pivot_col_thickness ; max_deg = MAX (max_deg, pivot_row_degree) ; #ifndef NDEBUG DEBUG3 (("check2\n")) ; debug_mark (n_row, Row, tag_mark, max_mark) ; #endif /* NDEBUG */ /* === Kill all rows used to construct pivot row ==================== */ /* also kill pivot row, temporarily */ cp = &A [Col [pivot_col].start] ; cp_end = cp + Col [pivot_col].length ; while (cp < cp_end) { /* may be killing an already dead row */ row = *cp++ ; DEBUG3 (("Kill row in pivot col: %d\n", row)) ; KILL_ROW (row) ; } /* === Select a row index to use as the new pivot row =============== */ pivot_row_length = pfree - pivot_row_start ; if (pivot_row_length > 0) { /* pick the "pivot" row arbitrarily (first row in col) */ pivot_row = A [Col [pivot_col].start] ; DEBUG3 (("Pivotal row is %d\n", pivot_row)) ; } else { /* there is no pivot row, since it is of zero length */ pivot_row = EMPTY ; ASSERT (pivot_row_length == 0) ; } ASSERT (Col [pivot_col].length > 0 || pivot_row_length == 0) ; /* === Approximate degree computation =============================== */ /* Here begins the computation of the approximate degree. The column */ /* score is the sum of the pivot row "length", plus the size of the */ /* set differences of each row in the column minus the pattern of the */ /* pivot row itself. The column ("thickness") itself is also */ /* excluded from the column score (we thus use an approximate */ /* external degree). */ /* The time taken by the following code (compute set differences, and */ /* add them up) is proportional to the size of the data structure */ /* being scanned - that is, the sum of the sizes of each column in */ /* the pivot row. Thus, the amortized time to compute a column score */ /* is proportional to the size of that column (where size, in this */ /* context, is the column "length", or the number of row indices */ /* in that column). The number of row indices in a column is */ /* monotonically non-decreasing, from the length of the original */ /* column on input to colamd. */ /* === Compute set differences ====================================== */ DEBUG3 (("** Computing set differences phase. **\n")) ; /* pivot row is currently dead - it will be revived later. */ DEBUG3 (("Pivot row: ")) ; /* for each column in pivot row */ rp = &A [pivot_row_start] ; rp_end = rp + pivot_row_length ; while (rp < rp_end) { col = *rp++ ; ASSERT (COL_IS_ALIVE (col) && col != pivot_col) ; DEBUG3 (("Col: %d\n", col)) ; /* clear tags used to construct pivot row pattern */ col_thickness = -Col [col].shared1.thickness ; ASSERT (col_thickness > 0) ; Col [col].shared1.thickness = col_thickness ; /* === Remove column from degree list =========================== */ cur_score = Col [col].shared2.score ; prev_col = Col [col].shared3.prev ; next_col = Col [col].shared4.degree_next ; ASSERT (cur_score >= 0) ; ASSERT (cur_score <= n_col) ; ASSERT (cur_score >= EMPTY) ; if (prev_col == EMPTY) { head [cur_score] = next_col ; } else { Col [prev_col].shared4.degree_next = next_col ; } if (next_col != EMPTY) { Col [next_col].shared3.prev = prev_col ; } /* === Scan the column ========================================== */ cp = &A [Col [col].start] ; cp_end = cp + Col [col].length ; while (cp < cp_end) { /* get a row */ row = *cp++ ; row_mark = Row [row].shared2.mark ; /* skip if dead */ if (ROW_IS_MARKED_DEAD (row_mark)) { continue ; } ASSERT (row != pivot_row) ; set_difference = row_mark - tag_mark ; /* check if the row has been seen yet */ if (set_difference < 0) { ASSERT (Row [row].shared1.degree <= max_deg) ; set_difference = Row [row].shared1.degree ; } /* subtract column thickness from this row's set difference */ set_difference -= col_thickness ; ASSERT (set_difference >= 0) ; /* absorb this row if the set difference becomes zero */ if (set_difference == 0 && aggressive) { DEBUG3 (("aggressive absorption. Row: %d\n", row)) ; KILL_ROW (row) ; } else { /* save the new mark */ Row [row].shared2.mark = set_difference + tag_mark ; } } } #ifndef NDEBUG debug_deg_lists (n_row, n_col, Row, Col, head, min_score, n_col2-k-pivot_row_degree, max_deg) ; #endif /* NDEBUG */ /* === Add up set differences for each column ======================= */ DEBUG3 (("** Adding set differences phase. **\n")) ; /* for each column in pivot row */ rp = &A [pivot_row_start] ; rp_end = rp + pivot_row_length ; while (rp < rp_end) { /* get a column */ col = *rp++ ; ASSERT (COL_IS_ALIVE (col) && col != pivot_col) ; hash = 0 ; cur_score = 0 ; cp = &A [Col [col].start] ; /* compact the column */ new_cp = cp ; cp_end = cp + Col [col].length ; DEBUG4 (("Adding set diffs for Col: %d.\n", col)) ; while (cp < cp_end) { /* get a row */ row = *cp++ ; ASSERT(row >= 0 && row < n_row) ; row_mark = Row [row].shared2.mark ; /* skip if dead */ if (ROW_IS_MARKED_DEAD (row_mark)) { DEBUG4 ((" Row %d, dead\n", row)) ; continue ; } DEBUG4 ((" Row %d, set diff %d\n", row, row_mark-tag_mark)); ASSERT (row_mark >= tag_mark) ; /* compact the column */ *new_cp++ = row ; /* compute hash function */ hash += row ; /* add set difference */ cur_score += row_mark - tag_mark ; /* integer overflow... */ cur_score = MIN (cur_score, n_col) ; } /* recompute the column's length */ Col [col].length = (Int) (new_cp - &A [Col [col].start]) ; /* === Further mass elimination ================================= */ if (Col [col].length == 0) { DEBUG4 (("further mass elimination. Col: %d\n", col)) ; /* nothing left but the pivot row in this column */ KILL_PRINCIPAL_COL (col) ; pivot_row_degree -= Col [col].shared1.thickness ; ASSERT (pivot_row_degree >= 0) ; /* order it */ Col [col].shared2.order = k ; /* increment order count by column thickness */ k += Col [col].shared1.thickness ; } else { /* === Prepare for supercolumn detection ==================== */ DEBUG4 (("Preparing supercol detection for Col: %d.\n", col)) ; /* save score so far */ Col [col].shared2.score = cur_score ; /* add column to hash table, for supercolumn detection */ hash %= n_col + 1 ; DEBUG4 ((" Hash = %d, n_col = %d.\n", hash, n_col)) ; ASSERT (((Int) hash) <= n_col) ; head_column = head [hash] ; if (head_column > EMPTY) { /* degree list "hash" is non-empty, use prev (shared3) of */ /* first column in degree list as head of hash bucket */ first_col = Col [head_column].shared3.headhash ; Col [head_column].shared3.headhash = col ; } else { /* degree list "hash" is empty, use head as hash bucket */ first_col = - (head_column + 2) ; head [hash] = - (col + 2) ; } Col [col].shared4.hash_next = first_col ; /* save hash function in Col [col].shared3.hash */ Col [col].shared3.hash = (Int) hash ; ASSERT (COL_IS_ALIVE (col)) ; } } /* The approximate external column degree is now computed. */ /* === Supercolumn detection ======================================== */ DEBUG3 (("** Supercolumn detection phase. **\n")) ; detect_super_cols ( #ifndef NDEBUG n_col, Row, #endif /* NDEBUG */ Col, A, head, pivot_row_start, pivot_row_length) ; /* === Kill the pivotal column ====================================== */ KILL_PRINCIPAL_COL (pivot_col) ; /* === Clear mark =================================================== */ tag_mark = clear_mark (tag_mark+max_deg+1, max_mark, n_row, Row) ; #ifndef NDEBUG DEBUG3 (("check3\n")) ; debug_mark (n_row, Row, tag_mark, max_mark) ; #endif /* NDEBUG */ /* === Finalize the new pivot row, and column scores ================ */ DEBUG3 (("** Finalize scores phase. **\n")) ; /* for each column in pivot row */ rp = &A [pivot_row_start] ; /* compact the pivot row */ new_rp = rp ; rp_end = rp + pivot_row_length ; while (rp < rp_end) { col = *rp++ ; /* skip dead columns */ if (COL_IS_DEAD (col)) { continue ; } *new_rp++ = col ; /* add new pivot row to column */ A [Col [col].start + (Col [col].length++)] = pivot_row ; /* retrieve score so far and add on pivot row's degree. */ /* (we wait until here for this in case the pivot */ /* row's degree was reduced due to mass elimination). */ cur_score = Col [col].shared2.score + pivot_row_degree ; /* calculate the max possible score as the number of */ /* external columns minus the 'k' value minus the */ /* columns thickness */ max_score = n_col - k - Col [col].shared1.thickness ; /* make the score the external degree of the union-of-rows */ cur_score -= Col [col].shared1.thickness ; /* make sure score is less or equal than the max score */ cur_score = MIN (cur_score, max_score) ; ASSERT (cur_score >= 0) ; /* store updated score */ Col [col].shared2.score = cur_score ; /* === Place column back in degree list ========================= */ ASSERT (min_score >= 0) ; ASSERT (min_score <= n_col) ; ASSERT (cur_score >= 0) ; ASSERT (cur_score <= n_col) ; ASSERT (head [cur_score] >= EMPTY) ; next_col = head [cur_score] ; Col [col].shared4.degree_next = next_col ; Col [col].shared3.prev = EMPTY ; if (next_col != EMPTY) { Col [next_col].shared3.prev = col ; } head [cur_score] = col ; /* see if this score is less than current min */ min_score = MIN (min_score, cur_score) ; } #ifndef NDEBUG debug_deg_lists (n_row, n_col, Row, Col, head, min_score, n_col2-k, max_deg) ; #endif /* NDEBUG */ /* === Resurrect the new pivot row ================================== */ if (pivot_row_degree > 0) { /* update pivot row length to reflect any cols that were killed */ /* during super-col detection and mass elimination */ Row [pivot_row].start = pivot_row_start ; Row [pivot_row].length = (Int) (new_rp - &A[pivot_row_start]) ; ASSERT (Row [pivot_row].length > 0) ; Row [pivot_row].shared1.degree = pivot_row_degree ; Row [pivot_row].shared2.mark = 0 ; /* pivot row is no longer dead */ DEBUG1 (("Resurrect Pivot_row %d deg: %d\n", pivot_row, pivot_row_degree)) ; } } /* === All principal columns have now been ordered ====================== */ return (ngarbage) ; } /* ========================================================================== */ /* === order_children ======================================================= */ /* ========================================================================== */ /* The find_ordering routine has ordered all of the principal columns (the representatives of the supercolumns). The non-principal columns have not yet been ordered. This routine orders those columns by walking up the parent tree (a column is a child of the column which absorbed it). The final permutation vector is then placed in p [0 ... n_col-1], with p [0] being the first column, and p [n_col-1] being the last. It doesn't look like it at first glance, but be assured that this routine takes time linear in the number of columns. Although not immediately obvious, the time taken by this routine is O (n_col), that is, linear in the number of columns. Not user-callable. */ PRIVATE void order_children ( /* === Parameters ======================================================= */ Int n_col, /* number of columns of A */ Colamd_Col Col [], /* of size n_col+1 */ Int p [] /* p [0 ... n_col-1] is the column permutation*/ ) { /* === Local variables ================================================== */ Int i ; /* loop counter for all columns */ Int c ; /* column index */ Int parent ; /* index of column's parent */ Int order ; /* column's order */ /* === Order each non-principal column ================================== */ for (i = 0 ; i < n_col ; i++) { /* find an un-ordered non-principal column */ ASSERT (COL_IS_DEAD (i)) ; if (!COL_IS_DEAD_PRINCIPAL (i) && Col [i].shared2.order == EMPTY) { parent = i ; /* once found, find its principal parent */ do { parent = Col [parent].shared1.parent ; } while (!COL_IS_DEAD_PRINCIPAL (parent)) ; /* now, order all un-ordered non-principal columns along path */ /* to this parent. collapse tree at the same time */ c = i ; /* get order of parent */ order = Col [parent].shared2.order ; do { ASSERT (Col [c].shared2.order == EMPTY) ; /* order this column */ Col [c].shared2.order = order++ ; /* collaps tree */ Col [c].shared1.parent = parent ; /* get immediate parent of this column */ c = Col [c].shared1.parent ; /* continue until we hit an ordered column. There are */ /* guarranteed not to be anymore unordered columns */ /* above an ordered column */ } while (Col [c].shared2.order == EMPTY) ; /* re-order the super_col parent to largest order for this group */ Col [parent].shared2.order = order ; } } /* === Generate the permutation ========================================= */ for (c = 0 ; c < n_col ; c++) { p [Col [c].shared2.order] = c ; } } /* ========================================================================== */ /* === detect_super_cols ==================================================== */ /* ========================================================================== */ /* Detects supercolumns by finding matches between columns in the hash buckets. Check amongst columns in the set A [row_start ... row_start + row_length-1]. The columns under consideration are currently *not* in the degree lists, and have already been placed in the hash buckets. The hash bucket for columns whose hash function is equal to h is stored as follows: if head [h] is >= 0, then head [h] contains a degree list, so: head [h] is the first column in degree bucket h. Col [head [h]].headhash gives the first column in hash bucket h. otherwise, the degree list is empty, and: -(head [h] + 2) is the first column in hash bucket h. For a column c in a hash bucket, Col [c].shared3.prev is NOT a "previous column" pointer. Col [c].shared3.hash is used instead as the hash number for that column. The value of Col [c].shared4.hash_next is the next column in the same hash bucket. Assuming no, or "few" hash collisions, the time taken by this routine is linear in the sum of the sizes (lengths) of each column whose score has just been computed in the approximate degree computation. Not user-callable. */ PRIVATE void detect_super_cols ( /* === Parameters ======================================================= */ #ifndef NDEBUG /* these two parameters are only needed when debugging is enabled: */ Int n_col, /* number of columns of A */ Colamd_Row Row [], /* of size n_row+1 */ #endif /* NDEBUG */ Colamd_Col Col [], /* of size n_col+1 */ Int A [], /* row indices of A */ Int head [], /* head of degree lists and hash buckets */ Int row_start, /* pointer to set of columns to check */ Int row_length /* number of columns to check */ ) { /* === Local variables ================================================== */ Int hash ; /* hash value for a column */ Int *rp ; /* pointer to a row */ Int c ; /* a column index */ Int super_c ; /* column index of the column to absorb into */ Int *cp1 ; /* column pointer for column super_c */ Int *cp2 ; /* column pointer for column c */ Int length ; /* length of column super_c */ Int prev_c ; /* column preceding c in hash bucket */ Int i ; /* loop counter */ Int *rp_end ; /* pointer to the end of the row */ Int col ; /* a column index in the row to check */ Int head_column ; /* first column in hash bucket or degree list */ Int first_col ; /* first column in hash bucket */ /* === Consider each column in the row ================================== */ rp = &A [row_start] ; rp_end = rp + row_length ; while (rp < rp_end) { col = *rp++ ; if (COL_IS_DEAD (col)) { continue ; } /* get hash number for this column */ hash = Col [col].shared3.hash ; ASSERT (hash <= n_col) ; /* === Get the first column in this hash bucket ===================== */ head_column = head [hash] ; if (head_column > EMPTY) { first_col = Col [head_column].shared3.headhash ; } else { first_col = - (head_column + 2) ; } /* === Consider each column in the hash bucket ====================== */ for (super_c = first_col ; super_c != EMPTY ; super_c = Col [super_c].shared4.hash_next) { ASSERT (COL_IS_ALIVE (super_c)) ; ASSERT (Col [super_c].shared3.hash == hash) ; length = Col [super_c].length ; /* prev_c is the column preceding column c in the hash bucket */ prev_c = super_c ; /* === Compare super_c with all columns after it ================ */ for (c = Col [super_c].shared4.hash_next ; c != EMPTY ; c = Col [c].shared4.hash_next) { ASSERT (c != super_c) ; ASSERT (COL_IS_ALIVE (c)) ; ASSERT (Col [c].shared3.hash == hash) ; /* not identical if lengths or scores are different */ if (Col [c].length != length || Col [c].shared2.score != Col [super_c].shared2.score) { prev_c = c ; continue ; } /* compare the two columns */ cp1 = &A [Col [super_c].start] ; cp2 = &A [Col [c].start] ; for (i = 0 ; i < length ; i++) { /* the columns are "clean" (no dead rows) */ ASSERT (ROW_IS_ALIVE (*cp1)) ; ASSERT (ROW_IS_ALIVE (*cp2)) ; /* row indices will same order for both supercols, */ /* no gather scatter nessasary */ if (*cp1++ != *cp2++) { break ; } } /* the two columns are different if the for-loop "broke" */ if (i != length) { prev_c = c ; continue ; } /* === Got it! two columns are identical =================== */ ASSERT (Col [c].shared2.score == Col [super_c].shared2.score) ; Col [super_c].shared1.thickness += Col [c].shared1.thickness ; Col [c].shared1.parent = super_c ; KILL_NON_PRINCIPAL_COL (c) ; /* order c later, in order_children() */ Col [c].shared2.order = EMPTY ; /* remove c from hash bucket */ Col [prev_c].shared4.hash_next = Col [c].shared4.hash_next ; } } /* === Empty this hash bucket ======================================= */ if (head_column > EMPTY) { /* corresponding degree list "hash" is not empty */ Col [head_column].shared3.headhash = EMPTY ; } else { /* corresponding degree list "hash" is empty */ head [hash] = EMPTY ; } } } /* ========================================================================== */ /* === garbage_collection =================================================== */ /* ========================================================================== */ /* Defragments and compacts columns and rows in the workspace A. Used when all avaliable memory has been used while performing row merging. Returns the index of the first free position in A, after garbage collection. The time taken by this routine is linear is the size of the array A, which is itself linear in the number of nonzeros in the input matrix. Not user-callable. */ PRIVATE Int garbage_collection /* returns the new value of pfree */ ( /* === Parameters ======================================================= */ Int n_row, /* number of rows */ Int n_col, /* number of columns */ Colamd_Row Row [], /* row info */ Colamd_Col Col [], /* column info */ Int A [], /* A [0 ... Alen-1] holds the matrix */ Int *pfree /* &A [0] ... pfree is in use */ ) { /* === Local variables ================================================== */ Int *psrc ; /* source pointer */ Int *pdest ; /* destination pointer */ Int j ; /* counter */ Int r ; /* a row index */ Int c ; /* a column index */ Int length ; /* length of a row or column */ #ifndef NDEBUG Int debug_rows ; DEBUG2 (("Defrag..\n")) ; for (psrc = &A[0] ; psrc < pfree ; psrc++) ASSERT (*psrc >= 0) ; debug_rows = 0 ; #endif /* NDEBUG */ /* === Defragment the columns =========================================== */ pdest = &A[0] ; for (c = 0 ; c < n_col ; c++) { if (COL_IS_ALIVE (c)) { psrc = &A [Col [c].start] ; /* move and compact the column */ ASSERT (pdest <= psrc) ; Col [c].start = (Int) (pdest - &A [0]) ; length = Col [c].length ; for (j = 0 ; j < length ; j++) { r = *psrc++ ; if (ROW_IS_ALIVE (r)) { *pdest++ = r ; } } Col [c].length = (Int) (pdest - &A [Col [c].start]) ; } } /* === Prepare to defragment the rows =================================== */ for (r = 0 ; r < n_row ; r++) { if (ROW_IS_DEAD (r) || (Row [r].length == 0)) { /* This row is already dead, or is of zero length. Cannot compact * a row of zero length, so kill it. NOTE: in the current version, * there are no zero-length live rows. Kill the row (for the first * time, or again) just to be safe. */ KILL_ROW (r) ; } else { /* save first column index in Row [r].shared2.first_column */ psrc = &A [Row [r].start] ; Row [r].shared2.first_column = *psrc ; ASSERT (ROW_IS_ALIVE (r)) ; /* flag the start of the row with the one's complement of row */ *psrc = ONES_COMPLEMENT (r) ; #ifndef NDEBUG debug_rows++ ; #endif /* NDEBUG */ } } /* === Defragment the rows ============================================== */ psrc = pdest ; while (psrc < pfree) { /* find a negative number ... the start of a row */ if (*psrc++ < 0) { psrc-- ; /* get the row index */ r = ONES_COMPLEMENT (*psrc) ; ASSERT (r >= 0 && r < n_row) ; /* restore first column index */ *psrc = Row [r].shared2.first_column ; ASSERT (ROW_IS_ALIVE (r)) ; ASSERT (Row [r].length > 0) ; /* move and compact the row */ ASSERT (pdest <= psrc) ; Row [r].start = (Int) (pdest - &A [0]) ; length = Row [r].length ; for (j = 0 ; j < length ; j++) { c = *psrc++ ; if (COL_IS_ALIVE (c)) { *pdest++ = c ; } } Row [r].length = (Int) (pdest - &A [Row [r].start]) ; ASSERT (Row [r].length > 0) ; #ifndef NDEBUG debug_rows-- ; #endif /* NDEBUG */ } } /* ensure we found all the rows */ ASSERT (debug_rows == 0) ; /* === Return the new value of pfree ==================================== */ return ((Int) (pdest - &A [0])) ; } /* ========================================================================== */ /* === clear_mark =========================================================== */ /* ========================================================================== */ /* Clears the Row [].shared2.mark array, and returns the new tag_mark. Return value is the new tag_mark. Not user-callable. */ PRIVATE Int clear_mark /* return the new value for tag_mark */ ( /* === Parameters ======================================================= */ Int tag_mark, /* new value of tag_mark */ Int max_mark, /* max allowed value of tag_mark */ Int n_row, /* number of rows in A */ Colamd_Row Row [] /* Row [0 ... n_row-1].shared2.mark is set to zero */ ) { /* === Local variables ================================================== */ Int r ; if (tag_mark <= 0 || tag_mark >= max_mark) { for (r = 0 ; r < n_row ; r++) { if (ROW_IS_ALIVE (r)) { Row [r].shared2.mark = 0 ; } } tag_mark = 1 ; } return (tag_mark) ; } /* ========================================================================== */ /* === print_report ========================================================= */ /* ========================================================================== */ PRIVATE void print_report ( char *method, Int stats [COLAMD_STATS] ) { Int i1, i2, i3 ; PRINTF (("\n%s version %d.%d, %s: ", method, COLAMD_MAIN_VERSION, COLAMD_SUB_VERSION, COLAMD_DATE)) ; if (!stats) { PRINTF (("No statistics available.\n")) ; return ; } i1 = stats [COLAMD_INFO1] ; i2 = stats [COLAMD_INFO2] ; i3 = stats [COLAMD_INFO3] ; if (stats [COLAMD_STATUS] >= 0) { PRINTF (("OK. ")) ; } else { PRINTF (("ERROR. ")) ; } switch (stats [COLAMD_STATUS]) { case COLAMD_OK_BUT_JUMBLED: PRINTF(("Matrix has unsorted or duplicate row indices.\n")) ; PRINTF(("%s: number of duplicate or out-of-order row indices: %d\n", method, i3)) ; PRINTF(("%s: last seen duplicate or out-of-order row index: %d\n", method, INDEX (i2))) ; PRINTF(("%s: last seen in column: %d", method, INDEX (i1))) ; /* no break - fall through to next case instead */ case COLAMD_OK: PRINTF(("\n")) ; PRINTF(("%s: number of dense or empty rows ignored: %d\n", method, stats [COLAMD_DENSE_ROW])) ; PRINTF(("%s: number of dense or empty columns ignored: %d\n", method, stats [COLAMD_DENSE_COL])) ; PRINTF(("%s: number of garbage collections performed: %d\n", method, stats [COLAMD_DEFRAG_COUNT])) ; break ; case COLAMD_ERROR_A_not_present: PRINTF(("Array A (row indices of matrix) not present.\n")) ; break ; case COLAMD_ERROR_p_not_present: PRINTF(("Array p (column pointers for matrix) not present.\n")) ; break ; case COLAMD_ERROR_nrow_negative: PRINTF(("Invalid number of rows (%d).\n", i1)) ; break ; case COLAMD_ERROR_ncol_negative: PRINTF(("Invalid number of columns (%d).\n", i1)) ; break ; case COLAMD_ERROR_nnz_negative: PRINTF(("Invalid number of nonzero entries (%d).\n", i1)) ; break ; case COLAMD_ERROR_p0_nonzero: PRINTF(("Invalid column pointer, p [0] = %d, must be zero.\n", i1)); break ; case COLAMD_ERROR_A_too_small: PRINTF(("Array A too small.\n")) ; PRINTF((" Need Alen >= %d, but given only Alen = %d.\n", i1, i2)) ; break ; case COLAMD_ERROR_col_length_negative: PRINTF (("Column %d has a negative number of nonzero entries (%d).\n", INDEX (i1), i2)) ; break ; case COLAMD_ERROR_row_index_out_of_bounds: PRINTF (("Row index (row %d) out of bounds (%d to %d) in column %d.\n", INDEX (i2), INDEX (0), INDEX (i3-1), INDEX (i1))) ; break ; case COLAMD_ERROR_out_of_memory: PRINTF(("Out of memory.\n")) ; break ; /* v2.4: internal-error case deleted */ } } /* ========================================================================== */ /* === colamd debugging routines ============================================ */ /* ========================================================================== */ /* When debugging is disabled, the remainder of this file is ignored. */ #ifndef NDEBUG /* ========================================================================== */ /* === debug_structures ===================================================== */ /* ========================================================================== */ /* At this point, all empty rows and columns are dead. All live columns are "clean" (containing no dead rows) and simplicial (no supercolumns yet). Rows may contain dead columns, but all live rows contain at least one live column. */ PRIVATE void debug_structures ( /* === Parameters ======================================================= */ Int n_row, Int n_col, Colamd_Row Row [], Colamd_Col Col [], Int A [], Int n_col2 ) { /* === Local variables ================================================== */ Int i ; Int c ; Int *cp ; Int *cp_end ; Int len ; Int score ; Int r ; Int *rp ; Int *rp_end ; Int deg ; /* === Check A, Row, and Col ============================================ */ for (c = 0 ; c < n_col ; c++) { if (COL_IS_ALIVE (c)) { len = Col [c].length ; score = Col [c].shared2.score ; DEBUG4 (("initial live col %5d %5d %5d\n", c, len, score)) ; ASSERT (len > 0) ; ASSERT (score >= 0) ; ASSERT (Col [c].shared1.thickness == 1) ; cp = &A [Col [c].start] ; cp_end = cp + len ; while (cp < cp_end) { r = *cp++ ; ASSERT (ROW_IS_ALIVE (r)) ; } } else { i = Col [c].shared2.order ; ASSERT (i >= n_col2 && i < n_col) ; } } for (r = 0 ; r < n_row ; r++) { if (ROW_IS_ALIVE (r)) { i = 0 ; len = Row [r].length ; deg = Row [r].shared1.degree ; ASSERT (len > 0) ; ASSERT (deg > 0) ; rp = &A [Row [r].start] ; rp_end = rp + len ; while (rp < rp_end) { c = *rp++ ; if (COL_IS_ALIVE (c)) { i++ ; } } ASSERT (i > 0) ; } } } /* ========================================================================== */ /* === debug_deg_lists ====================================================== */ /* ========================================================================== */ /* Prints the contents of the degree lists. Counts the number of columns in the degree list and compares it to the total it should have. Also checks the row degrees. */ PRIVATE void debug_deg_lists ( /* === Parameters ======================================================= */ Int n_row, Int n_col, Colamd_Row Row [], Colamd_Col Col [], Int head [], Int min_score, Int should, Int max_deg ) { /* === Local variables ================================================== */ Int deg ; Int col ; Int have ; Int row ; /* === Check the degree lists =========================================== */ if (n_col > 10000 && colamd_debug <= 0) { return ; } have = 0 ; DEBUG4 (("Degree lists: %d\n", min_score)) ; for (deg = 0 ; deg <= n_col ; deg++) { col = head [deg] ; if (col == EMPTY) { continue ; } DEBUG4 (("%d:", deg)) ; while (col != EMPTY) { DEBUG4 ((" %d", col)) ; have += Col [col].shared1.thickness ; ASSERT (COL_IS_ALIVE (col)) ; col = Col [col].shared4.degree_next ; } DEBUG4 (("\n")) ; } DEBUG4 (("should %d have %d\n", should, have)) ; ASSERT (should == have) ; /* === Check the row degrees ============================================ */ if (n_row > 10000 && colamd_debug <= 0) { return ; } for (row = 0 ; row < n_row ; row++) { if (ROW_IS_ALIVE (row)) { ASSERT (Row [row].shared1.degree <= max_deg) ; } } } /* ========================================================================== */ /* === debug_mark =========================================================== */ /* ========================================================================== */ /* Ensures that the tag_mark is less that the maximum and also ensures that each entry in the mark array is less than the tag mark. */ PRIVATE void debug_mark ( /* === Parameters ======================================================= */ Int n_row, Colamd_Row Row [], Int tag_mark, Int max_mark ) { /* === Local variables ================================================== */ Int r ; /* === Check the Row marks ============================================== */ ASSERT (tag_mark > 0 && tag_mark <= max_mark) ; if (n_row > 10000 && colamd_debug <= 0) { return ; } for (r = 0 ; r < n_row ; r++) { ASSERT (Row [r].shared2.mark < tag_mark) ; } } /* ========================================================================== */ /* === debug_matrix ========================================================= */ /* ========================================================================== */ /* Prints out the contents of the columns and the rows. */ PRIVATE void debug_matrix ( /* === Parameters ======================================================= */ Int n_row, Int n_col, Colamd_Row Row [], Colamd_Col Col [], Int A [] ) { /* === Local variables ================================================== */ Int r ; Int c ; Int *rp ; Int *rp_end ; Int *cp ; Int *cp_end ; /* === Dump the rows and columns of the matrix ========================== */ if (colamd_debug < 3) { return ; } DEBUG3 (("DUMP MATRIX:\n")) ; for (r = 0 ; r < n_row ; r++) { DEBUG3 (("Row %d alive? %d\n", r, ROW_IS_ALIVE (r))) ; if (ROW_IS_DEAD (r)) { continue ; } DEBUG3 (("start %d length %d degree %d\n", Row [r].start, Row [r].length, Row [r].shared1.degree)) ; rp = &A [Row [r].start] ; rp_end = rp + Row [r].length ; while (rp < rp_end) { c = *rp++ ; DEBUG4 ((" %d col %d\n", COL_IS_ALIVE (c), c)) ; } } for (c = 0 ; c < n_col ; c++) { DEBUG3 (("Col %d alive? %d\n", c, COL_IS_ALIVE (c))) ; if (COL_IS_DEAD (c)) { continue ; } DEBUG3 (("start %d length %d shared1 %d shared2 %d\n", Col [c].start, Col [c].length, Col [c].shared1.thickness, Col [c].shared2.score)) ; cp = &A [Col [c].start] ; cp_end = cp + Col [c].length ; while (cp < cp_end) { r = *cp++ ; DEBUG4 ((" %d row %d\n", ROW_IS_ALIVE (r), r)) ; } } } PRIVATE void colamd_get_debug ( char *method ) { FILE *f ; colamd_debug = 0 ; /* no debug printing */ f = fopen ("debug", "r") ; if (f == (FILE *) NULL) { colamd_debug = 0 ; } else { fscanf (f, "%d", &colamd_debug) ; fclose (f) ; } DEBUG0 (("%s: debug version, D = %d (THIS WILL BE SLOW!)\n", method, colamd_debug)) ; } #endif /* NDEBUG */ glpk-5.0/src/colamd/colamd.h0000644000062000006210000000406313766346220015143 0ustar maomkpasswd/* colamd.h */ /* Written by Andrew Makhorin . */ #ifndef COLAMD_H #define COLAMD_H #include "env.h" #define COLAMD_DATE "Nov 1, 2007" #define COLAMD_VERSION_CODE(main, sub) ((main) * 1000 + (sub)) #define COLAMD_MAIN_VERSION 2 #define COLAMD_SUB_VERSION 7 #define COLAMD_SUBSUB_VERSION 1 #define COLAMD_VERSION \ COLAMD_VERSION_CODE(COLAMD_MAIN_VERSION, COLAMD_SUB_VERSION) #define COLAMD_KNOBS 20 #define COLAMD_STATS 20 #define COLAMD_DENSE_ROW 0 #define COLAMD_DENSE_COL 1 #define COLAMD_AGGRESSIVE 2 #define COLAMD_DEFRAG_COUNT 2 #define COLAMD_STATUS 3 #define COLAMD_INFO1 4 #define COLAMD_INFO2 5 #define COLAMD_INFO3 6 #define COLAMD_OK (0) #define COLAMD_OK_BUT_JUMBLED (1) #define COLAMD_ERROR_A_not_present (-1) #define COLAMD_ERROR_p_not_present (-2) #define COLAMD_ERROR_nrow_negative (-3) #define COLAMD_ERROR_ncol_negative (-4) #define COLAMD_ERROR_nnz_negative (-5) #define COLAMD_ERROR_p0_nonzero (-6) #define COLAMD_ERROR_A_too_small (-7) #define COLAMD_ERROR_col_length_negative (-8) #define COLAMD_ERROR_row_index_out_of_bounds (-9) #define COLAMD_ERROR_out_of_memory (-10) #define COLAMD_ERROR_internal_error (-999) #define colamd_recommended _glp_colamd_recommended size_t colamd_recommended(int nnz, int n_row, int n_col); #define colamd_set_defaults _glp_colamd_set_defaults void colamd_set_defaults(double knobs [COLAMD_KNOBS]); #define colamd _glp_colamd int colamd(int n_row, int n_col, int Alen, int A[], int p[], double knobs[COLAMD_KNOBS], int stats[COLAMD_STATS]); #define symamd _glp_symamd int symamd(int n, int A[], int p[], int perm[], double knobs[COLAMD_KNOBS], int stats[COLAMD_STATS], void *(*allocate)(size_t, size_t), void(*release)(void *)); #define colamd_report _glp_colamd_report void colamd_report(int stats[COLAMD_STATS]); #define symamd_report _glp_symamd_report void symamd_report(int stats[COLAMD_STATS]); #define colamd_printf xprintf #endif /* eof */ glpk-5.0/src/colamd/COPYING0000644000062000006210000006362513766346220014577 0ustar maomkpasswd GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, 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 and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, 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 library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete 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 distribute a copy of this License along with the Library. 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 Library or any portion of it, thus forming a work based on the Library, 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) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, 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 Library, 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 Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you 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. If distribution of 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 satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be 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. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library 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. 9. 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 Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library 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 with this License. 11. 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 Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library 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 Library. 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. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library 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. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser 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 Library 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 Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, 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 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "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 LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. 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 LIBRARY 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 LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), 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 Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. 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 library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! glpk-5.0/src/colamd/README0000644000062000006210000001027413766346220014414 0ustar maomkpasswdNOTE: Files in this subdirectory are NOT part of the GLPK package, but are used with GLPK. The original code was modified according to GLPK requirements by Andrew Makhorin . ************************************************************************ COLAMD/SYMAMD Version 2.7, Copyright (C) 1998-2007, Timothy A. Davis, All Rights Reserved. Description: colamd: an approximate minimum degree column ordering algorithm, for LU factorization of symmetric or unsymmetric matrices, QR factorization, least squares, interior point methods for linear programming problems, and other related problems. symamd: an approximate minimum degree ordering algorithm for Cholesky factorization of symmetric matrices. Purpose: Colamd computes a permutation Q such that the Cholesky factorization of (AQ)'(AQ) has less fill-in and requires fewer floating point operations than A'A. This also provides a good ordering for sparse partial pivoting methods, P(AQ) = LU, where Q is computed prior to numerical factorization, and P is computed during numerical factorization via conventional partial pivoting with row interchanges. Colamd is the column ordering method used in SuperLU, part of the ScaLAPACK library. It is also available as built-in function in MATLAB Version 6, available from MathWorks, Inc. (http://www.mathworks.com). This routine can be used in place of colmmd in MATLAB. Symamd computes a permutation P of a symmetric matrix A such that the Cholesky factorization of PAP' has less fill-in and requires fewer floating point operations than A. Symamd constructs a matrix M such that M'M has the same nonzero pattern of A, and then orders the columns of M using colmmd. The column ordering of M is then returned as the row and column ordering P of A. Authors: The authors of the code itself are Stefan I. Larimore and Timothy A. Davis (davis at cise.ufl.edu), University of Florida. The algorithm was developed in collaboration with John Gilbert, Xerox PARC, and Esmond Ng, Oak Ridge National Laboratory. Acknowledgements: This work was supported by the National Science Foundation, under grants DMS-9504974 and DMS-9803599. License: This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. Permission is hereby granted to use or copy this program under the terms of the GNU LGPL, provided that the Copyright, this License, and the Availability of the original version is retained on all copies. User documentation of any code that uses this code or any modified version of this code must cite the Copyright, this License, the Availability note, and "Used by permission." Permission to modify the code and to distribute modified code is granted, provided the Copyright, this License, and the Availability note are retained, and a notice that the code was modified is included. COLAMD is also available under alternate licenses, contact T. Davis for details. Availability: The colamd/symamd library is available at: http://www.cise.ufl.edu/research/sparse/colamd/ References: T. A. Davis, J. R. Gilbert, S. Larimore, E. Ng, An approximate column minimum degree ordering algorithm, ACM Transactions on Mathematical Software, vol. 30, no. 3., pp. 353-376, 2004. T. A. Davis, J. R. Gilbert, S. Larimore, E. Ng, Algorithm 836: COLAMD, an approximate column minimum degree ordering algorithm, ACM Transactions on Mathematical Software, vol. 30, no. 3., pp. 377-380, 2004. glpk-5.0/src/draft/0000755000062000006210000000000013766346220013371 5ustar maomkpasswdglpk-5.0/src/draft/bfd.c0000644000062000006210000003516213766346220014277 0ustar maomkpasswd/* bfd.c (LP basis factorization driver) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2007-2014 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "glpk.h" #include "env.h" #include "bfd.h" #include "fhvint.h" #include "scfint.h" #ifdef GLP_DEBUG #include "glpspm.h" #endif struct BFD { /* LP basis factorization driver */ int valid; /* factorization is valid only if this flag is set */ int type; /* type of factorization used: 0 - interface not established yet 1 - FHV-factorization 2 - Schur-complement-based factorization */ union { void *none; /* type = 0 */ FHVINT *fhvi; /* type = 1 */ SCFINT *scfi; /* type = 2 */ } u; /* interface to factorization of LP basis */ glp_bfcp parm; /* factorization control parameters */ #ifdef GLP_DEBUG SPM *B; /* current basis (for testing/debugging only) */ #endif int upd_cnt; /* factorization update count */ #if 1 /* 21/IV-2014 */ double b_norm; /* 1-norm of matrix B */ double i_norm; /* estimated 1-norm of matrix inv(B) */ #endif }; BFD *bfd_create_it(void) { /* create LP basis factorization */ BFD *bfd; #ifdef GLP_DEBUG xprintf("bfd_create_it: warning: debugging version used\n"); #endif bfd = talloc(1, BFD); bfd->valid = 0; bfd->type = 0; bfd->u.none = NULL; bfd_set_bfcp(bfd, NULL); #ifdef GLP_DEBUG bfd->B = NULL; #endif bfd->upd_cnt = 0; return bfd; } #if 0 /* 08/III-2014 */ void bfd_set_parm(BFD *bfd, const void *parm) { /* change LP basis factorization control parameters */ memcpy(&bfd->parm, parm, sizeof(glp_bfcp)); return; } #endif void bfd_get_bfcp(BFD *bfd, void /* glp_bfcp */ *parm) { /* retrieve LP basis factorization control parameters */ memcpy(parm, &bfd->parm, sizeof(glp_bfcp)); return; } void bfd_set_bfcp(BFD *bfd, const void /* glp_bfcp */ *parm) { /* change LP basis factorization control parameters */ if (parm == NULL) { /* reset to default */ memset(&bfd->parm, 0, sizeof(glp_bfcp)); bfd->parm.type = GLP_BF_LUF + GLP_BF_FT; bfd->parm.piv_tol = 0.10; bfd->parm.piv_lim = 4; bfd->parm.suhl = 1; bfd->parm.eps_tol = DBL_EPSILON; bfd->parm.nfs_max = 100; bfd->parm.nrs_max = 70; } else memcpy(&bfd->parm, parm, sizeof(glp_bfcp)); return; } #if 1 /* 21/IV-2014 */ struct bfd_info { BFD *bfd; int (*col)(void *info, int j, int ind[], double val[]); void *info; }; static int bfd_col(void *info_, int j, int ind[], double val[]) { struct bfd_info *info = info_; int t, len; double sum; len = info->col(info->info, j, ind, val); sum = 0.0; for (t = 1; t <= len; t++) { if (val[t] >= 0.0) sum += val[t]; else sum -= val[t]; } if (info->bfd->b_norm < sum) info->bfd->b_norm = sum; return len; } #endif int bfd_factorize(BFD *bfd, int m, /*const int bh[],*/ int (*col1) (void *info, int j, int ind[], double val[]), void *info1) { /* compute LP basis factorization */ #if 1 /* 21/IV-2014 */ struct bfd_info info; #endif int type, ret; /*xassert(bh == bh);*/ /* invalidate current factorization */ bfd->valid = 0; /* determine required factorization type */ switch (bfd->parm.type) { case GLP_BF_LUF + GLP_BF_FT: type = 1; break; case GLP_BF_LUF + GLP_BF_BG: case GLP_BF_LUF + GLP_BF_GR: case GLP_BF_BTF + GLP_BF_BG: case GLP_BF_BTF + GLP_BF_GR: type = 2; break; default: xassert(bfd != bfd); } /* delete factorization interface, if necessary */ switch (bfd->type) { case 0: break; case 1: if (type != 1) { bfd->type = 0; fhvint_delete(bfd->u.fhvi); bfd->u.fhvi = NULL; } break; case 2: if (type != 2) { bfd->type = 0; scfint_delete(bfd->u.scfi); bfd->u.scfi = NULL; } break; default: xassert(bfd != bfd); } /* establish factorization interface, if necessary */ if (bfd->type == 0) { switch (type) { case 1: bfd->type = 1; xassert(bfd->u.fhvi == NULL); bfd->u.fhvi = fhvint_create(); break; case 2: bfd->type = 2; xassert(bfd->u.scfi == NULL); if (!(bfd->parm.type & GLP_BF_BTF)) bfd->u.scfi = scfint_create(1); else bfd->u.scfi = scfint_create(2); break; default: xassert(type != type); } } /* try to compute factorization */ #if 1 /* 21/IV-2014 */ bfd->b_norm = bfd->i_norm = 0.0; info.bfd = bfd; info.col = col1; info.info = info1; #endif switch (bfd->type) { case 1: bfd->u.fhvi->lufi->sgf_piv_tol = bfd->parm.piv_tol; bfd->u.fhvi->lufi->sgf_piv_lim = bfd->parm.piv_lim; bfd->u.fhvi->lufi->sgf_suhl = bfd->parm.suhl; bfd->u.fhvi->lufi->sgf_eps_tol = bfd->parm.eps_tol; bfd->u.fhvi->nfs_max = bfd->parm.nfs_max; ret = fhvint_factorize(bfd->u.fhvi, m, bfd_col, &info); #if 1 /* FIXME */ if (ret == 0) bfd->i_norm = fhvint_estimate(bfd->u.fhvi); else ret = BFD_ESING; #endif break; case 2: if (bfd->u.scfi->scf.type == 1) { bfd->u.scfi->u.lufi->sgf_piv_tol = bfd->parm.piv_tol; bfd->u.scfi->u.lufi->sgf_piv_lim = bfd->parm.piv_lim; bfd->u.scfi->u.lufi->sgf_suhl = bfd->parm.suhl; bfd->u.scfi->u.lufi->sgf_eps_tol = bfd->parm.eps_tol; } else if (bfd->u.scfi->scf.type == 2) { bfd->u.scfi->u.btfi->sgf_piv_tol = bfd->parm.piv_tol; bfd->u.scfi->u.btfi->sgf_piv_lim = bfd->parm.piv_lim; bfd->u.scfi->u.btfi->sgf_suhl = bfd->parm.suhl; bfd->u.scfi->u.btfi->sgf_eps_tol = bfd->parm.eps_tol; } else xassert(bfd != bfd); bfd->u.scfi->nn_max = bfd->parm.nrs_max; ret = scfint_factorize(bfd->u.scfi, m, bfd_col, &info); #if 1 /* FIXME */ if (ret == 0) bfd->i_norm = scfint_estimate(bfd->u.scfi); else ret = BFD_ESING; #endif break; default: xassert(bfd != bfd); } #ifdef GLP_DEBUG /* save specified LP basis */ if (bfd->B != NULL) spm_delete_mat(bfd->B); bfd->B = spm_create_mat(m, m); { int *ind = talloc(1+m, int); double *val = talloc(1+m, double); int j, k, len; for (j = 1; j <= m; j++) { len = col(info, j, ind, val); for (k = 1; k <= len; k++) spm_new_elem(bfd->B, ind[k], j, val[k]); } tfree(ind); tfree(val); } #endif if (ret == 0) { /* factorization has been successfully computed */ double cond; bfd->valid = 1; #ifdef GLP_DEBUG cond = bfd_condest(bfd); if (cond > 1e9) xprintf("bfd_factorize: warning: cond(B) = %g\n", cond); #endif } #ifdef GLP_DEBUG xprintf("bfd_factorize: m = %d; ret = %d\n", m, ret); #endif bfd->upd_cnt = 0; return ret; } #if 0 /* 21/IV-2014 */ double bfd_estimate(BFD *bfd) { /* estimate 1-norm of inv(B) */ double norm; xassert(bfd->valid); xassert(bfd->upd_cnt == 0); switch (bfd->type) { case 1: norm = fhvint_estimate(bfd->u.fhvi); break; case 2: norm = scfint_estimate(bfd->u.scfi); break; default: xassert(bfd != bfd); } return norm; } #endif #if 1 /* 21/IV-2014 */ double bfd_condest(BFD *bfd) { /* estimate condition of B */ double cond; xassert(bfd->valid); /*xassert(bfd->upd_cnt == 0);*/ cond = bfd->b_norm * bfd->i_norm; if (cond < 1.0) cond = 1.0; return cond; } #endif void bfd_ftran(BFD *bfd, double x[]) { /* perform forward transformation (solve system B * x = b) */ #ifdef GLP_DEBUG SPM *B = bfd->B; int m = B->m; double *b = talloc(1+m, double); SPME *e; int k; double s, relerr, maxerr; for (k = 1; k <= m; k++) b[k] = x[k]; #endif xassert(bfd->valid); switch (bfd->type) { case 1: fhvint_ftran(bfd->u.fhvi, x); break; case 2: scfint_ftran(bfd->u.scfi, x); break; default: xassert(bfd != bfd); } #ifdef GLP_DEBUG maxerr = 0.0; for (k = 1; k <= m; k++) { s = 0.0; for (e = B->row[k]; e != NULL; e = e->r_next) s += e->val * x[e->j]; relerr = (b[k] - s) / (1.0 + fabs(b[k])); if (maxerr < relerr) maxerr = relerr; } if (maxerr > 1e-8) xprintf("bfd_ftran: maxerr = %g; relative error too large\n", maxerr); tfree(b); #endif return; } #if 1 /* 30/III-2016 */ void bfd_ftran_s(BFD *bfd, FVS *x) { /* sparse version of bfd_ftran */ /* (sparse mode is not implemented yet) */ int n = x->n; int *ind = x->ind; double *vec = x->vec; int j, nnz = 0; bfd_ftran(bfd, vec); for (j = n; j >= 1; j--) { if (vec[j] != 0.0) ind[++nnz] = j; } x->nnz = nnz; return; } #endif void bfd_btran(BFD *bfd, double x[]) { /* perform backward transformation (solve system B'* x = b) */ #ifdef GLP_DEBUG SPM *B = bfd->B; int m = B->m; double *b = talloc(1+m, double); SPME *e; int k; double s, relerr, maxerr; for (k = 1; k <= m; k++) b[k] = x[k]; #endif xassert(bfd->valid); switch (bfd->type) { case 1: fhvint_btran(bfd->u.fhvi, x); break; case 2: scfint_btran(bfd->u.scfi, x); break; default: xassert(bfd != bfd); } #ifdef GLP_DEBUG maxerr = 0.0; for (k = 1; k <= m; k++) { s = 0.0; for (e = B->col[k]; e != NULL; e = e->c_next) s += e->val * x[e->i]; relerr = (b[k] - s) / (1.0 + fabs(b[k])); if (maxerr < relerr) maxerr = relerr; } if (maxerr > 1e-8) xprintf("bfd_btran: maxerr = %g; relative error too large\n", maxerr); tfree(b); #endif return; } #if 1 /* 30/III-2016 */ void bfd_btran_s(BFD *bfd, FVS *x) { /* sparse version of bfd_btran */ /* (sparse mode is not implemented yet) */ int n = x->n; int *ind = x->ind; double *vec = x->vec; int j, nnz = 0; bfd_btran(bfd, vec); for (j = n; j >= 1; j--) { if (vec[j] != 0.0) ind[++nnz] = j; } x->nnz = nnz; return; } #endif int bfd_update(BFD *bfd, int j, int len, const int ind[], const double val[]) { /* update LP basis factorization */ int ret; xassert(bfd->valid); switch (bfd->type) { case 1: ret = fhvint_update(bfd->u.fhvi, j, len, ind, val); #if 1 /* FIXME */ switch (ret) { case 0: break; case 1: ret = BFD_ESING; break; case 2: case 3: ret = BFD_ECOND; break; case 4: ret = BFD_ELIMIT; break; case 5: ret = BFD_ECHECK; break; default: xassert(ret != ret); } #endif break; case 2: switch (bfd->parm.type & 0x0F) { case GLP_BF_BG: ret = scfint_update(bfd->u.scfi, 1, j, len, ind, val); break; case GLP_BF_GR: ret = scfint_update(bfd->u.scfi, 2, j, len, ind, val); break; default: xassert(bfd != bfd); } #if 1 /* FIXME */ switch (ret) { case 0: break; case 1: ret = BFD_ELIMIT; break; case 2: ret = BFD_ECOND; break; default: xassert(ret != ret); } #endif break; default: xassert(bfd != bfd); } if (ret != 0) { /* updating factorization failed */ bfd->valid = 0; } #ifdef GLP_DEBUG /* save updated LP basis */ { SPME *e; int k; for (e = bfd->B->col[j]; e != NULL; e = e->c_next) e->val = 0.0; spm_drop_zeros(bfd->B, 0.0); for (k = 1; k <= len; k++) spm_new_elem(bfd->B, ind[k], j, val[k]); } #endif if (ret == 0) bfd->upd_cnt++; return ret; } int bfd_get_count(BFD *bfd) { /* determine factorization update count */ return bfd->upd_cnt; } void bfd_delete_it(BFD *bfd) { /* delete LP basis factorization */ switch (bfd->type) { case 0: break; case 1: fhvint_delete(bfd->u.fhvi); break; case 2: scfint_delete(bfd->u.scfi); break; default: xassert(bfd != bfd); } #ifdef GLP_DEBUG if (bfd->B != NULL) spm_delete_mat(bfd->B); #endif tfree(bfd); return; } /* eof */ glpk-5.0/src/draft/bfd.h0000644000062000006210000000625013766346220014300 0ustar maomkpasswd/* bfd.h (LP basis factorization driver) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2007-2014 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef BFD_H #define BFD_H #if 1 /* 30/III-2016 */ #include "fvs.h" #endif typedef struct BFD BFD; /* return codes: */ #define BFD_ESING 1 /* singular matrix */ #define BFD_ECOND 2 /* ill-conditioned matrix */ #define BFD_ECHECK 3 /* insufficient accuracy */ #define BFD_ELIMIT 4 /* update limit reached */ #if 0 /* 05/III-2014 */ #define BFD_EROOM 5 /* SVA overflow */ #endif #define bfd_create_it _glp_bfd_create_it BFD *bfd_create_it(void); /* create LP basis factorization */ #if 0 /* 08/III-2014 */ #define bfd_set_parm _glp_bfd_set_parm void bfd_set_parm(BFD *bfd, const void *parm); /* change LP basis factorization control parameters */ #endif #define bfd_get_bfcp _glp_bfd_get_bfcp void bfd_get_bfcp(BFD *bfd, void /* glp_bfcp */ *parm); /* retrieve LP basis factorization control parameters */ #define bfd_set_bfcp _glp_bfd_set_bfcp void bfd_set_bfcp(BFD *bfd, const void /* glp_bfcp */ *parm); /* change LP basis factorization control parameters */ #define bfd_factorize _glp_bfd_factorize int bfd_factorize(BFD *bfd, int m, /*const int bh[],*/ int (*col) (void *info, int j, int ind[], double val[]), void *info); /* compute LP basis factorization */ #if 1 /* 21/IV-2014 */ #define bfd_condest _glp_bfd_condest double bfd_condest(BFD *bfd); /* estimate condition of B */ #endif #define bfd_ftran _glp_bfd_ftran void bfd_ftran(BFD *bfd, double x[]); /* perform forward transformation (solve system B*x = b) */ #if 1 /* 30/III-2016 */ #define bfd_ftran_s _glp_bfd_ftran_s void bfd_ftran_s(BFD *bfd, FVS *x); /* sparse version of bfd_ftran */ #endif #define bfd_btran _glp_bfd_btran void bfd_btran(BFD *bfd, double x[]); /* perform backward transformation (solve system B'*x = b) */ #if 1 /* 30/III-2016 */ #define bfd_btran_s _glp_bfd_btran_s void bfd_btran_s(BFD *bfd, FVS *x); /* sparse version of bfd_btran */ #endif #define bfd_update _glp_bfd_update int bfd_update(BFD *bfd, int j, int len, const int ind[], const double val[]); /* update LP basis factorization */ #define bfd_get_count _glp_bfd_get_count int bfd_get_count(BFD *bfd); /* determine factorization update count */ #define bfd_delete_it _glp_bfd_delete_it void bfd_delete_it(BFD *bfd); /* delete LP basis factorization */ #endif /* eof */ glpk-5.0/src/draft/bfx.c0000644000062000006210000000472313766346220014322 0ustar maomkpasswd/* bfx.c (LP basis factorization driver, rational arithmetic) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2007-2014 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "bfx.h" #include "env.h" #include "lux.h" struct BFX { int valid; LUX *lux; }; BFX *bfx_create_binv(void) { /* create factorization of the basis matrix */ BFX *bfx; bfx = xmalloc(sizeof(BFX)); bfx->valid = 0; bfx->lux = NULL; return bfx; } int bfx_factorize(BFX *binv, int m, int (*col)(void *info, int j, int ind[], mpq_t val[]), void *info) { /* compute factorization of the basis matrix */ int ret; xassert(m > 0); if (binv->lux != NULL && binv->lux->n != m) { lux_delete(binv->lux); binv->lux = NULL; } if (binv->lux == NULL) binv->lux = lux_create(m); ret = lux_decomp(binv->lux, col, info); binv->valid = (ret == 0); return ret; } void bfx_ftran(BFX *binv, mpq_t x[], int save) { /* perform forward transformation (FTRAN) */ xassert(binv->valid); lux_solve(binv->lux, 0, x); xassert(save == save); return; } void bfx_btran(BFX *binv, mpq_t x[]) { /* perform backward transformation (BTRAN) */ xassert(binv->valid); lux_solve(binv->lux, 1, x); return; } int bfx_update(BFX *binv, int j) { /* update factorization of the basis matrix */ xassert(binv->valid); xassert(1 <= j && j <= binv->lux->n); return 1; } void bfx_delete_binv(BFX *binv) { /* delete factorization of the basis matrix */ if (binv->lux != NULL) lux_delete(binv->lux); xfree(binv); return; } /* eof */ glpk-5.0/src/draft/bfx.h0000644000062000006210000000412213766346220014320 0ustar maomkpasswd/* bfx.h (LP basis factorization driver, rational arithmetic) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2007-2014 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef BFX_H #define BFX_H #include "mygmp.h" typedef struct BFX BFX; #define bfx_create_binv _glp_bfx_create_binv BFX *bfx_create_binv(void); /* create factorization of the basis matrix */ #define bfx_is_valid _glp_bfx_is_valid int bfx_is_valid(BFX *binv); /* check if factorization is valid */ #define bfx_invalidate _glp_bfx_invalidate void bfx_invalidate(BFX *binv); /* invalidate factorization of the basis matrix */ #define bfx_factorize _glp_bfx_factorize int bfx_factorize(BFX *binv, int m, int (*col)(void *info, int j, int ind[], mpq_t val[]), void *info); /* compute factorization of the basis matrix */ #define bfx_ftran _glp_bfx_ftran void bfx_ftran(BFX *binv, mpq_t x[], int save); /* perform forward transformation (FTRAN) */ #define bfx_btran _glp_bfx_btran void bfx_btran(BFX *binv, mpq_t x[]); /* perform backward transformation (BTRAN) */ #define bfx_update _glp_bfx_update int bfx_update(BFX *binv, int j); /* update factorization of the basis matrix */ #define bfx_delete_binv _glp_bfx_delete_binv void bfx_delete_binv(BFX *binv); /* delete factorization of the basis matrix */ #endif /* eof */ glpk-5.0/src/draft/draft.h0000644000062000006210000000064413766346220014646 0ustar maomkpasswd/* draft.h */ #ifndef DRAFT_H #define DRAFT_H #if 1 /* 28/III-2016 */ #define GLP_UNDOC 1 #endif #include "glpk.h" #if 1 /* 28/XI-2009 */ int _glp_analyze_row(glp_prob *P, int len, const int ind[], const double val[], int type, double rhs, double eps, int *_piv, double *_x, double *_dx, double *_y, double *_dy, double *_dz); /* simulate one iteration of dual simplex method */ #endif #endif /* eof */ glpk-5.0/src/draft/glpapi06.c0000644000062000006210000006620313766346220015166 0ustar maomkpasswd/* glpapi06.c (simplex method routines) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2007-2018 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "ios.h" #include "npp.h" #if 0 /* 07/XI-2015 */ #include "glpspx.h" #else #include "simplex.h" #define spx_dual spy_dual #endif /*********************************************************************** * NAME * * glp_simplex - solve LP problem with the simplex method * * SYNOPSIS * * int glp_simplex(glp_prob *P, const glp_smcp *parm); * * DESCRIPTION * * The routine glp_simplex is a driver to the LP solver based on the * simplex method. This routine retrieves problem data from the * specified problem object, calls the solver to solve the problem * instance, and stores results of computations back into the problem * object. * * The simplex solver has a set of control parameters. Values of the * control parameters can be passed in a structure glp_smcp, which the * parameter parm points to. * * The parameter parm can be specified as NULL, in which case the LP * solver uses default settings. * * RETURNS * * 0 The LP problem instance has been successfully solved. This code * does not necessarily mean that the solver has found optimal * solution. It only means that the solution process was successful. * * GLP_EBADB * Unable to start the search, because the initial basis specified * in the problem object is invalid--the number of basic (auxiliary * and structural) variables is not the same as the number of rows in * the problem object. * * GLP_ESING * Unable to start the search, because the basis matrix correspodning * to the initial basis is singular within the working precision. * * GLP_ECOND * Unable to start the search, because the basis matrix correspodning * to the initial basis is ill-conditioned, i.e. its condition number * is too large. * * GLP_EBOUND * Unable to start the search, because some double-bounded variables * have incorrect bounds. * * GLP_EFAIL * The search was prematurely terminated due to the solver failure. * * GLP_EOBJLL * The search was prematurely terminated, because the objective * function being maximized has reached its lower limit and continues * decreasing (dual simplex only). * * GLP_EOBJUL * The search was prematurely terminated, because the objective * function being minimized has reached its upper limit and continues * increasing (dual simplex only). * * GLP_EITLIM * The search was prematurely terminated, because the simplex * iteration limit has been exceeded. * * GLP_ETMLIM * The search was prematurely terminated, because the time limit has * been exceeded. * * GLP_ENOPFS * The LP problem instance has no primal feasible solution (only if * the LP presolver is used). * * GLP_ENODFS * The LP problem instance has no dual feasible solution (only if the * LP presolver is used). */ static void trivial_lp(glp_prob *P, const glp_smcp *parm) { /* solve trivial LP which has empty constraint matrix */ GLPROW *row; GLPCOL *col; int i, j; double p_infeas, d_infeas, zeta; P->valid = 0; P->pbs_stat = P->dbs_stat = GLP_FEAS; P->obj_val = P->c0; P->some = 0; p_infeas = d_infeas = 0.0; /* make all auxiliary variables basic */ for (i = 1; i <= P->m; i++) { row = P->row[i]; row->stat = GLP_BS; row->prim = row->dual = 0.0; /* check primal feasibility */ if (row->type == GLP_LO || row->type == GLP_DB || row->type == GLP_FX) { /* row has lower bound */ if (row->lb > + parm->tol_bnd) { P->pbs_stat = GLP_NOFEAS; if (P->some == 0 && parm->meth != GLP_PRIMAL) P->some = i; } if (p_infeas < + row->lb) p_infeas = + row->lb; } if (row->type == GLP_UP || row->type == GLP_DB || row->type == GLP_FX) { /* row has upper bound */ if (row->ub < - parm->tol_bnd) { P->pbs_stat = GLP_NOFEAS; if (P->some == 0 && parm->meth != GLP_PRIMAL) P->some = i; } if (p_infeas < - row->ub) p_infeas = - row->ub; } } /* determine scale factor for the objective row */ zeta = 1.0; for (j = 1; j <= P->n; j++) { col = P->col[j]; if (zeta < fabs(col->coef)) zeta = fabs(col->coef); } zeta = (P->dir == GLP_MIN ? +1.0 : -1.0) / zeta; /* make all structural variables non-basic */ for (j = 1; j <= P->n; j++) { col = P->col[j]; if (col->type == GLP_FR) col->stat = GLP_NF, col->prim = 0.0; else if (col->type == GLP_LO) lo: col->stat = GLP_NL, col->prim = col->lb; else if (col->type == GLP_UP) up: col->stat = GLP_NU, col->prim = col->ub; else if (col->type == GLP_DB) { if (zeta * col->coef > 0.0) goto lo; else if (zeta * col->coef < 0.0) goto up; else if (fabs(col->lb) <= fabs(col->ub)) goto lo; else goto up; } else if (col->type == GLP_FX) col->stat = GLP_NS, col->prim = col->lb; col->dual = col->coef; P->obj_val += col->coef * col->prim; /* check dual feasibility */ if (col->type == GLP_FR || col->type == GLP_LO) { /* column has no upper bound */ if (zeta * col->dual < - parm->tol_dj) { P->dbs_stat = GLP_NOFEAS; if (P->some == 0 && parm->meth == GLP_PRIMAL) P->some = P->m + j; } if (d_infeas < - zeta * col->dual) d_infeas = - zeta * col->dual; } if (col->type == GLP_FR || col->type == GLP_UP) { /* column has no lower bound */ if (zeta * col->dual > + parm->tol_dj) { P->dbs_stat = GLP_NOFEAS; if (P->some == 0 && parm->meth == GLP_PRIMAL) P->some = P->m + j; } if (d_infeas < + zeta * col->dual) d_infeas = + zeta * col->dual; } } /* simulate the simplex solver output */ if (parm->msg_lev >= GLP_MSG_ON && parm->out_dly == 0) { xprintf("~%6d: obj = %17.9e infeas = %10.3e\n", P->it_cnt, P->obj_val, parm->meth == GLP_PRIMAL ? p_infeas : d_infeas); } if (parm->msg_lev >= GLP_MSG_ALL && parm->out_dly == 0) { if (P->pbs_stat == GLP_FEAS && P->dbs_stat == GLP_FEAS) xprintf("OPTIMAL SOLUTION FOUND\n"); else if (P->pbs_stat == GLP_NOFEAS) xprintf("PROBLEM HAS NO FEASIBLE SOLUTION\n"); else if (parm->meth == GLP_PRIMAL) xprintf("PROBLEM HAS UNBOUNDED SOLUTION\n"); else xprintf("PROBLEM HAS NO DUAL FEASIBLE SOLUTION\n"); } return; } static int solve_lp(glp_prob *P, const glp_smcp *parm) { /* solve LP directly without using the preprocessor */ int ret; if (!glp_bf_exists(P)) { ret = glp_factorize(P); if (ret == 0) ; else if (ret == GLP_EBADB) { if (parm->msg_lev >= GLP_MSG_ERR) xprintf("glp_simplex: initial basis is invalid\n"); } else if (ret == GLP_ESING) { if (parm->msg_lev >= GLP_MSG_ERR) xprintf("glp_simplex: initial basis is singular\n"); } else if (ret == GLP_ECOND) { if (parm->msg_lev >= GLP_MSG_ERR) xprintf( "glp_simplex: initial basis is ill-conditioned\n"); } else xassert(ret != ret); if (ret != 0) goto done; } if (parm->meth == GLP_PRIMAL) ret = spx_primal(P, parm); else if (parm->meth == GLP_DUALP) { ret = spx_dual(P, parm); if (ret == GLP_EFAIL && P->valid) ret = spx_primal(P, parm); } else if (parm->meth == GLP_DUAL) ret = spx_dual(P, parm); else xassert(parm != parm); done: return ret; } static int preprocess_and_solve_lp(glp_prob *P, const glp_smcp *parm) { /* solve LP using the preprocessor */ NPP *npp; glp_prob *lp = NULL; glp_bfcp bfcp; int ret; if (parm->msg_lev >= GLP_MSG_ALL) xprintf("Preprocessing...\n"); /* create preprocessor workspace */ npp = npp_create_wksp(); /* load original problem into the preprocessor workspace */ npp_load_prob(npp, P, GLP_OFF, GLP_SOL, GLP_OFF); /* process LP prior to applying primal/dual simplex method */ ret = npp_simplex(npp, parm); if (ret == 0) ; else if (ret == GLP_ENOPFS) { if (parm->msg_lev >= GLP_MSG_ALL) xprintf("PROBLEM HAS NO PRIMAL FEASIBLE SOLUTION\n"); } else if (ret == GLP_ENODFS) { if (parm->msg_lev >= GLP_MSG_ALL) xprintf("PROBLEM HAS NO DUAL FEASIBLE SOLUTION\n"); } else xassert(ret != ret); if (ret != 0) goto done; /* build transformed LP */ lp = glp_create_prob(); npp_build_prob(npp, lp); /* if the transformed LP is empty, it has empty solution, which is optimal */ if (lp->m == 0 && lp->n == 0) { lp->pbs_stat = lp->dbs_stat = GLP_FEAS; lp->obj_val = lp->c0; if (parm->msg_lev >= GLP_MSG_ON && parm->out_dly == 0) { xprintf("~%6d: obj = %17.9e infeas = %10.3e\n", P->it_cnt, lp->obj_val, 0.0); } if (parm->msg_lev >= GLP_MSG_ALL) xprintf("OPTIMAL SOLUTION FOUND BY LP PREPROCESSOR\n"); goto post; } if (parm->msg_lev >= GLP_MSG_ALL) { xprintf("%d row%s, %d column%s, %d non-zero%s\n", lp->m, lp->m == 1 ? "" : "s", lp->n, lp->n == 1 ? "" : "s", lp->nnz, lp->nnz == 1 ? "" : "s"); } /* inherit basis factorization control parameters */ glp_get_bfcp(P, &bfcp); glp_set_bfcp(lp, &bfcp); /* scale the transformed problem */ { ENV *env = get_env_ptr(); int term_out = env->term_out; if (!term_out || parm->msg_lev < GLP_MSG_ALL) env->term_out = GLP_OFF; else env->term_out = GLP_ON; glp_scale_prob(lp, GLP_SF_AUTO); env->term_out = term_out; } /* build advanced initial basis */ { ENV *env = get_env_ptr(); int term_out = env->term_out; if (!term_out || parm->msg_lev < GLP_MSG_ALL) env->term_out = GLP_OFF; else env->term_out = GLP_ON; glp_adv_basis(lp, 0); env->term_out = term_out; } /* solve the transformed LP */ lp->it_cnt = P->it_cnt; ret = solve_lp(lp, parm); P->it_cnt = lp->it_cnt; /* only optimal solution can be postprocessed */ if (!(ret == 0 && lp->pbs_stat == GLP_FEAS && lp->dbs_stat == GLP_FEAS)) { if (parm->msg_lev >= GLP_MSG_ERR) xprintf("glp_simplex: unable to recover undefined or non-op" "timal solution\n"); if (ret == 0) { if (lp->pbs_stat == GLP_NOFEAS) ret = GLP_ENOPFS; else if (lp->dbs_stat == GLP_NOFEAS) ret = GLP_ENODFS; else xassert(lp != lp); } goto done; } post: /* postprocess solution from the transformed LP */ npp_postprocess(npp, lp); /* the transformed LP is no longer needed */ glp_delete_prob(lp), lp = NULL; /* store solution to the original problem */ npp_unload_sol(npp, P); /* the original LP has been successfully solved */ ret = 0; done: /* delete the transformed LP, if it exists */ if (lp != NULL) glp_delete_prob(lp); /* delete preprocessor workspace */ npp_delete_wksp(npp); return ret; } int glp_simplex(glp_prob *P, const glp_smcp *parm) { /* solve LP problem with the simplex method */ glp_smcp _parm; int i, j, ret; /* check problem object */ #if 0 /* 04/IV-2016 */ if (P == NULL || P->magic != GLP_PROB_MAGIC) xerror("glp_simplex: P = %p; invalid problem object\n", P); #endif if (P->tree != NULL && P->tree->reason != 0) xerror("glp_simplex: operation not allowed\n"); /* check control parameters */ if (parm == NULL) parm = &_parm, glp_init_smcp((glp_smcp *)parm); if (!(parm->msg_lev == GLP_MSG_OFF || parm->msg_lev == GLP_MSG_ERR || parm->msg_lev == GLP_MSG_ON || parm->msg_lev == GLP_MSG_ALL || parm->msg_lev == GLP_MSG_DBG)) xerror("glp_simplex: msg_lev = %d; invalid parameter\n", parm->msg_lev); if (!(parm->meth == GLP_PRIMAL || parm->meth == GLP_DUALP || parm->meth == GLP_DUAL)) xerror("glp_simplex: meth = %d; invalid parameter\n", parm->meth); if (!(parm->pricing == GLP_PT_STD || parm->pricing == GLP_PT_PSE)) xerror("glp_simplex: pricing = %d; invalid parameter\n", parm->pricing); if (!(parm->r_test == GLP_RT_STD || #if 1 /* 16/III-2016 */ parm->r_test == GLP_RT_FLIP || #endif parm->r_test == GLP_RT_HAR)) xerror("glp_simplex: r_test = %d; invalid parameter\n", parm->r_test); if (!(0.0 < parm->tol_bnd && parm->tol_bnd < 1.0)) xerror("glp_simplex: tol_bnd = %g; invalid parameter\n", parm->tol_bnd); if (!(0.0 < parm->tol_dj && parm->tol_dj < 1.0)) xerror("glp_simplex: tol_dj = %g; invalid parameter\n", parm->tol_dj); if (!(0.0 < parm->tol_piv && parm->tol_piv < 1.0)) xerror("glp_simplex: tol_piv = %g; invalid parameter\n", parm->tol_piv); if (parm->it_lim < 0) xerror("glp_simplex: it_lim = %d; invalid parameter\n", parm->it_lim); if (parm->tm_lim < 0) xerror("glp_simplex: tm_lim = %d; invalid parameter\n", parm->tm_lim); #if 0 /* 15/VII-2017 */ if (parm->out_frq < 1) #else if (parm->out_frq < 0) #endif xerror("glp_simplex: out_frq = %d; invalid parameter\n", parm->out_frq); if (parm->out_dly < 0) xerror("glp_simplex: out_dly = %d; invalid parameter\n", parm->out_dly); if (!(parm->presolve == GLP_ON || parm->presolve == GLP_OFF)) xerror("glp_simplex: presolve = %d; invalid parameter\n", parm->presolve); #if 1 /* 11/VII-2017 */ if (!(parm->excl == GLP_ON || parm->excl == GLP_OFF)) xerror("glp_simplex: excl = %d; invalid parameter\n", parm->excl); if (!(parm->shift == GLP_ON || parm->shift == GLP_OFF)) xerror("glp_simplex: shift = %d; invalid parameter\n", parm->shift); if (!(parm->aorn == GLP_USE_AT || parm->aorn == GLP_USE_NT)) xerror("glp_simplex: aorn = %d; invalid parameter\n", parm->aorn); #endif /* basic solution is currently undefined */ P->pbs_stat = P->dbs_stat = GLP_UNDEF; P->obj_val = 0.0; P->some = 0; /* check bounds of double-bounded variables */ for (i = 1; i <= P->m; i++) { GLPROW *row = P->row[i]; if (row->type == GLP_DB && row->lb >= row->ub) { if (parm->msg_lev >= GLP_MSG_ERR) xprintf("glp_simplex: row %d: lb = %g, ub = %g; incorrec" "t bounds\n", i, row->lb, row->ub); ret = GLP_EBOUND; goto done; } } for (j = 1; j <= P->n; j++) { GLPCOL *col = P->col[j]; if (col->type == GLP_DB && col->lb >= col->ub) { if (parm->msg_lev >= GLP_MSG_ERR) xprintf("glp_simplex: column %d: lb = %g, ub = %g; incor" "rect bounds\n", j, col->lb, col->ub); ret = GLP_EBOUND; goto done; } } /* solve LP problem */ if (parm->msg_lev >= GLP_MSG_ALL) { xprintf("GLPK Simplex Optimizer %s\n", glp_version()); xprintf("%d row%s, %d column%s, %d non-zero%s\n", P->m, P->m == 1 ? "" : "s", P->n, P->n == 1 ? "" : "s", P->nnz, P->nnz == 1 ? "" : "s"); } if (P->nnz == 0) trivial_lp(P, parm), ret = 0; else if (!parm->presolve) ret = solve_lp(P, parm); else ret = preprocess_and_solve_lp(P, parm); done: /* return to the application program */ return ret; } /*********************************************************************** * NAME * * glp_init_smcp - initialize simplex method control parameters * * SYNOPSIS * * void glp_init_smcp(glp_smcp *parm); * * DESCRIPTION * * The routine glp_init_smcp initializes control parameters, which are * used by the simplex solver, with default values. * * Default values of the control parameters are stored in a glp_smcp * structure, which the parameter parm points to. */ void glp_init_smcp(glp_smcp *parm) { parm->msg_lev = GLP_MSG_ALL; parm->meth = GLP_PRIMAL; parm->pricing = GLP_PT_PSE; parm->r_test = GLP_RT_HAR; parm->tol_bnd = 1e-7; parm->tol_dj = 1e-7; #if 0 /* 07/XI-2015 */ parm->tol_piv = 1e-10; #else parm->tol_piv = 1e-9; #endif parm->obj_ll = -DBL_MAX; parm->obj_ul = +DBL_MAX; parm->it_lim = INT_MAX; parm->tm_lim = INT_MAX; #if 0 /* 15/VII-2017 */ parm->out_frq = 500; #else parm->out_frq = 5000; /* 5 seconds */ #endif parm->out_dly = 0; parm->presolve = GLP_OFF; #if 1 /* 11/VII-2017 */ parm->excl = GLP_ON; parm->shift = GLP_ON; parm->aorn = GLP_USE_NT; #endif return; } /*********************************************************************** * NAME * * glp_get_status - retrieve generic status of basic solution * * SYNOPSIS * * int glp_get_status(glp_prob *lp); * * RETURNS * * The routine glp_get_status reports the generic status of the basic * solution for the specified problem object as follows: * * GLP_OPT - solution is optimal; * GLP_FEAS - solution is feasible; * GLP_INFEAS - solution is infeasible; * GLP_NOFEAS - problem has no feasible solution; * GLP_UNBND - problem has unbounded solution; * GLP_UNDEF - solution is undefined. */ int glp_get_status(glp_prob *lp) { int status; status = glp_get_prim_stat(lp); switch (status) { case GLP_FEAS: switch (glp_get_dual_stat(lp)) { case GLP_FEAS: status = GLP_OPT; break; case GLP_NOFEAS: status = GLP_UNBND; break; case GLP_UNDEF: case GLP_INFEAS: status = status; break; default: xassert(lp != lp); } break; case GLP_UNDEF: case GLP_INFEAS: case GLP_NOFEAS: status = status; break; default: xassert(lp != lp); } return status; } /*********************************************************************** * NAME * * glp_get_prim_stat - retrieve status of primal basic solution * * SYNOPSIS * * int glp_get_prim_stat(glp_prob *lp); * * RETURNS * * The routine glp_get_prim_stat reports the status of the primal basic * solution for the specified problem object as follows: * * GLP_UNDEF - primal solution is undefined; * GLP_FEAS - primal solution is feasible; * GLP_INFEAS - primal solution is infeasible; * GLP_NOFEAS - no primal feasible solution exists. */ int glp_get_prim_stat(glp_prob *lp) { int pbs_stat = lp->pbs_stat; return pbs_stat; } /*********************************************************************** * NAME * * glp_get_dual_stat - retrieve status of dual basic solution * * SYNOPSIS * * int glp_get_dual_stat(glp_prob *lp); * * RETURNS * * The routine glp_get_dual_stat reports the status of the dual basic * solution for the specified problem object as follows: * * GLP_UNDEF - dual solution is undefined; * GLP_FEAS - dual solution is feasible; * GLP_INFEAS - dual solution is infeasible; * GLP_NOFEAS - no dual feasible solution exists. */ int glp_get_dual_stat(glp_prob *lp) { int dbs_stat = lp->dbs_stat; return dbs_stat; } /*********************************************************************** * NAME * * glp_get_obj_val - retrieve objective value (basic solution) * * SYNOPSIS * * double glp_get_obj_val(glp_prob *lp); * * RETURNS * * The routine glp_get_obj_val returns value of the objective function * for basic solution. */ double glp_get_obj_val(glp_prob *lp) { /*struct LPXCPS *cps = lp->cps;*/ double z; z = lp->obj_val; /*if (cps->round && fabs(z) < 1e-9) z = 0.0;*/ return z; } /*********************************************************************** * NAME * * glp_get_row_stat - retrieve row status * * SYNOPSIS * * int glp_get_row_stat(glp_prob *lp, int i); * * RETURNS * * The routine glp_get_row_stat returns current status assigned to the * auxiliary variable associated with i-th row as follows: * * GLP_BS - basic variable; * GLP_NL - non-basic variable on its lower bound; * GLP_NU - non-basic variable on its upper bound; * GLP_NF - non-basic free (unbounded) variable; * GLP_NS - non-basic fixed variable. */ int glp_get_row_stat(glp_prob *lp, int i) { if (!(1 <= i && i <= lp->m)) xerror("glp_get_row_stat: i = %d; row number out of range\n", i); return lp->row[i]->stat; } /*********************************************************************** * NAME * * glp_get_row_prim - retrieve row primal value (basic solution) * * SYNOPSIS * * double glp_get_row_prim(glp_prob *lp, int i); * * RETURNS * * The routine glp_get_row_prim returns primal value of the auxiliary * variable associated with i-th row. */ double glp_get_row_prim(glp_prob *lp, int i) { /*struct LPXCPS *cps = lp->cps;*/ double prim; if (!(1 <= i && i <= lp->m)) xerror("glp_get_row_prim: i = %d; row number out of range\n", i); prim = lp->row[i]->prim; /*if (cps->round && fabs(prim) < 1e-9) prim = 0.0;*/ return prim; } /*********************************************************************** * NAME * * glp_get_row_dual - retrieve row dual value (basic solution) * * SYNOPSIS * * double glp_get_row_dual(glp_prob *lp, int i); * * RETURNS * * The routine glp_get_row_dual returns dual value (i.e. reduced cost) * of the auxiliary variable associated with i-th row. */ double glp_get_row_dual(glp_prob *lp, int i) { /*struct LPXCPS *cps = lp->cps;*/ double dual; if (!(1 <= i && i <= lp->m)) xerror("glp_get_row_dual: i = %d; row number out of range\n", i); dual = lp->row[i]->dual; /*if (cps->round && fabs(dual) < 1e-9) dual = 0.0;*/ return dual; } /*********************************************************************** * NAME * * glp_get_col_stat - retrieve column status * * SYNOPSIS * * int glp_get_col_stat(glp_prob *lp, int j); * * RETURNS * * The routine glp_get_col_stat returns current status assigned to the * structural variable associated with j-th column as follows: * * GLP_BS - basic variable; * GLP_NL - non-basic variable on its lower bound; * GLP_NU - non-basic variable on its upper bound; * GLP_NF - non-basic free (unbounded) variable; * GLP_NS - non-basic fixed variable. */ int glp_get_col_stat(glp_prob *lp, int j) { if (!(1 <= j && j <= lp->n)) xerror("glp_get_col_stat: j = %d; column number out of range\n" , j); return lp->col[j]->stat; } /*********************************************************************** * NAME * * glp_get_col_prim - retrieve column primal value (basic solution) * * SYNOPSIS * * double glp_get_col_prim(glp_prob *lp, int j); * * RETURNS * * The routine glp_get_col_prim returns primal value of the structural * variable associated with j-th column. */ double glp_get_col_prim(glp_prob *lp, int j) { /*struct LPXCPS *cps = lp->cps;*/ double prim; if (!(1 <= j && j <= lp->n)) xerror("glp_get_col_prim: j = %d; column number out of range\n" , j); prim = lp->col[j]->prim; /*if (cps->round && fabs(prim) < 1e-9) prim = 0.0;*/ return prim; } /*********************************************************************** * NAME * * glp_get_col_dual - retrieve column dual value (basic solution) * * SYNOPSIS * * double glp_get_col_dual(glp_prob *lp, int j); * * RETURNS * * The routine glp_get_col_dual returns dual value (i.e. reduced cost) * of the structural variable associated with j-th column. */ double glp_get_col_dual(glp_prob *lp, int j) { /*struct LPXCPS *cps = lp->cps;*/ double dual; if (!(1 <= j && j <= lp->n)) xerror("glp_get_col_dual: j = %d; column number out of range\n" , j); dual = lp->col[j]->dual; /*if (cps->round && fabs(dual) < 1e-9) dual = 0.0;*/ return dual; } /*********************************************************************** * NAME * * glp_get_unbnd_ray - determine variable causing unboundedness * * SYNOPSIS * * int glp_get_unbnd_ray(glp_prob *lp); * * RETURNS * * The routine glp_get_unbnd_ray returns the number k of a variable, * which causes primal or dual unboundedness. If 1 <= k <= m, it is * k-th auxiliary variable, and if m+1 <= k <= m+n, it is (k-m)-th * structural variable, where m is the number of rows, n is the number * of columns in the problem object. If such variable is not defined, * the routine returns 0. * * COMMENTS * * If it is not exactly known which version of the simplex solver * detected unboundedness, i.e. whether the unboundedness is primal or * dual, it is sufficient to check the status of the variable reported * with the routine glp_get_row_stat or glp_get_col_stat. If the * variable is non-basic, the unboundedness is primal, otherwise, if * the variable is basic, the unboundedness is dual (the latter case * means that the problem has no primal feasible dolution). */ int glp_get_unbnd_ray(glp_prob *lp) { int k; k = lp->some; xassert(k >= 0); if (k > lp->m + lp->n) k = 0; return k; } #if 1 /* 08/VIII-2013 */ int glp_get_it_cnt(glp_prob *P) { /* get simplex solver iteration count */ return P->it_cnt; } #endif #if 1 /* 08/VIII-2013 */ void glp_set_it_cnt(glp_prob *P, int it_cnt) { /* set simplex solver iteration count */ P->it_cnt = it_cnt; return; } #endif /* eof */ glpk-5.0/src/draft/glpapi07.c0000644000062000006210000003611013766346220015161 0ustar maomkpasswd/* glpapi07.c (exact simplex solver) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2007-2017 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "draft.h" #include "glpssx.h" #include "misc.h" #include "prob.h" /*********************************************************************** * NAME * * glp_exact - solve LP problem in exact arithmetic * * SYNOPSIS * * int glp_exact(glp_prob *lp, const glp_smcp *parm); * * DESCRIPTION * * The routine glp_exact is a tentative implementation of the primal * two-phase simplex method based on exact (rational) arithmetic. It is * similar to the routine glp_simplex, however, for all internal * computations it uses arithmetic of rational numbers, which is exact * in mathematical sense, i.e. free of round-off errors unlike floating * point arithmetic. * * Note that the routine glp_exact uses inly two control parameters * passed in the structure glp_smcp, namely, it_lim and tm_lim. * * RETURNS * * 0 The LP problem instance has been successfully solved. This code * does not necessarily mean that the solver has found optimal * solution. It only means that the solution process was successful. * * GLP_EBADB * Unable to start the search, because the initial basis specified * in the problem object is invalid--the number of basic (auxiliary * and structural) variables is not the same as the number of rows in * the problem object. * * GLP_ESING * Unable to start the search, because the basis matrix correspodning * to the initial basis is exactly singular. * * GLP_EBOUND * Unable to start the search, because some double-bounded variables * have incorrect bounds. * * GLP_EFAIL * The problem has no rows/columns. * * GLP_EITLIM * The search was prematurely terminated, because the simplex * iteration limit has been exceeded. * * GLP_ETMLIM * The search was prematurely terminated, because the time limit has * been exceeded. */ static void set_d_eps(mpq_t x, double val) { /* convert double val to rational x obtaining a more adequate fraction than provided by mpq_set_d due to allowing a small approximation error specified by a given relative tolerance; for example, mpq_set_d would give the following 1/3 ~= 0.333333333333333314829616256247391... -> -> 6004799503160661/18014398509481984 while this routine gives exactly 1/3 */ int s, n, j; double f, p, q, eps = 1e-9; mpq_t temp; xassert(-DBL_MAX <= val && val <= +DBL_MAX); #if 1 /* 30/VII-2008 */ if (val == floor(val)) { /* if val is integral, do not approximate */ mpq_set_d(x, val); goto done; } #endif if (val > 0.0) s = +1; else if (val < 0.0) s = -1; else { mpq_set_si(x, 0, 1); goto done; } f = frexp(fabs(val), &n); /* |val| = f * 2^n, where 0.5 <= f < 1.0 */ fp2rat(f, 0.1 * eps, &p, &q); /* f ~= p / q, where p and q are integers */ mpq_init(temp); mpq_set_d(x, p); mpq_set_d(temp, q); mpq_div(x, x, temp); mpq_set_si(temp, 1, 1); for (j = 1; j <= abs(n); j++) mpq_add(temp, temp, temp); if (n > 0) mpq_mul(x, x, temp); else if (n < 0) mpq_div(x, x, temp); mpq_clear(temp); if (s < 0) mpq_neg(x, x); /* check that the desired tolerance has been attained */ xassert(fabs(val - mpq_get_d(x)) <= eps * (1.0 + fabs(val))); done: return; } static void load_data(SSX *ssx, glp_prob *lp) { /* load LP problem data into simplex solver workspace */ int m = ssx->m; int n = ssx->n; int nnz = ssx->A_ptr[n+1]-1; int j, k, type, loc, len, *ind; double lb, ub, coef, *val; xassert(lp->m == m); xassert(lp->n == n); xassert(lp->nnz == nnz); /* types and bounds of rows and columns */ for (k = 1; k <= m+n; k++) { if (k <= m) { type = lp->row[k]->type; lb = lp->row[k]->lb; ub = lp->row[k]->ub; } else { type = lp->col[k-m]->type; lb = lp->col[k-m]->lb; ub = lp->col[k-m]->ub; } switch (type) { case GLP_FR: type = SSX_FR; break; case GLP_LO: type = SSX_LO; break; case GLP_UP: type = SSX_UP; break; case GLP_DB: type = SSX_DB; break; case GLP_FX: type = SSX_FX; break; default: xassert(type != type); } ssx->type[k] = type; set_d_eps(ssx->lb[k], lb); set_d_eps(ssx->ub[k], ub); } /* optimization direction */ switch (lp->dir) { case GLP_MIN: ssx->dir = SSX_MIN; break; case GLP_MAX: ssx->dir = SSX_MAX; break; default: xassert(lp != lp); } /* objective coefficients */ for (k = 0; k <= m+n; k++) { if (k == 0) coef = lp->c0; else if (k <= m) coef = 0.0; else coef = lp->col[k-m]->coef; set_d_eps(ssx->coef[k], coef); } /* constraint coefficients */ ind = xcalloc(1+m, sizeof(int)); val = xcalloc(1+m, sizeof(double)); loc = 0; for (j = 1; j <= n; j++) { ssx->A_ptr[j] = loc+1; len = glp_get_mat_col(lp, j, ind, val); for (k = 1; k <= len; k++) { loc++; ssx->A_ind[loc] = ind[k]; set_d_eps(ssx->A_val[loc], val[k]); } } xassert(loc == nnz); xfree(ind); xfree(val); return; } static int load_basis(SSX *ssx, glp_prob *lp) { /* load current LP basis into simplex solver workspace */ int m = ssx->m; int n = ssx->n; int *type = ssx->type; int *stat = ssx->stat; int *Q_row = ssx->Q_row; int *Q_col = ssx->Q_col; int i, j, k; xassert(lp->m == m); xassert(lp->n == n); /* statuses of rows and columns */ for (k = 1; k <= m+n; k++) { if (k <= m) stat[k] = lp->row[k]->stat; else stat[k] = lp->col[k-m]->stat; switch (stat[k]) { case GLP_BS: stat[k] = SSX_BS; break; case GLP_NL: stat[k] = SSX_NL; xassert(type[k] == SSX_LO || type[k] == SSX_DB); break; case GLP_NU: stat[k] = SSX_NU; xassert(type[k] == SSX_UP || type[k] == SSX_DB); break; case GLP_NF: stat[k] = SSX_NF; xassert(type[k] == SSX_FR); break; case GLP_NS: stat[k] = SSX_NS; xassert(type[k] == SSX_FX); break; default: xassert(stat != stat); } } /* build permutation matix Q */ i = j = 0; for (k = 1; k <= m+n; k++) { if (stat[k] == SSX_BS) { i++; if (i > m) return 1; Q_row[k] = i, Q_col[i] = k; } else { j++; if (j > n) return 1; Q_row[k] = m+j, Q_col[m+j] = k; } } xassert(i == m && j == n); return 0; } int glp_exact(glp_prob *lp, const glp_smcp *parm) { glp_smcp _parm; SSX *ssx; int m = lp->m; int n = lp->n; int nnz = lp->nnz; int i, j, k, type, pst, dst, ret, stat; double lb, ub, prim, dual, sum; if (parm == NULL) parm = &_parm, glp_init_smcp((glp_smcp *)parm); /* check control parameters */ #if 1 /* 25/XI-2017 */ switch (parm->msg_lev) { case GLP_MSG_OFF: case GLP_MSG_ERR: case GLP_MSG_ON: case GLP_MSG_ALL: case GLP_MSG_DBG: break; default: xerror("glp_exact: msg_lev = %d; invalid parameter\n", parm->msg_lev); } #endif if (parm->it_lim < 0) xerror("glp_exact: it_lim = %d; invalid parameter\n", parm->it_lim); if (parm->tm_lim < 0) xerror("glp_exact: tm_lim = %d; invalid parameter\n", parm->tm_lim); /* the problem must have at least one row and one column */ if (!(m > 0 && n > 0)) #if 0 /* 25/XI-2017 */ { xprintf("glp_exact: problem has no rows/columns\n"); #else { if (parm->msg_lev >= GLP_MSG_ERR) xprintf("glp_exact: problem has no rows/columns\n"); #endif return GLP_EFAIL; } #if 1 /* basic solution is currently undefined */ lp->pbs_stat = lp->dbs_stat = GLP_UNDEF; lp->obj_val = 0.0; lp->some = 0; #endif /* check that all double-bounded variables have correct bounds */ for (k = 1; k <= m+n; k++) { if (k <= m) { type = lp->row[k]->type; lb = lp->row[k]->lb; ub = lp->row[k]->ub; } else { type = lp->col[k-m]->type; lb = lp->col[k-m]->lb; ub = lp->col[k-m]->ub; } if (type == GLP_DB && lb >= ub) #if 0 /* 25/XI-2017 */ { xprintf("glp_exact: %s %d has invalid bounds\n", k <= m ? "row" : "column", k <= m ? k : k-m); #else { if (parm->msg_lev >= GLP_MSG_ERR) xprintf("glp_exact: %s %d has invalid bounds\n", k <= m ? "row" : "column", k <= m ? k : k-m); #endif return GLP_EBOUND; } } /* create the simplex solver workspace */ #if 1 /* 25/XI-2017 */ if (parm->msg_lev >= GLP_MSG_ALL) { #endif xprintf("glp_exact: %d rows, %d columns, %d non-zeros\n", m, n, nnz); #ifdef HAVE_GMP xprintf("GNU MP bignum library is being used\n"); #else xprintf("GLPK bignum module is being used\n"); xprintf("(Consider installing GNU MP to attain a much better perf" "ormance.)\n"); #endif #if 1 /* 25/XI-2017 */ } #endif ssx = ssx_create(m, n, nnz); /* load LP problem data into the workspace */ load_data(ssx, lp); /* load current LP basis into the workspace */ if (load_basis(ssx, lp)) #if 0 /* 25/XI-2017 */ { xprintf("glp_exact: initial LP basis is invalid\n"); #else { if (parm->msg_lev >= GLP_MSG_ERR) xprintf("glp_exact: initial LP basis is invalid\n"); #endif ret = GLP_EBADB; goto done; } #if 0 /* inherit some control parameters from the LP object */ ssx->it_lim = lpx_get_int_parm(lp, LPX_K_ITLIM); ssx->it_cnt = lpx_get_int_parm(lp, LPX_K_ITCNT); ssx->tm_lim = lpx_get_real_parm(lp, LPX_K_TMLIM); #else #if 1 /* 25/XI-2017 */ ssx->msg_lev = parm->msg_lev; #endif ssx->it_lim = parm->it_lim; ssx->it_cnt = lp->it_cnt; ssx->tm_lim = (double)parm->tm_lim / 1000.0; #endif ssx->out_frq = 5.0; ssx->tm_beg = xtime(); #if 0 /* 10/VI-2013 */ ssx->tm_lag = xlset(0); #else ssx->tm_lag = 0.0; #endif /* solve LP */ ret = ssx_driver(ssx); #if 0 /* copy back some statistics to the LP object */ lpx_set_int_parm(lp, LPX_K_ITLIM, ssx->it_lim); lpx_set_int_parm(lp, LPX_K_ITCNT, ssx->it_cnt); lpx_set_real_parm(lp, LPX_K_TMLIM, ssx->tm_lim); #else lp->it_cnt = ssx->it_cnt; #endif /* analyze the return code */ switch (ret) { case 0: /* optimal solution found */ ret = 0; pst = dst = GLP_FEAS; break; case 1: /* problem has no feasible solution */ ret = 0; pst = GLP_NOFEAS, dst = GLP_INFEAS; break; case 2: /* problem has unbounded solution */ ret = 0; pst = GLP_FEAS, dst = GLP_NOFEAS; #if 1 xassert(1 <= ssx->q && ssx->q <= n); lp->some = ssx->Q_col[m + ssx->q]; xassert(1 <= lp->some && lp->some <= m+n); #endif break; case 3: /* iteration limit exceeded (phase I) */ ret = GLP_EITLIM; pst = dst = GLP_INFEAS; break; case 4: /* iteration limit exceeded (phase II) */ ret = GLP_EITLIM; pst = GLP_FEAS, dst = GLP_INFEAS; break; case 5: /* time limit exceeded (phase I) */ ret = GLP_ETMLIM; pst = dst = GLP_INFEAS; break; case 6: /* time limit exceeded (phase II) */ ret = GLP_ETMLIM; pst = GLP_FEAS, dst = GLP_INFEAS; break; case 7: /* initial basis matrix is singular */ ret = GLP_ESING; goto done; default: xassert(ret != ret); } /* store final basic solution components into LP object */ lp->pbs_stat = pst; lp->dbs_stat = dst; sum = lp->c0; for (k = 1; k <= m+n; k++) { if (ssx->stat[k] == SSX_BS) { i = ssx->Q_row[k]; /* x[k] = xB[i] */ xassert(1 <= i && i <= m); stat = GLP_BS; prim = mpq_get_d(ssx->bbar[i]); dual = 0.0; } else { j = ssx->Q_row[k] - m; /* x[k] = xN[j] */ xassert(1 <= j && j <= n); switch (ssx->stat[k]) { case SSX_NF: stat = GLP_NF; prim = 0.0; break; case SSX_NL: stat = GLP_NL; prim = mpq_get_d(ssx->lb[k]); break; case SSX_NU: stat = GLP_NU; prim = mpq_get_d(ssx->ub[k]); break; case SSX_NS: stat = GLP_NS; prim = mpq_get_d(ssx->lb[k]); break; default: xassert(ssx != ssx); } dual = mpq_get_d(ssx->cbar[j]); } if (k <= m) { glp_set_row_stat(lp, k, stat); lp->row[k]->prim = prim; lp->row[k]->dual = dual; } else { glp_set_col_stat(lp, k-m, stat); lp->col[k-m]->prim = prim; lp->col[k-m]->dual = dual; sum += lp->col[k-m]->coef * prim; } } lp->obj_val = sum; done: /* delete the simplex solver workspace */ ssx_delete(ssx); #if 1 /* 23/XI-2015 */ xassert(gmp_pool_count() == 0); gmp_free_mem(); #endif /* return to the application program */ return ret; } /* eof */ glpk-5.0/src/draft/glpapi08.c0000644000062000006210000003004213766346220015160 0ustar maomkpasswd/* glpapi08.c (interior-point method routines) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2000-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "glpipm.h" #include "npp.h" /*********************************************************************** * NAME * * glp_interior - solve LP problem with the interior-point method * * SYNOPSIS * * int glp_interior(glp_prob *P, const glp_iptcp *parm); * * The routine glp_interior is a driver to the LP solver based on the * interior-point method. * * The interior-point solver has a set of control parameters. Values of * the control parameters can be passed in a structure glp_iptcp, which * the parameter parm points to. * * Currently this routine implements an easy variant of the primal-dual * interior-point method based on Mehrotra's technique. * * This routine transforms the original LP problem to an equivalent LP * problem in the standard formulation (all constraints are equalities, * all variables are non-negative), calls the routine ipm_main to solve * the transformed problem, and then transforms an obtained solution to * the solution of the original problem. * * RETURNS * * 0 The LP problem instance has been successfully solved. This code * does not necessarily mean that the solver has found optimal * solution. It only means that the solution process was successful. * * GLP_EFAIL * The problem has no rows/columns. * * GLP_ENOCVG * Very slow convergence or divergence. * * GLP_EITLIM * Iteration limit exceeded. * * GLP_EINSTAB * Numerical instability on solving Newtonian system. */ static void transform(NPP *npp) { /* transform LP to the standard formulation */ NPPROW *row, *prev_row; NPPCOL *col, *prev_col; for (row = npp->r_tail; row != NULL; row = prev_row) { prev_row = row->prev; if (row->lb == -DBL_MAX && row->ub == +DBL_MAX) npp_free_row(npp, row); else if (row->lb == -DBL_MAX) npp_leq_row(npp, row); else if (row->ub == +DBL_MAX) npp_geq_row(npp, row); else if (row->lb != row->ub) { if (fabs(row->lb) < fabs(row->ub)) npp_geq_row(npp, row); else npp_leq_row(npp, row); } } for (col = npp->c_tail; col != NULL; col = prev_col) { prev_col = col->prev; if (col->lb == -DBL_MAX && col->ub == +DBL_MAX) npp_free_col(npp, col); else if (col->lb == -DBL_MAX) npp_ubnd_col(npp, col); else if (col->ub == +DBL_MAX) { if (col->lb != 0.0) npp_lbnd_col(npp, col); } else if (col->lb != col->ub) { if (fabs(col->lb) < fabs(col->ub)) { if (col->lb != 0.0) npp_lbnd_col(npp, col); } else npp_ubnd_col(npp, col); npp_dbnd_col(npp, col); } else npp_fixed_col(npp, col); } for (row = npp->r_head; row != NULL; row = row->next) xassert(row->lb == row->ub); for (col = npp->c_head; col != NULL; col = col->next) xassert(col->lb == 0.0 && col->ub == +DBL_MAX); return; } int glp_interior(glp_prob *P, const glp_iptcp *parm) { glp_iptcp _parm; GLPROW *row; GLPCOL *col; NPP *npp = NULL; glp_prob *prob = NULL; int i, j, ret; /* check control parameters */ if (parm == NULL) glp_init_iptcp(&_parm), parm = &_parm; if (!(parm->msg_lev == GLP_MSG_OFF || parm->msg_lev == GLP_MSG_ERR || parm->msg_lev == GLP_MSG_ON || parm->msg_lev == GLP_MSG_ALL)) xerror("glp_interior: msg_lev = %d; invalid parameter\n", parm->msg_lev); if (!(parm->ord_alg == GLP_ORD_NONE || parm->ord_alg == GLP_ORD_QMD || parm->ord_alg == GLP_ORD_AMD || parm->ord_alg == GLP_ORD_SYMAMD)) xerror("glp_interior: ord_alg = %d; invalid parameter\n", parm->ord_alg); /* interior-point solution is currently undefined */ P->ipt_stat = GLP_UNDEF; P->ipt_obj = 0.0; /* check bounds of double-bounded variables */ for (i = 1; i <= P->m; i++) { row = P->row[i]; if (row->type == GLP_DB && row->lb >= row->ub) { if (parm->msg_lev >= GLP_MSG_ERR) xprintf("glp_interior: row %d: lb = %g, ub = %g; incorre" "ct bounds\n", i, row->lb, row->ub); ret = GLP_EBOUND; goto done; } } for (j = 1; j <= P->n; j++) { col = P->col[j]; if (col->type == GLP_DB && col->lb >= col->ub) { if (parm->msg_lev >= GLP_MSG_ERR) xprintf("glp_interior: column %d: lb = %g, ub = %g; inco" "rrect bounds\n", j, col->lb, col->ub); ret = GLP_EBOUND; goto done; } } /* transform LP to the standard formulation */ if (parm->msg_lev >= GLP_MSG_ALL) xprintf("Original LP has %d row(s), %d column(s), and %d non-z" "ero(s)\n", P->m, P->n, P->nnz); npp = npp_create_wksp(); npp_load_prob(npp, P, GLP_OFF, GLP_IPT, GLP_ON); transform(npp); prob = glp_create_prob(); npp_build_prob(npp, prob); if (parm->msg_lev >= GLP_MSG_ALL) xprintf("Working LP has %d row(s), %d column(s), and %d non-ze" "ro(s)\n", prob->m, prob->n, prob->nnz); #if 1 /* currently empty problem cannot be solved */ if (!(prob->m > 0 && prob->n > 0)) { if (parm->msg_lev >= GLP_MSG_ERR) xprintf("glp_interior: unable to solve empty problem\n"); ret = GLP_EFAIL; goto done; } #endif /* scale the resultant LP */ { ENV *env = get_env_ptr(); int term_out = env->term_out; env->term_out = GLP_OFF; glp_scale_prob(prob, GLP_SF_EQ); env->term_out = term_out; } /* warn about dense columns */ if (parm->msg_lev >= GLP_MSG_ON && prob->m >= 200) { int len, cnt = 0; for (j = 1; j <= prob->n; j++) { len = glp_get_mat_col(prob, j, NULL, NULL); if ((double)len >= 0.20 * (double)prob->m) cnt++; } if (cnt == 1) xprintf("WARNING: PROBLEM HAS ONE DENSE COLUMN\n"); else if (cnt > 0) xprintf("WARNING: PROBLEM HAS %d DENSE COLUMNS\n", cnt); } /* solve the transformed LP */ ret = ipm_solve(prob, parm); /* postprocess solution from the transformed LP */ npp_postprocess(npp, prob); /* and store solution to the original LP */ npp_unload_sol(npp, P); done: /* free working program objects */ if (npp != NULL) npp_delete_wksp(npp); if (prob != NULL) glp_delete_prob(prob); /* return to the application program */ return ret; } /*********************************************************************** * NAME * * glp_init_iptcp - initialize interior-point solver control parameters * * SYNOPSIS * * void glp_init_iptcp(glp_iptcp *parm); * * DESCRIPTION * * The routine glp_init_iptcp initializes control parameters, which are * used by the interior-point solver, with default values. * * Default values of the control parameters are stored in the glp_iptcp * structure, which the parameter parm points to. */ void glp_init_iptcp(glp_iptcp *parm) { parm->msg_lev = GLP_MSG_ALL; parm->ord_alg = GLP_ORD_AMD; return; } /*********************************************************************** * NAME * * glp_ipt_status - retrieve status of interior-point solution * * SYNOPSIS * * int glp_ipt_status(glp_prob *lp); * * RETURNS * * The routine glp_ipt_status reports the status of solution found by * the interior-point solver as follows: * * GLP_UNDEF - interior-point solution is undefined; * GLP_OPT - interior-point solution is optimal; * GLP_INFEAS - interior-point solution is infeasible; * GLP_NOFEAS - no feasible solution exists. */ int glp_ipt_status(glp_prob *lp) { int ipt_stat = lp->ipt_stat; return ipt_stat; } /*********************************************************************** * NAME * * glp_ipt_obj_val - retrieve objective value (interior point) * * SYNOPSIS * * double glp_ipt_obj_val(glp_prob *lp); * * RETURNS * * The routine glp_ipt_obj_val returns value of the objective function * for interior-point solution. */ double glp_ipt_obj_val(glp_prob *lp) { /*struct LPXCPS *cps = lp->cps;*/ double z; z = lp->ipt_obj; /*if (cps->round && fabs(z) < 1e-9) z = 0.0;*/ return z; } /*********************************************************************** * NAME * * glp_ipt_row_prim - retrieve row primal value (interior point) * * SYNOPSIS * * double glp_ipt_row_prim(glp_prob *lp, int i); * * RETURNS * * The routine glp_ipt_row_prim returns primal value of the auxiliary * variable associated with i-th row. */ double glp_ipt_row_prim(glp_prob *lp, int i) { /*struct LPXCPS *cps = lp->cps;*/ double pval; if (!(1 <= i && i <= lp->m)) xerror("glp_ipt_row_prim: i = %d; row number out of range\n", i); pval = lp->row[i]->pval; /*if (cps->round && fabs(pval) < 1e-9) pval = 0.0;*/ return pval; } /*********************************************************************** * NAME * * glp_ipt_row_dual - retrieve row dual value (interior point) * * SYNOPSIS * * double glp_ipt_row_dual(glp_prob *lp, int i); * * RETURNS * * The routine glp_ipt_row_dual returns dual value (i.e. reduced cost) * of the auxiliary variable associated with i-th row. */ double glp_ipt_row_dual(glp_prob *lp, int i) { /*struct LPXCPS *cps = lp->cps;*/ double dval; if (!(1 <= i && i <= lp->m)) xerror("glp_ipt_row_dual: i = %d; row number out of range\n", i); dval = lp->row[i]->dval; /*if (cps->round && fabs(dval) < 1e-9) dval = 0.0;*/ return dval; } /*********************************************************************** * NAME * * glp_ipt_col_prim - retrieve column primal value (interior point) * * SYNOPSIS * * double glp_ipt_col_prim(glp_prob *lp, int j); * * RETURNS * * The routine glp_ipt_col_prim returns primal value of the structural * variable associated with j-th column. */ double glp_ipt_col_prim(glp_prob *lp, int j) { /*struct LPXCPS *cps = lp->cps;*/ double pval; if (!(1 <= j && j <= lp->n)) xerror("glp_ipt_col_prim: j = %d; column number out of range\n" , j); pval = lp->col[j]->pval; /*if (cps->round && fabs(pval) < 1e-9) pval = 0.0;*/ return pval; } /*********************************************************************** * NAME * * glp_ipt_col_dual - retrieve column dual value (interior point) * * SYNOPSIS * * double glp_ipt_col_dual(glp_prob *lp, int j); * * RETURNS * * The routine glp_ipt_col_dual returns dual value (i.e. reduced cost) * of the structural variable associated with j-th column. */ double glp_ipt_col_dual(glp_prob *lp, int j) { /*struct LPXCPS *cps = lp->cps;*/ double dval; if (!(1 <= j && j <= lp->n)) xerror("glp_ipt_col_dual: j = %d; column number out of range\n" , j); dval = lp->col[j]->dval; /*if (cps->round && fabs(dval) < 1e-9) dval = 0.0;*/ return dval; } /* eof */ glpk-5.0/src/draft/glpapi09.c0000644000062000006210000006224113766346220015167 0ustar maomkpasswd/* glpapi09.c (mixed integer programming routines) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2000-2018 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "draft.h" #include "env.h" #include "ios.h" #include "npp.h" /*********************************************************************** * NAME * * glp_set_col_kind - set (change) column kind * * SYNOPSIS * * void glp_set_col_kind(glp_prob *mip, int j, int kind); * * DESCRIPTION * * The routine glp_set_col_kind sets (changes) the kind of j-th column * (structural variable) as specified by the parameter kind: * * GLP_CV - continuous variable; * GLP_IV - integer variable; * GLP_BV - binary variable. */ void glp_set_col_kind(glp_prob *mip, int j, int kind) { GLPCOL *col; if (!(1 <= j && j <= mip->n)) xerror("glp_set_col_kind: j = %d; column number out of range\n" , j); col = mip->col[j]; switch (kind) { case GLP_CV: col->kind = GLP_CV; break; case GLP_IV: col->kind = GLP_IV; break; case GLP_BV: col->kind = GLP_IV; if (!(col->type == GLP_DB && col->lb == 0.0 && col->ub == 1.0)) glp_set_col_bnds(mip, j, GLP_DB, 0.0, 1.0); break; default: xerror("glp_set_col_kind: j = %d; kind = %d; invalid column" " kind\n", j, kind); } return; } /*********************************************************************** * NAME * * glp_get_col_kind - retrieve column kind * * SYNOPSIS * * int glp_get_col_kind(glp_prob *mip, int j); * * RETURNS * * The routine glp_get_col_kind returns the kind of j-th column, i.e. * the kind of corresponding structural variable, as follows: * * GLP_CV - continuous variable; * GLP_IV - integer variable; * GLP_BV - binary variable */ int glp_get_col_kind(glp_prob *mip, int j) { GLPCOL *col; int kind; if (!(1 <= j && j <= mip->n)) xerror("glp_get_col_kind: j = %d; column number out of range\n" , j); col = mip->col[j]; kind = col->kind; switch (kind) { case GLP_CV: break; case GLP_IV: if (col->type == GLP_DB && col->lb == 0.0 && col->ub == 1.0) kind = GLP_BV; break; default: xassert(kind != kind); } return kind; } /*********************************************************************** * NAME * * glp_get_num_int - retrieve number of integer columns * * SYNOPSIS * * int glp_get_num_int(glp_prob *mip); * * RETURNS * * The routine glp_get_num_int returns the current number of columns, * which are marked as integer. */ int glp_get_num_int(glp_prob *mip) { GLPCOL *col; int j, count = 0; for (j = 1; j <= mip->n; j++) { col = mip->col[j]; if (col->kind == GLP_IV) count++; } return count; } /*********************************************************************** * NAME * * glp_get_num_bin - retrieve number of binary columns * * SYNOPSIS * * int glp_get_num_bin(glp_prob *mip); * * RETURNS * * The routine glp_get_num_bin returns the current number of columns, * which are marked as binary. */ int glp_get_num_bin(glp_prob *mip) { GLPCOL *col; int j, count = 0; for (j = 1; j <= mip->n; j++) { col = mip->col[j]; if (col->kind == GLP_IV && col->type == GLP_DB && col->lb == 0.0 && col->ub == 1.0) count++; } return count; } /*********************************************************************** * NAME * * glp_intopt - solve MIP problem with the branch-and-bound method * * SYNOPSIS * * int glp_intopt(glp_prob *P, const glp_iocp *parm); * * DESCRIPTION * * The routine glp_intopt is a driver to the MIP solver based on the * branch-and-bound method. * * On entry the problem object should contain optimal solution to LP * relaxation (which can be obtained with the routine glp_simplex). * * The MIP solver has a set of control parameters. Values of the control * parameters can be passed in a structure glp_iocp, which the parameter * parm points to. * * The parameter parm can be specified as NULL, in which case the MIP * solver uses default settings. * * RETURNS * * 0 The MIP problem instance has been successfully solved. This code * does not necessarily mean that the solver has found optimal * solution. It only means that the solution process was successful. * * GLP_EBOUND * Unable to start the search, because some double-bounded variables * have incorrect bounds or some integer variables have non-integer * (fractional) bounds. * * GLP_EROOT * Unable to start the search, because optimal basis for initial LP * relaxation is not provided. * * GLP_EFAIL * The search was prematurely terminated due to the solver failure. * * GLP_EMIPGAP * The search was prematurely terminated, because the relative mip * gap tolerance has been reached. * * GLP_ETMLIM * The search was prematurely terminated, because the time limit has * been exceeded. * * GLP_ENOPFS * The MIP problem instance has no primal feasible solution (only if * the MIP presolver is used). * * GLP_ENODFS * LP relaxation of the MIP problem instance has no dual feasible * solution (only if the MIP presolver is used). * * GLP_ESTOP * The search was prematurely terminated by application. */ #if 0 /* 11/VII-2013 */ static int solve_mip(glp_prob *P, const glp_iocp *parm) #else static int solve_mip(glp_prob *P, const glp_iocp *parm, glp_prob *P0 /* problem passed to glp_intopt */, NPP *npp /* preprocessor workspace or NULL */) #endif { /* solve MIP directly without using the preprocessor */ glp_tree *T; int ret; /* optimal basis to LP relaxation must be provided */ if (glp_get_status(P) != GLP_OPT) { if (parm->msg_lev >= GLP_MSG_ERR) xprintf("glp_intopt: optimal basis to initial LP relaxation" " not provided\n"); ret = GLP_EROOT; goto done; } /* it seems all is ok */ if (parm->msg_lev >= GLP_MSG_ALL) xprintf("Integer optimization begins...\n"); /* create the branch-and-bound tree */ T = ios_create_tree(P, parm); #if 1 /* 11/VII-2013 */ T->P = P0; T->npp = npp; #endif /* solve the problem instance */ ret = ios_driver(T); /* delete the branch-and-bound tree */ ios_delete_tree(T); /* analyze exit code reported by the mip driver */ if (ret == 0) { if (P->mip_stat == GLP_FEAS) { if (parm->msg_lev >= GLP_MSG_ALL) xprintf("INTEGER OPTIMAL SOLUTION FOUND\n"); P->mip_stat = GLP_OPT; } else { if (parm->msg_lev >= GLP_MSG_ALL) xprintf("PROBLEM HAS NO INTEGER FEASIBLE SOLUTION\n"); P->mip_stat = GLP_NOFEAS; } } else if (ret == GLP_EMIPGAP) { if (parm->msg_lev >= GLP_MSG_ALL) xprintf("RELATIVE MIP GAP TOLERANCE REACHED; SEARCH TERMINA" "TED\n"); } else if (ret == GLP_ETMLIM) { if (parm->msg_lev >= GLP_MSG_ALL) xprintf("TIME LIMIT EXCEEDED; SEARCH TERMINATED\n"); } else if (ret == GLP_EFAIL) { if (parm->msg_lev >= GLP_MSG_ERR) xprintf("glp_intopt: cannot solve current LP relaxation\n"); } else if (ret == GLP_ESTOP) { if (parm->msg_lev >= GLP_MSG_ALL) xprintf("SEARCH TERMINATED BY APPLICATION\n"); } else xassert(ret != ret); done: return ret; } static int preprocess_and_solve_mip(glp_prob *P, const glp_iocp *parm) { /* solve MIP using the preprocessor */ ENV *env = get_env_ptr(); int term_out = env->term_out; NPP *npp; glp_prob *mip = NULL; glp_bfcp bfcp; glp_smcp smcp; int ret; if (parm->msg_lev >= GLP_MSG_ALL) xprintf("Preprocessing...\n"); /* create preprocessor workspace */ npp = npp_create_wksp(); /* load original problem into the preprocessor workspace */ npp_load_prob(npp, P, GLP_OFF, GLP_MIP, GLP_OFF); /* process MIP prior to applying the branch-and-bound method */ if (!term_out || parm->msg_lev < GLP_MSG_ALL) env->term_out = GLP_OFF; else env->term_out = GLP_ON; ret = npp_integer(npp, parm); env->term_out = term_out; if (ret == 0) ; else if (ret == GLP_ENOPFS) { if (parm->msg_lev >= GLP_MSG_ALL) xprintf("PROBLEM HAS NO PRIMAL FEASIBLE SOLUTION\n"); } else if (ret == GLP_ENODFS) { if (parm->msg_lev >= GLP_MSG_ALL) xprintf("LP RELAXATION HAS NO DUAL FEASIBLE SOLUTION\n"); } else xassert(ret != ret); if (ret != 0) goto done; /* build transformed MIP */ mip = glp_create_prob(); npp_build_prob(npp, mip); /* if the transformed MIP is empty, it has empty solution, which is optimal */ if (mip->m == 0 && mip->n == 0) { mip->mip_stat = GLP_OPT; mip->mip_obj = mip->c0; if (parm->msg_lev >= GLP_MSG_ALL) { xprintf("Objective value = %17.9e\n", mip->mip_obj); xprintf("INTEGER OPTIMAL SOLUTION FOUND BY MIP PREPROCESSOR" "\n"); } goto post; } /* display some statistics */ if (parm->msg_lev >= GLP_MSG_ALL) { int ni = glp_get_num_int(mip); int nb = glp_get_num_bin(mip); char s[50]; xprintf("%d row%s, %d column%s, %d non-zero%s\n", mip->m, mip->m == 1 ? "" : "s", mip->n, mip->n == 1 ? "" : "s", mip->nnz, mip->nnz == 1 ? "" : "s"); if (nb == 0) strcpy(s, "none of"); else if (ni == 1 && nb == 1) strcpy(s, ""); else if (nb == 1) strcpy(s, "one of"); else if (nb == ni) strcpy(s, "all of"); else sprintf(s, "%d of", nb); xprintf("%d integer variable%s, %s which %s binary\n", ni, ni == 1 ? "" : "s", s, nb == 1 ? "is" : "are"); } /* inherit basis factorization control parameters */ glp_get_bfcp(P, &bfcp); glp_set_bfcp(mip, &bfcp); /* scale the transformed problem */ if (!term_out || parm->msg_lev < GLP_MSG_ALL) env->term_out = GLP_OFF; else env->term_out = GLP_ON; glp_scale_prob(mip, GLP_SF_GM | GLP_SF_EQ | GLP_SF_2N | GLP_SF_SKIP); env->term_out = term_out; /* build advanced initial basis */ if (!term_out || parm->msg_lev < GLP_MSG_ALL) env->term_out = GLP_OFF; else env->term_out = GLP_ON; glp_adv_basis(mip, 0); env->term_out = term_out; /* solve initial LP relaxation */ if (parm->msg_lev >= GLP_MSG_ALL) xprintf("Solving LP relaxation...\n"); glp_init_smcp(&smcp); smcp.msg_lev = parm->msg_lev; /* respect time limit */ smcp.tm_lim = parm->tm_lim; mip->it_cnt = P->it_cnt; ret = glp_simplex(mip, &smcp); P->it_cnt = mip->it_cnt; if (ret == GLP_ETMLIM) goto done; else if (ret != 0) { if (parm->msg_lev >= GLP_MSG_ERR) xprintf("glp_intopt: cannot solve LP relaxation\n"); ret = GLP_EFAIL; goto done; } /* check status of the basic solution */ ret = glp_get_status(mip); if (ret == GLP_OPT) ret = 0; else if (ret == GLP_NOFEAS) ret = GLP_ENOPFS; else if (ret == GLP_UNBND) ret = GLP_ENODFS; else xassert(ret != ret); if (ret != 0) goto done; /* solve the transformed MIP */ mip->it_cnt = P->it_cnt; #if 0 /* 11/VII-2013 */ ret = solve_mip(mip, parm); #else if (parm->use_sol) { mip->mip_stat = P->mip_stat; mip->mip_obj = P->mip_obj; } ret = solve_mip(mip, parm, P, npp); #endif P->it_cnt = mip->it_cnt; /* only integer feasible solution can be postprocessed */ if (!(mip->mip_stat == GLP_OPT || mip->mip_stat == GLP_FEAS)) { P->mip_stat = mip->mip_stat; goto done; } /* postprocess solution from the transformed MIP */ post: npp_postprocess(npp, mip); /* the transformed MIP is no longer needed */ glp_delete_prob(mip), mip = NULL; /* store solution to the original problem */ npp_unload_sol(npp, P); done: /* delete the transformed MIP, if it exists */ if (mip != NULL) glp_delete_prob(mip); /* delete preprocessor workspace */ npp_delete_wksp(npp); return ret; } #ifndef HAVE_ALIEN_SOLVER /* 28/V-2010 */ int _glp_intopt1(glp_prob *P, const glp_iocp *parm) { xassert(P == P); xassert(parm == parm); xprintf("glp_intopt: no alien solver is available\n"); return GLP_EFAIL; } #endif int glp_intopt(glp_prob *P, const glp_iocp *parm) { /* solve MIP problem with the branch-and-bound method */ glp_iocp _parm; int i, j, ret; #if 0 /* 04/IV-2016 */ /* check problem object */ if (P == NULL || P->magic != GLP_PROB_MAGIC) xerror("glp_intopt: P = %p; invalid problem object\n", P); #endif if (P->tree != NULL) xerror("glp_intopt: operation not allowed\n"); /* check control parameters */ if (parm == NULL) parm = &_parm, glp_init_iocp((glp_iocp *)parm); if (!(parm->msg_lev == GLP_MSG_OFF || parm->msg_lev == GLP_MSG_ERR || parm->msg_lev == GLP_MSG_ON || parm->msg_lev == GLP_MSG_ALL || parm->msg_lev == GLP_MSG_DBG)) xerror("glp_intopt: msg_lev = %d; invalid parameter\n", parm->msg_lev); if (!(parm->br_tech == GLP_BR_FFV || parm->br_tech == GLP_BR_LFV || parm->br_tech == GLP_BR_MFV || parm->br_tech == GLP_BR_DTH || parm->br_tech == GLP_BR_PCH)) xerror("glp_intopt: br_tech = %d; invalid parameter\n", parm->br_tech); if (!(parm->bt_tech == GLP_BT_DFS || parm->bt_tech == GLP_BT_BFS || parm->bt_tech == GLP_BT_BLB || parm->bt_tech == GLP_BT_BPH)) xerror("glp_intopt: bt_tech = %d; invalid parameter\n", parm->bt_tech); if (!(0.0 < parm->tol_int && parm->tol_int < 1.0)) xerror("glp_intopt: tol_int = %g; invalid parameter\n", parm->tol_int); if (!(0.0 < parm->tol_obj && parm->tol_obj < 1.0)) xerror("glp_intopt: tol_obj = %g; invalid parameter\n", parm->tol_obj); if (parm->tm_lim < 0) xerror("glp_intopt: tm_lim = %d; invalid parameter\n", parm->tm_lim); if (parm->out_frq < 0) xerror("glp_intopt: out_frq = %d; invalid parameter\n", parm->out_frq); if (parm->out_dly < 0) xerror("glp_intopt: out_dly = %d; invalid parameter\n", parm->out_dly); if (!(0 <= parm->cb_size && parm->cb_size <= 256)) xerror("glp_intopt: cb_size = %d; invalid parameter\n", parm->cb_size); if (!(parm->pp_tech == GLP_PP_NONE || parm->pp_tech == GLP_PP_ROOT || parm->pp_tech == GLP_PP_ALL)) xerror("glp_intopt: pp_tech = %d; invalid parameter\n", parm->pp_tech); if (parm->mip_gap < 0.0) xerror("glp_intopt: mip_gap = %g; invalid parameter\n", parm->mip_gap); if (!(parm->mir_cuts == GLP_ON || parm->mir_cuts == GLP_OFF)) xerror("glp_intopt: mir_cuts = %d; invalid parameter\n", parm->mir_cuts); if (!(parm->gmi_cuts == GLP_ON || parm->gmi_cuts == GLP_OFF)) xerror("glp_intopt: gmi_cuts = %d; invalid parameter\n", parm->gmi_cuts); if (!(parm->cov_cuts == GLP_ON || parm->cov_cuts == GLP_OFF)) xerror("glp_intopt: cov_cuts = %d; invalid parameter\n", parm->cov_cuts); if (!(parm->clq_cuts == GLP_ON || parm->clq_cuts == GLP_OFF)) xerror("glp_intopt: clq_cuts = %d; invalid parameter\n", parm->clq_cuts); if (!(parm->presolve == GLP_ON || parm->presolve == GLP_OFF)) xerror("glp_intopt: presolve = %d; invalid parameter\n", parm->presolve); if (!(parm->binarize == GLP_ON || parm->binarize == GLP_OFF)) xerror("glp_intopt: binarize = %d; invalid parameter\n", parm->binarize); if (!(parm->fp_heur == GLP_ON || parm->fp_heur == GLP_OFF)) xerror("glp_intopt: fp_heur = %d; invalid parameter\n", parm->fp_heur); #if 1 /* 28/V-2010 */ if (!(parm->alien == GLP_ON || parm->alien == GLP_OFF)) xerror("glp_intopt: alien = %d; invalid parameter\n", parm->alien); #endif #if 0 /* 11/VII-2013 */ /* integer solution is currently undefined */ P->mip_stat = GLP_UNDEF; P->mip_obj = 0.0; #else if (!parm->use_sol) P->mip_stat = GLP_UNDEF; if (P->mip_stat == GLP_NOFEAS) P->mip_stat = GLP_UNDEF; if (P->mip_stat == GLP_UNDEF) P->mip_obj = 0.0; else if (P->mip_stat == GLP_OPT) P->mip_stat = GLP_FEAS; #endif /* check bounds of double-bounded variables */ for (i = 1; i <= P->m; i++) { GLPROW *row = P->row[i]; if (row->type == GLP_DB && row->lb >= row->ub) { if (parm->msg_lev >= GLP_MSG_ERR) xprintf("glp_intopt: row %d: lb = %g, ub = %g; incorrect" " bounds\n", i, row->lb, row->ub); ret = GLP_EBOUND; goto done; } } for (j = 1; j <= P->n; j++) { GLPCOL *col = P->col[j]; if (col->type == GLP_DB && col->lb >= col->ub) { if (parm->msg_lev >= GLP_MSG_ERR) xprintf("glp_intopt: column %d: lb = %g, ub = %g; incorr" "ect bounds\n", j, col->lb, col->ub); ret = GLP_EBOUND; goto done; } } /* bounds of all integer variables must be integral */ for (j = 1; j <= P->n; j++) { GLPCOL *col = P->col[j]; if (col->kind != GLP_IV) continue; if (col->type == GLP_LO || col->type == GLP_DB) { if (col->lb != floor(col->lb)) { if (parm->msg_lev >= GLP_MSG_ERR) xprintf("glp_intopt: integer column %d has non-intege" "r lower bound %g\n", j, col->lb); ret = GLP_EBOUND; goto done; } } if (col->type == GLP_UP || col->type == GLP_DB) { if (col->ub != floor(col->ub)) { if (parm->msg_lev >= GLP_MSG_ERR) xprintf("glp_intopt: integer column %d has non-intege" "r upper bound %g\n", j, col->ub); ret = GLP_EBOUND; goto done; } } if (col->type == GLP_FX) { if (col->lb != floor(col->lb)) { if (parm->msg_lev >= GLP_MSG_ERR) xprintf("glp_intopt: integer column %d has non-intege" "r fixed value %g\n", j, col->lb); ret = GLP_EBOUND; goto done; } } } /* solve MIP problem */ if (parm->msg_lev >= GLP_MSG_ALL) { int ni = glp_get_num_int(P); int nb = glp_get_num_bin(P); char s[50]; xprintf("GLPK Integer Optimizer %s\n", glp_version()); xprintf("%d row%s, %d column%s, %d non-zero%s\n", P->m, P->m == 1 ? "" : "s", P->n, P->n == 1 ? "" : "s", P->nnz, P->nnz == 1 ? "" : "s"); if (nb == 0) strcpy(s, "none of"); else if (ni == 1 && nb == 1) strcpy(s, ""); else if (nb == 1) strcpy(s, "one of"); else if (nb == ni) strcpy(s, "all of"); else sprintf(s, "%d of", nb); xprintf("%d integer variable%s, %s which %s binary\n", ni, ni == 1 ? "" : "s", s, nb == 1 ? "is" : "are"); } #if 1 /* 28/V-2010 */ if (parm->alien) { /* use alien integer optimizer */ ret = _glp_intopt1(P, parm); goto done; } #endif if (!parm->presolve) #if 0 /* 11/VII-2013 */ ret = solve_mip(P, parm); #else ret = solve_mip(P, parm, P, NULL); #endif else ret = preprocess_and_solve_mip(P, parm); #if 1 /* 12/III-2013 */ if (ret == GLP_ENOPFS) P->mip_stat = GLP_NOFEAS; #endif done: /* return to the application program */ return ret; } /*********************************************************************** * NAME * * glp_init_iocp - initialize integer optimizer control parameters * * SYNOPSIS * * void glp_init_iocp(glp_iocp *parm); * * DESCRIPTION * * The routine glp_init_iocp initializes control parameters, which are * used by the integer optimizer, with default values. * * Default values of the control parameters are stored in a glp_iocp * structure, which the parameter parm points to. */ void glp_init_iocp(glp_iocp *parm) { parm->msg_lev = GLP_MSG_ALL; parm->br_tech = GLP_BR_DTH; parm->bt_tech = GLP_BT_BLB; parm->tol_int = 1e-5; parm->tol_obj = 1e-7; parm->tm_lim = INT_MAX; parm->out_frq = 5000; parm->out_dly = 10000; parm->cb_func = NULL; parm->cb_info = NULL; parm->cb_size = 0; parm->pp_tech = GLP_PP_ALL; parm->mip_gap = 0.0; parm->mir_cuts = GLP_OFF; parm->gmi_cuts = GLP_OFF; parm->cov_cuts = GLP_OFF; parm->clq_cuts = GLP_OFF; parm->presolve = GLP_OFF; parm->binarize = GLP_OFF; parm->fp_heur = GLP_OFF; parm->ps_heur = GLP_OFF; parm->ps_tm_lim = 60000; /* 1 minute */ parm->sr_heur = GLP_ON; #if 1 /* 24/X-2015; not documented--should not be used */ parm->use_sol = GLP_OFF; parm->save_sol = NULL; parm->alien = GLP_OFF; #endif #if 0 /* 20/I-2018 */ #if 1 /* 16/III-2016; not documented--should not be used */ parm->flip = GLP_OFF; #endif #else parm->flip = GLP_ON; #endif return; } /*********************************************************************** * NAME * * glp_mip_status - retrieve status of MIP solution * * SYNOPSIS * * int glp_mip_status(glp_prob *mip); * * RETURNS * * The routine lpx_mip_status reports the status of MIP solution found * by the branch-and-bound solver as follows: * * GLP_UNDEF - MIP solution is undefined; * GLP_OPT - MIP solution is integer optimal; * GLP_FEAS - MIP solution is integer feasible but its optimality * (or non-optimality) has not been proven, perhaps due to * premature termination of the search; * GLP_NOFEAS - problem has no integer feasible solution (proven by the * solver). */ int glp_mip_status(glp_prob *mip) { int mip_stat = mip->mip_stat; return mip_stat; } /*********************************************************************** * NAME * * glp_mip_obj_val - retrieve objective value (MIP solution) * * SYNOPSIS * * double glp_mip_obj_val(glp_prob *mip); * * RETURNS * * The routine glp_mip_obj_val returns value of the objective function * for MIP solution. */ double glp_mip_obj_val(glp_prob *mip) { /*struct LPXCPS *cps = mip->cps;*/ double z; z = mip->mip_obj; /*if (cps->round && fabs(z) < 1e-9) z = 0.0;*/ return z; } /*********************************************************************** * NAME * * glp_mip_row_val - retrieve row value (MIP solution) * * SYNOPSIS * * double glp_mip_row_val(glp_prob *mip, int i); * * RETURNS * * The routine glp_mip_row_val returns value of the auxiliary variable * associated with i-th row. */ double glp_mip_row_val(glp_prob *mip, int i) { /*struct LPXCPS *cps = mip->cps;*/ double mipx; if (!(1 <= i && i <= mip->m)) xerror("glp_mip_row_val: i = %d; row number out of range\n", i) ; mipx = mip->row[i]->mipx; /*if (cps->round && fabs(mipx) < 1e-9) mipx = 0.0;*/ return mipx; } /*********************************************************************** * NAME * * glp_mip_col_val - retrieve column value (MIP solution) * * SYNOPSIS * * double glp_mip_col_val(glp_prob *mip, int j); * * RETURNS * * The routine glp_mip_col_val returns value of the structural variable * associated with j-th column. */ double glp_mip_col_val(glp_prob *mip, int j) { /*struct LPXCPS *cps = mip->cps;*/ double mipx; if (!(1 <= j && j <= mip->n)) xerror("glp_mip_col_val: j = %d; column number out of range\n", j); mipx = mip->col[j]->mipx; /*if (cps->round && fabs(mipx) < 1e-9) mipx = 0.0;*/ return mipx; } /* eof */ glpk-5.0/src/draft/glpapi10.c0000644000062000006210000002413313766346220015155 0ustar maomkpasswd/* glpapi10.c (solution checking routines) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2000-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "prob.h" void glp_check_kkt(glp_prob *P, int sol, int cond, double *_ae_max, int *_ae_ind, double *_re_max, int *_re_ind) { /* check feasibility and optimality conditions */ int m = P->m; int n = P->n; GLPROW *row; GLPCOL *col; GLPAIJ *aij; int i, j, ae_ind, re_ind; double e, sp, sn, t, ae_max, re_max; if (!(sol == GLP_SOL || sol == GLP_IPT || sol == GLP_MIP)) xerror("glp_check_kkt: sol = %d; invalid solution indicator\n", sol); if (!(cond == GLP_KKT_PE || cond == GLP_KKT_PB || cond == GLP_KKT_DE || cond == GLP_KKT_DB || cond == GLP_KKT_CS)) xerror("glp_check_kkt: cond = %d; invalid condition indicator " "\n", cond); ae_max = re_max = 0.0; ae_ind = re_ind = 0; if (cond == GLP_KKT_PE) { /* xR - A * xS = 0 */ for (i = 1; i <= m; i++) { row = P->row[i]; sp = sn = 0.0; /* t := xR[i] */ if (sol == GLP_SOL) t = row->prim; else if (sol == GLP_IPT) t = row->pval; else if (sol == GLP_MIP) t = row->mipx; else xassert(sol != sol); if (t >= 0.0) sp += t; else sn -= t; for (aij = row->ptr; aij != NULL; aij = aij->r_next) { col = aij->col; /* t := - a[i,j] * xS[j] */ if (sol == GLP_SOL) t = - aij->val * col->prim; else if (sol == GLP_IPT) t = - aij->val * col->pval; else if (sol == GLP_MIP) t = - aij->val * col->mipx; else xassert(sol != sol); if (t >= 0.0) sp += t; else sn -= t; } /* absolute error */ e = fabs(sp - sn); if (ae_max < e) ae_max = e, ae_ind = i; /* relative error */ e /= (1.0 + sp + sn); if (re_max < e) re_max = e, re_ind = i; } } else if (cond == GLP_KKT_PB) { /* lR <= xR <= uR */ for (i = 1; i <= m; i++) { row = P->row[i]; /* t := xR[i] */ if (sol == GLP_SOL) t = row->prim; else if (sol == GLP_IPT) t = row->pval; else if (sol == GLP_MIP) t = row->mipx; else xassert(sol != sol); /* check lower bound */ if (row->type == GLP_LO || row->type == GLP_DB || row->type == GLP_FX) { if (t < row->lb) { /* absolute error */ e = row->lb - t; if (ae_max < e) ae_max = e, ae_ind = i; /* relative error */ e /= (1.0 + fabs(row->lb)); if (re_max < e) re_max = e, re_ind = i; } } /* check upper bound */ if (row->type == GLP_UP || row->type == GLP_DB || row->type == GLP_FX) { if (t > row->ub) { /* absolute error */ e = t - row->ub; if (ae_max < e) ae_max = e, ae_ind = i; /* relative error */ e /= (1.0 + fabs(row->ub)); if (re_max < e) re_max = e, re_ind = i; } } } /* lS <= xS <= uS */ for (j = 1; j <= n; j++) { col = P->col[j]; /* t := xS[j] */ if (sol == GLP_SOL) t = col->prim; else if (sol == GLP_IPT) t = col->pval; else if (sol == GLP_MIP) t = col->mipx; else xassert(sol != sol); /* check lower bound */ if (col->type == GLP_LO || col->type == GLP_DB || col->type == GLP_FX) { if (t < col->lb) { /* absolute error */ e = col->lb - t; if (ae_max < e) ae_max = e, ae_ind = m+j; /* relative error */ e /= (1.0 + fabs(col->lb)); if (re_max < e) re_max = e, re_ind = m+j; } } /* check upper bound */ if (col->type == GLP_UP || col->type == GLP_DB || col->type == GLP_FX) { if (t > col->ub) { /* absolute error */ e = t - col->ub; if (ae_max < e) ae_max = e, ae_ind = m+j; /* relative error */ e /= (1.0 + fabs(col->ub)); if (re_max < e) re_max = e, re_ind = m+j; } } } } else if (cond == GLP_KKT_DE) { /* A' * (lambdaR - cR) + (lambdaS - cS) = 0 */ for (j = 1; j <= n; j++) { col = P->col[j]; sp = sn = 0.0; /* t := lambdaS[j] - cS[j] */ if (sol == GLP_SOL) t = col->dual - col->coef; else if (sol == GLP_IPT) t = col->dval - col->coef; else xassert(sol != sol); if (t >= 0.0) sp += t; else sn -= t; for (aij = col->ptr; aij != NULL; aij = aij->c_next) { row = aij->row; /* t := a[i,j] * (lambdaR[i] - cR[i]) */ if (sol == GLP_SOL) t = aij->val * row->dual; else if (sol == GLP_IPT) t = aij->val * row->dval; else xassert(sol != sol); if (t >= 0.0) sp += t; else sn -= t; } /* absolute error */ e = fabs(sp - sn); if (ae_max < e) ae_max = e, ae_ind = m+j; /* relative error */ e /= (1.0 + sp + sn); if (re_max < e) re_max = e, re_ind = m+j; } } else if (cond == GLP_KKT_DB) { /* check lambdaR */ for (i = 1; i <= m; i++) { row = P->row[i]; /* t := lambdaR[i] */ if (sol == GLP_SOL) t = row->dual; else if (sol == GLP_IPT) t = row->dval; else xassert(sol != sol); /* correct sign */ if (P->dir == GLP_MIN) t = + t; else if (P->dir == GLP_MAX) t = - t; else xassert(P != P); /* check for positivity */ #if 1 /* 08/III-2013 */ /* the former check was correct */ /* the bug reported by David Price is related to violation of complementarity slackness, not to this condition */ if (row->type == GLP_FR || row->type == GLP_LO) #else if (row->stat == GLP_NF || row->stat == GLP_NL) #endif { if (t < 0.0) { e = - t; if (ae_max < e) ae_max = re_max = e, ae_ind = re_ind = i; } } /* check for negativity */ #if 1 /* 08/III-2013 */ /* see comment above */ if (row->type == GLP_FR || row->type == GLP_UP) #else if (row->stat == GLP_NF || row->stat == GLP_NU) #endif { if (t > 0.0) { e = + t; if (ae_max < e) ae_max = re_max = e, ae_ind = re_ind = i; } } } /* check lambdaS */ for (j = 1; j <= n; j++) { col = P->col[j]; /* t := lambdaS[j] */ if (sol == GLP_SOL) t = col->dual; else if (sol == GLP_IPT) t = col->dval; else xassert(sol != sol); /* correct sign */ if (P->dir == GLP_MIN) t = + t; else if (P->dir == GLP_MAX) t = - t; else xassert(P != P); /* check for positivity */ #if 1 /* 08/III-2013 */ /* see comment above */ if (col->type == GLP_FR || col->type == GLP_LO) #else if (col->stat == GLP_NF || col->stat == GLP_NL) #endif { if (t < 0.0) { e = - t; if (ae_max < e) ae_max = re_max = e, ae_ind = re_ind = m+j; } } /* check for negativity */ #if 1 /* 08/III-2013 */ /* see comment above */ if (col->type == GLP_FR || col->type == GLP_UP) #else if (col->stat == GLP_NF || col->stat == GLP_NU) #endif { if (t > 0.0) { e = + t; if (ae_max < e) ae_max = re_max = e, ae_ind = re_ind = m+j; } } } } else xassert(cond != cond); if (_ae_max != NULL) *_ae_max = ae_max; if (_ae_ind != NULL) *_ae_ind = ae_ind; if (_re_max != NULL) *_re_max = re_max; if (_re_ind != NULL) *_re_ind = re_ind; return; } /* eof */ glpk-5.0/src/draft/glpapi12.c0000644000062000006210000023260413766346220015163 0ustar maomkpasswd/* glpapi12.c (basis factorization and simplex tableau routines) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2000-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "draft.h" #include "env.h" #include "prob.h" /*********************************************************************** * NAME * * glp_bf_exists - check if the basis factorization exists * * SYNOPSIS * * int glp_bf_exists(glp_prob *lp); * * RETURNS * * If the basis factorization for the current basis associated with * the specified problem object exists and therefore is available for * computations, the routine glp_bf_exists returns non-zero. Otherwise * the routine returns zero. */ int glp_bf_exists(glp_prob *lp) { int ret; ret = (lp->m == 0 || lp->valid); return ret; } /*********************************************************************** * NAME * * glp_factorize - compute the basis factorization * * SYNOPSIS * * int glp_factorize(glp_prob *lp); * * DESCRIPTION * * The routine glp_factorize computes the basis factorization for the * current basis associated with the specified problem object. * * RETURNS * * 0 The basis factorization has been successfully computed. * * GLP_EBADB * The basis matrix is invalid, i.e. the number of basic (auxiliary * and structural) variables differs from the number of rows in the * problem object. * * GLP_ESING * The basis matrix is singular within the working precision. * * GLP_ECOND * The basis matrix is ill-conditioned. */ static int b_col(void *info, int j, int ind[], double val[]) { glp_prob *lp = info; int m = lp->m; GLPAIJ *aij; int k, len; xassert(1 <= j && j <= m); /* determine the ordinal number of basic auxiliary or structural variable x[k] corresponding to basic variable xB[j] */ k = lp->head[j]; /* build j-th column of the basic matrix, which is k-th column of the scaled augmented matrix (I | -R*A*S) */ if (k <= m) { /* x[k] is auxiliary variable */ len = 1; ind[1] = k; val[1] = 1.0; } else { /* x[k] is structural variable */ len = 0; for (aij = lp->col[k-m]->ptr; aij != NULL; aij = aij->c_next) { len++; ind[len] = aij->row->i; val[len] = - aij->row->rii * aij->val * aij->col->sjj; } } return len; } int glp_factorize(glp_prob *lp) { int m = lp->m; int n = lp->n; GLPROW **row = lp->row; GLPCOL **col = lp->col; int *head = lp->head; int j, k, stat, ret; /* invalidate the basis factorization */ lp->valid = 0; /* build the basis header */ j = 0; for (k = 1; k <= m+n; k++) { if (k <= m) { stat = row[k]->stat; row[k]->bind = 0; } else { stat = col[k-m]->stat; col[k-m]->bind = 0; } if (stat == GLP_BS) { j++; if (j > m) { /* too many basic variables */ ret = GLP_EBADB; goto fini; } head[j] = k; if (k <= m) row[k]->bind = j; else col[k-m]->bind = j; } } if (j < m) { /* too few basic variables */ ret = GLP_EBADB; goto fini; } /* try to factorize the basis matrix */ if (m > 0) { if (lp->bfd == NULL) { lp->bfd = bfd_create_it(); #if 0 /* 08/III-2014 */ copy_bfcp(lp); #endif } switch (bfd_factorize(lp->bfd, m, /*lp->head,*/ b_col, lp)) { case 0: /* ok */ break; case BFD_ESING: /* singular matrix */ ret = GLP_ESING; goto fini; case BFD_ECOND: /* ill-conditioned matrix */ ret = GLP_ECOND; goto fini; default: xassert(lp != lp); } lp->valid = 1; } /* factorization successful */ ret = 0; fini: /* bring the return code to the calling program */ return ret; } /*********************************************************************** * NAME * * glp_bf_updated - check if the basis factorization has been updated * * SYNOPSIS * * int glp_bf_updated(glp_prob *lp); * * RETURNS * * If the basis factorization has been just computed from scratch, the * routine glp_bf_updated returns zero. Otherwise, if the factorization * has been updated one or more times, the routine returns non-zero. */ int glp_bf_updated(glp_prob *lp) { int cnt; if (!(lp->m == 0 || lp->valid)) xerror("glp_bf_update: basis factorization does not exist\n"); #if 0 /* 15/XI-2009 */ cnt = (lp->m == 0 ? 0 : lp->bfd->upd_cnt); #else cnt = (lp->m == 0 ? 0 : bfd_get_count(lp->bfd)); #endif return cnt; } /*********************************************************************** * NAME * * glp_get_bfcp - retrieve basis factorization control parameters * * SYNOPSIS * * void glp_get_bfcp(glp_prob *lp, glp_bfcp *parm); * * DESCRIPTION * * The routine glp_get_bfcp retrieves control parameters, which are * used on computing and updating the basis factorization associated * with the specified problem object. * * Current values of control parameters are stored by the routine in * a glp_bfcp structure, which the parameter parm points to. */ #if 1 /* 08/III-2014 */ void glp_get_bfcp(glp_prob *P, glp_bfcp *parm) { if (P->bfd == NULL) P->bfd = bfd_create_it(); bfd_get_bfcp(P->bfd, parm); return; } #endif /*********************************************************************** * NAME * * glp_set_bfcp - change basis factorization control parameters * * SYNOPSIS * * void glp_set_bfcp(glp_prob *lp, const glp_bfcp *parm); * * DESCRIPTION * * The routine glp_set_bfcp changes control parameters, which are used * by internal GLPK routines in computing and updating the basis * factorization associated with the specified problem object. * * New values of the control parameters should be passed in a structure * glp_bfcp, which the parameter parm points to. * * The parameter parm can be specified as NULL, in which case all * control parameters are reset to their default values. */ #if 1 /* 08/III-2014 */ void glp_set_bfcp(glp_prob *P, const glp_bfcp *parm) { if (P->bfd == NULL) P->bfd = bfd_create_it(); if (parm != NULL) { if (!(parm->type == GLP_BF_LUF + GLP_BF_FT || parm->type == GLP_BF_LUF + GLP_BF_BG || parm->type == GLP_BF_LUF + GLP_BF_GR || parm->type == GLP_BF_BTF + GLP_BF_BG || parm->type == GLP_BF_BTF + GLP_BF_GR)) xerror("glp_set_bfcp: type = 0x%02X; invalid parameter\n", parm->type); if (!(0.0 < parm->piv_tol && parm->piv_tol < 1.0)) xerror("glp_set_bfcp: piv_tol = %g; invalid parameter\n", parm->piv_tol); if (parm->piv_lim < 1) xerror("glp_set_bfcp: piv_lim = %d; invalid parameter\n", parm->piv_lim); if (!(parm->suhl == GLP_ON || parm->suhl == GLP_OFF)) xerror("glp_set_bfcp: suhl = %d; invalid parameter\n", parm->suhl); if (!(0.0 <= parm->eps_tol && parm->eps_tol <= 1e-6)) xerror("glp_set_bfcp: eps_tol = %g; invalid parameter\n", parm->eps_tol); if (!(1 <= parm->nfs_max && parm->nfs_max <= 32767)) xerror("glp_set_bfcp: nfs_max = %d; invalid parameter\n", parm->nfs_max); if (!(1 <= parm->nrs_max && parm->nrs_max <= 32767)) xerror("glp_set_bfcp: nrs_max = %d; invalid parameter\n", parm->nrs_max); } bfd_set_bfcp(P->bfd, parm); return; } #endif /*********************************************************************** * NAME * * glp_get_bhead - retrieve the basis header information * * SYNOPSIS * * int glp_get_bhead(glp_prob *lp, int k); * * DESCRIPTION * * The routine glp_get_bhead returns the basis header information for * the current basis associated with the specified problem object. * * RETURNS * * If xB[k], 1 <= k <= m, is i-th auxiliary variable (1 <= i <= m), the * routine returns i. Otherwise, if xB[k] is j-th structural variable * (1 <= j <= n), the routine returns m+j. Here m is the number of rows * and n is the number of columns in the problem object. */ int glp_get_bhead(glp_prob *lp, int k) { if (!(lp->m == 0 || lp->valid)) xerror("glp_get_bhead: basis factorization does not exist\n"); if (!(1 <= k && k <= lp->m)) xerror("glp_get_bhead: k = %d; index out of range\n", k); return lp->head[k]; } /*********************************************************************** * NAME * * glp_get_row_bind - retrieve row index in the basis header * * SYNOPSIS * * int glp_get_row_bind(glp_prob *lp, int i); * * RETURNS * * The routine glp_get_row_bind returns the index k of basic variable * xB[k], 1 <= k <= m, which is i-th auxiliary variable, 1 <= i <= m, * in the current basis associated with the specified problem object, * where m is the number of rows. However, if i-th auxiliary variable * is non-basic, the routine returns zero. */ int glp_get_row_bind(glp_prob *lp, int i) { if (!(lp->m == 0 || lp->valid)) xerror("glp_get_row_bind: basis factorization does not exist\n" ); if (!(1 <= i && i <= lp->m)) xerror("glp_get_row_bind: i = %d; row number out of range\n", i); return lp->row[i]->bind; } /*********************************************************************** * NAME * * glp_get_col_bind - retrieve column index in the basis header * * SYNOPSIS * * int glp_get_col_bind(glp_prob *lp, int j); * * RETURNS * * The routine glp_get_col_bind returns the index k of basic variable * xB[k], 1 <= k <= m, which is j-th structural variable, 1 <= j <= n, * in the current basis associated with the specified problem object, * where m is the number of rows, n is the number of columns. However, * if j-th structural variable is non-basic, the routine returns zero.*/ int glp_get_col_bind(glp_prob *lp, int j) { if (!(lp->m == 0 || lp->valid)) xerror("glp_get_col_bind: basis factorization does not exist\n" ); if (!(1 <= j && j <= lp->n)) xerror("glp_get_col_bind: j = %d; column number out of range\n" , j); return lp->col[j]->bind; } /*********************************************************************** * NAME * * glp_ftran - perform forward transformation (solve system B*x = b) * * SYNOPSIS * * void glp_ftran(glp_prob *lp, double x[]); * * DESCRIPTION * * The routine glp_ftran performs forward transformation, i.e. solves * the system B*x = b, where B is the basis matrix corresponding to the * current basis for the specified problem object, x is the vector of * unknowns to be computed, b is the vector of right-hand sides. * * On entry elements of the vector b should be stored in dense format * in locations x[1], ..., x[m], where m is the number of rows. On exit * the routine stores elements of the vector x in the same locations. * * SCALING/UNSCALING * * Let A~ = (I | -A) is the augmented constraint matrix of the original * (unscaled) problem. In the scaled LP problem instead the matrix A the * scaled matrix A" = R*A*S is actually used, so * * A~" = (I | A") = (I | R*A*S) = (R*I*inv(R) | R*A*S) = * (1) * = R*(I | A)*S~ = R*A~*S~, * * is the scaled augmented constraint matrix, where R and S are diagonal * scaling matrices used to scale rows and columns of the matrix A, and * * S~ = diag(inv(R) | S) (2) * * is an augmented diagonal scaling matrix. * * By definition: * * A~ = (B | N), (3) * * where B is the basic matrix, which consists of basic columns of the * augmented constraint matrix A~, and N is a matrix, which consists of * non-basic columns of A~. From (1) it follows that: * * A~" = (B" | N") = (R*B*SB | R*N*SN), (4) * * where SB and SN are parts of the augmented scaling matrix S~, which * correspond to basic and non-basic variables, respectively. Therefore * * B" = R*B*SB, (5) * * which is the scaled basis matrix. */ void glp_ftran(glp_prob *lp, double x[]) { int m = lp->m; GLPROW **row = lp->row; GLPCOL **col = lp->col; int i, k; /* B*x = b ===> (R*B*SB)*(inv(SB)*x) = R*b ===> B"*x" = b", where b" = R*b, x = SB*x" */ if (!(m == 0 || lp->valid)) xerror("glp_ftran: basis factorization does not exist\n"); /* b" := R*b */ for (i = 1; i <= m; i++) x[i] *= row[i]->rii; /* x" := inv(B")*b" */ if (m > 0) bfd_ftran(lp->bfd, x); /* x := SB*x" */ for (i = 1; i <= m; i++) { k = lp->head[i]; if (k <= m) x[i] /= row[k]->rii; else x[i] *= col[k-m]->sjj; } return; } /*********************************************************************** * NAME * * glp_btran - perform backward transformation (solve system B'*x = b) * * SYNOPSIS * * void glp_btran(glp_prob *lp, double x[]); * * DESCRIPTION * * The routine glp_btran performs backward transformation, i.e. solves * the system B'*x = b, where B' is a matrix transposed to the basis * matrix corresponding to the current basis for the specified problem * problem object, x is the vector of unknowns to be computed, b is the * vector of right-hand sides. * * On entry elements of the vector b should be stored in dense format * in locations x[1], ..., x[m], where m is the number of rows. On exit * the routine stores elements of the vector x in the same locations. * * SCALING/UNSCALING * * See comments to the routine glp_ftran. */ void glp_btran(glp_prob *lp, double x[]) { int m = lp->m; GLPROW **row = lp->row; GLPCOL **col = lp->col; int i, k; /* B'*x = b ===> (SB*B'*R)*(inv(R)*x) = SB*b ===> (B")'*x" = b", where b" = SB*b, x = R*x" */ if (!(m == 0 || lp->valid)) xerror("glp_btran: basis factorization does not exist\n"); /* b" := SB*b */ for (i = 1; i <= m; i++) { k = lp->head[i]; if (k <= m) x[i] /= row[k]->rii; else x[i] *= col[k-m]->sjj; } /* x" := inv[(B")']*b" */ if (m > 0) bfd_btran(lp->bfd, x); /* x := R*x" */ for (i = 1; i <= m; i++) x[i] *= row[i]->rii; return; } /*********************************************************************** * NAME * * glp_warm_up - "warm up" LP basis * * SYNOPSIS * * int glp_warm_up(glp_prob *P); * * DESCRIPTION * * The routine glp_warm_up "warms up" the LP basis for the specified * problem object using current statuses assigned to rows and columns * (that is, to auxiliary and structural variables). * * This operation includes computing factorization of the basis matrix * (if it does not exist), computing primal and dual components of basic * solution, and determining the solution status. * * RETURNS * * 0 The operation has been successfully performed. * * GLP_EBADB * The basis matrix is invalid, i.e. the number of basic (auxiliary * and structural) variables differs from the number of rows in the * problem object. * * GLP_ESING * The basis matrix is singular within the working precision. * * GLP_ECOND * The basis matrix is ill-conditioned. */ int glp_warm_up(glp_prob *P) { GLPROW *row; GLPCOL *col; GLPAIJ *aij; int i, j, type, stat, ret; double eps, temp, *work; /* invalidate basic solution */ P->pbs_stat = P->dbs_stat = GLP_UNDEF; P->obj_val = 0.0; P->some = 0; for (i = 1; i <= P->m; i++) { row = P->row[i]; row->prim = row->dual = 0.0; } for (j = 1; j <= P->n; j++) { col = P->col[j]; col->prim = col->dual = 0.0; } /* compute the basis factorization, if necessary */ if (!glp_bf_exists(P)) { ret = glp_factorize(P); if (ret != 0) goto done; } /* allocate working array */ work = xcalloc(1+P->m, sizeof(double)); /* determine and store values of non-basic variables, compute vector (- N * xN) */ for (i = 1; i <= P->m; i++) work[i] = 0.0; for (i = 1; i <= P->m; i++) { row = P->row[i]; if (row->stat == GLP_BS) continue; else if (row->stat == GLP_NL) row->prim = row->lb; else if (row->stat == GLP_NU) row->prim = row->ub; else if (row->stat == GLP_NF) row->prim = 0.0; else if (row->stat == GLP_NS) row->prim = row->lb; else xassert(row != row); /* N[j] is i-th column of matrix (I|-A) */ work[i] -= row->prim; } for (j = 1; j <= P->n; j++) { col = P->col[j]; if (col->stat == GLP_BS) continue; else if (col->stat == GLP_NL) col->prim = col->lb; else if (col->stat == GLP_NU) col->prim = col->ub; else if (col->stat == GLP_NF) col->prim = 0.0; else if (col->stat == GLP_NS) col->prim = col->lb; else xassert(col != col); /* N[j] is (m+j)-th column of matrix (I|-A) */ if (col->prim != 0.0) { for (aij = col->ptr; aij != NULL; aij = aij->c_next) work[aij->row->i] += aij->val * col->prim; } } /* compute vector of basic variables xB = - inv(B) * N * xN */ glp_ftran(P, work); /* store values of basic variables, check primal feasibility */ P->pbs_stat = GLP_FEAS; for (i = 1; i <= P->m; i++) { row = P->row[i]; if (row->stat != GLP_BS) continue; row->prim = work[row->bind]; type = row->type; if (type == GLP_LO || type == GLP_DB || type == GLP_FX) { eps = 1e-6 + 1e-9 * fabs(row->lb); if (row->prim < row->lb - eps) P->pbs_stat = GLP_INFEAS; } if (type == GLP_UP || type == GLP_DB || type == GLP_FX) { eps = 1e-6 + 1e-9 * fabs(row->ub); if (row->prim > row->ub + eps) P->pbs_stat = GLP_INFEAS; } } for (j = 1; j <= P->n; j++) { col = P->col[j]; if (col->stat != GLP_BS) continue; col->prim = work[col->bind]; type = col->type; if (type == GLP_LO || type == GLP_DB || type == GLP_FX) { eps = 1e-6 + 1e-9 * fabs(col->lb); if (col->prim < col->lb - eps) P->pbs_stat = GLP_INFEAS; } if (type == GLP_UP || type == GLP_DB || type == GLP_FX) { eps = 1e-6 + 1e-9 * fabs(col->ub); if (col->prim > col->ub + eps) P->pbs_stat = GLP_INFEAS; } } /* compute value of the objective function */ P->obj_val = P->c0; for (j = 1; j <= P->n; j++) { col = P->col[j]; P->obj_val += col->coef * col->prim; } /* build vector cB of objective coefficients at basic variables */ for (i = 1; i <= P->m; i++) work[i] = 0.0; for (j = 1; j <= P->n; j++) { col = P->col[j]; if (col->stat == GLP_BS) work[col->bind] = col->coef; } /* compute vector of simplex multipliers pi = inv(B') * cB */ glp_btran(P, work); /* compute and store reduced costs of non-basic variables d[j] = c[j] - N'[j] * pi, check dual feasibility */ P->dbs_stat = GLP_FEAS; for (i = 1; i <= P->m; i++) { row = P->row[i]; if (row->stat == GLP_BS) { row->dual = 0.0; continue; } /* N[j] is i-th column of matrix (I|-A) */ row->dual = - work[i]; #if 0 /* 07/III-2013 */ type = row->type; temp = (P->dir == GLP_MIN ? + row->dual : - row->dual); if ((type == GLP_FR || type == GLP_LO) && temp < -1e-5 || (type == GLP_FR || type == GLP_UP) && temp > +1e-5) P->dbs_stat = GLP_INFEAS; #else stat = row->stat; temp = (P->dir == GLP_MIN ? + row->dual : - row->dual); if ((stat == GLP_NF || stat == GLP_NL) && temp < -1e-5 || (stat == GLP_NF || stat == GLP_NU) && temp > +1e-5) P->dbs_stat = GLP_INFEAS; #endif } for (j = 1; j <= P->n; j++) { col = P->col[j]; if (col->stat == GLP_BS) { col->dual = 0.0; continue; } /* N[j] is (m+j)-th column of matrix (I|-A) */ col->dual = col->coef; for (aij = col->ptr; aij != NULL; aij = aij->c_next) col->dual += aij->val * work[aij->row->i]; #if 0 /* 07/III-2013 */ type = col->type; temp = (P->dir == GLP_MIN ? + col->dual : - col->dual); if ((type == GLP_FR || type == GLP_LO) && temp < -1e-5 || (type == GLP_FR || type == GLP_UP) && temp > +1e-5) P->dbs_stat = GLP_INFEAS; #else stat = col->stat; temp = (P->dir == GLP_MIN ? + col->dual : - col->dual); if ((stat == GLP_NF || stat == GLP_NL) && temp < -1e-5 || (stat == GLP_NF || stat == GLP_NU) && temp > +1e-5) P->dbs_stat = GLP_INFEAS; #endif } /* free working array */ xfree(work); ret = 0; done: return ret; } /*********************************************************************** * NAME * * glp_eval_tab_row - compute row of the simplex tableau * * SYNOPSIS * * int glp_eval_tab_row(glp_prob *lp, int k, int ind[], double val[]); * * DESCRIPTION * * The routine glp_eval_tab_row computes a row of the current simplex * tableau for the basic variable, which is specified by the number k: * if 1 <= k <= m, x[k] is k-th auxiliary variable; if m+1 <= k <= m+n, * x[k] is (k-m)-th structural variable, where m is number of rows, and * n is number of columns. The current basis must be available. * * The routine stores column indices and numerical values of non-zero * elements of the computed row using sparse format to the locations * ind[1], ..., ind[len] and val[1], ..., val[len], respectively, where * 0 <= len <= n is number of non-zeros returned on exit. * * Element indices stored in the array ind have the same sense as the * index k, i.e. indices 1 to m denote auxiliary variables and indices * m+1 to m+n denote structural ones (all these variables are obviously * non-basic by definition). * * The computed row shows how the specified basic variable x[k] = xB[i] * depends on non-basic variables: * * xB[i] = alfa[i,1]*xN[1] + alfa[i,2]*xN[2] + ... + alfa[i,n]*xN[n], * * where alfa[i,j] are elements of the simplex table row, xN[j] are * non-basic (auxiliary and structural) variables. * * RETURNS * * The routine returns number of non-zero elements in the simplex table * row stored in the arrays ind and val. * * BACKGROUND * * The system of equality constraints of the LP problem is: * * xR = A * xS, (1) * * where xR is the vector of auxliary variables, xS is the vector of * structural variables, A is the matrix of constraint coefficients. * * The system (1) can be written in homogenous form as follows: * * A~ * x = 0, (2) * * where A~ = (I | -A) is the augmented constraint matrix (has m rows * and m+n columns), x = (xR | xS) is the vector of all (auxiliary and * structural) variables. * * By definition for the current basis we have: * * A~ = (B | N), (3) * * where B is the basis matrix. Thus, the system (2) can be written as: * * B * xB + N * xN = 0. (4) * * From (4) it follows that: * * xB = A^ * xN, (5) * * where the matrix * * A^ = - inv(B) * N (6) * * is called the simplex table. * * It is understood that i-th row of the simplex table is: * * e * A^ = - e * inv(B) * N, (7) * * where e is a unity vector with e[i] = 1. * * To compute i-th row of the simplex table the routine first computes * i-th row of the inverse: * * rho = inv(B') * e, (8) * * where B' is a matrix transposed to B, and then computes elements of * i-th row of the simplex table as scalar products: * * alfa[i,j] = - rho * N[j] for all j, (9) * * where N[j] is a column of the augmented constraint matrix A~, which * corresponds to some non-basic auxiliary or structural variable. */ int glp_eval_tab_row(glp_prob *lp, int k, int ind[], double val[]) { int m = lp->m; int n = lp->n; int i, t, len, lll, *iii; double alfa, *rho, *vvv; if (!(m == 0 || lp->valid)) xerror("glp_eval_tab_row: basis factorization does not exist\n" ); if (!(1 <= k && k <= m+n)) xerror("glp_eval_tab_row: k = %d; variable number out of range" , k); /* determine xB[i] which corresponds to x[k] */ if (k <= m) i = glp_get_row_bind(lp, k); else i = glp_get_col_bind(lp, k-m); if (i == 0) xerror("glp_eval_tab_row: k = %d; variable must be basic", k); xassert(1 <= i && i <= m); /* allocate working arrays */ rho = xcalloc(1+m, sizeof(double)); iii = xcalloc(1+m, sizeof(int)); vvv = xcalloc(1+m, sizeof(double)); /* compute i-th row of the inverse; see (8) */ for (t = 1; t <= m; t++) rho[t] = 0.0; rho[i] = 1.0; glp_btran(lp, rho); /* compute i-th row of the simplex table */ len = 0; for (k = 1; k <= m+n; k++) { if (k <= m) { /* x[k] is auxiliary variable, so N[k] is a unity column */ if (glp_get_row_stat(lp, k) == GLP_BS) continue; /* compute alfa[i,j]; see (9) */ alfa = - rho[k]; } else { /* x[k] is structural variable, so N[k] is a column of the original constraint matrix A with negative sign */ if (glp_get_col_stat(lp, k-m) == GLP_BS) continue; /* compute alfa[i,j]; see (9) */ lll = glp_get_mat_col(lp, k-m, iii, vvv); alfa = 0.0; for (t = 1; t <= lll; t++) alfa += rho[iii[t]] * vvv[t]; } /* store alfa[i,j] */ if (alfa != 0.0) len++, ind[len] = k, val[len] = alfa; } xassert(len <= n); /* free working arrays */ xfree(rho); xfree(iii); xfree(vvv); /* return to the calling program */ return len; } /*********************************************************************** * NAME * * glp_eval_tab_col - compute column of the simplex tableau * * SYNOPSIS * * int glp_eval_tab_col(glp_prob *lp, int k, int ind[], double val[]); * * DESCRIPTION * * The routine glp_eval_tab_col computes a column of the current simplex * table for the non-basic variable, which is specified by the number k: * if 1 <= k <= m, x[k] is k-th auxiliary variable; if m+1 <= k <= m+n, * x[k] is (k-m)-th structural variable, where m is number of rows, and * n is number of columns. The current basis must be available. * * The routine stores row indices and numerical values of non-zero * elements of the computed column using sparse format to the locations * ind[1], ..., ind[len] and val[1], ..., val[len] respectively, where * 0 <= len <= m is number of non-zeros returned on exit. * * Element indices stored in the array ind have the same sense as the * index k, i.e. indices 1 to m denote auxiliary variables and indices * m+1 to m+n denote structural ones (all these variables are obviously * basic by the definition). * * The computed column shows how basic variables depend on the specified * non-basic variable x[k] = xN[j]: * * xB[1] = ... + alfa[1,j]*xN[j] + ... * xB[2] = ... + alfa[2,j]*xN[j] + ... * . . . . . . * xB[m] = ... + alfa[m,j]*xN[j] + ... * * where alfa[i,j] are elements of the simplex table column, xB[i] are * basic (auxiliary and structural) variables. * * RETURNS * * The routine returns number of non-zero elements in the simplex table * column stored in the arrays ind and val. * * BACKGROUND * * As it was explained in comments to the routine glp_eval_tab_row (see * above) the simplex table is the following matrix: * * A^ = - inv(B) * N. (1) * * Therefore j-th column of the simplex table is: * * A^ * e = - inv(B) * N * e = - inv(B) * N[j], (2) * * where e is a unity vector with e[j] = 1, B is the basis matrix, N[j] * is a column of the augmented constraint matrix A~, which corresponds * to the given non-basic auxiliary or structural variable. */ int glp_eval_tab_col(glp_prob *lp, int k, int ind[], double val[]) { int m = lp->m; int n = lp->n; int t, len, stat; double *col; if (!(m == 0 || lp->valid)) xerror("glp_eval_tab_col: basis factorization does not exist\n" ); if (!(1 <= k && k <= m+n)) xerror("glp_eval_tab_col: k = %d; variable number out of range" , k); if (k <= m) stat = glp_get_row_stat(lp, k); else stat = glp_get_col_stat(lp, k-m); if (stat == GLP_BS) xerror("glp_eval_tab_col: k = %d; variable must be non-basic", k); /* obtain column N[k] with negative sign */ col = xcalloc(1+m, sizeof(double)); for (t = 1; t <= m; t++) col[t] = 0.0; if (k <= m) { /* x[k] is auxiliary variable, so N[k] is a unity column */ col[k] = -1.0; } else { /* x[k] is structural variable, so N[k] is a column of the original constraint matrix A with negative sign */ len = glp_get_mat_col(lp, k-m, ind, val); for (t = 1; t <= len; t++) col[ind[t]] = val[t]; } /* compute column of the simplex table, which corresponds to the specified non-basic variable x[k] */ glp_ftran(lp, col); len = 0; for (t = 1; t <= m; t++) { if (col[t] != 0.0) { len++; ind[len] = glp_get_bhead(lp, t); val[len] = col[t]; } } xfree(col); /* return to the calling program */ return len; } /*********************************************************************** * NAME * * glp_transform_row - transform explicitly specified row * * SYNOPSIS * * int glp_transform_row(glp_prob *P, int len, int ind[], double val[]); * * DESCRIPTION * * The routine glp_transform_row performs the same operation as the * routine glp_eval_tab_row with exception that the row to be * transformed is specified explicitly as a sparse vector. * * The explicitly specified row may be thought as a linear form: * * x = a[1]*x[m+1] + a[2]*x[m+2] + ... + a[n]*x[m+n], (1) * * where x is an auxiliary variable for this row, a[j] are coefficients * of the linear form, x[m+j] are structural variables. * * On entry column indices and numerical values of non-zero elements of * the row should be stored in locations ind[1], ..., ind[len] and * val[1], ..., val[len], where len is the number of non-zero elements. * * This routine uses the system of equality constraints and the current * basis in order to express the auxiliary variable x in (1) through the * current non-basic variables (as if the transformed row were added to * the problem object and its auxiliary variable were basic), i.e. the * resultant row has the form: * * x = alfa[1]*xN[1] + alfa[2]*xN[2] + ... + alfa[n]*xN[n], (2) * * where xN[j] are non-basic (auxiliary or structural) variables, n is * the number of columns in the LP problem object. * * On exit the routine stores indices and numerical values of non-zero * elements of the resultant row (2) in locations ind[1], ..., ind[len'] * and val[1], ..., val[len'], where 0 <= len' <= n is the number of * non-zero elements in the resultant row returned by the routine. Note * that indices (numbers) of non-basic variables stored in the array ind * correspond to original ordinal numbers of variables: indices 1 to m * mean auxiliary variables and indices m+1 to m+n mean structural ones. * * RETURNS * * The routine returns len', which is the number of non-zero elements in * the resultant row stored in the arrays ind and val. * * BACKGROUND * * The explicitly specified row (1) is transformed in the same way as it * were the objective function row. * * From (1) it follows that: * * x = aB * xB + aN * xN, (3) * * where xB is the vector of basic variables, xN is the vector of * non-basic variables. * * The simplex table, which corresponds to the current basis, is: * * xB = [-inv(B) * N] * xN. (4) * * Therefore substituting xB from (4) to (3) we have: * * x = aB * [-inv(B) * N] * xN + aN * xN = * (5) * = rho * (-N) * xN + aN * xN = alfa * xN, * * where: * * rho = inv(B') * aB, (6) * * and * * alfa = aN + rho * (-N) (7) * * is the resultant row computed by the routine. */ int glp_transform_row(glp_prob *P, int len, int ind[], double val[]) { int i, j, k, m, n, t, lll, *iii; double alfa, *a, *aB, *rho, *vvv; if (!glp_bf_exists(P)) xerror("glp_transform_row: basis factorization does not exist " "\n"); m = glp_get_num_rows(P); n = glp_get_num_cols(P); /* unpack the row to be transformed to the array a */ a = xcalloc(1+n, sizeof(double)); for (j = 1; j <= n; j++) a[j] = 0.0; if (!(0 <= len && len <= n)) xerror("glp_transform_row: len = %d; invalid row length\n", len); for (t = 1; t <= len; t++) { j = ind[t]; if (!(1 <= j && j <= n)) xerror("glp_transform_row: ind[%d] = %d; column index out o" "f range\n", t, j); if (val[t] == 0.0) xerror("glp_transform_row: val[%d] = 0; zero coefficient no" "t allowed\n", t); if (a[j] != 0.0) xerror("glp_transform_row: ind[%d] = %d; duplicate column i" "ndices not allowed\n", t, j); a[j] = val[t]; } /* construct the vector aB */ aB = xcalloc(1+m, sizeof(double)); for (i = 1; i <= m; i++) { k = glp_get_bhead(P, i); /* xB[i] is k-th original variable */ xassert(1 <= k && k <= m+n); aB[i] = (k <= m ? 0.0 : a[k-m]); } /* solve the system B'*rho = aB to compute the vector rho */ rho = aB, glp_btran(P, rho); /* compute coefficients at non-basic auxiliary variables */ len = 0; for (i = 1; i <= m; i++) { if (glp_get_row_stat(P, i) != GLP_BS) { alfa = - rho[i]; if (alfa != 0.0) { len++; ind[len] = i; val[len] = alfa; } } } /* compute coefficients at non-basic structural variables */ iii = xcalloc(1+m, sizeof(int)); vvv = xcalloc(1+m, sizeof(double)); for (j = 1; j <= n; j++) { if (glp_get_col_stat(P, j) != GLP_BS) { alfa = a[j]; lll = glp_get_mat_col(P, j, iii, vvv); for (t = 1; t <= lll; t++) alfa += vvv[t] * rho[iii[t]]; if (alfa != 0.0) { len++; ind[len] = m+j; val[len] = alfa; } } } xassert(len <= n); xfree(iii); xfree(vvv); xfree(aB); xfree(a); return len; } /*********************************************************************** * NAME * * glp_transform_col - transform explicitly specified column * * SYNOPSIS * * int glp_transform_col(glp_prob *P, int len, int ind[], double val[]); * * DESCRIPTION * * The routine glp_transform_col performs the same operation as the * routine glp_eval_tab_col with exception that the column to be * transformed is specified explicitly as a sparse vector. * * The explicitly specified column may be thought as if it were added * to the original system of equality constraints: * * x[1] = a[1,1]*x[m+1] + ... + a[1,n]*x[m+n] + a[1]*x * x[2] = a[2,1]*x[m+1] + ... + a[2,n]*x[m+n] + a[2]*x (1) * . . . . . . . . . . . . . . . * x[m] = a[m,1]*x[m+1] + ... + a[m,n]*x[m+n] + a[m]*x * * where x[i] are auxiliary variables, x[m+j] are structural variables, * x is a structural variable for the explicitly specified column, a[i] * are constraint coefficients for x. * * On entry row indices and numerical values of non-zero elements of * the column should be stored in locations ind[1], ..., ind[len] and * val[1], ..., val[len], where len is the number of non-zero elements. * * This routine uses the system of equality constraints and the current * basis in order to express the current basic variables through the * structural variable x in (1) (as if the transformed column were added * to the problem object and the variable x were non-basic), i.e. the * resultant column has the form: * * xB[1] = ... + alfa[1]*x * xB[2] = ... + alfa[2]*x (2) * . . . . . . * xB[m] = ... + alfa[m]*x * * where xB are basic (auxiliary and structural) variables, m is the * number of rows in the problem object. * * On exit the routine stores indices and numerical values of non-zero * elements of the resultant column (2) in locations ind[1], ..., * ind[len'] and val[1], ..., val[len'], where 0 <= len' <= m is the * number of non-zero element in the resultant column returned by the * routine. Note that indices (numbers) of basic variables stored in * the array ind correspond to original ordinal numbers of variables: * indices 1 to m mean auxiliary variables and indices m+1 to m+n mean * structural ones. * * RETURNS * * The routine returns len', which is the number of non-zero elements * in the resultant column stored in the arrays ind and val. * * BACKGROUND * * The explicitly specified column (1) is transformed in the same way * as any other column of the constraint matrix using the formula: * * alfa = inv(B) * a, (3) * * where alfa is the resultant column computed by the routine. */ int glp_transform_col(glp_prob *P, int len, int ind[], double val[]) { int i, m, t; double *a, *alfa; if (!glp_bf_exists(P)) xerror("glp_transform_col: basis factorization does not exist " "\n"); m = glp_get_num_rows(P); /* unpack the column to be transformed to the array a */ a = xcalloc(1+m, sizeof(double)); for (i = 1; i <= m; i++) a[i] = 0.0; if (!(0 <= len && len <= m)) xerror("glp_transform_col: len = %d; invalid column length\n", len); for (t = 1; t <= len; t++) { i = ind[t]; if (!(1 <= i && i <= m)) xerror("glp_transform_col: ind[%d] = %d; row index out of r" "ange\n", t, i); if (val[t] == 0.0) xerror("glp_transform_col: val[%d] = 0; zero coefficient no" "t allowed\n", t); if (a[i] != 0.0) xerror("glp_transform_col: ind[%d] = %d; duplicate row indi" "ces not allowed\n", t, i); a[i] = val[t]; } /* solve the system B*a = alfa to compute the vector alfa */ alfa = a, glp_ftran(P, alfa); /* store resultant coefficients */ len = 0; for (i = 1; i <= m; i++) { if (alfa[i] != 0.0) { len++; ind[len] = glp_get_bhead(P, i); val[len] = alfa[i]; } } xfree(a); return len; } /*********************************************************************** * NAME * * glp_prim_rtest - perform primal ratio test * * SYNOPSIS * * int glp_prim_rtest(glp_prob *P, int len, const int ind[], * const double val[], int dir, double eps); * * DESCRIPTION * * The routine glp_prim_rtest performs the primal ratio test using an * explicitly specified column of the simplex table. * * The current basic solution associated with the LP problem object * must be primal feasible. * * The explicitly specified column of the simplex table shows how the * basic variables xB depend on some non-basic variable x (which is not * necessarily presented in the problem object): * * xB[1] = ... + alfa[1] * x + ... * xB[2] = ... + alfa[2] * x + ... (*) * . . . . . . . . * xB[m] = ... + alfa[m] * x + ... * * The column (*) is specifed on entry to the routine using the sparse * format. Ordinal numbers of basic variables xB[i] should be placed in * locations ind[1], ..., ind[len], where ordinal number 1 to m denote * auxiliary variables, and ordinal numbers m+1 to m+n denote structural * variables. The corresponding non-zero coefficients alfa[i] should be * placed in locations val[1], ..., val[len]. The arrays ind and val are * not changed on exit. * * The parameter dir specifies direction in which the variable x changes * on entering the basis: +1 means increasing, -1 means decreasing. * * The parameter eps is an absolute tolerance (small positive number) * used by the routine to skip small alfa[j] of the row (*). * * The routine determines which basic variable (among specified in * ind[1], ..., ind[len]) should leave the basis in order to keep primal * feasibility. * * RETURNS * * The routine glp_prim_rtest returns the index piv in the arrays ind * and val corresponding to the pivot element chosen, 1 <= piv <= len. * If the adjacent basic solution is primal unbounded and therefore the * choice cannot be made, the routine returns zero. * * COMMENTS * * If the non-basic variable x is presented in the LP problem object, * the column (*) can be computed with the routine glp_eval_tab_col; * otherwise it can be computed with the routine glp_transform_col. */ int glp_prim_rtest(glp_prob *P, int len, const int ind[], const double val[], int dir, double eps) { int k, m, n, piv, t, type, stat; double alfa, big, beta, lb, ub, temp, teta; if (glp_get_prim_stat(P) != GLP_FEAS) xerror("glp_prim_rtest: basic solution is not primal feasible " "\n"); if (!(dir == +1 || dir == -1)) xerror("glp_prim_rtest: dir = %d; invalid parameter\n", dir); if (!(0.0 < eps && eps < 1.0)) xerror("glp_prim_rtest: eps = %g; invalid parameter\n", eps); m = glp_get_num_rows(P); n = glp_get_num_cols(P); /* initial settings */ piv = 0, teta = DBL_MAX, big = 0.0; /* walk through the entries of the specified column */ for (t = 1; t <= len; t++) { /* get the ordinal number of basic variable */ k = ind[t]; if (!(1 <= k && k <= m+n)) xerror("glp_prim_rtest: ind[%d] = %d; variable number out o" "f range\n", t, k); /* determine type, bounds, status and primal value of basic variable xB[i] = x[k] in the current basic solution */ if (k <= m) { type = glp_get_row_type(P, k); lb = glp_get_row_lb(P, k); ub = glp_get_row_ub(P, k); stat = glp_get_row_stat(P, k); beta = glp_get_row_prim(P, k); } else { type = glp_get_col_type(P, k-m); lb = glp_get_col_lb(P, k-m); ub = glp_get_col_ub(P, k-m); stat = glp_get_col_stat(P, k-m); beta = glp_get_col_prim(P, k-m); } if (stat != GLP_BS) xerror("glp_prim_rtest: ind[%d] = %d; non-basic variable no" "t allowed\n", t, k); /* determine influence coefficient at basic variable xB[i] in the explicitly specified column and turn to the case of increasing the variable x in order to simplify the program logic */ alfa = (dir > 0 ? + val[t] : - val[t]); /* analyze main cases */ if (type == GLP_FR) { /* xB[i] is free variable */ continue; } else if (type == GLP_LO) lo: { /* xB[i] has an lower bound */ if (alfa > - eps) continue; temp = (lb - beta) / alfa; } else if (type == GLP_UP) up: { /* xB[i] has an upper bound */ if (alfa < + eps) continue; temp = (ub - beta) / alfa; } else if (type == GLP_DB) { /* xB[i] has both lower and upper bounds */ if (alfa < 0.0) goto lo; else goto up; } else if (type == GLP_FX) { /* xB[i] is fixed variable */ if (- eps < alfa && alfa < + eps) continue; temp = 0.0; } else xassert(type != type); /* if the value of the variable xB[i] violates its lower or upper bound (slightly, because the current basis is assumed to be primal feasible), temp is negative; we can think this happens due to round-off errors and the value is exactly on the bound; this allows replacing temp by zero */ if (temp < 0.0) temp = 0.0; /* apply the minimal ratio test */ if (teta > temp || teta == temp && big < fabs(alfa)) piv = t, teta = temp, big = fabs(alfa); } /* return index of the pivot element chosen */ return piv; } /*********************************************************************** * NAME * * glp_dual_rtest - perform dual ratio test * * SYNOPSIS * * int glp_dual_rtest(glp_prob *P, int len, const int ind[], * const double val[], int dir, double eps); * * DESCRIPTION * * The routine glp_dual_rtest performs the dual ratio test using an * explicitly specified row of the simplex table. * * The current basic solution associated with the LP problem object * must be dual feasible. * * The explicitly specified row of the simplex table is a linear form * that shows how some basic variable x (which is not necessarily * presented in the problem object) depends on non-basic variables xN: * * x = alfa[1] * xN[1] + alfa[2] * xN[2] + ... + alfa[n] * xN[n]. (*) * * The row (*) is specified on entry to the routine using the sparse * format. Ordinal numbers of non-basic variables xN[j] should be placed * in locations ind[1], ..., ind[len], where ordinal numbers 1 to m * denote auxiliary variables, and ordinal numbers m+1 to m+n denote * structural variables. The corresponding non-zero coefficients alfa[j] * should be placed in locations val[1], ..., val[len]. The arrays ind * and val are not changed on exit. * * The parameter dir specifies direction in which the variable x changes * on leaving the basis: +1 means that x goes to its lower bound, and -1 * means that x goes to its upper bound. * * The parameter eps is an absolute tolerance (small positive number) * used by the routine to skip small alfa[j] of the row (*). * * The routine determines which non-basic variable (among specified in * ind[1], ..., ind[len]) should enter the basis in order to keep dual * feasibility. * * RETURNS * * The routine glp_dual_rtest returns the index piv in the arrays ind * and val corresponding to the pivot element chosen, 1 <= piv <= len. * If the adjacent basic solution is dual unbounded and therefore the * choice cannot be made, the routine returns zero. * * COMMENTS * * If the basic variable x is presented in the LP problem object, the * row (*) can be computed with the routine glp_eval_tab_row; otherwise * it can be computed with the routine glp_transform_row. */ int glp_dual_rtest(glp_prob *P, int len, const int ind[], const double val[], int dir, double eps) { int k, m, n, piv, t, stat; double alfa, big, cost, obj, temp, teta; if (glp_get_dual_stat(P) != GLP_FEAS) xerror("glp_dual_rtest: basic solution is not dual feasible\n") ; if (!(dir == +1 || dir == -1)) xerror("glp_dual_rtest: dir = %d; invalid parameter\n", dir); if (!(0.0 < eps && eps < 1.0)) xerror("glp_dual_rtest: eps = %g; invalid parameter\n", eps); m = glp_get_num_rows(P); n = glp_get_num_cols(P); /* take into account optimization direction */ obj = (glp_get_obj_dir(P) == GLP_MIN ? +1.0 : -1.0); /* initial settings */ piv = 0, teta = DBL_MAX, big = 0.0; /* walk through the entries of the specified row */ for (t = 1; t <= len; t++) { /* get ordinal number of non-basic variable */ k = ind[t]; if (!(1 <= k && k <= m+n)) xerror("glp_dual_rtest: ind[%d] = %d; variable number out o" "f range\n", t, k); /* determine status and reduced cost of non-basic variable x[k] = xN[j] in the current basic solution */ if (k <= m) { stat = glp_get_row_stat(P, k); cost = glp_get_row_dual(P, k); } else { stat = glp_get_col_stat(P, k-m); cost = glp_get_col_dual(P, k-m); } if (stat == GLP_BS) xerror("glp_dual_rtest: ind[%d] = %d; basic variable not al" "lowed\n", t, k); /* determine influence coefficient at non-basic variable xN[j] in the explicitly specified row and turn to the case of increasing the variable x in order to simplify the program logic */ alfa = (dir > 0 ? + val[t] : - val[t]); /* analyze main cases */ if (stat == GLP_NL) { /* xN[j] is on its lower bound */ if (alfa < + eps) continue; temp = (obj * cost) / alfa; } else if (stat == GLP_NU) { /* xN[j] is on its upper bound */ if (alfa > - eps) continue; temp = (obj * cost) / alfa; } else if (stat == GLP_NF) { /* xN[j] is non-basic free variable */ if (- eps < alfa && alfa < + eps) continue; temp = 0.0; } else if (stat == GLP_NS) { /* xN[j] is non-basic fixed variable */ continue; } else xassert(stat != stat); /* if the reduced cost of the variable xN[j] violates its zero bound (slightly, because the current basis is assumed to be dual feasible), temp is negative; we can think this happens due to round-off errors and the reduced cost is exact zero; this allows replacing temp by zero */ if (temp < 0.0) temp = 0.0; /* apply the minimal ratio test */ if (teta > temp || teta == temp && big < fabs(alfa)) piv = t, teta = temp, big = fabs(alfa); } /* return index of the pivot element chosen */ return piv; } /*********************************************************************** * NAME * * glp_analyze_row - simulate one iteration of dual simplex method * * SYNOPSIS * * int glp_analyze_row(glp_prob *P, int len, const int ind[], * const double val[], int type, double rhs, double eps, int *piv, * double *x, double *dx, double *y, double *dy, double *dz); * * DESCRIPTION * * Let the current basis be optimal or dual feasible, and there be * specified a row (constraint), which is violated by the current basic * solution. The routine glp_analyze_row simulates one iteration of the * dual simplex method to determine some information on the adjacent * basis (see below), where the specified row becomes active constraint * (i.e. its auxiliary variable becomes non-basic). * * The current basic solution associated with the problem object passed * to the routine must be dual feasible, and its primal components must * be defined. * * The row to be analyzed must be previously transformed either with * the routine glp_eval_tab_row (if the row is in the problem object) * or with the routine glp_transform_row (if the row is external, i.e. * not in the problem object). This is needed to express the row only * through (auxiliary and structural) variables, which are non-basic in * the current basis: * * y = alfa[1] * xN[1] + alfa[2] * xN[2] + ... + alfa[n] * xN[n], * * where y is an auxiliary variable of the row, alfa[j] is an influence * coefficient, xN[j] is a non-basic variable. * * The row is passed to the routine in sparse format. Ordinal numbers * of non-basic variables are stored in locations ind[1], ..., ind[len], * where numbers 1 to m denote auxiliary variables while numbers m+1 to * m+n denote structural variables. Corresponding non-zero coefficients * alfa[j] are stored in locations val[1], ..., val[len]. The arrays * ind and val are ot changed on exit. * * The parameters type and rhs specify the row type and its right-hand * side as follows: * * type = GLP_LO: y = sum alfa[j] * xN[j] >= rhs * * type = GLP_UP: y = sum alfa[j] * xN[j] <= rhs * * The parameter eps is an absolute tolerance (small positive number) * used by the routine to skip small coefficients alfa[j] on performing * the dual ratio test. * * If the operation was successful, the routine stores the following * information to corresponding location (if some parameter is NULL, * its value is not stored): * * piv index in the array ind and val, 1 <= piv <= len, determining * the non-basic variable, which would enter the adjacent basis; * * x value of the non-basic variable in the current basis; * * dx difference between values of the non-basic variable in the * adjacent and current bases, dx = x.new - x.old; * * y value of the row (i.e. of its auxiliary variable) in the * current basis; * * dy difference between values of the row in the adjacent and * current bases, dy = y.new - y.old; * * dz difference between values of the objective function in the * adjacent and current bases, dz = z.new - z.old. Note that in * case of minimization dz >= 0, and in case of maximization * dz <= 0, i.e. in the adjacent basis the objective function * always gets worse (degrades). */ int _glp_analyze_row(glp_prob *P, int len, const int ind[], const double val[], int type, double rhs, double eps, int *_piv, double *_x, double *_dx, double *_y, double *_dy, double *_dz) { int t, k, dir, piv, ret = 0; double x, dx, y, dy, dz; if (P->pbs_stat == GLP_UNDEF) xerror("glp_analyze_row: primal basic solution components are " "undefined\n"); if (P->dbs_stat != GLP_FEAS) xerror("glp_analyze_row: basic solution is not dual feasible\n" ); /* compute the row value y = sum alfa[j] * xN[j] in the current basis */ if (!(0 <= len && len <= P->n)) xerror("glp_analyze_row: len = %d; invalid row length\n", len); y = 0.0; for (t = 1; t <= len; t++) { /* determine value of x[k] = xN[j] in the current basis */ k = ind[t]; if (!(1 <= k && k <= P->m+P->n)) xerror("glp_analyze_row: ind[%d] = %d; row/column index out" " of range\n", t, k); if (k <= P->m) { /* x[k] is auxiliary variable */ if (P->row[k]->stat == GLP_BS) xerror("glp_analyze_row: ind[%d] = %d; basic auxiliary v" "ariable is not allowed\n", t, k); x = P->row[k]->prim; } else { /* x[k] is structural variable */ if (P->col[k-P->m]->stat == GLP_BS) xerror("glp_analyze_row: ind[%d] = %d; basic structural " "variable is not allowed\n", t, k); x = P->col[k-P->m]->prim; } y += val[t] * x; } /* check if the row is primal infeasible in the current basis, i.e. the constraint is violated at the current point */ if (type == GLP_LO) { if (y >= rhs) { /* the constraint is not violated */ ret = 1; goto done; } /* in the adjacent basis y goes to its lower bound */ dir = +1; } else if (type == GLP_UP) { if (y <= rhs) { /* the constraint is not violated */ ret = 1; goto done; } /* in the adjacent basis y goes to its upper bound */ dir = -1; } else xerror("glp_analyze_row: type = %d; invalid parameter\n", type); /* compute dy = y.new - y.old */ dy = rhs - y; /* perform dual ratio test to determine which non-basic variable should enter the adjacent basis to keep it dual feasible */ piv = glp_dual_rtest(P, len, ind, val, dir, eps); if (piv == 0) { /* no dual feasible adjacent basis exists */ ret = 2; goto done; } /* non-basic variable x[k] = xN[j] should enter the basis */ k = ind[piv]; xassert(1 <= k && k <= P->m+P->n); /* determine its value in the current basis */ if (k <= P->m) x = P->row[k]->prim; else x = P->col[k-P->m]->prim; /* compute dx = x.new - x.old = dy / alfa[j] */ xassert(val[piv] != 0.0); dx = dy / val[piv]; /* compute dz = z.new - z.old = d[j] * dx, where d[j] is reduced cost of xN[j] in the current basis */ if (k <= P->m) dz = P->row[k]->dual * dx; else dz = P->col[k-P->m]->dual * dx; /* store the analysis results */ if (_piv != NULL) *_piv = piv; if (_x != NULL) *_x = x; if (_dx != NULL) *_dx = dx; if (_y != NULL) *_y = y; if (_dy != NULL) *_dy = dy; if (_dz != NULL) *_dz = dz; done: return ret; } #if 0 int main(void) { /* example program for the routine glp_analyze_row */ glp_prob *P; glp_smcp parm; int i, k, len, piv, ret, ind[1+100]; double rhs, x, dx, y, dy, dz, val[1+100]; P = glp_create_prob(); /* read plan.mps (see glpk/examples) */ ret = glp_read_mps(P, GLP_MPS_DECK, NULL, "plan.mps"); glp_assert(ret == 0); /* and solve it to optimality */ ret = glp_simplex(P, NULL); glp_assert(ret == 0); glp_assert(glp_get_status(P) == GLP_OPT); /* the optimal objective value is 296.217 */ /* we would like to know what happens if we would add a new row (constraint) to plan.mps: .01 * bin1 + .01 * bin2 + .02 * bin4 + .02 * bin5 <= 12 */ /* first, we specify this new row */ glp_create_index(P); len = 0; ind[++len] = glp_find_col(P, "BIN1"), val[len] = .01; ind[++len] = glp_find_col(P, "BIN2"), val[len] = .01; ind[++len] = glp_find_col(P, "BIN4"), val[len] = .02; ind[++len] = glp_find_col(P, "BIN5"), val[len] = .02; rhs = 12; /* then we can compute value of the row (i.e. of its auxiliary variable) in the current basis to see if the constraint is violated */ y = 0.0; for (k = 1; k <= len; k++) y += val[k] * glp_get_col_prim(P, ind[k]); glp_printf("y = %g\n", y); /* this prints y = 15.1372, so the constraint is violated, since we require that y <= rhs = 12 */ /* now we transform the row to express it only through non-basic (auxiliary and artificial) variables */ len = glp_transform_row(P, len, ind, val); /* finally, we simulate one step of the dual simplex method to obtain necessary information for the adjacent basis */ ret = _glp_analyze_row(P, len, ind, val, GLP_UP, rhs, 1e-9, &piv, &x, &dx, &y, &dy, &dz); glp_assert(ret == 0); glp_printf("k = %d, x = %g; dx = %g; y = %g; dy = %g; dz = %g\n", ind[piv], x, dx, y, dy, dz); /* this prints dz = 5.64418 and means that in the adjacent basis the objective function would be 296.217 + 5.64418 = 301.861 */ /* now we actually include the row into the problem object; note that the arrays ind and val are clobbered, so we need to build them once again */ len = 0; ind[++len] = glp_find_col(P, "BIN1"), val[len] = .01; ind[++len] = glp_find_col(P, "BIN2"), val[len] = .01; ind[++len] = glp_find_col(P, "BIN4"), val[len] = .02; ind[++len] = glp_find_col(P, "BIN5"), val[len] = .02; rhs = 12; i = glp_add_rows(P, 1); glp_set_row_bnds(P, i, GLP_UP, 0, rhs); glp_set_mat_row(P, i, len, ind, val); /* and perform one dual simplex iteration */ glp_init_smcp(&parm); parm.meth = GLP_DUAL; parm.it_lim = 1; glp_simplex(P, &parm); /* the current objective value is 301.861 */ return 0; } #endif /*********************************************************************** * NAME * * glp_analyze_bound - analyze active bound of non-basic variable * * SYNOPSIS * * void glp_analyze_bound(glp_prob *P, int k, double *limit1, int *var1, * double *limit2, int *var2); * * DESCRIPTION * * The routine glp_analyze_bound analyzes the effect of varying the * active bound of specified non-basic variable. * * The non-basic variable is specified by the parameter k, where * 1 <= k <= m means auxiliary variable of corresponding row while * m+1 <= k <= m+n means structural variable (column). * * Note that the current basic solution must be optimal, and the basis * factorization must exist. * * Results of the analysis have the following meaning. * * value1 is the minimal value of the active bound, at which the basis * still remains primal feasible and thus optimal. -DBL_MAX means that * the active bound has no lower limit. * * var1 is the ordinal number of an auxiliary (1 to m) or structural * (m+1 to n) basic variable, which reaches its bound first and thereby * limits further decreasing the active bound being analyzed. * if value1 = -DBL_MAX, var1 is set to 0. * * value2 is the maximal value of the active bound, at which the basis * still remains primal feasible and thus optimal. +DBL_MAX means that * the active bound has no upper limit. * * var2 is the ordinal number of an auxiliary (1 to m) or structural * (m+1 to n) basic variable, which reaches its bound first and thereby * limits further increasing the active bound being analyzed. * if value2 = +DBL_MAX, var2 is set to 0. */ void glp_analyze_bound(glp_prob *P, int k, double *value1, int *var1, double *value2, int *var2) { GLPROW *row; GLPCOL *col; int m, n, stat, kase, p, len, piv, *ind; double x, new_x, ll, uu, xx, delta, *val; #if 0 /* 04/IV-2016 */ /* sanity checks */ if (P == NULL || P->magic != GLP_PROB_MAGIC) xerror("glp_analyze_bound: P = %p; invalid problem object\n", P); #endif m = P->m, n = P->n; if (!(P->pbs_stat == GLP_FEAS && P->dbs_stat == GLP_FEAS)) xerror("glp_analyze_bound: optimal basic solution required\n"); if (!(m == 0 || P->valid)) xerror("glp_analyze_bound: basis factorization required\n"); if (!(1 <= k && k <= m+n)) xerror("glp_analyze_bound: k = %d; variable number out of rang" "e\n", k); /* retrieve information about the specified non-basic variable x[k] whose active bound is to be analyzed */ if (k <= m) { row = P->row[k]; stat = row->stat; x = row->prim; } else { col = P->col[k-m]; stat = col->stat; x = col->prim; } if (stat == GLP_BS) xerror("glp_analyze_bound: k = %d; basic variable not allowed " "\n", k); /* allocate working arrays */ ind = xcalloc(1+m, sizeof(int)); val = xcalloc(1+m, sizeof(double)); /* compute column of the simplex table corresponding to the non-basic variable x[k] */ len = glp_eval_tab_col(P, k, ind, val); xassert(0 <= len && len <= m); /* perform analysis */ for (kase = -1; kase <= +1; kase += 2) { /* kase < 0 means active bound of x[k] is decreasing; kase > 0 means active bound of x[k] is increasing */ /* use the primal ratio test to determine some basic variable x[p] which reaches its bound first */ piv = glp_prim_rtest(P, len, ind, val, kase, 1e-9); if (piv == 0) { /* nothing limits changing the active bound of x[k] */ p = 0; new_x = (kase < 0 ? -DBL_MAX : +DBL_MAX); goto store; } /* basic variable x[p] limits changing the active bound of x[k]; determine its value in the current basis */ xassert(1 <= piv && piv <= len); p = ind[piv]; if (p <= m) { row = P->row[p]; ll = glp_get_row_lb(P, row->i); uu = glp_get_row_ub(P, row->i); stat = row->stat; xx = row->prim; } else { col = P->col[p-m]; ll = glp_get_col_lb(P, col->j); uu = glp_get_col_ub(P, col->j); stat = col->stat; xx = col->prim; } xassert(stat == GLP_BS); /* determine delta x[p] = bound of x[p] - value of x[p] */ if (kase < 0 && val[piv] > 0.0 || kase > 0 && val[piv] < 0.0) { /* delta x[p] < 0, so x[p] goes toward its lower bound */ xassert(ll != -DBL_MAX); delta = ll - xx; } else { /* delta x[p] > 0, so x[p] goes toward its upper bound */ xassert(uu != +DBL_MAX); delta = uu - xx; } /* delta x[p] = alfa[p,k] * delta x[k], so new x[k] = x[k] + delta x[k] = x[k] + delta x[p] / alfa[p,k] is the value of x[k] in the adjacent basis */ xassert(val[piv] != 0.0); new_x = x + delta / val[piv]; store: /* store analysis results */ if (kase < 0) { if (value1 != NULL) *value1 = new_x; if (var1 != NULL) *var1 = p; } else { if (value2 != NULL) *value2 = new_x; if (var2 != NULL) *var2 = p; } } /* free working arrays */ xfree(ind); xfree(val); return; } /*********************************************************************** * NAME * * glp_analyze_coef - analyze objective coefficient at basic variable * * SYNOPSIS * * void glp_analyze_coef(glp_prob *P, int k, double *coef1, int *var1, * double *value1, double *coef2, int *var2, double *value2); * * DESCRIPTION * * The routine glp_analyze_coef analyzes the effect of varying the * objective coefficient at specified basic variable. * * The basic variable is specified by the parameter k, where * 1 <= k <= m means auxiliary variable of corresponding row while * m+1 <= k <= m+n means structural variable (column). * * Note that the current basic solution must be optimal, and the basis * factorization must exist. * * Results of the analysis have the following meaning. * * coef1 is the minimal value of the objective coefficient, at which * the basis still remains dual feasible and thus optimal. -DBL_MAX * means that the objective coefficient has no lower limit. * * var1 is the ordinal number of an auxiliary (1 to m) or structural * (m+1 to n) non-basic variable, whose reduced cost reaches its zero * bound first and thereby limits further decreasing the objective * coefficient being analyzed. If coef1 = -DBL_MAX, var1 is set to 0. * * value1 is value of the basic variable being analyzed in an adjacent * basis, which is defined as follows. Let the objective coefficient * reaches its minimal value (coef1) and continues decreasing. Then the * reduced cost of the limiting non-basic variable (var1) becomes dual * infeasible and the current basis becomes non-optimal that forces the * limiting non-basic variable to enter the basis replacing there some * basic variable that leaves the basis to keep primal feasibility. * Should note that on determining the adjacent basis current bounds * of the basic variable being analyzed are ignored as if it were free * (unbounded) variable, so it cannot leave the basis. It may happen * that no dual feasible adjacent basis exists, in which case value1 is * set to -DBL_MAX or +DBL_MAX. * * coef2 is the maximal value of the objective coefficient, at which * the basis still remains dual feasible and thus optimal. +DBL_MAX * means that the objective coefficient has no upper limit. * * var2 is the ordinal number of an auxiliary (1 to m) or structural * (m+1 to n) non-basic variable, whose reduced cost reaches its zero * bound first and thereby limits further increasing the objective * coefficient being analyzed. If coef2 = +DBL_MAX, var2 is set to 0. * * value2 is value of the basic variable being analyzed in an adjacent * basis, which is defined exactly in the same way as value1 above with * exception that now the objective coefficient is increasing. */ void glp_analyze_coef(glp_prob *P, int k, double *coef1, int *var1, double *value1, double *coef2, int *var2, double *value2) { GLPROW *row; GLPCOL *col; int m, n, type, stat, kase, p, q, dir, clen, cpiv, rlen, rpiv, *cind, *rind; double lb, ub, coef, x, lim_coef, new_x, d, delta, ll, uu, xx, *rval, *cval; #if 0 /* 04/IV-2016 */ /* sanity checks */ if (P == NULL || P->magic != GLP_PROB_MAGIC) xerror("glp_analyze_coef: P = %p; invalid problem object\n", P); #endif m = P->m, n = P->n; if (!(P->pbs_stat == GLP_FEAS && P->dbs_stat == GLP_FEAS)) xerror("glp_analyze_coef: optimal basic solution required\n"); if (!(m == 0 || P->valid)) xerror("glp_analyze_coef: basis factorization required\n"); if (!(1 <= k && k <= m+n)) xerror("glp_analyze_coef: k = %d; variable number out of range" "\n", k); /* retrieve information about the specified basic variable x[k] whose objective coefficient c[k] is to be analyzed */ if (k <= m) { row = P->row[k]; type = row->type; lb = row->lb; ub = row->ub; coef = 0.0; stat = row->stat; x = row->prim; } else { col = P->col[k-m]; type = col->type; lb = col->lb; ub = col->ub; coef = col->coef; stat = col->stat; x = col->prim; } if (stat != GLP_BS) xerror("glp_analyze_coef: k = %d; non-basic variable not allow" "ed\n", k); /* allocate working arrays */ cind = xcalloc(1+m, sizeof(int)); cval = xcalloc(1+m, sizeof(double)); rind = xcalloc(1+n, sizeof(int)); rval = xcalloc(1+n, sizeof(double)); /* compute row of the simplex table corresponding to the basic variable x[k] */ rlen = glp_eval_tab_row(P, k, rind, rval); xassert(0 <= rlen && rlen <= n); /* perform analysis */ for (kase = -1; kase <= +1; kase += 2) { /* kase < 0 means objective coefficient c[k] is decreasing; kase > 0 means objective coefficient c[k] is increasing */ /* note that decreasing c[k] is equivalent to increasing dual variable lambda[k] and vice versa; we need to correctly set the dir flag as required by the routine glp_dual_rtest */ if (P->dir == GLP_MIN) dir = - kase; else if (P->dir == GLP_MAX) dir = + kase; else xassert(P != P); /* use the dual ratio test to determine non-basic variable x[q] whose reduced cost d[q] reaches zero bound first */ rpiv = glp_dual_rtest(P, rlen, rind, rval, dir, 1e-9); if (rpiv == 0) { /* nothing limits changing c[k] */ lim_coef = (kase < 0 ? -DBL_MAX : +DBL_MAX); q = 0; /* x[k] keeps its current value */ new_x = x; goto store; } /* non-basic variable x[q] limits changing coefficient c[k]; determine its status and reduced cost d[k] in the current basis */ xassert(1 <= rpiv && rpiv <= rlen); q = rind[rpiv]; xassert(1 <= q && q <= m+n); if (q <= m) { row = P->row[q]; stat = row->stat; d = row->dual; } else { col = P->col[q-m]; stat = col->stat; d = col->dual; } /* note that delta d[q] = new d[q] - d[q] = - d[q], because new d[q] = 0; delta d[q] = alfa[k,q] * delta c[k], so delta c[k] = delta d[q] / alfa[k,q] = - d[q] / alfa[k,q] */ xassert(rval[rpiv] != 0.0); delta = - d / rval[rpiv]; /* compute new c[k] = c[k] + delta c[k], which is the limiting value of the objective coefficient c[k] */ lim_coef = coef + delta; /* let c[k] continue decreasing/increasing that makes d[q] dual infeasible and forces x[q] to enter the basis; to perform the primal ratio test we need to know in which direction x[q] changes on entering the basis; we determine that analyzing the sign of delta d[q] (see above), since d[q] may be close to zero having wrong sign */ /* let, for simplicity, the problem is minimization */ if (kase < 0 && rval[rpiv] > 0.0 || kase > 0 && rval[rpiv] < 0.0) { /* delta d[q] < 0, so d[q] being non-negative will become negative, so x[q] will increase */ dir = +1; } else { /* delta d[q] > 0, so d[q] being non-positive will become positive, so x[q] will decrease */ dir = -1; } /* if the problem is maximization, correct the direction */ if (P->dir == GLP_MAX) dir = - dir; /* check that we didn't make a silly mistake */ if (dir > 0) xassert(stat == GLP_NL || stat == GLP_NF); else xassert(stat == GLP_NU || stat == GLP_NF); /* compute column of the simplex table corresponding to the non-basic variable x[q] */ clen = glp_eval_tab_col(P, q, cind, cval); /* make x[k] temporarily free (unbounded) */ if (k <= m) { row = P->row[k]; row->type = GLP_FR; row->lb = row->ub = 0.0; } else { col = P->col[k-m]; col->type = GLP_FR; col->lb = col->ub = 0.0; } /* use the primal ratio test to determine some basic variable which leaves the basis */ cpiv = glp_prim_rtest(P, clen, cind, cval, dir, 1e-9); /* restore original bounds of the basic variable x[k] */ if (k <= m) { row = P->row[k]; row->type = type; row->lb = lb, row->ub = ub; } else { col = P->col[k-m]; col->type = type; col->lb = lb, col->ub = ub; } if (cpiv == 0) { /* non-basic variable x[q] can change unlimitedly */ if (dir < 0 && rval[rpiv] > 0.0 || dir > 0 && rval[rpiv] < 0.0) { /* delta x[k] = alfa[k,q] * delta x[q] < 0 */ new_x = -DBL_MAX; } else { /* delta x[k] = alfa[k,q] * delta x[q] > 0 */ new_x = +DBL_MAX; } goto store; } /* some basic variable x[p] limits changing non-basic variable x[q] in the adjacent basis */ xassert(1 <= cpiv && cpiv <= clen); p = cind[cpiv]; xassert(1 <= p && p <= m+n); xassert(p != k); if (p <= m) { row = P->row[p]; xassert(row->stat == GLP_BS); ll = glp_get_row_lb(P, row->i); uu = glp_get_row_ub(P, row->i); xx = row->prim; } else { col = P->col[p-m]; xassert(col->stat == GLP_BS); ll = glp_get_col_lb(P, col->j); uu = glp_get_col_ub(P, col->j); xx = col->prim; } /* determine delta x[p] = new x[p] - x[p] */ if (dir < 0 && cval[cpiv] > 0.0 || dir > 0 && cval[cpiv] < 0.0) { /* delta x[p] < 0, so x[p] goes toward its lower bound */ xassert(ll != -DBL_MAX); delta = ll - xx; } else { /* delta x[p] > 0, so x[p] goes toward its upper bound */ xassert(uu != +DBL_MAX); delta = uu - xx; } /* compute new x[k] = x[k] + alfa[k,q] * delta x[q], where delta x[q] = delta x[p] / alfa[p,q] */ xassert(cval[cpiv] != 0.0); new_x = x + (rval[rpiv] / cval[cpiv]) * delta; store: /* store analysis results */ if (kase < 0) { if (coef1 != NULL) *coef1 = lim_coef; if (var1 != NULL) *var1 = q; if (value1 != NULL) *value1 = new_x; } else { if (coef2 != NULL) *coef2 = lim_coef; if (var2 != NULL) *var2 = q; if (value2 != NULL) *value2 = new_x; } } /* free working arrays */ xfree(cind); xfree(cval); xfree(rind); xfree(rval); return; } /* eof */ glpk-5.0/src/draft/glpapi13.c0000644000062000006210000005447713766346220015176 0ustar maomkpasswd/* glpapi13.c (branch-and-bound interface routines) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2000-2018 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "ios.h" /*********************************************************************** * NAME * * glp_ios_reason - determine reason for calling the callback routine * * SYNOPSIS * * glp_ios_reason(glp_tree *tree); * * RETURNS * * The routine glp_ios_reason returns a code, which indicates why the * user-defined callback routine is being called. */ int glp_ios_reason(glp_tree *tree) { return tree->reason; } /*********************************************************************** * NAME * * glp_ios_get_prob - access the problem object * * SYNOPSIS * * glp_prob *glp_ios_get_prob(glp_tree *tree); * * DESCRIPTION * * The routine glp_ios_get_prob can be called from the user-defined * callback routine to access the problem object, which is used by the * MIP solver. It is the original problem object passed to the routine * glp_intopt if the MIP presolver is not used; otherwise it is an * internal problem object built by the presolver. If the current * subproblem exists, LP segment of the problem object corresponds to * its LP relaxation. * * RETURNS * * The routine glp_ios_get_prob returns a pointer to the problem object * used by the MIP solver. */ glp_prob *glp_ios_get_prob(glp_tree *tree) { return tree->mip; } /*********************************************************************** * NAME * * glp_ios_tree_size - determine size of the branch-and-bound tree * * SYNOPSIS * * void glp_ios_tree_size(glp_tree *tree, int *a_cnt, int *n_cnt, * int *t_cnt); * * DESCRIPTION * * The routine glp_ios_tree_size stores the following three counts which * characterize the current size of the branch-and-bound tree: * * a_cnt is the current number of active nodes, i.e. the current size of * the active list; * * n_cnt is the current number of all (active and inactive) nodes; * * t_cnt is the total number of nodes including those which have been * already removed from the tree. This count is increased whenever * a new node appears in the tree and never decreased. * * If some of the parameters a_cnt, n_cnt, t_cnt is a null pointer, the * corresponding count is not stored. */ void glp_ios_tree_size(glp_tree *tree, int *a_cnt, int *n_cnt, int *t_cnt) { if (a_cnt != NULL) *a_cnt = tree->a_cnt; if (n_cnt != NULL) *n_cnt = tree->n_cnt; if (t_cnt != NULL) *t_cnt = tree->t_cnt; return; } /*********************************************************************** * NAME * * glp_ios_curr_node - determine current active subproblem * * SYNOPSIS * * int glp_ios_curr_node(glp_tree *tree); * * RETURNS * * The routine glp_ios_curr_node returns the reference number of the * current active subproblem. However, if the current subproblem does * not exist, the routine returns zero. */ int glp_ios_curr_node(glp_tree *tree) { IOSNPD *node; /* obtain pointer to the current subproblem */ node = tree->curr; /* return its reference number */ return node == NULL ? 0 : node->p; } /*********************************************************************** * NAME * * glp_ios_next_node - determine next active subproblem * * SYNOPSIS * * int glp_ios_next_node(glp_tree *tree, int p); * * RETURNS * * If the parameter p is zero, the routine glp_ios_next_node returns * the reference number of the first active subproblem. However, if the * tree is empty, zero is returned. * * If the parameter p is not zero, it must specify the reference number * of some active subproblem, in which case the routine returns the * reference number of the next active subproblem. However, if there is * no next active subproblem in the list, zero is returned. * * All subproblems in the active list are ordered chronologically, i.e. * subproblem A precedes subproblem B if A was created before B. */ int glp_ios_next_node(glp_tree *tree, int p) { IOSNPD *node; if (p == 0) { /* obtain pointer to the first active subproblem */ node = tree->head; } else { /* obtain pointer to the specified subproblem */ if (!(1 <= p && p <= tree->nslots)) err: xerror("glp_ios_next_node: p = %d; invalid subproblem refer" "ence number\n", p); node = tree->slot[p].node; if (node == NULL) goto err; /* the specified subproblem must be active */ if (node->count != 0) xerror("glp_ios_next_node: p = %d; subproblem not in the ac" "tive list\n", p); /* obtain pointer to the next active subproblem */ node = node->next; } /* return the reference number */ return node == NULL ? 0 : node->p; } /*********************************************************************** * NAME * * glp_ios_prev_node - determine previous active subproblem * * SYNOPSIS * * int glp_ios_prev_node(glp_tree *tree, int p); * * RETURNS * * If the parameter p is zero, the routine glp_ios_prev_node returns * the reference number of the last active subproblem. However, if the * tree is empty, zero is returned. * * If the parameter p is not zero, it must specify the reference number * of some active subproblem, in which case the routine returns the * reference number of the previous active subproblem. However, if there * is no previous active subproblem in the list, zero is returned. * * All subproblems in the active list are ordered chronologically, i.e. * subproblem A precedes subproblem B if A was created before B. */ int glp_ios_prev_node(glp_tree *tree, int p) { IOSNPD *node; if (p == 0) { /* obtain pointer to the last active subproblem */ node = tree->tail; } else { /* obtain pointer to the specified subproblem */ if (!(1 <= p && p <= tree->nslots)) err: xerror("glp_ios_prev_node: p = %d; invalid subproblem refer" "ence number\n", p); node = tree->slot[p].node; if (node == NULL) goto err; /* the specified subproblem must be active */ if (node->count != 0) xerror("glp_ios_prev_node: p = %d; subproblem not in the ac" "tive list\n", p); /* obtain pointer to the previous active subproblem */ node = node->prev; } /* return the reference number */ return node == NULL ? 0 : node->p; } /*********************************************************************** * NAME * * glp_ios_up_node - determine parent subproblem * * SYNOPSIS * * int glp_ios_up_node(glp_tree *tree, int p); * * RETURNS * * The parameter p must specify the reference number of some (active or * inactive) subproblem, in which case the routine iet_get_up_node * returns the reference number of its parent subproblem. However, if * the specified subproblem is the root of the tree and, therefore, has * no parent, the routine returns zero. */ int glp_ios_up_node(glp_tree *tree, int p) { IOSNPD *node; /* obtain pointer to the specified subproblem */ if (!(1 <= p && p <= tree->nslots)) err: xerror("glp_ios_up_node: p = %d; invalid subproblem reference " "number\n", p); node = tree->slot[p].node; if (node == NULL) goto err; /* obtain pointer to the parent subproblem */ node = node->up; /* return the reference number */ return node == NULL ? 0 : node->p; } /*********************************************************************** * NAME * * glp_ios_node_level - determine subproblem level * * SYNOPSIS * * int glp_ios_node_level(glp_tree *tree, int p); * * RETURNS * * The routine glp_ios_node_level returns the level of the subproblem, * whose reference number is p, in the branch-and-bound tree. (The root * subproblem has level 0, and the level of any other subproblem is the * level of its parent plus one.) */ int glp_ios_node_level(glp_tree *tree, int p) { IOSNPD *node; /* obtain pointer to the specified subproblem */ if (!(1 <= p && p <= tree->nslots)) err: xerror("glp_ios_node_level: p = %d; invalid subproblem referen" "ce number\n", p); node = tree->slot[p].node; if (node == NULL) goto err; /* return the node level */ return node->level; } /*********************************************************************** * NAME * * glp_ios_node_bound - determine subproblem local bound * * SYNOPSIS * * double glp_ios_node_bound(glp_tree *tree, int p); * * RETURNS * * The routine glp_ios_node_bound returns the local bound for (active or * inactive) subproblem, whose reference number is p. * * COMMENTS * * The local bound for subproblem p is an lower (minimization) or upper * (maximization) bound for integer optimal solution to this subproblem * (not to the original problem). This bound is local in the sense that * only subproblems in the subtree rooted at node p cannot have better * integer feasible solutions. * * On creating a subproblem (due to the branching step) its local bound * is inherited from its parent and then may get only stronger (never * weaker). For the root subproblem its local bound is initially set to * -DBL_MAX (minimization) or +DBL_MAX (maximization) and then improved * as the root LP relaxation has been solved. * * Note that the local bound is not necessarily the optimal objective * value to corresponding LP relaxation; it may be stronger. */ double glp_ios_node_bound(glp_tree *tree, int p) { IOSNPD *node; /* obtain pointer to the specified subproblem */ if (!(1 <= p && p <= tree->nslots)) err: xerror("glp_ios_node_bound: p = %d; invalid subproblem referen" "ce number\n", p); node = tree->slot[p].node; if (node == NULL) goto err; /* return the node local bound */ return node->bound; } /*********************************************************************** * NAME * * glp_ios_best_node - find active subproblem with best local bound * * SYNOPSIS * * int glp_ios_best_node(glp_tree *tree); * * RETURNS * * The routine glp_ios_best_node returns the reference number of the * active subproblem, whose local bound is best (i.e. smallest in case * of minimization or largest in case of maximization). However, if the * tree is empty, the routine returns zero. * * COMMENTS * * The best local bound is an lower (minimization) or upper * (maximization) bound for integer optimal solution to the original * MIP problem. */ int glp_ios_best_node(glp_tree *tree) { return ios_best_node(tree); } /*********************************************************************** * NAME * * glp_ios_mip_gap - compute relative MIP gap * * SYNOPSIS * * double glp_ios_mip_gap(glp_tree *tree); * * DESCRIPTION * * The routine glp_ios_mip_gap computes the relative MIP gap with the * following formula: * * gap = |best_mip - best_bnd| / (|best_mip| + DBL_EPSILON), * * where best_mip is the best integer feasible solution found so far, * best_bnd is the best (global) bound. If no integer feasible solution * has been found yet, gap is set to DBL_MAX. * * RETURNS * * The routine glp_ios_mip_gap returns the relative MIP gap. */ double glp_ios_mip_gap(glp_tree *tree) { return ios_relative_gap(tree); } /*********************************************************************** * NAME * * glp_ios_node_data - access subproblem application-specific data * * SYNOPSIS * * void *glp_ios_node_data(glp_tree *tree, int p); * * DESCRIPTION * * The routine glp_ios_node_data allows the application accessing a * memory block allocated for the subproblem (which may be active or * inactive), whose reference number is p. * * The size of the block is defined by the control parameter cb_size * passed to the routine glp_intopt. The block is initialized by binary * zeros on creating corresponding subproblem, and its contents is kept * until the subproblem will be removed from the tree. * * The application may use these memory blocks to store specific data * for each subproblem. * * RETURNS * * The routine glp_ios_node_data returns a pointer to the memory block * for the specified subproblem. Note that if cb_size = 0, the routine * returns a null pointer. */ void *glp_ios_node_data(glp_tree *tree, int p) { IOSNPD *node; /* obtain pointer to the specified subproblem */ if (!(1 <= p && p <= tree->nslots)) err: xerror("glp_ios_node_level: p = %d; invalid subproblem referen" "ce number\n", p); node = tree->slot[p].node; if (node == NULL) goto err; /* return pointer to the application-specific data */ return node->data; } /*********************************************************************** * NAME * * glp_ios_row_attr - retrieve additional row attributes * * SYNOPSIS * * void glp_ios_row_attr(glp_tree *tree, int i, glp_attr *attr); * * DESCRIPTION * * The routine glp_ios_row_attr retrieves additional attributes of row * i and stores them in the structure glp_attr. */ void glp_ios_row_attr(glp_tree *tree, int i, glp_attr *attr) { GLPROW *row; if (!(1 <= i && i <= tree->mip->m)) xerror("glp_ios_row_attr: i = %d; row number out of range\n", i); row = tree->mip->row[i]; attr->level = row->level; attr->origin = row->origin; attr->klass = row->klass; return; } /**********************************************************************/ int glp_ios_pool_size(glp_tree *tree) { /* determine current size of the cut pool */ if (tree->reason != GLP_ICUTGEN) xerror("glp_ios_pool_size: operation not allowed\n"); xassert(tree->local != NULL); #ifdef NEW_LOCAL /* 02/II-2018 */ return tree->local->m; #else return tree->local->size; #endif } /**********************************************************************/ int glp_ios_add_row(glp_tree *tree, const char *name, int klass, int flags, int len, const int ind[], const double val[], int type, double rhs) { /* add row (constraint) to the cut pool */ int num; if (tree->reason != GLP_ICUTGEN) xerror("glp_ios_add_row: operation not allowed\n"); xassert(tree->local != NULL); num = ios_add_row(tree, tree->local, name, klass, flags, len, ind, val, type, rhs); return num; } /**********************************************************************/ void glp_ios_del_row(glp_tree *tree, int i) { /* remove row (constraint) from the cut pool */ if (tree->reason != GLP_ICUTGEN) xerror("glp_ios_del_row: operation not allowed\n"); ios_del_row(tree, tree->local, i); return; } /**********************************************************************/ void glp_ios_clear_pool(glp_tree *tree) { /* remove all rows (constraints) from the cut pool */ if (tree->reason != GLP_ICUTGEN) xerror("glp_ios_clear_pool: operation not allowed\n"); ios_clear_pool(tree, tree->local); return; } /*********************************************************************** * NAME * * glp_ios_can_branch - check if can branch upon specified variable * * SYNOPSIS * * int glp_ios_can_branch(glp_tree *tree, int j); * * RETURNS * * If j-th variable (column) can be used to branch upon, the routine * glp_ios_can_branch returns non-zero, otherwise zero. */ int glp_ios_can_branch(glp_tree *tree, int j) { if (!(1 <= j && j <= tree->mip->n)) xerror("glp_ios_can_branch: j = %d; column number out of range" "\n", j); return tree->non_int[j]; } /*********************************************************************** * NAME * * glp_ios_branch_upon - choose variable to branch upon * * SYNOPSIS * * void glp_ios_branch_upon(glp_tree *tree, int j, int sel); * * DESCRIPTION * * The routine glp_ios_branch_upon can be called from the user-defined * callback routine in response to the reason GLP_IBRANCH to choose a * branching variable, whose ordinal number is j. Should note that only * variables, for which the routine glp_ios_can_branch returns non-zero, * can be used to branch upon. * * The parameter sel is a flag that indicates which branch (subproblem) * should be selected next to continue the search: * * GLP_DN_BRNCH - select down-branch; * GLP_UP_BRNCH - select up-branch; * GLP_NO_BRNCH - use general selection technique. */ void glp_ios_branch_upon(glp_tree *tree, int j, int sel) { if (!(1 <= j && j <= tree->mip->n)) xerror("glp_ios_branch_upon: j = %d; column number out of rang" "e\n", j); if (!(sel == GLP_DN_BRNCH || sel == GLP_UP_BRNCH || sel == GLP_NO_BRNCH)) xerror("glp_ios_branch_upon: sel = %d: invalid branch selectio" "n flag\n", sel); if (!(tree->non_int[j])) xerror("glp_ios_branch_upon: j = %d; variable cannot be used t" "o branch upon\n", j); if (tree->br_var != 0) xerror("glp_ios_branch_upon: branching variable already chosen" "\n"); tree->br_var = j; tree->br_sel = sel; return; } /*********************************************************************** * NAME * * glp_ios_select_node - select subproblem to continue the search * * SYNOPSIS * * void glp_ios_select_node(glp_tree *tree, int p); * * DESCRIPTION * * The routine glp_ios_select_node can be called from the user-defined * callback routine in response to the reason GLP_ISELECT to select an * active subproblem, whose reference number is p. The search will be * continued from the subproblem selected. */ void glp_ios_select_node(glp_tree *tree, int p) { IOSNPD *node; /* obtain pointer to the specified subproblem */ if (!(1 <= p && p <= tree->nslots)) err: xerror("glp_ios_select_node: p = %d; invalid subproblem refere" "nce number\n", p); node = tree->slot[p].node; if (node == NULL) goto err; /* the specified subproblem must be active */ if (node->count != 0) xerror("glp_ios_select_node: p = %d; subproblem not in the act" "ive list\n", p); /* no subproblem must be selected yet */ if (tree->next_p != 0) xerror("glp_ios_select_node: subproblem already selected\n"); /* select the specified subproblem to continue the search */ tree->next_p = p; return; } /*********************************************************************** * NAME * * glp_ios_heur_sol - provide solution found by heuristic * * SYNOPSIS * * int glp_ios_heur_sol(glp_tree *tree, const double x[]); * * DESCRIPTION * * The routine glp_ios_heur_sol can be called from the user-defined * callback routine in response to the reason GLP_IHEUR to provide an * integer feasible solution found by a primal heuristic. * * Primal values of *all* variables (columns) found by the heuristic * should be placed in locations x[1], ..., x[n], where n is the number * of columns in the original problem object. Note that the routine * glp_ios_heur_sol *does not* check primal feasibility of the solution * provided. * * Using the solution passed in the array x the routine computes value * of the objective function. If the objective value is better than the * best known integer feasible solution, the routine computes values of * auxiliary variables (rows) and stores all solution components in the * problem object. * * RETURNS * * If the provided solution is accepted, the routine glp_ios_heur_sol * returns zero. Otherwise, if the provided solution is rejected, the * routine returns non-zero. */ int glp_ios_heur_sol(glp_tree *tree, const double x[]) { glp_prob *mip = tree->mip; int m = tree->orig_m; int n = tree->n; int i, j; double obj; xassert(mip->m >= m); xassert(mip->n == n); /* check values of integer variables and compute value of the objective function */ obj = mip->c0; for (j = 1; j <= n; j++) { GLPCOL *col = mip->col[j]; if (col->kind == GLP_IV) { /* provided value must be integral */ if (x[j] != floor(x[j])) return 1; } obj += col->coef * x[j]; } /* check if the provided solution is better than the best known integer feasible solution */ if (mip->mip_stat == GLP_FEAS) { switch (mip->dir) { case GLP_MIN: if (obj >= tree->mip->mip_obj) return 1; break; case GLP_MAX: if (obj <= tree->mip->mip_obj) return 1; break; default: xassert(mip != mip); } } /* it is better; store it in the problem object */ if (tree->parm->msg_lev >= GLP_MSG_ON) xprintf("Solution found by heuristic: %.12g\n", obj); mip->mip_stat = GLP_FEAS; mip->mip_obj = obj; for (j = 1; j <= n; j++) mip->col[j]->mipx = x[j]; for (i = 1; i <= m; i++) { GLPROW *row = mip->row[i]; GLPAIJ *aij; row->mipx = 0.0; for (aij = row->ptr; aij != NULL; aij = aij->r_next) row->mipx += aij->val * aij->col->mipx; } #if 1 /* 11/VII-2013 */ ios_process_sol(tree); #endif return 0; } /*********************************************************************** * NAME * * glp_ios_terminate - terminate the solution process. * * SYNOPSIS * * void glp_ios_terminate(glp_tree *tree); * * DESCRIPTION * * The routine glp_ios_terminate sets a flag indicating that the MIP * solver should prematurely terminate the search. */ void glp_ios_terminate(glp_tree *tree) { if (tree->parm->msg_lev >= GLP_MSG_DBG) xprintf("The search is prematurely terminated due to applicati" "on request\n"); tree->stop = 1; return; } /* eof */ glpk-5.0/src/draft/glpios01.c0000644000062000006210000015333013766346220015200 0ustar maomkpasswd/* glpios01.c */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2003-2018 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "ios.h" #include "misc.h" static int lpx_eval_tab_row(glp_prob *lp, int k, int ind[], double val[]) { /* compute row of the simplex tableau */ return glp_eval_tab_row(lp, k, ind, val); } static int lpx_dual_ratio_test(glp_prob *lp, int len, const int ind[], const double val[], int how, double tol) { /* perform dual ratio test */ int piv; piv = glp_dual_rtest(lp, len, ind, val, how, tol); xassert(0 <= piv && piv <= len); return piv == 0 ? 0 : ind[piv]; } /*********************************************************************** * NAME * * ios_create_tree - create branch-and-bound tree * * SYNOPSIS * * #include "glpios.h" * glp_tree *ios_create_tree(glp_prob *mip, const glp_iocp *parm); * * DESCRIPTION * * The routine ios_create_tree creates the branch-and-bound tree. * * Being created the tree consists of the only root subproblem whose * reference number is 1. Note that initially the root subproblem is in * frozen state and therefore needs to be revived. * * RETURNS * * The routine returns a pointer to the tree created. */ static IOSNPD *new_node(glp_tree *tree, IOSNPD *parent); glp_tree *ios_create_tree(glp_prob *mip, const glp_iocp *parm) { int m = mip->m; int n = mip->n; glp_tree *tree; int i, j; xassert(mip->tree == NULL); mip->tree = tree = xmalloc(sizeof(glp_tree)); tree->pool = dmp_create_pool(); tree->n = n; /* save original problem components */ tree->orig_m = m; tree->orig_type = xcalloc(1+m+n, sizeof(char)); tree->orig_lb = xcalloc(1+m+n, sizeof(double)); tree->orig_ub = xcalloc(1+m+n, sizeof(double)); tree->orig_stat = xcalloc(1+m+n, sizeof(char)); tree->orig_prim = xcalloc(1+m+n, sizeof(double)); tree->orig_dual = xcalloc(1+m+n, sizeof(double)); for (i = 1; i <= m; i++) { GLPROW *row = mip->row[i]; tree->orig_type[i] = (char)row->type; tree->orig_lb[i] = row->lb; tree->orig_ub[i] = row->ub; tree->orig_stat[i] = (char)row->stat; tree->orig_prim[i] = row->prim; tree->orig_dual[i] = row->dual; } for (j = 1; j <= n; j++) { GLPCOL *col = mip->col[j]; tree->orig_type[m+j] = (char)col->type; tree->orig_lb[m+j] = col->lb; tree->orig_ub[m+j] = col->ub; tree->orig_stat[m+j] = (char)col->stat; tree->orig_prim[m+j] = col->prim; tree->orig_dual[m+j] = col->dual; } tree->orig_obj = mip->obj_val; /* initialize the branch-and-bound tree */ tree->nslots = 0; tree->avail = 0; tree->slot = NULL; tree->head = tree->tail = NULL; tree->a_cnt = tree->n_cnt = tree->t_cnt = 0; /* the root subproblem is not solved yet, so its final components are unknown so far */ tree->root_m = 0; tree->root_type = NULL; tree->root_lb = tree->root_ub = NULL; tree->root_stat = NULL; /* the current subproblem does not exist yet */ tree->curr = NULL; tree->mip = mip; /*tree->solved = 0;*/ tree->non_int = xcalloc(1+n, sizeof(char)); memset(&tree->non_int[1], 0, n); /* arrays to save parent subproblem components will be allocated later */ tree->pred_m = tree->pred_max = 0; tree->pred_type = NULL; tree->pred_lb = tree->pred_ub = NULL; tree->pred_stat = NULL; /* cut generators */ tree->local = ios_create_pool(tree); /*tree->first_attempt = 1;*/ /*tree->max_added_cuts = 0;*/ /*tree->min_eff = 0.0;*/ /*tree->miss = 0;*/ /*tree->just_selected = 0;*/ #ifdef NEW_COVER /* 13/II-2018 */ tree->cov_gen = NULL; #endif tree->mir_gen = NULL; tree->clq_gen = NULL; /*tree->round = 0;*/ #if 0 /* create the conflict graph */ tree->n_ref = xcalloc(1+n, sizeof(int)); memset(&tree->n_ref[1], 0, n * sizeof(int)); tree->c_ref = xcalloc(1+n, sizeof(int)); memset(&tree->c_ref[1], 0, n * sizeof(int)); tree->g = scg_create_graph(0); tree->j_ref = xcalloc(1+tree->g->n_max, sizeof(int)); #endif /* pseudocost branching */ tree->pcost = NULL; tree->iwrk = xcalloc(1+n, sizeof(int)); tree->dwrk = xcalloc(1+n, sizeof(double)); /* initialize control parameters */ tree->parm = parm; tree->tm_beg = xtime(); #if 0 /* 10/VI-2013 */ tree->tm_lag = xlset(0); #else tree->tm_lag = 0.0; #endif tree->sol_cnt = 0; #if 1 /* 11/VII-2013 */ tree->P = NULL; tree->npp = NULL; tree->save_sol = parm->save_sol; tree->save_cnt = 0; #endif /* initialize advanced solver interface */ tree->reason = 0; tree->reopt = 0; tree->reinv = 0; tree->br_var = 0; tree->br_sel = 0; tree->child = 0; tree->next_p = 0; /*tree->btrack = NULL;*/ tree->stop = 0; /* create the root subproblem, which initially is identical to the original MIP */ new_node(tree, NULL); return tree; } /*********************************************************************** * NAME * * ios_revive_node - revive specified subproblem * * SYNOPSIS * * #include "glpios.h" * void ios_revive_node(glp_tree *tree, int p); * * DESCRIPTION * * The routine ios_revive_node revives the specified subproblem, whose * reference number is p, and thereby makes it the current subproblem. * Note that the specified subproblem must be active. Besides, if the * current subproblem already exists, it must be frozen before reviving * another subproblem. */ void ios_revive_node(glp_tree *tree, int p) { glp_prob *mip = tree->mip; IOSNPD *node, *root; /* obtain pointer to the specified subproblem */ xassert(1 <= p && p <= tree->nslots); node = tree->slot[p].node; xassert(node != NULL); /* the specified subproblem must be active */ xassert(node->count == 0); /* the current subproblem must not exist */ xassert(tree->curr == NULL); /* the specified subproblem becomes current */ tree->curr = node; /*tree->solved = 0;*/ /* obtain pointer to the root subproblem */ root = tree->slot[1].node; xassert(root != NULL); /* at this point problem object components correspond to the root subproblem, so if the root subproblem should be revived, there is nothing more to do */ if (node == root) goto done; xassert(mip->m == tree->root_m); /* build path from the root to the current node */ node->temp = NULL; for (node = node; node != NULL; node = node->up) { if (node->up == NULL) xassert(node == root); else node->up->temp = node; } /* go down from the root to the current node and make necessary changes to restore components of the current subproblem */ for (node = root; node != NULL; node = node->temp) { int m = mip->m; int n = mip->n; /* if the current node is reached, the problem object at this point corresponds to its parent, so save attributes of rows and columns for the parent subproblem */ if (node->temp == NULL) { int i, j; tree->pred_m = m; /* allocate/reallocate arrays, if necessary */ if (tree->pred_max < m + n) { int new_size = m + n + 100; if (tree->pred_type != NULL) xfree(tree->pred_type); if (tree->pred_lb != NULL) xfree(tree->pred_lb); if (tree->pred_ub != NULL) xfree(tree->pred_ub); if (tree->pred_stat != NULL) xfree(tree->pred_stat); tree->pred_max = new_size; tree->pred_type = xcalloc(1+new_size, sizeof(char)); tree->pred_lb = xcalloc(1+new_size, sizeof(double)); tree->pred_ub = xcalloc(1+new_size, sizeof(double)); tree->pred_stat = xcalloc(1+new_size, sizeof(char)); } /* save row attributes */ for (i = 1; i <= m; i++) { GLPROW *row = mip->row[i]; tree->pred_type[i] = (char)row->type; tree->pred_lb[i] = row->lb; tree->pred_ub[i] = row->ub; tree->pred_stat[i] = (char)row->stat; } /* save column attributes */ for (j = 1; j <= n; j++) { GLPCOL *col = mip->col[j]; tree->pred_type[mip->m+j] = (char)col->type; tree->pred_lb[mip->m+j] = col->lb; tree->pred_ub[mip->m+j] = col->ub; tree->pred_stat[mip->m+j] = (char)col->stat; } } /* change bounds of rows and columns */ { IOSBND *b; for (b = node->b_ptr; b != NULL; b = b->next) { if (b->k <= m) glp_set_row_bnds(mip, b->k, b->type, b->lb, b->ub); else glp_set_col_bnds(mip, b->k-m, b->type, b->lb, b->ub); } } /* change statuses of rows and columns */ { IOSTAT *s; for (s = node->s_ptr; s != NULL; s = s->next) { if (s->k <= m) glp_set_row_stat(mip, s->k, s->stat); else glp_set_col_stat(mip, s->k-m, s->stat); } } /* add new rows */ if (node->r_ptr != NULL) { IOSROW *r; IOSAIJ *a; int i, len, *ind; double *val; ind = xcalloc(1+n, sizeof(int)); val = xcalloc(1+n, sizeof(double)); for (r = node->r_ptr; r != NULL; r = r->next) { i = glp_add_rows(mip, 1); glp_set_row_name(mip, i, r->name); #if 1 /* 20/IX-2008 */ xassert(mip->row[i]->level == 0); mip->row[i]->level = node->level; mip->row[i]->origin = r->origin; mip->row[i]->klass = r->klass; #endif glp_set_row_bnds(mip, i, r->type, r->lb, r->ub); len = 0; for (a = r->ptr; a != NULL; a = a->next) len++, ind[len] = a->j, val[len] = a->val; glp_set_mat_row(mip, i, len, ind, val); glp_set_rii(mip, i, r->rii); glp_set_row_stat(mip, i, r->stat); } xfree(ind); xfree(val); } #if 0 /* add new edges to the conflict graph */ /* add new cliques to the conflict graph */ /* (not implemented yet) */ xassert(node->own_nn == 0); xassert(node->own_nc == 0); xassert(node->e_ptr == NULL); #endif } /* the specified subproblem has been revived */ node = tree->curr; /* delete its bound change list */ while (node->b_ptr != NULL) { IOSBND *b; b = node->b_ptr; node->b_ptr = b->next; dmp_free_atom(tree->pool, b, sizeof(IOSBND)); } /* delete its status change list */ while (node->s_ptr != NULL) { IOSTAT *s; s = node->s_ptr; node->s_ptr = s->next; dmp_free_atom(tree->pool, s, sizeof(IOSTAT)); } #if 1 /* 20/XI-2009 */ /* delete its row addition list (additional rows may appear, for example, due to branching on GUB constraints */ while (node->r_ptr != NULL) { IOSROW *r; r = node->r_ptr; node->r_ptr = r->next; xassert(r->name == NULL); while (r->ptr != NULL) { IOSAIJ *a; a = r->ptr; r->ptr = a->next; dmp_free_atom(tree->pool, a, sizeof(IOSAIJ)); } dmp_free_atom(tree->pool, r, sizeof(IOSROW)); } #endif done: return; } /*********************************************************************** * NAME * * ios_freeze_node - freeze current subproblem * * SYNOPSIS * * #include "glpios.h" * void ios_freeze_node(glp_tree *tree); * * DESCRIPTION * * The routine ios_freeze_node freezes the current subproblem. */ void ios_freeze_node(glp_tree *tree) { glp_prob *mip = tree->mip; int m = mip->m; int n = mip->n; IOSNPD *node; /* obtain pointer to the current subproblem */ node = tree->curr; xassert(node != NULL); if (node->up == NULL) { /* freeze the root subproblem */ int k; xassert(node->p == 1); xassert(tree->root_m == 0); xassert(tree->root_type == NULL); xassert(tree->root_lb == NULL); xassert(tree->root_ub == NULL); xassert(tree->root_stat == NULL); tree->root_m = m; tree->root_type = xcalloc(1+m+n, sizeof(char)); tree->root_lb = xcalloc(1+m+n, sizeof(double)); tree->root_ub = xcalloc(1+m+n, sizeof(double)); tree->root_stat = xcalloc(1+m+n, sizeof(char)); for (k = 1; k <= m+n; k++) { if (k <= m) { GLPROW *row = mip->row[k]; tree->root_type[k] = (char)row->type; tree->root_lb[k] = row->lb; tree->root_ub[k] = row->ub; tree->root_stat[k] = (char)row->stat; } else { GLPCOL *col = mip->col[k-m]; tree->root_type[k] = (char)col->type; tree->root_lb[k] = col->lb; tree->root_ub[k] = col->ub; tree->root_stat[k] = (char)col->stat; } } } else { /* freeze non-root subproblem */ int root_m = tree->root_m; int pred_m = tree->pred_m; int i, j, k; xassert(pred_m <= m); /* build change lists for rows and columns which exist in the parent subproblem */ xassert(node->b_ptr == NULL); xassert(node->s_ptr == NULL); for (k = 1; k <= pred_m + n; k++) { int pred_type, pred_stat, type, stat; double pred_lb, pred_ub, lb, ub; /* determine attributes in the parent subproblem */ pred_type = tree->pred_type[k]; pred_lb = tree->pred_lb[k]; pred_ub = tree->pred_ub[k]; pred_stat = tree->pred_stat[k]; /* determine attributes in the current subproblem */ if (k <= pred_m) { GLPROW *row = mip->row[k]; type = row->type; lb = row->lb; ub = row->ub; stat = row->stat; } else { GLPCOL *col = mip->col[k - pred_m]; type = col->type; lb = col->lb; ub = col->ub; stat = col->stat; } /* save type and bounds of a row/column, if changed */ if (!(pred_type == type && pred_lb == lb && pred_ub == ub)) { IOSBND *b; b = dmp_get_atom(tree->pool, sizeof(IOSBND)); b->k = k; b->type = (unsigned char)type; b->lb = lb; b->ub = ub; b->next = node->b_ptr; node->b_ptr = b; } /* save status of a row/column, if changed */ if (pred_stat != stat) { IOSTAT *s; s = dmp_get_atom(tree->pool, sizeof(IOSTAT)); s->k = k; s->stat = (unsigned char)stat; s->next = node->s_ptr; node->s_ptr = s; } } /* save new rows added to the current subproblem */ xassert(node->r_ptr == NULL); if (pred_m < m) { int i, len, *ind; double *val; ind = xcalloc(1+n, sizeof(int)); val = xcalloc(1+n, sizeof(double)); for (i = m; i > pred_m; i--) { GLPROW *row = mip->row[i]; IOSROW *r; const char *name; r = dmp_get_atom(tree->pool, sizeof(IOSROW)); name = glp_get_row_name(mip, i); if (name == NULL) r->name = NULL; else { r->name = dmp_get_atom(tree->pool, strlen(name)+1); strcpy(r->name, name); } #if 1 /* 20/IX-2008 */ r->origin = row->origin; r->klass = row->klass; #endif r->type = (unsigned char)row->type; r->lb = row->lb; r->ub = row->ub; r->ptr = NULL; len = glp_get_mat_row(mip, i, ind, val); for (k = 1; k <= len; k++) { IOSAIJ *a; a = dmp_get_atom(tree->pool, sizeof(IOSAIJ)); a->j = ind[k]; a->val = val[k]; a->next = r->ptr; r->ptr = a; } r->rii = row->rii; r->stat = (unsigned char)row->stat; r->next = node->r_ptr; node->r_ptr = r; } xfree(ind); xfree(val); } /* remove all rows missing in the root subproblem */ if (m != root_m) { int nrs, *num; nrs = m - root_m; xassert(nrs > 0); num = xcalloc(1+nrs, sizeof(int)); for (i = 1; i <= nrs; i++) num[i] = root_m + i; glp_del_rows(mip, nrs, num); xfree(num); } m = mip->m; /* and restore attributes of all rows and columns for the root subproblem */ xassert(m == root_m); for (i = 1; i <= m; i++) { glp_set_row_bnds(mip, i, tree->root_type[i], tree->root_lb[i], tree->root_ub[i]); glp_set_row_stat(mip, i, tree->root_stat[i]); } for (j = 1; j <= n; j++) { glp_set_col_bnds(mip, j, tree->root_type[m+j], tree->root_lb[m+j], tree->root_ub[m+j]); glp_set_col_stat(mip, j, tree->root_stat[m+j]); } #if 1 /* remove all edges and cliques missing in the conflict graph for the root subproblem */ /* (not implemented yet) */ #endif } /* the current subproblem has been frozen */ tree->curr = NULL; return; } /*********************************************************************** * NAME * * ios_clone_node - clone specified subproblem * * SYNOPSIS * * #include "glpios.h" * void ios_clone_node(glp_tree *tree, int p, int nnn, int ref[]); * * DESCRIPTION * * The routine ios_clone_node clones the specified subproblem, whose * reference number is p, creating its nnn exact copies. Note that the * specified subproblem must be active and must be in the frozen state * (i.e. it must not be the current subproblem). * * Each clone, an exact copy of the specified subproblem, becomes a new * active subproblem added to the end of the active list. After cloning * the specified subproblem becomes inactive. * * The reference numbers of clone subproblems are stored to locations * ref[1], ..., ref[nnn]. */ static int get_slot(glp_tree *tree) { int p; /* if no free slots are available, increase the room */ if (tree->avail == 0) { int nslots = tree->nslots; IOSLOT *save = tree->slot; if (nslots == 0) tree->nslots = 20; else { tree->nslots = nslots + nslots; xassert(tree->nslots > nslots); } tree->slot = xcalloc(1+tree->nslots, sizeof(IOSLOT)); if (save != NULL) { memcpy(&tree->slot[1], &save[1], nslots * sizeof(IOSLOT)); xfree(save); } /* push more free slots into the stack */ for (p = tree->nslots; p > nslots; p--) { tree->slot[p].node = NULL; tree->slot[p].next = tree->avail; tree->avail = p; } } /* pull a free slot from the stack */ p = tree->avail; tree->avail = tree->slot[p].next; xassert(tree->slot[p].node == NULL); tree->slot[p].next = 0; return p; } static IOSNPD *new_node(glp_tree *tree, IOSNPD *parent) { IOSNPD *node; int p; /* pull a free slot for the new node */ p = get_slot(tree); /* create descriptor of the new subproblem */ node = dmp_get_atom(tree->pool, sizeof(IOSNPD)); tree->slot[p].node = node; node->p = p; node->up = parent; node->level = (parent == NULL ? 0 : parent->level + 1); node->count = 0; node->b_ptr = NULL; node->s_ptr = NULL; node->r_ptr = NULL; node->solved = 0; #if 0 node->own_nn = node->own_nc = 0; node->e_ptr = NULL; #endif #if 1 /* 04/X-2008 */ node->lp_obj = (parent == NULL ? (tree->mip->dir == GLP_MIN ? -DBL_MAX : +DBL_MAX) : parent->lp_obj); #endif node->bound = (parent == NULL ? (tree->mip->dir == GLP_MIN ? -DBL_MAX : +DBL_MAX) : parent->bound); node->br_var = 0; node->br_val = 0.0; node->ii_cnt = 0; node->ii_sum = 0.0; #if 1 /* 30/XI-2009 */ node->changed = 0; #endif if (tree->parm->cb_size == 0) node->data = NULL; else { node->data = dmp_get_atom(tree->pool, tree->parm->cb_size); memset(node->data, 0, tree->parm->cb_size); } node->temp = NULL; node->prev = tree->tail; node->next = NULL; /* add the new subproblem to the end of the active list */ if (tree->head == NULL) tree->head = node; else tree->tail->next = node; tree->tail = node; tree->a_cnt++; tree->n_cnt++; tree->t_cnt++; /* increase the number of child subproblems */ if (parent == NULL) xassert(p == 1); else parent->count++; return node; } void ios_clone_node(glp_tree *tree, int p, int nnn, int ref[]) { IOSNPD *node; int k; /* obtain pointer to the subproblem to be cloned */ xassert(1 <= p && p <= tree->nslots); node = tree->slot[p].node; xassert(node != NULL); /* the specified subproblem must be active */ xassert(node->count == 0); /* and must be in the frozen state */ xassert(tree->curr != node); /* remove the specified subproblem from the active list, because it becomes inactive */ if (node->prev == NULL) tree->head = node->next; else node->prev->next = node->next; if (node->next == NULL) tree->tail = node->prev; else node->next->prev = node->prev; node->prev = node->next = NULL; tree->a_cnt--; /* create clone subproblems */ xassert(nnn > 0); for (k = 1; k <= nnn; k++) ref[k] = new_node(tree, node)->p; return; } /*********************************************************************** * NAME * * ios_delete_node - delete specified subproblem * * SYNOPSIS * * #include "glpios.h" * void ios_delete_node(glp_tree *tree, int p); * * DESCRIPTION * * The routine ios_delete_node deletes the specified subproblem, whose * reference number is p. The subproblem must be active and must be in * the frozen state (i.e. it must not be the current subproblem). * * Note that deletion is performed recursively, i.e. if a subproblem to * be deleted is the only child of its parent, the parent subproblem is * also deleted, etc. */ void ios_delete_node(glp_tree *tree, int p) { IOSNPD *node, *temp; /* obtain pointer to the subproblem to be deleted */ xassert(1 <= p && p <= tree->nslots); node = tree->slot[p].node; xassert(node != NULL); /* the specified subproblem must be active */ xassert(node->count == 0); /* and must be in the frozen state */ xassert(tree->curr != node); /* remove the specified subproblem from the active list, because it is gone from the tree */ if (node->prev == NULL) tree->head = node->next; else node->prev->next = node->next; if (node->next == NULL) tree->tail = node->prev; else node->next->prev = node->prev; node->prev = node->next = NULL; tree->a_cnt--; loop: /* recursive deletion starts here */ /* delete the bound change list */ { IOSBND *b; while (node->b_ptr != NULL) { b = node->b_ptr; node->b_ptr = b->next; dmp_free_atom(tree->pool, b, sizeof(IOSBND)); } } /* delete the status change list */ { IOSTAT *s; while (node->s_ptr != NULL) { s = node->s_ptr; node->s_ptr = s->next; dmp_free_atom(tree->pool, s, sizeof(IOSTAT)); } } /* delete the row addition list */ while (node->r_ptr != NULL) { IOSROW *r; r = node->r_ptr; if (r->name != NULL) dmp_free_atom(tree->pool, r->name, strlen(r->name)+1); while (r->ptr != NULL) { IOSAIJ *a; a = r->ptr; r->ptr = a->next; dmp_free_atom(tree->pool, a, sizeof(IOSAIJ)); } node->r_ptr = r->next; dmp_free_atom(tree->pool, r, sizeof(IOSROW)); } #if 0 /* delete the edge addition list */ /* delete the clique addition list */ /* (not implemented yet) */ xassert(node->own_nn == 0); xassert(node->own_nc == 0); xassert(node->e_ptr == NULL); #endif /* free application-specific data */ if (tree->parm->cb_size == 0) xassert(node->data == NULL); else dmp_free_atom(tree->pool, node->data, tree->parm->cb_size); /* free the corresponding node slot */ p = node->p; xassert(tree->slot[p].node == node); tree->slot[p].node = NULL; tree->slot[p].next = tree->avail; tree->avail = p; /* save pointer to the parent subproblem */ temp = node->up; /* delete the subproblem descriptor */ dmp_free_atom(tree->pool, node, sizeof(IOSNPD)); tree->n_cnt--; /* take pointer to the parent subproblem */ node = temp; if (node != NULL) { /* the parent subproblem exists; decrease the number of its child subproblems */ xassert(node->count > 0); node->count--; /* if now the parent subproblem has no childs, it also must be deleted */ if (node->count == 0) goto loop; } return; } /*********************************************************************** * NAME * * ios_delete_tree - delete branch-and-bound tree * * SYNOPSIS * * #include "glpios.h" * void ios_delete_tree(glp_tree *tree); * * DESCRIPTION * * The routine ios_delete_tree deletes the branch-and-bound tree, which * the parameter tree points to, and frees all the memory allocated to * this program object. * * On exit components of the problem object are restored to correspond * to the original MIP passed to the routine ios_create_tree. */ void ios_delete_tree(glp_tree *tree) { glp_prob *mip = tree->mip; int i, j; int m = mip->m; int n = mip->n; xassert(mip->tree == tree); /* remove all additional rows */ if (m != tree->orig_m) { int nrs, *num; nrs = m - tree->orig_m; xassert(nrs > 0); num = xcalloc(1+nrs, sizeof(int)); for (i = 1; i <= nrs; i++) num[i] = tree->orig_m + i; glp_del_rows(mip, nrs, num); xfree(num); } m = tree->orig_m; /* restore original attributes of rows and columns */ xassert(m == tree->orig_m); xassert(n == tree->n); for (i = 1; i <= m; i++) { glp_set_row_bnds(mip, i, tree->orig_type[i], tree->orig_lb[i], tree->orig_ub[i]); glp_set_row_stat(mip, i, tree->orig_stat[i]); mip->row[i]->prim = tree->orig_prim[i]; mip->row[i]->dual = tree->orig_dual[i]; } for (j = 1; j <= n; j++) { glp_set_col_bnds(mip, j, tree->orig_type[m+j], tree->orig_lb[m+j], tree->orig_ub[m+j]); glp_set_col_stat(mip, j, tree->orig_stat[m+j]); mip->col[j]->prim = tree->orig_prim[m+j]; mip->col[j]->dual = tree->orig_dual[m+j]; } mip->pbs_stat = mip->dbs_stat = GLP_FEAS; mip->obj_val = tree->orig_obj; /* delete the branch-and-bound tree */ xassert(tree->local != NULL); ios_delete_pool(tree, tree->local); dmp_delete_pool(tree->pool); xfree(tree->orig_type); xfree(tree->orig_lb); xfree(tree->orig_ub); xfree(tree->orig_stat); xfree(tree->orig_prim); xfree(tree->orig_dual); xfree(tree->slot); if (tree->root_type != NULL) xfree(tree->root_type); if (tree->root_lb != NULL) xfree(tree->root_lb); if (tree->root_ub != NULL) xfree(tree->root_ub); if (tree->root_stat != NULL) xfree(tree->root_stat); xfree(tree->non_int); #if 0 xfree(tree->n_ref); xfree(tree->c_ref); xfree(tree->j_ref); #endif if (tree->pcost != NULL) ios_pcost_free(tree); xfree(tree->iwrk); xfree(tree->dwrk); #if 0 scg_delete_graph(tree->g); #endif if (tree->pred_type != NULL) xfree(tree->pred_type); if (tree->pred_lb != NULL) xfree(tree->pred_lb); if (tree->pred_ub != NULL) xfree(tree->pred_ub); if (tree->pred_stat != NULL) xfree(tree->pred_stat); #if 0 xassert(tree->cut_gen == NULL); #endif xassert(tree->mir_gen == NULL); xassert(tree->clq_gen == NULL); xfree(tree); mip->tree = NULL; return; } /*********************************************************************** * NAME * * ios_eval_degrad - estimate obj. degrad. for down- and up-branches * * SYNOPSIS * * #include "glpios.h" * void ios_eval_degrad(glp_tree *tree, int j, double *dn, double *up); * * DESCRIPTION * * Given optimal basis to LP relaxation of the current subproblem the * routine ios_eval_degrad performs the dual ratio test to compute the * objective values in the adjacent basis for down- and up-branches, * which are stored in locations *dn and *up, assuming that x[j] is a * variable chosen to branch upon. */ void ios_eval_degrad(glp_tree *tree, int j, double *dn, double *up) { glp_prob *mip = tree->mip; int m = mip->m, n = mip->n; int len, kase, k, t, stat; double alfa, beta, gamma, delta, dz; int *ind = tree->iwrk; double *val = tree->dwrk; /* current basis must be optimal */ xassert(glp_get_status(mip) == GLP_OPT); /* basis factorization must exist */ xassert(glp_bf_exists(mip)); /* obtain (fractional) value of x[j] in optimal basic solution to LP relaxation of the current subproblem */ xassert(1 <= j && j <= n); beta = mip->col[j]->prim; /* since the value of x[j] is fractional, it is basic; compute corresponding row of the simplex table */ len = lpx_eval_tab_row(mip, m+j, ind, val); /* kase < 0 means down-branch; kase > 0 means up-branch */ for (kase = -1; kase <= +1; kase += 2) { /* for down-branch we introduce new upper bound floor(beta) for x[j]; similarly, for up-branch we introduce new lower bound ceil(beta) for x[j]; in the current basis this new upper/lower bound is violated, so in the adjacent basis x[j] will leave the basis and go to its new upper/lower bound; we need to know which non-basic variable x[k] should enter the basis to keep dual feasibility */ #if 0 /* 23/XI-2009 */ k = lpx_dual_ratio_test(mip, len, ind, val, kase, 1e-7); #else k = lpx_dual_ratio_test(mip, len, ind, val, kase, 1e-9); #endif /* if no variable has been chosen, current basis being primal infeasible due to the new upper/lower bound of x[j] is dual unbounded, therefore, LP relaxation to corresponding branch has no primal feasible solution */ if (k == 0) { if (mip->dir == GLP_MIN) { if (kase < 0) *dn = +DBL_MAX; else *up = +DBL_MAX; } else if (mip->dir == GLP_MAX) { if (kase < 0) *dn = -DBL_MAX; else *up = -DBL_MAX; } else xassert(mip != mip); continue; } xassert(1 <= k && k <= m+n); /* row of the simplex table corresponding to specified basic variable x[j] is the following: x[j] = ... + alfa * x[k] + ... ; we need to know influence coefficient, alfa, at non-basic variable x[k] chosen with the dual ratio test */ for (t = 1; t <= len; t++) if (ind[t] == k) break; xassert(1 <= t && t <= len); alfa = val[t]; /* determine status and reduced cost of variable x[k] */ if (k <= m) { stat = mip->row[k]->stat; gamma = mip->row[k]->dual; } else { stat = mip->col[k-m]->stat; gamma = mip->col[k-m]->dual; } /* x[k] cannot be basic or fixed non-basic */ xassert(stat == GLP_NL || stat == GLP_NU || stat == GLP_NF); /* if the current basis is dual degenerative, some reduced costs, which are close to zero, may have wrong sign due to round-off errors, so correct the sign of gamma */ if (mip->dir == GLP_MIN) { if (stat == GLP_NL && gamma < 0.0 || stat == GLP_NU && gamma > 0.0 || stat == GLP_NF) gamma = 0.0; } else if (mip->dir == GLP_MAX) { if (stat == GLP_NL && gamma > 0.0 || stat == GLP_NU && gamma < 0.0 || stat == GLP_NF) gamma = 0.0; } else xassert(mip != mip); /* determine the change of x[j] in the adjacent basis: delta x[j] = new x[j] - old x[j] */ delta = (kase < 0 ? floor(beta) : ceil(beta)) - beta; /* compute the change of x[k] in the adjacent basis: delta x[k] = new x[k] - old x[k] = delta x[j] / alfa */ delta /= alfa; /* compute the change of the objective in the adjacent basis: delta z = new z - old z = gamma * delta x[k] */ dz = gamma * delta; if (mip->dir == GLP_MIN) xassert(dz >= 0.0); else if (mip->dir == GLP_MAX) xassert(dz <= 0.0); else xassert(mip != mip); /* compute the new objective value in the adjacent basis: new z = old z + delta z */ if (kase < 0) *dn = mip->obj_val + dz; else *up = mip->obj_val + dz; } /*xprintf("obj = %g; dn = %g; up = %g\n", mip->obj_val, *dn, *up);*/ return; } /*********************************************************************** * NAME * * ios_round_bound - improve local bound by rounding * * SYNOPSIS * * #include "glpios.h" * double ios_round_bound(glp_tree *tree, double bound); * * RETURNS * * For the given local bound for any integer feasible solution to the * current subproblem the routine ios_round_bound returns an improved * local bound for the same integer feasible solution. * * BACKGROUND * * Let the current subproblem has the following objective function: * * z = sum c[j] * x[j] + s >= b, (1) * j in J * * where J = {j: c[j] is non-zero and integer, x[j] is integer}, s is * the sum of terms corresponding to fixed variables, b is an initial * local bound (minimization). * * From (1) it follows that: * * d * sum (c[j] / d) * x[j] + s >= b, (2) * j in J * * or, equivalently, * * sum (c[j] / d) * x[j] >= (b - s) / d = h, (3) * j in J * * where d = gcd(c[j]). Since the left-hand side of (3) is integer, * h = (b - s) / d can be rounded up to the nearest integer: * * h' = ceil(h) = (b' - s) / d, (4) * * that gives an rounded, improved local bound: * * b' = d * h' + s. (5) * * In case of maximization '>=' in (1) should be replaced by '<=' that * leads to the following formula: * * h' = floor(h) = (b' - s) / d, (6) * * which should used in the same way as (4). * * NOTE: If b is a valid local bound for a child of the current * subproblem, b' is also valid for that child subproblem. */ double ios_round_bound(glp_tree *tree, double bound) { glp_prob *mip = tree->mip; int n = mip->n; int d, j, nn, *c = tree->iwrk; double s, h; /* determine c[j] and compute s */ nn = 0, s = mip->c0, d = 0; for (j = 1; j <= n; j++) { GLPCOL *col = mip->col[j]; if (col->coef == 0.0) continue; if (col->type == GLP_FX) { /* fixed variable */ s += col->coef * col->prim; } else { /* non-fixed variable */ if (col->kind != GLP_IV) goto skip; if (col->coef != floor(col->coef)) goto skip; if (fabs(col->coef) <= (double)INT_MAX) c[++nn] = (int)fabs(col->coef); else d = 1; } } /* compute d = gcd(c[1],...c[nn]) */ if (d == 0) { if (nn == 0) goto skip; d = gcdn(nn, c); } xassert(d > 0); /* compute new local bound */ if (mip->dir == GLP_MIN) { if (bound != +DBL_MAX) { h = (bound - s) / (double)d; if (h >= floor(h) + 0.001) { /* round up */ h = ceil(h); /*xprintf("d = %d; old = %g; ", d, bound);*/ bound = (double)d * h + s; /*xprintf("new = %g\n", bound);*/ } } } else if (mip->dir == GLP_MAX) { if (bound != -DBL_MAX) { h = (bound - s) / (double)d; if (h <= ceil(h) - 0.001) { /* round down */ h = floor(h); bound = (double)d * h + s; } } } else xassert(mip != mip); skip: return bound; } /*********************************************************************** * NAME * * ios_is_hopeful - check if subproblem is hopeful * * SYNOPSIS * * #include "glpios.h" * int ios_is_hopeful(glp_tree *tree, double bound); * * DESCRIPTION * * Given the local bound of a subproblem the routine ios_is_hopeful * checks if the subproblem can have an integer optimal solution which * is better than the best one currently known. * * RETURNS * * If the subproblem can have a better integer optimal solution, the * routine returns non-zero; otherwise, if the corresponding branch can * be pruned, the routine returns zero. */ int ios_is_hopeful(glp_tree *tree, double bound) { glp_prob *mip = tree->mip; int ret = 1; double eps; if (mip->mip_stat == GLP_FEAS) { eps = tree->parm->tol_obj * (1.0 + fabs(mip->mip_obj)); switch (mip->dir) { case GLP_MIN: if (bound >= mip->mip_obj - eps) ret = 0; break; case GLP_MAX: if (bound <= mip->mip_obj + eps) ret = 0; break; default: xassert(mip != mip); } } else { switch (mip->dir) { case GLP_MIN: if (bound == +DBL_MAX) ret = 0; break; case GLP_MAX: if (bound == -DBL_MAX) ret = 0; break; default: xassert(mip != mip); } } return ret; } /*********************************************************************** * NAME * * ios_best_node - find active node with best local bound * * SYNOPSIS * * #include "glpios.h" * int ios_best_node(glp_tree *tree); * * DESCRIPTION * * The routine ios_best_node finds an active node whose local bound is * best among other active nodes. * * It is understood that the integer optimal solution of the original * mip problem cannot be better than the best bound, so the best bound * is an lower (minimization) or upper (maximization) global bound for * the original problem. * * RETURNS * * The routine ios_best_node returns the subproblem reference number * for the best node. However, if the tree is empty, it returns zero. */ int ios_best_node(glp_tree *tree) { IOSNPD *node, *best = NULL; switch (tree->mip->dir) { case GLP_MIN: /* minimization */ for (node = tree->head; node != NULL; node = node->next) if (best == NULL || best->bound > node->bound) best = node; break; case GLP_MAX: /* maximization */ for (node = tree->head; node != NULL; node = node->next) if (best == NULL || best->bound < node->bound) best = node; break; default: xassert(tree != tree); } return best == NULL ? 0 : best->p; } /*********************************************************************** * NAME * * ios_relative_gap - compute relative mip gap * * SYNOPSIS * * #include "glpios.h" * double ios_relative_gap(glp_tree *tree); * * DESCRIPTION * * The routine ios_relative_gap computes the relative mip gap using the * formula: * * gap = |best_mip - best_bnd| / (|best_mip| + DBL_EPSILON), * * where best_mip is the best integer feasible solution found so far, * best_bnd is the best (global) bound. If no integer feasible solution * has been found yet, rel_gap is set to DBL_MAX. * * RETURNS * * The routine ios_relative_gap returns the relative mip gap. */ double ios_relative_gap(glp_tree *tree) { glp_prob *mip = tree->mip; int p; double best_mip, best_bnd, gap; if (mip->mip_stat == GLP_FEAS) { best_mip = mip->mip_obj; p = ios_best_node(tree); if (p == 0) { /* the tree is empty */ gap = 0.0; } else { best_bnd = tree->slot[p].node->bound; gap = fabs(best_mip - best_bnd) / (fabs(best_mip) + DBL_EPSILON); } } else { /* no integer feasible solution has been found yet */ gap = DBL_MAX; } return gap; } /*********************************************************************** * NAME * * ios_solve_node - solve LP relaxation of current subproblem * * SYNOPSIS * * #include "glpios.h" * int ios_solve_node(glp_tree *tree); * * DESCRIPTION * * The routine ios_solve_node re-optimizes LP relaxation of the current * subproblem using the dual simplex method. * * RETURNS * * The routine returns the code which is reported by glp_simplex. */ int ios_solve_node(glp_tree *tree) { glp_prob *mip = tree->mip; glp_smcp parm; int ret; /* the current subproblem must exist */ xassert(tree->curr != NULL); /* set some control parameters */ glp_init_smcp(&parm); switch (tree->parm->msg_lev) { case GLP_MSG_OFF: parm.msg_lev = GLP_MSG_OFF; break; case GLP_MSG_ERR: parm.msg_lev = GLP_MSG_ERR; break; case GLP_MSG_ON: case GLP_MSG_ALL: parm.msg_lev = GLP_MSG_ON; break; case GLP_MSG_DBG: parm.msg_lev = GLP_MSG_ALL; break; default: xassert(tree != tree); } parm.meth = GLP_DUALP; #if 1 /* 16/III-2016 */ if (tree->parm->flip) parm.r_test = GLP_RT_FLIP; #endif /* respect time limit */ if (tree->parm->tm_lim < INT_MAX) parm.tm_lim = tree->parm->tm_lim - (glp_time() - tree->tm_beg); if (parm.tm_lim < 0) parm.tm_lim = 0; if (tree->parm->msg_lev < GLP_MSG_DBG) parm.out_dly = tree->parm->out_dly; else parm.out_dly = 0; /* if the incumbent objective value is already known, use it to prematurely terminate the dual simplex search */ if (mip->mip_stat == GLP_FEAS) { switch (tree->mip->dir) { case GLP_MIN: parm.obj_ul = mip->mip_obj; break; case GLP_MAX: parm.obj_ll = mip->mip_obj; break; default: xassert(mip != mip); } } /* try to solve/re-optimize the LP relaxation */ ret = glp_simplex(mip, &parm); #if 1 /* 21/II-2016 by Chris */ if (ret == GLP_EFAIL) { /* retry with a new basis */ glp_adv_basis(mip, 0); ret = glp_simplex(mip, &parm); } #endif tree->curr->solved++; #if 0 xprintf("ret = %d; status = %d; pbs = %d; dbs = %d; some = %d\n", ret, glp_get_status(mip), mip->pbs_stat, mip->dbs_stat, mip->some); lpx_print_sol(mip, "sol"); #endif return ret; } /**********************************************************************/ #ifdef NEW_LOCAL /* 02/II-2018 */ IOSPOOL *ios_create_pool(glp_tree *tree) { /* create cut pool */ IOSPOOL *pool; pool = glp_create_prob(); #if 1 /* 14/VII-2020 */ if (tree->mip->n) #endif glp_add_cols(pool, tree->mip->n); return pool; } #else IOSPOOL *ios_create_pool(glp_tree *tree) { /* create cut pool */ IOSPOOL *pool; #if 0 pool = dmp_get_atom(tree->pool, sizeof(IOSPOOL)); #else xassert(tree == tree); pool = xmalloc(sizeof(IOSPOOL)); #endif pool->size = 0; pool->head = pool->tail = NULL; pool->ord = 0, pool->curr = NULL; return pool; } #endif #ifdef NEW_LOCAL /* 02/II-2018 */ int ios_add_row(glp_tree *tree, IOSPOOL *pool, const char *name, int klass, int flags, int len, const int ind[], const double val[], int type, double rhs) { /* add row (constraint) to the cut pool */ int i; i = glp_add_rows(pool, 1); glp_set_row_name(pool, i, name); pool->row[i]->klass = klass; xassert(flags == 0); glp_set_mat_row(pool, i, len, ind, val); glp_set_row_bnds(pool, i, type, rhs, rhs); return i; } #else int ios_add_row(glp_tree *tree, IOSPOOL *pool, const char *name, int klass, int flags, int len, const int ind[], const double val[], int type, double rhs) { /* add row (constraint) to the cut pool */ IOSCUT *cut; IOSAIJ *aij; int k; xassert(pool != NULL); cut = dmp_get_atom(tree->pool, sizeof(IOSCUT)); if (name == NULL || name[0] == '\0') cut->name = NULL; else { for (k = 0; name[k] != '\0'; k++) { if (k == 256) xerror("glp_ios_add_row: cut name too long\n"); if (iscntrl((unsigned char)name[k])) xerror("glp_ios_add_row: cut name contains invalid chara" "cter(s)\n"); } cut->name = dmp_get_atom(tree->pool, strlen(name)+1); strcpy(cut->name, name); } if (!(0 <= klass && klass <= 255)) xerror("glp_ios_add_row: klass = %d; invalid cut class\n", klass); cut->klass = (unsigned char)klass; if (flags != 0) xerror("glp_ios_add_row: flags = %d; invalid cut flags\n", flags); cut->ptr = NULL; if (!(0 <= len && len <= tree->n)) xerror("glp_ios_add_row: len = %d; invalid cut length\n", len); for (k = 1; k <= len; k++) { aij = dmp_get_atom(tree->pool, sizeof(IOSAIJ)); if (!(1 <= ind[k] && ind[k] <= tree->n)) xerror("glp_ios_add_row: ind[%d] = %d; column index out of " "range\n", k, ind[k]); aij->j = ind[k]; aij->val = val[k]; aij->next = cut->ptr; cut->ptr = aij; } if (!(type == GLP_LO || type == GLP_UP || type == GLP_FX)) xerror("glp_ios_add_row: type = %d; invalid cut type\n", type); cut->type = (unsigned char)type; cut->rhs = rhs; cut->prev = pool->tail; cut->next = NULL; if (cut->prev == NULL) pool->head = cut; else cut->prev->next = cut; pool->tail = cut; pool->size++; return pool->size; } #endif #ifdef NEW_LOCAL /* 02/II-2018 */ IOSCUT *ios_find_row(IOSPOOL *pool, int i) { /* find row (constraint) in the cut pool */ xassert(0); } #else IOSCUT *ios_find_row(IOSPOOL *pool, int i) { /* find row (constraint) in the cut pool */ /* (smart linear search) */ xassert(pool != NULL); xassert(1 <= i && i <= pool->size); if (pool->ord == 0) { xassert(pool->curr == NULL); pool->ord = 1; pool->curr = pool->head; } xassert(pool->curr != NULL); if (i < pool->ord) { if (i < pool->ord - i) { pool->ord = 1; pool->curr = pool->head; while (pool->ord != i) { pool->ord++; xassert(pool->curr != NULL); pool->curr = pool->curr->next; } } else { while (pool->ord != i) { pool->ord--; xassert(pool->curr != NULL); pool->curr = pool->curr->prev; } } } else if (i > pool->ord) { if (i - pool->ord < pool->size - i) { while (pool->ord != i) { pool->ord++; xassert(pool->curr != NULL); pool->curr = pool->curr->next; } } else { pool->ord = pool->size; pool->curr = pool->tail; while (pool->ord != i) { pool->ord--; xassert(pool->curr != NULL); pool->curr = pool->curr->prev; } } } xassert(pool->ord == i); xassert(pool->curr != NULL); return pool->curr; } #endif #ifdef NEW_LOCAL /* 02/II-2018 */ void ios_del_row(glp_tree *tree, IOSPOOL *pool, int i) { /* remove row (constraint) from the cut pool */ xassert(0); } #else void ios_del_row(glp_tree *tree, IOSPOOL *pool, int i) { /* remove row (constraint) from the cut pool */ IOSCUT *cut; IOSAIJ *aij; xassert(pool != NULL); if (!(1 <= i && i <= pool->size)) xerror("glp_ios_del_row: i = %d; cut number out of range\n", i); cut = ios_find_row(pool, i); xassert(pool->curr == cut); if (cut->next != NULL) pool->curr = cut->next; else if (cut->prev != NULL) pool->ord--, pool->curr = cut->prev; else pool->ord = 0, pool->curr = NULL; if (cut->name != NULL) dmp_free_atom(tree->pool, cut->name, strlen(cut->name)+1); if (cut->prev == NULL) { xassert(pool->head == cut); pool->head = cut->next; } else { xassert(cut->prev->next == cut); cut->prev->next = cut->next; } if (cut->next == NULL) { xassert(pool->tail == cut); pool->tail = cut->prev; } else { xassert(cut->next->prev == cut); cut->next->prev = cut->prev; } while (cut->ptr != NULL) { aij = cut->ptr; cut->ptr = aij->next; dmp_free_atom(tree->pool, aij, sizeof(IOSAIJ)); } dmp_free_atom(tree->pool, cut, sizeof(IOSCUT)); pool->size--; return; } #endif #ifdef NEW_LOCAL /* 02/II-2018 */ void ios_clear_pool(glp_tree *tree, IOSPOOL *pool) { /* remove all rows (constraints) from the cut pool */ if (pool->m > 0) { int i, *num; num = talloc(1+pool->m, int); for (i = 1; i <= pool->m; i++) num[i] = i; glp_del_rows(pool, pool->m, num); tfree(num); } return; } #else void ios_clear_pool(glp_tree *tree, IOSPOOL *pool) { /* remove all rows (constraints) from the cut pool */ xassert(pool != NULL); while (pool->head != NULL) { IOSCUT *cut = pool->head; pool->head = cut->next; if (cut->name != NULL) dmp_free_atom(tree->pool, cut->name, strlen(cut->name)+1); while (cut->ptr != NULL) { IOSAIJ *aij = cut->ptr; cut->ptr = aij->next; dmp_free_atom(tree->pool, aij, sizeof(IOSAIJ)); } dmp_free_atom(tree->pool, cut, sizeof(IOSCUT)); } pool->size = 0; pool->head = pool->tail = NULL; pool->ord = 0, pool->curr = NULL; return; } #endif #ifdef NEW_LOCAL /* 02/II-2018 */ void ios_delete_pool(glp_tree *tree, IOSPOOL *pool) { /* delete cut pool */ xassert(pool != NULL); glp_delete_prob(pool); return; } #else void ios_delete_pool(glp_tree *tree, IOSPOOL *pool) { /* delete cut pool */ xassert(pool != NULL); ios_clear_pool(tree, pool); xfree(pool); return; } #endif #if 1 /* 11/VII-2013 */ #include "npp.h" void ios_process_sol(glp_tree *T) { /* process integer feasible solution just found */ if (T->npp != NULL) { /* postprocess solution from transformed mip */ npp_postprocess(T->npp, T->mip); /* store solution to problem passed to glp_intopt */ npp_unload_sol(T->npp, T->P); } xassert(T->P != NULL); /* save solution to text file, if requested */ if (T->save_sol != NULL) { char *fn, *mark; fn = talloc(strlen(T->save_sol) + 50, char); mark = strrchr(T->save_sol, '*'); if (mark == NULL) strcpy(fn, T->save_sol); else { memcpy(fn, T->save_sol, mark - T->save_sol); fn[mark - T->save_sol] = '\0'; sprintf(fn + strlen(fn), "%03d", ++(T->save_cnt)); strcat(fn, &mark[1]); } glp_write_mip(T->P, fn); tfree(fn); } return; } #endif /* eof */ glpk-5.0/src/draft/glpios02.c0000644000062000006210000006433313766346220015205 0ustar maomkpasswd/* glpios02.c (preprocess current subproblem) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2003-2018 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "ios.h" /*********************************************************************** * prepare_row_info - prepare row info to determine implied bounds * * Given a row (linear form) * * n * sum a[j] * x[j] (1) * j=1 * * and bounds of columns (variables) * * l[j] <= x[j] <= u[j] (2) * * this routine computes f_min, j_min, f_max, j_max needed to determine * implied bounds. * * ALGORITHM * * Let J+ = {j : a[j] > 0} and J- = {j : a[j] < 0}. * * Parameters f_min and j_min are computed as follows: * * 1) if there is no x[k] such that k in J+ and l[k] = -inf or k in J- * and u[k] = +inf, then * * f_min := sum a[j] * l[j] + sum a[j] * u[j] * j in J+ j in J- * (3) * j_min := 0 * * 2) if there is exactly one x[k] such that k in J+ and l[k] = -inf * or k in J- and u[k] = +inf, then * * f_min := sum a[j] * l[j] + sum a[j] * u[j] * j in J+\{k} j in J-\{k} * (4) * j_min := k * * 3) if there are two or more x[k] such that k in J+ and l[k] = -inf * or k in J- and u[k] = +inf, then * * f_min := -inf * (5) * j_min := 0 * * Parameters f_max and j_max are computed in a similar way as follows: * * 1) if there is no x[k] such that k in J+ and u[k] = +inf or k in J- * and l[k] = -inf, then * * f_max := sum a[j] * u[j] + sum a[j] * l[j] * j in J+ j in J- * (6) * j_max := 0 * * 2) if there is exactly one x[k] such that k in J+ and u[k] = +inf * or k in J- and l[k] = -inf, then * * f_max := sum a[j] * u[j] + sum a[j] * l[j] * j in J+\{k} j in J-\{k} * (7) * j_max := k * * 3) if there are two or more x[k] such that k in J+ and u[k] = +inf * or k in J- and l[k] = -inf, then * * f_max := +inf * (8) * j_max := 0 */ struct f_info { int j_min, j_max; double f_min, f_max; }; static void prepare_row_info(int n, const double a[], const double l[], const double u[], struct f_info *f) { int j, j_min, j_max; double f_min, f_max; xassert(n >= 0); /* determine f_min and j_min */ f_min = 0.0, j_min = 0; for (j = 1; j <= n; j++) { if (a[j] > 0.0) { if (l[j] == -DBL_MAX) { if (j_min == 0) j_min = j; else { f_min = -DBL_MAX, j_min = 0; break; } } else f_min += a[j] * l[j]; } else if (a[j] < 0.0) { if (u[j] == +DBL_MAX) { if (j_min == 0) j_min = j; else { f_min = -DBL_MAX, j_min = 0; break; } } else f_min += a[j] * u[j]; } else xassert(a != a); } f->f_min = f_min, f->j_min = j_min; /* determine f_max and j_max */ f_max = 0.0, j_max = 0; for (j = 1; j <= n; j++) { if (a[j] > 0.0) { if (u[j] == +DBL_MAX) { if (j_max == 0) j_max = j; else { f_max = +DBL_MAX, j_max = 0; break; } } else f_max += a[j] * u[j]; } else if (a[j] < 0.0) { if (l[j] == -DBL_MAX) { if (j_max == 0) j_max = j; else { f_max = +DBL_MAX, j_max = 0; break; } } else f_max += a[j] * l[j]; } else xassert(a != a); } f->f_max = f_max, f->j_max = j_max; return; } /*********************************************************************** * row_implied_bounds - determine row implied bounds * * Given a row (linear form) * * n * sum a[j] * x[j] * j=1 * * and bounds of columns (variables) * * l[j] <= x[j] <= u[j] * * this routine determines implied bounds of the row. * * ALGORITHM * * Let J+ = {j : a[j] > 0} and J- = {j : a[j] < 0}. * * The implied lower bound of the row is computed as follows: * * L' := sum a[j] * l[j] + sum a[j] * u[j] (9) * j in J+ j in J- * * and as it follows from (3), (4), and (5): * * L' := if j_min = 0 then f_min else -inf (10) * * The implied upper bound of the row is computed as follows: * * U' := sum a[j] * u[j] + sum a[j] * l[j] (11) * j in J+ j in J- * * and as it follows from (6), (7), and (8): * * U' := if j_max = 0 then f_max else +inf (12) * * The implied bounds are stored in locations LL and UU. */ static void row_implied_bounds(const struct f_info *f, double *LL, double *UU) { *LL = (f->j_min == 0 ? f->f_min : -DBL_MAX); *UU = (f->j_max == 0 ? f->f_max : +DBL_MAX); return; } /*********************************************************************** * col_implied_bounds - determine column implied bounds * * Given a row (constraint) * * n * L <= sum a[j] * x[j] <= U (13) * j=1 * * and bounds of columns (variables) * * l[j] <= x[j] <= u[j] * * this routine determines implied bounds of variable x[k]. * * It is assumed that if L != -inf, the lower bound of the row can be * active, and if U != +inf, the upper bound of the row can be active. * * ALGORITHM * * From (13) it follows that * * L <= sum a[j] * x[j] + a[k] * x[k] <= U * j!=k * or * * L - sum a[j] * x[j] <= a[k] * x[k] <= U - sum a[j] * x[j] * j!=k j!=k * * Thus, if the row lower bound L can be active, implied lower bound of * term a[k] * x[k] can be determined as follows: * * ilb(a[k] * x[k]) = min(L - sum a[j] * x[j]) = * j!=k * (14) * = L - max sum a[j] * x[j] * j!=k * * where, as it follows from (6), (7), and (8) * * / f_max - a[k] * u[k], j_max = 0, a[k] > 0 * | * | f_max - a[k] * l[k], j_max = 0, a[k] < 0 * max sum a[j] * x[j] = { * j!=k | f_max, j_max = k * | * \ +inf, j_max != 0 * * and if the upper bound U can be active, implied upper bound of term * a[k] * x[k] can be determined as follows: * * iub(a[k] * x[k]) = max(U - sum a[j] * x[j]) = * j!=k * (15) * = U - min sum a[j] * x[j] * j!=k * * where, as it follows from (3), (4), and (5) * * / f_min - a[k] * l[k], j_min = 0, a[k] > 0 * | * | f_min - a[k] * u[k], j_min = 0, a[k] < 0 * min sum a[j] * x[j] = { * j!=k | f_min, j_min = k * | * \ -inf, j_min != 0 * * Since * * ilb(a[k] * x[k]) <= a[k] * x[k] <= iub(a[k] * x[k]) * * implied lower and upper bounds of x[k] are determined as follows: * * l'[k] := if a[k] > 0 then ilb / a[k] else ulb / a[k] (16) * * u'[k] := if a[k] > 0 then ulb / a[k] else ilb / a[k] (17) * * The implied bounds are stored in locations ll and uu. */ static void col_implied_bounds(const struct f_info *f, int n, const double a[], double L, double U, const double l[], const double u[], int k, double *ll, double *uu) { double ilb, iub; xassert(n >= 0); xassert(1 <= k && k <= n); /* determine implied lower bound of term a[k] * x[k] (14) */ if (L == -DBL_MAX || f->f_max == +DBL_MAX) ilb = -DBL_MAX; else if (f->j_max == 0) { if (a[k] > 0.0) { xassert(u[k] != +DBL_MAX); ilb = L - (f->f_max - a[k] * u[k]); } else if (a[k] < 0.0) { xassert(l[k] != -DBL_MAX); ilb = L - (f->f_max - a[k] * l[k]); } else xassert(a != a); } else if (f->j_max == k) ilb = L - f->f_max; else ilb = -DBL_MAX; /* determine implied upper bound of term a[k] * x[k] (15) */ if (U == +DBL_MAX || f->f_min == -DBL_MAX) iub = +DBL_MAX; else if (f->j_min == 0) { if (a[k] > 0.0) { xassert(l[k] != -DBL_MAX); iub = U - (f->f_min - a[k] * l[k]); } else if (a[k] < 0.0) { xassert(u[k] != +DBL_MAX); iub = U - (f->f_min - a[k] * u[k]); } else xassert(a != a); } else if (f->j_min == k) iub = U - f->f_min; else iub = +DBL_MAX; /* determine implied bounds of x[k] (16) and (17) */ #if 1 /* do not use a[k] if it has small magnitude to prevent wrong implied bounds; for example, 1e-15 * x1 >= x2 + x3, where x1 >= -10, x2, x3 >= 0, would lead to wrong conclusion that x1 >= 0 */ if (fabs(a[k]) < 1e-6) *ll = -DBL_MAX, *uu = +DBL_MAX; else #endif if (a[k] > 0.0) { *ll = (ilb == -DBL_MAX ? -DBL_MAX : ilb / a[k]); *uu = (iub == +DBL_MAX ? +DBL_MAX : iub / a[k]); } else if (a[k] < 0.0) { *ll = (iub == +DBL_MAX ? -DBL_MAX : iub / a[k]); *uu = (ilb == -DBL_MAX ? +DBL_MAX : ilb / a[k]); } else xassert(a != a); return; } /*********************************************************************** * check_row_bounds - check and relax original row bounds * * Given a row (constraint) * * n * L <= sum a[j] * x[j] <= U * j=1 * * and bounds of columns (variables) * * l[j] <= x[j] <= u[j] * * this routine checks the original row bounds L and U for feasibility * and redundancy. If the original lower bound L or/and upper bound U * cannot be active due to bounds of variables, the routine remove them * replacing by -inf or/and +inf, respectively. * * If no primal infeasibility is detected, the routine returns zero, * otherwise non-zero. */ static int check_row_bounds(const struct f_info *f, double *L_, double *U_) { int ret = 0; double L = *L_, U = *U_, LL, UU; /* determine implied bounds of the row */ row_implied_bounds(f, &LL, &UU); /* check if the original lower bound is infeasible */ if (L != -DBL_MAX) { double eps = 1e-3 * (1.0 + fabs(L)); if (UU < L - eps) { ret = 1; goto done; } } /* check if the original upper bound is infeasible */ if (U != +DBL_MAX) { double eps = 1e-3 * (1.0 + fabs(U)); if (LL > U + eps) { ret = 1; goto done; } } /* check if the original lower bound is redundant */ if (L != -DBL_MAX) { double eps = 1e-12 * (1.0 + fabs(L)); if (LL > L - eps) { /* it cannot be active, so remove it */ *L_ = -DBL_MAX; } } /* check if the original upper bound is redundant */ if (U != +DBL_MAX) { double eps = 1e-12 * (1.0 + fabs(U)); if (UU < U + eps) { /* it cannot be active, so remove it */ *U_ = +DBL_MAX; } } done: return ret; } /*********************************************************************** * check_col_bounds - check and tighten original column bounds * * Given a row (constraint) * * n * L <= sum a[j] * x[j] <= U * j=1 * * and bounds of columns (variables) * * l[j] <= x[j] <= u[j] * * for column (variable) x[j] this routine checks the original column * bounds l[j] and u[j] for feasibility and redundancy. If the original * lower bound l[j] or/and upper bound u[j] cannot be active due to * bounds of the constraint and other variables, the routine tighten * them replacing by corresponding implied bounds, if possible. * * NOTE: It is assumed that if L != -inf, the row lower bound can be * active, and if U != +inf, the row upper bound can be active. * * The flag means that variable x[j] is required to be integer. * * New actual bounds for x[j] are stored in locations lj and uj. * * If no primal infeasibility is detected, the routine returns zero, * otherwise non-zero. */ static int check_col_bounds(const struct f_info *f, int n, const double a[], double L, double U, const double l[], const double u[], int flag, int j, double *_lj, double *_uj) { int ret = 0; double lj, uj, ll, uu; xassert(n >= 0); xassert(1 <= j && j <= n); lj = l[j], uj = u[j]; /* determine implied bounds of the column */ col_implied_bounds(f, n, a, L, U, l, u, j, &ll, &uu); /* if x[j] is integral, round its implied bounds */ if (flag) { if (ll != -DBL_MAX) ll = (ll - floor(ll) < 1e-3 ? floor(ll) : ceil(ll)); if (uu != +DBL_MAX) uu = (ceil(uu) - uu < 1e-3 ? ceil(uu) : floor(uu)); } /* check if the original lower bound is infeasible */ if (lj != -DBL_MAX) { double eps = 1e-3 * (1.0 + fabs(lj)); if (uu < lj - eps) { ret = 1; goto done; } } /* check if the original upper bound is infeasible */ if (uj != +DBL_MAX) { double eps = 1e-3 * (1.0 + fabs(uj)); if (ll > uj + eps) { ret = 1; goto done; } } /* check if the original lower bound is redundant */ if (ll != -DBL_MAX) { double eps = 1e-3 * (1.0 + fabs(ll)); if (lj < ll - eps) { /* it cannot be active, so tighten it */ lj = ll; } } /* check if the original upper bound is redundant */ if (uu != +DBL_MAX) { double eps = 1e-3 * (1.0 + fabs(uu)); if (uj > uu + eps) { /* it cannot be active, so tighten it */ uj = uu; } } /* due to round-off errors it may happen that lj > uj (although lj < uj + eps, since no primal infeasibility is detected), so adjuct the new actual bounds to provide lj <= uj */ if (!(lj == -DBL_MAX || uj == +DBL_MAX)) { double t1 = fabs(lj), t2 = fabs(uj); double eps = 1e-10 * (1.0 + (t1 <= t2 ? t1 : t2)); if (lj > uj - eps) { if (lj == l[j]) uj = lj; else if (uj == u[j]) lj = uj; else if (t1 <= t2) uj = lj; else lj = uj; } } *_lj = lj, *_uj = uj; done: return ret; } /*********************************************************************** * check_efficiency - check if change in column bounds is efficient * * Given the original bounds of a column l and u and its new actual * bounds l' and u' (possibly tighten by the routine check_col_bounds) * this routine checks if the change in the column bounds is efficient * enough. If so, the routine returns non-zero, otherwise zero. * * The flag means that the variable is required to be integer. */ static int check_efficiency(int flag, double l, double u, double ll, double uu) { int eff = 0; /* check efficiency for lower bound */ if (l < ll) { if (flag || l == -DBL_MAX) eff++; else { double r; if (u == +DBL_MAX) r = 1.0 + fabs(l); else r = 1.0 + (u - l); if (ll - l >= 0.25 * r) eff++; } } /* check efficiency for upper bound */ if (u > uu) { if (flag || u == +DBL_MAX) eff++; else { double r; if (l == -DBL_MAX) r = 1.0 + fabs(u); else r = 1.0 + (u - l); if (u - uu >= 0.25 * r) eff++; } } return eff; } /*********************************************************************** * basic_preprocessing - perform basic preprocessing * * This routine performs basic preprocessing of the specified MIP that * includes relaxing some row bounds and tightening some column bounds. * * On entry the arrays L and U contains original row bounds, and the * arrays l and u contains original column bounds: * * L[0] is the lower bound of the objective row; * L[i], i = 1,...,m, is the lower bound of i-th row; * U[0] is the upper bound of the objective row; * U[i], i = 1,...,m, is the upper bound of i-th row; * l[0] is not used; * l[j], j = 1,...,n, is the lower bound of j-th column; * u[0] is not used; * u[j], j = 1,...,n, is the upper bound of j-th column. * * On exit the arrays L, U, l, and u contain new actual bounds of rows * and column in the same locations. * * The parameters nrs and num specify an initial list of rows to be * processed: * * nrs is the number of rows in the initial list, 0 <= nrs <= m+1; * num[0] is not used; * num[1,...,nrs] are row numbers (0 means the objective row). * * The parameter max_pass specifies the maximal number of times that * each row can be processed, max_pass > 0. * * If no primal infeasibility is detected, the routine returns zero, * otherwise non-zero. */ static int basic_preprocessing(glp_prob *mip, double L[], double U[], double l[], double u[], int nrs, const int num[], int max_pass) { int m = mip->m; int n = mip->n; struct f_info f; int i, j, k, len, size, ret = 0; int *ind, *list, *mark, *pass; double *val, *lb, *ub; xassert(0 <= nrs && nrs <= m+1); xassert(max_pass > 0); /* allocate working arrays */ ind = xcalloc(1+n, sizeof(int)); list = xcalloc(1+m+1, sizeof(int)); mark = xcalloc(1+m+1, sizeof(int)); memset(&mark[0], 0, (m+1) * sizeof(int)); pass = xcalloc(1+m+1, sizeof(int)); memset(&pass[0], 0, (m+1) * sizeof(int)); val = xcalloc(1+n, sizeof(double)); lb = xcalloc(1+n, sizeof(double)); ub = xcalloc(1+n, sizeof(double)); /* initialize the list of rows to be processed */ size = 0; for (k = 1; k <= nrs; k++) { i = num[k]; xassert(0 <= i && i <= m); /* duplicate row numbers are not allowed */ xassert(!mark[i]); list[++size] = i, mark[i] = 1; } xassert(size == nrs); /* process rows in the list until it becomes empty */ while (size > 0) { /* get a next row from the list */ i = list[size--], mark[i] = 0; /* increase the row processing count */ pass[i]++; /* if the row is free, skip it */ if (L[i] == -DBL_MAX && U[i] == +DBL_MAX) continue; /* obtain coefficients of the row */ len = 0; if (i == 0) { for (j = 1; j <= n; j++) { GLPCOL *col = mip->col[j]; if (col->coef != 0.0) len++, ind[len] = j, val[len] = col->coef; } } else { GLPROW *row = mip->row[i]; GLPAIJ *aij; for (aij = row->ptr; aij != NULL; aij = aij->r_next) len++, ind[len] = aij->col->j, val[len] = aij->val; } /* determine lower and upper bounds of columns corresponding to non-zero row coefficients */ for (k = 1; k <= len; k++) j = ind[k], lb[k] = l[j], ub[k] = u[j]; /* prepare the row info to determine implied bounds */ prepare_row_info(len, val, lb, ub, &f); /* check and relax bounds of the row */ if (check_row_bounds(&f, &L[i], &U[i])) { /* the feasible region is empty */ ret = 1; goto done; } /* if the row became free, drop it */ if (L[i] == -DBL_MAX && U[i] == +DBL_MAX) continue; /* process columns having non-zero coefficients in the row */ for (k = 1; k <= len; k++) { GLPCOL *col; int flag, eff; double ll, uu; /* take a next column in the row */ j = ind[k], col = mip->col[j]; flag = col->kind != GLP_CV; /* check and tighten bounds of the column */ if (check_col_bounds(&f, len, val, L[i], U[i], lb, ub, flag, k, &ll, &uu)) { /* the feasible region is empty */ ret = 1; goto done; } /* check if change in the column bounds is efficient */ eff = check_efficiency(flag, l[j], u[j], ll, uu); /* set new actual bounds of the column */ l[j] = ll, u[j] = uu; /* if the change is efficient, add all rows affected by the corresponding column, to the list */ if (eff > 0) { GLPAIJ *aij; for (aij = col->ptr; aij != NULL; aij = aij->c_next) { int ii = aij->row->i; /* if the row was processed maximal number of times, skip it */ if (pass[ii] >= max_pass) continue; /* if the row is free, skip it */ if (L[ii] == -DBL_MAX && U[ii] == +DBL_MAX) continue; /* put the row into the list */ if (mark[ii] == 0) { xassert(size <= m); list[++size] = ii, mark[ii] = 1; } } } } } done: /* free working arrays */ xfree(ind); xfree(list); xfree(mark); xfree(pass); xfree(val); xfree(lb); xfree(ub); return ret; } /*********************************************************************** * NAME * * ios_preprocess_node - preprocess current subproblem * * SYNOPSIS * * #include "glpios.h" * int ios_preprocess_node(glp_tree *tree, int max_pass); * * DESCRIPTION * * The routine ios_preprocess_node performs basic preprocessing of the * current subproblem. * * RETURNS * * If no primal infeasibility is detected, the routine returns zero, * otherwise non-zero. */ int ios_preprocess_node(glp_tree *tree, int max_pass) { glp_prob *mip = tree->mip; int m = mip->m; int n = mip->n; int i, j, nrs, *num, ret = 0; double *L, *U, *l, *u; /* the current subproblem must exist */ xassert(tree->curr != NULL); /* determine original row bounds */ L = xcalloc(1+m, sizeof(double)); U = xcalloc(1+m, sizeof(double)); switch (mip->mip_stat) { case GLP_UNDEF: L[0] = -DBL_MAX, U[0] = +DBL_MAX; break; case GLP_FEAS: switch (mip->dir) { case GLP_MIN: L[0] = -DBL_MAX, U[0] = mip->mip_obj - mip->c0; break; case GLP_MAX: L[0] = mip->mip_obj - mip->c0, U[0] = +DBL_MAX; break; default: xassert(mip != mip); } break; default: xassert(mip != mip); } for (i = 1; i <= m; i++) { L[i] = glp_get_row_lb(mip, i); U[i] = glp_get_row_ub(mip, i); } /* determine original column bounds */ l = xcalloc(1+n, sizeof(double)); u = xcalloc(1+n, sizeof(double)); for (j = 1; j <= n; j++) { l[j] = glp_get_col_lb(mip, j); u[j] = glp_get_col_ub(mip, j); } /* build the initial list of rows to be analyzed */ nrs = m + 1; num = xcalloc(1+nrs, sizeof(int)); for (i = 1; i <= nrs; i++) num[i] = i - 1; /* perform basic preprocessing */ if (basic_preprocessing(mip , L, U, l, u, nrs, num, max_pass)) { ret = 1; goto done; } /* set new actual (relaxed) row bounds */ for (i = 1; i <= m; i++) { /* consider only non-active rows to keep dual feasibility */ if (glp_get_row_stat(mip, i) == GLP_BS) { if (L[i] == -DBL_MAX && U[i] == +DBL_MAX) glp_set_row_bnds(mip, i, GLP_FR, 0.0, 0.0); else if (U[i] == +DBL_MAX) glp_set_row_bnds(mip, i, GLP_LO, L[i], 0.0); else if (L[i] == -DBL_MAX) glp_set_row_bnds(mip, i, GLP_UP, 0.0, U[i]); } } /* set new actual (tightened) column bounds */ for (j = 1; j <= n; j++) { int type; if (l[j] == -DBL_MAX && u[j] == +DBL_MAX) type = GLP_FR; else if (u[j] == +DBL_MAX) type = GLP_LO; else if (l[j] == -DBL_MAX) type = GLP_UP; else if (l[j] != u[j]) type = GLP_DB; else type = GLP_FX; glp_set_col_bnds(mip, j, type, l[j], u[j]); } done: /* free working arrays and return */ xfree(L); xfree(U); xfree(l); xfree(u); xfree(num); return ret; } /* eof */ glpk-5.0/src/draft/glpios03.c0000644000062000006210000014660213766346220015206 0ustar maomkpasswd/* glpios03.c (branch-and-cut driver) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2005-2018 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "ios.h" /*********************************************************************** * show_progress - display current progress of the search * * This routine displays some information about current progress of the * search. * * The information includes: * * the current number of iterations performed by the simplex solver; * * the objective value for the best known integer feasible solution, * which is upper (minimization) or lower (maximization) global bound * for optimal solution of the original mip problem; * * the best local bound for active nodes, which is lower (minimization) * or upper (maximization) global bound for optimal solution of the * original mip problem; * * the relative mip gap, in percents; * * the number of open (active) subproblems; * * the number of completely explored subproblems, i.e. whose nodes have * been removed from the tree. */ static void show_progress(glp_tree *T, int bingo) { int p; double temp; char best_mip[50], best_bound[50], *rho, rel_gap[50]; /* format the best known integer feasible solution */ if (T->mip->mip_stat == GLP_FEAS) sprintf(best_mip, "%17.9e", T->mip->mip_obj); else sprintf(best_mip, "%17s", "not found yet"); /* determine reference number of an active subproblem whose local bound is best */ p = ios_best_node(T); /* format the best bound */ if (p == 0) sprintf(best_bound, "%17s", "tree is empty"); else { temp = T->slot[p].node->bound; if (temp == -DBL_MAX) sprintf(best_bound, "%17s", "-inf"); else if (temp == +DBL_MAX) sprintf(best_bound, "%17s", "+inf"); else { if (fabs(temp) < 1e-9) temp = 0; sprintf(best_bound, "%17.9e", temp); } } /* choose the relation sign between global bounds */ if (T->mip->dir == GLP_MIN) rho = ">="; else if (T->mip->dir == GLP_MAX) rho = "<="; else xassert(T != T); /* format the relative mip gap */ temp = ios_relative_gap(T); if (temp == 0.0) sprintf(rel_gap, " 0.0%%"); else if (temp < 0.001) sprintf(rel_gap, "< 0.1%%"); else if (temp <= 9.999) sprintf(rel_gap, "%5.1f%%", 100.0 * temp); else sprintf(rel_gap, "%6s", ""); /* display progress of the search */ xprintf("+%6d: %s %s %s %s %s (%d; %d)\n", T->mip->it_cnt, bingo ? ">>>>>" : "mip =", best_mip, rho, best_bound, rel_gap, T->a_cnt, T->t_cnt - T->n_cnt); T->tm_lag = xtime(); return; } /*********************************************************************** * is_branch_hopeful - check if specified branch is hopeful * * This routine checks if the specified subproblem can have an integer * optimal solution which is better than the best known one. * * The check is based on comparison of the local objective bound stored * in the subproblem descriptor and the incumbent objective value which * is the global objective bound. * * If there is a chance that the specified subproblem can have a better * integer optimal solution, the routine returns non-zero. Otherwise, if * the corresponding branch can pruned, zero is returned. */ static int is_branch_hopeful(glp_tree *T, int p) { xassert(1 <= p && p <= T->nslots); xassert(T->slot[p].node != NULL); return ios_is_hopeful(T, T->slot[p].node->bound); } /*********************************************************************** * check_integrality - check integrality of basic solution * * This routine checks if the basic solution of LP relaxation of the * current subproblem satisfies to integrality conditions, i.e. that all * variables of integer kind have integral primal values. (The solution * is assumed to be optimal.) * * For each variable of integer kind the routine computes the following * quantity: * * ii(x[j]) = min(x[j] - floor(x[j]), ceil(x[j]) - x[j]), (1) * * which is a measure of the integer infeasibility (non-integrality) of * x[j] (for example, ii(2.1) = 0.1, ii(3.7) = 0.3, ii(5.0) = 0). It is * understood that 0 <= ii(x[j]) <= 0.5, and variable x[j] is integer * feasible if ii(x[j]) = 0. However, due to floating-point arithmetic * the routine checks less restrictive condition: * * ii(x[j]) <= tol_int, (2) * * where tol_int is a given tolerance (small positive number) and marks * each variable which does not satisfy to (2) as integer infeasible by * setting its fractionality flag. * * In order to characterize integer infeasibility of the basic solution * in the whole the routine computes two parameters: ii_cnt, which is * the number of variables with the fractionality flag set, and ii_sum, * which is the sum of integer infeasibilities (1). */ static void check_integrality(glp_tree *T) { glp_prob *mip = T->mip; int j, type, ii_cnt = 0; double lb, ub, x, temp1, temp2, ii_sum = 0.0; /* walk through the set of columns (structural variables) */ for (j = 1; j <= mip->n; j++) { GLPCOL *col = mip->col[j]; T->non_int[j] = 0; /* if the column is not integer, skip it */ if (col->kind != GLP_IV) continue; /* if the column is non-basic, it is integer feasible */ if (col->stat != GLP_BS) continue; /* obtain the type and bounds of the column */ type = col->type, lb = col->lb, ub = col->ub; /* obtain value of the column in optimal basic solution */ x = col->prim; /* if the column's primal value is close to the lower bound, the column is integer feasible within given tolerance */ if (type == GLP_LO || type == GLP_DB || type == GLP_FX) { temp1 = lb - T->parm->tol_int; temp2 = lb + T->parm->tol_int; if (temp1 <= x && x <= temp2) continue; #if 0 /* the lower bound must not be violated */ xassert(x >= lb); #else if (x < lb) continue; #endif } /* if the column's primal value is close to the upper bound, the column is integer feasible within given tolerance */ if (type == GLP_UP || type == GLP_DB || type == GLP_FX) { temp1 = ub - T->parm->tol_int; temp2 = ub + T->parm->tol_int; if (temp1 <= x && x <= temp2) continue; #if 0 /* the upper bound must not be violated */ xassert(x <= ub); #else if (x > ub) continue; #endif } /* if the column's primal value is close to nearest integer, the column is integer feasible within given tolerance */ temp1 = floor(x + 0.5) - T->parm->tol_int; temp2 = floor(x + 0.5) + T->parm->tol_int; if (temp1 <= x && x <= temp2) continue; /* otherwise the column is integer infeasible */ T->non_int[j] = 1; /* increase the number of fractional-valued columns */ ii_cnt++; /* compute the sum of integer infeasibilities */ temp1 = x - floor(x); temp2 = ceil(x) - x; xassert(temp1 > 0.0 && temp2 > 0.0); ii_sum += (temp1 <= temp2 ? temp1 : temp2); } /* store ii_cnt and ii_sum to the current problem descriptor */ xassert(T->curr != NULL); T->curr->ii_cnt = ii_cnt; T->curr->ii_sum = ii_sum; /* and also display these parameters */ if (T->parm->msg_lev >= GLP_MSG_DBG) { if (ii_cnt == 0) xprintf("There are no fractional columns\n"); else if (ii_cnt == 1) xprintf("There is one fractional column, integer infeasibil" "ity is %.3e\n", ii_sum); else xprintf("There are %d fractional columns, integer infeasibi" "lity is %.3e\n", ii_cnt, ii_sum); } return; } /*********************************************************************** * record_solution - record better integer feasible solution * * This routine records optimal basic solution of LP relaxation of the * current subproblem, which being integer feasible is better than the * best known integer feasible solution. */ static void record_solution(glp_tree *T) { glp_prob *mip = T->mip; int i, j; mip->mip_stat = GLP_FEAS; mip->mip_obj = mip->obj_val; for (i = 1; i <= mip->m; i++) { GLPROW *row = mip->row[i]; row->mipx = row->prim; } for (j = 1; j <= mip->n; j++) { GLPCOL *col = mip->col[j]; if (col->kind == GLP_CV) col->mipx = col->prim; else if (col->kind == GLP_IV) { /* value of the integer column must be integral */ col->mipx = floor(col->prim + 0.5); } else xassert(col != col); } T->sol_cnt++; return; } /*********************************************************************** * fix_by_red_cost - fix non-basic integer columns by reduced costs * * This routine fixes some non-basic integer columns if their reduced * costs indicate that increasing (decreasing) the column at least by * one involves the objective value becoming worse than the incumbent * objective value. */ static void fix_by_red_cost(glp_tree *T) { glp_prob *mip = T->mip; int j, stat, fixed = 0; double obj, lb, ub, dj; /* the global bound must exist */ xassert(T->mip->mip_stat == GLP_FEAS); /* basic solution of LP relaxation must be optimal */ xassert(mip->pbs_stat == GLP_FEAS && mip->dbs_stat == GLP_FEAS); /* determine the objective function value */ obj = mip->obj_val; /* walk through the column list */ for (j = 1; j <= mip->n; j++) { GLPCOL *col = mip->col[j]; /* if the column is not integer, skip it */ if (col->kind != GLP_IV) continue; /* obtain bounds of j-th column */ lb = col->lb, ub = col->ub; /* and determine its status and reduced cost */ stat = col->stat, dj = col->dual; /* analyze the reduced cost */ switch (mip->dir) { case GLP_MIN: /* minimization */ if (stat == GLP_NL) { /* j-th column is non-basic on its lower bound */ if (dj < 0.0) dj = 0.0; if (obj + dj >= mip->mip_obj) glp_set_col_bnds(mip, j, GLP_FX, lb, lb), fixed++; } else if (stat == GLP_NU) { /* j-th column is non-basic on its upper bound */ if (dj > 0.0) dj = 0.0; if (obj - dj >= mip->mip_obj) glp_set_col_bnds(mip, j, GLP_FX, ub, ub), fixed++; } break; case GLP_MAX: /* maximization */ if (stat == GLP_NL) { /* j-th column is non-basic on its lower bound */ if (dj > 0.0) dj = 0.0; if (obj + dj <= mip->mip_obj) glp_set_col_bnds(mip, j, GLP_FX, lb, lb), fixed++; } else if (stat == GLP_NU) { /* j-th column is non-basic on its upper bound */ if (dj < 0.0) dj = 0.0; if (obj - dj <= mip->mip_obj) glp_set_col_bnds(mip, j, GLP_FX, ub, ub), fixed++; } break; default: xassert(T != T); } } if (T->parm->msg_lev >= GLP_MSG_DBG) { if (fixed == 0) /* nothing to say */; else if (fixed == 1) xprintf("One column has been fixed by reduced cost\n"); else xprintf("%d columns have been fixed by reduced costs\n", fixed); } /* fixing non-basic columns on their current bounds does not change the basic solution */ xassert(mip->pbs_stat == GLP_FEAS && mip->dbs_stat == GLP_FEAS); return; } /*********************************************************************** * branch_on - perform branching on specified variable * * This routine performs branching on j-th column (structural variable) * of the current subproblem. The specified column must be of integer * kind and must have a fractional value in optimal basic solution of * LP relaxation of the current subproblem (i.e. only columns for which * the flag non_int[j] is set are valid candidates to branch on). * * Let x be j-th structural variable, and beta be its primal fractional * value in the current basic solution. Branching on j-th variable is * dividing the current subproblem into two new subproblems, which are * identical to the current subproblem with the following exception: in * the first subproblem that begins the down-branch x has a new upper * bound x <= floor(beta), and in the second subproblem that begins the * up-branch x has a new lower bound x >= ceil(beta). * * Depending on estimation of local bounds for down- and up-branches * this routine returns the following: * * 0 - both branches have been created; * 1 - one branch is hopeless and has been pruned, so now the current * subproblem is other branch; * 2 - both branches are hopeless and have been pruned; new subproblem * selection is needed to continue the search. */ static int branch_on(glp_tree *T, int j, int next) { glp_prob *mip = T->mip; IOSNPD *node; int m = mip->m; int n = mip->n; int type, dn_type, up_type, dn_bad, up_bad, p, ret, clone[1+2]; double lb, ub, beta, new_ub, new_lb, dn_lp, up_lp, dn_bnd, up_bnd; /* determine bounds and value of x[j] in optimal solution to LP relaxation of the current subproblem */ xassert(1 <= j && j <= n); type = mip->col[j]->type; lb = mip->col[j]->lb; ub = mip->col[j]->ub; beta = mip->col[j]->prim; /* determine new bounds of x[j] for down- and up-branches */ new_ub = floor(beta); new_lb = ceil(beta); switch (type) { case GLP_FR: dn_type = GLP_UP; up_type = GLP_LO; break; case GLP_LO: xassert(lb <= new_ub); dn_type = (lb == new_ub ? GLP_FX : GLP_DB); xassert(lb + 1.0 <= new_lb); up_type = GLP_LO; break; case GLP_UP: xassert(new_ub <= ub - 1.0); dn_type = GLP_UP; xassert(new_lb <= ub); up_type = (new_lb == ub ? GLP_FX : GLP_DB); break; case GLP_DB: xassert(lb <= new_ub && new_ub <= ub - 1.0); dn_type = (lb == new_ub ? GLP_FX : GLP_DB); xassert(lb + 1.0 <= new_lb && new_lb <= ub); up_type = (new_lb == ub ? GLP_FX : GLP_DB); break; default: xassert(type != type); } /* compute local bounds to LP relaxation for both branches */ ios_eval_degrad(T, j, &dn_lp, &up_lp); /* and improve them by rounding */ dn_bnd = ios_round_bound(T, dn_lp); up_bnd = ios_round_bound(T, up_lp); /* check local bounds for down- and up-branches */ dn_bad = !ios_is_hopeful(T, dn_bnd); up_bad = !ios_is_hopeful(T, up_bnd); if (dn_bad && up_bad) { if (T->parm->msg_lev >= GLP_MSG_DBG) xprintf("Both down- and up-branches are hopeless\n"); ret = 2; goto done; } else if (up_bad) { if (T->parm->msg_lev >= GLP_MSG_DBG) xprintf("Up-branch is hopeless\n"); glp_set_col_bnds(mip, j, dn_type, lb, new_ub); T->curr->lp_obj = dn_lp; if (mip->dir == GLP_MIN) { if (T->curr->bound < dn_bnd) T->curr->bound = dn_bnd; } else if (mip->dir == GLP_MAX) { if (T->curr->bound > dn_bnd) T->curr->bound = dn_bnd; } else xassert(mip != mip); ret = 1; goto done; } else if (dn_bad) { if (T->parm->msg_lev >= GLP_MSG_DBG) xprintf("Down-branch is hopeless\n"); glp_set_col_bnds(mip, j, up_type, new_lb, ub); T->curr->lp_obj = up_lp; if (mip->dir == GLP_MIN) { if (T->curr->bound < up_bnd) T->curr->bound = up_bnd; } else if (mip->dir == GLP_MAX) { if (T->curr->bound > up_bnd) T->curr->bound = up_bnd; } else xassert(mip != mip); ret = 1; goto done; } /* both down- and up-branches seem to be hopeful */ if (T->parm->msg_lev >= GLP_MSG_DBG) xprintf("Branching on column %d, primal value is %.9e\n", j, beta); /* determine the reference number of the current subproblem */ xassert(T->curr != NULL); p = T->curr->p; T->curr->br_var = j; T->curr->br_val = beta; /* freeze the current subproblem */ ios_freeze_node(T); /* create two clones of the current subproblem; the first clone begins the down-branch, the second one begins the up-branch */ ios_clone_node(T, p, 2, clone); if (T->parm->msg_lev >= GLP_MSG_DBG) xprintf("Node %d begins down branch, node %d begins up branch " "\n", clone[1], clone[2]); /* set new upper bound of j-th column in the down-branch */ node = T->slot[clone[1]].node; xassert(node != NULL); xassert(node->up != NULL); xassert(node->b_ptr == NULL); node->b_ptr = dmp_get_atom(T->pool, sizeof(IOSBND)); node->b_ptr->k = m + j; node->b_ptr->type = (unsigned char)dn_type; node->b_ptr->lb = lb; node->b_ptr->ub = new_ub; node->b_ptr->next = NULL; node->lp_obj = dn_lp; if (mip->dir == GLP_MIN) { if (node->bound < dn_bnd) node->bound = dn_bnd; } else if (mip->dir == GLP_MAX) { if (node->bound > dn_bnd) node->bound = dn_bnd; } else xassert(mip != mip); /* set new lower bound of j-th column in the up-branch */ node = T->slot[clone[2]].node; xassert(node != NULL); xassert(node->up != NULL); xassert(node->b_ptr == NULL); node->b_ptr = dmp_get_atom(T->pool, sizeof(IOSBND)); node->b_ptr->k = m + j; node->b_ptr->type = (unsigned char)up_type; node->b_ptr->lb = new_lb; node->b_ptr->ub = ub; node->b_ptr->next = NULL; node->lp_obj = up_lp; if (mip->dir == GLP_MIN) { if (node->bound < up_bnd) node->bound = up_bnd; } else if (mip->dir == GLP_MAX) { if (node->bound > up_bnd) node->bound = up_bnd; } else xassert(mip != mip); /* suggest the subproblem to be solved next */ xassert(T->child == 0); if (next == GLP_NO_BRNCH) T->child = 0; else if (next == GLP_DN_BRNCH) T->child = clone[1]; else if (next == GLP_UP_BRNCH) T->child = clone[2]; else xassert(next != next); ret = 0; done: return ret; } /*********************************************************************** * cleanup_the_tree - prune hopeless branches from the tree * * This routine walks through the active list and checks the local * bound for every active subproblem. If the local bound indicates that * the subproblem cannot have integer optimal solution better than the * incumbent objective value, the routine deletes such subproblem that, * in turn, involves pruning the corresponding branch of the tree. */ static void cleanup_the_tree(glp_tree *T) { IOSNPD *node, *next_node; int count = 0; /* the global bound must exist */ xassert(T->mip->mip_stat == GLP_FEAS); /* walk through the list of active subproblems */ for (node = T->head; node != NULL; node = next_node) { /* deleting some active problem node may involve deleting its parents recursively; however, all its parents being created *before* it are always *precede* it in the node list, so the next problem node is never affected by such deletion */ next_node = node->next; /* if the branch is hopeless, prune it */ if (!is_branch_hopeful(T, node->p)) ios_delete_node(T, node->p), count++; } if (T->parm->msg_lev >= GLP_MSG_DBG) { if (count == 1) xprintf("One hopeless branch has been pruned\n"); else if (count > 1) xprintf("%d hopeless branches have been pruned\n", count); } return; } /*********************************************************************** * round_heur - simple rounding heuristic * * This routine attempts to guess an integer feasible solution by * simple rounding values of all integer variables in basic solution to * nearest integers. */ static int round_heur(glp_tree *T) { glp_prob *P = T->mip; /*int m = P->m;*/ int n = P->n; int i, j, ret; double *x; /* compute rounded values of variables */ x = talloc(1+n, double); for (j = 1; j <= n; j++) { GLPCOL *col = P->col[j]; if (col->kind == GLP_IV) { /* integer variable */ x[j] = floor(col->prim + 0.5); } else if (col->type == GLP_FX) { /* fixed variable */ x[j] = col->prim; } else { /* non-integer non-fixed variable */ ret = 3; goto done; } } /* check that no constraints are violated */ for (i = 1; i <= T->orig_m; i++) { int type = T->orig_type[i]; GLPAIJ *aij; double sum; if (type == GLP_FR) continue; /* compute value of linear form */ sum = 0.0; for (aij = P->row[i]->ptr; aij != NULL; aij = aij->r_next) sum += aij->val * x[aij->col->j]; /* check lower bound */ if (type == GLP_LO || type == GLP_DB || type == GLP_FX) { if (sum < T->orig_lb[i] - 1e-9) { /* lower bound is violated */ ret = 2; goto done; } } /* check upper bound */ if (type == GLP_UP || type == GLP_DB || type == GLP_FX) { if (sum > T->orig_ub[i] + 1e-9) { /* upper bound is violated */ ret = 2; goto done; } } } /* rounded solution is integer feasible */ if (glp_ios_heur_sol(T, x) == 0) { /* solution is accepted */ ret = 0; } else { /* solution is rejected */ ret = 1; } done: tfree(x); return ret; } /**********************************************************************/ #if 1 /* 08/III-2016 */ static void gmi_gen(glp_tree *T) { /* generate Gomory's mixed integer cuts */ glp_prob *P, *pool; P = T->mip; pool = glp_create_prob(); glp_add_cols(pool, P->n); glp_gmi_gen(P, pool, 50); if (pool->m > 0) { int i, len, *ind; double *val; ind = xcalloc(1+P->n, sizeof(int)); val = xcalloc(1+P->n, sizeof(double)); for (i = 1; i <= pool->m; i++) { len = glp_get_mat_row(pool, i, ind, val); glp_ios_add_row(T, NULL, GLP_RF_GMI, 0, len, ind, val, GLP_LO, pool->row[i]->lb); } xfree(ind); xfree(val); } glp_delete_prob(pool); return; } #endif #ifdef NEW_COVER /* 13/II-2018 */ static void cov_gen(glp_tree *T) { /* generate cover cuts */ glp_prob *P, *pool; if (T->cov_gen == NULL) return; P = T->mip; pool = glp_create_prob(); glp_add_cols(pool, P->n); glp_cov_gen1(P, T->cov_gen, pool); if (pool->m > 0) { int i, len, *ind; double *val; ind = xcalloc(1+P->n, sizeof(int)); val = xcalloc(1+P->n, sizeof(double)); for (i = 1; i <= pool->m; i++) { len = glp_get_mat_row(pool, i, ind, val); glp_ios_add_row(T, NULL, GLP_RF_COV, 0, len, ind, val, GLP_UP, pool->row[i]->ub); } xfree(ind); xfree(val); } glp_delete_prob(pool); return; } #endif #if 1 /* 08/III-2016 */ static void mir_gen(glp_tree *T) { /* generate mixed integer rounding cuts */ glp_prob *P, *pool; P = T->mip; pool = glp_create_prob(); glp_add_cols(pool, P->n); glp_mir_gen(P, T->mir_gen, pool); if (pool->m > 0) { int i, len, *ind; double *val; ind = xcalloc(1+P->n, sizeof(int)); val = xcalloc(1+P->n, sizeof(double)); for (i = 1; i <= pool->m; i++) { len = glp_get_mat_row(pool, i, ind, val); glp_ios_add_row(T, NULL, GLP_RF_MIR, 0, len, ind, val, GLP_UP, pool->row[i]->ub); } xfree(ind); xfree(val); } glp_delete_prob(pool); return; } #endif #if 1 /* 08/III-2016 */ static void clq_gen(glp_tree *T, glp_cfg *G) { /* generate clique cut from conflict graph */ glp_prob *P = T->mip; int n = P->n; int len, *ind; double *val; ind = talloc(1+n, int); val = talloc(1+n, double); len = glp_clq_cut(T->mip, G, ind, val); if (len > 0) glp_ios_add_row(T, NULL, GLP_RF_CLQ, 0, len, ind, val, GLP_UP, val[0]); tfree(ind); tfree(val); return; } #endif static void generate_cuts(glp_tree *T) { /* generate generic cuts with built-in generators */ if (!(T->parm->mir_cuts == GLP_ON || T->parm->gmi_cuts == GLP_ON || T->parm->cov_cuts == GLP_ON || T->parm->clq_cuts == GLP_ON)) goto done; #if 1 /* 20/IX-2008 */ { int i, max_cuts, added_cuts; max_cuts = T->n; if (max_cuts < 1000) max_cuts = 1000; added_cuts = 0; for (i = T->orig_m+1; i <= T->mip->m; i++) { if (T->mip->row[i]->origin == GLP_RF_CUT) added_cuts++; } /* xprintf("added_cuts = %d\n", added_cuts); */ if (added_cuts >= max_cuts) goto done; } #endif /* generate and add to POOL all cuts violated by x* */ if (T->parm->gmi_cuts == GLP_ON) { if (T->curr->changed < 7) #if 0 /* 08/III-2016 */ ios_gmi_gen(T); #else gmi_gen(T); #endif } if (T->parm->mir_cuts == GLP_ON) { xassert(T->mir_gen != NULL); #if 0 /* 08/III-2016 */ ios_mir_gen(T, T->mir_gen); #else mir_gen(T); #endif } if (T->parm->cov_cuts == GLP_ON) { /* cover cuts works well along with mir cuts */ #ifdef NEW_COVER /* 13/II-2018 */ cov_gen(T); #else ios_cov_gen(T); #endif } if (T->parm->clq_cuts == GLP_ON) { if (T->clq_gen != NULL) #if 0 /* 29/VI-2013 */ { if (T->curr->level == 0 && T->curr->changed < 50 || T->curr->level > 0 && T->curr->changed < 5) #else /* FIXME */ { if (T->curr->level == 0 && T->curr->changed < 500 || T->curr->level > 0 && T->curr->changed < 50) #endif #if 0 /* 08/III-2016 */ ios_clq_gen(T, T->clq_gen); #else clq_gen(T, T->clq_gen); #endif } } done: return; } /**********************************************************************/ static void remove_cuts(glp_tree *T) { /* remove inactive cuts (some valueable globally valid cut might be saved in the global cut pool) */ int i, cnt = 0, *num = NULL; xassert(T->curr != NULL); for (i = T->orig_m+1; i <= T->mip->m; i++) { if (T->mip->row[i]->origin == GLP_RF_CUT && T->mip->row[i]->level == T->curr->level && T->mip->row[i]->stat == GLP_BS) { if (num == NULL) num = xcalloc(1+T->mip->m, sizeof(int)); num[++cnt] = i; } } if (cnt > 0) { glp_del_rows(T->mip, cnt, num); #if 0 xprintf("%d inactive cut(s) removed\n", cnt); #endif xfree(num); xassert(glp_factorize(T->mip) == 0); } return; } /**********************************************************************/ static void display_cut_info(glp_tree *T) { glp_prob *mip = T->mip; int i, gmi = 0, mir = 0, cov = 0, clq = 0, app = 0; for (i = mip->m; i > 0; i--) { GLPROW *row; row = mip->row[i]; /* if (row->level < T->curr->level) break; */ if (row->origin == GLP_RF_CUT) { if (row->klass == GLP_RF_GMI) gmi++; else if (row->klass == GLP_RF_MIR) mir++; else if (row->klass == GLP_RF_COV) cov++; else if (row->klass == GLP_RF_CLQ) clq++; else app++; } } xassert(T->curr != NULL); if (gmi + mir + cov + clq + app > 0) { xprintf("Cuts on level %d:", T->curr->level); if (gmi > 0) xprintf(" gmi = %d;", gmi); if (mir > 0) xprintf(" mir = %d;", mir); if (cov > 0) xprintf(" cov = %d;", cov); if (clq > 0) xprintf(" clq = %d;", clq); if (app > 0) xprintf(" app = %d;", app); xprintf("\n"); } return; } /*********************************************************************** * NAME * * ios_driver - branch-and-cut driver * * SYNOPSIS * * #include "glpios.h" * int ios_driver(glp_tree *T); * * DESCRIPTION * * The routine ios_driver is a branch-and-cut driver. It controls the * MIP solution process. * * RETURNS * * 0 The MIP problem instance has been successfully solved. This code * does not necessarily mean that the solver has found optimal * solution. It only means that the solution process was successful. * * GLP_EFAIL * The search was prematurely terminated due to the solver failure. * * GLP_EMIPGAP * The search was prematurely terminated, because the relative mip * gap tolerance has been reached. * * GLP_ETMLIM * The search was prematurely terminated, because the time limit has * been exceeded. * * GLP_ESTOP * The search was prematurely terminated by application. */ int ios_driver(glp_tree *T) { int p, curr_p, p_stat, d_stat, ret; #if 1 /* carry out to glp_tree */ int pred_p = 0; /* if the current subproblem has been just created due to branching, pred_p is the reference number of its parent subproblem, otherwise pred_p is zero */ #endif #if 1 /* 18/VII-2013 */ int bad_cut; double old_obj; #endif #if 0 /* 10/VI-2013 */ glp_long ttt = T->tm_beg; #else double ttt = T->tm_beg; #endif #if 1 /* 27/II-2016 by Chris */ int root_done = 0; #endif #if 0 ((glp_iocp *)T->parm)->msg_lev = GLP_MSG_DBG; #endif #if 1 /* 01/III-2018 */ if (((glp_iocp *)T->parm)->flip) if (T->parm->msg_lev >= GLP_MSG_ALL) xprintf("Long-step dual simplex will be used\n"); #endif /* on entry to the B&B driver it is assumed that the active list contains the only active (i.e. root) subproblem, which is the original MIP problem to be solved */ loop: /* main loop starts here */ /* at this point the current subproblem does not exist */ xassert(T->curr == NULL); /* if the active list is empty, the search is finished */ if (T->head == NULL) { if (T->parm->msg_lev >= GLP_MSG_DBG) xprintf("Active list is empty!\n"); #if 0 /* 10/VI-2013 */ xassert(dmp_in_use(T->pool).lo == 0); #else xassert(dmp_in_use(T->pool) == 0); #endif ret = 0; goto done; } /* select some active subproblem to continue the search */ xassert(T->next_p == 0); /* let the application program select subproblem */ if (T->parm->cb_func != NULL) { xassert(T->reason == 0); T->reason = GLP_ISELECT; T->parm->cb_func(T, T->parm->cb_info); T->reason = 0; if (T->stop) { ret = GLP_ESTOP; goto done; } } if (T->next_p != 0) { /* the application program has selected something */ ; } else if (T->a_cnt == 1) { /* the only active subproblem exists, so select it */ xassert(T->head->next == NULL); T->next_p = T->head->p; } else if (T->child != 0) { /* select one of branching childs suggested by the branching heuristic */ T->next_p = T->child; } else { /* select active subproblem as specified by the backtracking technique option */ T->next_p = ios_choose_node(T); } /* the active subproblem just selected becomes current */ ios_revive_node(T, T->next_p); T->next_p = T->child = 0; /* invalidate pred_p, if it is not the reference number of the parent of the current subproblem */ if (T->curr->up != NULL && T->curr->up->p != pred_p) pred_p = 0; /* determine the reference number of the current subproblem */ p = T->curr->p; if (T->parm->msg_lev >= GLP_MSG_DBG) { xprintf("-----------------------------------------------------" "-------------------\n"); xprintf("Processing node %d at level %d\n", p, T->curr->level); } #if 0 if (p == 1) glp_write_lp(T->mip, NULL, "root.lp"); #endif #if 1 /* 24/X-2015 */ if (p == 1) { if (T->parm->sr_heur == GLP_OFF) { if (T->parm->msg_lev >= GLP_MSG_ALL) xprintf("Simple rounding heuristic disabled\n"); } } #endif /* if it is the root subproblem, initialize cut generators */ if (p == 1) { if (T->parm->gmi_cuts == GLP_ON) { if (T->parm->msg_lev >= GLP_MSG_ALL) xprintf("Gomory's cuts enabled\n"); } if (T->parm->mir_cuts == GLP_ON) { if (T->parm->msg_lev >= GLP_MSG_ALL) xprintf("MIR cuts enabled\n"); xassert(T->mir_gen == NULL); #if 0 /* 06/III-2016 */ T->mir_gen = ios_mir_init(T); #else T->mir_gen = glp_mir_init(T->mip); #endif } if (T->parm->cov_cuts == GLP_ON) { if (T->parm->msg_lev >= GLP_MSG_ALL) xprintf("Cover cuts enabled\n"); #ifdef NEW_COVER /* 13/II-2018 */ xassert(T->cov_gen == NULL); T->cov_gen = glp_cov_init(T->mip); #endif } if (T->parm->clq_cuts == GLP_ON) { xassert(T->clq_gen == NULL); if (T->parm->msg_lev >= GLP_MSG_ALL) xprintf("Clique cuts enabled\n"); #if 0 /* 08/III-2016 */ T->clq_gen = ios_clq_init(T); #else T->clq_gen = glp_cfg_init(T->mip); #endif } } #if 1 /* 18/VII-2013 */ bad_cut = 0; #endif more: /* minor loop starts here */ /* at this point the current subproblem needs either to be solved for the first time or re-optimized due to reformulation */ /* display current progress of the search */ if (T->parm->msg_lev >= GLP_MSG_DBG || T->parm->msg_lev >= GLP_MSG_ON && (double)(T->parm->out_frq - 1) <= 1000.0 * xdifftime(xtime(), T->tm_lag)) show_progress(T, 0); if (T->parm->msg_lev >= GLP_MSG_ALL && xdifftime(xtime(), ttt) >= 60.0) #if 0 /* 16/II-2012 */ { glp_long total; glp_mem_usage(NULL, NULL, &total, NULL); xprintf("Time used: %.1f secs. Memory used: %.1f Mb.\n", xdifftime(xtime(), T->tm_beg), xltod(total) / 1048576.0); ttt = xtime(); } #else { size_t total; glp_mem_usage(NULL, NULL, &total, NULL); xprintf("Time used: %.1f secs. Memory used: %.1f Mb.\n", xdifftime(xtime(), T->tm_beg), (double)total / 1048576.0); ttt = xtime(); } #endif /* check the mip gap */ if (T->parm->mip_gap > 0.0 && ios_relative_gap(T) <= T->parm->mip_gap) { if (T->parm->msg_lev >= GLP_MSG_DBG) xprintf("Relative gap tolerance reached; search terminated " "\n"); ret = GLP_EMIPGAP; goto done; } /* check if the time limit has been exhausted */ if (T->parm->tm_lim < INT_MAX && (double)(T->parm->tm_lim - 1) <= 1000.0 * xdifftime(xtime(), T->tm_beg)) { if (T->parm->msg_lev >= GLP_MSG_DBG) xprintf("Time limit exhausted; search terminated\n"); ret = GLP_ETMLIM; goto done; } /* let the application program preprocess the subproblem */ if (T->parm->cb_func != NULL) { xassert(T->reason == 0); T->reason = GLP_IPREPRO; T->parm->cb_func(T, T->parm->cb_info); T->reason = 0; if (T->stop) { ret = GLP_ESTOP; goto done; } } /* perform basic preprocessing */ if (T->parm->pp_tech == GLP_PP_NONE) ; else if (T->parm->pp_tech == GLP_PP_ROOT) #if 0 /* 27/II-2016 by Chris */ { if (T->curr->level == 0) #else { if (!root_done) #endif { if (ios_preprocess_node(T, 100)) goto fath; } } else if (T->parm->pp_tech == GLP_PP_ALL) #if 0 /* 27/II-2016 by Chris */ { if (ios_preprocess_node(T, T->curr->level == 0 ? 100 : 10)) #else { if (ios_preprocess_node(T, !root_done ? 100 : 10)) #endif goto fath; } else xassert(T != T); /* preprocessing may improve the global bound */ if (!is_branch_hopeful(T, p)) { xprintf("*** not tested yet ***\n"); goto fath; } /* solve LP relaxation of the current subproblem */ if (T->parm->msg_lev >= GLP_MSG_DBG) xprintf("Solving LP relaxation...\n"); ret = ios_solve_node(T); if (ret == GLP_ETMLIM) goto done; else if (!(ret == 0 || ret == GLP_EOBJLL || ret == GLP_EOBJUL)) { if (T->parm->msg_lev >= GLP_MSG_ERR) xprintf("ios_driver: unable to solve current LP relaxation;" " glp_simplex returned %d\n", ret); ret = GLP_EFAIL; goto done; } /* analyze status of the basic solution to LP relaxation found */ p_stat = T->mip->pbs_stat; d_stat = T->mip->dbs_stat; if (p_stat == GLP_FEAS && d_stat == GLP_FEAS) { /* LP relaxation has optimal solution */ if (T->parm->msg_lev >= GLP_MSG_DBG) xprintf("Found optimal solution to LP relaxation\n"); } else if (d_stat == GLP_NOFEAS) { /* LP relaxation has no dual feasible solution */ /* since the current subproblem cannot have a larger feasible region than its parent, there is something wrong */ if (T->parm->msg_lev >= GLP_MSG_ERR) xprintf("ios_driver: current LP relaxation has no dual feas" "ible solution\n"); ret = GLP_EFAIL; goto done; } else if (p_stat == GLP_INFEAS && d_stat == GLP_FEAS) { /* LP relaxation has no primal solution which is better than the incumbent objective value */ xassert(T->mip->mip_stat == GLP_FEAS); if (T->parm->msg_lev >= GLP_MSG_DBG) xprintf("LP relaxation has no solution better than incumben" "t objective value\n"); /* prune the branch */ goto fath; } else if (p_stat == GLP_NOFEAS) { /* LP relaxation has no primal feasible solution */ if (T->parm->msg_lev >= GLP_MSG_DBG) xprintf("LP relaxation has no feasible solution\n"); /* prune the branch */ goto fath; } else { /* other cases cannot appear */ xassert(T->mip != T->mip); } /* at this point basic solution to LP relaxation of the current subproblem is optimal */ xassert(p_stat == GLP_FEAS && d_stat == GLP_FEAS); xassert(T->curr != NULL); T->curr->lp_obj = T->mip->obj_val; /* thus, it defines a local bound to integer optimal solution of the current subproblem */ { double bound = T->mip->obj_val; /* some local bound to the current subproblem could be already set before, so we should only improve it */ bound = ios_round_bound(T, bound); if (T->mip->dir == GLP_MIN) { if (T->curr->bound < bound) T->curr->bound = bound; } else if (T->mip->dir == GLP_MAX) { if (T->curr->bound > bound) T->curr->bound = bound; } else xassert(T->mip != T->mip); if (T->parm->msg_lev >= GLP_MSG_DBG) xprintf("Local bound is %.9e\n", bound); } /* if the local bound indicates that integer optimal solution of the current subproblem cannot be better than the global bound, prune the branch */ if (!is_branch_hopeful(T, p)) { if (T->parm->msg_lev >= GLP_MSG_DBG) xprintf("Current branch is hopeless and can be pruned\n"); goto fath; } /* let the application program generate additional rows ("lazy" constraints) */ xassert(T->reopt == 0); xassert(T->reinv == 0); if (T->parm->cb_func != NULL) { xassert(T->reason == 0); T->reason = GLP_IROWGEN; T->parm->cb_func(T, T->parm->cb_info); T->reason = 0; if (T->stop) { ret = GLP_ESTOP; goto done; } if (T->reopt) { /* some rows were added; re-optimization is needed */ T->reopt = T->reinv = 0; goto more; } if (T->reinv) { /* no rows were added, however, some inactive rows were removed */ T->reinv = 0; xassert(glp_factorize(T->mip) == 0); } } /* check if the basic solution is integer feasible */ check_integrality(T); /* if the basic solution satisfies to all integrality conditions, it is a new, better integer feasible solution */ if (T->curr->ii_cnt == 0) { if (T->parm->msg_lev >= GLP_MSG_DBG) xprintf("New integer feasible solution found\n"); if (T->parm->msg_lev >= GLP_MSG_ALL) display_cut_info(T); record_solution(T); if (T->parm->msg_lev >= GLP_MSG_ON) show_progress(T, 1); #if 1 /* 11/VII-2013 */ ios_process_sol(T); #endif /* make the application program happy */ if (T->parm->cb_func != NULL) { xassert(T->reason == 0); T->reason = GLP_IBINGO; T->parm->cb_func(T, T->parm->cb_info); T->reason = 0; if (T->stop) { ret = GLP_ESTOP; goto done; } } /* since the current subproblem has been fathomed, prune its branch */ goto fath; } /* at this point basic solution to LP relaxation of the current subproblem is optimal, but integer infeasible */ /* try to fix some non-basic structural variables of integer kind on their current bounds due to reduced costs */ if (T->mip->mip_stat == GLP_FEAS) fix_by_red_cost(T); /* let the application program try to find some solution to the original MIP with a primal heuristic */ if (T->parm->cb_func != NULL) { xassert(T->reason == 0); T->reason = GLP_IHEUR; T->parm->cb_func(T, T->parm->cb_info); T->reason = 0; if (T->stop) { ret = GLP_ESTOP; goto done; } /* check if the current branch became hopeless */ if (!is_branch_hopeful(T, p)) { if (T->parm->msg_lev >= GLP_MSG_DBG) xprintf("Current branch became hopeless and can be prune" "d\n"); goto fath; } } /* try to find solution with the feasibility pump heuristic */ #if 0 /* 27/II-2016 by Chris */ if (T->parm->fp_heur) #else if (T->parm->fp_heur && !root_done) #endif { xassert(T->reason == 0); T->reason = GLP_IHEUR; ios_feas_pump(T); T->reason = 0; /* check if the current branch became hopeless */ if (!is_branch_hopeful(T, p)) { if (T->parm->msg_lev >= GLP_MSG_DBG) xprintf("Current branch became hopeless and can be prune" "d\n"); goto fath; } } #if 1 /* 25/V-2013 */ /* try to find solution with the proximity search heuristic */ #if 0 /* 27/II-2016 by Chris */ if (T->parm->ps_heur) #else if (T->parm->ps_heur && !root_done) #endif { xassert(T->reason == 0); T->reason = GLP_IHEUR; ios_proxy_heur(T); T->reason = 0; /* check if the current branch became hopeless */ if (!is_branch_hopeful(T, p)) { if (T->parm->msg_lev >= GLP_MSG_DBG) xprintf("Current branch became hopeless and can be prune" "d\n"); goto fath; } } #endif #if 1 /* 24/X-2015 */ /* try to find solution with a simple rounding heuristic */ if (T->parm->sr_heur) { xassert(T->reason == 0); T->reason = GLP_IHEUR; round_heur(T); T->reason = 0; /* check if the current branch became hopeless */ if (!is_branch_hopeful(T, p)) { if (T->parm->msg_lev >= GLP_MSG_DBG) xprintf("Current branch became hopeless and can be prune" "d\n"); goto fath; } } #endif /* it's time to generate cutting planes */ xassert(T->local != NULL); #ifdef NEW_LOCAL /* 02/II-2018 */ xassert(T->local->m == 0); #else xassert(T->local->size == 0); #endif /* let the application program generate some cuts; note that it can add cuts either to the local cut pool or directly to the current subproblem */ if (T->parm->cb_func != NULL) { xassert(T->reason == 0); T->reason = GLP_ICUTGEN; T->parm->cb_func(T, T->parm->cb_info); T->reason = 0; if (T->stop) { ret = GLP_ESTOP; goto done; } } #if 1 /* 18/VII-2013 */ if (T->curr->changed > 0) { double degrad = fabs(T->curr->lp_obj - old_obj); if (degrad < 1e-4 * (1.0 + fabs(old_obj))) bad_cut++; else bad_cut = 0; } old_obj = T->curr->lp_obj; #if 0 /* 27/II-2016 by Chris */ if (bad_cut == 0 || (T->curr->level == 0 && bad_cut <= 3)) #else if (bad_cut == 0 || (!root_done && bad_cut <= 3)) #endif #endif /* try to generate generic cuts with built-in generators (as suggested by Prof. Fischetti et al. the built-in cuts are not generated at each branching node; an intense attempt of generating new cuts is only made at the root node, and then a moderate effort is spent after each backtracking step) */ #if 0 /* 27/II-2016 by Chris */ if (T->curr->level == 0 || pred_p == 0) #else if (!root_done || pred_p == 0) #endif { xassert(T->reason == 0); T->reason = GLP_ICUTGEN; generate_cuts(T); T->reason = 0; } /* if the local cut pool is not empty, select useful cuts and add them to the current subproblem */ #ifdef NEW_LOCAL /* 02/II-2018 */ if (T->local->m > 0) #else if (T->local->size > 0) #endif { xassert(T->reason == 0); T->reason = GLP_ICUTGEN; ios_process_cuts(T); T->reason = 0; } /* clear the local cut pool */ ios_clear_pool(T, T->local); /* perform re-optimization, if necessary */ if (T->reopt) { T->reopt = 0; T->curr->changed++; goto more; } /* no cuts were generated; remove inactive cuts */ remove_cuts(T); #if 0 /* 27/II-2016 by Chris */ if (T->parm->msg_lev >= GLP_MSG_ALL && T->curr->level == 0) #else if (T->parm->msg_lev >= GLP_MSG_ALL && !root_done) #endif display_cut_info(T); #if 1 /* 27/II-2016 by Chris */ /* the first node will not be treated as root any more */ if (!root_done) root_done = 1; #endif /* update history information used on pseudocost branching */ if (T->pcost != NULL) ios_pcost_update(T); /* it's time to perform branching */ xassert(T->br_var == 0); xassert(T->br_sel == 0); /* let the application program choose variable to branch on */ if (T->parm->cb_func != NULL) { xassert(T->reason == 0); xassert(T->br_var == 0); xassert(T->br_sel == 0); T->reason = GLP_IBRANCH; T->parm->cb_func(T, T->parm->cb_info); T->reason = 0; if (T->stop) { ret = GLP_ESTOP; goto done; } } /* if nothing has been chosen, choose some variable as specified by the branching technique option */ if (T->br_var == 0) T->br_var = ios_choose_var(T, &T->br_sel); /* perform actual branching */ curr_p = T->curr->p; ret = branch_on(T, T->br_var, T->br_sel); T->br_var = T->br_sel = 0; if (ret == 0) { /* both branches have been created */ pred_p = curr_p; goto loop; } else if (ret == 1) { /* one branch is hopeless and has been pruned, so now the current subproblem is other branch */ /* the current subproblem should be considered as a new one, since one bound of the branching variable was changed */ T->curr->solved = T->curr->changed = 0; #if 1 /* 18/VII-2013 */ /* bad_cut = 0; */ #endif goto more; } else if (ret == 2) { /* both branches are hopeless and have been pruned; new subproblem selection is needed to continue the search */ goto fath; } else xassert(ret != ret); fath: /* the current subproblem has been fathomed */ if (T->parm->msg_lev >= GLP_MSG_DBG) xprintf("Node %d fathomed\n", p); /* freeze the current subproblem */ ios_freeze_node(T); /* and prune the corresponding branch of the tree */ ios_delete_node(T, p); /* if a new integer feasible solution has just been found, other branches may become hopeless and therefore must be pruned */ if (T->mip->mip_stat == GLP_FEAS) cleanup_the_tree(T); /* new subproblem selection is needed due to backtracking */ pred_p = 0; goto loop; done: /* display progress of the search on exit from the solver */ if (T->parm->msg_lev >= GLP_MSG_ON) show_progress(T, 0); if (T->mir_gen != NULL) #if 0 /* 06/III-2016 */ ios_mir_term(T->mir_gen), T->mir_gen = NULL; #else glp_mir_free(T->mir_gen), T->mir_gen = NULL; #endif #ifdef NEW_COVER /* 13/II-2018 */ if (T->cov_gen != NULL) glp_cov_free(T->cov_gen), T->cov_gen = NULL; #endif if (T->clq_gen != NULL) #if 0 /* 08/III-2016 */ ios_clq_term(T->clq_gen), T->clq_gen = NULL; #else glp_cfg_free(T->clq_gen), T->clq_gen = NULL; #endif /* return to the calling program */ return ret; } /* eof */ glpk-5.0/src/draft/glpios07.c0000644000062000006210000004457313766346220015216 0ustar maomkpasswd/* glpios07.c (mixed cover cut generator) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2005-2018 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "ios.h" /*---------------------------------------------------------------------- -- COVER INEQUALITIES -- -- Consider the set of feasible solutions to 0-1 knapsack problem: -- -- sum a[j]*x[j] <= b, (1) -- j in J -- -- x[j] is binary, (2) -- -- where, wlog, we assume that a[j] > 0 (since 0-1 variables can be -- complemented) and a[j] <= b (since a[j] > b implies x[j] = 0). -- -- A set C within J is called a cover if -- -- sum a[j] > b. (3) -- j in C -- -- For any cover C the inequality -- -- sum x[j] <= |C| - 1 (4) -- j in C -- -- is called a cover inequality and is valid for (1)-(2). -- -- MIXED COVER INEQUALITIES -- -- Consider the set of feasible solutions to mixed knapsack problem: -- -- sum a[j]*x[j] + y <= b, (5) -- j in J -- -- x[j] is binary, (6) -- -- 0 <= y <= u is continuous, (7) -- -- where again we assume that a[j] > 0. -- -- Let C within J be some set. From (1)-(4) it follows that -- -- sum a[j] > b - y (8) -- j in C -- -- implies -- -- sum x[j] <= |C| - 1. (9) -- j in C -- -- Thus, we need to modify the inequality (9) in such a way that it be -- a constraint only if the condition (8) is satisfied. -- -- Consider the following inequality: -- -- sum x[j] <= |C| - t. (10) -- j in C -- -- If 0 < t <= 1, then (10) is equivalent to (9), because all x[j] are -- binary variables. On the other hand, if t <= 0, (10) being satisfied -- for any values of x[j] is not a constraint. -- -- Let -- -- t' = sum a[j] + y - b. (11) -- j in C -- -- It is understood that the condition t' > 0 is equivalent to (8). -- Besides, from (6)-(7) it follows that t' has an implied upper bound: -- -- t'max = sum a[j] + u - b. (12) -- j in C -- -- This allows to express the parameter t having desired properties: -- -- t = t' / t'max. (13) -- -- In fact, t <= 1 by definition, and t > 0 being equivalent to t' > 0 -- is equivalent to (8). -- -- Thus, the inequality (10), where t is given by formula (13) is valid -- for (5)-(7). -- -- Note that if u = 0, then y = 0, so t = 1, and the conditions (8) and -- (10) is transformed to the conditions (3) and (4). -- -- GENERATING MIXED COVER CUTS -- -- To generate a mixed cover cut in the form (10) we need to find such -- set C which satisfies to the inequality (8) and for which, in turn, -- the inequality (10) is violated in the current point. -- -- Substituting t from (13) to (10) gives: -- -- 1 -- sum x[j] <= |C| - ----- (sum a[j] + y - b), (14) -- j in C t'max j in C -- -- and finally we have the cut inequality in the standard form: -- -- sum x[j] + alfa * y <= beta, (15) -- j in C -- -- where: -- -- alfa = 1 / t'max, (16) -- -- beta = |C| - alfa * (sum a[j] - b). (17) -- j in C */ #if 1 #define MAXTRY 1000 #else #define MAXTRY 10000 #endif static int cover2(int n, double a[], double b, double u, double x[], double y, int cov[], double *_alfa, double *_beta) { /* try to generate mixed cover cut using two-element cover */ int i, j, try = 0, ret = 0; double eps, alfa, beta, temp, rmax = 0.001; eps = 0.001 * (1.0 + fabs(b)); for (i = 0+1; i <= n; i++) for (j = i+1; j <= n; j++) { /* C = {i, j} */ try++; if (try > MAXTRY) goto done; /* check if condition (8) is satisfied */ if (a[i] + a[j] + y > b + eps) { /* compute parameters for inequality (15) */ temp = a[i] + a[j] - b; alfa = 1.0 / (temp + u); beta = 2.0 - alfa * temp; /* compute violation of inequality (15) */ temp = x[i] + x[j] + alfa * y - beta; /* choose C providing maximum violation */ if (rmax < temp) { rmax = temp; cov[1] = i; cov[2] = j; *_alfa = alfa; *_beta = beta; ret = 1; } } } done: return ret; } static int cover3(int n, double a[], double b, double u, double x[], double y, int cov[], double *_alfa, double *_beta) { /* try to generate mixed cover cut using three-element cover */ int i, j, k, try = 0, ret = 0; double eps, alfa, beta, temp, rmax = 0.001; eps = 0.001 * (1.0 + fabs(b)); for (i = 0+1; i <= n; i++) for (j = i+1; j <= n; j++) for (k = j+1; k <= n; k++) { /* C = {i, j, k} */ try++; if (try > MAXTRY) goto done; /* check if condition (8) is satisfied */ if (a[i] + a[j] + a[k] + y > b + eps) { /* compute parameters for inequality (15) */ temp = a[i] + a[j] + a[k] - b; alfa = 1.0 / (temp + u); beta = 3.0 - alfa * temp; /* compute violation of inequality (15) */ temp = x[i] + x[j] + x[k] + alfa * y - beta; /* choose C providing maximum violation */ if (rmax < temp) { rmax = temp; cov[1] = i; cov[2] = j; cov[3] = k; *_alfa = alfa; *_beta = beta; ret = 1; } } } done: return ret; } static int cover4(int n, double a[], double b, double u, double x[], double y, int cov[], double *_alfa, double *_beta) { /* try to generate mixed cover cut using four-element cover */ int i, j, k, l, try = 0, ret = 0; double eps, alfa, beta, temp, rmax = 0.001; eps = 0.001 * (1.0 + fabs(b)); for (i = 0+1; i <= n; i++) for (j = i+1; j <= n; j++) for (k = j+1; k <= n; k++) for (l = k+1; l <= n; l++) { /* C = {i, j, k, l} */ try++; if (try > MAXTRY) goto done; /* check if condition (8) is satisfied */ if (a[i] + a[j] + a[k] + a[l] + y > b + eps) { /* compute parameters for inequality (15) */ temp = a[i] + a[j] + a[k] + a[l] - b; alfa = 1.0 / (temp + u); beta = 4.0 - alfa * temp; /* compute violation of inequality (15) */ temp = x[i] + x[j] + x[k] + x[l] + alfa * y - beta; /* choose C providing maximum violation */ if (rmax < temp) { rmax = temp; cov[1] = i; cov[2] = j; cov[3] = k; cov[4] = l; *_alfa = alfa; *_beta = beta; ret = 1; } } } done: return ret; } static int cover(int n, double a[], double b, double u, double x[], double y, int cov[], double *alfa, double *beta) { /* try to generate mixed cover cut; input (see (5)): n is the number of binary variables; a[1:n] are coefficients at binary variables; b is the right-hand side; u is upper bound of continuous variable; x[1:n] are values of binary variables at current point; y is value of continuous variable at current point; output (see (15), (16), (17)): cov[1:r] are indices of binary variables included in cover C, where r is the set cardinality returned on exit; alfa coefficient at continuous variable; beta is the right-hand side; */ int j; /* perform some sanity checks */ xassert(n >= 2); for (j = 1; j <= n; j++) xassert(a[j] > 0.0); #if 1 /* ??? */ xassert(b > -1e-5); #else xassert(b > 0.0); #endif xassert(u >= 0.0); for (j = 1; j <= n; j++) xassert(0.0 <= x[j] && x[j] <= 1.0); xassert(0.0 <= y && y <= u); /* try to generate mixed cover cut */ if (cover2(n, a, b, u, x, y, cov, alfa, beta)) return 2; if (cover3(n, a, b, u, x, y, cov, alfa, beta)) return 3; if (cover4(n, a, b, u, x, y, cov, alfa, beta)) return 4; return 0; } /*---------------------------------------------------------------------- -- lpx_cover_cut - generate mixed cover cut. -- -- SYNOPSIS -- -- int lpx_cover_cut(LPX *lp, int len, int ind[], double val[], -- double work[]); -- -- DESCRIPTION -- -- The routine lpx_cover_cut generates a mixed cover cut for a given -- row of the MIP problem. -- -- The given row of the MIP problem should be explicitly specified in -- the form: -- -- sum{j in J} a[j]*x[j] <= b. (1) -- -- On entry indices (ordinal numbers) of structural variables, which -- have non-zero constraint coefficients, should be placed in locations -- ind[1], ..., ind[len], and corresponding constraint coefficients -- should be placed in locations val[1], ..., val[len]. The right-hand -- side b should be stored in location val[0]. -- -- The working array work should have at least nb locations, where nb -- is the number of binary variables in (1). -- -- The routine generates a mixed cover cut in the same form as (1) and -- stores the cut coefficients and right-hand side in the same way as -- just described above. -- -- RETURNS -- -- If the cutting plane has been successfully generated, the routine -- returns 1 <= len' <= n, which is the number of non-zero coefficients -- in the inequality constraint. Otherwise, the routine returns zero. */ static int lpx_cover_cut(glp_prob *lp, int len, int ind[], double val[], double work[]) { int cov[1+4], j, k, nb, newlen, r; double f_min, f_max, alfa, beta, u, *x = work, y; /* substitute and remove fixed variables */ newlen = 0; for (k = 1; k <= len; k++) { j = ind[k]; if (glp_get_col_type(lp, j) == GLP_FX) val[0] -= val[k] * glp_get_col_lb(lp, j); else { newlen++; ind[newlen] = ind[k]; val[newlen] = val[k]; } } len = newlen; /* move binary variables to the beginning of the list so that elements 1, 2, ..., nb correspond to binary variables, and elements nb+1, nb+2, ..., len correspond to rest variables */ nb = 0; for (k = 1; k <= len; k++) { j = ind[k]; if (glp_get_col_kind(lp, j) == GLP_BV) { /* binary variable */ int ind_k; double val_k; nb++; ind_k = ind[nb], val_k = val[nb]; ind[nb] = ind[k], val[nb] = val[k]; ind[k] = ind_k, val[k] = val_k; } } /* now the specified row has the form: sum a[j]*x[j] + sum a[j]*y[j] <= b, where x[j] are binary variables, y[j] are rest variables */ /* at least two binary variables are needed */ if (nb < 2) return 0; /* compute implied lower and upper bounds for sum a[j]*y[j] */ f_min = f_max = 0.0; for (k = nb+1; k <= len; k++) { j = ind[k]; /* both bounds must be finite */ if (glp_get_col_type(lp, j) != GLP_DB) return 0; if (val[k] > 0.0) { f_min += val[k] * glp_get_col_lb(lp, j); f_max += val[k] * glp_get_col_ub(lp, j); } else { f_min += val[k] * glp_get_col_ub(lp, j); f_max += val[k] * glp_get_col_lb(lp, j); } } /* sum a[j]*x[j] + sum a[j]*y[j] <= b ===> sum a[j]*x[j] + (sum a[j]*y[j] - f_min) <= b - f_min ===> sum a[j]*x[j] + y <= b - f_min, where y = sum a[j]*y[j] - f_min; note that 0 <= y <= u, u = f_max - f_min */ /* determine upper bound of y */ u = f_max - f_min; /* determine value of y at the current point */ y = 0.0; for (k = nb+1; k <= len; k++) { j = ind[k]; y += val[k] * glp_get_col_prim(lp, j); } y -= f_min; if (y < 0.0) y = 0.0; if (y > u) y = u; /* modify the right-hand side b */ val[0] -= f_min; /* now the transformed row has the form: sum a[j]*x[j] + y <= b, where 0 <= y <= u */ /* determine values of x[j] at the current point */ for (k = 1; k <= nb; k++) { j = ind[k]; x[k] = glp_get_col_prim(lp, j); if (x[k] < 0.0) x[k] = 0.0; if (x[k] > 1.0) x[k] = 1.0; } /* if a[j] < 0, replace x[j] by its complement 1 - x'[j] */ for (k = 1; k <= nb; k++) { if (val[k] < 0.0) { ind[k] = - ind[k]; val[k] = - val[k]; val[0] += val[k]; x[k] = 1.0 - x[k]; } } /* try to generate a mixed cover cut for the transformed row */ r = cover(nb, val, val[0], u, x, y, cov, &alfa, &beta); if (r == 0) return 0; xassert(2 <= r && r <= 4); /* now the cut is in the form: sum{j in C} x[j] + alfa * y <= beta */ /* store the right-hand side beta */ ind[0] = 0, val[0] = beta; /* restore the original ordinal numbers of x[j] */ for (j = 1; j <= r; j++) cov[j] = ind[cov[j]]; /* store cut coefficients at binary variables complementing back the variables having negative row coefficients */ xassert(r <= nb); for (k = 1; k <= r; k++) { if (cov[k] > 0) { ind[k] = +cov[k]; val[k] = +1.0; } else { ind[k] = -cov[k]; val[k] = -1.0; val[0] -= 1.0; } } /* substitute y = sum a[j]*y[j] - f_min */ for (k = nb+1; k <= len; k++) { r++; ind[r] = ind[k]; val[r] = alfa * val[k]; } val[0] += alfa * f_min; xassert(r <= len); len = r; return len; } /*---------------------------------------------------------------------- -- lpx_eval_row - compute explictily specified row. -- -- SYNOPSIS -- -- double lpx_eval_row(LPX *lp, int len, int ind[], double val[]); -- -- DESCRIPTION -- -- The routine lpx_eval_row computes the primal value of an explicitly -- specified row using current values of structural variables. -- -- The explicitly specified row may be thought as a linear form: -- -- y = a[1]*x[m+1] + a[2]*x[m+2] + ... + a[n]*x[m+n], -- -- where y is an auxiliary variable for this row, a[j] are coefficients -- of the linear form, x[m+j] are structural variables. -- -- On entry column indices and numerical values of non-zero elements of -- the row should be stored in locations ind[1], ..., ind[len] and -- val[1], ..., val[len], where len is the number of non-zero elements. -- The array ind and val are not changed on exit. -- -- RETURNS -- -- The routine returns a computed value of y, the auxiliary variable of -- the specified row. */ static double lpx_eval_row(glp_prob *lp, int len, int ind[], double val[]) { int n = glp_get_num_cols(lp); int j, k; double sum = 0.0; if (len < 0) xerror("lpx_eval_row: len = %d; invalid row length\n", len); for (k = 1; k <= len; k++) { j = ind[k]; if (!(1 <= j && j <= n)) xerror("lpx_eval_row: j = %d; column number out of range\n", j); sum += val[k] * glp_get_col_prim(lp, j); } return sum; } /*********************************************************************** * NAME * * ios_cov_gen - generate mixed cover cuts * * SYNOPSIS * * #include "glpios.h" * void ios_cov_gen(glp_tree *tree); * * DESCRIPTION * * The routine ios_cov_gen generates mixed cover cuts for the current * point and adds them to the cut pool. */ void ios_cov_gen(glp_tree *tree) { glp_prob *prob = tree->mip; int m = glp_get_num_rows(prob); int n = glp_get_num_cols(prob); int i, k, type, kase, len, *ind; double r, *val, *work; xassert(glp_get_status(prob) == GLP_OPT); /* allocate working arrays */ ind = xcalloc(1+n, sizeof(int)); val = xcalloc(1+n, sizeof(double)); work = xcalloc(1+n, sizeof(double)); /* look through all rows */ for (i = 1; i <= m; i++) for (kase = 1; kase <= 2; kase++) { type = glp_get_row_type(prob, i); if (kase == 1) { /* consider rows of '<=' type */ if (!(type == GLP_UP || type == GLP_DB)) continue; len = glp_get_mat_row(prob, i, ind, val); val[0] = glp_get_row_ub(prob, i); } else { /* consider rows of '>=' type */ if (!(type == GLP_LO || type == GLP_DB)) continue; len = glp_get_mat_row(prob, i, ind, val); for (k = 1; k <= len; k++) val[k] = - val[k]; val[0] = - glp_get_row_lb(prob, i); } /* generate mixed cover cut: sum{j in J} a[j] * x[j] <= b */ len = lpx_cover_cut(prob, len, ind, val, work); if (len == 0) continue; /* at the current point the cut inequality is violated, i.e. sum{j in J} a[j] * x[j] - b > 0 */ r = lpx_eval_row(prob, len, ind, val) - val[0]; if (r < 1e-3) continue; /* add the cut to the cut pool */ glp_ios_add_row(tree, NULL, GLP_RF_COV, 0, len, ind, val, GLP_UP, val[0]); } /* free working arrays */ xfree(ind); xfree(val); xfree(work); return; } /* eof */ glpk-5.0/src/draft/glpios09.c0000644000062000006210000006304213766346220015210 0ustar maomkpasswd/* glpios09.c (branching heuristics) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2005-2018 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "ios.h" /*********************************************************************** * NAME * * ios_choose_var - select variable to branch on * * SYNOPSIS * * #include "glpios.h" * int ios_choose_var(glp_tree *T, int *next); * * The routine ios_choose_var chooses a variable from the candidate * list to branch on. Additionally the routine provides a flag stored * in the location next to suggests which of the child subproblems * should be solved next. * * RETURNS * * The routine ios_choose_var returns the ordinal number of the column * choosen. */ static int branch_first(glp_tree *T, int *next); static int branch_last(glp_tree *T, int *next); static int branch_mostf(glp_tree *T, int *next); static int branch_drtom(glp_tree *T, int *next); int ios_choose_var(glp_tree *T, int *next) { int j; if (T->parm->br_tech == GLP_BR_FFV) { /* branch on first fractional variable */ j = branch_first(T, next); } else if (T->parm->br_tech == GLP_BR_LFV) { /* branch on last fractional variable */ j = branch_last(T, next); } else if (T->parm->br_tech == GLP_BR_MFV) { /* branch on most fractional variable */ j = branch_mostf(T, next); } else if (T->parm->br_tech == GLP_BR_DTH) { /* branch using the heuristic by Dreebeck and Tomlin */ j = branch_drtom(T, next); } else if (T->parm->br_tech == GLP_BR_PCH) { /* hybrid pseudocost heuristic */ j = ios_pcost_branch(T, next); } else xassert(T != T); return j; } /*********************************************************************** * branch_first - choose first branching variable * * This routine looks up the list of structural variables and chooses * the first one, which is of integer kind and has fractional value in * optimal solution to the current LP relaxation. * * This routine also selects the branch to be solved next where integer * infeasibility of the chosen variable is less than in other one. */ static int branch_first(glp_tree *T, int *_next) { int j, next; double beta; /* choose the column to branch on */ for (j = 1; j <= T->n; j++) if (T->non_int[j]) break; xassert(1 <= j && j <= T->n); /* select the branch to be solved next */ beta = glp_get_col_prim(T->mip, j); if (beta - floor(beta) < ceil(beta) - beta) next = GLP_DN_BRNCH; else next = GLP_UP_BRNCH; *_next = next; return j; } /*********************************************************************** * branch_last - choose last branching variable * * This routine looks up the list of structural variables and chooses * the last one, which is of integer kind and has fractional value in * optimal solution to the current LP relaxation. * * This routine also selects the branch to be solved next where integer * infeasibility of the chosen variable is less than in other one. */ static int branch_last(glp_tree *T, int *_next) { int j, next; double beta; /* choose the column to branch on */ for (j = T->n; j >= 1; j--) if (T->non_int[j]) break; xassert(1 <= j && j <= T->n); /* select the branch to be solved next */ beta = glp_get_col_prim(T->mip, j); if (beta - floor(beta) < ceil(beta) - beta) next = GLP_DN_BRNCH; else next = GLP_UP_BRNCH; *_next = next; return j; } /*********************************************************************** * branch_mostf - choose most fractional branching variable * * This routine looks up the list of structural variables and chooses * that one, which is of integer kind and has most fractional value in * optimal solution to the current LP relaxation. * * This routine also selects the branch to be solved next where integer * infeasibility of the chosen variable is less than in other one. * * (Alexander Martin notices that "...most infeasible is as good as * random...".) */ static int branch_mostf(glp_tree *T, int *_next) { int j, jj, next; double beta, most, temp; /* choose the column to branch on */ jj = 0, most = DBL_MAX; for (j = 1; j <= T->n; j++) { if (T->non_int[j]) { beta = glp_get_col_prim(T->mip, j); temp = floor(beta) + 0.5; if (most > fabs(beta - temp)) { jj = j, most = fabs(beta - temp); if (beta < temp) next = GLP_DN_BRNCH; else next = GLP_UP_BRNCH; } } } *_next = next; return jj; } /*********************************************************************** * branch_drtom - choose branching var using Driebeck-Tomlin heuristic * * This routine chooses a structural variable, which is required to be * integral and has fractional value in optimal solution of the current * LP relaxation, using a heuristic proposed by Driebeck and Tomlin. * * The routine also selects the branch to be solved next, again due to * Driebeck and Tomlin. * * This routine is based on the heuristic proposed in: * * Driebeck N.J. An algorithm for the solution of mixed-integer * programming problems, Management Science, 12: 576-87 (1966); * * and improved in: * * Tomlin J.A. Branch and bound methods for integer and non-convex * programming, in J.Abadie (ed.), Integer and Nonlinear Programming, * North-Holland, Amsterdam, pp. 437-50 (1970). * * Must note that this heuristic is time-expensive, because computing * one-step degradation (see the routine below) requires one BTRAN for * each fractional-valued structural variable. */ static int branch_drtom(glp_tree *T, int *_next) { glp_prob *mip = T->mip; int m = mip->m; int n = mip->n; unsigned char *non_int = T->non_int; int j, jj, k, t, next, kase, len, stat, *ind; double x, dk, alfa, delta_j, delta_k, delta_z, dz_dn, dz_up, dd_dn, dd_up, degrad, *val; /* basic solution of LP relaxation must be optimal */ xassert(glp_get_status(mip) == GLP_OPT); /* allocate working arrays */ ind = xcalloc(1+n, sizeof(int)); val = xcalloc(1+n, sizeof(double)); /* nothing has been chosen so far */ jj = 0, degrad = -1.0; /* walk through the list of columns (structural variables) */ for (j = 1; j <= n; j++) { /* if j-th column is not marked as fractional, skip it */ if (!non_int[j]) continue; /* obtain (fractional) value of j-th column in basic solution of LP relaxation */ x = glp_get_col_prim(mip, j); /* since the value of j-th column is fractional, the column is basic; compute corresponding row of the simplex table */ len = glp_eval_tab_row(mip, m+j, ind, val); /* the following fragment computes a change in the objective function: delta Z = new Z - old Z, where old Z is the objective value in the current optimal basis, and new Z is the objective value in the adjacent basis, for two cases: 1) if new upper bound ub' = floor(x[j]) is introduced for j-th column (down branch); 2) if new lower bound lb' = ceil(x[j]) is introduced for j-th column (up branch); since in both cases the solution remaining dual feasible becomes primal infeasible, one implicit simplex iteration is performed to determine the change delta Z; it is obvious that new Z, which is never better than old Z, is a lower (minimization) or upper (maximization) bound of the objective function for down- and up-branches. */ for (kase = -1; kase <= +1; kase += 2) { /* if kase < 0, the new upper bound of x[j] is introduced; in this case x[j] should decrease in order to leave the basis and go to its new upper bound */ /* if kase > 0, the new lower bound of x[j] is introduced; in this case x[j] should increase in order to leave the basis and go to its new lower bound */ /* apply the dual ratio test in order to determine which auxiliary or structural variable should enter the basis to keep dual feasibility */ k = glp_dual_rtest(mip, len, ind, val, kase, 1e-9); if (k != 0) k = ind[k]; /* if no non-basic variable has been chosen, LP relaxation of corresponding branch being primal infeasible and dual unbounded has no primal feasible solution; in this case the change delta Z is formally set to infinity */ if (k == 0) { delta_z = (T->mip->dir == GLP_MIN ? +DBL_MAX : -DBL_MAX); goto skip; } /* row of the simplex table that corresponds to non-basic variable x[k] choosen by the dual ratio test is: x[j] = ... + alfa * x[k] + ... where alfa is the influence coefficient (an element of the simplex table row) */ /* determine the coefficient alfa */ for (t = 1; t <= len; t++) if (ind[t] == k) break; xassert(1 <= t && t <= len); alfa = val[t]; /* since in the adjacent basis the variable x[j] becomes non-basic, knowing its value in the current basis we can determine its change delta x[j] = new x[j] - old x[j] */ delta_j = (kase < 0 ? floor(x) : ceil(x)) - x; /* and knowing the coefficient alfa we can determine the corresponding change delta x[k] = new x[k] - old x[k], where old x[k] is a value of x[k] in the current basis, and new x[k] is a value of x[k] in the adjacent basis */ delta_k = delta_j / alfa; /* Tomlin noticed that if the variable x[k] is of integer kind, its change cannot be less (eventually) than one in the magnitude */ if (k > m && glp_get_col_kind(mip, k-m) != GLP_CV) { /* x[k] is structural integer variable */ if (fabs(delta_k - floor(delta_k + 0.5)) > 1e-3) { if (delta_k > 0.0) delta_k = ceil(delta_k); /* +3.14 -> +4 */ else delta_k = floor(delta_k); /* -3.14 -> -4 */ } } /* now determine the status and reduced cost of x[k] in the current basis */ if (k <= m) { stat = glp_get_row_stat(mip, k); dk = glp_get_row_dual(mip, k); } else { stat = glp_get_col_stat(mip, k-m); dk = glp_get_col_dual(mip, k-m); } /* if the current basis is dual degenerate, some reduced costs which are close to zero may have wrong sign due to round-off errors, so correct the sign of d[k] */ switch (T->mip->dir) { case GLP_MIN: if (stat == GLP_NL && dk < 0.0 || stat == GLP_NU && dk > 0.0 || stat == GLP_NF) dk = 0.0; break; case GLP_MAX: if (stat == GLP_NL && dk > 0.0 || stat == GLP_NU && dk < 0.0 || stat == GLP_NF) dk = 0.0; break; default: xassert(T != T); } /* now knowing the change of x[k] and its reduced cost d[k] we can compute the corresponding change in the objective function delta Z = new Z - old Z = d[k] * delta x[k]; note that due to Tomlin's modification new Z can be even worse than in the adjacent basis */ delta_z = dk * delta_k; skip: /* new Z is never better than old Z, therefore the change delta Z is always non-negative (in case of minimization) or non-positive (in case of maximization) */ switch (T->mip->dir) { case GLP_MIN: xassert(delta_z >= 0.0); break; case GLP_MAX: xassert(delta_z <= 0.0); break; default: xassert(T != T); } /* save the change in the objective fnction for down- and up-branches, respectively */ if (kase < 0) dz_dn = delta_z; else dz_up = delta_z; } /* thus, in down-branch no integer feasible solution can be better than Z + dz_dn, and in up-branch no integer feasible solution can be better than Z + dz_up, where Z is value of the objective function in the current basis */ /* following the heuristic by Driebeck and Tomlin we choose a column (i.e. structural variable) which provides largest degradation of the objective function in some of branches; besides, we select the branch with smaller degradation to be solved next and keep other branch with larger degradation in the active list hoping to minimize the number of further backtrackings */ if (degrad < fabs(dz_dn) || degrad < fabs(dz_up)) { jj = j; if (fabs(dz_dn) < fabs(dz_up)) { /* select down branch to be solved next */ next = GLP_DN_BRNCH; degrad = fabs(dz_up); } else { /* select up branch to be solved next */ next = GLP_UP_BRNCH; degrad = fabs(dz_dn); } /* save the objective changes for printing */ dd_dn = dz_dn, dd_up = dz_up; /* if down- or up-branch has no feasible solution, we does not need to consider other candidates (in principle, the corresponding branch could be pruned right now) */ if (degrad == DBL_MAX) break; } } /* free working arrays */ xfree(ind); xfree(val); /* something must be chosen */ xassert(1 <= jj && jj <= n); #if 1 /* 02/XI-2009 */ if (degrad < 1e-6 * (1.0 + 0.001 * fabs(mip->obj_val))) { jj = branch_mostf(T, &next); goto done; } #endif if (T->parm->msg_lev >= GLP_MSG_DBG) { xprintf("branch_drtom: column %d chosen to branch on\n", jj); if (fabs(dd_dn) == DBL_MAX) xprintf("branch_drtom: down-branch is infeasible\n"); else xprintf("branch_drtom: down-branch bound is %.9e\n", glp_get_obj_val(mip) + dd_dn); if (fabs(dd_up) == DBL_MAX) xprintf("branch_drtom: up-branch is infeasible\n"); else xprintf("branch_drtom: up-branch bound is %.9e\n", glp_get_obj_val(mip) + dd_up); } done: *_next = next; return jj; } /**********************************************************************/ struct csa { /* common storage area */ int *dn_cnt; /* int dn_cnt[1+n]; */ /* dn_cnt[j] is the number of subproblems, whose LP relaxations have been solved and which are down-branches for variable x[j]; dn_cnt[j] = 0 means the down pseudocost is uninitialized */ double *dn_sum; /* double dn_sum[1+n]; */ /* dn_sum[j] is the sum of per unit degradations of the objective over all dn_cnt[j] subproblems */ int *up_cnt; /* int up_cnt[1+n]; */ /* up_cnt[j] is the number of subproblems, whose LP relaxations have been solved and which are up-branches for variable x[j]; up_cnt[j] = 0 means the up pseudocost is uninitialized */ double *up_sum; /* double up_sum[1+n]; */ /* up_sum[j] is the sum of per unit degradations of the objective over all up_cnt[j] subproblems */ }; void *ios_pcost_init(glp_tree *tree) { /* initialize working data used on pseudocost branching */ struct csa *csa; int n = tree->n, j; csa = xmalloc(sizeof(struct csa)); csa->dn_cnt = xcalloc(1+n, sizeof(int)); csa->dn_sum = xcalloc(1+n, sizeof(double)); csa->up_cnt = xcalloc(1+n, sizeof(int)); csa->up_sum = xcalloc(1+n, sizeof(double)); for (j = 1; j <= n; j++) { csa->dn_cnt[j] = csa->up_cnt[j] = 0; csa->dn_sum[j] = csa->up_sum[j] = 0.0; } return csa; } static double eval_degrad(glp_prob *P, int j, double bnd) { /* compute degradation of the objective on fixing x[j] at given value with a limited number of dual simplex iterations */ /* this routine fixes column x[j] at specified value bnd, solves resulting LP, and returns a lower bound to degradation of the objective, degrad >= 0 */ glp_prob *lp; glp_smcp parm; int ret; double degrad; /* the current basis must be optimal */ xassert(glp_get_status(P) == GLP_OPT); /* create a copy of P */ lp = glp_create_prob(); glp_copy_prob(lp, P, 0); /* fix column x[j] at specified value */ glp_set_col_bnds(lp, j, GLP_FX, bnd, bnd); /* try to solve resulting LP */ glp_init_smcp(&parm); parm.msg_lev = GLP_MSG_OFF; parm.meth = GLP_DUAL; parm.it_lim = 30; parm.out_dly = 1000; parm.meth = GLP_DUAL; ret = glp_simplex(lp, &parm); if (ret == 0 || ret == GLP_EITLIM) { if (glp_get_prim_stat(lp) == GLP_NOFEAS) { /* resulting LP has no primal feasible solution */ degrad = DBL_MAX; } else if (glp_get_dual_stat(lp) == GLP_FEAS) { /* resulting basis is optimal or at least dual feasible, so we have the correct lower bound to degradation */ if (P->dir == GLP_MIN) degrad = lp->obj_val - P->obj_val; else if (P->dir == GLP_MAX) degrad = P->obj_val - lp->obj_val; else xassert(P != P); /* degradation cannot be negative by definition */ /* note that the lower bound to degradation may be close to zero even if its exact value is zero due to round-off errors on computing the objective value */ if (degrad < 1e-6 * (1.0 + 0.001 * fabs(P->obj_val))) degrad = 0.0; } else { /* the final basis reported by the simplex solver is dual infeasible, so we cannot determine a non-trivial lower bound to degradation */ degrad = 0.0; } } else { /* the simplex solver failed */ degrad = 0.0; } /* delete the copy of P */ glp_delete_prob(lp); return degrad; } void ios_pcost_update(glp_tree *tree) { /* update history information for pseudocost branching */ /* this routine is called every time when LP relaxation of the current subproblem has been solved to optimality with all lazy and cutting plane constraints included */ int j; double dx, dz, psi; struct csa *csa = tree->pcost; xassert(csa != NULL); xassert(tree->curr != NULL); /* if the current subproblem is the root, skip updating */ if (tree->curr->up == NULL) goto skip; /* determine branching variable x[j], which was used in the parent subproblem to create the current subproblem */ j = tree->curr->up->br_var; xassert(1 <= j && j <= tree->n); /* determine the change dx[j] = new x[j] - old x[j], where new x[j] is a value of x[j] in optimal solution to LP relaxation of the current subproblem, old x[j] is a value of x[j] in optimal solution to LP relaxation of the parent subproblem */ dx = tree->mip->col[j]->prim - tree->curr->up->br_val; xassert(dx != 0.0); /* determine corresponding change dz = new dz - old dz in the objective function value */ dz = tree->mip->obj_val - tree->curr->up->lp_obj; /* determine per unit degradation of the objective function */ psi = fabs(dz / dx); /* update history information */ if (dx < 0.0) { /* the current subproblem is down-branch */ csa->dn_cnt[j]++; csa->dn_sum[j] += psi; } else /* dx > 0.0 */ { /* the current subproblem is up-branch */ csa->up_cnt[j]++; csa->up_sum[j] += psi; } skip: return; } void ios_pcost_free(glp_tree *tree) { /* free working area used on pseudocost branching */ struct csa *csa = tree->pcost; xassert(csa != NULL); xfree(csa->dn_cnt); xfree(csa->dn_sum); xfree(csa->up_cnt); xfree(csa->up_sum); xfree(csa); tree->pcost = NULL; return; } static double eval_psi(glp_tree *T, int j, int brnch) { /* compute estimation of pseudocost of variable x[j] for down- or up-branch */ struct csa *csa = T->pcost; double beta, degrad, psi; xassert(csa != NULL); xassert(1 <= j && j <= T->n); if (brnch == GLP_DN_BRNCH) { /* down-branch */ if (csa->dn_cnt[j] == 0) { /* initialize down pseudocost */ beta = T->mip->col[j]->prim; degrad = eval_degrad(T->mip, j, floor(beta)); if (degrad == DBL_MAX) { psi = DBL_MAX; goto done; } csa->dn_cnt[j] = 1; csa->dn_sum[j] = degrad / (beta - floor(beta)); } psi = csa->dn_sum[j] / (double)csa->dn_cnt[j]; } else if (brnch == GLP_UP_BRNCH) { /* up-branch */ if (csa->up_cnt[j] == 0) { /* initialize up pseudocost */ beta = T->mip->col[j]->prim; degrad = eval_degrad(T->mip, j, ceil(beta)); if (degrad == DBL_MAX) { psi = DBL_MAX; goto done; } csa->up_cnt[j] = 1; csa->up_sum[j] = degrad / (ceil(beta) - beta); } psi = csa->up_sum[j] / (double)csa->up_cnt[j]; } else xassert(brnch != brnch); done: return psi; } static void progress(glp_tree *T) { /* display progress of pseudocost initialization */ struct csa *csa = T->pcost; int j, nv = 0, ni = 0; for (j = 1; j <= T->n; j++) { if (glp_ios_can_branch(T, j)) { nv++; if (csa->dn_cnt[j] > 0 && csa->up_cnt[j] > 0) ni++; } } xprintf("Pseudocosts initialized for %d of %d variables\n", ni, nv); return; } int ios_pcost_branch(glp_tree *T, int *_next) { /* choose branching variable with pseudocost branching */ #if 0 /* 10/VI-2013 */ glp_long t = xtime(); #else double t = xtime(); #endif int j, jjj, sel; double beta, psi, d1, d2, d, dmax; /* initialize the working arrays */ if (T->pcost == NULL) T->pcost = ios_pcost_init(T); /* nothing has been chosen so far */ jjj = 0, dmax = -1.0; /* go through the list of branching candidates */ for (j = 1; j <= T->n; j++) { if (!glp_ios_can_branch(T, j)) continue; /* determine primal value of x[j] in optimal solution to LP relaxation of the current subproblem */ beta = T->mip->col[j]->prim; /* estimate pseudocost of x[j] for down-branch */ psi = eval_psi(T, j, GLP_DN_BRNCH); if (psi == DBL_MAX) { /* down-branch has no primal feasible solution */ jjj = j, sel = GLP_DN_BRNCH; goto done; } /* estimate degradation of the objective for down-branch */ d1 = psi * (beta - floor(beta)); /* estimate pseudocost of x[j] for up-branch */ psi = eval_psi(T, j, GLP_UP_BRNCH); if (psi == DBL_MAX) { /* up-branch has no primal feasible solution */ jjj = j, sel = GLP_UP_BRNCH; goto done; } /* estimate degradation of the objective for up-branch */ d2 = psi * (ceil(beta) - beta); /* determine d = max(d1, d2) */ d = (d1 > d2 ? d1 : d2); /* choose x[j] which provides maximal estimated degradation of the objective either in down- or up-branch */ if (dmax < d) { dmax = d; jjj = j; /* continue the search from a subproblem, where degradation is less than in other one */ sel = (d1 <= d2 ? GLP_DN_BRNCH : GLP_UP_BRNCH); } /* display progress of pseudocost initialization */ if (T->parm->msg_lev >= GLP_ON) { if (xdifftime(xtime(), t) >= 10.0) { progress(T); t = xtime(); } } } if (dmax == 0.0) { /* no degradation is indicated; choose a variable having most fractional value */ jjj = branch_mostf(T, &sel); } done: *_next = sel; return jjj; } /* eof */ glpk-5.0/src/draft/glpios11.c0000644000062000006210000004017313766346220015201 0ustar maomkpasswd/* glpios11.c (process cuts stored in the local cut pool) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2005-2018 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "draft.h" #include "env.h" #include "ios.h" /*********************************************************************** * NAME * * ios_process_cuts - process cuts stored in the local cut pool * * SYNOPSIS * * #include "glpios.h" * void ios_process_cuts(glp_tree *T); * * DESCRIPTION * * The routine ios_process_cuts analyzes each cut currently stored in * the local cut pool, which must be non-empty, and either adds the cut * to the current subproblem or just discards it. All cuts are assumed * to be locally valid. On exit the local cut pool remains unchanged. * * REFERENCES * * 1. E.Balas, S.Ceria, G.Cornuejols, "Mixed 0-1 Programming by * Lift-and-Project in a Branch-and-Cut Framework", Management Sc., * 42 (1996) 1229-1246. * * 2. G.Andreello, A.Caprara, and M.Fischetti, "Embedding Cuts in * a Branch&Cut Framework: a Computational Study with {0,1/2}-Cuts", * Preliminary Draft, October 28, 2003, pp.6-8. */ struct info { /* estimated cut efficiency */ IOSCUT *cut; /* pointer to cut in the cut pool */ char flag; /* if this flag is set, the cut is included into the current subproblem */ double eff; /* cut efficacy (normalized residual) */ double deg; /* lower bound to objective degradation */ }; static int CDECL fcmp(const void *arg1, const void *arg2) { const struct info *info1 = arg1, *info2 = arg2; if (info1->deg == 0.0 && info2->deg == 0.0) { if (info1->eff > info2->eff) return -1; if (info1->eff < info2->eff) return +1; } else { if (info1->deg > info2->deg) return -1; if (info1->deg < info2->deg) return +1; } return 0; } static double parallel(IOSCUT *a, IOSCUT *b, double work[]); #ifdef NEW_LOCAL /* 02/II-2018 */ void ios_process_cuts(glp_tree *T) { IOSPOOL *pool; IOSCUT *cut; GLPAIJ *aij; struct info *info; int k, kk, max_cuts, len, ret, *ind; double *val, *work, rhs; /* the current subproblem must exist */ xassert(T->curr != NULL); /* the pool must exist and be non-empty */ pool = T->local; xassert(pool != NULL); xassert(pool->m > 0); /* allocate working arrays */ info = xcalloc(1+pool->m, sizeof(struct info)); ind = xcalloc(1+T->n, sizeof(int)); val = xcalloc(1+T->n, sizeof(double)); work = xcalloc(1+T->n, sizeof(double)); for (k = 1; k <= T->n; k++) work[k] = 0.0; /* build the list of cuts stored in the cut pool */ for (k = 1; k <= pool->m; k++) info[k].cut = pool->row[k], info[k].flag = 0; /* estimate efficiency of all cuts in the cut pool */ for (k = 1; k <= pool->m; k++) { double temp, dy, dz; cut = info[k].cut; /* build the vector of cut coefficients and compute its Euclidean norm */ len = 0; temp = 0.0; for (aij = cut->ptr; aij != NULL; aij = aij->r_next) { xassert(1 <= aij->col->j && aij->col->j <= T->n); len++, ind[len] = aij->col->j, val[len] = aij->val; temp += aij->val * aij->val; } if (temp < DBL_EPSILON * DBL_EPSILON) temp = DBL_EPSILON; /* transform the cut to express it only through non-basic (auxiliary and structural) variables */ len = glp_transform_row(T->mip, len, ind, val); /* determine change in the cut value and in the objective value for the adjacent basis by simulating one step of the dual simplex */ switch (cut->type) { case GLP_LO: rhs = cut->lb; break; case GLP_UP: rhs = cut->ub; break; default: xassert(cut != cut); } ret = _glp_analyze_row(T->mip, len, ind, val, cut->type, rhs, 1e-9, NULL, NULL, NULL, NULL, &dy, &dz); /* determine normalized residual and lower bound to objective degradation */ if (ret == 0) { info[k].eff = fabs(dy) / sqrt(temp); /* if some reduced costs violates (slightly) their zero bounds (i.e. have wrong signs) due to round-off errors, dz also may have wrong sign being close to zero */ if (T->mip->dir == GLP_MIN) { if (dz < 0.0) dz = 0.0; info[k].deg = + dz; } else /* GLP_MAX */ { if (dz > 0.0) dz = 0.0; info[k].deg = - dz; } } else if (ret == 1) { /* the constraint is not violated at the current point */ info[k].eff = info[k].deg = 0.0; } else if (ret == 2) { /* no dual feasible adjacent basis exists */ info[k].eff = 1.0; info[k].deg = DBL_MAX; } else xassert(ret != ret); /* if the degradation is too small, just ignore it */ if (info[k].deg < 0.01) info[k].deg = 0.0; } /* sort the list of cuts by decreasing objective degradation and then by decreasing efficacy */ qsort(&info[1], pool->m, sizeof(struct info), fcmp); /* only first (most efficient) max_cuts in the list are qualified as candidates to be added to the current subproblem */ max_cuts = (T->curr->level == 0 ? 90 : 10); if (max_cuts > pool->m) max_cuts = pool->m; /* add cuts to the current subproblem */ #if 0 xprintf("*** adding cuts ***\n"); #endif for (k = 1; k <= max_cuts; k++) { int i, len; /* if this cut seems to be inefficient, skip it */ if (info[k].deg < 0.01 && info[k].eff < 0.01) continue; /* if the angle between this cut and every other cut included in the current subproblem is small, skip this cut */ for (kk = 1; kk < k; kk++) { if (info[kk].flag) { if (parallel(info[k].cut, info[kk].cut, work) > 0.90) break; } } if (kk < k) continue; /* add this cut to the current subproblem */ #if 0 xprintf("eff = %g; deg = %g\n", info[k].eff, info[k].deg); #endif cut = info[k].cut, info[k].flag = 1; i = glp_add_rows(T->mip, 1); if (cut->name != NULL) glp_set_row_name(T->mip, i, cut->name); xassert(T->mip->row[i]->origin == GLP_RF_CUT); T->mip->row[i]->klass = cut->klass; len = 0; for (aij = cut->ptr; aij != NULL; aij = aij->r_next) len++, ind[len] = aij->col->j, val[len] = aij->val; glp_set_mat_row(T->mip, i, len, ind, val); switch (cut->type) { case GLP_LO: rhs = cut->lb; break; case GLP_UP: rhs = cut->ub; break; default: xassert(cut != cut); } glp_set_row_bnds(T->mip, i, cut->type, rhs, rhs); } /* free working arrays */ xfree(info); xfree(ind); xfree(val); xfree(work); return; } #else void ios_process_cuts(glp_tree *T) { IOSPOOL *pool; IOSCUT *cut; IOSAIJ *aij; struct info *info; int k, kk, max_cuts, len, ret, *ind; double *val, *work; /* the current subproblem must exist */ xassert(T->curr != NULL); /* the pool must exist and be non-empty */ pool = T->local; xassert(pool != NULL); xassert(pool->size > 0); /* allocate working arrays */ info = xcalloc(1+pool->size, sizeof(struct info)); ind = xcalloc(1+T->n, sizeof(int)); val = xcalloc(1+T->n, sizeof(double)); work = xcalloc(1+T->n, sizeof(double)); for (k = 1; k <= T->n; k++) work[k] = 0.0; /* build the list of cuts stored in the cut pool */ for (k = 0, cut = pool->head; cut != NULL; cut = cut->next) k++, info[k].cut = cut, info[k].flag = 0; xassert(k == pool->size); /* estimate efficiency of all cuts in the cut pool */ for (k = 1; k <= pool->size; k++) { double temp, dy, dz; cut = info[k].cut; /* build the vector of cut coefficients and compute its Euclidean norm */ len = 0; temp = 0.0; for (aij = cut->ptr; aij != NULL; aij = aij->next) { xassert(1 <= aij->j && aij->j <= T->n); len++, ind[len] = aij->j, val[len] = aij->val; temp += aij->val * aij->val; } if (temp < DBL_EPSILON * DBL_EPSILON) temp = DBL_EPSILON; /* transform the cut to express it only through non-basic (auxiliary and structural) variables */ len = glp_transform_row(T->mip, len, ind, val); /* determine change in the cut value and in the objective value for the adjacent basis by simulating one step of the dual simplex */ ret = _glp_analyze_row(T->mip, len, ind, val, cut->type, cut->rhs, 1e-9, NULL, NULL, NULL, NULL, &dy, &dz); /* determine normalized residual and lower bound to objective degradation */ if (ret == 0) { info[k].eff = fabs(dy) / sqrt(temp); /* if some reduced costs violates (slightly) their zero bounds (i.e. have wrong signs) due to round-off errors, dz also may have wrong sign being close to zero */ if (T->mip->dir == GLP_MIN) { if (dz < 0.0) dz = 0.0; info[k].deg = + dz; } else /* GLP_MAX */ { if (dz > 0.0) dz = 0.0; info[k].deg = - dz; } } else if (ret == 1) { /* the constraint is not violated at the current point */ info[k].eff = info[k].deg = 0.0; } else if (ret == 2) { /* no dual feasible adjacent basis exists */ info[k].eff = 1.0; info[k].deg = DBL_MAX; } else xassert(ret != ret); /* if the degradation is too small, just ignore it */ if (info[k].deg < 0.01) info[k].deg = 0.0; } /* sort the list of cuts by decreasing objective degradation and then by decreasing efficacy */ qsort(&info[1], pool->size, sizeof(struct info), fcmp); /* only first (most efficient) max_cuts in the list are qualified as candidates to be added to the current subproblem */ max_cuts = (T->curr->level == 0 ? 90 : 10); if (max_cuts > pool->size) max_cuts = pool->size; /* add cuts to the current subproblem */ #if 0 xprintf("*** adding cuts ***\n"); #endif for (k = 1; k <= max_cuts; k++) { int i, len; /* if this cut seems to be inefficient, skip it */ if (info[k].deg < 0.01 && info[k].eff < 0.01) continue; /* if the angle between this cut and every other cut included in the current subproblem is small, skip this cut */ for (kk = 1; kk < k; kk++) { if (info[kk].flag) { if (parallel(info[k].cut, info[kk].cut, work) > 0.90) break; } } if (kk < k) continue; /* add this cut to the current subproblem */ #if 0 xprintf("eff = %g; deg = %g\n", info[k].eff, info[k].deg); #endif cut = info[k].cut, info[k].flag = 1; i = glp_add_rows(T->mip, 1); if (cut->name != NULL) glp_set_row_name(T->mip, i, cut->name); xassert(T->mip->row[i]->origin == GLP_RF_CUT); T->mip->row[i]->klass = cut->klass; len = 0; for (aij = cut->ptr; aij != NULL; aij = aij->next) len++, ind[len] = aij->j, val[len] = aij->val; glp_set_mat_row(T->mip, i, len, ind, val); xassert(cut->type == GLP_LO || cut->type == GLP_UP); glp_set_row_bnds(T->mip, i, cut->type, cut->rhs, cut->rhs); } /* free working arrays */ xfree(info); xfree(ind); xfree(val); xfree(work); return; } #endif #if 0 /*********************************************************************** * Given a cut a * x >= b (<= b) the routine efficacy computes the cut * efficacy as follows: * * eff = d * (a * x~ - b) / ||a||, * * where d is -1 (in case of '>= b') or +1 (in case of '<= b'), x~ is * the vector of values of structural variables in optimal solution to * LP relaxation of the current subproblem, ||a|| is the Euclidean norm * of the vector of cut coefficients. * * If the cut is violated at point x~, the efficacy eff is positive, * and its value is the Euclidean distance between x~ and the cut plane * a * x = b in the space of structural variables. * * Following geometrical intuition, it is quite natural to consider * this distance as a first-order measure of the expected efficacy of * the cut: the larger the distance the better the cut [1]. */ static double efficacy(glp_tree *T, IOSCUT *cut) { glp_prob *mip = T->mip; IOSAIJ *aij; double s = 0.0, t = 0.0, temp; for (aij = cut->ptr; aij != NULL; aij = aij->next) { xassert(1 <= aij->j && aij->j <= mip->n); s += aij->val * mip->col[aij->j]->prim; t += aij->val * aij->val; } temp = sqrt(t); if (temp < DBL_EPSILON) temp = DBL_EPSILON; if (cut->type == GLP_LO) temp = (s >= cut->rhs ? 0.0 : (cut->rhs - s) / temp); else if (cut->type == GLP_UP) temp = (s <= cut->rhs ? 0.0 : (s - cut->rhs) / temp); else xassert(cut != cut); return temp; } #endif /*********************************************************************** * Given two cuts a1 * x >= b1 (<= b1) and a2 * x >= b2 (<= b2) the * routine parallel computes the cosine of angle between the cut planes * a1 * x = b1 and a2 * x = b2 (which is the acute angle between two * normals to these planes) in the space of structural variables as * follows: * * cos phi = (a1' * a2) / (||a1|| * ||a2||), * * where (a1' * a2) is a dot product of vectors of cut coefficients, * ||a1|| and ||a2|| are Euclidean norms of vectors a1 and a2. * * Note that requirement cos phi = 0 forces the cuts to be orthogonal, * i.e. with disjoint support, while requirement cos phi <= 0.999 means * only avoiding duplicate (parallel) cuts [1]. */ #ifdef NEW_LOCAL /* 02/II-2018 */ static double parallel(IOSCUT *a, IOSCUT *b, double work[]) { GLPAIJ *aij; double s = 0.0, sa = 0.0, sb = 0.0, temp; for (aij = a->ptr; aij != NULL; aij = aij->r_next) { work[aij->col->j] = aij->val; sa += aij->val * aij->val; } for (aij = b->ptr; aij != NULL; aij = aij->r_next) { s += work[aij->col->j] * aij->val; sb += aij->val * aij->val; } for (aij = a->ptr; aij != NULL; aij = aij->r_next) work[aij->col->j] = 0.0; temp = sqrt(sa) * sqrt(sb); if (temp < DBL_EPSILON * DBL_EPSILON) temp = DBL_EPSILON; return s / temp; } #else static double parallel(IOSCUT *a, IOSCUT *b, double work[]) { IOSAIJ *aij; double s = 0.0, sa = 0.0, sb = 0.0, temp; for (aij = a->ptr; aij != NULL; aij = aij->next) { work[aij->j] = aij->val; sa += aij->val * aij->val; } for (aij = b->ptr; aij != NULL; aij = aij->next) { s += work[aij->j] * aij->val; sb += aij->val * aij->val; } for (aij = a->ptr; aij != NULL; aij = aij->next) work[aij->j] = 0.0; temp = sqrt(sa) * sqrt(sb); if (temp < DBL_EPSILON * DBL_EPSILON) temp = DBL_EPSILON; return s / temp; } #endif /* eof */ glpk-5.0/src/draft/glpios12.c0000644000062000006210000001307413766346220015202 0ustar maomkpasswd/* glpios12.c (node selection heuristics) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2003-2018 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "ios.h" /*********************************************************************** * NAME * * ios_choose_node - select subproblem to continue the search * * SYNOPSIS * * #include "glpios.h" * int ios_choose_node(glp_tree *T); * * DESCRIPTION * * The routine ios_choose_node selects a subproblem from the active * list to continue the search. The choice depends on the backtracking * technique option. * * RETURNS * * The routine ios_choose_node return the reference number of the * subproblem selected. */ static int most_feas(glp_tree *T); static int best_proj(glp_tree *T); static int best_node(glp_tree *T); int ios_choose_node(glp_tree *T) { int p; if (T->parm->bt_tech == GLP_BT_DFS) { /* depth first search */ xassert(T->tail != NULL); p = T->tail->p; } else if (T->parm->bt_tech == GLP_BT_BFS) { /* breadth first search */ xassert(T->head != NULL); p = T->head->p; } else if (T->parm->bt_tech == GLP_BT_BLB) { /* select node with best local bound */ p = best_node(T); } else if (T->parm->bt_tech == GLP_BT_BPH) { if (T->mip->mip_stat == GLP_UNDEF) { /* "most integer feasible" subproblem */ p = most_feas(T); } else { /* best projection heuristic */ p = best_proj(T); } } else xassert(T != T); return p; } static int most_feas(glp_tree *T) { /* select subproblem whose parent has minimal sum of integer infeasibilities */ IOSNPD *node; int p; double best; p = 0, best = DBL_MAX; for (node = T->head; node != NULL; node = node->next) { xassert(node->up != NULL); if (best > node->up->ii_sum) p = node->p, best = node->up->ii_sum; } return p; } static int best_proj(glp_tree *T) { /* select subproblem using the best projection heuristic */ IOSNPD *root, *node; int p; double best, deg, obj; /* the global bound must exist */ xassert(T->mip->mip_stat == GLP_FEAS); /* obtain pointer to the root node, which must exist */ root = T->slot[1].node; xassert(root != NULL); /* deg estimates degradation of the objective function per unit of the sum of integer infeasibilities */ xassert(root->ii_sum > 0.0); deg = (T->mip->mip_obj - root->bound) / root->ii_sum; /* nothing has been selected so far */ p = 0, best = DBL_MAX; /* walk through the list of active subproblems */ for (node = T->head; node != NULL; node = node->next) { xassert(node->up != NULL); /* obj estimates optimal objective value if the sum of integer infeasibilities were zero */ obj = node->up->bound + deg * node->up->ii_sum; if (T->mip->dir == GLP_MAX) obj = - obj; /* select the subproblem which has the best estimated optimal objective value */ if (best > obj) p = node->p, best = obj; } return p; } static int best_node(glp_tree *T) { /* select subproblem with best local bound */ IOSNPD *node, *best = NULL; double bound, eps; switch (T->mip->dir) { case GLP_MIN: bound = +DBL_MAX; for (node = T->head; node != NULL; node = node->next) if (bound > node->bound) bound = node->bound; xassert(bound != +DBL_MAX); eps = 1e-10 * (1.0 + fabs(bound)); for (node = T->head; node != NULL; node = node->next) { if (node->bound <= bound + eps) { xassert(node->up != NULL); if (best == NULL || #if 1 best->up->ii_sum > node->up->ii_sum) best = node; #else best->lp_obj > node->lp_obj) best = node; #endif } } break; case GLP_MAX: bound = -DBL_MAX; for (node = T->head; node != NULL; node = node->next) if (bound < node->bound) bound = node->bound; xassert(bound != -DBL_MAX); eps = 1e-10 * (1.0 + fabs(bound)); for (node = T->head; node != NULL; node = node->next) { if (node->bound >= bound - eps) { xassert(node->up != NULL); if (best == NULL || #if 1 best->up->ii_sum > node->up->ii_sum) best = node; #else best->lp_obj < node->lp_obj) best = node; #endif } } break; default: xassert(T != T); } xassert(best != NULL); return best->p; } /* eof */ glpk-5.0/src/draft/glpipm.c0000644000062000006210000011372613766346220015037 0ustar maomkpasswd/* glpipm.c */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2000-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "glpipm.h" #include "glpmat.h" #define ITER_MAX 100 /* maximal number of iterations */ struct csa { /* common storage area */ /*--------------------------------------------------------------*/ /* LP data */ int m; /* number of rows (equality constraints) */ int n; /* number of columns (structural variables) */ int *A_ptr; /* int A_ptr[1+m+1]; */ int *A_ind; /* int A_ind[A_ptr[m+1]]; */ double *A_val; /* double A_val[A_ptr[m+1]]; */ /* mxn-matrix A in storage-by-rows format */ double *b; /* double b[1+m]; */ /* m-vector b of right-hand sides */ double *c; /* double c[1+n]; */ /* n-vector c of objective coefficients; c[0] is constant term of the objective function */ /*--------------------------------------------------------------*/ /* LP solution */ double *x; /* double x[1+n]; */ double *y; /* double y[1+m]; */ double *z; /* double z[1+n]; */ /* current point in primal-dual space; the best point on exit */ /*--------------------------------------------------------------*/ /* control parameters */ const glp_iptcp *parm; /*--------------------------------------------------------------*/ /* working arrays and variables */ double *D; /* double D[1+n]; */ /* diagonal nxn-matrix D = X*inv(Z), where X = diag(x[j]) and Z = diag(z[j]) */ int *P; /* int P[1+m+m]; */ /* permutation mxm-matrix P used to minimize fill-in in Cholesky factorization */ int *S_ptr; /* int S_ptr[1+m+1]; */ int *S_ind; /* int S_ind[S_ptr[m+1]]; */ double *S_val; /* double S_val[S_ptr[m+1]]; */ double *S_diag; /* double S_diag[1+m]; */ /* symmetric mxm-matrix S = P*A*D*A'*P' whose upper triangular part without diagonal elements is stored in S_ptr, S_ind, and S_val in storage-by-rows format, diagonal elements are stored in S_diag */ int *U_ptr; /* int U_ptr[1+m+1]; */ int *U_ind; /* int U_ind[U_ptr[m+1]]; */ double *U_val; /* double U_val[U_ptr[m+1]]; */ double *U_diag; /* double U_diag[1+m]; */ /* upper triangular mxm-matrix U defining Cholesky factorization S = U'*U; its non-diagonal elements are stored in U_ptr, U_ind, U_val in storage-by-rows format, diagonal elements are stored in U_diag */ int iter; /* iteration number (0, 1, 2, ...); iter = 0 corresponds to the initial point */ double obj; /* current value of the objective function */ double rpi; /* relative primal infeasibility rpi = ||A*x-b||/(1+||b||) */ double rdi; /* relative dual infeasibility rdi = ||A'*y+z-c||/(1+||c||) */ double gap; /* primal-dual gap = |c'*x-b'*y|/(1+|c'*x|) which is a relative difference between primal and dual objective functions */ double phi; /* merit function phi = ||A*x-b||/max(1,||b||) + + ||A'*y+z-c||/max(1,||c||) + + |c'*x-b'*y|/max(1,||b||,||c||) */ double mu; /* duality measure mu = x'*z/n (used as barrier parameter) */ double rmu; /* rmu = max(||A*x-b||,||A'*y+z-c||)/mu */ double rmu0; /* the initial value of rmu on iteration 0 */ double *phi_min; /* double phi_min[1+ITER_MAX]; */ /* phi_min[k] = min(phi[k]), where phi[k] is the value of phi on k-th iteration, 0 <= k <= iter */ int best_iter; /* iteration number, on which the value of phi reached its best (minimal) value */ double *best_x; /* double best_x[1+n]; */ double *best_y; /* double best_y[1+m]; */ double *best_z; /* double best_z[1+n]; */ /* best point (in the sense of the merit function phi) which has been reached on iteration iter_best */ double best_obj; /* objective value at the best point */ double *dx_aff; /* double dx_aff[1+n]; */ double *dy_aff; /* double dy_aff[1+m]; */ double *dz_aff; /* double dz_aff[1+n]; */ /* affine scaling direction */ double alfa_aff_p, alfa_aff_d; /* maximal primal and dual stepsizes in affine scaling direction, on which x and z are still non-negative */ double mu_aff; /* duality measure mu_aff = x_aff'*z_aff/n in the boundary point x_aff' = x+alfa_aff_p*dx_aff, z_aff' = z+alfa_aff_d*dz_aff */ double sigma; /* Mehrotra's heuristic parameter (0 <= sigma <= 1) */ double *dx_cc; /* double dx_cc[1+n]; */ double *dy_cc; /* double dy_cc[1+m]; */ double *dz_cc; /* double dz_cc[1+n]; */ /* centering corrector direction */ double *dx; /* double dx[1+n]; */ double *dy; /* double dy[1+m]; */ double *dz; /* double dz[1+n]; */ /* final combined direction dx = dx_aff+dx_cc, dy = dy_aff+dy_cc, dz = dz_aff+dz_cc */ double alfa_max_p; double alfa_max_d; /* maximal primal and dual stepsizes in combined direction, on which x and z are still non-negative */ }; /*********************************************************************** * initialize - allocate and initialize common storage area * * This routine allocates and initializes the common storage area (CSA) * used by interior-point method routines. */ static void initialize(struct csa *csa) { int m = csa->m; int n = csa->n; int i; if (csa->parm->msg_lev >= GLP_MSG_ALL) xprintf("Matrix A has %d non-zeros\n", csa->A_ptr[m+1]-1); csa->D = xcalloc(1+n, sizeof(double)); /* P := I */ csa->P = xcalloc(1+m+m, sizeof(int)); for (i = 1; i <= m; i++) csa->P[i] = csa->P[m+i] = i; /* S := A*A', symbolically */ csa->S_ptr = xcalloc(1+m+1, sizeof(int)); csa->S_ind = adat_symbolic(m, n, csa->P, csa->A_ptr, csa->A_ind, csa->S_ptr); if (csa->parm->msg_lev >= GLP_MSG_ALL) xprintf("Matrix S = A*A' has %d non-zeros (upper triangle)\n", csa->S_ptr[m+1]-1 + m); /* determine P using specified ordering algorithm */ if (csa->parm->ord_alg == GLP_ORD_NONE) { if (csa->parm->msg_lev >= GLP_MSG_ALL) xprintf("Original ordering is being used\n"); for (i = 1; i <= m; i++) csa->P[i] = csa->P[m+i] = i; } else if (csa->parm->ord_alg == GLP_ORD_QMD) { if (csa->parm->msg_lev >= GLP_MSG_ALL) xprintf("Minimum degree ordering (QMD)...\n"); min_degree(m, csa->S_ptr, csa->S_ind, csa->P); } else if (csa->parm->ord_alg == GLP_ORD_AMD) { if (csa->parm->msg_lev >= GLP_MSG_ALL) xprintf("Approximate minimum degree ordering (AMD)...\n"); amd_order1(m, csa->S_ptr, csa->S_ind, csa->P); } else if (csa->parm->ord_alg == GLP_ORD_SYMAMD) { if (csa->parm->msg_lev >= GLP_MSG_ALL) xprintf("Approximate minimum degree ordering (SYMAMD)...\n") ; symamd_ord(m, csa->S_ptr, csa->S_ind, csa->P); } else xassert(csa != csa); /* S := P*A*A'*P', symbolically */ xfree(csa->S_ind); csa->S_ind = adat_symbolic(m, n, csa->P, csa->A_ptr, csa->A_ind, csa->S_ptr); csa->S_val = xcalloc(csa->S_ptr[m+1], sizeof(double)); csa->S_diag = xcalloc(1+m, sizeof(double)); /* compute Cholesky factorization S = U'*U, symbolically */ if (csa->parm->msg_lev >= GLP_MSG_ALL) xprintf("Computing Cholesky factorization S = L*L'...\n"); csa->U_ptr = xcalloc(1+m+1, sizeof(int)); csa->U_ind = chol_symbolic(m, csa->S_ptr, csa->S_ind, csa->U_ptr); if (csa->parm->msg_lev >= GLP_MSG_ALL) xprintf("Matrix L has %d non-zeros\n", csa->U_ptr[m+1]-1 + m); csa->U_val = xcalloc(csa->U_ptr[m+1], sizeof(double)); csa->U_diag = xcalloc(1+m, sizeof(double)); csa->iter = 0; csa->obj = 0.0; csa->rpi = 0.0; csa->rdi = 0.0; csa->gap = 0.0; csa->phi = 0.0; csa->mu = 0.0; csa->rmu = 0.0; csa->rmu0 = 0.0; csa->phi_min = xcalloc(1+ITER_MAX, sizeof(double)); csa->best_iter = 0; csa->best_x = xcalloc(1+n, sizeof(double)); csa->best_y = xcalloc(1+m, sizeof(double)); csa->best_z = xcalloc(1+n, sizeof(double)); csa->best_obj = 0.0; csa->dx_aff = xcalloc(1+n, sizeof(double)); csa->dy_aff = xcalloc(1+m, sizeof(double)); csa->dz_aff = xcalloc(1+n, sizeof(double)); csa->alfa_aff_p = 0.0; csa->alfa_aff_d = 0.0; csa->mu_aff = 0.0; csa->sigma = 0.0; csa->dx_cc = xcalloc(1+n, sizeof(double)); csa->dy_cc = xcalloc(1+m, sizeof(double)); csa->dz_cc = xcalloc(1+n, sizeof(double)); csa->dx = csa->dx_aff; csa->dy = csa->dy_aff; csa->dz = csa->dz_aff; csa->alfa_max_p = 0.0; csa->alfa_max_d = 0.0; return; } /*********************************************************************** * A_by_vec - compute y = A*x * * This routine computes matrix-vector product y = A*x, where A is the * constraint matrix. */ static void A_by_vec(struct csa *csa, double x[], double y[]) { /* compute y = A*x */ int m = csa->m; int *A_ptr = csa->A_ptr; int *A_ind = csa->A_ind; double *A_val = csa->A_val; int i, t, beg, end; double temp; for (i = 1; i <= m; i++) { temp = 0.0; beg = A_ptr[i], end = A_ptr[i+1]; for (t = beg; t < end; t++) temp += A_val[t] * x[A_ind[t]]; y[i] = temp; } return; } /*********************************************************************** * AT_by_vec - compute y = A'*x * * This routine computes matrix-vector product y = A'*x, where A' is a * matrix transposed to the constraint matrix A. */ static void AT_by_vec(struct csa *csa, double x[], double y[]) { /* compute y = A'*x, where A' is transposed to A */ int m = csa->m; int n = csa->n; int *A_ptr = csa->A_ptr; int *A_ind = csa->A_ind; double *A_val = csa->A_val; int i, j, t, beg, end; double temp; for (j = 1; j <= n; j++) y[j] = 0.0; for (i = 1; i <= m; i++) { temp = x[i]; if (temp == 0.0) continue; beg = A_ptr[i], end = A_ptr[i+1]; for (t = beg; t < end; t++) y[A_ind[t]] += A_val[t] * temp; } return; } /*********************************************************************** * decomp_NE - numeric factorization of matrix S = P*A*D*A'*P' * * This routine implements numeric phase of Cholesky factorization of * the matrix S = P*A*D*A'*P', which is a permuted matrix of the normal * equation system. Matrix D is assumed to be already computed. */ static void decomp_NE(struct csa *csa) { adat_numeric(csa->m, csa->n, csa->P, csa->A_ptr, csa->A_ind, csa->A_val, csa->D, csa->S_ptr, csa->S_ind, csa->S_val, csa->S_diag); chol_numeric(csa->m, csa->S_ptr, csa->S_ind, csa->S_val, csa->S_diag, csa->U_ptr, csa->U_ind, csa->U_val, csa->U_diag); return; } /*********************************************************************** * solve_NE - solve normal equation system * * This routine solves the normal equation system: * * A*D*A'*y = h. * * It is assumed that the matrix A*D*A' has been previously factorized * by the routine decomp_NE. * * On entry the array y contains the vector of right-hand sides h. On * exit this array contains the computed vector of unknowns y. * * Once the vector y has been computed the routine checks for numeric * stability. If the residual vector: * * r = A*D*A'*y - h * * is relatively small, the routine returns zero, otherwise non-zero is * returned. */ static int solve_NE(struct csa *csa, double y[]) { int m = csa->m; int n = csa->n; int *P = csa->P; int i, j, ret = 0; double *h, *r, *w; /* save vector of right-hand sides h */ h = xcalloc(1+m, sizeof(double)); for (i = 1; i <= m; i++) h[i] = y[i]; /* solve normal equation system (A*D*A')*y = h */ /* since S = P*A*D*A'*P' = U'*U, then A*D*A' = P'*U'*U*P, so we have inv(A*D*A') = P'*inv(U)*inv(U')*P */ /* w := P*h */ w = xcalloc(1+m, sizeof(double)); for (i = 1; i <= m; i++) w[i] = y[P[i]]; /* w := inv(U')*w */ ut_solve(m, csa->U_ptr, csa->U_ind, csa->U_val, csa->U_diag, w); /* w := inv(U)*w */ u_solve(m, csa->U_ptr, csa->U_ind, csa->U_val, csa->U_diag, w); /* y := P'*w */ for (i = 1; i <= m; i++) y[i] = w[P[m+i]]; xfree(w); /* compute residual vector r = A*D*A'*y - h */ r = xcalloc(1+m, sizeof(double)); /* w := A'*y */ w = xcalloc(1+n, sizeof(double)); AT_by_vec(csa, y, w); /* w := D*w */ for (j = 1; j <= n; j++) w[j] *= csa->D[j]; /* r := A*w */ A_by_vec(csa, w, r); xfree(w); /* r := r - h */ for (i = 1; i <= m; i++) r[i] -= h[i]; /* check for numeric stability */ for (i = 1; i <= m; i++) { if (fabs(r[i]) / (1.0 + fabs(h[i])) > 1e-4) { ret = 1; break; } } xfree(h); xfree(r); return ret; } /*********************************************************************** * solve_NS - solve Newtonian system * * This routine solves the Newtonian system: * * A*dx = p * * A'*dy + dz = q * * Z*dx + X*dz = r * * where X = diag(x[j]), Z = diag(z[j]), by reducing it to the normal * equation system: * * (A*inv(Z)*X*A')*dy = A*inv(Z)*(X*q-r)+p * * (it is assumed that the matrix A*inv(Z)*X*A' has been factorized by * the routine decomp_NE). * * Once vector dy has been computed the routine computes vectors dx and * dz as follows: * * dx = inv(Z)*(X*(A'*dy-q)+r) * * dz = inv(X)*(r-Z*dx) * * The routine solve_NS returns the same code which was reported by the * routine solve_NE (see above). */ static int solve_NS(struct csa *csa, double p[], double q[], double r[], double dx[], double dy[], double dz[]) { int m = csa->m; int n = csa->n; double *x = csa->x; double *z = csa->z; int i, j, ret; double *w = dx; /* compute the vector of right-hand sides A*inv(Z)*(X*q-r)+p for the normal equation system */ for (j = 1; j <= n; j++) w[j] = (x[j] * q[j] - r[j]) / z[j]; A_by_vec(csa, w, dy); for (i = 1; i <= m; i++) dy[i] += p[i]; /* solve the normal equation system to compute vector dy */ ret = solve_NE(csa, dy); /* compute vectors dx and dz */ AT_by_vec(csa, dy, dx); for (j = 1; j <= n; j++) { dx[j] = (x[j] * (dx[j] - q[j]) + r[j]) / z[j]; dz[j] = (r[j] - z[j] * dx[j]) / x[j]; } return ret; } /*********************************************************************** * initial_point - choose initial point using Mehrotra's heuristic * * This routine chooses a starting point using a heuristic proposed in * the paper: * * S. Mehrotra. On the implementation of a primal-dual interior point * method. SIAM J. on Optim., 2(4), pp. 575-601, 1992. * * The starting point x in the primal space is chosen as a solution of * the following least squares problem: * * minimize ||x|| * * subject to A*x = b * * which can be computed explicitly as follows: * * x = A'*inv(A*A')*b * * Similarly, the starting point (y, z) in the dual space is chosen as * a solution of the following least squares problem: * * minimize ||z|| * * subject to A'*y + z = c * * which can be computed explicitly as follows: * * y = inv(A*A')*A*c * * z = c - A'*y * * However, some components of the vectors x and z may be non-positive * or close to zero, so the routine uses a Mehrotra's heuristic to find * a more appropriate starting point. */ static void initial_point(struct csa *csa) { int m = csa->m; int n = csa->n; double *b = csa->b; double *c = csa->c; double *x = csa->x; double *y = csa->y; double *z = csa->z; double *D = csa->D; int i, j; double dp, dd, ex, ez, xz; /* factorize A*A' */ for (j = 1; j <= n; j++) D[j] = 1.0; decomp_NE(csa); /* x~ = A'*inv(A*A')*b */ for (i = 1; i <= m; i++) y[i] = b[i]; solve_NE(csa, y); AT_by_vec(csa, y, x); /* y~ = inv(A*A')*A*c */ A_by_vec(csa, c, y); solve_NE(csa, y); /* z~ = c - A'*y~ */ AT_by_vec(csa, y,z); for (j = 1; j <= n; j++) z[j] = c[j] - z[j]; /* use Mehrotra's heuristic in order to choose more appropriate starting point with positive components of vectors x and z */ dp = dd = 0.0; for (j = 1; j <= n; j++) { if (dp < -1.5 * x[j]) dp = -1.5 * x[j]; if (dd < -1.5 * z[j]) dd = -1.5 * z[j]; } /* note that b = 0 involves x = 0, and c = 0 involves y = 0 and z = 0, so we need to be careful */ if (dp == 0.0) dp = 1.5; if (dd == 0.0) dd = 1.5; ex = ez = xz = 0.0; for (j = 1; j <= n; j++) { ex += (x[j] + dp); ez += (z[j] + dd); xz += (x[j] + dp) * (z[j] + dd); } dp += 0.5 * (xz / ez); dd += 0.5 * (xz / ex); for (j = 1; j <= n; j++) { x[j] += dp; z[j] += dd; xassert(x[j] > 0.0 && z[j] > 0.0); } return; } /*********************************************************************** * basic_info - perform basic computations at the current point * * This routine computes the following quantities at the current point: * * 1) value of the objective function: * * F = c'*x + c[0] * * 2) relative primal infeasibility: * * rpi = ||A*x-b|| / (1+||b||) * * 3) relative dual infeasibility: * * rdi = ||A'*y+z-c|| / (1+||c||) * * 4) primal-dual gap (relative difference between the primal and the * dual objective function values): * * gap = |c'*x-b'*y| / (1+|c'*x|) * * 5) merit function: * * phi = ||A*x-b|| / max(1,||b||) + ||A'*y+z-c|| / max(1,||c||) + * * + |c'*x-b'*y| / max(1,||b||,||c||) * * 6) duality measure: * * mu = x'*z / n * * 7) the ratio of infeasibility to mu: * * rmu = max(||A*x-b||,||A'*y+z-c||) / mu * * where ||*|| denotes euclidian norm, *' denotes transposition. */ static void basic_info(struct csa *csa) { int m = csa->m; int n = csa->n; double *b = csa->b; double *c = csa->c; double *x = csa->x; double *y = csa->y; double *z = csa->z; int i, j; double norm1, bnorm, norm2, cnorm, cx, by, *work, temp; /* compute value of the objective function */ temp = c[0]; for (j = 1; j <= n; j++) temp += c[j] * x[j]; csa->obj = temp; /* norm1 = ||A*x-b|| */ work = xcalloc(1+m, sizeof(double)); A_by_vec(csa, x, work); norm1 = 0.0; for (i = 1; i <= m; i++) norm1 += (work[i] - b[i]) * (work[i] - b[i]); norm1 = sqrt(norm1); xfree(work); /* bnorm = ||b|| */ bnorm = 0.0; for (i = 1; i <= m; i++) bnorm += b[i] * b[i]; bnorm = sqrt(bnorm); /* compute relative primal infeasibility */ csa->rpi = norm1 / (1.0 + bnorm); /* norm2 = ||A'*y+z-c|| */ work = xcalloc(1+n, sizeof(double)); AT_by_vec(csa, y, work); norm2 = 0.0; for (j = 1; j <= n; j++) norm2 += (work[j] + z[j] - c[j]) * (work[j] + z[j] - c[j]); norm2 = sqrt(norm2); xfree(work); /* cnorm = ||c|| */ cnorm = 0.0; for (j = 1; j <= n; j++) cnorm += c[j] * c[j]; cnorm = sqrt(cnorm); /* compute relative dual infeasibility */ csa->rdi = norm2 / (1.0 + cnorm); /* by = b'*y */ by = 0.0; for (i = 1; i <= m; i++) by += b[i] * y[i]; /* cx = c'*x */ cx = 0.0; for (j = 1; j <= n; j++) cx += c[j] * x[j]; /* compute primal-dual gap */ csa->gap = fabs(cx - by) / (1.0 + fabs(cx)); /* compute merit function */ csa->phi = 0.0; csa->phi += norm1 / (bnorm > 1.0 ? bnorm : 1.0); csa->phi += norm2 / (cnorm > 1.0 ? cnorm : 1.0); temp = 1.0; if (temp < bnorm) temp = bnorm; if (temp < cnorm) temp = cnorm; csa->phi += fabs(cx - by) / temp; /* compute duality measure */ temp = 0.0; for (j = 1; j <= n; j++) temp += x[j] * z[j]; csa->mu = temp / (double)n; /* compute the ratio of infeasibility to mu */ csa->rmu = (norm1 > norm2 ? norm1 : norm2) / csa->mu; return; } /*********************************************************************** * make_step - compute next point using Mehrotra's technique * * This routine computes the next point using the predictor-corrector * technique proposed in the paper: * * S. Mehrotra. On the implementation of a primal-dual interior point * method. SIAM J. on Optim., 2(4), pp. 575-601, 1992. * * At first, the routine computes so called affine scaling (predictor) * direction (dx_aff,dy_aff,dz_aff) which is a solution of the system: * * A*dx_aff = b - A*x * * A'*dy_aff + dz_aff = c - A'*y - z * * Z*dx_aff + X*dz_aff = - X*Z*e * * where (x,y,z) is the current point, X = diag(x[j]), Z = diag(z[j]), * e = (1,...,1)'. * * Then, the routine computes the centering parameter sigma, using the * following Mehrotra's heuristic: * * alfa_aff_p = inf{0 <= alfa <= 1 | x+alfa*dx_aff >= 0} * * alfa_aff_d = inf{0 <= alfa <= 1 | z+alfa*dz_aff >= 0} * * mu_aff = (x+alfa_aff_p*dx_aff)'*(z+alfa_aff_d*dz_aff)/n * * sigma = (mu_aff/mu)^3 * * where alfa_aff_p is the maximal stepsize along the affine scaling * direction in the primal space, alfa_aff_d is the maximal stepsize * along the same direction in the dual space. * * After determining sigma the routine computes so called centering * (corrector) direction (dx_cc,dy_cc,dz_cc) which is the solution of * the system: * * A*dx_cc = 0 * * A'*dy_cc + dz_cc = 0 * * Z*dx_cc + X*dz_cc = sigma*mu*e - X*Z*e * * Finally, the routine computes the combined direction * * (dx,dy,dz) = (dx_aff,dy_aff,dz_aff) + (dx_cc,dy_cc,dz_cc) * * and determines maximal primal and dual stepsizes along the combined * direction: * * alfa_max_p = inf{0 <= alfa <= 1 | x+alfa*dx >= 0} * * alfa_max_d = inf{0 <= alfa <= 1 | z+alfa*dz >= 0} * * In order to prevent the next point to be too close to the boundary * of the positive ortant, the routine decreases maximal stepsizes: * * alfa_p = gamma_p * alfa_max_p * * alfa_d = gamma_d * alfa_max_d * * where gamma_p and gamma_d are scaling factors, and computes the next * point: * * x_new = x + alfa_p * dx * * y_new = y + alfa_d * dy * * z_new = z + alfa_d * dz * * which becomes the current point on the next iteration. */ static int make_step(struct csa *csa) { int m = csa->m; int n = csa->n; double *b = csa->b; double *c = csa->c; double *x = csa->x; double *y = csa->y; double *z = csa->z; double *dx_aff = csa->dx_aff; double *dy_aff = csa->dy_aff; double *dz_aff = csa->dz_aff; double *dx_cc = csa->dx_cc; double *dy_cc = csa->dy_cc; double *dz_cc = csa->dz_cc; double *dx = csa->dx; double *dy = csa->dy; double *dz = csa->dz; int i, j, ret = 0; double temp, gamma_p, gamma_d, *p, *q, *r; /* allocate working arrays */ p = xcalloc(1+m, sizeof(double)); q = xcalloc(1+n, sizeof(double)); r = xcalloc(1+n, sizeof(double)); /* p = b - A*x */ A_by_vec(csa, x, p); for (i = 1; i <= m; i++) p[i] = b[i] - p[i]; /* q = c - A'*y - z */ AT_by_vec(csa, y,q); for (j = 1; j <= n; j++) q[j] = c[j] - q[j] - z[j]; /* r = - X * Z * e */ for (j = 1; j <= n; j++) r[j] = - x[j] * z[j]; /* solve the first Newtonian system */ if (solve_NS(csa, p, q, r, dx_aff, dy_aff, dz_aff)) { ret = 1; goto done; } /* alfa_aff_p = inf{0 <= alfa <= 1 | x + alfa*dx_aff >= 0} */ /* alfa_aff_d = inf{0 <= alfa <= 1 | z + alfa*dz_aff >= 0} */ csa->alfa_aff_p = csa->alfa_aff_d = 1.0; for (j = 1; j <= n; j++) { if (dx_aff[j] < 0.0) { temp = - x[j] / dx_aff[j]; if (csa->alfa_aff_p > temp) csa->alfa_aff_p = temp; } if (dz_aff[j] < 0.0) { temp = - z[j] / dz_aff[j]; if (csa->alfa_aff_d > temp) csa->alfa_aff_d = temp; } } /* mu_aff = (x+alfa_aff_p*dx_aff)' * (z+alfa_aff_d*dz_aff) / n */ temp = 0.0; for (j = 1; j <= n; j++) temp += (x[j] + csa->alfa_aff_p * dx_aff[j]) * (z[j] + csa->alfa_aff_d * dz_aff[j]); csa->mu_aff = temp / (double)n; /* sigma = (mu_aff/mu)^3 */ temp = csa->mu_aff / csa->mu; csa->sigma = temp * temp * temp; /* p = 0 */ for (i = 1; i <= m; i++) p[i] = 0.0; /* q = 0 */ for (j = 1; j <= n; j++) q[j] = 0.0; /* r = sigma * mu * e - X * Z * e */ for (j = 1; j <= n; j++) r[j] = csa->sigma * csa->mu - dx_aff[j] * dz_aff[j]; /* solve the second Newtonian system with the same coefficients but with altered right-hand sides */ if (solve_NS(csa, p, q, r, dx_cc, dy_cc, dz_cc)) { ret = 1; goto done; } /* (dx,dy,dz) = (dx_aff,dy_aff,dz_aff) + (dx_cc,dy_cc,dz_cc) */ for (j = 1; j <= n; j++) dx[j] = dx_aff[j] + dx_cc[j]; for (i = 1; i <= m; i++) dy[i] = dy_aff[i] + dy_cc[i]; for (j = 1; j <= n; j++) dz[j] = dz_aff[j] + dz_cc[j]; /* alfa_max_p = inf{0 <= alfa <= 1 | x + alfa*dx >= 0} */ /* alfa_max_d = inf{0 <= alfa <= 1 | z + alfa*dz >= 0} */ csa->alfa_max_p = csa->alfa_max_d = 1.0; for (j = 1; j <= n; j++) { if (dx[j] < 0.0) { temp = - x[j] / dx[j]; if (csa->alfa_max_p > temp) csa->alfa_max_p = temp; } if (dz[j] < 0.0) { temp = - z[j] / dz[j]; if (csa->alfa_max_d > temp) csa->alfa_max_d = temp; } } /* determine scale factors (not implemented yet) */ gamma_p = 0.90; gamma_d = 0.90; /* compute the next point */ for (j = 1; j <= n; j++) { x[j] += gamma_p * csa->alfa_max_p * dx[j]; xassert(x[j] > 0.0); } for (i = 1; i <= m; i++) y[i] += gamma_d * csa->alfa_max_d * dy[i]; for (j = 1; j <= n; j++) { z[j] += gamma_d * csa->alfa_max_d * dz[j]; xassert(z[j] > 0.0); } done: /* free working arrays */ xfree(p); xfree(q); xfree(r); return ret; } /*********************************************************************** * terminate - deallocate common storage area * * This routine frees all memory allocated to the common storage area * used by interior-point method routines. */ static void terminate(struct csa *csa) { xfree(csa->D); xfree(csa->P); xfree(csa->S_ptr); xfree(csa->S_ind); xfree(csa->S_val); xfree(csa->S_diag); xfree(csa->U_ptr); xfree(csa->U_ind); xfree(csa->U_val); xfree(csa->U_diag); xfree(csa->phi_min); xfree(csa->best_x); xfree(csa->best_y); xfree(csa->best_z); xfree(csa->dx_aff); xfree(csa->dy_aff); xfree(csa->dz_aff); xfree(csa->dx_cc); xfree(csa->dy_cc); xfree(csa->dz_cc); return; } /*********************************************************************** * ipm_main - main interior-point method routine * * This is a main routine of the primal-dual interior-point method. * * The routine ipm_main returns one of the following codes: * * 0 - optimal solution found; * 1 - problem has no feasible (primal or dual) solution; * 2 - no convergence; * 3 - iteration limit exceeded; * 4 - numeric instability on solving Newtonian system. * * In case of non-zero return code the routine returns the best point, * which has been reached during optimization. */ static int ipm_main(struct csa *csa) { int m = csa->m; int n = csa->n; int i, j, status; double temp; /* choose initial point using Mehrotra's heuristic */ if (csa->parm->msg_lev >= GLP_MSG_ALL) xprintf("Guessing initial point...\n"); initial_point(csa); /* main loop starts here */ if (csa->parm->msg_lev >= GLP_MSG_ALL) xprintf("Optimization begins...\n"); for (;;) { /* perform basic computations at the current point */ basic_info(csa); /* save initial value of rmu */ if (csa->iter == 0) csa->rmu0 = csa->rmu; /* accumulate values of min(phi[k]) and save the best point */ xassert(csa->iter <= ITER_MAX); if (csa->iter == 0 || csa->phi_min[csa->iter-1] > csa->phi) { csa->phi_min[csa->iter] = csa->phi; csa->best_iter = csa->iter; for (j = 1; j <= n; j++) csa->best_x[j] = csa->x[j]; for (i = 1; i <= m; i++) csa->best_y[i] = csa->y[i]; for (j = 1; j <= n; j++) csa->best_z[j] = csa->z[j]; csa->best_obj = csa->obj; } else csa->phi_min[csa->iter] = csa->phi_min[csa->iter-1]; /* display information at the current point */ if (csa->parm->msg_lev >= GLP_MSG_ON) xprintf("%3d: obj = %17.9e; rpi = %8.1e; rdi = %8.1e; gap =" " %8.1e\n", csa->iter, csa->obj, csa->rpi, csa->rdi, csa->gap); /* check if the current point is optimal */ if (csa->rpi < 1e-8 && csa->rdi < 1e-8 && csa->gap < 1e-8) { if (csa->parm->msg_lev >= GLP_MSG_ALL) xprintf("OPTIMAL SOLUTION FOUND\n"); status = 0; break; } /* check if the problem has no feasible solution */ temp = 1e5 * csa->phi_min[csa->iter]; if (temp < 1e-8) temp = 1e-8; if (csa->phi >= temp) { if (csa->parm->msg_lev >= GLP_MSG_ALL) xprintf("PROBLEM HAS NO FEASIBLE PRIMAL/DUAL SOLUTION\n") ; status = 1; break; } /* check for very slow convergence or divergence */ if (((csa->rpi >= 1e-8 || csa->rdi >= 1e-8) && csa->rmu / csa->rmu0 >= 1e6) || (csa->iter >= 30 && csa->phi_min[csa->iter] >= 0.5 * csa->phi_min[csa->iter - 30])) { if (csa->parm->msg_lev >= GLP_MSG_ALL) xprintf("NO CONVERGENCE; SEARCH TERMINATED\n"); status = 2; break; } /* check for maximal number of iterations */ if (csa->iter == ITER_MAX) { if (csa->parm->msg_lev >= GLP_MSG_ALL) xprintf("ITERATION LIMIT EXCEEDED; SEARCH TERMINATED\n"); status = 3; break; } /* start the next iteration */ csa->iter++; /* factorize normal equation system */ for (j = 1; j <= n; j++) csa->D[j] = csa->x[j] / csa->z[j]; decomp_NE(csa); /* compute the next point using Mehrotra's predictor-corrector technique */ if (make_step(csa)) { if (csa->parm->msg_lev >= GLP_MSG_ALL) xprintf("NUMERIC INSTABILITY; SEARCH TERMINATED\n"); status = 4; break; } } /* restore the best point */ if (status != 0) { for (j = 1; j <= n; j++) csa->x[j] = csa->best_x[j]; for (i = 1; i <= m; i++) csa->y[i] = csa->best_y[i]; for (j = 1; j <= n; j++) csa->z[j] = csa->best_z[j]; if (csa->parm->msg_lev >= GLP_MSG_ALL) xprintf("Best point %17.9e was reached on iteration %d\n", csa->best_obj, csa->best_iter); } /* return to the calling program */ return status; } /*********************************************************************** * NAME * * ipm_solve - core LP solver based on the interior-point method * * SYNOPSIS * * #include "glpipm.h" * int ipm_solve(glp_prob *P, const glp_iptcp *parm); * * DESCRIPTION * * The routine ipm_solve is a core LP solver based on the primal-dual * interior-point method. * * The routine assumes the following standard formulation of LP problem * to be solved: * * minimize * * F = c[0] + c[1]*x[1] + c[2]*x[2] + ... + c[n]*x[n] * * subject to linear constraints * * a[1,1]*x[1] + a[1,2]*x[2] + ... + a[1,n]*x[n] = b[1] * * a[2,1]*x[1] + a[2,2]*x[2] + ... + a[2,n]*x[n] = b[2] * * . . . . . . * * a[m,1]*x[1] + a[m,2]*x[2] + ... + a[m,n]*x[n] = b[m] * * and non-negative variables * * x[1] >= 0, x[2] >= 0, ..., x[n] >= 0 * * where: * F is the objective function; * x[1], ..., x[n] are (structural) variables; * c[0] is a constant term of the objective function; * c[1], ..., c[n] are objective coefficients; * a[1,1], ..., a[m,n] are constraint coefficients; * b[1], ..., b[n] are right-hand sides. * * The solution is three vectors x, y, and z, which are stored by the * routine in the arrays x, y, and z, respectively. These vectors * correspond to the best primal-dual point found during optimization. * They are approximate solution of the following system (which is the * Karush-Kuhn-Tucker optimality conditions): * * A*x = b (primal feasibility condition) * * A'*y + z = c (dual feasibility condition) * * x'*z = 0 (primal-dual complementarity condition) * * x >= 0, z >= 0 (non-negativity condition) * * where: * x[1], ..., x[n] are primal (structural) variables; * y[1], ..., y[m] are dual variables (Lagrange multipliers) for * equality constraints; * z[1], ..., z[n] are dual variables (Lagrange multipliers) for * non-negativity constraints. * * RETURNS * * 0 LP has been successfully solved. * * GLP_ENOCVG * No convergence. * * GLP_EITLIM * Iteration limit exceeded. * * GLP_EINSTAB * Numeric instability on solving Newtonian system. * * In case of non-zero return code the routine returns the best point, * which has been reached during optimization. */ int ipm_solve(glp_prob *P, const glp_iptcp *parm) { struct csa _dsa, *csa = &_dsa; int m = P->m; int n = P->n; int nnz = P->nnz; GLPROW *row; GLPCOL *col; GLPAIJ *aij; int i, j, loc, ret, *A_ind, *A_ptr; double dir, *A_val, *b, *c, *x, *y, *z; xassert(m > 0); xassert(n > 0); /* allocate working arrays */ A_ptr = xcalloc(1+m+1, sizeof(int)); A_ind = xcalloc(1+nnz, sizeof(int)); A_val = xcalloc(1+nnz, sizeof(double)); b = xcalloc(1+m, sizeof(double)); c = xcalloc(1+n, sizeof(double)); x = xcalloc(1+n, sizeof(double)); y = xcalloc(1+m, sizeof(double)); z = xcalloc(1+n, sizeof(double)); /* prepare rows and constraint coefficients */ loc = 1; for (i = 1; i <= m; i++) { row = P->row[i]; xassert(row->type == GLP_FX); b[i] = row->lb * row->rii; A_ptr[i] = loc; for (aij = row->ptr; aij != NULL; aij = aij->r_next) { A_ind[loc] = aij->col->j; A_val[loc] = row->rii * aij->val * aij->col->sjj; loc++; } } A_ptr[m+1] = loc; xassert(loc-1 == nnz); /* prepare columns and objective coefficients */ if (P->dir == GLP_MIN) dir = +1.0; else if (P->dir == GLP_MAX) dir = -1.0; else xassert(P != P); c[0] = dir * P->c0; for (j = 1; j <= n; j++) { col = P->col[j]; xassert(col->type == GLP_LO && col->lb == 0.0); c[j] = dir * col->coef * col->sjj; } /* allocate and initialize the common storage area */ csa->m = m; csa->n = n; csa->A_ptr = A_ptr; csa->A_ind = A_ind; csa->A_val = A_val; csa->b = b; csa->c = c; csa->x = x; csa->y = y; csa->z = z; csa->parm = parm; initialize(csa); /* solve LP with the interior-point method */ ret = ipm_main(csa); /* deallocate the common storage area */ terminate(csa); /* determine solution status */ if (ret == 0) { /* optimal solution found */ P->ipt_stat = GLP_OPT; ret = 0; } else if (ret == 1) { /* problem has no feasible (primal or dual) solution */ P->ipt_stat = GLP_NOFEAS; ret = 0; } else if (ret == 2) { /* no convergence */ P->ipt_stat = GLP_INFEAS; ret = GLP_ENOCVG; } else if (ret == 3) { /* iteration limit exceeded */ P->ipt_stat = GLP_INFEAS; ret = GLP_EITLIM; } else if (ret == 4) { /* numeric instability on solving Newtonian system */ P->ipt_stat = GLP_INFEAS; ret = GLP_EINSTAB; } else xassert(ret != ret); /* store row solution components */ for (i = 1; i <= m; i++) { row = P->row[i]; row->pval = row->lb; row->dval = dir * y[i] * row->rii; } /* store column solution components */ P->ipt_obj = P->c0; for (j = 1; j <= n; j++) { col = P->col[j]; col->pval = x[j] * col->sjj; col->dval = dir * z[j] / col->sjj; P->ipt_obj += col->coef * col->pval; } /* free working arrays */ xfree(A_ptr); xfree(A_ind); xfree(A_val); xfree(b); xfree(c); xfree(x); xfree(y); xfree(z); return ret; } /* eof */ glpk-5.0/src/draft/glpipm.h0000644000062000006210000000225213766346220015033 0ustar maomkpasswd/* glpipm.h (primal-dual interior-point method) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2000-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef GLPIPM_H #define GLPIPM_H #include "prob.h" #define ipm_solve _glp_ipm_solve int ipm_solve(glp_prob *P, const glp_iptcp *parm); /* core LP solver based on the interior-point method */ #endif /* eof */ glpk-5.0/src/draft/glpmat.c0000644000062000006210000010013313766346220015017 0ustar maomkpasswd/* glpmat.c */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2000-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "glpmat.h" #include "qmd.h" #include "amd.h" #include "colamd.h" /*---------------------------------------------------------------------- -- check_fvs - check sparse vector in full-vector storage format. -- -- SYNOPSIS -- -- #include "glpmat.h" -- int check_fvs(int n, int nnz, int ind[], double vec[]); -- -- DESCRIPTION -- -- The routine check_fvs checks if a given vector of dimension n in -- full-vector storage format has correct representation. -- -- RETURNS -- -- The routine returns one of the following codes: -- -- 0 - the vector is correct; -- 1 - the number of elements (n) is negative; -- 2 - the number of non-zero elements (nnz) is negative; -- 3 - some element index is out of range; -- 4 - some element index is duplicate; -- 5 - some non-zero element is out of pattern. */ int check_fvs(int n, int nnz, int ind[], double vec[]) { int i, t, ret, *flag = NULL; /* check the number of elements */ if (n < 0) { ret = 1; goto done; } /* check the number of non-zero elements */ if (nnz < 0) { ret = 2; goto done; } /* check vector indices */ flag = xcalloc(1+n, sizeof(int)); for (i = 1; i <= n; i++) flag[i] = 0; for (t = 1; t <= nnz; t++) { i = ind[t]; if (!(1 <= i && i <= n)) { ret = 3; goto done; } if (flag[i]) { ret = 4; goto done; } flag[i] = 1; } /* check vector elements */ for (i = 1; i <= n; i++) { if (!flag[i] && vec[i] != 0.0) { ret = 5; goto done; } } /* the vector is ok */ ret = 0; done: if (flag != NULL) xfree(flag); return ret; } /*---------------------------------------------------------------------- -- check_pattern - check pattern of sparse matrix. -- -- SYNOPSIS -- -- #include "glpmat.h" -- int check_pattern(int m, int n, int A_ptr[], int A_ind[]); -- -- DESCRIPTION -- -- The routine check_pattern checks the pattern of a given mxn matrix -- in storage-by-rows format. -- -- RETURNS -- -- The routine returns one of the following codes: -- -- 0 - the pattern is correct; -- 1 - the number of rows (m) is negative; -- 2 - the number of columns (n) is negative; -- 3 - A_ptr[1] is not 1; -- 4 - some column index is out of range; -- 5 - some column indices are duplicate. */ int check_pattern(int m, int n, int A_ptr[], int A_ind[]) { int i, j, ptr, ret, *flag = NULL; /* check the number of rows */ if (m < 0) { ret = 1; goto done; } /* check the number of columns */ if (n < 0) { ret = 2; goto done; } /* check location A_ptr[1] */ if (A_ptr[1] != 1) { ret = 3; goto done; } /* check row patterns */ flag = xcalloc(1+n, sizeof(int)); for (j = 1; j <= n; j++) flag[j] = 0; for (i = 1; i <= m; i++) { /* check pattern of row i */ for (ptr = A_ptr[i]; ptr < A_ptr[i+1]; ptr++) { j = A_ind[ptr]; /* check column index */ if (!(1 <= j && j <= n)) { ret = 4; goto done; } /* check for duplication */ if (flag[j]) { ret = 5; goto done; } flag[j] = 1; } /* clear flags */ for (ptr = A_ptr[i]; ptr < A_ptr[i+1]; ptr++) { j = A_ind[ptr]; flag[j] = 0; } } /* the pattern is ok */ ret = 0; done: if (flag != NULL) xfree(flag); return ret; } /*---------------------------------------------------------------------- -- transpose - transpose sparse matrix. -- -- *Synopsis* -- -- #include "glpmat.h" -- void transpose(int m, int n, int A_ptr[], int A_ind[], -- double A_val[], int AT_ptr[], int AT_ind[], double AT_val[]); -- -- *Description* -- -- For a given mxn sparse matrix A the routine transpose builds a nxm -- sparse matrix A' which is a matrix transposed to A. -- -- The arrays A_ptr, A_ind, and A_val specify a given mxn matrix A to -- be transposed in storage-by-rows format. The parameter A_val can be -- NULL, in which case numeric values are not copied. The arrays A_ptr, -- A_ind, and A_val are not changed on exit. -- -- On entry the arrays AT_ptr, AT_ind, and AT_val must be allocated, -- but their content is ignored. On exit the routine stores a resultant -- nxm matrix A' in these arrays in storage-by-rows format. Note that -- if the parameter A_val is NULL, the array AT_val is not used. -- -- The routine transpose has a side effect that elements in rows of the -- resultant matrix A' follow in ascending their column indices. */ void transpose(int m, int n, int A_ptr[], int A_ind[], double A_val[], int AT_ptr[], int AT_ind[], double AT_val[]) { int i, j, t, beg, end, pos, len; /* determine row lengths of resultant matrix */ for (j = 1; j <= n; j++) AT_ptr[j] = 0; for (i = 1; i <= m; i++) { beg = A_ptr[i], end = A_ptr[i+1]; for (t = beg; t < end; t++) AT_ptr[A_ind[t]]++; } /* set up row pointers of resultant matrix */ pos = 1; for (j = 1; j <= n; j++) len = AT_ptr[j], pos += len, AT_ptr[j] = pos; AT_ptr[n+1] = pos; /* build resultant matrix */ for (i = m; i >= 1; i--) { beg = A_ptr[i], end = A_ptr[i+1]; for (t = beg; t < end; t++) { pos = --AT_ptr[A_ind[t]]; AT_ind[pos] = i; if (A_val != NULL) AT_val[pos] = A_val[t]; } } return; } /*---------------------------------------------------------------------- -- adat_symbolic - compute S = P*A*D*A'*P' (symbolic phase). -- -- *Synopsis* -- -- #include "glpmat.h" -- int *adat_symbolic(int m, int n, int P_per[], int A_ptr[], -- int A_ind[], int S_ptr[]); -- -- *Description* -- -- The routine adat_symbolic implements the symbolic phase to compute -- symmetric matrix S = P*A*D*A'*P', where P is a permutation matrix, -- A is a given sparse matrix, D is a diagonal matrix, A' is a matrix -- transposed to A, P' is an inverse of P. -- -- The parameter m is the number of rows in A and the order of P. -- -- The parameter n is the number of columns in A and the order of D. -- -- The array P_per specifies permutation matrix P. It is not changed on -- exit. -- -- The arrays A_ptr and A_ind specify the pattern of matrix A. They are -- not changed on exit. -- -- On exit the routine stores the pattern of upper triangular part of -- matrix S without diagonal elements in the arrays S_ptr and S_ind in -- storage-by-rows format. The array S_ptr should be allocated on entry, -- however, its content is ignored. The array S_ind is allocated by the -- routine itself which returns a pointer to it. -- -- *Returns* -- -- The routine returns a pointer to the array S_ind. */ int *adat_symbolic(int m, int n, int P_per[], int A_ptr[], int A_ind[], int S_ptr[]) { int i, j, t, ii, jj, tt, k, size, len; int *S_ind, *AT_ptr, *AT_ind, *ind, *map, *temp; /* build the pattern of A', which is a matrix transposed to A, to efficiently access A in column-wise manner */ AT_ptr = xcalloc(1+n+1, sizeof(int)); AT_ind = xcalloc(A_ptr[m+1], sizeof(int)); transpose(m, n, A_ptr, A_ind, NULL, AT_ptr, AT_ind, NULL); /* allocate the array S_ind */ size = A_ptr[m+1] - 1; if (size < m) size = m; S_ind = xcalloc(1+size, sizeof(int)); /* allocate and initialize working arrays */ ind = xcalloc(1+m, sizeof(int)); map = xcalloc(1+m, sizeof(int)); for (jj = 1; jj <= m; jj++) map[jj] = 0; /* compute pattern of S; note that symbolically S = B*B', where B = P*A, B' is matrix transposed to B */ S_ptr[1] = 1; for (ii = 1; ii <= m; ii++) { /* compute pattern of ii-th row of S */ len = 0; i = P_per[ii]; /* i-th row of A = ii-th row of B */ for (t = A_ptr[i]; t < A_ptr[i+1]; t++) { k = A_ind[t]; /* walk through k-th column of A */ for (tt = AT_ptr[k]; tt < AT_ptr[k+1]; tt++) { j = AT_ind[tt]; jj = P_per[m+j]; /* j-th row of A = jj-th row of B */ /* a[i,k] != 0 and a[j,k] != 0 ergo s[ii,jj] != 0 */ if (ii < jj && !map[jj]) ind[++len] = jj, map[jj] = 1; } } /* now (ind) is pattern of ii-th row of S */ S_ptr[ii+1] = S_ptr[ii] + len; /* at least (S_ptr[ii+1] - 1) locations should be available in the array S_ind */ if (S_ptr[ii+1] - 1 > size) { temp = S_ind; size += size; S_ind = xcalloc(1+size, sizeof(int)); memcpy(&S_ind[1], &temp[1], (S_ptr[ii] - 1) * sizeof(int)); xfree(temp); } xassert(S_ptr[ii+1] - 1 <= size); /* (ii-th row of S) := (ind) */ memcpy(&S_ind[S_ptr[ii]], &ind[1], len * sizeof(int)); /* clear the row pattern map */ for (t = 1; t <= len; t++) map[ind[t]] = 0; } /* free working arrays */ xfree(AT_ptr); xfree(AT_ind); xfree(ind); xfree(map); /* reallocate the array S_ind to free unused locations */ temp = S_ind; size = S_ptr[m+1] - 1; S_ind = xcalloc(1+size, sizeof(int)); memcpy(&S_ind[1], &temp[1], size * sizeof(int)); xfree(temp); return S_ind; } /*---------------------------------------------------------------------- -- adat_numeric - compute S = P*A*D*A'*P' (numeric phase). -- -- *Synopsis* -- -- #include "glpmat.h" -- void adat_numeric(int m, int n, int P_per[], -- int A_ptr[], int A_ind[], double A_val[], double D_diag[], -- int S_ptr[], int S_ind[], double S_val[], double S_diag[]); -- -- *Description* -- -- The routine adat_numeric implements the numeric phase to compute -- symmetric matrix S = P*A*D*A'*P', where P is a permutation matrix, -- A is a given sparse matrix, D is a diagonal matrix, A' is a matrix -- transposed to A, P' is an inverse of P. -- -- The parameter m is the number of rows in A and the order of P. -- -- The parameter n is the number of columns in A and the order of D. -- -- The matrix P is specified in the array P_per, which is not changed -- on exit. -- -- The matrix A is specified in the arrays A_ptr, A_ind, and A_val in -- storage-by-rows format. These arrays are not changed on exit. -- -- Diagonal elements of the matrix D are specified in the array D_diag, -- where D_diag[0] is not used, D_diag[i] = d[i,i] for i = 1, ..., n. -- The array D_diag is not changed on exit. -- -- The pattern of the upper triangular part of the matrix S without -- diagonal elements (previously computed by the routine adat_symbolic) -- is specified in the arrays S_ptr and S_ind, which are not changed on -- exit. Numeric values of non-diagonal elements of S are stored in -- corresponding locations of the array S_val, and values of diagonal -- elements of S are stored in locations S_diag[1], ..., S_diag[n]. */ void adat_numeric(int m, int n, int P_per[], int A_ptr[], int A_ind[], double A_val[], double D_diag[], int S_ptr[], int S_ind[], double S_val[], double S_diag[]) { int i, j, t, ii, jj, tt, beg, end, beg1, end1, k; double sum, *work; work = xcalloc(1+n, sizeof(double)); for (j = 1; j <= n; j++) work[j] = 0.0; /* compute S = B*D*B', where B = P*A, B' is a matrix transposed to B */ for (ii = 1; ii <= m; ii++) { i = P_per[ii]; /* i-th row of A = ii-th row of B */ /* (work) := (i-th row of A) */ beg = A_ptr[i], end = A_ptr[i+1]; for (t = beg; t < end; t++) work[A_ind[t]] = A_val[t]; /* compute ii-th row of S */ beg = S_ptr[ii], end = S_ptr[ii+1]; for (t = beg; t < end; t++) { jj = S_ind[t]; j = P_per[jj]; /* j-th row of A = jj-th row of B */ /* s[ii,jj] := sum a[i,k] * d[k,k] * a[j,k] */ sum = 0.0; beg1 = A_ptr[j], end1 = A_ptr[j+1]; for (tt = beg1; tt < end1; tt++) { k = A_ind[tt]; sum += work[k] * D_diag[k] * A_val[tt]; } S_val[t] = sum; } /* s[ii,ii] := sum a[i,k] * d[k,k] * a[i,k] */ sum = 0.0; beg = A_ptr[i], end = A_ptr[i+1]; for (t = beg; t < end; t++) { k = A_ind[t]; sum += A_val[t] * D_diag[k] * A_val[t]; work[k] = 0.0; } S_diag[ii] = sum; } xfree(work); return; } /*---------------------------------------------------------------------- -- min_degree - minimum degree ordering. -- -- *Synopsis* -- -- #include "glpmat.h" -- void min_degree(int n, int A_ptr[], int A_ind[], int P_per[]); -- -- *Description* -- -- The routine min_degree uses the minimum degree ordering algorithm -- to find a permutation matrix P for a given sparse symmetric positive -- matrix A which minimizes the number of non-zeros in upper triangular -- factor U for Cholesky factorization P*A*P' = U'*U. -- -- The parameter n is the order of matrices A and P. -- -- The pattern of the given matrix A is specified on entry in the arrays -- A_ptr and A_ind in storage-by-rows format. Only the upper triangular -- part without diagonal elements (which all are assumed to be non-zero) -- should be specified as if A were upper triangular. The arrays A_ptr -- and A_ind are not changed on exit. -- -- The permutation matrix P is stored by the routine in the array P_per -- on exit. -- -- *Algorithm* -- -- The routine min_degree is based on some subroutines from the package -- SPARSPAK (see comments in the module glpqmd). */ void min_degree(int n, int A_ptr[], int A_ind[], int P_per[]) { int i, j, ne, t, pos, len; int *xadj, *adjncy, *deg, *marker, *rchset, *nbrhd, *qsize, *qlink, nofsub; /* determine number of non-zeros in complete pattern */ ne = A_ptr[n+1] - 1; ne += ne; /* allocate working arrays */ xadj = xcalloc(1+n+1, sizeof(int)); adjncy = xcalloc(1+ne, sizeof(int)); deg = xcalloc(1+n, sizeof(int)); marker = xcalloc(1+n, sizeof(int)); rchset = xcalloc(1+n, sizeof(int)); nbrhd = xcalloc(1+n, sizeof(int)); qsize = xcalloc(1+n, sizeof(int)); qlink = xcalloc(1+n, sizeof(int)); /* determine row lengths in complete pattern */ for (i = 1; i <= n; i++) xadj[i] = 0; for (i = 1; i <= n; i++) { for (t = A_ptr[i]; t < A_ptr[i+1]; t++) { j = A_ind[t]; xassert(i < j && j <= n); xadj[i]++, xadj[j]++; } } /* set up row pointers for complete pattern */ pos = 1; for (i = 1; i <= n; i++) len = xadj[i], pos += len, xadj[i] = pos; xadj[n+1] = pos; xassert(pos - 1 == ne); /* construct complete pattern */ for (i = 1; i <= n; i++) { for (t = A_ptr[i]; t < A_ptr[i+1]; t++) { j = A_ind[t]; adjncy[--xadj[i]] = j, adjncy[--xadj[j]] = i; } } /* call the main minimimum degree ordering routine */ genqmd(&n, xadj, adjncy, P_per, P_per + n, deg, marker, rchset, nbrhd, qsize, qlink, &nofsub); /* make sure that permutation matrix P is correct */ for (i = 1; i <= n; i++) { j = P_per[i]; xassert(1 <= j && j <= n); xassert(P_per[n+j] == i); } /* free working arrays */ xfree(xadj); xfree(adjncy); xfree(deg); xfree(marker); xfree(rchset); xfree(nbrhd); xfree(qsize); xfree(qlink); return; } /**********************************************************************/ void amd_order1(int n, int A_ptr[], int A_ind[], int P_per[]) { /* approximate minimum degree ordering (AMD) */ int k, ret; double Control[AMD_CONTROL], Info[AMD_INFO]; /* get the default parameters */ amd_defaults(Control); #if 0 /* and print them */ amd_control(Control); #endif /* make all indices 0-based */ for (k = 1; k < A_ptr[n+1]; k++) A_ind[k]--; for (k = 1; k <= n+1; k++) A_ptr[k]--; /* call the ordering routine */ ret = amd_order(n, &A_ptr[1], &A_ind[1], &P_per[1], Control, Info) ; #if 0 amd_info(Info); #endif xassert(ret == AMD_OK || ret == AMD_OK_BUT_JUMBLED); /* retsore 1-based indices */ for (k = 1; k <= n+1; k++) A_ptr[k]++; for (k = 1; k < A_ptr[n+1]; k++) A_ind[k]++; /* patch up permutation matrix */ memset(&P_per[n+1], 0, n * sizeof(int)); for (k = 1; k <= n; k++) { P_per[k]++; xassert(1 <= P_per[k] && P_per[k] <= n); xassert(P_per[n+P_per[k]] == 0); P_per[n+P_per[k]] = k; } return; } /**********************************************************************/ static void *allocate(size_t n, size_t size) { void *ptr; ptr = xcalloc(n, size); memset(ptr, 0, n * size); return ptr; } static void release(void *ptr) { xfree(ptr); return; } void symamd_ord(int n, int A_ptr[], int A_ind[], int P_per[]) { /* approximate minimum degree ordering (SYMAMD) */ int k, ok; int stats[COLAMD_STATS]; /* make all indices 0-based */ for (k = 1; k < A_ptr[n+1]; k++) A_ind[k]--; for (k = 1; k <= n+1; k++) A_ptr[k]--; /* call the ordering routine */ ok = symamd(n, &A_ind[1], &A_ptr[1], &P_per[1], NULL, stats, allocate, release); #if 0 symamd_report(stats); #endif xassert(ok); /* restore 1-based indices */ for (k = 1; k <= n+1; k++) A_ptr[k]++; for (k = 1; k < A_ptr[n+1]; k++) A_ind[k]++; /* patch up permutation matrix */ memset(&P_per[n+1], 0, n * sizeof(int)); for (k = 1; k <= n; k++) { P_per[k]++; xassert(1 <= P_per[k] && P_per[k] <= n); xassert(P_per[n+P_per[k]] == 0); P_per[n+P_per[k]] = k; } return; } /*---------------------------------------------------------------------- -- chol_symbolic - compute Cholesky factorization (symbolic phase). -- -- *Synopsis* -- -- #include "glpmat.h" -- int *chol_symbolic(int n, int A_ptr[], int A_ind[], int U_ptr[]); -- -- *Description* -- -- The routine chol_symbolic implements the symbolic phase of Cholesky -- factorization A = U'*U, where A is a given sparse symmetric positive -- definite matrix, U is a resultant upper triangular factor, U' is a -- matrix transposed to U. -- -- The parameter n is the order of matrices A and U. -- -- The pattern of the given matrix A is specified on entry in the arrays -- A_ptr and A_ind in storage-by-rows format. Only the upper triangular -- part without diagonal elements (which all are assumed to be non-zero) -- should be specified as if A were upper triangular. The arrays A_ptr -- and A_ind are not changed on exit. -- -- The pattern of the matrix U without diagonal elements (which all are -- assumed to be non-zero) is stored on exit from the routine in the -- arrays U_ptr and U_ind in storage-by-rows format. The array U_ptr -- should be allocated on entry, however, its content is ignored. The -- array U_ind is allocated by the routine which returns a pointer to it -- on exit. -- -- *Returns* -- -- The routine returns a pointer to the array U_ind. -- -- *Method* -- -- The routine chol_symbolic computes the pattern of the matrix U in a -- row-wise manner. No pivoting is used. -- -- It is known that to compute the pattern of row k of the matrix U we -- need to merge the pattern of row k of the matrix A and the patterns -- of each row i of U, where u[i,k] is non-zero (these rows are already -- computed and placed above row k). -- -- However, to reduce the number of rows to be merged the routine uses -- an advanced algorithm proposed in: -- -- D.J.Rose, R.E.Tarjan, and G.S.Lueker. Algorithmic aspects of vertex -- elimination on graphs. SIAM J. Comput. 5, 1976, 266-83. -- -- The authors of the cited paper show that we have the same result if -- we merge row k of the matrix A and such rows of the matrix U (among -- rows 1, ..., k-1) whose leftmost non-diagonal non-zero element is -- placed in k-th column. This feature signficantly reduces the number -- of rows to be merged, especially on the final steps, where rows of -- the matrix U become quite dense. -- -- To determine rows, which should be merged on k-th step, for a fixed -- time the routine uses linked lists of row numbers of the matrix U. -- Location head[k] contains the number of a first row, whose leftmost -- non-diagonal non-zero element is placed in column k, and location -- next[i] contains the number of a next row with the same property as -- row i. */ int *chol_symbolic(int n, int A_ptr[], int A_ind[], int U_ptr[]) { int i, j, k, t, len, size, beg, end, min_j, *U_ind, *head, *next, *ind, *map, *temp; /* initially we assume that on computing the pattern of U fill-in will double the number of non-zeros in A */ size = A_ptr[n+1] - 1; if (size < n) size = n; size += size; U_ind = xcalloc(1+size, sizeof(int)); /* allocate and initialize working arrays */ head = xcalloc(1+n, sizeof(int)); for (i = 1; i <= n; i++) head[i] = 0; next = xcalloc(1+n, sizeof(int)); ind = xcalloc(1+n, sizeof(int)); map = xcalloc(1+n, sizeof(int)); for (j = 1; j <= n; j++) map[j] = 0; /* compute the pattern of matrix U */ U_ptr[1] = 1; for (k = 1; k <= n; k++) { /* compute the pattern of k-th row of U, which is the union of k-th row of A and those rows of U (among 1, ..., k-1) whose leftmost non-diagonal non-zero is placed in k-th column */ /* (ind) := (k-th row of A) */ len = A_ptr[k+1] - A_ptr[k]; memcpy(&ind[1], &A_ind[A_ptr[k]], len * sizeof(int)); for (t = 1; t <= len; t++) { j = ind[t]; xassert(k < j && j <= n); map[j] = 1; } /* walk through rows of U whose leftmost non-diagonal non-zero is placed in k-th column */ for (i = head[k]; i != 0; i = next[i]) { /* (ind) := (ind) union (i-th row of U) */ beg = U_ptr[i], end = U_ptr[i+1]; for (t = beg; t < end; t++) { j = U_ind[t]; if (j > k && !map[j]) ind[++len] = j, map[j] = 1; } } /* now (ind) is the pattern of k-th row of U */ U_ptr[k+1] = U_ptr[k] + len; /* at least (U_ptr[k+1] - 1) locations should be available in the array U_ind */ if (U_ptr[k+1] - 1 > size) { temp = U_ind; size += size; U_ind = xcalloc(1+size, sizeof(int)); memcpy(&U_ind[1], &temp[1], (U_ptr[k] - 1) * sizeof(int)); xfree(temp); } xassert(U_ptr[k+1] - 1 <= size); /* (k-th row of U) := (ind) */ memcpy(&U_ind[U_ptr[k]], &ind[1], len * sizeof(int)); /* determine column index of leftmost non-diagonal non-zero in k-th row of U and clear the row pattern map */ min_j = n + 1; for (t = 1; t <= len; t++) { j = ind[t], map[j] = 0; if (min_j > j) min_j = j; } /* include k-th row into corresponding linked list */ if (min_j <= n) next[k] = head[min_j], head[min_j] = k; } /* free working arrays */ xfree(head); xfree(next); xfree(ind); xfree(map); /* reallocate the array U_ind to free unused locations */ temp = U_ind; size = U_ptr[n+1] - 1; U_ind = xcalloc(1+size, sizeof(int)); memcpy(&U_ind[1], &temp[1], size * sizeof(int)); xfree(temp); return U_ind; } /*---------------------------------------------------------------------- -- chol_numeric - compute Cholesky factorization (numeric phase). -- -- *Synopsis* -- -- #include "glpmat.h" -- int chol_numeric(int n, -- int A_ptr[], int A_ind[], double A_val[], double A_diag[], -- int U_ptr[], int U_ind[], double U_val[], double U_diag[]); -- -- *Description* -- -- The routine chol_symbolic implements the numeric phase of Cholesky -- factorization A = U'*U, where A is a given sparse symmetric positive -- definite matrix, U is a resultant upper triangular factor, U' is a -- matrix transposed to U. -- -- The parameter n is the order of matrices A and U. -- -- Upper triangular part of the matrix A without diagonal elements is -- specified in the arrays A_ptr, A_ind, and A_val in storage-by-rows -- format. Diagonal elements of A are specified in the array A_diag, -- where A_diag[0] is not used, A_diag[i] = a[i,i] for i = 1, ..., n. -- The arrays A_ptr, A_ind, A_val, and A_diag are not changed on exit. -- -- The pattern of the matrix U without diagonal elements (previously -- computed with the routine chol_symbolic) is specified in the arrays -- U_ptr and U_ind, which are not changed on exit. Numeric values of -- non-diagonal elements of U are stored in corresponding locations of -- the array U_val, and values of diagonal elements of U are stored in -- locations U_diag[1], ..., U_diag[n]. -- -- *Returns* -- -- The routine returns the number of non-positive diagonal elements of -- the matrix U which have been replaced by a huge positive number (see -- the method description below). Zero return code means the matrix A -- has been successfully factorized. -- -- *Method* -- -- The routine chol_numeric computes the matrix U in a row-wise manner -- using standard gaussian elimination technique. No pivoting is used. -- -- Initially the routine sets U = A, and before k-th elimination step -- the matrix U is the following: -- -- 1 k n -- 1 x x x x x x x x x x -- . x x x x x x x x x -- . . x x x x x x x x -- . . . x x x x x x x -- k . . . . * * * * * * -- . . . . * * * * * * -- . . . . * * * * * * -- . . . . * * * * * * -- . . . . * * * * * * -- n . . . . * * * * * * -- -- where 'x' are elements of already computed rows, '*' are elements of -- the active submatrix. (Note that the lower triangular part of the -- active submatrix being symmetric is not stored and diagonal elements -- are stored separately in the array U_diag.) -- -- The matrix A is assumed to be positive definite. However, if it is -- close to semi-definite, on some elimination step a pivot u[k,k] may -- happen to be non-positive due to round-off errors. In this case the -- routine uses a technique proposed in: -- -- S.J.Wright. The Cholesky factorization in interior-point and barrier -- methods. Preprint MCS-P600-0596, Mathematics and Computer Science -- Division, Argonne National Laboratory, Argonne, Ill., May 1996. -- -- The routine just replaces non-positive u[k,k] by a huge positive -- number. This involves non-diagonal elements in k-th row of U to be -- close to zero that, in turn, involves k-th component of a solution -- vector to be close to zero. Note, however, that this technique works -- only if the system A*x = b is consistent. */ int chol_numeric(int n, int A_ptr[], int A_ind[], double A_val[], double A_diag[], int U_ptr[], int U_ind[], double U_val[], double U_diag[]) { int i, j, k, t, t1, beg, end, beg1, end1, count = 0; double ukk, uki, *work; work = xcalloc(1+n, sizeof(double)); for (j = 1; j <= n; j++) work[j] = 0.0; /* U := (upper triangle of A) */ /* note that the upper traingle of A is a subset of U */ for (i = 1; i <= n; i++) { beg = A_ptr[i], end = A_ptr[i+1]; for (t = beg; t < end; t++) j = A_ind[t], work[j] = A_val[t]; beg = U_ptr[i], end = U_ptr[i+1]; for (t = beg; t < end; t++) j = U_ind[t], U_val[t] = work[j], work[j] = 0.0; U_diag[i] = A_diag[i]; } /* main elimination loop */ for (k = 1; k <= n; k++) { /* transform k-th row of U */ ukk = U_diag[k]; if (ukk > 0.0) U_diag[k] = ukk = sqrt(ukk); else U_diag[k] = ukk = DBL_MAX, count++; /* (work) := (transformed k-th row) */ beg = U_ptr[k], end = U_ptr[k+1]; for (t = beg; t < end; t++) work[U_ind[t]] = (U_val[t] /= ukk); /* transform other rows of U */ for (t = beg; t < end; t++) { i = U_ind[t]; xassert(i > k); /* (i-th row) := (i-th row) - u[k,i] * (k-th row) */ uki = work[i]; beg1 = U_ptr[i], end1 = U_ptr[i+1]; for (t1 = beg1; t1 < end1; t1++) U_val[t1] -= uki * work[U_ind[t1]]; U_diag[i] -= uki * uki; } /* (work) := 0 */ for (t = beg; t < end; t++) work[U_ind[t]] = 0.0; } xfree(work); return count; } /*---------------------------------------------------------------------- -- u_solve - solve upper triangular system U*x = b. -- -- *Synopsis* -- -- #include "glpmat.h" -- void u_solve(int n, int U_ptr[], int U_ind[], double U_val[], -- double U_diag[], double x[]); -- -- *Description* -- -- The routine u_solve solves an linear system U*x = b, where U is an -- upper triangular matrix. -- -- The parameter n is the order of matrix U. -- -- The matrix U without diagonal elements is specified in the arrays -- U_ptr, U_ind, and U_val in storage-by-rows format. Diagonal elements -- of U are specified in the array U_diag, where U_diag[0] is not used, -- U_diag[i] = u[i,i] for i = 1, ..., n. All these four arrays are not -- changed on exit. -- -- The right-hand side vector b is specified on entry in the array x, -- where x[0] is not used, and x[i] = b[i] for i = 1, ..., n. On exit -- the routine stores computed components of the vector of unknowns x -- in the array x in the same manner. */ void u_solve(int n, int U_ptr[], int U_ind[], double U_val[], double U_diag[], double x[]) { int i, t, beg, end; double temp; for (i = n; i >= 1; i--) { temp = x[i]; beg = U_ptr[i], end = U_ptr[i+1]; for (t = beg; t < end; t++) temp -= U_val[t] * x[U_ind[t]]; xassert(U_diag[i] != 0.0); x[i] = temp / U_diag[i]; } return; } /*---------------------------------------------------------------------- -- ut_solve - solve lower triangular system U'*x = b. -- -- *Synopsis* -- -- #include "glpmat.h" -- void ut_solve(int n, int U_ptr[], int U_ind[], double U_val[], -- double U_diag[], double x[]); -- -- *Description* -- -- The routine ut_solve solves an linear system U'*x = b, where U is a -- matrix transposed to an upper triangular matrix. -- -- The parameter n is the order of matrix U. -- -- The matrix U without diagonal elements is specified in the arrays -- U_ptr, U_ind, and U_val in storage-by-rows format. Diagonal elements -- of U are specified in the array U_diag, where U_diag[0] is not used, -- U_diag[i] = u[i,i] for i = 1, ..., n. All these four arrays are not -- changed on exit. -- -- The right-hand side vector b is specified on entry in the array x, -- where x[0] is not used, and x[i] = b[i] for i = 1, ..., n. On exit -- the routine stores computed components of the vector of unknowns x -- in the array x in the same manner. */ void ut_solve(int n, int U_ptr[], int U_ind[], double U_val[], double U_diag[], double x[]) { int i, t, beg, end; double temp; for (i = 1; i <= n; i++) { xassert(U_diag[i] != 0.0); temp = (x[i] /= U_diag[i]); if (temp == 0.0) continue; beg = U_ptr[i], end = U_ptr[i+1]; for (t = beg; t < end; t++) x[U_ind[t]] -= U_val[t] * temp; } return; } /* eof */ glpk-5.0/src/draft/glpmat.h0000644000062000006210000001621613766346220015034 0ustar maomkpasswd/* glpmat.h (linear algebra routines) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2000-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef GLPMAT_H #define GLPMAT_H /*********************************************************************** * FULL-VECTOR STORAGE * * For a sparse vector x having n elements, ne of which are non-zero, * the full-vector storage format uses two arrays x_ind and x_vec, which * are set up as follows: * * x_ind is an integer array of length [1+ne]. Location x_ind[0] is * not used, and locations x_ind[1], ..., x_ind[ne] contain indices of * non-zero elements in vector x. * * x_vec is a floating-point array of length [1+n]. Location x_vec[0] * is not used, and locations x_vec[1], ..., x_vec[n] contain numeric * values of ALL elements in vector x, including its zero elements. * * Let, for example, the following sparse vector x be given: * * (0, 1, 0, 0, 2, 3, 0, 4) * * Then the arrays are: * * x_ind = { X; 2, 5, 6, 8 } * * x_vec = { X; 0, 1, 0, 0, 2, 3, 0, 4 } * * COMPRESSED-VECTOR STORAGE * * For a sparse vector x having n elements, ne of which are non-zero, * the compressed-vector storage format uses two arrays x_ind and x_vec, * which are set up as follows: * * x_ind is an integer array of length [1+ne]. Location x_ind[0] is * not used, and locations x_ind[1], ..., x_ind[ne] contain indices of * non-zero elements in vector x. * * x_vec is a floating-point array of length [1+ne]. Location x_vec[0] * is not used, and locations x_vec[1], ..., x_vec[ne] contain numeric * values of corresponding non-zero elements in vector x. * * Let, for example, the following sparse vector x be given: * * (0, 1, 0, 0, 2, 3, 0, 4) * * Then the arrays are: * * x_ind = { X; 2, 5, 6, 8 } * * x_vec = { X; 1, 2, 3, 4 } * * STORAGE-BY-ROWS * * For a sparse matrix A, which has m rows, n columns, and ne non-zero * elements the storage-by-rows format uses three arrays A_ptr, A_ind, * and A_val, which are set up as follows: * * A_ptr is an integer array of length [1+m+1] also called "row pointer * array". It contains the relative starting positions of each row of A * in the arrays A_ind and A_val, i.e. element A_ptr[i], 1 <= i <= m, * indicates where row i begins in the arrays A_ind and A_val. If all * elements in row i are zero, then A_ptr[i] = A_ptr[i+1]. Location * A_ptr[0] is not used, location A_ptr[1] must contain 1, and location * A_ptr[m+1] must contain ne+1 that indicates the position after the * last element in the arrays A_ind and A_val. * * A_ind is an integer array of length [1+ne]. Location A_ind[0] is not * used, and locations A_ind[1], ..., A_ind[ne] contain column indices * of (non-zero) elements in matrix A. * * A_val is a floating-point array of length [1+ne]. Location A_val[0] * is not used, and locations A_val[1], ..., A_val[ne] contain numeric * values of non-zero elements in matrix A. * * Non-zero elements of matrix A are stored contiguously, and the rows * of matrix A are stored consecutively from 1 to m in the arrays A_ind * and A_val. The elements in each row of A may be stored in any order * in A_ind and A_val. Note that elements with duplicate column indices * are not allowed. * * Let, for example, the following sparse matrix A be given: * * | 11 . 13 . . . | * | 21 22 . 24 . . | * | . 32 33 . . . | * | . . 43 44 . 46 | * | . . . . . . | * | 61 62 . . . 66 | * * Then the arrays are: * * A_ptr = { X; 1, 3, 6, 8, 11, 11; 14 } * * A_ind = { X; 1, 3; 4, 2, 1; 2, 3; 4, 3, 6; 1, 2, 6 } * * A_val = { X; 11, 13; 24, 22, 21; 32, 33; 44, 43, 46; 61, 62, 66 } * * PERMUTATION MATRICES * * Let P be a permutation matrix of the order n. It is represented as * an integer array P_per of length [1+n+n] as follows: if p[i,j] = 1, * then P_per[i] = j and P_per[n+j] = i. Location P_per[0] is not used. * * Let A' = P*A. If i-th row of A corresponds to i'-th row of A', then * P_per[i'] = i and P_per[n+i] = i'. * * References: * * 1. Gustavson F.G. Some basic techniques for solving sparse systems of * linear equations. In Rose and Willoughby (1972), pp. 41-52. * * 2. Basic Linear Algebra Subprograms Technical (BLAST) Forum Standard. * University of Tennessee (2001). */ #define check_fvs _glp_mat_check_fvs int check_fvs(int n, int nnz, int ind[], double vec[]); /* check sparse vector in full-vector storage format */ #define check_pattern _glp_mat_check_pattern int check_pattern(int m, int n, int A_ptr[], int A_ind[]); /* check pattern of sparse matrix */ #define transpose _glp_mat_transpose void transpose(int m, int n, int A_ptr[], int A_ind[], double A_val[], int AT_ptr[], int AT_ind[], double AT_val[]); /* transpose sparse matrix */ #define adat_symbolic _glp_mat_adat_symbolic int *adat_symbolic(int m, int n, int P_per[], int A_ptr[], int A_ind[], int S_ptr[]); /* compute S = P*A*D*A'*P' (symbolic phase) */ #define adat_numeric _glp_mat_adat_numeric void adat_numeric(int m, int n, int P_per[], int A_ptr[], int A_ind[], double A_val[], double D_diag[], int S_ptr[], int S_ind[], double S_val[], double S_diag[]); /* compute S = P*A*D*A'*P' (numeric phase) */ #define min_degree _glp_mat_min_degree void min_degree(int n, int A_ptr[], int A_ind[], int P_per[]); /* minimum degree ordering */ #define amd_order1 _glp_mat_amd_order1 void amd_order1(int n, int A_ptr[], int A_ind[], int P_per[]); /* approximate minimum degree ordering (AMD) */ #define symamd_ord _glp_mat_symamd_ord void symamd_ord(int n, int A_ptr[], int A_ind[], int P_per[]); /* approximate minimum degree ordering (SYMAMD) */ #define chol_symbolic _glp_mat_chol_symbolic int *chol_symbolic(int n, int A_ptr[], int A_ind[], int U_ptr[]); /* compute Cholesky factorization (symbolic phase) */ #define chol_numeric _glp_mat_chol_numeric int chol_numeric(int n, int A_ptr[], int A_ind[], double A_val[], double A_diag[], int U_ptr[], int U_ind[], double U_val[], double U_diag[]); /* compute Cholesky factorization (numeric phase) */ #define u_solve _glp_mat_u_solve void u_solve(int n, int U_ptr[], int U_ind[], double U_val[], double U_diag[], double x[]); /* solve upper triangular system U*x = b */ #define ut_solve _glp_mat_ut_solve void ut_solve(int n, int U_ptr[], int U_ind[], double U_val[], double U_diag[], double x[]); /* solve lower triangular system U'*x = b */ #endif /* eof */ glpk-5.0/src/draft/glpscl.c0000644000062000006210000003712413766346220015030 0ustar maomkpasswd/* glpscl.c (problem scaling routines) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2000-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "misc.h" #include "prob.h" /*********************************************************************** * min_row_aij - determine minimal |a[i,j]| in i-th row * * This routine returns minimal magnitude of (non-zero) constraint * coefficients in i-th row of the constraint matrix. * * If the parameter scaled is zero, the original constraint matrix A is * assumed. Otherwise, the scaled constraint matrix R*A*S is assumed. * * If i-th row of the matrix is empty, the routine returns 1. */ static double min_row_aij(glp_prob *lp, int i, int scaled) { GLPAIJ *aij; double min_aij, temp; xassert(1 <= i && i <= lp->m); min_aij = 1.0; for (aij = lp->row[i]->ptr; aij != NULL; aij = aij->r_next) { temp = fabs(aij->val); if (scaled) temp *= (aij->row->rii * aij->col->sjj); if (aij->r_prev == NULL || min_aij > temp) min_aij = temp; } return min_aij; } /*********************************************************************** * max_row_aij - determine maximal |a[i,j]| in i-th row * * This routine returns maximal magnitude of (non-zero) constraint * coefficients in i-th row of the constraint matrix. * * If the parameter scaled is zero, the original constraint matrix A is * assumed. Otherwise, the scaled constraint matrix R*A*S is assumed. * * If i-th row of the matrix is empty, the routine returns 1. */ static double max_row_aij(glp_prob *lp, int i, int scaled) { GLPAIJ *aij; double max_aij, temp; xassert(1 <= i && i <= lp->m); max_aij = 1.0; for (aij = lp->row[i]->ptr; aij != NULL; aij = aij->r_next) { temp = fabs(aij->val); if (scaled) temp *= (aij->row->rii * aij->col->sjj); if (aij->r_prev == NULL || max_aij < temp) max_aij = temp; } return max_aij; } /*********************************************************************** * min_col_aij - determine minimal |a[i,j]| in j-th column * * This routine returns minimal magnitude of (non-zero) constraint * coefficients in j-th column of the constraint matrix. * * If the parameter scaled is zero, the original constraint matrix A is * assumed. Otherwise, the scaled constraint matrix R*A*S is assumed. * * If j-th column of the matrix is empty, the routine returns 1. */ static double min_col_aij(glp_prob *lp, int j, int scaled) { GLPAIJ *aij; double min_aij, temp; xassert(1 <= j && j <= lp->n); min_aij = 1.0; for (aij = lp->col[j]->ptr; aij != NULL; aij = aij->c_next) { temp = fabs(aij->val); if (scaled) temp *= (aij->row->rii * aij->col->sjj); if (aij->c_prev == NULL || min_aij > temp) min_aij = temp; } return min_aij; } /*********************************************************************** * max_col_aij - determine maximal |a[i,j]| in j-th column * * This routine returns maximal magnitude of (non-zero) constraint * coefficients in j-th column of the constraint matrix. * * If the parameter scaled is zero, the original constraint matrix A is * assumed. Otherwise, the scaled constraint matrix R*A*S is assumed. * * If j-th column of the matrix is empty, the routine returns 1. */ static double max_col_aij(glp_prob *lp, int j, int scaled) { GLPAIJ *aij; double max_aij, temp; xassert(1 <= j && j <= lp->n); max_aij = 1.0; for (aij = lp->col[j]->ptr; aij != NULL; aij = aij->c_next) { temp = fabs(aij->val); if (scaled) temp *= (aij->row->rii * aij->col->sjj); if (aij->c_prev == NULL || max_aij < temp) max_aij = temp; } return max_aij; } /*********************************************************************** * min_mat_aij - determine minimal |a[i,j]| in constraint matrix * * This routine returns minimal magnitude of (non-zero) constraint * coefficients in the constraint matrix. * * If the parameter scaled is zero, the original constraint matrix A is * assumed. Otherwise, the scaled constraint matrix R*A*S is assumed. * * If the matrix is empty, the routine returns 1. */ static double min_mat_aij(glp_prob *lp, int scaled) { int i; double min_aij, temp; min_aij = 1.0; for (i = 1; i <= lp->m; i++) { temp = min_row_aij(lp, i, scaled); if (i == 1 || min_aij > temp) min_aij = temp; } return min_aij; } /*********************************************************************** * max_mat_aij - determine maximal |a[i,j]| in constraint matrix * * This routine returns maximal magnitude of (non-zero) constraint * coefficients in the constraint matrix. * * If the parameter scaled is zero, the original constraint matrix A is * assumed. Otherwise, the scaled constraint matrix R*A*S is assumed. * * If the matrix is empty, the routine returns 1. */ static double max_mat_aij(glp_prob *lp, int scaled) { int i; double max_aij, temp; max_aij = 1.0; for (i = 1; i <= lp->m; i++) { temp = max_row_aij(lp, i, scaled); if (i == 1 || max_aij < temp) max_aij = temp; } return max_aij; } /*********************************************************************** * eq_scaling - perform equilibration scaling * * This routine performs equilibration scaling of rows and columns of * the constraint matrix. * * If the parameter flag is zero, the routine scales rows at first and * then columns. Otherwise, the routine scales columns and then rows. * * Rows are scaled as follows: * * n * a'[i,j] = a[i,j] / max |a[i,j]|, i = 1,...,m. * j=1 * * This makes the infinity (maximum) norm of each row of the matrix * equal to 1. * * Columns are scaled as follows: * * m * a'[i,j] = a[i,j] / max |a[i,j]|, j = 1,...,n. * i=1 * * This makes the infinity (maximum) norm of each column of the matrix * equal to 1. */ static void eq_scaling(glp_prob *lp, int flag) { int i, j, pass; double temp; xassert(flag == 0 || flag == 1); for (pass = 0; pass <= 1; pass++) { if (pass == flag) { /* scale rows */ for (i = 1; i <= lp->m; i++) { temp = max_row_aij(lp, i, 1); glp_set_rii(lp, i, glp_get_rii(lp, i) / temp); } } else { /* scale columns */ for (j = 1; j <= lp->n; j++) { temp = max_col_aij(lp, j, 1); glp_set_sjj(lp, j, glp_get_sjj(lp, j) / temp); } } } return; } /*********************************************************************** * gm_scaling - perform geometric mean scaling * * This routine performs geometric mean scaling of rows and columns of * the constraint matrix. * * If the parameter flag is zero, the routine scales rows at first and * then columns. Otherwise, the routine scales columns and then rows. * * Rows are scaled as follows: * * a'[i,j] = a[i,j] / sqrt(alfa[i] * beta[i]), i = 1,...,m, * * where: * n n * alfa[i] = min |a[i,j]|, beta[i] = max |a[i,j]|. * j=1 j=1 * * This allows decreasing the ratio beta[i] / alfa[i] for each row of * the matrix. * * Columns are scaled as follows: * * a'[i,j] = a[i,j] / sqrt(alfa[j] * beta[j]), j = 1,...,n, * * where: * m m * alfa[j] = min |a[i,j]|, beta[j] = max |a[i,j]|. * i=1 i=1 * * This allows decreasing the ratio beta[j] / alfa[j] for each column * of the matrix. */ static void gm_scaling(glp_prob *lp, int flag) { int i, j, pass; double temp; xassert(flag == 0 || flag == 1); for (pass = 0; pass <= 1; pass++) { if (pass == flag) { /* scale rows */ for (i = 1; i <= lp->m; i++) { temp = min_row_aij(lp, i, 1) * max_row_aij(lp, i, 1); glp_set_rii(lp, i, glp_get_rii(lp, i) / sqrt(temp)); } } else { /* scale columns */ for (j = 1; j <= lp->n; j++) { temp = min_col_aij(lp, j, 1) * max_col_aij(lp, j, 1); glp_set_sjj(lp, j, glp_get_sjj(lp, j) / sqrt(temp)); } } } return; } /*********************************************************************** * max_row_ratio - determine worst scaling "quality" for rows * * This routine returns the worst scaling "quality" for rows of the * currently scaled constraint matrix: * * m * ratio = max ratio[i], * i=1 * where: * n n * ratio[i] = max |a[i,j]| / min |a[i,j]|, 1 <= i <= m, * j=1 j=1 * * is the scaling "quality" of i-th row. */ static double max_row_ratio(glp_prob *lp) { int i; double ratio, temp; ratio = 1.0; for (i = 1; i <= lp->m; i++) { temp = max_row_aij(lp, i, 1) / min_row_aij(lp, i, 1); if (i == 1 || ratio < temp) ratio = temp; } return ratio; } /*********************************************************************** * max_col_ratio - determine worst scaling "quality" for columns * * This routine returns the worst scaling "quality" for columns of the * currently scaled constraint matrix: * * n * ratio = max ratio[j], * j=1 * where: * m m * ratio[j] = max |a[i,j]| / min |a[i,j]|, 1 <= j <= n, * i=1 i=1 * * is the scaling "quality" of j-th column. */ static double max_col_ratio(glp_prob *lp) { int j; double ratio, temp; ratio = 1.0; for (j = 1; j <= lp->n; j++) { temp = max_col_aij(lp, j, 1) / min_col_aij(lp, j, 1); if (j == 1 || ratio < temp) ratio = temp; } return ratio; } /*********************************************************************** * gm_iterate - perform iterative geometric mean scaling * * This routine performs iterative geometric mean scaling of rows and * columns of the constraint matrix. * * The parameter it_max specifies the maximal number of iterations. * Recommended value of it_max is 15. * * The parameter tau specifies a minimal improvement of the scaling * "quality" on each iteration, 0 < tau < 1. It means than the scaling * process continues while the following condition is satisfied: * * ratio[k] <= tau * ratio[k-1], * * where ratio = max |a[i,j]| / min |a[i,j]| is the scaling "quality" * to be minimized, k is the iteration number. Recommended value of tau * is 0.90. */ static void gm_iterate(glp_prob *lp, int it_max, double tau) { int k, flag; double ratio = 0.0, r_old; /* if the scaling "quality" for rows is better than for columns, the rows are scaled first; otherwise, the columns are scaled first */ flag = (max_row_ratio(lp) > max_col_ratio(lp)); for (k = 1; k <= it_max; k++) { /* save the scaling "quality" from previous iteration */ r_old = ratio; /* determine the current scaling "quality" */ ratio = max_mat_aij(lp, 1) / min_mat_aij(lp, 1); #if 0 xprintf("k = %d; ratio = %g\n", k, ratio); #endif /* if improvement is not enough, terminate scaling */ if (k > 1 && ratio > tau * r_old) break; /* otherwise, perform another iteration */ gm_scaling(lp, flag); } return; } /*********************************************************************** * NAME * * scale_prob - scale problem data * * SYNOPSIS * * #include "glpscl.h" * void scale_prob(glp_prob *lp, int flags); * * DESCRIPTION * * The routine scale_prob performs automatic scaling of problem data * for the specified problem object. */ static void scale_prob(glp_prob *lp, int flags) { static const char *fmt = "%s: min|aij| = %10.3e max|aij| = %10.3e ratio = %10.3e\n"; double min_aij, max_aij, ratio; xprintf("Scaling...\n"); /* cancel the current scaling effect */ glp_unscale_prob(lp); /* report original scaling "quality" */ min_aij = min_mat_aij(lp, 1); max_aij = max_mat_aij(lp, 1); ratio = max_aij / min_aij; xprintf(fmt, " A", min_aij, max_aij, ratio); /* check if the problem is well scaled */ if (min_aij >= 0.10 && max_aij <= 10.0) { xprintf("Problem data seem to be well scaled\n"); /* skip scaling, if required */ if (flags & GLP_SF_SKIP) goto done; } /* perform iterative geometric mean scaling, if required */ if (flags & GLP_SF_GM) { gm_iterate(lp, 15, 0.90); min_aij = min_mat_aij(lp, 1); max_aij = max_mat_aij(lp, 1); ratio = max_aij / min_aij; xprintf(fmt, "GM", min_aij, max_aij, ratio); } /* perform equilibration scaling, if required */ if (flags & GLP_SF_EQ) { eq_scaling(lp, max_row_ratio(lp) > max_col_ratio(lp)); min_aij = min_mat_aij(lp, 1); max_aij = max_mat_aij(lp, 1); ratio = max_aij / min_aij; xprintf(fmt, "EQ", min_aij, max_aij, ratio); } /* round scale factors to nearest power of two, if required */ if (flags & GLP_SF_2N) { int i, j; for (i = 1; i <= lp->m; i++) glp_set_rii(lp, i, round2n(glp_get_rii(lp, i))); for (j = 1; j <= lp->n; j++) glp_set_sjj(lp, j, round2n(glp_get_sjj(lp, j))); min_aij = min_mat_aij(lp, 1); max_aij = max_mat_aij(lp, 1); ratio = max_aij / min_aij; xprintf(fmt, "2N", min_aij, max_aij, ratio); } done: return; } /*********************************************************************** * NAME * * glp_scale_prob - scale problem data * * SYNOPSIS * * void glp_scale_prob(glp_prob *lp, int flags); * * DESCRIPTION * * The routine glp_scale_prob performs automatic scaling of problem * data for the specified problem object. * * The parameter flags specifies scaling options used by the routine. * Options can be combined with the bitwise OR operator and may be the * following: * * GLP_SF_GM perform geometric mean scaling; * GLP_SF_EQ perform equilibration scaling; * GLP_SF_2N round scale factors to nearest power of two; * GLP_SF_SKIP skip scaling, if the problem is well scaled. * * The parameter flags may be specified as GLP_SF_AUTO, in which case * the routine chooses scaling options automatically. */ void glp_scale_prob(glp_prob *lp, int flags) { if (flags & ~(GLP_SF_GM | GLP_SF_EQ | GLP_SF_2N | GLP_SF_SKIP | GLP_SF_AUTO)) xerror("glp_scale_prob: flags = 0x%02X; invalid scaling option" "s\n", flags); if (flags & GLP_SF_AUTO) flags = (GLP_SF_GM | GLP_SF_EQ | GLP_SF_SKIP); scale_prob(lp, flags); return; } /* eof */ glpk-5.0/src/draft/glpssx.h0000644000062000006210000004053313766346220015067 0ustar maomkpasswd/* glpssx.h (simplex method, rational arithmetic) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2003-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef GLPSSX_H #define GLPSSX_H #include "bfx.h" #include "env.h" #if 1 /* 25/XI-2017 */ #include "glpk.h" #endif typedef struct SSX SSX; struct SSX { /* simplex solver workspace */ /*---------------------------------------------------------------------- // LP PROBLEM DATA // // It is assumed that LP problem has the following statement: // // minimize (or maximize) // // z = c[1]*x[1] + ... + c[m+n]*x[m+n] + c[0] (1) // // subject to equality constraints // // x[1] - a[1,1]*x[m+1] - ... - a[1,n]*x[m+n] = 0 // // . . . . . . . (2) // // x[m] - a[m,1]*x[m+1] + ... - a[m,n]*x[m+n] = 0 // // and bounds of variables // // l[1] <= x[1] <= u[1] // // . . . . . . . (3) // // l[m+n] <= x[m+n] <= u[m+n] // // where: // x[1], ..., x[m] - auxiliary variables; // x[m+1], ..., x[m+n] - structural variables; // z - objective function; // c[1], ..., c[m+n] - coefficients of the objective function; // c[0] - constant term of the objective function; // a[1,1], ..., a[m,n] - constraint coefficients; // l[1], ..., l[m+n] - lower bounds of variables; // u[1], ..., u[m+n] - upper bounds of variables. // // Bounds of variables can be finite as well as inifinite. Besides, // lower and upper bounds can be equal to each other. So the following // five types of variables are possible: // // Bounds of variable Type of variable // ------------------------------------------------- // -inf < x[k] < +inf Free (unbounded) variable // l[k] <= x[k] < +inf Variable with lower bound // -inf < x[k] <= u[k] Variable with upper bound // l[k] <= x[k] <= u[k] Double-bounded variable // l[k] = x[k] = u[k] Fixed variable // // Using vector-matrix notations the LP problem (1)-(3) can be written // as follows: // // minimize (or maximize) // // z = c * x + c[0] (4) // // subject to equality constraints // // xR - A * xS = 0 (5) // // and bounds of variables // // l <= x <= u (6) // // where: // xR - vector of auxiliary variables; // xS - vector of structural variables; // x = (xR, xS) - vector of all variables; // z - objective function; // c - vector of objective coefficients; // c[0] - constant term of the objective function; // A - matrix of constraint coefficients (has m rows // and n columns); // l - vector of lower bounds of variables; // u - vector of upper bounds of variables. // // The simplex method makes no difference between auxiliary and // structural variables, so it is convenient to think the system of // equality constraints (5) written in a homogeneous form: // // (I | -A) * x = 0, (7) // // where (I | -A) is an augmented (m+n)xm constraint matrix, I is mxm // unity matrix whose columns correspond to auxiliary variables, and A // is the original mxn constraint matrix whose columns correspond to // structural variables. Note that only the matrix A is stored. ----------------------------------------------------------------------*/ int m; /* number of rows (auxiliary variables), m > 0 */ int n; /* number of columns (structural variables), n > 0 */ int *type; /* int type[1+m+n]; */ /* type[0] is not used; type[k], 1 <= k <= m+n, is the type of variable x[k]: */ #define SSX_FR 0 /* free (unbounded) variable */ #define SSX_LO 1 /* variable with lower bound */ #define SSX_UP 2 /* variable with upper bound */ #define SSX_DB 3 /* double-bounded variable */ #define SSX_FX 4 /* fixed variable */ mpq_t *lb; /* mpq_t lb[1+m+n]; alias: l */ /* lb[0] is not used; lb[k], 1 <= k <= m+n, is an lower bound of variable x[k]; if x[k] has no lower bound, lb[k] is zero */ mpq_t *ub; /* mpq_t ub[1+m+n]; alias: u */ /* ub[0] is not used; ub[k], 1 <= k <= m+n, is an upper bound of variable x[k]; if x[k] has no upper bound, ub[k] is zero; if x[k] is of fixed type, ub[k] is equal to lb[k] */ int dir; /* optimization direction (sense of the objective function): */ #define SSX_MIN 0 /* minimization */ #define SSX_MAX 1 /* maximization */ mpq_t *coef; /* mpq_t coef[1+m+n]; alias: c */ /* coef[0] is a constant term of the objective function; coef[k], 1 <= k <= m+n, is a coefficient of the objective function at variable x[k]; note that auxiliary variables also may have non-zero objective coefficients */ int *A_ptr; /* int A_ptr[1+n+1]; */ int *A_ind; /* int A_ind[A_ptr[n+1]]; */ mpq_t *A_val; /* mpq_t A_val[A_ptr[n+1]]; */ /* constraint matrix A (see (5)) in storage-by-columns format */ /*---------------------------------------------------------------------- // LP BASIS AND CURRENT BASIC SOLUTION // // The LP basis is defined by the following partition of the augmented // constraint matrix (7): // // (B | N) = (I | -A) * Q, (8) // // where B is a mxm non-singular basis matrix whose columns correspond // to basic variables xB, N is a mxn matrix whose columns correspond to // non-basic variables xN, and Q is a permutation (m+n)x(m+n) matrix. // // From (7) and (8) it follows that // // (I | -A) * x = (I | -A) * Q * Q' * x = (B | N) * (xB, xN), // // therefore // // (xB, xN) = Q' * x, (9) // // where x is the vector of all variables in the original order, xB is // a vector of basic variables, xN is a vector of non-basic variables, // Q' = inv(Q) is a matrix transposed to Q. // // Current values of non-basic variables xN[j], j = 1, ..., n, are not // stored; they are defined implicitly by their statuses as follows: // // 0, if xN[j] is free variable // lN[j], if xN[j] is on its lower bound (10) // uN[j], if xN[j] is on its upper bound // lN[j] = uN[j], if xN[j] is fixed variable // // where lN[j] and uN[j] are lower and upper bounds of xN[j]. // // Current values of basic variables xB[i], i = 1, ..., m, are computed // as follows: // // beta = - inv(B) * N * xN, (11) // // where current values of xN are defined by (10). // // Current values of simplex multipliers pi[i], i = 1, ..., m (which // are values of Lagrange multipliers for equality constraints (7) also // called shadow prices) are computed as follows: // // pi = inv(B') * cB, (12) // // where B' is a matrix transposed to B, cB is a vector of objective // coefficients at basic variables xB. // // Current values of reduced costs d[j], j = 1, ..., n, (which are // values of Langrange multipliers for active inequality constraints // corresponding to non-basic variables) are computed as follows: // // d = cN - N' * pi, (13) // // where N' is a matrix transposed to N, cN is a vector of objective // coefficients at non-basic variables xN. ----------------------------------------------------------------------*/ int *stat; /* int stat[1+m+n]; */ /* stat[0] is not used; stat[k], 1 <= k <= m+n, is the status of variable x[k]: */ #define SSX_BS 0 /* basic variable */ #define SSX_NL 1 /* non-basic variable on lower bound */ #define SSX_NU 2 /* non-basic variable on upper bound */ #define SSX_NF 3 /* non-basic free variable */ #define SSX_NS 4 /* non-basic fixed variable */ int *Q_row; /* int Q_row[1+m+n]; */ /* matrix Q in row-like format; Q_row[0] is not used; Q_row[i] = j means that q[i,j] = 1 */ int *Q_col; /* int Q_col[1+m+n]; */ /* matrix Q in column-like format; Q_col[0] is not used; Q_col[j] = i means that q[i,j] = 1 */ /* if k-th column of the matrix (I | A) is k'-th column of the matrix (B | N), then Q_row[k] = k' and Q_col[k'] = k; if x[k] is xB[i], then Q_row[k] = i and Q_col[i] = k; if x[k] is xN[j], then Q_row[k] = m+j and Q_col[m+j] = k */ BFX *binv; /* invertable form of the basis matrix B */ mpq_t *bbar; /* mpq_t bbar[1+m]; alias: beta */ /* bbar[0] is a value of the objective function; bbar[i], 1 <= i <= m, is a value of basic variable xB[i] */ mpq_t *pi; /* mpq_t pi[1+m]; */ /* pi[0] is not used; pi[i], 1 <= i <= m, is a simplex multiplier corresponding to i-th row (equality constraint) */ mpq_t *cbar; /* mpq_t cbar[1+n]; alias: d */ /* cbar[0] is not used; cbar[j], 1 <= j <= n, is a reduced cost of non-basic variable xN[j] */ /*---------------------------------------------------------------------- // SIMPLEX TABLE // // Due to (8) and (9) the system of equality constraints (7) for the // current basis can be written as follows: // // xB = A~ * xN, (14) // // where // // A~ = - inv(B) * N (15) // // is a mxn matrix called the simplex table. // // The revised simplex method uses only two components of A~, namely, // pivot column corresponding to non-basic variable xN[q] chosen to // enter the basis, and pivot row corresponding to basic variable xB[p] // chosen to leave the basis. // // Pivot column alfa_q is q-th column of A~, so // // alfa_q = A~ * e[q] = - inv(B) * N * e[q] = - inv(B) * N[q], (16) // // where N[q] is q-th column of the matrix N. // // Pivot row alfa_p is p-th row of A~ or, equivalently, p-th column of // A~', a matrix transposed to A~, so // // alfa_p = A~' * e[p] = - N' * inv(B') * e[p] = - N' * rho_p, (17) // // where (*)' means transposition, and // // rho_p = inv(B') * e[p], (18) // // is p-th column of inv(B') or, that is the same, p-th row of inv(B). ----------------------------------------------------------------------*/ int p; /* number of basic variable xB[p], 1 <= p <= m, chosen to leave the basis */ mpq_t *rho; /* mpq_t rho[1+m]; */ /* p-th row of the inverse inv(B); see (18) */ mpq_t *ap; /* mpq_t ap[1+n]; */ /* p-th row of the simplex table; see (17) */ int q; /* number of non-basic variable xN[q], 1 <= q <= n, chosen to enter the basis */ mpq_t *aq; /* mpq_t aq[1+m]; */ /* q-th column of the simplex table; see (16) */ /*--------------------------------------------------------------------*/ int q_dir; /* direction in which non-basic variable xN[q] should change on moving to the adjacent vertex of the polyhedron: +1 means that xN[q] increases -1 means that xN[q] decreases */ int p_stat; /* non-basic status which should be assigned to basic variable xB[p] when it has left the basis and become xN[q] */ mpq_t delta; /* actual change of xN[q] in the adjacent basis (it has the same sign as q_dir) */ /*--------------------------------------------------------------------*/ #if 1 /* 25/XI-2017 */ int msg_lev; /* verbosity level: GLP_MSG_OFF no output GLP_MSG_ERR report errors and warnings GLP_MSG_ON normal output GLP_MSG_ALL highest verbosity */ #endif int it_lim; /* simplex iterations limit; if this value is positive, it is decreased by one each time when one simplex iteration has been performed, and reaching zero value signals the solver to stop the search; negative value means no iterations limit */ int it_cnt; /* simplex iterations count; this count is increased by one each time when one simplex iteration has been performed */ double tm_lim; /* searching time limit, in seconds; if this value is positive, it is decreased each time when one simplex iteration has been performed by the amount of time spent for the iteration, and reaching zero value signals the solver to stop the search; negative value means no time limit */ double out_frq; /* output frequency, in seconds; this parameter specifies how frequently the solver sends information about the progress of the search to the standard output */ #if 0 /* 10/VI-2013 */ glp_long tm_beg; #else double tm_beg; #endif /* starting time of the search, in seconds; the total time of the search is the difference between xtime() and tm_beg */ #if 0 /* 10/VI-2013 */ glp_long tm_lag; #else double tm_lag; #endif /* the most recent time, in seconds, at which the progress of the the search was displayed */ }; #define ssx_create _glp_ssx_create #define ssx_factorize _glp_ssx_factorize #define ssx_get_xNj _glp_ssx_get_xNj #define ssx_eval_bbar _glp_ssx_eval_bbar #define ssx_eval_pi _glp_ssx_eval_pi #define ssx_eval_dj _glp_ssx_eval_dj #define ssx_eval_cbar _glp_ssx_eval_cbar #define ssx_eval_rho _glp_ssx_eval_rho #define ssx_eval_row _glp_ssx_eval_row #define ssx_eval_col _glp_ssx_eval_col #define ssx_chuzc _glp_ssx_chuzc #define ssx_chuzr _glp_ssx_chuzr #define ssx_update_bbar _glp_ssx_update_bbar #define ssx_update_pi _glp_ssx_update_pi #define ssx_update_cbar _glp_ssx_update_cbar #define ssx_change_basis _glp_ssx_change_basis #define ssx_delete _glp_ssx_delete #define ssx_phase_I _glp_ssx_phase_I #define ssx_phase_II _glp_ssx_phase_II #define ssx_driver _glp_ssx_driver SSX *ssx_create(int m, int n, int nnz); /* create simplex solver workspace */ int ssx_factorize(SSX *ssx); /* factorize the current basis matrix */ void ssx_get_xNj(SSX *ssx, int j, mpq_t x); /* determine value of non-basic variable */ void ssx_eval_bbar(SSX *ssx); /* compute values of basic variables */ void ssx_eval_pi(SSX *ssx); /* compute values of simplex multipliers */ void ssx_eval_dj(SSX *ssx, int j, mpq_t dj); /* compute reduced cost of non-basic variable */ void ssx_eval_cbar(SSX *ssx); /* compute reduced costs of all non-basic variables */ void ssx_eval_rho(SSX *ssx); /* compute p-th row of the inverse */ void ssx_eval_row(SSX *ssx); /* compute pivot row of the simplex table */ void ssx_eval_col(SSX *ssx); /* compute pivot column of the simplex table */ void ssx_chuzc(SSX *ssx); /* choose pivot column */ void ssx_chuzr(SSX *ssx); /* choose pivot row */ void ssx_update_bbar(SSX *ssx); /* update values of basic variables */ void ssx_update_pi(SSX *ssx); /* update simplex multipliers */ void ssx_update_cbar(SSX *ssx); /* update reduced costs of non-basic variables */ void ssx_change_basis(SSX *ssx); /* change current basis to adjacent one */ void ssx_delete(SSX *ssx); /* delete simplex solver workspace */ int ssx_phase_I(SSX *ssx); /* find primal feasible solution */ int ssx_phase_II(SSX *ssx); /* find optimal solution */ int ssx_driver(SSX *ssx); /* base driver to exact simplex method */ #endif /* eof */ glpk-5.0/src/draft/glpssx01.c0000644000062000006210000006601513766346220015226 0ustar maomkpasswd/* glpssx01.c (simplex method, rational arithmetic) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2003-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "glpssx.h" #define xfault xerror /*---------------------------------------------------------------------- // ssx_create - create simplex solver workspace. // // This routine creates the workspace used by simplex solver routines, // and returns a pointer to it. // // Parameters m, n, and nnz specify, respectively, the number of rows, // columns, and non-zero constraint coefficients. // // This routine only allocates the memory for the workspace components, // so the workspace needs to be saturated by data. */ SSX *ssx_create(int m, int n, int nnz) { SSX *ssx; int i, j, k; if (m < 1) xfault("ssx_create: m = %d; invalid number of rows\n", m); if (n < 1) xfault("ssx_create: n = %d; invalid number of columns\n", n); if (nnz < 0) xfault("ssx_create: nnz = %d; invalid number of non-zero const" "raint coefficients\n", nnz); ssx = xmalloc(sizeof(SSX)); ssx->m = m; ssx->n = n; ssx->type = xcalloc(1+m+n, sizeof(int)); ssx->lb = xcalloc(1+m+n, sizeof(mpq_t)); for (k = 1; k <= m+n; k++) mpq_init(ssx->lb[k]); ssx->ub = xcalloc(1+m+n, sizeof(mpq_t)); for (k = 1; k <= m+n; k++) mpq_init(ssx->ub[k]); ssx->coef = xcalloc(1+m+n, sizeof(mpq_t)); for (k = 0; k <= m+n; k++) mpq_init(ssx->coef[k]); ssx->A_ptr = xcalloc(1+n+1, sizeof(int)); ssx->A_ptr[n+1] = nnz+1; ssx->A_ind = xcalloc(1+nnz, sizeof(int)); ssx->A_val = xcalloc(1+nnz, sizeof(mpq_t)); for (k = 1; k <= nnz; k++) mpq_init(ssx->A_val[k]); ssx->stat = xcalloc(1+m+n, sizeof(int)); ssx->Q_row = xcalloc(1+m+n, sizeof(int)); ssx->Q_col = xcalloc(1+m+n, sizeof(int)); ssx->binv = bfx_create_binv(); ssx->bbar = xcalloc(1+m, sizeof(mpq_t)); for (i = 0; i <= m; i++) mpq_init(ssx->bbar[i]); ssx->pi = xcalloc(1+m, sizeof(mpq_t)); for (i = 1; i <= m; i++) mpq_init(ssx->pi[i]); ssx->cbar = xcalloc(1+n, sizeof(mpq_t)); for (j = 1; j <= n; j++) mpq_init(ssx->cbar[j]); ssx->rho = xcalloc(1+m, sizeof(mpq_t)); for (i = 1; i <= m; i++) mpq_init(ssx->rho[i]); ssx->ap = xcalloc(1+n, sizeof(mpq_t)); for (j = 1; j <= n; j++) mpq_init(ssx->ap[j]); ssx->aq = xcalloc(1+m, sizeof(mpq_t)); for (i = 1; i <= m; i++) mpq_init(ssx->aq[i]); mpq_init(ssx->delta); return ssx; } /*---------------------------------------------------------------------- // ssx_factorize - factorize the current basis matrix. // // This routine computes factorization of the current basis matrix B // and returns the singularity flag. If the matrix B is non-singular, // the flag is zero, otherwise non-zero. */ static int basis_col(void *info, int j, int ind[], mpq_t val[]) { /* this auxiliary routine provides row indices and numeric values of non-zero elements in j-th column of the matrix B */ SSX *ssx = info; int m = ssx->m; int n = ssx->n; int *A_ptr = ssx->A_ptr; int *A_ind = ssx->A_ind; mpq_t *A_val = ssx->A_val; int *Q_col = ssx->Q_col; int k, len, ptr; xassert(1 <= j && j <= m); k = Q_col[j]; /* x[k] = xB[j] */ xassert(1 <= k && k <= m+n); /* j-th column of the matrix B is k-th column of the augmented constraint matrix (I | -A) */ if (k <= m) { /* it is a column of the unity matrix I */ len = 1, ind[1] = k, mpq_set_si(val[1], 1, 1); } else { /* it is a column of the original constraint matrix -A */ len = 0; for (ptr = A_ptr[k-m]; ptr < A_ptr[k-m+1]; ptr++) { len++; ind[len] = A_ind[ptr]; mpq_neg(val[len], A_val[ptr]); } } return len; } int ssx_factorize(SSX *ssx) { int ret; ret = bfx_factorize(ssx->binv, ssx->m, basis_col, ssx); return ret; } /*---------------------------------------------------------------------- // ssx_get_xNj - determine value of non-basic variable. // // This routine determines the value of non-basic variable xN[j] in the // current basic solution defined as follows: // // 0, if xN[j] is free variable // lN[j], if xN[j] is on its lower bound // uN[j], if xN[j] is on its upper bound // lN[j] = uN[j], if xN[j] is fixed variable // // where lN[j] and uN[j] are lower and upper bounds of xN[j]. */ void ssx_get_xNj(SSX *ssx, int j, mpq_t x) { int m = ssx->m; int n = ssx->n; mpq_t *lb = ssx->lb; mpq_t *ub = ssx->ub; int *stat = ssx->stat; int *Q_col = ssx->Q_col; int k; xassert(1 <= j && j <= n); k = Q_col[m+j]; /* x[k] = xN[j] */ xassert(1 <= k && k <= m+n); switch (stat[k]) { case SSX_NL: /* xN[j] is on its lower bound */ mpq_set(x, lb[k]); break; case SSX_NU: /* xN[j] is on its upper bound */ mpq_set(x, ub[k]); break; case SSX_NF: /* xN[j] is free variable */ mpq_set_si(x, 0, 1); break; case SSX_NS: /* xN[j] is fixed variable */ mpq_set(x, lb[k]); break; default: xassert(stat != stat); } return; } /*---------------------------------------------------------------------- // ssx_eval_bbar - compute values of basic variables. // // This routine computes values of basic variables xB in the current // basic solution as follows: // // beta = - inv(B) * N * xN, // // where B is the basis matrix, N is the matrix of non-basic columns, // xN is a vector of current values of non-basic variables. */ void ssx_eval_bbar(SSX *ssx) { int m = ssx->m; int n = ssx->n; mpq_t *coef = ssx->coef; int *A_ptr = ssx->A_ptr; int *A_ind = ssx->A_ind; mpq_t *A_val = ssx->A_val; int *Q_col = ssx->Q_col; mpq_t *bbar = ssx->bbar; int i, j, k, ptr; mpq_t x, temp; mpq_init(x); mpq_init(temp); /* bbar := 0 */ for (i = 1; i <= m; i++) mpq_set_si(bbar[i], 0, 1); /* bbar := - N * xN = - N[1] * xN[1] - ... - N[n] * xN[n] */ for (j = 1; j <= n; j++) { ssx_get_xNj(ssx, j, x); if (mpq_sgn(x) == 0) continue; k = Q_col[m+j]; /* x[k] = xN[j] */ if (k <= m) { /* N[j] is a column of the unity matrix I */ mpq_sub(bbar[k], bbar[k], x); } else { /* N[j] is a column of the original constraint matrix -A */ for (ptr = A_ptr[k-m]; ptr < A_ptr[k-m+1]; ptr++) { mpq_mul(temp, A_val[ptr], x); mpq_add(bbar[A_ind[ptr]], bbar[A_ind[ptr]], temp); } } } /* bbar := inv(B) * bbar */ bfx_ftran(ssx->binv, bbar, 0); #if 1 /* compute value of the objective function */ /* bbar[0] := c[0] */ mpq_set(bbar[0], coef[0]); /* bbar[0] := bbar[0] + sum{i in B} cB[i] * xB[i] */ for (i = 1; i <= m; i++) { k = Q_col[i]; /* x[k] = xB[i] */ if (mpq_sgn(coef[k]) == 0) continue; mpq_mul(temp, coef[k], bbar[i]); mpq_add(bbar[0], bbar[0], temp); } /* bbar[0] := bbar[0] + sum{j in N} cN[j] * xN[j] */ for (j = 1; j <= n; j++) { k = Q_col[m+j]; /* x[k] = xN[j] */ if (mpq_sgn(coef[k]) == 0) continue; ssx_get_xNj(ssx, j, x); mpq_mul(temp, coef[k], x); mpq_add(bbar[0], bbar[0], temp); } #endif mpq_clear(x); mpq_clear(temp); return; } /*---------------------------------------------------------------------- // ssx_eval_pi - compute values of simplex multipliers. // // This routine computes values of simplex multipliers (shadow prices) // pi in the current basic solution as follows: // // pi = inv(B') * cB, // // where B' is a matrix transposed to the basis matrix B, cB is a vector // of objective coefficients at basic variables xB. */ void ssx_eval_pi(SSX *ssx) { int m = ssx->m; mpq_t *coef = ssx->coef; int *Q_col = ssx->Q_col; mpq_t *pi = ssx->pi; int i; /* pi := cB */ for (i = 1; i <= m; i++) mpq_set(pi[i], coef[Q_col[i]]); /* pi := inv(B') * cB */ bfx_btran(ssx->binv, pi); return; } /*---------------------------------------------------------------------- // ssx_eval_dj - compute reduced cost of non-basic variable. // // This routine computes reduced cost d[j] of non-basic variable xN[j] // in the current basic solution as follows: // // d[j] = cN[j] - N[j] * pi, // // where cN[j] is an objective coefficient at xN[j], N[j] is a column // of the augmented constraint matrix (I | -A) corresponding to xN[j], // pi is the vector of simplex multipliers (shadow prices). */ void ssx_eval_dj(SSX *ssx, int j, mpq_t dj) { int m = ssx->m; int n = ssx->n; mpq_t *coef = ssx->coef; int *A_ptr = ssx->A_ptr; int *A_ind = ssx->A_ind; mpq_t *A_val = ssx->A_val; int *Q_col = ssx->Q_col; mpq_t *pi = ssx->pi; int k, ptr, end; mpq_t temp; mpq_init(temp); xassert(1 <= j && j <= n); k = Q_col[m+j]; /* x[k] = xN[j] */ xassert(1 <= k && k <= m+n); /* j-th column of the matrix N is k-th column of the augmented constraint matrix (I | -A) */ if (k <= m) { /* it is a column of the unity matrix I */ mpq_sub(dj, coef[k], pi[k]); } else { /* it is a column of the original constraint matrix -A */ mpq_set(dj, coef[k]); for (ptr = A_ptr[k-m], end = A_ptr[k-m+1]; ptr < end; ptr++) { mpq_mul(temp, A_val[ptr], pi[A_ind[ptr]]); mpq_add(dj, dj, temp); } } mpq_clear(temp); return; } /*---------------------------------------------------------------------- // ssx_eval_cbar - compute reduced costs of all non-basic variables. // // This routine computes the vector of reduced costs pi in the current // basic solution for all non-basic variables, including fixed ones. */ void ssx_eval_cbar(SSX *ssx) { int n = ssx->n; mpq_t *cbar = ssx->cbar; int j; for (j = 1; j <= n; j++) ssx_eval_dj(ssx, j, cbar[j]); return; } /*---------------------------------------------------------------------- // ssx_eval_rho - compute p-th row of the inverse. // // This routine computes p-th row of the matrix inv(B), where B is the // current basis matrix. // // p-th row of the inverse is computed using the following formula: // // rho = inv(B') * e[p], // // where B' is a matrix transposed to B, e[p] is a unity vector, which // contains one in p-th position. */ void ssx_eval_rho(SSX *ssx) { int m = ssx->m; int p = ssx->p; mpq_t *rho = ssx->rho; int i; xassert(1 <= p && p <= m); /* rho := 0 */ for (i = 1; i <= m; i++) mpq_set_si(rho[i], 0, 1); /* rho := e[p] */ mpq_set_si(rho[p], 1, 1); /* rho := inv(B') * rho */ bfx_btran(ssx->binv, rho); return; } /*---------------------------------------------------------------------- // ssx_eval_row - compute pivot row of the simplex table. // // This routine computes p-th (pivot) row of the current simplex table // A~ = - inv(B) * N using the following formula: // // A~[p] = - N' * inv(B') * e[p] = - N' * rho[p], // // where N' is a matrix transposed to the matrix N, rho[p] is p-th row // of the inverse inv(B). */ void ssx_eval_row(SSX *ssx) { int m = ssx->m; int n = ssx->n; int *A_ptr = ssx->A_ptr; int *A_ind = ssx->A_ind; mpq_t *A_val = ssx->A_val; int *Q_col = ssx->Q_col; mpq_t *rho = ssx->rho; mpq_t *ap = ssx->ap; int j, k, ptr; mpq_t temp; mpq_init(temp); for (j = 1; j <= n; j++) { /* ap[j] := - N'[j] * rho (inner product) */ k = Q_col[m+j]; /* x[k] = xN[j] */ if (k <= m) mpq_neg(ap[j], rho[k]); else { mpq_set_si(ap[j], 0, 1); for (ptr = A_ptr[k-m]; ptr < A_ptr[k-m+1]; ptr++) { mpq_mul(temp, A_val[ptr], rho[A_ind[ptr]]); mpq_add(ap[j], ap[j], temp); } } } mpq_clear(temp); return; } /*---------------------------------------------------------------------- // ssx_eval_col - compute pivot column of the simplex table. // // This routine computes q-th (pivot) column of the current simplex // table A~ = - inv(B) * N using the following formula: // // A~[q] = - inv(B) * N[q], // // where N[q] is q-th column of the matrix N corresponding to chosen // non-basic variable xN[q]. */ void ssx_eval_col(SSX *ssx) { int m = ssx->m; int n = ssx->n; int *A_ptr = ssx->A_ptr; int *A_ind = ssx->A_ind; mpq_t *A_val = ssx->A_val; int *Q_col = ssx->Q_col; int q = ssx->q; mpq_t *aq = ssx->aq; int i, k, ptr; xassert(1 <= q && q <= n); /* aq := 0 */ for (i = 1; i <= m; i++) mpq_set_si(aq[i], 0, 1); /* aq := N[q] */ k = Q_col[m+q]; /* x[k] = xN[q] */ if (k <= m) { /* N[q] is a column of the unity matrix I */ mpq_set_si(aq[k], 1, 1); } else { /* N[q] is a column of the original constraint matrix -A */ for (ptr = A_ptr[k-m]; ptr < A_ptr[k-m+1]; ptr++) mpq_neg(aq[A_ind[ptr]], A_val[ptr]); } /* aq := inv(B) * aq */ bfx_ftran(ssx->binv, aq, 1); /* aq := - aq */ for (i = 1; i <= m; i++) mpq_neg(aq[i], aq[i]); return; } /*---------------------------------------------------------------------- // ssx_chuzc - choose pivot column. // // This routine chooses non-basic variable xN[q] whose reduced cost // indicates possible improving of the objective function to enter it // in the basis. // // Currently the standard (textbook) pricing is used, i.e. that // non-basic variable is preferred which has greatest reduced cost (in // magnitude). // // If xN[q] has been chosen, the routine stores its number q and also // sets the flag q_dir that indicates direction in which xN[q] has to // change (+1 means increasing, -1 means decreasing). // // If the choice cannot be made, because the current basic solution is // dual feasible, the routine sets the number q to 0. */ void ssx_chuzc(SSX *ssx) { int m = ssx->m; int n = ssx->n; int dir = (ssx->dir == SSX_MIN ? +1 : -1); int *Q_col = ssx->Q_col; int *stat = ssx->stat; mpq_t *cbar = ssx->cbar; int j, k, s, q, q_dir; double best, temp; /* nothing is chosen so far */ q = 0, q_dir = 0, best = 0.0; /* look through the list of non-basic variables */ for (j = 1; j <= n; j++) { k = Q_col[m+j]; /* x[k] = xN[j] */ s = dir * mpq_sgn(cbar[j]); if ((stat[k] == SSX_NF || stat[k] == SSX_NL) && s < 0 || (stat[k] == SSX_NF || stat[k] == SSX_NU) && s > 0) { /* reduced cost of xN[j] indicates possible improving of the objective function */ temp = fabs(mpq_get_d(cbar[j])); xassert(temp != 0.0); if (q == 0 || best < temp) q = j, q_dir = - s, best = temp; } } ssx->q = q, ssx->q_dir = q_dir; return; } /*---------------------------------------------------------------------- // ssx_chuzr - choose pivot row. // // This routine looks through elements of q-th column of the simplex // table and chooses basic variable xB[p] which should leave the basis. // // The choice is based on the standard (textbook) ratio test. // // If xB[p] has been chosen, the routine stores its number p and also // sets its non-basic status p_stat which should be assigned to xB[p] // when it has left the basis and become xN[q]. // // Special case p < 0 means that xN[q] is double-bounded variable and // it reaches its opposite bound before any basic variable does that, // so the current basis remains unchanged. // // If the choice cannot be made, because xN[q] can infinitely change in // the feasible direction, the routine sets the number p to 0. */ void ssx_chuzr(SSX *ssx) { int m = ssx->m; int n = ssx->n; int *type = ssx->type; mpq_t *lb = ssx->lb; mpq_t *ub = ssx->ub; int *Q_col = ssx->Q_col; mpq_t *bbar = ssx->bbar; int q = ssx->q; mpq_t *aq = ssx->aq; int q_dir = ssx->q_dir; int i, k, s, t, p, p_stat; mpq_t teta, temp; mpq_init(teta); mpq_init(temp); xassert(1 <= q && q <= n); xassert(q_dir == +1 || q_dir == -1); /* nothing is chosen so far */ p = 0, p_stat = 0; /* look through the list of basic variables */ for (i = 1; i <= m; i++) { s = q_dir * mpq_sgn(aq[i]); if (s < 0) { /* xB[i] decreases */ k = Q_col[i]; /* x[k] = xB[i] */ t = type[k]; if (t == SSX_LO || t == SSX_DB || t == SSX_FX) { /* xB[i] has finite lower bound */ mpq_sub(temp, bbar[i], lb[k]); mpq_div(temp, temp, aq[i]); mpq_abs(temp, temp); if (p == 0 || mpq_cmp(teta, temp) > 0) { p = i; p_stat = (t == SSX_FX ? SSX_NS : SSX_NL); mpq_set(teta, temp); } } } else if (s > 0) { /* xB[i] increases */ k = Q_col[i]; /* x[k] = xB[i] */ t = type[k]; if (t == SSX_UP || t == SSX_DB || t == SSX_FX) { /* xB[i] has finite upper bound */ mpq_sub(temp, bbar[i], ub[k]); mpq_div(temp, temp, aq[i]); mpq_abs(temp, temp); if (p == 0 || mpq_cmp(teta, temp) > 0) { p = i; p_stat = (t == SSX_FX ? SSX_NS : SSX_NU); mpq_set(teta, temp); } } } /* if something has been chosen and the ratio test indicates exact degeneracy, the search can be finished */ if (p != 0 && mpq_sgn(teta) == 0) break; } /* if xN[q] is double-bounded, check if it can reach its opposite bound before any basic variable */ k = Q_col[m+q]; /* x[k] = xN[q] */ if (type[k] == SSX_DB) { mpq_sub(temp, ub[k], lb[k]); if (p == 0 || mpq_cmp(teta, temp) > 0) { p = -1; p_stat = -1; mpq_set(teta, temp); } } ssx->p = p; ssx->p_stat = p_stat; /* if xB[p] has been chosen, determine its actual change in the adjacent basis (it has the same sign as q_dir) */ if (p != 0) { xassert(mpq_sgn(teta) >= 0); if (q_dir > 0) mpq_set(ssx->delta, teta); else mpq_neg(ssx->delta, teta); } mpq_clear(teta); mpq_clear(temp); return; } /*---------------------------------------------------------------------- // ssx_update_bbar - update values of basic variables. // // This routine recomputes the current values of basic variables for // the adjacent basis. // // The simplex table for the current basis is the following: // // xB[i] = sum{j in 1..n} alfa[i,j] * xN[q], i = 1,...,m // // therefore // // delta xB[i] = alfa[i,q] * delta xN[q], i = 1,...,m // // where delta xN[q] = xN.new[q] - xN[q] is the change of xN[q] in the // adjacent basis, and delta xB[i] = xB.new[i] - xB[i] is the change of // xB[i]. This gives formulae for recomputing values of xB[i]: // // xB.new[p] = xN[q] + delta xN[q] // // (because xN[q] becomes xB[p] in the adjacent basis), and // // xB.new[i] = xB[i] + alfa[i,q] * delta xN[q], i != p // // for other basic variables. */ void ssx_update_bbar(SSX *ssx) { int m = ssx->m; int n = ssx->n; mpq_t *bbar = ssx->bbar; mpq_t *cbar = ssx->cbar; int p = ssx->p; int q = ssx->q; mpq_t *aq = ssx->aq; int i; mpq_t temp; mpq_init(temp); xassert(1 <= q && q <= n); if (p < 0) { /* xN[q] is double-bounded and goes to its opposite bound */ /* nop */; } else { /* xN[q] becomes xB[p] in the adjacent basis */ /* xB.new[p] = xN[q] + delta xN[q] */ xassert(1 <= p && p <= m); ssx_get_xNj(ssx, q, temp); mpq_add(bbar[p], temp, ssx->delta); } /* update values of other basic variables depending on xN[q] */ for (i = 1; i <= m; i++) { if (i == p) continue; /* xB.new[i] = xB[i] + alfa[i,q] * delta xN[q] */ if (mpq_sgn(aq[i]) == 0) continue; mpq_mul(temp, aq[i], ssx->delta); mpq_add(bbar[i], bbar[i], temp); } #if 1 /* update value of the objective function */ /* z.new = z + d[q] * delta xN[q] */ mpq_mul(temp, cbar[q], ssx->delta); mpq_add(bbar[0], bbar[0], temp); #endif mpq_clear(temp); return; } /*---------------------------------------------------------------------- -- ssx_update_pi - update simplex multipliers. -- -- This routine recomputes the vector of simplex multipliers for the -- adjacent basis. */ void ssx_update_pi(SSX *ssx) { int m = ssx->m; int n = ssx->n; mpq_t *pi = ssx->pi; mpq_t *cbar = ssx->cbar; int p = ssx->p; int q = ssx->q; mpq_t *aq = ssx->aq; mpq_t *rho = ssx->rho; int i; mpq_t new_dq, temp; mpq_init(new_dq); mpq_init(temp); xassert(1 <= p && p <= m); xassert(1 <= q && q <= n); /* compute d[q] in the adjacent basis */ mpq_div(new_dq, cbar[q], aq[p]); /* update the vector of simplex multipliers */ for (i = 1; i <= m; i++) { if (mpq_sgn(rho[i]) == 0) continue; mpq_mul(temp, new_dq, rho[i]); mpq_sub(pi[i], pi[i], temp); } mpq_clear(new_dq); mpq_clear(temp); return; } /*---------------------------------------------------------------------- // ssx_update_cbar - update reduced costs of non-basic variables. // // This routine recomputes the vector of reduced costs of non-basic // variables for the adjacent basis. */ void ssx_update_cbar(SSX *ssx) { int m = ssx->m; int n = ssx->n; mpq_t *cbar = ssx->cbar; int p = ssx->p; int q = ssx->q; mpq_t *ap = ssx->ap; int j; mpq_t temp; mpq_init(temp); xassert(1 <= p && p <= m); xassert(1 <= q && q <= n); /* compute d[q] in the adjacent basis */ /* d.new[q] = d[q] / alfa[p,q] */ mpq_div(cbar[q], cbar[q], ap[q]); /* update reduced costs of other non-basic variables */ for (j = 1; j <= n; j++) { if (j == q) continue; /* d.new[j] = d[j] - (alfa[p,j] / alfa[p,q]) * d[q] */ if (mpq_sgn(ap[j]) == 0) continue; mpq_mul(temp, ap[j], cbar[q]); mpq_sub(cbar[j], cbar[j], temp); } mpq_clear(temp); return; } /*---------------------------------------------------------------------- // ssx_change_basis - change current basis to adjacent one. // // This routine changes the current basis to the adjacent one swapping // basic variable xB[p] and non-basic variable xN[q]. */ void ssx_change_basis(SSX *ssx) { int m = ssx->m; int n = ssx->n; int *type = ssx->type; int *stat = ssx->stat; int *Q_row = ssx->Q_row; int *Q_col = ssx->Q_col; int p = ssx->p; int q = ssx->q; int p_stat = ssx->p_stat; int k, kp, kq; if (p < 0) { /* special case: xN[q] goes to its opposite bound */ xassert(1 <= q && q <= n); k = Q_col[m+q]; /* x[k] = xN[q] */ xassert(type[k] == SSX_DB); switch (stat[k]) { case SSX_NL: stat[k] = SSX_NU; break; case SSX_NU: stat[k] = SSX_NL; break; default: xassert(stat != stat); } } else { /* xB[p] leaves the basis, xN[q] enters the basis */ xassert(1 <= p && p <= m); xassert(1 <= q && q <= n); kp = Q_col[p]; /* x[kp] = xB[p] */ kq = Q_col[m+q]; /* x[kq] = xN[q] */ /* check non-basic status of xB[p] which becomes xN[q] */ switch (type[kp]) { case SSX_FR: xassert(p_stat == SSX_NF); break; case SSX_LO: xassert(p_stat == SSX_NL); break; case SSX_UP: xassert(p_stat == SSX_NU); break; case SSX_DB: xassert(p_stat == SSX_NL || p_stat == SSX_NU); break; case SSX_FX: xassert(p_stat == SSX_NS); break; default: xassert(type != type); } /* swap xB[p] and xN[q] */ stat[kp] = (char)p_stat, stat[kq] = SSX_BS; Q_row[kp] = m+q, Q_row[kq] = p; Q_col[p] = kq, Q_col[m+q] = kp; /* update factorization of the basis matrix */ if (bfx_update(ssx->binv, p)) { if (ssx_factorize(ssx)) xassert(("Internal error: basis matrix is singular", 0)); } } return; } /*---------------------------------------------------------------------- // ssx_delete - delete simplex solver workspace. // // This routine deletes the simplex solver workspace freeing all the // memory allocated to this object. */ void ssx_delete(SSX *ssx) { int m = ssx->m; int n = ssx->n; int nnz = ssx->A_ptr[n+1]-1; int i, j, k; xfree(ssx->type); for (k = 1; k <= m+n; k++) mpq_clear(ssx->lb[k]); xfree(ssx->lb); for (k = 1; k <= m+n; k++) mpq_clear(ssx->ub[k]); xfree(ssx->ub); for (k = 0; k <= m+n; k++) mpq_clear(ssx->coef[k]); xfree(ssx->coef); xfree(ssx->A_ptr); xfree(ssx->A_ind); for (k = 1; k <= nnz; k++) mpq_clear(ssx->A_val[k]); xfree(ssx->A_val); xfree(ssx->stat); xfree(ssx->Q_row); xfree(ssx->Q_col); bfx_delete_binv(ssx->binv); for (i = 0; i <= m; i++) mpq_clear(ssx->bbar[i]); xfree(ssx->bbar); for (i = 1; i <= m; i++) mpq_clear(ssx->pi[i]); xfree(ssx->pi); for (j = 1; j <= n; j++) mpq_clear(ssx->cbar[j]); xfree(ssx->cbar); for (i = 1; i <= m; i++) mpq_clear(ssx->rho[i]); xfree(ssx->rho); for (j = 1; j <= n; j++) mpq_clear(ssx->ap[j]); xfree(ssx->ap); for (i = 1; i <= m; i++) mpq_clear(ssx->aq[i]); xfree(ssx->aq); mpq_clear(ssx->delta); xfree(ssx); return; } /* eof */ glpk-5.0/src/draft/glpssx02.c0000644000062000006210000004263013766346220015224 0ustar maomkpasswd/* glpssx02.c (simplex method, rational arithmetic) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2003-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "glpssx.h" static void show_progress(SSX *ssx, int phase) { /* this auxiliary routine displays information about progress of the search */ int i, def = 0; for (i = 1; i <= ssx->m; i++) if (ssx->type[ssx->Q_col[i]] == SSX_FX) def++; xprintf("%s%6d: %s = %22.15g (%d)\n", phase == 1 ? " " : "*", ssx->it_cnt, phase == 1 ? "infsum" : "objval", mpq_get_d(ssx->bbar[0]), def); #if 0 ssx->tm_lag = utime(); #else ssx->tm_lag = xtime(); #endif return; } /*---------------------------------------------------------------------- // ssx_phase_I - find primal feasible solution. // // This routine implements phase I of the primal simplex method. // // On exit the routine returns one of the following codes: // // 0 - feasible solution found; // 1 - problem has no feasible solution; // 2 - iterations limit exceeded; // 3 - time limit exceeded. ----------------------------------------------------------------------*/ int ssx_phase_I(SSX *ssx) { int m = ssx->m; int n = ssx->n; int *type = ssx->type; mpq_t *lb = ssx->lb; mpq_t *ub = ssx->ub; mpq_t *coef = ssx->coef; int *A_ptr = ssx->A_ptr; int *A_ind = ssx->A_ind; mpq_t *A_val = ssx->A_val; int *Q_col = ssx->Q_col; mpq_t *bbar = ssx->bbar; mpq_t *pi = ssx->pi; mpq_t *cbar = ssx->cbar; int *orig_type, orig_dir; mpq_t *orig_lb, *orig_ub, *orig_coef; int i, k, ret; /* save components of the original LP problem, which are changed by the routine */ orig_type = xcalloc(1+m+n, sizeof(int)); orig_lb = xcalloc(1+m+n, sizeof(mpq_t)); orig_ub = xcalloc(1+m+n, sizeof(mpq_t)); orig_coef = xcalloc(1+m+n, sizeof(mpq_t)); for (k = 1; k <= m+n; k++) { orig_type[k] = type[k]; mpq_init(orig_lb[k]); mpq_set(orig_lb[k], lb[k]); mpq_init(orig_ub[k]); mpq_set(orig_ub[k], ub[k]); } orig_dir = ssx->dir; for (k = 0; k <= m+n; k++) { mpq_init(orig_coef[k]); mpq_set(orig_coef[k], coef[k]); } /* build an artificial basic solution, which is primal feasible, and also build an auxiliary objective function to minimize the sum of infeasibilities for the original problem */ ssx->dir = SSX_MIN; for (k = 0; k <= m+n; k++) mpq_set_si(coef[k], 0, 1); mpq_set_si(bbar[0], 0, 1); for (i = 1; i <= m; i++) { int t; k = Q_col[i]; /* x[k] = xB[i] */ t = type[k]; if (t == SSX_LO || t == SSX_DB || t == SSX_FX) { /* in the original problem x[k] has lower bound */ if (mpq_cmp(bbar[i], lb[k]) < 0) { /* which is violated */ type[k] = SSX_UP; mpq_set(ub[k], lb[k]); mpq_set_si(lb[k], 0, 1); mpq_set_si(coef[k], -1, 1); mpq_add(bbar[0], bbar[0], ub[k]); mpq_sub(bbar[0], bbar[0], bbar[i]); } } if (t == SSX_UP || t == SSX_DB || t == SSX_FX) { /* in the original problem x[k] has upper bound */ if (mpq_cmp(bbar[i], ub[k]) > 0) { /* which is violated */ type[k] = SSX_LO; mpq_set(lb[k], ub[k]); mpq_set_si(ub[k], 0, 1); mpq_set_si(coef[k], +1, 1); mpq_add(bbar[0], bbar[0], bbar[i]); mpq_sub(bbar[0], bbar[0], lb[k]); } } } /* now the initial basic solution should be primal feasible due to changes of bounds of some basic variables, which turned to implicit artifical variables */ /* compute simplex multipliers and reduced costs */ ssx_eval_pi(ssx); ssx_eval_cbar(ssx); /* display initial progress of the search */ #if 1 /* 25/XI-2017 */ if (ssx->msg_lev >= GLP_MSG_ON) #endif show_progress(ssx, 1); /* main loop starts here */ for (;;) { /* display current progress of the search */ #if 1 /* 25/XI-2017 */ if (ssx->msg_lev >= GLP_MSG_ON) #endif #if 0 if (utime() - ssx->tm_lag >= ssx->out_frq - 0.001) #else if (xdifftime(xtime(), ssx->tm_lag) >= ssx->out_frq - 0.001) #endif show_progress(ssx, 1); /* we do not need to wait until all artificial variables have left the basis */ if (mpq_sgn(bbar[0]) == 0) { /* the sum of infeasibilities is zero, therefore the current solution is primal feasible for the original problem */ ret = 0; break; } /* check if the iterations limit has been exhausted */ if (ssx->it_lim == 0) { ret = 2; break; } /* check if the time limit has been exhausted */ #if 0 if (ssx->tm_lim >= 0.0 && ssx->tm_lim <= utime() - ssx->tm_beg) #else if (ssx->tm_lim >= 0.0 && ssx->tm_lim <= xdifftime(xtime(), ssx->tm_beg)) #endif { ret = 3; break; } /* choose non-basic variable xN[q] */ ssx_chuzc(ssx); /* if xN[q] cannot be chosen, the sum of infeasibilities is minimal but non-zero; therefore the original problem has no primal feasible solution */ if (ssx->q == 0) { ret = 1; break; } /* compute q-th column of the simplex table */ ssx_eval_col(ssx); /* choose basic variable xB[p] */ ssx_chuzr(ssx); /* the sum of infeasibilities cannot be negative, therefore the auxiliary lp problem cannot have unbounded solution */ xassert(ssx->p != 0); /* update values of basic variables */ ssx_update_bbar(ssx); if (ssx->p > 0) { /* compute p-th row of the inverse inv(B) */ ssx_eval_rho(ssx); /* compute p-th row of the simplex table */ ssx_eval_row(ssx); xassert(mpq_cmp(ssx->aq[ssx->p], ssx->ap[ssx->q]) == 0); /* update simplex multipliers */ ssx_update_pi(ssx); /* update reduced costs of non-basic variables */ ssx_update_cbar(ssx); } /* xB[p] is leaving the basis; if it is implicit artificial variable, the corresponding residual vanishes; therefore bounds of this variable should be restored to the original values */ if (ssx->p > 0) { k = Q_col[ssx->p]; /* x[k] = xB[p] */ if (type[k] != orig_type[k]) { /* x[k] is implicit artificial variable */ type[k] = orig_type[k]; mpq_set(lb[k], orig_lb[k]); mpq_set(ub[k], orig_ub[k]); xassert(ssx->p_stat == SSX_NL || ssx->p_stat == SSX_NU); ssx->p_stat = (ssx->p_stat == SSX_NL ? SSX_NU : SSX_NL); if (type[k] == SSX_FX) ssx->p_stat = SSX_NS; /* nullify the objective coefficient at x[k] */ mpq_set_si(coef[k], 0, 1); /* since coef[k] has been changed, we need to compute new reduced cost of x[k], which it will have in the adjacent basis */ /* the formula d[j] = cN[j] - pi' * N[j] is used (note that the vector pi is not changed, because it depends on objective coefficients at basic variables, but in the adjacent basis, for which the vector pi has been just recomputed, x[k] is non-basic) */ if (k <= m) { /* x[k] is auxiliary variable */ mpq_neg(cbar[ssx->q], pi[k]); } else { /* x[k] is structural variable */ int ptr; mpq_t temp; mpq_init(temp); mpq_set_si(cbar[ssx->q], 0, 1); for (ptr = A_ptr[k-m]; ptr < A_ptr[k-m+1]; ptr++) { mpq_mul(temp, pi[A_ind[ptr]], A_val[ptr]); mpq_add(cbar[ssx->q], cbar[ssx->q], temp); } mpq_clear(temp); } } } /* jump to the adjacent vertex of the polyhedron */ ssx_change_basis(ssx); /* one simplex iteration has been performed */ if (ssx->it_lim > 0) ssx->it_lim--; ssx->it_cnt++; } /* display final progress of the search */ #if 1 /* 25/XI-2017 */ if (ssx->msg_lev >= GLP_MSG_ON) #endif show_progress(ssx, 1); /* restore components of the original problem, which were changed by the routine */ for (k = 1; k <= m+n; k++) { type[k] = orig_type[k]; mpq_set(lb[k], orig_lb[k]); mpq_clear(orig_lb[k]); mpq_set(ub[k], orig_ub[k]); mpq_clear(orig_ub[k]); } ssx->dir = orig_dir; for (k = 0; k <= m+n; k++) { mpq_set(coef[k], orig_coef[k]); mpq_clear(orig_coef[k]); } xfree(orig_type); xfree(orig_lb); xfree(orig_ub); xfree(orig_coef); /* return to the calling program */ return ret; } /*---------------------------------------------------------------------- // ssx_phase_II - find optimal solution. // // This routine implements phase II of the primal simplex method. // // On exit the routine returns one of the following codes: // // 0 - optimal solution found; // 1 - problem has unbounded solution; // 2 - iterations limit exceeded; // 3 - time limit exceeded. ----------------------------------------------------------------------*/ int ssx_phase_II(SSX *ssx) { int ret; /* display initial progress of the search */ #if 1 /* 25/XI-2017 */ if (ssx->msg_lev >= GLP_MSG_ON) #endif show_progress(ssx, 2); /* main loop starts here */ for (;;) { /* display current progress of the search */ #if 1 /* 25/XI-2017 */ if (ssx->msg_lev >= GLP_MSG_ON) #endif #if 0 if (utime() - ssx->tm_lag >= ssx->out_frq - 0.001) #else if (xdifftime(xtime(), ssx->tm_lag) >= ssx->out_frq - 0.001) #endif show_progress(ssx, 2); /* check if the iterations limit has been exhausted */ if (ssx->it_lim == 0) { ret = 2; break; } /* check if the time limit has been exhausted */ #if 0 if (ssx->tm_lim >= 0.0 && ssx->tm_lim <= utime() - ssx->tm_beg) #else if (ssx->tm_lim >= 0.0 && ssx->tm_lim <= xdifftime(xtime(), ssx->tm_beg)) #endif { ret = 3; break; } /* choose non-basic variable xN[q] */ ssx_chuzc(ssx); /* if xN[q] cannot be chosen, the current basic solution is dual feasible and therefore optimal */ if (ssx->q == 0) { ret = 0; break; } /* compute q-th column of the simplex table */ ssx_eval_col(ssx); /* choose basic variable xB[p] */ ssx_chuzr(ssx); /* if xB[p] cannot be chosen, the problem has no dual feasible solution (i.e. unbounded) */ if (ssx->p == 0) { ret = 1; break; } /* update values of basic variables */ ssx_update_bbar(ssx); if (ssx->p > 0) { /* compute p-th row of the inverse inv(B) */ ssx_eval_rho(ssx); /* compute p-th row of the simplex table */ ssx_eval_row(ssx); xassert(mpq_cmp(ssx->aq[ssx->p], ssx->ap[ssx->q]) == 0); #if 0 /* update simplex multipliers */ ssx_update_pi(ssx); #endif /* update reduced costs of non-basic variables */ ssx_update_cbar(ssx); } /* jump to the adjacent vertex of the polyhedron */ ssx_change_basis(ssx); /* one simplex iteration has been performed */ if (ssx->it_lim > 0) ssx->it_lim--; ssx->it_cnt++; } /* display final progress of the search */ #if 1 /* 25/XI-2017 */ if (ssx->msg_lev >= GLP_MSG_ON) #endif show_progress(ssx, 2); /* return to the calling program */ return ret; } /*---------------------------------------------------------------------- // ssx_driver - base driver to exact simplex method. // // This routine is a base driver to a version of the primal simplex // method using exact (bignum) arithmetic. // // On exit the routine returns one of the following codes: // // 0 - optimal solution found; // 1 - problem has no feasible solution; // 2 - problem has unbounded solution; // 3 - iterations limit exceeded (phase I); // 4 - iterations limit exceeded (phase II); // 5 - time limit exceeded (phase I); // 6 - time limit exceeded (phase II); // 7 - initial basis matrix is exactly singular. ----------------------------------------------------------------------*/ int ssx_driver(SSX *ssx) { int m = ssx->m; int *type = ssx->type; mpq_t *lb = ssx->lb; mpq_t *ub = ssx->ub; int *Q_col = ssx->Q_col; mpq_t *bbar = ssx->bbar; int i, k, ret; ssx->tm_beg = xtime(); /* factorize the initial basis matrix */ if (ssx_factorize(ssx)) #if 0 /* 25/XI-2017 */ { xprintf("Initial basis matrix is singular\n"); #else { if (ssx->msg_lev >= GLP_MSG_ERR) xprintf("Initial basis matrix is singular\n"); #endif ret = 7; goto done; } /* compute values of basic variables */ ssx_eval_bbar(ssx); /* check if the initial basic solution is primal feasible */ for (i = 1; i <= m; i++) { int t; k = Q_col[i]; /* x[k] = xB[i] */ t = type[k]; if (t == SSX_LO || t == SSX_DB || t == SSX_FX) { /* x[k] has lower bound */ if (mpq_cmp(bbar[i], lb[k]) < 0) { /* which is violated */ break; } } if (t == SSX_UP || t == SSX_DB || t == SSX_FX) { /* x[k] has upper bound */ if (mpq_cmp(bbar[i], ub[k]) > 0) { /* which is violated */ break; } } } if (i > m) { /* no basic variable violates its bounds */ ret = 0; goto skip; } /* phase I: find primal feasible solution */ ret = ssx_phase_I(ssx); switch (ret) { case 0: ret = 0; break; case 1: #if 1 /* 25/XI-2017 */ if (ssx->msg_lev >= GLP_MSG_ALL) #endif xprintf("PROBLEM HAS NO FEASIBLE SOLUTION\n"); ret = 1; break; case 2: #if 1 /* 25/XI-2017 */ if (ssx->msg_lev >= GLP_MSG_ALL) #endif xprintf("ITERATIONS LIMIT EXCEEDED; SEARCH TERMINATED\n"); ret = 3; break; case 3: #if 1 /* 25/XI-2017 */ if (ssx->msg_lev >= GLP_MSG_ALL) #endif xprintf("TIME LIMIT EXCEEDED; SEARCH TERMINATED\n"); ret = 5; break; default: xassert(ret != ret); } /* compute values of basic variables (actually only the objective value needs to be computed) */ ssx_eval_bbar(ssx); skip: /* compute simplex multipliers */ ssx_eval_pi(ssx); /* compute reduced costs of non-basic variables */ ssx_eval_cbar(ssx); /* if phase I failed, do not start phase II */ if (ret != 0) goto done; /* phase II: find optimal solution */ ret = ssx_phase_II(ssx); switch (ret) { case 0: #if 1 /* 25/XI-2017 */ if (ssx->msg_lev >= GLP_MSG_ALL) #endif xprintf("OPTIMAL SOLUTION FOUND\n"); ret = 0; break; case 1: #if 1 /* 25/XI-2017 */ if (ssx->msg_lev >= GLP_MSG_ALL) #endif xprintf("PROBLEM HAS UNBOUNDED SOLUTION\n"); ret = 2; break; case 2: #if 1 /* 25/XI-2017 */ if (ssx->msg_lev >= GLP_MSG_ALL) #endif xprintf("ITERATIONS LIMIT EXCEEDED; SEARCH TERMINATED\n"); ret = 4; break; case 3: #if 1 /* 25/XI-2017 */ if (ssx->msg_lev >= GLP_MSG_ALL) #endif xprintf("TIME LIMIT EXCEEDED; SEARCH TERMINATED\n"); ret = 6; break; default: xassert(ret != ret); } done: /* decrease the time limit by the spent amount of time */ if (ssx->tm_lim >= 0.0) #if 0 { ssx->tm_lim -= utime() - ssx->tm_beg; #else { ssx->tm_lim -= xdifftime(xtime(), ssx->tm_beg); #endif if (ssx->tm_lim < 0.0) ssx->tm_lim = 0.0; } return ret; } /* eof */ glpk-5.0/src/draft/ios.h0000644000062000006210000005015713766346220014344 0ustar maomkpasswd/* ios.h (integer optimization suite) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2003-2018 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef IOS_H #define IOS_H #include "prob.h" #if 1 /* 02/II-2018 */ #define NEW_LOCAL 1 #endif #if 1 /* 15/II-2018 */ #define NEW_COVER 1 #endif typedef struct IOSLOT IOSLOT; typedef struct IOSNPD IOSNPD; typedef struct IOSBND IOSBND; typedef struct IOSTAT IOSTAT; typedef struct IOSROW IOSROW; typedef struct IOSAIJ IOSAIJ; #ifdef NEW_LOCAL /* 02/II-2018 */ typedef glp_prob IOSPOOL; typedef GLPROW IOSCUT; #else typedef struct IOSPOOL IOSPOOL; typedef struct IOSCUT IOSCUT; #endif struct glp_tree { /* branch-and-bound tree */ int magic; /* magic value used for debugging */ DMP *pool; /* memory pool to store all IOS components */ int n; /* number of columns (variables) */ /*--------------------------------------------------------------*/ /* problem components corresponding to the original MIP and its LP relaxation (used to restore the original problem object on exit from the solver) */ int orig_m; /* number of rows */ unsigned char *orig_type; /* uchar orig_type[1+orig_m+n]; */ /* types of all variables */ double *orig_lb; /* double orig_lb[1+orig_m+n]; */ /* lower bounds of all variables */ double *orig_ub; /* double orig_ub[1+orig_m+n]; */ /* upper bounds of all variables */ unsigned char *orig_stat; /* uchar orig_stat[1+orig_m+n]; */ /* statuses of all variables */ double *orig_prim; /* double orig_prim[1+orig_m+n]; */ /* primal values of all variables */ double *orig_dual; /* double orig_dual[1+orig_m+n]; */ /* dual values of all variables */ double orig_obj; /* optimal objective value for LP relaxation */ /*--------------------------------------------------------------*/ /* branch-and-bound tree */ int nslots; /* length of the array of slots (enlarged automatically) */ int avail; /* index of the first free slot; 0 means all slots are in use */ IOSLOT *slot; /* IOSLOT slot[1+nslots]; */ /* array of slots: slot[0] is not used; slot[p], 1 <= p <= nslots, either contains a pointer to some node of the branch-and-bound tree, in which case p is used on API level as the reference number of corresponding subproblem, or is free; all free slots are linked into single linked list; slot[1] always contains a pointer to the root node (it is free only if the tree is empty) */ IOSNPD *head; /* pointer to the head of the active list */ IOSNPD *tail; /* pointer to the tail of the active list */ /* the active list is a doubly linked list of active subproblems which correspond to leaves of the tree; all subproblems in the active list are ordered chronologically (each a new subproblem is always added to the tail of the list) */ int a_cnt; /* current number of active nodes (including the current one) */ int n_cnt; /* current number of all (active and inactive) nodes */ int t_cnt; /* total number of nodes including those which have been already removed from the tree; this count is increased by one whenever a new node is created and never decreased */ /*--------------------------------------------------------------*/ /* problem components corresponding to the root subproblem */ int root_m; /* number of rows */ unsigned char *root_type; /* uchar root_type[1+root_m+n]; */ /* types of all variables */ double *root_lb; /* double root_lb[1+root_m+n]; */ /* lower bounds of all variables */ double *root_ub; /* double root_ub[1+root_m+n]; */ /* upper bounds of all variables */ unsigned char *root_stat; /* uchar root_stat[1+root_m+n]; */ /* statuses of all variables */ /*--------------------------------------------------------------*/ /* current subproblem and its LP relaxation */ IOSNPD *curr; /* pointer to the current subproblem (which can be only active); NULL means the current subproblem does not exist */ glp_prob *mip; /* original problem object passed to the solver; if the current subproblem exists, its LP segment corresponds to LP relaxation of the current subproblem; if the current subproblem does not exist, its LP segment corresponds to LP relaxation of the root subproblem (note that the root subproblem may differ from the original MIP, because it may be preprocessed and/or may have additional rows) */ unsigned char *non_int; /* uchar non_int[1+n]; */ /* these column flags are set each time when LP relaxation of the current subproblem has been solved; non_int[0] is not used; non_int[j], 1 <= j <= n, is j-th column flag; if this flag is set, corresponding variable is required to be integer, but its value in basic solution is fractional */ /*--------------------------------------------------------------*/ /* problem components corresponding to the parent (predecessor) subproblem for the current subproblem; used to inspect changes on freezing the current subproblem */ int pred_m; /* number of rows */ int pred_max; /* length of the following four arrays (enlarged automatically), pred_max >= pred_m + n */ unsigned char *pred_type; /* uchar pred_type[1+pred_m+n]; */ /* types of all variables */ double *pred_lb; /* double pred_lb[1+pred_m+n]; */ /* lower bounds of all variables */ double *pred_ub; /* double pred_ub[1+pred_m+n]; */ /* upper bounds of all variables */ unsigned char *pred_stat; /* uchar pred_stat[1+pred_m+n]; */ /* statuses of all variables */ /****************************************************************/ /* built-in cut generators segment */ IOSPOOL *local; /* local cut pool */ #if 1 /* 13/II-2018 */ glp_cov *cov_gen; /* pointer to working area used by the cover cut generator */ #endif glp_mir *mir_gen; /* pointer to working area used by the MIR cut generator */ glp_cfg *clq_gen; /* pointer to conflict graph used by the clique cut generator */ /*--------------------------------------------------------------*/ void *pcost; /* pointer to working area used on pseudocost branching */ int *iwrk; /* int iwrk[1+n]; */ /* working array */ double *dwrk; /* double dwrk[1+n]; */ /* working array */ /*--------------------------------------------------------------*/ /* control parameters and statistics */ const glp_iocp *parm; /* copy of control parameters passed to the solver */ double tm_beg; /* starting time of the search, in seconds; the total time of the search is the difference between xtime() and tm_beg */ double tm_lag; /* the most recent time, in seconds, at which the progress of the the search was displayed */ int sol_cnt; /* number of integer feasible solutions found */ #if 1 /* 11/VII-2013 */ void *P; /* glp_prob *P; */ /* problem passed to glp_intopt */ void *npp; /* NPP *npp; */ /* preprocessor workspace or NULL */ const char *save_sol; /* filename (template) to save every new solution */ int save_cnt; /* count to generate filename */ #endif /*--------------------------------------------------------------*/ /* advanced solver interface */ int reason; /* flag indicating the reason why the callback routine is being called (see glpk.h) */ int stop; /* flag indicating that the callback routine requires premature termination of the search */ int next_p; /* reference number of active subproblem selected to continue the search; 0 means no subproblem has been selected */ int reopt; /* flag indicating that the current LP relaxation needs to be re-optimized */ int reinv; /* flag indicating that some (non-active) rows were removed from the current LP relaxation, so if there no new rows appear, the basis must be re-factorized */ int br_var; /* the number of variable chosen to branch on */ int br_sel; /* flag indicating which branch (subproblem) is suggested to be selected to continue the search: GLP_DN_BRNCH - select down-branch GLP_UP_BRNCH - select up-branch GLP_NO_BRNCH - use general selection technique */ int child; /* subproblem reference number corresponding to br_sel */ }; struct IOSLOT { /* node subproblem slot */ IOSNPD *node; /* pointer to subproblem descriptor; NULL means free slot */ int next; /* index of another free slot (only if this slot is free) */ }; struct IOSNPD { /* node subproblem descriptor */ int p; /* subproblem reference number (it is the index to corresponding slot, i.e. slot[p] points to this descriptor) */ IOSNPD *up; /* pointer to the parent subproblem; NULL means this node is the root of the tree, in which case p = 1 */ int level; /* node level (the root node has level 0) */ int count; /* if count = 0, this subproblem is active; if count > 0, this subproblem is inactive, in which case count is the number of its child subproblems */ /* the following three linked lists are destroyed on reviving and built anew on freezing the subproblem: */ IOSBND *b_ptr; /* linked list of rows and columns of the parent subproblem whose types and bounds were changed */ IOSTAT *s_ptr; /* linked list of rows and columns of the parent subproblem whose statuses were changed */ IOSROW *r_ptr; /* linked list of rows (cuts) added to the parent subproblem */ int solved; /* how many times LP relaxation of this subproblem was solved; for inactive subproblem this count is always non-zero; for active subproblem, which is not current, this count may be non-zero, if the subproblem was temporarily suspended */ double lp_obj; /* optimal objective value to LP relaxation of this subproblem; on creating a subproblem this value is inherited from its parent; for the root subproblem, which has no parent, this value is initially set to -DBL_MAX (minimization) or +DBL_MAX (maximization); each time the subproblem is re-optimized, this value is appropriately changed */ double bound; /* local lower (minimization) or upper (maximization) bound for integer optimal solution to *this* subproblem; this bound is local in the sense that only subproblems in the subtree rooted at this node cannot have better integer feasible solutions; on creating a subproblem its local bound is inherited from its parent and then can be made stronger (never weaker); for the root subproblem its local bound is initially set to -DBL_MAX (minimization) or +DBL_MAX (maximization) and then improved as the root LP relaxation has been solved */ /* the following two quantities are defined only if LP relaxation of this subproblem was solved at least once (solved > 0): */ int ii_cnt; /* number of integer variables whose value in optimal solution to LP relaxation of this subproblem is fractional */ double ii_sum; /* sum of integer infeasibilities */ #if 1 /* 30/XI-2009 */ int changed; /* how many times this subproblem was re-formulated (by adding cutting plane constraints) */ #endif int br_var; /* ordinal number of branching variable, 1 <= br_var <= n, used to split this subproblem; 0 means that either this subproblem is active or branching was made on a constraint */ double br_val; /* (fractional) value of branching variable in optimal solution to final LP relaxation of this subproblem */ void *data; /* char data[tree->cb_size]; */ /* pointer to the application-specific data */ IOSNPD *temp; /* working pointer used by some routines */ IOSNPD *prev; /* pointer to previous subproblem in the active list */ IOSNPD *next; /* pointer to next subproblem in the active list */ }; struct IOSBND { /* bounds change entry */ int k; /* ordinal number of corresponding row (1 <= k <= m) or column (m+1 <= k <= m+n), where m and n are the number of rows and columns, resp., in the parent subproblem */ unsigned char type; /* new type */ double lb; /* new lower bound */ double ub; /* new upper bound */ IOSBND *next; /* pointer to next entry for the same subproblem */ }; struct IOSTAT { /* status change entry */ int k; /* ordinal number of corresponding row (1 <= k <= m) or column (m+1 <= k <= m+n), where m and n are the number of rows and columns, resp., in the parent subproblem */ unsigned char stat; /* new status */ IOSTAT *next; /* pointer to next entry for the same subproblem */ }; struct IOSROW { /* row (constraint) addition entry */ char *name; /* row name or NULL */ unsigned char origin; /* row origin flag (see glp_attr.origin) */ unsigned char klass; /* row class descriptor (see glp_attr.klass) */ unsigned char type; /* row type (GLP_LO, GLP_UP, etc.) */ double lb; /* row lower bound */ double ub; /* row upper bound */ IOSAIJ *ptr; /* pointer to the row coefficient list */ double rii; /* row scale factor */ unsigned char stat; /* row status (GLP_BS, GLP_NL, etc.) */ IOSROW *next; /* pointer to next entry for the same subproblem */ }; struct IOSAIJ { /* constraint coefficient */ int j; /* variable (column) number, 1 <= j <= n */ double val; /* non-zero coefficient value */ IOSAIJ *next; /* pointer to next coefficient for the same row */ }; #ifndef NEW_LOCAL /* 02/II-2018 */ struct IOSPOOL { /* cut pool */ int size; /* pool size = number of cuts in the pool */ IOSCUT *head; /* pointer to the first cut */ IOSCUT *tail; /* pointer to the last cut */ int ord; /* ordinal number of the current cut, 1 <= ord <= size */ IOSCUT *curr; /* pointer to the current cut */ }; #endif #ifndef NEW_LOCAL /* 02/II-2018 */ struct IOSCUT { /* cut (cutting plane constraint) */ char *name; /* cut name or NULL */ unsigned char klass; /* cut class descriptor (see glp_attr.klass) */ IOSAIJ *ptr; /* pointer to the cut coefficient list */ unsigned char type; /* cut type: GLP_LO: sum a[j] * x[j] >= b GLP_UP: sum a[j] * x[j] <= b GLP_FX: sum a[j] * x[j] = b */ double rhs; /* cut right-hand side */ IOSCUT *prev; /* pointer to previous cut */ IOSCUT *next; /* pointer to next cut */ }; #endif #define ios_create_tree _glp_ios_create_tree glp_tree *ios_create_tree(glp_prob *mip, const glp_iocp *parm); /* create branch-and-bound tree */ #define ios_revive_node _glp_ios_revive_node void ios_revive_node(glp_tree *tree, int p); /* revive specified subproblem */ #define ios_freeze_node _glp_ios_freeze_node void ios_freeze_node(glp_tree *tree); /* freeze current subproblem */ #define ios_clone_node _glp_ios_clone_node void ios_clone_node(glp_tree *tree, int p, int nnn, int ref[]); /* clone specified subproblem */ #define ios_delete_node _glp_ios_delete_node void ios_delete_node(glp_tree *tree, int p); /* delete specified subproblem */ #define ios_delete_tree _glp_ios_delete_tree void ios_delete_tree(glp_tree *tree); /* delete branch-and-bound tree */ #define ios_eval_degrad _glp_ios_eval_degrad void ios_eval_degrad(glp_tree *tree, int j, double *dn, double *up); /* estimate obj. degrad. for down- and up-branches */ #define ios_round_bound _glp_ios_round_bound double ios_round_bound(glp_tree *tree, double bound); /* improve local bound by rounding */ #define ios_is_hopeful _glp_ios_is_hopeful int ios_is_hopeful(glp_tree *tree, double bound); /* check if subproblem is hopeful */ #define ios_best_node _glp_ios_best_node int ios_best_node(glp_tree *tree); /* find active node with best local bound */ #define ios_relative_gap _glp_ios_relative_gap double ios_relative_gap(glp_tree *tree); /* compute relative mip gap */ #define ios_solve_node _glp_ios_solve_node int ios_solve_node(glp_tree *tree); /* solve LP relaxation of current subproblem */ #define ios_create_pool _glp_ios_create_pool IOSPOOL *ios_create_pool(glp_tree *tree); /* create cut pool */ #define ios_add_row _glp_ios_add_row int ios_add_row(glp_tree *tree, IOSPOOL *pool, const char *name, int klass, int flags, int len, const int ind[], const double val[], int type, double rhs); /* add row (constraint) to the cut pool */ #define ios_find_row _glp_ios_find_row IOSCUT *ios_find_row(IOSPOOL *pool, int i); /* find row (constraint) in the cut pool */ #define ios_del_row _glp_ios_del_row void ios_del_row(glp_tree *tree, IOSPOOL *pool, int i); /* remove row (constraint) from the cut pool */ #define ios_clear_pool _glp_ios_clear_pool void ios_clear_pool(glp_tree *tree, IOSPOOL *pool); /* remove all rows (constraints) from the cut pool */ #define ios_delete_pool _glp_ios_delete_pool void ios_delete_pool(glp_tree *tree, IOSPOOL *pool); /* delete cut pool */ #if 1 /* 11/VII-2013 */ #define ios_process_sol _glp_ios_process_sol void ios_process_sol(glp_tree *T); /* process integer feasible solution just found */ #endif #define ios_preprocess_node _glp_ios_preprocess_node int ios_preprocess_node(glp_tree *tree, int max_pass); /* preprocess current subproblem */ #define ios_driver _glp_ios_driver int ios_driver(glp_tree *tree); /* branch-and-bound driver */ #define ios_cov_gen _glp_ios_cov_gen void ios_cov_gen(glp_tree *tree); /* generate mixed cover cuts */ #define ios_pcost_init _glp_ios_pcost_init void *ios_pcost_init(glp_tree *tree); /* initialize working data used on pseudocost branching */ #define ios_pcost_branch _glp_ios_pcost_branch int ios_pcost_branch(glp_tree *T, int *next); /* choose branching variable with pseudocost branching */ #define ios_pcost_update _glp_ios_pcost_update void ios_pcost_update(glp_tree *tree); /* update history information for pseudocost branching */ #define ios_pcost_free _glp_ios_pcost_free void ios_pcost_free(glp_tree *tree); /* free working area used on pseudocost branching */ #define ios_feas_pump _glp_ios_feas_pump void ios_feas_pump(glp_tree *T); /* feasibility pump heuristic */ #if 1 /* 25/V-2013 */ #define ios_proxy_heur _glp_ios_proxy_heur void ios_proxy_heur(glp_tree *T); /* proximity search heuristic */ #endif #define ios_process_cuts _glp_ios_process_cuts void ios_process_cuts(glp_tree *T); /* process cuts stored in the local cut pool */ #define ios_choose_node _glp_ios_choose_node int ios_choose_node(glp_tree *T); /* select subproblem to continue the search */ #define ios_choose_var _glp_ios_choose_var int ios_choose_var(glp_tree *T, int *next); /* select variable to branch on */ #endif /* eof */ glpk-5.0/src/draft/lux.c0000644000062000006210000011353013766346220014350 0ustar maomkpasswd/* lux.c (LU-factorization, rational arithmetic) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2003-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "lux.h" #define xfault xerror #define dmp_create_poolx(size) dmp_create_pool() /*********************************************************************** * lux_create - create LU-factorization * * SYNOPSIS * * #include "lux.h" * LUX *lux_create(int n); * * DESCRIPTION * * The routine lux_create creates LU-factorization data structure for * a matrix of the order n. Initially the factorization corresponds to * the unity matrix (F = V = P = Q = I, so A = I). * * RETURNS * * The routine returns a pointer to the created LU-factorization data * structure, which represents the unity matrix of the order n. */ LUX *lux_create(int n) { LUX *lux; int k; if (n < 1) xfault("lux_create: n = %d; invalid parameter\n", n); lux = xmalloc(sizeof(LUX)); lux->n = n; lux->pool = dmp_create_poolx(sizeof(LUXELM)); lux->F_row = xcalloc(1+n, sizeof(LUXELM *)); lux->F_col = xcalloc(1+n, sizeof(LUXELM *)); lux->V_piv = xcalloc(1+n, sizeof(mpq_t)); lux->V_row = xcalloc(1+n, sizeof(LUXELM *)); lux->V_col = xcalloc(1+n, sizeof(LUXELM *)); lux->P_row = xcalloc(1+n, sizeof(int)); lux->P_col = xcalloc(1+n, sizeof(int)); lux->Q_row = xcalloc(1+n, sizeof(int)); lux->Q_col = xcalloc(1+n, sizeof(int)); for (k = 1; k <= n; k++) { lux->F_row[k] = lux->F_col[k] = NULL; mpq_init(lux->V_piv[k]); mpq_set_si(lux->V_piv[k], 1, 1); lux->V_row[k] = lux->V_col[k] = NULL; lux->P_row[k] = lux->P_col[k] = k; lux->Q_row[k] = lux->Q_col[k] = k; } lux->rank = n; return lux; } /*********************************************************************** * initialize - initialize LU-factorization data structures * * This routine initializes data structures for subsequent computing * the LU-factorization of a given matrix A, which is specified by the * formal routine col. On exit V = A and F = P = Q = I, where I is the * unity matrix. */ static void initialize(LUX *lux, int (*col)(void *info, int j, int ind[], mpq_t val[]), void *info, LUXWKA *wka) { int n = lux->n; DMP *pool = lux->pool; LUXELM **F_row = lux->F_row; LUXELM **F_col = lux->F_col; mpq_t *V_piv = lux->V_piv; LUXELM **V_row = lux->V_row; LUXELM **V_col = lux->V_col; int *P_row = lux->P_row; int *P_col = lux->P_col; int *Q_row = lux->Q_row; int *Q_col = lux->Q_col; int *R_len = wka->R_len; int *R_head = wka->R_head; int *R_prev = wka->R_prev; int *R_next = wka->R_next; int *C_len = wka->C_len; int *C_head = wka->C_head; int *C_prev = wka->C_prev; int *C_next = wka->C_next; LUXELM *fij, *vij; int i, j, k, len, *ind; mpq_t *val; /* F := I */ for (i = 1; i <= n; i++) { while (F_row[i] != NULL) { fij = F_row[i], F_row[i] = fij->r_next; mpq_clear(fij->val); dmp_free_atom(pool, fij, sizeof(LUXELM)); } } for (j = 1; j <= n; j++) F_col[j] = NULL; /* V := 0 */ for (k = 1; k <= n; k++) mpq_set_si(V_piv[k], 0, 1); for (i = 1; i <= n; i++) { while (V_row[i] != NULL) { vij = V_row[i], V_row[i] = vij->r_next; mpq_clear(vij->val); dmp_free_atom(pool, vij, sizeof(LUXELM)); } } for (j = 1; j <= n; j++) V_col[j] = NULL; /* V := A */ ind = xcalloc(1+n, sizeof(int)); val = xcalloc(1+n, sizeof(mpq_t)); for (k = 1; k <= n; k++) mpq_init(val[k]); for (j = 1; j <= n; j++) { /* obtain j-th column of matrix A */ len = col(info, j, ind, val); if (!(0 <= len && len <= n)) xfault("lux_decomp: j = %d: len = %d; invalid column length" "\n", j, len); /* copy elements of j-th column to matrix V */ for (k = 1; k <= len; k++) { /* get row index of a[i,j] */ i = ind[k]; if (!(1 <= i && i <= n)) xfault("lux_decomp: j = %d: i = %d; row index out of ran" "ge\n", j, i); /* check for duplicate indices */ if (V_row[i] != NULL && V_row[i]->j == j) xfault("lux_decomp: j = %d: i = %d; duplicate row indice" "s not allowed\n", j, i); /* check for zero value */ if (mpq_sgn(val[k]) == 0) xfault("lux_decomp: j = %d: i = %d; zero elements not al" "lowed\n", j, i); /* add new element v[i,j] = a[i,j] to V */ vij = dmp_get_atom(pool, sizeof(LUXELM)); vij->i = i, vij->j = j; mpq_init(vij->val); mpq_set(vij->val, val[k]); vij->r_prev = NULL; vij->r_next = V_row[i]; vij->c_prev = NULL; vij->c_next = V_col[j]; if (vij->r_next != NULL) vij->r_next->r_prev = vij; if (vij->c_next != NULL) vij->c_next->c_prev = vij; V_row[i] = V_col[j] = vij; } } xfree(ind); for (k = 1; k <= n; k++) mpq_clear(val[k]); xfree(val); /* P := Q := I */ for (k = 1; k <= n; k++) P_row[k] = P_col[k] = Q_row[k] = Q_col[k] = k; /* the rank of A and V is not determined yet */ lux->rank = -1; /* initially the entire matrix V is active */ /* determine its row lengths */ for (i = 1; i <= n; i++) { len = 0; for (vij = V_row[i]; vij != NULL; vij = vij->r_next) len++; R_len[i] = len; } /* build linked lists of active rows */ for (len = 0; len <= n; len++) R_head[len] = 0; for (i = 1; i <= n; i++) { len = R_len[i]; R_prev[i] = 0; R_next[i] = R_head[len]; if (R_next[i] != 0) R_prev[R_next[i]] = i; R_head[len] = i; } /* determine its column lengths */ for (j = 1; j <= n; j++) { len = 0; for (vij = V_col[j]; vij != NULL; vij = vij->c_next) len++; C_len[j] = len; } /* build linked lists of active columns */ for (len = 0; len <= n; len++) C_head[len] = 0; for (j = 1; j <= n; j++) { len = C_len[j]; C_prev[j] = 0; C_next[j] = C_head[len]; if (C_next[j] != 0) C_prev[C_next[j]] = j; C_head[len] = j; } return; } /*********************************************************************** * find_pivot - choose a pivot element * * This routine chooses a pivot element v[p,q] in the active submatrix * of matrix U = P*V*Q. * * It is assumed that on entry the matrix U has the following partially * triangularized form: * * 1 k n * 1 x x x x x x x x x x * . x x x x x x x x x * . . x x x x x x x x * . . . x x x x x x x * k . . . . * * * * * * * . . . . * * * * * * * . . . . * * * * * * * . . . . * * * * * * * . . . . * * * * * * * n . . . . * * * * * * * * where rows and columns k, k+1, ..., n belong to the active submatrix * (elements of the active submatrix are marked by '*'). * * Since the matrix U = P*V*Q is not stored, the routine works with the * matrix V. It is assumed that the row-wise representation corresponds * to the matrix V, but the column-wise representation corresponds to * the active submatrix of the matrix V, i.e. elements of the matrix V, * which does not belong to the active submatrix, are missing from the * column linked lists. It is also assumed that each active row of the * matrix V is in the set R[len], where len is number of non-zeros in * the row, and each active column of the matrix V is in the set C[len], * where len is number of non-zeros in the column (in the latter case * only elements of the active submatrix are counted; such elements are * marked by '*' on the figure above). * * Due to exact arithmetic any non-zero element of the active submatrix * can be chosen as a pivot. However, to keep sparsity of the matrix V * the routine uses Markowitz strategy, trying to choose such element * v[p,q], which has smallest Markowitz cost (nr[p]-1) * (nc[q]-1), * where nr[p] and nc[q] are the number of non-zero elements, resp., in * p-th row and in q-th column of the active submatrix. * * In order to reduce the search, i.e. not to walk through all elements * of the active submatrix, the routine exploits a technique proposed by * I.Duff. This technique is based on using the sets R[len] and C[len] * of active rows and columns. * * On exit the routine returns a pointer to a pivot v[p,q] chosen, or * NULL, if the active submatrix is empty. */ static LUXELM *find_pivot(LUX *lux, LUXWKA *wka) { int n = lux->n; LUXELM **V_row = lux->V_row; LUXELM **V_col = lux->V_col; int *R_len = wka->R_len; int *R_head = wka->R_head; int *R_next = wka->R_next; int *C_len = wka->C_len; int *C_head = wka->C_head; int *C_next = wka->C_next; LUXELM *piv, *some, *vij; int i, j, len, min_len, ncand, piv_lim = 5; double best, cost; /* nothing is chosen so far */ piv = NULL, best = DBL_MAX, ncand = 0; /* if in the active submatrix there is a column that has the only non-zero (column singleton), choose it as a pivot */ j = C_head[1]; if (j != 0) { xassert(C_len[j] == 1); piv = V_col[j]; xassert(piv != NULL && piv->c_next == NULL); goto done; } /* if in the active submatrix there is a row that has the only non-zero (row singleton), choose it as a pivot */ i = R_head[1]; if (i != 0) { xassert(R_len[i] == 1); piv = V_row[i]; xassert(piv != NULL && piv->r_next == NULL); goto done; } /* there are no singletons in the active submatrix; walk through other non-empty rows and columns */ for (len = 2; len <= n; len++) { /* consider active columns having len non-zeros */ for (j = C_head[len]; j != 0; j = C_next[j]) { /* j-th column has len non-zeros */ /* find an element in the row of minimal length */ some = NULL, min_len = INT_MAX; for (vij = V_col[j]; vij != NULL; vij = vij->c_next) { if (min_len > R_len[vij->i]) some = vij, min_len = R_len[vij->i]; /* if Markowitz cost of this element is not greater than (len-1)**2, it can be chosen right now; this heuristic reduces the search and works well in many cases */ if (min_len <= len) { piv = some; goto done; } } /* j-th column has been scanned */ /* the minimal element found is a next pivot candidate */ xassert(some != NULL); ncand++; /* compute its Markowitz cost */ cost = (double)(min_len - 1) * (double)(len - 1); /* choose between the current candidate and this element */ if (cost < best) piv = some, best = cost; /* if piv_lim candidates have been considered, there is a doubt that a much better candidate exists; therefore it is the time to terminate the search */ if (ncand == piv_lim) goto done; } /* now consider active rows having len non-zeros */ for (i = R_head[len]; i != 0; i = R_next[i]) { /* i-th row has len non-zeros */ /* find an element in the column of minimal length */ some = NULL, min_len = INT_MAX; for (vij = V_row[i]; vij != NULL; vij = vij->r_next) { if (min_len > C_len[vij->j]) some = vij, min_len = C_len[vij->j]; /* if Markowitz cost of this element is not greater than (len-1)**2, it can be chosen right now; this heuristic reduces the search and works well in many cases */ if (min_len <= len) { piv = some; goto done; } } /* i-th row has been scanned */ /* the minimal element found is a next pivot candidate */ xassert(some != NULL); ncand++; /* compute its Markowitz cost */ cost = (double)(len - 1) * (double)(min_len - 1); /* choose between the current candidate and this element */ if (cost < best) piv = some, best = cost; /* if piv_lim candidates have been considered, there is a doubt that a much better candidate exists; therefore it is the time to terminate the search */ if (ncand == piv_lim) goto done; } } done: /* bring the pivot v[p,q] to the factorizing routine */ return piv; } /*********************************************************************** * eliminate - perform gaussian elimination * * This routine performs elementary gaussian transformations in order * to eliminate subdiagonal elements in the k-th column of the matrix * U = P*V*Q using the pivot element u[k,k], where k is the number of * the current elimination step. * * The parameter piv specifies the pivot element v[p,q] = u[k,k]. * * Each time when the routine applies the elementary transformation to * a non-pivot row of the matrix V, it stores the corresponding element * to the matrix F in order to keep the main equality A = F*V. * * The routine assumes that on entry the matrices L = P*F*inv(P) and * U = P*V*Q are the following: * * 1 k 1 k n * 1 1 . . . . . . . . . 1 x x x x x x x x x x * x 1 . . . . . . . . . x x x x x x x x x * x x 1 . . . . . . . . . x x x x x x x x * x x x 1 . . . . . . . . . x x x x x x x * k x x x x 1 . . . . . k . . . . * * * * * * * x x x x _ 1 . . . . . . . . # * * * * * * x x x x _ . 1 . . . . . . . # * * * * * * x x x x _ . . 1 . . . . . . # * * * * * * x x x x _ . . . 1 . . . . . # * * * * * * n x x x x _ . . . . 1 n . . . . # * * * * * * * matrix L matrix U * * where rows and columns of the matrix U with numbers k, k+1, ..., n * form the active submatrix (eliminated elements are marked by '#' and * other elements of the active submatrix are marked by '*'). Note that * each eliminated non-zero element u[i,k] of the matrix U gives the * corresponding element l[i,k] of the matrix L (marked by '_'). * * Actually all operations are performed on the matrix V. Should note * that the row-wise representation corresponds to the matrix V, but the * column-wise representation corresponds to the active submatrix of the * matrix V, i.e. elements of the matrix V, which doesn't belong to the * active submatrix, are missing from the column linked lists. * * Let u[k,k] = v[p,q] be the pivot. In order to eliminate subdiagonal * elements u[i',k] = v[i,q], i' = k+1, k+2, ..., n, the routine applies * the following elementary gaussian transformations: * * (i-th row of V) := (i-th row of V) - f[i,p] * (p-th row of V), * * where f[i,p] = v[i,q] / v[p,q] is a gaussian multiplier. * * Additionally, in order to keep the main equality A = F*V, each time * when the routine applies the transformation to i-th row of the matrix * V, it also adds f[i,p] as a new element to the matrix F. * * IMPORTANT: On entry the working arrays flag and work should contain * zeros. This status is provided by the routine on exit. */ static void eliminate(LUX *lux, LUXWKA *wka, LUXELM *piv, int flag[], mpq_t work[]) { DMP *pool = lux->pool; LUXELM **F_row = lux->F_row; LUXELM **F_col = lux->F_col; mpq_t *V_piv = lux->V_piv; LUXELM **V_row = lux->V_row; LUXELM **V_col = lux->V_col; int *R_len = wka->R_len; int *R_head = wka->R_head; int *R_prev = wka->R_prev; int *R_next = wka->R_next; int *C_len = wka->C_len; int *C_head = wka->C_head; int *C_prev = wka->C_prev; int *C_next = wka->C_next; LUXELM *fip, *vij, *vpj, *viq, *next; mpq_t temp; int i, j, p, q; mpq_init(temp); /* determine row and column indices of the pivot v[p,q] */ xassert(piv != NULL); p = piv->i, q = piv->j; /* remove p-th (pivot) row from the active set; it will never return there */ if (R_prev[p] == 0) R_head[R_len[p]] = R_next[p]; else R_next[R_prev[p]] = R_next[p]; if (R_next[p] == 0) ; else R_prev[R_next[p]] = R_prev[p]; /* remove q-th (pivot) column from the active set; it will never return there */ if (C_prev[q] == 0) C_head[C_len[q]] = C_next[q]; else C_next[C_prev[q]] = C_next[q]; if (C_next[q] == 0) ; else C_prev[C_next[q]] = C_prev[q]; /* store the pivot value in a separate array */ mpq_set(V_piv[p], piv->val); /* remove the pivot from p-th row */ if (piv->r_prev == NULL) V_row[p] = piv->r_next; else piv->r_prev->r_next = piv->r_next; if (piv->r_next == NULL) ; else piv->r_next->r_prev = piv->r_prev; R_len[p]--; /* remove the pivot from q-th column */ if (piv->c_prev == NULL) V_col[q] = piv->c_next; else piv->c_prev->c_next = piv->c_next; if (piv->c_next == NULL) ; else piv->c_next->c_prev = piv->c_prev; C_len[q]--; /* free the space occupied by the pivot */ mpq_clear(piv->val); dmp_free_atom(pool, piv, sizeof(LUXELM)); /* walk through p-th (pivot) row, which already does not contain the pivot v[p,q], and do the following... */ for (vpj = V_row[p]; vpj != NULL; vpj = vpj->r_next) { /* get column index of v[p,j] */ j = vpj->j; /* store v[p,j] in the working array */ flag[j] = 1; mpq_set(work[j], vpj->val); /* remove j-th column from the active set; it will return there later with a new length */ if (C_prev[j] == 0) C_head[C_len[j]] = C_next[j]; else C_next[C_prev[j]] = C_next[j]; if (C_next[j] == 0) ; else C_prev[C_next[j]] = C_prev[j]; /* v[p,j] leaves the active submatrix, so remove it from j-th column; however, v[p,j] is kept in p-th row */ if (vpj->c_prev == NULL) V_col[j] = vpj->c_next; else vpj->c_prev->c_next = vpj->c_next; if (vpj->c_next == NULL) ; else vpj->c_next->c_prev = vpj->c_prev; C_len[j]--; } /* now walk through q-th (pivot) column, which already does not contain the pivot v[p,q], and perform gaussian elimination */ while (V_col[q] != NULL) { /* element v[i,q] has to be eliminated */ viq = V_col[q]; /* get row index of v[i,q] */ i = viq->i; /* remove i-th row from the active set; later it will return there with a new length */ if (R_prev[i] == 0) R_head[R_len[i]] = R_next[i]; else R_next[R_prev[i]] = R_next[i]; if (R_next[i] == 0) ; else R_prev[R_next[i]] = R_prev[i]; /* compute gaussian multiplier f[i,p] = v[i,q] / v[p,q] and store it in the matrix F */ fip = dmp_get_atom(pool, sizeof(LUXELM)); fip->i = i, fip->j = p; mpq_init(fip->val); mpq_div(fip->val, viq->val, V_piv[p]); fip->r_prev = NULL; fip->r_next = F_row[i]; fip->c_prev = NULL; fip->c_next = F_col[p]; if (fip->r_next != NULL) fip->r_next->r_prev = fip; if (fip->c_next != NULL) fip->c_next->c_prev = fip; F_row[i] = F_col[p] = fip; /* v[i,q] has to be eliminated, so remove it from i-th row */ if (viq->r_prev == NULL) V_row[i] = viq->r_next; else viq->r_prev->r_next = viq->r_next; if (viq->r_next == NULL) ; else viq->r_next->r_prev = viq->r_prev; R_len[i]--; /* and also from q-th column */ V_col[q] = viq->c_next; C_len[q]--; /* free the space occupied by v[i,q] */ mpq_clear(viq->val); dmp_free_atom(pool, viq, sizeof(LUXELM)); /* perform gaussian transformation: (i-th row) := (i-th row) - f[i,p] * (p-th row) note that now p-th row, which is in the working array, does not contain the pivot v[p,q], and i-th row does not contain the element v[i,q] to be eliminated */ /* walk through i-th row and transform existing non-zero elements */ for (vij = V_row[i]; vij != NULL; vij = next) { next = vij->r_next; /* get column index of v[i,j] */ j = vij->j; /* v[i,j] := v[i,j] - f[i,p] * v[p,j] */ if (flag[j]) { /* v[p,j] != 0 */ flag[j] = 0; mpq_mul(temp, fip->val, work[j]); mpq_sub(vij->val, vij->val, temp); if (mpq_sgn(vij->val) == 0) { /* new v[i,j] is zero, so remove it from the active submatrix */ /* remove v[i,j] from i-th row */ if (vij->r_prev == NULL) V_row[i] = vij->r_next; else vij->r_prev->r_next = vij->r_next; if (vij->r_next == NULL) ; else vij->r_next->r_prev = vij->r_prev; R_len[i]--; /* remove v[i,j] from j-th column */ if (vij->c_prev == NULL) V_col[j] = vij->c_next; else vij->c_prev->c_next = vij->c_next; if (vij->c_next == NULL) ; else vij->c_next->c_prev = vij->c_prev; C_len[j]--; /* free the space occupied by v[i,j] */ mpq_clear(vij->val); dmp_free_atom(pool, vij, sizeof(LUXELM)); } } } /* now flag is the pattern of the set v[p,*] \ v[i,*] */ /* walk through p-th (pivot) row and create new elements in i-th row, which appear due to fill-in */ for (vpj = V_row[p]; vpj != NULL; vpj = vpj->r_next) { j = vpj->j; if (flag[j]) { /* create new non-zero v[i,j] = 0 - f[i,p] * v[p,j] and add it to i-th row and j-th column */ vij = dmp_get_atom(pool, sizeof(LUXELM)); vij->i = i, vij->j = j; mpq_init(vij->val); mpq_mul(vij->val, fip->val, work[j]); mpq_neg(vij->val, vij->val); vij->r_prev = NULL; vij->r_next = V_row[i]; vij->c_prev = NULL; vij->c_next = V_col[j]; if (vij->r_next != NULL) vij->r_next->r_prev = vij; if (vij->c_next != NULL) vij->c_next->c_prev = vij; V_row[i] = V_col[j] = vij; R_len[i]++, C_len[j]++; } else { /* there is no fill-in, because v[i,j] already exists in i-th row; restore the flag, which was reset before */ flag[j] = 1; } } /* now i-th row has been completely transformed and can return to the active set with a new length */ R_prev[i] = 0; R_next[i] = R_head[R_len[i]]; if (R_next[i] != 0) R_prev[R_next[i]] = i; R_head[R_len[i]] = i; } /* at this point q-th (pivot) column must be empty */ xassert(C_len[q] == 0); /* walk through p-th (pivot) row again and do the following... */ for (vpj = V_row[p]; vpj != NULL; vpj = vpj->r_next) { /* get column index of v[p,j] */ j = vpj->j; /* erase v[p,j] from the working array */ flag[j] = 0; mpq_set_si(work[j], 0, 1); /* now j-th column has been completely transformed, so it can return to the active list with a new length */ C_prev[j] = 0; C_next[j] = C_head[C_len[j]]; if (C_next[j] != 0) C_prev[C_next[j]] = j; C_head[C_len[j]] = j; } mpq_clear(temp); /* return to the factorizing routine */ return; } /*********************************************************************** * lux_decomp - compute LU-factorization * * SYNOPSIS * * #include "lux.h" * int lux_decomp(LUX *lux, int (*col)(void *info, int j, int ind[], * mpq_t val[]), void *info); * * DESCRIPTION * * The routine lux_decomp computes LU-factorization of a given square * matrix A. * * The parameter lux specifies LU-factorization data structure built by * means of the routine lux_create. * * The formal routine col specifies the original matrix A. In order to * obtain j-th column of the matrix A the routine lux_decomp calls the * routine col with the parameter j (1 <= j <= n, where n is the order * of A). In response the routine col should store row indices and * numerical values of non-zero elements of j-th column of A to the * locations ind[1], ..., ind[len] and val[1], ..., val[len], resp., * where len is the number of non-zeros in j-th column, which should be * returned on exit. Neiter zero nor duplicate elements are allowed. * * The parameter info is a transit pointer passed to the formal routine * col; it can be used for various purposes. * * RETURNS * * The routine lux_decomp returns the singularity flag. Zero flag means * that the original matrix A is non-singular while non-zero flag means * that A is (exactly!) singular. * * Note that LU-factorization is valid in both cases, however, in case * of singularity some rows of the matrix V (including pivot elements) * will be empty. * * REPAIRING SINGULAR MATRIX * * If the routine lux_decomp returns non-zero flag, it provides all * necessary information that can be used for "repairing" the matrix A, * where "repairing" means replacing linearly dependent columns of the * matrix A by appropriate columns of the unity matrix. This feature is * needed when the routine lux_decomp is used for reinverting the basis * matrix within the simplex method procedure. * * On exit linearly dependent columns of the matrix U have the numbers * rank+1, rank+2, ..., n, where rank is the exact rank of the matrix A * stored by the routine to the member lux->rank. The correspondence * between columns of A and U is the same as between columns of V and U. * Thus, linearly dependent columns of the matrix A have the numbers * Q_col[rank+1], Q_col[rank+2], ..., Q_col[n], where Q_col is an array * representing the permutation matrix Q in column-like format. It is * understood that each j-th linearly dependent column of the matrix U * should be replaced by the unity vector, where all elements are zero * except the unity diagonal element u[j,j]. On the other hand j-th row * of the matrix U corresponds to the row of the matrix V (and therefore * of the matrix A) with the number P_row[j], where P_row is an array * representing the permutation matrix P in row-like format. Thus, each * j-th linearly dependent column of the matrix U should be replaced by * a column of the unity matrix with the number P_row[j]. * * The code that repairs the matrix A may look like follows: * * for (j = rank+1; j <= n; j++) * { replace column Q_col[j] of the matrix A by column P_row[j] of * the unity matrix; * } * * where rank, P_row, and Q_col are members of the structure LUX. */ int lux_decomp(LUX *lux, int (*col)(void *info, int j, int ind[], mpq_t val[]), void *info) { int n = lux->n; LUXELM **V_row = lux->V_row; LUXELM **V_col = lux->V_col; int *P_row = lux->P_row; int *P_col = lux->P_col; int *Q_row = lux->Q_row; int *Q_col = lux->Q_col; LUXELM *piv, *vij; LUXWKA *wka; int i, j, k, p, q, t, *flag; mpq_t *work; /* allocate working area */ wka = xmalloc(sizeof(LUXWKA)); wka->R_len = xcalloc(1+n, sizeof(int)); wka->R_head = xcalloc(1+n, sizeof(int)); wka->R_prev = xcalloc(1+n, sizeof(int)); wka->R_next = xcalloc(1+n, sizeof(int)); wka->C_len = xcalloc(1+n, sizeof(int)); wka->C_head = xcalloc(1+n, sizeof(int)); wka->C_prev = xcalloc(1+n, sizeof(int)); wka->C_next = xcalloc(1+n, sizeof(int)); /* initialize LU-factorization data structures */ initialize(lux, col, info, wka); /* allocate working arrays */ flag = xcalloc(1+n, sizeof(int)); work = xcalloc(1+n, sizeof(mpq_t)); for (k = 1; k <= n; k++) { flag[k] = 0; mpq_init(work[k]); } /* main elimination loop */ for (k = 1; k <= n; k++) { /* choose a pivot element v[p,q] */ piv = find_pivot(lux, wka); if (piv == NULL) { /* no pivot can be chosen, because the active submatrix is empty */ break; } /* determine row and column indices of the pivot element */ p = piv->i, q = piv->j; /* let v[p,q] correspond to u[i',j']; permute k-th and i'-th rows and k-th and j'-th columns of the matrix U = P*V*Q to move the element u[i',j'] to the position u[k,k] */ i = P_col[p], j = Q_row[q]; xassert(k <= i && i <= n && k <= j && j <= n); /* permute k-th and i-th rows of the matrix U */ t = P_row[k]; P_row[i] = t, P_col[t] = i; P_row[k] = p, P_col[p] = k; /* permute k-th and j-th columns of the matrix U */ t = Q_col[k]; Q_col[j] = t, Q_row[t] = j; Q_col[k] = q, Q_row[q] = k; /* eliminate subdiagonal elements of k-th column of the matrix U = P*V*Q using the pivot element u[k,k] = v[p,q] */ eliminate(lux, wka, piv, flag, work); } /* determine the rank of A (and V) */ lux->rank = k - 1; /* free working arrays */ xfree(flag); for (k = 1; k <= n; k++) mpq_clear(work[k]); xfree(work); /* build column lists of the matrix V using its row lists */ for (j = 1; j <= n; j++) xassert(V_col[j] == NULL); for (i = 1; i <= n; i++) { for (vij = V_row[i]; vij != NULL; vij = vij->r_next) { j = vij->j; vij->c_prev = NULL; vij->c_next = V_col[j]; if (vij->c_next != NULL) vij->c_next->c_prev = vij; V_col[j] = vij; } } /* free working area */ xfree(wka->R_len); xfree(wka->R_head); xfree(wka->R_prev); xfree(wka->R_next); xfree(wka->C_len); xfree(wka->C_head); xfree(wka->C_prev); xfree(wka->C_next); xfree(wka); /* return to the calling program */ return (lux->rank < n); } /*********************************************************************** * lux_f_solve - solve system F*x = b or F'*x = b * * SYNOPSIS * * #include "lux.h" * void lux_f_solve(LUX *lux, int tr, mpq_t x[]); * * DESCRIPTION * * The routine lux_f_solve solves either the system F*x = b (if the * flag tr is zero) or the system F'*x = b (if the flag tr is non-zero), * where the matrix F is a component of LU-factorization specified by * the parameter lux, F' is a matrix transposed to F. * * On entry the array x should contain elements of the right-hand side * vector b in locations x[1], ..., x[n], where n is the order of the * matrix F. On exit this array will contain elements of the solution * vector x in the same locations. */ void lux_f_solve(LUX *lux, int tr, mpq_t x[]) { int n = lux->n; LUXELM **F_row = lux->F_row; LUXELM **F_col = lux->F_col; int *P_row = lux->P_row; LUXELM *fik, *fkj; int i, j, k; mpq_t temp; mpq_init(temp); if (!tr) { /* solve the system F*x = b */ for (j = 1; j <= n; j++) { k = P_row[j]; if (mpq_sgn(x[k]) != 0) { for (fik = F_col[k]; fik != NULL; fik = fik->c_next) { mpq_mul(temp, fik->val, x[k]); mpq_sub(x[fik->i], x[fik->i], temp); } } } } else { /* solve the system F'*x = b */ for (i = n; i >= 1; i--) { k = P_row[i]; if (mpq_sgn(x[k]) != 0) { for (fkj = F_row[k]; fkj != NULL; fkj = fkj->r_next) { mpq_mul(temp, fkj->val, x[k]); mpq_sub(x[fkj->j], x[fkj->j], temp); } } } } mpq_clear(temp); return; } /*********************************************************************** * lux_v_solve - solve system V*x = b or V'*x = b * * SYNOPSIS * * #include "lux.h" * void lux_v_solve(LUX *lux, int tr, double x[]); * * DESCRIPTION * * The routine lux_v_solve solves either the system V*x = b (if the * flag tr is zero) or the system V'*x = b (if the flag tr is non-zero), * where the matrix V is a component of LU-factorization specified by * the parameter lux, V' is a matrix transposed to V. * * On entry the array x should contain elements of the right-hand side * vector b in locations x[1], ..., x[n], where n is the order of the * matrix V. On exit this array will contain elements of the solution * vector x in the same locations. */ void lux_v_solve(LUX *lux, int tr, mpq_t x[]) { int n = lux->n; mpq_t *V_piv = lux->V_piv; LUXELM **V_row = lux->V_row; LUXELM **V_col = lux->V_col; int *P_row = lux->P_row; int *Q_col = lux->Q_col; LUXELM *vij; int i, j, k; mpq_t *b, temp; b = xcalloc(1+n, sizeof(mpq_t)); for (k = 1; k <= n; k++) mpq_init(b[k]), mpq_set(b[k], x[k]), mpq_set_si(x[k], 0, 1); mpq_init(temp); if (!tr) { /* solve the system V*x = b */ for (k = n; k >= 1; k--) { i = P_row[k], j = Q_col[k]; if (mpq_sgn(b[i]) != 0) { mpq_set(x[j], b[i]); mpq_div(x[j], x[j], V_piv[i]); for (vij = V_col[j]; vij != NULL; vij = vij->c_next) { mpq_mul(temp, vij->val, x[j]); mpq_sub(b[vij->i], b[vij->i], temp); } } } } else { /* solve the system V'*x = b */ for (k = 1; k <= n; k++) { i = P_row[k], j = Q_col[k]; if (mpq_sgn(b[j]) != 0) { mpq_set(x[i], b[j]); mpq_div(x[i], x[i], V_piv[i]); for (vij = V_row[i]; vij != NULL; vij = vij->r_next) { mpq_mul(temp, vij->val, x[i]); mpq_sub(b[vij->j], b[vij->j], temp); } } } } for (k = 1; k <= n; k++) mpq_clear(b[k]); mpq_clear(temp); xfree(b); return; } /*********************************************************************** * lux_solve - solve system A*x = b or A'*x = b * * SYNOPSIS * * #include "lux.h" * void lux_solve(LUX *lux, int tr, mpq_t x[]); * * DESCRIPTION * * The routine lux_solve solves either the system A*x = b (if the flag * tr is zero) or the system A'*x = b (if the flag tr is non-zero), * where the parameter lux specifies LU-factorization of the matrix A, * A' is a matrix transposed to A. * * On entry the array x should contain elements of the right-hand side * vector b in locations x[1], ..., x[n], where n is the order of the * matrix A. On exit this array will contain elements of the solution * vector x in the same locations. */ void lux_solve(LUX *lux, int tr, mpq_t x[]) { if (lux->rank < lux->n) xfault("lux_solve: LU-factorization has incomplete rank\n"); if (!tr) { /* A = F*V, therefore inv(A) = inv(V)*inv(F) */ lux_f_solve(lux, 0, x); lux_v_solve(lux, 0, x); } else { /* A' = V'*F', therefore inv(A') = inv(F')*inv(V') */ lux_v_solve(lux, 1, x); lux_f_solve(lux, 1, x); } return; } /*********************************************************************** * lux_delete - delete LU-factorization * * SYNOPSIS * * #include "lux.h" * void lux_delete(LUX *lux); * * DESCRIPTION * * The routine lux_delete deletes LU-factorization data structure, * which the parameter lux points to, freeing all the memory allocated * to this object. */ void lux_delete(LUX *lux) { int n = lux->n; LUXELM *fij, *vij; int i; for (i = 1; i <= n; i++) { for (fij = lux->F_row[i]; fij != NULL; fij = fij->r_next) mpq_clear(fij->val); mpq_clear(lux->V_piv[i]); for (vij = lux->V_row[i]; vij != NULL; vij = vij->r_next) mpq_clear(vij->val); } dmp_delete_pool(lux->pool); xfree(lux->F_row); xfree(lux->F_col); xfree(lux->V_piv); xfree(lux->V_row); xfree(lux->V_col); xfree(lux->P_row); xfree(lux->P_col); xfree(lux->Q_row); xfree(lux->Q_col); xfree(lux); return; } /* eof */ glpk-5.0/src/draft/lux.h0000644000062000006210000002066213766346220014360 0ustar maomkpasswd/* lux.h (LU-factorization, rational arithmetic) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2003-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef LUX_H #define LUX_H #include "dmp.h" #include "mygmp.h" /*********************************************************************** * The structure LUX defines LU-factorization of a square matrix A, * which is the following quartet: * * [A] = (F, V, P, Q), (1) * * where F and V are such matrices that * * A = F * V, (2) * * and P and Q are such permutation matrices that the matrix * * L = P * F * inv(P) (3) * * is lower triangular with unity diagonal, and the matrix * * U = P * V * Q (4) * * is upper triangular. All the matrices have the order n. * * The matrices F and V are stored in row/column-wise sparse format as * row and column linked lists of non-zero elements. Unity elements on * the main diagonal of the matrix F are not stored. Pivot elements of * the matrix V (that correspond to diagonal elements of the matrix U) * are also missing from the row and column lists and stored separately * in an ordinary array. * * The permutation matrices P and Q are stored as ordinary arrays using * both row- and column-like formats. * * The matrices L and U being completely defined by the matrices F, V, * P, and Q are not stored explicitly. * * It is easy to show that the factorization (1)-(3) is some version of * LU-factorization. Indeed, from (3) and (4) it follows that: * * F = inv(P) * L * P, * * V = inv(P) * U * inv(Q), * * and substitution into (2) gives: * * A = F * V = inv(P) * L * U * inv(Q). * * For more details see the program documentation. */ typedef struct LUX LUX; typedef struct LUXELM LUXELM; typedef struct LUXWKA LUXWKA; struct LUX { /* LU-factorization of a square matrix */ int n; /* the order of matrices A, F, V, P, Q */ DMP *pool; /* memory pool for elements of matrices F and V */ LUXELM **F_row; /* LUXELM *F_row[1+n]; */ /* F_row[0] is not used; F_row[i], 1 <= i <= n, is a pointer to the list of elements in i-th row of matrix F (diagonal elements are not stored) */ LUXELM **F_col; /* LUXELM *F_col[1+n]; */ /* F_col[0] is not used; F_col[j], 1 <= j <= n, is a pointer to the list of elements in j-th column of matrix F (diagonal elements are not stored) */ mpq_t *V_piv; /* mpq_t V_piv[1+n]; */ /* V_piv[0] is not used; V_piv[p], 1 <= p <= n, is a pivot element v[p,q] corresponding to a diagonal element u[k,k] of matrix U = P*V*Q (used on k-th elimination step, k = 1, 2, ..., n) */ LUXELM **V_row; /* LUXELM *V_row[1+n]; */ /* V_row[0] is not used; V_row[i], 1 <= i <= n, is a pointer to the list of elements in i-th row of matrix V (except pivot elements) */ LUXELM **V_col; /* LUXELM *V_col[1+n]; */ /* V_col[0] is not used; V_col[j], 1 <= j <= n, is a pointer to the list of elements in j-th column of matrix V (except pivot elements) */ int *P_row; /* int P_row[1+n]; */ /* P_row[0] is not used; P_row[i] = j means that p[i,j] = 1, where p[i,j] is an element of permutation matrix P */ int *P_col; /* int P_col[1+n]; */ /* P_col[0] is not used; P_col[j] = i means that p[i,j] = 1, where p[i,j] is an element of permutation matrix P */ /* if i-th row or column of matrix F is i'-th row or column of matrix L = P*F*inv(P), or if i-th row of matrix V is i'-th row of matrix U = P*V*Q, then P_row[i'] = i and P_col[i] = i' */ int *Q_row; /* int Q_row[1+n]; */ /* Q_row[0] is not used; Q_row[i] = j means that q[i,j] = 1, where q[i,j] is an element of permutation matrix Q */ int *Q_col; /* int Q_col[1+n]; */ /* Q_col[0] is not used; Q_col[j] = i means that q[i,j] = 1, where q[i,j] is an element of permutation matrix Q */ /* if j-th column of matrix V is j'-th column of matrix U = P*V*Q, then Q_row[j] = j' and Q_col[j'] = j */ int rank; /* the (exact) rank of matrices A and V */ }; struct LUXELM { /* element of matrix F or V */ int i; /* row index, 1 <= i <= m */ int j; /* column index, 1 <= j <= n */ mpq_t val; /* numeric (non-zero) element value */ LUXELM *r_prev; /* pointer to previous element in the same row */ LUXELM *r_next; /* pointer to next element in the same row */ LUXELM *c_prev; /* pointer to previous element in the same column */ LUXELM *c_next; /* pointer to next element in the same column */ }; struct LUXWKA { /* working area (used only during factorization) */ /* in order to efficiently implement Markowitz strategy and Duff search technique there are two families {R[0], R[1], ..., R[n]} and {C[0], C[1], ..., C[n]}; member R[k] is a set of active rows of matrix V having k non-zeros, and member C[k] is a set of active columns of matrix V having k non-zeros (in the active submatrix); each set R[k] and C[k] is implemented as a separate doubly linked list */ int *R_len; /* int R_len[1+n]; */ /* R_len[0] is not used; R_len[i], 1 <= i <= n, is the number of non-zero elements in i-th row of matrix V (that is the length of i-th row) */ int *R_head; /* int R_head[1+n]; */ /* R_head[k], 0 <= k <= n, is the number of a first row, which is active and whose length is k */ int *R_prev; /* int R_prev[1+n]; */ /* R_prev[0] is not used; R_prev[i], 1 <= i <= n, is the number of a previous row, which is active and has the same length as i-th row */ int *R_next; /* int R_next[1+n]; */ /* R_prev[0] is not used; R_prev[i], 1 <= i <= n, is the number of a next row, which is active and has the same length as i-th row */ int *C_len; /* int C_len[1+n]; */ /* C_len[0] is not used; C_len[j], 1 <= j <= n, is the number of non-zero elements in j-th column of the active submatrix of matrix V (that is the length of j-th column in the active submatrix) */ int *C_head; /* int C_head[1+n]; */ /* C_head[k], 0 <= k <= n, is the number of a first column, which is active and whose length is k */ int *C_prev; /* int C_prev[1+n]; */ /* C_prev[0] is not used; C_prev[j], 1 <= j <= n, is the number of a previous column, which is active and has the same length as j-th column */ int *C_next; /* int C_next[1+n]; */ /* C_next[0] is not used; C_next[j], 1 <= j <= n, is the number of a next column, which is active and has the same length as j-th column */ }; #define lux_create _glp_lux_create LUX *lux_create(int n); /* create LU-factorization */ #define lux_decomp _glp_lux_decomp int lux_decomp(LUX *lux, int (*col)(void *info, int j, int ind[], mpq_t val[]), void *info); /* compute LU-factorization */ #define lux_f_solve _glp_lux_f_solve void lux_f_solve(LUX *lux, int tr, mpq_t x[]); /* solve system F*x = b or F'*x = b */ #define lux_v_solve _glp_lux_v_solve void lux_v_solve(LUX *lux, int tr, mpq_t x[]); /* solve system V*x = b or V'*x = b */ #define lux_solve _glp_lux_solve void lux_solve(LUX *lux, int tr, mpq_t x[]); /* solve system A*x = b or A'*x = b */ #define lux_delete _glp_lux_delete void lux_delete(LUX *lux); /* delete LU-factorization */ #endif /* eof */ glpk-5.0/src/env/0000755000062000006210000000000013766346220013061 5ustar maomkpasswdglpk-5.0/src/env/alloc.c0000644000062000006210000002042713766346220014324 0ustar maomkpasswd/* alloc.c (dynamic memory allocation) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2000-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #define ALIGN 16 /* some processors need data to be properly aligned, so this macro * defines the alignment boundary, in bytes, provided by glpk memory * allocation routines; looks like 16-byte alignment boundary is * sufficient for all 32- and 64-bit platforms (8-byte boundary is not * sufficient for some 64-bit platforms because of jmp_buf) */ #define MBD_SIZE (((sizeof(MBD) + (ALIGN - 1)) / ALIGN) * ALIGN) /* size of memory block descriptor, in bytes, rounded up to multiple * of the alignment boundary */ /*********************************************************************** * dma - dynamic memory allocation (basic routine) * * This routine performs dynamic memory allocation. It is similar to * the standard realloc function, however, it provides every allocated * memory block with a descriptor, which is used for sanity checks on * reallocating/freeing previously allocated memory blocks as well as * for book-keeping the memory usage statistics. */ static void *dma(const char *func, void *ptr, size_t size) { ENV *env = get_env_ptr(); MBD *mbd; if (ptr == NULL) { /* new memory block will be allocated */ mbd = NULL; } else { /* allocated memory block will be reallocated or freed */ /* get pointer to the block descriptor */ mbd = (MBD *)((char *)ptr - MBD_SIZE); /* make sure that the block descriptor is valid */ if (mbd->self != mbd) xerror("%s: ptr = %p; invalid pointer\n", func, ptr); /* remove the block from the linked list */ mbd->self = NULL; if (mbd->prev == NULL) env->mem_ptr = mbd->next; else mbd->prev->next = mbd->next; if (mbd->next == NULL) ; else mbd->next->prev = mbd->prev; /* decrease usage counts */ if (!(env->mem_count >= 1 && env->mem_total >= mbd->size)) xerror("%s: memory allocation error\n", func); env->mem_count--; env->mem_total -= mbd->size; if (size == 0) { /* free the memory block */ free(mbd); return NULL; } } /* allocate/reallocate memory block */ if (size > SIZE_T_MAX - MBD_SIZE) xerror("%s: block too large\n", func); size += MBD_SIZE; if (size > env->mem_limit - env->mem_total) xerror("%s: memory allocation limit exceeded\n", func); if (env->mem_count == INT_MAX) xerror("%s: too many memory blocks allocated\n", func); mbd = (mbd == NULL ? malloc(size) : realloc(mbd, size)); if (mbd == NULL) xerror("%s: no memory available\n", func); /* setup the block descriptor */ mbd->size = size; mbd->self = mbd; mbd->prev = NULL; mbd->next = env->mem_ptr; /* add the block to the beginning of the linked list */ if (mbd->next != NULL) mbd->next->prev = mbd; env->mem_ptr = mbd; /* increase usage counts */ env->mem_count++; if (env->mem_cpeak < env->mem_count) env->mem_cpeak = env->mem_count; env->mem_total += size; if (env->mem_tpeak < env->mem_total) env->mem_tpeak = env->mem_total; return (char *)mbd + MBD_SIZE; } /*********************************************************************** * NAME * * glp_alloc - allocate memory block * * SYNOPSIS * * void *glp_alloc(int n, int size); * * DESCRIPTION * * The routine glp_alloc allocates a memory block of n * size bytes * long. * * Note that being allocated the memory block contains arbitrary data * (not binary zeros!). * * RETURNS * * The routine glp_alloc returns a pointer to the block allocated. * To free this block the routine glp_free (not free!) must be used. */ void *glp_alloc(int n, int size) { if (n < 1) xerror("glp_alloc: n = %d; invalid parameter\n", n); if (size < 1) xerror("glp_alloc: size = %d; invalid parameter\n", size); if ((size_t)n > SIZE_T_MAX / (size_t)size) xerror("glp_alloc: n = %d, size = %d; block too large\n", n, size); return dma("glp_alloc", NULL, (size_t)n * (size_t)size); } /**********************************************************************/ void *glp_realloc(void *ptr, int n, int size) { /* reallocate memory block */ if (ptr == NULL) xerror("glp_realloc: ptr = %p; invalid pointer\n", ptr); if (n < 1) xerror("glp_realloc: n = %d; invalid parameter\n", n); if (size < 1) xerror("glp_realloc: size = %d; invalid parameter\n", size); if ((size_t)n > SIZE_T_MAX / (size_t)size) xerror("glp_realloc: n = %d, size = %d; block too large\n", n, size); return dma("glp_realloc", ptr, (size_t)n * (size_t)size); } /*********************************************************************** * NAME * * glp_free - free (deallocate) memory block * * SYNOPSIS * * void glp_free(void *ptr); * * DESCRIPTION * * The routine glp_free frees (deallocates) a memory block pointed to * by ptr, which was previuosly allocated by the routine glp_alloc or * reallocated by the routine glp_realloc. */ void glp_free(void *ptr) { if (ptr == NULL) xerror("glp_free: ptr = %p; invalid pointer\n", ptr); dma("glp_free", ptr, 0); return; } /*********************************************************************** * NAME * * glp_mem_limit - set memory usage limit * * SYNOPSIS * * void glp_mem_limit(int limit); * * DESCRIPTION * * The routine glp_mem_limit limits the amount of memory available for * dynamic allocation (in GLPK routines) to limit megabytes. */ void glp_mem_limit(int limit) { ENV *env = get_env_ptr(); if (limit < 1) xerror("glp_mem_limit: limit = %d; invalid parameter\n", limit); if ((size_t)limit <= (SIZE_T_MAX >> 20)) env->mem_limit = (size_t)limit << 20; else env->mem_limit = SIZE_T_MAX; return; } /*********************************************************************** * NAME * * glp_mem_usage - get memory usage information * * SYNOPSIS * * void glp_mem_usage(int *count, int *cpeak, size_t *total, * size_t *tpeak); * * DESCRIPTION * * The routine glp_mem_usage reports some information about utilization * of the memory by GLPK routines. Information is stored to locations * specified by corresponding parameters (see below). Any parameter can * be specified as NULL, in which case its value is not stored. * * *count is the number of the memory blocks currently allocated by the * routines glp_malloc and glp_calloc (one call to glp_malloc or * glp_calloc results in allocating one memory block). * * *cpeak is the peak value of *count reached since the initialization * of the GLPK library environment. * * *total is the total amount, in bytes, of the memory blocks currently * allocated by the routines glp_malloc and glp_calloc. * * *tpeak is the peak value of *total reached since the initialization * of the GLPK library envirionment. */ void glp_mem_usage(int *count, int *cpeak, size_t *total, size_t *tpeak) { ENV *env = get_env_ptr(); if (count != NULL) *count = env->mem_count; if (cpeak != NULL) *cpeak = env->mem_cpeak; if (total != NULL) *total = env->mem_total; if (tpeak != NULL) *tpeak = env->mem_tpeak; return; } /* eof */ glpk-5.0/src/env/dlsup.c0000644000062000006210000001041313766346220014353 0ustar maomkpasswd/* dlsup.c (dynamic linking support) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2008-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifdef HAVE_CONFIG_H #include #endif #include "env.h" /* GNU version ********************************************************/ #if defined(HAVE_LTDL) #include void *xdlopen(const char *module) { /* open dynamically linked library */ void *h = NULL; if (lt_dlinit() != 0) { put_err_msg(lt_dlerror()); goto done; } h = lt_dlopen(module); if (h == NULL) { put_err_msg(lt_dlerror()); if (lt_dlexit() != 0) xerror("xdlopen: %s\n", lt_dlerror()); } done: return h; } void *xdlsym(void *h, const char *symbol) { /* obtain address of symbol from dynamically linked library */ void *ptr; xassert(h != NULL); ptr = lt_dlsym(h, symbol); if (ptr == NULL) xerror("xdlsym: %s: %s\n", symbol, lt_dlerror()); return ptr; } void xdlclose(void *h) { /* close dynamically linked library */ xassert(h != NULL); if (lt_dlclose(h) != 0) xerror("xdlclose: %s\n", lt_dlerror()); if (lt_dlexit() != 0) xerror("xdlclose: %s\n", lt_dlerror()); return; } /* POSIX version ******************************************************/ #elif defined(HAVE_DLFCN) #include void *xdlopen(const char *module) { /* open dynamically linked library */ void *h; h = dlopen(module, RTLD_NOW); if (h == NULL) put_err_msg(dlerror()); return h; } void *xdlsym(void *h, const char *symbol) { /* obtain address of symbol from dynamically linked library */ void *ptr; xassert(h != NULL); ptr = dlsym(h, symbol); if (ptr == NULL) xerror("xdlsym: %s: %s\n", symbol, dlerror()); return ptr; } void xdlclose(void *h) { /* close dynamically linked library */ xassert(h != NULL); if (dlclose(h) != 0) xerror("xdlclose: %s\n", dlerror()); return; } /* MS Windows version *************************************************/ #elif defined(__WOE__) #include void *xdlopen(const char *module) { /* open dynamically linked library */ void *h; h = LoadLibrary(module); if (h == NULL) { char msg[20]; sprintf(msg, "Error %d", GetLastError()); put_err_msg(msg); } return h; } void *xdlsym(void *h, const char *symbol) { /* obtain address of symbol from dynamically linked library */ void *ptr; xassert(h != NULL); ptr = GetProcAddress(h, symbol); if (ptr == NULL) xerror("xdlsym: %s: Error %d\n", symbol, GetLastError()); return ptr; } void xdlclose(void *h) { /* close dynamically linked library */ xassert(h != NULL); if (!FreeLibrary(h)) xerror("xdlclose: Error %d\n", GetLastError()); return; } /* NULL version *******************************************************/ #else void *xdlopen(const char *module) { /* open dynamically linked library */ xassert(module == module); put_err_msg("Shared libraries not supported"); return NULL; } void *xdlsym(void *h, const char *symbol) { /* obtain address of symbol from dynamically linked library */ xassert(h != h); xassert(symbol != symbol); return NULL; } void xdlclose(void *h) { /* close dynamically linked library */ xassert(h != h); return; } #endif /* eof */ glpk-5.0/src/env/env.c0000644000062000006210000002170613766346220014023 0ustar maomkpasswd/* env.c (GLPK environment initialization/termination) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2000-2017 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifdef HAVE_CONFIG_H #include #endif #include "glpk.h" #include "env.h" /*********************************************************************** * NAME * * glp_init_env - initialize GLPK environment * * SYNOPSIS * * int glp_init_env(void); * * DESCRIPTION * * The routine glp_init_env initializes the GLPK environment. Normally * the application program does not need to call this routine, because * it is called automatically on the first call to any API routine. * * RETURNS * * The routine glp_init_env returns one of the following codes: * * 0 - initialization successful; * 1 - environment has been already initialized; * 2 - initialization failed (insufficient memory); * 3 - initialization failed (unsupported programming model). */ int glp_init_env(void) { ENV *env; int ok; /* check if the programming model is supported */ ok = (CHAR_BIT == 8 && sizeof(char) == 1 && sizeof(short) == 2 && sizeof(int) == 4 && (sizeof(void *) == 4 || sizeof(void *) == 8)); if (!ok) return 3; /* check if the environment is already initialized */ if (tls_get_ptr() != NULL) return 1; /* allocate and initialize the environment block */ env = malloc(sizeof(ENV)); if (env == NULL) return 2; memset(env, 0, sizeof(ENV)); #if 0 /* 14/I-2017 */ sprintf(env->version, "%d.%d", GLP_MAJOR_VERSION, GLP_MINOR_VERSION); #endif env->self = env; env->term_buf = malloc(TBUF_SIZE); if (env->term_buf == NULL) { free(env); return 2; } env->term_out = GLP_ON; env->term_hook = NULL; env->term_info = NULL; env->tee_file = NULL; #if 1 /* 23/XI-2015 */ env->err_st = 0; #endif env->err_file = NULL; env->err_line = 0; env->err_hook = NULL; env->err_info = NULL; env->err_buf = malloc(EBUF_SIZE); if (env->err_buf == NULL) { free(env->term_buf); free(env); return 2; } env->err_buf[0] = '\0'; env->mem_limit = SIZE_T_MAX; env->mem_ptr = NULL; env->mem_count = env->mem_cpeak = 0; env->mem_total = env->mem_tpeak = 0; #if 1 /* 23/XI-2015 */ env->gmp_pool = NULL; env->gmp_size = 0; env->gmp_work = NULL; #endif env->h_odbc = env->h_mysql = NULL; /* save pointer to the environment block */ tls_set_ptr(env); /* initialization successful */ return 0; } /*********************************************************************** * NAME * * get_env_ptr - retrieve pointer to environment block * * SYNOPSIS * * #include "env.h" * ENV *get_env_ptr(void); * * DESCRIPTION * * The routine get_env_ptr retrieves and returns a pointer to the GLPK * environment block. * * If the GLPK environment has not been initialized yet, the routine * performs initialization. If initialization fails, the routine prints * an error message to stderr and terminates the program. * * RETURNS * * The routine returns a pointer to the environment block. */ ENV *get_env_ptr(void) { ENV *env = tls_get_ptr(); /* check if the environment has been initialized */ if (env == NULL) { /* not initialized yet; perform initialization */ if (glp_init_env() != 0) { /* initialization failed; display an error message */ fprintf(stderr, "GLPK initialization failed\n"); fflush(stderr); /* and abnormally terminate the program */ abort(); } /* initialization successful; retrieve the pointer */ env = tls_get_ptr(); } /* check if the environment block is valid */ if (env->self != env) { fprintf(stderr, "Invalid GLPK environment\n"); fflush(stderr); abort(); } return env; } /*********************************************************************** * NAME * * glp_version - determine library version * * SYNOPSIS * * const char *glp_version(void); * * RETURNS * * The routine glp_version returns a pointer to a null-terminated * character string, which specifies the version of the GLPK library in * the form "X.Y", where X is the major version number, and Y is the * minor version number, for example, "4.16". */ #define str(s) # s #define xstr(s) str(s) const char *glp_version(void) #if 0 /* 14/I-2017 */ { ENV *env = get_env_ptr(); return env->version; } #else /* suggested by Heinrich */ { return xstr(GLP_MAJOR_VERSION) "." xstr(GLP_MINOR_VERSION); } #endif /*********************************************************************** * NAME * * glp_config - determine library configuration * * SYNOPSIS * * const char *glp_config(const char *option); * * DESCRIPTION * * The routine glp_config determines some options which were specified * on configuring the GLPK library. * * RETURNS * * The routine glp_config returns a pointer to a null-terminating * string depending on the option inquired. * * For option = "TLS" the routine returns the thread local storage * class specifier used (e.g. "_Thread_local") if the GLPK library was * configured to run in multi-threaded environment, or NULL otherwise. * * For option = "ODBC_DLNAME" the routine returns the name of ODBC * shared library if this option was enabled, or NULL otherwise. * * For option = "MYSQL_DLNAME" the routine returns the name of MySQL * shared library if this option was enabled, or NULL otherwise. */ const char *glp_config(const char *option) { const char *s; if (strcmp(option, "TLS") == 0) #ifndef TLS s = NULL; #else s = xstr(TLS); #endif else if (strcmp(option, "ODBC_DLNAME") == 0) #ifndef ODBC_DLNAME s = NULL; #else s = ODBC_DLNAME; #endif else if (strcmp(option, "MYSQL_DLNAME") == 0) #ifndef MYSQL_DLNAME s = NULL; #else s = MYSQL_DLNAME; #endif else { /* invalid option is always disabled */ s = NULL; } return s; } /*********************************************************************** * NAME * * glp_free_env - free GLPK environment * * SYNOPSIS * * int glp_free_env(void); * * DESCRIPTION * * The routine glp_free_env frees all resources used by GLPK routines * (memory blocks, etc.) which are currently still in use. * * Normally the application program does not need to call this routine, * because GLPK routines always free all unused resources. However, if * the application program even has deleted all problem objects, there * will be several memory blocks still allocated for the library needs. * For some reasons the application program may want GLPK to free this * memory, in which case it should call glp_free_env. * * Note that a call to glp_free_env invalidates all problem objects as * if no GLPK routine were called. * * RETURNS * * 0 - termination successful; * 1 - environment is inactive (was not initialized). */ int glp_free_env(void) { ENV *env = tls_get_ptr(); MBD *desc; /* check if the environment is active */ if (env == NULL) return 1; /* check if the environment block is valid */ if (env->self != env) { fprintf(stderr, "Invalid GLPK environment\n"); fflush(stderr); abort(); } /* close handles to shared libraries */ if (env->h_odbc != NULL) xdlclose(env->h_odbc); if (env->h_mysql != NULL) xdlclose(env->h_mysql); /* free memory blocks which are still allocated */ while (env->mem_ptr != NULL) { desc = env->mem_ptr; env->mem_ptr = desc->next; free(desc); } /* close text file used for copying terminal output */ if (env->tee_file != NULL) fclose(env->tee_file); /* invalidate the environment block */ env->self = NULL; /* free memory allocated to the environment block */ free(env->term_buf); free(env->err_buf); free(env); /* reset a pointer to the environment block */ tls_set_ptr(NULL); /* termination successful */ return 0; } /* eof */ glpk-5.0/src/env/env.h0000644000062000006210000002035213766346220014024 0ustar maomkpasswd/* env.h (GLPK environment) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2000-2017 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef ENV_H #define ENV_H #include "stdc.h" typedef struct ENV ENV; typedef struct MBD MBD; #define SIZE_T_MAX (~(size_t)0) /* largest value of size_t type */ #define TBUF_SIZE 4096 /* terminal output buffer size, in bytes */ #define EBUF_SIZE 1024 /* error message buffer size, in bytes */ /* enable/disable flag: */ #define GLP_ON 1 #define GLP_OFF 0 struct ENV { /* GLPK environment block */ #if 0 /* 14/I-2007 */ char version[7+1]; /* version string returned by the routine glp_version */ #endif ENV *self; /* pointer to this block to check its validity */ /*--------------------------------------------------------------*/ /* terminal output */ char *term_buf; /* char term_buf[TBUF_SIZE]; */ /* terminal output buffer */ int term_out; /* flag to enable/disable terminal output */ int (*term_hook)(void *info, const char *s); /* user-defined routine to intercept terminal output */ void *term_info; /* transit pointer (cookie) passed to the routine term_hook */ FILE *tee_file; /* output stream used to copy terminal output */ /*--------------------------------------------------------------*/ /* error handling */ #if 1 /* 07/XI-2015 */ int err_st; /* error state flag; set on entry to glp_error */ #endif const char *err_file; /* value of the __FILE__ macro passed to glp_error */ int err_line; /* value of the __LINE__ macro passed to glp_error */ void (*err_hook)(void *info); /* user-defined routine to intercept abnormal termination */ void *err_info; /* transit pointer (cookie) passed to the routine err_hook */ char *err_buf; /* char err_buf[EBUF_SIZE]; */ /* buffer to store error messages (used by I/O routines) */ /*--------------------------------------------------------------*/ /* dynamic memory allocation */ size_t mem_limit; /* maximal amount of memory, in bytes, available for dynamic * allocation */ MBD *mem_ptr; /* pointer to the linked list of allocated memory blocks */ int mem_count; /* total number of currently allocated memory blocks */ int mem_cpeak; /* peak value of mem_count */ size_t mem_total; /* total amount of currently allocated memory, in bytes; it is * the sum of the size field over all memory block descriptors */ size_t mem_tpeak; /* peak value of mem_total */ #if 1 /* 23/XI-2015 */ /*--------------------------------------------------------------*/ /* bignum module working area */ void *gmp_pool; /* DMP *gmp_pool; */ /* working memory pool */ int gmp_size; /* size of working array */ unsigned short *gmp_work; /* ushort gmp_work[gmp_size]; */ /* working array */ #endif /*--------------------------------------------------------------*/ /* dynamic linking support (optional) */ void *h_odbc; /* handle to ODBC shared library */ void *h_mysql; /* handle to MySQL shared library */ }; struct MBD { /* memory block descriptor */ size_t size; /* size of block, in bytes, including descriptor */ MBD *self; /* pointer to this descriptor to check its validity */ MBD *prev; /* pointer to previous memory block descriptor */ MBD *next; /* pointer to next memory block descriptor */ }; #define get_env_ptr _glp_get_env_ptr ENV *get_env_ptr(void); /* retrieve pointer to environment block */ #define tls_set_ptr _glp_tls_set_ptr void tls_set_ptr(void *ptr); /* store global pointer in TLS */ #define tls_get_ptr _glp_tls_get_ptr void *tls_get_ptr(void); /* retrieve global pointer from TLS */ #define xputs glp_puts void glp_puts(const char *s); /* write string on terminal */ #define xprintf glp_printf void glp_printf(const char *fmt, ...); /* write formatted output on terminal */ #define xvprintf glp_vprintf void glp_vprintf(const char *fmt, va_list arg); /* write formatted output on terminal */ int glp_term_out(int flag); /* enable/disable terminal output */ void glp_term_hook(int (*func)(void *info, const char *s), void *info); /* install hook to intercept terminal output */ int glp_open_tee(const char *fname); /* start copying terminal output to text file */ int glp_close_tee(void); /* stop copying terminal output to text file */ #ifndef GLP_ERRFUNC_DEFINED #define GLP_ERRFUNC_DEFINED typedef void (*glp_errfunc)(const char *fmt, ...); #endif #define xerror glp_error_(__FILE__, __LINE__) glp_errfunc glp_error_(const char *file, int line); /* display fatal error message and terminate execution */ #define xassert(expr) \ ((void)((expr) || (glp_assert_(#expr, __FILE__, __LINE__), 1))) void glp_assert_(const char *expr, const char *file, int line); /* check for logical condition */ void glp_error_hook(void (*func)(void *info), void *info); /* install hook to intercept abnormal termination */ #define put_err_msg _glp_put_err_msg void put_err_msg(const char *msg); /* provide error message string */ #define get_err_msg _glp_get_err_msg const char *get_err_msg(void); /* obtain error message string */ #define xmalloc(size) glp_alloc(1, size) /* allocate memory block (obsolete) */ #define xcalloc(n, size) glp_alloc(n, size) /* allocate memory block (obsolete) */ #define xalloc(n, size) glp_alloc(n, size) #define talloc(n, type) ((type *)glp_alloc(n, sizeof(type))) void *glp_alloc(int n, int size); /* allocate memory block */ #define xrealloc(ptr, n, size) glp_realloc(ptr, n, size) #define trealloc(ptr, n, type) ((type *)glp_realloc(ptr, n, \ sizeof(type))) void *glp_realloc(void *ptr, int n, int size); /* reallocate memory block */ #define xfree(ptr) glp_free(ptr) #define tfree(ptr) glp_free(ptr) void glp_free(void *ptr); /* free memory block */ void glp_mem_limit(int limit); /* set memory usage limit */ void glp_mem_usage(int *count, int *cpeak, size_t *total, size_t *tpeak); /* get memory usage information */ typedef struct glp_file glp_file; /* sequential stream descriptor */ #define glp_open _glp_open glp_file *glp_open(const char *name, const char *mode); /* open stream */ #define glp_eof _glp_eof int glp_eof(glp_file *f); /* test end-of-file indicator */ #define glp_ioerr _glp_ioerr int glp_ioerr(glp_file *f); /* test I/O error indicator */ #define glp_read _glp_read int glp_read(glp_file *f, void *buf, int nnn); /* read data from stream */ #define glp_getc _glp_getc int glp_getc(glp_file *f); /* read character from stream */ #define glp_write _glp_write int glp_write(glp_file *f, const void *buf, int nnn); /* write data to stream */ #define glp_format _glp_format int glp_format(glp_file *f, const char *fmt, ...); /* write formatted data to stream */ #define glp_close _glp_close int glp_close(glp_file *f); /* close stream */ #define xtime glp_time double glp_time(void); /* determine current universal time */ #define xdifftime glp_difftime double glp_difftime(double t1, double t0); /* compute difference between two time values */ #define xdlopen _glp_dlopen void *xdlopen(const char *module); /* open dynamically linked library */ #define xdlsym _glp_dlsym void *xdlsym(void *h, const char *symbol); /* obtain address of symbol from dynamically linked library */ #define xdlclose _glp_dlclose void xdlclose(void *h); /* close dynamically linked library */ #endif /* eof */ glpk-5.0/src/env/error.c0000644000062000006210000001262413766346220014363 0ustar maomkpasswd/* error.c (error handling) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2000-2015 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" /*********************************************************************** * NAME * * glp_error - display fatal error message and terminate execution * * SYNOPSIS * * void glp_error(const char *fmt, ...); * * DESCRIPTION * * The routine glp_error (implemented as a macro) formats its * parameters using the format control string fmt, writes the formatted * message on the terminal, and abnormally terminates the program. */ static void errfunc(const char *fmt, ...) { ENV *env = get_env_ptr(); va_list arg; #if 1 /* 07/XI-2015 */ env->err_st = 1; #endif env->term_out = GLP_ON; va_start(arg, fmt); xvprintf(fmt, arg); va_end(arg); xprintf("Error detected in file %s at line %d\n", env->err_file, env->err_line); if (env->err_hook != NULL) env->err_hook(env->err_info); abort(); exit(EXIT_FAILURE); /* no return */ } glp_errfunc glp_error_(const char *file, int line) { ENV *env = get_env_ptr(); env->err_file = file; env->err_line = line; return errfunc; } #if 1 /* 07/XI-2015 */ /*********************************************************************** * NAME * * glp_at_error - check for error state * * SYNOPSIS * * int glp_at_error(void); * * DESCRIPTION * * The routine glp_at_error checks if the GLPK environment is at error * state, i.e. if the call to the routine is (indirectly) made from the * glp_error routine via an user-defined hook routine. * * RETURNS * * If the GLPK environment is at error state, the routine glp_at_error * returns non-zero, otherwise zero. */ int glp_at_error(void) { ENV *env = get_env_ptr(); return env->err_st; } #endif /*********************************************************************** * NAME * * glp_assert - check for logical condition * * SYNOPSIS * * void glp_assert(int expr); * * DESCRIPTION * * The routine glp_assert (implemented as a macro) checks for a logical * condition specified by the parameter expr. If the condition is false * (i.e. the value of expr is zero), the routine writes a message on * the terminal and abnormally terminates the program. */ void glp_assert_(const char *expr, const char *file, int line) { glp_error_(file, line)("Assertion failed: %s\n", expr); /* no return */ } /*********************************************************************** * NAME * * glp_error_hook - install hook to intercept abnormal termination * * SYNOPSIS * * void glp_error_hook(void (*func)(void *info), void *info); * * DESCRIPTION * * The routine glp_error_hook installs a user-defined hook routine to * intercept abnormal termination. * * The parameter func specifies the user-defined hook routine. It is * called from the routine glp_error before the latter calls the abort * function to abnormally terminate the application program because of * fatal error. The parameter info is a transit pointer, specified in * the corresponding call to the routine glp_error_hook; it may be used * to pass some information to the hook routine. * * To uninstall the hook routine the parameters func and info should be * both specified as NULL. */ void glp_error_hook(void (*func)(void *info), void *info) { ENV *env = get_env_ptr(); if (func == NULL) { env->err_hook = NULL; env->err_info = NULL; } else { env->err_hook = func; env->err_info = info; } return; } /*********************************************************************** * NAME * * put_err_msg - provide error message string * * SYNOPSIS * * #include "env.h" * void put_err_msg(const char *msg); * * DESCRIPTION * * The routine put_err_msg stores an error message string pointed to by * msg to the environment block. */ void put_err_msg(const char *msg) { ENV *env = get_env_ptr(); int len; len = strlen(msg); if (len >= EBUF_SIZE) len = EBUF_SIZE - 1; memcpy(env->err_buf, msg, len); if (len > 0 && env->err_buf[len-1] == '\n') len--; env->err_buf[len] = '\0'; return; } /*********************************************************************** * NAME * * get_err_msg - obtain error message string * * SYNOPSIS * * #include "env.h" * const char *get_err_msg(void); * * RETURNS * * The routine get_err_msg returns a pointer to an error message string * previously stored by the routine put_err_msg. */ const char *get_err_msg(void) { ENV *env = get_env_ptr(); return env->err_buf; } /* eof */ glpk-5.0/src/env/stdc.c0000644000062000006210000000446613766346220014174 0ustar maomkpasswd/* stdc.c (replacements for standard non-thread-safe functions) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2017 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifdef HAVE_CONFIG_H #include #endif /* portable ANSI C version ********************************************/ #if !defined(TLS) #define ENABLE_NON_SAFE #include "stdc.h" struct tm *xgmtime(const time_t *timer) { return gmtime(timer); } char *xstrerr(int errnum) { return strerror(errnum); } char *xstrtok(char *s1, const char *s2) { return strtok(s1, s2); } /* MS Windows version *************************************************/ #elif defined(__WOE__) #include "stdc.h" struct tm *xgmtime(const time_t *timer) { static TLS struct tm result; gmtime_s(&result, timer); return &result; } char *xstrerr(int errnum) { static TLS char s[1023+1]; strerror_s(s, sizeof(s), errnum); return s; } char *xstrtok(char *s1, const char *s2) { static TLS char *ptr; return strtok_s(s1, s2, &ptr); } /* GNU/Linux version **************************************************/ #else #include "stdc.h" struct tm *xgmtime(const time_t *timer) { static TLS struct tm result; gmtime_r(timer, &result); return &result; } char *xstrerr(int errnum) { static TLS char s[1023+1]; strerror_r(errnum, s, sizeof(s)); return s; } char *xstrtok(char *s1, const char *s2) { static TLS char *ptr; return strtok_r(s1, s2, &ptr); } #endif /* eof */ glpk-5.0/src/env/stdc.h0000644000062000006210000000353013766346220014170 0ustar maomkpasswd/* stdc.h (standard ANSI C headers) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2000-2017 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef STDC_H #define STDC_H #include #include #include #include #include #include #include #include #include #include #include #include #ifndef ENABLE_NON_SAFE /* 29/I-2017 */ /* disable using non-thread-safe functions directly */ #undef gmtime #define gmtime ??? #undef strerror #define strerror ??? #undef strtok #define strtok ??? #endif #if 1 /* 29/I-2017 */ /* provide replacements for these functions on a per-thread basis */ #define xgmtime _glp_xgmtime struct tm *xgmtime(const time_t *); #define xstrerr _glp_xstrerr char *xstrerr(int); #define xstrtok _glp_xstrtok char *xstrtok(char *, const char *); #endif #if 1 /* 06/II-2018 */ #ifdef HAVE_CONFIG_H #include #endif #ifndef __WOE__ #define CDECL #else #define CDECL __cdecl #endif #endif #endif /* eof */ glpk-5.0/src/env/stdout.c0000644000062000006210000001642613766346220014560 0ustar maomkpasswd/* stdout.c (terminal output) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2000-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #undef NDEBUG #include #include "env.h" /*********************************************************************** * NAME * * glp_puts - write string on terminal * * SYNOPSIS * * void glp_puts(const char *s); * * The routine glp_puts writes the string s on the terminal. */ void glp_puts(const char *s) { ENV *env = get_env_ptr(); /* if terminal output is disabled, do nothing */ if (!env->term_out) goto skip; /* pass the string to the hook routine, if defined */ if (env->term_hook != NULL) { if (env->term_hook(env->term_info, s) != 0) goto skip; } /* write the string on the terminal */ fputs(s, stdout); fflush(stdout); /* write the string on the tee file, if required */ if (env->tee_file != NULL) { fputs(s, env->tee_file); fflush(env->tee_file); } skip: return; } /*********************************************************************** * NAME * * glp_printf - write formatted output on terminal * * SYNOPSIS * * void glp_printf(const char *fmt, ...); * * DESCRIPTION * * The routine glp_printf uses the format control string fmt to format * its parameters and writes the formatted output on the terminal. */ void glp_printf(const char *fmt, ...) { ENV *env = get_env_ptr(); va_list arg; /* if terminal output is disabled, do nothing */ if (!env->term_out) goto skip; /* format the output */ va_start(arg, fmt); vsprintf(env->term_buf, fmt, arg); /* (do not use xassert) */ assert(strlen(env->term_buf) < TBUF_SIZE); va_end(arg); /* write the formatted output on the terminal */ glp_puts(env->term_buf); skip: return; } /*********************************************************************** * NAME * * glp_vprintf - write formatted output on terminal * * SYNOPSIS * * void glp_vprintf(const char *fmt, va_list arg); * * DESCRIPTION * * The routine glp_vprintf uses the format control string fmt to format * its parameters specified by the list arg and writes the formatted * output on the terminal. */ void glp_vprintf(const char *fmt, va_list arg) { ENV *env = get_env_ptr(); /* if terminal output is disabled, do nothing */ if (!env->term_out) goto skip; /* format the output */ vsprintf(env->term_buf, fmt, arg); /* (do not use xassert) */ assert(strlen(env->term_buf) < TBUF_SIZE); /* write the formatted output on the terminal */ glp_puts(env->term_buf); skip: return; } /*********************************************************************** * NAME * * glp_term_out - enable/disable terminal output * * SYNOPSIS * * int glp_term_out(int flag); * * DESCRIPTION * * Depending on the parameter flag the routine glp_term_out enables or * disables terminal output performed by glpk routines: * * GLP_ON - enable terminal output; * GLP_OFF - disable terminal output. * * RETURNS * * The routine glp_term_out returns the previous value of the terminal * output flag. */ int glp_term_out(int flag) { ENV *env = get_env_ptr(); int old = env->term_out; if (!(flag == GLP_ON || flag == GLP_OFF)) xerror("glp_term_out: flag = %d; invalid parameter\n", flag); env->term_out = flag; return old; } /*********************************************************************** * NAME * * glp_term_hook - install hook to intercept terminal output * * SYNOPSIS * * void glp_term_hook(int (*func)(void *info, const char *s), * void *info); * * DESCRIPTION * * The routine glp_term_hook installs a user-defined hook routine to * intercept all terminal output performed by glpk routines. * * This feature can be used to redirect the terminal output to other * destination, for example to a file or a text window. * * The parameter func specifies the user-defined hook routine. It is * called from an internal printing routine, which passes to it two * parameters: info and s. The parameter info is a transit pointer, * specified in the corresponding call to the routine glp_term_hook; * it may be used to pass some information to the hook routine. The * parameter s is a pointer to the null terminated character string, * which is intended to be written to the terminal. If the hook routine * returns zero, the printing routine writes the string s to the * terminal in a usual way; otherwise, if the hook routine returns * non-zero, no terminal output is performed. * * To uninstall the hook routine the parameters func and info should be * specified as NULL. */ void glp_term_hook(int (*func)(void *info, const char *s), void *info) { ENV *env = get_env_ptr(); if (func == NULL) { env->term_hook = NULL; env->term_info = NULL; } else { env->term_hook = func; env->term_info = info; } return; } /*********************************************************************** * NAME * * glp_open_tee - start copying terminal output to text file * * SYNOPSIS * * int glp_open_tee(const char *name); * * DESCRIPTION * * The routine glp_open_tee starts copying all the terminal output to * an output text file, whose name is specified by the character string * name. * * RETURNS * * 0 - operation successful * 1 - copying terminal output is already active * 2 - unable to create output file */ int glp_open_tee(const char *name) { ENV *env = get_env_ptr(); if (env->tee_file != NULL) { /* copying terminal output is already active */ return 1; } env->tee_file = fopen(name, "w"); if (env->tee_file == NULL) { /* unable to create output file */ return 2; } return 0; } /*********************************************************************** * NAME * * glp_close_tee - stop copying terminal output to text file * * SYNOPSIS * * int glp_close_tee(void); * * DESCRIPTION * * The routine glp_close_tee stops copying the terminal output to the * output text file previously open by the routine glp_open_tee closing * that file. * * RETURNS * * 0 - operation successful * 1 - copying terminal output was not started */ int glp_close_tee(void) { ENV *env = get_env_ptr(); if (env->tee_file == NULL) { /* copying terminal output was not started */ return 1; } fclose(env->tee_file); env->tee_file = NULL; return 0; } /* eof */ glpk-5.0/src/env/stream.c0000644000062000006210000003375413766346220014534 0ustar maomkpasswd/* stream.c (stream input/output) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2008-2017 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "zlib.h" struct glp_file { /* sequential stream descriptor */ char *base; /* pointer to buffer */ int size; /* size of buffer, in bytes */ char *ptr; /* pointer to next byte in buffer */ int cnt; /* count of bytes in buffer */ int flag; /* stream flags: */ #define IONULL 0x01 /* null file */ #define IOSTD 0x02 /* standard stream */ #define IOGZIP 0x04 /* gzipped file */ #define IOWRT 0x08 /* output stream */ #define IOEOF 0x10 /* end of file */ #define IOERR 0x20 /* input/output error */ void *file; /* pointer to underlying control object */ }; /*********************************************************************** * NAME * * glp_open - open stream * * SYNOPSIS * * glp_file *glp_open(const char *name, const char *mode); * * DESCRIPTION * * The routine glp_open opens a file whose name is a string pointed to * by name and associates a stream with it. * * The following special filenames are recognized by the routine (this * feature is platform independent): * * "/dev/null" empty (null) file; * "/dev/stdin" standard input stream; * "/dev/stdout" standard output stream; * "/dev/stderr" standard error stream. * * If the specified filename is ended with ".gz", it is assumed that * the file is in gzipped format. In this case the file is compressed * or decompressed by the I/O routines "on the fly". * * The parameter mode points to a string, which indicates the open mode * and should be one of the following: * * "r" open text file for reading; * "w" truncate to zero length or create text file for writing; * "a" append, open or create text file for writing at end-of-file; * "rb" open binary file for reading; * "wb" truncate to zero length or create binary file for writing; * "ab" append, open or create binary file for writing at end-of-file. * * RETURNS * * The routine glp_open returns a pointer to the object controlling the * stream. If the operation fails, the routine returns NULL. */ glp_file *glp_open(const char *name, const char *mode) { glp_file *f; int flag; void *file; if (strcmp(mode, "r") == 0 || strcmp(mode, "rb") == 0) flag = 0; else if (strcmp(mode, "w") == 0 || strcmp(mode, "wb") == 0) flag = IOWRT; #if 1 /* 08/V-2014 */ else if (strcmp(mode, "a") == 0 || strcmp(mode, "ab") == 0) flag = IOWRT; #endif else xerror("glp_open: invalid mode string\n"); if (strcmp(name, "/dev/null") == 0) { flag |= IONULL; file = NULL; } else if (strcmp(name, "/dev/stdin") == 0) { flag |= IOSTD; file = stdin; } else if (strcmp(name, "/dev/stdout") == 0) { flag |= IOSTD; file = stdout; } else if (strcmp(name, "/dev/stderr") == 0) { flag |= IOSTD; file = stderr; } else { char *ext = strrchr(name, '.'); if (ext == NULL || strcmp(ext, ".gz") != 0) { file = fopen(name, mode); if (file == NULL) #if 0 /* 29/I-2017 */ { put_err_msg(strerror(errno)); #else { put_err_msg(xstrerr(errno)); #endif return NULL; } } else { flag |= IOGZIP; if (strcmp(mode, "r") == 0) mode = "rb"; else if (strcmp(mode, "w") == 0) mode = "wb"; #if 1 /* 08/V-2014; this mode seems not to work */ else if (strcmp(mode, "a") == 0) mode = "ab"; #endif file = gzopen(name, mode); if (file == NULL) #if 0 /* 29/I-2017 */ { put_err_msg(strerror(errno)); #else { put_err_msg(xstrerr(errno)); #endif return NULL; } } } f = talloc(1, glp_file); f->base = talloc(BUFSIZ, char); f->size = BUFSIZ; f->ptr = f->base; f->cnt = 0; f->flag = flag; f->file = file; return f; } /*********************************************************************** * NAME * * glp_eof - test end-of-file indicator * * SYNOPSIS * * int glp_eof(glp_file *f); * * DESCRIPTION * * The routine glp_eof tests the end-of-file indicator for the stream * pointed to by f. * * RETURNS * * The routine glp_eof returns non-zero if and only if the end-of-file * indicator is set for the specified stream. */ int glp_eof(glp_file *f) { return f->flag & IOEOF; } /*********************************************************************** * NAME * * glp_ioerr - test I/O error indicator * * SYNOPSIS * * int glp_ioerr(glp_file *f); * * DESCRIPTION * * The routine glp_ioerr tests the I/O error indicator for the stream * pointed to by f. * * RETURNS * * The routine glp_ioerr returns non-zero if and only if the I/O error * indicator is set for the specified stream. */ int glp_ioerr(glp_file *f) { return f->flag & IOERR; } /*********************************************************************** * NAME * * glp_read - read data from stream * * SYNOPSIS * * int glp_read(glp_file *f, void *buf, int nnn); * * DESCRIPTION * * The routine glp_read reads, into the buffer pointed to by buf, up to * nnn bytes, from the stream pointed to by f. * * RETURNS * * The routine glp_read returns the number of bytes successfully read * (which may be less than nnn). If an end-of-file is encountered, the * end-of-file indicator for the stream is set and glp_read returns * zero. If a read error occurs, the error indicator for the stream is * set and glp_read returns a negative value. */ int glp_read(glp_file *f, void *buf, int nnn) { int nrd, cnt; if (f->flag & IOWRT) xerror("glp_read: attempt to read from output stream\n"); if (nnn < 1) xerror("glp_read: nnn = %d; invalid parameter\n", nnn); for (nrd = 0; nrd < nnn; nrd += cnt) { if (f->cnt == 0) { /* buffer is empty; fill it */ if (f->flag & IONULL) cnt = 0; else if (!(f->flag & IOGZIP)) { cnt = fread(f->base, 1, f->size, (FILE *)(f->file)); if (ferror((FILE *)(f->file))) { f->flag |= IOERR; #if 0 /* 29/I-2017 */ put_err_msg(strerror(errno)); #else put_err_msg(xstrerr(errno)); #endif return EOF; } } else { int errnum; const char *msg; cnt = gzread((gzFile)(f->file), f->base, f->size); if (cnt < 0) { f->flag |= IOERR; msg = gzerror((gzFile)(f->file), &errnum); if (errnum == Z_ERRNO) #if 0 /* 29/I-2017 */ put_err_msg(strerror(errno)); #else put_err_msg(xstrerr(errno)); #endif else put_err_msg(msg); return EOF; } } if (cnt == 0) { if (nrd == 0) f->flag |= IOEOF; break; } f->ptr = f->base; f->cnt = cnt; } cnt = nnn - nrd; if (cnt > f->cnt) cnt = f->cnt; memcpy((char *)buf + nrd, f->ptr, cnt); f->ptr += cnt; f->cnt -= cnt; } return nrd; } /*********************************************************************** * NAME * * glp_getc - read character from stream * * SYNOPSIS * * int glp_getc(glp_file *f); * * DESCRIPTION * * The routine glp_getc obtains a next character as an unsigned char * converted to an int from the input stream pointed to by f. * * RETURNS * * The routine glp_getc returns the next character obtained. However, * if an end-of-file is encountered or a read error occurs, the routine * returns EOF. (An end-of-file and a read error can be distinguished * by use of the routines glp_eof and glp_ioerr.) */ int glp_getc(glp_file *f) { unsigned char buf[1]; if (f->flag & IOWRT) xerror("glp_getc: attempt to read from output stream\n"); if (glp_read(f, buf, 1) != 1) return EOF; return buf[0]; } /*********************************************************************** * do_flush - flush output stream * * This routine causes buffered data for the specified output stream to * be written to the associated file. * * If the operation was successful, the routine returns zero, otherwise * non-zero. */ static int do_flush(glp_file *f) { xassert(f->flag & IOWRT); if (f->cnt > 0) { if (f->flag & IONULL) ; else if (!(f->flag & IOGZIP)) { if ((int)fwrite(f->base, 1, f->cnt, (FILE *)(f->file)) != f->cnt) { f->flag |= IOERR; #if 0 /* 29/I-2017 */ put_err_msg(strerror(errno)); #else put_err_msg(xstrerr(errno)); #endif return EOF; } } else { int errnum; const char *msg; if (gzwrite((gzFile)(f->file), f->base, f->cnt) != f->cnt) { f->flag |= IOERR; msg = gzerror((gzFile)(f->file), &errnum); if (errnum == Z_ERRNO) #if 0 /* 29/I-2017 */ put_err_msg(strerror(errno)); #else put_err_msg(xstrerr(errno)); #endif else put_err_msg(msg); return EOF; } } } f->ptr = f->base; f->cnt = 0; return 0; } /*********************************************************************** * NAME * * glp_write - write data to stream * * SYNOPSIS * * int glp_write(glp_file *f, const void *buf, int nnn); * * DESCRIPTION * * The routine glp_write writes, from the buffer pointed to by buf, up * to nnn bytes, to the stream pointed to by f. * * RETURNS * * The routine glp_write returns the number of bytes successfully * written (which is equal to nnn). If a write error occurs, the error * indicator for the stream is set and glp_write returns a negative * value. */ int glp_write(glp_file *f, const void *buf, int nnn) { int nwr, cnt; if (!(f->flag & IOWRT)) xerror("glp_write: attempt to write to input stream\n"); if (nnn < 1) xerror("glp_write: nnn = %d; invalid parameter\n", nnn); for (nwr = 0; nwr < nnn; nwr += cnt) { cnt = nnn - nwr; if (cnt > f->size - f->cnt) cnt = f->size - f->cnt; memcpy(f->ptr, (const char *)buf + nwr, cnt); f->ptr += cnt; f->cnt += cnt; if (f->cnt == f->size) { /* buffer is full; flush it */ if (do_flush(f) != 0) return EOF; } } return nwr; } /*********************************************************************** * NAME * * glp_format - write formatted data to stream * * SYNOPSIS * * int glp_format(glp_file *f, const char *fmt, ...); * * DESCRIPTION * * The routine glp_format writes formatted data to the stream pointed * to by f. The format control string pointed to by fmt specifies how * subsequent arguments are converted for output. * * RETURNS * * The routine glp_format returns the number of characters written, or * a negative value if an output error occurs. */ int glp_format(glp_file *f, const char *fmt, ...) { ENV *env = get_env_ptr(); va_list arg; int nnn; if (!(f->flag & IOWRT)) xerror("glp_format: attempt to write to input stream\n"); va_start(arg, fmt); nnn = vsprintf(env->term_buf, fmt, arg); xassert(0 <= nnn && nnn < TBUF_SIZE); va_end(arg); return nnn == 0 ? 0 : glp_write(f, env->term_buf, nnn); } /*********************************************************************** * NAME * * glp_close - close stream * * SYNOPSIS * * int glp_close(glp_file *f); * * DESCRIPTION * * The routine glp_close closes the stream pointed to by f. * * RETURNS * * If the operation was successful, the routine returns zero, otherwise * non-zero. */ int glp_close(glp_file *f) { int ret = 0; if (f->flag & IOWRT) { if (do_flush(f) != 0) ret = EOF; } if (f->flag & (IONULL | IOSTD)) ; else if (!(f->flag & IOGZIP)) { if (fclose((FILE *)(f->file)) != 0) { if (ret == 0) #if 0 /* 29/I-2017 */ { put_err_msg(strerror(errno)); #else { put_err_msg(xstrerr(errno)); #endif ret = EOF; } } } else { int errnum; errnum = gzclose((gzFile)(f->file)); if (errnum == Z_OK) ; else if (errnum == Z_ERRNO) { if (ret == 0) #if 0 /* 29/I-2017 */ { put_err_msg(strerror(errno)); #else { put_err_msg(xstrerr(errno)); #endif ret = EOF; } } #if 1 /* FIXME */ else { if (ret == 0) { ENV *env = get_env_ptr(); sprintf(env->term_buf, "gzclose returned %d", errnum); put_err_msg(env->term_buf); ret = EOF; } } #endif } tfree(f->base); tfree(f); return ret; } /* eof */ glpk-5.0/src/env/time.c0000644000062000006210000000742013766346220014166 0ustar maomkpasswd/* time.c (standard time) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2000-2017 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifdef HAVE_CONFIG_H #include #endif #include "env.h" #include "jd.h" /*********************************************************************** * NAME * * glp_time - determine current universal time * * SYNOPSIS * * double glp_time(void); * * RETURNS * * The routine glp_time returns the current universal time (UTC), in * milliseconds, elapsed since 00:00:00 GMT January 1, 1970. */ #define EPOCH 2440588 /* = jday(1, 1, 1970) */ /* POSIX version ******************************************************/ #if defined(HAVE_SYS_TIME_H) && defined(HAVE_GETTIMEOFDAY) #if 0 /* 29/VI-2017 */ #include #include double glp_time(void) { struct timeval tv; struct tm *tm; int j; double t; gettimeofday(&tv, NULL); #if 0 /* 29/I-2017 */ tm = gmtime(&tv.tv_sec); #else tm = xgmtime(&tv.tv_sec); #endif j = jday(tm->tm_mday, tm->tm_mon + 1, 1900 + tm->tm_year); xassert(j >= 0); t = ((((double)(j - EPOCH) * 24.0 + (double)tm->tm_hour) * 60.0 + (double)tm->tm_min) * 60.0 + (double)tm->tm_sec) * 1000.0 + (double)(tv.tv_usec / 1000); return t; } #else #include double glp_time(void) { struct timeval tv; double t; gettimeofday(&tv, NULL); t = (double)tv.tv_sec + (double)(tv.tv_usec) / 1e6; xassert(0.0 <= t && t < 4294967296.0); return 1000.0 * t; } #endif /* MS Windows version *************************************************/ #elif defined(__WOE__) #include double glp_time(void) { SYSTEMTIME st; int j; double t; GetSystemTime(&st); j = jday(st.wDay, st.wMonth, st.wYear); xassert(j >= 0); t = ((((double)(j - EPOCH) * 24.0 + (double)st.wHour) * 60.0 + (double)st.wMinute) * 60.0 + (double)st.wSecond) * 1000.0 + (double)st.wMilliseconds; return t; } /* portable ANSI C version ********************************************/ #else #include double glp_time(void) { time_t timer; struct tm *tm; int j; double t; timer = time(NULL); #if 0 /* 29/I-2017 */ tm = gmtime(&timer); #else tm = xgmtime(&timer); #endif j = jday(tm->tm_mday, tm->tm_mon + 1, 1900 + tm->tm_year); xassert(j >= 0); t = ((((double)(j - EPOCH) * 24.0 + (double)tm->tm_hour) * 60.0 + (double)tm->tm_min) * 60.0 + (double)tm->tm_sec) * 1000.0; return t; } #endif /*********************************************************************** * NAME * * glp_difftime - compute difference between two time values * * SYNOPSIS * * double glp_difftime(double t1, double t0); * * RETURNS * * The routine glp_difftime returns the difference between two time * values t1 and t0, expressed in seconds. */ double glp_difftime(double t1, double t0) { return (t1 - t0) / 1000.0; } /* eof */ glpk-5.0/src/env/tls.c0000644000062000006210000000705313766346220014034 0ustar maomkpasswd/* tls.c (thread local storage) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2001-2017 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifdef HAVE_CONFIG_H #include #endif #include "env.h" #ifndef TLS static void *tls = NULL; #else static TLS void *tls = NULL; /* this option allows running multiple independent instances of GLPK in * different threads of a multi-threaded application, in which case the * variable tls should be placed in the Thread Local Storage (TLS); * it is assumed that the macro TLS is previously defined to something * like '__thread', '_Thread_local', etc. */ #endif /*********************************************************************** * NAME * * tls_set_ptr - store global pointer in TLS * * SYNOPSIS * * #include "env.h" * void tls_set_ptr(void *ptr); * * DESCRIPTION * * The routine tls_set_ptr stores a pointer specified by the parameter * ptr in the Thread Local Storage (TLS). */ void tls_set_ptr(void *ptr) { tls = ptr; return; } /*********************************************************************** * NAME * * tls_get_ptr - retrieve global pointer from TLS * * SYNOPSIS * * #include "env.h" * void *tls_get_ptr(void); * * RETURNS * * The routine tls_get_ptr returns a pointer previously stored by the * routine tls_set_ptr. If the latter has not been called yet, NULL is * returned. */ void *tls_get_ptr(void) { void *ptr; ptr = tls; return ptr; } /**********************************************************************/ #ifdef __WOE__ /*** Author: Heinrich Schuchardt ***/ #pragma comment(lib, "user32.lib") #include #define VISTA 0x06 /* This is the main entry point of the DLL. */ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { DWORD version; DWORD major_version; #ifdef TLS switch (fdwReason) { case DLL_PROCESS_ATTACH: /* @TODO: * GetVersion is deprecated but the version help functions are * not available in Visual Studio 2010. So lets use it until * we remove the outdated Build files. */ version = GetVersion(); major_version = version & 0xff; if (major_version < VISTA) { MessageBoxA(NULL, "The GLPK library called by this application is configur" "ed to use thread local storage which is not fully suppo" "rted by your version of Microsoft Windows.\n\n" "Microsoft Windows Vista or a later version of Windows i" "s required to run this application.", "GLPK", MB_OK | MB_ICONERROR); return FALSE; } break; } #endif /* TLS */ return TRUE; } #endif /* __WOE__ */ /* eof */ glpk-5.0/src/glpk.h0000644000062000006210000011571113766346220013405 0ustar maomkpasswd/* glpk.h */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2000-2020 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef GLPK_H #define GLPK_H #include #include #ifdef __cplusplus extern "C" { #endif /* library version numbers: */ #define GLP_MAJOR_VERSION 5 #define GLP_MINOR_VERSION 0 typedef struct glp_prob glp_prob; /* LP/MIP problem object */ /* optimization direction flag: */ #define GLP_MIN 1 /* minimization */ #define GLP_MAX 2 /* maximization */ /* kind of structural variable: */ #define GLP_CV 1 /* continuous variable */ #define GLP_IV 2 /* integer variable */ #define GLP_BV 3 /* binary variable */ /* type of auxiliary/structural variable: */ #define GLP_FR 1 /* free (unbounded) variable */ #define GLP_LO 2 /* variable with lower bound */ #define GLP_UP 3 /* variable with upper bound */ #define GLP_DB 4 /* double-bounded variable */ #define GLP_FX 5 /* fixed variable */ /* status of auxiliary/structural variable: */ #define GLP_BS 1 /* basic variable */ #define GLP_NL 2 /* non-basic variable on lower bound */ #define GLP_NU 3 /* non-basic variable on upper bound */ #define GLP_NF 4 /* non-basic free (unbounded) variable */ #define GLP_NS 5 /* non-basic fixed variable */ /* scaling options: */ #define GLP_SF_GM 0x01 /* perform geometric mean scaling */ #define GLP_SF_EQ 0x10 /* perform equilibration scaling */ #define GLP_SF_2N 0x20 /* round scale factors to power of two */ #define GLP_SF_SKIP 0x40 /* skip if problem is well scaled */ #define GLP_SF_AUTO 0x80 /* choose scaling options automatically */ /* solution indicator: */ #define GLP_SOL 1 /* basic solution */ #define GLP_IPT 2 /* interior-point solution */ #define GLP_MIP 3 /* mixed integer solution */ /* solution status: */ #define GLP_UNDEF 1 /* solution is undefined */ #define GLP_FEAS 2 /* solution is feasible */ #define GLP_INFEAS 3 /* solution is infeasible */ #define GLP_NOFEAS 4 /* no feasible solution exists */ #define GLP_OPT 5 /* solution is optimal */ #define GLP_UNBND 6 /* solution is unbounded */ typedef struct { /* basis factorization control parameters */ int msg_lev; /* (not used) */ int type; /* factorization type: */ #if 1 /* 05/III-2014 */ #define GLP_BF_LUF 0x00 /* plain LU-factorization */ #define GLP_BF_BTF 0x10 /* block triangular LU-factorization */ #endif #define GLP_BF_FT 0x01 /* Forrest-Tomlin (LUF only) */ #define GLP_BF_BG 0x02 /* Schur compl. + Bartels-Golub */ #define GLP_BF_GR 0x03 /* Schur compl. + Givens rotation */ int lu_size; /* (not used) */ double piv_tol; /* sgf_piv_tol */ int piv_lim; /* sgf_piv_lim */ int suhl; /* sgf_suhl */ double eps_tol; /* sgf_eps_tol */ double max_gro; /* (not used) */ int nfs_max; /* fhvint.nfs_max */ double upd_tol; /* (not used) */ int nrs_max; /* scfint.nn_max */ int rs_size; /* (not used) */ double foo_bar[38]; /* (reserved) */ } glp_bfcp; typedef struct { /* simplex solver control parameters */ int msg_lev; /* message level: */ #define GLP_MSG_OFF 0 /* no output */ #define GLP_MSG_ERR 1 /* warning and error messages only */ #define GLP_MSG_ON 2 /* normal output */ #define GLP_MSG_ALL 3 /* full output */ #define GLP_MSG_DBG 4 /* debug output */ int meth; /* simplex method option: */ #define GLP_PRIMAL 1 /* use primal simplex */ #define GLP_DUALP 2 /* use dual; if it fails, use primal */ #define GLP_DUAL 3 /* use dual simplex */ int pricing; /* pricing technique: */ #define GLP_PT_STD 0x11 /* standard (Dantzig's rule) */ #define GLP_PT_PSE 0x22 /* projected steepest edge */ int r_test; /* ratio test technique: */ #define GLP_RT_STD 0x11 /* standard (textbook) */ #define GLP_RT_HAR 0x22 /* Harris' two-pass ratio test */ #if 1 /* 16/III-2016 */ #define GLP_RT_FLIP 0x33 /* long-step (flip-flop) ratio test */ #endif double tol_bnd; /* primal feasibility tolerance */ double tol_dj; /* dual feasibility tolerance */ double tol_piv; /* pivot tolerance */ double obj_ll; /* lower objective limit */ double obj_ul; /* upper objective limit */ int it_lim; /* simplex iteration limit */ int tm_lim; /* time limit, ms */ int out_frq; /* display output frequency, ms */ int out_dly; /* display output delay, ms */ int presolve; /* enable/disable using LP presolver */ #if 1 /* 11/VII-2017 (not documented yet) */ int excl; /* exclude fixed non-basic variables */ int shift; /* shift bounds of variables to zero */ int aorn; /* option to use A or N: */ #define GLP_USE_AT 1 /* use A matrix in row-wise format */ #define GLP_USE_NT 2 /* use N matrix in row-wise format */ double foo_bar[33]; /* (reserved) */ #endif } glp_smcp; typedef struct { /* interior-point solver control parameters */ int msg_lev; /* message level (see glp_smcp) */ int ord_alg; /* ordering algorithm: */ #define GLP_ORD_NONE 0 /* natural (original) ordering */ #define GLP_ORD_QMD 1 /* quotient minimum degree (QMD) */ #define GLP_ORD_AMD 2 /* approx. minimum degree (AMD) */ #define GLP_ORD_SYMAMD 3 /* approx. minimum degree (SYMAMD) */ double foo_bar[48]; /* (reserved) */ } glp_iptcp; typedef struct glp_tree glp_tree; /* branch-and-bound tree */ typedef struct { /* integer optimizer control parameters */ int msg_lev; /* message level (see glp_smcp) */ int br_tech; /* branching technique: */ #define GLP_BR_FFV 1 /* first fractional variable */ #define GLP_BR_LFV 2 /* last fractional variable */ #define GLP_BR_MFV 3 /* most fractional variable */ #define GLP_BR_DTH 4 /* heuristic by Driebeck and Tomlin */ #define GLP_BR_PCH 5 /* hybrid pseudocost heuristic */ int bt_tech; /* backtracking technique: */ #define GLP_BT_DFS 1 /* depth first search */ #define GLP_BT_BFS 2 /* breadth first search */ #define GLP_BT_BLB 3 /* best local bound */ #define GLP_BT_BPH 4 /* best projection heuristic */ double tol_int; /* mip.tol_int */ double tol_obj; /* mip.tol_obj */ int tm_lim; /* mip.tm_lim (milliseconds) */ int out_frq; /* mip.out_frq (milliseconds) */ int out_dly; /* mip.out_dly (milliseconds) */ void (*cb_func)(glp_tree *T, void *info); /* mip.cb_func */ void *cb_info; /* mip.cb_info */ int cb_size; /* mip.cb_size */ int pp_tech; /* preprocessing technique: */ #define GLP_PP_NONE 0 /* disable preprocessing */ #define GLP_PP_ROOT 1 /* preprocessing only on root level */ #define GLP_PP_ALL 2 /* preprocessing on all levels */ double mip_gap; /* relative MIP gap tolerance */ int mir_cuts; /* MIR cuts (GLP_ON/GLP_OFF) */ int gmi_cuts; /* Gomory's cuts (GLP_ON/GLP_OFF) */ int cov_cuts; /* cover cuts (GLP_ON/GLP_OFF) */ int clq_cuts; /* clique cuts (GLP_ON/GLP_OFF) */ int presolve; /* enable/disable using MIP presolver */ int binarize; /* try to binarize integer variables */ int fp_heur; /* feasibility pump heuristic */ int ps_heur; /* proximity search heuristic */ int ps_tm_lim; /* proxy time limit, milliseconds */ int sr_heur; /* simple rounding heuristic */ #if 1 /* 24/X-2015; not documented--should not be used */ int use_sol; /* use existing solution */ const char *save_sol; /* filename to save every new solution */ int alien; /* use alien solver */ #endif #if 1 /* 16/III-2016; not documented--should not be used */ int flip; /* use long-step dual simplex */ #endif double foo_bar[23]; /* (reserved) */ } glp_iocp; typedef struct { /* additional row attributes */ int level; /* subproblem level at which the row was added */ int origin; /* row origin flag: */ #define GLP_RF_REG 0 /* regular constraint */ #define GLP_RF_LAZY 1 /* "lazy" constraint */ #define GLP_RF_CUT 2 /* cutting plane constraint */ int klass; /* row class descriptor: */ #define GLP_RF_GMI 1 /* Gomory's mixed integer cut */ #define GLP_RF_MIR 2 /* mixed integer rounding cut */ #define GLP_RF_COV 3 /* mixed cover cut */ #define GLP_RF_CLQ 4 /* clique cut */ double foo_bar[7]; /* (reserved) */ } glp_attr; /* enable/disable flag: */ #define GLP_ON 1 /* enable something */ #define GLP_OFF 0 /* disable something */ /* reason codes: */ #define GLP_IROWGEN 0x01 /* request for row generation */ #define GLP_IBINGO 0x02 /* better integer solution found */ #define GLP_IHEUR 0x03 /* request for heuristic solution */ #define GLP_ICUTGEN 0x04 /* request for cut generation */ #define GLP_IBRANCH 0x05 /* request for branching */ #define GLP_ISELECT 0x06 /* request for subproblem selection */ #define GLP_IPREPRO 0x07 /* request for preprocessing */ /* branch selection indicator: */ #define GLP_NO_BRNCH 0 /* select no branch */ #define GLP_DN_BRNCH 1 /* select down-branch */ #define GLP_UP_BRNCH 2 /* select up-branch */ /* return codes: */ #define GLP_EBADB 0x01 /* invalid basis */ #define GLP_ESING 0x02 /* singular matrix */ #define GLP_ECOND 0x03 /* ill-conditioned matrix */ #define GLP_EBOUND 0x04 /* invalid bounds */ #define GLP_EFAIL 0x05 /* solver failed */ #define GLP_EOBJLL 0x06 /* objective lower limit reached */ #define GLP_EOBJUL 0x07 /* objective upper limit reached */ #define GLP_EITLIM 0x08 /* iteration limit exceeded */ #define GLP_ETMLIM 0x09 /* time limit exceeded */ #define GLP_ENOPFS 0x0A /* no primal feasible solution */ #define GLP_ENODFS 0x0B /* no dual feasible solution */ #define GLP_EROOT 0x0C /* root LP optimum not provided */ #define GLP_ESTOP 0x0D /* search terminated by application */ #define GLP_EMIPGAP 0x0E /* relative mip gap tolerance reached */ #define GLP_ENOFEAS 0x0F /* no primal/dual feasible solution */ #define GLP_ENOCVG 0x10 /* no convergence */ #define GLP_EINSTAB 0x11 /* numerical instability */ #define GLP_EDATA 0x12 /* invalid data */ #define GLP_ERANGE 0x13 /* result out of range */ /* condition indicator: */ #define GLP_KKT_PE 1 /* primal equalities */ #define GLP_KKT_PB 2 /* primal bounds */ #define GLP_KKT_DE 3 /* dual equalities */ #define GLP_KKT_DB 4 /* dual bounds */ #define GLP_KKT_CS 5 /* complementary slackness */ /* MPS file format: */ #define GLP_MPS_DECK 1 /* fixed (ancient) */ #define GLP_MPS_FILE 2 /* free (modern) */ typedef struct { /* MPS format control parameters */ int blank; /* character code to replace blanks in symbolic names */ char *obj_name; /* objective row name */ double tol_mps; /* zero tolerance for MPS data */ double foo_bar[17]; /* (reserved for use in the future) */ } glp_mpscp; typedef struct { /* CPLEX LP format control parameters */ double foo_bar[20]; /* (reserved for use in the future) */ } glp_cpxcp; #if 1 /* 10/XII-2017 */ typedef struct glp_prep glp_prep; /* LP/MIP preprocessor workspace */ #endif typedef struct glp_tran glp_tran; /* MathProg translator workspace */ glp_prob *glp_create_prob(void); /* create problem object */ void glp_set_prob_name(glp_prob *P, const char *name); /* assign (change) problem name */ void glp_set_obj_name(glp_prob *P, const char *name); /* assign (change) objective function name */ void glp_set_obj_dir(glp_prob *P, int dir); /* set (change) optimization direction flag */ int glp_add_rows(glp_prob *P, int nrs); /* add new rows to problem object */ int glp_add_cols(glp_prob *P, int ncs); /* add new columns to problem object */ void glp_set_row_name(glp_prob *P, int i, const char *name); /* assign (change) row name */ void glp_set_col_name(glp_prob *P, int j, const char *name); /* assign (change) column name */ void glp_set_row_bnds(glp_prob *P, int i, int type, double lb, double ub); /* set (change) row bounds */ void glp_set_col_bnds(glp_prob *P, int j, int type, double lb, double ub); /* set (change) column bounds */ void glp_set_obj_coef(glp_prob *P, int j, double coef); /* set (change) obj. coefficient or constant term */ void glp_set_mat_row(glp_prob *P, int i, int len, const int ind[], const double val[]); /* set (replace) row of the constraint matrix */ void glp_set_mat_col(glp_prob *P, int j, int len, const int ind[], const double val[]); /* set (replace) column of the constraint matrix */ void glp_load_matrix(glp_prob *P, int ne, const int ia[], const int ja[], const double ar[]); /* load (replace) the whole constraint matrix */ int glp_check_dup(int m, int n, int ne, const int ia[], const int ja[]); /* check for duplicate elements in sparse matrix */ void glp_sort_matrix(glp_prob *P); /* sort elements of the constraint matrix */ void glp_del_rows(glp_prob *P, int nrs, const int num[]); /* delete specified rows from problem object */ void glp_del_cols(glp_prob *P, int ncs, const int num[]); /* delete specified columns from problem object */ void glp_copy_prob(glp_prob *dest, glp_prob *prob, int names); /* copy problem object content */ void glp_erase_prob(glp_prob *P); /* erase problem object content */ void glp_delete_prob(glp_prob *P); /* delete problem object */ const char *glp_get_prob_name(glp_prob *P); /* retrieve problem name */ const char *glp_get_obj_name(glp_prob *P); /* retrieve objective function name */ int glp_get_obj_dir(glp_prob *P); /* retrieve optimization direction flag */ int glp_get_num_rows(glp_prob *P); /* retrieve number of rows */ int glp_get_num_cols(glp_prob *P); /* retrieve number of columns */ const char *glp_get_row_name(glp_prob *P, int i); /* retrieve row name */ const char *glp_get_col_name(glp_prob *P, int j); /* retrieve column name */ int glp_get_row_type(glp_prob *P, int i); /* retrieve row type */ double glp_get_row_lb(glp_prob *P, int i); /* retrieve row lower bound */ double glp_get_row_ub(glp_prob *P, int i); /* retrieve row upper bound */ int glp_get_col_type(glp_prob *P, int j); /* retrieve column type */ double glp_get_col_lb(glp_prob *P, int j); /* retrieve column lower bound */ double glp_get_col_ub(glp_prob *P, int j); /* retrieve column upper bound */ double glp_get_obj_coef(glp_prob *P, int j); /* retrieve obj. coefficient or constant term */ int glp_get_num_nz(glp_prob *P); /* retrieve number of constraint coefficients */ int glp_get_mat_row(glp_prob *P, int i, int ind[], double val[]); /* retrieve row of the constraint matrix */ int glp_get_mat_col(glp_prob *P, int j, int ind[], double val[]); /* retrieve column of the constraint matrix */ void glp_create_index(glp_prob *P); /* create the name index */ int glp_find_row(glp_prob *P, const char *name); /* find row by its name */ int glp_find_col(glp_prob *P, const char *name); /* find column by its name */ void glp_delete_index(glp_prob *P); /* delete the name index */ void glp_set_rii(glp_prob *P, int i, double rii); /* set (change) row scale factor */ void glp_set_sjj(glp_prob *P, int j, double sjj); /* set (change) column scale factor */ double glp_get_rii(glp_prob *P, int i); /* retrieve row scale factor */ double glp_get_sjj(glp_prob *P, int j); /* retrieve column scale factor */ void glp_scale_prob(glp_prob *P, int flags); /* scale problem data */ void glp_unscale_prob(glp_prob *P); /* unscale problem data */ void glp_set_row_stat(glp_prob *P, int i, int stat); /* set (change) row status */ void glp_set_col_stat(glp_prob *P, int j, int stat); /* set (change) column status */ void glp_std_basis(glp_prob *P); /* construct standard initial LP basis */ void glp_adv_basis(glp_prob *P, int flags); /* construct advanced initial LP basis */ void glp_cpx_basis(glp_prob *P); /* construct Bixby's initial LP basis */ int glp_simplex(glp_prob *P, const glp_smcp *parm); /* solve LP problem with the simplex method */ int glp_exact(glp_prob *P, const glp_smcp *parm); /* solve LP problem in exact arithmetic */ void glp_init_smcp(glp_smcp *parm); /* initialize simplex method control parameters */ int glp_get_status(glp_prob *P); /* retrieve generic status of basic solution */ int glp_get_prim_stat(glp_prob *P); /* retrieve status of primal basic solution */ int glp_get_dual_stat(glp_prob *P); /* retrieve status of dual basic solution */ double glp_get_obj_val(glp_prob *P); /* retrieve objective value (basic solution) */ int glp_get_row_stat(glp_prob *P, int i); /* retrieve row status */ double glp_get_row_prim(glp_prob *P, int i); /* retrieve row primal value (basic solution) */ double glp_get_row_dual(glp_prob *P, int i); /* retrieve row dual value (basic solution) */ int glp_get_col_stat(glp_prob *P, int j); /* retrieve column status */ double glp_get_col_prim(glp_prob *P, int j); /* retrieve column primal value (basic solution) */ double glp_get_col_dual(glp_prob *P, int j); /* retrieve column dual value (basic solution) */ int glp_get_unbnd_ray(glp_prob *P); /* determine variable causing unboundedness */ #if 1 /* 08/VIII-2013; not documented yet */ int glp_get_it_cnt(glp_prob *P); /* get simplex solver iteration count */ #endif #if 1 /* 08/VIII-2013; not documented yet */ void glp_set_it_cnt(glp_prob *P, int it_cnt); /* set simplex solver iteration count */ #endif int glp_interior(glp_prob *P, const glp_iptcp *parm); /* solve LP problem with the interior-point method */ void glp_init_iptcp(glp_iptcp *parm); /* initialize interior-point solver control parameters */ int glp_ipt_status(glp_prob *P); /* retrieve status of interior-point solution */ double glp_ipt_obj_val(glp_prob *P); /* retrieve objective value (interior point) */ double glp_ipt_row_prim(glp_prob *P, int i); /* retrieve row primal value (interior point) */ double glp_ipt_row_dual(glp_prob *P, int i); /* retrieve row dual value (interior point) */ double glp_ipt_col_prim(glp_prob *P, int j); /* retrieve column primal value (interior point) */ double glp_ipt_col_dual(glp_prob *P, int j); /* retrieve column dual value (interior point) */ void glp_set_col_kind(glp_prob *P, int j, int kind); /* set (change) column kind */ int glp_get_col_kind(glp_prob *P, int j); /* retrieve column kind */ int glp_get_num_int(glp_prob *P); /* retrieve number of integer columns */ int glp_get_num_bin(glp_prob *P); /* retrieve number of binary columns */ int glp_intopt(glp_prob *P, const glp_iocp *parm); /* solve MIP problem with the branch-and-bound method */ void glp_init_iocp(glp_iocp *parm); /* initialize integer optimizer control parameters */ int glp_mip_status(glp_prob *P); /* retrieve status of MIP solution */ double glp_mip_obj_val(glp_prob *P); /* retrieve objective value (MIP solution) */ double glp_mip_row_val(glp_prob *P, int i); /* retrieve row value (MIP solution) */ double glp_mip_col_val(glp_prob *P, int j); /* retrieve column value (MIP solution) */ void glp_check_kkt(glp_prob *P, int sol, int cond, double *ae_max, int *ae_ind, double *re_max, int *re_ind); /* check feasibility/optimality conditions */ int glp_print_sol(glp_prob *P, const char *fname); /* write basic solution in printable format */ int glp_read_sol(glp_prob *P, const char *fname); /* read basic solution from text file */ int glp_write_sol(glp_prob *P, const char *fname); /* write basic solution to text file */ int glp_print_ranges(glp_prob *P, int len, const int list[], int flags, const char *fname); /* print sensitivity analysis report */ int glp_print_ipt(glp_prob *P, const char *fname); /* write interior-point solution in printable format */ int glp_read_ipt(glp_prob *P, const char *fname); /* read interior-point solution from text file */ int glp_write_ipt(glp_prob *P, const char *fname); /* write interior-point solution to text file */ int glp_print_mip(glp_prob *P, const char *fname); /* write MIP solution in printable format */ int glp_read_mip(glp_prob *P, const char *fname); /* read MIP solution from text file */ int glp_write_mip(glp_prob *P, const char *fname); /* write MIP solution to text file */ int glp_bf_exists(glp_prob *P); /* check if LP basis factorization exists */ int glp_factorize(glp_prob *P); /* compute LP basis factorization */ int glp_bf_updated(glp_prob *P); /* check if LP basis factorization has been updated */ void glp_get_bfcp(glp_prob *P, glp_bfcp *parm); /* retrieve LP basis factorization control parameters */ void glp_set_bfcp(glp_prob *P, const glp_bfcp *parm); /* change LP basis factorization control parameters */ int glp_get_bhead(glp_prob *P, int k); /* retrieve LP basis header information */ int glp_get_row_bind(glp_prob *P, int i); /* retrieve row index in the basis header */ int glp_get_col_bind(glp_prob *P, int j); /* retrieve column index in the basis header */ void glp_ftran(glp_prob *P, double x[]); /* perform forward transformation (solve system B*x = b) */ void glp_btran(glp_prob *P, double x[]); /* perform backward transformation (solve system B'*x = b) */ int glp_warm_up(glp_prob *P); /* "warm up" LP basis */ int glp_eval_tab_row(glp_prob *P, int k, int ind[], double val[]); /* compute row of the simplex tableau */ int glp_eval_tab_col(glp_prob *P, int k, int ind[], double val[]); /* compute column of the simplex tableau */ int glp_transform_row(glp_prob *P, int len, int ind[], double val[]); /* transform explicitly specified row */ int glp_transform_col(glp_prob *P, int len, int ind[], double val[]); /* transform explicitly specified column */ int glp_prim_rtest(glp_prob *P, int len, const int ind[], const double val[], int dir, double eps); /* perform primal ratio test */ int glp_dual_rtest(glp_prob *P, int len, const int ind[], const double val[], int dir, double eps); /* perform dual ratio test */ void glp_analyze_bound(glp_prob *P, int k, double *value1, int *var1, double *value2, int *var2); /* analyze active bound of non-basic variable */ void glp_analyze_coef(glp_prob *P, int k, double *coef1, int *var1, double *value1, double *coef2, int *var2, double *value2); /* analyze objective coefficient at basic variable */ #if 1 /* 10/XII-2017 */ glp_prep *glp_npp_alloc_wksp(void); /* allocate the preprocessor workspace */ void glp_npp_load_prob(glp_prep *prep, glp_prob *P, int sol, int names); /* load original problem instance */ int glp_npp_preprocess1(glp_prep *prep, int hard); /* perform basic LP/MIP preprocessing */ void glp_npp_build_prob(glp_prep *prep, glp_prob *Q); /* build resultant problem instance */ void glp_npp_postprocess(glp_prep *prep, glp_prob *Q); /* postprocess solution to resultant problem */ void glp_npp_obtain_sol(glp_prep *prep, glp_prob *P); /* obtain solution to original problem */ void glp_npp_free_wksp(glp_prep *prep); /* free the preprocessor workspace */ #endif int glp_ios_reason(glp_tree *T); /* determine reason for calling the callback routine */ glp_prob *glp_ios_get_prob(glp_tree *T); /* access the problem object */ void glp_ios_tree_size(glp_tree *T, int *a_cnt, int *n_cnt, int *t_cnt); /* determine size of the branch-and-bound tree */ int glp_ios_curr_node(glp_tree *T); /* determine current active subproblem */ int glp_ios_next_node(glp_tree *T, int p); /* determine next active subproblem */ int glp_ios_prev_node(glp_tree *T, int p); /* determine previous active subproblem */ int glp_ios_up_node(glp_tree *T, int p); /* determine parent subproblem */ int glp_ios_node_level(glp_tree *T, int p); /* determine subproblem level */ double glp_ios_node_bound(glp_tree *T, int p); /* determine subproblem local bound */ int glp_ios_best_node(glp_tree *T); /* find active subproblem with best local bound */ double glp_ios_mip_gap(glp_tree *T); /* compute relative MIP gap */ void *glp_ios_node_data(glp_tree *T, int p); /* access subproblem application-specific data */ void glp_ios_row_attr(glp_tree *T, int i, glp_attr *attr); /* retrieve additional row attributes */ int glp_ios_pool_size(glp_tree *T); /* determine current size of the cut pool */ int glp_ios_add_row(glp_tree *T, const char *name, int klass, int flags, int len, const int ind[], const double val[], int type, double rhs); /* add row (constraint) to the cut pool */ void glp_ios_del_row(glp_tree *T, int i); /* remove row (constraint) from the cut pool */ void glp_ios_clear_pool(glp_tree *T); /* remove all rows (constraints) from the cut pool */ int glp_ios_can_branch(glp_tree *T, int j); /* check if can branch upon specified variable */ void glp_ios_branch_upon(glp_tree *T, int j, int sel); /* choose variable to branch upon */ void glp_ios_select_node(glp_tree *T, int p); /* select subproblem to continue the search */ int glp_ios_heur_sol(glp_tree *T, const double x[]); /* provide solution found by heuristic */ void glp_ios_terminate(glp_tree *T); /* terminate the solution process */ #ifdef GLP_UNDOC int glp_gmi_cut(glp_prob *P, int j, int ind[], double val[], double phi[]); /* generate Gomory's mixed integer cut (core routine) */ int glp_gmi_gen(glp_prob *P, glp_prob *pool, int max_cuts); /* generate Gomory's mixed integer cuts */ typedef struct glp_cov glp_cov; /* cover cur generator workspace */ glp_cov *glp_cov_init(glp_prob *P); /* create and initialize cover cut generator */ void glp_cov_gen1(glp_prob *P, glp_cov *cov, glp_prob *pool); /* generate locally valid simple cover cuts */ void glp_cov_free(glp_cov *cov); /* delete cover cut generator workspace */ typedef struct glp_mir glp_mir; /* MIR cut generator workspace */ glp_mir *glp_mir_init(glp_prob *P); /* create and initialize MIR cut generator */ int glp_mir_gen(glp_prob *P, glp_mir *mir, glp_prob *pool); /* generate mixed integer rounding (MIR) cuts */ void glp_mir_free(glp_mir *mir); /* delete MIR cut generator workspace */ typedef struct glp_cfg glp_cfg; /* conflict graph descriptor */ glp_cfg *glp_cfg_init(glp_prob *P); /* create and initialize conflict graph */ void glp_cfg_free(glp_cfg *G); /* delete conflict graph descriptor */ int glp_clq_cut(glp_prob *P, glp_cfg *G, int ind[], double val[]); /* generate clique cut from conflict graph */ #endif /* GLP_UNDOC */ void glp_init_mpscp(glp_mpscp *parm); /* initialize MPS format control parameters */ int glp_read_mps(glp_prob *P, int fmt, const glp_mpscp *parm, const char *fname); /* read problem data in MPS format */ int glp_write_mps(glp_prob *P, int fmt, const glp_mpscp *parm, const char *fname); /* write problem data in MPS format */ void glp_init_cpxcp(glp_cpxcp *parm); /* initialize CPLEX LP format control parameters */ int glp_read_lp(glp_prob *P, const glp_cpxcp *parm, const char *fname); /* read problem data in CPLEX LP format */ int glp_write_lp(glp_prob *P, const glp_cpxcp *parm, const char *fname); /* write problem data in CPLEX LP format */ int glp_read_prob(glp_prob *P, int flags, const char *fname); /* read problem data in GLPK format */ int glp_write_prob(glp_prob *P, int flags, const char *fname); /* write problem data in GLPK format */ glp_tran *glp_mpl_alloc_wksp(void); /* allocate the MathProg translator workspace */ void glp_mpl_init_rand(glp_tran *tran, int seed); /* initialize pseudo-random number generator */ int glp_mpl_read_model(glp_tran *tran, const char *fname, int skip); /* read and translate model section */ int glp_mpl_read_data(glp_tran *tran, const char *fname); /* read and translate data section */ int glp_mpl_generate(glp_tran *tran, const char *fname); /* generate the model */ void glp_mpl_build_prob(glp_tran *tran, glp_prob *prob); /* build LP/MIP problem instance from the model */ int glp_mpl_postsolve(glp_tran *tran, glp_prob *prob, int sol); /* postsolve the model */ void glp_mpl_free_wksp(glp_tran *tran); /* free the MathProg translator workspace */ int glp_read_cnfsat(glp_prob *P, const char *fname); /* read CNF-SAT problem data in DIMACS format */ int glp_check_cnfsat(glp_prob *P); /* check for CNF-SAT problem instance */ int glp_write_cnfsat(glp_prob *P, const char *fname); /* write CNF-SAT problem data in DIMACS format */ int glp_minisat1(glp_prob *P); /* solve CNF-SAT problem with MiniSat solver */ int glp_intfeas1(glp_prob *P, int use_bound, int obj_bound); /* solve integer feasibility problem */ int glp_init_env(void); /* initialize GLPK environment */ const char *glp_version(void); /* determine library version */ const char *glp_config(const char *option); /* determine library configuration */ int glp_free_env(void); /* free GLPK environment */ void glp_puts(const char *s); /* write string on terminal */ void glp_printf(const char *fmt, ...); /* write formatted output on terminal */ void glp_vprintf(const char *fmt, va_list arg); /* write formatted output on terminal */ int glp_term_out(int flag); /* enable/disable terminal output */ void glp_term_hook(int (*func)(void *info, const char *s), void *info); /* install hook to intercept terminal output */ int glp_open_tee(const char *name); /* start copying terminal output to text file */ int glp_close_tee(void); /* stop copying terminal output to text file */ #ifndef GLP_ERRFUNC_DEFINED #define GLP_ERRFUNC_DEFINED typedef void (*glp_errfunc)(const char *fmt, ...); #endif #define glp_error glp_error_(__FILE__, __LINE__) glp_errfunc glp_error_(const char *file, int line); /* display fatal error message and terminate execution */ #if 1 /* 07/XI-2015 */ int glp_at_error(void); /* check for error state */ #endif #define glp_assert(expr) \ ((void)((expr) || (glp_assert_(#expr, __FILE__, __LINE__), 1))) void glp_assert_(const char *expr, const char *file, int line); /* check for logical condition */ void glp_error_hook(void (*func)(void *info), void *info); /* install hook to intercept abnormal termination */ #define glp_malloc(size) glp_alloc(1, size) /* allocate memory block (obsolete) */ #define glp_calloc(n, size) glp_alloc(n, size) /* allocate memory block (obsolete) */ void *glp_alloc(int n, int size); /* allocate memory block */ void *glp_realloc(void *ptr, int n, int size); /* reallocate memory block */ void glp_free(void *ptr); /* free (deallocate) memory block */ void glp_mem_limit(int limit); /* set memory usage limit */ void glp_mem_usage(int *count, int *cpeak, size_t *total, size_t *tpeak); /* get memory usage information */ double glp_time(void); /* determine current universal time */ double glp_difftime(double t1, double t0); /* compute difference between two time values */ typedef struct glp_graph glp_graph; typedef struct glp_vertex glp_vertex; typedef struct glp_arc glp_arc; struct glp_graph { /* graph descriptor */ void *pool; /* DMP *pool; */ /* memory pool to store graph components */ char *name; /* graph name (1 to 255 chars); NULL means no name is assigned to the graph */ int nv_max; /* length of the vertex list (enlarged automatically) */ int nv; /* number of vertices in the graph, 0 <= nv <= nv_max */ int na; /* number of arcs in the graph, na >= 0 */ glp_vertex **v; /* glp_vertex *v[1+nv_max]; */ /* v[i], 1 <= i <= nv, is a pointer to i-th vertex */ void *index; /* AVL *index; */ /* vertex index to find vertices by their names; NULL means the index does not exist */ int v_size; /* size of data associated with each vertex (0 to 256 bytes) */ int a_size; /* size of data associated with each arc (0 to 256 bytes) */ }; struct glp_vertex { /* vertex descriptor */ int i; /* vertex ordinal number, 1 <= i <= nv */ char *name; /* vertex name (1 to 255 chars); NULL means no name is assigned to the vertex */ void *entry; /* AVLNODE *entry; */ /* pointer to corresponding entry in the vertex index; NULL means that either the index does not exist or the vertex has no name assigned */ void *data; /* pointer to data associated with the vertex */ void *temp; /* working pointer */ glp_arc *in; /* pointer to the (unordered) list of incoming arcs */ glp_arc *out; /* pointer to the (unordered) list of outgoing arcs */ }; struct glp_arc { /* arc descriptor */ glp_vertex *tail; /* pointer to the tail endpoint */ glp_vertex *head; /* pointer to the head endpoint */ void *data; /* pointer to data associated with the arc */ void *temp; /* working pointer */ glp_arc *t_prev; /* pointer to previous arc having the same tail endpoint */ glp_arc *t_next; /* pointer to next arc having the same tail endpoint */ glp_arc *h_prev; /* pointer to previous arc having the same head endpoint */ glp_arc *h_next; /* pointer to next arc having the same head endpoint */ }; glp_graph *glp_create_graph(int v_size, int a_size); /* create graph */ void glp_set_graph_name(glp_graph *G, const char *name); /* assign (change) graph name */ int glp_add_vertices(glp_graph *G, int nadd); /* add new vertices to graph */ void glp_set_vertex_name(glp_graph *G, int i, const char *name); /* assign (change) vertex name */ glp_arc *glp_add_arc(glp_graph *G, int i, int j); /* add new arc to graph */ void glp_del_vertices(glp_graph *G, int ndel, const int num[]); /* delete vertices from graph */ void glp_del_arc(glp_graph *G, glp_arc *a); /* delete arc from graph */ void glp_erase_graph(glp_graph *G, int v_size, int a_size); /* erase graph content */ void glp_delete_graph(glp_graph *G); /* delete graph */ void glp_create_v_index(glp_graph *G); /* create vertex name index */ int glp_find_vertex(glp_graph *G, const char *name); /* find vertex by its name */ void glp_delete_v_index(glp_graph *G); /* delete vertex name index */ int glp_read_graph(glp_graph *G, const char *fname); /* read graph from plain text file */ int glp_write_graph(glp_graph *G, const char *fname); /* write graph to plain text file */ void glp_mincost_lp(glp_prob *P, glp_graph *G, int names, int v_rhs, int a_low, int a_cap, int a_cost); /* convert minimum cost flow problem to LP */ int glp_mincost_okalg(glp_graph *G, int v_rhs, int a_low, int a_cap, int a_cost, double *sol, int a_x, int v_pi); /* find minimum-cost flow with out-of-kilter algorithm */ int glp_mincost_relax4(glp_graph *G, int v_rhs, int a_low, int a_cap, int a_cost, int crash, double *sol, int a_x, int a_rc); /* find minimum-cost flow with Bertsekas-Tseng relaxation method */ void glp_maxflow_lp(glp_prob *P, glp_graph *G, int names, int s, int t, int a_cap); /* convert maximum flow problem to LP */ int glp_maxflow_ffalg(glp_graph *G, int s, int t, int a_cap, double *sol, int a_x, int v_cut); /* find maximal flow with Ford-Fulkerson algorithm */ int glp_check_asnprob(glp_graph *G, int v_set); /* check correctness of assignment problem data */ /* assignment problem formulation: */ #define GLP_ASN_MIN 1 /* perfect matching (minimization) */ #define GLP_ASN_MAX 2 /* perfect matching (maximization) */ #define GLP_ASN_MMP 3 /* maximum matching */ int glp_asnprob_lp(glp_prob *P, int form, glp_graph *G, int names, int v_set, int a_cost); /* convert assignment problem to LP */ int glp_asnprob_okalg(int form, glp_graph *G, int v_set, int a_cost, double *sol, int a_x); /* solve assignment problem with out-of-kilter algorithm */ int glp_asnprob_hall(glp_graph *G, int v_set, int a_x); /* find bipartite matching of maximum cardinality */ double glp_cpp(glp_graph *G, int v_t, int v_es, int v_ls); /* solve critical path problem */ int glp_read_mincost(glp_graph *G, int v_rhs, int a_low, int a_cap, int a_cost, const char *fname); /* read min-cost flow problem data in DIMACS format */ int glp_write_mincost(glp_graph *G, int v_rhs, int a_low, int a_cap, int a_cost, const char *fname); /* write min-cost flow problem data in DIMACS format */ int glp_read_maxflow(glp_graph *G, int *s, int *t, int a_cap, const char *fname); /* read maximum flow problem data in DIMACS format */ int glp_write_maxflow(glp_graph *G, int s, int t, int a_cap, const char *fname); /* write maximum flow problem data in DIMACS format */ int glp_read_asnprob(glp_graph *G, int v_set, int a_cost, const char *fname); /* read assignment problem data in DIMACS format */ int glp_write_asnprob(glp_graph *G, int v_set, int a_cost, const char *fname); /* write assignment problem data in DIMACS format */ int glp_read_ccdata(glp_graph *G, int v_wgt, const char *fname); /* read graph in DIMACS clique/coloring format */ int glp_write_ccdata(glp_graph *G, int v_wgt, const char *fname); /* write graph in DIMACS clique/coloring format */ int glp_netgen(glp_graph *G, int v_rhs, int a_cap, int a_cost, const int parm[1+15]); /* Klingman's network problem generator */ void glp_netgen_prob(int nprob, int parm[1+15]); /* Klingman's standard network problem instance */ int glp_gridgen(glp_graph *G, int v_rhs, int a_cap, int a_cost, const int parm[1+14]); /* grid-like network problem generator */ int glp_rmfgen(glp_graph *G, int *s, int *t, int a_cap, const int parm[1+5]); /* Goldfarb's maximum flow problem generator */ int glp_weak_comp(glp_graph *G, int v_num); /* find all weakly connected components of graph */ int glp_strong_comp(glp_graph *G, int v_num); /* find all strongly connected components of graph */ int glp_top_sort(glp_graph *G, int v_num); /* topological sorting of acyclic digraph */ int glp_wclique_exact(glp_graph *G, int v_wgt, double *sol, int v_set); /* find maximum weight clique with exact algorithm */ #ifdef __cplusplus } #endif #endif /* eof */ glpk-5.0/src/intopt/0000755000062000006210000000000013766346220013606 5ustar maomkpasswdglpk-5.0/src/intopt/cfg.c0000644000062000006210000003250113766346220014512 0ustar maomkpasswd/* cfg.c (conflict graph) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2012-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "cfg.h" #include "env.h" /*********************************************************************** * cfg_create_graph - create conflict graph * * This routine creates the conflict graph, which initially is empty, * and returns a pointer to the graph descriptor. * * The parameter n specifies the number of *all* variables in MIP, for * which the conflict graph will be built. * * The parameter nv_max specifies maximal number of vertices in the * conflict graph. It should be the double number of binary variables * in corresponding MIP. */ CFG *cfg_create_graph(int n, int nv_max) { CFG *G; xassert(n >= 0); xassert(0 <= nv_max && nv_max <= n + n); G = talloc(1, CFG); G->n = n; G->pos = talloc(1+n, int); memset(&G->pos[1], 0, n * sizeof(int)); G->neg = talloc(1+n, int); memset(&G->neg[1], 0, n * sizeof(int)); G->pool = dmp_create_pool(); G->nv_max = nv_max; G->nv = 0; G->ref = talloc(1+nv_max, int); G->vptr = talloc(1+nv_max, CFGVLE *); G->cptr = talloc(1+nv_max, CFGCLE *); return G; } /*********************************************************************** * cfg_add_clique - add clique to conflict graph * * This routine adds a clique to the conflict graph. * * The parameter size specifies the clique size, size >= 2. Note that * any edge can be considered as a clique of size 2. * * The array ind specifies vertices constituting the clique in elements * ind[k], 1 <= k <= size: * * ind[k] = +j means a vertex of the conflict graph that corresponds to * original binary variable x[j], 1 <= j <= n. * * ind[k] = -j means a vertex of the conflict graph that corresponds to * complement of original binary variable x[j], 1 <= j <= n. * * Note that if both vertices for x[j] and (1 - x[j]) have appeared in * the conflict graph, the routine automatically adds an edge incident * to these vertices. */ static void add_edge(CFG *G, int v, int w) { /* add clique of size 2 */ DMP *pool = G->pool; int nv = G->nv; CFGVLE **vptr = G->vptr; CFGVLE *vle; xassert(1 <= v && v <= nv); xassert(1 <= w && w <= nv); xassert(v != w); vle = dmp_talloc(pool, CFGVLE); vle->v = w; vle->next = vptr[v]; vptr[v] = vle; vle = dmp_talloc(pool, CFGVLE); vle->v = v; vle->next = vptr[w]; vptr[w] = vle; return; } void cfg_add_clique(CFG *G, int size, const int ind[]) { int n = G->n; int *pos = G->pos; int *neg = G->neg; DMP *pool = G->pool; int nv_max = G->nv_max; int *ref = G->ref; CFGVLE **vptr = G->vptr; CFGCLE **cptr = G->cptr; int j, k, v; xassert(2 <= size && size <= nv_max); /* add new vertices to the conflict graph */ for (k = 1; k <= size; k++) { j = ind[k]; if (j > 0) { /* vertex corresponds to x[j] */ xassert(1 <= j && j <= n); if (pos[j] == 0) { /* no such vertex exists; add it */ v = pos[j] = ++(G->nv); xassert(v <= nv_max); ref[v] = j; vptr[v] = NULL; cptr[v] = NULL; if (neg[j] != 0) { /* now both vertices for x[j] and (1 - x[j]) exist */ add_edge(G, v, neg[j]); } } } else { /* vertex corresponds to (1 - x[j]) */ j = -j; xassert(1 <= j && j <= n); if (neg[j] == 0) { /* no such vertex exists; add it */ v = neg[j] = ++(G->nv); xassert(v <= nv_max); ref[v] = j; vptr[v] = NULL; cptr[v] = NULL; if (pos[j] != 0) { /* now both vertices for x[j] and (1 - x[j]) exist */ add_edge(G, v, pos[j]); } } } } /* add specified clique to the conflict graph */ if (size == 2) add_edge(G, ind[1] > 0 ? pos[+ind[1]] : neg[-ind[1]], ind[2] > 0 ? pos[+ind[2]] : neg[-ind[2]]); else { CFGVLE *vp, *vle; CFGCLE *cle; /* build list of clique vertices */ vp = NULL; for (k = 1; k <= size; k++) { vle = dmp_talloc(pool, CFGVLE); vle->v = ind[k] > 0 ? pos[+ind[k]] : neg[-ind[k]]; vle->next = vp; vp = vle; } /* attach the clique to all its vertices */ for (k = 1; k <= size; k++) { cle = dmp_talloc(pool, CFGCLE); cle->vptr = vp; v = ind[k] > 0 ? pos[+ind[k]] : neg[-ind[k]]; cle->next = cptr[v]; cptr[v] = cle; } } return; } /*********************************************************************** * cfg_get_adjacent - get vertices adjacent to specified vertex * * This routine stores numbers of all vertices adjacent to specified * vertex v of the conflict graph in locations ind[1], ..., ind[len], * and returns len, 1 <= len <= nv-1, where nv is the total number of * vertices in the conflict graph. * * Note that the conflict graph defined by this routine has neither * self-loops nor multiple edges. */ int cfg_get_adjacent(CFG *G, int v, int ind[]) { int nv = G->nv; int *ref = G->ref; CFGVLE **vptr = G->vptr; CFGCLE **cptr = G->cptr; CFGVLE *vle; CFGCLE *cle; int k, w, len; xassert(1 <= v && v <= nv); len = 0; /* walk thru the list of adjacent vertices */ for (vle = vptr[v]; vle != NULL; vle = vle->next) { w = vle->v; xassert(1 <= w && w <= nv); xassert(w != v); if (ref[w] > 0) { ind[++len] = w; ref[w] = -ref[w]; } } /* walk thru the list of incident cliques */ for (cle = cptr[v]; cle != NULL; cle = cle->next) { /* walk thru the list of clique vertices */ for (vle = cle->vptr; vle != NULL; vle = vle->next) { w = vle->v; xassert(1 <= w && w <= nv); if (w != v && ref[w] > 0) { ind[++len] = w; ref[w] = -ref[w]; } } } xassert(1 <= len && len < nv); /* unmark vertices included in the resultant adjacency list */ for (k = 1; k <= len; k++) { w = ind[k]; ref[w] = -ref[w]; } return len; } /*********************************************************************** * cfg_expand_clique - expand specified clique to maximal clique * * Given some clique in the conflict graph this routine expands it to * a maximal clique by including in it new vertices. * * On entry vertex indices constituting the initial clique should be * stored in locations c_ind[1], ..., c_ind[c_len], where c_len is the * initial clique size. On exit the routine stores new vertex indices * to locations c_ind[c_len+1], ..., c_ind[c_len'], where c_len' is the * size of the maximal clique found, and returns c_len'. * * ALGORITHM * * Let G = (V, E) be a graph, C within V be a current clique to be * expanded, and D within V \ C be a subset of vertices adjacent to all * vertices from C. On every iteration the routine chooses some vertex * v in D, includes it into C, and removes from D the vertex v as well * as all vertices not adjacent to v. Initially C is empty and D = V. * Iterations repeat until D becomes an empty set. Obviously, the final * set C is a maximal clique in G. * * Now let C0 be an initial clique, and we want C0 to be a subset of * the final maximal clique C. To provide this condition the routine * starts constructing C by choosing only such vertices v in D, which * are in C0, until all vertices from C0 have been included in C. May * note that if on some iteration C0 \ C is non-empty (i.e. if not all * vertices from C0 have been included in C), C0 \ C is a subset of D, * because C0 is a clique. */ static int intersection(int d_len, int d_ind[], int d_pos[], int len, const int ind[]) { /* compute intersection D := D inter W, where W is some specified * set of vertices */ int k, t, v, new_len; /* walk thru vertices in W and mark vertices in D */ for (t = 1; t <= len; t++) { /* v in W */ v = ind[t]; /* determine position of v in D */ k = d_pos[v]; if (k != 0) { /* v in D */ xassert(d_ind[k] == v); /* mark v to keep it in D */ d_ind[k] = -v; } } /* remove all unmarked vertices from D */ new_len = 0; for (k = 1; k <= d_len; k++) { /* v in D */ v = d_ind[k]; if (v < 0) { /* v is marked; keep it */ v = -v; new_len++; d_ind[new_len] = v; d_pos[v] = new_len; } else { /* v is not marked; remove it */ d_pos[v] = 0; } } return new_len; } int cfg_expand_clique(CFG *G, int c_len, int c_ind[]) { int nv = G->nv; int d_len, *d_ind, *d_pos, len, *ind; int k, v; xassert(0 <= c_len && c_len <= nv); /* allocate working arrays */ d_ind = talloc(1+nv, int); d_pos = talloc(1+nv, int); ind = talloc(1+nv, int); /* initialize C := 0, D := V */ d_len = nv; for (k = 1; k <= nv; k++) d_ind[k] = d_pos[k] = k; /* expand C by vertices of specified initial clique C0 */ for (k = 1; k <= c_len; k++) { /* v in C0 */ v = c_ind[k]; xassert(1 <= v && v <= nv); /* since C0 is clique, v should be in D */ xassert(d_pos[v] != 0); /* W := set of vertices adjacent to v */ len = cfg_get_adjacent(G, v, ind); /* D := D inter W */ d_len = intersection(d_len, d_ind, d_pos, len, ind); /* since v not in W, now v should be not in D */ xassert(d_pos[v] == 0); } /* expand C by some other vertices until D is empty */ while (d_len > 0) { /* v in D */ v = d_ind[1]; xassert(1 <= v && v <= nv); /* note that v is adjacent to all vertices in C (by design), * so add v to C */ c_ind[++c_len] = v; /* W := set of vertices adjacent to v */ len = cfg_get_adjacent(G, v, ind); /* D := D inter W */ d_len = intersection(d_len, d_ind, d_pos, len, ind); /* since v not in W, now v should be not in D */ xassert(d_pos[v] == 0); } /* free working arrays */ tfree(d_ind); tfree(d_pos); tfree(ind); /* bring maximal clique to calling routine */ return c_len; } /*********************************************************************** * cfg_check_clique - check clique in conflict graph * * This routine checks that vertices of the conflict graph specified * in locations c_ind[1], ..., c_ind[c_len] constitute a clique. * * NOTE: for testing/debugging only. */ void cfg_check_clique(CFG *G, int c_len, const int c_ind[]) { int nv = G->nv; int k, kk, v, w, len, *ind; char *flag; ind = talloc(1+nv, int); flag = talloc(1+nv, char); memset(&flag[1], 0, nv); /* walk thru clique vertices */ xassert(c_len >= 0); for (k = 1; k <= c_len; k++) { /* get clique vertex v */ v = c_ind[k]; xassert(1 <= v && v <= nv); /* get vertices adjacent to vertex v */ len = cfg_get_adjacent(G, v, ind); for (kk = 1; kk <= len; kk++) { w = ind[kk]; xassert(1 <= w && w <= nv); xassert(w != v); flag[w] = 1; } /* check that all clique vertices other than v are adjacent to v */ for (kk = 1; kk <= c_len; kk++) { w = c_ind[kk]; xassert(1 <= w && w <= nv); if (w != v) xassert(flag[w]); } /* reset vertex flags */ for (kk = 1; kk <= len; kk++) flag[ind[kk]] = 0; } tfree(ind); tfree(flag); return; } /*********************************************************************** * cfg_delete_graph - delete conflict graph * * This routine deletes the conflict graph by freeing all the memory * allocated to this program object. */ void cfg_delete_graph(CFG *G) { tfree(G->pos); tfree(G->neg); dmp_delete_pool(G->pool); tfree(G->ref); tfree(G->vptr); tfree(G->cptr); tfree(G); return; } /* eof */ glpk-5.0/src/intopt/cfg.h0000644000062000006210000001135213766346220014520 0ustar maomkpasswd/* cfg.h (conflict graph) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2012-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef CFG_H #define CFG_H #include "dmp.h" /*********************************************************************** * The structure CFG describes the conflict graph. * * Conflict graph is an undirected graph G = (V, E), where V is a set * of vertices, E <= V x V is a set of edges. Each vertex v in V of the * conflict graph corresponds to a binary variable z[v], which is * either an original binary variable x[j] or its complement 1 - x[j]. * Edge (v,w) in E means that z[v] and z[w] cannot take the value 1 at * the same time, i.e. it defines an inequality z[v] + z[w] <= 1, which * is assumed to be valid for original MIP. * * Since the conflict graph may be dense, it is stored as an union of * its cliques rather than explicitly. */ #if 0 /* 08/III-2016 */ typedef struct CFG CFG; #else typedef struct glp_cfg CFG; #endif typedef struct CFGVLE CFGVLE; typedef struct CFGCLE CFGCLE; #if 0 /* 08/III-2016 */ struct CFG #else struct glp_cfg #endif { /* conflict graph descriptor */ int n; /* number of *all* variables (columns) in corresponding MIP */ int *pos; /* int pos[1+n]; */ /* pos[0] is not used; * pos[j] = v, 1 <= j <= n, means that vertex v corresponds to * original binary variable x[j], and pos[j] = 0 means that the * conflict graph has no such vertex */ int *neg; /* int neg[1+n]; */ /* neg[0] is not used; * neg[j] = v, 1 <= j <= n, means that vertex v corresponds to * complement of original binary variable x[j], and neg[j] = 0 * means that the conflict graph has no such vertex */ DMP *pool; /* memory pool to allocate elements of the conflict graph */ int nv_max; /* maximal number of vertices in the conflict graph */ int nv; /* current number of vertices in the conflict graph */ int *ref; /* int ref[1+nv_max]; */ /* ref[v] = j, 1 <= v <= nv, means that vertex v corresponds * either to original binary variable x[j] or to its complement, * i.e. either pos[j] = v or neg[j] = v */ CFGVLE **vptr; /* CFGVLE *vptr[1+nv_max]; */ /* vptr[v], 1 <= v <= nv, is an initial pointer to the list of * vertices adjacent to vertex v */ CFGCLE **cptr; /* CFGCLE *cptr[1+nv_max]; */ /* cptr[v], 1 <= v <= nv, is an initial pointer to the list of * cliques that contain vertex v */ }; struct CFGVLE { /* vertex list element */ int v; /* vertex number, 1 <= v <= nv */ CFGVLE *next; /* pointer to next vertex list element */ }; struct CFGCLE { /* clique list element */ CFGVLE *vptr; /* initial pointer to the list of clique vertices */ CFGCLE *next; /* pointer to next clique list element */ }; #define cfg_create_graph _glp_cfg_create_graph CFG *cfg_create_graph(int n, int nv_max); /* create conflict graph */ #define cfg_add_clique _glp_cfg_add_clique void cfg_add_clique(CFG *G, int size, const int ind[]); /* add clique to conflict graph */ #define cfg_get_adjacent _glp_cfg_get_adjacent int cfg_get_adjacent(CFG *G, int v, int ind[]); /* get vertices adjacent to specified vertex */ #define cfg_expand_clique _glp_cfg_expand_clique int cfg_expand_clique(CFG *G, int c_len, int c_ind[]); /* expand specified clique to maximal clique */ #define cfg_check_clique _glp_cfg_check_clique void cfg_check_clique(CFG *G, int c_len, const int c_ind[]); /* check clique in conflict graph */ #define cfg_delete_graph _glp_cfg_delete_graph void cfg_delete_graph(CFG *G); /* delete conflict graph */ #define cfg_build_graph _glp_cfg_build_graph CFG *cfg_build_graph(void /* glp_prob */ *P); /* build conflict graph */ #define cfg_find_clique _glp_cfg_find_clique int cfg_find_clique(void /* glp_prob */ *P, CFG *G, int ind[], double *sum); /* find maximum weight clique in conflict graph */ #endif /* eof */ glpk-5.0/src/intopt/cfg1.c0000644000062000006210000006026113766346220014577 0ustar maomkpasswd/* cfg1.c (conflict graph) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2012-2018 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "cfg.h" #include "env.h" #include "prob.h" #include "wclique.h" #include "wclique1.h" /*********************************************************************** * cfg_build_graph - build conflict graph * * This routine builds the conflict graph. It analyzes the specified * problem object to discover original and implied packing inequalities * and adds corresponding cliques to the conflict graph. * * Packing inequality has the form: * * sum z[j] <= 1, (1) * j in J * * where z[j] = x[j] or z[j] = 1 - x[j], x[j] is an original binary * variable. Every packing inequality (1) is equivalent to a set of * edge inequalities: * * z[i] + z[j] <= 1 for all i, j in J, i != j, (2) * * and since every edge inequality (2) defines an edge in the conflict * graph, corresponding packing inequality (1) defines a clique. * * To discover packing inequalities the routine analyzes constraints * of the specified MIP. To simplify the analysis each constraint is * analyzed separately. The analysis is performed as follows. * * Let some original constraint be the following: * * L <= sum a[j] x[j] <= U. (3) * * To analyze it the routine analyzes two constraints of "not greater * than" type: * * sum (-a[j]) x[j] <= -L, (4) * * sum (+a[j]) x[j] <= +U, (5) * * which are relaxations of the original constraint (3). (If, however, * L = -oo, or U = +oo, corresponding constraint being redundant is not * analyzed.) * * Let a constraint of "not greater than" type be the following: * * sum a[j] x[j] + sum a[j] x[j] <= b, (6) * j in J j in J' * * where J is a subset of binary variables, J' is a subset of other * (continues and non-binary integer) variables. The constraint (6) is * is relaxed as follows, to eliminate non-binary variables: * * sum a[j] x[j] <= b - sum a[j] x[j] <= b', (7) * j in J j in J' * * b' = sup(b - sum a[j] x[j]) = * j in J' * * = b - inf(sum a[j] x[j]) = * * = b - sum inf(a[j] x[j]) = (8) * * = b - sum a[j] inf(x[j]) - sum a[j] sup(x[j]) = * a[j]>0 a[j]<0 * * = b - sum a[j] l[j] - sum a[j] u[j], * a[j]>0 a[j]<0 * * where l[j] and u[j] are, resp., lower and upper bounds of x[j]. * * Then the routine transforms the relaxed constraint containing only * binary variables: * * sum a[j] x[j] <= b (9) * * to an equivalent 0-1 knapsack constraint as follows: * * sum a[j] x[j] + sum a[j] x[j] <= b ==> * a[j]>0 a[j]<0 * * sum a[j] x[j] + sum a[j] (1 - x[j]) <= b ==> * a[j]>0 a[j]<0 (10) * * sum (+a[j]) x[j] + sum (-a[j]) x[j] <= b + sum (-a[j]) ==> * a[j]>0 a[j]<0 a[j]<0 * * sum a'[j] z[j] <= b', * * where a'[j] = |a[j]| > 0, and * * ( x[j] if a[j] > 0 * z[j] = < * ( 1 - x[j] if a[j] < 0 * * is a binary variable, which is either original binary variable x[j] * or its complement. * * Finally, the routine analyzes the resultant 0-1 knapsack inequality: * * sum a[j] z[j] <= b, (11) * j in J * * where all a[j] are positive, to discover clique inequalities (1), * which are valid for (11) and therefore valid for (3). (It is assumed * that the original MIP has been preprocessed, so it is not checked, * for example, that b > 0 or that a[j] <= b.) * * In principle, to discover any edge inequalities valid for (11) it * is sufficient to check whether a[i] + a[j] > b for all i, j in J, * i < j. However, this way requires O(|J|^2) checks, so the routine * analyses (11) in the following way, which is much more efficient in * many practical cases. * * 1. Let a[p] and a[q] be two minimal coefficients: * * a[p] = min a[j], (12) * * a[q] = min a[j], j != p, (13) * * such that * * a[p] + a[q] > b. (14) * * This means that a[i] + a[j] > b for any i, j in J, i != j, so * * z[i] + z[j] <= 1 (15) * * are valid for (11) for any i, j in J, i != j. This case means that * J define a clique in the conflict graph. * * 2. Otherwise, let a[p] and [q] be two maximal coefficients: * * a[p] = max a[j], (16) * * a[q] = max a[j], j != p, (17) * * such that * * a[p] + a[q] <= b. (18) * * This means that a[i] + a[j] <= b for any i, j in J, i != j, so in * this case no valid edge inequalities for (11) exist. * * 3. Otherwise, let all a[j] be ordered by descending their values: * * a[1] >= a[2] >= ... >= a[p-1] >= a[p] >= a[p+1] >= ... (19) * * where p is such that * * a[p-1] + a[p] > b, (20) * * a[p] + a[p+1] <= b. (21) * * (May note that due to the former two cases in this case we always * have 2 <= p <= |J|-1.) * * Since a[p] and a[p-1] are two minimal coefficients in the set * J' = {1, ..., p}, J' define a clique in the conflict graph for the * same reason as in the first case. Similarly, since a[p] and a[p+1] * are two maximal coefficients in the set J" = {p, ..., |J|}, no edge * inequalities exist for all i, j in J" for the same reason as in the * second case. Thus, to discover other edge inequalities (15) valid * for (11), the routine checks if a[i] + a[j] > b for all i in J', * j in J", i != j. */ #define is_binary(j) \ (P->col[j]->kind == GLP_IV && P->col[j]->type == GLP_DB && \ P->col[j]->lb == 0.0 && P->col[j]->ub == 1.0) /* check if x[j] is binary variable */ struct term { int ind; double val; }; /* term a[j] * z[j] used to sort a[j]'s */ static int CDECL fcmp(const void *e1, const void *e2) { /* auxiliary routine called from qsort */ const struct term *t1 = e1, *t2 = e2; if (t1->val > t2->val) return -1; else if (t1->val < t2->val) return +1; else return 0; } static void analyze_ineq(glp_prob *P, CFG *G, int len, int ind[], double val[], double rhs, struct term t[]) { /* analyze inequality constraint (6) */ /* P is the original MIP * G is the conflict graph to be built * len is the number of terms in the constraint * ind[1], ..., ind[len] are indices of variables x[j] * val[1], ..., val[len] are constraint coefficients a[j] * rhs is the right-hand side b * t[1+len] is a working array */ int j, k, kk, p, q, type, new_len; /* eliminate non-binary variables; see (7) and (8) */ new_len = 0; for (k = 1; k <= len; k++) { /* get index of variable x[j] */ j = ind[k]; if (is_binary(j)) { /* x[j] remains in relaxed constraint */ new_len++; ind[new_len] = j; val[new_len] = val[k]; } else if (val[k] > 0.0) { /* eliminate non-binary x[j] in case a[j] > 0 */ /* b := b - a[j] * l[j]; see (8) */ type = P->col[j]->type; if (type == GLP_FR || type == GLP_UP) { /* x[j] has no lower bound */ goto done; } rhs -= val[k] * P->col[j]->lb; } else /* val[j] < 0.0 */ { /* eliminate non-binary x[j] in case a[j] < 0 */ /* b := b - a[j] * u[j]; see (8) */ type = P->col[j]->type; if (type == GLP_FR || type == GLP_LO) { /* x[j] has no upper bound */ goto done; } rhs -= val[k] * P->col[j]->ub; } } len = new_len; /* now we have the constraint (9) */ if (len <= 1) { /* at least two terms are needed */ goto done; } /* make all constraint coefficients positive; see (10) */ for (k = 1; k <= len; k++) { if (val[k] < 0.0) { /* a[j] < 0; substitute x[j] = 1 - x'[j], where x'[j] is * a complement binary variable */ ind[k] = -ind[k]; val[k] = -val[k]; rhs += val[k]; } } /* now we have 0-1 knapsack inequality (11) */ /* increase the right-hand side a bit to avoid false checks due * to rounding errors */ rhs += 0.001 * (1.0 + fabs(rhs)); /*** first case ***/ /* find two minimal coefficients a[p] and a[q] */ p = 0; for (k = 1; k <= len; k++) { if (p == 0 || val[p] > val[k]) p = k; } q = 0; for (k = 1; k <= len; k++) { if (k != p && (q == 0 || val[q] > val[k])) q = k; } xassert(p != 0 && q != 0 && p != q); /* check condition (14) */ if (val[p] + val[q] > rhs) { /* all z[j] define a clique in the conflict graph */ cfg_add_clique(G, len, ind); goto done; } /*** second case ***/ /* find two maximal coefficients a[p] and a[q] */ p = 0; for (k = 1; k <= len; k++) { if (p == 0 || val[p] < val[k]) p = k; } q = 0; for (k = 1; k <= len; k++) { if (k != p && (q == 0 || val[q] < val[k])) q = k; } xassert(p != 0 && q != 0 && p != q); /* check condition (18) */ if (val[p] + val[q] <= rhs) { /* no valid edge inequalities exist */ goto done; } /*** third case ***/ xassert(len >= 3); /* sort terms in descending order of coefficient values */ for (k = 1; k <= len; k++) { t[k].ind = ind[k]; t[k].val = val[k]; } qsort(&t[1], len, sizeof(struct term), fcmp); for (k = 1; k <= len; k++) { ind[k] = t[k].ind; val[k] = t[k].val; } /* now a[1] >= a[2] >= ... >= a[len-1] >= a[len] */ /* note that a[1] + a[2] > b and a[len-1] + a[len] <= b due two * the former two cases */ xassert(val[1] + val[2] > rhs); xassert(val[len-1] + val[len] <= rhs); /* find p according to conditions (20) and (21) */ for (p = 2; p < len; p++) { if (val[p] + val[p+1] <= rhs) break; } xassert(p < len); /* z[1], ..., z[p] define a clique in the conflict graph */ cfg_add_clique(G, p, ind); /* discover other edge inequalities */ for (k = 1; k <= p; k++) { for (kk = p; kk <= len; kk++) { if (k != kk && val[k] + val[kk] > rhs) { int iii[1+2]; iii[1] = ind[k]; iii[2] = ind[kk]; cfg_add_clique(G, 2, iii); } } } done: return; } CFG *cfg_build_graph(void *P_) { glp_prob *P = P_; int m = P->m; int n = P->n; CFG *G; int i, k, type, len, *ind; double *val; struct term *t; /* create the conflict graph (number of its vertices cannot be * greater than double number of binary variables) */ G = cfg_create_graph(n, 2 * glp_get_num_bin(P)); /* allocate working arrays */ ind = talloc(1+n, int); val = talloc(1+n, double); t = talloc(1+n, struct term); /* analyze constraints to discover edge inequalities */ for (i = 1; i <= m; i++) { type = P->row[i]->type; if (type == GLP_LO || type == GLP_DB || type == GLP_FX) { /* i-th row has lower bound */ /* analyze inequality sum (-a[j]) * x[j] <= -lb */ len = glp_get_mat_row(P, i, ind, val); for (k = 1; k <= len; k++) val[k] = -val[k]; analyze_ineq(P, G, len, ind, val, -P->row[i]->lb, t); } if (type == GLP_UP || type == GLP_DB || type == GLP_FX) { /* i-th row has upper bound */ /* analyze inequality sum (+a[j]) * x[j] <= +ub */ len = glp_get_mat_row(P, i, ind, val); analyze_ineq(P, G, len, ind, val, +P->row[i]->ub, t); } } /* free working arrays */ tfree(ind); tfree(val); tfree(t); return G; } /*********************************************************************** * cfg_find_clique - find maximum weight clique in conflict graph * * This routine finds a maximum weight clique in the conflict graph * G = (V, E), where the weight of vertex v in V is the value of * corresponding binary variable z (which is either an original binary * variable or its complement) in the optimal solution to LP relaxation * provided in the problem object. The goal is to find a clique in G, * whose weight is greater than 1, in which case corresponding packing * inequality is violated at the optimal point. * * On exit the routine stores vertex indices of the conflict graph * included in the clique found to locations ind[1], ..., ind[len], and * returns len, which is the clique size. The clique weight is stored * in location pointed to by the parameter sum. If no clique has been * found, the routine returns 0. * * Since the conflict graph may have a big number of vertices and be * quite dense, the routine uses an induced subgraph G' = (V', E'), * which is constructed as follows: * * 1. If the weight of some vertex v in V is zero (close to zero), it * is not included in V'. Obviously, including in a clique * zero-weight vertices does not change its weight, so if in G there * exist a clique of a non-zero weight, in G' exists a clique of the * same weight. This point is extremely important, because dropping * out zero-weight vertices can be done without retrieving lists of * adjacent vertices whose size may be very large. * * 2. Cumulative weight of vertex v in V is the sum of the weight of v * and weights of all vertices in V adjacent to v. Obviously, if * a clique includes a vertex v, the clique weight cannot be greater * than the cumulative weight of v. Since we are interested only in * cliques whose weight is greater than 1, vertices of V, whose * cumulative weight is not greater than 1, are not included in V'. * * May note that in many practical cases the size of the induced * subgraph G' is much less than the size of the original conflict * graph G due to many binary variables, whose optimal values are zero * or close to zero. For example, it may happen that |V| = 100,000 and * |E| = 1e9 while |V'| = 50 and |E'| = 1000. */ struct csa { /* common storage area */ glp_prob *P; /* original MIP */ CFG *G; /* original conflict graph G = (V, E), |V| = nv */ int *ind; /* int ind[1+nv]; */ /* working array */ /*--------------------------------------------------------------*/ /* induced subgraph G' = (V', E') of original conflict graph */ int nn; /* number of vertices in V' */ int *vtoi; /* int vtoi[1+nv]; */ /* vtoi[v] = i, 1 <= v <= nv, means that vertex v in V is vertex * i in V'; vtoi[v] = 0 means that vertex v is not included in * the subgraph */ int *itov; /* int itov[1+nv]; */ /* itov[i] = v, 1 <= i <= nn, means that vertex i in V' is vertex * v in V */ double *wgt; /* double wgt[1+nv]; */ /* wgt[i], 1 <= i <= nn, is a weight of vertex i in V', which is * the value of corresponding binary variable in optimal solution * to LP relaxation */ }; static void build_subgraph(struct csa *csa) { /* build induced subgraph */ glp_prob *P = csa->P; int n = P->n; CFG *G = csa->G; int *ind = csa->ind; int *pos = G->pos; int *neg = G->neg; int nv = G->nv; int *ref = G->ref; int *vtoi = csa->vtoi; int *itov = csa->itov; double *wgt = csa->wgt; int j, k, v, w, nn, len; double z, sum; /* initially induced subgraph is empty */ nn = 0; /* walk thru vertices of original conflict graph */ for (v = 1; v <= nv; v++) { /* determine value of binary variable z[j] that corresponds to * vertex v */ j = ref[v]; xassert(1 <= j && j <= n); if (pos[j] == v) { /* z[j] = x[j], where x[j] is original variable */ z = P->col[j]->prim; } else if (neg[j] == v) { /* z[j] = 1 - x[j], where x[j] is original variable */ z = 1.0 - P->col[j]->prim; } else xassert(v != v); /* if z[j] is close to zero, do not include v in the induced * subgraph */ if (z < 0.001) { vtoi[v] = 0; continue; } /* calculate cumulative weight of vertex v */ sum = z; /* walk thru all vertices adjacent to v */ len = cfg_get_adjacent(G, v, ind); for (k = 1; k <= len; k++) { /* there is an edge (v,w) in the conflict graph */ w = ind[k]; xassert(w != v); /* add value of z[j] that corresponds to vertex w */ j = ref[w]; xassert(1 <= j && j <= n); if (pos[j] == w) sum += P->col[j]->prim; else if (neg[j] == w) sum += 1.0 - P->col[j]->prim; else xassert(w != w); } /* cumulative weight of vertex v is an upper bound of weight * of any clique containing v; so if it not greater than 1, do * not include v in the induced subgraph */ if (sum < 1.010) { vtoi[v] = 0; continue; } /* include vertex v in the induced subgraph */ nn++; vtoi[v] = nn; itov[nn] = v; wgt[nn] = z; } /* induced subgraph has been built */ csa->nn = nn; return; } static int sub_adjacent(struct csa *csa, int i, int adj[]) { /* retrieve vertices of induced subgraph adjacent to specified * vertex */ CFG *G = csa->G; int nv = G->nv; int *ind = csa->ind; int nn = csa->nn; int *vtoi = csa->vtoi; int *itov = csa->itov; int j, k, v, w, len, len1; /* determine original vertex v corresponding to vertex i */ xassert(1 <= i && i <= nn); v = itov[i]; /* retrieve vertices adjacent to vertex v in original graph */ len1 = cfg_get_adjacent(G, v, ind); /* keep only adjacent vertices which are in induced subgraph and * change their numbers appropriately */ len = 0; for (k = 1; k <= len1; k++) { /* there exists edge (v, w) in original graph */ w = ind[k]; xassert(1 <= w && w <= nv && w != v); j = vtoi[w]; if (j != 0) { /* vertex w is vertex j in induced subgraph */ xassert(1 <= j && j <= nn && j != i); adj[++len] = j; } } return len; } static int find_clique(struct csa *csa, int c_ind[]) { /* find maximum weight clique in induced subgraph with exact * Ostergard's algorithm */ int nn = csa->nn; double *wgt = csa->wgt; int i, j, k, p, q, t, ne, nb, len, *iwt, *ind; unsigned char *a; xassert(nn >= 2); /* allocate working array */ ind = talloc(1+nn, int); /* calculate the number of elements in lower triangle (without * diagonal) of adjacency matrix of induced subgraph */ ne = (nn * (nn - 1)) / 2; /* calculate the number of bytes needed to store lower triangle * of adjacency matrix */ nb = (ne + (CHAR_BIT - 1)) / CHAR_BIT; /* allocate lower triangle of adjacency matrix */ a = talloc(nb, unsigned char); /* fill lower triangle of adjacency matrix */ memset(a, 0, nb); for (p = 1; p <= nn; p++) { /* retrieve vertices adjacent to vertex p */ len = sub_adjacent(csa, p, ind); for (k = 1; k <= len; k++) { /* there exists edge (p, q) in induced subgraph */ q = ind[k]; xassert(1 <= q && q <= nn && q != p); /* determine row and column indices of this edge in lower * triangle of adjacency matrix */ if (p > q) i = p, j = q; else /* p < q */ i = q, j = p; /* set bit a[i,j] to 1, i > j */ t = ((i - 1) * (i - 2)) / 2 + (j - 1); a[t / CHAR_BIT] |= (unsigned char)(1 << ((CHAR_BIT - 1) - t % CHAR_BIT)); } } /* scale vertex weights by 1000 and convert them to integers as * required by Ostergard's algorithm */ iwt = ind; for (i = 1; i <= nn; i++) { /* it is assumed that 0 <= wgt[i] <= 1 */ t = (int)(1000.0 * wgt[i] + 0.5); if (t < 0) t = 0; else if (t > 1000) t = 1000; iwt[i] = t; } /* find maximum weight clique */ len = wclique(nn, iwt, a, c_ind); /* free working arrays */ tfree(ind); tfree(a); /* return clique size to calling routine */ return len; } static int func(void *info, int i, int ind[]) { /* auxiliary routine used by routine find_clique1 */ struct csa *csa = info; xassert(1 <= i && i <= csa->nn); return sub_adjacent(csa, i, ind); } static int find_clique1(struct csa *csa, int c_ind[]) { /* find maximum weight clique in induced subgraph with greedy * heuristic */ int nn = csa->nn; double *wgt = csa->wgt; int len; xassert(nn >= 2); len = wclique1(nn, wgt, func, csa, c_ind); /* return clique size to calling routine */ return len; } int cfg_find_clique(void *P, CFG *G, int ind[], double *sum_) { int nv = G->nv; struct csa csa; int i, k, len; double sum; /* initialize common storage area */ csa.P = P; csa.G = G; csa.ind = talloc(1+nv, int); csa.nn = -1; csa.vtoi = talloc(1+nv, int); csa.itov = talloc(1+nv, int); csa.wgt = talloc(1+nv, double); /* build induced subgraph */ build_subgraph(&csa); #ifdef GLP_DEBUG xprintf("nn = %d\n", csa.nn); #endif /* if subgraph has less than two vertices, do nothing */ if (csa.nn < 2) { len = 0; sum = 0.0; goto skip; } /* find maximum weight clique in induced subgraph */ #if 1 /* FIXME */ if (csa.nn <= 50) #endif { /* induced subgraph is small; use exact algorithm */ len = find_clique(&csa, ind); } else { /* induced subgraph is large; use greedy heuristic */ len = find_clique1(&csa, ind); } /* do not report clique, if it has less than two vertices */ if (len < 2) { len = 0; sum = 0.0; goto skip; } /* convert indices of clique vertices from induced subgraph to * original conflict graph and compute clique weight */ sum = 0.0; for (k = 1; k <= len; k++) { i = ind[k]; xassert(1 <= i && i <= csa.nn); sum += csa.wgt[i]; ind[k] = csa.itov[i]; } skip: /* free working arrays */ tfree(csa.ind); tfree(csa.vtoi); tfree(csa.itov); tfree(csa.wgt); /* return to calling routine */ *sum_ = sum; return len; } /* eof */ glpk-5.0/src/intopt/cfg2.c0000644000062000006210000000465613766346220014606 0ustar maomkpasswd/* cfg2.c (conflict graph) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2015-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "cfg.h" #include "env.h" #include "prob.h" /*********************************************************************** * NAME * * glp_cfg_init - create and initialize conflict graph * * SYNOPSIS * * glp_cfg *glp_cfg_init(glp_prob *P); * * DESCRIPTION * * This routine creates and initializes the conflict graph for the * specified problem object. * * RETURNS * * The routine returns a pointer to the conflict graph descriptor. * However, if the conflict graph is empty (no conflicts have been * found), the routine returns NULL. */ glp_cfg *glp_cfg_init(glp_prob *P) { glp_cfg *G; int j, n1, n2; xprintf("Constructing conflict graph...\n"); G = cfg_build_graph(P); n1 = n2 = 0; for (j = 1; j <= P->n; j++) { if (G->pos[j]) n1 ++; if (G->neg[j]) n2++; } if (n1 == 0 && n2 == 0) { xprintf("No conflicts found\n"); cfg_delete_graph(G); G = NULL; } else xprintf("Conflict graph has %d + %d = %d vertices\n", n1, n2, G->nv); return G; } /*********************************************************************** * NAME * * glp_cfg_free - delete conflict graph descriptor * * SYNOPSIS * * void glp_cfg_free(glp_cfg *G); * * DESCRIPTION * * This routine deletes the conflict graph descriptor and frees all the * memory allocated to it. */ void glp_cfg_free(glp_cfg *G) { xassert(G != NULL); cfg_delete_graph(G); return; } /* eof */ glpk-5.0/src/intopt/clqcut.c0000644000062000006210000001020413766346220015242 0ustar maomkpasswd/* clqcut.c (clique cut generator) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2008-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "cfg.h" #include "env.h" #include "prob.h" /*********************************************************************** * NAME * * glp_clq_cut - generate clique cut from conflict graph * * SYNOPSIS * * int glp_clq_cut(glp_prob *P, glp_cfg *G, int ind[], double val[]); * * DESCRIPTION * * This routine attempts to generate a clique cut. * * The cut generated by the routine is the following inequality: * * sum a[j] * x[j] <= b, * * which is expected to be violated at the current basic solution. * * If the cut has been successfully generated, the routine stores its * non-zero coefficients a[j] and corresponding column indices j in the * array locations val[1], ..., val[len] and ind[1], ..., ind[len], * where 1 <= len <= n is the number of non-zero coefficients. The * right-hand side value b is stored in val[0], and ind[0] is set to 0. * * RETURNS * * If the cut has been successfully generated, the routine returns * len, the number of non-zero coefficients in the cut, 1 <= len <= n. * Otherwise, the routine returns a non-positive value. */ int glp_clq_cut(glp_prob *P, glp_cfg *G, int ind[], double val[]) { int n = P->n; int *pos = G->pos; int *neg = G->neg; int nv = G->nv; int *ref = G->ref; int j, k, v, len; double rhs, sum; xassert(G->n == n); /* find maximum weight clique in conflict graph */ len = cfg_find_clique(P, G, ind, &sum); #ifdef GLP_DEBUG xprintf("len = %d; sum = %g\n", len, sum); cfg_check_clique(G, len, ind); #endif /* check if clique inequality is violated */ if (sum < 1.07) return 0; /* expand clique to maximal one */ len = cfg_expand_clique(G, len, ind); #ifdef GLP_DEBUG xprintf("maximal clique size = %d\n", len); cfg_check_clique(G, len, ind); #endif /* construct clique cut (fixed binary variables are removed, so this cut is only locally valid) */ rhs = 1.0; for (j = 1; j <= n; j++) val[j] = 0.0; for (k = 1; k <= len; k++) { /* v is clique vertex */ v = ind[k]; xassert(1 <= v && v <= nv); /* j is number of corresponding binary variable */ j = ref[v]; xassert(1 <= j && j <= n); if (pos[j] == v) { /* v corresponds to x[j] */ if (P->col[j]->type == GLP_FX) { /* x[j] is fixed */ rhs -= P->col[j]->prim; } else { /* x[j] is not fixed */ val[j] += 1.0; } } else if (neg[j] == v) { /* v corresponds to (1 - x[j]) */ if (P->col[j]->type == GLP_FX) { /* x[j] is fixed */ rhs -= (1.0 - P->col[j]->prim); } else { /* x[j] is not fixed */ val[j] -= 1.0; rhs -= 1.0; } } else xassert(v != v); } /* convert cut inequality to sparse format */ len = 0; for (j = 1; j <= n; j++) { if (val[j] != 0.0) { len++; ind[len] = j; val[len] = val[j]; } } ind[0] = 0, val[0] = rhs; return len; } /* eof */ glpk-5.0/src/intopt/covgen.c0000644000062000006210000007231613766346220015244 0ustar maomkpasswd/* covgen.c */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2017-2018 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "fvs.h" #include "ks.h" #include "prob.h" struct glp_cov { /* cover cut generator working area */ int n; /* number of columns (variables) */ glp_prob *set; /* set of globally valid 0-1 knapsack inequalities chosen from * the root problem; each inequality is either original row or * its relaxation (surrogate 0-1 knapsack) which is constructed * by substitution of lower/upper single/variable bounds for * continuous and general integer (non-binary) variables */ }; struct bnd { /* simple or variable bound */ /* if z = 0, it is a simple bound x >= or <= b; if b = -DBL_MAX * (b = +DBL_MAX), x has no lower (upper) bound; otherwise, if * z != 0, it is a variable bound x >= or <= a * z + b */ int z; /* number of binary variable or 0 */ double a, b; /* bound parameters */ }; struct csa { /* common storage area */ glp_prob *P; /* original (root) MIP */ struct bnd *l; /* struct bnd l[1+P->n]; */ /* lower simple/variable bounds of variables */ struct bnd *u; /* struct bnd u[1+P->n]; */ /* upper simple/variable bounds of variables */ glp_prob *set; /* see struct glp_cov above */ }; /*********************************************************************** * init_bounds - initialize bounds of variables with simple bounds * * This routine initializes lower and upper bounds of all variables * with simple bounds specified in the original mip. */ static void init_bounds(struct csa *csa) { glp_prob *P = csa->P; struct bnd *l = csa->l, *u = csa->u; int j; for (j = 1; j <= P->n; j++) { l[j].z = u[j].z = 0; l[j].a = u[j].a = 0; l[j].b = glp_get_col_lb(P, j); u[j].b = glp_get_col_ub(P, j); } return; } /*********************************************************************** * check_vb - check variable bound * * This routine checks if the specified i-th row has the form * * a1 * x + a2 * z >= or <= rhs, (1) * * where x is a non-fixed continuous or general integer variable, and * z is a binary variable. If it is, the routine converts the row to * the following variable lower/upper bound (VLB/VUB) of x: * * x >= or <= a * z + b, (2) * * where a = - a2 / a1, b = rhs / a1. Note that the inequality type is * changed to opposite one when a1 < 0. * * If the row is identified as a variable bound, the routine returns * GLP_LO for VLB or GLP_UP for VUB and provides the reference numbers * of variables x and z and values of a and b. Otherwise, the routine * returns zero. */ static int check_vb(struct csa *csa, int i, int *x, int *z, double *a, double *b) { glp_prob *P = csa->P; GLPROW *row; GLPAIJ *a1, *a2; int type; double rhs; xassert(1 <= i && i <= P->m); row = P->row[i]; /* check row type */ switch (row->type) { case GLP_LO: case GLP_UP: break; default: return 0; } /* take first term of the row */ a1 = row->ptr; if (a1 == NULL) return 0; /* take second term of the row */ a2 = a1->r_next; if (a2 == NULL) return 0; /* there should be exactly two terms in the row */ if (a2->r_next != NULL) return 0; /* if first term is a binary variable, swap the terms */ if (glp_get_col_kind(P, a1->col->j) == GLP_BV) { GLPAIJ *a; a = a1, a1 = a2, a2 = a; } /* now first term should be a non-fixed continuous or general * integer variable */ if (a1->col->type == GLP_FX) return 0; if (glp_get_col_kind(P, a1->col->j) == GLP_BV) return 0; /* and second term should be a binary variable */ if (glp_get_col_kind(P, a2->col->j) != GLP_BV) return 0; /* VLB/VUB row has been identified */ switch (row->type) { case GLP_LO: type = a1->val > 0 ? GLP_LO : GLP_UP; rhs = row->lb; break; case GLP_UP: type = a1->val > 0 ? GLP_UP : GLP_LO; rhs = row->ub; break; default: xassert(type != type); } *x = a1->col->j; *z = a2->col->j; *a = - a2->val / a1->val; *b = rhs / a1->val; return type; } /*********************************************************************** * set_vb - set variable bound * * This routine sets lower or upper variable bound specified as * * x >= a * z + b (type = GLP_LO) * * x <= a * z + b (type = GLP_UP) */ static void set_vb(struct csa *csa, int type, int x, int z, double a, double b) { glp_prob *P = csa->P; struct bnd *l = csa->l, *u = csa->u; xassert(glp_get_col_type(P, x) != GLP_FX); xassert(glp_get_col_kind(P, x) != GLP_BV); xassert(glp_get_col_kind(P, z) == GLP_BV); xassert(a != 0); switch (type) { case GLP_LO: /* FIXME: check existing simple lower bound? */ l[x].z = z, l[x].a = a, l[x].b = b; break; case GLP_UP: /* FIXME: check existing simple upper bound? */ u[x].z = z, u[x].a = a, u[x].b = b; break; default: xassert(type != type); } return; } /*********************************************************************** * obtain_vbs - obtain and set variable bounds * * This routine walks thru all rows of the original mip, identifies * rows specifying variable lower/upper bounds, and sets these bounds * for corresponding (non-binary) variables. */ static void obtain_vbs(struct csa *csa) { glp_prob *P = csa->P; int i, x, z, type, save; double a, b; for (i = 1; i <= P->m; i++) { switch (P->row[i]->type) { case GLP_FR: break; case GLP_LO: case GLP_UP: type = check_vb(csa, i, &x, &z, &a, &b); if (type) set_vb(csa, type, x, z, a, b); break; case GLP_DB: case GLP_FX: /* double-side inequality l <= ... <= u and equality * ... = l = u are considered as two single inequalities * ... >= l and ... <= u */ save = P->row[i]->type; P->row[i]->type = GLP_LO; type = check_vb(csa, i, &x, &z, &a, &b); if (type) set_vb(csa, type, x, z, a, b); P->row[i]->type = GLP_UP; type = check_vb(csa, i, &x, &z, &a, &b); if (type) set_vb(csa, type, x, z, a, b); P->row[i]->type = save; break; default: xassert(P != P); } } return; } /*********************************************************************** * add_term - add term to sparse vector * * This routine computes the following linear combination: * * v := v + a * e[j], * * where v is a sparse vector in full storage format, a is a non-zero * scalar, e[j] is j-th column of unity matrix. */ static void add_term(FVS *v, int j, double a) { xassert(1 <= j && j <= v->n); xassert(a != 0); if (v->vec[j] == 0) { /* create j-th component */ v->nnz++; xassert(v->nnz <= v->n); v->ind[v->nnz] = j; } /* perform addition */ v->vec[j] += a; if (fabs(v->vec[j]) < 1e-9 * (1 + fabs(a))) { /* remove j-th component */ v->vec[j] = DBL_MIN; } return; } /*********************************************************************** * build_ks - build "0-1 knapsack" inequality * * Given an inequality of "not greater" type: * * sum{j in 1..n} a[j]*x[j] <= b, (1) * * this routine attempts to transform it to equivalent or relaxed "0-1 * knapsack" inequality that contains only binary variables. * * If x[j] is a binary variable, the term a[j]*x[j] is not changed. * Otherwise, if x[j] is a continuous or integer non-binary variable, * it is replaced by its lower (if a[j] > 0) or upper (if a[j] < 0) * single or variable bound. In the latter case, if x[j] is a non-fixed * variable, this results in a relaxation of original inequality known * as "surrogate knapsack". Thus, if the specified inequality is valid * for the original mip, the resulting inequality is also valid. * * Note that in both source and resulting inequalities coefficients * a[j] can have any sign. * * On entry to the routine the source inequality is specified by the * parameters n, ind (contains original numbers of x[j]), a, and b. The * parameter v is a working sparse vector whose components are assumed * to be zero. * * On exit the routine stores the resulting "0-1 knapsack" inequality * in the parameters ind, a, and b, and returns n which is the number * of terms in the resulting inequality. Zero content of the vector v * is restored before exit. * * If the resulting inequality cannot be constructed due to missing * lower/upper bounds of some variable, the routine returns a negative * value. */ static int build_ks(struct csa *csa, int n, int ind[], double a[], double *b, FVS *v) { glp_prob *P = csa->P; struct bnd *l = csa->l, *u = csa->u; int j, k; /* check that v = 0 */ #ifdef GLP_DEBUG fvs_check_vec(v); #endif xassert(v->nnz == 0); /* walk thru terms of original inequality */ for (j = 1; j <= n; j++) { /* process term a[j]*x[j] */ k = ind[j]; /* original number of x[j] in mip */ if (glp_get_col_kind(P, k) == GLP_BV) { /* x[j] is a binary variable */ /* include its term into resulting inequality */ add_term(v, k, a[j]); } else if (a[j] > 0) { /* substitute x[j] by its lower bound */ if (l[k].b == -DBL_MAX) { /* x[j] has no lower bound */ n = -1; goto skip; } else if (l[k].z == 0) { /* x[j] has simple lower bound */ *b -= a[j] * l[k].b; } else { /* x[j] has variable lower bound (a * z + b) */ add_term(v, l[k].z, a[j] * l[k].a); *b -= a[j] * l[k].b; } } else /* a[j] < 0 */ { /* substitute x[j] by its upper bound */ if (u[k].b == +DBL_MAX) { /* x[j] has no upper bound */ n = -1; goto skip; } else if (u[k].z == 0) { /* x[j] has simple upper bound */ *b -= a[j] * u[k].b; } else { /* x[j] has variable upper bound (a * z + b) */ add_term(v, u[k].z, a[j] * u[k].a); *b -= a[j] * u[k].b; } } } /* replace tiny coefficients by exact zeros (see add_term) */ fvs_adjust_vec(v, 2 * DBL_MIN); /* copy terms of resulting inequality */ xassert(v->nnz <= n); n = v->nnz; for (j = 1; j <= n; j++) { ind[j] = v->ind[j]; a[j] = v->vec[ind[j]]; } skip: /* restore zero content of v */ fvs_clear_vec(v); return n; } /*********************************************************************** * can_be_active - check if inequality can be active * * This routine checks if the specified "0-1 knapsack" inequality * * sum{j in 1..n} a[j]*x[j] <= b * * can be active. If so, the routine returns true, otherwise false. */ static int can_be_active(int n, const double a[], double b) { int j; double s; s = 0; for (j = 1; j <= n; j++) { if (a[j] > 0) s += a[j]; } return s > b + .001 * (1 + fabs(b)); } /*********************************************************************** * is_sos_ineq - check if inequality is packing (SOS) constraint * * This routine checks if the specified "0-1 knapsack" inequality * * sum{j in 1..n} a[j]*x[j] <= b (1) * * is equivalent to packing inequality (Padberg calls such inequalities * special ordered set or SOS constraints) * * sum{j in J'} x[j] - sum{j in J"} x[j] <= 1 - |J"|. (2) * * If so, the routine returns true, otherwise false. * * Note that if X is a set of feasible binary points satisfying to (2), * its convex hull conv(X) equals to the set of feasible points of LP * relaxation of (2), which is a n-dimensional simplex, so inequalities * (2) are useless for generating cover cuts (due to unimodularity). * * ALGORITHM * * First, we make all a[j] positive by complementing x[j] = 1 - x'[j] * in (1). This is performed implicitly (i.e. actually the array a is * not changed), but b is replaced by b - sum{j : a[j] < 0}. * * Then we find two smallest coefficients a[p] = min{j in 1..n} a[j] * and a[q] = min{j in 1..n : j != p} a[j]. It is obvious that if * a[p] + a[q] > b, then a[i] + a[j] > b for all i != j, from which it * follows that x[i] + x[j] <= 1 for all i != j. But the latter means * that the original inequality (with all a[j] > 0) is equivalent to * packing inequality * * sum{j in 1..n} x[j] <= 1. (3) * * Returning to original (uncomplemented) variables x'[j] = 1 - x[j] * we have that the original inequality is equivalent to (2), where * J' = {j : a[j] > 0} and J" = {j : a[j] < 0}. */ static int is_sos_ineq(int n, const double a[], double b) { int j, p, q; xassert(n >= 2); /* compute b := b - sum{j : a[j] < 0} */ for (j = 1; j <= n; j++) { if (a[j] < 0) b -= a[j]; } /* find a[p] = min{j in 1..n} a[j] */ p = 1; for (j = 2; j <= n; j++) { if (fabs(a[p]) > fabs(a[j])) p = j; } /* find a[q] = min{j in 1..n : j != p} a[j] */ q = 0; for (j = 1; j <= n; j++) { if (j != p) { if (q == 0 || fabs(a[q]) > fabs(a[j])) q = j; } } xassert(q != 0); /* check condition a[p] + a[q] > b */ return fabs(a[p]) + fabs(a[q]) > b + .001 * (1 + fabs(b)); } /*********************************************************************** * process_ineq - basic inequality processing * * This routine performs basic processing of an inequality of "not * greater" type * * sum{j in 1..n} a[j]*x[j] <= b * * specified by the parameters, n, ind, a, and b. * * If the inequality can be transformed to "0-1 knapsack" ineqiality * suitable for generating cover cuts, the routine adds it to the set * of "0-1 knapsack" inequalities. * * Note that the arrays ind and a are not saved on exit. */ static void process_ineq(struct csa *csa, int n, int ind[], double a[], double b, FVS *v) { int i; /* attempt to transform the specified inequality to equivalent or * relaxed "0-1 knapsack" inequality */ n = build_ks(csa, n, ind, a, &b, v); if (n <= 1) { /* uninteresting inequality (in principle, such inequalities * should be removed by the preprocessor) */ goto done; } if (!can_be_active(n, a, b)) { /* inequality is redundant (i.e. cannot be active) */ goto done; } if (is_sos_ineq(n, a, b)) { /* packing (SOS) inequality is useless for generating cover * cuts; currently such inequalities are just ignored */ goto done; } /* add resulting "0-1 knapsack" inequality to the set */ i = glp_add_rows(csa->set, 1); glp_set_mat_row(csa->set, i, n, ind, a); glp_set_row_bnds(csa->set, i, GLP_UP, b, b); done: return; } /**********************************************************************/ glp_cov *glp_cov_init(glp_prob *P) { /* create and initialize cover cut generator */ glp_cov *cov; struct csa csa; int i, k, len, *ind; double rhs, *val; FVS fvs; csa.P = P; csa.l = talloc(1+P->n, struct bnd); csa.u = talloc(1+P->n, struct bnd); csa.set = glp_create_prob(); glp_add_cols(csa.set, P->n); /* initialize bounds of variables with simple bounds */ init_bounds(&csa); /* obtain and set variable bounds */ obtain_vbs(&csa); /* allocate working arrays */ ind = talloc(1+P->n, int); val = talloc(1+P->n, double); fvs_alloc_vec(&fvs, P->n); /* process all rows of the root mip */ for (i = 1; i <= P->m; i++) { switch (P->row[i]->type) { case GLP_FR: break; case GLP_LO: /* obtain row of ">=" type */ len = glp_get_mat_row(P, i, ind, val); rhs = P->row[i]->lb; /* transforms it to row of "<=" type */ for (k = 1; k <= len; k++) val[k] = - val[k]; rhs = - rhs; /* process the row */ process_ineq(&csa, len, ind, val, rhs, &fvs); break; case GLP_UP: /* obtain row of "<=" type */ len = glp_get_mat_row(P, i, ind, val); rhs = P->row[i]->ub; /* and process it */ process_ineq(&csa, len, ind, val, rhs, &fvs); break; case GLP_DB: case GLP_FX: /* double-sided inequalitiy and equality constraints are * processed as two separate inequalities */ /* obtain row as if it were of ">=" type */ len = glp_get_mat_row(P, i, ind, val); rhs = P->row[i]->lb; /* transforms it to row of "<=" type */ for (k = 1; k <= len; k++) val[k] = - val[k]; rhs = - rhs; /* and process it */ process_ineq(&csa, len, ind, val, rhs, &fvs); /* obtain the same row as if it were of "<=" type */ len = glp_get_mat_row(P, i, ind, val); rhs = P->row[i]->ub; /* and process it */ process_ineq(&csa, len, ind, val, rhs, &fvs); break; default: xassert(P != P); } } /* free working arrays */ tfree(ind); tfree(val); fvs_check_vec(&fvs); fvs_free_vec(&fvs); /* the set of "0-1 knapsack" inequalities has been built */ if (csa.set->m == 0) { /* the set is empty */ xprintf("No 0-1 knapsack inequalities detected\n"); cov = NULL; glp_delete_prob(csa.set); } else { /* create the cover cut generator working area */ xprintf("Number of 0-1 knapsack inequalities = %d\n", csa.set->m); cov = talloc(1, glp_cov); cov->n = P->n; cov->set = csa.set; #if 0 glp_write_lp(cov->set, 0, "set.lp"); #endif } tfree(csa.l); tfree(csa.u); return cov; } /*********************************************************************** * solve_ks - solve 0-1 knapsack problem * * This routine finds (sub)optimal solution to 0-1 knapsack problem: * * maximize z = sum{j in 1..n} c[j]x[j] (1) * * s.t. sum{j in 1..n} a[j]x[j] <= b (2) * * x[j] in {0, 1} for all j in 1..n (3) * * It is assumed that the instance is non-normalized, i.e. parameters * a, b, and c may have any sign. * * On exit the routine stores the (sub)optimal point found in locations * x[1], ..., x[n] and returns the optimal objective value. However, if * the instance is infeasible, the routine returns INT_MIN. */ static int solve_ks(int n, const int a[], int b, const int c[], char x[]) { int z; /* surprisingly, even for some small instances (n = 50-100) * MT1 routine takes too much time, so it is used only for tiny * instances */ if (n <= 16) #if 0 z = ks_enum(n, a, b, c, x); #else z = ks_mt1(n, a, b, c, x); #endif else z = ks_greedy(n, a, b, c, x); return z; } /*********************************************************************** * simple_cover - find simple cover cut * * Given a 0-1 knapsack inequality (which may be globally as well as * locally valid) * * sum{j in 1..n} a[j]x[j] <= b, (1) * * where all x[j] are binary variables and all a[j] are positive, and * a fractional point x~{j in 1..n}, which is feasible to LP relaxation * of (1), this routine attempts to find a simple cover inequality * * sum{j in C} (1 - x[j]) >= 1, (2) * * which is valid for (1) and violated at x~. * * Actually, the routine finds a cover C, i.e. a subset of {1, ..., n} * such that * * sum{j in C} a[j] > b, (3) * * and which minimizes the left-hand side of (2) at x~ * * zeta = sum{j in C} (1 - x~[j]). (4) * * On exit the routine stores the characteritic vector z{j in 1..n} * of the cover found (i.e. z[j] = 1 means j in C, and z[j] = 0 means * j not in C), and returns corresponding minimal value of zeta (4). * However, if no cover is found, the routine returns DBL_MAX. * * ALGORITHM * * The separation problem (3)-(4) is converted to 0-1 knapsack problem * as follows. * * First, note that the constraint (3) is equivalent to * * sum{j in 1..n} a[j]z[j] >= b + eps, (5) * * where eps > 0 is a sufficiently small number (in case of integral * a and b we may take eps = 1). Multiplying both sides of (5) by (-1) * gives * * sum{j in 1..n} (-a[j])z[j] <= - b - eps. (6) * * To make all coefficients in (6) positive, z[j] is complemented by * substitution z[j] = 1 - z'[j] that finally gives * * sum{j in 1..n} a[j]z'[j] <= sum{j in 1..n} a[j] - b - eps. (7) * * Minimization of zeta (4) is equivalent to maximization of * * -zeta = sum{j in 1..n} (x~[j] - 1)z[j]. (8) * * Substitution z[j] = 1 - z'[j] gives * * -zeta = sum{j in 1..n} (1 - x~[j])z'[j] - zeta0, (9) * * where zeta0 = sum{j in 1..n} (1 - x~[j]) is a constant term. * * Thus, the 0-1 knapsack problem to be solved is the following: * * maximize * * -zeta = sum{j in 1..n} (1 - x~[j])z'[j] - zeta0 (10) * * subject to * * sum{j in 1..n} a[j]z'[j] <= sum{j in 1..n} a[j] - b - eps (11) * * z'[j] in {0,1} for all j = 1,...,n (12) * * (The constant term zeta0 doesn't affect the solution, so it can be * dropped.) */ static double simple_cover(int n, const double a[], double b, const double x[], char z[]) { int j, *aa, bb, *cc; double max_aj, min_aj, s, eps; xassert(n >= 3); /* allocate working arrays */ aa = talloc(1+n, int); cc = talloc(1+n, int); /* compute max{j in 1..n} a[j] and min{j in 1..n} a[j] */ max_aj = 0, min_aj = DBL_MAX; for (j = 1; j <= n; j++) { xassert(a[j] > 0); if (max_aj < a[j]) max_aj = a[j]; if (min_aj > a[j]) min_aj = a[j]; } /* scale and round constraint parameters to make them integral; * note that we make the resulting inequality stronger than (11), * so a[j]'s are rounded up while rhs is rounded down */ s = 0; for (j = 1; j <= n; j++) { s += a[j]; aa[j] = ceil(a[j] / max_aj * 1000); } bb = floor((s - b) / max_aj * 1000) - 1; /* scale and round obj. coefficients to make them integral; * again we make the objective function stronger than (10), so * the coefficients are rounded down */ for (j = 1; j <= n; j++) { xassert(0 <= x[j] && x[j] <= 1); cc[j] = floor((1 - x[j]) * 1000); } /* solve separation problem */ if (solve_ks(n, aa, bb, cc, z) == INT_MIN) { /* no cover exists */ s = DBL_MAX; goto skip; } /* determine z[j] = 1 - z'[j] */ for (j = 1; j <= n; j++) { xassert(z[j] == 0 || z[j] == 1); z[j] ^= 1; } /* check condition (11) for original (non-scaled) parameters */ s = 0; for (j = 1; j <= n; j++) { if (z[j]) s += a[j]; } eps = 0.01 * (min_aj >= 1 ? min_aj : 1); if (!(s >= b + eps)) { /* no cover found within a precision req'd */ s = DBL_MAX; goto skip; } /* compute corresponding zeta (4) for cover found */ s = 0; for (j = 1; j <= n; j++) { if (z[j]) s += 1 - x[j]; } skip: /* free working arrays */ tfree(aa); tfree(cc); return s; } /**********************************************************************/ void glp_cov_gen1(glp_prob *P, glp_cov *cov, glp_prob *pool) { /* generate locally valid simple cover cuts */ int i, k, len, new_len, *ind; double *val, rhs, *x, zeta; char *z; xassert(P->n == cov->n && P->n == cov->set->n); xassert(glp_get_status(P) == GLP_OPT); /* allocate working arrays */ ind = talloc(1+P->n, int); val = talloc(1+P->n, double); x = talloc(1+P->n, double); z = talloc(1+P->n, char); /* walk thru 0-1 knapsack inequalities */ for (i = 1; i <= cov->set->m; i++) { /* retrieve 0-1 knapsack inequality */ len = glp_get_mat_row(cov->set, i, ind, val); rhs = glp_get_row_ub(cov->set, i); xassert(rhs != +DBL_MAX); /* FIXME: skip, if slack is too large? */ /* substitute and eliminate binary variables which have been * fixed in the current subproblem (this makes the inequality * only locally valid) */ new_len = 0; for (k = 1; k <= len; k++) { if (glp_get_col_type(P, ind[k]) == GLP_FX) rhs -= val[k] * glp_get_col_prim(P, ind[k]); else { new_len++; ind[new_len] = ind[k]; val[new_len] = val[k]; } } len = new_len; /* we need at least 3 binary variables in the inequality */ if (len <= 2) continue; /* obtain values of binary variables from optimal solution to * LP relaxation of current subproblem */ for (k = 1; k <= len; k++) { xassert(glp_get_col_kind(P, ind[k]) == GLP_BV); x[k] = glp_get_col_prim(P, ind[k]); if (x[k] < 0.00001) x[k] = 0; else if (x[k] > 0.99999) x[k] = 1; /* if val[k] < 0, perform substitution x[k] = 1 - x'[k] to * make all coefficients positive */ if (val[k] < 0) { ind[k] = - ind[k]; /* x[k] is complemented */ val[k] = - val[k]; rhs += val[k]; x[k] = 1 - x[k]; } } /* find locally valid simple cover cut */ zeta = simple_cover(len, val, rhs, x, z); if (zeta > 0.95) { /* no violation or insufficient violation; see (2) */ continue; } /* construct cover inequality (2) for the cover found, which * for original binary variables x[k] is equivalent to: * sum{k in C'} x[k] + sum{k in C"} x'[k] <= |C| - 1 * or * sum{k in C'} x[k] + sum{k in C"} (1 - x[k]) <= |C| - 1 * or * sum{k in C'} x[k] - sum{k in C"} x[k] <= |C'| - 1 * since |C| - |C"| = |C'| */ new_len = 0; rhs = -1; for (k = 1; k <= len; k++) { if (z[k]) { new_len++; if (ind[k] > 0) { ind[new_len] = +ind[k]; val[new_len] = +1; rhs++; } else /* ind[k] < 0 */ { ind[new_len] = -ind[k]; val[new_len] = -1; } } } len = new_len; /* add the cover inequality to the local cut pool */ k = glp_add_rows(pool, 1); glp_set_mat_row(pool, k, len, ind, val); glp_set_row_bnds(pool, k, GLP_UP, rhs, rhs); } /* free working arrays */ tfree(ind); tfree(val); tfree(x); tfree(z); return; } /**********************************************************************/ void glp_cov_free(glp_cov *cov) { /* delete cover cut generator workspace */ xassert(cov != NULL); glp_delete_prob(cov->set); tfree(cov); return; } /* eof */ glpk-5.0/src/intopt/fpump.c0000644000062000006210000003005313766346220015102 0ustar maomkpasswd/* fpump.c (feasibility pump heuristic) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2009-2018 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "ios.h" #include "rng.h" /*********************************************************************** * NAME * * ios_feas_pump - feasibility pump heuristic * * SYNOPSIS * * #include "glpios.h" * void ios_feas_pump(glp_tree *T); * * DESCRIPTION * * The routine ios_feas_pump is a simple implementation of the Feasi- * bility Pump heuristic. * * REFERENCES * * M.Fischetti, F.Glover, and A.Lodi. "The feasibility pump." Math. * Program., Ser. A 104, pp. 91-104 (2005). */ struct VAR { /* binary variable */ int j; /* ordinal number */ int x; /* value in the rounded solution (0 or 1) */ double d; /* sorting key */ }; static int CDECL fcmp(const void *x, const void *y) { /* comparison routine */ const struct VAR *vx = x, *vy = y; if (vx->d > vy->d) return -1; else if (vx->d < vy->d) return +1; else return 0; } void ios_feas_pump(glp_tree *T) { glp_prob *P = T->mip; int n = P->n; glp_prob *lp = NULL; struct VAR *var = NULL; RNG *rand = NULL; GLPCOL *col; glp_smcp parm; int j, k, new_x, nfail, npass, nv, ret, stalling; double dist, tol; xassert(glp_get_status(P) == GLP_OPT); /* this heuristic is applied only once on the root level */ if (!(T->curr->level == 0 && T->curr->solved == 1)) goto done; /* determine number of binary variables */ nv = 0; for (j = 1; j <= n; j++) { col = P->col[j]; /* if x[j] is continuous, skip it */ if (col->kind == GLP_CV) continue; /* if x[j] is fixed, skip it */ if (col->type == GLP_FX) continue; /* x[j] is non-fixed integer */ xassert(col->kind == GLP_IV); if (col->type == GLP_DB && col->lb == 0.0 && col->ub == 1.0) { /* x[j] is binary */ nv++; } else { /* x[j] is general integer */ if (T->parm->msg_lev >= GLP_MSG_ALL) xprintf("FPUMP heuristic cannot be applied due to genera" "l integer variables\n"); goto done; } } /* there must be at least one binary variable */ if (nv == 0) goto done; if (T->parm->msg_lev >= GLP_MSG_ALL) xprintf("Applying FPUMP heuristic...\n"); /* build the list of binary variables */ var = xcalloc(1+nv, sizeof(struct VAR)); k = 0; for (j = 1; j <= n; j++) { col = P->col[j]; if (col->kind == GLP_IV && col->type == GLP_DB) var[++k].j = j; } xassert(k == nv); /* create working problem object */ lp = glp_create_prob(); more: /* copy the original problem object to keep it intact */ glp_copy_prob(lp, P, GLP_OFF); /* we are interested to find an integer feasible solution, which is better than the best known one */ if (P->mip_stat == GLP_FEAS) { int *ind; double *val, bnd; /* add a row and make it identical to the objective row */ glp_add_rows(lp, 1); ind = xcalloc(1+n, sizeof(int)); val = xcalloc(1+n, sizeof(double)); for (j = 1; j <= n; j++) { ind[j] = j; val[j] = P->col[j]->coef; } glp_set_mat_row(lp, lp->m, n, ind, val); xfree(ind); xfree(val); /* introduce upper (minimization) or lower (maximization) bound to the original objective function; note that this additional constraint is not violated at the optimal point to LP relaxation */ #if 0 /* modified by xypron */ if (P->dir == GLP_MIN) { bnd = P->mip_obj - 0.10 * (1.0 + fabs(P->mip_obj)); if (bnd < P->obj_val) bnd = P->obj_val; glp_set_row_bnds(lp, lp->m, GLP_UP, 0.0, bnd - P->c0); } else if (P->dir == GLP_MAX) { bnd = P->mip_obj + 0.10 * (1.0 + fabs(P->mip_obj)); if (bnd > P->obj_val) bnd = P->obj_val; glp_set_row_bnds(lp, lp->m, GLP_LO, bnd - P->c0, 0.0); } else xassert(P != P); #else bnd = 0.1 * P->obj_val + 0.9 * P->mip_obj; /* xprintf("bnd = %f\n", bnd); */ if (P->dir == GLP_MIN) glp_set_row_bnds(lp, lp->m, GLP_UP, 0.0, bnd - P->c0); else if (P->dir == GLP_MAX) glp_set_row_bnds(lp, lp->m, GLP_LO, bnd - P->c0, 0.0); else xassert(P != P); #endif } /* reset pass count */ npass = 0; /* invalidate the rounded point */ for (k = 1; k <= nv; k++) var[k].x = -1; pass: /* next pass starts here */ npass++; if (T->parm->msg_lev >= GLP_MSG_ALL) xprintf("Pass %d\n", npass); /* initialize minimal distance between the basic point and the rounded one obtained during this pass */ dist = DBL_MAX; /* reset failure count (the number of succeeded iterations failed to improve the distance) */ nfail = 0; /* if it is not the first pass, perturb the last rounded point rather than construct it from the basic solution */ if (npass > 1) { double rho, temp; if (rand == NULL) rand = rng_create_rand(); for (k = 1; k <= nv; k++) { j = var[k].j; col = lp->col[j]; rho = rng_uniform(rand, -0.3, 0.7); if (rho < 0.0) rho = 0.0; temp = fabs((double)var[k].x - col->prim); if (temp + rho > 0.5) var[k].x = 1 - var[k].x; } goto skip; } loop: /* innermost loop begins here */ /* round basic solution (which is assumed primal feasible) */ stalling = 1; for (k = 1; k <= nv; k++) { col = lp->col[var[k].j]; if (col->prim < 0.5) { /* rounded value is 0 */ new_x = 0; } else { /* rounded value is 1 */ new_x = 1; } if (var[k].x != new_x) { stalling = 0; var[k].x = new_x; } } /* if the rounded point has not changed (stalling), choose and flip some its entries heuristically */ if (stalling) { /* compute d[j] = |x[j] - round(x[j])| */ for (k = 1; k <= nv; k++) { col = lp->col[var[k].j]; var[k].d = fabs(col->prim - (double)var[k].x); } /* sort the list of binary variables by descending d[j] */ qsort(&var[1], nv, sizeof(struct VAR), fcmp); /* choose and flip some rounded components */ for (k = 1; k <= nv; k++) { if (k >= 5 && var[k].d < 0.35 || k >= 10) break; var[k].x = 1 - var[k].x; } } skip: /* check if the time limit has been exhausted */ if (T->parm->tm_lim < INT_MAX && (double)(T->parm->tm_lim - 1) <= 1000.0 * xdifftime(xtime(), T->tm_beg)) goto done; /* build the objective, which is the distance between the current (basic) point and the rounded one */ lp->dir = GLP_MIN; lp->c0 = 0.0; for (j = 1; j <= n; j++) lp->col[j]->coef = 0.0; for (k = 1; k <= nv; k++) { j = var[k].j; if (var[k].x == 0) lp->col[j]->coef = +1.0; else { lp->col[j]->coef = -1.0; lp->c0 += 1.0; } } /* minimize the distance with the simplex method */ glp_init_smcp(&parm); if (T->parm->msg_lev <= GLP_MSG_ERR) parm.msg_lev = T->parm->msg_lev; else if (T->parm->msg_lev <= GLP_MSG_ALL) { parm.msg_lev = GLP_MSG_ON; parm.out_dly = 10000; } ret = glp_simplex(lp, &parm); if (ret != 0) { if (T->parm->msg_lev >= GLP_MSG_ERR) xprintf("Warning: glp_simplex returned %d\n", ret); goto done; } ret = glp_get_status(lp); if (ret != GLP_OPT) { if (T->parm->msg_lev >= GLP_MSG_ERR) xprintf("Warning: glp_get_status returned %d\n", ret); goto done; } if (T->parm->msg_lev >= GLP_MSG_DBG) xprintf("delta = %g\n", lp->obj_val); /* check if the basic solution is integer feasible; note that it may be so even if the minimial distance is positive */ tol = 0.3 * T->parm->tol_int; for (k = 1; k <= nv; k++) { col = lp->col[var[k].j]; if (tol < col->prim && col->prim < 1.0 - tol) break; } if (k > nv) { /* okay; the basic solution seems to be integer feasible */ double *x = xcalloc(1+n, sizeof(double)); for (j = 1; j <= n; j++) { x[j] = lp->col[j]->prim; if (P->col[j]->kind == GLP_IV) x[j] = floor(x[j] + 0.5); } #if 1 /* modified by xypron */ /* reset direction and right-hand side of objective */ lp->c0 = P->c0; lp->dir = P->dir; /* fix integer variables */ for (k = 1; k <= nv; k++) #if 0 /* 18/VI-2013; fixed by mao * this bug causes numerical instability, because column statuses * are not changed appropriately */ { lp->col[var[k].j]->lb = x[var[k].j]; lp->col[var[k].j]->ub = x[var[k].j]; lp->col[var[k].j]->type = GLP_FX; } #else glp_set_col_bnds(lp, var[k].j, GLP_FX, x[var[k].j], 0.); #endif /* copy original objective function */ for (j = 1; j <= n; j++) lp->col[j]->coef = P->col[j]->coef; /* solve original LP and copy result */ ret = glp_simplex(lp, &parm); if (ret != 0) { if (T->parm->msg_lev >= GLP_MSG_ERR) xprintf("Warning: glp_simplex returned %d\n", ret); #if 1 /* 17/III-2016: fix memory leak */ xfree(x); #endif goto done; } ret = glp_get_status(lp); if (ret != GLP_OPT) { if (T->parm->msg_lev >= GLP_MSG_ERR) xprintf("Warning: glp_get_status returned %d\n", ret); #if 1 /* 17/III-2016: fix memory leak */ xfree(x); #endif goto done; } for (j = 1; j <= n; j++) if (P->col[j]->kind != GLP_IV) x[j] = lp->col[j]->prim; #endif ret = glp_ios_heur_sol(T, x); xfree(x); if (ret == 0) { /* the integer solution is accepted */ if (ios_is_hopeful(T, T->curr->bound)) { /* it is reasonable to apply the heuristic once again */ goto more; } else { /* the best known integer feasible solution just found is close to optimal solution to LP relaxation */ goto done; } } } /* the basic solution is fractional */ if (dist == DBL_MAX || lp->obj_val <= dist - 1e-6 * (1.0 + dist)) { /* the distance is reducing */ nfail = 0, dist = lp->obj_val; } else { /* improving the distance failed */ nfail++; } if (nfail < 3) goto loop; if (npass < 5) goto pass; done: /* delete working objects */ if (lp != NULL) glp_delete_prob(lp); if (var != NULL) xfree(var); if (rand != NULL) rng_delete_rand(rand); return; } /* eof */ glpk-5.0/src/intopt/gmicut.c0000644000062000006210000002363513766346220015253 0ustar maomkpasswd/* gmicut.c (Gomory's mixed integer cut generator) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2002-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "prob.h" /*********************************************************************** * NAME * * glp_gmi_cut - generate Gomory's mixed integer cut (core routine) * * SYNOPSIS * * int glp_gmi_cut(glp_prob *P, int j, int ind[], double val[], double * phi[]); * * DESCRIPTION * * This routine attempts to generate a Gomory's mixed integer cut for * specified integer column (structural variable), whose primal value * in current basic solution is integer infeasible (fractional). * * On entry to the routine the basic solution contained in the problem * object P should be optimal, and the basis factorization should be * valid. The parameter j should specify the ordinal number of column * (structural variable x[j]), for which the cut should be generated, * 1 <= j <= n, where n is the number of columns in the problem object. * This column should be integer, non-fixed, and basic, and its primal * value should be fractional. * * The cut generated by the routine is the following inequality: * * sum a[j] * x[j] >= b, * * which is expected to be violated at the current basic solution. * * If the cut has been successfully generated, the routine stores its * non-zero coefficients a[j] and corresponding column indices j in the * array locations val[1], ..., val[len] and ind[1], ..., ind[len], * where 1 <= len <= n is the number of non-zero coefficients. The * right-hand side value b is stored in val[0], and ind[0] is set to 0. * * The working array phi should have 1+m+n locations (location phi[0] * is not used), where m and n is the number of rows and columns in the * problem object, resp. * * RETURNS * * If the cut has been successfully generated, the routine returns * len, the number of non-zero coefficients in the cut, 1 <= len <= n. * * Otherwise, the routine returns one of the following codes: * * -1 current basis factorization is not valid; * * -2 current basic solution is not optimal; * * -3 column ordinal number j is out of range; * * -4 variable x[j] is not of integral kind; * * -5 variable x[j] is either fixed or non-basic; * * -6 primal value of variable x[j] in basic solution is too close * to nearest integer; * * -7 some coefficients in the simplex table row corresponding to * variable x[j] are too large in magnitude; * * -8 some free (unbounded) variables have non-zero coefficients in * the simplex table row corresponding to variable x[j]. * * ALGORITHM * * See glpk/doc/notes/gomory (in Russian). */ #define f(x) ((x) - floor(x)) /* compute fractional part of x */ int glp_gmi_cut(glp_prob *P, int j, int ind[/*1+n*/], double val[/*1+n*/], double phi[/*1+m+n*/]) { int m = P->m; int n = P->n; GLPROW *row; GLPCOL *col; GLPAIJ *aij; int i, k, len, kind, stat; double lb, ub, alfa, beta, ksi, phi1, rhs; /* sanity checks */ if (!(P->m == 0 || P->valid)) { /* current basis factorization is not valid */ return -1; } if (!(P->pbs_stat == GLP_FEAS && P->dbs_stat == GLP_FEAS)) { /* current basic solution is not optimal */ return -2; } if (!(1 <= j && j <= n)) { /* column ordinal number is out of range */ return -3; } col = P->col[j]; if (col->kind != GLP_IV) { /* x[j] is not of integral kind */ return -4; } if (col->type == GLP_FX || col->stat != GLP_BS) { /* x[j] is either fixed or non-basic */ return -5; } if (fabs(col->prim - floor(col->prim + 0.5)) < 0.001) { /* primal value of x[j] is too close to nearest integer */ return -6; } /* compute row of the simplex tableau, which (row) corresponds * to specified basic variable xB[i] = x[j]; see (23) */ len = glp_eval_tab_row(P, m+j, ind, val); /* determine beta[i], which a value of xB[i] in optimal solution * to current LP relaxation; note that this value is the same as * if it would be computed with formula (27); it is assumed that * beta[i] is fractional enough */ beta = P->col[j]->prim; /* compute cut coefficients phi and right-hand side rho, which * correspond to formula (30); dense format is used, because rows * of the simplex tableau are usually dense */ for (k = 1; k <= m+n; k++) phi[k] = 0.0; rhs = f(beta); /* initial value of rho; see (28), (32) */ for (j = 1; j <= len; j++) { /* determine original number of non-basic variable xN[j] */ k = ind[j]; xassert(1 <= k && k <= m+n); /* determine the kind, bounds and current status of xN[j] in * optimal solution to LP relaxation */ if (k <= m) { /* auxiliary variable */ row = P->row[k]; kind = GLP_CV; lb = row->lb; ub = row->ub; stat = row->stat; } else { /* structural variable */ col = P->col[k-m]; kind = col->kind; lb = col->lb; ub = col->ub; stat = col->stat; } /* xN[j] cannot be basic */ xassert(stat != GLP_BS); /* determine row coefficient ksi[i,j] at xN[j]; see (23) */ ksi = val[j]; /* if ksi[i,j] is too large in magnitude, report failure */ if (fabs(ksi) > 1e+05) return -7; /* if ksi[i,j] is too small in magnitude, skip it */ if (fabs(ksi) < 1e-10) goto skip; /* compute row coefficient alfa[i,j] at y[j]; see (26) */ switch (stat) { case GLP_NF: /* xN[j] is free (unbounded) having non-zero ksi[i,j]; * report failure */ return -8; case GLP_NL: /* xN[j] has active lower bound */ alfa = - ksi; break; case GLP_NU: /* xN[j] has active upper bound */ alfa = + ksi; break; case GLP_NS: /* xN[j] is fixed; skip it */ goto skip; default: xassert(stat != stat); } /* compute cut coefficient phi'[j] at y[j]; see (21), (28) */ switch (kind) { case GLP_IV: /* y[j] is integer */ if (fabs(alfa - floor(alfa + 0.5)) < 1e-10) { /* alfa[i,j] is close to nearest integer; skip it */ goto skip; } else if (f(alfa) <= f(beta)) phi1 = f(alfa); else phi1 = (f(beta) / (1.0 - f(beta))) * (1.0 - f(alfa)); break; case GLP_CV: /* y[j] is continuous */ if (alfa >= 0.0) phi1 = + alfa; else phi1 = (f(beta) / (1.0 - f(beta))) * (- alfa); break; default: xassert(kind != kind); } /* compute cut coefficient phi[j] at xN[j] and update right- * hand side rho; see (31), (32) */ switch (stat) { case GLP_NL: /* xN[j] has active lower bound */ phi[k] = + phi1; rhs += phi1 * lb; break; case GLP_NU: /* xN[j] has active upper bound */ phi[k] = - phi1; rhs -= phi1 * ub; break; default: xassert(stat != stat); } skip: ; } /* now the cut has the form sum_k phi[k] * x[k] >= rho, where cut * coefficients are stored in the array phi in dense format; * x[1,...,m] are auxiliary variables, x[m+1,...,m+n] are struc- * tural variables; see (30) */ /* eliminate auxiliary variables in order to express the cut only * through structural variables; see (33) */ for (i = 1; i <= m; i++) { if (fabs(phi[i]) < 1e-10) continue; /* auxiliary variable x[i] has non-zero cut coefficient */ row = P->row[i]; /* x[i] cannot be fixed variable */ xassert(row->type != GLP_FX); /* substitute x[i] = sum_j a[i,j] * x[m+j] */ for (aij = row->ptr; aij != NULL; aij = aij->r_next) phi[m+aij->col->j] += phi[i] * aij->val; } /* convert the final cut to sparse format and substitute fixed * (structural) variables */ len = 0; for (j = 1; j <= n; j++) { if (fabs(phi[m+j]) < 1e-10) continue; /* structural variable x[m+j] has non-zero cut coefficient */ col = P->col[j]; if (col->type == GLP_FX) { /* eliminate x[m+j] */ rhs -= phi[m+j] * col->lb; } else { len++; ind[len] = j; val[len] = phi[m+j]; } } if (fabs(rhs) < 1e-12) rhs = 0.0; ind[0] = 0, val[0] = rhs; /* the cut has been successfully generated */ return len; } /* eof */ glpk-5.0/src/intopt/gmigen.c0000644000062000006210000001133713766346220015225 0ustar maomkpasswd/* gmigen.c (Gomory's mixed integer cuts generator) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2002-2018 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "prob.h" /*********************************************************************** * NAME * * glp_gmi_gen - generate Gomory's mixed integer cuts * * SYNOPSIS * * int glp_gmi_gen(glp_prob *P, glp_prob *pool, int max_cuts); * * DESCRIPTION * * This routine attempts to generate Gomory's mixed integer cuts for * integer variables, whose primal values in current basic solution are * integer infeasible (fractional). * * On entry to the routine the basic solution contained in the problem * object P should be optimal, and the basis factorization should be * valid. * * The cutting plane inequalities generated by the routine are added to * the specified cut pool. * * The parameter max_cuts specifies the maximal number of cuts to be * generated. Note that the number of cuts cannot exceed the number of * basic variables, which is the number of rows in the problem object. * * RETURNS * * The routine returns the number of cuts that have been generated and * added to the cut pool. */ #define f(x) ((x) - floor(x)) /* compute fractional part of x */ struct var { int j; double f; }; static int CDECL fcmp(const void *p1, const void *p2) { const struct var *v1 = p1, *v2 = p2; if (v1->f > v2->f) return -1; if (v1->f < v2->f) return +1; return 0; } int glp_gmi_gen(glp_prob *P, glp_prob *pool, int max_cuts) { int m = P->m; int n = P->n; GLPCOL *col; struct var *var; int i, j, k, t, len, nv, nnn, *ind; double frac, *val, *phi; /* sanity checks */ if (!(P->m == 0 || P->valid)) xerror("glp_gmi_gen: basis factorization does not exist\n"); if (!(P->pbs_stat == GLP_FEAS && P->dbs_stat == GLP_FEAS)) xerror("glp_gmi_gen: optimal basic solution required\n"); if (pool->n != n) xerror("glp_gmi_gen: cut pool has wrong number of columns\n"); /* allocate working arrays */ var = xcalloc(1+n, sizeof(struct var)); ind = xcalloc(1+n, sizeof(int)); val = xcalloc(1+n, sizeof(double)); phi = xcalloc(1+m+n, sizeof(double)); /* build the list of integer structural variables, which are * basic and have integer infeasible (fractional) primal values * in optimal solution to specified LP */ nv = 0; for (j = 1; j <= n; j++) { col = P->col[j]; if (col->kind != GLP_IV) continue; if (col->type == GLP_FX) continue; if (col->stat != GLP_BS) continue; frac = f(col->prim); if (!(0.05 <= frac && frac <= 0.95)) continue; /* add variable to the list */ nv++, var[nv].j = j, var[nv].f = frac; } /* sort the list by descending fractionality */ qsort(&var[1], nv, sizeof(struct var), fcmp); /* try to generate cuts by one for each variable in the list, but * not more than max_cuts cuts */ nnn = 0; for (t = 1; t <= nv; t++) { len = glp_gmi_cut(P, var[t].j, ind, val, phi); if (len < 1) goto skip; /* if the cut inequality seems to be badly scaled, reject it * to avoid numerical difficulties */ for (k = 1; k <= len; k++) { if (fabs(val[k]) < 1e-03) goto skip; if (fabs(val[k]) > 1e+03) goto skip; } /* add the cut to the cut pool for further consideration */ i = glp_add_rows(pool, 1); glp_set_row_bnds(pool, i, GLP_LO, val[0], 0); glp_set_mat_row(pool, i, len, ind, val); /* one cut has been generated */ nnn++; if (nnn == max_cuts) break; skip: ; } /* free working arrays */ xfree(var); xfree(ind); xfree(val); xfree(phi); return nnn; } /* eof */ glpk-5.0/src/intopt/mirgen.c0000644000062000006210000014376713766346220015255 0ustar maomkpasswd/* mirgen.c (mixed integer rounding cuts generator) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2007-2018 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #if 1 /* 29/II-2016 by Chris */ /*---------------------------------------------------------------------- Subject: Mir cut generation performance improvement From: Chris Matrakidis To: Andrew Makhorin , help-glpk Andrew, I noticed that mir cut generation takes considerable time on some large problems (like rocII-4-11 from miplib). The attached patch makes two improvements that considerably improve performance in such instances: 1. A lot of time was spent on generating a temporary vector in function aggregate_row. It is a lot faster to reuse an existing vector. 2. A search for an element in the same function was done in row order, where using the elements in the order they are in the column is more efficient. This changes the generated cuts in some cases, but seems neutral overall (0.3% less cuts in a test set of 64 miplib instances). Best Regards, Chris Matrakidis ----------------------------------------------------------------------*/ #endif #include "env.h" #include "prob.h" #include "spv.h" #define MIR_DEBUG 0 #define MAXAGGR 5 /* maximal number of rows that can be aggregated */ struct glp_mir { /* MIR cut generator working area */ /*--------------------------------------------------------------*/ /* global information valid for the root subproblem */ int m; /* number of rows (in the root subproblem) */ int n; /* number of columns */ char *skip; /* char skip[1+m]; */ /* skip[i], 1 <= i <= m, is a flag that means that row i should not be used because (1) it is not suitable, or (2) because it has been used in the aggregated constraint */ char *isint; /* char isint[1+m+n]; */ /* isint[k], 1 <= k <= m+n, is a flag that means that variable x[k] is integer (otherwise, continuous) */ double *lb; /* double lb[1+m+n]; */ /* lb[k], 1 <= k <= m+n, is lower bound of x[k]; -DBL_MAX means that x[k] has no lower bound */ int *vlb; /* int vlb[1+m+n]; */ /* vlb[k] = k', 1 <= k <= m+n, is the number of integer variable, which defines variable lower bound x[k] >= lb[k] * x[k']; zero means that x[k] has simple lower bound */ double *ub; /* double ub[1+m+n]; */ /* ub[k], 1 <= k <= m+n, is upper bound of x[k]; +DBL_MAX means that x[k] has no upper bound */ int *vub; /* int vub[1+m+n]; */ /* vub[k] = k', 1 <= k <= m+n, is the number of integer variable, which defines variable upper bound x[k] <= ub[k] * x[k']; zero means that x[k] has simple upper bound */ /*--------------------------------------------------------------*/ /* current (fractional) point to be separated */ double *x; /* double x[1+m+n]; */ /* x[k] is current value of auxiliary (1 <= k <= m) or structural (m+1 <= k <= m+n) variable */ /*--------------------------------------------------------------*/ /* aggregated constraint sum a[k] * x[k] = b, which is a linear combination of original constraints transformed to equalities by introducing auxiliary variables */ int agg_cnt; /* number of rows (original constraints) used to build aggregated constraint, 1 <= agg_cnt <= MAXAGGR */ int *agg_row; /* int agg_row[1+MAXAGGR]; */ /* agg_row[k], 1 <= k <= agg_cnt, is the row number used to build aggregated constraint */ SPV *agg_vec; /* SPV agg_vec[1:m+n]; */ /* sparse vector of aggregated constraint coefficients, a[k] */ double agg_rhs; /* right-hand side of the aggregated constraint, b */ /*--------------------------------------------------------------*/ /* bound substitution flags for modified constraint */ char *subst; /* char subst[1+m+n]; */ /* subst[k], 1 <= k <= m+n, is a bound substitution flag used for variable x[k]: '?' - x[k] is missing in modified constraint 'L' - x[k] = (lower bound) + x'[k] 'U' - x[k] = (upper bound) - x'[k] */ /*--------------------------------------------------------------*/ /* modified constraint sum a'[k] * x'[k] = b', where x'[k] >= 0, derived from aggregated constraint by substituting bounds; note that due to substitution of variable bounds there may be additional terms in the modified constraint */ SPV *mod_vec; /* SPV mod_vec[1:m+n]; */ /* sparse vector of modified constraint coefficients, a'[k] */ double mod_rhs; /* right-hand side of the modified constraint, b' */ /*--------------------------------------------------------------*/ /* cutting plane sum alpha[k] * x[k] <= beta */ SPV *cut_vec; /* SPV cut_vec[1:m+n]; */ /* sparse vector of cutting plane coefficients, alpha[k] */ double cut_rhs; /* right-hand size of the cutting plane, beta */ }; /*********************************************************************** * NAME * * glp_mir_init - create and initialize MIR cut generator * * SYNOPSIS * * glp_mir *glp_mir_init(glp_prob *P); * * DESCRIPTION * * This routine creates and initializes the MIR cut generator for the * specified problem object. * * RETURNS * * The routine returns a pointer to the MIR cut generator workspace. */ static void set_row_attrib(glp_prob *mip, glp_mir *mir) { /* set global row attributes */ int m = mir->m; int k; for (k = 1; k <= m; k++) { GLPROW *row = mip->row[k]; mir->skip[k] = 0; mir->isint[k] = 0; switch (row->type) { case GLP_FR: mir->lb[k] = -DBL_MAX, mir->ub[k] = +DBL_MAX; break; case GLP_LO: mir->lb[k] = row->lb, mir->ub[k] = +DBL_MAX; break; case GLP_UP: mir->lb[k] = -DBL_MAX, mir->ub[k] = row->ub; break; case GLP_DB: mir->lb[k] = row->lb, mir->ub[k] = row->ub; break; case GLP_FX: mir->lb[k] = mir->ub[k] = row->lb; break; default: xassert(row != row); } mir->vlb[k] = mir->vub[k] = 0; } return; } static void set_col_attrib(glp_prob *mip, glp_mir *mir) { /* set global column attributes */ int m = mir->m; int n = mir->n; int k; for (k = m+1; k <= m+n; k++) { GLPCOL *col = mip->col[k-m]; switch (col->kind) { case GLP_CV: mir->isint[k] = 0; break; case GLP_IV: mir->isint[k] = 1; break; default: xassert(col != col); } switch (col->type) { case GLP_FR: mir->lb[k] = -DBL_MAX, mir->ub[k] = +DBL_MAX; break; case GLP_LO: mir->lb[k] = col->lb, mir->ub[k] = +DBL_MAX; break; case GLP_UP: mir->lb[k] = -DBL_MAX, mir->ub[k] = col->ub; break; case GLP_DB: mir->lb[k] = col->lb, mir->ub[k] = col->ub; break; case GLP_FX: mir->lb[k] = mir->ub[k] = col->lb; break; default: xassert(col != col); } mir->vlb[k] = mir->vub[k] = 0; } return; } static void set_var_bounds(glp_prob *mip, glp_mir *mir) { /* set variable bounds */ int m = mir->m; GLPAIJ *aij; int i, k1, k2; double a1, a2; for (i = 1; i <= m; i++) { /* we need the row to be '>= 0' or '<= 0' */ if (!(mir->lb[i] == 0.0 && mir->ub[i] == +DBL_MAX || mir->lb[i] == -DBL_MAX && mir->ub[i] == 0.0)) continue; /* take first term */ aij = mip->row[i]->ptr; if (aij == NULL) continue; k1 = m + aij->col->j, a1 = aij->val; /* take second term */ aij = aij->r_next; if (aij == NULL) continue; k2 = m + aij->col->j, a2 = aij->val; /* there must be only two terms */ if (aij->r_next != NULL) continue; /* interchange terms, if needed */ if (!mir->isint[k1] && mir->isint[k2]) ; else if (mir->isint[k1] && !mir->isint[k2]) { k2 = k1, a2 = a1; k1 = m + aij->col->j, a1 = aij->val; } else { /* both terms are either continuous or integer */ continue; } /* x[k2] should be double-bounded */ if (mir->lb[k2] == -DBL_MAX || mir->ub[k2] == +DBL_MAX || mir->lb[k2] == mir->ub[k2]) continue; /* change signs, if necessary */ if (mir->ub[i] == 0.0) a1 = - a1, a2 = - a2; /* now the row has the form a1 * x1 + a2 * x2 >= 0, where x1 is continuous, x2 is integer */ if (a1 > 0.0) { /* x1 >= - (a2 / a1) * x2 */ if (mir->vlb[k1] == 0) { /* set variable lower bound for x1 */ mir->lb[k1] = - a2 / a1; mir->vlb[k1] = k2; /* the row should not be used */ mir->skip[i] = 1; } } else /* a1 < 0.0 */ { /* x1 <= - (a2 / a1) * x2 */ if (mir->vub[k1] == 0) { /* set variable upper bound for x1 */ mir->ub[k1] = - a2 / a1; mir->vub[k1] = k2; /* the row should not be used */ mir->skip[i] = 1; } } } return; } static void mark_useless_rows(glp_prob *mip, glp_mir *mir) { /* mark rows which should not be used */ int m = mir->m; GLPAIJ *aij; int i, k, nv; for (i = 1; i <= m; i++) { /* free rows should not be used */ if (mir->lb[i] == -DBL_MAX && mir->ub[i] == +DBL_MAX) { mir->skip[i] = 1; continue; } nv = 0; for (aij = mip->row[i]->ptr; aij != NULL; aij = aij->r_next) { k = m + aij->col->j; /* rows with free variables should not be used */ if (mir->lb[k] == -DBL_MAX && mir->ub[k] == +DBL_MAX) { mir->skip[i] = 1; break; } /* rows with integer variables having infinite (lower or upper) bound should not be used */ if (mir->isint[k] && mir->lb[k] == -DBL_MAX || mir->isint[k] && mir->ub[k] == +DBL_MAX) { mir->skip[i] = 1; break; } /* count non-fixed variables */ if (!(mir->vlb[k] == 0 && mir->vub[k] == 0 && mir->lb[k] == mir->ub[k])) nv++; } /* rows with all variables fixed should not be used */ if (nv == 0) { mir->skip[i] = 1; continue; } } return; } glp_mir *glp_mir_init(glp_prob *mip) { /* create and initialize MIR cut generator */ int m = mip->m; int n = mip->n; glp_mir *mir; #if MIR_DEBUG xprintf("ios_mir_init: warning: debug mode enabled\n"); #endif /* allocate working area */ mir = xmalloc(sizeof(glp_mir)); mir->m = m; mir->n = n; mir->skip = xcalloc(1+m, sizeof(char)); mir->isint = xcalloc(1+m+n, sizeof(char)); mir->lb = xcalloc(1+m+n, sizeof(double)); mir->vlb = xcalloc(1+m+n, sizeof(int)); mir->ub = xcalloc(1+m+n, sizeof(double)); mir->vub = xcalloc(1+m+n, sizeof(int)); mir->x = xcalloc(1+m+n, sizeof(double)); mir->agg_row = xcalloc(1+MAXAGGR, sizeof(int)); mir->agg_vec = spv_create_vec(m+n); mir->subst = xcalloc(1+m+n, sizeof(char)); mir->mod_vec = spv_create_vec(m+n); mir->cut_vec = spv_create_vec(m+n); /* set global row attributes */ set_row_attrib(mip, mir); /* set global column attributes */ set_col_attrib(mip, mir); /* set variable bounds */ set_var_bounds(mip, mir); /* mark rows which should not be used */ mark_useless_rows(mip, mir); return mir; } /*********************************************************************** * NAME * * glp_mir_gen - generate mixed integer rounding (MIR) cuts * * SYNOPSIS * * int glp_mir_gen(glp_prob *P, glp_mir *mir, glp_prob *pool); * * DESCRIPTION * * This routine attempts to generate mixed integer rounding (MIR) cuts * for current basic solution to the specified problem object. * * The cutting plane inequalities generated by the routine are added to * the specified cut pool. * * RETURNS * * The routine returns the number of cuts that have been generated and * added to the cut pool. */ static void get_current_point(glp_prob *mip, glp_mir *mir) { /* obtain current point */ int m = mir->m; int n = mir->n; int k; for (k = 1; k <= m; k++) mir->x[k] = mip->row[k]->prim; for (k = m+1; k <= m+n; k++) mir->x[k] = mip->col[k-m]->prim; return; } #if MIR_DEBUG static void check_current_point(glp_mir *mir) { /* check current point */ int m = mir->m; int n = mir->n; int k, kk; double lb, ub, eps; for (k = 1; k <= m+n; k++) { /* determine lower bound */ lb = mir->lb[k]; kk = mir->vlb[k]; if (kk != 0) { xassert(lb != -DBL_MAX); xassert(!mir->isint[k]); xassert(mir->isint[kk]); lb *= mir->x[kk]; } /* check lower bound */ if (lb != -DBL_MAX) { eps = 1e-6 * (1.0 + fabs(lb)); xassert(mir->x[k] >= lb - eps); } /* determine upper bound */ ub = mir->ub[k]; kk = mir->vub[k]; if (kk != 0) { xassert(ub != +DBL_MAX); xassert(!mir->isint[k]); xassert(mir->isint[kk]); ub *= mir->x[kk]; } /* check upper bound */ if (ub != +DBL_MAX) { eps = 1e-6 * (1.0 + fabs(ub)); xassert(mir->x[k] <= ub + eps); } } return; } #endif static void initial_agg_row(glp_prob *mip, glp_mir *mir, int i) { /* use original i-th row as initial aggregated constraint */ int m = mir->m; GLPAIJ *aij; xassert(1 <= i && i <= m); xassert(!mir->skip[i]); /* mark i-th row in order not to use it in the same aggregated constraint */ mir->skip[i] = 2; mir->agg_cnt = 1; mir->agg_row[1] = i; /* use x[i] - sum a[i,j] * x[m+j] = 0, where x[i] is auxiliary variable of row i, x[m+j] are structural variables */ spv_clear_vec(mir->agg_vec); spv_set_vj(mir->agg_vec, i, 1.0); for (aij = mip->row[i]->ptr; aij != NULL; aij = aij->r_next) spv_set_vj(mir->agg_vec, m + aij->col->j, - aij->val); mir->agg_rhs = 0.0; #if MIR_DEBUG spv_check_vec(mir->agg_vec); #endif return; } #if MIR_DEBUG static void check_agg_row(glp_mir *mir) { /* check aggregated constraint */ int m = mir->m; int n = mir->n; int j, k; double r, big; /* compute the residual r = sum a[k] * x[k] - b and determine big = max(1, |a[k]|, |b|) */ r = 0.0, big = 1.0; for (j = 1; j <= mir->agg_vec->nnz; j++) { k = mir->agg_vec->ind[j]; xassert(1 <= k && k <= m+n); r += mir->agg_vec->val[j] * mir->x[k]; if (big < fabs(mir->agg_vec->val[j])) big = fabs(mir->agg_vec->val[j]); } r -= mir->agg_rhs; if (big < fabs(mir->agg_rhs)) big = fabs(mir->agg_rhs); /* the residual must be close to zero */ xassert(fabs(r) <= 1e-6 * big); return; } #endif static void subst_fixed_vars(glp_mir *mir) { /* substitute fixed variables into aggregated constraint */ int m = mir->m; int n = mir->n; int j, k; for (j = 1; j <= mir->agg_vec->nnz; j++) { k = mir->agg_vec->ind[j]; xassert(1 <= k && k <= m+n); if (mir->vlb[k] == 0 && mir->vub[k] == 0 && mir->lb[k] == mir->ub[k]) { /* x[k] is fixed */ mir->agg_rhs -= mir->agg_vec->val[j] * mir->lb[k]; mir->agg_vec->val[j] = 0.0; } } /* remove terms corresponding to fixed variables */ spv_clean_vec(mir->agg_vec, DBL_EPSILON); #if MIR_DEBUG spv_check_vec(mir->agg_vec); #endif return; } static void bound_subst_heur(glp_mir *mir) { /* bound substitution heuristic */ int m = mir->m; int n = mir->n; int j, k, kk; double d1, d2; for (j = 1; j <= mir->agg_vec->nnz; j++) { k = mir->agg_vec->ind[j]; xassert(1 <= k && k <= m+n); if (mir->isint[k]) continue; /* skip integer variable */ /* compute distance from x[k] to its lower bound */ kk = mir->vlb[k]; if (kk == 0) { if (mir->lb[k] == -DBL_MAX) d1 = DBL_MAX; else d1 = mir->x[k] - mir->lb[k]; } else { xassert(1 <= kk && kk <= m+n); xassert(mir->isint[kk]); xassert(mir->lb[k] != -DBL_MAX); d1 = mir->x[k] - mir->lb[k] * mir->x[kk]; } /* compute distance from x[k] to its upper bound */ kk = mir->vub[k]; if (kk == 0) { if (mir->vub[k] == +DBL_MAX) d2 = DBL_MAX; else d2 = mir->ub[k] - mir->x[k]; } else { xassert(1 <= kk && kk <= m+n); xassert(mir->isint[kk]); xassert(mir->ub[k] != +DBL_MAX); d2 = mir->ub[k] * mir->x[kk] - mir->x[k]; } /* x[k] cannot be free */ xassert(d1 != DBL_MAX || d2 != DBL_MAX); /* choose the bound which is closer to x[k] */ xassert(mir->subst[k] == '?'); if (d1 <= d2) mir->subst[k] = 'L'; else mir->subst[k] = 'U'; } return; } static void build_mod_row(glp_mir *mir) { /* substitute bounds and build modified constraint */ int m = mir->m; int n = mir->n; int j, jj, k, kk; /* initially modified constraint is aggregated constraint */ spv_copy_vec(mir->mod_vec, mir->agg_vec); mir->mod_rhs = mir->agg_rhs; #if MIR_DEBUG spv_check_vec(mir->mod_vec); #endif /* substitute bounds for continuous variables; note that due to substitution of variable bounds additional terms may appear in modified constraint */ for (j = mir->mod_vec->nnz; j >= 1; j--) { k = mir->mod_vec->ind[j]; xassert(1 <= k && k <= m+n); if (mir->isint[k]) continue; /* skip integer variable */ if (mir->subst[k] == 'L') { /* x[k] = (lower bound) + x'[k] */ xassert(mir->lb[k] != -DBL_MAX); kk = mir->vlb[k]; if (kk == 0) { /* x[k] = lb[k] + x'[k] */ mir->mod_rhs -= mir->mod_vec->val[j] * mir->lb[k]; } else { /* x[k] = lb[k] * x[kk] + x'[k] */ xassert(mir->isint[kk]); jj = mir->mod_vec->pos[kk]; if (jj == 0) { spv_set_vj(mir->mod_vec, kk, 1.0); jj = mir->mod_vec->pos[kk]; mir->mod_vec->val[jj] = 0.0; } mir->mod_vec->val[jj] += mir->mod_vec->val[j] * mir->lb[k]; } } else if (mir->subst[k] == 'U') { /* x[k] = (upper bound) - x'[k] */ xassert(mir->ub[k] != +DBL_MAX); kk = mir->vub[k]; if (kk == 0) { /* x[k] = ub[k] - x'[k] */ mir->mod_rhs -= mir->mod_vec->val[j] * mir->ub[k]; } else { /* x[k] = ub[k] * x[kk] - x'[k] */ xassert(mir->isint[kk]); jj = mir->mod_vec->pos[kk]; if (jj == 0) { spv_set_vj(mir->mod_vec, kk, 1.0); jj = mir->mod_vec->pos[kk]; mir->mod_vec->val[jj] = 0.0; } mir->mod_vec->val[jj] += mir->mod_vec->val[j] * mir->ub[k]; } mir->mod_vec->val[j] = - mir->mod_vec->val[j]; } else xassert(k != k); } #if MIR_DEBUG spv_check_vec(mir->mod_vec); #endif /* substitute bounds for integer variables */ for (j = 1; j <= mir->mod_vec->nnz; j++) { k = mir->mod_vec->ind[j]; xassert(1 <= k && k <= m+n); if (!mir->isint[k]) continue; /* skip continuous variable */ xassert(mir->subst[k] == '?'); xassert(mir->vlb[k] == 0 && mir->vub[k] == 0); xassert(mir->lb[k] != -DBL_MAX && mir->ub[k] != +DBL_MAX); if (fabs(mir->lb[k]) <= fabs(mir->ub[k])) { /* x[k] = lb[k] + x'[k] */ mir->subst[k] = 'L'; mir->mod_rhs -= mir->mod_vec->val[j] * mir->lb[k]; } else { /* x[k] = ub[k] - x'[k] */ mir->subst[k] = 'U'; mir->mod_rhs -= mir->mod_vec->val[j] * mir->ub[k]; mir->mod_vec->val[j] = - mir->mod_vec->val[j]; } } #if MIR_DEBUG spv_check_vec(mir->mod_vec); #endif return; } #if MIR_DEBUG static void check_mod_row(glp_mir *mir) { /* check modified constraint */ int m = mir->m; int n = mir->n; int j, k, kk; double r, big, x; /* compute the residual r = sum a'[k] * x'[k] - b' and determine big = max(1, |a[k]|, |b|) */ r = 0.0, big = 1.0; for (j = 1; j <= mir->mod_vec->nnz; j++) { k = mir->mod_vec->ind[j]; xassert(1 <= k && k <= m+n); if (mir->subst[k] == 'L') { /* x'[k] = x[k] - (lower bound) */ xassert(mir->lb[k] != -DBL_MAX); kk = mir->vlb[k]; if (kk == 0) x = mir->x[k] - mir->lb[k]; else x = mir->x[k] - mir->lb[k] * mir->x[kk]; } else if (mir->subst[k] == 'U') { /* x'[k] = (upper bound) - x[k] */ xassert(mir->ub[k] != +DBL_MAX); kk = mir->vub[k]; if (kk == 0) x = mir->ub[k] - mir->x[k]; else x = mir->ub[k] * mir->x[kk] - mir->x[k]; } else xassert(k != k); r += mir->mod_vec->val[j] * x; if (big < fabs(mir->mod_vec->val[j])) big = fabs(mir->mod_vec->val[j]); } r -= mir->mod_rhs; if (big < fabs(mir->mod_rhs)) big = fabs(mir->mod_rhs); /* the residual must be close to zero */ xassert(fabs(r) <= 1e-6 * big); return; } #endif /*********************************************************************** * mir_ineq - construct MIR inequality * * Given the single constraint mixed integer set * * |N| * X = {(x,s) in Z x R : sum a[j] * x[j] <= b + s}, * + + j in N * * this routine constructs the mixed integer rounding (MIR) inequality * * sum alpha[j] * x[j] <= beta + gamma * s, * j in N * * which is valid for X. * * If the MIR inequality has been successfully constructed, the routine * returns zero. Otherwise, if b is close to nearest integer, there may * be numeric difficulties due to big coefficients; so in this case the * routine returns non-zero. */ static int mir_ineq(const int n, const double a[], const double b, double alpha[], double *beta, double *gamma) { int j; double f, t; if (fabs(b - floor(b + .5)) < 0.01) return 1; f = b - floor(b); for (j = 1; j <= n; j++) { t = (a[j] - floor(a[j])) - f; if (t <= 0.0) alpha[j] = floor(a[j]); else alpha[j] = floor(a[j]) + t / (1.0 - f); } *beta = floor(b); *gamma = 1.0 / (1.0 - f); return 0; } /*********************************************************************** * cmir_ineq - construct c-MIR inequality * * Given the mixed knapsack set * * MK |N| * X = {(x,s) in Z x R : sum a[j] * x[j] <= b + s, * + + j in N * * x[j] <= u[j]}, * * a subset C of variables to be complemented, and a divisor delta > 0, * this routine constructs the complemented MIR (c-MIR) inequality * * sum alpha[j] * x[j] <= beta + gamma * s, * j in N * MK * which is valid for X . * * If the c-MIR inequality has been successfully constructed, the * routine returns zero. Otherwise, if there is a risk of numerical * difficulties due to big coefficients (see comments to the routine * mir_ineq), the routine cmir_ineq returns non-zero. */ static int cmir_ineq(const int n, const double a[], const double b, const double u[], const char cset[], const double delta, double alpha[], double *beta, double *gamma) { int j; double *aa, bb; aa = alpha, bb = b; for (j = 1; j <= n; j++) { aa[j] = a[j] / delta; if (cset[j]) aa[j] = - aa[j], bb -= a[j] * u[j]; } bb /= delta; if (mir_ineq(n, aa, bb, alpha, beta, gamma)) return 1; for (j = 1; j <= n; j++) { if (cset[j]) alpha[j] = - alpha[j], *beta += alpha[j] * u[j]; } *gamma /= delta; return 0; } /*********************************************************************** * cmir_sep - c-MIR separation heuristic * * Given the mixed knapsack set * * MK |N| * X = {(x,s) in Z x R : sum a[j] * x[j] <= b + s, * + + j in N * * x[j] <= u[j]} * * * * * and a fractional point (x , s ), this routine tries to construct * c-MIR inequality * * sum alpha[j] * x[j] <= beta + gamma * s, * j in N * MK * which is valid for X and has (desirably maximal) violation at the * fractional point given. This is attained by choosing an appropriate * set C of variables to be complemented and a divisor delta > 0, which * together define corresponding c-MIR inequality. * * If a violated c-MIR inequality has been successfully constructed, * the routine returns its violation: * * * * * sum alpha[j] * x [j] - beta - gamma * s , * j in N * * which is positive. In case of failure the routine returns zero. */ struct vset { int j; double v; }; static int CDECL cmir_cmp(const void *p1, const void *p2) { const struct vset *v1 = p1, *v2 = p2; if (v1->v < v2->v) return -1; if (v1->v > v2->v) return +1; return 0; } static double cmir_sep(const int n, const double a[], const double b, const double u[], const double x[], const double s, double alpha[], double *beta, double *gamma) { int fail, j, k, nv, v; double delta, eps, d_try[1+3], r, r_best; char *cset; struct vset *vset; /* allocate working arrays */ cset = xcalloc(1+n, sizeof(char)); vset = xcalloc(1+n, sizeof(struct vset)); /* choose initial C */ for (j = 1; j <= n; j++) cset[j] = (char)(x[j] >= 0.5 * u[j]); /* choose initial delta */ r_best = delta = 0.0; for (j = 1; j <= n; j++) { xassert(a[j] != 0.0); /* if x[j] is close to its bounds, skip it */ eps = 1e-9 * (1.0 + fabs(u[j])); if (x[j] < eps || x[j] > u[j] - eps) continue; /* try delta = |a[j]| to construct c-MIR inequality */ fail = cmir_ineq(n, a, b, u, cset, fabs(a[j]), alpha, beta, gamma); if (fail) continue; /* compute violation */ r = - (*beta) - (*gamma) * s; for (k = 1; k <= n; k++) r += alpha[k] * x[k]; if (r_best < r) r_best = r, delta = fabs(a[j]); } if (r_best < 0.001) r_best = 0.0; if (r_best == 0.0) goto done; xassert(delta > 0.0); /* try to increase violation by dividing delta by 2, 4, and 8, respectively */ d_try[1] = delta / 2.0; d_try[2] = delta / 4.0; d_try[3] = delta / 8.0; for (j = 1; j <= 3; j++) { /* construct c-MIR inequality */ fail = cmir_ineq(n, a, b, u, cset, d_try[j], alpha, beta, gamma); if (fail) continue; /* compute violation */ r = - (*beta) - (*gamma) * s; for (k = 1; k <= n; k++) r += alpha[k] * x[k]; if (r_best < r) r_best = r, delta = d_try[j]; } /* build subset of variables lying strictly between their bounds and order it by nondecreasing values of |x[j] - u[j]/2| */ nv = 0; for (j = 1; j <= n; j++) { /* if x[j] is close to its bounds, skip it */ eps = 1e-9 * (1.0 + fabs(u[j])); if (x[j] < eps || x[j] > u[j] - eps) continue; /* add x[j] to the subset */ nv++; vset[nv].j = j; vset[nv].v = fabs(x[j] - 0.5 * u[j]); } qsort(&vset[1], nv, sizeof(struct vset), cmir_cmp); /* try to increase violation by successively complementing each variable in the subset */ for (v = 1; v <= nv; v++) { j = vset[v].j; /* replace x[j] by its complement or vice versa */ cset[j] = (char)!cset[j]; /* construct c-MIR inequality */ fail = cmir_ineq(n, a, b, u, cset, delta, alpha, beta, gamma); /* restore the variable */ cset[j] = (char)!cset[j]; /* do not replace the variable in case of failure */ if (fail) continue; /* compute violation */ r = - (*beta) - (*gamma) * s; for (k = 1; k <= n; k++) r += alpha[k] * x[k]; if (r_best < r) r_best = r, cset[j] = (char)!cset[j]; } /* construct the best c-MIR inequality chosen */ fail = cmir_ineq(n, a, b, u, cset, delta, alpha, beta, gamma); xassert(!fail); done: /* free working arrays */ xfree(cset); xfree(vset); /* return to the calling routine */ return r_best; } static double generate(glp_mir *mir) { /* try to generate violated c-MIR cut for modified constraint */ int m = mir->m; int n = mir->n; int j, k, kk, nint; double s, *u, *x, *alpha, r_best = 0.0, b, beta, gamma; spv_copy_vec(mir->cut_vec, mir->mod_vec); mir->cut_rhs = mir->mod_rhs; /* remove small terms, which can appear due to substitution of variable bounds */ spv_clean_vec(mir->cut_vec, DBL_EPSILON); #if MIR_DEBUG spv_check_vec(mir->cut_vec); #endif /* remove positive continuous terms to obtain MK relaxation */ for (j = 1; j <= mir->cut_vec->nnz; j++) { k = mir->cut_vec->ind[j]; xassert(1 <= k && k <= m+n); if (!mir->isint[k] && mir->cut_vec->val[j] > 0.0) mir->cut_vec->val[j] = 0.0; } spv_clean_vec(mir->cut_vec, 0.0); #if MIR_DEBUG spv_check_vec(mir->cut_vec); #endif /* move integer terms to the beginning of the sparse vector and determine the number of integer variables */ nint = 0; for (j = 1; j <= mir->cut_vec->nnz; j++) { k = mir->cut_vec->ind[j]; xassert(1 <= k && k <= m+n); if (mir->isint[k]) { double temp; nint++; /* interchange elements [nint] and [j] */ kk = mir->cut_vec->ind[nint]; mir->cut_vec->pos[k] = nint; mir->cut_vec->pos[kk] = j; mir->cut_vec->ind[nint] = k; mir->cut_vec->ind[j] = kk; temp = mir->cut_vec->val[nint]; mir->cut_vec->val[nint] = mir->cut_vec->val[j]; mir->cut_vec->val[j] = temp; } } #if MIR_DEBUG spv_check_vec(mir->cut_vec); #endif /* if there is no integer variable, nothing to generate */ if (nint == 0) goto done; /* allocate working arrays */ u = xcalloc(1+nint, sizeof(double)); x = xcalloc(1+nint, sizeof(double)); alpha = xcalloc(1+nint, sizeof(double)); /* determine u and x */ for (j = 1; j <= nint; j++) { k = mir->cut_vec->ind[j]; xassert(m+1 <= k && k <= m+n); xassert(mir->isint[k]); u[j] = mir->ub[k] - mir->lb[k]; xassert(u[j] >= 1.0); if (mir->subst[k] == 'L') x[j] = mir->x[k] - mir->lb[k]; else if (mir->subst[k] == 'U') x[j] = mir->ub[k] - mir->x[k]; else xassert(k != k); #if 0 /* 06/III-2016; notorious bug reported many times */ xassert(x[j] >= -0.001); #else if (x[j] < -0.001) { xprintf("glp_mir_gen: warning: x[%d] = %g\n", j, x[j]); r_best = 0.0; goto skip; } #endif if (x[j] < 0.0) x[j] = 0.0; } /* compute s = - sum of continuous terms */ s = 0.0; for (j = nint+1; j <= mir->cut_vec->nnz; j++) { double x; k = mir->cut_vec->ind[j]; xassert(1 <= k && k <= m+n); /* must be continuous */ xassert(!mir->isint[k]); if (mir->subst[k] == 'L') { xassert(mir->lb[k] != -DBL_MAX); kk = mir->vlb[k]; if (kk == 0) x = mir->x[k] - mir->lb[k]; else x = mir->x[k] - mir->lb[k] * mir->x[kk]; } else if (mir->subst[k] == 'U') { xassert(mir->ub[k] != +DBL_MAX); kk = mir->vub[k]; if (kk == 0) x = mir->ub[k] - mir->x[k]; else x = mir->ub[k] * mir->x[kk] - mir->x[k]; } else xassert(k != k); #if 0 /* 06/III-2016; notorious bug reported many times */ xassert(x >= -0.001); #else if (x < -0.001) { xprintf("glp_mir_gen: warning: x = %g\n", x); r_best = 0.0; goto skip; } #endif if (x < 0.0) x = 0.0; s -= mir->cut_vec->val[j] * x; } xassert(s >= 0.0); /* apply heuristic to obtain most violated c-MIR inequality */ b = mir->cut_rhs; r_best = cmir_sep(nint, mir->cut_vec->val, b, u, x, s, alpha, &beta, &gamma); if (r_best == 0.0) goto skip; xassert(r_best > 0.0); /* convert to raw cut */ /* sum alpha[j] * x[j] <= beta + gamma * s */ for (j = 1; j <= nint; j++) mir->cut_vec->val[j] = alpha[j]; for (j = nint+1; j <= mir->cut_vec->nnz; j++) { k = mir->cut_vec->ind[j]; if (k <= m+n) mir->cut_vec->val[j] *= gamma; } mir->cut_rhs = beta; #if MIR_DEBUG spv_check_vec(mir->cut_vec); #endif skip: /* free working arrays */ xfree(u); xfree(x); xfree(alpha); done: return r_best; } #if MIR_DEBUG static void check_raw_cut(glp_mir *mir, double r_best) { /* check raw cut before back bound substitution */ int m = mir->m; int n = mir->n; int j, k, kk; double r, big, x; /* compute the residual r = sum a[k] * x[k] - b and determine big = max(1, |a[k]|, |b|) */ r = 0.0, big = 1.0; for (j = 1; j <= mir->cut_vec->nnz; j++) { k = mir->cut_vec->ind[j]; xassert(1 <= k && k <= m+n); if (mir->subst[k] == 'L') { xassert(mir->lb[k] != -DBL_MAX); kk = mir->vlb[k]; if (kk == 0) x = mir->x[k] - mir->lb[k]; else x = mir->x[k] - mir->lb[k] * mir->x[kk]; } else if (mir->subst[k] == 'U') { xassert(mir->ub[k] != +DBL_MAX); kk = mir->vub[k]; if (kk == 0) x = mir->ub[k] - mir->x[k]; else x = mir->ub[k] * mir->x[kk] - mir->x[k]; } else xassert(k != k); r += mir->cut_vec->val[j] * x; if (big < fabs(mir->cut_vec->val[j])) big = fabs(mir->cut_vec->val[j]); } r -= mir->cut_rhs; if (big < fabs(mir->cut_rhs)) big = fabs(mir->cut_rhs); /* the residual must be close to r_best */ xassert(fabs(r - r_best) <= 1e-6 * big); return; } #endif static void back_subst(glp_mir *mir) { /* back substitution of original bounds */ int m = mir->m; int n = mir->n; int j, jj, k, kk; /* at first, restore bounds of integer variables (because on restoring variable bounds of continuous variables we need original, not shifted, bounds of integer variables) */ for (j = 1; j <= mir->cut_vec->nnz; j++) { k = mir->cut_vec->ind[j]; xassert(1 <= k && k <= m+n); if (!mir->isint[k]) continue; /* skip continuous */ if (mir->subst[k] == 'L') { /* x'[k] = x[k] - lb[k] */ xassert(mir->lb[k] != -DBL_MAX); xassert(mir->vlb[k] == 0); mir->cut_rhs += mir->cut_vec->val[j] * mir->lb[k]; } else if (mir->subst[k] == 'U') { /* x'[k] = ub[k] - x[k] */ xassert(mir->ub[k] != +DBL_MAX); xassert(mir->vub[k] == 0); mir->cut_rhs -= mir->cut_vec->val[j] * mir->ub[k]; mir->cut_vec->val[j] = - mir->cut_vec->val[j]; } else xassert(k != k); } /* now restore bounds of continuous variables */ for (j = 1; j <= mir->cut_vec->nnz; j++) { k = mir->cut_vec->ind[j]; xassert(1 <= k && k <= m+n); if (mir->isint[k]) continue; /* skip integer */ if (mir->subst[k] == 'L') { /* x'[k] = x[k] - (lower bound) */ xassert(mir->lb[k] != -DBL_MAX); kk = mir->vlb[k]; if (kk == 0) { /* x'[k] = x[k] - lb[k] */ mir->cut_rhs += mir->cut_vec->val[j] * mir->lb[k]; } else { /* x'[k] = x[k] - lb[k] * x[kk] */ jj = mir->cut_vec->pos[kk]; #if 0 xassert(jj != 0); #else if (jj == 0) { spv_set_vj(mir->cut_vec, kk, 1.0); jj = mir->cut_vec->pos[kk]; xassert(jj != 0); mir->cut_vec->val[jj] = 0.0; } #endif mir->cut_vec->val[jj] -= mir->cut_vec->val[j] * mir->lb[k]; } } else if (mir->subst[k] == 'U') { /* x'[k] = (upper bound) - x[k] */ xassert(mir->ub[k] != +DBL_MAX); kk = mir->vub[k]; if (kk == 0) { /* x'[k] = ub[k] - x[k] */ mir->cut_rhs -= mir->cut_vec->val[j] * mir->ub[k]; } else { /* x'[k] = ub[k] * x[kk] - x[k] */ jj = mir->cut_vec->pos[kk]; if (jj == 0) { spv_set_vj(mir->cut_vec, kk, 1.0); jj = mir->cut_vec->pos[kk]; xassert(jj != 0); mir->cut_vec->val[jj] = 0.0; } mir->cut_vec->val[jj] += mir->cut_vec->val[j] * mir->ub[k]; } mir->cut_vec->val[j] = - mir->cut_vec->val[j]; } else xassert(k != k); } #if MIR_DEBUG spv_check_vec(mir->cut_vec); #endif return; } #if MIR_DEBUG static void check_cut_row(glp_mir *mir, double r_best) { /* check the cut after back bound substitution or elimination of auxiliary variables */ int m = mir->m; int n = mir->n; int j, k; double r, big; /* compute the residual r = sum a[k] * x[k] - b and determine big = max(1, |a[k]|, |b|) */ r = 0.0, big = 1.0; for (j = 1; j <= mir->cut_vec->nnz; j++) { k = mir->cut_vec->ind[j]; xassert(1 <= k && k <= m+n); r += mir->cut_vec->val[j] * mir->x[k]; if (big < fabs(mir->cut_vec->val[j])) big = fabs(mir->cut_vec->val[j]); } r -= mir->cut_rhs; if (big < fabs(mir->cut_rhs)) big = fabs(mir->cut_rhs); /* the residual must be close to r_best */ xassert(fabs(r - r_best) <= 1e-6 * big); return; } #endif static void subst_aux_vars(glp_prob *mip, glp_mir *mir) { /* final substitution to eliminate auxiliary variables */ int m = mir->m; int n = mir->n; GLPAIJ *aij; int j, k, kk, jj; for (j = mir->cut_vec->nnz; j >= 1; j--) { k = mir->cut_vec->ind[j]; xassert(1 <= k && k <= m+n); if (k > m) continue; /* skip structurals */ for (aij = mip->row[k]->ptr; aij != NULL; aij = aij->r_next) { kk = m + aij->col->j; /* structural */ jj = mir->cut_vec->pos[kk]; if (jj == 0) { spv_set_vj(mir->cut_vec, kk, 1.0); jj = mir->cut_vec->pos[kk]; mir->cut_vec->val[jj] = 0.0; } mir->cut_vec->val[jj] += mir->cut_vec->val[j] * aij->val; } mir->cut_vec->val[j] = 0.0; } spv_clean_vec(mir->cut_vec, 0.0); return; } static void add_cut(glp_mir *mir, glp_prob *pool) { /* add constructed cut inequality to the cut pool */ int m = mir->m; int n = mir->n; int j, k, len; int *ind = xcalloc(1+n, sizeof(int)); double *val = xcalloc(1+n, sizeof(double)); len = 0; for (j = mir->cut_vec->nnz; j >= 1; j--) { k = mir->cut_vec->ind[j]; xassert(m+1 <= k && k <= m+n); len++, ind[len] = k - m, val[len] = mir->cut_vec->val[j]; } #if 0 #if 0 ios_add_cut_row(tree, pool, GLP_RF_MIR, len, ind, val, GLP_UP, mir->cut_rhs); #else glp_ios_add_row(tree, NULL, GLP_RF_MIR, 0, len, ind, val, GLP_UP, mir->cut_rhs); #endif #else { int i; i = glp_add_rows(pool, 1); glp_set_row_bnds(pool, i, GLP_UP, 0, mir->cut_rhs); glp_set_mat_row(pool, i, len, ind, val); } #endif xfree(ind); xfree(val); return; } #if 0 /* 29/II-2016 by Chris */ static int aggregate_row(glp_prob *mip, glp_mir *mir) #else static int aggregate_row(glp_prob *mip, glp_mir *mir, SPV *v) #endif { /* try to aggregate another row */ int m = mir->m; int n = mir->n; GLPAIJ *aij; #if 0 /* 29/II-2016 by Chris */ SPV *v; #endif int ii, j, jj, k, kk, kappa = 0, ret = 0; double d1, d2, d, d_max = 0.0; /* choose appropriate structural variable in the aggregated row to be substituted */ for (j = 1; j <= mir->agg_vec->nnz; j++) { k = mir->agg_vec->ind[j]; xassert(1 <= k && k <= m+n); if (k <= m) continue; /* skip auxiliary var */ if (mir->isint[k]) continue; /* skip integer var */ if (fabs(mir->agg_vec->val[j]) < 0.001) continue; /* compute distance from x[k] to its lower bound */ kk = mir->vlb[k]; if (kk == 0) { if (mir->lb[k] == -DBL_MAX) d1 = DBL_MAX; else d1 = mir->x[k] - mir->lb[k]; } else { xassert(1 <= kk && kk <= m+n); xassert(mir->isint[kk]); xassert(mir->lb[k] != -DBL_MAX); d1 = mir->x[k] - mir->lb[k] * mir->x[kk]; } /* compute distance from x[k] to its upper bound */ kk = mir->vub[k]; if (kk == 0) { if (mir->vub[k] == +DBL_MAX) d2 = DBL_MAX; else d2 = mir->ub[k] - mir->x[k]; } else { xassert(1 <= kk && kk <= m+n); xassert(mir->isint[kk]); xassert(mir->ub[k] != +DBL_MAX); d2 = mir->ub[k] * mir->x[kk] - mir->x[k]; } /* x[k] cannot be free */ xassert(d1 != DBL_MAX || d2 != DBL_MAX); /* d = min(d1, d2) */ d = (d1 <= d2 ? d1 : d2); xassert(d != DBL_MAX); /* should not be close to corresponding bound */ if (d < 0.001) continue; if (d_max < d) d_max = d, kappa = k; } if (kappa == 0) { /* nothing chosen */ ret = 1; goto done; } /* x[kappa] has been chosen */ xassert(m+1 <= kappa && kappa <= m+n); xassert(!mir->isint[kappa]); /* find another row, which have not been used yet, to eliminate x[kappa] from the aggregated row */ #if 0 /* 29/II-2016 by Chris */ for (ii = 1; ii <= m; ii++) { if (mir->skip[ii]) continue; for (aij = mip->row[ii]->ptr; aij != NULL; aij = aij->r_next) if (aij->col->j == kappa - m) break; if (aij != NULL && fabs(aij->val) >= 0.001) break; #else ii = 0; for (aij = mip->col[kappa - m]->ptr; aij != NULL; aij = aij->c_next) { if (aij->row->i > m) continue; if (mir->skip[aij->row->i]) continue; if (fabs(aij->val) >= 0.001) { ii = aij->row->i; break; } #endif } #if 0 /* 29/II-2016 by Chris */ if (ii > m) #else if (ii == 0) #endif { /* nothing found */ ret = 2; goto done; } /* row ii has been found; include it in the aggregated list */ mir->agg_cnt++; xassert(mir->agg_cnt <= MAXAGGR); mir->agg_row[mir->agg_cnt] = ii; mir->skip[ii] = 2; /* v := new row */ #if 0 /* 29/II-2016 by Chris */ v = ios_create_vec(m+n); #else spv_clear_vec(v); #endif spv_set_vj(v, ii, 1.0); for (aij = mip->row[ii]->ptr; aij != NULL; aij = aij->r_next) spv_set_vj(v, m + aij->col->j, - aij->val); #if MIR_DEBUG spv_check_vec(v); #endif /* perform gaussian elimination to remove x[kappa] */ j = mir->agg_vec->pos[kappa]; xassert(j != 0); jj = v->pos[kappa]; xassert(jj != 0); spv_linear_comb(mir->agg_vec, - mir->agg_vec->val[j] / v->val[jj], v); #if 0 /* 29/II-2016 by Chris */ ios_delete_vec(v); #endif spv_set_vj(mir->agg_vec, kappa, 0.0); #if MIR_DEBUG spv_check_vec(mir->agg_vec); #endif done: return ret; } int glp_mir_gen(glp_prob *mip, glp_mir *mir, glp_prob *pool) { /* main routine to generate MIR cuts */ int m = mir->m; int n = mir->n; int i, nnn = 0; double r_best; #if 1 /* 29/II-2016 by Chris */ SPV *work; #endif xassert(mip->m >= m); xassert(mip->n == n); /* obtain current point */ get_current_point(mip, mir); #if MIR_DEBUG /* check current point */ check_current_point(mir); #endif /* reset bound substitution flags */ memset(&mir->subst[1], '?', m+n); #if 1 /* 29/II-2016 by Chris */ work = spv_create_vec(m+n); #endif /* try to generate a set of violated MIR cuts */ for (i = 1; i <= m; i++) { if (mir->skip[i]) continue; /* use original i-th row as initial aggregated constraint */ initial_agg_row(mip, mir, i); loop: ; #if MIR_DEBUG /* check aggregated row */ check_agg_row(mir); #endif /* substitute fixed variables into aggregated constraint */ subst_fixed_vars(mir); #if MIR_DEBUG /* check aggregated row */ check_agg_row(mir); #endif #if MIR_DEBUG /* check bound substitution flags */ { int k; for (k = 1; k <= m+n; k++) xassert(mir->subst[k] == '?'); } #endif /* apply bound substitution heuristic */ bound_subst_heur(mir); /* substitute bounds and build modified constraint */ build_mod_row(mir); #if MIR_DEBUG /* check modified row */ check_mod_row(mir); #endif /* try to generate violated c-MIR cut for modified row */ r_best = generate(mir); if (r_best > 0.0) { /* success */ #if MIR_DEBUG /* check raw cut before back bound substitution */ check_raw_cut(mir, r_best); #endif /* back substitution of original bounds */ back_subst(mir); #if MIR_DEBUG /* check the cut after back bound substitution */ check_cut_row(mir, r_best); #endif /* final substitution to eliminate auxiliary variables */ subst_aux_vars(mip, mir); #if MIR_DEBUG /* check the cut after elimination of auxiliaries */ check_cut_row(mir, r_best); #endif /* add constructed cut inequality to the cut pool */ add_cut(mir, pool), nnn++; } /* reset bound substitution flags */ { int j, k; for (j = 1; j <= mir->mod_vec->nnz; j++) { k = mir->mod_vec->ind[j]; xassert(1 <= k && k <= m+n); xassert(mir->subst[k] != '?'); mir->subst[k] = '?'; } } if (r_best == 0.0) { /* failure */ if (mir->agg_cnt < MAXAGGR) { /* try to aggregate another row */ #if 0 /* 29/II-2016 by Chris */ if (aggregate_row(mip, mir) == 0) goto loop; #else if (aggregate_row(mip, mir, work) == 0) goto loop; #endif } } /* unmark rows used in the aggregated constraint */ { int k, ii; for (k = 1; k <= mir->agg_cnt; k++) { ii = mir->agg_row[k]; xassert(1 <= ii && ii <= m); xassert(mir->skip[ii] == 2); mir->skip[ii] = 0; } } } #if 1 /* 29/II-2016 by Chris */ spv_delete_vec(work); #endif return nnn; } /*********************************************************************** * NAME * * glp_mir_free - delete MIR cut generator workspace * * SYNOPSIS * * void glp_mir_free(glp_mir *mir); * * DESCRIPTION * * This routine deletes the MIR cut generator workspace and frees all * the memory allocated to it. */ void glp_mir_free(glp_mir *mir) { xfree(mir->skip); xfree(mir->isint); xfree(mir->lb); xfree(mir->vlb); xfree(mir->ub); xfree(mir->vub); xfree(mir->x); xfree(mir->agg_row); spv_delete_vec(mir->agg_vec); xfree(mir->subst); spv_delete_vec(mir->mod_vec); spv_delete_vec(mir->cut_vec); xfree(mir); return; } /* eof */ glpk-5.0/src/intopt/spv.c0000644000062000006210000001633713766346220014574 0ustar maomkpasswd/* spv.c (operations on sparse vectors) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2007-2017 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "spv.h" /*********************************************************************** * NAME * * spv_create_vec - create sparse vector * * SYNOPSIS * * #include "glpios.h" * SPV *spv_create_vec(int n); * * DESCRIPTION * * The routine spv_create_vec creates a sparse vector of dimension n, * which initially is a null vector. * * RETURNS * * The routine returns a pointer to the vector created. */ SPV *spv_create_vec(int n) { SPV *v; xassert(n >= 0); v = xmalloc(sizeof(SPV)); v->n = n; v->nnz = 0; v->pos = xcalloc(1+n, sizeof(int)); memset(&v->pos[1], 0, n * sizeof(int)); v->ind = xcalloc(1+n, sizeof(int)); v->val = xcalloc(1+n, sizeof(double)); return v; } /*********************************************************************** * NAME * * spv_check_vec - check that sparse vector has correct representation * * SYNOPSIS * * #include "glpios.h" * void spv_check_vec(SPV *v); * * DESCRIPTION * * The routine spv_check_vec checks that a sparse vector specified by * the parameter v has correct representation. * * NOTE * * Complexity of this operation is O(n). */ void spv_check_vec(SPV *v) { int j, k, nnz; xassert(v->n >= 0); nnz = 0; for (j = v->n; j >= 1; j--) { k = v->pos[j]; xassert(0 <= k && k <= v->nnz); if (k != 0) { xassert(v->ind[k] == j); nnz++; } } xassert(v->nnz == nnz); return; } /*********************************************************************** * NAME * * spv_get_vj - retrieve component of sparse vector * * SYNOPSIS * * #include "glpios.h" * double spv_get_vj(SPV *v, int j); * * RETURNS * * The routine spv_get_vj returns j-th component of a sparse vector * specified by the parameter v. */ double spv_get_vj(SPV *v, int j) { int k; xassert(1 <= j && j <= v->n); k = v->pos[j]; xassert(0 <= k && k <= v->nnz); return (k == 0 ? 0.0 : v->val[k]); } /*********************************************************************** * NAME * * spv_set_vj - set/change component of sparse vector * * SYNOPSIS * * #include "glpios.h" * void spv_set_vj(SPV *v, int j, double val); * * DESCRIPTION * * The routine spv_set_vj assigns val to j-th component of a sparse * vector specified by the parameter v. */ void spv_set_vj(SPV *v, int j, double val) { int k; xassert(1 <= j && j <= v->n); k = v->pos[j]; if (val == 0.0) { if (k != 0) { /* remove j-th component */ v->pos[j] = 0; if (k < v->nnz) { v->pos[v->ind[v->nnz]] = k; v->ind[k] = v->ind[v->nnz]; v->val[k] = v->val[v->nnz]; } v->nnz--; } } else { if (k == 0) { /* create j-th component */ k = ++(v->nnz); v->pos[j] = k; v->ind[k] = j; } v->val[k] = val; } return; } /*********************************************************************** * NAME * * spv_clear_vec - set all components of sparse vector to zero * * SYNOPSIS * * #include "glpios.h" * void spv_clear_vec(SPV *v); * * DESCRIPTION * * The routine spv_clear_vec sets all components of a sparse vector * specified by the parameter v to zero. */ void spv_clear_vec(SPV *v) { int k; for (k = 1; k <= v->nnz; k++) v->pos[v->ind[k]] = 0; v->nnz = 0; return; } /*********************************************************************** * NAME * * spv_clean_vec - remove zero or small components from sparse vector * * SYNOPSIS * * #include "glpios.h" * void spv_clean_vec(SPV *v, double eps); * * DESCRIPTION * * The routine spv_clean_vec removes zero components and components * whose magnitude is less than eps from a sparse vector specified by * the parameter v. If eps is 0.0, only zero components are removed. */ void spv_clean_vec(SPV *v, double eps) { int k, nnz; nnz = 0; for (k = 1; k <= v->nnz; k++) { if (fabs(v->val[k]) == 0.0 || fabs(v->val[k]) < eps) { /* remove component */ v->pos[v->ind[k]] = 0; } else { /* keep component */ nnz++; v->pos[v->ind[k]] = nnz; v->ind[nnz] = v->ind[k]; v->val[nnz] = v->val[k]; } } v->nnz = nnz; return; } /*********************************************************************** * NAME * * spv_copy_vec - copy sparse vector (x := y) * * SYNOPSIS * * #include "glpios.h" * void spv_copy_vec(SPV *x, SPV *y); * * DESCRIPTION * * The routine spv_copy_vec copies a sparse vector specified by the * parameter y to a sparse vector specified by the parameter x. */ void spv_copy_vec(SPV *x, SPV *y) { int j; xassert(x != y); xassert(x->n == y->n); spv_clear_vec(x); x->nnz = y->nnz; memcpy(&x->ind[1], &y->ind[1], x->nnz * sizeof(int)); memcpy(&x->val[1], &y->val[1], x->nnz * sizeof(double)); for (j = 1; j <= x->nnz; j++) x->pos[x->ind[j]] = j; return; } /*********************************************************************** * NAME * * spv_linear_comb - compute linear combination (x := x + a * y) * * SYNOPSIS * * #include "glpios.h" * void spv_linear_comb(SPV *x, double a, SPV *y); * * DESCRIPTION * * The routine spv_linear_comb computes the linear combination * * x := x + a * y, * * where x and y are sparse vectors, a is a scalar. */ void spv_linear_comb(SPV *x, double a, SPV *y) { int j, k; double xj, yj; xassert(x != y); xassert(x->n == y->n); for (k = 1; k <= y->nnz; k++) { j = y->ind[k]; xj = spv_get_vj(x, j); yj = y->val[k]; spv_set_vj(x, j, xj + a * yj); } return; } /*********************************************************************** * NAME * * spv_delete_vec - delete sparse vector * * SYNOPSIS * * #include "glpios.h" * void spv_delete_vec(SPV *v); * * DESCRIPTION * * The routine spv_delete_vec deletes a sparse vector specified by the * parameter v freeing all the memory allocated to this object. */ void spv_delete_vec(SPV *v) { /* delete sparse vector */ xfree(v->pos); xfree(v->ind); xfree(v->val); xfree(v); return; } /* eof */ glpk-5.0/src/intopt/spv.h0000644000062000006210000000521313766346220014570 0ustar maomkpasswd/* spv.h (operations on sparse vectors) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2007-2017 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef SPV_H #define SPV_H typedef struct SPV SPV; struct SPV { /* sparse vector v = (v[j]) */ int n; /* dimension, n >= 0 */ int nnz; /* number of non-zero components, 0 <= nnz <= n */ int *pos; /* int pos[1+n]; */ /* pos[j] = k, 1 <= j <= n, is position of (non-zero) v[j] in the * arrays ind and val, where 1 <= k <= nnz; pos[j] = 0 means that * v[j] is structural zero */ int *ind; /* int ind[1+n]; */ /* ind[k] = j, 1 <= k <= nnz, is index of v[j] */ double *val; /* double val[1+n]; */ /* val[k], 1 <= k <= nnz, is a numeric value of v[j] */ }; #define spv_create_vec _glp_spv_create_vec SPV *spv_create_vec(int n); /* create sparse vector */ #define spv_check_vec _glp_spv_check_vec void spv_check_vec(SPV *v); /* check that sparse vector has correct representation */ #define spv_get_vj _glp_spv_get_vj double spv_get_vj(SPV *v, int j); /* retrieve component of sparse vector */ #define spv_set_vj _glp_spv_set_vj void spv_set_vj(SPV *v, int j, double val); /* set/change component of sparse vector */ #define spv_clear_vec _glp_spv_clear_vec void spv_clear_vec(SPV *v); /* set all components of sparse vector to zero */ #define spv_clean_vec _glp_spv_clean_vec void spv_clean_vec(SPV *v, double eps); /* remove zero or small components from sparse vector */ #define spv_copy_vec _glp_spv_copy_vec void spv_copy_vec(SPV *x, SPV *y); /* copy sparse vector (x := y) */ #define spv_linear_comb _glp_spv_linear_comb void spv_linear_comb(SPV *x, double a, SPV *y); /* compute linear combination (x := x + a * y) */ #define spv_delete_vec _glp_spv_delete_vec void spv_delete_vec(SPV *v); /* delete sparse vector */ #endif /* eof */ glpk-5.0/src/Makefile.am0000644000062000006210000000674413766346220014340 0ustar maomkpasswd## Process this file with automake to produce Makefile.in ## include_HEADERS = glpk.h lib_LTLIBRARIES = libglpk.la libglpk_la_CPPFLAGS = \ -I$(srcdir) \ -I$(srcdir)/amd \ -I$(srcdir)/api \ -I$(srcdir)/bflib \ -I$(srcdir)/colamd \ -I$(srcdir)/draft \ -I$(srcdir)/env \ -I$(srcdir)/intopt \ -I$(srcdir)/minisat \ -I$(srcdir)/misc \ -I$(srcdir)/mpl \ -I$(srcdir)/npp \ -I$(srcdir)/proxy \ -I$(srcdir)/simplex \ -I$(srcdir)/zlib libglpk_la_LDFLAGS = \ -version-info 43:1:3 \ -export-symbols-regex '^glp_*' \ ${NOUNDEFINED} libglpk_la_SOURCES = \ amd/amd_1.c \ amd/amd_2.c \ amd/amd_aat.c \ amd/amd_control.c \ amd/amd_defaults.c \ amd/amd_dump.c \ amd/amd_info.c \ amd/amd_order.c \ amd/amd_post_tree.c \ amd/amd_postorder.c \ amd/amd_preprocess.c \ amd/amd_valid.c \ api/advbas.c \ api/asnhall.c \ api/asnlp.c \ api/asnokalg.c \ api/ckasn.c \ api/ckcnf.c \ api/cplex.c \ api/cpp.c \ api/cpxbas.c \ api/graph.c \ api/gridgen.c \ api/intfeas1.c \ api/maxffalg.c \ api/maxflp.c \ api/mcflp.c \ api/mcfokalg.c \ api/mcfrelax.c \ api/minisat1.c \ api/mpl.c \ api/mps.c \ api/netgen.c \ api/npp.c \ api/pript.c \ api/prmip.c \ api/prob1.c \ api/prob2.c \ api/prob3.c \ api/prob4.c \ api/prob5.c \ api/prrngs.c \ api/prsol.c \ api/rdasn.c \ api/rdcc.c \ api/rdcnf.c \ api/rdipt.c \ api/rdmaxf.c \ api/rdmcf.c \ api/rdmip.c \ api/rdprob.c \ api/rdsol.c \ api/rmfgen.c \ api/strong.c \ api/topsort.c \ api/weak.c \ api/wcliqex.c \ api/wrasn.c \ api/wrcc.c \ api/wrcnf.c \ api/wript.c \ api/wrmaxf.c \ api/wrmcf.c \ api/wrmip.c \ api/wrprob.c \ api/wrsol.c \ bflib/btf.c \ bflib/btfint.c \ bflib/fhv.c \ bflib/fhvint.c \ bflib/ifu.c \ bflib/luf.c \ bflib/lufint.c \ bflib/scf.c \ bflib/scfint.c \ bflib/sgf.c \ bflib/sva.c \ colamd/colamd.c \ draft/bfd.c \ draft/bfx.c \ draft/glpapi06.c \ draft/glpapi07.c \ draft/glpapi08.c \ draft/glpapi09.c \ draft/glpapi10.c \ draft/glpapi12.c \ draft/glpapi13.c \ draft/glpios01.c \ draft/glpios02.c \ draft/glpios03.c \ draft/glpios07.c \ draft/glpios09.c \ draft/glpios11.c \ draft/glpios12.c \ draft/glpipm.c \ draft/glpmat.c \ draft/glpscl.c \ draft/glpssx01.c \ draft/glpssx02.c \ draft/lux.c \ env/alloc.c \ env/dlsup.c \ env/env.c \ env/error.c \ env/stdc.c \ env/stdout.c \ env/stream.c \ env/time.c \ env/tls.c \ intopt/cfg.c \ intopt/cfg1.c \ intopt/cfg2.c \ intopt/clqcut.c \ intopt/covgen.c \ intopt/fpump.c \ intopt/gmicut.c \ intopt/gmigen.c \ intopt/mirgen.c \ intopt/spv.c \ minisat/minisat.c \ misc/avl.c \ misc/bignum.c \ misc/dimacs.c \ misc/dmp.c \ misc/ffalg.c \ misc/fp2rat.c \ misc/fvs.c \ misc/gcd.c \ misc/hbm.c \ misc/jd.c \ misc/keller.c \ misc/ks.c \ misc/mc13d.c \ misc/mc21a.c \ misc/mt1.c \ misc/mygmp.c \ misc/okalg.c \ misc/qmd.c \ misc/relax4.c \ misc/rgr.c \ misc/rng.c \ misc/rng1.c \ misc/round2n.c \ misc/spm.c \ misc/str2int.c \ misc/str2num.c \ misc/strspx.c \ misc/strtrim.c \ misc/triang.c \ misc/wclique.c \ misc/wclique1.c \ mpl/mpl1.c \ mpl/mpl2.c \ mpl/mpl3.c \ mpl/mpl4.c \ mpl/mpl5.c \ mpl/mpl6.c \ mpl/mplsql.c \ npp/npp1.c \ npp/npp2.c \ npp/npp3.c \ npp/npp4.c \ npp/npp5.c \ npp/npp6.c \ proxy/proxy.c \ proxy/proxy1.c \ simplex/spxat.c \ simplex/spxchuzc.c \ simplex/spxchuzr.c \ simplex/spxlp.c \ simplex/spxnt.c \ simplex/spxprim.c \ simplex/spxprob.c \ simplex/spychuzc.c \ simplex/spychuzr.c \ simplex/spydual.c \ zlib/adler32.c \ zlib/compress.c \ zlib/crc32.c \ zlib/deflate.c \ zlib/gzclose.c \ zlib/gzlib.c \ zlib/gzread.c \ zlib/gzwrite.c \ zlib/inffast.c \ zlib/inflate.c \ zlib/inftrees.c \ zlib/trees.c \ zlib/uncompr.c \ zlib/zio.c \ zlib/zutil.c ## eof ## glpk-5.0/src/Makefile.in0000644000062000006210000067431313766346220014354 0ustar maomkpasswd# Makefile.in generated by automake 1.12.5 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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 DIST_COMMON = $(include_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__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__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)" LTLIBRARIES = $(lib_LTLIBRARIES) libglpk_la_LIBADD = am_libglpk_la_OBJECTS = libglpk_la-amd_1.lo libglpk_la-amd_2.lo \ libglpk_la-amd_aat.lo libglpk_la-amd_control.lo \ libglpk_la-amd_defaults.lo libglpk_la-amd_dump.lo \ libglpk_la-amd_info.lo libglpk_la-amd_order.lo \ libglpk_la-amd_post_tree.lo libglpk_la-amd_postorder.lo \ libglpk_la-amd_preprocess.lo libglpk_la-amd_valid.lo \ libglpk_la-advbas.lo libglpk_la-asnhall.lo libglpk_la-asnlp.lo \ libglpk_la-asnokalg.lo libglpk_la-ckasn.lo libglpk_la-ckcnf.lo \ libglpk_la-cplex.lo libglpk_la-cpp.lo libglpk_la-cpxbas.lo \ libglpk_la-graph.lo libglpk_la-gridgen.lo \ libglpk_la-intfeas1.lo libglpk_la-maxffalg.lo \ libglpk_la-maxflp.lo libglpk_la-mcflp.lo \ libglpk_la-mcfokalg.lo libglpk_la-mcfrelax.lo \ libglpk_la-minisat1.lo libglpk_la-mpl.lo libglpk_la-mps.lo \ libglpk_la-netgen.lo libglpk_la-npp.lo libglpk_la-pript.lo \ libglpk_la-prmip.lo libglpk_la-prob1.lo libglpk_la-prob2.lo \ libglpk_la-prob3.lo libglpk_la-prob4.lo libglpk_la-prob5.lo \ libglpk_la-prrngs.lo libglpk_la-prsol.lo libglpk_la-rdasn.lo \ libglpk_la-rdcc.lo libglpk_la-rdcnf.lo libglpk_la-rdipt.lo \ libglpk_la-rdmaxf.lo libglpk_la-rdmcf.lo libglpk_la-rdmip.lo \ libglpk_la-rdprob.lo libglpk_la-rdsol.lo libglpk_la-rmfgen.lo \ libglpk_la-strong.lo libglpk_la-topsort.lo libglpk_la-weak.lo \ libglpk_la-wcliqex.lo libglpk_la-wrasn.lo libglpk_la-wrcc.lo \ libglpk_la-wrcnf.lo libglpk_la-wript.lo libglpk_la-wrmaxf.lo \ libglpk_la-wrmcf.lo libglpk_la-wrmip.lo libglpk_la-wrprob.lo \ libglpk_la-wrsol.lo libglpk_la-btf.lo libglpk_la-btfint.lo \ libglpk_la-fhv.lo libglpk_la-fhvint.lo libglpk_la-ifu.lo \ libglpk_la-luf.lo libglpk_la-lufint.lo libglpk_la-scf.lo \ libglpk_la-scfint.lo libglpk_la-sgf.lo libglpk_la-sva.lo \ libglpk_la-colamd.lo libglpk_la-bfd.lo libglpk_la-bfx.lo \ libglpk_la-glpapi06.lo libglpk_la-glpapi07.lo \ libglpk_la-glpapi08.lo libglpk_la-glpapi09.lo \ libglpk_la-glpapi10.lo libglpk_la-glpapi12.lo \ libglpk_la-glpapi13.lo libglpk_la-glpios01.lo \ libglpk_la-glpios02.lo libglpk_la-glpios03.lo \ libglpk_la-glpios07.lo libglpk_la-glpios09.lo \ libglpk_la-glpios11.lo libglpk_la-glpios12.lo \ libglpk_la-glpipm.lo libglpk_la-glpmat.lo libglpk_la-glpscl.lo \ libglpk_la-glpssx01.lo libglpk_la-glpssx02.lo \ libglpk_la-lux.lo libglpk_la-alloc.lo libglpk_la-dlsup.lo \ libglpk_la-env.lo libglpk_la-error.lo libglpk_la-stdc.lo \ libglpk_la-stdout.lo libglpk_la-stream.lo libglpk_la-time.lo \ libglpk_la-tls.lo libglpk_la-cfg.lo libglpk_la-cfg1.lo \ libglpk_la-cfg2.lo libglpk_la-clqcut.lo libglpk_la-covgen.lo \ libglpk_la-fpump.lo libglpk_la-gmicut.lo libglpk_la-gmigen.lo \ libglpk_la-mirgen.lo libglpk_la-spv.lo libglpk_la-minisat.lo \ libglpk_la-avl.lo libglpk_la-bignum.lo libglpk_la-dimacs.lo \ libglpk_la-dmp.lo libglpk_la-ffalg.lo libglpk_la-fp2rat.lo \ libglpk_la-fvs.lo libglpk_la-gcd.lo libglpk_la-hbm.lo \ libglpk_la-jd.lo libglpk_la-keller.lo libglpk_la-ks.lo \ libglpk_la-mc13d.lo libglpk_la-mc21a.lo libglpk_la-mt1.lo \ libglpk_la-mygmp.lo libglpk_la-okalg.lo libglpk_la-qmd.lo \ libglpk_la-relax4.lo libglpk_la-rgr.lo libglpk_la-rng.lo \ libglpk_la-rng1.lo libglpk_la-round2n.lo libglpk_la-spm.lo \ libglpk_la-str2int.lo libglpk_la-str2num.lo \ libglpk_la-strspx.lo libglpk_la-strtrim.lo \ libglpk_la-triang.lo libglpk_la-wclique.lo \ libglpk_la-wclique1.lo libglpk_la-mpl1.lo libglpk_la-mpl2.lo \ libglpk_la-mpl3.lo libglpk_la-mpl4.lo libglpk_la-mpl5.lo \ libglpk_la-mpl6.lo libglpk_la-mplsql.lo libglpk_la-npp1.lo \ libglpk_la-npp2.lo libglpk_la-npp3.lo libglpk_la-npp4.lo \ libglpk_la-npp5.lo libglpk_la-npp6.lo libglpk_la-proxy.lo \ libglpk_la-proxy1.lo libglpk_la-spxat.lo \ libglpk_la-spxchuzc.lo libglpk_la-spxchuzr.lo \ libglpk_la-spxlp.lo libglpk_la-spxnt.lo libglpk_la-spxprim.lo \ libglpk_la-spxprob.lo libglpk_la-spychuzc.lo \ libglpk_la-spychuzr.lo libglpk_la-spydual.lo \ libglpk_la-adler32.lo libglpk_la-compress.lo \ libglpk_la-crc32.lo libglpk_la-deflate.lo \ libglpk_la-gzclose.lo libglpk_la-gzlib.lo libglpk_la-gzread.lo \ libglpk_la-gzwrite.lo libglpk_la-inffast.lo \ libglpk_la-inflate.lo libglpk_la-inftrees.lo \ libglpk_la-trees.lo libglpk_la-uncompr.lo libglpk_la-zio.lo \ libglpk_la-zutil.lo libglpk_la_OBJECTS = $(am_libglpk_la_OBJECTS) libglpk_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libglpk_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f 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 = $(libglpk_la_SOURCES) DIST_SOURCES = $(libglpk_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(include_HEADERS) 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@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ NOUNDEFINED = @NOUNDEFINED@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ 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@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ 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@ include_HEADERS = glpk.h lib_LTLIBRARIES = libglpk.la libglpk_la_CPPFLAGS = \ -I$(srcdir) \ -I$(srcdir)/amd \ -I$(srcdir)/api \ -I$(srcdir)/bflib \ -I$(srcdir)/colamd \ -I$(srcdir)/draft \ -I$(srcdir)/env \ -I$(srcdir)/intopt \ -I$(srcdir)/minisat \ -I$(srcdir)/misc \ -I$(srcdir)/mpl \ -I$(srcdir)/npp \ -I$(srcdir)/proxy \ -I$(srcdir)/simplex \ -I$(srcdir)/zlib libglpk_la_LDFLAGS = \ -version-info 43:1:3 \ -export-symbols-regex '^glp_*' \ ${NOUNDEFINED} libglpk_la_SOURCES = \ amd/amd_1.c \ amd/amd_2.c \ amd/amd_aat.c \ amd/amd_control.c \ amd/amd_defaults.c \ amd/amd_dump.c \ amd/amd_info.c \ amd/amd_order.c \ amd/amd_post_tree.c \ amd/amd_postorder.c \ amd/amd_preprocess.c \ amd/amd_valid.c \ api/advbas.c \ api/asnhall.c \ api/asnlp.c \ api/asnokalg.c \ api/ckasn.c \ api/ckcnf.c \ api/cplex.c \ api/cpp.c \ api/cpxbas.c \ api/graph.c \ api/gridgen.c \ api/intfeas1.c \ api/maxffalg.c \ api/maxflp.c \ api/mcflp.c \ api/mcfokalg.c \ api/mcfrelax.c \ api/minisat1.c \ api/mpl.c \ api/mps.c \ api/netgen.c \ api/npp.c \ api/pript.c \ api/prmip.c \ api/prob1.c \ api/prob2.c \ api/prob3.c \ api/prob4.c \ api/prob5.c \ api/prrngs.c \ api/prsol.c \ api/rdasn.c \ api/rdcc.c \ api/rdcnf.c \ api/rdipt.c \ api/rdmaxf.c \ api/rdmcf.c \ api/rdmip.c \ api/rdprob.c \ api/rdsol.c \ api/rmfgen.c \ api/strong.c \ api/topsort.c \ api/weak.c \ api/wcliqex.c \ api/wrasn.c \ api/wrcc.c \ api/wrcnf.c \ api/wript.c \ api/wrmaxf.c \ api/wrmcf.c \ api/wrmip.c \ api/wrprob.c \ api/wrsol.c \ bflib/btf.c \ bflib/btfint.c \ bflib/fhv.c \ bflib/fhvint.c \ bflib/ifu.c \ bflib/luf.c \ bflib/lufint.c \ bflib/scf.c \ bflib/scfint.c \ bflib/sgf.c \ bflib/sva.c \ colamd/colamd.c \ draft/bfd.c \ draft/bfx.c \ draft/glpapi06.c \ draft/glpapi07.c \ draft/glpapi08.c \ draft/glpapi09.c \ draft/glpapi10.c \ draft/glpapi12.c \ draft/glpapi13.c \ draft/glpios01.c \ draft/glpios02.c \ draft/glpios03.c \ draft/glpios07.c \ draft/glpios09.c \ draft/glpios11.c \ draft/glpios12.c \ draft/glpipm.c \ draft/glpmat.c \ draft/glpscl.c \ draft/glpssx01.c \ draft/glpssx02.c \ draft/lux.c \ env/alloc.c \ env/dlsup.c \ env/env.c \ env/error.c \ env/stdc.c \ env/stdout.c \ env/stream.c \ env/time.c \ env/tls.c \ intopt/cfg.c \ intopt/cfg1.c \ intopt/cfg2.c \ intopt/clqcut.c \ intopt/covgen.c \ intopt/fpump.c \ intopt/gmicut.c \ intopt/gmigen.c \ intopt/mirgen.c \ intopt/spv.c \ minisat/minisat.c \ misc/avl.c \ misc/bignum.c \ misc/dimacs.c \ misc/dmp.c \ misc/ffalg.c \ misc/fp2rat.c \ misc/fvs.c \ misc/gcd.c \ misc/hbm.c \ misc/jd.c \ misc/keller.c \ misc/ks.c \ misc/mc13d.c \ misc/mc21a.c \ misc/mt1.c \ misc/mygmp.c \ misc/okalg.c \ misc/qmd.c \ misc/relax4.c \ misc/rgr.c \ misc/rng.c \ misc/rng1.c \ misc/round2n.c \ misc/spm.c \ misc/str2int.c \ misc/str2num.c \ misc/strspx.c \ misc/strtrim.c \ misc/triang.c \ misc/wclique.c \ misc/wclique1.c \ mpl/mpl1.c \ mpl/mpl2.c \ mpl/mpl3.c \ mpl/mpl4.c \ mpl/mpl5.c \ mpl/mpl6.c \ mpl/mplsql.c \ npp/npp1.c \ npp/npp2.c \ npp/npp3.c \ npp/npp4.c \ npp/npp5.c \ npp/npp6.c \ proxy/proxy.c \ proxy/proxy1.c \ simplex/spxat.c \ simplex/spxchuzc.c \ simplex/spxchuzr.c \ simplex/spxlp.c \ simplex/spxnt.c \ simplex/spxprim.c \ simplex/spxprob.c \ simplex/spychuzc.c \ simplex/spychuzr.c \ simplex/spydual.c \ zlib/adler32.c \ zlib/compress.c \ zlib/crc32.c \ zlib/deflate.c \ zlib/gzclose.c \ zlib/gzlib.c \ zlib/gzread.c \ zlib/gzwrite.c \ zlib/inffast.c \ zlib/inflate.c \ zlib/inftrees.c \ zlib/trees.c \ zlib/uncompr.c \ zlib/zio.c \ zlib/zutil.c all: all-am .SUFFIXES: .SUFFIXES: .c .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) @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 " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ 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)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libglpk.la: $(libglpk_la_OBJECTS) $(libglpk_la_DEPENDENCIES) $(EXTRA_libglpk_la_DEPENDENCIES) $(libglpk_la_LINK) -rpath $(libdir) $(libglpk_la_OBJECTS) $(libglpk_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-adler32.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-advbas.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-alloc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-amd_1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-amd_2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-amd_aat.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-amd_control.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-amd_defaults.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-amd_dump.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-amd_info.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-amd_order.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-amd_post_tree.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-amd_postorder.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-amd_preprocess.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-amd_valid.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-asnhall.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-asnlp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-asnokalg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-avl.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-bfd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-bfx.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-bignum.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-btf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-btfint.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-cfg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-cfg1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-cfg2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-ckasn.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-ckcnf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-clqcut.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-colamd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-compress.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-covgen.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-cplex.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-cpp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-cpxbas.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-crc32.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-deflate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-dimacs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-dlsup.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-dmp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-env.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-error.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-ffalg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-fhv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-fhvint.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-fp2rat.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-fpump.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-fvs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-gcd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-glpapi06.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-glpapi07.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-glpapi08.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-glpapi09.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-glpapi10.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-glpapi12.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-glpapi13.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-glpios01.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-glpios02.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-glpios03.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-glpios07.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-glpios09.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-glpios11.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-glpios12.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-glpipm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-glpmat.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-glpscl.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-glpssx01.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-glpssx02.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-gmicut.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-gmigen.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-graph.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-gridgen.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-gzclose.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-gzlib.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-gzread.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-gzwrite.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-hbm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-ifu.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-inffast.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-inflate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-inftrees.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-intfeas1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-jd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-keller.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-ks.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-luf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-lufint.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-lux.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-maxffalg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-maxflp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-mc13d.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-mc21a.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-mcflp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-mcfokalg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-mcfrelax.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-minisat.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-minisat1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-mirgen.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-mpl.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-mpl1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-mpl2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-mpl3.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-mpl4.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-mpl5.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-mpl6.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-mplsql.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-mps.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-mt1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-mygmp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-netgen.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-npp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-npp1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-npp2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-npp3.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-npp4.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-npp5.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-npp6.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-okalg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-pript.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-prmip.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-prob1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-prob2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-prob3.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-prob4.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-prob5.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-proxy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-proxy1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-prrngs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-prsol.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-qmd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-rdasn.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-rdcc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-rdcnf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-rdipt.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-rdmaxf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-rdmcf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-rdmip.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-rdprob.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-rdsol.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-relax4.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-rgr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-rmfgen.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-rng.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-rng1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-round2n.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-scf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-scfint.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-sgf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-spm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-spv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-spxat.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-spxchuzc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-spxchuzr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-spxlp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-spxnt.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-spxprim.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-spxprob.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-spychuzc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-spychuzr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-spydual.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-stdc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-stdout.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-str2int.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-str2num.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-stream.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-strong.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-strspx.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-strtrim.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-sva.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-time.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-tls.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-topsort.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-trees.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-triang.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-uncompr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-wcliqex.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-wclique.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-wclique1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-weak.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-wrasn.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-wrcc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-wrcnf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-wript.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-wrmaxf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-wrmcf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-wrmip.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-wrprob.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-wrsol.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-zio.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libglpk_la-zutil.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< libglpk_la-amd_1.lo: amd/amd_1.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-amd_1.lo -MD -MP -MF $(DEPDIR)/libglpk_la-amd_1.Tpo -c -o libglpk_la-amd_1.lo `test -f 'amd/amd_1.c' || echo '$(srcdir)/'`amd/amd_1.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-amd_1.Tpo $(DEPDIR)/libglpk_la-amd_1.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='amd/amd_1.c' object='libglpk_la-amd_1.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-amd_1.lo `test -f 'amd/amd_1.c' || echo '$(srcdir)/'`amd/amd_1.c libglpk_la-amd_2.lo: amd/amd_2.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-amd_2.lo -MD -MP -MF $(DEPDIR)/libglpk_la-amd_2.Tpo -c -o libglpk_la-amd_2.lo `test -f 'amd/amd_2.c' || echo '$(srcdir)/'`amd/amd_2.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-amd_2.Tpo $(DEPDIR)/libglpk_la-amd_2.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='amd/amd_2.c' object='libglpk_la-amd_2.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-amd_2.lo `test -f 'amd/amd_2.c' || echo '$(srcdir)/'`amd/amd_2.c libglpk_la-amd_aat.lo: amd/amd_aat.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-amd_aat.lo -MD -MP -MF $(DEPDIR)/libglpk_la-amd_aat.Tpo -c -o libglpk_la-amd_aat.lo `test -f 'amd/amd_aat.c' || echo '$(srcdir)/'`amd/amd_aat.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-amd_aat.Tpo $(DEPDIR)/libglpk_la-amd_aat.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='amd/amd_aat.c' object='libglpk_la-amd_aat.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-amd_aat.lo `test -f 'amd/amd_aat.c' || echo '$(srcdir)/'`amd/amd_aat.c libglpk_la-amd_control.lo: amd/amd_control.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-amd_control.lo -MD -MP -MF $(DEPDIR)/libglpk_la-amd_control.Tpo -c -o libglpk_la-amd_control.lo `test -f 'amd/amd_control.c' || echo '$(srcdir)/'`amd/amd_control.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-amd_control.Tpo $(DEPDIR)/libglpk_la-amd_control.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='amd/amd_control.c' object='libglpk_la-amd_control.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-amd_control.lo `test -f 'amd/amd_control.c' || echo '$(srcdir)/'`amd/amd_control.c libglpk_la-amd_defaults.lo: amd/amd_defaults.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-amd_defaults.lo -MD -MP -MF $(DEPDIR)/libglpk_la-amd_defaults.Tpo -c -o libglpk_la-amd_defaults.lo `test -f 'amd/amd_defaults.c' || echo '$(srcdir)/'`amd/amd_defaults.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-amd_defaults.Tpo $(DEPDIR)/libglpk_la-amd_defaults.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='amd/amd_defaults.c' object='libglpk_la-amd_defaults.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-amd_defaults.lo `test -f 'amd/amd_defaults.c' || echo '$(srcdir)/'`amd/amd_defaults.c libglpk_la-amd_dump.lo: amd/amd_dump.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-amd_dump.lo -MD -MP -MF $(DEPDIR)/libglpk_la-amd_dump.Tpo -c -o libglpk_la-amd_dump.lo `test -f 'amd/amd_dump.c' || echo '$(srcdir)/'`amd/amd_dump.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-amd_dump.Tpo $(DEPDIR)/libglpk_la-amd_dump.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='amd/amd_dump.c' object='libglpk_la-amd_dump.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-amd_dump.lo `test -f 'amd/amd_dump.c' || echo '$(srcdir)/'`amd/amd_dump.c libglpk_la-amd_info.lo: amd/amd_info.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-amd_info.lo -MD -MP -MF $(DEPDIR)/libglpk_la-amd_info.Tpo -c -o libglpk_la-amd_info.lo `test -f 'amd/amd_info.c' || echo '$(srcdir)/'`amd/amd_info.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-amd_info.Tpo $(DEPDIR)/libglpk_la-amd_info.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='amd/amd_info.c' object='libglpk_la-amd_info.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-amd_info.lo `test -f 'amd/amd_info.c' || echo '$(srcdir)/'`amd/amd_info.c libglpk_la-amd_order.lo: amd/amd_order.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-amd_order.lo -MD -MP -MF $(DEPDIR)/libglpk_la-amd_order.Tpo -c -o libglpk_la-amd_order.lo `test -f 'amd/amd_order.c' || echo '$(srcdir)/'`amd/amd_order.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-amd_order.Tpo $(DEPDIR)/libglpk_la-amd_order.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='amd/amd_order.c' object='libglpk_la-amd_order.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-amd_order.lo `test -f 'amd/amd_order.c' || echo '$(srcdir)/'`amd/amd_order.c libglpk_la-amd_post_tree.lo: amd/amd_post_tree.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-amd_post_tree.lo -MD -MP -MF $(DEPDIR)/libglpk_la-amd_post_tree.Tpo -c -o libglpk_la-amd_post_tree.lo `test -f 'amd/amd_post_tree.c' || echo '$(srcdir)/'`amd/amd_post_tree.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-amd_post_tree.Tpo $(DEPDIR)/libglpk_la-amd_post_tree.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='amd/amd_post_tree.c' object='libglpk_la-amd_post_tree.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-amd_post_tree.lo `test -f 'amd/amd_post_tree.c' || echo '$(srcdir)/'`amd/amd_post_tree.c libglpk_la-amd_postorder.lo: amd/amd_postorder.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-amd_postorder.lo -MD -MP -MF $(DEPDIR)/libglpk_la-amd_postorder.Tpo -c -o libglpk_la-amd_postorder.lo `test -f 'amd/amd_postorder.c' || echo '$(srcdir)/'`amd/amd_postorder.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-amd_postorder.Tpo $(DEPDIR)/libglpk_la-amd_postorder.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='amd/amd_postorder.c' object='libglpk_la-amd_postorder.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-amd_postorder.lo `test -f 'amd/amd_postorder.c' || echo '$(srcdir)/'`amd/amd_postorder.c libglpk_la-amd_preprocess.lo: amd/amd_preprocess.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-amd_preprocess.lo -MD -MP -MF $(DEPDIR)/libglpk_la-amd_preprocess.Tpo -c -o libglpk_la-amd_preprocess.lo `test -f 'amd/amd_preprocess.c' || echo '$(srcdir)/'`amd/amd_preprocess.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-amd_preprocess.Tpo $(DEPDIR)/libglpk_la-amd_preprocess.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='amd/amd_preprocess.c' object='libglpk_la-amd_preprocess.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-amd_preprocess.lo `test -f 'amd/amd_preprocess.c' || echo '$(srcdir)/'`amd/amd_preprocess.c libglpk_la-amd_valid.lo: amd/amd_valid.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-amd_valid.lo -MD -MP -MF $(DEPDIR)/libglpk_la-amd_valid.Tpo -c -o libglpk_la-amd_valid.lo `test -f 'amd/amd_valid.c' || echo '$(srcdir)/'`amd/amd_valid.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-amd_valid.Tpo $(DEPDIR)/libglpk_la-amd_valid.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='amd/amd_valid.c' object='libglpk_la-amd_valid.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-amd_valid.lo `test -f 'amd/amd_valid.c' || echo '$(srcdir)/'`amd/amd_valid.c libglpk_la-advbas.lo: api/advbas.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-advbas.lo -MD -MP -MF $(DEPDIR)/libglpk_la-advbas.Tpo -c -o libglpk_la-advbas.lo `test -f 'api/advbas.c' || echo '$(srcdir)/'`api/advbas.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-advbas.Tpo $(DEPDIR)/libglpk_la-advbas.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/advbas.c' object='libglpk_la-advbas.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-advbas.lo `test -f 'api/advbas.c' || echo '$(srcdir)/'`api/advbas.c libglpk_la-asnhall.lo: api/asnhall.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-asnhall.lo -MD -MP -MF $(DEPDIR)/libglpk_la-asnhall.Tpo -c -o libglpk_la-asnhall.lo `test -f 'api/asnhall.c' || echo '$(srcdir)/'`api/asnhall.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-asnhall.Tpo $(DEPDIR)/libglpk_la-asnhall.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/asnhall.c' object='libglpk_la-asnhall.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-asnhall.lo `test -f 'api/asnhall.c' || echo '$(srcdir)/'`api/asnhall.c libglpk_la-asnlp.lo: api/asnlp.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-asnlp.lo -MD -MP -MF $(DEPDIR)/libglpk_la-asnlp.Tpo -c -o libglpk_la-asnlp.lo `test -f 'api/asnlp.c' || echo '$(srcdir)/'`api/asnlp.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-asnlp.Tpo $(DEPDIR)/libglpk_la-asnlp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/asnlp.c' object='libglpk_la-asnlp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-asnlp.lo `test -f 'api/asnlp.c' || echo '$(srcdir)/'`api/asnlp.c libglpk_la-asnokalg.lo: api/asnokalg.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-asnokalg.lo -MD -MP -MF $(DEPDIR)/libglpk_la-asnokalg.Tpo -c -o libglpk_la-asnokalg.lo `test -f 'api/asnokalg.c' || echo '$(srcdir)/'`api/asnokalg.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-asnokalg.Tpo $(DEPDIR)/libglpk_la-asnokalg.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/asnokalg.c' object='libglpk_la-asnokalg.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-asnokalg.lo `test -f 'api/asnokalg.c' || echo '$(srcdir)/'`api/asnokalg.c libglpk_la-ckasn.lo: api/ckasn.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-ckasn.lo -MD -MP -MF $(DEPDIR)/libglpk_la-ckasn.Tpo -c -o libglpk_la-ckasn.lo `test -f 'api/ckasn.c' || echo '$(srcdir)/'`api/ckasn.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-ckasn.Tpo $(DEPDIR)/libglpk_la-ckasn.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/ckasn.c' object='libglpk_la-ckasn.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-ckasn.lo `test -f 'api/ckasn.c' || echo '$(srcdir)/'`api/ckasn.c libglpk_la-ckcnf.lo: api/ckcnf.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-ckcnf.lo -MD -MP -MF $(DEPDIR)/libglpk_la-ckcnf.Tpo -c -o libglpk_la-ckcnf.lo `test -f 'api/ckcnf.c' || echo '$(srcdir)/'`api/ckcnf.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-ckcnf.Tpo $(DEPDIR)/libglpk_la-ckcnf.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/ckcnf.c' object='libglpk_la-ckcnf.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-ckcnf.lo `test -f 'api/ckcnf.c' || echo '$(srcdir)/'`api/ckcnf.c libglpk_la-cplex.lo: api/cplex.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-cplex.lo -MD -MP -MF $(DEPDIR)/libglpk_la-cplex.Tpo -c -o libglpk_la-cplex.lo `test -f 'api/cplex.c' || echo '$(srcdir)/'`api/cplex.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-cplex.Tpo $(DEPDIR)/libglpk_la-cplex.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/cplex.c' object='libglpk_la-cplex.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-cplex.lo `test -f 'api/cplex.c' || echo '$(srcdir)/'`api/cplex.c libglpk_la-cpp.lo: api/cpp.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-cpp.lo -MD -MP -MF $(DEPDIR)/libglpk_la-cpp.Tpo -c -o libglpk_la-cpp.lo `test -f 'api/cpp.c' || echo '$(srcdir)/'`api/cpp.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-cpp.Tpo $(DEPDIR)/libglpk_la-cpp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/cpp.c' object='libglpk_la-cpp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-cpp.lo `test -f 'api/cpp.c' || echo '$(srcdir)/'`api/cpp.c libglpk_la-cpxbas.lo: api/cpxbas.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-cpxbas.lo -MD -MP -MF $(DEPDIR)/libglpk_la-cpxbas.Tpo -c -o libglpk_la-cpxbas.lo `test -f 'api/cpxbas.c' || echo '$(srcdir)/'`api/cpxbas.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-cpxbas.Tpo $(DEPDIR)/libglpk_la-cpxbas.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/cpxbas.c' object='libglpk_la-cpxbas.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-cpxbas.lo `test -f 'api/cpxbas.c' || echo '$(srcdir)/'`api/cpxbas.c libglpk_la-graph.lo: api/graph.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-graph.lo -MD -MP -MF $(DEPDIR)/libglpk_la-graph.Tpo -c -o libglpk_la-graph.lo `test -f 'api/graph.c' || echo '$(srcdir)/'`api/graph.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-graph.Tpo $(DEPDIR)/libglpk_la-graph.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/graph.c' object='libglpk_la-graph.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-graph.lo `test -f 'api/graph.c' || echo '$(srcdir)/'`api/graph.c libglpk_la-gridgen.lo: api/gridgen.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-gridgen.lo -MD -MP -MF $(DEPDIR)/libglpk_la-gridgen.Tpo -c -o libglpk_la-gridgen.lo `test -f 'api/gridgen.c' || echo '$(srcdir)/'`api/gridgen.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-gridgen.Tpo $(DEPDIR)/libglpk_la-gridgen.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/gridgen.c' object='libglpk_la-gridgen.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-gridgen.lo `test -f 'api/gridgen.c' || echo '$(srcdir)/'`api/gridgen.c libglpk_la-intfeas1.lo: api/intfeas1.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-intfeas1.lo -MD -MP -MF $(DEPDIR)/libglpk_la-intfeas1.Tpo -c -o libglpk_la-intfeas1.lo `test -f 'api/intfeas1.c' || echo '$(srcdir)/'`api/intfeas1.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-intfeas1.Tpo $(DEPDIR)/libglpk_la-intfeas1.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/intfeas1.c' object='libglpk_la-intfeas1.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-intfeas1.lo `test -f 'api/intfeas1.c' || echo '$(srcdir)/'`api/intfeas1.c libglpk_la-maxffalg.lo: api/maxffalg.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-maxffalg.lo -MD -MP -MF $(DEPDIR)/libglpk_la-maxffalg.Tpo -c -o libglpk_la-maxffalg.lo `test -f 'api/maxffalg.c' || echo '$(srcdir)/'`api/maxffalg.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-maxffalg.Tpo $(DEPDIR)/libglpk_la-maxffalg.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/maxffalg.c' object='libglpk_la-maxffalg.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-maxffalg.lo `test -f 'api/maxffalg.c' || echo '$(srcdir)/'`api/maxffalg.c libglpk_la-maxflp.lo: api/maxflp.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-maxflp.lo -MD -MP -MF $(DEPDIR)/libglpk_la-maxflp.Tpo -c -o libglpk_la-maxflp.lo `test -f 'api/maxflp.c' || echo '$(srcdir)/'`api/maxflp.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-maxflp.Tpo $(DEPDIR)/libglpk_la-maxflp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/maxflp.c' object='libglpk_la-maxflp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-maxflp.lo `test -f 'api/maxflp.c' || echo '$(srcdir)/'`api/maxflp.c libglpk_la-mcflp.lo: api/mcflp.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-mcflp.lo -MD -MP -MF $(DEPDIR)/libglpk_la-mcflp.Tpo -c -o libglpk_la-mcflp.lo `test -f 'api/mcflp.c' || echo '$(srcdir)/'`api/mcflp.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-mcflp.Tpo $(DEPDIR)/libglpk_la-mcflp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/mcflp.c' object='libglpk_la-mcflp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-mcflp.lo `test -f 'api/mcflp.c' || echo '$(srcdir)/'`api/mcflp.c libglpk_la-mcfokalg.lo: api/mcfokalg.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-mcfokalg.lo -MD -MP -MF $(DEPDIR)/libglpk_la-mcfokalg.Tpo -c -o libglpk_la-mcfokalg.lo `test -f 'api/mcfokalg.c' || echo '$(srcdir)/'`api/mcfokalg.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-mcfokalg.Tpo $(DEPDIR)/libglpk_la-mcfokalg.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/mcfokalg.c' object='libglpk_la-mcfokalg.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-mcfokalg.lo `test -f 'api/mcfokalg.c' || echo '$(srcdir)/'`api/mcfokalg.c libglpk_la-mcfrelax.lo: api/mcfrelax.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-mcfrelax.lo -MD -MP -MF $(DEPDIR)/libglpk_la-mcfrelax.Tpo -c -o libglpk_la-mcfrelax.lo `test -f 'api/mcfrelax.c' || echo '$(srcdir)/'`api/mcfrelax.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-mcfrelax.Tpo $(DEPDIR)/libglpk_la-mcfrelax.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/mcfrelax.c' object='libglpk_la-mcfrelax.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-mcfrelax.lo `test -f 'api/mcfrelax.c' || echo '$(srcdir)/'`api/mcfrelax.c libglpk_la-minisat1.lo: api/minisat1.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-minisat1.lo -MD -MP -MF $(DEPDIR)/libglpk_la-minisat1.Tpo -c -o libglpk_la-minisat1.lo `test -f 'api/minisat1.c' || echo '$(srcdir)/'`api/minisat1.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-minisat1.Tpo $(DEPDIR)/libglpk_la-minisat1.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/minisat1.c' object='libglpk_la-minisat1.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-minisat1.lo `test -f 'api/minisat1.c' || echo '$(srcdir)/'`api/minisat1.c libglpk_la-mpl.lo: api/mpl.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-mpl.lo -MD -MP -MF $(DEPDIR)/libglpk_la-mpl.Tpo -c -o libglpk_la-mpl.lo `test -f 'api/mpl.c' || echo '$(srcdir)/'`api/mpl.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-mpl.Tpo $(DEPDIR)/libglpk_la-mpl.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/mpl.c' object='libglpk_la-mpl.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-mpl.lo `test -f 'api/mpl.c' || echo '$(srcdir)/'`api/mpl.c libglpk_la-mps.lo: api/mps.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-mps.lo -MD -MP -MF $(DEPDIR)/libglpk_la-mps.Tpo -c -o libglpk_la-mps.lo `test -f 'api/mps.c' || echo '$(srcdir)/'`api/mps.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-mps.Tpo $(DEPDIR)/libglpk_la-mps.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/mps.c' object='libglpk_la-mps.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-mps.lo `test -f 'api/mps.c' || echo '$(srcdir)/'`api/mps.c libglpk_la-netgen.lo: api/netgen.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-netgen.lo -MD -MP -MF $(DEPDIR)/libglpk_la-netgen.Tpo -c -o libglpk_la-netgen.lo `test -f 'api/netgen.c' || echo '$(srcdir)/'`api/netgen.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-netgen.Tpo $(DEPDIR)/libglpk_la-netgen.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/netgen.c' object='libglpk_la-netgen.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-netgen.lo `test -f 'api/netgen.c' || echo '$(srcdir)/'`api/netgen.c libglpk_la-npp.lo: api/npp.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-npp.lo -MD -MP -MF $(DEPDIR)/libglpk_la-npp.Tpo -c -o libglpk_la-npp.lo `test -f 'api/npp.c' || echo '$(srcdir)/'`api/npp.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-npp.Tpo $(DEPDIR)/libglpk_la-npp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/npp.c' object='libglpk_la-npp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-npp.lo `test -f 'api/npp.c' || echo '$(srcdir)/'`api/npp.c libglpk_la-pript.lo: api/pript.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-pript.lo -MD -MP -MF $(DEPDIR)/libglpk_la-pript.Tpo -c -o libglpk_la-pript.lo `test -f 'api/pript.c' || echo '$(srcdir)/'`api/pript.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-pript.Tpo $(DEPDIR)/libglpk_la-pript.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/pript.c' object='libglpk_la-pript.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-pript.lo `test -f 'api/pript.c' || echo '$(srcdir)/'`api/pript.c libglpk_la-prmip.lo: api/prmip.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-prmip.lo -MD -MP -MF $(DEPDIR)/libglpk_la-prmip.Tpo -c -o libglpk_la-prmip.lo `test -f 'api/prmip.c' || echo '$(srcdir)/'`api/prmip.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-prmip.Tpo $(DEPDIR)/libglpk_la-prmip.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/prmip.c' object='libglpk_la-prmip.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-prmip.lo `test -f 'api/prmip.c' || echo '$(srcdir)/'`api/prmip.c libglpk_la-prob1.lo: api/prob1.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-prob1.lo -MD -MP -MF $(DEPDIR)/libglpk_la-prob1.Tpo -c -o libglpk_la-prob1.lo `test -f 'api/prob1.c' || echo '$(srcdir)/'`api/prob1.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-prob1.Tpo $(DEPDIR)/libglpk_la-prob1.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/prob1.c' object='libglpk_la-prob1.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-prob1.lo `test -f 'api/prob1.c' || echo '$(srcdir)/'`api/prob1.c libglpk_la-prob2.lo: api/prob2.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-prob2.lo -MD -MP -MF $(DEPDIR)/libglpk_la-prob2.Tpo -c -o libglpk_la-prob2.lo `test -f 'api/prob2.c' || echo '$(srcdir)/'`api/prob2.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-prob2.Tpo $(DEPDIR)/libglpk_la-prob2.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/prob2.c' object='libglpk_la-prob2.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-prob2.lo `test -f 'api/prob2.c' || echo '$(srcdir)/'`api/prob2.c libglpk_la-prob3.lo: api/prob3.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-prob3.lo -MD -MP -MF $(DEPDIR)/libglpk_la-prob3.Tpo -c -o libglpk_la-prob3.lo `test -f 'api/prob3.c' || echo '$(srcdir)/'`api/prob3.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-prob3.Tpo $(DEPDIR)/libglpk_la-prob3.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/prob3.c' object='libglpk_la-prob3.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-prob3.lo `test -f 'api/prob3.c' || echo '$(srcdir)/'`api/prob3.c libglpk_la-prob4.lo: api/prob4.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-prob4.lo -MD -MP -MF $(DEPDIR)/libglpk_la-prob4.Tpo -c -o libglpk_la-prob4.lo `test -f 'api/prob4.c' || echo '$(srcdir)/'`api/prob4.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-prob4.Tpo $(DEPDIR)/libglpk_la-prob4.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/prob4.c' object='libglpk_la-prob4.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-prob4.lo `test -f 'api/prob4.c' || echo '$(srcdir)/'`api/prob4.c libglpk_la-prob5.lo: api/prob5.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-prob5.lo -MD -MP -MF $(DEPDIR)/libglpk_la-prob5.Tpo -c -o libglpk_la-prob5.lo `test -f 'api/prob5.c' || echo '$(srcdir)/'`api/prob5.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-prob5.Tpo $(DEPDIR)/libglpk_la-prob5.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/prob5.c' object='libglpk_la-prob5.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-prob5.lo `test -f 'api/prob5.c' || echo '$(srcdir)/'`api/prob5.c libglpk_la-prrngs.lo: api/prrngs.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-prrngs.lo -MD -MP -MF $(DEPDIR)/libglpk_la-prrngs.Tpo -c -o libglpk_la-prrngs.lo `test -f 'api/prrngs.c' || echo '$(srcdir)/'`api/prrngs.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-prrngs.Tpo $(DEPDIR)/libglpk_la-prrngs.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/prrngs.c' object='libglpk_la-prrngs.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-prrngs.lo `test -f 'api/prrngs.c' || echo '$(srcdir)/'`api/prrngs.c libglpk_la-prsol.lo: api/prsol.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-prsol.lo -MD -MP -MF $(DEPDIR)/libglpk_la-prsol.Tpo -c -o libglpk_la-prsol.lo `test -f 'api/prsol.c' || echo '$(srcdir)/'`api/prsol.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-prsol.Tpo $(DEPDIR)/libglpk_la-prsol.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/prsol.c' object='libglpk_la-prsol.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-prsol.lo `test -f 'api/prsol.c' || echo '$(srcdir)/'`api/prsol.c libglpk_la-rdasn.lo: api/rdasn.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-rdasn.lo -MD -MP -MF $(DEPDIR)/libglpk_la-rdasn.Tpo -c -o libglpk_la-rdasn.lo `test -f 'api/rdasn.c' || echo '$(srcdir)/'`api/rdasn.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-rdasn.Tpo $(DEPDIR)/libglpk_la-rdasn.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/rdasn.c' object='libglpk_la-rdasn.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-rdasn.lo `test -f 'api/rdasn.c' || echo '$(srcdir)/'`api/rdasn.c libglpk_la-rdcc.lo: api/rdcc.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-rdcc.lo -MD -MP -MF $(DEPDIR)/libglpk_la-rdcc.Tpo -c -o libglpk_la-rdcc.lo `test -f 'api/rdcc.c' || echo '$(srcdir)/'`api/rdcc.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-rdcc.Tpo $(DEPDIR)/libglpk_la-rdcc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/rdcc.c' object='libglpk_la-rdcc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-rdcc.lo `test -f 'api/rdcc.c' || echo '$(srcdir)/'`api/rdcc.c libglpk_la-rdcnf.lo: api/rdcnf.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-rdcnf.lo -MD -MP -MF $(DEPDIR)/libglpk_la-rdcnf.Tpo -c -o libglpk_la-rdcnf.lo `test -f 'api/rdcnf.c' || echo '$(srcdir)/'`api/rdcnf.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-rdcnf.Tpo $(DEPDIR)/libglpk_la-rdcnf.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/rdcnf.c' object='libglpk_la-rdcnf.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-rdcnf.lo `test -f 'api/rdcnf.c' || echo '$(srcdir)/'`api/rdcnf.c libglpk_la-rdipt.lo: api/rdipt.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-rdipt.lo -MD -MP -MF $(DEPDIR)/libglpk_la-rdipt.Tpo -c -o libglpk_la-rdipt.lo `test -f 'api/rdipt.c' || echo '$(srcdir)/'`api/rdipt.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-rdipt.Tpo $(DEPDIR)/libglpk_la-rdipt.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/rdipt.c' object='libglpk_la-rdipt.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-rdipt.lo `test -f 'api/rdipt.c' || echo '$(srcdir)/'`api/rdipt.c libglpk_la-rdmaxf.lo: api/rdmaxf.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-rdmaxf.lo -MD -MP -MF $(DEPDIR)/libglpk_la-rdmaxf.Tpo -c -o libglpk_la-rdmaxf.lo `test -f 'api/rdmaxf.c' || echo '$(srcdir)/'`api/rdmaxf.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-rdmaxf.Tpo $(DEPDIR)/libglpk_la-rdmaxf.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/rdmaxf.c' object='libglpk_la-rdmaxf.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-rdmaxf.lo `test -f 'api/rdmaxf.c' || echo '$(srcdir)/'`api/rdmaxf.c libglpk_la-rdmcf.lo: api/rdmcf.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-rdmcf.lo -MD -MP -MF $(DEPDIR)/libglpk_la-rdmcf.Tpo -c -o libglpk_la-rdmcf.lo `test -f 'api/rdmcf.c' || echo '$(srcdir)/'`api/rdmcf.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-rdmcf.Tpo $(DEPDIR)/libglpk_la-rdmcf.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/rdmcf.c' object='libglpk_la-rdmcf.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-rdmcf.lo `test -f 'api/rdmcf.c' || echo '$(srcdir)/'`api/rdmcf.c libglpk_la-rdmip.lo: api/rdmip.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-rdmip.lo -MD -MP -MF $(DEPDIR)/libglpk_la-rdmip.Tpo -c -o libglpk_la-rdmip.lo `test -f 'api/rdmip.c' || echo '$(srcdir)/'`api/rdmip.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-rdmip.Tpo $(DEPDIR)/libglpk_la-rdmip.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/rdmip.c' object='libglpk_la-rdmip.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-rdmip.lo `test -f 'api/rdmip.c' || echo '$(srcdir)/'`api/rdmip.c libglpk_la-rdprob.lo: api/rdprob.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-rdprob.lo -MD -MP -MF $(DEPDIR)/libglpk_la-rdprob.Tpo -c -o libglpk_la-rdprob.lo `test -f 'api/rdprob.c' || echo '$(srcdir)/'`api/rdprob.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-rdprob.Tpo $(DEPDIR)/libglpk_la-rdprob.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/rdprob.c' object='libglpk_la-rdprob.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-rdprob.lo `test -f 'api/rdprob.c' || echo '$(srcdir)/'`api/rdprob.c libglpk_la-rdsol.lo: api/rdsol.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-rdsol.lo -MD -MP -MF $(DEPDIR)/libglpk_la-rdsol.Tpo -c -o libglpk_la-rdsol.lo `test -f 'api/rdsol.c' || echo '$(srcdir)/'`api/rdsol.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-rdsol.Tpo $(DEPDIR)/libglpk_la-rdsol.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/rdsol.c' object='libglpk_la-rdsol.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-rdsol.lo `test -f 'api/rdsol.c' || echo '$(srcdir)/'`api/rdsol.c libglpk_la-rmfgen.lo: api/rmfgen.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-rmfgen.lo -MD -MP -MF $(DEPDIR)/libglpk_la-rmfgen.Tpo -c -o libglpk_la-rmfgen.lo `test -f 'api/rmfgen.c' || echo '$(srcdir)/'`api/rmfgen.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-rmfgen.Tpo $(DEPDIR)/libglpk_la-rmfgen.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/rmfgen.c' object='libglpk_la-rmfgen.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-rmfgen.lo `test -f 'api/rmfgen.c' || echo '$(srcdir)/'`api/rmfgen.c libglpk_la-strong.lo: api/strong.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-strong.lo -MD -MP -MF $(DEPDIR)/libglpk_la-strong.Tpo -c -o libglpk_la-strong.lo `test -f 'api/strong.c' || echo '$(srcdir)/'`api/strong.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-strong.Tpo $(DEPDIR)/libglpk_la-strong.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/strong.c' object='libglpk_la-strong.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-strong.lo `test -f 'api/strong.c' || echo '$(srcdir)/'`api/strong.c libglpk_la-topsort.lo: api/topsort.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-topsort.lo -MD -MP -MF $(DEPDIR)/libglpk_la-topsort.Tpo -c -o libglpk_la-topsort.lo `test -f 'api/topsort.c' || echo '$(srcdir)/'`api/topsort.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-topsort.Tpo $(DEPDIR)/libglpk_la-topsort.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/topsort.c' object='libglpk_la-topsort.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-topsort.lo `test -f 'api/topsort.c' || echo '$(srcdir)/'`api/topsort.c libglpk_la-weak.lo: api/weak.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-weak.lo -MD -MP -MF $(DEPDIR)/libglpk_la-weak.Tpo -c -o libglpk_la-weak.lo `test -f 'api/weak.c' || echo '$(srcdir)/'`api/weak.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-weak.Tpo $(DEPDIR)/libglpk_la-weak.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/weak.c' object='libglpk_la-weak.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-weak.lo `test -f 'api/weak.c' || echo '$(srcdir)/'`api/weak.c libglpk_la-wcliqex.lo: api/wcliqex.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-wcliqex.lo -MD -MP -MF $(DEPDIR)/libglpk_la-wcliqex.Tpo -c -o libglpk_la-wcliqex.lo `test -f 'api/wcliqex.c' || echo '$(srcdir)/'`api/wcliqex.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-wcliqex.Tpo $(DEPDIR)/libglpk_la-wcliqex.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/wcliqex.c' object='libglpk_la-wcliqex.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-wcliqex.lo `test -f 'api/wcliqex.c' || echo '$(srcdir)/'`api/wcliqex.c libglpk_la-wrasn.lo: api/wrasn.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-wrasn.lo -MD -MP -MF $(DEPDIR)/libglpk_la-wrasn.Tpo -c -o libglpk_la-wrasn.lo `test -f 'api/wrasn.c' || echo '$(srcdir)/'`api/wrasn.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-wrasn.Tpo $(DEPDIR)/libglpk_la-wrasn.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/wrasn.c' object='libglpk_la-wrasn.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-wrasn.lo `test -f 'api/wrasn.c' || echo '$(srcdir)/'`api/wrasn.c libglpk_la-wrcc.lo: api/wrcc.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-wrcc.lo -MD -MP -MF $(DEPDIR)/libglpk_la-wrcc.Tpo -c -o libglpk_la-wrcc.lo `test -f 'api/wrcc.c' || echo '$(srcdir)/'`api/wrcc.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-wrcc.Tpo $(DEPDIR)/libglpk_la-wrcc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/wrcc.c' object='libglpk_la-wrcc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-wrcc.lo `test -f 'api/wrcc.c' || echo '$(srcdir)/'`api/wrcc.c libglpk_la-wrcnf.lo: api/wrcnf.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-wrcnf.lo -MD -MP -MF $(DEPDIR)/libglpk_la-wrcnf.Tpo -c -o libglpk_la-wrcnf.lo `test -f 'api/wrcnf.c' || echo '$(srcdir)/'`api/wrcnf.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-wrcnf.Tpo $(DEPDIR)/libglpk_la-wrcnf.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/wrcnf.c' object='libglpk_la-wrcnf.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-wrcnf.lo `test -f 'api/wrcnf.c' || echo '$(srcdir)/'`api/wrcnf.c libglpk_la-wript.lo: api/wript.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-wript.lo -MD -MP -MF $(DEPDIR)/libglpk_la-wript.Tpo -c -o libglpk_la-wript.lo `test -f 'api/wript.c' || echo '$(srcdir)/'`api/wript.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-wript.Tpo $(DEPDIR)/libglpk_la-wript.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/wript.c' object='libglpk_la-wript.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-wript.lo `test -f 'api/wript.c' || echo '$(srcdir)/'`api/wript.c libglpk_la-wrmaxf.lo: api/wrmaxf.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-wrmaxf.lo -MD -MP -MF $(DEPDIR)/libglpk_la-wrmaxf.Tpo -c -o libglpk_la-wrmaxf.lo `test -f 'api/wrmaxf.c' || echo '$(srcdir)/'`api/wrmaxf.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-wrmaxf.Tpo $(DEPDIR)/libglpk_la-wrmaxf.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/wrmaxf.c' object='libglpk_la-wrmaxf.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-wrmaxf.lo `test -f 'api/wrmaxf.c' || echo '$(srcdir)/'`api/wrmaxf.c libglpk_la-wrmcf.lo: api/wrmcf.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-wrmcf.lo -MD -MP -MF $(DEPDIR)/libglpk_la-wrmcf.Tpo -c -o libglpk_la-wrmcf.lo `test -f 'api/wrmcf.c' || echo '$(srcdir)/'`api/wrmcf.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-wrmcf.Tpo $(DEPDIR)/libglpk_la-wrmcf.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/wrmcf.c' object='libglpk_la-wrmcf.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-wrmcf.lo `test -f 'api/wrmcf.c' || echo '$(srcdir)/'`api/wrmcf.c libglpk_la-wrmip.lo: api/wrmip.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-wrmip.lo -MD -MP -MF $(DEPDIR)/libglpk_la-wrmip.Tpo -c -o libglpk_la-wrmip.lo `test -f 'api/wrmip.c' || echo '$(srcdir)/'`api/wrmip.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-wrmip.Tpo $(DEPDIR)/libglpk_la-wrmip.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/wrmip.c' object='libglpk_la-wrmip.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-wrmip.lo `test -f 'api/wrmip.c' || echo '$(srcdir)/'`api/wrmip.c libglpk_la-wrprob.lo: api/wrprob.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-wrprob.lo -MD -MP -MF $(DEPDIR)/libglpk_la-wrprob.Tpo -c -o libglpk_la-wrprob.lo `test -f 'api/wrprob.c' || echo '$(srcdir)/'`api/wrprob.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-wrprob.Tpo $(DEPDIR)/libglpk_la-wrprob.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/wrprob.c' object='libglpk_la-wrprob.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-wrprob.lo `test -f 'api/wrprob.c' || echo '$(srcdir)/'`api/wrprob.c libglpk_la-wrsol.lo: api/wrsol.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-wrsol.lo -MD -MP -MF $(DEPDIR)/libglpk_la-wrsol.Tpo -c -o libglpk_la-wrsol.lo `test -f 'api/wrsol.c' || echo '$(srcdir)/'`api/wrsol.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-wrsol.Tpo $(DEPDIR)/libglpk_la-wrsol.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='api/wrsol.c' object='libglpk_la-wrsol.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-wrsol.lo `test -f 'api/wrsol.c' || echo '$(srcdir)/'`api/wrsol.c libglpk_la-btf.lo: bflib/btf.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-btf.lo -MD -MP -MF $(DEPDIR)/libglpk_la-btf.Tpo -c -o libglpk_la-btf.lo `test -f 'bflib/btf.c' || echo '$(srcdir)/'`bflib/btf.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-btf.Tpo $(DEPDIR)/libglpk_la-btf.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='bflib/btf.c' object='libglpk_la-btf.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-btf.lo `test -f 'bflib/btf.c' || echo '$(srcdir)/'`bflib/btf.c libglpk_la-btfint.lo: bflib/btfint.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-btfint.lo -MD -MP -MF $(DEPDIR)/libglpk_la-btfint.Tpo -c -o libglpk_la-btfint.lo `test -f 'bflib/btfint.c' || echo '$(srcdir)/'`bflib/btfint.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-btfint.Tpo $(DEPDIR)/libglpk_la-btfint.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='bflib/btfint.c' object='libglpk_la-btfint.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-btfint.lo `test -f 'bflib/btfint.c' || echo '$(srcdir)/'`bflib/btfint.c libglpk_la-fhv.lo: bflib/fhv.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-fhv.lo -MD -MP -MF $(DEPDIR)/libglpk_la-fhv.Tpo -c -o libglpk_la-fhv.lo `test -f 'bflib/fhv.c' || echo '$(srcdir)/'`bflib/fhv.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-fhv.Tpo $(DEPDIR)/libglpk_la-fhv.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='bflib/fhv.c' object='libglpk_la-fhv.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-fhv.lo `test -f 'bflib/fhv.c' || echo '$(srcdir)/'`bflib/fhv.c libglpk_la-fhvint.lo: bflib/fhvint.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-fhvint.lo -MD -MP -MF $(DEPDIR)/libglpk_la-fhvint.Tpo -c -o libglpk_la-fhvint.lo `test -f 'bflib/fhvint.c' || echo '$(srcdir)/'`bflib/fhvint.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-fhvint.Tpo $(DEPDIR)/libglpk_la-fhvint.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='bflib/fhvint.c' object='libglpk_la-fhvint.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-fhvint.lo `test -f 'bflib/fhvint.c' || echo '$(srcdir)/'`bflib/fhvint.c libglpk_la-ifu.lo: bflib/ifu.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-ifu.lo -MD -MP -MF $(DEPDIR)/libglpk_la-ifu.Tpo -c -o libglpk_la-ifu.lo `test -f 'bflib/ifu.c' || echo '$(srcdir)/'`bflib/ifu.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-ifu.Tpo $(DEPDIR)/libglpk_la-ifu.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='bflib/ifu.c' object='libglpk_la-ifu.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-ifu.lo `test -f 'bflib/ifu.c' || echo '$(srcdir)/'`bflib/ifu.c libglpk_la-luf.lo: bflib/luf.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-luf.lo -MD -MP -MF $(DEPDIR)/libglpk_la-luf.Tpo -c -o libglpk_la-luf.lo `test -f 'bflib/luf.c' || echo '$(srcdir)/'`bflib/luf.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-luf.Tpo $(DEPDIR)/libglpk_la-luf.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='bflib/luf.c' object='libglpk_la-luf.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-luf.lo `test -f 'bflib/luf.c' || echo '$(srcdir)/'`bflib/luf.c libglpk_la-lufint.lo: bflib/lufint.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-lufint.lo -MD -MP -MF $(DEPDIR)/libglpk_la-lufint.Tpo -c -o libglpk_la-lufint.lo `test -f 'bflib/lufint.c' || echo '$(srcdir)/'`bflib/lufint.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-lufint.Tpo $(DEPDIR)/libglpk_la-lufint.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='bflib/lufint.c' object='libglpk_la-lufint.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-lufint.lo `test -f 'bflib/lufint.c' || echo '$(srcdir)/'`bflib/lufint.c libglpk_la-scf.lo: bflib/scf.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-scf.lo -MD -MP -MF $(DEPDIR)/libglpk_la-scf.Tpo -c -o libglpk_la-scf.lo `test -f 'bflib/scf.c' || echo '$(srcdir)/'`bflib/scf.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-scf.Tpo $(DEPDIR)/libglpk_la-scf.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='bflib/scf.c' object='libglpk_la-scf.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-scf.lo `test -f 'bflib/scf.c' || echo '$(srcdir)/'`bflib/scf.c libglpk_la-scfint.lo: bflib/scfint.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-scfint.lo -MD -MP -MF $(DEPDIR)/libglpk_la-scfint.Tpo -c -o libglpk_la-scfint.lo `test -f 'bflib/scfint.c' || echo '$(srcdir)/'`bflib/scfint.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-scfint.Tpo $(DEPDIR)/libglpk_la-scfint.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='bflib/scfint.c' object='libglpk_la-scfint.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-scfint.lo `test -f 'bflib/scfint.c' || echo '$(srcdir)/'`bflib/scfint.c libglpk_la-sgf.lo: bflib/sgf.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-sgf.lo -MD -MP -MF $(DEPDIR)/libglpk_la-sgf.Tpo -c -o libglpk_la-sgf.lo `test -f 'bflib/sgf.c' || echo '$(srcdir)/'`bflib/sgf.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-sgf.Tpo $(DEPDIR)/libglpk_la-sgf.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='bflib/sgf.c' object='libglpk_la-sgf.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-sgf.lo `test -f 'bflib/sgf.c' || echo '$(srcdir)/'`bflib/sgf.c libglpk_la-sva.lo: bflib/sva.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-sva.lo -MD -MP -MF $(DEPDIR)/libglpk_la-sva.Tpo -c -o libglpk_la-sva.lo `test -f 'bflib/sva.c' || echo '$(srcdir)/'`bflib/sva.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-sva.Tpo $(DEPDIR)/libglpk_la-sva.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='bflib/sva.c' object='libglpk_la-sva.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-sva.lo `test -f 'bflib/sva.c' || echo '$(srcdir)/'`bflib/sva.c libglpk_la-colamd.lo: colamd/colamd.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-colamd.lo -MD -MP -MF $(DEPDIR)/libglpk_la-colamd.Tpo -c -o libglpk_la-colamd.lo `test -f 'colamd/colamd.c' || echo '$(srcdir)/'`colamd/colamd.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-colamd.Tpo $(DEPDIR)/libglpk_la-colamd.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='colamd/colamd.c' object='libglpk_la-colamd.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-colamd.lo `test -f 'colamd/colamd.c' || echo '$(srcdir)/'`colamd/colamd.c libglpk_la-bfd.lo: draft/bfd.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-bfd.lo -MD -MP -MF $(DEPDIR)/libglpk_la-bfd.Tpo -c -o libglpk_la-bfd.lo `test -f 'draft/bfd.c' || echo '$(srcdir)/'`draft/bfd.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-bfd.Tpo $(DEPDIR)/libglpk_la-bfd.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='draft/bfd.c' object='libglpk_la-bfd.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-bfd.lo `test -f 'draft/bfd.c' || echo '$(srcdir)/'`draft/bfd.c libglpk_la-bfx.lo: draft/bfx.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-bfx.lo -MD -MP -MF $(DEPDIR)/libglpk_la-bfx.Tpo -c -o libglpk_la-bfx.lo `test -f 'draft/bfx.c' || echo '$(srcdir)/'`draft/bfx.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-bfx.Tpo $(DEPDIR)/libglpk_la-bfx.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='draft/bfx.c' object='libglpk_la-bfx.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-bfx.lo `test -f 'draft/bfx.c' || echo '$(srcdir)/'`draft/bfx.c libglpk_la-glpapi06.lo: draft/glpapi06.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-glpapi06.lo -MD -MP -MF $(DEPDIR)/libglpk_la-glpapi06.Tpo -c -o libglpk_la-glpapi06.lo `test -f 'draft/glpapi06.c' || echo '$(srcdir)/'`draft/glpapi06.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-glpapi06.Tpo $(DEPDIR)/libglpk_la-glpapi06.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='draft/glpapi06.c' object='libglpk_la-glpapi06.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-glpapi06.lo `test -f 'draft/glpapi06.c' || echo '$(srcdir)/'`draft/glpapi06.c libglpk_la-glpapi07.lo: draft/glpapi07.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-glpapi07.lo -MD -MP -MF $(DEPDIR)/libglpk_la-glpapi07.Tpo -c -o libglpk_la-glpapi07.lo `test -f 'draft/glpapi07.c' || echo '$(srcdir)/'`draft/glpapi07.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-glpapi07.Tpo $(DEPDIR)/libglpk_la-glpapi07.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='draft/glpapi07.c' object='libglpk_la-glpapi07.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-glpapi07.lo `test -f 'draft/glpapi07.c' || echo '$(srcdir)/'`draft/glpapi07.c libglpk_la-glpapi08.lo: draft/glpapi08.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-glpapi08.lo -MD -MP -MF $(DEPDIR)/libglpk_la-glpapi08.Tpo -c -o libglpk_la-glpapi08.lo `test -f 'draft/glpapi08.c' || echo '$(srcdir)/'`draft/glpapi08.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-glpapi08.Tpo $(DEPDIR)/libglpk_la-glpapi08.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='draft/glpapi08.c' object='libglpk_la-glpapi08.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-glpapi08.lo `test -f 'draft/glpapi08.c' || echo '$(srcdir)/'`draft/glpapi08.c libglpk_la-glpapi09.lo: draft/glpapi09.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-glpapi09.lo -MD -MP -MF $(DEPDIR)/libglpk_la-glpapi09.Tpo -c -o libglpk_la-glpapi09.lo `test -f 'draft/glpapi09.c' || echo '$(srcdir)/'`draft/glpapi09.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-glpapi09.Tpo $(DEPDIR)/libglpk_la-glpapi09.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='draft/glpapi09.c' object='libglpk_la-glpapi09.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-glpapi09.lo `test -f 'draft/glpapi09.c' || echo '$(srcdir)/'`draft/glpapi09.c libglpk_la-glpapi10.lo: draft/glpapi10.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-glpapi10.lo -MD -MP -MF $(DEPDIR)/libglpk_la-glpapi10.Tpo -c -o libglpk_la-glpapi10.lo `test -f 'draft/glpapi10.c' || echo '$(srcdir)/'`draft/glpapi10.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-glpapi10.Tpo $(DEPDIR)/libglpk_la-glpapi10.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='draft/glpapi10.c' object='libglpk_la-glpapi10.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-glpapi10.lo `test -f 'draft/glpapi10.c' || echo '$(srcdir)/'`draft/glpapi10.c libglpk_la-glpapi12.lo: draft/glpapi12.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-glpapi12.lo -MD -MP -MF $(DEPDIR)/libglpk_la-glpapi12.Tpo -c -o libglpk_la-glpapi12.lo `test -f 'draft/glpapi12.c' || echo '$(srcdir)/'`draft/glpapi12.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-glpapi12.Tpo $(DEPDIR)/libglpk_la-glpapi12.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='draft/glpapi12.c' object='libglpk_la-glpapi12.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-glpapi12.lo `test -f 'draft/glpapi12.c' || echo '$(srcdir)/'`draft/glpapi12.c libglpk_la-glpapi13.lo: draft/glpapi13.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-glpapi13.lo -MD -MP -MF $(DEPDIR)/libglpk_la-glpapi13.Tpo -c -o libglpk_la-glpapi13.lo `test -f 'draft/glpapi13.c' || echo '$(srcdir)/'`draft/glpapi13.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-glpapi13.Tpo $(DEPDIR)/libglpk_la-glpapi13.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='draft/glpapi13.c' object='libglpk_la-glpapi13.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-glpapi13.lo `test -f 'draft/glpapi13.c' || echo '$(srcdir)/'`draft/glpapi13.c libglpk_la-glpios01.lo: draft/glpios01.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-glpios01.lo -MD -MP -MF $(DEPDIR)/libglpk_la-glpios01.Tpo -c -o libglpk_la-glpios01.lo `test -f 'draft/glpios01.c' || echo '$(srcdir)/'`draft/glpios01.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-glpios01.Tpo $(DEPDIR)/libglpk_la-glpios01.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='draft/glpios01.c' object='libglpk_la-glpios01.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-glpios01.lo `test -f 'draft/glpios01.c' || echo '$(srcdir)/'`draft/glpios01.c libglpk_la-glpios02.lo: draft/glpios02.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-glpios02.lo -MD -MP -MF $(DEPDIR)/libglpk_la-glpios02.Tpo -c -o libglpk_la-glpios02.lo `test -f 'draft/glpios02.c' || echo '$(srcdir)/'`draft/glpios02.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-glpios02.Tpo $(DEPDIR)/libglpk_la-glpios02.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='draft/glpios02.c' object='libglpk_la-glpios02.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-glpios02.lo `test -f 'draft/glpios02.c' || echo '$(srcdir)/'`draft/glpios02.c libglpk_la-glpios03.lo: draft/glpios03.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-glpios03.lo -MD -MP -MF $(DEPDIR)/libglpk_la-glpios03.Tpo -c -o libglpk_la-glpios03.lo `test -f 'draft/glpios03.c' || echo '$(srcdir)/'`draft/glpios03.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-glpios03.Tpo $(DEPDIR)/libglpk_la-glpios03.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='draft/glpios03.c' object='libglpk_la-glpios03.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-glpios03.lo `test -f 'draft/glpios03.c' || echo '$(srcdir)/'`draft/glpios03.c libglpk_la-glpios07.lo: draft/glpios07.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-glpios07.lo -MD -MP -MF $(DEPDIR)/libglpk_la-glpios07.Tpo -c -o libglpk_la-glpios07.lo `test -f 'draft/glpios07.c' || echo '$(srcdir)/'`draft/glpios07.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-glpios07.Tpo $(DEPDIR)/libglpk_la-glpios07.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='draft/glpios07.c' object='libglpk_la-glpios07.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-glpios07.lo `test -f 'draft/glpios07.c' || echo '$(srcdir)/'`draft/glpios07.c libglpk_la-glpios09.lo: draft/glpios09.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-glpios09.lo -MD -MP -MF $(DEPDIR)/libglpk_la-glpios09.Tpo -c -o libglpk_la-glpios09.lo `test -f 'draft/glpios09.c' || echo '$(srcdir)/'`draft/glpios09.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-glpios09.Tpo $(DEPDIR)/libglpk_la-glpios09.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='draft/glpios09.c' object='libglpk_la-glpios09.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-glpios09.lo `test -f 'draft/glpios09.c' || echo '$(srcdir)/'`draft/glpios09.c libglpk_la-glpios11.lo: draft/glpios11.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-glpios11.lo -MD -MP -MF $(DEPDIR)/libglpk_la-glpios11.Tpo -c -o libglpk_la-glpios11.lo `test -f 'draft/glpios11.c' || echo '$(srcdir)/'`draft/glpios11.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-glpios11.Tpo $(DEPDIR)/libglpk_la-glpios11.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='draft/glpios11.c' object='libglpk_la-glpios11.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-glpios11.lo `test -f 'draft/glpios11.c' || echo '$(srcdir)/'`draft/glpios11.c libglpk_la-glpios12.lo: draft/glpios12.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-glpios12.lo -MD -MP -MF $(DEPDIR)/libglpk_la-glpios12.Tpo -c -o libglpk_la-glpios12.lo `test -f 'draft/glpios12.c' || echo '$(srcdir)/'`draft/glpios12.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-glpios12.Tpo $(DEPDIR)/libglpk_la-glpios12.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='draft/glpios12.c' object='libglpk_la-glpios12.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-glpios12.lo `test -f 'draft/glpios12.c' || echo '$(srcdir)/'`draft/glpios12.c libglpk_la-glpipm.lo: draft/glpipm.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-glpipm.lo -MD -MP -MF $(DEPDIR)/libglpk_la-glpipm.Tpo -c -o libglpk_la-glpipm.lo `test -f 'draft/glpipm.c' || echo '$(srcdir)/'`draft/glpipm.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-glpipm.Tpo $(DEPDIR)/libglpk_la-glpipm.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='draft/glpipm.c' object='libglpk_la-glpipm.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-glpipm.lo `test -f 'draft/glpipm.c' || echo '$(srcdir)/'`draft/glpipm.c libglpk_la-glpmat.lo: draft/glpmat.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-glpmat.lo -MD -MP -MF $(DEPDIR)/libglpk_la-glpmat.Tpo -c -o libglpk_la-glpmat.lo `test -f 'draft/glpmat.c' || echo '$(srcdir)/'`draft/glpmat.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-glpmat.Tpo $(DEPDIR)/libglpk_la-glpmat.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='draft/glpmat.c' object='libglpk_la-glpmat.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-glpmat.lo `test -f 'draft/glpmat.c' || echo '$(srcdir)/'`draft/glpmat.c libglpk_la-glpscl.lo: draft/glpscl.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-glpscl.lo -MD -MP -MF $(DEPDIR)/libglpk_la-glpscl.Tpo -c -o libglpk_la-glpscl.lo `test -f 'draft/glpscl.c' || echo '$(srcdir)/'`draft/glpscl.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-glpscl.Tpo $(DEPDIR)/libglpk_la-glpscl.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='draft/glpscl.c' object='libglpk_la-glpscl.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-glpscl.lo `test -f 'draft/glpscl.c' || echo '$(srcdir)/'`draft/glpscl.c libglpk_la-glpssx01.lo: draft/glpssx01.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-glpssx01.lo -MD -MP -MF $(DEPDIR)/libglpk_la-glpssx01.Tpo -c -o libglpk_la-glpssx01.lo `test -f 'draft/glpssx01.c' || echo '$(srcdir)/'`draft/glpssx01.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-glpssx01.Tpo $(DEPDIR)/libglpk_la-glpssx01.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='draft/glpssx01.c' object='libglpk_la-glpssx01.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-glpssx01.lo `test -f 'draft/glpssx01.c' || echo '$(srcdir)/'`draft/glpssx01.c libglpk_la-glpssx02.lo: draft/glpssx02.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-glpssx02.lo -MD -MP -MF $(DEPDIR)/libglpk_la-glpssx02.Tpo -c -o libglpk_la-glpssx02.lo `test -f 'draft/glpssx02.c' || echo '$(srcdir)/'`draft/glpssx02.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-glpssx02.Tpo $(DEPDIR)/libglpk_la-glpssx02.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='draft/glpssx02.c' object='libglpk_la-glpssx02.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-glpssx02.lo `test -f 'draft/glpssx02.c' || echo '$(srcdir)/'`draft/glpssx02.c libglpk_la-lux.lo: draft/lux.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-lux.lo -MD -MP -MF $(DEPDIR)/libglpk_la-lux.Tpo -c -o libglpk_la-lux.lo `test -f 'draft/lux.c' || echo '$(srcdir)/'`draft/lux.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-lux.Tpo $(DEPDIR)/libglpk_la-lux.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='draft/lux.c' object='libglpk_la-lux.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-lux.lo `test -f 'draft/lux.c' || echo '$(srcdir)/'`draft/lux.c libglpk_la-alloc.lo: env/alloc.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-alloc.lo -MD -MP -MF $(DEPDIR)/libglpk_la-alloc.Tpo -c -o libglpk_la-alloc.lo `test -f 'env/alloc.c' || echo '$(srcdir)/'`env/alloc.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-alloc.Tpo $(DEPDIR)/libglpk_la-alloc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='env/alloc.c' object='libglpk_la-alloc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-alloc.lo `test -f 'env/alloc.c' || echo '$(srcdir)/'`env/alloc.c libglpk_la-dlsup.lo: env/dlsup.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-dlsup.lo -MD -MP -MF $(DEPDIR)/libglpk_la-dlsup.Tpo -c -o libglpk_la-dlsup.lo `test -f 'env/dlsup.c' || echo '$(srcdir)/'`env/dlsup.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-dlsup.Tpo $(DEPDIR)/libglpk_la-dlsup.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='env/dlsup.c' object='libglpk_la-dlsup.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-dlsup.lo `test -f 'env/dlsup.c' || echo '$(srcdir)/'`env/dlsup.c libglpk_la-env.lo: env/env.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-env.lo -MD -MP -MF $(DEPDIR)/libglpk_la-env.Tpo -c -o libglpk_la-env.lo `test -f 'env/env.c' || echo '$(srcdir)/'`env/env.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-env.Tpo $(DEPDIR)/libglpk_la-env.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='env/env.c' object='libglpk_la-env.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-env.lo `test -f 'env/env.c' || echo '$(srcdir)/'`env/env.c libglpk_la-error.lo: env/error.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-error.lo -MD -MP -MF $(DEPDIR)/libglpk_la-error.Tpo -c -o libglpk_la-error.lo `test -f 'env/error.c' || echo '$(srcdir)/'`env/error.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-error.Tpo $(DEPDIR)/libglpk_la-error.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='env/error.c' object='libglpk_la-error.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-error.lo `test -f 'env/error.c' || echo '$(srcdir)/'`env/error.c libglpk_la-stdc.lo: env/stdc.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-stdc.lo -MD -MP -MF $(DEPDIR)/libglpk_la-stdc.Tpo -c -o libglpk_la-stdc.lo `test -f 'env/stdc.c' || echo '$(srcdir)/'`env/stdc.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-stdc.Tpo $(DEPDIR)/libglpk_la-stdc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='env/stdc.c' object='libglpk_la-stdc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-stdc.lo `test -f 'env/stdc.c' || echo '$(srcdir)/'`env/stdc.c libglpk_la-stdout.lo: env/stdout.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-stdout.lo -MD -MP -MF $(DEPDIR)/libglpk_la-stdout.Tpo -c -o libglpk_la-stdout.lo `test -f 'env/stdout.c' || echo '$(srcdir)/'`env/stdout.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-stdout.Tpo $(DEPDIR)/libglpk_la-stdout.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='env/stdout.c' object='libglpk_la-stdout.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-stdout.lo `test -f 'env/stdout.c' || echo '$(srcdir)/'`env/stdout.c libglpk_la-stream.lo: env/stream.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-stream.lo -MD -MP -MF $(DEPDIR)/libglpk_la-stream.Tpo -c -o libglpk_la-stream.lo `test -f 'env/stream.c' || echo '$(srcdir)/'`env/stream.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-stream.Tpo $(DEPDIR)/libglpk_la-stream.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='env/stream.c' object='libglpk_la-stream.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-stream.lo `test -f 'env/stream.c' || echo '$(srcdir)/'`env/stream.c libglpk_la-time.lo: env/time.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-time.lo -MD -MP -MF $(DEPDIR)/libglpk_la-time.Tpo -c -o libglpk_la-time.lo `test -f 'env/time.c' || echo '$(srcdir)/'`env/time.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-time.Tpo $(DEPDIR)/libglpk_la-time.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='env/time.c' object='libglpk_la-time.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-time.lo `test -f 'env/time.c' || echo '$(srcdir)/'`env/time.c libglpk_la-tls.lo: env/tls.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-tls.lo -MD -MP -MF $(DEPDIR)/libglpk_la-tls.Tpo -c -o libglpk_la-tls.lo `test -f 'env/tls.c' || echo '$(srcdir)/'`env/tls.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-tls.Tpo $(DEPDIR)/libglpk_la-tls.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='env/tls.c' object='libglpk_la-tls.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-tls.lo `test -f 'env/tls.c' || echo '$(srcdir)/'`env/tls.c libglpk_la-cfg.lo: intopt/cfg.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-cfg.lo -MD -MP -MF $(DEPDIR)/libglpk_la-cfg.Tpo -c -o libglpk_la-cfg.lo `test -f 'intopt/cfg.c' || echo '$(srcdir)/'`intopt/cfg.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-cfg.Tpo $(DEPDIR)/libglpk_la-cfg.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='intopt/cfg.c' object='libglpk_la-cfg.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-cfg.lo `test -f 'intopt/cfg.c' || echo '$(srcdir)/'`intopt/cfg.c libglpk_la-cfg1.lo: intopt/cfg1.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-cfg1.lo -MD -MP -MF $(DEPDIR)/libglpk_la-cfg1.Tpo -c -o libglpk_la-cfg1.lo `test -f 'intopt/cfg1.c' || echo '$(srcdir)/'`intopt/cfg1.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-cfg1.Tpo $(DEPDIR)/libglpk_la-cfg1.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='intopt/cfg1.c' object='libglpk_la-cfg1.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-cfg1.lo `test -f 'intopt/cfg1.c' || echo '$(srcdir)/'`intopt/cfg1.c libglpk_la-cfg2.lo: intopt/cfg2.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-cfg2.lo -MD -MP -MF $(DEPDIR)/libglpk_la-cfg2.Tpo -c -o libglpk_la-cfg2.lo `test -f 'intopt/cfg2.c' || echo '$(srcdir)/'`intopt/cfg2.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-cfg2.Tpo $(DEPDIR)/libglpk_la-cfg2.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='intopt/cfg2.c' object='libglpk_la-cfg2.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-cfg2.lo `test -f 'intopt/cfg2.c' || echo '$(srcdir)/'`intopt/cfg2.c libglpk_la-clqcut.lo: intopt/clqcut.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-clqcut.lo -MD -MP -MF $(DEPDIR)/libglpk_la-clqcut.Tpo -c -o libglpk_la-clqcut.lo `test -f 'intopt/clqcut.c' || echo '$(srcdir)/'`intopt/clqcut.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-clqcut.Tpo $(DEPDIR)/libglpk_la-clqcut.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='intopt/clqcut.c' object='libglpk_la-clqcut.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-clqcut.lo `test -f 'intopt/clqcut.c' || echo '$(srcdir)/'`intopt/clqcut.c libglpk_la-covgen.lo: intopt/covgen.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-covgen.lo -MD -MP -MF $(DEPDIR)/libglpk_la-covgen.Tpo -c -o libglpk_la-covgen.lo `test -f 'intopt/covgen.c' || echo '$(srcdir)/'`intopt/covgen.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-covgen.Tpo $(DEPDIR)/libglpk_la-covgen.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='intopt/covgen.c' object='libglpk_la-covgen.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-covgen.lo `test -f 'intopt/covgen.c' || echo '$(srcdir)/'`intopt/covgen.c libglpk_la-fpump.lo: intopt/fpump.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-fpump.lo -MD -MP -MF $(DEPDIR)/libglpk_la-fpump.Tpo -c -o libglpk_la-fpump.lo `test -f 'intopt/fpump.c' || echo '$(srcdir)/'`intopt/fpump.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-fpump.Tpo $(DEPDIR)/libglpk_la-fpump.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='intopt/fpump.c' object='libglpk_la-fpump.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-fpump.lo `test -f 'intopt/fpump.c' || echo '$(srcdir)/'`intopt/fpump.c libglpk_la-gmicut.lo: intopt/gmicut.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-gmicut.lo -MD -MP -MF $(DEPDIR)/libglpk_la-gmicut.Tpo -c -o libglpk_la-gmicut.lo `test -f 'intopt/gmicut.c' || echo '$(srcdir)/'`intopt/gmicut.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-gmicut.Tpo $(DEPDIR)/libglpk_la-gmicut.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='intopt/gmicut.c' object='libglpk_la-gmicut.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-gmicut.lo `test -f 'intopt/gmicut.c' || echo '$(srcdir)/'`intopt/gmicut.c libglpk_la-gmigen.lo: intopt/gmigen.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-gmigen.lo -MD -MP -MF $(DEPDIR)/libglpk_la-gmigen.Tpo -c -o libglpk_la-gmigen.lo `test -f 'intopt/gmigen.c' || echo '$(srcdir)/'`intopt/gmigen.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-gmigen.Tpo $(DEPDIR)/libglpk_la-gmigen.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='intopt/gmigen.c' object='libglpk_la-gmigen.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-gmigen.lo `test -f 'intopt/gmigen.c' || echo '$(srcdir)/'`intopt/gmigen.c libglpk_la-mirgen.lo: intopt/mirgen.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-mirgen.lo -MD -MP -MF $(DEPDIR)/libglpk_la-mirgen.Tpo -c -o libglpk_la-mirgen.lo `test -f 'intopt/mirgen.c' || echo '$(srcdir)/'`intopt/mirgen.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-mirgen.Tpo $(DEPDIR)/libglpk_la-mirgen.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='intopt/mirgen.c' object='libglpk_la-mirgen.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-mirgen.lo `test -f 'intopt/mirgen.c' || echo '$(srcdir)/'`intopt/mirgen.c libglpk_la-spv.lo: intopt/spv.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-spv.lo -MD -MP -MF $(DEPDIR)/libglpk_la-spv.Tpo -c -o libglpk_la-spv.lo `test -f 'intopt/spv.c' || echo '$(srcdir)/'`intopt/spv.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-spv.Tpo $(DEPDIR)/libglpk_la-spv.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='intopt/spv.c' object='libglpk_la-spv.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-spv.lo `test -f 'intopt/spv.c' || echo '$(srcdir)/'`intopt/spv.c libglpk_la-minisat.lo: minisat/minisat.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-minisat.lo -MD -MP -MF $(DEPDIR)/libglpk_la-minisat.Tpo -c -o libglpk_la-minisat.lo `test -f 'minisat/minisat.c' || echo '$(srcdir)/'`minisat/minisat.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-minisat.Tpo $(DEPDIR)/libglpk_la-minisat.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='minisat/minisat.c' object='libglpk_la-minisat.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-minisat.lo `test -f 'minisat/minisat.c' || echo '$(srcdir)/'`minisat/minisat.c libglpk_la-avl.lo: misc/avl.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-avl.lo -MD -MP -MF $(DEPDIR)/libglpk_la-avl.Tpo -c -o libglpk_la-avl.lo `test -f 'misc/avl.c' || echo '$(srcdir)/'`misc/avl.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-avl.Tpo $(DEPDIR)/libglpk_la-avl.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='misc/avl.c' object='libglpk_la-avl.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-avl.lo `test -f 'misc/avl.c' || echo '$(srcdir)/'`misc/avl.c libglpk_la-bignum.lo: misc/bignum.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-bignum.lo -MD -MP -MF $(DEPDIR)/libglpk_la-bignum.Tpo -c -o libglpk_la-bignum.lo `test -f 'misc/bignum.c' || echo '$(srcdir)/'`misc/bignum.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-bignum.Tpo $(DEPDIR)/libglpk_la-bignum.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='misc/bignum.c' object='libglpk_la-bignum.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-bignum.lo `test -f 'misc/bignum.c' || echo '$(srcdir)/'`misc/bignum.c libglpk_la-dimacs.lo: misc/dimacs.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-dimacs.lo -MD -MP -MF $(DEPDIR)/libglpk_la-dimacs.Tpo -c -o libglpk_la-dimacs.lo `test -f 'misc/dimacs.c' || echo '$(srcdir)/'`misc/dimacs.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-dimacs.Tpo $(DEPDIR)/libglpk_la-dimacs.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='misc/dimacs.c' object='libglpk_la-dimacs.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-dimacs.lo `test -f 'misc/dimacs.c' || echo '$(srcdir)/'`misc/dimacs.c libglpk_la-dmp.lo: misc/dmp.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-dmp.lo -MD -MP -MF $(DEPDIR)/libglpk_la-dmp.Tpo -c -o libglpk_la-dmp.lo `test -f 'misc/dmp.c' || echo '$(srcdir)/'`misc/dmp.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-dmp.Tpo $(DEPDIR)/libglpk_la-dmp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='misc/dmp.c' object='libglpk_la-dmp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-dmp.lo `test -f 'misc/dmp.c' || echo '$(srcdir)/'`misc/dmp.c libglpk_la-ffalg.lo: misc/ffalg.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-ffalg.lo -MD -MP -MF $(DEPDIR)/libglpk_la-ffalg.Tpo -c -o libglpk_la-ffalg.lo `test -f 'misc/ffalg.c' || echo '$(srcdir)/'`misc/ffalg.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-ffalg.Tpo $(DEPDIR)/libglpk_la-ffalg.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='misc/ffalg.c' object='libglpk_la-ffalg.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-ffalg.lo `test -f 'misc/ffalg.c' || echo '$(srcdir)/'`misc/ffalg.c libglpk_la-fp2rat.lo: misc/fp2rat.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-fp2rat.lo -MD -MP -MF $(DEPDIR)/libglpk_la-fp2rat.Tpo -c -o libglpk_la-fp2rat.lo `test -f 'misc/fp2rat.c' || echo '$(srcdir)/'`misc/fp2rat.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-fp2rat.Tpo $(DEPDIR)/libglpk_la-fp2rat.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='misc/fp2rat.c' object='libglpk_la-fp2rat.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-fp2rat.lo `test -f 'misc/fp2rat.c' || echo '$(srcdir)/'`misc/fp2rat.c libglpk_la-fvs.lo: misc/fvs.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-fvs.lo -MD -MP -MF $(DEPDIR)/libglpk_la-fvs.Tpo -c -o libglpk_la-fvs.lo `test -f 'misc/fvs.c' || echo '$(srcdir)/'`misc/fvs.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-fvs.Tpo $(DEPDIR)/libglpk_la-fvs.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='misc/fvs.c' object='libglpk_la-fvs.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-fvs.lo `test -f 'misc/fvs.c' || echo '$(srcdir)/'`misc/fvs.c libglpk_la-gcd.lo: misc/gcd.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-gcd.lo -MD -MP -MF $(DEPDIR)/libglpk_la-gcd.Tpo -c -o libglpk_la-gcd.lo `test -f 'misc/gcd.c' || echo '$(srcdir)/'`misc/gcd.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-gcd.Tpo $(DEPDIR)/libglpk_la-gcd.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='misc/gcd.c' object='libglpk_la-gcd.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-gcd.lo `test -f 'misc/gcd.c' || echo '$(srcdir)/'`misc/gcd.c libglpk_la-hbm.lo: misc/hbm.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-hbm.lo -MD -MP -MF $(DEPDIR)/libglpk_la-hbm.Tpo -c -o libglpk_la-hbm.lo `test -f 'misc/hbm.c' || echo '$(srcdir)/'`misc/hbm.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-hbm.Tpo $(DEPDIR)/libglpk_la-hbm.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='misc/hbm.c' object='libglpk_la-hbm.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-hbm.lo `test -f 'misc/hbm.c' || echo '$(srcdir)/'`misc/hbm.c libglpk_la-jd.lo: misc/jd.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-jd.lo -MD -MP -MF $(DEPDIR)/libglpk_la-jd.Tpo -c -o libglpk_la-jd.lo `test -f 'misc/jd.c' || echo '$(srcdir)/'`misc/jd.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-jd.Tpo $(DEPDIR)/libglpk_la-jd.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='misc/jd.c' object='libglpk_la-jd.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-jd.lo `test -f 'misc/jd.c' || echo '$(srcdir)/'`misc/jd.c libglpk_la-keller.lo: misc/keller.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-keller.lo -MD -MP -MF $(DEPDIR)/libglpk_la-keller.Tpo -c -o libglpk_la-keller.lo `test -f 'misc/keller.c' || echo '$(srcdir)/'`misc/keller.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-keller.Tpo $(DEPDIR)/libglpk_la-keller.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='misc/keller.c' object='libglpk_la-keller.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-keller.lo `test -f 'misc/keller.c' || echo '$(srcdir)/'`misc/keller.c libglpk_la-ks.lo: misc/ks.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-ks.lo -MD -MP -MF $(DEPDIR)/libglpk_la-ks.Tpo -c -o libglpk_la-ks.lo `test -f 'misc/ks.c' || echo '$(srcdir)/'`misc/ks.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-ks.Tpo $(DEPDIR)/libglpk_la-ks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='misc/ks.c' object='libglpk_la-ks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-ks.lo `test -f 'misc/ks.c' || echo '$(srcdir)/'`misc/ks.c libglpk_la-mc13d.lo: misc/mc13d.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-mc13d.lo -MD -MP -MF $(DEPDIR)/libglpk_la-mc13d.Tpo -c -o libglpk_la-mc13d.lo `test -f 'misc/mc13d.c' || echo '$(srcdir)/'`misc/mc13d.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-mc13d.Tpo $(DEPDIR)/libglpk_la-mc13d.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='misc/mc13d.c' object='libglpk_la-mc13d.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-mc13d.lo `test -f 'misc/mc13d.c' || echo '$(srcdir)/'`misc/mc13d.c libglpk_la-mc21a.lo: misc/mc21a.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-mc21a.lo -MD -MP -MF $(DEPDIR)/libglpk_la-mc21a.Tpo -c -o libglpk_la-mc21a.lo `test -f 'misc/mc21a.c' || echo '$(srcdir)/'`misc/mc21a.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-mc21a.Tpo $(DEPDIR)/libglpk_la-mc21a.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='misc/mc21a.c' object='libglpk_la-mc21a.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-mc21a.lo `test -f 'misc/mc21a.c' || echo '$(srcdir)/'`misc/mc21a.c libglpk_la-mt1.lo: misc/mt1.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-mt1.lo -MD -MP -MF $(DEPDIR)/libglpk_la-mt1.Tpo -c -o libglpk_la-mt1.lo `test -f 'misc/mt1.c' || echo '$(srcdir)/'`misc/mt1.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-mt1.Tpo $(DEPDIR)/libglpk_la-mt1.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='misc/mt1.c' object='libglpk_la-mt1.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-mt1.lo `test -f 'misc/mt1.c' || echo '$(srcdir)/'`misc/mt1.c libglpk_la-mygmp.lo: misc/mygmp.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-mygmp.lo -MD -MP -MF $(DEPDIR)/libglpk_la-mygmp.Tpo -c -o libglpk_la-mygmp.lo `test -f 'misc/mygmp.c' || echo '$(srcdir)/'`misc/mygmp.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-mygmp.Tpo $(DEPDIR)/libglpk_la-mygmp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='misc/mygmp.c' object='libglpk_la-mygmp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-mygmp.lo `test -f 'misc/mygmp.c' || echo '$(srcdir)/'`misc/mygmp.c libglpk_la-okalg.lo: misc/okalg.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-okalg.lo -MD -MP -MF $(DEPDIR)/libglpk_la-okalg.Tpo -c -o libglpk_la-okalg.lo `test -f 'misc/okalg.c' || echo '$(srcdir)/'`misc/okalg.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-okalg.Tpo $(DEPDIR)/libglpk_la-okalg.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='misc/okalg.c' object='libglpk_la-okalg.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-okalg.lo `test -f 'misc/okalg.c' || echo '$(srcdir)/'`misc/okalg.c libglpk_la-qmd.lo: misc/qmd.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-qmd.lo -MD -MP -MF $(DEPDIR)/libglpk_la-qmd.Tpo -c -o libglpk_la-qmd.lo `test -f 'misc/qmd.c' || echo '$(srcdir)/'`misc/qmd.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-qmd.Tpo $(DEPDIR)/libglpk_la-qmd.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='misc/qmd.c' object='libglpk_la-qmd.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-qmd.lo `test -f 'misc/qmd.c' || echo '$(srcdir)/'`misc/qmd.c libglpk_la-relax4.lo: misc/relax4.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-relax4.lo -MD -MP -MF $(DEPDIR)/libglpk_la-relax4.Tpo -c -o libglpk_la-relax4.lo `test -f 'misc/relax4.c' || echo '$(srcdir)/'`misc/relax4.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-relax4.Tpo $(DEPDIR)/libglpk_la-relax4.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='misc/relax4.c' object='libglpk_la-relax4.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-relax4.lo `test -f 'misc/relax4.c' || echo '$(srcdir)/'`misc/relax4.c libglpk_la-rgr.lo: misc/rgr.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-rgr.lo -MD -MP -MF $(DEPDIR)/libglpk_la-rgr.Tpo -c -o libglpk_la-rgr.lo `test -f 'misc/rgr.c' || echo '$(srcdir)/'`misc/rgr.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-rgr.Tpo $(DEPDIR)/libglpk_la-rgr.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='misc/rgr.c' object='libglpk_la-rgr.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-rgr.lo `test -f 'misc/rgr.c' || echo '$(srcdir)/'`misc/rgr.c libglpk_la-rng.lo: misc/rng.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-rng.lo -MD -MP -MF $(DEPDIR)/libglpk_la-rng.Tpo -c -o libglpk_la-rng.lo `test -f 'misc/rng.c' || echo '$(srcdir)/'`misc/rng.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-rng.Tpo $(DEPDIR)/libglpk_la-rng.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='misc/rng.c' object='libglpk_la-rng.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-rng.lo `test -f 'misc/rng.c' || echo '$(srcdir)/'`misc/rng.c libglpk_la-rng1.lo: misc/rng1.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-rng1.lo -MD -MP -MF $(DEPDIR)/libglpk_la-rng1.Tpo -c -o libglpk_la-rng1.lo `test -f 'misc/rng1.c' || echo '$(srcdir)/'`misc/rng1.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-rng1.Tpo $(DEPDIR)/libglpk_la-rng1.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='misc/rng1.c' object='libglpk_la-rng1.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-rng1.lo `test -f 'misc/rng1.c' || echo '$(srcdir)/'`misc/rng1.c libglpk_la-round2n.lo: misc/round2n.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-round2n.lo -MD -MP -MF $(DEPDIR)/libglpk_la-round2n.Tpo -c -o libglpk_la-round2n.lo `test -f 'misc/round2n.c' || echo '$(srcdir)/'`misc/round2n.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-round2n.Tpo $(DEPDIR)/libglpk_la-round2n.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='misc/round2n.c' object='libglpk_la-round2n.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-round2n.lo `test -f 'misc/round2n.c' || echo '$(srcdir)/'`misc/round2n.c libglpk_la-spm.lo: misc/spm.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-spm.lo -MD -MP -MF $(DEPDIR)/libglpk_la-spm.Tpo -c -o libglpk_la-spm.lo `test -f 'misc/spm.c' || echo '$(srcdir)/'`misc/spm.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-spm.Tpo $(DEPDIR)/libglpk_la-spm.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='misc/spm.c' object='libglpk_la-spm.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-spm.lo `test -f 'misc/spm.c' || echo '$(srcdir)/'`misc/spm.c libglpk_la-str2int.lo: misc/str2int.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-str2int.lo -MD -MP -MF $(DEPDIR)/libglpk_la-str2int.Tpo -c -o libglpk_la-str2int.lo `test -f 'misc/str2int.c' || echo '$(srcdir)/'`misc/str2int.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-str2int.Tpo $(DEPDIR)/libglpk_la-str2int.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='misc/str2int.c' object='libglpk_la-str2int.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-str2int.lo `test -f 'misc/str2int.c' || echo '$(srcdir)/'`misc/str2int.c libglpk_la-str2num.lo: misc/str2num.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-str2num.lo -MD -MP -MF $(DEPDIR)/libglpk_la-str2num.Tpo -c -o libglpk_la-str2num.lo `test -f 'misc/str2num.c' || echo '$(srcdir)/'`misc/str2num.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-str2num.Tpo $(DEPDIR)/libglpk_la-str2num.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='misc/str2num.c' object='libglpk_la-str2num.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-str2num.lo `test -f 'misc/str2num.c' || echo '$(srcdir)/'`misc/str2num.c libglpk_la-strspx.lo: misc/strspx.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-strspx.lo -MD -MP -MF $(DEPDIR)/libglpk_la-strspx.Tpo -c -o libglpk_la-strspx.lo `test -f 'misc/strspx.c' || echo '$(srcdir)/'`misc/strspx.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-strspx.Tpo $(DEPDIR)/libglpk_la-strspx.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='misc/strspx.c' object='libglpk_la-strspx.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-strspx.lo `test -f 'misc/strspx.c' || echo '$(srcdir)/'`misc/strspx.c libglpk_la-strtrim.lo: misc/strtrim.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-strtrim.lo -MD -MP -MF $(DEPDIR)/libglpk_la-strtrim.Tpo -c -o libglpk_la-strtrim.lo `test -f 'misc/strtrim.c' || echo '$(srcdir)/'`misc/strtrim.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-strtrim.Tpo $(DEPDIR)/libglpk_la-strtrim.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='misc/strtrim.c' object='libglpk_la-strtrim.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-strtrim.lo `test -f 'misc/strtrim.c' || echo '$(srcdir)/'`misc/strtrim.c libglpk_la-triang.lo: misc/triang.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-triang.lo -MD -MP -MF $(DEPDIR)/libglpk_la-triang.Tpo -c -o libglpk_la-triang.lo `test -f 'misc/triang.c' || echo '$(srcdir)/'`misc/triang.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-triang.Tpo $(DEPDIR)/libglpk_la-triang.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='misc/triang.c' object='libglpk_la-triang.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-triang.lo `test -f 'misc/triang.c' || echo '$(srcdir)/'`misc/triang.c libglpk_la-wclique.lo: misc/wclique.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-wclique.lo -MD -MP -MF $(DEPDIR)/libglpk_la-wclique.Tpo -c -o libglpk_la-wclique.lo `test -f 'misc/wclique.c' || echo '$(srcdir)/'`misc/wclique.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-wclique.Tpo $(DEPDIR)/libglpk_la-wclique.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='misc/wclique.c' object='libglpk_la-wclique.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-wclique.lo `test -f 'misc/wclique.c' || echo '$(srcdir)/'`misc/wclique.c libglpk_la-wclique1.lo: misc/wclique1.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-wclique1.lo -MD -MP -MF $(DEPDIR)/libglpk_la-wclique1.Tpo -c -o libglpk_la-wclique1.lo `test -f 'misc/wclique1.c' || echo '$(srcdir)/'`misc/wclique1.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-wclique1.Tpo $(DEPDIR)/libglpk_la-wclique1.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='misc/wclique1.c' object='libglpk_la-wclique1.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-wclique1.lo `test -f 'misc/wclique1.c' || echo '$(srcdir)/'`misc/wclique1.c libglpk_la-mpl1.lo: mpl/mpl1.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-mpl1.lo -MD -MP -MF $(DEPDIR)/libglpk_la-mpl1.Tpo -c -o libglpk_la-mpl1.lo `test -f 'mpl/mpl1.c' || echo '$(srcdir)/'`mpl/mpl1.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-mpl1.Tpo $(DEPDIR)/libglpk_la-mpl1.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='mpl/mpl1.c' object='libglpk_la-mpl1.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-mpl1.lo `test -f 'mpl/mpl1.c' || echo '$(srcdir)/'`mpl/mpl1.c libglpk_la-mpl2.lo: mpl/mpl2.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-mpl2.lo -MD -MP -MF $(DEPDIR)/libglpk_la-mpl2.Tpo -c -o libglpk_la-mpl2.lo `test -f 'mpl/mpl2.c' || echo '$(srcdir)/'`mpl/mpl2.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-mpl2.Tpo $(DEPDIR)/libglpk_la-mpl2.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='mpl/mpl2.c' object='libglpk_la-mpl2.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-mpl2.lo `test -f 'mpl/mpl2.c' || echo '$(srcdir)/'`mpl/mpl2.c libglpk_la-mpl3.lo: mpl/mpl3.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-mpl3.lo -MD -MP -MF $(DEPDIR)/libglpk_la-mpl3.Tpo -c -o libglpk_la-mpl3.lo `test -f 'mpl/mpl3.c' || echo '$(srcdir)/'`mpl/mpl3.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-mpl3.Tpo $(DEPDIR)/libglpk_la-mpl3.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='mpl/mpl3.c' object='libglpk_la-mpl3.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-mpl3.lo `test -f 'mpl/mpl3.c' || echo '$(srcdir)/'`mpl/mpl3.c libglpk_la-mpl4.lo: mpl/mpl4.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-mpl4.lo -MD -MP -MF $(DEPDIR)/libglpk_la-mpl4.Tpo -c -o libglpk_la-mpl4.lo `test -f 'mpl/mpl4.c' || echo '$(srcdir)/'`mpl/mpl4.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-mpl4.Tpo $(DEPDIR)/libglpk_la-mpl4.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='mpl/mpl4.c' object='libglpk_la-mpl4.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-mpl4.lo `test -f 'mpl/mpl4.c' || echo '$(srcdir)/'`mpl/mpl4.c libglpk_la-mpl5.lo: mpl/mpl5.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-mpl5.lo -MD -MP -MF $(DEPDIR)/libglpk_la-mpl5.Tpo -c -o libglpk_la-mpl5.lo `test -f 'mpl/mpl5.c' || echo '$(srcdir)/'`mpl/mpl5.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-mpl5.Tpo $(DEPDIR)/libglpk_la-mpl5.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='mpl/mpl5.c' object='libglpk_la-mpl5.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-mpl5.lo `test -f 'mpl/mpl5.c' || echo '$(srcdir)/'`mpl/mpl5.c libglpk_la-mpl6.lo: mpl/mpl6.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-mpl6.lo -MD -MP -MF $(DEPDIR)/libglpk_la-mpl6.Tpo -c -o libglpk_la-mpl6.lo `test -f 'mpl/mpl6.c' || echo '$(srcdir)/'`mpl/mpl6.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-mpl6.Tpo $(DEPDIR)/libglpk_la-mpl6.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='mpl/mpl6.c' object='libglpk_la-mpl6.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-mpl6.lo `test -f 'mpl/mpl6.c' || echo '$(srcdir)/'`mpl/mpl6.c libglpk_la-mplsql.lo: mpl/mplsql.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-mplsql.lo -MD -MP -MF $(DEPDIR)/libglpk_la-mplsql.Tpo -c -o libglpk_la-mplsql.lo `test -f 'mpl/mplsql.c' || echo '$(srcdir)/'`mpl/mplsql.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-mplsql.Tpo $(DEPDIR)/libglpk_la-mplsql.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='mpl/mplsql.c' object='libglpk_la-mplsql.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-mplsql.lo `test -f 'mpl/mplsql.c' || echo '$(srcdir)/'`mpl/mplsql.c libglpk_la-npp1.lo: npp/npp1.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-npp1.lo -MD -MP -MF $(DEPDIR)/libglpk_la-npp1.Tpo -c -o libglpk_la-npp1.lo `test -f 'npp/npp1.c' || echo '$(srcdir)/'`npp/npp1.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-npp1.Tpo $(DEPDIR)/libglpk_la-npp1.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='npp/npp1.c' object='libglpk_la-npp1.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-npp1.lo `test -f 'npp/npp1.c' || echo '$(srcdir)/'`npp/npp1.c libglpk_la-npp2.lo: npp/npp2.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-npp2.lo -MD -MP -MF $(DEPDIR)/libglpk_la-npp2.Tpo -c -o libglpk_la-npp2.lo `test -f 'npp/npp2.c' || echo '$(srcdir)/'`npp/npp2.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-npp2.Tpo $(DEPDIR)/libglpk_la-npp2.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='npp/npp2.c' object='libglpk_la-npp2.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-npp2.lo `test -f 'npp/npp2.c' || echo '$(srcdir)/'`npp/npp2.c libglpk_la-npp3.lo: npp/npp3.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-npp3.lo -MD -MP -MF $(DEPDIR)/libglpk_la-npp3.Tpo -c -o libglpk_la-npp3.lo `test -f 'npp/npp3.c' || echo '$(srcdir)/'`npp/npp3.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-npp3.Tpo $(DEPDIR)/libglpk_la-npp3.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='npp/npp3.c' object='libglpk_la-npp3.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-npp3.lo `test -f 'npp/npp3.c' || echo '$(srcdir)/'`npp/npp3.c libglpk_la-npp4.lo: npp/npp4.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-npp4.lo -MD -MP -MF $(DEPDIR)/libglpk_la-npp4.Tpo -c -o libglpk_la-npp4.lo `test -f 'npp/npp4.c' || echo '$(srcdir)/'`npp/npp4.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-npp4.Tpo $(DEPDIR)/libglpk_la-npp4.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='npp/npp4.c' object='libglpk_la-npp4.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-npp4.lo `test -f 'npp/npp4.c' || echo '$(srcdir)/'`npp/npp4.c libglpk_la-npp5.lo: npp/npp5.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-npp5.lo -MD -MP -MF $(DEPDIR)/libglpk_la-npp5.Tpo -c -o libglpk_la-npp5.lo `test -f 'npp/npp5.c' || echo '$(srcdir)/'`npp/npp5.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-npp5.Tpo $(DEPDIR)/libglpk_la-npp5.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='npp/npp5.c' object='libglpk_la-npp5.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-npp5.lo `test -f 'npp/npp5.c' || echo '$(srcdir)/'`npp/npp5.c libglpk_la-npp6.lo: npp/npp6.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-npp6.lo -MD -MP -MF $(DEPDIR)/libglpk_la-npp6.Tpo -c -o libglpk_la-npp6.lo `test -f 'npp/npp6.c' || echo '$(srcdir)/'`npp/npp6.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-npp6.Tpo $(DEPDIR)/libglpk_la-npp6.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='npp/npp6.c' object='libglpk_la-npp6.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-npp6.lo `test -f 'npp/npp6.c' || echo '$(srcdir)/'`npp/npp6.c libglpk_la-proxy.lo: proxy/proxy.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-proxy.lo -MD -MP -MF $(DEPDIR)/libglpk_la-proxy.Tpo -c -o libglpk_la-proxy.lo `test -f 'proxy/proxy.c' || echo '$(srcdir)/'`proxy/proxy.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-proxy.Tpo $(DEPDIR)/libglpk_la-proxy.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='proxy/proxy.c' object='libglpk_la-proxy.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-proxy.lo `test -f 'proxy/proxy.c' || echo '$(srcdir)/'`proxy/proxy.c libglpk_la-proxy1.lo: proxy/proxy1.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-proxy1.lo -MD -MP -MF $(DEPDIR)/libglpk_la-proxy1.Tpo -c -o libglpk_la-proxy1.lo `test -f 'proxy/proxy1.c' || echo '$(srcdir)/'`proxy/proxy1.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-proxy1.Tpo $(DEPDIR)/libglpk_la-proxy1.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='proxy/proxy1.c' object='libglpk_la-proxy1.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-proxy1.lo `test -f 'proxy/proxy1.c' || echo '$(srcdir)/'`proxy/proxy1.c libglpk_la-spxat.lo: simplex/spxat.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-spxat.lo -MD -MP -MF $(DEPDIR)/libglpk_la-spxat.Tpo -c -o libglpk_la-spxat.lo `test -f 'simplex/spxat.c' || echo '$(srcdir)/'`simplex/spxat.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-spxat.Tpo $(DEPDIR)/libglpk_la-spxat.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='simplex/spxat.c' object='libglpk_la-spxat.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-spxat.lo `test -f 'simplex/spxat.c' || echo '$(srcdir)/'`simplex/spxat.c libglpk_la-spxchuzc.lo: simplex/spxchuzc.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-spxchuzc.lo -MD -MP -MF $(DEPDIR)/libglpk_la-spxchuzc.Tpo -c -o libglpk_la-spxchuzc.lo `test -f 'simplex/spxchuzc.c' || echo '$(srcdir)/'`simplex/spxchuzc.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-spxchuzc.Tpo $(DEPDIR)/libglpk_la-spxchuzc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='simplex/spxchuzc.c' object='libglpk_la-spxchuzc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-spxchuzc.lo `test -f 'simplex/spxchuzc.c' || echo '$(srcdir)/'`simplex/spxchuzc.c libglpk_la-spxchuzr.lo: simplex/spxchuzr.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-spxchuzr.lo -MD -MP -MF $(DEPDIR)/libglpk_la-spxchuzr.Tpo -c -o libglpk_la-spxchuzr.lo `test -f 'simplex/spxchuzr.c' || echo '$(srcdir)/'`simplex/spxchuzr.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-spxchuzr.Tpo $(DEPDIR)/libglpk_la-spxchuzr.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='simplex/spxchuzr.c' object='libglpk_la-spxchuzr.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-spxchuzr.lo `test -f 'simplex/spxchuzr.c' || echo '$(srcdir)/'`simplex/spxchuzr.c libglpk_la-spxlp.lo: simplex/spxlp.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-spxlp.lo -MD -MP -MF $(DEPDIR)/libglpk_la-spxlp.Tpo -c -o libglpk_la-spxlp.lo `test -f 'simplex/spxlp.c' || echo '$(srcdir)/'`simplex/spxlp.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-spxlp.Tpo $(DEPDIR)/libglpk_la-spxlp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='simplex/spxlp.c' object='libglpk_la-spxlp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-spxlp.lo `test -f 'simplex/spxlp.c' || echo '$(srcdir)/'`simplex/spxlp.c libglpk_la-spxnt.lo: simplex/spxnt.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-spxnt.lo -MD -MP -MF $(DEPDIR)/libglpk_la-spxnt.Tpo -c -o libglpk_la-spxnt.lo `test -f 'simplex/spxnt.c' || echo '$(srcdir)/'`simplex/spxnt.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-spxnt.Tpo $(DEPDIR)/libglpk_la-spxnt.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='simplex/spxnt.c' object='libglpk_la-spxnt.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-spxnt.lo `test -f 'simplex/spxnt.c' || echo '$(srcdir)/'`simplex/spxnt.c libglpk_la-spxprim.lo: simplex/spxprim.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-spxprim.lo -MD -MP -MF $(DEPDIR)/libglpk_la-spxprim.Tpo -c -o libglpk_la-spxprim.lo `test -f 'simplex/spxprim.c' || echo '$(srcdir)/'`simplex/spxprim.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-spxprim.Tpo $(DEPDIR)/libglpk_la-spxprim.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='simplex/spxprim.c' object='libglpk_la-spxprim.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-spxprim.lo `test -f 'simplex/spxprim.c' || echo '$(srcdir)/'`simplex/spxprim.c libglpk_la-spxprob.lo: simplex/spxprob.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-spxprob.lo -MD -MP -MF $(DEPDIR)/libglpk_la-spxprob.Tpo -c -o libglpk_la-spxprob.lo `test -f 'simplex/spxprob.c' || echo '$(srcdir)/'`simplex/spxprob.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-spxprob.Tpo $(DEPDIR)/libglpk_la-spxprob.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='simplex/spxprob.c' object='libglpk_la-spxprob.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-spxprob.lo `test -f 'simplex/spxprob.c' || echo '$(srcdir)/'`simplex/spxprob.c libglpk_la-spychuzc.lo: simplex/spychuzc.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-spychuzc.lo -MD -MP -MF $(DEPDIR)/libglpk_la-spychuzc.Tpo -c -o libglpk_la-spychuzc.lo `test -f 'simplex/spychuzc.c' || echo '$(srcdir)/'`simplex/spychuzc.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-spychuzc.Tpo $(DEPDIR)/libglpk_la-spychuzc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='simplex/spychuzc.c' object='libglpk_la-spychuzc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-spychuzc.lo `test -f 'simplex/spychuzc.c' || echo '$(srcdir)/'`simplex/spychuzc.c libglpk_la-spychuzr.lo: simplex/spychuzr.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-spychuzr.lo -MD -MP -MF $(DEPDIR)/libglpk_la-spychuzr.Tpo -c -o libglpk_la-spychuzr.lo `test -f 'simplex/spychuzr.c' || echo '$(srcdir)/'`simplex/spychuzr.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-spychuzr.Tpo $(DEPDIR)/libglpk_la-spychuzr.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='simplex/spychuzr.c' object='libglpk_la-spychuzr.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-spychuzr.lo `test -f 'simplex/spychuzr.c' || echo '$(srcdir)/'`simplex/spychuzr.c libglpk_la-spydual.lo: simplex/spydual.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-spydual.lo -MD -MP -MF $(DEPDIR)/libglpk_la-spydual.Tpo -c -o libglpk_la-spydual.lo `test -f 'simplex/spydual.c' || echo '$(srcdir)/'`simplex/spydual.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-spydual.Tpo $(DEPDIR)/libglpk_la-spydual.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='simplex/spydual.c' object='libglpk_la-spydual.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-spydual.lo `test -f 'simplex/spydual.c' || echo '$(srcdir)/'`simplex/spydual.c libglpk_la-adler32.lo: zlib/adler32.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-adler32.lo -MD -MP -MF $(DEPDIR)/libglpk_la-adler32.Tpo -c -o libglpk_la-adler32.lo `test -f 'zlib/adler32.c' || echo '$(srcdir)/'`zlib/adler32.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-adler32.Tpo $(DEPDIR)/libglpk_la-adler32.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='zlib/adler32.c' object='libglpk_la-adler32.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-adler32.lo `test -f 'zlib/adler32.c' || echo '$(srcdir)/'`zlib/adler32.c libglpk_la-compress.lo: zlib/compress.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-compress.lo -MD -MP -MF $(DEPDIR)/libglpk_la-compress.Tpo -c -o libglpk_la-compress.lo `test -f 'zlib/compress.c' || echo '$(srcdir)/'`zlib/compress.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-compress.Tpo $(DEPDIR)/libglpk_la-compress.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='zlib/compress.c' object='libglpk_la-compress.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-compress.lo `test -f 'zlib/compress.c' || echo '$(srcdir)/'`zlib/compress.c libglpk_la-crc32.lo: zlib/crc32.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-crc32.lo -MD -MP -MF $(DEPDIR)/libglpk_la-crc32.Tpo -c -o libglpk_la-crc32.lo `test -f 'zlib/crc32.c' || echo '$(srcdir)/'`zlib/crc32.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-crc32.Tpo $(DEPDIR)/libglpk_la-crc32.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='zlib/crc32.c' object='libglpk_la-crc32.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-crc32.lo `test -f 'zlib/crc32.c' || echo '$(srcdir)/'`zlib/crc32.c libglpk_la-deflate.lo: zlib/deflate.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-deflate.lo -MD -MP -MF $(DEPDIR)/libglpk_la-deflate.Tpo -c -o libglpk_la-deflate.lo `test -f 'zlib/deflate.c' || echo '$(srcdir)/'`zlib/deflate.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-deflate.Tpo $(DEPDIR)/libglpk_la-deflate.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='zlib/deflate.c' object='libglpk_la-deflate.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-deflate.lo `test -f 'zlib/deflate.c' || echo '$(srcdir)/'`zlib/deflate.c libglpk_la-gzclose.lo: zlib/gzclose.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-gzclose.lo -MD -MP -MF $(DEPDIR)/libglpk_la-gzclose.Tpo -c -o libglpk_la-gzclose.lo `test -f 'zlib/gzclose.c' || echo '$(srcdir)/'`zlib/gzclose.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-gzclose.Tpo $(DEPDIR)/libglpk_la-gzclose.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='zlib/gzclose.c' object='libglpk_la-gzclose.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-gzclose.lo `test -f 'zlib/gzclose.c' || echo '$(srcdir)/'`zlib/gzclose.c libglpk_la-gzlib.lo: zlib/gzlib.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-gzlib.lo -MD -MP -MF $(DEPDIR)/libglpk_la-gzlib.Tpo -c -o libglpk_la-gzlib.lo `test -f 'zlib/gzlib.c' || echo '$(srcdir)/'`zlib/gzlib.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-gzlib.Tpo $(DEPDIR)/libglpk_la-gzlib.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='zlib/gzlib.c' object='libglpk_la-gzlib.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-gzlib.lo `test -f 'zlib/gzlib.c' || echo '$(srcdir)/'`zlib/gzlib.c libglpk_la-gzread.lo: zlib/gzread.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-gzread.lo -MD -MP -MF $(DEPDIR)/libglpk_la-gzread.Tpo -c -o libglpk_la-gzread.lo `test -f 'zlib/gzread.c' || echo '$(srcdir)/'`zlib/gzread.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-gzread.Tpo $(DEPDIR)/libglpk_la-gzread.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='zlib/gzread.c' object='libglpk_la-gzread.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-gzread.lo `test -f 'zlib/gzread.c' || echo '$(srcdir)/'`zlib/gzread.c libglpk_la-gzwrite.lo: zlib/gzwrite.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-gzwrite.lo -MD -MP -MF $(DEPDIR)/libglpk_la-gzwrite.Tpo -c -o libglpk_la-gzwrite.lo `test -f 'zlib/gzwrite.c' || echo '$(srcdir)/'`zlib/gzwrite.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-gzwrite.Tpo $(DEPDIR)/libglpk_la-gzwrite.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='zlib/gzwrite.c' object='libglpk_la-gzwrite.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-gzwrite.lo `test -f 'zlib/gzwrite.c' || echo '$(srcdir)/'`zlib/gzwrite.c libglpk_la-inffast.lo: zlib/inffast.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-inffast.lo -MD -MP -MF $(DEPDIR)/libglpk_la-inffast.Tpo -c -o libglpk_la-inffast.lo `test -f 'zlib/inffast.c' || echo '$(srcdir)/'`zlib/inffast.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-inffast.Tpo $(DEPDIR)/libglpk_la-inffast.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='zlib/inffast.c' object='libglpk_la-inffast.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-inffast.lo `test -f 'zlib/inffast.c' || echo '$(srcdir)/'`zlib/inffast.c libglpk_la-inflate.lo: zlib/inflate.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-inflate.lo -MD -MP -MF $(DEPDIR)/libglpk_la-inflate.Tpo -c -o libglpk_la-inflate.lo `test -f 'zlib/inflate.c' || echo '$(srcdir)/'`zlib/inflate.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-inflate.Tpo $(DEPDIR)/libglpk_la-inflate.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='zlib/inflate.c' object='libglpk_la-inflate.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-inflate.lo `test -f 'zlib/inflate.c' || echo '$(srcdir)/'`zlib/inflate.c libglpk_la-inftrees.lo: zlib/inftrees.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-inftrees.lo -MD -MP -MF $(DEPDIR)/libglpk_la-inftrees.Tpo -c -o libglpk_la-inftrees.lo `test -f 'zlib/inftrees.c' || echo '$(srcdir)/'`zlib/inftrees.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-inftrees.Tpo $(DEPDIR)/libglpk_la-inftrees.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='zlib/inftrees.c' object='libglpk_la-inftrees.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-inftrees.lo `test -f 'zlib/inftrees.c' || echo '$(srcdir)/'`zlib/inftrees.c libglpk_la-trees.lo: zlib/trees.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-trees.lo -MD -MP -MF $(DEPDIR)/libglpk_la-trees.Tpo -c -o libglpk_la-trees.lo `test -f 'zlib/trees.c' || echo '$(srcdir)/'`zlib/trees.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-trees.Tpo $(DEPDIR)/libglpk_la-trees.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='zlib/trees.c' object='libglpk_la-trees.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-trees.lo `test -f 'zlib/trees.c' || echo '$(srcdir)/'`zlib/trees.c libglpk_la-uncompr.lo: zlib/uncompr.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-uncompr.lo -MD -MP -MF $(DEPDIR)/libglpk_la-uncompr.Tpo -c -o libglpk_la-uncompr.lo `test -f 'zlib/uncompr.c' || echo '$(srcdir)/'`zlib/uncompr.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-uncompr.Tpo $(DEPDIR)/libglpk_la-uncompr.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='zlib/uncompr.c' object='libglpk_la-uncompr.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-uncompr.lo `test -f 'zlib/uncompr.c' || echo '$(srcdir)/'`zlib/uncompr.c libglpk_la-zio.lo: zlib/zio.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-zio.lo -MD -MP -MF $(DEPDIR)/libglpk_la-zio.Tpo -c -o libglpk_la-zio.lo `test -f 'zlib/zio.c' || echo '$(srcdir)/'`zlib/zio.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-zio.Tpo $(DEPDIR)/libglpk_la-zio.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='zlib/zio.c' object='libglpk_la-zio.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-zio.lo `test -f 'zlib/zio.c' || echo '$(srcdir)/'`zlib/zio.c libglpk_la-zutil.lo: zlib/zutil.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libglpk_la-zutil.lo -MD -MP -MF $(DEPDIR)/libglpk_la-zutil.Tpo -c -o libglpk_la-zutil.lo `test -f 'zlib/zutil.c' || echo '$(srcdir)/'`zlib/zutil.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libglpk_la-zutil.Tpo $(DEPDIR)/libglpk_la-zutil.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='zlib/zutil.c' object='libglpk_la-zutil.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libglpk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libglpk_la-zutil.lo `test -f 'zlib/zutil.c' || echo '$(srcdir)/'`zlib/zutil.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-includeHEADERS: $(include_HEADERS) @$(NORMAL_INSTALL) @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \ fi; \ 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_HEADER) $$files '$(DESTDIR)$(includedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ done uninstall-includeHEADERS: @$(NORMAL_UNINSTALL) @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) 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" cscopelist: $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) 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-libLTLIBRARIES clean-libtool \ 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-includeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES 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: uninstall-includeHEADERS uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool cscopelist 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-includeHEADERS 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 maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-includeHEADERS \ uninstall-libLTLIBRARIES # 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: glpk-5.0/src/minisat/0000755000062000006210000000000013766346220013735 5ustar maomkpasswdglpk-5.0/src/minisat/LICENSE0000644000062000006210000000206013766346220014740 0ustar maomkpasswdMiniSat -- Copyright (c) 2005, Niklas Sorensson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. glpk-5.0/src/minisat/minisat.c0000644000062000006210000011306713766346220015555 0ustar maomkpasswd/* minisat.c */ /* Modified by Andrew Makhorin , August 2011 */ /* May 2017: Changes were made to provide 64-bit portability; thanks to * Chris Matrakidis for patch */ /*********************************************************************** * MiniSat -- Copyright (c) 2005, Niklas Sorensson * http://www.cs.chalmers.se/Cs/Research/FormalMethods/MiniSat/ * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. ***********************************************************************/ /* Modified to compile with MS Visual Studio 6.0 by Alan Mishchenko */ #include "env.h" #include "minisat.h" #if 1 /* by mao */ static void *ymalloc(int size) { void *ptr; xassert(size > 0); ptr = malloc(size); if (ptr == NULL) xerror("MiniSat: no memory available\n"); return ptr; } static void *yrealloc(void *ptr, int size) { xassert(size > 0); if (ptr == NULL) ptr = malloc(size); else ptr = realloc(ptr, size); if (ptr == NULL) xerror("MiniSat: no memory available\n"); return ptr; } static void yfree(void *ptr) { xassert(ptr != NULL); free(ptr); return; } #define assert xassert #define printf xprintf #define fflush(f) /* nop */ #define malloc ymalloc #define realloc yrealloc #define free yfree #define inline /* empty */ #endif /*====================================================================*/ /* Debug: */ #if 0 #define VERBOSEDEBUG 1 #endif /* For derivation output (verbosity level 2) */ #define L_IND "%-*d" #define L_ind solver_dlevel(s)*3+3,solver_dlevel(s) #define L_LIT "%sx%d" #define L_lit(p) lit_sign(p)?"~":"", (lit_var(p)) #if 0 /* by mao */ /* Just like 'assert()' but expression will be evaluated in the release version as well. */ static inline void check(int expr) { assert(expr); } #endif #if 0 /* by mao */ static void printlits(lit* begin, lit* end) { int i; for (i = 0; i < end - begin; i++) printf(L_LIT" ",L_lit(begin[i])); } #endif /*====================================================================*/ /* Random numbers: */ /* Returns a random float 0 <= x < 1. Seed must never be 0. */ static inline double drand(double* seed) { int q; *seed *= 1389796; q = (int)(*seed / 2147483647); *seed -= (double)q * 2147483647; return *seed / 2147483647; } /* Returns a random integer 0 <= x < size. Seed must never be 0. */ static inline int irand(double* seed, int size) { return (int)(drand(seed) * size); } /*====================================================================*/ /* Predeclarations: */ static void sort(void** array, int size, int(*comp)(const void *, const void *)); /*====================================================================*/ /* Clause datatype + minor functions: */ #if 0 /* by mao; see minisat.h */ struct clause_t { int size_learnt; lit lits[0]; }; #endif #define clause_size(c) ((c)->size_learnt >> 1) #define clause_begin(c) ((c)->lits) #define clause_learnt(c) ((c)->size_learnt & 1) #define clause_activity(c) \ (*((float*)&(c)->lits[(c)->size_learnt>>1])) #define clause_setactivity(c, a) \ (void)(*((float*)&(c)->lits[(c)->size_learnt>>1]) = (a)) /*====================================================================*/ /* Encode literals in clause pointers: */ #if 0 /* 8/I-2017 by cmatraki (64-bit portability) */ #define clause_from_lit(l) \ (clause*)((unsigned long)(l) + (unsigned long)(l) + 1) #define clause_is_lit(c) \ ((unsigned long)(c) & 1) #define clause_read_lit(c) \ (lit)((unsigned long)(c) >> 1) #else #define clause_from_lit(l) \ (clause*)((size_t)(l) + (size_t)(l) + 1) #define clause_is_lit(c) \ ((size_t)(c) & 1) #define clause_read_lit(c) \ (lit)((size_t)(c) >> 1) #endif /*====================================================================*/ /* Simple helpers: */ #define solver_dlevel(s) \ (int)veci_size(&(s)->trail_lim) #define solver_read_wlist(s, l) \ (vecp *)(&(s)->wlists[l]) static inline void vecp_remove(vecp* v, void* e) { void** ws = vecp_begin(v); int j = 0; for (; ws[j] != e ; j++); assert(j < vecp_size(v)); for (; j < vecp_size(v)-1; j++) ws[j] = ws[j+1]; vecp_resize(v,vecp_size(v)-1); } /*====================================================================*/ /* Variable order functions: */ static inline void order_update(solver* s, int v) { /* updateorder */ int* orderpos = s->orderpos; double* activity = s->activity; int* heap = veci_begin(&s->order); int i = orderpos[v]; int x = heap[i]; int parent = (i - 1) / 2; assert(s->orderpos[v] != -1); while (i != 0 && activity[x] > activity[heap[parent]]){ heap[i] = heap[parent]; orderpos[heap[i]] = i; i = parent; parent = (i - 1) / 2; } heap[i] = x; orderpos[x] = i; } #define order_assigned(s, v) /* nop */ static inline void order_unassigned(solver* s, int v) { /* undoorder */ int* orderpos = s->orderpos; if (orderpos[v] == -1){ orderpos[v] = veci_size(&s->order); veci_push(&s->order,v); order_update(s,v); } } static int order_select(solver* s, float random_var_freq) { /* selectvar */ int* heap; double* activity; int* orderpos; lbool* values = s->assigns; /* Random decision: */ if (drand(&s->random_seed) < random_var_freq){ int next = irand(&s->random_seed,s->size); assert(next >= 0 && next < s->size); if (values[next] == l_Undef) return next; } /* Activity based decision: */ heap = veci_begin(&s->order); activity = s->activity; orderpos = s->orderpos; while (veci_size(&s->order) > 0){ int next = heap[0]; int size = veci_size(&s->order)-1; int x = heap[size]; veci_resize(&s->order,size); orderpos[next] = -1; if (size > 0){ double act = activity[x]; int i = 0; int child = 1; while (child < size){ if (child+1 < size && activity[heap[child]] < activity[heap[child+1]]) child++; assert(child < size); if (act >= activity[heap[child]]) break; heap[i] = heap[child]; orderpos[heap[i]] = i; i = child; child = 2 * child + 1; } heap[i] = x; orderpos[heap[i]] = i; } if (values[next] == l_Undef) return next; } return var_Undef; } /*====================================================================*/ /* Activity functions: */ static inline void act_var_rescale(solver* s) { double* activity = s->activity; int i; for (i = 0; i < s->size; i++) activity[i] *= 1e-100; s->var_inc *= 1e-100; } static inline void act_var_bump(solver* s, int v) { double* activity = s->activity; if ((activity[v] += s->var_inc) > 1e100) act_var_rescale(s); /* printf("bump %d %f\n", v-1, activity[v]); */ if (s->orderpos[v] != -1) order_update(s,v); } static inline void act_var_decay(solver* s) { s->var_inc *= s->var_decay; } static inline void act_clause_rescale(solver* s) { clause** cs = (clause**)vecp_begin(&s->learnts); int i; for (i = 0; i < vecp_size(&s->learnts); i++){ float a = clause_activity(cs[i]); clause_setactivity(cs[i], a * (float)1e-20); } s->cla_inc *= (float)1e-20; } static inline void act_clause_bump(solver* s, clause *c) { float a = clause_activity(c) + s->cla_inc; clause_setactivity(c,a); if (a > 1e20) act_clause_rescale(s); } static inline void act_clause_decay(solver* s) { s->cla_inc *= s->cla_decay; } /*====================================================================*/ /* Clause functions: */ /* pre: size > 1 && no variable occurs twice */ static clause* clause_new(solver* s, lit* begin, lit* end, int learnt) { int size; clause* c; int i; assert(end - begin > 1); assert(learnt >= 0 && learnt < 2); size = end - begin; c = (clause*)malloc(sizeof(clause) + sizeof(lit) * size + learnt * sizeof(float)); c->size_learnt = (size << 1) | learnt; #if 1 /* by mao & cmatraki; non-portable check that is a fundamental \ * assumption of minisat code: bit 0 is used as a flag (zero \ * for pointer, one for shifted int) so allocated memory should \ * be at least 16-bit aligned */ assert(((size_t)c & 1) == 0); #endif for (i = 0; i < size; i++) c->lits[i] = begin[i]; if (learnt) *((float*)&c->lits[size]) = 0.0; assert(begin[0] >= 0); assert(begin[0] < s->size*2); assert(begin[1] >= 0); assert(begin[1] < s->size*2); assert(lit_neg(begin[0]) < s->size*2); assert(lit_neg(begin[1]) < s->size*2); /* vecp_push(solver_read_wlist(s,lit_neg(begin[0])),(void*)c); */ /* vecp_push(solver_read_wlist(s,lit_neg(begin[1])),(void*)c); */ vecp_push(solver_read_wlist(s,lit_neg(begin[0])), (void*)(size > 2 ? c : clause_from_lit(begin[1]))); vecp_push(solver_read_wlist(s,lit_neg(begin[1])), (void*)(size > 2 ? c : clause_from_lit(begin[0]))); return c; } static void clause_remove(solver* s, clause* c) { lit* lits = clause_begin(c); assert(lit_neg(lits[0]) < s->size*2); assert(lit_neg(lits[1]) < s->size*2); /* vecp_remove(solver_read_wlist(s,lit_neg(lits[0])),(void*)c); */ /* vecp_remove(solver_read_wlist(s,lit_neg(lits[1])),(void*)c); */ assert(lits[0] < s->size*2); vecp_remove(solver_read_wlist(s,lit_neg(lits[0])), (void*)(clause_size(c) > 2 ? c : clause_from_lit(lits[1]))); vecp_remove(solver_read_wlist(s,lit_neg(lits[1])), (void*)(clause_size(c) > 2 ? c : clause_from_lit(lits[0]))); if (clause_learnt(c)){ s->stats.learnts--; s->stats.learnts_literals -= clause_size(c); }else{ s->stats.clauses--; s->stats.clauses_literals -= clause_size(c); } free(c); } static lbool clause_simplify(solver* s, clause* c) { lit* lits = clause_begin(c); lbool* values = s->assigns; int i; assert(solver_dlevel(s) == 0); for (i = 0; i < clause_size(c); i++){ lbool sig = !lit_sign(lits[i]); sig += sig - 1; if (values[lit_var(lits[i])] == sig) return l_True; } return l_False; } /*====================================================================*/ /* Minor (solver) functions: */ void solver_setnvars(solver* s,int n) { int var; if (s->cap < n){ while (s->cap < n) s->cap = s->cap*2+1; s->wlists = (vecp*) realloc(s->wlists, sizeof(vecp)*s->cap*2); s->activity = (double*) realloc(s->activity, sizeof(double)*s->cap); s->assigns = (lbool*) realloc(s->assigns, sizeof(lbool)*s->cap); s->orderpos = (int*) realloc(s->orderpos, sizeof(int)*s->cap); s->reasons = (clause**)realloc(s->reasons, sizeof(clause*)*s->cap); s->levels = (int*) realloc(s->levels, sizeof(int)*s->cap); s->tags = (lbool*) realloc(s->tags, sizeof(lbool)*s->cap); s->trail = (lit*) realloc(s->trail, sizeof(lit)*s->cap); } for (var = s->size; var < n; var++){ vecp_new(&s->wlists[2*var]); vecp_new(&s->wlists[2*var+1]); s->activity [var] = 0; s->assigns [var] = l_Undef; s->orderpos [var] = veci_size(&s->order); s->reasons [var] = (clause*)0; s->levels [var] = 0; s->tags [var] = l_Undef; /* does not hold because variables enqueued at top level will not be reinserted in the heap assert(veci_size(&s->order) == var); */ veci_push(&s->order,var); order_update(s, var); } s->size = n > s->size ? n : s->size; } static inline bool enqueue(solver* s, lit l, clause* from) { lbool* values = s->assigns; int v = lit_var(l); lbool val = values[v]; lbool sig; #ifdef VERBOSEDEBUG printf(L_IND"enqueue("L_LIT")\n", L_ind, L_lit(l)); #endif /* lbool */ sig = !lit_sign(l); sig += sig - 1; if (val != l_Undef){ return val == sig; }else{ /* New fact -- store it. */ int* levels; clause** reasons; #ifdef VERBOSEDEBUG printf(L_IND"bind("L_LIT")\n", L_ind, L_lit(l)); #endif /* int* */ levels = s->levels; /* clause** */ reasons = s->reasons; values [v] = sig; levels [v] = solver_dlevel(s); reasons[v] = from; s->trail[s->qtail++] = l; order_assigned(s, v); return true; } } static inline void assume(solver* s, lit l){ assert(s->qtail == s->qhead); assert(s->assigns[lit_var(l)] == l_Undef); #ifdef VERBOSEDEBUG printf(L_IND"assume("L_LIT")\n", L_ind, L_lit(l)); #endif veci_push(&s->trail_lim,s->qtail); enqueue(s,l,(clause*)0); } static inline void solver_canceluntil(solver* s, int level) { lit* trail; lbool* values; clause** reasons; int bound; int c; if (solver_dlevel(s) <= level) return; trail = s->trail; values = s->assigns; reasons = s->reasons; bound = (veci_begin(&s->trail_lim))[level]; for (c = s->qtail-1; c >= bound; c--) { int x = lit_var(trail[c]); values [x] = l_Undef; reasons[x] = (clause*)0; } for (c = s->qhead-1; c >= bound; c--) order_unassigned(s,lit_var(trail[c])); s->qhead = s->qtail = bound; veci_resize(&s->trail_lim,level); } static void solver_record(solver* s, veci* cls) { lit* begin = veci_begin(cls); lit* end = begin + veci_size(cls); clause* c = (veci_size(cls) > 1) ? clause_new(s,begin,end,1) : (clause*)0; enqueue(s,*begin,c); assert(veci_size(cls) > 0); if (c != 0) { vecp_push(&s->learnts,c); act_clause_bump(s,c); s->stats.learnts++; s->stats.learnts_literals += veci_size(cls); } } static double solver_progress(solver* s) { lbool* values = s->assigns; int* levels = s->levels; int i; double progress = 0; double F = 1.0 / s->size; for (i = 0; i < s->size; i++) if (values[i] != l_Undef) progress += pow(F, levels[i]); return progress / s->size; } /*====================================================================*/ /* Major methods: */ static bool solver_lit_removable(solver* s, lit l, int minl) { lbool* tags = s->tags; clause** reasons = s->reasons; int* levels = s->levels; int top = veci_size(&s->tagged); assert(lit_var(l) >= 0 && lit_var(l) < s->size); assert(reasons[lit_var(l)] != 0); veci_resize(&s->stack,0); veci_push(&s->stack,lit_var(l)); while (veci_size(&s->stack) > 0){ clause* c; int v = veci_begin(&s->stack)[veci_size(&s->stack)-1]; assert(v >= 0 && v < s->size); veci_resize(&s->stack,veci_size(&s->stack)-1); assert(reasons[v] != 0); c = reasons[v]; if (clause_is_lit(c)){ int v = lit_var(clause_read_lit(c)); if (tags[v] == l_Undef && levels[v] != 0){ if (reasons[v] != 0 && ((1 << (levels[v] & 31)) & minl)){ veci_push(&s->stack,v); tags[v] = l_True; veci_push(&s->tagged,v); }else{ int* tagged = veci_begin(&s->tagged); int j; for (j = top; j < veci_size(&s->tagged); j++) tags[tagged[j]] = l_Undef; veci_resize(&s->tagged,top); return false; } } }else{ lit* lits = clause_begin(c); int i, j; for (i = 1; i < clause_size(c); i++){ int v = lit_var(lits[i]); if (tags[v] == l_Undef && levels[v] != 0){ if (reasons[v] != 0 && ((1 << (levels[v] & 31)) & minl)){ veci_push(&s->stack,lit_var(lits[i])); tags[v] = l_True; veci_push(&s->tagged,v); }else{ int* tagged = veci_begin(&s->tagged); for (j = top; j < veci_size(&s->tagged); j++) tags[tagged[j]] = l_Undef; veci_resize(&s->tagged,top); return false; } } } } } return true; } static void solver_analyze(solver* s, clause* c, veci* learnt) { lit* trail = s->trail; lbool* tags = s->tags; clause** reasons = s->reasons; int* levels = s->levels; int cnt = 0; lit p = lit_Undef; int ind = s->qtail-1; lit* lits; int i, j, minl; int* tagged; veci_push(learnt,lit_Undef); do{ assert(c != 0); if (clause_is_lit(c)){ lit q = clause_read_lit(c); assert(lit_var(q) >= 0 && lit_var(q) < s->size); if (tags[lit_var(q)] == l_Undef && levels[lit_var(q)] > 0){ tags[lit_var(q)] = l_True; veci_push(&s->tagged,lit_var(q)); act_var_bump(s,lit_var(q)); if (levels[lit_var(q)] == solver_dlevel(s)) cnt++; else veci_push(learnt,q); } }else{ if (clause_learnt(c)) act_clause_bump(s,c); lits = clause_begin(c); /* printlits(lits,lits+clause_size(c)); printf("\n"); */ for (j = (p == lit_Undef ? 0 : 1); j < clause_size(c); j++){ lit q = lits[j]; assert(lit_var(q) >= 0 && lit_var(q) < s->size); if (tags[lit_var(q)] == l_Undef && levels[lit_var(q)] > 0){ tags[lit_var(q)] = l_True; veci_push(&s->tagged,lit_var(q)); act_var_bump(s,lit_var(q)); if (levels[lit_var(q)] == solver_dlevel(s)) cnt++; else veci_push(learnt,q); } } } while (tags[lit_var(trail[ind--])] == l_Undef); p = trail[ind+1]; c = reasons[lit_var(p)]; cnt--; }while (cnt > 0); *veci_begin(learnt) = lit_neg(p); lits = veci_begin(learnt); minl = 0; for (i = 1; i < veci_size(learnt); i++){ int lev = levels[lit_var(lits[i])]; minl |= 1 << (lev & 31); } /* simplify (full) */ for (i = j = 1; i < veci_size(learnt); i++){ if (reasons[lit_var(lits[i])] == 0 || !solver_lit_removable(s,lits[i],minl)) lits[j++] = lits[i]; } /* update size of learnt + statistics */ s->stats.max_literals += veci_size(learnt); veci_resize(learnt,j); s->stats.tot_literals += j; /* clear tags */ tagged = veci_begin(&s->tagged); for (i = 0; i < veci_size(&s->tagged); i++) tags[tagged[i]] = l_Undef; veci_resize(&s->tagged,0); #ifdef DEBUG for (i = 0; i < s->size; i++) assert(tags[i] == l_Undef); #endif #ifdef VERBOSEDEBUG printf(L_IND"Learnt {", L_ind); for (i = 0; i < veci_size(learnt); i++) printf(" "L_LIT, L_lit(lits[i])); #endif if (veci_size(learnt) > 1){ int max_i = 1; int max = levels[lit_var(lits[1])]; lit tmp; for (i = 2; i < veci_size(learnt); i++) if (levels[lit_var(lits[i])] > max){ max = levels[lit_var(lits[i])]; max_i = i; } tmp = lits[1]; lits[1] = lits[max_i]; lits[max_i] = tmp; } #ifdef VERBOSEDEBUG { int lev = veci_size(learnt) > 1 ? levels[lit_var(lits[1])] : 0; printf(" } at level %d\n", lev); } #endif } clause* solver_propagate(solver* s) { lbool* values = s->assigns; clause* confl = (clause*)0; lit* lits; /* printf("solver_propagate\n"); */ while (confl == 0 && s->qtail - s->qhead > 0){ lit p = s->trail[s->qhead++]; vecp* ws = solver_read_wlist(s,p); clause **begin = (clause**)vecp_begin(ws); clause **end = begin + vecp_size(ws); clause **i, **j; s->stats.propagations++; s->simpdb_props--; /* printf("checking lit %d: "L_LIT"\n", veci_size(ws), L_lit(p)); */ for (i = j = begin; i < end; ){ if (clause_is_lit(*i)){ *j++ = *i; if (!enqueue(s,clause_read_lit(*i),clause_from_lit(p))){ confl = s->binary; (clause_begin(confl))[1] = lit_neg(p); (clause_begin(confl))[0] = clause_read_lit(*i++); /* Copy the remaining watches: */ while (i < end) *j++ = *i++; } }else{ lit false_lit; lbool sig; lits = clause_begin(*i); /* Make sure the false literal is data[1]: */ false_lit = lit_neg(p); if (lits[0] == false_lit){ lits[0] = lits[1]; lits[1] = false_lit; } assert(lits[1] == false_lit); /* printf("checking clause: "); printlits(lits, lits+clause_size(*i)); printf("\n"); */ /* If 0th watch is true, then clause is already satisfied. */ sig = !lit_sign(lits[0]); sig += sig - 1; if (values[lit_var(lits[0])] == sig){ *j++ = *i; }else{ /* Look for new watch: */ lit* stop = lits + clause_size(*i); lit* k; for (k = lits + 2; k < stop; k++){ lbool sig = lit_sign(*k); sig += sig - 1; if (values[lit_var(*k)] != sig){ lits[1] = *k; *k = false_lit; vecp_push(solver_read_wlist(s, lit_neg(lits[1])),*i); goto next; } } *j++ = *i; /* Clause is unit under assignment: */ if (!enqueue(s,lits[0], *i)){ confl = *i++; /* Copy the remaining watches: */ while (i < end) *j++ = *i++; } } } next: i++; } s->stats.inspects += j - (clause**)vecp_begin(ws); vecp_resize(ws,j - (clause**)vecp_begin(ws)); } return confl; } static inline int clause_cmp (const void* x, const void* y) { return clause_size((clause*)x) > 2 && (clause_size((clause*)y) == 2 || clause_activity((clause*)x) < clause_activity((clause*)y)) ? -1 : 1; } void solver_reducedb(solver* s) { int i, j; double extra_lim = s->cla_inc / vecp_size(&s->learnts); /* Remove any clause below this activity */ clause** learnts = (clause**)vecp_begin(&s->learnts); clause** reasons = s->reasons; sort(vecp_begin(&s->learnts), vecp_size(&s->learnts), clause_cmp); for (i = j = 0; i < vecp_size(&s->learnts) / 2; i++){ if (clause_size(learnts[i]) > 2 && reasons[lit_var(*clause_begin(learnts[i]))] != learnts[i]) clause_remove(s,learnts[i]); else learnts[j++] = learnts[i]; } for (; i < vecp_size(&s->learnts); i++){ if (clause_size(learnts[i]) > 2 && reasons[lit_var(*clause_begin(learnts[i]))] != learnts[i] && clause_activity(learnts[i]) < extra_lim) clause_remove(s,learnts[i]); else learnts[j++] = learnts[i]; } /* printf("reducedb deleted %d\n", vecp_size(&s->learnts) - j); */ vecp_resize(&s->learnts,j); } static lbool solver_search(solver* s, int nof_conflicts, int nof_learnts) { int* levels = s->levels; double var_decay = 0.95; double clause_decay = 0.999; double random_var_freq = 0.02; int conflictC = 0; veci learnt_clause; assert(s->root_level == solver_dlevel(s)); s->stats.starts++; s->var_decay = (float)(1 / var_decay ); s->cla_decay = (float)(1 / clause_decay); veci_resize(&s->model,0); veci_new(&learnt_clause); for (;;){ clause* confl = solver_propagate(s); if (confl != 0){ /* CONFLICT */ int blevel; #ifdef VERBOSEDEBUG printf(L_IND"**CONFLICT**\n", L_ind); #endif s->stats.conflicts++; conflictC++; if (solver_dlevel(s) == s->root_level){ veci_delete(&learnt_clause); return l_False; } veci_resize(&learnt_clause,0); solver_analyze(s, confl, &learnt_clause); blevel = veci_size(&learnt_clause) > 1 ? levels[lit_var(veci_begin(&learnt_clause)[1])] : s->root_level; blevel = s->root_level > blevel ? s->root_level : blevel; solver_canceluntil(s,blevel); solver_record(s,&learnt_clause); act_var_decay(s); act_clause_decay(s); }else{ /* NO CONFLICT */ int next; if (nof_conflicts >= 0 && conflictC >= nof_conflicts){ /* Reached bound on number of conflicts: */ s->progress_estimate = solver_progress(s); solver_canceluntil(s,s->root_level); veci_delete(&learnt_clause); return l_Undef; } if (solver_dlevel(s) == 0) /* Simplify the set of problem clauses: */ solver_simplify(s); if (nof_learnts >= 0 && vecp_size(&s->learnts) - s->qtail >= nof_learnts) /* Reduce the set of learnt clauses: */ solver_reducedb(s); /* New variable decision: */ s->stats.decisions++; next = order_select(s,(float)random_var_freq); if (next == var_Undef){ /* Model found: */ lbool* values = s->assigns; int i; for (i = 0; i < s->size; i++) veci_push(&s->model,(int)values[i]); solver_canceluntil(s,s->root_level); veci_delete(&learnt_clause); /* veci apa; veci_new(&apa); for (i = 0; i < s->size; i++) veci_push(&apa,(int)(s->model.ptr[i] == l_True ? toLit(i) : lit_neg(toLit(i)))); printf("model: "); printlits((lit*)apa.ptr, (lit*)apa.ptr + veci_size(&apa)); printf("\n"); veci_delete(&apa); */ return l_True; } assume(s,lit_neg(toLit(next))); } } #if 0 /* by mao; unreachable code */ return l_Undef; /* cannot happen */ #endif } /*====================================================================*/ /* External solver functions: */ solver* solver_new(void) { solver* s = (solver*)malloc(sizeof(solver)); /* initialize vectors */ vecp_new(&s->clauses); vecp_new(&s->learnts); veci_new(&s->order); veci_new(&s->trail_lim); veci_new(&s->tagged); veci_new(&s->stack); veci_new(&s->model); /* initialize arrays */ s->wlists = 0; s->activity = 0; s->assigns = 0; s->orderpos = 0; s->reasons = 0; s->levels = 0; s->tags = 0; s->trail = 0; /* initialize other vars */ s->size = 0; s->cap = 0; s->qhead = 0; s->qtail = 0; s->cla_inc = 1; s->cla_decay = 1; s->var_inc = 1; s->var_decay = 1; s->root_level = 0; s->simpdb_assigns = 0; s->simpdb_props = 0; s->random_seed = 91648253; s->progress_estimate = 0; s->binary = (clause*)malloc(sizeof(clause) + sizeof(lit)*2); s->binary->size_learnt = (2 << 1); s->verbosity = 0; s->stats.starts = 0; s->stats.decisions = 0; s->stats.propagations = 0; s->stats.inspects = 0; s->stats.conflicts = 0; s->stats.clauses = 0; s->stats.clauses_literals = 0; s->stats.learnts = 0; s->stats.learnts_literals = 0; s->stats.max_literals = 0; s->stats.tot_literals = 0; return s; } void solver_delete(solver* s) { int i; for (i = 0; i < vecp_size(&s->clauses); i++) free(vecp_begin(&s->clauses)[i]); for (i = 0; i < vecp_size(&s->learnts); i++) free(vecp_begin(&s->learnts)[i]); /* delete vectors */ vecp_delete(&s->clauses); vecp_delete(&s->learnts); veci_delete(&s->order); veci_delete(&s->trail_lim); veci_delete(&s->tagged); veci_delete(&s->stack); veci_delete(&s->model); free(s->binary); /* delete arrays */ if (s->wlists != 0){ int i; for (i = 0; i < s->size*2; i++) vecp_delete(&s->wlists[i]); /* if one is different from null, all are */ free(s->wlists); free(s->activity ); free(s->assigns ); free(s->orderpos ); free(s->reasons ); free(s->levels ); free(s->trail ); free(s->tags ); } free(s); } bool solver_addclause(solver* s, lit* begin, lit* end) { lit *i,*j; int maxvar; lbool* values; lit last; if (begin == end) return false; /* printlits(begin,end); printf("\n"); */ /* insertion sort */ maxvar = lit_var(*begin); for (i = begin + 1; i < end; i++){ lit l = *i; maxvar = lit_var(l) > maxvar ? lit_var(l) : maxvar; for (j = i; j > begin && *(j-1) > l; j--) *j = *(j-1); *j = l; } solver_setnvars(s,maxvar+1); /* printlits(begin,end); printf("\n"); */ values = s->assigns; /* delete duplicates */ last = lit_Undef; for (i = j = begin; i < end; i++){ /* printf("lit: "L_LIT", value = %d\n", L_lit(*i), (lit_sign(*i) ? -values[lit_var(*i)] : values[lit_var(*i)])); */ lbool sig = !lit_sign(*i); sig += sig - 1; if (*i == lit_neg(last) || sig == values[lit_var(*i)]) return true; /* tautology */ else if (*i != last && values[lit_var(*i)] == l_Undef) last = *j++ = *i; } /* printf("final: "); printlits(begin,j); printf("\n"); */ if (j == begin) /* empty clause */ return false; else if (j - begin == 1) /* unit clause */ return enqueue(s,*begin,(clause*)0); /* create new clause */ vecp_push(&s->clauses,clause_new(s,begin,j,0)); s->stats.clauses++; s->stats.clauses_literals += j - begin; return true; } bool solver_simplify(solver* s) { clause** reasons; int type; assert(solver_dlevel(s) == 0); if (solver_propagate(s) != 0) return false; if (s->qhead == s->simpdb_assigns || s->simpdb_props > 0) return true; reasons = s->reasons; for (type = 0; type < 2; type++){ vecp* cs = type ? &s->learnts : &s->clauses; clause** cls = (clause**)vecp_begin(cs); int i, j; for (j = i = 0; i < vecp_size(cs); i++){ if (reasons[lit_var(*clause_begin(cls[i]))] != cls[i] && clause_simplify(s,cls[i]) == l_True) clause_remove(s,cls[i]); else cls[j++] = cls[i]; } vecp_resize(cs,j); } s->simpdb_assigns = s->qhead; /* (shouldn't depend on 'stats' really, but it will do for now) */ s->simpdb_props = (int)(s->stats.clauses_literals + s->stats.learnts_literals); return true; } bool solver_solve(solver* s, lit* begin, lit* end) { double nof_conflicts = 100; double nof_learnts = solver_nclauses(s) / 3; lbool status = l_Undef; lbool* values = s->assigns; lit* i; /* printf("solve: "); printlits(begin, end); printf("\n"); */ for (i = begin; i < end; i++){ switch (lit_sign(*i) ? -values[lit_var(*i)] : values[lit_var(*i)]){ case 1: /* l_True: */ break; case 0: /* l_Undef */ assume(s, *i); if (solver_propagate(s) == NULL) break; /* falltrough */ case -1: /* l_False */ solver_canceluntil(s, 0); return false; } } s->root_level = solver_dlevel(s); if (s->verbosity >= 1){ printf("==================================[MINISAT]============" "=======================\n"); printf("| Conflicts | ORIGINAL | LEARNT " " | Progress |\n"); printf("| | Clauses Literals | Limit Clauses Litera" "ls Lit/Cl | |\n"); printf("=======================================================" "=======================\n"); } while (status == l_Undef){ double Ratio = (s->stats.learnts == 0)? 0.0 : s->stats.learnts_literals / (double)s->stats.learnts; if (s->verbosity >= 1){ printf("| %9.0f | %7.0f %8.0f | %7.0f %7.0f %8.0f %7.1f | %" "6.3f %% |\n", (double)s->stats.conflicts, (double)s->stats.clauses, (double)s->stats.clauses_literals, (double)nof_learnts, (double)s->stats.learnts, (double)s->stats.learnts_literals, Ratio, s->progress_estimate*100); fflush(stdout); } status = solver_search(s,(int)nof_conflicts, (int)nof_learnts); nof_conflicts *= 1.5; nof_learnts *= 1.1; } if (s->verbosity >= 1) printf("=======================================================" "=======================\n"); solver_canceluntil(s,0); return status != l_False; } int solver_nvars(solver* s) { return s->size; } int solver_nclauses(solver* s) { return vecp_size(&s->clauses); } int solver_nconflicts(solver* s) { return (int)s->stats.conflicts; } /*====================================================================*/ /* Sorting functions (sigh): */ static inline void selectionsort(void** array, int size, int(*comp)(const void *, const void *)) { int i, j, best_i; void* tmp; for (i = 0; i < size-1; i++){ best_i = i; for (j = i+1; j < size; j++){ if (comp(array[j], array[best_i]) < 0) best_i = j; } tmp = array[i]; array[i] = array[best_i]; array[best_i] = tmp; } } static void sortrnd(void** array, int size, int(*comp)(const void *, const void *), double* seed) { if (size <= 15) selectionsort(array, size, comp); else{ void* pivot = array[irand(seed, size)]; void* tmp; int i = -1; int j = size; for(;;){ do i++; while(comp(array[i], pivot)<0); do j--; while(comp(pivot, array[j])<0); if (i >= j) break; tmp = array[i]; array[i] = array[j]; array[j] = tmp; } sortrnd(array , i , comp, seed); sortrnd(&array[i], size-i, comp, seed); } } static void sort(void** array, int size, int(*comp)(const void *, const void *)) { double seed = 91648253; sortrnd(array,size,comp,&seed); } /* eof */ glpk-5.0/src/minisat/minisat.h0000644000062000006210000001617613766346220015565 0ustar maomkpasswd/* minisat.h */ /* Modified by Andrew Makhorin , August 2011 */ /*********************************************************************** * MiniSat -- Copyright (c) 2005, Niklas Sorensson * http://www.cs.chalmers.se/Cs/Research/FormalMethods/MiniSat/ * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. ***********************************************************************/ /* Modified to compile with MS Visual Studio 6.0 by Alan Mishchenko */ #ifndef MINISAT_H #define MINISAT_H /*====================================================================*/ /* Simple types: */ typedef int bool; #define true 1 #define false 0 typedef int lit; #if 0 /* by mao */ typedef char lbool; #else typedef int lbool; #endif #define var_Undef (int)(-1) #define lit_Undef (lit)(-2) #define l_Undef (lbool)0 #define l_True (lbool)1 #define l_False (lbool)(-1) #define toLit(v) (lit)((v) + (v)) #define lit_neg(l) (lit)((l) ^ 1) #define lit_var(l) (int)((l) >> 1) #define lit_sign(l) (int)((l) & 1) /*====================================================================*/ /* Vectors: */ /* vector of 32-bit intergers (added for 64-bit portability) */ typedef struct /* veci_t */ { int size; int cap; int* ptr; } veci; #define veci_new(v) \ { (v)->size = 0; \ (v)->cap = 4; \ (v)->ptr = (int*)malloc(sizeof(int)*(v)->cap); \ } #define veci_delete(v) free((v)->ptr) #define veci_begin(v) ((v)->ptr) #define veci_size(v) ((v)->size) #define veci_resize(v, k) (void)((v)->size = (k)) /* only safe to shrink !! */ #define veci_push(v, e) \ { if ((v)->size == (v)->cap) \ { int newsize = (v)->cap * 2+1; \ (v)->ptr = (int*)realloc((v)->ptr,sizeof(int)*newsize); \ (v)->cap = newsize; \ } \ (v)->ptr[(v)->size++] = (e); \ } /* vector of 32- or 64-bit pointers */ typedef struct /* vecp_t */ { int size; int cap; void** ptr; } vecp; #define vecp_new(v) \ { (v)->size = 0; \ (v)->cap = 4; \ (v)->ptr = (void**)malloc(sizeof(void*)*(v)->cap); \ } #define vecp_delete(v) free((v)->ptr) #define vecp_begin(v) ((v)->ptr) #define vecp_size(v) ((v)->size) #define vecp_resize(v, k) (void)((v)->size = (k)) /* only safe to shrink !! */ #define vecp_push(v, e) \ { if ((v)->size == (v)->cap) \ { int newsize = (v)->cap * 2+1; \ (v)->ptr = (void**)realloc((v)->ptr,sizeof(void*)*newsize); \ (v)->cap = newsize; \ } \ (v)->ptr[(v)->size++] = (e); \ } /*====================================================================*/ /* Solver representation: */ typedef struct /* clause_t */ { int size_learnt; lit lits[1]; } clause; typedef struct /* stats_t */ { double starts, decisions, propagations, inspects, conflicts; double clauses, clauses_literals, learnts, learnts_literals, max_literals, tot_literals; } stats; typedef struct /* solver_t */ { int size; /* nof variables */ int cap; /* size of varmaps */ int qhead; /* Head index of queue. */ int qtail; /* Tail index of queue. */ /* clauses */ vecp clauses; /* List of problem constraints. (contains: clause*) */ vecp learnts; /* List of learnt clauses. (contains: clause*) */ /* activities */ double var_inc; /* Amount to bump next variable with. */ double var_decay; /* INVERSE decay factor for variable activity: stores 1/decay. */ float cla_inc; /* Amount to bump next clause with. */ float cla_decay; /* INVERSE decay factor for clause activity: stores 1/decay. */ vecp* wlists; double* activity; /* A heuristic measurement of the activity of a variable. */ lbool* assigns; /* Current values of variables. */ int* orderpos; /* Index in variable order. */ clause** reasons; int* levels; lit* trail; clause* binary; /* A temporary binary clause */ lbool* tags; veci tagged; /* (contains: var) */ veci stack; /* (contains: var) */ veci order; /* Variable order. (heap) (contains: var) */ veci trail_lim; /* Separator indices for different decision levels in 'trail'. (contains: int) */ veci model; /* If problem is solved, this vector contains the model (contains: lbool). */ int root_level; /* Level of first proper decision. */ int simpdb_assigns;/* Number of top-level assignments at last 'simplifyDB()'. */ int simpdb_props; /* Number of propagations before next 'simplifyDB()'. */ double random_seed; double progress_estimate; int verbosity; /* Verbosity level. 0=silent, 1=some progress report, 2=everything */ stats stats; } solver; /*====================================================================*/ /* Public interface: */ #if 1 /* by mao; to keep namespace clean */ #define solver_new _glp_minisat_new #define solver_delete _glp_minisat_delete #define solver_addclause _glp_minisat_addclause #define solver_simplify _glp_minisat_simplify #define solver_solve _glp_minisat_solve #define solver_nvars _glp_minisat_nvars #define solver_nclauses _glp_minisat_nclauses #define solver_nconflicts _glp_minisat_nconflicts #define solver_setnvars _glp_minisat_setnvars #define solver_propagate _glp_minisat_propagate #define solver_reducedb _glp_minisat_reducedb #endif solver* solver_new(void); void solver_delete(solver* s); bool solver_addclause(solver* s, lit* begin, lit* end); bool solver_simplify(solver* s); bool solver_solve(solver* s, lit* begin, lit* end); int solver_nvars(solver* s); int solver_nclauses(solver* s); int solver_nconflicts(solver* s); void solver_setnvars(solver* s,int n); #endif /* eof */ glpk-5.0/src/minisat/README0000644000062000006210000000160713766346220014621 0ustar maomkpasswdNOTE: Files in this subdirectory are NOT part of the GLPK package, but are used with GLPK. The original code was modified according to GLPK requirements by Andrew Makhorin . ************************************************************************ MiniSat-C v1.14.1 ======================================== * Fixed some serious bugs. * Tweaked to be Visual Studio friendly (by Alan Mishchenko). This disabled reading of gzipped DIMACS files and signal handling, but none of these features are essential (and easy to re-enable, if wanted). MiniSat-C v1.14 ======================================== Ok, we get it. You hate C++. You hate templates. We agree; C++ is a seriously messed up language. Although we are more pragmatic about the quirks and maldesigns in C++, we sympathize with you. So here is a pure C version of MiniSat, put together by Niklas Sorensson. glpk-5.0/src/misc/0000755000062000006210000000000013766346220013224 5ustar maomkpasswdglpk-5.0/src/misc/avl.c0000644000062000006210000003135713766346220014163 0ustar maomkpasswd/* avl.c (binary search tree) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2000-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "avl.h" #include "dmp.h" #include "env.h" struct AVL { /* AVL tree (Adelson-Velsky & Landis binary search tree) */ DMP *pool; /* memory pool for allocating nodes */ AVLNODE *root; /* pointer to the root node */ int (*fcmp)(void *info, const void *key1, const void *key2); /* application-defined key comparison routine */ void *info; /* transit pointer passed to the routine fcmp */ int size; /* the tree size (the total number of nodes) */ int height; /* the tree height */ }; struct AVLNODE { /* node of AVL tree */ const void *key; /* pointer to the node key (data structure for representing keys is supplied by the application) */ int rank; /* node rank = relative position of the node in its own subtree = the number of nodes in the left subtree plus one */ int type; /* reserved for the application specific information */ void *link; /* reserved for the application specific information */ AVLNODE *up; /* pointer to the parent node */ short int flag; /* node flag: 0 - this node is the left child of its parent (or this node is the root of the tree and has no parent) 1 - this node is the right child of its parent */ short int bal; /* node balance = the difference between heights of the right and left subtrees: -1 - the left subtree is higher than the right one; 0 - the left and right subtrees have the same height; +1 - the left subtree is lower than the right one */ AVLNODE *left; /* pointer to the root of the left subtree */ AVLNODE *right; /* pointer to the root of the right subtree */ }; AVL *avl_create_tree(int (*fcmp)(void *info, const void *key1, const void *key2), void *info) { /* create AVL tree */ AVL *tree; tree = xmalloc(sizeof(AVL)); tree->pool = dmp_create_pool(); tree->root = NULL; tree->fcmp = fcmp; tree->info = info; tree->size = 0; tree->height = 0; return tree; } int avl_strcmp(void *info, const void *key1, const void *key2) { /* compare character string keys */ xassert(info == info); return strcmp(key1, key2); } static AVLNODE *rotate_subtree(AVL *tree, AVLNODE *node); AVLNODE *avl_insert_node(AVL *tree, const void *key) { /* insert new node into AVL tree */ AVLNODE *p, *q, *r; short int flag; /* find an appropriate point for insertion */ p = NULL; q = tree->root; while (q != NULL) { p = q; if (tree->fcmp(tree->info, key, p->key) <= 0) { flag = 0; q = p->left; p->rank++; } else { flag = 1; q = p->right; } } /* create new node and insert it into the tree */ r = dmp_get_atom(tree->pool, sizeof(AVLNODE)); r->key = key; r->type = 0; r->link = NULL; r->rank = 1; r->up = p; r->flag = (short int)(p == NULL ? 0 : flag); r->bal = 0; r->left = NULL; r->right = NULL; tree->size++; if (p == NULL) tree->root = r; else if (flag == 0) p->left = r; else p->right = r; /* go upstairs to the root and correct all subtrees affected by insertion */ while (p != NULL) { if (flag == 0) { /* the height of the left subtree of [p] is increased */ if (p->bal > 0) { p->bal = 0; break; } if (p->bal < 0) { rotate_subtree(tree, p); break; } p->bal = -1; flag = p->flag; p = p->up; } else { /* the height of the right subtree of [p] is increased */ if (p->bal < 0) { p->bal = 0; break; } if (p->bal > 0) { rotate_subtree(tree, p); break; } p->bal = +1; flag = p->flag; p = p->up; } } /* if the root has been reached, the height of the entire tree is increased */ if (p == NULL) tree->height++; return r; } void avl_set_node_type(AVLNODE *node, int type) { /* assign the type field of specified node */ node->type = type; return; } void avl_set_node_link(AVLNODE *node, void *link) { /* assign the link field of specified node */ node->link = link; return; } AVLNODE *avl_find_node(AVL *tree, const void *key) { /* find node in AVL tree */ AVLNODE *p; int c; p = tree->root; while (p != NULL) { c = tree->fcmp(tree->info, key, p->key); if (c == 0) break; p = (c < 0 ? p->left : p->right); } return p; } int avl_get_node_type(AVLNODE *node) { /* retrieve the type field of specified node */ return node->type; } void *avl_get_node_link(AVLNODE *node) { /* retrieve the link field of specified node */ return node->link; } static AVLNODE *find_next_node(AVL *tree, AVLNODE *node) { /* find next node in AVL tree */ AVLNODE *p, *q; if (tree->root == NULL) return NULL; p = node; q = (p == NULL ? tree->root : p->right); if (q == NULL) { /* go upstairs from the left subtree */ for (;;) { q = p->up; if (q == NULL) break; if (p->flag == 0) break; p = q; } } else { /* go downstairs into the right subtree */ for (;;) { p = q->left; if (p == NULL) break; q = p; } } return q; } void avl_delete_node(AVL *tree, AVLNODE *node) { /* delete specified node from AVL tree */ AVLNODE *f, *p, *q, *r, *s, *x, *y; short int flag; p = node; /* if both subtrees of the specified node are non-empty, the node should be interchanged with the next one, at least one subtree of which is always empty */ if (p->left == NULL || p->right == NULL) goto skip; f = p->up; q = p->left; r = find_next_node(tree, p); s = r->right; if (p->right == r) { if (f == NULL) tree->root = r; else if (p->flag == 0) f->left = r; else f->right = r; r->rank = p->rank; r->up = f; r->flag = p->flag; r->bal = p->bal; r->left = q; r->right = p; q->up = r; p->rank = 1; p->up = r; p->flag = 1; p->bal = (short int)(s == NULL ? 0 : +1); p->left = NULL; p->right = s; if (s != NULL) s->up = p; } else { x = p->right; y = r->up; if (f == NULL) tree->root = r; else if (p->flag == 0) f->left = r; else f->right = r; r->rank = p->rank; r->up = f; r->flag = p->flag; r->bal = p->bal; r->left = q; r->right = x; q->up = r; x->up = r; y->left = p; p->rank = 1; p->up = y; p->flag = 0; p->bal = (short int)(s == NULL ? 0 : +1); p->left = NULL; p->right = s; if (s != NULL) s->up = p; } skip: /* now the specified node [p] has at least one empty subtree; go upstairs to the root and adjust the rank field of all nodes affected by deletion */ q = p; f = q->up; while (f != NULL) { if (q->flag == 0) f->rank--; q = f; f = q->up; } /* delete the specified node from the tree */ f = p->up; flag = p->flag; q = p->left != NULL ? p->left : p->right; if (f == NULL) tree->root = q; else if (flag == 0) f->left = q; else f->right = q; if (q != NULL) q->up = f, q->flag = flag; tree->size--; /* go upstairs to the root and correct all subtrees affected by deletion */ while (f != NULL) { if (flag == 0) { /* the height of the left subtree of [f] is decreased */ if (f->bal == 0) { f->bal = +1; break; } if (f->bal < 0) f->bal = 0; else { f = rotate_subtree(tree, f); if (f->bal < 0) break; } flag = f->flag; f = f->up; } else { /* the height of the right subtree of [f] is decreased */ if (f->bal == 0) { f->bal = -1; break; } if (f->bal > 0) f->bal = 0; else { f = rotate_subtree(tree, f); if (f->bal > 0) break; } flag = f->flag; f = f->up; } } /* if the root has been reached, the height of the entire tree is decreased */ if (f == NULL) tree->height--; /* returns the deleted node to the memory pool */ dmp_free_atom(tree->pool, p, sizeof(AVLNODE)); return; } static AVLNODE *rotate_subtree(AVL *tree, AVLNODE *node) { /* restore balance of AVL subtree */ AVLNODE *f, *p, *q, *r, *x, *y; xassert(node != NULL); p = node; if (p->bal < 0) { /* perform negative (left) rotation */ f = p->up; q = p->left; r = q->right; if (q->bal <= 0) { /* perform single negative rotation */ if (f == NULL) tree->root = q; else if (p->flag == 0) f->left = q; else f->right = q; p->rank -= q->rank; q->up = f; q->flag = p->flag; q->bal++; q->right = p; p->up = q; p->flag = 1; p->bal = (short int)(-q->bal); p->left = r; if (r != NULL) r->up = p, r->flag = 0; node = q; } else { /* perform double negative rotation */ x = r->left; y = r->right; if (f == NULL) tree->root = r; else if (p->flag == 0) f->left = r; else f->right = r; p->rank -= (q->rank + r->rank); r->rank += q->rank; p->bal = (short int)(r->bal >= 0 ? 0 : +1); q->bal = (short int)(r->bal <= 0 ? 0 : -1); r->up = f; r->flag = p->flag; r->bal = 0; r->left = q; r->right = p; p->up = r; p->flag = 1; p->left = y; q->up = r; q->flag = 0; q->right = x; if (x != NULL) x->up = q, x->flag = 1; if (y != NULL) y->up = p, y->flag = 0; node = r; } } else { /* perform positive (right) rotation */ f = p->up; q = p->right; r = q->left; if (q->bal >= 0) { /* perform single positive rotation */ if (f == NULL) tree->root = q; else if (p->flag == 0) f->left = q; else f->right = q; q->rank += p->rank; q->up = f; q->flag = p->flag; q->bal--; q->left = p; p->up = q; p->flag = 0; p->bal = (short int)(-q->bal); p->right = r; if (r != NULL) r->up = p, r->flag = 1; node = q; } else { /* perform double positive rotation */ x = r->left; y = r->right; if (f == NULL) tree->root = r; else if (p->flag == 0) f->left = r; else f->right = r; q->rank -= r->rank; r->rank += p->rank; p->bal = (short int)(r->bal <= 0 ? 0 : -1); q->bal = (short int)(r->bal >= 0 ? 0 : +1); r->up = f; r->flag = p->flag; r->bal = 0; r->left = p; r->right = q; p->up = r; p->flag = 0; p->right = x; q->up = r; q->flag = 1; q->left = y; if (x != NULL) x->up = p, x->flag = 1; if (y != NULL) y->up = q, y->flag = 0; node = r; } } return node; } void avl_delete_tree(AVL *tree) { /* delete AVL tree */ dmp_delete_pool(tree->pool); xfree(tree); return; } /* eof */ glpk-5.0/src/misc/avl.h0000644000062000006210000000460113766346220014160 0ustar maomkpasswd/* avl.h (binary search tree) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2000-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef AVL_H #define AVL_H typedef struct AVL AVL; typedef struct AVLNODE AVLNODE; #define avl_create_tree _glp_avl_create_tree AVL *avl_create_tree(int (*fcmp)(void *info, const void *key1, const void *key2), void *info); /* create AVL tree */ #define avl_strcmp _glp_avl_strcmp int avl_strcmp(void *info, const void *key1, const void *key2); /* compare character string keys */ #define avl_insert_node _glp_avl_insert_node AVLNODE *avl_insert_node(AVL *tree, const void *key); /* insert new node into AVL tree */ #define avl_set_node_type _glp_avl_set_node_type void avl_set_node_type(AVLNODE *node, int type); /* assign the type field of specified node */ #define avl_set_node_link _glp_avl_set_node_link void avl_set_node_link(AVLNODE *node, void *link); /* assign the link field of specified node */ #define avl_find_node _glp_avl_find_node AVLNODE *avl_find_node(AVL *tree, const void *key); /* find node in AVL tree */ #define avl_get_node_type _glp_avl_get_node_type int avl_get_node_type(AVLNODE *node); /* retrieve the type field of specified node */ #define avl_get_node_link _glp_avl_get_node_link void *avl_get_node_link(AVLNODE *node); /* retrieve the link field of specified node */ #define avl_delete_node _glp_avl_delete_node void avl_delete_node(AVL *tree, AVLNODE *node); /* delete specified node from AVL tree */ #define avl_delete_tree _glp_avl_delete_tree void avl_delete_tree(AVL *tree); /* delete AVL tree */ #endif /* eof */ glpk-5.0/src/misc/bignum.c0000644000062000006210000002235213766346220014655 0ustar maomkpasswd/* bignum.c (bignum arithmetic) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2006-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "bignum.h" /*********************************************************************** * Two routines below are intended to multiply and divide unsigned * integer numbers of arbitrary precision. * * The routines assume that an unsigned integer number is represented in * the positional numeral system with the base 2^16 = 65536, i.e. each * "digit" of the number is in the range [0, 65535] and represented as * a 16-bit value of the unsigned short type. In other words, a number x * has the following representation: * * n-1 * x = sum d[j] * 65536^j, * j=0 * * where n is the number of places (positions), and d[j] is j-th "digit" * of x, 0 <= d[j] <= 65535. ***********************************************************************/ /*********************************************************************** * NAME * * bigmul - multiply unsigned integer numbers of arbitrary precision * * SYNOPSIS * * #include "bignum.h" * void bigmul(int n, int m, unsigned short x[], unsigned short y[]); * * DESCRIPTION * * The routine bigmul multiplies unsigned integer numbers of arbitrary * precision. * * n is the number of digits of multiplicand, n >= 1; * * m is the number of digits of multiplier, m >= 1; * * x is an array containing digits of the multiplicand in elements * x[m], x[m+1], ..., x[n+m-1]. Contents of x[0], x[1], ..., x[m-1] are * ignored on entry. * * y is an array containing digits of the multiplier in elements y[0], * y[1], ..., y[m-1]. * * On exit digits of the product are stored in elements x[0], x[1], ..., * x[n+m-1]. The array y is not changed. */ void bigmul(int n, int m, unsigned short x[], unsigned short y[]) { int i, j; unsigned int t; xassert(n >= 1); xassert(m >= 1); for (j = 0; j < m; j++) x[j] = 0; for (i = 0; i < n; i++) { if (x[i+m]) { t = 0; for (j = 0; j < m; j++) { t += (unsigned int)x[i+m] * (unsigned int)y[j] + (unsigned int)x[i+j]; x[i+j] = (unsigned short)t; t >>= 16; } x[i+m] = (unsigned short)t; } } return; } /*********************************************************************** * NAME * * bigdiv - divide unsigned integer numbers of arbitrary precision * * SYNOPSIS * * #include "bignum.h" * void bigdiv(int n, int m, unsigned short x[], unsigned short y[]); * * DESCRIPTION * * The routine bigdiv divides one unsigned integer number of arbitrary * precision by another with the algorithm described in [1]. * * n is the difference between the number of digits of dividend and the * number of digits of divisor, n >= 0. * * m is the number of digits of divisor, m >= 1. * * x is an array containing digits of the dividend in elements x[0], * x[1], ..., x[n+m-1]. * * y is an array containing digits of the divisor in elements y[0], * y[1], ..., y[m-1]. The highest digit y[m-1] must be non-zero. * * On exit n+1 digits of the quotient are stored in elements x[m], * x[m+1], ..., x[n+m], and m digits of the remainder are stored in * elements x[0], x[1], ..., x[m-1]. The array y is changed but then * restored. * * REFERENCES * * 1. D. Knuth. The Art of Computer Programming. Vol. 2: Seminumerical * Algorithms. Stanford University, 1969. */ void bigdiv(int n, int m, unsigned short x[], unsigned short y[]) { int i, j; unsigned int t; unsigned short d, q, r; xassert(n >= 0); xassert(m >= 1); xassert(y[m-1] != 0); /* special case when divisor has the only digit */ if (m == 1) { d = 0; for (i = n; i >= 0; i--) { t = ((unsigned int)d << 16) + (unsigned int)x[i]; x[i+1] = (unsigned short)(t / y[0]); d = (unsigned short)(t % y[0]); } x[0] = d; goto done; } /* multiply dividend and divisor by a normalizing coefficient in * order to provide the condition y[m-1] >= base / 2 */ d = (unsigned short)(0x10000 / ((unsigned int)y[m-1] + 1)); if (d == 1) x[n+m] = 0; else { t = 0; for (i = 0; i < n+m; i++) { t += (unsigned int)x[i] * (unsigned int)d; x[i] = (unsigned short)t; t >>= 16; } x[n+m] = (unsigned short)t; t = 0; for (j = 0; j < m; j++) { t += (unsigned int)y[j] * (unsigned int)d; y[j] = (unsigned short)t; t >>= 16; } } /* main loop */ for (i = n; i >= 0; i--) { /* estimate and correct the current digit of quotient */ if (x[i+m] < y[m-1]) { t = ((unsigned int)x[i+m] << 16) + (unsigned int)x[i+m-1]; q = (unsigned short)(t / (unsigned int)y[m-1]); r = (unsigned short)(t % (unsigned int)y[m-1]); if (q == 0) goto putq; else goto test; } q = 0; r = x[i+m-1]; decr: q--; /* if q = 0 then q-- = 0xFFFF */ t = (unsigned int)r + (unsigned int)y[m-1]; r = (unsigned short)t; if (t > 0xFFFF) goto msub; test: t = (unsigned int)y[m-2] * (unsigned int)q; if ((unsigned short)(t >> 16) > r) goto decr; if ((unsigned short)(t >> 16) < r) goto msub; if ((unsigned short)t > x[i+m-2]) goto decr; msub: /* now subtract divisor multiplied by the current digit of * quotient from the current dividend */ if (q == 0) goto putq; t = 0; for (j = 0; j < m; j++) { t += (unsigned int)y[j] * (unsigned int)q; if (x[i+j] < (unsigned short)t) t += 0x10000; x[i+j] -= (unsigned short)t; t >>= 16; } if (x[i+m] >= (unsigned short)t) goto putq; /* perform correcting addition, because the current digit of * quotient is greater by one than its correct value */ q--; t = 0; for (j = 0; j < m; j++) { t += (unsigned int)x[i+j] + (unsigned int)y[j]; x[i+j] = (unsigned short)t; t >>= 16; } putq: /* store the current digit of quotient */ x[i+m] = q; } /* divide divisor and remainder by the normalizing coefficient in * order to restore their original values */ if (d > 1) { t = 0; for (i = m-1; i >= 0; i--) { t = (t << 16) + (unsigned int)x[i]; x[i] = (unsigned short)(t / (unsigned int)d); t %= (unsigned int)d; } t = 0; for (j = m-1; j >= 0; j--) { t = (t << 16) + (unsigned int)y[j]; y[j] = (unsigned short)(t / (unsigned int)d); t %= (unsigned int)d; } } done: return; } /**********************************************************************/ #ifdef GLP_TEST #include #include #include #include "rng.h" #define N_MAX 7 /* maximal number of digits in multiplicand */ #define M_MAX 5 /* maximal number of digits in multiplier */ #define N_TEST 1000000 /* number of tests */ int main(void) { RNG *rand; int d, j, n, m, test; unsigned short x[N_MAX], y[M_MAX], z[N_MAX+M_MAX]; rand = rng_create_rand(); for (test = 1; test <= N_TEST; test++) { /* x[0,...,n-1] := multiplicand */ n = 1 + rng_unif_rand(rand, N_MAX-1); assert(1 <= n && n <= N_MAX); for (j = 0; j < n; j++) { d = rng_unif_rand(rand, 65536); assert(0 <= d && d <= 65535); x[j] = (unsigned short)d; } /* y[0,...,m-1] := multiplier */ m = 1 + rng_unif_rand(rand, M_MAX-1); assert(1 <= m && m <= M_MAX); for (j = 0; j < m; j++) { d = rng_unif_rand(rand, 65536); assert(0 <= d && d <= 65535); y[j] = (unsigned short)d; } if (y[m-1] == 0) y[m-1] = 1; /* z[0,...,n+m-1] := x * y */ for (j = 0; j < n; j++) z[m+j] = x[j]; bigmul(n, m, z, y); /* z[0,...,m-1] := z mod y, z[m,...,n+m-1] := z div y */ bigdiv(n, m, z, y); /* z mod y must be 0 */ for (j = 0; j < m; j++) assert(z[j] == 0); /* z div y must be x */ for (j = 0; j < n; j++) assert(z[m+j] == x[j]); } fprintf(stderr, "%d tests successfully passed\n", N_TEST); rng_delete_rand(rand); return 0; } #endif /* eof */ glpk-5.0/src/misc/bignum.h0000644000062000006210000000246413766346220014664 0ustar maomkpasswd/* bignum.h (bignum arithmetic) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2006-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef BIGNUM_H #define BIGNUM_H #define bigmul _glp_bigmul void bigmul(int n, int m, unsigned short x[], unsigned short y[]); /* multiply unsigned integer numbers of arbitrary precision */ #define bigdiv _glp_bigdiv void bigdiv(int n, int m, unsigned short x[], unsigned short y[]); /* divide unsigned integer numbers of arbitrary precision */ #endif /* eof */ glpk-5.0/src/misc/dimacs.c0000644000062000006210000001063313766346220014633 0ustar maomkpasswd/* dimacs.c (reading data in DIMACS format) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2009-2015 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "dimacs.h" void dmx_error(DMX *csa, const char *fmt, ...) { /* print error message and terminate processing */ va_list arg; xprintf("%s:%d: error: ", csa->fname, csa->count); va_start(arg, fmt); xvprintf(fmt, arg); va_end(arg); xprintf("\n"); longjmp(csa->jump, 1); /* no return */ } void dmx_warning(DMX *csa, const char *fmt, ...) { /* print warning message and continue processing */ va_list arg; xprintf("%s:%d: warning: ", csa->fname, csa->count); va_start(arg, fmt); xvprintf(fmt, arg); va_end(arg); xprintf("\n"); return; } void dmx_read_char(DMX *csa) { /* read character from input text file */ int c; if (csa->c == '\n') csa->count++; c = glp_getc(csa->fp); if (c < 0) { if (glp_ioerr(csa->fp)) dmx_error(csa, "read error - %s", get_err_msg()); else if (csa->c == '\n') dmx_error(csa, "unexpected end of file"); else { dmx_warning(csa, "missing final end of line"); c = '\n'; } } else if (c == '\n') ; else if (isspace(c)) c = ' '; else if (iscntrl(c)) dmx_error(csa, "invalid control character 0x%02X", c); csa->c = c; return; } void dmx_read_designator(DMX *csa) { /* read one-character line designator */ xassert(csa->c == '\n'); dmx_read_char(csa); for (;;) { /* skip preceding white-space characters */ while (csa->c == ' ') dmx_read_char(csa); if (csa->c == '\n') { /* ignore empty line */ if (!csa->empty) { dmx_warning(csa, "empty line ignored"); csa->empty = 1; } dmx_read_char(csa); } else if (csa->c == 'c') { /* skip comment line */ while (csa->c != '\n') dmx_read_char(csa); dmx_read_char(csa); } else { /* hmm... looks like a line designator */ csa->field[0] = (char)csa->c, csa->field[1] = '\0'; /* check that it is followed by a white-space character */ dmx_read_char(csa); if (!(csa->c == ' ' || csa->c == '\n')) dmx_error(csa, "line designator missing or invalid"); break; } } return; } void dmx_read_field(DMX *csa) { /* read data field */ int len = 0; /* skip preceding white-space characters */ while (csa->c == ' ') dmx_read_char(csa); /* scan data field */ if (csa->c == '\n') dmx_error(csa, "unexpected end of line"); while (!(csa->c == ' ' || csa->c == '\n')) { if (len == sizeof(csa->field)-1) dmx_error(csa, "data field '%.15s...' too long", csa->field); csa->field[len++] = (char)csa->c; dmx_read_char(csa); } csa->field[len] = '\0'; return; } void dmx_end_of_line(DMX *csa) { /* skip white-space characters until end of line */ while (csa->c == ' ') dmx_read_char(csa); if (csa->c != '\n') dmx_error(csa, "too many data fields specified"); return; } void dmx_check_int(DMX *csa, double num) { /* print a warning if non-integer data are detected */ if (!csa->nonint && num != floor(num)) { dmx_warning(csa, "non-integer data detected"); csa->nonint = 1; } return; } /* eof */ glpk-5.0/src/misc/dimacs.h0000644000062000006210000000465313766346220014645 0ustar maomkpasswd/* dimacs.h (reading data in DIMACS format) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2009-2015 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef DIMACS_H #define DIMACS_H #include "env.h" typedef struct DMX DMX; struct DMX { /* DIMACS data reader */ jmp_buf jump; /* label for go to in case of error */ const char *fname; /* name of input text file */ glp_file *fp; /* stream assigned to input text file */ int count; /* line count */ int c; /* current character */ char field[255+1]; /* data field */ int empty; /* warning 'empty line ignored' was printed */ int nonint; /* warning 'non-integer data detected' was printed */ }; #define dmx_error _glp_dmx_error void dmx_error(DMX *csa, const char *fmt, ...); /* print error message and terminate processing */ #define dmx_warning _glp_dmx_warning void dmx_warning(DMX *csa, const char *fmt, ...); /* print warning message and continue processing */ #define dmx_read_char _glp_dmx_read_char void dmx_read_char(DMX *csa); /* read character from input text file */ #define dmx_read_designator _glp_dmx_read_designator void dmx_read_designator(DMX *csa); /* read one-character line designator */ #define dmx_read_field _glp_dmx_read_field void dmx_read_field(DMX *csa); /* read data field */ #define dmx_end_of_line _glp_dmx_end_of_line void dmx_end_of_line(DMX *csa); /* skip white-space characters until end of line */ #define dmx_check_int _glp_dmx_check_int void dmx_check_int(DMX *csa, double num); /* print a warning if non-integer data are detected */ #endif /* eof */ glpk-5.0/src/misc/dmp.c0000644000062000006210000001561613766346220014161 0ustar maomkpasswd/* dmp.c (dynamic memory pool) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2000-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "dmp.h" struct DMP { /* dynamic memory pool */ void *avail[32]; /* avail[k], 0 <= k <= 31, is a pointer to first available (free) * atom of (k+1)*8 bytes long; at the beginning of each free atom * there is a pointer to another free atom of the same size */ void *block; /* pointer to most recently allocated memory block; at the * beginning of each allocated memory block there is a pointer to * previously allocated memory block */ int used; /* number of bytes used in most recently allocated memory block */ size_t count; /* number of atoms which are currently in use */ }; #define DMP_BLK_SIZE 8000 /* size of memory blocks, in bytes, allocated for memory pools */ struct prefix { /* atom prefix (for debugging only) */ DMP *pool; /* dynamic memory pool */ int size; /* original atom size, in bytes */ }; #define prefix_size ((sizeof(struct prefix) + 7) & ~7) /* size of atom prefix rounded up to multiple of 8 bytes */ int dmp_debug; /* debug mode flag */ /*********************************************************************** * NAME * * dmp_create_pool - create dynamic memory pool * * SYNOPSIS * * #include "dmp.h" * DMP *dmp_create_pool(void); * * DESCRIPTION * * The routine dmp_create_pool creates a dynamic memory pool. * * RETURNS * * The routine returns a pointer to the memory pool created. */ DMP *dmp_create_pool(void) { DMP *pool; int k; xassert(sizeof(void *) <= 8); if (dmp_debug) xprintf("dmp_create_pool: warning: debug mode is on\n"); pool = talloc(1, DMP); for (k = 0; k <= 31; k++) pool->avail[k] = NULL; pool->block = NULL; pool->used = DMP_BLK_SIZE; pool->count = 0; return pool; } /*********************************************************************** * NAME * * dmp_get_atom - get free atom from dynamic memory pool * * SYNOPSIS * * #include "dmp.h" * void *dmp_get_atom(DMP *pool, int size); * * DESCRIPTION * * The routine dmp_get_atom obtains a free atom (memory space) from the * specified memory pool. * * The parameter size is the atom size, in bytes, 1 <= size <= 256. * * Note that the free atom contains arbitrary data, not binary zeros. * * RETURNS * * The routine returns a pointer to the free atom obtained. */ void *dmp_get_atom(DMP *pool, int size) { void *atom; int k, need; xassert(1 <= size && size <= 256); /* round up atom size to multiple of 8 bytes */ need = (size + 7) & ~7; /* determine number of corresponding list of free atoms */ k = (need >> 3) - 1; /* obtain free atom */ if (pool->avail[k] == NULL) { /* corresponding list of free atoms is empty */ /* if debug mode is on, add atom prefix size */ if (dmp_debug) need += prefix_size; if (pool->used + need > DMP_BLK_SIZE) { /* allocate new memory block */ void *block = talloc(DMP_BLK_SIZE, char); *(void **)block = pool->block; pool->block = block; pool->used = 8; /* sufficient to store pointer */ } /* allocate new atom in current memory block */ atom = (char *)pool->block + pool->used; pool->used += need; } else { /* obtain atom from corresponding list of free atoms */ atom = pool->avail[k]; pool->avail[k] = *(void **)atom; } /* if debug mode is on, fill atom prefix */ if (dmp_debug) { ((struct prefix *)atom)->pool = pool; ((struct prefix *)atom)->size = size; atom = (char *)atom + prefix_size; } /* increase number of allocated atoms */ pool->count++; return atom; } /*********************************************************************** * NAME * * dmp_free_atom - return atom to dynamic memory pool * * SYNOPSIS * * #include "dmp.h" * void dmp_free_atom(DMP *pool, void *atom, int size); * * DESCRIPTION * * The routine dmp_free_atom returns the specified atom (memory space) * to the specified memory pool, making the atom free. * * The parameter size is the atom size, in bytes, 1 <= size <= 256. * * Note that the atom can be returned only to the pool, from which it * was obtained, and its size must be exactly the same as on obtaining * it from the pool. */ void dmp_free_atom(DMP *pool, void *atom, int size) { int k; xassert(1 <= size && size <= 256); /* determine number of corresponding list of free atoms */ k = ((size + 7) >> 3) - 1; /* if debug mode is on, check atom prefix */ if (dmp_debug) { atom = (char *)atom - prefix_size; xassert(((struct prefix *)atom)->pool == pool); xassert(((struct prefix *)atom)->size == size); } /* return atom to corresponding list of free atoms */ *(void **)atom = pool->avail[k]; pool->avail[k] = atom; /* decrease number of allocated atoms */ xassert(pool->count > 0); pool->count--; return; } /*********************************************************************** * NAME * * dmp_in_use - determine how many atoms are still in use * * SYNOPSIS * * #include "dmp.h" * size_t dmp_in_use(DMP *pool); * * RETURNS * * The routine returns the number of atoms of the specified memory pool * which are still in use. */ size_t dmp_in_use(DMP *pool) { return pool->count; } /*********************************************************************** * NAME * * dmp_delete_pool - delete dynamic memory pool * * SYNOPSIS * * #include "dmp.h" * void dmp_delete_pool(DMP *pool); * * DESCRIPTION * * The routine dmp_delete_pool deletes the specified dynamic memory * pool freeing all the memory allocated to this object. */ void dmp_delete_pool(DMP *pool) { while (pool->block != NULL) { void *block = pool->block; pool->block = *(void **)block; tfree(block); } tfree(pool); return; } /* eof */ glpk-5.0/src/misc/dmp.h0000644000062000006210000000354513766346220014164 0ustar maomkpasswd/* dmp.h (dynamic memory pool) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2000-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef DMP_H #define DMP_H #include "stdc.h" typedef struct DMP DMP; #define dmp_debug _glp_dmp_debug extern int dmp_debug; /* debug mode flag */ #define dmp_create_pool _glp_dmp_create_pool DMP *dmp_create_pool(void); /* create dynamic memory pool */ #define dmp_talloc(pool, type) \ ((type *)dmp_get_atom(pool, sizeof(type))) #define dmp_get_atom _glp_dmp_get_atom void *dmp_get_atom(DMP *pool, int size); /* get free atom from dynamic memory pool */ #define dmp_tfree(pool, atom) \ dmp_free_atom(pool, atom, sizeof(*(atom))) #define dmp_free_atom _glp_dmp_free_atom void dmp_free_atom(DMP *pool, void *atom, int size); /* return atom to dynamic memory pool */ #define dmp_in_use _glp_dmp_in_use size_t dmp_in_use(DMP *pool); /* determine how many atoms are still in use */ #define dmp_delete_pool _glp_dmp_delete_pool void dmp_delete_pool(DMP *pool); /* delete dynamic memory pool */ #endif /* eof */ glpk-5.0/src/misc/ffalg.c0000644000062000006210000001632213766346220014453 0ustar maomkpasswd/* ffalg.c (Ford-Fulkerson algorithm) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2009-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "ffalg.h" /*********************************************************************** * NAME * * ffalg - Ford-Fulkerson algorithm * * SYNOPSIS * * #include "ffalg.h" * void ffalg(int nv, int na, const int tail[], const int head[], * int s, int t, const int cap[], int x[], char cut[]); * * DESCRIPTION * * The routine ffalg implements the Ford-Fulkerson algorithm to find a * maximal flow in the specified flow network. * * INPUT PARAMETERS * * nv is the number of nodes, nv >= 2. * * na is the number of arcs, na >= 0. * * tail[a], a = 1,...,na, is the index of tail node of arc a. * * head[a], a = 1,...,na, is the index of head node of arc a. * * s is the source node index, 1 <= s <= nv. * * t is the sink node index, 1 <= t <= nv, t != s. * * cap[a], a = 1,...,na, is the capacity of arc a, cap[a] >= 0. * * NOTE: Multiple arcs are allowed, but self-loops are not allowed. * * OUTPUT PARAMETERS * * x[a], a = 1,...,na, is optimal value of the flow through arc a. * * cut[i], i = 1,...,nv, is 1 if node i is labelled, and 0 otherwise. * The set of arcs, whose one endpoint is labelled and other is not, * defines the minimal cut corresponding to the maximal flow found. * If the parameter cut is NULL, the cut information are not stored. * * REFERENCES * * L.R.Ford, Jr., and D.R.Fulkerson, "Flows in Networks," The RAND * Corp., Report R-375-PR (August 1962), Chap. I "Static Maximal Flow," * pp.30-33. */ void ffalg(int nv, int na, const int tail[], const int head[], int s, int t, const int cap[], int x[], char cut[]) { int a, delta, i, j, k, pos1, pos2, temp, *ptr, *arc, *link, *list; /* sanity checks */ xassert(nv >= 2); xassert(na >= 0); xassert(1 <= s && s <= nv); xassert(1 <= t && t <= nv); xassert(s != t); for (a = 1; a <= na; a++) { i = tail[a], j = head[a]; xassert(1 <= i && i <= nv); xassert(1 <= j && j <= nv); xassert(i != j); xassert(cap[a] >= 0); } /* allocate working arrays */ ptr = xcalloc(1+nv+1, sizeof(int)); arc = xcalloc(1+na+na, sizeof(int)); link = xcalloc(1+nv, sizeof(int)); list = xcalloc(1+nv, sizeof(int)); /* ptr[i] := (degree of node i) */ for (i = 1; i <= nv; i++) ptr[i] = 0; for (a = 1; a <= na; a++) { ptr[tail[a]]++; ptr[head[a]]++; } /* initialize arc pointers */ ptr[1]++; for (i = 1; i < nv; i++) ptr[i+1] += ptr[i]; ptr[nv+1] = ptr[nv]; /* build arc lists */ for (a = 1; a <= na; a++) { arc[--ptr[tail[a]]] = a; arc[--ptr[head[a]]] = a; } xassert(ptr[1] == 1); xassert(ptr[nv+1] == na+na+1); /* now the indices of arcs incident to node i are stored in * locations arc[ptr[i]], arc[ptr[i]+1], ..., arc[ptr[i+1]-1] */ /* initialize arc flows */ for (a = 1; a <= na; a++) x[a] = 0; loop: /* main loop starts here */ /* build augmenting tree rooted at s */ /* link[i] = 0 means that node i is not labelled yet; * link[i] = a means that arc a immediately precedes node i */ /* initially node s is labelled as the root */ for (i = 1; i <= nv; i++) link[i] = 0; link[s] = -1, list[1] = s, pos1 = pos2 = 1; /* breadth first search */ while (pos1 <= pos2) { /* dequeue node i */ i = list[pos1++]; /* consider all arcs incident to node i */ for (k = ptr[i]; k < ptr[i+1]; k++) { a = arc[k]; if (tail[a] == i) { /* a = i->j is a forward arc from s to t */ j = head[a]; /* if node j has been labelled, skip the arc */ if (link[j] != 0) continue; /* if the arc does not allow increasing the flow through * it, skip the arc */ if (x[a] == cap[a]) continue; } else if (head[a] == i) { /* a = i<-j is a backward arc from s to t */ j = tail[a]; /* if node j has been labelled, skip the arc */ if (link[j] != 0) continue; /* if the arc does not allow decreasing the flow through * it, skip the arc */ if (x[a] == 0) continue; } else xassert(a != a); /* label node j and enqueue it */ link[j] = a, list[++pos2] = j; /* check for breakthrough */ if (j == t) goto brkt; } } /* NONBREAKTHROUGH */ /* no augmenting path exists; current flow is maximal */ /* store minimal cut information, if necessary */ if (cut != NULL) { for (i = 1; i <= nv; i++) cut[i] = (char)(link[i] != 0); } goto done; brkt: /* BREAKTHROUGH */ /* walk through arcs of the augmenting path (s, ..., t) found in * the reverse order and determine maximal change of the flow */ delta = 0; for (j = t; j != s; j = i) { /* arc a immediately precedes node j in the path */ a = link[j]; if (head[a] == j) { /* a = i->j is a forward arc of the cycle */ i = tail[a]; /* x[a] may be increased until its upper bound */ temp = cap[a] - x[a]; } else if (tail[a] == j) { /* a = i<-j is a backward arc of the cycle */ i = head[a]; /* x[a] may be decreased until its lower bound */ temp = x[a]; } else xassert(a != a); if (delta == 0 || delta > temp) delta = temp; } xassert(delta > 0); /* increase the flow along the path */ for (j = t; j != s; j = i) { /* arc a immediately precedes node j in the path */ a = link[j]; if (head[a] == j) { /* a = i->j is a forward arc of the cycle */ i = tail[a]; x[a] += delta; } else if (tail[a] == j) { /* a = i<-j is a backward arc of the cycle */ i = head[a]; x[a] -= delta; } else xassert(a != a); } goto loop; done: /* free working arrays */ xfree(ptr); xfree(arc); xfree(link); xfree(list); return; } /* eof */ glpk-5.0/src/misc/ffalg.h0000644000062000006210000000226113766346220014455 0ustar maomkpasswd/* ffalg.h (Ford-Fulkerson algorithm) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2009-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef FFALG_H #define FFALG_H #define ffalg _glp_ffalg void ffalg(int nv, int na, const int tail[], const int head[], int s, int t, const int cap[], int x[], char cut[]); /* Ford-Fulkerson algorithm */ #endif /* eof */ glpk-5.0/src/misc/fp2rat.c0000644000062000006210000001177013766346220014574 0ustar maomkpasswd/* fp2rat.c (convert floating-point number to rational number) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2000-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "misc.h" /*********************************************************************** * NAME * * fp2rat - convert floating-point number to rational number * * SYNOPSIS * * #include "misc.h" * int fp2rat(double x, double eps, double *p, double *q); * * DESCRIPTION * * Given a floating-point number 0 <= x < 1 the routine fp2rat finds * its "best" rational approximation p / q, where p >= 0 and q > 0 are * integer numbers, such that |x - p / q| <= eps. * * RETURNS * * The routine fp2rat returns the number of iterations used to achieve * the specified precision eps. * * EXAMPLES * * For x = sqrt(2) - 1 = 0.414213562373095 and eps = 1e-6 the routine * gives p = 408 and q = 985, where 408 / 985 = 0.414213197969543. * * BACKGROUND * * It is well known that every positive real number x can be expressed * as the following continued fraction: * * x = b[0] + a[1] * ------------------------ * b[1] + a[2] * ----------------- * b[2] + a[3] * ---------- * b[3] + ... * * where: * * a[k] = 1, k = 0, 1, 2, ... * * b[k] = floor(x[k]), k = 0, 1, 2, ... * * x[0] = x, * * x[k] = 1 / frac(x[k-1]), k = 1, 2, 3, ... * * To find the "best" rational approximation of x the routine computes * partial fractions f[k] by dropping after k terms as follows: * * f[k] = A[k] / B[k], * * where: * * A[-1] = 1, A[0] = b[0], B[-1] = 0, B[0] = 1, * * A[k] = b[k] * A[k-1] + a[k] * A[k-2], * * B[k] = b[k] * B[k-1] + a[k] * B[k-2]. * * Once the condition * * |x - f[k]| <= eps * * has been satisfied, the routine reports p = A[k] and q = B[k] as the * final answer. * * In the table below here is some statistics obtained for one million * random numbers uniformly distributed in the range [0, 1). * * eps max p mean p max q mean q max k mean k * ------------------------------------------------------------- * 1e-1 8 1.6 9 3.2 3 1.4 * 1e-2 98 6.2 99 12.4 5 2.4 * 1e-3 997 20.7 998 41.5 8 3.4 * 1e-4 9959 66.6 9960 133.5 10 4.4 * 1e-5 97403 211.7 97404 424.2 13 5.3 * 1e-6 479669 669.9 479670 1342.9 15 6.3 * 1e-7 1579030 2127.3 3962146 4257.8 16 7.3 * 1e-8 26188823 6749.4 26188824 13503.4 19 8.2 * * REFERENCES * * W. B. Jones and W. J. Thron, "Continued Fractions: Analytic Theory * and Applications," Encyclopedia on Mathematics and Its Applications, * Addison-Wesley, 1980. */ int fp2rat(double x, double eps, double *p, double *q) { int k; double xk, Akm1, Ak, Bkm1, Bk, ak, bk, fk, temp; xassert(0.0 <= x && x < 1.0); for (k = 0; ; k++) { xassert(k <= 100); if (k == 0) { /* x[0] = x */ xk = x; /* A[-1] = 1 */ Akm1 = 1.0; /* A[0] = b[0] = floor(x[0]) = 0 */ Ak = 0.0; /* B[-1] = 0 */ Bkm1 = 0.0; /* B[0] = 1 */ Bk = 1.0; } else { /* x[k] = 1 / frac(x[k-1]) */ temp = xk - floor(xk); xassert(temp != 0.0); xk = 1.0 / temp; /* a[k] = 1 */ ak = 1.0; /* b[k] = floor(x[k]) */ bk = floor(xk); /* A[k] = b[k] * A[k-1] + a[k] * A[k-2] */ temp = bk * Ak + ak * Akm1; Akm1 = Ak, Ak = temp; /* B[k] = b[k] * B[k-1] + a[k] * B[k-2] */ temp = bk * Bk + ak * Bkm1; Bkm1 = Bk, Bk = temp; } /* f[k] = A[k] / B[k] */ fk = Ak / Bk; #if 0 print("%.*g / %.*g = %.*g", DBL_DIG, Ak, DBL_DIG, Bk, DBL_DIG, fk); #endif if (fabs(x - fk) <= eps) break; } *p = Ak; *q = Bk; return k; } /* eof */ glpk-5.0/src/misc/fvs.c0000644000062000006210000000670113766346220014172 0ustar maomkpasswd/* fvs.c (sparse vector in FVS format) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "fvs.h" void fvs_alloc_vec(FVS *x, int n) { /* allocate sparse vector */ int j; xassert(n >= 0); x->n = n; x->nnz = 0; x->ind = talloc(1+n, int); x->vec = talloc(1+n, double); for (j = 1; j <= n; j++) x->vec[j] = 0.0; return; } void fvs_check_vec(const FVS *x) { /* check sparse vector */ /* NOTE: for testing/debugging only */ int n = x->n; int nnz = x->nnz; int *ind = x->ind; double *vec = x->vec; char *map; int j, k; xassert(n >= 0); xassert(0 <= nnz && nnz <= n); map = talloc(1+n, char); for (j = 1; j <= n; j++) map[j] = (vec[j] != 0.0); for (k = 1; k <= nnz; k++) { j = ind[k]; xassert(1 <= j && j <= n); xassert(map[j]); map[j] = 0; } for (j = 1; j <= n; j++) xassert(!map[j]); tfree(map); return; } void fvs_gather_vec(FVS *x, double eps) { /* gather sparse vector */ int n = x->n; int *ind = x->ind; double *vec = x->vec; int j, nnz = 0; for (j = n; j >= 1; j--) { if (-eps < vec[j] && vec[j] < +eps) vec[j] = 0.0; else ind[++nnz] = j; } x->nnz = nnz; return; } void fvs_clear_vec(FVS *x) { /* clear sparse vector */ int *ind = x->ind; double *vec = x->vec; int k; for (k = x->nnz; k >= 1; k--) vec[ind[k]] = 0.0; x->nnz = 0; return; } void fvs_copy_vec(FVS *x, const FVS *y) { /* copy sparse vector */ int *x_ind = x->ind; double *x_vec = x->vec; int *y_ind = y->ind; double *y_vec = y->vec; int j, k; xassert(x != y); xassert(x->n == y->n); fvs_clear_vec(x); for (k = x->nnz = y->nnz; k >= 1; k--) { j = x_ind[k] = y_ind[k]; x_vec[j] = y_vec[j]; } return; } void fvs_adjust_vec(FVS *x, double eps) { /* replace tiny vector elements by exact zeros */ int nnz = x->nnz; int *ind = x->ind; double *vec = x->vec; int j, k, cnt = 0; for (k = 1; k <= nnz; k++) { j = ind[k]; if (-eps < vec[j] && vec[j] < +eps) vec[j] = 0.0; else ind[++cnt] = j; } x->nnz = cnt; return; } void fvs_free_vec(FVS *x) { /* deallocate sparse vector */ tfree(x->ind); tfree(x->vec); x->n = x->nnz = -1; x->ind = NULL; x->vec = NULL; return; } /* eof */ glpk-5.0/src/misc/fvs.h0000644000062000006210000000460413766346220014177 0ustar maomkpasswd/* fvs.h (sparse vector in FVS format) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef FVS_H #define FVS_H typedef struct FVS FVS; struct FVS { /* sparse vector in FVS (Full Vector Storage) format */ int n; /* vector dimension (total number of elements) */ int nnz; /* number of non-zero elements, 0 <= nnz <= n */ int *ind; /* int ind[1+n]; */ /* ind[0] is not used; * ind[k] = j, 1 <= k <= nnz, means that vec[j] != 0 * non-zero indices in the array ind are stored in arbitrary * order; if vec[j] = 0, its index j SHOULD NOT be presented in * the array ind */ double *vec; /* double vec[1+n]; */ /* vec[0] is not used; * vec[j], 1 <= j <= n, is a numeric value of j-th element */ }; #define fvs_alloc_vec _glp_fvs_alloc_vec void fvs_alloc_vec(FVS *x, int n); /* allocate sparse vector */ #define fvs_check_vec _glp_fvs_check_vec void fvs_check_vec(const FVS *x); /* check sparse vector */ #define fvs_gather_vec _glp_fvs_gather_vec void fvs_gather_vec(FVS *x, double eps); /* gather sparse vector */ #define fvs_clear_vec _glp_fvs_clear_vec void fvs_clear_vec(FVS *x); /* clear sparse vector */ #define fvs_copy_vec _glp_fvs_copy_vec void fvs_copy_vec(FVS *x, const FVS *y); /* copy sparse vector */ #define fvs_adjust_vec _glp_fvs_adjust_vec void fvs_adjust_vec(FVS *x, double eps); /* replace tiny vector elements by exact zeros */ #define fvs_free_vec _glp_fvs_free_vec void fvs_free_vec(FVS *x); /* deallocate sparse vector */ #endif /* eof */ glpk-5.0/src/misc/gcd.c0000644000062000006210000000515313766346220014131 0ustar maomkpasswd/* gcd.c (greatest common divisor) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2000 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "misc.h" /*********************************************************************** * NAME * * gcd - find greatest common divisor of two integers * * SYNOPSIS * * #include "misc.h" * int gcd(int x, int y); * * RETURNS * * The routine gcd returns gcd(x, y), the greatest common divisor of * the two positive integers given. * * ALGORITHM * * The routine gcd is based on Euclid's algorithm. * * REFERENCES * * Don Knuth, The Art of Computer Programming, Vol.2: Seminumerical * Algorithms, 3rd Edition, Addison-Wesley, 1997. Section 4.5.2: The * Greatest Common Divisor, pp. 333-56. */ int gcd(int x, int y) { int r; xassert(x > 0 && y > 0); while (y > 0) r = x % y, x = y, y = r; return x; } /*********************************************************************** * NAME * * gcdn - find greatest common divisor of n integers * * SYNOPSIS * * #include "misc.h" * int gcdn(int n, int x[]); * * RETURNS * * The routine gcdn returns gcd(x[1], x[2], ..., x[n]), the greatest * common divisor of n positive integers given, n > 0. * * BACKGROUND * * The routine gcdn is based on the following identity: * * gcd(x, y, z) = gcd(gcd(x, y), z). * * REFERENCES * * Don Knuth, The Art of Computer Programming, Vol.2: Seminumerical * Algorithms, 3rd Edition, Addison-Wesley, 1997. Section 4.5.2: The * Greatest Common Divisor, pp. 333-56. */ int gcdn(int n, int x[]) { int d, j; xassert(n > 0); for (j = 1; j <= n; j++) { xassert(x[j] > 0); if (j == 1) d = x[1]; else d = gcd(d, x[j]); if (d == 1) break; } return d; } /* eof */ glpk-5.0/src/misc/hbm.c0000644000062000006210000004611013766346220014140 0ustar maomkpasswd/* hbm.c (Harwell-Boeing sparse matrix format) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2004-2018 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "hbm.h" #include "misc.h" /*********************************************************************** * NAME * * hbm_read_mat - read sparse matrix in Harwell-Boeing format * * SYNOPSIS * * #include "glphbm.h" * HBM *hbm_read_mat(const char *fname); * * DESCRIPTION * * The routine hbm_read_mat reads a sparse matrix in the Harwell-Boeing * format from a text file whose name is the character string fname. * * Detailed description of the Harwell-Boeing format recognised by this * routine is given in the following report: * * I.S.Duff, R.G.Grimes, J.G.Lewis. User's Guide for the Harwell-Boeing * Sparse Matrix Collection (Release I), TR/PA/92/86, October 1992. * * RETURNS * * If no error occured, the routine hbm_read_mat returns a pointer to * a data structure containing the matrix. In case of error the routine * prints an appropriate error message and returns NULL. */ struct dsa { /* working area used by routine hbm_read_mat */ const char *fname; /* name of input text file */ FILE *fp; /* stream assigned to input text file */ int seqn; /* card sequential number */ char card[80+1]; /* card image buffer */ int fmt_p; /* scale factor */ int fmt_k; /* iterator */ int fmt_f; /* format code */ int fmt_w; /* field width */ int fmt_d; /* number of decimal places after point */ }; /*********************************************************************** * read_card - read next data card * * This routine reads the next 80-column card from the input text file * and stores its image into the character string card. If the card was * read successfully, the routine returns zero, otherwise non-zero. */ #if 1 /* 11/III-2012 */ static int read_card(struct dsa *dsa) { int c, len = 0; char buf[255+1]; dsa->seqn++; for (;;) { c = fgetc(dsa->fp); if (c == EOF) { if (ferror(dsa->fp)) xprintf("%s:%d: read error\n", dsa->fname, dsa->seqn); else xprintf("%s:%d: unexpected end-of-file\n", dsa->fname, dsa->seqn); return 1; } else if (c == '\r') /* nop */; else if (c == '\n') break; else if (iscntrl(c)) { xprintf("%s:%d: invalid control character\n", dsa->fname, dsa->seqn, c); return 1; } else { if (len == sizeof(buf)-1) goto err; buf[len++] = (char)c; } } /* remove trailing spaces */ while (len > 80 && buf[len-1] == ' ') len--; buf[len] = '\0'; /* line should not be longer than 80 chars */ if (len > 80) err: { xerror("%s:%d: card image too long\n", dsa->fname, dsa->seqn); return 1; } /* padd by spaces to 80-column card image */ strcpy(dsa->card, buf); memset(&dsa->card[len], ' ', 80 - len); dsa->card[80] = '\0'; return 0; } #endif /*********************************************************************** * scan_int - scan integer value from the current card * * This routine scans an integer value from the current card, where fld * is the name of the field, pos is the position of the field, width is * the width of the field, val points to a location to which the scanned * value should be stored. If the value was scanned successfully, the * routine returns zero, otherwise non-zero. */ static int scan_int(struct dsa *dsa, char *fld, int pos, int width, int *val) { char str[80+1]; xassert(1 <= width && width <= 80); memcpy(str, dsa->card + pos, width), str[width] = '\0'; if (str2int(strspx(str), val)) { xprintf("%s:%d: field '%s' contains invalid value '%s'\n", dsa->fname, dsa->seqn, fld, str); return 1; } return 0; } /*********************************************************************** * parse_fmt - parse Fortran format specification * * This routine parses the Fortran format specification represented as * character string which fmt points to and stores format elements into * appropriate static locations. Should note that not all valid Fortran * format specifications may be recognised. If the format specification * was recognised, the routine returns zero, otherwise non-zero. */ static int parse_fmt(struct dsa *dsa, char *fmt) { int k, s, val; char str[80+1]; /* first character should be left parenthesis */ if (fmt[0] != '(') fail: { xprintf("hbm_read_mat: format '%s' not recognised\n", fmt); return 1; } k = 1; /* optional scale factor */ dsa->fmt_p = 0; if (isdigit((unsigned char)fmt[k])) { s = 0; while (isdigit((unsigned char)fmt[k])) { if (s == 80) goto fail; str[s++] = fmt[k++]; } str[s] = '\0'; if (str2int(str, &val)) goto fail; if (toupper((unsigned char)fmt[k]) != 'P') goto iter; dsa->fmt_p = val, k++; if (!(0 <= dsa->fmt_p && dsa->fmt_p <= 255)) goto fail; /* optional comma may follow scale factor */ if (fmt[k] == ',') k++; } /* optional iterator */ dsa->fmt_k = 1; if (isdigit((unsigned char)fmt[k])) { s = 0; while (isdigit((unsigned char)fmt[k])) { if (s == 80) goto fail; str[s++] = fmt[k++]; } str[s] = '\0'; if (str2int(str, &val)) goto fail; iter: dsa->fmt_k = val; if (!(1 <= dsa->fmt_k && dsa->fmt_k <= 255)) goto fail; } /* format code */ dsa->fmt_f = toupper((unsigned char)fmt[k++]); if (!(dsa->fmt_f == 'D' || dsa->fmt_f == 'E' || dsa->fmt_f == 'F' || dsa->fmt_f == 'G' || dsa->fmt_f == 'I')) goto fail; /* field width */ if (!isdigit((unsigned char)fmt[k])) goto fail; s = 0; while (isdigit((unsigned char)fmt[k])) { if (s == 80) goto fail; str[s++] = fmt[k++]; } str[s] = '\0'; if (str2int(str, &dsa->fmt_w)) goto fail; if (!(1 <= dsa->fmt_w && dsa->fmt_w <= 255)) goto fail; /* optional number of decimal places after point */ dsa->fmt_d = 0; if (fmt[k] == '.') { k++; if (!isdigit((unsigned char)fmt[k])) goto fail; s = 0; while (isdigit((unsigned char)fmt[k])) { if (s == 80) goto fail; str[s++] = fmt[k++]; } str[s] = '\0'; if (str2int(str, &dsa->fmt_d)) goto fail; if (!(0 <= dsa->fmt_d && dsa->fmt_d <= 255)) goto fail; } /* last character should be right parenthesis */ if (!(fmt[k] == ')' && fmt[k+1] == '\0')) goto fail; return 0; } /*********************************************************************** * read_int_array - read array of integer type * * This routine reads an integer array from the input text file, where * name is array name, fmt is Fortran format specification that controls * reading, n is number of array elements, val is array of integer type. * If the array was read successful, the routine returns zero, otherwise * non-zero. */ static int read_int_array(struct dsa *dsa, char *name, char *fmt, int n, int val[]) { int k, pos; char str[80+1]; if (parse_fmt(dsa, fmt)) return 1; if (!(dsa->fmt_f == 'I' && dsa->fmt_w <= 80 && dsa->fmt_k * dsa->fmt_w <= 80)) { xprintf( "%s:%d: can't read array '%s' - invalid format '%s'\n", dsa->fname, dsa->seqn, name, fmt); return 1; } for (k = 1, pos = INT_MAX; k <= n; k++, pos++) { if (pos >= dsa->fmt_k) { if (read_card(dsa)) return 1; pos = 0; } memcpy(str, dsa->card + dsa->fmt_w * pos, dsa->fmt_w); str[dsa->fmt_w] = '\0'; strspx(str); if (str2int(str, &val[k])) { xprintf( "%s:%d: can't read array '%s' - invalid value '%s'\n", dsa->fname, dsa->seqn, name, str); return 1; } } return 0; } /*********************************************************************** * read_real_array - read array of real type * * This routine reads a real array from the input text file, where name * is array name, fmt is Fortran format specification that controls * reading, n is number of array elements, val is array of real type. * If the array was read successful, the routine returns zero, otherwise * non-zero. */ static int read_real_array(struct dsa *dsa, char *name, char *fmt, int n, double val[]) { int k, pos; char str[80+1], *ptr; if (parse_fmt(dsa, fmt)) return 1; if (!(dsa->fmt_f != 'I' && dsa->fmt_w <= 80 && dsa->fmt_k * dsa->fmt_w <= 80)) { xprintf( "%s:%d: can't read array '%s' - invalid format '%s'\n", dsa->fname, dsa->seqn, name, fmt); return 1; } for (k = 1, pos = INT_MAX; k <= n; k++, pos++) { if (pos >= dsa->fmt_k) { if (read_card(dsa)) return 1; pos = 0; } memcpy(str, dsa->card + dsa->fmt_w * pos, dsa->fmt_w); str[dsa->fmt_w] = '\0'; strspx(str); if (strchr(str, '.') == NULL && strcmp(str, "0")) { xprintf("%s(%d): can't read array '%s' - value '%s' has no " "decimal point\n", dsa->fname, dsa->seqn, name, str); return 1; } /* sometimes lower case letters appear */ for (ptr = str; *ptr; ptr++) *ptr = (char)toupper((unsigned char)*ptr); ptr = strchr(str, 'D'); if (ptr != NULL) *ptr = 'E'; /* value may appear with decimal exponent but without letters E or D (for example, -123.456-012), so missing letter should be inserted */ ptr = strchr(str+1, '+'); if (ptr == NULL) ptr = strchr(str+1, '-'); if (ptr != NULL && *(ptr-1) != 'E') { xassert(strlen(str) < 80); memmove(ptr+1, ptr, strlen(ptr)+1); *ptr = 'E'; } if (str2num(str, &val[k])) { xprintf( "%s:%d: can't read array '%s' - invalid value '%s'\n", dsa->fname, dsa->seqn, name, str); return 1; } } return 0; } HBM *hbm_read_mat(const char *fname) { struct dsa _dsa, *dsa = &_dsa; HBM *hbm = NULL; dsa->fname = fname; xprintf("hbm_read_mat: reading matrix from '%s'...\n", dsa->fname); dsa->fp = fopen(dsa->fname, "r"); if (dsa->fp == NULL) { xprintf("hbm_read_mat: unable to open '%s' - %s\n", #if 0 /* 29/I-2017 */ dsa->fname, strerror(errno)); #else dsa->fname, xstrerr(errno)); #endif goto fail; } dsa->seqn = 0; hbm = xmalloc(sizeof(HBM)); memset(hbm, 0, sizeof(HBM)); /* read the first heading card */ if (read_card(dsa)) goto fail; memcpy(hbm->title, dsa->card, 72), hbm->title[72] = '\0'; strtrim(hbm->title); xprintf("%s\n", hbm->title); memcpy(hbm->key, dsa->card+72, 8), hbm->key[8] = '\0'; strspx(hbm->key); xprintf("key = %s\n", hbm->key); /* read the second heading card */ if (read_card(dsa)) goto fail; if (scan_int(dsa, "totcrd", 0, 14, &hbm->totcrd)) goto fail; if (scan_int(dsa, "ptrcrd", 14, 14, &hbm->ptrcrd)) goto fail; if (scan_int(dsa, "indcrd", 28, 14, &hbm->indcrd)) goto fail; if (scan_int(dsa, "valcrd", 42, 14, &hbm->valcrd)) goto fail; if (scan_int(dsa, "rhscrd", 56, 14, &hbm->rhscrd)) goto fail; xprintf("totcrd = %d; ptrcrd = %d; indcrd = %d; valcrd = %d; rhsc" "rd = %d\n", hbm->totcrd, hbm->ptrcrd, hbm->indcrd, hbm->valcrd, hbm->rhscrd); /* read the third heading card */ if (read_card(dsa)) goto fail; memcpy(hbm->mxtype, dsa->card, 3), hbm->mxtype[3] = '\0'; if (strchr("RCP", hbm->mxtype[0]) == NULL || strchr("SUHZR", hbm->mxtype[1]) == NULL || strchr("AE", hbm->mxtype[2]) == NULL) { xprintf("%s:%d: matrix type '%s' not recognised\n", dsa->fname, dsa->seqn, hbm->mxtype); goto fail; } if (scan_int(dsa, "nrow", 14, 14, &hbm->nrow)) goto fail; if (scan_int(dsa, "ncol", 28, 14, &hbm->ncol)) goto fail; if (scan_int(dsa, "nnzero", 42, 14, &hbm->nnzero)) goto fail; if (scan_int(dsa, "neltvl", 56, 14, &hbm->neltvl)) goto fail; xprintf("mxtype = %s; nrow = %d; ncol = %d; nnzero = %d; neltvl =" " %d\n", hbm->mxtype, hbm->nrow, hbm->ncol, hbm->nnzero, hbm->neltvl); /* read the fourth heading card */ if (read_card(dsa)) goto fail; memcpy(hbm->ptrfmt, dsa->card, 16), hbm->ptrfmt[16] = '\0'; strspx(hbm->ptrfmt); memcpy(hbm->indfmt, dsa->card+16, 16), hbm->indfmt[16] = '\0'; strspx(hbm->indfmt); memcpy(hbm->valfmt, dsa->card+32, 20), hbm->valfmt[20] = '\0'; strspx(hbm->valfmt); memcpy(hbm->rhsfmt, dsa->card+52, 20), hbm->rhsfmt[20] = '\0'; strspx(hbm->rhsfmt); xprintf("ptrfmt = %s; indfmt = %s; valfmt = %s; rhsfmt = %s\n", hbm->ptrfmt, hbm->indfmt, hbm->valfmt, hbm->rhsfmt); /* read the fifth heading card (optional) */ if (hbm->rhscrd <= 0) { strcpy(hbm->rhstyp, "???"); hbm->nrhs = 0; hbm->nrhsix = 0; } else { if (read_card(dsa)) goto fail; memcpy(hbm->rhstyp, dsa->card, 3), hbm->rhstyp[3] = '\0'; if (scan_int(dsa, "nrhs", 14, 14, &hbm->nrhs)) goto fail; if (scan_int(dsa, "nrhsix", 28, 14, &hbm->nrhsix)) goto fail; xprintf("rhstyp = '%s'; nrhs = %d; nrhsix = %d\n", hbm->rhstyp, hbm->nrhs, hbm->nrhsix); } /* read matrix structure */ hbm->colptr = xcalloc(1+hbm->ncol+1, sizeof(int)); if (read_int_array(dsa, "colptr", hbm->ptrfmt, hbm->ncol+1, hbm->colptr)) goto fail; hbm->rowind = xcalloc(1+hbm->nnzero, sizeof(int)); if (read_int_array(dsa, "rowind", hbm->indfmt, hbm->nnzero, hbm->rowind)) goto fail; /* read matrix values */ if (hbm->valcrd <= 0) goto done; if (hbm->mxtype[2] == 'A') { /* assembled matrix */ hbm->values = xcalloc(1+hbm->nnzero, sizeof(double)); if (read_real_array(dsa, "values", hbm->valfmt, hbm->nnzero, hbm->values)) goto fail; } else { /* elemental (unassembled) matrix */ hbm->values = xcalloc(1+hbm->neltvl, sizeof(double)); if (read_real_array(dsa, "values", hbm->valfmt, hbm->neltvl, hbm->values)) goto fail; } /* read right-hand sides */ if (hbm->nrhs <= 0) goto done; if (hbm->rhstyp[0] == 'F') { /* dense format */ hbm->nrhsvl = hbm->nrow * hbm->nrhs; hbm->rhsval = xcalloc(1+hbm->nrhsvl, sizeof(double)); if (read_real_array(dsa, "rhsval", hbm->rhsfmt, hbm->nrhsvl, hbm->rhsval)) goto fail; } else if (hbm->rhstyp[0] == 'M' && hbm->mxtype[2] == 'A') { /* sparse format */ /* read pointers */ hbm->rhsptr = xcalloc(1+hbm->nrhs+1, sizeof(int)); if (read_int_array(dsa, "rhsptr", hbm->ptrfmt, hbm->nrhs+1, hbm->rhsptr)) goto fail; /* read sparsity pattern */ hbm->rhsind = xcalloc(1+hbm->nrhsix, sizeof(int)); if (read_int_array(dsa, "rhsind", hbm->indfmt, hbm->nrhsix, hbm->rhsind)) goto fail; /* read values */ hbm->rhsval = xcalloc(1+hbm->nrhsix, sizeof(double)); if (read_real_array(dsa, "rhsval", hbm->rhsfmt, hbm->nrhsix, hbm->rhsval)) goto fail; } else if (hbm->rhstyp[0] == 'M' && hbm->mxtype[2] == 'E') { /* elemental format */ hbm->rhsval = xcalloc(1+hbm->nrhsvl, sizeof(double)); if (read_real_array(dsa, "rhsval", hbm->rhsfmt, hbm->nrhsvl, hbm->rhsval)) goto fail; } else { xprintf("%s:%d: right-hand side type '%c' not recognised\n", dsa->fname, dsa->seqn, hbm->rhstyp[0]); goto fail; } /* read starting guesses */ if (hbm->rhstyp[1] == 'G') { hbm->nguess = hbm->nrow * hbm->nrhs; hbm->sguess = xcalloc(1+hbm->nguess, sizeof(double)); if (read_real_array(dsa, "sguess", hbm->rhsfmt, hbm->nguess, hbm->sguess)) goto fail; } /* read solution vectors */ if (hbm->rhstyp[2] == 'X') { hbm->nexact = hbm->nrow * hbm->nrhs; hbm->xexact = xcalloc(1+hbm->nexact, sizeof(double)); if (read_real_array(dsa, "xexact", hbm->rhsfmt, hbm->nexact, hbm->xexact)) goto fail; } done: /* reading has been completed */ xprintf("hbm_read_mat: %d cards were read\n", dsa->seqn); fclose(dsa->fp); return hbm; fail: /* something wrong in Danish kingdom */ if (hbm != NULL) { if (hbm->colptr != NULL) xfree(hbm->colptr); if (hbm->rowind != NULL) xfree(hbm->rowind); if (hbm->rhsptr != NULL) xfree(hbm->rhsptr); if (hbm->rhsind != NULL) xfree(hbm->rhsind); if (hbm->values != NULL) xfree(hbm->values); if (hbm->rhsval != NULL) xfree(hbm->rhsval); if (hbm->sguess != NULL) xfree(hbm->sguess); if (hbm->xexact != NULL) xfree(hbm->xexact); xfree(hbm); } if (dsa->fp != NULL) fclose(dsa->fp); return NULL; } /*********************************************************************** * NAME * * hbm_free_mat - free sparse matrix in Harwell-Boeing format * * SYNOPSIS * * #include "glphbm.h" * void hbm_free_mat(HBM *hbm); * * DESCRIPTION * * The hbm_free_mat routine frees all the memory allocated to the data * structure containing a sparse matrix in the Harwell-Boeing format. */ void hbm_free_mat(HBM *hbm) { if (hbm->colptr != NULL) xfree(hbm->colptr); if (hbm->rowind != NULL) xfree(hbm->rowind); if (hbm->rhsptr != NULL) xfree(hbm->rhsptr); if (hbm->rhsind != NULL) xfree(hbm->rhsind); if (hbm->values != NULL) xfree(hbm->values); if (hbm->rhsval != NULL) xfree(hbm->rhsval); if (hbm->sguess != NULL) xfree(hbm->sguess); if (hbm->xexact != NULL) xfree(hbm->xexact); xfree(hbm); return; } /* eof */ glpk-5.0/src/misc/hbm.h0000644000062000006210000001060513766346220014145 0ustar maomkpasswd/* hbm.h (Harwell-Boeing sparse matrix format) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2004-2018 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef HBM_H #define HBM_H typedef struct HBM HBM; struct HBM { /* sparse matrix in Harwell-Boeing format; for details see the report: I.S.Duff, R.G.Grimes, J.G.Lewis. User's Guide for the Harwell-Boeing Sparse Matrix Collection (Release I), 1992 */ char title[72+1]; /* matrix title (informative) */ char key[8+1]; /* matrix key (informative) */ char mxtype[3+1]; /* matrix type: R.. real matrix C.. complex matrix P.. pattern only (no numerical values supplied) .S. symmetric (lower triangle + main diagonal) .U. unsymmetric .H. hermitian (lower triangle + main diagonal) .Z. skew symmetric (lower triangle only) .R. rectangular ..A assembled ..E elemental (unassembled) */ char rhstyp[3+1]; /* optional types: F.. right-hand sides in dense format M.. right-hand sides in same format as matrix .G. starting vector(s) (guess) is supplied ..X exact solution vector(s) is supplied */ char ptrfmt[16+1]; /* format for pointers */ char indfmt[16+1]; /* format for row (or variable) indices */ char valfmt[20+1]; /* format for numerical values of coefficient matrix */ char rhsfmt[20+1]; /* format for numerical values of right-hand sides */ int totcrd; /* total number of cards excluding header */ int ptrcrd; /* number of cards for ponters */ int indcrd; /* number of cards for row (or variable) indices */ int valcrd; /* number of cards for numerical values */ int rhscrd; /* number of lines for right-hand sides; including starting guesses and solution vectors if present; zero indicates no right-hand side data is present */ int nrow; /* number of rows (or variables) */ int ncol; /* number of columns (or elements) */ int nnzero; /* number of row (or variable) indices; equal to number of entries for assembled matrix */ int neltvl; /* number of elemental matrix entries; zero in case of assembled matrix */ int nrhs; /* number of right-hand sides */ int nrhsix; /* number of row indices; ignored in case of unassembled matrix */ int nrhsvl; /* total number of entries in all right-hand sides */ int nguess; /* total number of entries in all starting guesses */ int nexact; /* total number of entries in all solution vectors */ int *colptr; /* alias: eltptr */ /* column pointers (in case of assembled matrix); elemental matrix pointers (in case of unassembled matrix) */ int *rowind; /* alias: varind */ /* row indices (in case of assembled matrix); variable indices (in case of unassembled matrix) */ int *rhsptr; /* right-hand side pointers */ int *rhsind; /* right-hand side indices */ double *values; /* matrix values */ double *rhsval; /* right-hand side values */ double *sguess; /* starting guess values */ double *xexact; /* solution vector values */ }; #define hbm_read_mat _glp_hbm_read_mat HBM *hbm_read_mat(const char *fname); /* read sparse matrix in Harwell-Boeing format */ #define hbm_free_mat _glp_hbm_free_mat void hbm_free_mat(HBM *hbm); /* free sparse matrix in Harwell-Boeing format */ #endif /* eof */ glpk-5.0/src/misc/jd.c0000644000062000006210000000775113766346220013777 0ustar maomkpasswd/* jd.c (conversions between calendar date and Julian day number) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2000 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include #include "jd.h" /*********************************************************************** * NAME * * jday - convert calendar date to Julian day number * * SYNOPSIS * * #include "jd.h" * int jday(int d, int m, int y); * * DESCRIPTION * * The routine jday converts a calendar date, Gregorian calendar, to * corresponding Julian day number j. * * From the given day d, month m, and year y, the Julian day number j * is computed without using tables. * * The routine is valid for 1 <= y <= 4000. * * RETURNS * * The routine jday returns the Julian day number, or negative value if * the specified date is incorrect. * * REFERENCES * * R. G. Tantzen, Algorithm 199: conversions between calendar date and * Julian day number, Communications of the ACM, vol. 6, no. 8, p. 444, * Aug. 1963. */ int jday(int d, int m, int y) { int c, ya, j, dd; if (!(1 <= d && d <= 31 && 1 <= m && m <= 12 && 1 <= y && y <= 4000)) return -1; if (m >= 3) m -= 3; else m += 9, y--; c = y / 100; ya = y - 100 * c; j = (146097 * c) / 4 + (1461 * ya) / 4 + (153 * m + 2) / 5 + d + 1721119; jdate(j, &dd, NULL, NULL); if (d != dd) return -1; return j; } /*********************************************************************** * NAME * * jdate - convert Julian day number to calendar date * * SYNOPSIS * * #include "jd.h" * int jdate(int j, int *d, int *m, int *y); * * DESCRIPTION * * The routine jdate converts a Julian day number j to corresponding * calendar date, Gregorian calendar. * * The day d, month m, and year y are computed without using tables and * stored in corresponding locations. * * The routine is valid for 1721426 <= j <= 3182395. * * RETURNS * * If the conversion is successful, the routine returns zero, otherwise * non-zero. * * REFERENCES * * R. G. Tantzen, Algorithm 199: conversions between calendar date and * Julian day number, Communications of the ACM, vol. 6, no. 8, p. 444, * Aug. 1963. */ int jdate(int j, int *d_, int *m_, int *y_) { int d, m, y; if (!(1721426 <= j && j <= 3182395)) return 1; j -= 1721119; y = (4 * j - 1) / 146097; j = (4 * j - 1) % 146097; d = j / 4; j = (4 * d + 3) / 1461; d = (4 * d + 3) % 1461; d = (d + 4) / 4; m = (5 * d - 3) / 153; d = (5 * d - 3) % 153; d = (d + 5) / 5; y = 100 * y + j; if (m <= 9) m += 3; else m -= 9, y++; if (d_ != NULL) *d_ = d; if (m_ != NULL) *m_ = m; if (y_ != NULL) *y_ = y; return 0; } #ifdef GLP_TEST #include #include #include int main(void) { int jbeg, jend, j, d, m, y; jbeg = jday(1, 1, 1); jend = jday(31, 12, 4000); for (j = jbeg; j <= jend; j++) { assert(jdate(j, &d, &m, &y) == 0); assert(jday(d, m, y) == j); } printf("Routines jday and jdate work correctly.\n"); return 0; } #endif /* eof */ glpk-5.0/src/misc/jd.h0000644000062000006210000000231113766346220013767 0ustar maomkpasswd/* jd.h (conversions between calendar date and Julian day number) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2000 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #define jday _glp_jday int jday(int d, int m, int y); /* convert calendar date to Julian day number */ #define jdate _glp_jdate int jdate(int j, int *d, int *m, int *y); /* convert Julian day number to calendar date */ /* eof */ glpk-5.0/src/misc/keller.c0000644000062000006210000002217413766346220014654 0ustar maomkpasswd/* keller.c (cover edges by cliques, Kellerman's heuristic) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2009-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "glpk.h" #include "env.h" #include "keller.h" /*********************************************************************** * NAME * * kellerman - cover edges by cliques with Kellerman's heuristic * * SYNOPSIS * * #include "keller.h" * int kellerman(int n, int (*func)(void *info, int i, int ind[]), * void *info, glp_graph *H); * * DESCRIPTION * * The routine kellerman implements Kellerman's heuristic algorithm * to find a minimal set of cliques which cover all edges of specified * graph G = (V, E). * * The parameter n specifies the number of vertices |V|, n >= 0. * * Formal routine func specifies the set of edges E in the following * way. Running the routine kellerman calls the routine func and passes * to it parameter i, which is the number of some vertex, 1 <= i <= n. * In response the routine func should store numbers of all vertices * adjacent to vertex i to locations ind[1], ind[2], ..., ind[len] and * return the value of len, which is the number of adjacent vertices, * 0 <= len <= n. Self-loops are allowed, but ignored. Multiple edges * are not allowed. * * The parameter info is a transit pointer (magic cookie) passed to the * formal routine func as its first parameter. * * The result provided by the routine kellerman is the bipartite graph * H = (V union C, F), which defines the covering found. (The program * object of type glp_graph specified by the parameter H should be * previously created with the routine glp_create_graph. On entry the * routine kellerman erases the content of this object with the routine * glp_erase_graph.) Vertices of first part V correspond to vertices of * the graph G and have the same ordinal numbers 1, 2, ..., n. Vertices * of second part C correspond to cliques and have ordinal numbers * n+1, n+2, ..., n+k, where k is the total number of cliques in the * edge covering found. Every edge f in F in the program object H is * represented as arc f = (i->j), where i in V and j in C, which means * that vertex i of the graph G is in clique C[j], 1 <= j <= k. (Thus, * if two vertices of the graph G are in the same clique, these vertices * are adjacent in G, and corresponding edge is covered by that clique.) * * RETURNS * * The routine Kellerman returns k, the total number of cliques in the * edge covering found. * * REFERENCE * * For more details see: glpk/doc/notes/keller.pdf (in Russian). */ struct set { /* set of vertices */ int size; /* size (cardinality) of the set, 0 <= card <= n */ int *list; /* int list[1+n]; */ /* the set contains vertices list[1,...,size] */ int *pos; /* int pos[1+n]; */ /* pos[i] > 0 means that vertex i is in the set and * list[pos[i]] = i; pos[i] = 0 means that vertex i is not in * the set */ }; int kellerman(int n, int (*func)(void *info, int i, int ind[]), void *info, void /* glp_graph */ *H_) { glp_graph *H = H_; struct set W_, *W = &W_, V_, *V = &V_; glp_arc *a; int i, j, k, m, t, len, card, best; xassert(n >= 0); /* H := (V, 0; 0), where V is the set of vertices of graph G */ glp_erase_graph(H, H->v_size, H->a_size); glp_add_vertices(H, n); /* W := 0 */ W->size = 0; W->list = xcalloc(1+n, sizeof(int)); W->pos = xcalloc(1+n, sizeof(int)); memset(&W->pos[1], 0, sizeof(int) * n); /* V := 0 */ V->size = 0; V->list = xcalloc(1+n, sizeof(int)); V->pos = xcalloc(1+n, sizeof(int)); memset(&V->pos[1], 0, sizeof(int) * n); /* main loop */ for (i = 1; i <= n; i++) { /* W must be empty */ xassert(W->size == 0); /* W := { j : i > j and (i,j) in E } */ len = func(info, i, W->list); xassert(0 <= len && len <= n); for (t = 1; t <= len; t++) { j = W->list[t]; xassert(1 <= j && j <= n); if (j >= i) continue; xassert(W->pos[j] == 0); W->list[++W->size] = j, W->pos[j] = W->size; } /* on i-th iteration we need to cover edges (i,j) for all * j in W */ /* if W is empty, it is a special case */ if (W->size == 0) { /* set k := k + 1 and create new clique C[k] = { i } */ k = glp_add_vertices(H, 1) - n; glp_add_arc(H, i, n + k); continue; } /* try to include vertex i into existing cliques */ /* V must be empty */ xassert(V->size == 0); /* k is the number of cliques found so far */ k = H->nv - n; for (m = 1; m <= k; m++) { /* do while V != W; since here V is within W, we can use * equivalent condition: do while |V| < |W| */ if (V->size == W->size) break; /* check if C[m] is within W */ for (a = H->v[n + m]->in; a != NULL; a = a->h_next) { j = a->tail->i; if (W->pos[j] == 0) break; } if (a != NULL) continue; /* C[m] is within W, expand clique C[m] with vertex i */ /* C[m] := C[m] union {i} */ glp_add_arc(H, i, n + m); /* V is a set of vertices whose incident edges are already * covered by existing cliques */ /* V := V union C[m] */ for (a = H->v[n + m]->in; a != NULL; a = a->h_next) { j = a->tail->i; if (V->pos[j] == 0) V->list[++V->size] = j, V->pos[j] = V->size; } } /* remove from set W the vertices whose incident edges are * already covered by existing cliques */ /* W := W \ V, V := 0 */ for (t = 1; t <= V->size; t++) { j = V->list[t], V->pos[j] = 0; if (W->pos[j] != 0) { /* remove vertex j from W */ if (W->pos[j] != W->size) { int jj = W->list[W->size]; W->list[W->pos[j]] = jj; W->pos[jj] = W->pos[j]; } W->size--, W->pos[j] = 0; } } V->size = 0; /* now set W contains only vertices whose incident edges are * still not covered by existing cliques; create new cliques * to cover remaining edges until set W becomes empty */ while (W->size > 0) { /* find clique C[m], 1 <= m <= k, which shares maximal * number of vertices with W; to break ties choose clique * having smallest number m */ m = 0, best = -1; k = H->nv - n; for (t = 1; t <= k; t++) { /* compute cardinality of intersection of W and C[t] */ card = 0; for (a = H->v[n + t]->in; a != NULL; a = a->h_next) { j = a->tail->i; if (W->pos[j] != 0) card++; } if (best < card) m = t, best = card; } xassert(m > 0); /* set k := k + 1 and create new clique: * C[k] := (W intersect C[m]) union { i }, which covers all * edges incident to vertices from (W intersect C[m]) */ k = glp_add_vertices(H, 1) - n; for (a = H->v[n + m]->in; a != NULL; a = a->h_next) { j = a->tail->i; if (W->pos[j] != 0) { /* vertex j is in both W and C[m]; include it in new * clique C[k] */ glp_add_arc(H, j, n + k); /* remove vertex j from W, since edge (i,j) will be * covered by new clique C[k] */ if (W->pos[j] != W->size) { int jj = W->list[W->size]; W->list[W->pos[j]] = jj; W->pos[jj] = W->pos[j]; } W->size--, W->pos[j] = 0; } } /* include vertex i to new clique C[k] to cover edges (i,j) * incident to all vertices j just removed from W */ glp_add_arc(H, i, n + k); } } /* free working arrays */ xfree(W->list); xfree(W->pos); xfree(V->list); xfree(V->pos); /* return the number of cliques in the edge covering found */ return H->nv - n; } /* eof */ glpk-5.0/src/misc/keller.h0000644000062000006210000000233413766346220014655 0ustar maomkpasswd/* keller.h (cover edges by cliques, Kellerman's heuristic) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2009-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef KELLER_H #define KELLER_H #define kellerman _glp_kellerman int kellerman(int n, int (*func)(void *info, int i, int ind[]), void *info, void /* glp_graph */ *H); /* cover edges by cliques with Kellerman's heuristic */ #endif /* eof */ glpk-5.0/src/misc/ks.c0000644000062000006210000003525213766346220014014 0ustar maomkpasswd/* ks.c (0-1 knapsack problem) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2017-2018 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "ks.h" #include "mt1.h" /*********************************************************************** * 0-1 knapsack problem has the following formulation: * * maximize z = sum{j in 1..n} c[j]x[j] (1) * * s.t. sum{j in 1..n} a[j]x[j] <= b (2) * * x[j] in {0, 1} for all j in 1..n (3) * * In general case it is assumed that the instance is non-normalized, * i.e. parameters a, b, and c may have any sign. ***********************************************************************/ /*********************************************************************** * ks_enum - solve 0-1 knapsack problem by complete enumeration * * This routine finds optimal solution to 0-1 knapsack problem (1)-(3) * by complete enumeration. It is intended mainly for testing purposes. * * The instance to be solved is specified by parameters n, a, b, and c. * Note that these parameters can have any sign, i.e. normalization is * not needed. * * On exit the routine stores the optimal point found in locations * x[1], ..., x[n] and returns the optimal objective value. However, if * the instance is infeasible, the routine returns INT_MIN. * * Since the complete enumeration is inefficient, this routine can be * used only for small instances (n <= 20-30). */ #define N_MAX 40 int ks_enum(int n, const int a[/*1+n*/], int b, const int c[/*1+n*/], char x[/*1+n*/]) { int j, s, z, z_best; char x_best[1+N_MAX]; xassert(0 <= n && n <= N_MAX); /* initialization */ memset(&x[1], 0, n * sizeof(char)); z_best = INT_MIN; loop: /* compute constraint and objective at current x */ s = z = 0; for (j = 1; j <= n; j++) { if (x[j]) s += a[j], z += c[j]; } /* check constraint violation */ if (s > b) goto next; /* check objective function */ if (z_best < z) { /* better solution has been found */ memcpy(&x_best[1], &x[1], n * sizeof(char)); z_best = z; } next: /* generate next x */ for (j = 1; j <= n; j++) { if (!x[j]) { x[j] = 1; goto loop; } x[j] = 0; } /* report best (optimal) solution */ memcpy(&x[1], &x_best[1], n * sizeof(char)); return z_best; } /*********************************************************************** * reduce - prepare reduced instance of 0-1 knapsack * * Given original instance of 0-1 knapsack (1)-(3) specified by the * parameters n, a, b, and c this routine transforms it to equivalent * reduced instance in the same format. The reduced instance is * normalized, i.e. the following additional conditions are met: * * n >= 2 (4) * * 1 <= a[j] <= b for all j in 1..n (5) * * sum{j in 1..n} a[j] >= b+1 (6) * * c[j] >= 1 for all j in 1..n (7) * * The routine creates the structure ks and stores there parameters n, * a, b, and c of the reduced instance as well as template of solution * to original instance. * * Normally the routine returns a pointer to the structure ks created. * However, if the original instance is infeasible, the routine returns * a null pointer. */ struct ks { int orig_n; /* original problem dimension */ int n; /* reduced problem dimension */ int *a; /* int a[1+orig_n]; */ /* a{j in 1..n} are constraint coefficients (2) */ int b; /* b is constraint right-hand side (2) */ int *c; /* int c[1+orig_n]; */ /* c{j in 1..n} are objective coefficients (1) */ int c0; /* c0 is objective constant term */ char *x; /* char x[1+orig_n]; */ /* x{j in 1..orig_n} is solution template to original instance: * x[j] = 0 x[j] is fixed at 0 * x[j] = 1 x[j] is fixed at 1 * x[j] = 0x10 x[j] = x[j'] * x[j] = 0x11 x[j] = 1 - x[j'] * where x[j'] is corresponding solution to reduced instance */ }; static void free_ks(struct ks *ks); static struct ks *reduce(const int n, const int a[/*1+n*/], int b, const int c[/*1+n*/]) { struct ks *ks; int j, s; xassert(n >= 0); /* initially reduced instance is the same as original one */ ks = talloc(1, struct ks); ks->orig_n = n; ks->n = 0; ks->a = talloc(1+n, int); memcpy(&ks->a[1], &a[1], n * sizeof(int)); ks->b = b; ks->c = talloc(1+n, int); memcpy(&ks->c[1], &c[1], n * sizeof(int)); ks->c0 = 0; ks->x = talloc(1+n, char); /* make all a[j] non-negative */ for (j = 1; j <= n; j++) { if (a[j] >= 0) { /* keep original x[j] */ ks->x[j] = 0x10; } else /* a[j] < 0 */ { /* substitute x[j] = 1 - x'[j] */ ks->x[j] = 0x11; /* ... + a[j]x[j] + ... <= b * ... + a[j](1 - x'[j]) + ... <= b * ... - a[j]x'[j] + ... <= b - a[j] */ ks->a[j] = - ks->a[j]; ks->b += ks->a[j]; /* z = ... + c[j]x[j] + ... + c0 = * = ... + c[j](1 - x'[j]) + ... + c0 = * = ... - c[j]x'[j] + ... + (c0 + c[j]) */ ks->c0 += ks->c[j]; ks->c[j] = - ks->c[j]; } } /* now a[j] >= 0 for all j in 1..n */ if (ks->b < 0) { /* instance is infeasible */ free_ks(ks); return NULL; } /* build reduced instance */ for (j = 1; j <= n; j++) { if (ks->a[j] == 0) { if (ks->c[j] <= 0) { /* fix x[j] at 0 */ ks->x[j] ^= 0x10; } else { /* fix x[j] at 1 */ ks->x[j] ^= 0x11; ks->c0 += ks->c[j]; } } else if (ks->a[j] > ks->b || ks->c[j] <= 0) { /* fix x[j] at 0 */ ks->x[j] ^= 0x10; } else { /* include x[j] in reduced instance */ ks->n++; ks->a[ks->n] = ks->a[j]; ks->c[ks->n] = ks->c[j]; } } /* now conditions (5) and (7) are met */ /* check condition (6) */ s = 0; for (j = 1; j <= ks->n; j++) { xassert(1 <= ks->a[j] && ks->a[j] <= ks->b); xassert(ks->c[j] >= 1); s += ks->a[j]; } if (s <= ks->b) { /* sum{j in 1..n} a[j] <= b */ /* fix all remaining x[j] at 1 to obtain trivial solution */ for (j = 1; j <= n; j++) { if (ks->x[j] & 0x10) ks->x[j] ^= 0x11; } for (j = 1; j <= ks->n; j++) ks->c0 += ks->c[j]; /* reduced instance is empty */ ks->n = 0; } /* here n = 0 or n >= 2 due to condition (6) */ xassert(ks->n == 0 || ks->n >= 2); return ks; } /*********************************************************************** * restore - restore solution to original 0-1 knapsack instance * * Given optimal solution x{j in 1..ks->n} to the reduced 0-1 knapsack * instance (previously prepared by the routine reduce) this routine * constructs optimal solution to the original instance and stores it * in the array ks->x{j in 1..ks->orig_n}. * * On exit the routine returns optimal objective value for the original * instance. * * NOTE: This operation should be performed only once. */ static int restore(struct ks *ks, char x[]) { int j, k, z; z = ks->c0; for (j = 1, k = 0; j <= ks->orig_n; j++) { if (ks->x[j] & 0x10) { k++; xassert(k <= ks->n); xassert(x[k] == 0 || x[k] == 1); if (ks->x[j] & 1) ks->x[j] = 1 - x[k]; else ks->x[j] = x[k]; if (x[k]) z += ks->c[k]; } } xassert(k == ks->n); return z; } /*********************************************************************** * free_ks - deallocate structure ks * * This routine frees memory previously allocated to the structure ks * and all its components. */ static void free_ks(struct ks *ks) { xassert(ks != NULL); tfree(ks->a); tfree(ks->c); tfree(ks->x); tfree(ks); } /*********************************************************************** * ks_mt1 - solve 0-1 knapsack problem with Martello & Toth algorithm * * This routine finds optimal solution to 0-1 knapsack problem (1)-(3) * with Martello & Toth algorithm MT1. * * The instance to be solved is specified by parameters n, a, b, and c. * Note that these parameters can have any sign, i.e. normalization is * not needed. * * On exit the routine stores the optimal point found in locations * x[1], ..., x[n] and returns the optimal objective value. However, if * the instance is infeasible, the routine returns INT_MIN. * * REFERENCES * * S.Martello, P.Toth. Knapsack Problems: Algorithms and Computer Imp- * lementations. John Wiley & Sons, 1990. */ struct mt { int j; float r; /* r[j] = c[j] / a[j] */ }; static int CDECL fcmp(const void *p1, const void *p2) { if (((struct mt *)p1)->r > ((struct mt *)p2)->r) return -1; else if (((struct mt *)p1)->r < ((struct mt *)p2)->r) return +1; else return 0; } static int mt1a(int n, const int a[], int b, const int c[], char x[]) { /* interface routine to MT1 */ struct mt *mt; int j, z, *p, *w, *x1, *xx, *min, *psign, *wsign, *zsign; xassert(n >= 2); /* allocate working arrays */ mt = talloc(1+n, struct mt); p = talloc(1+n+1, int); w = talloc(1+n+1, int); x1 = talloc(1+n+1, int); xx = talloc(1+n+1, int); min = talloc(1+n+1, int); psign = talloc(1+n+1, int); wsign = talloc(1+n+1, int); zsign = talloc(1+n+1, int); /* reorder items to provide c[j] / a[j] >= a[j+1] / a[j+1] */ for (j = 1; j <= n; j++) { mt[j].j = j; mt[j].r = (float)c[j] / (float)a[j]; } qsort(&mt[1], n, sizeof(struct mt), fcmp); /* load instance parameters */ for (j = 1; j <= n; j++) { p[j] = c[mt[j].j]; w[j] = a[mt[j].j]; } /* find optimal solution */ z = mt1(n, p, w, b, x1, 1, xx, min, psign, wsign, zsign); xassert(z >= 0); /* store optimal point found */ for (j = 1; j <= n; j++) { xassert(x1[j] == 0 || x1[j] == 1); x[mt[j].j] = x1[j]; } /* free working arrays */ tfree(mt); tfree(p); tfree(w); tfree(x1); tfree(xx); tfree(min); tfree(psign); tfree(wsign); tfree(zsign); return z; } int ks_mt1(int n, const int a[/*1+n*/], int b, const int c[/*1+n*/], char x[/*1+n*/]) { struct ks *ks; int j, s1, s2, z; xassert(n >= 0); /* prepare reduced instance */ ks = reduce(n, a, b, c); if (ks == NULL) { /* original instance is infeasible */ return INT_MIN; } /* find optimal solution to reduced instance */ if (ks->n > 0) mt1a(ks->n, ks->a, ks->b, ks->c, x); /* restore solution to original instance */ z = restore(ks, x); memcpy(&x[1], &ks->x[1], n * sizeof(char)); free_ks(ks); /* check solution found */ s1 = s2 = 0; for (j = 1; j <= n; j++) { xassert(x[j] == 0 || x[j] == 1); if (x[j]) s1 += a[j], s2 += c[j]; } xassert(s1 <= b); xassert(s2 == z); return z; } /*********************************************************************** * ks_greedy - solve 0-1 knapsack problem with greedy heuristic * * This routine finds (sub)optimal solution to 0-1 knapsack problem * (1)-(3) with greedy heuristic. * * The instance to be solved is specified by parameters n, a, b, and c. * Note that these parameters can have any sign, i.e. normalization is * not needed. * * On exit the routine stores the optimal point found in locations * x[1], ..., x[n] and returns the optimal objective value. However, if * the instance is infeasible, the routine returns INT_MIN. */ static int greedy(int n, const int a[], int b, const int c[], char x[]) { /* core routine for normalized 0-1 knapsack instance */ struct mt *mt; int j, s, z; xassert(n >= 2); /* reorder items to provide c[j] / a[j] >= a[j+1] / a[j+1] */ mt = talloc(1+n, struct mt); for (j = 1; j <= n; j++) { mt[j].j = j; mt[j].r = (float)c[j] / (float)a[j]; } qsort(&mt[1], n, sizeof(struct mt), fcmp); /* take items starting from most valuable ones until the knapsack * is full */ s = z = 0; for (j = 1; j <= n; j++) { if (s + a[mt[j].j] > b) break; x[mt[j].j] = 1; s += a[mt[j].j]; z += c[mt[j].j]; } /* don't take remaining items */ for (j = j; j <= n; j++) x[mt[j].j] = 0; tfree(mt); return z; } int ks_greedy(int n, const int a[/*1+n*/], int b, const int c[/*1+n*/], char x[/*1+n*/]) { struct ks *ks; int j, s1, s2, z; xassert(n >= 0); /* prepare reduced instance */ ks = reduce(n, a, b, c); if (ks == NULL) { /* original instance is infeasible */ return INT_MIN; } /* find suboptimal solution to reduced instance */ if (ks->n > 0) greedy(ks->n, ks->a, ks->b, ks->c, x); /* restore solution to original instance */ z = restore(ks, x); memcpy(&x[1], &ks->x[1], n * sizeof(char)); free_ks(ks); /* check solution found */ s1 = s2 = 0; for (j = 1; j <= n; j++) { xassert(x[j] == 0 || x[j] == 1); if (x[j]) s1 += a[j], s2 += c[j]; } xassert(s1 <= b); xassert(s2 == z); return z; } /* eof */ glpk-5.0/src/misc/ks.h0000644000062000006210000000303013766346220014006 0ustar maomkpasswd/* ks.h (0-1 knapsack problem) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2017-2018 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef KS_H #define KS_H #define ks_enum _glp_ks_enum int ks_enum(int n, const int a[/*1+n*/], int b, const int c[/*1+n*/], char x[/*1+n*/]); /* solve 0-1 knapsack problem by complete enumeration */ #define ks_mt1 _glp_ks_mt1 int ks_mt1(int n, const int a[/*1+n*/], int b, const int c[/*1+n*/], char x[/*1+n*/]); /* solve 0-1 knapsack problem with Martello & Toth algorithm */ #define ks_greedy _glp_ks_greedy int ks_greedy(int n, const int a[/*1+n*/], int b, const int c[/*1+n*/], char x[/*1+n*/]); /* solve 0-1 knapsack problem with greedy heuristic */ #endif /* eof */ glpk-5.0/src/misc/mc13d.c0000644000062000006210000002444013766346220014303 0ustar maomkpasswd/* mc13d.c (permutations to block triangular form) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * * This code is the result of translation of the Fortran subroutines * MC13D and MC13E associated with the following paper: * * I.S.Duff, J.K.Reid, Algorithm 529: Permutations to block triangular * form, ACM Trans. on Math. Softw. 4 (1978), 189-192. * * Use of ACM Algorithms is subject to the ACM Software Copyright and * License Agreement. See . * * The translation was made by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "mc13d.h" /*********************************************************************** * NAME * * mc13d - permutations to block triangular form * * SYNOPSIS * * #include "mc13d.h" * int mc13d(int n, const int icn[], const int ip[], const int lenr[], * int ior[], int ib[], int lowl[], int numb[], int prev[]); * * DESCRIPTION * * Given the column numbers of the nonzeros in each row of the sparse * matrix, the routine mc13d finds a symmetric permutation that makes * the matrix block lower triangular. * * INPUT PARAMETERS * * n order of the matrix. * * icn array containing the column indices of the non-zeros. Those * belonging to a single row must be contiguous but the ordering * of column indices within each row is unimportant and wasted * space between rows is permitted. * * ip ip[i], i = 1,2,...,n, is the position in array icn of the * first column index of a non-zero in row i. * * lenr lenr[i], i = 1,2,...,n, is the number of non-zeros in row i. * * OUTPUT PARAMETERS * * ior ior[i], i = 1,2,...,n, gives the position on the original * ordering of the row or column which is in position i in the * permuted form. * * ib ib[i], i = 1,2,...,num, is the row number in the permuted * matrix of the beginning of block i, 1 <= num <= n. * * WORKING ARRAYS * * arp working array of length [1+n], where arp[0] is not used. * arp[i] is one less than the number of unsearched edges leaving * node i. At the end of the algorithm it is set to a permutation * which puts the matrix in block lower triangular form. * * ib working array of length [1+n], where ib[0] is not used. * ib[i] is the position in the ordering of the start of the ith * block. ib[n+1-i] holds the node number of the ith node on the * stack. * * lowl working array of length [1+n], where lowl[0] is not used. * lowl[i] is the smallest stack position of any node to which a * path from node i has been found. It is set to n+1 when node i * is removed from the stack. * * numb working array of length [1+n], where numb[0] is not used. * numb[i] is the position of node i in the stack if it is on it, * is the permuted order of node i for those nodes whose final * position has been found and is otherwise zero. * * prev working array of length [1+n], where prev[0] is not used. * prev[i] is the node at the end of the path when node i was * placed on the stack. * * RETURNS * * The routine mc13d returns num, the number of blocks found. */ int mc13d(int n, const int icn[], const int ip[], const int lenr[], int ior[], int ib[], int lowl[], int numb[], int prev[]) { int *arp = ior; int dummy, i, i1, i2, icnt, ii, isn, ist, ist1, iv, iw, j, lcnt, nnm1, num, stp; /* icnt is the number of nodes whose positions in final ordering * have been found. */ icnt = 0; /* num is the number of blocks that have been found. */ num = 0; nnm1 = n + n - 1; /* Initialization of arrays. */ for (j = 1; j <= n; j++) { numb[j] = 0; arp[j] = lenr[j] - 1; } for (isn = 1; isn <= n; isn++) { /* Look for a starting node. */ if (numb[isn] != 0) continue; iv = isn; /* ist is the number of nodes on the stack ... it is the stack * pointer. */ ist = 1; /* Put node iv at beginning of stack. */ lowl[iv] = numb[iv] = 1; ib[n] = iv; /* The body of this loop puts a new node on the stack or * backtracks. */ for (dummy = 1; dummy <= nnm1; dummy++) { i1 = arp[iv]; /* Have all edges leaving node iv been searched? */ if (i1 >= 0) { i2 = ip[iv] + lenr[iv] - 1; i1 = i2 - i1; /* Look at edges leaving node iv until one enters a new * node or all edges are exhausted. */ for (ii = i1; ii <= i2; ii++) { iw = icn[ii]; /* Has node iw been on stack already? */ if (numb[iw] == 0) goto L70; /* Update value of lowl[iv] if necessary. */ if (lowl[iw] < lowl[iv]) lowl[iv] = lowl[iw]; } /* There are no more edges leaving node iv. */ arp[iv] = -1; } /* Is node iv the root of a block? */ if (lowl[iv] < numb[iv]) goto L60; /* Order nodes in a block. */ num++; ist1 = n + 1 - ist; lcnt = icnt + 1; /* Peel block off the top of the stack starting at the top * and working down to the root of the block. */ for (stp = ist1; stp <= n; stp++) { iw = ib[stp]; lowl[iw] = n + 1; numb[iw] = ++icnt; if (iw == iv) break; } ist = n - stp; ib[num] = lcnt; /* Are there any nodes left on the stack? */ if (ist != 0) goto L60; /* Have all the nodes been ordered? */ if (icnt < n) break; goto L100; L60: /* Backtrack to previous node on path. */ iw = iv; iv = prev[iv]; /* Update value of lowl[iv] if necessary. */ if (lowl[iw] < lowl[iv]) lowl[iv] = lowl[iw]; continue; L70: /* Put new node on the stack. */ arp[iv] = i2 - ii - 1; prev[iw] = iv; iv = iw; lowl[iv] = numb[iv] = ++ist; ib[n+1-ist] = iv; } } L100: /* Put permutation in the required form. */ for (i = 1; i <= n; i++) arp[numb[i]] = i; return num; } /**********************************************************************/ #ifdef GLP_TEST #include "env.h" void test(int n, int ipp); int main(void) { /* test program for routine mc13d */ test( 1, 0); test( 2, 1); test( 2, 2); test( 3, 3); test( 4, 4); test( 5, 10); test(10, 10); test(10, 20); test(20, 20); test(20, 50); test(50, 50); test(50, 200); return 0; } void fa01bs(int max, int *nrand); void setup(int n, char a[1+50][1+50], int ip[], int icn[], int lenr[]); void test(int n, int ipp) { int ip[1+50], icn[1+1000], ior[1+50], ib[1+51], iw[1+150], lenr[1+50]; char a[1+50][1+50], hold[1+100]; int i, ii, iblock, ij, index, j, jblock, jj, k9, num; xprintf("\n\n\nMatrix is of order %d and has %d off-diagonal non-" "zeros\n", n, ipp); for (j = 1; j <= n; j++) { for (i = 1; i <= n; i++) a[i][j] = 0; a[j][j] = 1; } for (k9 = 1; k9 <= ipp; k9++) { /* these statements should be replaced by calls to your * favorite random number generator to place two pseudo-random * numbers between 1 and n in the variables i and j */ for (;;) { fa01bs(n, &i); fa01bs(n, &j); if (!a[i][j]) break; } a[i][j] = 1; } /* setup converts matrix a[i,j] to required sparsity-oriented * storage format */ setup(n, a, ip, icn, lenr); num = mc13d(n, icn, ip, lenr, ior, ib, &iw[0], &iw[n], &iw[n+n]); /* output reordered matrix with blocking to improve clarity */ xprintf("\nThe reordered matrix which has %d block%s is of the fo" "rm\n", num, num == 1 ? "" : "s"); ib[num+1] = n + 1; index = 100; iblock = 1; for (i = 1; i <= n; i++) { for (ij = 1; ij <= index; ij++) hold[ij] = ' '; if (i == ib[iblock]) { xprintf("\n"); iblock++; } jblock = 1; index = 0; for (j = 1; j <= n; j++) { if (j == ib[jblock]) { hold[++index] = ' '; jblock++; } ii = ior[i]; jj = ior[j]; hold[++index] = (char)(a[ii][jj] ? 'X' : '0'); } xprintf("%.*s\n", index, &hold[1]); } xprintf("\nThe starting point for each block is given by\n"); for (i = 1; i <= num; i++) { if ((i - 1) % 12 == 0) xprintf("\n"); xprintf(" %4d", ib[i]); } xprintf("\n"); return; } void setup(int n, char a[1+50][1+50], int ip[], int icn[], int lenr[]) { int i, j, ind; for (i = 1; i <= n; i++) lenr[i] = 0; ind = 1; for (i = 1; i <= n; i++) { ip[i] = ind; for (j = 1; j <= n; j++) { if (a[i][j]) { lenr[i]++; icn[ind++] = j; } } } return; } double g = 1431655765.0; double fa01as(int i) { /* random number generator */ g = fmod(g * 9228907.0, 4294967296.0); if (i >= 0) return g / 4294967296.0; else return 2.0 * g / 4294967296.0 - 1.0; } void fa01bs(int max, int *nrand) { *nrand = (int)(fa01as(1) * (double)max) + 1; return; } #endif /* eof */ glpk-5.0/src/misc/mc13d.h0000644000062000006210000000225513766346220014310 0ustar maomkpasswd/* mc13d.h */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2009-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef MC13D_H #define MC13D_H #define mc13d _glp_mc13d int mc13d(int n, const int icn[], const int ip[], const int lenr[], int ior[], int ib[], int lowl[], int numb[], int prev[]); /* permutations to block triangular form */ #endif /* eof */ glpk-5.0/src/misc/mc21a.c0000644000062000006210000002335213766346220014300 0ustar maomkpasswd/* mc21a.c (permutations for zero-free diagonal) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * * This code is the result of translation of the Fortran subroutines * MC21A and MC21B associated with the following paper: * * I.S.Duff, Algorithm 575: Permutations for zero-free diagonal, ACM * Trans. on Math. Softw. 7 (1981), 387-390. * * Use of ACM Algorithms is subject to the ACM Software Copyright and * License Agreement. See . * * The translation was made by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "mc21a.h" /*********************************************************************** * NAME * * mc21a - permutations for zero-free diagonal * * SYNOPSIS * * #include "mc21a.h" * int mc21a(int n, const int icn[], const int ip[], const int lenr[], * int iperm[], int pr[], int arp[], int cv[], int out[]); * * DESCRIPTION * * Given the pattern of nonzeros of a sparse matrix, the routine mc21a * attempts to find a permutation of its rows that makes the matrix have * no zeros on its diagonal. * * INPUT PARAMETERS * * n order of matrix. * * icn array containing the column indices of the non-zeros. Those * belonging to a single row must be contiguous but the ordering * of column indices within each row is unimportant and wasted * space between rows is permitted. * * ip ip[i], i = 1,2,...,n, is the position in array icn of the * first column index of a non-zero in row i. * * lenr lenr[i], i = 1,2,...,n, is the number of non-zeros in row i. * * OUTPUT PARAMETER * * iperm contains permutation to make diagonal have the smallest * number of zeros on it. Elements (iperm[i], i), i = 1,2,...,n, * are non-zero at the end of the algorithm unless the matrix is * structurally singular. In this case, (iperm[i], i) will be * zero for n - numnz entries. * * WORKING ARRAYS * * pr working array of length [1+n], where pr[0] is not used. * pr[i] is the previous row to i in the depth first search. * * arp working array of length [1+n], where arp[0] is not used. * arp[i] is one less than the number of non-zeros in row i which * have not been scanned when looking for a cheap assignment. * * cv working array of length [1+n], where cv[0] is not used. * cv[i] is the most recent row extension at which column i was * visited. * * out working array of length [1+n], where out[0] is not used. * out[i] is one less than the number of non-zeros in row i * which have not been scanned during one pass through the main * loop. * * RETURNS * * The routine mc21a returns numnz, the number of non-zeros on diagonal * of permuted matrix. */ int mc21a(int n, const int icn[], const int ip[], const int lenr[], int iperm[], int pr[], int arp[], int cv[], int out[]) { int i, ii, in1, in2, j, j1, jord, k, kk, numnz; /* Initialization of arrays. */ for (i = 1; i <= n; i++) { arp[i] = lenr[i] - 1; cv[i] = iperm[i] = 0; } numnz = 0; /* Main loop. */ /* Each pass round this loop either results in a new assignment * or gives a row with no assignment. */ for (jord = 1; jord <= n; jord++) { j = jord; pr[j] = -1; for (k = 1; k <= jord; k++) { /* Look for a cheap assignment. */ in1 = arp[j]; if (in1 >= 0) { in2 = ip[j] + lenr[j] - 1; in1 = in2 - in1; for (ii = in1; ii <= in2; ii++) { i = icn[ii]; if (iperm[i] == 0) goto L110; } /* No cheap assignment in row. */ arp[j] = -1; } /* Begin looking for assignment chain starting with row j.*/ out[j] = lenr[j] - 1; /* Inner loop. Extends chain by one or backtracks. */ for (kk = 1; kk <= jord; kk++) { in1 = out[j]; if (in1 >= 0) { in2 = ip[j] + lenr[j] - 1; in1 = in2 - in1; /* Forward scan. */ for (ii = in1; ii <= in2; ii++) { i = icn[ii]; if (cv[i] != jord) { /* Column i has not yet been accessed during * this pass. */ j1 = j; j = iperm[i]; cv[i] = jord; pr[j] = j1; out[j1] = in2 - ii - 1; goto L100; } } } /* Backtracking step. */ j = pr[j]; if (j == -1) goto L130; } L100: ; } L110: /* New assignment is made. */ iperm[i] = j; arp[j] = in2 - ii - 1; numnz++; for (k = 1; k <= jord; k++) { j = pr[j]; if (j == -1) break; ii = ip[j] + lenr[j] - out[j] - 2; i = icn[ii]; iperm[i] = j; } L130: ; } /* If matrix is structurally singular, we now complete the * permutation iperm. */ if (numnz < n) { for (i = 1; i <= n; i++) arp[i] = 0; k = 0; for (i = 1; i <= n; i++) { if (iperm[i] == 0) out[++k] = i; else arp[iperm[i]] = i; } k = 0; for (i = 1; i <= n; i++) { if (arp[i] == 0) iperm[out[++k]] = i; } } return numnz; } /**********************************************************************/ #ifdef GLP_TEST #include "env.h" int sing; void ranmat(int m, int n, int icn[], int iptr[], int nnnp1, int *knum, int iw[]); void fa01bs(int max, int *nrand); int main(void) { /* test program for the routine mc21a */ /* these runs on random matrices cause all possible statements in * mc21a to be executed */ int i, iold, j, j1, j2, jj, knum, l, licn, n, nov4, num, numnz; int ip[1+21], icn[1+1000], iperm[1+20], lenr[1+20], iw1[1+80]; licn = 1000; /* run on random matrices of orders 1 through 20 */ for (n = 1; n <= 20; n++) { nov4 = n / 4; if (nov4 < 1) nov4 = 1; L10: fa01bs(nov4, &l); knum = l * n; /* knum is requested number of non-zeros in random matrix */ if (knum > licn) goto L10; /* if sing is false, matrix is guaranteed structurally * non-singular */ sing = ((n / 2) * 2 == n); /* call to subroutine to generate random matrix */ ranmat(n, n, icn, ip, n+1, &knum, iw1); /* knum is now actual number of non-zeros in random matrix */ if (knum > licn) goto L10; xprintf("n = %2d; nz = %4d; sing = %d\n", n, knum, sing); /* set up array of row lengths */ for (i = 1; i <= n; i++) lenr[i] = ip[i+1] - ip[i]; /* call to mc21a */ numnz = mc21a(n, icn, ip, lenr, iperm, &iw1[0], &iw1[n], &iw1[n+n], &iw1[n+n+n]); /* testing to see if there are numnz non-zeros on the diagonal * of the permuted matrix. */ num = 0; for (i = 1; i <= n; i++) { iold = iperm[i]; j1 = ip[iold]; j2 = j1 + lenr[iold] - 1; if (j2 < j1) continue; for (jj = j1; jj <= j2; jj++) { j = icn[jj]; if (j == i) { num++; break; } } } if (num != numnz) xprintf("Failure in mc21a, numnz = %d instead of %d\n", numnz, num); } return 0; } void ranmat(int m, int n, int icn[], int iptr[], int nnnp1, int *knum, int iw[]) { /* subroutine to generate random matrix */ int i, ii, inum, j, lrow, matnum; inum = (*knum / n) * 2; if (inum > n-1) inum = n-1; matnum = 1; /* each pass through this loop generates a row of the matrix */ for (j = 1; j <= m; j++) { iptr[j] = matnum; if (!(sing || j > n)) icn[matnum++] = j; if (n == 1) continue; for (i = 1; i <= n; i++) iw[i] = 0; if (!sing) iw[j] = 1; fa01bs(inum, &lrow); lrow--; if (lrow == 0) continue; /* lrow off-diagonal non-zeros in row j of the matrix */ for (ii = 1; ii <= lrow; ii++) { for (;;) { fa01bs(n, &i); if (iw[i] != 1) break; } iw[i] = 1; icn[matnum++] = i; } } for (i = m+1; i <= nnnp1; i++) iptr[i] = matnum; *knum = matnum - 1; return; } double g = 1431655765.0; double fa01as(int i) { /* random number generator */ g = fmod(g * 9228907.0, 4294967296.0); if (i >= 0) return g / 4294967296.0; else return 2.0 * g / 4294967296.0 - 1.0; } void fa01bs(int max, int *nrand) { *nrand = (int)(fa01as(1) * (double)max) + 1; return; } #endif /* eof */ glpk-5.0/src/misc/mc21a.h0000644000062000006210000000231713766346220014303 0ustar maomkpasswd/* mc21a.h (permutations for zero-free diagonal) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2009-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef MC21A_H #define MC21A_H #define mc21a _glp_mc21a int mc21a(int n, const int icn[], const int ip[], const int lenr[], int iperm[], int pr[], int arp[], int cv[], int out[]); /* permutations for zero-free diagonal */ #endif /* eof */ glpk-5.0/src/misc/misc.h0000644000062000006210000000360113766346220014330 0ustar maomkpasswd/* misc.h (miscellaneous routines) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2000-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef MISC_H #define MISC_H #define str2int _glp_str2int int str2int(const char *str, int *val); /* convert character string to value of int type */ #define str2num _glp_str2num int str2num(const char *str, double *val); /* convert character string to value of double type */ #define strspx _glp_strspx char *strspx(char *str); /* remove all spaces from character string */ #define strtrim _glp_strtrim char *strtrim(char *str); /* remove trailing spaces from character string */ #define gcd _glp_gcd int gcd(int x, int y); /* find greatest common divisor of two integers */ #define gcdn _glp_gcdn int gcdn(int n, int x[]); /* find greatest common divisor of n integers */ #define round2n _glp_round2n double round2n(double x); /* round floating-point number to nearest power of two */ #define fp2rat _glp_fp2rat int fp2rat(double x, double eps, double *p, double *q); /* convert floating-point number to rational number */ #endif /* eof */ glpk-5.0/src/misc/mt1.c0000644000062000006210000005447013766346220014103 0ustar maomkpasswd/* mt1.c (0-1 knapsack problem; Martello & Toth algorithm) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * * THIS CODE IS THE RESULT OF TRANSLATION OF THE FORTRAN SUBROUTINES * MT1 FROM THE BOOK: * * SILVANO MARTELLO, PAOLO TOTH. KNAPSACK PROBLEMS: ALGORITHMS AND * COMPUTER IMPLEMENTATIONS. JOHN WILEY & SONS, 1990. * * THE TRANSLATION HAS BEEN DONE WITH THE PERMISSION OF THE AUTHORS OF * THE ORIGINAL FORTRAN SUBROUTINES: SILVANO MARTELLO AND PAOLO TOTH. * * The translation was made by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #line 1 "" /* -- translated by f2c (version 20100827). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #if 0 /* by mao */ #include "f2c.h" #else #include "env.h" #include "mt1.h" typedef int integer; typedef float real; #endif #line 1 "" /*< SUBROUTINE MT1(N,P,W,C,Z,X,JDIM,JCK,XX,MIN,PSIGN,WSIGN,ZSIGN) >*/ #if 1 /* by mao */ static int chmt1_(int *, int *, int *, int *, int *, int *); static #endif /* Subroutine */ int mt1_(integer *n, integer *p, integer *w, integer *c__, integer *z__, integer *x, integer *jdim, integer *jck, integer *xx, integer *min__, integer *psign, integer *wsign, integer *zsign) { /* System generated locals */ integer i__1; /* Local variables */ static real a, b; static integer j, r__, t, j1, n1, ch, ii, jj, kk, in, ll, ip, nn, iu, ii1, chs, lim, lim1, diff, lold, mink; extern /* Subroutine */ int chmt1_(integer *, integer *, integer *, integer *, integer *, integer *); static integer profit; /* THIS SUBROUTINE SOLVES THE 0-1 SINGLE KNAPSACK PROBLEM */ /* MAXIMIZE Z = P(1)*X(1) + ... + P(N)*X(N) */ /* SUBJECT TO: W(1)*X(1) + ... + W(N)*X(N) .LE. C , */ /* X(J) = 0 OR 1 FOR J=1,...,N. */ /* THE PROGRAM IS INCLUDED IN THE VOLUME */ /* S. MARTELLO, P. TOTH, "KNAPSACK PROBLEMS: ALGORITHMS */ /* AND COMPUTER IMPLEMENTATIONS", JOHN WILEY, 1990 */ /* AND IMPLEMENTS THE BRANCH-AND-BOUND ALGORITHM DESCRIBED IN */ /* SECTION 2.5.2 . */ /* THE PROGRAM DERIVES FROM AN EARLIER CODE PRESENTED IN */ /* S. MARTELLO, P. TOTH, "ALGORITHM FOR THE SOLUTION OF THE 0-1 SINGLE */ /* KNAPSACK PROBLEM", COMPUTING, 1978. */ /* THE INPUT PROBLEM MUST SATISFY THE CONDITIONS */ /* 1) 2 .LE. N .LE. JDIM - 1 ; */ /* 2) P(J), W(J), C POSITIVE INTEGERS; */ /* 3) MAX (W(J)) .LE. C ; */ /* 4) W(1) + ... + W(N) .GT. C ; */ /* 5) P(J)/W(J) .GE. P(J+1)/W(J+1) FOR J=1,...,N-1. */ /* MT1 CALLS 1 PROCEDURE: CHMT1. */ /* THE PROGRAM IS COMPLETELY SELF-CONTAINED AND COMMUNICATION TO IT IS */ /* ACHIEVED SOLELY THROUGH THE PARAMETER LIST OF MT1. */ /* NO MACHINE-DEPENDENT CONSTANT IS USED. */ /* THE PROGRAM IS WRITTEN IN 1967 AMERICAN NATIONAL STANDARD FORTRAN */ /* AND IS ACCEPTED BY THE PFORT VERIFIER (PFORT IS THE PORTABLE */ /* SUBSET OF ANSI DEFINED BY THE ASSOCIATION FOR COMPUTING MACHINERY). */ /* THE PROGRAM HAS BEEN TESTED ON A DIGITAL VAX 11/780 AND AN H.P. */ /* 9000/840. */ /* MT1 NEEDS 8 ARRAYS ( P , W , X , XX , MIN , PSIGN , WSIGN */ /* AND ZSIGN ) OF LENGTH AT LEAST N + 1 . */ /* MEANING OF THE INPUT PARAMETERS: */ /* N = NUMBER OF ITEMS; */ /* P(J) = PROFIT OF ITEM J (J=1,...,N); */ /* W(J) = WEIGHT OF ITEM J (J=1,...,N); */ /* C = CAPACITY OF THE KNAPSACK; */ /* JDIM = DIMENSION OF THE 8 ARRAYS; */ /* JCK = 1 IF CHECK ON THE INPUT DATA IS DESIRED, */ /* = 0 OTHERWISE. */ /* MEANING OF THE OUTPUT PARAMETERS: */ /* Z = VALUE OF THE OPTIMAL SOLUTION IF Z .GT. 0 , */ /* = ERROR IN THE INPUT DATA (WHEN JCK=1) IF Z .LT. 0 : CONDI- */ /* TION - Z IS VIOLATED; */ /* X(J) = 1 IF ITEM J IS IN THE OPTIMAL SOLUTION, */ /* = 0 OTHERWISE. */ /* ARRAYS XX, MIN, PSIGN, WSIGN AND ZSIGN ARE DUMMY. */ /* ALL THE PARAMETERS ARE INTEGER. ON RETURN OF MT1 ALL THE INPUT */ /* PARAMETERS ARE UNCHANGED. */ /*< INTEGER P(JDIM),W(JDIM),X(JDIM),C,Z >*/ /*< INTEGER XX(JDIM),MIN(JDIM),PSIGN(JDIM),WSIGN(JDIM),ZSIGN(JDIM) >*/ /*< INTEGER CH,CHS,DIFF,PROFIT,R,T >*/ /*< Z = 0 >*/ #line 65 "" /* Parameter adjustments */ #line 65 "" --zsign; #line 65 "" --wsign; #line 65 "" --psign; #line 65 "" --min__; #line 65 "" --xx; #line 65 "" --x; #line 65 "" --w; #line 65 "" --p; #line 65 "" #line 65 "" /* Function Body */ #line 65 "" *z__ = 0; /*< IF ( JCK .EQ. 1 ) CALL CHMT1(N,P,W,C,Z,JDIM) >*/ #line 66 "" if (*jck == 1) { #line 66 "" chmt1_(n, &p[1], &w[1], c__, z__, jdim); #line 66 "" } /*< IF ( Z .LT. 0 ) RETURN >*/ #line 67 "" if (*z__ < 0) { #line 67 "" return 0; #line 67 "" } /* INITIALIZE. */ /*< CH = C >*/ #line 69 "" ch = *c__; /*< IP = 0 >*/ #line 70 "" ip = 0; /*< CHS = CH >*/ #line 71 "" chs = ch; /*< DO 10 LL=1,N >*/ #line 72 "" i__1 = *n; #line 72 "" for (ll = 1; ll <= i__1; ++ll) { /*< IF ( W(LL) .GT. CHS ) GO TO 20 >*/ #line 73 "" if (w[ll] > chs) { #line 73 "" goto L20; #line 73 "" } /*< IP = IP + P(LL) >*/ #line 74 "" ip += p[ll]; /*< CHS = CHS - W(LL) >*/ #line 75 "" chs -= w[ll]; /*< 10 CONTINUE >*/ #line 76 "" /* L10: */ #line 76 "" } /*< 20 LL = LL - 1 >*/ #line 77 "" L20: #line 77 "" --ll; /*< IF ( CHS .EQ. 0 ) GO TO 50 >*/ #line 78 "" if (chs == 0) { #line 78 "" goto L50; #line 78 "" } /*< P(N+1) = 0 >*/ #line 79 "" p[*n + 1] = 0; /*< W(N+1) = CH + 1 >*/ #line 80 "" w[*n + 1] = ch + 1; /*< LIM = IP + CHS*P(LL+2)/W(LL+2) >*/ #line 81 "" lim = ip + chs * p[ll + 2] / w[ll + 2]; /*< A = W(LL+1) - CHS >*/ #line 82 "" a = (real) (w[ll + 1] - chs); /*< B = IP + P(LL+1) >*/ #line 83 "" b = (real) (ip + p[ll + 1]); /*< LIM1 = B - A*FLOAT(P(LL))/FLOAT(W(LL)) >*/ #line 84 "" lim1 = b - a * (real) p[ll] / (real) w[ll]; /*< IF ( LIM1 .GT. LIM ) LIM = LIM1 >*/ #line 85 "" if (lim1 > lim) { #line 85 "" lim = lim1; #line 85 "" } /*< MINK = CH + 1 >*/ #line 86 "" mink = ch + 1; /*< MIN(N) = MINK >*/ #line 87 "" min__[*n] = mink; /*< DO 30 J=2,N >*/ #line 88 "" i__1 = *n; #line 88 "" for (j = 2; j <= i__1; ++j) { /*< KK = N + 2 - J >*/ #line 89 "" kk = *n + 2 - j; /*< IF ( W(KK) .LT. MINK ) MINK = W(KK) >*/ #line 90 "" if (w[kk] < mink) { #line 90 "" mink = w[kk]; #line 90 "" } /*< MIN(KK-1) = MINK >*/ #line 91 "" min__[kk - 1] = mink; /*< 30 CONTINUE >*/ #line 92 "" /* L30: */ #line 92 "" } /*< DO 40 J=1,N >*/ #line 93 "" i__1 = *n; #line 93 "" for (j = 1; j <= i__1; ++j) { /*< XX(J) = 0 >*/ #line 94 "" xx[j] = 0; /*< 40 CONTINUE >*/ #line 95 "" /* L40: */ #line 95 "" } /*< Z = 0 >*/ #line 96 "" *z__ = 0; /*< PROFIT = 0 >*/ #line 97 "" profit = 0; /*< LOLD = N >*/ #line 98 "" lold = *n; /*< II = 1 >*/ #line 99 "" ii = 1; /*< GO TO 170 >*/ #line 100 "" goto L170; /*< 50 Z = IP >*/ #line 101 "" L50: #line 101 "" *z__ = ip; /*< DO 60 J=1,LL >*/ #line 102 "" i__1 = ll; #line 102 "" for (j = 1; j <= i__1; ++j) { /*< X(J) = 1 >*/ #line 103 "" x[j] = 1; /*< 60 CONTINUE >*/ #line 104 "" /* L60: */ #line 104 "" } /*< NN = LL + 1 >*/ #line 105 "" nn = ll + 1; /*< DO 70 J=NN,N >*/ #line 106 "" i__1 = *n; #line 106 "" for (j = nn; j <= i__1; ++j) { /*< X(J) = 0 >*/ #line 107 "" x[j] = 0; /*< 70 CONTINUE >*/ #line 108 "" /* L70: */ #line 108 "" } /*< RETURN >*/ #line 109 "" return 0; /* TRY TO INSERT THE II-TH ITEM INTO THE CURRENT SOLUTION. */ /*< 80 IF ( W(II) .LE. CH ) GO TO 90 >*/ #line 111 "" L80: #line 111 "" if (w[ii] <= ch) { #line 111 "" goto L90; #line 111 "" } /*< II1 = II + 1 >*/ #line 112 "" ii1 = ii + 1; /*< IF ( Z .GE. CH*P(II1)/W(II1) + PROFIT ) GO TO 280 >*/ #line 113 "" if (*z__ >= ch * p[ii1] / w[ii1] + profit) { #line 113 "" goto L280; #line 113 "" } /*< II = II1 >*/ #line 114 "" ii = ii1; /*< GO TO 80 >*/ #line 115 "" goto L80; /* BUILD A NEW CURRENT SOLUTION. */ /*< 90 IP = PSIGN(II) >*/ #line 117 "" L90: #line 117 "" ip = psign[ii]; /*< CHS = CH - WSIGN(II) >*/ #line 118 "" chs = ch - wsign[ii]; /*< IN = ZSIGN(II) >*/ #line 119 "" in = zsign[ii]; /*< DO 100 LL=IN,N >*/ #line 120 "" i__1 = *n; #line 120 "" for (ll = in; ll <= i__1; ++ll) { /*< IF ( W(LL) .GT. CHS ) GO TO 160 >*/ #line 121 "" if (w[ll] > chs) { #line 121 "" goto L160; #line 121 "" } /*< IP = IP + P(LL) >*/ #line 122 "" ip += p[ll]; /*< CHS = CHS - W(LL) >*/ #line 123 "" chs -= w[ll]; /*< 100 CONTINUE >*/ #line 124 "" /* L100: */ #line 124 "" } /*< LL = N >*/ #line 125 "" ll = *n; /*< 110 IF ( Z .GE. IP + PROFIT ) GO TO 280 >*/ #line 126 "" L110: #line 126 "" if (*z__ >= ip + profit) { #line 126 "" goto L280; #line 126 "" } /*< Z = IP + PROFIT >*/ #line 127 "" *z__ = ip + profit; /*< NN = II - 1 >*/ #line 128 "" nn = ii - 1; /*< DO 120 J=1,NN >*/ #line 129 "" i__1 = nn; #line 129 "" for (j = 1; j <= i__1; ++j) { /*< X(J) = XX(J) >*/ #line 130 "" x[j] = xx[j]; /*< 120 CONTINUE >*/ #line 131 "" /* L120: */ #line 131 "" } /*< DO 130 J=II,LL >*/ #line 132 "" i__1 = ll; #line 132 "" for (j = ii; j <= i__1; ++j) { /*< X(J) = 1 >*/ #line 133 "" x[j] = 1; /*< 130 CONTINUE >*/ #line 134 "" /* L130: */ #line 134 "" } /*< IF ( LL .EQ. N ) GO TO 150 >*/ #line 135 "" if (ll == *n) { #line 135 "" goto L150; #line 135 "" } /*< NN = LL + 1 >*/ #line 136 "" nn = ll + 1; /*< DO 140 J=NN,N >*/ #line 137 "" i__1 = *n; #line 137 "" for (j = nn; j <= i__1; ++j) { /*< X(J) = 0 >*/ #line 138 "" x[j] = 0; /*< 140 CONTINUE >*/ #line 139 "" /* L140: */ #line 139 "" } /*< 150 IF ( Z .NE. LIM ) GO TO 280 >*/ #line 140 "" L150: #line 140 "" if (*z__ != lim) { #line 140 "" goto L280; #line 140 "" } /*< RETURN >*/ #line 141 "" return 0; /*< 160 IU = CHS*P(LL)/W(LL) >*/ #line 142 "" L160: #line 142 "" iu = chs * p[ll] / w[ll]; /*< LL = LL - 1 >*/ #line 143 "" --ll; /*< IF ( IU .EQ. 0 ) GO TO 110 >*/ #line 144 "" if (iu == 0) { #line 144 "" goto L110; #line 144 "" } /*< IF ( Z .GE. PROFIT + IP + IU ) GO TO 280 >*/ #line 145 "" if (*z__ >= profit + ip + iu) { #line 145 "" goto L280; #line 145 "" } /* SAVE THE CURRENT SOLUTION. */ /*< 170 WSIGN(II) = CH - CHS >*/ #line 147 "" L170: #line 147 "" wsign[ii] = ch - chs; /*< PSIGN(II) = IP >*/ #line 148 "" psign[ii] = ip; /*< ZSIGN(II) = LL + 1 >*/ #line 149 "" zsign[ii] = ll + 1; /*< XX(II) = 1 >*/ #line 150 "" xx[ii] = 1; /*< NN = LL - 1 >*/ #line 151 "" nn = ll - 1; /*< IF ( NN .LT. II) GO TO 190 >*/ #line 152 "" if (nn < ii) { #line 152 "" goto L190; #line 152 "" } /*< DO 180 J=II,NN >*/ #line 153 "" i__1 = nn; #line 153 "" for (j = ii; j <= i__1; ++j) { /*< WSIGN(J+1) = WSIGN(J) - W(J) >*/ #line 154 "" wsign[j + 1] = wsign[j] - w[j]; /*< PSIGN(J+1) = PSIGN(J) - P(J) >*/ #line 155 "" psign[j + 1] = psign[j] - p[j]; /*< ZSIGN(J+1) = LL + 1 >*/ #line 156 "" zsign[j + 1] = ll + 1; /*< XX(J+1) = 1 >*/ #line 157 "" xx[j + 1] = 1; /*< 180 CONTINUE >*/ #line 158 "" /* L180: */ #line 158 "" } /*< 190 J1 = LL + 1 >*/ #line 159 "" L190: #line 159 "" j1 = ll + 1; /*< DO 200 J=J1,LOLD >*/ #line 160 "" i__1 = lold; #line 160 "" for (j = j1; j <= i__1; ++j) { /*< WSIGN(J) = 0 >*/ #line 161 "" wsign[j] = 0; /*< PSIGN(J) = 0 >*/ #line 162 "" psign[j] = 0; /*< ZSIGN(J) = J >*/ #line 163 "" zsign[j] = j; /*< 200 CONTINUE >*/ #line 164 "" /* L200: */ #line 164 "" } /*< LOLD = LL >*/ #line 165 "" lold = ll; /*< CH = CHS >*/ #line 166 "" ch = chs; /*< PROFIT = PROFIT + IP >*/ #line 167 "" profit += ip; /*< IF ( LL - (N - 2) ) 240, 220, 210 >*/ #line 168 "" if ((i__1 = ll - (*n - 2)) < 0) { #line 168 "" goto L240; #line 168 "" } else if (i__1 == 0) { #line 168 "" goto L220; #line 168 "" } else { #line 168 "" goto L210; #line 168 "" } /*< 210 II = N >*/ #line 169 "" L210: #line 169 "" ii = *n; /*< GO TO 250 >*/ #line 170 "" goto L250; /*< 220 IF ( CH .LT. W(N) ) GO TO 230 >*/ #line 171 "" L220: #line 171 "" if (ch < w[*n]) { #line 171 "" goto L230; #line 171 "" } /*< CH = CH - W(N) >*/ #line 172 "" ch -= w[*n]; /*< PROFIT = PROFIT + P(N) >*/ #line 173 "" profit += p[*n]; /*< XX(N) = 1 >*/ #line 174 "" xx[*n] = 1; /*< 230 II = N - 1 >*/ #line 175 "" L230: #line 175 "" ii = *n - 1; /*< GO TO 250 >*/ #line 176 "" goto L250; /*< 240 II = LL + 2 >*/ #line 177 "" L240: #line 177 "" ii = ll + 2; /*< IF ( CH .GE. MIN(II-1) ) GO TO 80 >*/ #line 178 "" if (ch >= min__[ii - 1]) { #line 178 "" goto L80; #line 178 "" } /* SAVE THE CURRENT OPTIMAL SOLUTION. */ /*< 250 IF ( Z .GE. PROFIT ) GO TO 270 >*/ #line 180 "" L250: #line 180 "" if (*z__ >= profit) { #line 180 "" goto L270; #line 180 "" } /*< Z = PROFIT >*/ #line 181 "" *z__ = profit; /*< DO 260 J=1,N >*/ #line 182 "" i__1 = *n; #line 182 "" for (j = 1; j <= i__1; ++j) { /*< X(J) = XX(J) >*/ #line 183 "" x[j] = xx[j]; /*< 260 CONTINUE >*/ #line 184 "" /* L260: */ #line 184 "" } /*< IF ( Z .EQ. LIM ) RETURN >*/ #line 185 "" if (*z__ == lim) { #line 185 "" return 0; #line 185 "" } /*< 270 IF ( XX(N) .EQ. 0 ) GO TO 280 >*/ #line 186 "" L270: #line 186 "" if (xx[*n] == 0) { #line 186 "" goto L280; #line 186 "" } /*< XX(N) = 0 >*/ #line 187 "" xx[*n] = 0; /*< CH = CH + W(N) >*/ #line 188 "" ch += w[*n]; /*< PROFIT = PROFIT - P(N) >*/ #line 189 "" profit -= p[*n]; /* BACKTRACK. */ /*< 280 NN = II - 1 >*/ #line 191 "" L280: #line 191 "" nn = ii - 1; /*< IF ( NN .EQ. 0 ) RETURN >*/ #line 192 "" if (nn == 0) { #line 192 "" return 0; #line 192 "" } /*< DO 290 J=1,NN >*/ #line 193 "" i__1 = nn; #line 193 "" for (j = 1; j <= i__1; ++j) { /*< KK = II - J >*/ #line 194 "" kk = ii - j; /*< IF ( XX(KK) .EQ. 1 ) GO TO 300 >*/ #line 195 "" if (xx[kk] == 1) { #line 195 "" goto L300; #line 195 "" } /*< 290 CONTINUE >*/ #line 196 "" /* L290: */ #line 196 "" } /*< RETURN >*/ #line 197 "" return 0; /*< 300 R = CH >*/ #line 198 "" L300: #line 198 "" r__ = ch; /*< CH = CH + W(KK) >*/ #line 199 "" ch += w[kk]; /*< PROFIT = PROFIT - P(KK) >*/ #line 200 "" profit -= p[kk]; /*< XX(KK) = 0 >*/ #line 201 "" xx[kk] = 0; /*< IF ( R .LT. MIN(KK) ) GO TO 310 >*/ #line 202 "" if (r__ < min__[kk]) { #line 202 "" goto L310; #line 202 "" } /*< II = KK + 1 >*/ #line 203 "" ii = kk + 1; /*< GO TO 80 >*/ #line 204 "" goto L80; /*< 310 NN = KK + 1 >*/ #line 205 "" L310: #line 205 "" nn = kk + 1; /*< II = KK >*/ #line 206 "" ii = kk; /* TRY TO SUBSTITUTE THE NN-TH ITEM FOR THE KK-TH. */ /*< 320 IF ( Z .GE. PROFIT + CH*P(NN)/W(NN) ) GO TO 280 >*/ #line 208 "" L320: #line 208 "" if (*z__ >= profit + ch * p[nn] / w[nn]) { #line 208 "" goto L280; #line 208 "" } /*< DIFF = W(NN) - W(KK) >*/ #line 209 "" diff = w[nn] - w[kk]; /*< IF ( DIFF ) 370, 330, 340 >*/ #line 210 "" if (diff < 0) { #line 210 "" goto L370; #line 210 "" } else if (diff == 0) { #line 210 "" goto L330; #line 210 "" } else { #line 210 "" goto L340; #line 210 "" } /*< 330 NN = NN + 1 >*/ #line 211 "" L330: #line 211 "" ++nn; /*< GO TO 320 >*/ #line 212 "" goto L320; /*< 340 IF ( DIFF .GT. R ) GO TO 330 >*/ #line 213 "" L340: #line 213 "" if (diff > r__) { #line 213 "" goto L330; #line 213 "" } /*< IF ( Z .GE. PROFIT + P(NN) ) GO TO 330 >*/ #line 214 "" if (*z__ >= profit + p[nn]) { #line 214 "" goto L330; #line 214 "" } /*< Z = PROFIT + P(NN) >*/ #line 215 "" *z__ = profit + p[nn]; /*< DO 350 J=1,KK >*/ #line 216 "" i__1 = kk; #line 216 "" for (j = 1; j <= i__1; ++j) { /*< X(J) = XX(J) >*/ #line 217 "" x[j] = xx[j]; /*< 350 CONTINUE >*/ #line 218 "" /* L350: */ #line 218 "" } /*< JJ = KK + 1 >*/ #line 219 "" jj = kk + 1; /*< DO 360 J=JJ,N >*/ #line 220 "" i__1 = *n; #line 220 "" for (j = jj; j <= i__1; ++j) { /*< X(J) = 0 >*/ #line 221 "" x[j] = 0; /*< 360 CONTINUE >*/ #line 222 "" /* L360: */ #line 222 "" } /*< X(NN) = 1 >*/ #line 223 "" x[nn] = 1; /*< IF ( Z .EQ. LIM ) RETURN >*/ #line 224 "" if (*z__ == lim) { #line 224 "" return 0; #line 224 "" } /*< R = R - DIFF >*/ #line 225 "" r__ -= diff; /*< KK = NN >*/ #line 226 "" kk = nn; /*< NN = NN + 1 >*/ #line 227 "" ++nn; /*< GO TO 320 >*/ #line 228 "" goto L320; /*< 370 T = R - DIFF >*/ #line 229 "" L370: #line 229 "" t = r__ - diff; /*< IF ( T .LT. MIN(NN) ) GO TO 330 >*/ #line 230 "" if (t < min__[nn]) { #line 230 "" goto L330; #line 230 "" } /*< IF ( Z .GE. PROFIT + P(NN) + T*P(NN+1)/W(NN+1)) GO TO 280 >*/ #line 231 "" if (*z__ >= profit + p[nn] + t * p[nn + 1] / w[nn + 1]) { #line 231 "" goto L280; #line 231 "" } /*< CH = CH - W(NN) >*/ #line 232 "" ch -= w[nn]; /*< PROFIT = PROFIT + P(NN) >*/ #line 233 "" profit += p[nn]; /*< XX(NN) = 1 >*/ #line 234 "" xx[nn] = 1; /*< II = NN + 1 >*/ #line 235 "" ii = nn + 1; /*< WSIGN(NN) = W(NN) >*/ #line 236 "" wsign[nn] = w[nn]; /*< PSIGN(NN) = P(NN) >*/ #line 237 "" psign[nn] = p[nn]; /*< ZSIGN(NN) = II >*/ #line 238 "" zsign[nn] = ii; /*< N1 = NN + 1 >*/ #line 239 "" n1 = nn + 1; /*< DO 380 J=N1,LOLD >*/ #line 240 "" i__1 = lold; #line 240 "" for (j = n1; j <= i__1; ++j) { /*< WSIGN(J) = 0 >*/ #line 241 "" wsign[j] = 0; /*< PSIGN(J) = 0 >*/ #line 242 "" psign[j] = 0; /*< ZSIGN(J) = J >*/ #line 243 "" zsign[j] = j; /*< 380 CONTINUE >*/ #line 244 "" /* L380: */ #line 244 "" } /*< LOLD = NN >*/ #line 245 "" lold = nn; /*< GO TO 80 >*/ #line 246 "" goto L80; /*< END >*/ } /* mt1_ */ /*< SUBROUTINE CHMT1(N,P,W,C,Z,JDIM) >*/ #if 1 /* by mao */ static #endif /* Subroutine */ int chmt1_(integer *n, integer *p, integer *w, integer *c__, integer *z__, integer *jdim) { /* System generated locals */ integer i__1; /* Local variables */ static integer j; static real r__, rr; static integer jsw; /* CHECK THE INPUT DATA. */ /*< INTEGER P(JDIM),W(JDIM),C,Z >*/ /*< IF ( N .GE. 2 .AND. N .LE. JDIM - 1 ) GO TO 10 >*/ #line 253 "" /* Parameter adjustments */ #line 253 "" --w; #line 253 "" --p; #line 253 "" #line 253 "" /* Function Body */ #line 253 "" if (*n >= 2 && *n <= *jdim - 1) { #line 253 "" goto L10; #line 253 "" } /*< Z = - 1 >*/ #line 254 "" *z__ = -1; /*< RETURN >*/ #line 255 "" return 0; /*< 10 IF ( C .GT. 0 ) GO TO 30 >*/ #line 256 "" L10: #line 256 "" if (*c__ > 0) { #line 256 "" goto L30; #line 256 "" } /*< 20 Z = - 2 >*/ #line 257 "" L20: #line 257 "" *z__ = -2; /*< RETURN >*/ #line 258 "" return 0; /*< 30 JSW = 0 >*/ #line 259 "" L30: #line 259 "" jsw = 0; /*< RR = FLOAT(P(1))/FLOAT(W(1)) >*/ #line 260 "" rr = (real) p[1] / (real) w[1]; /*< DO 50 J=1,N >*/ #line 261 "" i__1 = *n; #line 261 "" for (j = 1; j <= i__1; ++j) { /*< R = RR >*/ #line 262 "" r__ = rr; /*< IF ( P(J) .LE. 0 ) GO TO 20 >*/ #line 263 "" if (p[j] <= 0) { #line 263 "" goto L20; #line 263 "" } /*< IF ( W(J) .LE. 0 ) GO TO 20 >*/ #line 264 "" if (w[j] <= 0) { #line 264 "" goto L20; #line 264 "" } /*< JSW = JSW + W(J) >*/ #line 265 "" jsw += w[j]; /*< IF ( W(J) .LE. C ) GO TO 40 >*/ #line 266 "" if (w[j] <= *c__) { #line 266 "" goto L40; #line 266 "" } /*< Z = - 3 >*/ #line 267 "" *z__ = -3; /*< RETURN >*/ #line 268 "" return 0; /*< 40 RR = FLOAT(P(J))/FLOAT(W(J)) >*/ #line 269 "" L40: #line 269 "" rr = (real) p[j] / (real) w[j]; /*< IF ( RR .LE. R ) GO TO 50 >*/ #line 270 "" if (rr <= r__) { #line 270 "" goto L50; #line 270 "" } /*< Z = - 5 >*/ #line 271 "" *z__ = -5; /*< RETURN >*/ #line 272 "" return 0; /*< 50 CONTINUE >*/ #line 273 "" L50: #line 273 "" ; #line 273 "" } /*< IF ( JSW .GT. C ) RETURN >*/ #line 274 "" if (jsw > *c__) { #line 274 "" return 0; #line 274 "" } /*< Z = - 4 >*/ #line 275 "" *z__ = -4; /*< RETURN >*/ #line 276 "" return 0; /*< END >*/ } /* chmt1_ */ #if 1 /* by mao */ int mt1(int n, int p[], int w[], int c, int x[], int jck, int xx[], int min[], int psign[], int wsign[], int zsign[]) { /* solve 0-1 knapsack problem */ int z, jdim = n+1, j, s1, s2; mt1_(&n, &p[1], &w[1], &c, &z, &x[1], &jdim, &jck, &xx[1], &min[1], &psign[1], &wsign[1], &zsign[1]); /* check solution found */ s1 = s2 = 0; for (j = 1; j <= n; j++) { xassert(x[j] == 0 || x[j] == 1); if (x[j]) s1 += p[j], s2 += w[j]; } xassert(s1 == z); xassert(s2 <= c); return z; } #endif /* eof */ glpk-5.0/src/misc/mt1.f0000644000062000006210000001617613766346220014107 0ustar maomkpasswd SUBROUTINE MT1(N,P,W,C,Z,X,JDIM,JCK,XX,MIN,PSIGN,WSIGN,ZSIGN) C C THIS SUBROUTINE SOLVES THE 0-1 SINGLE KNAPSACK PROBLEM C C MAXIMIZE Z = P(1)*X(1) + ... + P(N)*X(N) C C SUBJECT TO: W(1)*X(1) + ... + W(N)*X(N) .LE. C , C X(J) = 0 OR 1 FOR J=1,...,N. C C THE PROGRAM IS INCLUDED IN THE VOLUME C S. MARTELLO, P. TOTH, "KNAPSACK PROBLEMS: ALGORITHMS C AND COMPUTER IMPLEMENTATIONS", JOHN WILEY, 1990 C AND IMPLEMENTS THE BRANCH-AND-BOUND ALGORITHM DESCRIBED IN C SECTION 2.5.2 . C THE PROGRAM DERIVES FROM AN EARLIER CODE PRESENTED IN C S. MARTELLO, P. TOTH, "ALGORITHM FOR THE SOLUTION OF THE 0-1 SINGLE C KNAPSACK PROBLEM", COMPUTING, 1978. C C THE INPUT PROBLEM MUST SATISFY THE CONDITIONS C C 1) 2 .LE. N .LE. JDIM - 1 ; C 2) P(J), W(J), C POSITIVE INTEGERS; C 3) MAX (W(J)) .LE. C ; C 4) W(1) + ... + W(N) .GT. C ; C 5) P(J)/W(J) .GE. P(J+1)/W(J+1) FOR J=1,...,N-1. C C MT1 CALLS 1 PROCEDURE: CHMT1. C C THE PROGRAM IS COMPLETELY SELF-CONTAINED AND COMMUNICATION TO IT IS C ACHIEVED SOLELY THROUGH THE PARAMETER LIST OF MT1. C NO MACHINE-DEPENDENT CONSTANT IS USED. C THE PROGRAM IS WRITTEN IN 1967 AMERICAN NATIONAL STANDARD FORTRAN C AND IS ACCEPTED BY THE PFORT VERIFIER (PFORT IS THE PORTABLE C SUBSET OF ANSI DEFINED BY THE ASSOCIATION FOR COMPUTING MACHINERY). C THE PROGRAM HAS BEEN TESTED ON A DIGITAL VAX 11/780 AND AN H.P. C 9000/840. C C MT1 NEEDS 8 ARRAYS ( P , W , X , XX , MIN , PSIGN , WSIGN C AND ZSIGN ) OF LENGTH AT LEAST N + 1 . C C MEANING OF THE INPUT PARAMETERS: C N = NUMBER OF ITEMS; C P(J) = PROFIT OF ITEM J (J=1,...,N); C W(J) = WEIGHT OF ITEM J (J=1,...,N); C C = CAPACITY OF THE KNAPSACK; C JDIM = DIMENSION OF THE 8 ARRAYS; C JCK = 1 IF CHECK ON THE INPUT DATA IS DESIRED, C = 0 OTHERWISE. C C MEANING OF THE OUTPUT PARAMETERS: C Z = VALUE OF THE OPTIMAL SOLUTION IF Z .GT. 0 , C = ERROR IN THE INPUT DATA (WHEN JCK=1) IF Z .LT. 0 : CONDI- C TION - Z IS VIOLATED; C X(J) = 1 IF ITEM J IS IN THE OPTIMAL SOLUTION, C = 0 OTHERWISE. C C ARRAYS XX, MIN, PSIGN, WSIGN AND ZSIGN ARE DUMMY. C C ALL THE PARAMETERS ARE INTEGER. ON RETURN OF MT1 ALL THE INPUT C PARAMETERS ARE UNCHANGED. C INTEGER P(JDIM),W(JDIM),X(JDIM),C,Z INTEGER XX(JDIM),MIN(JDIM),PSIGN(JDIM),WSIGN(JDIM),ZSIGN(JDIM) INTEGER CH,CHS,DIFF,PROFIT,R,T Z = 0 IF ( JCK .EQ. 1 ) CALL CHMT1(N,P,W,C,Z,JDIM) IF ( Z .LT. 0 ) RETURN C INITIALIZE. CH = C IP = 0 CHS = CH DO 10 LL=1,N IF ( W(LL) .GT. CHS ) GO TO 20 IP = IP + P(LL) CHS = CHS - W(LL) 10 CONTINUE 20 LL = LL - 1 IF ( CHS .EQ. 0 ) GO TO 50 P(N+1) = 0 W(N+1) = CH + 1 LIM = IP + CHS*P(LL+2)/W(LL+2) A = W(LL+1) - CHS B = IP + P(LL+1) LIM1 = B - A*FLOAT(P(LL))/FLOAT(W(LL)) IF ( LIM1 .GT. LIM ) LIM = LIM1 MINK = CH + 1 MIN(N) = MINK DO 30 J=2,N KK = N + 2 - J IF ( W(KK) .LT. MINK ) MINK = W(KK) MIN(KK-1) = MINK 30 CONTINUE DO 40 J=1,N XX(J) = 0 40 CONTINUE Z = 0 PROFIT = 0 LOLD = N II = 1 GO TO 170 50 Z = IP DO 60 J=1,LL X(J) = 1 60 CONTINUE NN = LL + 1 DO 70 J=NN,N X(J) = 0 70 CONTINUE RETURN C TRY TO INSERT THE II-TH ITEM INTO THE CURRENT SOLUTION. 80 IF ( W(II) .LE. CH ) GO TO 90 II1 = II + 1 IF ( Z .GE. CH*P(II1)/W(II1) + PROFIT ) GO TO 280 II = II1 GO TO 80 C BUILD A NEW CURRENT SOLUTION. 90 IP = PSIGN(II) CHS = CH - WSIGN(II) IN = ZSIGN(II) DO 100 LL=IN,N IF ( W(LL) .GT. CHS ) GO TO 160 IP = IP + P(LL) CHS = CHS - W(LL) 100 CONTINUE LL = N 110 IF ( Z .GE. IP + PROFIT ) GO TO 280 Z = IP + PROFIT NN = II - 1 DO 120 J=1,NN X(J) = XX(J) 120 CONTINUE DO 130 J=II,LL X(J) = 1 130 CONTINUE IF ( LL .EQ. N ) GO TO 150 NN = LL + 1 DO 140 J=NN,N X(J) = 0 140 CONTINUE 150 IF ( Z .NE. LIM ) GO TO 280 RETURN 160 IU = CHS*P(LL)/W(LL) LL = LL - 1 IF ( IU .EQ. 0 ) GO TO 110 IF ( Z .GE. PROFIT + IP + IU ) GO TO 280 C SAVE THE CURRENT SOLUTION. 170 WSIGN(II) = CH - CHS PSIGN(II) = IP ZSIGN(II) = LL + 1 XX(II) = 1 NN = LL - 1 IF ( NN .LT. II) GO TO 190 DO 180 J=II,NN WSIGN(J+1) = WSIGN(J) - W(J) PSIGN(J+1) = PSIGN(J) - P(J) ZSIGN(J+1) = LL + 1 XX(J+1) = 1 180 CONTINUE 190 J1 = LL + 1 DO 200 J=J1,LOLD WSIGN(J) = 0 PSIGN(J) = 0 ZSIGN(J) = J 200 CONTINUE LOLD = LL CH = CHS PROFIT = PROFIT + IP IF ( LL - (N - 2) ) 240, 220, 210 210 II = N GO TO 250 220 IF ( CH .LT. W(N) ) GO TO 230 CH = CH - W(N) PROFIT = PROFIT + P(N) XX(N) = 1 230 II = N - 1 GO TO 250 240 II = LL + 2 IF ( CH .GE. MIN(II-1) ) GO TO 80 C SAVE THE CURRENT OPTIMAL SOLUTION. 250 IF ( Z .GE. PROFIT ) GO TO 270 Z = PROFIT DO 260 J=1,N X(J) = XX(J) 260 CONTINUE IF ( Z .EQ. LIM ) RETURN 270 IF ( XX(N) .EQ. 0 ) GO TO 280 XX(N) = 0 CH = CH + W(N) PROFIT = PROFIT - P(N) C BACKTRACK. 280 NN = II - 1 IF ( NN .EQ. 0 ) RETURN DO 290 J=1,NN KK = II - J IF ( XX(KK) .EQ. 1 ) GO TO 300 290 CONTINUE RETURN 300 R = CH CH = CH + W(KK) PROFIT = PROFIT - P(KK) XX(KK) = 0 IF ( R .LT. MIN(KK) ) GO TO 310 II = KK + 1 GO TO 80 310 NN = KK + 1 II = KK C TRY TO SUBSTITUTE THE NN-TH ITEM FOR THE KK-TH. 320 IF ( Z .GE. PROFIT + CH*P(NN)/W(NN) ) GO TO 280 DIFF = W(NN) - W(KK) IF ( DIFF ) 370, 330, 340 330 NN = NN + 1 GO TO 320 340 IF ( DIFF .GT. R ) GO TO 330 IF ( Z .GE. PROFIT + P(NN) ) GO TO 330 Z = PROFIT + P(NN) DO 350 J=1,KK X(J) = XX(J) 350 CONTINUE JJ = KK + 1 DO 360 J=JJ,N X(J) = 0 360 CONTINUE X(NN) = 1 IF ( Z .EQ. LIM ) RETURN R = R - DIFF KK = NN NN = NN + 1 GO TO 320 370 T = R - DIFF IF ( T .LT. MIN(NN) ) GO TO 330 IF ( Z .GE. PROFIT + P(NN) + T*P(NN+1)/W(NN+1)) GO TO 280 CH = CH - W(NN) PROFIT = PROFIT + P(NN) XX(NN) = 1 II = NN + 1 WSIGN(NN) = W(NN) PSIGN(NN) = P(NN) ZSIGN(NN) = II N1 = NN + 1 DO 380 J=N1,LOLD WSIGN(J) = 0 PSIGN(J) = 0 ZSIGN(J) = J 380 CONTINUE LOLD = NN GO TO 80 END SUBROUTINE CHMT1(N,P,W,C,Z,JDIM) C C CHECK THE INPUT DATA. C INTEGER P(JDIM),W(JDIM),C,Z IF ( N .GE. 2 .AND. N .LE. JDIM - 1 ) GO TO 10 Z = - 1 RETURN 10 IF ( C .GT. 0 ) GO TO 30 20 Z = - 2 RETURN 30 JSW = 0 RR = FLOAT(P(1))/FLOAT(W(1)) DO 50 J=1,N R = RR IF ( P(J) .LE. 0 ) GO TO 20 IF ( W(J) .LE. 0 ) GO TO 20 JSW = JSW + W(J) IF ( W(J) .LE. C ) GO TO 40 Z = - 3 RETURN 40 RR = FLOAT(P(J))/FLOAT(W(J)) IF ( RR .LE. R ) GO TO 50 Z = - 5 RETURN 50 CONTINUE IF ( JSW .GT. C ) RETURN Z = - 4 RETURN END glpk-5.0/src/misc/mt1.h0000644000062000006210000000231213766346220014074 0ustar maomkpasswd/* mt1.h (0-1 knapsack problem; Martello & Toth algorithm) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2017-2018 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef MT1_H #define MT1_H #define mt1 _glp_mt1 int mt1(int n, int p[], int w[], int c, int x[], int jck, int xx[], int min[], int psign[], int wsign[], int zsign[]); /* solve 0-1 single knapsack problem */ #endif /* eof */ glpk-5.0/src/misc/mygmp.c0000644000062000006210000007702513766346220014534 0ustar maomkpasswd/* mygmp.c (integer and rational arithmetic) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2008-2015 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "mygmp.h" #ifdef HAVE_GMP /* use GNU MP library */ /* nothing is needed */ #else /* use GLPK MP module */ #include "bignum.h" #include "dmp.h" #include "env.h" #define gmp_pool env->gmp_pool #define gmp_size env->gmp_size #define gmp_work env->gmp_work void *gmp_get_atom(int size) { ENV *env = get_env_ptr(); if (gmp_pool == NULL) gmp_pool = dmp_create_pool(); return dmp_get_atom(gmp_pool, size); } void gmp_free_atom(void *ptr, int size) { ENV *env = get_env_ptr(); xassert(gmp_pool != NULL); dmp_free_atom(gmp_pool, ptr, size); return; } int gmp_pool_count(void) { ENV *env = get_env_ptr(); if (gmp_pool == NULL) return 0; else return dmp_in_use(gmp_pool); } unsigned short *gmp_get_work(int size) { ENV *env = get_env_ptr(); xassert(size > 0); if (gmp_size < size) { if (gmp_size == 0) { xassert(gmp_work == NULL); gmp_size = 100; } else { xassert(gmp_work != NULL); xfree(gmp_work); } while (gmp_size < size) gmp_size += gmp_size; gmp_work = xcalloc(gmp_size, sizeof(unsigned short)); } return gmp_work; } void gmp_free_mem(void) { ENV *env = get_env_ptr(); if (gmp_pool != NULL) dmp_delete_pool(gmp_pool); if (gmp_work != NULL) xfree(gmp_work); gmp_pool = NULL; gmp_size = 0; gmp_work = NULL; return; } /*--------------------------------------------------------------------*/ mpz_t _mpz_init(void) { /* initialize x and set its value to 0 */ mpz_t x; x = gmp_get_atom(sizeof(struct mpz)); x->val = 0; x->ptr = NULL; return x; } void mpz_clear(mpz_t x) { /* free the space occupied by x */ mpz_set_si(x, 0); xassert(x->ptr == NULL); /* free the number descriptor */ gmp_free_atom(x, sizeof(struct mpz)); return; } void mpz_set(mpz_t z, mpz_t x) { /* set the value of z from x */ struct mpz_seg *e, *ee, *es; if (z != x) { mpz_set_si(z, 0); z->val = x->val; xassert(z->ptr == NULL); for (e = x->ptr, es = NULL; e != NULL; e = e->next) { ee = gmp_get_atom(sizeof(struct mpz_seg)); memcpy(ee->d, e->d, 12); ee->next = NULL; if (z->ptr == NULL) z->ptr = ee; else es->next = ee; es = ee; } } return; } void mpz_set_si(mpz_t x, int val) { /* set the value of x to val */ struct mpz_seg *e; /* free existing segments, if any */ while (x->ptr != NULL) { e = x->ptr; x->ptr = e->next; gmp_free_atom(e, sizeof(struct mpz_seg)); } /* assign new value */ if (val == 0x80000000) { /* long format is needed */ x->val = -1; x->ptr = e = gmp_get_atom(sizeof(struct mpz_seg)); memset(e->d, 0, 12); e->d[1] = 0x8000; e->next = NULL; } else { /* short format is enough */ x->val = val; } return; } double mpz_get_d(mpz_t x) { /* convert x to a double, truncating if necessary */ struct mpz_seg *e; int j; double val, deg; if (x->ptr == NULL) val = (double)x->val; else { xassert(x->val != 0); val = 0.0; deg = 1.0; for (e = x->ptr; e != NULL; e = e->next) { for (j = 0; j <= 5; j++) { val += deg * (double)((int)e->d[j]); deg *= 65536.0; } } if (x->val < 0) val = - val; } return val; } double mpz_get_d_2exp(int *exp, mpz_t x) { /* convert x to a double, truncating if necessary (i.e. rounding * towards zero), and returning the exponent separately; * the return value is in the range 0.5 <= |d| < 1 and the * exponent is stored to *exp; d*2^exp is the (truncated) x value; * if x is zero, the return is 0.0 and 0 is stored to *exp; * this is similar to the standard C frexp function */ struct mpz_seg *e; int j, n, n1; double val; if (x->ptr == NULL) val = (double)x->val, n = 0; else { xassert(x->val != 0); val = 0.0, n = 0; for (e = x->ptr; e != NULL; e = e->next) { for (j = 0; j <= 5; j++) { val += (double)((int)e->d[j]); val /= 65536.0, n += 16; } } if (x->val < 0) val = - val; } val = frexp(val, &n1); *exp = n + n1; return val; } void mpz_swap(mpz_t x, mpz_t y) { /* swap the values x and y efficiently */ int val; void *ptr; val = x->val, ptr = x->ptr; x->val = y->val, x->ptr = y->ptr; y->val = val, y->ptr = ptr; return; } static void normalize(mpz_t x) { /* normalize integer x that includes removing non-significant * (leading) zeros and converting to short format, if possible */ struct mpz_seg *es, *e; /* if the integer is in short format, it remains unchanged */ if (x->ptr == NULL) { xassert(x->val != 0x80000000); goto done; } xassert(x->val == +1 || x->val == -1); /* find the last (most significant) non-zero segment */ es = NULL; for (e = x->ptr; e != NULL; e = e->next) { if (e->d[0] || e->d[1] || e->d[2] || e->d[3] || e->d[4] || e->d[5]) es = e; } /* if all segments contain zeros, the integer is zero */ if (es == NULL) { mpz_set_si(x, 0); goto done; } /* remove non-significant (leading) zero segments */ while (es->next != NULL) { e = es->next; es->next = e->next; gmp_free_atom(e, sizeof(struct mpz_seg)); } /* convert the integer to short format, if possible */ e = x->ptr; if (e->next == NULL && e->d[1] <= 0x7FFF && !e->d[2] && !e->d[3] && !e->d[4] && !e->d[5]) { int val; val = (int)e->d[0] + ((int)e->d[1] << 16); if (x->val < 0) val = - val; mpz_set_si(x, val); } done: return; } void mpz_add(mpz_t z, mpz_t x, mpz_t y) { /* set z to x + y */ static struct mpz_seg zero = { { 0, 0, 0, 0, 0, 0 }, NULL }; struct mpz_seg dumx, dumy, *ex, *ey, *ez, *es, *ee; int k, sx, sy, sz; unsigned int t; /* if [x] = 0 then [z] = [y] */ if (x->val == 0) { xassert(x->ptr == NULL); mpz_set(z, y); goto done; } /* if [y] = 0 then [z] = [x] */ if (y->val == 0) { xassert(y->ptr == NULL); mpz_set(z, x); goto done; } /* special case when both [x] and [y] are in short format */ if (x->ptr == NULL && y->ptr == NULL) { int xval = x->val, yval = y->val, zval = x->val + y->val; xassert(xval != 0x80000000 && yval != 0x80000000); if (!(xval > 0 && yval > 0 && zval <= 0 || xval < 0 && yval < 0 && zval >= 0)) { mpz_set_si(z, zval); goto done; } } /* convert [x] to long format, if necessary */ if (x->ptr == NULL) { xassert(x->val != 0x80000000); if (x->val >= 0) { sx = +1; t = (unsigned int)(+ x->val); } else { sx = -1; t = (unsigned int)(- x->val); } ex = &dumx; ex->d[0] = (unsigned short)t; ex->d[1] = (unsigned short)(t >> 16); ex->d[2] = ex->d[3] = ex->d[4] = ex->d[5] = 0; ex->next = NULL; } else { sx = x->val; xassert(sx == +1 || sx == -1); ex = x->ptr; } /* convert [y] to long format, if necessary */ if (y->ptr == NULL) { xassert(y->val != 0x80000000); if (y->val >= 0) { sy = +1; t = (unsigned int)(+ y->val); } else { sy = -1; t = (unsigned int)(- y->val); } ey = &dumy; ey->d[0] = (unsigned short)t; ey->d[1] = (unsigned short)(t >> 16); ey->d[2] = ey->d[3] = ey->d[4] = ey->d[5] = 0; ey->next = NULL; } else { sy = y->val; xassert(sy == +1 || sy == -1); ey = y->ptr; } /* main fragment */ sz = sx; ez = es = NULL; if (sx > 0 && sy > 0 || sx < 0 && sy < 0) { /* [x] and [y] have identical signs -- addition */ t = 0; for (; ex || ey; ex = ex->next, ey = ey->next) { if (ex == NULL) ex = &zero; if (ey == NULL) ey = &zero; ee = gmp_get_atom(sizeof(struct mpz_seg)); for (k = 0; k <= 5; k++) { t += (unsigned int)ex->d[k]; t += (unsigned int)ey->d[k]; ee->d[k] = (unsigned short)t; t >>= 16; } ee->next = NULL; if (ez == NULL) ez = ee; else es->next = ee; es = ee; } if (t) { /* overflow -- one extra digit is needed */ ee = gmp_get_atom(sizeof(struct mpz_seg)); ee->d[0] = 1; ee->d[1] = ee->d[2] = ee->d[3] = ee->d[4] = ee->d[5] = 0; ee->next = NULL; xassert(es != NULL); es->next = ee; } } else { /* [x] and [y] have different signs -- subtraction */ t = 1; for (; ex || ey; ex = ex->next, ey = ey->next) { if (ex == NULL) ex = &zero; if (ey == NULL) ey = &zero; ee = gmp_get_atom(sizeof(struct mpz_seg)); for (k = 0; k <= 5; k++) { t += (unsigned int)ex->d[k]; t += (0xFFFF - (unsigned int)ey->d[k]); ee->d[k] = (unsigned short)t; t >>= 16; } ee->next = NULL; if (ez == NULL) ez = ee; else es->next = ee; es = ee; } if (!t) { /* |[x]| < |[y]| -- result in complement coding */ sz = - sz; t = 1; for (ee = ez; ee != NULL; ee = ee->next) { for (k = 0; k <= 5; k++) { t += (0xFFFF - (unsigned int)ee->d[k]); ee->d[k] = (unsigned short)t; t >>= 16; } } } } /* contruct and normalize result */ mpz_set_si(z, 0); z->val = sz; z->ptr = ez; normalize(z); done: return; } void mpz_sub(mpz_t z, mpz_t x, mpz_t y) { /* set z to x - y */ if (x == y) mpz_set_si(z, 0); else { y->val = - y->val; mpz_add(z, x, y); if (y != z) y->val = - y->val; } return; } void mpz_mul(mpz_t z, mpz_t x, mpz_t y) { /* set z to x * y */ struct mpz_seg dumx, dumy, *ex, *ey, *es, *e; int sx, sy, k, nx, ny, n; unsigned int t; unsigned short *work, *wx, *wy; /* if [x] = 0 then [z] = 0 */ if (x->val == 0) { xassert(x->ptr == NULL); mpz_set_si(z, 0); goto done; } /* if [y] = 0 then [z] = 0 */ if (y->val == 0) { xassert(y->ptr == NULL); mpz_set_si(z, 0); goto done; } /* special case when both [x] and [y] are in short format */ if (x->ptr == NULL && y->ptr == NULL) { int xval = x->val, yval = y->val, sz = +1; xassert(xval != 0x80000000 && yval != 0x80000000); if (xval < 0) xval = - xval, sz = - sz; if (yval < 0) yval = - yval, sz = - sz; if (xval <= 0x7FFFFFFF / yval) { mpz_set_si(z, sz * (xval * yval)); goto done; } } /* convert [x] to long format, if necessary */ if (x->ptr == NULL) { xassert(x->val != 0x80000000); if (x->val >= 0) { sx = +1; t = (unsigned int)(+ x->val); } else { sx = -1; t = (unsigned int)(- x->val); } ex = &dumx; ex->d[0] = (unsigned short)t; ex->d[1] = (unsigned short)(t >> 16); ex->d[2] = ex->d[3] = ex->d[4] = ex->d[5] = 0; ex->next = NULL; } else { sx = x->val; xassert(sx == +1 || sx == -1); ex = x->ptr; } /* convert [y] to long format, if necessary */ if (y->ptr == NULL) { xassert(y->val != 0x80000000); if (y->val >= 0) { sy = +1; t = (unsigned int)(+ y->val); } else { sy = -1; t = (unsigned int)(- y->val); } ey = &dumy; ey->d[0] = (unsigned short)t; ey->d[1] = (unsigned short)(t >> 16); ey->d[2] = ey->d[3] = ey->d[4] = ey->d[5] = 0; ey->next = NULL; } else { sy = y->val; xassert(sy == +1 || sy == -1); ey = y->ptr; } /* determine the number of digits of [x] */ nx = n = 0; for (e = ex; e != NULL; e = e->next) { for (k = 0; k <= 5; k++) { n++; if (e->d[k]) nx = n; } } xassert(nx > 0); /* determine the number of digits of [y] */ ny = n = 0; for (e = ey; e != NULL; e = e->next) { for (k = 0; k <= 5; k++) { n++; if (e->d[k]) ny = n; } } xassert(ny > 0); /* we need working array containing at least nx+ny+ny places */ work = gmp_get_work(nx+ny+ny); /* load digits of [x] */ wx = &work[0]; for (n = 0; n < nx; n++) wx[ny+n] = 0; for (n = 0, e = ex; e != NULL; e = e->next) { for (k = 0; k <= 5; k++, n++) { if (e->d[k]) wx[ny+n] = e->d[k]; } } /* load digits of [y] */ wy = &work[nx+ny]; for (n = 0; n < ny; n++) wy[n] = 0; for (n = 0, e = ey; e != NULL; e = e->next) { for (k = 0; k <= 5; k++, n++) { if (e->d[k]) wy[n] = e->d[k]; } } /* compute [x] * [y] */ bigmul(nx, ny, wx, wy); /* construct and normalize result */ mpz_set_si(z, 0); z->val = sx * sy; es = NULL; k = 6; for (n = 0; n < nx+ny; n++) { if (k > 5) { e = gmp_get_atom(sizeof(struct mpz_seg)); e->d[0] = e->d[1] = e->d[2] = 0; e->d[3] = e->d[4] = e->d[5] = 0; e->next = NULL; if (z->ptr == NULL) z->ptr = e; else es->next = e; es = e; k = 0; } es->d[k++] = wx[n]; } normalize(z); done: return; } void mpz_neg(mpz_t z, mpz_t x) { /* set z to 0 - x */ mpz_set(z, x); z->val = - z->val; return; } void mpz_abs(mpz_t z, mpz_t x) { /* set z to the absolute value of x */ mpz_set(z, x); if (z->val < 0) z->val = - z->val; return; } void mpz_div(mpz_t q, mpz_t r, mpz_t x, mpz_t y) { /* divide x by y, forming quotient q and/or remainder r * if q = NULL then quotient is not stored; if r = NULL then * remainder is not stored * the sign of quotient is determined as in algebra while the * sign of remainder is the same as the sign of dividend: * +26 : +7 = +3, remainder is +5 * -26 : +7 = -3, remainder is -5 * +26 : -7 = -3, remainder is +5 * -26 : -7 = +3, remainder is -5 */ struct mpz_seg dumx, dumy, *ex, *ey, *es, *e; int sx, sy, k, nx, ny, n; unsigned int t; unsigned short *work, *wx, *wy; /* divide by zero is not allowed */ if (y->val == 0) { xassert(y->ptr == NULL); xerror("mpz_div: divide by zero not allowed\n"); } /* if [x] = 0 then [q] = [r] = 0 */ if (x->val == 0) { xassert(x->ptr == NULL); if (q != NULL) mpz_set_si(q, 0); if (r != NULL) mpz_set_si(r, 0); goto done; } /* special case when both [x] and [y] are in short format */ if (x->ptr == NULL && y->ptr == NULL) { int xval = x->val, yval = y->val; xassert(xval != 0x80000000 && yval != 0x80000000); /* FIXME: use div function */ if (q != NULL) mpz_set_si(q, xval / yval); if (r != NULL) mpz_set_si(r, xval % yval); goto done; } /* convert [x] to long format, if necessary */ if (x->ptr == NULL) { xassert(x->val != 0x80000000); if (x->val >= 0) { sx = +1; t = (unsigned int)(+ x->val); } else { sx = -1; t = (unsigned int)(- x->val); } ex = &dumx; ex->d[0] = (unsigned short)t; ex->d[1] = (unsigned short)(t >> 16); ex->d[2] = ex->d[3] = ex->d[4] = ex->d[5] = 0; ex->next = NULL; } else { sx = x->val; xassert(sx == +1 || sx == -1); ex = x->ptr; } /* convert [y] to long format, if necessary */ if (y->ptr == NULL) { xassert(y->val != 0x80000000); if (y->val >= 0) { sy = +1; t = (unsigned int)(+ y->val); } else { sy = -1; t = (unsigned int)(- y->val); } ey = &dumy; ey->d[0] = (unsigned short)t; ey->d[1] = (unsigned short)(t >> 16); ey->d[2] = ey->d[3] = ey->d[4] = ey->d[5] = 0; ey->next = NULL; } else { sy = y->val; xassert(sy == +1 || sy == -1); ey = y->ptr; } /* determine the number of digits of [x] */ nx = n = 0; for (e = ex; e != NULL; e = e->next) { for (k = 0; k <= 5; k++) { n++; if (e->d[k]) nx = n; } } xassert(nx > 0); /* determine the number of digits of [y] */ ny = n = 0; for (e = ey; e != NULL; e = e->next) { for (k = 0; k <= 5; k++) { n++; if (e->d[k]) ny = n; } } xassert(ny > 0); /* if nx < ny then [q] = 0 and [r] = [x] */ if (nx < ny) { if (r != NULL) mpz_set(r, x); if (q != NULL) mpz_set_si(q, 0); goto done; } /* we need working array containing at least nx+ny+1 places */ work = gmp_get_work(nx+ny+1); /* load digits of [x] */ wx = &work[0]; for (n = 0; n < nx; n++) wx[n] = 0; for (n = 0, e = ex; e != NULL; e = e->next) { for (k = 0; k <= 5; k++, n++) if (e->d[k]) wx[n] = e->d[k]; } /* load digits of [y] */ wy = &work[nx+1]; for (n = 0; n < ny; n++) wy[n] = 0; for (n = 0, e = ey; e != NULL; e = e->next) { for (k = 0; k <= 5; k++, n++) if (e->d[k]) wy[n] = e->d[k]; } /* compute quotient and remainder */ xassert(wy[ny-1] != 0); bigdiv(nx-ny, ny, wx, wy); /* construct and normalize quotient */ if (q != NULL) { mpz_set_si(q, 0); q->val = sx * sy; es = NULL; k = 6; for (n = ny; n <= nx; n++) { if (k > 5) { e = gmp_get_atom(sizeof(struct mpz_seg)); e->d[0] = e->d[1] = e->d[2] = 0; e->d[3] = e->d[4] = e->d[5] = 0; e->next = NULL; if (q->ptr == NULL) q->ptr = e; else es->next = e; es = e; k = 0; } es->d[k++] = wx[n]; } normalize(q); } /* construct and normalize remainder */ if (r != NULL) { mpz_set_si(r, 0); r->val = sx; es = NULL; k = 6; for (n = 0; n < ny; n++) { if (k > 5) { e = gmp_get_atom(sizeof(struct mpz_seg)); e->d[0] = e->d[1] = e->d[2] = 0; e->d[3] = e->d[4] = e->d[5] = 0; e->next = NULL; if (r->ptr == NULL) r->ptr = e; else es->next = e; es = e; k = 0; } es->d[k++] = wx[n]; } normalize(r); } done: return; } void mpz_gcd(mpz_t z, mpz_t x, mpz_t y) { /* set z to the greatest common divisor of x and y */ /* in case of arbitrary integers GCD(x, y) = GCD(|x|, |y|), and, * in particular, GCD(0, 0) = 0 */ mpz_t u, v, r; mpz_init(u); mpz_init(v); mpz_init(r); mpz_abs(u, x); mpz_abs(v, y); while (mpz_sgn(v)) { mpz_div(NULL, r, u, v); mpz_set(u, v); mpz_set(v, r); } mpz_set(z, u); mpz_clear(u); mpz_clear(v); mpz_clear(r); return; } int mpz_cmp(mpz_t x, mpz_t y) { /* compare x and y; return a positive value if x > y, zero if * x = y, or a nefative value if x < y */ static struct mpz_seg zero = { { 0, 0, 0, 0, 0, 0 }, NULL }; struct mpz_seg dumx, dumy, *ex, *ey; int cc, sx, sy, k; unsigned int t; if (x == y) { cc = 0; goto done; } /* special case when both [x] and [y] are in short format */ if (x->ptr == NULL && y->ptr == NULL) { int xval = x->val, yval = y->val; xassert(xval != 0x80000000 && yval != 0x80000000); cc = (xval > yval ? +1 : xval < yval ? -1 : 0); goto done; } /* special case when [x] and [y] have different signs */ if (x->val > 0 && y->val <= 0 || x->val == 0 && y->val < 0) { cc = +1; goto done; } if (x->val < 0 && y->val >= 0 || x->val == 0 && y->val > 0) { cc = -1; goto done; } /* convert [x] to long format, if necessary */ if (x->ptr == NULL) { xassert(x->val != 0x80000000); if (x->val >= 0) { sx = +1; t = (unsigned int)(+ x->val); } else { sx = -1; t = (unsigned int)(- x->val); } ex = &dumx; ex->d[0] = (unsigned short)t; ex->d[1] = (unsigned short)(t >> 16); ex->d[2] = ex->d[3] = ex->d[4] = ex->d[5] = 0; ex->next = NULL; } else { sx = x->val; xassert(sx == +1 || sx == -1); ex = x->ptr; } /* convert [y] to long format, if necessary */ if (y->ptr == NULL) { xassert(y->val != 0x80000000); if (y->val >= 0) { sy = +1; t = (unsigned int)(+ y->val); } else { sy = -1; t = (unsigned int)(- y->val); } ey = &dumy; ey->d[0] = (unsigned short)t; ey->d[1] = (unsigned short)(t >> 16); ey->d[2] = ey->d[3] = ey->d[4] = ey->d[5] = 0; ey->next = NULL; } else { sy = y->val; xassert(sy == +1 || sy == -1); ey = y->ptr; } /* main fragment */ xassert(sx > 0 && sy > 0 || sx < 0 && sy < 0); cc = 0; for (; ex || ey; ex = ex->next, ey = ey->next) { if (ex == NULL) ex = &zero; if (ey == NULL) ey = &zero; for (k = 0; k <= 5; k++) { if (ex->d[k] > ey->d[k]) cc = +1; if (ex->d[k] < ey->d[k]) cc = -1; } } if (sx < 0) cc = - cc; done: return cc; } int mpz_sgn(mpz_t x) { /* return +1 if x > 0, 0 if x = 0, and -1 if x < 0 */ int s; s = (x->val > 0 ? +1 : x->val < 0 ? -1 : 0); return s; } int mpz_out_str(void *_fp, int base, mpz_t x) { /* output x on stream fp, as a string in given base; the base * may vary from 2 to 36; * return the number of bytes written, or if an error occurred, * return 0 */ FILE *fp = _fp; mpz_t b, y, r; int n, j, nwr = 0; unsigned char *d; static char *set = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; if (!(2 <= base && base <= 36)) xerror("mpz_out_str: base = %d; invalid base\n", base); mpz_init(b); mpz_set_si(b, base); mpz_init(y); mpz_init(r); /* determine the number of digits */ mpz_abs(y, x); for (n = 0; mpz_sgn(y) != 0; n++) mpz_div(y, NULL, y, b); if (n == 0) n = 1; /* compute the digits */ d = xmalloc(n); mpz_abs(y, x); for (j = 0; j < n; j++) { mpz_div(y, r, y, b); xassert(0 <= r->val && r->val < base && r->ptr == NULL); d[j] = (unsigned char)r->val; } /* output the integer to the stream */ if (fp == NULL) fp = stdout; if (mpz_sgn(x) < 0) fputc('-', fp), nwr++; for (j = n-1; j >= 0; j--) fputc(set[d[j]], fp), nwr++; if (ferror(fp)) nwr = 0; mpz_clear(b); mpz_clear(y); mpz_clear(r); xfree(d); return nwr; } /*--------------------------------------------------------------------*/ mpq_t _mpq_init(void) { /* initialize x, and set its value to 0/1 */ mpq_t x; x = gmp_get_atom(sizeof(struct mpq)); x->p.val = 0; x->p.ptr = NULL; x->q.val = 1; x->q.ptr = NULL; return x; } void mpq_clear(mpq_t x) { /* free the space occupied by x */ mpz_set_si(&x->p, 0); xassert(x->p.ptr == NULL); mpz_set_si(&x->q, 0); xassert(x->q.ptr == NULL); /* free the number descriptor */ gmp_free_atom(x, sizeof(struct mpq)); return; } void mpq_canonicalize(mpq_t x) { /* remove any factors that are common to the numerator and * denominator of x, and make the denominator positive */ mpz_t f; xassert(x->q.val != 0); if (x->q.val < 0) { mpz_neg(&x->p, &x->p); mpz_neg(&x->q, &x->q); } mpz_init(f); mpz_gcd(f, &x->p, &x->q); if (!(f->val == 1 && f->ptr == NULL)) { mpz_div(&x->p, NULL, &x->p, f); mpz_div(&x->q, NULL, &x->q, f); } mpz_clear(f); return; } void mpq_set(mpq_t z, mpq_t x) { /* set the value of z from x */ if (z != x) { mpz_set(&z->p, &x->p); mpz_set(&z->q, &x->q); } return; } void mpq_set_si(mpq_t x, int p, unsigned int q) { /* set the value of x to p/q */ if (q == 0) xerror("mpq_set_si: zero denominator not allowed\n"); mpz_set_si(&x->p, p); xassert(q <= 0x7FFFFFFF); mpz_set_si(&x->q, q); return; } double mpq_get_d(mpq_t x) { /* convert x to a double, truncating if necessary */ int np, nq; double p, q; p = mpz_get_d_2exp(&np, &x->p); q = mpz_get_d_2exp(&nq, &x->q); return ldexp(p / q, np - nq); } void mpq_set_d(mpq_t x, double val) { /* set x to val; there is no rounding, the conversion is exact */ int s, n, d, j; double f; mpz_t temp; xassert(-DBL_MAX <= val && val <= +DBL_MAX); mpq_set_si(x, 0, 1); if (val > 0.0) s = +1; else if (val < 0.0) s = -1; else goto done; f = frexp(fabs(val), &n); /* |val| = f * 2^n, where 0.5 <= f < 1.0 */ mpz_init(temp); while (f != 0.0) { f *= 16.0, n -= 4; d = (int)f; xassert(0 <= d && d <= 15); f -= (double)d; /* x := 16 * x + d */ mpz_set_si(temp, 16); mpz_mul(&x->p, &x->p, temp); mpz_set_si(temp, d); mpz_add(&x->p, &x->p, temp); } mpz_clear(temp); /* x := x * 2^n */ if (n > 0) { for (j = 1; j <= n; j++) mpz_add(&x->p, &x->p, &x->p); } else if (n < 0) { for (j = 1; j <= -n; j++) mpz_add(&x->q, &x->q, &x->q); mpq_canonicalize(x); } if (s < 0) mpq_neg(x, x); done: return; } void mpq_add(mpq_t z, mpq_t x, mpq_t y) { /* set z to x + y */ mpz_t p, q; mpz_init(p); mpz_init(q); mpz_mul(p, &x->p, &y->q); mpz_mul(q, &x->q, &y->p); mpz_add(p, p, q); mpz_mul(q, &x->q, &y->q); mpz_set(&z->p, p); mpz_set(&z->q, q); mpz_clear(p); mpz_clear(q); mpq_canonicalize(z); return; } void mpq_sub(mpq_t z, mpq_t x, mpq_t y) { /* set z to x - y */ mpz_t p, q; mpz_init(p); mpz_init(q); mpz_mul(p, &x->p, &y->q); mpz_mul(q, &x->q, &y->p); mpz_sub(p, p, q); mpz_mul(q, &x->q, &y->q); mpz_set(&z->p, p); mpz_set(&z->q, q); mpz_clear(p); mpz_clear(q); mpq_canonicalize(z); return; } void mpq_mul(mpq_t z, mpq_t x, mpq_t y) { /* set z to x * y */ mpz_mul(&z->p, &x->p, &y->p); mpz_mul(&z->q, &x->q, &y->q); mpq_canonicalize(z); return; } void mpq_div(mpq_t z, mpq_t x, mpq_t y) { /* set z to x / y */ mpz_t p, q; if (mpq_sgn(y) == 0) xerror("mpq_div: zero divisor not allowed\n"); mpz_init(p); mpz_init(q); mpz_mul(p, &x->p, &y->q); mpz_mul(q, &x->q, &y->p); mpz_set(&z->p, p); mpz_set(&z->q, q); mpz_clear(p); mpz_clear(q); mpq_canonicalize(z); return; } void mpq_neg(mpq_t z, mpq_t x) { /* set z to 0 - x */ mpq_set(z, x); mpz_neg(&z->p, &z->p); return; } void mpq_abs(mpq_t z, mpq_t x) { /* set z to the absolute value of x */ mpq_set(z, x); mpz_abs(&z->p, &z->p); xassert(mpz_sgn(&x->q) > 0); return; } int mpq_cmp(mpq_t x, mpq_t y) { /* compare x and y; return a positive value if x > y, zero if * x = y, or a negative value if x < y */ mpq_t temp; int s; mpq_init(temp); mpq_sub(temp, x, y); s = mpq_sgn(temp); mpq_clear(temp); return s; } int mpq_sgn(mpq_t x) { /* return +1 if x > 0, 0 if x = 0, and -1 if x < 0 */ int s; s = mpz_sgn(&x->p); xassert(mpz_sgn(&x->q) > 0); return s; } int mpq_out_str(void *_fp, int base, mpq_t x) { /* output x on stream fp, as a string in given base; the base * may vary from 2 to 36; output is in the form 'num/den' or if * the denominator is 1 then just 'num'; * if the parameter fp is a null pointer, stdout is assumed; * return the number of bytes written, or if an error occurred, * return 0 */ FILE *fp = _fp; int nwr; if (!(2 <= base && base <= 36)) xerror("mpq_out_str: base = %d; invalid base\n", base); if (fp == NULL) fp = stdout; nwr = mpz_out_str(fp, base, &x->p); if (x->q.val == 1 && x->q.ptr == NULL) ; else { fputc('/', fp), nwr++; nwr += mpz_out_str(fp, base, &x->q); } if (ferror(fp)) nwr = 0; return nwr; } #endif /* eof */ glpk-5.0/src/misc/mygmp.h0000644000062000006210000001545413766346220014537 0ustar maomkpasswd/* mygmp.h (integer and rational arithmetic) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2008-2015 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef MYGMP_H #define MYGMP_H #ifdef HAVE_CONFIG_H #include #endif #ifdef HAVE_GMP /* use GNU MP library */ #include #define gmp_pool_count() 0 #define gmp_free_mem() ((void)0) #else /* use GLPK MP module */ /*********************************************************************** * INTEGER NUMBERS * --------------- * Depending on its magnitude an integer number of arbitrary precision * is represented either in short format or in long format. * * Short format corresponds to the int type and allows representing * integer numbers in the range [-(2^31-1), +(2^31-1)]. Note that for * the most negative number of int type the short format is not used. * * In long format integer numbers are represented using the positional * system with the base (radix) 2^16 = 65536: * * x = (-1)^s sum{j in 0..n-1} d[j] * 65536^j, * * where x is the integer to be represented, s is its sign (+1 or -1), * d[j] are its digits (0 <= d[j] <= 65535). * * RATIONAL NUMBERS * ---------------- * A rational number is represented as an irreducible fraction: * * p / q, * * where p (numerator) and q (denominator) are integer numbers (q > 0) * having no common divisors. */ struct mpz { /* integer number */ int val; /* if ptr is a null pointer, the number is in short format, and val is its value; otherwise, the number is in long format, and val is its sign (+1 or -1) */ struct mpz_seg *ptr; /* pointer to the linked list of the number segments ordered in ascending of powers of the base */ }; struct mpz_seg { /* integer number segment */ unsigned short d[6]; /* six digits of the number ordered in ascending of powers of the base */ struct mpz_seg *next; /* pointer to the next number segment */ }; struct mpq { /* rational number (p / q) */ struct mpz p; /* numerator */ struct mpz q; /* denominator */ }; typedef struct mpz *mpz_t; typedef struct mpq *mpq_t; #define gmp_get_atom _glp_gmp_get_atom void *gmp_get_atom(int size); #define gmp_free_atom _glp_gmp_free_atom void gmp_free_atom(void *ptr, int size); #define gmp_pool_count _glp_gmp_pool_count int gmp_pool_count(void); #define gmp_get_work _glp_gmp_get_work unsigned short *gmp_get_work(int size); #define gmp_free_mem _glp_gmp_free_mem void gmp_free_mem(void); #define mpz_init(x) (void)((x) = _mpz_init()) #define _mpz_init _glp_mpz_init mpz_t _mpz_init(void); /* initialize x and set its value to 0 */ #define mpz_clear _glp_mpz_clear void mpz_clear(mpz_t x); /* free the space occupied by x */ #define mpz_set _glp_mpz_set void mpz_set(mpz_t z, mpz_t x); /* set the value of z from x */ #define mpz_set_si _glp_mpz_set_si void mpz_set_si(mpz_t x, int val); /* set the value of x to val */ #define mpz_get_d _glp_mpz_get_d double mpz_get_d(mpz_t x); /* convert x to a double, truncating if necessary */ #define mpz_get_d_2exp _glp_mpz_get_d_2exp double mpz_get_d_2exp(int *exp, mpz_t x); /* convert x to a double, returning the exponent separately */ #define mpz_swap _glp_mpz_swap void mpz_swap(mpz_t x, mpz_t y); /* swap the values x and y efficiently */ #define mpz_add _glp_mpz_add void mpz_add(mpz_t, mpz_t, mpz_t); /* set z to x + y */ #define mpz_sub _glp_mpz_sub void mpz_sub(mpz_t, mpz_t, mpz_t); /* set z to x - y */ #define mpz_mul _glp_mpz_mul void mpz_mul(mpz_t, mpz_t, mpz_t); /* set z to x * y */ #define mpz_neg _glp_mpz_neg void mpz_neg(mpz_t z, mpz_t x); /* set z to 0 - x */ #define mpz_abs _glp_mpz_abs void mpz_abs(mpz_t z, mpz_t x); /* set z to the absolute value of x */ #define mpz_div _glp_mpz_div void mpz_div(mpz_t q, mpz_t r, mpz_t x, mpz_t y); /* divide x by y, forming quotient q and/or remainder r */ #define mpz_gcd _glp_mpz_gcd void mpz_gcd(mpz_t z, mpz_t x, mpz_t y); /* set z to the greatest common divisor of x and y */ #define mpz_cmp _glp_mpz_cmp int mpz_cmp(mpz_t x, mpz_t y); /* compare x and y */ #define mpz_sgn _glp_mpz_sgn int mpz_sgn(mpz_t x); /* return +1 if x > 0, 0 if x = 0, and -1 if x < 0 */ #define mpz_out_str _glp_mpz_out_str int mpz_out_str(void *fp, int base, mpz_t x); /* output x on stream fp, as a string in given base */ #define mpq_init(x) (void)((x) = _mpq_init()) #define _mpq_init _glp_mpq_init mpq_t _mpq_init(void); /* initialize x, and set its value to 0/1 */ #define mpq_clear _glp_mpq_clear void mpq_clear(mpq_t x); /* free the space occupied by x */ #define mpq_canonicalize _glp_mpq_canonicalize void mpq_canonicalize(mpq_t x); /* canonicalize x */ #define mpq_set _glp_mpq_set void mpq_set(mpq_t z, mpq_t x); /* set the value of z from x */ #define mpq_set_si _glp_mpq_set_si void mpq_set_si(mpq_t x, int p, unsigned int q); /* set the value of x to p/q */ #define mpq_get_d _glp_mpq_get_d double mpq_get_d(mpq_t x); /* convert x to a double, truncating if necessary */ #define mpq_set_d _glp_mpq_set_d void mpq_set_d(mpq_t x, double val); /* set x to val; there is no rounding, the conversion is exact */ #define mpq_add _glp_mpq_add void mpq_add(mpq_t z, mpq_t x, mpq_t y); /* set z to x + y */ #define mpq_sub _glp_mpq_sub void mpq_sub(mpq_t z, mpq_t x, mpq_t y); /* set z to x - y */ #define mpq_mul _glp_mpq_mul void mpq_mul(mpq_t z, mpq_t x, mpq_t y); /* set z to x * y */ #define mpq_div _glp_mpq_div void mpq_div(mpq_t z, mpq_t x, mpq_t y); /* set z to x / y */ #define mpq_neg _glp_mpq_neg void mpq_neg(mpq_t z, mpq_t x); /* set z to 0 - x */ #define mpq_abs _glp_mpq_abs void mpq_abs(mpq_t z, mpq_t x); /* set z to the absolute value of x */ #define mpq_cmp _glp_mpq_cmp int mpq_cmp(mpq_t x, mpq_t y); /* compare x and y */ #define mpq_sgn _glp_mpq_sgn int mpq_sgn(mpq_t x); /* return +1 if x > 0, 0 if x = 0, and -1 if x < 0 */ #define mpq_out_str _glp_mpq_out_str int mpq_out_str(void *fp, int base, mpq_t x); /* output x on stream fp, as a string in given base */ #endif #endif /* eof */ glpk-5.0/src/misc/okalg.c0000644000062000006210000003040413766346220014466 0ustar maomkpasswd/* okalg.c (out-of-kilter algorithm) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2009-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "okalg.h" /*********************************************************************** * NAME * * okalg - out-of-kilter algorithm * * SYNOPSIS * * #include "okalg.h" * int okalg(int nv, int na, const int tail[], const int head[], * const int low[], const int cap[], const int cost[], int x[], * int pi[]); * * DESCRIPTION * * The routine okalg implements the out-of-kilter algorithm to find a * minimal-cost circulation in the specified flow network. * * INPUT PARAMETERS * * nv is the number of nodes, nv >= 0. * * na is the number of arcs, na >= 0. * * tail[a], a = 1,...,na, is the index of tail node of arc a. * * head[a], a = 1,...,na, is the index of head node of arc a. * * low[a], a = 1,...,na, is an lower bound to the flow through arc a. * * cap[a], a = 1,...,na, is an upper bound to the flow through arc a, * which is the capacity of the arc. * * cost[a], a = 1,...,na, is a per-unit cost of the flow through arc a. * * NOTES * * 1. Multiple arcs are allowed, but self-loops are not allowed. * * 2. It is required that 0 <= low[a] <= cap[a] for all arcs. * * 3. Arc costs may have any sign. * * OUTPUT PARAMETERS * * x[a], a = 1,...,na, is optimal value of the flow through arc a. * * pi[i], i = 1,...,nv, is Lagrange multiplier for flow conservation * equality constraint corresponding to node i (the node potential). * * RETURNS * * 0 optimal circulation found; * * 1 there is no feasible circulation; * * 2 integer overflow occured; * * 3 optimality test failed (logic error). * * REFERENCES * * L.R.Ford, Jr., and D.R.Fulkerson, "Flows in Networks," The RAND * Corp., Report R-375-PR (August 1962), Chap. III "Minimal Cost Flow * Problems," pp.113-26. */ static int overflow(int u, int v) { /* check for integer overflow on computing u + v */ if (u > 0 && v > 0 && u + v < 0) return 1; if (u < 0 && v < 0 && u + v > 0) return 1; return 0; } int okalg(int nv, int na, const int tail[], const int head[], const int low[], const int cap[], const int cost[], int x[], int pi[]) { int a, aok, delta, i, j, k, lambda, pos1, pos2, s, t, temp, ret, *ptr, *arc, *link, *list; /* sanity checks */ xassert(nv >= 0); xassert(na >= 0); for (a = 1; a <= na; a++) { i = tail[a], j = head[a]; xassert(1 <= i && i <= nv); xassert(1 <= j && j <= nv); xassert(i != j); xassert(0 <= low[a] && low[a] <= cap[a]); } /* allocate working arrays */ ptr = xcalloc(1+nv+1, sizeof(int)); arc = xcalloc(1+na+na, sizeof(int)); link = xcalloc(1+nv, sizeof(int)); list = xcalloc(1+nv, sizeof(int)); /* ptr[i] := (degree of node i) */ for (i = 1; i <= nv; i++) ptr[i] = 0; for (a = 1; a <= na; a++) { ptr[tail[a]]++; ptr[head[a]]++; } /* initialize arc pointers */ ptr[1]++; for (i = 1; i < nv; i++) ptr[i+1] += ptr[i]; ptr[nv+1] = ptr[nv]; /* build arc lists */ for (a = 1; a <= na; a++) { arc[--ptr[tail[a]]] = a; arc[--ptr[head[a]]] = a; } xassert(ptr[1] == 1); xassert(ptr[nv+1] == na+na+1); /* now the indices of arcs incident to node i are stored in * locations arc[ptr[i]], arc[ptr[i]+1], ..., arc[ptr[i+1]-1] */ /* initialize arc flows and node potentials */ for (a = 1; a <= na; a++) x[a] = 0; for (i = 1; i <= nv; i++) pi[i] = 0; loop: /* main loop starts here */ /* find out-of-kilter arc */ aok = 0; for (a = 1; a <= na; a++) { i = tail[a], j = head[a]; if (overflow(cost[a], pi[i] - pi[j])) { ret = 2; goto done; } lambda = cost[a] + (pi[i] - pi[j]); if (x[a] < low[a] || (lambda < 0 && x[a] < cap[a])) { /* arc a = i->j is out of kilter, and we need to increase * the flow through this arc */ aok = a, s = j, t = i; break; } if (x[a] > cap[a] || (lambda > 0 && x[a] > low[a])) { /* arc a = i->j is out of kilter, and we need to decrease * the flow through this arc */ aok = a, s = i, t = j; break; } } if (aok == 0) { /* all arcs are in kilter */ /* check for feasibility */ for (a = 1; a <= na; a++) { if (!(low[a] <= x[a] && x[a] <= cap[a])) { ret = 3; goto done; } } for (i = 1; i <= nv; i++) { temp = 0; for (k = ptr[i]; k < ptr[i+1]; k++) { a = arc[k]; if (tail[a] == i) { /* a is outgoing arc */ temp += x[a]; } else if (head[a] == i) { /* a is incoming arc */ temp -= x[a]; } else xassert(a != a); } if (temp != 0) { ret = 3; goto done; } } /* check for optimality */ for (a = 1; a <= na; a++) { i = tail[a], j = head[a]; lambda = cost[a] + (pi[i] - pi[j]); if ((lambda > 0 && x[a] != low[a]) || (lambda < 0 && x[a] != cap[a])) { ret = 3; goto done; } } /* current circulation is optimal */ ret = 0; goto done; } /* now we need to find a cycle (t, a, s, ..., t), which allows * increasing the flow along it, where a is the out-of-kilter arc * just found */ /* link[i] = 0 means that node i is not labelled yet; * link[i] = a means that arc a immediately precedes node i */ /* initially only node s is labelled */ for (i = 1; i <= nv; i++) link[i] = 0; link[s] = aok, list[1] = s, pos1 = pos2 = 1; /* breadth first search */ while (pos1 <= pos2) { /* dequeue node i */ i = list[pos1++]; /* consider all arcs incident to node i */ for (k = ptr[i]; k < ptr[i+1]; k++) { a = arc[k]; if (tail[a] == i) { /* a = i->j is a forward arc from s to t */ j = head[a]; /* if node j has been labelled, skip the arc */ if (link[j] != 0) continue; /* if the arc does not allow increasing the flow through * it, skip the arc */ if (x[a] >= cap[a]) continue; if (overflow(cost[a], pi[i] - pi[j])) { ret = 2; goto done; } lambda = cost[a] + (pi[i] - pi[j]); if (lambda > 0 && x[a] >= low[a]) continue; } else if (head[a] == i) { /* a = i<-j is a backward arc from s to t */ j = tail[a]; /* if node j has been labelled, skip the arc */ if (link[j] != 0) continue; /* if the arc does not allow decreasing the flow through * it, skip the arc */ if (x[a] <= low[a]) continue; if (overflow(cost[a], pi[j] - pi[i])) { ret = 2; goto done; } lambda = cost[a] + (pi[j] - pi[i]); if (lambda < 0 && x[a] <= cap[a]) continue; } else xassert(a != a); /* label node j and enqueue it */ link[j] = a, list[++pos2] = j; /* check for breakthrough */ if (j == t) goto brkt; } } /* NONBREAKTHROUGH */ /* consider all arcs, whose one endpoint is labelled and other is * not, and determine maximal change of node potentials */ delta = 0; for (a = 1; a <= na; a++) { i = tail[a], j = head[a]; if (link[i] != 0 && link[j] == 0) { /* a = i->j, where node i is labelled, node j is not */ if (overflow(cost[a], pi[i] - pi[j])) { ret = 2; goto done; } lambda = cost[a] + (pi[i] - pi[j]); if (x[a] <= cap[a] && lambda > 0) if (delta == 0 || delta > + lambda) delta = + lambda; } else if (link[i] == 0 && link[j] != 0) { /* a = j<-i, where node j is labelled, node i is not */ if (overflow(cost[a], pi[i] - pi[j])) { ret = 2; goto done; } lambda = cost[a] + (pi[i] - pi[j]); if (x[a] >= low[a] && lambda < 0) if (delta == 0 || delta > - lambda) delta = - lambda; } } if (delta == 0) { /* there is no feasible circulation */ ret = 1; goto done; } /* increase potentials of all unlabelled nodes */ for (i = 1; i <= nv; i++) { if (link[i] == 0) { if (overflow(pi[i], delta)) { ret = 2; goto done; } pi[i] += delta; } } goto loop; brkt: /* BREAKTHROUGH */ /* walk through arcs of the cycle (t, a, s, ..., t) found in the * reverse order and determine maximal change of the flow */ delta = 0; for (j = t;; j = i) { /* arc a immediately precedes node j in the cycle */ a = link[j]; if (head[a] == j) { /* a = i->j is a forward arc of the cycle */ i = tail[a]; lambda = cost[a] + (pi[i] - pi[j]); if (lambda > 0 && x[a] < low[a]) { /* x[a] may be increased until its lower bound */ temp = low[a] - x[a]; } else if (lambda <= 0 && x[a] < cap[a]) { /* x[a] may be increased until its upper bound */ temp = cap[a] - x[a]; } else xassert(a != a); } else if (tail[a] == j) { /* a = i<-j is a backward arc of the cycle */ i = head[a]; lambda = cost[a] + (pi[j] - pi[i]); if (lambda < 0 && x[a] > cap[a]) { /* x[a] may be decreased until its upper bound */ temp = x[a] - cap[a]; } else if (lambda >= 0 && x[a] > low[a]) { /* x[a] may be decreased until its lower bound */ temp = x[a] - low[a]; } else xassert(a != a); } else xassert(a != a); if (delta == 0 || delta > temp) delta = temp; /* check for end of the cycle */ if (i == t) break; } xassert(delta > 0); /* increase the flow along the cycle */ for (j = t;; j = i) { /* arc a immediately precedes node j in the cycle */ a = link[j]; if (head[a] == j) { /* a = i->j is a forward arc of the cycle */ i = tail[a]; /* overflow cannot occur */ x[a] += delta; } else if (tail[a] == j) { /* a = i<-j is a backward arc of the cycle */ i = head[a]; /* overflow cannot occur */ x[a] -= delta; } else xassert(a != a); /* check for end of the cycle */ if (i == t) break; } goto loop; done: /* free working arrays */ xfree(ptr); xfree(arc); xfree(link); xfree(list); return ret; } /* eof */ glpk-5.0/src/misc/okalg.h0000644000062000006210000000230713766346220014474 0ustar maomkpasswd/* okalg.h (out-of-kilter algorithm) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2009-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef OKALG_H #define OKALG_H #define okalg _glp_okalg int okalg(int nv, int na, const int tail[], const int head[], const int low[], const int cap[], const int cost[], int x[], int pi[]); /* out-of-kilter algorithm */ #endif /* eof */ glpk-5.0/src/misc/qmd.c0000644000062000006210000000615313766346220014156 0ustar maomkpasswd/* qmd.c */ #include "env.h" #include "qmd.h" void genqmd(int *neqns, int xadj[], int adjncy[], int perm[], int invp[], int deg[], int marker[], int rchset[], int nbrhd[], int qsize[], int qlink[], int *nofsub) { static const char func[] = "genqmd"; xassert(neqns == neqns); xassert(xadj == xadj); xassert(adjncy == adjncy); xassert(perm == perm); xassert(invp == invp); xassert(deg == deg); xassert(marker == marker); xassert(rchset == rchset); xassert(nbrhd == nbrhd); xassert(qsize == qsize); xassert(qlink == qlink); xassert(nofsub == nofsub); xerror("%s: sorry, this routine is temporarily disabled due to li" "censing problems\n", func); abort(); } void qmdrch(int *root, int xadj[], int adjncy[], int deg[], int marker[], int *rchsze, int rchset[], int *nhdsze, int nbrhd[]) { static const char func[] = "qmdrch"; xassert(root == root); xassert(xadj == xadj); xassert(adjncy == adjncy); xassert(deg == deg); xassert(marker == marker); xassert(rchsze == rchsze); xassert(rchset == rchset); xassert(nhdsze == nhdsze); xassert(nbrhd == nbrhd); xerror("%s: sorry, this routine is temporarily disabled due to li" "censing problems\n", func); abort(); } void qmdqt(int *root, int xadj[], int adjncy[], int marker[], int *rchsze, int rchset[], int nbrhd[]) { static const char func[] = "qmdqt"; xassert(root == root); xassert(xadj == xadj); xassert(adjncy == adjncy); xassert(marker == marker); xassert(rchsze == rchsze); xassert(rchset == rchset); xassert(nbrhd == nbrhd); xerror("%s: sorry, this routine is temporarily disabled due to li" "censing problems\n", func); abort(); } void qmdupd(int xadj[], int adjncy[], int *nlist, int list[], int deg[], int qsize[], int qlink[], int marker[], int rchset[], int nbrhd[]) { static const char func[] = "qmdupd"; xassert(xadj == xadj); xassert(adjncy == adjncy); xassert(nlist == nlist); xassert(list == list); xassert(deg == deg); xassert(qsize == qsize); xassert(qlink == qlink); xassert(marker == marker); xassert(rchset == rchset); xassert(nbrhd == nbrhd); xerror("%s: sorry, this routine is temporarily disabled due to li" "censing problems\n", func); abort(); } void qmdmrg(int xadj[], int adjncy[], int deg[], int qsize[], int qlink[], int marker[], int *deg0, int *nhdsze, int nbrhd[], int rchset[], int ovrlp[]) { static const char func[] = "qmdmrg"; xassert(xadj == xadj); xassert(adjncy == adjncy); xassert(deg == deg); xassert(qsize == qsize); xassert(qlink == qlink); xassert(marker == marker); xassert(deg0 == deg0); xassert(nhdsze == nhdsze); xassert(nbrhd == nbrhd); xassert(rchset == rchset); xassert(ovrlp == ovrlp); xerror("%s: sorry, this routine is temporarily disabled due to li" "censing problems\n", func); abort(); } /* eof */ glpk-5.0/src/misc/qmd.h0000644000062000006210000000404113766346220014155 0ustar maomkpasswd/* qmd.h (quotient minimum degree algorithm) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2001 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef QMD_H #define QMD_H #define genqmd _glp_genqmd void genqmd(int *neqns, int xadj[], int adjncy[], int perm[], int invp[], int deg[], int marker[], int rchset[], int nbrhd[], int qsize[], int qlink[], int *nofsub); /* GENeral Quotient Minimum Degree algorithm */ #define qmdrch _glp_qmdrch void qmdrch(int *root, int xadj[], int adjncy[], int deg[], int marker[], int *rchsze, int rchset[], int *nhdsze, int nbrhd[]); /* Quotient MD ReaCHable set */ #define qmdqt _glp_qmdqt void qmdqt(int *root, int xadj[], int adjncy[], int marker[], int *rchsze, int rchset[], int nbrhd[]); /* Quotient MD Quotient graph Transformation */ #define qmdupd _glp_qmdupd void qmdupd(int xadj[], int adjncy[], int *nlist, int list[], int deg[], int qsize[], int qlink[], int marker[], int rchset[], int nbrhd[]); /* Quotient MD UPDate */ #define qmdmrg _glp_qmdmrg void qmdmrg(int xadj[], int adjncy[], int deg[], int qsize[], int qlink[], int marker[], int *deg0, int *nhdsze, int nbrhd[], int rchset[], int ovrlp[]); /* Quotient MD MeRGe */ #endif /* eof */ glpk-5.0/src/misc/relax4.c0000644000062000006210000000106413766346220014570 0ustar maomkpasswd/* relax4.c */ #include "env.h" #include "relax4.h" int relax4(struct relax4_csa *csa) { static const char func[] = "relax4"; xassert(csa == csa); xerror("%s: sorry, this routine is temporarily disabled due to li" "censing problems\n", func); abort(); return -1; } void relax4_inidat(struct relax4_csa *csa) { static const char func[] = "relax4_inidat"; xassert(csa == csa); xerror("%s: sorry, this routine is temporarily disabled due to li" "censing problems\n", func); abort(); } /* eof */ glpk-5.0/src/misc/relax4.h0000644000062000006210000000764113766346220014604 0ustar maomkpasswd/* relax4.h */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2012-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef RELAX4_H #define RELAX4_H struct relax4_csa { /* common storage area */ /* input parameters --------------------------------------------*/ int n; /* number of nodes */ int na; /* number of arcs */ int large; /* very large int to represent infinity */ int repeat; /* true if initialization is to be skipped (false otherwise) */ int crash; /* 0 if default initialization is used * 1 if auction initialization is used */ int *startn; /* int startn[1+na]; */ /* startn[j] = starting node for arc j, j = 1,...,na */ int *endn; /* int endn[1+na] */ /* endn[j] = ending node for arc j, j = 1,...,na */ int *fou; /* int fou[1+n]; */ /* fou[i] = first arc out of node i, i = 1,...,n */ int *nxtou; /* int nxtou[1+na]; */ /* nxtou[j] = next arc out of the starting node of arc j, * j = 1,...,na */ int *fin; /* int fin[1+n]; */ /* fin[i] = first arc into node i, i = 1,...,n */ int *nxtin; /* int nxtin[1+na]; */ /* nxtin[j] = next arc into the ending node of arc j, * j = 1,...,na */ /* updated parameters ------------------------------------------*/ int *rc; /* int rc[1+na]; */ /* rc[j] = reduced cost of arc j, j = 1,...,na */ int *u; /* int u[1+na]; */ /* u[j] = capacity of arc j on input * and (capacity of arc j) - x(j) on output, j = 1,...,na */ int *dfct; /* int dfct[1+n]; */ /* dfct[i] = demand at node i on input * and zero on output, i = 1,...,n */ /* output parameters -------------------------------------------*/ int *x; /* int x[1+na]; */ /* x[j] = flow on arc j, j = 1,...,na */ int nmultinode; /* number of multinode relaxation iterations in RELAX4 */ int iter; /* number of relaxation iterations in RELAX4 */ int num_augm; /* number of flow augmentation steps in RELAX4 */ int num_ascnt; /* number of multinode ascent steps in RELAX4 */ int nsp; /* number of auction/shortest path iterations */ /* working parameters ------------------------------------------*/ int *label; /* int label, tempin, p[1+n]; */ int *prdcsr; /* int prdcsr, tempou, price[1+n]; */ int *save; /* int save[1+na]; */ int *tfstou; /* int tfstou, fpushf[1+n]; */ int *tnxtou; /* int tnxtou, nxtpushf[1+na]; */ int *tfstin; /* int tfstin, fpushb[1+n]; */ int *tnxtin; /* int tnxtin, nxtpushb[1+na]; */ int *nxtqueue; /* int nxtqueue[1+n]; */ char *scan; /* bool scan[1+n]; */ char *mark; /* bool mark, path_id[1+n]; */ /* working parameters used by routine auction only -------------*/ int *extend_arc; /* int extend_arc[1+n]; */ int *sb_level; /* int sb_level[1+n]; */ int *sb_arc; /* int sb_arc[1+n]; */ }; #define relax4 _glp_relax4 int relax4(struct relax4_csa *csa); #define relax4_inidat _glp_relax4_inidat void relax4_inidat(struct relax4_csa *csa); #endif /* eof */ glpk-5.0/src/misc/rgr.c0000644000062000006210000001407413766346220014170 0ustar maomkpasswd/* rgr.c (raster graphics) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2004-2018 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "rgr.h" /*********************************************************************** * NAME * * rgr_write_bmp16 - write 16-color raster image in BMP file format * * SYNOPSIS * * #include "rgr.h" * int rgr_write_bmp16(const char *fname, int m, int n, const char * map[]); * * DESCRIPTION * * The routine rgr_write_bmp16 writes 16-color raster image in * uncompressed BMP file format (Windows bitmap) to a binary file whose * name is specified by the character string fname. * * The parameters m and n specify, respectively, the number of rows and * the numbers of columns (i.e. height and width) of the raster image. * * The character array map has m*n elements. Elements map[0, ..., n-1] * correspond to the first (top) scanline, elements map[n, ..., 2*n-1] * correspond to the second scanline, etc. * * Each element of the array map specifies a color of the corresponding * pixel as 8-bit binary number XXXXIRGB, where four high-order bits (X) * are ignored, I is high intensity bit, R is red color bit, G is green * color bit, and B is blue color bit. Thus, all 16 possible colors are * coded as following hexadecimal numbers: * * 0x00 = black 0x08 = dark gray * 0x01 = blue 0x09 = bright blue * 0x02 = green 0x0A = bright green * 0x03 = cyan 0x0B = bright cyan * 0x04 = red 0x0C = bright red * 0x05 = magenta 0x0D = bright magenta * 0x06 = brown 0x0E = yellow * 0x07 = light gray 0x0F = white * * RETURNS * * If no error occured, the routine returns zero; otherwise, it prints * an appropriate error message and returns non-zero. */ static void put_byte(FILE *fp, int c) { fputc(c, fp); return; } static void put_word(FILE *fp, int w) { /* big endian */ put_byte(fp, w); put_byte(fp, w >> 8); return; } static void put_dword(FILE *fp, int d) { /* big endian */ put_word(fp, d); put_word(fp, d >> 16); return; } int rgr_write_bmp16(const char *fname, int m, int n, const char map[]) { FILE *fp; int offset, bmsize, i, j, b, ret = 0; if (!(1 <= m && m <= 32767)) xerror("rgr_write_bmp16: m = %d; invalid height\n", m); if (!(1 <= n && n <= 32767)) xerror("rgr_write_bmp16: n = %d; invalid width\n", n); fp = fopen(fname, "wb"); if (fp == NULL) { xprintf("rgr_write_bmp16: unable to create '%s' - %s\n", #if 0 /* 29/I-2017 */ fname, strerror(errno)); #else fname, xstrerr(errno)); #endif ret = 1; goto fini; } offset = 14 + 40 + 16 * 4; bmsize = (4 * n + 31) / 32; /* struct BMPFILEHEADER (14 bytes) */ /* UINT bfType */ put_byte(fp, 'B'), put_byte(fp, 'M'); /* DWORD bfSize */ put_dword(fp, offset + bmsize * 4); /* UINT bfReserved1 */ put_word(fp, 0); /* UNIT bfReserved2 */ put_word(fp, 0); /* DWORD bfOffBits */ put_dword(fp, offset); /* struct BMPINFOHEADER (40 bytes) */ /* DWORD biSize */ put_dword(fp, 40); /* LONG biWidth */ put_dword(fp, n); /* LONG biHeight */ put_dword(fp, m); /* WORD biPlanes */ put_word(fp, 1); /* WORD biBitCount */ put_word(fp, 4); /* DWORD biCompression */ put_dword(fp, 0 /* BI_RGB */); /* DWORD biSizeImage */ put_dword(fp, 0); /* LONG biXPelsPerMeter */ put_dword(fp, 2953 /* 75 dpi */); /* LONG biYPelsPerMeter */ put_dword(fp, 2953 /* 75 dpi */); /* DWORD biClrUsed */ put_dword(fp, 0); /* DWORD biClrImportant */ put_dword(fp, 0); /* struct RGBQUAD (16 * 4 = 64 bytes) */ /* CGA-compatible colors: */ /* 0x00 = black */ put_dword(fp, 0x000000); /* 0x01 = blue */ put_dword(fp, 0x000080); /* 0x02 = green */ put_dword(fp, 0x008000); /* 0x03 = cyan */ put_dword(fp, 0x008080); /* 0x04 = red */ put_dword(fp, 0x800000); /* 0x05 = magenta */ put_dword(fp, 0x800080); /* 0x06 = brown */ put_dword(fp, 0x808000); /* 0x07 = light gray */ put_dword(fp, 0xC0C0C0); /* 0x08 = dark gray */ put_dword(fp, 0x808080); /* 0x09 = bright blue */ put_dword(fp, 0x0000FF); /* 0x0A = bright green */ put_dword(fp, 0x00FF00); /* 0x0B = bright cyan */ put_dword(fp, 0x00FFFF); /* 0x0C = bright red */ put_dword(fp, 0xFF0000); /* 0x0D = bright magenta */ put_dword(fp, 0xFF00FF); /* 0x0E = yellow */ put_dword(fp, 0xFFFF00); /* 0x0F = white */ put_dword(fp, 0xFFFFFF); /* pixel data bits */ b = 0; for (i = m - 1; i >= 0; i--) { for (j = 0; j < ((n + 7) / 8) * 8; j++) { b <<= 4; b |= (j < n ? map[i * n + j] & 15 : 0); if (j & 1) put_byte(fp, b); } } fflush(fp); if (ferror(fp)) { xprintf("rgr_write_bmp16: write error on '%s' - %s\n", #if 0 /* 29/I-2017 */ fname, strerror(errno)); #else fname, xstrerr(errno)); #endif ret = 1; } fini: if (fp != NULL) fclose(fp); return ret; } /* eof */ glpk-5.0/src/misc/rgr.h0000644000062000006210000000223213766346220014166 0ustar maomkpasswd/* rgr.h (raster graphics) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2004-2018 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef RGR_H #define RGR_H #define rgr_write_bmp16 _glp_rgr_write_bmp16 int rgr_write_bmp16(const char *fname, int m, int n, const char map[]); /* write 16-color raster image in BMP file format */ #endif /* eof */ glpk-5.0/src/misc/rng.c0000644000062000006210000001414613766346220014164 0ustar maomkpasswd/* rng.c (pseudo-random number generator) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * * This code is a modified version of the module GB_FLIP, a portable * pseudo-random number generator. The original version of GB_FLIP is * a part of The Stanford GraphBase developed by Donald E. Knuth (see * http://www-cs-staff.stanford.edu/~knuth/sgb.html). * * Note that all changes concern only external names, so this modified * version produces exactly the same results as the original version. * * Changes were made by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "rng.h" #if 0 int A[56] = { -1 }; #else #define A (rand->A) #endif /* pseudo-random values */ #if 0 int *fptr = A; #else #define fptr (rand->fptr) #endif /* the next A value to be exported */ #define mod_diff(x, y) (((x) - (y)) & 0x7FFFFFFF) /* difference modulo 2^31 */ static int flip_cycle(RNG *rand) { /* this is an auxiliary routine to do 55 more steps of the basic * recurrence, at high speed, and to reset fptr */ int *ii, *jj; for (ii = &A[1], jj = &A[32]; jj <= &A[55]; ii++, jj++) *ii = mod_diff(*ii, *jj); for (jj = &A[1]; ii <= &A[55]; ii++, jj++) *ii = mod_diff(*ii, *jj); fptr = &A[54]; return A[55]; } /*********************************************************************** * NAME * * rng_create_rand - create pseudo-random number generator * * SYNOPSIS * * #include "rng.h" * RNG *rng_create_rand(void); * * DESCRIPTION * * The routine rng_create_rand creates and initializes a pseudo-random * number generator. * * RETURNS * * The routine returns a pointer to the generator created. */ RNG *rng_create_rand(void) { RNG *rand; int i; rand = talloc(1, RNG); A[0] = -1; for (i = 1; i <= 55; i++) A[i] = 0; fptr = A; rng_init_rand(rand, 1); return rand; } /*********************************************************************** * NAME * * rng_init_rand - initialize pseudo-random number generator * * SYNOPSIS * * #include "rng.h" * void rng_init_rand(RNG *rand, int seed); * * DESCRIPTION * * The routine rng_init_rand initializes the pseudo-random number * generator. The parameter seed may be any integer number. Note that * on creating the generator this routine is called with the parameter * seed equal to 1. */ void rng_init_rand(RNG *rand, int seed) { int i; int prev = seed, next = 1; seed = prev = mod_diff(prev, 0); A[55] = prev; for (i = 21; i; i = (i + 21) % 55) { A[i] = next; next = mod_diff(prev, next); if (seed & 1) seed = 0x40000000 + (seed >> 1); else seed >>= 1; next = mod_diff(next, seed); prev = A[i]; } flip_cycle(rand); flip_cycle(rand); flip_cycle(rand); flip_cycle(rand); flip_cycle(rand); return; } /*********************************************************************** * NAME * * rng_next_rand - obtain pseudo-random integer in the range [0, 2^31-1] * * SYNOPSIS * * #include "rng.h" * int rng_next_rand(RNG *rand); * * RETURNS * * The routine rng_next_rand returns a next pseudo-random integer which * is uniformly distributed between 0 and 2^31-1, inclusive. The period * length of the generated numbers is 2^85 - 2^30. The low order bits of * the generated numbers are just as random as the high-order bits. */ int rng_next_rand(RNG *rand) { return *fptr >= 0 ? *fptr-- : flip_cycle(rand); } /*********************************************************************** * NAME * * rng_unif_rand - obtain pseudo-random integer in the range [0, m-1] * * SYNOPSIS * * #include "rng.h" * int rng_unif_rand(RNG *rand, int m); * * RETURNS * * The routine rng_unif_rand returns a next pseudo-random integer which * is uniformly distributed between 0 and m-1, inclusive, where m is any * positive integer less than 2^31. */ #define two_to_the_31 ((unsigned int)0x80000000) int rng_unif_rand(RNG *rand, int m) { unsigned int t = two_to_the_31 - (two_to_the_31 % m); int r; xassert(m > 0); do { r = rng_next_rand(rand); } while (t <= (unsigned int)r); return r % m; } /*********************************************************************** * NAME * * rng_delete_rand - delete pseudo-random number generator * * SYNOPSIS * * #include "rng.h" * void rng_delete_rand(RNG *rand); * * DESCRIPTION * * The routine rng_delete_rand frees all the memory allocated to the * specified pseudo-random number generator. */ void rng_delete_rand(RNG *rand) { tfree(rand); return; } /**********************************************************************/ #ifdef GLP_TEST /* To be sure that this modified version produces the same results as * the original version, run this validation program. */ int main(void) { RNG *rand; int j; rand = rng_create_rand(); rng_init_rand(rand, -314159); if (rng_next_rand(rand) != 119318998) { fprintf(stderr, "Failure on the first try!\n"); return -1; } for (j = 1; j <= 133; j++) rng_next_rand(rand); if (rng_unif_rand(rand, 0x55555555) != 748103812) { fprintf(stderr, "Failure on the second try!\n"); return -2; } fprintf(stderr, "OK, the random-number generator routines seem to" " work!\n"); rng_delete_rand(rand); return 0; } #endif /* eof */ glpk-5.0/src/misc/rng.h0000644000062000006210000000412613766346220014166 0ustar maomkpasswd/* rng.h (pseudo-random number generator) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2003 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef RNG_H #define RNG_H typedef struct RNG RNG; struct RNG { /* Knuth's portable pseudo-random number generator */ int A[56]; /* pseudo-random values */ int *fptr; /* the next A value to be exported */ }; #define rng_create_rand _glp_rng_create_rand RNG *rng_create_rand(void); /* create pseudo-random number generator */ #define rng_init_rand _glp_rng_init_rand void rng_init_rand(RNG *rand, int seed); /* initialize pseudo-random number generator */ #define rng_next_rand _glp_rng_next_rand int rng_next_rand(RNG *rand); /* obtain pseudo-random integer in the range [0, 2^31-1] */ #define rng_unif_rand _glp_rng_unif_rand int rng_unif_rand(RNG *rand, int m); /* obtain pseudo-random integer in the range [0, m-1] */ #define rng_delete_rand _glp_rng_delete_rand void rng_delete_rand(RNG *rand); /* delete pseudo-random number generator */ #define rng_unif_01 _glp_rng_unif_01 double rng_unif_01(RNG *rand); /* obtain pseudo-random number in the range [0, 1] */ #define rng_uniform _glp_rng_uniform double rng_uniform(RNG *rand, double a, double b); /* obtain pseudo-random number in the range [a, b] */ #endif /* eof */ glpk-5.0/src/misc/rng1.c0000644000062000006210000000407013766346220014240 0ustar maomkpasswd/* rng1.c (pseudo-random number generator) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2003 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "rng.h" /*********************************************************************** * NAME * * rng_unif_01 - obtain pseudo-random number in the range [0, 1] * * SYNOPSIS * * #include "rng.h" * double rng_unif_01(RNG *rand); * * RETURNS * * The routine rng_unif_01 returns a next pseudo-random number which is * uniformly distributed in the range [0, 1]. */ double rng_unif_01(RNG *rand) { double x; x = (double)rng_next_rand(rand) / 2147483647.0; xassert(0.0 <= x && x <= 1.0); return x; } /*********************************************************************** * NAME * * rng_uniform - obtain pseudo-random number in the range [a, b] * * SYNOPSIS * * #include "rng.h" * double rng_uniform(RNG *rand, double a, double b); * * RETURNS * * The routine rng_uniform returns a next pseudo-random number which is * uniformly distributed in the range [a, b]. */ double rng_uniform(RNG *rand, double a, double b) { double x; xassert(a < b); x = rng_unif_01(rand); x = a * (1.0 - x) + b * x; xassert(a <= x && x <= b); return x; } /* eof */ glpk-5.0/src/misc/round2n.c0000644000062000006210000000372313766346220014764 0ustar maomkpasswd/* round2n.c (round floating-point number to nearest power of two) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2000 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "misc.h" /*********************************************************************** * NAME * * round2n - round floating-point number to nearest power of two * * SYNOPSIS * * #include "misc.h" * double round2n(double x); * * RETURNS * * Given a positive floating-point value x the routine round2n returns * 2^n such that |x - 2^n| is minimal. * * EXAMPLES * * round2n(10.1) = 2^3 = 8 * round2n(15.3) = 2^4 = 16 * round2n(0.01) = 2^(-7) = 0.0078125 * * BACKGROUND * * Let x = f * 2^e, where 0.5 <= f < 1 is a normalized fractional part, * e is an integer exponent. Then, obviously, 0.5 * 2^e <= x < 2^e, so * if x - 0.5 * 2^e <= 2^e - x, we choose 0.5 * 2^e = 2^(e-1), and 2^e * otherwise. The latter condition can be written as 2 * x <= 1.5 * 2^e * or 2 * f * 2^e <= 1.5 * 2^e or, finally, f <= 0.75. */ double round2n(double x) { int e; double f; xassert(x > 0.0); f = frexp(x, &e); return ldexp(1.0, f <= 0.75 ? e-1 : e); } /* eof */ glpk-5.0/src/misc/spm.c0000644000062000006210000006033313766346220014174 0ustar maomkpasswd/* glpspm.c (general sparse matrices) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2004-2018 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "hbm.h" #include "rgr.h" #include "spm.h" /*********************************************************************** * NAME * * spm_create_mat - create general sparse matrix * * SYNOPSIS * * #include "glpspm.h" * SPM *spm_create_mat(int m, int n); * * DESCRIPTION * * The routine spm_create_mat creates a general sparse matrix having * m rows and n columns. Being created the matrix is zero (empty), i.e. * has no elements. * * RETURNS * * The routine returns a pointer to the matrix created. */ SPM *spm_create_mat(int m, int n) { SPM *A; xassert(0 <= m && m < INT_MAX); xassert(0 <= n && n < INT_MAX); A = xmalloc(sizeof(SPM)); A->m = m; A->n = n; if (m == 0 || n == 0) { A->pool = NULL; A->row = NULL; A->col = NULL; } else { int i, j; A->pool = dmp_create_pool(); A->row = xcalloc(1+m, sizeof(SPME *)); for (i = 1; i <= m; i++) A->row[i] = NULL; A->col = xcalloc(1+n, sizeof(SPME *)); for (j = 1; j <= n; j++) A->col[j] = NULL; } return A; } /*********************************************************************** * NAME * * spm_new_elem - add new element to sparse matrix * * SYNOPSIS * * #include "glpspm.h" * SPME *spm_new_elem(SPM *A, int i, int j, double val); * * DESCRIPTION * * The routine spm_new_elem adds a new element to the specified sparse * matrix. Parameters i, j, and val specify the row number, the column * number, and a numerical value of the element, respectively. * * RETURNS * * The routine returns a pointer to the new element added. */ SPME *spm_new_elem(SPM *A, int i, int j, double val) { SPME *e; xassert(1 <= i && i <= A->m); xassert(1 <= j && j <= A->n); e = dmp_get_atom(A->pool, sizeof(SPME)); e->i = i; e->j = j; e->val = val; e->r_prev = NULL; e->r_next = A->row[i]; if (e->r_next != NULL) e->r_next->r_prev = e; e->c_prev = NULL; e->c_next = A->col[j]; if (e->c_next != NULL) e->c_next->c_prev = e; A->row[i] = A->col[j] = e; return e; } /*********************************************************************** * NAME * * spm_delete_mat - delete general sparse matrix * * SYNOPSIS * * #include "glpspm.h" * void spm_delete_mat(SPM *A); * * DESCRIPTION * * The routine deletes the specified general sparse matrix freeing all * the memory allocated to this object. */ void spm_delete_mat(SPM *A) { /* delete sparse matrix */ if (A->pool != NULL) dmp_delete_pool(A->pool); if (A->row != NULL) xfree(A->row); if (A->col != NULL) xfree(A->col); xfree(A); return; } /*********************************************************************** * NAME * * spm_test_mat_e - create test sparse matrix of E(n,c) class * * SYNOPSIS * * #include "glpspm.h" * SPM *spm_test_mat_e(int n, int c); * * DESCRIPTION * * The routine spm_test_mat_e creates a test sparse matrix of E(n,c) * class as described in the book: Ole 0sterby, Zahari Zlatev. Direct * Methods for Sparse Matrices. Springer-Verlag, 1983. * * Matrix of E(n,c) class is a symmetric positive definite matrix of * the order n. It has the number 4 on its main diagonal and the number * -1 on its four co-diagonals, two of which are neighbour to the main * diagonal and two others are shifted from the main diagonal on the * distance c. * * It is necessary that n >= 3 and 2 <= c <= n-1. * * RETURNS * * The routine returns a pointer to the matrix created. */ SPM *spm_test_mat_e(int n, int c) { SPM *A; int i; xassert(n >= 3 && 2 <= c && c <= n-1); A = spm_create_mat(n, n); for (i = 1; i <= n; i++) spm_new_elem(A, i, i, 4.0); for (i = 1; i <= n-1; i++) { spm_new_elem(A, i, i+1, -1.0); spm_new_elem(A, i+1, i, -1.0); } for (i = 1; i <= n-c; i++) { spm_new_elem(A, i, i+c, -1.0); spm_new_elem(A, i+c, i, -1.0); } return A; } /*********************************************************************** * NAME * * spm_test_mat_d - create test sparse matrix of D(n,c) class * * SYNOPSIS * * #include "glpspm.h" * SPM *spm_test_mat_d(int n, int c); * * DESCRIPTION * * The routine spm_test_mat_d creates a test sparse matrix of D(n,c) * class as described in the book: Ole 0sterby, Zahari Zlatev. Direct * Methods for Sparse Matrices. Springer-Verlag, 1983. * * Matrix of D(n,c) class is a non-singular matrix of the order n. It * has unity main diagonal, three co-diagonals above the main diagonal * on the distance c, which are cyclically continued below the main * diagonal, and a triangle block of the size 10x10 in the upper right * corner. * * It is necessary that n >= 14 and 1 <= c <= n-13. * * RETURNS * * The routine returns a pointer to the matrix created. */ SPM *spm_test_mat_d(int n, int c) { SPM *A; int i, j; xassert(n >= 14 && 1 <= c && c <= n-13); A = spm_create_mat(n, n); for (i = 1; i <= n; i++) spm_new_elem(A, i, i, 1.0); for (i = 1; i <= n-c; i++) spm_new_elem(A, i, i+c, (double)(i+1)); for (i = n-c+1; i <= n; i++) spm_new_elem(A, i, i-n+c, (double)(i+1)); for (i = 1; i <= n-c-1; i++) spm_new_elem(A, i, i+c+1, (double)(-i)); for (i = n-c; i <= n; i++) spm_new_elem(A, i, i-n+c+1, (double)(-i)); for (i = 1; i <= n-c-2; i++) spm_new_elem(A, i, i+c+2, 16.0); for (i = n-c-1; i <= n; i++) spm_new_elem(A, i, i-n+c+2, 16.0); for (j = 1; j <= 10; j++) for (i = 1; i <= 11-j; i++) spm_new_elem(A, i, n-11+i+j, 100.0 * (double)j); return A; } /*********************************************************************** * NAME * * spm_show_mat - write sparse matrix pattern in BMP file format * * SYNOPSIS * * #include "glpspm.h" * int spm_show_mat(const SPM *A, const char *fname); * * DESCRIPTION * * The routine spm_show_mat writes pattern of the specified sparse * matrix in uncompressed BMP file format (Windows bitmap) to a binary * file whose name is specified by the character string fname. * * Each pixel corresponds to one matrix element. The pixel colors have * the following meaning: * * Black structurally zero element * White positive element * Cyan negative element * Green zero element * Red duplicate element * * RETURNS * * If no error occured, the routine returns zero. Otherwise, it prints * an appropriate error message and returns non-zero. */ int spm_show_mat(const SPM *A, const char *fname) { int m = A->m; int n = A->n; int i, j, k, ret; char *map; xprintf("spm_show_mat: writing matrix pattern to '%s'...\n", fname); xassert(1 <= m && m <= 32767); xassert(1 <= n && n <= 32767); map = xmalloc(m * n); memset(map, 0x08, m * n); for (i = 1; i <= m; i++) { SPME *e; for (e = A->row[i]; e != NULL; e = e->r_next) { j = e->j; xassert(1 <= j && j <= n); k = n * (i - 1) + (j - 1); if (map[k] != 0x08) map[k] = 0x0C; else if (e->val > 0.0) map[k] = 0x0F; else if (e->val < 0.0) map[k] = 0x0B; else map[k] = 0x0A; } } ret = rgr_write_bmp16(fname, m, n, map); xfree(map); return ret; } /*********************************************************************** * NAME * * spm_read_hbm - read sparse matrix in Harwell-Boeing format * * SYNOPSIS * * #include "glpspm.h" * SPM *spm_read_hbm(const char *fname); * * DESCRIPTION * * The routine spm_read_hbm reads a sparse matrix in the Harwell-Boeing * format from a text file whose name is the character string fname. * * Detailed description of the Harwell-Boeing format recognised by this * routine can be found in the following report: * * I.S.Duff, R.G.Grimes, J.G.Lewis. User's Guide for the Harwell-Boeing * Sparse Matrix Collection (Release I), TR/PA/92/86, October 1992. * * NOTE * * The routine spm_read_hbm reads the matrix "as is", due to which zero * and/or duplicate elements can appear in the matrix. * * RETURNS * * If no error occured, the routine returns a pointer to the matrix * created. Otherwise, the routine prints an appropriate error message * and returns NULL. */ SPM *spm_read_hbm(const char *fname) { SPM *A = NULL; HBM *hbm; int nrow, ncol, nnzero, i, j, beg, end, ptr, *colptr, *rowind; double val, *values; char *mxtype; hbm = hbm_read_mat(fname); if (hbm == NULL) { xprintf("spm_read_hbm: unable to read matrix\n"); goto fini; } mxtype = hbm->mxtype; nrow = hbm->nrow; ncol = hbm->ncol; nnzero = hbm->nnzero; colptr = hbm->colptr; rowind = hbm->rowind; values = hbm->values; if (!(strcmp(mxtype, "RSA") == 0 || strcmp(mxtype, "PSA") == 0 || strcmp(mxtype, "RUA") == 0 || strcmp(mxtype, "PUA") == 0 || strcmp(mxtype, "RRA") == 0 || strcmp(mxtype, "PRA") == 0)) { xprintf("spm_read_hbm: matrix type '%s' not supported\n", mxtype); goto fini; } A = spm_create_mat(nrow, ncol); if (mxtype[1] == 'S' || mxtype[1] == 'U') xassert(nrow == ncol); for (j = 1; j <= ncol; j++) { beg = colptr[j]; end = colptr[j+1]; xassert(1 <= beg && beg <= end && end <= nnzero + 1); for (ptr = beg; ptr < end; ptr++) { i = rowind[ptr]; xassert(1 <= i && i <= nrow); if (mxtype[0] == 'R') val = values[ptr]; else val = 1.0; spm_new_elem(A, i, j, val); if (mxtype[1] == 'S' && i != j) spm_new_elem(A, j, i, val); } } fini: if (hbm != NULL) hbm_free_mat(hbm); return A; } /*********************************************************************** * NAME * * spm_count_nnz - determine number of non-zeros in sparse matrix * * SYNOPSIS * * #include "glpspm.h" * int spm_count_nnz(const SPM *A); * * RETURNS * * The routine spm_count_nnz returns the number of structural non-zero * elements in the specified sparse matrix. */ int spm_count_nnz(const SPM *A) { SPME *e; int i, nnz = 0; for (i = 1; i <= A->m; i++) for (e = A->row[i]; e != NULL; e = e->r_next) nnz++; return nnz; } /*********************************************************************** * NAME * * spm_drop_zeros - remove zero elements from sparse matrix * * SYNOPSIS * * #include "glpspm.h" * int spm_drop_zeros(SPM *A, double eps); * * DESCRIPTION * * The routine spm_drop_zeros removes all elements from the specified * sparse matrix, whose absolute value is less than eps. * * If the parameter eps is 0, only zero elements are removed from the * matrix. * * RETURNS * * The routine returns the number of elements removed. */ int spm_drop_zeros(SPM *A, double eps) { SPME *e, *next; int i, count = 0; for (i = 1; i <= A->m; i++) { for (e = A->row[i]; e != NULL; e = next) { next = e->r_next; if (e->val == 0.0 || fabs(e->val) < eps) { /* remove element from the row list */ if (e->r_prev == NULL) A->row[e->i] = e->r_next; else e->r_prev->r_next = e->r_next; if (e->r_next == NULL) ; else e->r_next->r_prev = e->r_prev; /* remove element from the column list */ if (e->c_prev == NULL) A->col[e->j] = e->c_next; else e->c_prev->c_next = e->c_next; if (e->c_next == NULL) ; else e->c_next->c_prev = e->c_prev; /* return element to the memory pool */ dmp_free_atom(A->pool, e, sizeof(SPME)); count++; } } } return count; } /*********************************************************************** * NAME * * spm_read_mat - read sparse matrix from text file * * SYNOPSIS * * #include "glpspm.h" * SPM *spm_read_mat(const char *fname); * * DESCRIPTION * * The routine reads a sparse matrix from a text file whose name is * specified by the parameter fname. * * For the file format see description of the routine spm_write_mat. * * RETURNS * * On success the routine returns a pointer to the matrix created, * otherwise NULL. */ #if 1 SPM *spm_read_mat(const char *fname) { xassert(fname != fname); return NULL; } #else SPM *spm_read_mat(const char *fname) { SPM *A = NULL; PDS *pds; jmp_buf jump; int i, j, k, m, n, nnz, fail = 0; double val; xprintf("spm_read_mat: reading matrix from '%s'...\n", fname); pds = pds_open_file(fname); if (pds == NULL) { xprintf("spm_read_mat: unable to open '%s' - %s\n", fname, strerror(errno)); fail = 1; goto done; } if (setjmp(jump)) { fail = 1; goto done; } pds_set_jump(pds, jump); /* number of rows, number of columns, number of non-zeros */ m = pds_scan_int(pds); if (m < 0) pds_error(pds, "invalid number of rows\n"); n = pds_scan_int(pds); if (n < 0) pds_error(pds, "invalid number of columns\n"); nnz = pds_scan_int(pds); if (nnz < 0) pds_error(pds, "invalid number of non-zeros\n"); /* create matrix */ xprintf("spm_read_mat: %d rows, %d columns, %d non-zeros\n", m, n, nnz); A = spm_create_mat(m, n); /* read matrix elements */ for (k = 1; k <= nnz; k++) { /* row index, column index, element value */ i = pds_scan_int(pds); if (!(1 <= i && i <= m)) pds_error(pds, "row index out of range\n"); j = pds_scan_int(pds); if (!(1 <= j && j <= n)) pds_error(pds, "column index out of range\n"); val = pds_scan_num(pds); /* add new element to the matrix */ spm_new_elem(A, i, j, val); } xprintf("spm_read_mat: %d lines were read\n", pds->count); done: if (pds != NULL) pds_close_file(pds); if (fail && A != NULL) spm_delete_mat(A), A = NULL; return A; } #endif /*********************************************************************** * NAME * * spm_write_mat - write sparse matrix to text file * * SYNOPSIS * * #include "glpspm.h" * int spm_write_mat(const SPM *A, const char *fname); * * DESCRIPTION * * The routine spm_write_mat writes the specified sparse matrix to a * text file whose name is specified by the parameter fname. This file * can be read back with the routine spm_read_mat. * * RETURNS * * On success the routine returns zero, otherwise non-zero. * * FILE FORMAT * * The file created by the routine spm_write_mat is a plain text file, * which contains the following information: * * m n nnz * row[1] col[1] val[1] * row[2] col[2] val[2] * . . . * row[nnz] col[nnz] val[nnz] * * where: * m is the number of rows; * n is the number of columns; * nnz is the number of non-zeros; * row[k], k = 1,...,nnz, are row indices; * col[k], k = 1,...,nnz, are column indices; * val[k], k = 1,...,nnz, are element values. */ #if 1 int spm_write_mat(const SPM *A, const char *fname) { xassert(A != A); xassert(fname != fname); return 0; } #else int spm_write_mat(const SPM *A, const char *fname) { FILE *fp; int i, nnz, ret = 0; xprintf("spm_write_mat: writing matrix to '%s'...\n", fname); fp = fopen(fname, "w"); if (fp == NULL) { xprintf("spm_write_mat: unable to create '%s' - %s\n", fname, strerror(errno)); ret = 1; goto done; } /* number of rows, number of columns, number of non-zeros */ nnz = spm_count_nnz(A); fprintf(fp, "%d %d %d\n", A->m, A->n, nnz); /* walk through rows of the matrix */ for (i = 1; i <= A->m; i++) { SPME *e; /* walk through elements of i-th row */ for (e = A->row[i]; e != NULL; e = e->r_next) { /* row index, column index, element value */ fprintf(fp, "%d %d %.*g\n", e->i, e->j, DBL_DIG, e->val); } } fflush(fp); if (ferror(fp)) { xprintf("spm_write_mat: writing error on '%s' - %s\n", fname, strerror(errno)); ret = 1; goto done; } xprintf("spm_write_mat: %d lines were written\n", 1 + nnz); done: if (fp != NULL) fclose(fp); return ret; } #endif /*********************************************************************** * NAME * * spm_transpose - transpose sparse matrix * * SYNOPSIS * * #include "glpspm.h" * SPM *spm_transpose(const SPM *A); * * RETURNS * * The routine computes and returns sparse matrix B, which is a matrix * transposed to sparse matrix A. */ SPM *spm_transpose(const SPM *A) { SPM *B; int i; B = spm_create_mat(A->n, A->m); for (i = 1; i <= A->m; i++) { SPME *e; for (e = A->row[i]; e != NULL; e = e->r_next) spm_new_elem(B, e->j, i, e->val); } return B; } SPM *spm_add_sym(const SPM *A, const SPM *B) { /* add two sparse matrices (symbolic phase) */ SPM *C; int i, j, *flag; xassert(A->m == B->m); xassert(A->n == B->n); /* create resultant matrix */ C = spm_create_mat(A->m, A->n); /* allocate and clear the flag array */ flag = xcalloc(1+C->n, sizeof(int)); for (j = 1; j <= C->n; j++) flag[j] = 0; /* compute pattern of C = A + B */ for (i = 1; i <= C->m; i++) { SPME *e; /* at the beginning i-th row of C is empty */ /* (i-th row of C) := (i-th row of C) union (i-th row of A) */ for (e = A->row[i]; e != NULL; e = e->r_next) { /* (note that i-th row of A may have duplicate elements) */ j = e->j; if (!flag[j]) { spm_new_elem(C, i, j, 0.0); flag[j] = 1; } } /* (i-th row of C) := (i-th row of C) union (i-th row of B) */ for (e = B->row[i]; e != NULL; e = e->r_next) { /* (note that i-th row of B may have duplicate elements) */ j = e->j; if (!flag[j]) { spm_new_elem(C, i, j, 0.0); flag[j] = 1; } } /* reset the flag array */ for (e = C->row[i]; e != NULL; e = e->r_next) flag[e->j] = 0; } /* check and deallocate the flag array */ for (j = 1; j <= C->n; j++) xassert(!flag[j]); xfree(flag); return C; } void spm_add_num(SPM *C, double alfa, const SPM *A, double beta, const SPM *B) { /* add two sparse matrices (numeric phase) */ int i, j; double *work; /* allocate and clear the working array */ work = xcalloc(1+C->n, sizeof(double)); for (j = 1; j <= C->n; j++) work[j] = 0.0; /* compute matrix C = alfa * A + beta * B */ for (i = 1; i <= C->n; i++) { SPME *e; /* work := alfa * (i-th row of A) + beta * (i-th row of B) */ /* (note that A and/or B may have duplicate elements) */ for (e = A->row[i]; e != NULL; e = e->r_next) work[e->j] += alfa * e->val; for (e = B->row[i]; e != NULL; e = e->r_next) work[e->j] += beta * e->val; /* (i-th row of C) := work, work := 0 */ for (e = C->row[i]; e != NULL; e = e->r_next) { j = e->j; e->val = work[j]; work[j] = 0.0; } } /* check and deallocate the working array */ for (j = 1; j <= C->n; j++) xassert(work[j] == 0.0); xfree(work); return; } SPM *spm_add_mat(double alfa, const SPM *A, double beta, const SPM *B) { /* add two sparse matrices (driver routine) */ SPM *C; C = spm_add_sym(A, B); spm_add_num(C, alfa, A, beta, B); return C; } SPM *spm_mul_sym(const SPM *A, const SPM *B) { /* multiply two sparse matrices (symbolic phase) */ int i, j, k, *flag; SPM *C; xassert(A->n == B->m); /* create resultant matrix */ C = spm_create_mat(A->m, B->n); /* allocate and clear the flag array */ flag = xcalloc(1+C->n, sizeof(int)); for (j = 1; j <= C->n; j++) flag[j] = 0; /* compute pattern of C = A * B */ for (i = 1; i <= C->m; i++) { SPME *e, *ee; /* compute pattern of i-th row of C */ for (e = A->row[i]; e != NULL; e = e->r_next) { k = e->j; for (ee = B->row[k]; ee != NULL; ee = ee->r_next) { j = ee->j; /* if a[i,k] != 0 and b[k,j] != 0 then c[i,j] != 0 */ if (!flag[j]) { /* c[i,j] does not exist, so create it */ spm_new_elem(C, i, j, 0.0); flag[j] = 1; } } } /* reset the flag array */ for (e = C->row[i]; e != NULL; e = e->r_next) flag[e->j] = 0; } /* check and deallocate the flag array */ for (j = 1; j <= C->n; j++) xassert(!flag[j]); xfree(flag); return C; } void spm_mul_num(SPM *C, const SPM *A, const SPM *B) { /* multiply two sparse matrices (numeric phase) */ int i, j; double *work; /* allocate and clear the working array */ work = xcalloc(1+A->n, sizeof(double)); for (j = 1; j <= A->n; j++) work[j] = 0.0; /* compute matrix C = A * B */ for (i = 1; i <= C->m; i++) { SPME *e, *ee; double temp; /* work := (i-th row of A) */ /* (note that A may have duplicate elements) */ for (e = A->row[i]; e != NULL; e = e->r_next) work[e->j] += e->val; /* compute i-th row of C */ for (e = C->row[i]; e != NULL; e = e->r_next) { j = e->j; /* c[i,j] := work * (j-th column of B) */ temp = 0.0; for (ee = B->col[j]; ee != NULL; ee = ee->c_next) temp += work[ee->i] * ee->val; e->val = temp; } /* reset the working array */ for (e = A->row[i]; e != NULL; e = e->r_next) work[e->j] = 0.0; } /* check and deallocate the working array */ for (j = 1; j <= A->n; j++) xassert(work[j] == 0.0); xfree(work); return; } SPM *spm_mul_mat(const SPM *A, const SPM *B) { /* multiply two sparse matrices (driver routine) */ SPM *C; C = spm_mul_sym(A, B); spm_mul_num(C, A, B); return C; } PER *spm_create_per(int n) { /* create permutation matrix */ PER *P; int k; xassert(n >= 0); P = xmalloc(sizeof(PER)); P->n = n; P->row = xcalloc(1+n, sizeof(int)); P->col = xcalloc(1+n, sizeof(int)); /* initially it is identity matrix */ for (k = 1; k <= n; k++) P->row[k] = P->col[k] = k; return P; } void spm_check_per(PER *P) { /* check permutation matrix for correctness */ int i, j; xassert(P->n >= 0); for (i = 1; i <= P->n; i++) { j = P->row[i]; xassert(1 <= j && j <= P->n); xassert(P->col[j] == i); } return; } void spm_delete_per(PER *P) { /* delete permutation matrix */ xfree(P->row); xfree(P->col); xfree(P); return; } /* eof */ glpk-5.0/src/misc/spm.h0000644000062000006210000001152413766346220014177 0ustar maomkpasswd/* spm.h (general sparse matrices) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2004-2018 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef SPM_H #define SPM_H #include "dmp.h" typedef struct SPM SPM; typedef struct SPME SPME; struct SPM { /* general sparse matrix */ int m; /* number of rows, m >= 0 */ int n; /* number of columns, n >= 0 */ DMP *pool; /* memory pool to store matrix elements */ SPME **row; /* SPME *row[1+m]; */ /* row[i], 1 <= i <= m, is a pointer to i-th row list */ SPME **col; /* SPME *col[1+n]; */ /* col[j], 1 <= j <= n, is a pointer to j-th column list */ }; struct SPME { /* sparse matrix element */ int i; /* row number */ int j; /* column number */ double val; /* element value */ SPME *r_prev; /* pointer to previous element in the same row */ SPME *r_next; /* pointer to next element in the same row */ SPME *c_prev; /* pointer to previous element in the same column */ SPME *c_next; /* pointer to next element in the same column */ }; typedef struct PER PER; struct PER { /* permutation matrix */ int n; /* matrix order, n >= 0 */ int *row; /* int row[1+n]; */ /* row[i] = j means p[i,j] = 1 */ int *col; /* int col[1+n]; */ /* col[j] = i means p[i,j] = 1 */ }; #define spm_create_mat _glp_spm_create_mat SPM *spm_create_mat(int m, int n); /* create general sparse matrix */ #define spm_new_elem _glp_spm_new_elem SPME *spm_new_elem(SPM *A, int i, int j, double val); /* add new element to sparse matrix */ #define spm_delete_mat _glp_spm_delete_mat void spm_delete_mat(SPM *A); /* delete general sparse matrix */ #define spm_test_mat_e _glp_spm_test_mat_e SPM *spm_test_mat_e(int n, int c); /* create test sparse matrix of E(n,c) class */ #define spm_test_mat_d _glp_spm_test_mat_d SPM *spm_test_mat_d(int n, int c); /* create test sparse matrix of D(n,c) class */ #define spm_show_mat _glp_spm_show_mat int spm_show_mat(const SPM *A, const char *fname); /* write sparse matrix pattern in BMP file format */ #define spm_read_hbm _glp_spm_read_hbm SPM *spm_read_hbm(const char *fname); /* read sparse matrix in Harwell-Boeing format */ #define spm_count_nnz _glp_spm_count_nnz int spm_count_nnz(const SPM *A); /* determine number of non-zeros in sparse matrix */ #define spm_drop_zeros _glp_spm_drop_zeros int spm_drop_zeros(SPM *A, double eps); /* remove zero elements from sparse matrix */ #define spm_read_mat _glp_spm_read_mat SPM *spm_read_mat(const char *fname); /* read sparse matrix from text file */ #define spm_write_mat _glp_spm_write_mat int spm_write_mat(const SPM *A, const char *fname); /* write sparse matrix to text file */ #define spm_transpose _glp_spm_transpose SPM *spm_transpose(const SPM *A); /* transpose sparse matrix */ #define spm_add_sym _glp_spm_add_sym SPM *spm_add_sym(const SPM *A, const SPM *B); /* add two sparse matrices (symbolic phase) */ #define spm_add_num _glp_spm_add_num void spm_add_num(SPM *C, double alfa, const SPM *A, double beta, const SPM *B); /* add two sparse matrices (numeric phase) */ #define spm_add_mat _glp_spm_add_mat SPM *spm_add_mat(double alfa, const SPM *A, double beta, const SPM *B); /* add two sparse matrices (driver routine) */ #define spm_mul_sym _glp_spm_mul_sym SPM *spm_mul_sym(const SPM *A, const SPM *B); /* multiply two sparse matrices (symbolic phase) */ #define spm_mul_num _glp_spm_mul_num void spm_mul_num(SPM *C, const SPM *A, const SPM *B); /* multiply two sparse matrices (numeric phase) */ #define spm_mul_mat _glp_spm_mul_mat SPM *spm_mul_mat(const SPM *A, const SPM *B); /* multiply two sparse matrices (driver routine) */ #define spm_create_per _glp_spm_create_per PER *spm_create_per(int n); /* create permutation matrix */ #define spm_check_per _glp_spm_check_per void spm_check_per(PER *P); /* check permutation matrix for correctness */ #define spm_delete_per _glp_spm_delete_per void spm_delete_per(PER *P); /* delete permutation matrix */ #endif /* eof */ glpk-5.0/src/misc/str2int.c0000644000062000006210000000513213766346220014776 0ustar maomkpasswd/* str2int.c (convert string to int) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2000 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "misc.h" #include "stdc.h" /*********************************************************************** * NAME * * str2int - convert character string to value of int type * * SYNOPSIS * * #include "misc.h" * int str2int(const char *str, int *val); * * DESCRIPTION * * The routine str2int converts the character string str to a value of * integer type and stores the value into location, which the parameter * val points to (in the case of error content of this location is not * changed). * * RETURNS * * The routine returns one of the following error codes: * * 0 - no error; * 1 - value out of range; * 2 - character string is syntactically incorrect. */ int str2int(const char *str, int *val_) { int d, k, s, val = 0; /* scan optional sign */ if (str[0] == '+') s = +1, k = 1; else if (str[0] == '-') s = -1, k = 1; else s = +1, k = 0; /* check for the first digit */ if (!isdigit((unsigned char)str[k])) return 2; /* scan digits */ while (isdigit((unsigned char)str[k])) { d = str[k++] - '0'; if (s > 0) { if (val > INT_MAX / 10) return 1; val *= 10; if (val > INT_MAX - d) return 1; val += d; } else /* s < 0 */ { if (val < INT_MIN / 10) return 1; val *= 10; if (val < INT_MIN + d) return 1; val -= d; } } /* check for terminator */ if (str[k] != '\0') return 2; /* conversion has been done */ *val_ = val; return 0; } /* eof */ glpk-5.0/src/misc/str2num.c0000644000062000006210000000637513766346220015015 0ustar maomkpasswd/* str2num.c (convert string to double) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2000 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "misc.h" #include "stdc.h" /*********************************************************************** * NAME * * str2num - convert character string to value of double type * * SYNOPSIS * * #include "misc.h" * int str2num(const char *str, double *val); * * DESCRIPTION * * The routine str2num converts the character string str to a value of * double type and stores the value into location, which the parameter * val points to (in the case of error content of this location is not * changed). * * RETURNS * * The routine returns one of the following error codes: * * 0 - no error; * 1 - value out of range; * 2 - character string is syntactically incorrect. */ int str2num(const char *str, double *val_) { int k; double val; /* scan optional sign */ k = (str[0] == '+' || str[0] == '-' ? 1 : 0); /* check for decimal point */ if (str[k] == '.') { k++; /* a digit should follow it */ if (!isdigit((unsigned char)str[k])) return 2; k++; goto frac; } /* integer part should start with a digit */ if (!isdigit((unsigned char)str[k])) return 2; /* scan integer part */ while (isdigit((unsigned char)str[k])) k++; /* check for decimal point */ if (str[k] == '.') k++; frac: /* scan optional fraction part */ while (isdigit((unsigned char)str[k])) k++; /* check for decimal exponent */ if (str[k] == 'E' || str[k] == 'e') { k++; /* scan optional sign */ if (str[k] == '+' || str[k] == '-') k++; /* a digit should follow E, E+ or E- */ if (!isdigit((unsigned char)str[k])) return 2; } /* scan optional exponent part */ while (isdigit((unsigned char)str[k])) k++; /* check for terminator */ if (str[k] != '\0') return 2; /* perform conversion */ { char *endptr; val = strtod(str, &endptr); if (*endptr != '\0') return 2; } /* check for overflow */ if (!(-DBL_MAX <= val && val <= +DBL_MAX)) return 1; /* check for underflow */ if (-DBL_MIN < val && val < +DBL_MIN) val = 0.0; /* conversion has been done */ *val_ = val; return 0; } /* eof */ glpk-5.0/src/misc/strspx.c0000644000062000006210000000323213766346220014733 0ustar maomkpasswd/* strspx.c (remove all spaces from string) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2000 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "misc.h" /*********************************************************************** * NAME * * strspx - remove all spaces from character string * * SYNOPSIS * * #include "misc.h" * char *strspx(char *str); * * DESCRIPTION * * The routine strspx removes all spaces from the character string str. * * RETURNS * * The routine returns a pointer to the character string. * * EXAMPLES * * strspx(" Errare humanum est ") => "Errarehumanumest" * * strspx(" ") => "" */ char *strspx(char *str) { char *s, *t; for (s = t = str; *s; s++) { if (*s != ' ') *t++ = *s; } *t = '\0'; return str; } /* eof */ glpk-5.0/src/misc/strtrim.c0000644000062000006210000000331713766346220015100 0ustar maomkpasswd/* strtrim.c (remove trailing spaces from string) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2000 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "misc.h" #include "stdc.h" /*********************************************************************** * NAME * * strtrim - remove trailing spaces from character string * * SYNOPSIS * * #include "misc.h" * char *strtrim(char *str); * * DESCRIPTION * * The routine strtrim removes trailing spaces from the character * string str. * * RETURNS * * The routine returns a pointer to the character string. * * EXAMPLES * * strtrim("Errare humanum est ") => "Errare humanum est" * * strtrim(" ") => "" */ char *strtrim(char *str) { char *t; for (t = strrchr(str, '\0') - 1; t >= str; t--) { if (*t != ' ') break; *t = '\0'; } return str; } /* eof */ glpk-5.0/src/misc/triang.c0000644000062000006210000002764013766346220014665 0ustar maomkpasswd/* triang.c (find maximal triangular part of rectangular matrix) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2012-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "triang.h" /*********************************************************************** * triang - find maximal triangular part of rectangular matrix * * Given a mxn sparse matrix A this routine finds permutation matrices * P and Q such that matrix A' = P * A * Q has the following structure: * * 1 s n * 1 * . . . . . x x x x x * * * . . . . x x x x x * * * * . . . x x x x x * * * * * . . x x x x x * * * * * * . x x x x x * s * * * * * * x x x x x * x x x x x x x x x x x * x x x x x x x x x x x * m x x x x x x x x x x x * * where '*' are elements of the triangular part, '.' are structural * zeros, 'x' are other elements. * * The formal routine mat specifies the original matrix A in both row- * and column-wise format. If the routine mat is called with k = +i, * 1 <= i <= m, it should store column indices and values of non-zero * elements of i-th row of A in locations ind[1], ..., ind[len] and * val[1], ..., val[len], resp., where len is the returned number of * non-zeros in the row, 0 <= len <= n. Similarly, if the routine mat * is called with k = -j, 1 <= j <= n, it should store row indices and * values of non-zero elements of j-th column of A and return len, the * number of non-zeros in the column, 0 <= len <= m. Should note that * duplicate indices are not allowed. * * The parameter info is a transit pointer passed to the routine mat. * * The parameter tol is a tolerance. The routine triang guarantees that * each diagonal element in the triangular part of matrix A' is not * less in magnitude than tol * max, where max is the maximal magnitude * of elements in corresponding column. * * On exit the routine triang stores information on the triangular part * found in the arrays rn and cn. Elements rn[1], ..., rn[s] specify * row numbers and elements cn[1], ..., cn[s] specify column numbers * of the original matrix A, which correspond to rows/columns 1, ..., s * of matrix A', where s is the size of the triangular part returned by * the routine, 0 <= s <= min(m, n). The order of rows and columns that * are not included in the triangular part remains unspecified. * * ALGORITHM * * The routine triang uses a simple greedy heuristic. * * At some step the matrix A' = P * A * Q has the following structure: * * 1 n * 1 * . . . . . . . x x x * * * . . . . . . x x x * * * * . . . . . x x x * * * * * . . . . x x x * x x x x # # # # x x x * x x x x # # # # x x x * x x x x # # # # x x x * x x x x # # # # x x x * m x x x x # # # # x x x * * where '#' are elements of active submatrix. Initially P = Q = I, so * the active submatrix is the original matrix A = A'. * * If some row has exactly one non-zero in the active submatrix (row * singleton), the routine includes this row and corresponding column * in the triangular part, and removes the column from the active * submatrix. Otherwise, the routine simply removes a column having * maximal number of non-zeros from the active submatrix in the hope * that new row singleton(s) will appear. * * COMPLEXITY * * The time complexity of the routine triang is O(nnz), where nnz is * number of non-zeros in the original matrix A. */ int triang(int m, int n, int (*mat)(void *info, int k, int ind[], double val[]), void *info, double tol, int rn[], int cn[]) { int head, i, j, jj, k, kk, ks, len, len2, next_j, ns, size; int *cind, *rind, *cnt, *ptr, *list, *prev, *next; double *cval, *rval, *big; char *flag; /* allocate working arrays */ cind = talloc(1+m, int); cval = talloc(1+m, double); rind = talloc(1+n, int); rval = talloc(1+n, double); cnt = ptr = talloc(1+m, int); list = talloc(1+n, int); prev = talloc(1+n, int); next = talloc(1+n, int); big = talloc(1+n, double); flag = talloc(1+n, char); /*--------------------------------------------------------------*/ /* build linked lists of columns having equal lengths */ /*--------------------------------------------------------------*/ /* ptr[len], 0 <= len <= m, is number of first column of length * len; * next[j], 1 <= j <= n, is number of next column having the same * length as column j; * big[j], 1 <= j <= n, is maximal magnitude of elements in j-th * column */ for (len = 0; len <= m; len++) ptr[len] = 0; for (j = 1; j <= n; j++) { /* get j-th column */ len = mat(info, -j, cind, cval); xassert(0 <= len && len <= m); /* add this column to beginning of list ptr[len] */ next[j] = ptr[len]; ptr[len] = j; /* determine maximal magnitude of elements in this column */ big[j] = 0.0; for (k = 1; k <= len; k++) { if (big[j] < fabs(cval[k])) big[j] = fabs(cval[k]); } } /*--------------------------------------------------------------*/ /* build doubly linked list of columns ordered by decreasing */ /* column lengths */ /*--------------------------------------------------------------*/ /* head is number of first column in the list; * prev[j], 1 <= j <= n, is number of column that precedes j-th * column in the list; * next[j], 1 <= j <= n, is number of column that follows j-th * column in the list */ head = 0; for (len = 0; len <= m; len++) { /* walk thru list of columns of length len */ for (j = ptr[len]; j != 0; j = next_j) { next_j = next[j]; /* add j-th column to beginning of the column list */ prev[j] = 0; next[j] = head; if (head != 0) prev[head] = j; head = j; } } /*--------------------------------------------------------------*/ /* build initial singleton list */ /*--------------------------------------------------------------*/ /* there are used two list of columns: * 1) doubly linked list of active columns, in which all columns * are ordered by decreasing column lengths; * 2) singleton list; an active column is included in this list * if it has at least one row singleton in active submatrix */ /* flag[j], 1 <= j <= n, is a flag of j-th column: * 0 j-th column is inactive; * 1 j-th column is active; * 2 j-th column is active and has row singleton(s) */ /* initially all columns are active */ for (j = 1; j <= n; j++) flag[j] = 1; /* initialize row counts and build initial singleton list */ /* cnt[i], 1 <= i <= m, is number of non-zeros, which i-th row * has in active submatrix; * ns is size of singleton list; * list[1], ..., list[ns] are numbers of active columns included * in the singleton list */ ns = 0; for (i = 1; i <= m; i++) { /* get i-th row */ len = cnt[i] = mat(info, +i, rind, rval); xassert(0 <= len && len <= n); if (len == 1) { /* a[i,j] is row singleton */ j = rind[1]; xassert(1 <= j && j <= n); if (flag[j] != 2) { /* include j-th column in singleton list */ flag[j] = 2; list[++ns] = j; } } } /*--------------------------------------------------------------*/ /* main loop */ /*--------------------------------------------------------------*/ size = 0; /* size of triangular part */ /* loop until active column list is non-empty, i.e. until the * active submatrix has at least one column */ while (head != 0) { if (ns == 0) { /* singleton list is empty */ /* remove from the active submatrix a column of maximal * length in the hope that some row singletons appear */ j = head; len = mat(info, -j, cind, cval); xassert(0 <= len && len <= m); goto drop; } /* take column j from the singleton list */ j = list[ns--]; xassert(flag[j] == 2); /* j-th column has at least one row singleton in the active * submatrix; choose one having maximal magnitude */ len = mat(info, -j, cind, cval); xassert(0 <= len && len <= m); kk = 0; for (k = 1; k <= len; k++) { i = cind[k]; xassert(1 <= i && i <= m); if (cnt[i] == 1) { /* a[i,j] is row singleton */ if (kk == 0 || fabs(cval[kk]) < fabs(cval[k])) kk = k; } } xassert(kk > 0); /* check magnitude of the row singleton chosen */ if (fabs(cval[kk]) < tol * big[j]) { /* all row singletons are too small in magnitude; drop j-th * column */ goto drop; } /* row singleton a[i,j] is ok; add i-th row and j-th column to * the triangular part */ size++; rn[size] = cind[kk]; cn[size] = j; drop: /* remove j-th column from the active submatrix */ xassert(flag[j]); flag[j] = 0; if (prev[j] == 0) head = next[j]; else next[prev[j]] = next[j]; if (next[j] == 0) ; else prev[next[j]] = prev[j]; /* decrease row counts */ for (k = 1; k <= len; k++) { i = cind[k]; xassert(1 <= i && i <= m); xassert(cnt[i] > 0); cnt[i]--; if (cnt[i] == 1) { /* new singleton appeared in i-th row; determine number * of corresponding column (it is the only active column * in this row) */ len2 = mat(info, +i, rind, rval); xassert(0 <= len2 && len2 <= n); ks = 0; for (kk = 1; kk <= len2; kk++) { jj = rind[kk]; xassert(1 <= jj && jj <= n); if (flag[jj]) { xassert(ks == 0); ks = kk; } } xassert(ks > 0); /* a[i,jj] is new row singleton */ jj = rind[ks]; if (flag[jj] != 2) { /* include jj-th column in the singleton list */ flag[jj] = 2; list[++ns] = jj; } } } } /* now all row counts should be zero */ for (i = 1; i <= m; i++) xassert(cnt[i] == 0); /* deallocate working arrays */ tfree(cind); tfree(cval); tfree(rind); tfree(rval); tfree(ptr); tfree(list); tfree(prev); tfree(next); tfree(big); tfree(flag); return size; } /* eof */ glpk-5.0/src/misc/triang.h0000644000062000006210000000236413766346220014666 0ustar maomkpasswd/* triang.h (find maximal triangular part of rectangular matrix) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2012-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef TRIANG_H #define TRIANG_H #define triang _glp_triang int triang(int m, int n, int (*mat)(void *info, int k, int ind[], double val[]), void *info, double tol, int rn[], int cn[]); /* find maximal triangular part of rectangular matrix */ #endif /* eof */ glpk-5.0/src/misc/wclique.c0000644000062000006210000001653013766346220015046 0ustar maomkpasswd/* wclique.c (maximum weight clique, Ostergard's algorithm) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * * Two subroutines sub() and wclique() below are intended to find a * maximum weight clique in a given undirected graph. These subroutines * are slightly modified version of the program WCLIQUE developed by * Patric Ostergard and based * on ideas from the article "P. R. J. Ostergard, A new algorithm for * the maximum-weight clique problem, submitted for publication", which * in turn is a generalization of the algorithm for unweighted graphs * presented in "P. R. J. Ostergard, A fast algorithm for the maximum * clique problem, submitted for publication". * * USED WITH PERMISSION OF THE AUTHOR OF THE ORIGINAL CODE. * * Changes were made by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "wclique.h" /*********************************************************************** * NAME * * wclique - find maximum weight clique with Ostergard's algorithm * * SYNOPSIS * * #include "wclique.h" * int wclique(int n, const int w[], const unsigned char a[], * int ind[]); * * DESCRIPTION * * The routine wclique finds a maximum weight clique in an undirected * graph with Ostergard's algorithm. * * INPUT PARAMETERS * * n is the number of vertices, n > 0. * * w[i], i = 1,...,n, is a weight of vertex i. * * a[*] is the strict (without main diagonal) lower triangle of the * graph adjacency matrix in packed format. * * OUTPUT PARAMETER * * ind[k], k = 1,...,size, is the number of a vertex included in the * clique found, 1 <= ind[k] <= n, where size is the number of vertices * in the clique returned on exit. * * RETURNS * * The routine returns the clique size, i.e. the number of vertices in * the clique. */ struct csa { /* common storage area */ int n; /* number of vertices */ const int *wt; /* int wt[0:n-1]; */ /* weights */ const unsigned char *a; /* adjacency matrix (packed lower triangle without main diag.) */ int record; /* weight of best clique */ int rec_level; /* number of vertices in best clique */ int *rec; /* int rec[0:n-1]; */ /* best clique so far */ int *clique; /* int clique[0:n-1]; */ /* table for pruning */ int *set; /* int set[0:n-1]; */ /* current clique */ }; #define n (csa->n) #define wt (csa->wt) #define a (csa->a) #define record (csa->record) #define rec_level (csa->rec_level) #define rec (csa->rec) #define clique (csa->clique) #define set (csa->set) #if 0 static int is_edge(struct csa *csa, int i, int j) { /* if there is arc (i,j), the routine returns true; otherwise * false; 0 <= i, j < n */ int k; xassert(0 <= i && i < n); xassert(0 <= j && j < n); if (i == j) return 0; if (i < j) k = i, i = j, j = k; k = (i * (i - 1)) / 2 + j; return a[k / CHAR_BIT] & (unsigned char)(1 << ((CHAR_BIT - 1) - k % CHAR_BIT)); } #else #define is_edge(csa, i, j) ((i) == (j) ? 0 : \ (i) > (j) ? is_edge1(i, j) : is_edge1(j, i)) #define is_edge1(i, j) is_edge2(((i) * ((i) - 1)) / 2 + (j)) #define is_edge2(k) (a[(k) / CHAR_BIT] & \ (unsigned char)(1 << ((CHAR_BIT - 1) - (k) % CHAR_BIT))) #endif static void sub(struct csa *csa, int ct, int table[], int level, int weight, int l_weight) { int i, j, k, curr_weight, left_weight, *p1, *p2, *newtable; newtable = xcalloc(n, sizeof(int)); if (ct <= 0) { /* 0 or 1 elements left; include these */ if (ct == 0) { set[level++] = table[0]; weight += l_weight; } if (weight > record) { record = weight; rec_level = level; for (i = 0; i < level; i++) rec[i] = set[i]; } goto done; } for (i = ct; i >= 0; i--) { if ((level == 0) && (i < ct)) goto done; k = table[i]; if ((level > 0) && (clique[k] <= (record - weight))) goto done; /* prune */ set[level] = k; curr_weight = weight + wt[k]; l_weight -= wt[k]; if (l_weight <= (record - curr_weight)) goto done; /* prune */ p1 = newtable; p2 = table; left_weight = 0; while (p2 < table + i) { j = *p2++; if (is_edge(csa, j, k)) { *p1++ = j; left_weight += wt[j]; } } if (left_weight <= (record - curr_weight)) continue; sub(csa, p1 - newtable - 1, newtable, level + 1, curr_weight, left_weight); } done: xfree(newtable); return; } int wclique(int n_, const int w[], const unsigned char a_[], int ind[]) { struct csa csa_, *csa = &csa_; int i, j, p, max_wt, max_nwt, wth, *used, *nwt, *pos; double timer; n = n_; xassert(n > 0); wt = &w[1]; a = a_; record = 0; rec_level = 0; rec = &ind[1]; clique = xcalloc(n, sizeof(int)); set = xcalloc(n, sizeof(int)); used = xcalloc(n, sizeof(int)); nwt = xcalloc(n, sizeof(int)); pos = xcalloc(n, sizeof(int)); /* start timer */ timer = xtime(); /* order vertices */ for (i = 0; i < n; i++) { nwt[i] = 0; for (j = 0; j < n; j++) if (is_edge(csa, i, j)) nwt[i] += wt[j]; } for (i = 0; i < n; i++) used[i] = 0; for (i = n-1; i >= 0; i--) { max_wt = -1; max_nwt = -1; for (j = 0; j < n; j++) { if ((!used[j]) && ((wt[j] > max_wt) || (wt[j] == max_wt && nwt[j] > max_nwt))) { max_wt = wt[j]; max_nwt = nwt[j]; p = j; } } pos[i] = p; used[p] = 1; for (j = 0; j < n; j++) if ((!used[j]) && (j != p) && (is_edge(csa, p, j))) nwt[j] -= wt[p]; } /* main routine */ wth = 0; for (i = 0; i < n; i++) { wth += wt[pos[i]]; sub(csa, i, pos, 0, 0, wth); clique[pos[i]] = record; if (xdifftime(xtime(), timer) >= 5.0 - 0.001) { /* print current record and reset timer */ xprintf("level = %d (%d); best = %d\n", i+1, n, record); timer = xtime(); } } xfree(clique); xfree(set); xfree(used); xfree(nwt); xfree(pos); /* return the solution found */ for (i = 1; i <= rec_level; i++) ind[i]++; return rec_level; } #undef n #undef wt #undef a #undef record #undef rec_level #undef rec #undef clique #undef set /* eof */ glpk-5.0/src/misc/wclique.h0000644000062000006210000000226413766346220015052 0ustar maomkpasswd/* wclique.h (maximum weight clique, Ostergard's algorithm) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2009 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef WCLIQUE_H #define WCLIQUE_H #define wclique _glp_wclique int wclique(int n, const int w[], const unsigned char a[], int ind[]); /* find maximum weight clique with Ostergard's algorithm */ #endif /* eof */ glpk-5.0/src/misc/wclique1.c0000644000062000006210000002564113766346220015132 0ustar maomkpasswd/* wclique1.c (maximum weight clique, greedy heuristic) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2012-2018 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "wclique1.h" /*********************************************************************** * NAME * * wclique1 - find maximum weight clique with greedy heuristic * * SYNOPSIS * * #include "wclique1.h" * int wclique1(int n, const double w[], * int (*func)(void *info, int i, int ind[]), void *info, int c[]); * * DESCRIPTION * * The routine wclique1 implements a sequential greedy heuristic to * find maximum weight clique in a given (undirected) graph G = (V, E). * * The parameter n specifies the number of vertices |V| in the graph, * n >= 0. * * The array w specifies vertex weights in locations w[i], i = 1,...,n. * All weights must be non-negative. * * The formal routine func specifies the graph. For a given vertex i, * 1 <= i <= n, it stores indices of all vertices adjacent to vertex i * in locations ind[1], ..., ind[deg], where deg is the degree of * vertex i, 0 <= deg < n, returned on exit. Note that self-loops and * multiple edges are not allowed. * * The parameter info is a cookie passed to the routine func. * * On exit the routine wclique1 stores vertex indices included in * the clique found to locations c[1], ..., c[size], where size is the * clique size returned by the routine, 0 <= size <= n. * * RETURNS * * The routine wclique1 returns the size of the clique found. */ struct vertex { int i; double cw; }; static int CDECL fcmp(const void *xx, const void *yy) { const struct vertex *x = xx, *y = yy; if (x->cw > y->cw) return -1; if (x->cw < y->cw) return +1; return 0; } int wclique1(int n, const double w[], int (*func)(void *info, int i, int ind[]), void *info, int c[]) { struct vertex *v_list; int deg, c_size, d_size, i, j, k, kk, l, *ind, *c_list, *d_list, size = 0; double c_wght, d_wght, *sw, best = 0.0; char *d_flag, *skip; /* perform sanity checks */ xassert(n >= 0); for (i = 1; i <= n; i++) xassert(w[i] >= 0.0); /* if the graph is empty, nothing to do */ if (n == 0) goto done; /* allocate working arrays */ ind = xcalloc(1+n, sizeof(int)); v_list = xcalloc(1+n, sizeof(struct vertex)); c_list = xcalloc(1+n, sizeof(int)); d_list = xcalloc(1+n, sizeof(int)); d_flag = xcalloc(1+n, sizeof(char)); skip = xcalloc(1+n, sizeof(char)); sw = xcalloc(1+n, sizeof(double)); /* build the vertex list */ for (i = 1; i <= n; i++) { v_list[i].i = i; /* compute the cumulative weight of each vertex i, which is * cw[i] = w[i] + sum{j : (i,j) in E} w[j] */ v_list[i].cw = w[i]; deg = func(info, i, ind); xassert(0 <= deg && deg < n); for (k = 1; k <= deg; k++) { j = ind[k]; xassert(1 <= j && j <= n && j != i); v_list[i].cw += w[j]; } } /* sort the vertex list to access vertices in descending order of * cumulative weights */ qsort(&v_list[1], n, sizeof(struct vertex), fcmp); /* initially all vertices are unmarked */ memset(&skip[1], 0, sizeof(char) * n); /* clear flags of all vertices */ memset(&d_flag[1], 0, sizeof(char) * n); /* look through all vertices of the graph */ for (l = 1; l <= n; l++) { /* take vertex i */ i = v_list[l].i; /* if this vertex was already included in one of previosuly * constructed cliques, skip it */ if (skip[i]) continue; /* use vertex i as the initial clique vertex */ c_size = 1; /* size of current clique */ c_list[1] = i; /* list of vertices in current clique */ c_wght = w[i]; /* weight of current clique */ /* determine the candidate set D = { j : (i,j) in E } */ d_size = func(info, i, d_list); xassert(0 <= d_size && d_size < n); d_wght = 0.0; /* weight of set D */ for (k = 1; k <= d_size; k++) { j = d_list[k]; xassert(1 <= j && j <= n && j != i); xassert(!d_flag[j]); d_flag[j] = 1; d_wght += w[j]; } /* check an upper bound to the final clique weight */ if (c_wght + d_wght < best + 1e-5 * (1.0 + fabs(best))) { /* skip constructing the current clique */ goto next; } /* compute the summary weight of each vertex i in D, which is * sw[i] = w[i] + sum{j in D and (i,j) in E} w[j] */ for (k = 1; k <= d_size; k++) { i = d_list[k]; sw[i] = w[i]; /* consider vertices adjacent to vertex i */ deg = func(info, i, ind); xassert(0 <= deg && deg < n); for (kk = 1; kk <= deg; kk++) { j = ind[kk]; xassert(1 <= j && j <= n && j != i); if (d_flag[j]) sw[i] += w[j]; } } /* grow the current clique by adding vertices from D */ while (d_size > 0) { /* check an upper bound to the final clique weight */ if (c_wght + d_wght < best + 1e-5 * (1.0 + fabs(best))) { /* skip constructing the current clique */ goto next; } /* choose vertex i in D having maximal summary weight */ i = d_list[1]; for (k = 2; k <= d_size; k++) { j = d_list[k]; if (sw[i] < sw[j]) i = j; } /* include vertex i in the current clique */ c_size++; c_list[c_size] = i; c_wght += w[i]; /* remove all vertices not adjacent to vertex i, including * vertex i itself, from the candidate set D */ deg = func(info, i, ind); xassert(0 <= deg && deg < n); for (k = 1; k <= deg; k++) { j = ind[k]; xassert(1 <= j && j <= n && j != i); /* vertex j is adjacent to vertex i */ if (d_flag[j]) { xassert(d_flag[j] == 1); /* mark vertex j to keep it in D */ d_flag[j] = 2; } } kk = d_size, d_size = 0; for (k = 1; k <= kk; k++) { j = d_list[k]; if (d_flag[j] == 1) { /* remove vertex j from D */ d_flag[j] = 0; d_wght -= w[j]; } else if (d_flag[j] == 2) { /* keep vertex j in D */ d_list[++d_size] = j; d_flag[j] = 1; } else xassert(d_flag != d_flag); } } /* the current clique has been completely constructed */ if (best < c_wght) { best = c_wght; size = c_size; xassert(1 <= size && size <= n); memcpy(&c[1], &c_list[1], size * sizeof(int)); } next: /* mark the current clique vertices in order not to use them * as initial vertices anymore */ for (k = 1; k <= c_size; k++) skip[c_list[k]] = 1; /* set D can be non-empty, so clean up vertex flags */ for (k = 1; k <= d_size; k++) d_flag[d_list[k]] = 0; } /* free working arrays */ xfree(ind); xfree(v_list); xfree(c_list); xfree(d_list); xfree(d_flag); xfree(skip); xfree(sw); done: /* return to the calling program */ return size; } /**********************************************************************/ #ifdef GLP_TEST #include "glpk.h" #include "rng.h" typedef struct { double w; } v_data; #define weight(v) (((v_data *)((v)->data))->w) glp_graph *G; char *flag; int func(void *info, int i, int ind[]) { glp_arc *e; int j, k, deg = 0; xassert(info == NULL); xassert(1 <= i && i <= G->nv); /* look through incoming arcs */ for (e = G->v[i]->in; e != NULL; e = e->h_next) { j = e->tail->i; /* j->i */ if (j != i && !flag[j]) ind[++deg] = j, flag[j] = 1; } /* look through outgoing arcs */ for (e = G->v[i]->out; e != NULL; e = e->t_next) { j = e->head->i; /* i->j */ if (j != i && !flag[j]) ind[++deg] = j, flag[j] = 1; } /* clear the flag array */ xassert(deg < G->nv); for (k = 1; k <= deg; k++) flag[ind[k]] = 0; return deg; } int main(int argc, char *argv[]) { RNG *rand; int i, k, kk, size, *c, *ind, deg; double *w, sum, t; /* read graph in DIMACS format */ G = glp_create_graph(sizeof(v_data), 0); xassert(argc == 2); xassert(glp_read_ccdata(G, offsetof(v_data, w), argv[1]) == 0); /* print the number of connected components */ xprintf("nc = %d\n", glp_weak_comp(G, -1)); /* assign random weights unformly distributed in [1,100] */ w = xcalloc(1+G->nv, sizeof(double)); rand = rng_create_rand(); for (i = 1; i <= G->nv; i++) #if 0 w[i] = weight(G->v[i]) = 1.0; #else w[i] = weight(G->v[i]) = rng_unif_rand(rand, 100) + 1; #endif /* write graph in DIMACS format */ xassert(glp_write_ccdata(G, offsetof(v_data, w), "graph") == 0); /* find maximum weight clique */ c = xcalloc(1+G->nv, sizeof(int)); flag = xcalloc(1+G->nv, sizeof(char)); memset(&flag[1], 0, G->nv); t = xtime(); size = wclique1(G->nv, w, func, NULL, c); xprintf("Time used: %.1f s\n", xdifftime(xtime(), t)); /* check the clique found */ ind = xcalloc(1+G->nv, sizeof(int)); for (k = 1; k <= size; k++) { i = c[k]; deg = func(NULL, i, ind); for (kk = 1; kk <= size; kk++) flag[c[kk]] = 1; flag[i] = 0; for (kk = 1; kk <= deg; kk++) flag[ind[kk]] = 0; for (kk = 1; kk <= size; kk++) xassert(flag[c[kk]] == 0); } /* compute the clique weight */ sum = 0.0; for (i = 1; i <= size; i++) sum += w[c[i]]; xprintf("size = %d; sum = %g\n", size, sum); return 0; } #endif /* eof */ glpk-5.0/src/misc/wclique1.h0000644000062000006210000000233213766346220015127 0ustar maomkpasswd/* wclique1.h (maximum weight clique, greedy heuristic) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2012-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef WCLIQUE1_H #define WCLIQUE1_H #define wclique1 _glp_wclique1 int wclique1(int n, const double w[], int (*func)(void *info, int i, int ind[]), void *info, int c[]); /* find maximum weight clique with greedy heuristic */ #endif /* eof */ glpk-5.0/src/mpl/0000755000062000006210000000000013766346220013061 5ustar maomkpasswdglpk-5.0/src/mpl/mpl.h0000644000062000006210000025745613766346220014045 0ustar maomkpasswd/* mpl.h (GNU MathProg translator) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2003-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef MPL_H #define MPL_H #include "avl.h" #include "dmp.h" #include "env.h" #include "misc.h" #include "rng.h" #if 0 /* 22/I-2013 */ typedef struct MPL MPL; #else typedef struct glp_tran MPL; #endif typedef char STRING; typedef struct SYMBOL SYMBOL; typedef struct TUPLE TUPLE; typedef struct ARRAY ELEMSET; typedef struct ELEMVAR ELEMVAR; typedef struct FORMULA FORMULA; typedef struct ELEMCON ELEMCON; typedef union VALUE VALUE; typedef struct ARRAY ARRAY; typedef struct MEMBER MEMBER; #if 1 /* many C compilers have DOMAIN declared in :( */ #undef DOMAIN #define DOMAIN DOMAIN1 #endif typedef struct DOMAIN DOMAIN; typedef struct DOMAIN_BLOCK DOMAIN_BLOCK; typedef struct DOMAIN_SLOT DOMAIN_SLOT; typedef struct SET SET; typedef struct WITHIN WITHIN; typedef struct GADGET GADGET; typedef struct PARAMETER PARAMETER; typedef struct CONDITION CONDITION; typedef struct VARIABLE VARIABLE; typedef struct CONSTRAINT CONSTRAINT; typedef struct TABLE TABLE; typedef struct TABARG TABARG; typedef struct TABFLD TABFLD; typedef struct TABIN TABIN; typedef struct TABOUT TABOUT; typedef struct TABDCA TABDCA; typedef union OPERANDS OPERANDS; typedef struct ARG_LIST ARG_LIST; typedef struct CODE CODE; typedef struct CHECK CHECK; typedef struct DISPLAY DISPLAY; typedef struct DISPLAY1 DISPLAY1; typedef struct PRINTF PRINTF; typedef struct PRINTF1 PRINTF1; typedef struct FOR FOR; typedef struct STATEMENT STATEMENT; typedef struct TUPLE SLICE; /**********************************************************************/ /* * * TRANSLATOR DATABASE * * */ /**********************************************************************/ #define A_BINARY 101 /* something binary */ #define A_CHECK 102 /* check statement */ #define A_CONSTRAINT 103 /* model constraint */ #define A_DISPLAY 104 /* display statement */ #define A_ELEMCON 105 /* elemental constraint/objective */ #define A_ELEMSET 106 /* elemental set */ #define A_ELEMVAR 107 /* elemental variable */ #define A_EXPRESSION 108 /* expression */ #define A_FOR 109 /* for statement */ #define A_FORMULA 110 /* formula */ #define A_INDEX 111 /* dummy index */ #define A_INPUT 112 /* input table */ #define A_INTEGER 113 /* something integer */ #define A_LOGICAL 114 /* something logical */ #define A_MAXIMIZE 115 /* objective has to be maximized */ #define A_MINIMIZE 116 /* objective has to be minimized */ #define A_NONE 117 /* nothing */ #define A_NUMERIC 118 /* something numeric */ #define A_OUTPUT 119 /* output table */ #define A_PARAMETER 120 /* model parameter */ #define A_PRINTF 121 /* printf statement */ #define A_SET 122 /* model set */ #define A_SOLVE 123 /* solve statement */ #define A_SYMBOLIC 124 /* something symbolic */ #define A_TABLE 125 /* data table */ #define A_TUPLE 126 /* n-tuple */ #define A_VARIABLE 127 /* model variable */ #define MAX_LENGTH 100 /* maximal length of any symbolic value (this includes symbolic names, numeric and string literals, and all symbolic values that may appear during the evaluation phase) */ #define CONTEXT_SIZE 60 /* size of the context queue, in characters */ #define OUTBUF_SIZE 1024 /* size of the output buffer, in characters */ #if 0 /* 22/I-2013 */ struct MPL #else struct glp_tran #endif { /* translator database */ /*--------------------------------------------------------------*/ /* scanning segment */ int line; /* number of the current text line */ int c; /* the current character or EOF */ int token; /* the current token: */ #define T_EOF 201 /* end of file */ #define T_NAME 202 /* symbolic name (model section only) */ #define T_SYMBOL 203 /* symbol (data section only) */ #define T_NUMBER 204 /* numeric literal */ #define T_STRING 205 /* string literal */ #define T_AND 206 /* and && */ #define T_BY 207 /* by */ #define T_CROSS 208 /* cross */ #define T_DIFF 209 /* diff */ #define T_DIV 210 /* div */ #define T_ELSE 211 /* else */ #define T_IF 212 /* if */ #define T_IN 213 /* in */ #define T_INFINITY 214 /* Infinity */ #define T_INTER 215 /* inter */ #define T_LESS 216 /* less */ #define T_MOD 217 /* mod */ #define T_NOT 218 /* not ! */ #define T_OR 219 /* or || */ #define T_SPTP 220 /* s.t. */ #define T_SYMDIFF 221 /* symdiff */ #define T_THEN 222 /* then */ #define T_UNION 223 /* union */ #define T_WITHIN 224 /* within */ #define T_PLUS 225 /* + */ #define T_MINUS 226 /* - */ #define T_ASTERISK 227 /* * */ #define T_SLASH 228 /* / */ #define T_POWER 229 /* ^ ** */ #define T_LT 230 /* < */ #define T_LE 231 /* <= */ #define T_EQ 232 /* = == */ #define T_GE 233 /* >= */ #define T_GT 234 /* > */ #define T_NE 235 /* <> != */ #define T_CONCAT 236 /* & */ #define T_BAR 237 /* | */ #define T_POINT 238 /* . */ #define T_COMMA 239 /* , */ #define T_COLON 240 /* : */ #define T_SEMICOLON 241 /* ; */ #define T_ASSIGN 242 /* := */ #define T_DOTS 243 /* .. */ #define T_LEFT 244 /* ( */ #define T_RIGHT 245 /* ) */ #define T_LBRACKET 246 /* [ */ #define T_RBRACKET 247 /* ] */ #define T_LBRACE 248 /* { */ #define T_RBRACE 249 /* } */ #define T_APPEND 250 /* >> */ #define T_TILDE 251 /* ~ */ #define T_INPUT 252 /* <- */ int imlen; /* length of the current token */ char *image; /* char image[MAX_LENGTH+1]; */ /* image of the current token */ double value; /* value of the current token (for T_NUMBER only) */ int b_token; /* the previous token */ int b_imlen; /* length of the previous token */ char *b_image; /* char b_image[MAX_LENGTH+1]; */ /* image of the previous token */ double b_value; /* value of the previous token (if token is T_NUMBER) */ int f_dots; /* if this flag is set, the next token should be recognized as T_DOTS, not as T_POINT */ int f_scan; /* if this flag is set, the next token is already scanned */ int f_token; /* the next token */ int f_imlen; /* length of the next token */ char *f_image; /* char f_image[MAX_LENGTH+1]; */ /* image of the next token */ double f_value; /* value of the next token (if token is T_NUMBER) */ char *context; /* char context[CONTEXT_SIZE]; */ /* context circular queue (not null-terminated!) */ int c_ptr; /* pointer to the current position in the context queue */ int flag_d; /* if this flag is set, the data section is being processed */ /*--------------------------------------------------------------*/ /* translating segment */ DMP *pool; /* memory pool used to allocate all data instances created during the translation phase */ AVL *tree; /* symbolic name table: node.type = A_INDEX => node.link -> DOMAIN_SLOT node.type = A_SET => node.link -> SET node.type = A_PARAMETER => node.link -> PARAMETER node.type = A_VARIABLE => node.link -> VARIABLE node.type = A_CONSTRANT => node.link -> CONSTRAINT */ STATEMENT *model; /* linked list of model statements in the original order */ int flag_x; /* if this flag is set, the current token being left parenthesis begins a slice that allows recognizing any undeclared symbolic names as dummy indices; this flag is automatically reset once the next token has been scanned */ int as_within; /* the warning "in understood as within" has been issued */ int as_in; /* the warning "within understood as in" has been issued */ int as_binary; /* the warning "logical understood as binary" has been issued */ int flag_s; /* if this flag is set, the solve statement has been parsed */ /*--------------------------------------------------------------*/ /* common segment */ DMP *strings; /* memory pool to allocate STRING data structures */ DMP *symbols; /* memory pool to allocate SYMBOL data structures */ DMP *tuples; /* memory pool to allocate TUPLE data structures */ DMP *arrays; /* memory pool to allocate ARRAY data structures */ DMP *members; /* memory pool to allocate MEMBER data structures */ DMP *elemvars; /* memory pool to allocate ELEMVAR data structures */ DMP *formulae; /* memory pool to allocate FORMULA data structures */ DMP *elemcons; /* memory pool to allocate ELEMCON data structures */ ARRAY *a_list; /* linked list of all arrays in the database */ char *sym_buf; /* char sym_buf[255+1]; */ /* working buffer used by the routine format_symbol */ char *tup_buf; /* char tup_buf[255+1]; */ /* working buffer used by the routine format_tuple */ /*--------------------------------------------------------------*/ /* generating/postsolving segment */ RNG *rand; /* pseudo-random number generator */ int flag_p; /* if this flag is set, the postsolving phase is in effect */ STATEMENT *stmt; /* model statement being currently executed */ TABDCA *dca; /* pointer to table driver communication area for table statement currently executed */ int m; /* number of rows in the problem, m >= 0 */ int n; /* number of columns in the problem, n >= 0 */ ELEMCON **row; /* ELEMCON *row[1+m]; */ /* row[0] is not used; row[i] is elemental constraint or objective, which corresponds to i-th row of the problem, 1 <= i <= m */ ELEMVAR **col; /* ELEMVAR *col[1+n]; */ /* col[0] is not used; col[j] is elemental variable, which corresponds to j-th column of the problem, 1 <= j <= n */ /*--------------------------------------------------------------*/ /* input/output segment */ glp_file *in_fp; /* stream assigned to the input text file */ char *in_file; /* name of the input text file */ glp_file *out_fp; /* stream assigned to the output text file used to write all data produced by display and printf statements; NULL means the data should be sent to stdout via the routine xprintf */ char *out_file; /* name of the output text file */ #if 0 /* 08/XI-2009 */ char *out_buf; /* char out_buf[OUTBUF_SIZE] */ /* buffer to accumulate output data */ int out_cnt; /* count of data bytes stored in the output buffer */ #endif glp_file *prt_fp; /* stream assigned to the print text file; may be NULL */ char *prt_file; /* name of the output print file */ /*--------------------------------------------------------------*/ /* solver interface segment */ jmp_buf jump; /* jump address for non-local go to in case of error */ int phase; /* phase of processing: 0 - database is being or has been initialized 1 - model section is being or has been read 2 - data section is being or has been read 3 - model is being or has been generated/postsolved 4 - model processing error has occurred */ char *mod_file; /* name of the input text file, which contains model section */ char *mpl_buf; /* char mpl_buf[255+1]; */ /* working buffer used by some interface routines */ }; /**********************************************************************/ /* * * PROCESSING MODEL SECTION * * */ /**********************************************************************/ #define alloc(type) ((type *)dmp_get_atomv(mpl->pool, sizeof(type))) /* allocate atom of given type */ #define enter_context _glp_mpl_enter_context void enter_context(MPL *mpl); /* enter current token into context queue */ #define print_context _glp_mpl_print_context void print_context(MPL *mpl); /* print current content of context queue */ #define get_char _glp_mpl_get_char void get_char(MPL *mpl); /* scan next character from input text file */ #define append_char _glp_mpl_append_char void append_char(MPL *mpl); /* append character to current token */ #define get_token _glp_mpl_get_token void get_token(MPL *mpl); /* scan next token from input text file */ #define unget_token _glp_mpl_unget_token void unget_token(MPL *mpl); /* return current token back to input stream */ #define is_keyword _glp_mpl_is_keyword int is_keyword(MPL *mpl, char *keyword); /* check if current token is given non-reserved keyword */ #define is_reserved _glp_mpl_is_reserved int is_reserved(MPL *mpl); /* check if current token is reserved keyword */ #define make_code _glp_mpl_make_code CODE *make_code(MPL *mpl, int op, OPERANDS *arg, int type, int dim); /* generate pseudo-code (basic routine) */ #define make_unary _glp_mpl_make_unary CODE *make_unary(MPL *mpl, int op, CODE *x, int type, int dim); /* generate pseudo-code for unary operation */ #define make_binary _glp_mpl_make_binary CODE *make_binary(MPL *mpl, int op, CODE *x, CODE *y, int type, int dim); /* generate pseudo-code for binary operation */ #define make_ternary _glp_mpl_make_ternary CODE *make_ternary(MPL *mpl, int op, CODE *x, CODE *y, CODE *z, int type, int dim); /* generate pseudo-code for ternary operation */ #define numeric_literal _glp_mpl_numeric_literal CODE *numeric_literal(MPL *mpl); /* parse reference to numeric literal */ #define string_literal _glp_mpl_string_literal CODE *string_literal(MPL *mpl); /* parse reference to string literal */ #define create_arg_list _glp_mpl_create_arg_list ARG_LIST *create_arg_list(MPL *mpl); /* create empty operands list */ #define expand_arg_list _glp_mpl_expand_arg_list ARG_LIST *expand_arg_list(MPL *mpl, ARG_LIST *list, CODE *x); /* append operand to operands list */ #define arg_list_len _glp_mpl_arg_list_len int arg_list_len(MPL *mpl, ARG_LIST *list); /* determine length of operands list */ #define subscript_list _glp_mpl_subscript_list ARG_LIST *subscript_list(MPL *mpl); /* parse subscript list */ #define object_reference _glp_mpl_object_reference CODE *object_reference(MPL *mpl); /* parse reference to named object */ #define numeric_argument _glp_mpl_numeric_argument CODE *numeric_argument(MPL *mpl, char *func); /* parse argument passed to built-in function */ #define symbolic_argument _glp_mpl_symbolic_argument CODE *symbolic_argument(MPL *mpl, char *func); #define elemset_argument _glp_mpl_elemset_argument CODE *elemset_argument(MPL *mpl, char *func); #define function_reference _glp_mpl_function_reference CODE *function_reference(MPL *mpl); /* parse reference to built-in function */ #define create_domain _glp_mpl_create_domain DOMAIN *create_domain(MPL *mpl); /* create empty domain */ #define create_block _glp_mpl_create_block DOMAIN_BLOCK *create_block(MPL *mpl); /* create empty domain block */ #define append_block _glp_mpl_append_block void append_block(MPL *mpl, DOMAIN *domain, DOMAIN_BLOCK *block); /* append domain block to specified domain */ #define append_slot _glp_mpl_append_slot DOMAIN_SLOT *append_slot(MPL *mpl, DOMAIN_BLOCK *block, char *name, CODE *code); /* create and append new slot to domain block */ #define expression_list _glp_mpl_expression_list CODE *expression_list(MPL *mpl); /* parse expression list */ #define literal_set _glp_mpl_literal_set CODE *literal_set(MPL *mpl, CODE *code); /* parse literal set */ #define indexing_expression _glp_mpl_indexing_expression DOMAIN *indexing_expression(MPL *mpl); /* parse indexing expression */ #define close_scope _glp_mpl_close_scope void close_scope(MPL *mpl, DOMAIN *domain); /* close scope of indexing expression */ #define iterated_expression _glp_mpl_iterated_expression CODE *iterated_expression(MPL *mpl); /* parse iterated expression */ #define domain_arity _glp_mpl_domain_arity int domain_arity(MPL *mpl, DOMAIN *domain); /* determine arity of domain */ #define set_expression _glp_mpl_set_expression CODE *set_expression(MPL *mpl); /* parse set expression */ #define branched_expression _glp_mpl_branched_expression CODE *branched_expression(MPL *mpl); /* parse conditional expression */ #define primary_expression _glp_mpl_primary_expression CODE *primary_expression(MPL *mpl); /* parse primary expression */ #define error_preceding _glp_mpl_error_preceding void error_preceding(MPL *mpl, char *opstr); /* raise error if preceding operand has wrong type */ #define error_following _glp_mpl_error_following void error_following(MPL *mpl, char *opstr); /* raise error if following operand has wrong type */ #define error_dimension _glp_mpl_error_dimension void error_dimension(MPL *mpl, char *opstr, int dim1, int dim2); /* raise error if operands have different dimension */ #define expression_0 _glp_mpl_expression_0 CODE *expression_0(MPL *mpl); /* parse expression of level 0 */ #define expression_1 _glp_mpl_expression_1 CODE *expression_1(MPL *mpl); /* parse expression of level 1 */ #define expression_2 _glp_mpl_expression_2 CODE *expression_2(MPL *mpl); /* parse expression of level 2 */ #define expression_3 _glp_mpl_expression_3 CODE *expression_3(MPL *mpl); /* parse expression of level 3 */ #define expression_4 _glp_mpl_expression_4 CODE *expression_4(MPL *mpl); /* parse expression of level 4 */ #define expression_5 _glp_mpl_expression_5 CODE *expression_5(MPL *mpl); /* parse expression of level 5 */ #define expression_6 _glp_mpl_expression_6 CODE *expression_6(MPL *mpl); /* parse expression of level 6 */ #define expression_7 _glp_mpl_expression_7 CODE *expression_7(MPL *mpl); /* parse expression of level 7 */ #define expression_8 _glp_mpl_expression_8 CODE *expression_8(MPL *mpl); /* parse expression of level 8 */ #define expression_9 _glp_mpl_expression_9 CODE *expression_9(MPL *mpl); /* parse expression of level 9 */ #define expression_10 _glp_mpl_expression_10 CODE *expression_10(MPL *mpl); /* parse expression of level 10 */ #define expression_11 _glp_mpl_expression_11 CODE *expression_11(MPL *mpl); /* parse expression of level 11 */ #define expression_12 _glp_mpl_expression_12 CODE *expression_12(MPL *mpl); /* parse expression of level 12 */ #define expression_13 _glp_mpl_expression_13 CODE *expression_13(MPL *mpl); /* parse expression of level 13 */ #define set_statement _glp_mpl_set_statement SET *set_statement(MPL *mpl); /* parse set statement */ #define parameter_statement _glp_mpl_parameter_statement PARAMETER *parameter_statement(MPL *mpl); /* parse parameter statement */ #define variable_statement _glp_mpl_variable_statement VARIABLE *variable_statement(MPL *mpl); /* parse variable statement */ #define constraint_statement _glp_mpl_constraint_statement CONSTRAINT *constraint_statement(MPL *mpl); /* parse constraint statement */ #define objective_statement _glp_mpl_objective_statement CONSTRAINT *objective_statement(MPL *mpl); /* parse objective statement */ #define table_statement _glp_mpl_table_statement TABLE *table_statement(MPL *mpl); /* parse table statement */ #define solve_statement _glp_mpl_solve_statement void *solve_statement(MPL *mpl); /* parse solve statement */ #define check_statement _glp_mpl_check_statement CHECK *check_statement(MPL *mpl); /* parse check statement */ #define display_statement _glp_mpl_display_statement DISPLAY *display_statement(MPL *mpl); /* parse display statement */ #define printf_statement _glp_mpl_printf_statement PRINTF *printf_statement(MPL *mpl); /* parse printf statement */ #define for_statement _glp_mpl_for_statement FOR *for_statement(MPL *mpl); /* parse for statement */ #define end_statement _glp_mpl_end_statement void end_statement(MPL *mpl); /* parse end statement */ #define simple_statement _glp_mpl_simple_statement STATEMENT *simple_statement(MPL *mpl, int spec); /* parse simple statement */ #define model_section _glp_mpl_model_section void model_section(MPL *mpl); /* parse model section */ /**********************************************************************/ /* * * PROCESSING DATA SECTION * * */ /**********************************************************************/ #if 2 + 2 == 5 struct SLICE /* see TUPLE */ { /* component of slice; the slice itself is associated with its first component; slices are similar to n-tuples with exception that some slice components (which are indicated by asterisks) don't refer to any symbols */ SYMBOL *sym; /* symbol, which this component refers to; can be NULL */ SLICE *next; /* the next component of slice */ }; #endif #define create_slice _glp_mpl_create_slice SLICE *create_slice(MPL *mpl); /* create slice */ #define expand_slice _glp_mpl_expand_slice SLICE *expand_slice ( MPL *mpl, SLICE *slice, /* destroyed */ SYMBOL *sym /* destroyed */ ); /* append new component to slice */ #define slice_dimen _glp_mpl_slice_dimen int slice_dimen ( MPL *mpl, SLICE *slice /* not changed */ ); /* determine dimension of slice */ #define slice_arity _glp_mpl_slice_arity int slice_arity ( MPL *mpl, SLICE *slice /* not changed */ ); /* determine arity of slice */ #define fake_slice _glp_mpl_fake_slice SLICE *fake_slice(MPL *mpl, int dim); /* create fake slice of all asterisks */ #define delete_slice _glp_mpl_delete_slice void delete_slice ( MPL *mpl, SLICE *slice /* destroyed */ ); /* delete slice */ #define is_number _glp_mpl_is_number int is_number(MPL *mpl); /* check if current token is number */ #define is_symbol _glp_mpl_is_symbol int is_symbol(MPL *mpl); /* check if current token is symbol */ #define is_literal _glp_mpl_is_literal int is_literal(MPL *mpl, char *literal); /* check if current token is given symbolic literal */ #define read_number _glp_mpl_read_number double read_number(MPL *mpl); /* read number */ #define read_symbol _glp_mpl_read_symbol SYMBOL *read_symbol(MPL *mpl); /* read symbol */ #define read_slice _glp_mpl_read_slice SLICE *read_slice ( MPL *mpl, char *name, /* not changed */ int dim ); /* read slice */ #define select_set _glp_mpl_select_set SET *select_set ( MPL *mpl, char *name /* not changed */ ); /* select set to saturate it with elemental sets */ #define simple_format _glp_mpl_simple_format void simple_format ( MPL *mpl, SET *set, /* not changed */ MEMBER *memb, /* modified */ SLICE *slice /* not changed */ ); /* read set data block in simple format */ #define matrix_format _glp_mpl_matrix_format void matrix_format ( MPL *mpl, SET *set, /* not changed */ MEMBER *memb, /* modified */ SLICE *slice, /* not changed */ int tr ); /* read set data block in matrix format */ #define set_data _glp_mpl_set_data void set_data(MPL *mpl); /* read set data */ #define select_parameter _glp_mpl_select_parameter PARAMETER *select_parameter ( MPL *mpl, char *name /* not changed */ ); /* select parameter to saturate it with data */ #define set_default _glp_mpl_set_default void set_default ( MPL *mpl, PARAMETER *par, /* not changed */ SYMBOL *altval /* destroyed */ ); /* set default parameter value */ #define read_value _glp_mpl_read_value MEMBER *read_value ( MPL *mpl, PARAMETER *par, /* not changed */ TUPLE *tuple /* destroyed */ ); /* read value and assign it to parameter member */ #define plain_format _glp_mpl_plain_format void plain_format ( MPL *mpl, PARAMETER *par, /* not changed */ SLICE *slice /* not changed */ ); /* read parameter data block in plain format */ #define tabular_format _glp_mpl_tabular_format void tabular_format ( MPL *mpl, PARAMETER *par, /* not changed */ SLICE *slice, /* not changed */ int tr ); /* read parameter data block in tabular format */ #define tabbing_format _glp_mpl_tabbing_format void tabbing_format ( MPL *mpl, SYMBOL *altval /* not changed */ ); /* read parameter data block in tabbing format */ #define parameter_data _glp_mpl_parameter_data void parameter_data(MPL *mpl); /* read parameter data */ #define data_section _glp_mpl_data_section void data_section(MPL *mpl); /* read data section */ /**********************************************************************/ /* * * FLOATING-POINT NUMBERS * * */ /**********************************************************************/ #define fp_add _glp_mpl_fp_add double fp_add(MPL *mpl, double x, double y); /* floating-point addition */ #define fp_sub _glp_mpl_fp_sub double fp_sub(MPL *mpl, double x, double y); /* floating-point subtraction */ #define fp_less _glp_mpl_fp_less double fp_less(MPL *mpl, double x, double y); /* floating-point non-negative subtraction */ #define fp_mul _glp_mpl_fp_mul double fp_mul(MPL *mpl, double x, double y); /* floating-point multiplication */ #define fp_div _glp_mpl_fp_div double fp_div(MPL *mpl, double x, double y); /* floating-point division */ #define fp_idiv _glp_mpl_fp_idiv double fp_idiv(MPL *mpl, double x, double y); /* floating-point quotient of exact division */ #define fp_mod _glp_mpl_fp_mod double fp_mod(MPL *mpl, double x, double y); /* floating-point remainder of exact division */ #define fp_power _glp_mpl_fp_power double fp_power(MPL *mpl, double x, double y); /* floating-point exponentiation (raise to power) */ #define fp_exp _glp_mpl_fp_exp double fp_exp(MPL *mpl, double x); /* floating-point base-e exponential */ #define fp_log _glp_mpl_fp_log double fp_log(MPL *mpl, double x); /* floating-point natural logarithm */ #define fp_log10 _glp_mpl_fp_log10 double fp_log10(MPL *mpl, double x); /* floating-point common (decimal) logarithm */ #define fp_sqrt _glp_mpl_fp_sqrt double fp_sqrt(MPL *mpl, double x); /* floating-point square root */ #define fp_sin _glp_mpl_fp_sin double fp_sin(MPL *mpl, double x); /* floating-point trigonometric sine */ #define fp_cos _glp_mpl_fp_cos double fp_cos(MPL *mpl, double x); /* floating-point trigonometric cosine */ #define fp_tan _glp_mpl_fp_tan double fp_tan(MPL *mpl, double x); /* floating-point trigonometric tangent */ #define fp_atan _glp_mpl_fp_atan double fp_atan(MPL *mpl, double x); /* floating-point trigonometric arctangent */ #define fp_atan2 _glp_mpl_fp_atan2 double fp_atan2(MPL *mpl, double y, double x); /* floating-point trigonometric arctangent */ #define fp_round _glp_mpl_fp_round double fp_round(MPL *mpl, double x, double n); /* round floating-point value to n fractional digits */ #define fp_trunc _glp_mpl_fp_trunc double fp_trunc(MPL *mpl, double x, double n); /* truncate floating-point value to n fractional digits */ /**********************************************************************/ /* * * PSEUDO-RANDOM NUMBER GENERATORS * * */ /**********************************************************************/ #define fp_irand224 _glp_mpl_fp_irand224 double fp_irand224(MPL *mpl); /* pseudo-random integer in the range [0, 2^24) */ #define fp_uniform01 _glp_mpl_fp_uniform01 double fp_uniform01(MPL *mpl); /* pseudo-random number in the range [0, 1) */ #define fp_uniform _glp_mpl_uniform double fp_uniform(MPL *mpl, double a, double b); /* pseudo-random number in the range [a, b) */ #define fp_normal01 _glp_mpl_fp_normal01 double fp_normal01(MPL *mpl); /* Gaussian random variate with mu = 0 and sigma = 1 */ #define fp_normal _glp_mpl_fp_normal double fp_normal(MPL *mpl, double mu, double sigma); /* Gaussian random variate with specified mu and sigma */ /**********************************************************************/ /* * * DATE/TIME * * */ /**********************************************************************/ #define fn_gmtime _glp_mpl_fn_gmtime double fn_gmtime(MPL *mpl); /* obtain the current calendar time (UTC) */ #define fn_str2time _glp_mpl_fn_str2time double fn_str2time(MPL *mpl, const char *str, const char *fmt); /* convert character string to the calendar time */ #define fn_time2str _glp_mpl_fn_time2str void fn_time2str(MPL *mpl, char *str, double t, const char *fmt); /* convert the calendar time to character string */ /**********************************************************************/ /* * * CHARACTER STRINGS * * */ /**********************************************************************/ #define create_string _glp_mpl_create_string STRING *create_string ( MPL *mpl, char buf[MAX_LENGTH+1] /* not changed */ ); /* create character string */ #define copy_string _glp_mpl_copy_string STRING *copy_string ( MPL *mpl, STRING *str /* not changed */ ); /* make copy of character string */ #define compare_strings _glp_mpl_compare_strings int compare_strings ( MPL *mpl, STRING *str1, /* not changed */ STRING *str2 /* not changed */ ); /* compare one character string with another */ #define fetch_string _glp_mpl_fetch_string char *fetch_string ( MPL *mpl, STRING *str, /* not changed */ char buf[MAX_LENGTH+1] /* modified */ ); /* extract content of character string */ #define delete_string _glp_mpl_delete_string void delete_string ( MPL *mpl, STRING *str /* destroyed */ ); /* delete character string */ /**********************************************************************/ /* * * SYMBOLS * * */ /**********************************************************************/ struct SYMBOL { /* symbol (numeric or abstract quantity) */ double num; /* numeric value of symbol (used only if str == NULL) */ STRING *str; /* abstract value of symbol (used only if str != NULL) */ }; #define create_symbol_num _glp_mpl_create_symbol_num SYMBOL *create_symbol_num(MPL *mpl, double num); /* create symbol of numeric type */ #define create_symbol_str _glp_mpl_create_symbol_str SYMBOL *create_symbol_str ( MPL *mpl, STRING *str /* destroyed */ ); /* create symbol of abstract type */ #define copy_symbol _glp_mpl_copy_symbol SYMBOL *copy_symbol ( MPL *mpl, SYMBOL *sym /* not changed */ ); /* make copy of symbol */ #define compare_symbols _glp_mpl_compare_symbols int compare_symbols ( MPL *mpl, SYMBOL *sym1, /* not changed */ SYMBOL *sym2 /* not changed */ ); /* compare one symbol with another */ #define delete_symbol _glp_mpl_delete_symbol void delete_symbol ( MPL *mpl, SYMBOL *sym /* destroyed */ ); /* delete symbol */ #define format_symbol _glp_mpl_format_symbol char *format_symbol ( MPL *mpl, SYMBOL *sym /* not changed */ ); /* format symbol for displaying or printing */ #define concat_symbols _glp_mpl_concat_symbols SYMBOL *concat_symbols ( MPL *mpl, SYMBOL *sym1, /* destroyed */ SYMBOL *sym2 /* destroyed */ ); /* concatenate one symbol with another */ /**********************************************************************/ /* * * N-TUPLES * * */ /**********************************************************************/ struct TUPLE { /* component of n-tuple; the n-tuple itself is associated with its first component; (note that 0-tuple has no components) */ SYMBOL *sym; /* symbol, which the component refers to; cannot be NULL */ TUPLE *next; /* the next component of n-tuple */ }; #define create_tuple _glp_mpl_create_tuple TUPLE *create_tuple(MPL *mpl); /* create n-tuple */ #define expand_tuple _glp_mpl_expand_tuple TUPLE *expand_tuple ( MPL *mpl, TUPLE *tuple, /* destroyed */ SYMBOL *sym /* destroyed */ ); /* append symbol to n-tuple */ #define tuple_dimen _glp_mpl_tuple_dimen int tuple_dimen ( MPL *mpl, TUPLE *tuple /* not changed */ ); /* determine dimension of n-tuple */ #define copy_tuple _glp_mpl_copy_tuple TUPLE *copy_tuple ( MPL *mpl, TUPLE *tuple /* not changed */ ); /* make copy of n-tuple */ #define compare_tuples _glp_mpl_compare_tuples int compare_tuples ( MPL *mpl, TUPLE *tuple1, /* not changed */ TUPLE *tuple2 /* not changed */ ); /* compare one n-tuple with another */ #define build_subtuple _glp_mpl_build_subtuple TUPLE *build_subtuple ( MPL *mpl, TUPLE *tuple, /* not changed */ int dim ); /* build subtuple of given n-tuple */ #define delete_tuple _glp_mpl_delete_tuple void delete_tuple ( MPL *mpl, TUPLE *tuple /* destroyed */ ); /* delete n-tuple */ #define format_tuple _glp_mpl_format_tuple char *format_tuple ( MPL *mpl, int c, TUPLE *tuple /* not changed */ ); /* format n-tuple for displaying or printing */ /**********************************************************************/ /* * * ELEMENTAL SETS * * */ /**********************************************************************/ #if 2 + 2 == 5 struct ELEMSET /* see ARRAY */ { /* elemental set of n-tuples; formally it is a "value" assigned to members of model sets (like numbers and symbols, which are values assigned to members of model parameters); note that a simple model set is not an elemental set, it is 0-dimensional array, the only member of which (if it exists) is assigned an elemental set */ #endif #define create_elemset _glp_mpl_create_elemset ELEMSET *create_elemset(MPL *mpl, int dim); /* create elemental set */ #define find_tuple _glp_mpl_find_tuple MEMBER *find_tuple ( MPL *mpl, ELEMSET *set, /* not changed */ TUPLE *tuple /* not changed */ ); /* check if elemental set contains given n-tuple */ #define add_tuple _glp_mpl_add_tuple MEMBER *add_tuple ( MPL *mpl, ELEMSET *set, /* modified */ TUPLE *tuple /* destroyed */ ); /* add new n-tuple to elemental set */ #define check_then_add _glp_mpl_check_then_add MEMBER *check_then_add ( MPL *mpl, ELEMSET *set, /* modified */ TUPLE *tuple /* destroyed */ ); /* check and add new n-tuple to elemental set */ #define copy_elemset _glp_mpl_copy_elemset ELEMSET *copy_elemset ( MPL *mpl, ELEMSET *set /* not changed */ ); /* make copy of elemental set */ #define delete_elemset _glp_mpl_delete_elemset void delete_elemset ( MPL *mpl, ELEMSET *set /* destroyed */ ); /* delete elemental set */ #define arelset_size _glp_mpl_arelset_size int arelset_size(MPL *mpl, double t0, double tf, double dt); /* compute size of "arithmetic" elemental set */ #define arelset_member _glp_mpl_arelset_member double arelset_member(MPL *mpl, double t0, double tf, double dt, int j); /* compute member of "arithmetic" elemental set */ #define create_arelset _glp_mpl_create_arelset ELEMSET *create_arelset(MPL *mpl, double t0, double tf, double dt); /* create "arithmetic" elemental set */ #define set_union _glp_mpl_set_union ELEMSET *set_union ( MPL *mpl, ELEMSET *X, /* destroyed */ ELEMSET *Y /* destroyed */ ); /* union of two elemental sets */ #define set_diff _glp_mpl_set_diff ELEMSET *set_diff ( MPL *mpl, ELEMSET *X, /* destroyed */ ELEMSET *Y /* destroyed */ ); /* difference between two elemental sets */ #define set_symdiff _glp_mpl_set_symdiff ELEMSET *set_symdiff ( MPL *mpl, ELEMSET *X, /* destroyed */ ELEMSET *Y /* destroyed */ ); /* symmetric difference between two elemental sets */ #define set_inter _glp_mpl_set_inter ELEMSET *set_inter ( MPL *mpl, ELEMSET *X, /* destroyed */ ELEMSET *Y /* destroyed */ ); /* intersection of two elemental sets */ #define set_cross _glp_mpl_set_cross ELEMSET *set_cross ( MPL *mpl, ELEMSET *X, /* destroyed */ ELEMSET *Y /* destroyed */ ); /* cross (Cartesian) product of two elemental sets */ /**********************************************************************/ /* * * ELEMENTAL VARIABLES * * */ /**********************************************************************/ struct ELEMVAR { /* elemental variable; formally it is a "value" assigned to members of model variables (like numbers and symbols, which are values assigned to members of model parameters) */ int j; /* LP column number assigned to this elemental variable */ VARIABLE *var; /* model variable, which contains this elemental variable */ MEMBER *memb; /* array member, which is assigned this elemental variable */ double lbnd; /* lower bound */ double ubnd; /* upper bound */ double temp; /* working quantity used in operations on linear forms; normally it contains floating-point zero */ #if 1 /* 15/V-2010 */ int stat; double prim, dual; /* solution components provided by the solver */ #endif }; /**********************************************************************/ /* * * LINEAR FORMS * * */ /**********************************************************************/ struct FORMULA { /* term of linear form c * x, where c is a coefficient, x is an elemental variable; the linear form itself is the sum of terms and is associated with its first term; (note that the linear form may be empty that means the sum is equal to zero) */ double coef; /* coefficient at elemental variable or constant term */ ELEMVAR *var; /* reference to elemental variable; NULL means constant term */ FORMULA *next; /* the next term of linear form */ }; #define constant_term _glp_mpl_constant_term FORMULA *constant_term(MPL *mpl, double coef); /* create constant term */ #define single_variable _glp_mpl_single_variable FORMULA *single_variable ( MPL *mpl, ELEMVAR *var /* referenced */ ); /* create single variable */ #define copy_formula _glp_mpl_copy_formula FORMULA *copy_formula ( MPL *mpl, FORMULA *form /* not changed */ ); /* make copy of linear form */ #define delete_formula _glp_mpl_delete_formula void delete_formula ( MPL *mpl, FORMULA *form /* destroyed */ ); /* delete linear form */ #define linear_comb _glp_mpl_linear_comb FORMULA *linear_comb ( MPL *mpl, double a, FORMULA *fx, /* destroyed */ double b, FORMULA *fy /* destroyed */ ); /* linear combination of two linear forms */ #define remove_constant _glp_mpl_remove_constant FORMULA *remove_constant ( MPL *mpl, FORMULA *form, /* destroyed */ double *coef /* modified */ ); /* remove constant term from linear form */ #define reduce_terms _glp_mpl_reduce_terms FORMULA *reduce_terms ( MPL *mpl, FORMULA *form /* destroyed */ ); /* reduce identical terms in linear form */ /**********************************************************************/ /* * * ELEMENTAL CONSTRAINTS * * */ /**********************************************************************/ struct ELEMCON { /* elemental constraint; formally it is a "value" assigned to members of model constraints (like numbers or symbols, which are values assigned to members of model parameters) */ int i; /* LP row number assigned to this elemental constraint */ CONSTRAINT *con; /* model constraint, which contains this elemental constraint */ MEMBER *memb; /* array member, which is assigned this elemental constraint */ FORMULA *form; /* linear form */ double lbnd; /* lower bound */ double ubnd; /* upper bound */ #if 1 /* 15/V-2010 */ int stat; double prim, dual; /* solution components provided by the solver */ #endif }; /**********************************************************************/ /* * * GENERIC VALUES * * */ /**********************************************************************/ union VALUE { /* generic value, which can be assigned to object member or be a result of evaluation of expression */ /* indicator that specifies the particular type of generic value is stored in the corresponding array or pseudo-code descriptor and can be one of the following: A_NONE - no value A_NUMERIC - floating-point number A_SYMBOLIC - symbol A_LOGICAL - logical value A_TUPLE - n-tuple A_ELEMSET - elemental set A_ELEMVAR - elemental variable A_FORMULA - linear form A_ELEMCON - elemental constraint */ void *none; /* null */ double num; /* value */ SYMBOL *sym; /* value */ int bit; /* value */ TUPLE *tuple; /* value */ ELEMSET *set; /* value */ ELEMVAR *var; /* reference */ FORMULA *form; /* value */ ELEMCON *con; /* reference */ }; #define delete_value _glp_mpl_delete_value void delete_value ( MPL *mpl, int type, VALUE *value /* content destroyed */ ); /* delete generic value */ /**********************************************************************/ /* * * SYMBOLICALLY INDEXED ARRAYS * * */ /**********************************************************************/ struct ARRAY { /* multi-dimensional array, a set of members indexed over simple or compound sets of symbols; arrays are used to represent the contents of model objects (i.e. sets, parameters, variables, constraints, and objectives); arrays also are used as "values" that are assigned to members of set objects, in which case the array itself represents an elemental set */ int type; /* type of generic values assigned to the array members: A_NONE - none (members have no assigned values) A_NUMERIC - floating-point numbers A_SYMBOLIC - symbols A_ELEMSET - elemental sets A_ELEMVAR - elemental variables A_ELEMCON - elemental constraints */ int dim; /* dimension of the array that determines number of components in n-tuples for all members of the array, dim >= 0; dim = 0 means the array is 0-dimensional */ int size; /* size of the array, i.e. number of its members */ MEMBER *head; /* the first array member; NULL means the array is empty */ MEMBER *tail; /* the last array member; NULL means the array is empty */ AVL *tree; /* the search tree intended to find array members for logarithmic time; NULL means the search tree doesn't exist */ ARRAY *prev; /* the previous array in the translator database */ ARRAY *next; /* the next array in the translator database */ }; struct MEMBER { /* array member */ TUPLE *tuple; /* n-tuple, which identifies the member; number of its components is the same for all members within the array and determined by the array dimension; duplicate members are not allowed */ MEMBER *next; /* the next array member */ VALUE value; /* generic value assigned to the member */ }; #define create_array _glp_mpl_create_array ARRAY *create_array(MPL *mpl, int type, int dim); /* create array */ #define find_member _glp_mpl_find_member MEMBER *find_member ( MPL *mpl, ARRAY *array, /* not changed */ TUPLE *tuple /* not changed */ ); /* find array member with given n-tuple */ #define add_member _glp_mpl_add_member MEMBER *add_member ( MPL *mpl, ARRAY *array, /* modified */ TUPLE *tuple /* destroyed */ ); /* add new member to array */ #define delete_array _glp_mpl_delete_array void delete_array ( MPL *mpl, ARRAY *array /* destroyed */ ); /* delete array */ /**********************************************************************/ /* * * DOMAINS AND DUMMY INDICES * * */ /**********************************************************************/ struct DOMAIN { /* domain (a simple or compound set); syntactically domain looks like '{ i in I, (j,k) in S, t in T : }'; domains are used to define sets, over which model objects are indexed, and also as constituents of iterated operators */ DOMAIN_BLOCK *list; /* linked list of domain blocks (in the example above such blocks are 'i in I', '(j,k) in S', and 't in T'); this list cannot be empty */ CODE *code; /* pseudo-code for computing the logical predicate, which follows the colon; NULL means no predicate is specified */ }; struct DOMAIN_BLOCK { /* domain block; syntactically domain blocks look like 'i in I', '(j,k) in S', and 't in T' in the example above (in the sequel sets like I, S, and T are called basic sets) */ DOMAIN_SLOT *list; /* linked list of domain slots (i.e. indexing positions); number of slots in this list is the same as dimension of n-tuples in the basic set; this list cannot be empty */ CODE *code; /* pseudo-code for computing basic set; cannot be NULL */ TUPLE *backup; /* if this n-tuple is not empty, current values of dummy indices in the domain block are the same as components of this n-tuple (note that this n-tuple may have larger dimension than number of dummy indices in this block, in which case extra components are ignored); this n-tuple is used to restore former values of dummy indices, if they were changed due to recursive calls to the domain block */ DOMAIN_BLOCK *next; /* the next block in the same domain */ }; struct DOMAIN_SLOT { /* domain slot; it specifies an individual indexing position and defines the corresponding dummy index */ char *name; /* symbolic name of the dummy index; null pointer means the dummy index is not explicitly specified */ CODE *code; /* pseudo-code for computing symbolic value, at which the dummy index is bound; NULL means the dummy index is free within the domain scope */ SYMBOL *value; /* current value assigned to the dummy index; NULL means no value is assigned at the moment */ CODE *list; /* linked list of pseudo-codes with operation O_INDEX referring to this slot; this linked list is used to invalidate resultant values of the operation, which depend on this dummy index */ DOMAIN_SLOT *next; /* the next slot in the same domain block */ }; #define assign_dummy_index _glp_mpl_assign_dummy_index void assign_dummy_index ( MPL *mpl, DOMAIN_SLOT *slot, /* modified */ SYMBOL *value /* not changed */ ); /* assign new value to dummy index */ #define update_dummy_indices _glp_mpl_update_dummy_indices void update_dummy_indices ( MPL *mpl, DOMAIN_BLOCK *block /* not changed */ ); /* update current values of dummy indices */ #define enter_domain_block _glp_mpl_enter_domain_block int enter_domain_block ( MPL *mpl, DOMAIN_BLOCK *block, /* not changed */ TUPLE *tuple, /* not changed */ void *info, void (*func)(MPL *mpl, void *info) ); /* enter domain block */ #define eval_within_domain _glp_mpl_eval_within_domain int eval_within_domain ( MPL *mpl, DOMAIN *domain, /* not changed */ TUPLE *tuple, /* not changed */ void *info, void (*func)(MPL *mpl, void *info) ); /* perform evaluation within domain scope */ #define loop_within_domain _glp_mpl_loop_within_domain void loop_within_domain ( MPL *mpl, DOMAIN *domain, /* not changed */ void *info, int (*func)(MPL *mpl, void *info) ); /* perform iterations within domain scope */ #define out_of_domain _glp_mpl_out_of_domain void out_of_domain ( MPL *mpl, char *name, /* not changed */ TUPLE *tuple /* not changed */ ); /* raise domain exception */ #define get_domain_tuple _glp_mpl_get_domain_tuple TUPLE *get_domain_tuple ( MPL *mpl, DOMAIN *domain /* not changed */ ); /* obtain current n-tuple from domain */ #define clean_domain _glp_mpl_clean_domain void clean_domain(MPL *mpl, DOMAIN *domain); /* clean domain */ /**********************************************************************/ /* * * MODEL SETS * * */ /**********************************************************************/ struct SET { /* model set */ char *name; /* symbolic name; cannot be NULL */ char *alias; /* alias; NULL means alias is not specified */ int dim; /* aka arity */ /* dimension (number of subscripts); dim = 0 means 0-dimensional (unsubscripted) set, dim > 0 means set of sets */ DOMAIN *domain; /* subscript domain; NULL for 0-dimensional set */ int dimen; /* dimension of n-tuples, which members of this set consist of (note that the model set itself is an array of elemental sets, which are its members; so, don't confuse this dimension with dimension of the model set); always non-zero */ WITHIN *within; /* list of supersets, which restrict each member of the set to be in every superset from this list; this list can be empty */ CODE *assign; /* pseudo-code for computing assigned value; can be NULL */ CODE *option; /* pseudo-code for computing default value; can be NULL */ GADGET *gadget; /* plain set used to initialize the array of sets; can be NULL */ int data; /* data status flag: 0 - no data are provided in the data section 1 - data are provided, but not checked yet 2 - data are provided and have been checked */ ARRAY *array; /* array of members, which are assigned elemental sets */ }; struct WITHIN { /* restricting superset list entry */ CODE *code; /* pseudo-code for computing the superset; cannot be NULL */ WITHIN *next; /* the next entry for the same set or parameter */ }; struct GADGET { /* plain set used to initialize the array of sets with data */ SET *set; /* pointer to plain set; cannot be NULL */ int ind[20]; /* ind[dim+dimen]; */ /* permutation of integers 1, 2, ..., dim+dimen */ }; #define check_elem_set _glp_mpl_check_elem_set void check_elem_set ( MPL *mpl, SET *set, /* not changed */ TUPLE *tuple, /* not changed */ ELEMSET *refer /* not changed */ ); /* check elemental set assigned to set member */ #define take_member_set _glp_mpl_take_member_set ELEMSET *take_member_set /* returns reference, not value */ ( MPL *mpl, SET *set, /* not changed */ TUPLE *tuple /* not changed */ ); /* obtain elemental set assigned to set member */ #define eval_member_set _glp_mpl_eval_member_set ELEMSET *eval_member_set /* returns reference, not value */ ( MPL *mpl, SET *set, /* not changed */ TUPLE *tuple /* not changed */ ); /* evaluate elemental set assigned to set member */ #define eval_whole_set _glp_mpl_eval_whole_set void eval_whole_set(MPL *mpl, SET *set); /* evaluate model set over entire domain */ #define clean_set _glp_mpl_clean_set void clean_set(MPL *mpl, SET *set); /* clean model set */ /**********************************************************************/ /* * * MODEL PARAMETERS * * */ /**********************************************************************/ struct PARAMETER { /* model parameter */ char *name; /* symbolic name; cannot be NULL */ char *alias; /* alias; NULL means alias is not specified */ int dim; /* aka arity */ /* dimension (number of subscripts); dim = 0 means 0-dimensional (unsubscripted) parameter */ DOMAIN *domain; /* subscript domain; NULL for 0-dimensional parameter */ int type; /* parameter type: A_NUMERIC - numeric A_INTEGER - integer A_BINARY - binary A_SYMBOLIC - symbolic */ CONDITION *cond; /* list of conditions, which restrict each parameter member to satisfy to every condition from this list; this list is used only for numeric parameters and can be empty */ WITHIN *in; /* list of supersets, which restrict each parameter member to be in every superset from this list; this list is used only for symbolic parameters and can be empty */ CODE *assign; /* pseudo-code for computing assigned value; can be NULL */ CODE *option; /* pseudo-code for computing default value; can be NULL */ int data; /* data status flag: 0 - no data are provided in the data section 1 - data are provided, but not checked yet 2 - data are provided and have been checked */ SYMBOL *defval; /* default value provided in the data section; can be NULL */ ARRAY *array; /* array of members, which are assigned numbers or symbols */ }; struct CONDITION { /* restricting condition list entry */ int rho; /* flag that specifies the form of the condition: O_LT - less than O_LE - less than or equal to O_EQ - equal to O_GE - greater than or equal to O_GT - greater than O_NE - not equal to */ CODE *code; /* pseudo-code for computing the reference value */ CONDITION *next; /* the next entry for the same parameter */ }; #define check_value_num _glp_mpl_check_value_num void check_value_num ( MPL *mpl, PARAMETER *par, /* not changed */ TUPLE *tuple, /* not changed */ double value ); /* check numeric value assigned to parameter member */ #define take_member_num _glp_mpl_take_member_num double take_member_num ( MPL *mpl, PARAMETER *par, /* not changed */ TUPLE *tuple /* not changed */ ); /* obtain numeric value assigned to parameter member */ #define eval_member_num _glp_mpl_eval_member_num double eval_member_num ( MPL *mpl, PARAMETER *par, /* not changed */ TUPLE *tuple /* not changed */ ); /* evaluate numeric value assigned to parameter member */ #define check_value_sym _glp_mpl_check_value_sym void check_value_sym ( MPL *mpl, PARAMETER *par, /* not changed */ TUPLE *tuple, /* not changed */ SYMBOL *value /* not changed */ ); /* check symbolic value assigned to parameter member */ #define take_member_sym _glp_mpl_take_member_sym SYMBOL *take_member_sym /* returns value, not reference */ ( MPL *mpl, PARAMETER *par, /* not changed */ TUPLE *tuple /* not changed */ ); /* obtain symbolic value assigned to parameter member */ #define eval_member_sym _glp_mpl_eval_member_sym SYMBOL *eval_member_sym /* returns value, not reference */ ( MPL *mpl, PARAMETER *par, /* not changed */ TUPLE *tuple /* not changed */ ); /* evaluate symbolic value assigned to parameter member */ #define eval_whole_par _glp_mpl_eval_whole_par void eval_whole_par(MPL *mpl, PARAMETER *par); /* evaluate model parameter over entire domain */ #define clean_parameter _glp_mpl_clean_parameter void clean_parameter(MPL *mpl, PARAMETER *par); /* clean model parameter */ /**********************************************************************/ /* * * MODEL VARIABLES * * */ /**********************************************************************/ struct VARIABLE { /* model variable */ char *name; /* symbolic name; cannot be NULL */ char *alias; /* alias; NULL means alias is not specified */ int dim; /* aka arity */ /* dimension (number of subscripts); dim = 0 means 0-dimensional (unsubscripted) variable */ DOMAIN *domain; /* subscript domain; NULL for 0-dimensional variable */ int type; /* variable type: A_NUMERIC - continuous A_INTEGER - integer A_BINARY - binary */ CODE *lbnd; /* pseudo-code for computing lower bound; NULL means lower bound is not specified */ CODE *ubnd; /* pseudo-code for computing upper bound; NULL means upper bound is not specified */ /* if both the pointers lbnd and ubnd refer to the same code, the variable is fixed at the corresponding value */ ARRAY *array; /* array of members, which are assigned elemental variables */ }; #define take_member_var _glp_mpl_take_member_var ELEMVAR *take_member_var /* returns reference */ ( MPL *mpl, VARIABLE *var, /* not changed */ TUPLE *tuple /* not changed */ ); /* obtain reference to elemental variable */ #define eval_member_var _glp_mpl_eval_member_var ELEMVAR *eval_member_var /* returns reference */ ( MPL *mpl, VARIABLE *var, /* not changed */ TUPLE *tuple /* not changed */ ); /* evaluate reference to elemental variable */ #define eval_whole_var _glp_mpl_eval_whole_var void eval_whole_var(MPL *mpl, VARIABLE *var); /* evaluate model variable over entire domain */ #define clean_variable _glp_mpl_clean_variable void clean_variable(MPL *mpl, VARIABLE *var); /* clean model variable */ /**********************************************************************/ /* * * MODEL CONSTRAINTS AND OBJECTIVES * * */ /**********************************************************************/ struct CONSTRAINT { /* model constraint or objective */ char *name; /* symbolic name; cannot be NULL */ char *alias; /* alias; NULL means alias is not specified */ int dim; /* aka arity */ /* dimension (number of subscripts); dim = 0 means 0-dimensional (unsubscripted) constraint */ DOMAIN *domain; /* subscript domain; NULL for 0-dimensional constraint */ int type; /* constraint type: A_CONSTRAINT - constraint A_MINIMIZE - objective (minimization) A_MAXIMIZE - objective (maximization) */ CODE *code; /* pseudo-code for computing main linear form; cannot be NULL */ CODE *lbnd; /* pseudo-code for computing lower bound; NULL means lower bound is not specified */ CODE *ubnd; /* pseudo-code for computing upper bound; NULL means upper bound is not specified */ /* if both the pointers lbnd and ubnd refer to the same code, the constraint has the form of equation */ ARRAY *array; /* array of members, which are assigned elemental constraints */ }; #define take_member_con _glp_mpl_take_member_con ELEMCON *take_member_con /* returns reference */ ( MPL *mpl, CONSTRAINT *con, /* not changed */ TUPLE *tuple /* not changed */ ); /* obtain reference to elemental constraint */ #define eval_member_con _glp_mpl_eval_member_con ELEMCON *eval_member_con /* returns reference */ ( MPL *mpl, CONSTRAINT *con, /* not changed */ TUPLE *tuple /* not changed */ ); /* evaluate reference to elemental constraint */ #define eval_whole_con _glp_mpl_eval_whole_con void eval_whole_con(MPL *mpl, CONSTRAINT *con); /* evaluate model constraint over entire domain */ #define clean_constraint _glp_mpl_clean_constraint void clean_constraint(MPL *mpl, CONSTRAINT *con); /* clean model constraint */ /**********************************************************************/ /* * * DATA TABLES * * */ /**********************************************************************/ struct TABLE { /* data table */ char *name; /* symbolic name; cannot be NULL */ char *alias; /* alias; NULL means alias is not specified */ int type; /* table type: A_INPUT - input table A_OUTPUT - output table */ TABARG *arg; /* argument list; cannot be empty */ union { struct { SET *set; /* input set; NULL means the set is not specified */ TABFLD *fld; /* field list; cannot be empty */ TABIN *list; /* input list; can be empty */ } in; struct { DOMAIN *domain; /* subscript domain; cannot be NULL */ TABOUT *list; /* output list; cannot be empty */ } out; } u; }; struct TABARG { /* table argument list entry */ CODE *code; /* pseudo-code for computing the argument */ TABARG *next; /* next entry for the same table */ }; struct TABFLD { /* table field list entry */ char *name; /* field name; cannot be NULL */ TABFLD *next; /* next entry for the same table */ }; struct TABIN { /* table input list entry */ PARAMETER *par; /* parameter to be read; cannot be NULL */ char *name; /* column name; cannot be NULL */ TABIN *next; /* next entry for the same table */ }; struct TABOUT { /* table output list entry */ CODE *code; /* pseudo-code for computing the value to be written */ char *name; /* column name; cannot be NULL */ TABOUT *next; /* next entry for the same table */ }; struct TABDCA { /* table driver communication area */ int id; /* driver identifier (set by mpl_tab_drv_open) */ void *link; /* driver link pointer (set by mpl_tab_drv_open) */ int na; /* number of arguments */ char **arg; /* char *arg[1+ns]; */ /* arg[k], 1 <= k <= ns, is pointer to k-th argument */ int nf; /* number of fields */ char **name; /* char *name[1+nc]; */ /* name[k], 1 <= k <= nc, is name of k-th field */ int *type; /* int type[1+nc]; */ /* type[k], 1 <= k <= nc, is type of k-th field: '?' - value not assigned 'N' - number 'S' - character string */ double *num; /* double num[1+nc]; */ /* num[k], 1 <= k <= nc, is numeric value of k-th field */ char **str; /* str[k], 1 <= k <= nc, is string value of k-th field */ }; #define mpl_tab_num_args _glp_mpl_tab_num_args int mpl_tab_num_args(TABDCA *dca); #define mpl_tab_get_arg _glp_mpl_tab_get_arg const char *mpl_tab_get_arg(TABDCA *dca, int k); #define mpl_tab_num_flds _glp_mpl_tab_num_flds int mpl_tab_num_flds(TABDCA *dca); #define mpl_tab_get_name _glp_mpl_tab_get_name const char *mpl_tab_get_name(TABDCA *dca, int k); #define mpl_tab_get_type _glp_mpl_tab_get_type int mpl_tab_get_type(TABDCA *dca, int k); #define mpl_tab_get_num _glp_mpl_tab_get_num double mpl_tab_get_num(TABDCA *dca, int k); #define mpl_tab_get_str _glp_mpl_tab_get_str const char *mpl_tab_get_str(TABDCA *dca, int k); #define mpl_tab_set_num _glp_mpl_tab_set_num void mpl_tab_set_num(TABDCA *dca, int k, double num); #define mpl_tab_set_str _glp_mpl_tab_set_str void mpl_tab_set_str(TABDCA *dca, int k, const char *str); #define mpl_tab_drv_open _glp_mpl_tab_drv_open void mpl_tab_drv_open(MPL *mpl, int mode); #define mpl_tab_drv_read _glp_mpl_tab_drv_read int mpl_tab_drv_read(MPL *mpl); #define mpl_tab_drv_write _glp_mpl_tab_drv_write void mpl_tab_drv_write(MPL *mpl); #define mpl_tab_drv_close _glp_mpl_tab_drv_close void mpl_tab_drv_close(MPL *mpl); /**********************************************************************/ /* * * PSEUDO-CODE * * */ /**********************************************************************/ union OPERANDS { /* operands that participate in pseudo-code operation (choice of particular operands depends on the operation code) */ /*--------------------------------------------------------------*/ double num; /* O_NUMBER */ /* floaing-point number to be taken */ /*--------------------------------------------------------------*/ char *str; /* O_STRING */ /* character string to be taken */ /*--------------------------------------------------------------*/ struct /* O_INDEX */ { DOMAIN_SLOT *slot; /* domain slot, which contains dummy index to be taken */ CODE *next; /* the next pseudo-code with op = O_INDEX, which refers to the same slot as this one; pointer to the beginning of this list is stored in the corresponding domain slot */ } index; /*--------------------------------------------------------------*/ struct /* O_MEMNUM, O_MEMSYM */ { PARAMETER *par; /* model parameter, which contains member to be taken */ ARG_LIST *list; /* list of subscripts; NULL for 0-dimensional parameter */ } par; /*--------------------------------------------------------------*/ struct /* O_MEMSET */ { SET *set; /* model set, which contains member to be taken */ ARG_LIST *list; /* list of subscripts; NULL for 0-dimensional set */ } set; /*--------------------------------------------------------------*/ struct /* O_MEMVAR */ { VARIABLE *var; /* model variable, which contains member to be taken */ ARG_LIST *list; /* list of subscripts; NULL for 0-dimensional variable */ #if 1 /* 15/V-2010 */ int suff; /* suffix specified: */ #define DOT_NONE 0x00 /* none (means variable itself) */ #define DOT_LB 0x01 /* .lb (lower bound) */ #define DOT_UB 0x02 /* .ub (upper bound) */ #define DOT_STATUS 0x03 /* .status (status) */ #define DOT_VAL 0x04 /* .val (primal value) */ #define DOT_DUAL 0x05 /* .dual (dual value) */ #endif } var; #if 1 /* 15/V-2010 */ /*--------------------------------------------------------------*/ struct /* O_MEMCON */ { CONSTRAINT *con; /* model constraint, which contains member to be taken */ ARG_LIST *list; /* list of subscripys; NULL for 0-dimensional constraint */ int suff; /* suffix specified (see O_MEMVAR above) */ } con; #endif /*--------------------------------------------------------------*/ ARG_LIST *list; /* O_TUPLE, O_MAKE, n-ary operations */ /* list of operands */ /*--------------------------------------------------------------*/ DOMAIN_BLOCK *slice; /* O_SLICE */ /* domain block, which specifies slice (i.e. n-tuple that contains free dummy indices); this operation is never evaluated */ /*--------------------------------------------------------------*/ struct /* unary, binary, ternary operations */ { CODE *x; /* pseudo-code for computing first operand */ CODE *y; /* pseudo-code for computing second operand */ CODE *z; /* pseudo-code for computing third operand */ } arg; /*--------------------------------------------------------------*/ struct /* iterated operations */ { DOMAIN *domain; /* domain, over which the operation is performed */ CODE *x; /* pseudo-code for computing "integrand" */ } loop; /*--------------------------------------------------------------*/ }; struct ARG_LIST { /* operands list entry */ CODE *x; /* pseudo-code for computing operand */ ARG_LIST *next; /* the next operand of the same operation */ }; struct CODE { /* pseudo-code (internal form of expressions) */ int op; /* operation code: */ #define O_NUMBER 301 /* take floating-point number */ #define O_STRING 302 /* take character string */ #define O_INDEX 303 /* take dummy index */ #define O_MEMNUM 304 /* take member of numeric parameter */ #define O_MEMSYM 305 /* take member of symbolic parameter */ #define O_MEMSET 306 /* take member of set */ #define O_MEMVAR 307 /* take member of variable */ #define O_MEMCON 308 /* take member of constraint */ #define O_TUPLE 309 /* make n-tuple */ #define O_MAKE 310 /* make elemental set of n-tuples */ #define O_SLICE 311 /* define domain block (dummy op) */ /* 0-ary operations --------------------*/ #define O_IRAND224 312 /* pseudo-random in [0, 2^24-1] */ #define O_UNIFORM01 313 /* pseudo-random in [0, 1) */ #define O_NORMAL01 314 /* gaussian random, mu = 0, sigma = 1 */ #define O_GMTIME 315 /* current calendar time (UTC) */ /* unary operations --------------------*/ #define O_CVTNUM 316 /* conversion to numeric */ #define O_CVTSYM 317 /* conversion to symbolic */ #define O_CVTLOG 318 /* conversion to logical */ #define O_CVTTUP 319 /* conversion to 1-tuple */ #define O_CVTLFM 320 /* conversion to linear form */ #define O_PLUS 321 /* unary plus */ #define O_MINUS 322 /* unary minus */ #define O_NOT 323 /* negation (logical "not") */ #define O_ABS 324 /* absolute value */ #define O_CEIL 325 /* round upward ("ceiling of x") */ #define O_FLOOR 326 /* round downward ("floor of x") */ #define O_EXP 327 /* base-e exponential */ #define O_LOG 328 /* natural logarithm */ #define O_LOG10 329 /* common (decimal) logarithm */ #define O_SQRT 330 /* square root */ #define O_SIN 331 /* trigonometric sine */ #define O_COS 332 /* trigonometric cosine */ #define O_TAN 333 /* trigonometric tangent */ #define O_ATAN 334 /* trigonometric arctangent */ #define O_ROUND 335 /* round to nearest integer */ #define O_TRUNC 336 /* truncate to nearest integer */ #define O_CARD 337 /* cardinality of set */ #define O_LENGTH 338 /* length of symbolic value */ /* binary operations -------------------*/ #define O_ADD 339 /* addition */ #define O_SUB 340 /* subtraction */ #define O_LESS 341 /* non-negative subtraction */ #define O_MUL 342 /* multiplication */ #define O_DIV 343 /* division */ #define O_IDIV 344 /* quotient of exact division */ #define O_MOD 345 /* remainder of exact division */ #define O_POWER 346 /* exponentiation (raise to power) */ #define O_ATAN2 347 /* trigonometric arctangent */ #define O_ROUND2 348 /* round to n fractional digits */ #define O_TRUNC2 349 /* truncate to n fractional digits */ #define O_UNIFORM 350 /* pseudo-random in [a, b) */ #define O_NORMAL 351 /* gaussian random, given mu and sigma */ #define O_CONCAT 352 /* concatenation */ #define O_LT 353 /* comparison on 'less than' */ #define O_LE 354 /* comparison on 'not greater than' */ #define O_EQ 355 /* comparison on 'equal to' */ #define O_GE 356 /* comparison on 'not less than' */ #define O_GT 357 /* comparison on 'greater than' */ #define O_NE 358 /* comparison on 'not equal to' */ #define O_AND 359 /* conjunction (logical "and") */ #define O_OR 360 /* disjunction (logical "or") */ #define O_UNION 361 /* union */ #define O_DIFF 362 /* difference */ #define O_SYMDIFF 363 /* symmetric difference */ #define O_INTER 364 /* intersection */ #define O_CROSS 365 /* cross (Cartesian) product */ #define O_IN 366 /* test on 'x in Y' */ #define O_NOTIN 367 /* test on 'x not in Y' */ #define O_WITHIN 368 /* test on 'X within Y' */ #define O_NOTWITHIN 369 /* test on 'X not within Y' */ #define O_SUBSTR 370 /* substring */ #define O_STR2TIME 371 /* convert string to time */ #define O_TIME2STR 372 /* convert time to string */ /* ternary operations ------------------*/ #define O_DOTS 373 /* build "arithmetic" set */ #define O_FORK 374 /* if-then-else */ #define O_SUBSTR3 375 /* substring */ /* n-ary operations --------------------*/ #define O_MIN 376 /* minimal value (n-ary) */ #define O_MAX 377 /* maximal value (n-ary) */ /* iterated operations -----------------*/ #define O_SUM 378 /* summation */ #define O_PROD 379 /* multiplication */ #define O_MINIMUM 380 /* minimum */ #define O_MAXIMUM 381 /* maximum */ #define O_FORALL 382 /* conjunction (A-quantification) */ #define O_EXISTS 383 /* disjunction (E-quantification) */ #define O_SETOF 384 /* compute elemental set */ #define O_BUILD 385 /* build elemental set */ OPERANDS arg; /* operands that participate in the operation */ int type; /* type of the resultant value: A_NUMERIC - numeric A_SYMBOLIC - symbolic A_LOGICAL - logical A_TUPLE - n-tuple A_ELEMSET - elemental set A_FORMULA - linear form */ int dim; /* dimension of the resultant value; for A_TUPLE and A_ELEMSET it is the dimension of the corresponding n-tuple(s) and cannot be zero; for other resultant types it is always zero */ CODE *up; /* parent pseudo-code, which refers to this pseudo-code as to its operand; NULL means this pseudo-code has no parent and defines an expression, which is not contained in another expression */ int vflag; /* volatile flag; being set this flag means that this operation has a side effect; for primary expressions this flag is set directly by corresponding parsing routines (for example, if primary expression is a reference to a function that generates pseudo-random numbers); in other cases this flag is inherited from operands */ int valid; /* if this flag is set, the resultant value, which is a temporary result of evaluating this operation on particular values of operands, is valid; if this flag is clear, the resultant value doesn't exist and therefore not valid; having been evaluated the resultant value is stored here and not destroyed until the dummy indices, which this value depends on, have been changed (and if it doesn't depend on dummy indices at all, it is never destroyed); thus, if the resultant value is valid, evaluating routine can immediately take its copy not computing the result from scratch; this mechanism is similar to moving invariants out of loops and allows improving efficiency at the expense of some extra memory needed to keep temporary results */ /* however, if the volatile flag (see above) is set, even if the resultant value is valid, evaluating routine computes it as if it were not valid, i.e. caching is not used in this case */ VALUE value; /* resultant value in generic format */ }; #define eval_numeric _glp_mpl_eval_numeric double eval_numeric(MPL *mpl, CODE *code); /* evaluate pseudo-code to determine numeric value */ #define eval_symbolic _glp_mpl_eval_symbolic SYMBOL *eval_symbolic(MPL *mpl, CODE *code); /* evaluate pseudo-code to determine symbolic value */ #define eval_logical _glp_mpl_eval_logical int eval_logical(MPL *mpl, CODE *code); /* evaluate pseudo-code to determine logical value */ #define eval_tuple _glp_mpl_eval_tuple TUPLE *eval_tuple(MPL *mpl, CODE *code); /* evaluate pseudo-code to construct n-tuple */ #define eval_elemset _glp_mpl_eval_elemset ELEMSET *eval_elemset(MPL *mpl, CODE *code); /* evaluate pseudo-code to construct elemental set */ #define is_member _glp_mpl_is_member int is_member(MPL *mpl, CODE *code, TUPLE *tuple); /* check if n-tuple is in set specified by pseudo-code */ #define eval_formula _glp_mpl_eval_formula FORMULA *eval_formula(MPL *mpl, CODE *code); /* evaluate pseudo-code to construct linear form */ #define clean_code _glp_mpl_clean_code void clean_code(MPL *mpl, CODE *code); /* clean pseudo-code */ /**********************************************************************/ /* * * MODEL STATEMENTS * * */ /**********************************************************************/ struct CHECK { /* check statement */ DOMAIN *domain; /* subscript domain; NULL means domain is not used */ CODE *code; /* code for computing the predicate to be checked */ }; struct DISPLAY { /* display statement */ DOMAIN *domain; /* subscript domain; NULL means domain is not used */ DISPLAY1 *list; /* display list; cannot be empty */ }; struct DISPLAY1 { /* display list entry */ int type; /* item type: A_INDEX - dummy index A_SET - model set A_PARAMETER - model parameter A_VARIABLE - model variable A_CONSTRAINT - model constraint/objective A_EXPRESSION - expression */ union { DOMAIN_SLOT *slot; SET *set; PARAMETER *par; VARIABLE *var; CONSTRAINT *con; CODE *code; } u; /* item to be displayed */ #if 0 /* 15/V-2010 */ ARG_LIST *list; /* optional subscript list (for constraint/objective only) */ #endif DISPLAY1 *next; /* the next entry for the same statement */ }; struct PRINTF { /* printf statement */ DOMAIN *domain; /* subscript domain; NULL means domain is not used */ CODE *fmt; /* pseudo-code for computing format string */ PRINTF1 *list; /* printf list; can be empty */ CODE *fname; /* pseudo-code for computing filename to redirect the output; NULL means the output goes to stdout */ int app; /* if this flag is set, the output is appended */ }; struct PRINTF1 { /* printf list entry */ CODE *code; /* pseudo-code for computing value to be printed */ PRINTF1 *next; /* the next entry for the same statement */ }; struct FOR { /* for statement */ DOMAIN *domain; /* subscript domain; cannot be NULL */ STATEMENT *list; /* linked list of model statements within this for statement in the original order */ }; struct STATEMENT { /* model statement */ int line; /* number of source text line, where statement begins */ int type; /* statement type: A_SET - set statement A_PARAMETER - parameter statement A_VARIABLE - variable statement A_CONSTRAINT - constraint/objective statement A_TABLE - table statement A_SOLVE - solve statement A_CHECK - check statement A_DISPLAY - display statement A_PRINTF - printf statement A_FOR - for statement */ union { SET *set; PARAMETER *par; VARIABLE *var; CONSTRAINT *con; TABLE *tab; void *slv; /* currently not used (set to NULL) */ CHECK *chk; DISPLAY *dpy; PRINTF *prt; FOR *fur; } u; /* specific part of statement */ STATEMENT *next; /* the next statement; in this list statements follow in the same order as they appear in the model section */ }; #define execute_table _glp_mpl_execute_table void execute_table(MPL *mpl, TABLE *tab); /* execute table statement */ #define free_dca _glp_mpl_free_dca void free_dca(MPL *mpl); /* free table driver communucation area */ #define clean_table _glp_mpl_clean_table void clean_table(MPL *mpl, TABLE *tab); /* clean table statement */ #define execute_check _glp_mpl_execute_check void execute_check(MPL *mpl, CHECK *chk); /* execute check statement */ #define clean_check _glp_mpl_clean_check void clean_check(MPL *mpl, CHECK *chk); /* clean check statement */ #define execute_display _glp_mpl_execute_display void execute_display(MPL *mpl, DISPLAY *dpy); /* execute display statement */ #define clean_display _glp_mpl_clean_display void clean_display(MPL *mpl, DISPLAY *dpy); /* clean display statement */ #define execute_printf _glp_mpl_execute_printf void execute_printf(MPL *mpl, PRINTF *prt); /* execute printf statement */ #define clean_printf _glp_mpl_clean_printf void clean_printf(MPL *mpl, PRINTF *prt); /* clean printf statement */ #define execute_for _glp_mpl_execute_for void execute_for(MPL *mpl, FOR *fur); /* execute for statement */ #define clean_for _glp_mpl_clean_for void clean_for(MPL *mpl, FOR *fur); /* clean for statement */ #define execute_statement _glp_mpl_execute_statement void execute_statement(MPL *mpl, STATEMENT *stmt); /* execute specified model statement */ #define clean_statement _glp_mpl_clean_statement void clean_statement(MPL *mpl, STATEMENT *stmt); /* clean specified model statement */ /**********************************************************************/ /* * * GENERATING AND POSTSOLVING MODEL * * */ /**********************************************************************/ #define alloc_content _glp_mpl_alloc_content void alloc_content(MPL *mpl); /* allocate content arrays for all model objects */ #define generate_model _glp_mpl_generate_model void generate_model(MPL *mpl); /* generate model */ #define build_problem _glp_mpl_build_problem void build_problem(MPL *mpl); /* build problem instance */ #define postsolve_model _glp_mpl_postsolve_model void postsolve_model(MPL *mpl); /* postsolve model */ #define clean_model _glp_mpl_clean_model void clean_model(MPL *mpl); /* clean model content */ /**********************************************************************/ /* * * INPUT/OUTPUT * * */ /**********************************************************************/ #define open_input _glp_mpl_open_input void open_input(MPL *mpl, char *file); /* open input text file */ #define read_char _glp_mpl_read_char int read_char(MPL *mpl); /* read next character from input text file */ #define close_input _glp_mpl_close_input void close_input(MPL *mpl); /* close input text file */ #define open_output _glp_mpl_open_output void open_output(MPL *mpl, char *file); /* open output text file */ #define write_char _glp_mpl_write_char void write_char(MPL *mpl, int c); /* write next character to output text file */ #define write_text _glp_mpl_write_text void write_text(MPL *mpl, char *fmt, ...); /* format and write text to output text file */ #define flush_output _glp_mpl_flush_output void flush_output(MPL *mpl); /* finalize writing data to output text file */ /**********************************************************************/ /* * * SOLVER INTERFACE * * */ /**********************************************************************/ #define MPL_FR 401 /* free (unbounded) */ #define MPL_LO 402 /* lower bound */ #define MPL_UP 403 /* upper bound */ #define MPL_DB 404 /* both lower and upper bounds */ #define MPL_FX 405 /* fixed */ #define MPL_ST 411 /* constraint */ #define MPL_MIN 412 /* objective (minimization) */ #define MPL_MAX 413 /* objective (maximization) */ #define MPL_NUM 421 /* continuous */ #define MPL_INT 422 /* integer */ #define MPL_BIN 423 /* binary */ #define error _glp_mpl_error void error(MPL *mpl, char *fmt, ...); /* print error message and terminate model processing */ #define warning _glp_mpl_warning void warning(MPL *mpl, char *fmt, ...); /* print warning message and continue model processing */ #define mpl_initialize _glp_mpl_initialize MPL *mpl_initialize(void); /* create and initialize translator database */ #define mpl_read_model _glp_mpl_read_model int mpl_read_model(MPL *mpl, char *file, int skip_data); /* read model section and optional data section */ #define mpl_read_data _glp_mpl_read_data int mpl_read_data(MPL *mpl, char *file); /* read data section */ #define mpl_generate _glp_mpl_generate int mpl_generate(MPL *mpl, char *file); /* generate model */ #define mpl_get_prob_name _glp_mpl_get_prob_name char *mpl_get_prob_name(MPL *mpl); /* obtain problem (model) name */ #define mpl_get_num_rows _glp_mpl_get_num_rows int mpl_get_num_rows(MPL *mpl); /* determine number of rows */ #define mpl_get_num_cols _glp_mpl_get_num_cols int mpl_get_num_cols(MPL *mpl); /* determine number of columns */ #define mpl_get_row_name _glp_mpl_get_row_name char *mpl_get_row_name(MPL *mpl, int i); /* obtain row name */ #define mpl_get_row_kind _glp_mpl_get_row_kind int mpl_get_row_kind(MPL *mpl, int i); /* determine row kind */ #define mpl_get_row_bnds _glp_mpl_get_row_bnds int mpl_get_row_bnds(MPL *mpl, int i, double *lb, double *ub); /* obtain row bounds */ #define mpl_get_mat_row _glp_mpl_get_mat_row int mpl_get_mat_row(MPL *mpl, int i, int ndx[], double val[]); /* obtain row of the constraint matrix */ #define mpl_get_row_c0 _glp_mpl_get_row_c0 double mpl_get_row_c0(MPL *mpl, int i); /* obtain constant term of free row */ #define mpl_get_col_name _glp_mpl_get_col_name char *mpl_get_col_name(MPL *mpl, int j); /* obtain column name */ #define mpl_get_col_kind _glp_mpl_get_col_kind int mpl_get_col_kind(MPL *mpl, int j); /* determine column kind */ #define mpl_get_col_bnds _glp_mpl_get_col_bnds int mpl_get_col_bnds(MPL *mpl, int j, double *lb, double *ub); /* obtain column bounds */ #define mpl_has_solve_stmt _glp_mpl_has_solve_stmt int mpl_has_solve_stmt(MPL *mpl); /* check if model has solve statement */ #if 1 /* 15/V-2010 */ #define mpl_put_row_soln _glp_mpl_put_row_soln void mpl_put_row_soln(MPL *mpl, int i, int stat, double prim, double dual); /* store row (constraint/objective) solution components */ #endif #if 1 /* 15/V-2010 */ #define mpl_put_col_soln _glp_mpl_put_col_soln void mpl_put_col_soln(MPL *mpl, int j, int stat, double prim, double dual); /* store column (variable) solution components */ #endif #if 0 /* 15/V-2010 */ #define mpl_put_col_value _glp_mpl_put_col_value void mpl_put_col_value(MPL *mpl, int j, double val); /* store column value */ #endif #define mpl_postsolve _glp_mpl_postsolve int mpl_postsolve(MPL *mpl); /* postsolve model */ #define mpl_terminate _glp_mpl_terminate void mpl_terminate(MPL *mpl); /* free all resources used by translator */ #endif /* eof */ glpk-5.0/src/mpl/mpl1.c0000644000062000006210000052677713766346220014126 0ustar maomkpasswd/* mpl1.c */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2003-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "mpl.h" #define dmp_get_atomv dmp_get_atom /**********************************************************************/ /* * * PROCESSING MODEL SECTION * * */ /**********************************************************************/ /*---------------------------------------------------------------------- -- enter_context - enter current token into context queue. -- -- This routine enters the current token into the context queue. */ void enter_context(MPL *mpl) { char *image, *s; if (mpl->token == T_EOF) image = "_|_"; else if (mpl->token == T_STRING) image = "'...'"; else image = mpl->image; xassert(0 <= mpl->c_ptr && mpl->c_ptr < CONTEXT_SIZE); mpl->context[mpl->c_ptr++] = ' '; if (mpl->c_ptr == CONTEXT_SIZE) mpl->c_ptr = 0; for (s = image; *s != '\0'; s++) { mpl->context[mpl->c_ptr++] = *s; if (mpl->c_ptr == CONTEXT_SIZE) mpl->c_ptr = 0; } return; } /*---------------------------------------------------------------------- -- print_context - print current content of context queue. -- -- This routine prints current content of the context queue. */ void print_context(MPL *mpl) { int c; while (mpl->c_ptr > 0) { mpl->c_ptr--; c = mpl->context[0]; memmove(mpl->context, mpl->context+1, CONTEXT_SIZE-1); mpl->context[CONTEXT_SIZE-1] = (char)c; } xprintf("Context: %s%.*s\n", mpl->context[0] == ' ' ? "" : "...", CONTEXT_SIZE, mpl->context); return; } /*---------------------------------------------------------------------- -- get_char - scan next character from input text file. -- -- This routine scans a next ASCII character from the input text file. -- In case of end-of-file, the character is assigned EOF. */ void get_char(MPL *mpl) { int c; if (mpl->c == EOF) goto done; if (mpl->c == '\n') mpl->line++; c = read_char(mpl); if (c == EOF) { if (mpl->c == '\n') mpl->line--; else warning(mpl, "final NL missing before end of file"); } else if (c == '\n') ; else if (isspace(c)) c = ' '; else if (iscntrl(c)) { enter_context(mpl); error(mpl, "control character 0x%02X not allowed", c); } mpl->c = c; done: return; } /*---------------------------------------------------------------------- -- append_char - append character to current token. -- -- This routine appends the current character to the current token and -- then scans a next character. */ void append_char(MPL *mpl) { xassert(0 <= mpl->imlen && mpl->imlen <= MAX_LENGTH); if (mpl->imlen == MAX_LENGTH) { switch (mpl->token) { case T_NAME: enter_context(mpl); error(mpl, "symbolic name %s... too long", mpl->image); case T_SYMBOL: enter_context(mpl); error(mpl, "symbol %s... too long", mpl->image); case T_NUMBER: enter_context(mpl); error(mpl, "numeric literal %s... too long", mpl->image); case T_STRING: enter_context(mpl); error(mpl, "string literal too long"); default: xassert(mpl != mpl); } } mpl->image[mpl->imlen++] = (char)mpl->c; mpl->image[mpl->imlen] = '\0'; get_char(mpl); return; } /*---------------------------------------------------------------------- -- get_token - scan next token from input text file. -- -- This routine scans a next token from the input text file using the -- standard finite automation technique. */ void get_token(MPL *mpl) { /* save the current token */ mpl->b_token = mpl->token; mpl->b_imlen = mpl->imlen; strcpy(mpl->b_image, mpl->image); mpl->b_value = mpl->value; /* if the next token is already scanned, make it current */ if (mpl->f_scan) { mpl->f_scan = 0; mpl->token = mpl->f_token; mpl->imlen = mpl->f_imlen; strcpy(mpl->image, mpl->f_image); mpl->value = mpl->f_value; goto done; } loop: /* nothing has been scanned so far */ mpl->token = 0; mpl->imlen = 0; mpl->image[0] = '\0'; mpl->value = 0.0; /* skip any uninteresting characters */ while (mpl->c == ' ' || mpl->c == '\n') get_char(mpl); /* recognize and construct the token */ if (mpl->c == EOF) { /* end-of-file reached */ mpl->token = T_EOF; } else if (mpl->c == '#') { /* comment; skip anything until end-of-line */ while (mpl->c != '\n' && mpl->c != EOF) get_char(mpl); goto loop; } else if (!mpl->flag_d && (isalpha(mpl->c) || mpl->c == '_')) { /* symbolic name or reserved keyword */ mpl->token = T_NAME; while (isalnum(mpl->c) || mpl->c == '_') append_char(mpl); if (strcmp(mpl->image, "and") == 0) mpl->token = T_AND; else if (strcmp(mpl->image, "by") == 0) mpl->token = T_BY; else if (strcmp(mpl->image, "cross") == 0) mpl->token = T_CROSS; else if (strcmp(mpl->image, "diff") == 0) mpl->token = T_DIFF; else if (strcmp(mpl->image, "div") == 0) mpl->token = T_DIV; else if (strcmp(mpl->image, "else") == 0) mpl->token = T_ELSE; else if (strcmp(mpl->image, "if") == 0) mpl->token = T_IF; else if (strcmp(mpl->image, "in") == 0) mpl->token = T_IN; #if 1 /* 21/VII-2006 */ else if (strcmp(mpl->image, "Infinity") == 0) mpl->token = T_INFINITY; #endif else if (strcmp(mpl->image, "inter") == 0) mpl->token = T_INTER; else if (strcmp(mpl->image, "less") == 0) mpl->token = T_LESS; else if (strcmp(mpl->image, "mod") == 0) mpl->token = T_MOD; else if (strcmp(mpl->image, "not") == 0) mpl->token = T_NOT; else if (strcmp(mpl->image, "or") == 0) mpl->token = T_OR; else if (strcmp(mpl->image, "s") == 0 && mpl->c == '.') { mpl->token = T_SPTP; append_char(mpl); if (mpl->c != 't') sptp: { enter_context(mpl); error(mpl, "keyword s.t. incomplete"); } append_char(mpl); if (mpl->c != '.') goto sptp; append_char(mpl); } else if (strcmp(mpl->image, "symdiff") == 0) mpl->token = T_SYMDIFF; else if (strcmp(mpl->image, "then") == 0) mpl->token = T_THEN; else if (strcmp(mpl->image, "union") == 0) mpl->token = T_UNION; else if (strcmp(mpl->image, "within") == 0) mpl->token = T_WITHIN; } else if (!mpl->flag_d && isdigit(mpl->c)) { /* numeric literal */ mpl->token = T_NUMBER; /* scan integer part */ while (isdigit(mpl->c)) append_char(mpl); /* scan optional fractional part */ if (mpl->c == '.') { append_char(mpl); if (mpl->c == '.') { /* hmm, it is not the fractional part, it is dots that follow the integer part */ mpl->imlen--; mpl->image[mpl->imlen] = '\0'; mpl->f_dots = 1; goto conv; } frac: while (isdigit(mpl->c)) append_char(mpl); } /* scan optional decimal exponent */ if (mpl->c == 'e' || mpl->c == 'E') { append_char(mpl); if (mpl->c == '+' || mpl->c == '-') append_char(mpl); if (!isdigit(mpl->c)) { enter_context(mpl); error(mpl, "numeric literal %s incomplete", mpl->image); } while (isdigit(mpl->c)) append_char(mpl); } /* there must be no letter following the numeric literal */ if (isalpha(mpl->c) || mpl->c == '_') { enter_context(mpl); error(mpl, "symbol %s%c... should be enclosed in quotes", mpl->image, mpl->c); } conv: /* convert numeric literal to floating-point */ if (str2num(mpl->image, &mpl->value)) err: { enter_context(mpl); error(mpl, "cannot convert numeric literal %s to floating-p" "oint number", mpl->image); } } else if (mpl->c == '\'' || mpl->c == '"') { /* character string */ int quote = mpl->c; mpl->token = T_STRING; get_char(mpl); for (;;) { if (mpl->c == '\n' || mpl->c == EOF) { enter_context(mpl); error(mpl, "unexpected end of line; string literal incom" "plete"); } if (mpl->c == quote) { get_char(mpl); if (mpl->c != quote) break; } append_char(mpl); } } else if (!mpl->flag_d && mpl->c == '+') mpl->token = T_PLUS, append_char(mpl); else if (!mpl->flag_d && mpl->c == '-') mpl->token = T_MINUS, append_char(mpl); else if (mpl->c == '*') { mpl->token = T_ASTERISK, append_char(mpl); if (mpl->c == '*') mpl->token = T_POWER, append_char(mpl); } else if (mpl->c == '/') { mpl->token = T_SLASH, append_char(mpl); if (mpl->c == '*') { /* comment sequence */ get_char(mpl); for (;;) { if (mpl->c == EOF) { /* do not call enter_context at this point */ error(mpl, "unexpected end of file; comment sequence " "incomplete"); } else if (mpl->c == '*') { get_char(mpl); if (mpl->c == '/') break; } else get_char(mpl); } get_char(mpl); goto loop; } } else if (mpl->c == '^') mpl->token = T_POWER, append_char(mpl); else if (mpl->c == '<') { mpl->token = T_LT, append_char(mpl); if (mpl->c == '=') mpl->token = T_LE, append_char(mpl); else if (mpl->c == '>') mpl->token = T_NE, append_char(mpl); #if 1 /* 11/II-2008 */ else if (mpl->c == '-') mpl->token = T_INPUT, append_char(mpl); #endif } else if (mpl->c == '=') { mpl->token = T_EQ, append_char(mpl); if (mpl->c == '=') append_char(mpl); } else if (mpl->c == '>') { mpl->token = T_GT, append_char(mpl); if (mpl->c == '=') mpl->token = T_GE, append_char(mpl); #if 1 /* 14/VII-2006 */ else if (mpl->c == '>') mpl->token = T_APPEND, append_char(mpl); #endif } else if (mpl->c == '!') { mpl->token = T_NOT, append_char(mpl); if (mpl->c == '=') mpl->token = T_NE, append_char(mpl); } else if (mpl->c == '&') { mpl->token = T_CONCAT, append_char(mpl); if (mpl->c == '&') mpl->token = T_AND, append_char(mpl); } else if (mpl->c == '|') { mpl->token = T_BAR, append_char(mpl); if (mpl->c == '|') mpl->token = T_OR, append_char(mpl); } else if (!mpl->flag_d && mpl->c == '.') { mpl->token = T_POINT, append_char(mpl); if (mpl->f_dots) { /* dots; the first dot was read on the previous call to the scanner, so the current character is the second dot */ mpl->token = T_DOTS; mpl->imlen = 2; strcpy(mpl->image, ".."); mpl->f_dots = 0; } else if (mpl->c == '.') mpl->token = T_DOTS, append_char(mpl); else if (isdigit(mpl->c)) { /* numeric literal that begins with the decimal point */ mpl->token = T_NUMBER, append_char(mpl); goto frac; } } else if (mpl->c == ',') mpl->token = T_COMMA, append_char(mpl); else if (mpl->c == ':') { mpl->token = T_COLON, append_char(mpl); if (mpl->c == '=') mpl->token = T_ASSIGN, append_char(mpl); } else if (mpl->c == ';') mpl->token = T_SEMICOLON, append_char(mpl); else if (mpl->c == '(') mpl->token = T_LEFT, append_char(mpl); else if (mpl->c == ')') mpl->token = T_RIGHT, append_char(mpl); else if (mpl->c == '[') mpl->token = T_LBRACKET, append_char(mpl); else if (mpl->c == ']') mpl->token = T_RBRACKET, append_char(mpl); else if (mpl->c == '{') mpl->token = T_LBRACE, append_char(mpl); else if (mpl->c == '}') mpl->token = T_RBRACE, append_char(mpl); #if 1 /* 11/II-2008 */ else if (mpl->c == '~') mpl->token = T_TILDE, append_char(mpl); #endif else if (isalnum(mpl->c) || strchr("+-._", mpl->c) != NULL) { /* symbol */ xassert(mpl->flag_d); mpl->token = T_SYMBOL; while (isalnum(mpl->c) || strchr("+-._", mpl->c) != NULL) append_char(mpl); switch (str2num(mpl->image, &mpl->value)) { case 0: mpl->token = T_NUMBER; break; case 1: goto err; case 2: break; default: xassert(mpl != mpl); } } else { enter_context(mpl); error(mpl, "character %c not allowed", mpl->c); } /* enter the current token into the context queue */ enter_context(mpl); /* reset the flag, which may be set by indexing_expression() and is used by expression_list() */ mpl->flag_x = 0; done: return; } /*---------------------------------------------------------------------- -- unget_token - return current token back to input stream. -- -- This routine returns the current token back to the input stream, so -- the previously scanned token becomes the current one. */ void unget_token(MPL *mpl) { /* save the current token, which becomes the next one */ xassert(!mpl->f_scan); mpl->f_scan = 1; mpl->f_token = mpl->token; mpl->f_imlen = mpl->imlen; strcpy(mpl->f_image, mpl->image); mpl->f_value = mpl->value; /* restore the previous token, which becomes the current one */ mpl->token = mpl->b_token; mpl->imlen = mpl->b_imlen; strcpy(mpl->image, mpl->b_image); mpl->value = mpl->b_value; return; } /*---------------------------------------------------------------------- -- is_keyword - check if current token is given non-reserved keyword. -- -- If the current token is given (non-reserved) keyword, this routine -- returns non-zero. Otherwise zero is returned. */ int is_keyword(MPL *mpl, char *keyword) { return mpl->token == T_NAME && strcmp(mpl->image, keyword) == 0; } /*---------------------------------------------------------------------- -- is_reserved - check if current token is reserved keyword. -- -- If the current token is a reserved keyword, this routine returns -- non-zero. Otherwise zero is returned. */ int is_reserved(MPL *mpl) { return mpl->token == T_AND && mpl->image[0] == 'a' || mpl->token == T_BY || mpl->token == T_CROSS || mpl->token == T_DIFF || mpl->token == T_DIV || mpl->token == T_ELSE || mpl->token == T_IF || mpl->token == T_IN || mpl->token == T_INTER || mpl->token == T_LESS || mpl->token == T_MOD || mpl->token == T_NOT && mpl->image[0] == 'n' || mpl->token == T_OR && mpl->image[0] == 'o' || mpl->token == T_SYMDIFF || mpl->token == T_THEN || mpl->token == T_UNION || mpl->token == T_WITHIN; } /*---------------------------------------------------------------------- -- make_code - generate pseudo-code (basic routine). -- -- This routine generates specified pseudo-code. It is assumed that all -- other translator routines use this basic routine. */ CODE *make_code(MPL *mpl, int op, OPERANDS *arg, int type, int dim) { CODE *code; DOMAIN *domain; DOMAIN_BLOCK *block; ARG_LIST *e; /* generate pseudo-code */ code = alloc(CODE); code->op = op; code->vflag = 0; /* is inherited from operand(s) */ /* copy operands and also make them referring to the pseudo-code being generated, because the latter becomes the parent for all its operands */ memset(&code->arg, '?', sizeof(OPERANDS)); switch (op) { case O_NUMBER: code->arg.num = arg->num; break; case O_STRING: code->arg.str = arg->str; break; case O_INDEX: code->arg.index.slot = arg->index.slot; code->arg.index.next = arg->index.next; break; case O_MEMNUM: case O_MEMSYM: for (e = arg->par.list; e != NULL; e = e->next) { xassert(e->x != NULL); xassert(e->x->up == NULL); e->x->up = code; code->vflag |= e->x->vflag; } code->arg.par.par = arg->par.par; code->arg.par.list = arg->par.list; break; case O_MEMSET: for (e = arg->set.list; e != NULL; e = e->next) { xassert(e->x != NULL); xassert(e->x->up == NULL); e->x->up = code; code->vflag |= e->x->vflag; } code->arg.set.set = arg->set.set; code->arg.set.list = arg->set.list; break; case O_MEMVAR: for (e = arg->var.list; e != NULL; e = e->next) { xassert(e->x != NULL); xassert(e->x->up == NULL); e->x->up = code; code->vflag |= e->x->vflag; } code->arg.var.var = arg->var.var; code->arg.var.list = arg->var.list; #if 1 /* 15/V-2010 */ code->arg.var.suff = arg->var.suff; #endif break; #if 1 /* 15/V-2010 */ case O_MEMCON: for (e = arg->con.list; e != NULL; e = e->next) { xassert(e->x != NULL); xassert(e->x->up == NULL); e->x->up = code; code->vflag |= e->x->vflag; } code->arg.con.con = arg->con.con; code->arg.con.list = arg->con.list; code->arg.con.suff = arg->con.suff; break; #endif case O_TUPLE: case O_MAKE: for (e = arg->list; e != NULL; e = e->next) { xassert(e->x != NULL); xassert(e->x->up == NULL); e->x->up = code; code->vflag |= e->x->vflag; } code->arg.list = arg->list; break; case O_SLICE: xassert(arg->slice != NULL); code->arg.slice = arg->slice; break; case O_IRAND224: case O_UNIFORM01: case O_NORMAL01: case O_GMTIME: code->vflag = 1; break; case O_CVTNUM: case O_CVTSYM: case O_CVTLOG: case O_CVTTUP: case O_CVTLFM: case O_PLUS: case O_MINUS: case O_NOT: case O_ABS: case O_CEIL: case O_FLOOR: case O_EXP: case O_LOG: case O_LOG10: case O_SQRT: case O_SIN: case O_COS: case O_TAN: case O_ATAN: case O_ROUND: case O_TRUNC: case O_CARD: case O_LENGTH: /* unary operation */ xassert(arg->arg.x != NULL); xassert(arg->arg.x->up == NULL); arg->arg.x->up = code; code->vflag |= arg->arg.x->vflag; code->arg.arg.x = arg->arg.x; break; case O_ADD: case O_SUB: case O_LESS: case O_MUL: case O_DIV: case O_IDIV: case O_MOD: case O_POWER: case O_ATAN2: case O_ROUND2: case O_TRUNC2: case O_UNIFORM: if (op == O_UNIFORM) code->vflag = 1; case O_NORMAL: if (op == O_NORMAL) code->vflag = 1; case O_CONCAT: case O_LT: case O_LE: case O_EQ: case O_GE: case O_GT: case O_NE: case O_AND: case O_OR: case O_UNION: case O_DIFF: case O_SYMDIFF: case O_INTER: case O_CROSS: case O_IN: case O_NOTIN: case O_WITHIN: case O_NOTWITHIN: case O_SUBSTR: case O_STR2TIME: case O_TIME2STR: /* binary operation */ xassert(arg->arg.x != NULL); xassert(arg->arg.x->up == NULL); arg->arg.x->up = code; code->vflag |= arg->arg.x->vflag; xassert(arg->arg.y != NULL); xassert(arg->arg.y->up == NULL); arg->arg.y->up = code; code->vflag |= arg->arg.y->vflag; code->arg.arg.x = arg->arg.x; code->arg.arg.y = arg->arg.y; break; case O_DOTS: case O_FORK: case O_SUBSTR3: /* ternary operation */ xassert(arg->arg.x != NULL); xassert(arg->arg.x->up == NULL); arg->arg.x->up = code; code->vflag |= arg->arg.x->vflag; xassert(arg->arg.y != NULL); xassert(arg->arg.y->up == NULL); arg->arg.y->up = code; code->vflag |= arg->arg.y->vflag; if (arg->arg.z != NULL) { xassert(arg->arg.z->up == NULL); arg->arg.z->up = code; code->vflag |= arg->arg.z->vflag; } code->arg.arg.x = arg->arg.x; code->arg.arg.y = arg->arg.y; code->arg.arg.z = arg->arg.z; break; case O_MIN: case O_MAX: /* n-ary operation */ for (e = arg->list; e != NULL; e = e->next) { xassert(e->x != NULL); xassert(e->x->up == NULL); e->x->up = code; code->vflag |= e->x->vflag; } code->arg.list = arg->list; break; case O_SUM: case O_PROD: case O_MINIMUM: case O_MAXIMUM: case O_FORALL: case O_EXISTS: case O_SETOF: case O_BUILD: /* iterated operation */ domain = arg->loop.domain; xassert(domain != NULL); if (domain->code != NULL) { xassert(domain->code->up == NULL); domain->code->up = code; code->vflag |= domain->code->vflag; } for (block = domain->list; block != NULL; block = block->next) { xassert(block->code != NULL); xassert(block->code->up == NULL); block->code->up = code; code->vflag |= block->code->vflag; } if (arg->loop.x != NULL) { xassert(arg->loop.x->up == NULL); arg->loop.x->up = code; code->vflag |= arg->loop.x->vflag; } code->arg.loop.domain = arg->loop.domain; code->arg.loop.x = arg->loop.x; break; default: xassert(op != op); } /* set other attributes of the pseudo-code */ code->type = type; code->dim = dim; code->up = NULL; code->valid = 0; memset(&code->value, '?', sizeof(VALUE)); return code; } /*---------------------------------------------------------------------- -- make_unary - generate pseudo-code for unary operation. -- -- This routine generates pseudo-code for unary operation. */ CODE *make_unary(MPL *mpl, int op, CODE *x, int type, int dim) { CODE *code; OPERANDS arg; xassert(x != NULL); arg.arg.x = x; code = make_code(mpl, op, &arg, type, dim); return code; } /*---------------------------------------------------------------------- -- make_binary - generate pseudo-code for binary operation. -- -- This routine generates pseudo-code for binary operation. */ CODE *make_binary(MPL *mpl, int op, CODE *x, CODE *y, int type, int dim) { CODE *code; OPERANDS arg; xassert(x != NULL); xassert(y != NULL); arg.arg.x = x; arg.arg.y = y; code = make_code(mpl, op, &arg, type, dim); return code; } /*---------------------------------------------------------------------- -- make_ternary - generate pseudo-code for ternary operation. -- -- This routine generates pseudo-code for ternary operation. */ CODE *make_ternary(MPL *mpl, int op, CODE *x, CODE *y, CODE *z, int type, int dim) { CODE *code; OPERANDS arg; xassert(x != NULL); xassert(y != NULL); /* third operand can be NULL */ arg.arg.x = x; arg.arg.y = y; arg.arg.z = z; code = make_code(mpl, op, &arg, type, dim); return code; } /*---------------------------------------------------------------------- -- numeric_literal - parse reference to numeric literal. -- -- This routine parses primary expression using the syntax: -- -- ::= */ CODE *numeric_literal(MPL *mpl) { CODE *code; OPERANDS arg; xassert(mpl->token == T_NUMBER); arg.num = mpl->value; code = make_code(mpl, O_NUMBER, &arg, A_NUMERIC, 0); get_token(mpl /* */); return code; } /*---------------------------------------------------------------------- -- string_literal - parse reference to string literal. -- -- This routine parses primary expression using the syntax: -- -- ::= */ CODE *string_literal(MPL *mpl) { CODE *code; OPERANDS arg; xassert(mpl->token == T_STRING); arg.str = dmp_get_atomv(mpl->pool, strlen(mpl->image)+1); strcpy(arg.str, mpl->image); code = make_code(mpl, O_STRING, &arg, A_SYMBOLIC, 0); get_token(mpl /* */); return code; } /*---------------------------------------------------------------------- -- create_arg_list - create empty operands list. -- -- This routine creates operands list, which is initially empty. */ ARG_LIST *create_arg_list(MPL *mpl) { ARG_LIST *list; xassert(mpl == mpl); list = NULL; return list; } /*---------------------------------------------------------------------- -- expand_arg_list - append operand to operands list. -- -- This routine appends new operand to specified operands list. */ ARG_LIST *expand_arg_list(MPL *mpl, ARG_LIST *list, CODE *x) { ARG_LIST *tail, *temp; xassert(x != NULL); /* create new operands list entry */ tail = alloc(ARG_LIST); tail->x = x; tail->next = NULL; /* and append it to the operands list */ if (list == NULL) list = tail; else { for (temp = list; temp->next != NULL; temp = temp->next); temp->next = tail; } return list; } /*---------------------------------------------------------------------- -- arg_list_len - determine length of operands list. -- -- This routine returns the number of operands in operands list. */ int arg_list_len(MPL *mpl, ARG_LIST *list) { ARG_LIST *temp; int len; xassert(mpl == mpl); len = 0; for (temp = list; temp != NULL; temp = temp->next) len++; return len; } /*---------------------------------------------------------------------- -- subscript_list - parse subscript list. -- -- This routine parses subscript list using the syntax: -- -- ::= -- ::= , -- ::= */ ARG_LIST *subscript_list(MPL *mpl) { ARG_LIST *list; CODE *x; list = create_arg_list(mpl); for (;;) { /* parse subscript expression */ x = expression_5(mpl); /* convert it to symbolic type, if necessary */ if (x->type == A_NUMERIC) x = make_unary(mpl, O_CVTSYM, x, A_SYMBOLIC, 0); /* check that now the expression is of symbolic type */ if (x->type != A_SYMBOLIC) error(mpl, "subscript expression has invalid type"); xassert(x->dim == 0); /* and append it to the subscript list */ list = expand_arg_list(mpl, list, x); /* check a token that follows the subscript expression */ if (mpl->token == T_COMMA) get_token(mpl /* , */); else if (mpl->token == T_RBRACKET) break; else error(mpl, "syntax error in subscript list"); } return list; } #if 1 /* 15/V-2010 */ /*---------------------------------------------------------------------- -- object_reference - parse reference to named object. -- -- This routine parses primary expression using the syntax: -- -- ::= -- ::= -- ::= [ ] -- ::= -- ::= [ ] -- ::= -- ::= [ ] -- -- ::= -- ::= [ ] -- -- ::= -- ::= -- ::= -- ::= -- ::= -- ::= | .lb | .ub | .status | .val | .dual */ CODE *object_reference(MPL *mpl) { AVLNODE *node; DOMAIN_SLOT *slot; SET *set; PARAMETER *par; VARIABLE *var; CONSTRAINT *con; ARG_LIST *list; OPERANDS arg; CODE *code; char *name; int dim, suff; /* find the object in the symbolic name table */ xassert(mpl->token == T_NAME); node = avl_find_node(mpl->tree, mpl->image); if (node == NULL) error(mpl, "%s not defined", mpl->image); /* check the object type and obtain its dimension */ switch (avl_get_node_type(node)) { case A_INDEX: /* dummy index */ slot = (DOMAIN_SLOT *)avl_get_node_link(node); name = slot->name; dim = 0; break; case A_SET: /* model set */ set = (SET *)avl_get_node_link(node); name = set->name; dim = set->dim; /* if a set object is referenced in its own declaration and the dimen attribute is not specified yet, use dimen 1 by default */ if (set->dimen == 0) set->dimen = 1; break; case A_PARAMETER: /* model parameter */ par = (PARAMETER *)avl_get_node_link(node); name = par->name; dim = par->dim; break; case A_VARIABLE: /* model variable */ var = (VARIABLE *)avl_get_node_link(node); name = var->name; dim = var->dim; break; case A_CONSTRAINT: /* model constraint or objective */ con = (CONSTRAINT *)avl_get_node_link(node); name = con->name; dim = con->dim; break; default: xassert(node != node); } get_token(mpl /* */); /* parse optional subscript list */ if (mpl->token == T_LBRACKET) { /* subscript list is specified */ if (dim == 0) error(mpl, "%s cannot be subscripted", name); get_token(mpl /* [ */); list = subscript_list(mpl); if (dim != arg_list_len(mpl, list)) error(mpl, "%s must have %d subscript%s rather than %d", name, dim, dim == 1 ? "" : "s", arg_list_len(mpl, list)); xassert(mpl->token == T_RBRACKET); get_token(mpl /* ] */); } else { /* subscript list is not specified */ if (dim != 0) error(mpl, "%s must be subscripted", name); list = create_arg_list(mpl); } /* parse optional suffix */ if (!mpl->flag_s && avl_get_node_type(node) == A_VARIABLE) suff = DOT_NONE; else suff = DOT_VAL; if (mpl->token == T_POINT) { get_token(mpl /* . */); if (mpl->token != T_NAME) error(mpl, "invalid use of period"); if (!(avl_get_node_type(node) == A_VARIABLE || avl_get_node_type(node) == A_CONSTRAINT)) error(mpl, "%s cannot have a suffix", name); if (strcmp(mpl->image, "lb") == 0) suff = DOT_LB; else if (strcmp(mpl->image, "ub") == 0) suff = DOT_UB; else if (strcmp(mpl->image, "status") == 0) suff = DOT_STATUS; else if (strcmp(mpl->image, "val") == 0) suff = DOT_VAL; else if (strcmp(mpl->image, "dual") == 0) suff = DOT_DUAL; else error(mpl, "suffix .%s invalid", mpl->image); get_token(mpl /* suffix */); } /* generate pseudo-code to take value of the object */ switch (avl_get_node_type(node)) { case A_INDEX: arg.index.slot = slot; arg.index.next = slot->list; code = make_code(mpl, O_INDEX, &arg, A_SYMBOLIC, 0); slot->list = code; break; case A_SET: arg.set.set = set; arg.set.list = list; code = make_code(mpl, O_MEMSET, &arg, A_ELEMSET, set->dimen); break; case A_PARAMETER: arg.par.par = par; arg.par.list = list; if (par->type == A_SYMBOLIC) code = make_code(mpl, O_MEMSYM, &arg, A_SYMBOLIC, 0); else code = make_code(mpl, O_MEMNUM, &arg, A_NUMERIC, 0); break; case A_VARIABLE: if (!mpl->flag_s && (suff == DOT_STATUS || suff == DOT_VAL || suff == DOT_DUAL)) error(mpl, "invalid reference to status, primal value, o" "r dual value of variable %s above solve statement", var->name); arg.var.var = var; arg.var.list = list; arg.var.suff = suff; code = make_code(mpl, O_MEMVAR, &arg, suff == DOT_NONE ? A_FORMULA : A_NUMERIC, 0); break; case A_CONSTRAINT: if (!mpl->flag_s && (suff == DOT_STATUS || suff == DOT_VAL || suff == DOT_DUAL)) error(mpl, "invalid reference to status, primal value, o" "r dual value of %s %s above solve statement", con->type == A_CONSTRAINT ? "constraint" : "objective" , con->name); arg.con.con = con; arg.con.list = list; arg.con.suff = suff; code = make_code(mpl, O_MEMCON, &arg, A_NUMERIC, 0); break; default: xassert(node != node); } return code; } #endif /*---------------------------------------------------------------------- -- numeric_argument - parse argument passed to built-in function. -- -- This routine parses an argument passed to numeric built-in function -- using the syntax: -- -- ::= */ CODE *numeric_argument(MPL *mpl, char *func) { CODE *x; x = expression_5(mpl); /* convert the argument to numeric type, if necessary */ if (x->type == A_SYMBOLIC) x = make_unary(mpl, O_CVTNUM, x, A_NUMERIC, 0); /* check that now the argument is of numeric type */ if (x->type != A_NUMERIC) error(mpl, "argument for %s has invalid type", func); xassert(x->dim == 0); return x; } #if 1 /* 15/VII-2006 */ CODE *symbolic_argument(MPL *mpl, char *func) { CODE *x; x = expression_5(mpl); /* convert the argument to symbolic type, if necessary */ if (x->type == A_NUMERIC) x = make_unary(mpl, O_CVTSYM, x, A_SYMBOLIC, 0); /* check that now the argument is of symbolic type */ if (x->type != A_SYMBOLIC) error(mpl, "argument for %s has invalid type", func); xassert(x->dim == 0); return x; } #endif #if 1 /* 15/VII-2006 */ CODE *elemset_argument(MPL *mpl, char *func) { CODE *x; x = expression_9(mpl); if (x->type != A_ELEMSET) error(mpl, "argument for %s has invalid type", func); xassert(x->dim > 0); return x; } #endif /*---------------------------------------------------------------------- -- function_reference - parse reference to built-in function. -- -- This routine parses primary expression using the syntax: -- -- ::= abs ( ) -- ::= ceil ( ) -- ::= floor ( ) -- ::= exp ( ) -- ::= log ( ) -- ::= log10 ( ) -- ::= max ( ) -- ::= min ( ) -- ::= sqrt ( ) -- ::= sin ( ) -- ::= cos ( ) -- ::= tan ( ) -- ::= atan ( ) -- ::= atan2 ( , ) -- ::= round ( ) -- ::= round ( , ) -- ::= trunc ( ) -- ::= trunc ( , ) -- ::= Irand224 ( ) -- ::= Uniform01 ( ) -- ::= Uniform ( , ) -- ::= Normal01 ( ) -- ::= Normal ( , ) -- ::= card ( ) -- ::= length ( ) -- ::= substr ( , ) -- ::= substr ( , , ) -- ::= str2time ( , ) -- ::= time2str ( , ) -- ::= gmtime ( ) -- ::= -- ::= , */ CODE *function_reference(MPL *mpl) { CODE *code; OPERANDS arg; int op; char func[15+1]; /* determine operation code */ xassert(mpl->token == T_NAME); if (strcmp(mpl->image, "abs") == 0) op = O_ABS; else if (strcmp(mpl->image, "ceil") == 0) op = O_CEIL; else if (strcmp(mpl->image, "floor") == 0) op = O_FLOOR; else if (strcmp(mpl->image, "exp") == 0) op = O_EXP; else if (strcmp(mpl->image, "log") == 0) op = O_LOG; else if (strcmp(mpl->image, "log10") == 0) op = O_LOG10; else if (strcmp(mpl->image, "sqrt") == 0) op = O_SQRT; else if (strcmp(mpl->image, "sin") == 0) op = O_SIN; else if (strcmp(mpl->image, "cos") == 0) op = O_COS; else if (strcmp(mpl->image, "tan") == 0) op = O_TAN; else if (strcmp(mpl->image, "atan") == 0) op = O_ATAN; else if (strcmp(mpl->image, "min") == 0) op = O_MIN; else if (strcmp(mpl->image, "max") == 0) op = O_MAX; else if (strcmp(mpl->image, "round") == 0) op = O_ROUND; else if (strcmp(mpl->image, "trunc") == 0) op = O_TRUNC; else if (strcmp(mpl->image, "Irand224") == 0) op = O_IRAND224; else if (strcmp(mpl->image, "Uniform01") == 0) op = O_UNIFORM01; else if (strcmp(mpl->image, "Uniform") == 0) op = O_UNIFORM; else if (strcmp(mpl->image, "Normal01") == 0) op = O_NORMAL01; else if (strcmp(mpl->image, "Normal") == 0) op = O_NORMAL; else if (strcmp(mpl->image, "card") == 0) op = O_CARD; else if (strcmp(mpl->image, "length") == 0) op = O_LENGTH; else if (strcmp(mpl->image, "substr") == 0) op = O_SUBSTR; else if (strcmp(mpl->image, "str2time") == 0) op = O_STR2TIME; else if (strcmp(mpl->image, "time2str") == 0) op = O_TIME2STR; else if (strcmp(mpl->image, "gmtime") == 0) op = O_GMTIME; else error(mpl, "function %s unknown", mpl->image); /* save symbolic name of the function */ strcpy(func, mpl->image); xassert(strlen(func) < sizeof(func)); get_token(mpl /* */); /* check the left parenthesis that follows the function name */ xassert(mpl->token == T_LEFT); get_token(mpl /* ( */); /* parse argument list */ if (op == O_MIN || op == O_MAX) { /* min and max allow arbitrary number of arguments */ arg.list = create_arg_list(mpl); /* parse argument list */ for (;;) { /* parse argument and append it to the operands list */ arg.list = expand_arg_list(mpl, arg.list, numeric_argument(mpl, func)); /* check a token that follows the argument */ if (mpl->token == T_COMMA) get_token(mpl /* , */); else if (mpl->token == T_RIGHT) break; else error(mpl, "syntax error in argument list for %s", func); } } else if (op == O_IRAND224 || op == O_UNIFORM01 || op == O_NORMAL01 || op == O_GMTIME) { /* Irand224, Uniform01, Normal01, gmtime need no arguments */ if (mpl->token != T_RIGHT) error(mpl, "%s needs no arguments", func); } else if (op == O_UNIFORM || op == O_NORMAL) { /* Uniform and Normal need two arguments */ /* parse the first argument */ arg.arg.x = numeric_argument(mpl, func); /* check a token that follows the first argument */ if (mpl->token == T_COMMA) ; else if (mpl->token == T_RIGHT) error(mpl, "%s needs two arguments", func); else error(mpl, "syntax error in argument for %s", func); get_token(mpl /* , */); /* parse the second argument */ arg.arg.y = numeric_argument(mpl, func); /* check a token that follows the second argument */ if (mpl->token == T_COMMA) error(mpl, "%s needs two argument", func); else if (mpl->token == T_RIGHT) ; else error(mpl, "syntax error in argument for %s", func); } else if (op == O_ATAN || op == O_ROUND || op == O_TRUNC) { /* atan, round, and trunc need one or two arguments */ /* parse the first argument */ arg.arg.x = numeric_argument(mpl, func); /* parse the second argument, if specified */ if (mpl->token == T_COMMA) { switch (op) { case O_ATAN: op = O_ATAN2; break; case O_ROUND: op = O_ROUND2; break; case O_TRUNC: op = O_TRUNC2; break; default: xassert(op != op); } get_token(mpl /* , */); arg.arg.y = numeric_argument(mpl, func); } /* check a token that follows the last argument */ if (mpl->token == T_COMMA) error(mpl, "%s needs one or two arguments", func); else if (mpl->token == T_RIGHT) ; else error(mpl, "syntax error in argument for %s", func); } else if (op == O_SUBSTR) { /* substr needs two or three arguments */ /* parse the first argument */ arg.arg.x = symbolic_argument(mpl, func); /* check a token that follows the first argument */ if (mpl->token == T_COMMA) ; else if (mpl->token == T_RIGHT) error(mpl, "%s needs two or three arguments", func); else error(mpl, "syntax error in argument for %s", func); get_token(mpl /* , */); /* parse the second argument */ arg.arg.y = numeric_argument(mpl, func); /* parse the third argument, if specified */ if (mpl->token == T_COMMA) { op = O_SUBSTR3; get_token(mpl /* , */); arg.arg.z = numeric_argument(mpl, func); } /* check a token that follows the last argument */ if (mpl->token == T_COMMA) error(mpl, "%s needs two or three arguments", func); else if (mpl->token == T_RIGHT) ; else error(mpl, "syntax error in argument for %s", func); } else if (op == O_STR2TIME) { /* str2time needs two arguments, both symbolic */ /* parse the first argument */ arg.arg.x = symbolic_argument(mpl, func); /* check a token that follows the first argument */ if (mpl->token == T_COMMA) ; else if (mpl->token == T_RIGHT) error(mpl, "%s needs two arguments", func); else error(mpl, "syntax error in argument for %s", func); get_token(mpl /* , */); /* parse the second argument */ arg.arg.y = symbolic_argument(mpl, func); /* check a token that follows the second argument */ if (mpl->token == T_COMMA) error(mpl, "%s needs two argument", func); else if (mpl->token == T_RIGHT) ; else error(mpl, "syntax error in argument for %s", func); } else if (op == O_TIME2STR) { /* time2str needs two arguments, numeric and symbolic */ /* parse the first argument */ arg.arg.x = numeric_argument(mpl, func); /* check a token that follows the first argument */ if (mpl->token == T_COMMA) ; else if (mpl->token == T_RIGHT) error(mpl, "%s needs two arguments", func); else error(mpl, "syntax error in argument for %s", func); get_token(mpl /* , */); /* parse the second argument */ arg.arg.y = symbolic_argument(mpl, func); /* check a token that follows the second argument */ if (mpl->token == T_COMMA) error(mpl, "%s needs two argument", func); else if (mpl->token == T_RIGHT) ; else error(mpl, "syntax error in argument for %s", func); } else { /* other functions need one argument */ if (op == O_CARD) arg.arg.x = elemset_argument(mpl, func); else if (op == O_LENGTH) arg.arg.x = symbolic_argument(mpl, func); else arg.arg.x = numeric_argument(mpl, func); /* check a token that follows the argument */ if (mpl->token == T_COMMA) error(mpl, "%s needs one argument", func); else if (mpl->token == T_RIGHT) ; else error(mpl, "syntax error in argument for %s", func); } /* make pseudo-code to call the built-in function */ if (op == O_SUBSTR || op == O_SUBSTR3 || op == O_TIME2STR) code = make_code(mpl, op, &arg, A_SYMBOLIC, 0); else code = make_code(mpl, op, &arg, A_NUMERIC, 0); /* the reference ends with the right parenthesis */ xassert(mpl->token == T_RIGHT); get_token(mpl /* ) */); return code; } /*---------------------------------------------------------------------- -- create_domain - create empty domain. -- -- This routine creates empty domain, which is initially empty, i.e. -- has no domain blocks. */ DOMAIN *create_domain(MPL *mpl) { DOMAIN *domain; domain = alloc(DOMAIN); domain->list = NULL; domain->code = NULL; return domain; } /*---------------------------------------------------------------------- -- create_block - create empty domain block. -- -- This routine creates empty domain block, which is initially empty, -- i.e. has no domain slots. */ DOMAIN_BLOCK *create_block(MPL *mpl) { DOMAIN_BLOCK *block; block = alloc(DOMAIN_BLOCK); block->list = NULL; block->code = NULL; block->backup = NULL; block->next = NULL; return block; } /*---------------------------------------------------------------------- -- append_block - append domain block to specified domain. -- -- This routine adds given domain block to the end of the block list of -- specified domain. */ void append_block(MPL *mpl, DOMAIN *domain, DOMAIN_BLOCK *block) { DOMAIN_BLOCK *temp; xassert(mpl == mpl); xassert(domain != NULL); xassert(block != NULL); xassert(block->next == NULL); if (domain->list == NULL) domain->list = block; else { for (temp = domain->list; temp->next != NULL; temp = temp->next); temp->next = block; } return; } /*---------------------------------------------------------------------- -- append_slot - create and append new slot to domain block. -- -- This routine creates new domain slot and adds it to the end of slot -- list of specified domain block. -- -- The parameter name is symbolic name of the dummy index associated -- with the slot (the character string must be allocated). NULL means -- the dummy index is not explicitly specified. -- -- The parameter code is pseudo-code for computing symbolic value, at -- which the dummy index is bounded. NULL means the dummy index is free -- in the domain scope. */ DOMAIN_SLOT *append_slot(MPL *mpl, DOMAIN_BLOCK *block, char *name, CODE *code) { DOMAIN_SLOT *slot, *temp; xassert(block != NULL); slot = alloc(DOMAIN_SLOT); slot->name = name; slot->code = code; slot->value = NULL; slot->list = NULL; slot->next = NULL; if (block->list == NULL) block->list = slot; else { for (temp = block->list; temp->next != NULL; temp = temp->next); temp->next = slot; } return slot; } /*---------------------------------------------------------------------- -- expression_list - parse expression list. -- -- This routine parses a list of one or more expressions enclosed into -- the parentheses using the syntax: -- -- ::= ( ) -- ::= -- ::= , -- -- Note that this construction may have three different meanings: -- -- 1. If consists of only one expression, is a parenthesized expression, which may be of any -- valid type (not necessarily 1-tuple). -- -- 2. If consists of several expressions separated by -- commae, where no expression is undeclared symbolic name, is a n-tuple. -- -- 3. If consists of several expressions separated by -- commae, where at least one expression is undeclared symbolic name -- (that denotes a dummy index), is a slice and -- can be only used as constituent of indexing expression. */ #define max_dim 20 /* maximal number of components allowed within parentheses */ CODE *expression_list(MPL *mpl) { CODE *code; OPERANDS arg; struct { char *name; CODE *code; } list[1+max_dim]; int flag_x, next_token, dim, j, slice = 0; xassert(mpl->token == T_LEFT); /* the flag, which allows recognizing undeclared symbolic names as dummy indices, will be automatically reset by get_token(), so save it before scanning the next token */ flag_x = mpl->flag_x; get_token(mpl /* ( */); /* parse */ for (dim = 1; ; dim++) { if (dim > max_dim) error(mpl, "too many components within parentheses"); /* current component of can be either dummy index or expression */ if (mpl->token == T_NAME) { /* symbolic name is recognized as dummy index only if: the flag, which allows that, is set, and the name is followed by comma or right parenthesis, and the name is undeclared */ get_token(mpl /* */); next_token = mpl->token; unget_token(mpl); if (!(flag_x && (next_token == T_COMMA || next_token == T_RIGHT) && avl_find_node(mpl->tree, mpl->image) == NULL)) { /* this is not dummy index */ goto expr; } /* all dummy indices within the same slice must have unique symbolic names */ for (j = 1; j < dim; j++) { if (list[j].name != NULL && strcmp(list[j].name, mpl->image) == 0) error(mpl, "duplicate dummy index %s not allowed", mpl->image); } /* current component of is dummy index */ list[dim].name = dmp_get_atomv(mpl->pool, strlen(mpl->image)+1); strcpy(list[dim].name, mpl->image); list[dim].code = NULL; get_token(mpl /* */); /* is a slice, because at least one dummy index has appeared */ slice = 1; /* note that the context ( ) is not allowed, i.e. in this case is considered as a parenthesized expression */ if (dim == 1 && mpl->token == T_RIGHT) error(mpl, "%s not defined", list[dim].name); } else expr: { /* current component of is expression */ code = expression_13(mpl); /* if the current expression is followed by comma or it is not the very first expression, entire is n-tuple or slice, in which case the current expression should be converted to symbolic type, if necessary */ if (mpl->token == T_COMMA || dim > 1) { if (code->type == A_NUMERIC) code = make_unary(mpl, O_CVTSYM, code, A_SYMBOLIC, 0); /* now the expression must be of symbolic type */ if (code->type != A_SYMBOLIC) error(mpl, "component expression has invalid type"); xassert(code->dim == 0); } list[dim].name = NULL; list[dim].code = code; } /* check a token that follows the current component */ if (mpl->token == T_COMMA) get_token(mpl /* , */); else if (mpl->token == T_RIGHT) break; else error(mpl, "right parenthesis missing where expected"); } /* generate pseudo-code for */ if (dim == 1 && !slice) { /* is a parenthesized expression */ code = list[1].code; } else if (!slice) { /* is a n-tuple */ arg.list = create_arg_list(mpl); for (j = 1; j <= dim; j++) arg.list = expand_arg_list(mpl, arg.list, list[j].code); code = make_code(mpl, O_TUPLE, &arg, A_TUPLE, dim); } else { /* is a slice */ arg.slice = create_block(mpl); for (j = 1; j <= dim; j++) append_slot(mpl, arg.slice, list[j].name, list[j].code); /* note that actually pseudo-codes with op = O_SLICE are never evaluated */ code = make_code(mpl, O_SLICE, &arg, A_TUPLE, dim); } get_token(mpl /* ) */); /* if is a slice, there must be the keyword 'in', which follows the right parenthesis */ if (slice && mpl->token != T_IN) error(mpl, "keyword in missing where expected"); /* if the slice flag is set and there is the keyword 'in', which follows , the latter must be a slice */ if (flag_x && mpl->token == T_IN && !slice) { if (dim == 1) error(mpl, "syntax error in indexing expression"); else error(mpl, "0-ary slice not allowed"); } return code; } /*---------------------------------------------------------------------- -- literal set - parse literal set. -- -- This routine parses literal set using the syntax: -- -- ::= { } -- ::= -- ::= , -- ::= -- -- It is assumed that the left curly brace and the very first member -- expression that follows it are already parsed. The right curly brace -- remains unscanned on exit. */ CODE *literal_set(MPL *mpl, CODE *code) { OPERANDS arg; int j; xassert(code != NULL); arg.list = create_arg_list(mpl); /* parse */ for (j = 1; ; j++) { /* all member expressions must be n-tuples; so, if the current expression is not n-tuple, convert it to 1-tuple */ if (code->type == A_NUMERIC) code = make_unary(mpl, O_CVTSYM, code, A_SYMBOLIC, 0); if (code->type == A_SYMBOLIC) code = make_unary(mpl, O_CVTTUP, code, A_TUPLE, 1); /* now the expression must be n-tuple */ if (code->type != A_TUPLE) error(mpl, "member expression has invalid type"); /* all member expressions must have identical dimension */ if (arg.list != NULL && arg.list->x->dim != code->dim) error(mpl, "member %d has %d component%s while member %d ha" "s %d component%s", j-1, arg.list->x->dim, arg.list->x->dim == 1 ? "" : "s", j, code->dim, code->dim == 1 ? "" : "s"); /* append the current expression to the member list */ arg.list = expand_arg_list(mpl, arg.list, code); /* check a token that follows the current expression */ if (mpl->token == T_COMMA) get_token(mpl /* , */); else if (mpl->token == T_RBRACE) break; else error(mpl, "syntax error in literal set"); /* parse the next expression that follows the comma */ code = expression_5(mpl); } /* generate pseudo-code for */ code = make_code(mpl, O_MAKE, &arg, A_ELEMSET, arg.list->x->dim); return code; } /*---------------------------------------------------------------------- -- indexing_expression - parse indexing expression. -- -- This routine parses indexing expression using the syntax: -- -- ::= -- ::= { } -- ::= { : } -- ::= -- ::= , -- ::= -- ::= in -- ::= in -- ::= -- ::= ( ) -- ::= -- ::= -- -- This routine creates domain for , where each -- domain block corresponds to , and each domain slot -- corresponds to individual indexing position. */ DOMAIN *indexing_expression(MPL *mpl) { DOMAIN *domain; DOMAIN_BLOCK *block; DOMAIN_SLOT *slot; CODE *code; xassert(mpl->token == T_LBRACE); get_token(mpl /* { */); if (mpl->token == T_RBRACE) error(mpl, "empty indexing expression not allowed"); /* create domain to be constructed */ domain = create_domain(mpl); /* parse either or that follows the left brace */ for (;;) { /* domain block for is not created yet */ block = NULL; /* pseudo-code for is not generated yet */ code = NULL; /* check a token, which begins with */ if (mpl->token == T_NAME) { /* it is a symbolic name */ int next_token; char *name; /* symbolic name is recognized as dummy index only if it is followed by the keyword 'in' and not declared */ get_token(mpl /* */); next_token = mpl->token; unget_token(mpl); if (!(next_token == T_IN && avl_find_node(mpl->tree, mpl->image) == NULL)) { /* this is not dummy index; the symbolic name begins an expression, which is either or the very first in */ goto expr; } /* create domain block with one slot, which is assigned the dummy index */ block = create_block(mpl); name = dmp_get_atomv(mpl->pool, strlen(mpl->image)+1); strcpy(name, mpl->image); append_slot(mpl, block, name, NULL); get_token(mpl /* */); /* the keyword 'in' is already checked above */ xassert(mpl->token == T_IN); get_token(mpl /* in */); /* that follows the keyword 'in' will be parsed below */ } else if (mpl->token == T_LEFT) { /* it is the left parenthesis; parse expression that begins with this parenthesis (the flag is set in order to allow recognizing slices; see the routine expression_list) */ mpl->flag_x = 1; code = expression_9(mpl); if (code->op != O_SLICE) { /* this is either or the very first in */ goto expr; } /* this is a slice; besides the corresponding domain block is already created by expression_list() */ block = code->arg.slice; code = NULL; /* is not parsed yet */ /* the keyword 'in' following the slice is already checked by expression_list() */ xassert(mpl->token == T_IN); get_token(mpl /* in */); /* that follows the keyword 'in' will be parsed below */ } expr: /* parse expression that follows either the keyword 'in' (in which case it can be as well as the very first in ); note that this expression can be already parsed above */ if (code == NULL) code = expression_9(mpl); /* check the type of the expression just parsed */ if (code->type != A_ELEMSET) { /* it is not and therefore it can only be the very first in ; however, then there must be no dummy index neither slice between the left brace and this expression */ if (block != NULL) error(mpl, "domain expression has invalid type"); /* parse the rest part of and make this set be , i.e. the construction {a, b, c} is parsed as it were written as {A}, where A = {a, b, c} is a temporary elemental set */ code = literal_set(mpl, code); } /* now pseudo-code for has been built */ xassert(code != NULL); xassert(code->type == A_ELEMSET); xassert(code->dim > 0); /* if domain block for the current is still not created, create it for fake slice of the same dimension as */ if (block == NULL) { int j; block = create_block(mpl); for (j = 1; j <= code->dim; j++) append_slot(mpl, block, NULL, NULL); } /* number of indexing positions in must be the same as dimension of n-tuples in basic set */ { int dim = 0; for (slot = block->list; slot != NULL; slot = slot->next) dim++; if (dim != code->dim) error(mpl,"%d %s specified for set of dimension %d", dim, dim == 1 ? "index" : "indices", code->dim); } /* store pseudo-code for in the domain block */ xassert(block->code == NULL); block->code = code; /* and append the domain block to the domain */ append_block(mpl, domain, block); /* the current has been completely parsed; include all its dummy indices into the symbolic name table to make them available for referencing from expressions; implicit declarations of dummy indices remain valid while the corresponding domain scope is valid */ for (slot = block->list; slot != NULL; slot = slot->next) if (slot->name != NULL) { AVLNODE *node; xassert(avl_find_node(mpl->tree, slot->name) == NULL); node = avl_insert_node(mpl->tree, slot->name); avl_set_node_type(node, A_INDEX); avl_set_node_link(node, (void *)slot); } /* check a token that follows */ if (mpl->token == T_COMMA) get_token(mpl /* , */); else if (mpl->token == T_COLON || mpl->token == T_RBRACE) break; else error(mpl, "syntax error in indexing expression"); } /* parse that follows the colon */ if (mpl->token == T_COLON) { get_token(mpl /* : */); code = expression_13(mpl); /* convert the expression to logical type, if necessary */ if (code->type == A_SYMBOLIC) code = make_unary(mpl, O_CVTNUM, code, A_NUMERIC, 0); if (code->type == A_NUMERIC) code = make_unary(mpl, O_CVTLOG, code, A_LOGICAL, 0); /* now the expression must be of logical type */ if (code->type != A_LOGICAL) error(mpl, "expression following colon has invalid type"); xassert(code->dim == 0); domain->code = code; /* the right brace must follow the logical expression */ if (mpl->token != T_RBRACE) error(mpl, "syntax error in indexing expression"); } get_token(mpl /* } */); return domain; } /*---------------------------------------------------------------------- -- close_scope - close scope of indexing expression. -- -- The routine closes the scope of indexing expression specified by its -- domain and thereby makes all dummy indices introduced in the indexing -- expression no longer available for referencing. */ void close_scope(MPL *mpl, DOMAIN *domain) { DOMAIN_BLOCK *block; DOMAIN_SLOT *slot; AVLNODE *node; xassert(domain != NULL); /* remove all dummy indices from the symbolic names table */ for (block = domain->list; block != NULL; block = block->next) { for (slot = block->list; slot != NULL; slot = slot->next) { if (slot->name != NULL) { node = avl_find_node(mpl->tree, slot->name); xassert(node != NULL); xassert(avl_get_node_type(node) == A_INDEX); avl_delete_node(mpl->tree, node); } } } return; } /*---------------------------------------------------------------------- -- iterated_expression - parse iterated expression. -- -- This routine parses primary expression using the syntax: -- -- ::= -- ::= sum -- ::= prod -- ::= min -- ::= max -- ::= exists -- -- ::= forall -- -- ::= setof -- -- Note that parsing "integrand" depends on the iterated operator. */ #if 1 /* 07/IX-2008 */ static void link_up(CODE *code) { /* if we have something like sum{(i+1,j,k-1) in E} x[i,j,k], where i and k are dummy indices defined out of the iterated expression, we should link up pseudo-code for computing i+1 and k-1 to pseudo-code for computing the iterated expression; this is needed to invalidate current value of the iterated expression once i or k have been changed */ DOMAIN_BLOCK *block; DOMAIN_SLOT *slot; for (block = code->arg.loop.domain->list; block != NULL; block = block->next) { for (slot = block->list; slot != NULL; slot = slot->next) { if (slot->code != NULL) { xassert(slot->code->up == NULL); slot->code->up = code; } } } return; } #endif CODE *iterated_expression(MPL *mpl) { CODE *code; OPERANDS arg; int op; char opstr[8]; /* determine operation code */ xassert(mpl->token == T_NAME); if (strcmp(mpl->image, "sum") == 0) op = O_SUM; else if (strcmp(mpl->image, "prod") == 0) op = O_PROD; else if (strcmp(mpl->image, "min") == 0) op = O_MINIMUM; else if (strcmp(mpl->image, "max") == 0) op = O_MAXIMUM; else if (strcmp(mpl->image, "forall") == 0) op = O_FORALL; else if (strcmp(mpl->image, "exists") == 0) op = O_EXISTS; else if (strcmp(mpl->image, "setof") == 0) op = O_SETOF; else error(mpl, "operator %s unknown", mpl->image); strcpy(opstr, mpl->image); xassert(strlen(opstr) < sizeof(opstr)); get_token(mpl /* */); /* check the left brace that follows the operator name */ xassert(mpl->token == T_LBRACE); /* parse indexing expression that controls iterating */ arg.loop.domain = indexing_expression(mpl); /* parse "integrand" expression and generate pseudo-code */ switch (op) { case O_SUM: case O_PROD: case O_MINIMUM: case O_MAXIMUM: arg.loop.x = expression_3(mpl); /* convert the integrand to numeric type, if necessary */ if (arg.loop.x->type == A_SYMBOLIC) arg.loop.x = make_unary(mpl, O_CVTNUM, arg.loop.x, A_NUMERIC, 0); /* now the integrand must be of numeric type or linear form (the latter is only allowed for the sum operator) */ if (!(arg.loop.x->type == A_NUMERIC || op == O_SUM && arg.loop.x->type == A_FORMULA)) err: error(mpl, "integrand following %s{...} has invalid type" , opstr); xassert(arg.loop.x->dim == 0); /* generate pseudo-code */ code = make_code(mpl, op, &arg, arg.loop.x->type, 0); break; case O_FORALL: case O_EXISTS: arg.loop.x = expression_12(mpl); /* convert the integrand to logical type, if necessary */ if (arg.loop.x->type == A_SYMBOLIC) arg.loop.x = make_unary(mpl, O_CVTNUM, arg.loop.x, A_NUMERIC, 0); if (arg.loop.x->type == A_NUMERIC) arg.loop.x = make_unary(mpl, O_CVTLOG, arg.loop.x, A_LOGICAL, 0); /* now the integrand must be of logical type */ if (arg.loop.x->type != A_LOGICAL) goto err; xassert(arg.loop.x->dim == 0); /* generate pseudo-code */ code = make_code(mpl, op, &arg, A_LOGICAL, 0); break; case O_SETOF: arg.loop.x = expression_5(mpl); /* convert the integrand to 1-tuple, if necessary */ if (arg.loop.x->type == A_NUMERIC) arg.loop.x = make_unary(mpl, O_CVTSYM, arg.loop.x, A_SYMBOLIC, 0); if (arg.loop.x->type == A_SYMBOLIC) arg.loop.x = make_unary(mpl, O_CVTTUP, arg.loop.x, A_TUPLE, 1); /* now the integrand must be n-tuple */ if (arg.loop.x->type != A_TUPLE) goto err; xassert(arg.loop.x->dim > 0); /* generate pseudo-code */ code = make_code(mpl, op, &arg, A_ELEMSET, arg.loop.x->dim); break; default: xassert(op != op); } /* close the scope of the indexing expression */ close_scope(mpl, arg.loop.domain); #if 1 /* 07/IX-2008 */ link_up(code); #endif return code; } /*---------------------------------------------------------------------- -- domain_arity - determine arity of domain. -- -- This routine returns arity of specified domain, which is number of -- its free dummy indices. */ int domain_arity(MPL *mpl, DOMAIN *domain) { DOMAIN_BLOCK *block; DOMAIN_SLOT *slot; int arity; xassert(mpl == mpl); arity = 0; for (block = domain->list; block != NULL; block = block->next) for (slot = block->list; slot != NULL; slot = slot->next) if (slot->code == NULL) arity++; return arity; } /*---------------------------------------------------------------------- -- set_expression - parse set expression. -- -- This routine parses primary expression using the syntax: -- -- ::= { } -- ::= */ CODE *set_expression(MPL *mpl) { CODE *code; OPERANDS arg; xassert(mpl->token == T_LBRACE); get_token(mpl /* { */); /* check a token that follows the left brace */ if (mpl->token == T_RBRACE) { /* it is the right brace, so the resultant is an empty set of dimension 1 */ arg.list = NULL; /* generate pseudo-code to build the resultant set */ code = make_code(mpl, O_MAKE, &arg, A_ELEMSET, 1); get_token(mpl /* } */); } else { /* the next token begins an indexing expression */ unget_token(mpl); arg.loop.domain = indexing_expression(mpl); arg.loop.x = NULL; /* integrand is not used */ /* close the scope of the indexing expression */ close_scope(mpl, arg.loop.domain); /* generate pseudo-code to build the resultant set */ code = make_code(mpl, O_BUILD, &arg, A_ELEMSET, domain_arity(mpl, arg.loop.domain)); #if 1 /* 07/IX-2008 */ link_up(code); #endif } return code; } /*---------------------------------------------------------------------- -- branched_expression - parse conditional expression. -- -- This routine parses primary expression using the syntax: -- -- ::= -- ::= if then -- ::= if then -- else -- ::= */ CODE *branched_expression(MPL *mpl) { CODE *code, *x, *y, *z; xassert(mpl->token == T_IF); get_token(mpl /* if */); /* parse that follows 'if' */ x = expression_13(mpl); /* convert the expression to logical type, if necessary */ if (x->type == A_SYMBOLIC) x = make_unary(mpl, O_CVTNUM, x, A_NUMERIC, 0); if (x->type == A_NUMERIC) x = make_unary(mpl, O_CVTLOG, x, A_LOGICAL, 0); /* now the expression must be of logical type */ if (x->type != A_LOGICAL) error(mpl, "expression following if has invalid type"); xassert(x->dim == 0); /* the keyword 'then' must follow the logical expression */ if (mpl->token != T_THEN) error(mpl, "keyword then missing where expected"); get_token(mpl /* then */); /* parse that follows 'then' and check its type */ y = expression_9(mpl); if (!(y->type == A_NUMERIC || y->type == A_SYMBOLIC || y->type == A_ELEMSET || y->type == A_FORMULA)) error(mpl, "expression following then has invalid type"); /* if the expression that follows the keyword 'then' is elemental set, the keyword 'else' cannot be omitted; otherwise else-part is optional */ if (mpl->token != T_ELSE) { if (y->type == A_ELEMSET) error(mpl, "keyword else missing where expected"); z = NULL; goto skip; } get_token(mpl /* else */); /* parse that follow 'else' and check its type */ z = expression_9(mpl); if (!(z->type == A_NUMERIC || z->type == A_SYMBOLIC || z->type == A_ELEMSET || z->type == A_FORMULA)) error(mpl, "expression following else has invalid type"); /* convert to identical types, if necessary */ if (y->type == A_FORMULA || z->type == A_FORMULA) { if (y->type == A_SYMBOLIC) y = make_unary(mpl, O_CVTNUM, y, A_NUMERIC, 0); if (y->type == A_NUMERIC) y = make_unary(mpl, O_CVTLFM, y, A_FORMULA, 0); if (z->type == A_SYMBOLIC) z = make_unary(mpl, O_CVTNUM, z, A_NUMERIC, 0); if (z->type == A_NUMERIC) z = make_unary(mpl, O_CVTLFM, z, A_FORMULA, 0); } if (y->type == A_SYMBOLIC || z->type == A_SYMBOLIC) { if (y->type == A_NUMERIC) y = make_unary(mpl, O_CVTSYM, y, A_SYMBOLIC, 0); if (z->type == A_NUMERIC) z = make_unary(mpl, O_CVTSYM, z, A_SYMBOLIC, 0); } /* now both expressions must have identical types */ if (y->type != z->type) error(mpl, "expressions following then and else have incompati" "ble types"); /* and identical dimensions */ if (y->dim != z->dim) error(mpl, "expressions following then and else have different" " dimensions %d and %d, respectively", y->dim, z->dim); skip: /* generate pseudo-code to perform branching */ code = make_ternary(mpl, O_FORK, x, y, z, y->type, y->dim); return code; } /*---------------------------------------------------------------------- -- primary_expression - parse primary expression. -- -- This routine parses primary expression using the syntax: -- -- ::= -- ::= Infinity -- ::= -- ::= -- ::= -- ::= [ ] -- ::= -- ::= [ ] -- ::= -- ::= [ ] -- ::= ( ) -- ::= ( ) -- ::= -- ::= { } -- ::= -- ::= -- -- For complete list of syntactic rules for see -- comments to the corresponding parsing routines. */ CODE *primary_expression(MPL *mpl) { CODE *code; if (mpl->token == T_NUMBER) { /* parse numeric literal */ code = numeric_literal(mpl); } #if 1 /* 21/VII-2006 */ else if (mpl->token == T_INFINITY) { /* parse "infinity" */ OPERANDS arg; arg.num = DBL_MAX; code = make_code(mpl, O_NUMBER, &arg, A_NUMERIC, 0); get_token(mpl /* Infinity */); } #endif else if (mpl->token == T_STRING) { /* parse string literal */ code = string_literal(mpl); } else if (mpl->token == T_NAME) { int next_token; get_token(mpl /* */); next_token = mpl->token; unget_token(mpl); /* check a token that follows */ switch (next_token) { case T_LBRACKET: /* parse reference to subscripted object */ code = object_reference(mpl); break; case T_LEFT: /* parse reference to built-in function */ code = function_reference(mpl); break; case T_LBRACE: /* parse iterated expression */ code = iterated_expression(mpl); break; default: /* parse reference to unsubscripted object */ code = object_reference(mpl); break; } } else if (mpl->token == T_LEFT) { /* parse parenthesized expression */ code = expression_list(mpl); } else if (mpl->token == T_LBRACE) { /* parse set expression */ code = set_expression(mpl); } else if (mpl->token == T_IF) { /* parse conditional expression */ code = branched_expression(mpl); } else if (is_reserved(mpl)) { /* other reserved keywords cannot be used here */ error(mpl, "invalid use of reserved keyword %s", mpl->image); } else error(mpl, "syntax error in expression"); return code; } /*---------------------------------------------------------------------- -- error_preceding - raise error if preceding operand has wrong type. -- -- This routine is called to raise error if operand that precedes some -- infix operator has invalid type. */ void error_preceding(MPL *mpl, char *opstr) { error(mpl, "operand preceding %s has invalid type", opstr); /* no return */ } /*---------------------------------------------------------------------- -- error_following - raise error if following operand has wrong type. -- -- This routine is called to raise error if operand that follows some -- infix operator has invalid type. */ void error_following(MPL *mpl, char *opstr) { error(mpl, "operand following %s has invalid type", opstr); /* no return */ } /*---------------------------------------------------------------------- -- error_dimension - raise error if operands have different dimension. -- -- This routine is called to raise error if two operands of some infix -- operator have different dimension. */ void error_dimension(MPL *mpl, char *opstr, int dim1, int dim2) { error(mpl, "operands preceding and following %s have different di" "mensions %d and %d, respectively", opstr, dim1, dim2); /* no return */ } /*---------------------------------------------------------------------- -- expression_0 - parse expression of level 0. -- -- This routine parses expression of level 0 using the syntax: -- -- ::= */ CODE *expression_0(MPL *mpl) { CODE *code; code = primary_expression(mpl); return code; } /*---------------------------------------------------------------------- -- expression_1 - parse expression of level 1. -- -- This routine parses expression of level 1 using the syntax: -- -- ::= -- ::= -- ::= -- ::= ^ | ** */ CODE *expression_1(MPL *mpl) { CODE *x, *y; char opstr[8]; x = expression_0(mpl); if (mpl->token == T_POWER) { strcpy(opstr, mpl->image); xassert(strlen(opstr) < sizeof(opstr)); if (x->type == A_SYMBOLIC) x = make_unary(mpl, O_CVTNUM, x, A_NUMERIC, 0); if (x->type != A_NUMERIC) error_preceding(mpl, opstr); get_token(mpl /* ^ | ** */); if (mpl->token == T_PLUS || mpl->token == T_MINUS) y = expression_2(mpl); else y = expression_1(mpl); if (y->type == A_SYMBOLIC) y = make_unary(mpl, O_CVTNUM, y, A_NUMERIC, 0); if (y->type != A_NUMERIC) error_following(mpl, opstr); x = make_binary(mpl, O_POWER, x, y, A_NUMERIC, 0); } return x; } /*---------------------------------------------------------------------- -- expression_2 - parse expression of level 2. -- -- This routine parses expression of level 2 using the syntax: -- -- ::= -- ::= + -- ::= - */ CODE *expression_2(MPL *mpl) { CODE *x; if (mpl->token == T_PLUS) { get_token(mpl /* + */); x = expression_1(mpl); if (x->type == A_SYMBOLIC) x = make_unary(mpl, O_CVTNUM, x, A_NUMERIC, 0); if (!(x->type == A_NUMERIC || x->type == A_FORMULA)) error_following(mpl, "+"); x = make_unary(mpl, O_PLUS, x, x->type, 0); } else if (mpl->token == T_MINUS) { get_token(mpl /* - */); x = expression_1(mpl); if (x->type == A_SYMBOLIC) x = make_unary(mpl, O_CVTNUM, x, A_NUMERIC, 0); if (!(x->type == A_NUMERIC || x->type == A_FORMULA)) error_following(mpl, "-"); x = make_unary(mpl, O_MINUS, x, x->type, 0); } else x = expression_1(mpl); return x; } /*---------------------------------------------------------------------- -- expression_3 - parse expression of level 3. -- -- This routine parses expression of level 3 using the syntax: -- -- ::= -- ::= * -- ::= / -- ::= div -- ::= mod */ CODE *expression_3(MPL *mpl) { CODE *x, *y; x = expression_2(mpl); for (;;) { if (mpl->token == T_ASTERISK) { if (x->type == A_SYMBOLIC) x = make_unary(mpl, O_CVTNUM, x, A_NUMERIC, 0); if (!(x->type == A_NUMERIC || x->type == A_FORMULA)) error_preceding(mpl, "*"); get_token(mpl /* * */); y = expression_2(mpl); if (y->type == A_SYMBOLIC) y = make_unary(mpl, O_CVTNUM, y, A_NUMERIC, 0); if (!(y->type == A_NUMERIC || y->type == A_FORMULA)) error_following(mpl, "*"); if (x->type == A_FORMULA && y->type == A_FORMULA) error(mpl, "multiplication of linear forms not allowed"); if (x->type == A_NUMERIC && y->type == A_NUMERIC) x = make_binary(mpl, O_MUL, x, y, A_NUMERIC, 0); else x = make_binary(mpl, O_MUL, x, y, A_FORMULA, 0); } else if (mpl->token == T_SLASH) { if (x->type == A_SYMBOLIC) x = make_unary(mpl, O_CVTNUM, x, A_NUMERIC, 0); if (!(x->type == A_NUMERIC || x->type == A_FORMULA)) error_preceding(mpl, "/"); get_token(mpl /* / */); y = expression_2(mpl); if (y->type == A_SYMBOLIC) y = make_unary(mpl, O_CVTNUM, y, A_NUMERIC, 0); if (y->type != A_NUMERIC) error_following(mpl, "/"); if (x->type == A_NUMERIC) x = make_binary(mpl, O_DIV, x, y, A_NUMERIC, 0); else x = make_binary(mpl, O_DIV, x, y, A_FORMULA, 0); } else if (mpl->token == T_DIV) { if (x->type == A_SYMBOLIC) x = make_unary(mpl, O_CVTNUM, x, A_NUMERIC, 0); if (x->type != A_NUMERIC) error_preceding(mpl, "div"); get_token(mpl /* div */); y = expression_2(mpl); if (y->type == A_SYMBOLIC) y = make_unary(mpl, O_CVTNUM, y, A_NUMERIC, 0); if (y->type != A_NUMERIC) error_following(mpl, "div"); x = make_binary(mpl, O_IDIV, x, y, A_NUMERIC, 0); } else if (mpl->token == T_MOD) { if (x->type == A_SYMBOLIC) x = make_unary(mpl, O_CVTNUM, x, A_NUMERIC, 0); if (x->type != A_NUMERIC) error_preceding(mpl, "mod"); get_token(mpl /* mod */); y = expression_2(mpl); if (y->type == A_SYMBOLIC) y = make_unary(mpl, O_CVTNUM, y, A_NUMERIC, 0); if (y->type != A_NUMERIC) error_following(mpl, "mod"); x = make_binary(mpl, O_MOD, x, y, A_NUMERIC, 0); } else break; } return x; } /*---------------------------------------------------------------------- -- expression_4 - parse expression of level 4. -- -- This routine parses expression of level 4 using the syntax: -- -- ::= -- ::= + -- ::= - -- ::= less */ CODE *expression_4(MPL *mpl) { CODE *x, *y; x = expression_3(mpl); for (;;) { if (mpl->token == T_PLUS) { if (x->type == A_SYMBOLIC) x = make_unary(mpl, O_CVTNUM, x, A_NUMERIC, 0); if (!(x->type == A_NUMERIC || x->type == A_FORMULA)) error_preceding(mpl, "+"); get_token(mpl /* + */); y = expression_3(mpl); if (y->type == A_SYMBOLIC) y = make_unary(mpl, O_CVTNUM, y, A_NUMERIC, 0); if (!(y->type == A_NUMERIC || y->type == A_FORMULA)) error_following(mpl, "+"); if (x->type == A_NUMERIC && y->type == A_FORMULA) x = make_unary(mpl, O_CVTLFM, x, A_FORMULA, 0); if (x->type == A_FORMULA && y->type == A_NUMERIC) y = make_unary(mpl, O_CVTLFM, y, A_FORMULA, 0); x = make_binary(mpl, O_ADD, x, y, x->type, 0); } else if (mpl->token == T_MINUS) { if (x->type == A_SYMBOLIC) x = make_unary(mpl, O_CVTNUM, x, A_NUMERIC, 0); if (!(x->type == A_NUMERIC || x->type == A_FORMULA)) error_preceding(mpl, "-"); get_token(mpl /* - */); y = expression_3(mpl); if (y->type == A_SYMBOLIC) y = make_unary(mpl, O_CVTNUM, y, A_NUMERIC, 0); if (!(y->type == A_NUMERIC || y->type == A_FORMULA)) error_following(mpl, "-"); if (x->type == A_NUMERIC && y->type == A_FORMULA) x = make_unary(mpl, O_CVTLFM, x, A_FORMULA, 0); if (x->type == A_FORMULA && y->type == A_NUMERIC) y = make_unary(mpl, O_CVTLFM, y, A_FORMULA, 0); x = make_binary(mpl, O_SUB, x, y, x->type, 0); } else if (mpl->token == T_LESS) { if (x->type == A_SYMBOLIC) x = make_unary(mpl, O_CVTNUM, x, A_NUMERIC, 0); if (x->type != A_NUMERIC) error_preceding(mpl, "less"); get_token(mpl /* less */); y = expression_3(mpl); if (y->type == A_SYMBOLIC) y = make_unary(mpl, O_CVTNUM, y, A_NUMERIC, 0); if (y->type != A_NUMERIC) error_following(mpl, "less"); x = make_binary(mpl, O_LESS, x, y, A_NUMERIC, 0); } else break; } return x; } /*---------------------------------------------------------------------- -- expression_5 - parse expression of level 5. -- -- This routine parses expression of level 5 using the syntax: -- -- ::= -- ::= & */ CODE *expression_5(MPL *mpl) { CODE *x, *y; x = expression_4(mpl); for (;;) { if (mpl->token == T_CONCAT) { if (x->type == A_NUMERIC) x = make_unary(mpl, O_CVTSYM, x, A_SYMBOLIC, 0); if (x->type != A_SYMBOLIC) error_preceding(mpl, "&"); get_token(mpl /* & */); y = expression_4(mpl); if (y->type == A_NUMERIC) y = make_unary(mpl, O_CVTSYM, y, A_SYMBOLIC, 0); if (y->type != A_SYMBOLIC) error_following(mpl, "&"); x = make_binary(mpl, O_CONCAT, x, y, A_SYMBOLIC, 0); } else break; } return x; } /*---------------------------------------------------------------------- -- expression_6 - parse expression of level 6. -- -- This routine parses expression of level 6 using the syntax: -- -- ::= -- ::= .. -- ::= .. by -- */ CODE *expression_6(MPL *mpl) { CODE *x, *y, *z; x = expression_5(mpl); if (mpl->token == T_DOTS) { if (x->type == A_SYMBOLIC) x = make_unary(mpl, O_CVTNUM, x, A_NUMERIC, 0); if (x->type != A_NUMERIC) error_preceding(mpl, ".."); get_token(mpl /* .. */); y = expression_5(mpl); if (y->type == A_SYMBOLIC) y = make_unary(mpl, O_CVTNUM, y, A_NUMERIC, 0); if (y->type != A_NUMERIC) error_following(mpl, ".."); if (mpl->token == T_BY) { get_token(mpl /* by */); z = expression_5(mpl); if (z->type == A_SYMBOLIC) z = make_unary(mpl, O_CVTNUM, z, A_NUMERIC, 0); if (z->type != A_NUMERIC) error_following(mpl, "by"); } else z = NULL; x = make_ternary(mpl, O_DOTS, x, y, z, A_ELEMSET, 1); } return x; } /*---------------------------------------------------------------------- -- expression_7 - parse expression of level 7. -- -- This routine parses expression of level 7 using the syntax: -- -- ::= -- ::= cross */ CODE *expression_7(MPL *mpl) { CODE *x, *y; x = expression_6(mpl); for (;;) { if (mpl->token == T_CROSS) { if (x->type != A_ELEMSET) error_preceding(mpl, "cross"); get_token(mpl /* cross */); y = expression_6(mpl); if (y->type != A_ELEMSET) error_following(mpl, "cross"); x = make_binary(mpl, O_CROSS, x, y, A_ELEMSET, x->dim + y->dim); } else break; } return x; } /*---------------------------------------------------------------------- -- expression_8 - parse expression of level 8. -- -- This routine parses expression of level 8 using the syntax: -- -- ::= -- ::= inter */ CODE *expression_8(MPL *mpl) { CODE *x, *y; x = expression_7(mpl); for (;;) { if (mpl->token == T_INTER) { if (x->type != A_ELEMSET) error_preceding(mpl, "inter"); get_token(mpl /* inter */); y = expression_7(mpl); if (y->type != A_ELEMSET) error_following(mpl, "inter"); if (x->dim != y->dim) error_dimension(mpl, "inter", x->dim, y->dim); x = make_binary(mpl, O_INTER, x, y, A_ELEMSET, x->dim); } else break; } return x; } /*---------------------------------------------------------------------- -- expression_9 - parse expression of level 9. -- -- This routine parses expression of level 9 using the syntax: -- -- ::= -- ::= union -- ::= diff -- ::= symdiff */ CODE *expression_9(MPL *mpl) { CODE *x, *y; x = expression_8(mpl); for (;;) { if (mpl->token == T_UNION) { if (x->type != A_ELEMSET) error_preceding(mpl, "union"); get_token(mpl /* union */); y = expression_8(mpl); if (y->type != A_ELEMSET) error_following(mpl, "union"); if (x->dim != y->dim) error_dimension(mpl, "union", x->dim, y->dim); x = make_binary(mpl, O_UNION, x, y, A_ELEMSET, x->dim); } else if (mpl->token == T_DIFF) { if (x->type != A_ELEMSET) error_preceding(mpl, "diff"); get_token(mpl /* diff */); y = expression_8(mpl); if (y->type != A_ELEMSET) error_following(mpl, "diff"); if (x->dim != y->dim) error_dimension(mpl, "diff", x->dim, y->dim); x = make_binary(mpl, O_DIFF, x, y, A_ELEMSET, x->dim); } else if (mpl->token == T_SYMDIFF) { if (x->type != A_ELEMSET) error_preceding(mpl, "symdiff"); get_token(mpl /* symdiff */); y = expression_8(mpl); if (y->type != A_ELEMSET) error_following(mpl, "symdiff"); if (x->dim != y->dim) error_dimension(mpl, "symdiff", x->dim, y->dim); x = make_binary(mpl, O_SYMDIFF, x, y, A_ELEMSET, x->dim); } else break; } return x; } /*---------------------------------------------------------------------- -- expression_10 - parse expression of level 10. -- -- This routine parses expression of level 10 using the syntax: -- -- ::= -- ::= -- ::= < | <= | = | == | >= | > | <> | != | in | not in | ! in | -- within | not within | ! within */ CODE *expression_10(MPL *mpl) { CODE *x, *y; int op = -1; char opstr[16]; x = expression_9(mpl); strcpy(opstr, ""); switch (mpl->token) { case T_LT: op = O_LT; break; case T_LE: op = O_LE; break; case T_EQ: op = O_EQ; break; case T_GE: op = O_GE; break; case T_GT: op = O_GT; break; case T_NE: op = O_NE; break; case T_IN: op = O_IN; break; case T_WITHIN: op = O_WITHIN; break; case T_NOT: strcpy(opstr, mpl->image); get_token(mpl /* not | ! */); if (mpl->token == T_IN) op = O_NOTIN; else if (mpl->token == T_WITHIN) op = O_NOTWITHIN; else error(mpl, "invalid use of %s", opstr); strcat(opstr, " "); break; default: goto done; } strcat(opstr, mpl->image); xassert(strlen(opstr) < sizeof(opstr)); switch (op) { case O_EQ: case O_NE: #if 1 /* 02/VIII-2008 */ case O_LT: case O_LE: case O_GT: case O_GE: #endif if (!(x->type == A_NUMERIC || x->type == A_SYMBOLIC)) error_preceding(mpl, opstr); get_token(mpl /* */); y = expression_9(mpl); if (!(y->type == A_NUMERIC || y->type == A_SYMBOLIC)) error_following(mpl, opstr); if (x->type == A_NUMERIC && y->type == A_SYMBOLIC) x = make_unary(mpl, O_CVTSYM, x, A_SYMBOLIC, 0); if (x->type == A_SYMBOLIC && y->type == A_NUMERIC) y = make_unary(mpl, O_CVTSYM, y, A_SYMBOLIC, 0); x = make_binary(mpl, op, x, y, A_LOGICAL, 0); break; #if 0 /* 02/VIII-2008 */ case O_LT: case O_LE: case O_GT: case O_GE: if (x->type == A_SYMBOLIC) x = make_unary(mpl, O_CVTNUM, x, A_NUMERIC, 0); if (x->type != A_NUMERIC) error_preceding(mpl, opstr); get_token(mpl /* */); y = expression_9(mpl); if (y->type == A_SYMBOLIC) y = make_unary(mpl, O_CVTNUM, y, A_NUMERIC, 0); if (y->type != A_NUMERIC) error_following(mpl, opstr); x = make_binary(mpl, op, x, y, A_LOGICAL, 0); break; #endif case O_IN: case O_NOTIN: if (x->type == A_NUMERIC) x = make_unary(mpl, O_CVTSYM, x, A_SYMBOLIC, 0); if (x->type == A_SYMBOLIC) x = make_unary(mpl, O_CVTTUP, x, A_TUPLE, 1); if (x->type != A_TUPLE) error_preceding(mpl, opstr); get_token(mpl /* */); y = expression_9(mpl); if (y->type != A_ELEMSET) error_following(mpl, opstr); if (x->dim != y->dim) error_dimension(mpl, opstr, x->dim, y->dim); x = make_binary(mpl, op, x, y, A_LOGICAL, 0); break; case O_WITHIN: case O_NOTWITHIN: if (x->type != A_ELEMSET) error_preceding(mpl, opstr); get_token(mpl /* */); y = expression_9(mpl); if (y->type != A_ELEMSET) error_following(mpl, opstr); if (x->dim != y->dim) error_dimension(mpl, opstr, x->dim, y->dim); x = make_binary(mpl, op, x, y, A_LOGICAL, 0); break; default: xassert(op != op); } done: return x; } /*---------------------------------------------------------------------- -- expression_11 - parse expression of level 11. -- -- This routine parses expression of level 11 using the syntax: -- -- ::= -- ::= not -- ::= ! */ CODE *expression_11(MPL *mpl) { CODE *x; char opstr[8]; if (mpl->token == T_NOT) { strcpy(opstr, mpl->image); xassert(strlen(opstr) < sizeof(opstr)); get_token(mpl /* not | ! */); x = expression_10(mpl); if (x->type == A_SYMBOLIC) x = make_unary(mpl, O_CVTNUM, x, A_NUMERIC, 0); if (x->type == A_NUMERIC) x = make_unary(mpl, O_CVTLOG, x, A_LOGICAL, 0); if (x->type != A_LOGICAL) error_following(mpl, opstr); x = make_unary(mpl, O_NOT, x, A_LOGICAL, 0); } else x = expression_10(mpl); return x; } /*---------------------------------------------------------------------- -- expression_12 - parse expression of level 12. -- -- This routine parses expression of level 12 using the syntax: -- -- ::= -- ::= and -- ::= && */ CODE *expression_12(MPL *mpl) { CODE *x, *y; char opstr[8]; x = expression_11(mpl); for (;;) { if (mpl->token == T_AND) { strcpy(opstr, mpl->image); xassert(strlen(opstr) < sizeof(opstr)); if (x->type == A_SYMBOLIC) x = make_unary(mpl, O_CVTNUM, x, A_NUMERIC, 0); if (x->type == A_NUMERIC) x = make_unary(mpl, O_CVTLOG, x, A_LOGICAL, 0); if (x->type != A_LOGICAL) error_preceding(mpl, opstr); get_token(mpl /* and | && */); y = expression_11(mpl); if (y->type == A_SYMBOLIC) y = make_unary(mpl, O_CVTNUM, y, A_NUMERIC, 0); if (y->type == A_NUMERIC) y = make_unary(mpl, O_CVTLOG, y, A_LOGICAL, 0); if (y->type != A_LOGICAL) error_following(mpl, opstr); x = make_binary(mpl, O_AND, x, y, A_LOGICAL, 0); } else break; } return x; } /*---------------------------------------------------------------------- -- expression_13 - parse expression of level 13. -- -- This routine parses expression of level 13 using the syntax: -- -- ::= -- ::= or -- ::= || */ CODE *expression_13(MPL *mpl) { CODE *x, *y; char opstr[8]; x = expression_12(mpl); for (;;) { if (mpl->token == T_OR) { strcpy(opstr, mpl->image); xassert(strlen(opstr) < sizeof(opstr)); if (x->type == A_SYMBOLIC) x = make_unary(mpl, O_CVTNUM, x, A_NUMERIC, 0); if (x->type == A_NUMERIC) x = make_unary(mpl, O_CVTLOG, x, A_LOGICAL, 0); if (x->type != A_LOGICAL) error_preceding(mpl, opstr); get_token(mpl /* or | || */); y = expression_12(mpl); if (y->type == A_SYMBOLIC) y = make_unary(mpl, O_CVTNUM, y, A_NUMERIC, 0); if (y->type == A_NUMERIC) y = make_unary(mpl, O_CVTLOG, y, A_LOGICAL, 0); if (y->type != A_LOGICAL) error_following(mpl, opstr); x = make_binary(mpl, O_OR, x, y, A_LOGICAL, 0); } else break; } return x; } /*---------------------------------------------------------------------- -- set_statement - parse set statement. -- -- This routine parses set statement using the syntax: -- -- ::= set -- ; -- ::= -- ::= -- ::= -- ::= -- ::= -- ::= , dimen -- ::= , within -- ::= , := -- ::= , default -- -- Commae in are optional and may be omitted anywhere. */ SET *set_statement(MPL *mpl) { SET *set; int dimen_used = 0; xassert(is_keyword(mpl, "set")); get_token(mpl /* set */); /* symbolic name must follow the keyword 'set' */ if (mpl->token == T_NAME) ; else if (is_reserved(mpl)) error(mpl, "invalid use of reserved keyword %s", mpl->image); else error(mpl, "symbolic name missing where expected"); /* there must be no other object with the same name */ if (avl_find_node(mpl->tree, mpl->image) != NULL) error(mpl, "%s multiply declared", mpl->image); /* create model set */ set = alloc(SET); set->name = dmp_get_atomv(mpl->pool, strlen(mpl->image)+1); strcpy(set->name, mpl->image); set->alias = NULL; set->dim = 0; set->domain = NULL; set->dimen = 0; set->within = NULL; set->assign = NULL; set->option = NULL; set->gadget = NULL; set->data = 0; set->array = NULL; get_token(mpl /* */); /* parse optional alias */ if (mpl->token == T_STRING) { set->alias = dmp_get_atomv(mpl->pool, strlen(mpl->image)+1); strcpy(set->alias, mpl->image); get_token(mpl /* */); } /* parse optional indexing expression */ if (mpl->token == T_LBRACE) { set->domain = indexing_expression(mpl); set->dim = domain_arity(mpl, set->domain); } /* include the set name in the symbolic names table */ { AVLNODE *node; node = avl_insert_node(mpl->tree, set->name); avl_set_node_type(node, A_SET); avl_set_node_link(node, (void *)set); } /* parse the list of optional attributes */ for (;;) { if (mpl->token == T_COMMA) get_token(mpl /* , */); else if (mpl->token == T_SEMICOLON) break; if (is_keyword(mpl, "dimen")) { /* dimension of set members */ int dimen; get_token(mpl /* dimen */); if (!(mpl->token == T_NUMBER && 1.0 <= mpl->value && mpl->value <= 20.0 && floor(mpl->value) == mpl->value)) error(mpl, "dimension must be integer between 1 and 20"); dimen = (int)(mpl->value + 0.5); if (dimen_used) error(mpl, "at most one dimension attribute allowed"); if (set->dimen > 0) error(mpl, "dimension %d conflicts with dimension %d alr" "eady determined", dimen, set->dimen); set->dimen = dimen; dimen_used = 1; get_token(mpl /* */); } else if (mpl->token == T_WITHIN || mpl->token == T_IN) { /* restricting superset */ WITHIN *within, *temp; if (mpl->token == T_IN && !mpl->as_within) { warning(mpl, "keyword in understood as within"); mpl->as_within = 1; } get_token(mpl /* within */); /* create new restricting superset list entry and append it to the within-list */ within = alloc(WITHIN); within->code = NULL; within->next = NULL; if (set->within == NULL) set->within = within; else { for (temp = set->within; temp->next != NULL; temp = temp->next); temp->next = within; } /* parse an expression that follows 'within' */ within->code = expression_9(mpl); if (within->code->type != A_ELEMSET) error(mpl, "expression following within has invalid type" ); xassert(within->code->dim > 0); /* check/set dimension of set members */ if (set->dimen == 0) set->dimen = within->code->dim; if (set->dimen != within->code->dim) error(mpl, "set expression following within must have di" "mension %d rather than %d", set->dimen, within->code->dim); } else if (mpl->token == T_ASSIGN) { /* assignment expression */ if (!(set->assign == NULL && set->option == NULL && set->gadget == NULL)) err: error(mpl, "at most one := or default/data allowed"); get_token(mpl /* := */); /* parse an expression that follows ':=' */ set->assign = expression_9(mpl); if (set->assign->type != A_ELEMSET) error(mpl, "expression following := has invalid type"); xassert(set->assign->dim > 0); /* check/set dimension of set members */ if (set->dimen == 0) set->dimen = set->assign->dim; if (set->dimen != set->assign->dim) error(mpl, "set expression following := must have dimens" "ion %d rather than %d", set->dimen, set->assign->dim); } else if (is_keyword(mpl, "default")) { /* expression for default value */ if (!(set->assign == NULL && set->option == NULL)) goto err; get_token(mpl /* := */); /* parse an expression that follows 'default' */ set->option = expression_9(mpl); if (set->option->type != A_ELEMSET) error(mpl, "expression following default has invalid typ" "e"); xassert(set->option->dim > 0); /* check/set dimension of set members */ if (set->dimen == 0) set->dimen = set->option->dim; if (set->dimen != set->option->dim) error(mpl, "set expression following default must have d" "imension %d rather than %d", set->dimen, set->option->dim); } #if 1 /* 12/XII-2008 */ else if (is_keyword(mpl, "data")) { /* gadget to initialize the set by data from plain set */ GADGET *gadget; AVLNODE *node; int i, k, fff[20]; if (!(set->assign == NULL && set->gadget == NULL)) goto err; get_token(mpl /* data */); set->gadget = gadget = alloc(GADGET); /* set name must follow the keyword 'data' */ if (mpl->token == T_NAME) ; else if (is_reserved(mpl)) error(mpl, "invalid use of reserved keyword %s", mpl->image); else error(mpl, "set name missing where expected"); /* find the set in the symbolic name table */ node = avl_find_node(mpl->tree, mpl->image); if (node == NULL) error(mpl, "%s not defined", mpl->image); if (avl_get_node_type(node) != A_SET) err1: error(mpl, "%s not a plain set", mpl->image); gadget->set = avl_get_node_link(node); if (gadget->set->dim != 0) goto err1; if (gadget->set == set) error(mpl, "set cannot be initialized by itself"); /* check and set dimensions */ if (set->dim >= gadget->set->dimen) err2: error(mpl, "dimension of %s too small", mpl->image); if (set->dimen == 0) set->dimen = gadget->set->dimen - set->dim; if (set->dim + set->dimen > gadget->set->dimen) goto err2; else if (set->dim + set->dimen < gadget->set->dimen) error(mpl, "dimension of %s too big", mpl->image); get_token(mpl /* set name */); /* left parenthesis must follow the set name */ if (mpl->token == T_LEFT) get_token(mpl /* ( */); else error(mpl, "left parenthesis missing where expected"); /* parse permutation of component numbers */ for (k = 0; k < gadget->set->dimen; k++) fff[k] = 0; k = 0; for (;;) { if (mpl->token != T_NUMBER) error(mpl, "component number missing where expected"); if (str2int(mpl->image, &i) != 0) err3: error(mpl, "component number must be integer between " "1 and %d", gadget->set->dimen); if (!(1 <= i && i <= gadget->set->dimen)) goto err3; if (fff[i-1] != 0) error(mpl, "component %d multiply specified", i); gadget->ind[k++] = i, fff[i-1] = 1; xassert(k <= gadget->set->dimen); get_token(mpl /* number */); if (mpl->token == T_COMMA) get_token(mpl /* , */); else if (mpl->token == T_RIGHT) break; else error(mpl, "syntax error in data attribute"); } if (k < gadget->set->dimen) error(mpl, "there are must be %d components rather than " "%d", gadget->set->dimen, k); get_token(mpl /* ) */); } #endif else error(mpl, "syntax error in set statement"); } /* close the domain scope */ if (set->domain != NULL) close_scope(mpl, set->domain); /* if dimension of set members is still unknown, set it to 1 */ if (set->dimen == 0) set->dimen = 1; /* the set statement has been completely parsed */ xassert(mpl->token == T_SEMICOLON); get_token(mpl /* ; */); return set; } /*---------------------------------------------------------------------- -- parameter_statement - parse parameter statement. -- -- This routine parses parameter statement using the syntax: -- -- ::= param -- ; -- ::= -- ::= -- ::= -- ::= -- ::= -- ::= , integer -- ::= , binary -- ::= , symbolic -- ::= , -- ::= , in -- ::= , := -- ::= , default -- ::= < | <= | = | == | >= | > | <> | != -- -- Commae in are optional and may be omitted anywhere. */ PARAMETER *parameter_statement(MPL *mpl) { PARAMETER *par; int integer_used = 0, binary_used = 0, symbolic_used = 0; xassert(is_keyword(mpl, "param")); get_token(mpl /* param */); /* symbolic name must follow the keyword 'param' */ if (mpl->token == T_NAME) ; else if (is_reserved(mpl)) error(mpl, "invalid use of reserved keyword %s", mpl->image); else error(mpl, "symbolic name missing where expected"); /* there must be no other object with the same name */ if (avl_find_node(mpl->tree, mpl->image) != NULL) error(mpl, "%s multiply declared", mpl->image); /* create model parameter */ par = alloc(PARAMETER); par->name = dmp_get_atomv(mpl->pool, strlen(mpl->image)+1); strcpy(par->name, mpl->image); par->alias = NULL; par->dim = 0; par->domain = NULL; par->type = A_NUMERIC; par->cond = NULL; par->in = NULL; par->assign = NULL; par->option = NULL; par->data = 0; par->defval = NULL; par->array = NULL; get_token(mpl /* */); /* parse optional alias */ if (mpl->token == T_STRING) { par->alias = dmp_get_atomv(mpl->pool, strlen(mpl->image)+1); strcpy(par->alias, mpl->image); get_token(mpl /* */); } /* parse optional indexing expression */ if (mpl->token == T_LBRACE) { par->domain = indexing_expression(mpl); par->dim = domain_arity(mpl, par->domain); } /* include the parameter name in the symbolic names table */ { AVLNODE *node; node = avl_insert_node(mpl->tree, par->name); avl_set_node_type(node, A_PARAMETER); avl_set_node_link(node, (void *)par); } /* parse the list of optional attributes */ for (;;) { if (mpl->token == T_COMMA) get_token(mpl /* , */); else if (mpl->token == T_SEMICOLON) break; if (is_keyword(mpl, "integer")) { if (integer_used) error(mpl, "at most one integer allowed"); if (par->type == A_SYMBOLIC) error(mpl, "symbolic parameter cannot be integer"); if (par->type != A_BINARY) par->type = A_INTEGER; integer_used = 1; get_token(mpl /* integer */); } else if (is_keyword(mpl, "binary")) bin: { if (binary_used) error(mpl, "at most one binary allowed"); if (par->type == A_SYMBOLIC) error(mpl, "symbolic parameter cannot be binary"); par->type = A_BINARY; binary_used = 1; get_token(mpl /* binary */); } else if (is_keyword(mpl, "logical")) { if (!mpl->as_binary) { warning(mpl, "keyword logical understood as binary"); mpl->as_binary = 1; } goto bin; } else if (is_keyword(mpl, "symbolic")) { if (symbolic_used) error(mpl, "at most one symbolic allowed"); if (par->type != A_NUMERIC) error(mpl, "integer or binary parameter cannot be symbol" "ic"); /* the parameter may be referenced from expressions given in the same parameter declaration, so its type must be completed before parsing that expressions */ if (!(par->cond == NULL && par->in == NULL && par->assign == NULL && par->option == NULL)) error(mpl, "keyword symbolic must precede any other para" "meter attributes"); par->type = A_SYMBOLIC; symbolic_used = 1; get_token(mpl /* symbolic */); } else if (mpl->token == T_LT || mpl->token == T_LE || mpl->token == T_EQ || mpl->token == T_GE || mpl->token == T_GT || mpl->token == T_NE) { /* restricting condition */ CONDITION *cond, *temp; char opstr[8]; /* create new restricting condition list entry and append it to the conditions list */ cond = alloc(CONDITION); switch (mpl->token) { case T_LT: cond->rho = O_LT, strcpy(opstr, mpl->image); break; case T_LE: cond->rho = O_LE, strcpy(opstr, mpl->image); break; case T_EQ: cond->rho = O_EQ, strcpy(opstr, mpl->image); break; case T_GE: cond->rho = O_GE, strcpy(opstr, mpl->image); break; case T_GT: cond->rho = O_GT, strcpy(opstr, mpl->image); break; case T_NE: cond->rho = O_NE, strcpy(opstr, mpl->image); break; default: xassert(mpl->token != mpl->token); } xassert(strlen(opstr) < sizeof(opstr)); cond->code = NULL; cond->next = NULL; if (par->cond == NULL) par->cond = cond; else { for (temp = par->cond; temp->next != NULL; temp = temp->next); temp->next = cond; } #if 0 /* 13/VIII-2008 */ if (par->type == A_SYMBOLIC && !(cond->rho == O_EQ || cond->rho == O_NE)) error(mpl, "inequality restriction not allowed"); #endif get_token(mpl /* rho */); /* parse an expression that follows relational operator */ cond->code = expression_5(mpl); if (!(cond->code->type == A_NUMERIC || cond->code->type == A_SYMBOLIC)) error(mpl, "expression following %s has invalid type", opstr); xassert(cond->code->dim == 0); /* convert to the parameter type, if necessary */ if (par->type != A_SYMBOLIC && cond->code->type == A_SYMBOLIC) cond->code = make_unary(mpl, O_CVTNUM, cond->code, A_NUMERIC, 0); if (par->type == A_SYMBOLIC && cond->code->type != A_SYMBOLIC) cond->code = make_unary(mpl, O_CVTSYM, cond->code, A_SYMBOLIC, 0); } else if (mpl->token == T_IN || mpl->token == T_WITHIN) { /* restricting superset */ WITHIN *in, *temp; if (mpl->token == T_WITHIN && !mpl->as_in) { warning(mpl, "keyword within understood as in"); mpl->as_in = 1; } get_token(mpl /* in */); /* create new restricting superset list entry and append it to the in-list */ in = alloc(WITHIN); in->code = NULL; in->next = NULL; if (par->in == NULL) par->in = in; else { for (temp = par->in; temp->next != NULL; temp = temp->next); temp->next = in; } /* parse an expression that follows 'in' */ in->code = expression_9(mpl); if (in->code->type != A_ELEMSET) error(mpl, "expression following in has invalid type"); xassert(in->code->dim > 0); if (in->code->dim != 1) error(mpl, "set expression following in must have dimens" "ion 1 rather than %d", in->code->dim); } else if (mpl->token == T_ASSIGN) { /* assignment expression */ if (!(par->assign == NULL && par->option == NULL)) err: error(mpl, "at most one := or default allowed"); get_token(mpl /* := */); /* parse an expression that follows ':=' */ par->assign = expression_5(mpl); /* the expression must be of numeric/symbolic type */ if (!(par->assign->type == A_NUMERIC || par->assign->type == A_SYMBOLIC)) error(mpl, "expression following := has invalid type"); xassert(par->assign->dim == 0); /* convert to the parameter type, if necessary */ if (par->type != A_SYMBOLIC && par->assign->type == A_SYMBOLIC) par->assign = make_unary(mpl, O_CVTNUM, par->assign, A_NUMERIC, 0); if (par->type == A_SYMBOLIC && par->assign->type != A_SYMBOLIC) par->assign = make_unary(mpl, O_CVTSYM, par->assign, A_SYMBOLIC, 0); } else if (is_keyword(mpl, "default")) { /* expression for default value */ if (!(par->assign == NULL && par->option == NULL)) goto err; get_token(mpl /* default */); /* parse an expression that follows 'default' */ par->option = expression_5(mpl); if (!(par->option->type == A_NUMERIC || par->option->type == A_SYMBOLIC)) error(mpl, "expression following default has invalid typ" "e"); xassert(par->option->dim == 0); /* convert to the parameter type, if necessary */ if (par->type != A_SYMBOLIC && par->option->type == A_SYMBOLIC) par->option = make_unary(mpl, O_CVTNUM, par->option, A_NUMERIC, 0); if (par->type == A_SYMBOLIC && par->option->type != A_SYMBOLIC) par->option = make_unary(mpl, O_CVTSYM, par->option, A_SYMBOLIC, 0); } else error(mpl, "syntax error in parameter statement"); } /* close the domain scope */ if (par->domain != NULL) close_scope(mpl, par->domain); /* the parameter statement has been completely parsed */ xassert(mpl->token == T_SEMICOLON); get_token(mpl /* ; */); return par; } /*---------------------------------------------------------------------- -- variable_statement - parse variable statement. -- -- This routine parses variable statement using the syntax: -- -- ::= var -- ; -- ::= -- ::= -- ::= -- ::= -- ::= -- ::= , integer -- ::= , binary -- ::= , -- ::= >= | <= | = | == -- -- Commae in are optional and may be omitted anywhere. */ VARIABLE *variable_statement(MPL *mpl) { VARIABLE *var; int integer_used = 0, binary_used = 0; xassert(is_keyword(mpl, "var")); if (mpl->flag_s) error(mpl, "variable statement must precede solve statement"); get_token(mpl /* var */); /* symbolic name must follow the keyword 'var' */ if (mpl->token == T_NAME) ; else if (is_reserved(mpl)) error(mpl, "invalid use of reserved keyword %s", mpl->image); else error(mpl, "symbolic name missing where expected"); /* there must be no other object with the same name */ if (avl_find_node(mpl->tree, mpl->image) != NULL) error(mpl, "%s multiply declared", mpl->image); /* create model variable */ var = alloc(VARIABLE); var->name = dmp_get_atomv(mpl->pool, strlen(mpl->image)+1); strcpy(var->name, mpl->image); var->alias = NULL; var->dim = 0; var->domain = NULL; var->type = A_NUMERIC; var->lbnd = NULL; var->ubnd = NULL; var->array = NULL; get_token(mpl /* */); /* parse optional alias */ if (mpl->token == T_STRING) { var->alias = dmp_get_atomv(mpl->pool, strlen(mpl->image)+1); strcpy(var->alias, mpl->image); get_token(mpl /* */); } /* parse optional indexing expression */ if (mpl->token == T_LBRACE) { var->domain = indexing_expression(mpl); var->dim = domain_arity(mpl, var->domain); } /* include the variable name in the symbolic names table */ { AVLNODE *node; node = avl_insert_node(mpl->tree, var->name); avl_set_node_type(node, A_VARIABLE); avl_set_node_link(node, (void *)var); } /* parse the list of optional attributes */ for (;;) { if (mpl->token == T_COMMA) get_token(mpl /* , */); else if (mpl->token == T_SEMICOLON) break; if (is_keyword(mpl, "integer")) { if (integer_used) error(mpl, "at most one integer allowed"); if (var->type != A_BINARY) var->type = A_INTEGER; integer_used = 1; get_token(mpl /* integer */); } else if (is_keyword(mpl, "binary")) bin: { if (binary_used) error(mpl, "at most one binary allowed"); var->type = A_BINARY; binary_used = 1; get_token(mpl /* binary */); } else if (is_keyword(mpl, "logical")) { if (!mpl->as_binary) { warning(mpl, "keyword logical understood as binary"); mpl->as_binary = 1; } goto bin; } else if (is_keyword(mpl, "symbolic")) error(mpl, "variable cannot be symbolic"); else if (mpl->token == T_GE) { /* lower bound */ if (var->lbnd != NULL) { if (var->lbnd == var->ubnd) error(mpl, "both fixed value and lower bound not allo" "wed"); else error(mpl, "at most one lower bound allowed"); } get_token(mpl /* >= */); /* parse an expression that specifies the lower bound */ var->lbnd = expression_5(mpl); if (var->lbnd->type == A_SYMBOLIC) var->lbnd = make_unary(mpl, O_CVTNUM, var->lbnd, A_NUMERIC, 0); if (var->lbnd->type != A_NUMERIC) error(mpl, "expression following >= has invalid type"); xassert(var->lbnd->dim == 0); } else if (mpl->token == T_LE) { /* upper bound */ if (var->ubnd != NULL) { if (var->ubnd == var->lbnd) error(mpl, "both fixed value and upper bound not allo" "wed"); else error(mpl, "at most one upper bound allowed"); } get_token(mpl /* <= */); /* parse an expression that specifies the upper bound */ var->ubnd = expression_5(mpl); if (var->ubnd->type == A_SYMBOLIC) var->ubnd = make_unary(mpl, O_CVTNUM, var->ubnd, A_NUMERIC, 0); if (var->ubnd->type != A_NUMERIC) error(mpl, "expression following <= has invalid type"); xassert(var->ubnd->dim == 0); } else if (mpl->token == T_EQ) { /* fixed value */ char opstr[8]; if (!(var->lbnd == NULL && var->ubnd == NULL)) { if (var->lbnd == var->ubnd) error(mpl, "at most one fixed value allowed"); else if (var->lbnd != NULL) error(mpl, "both lower bound and fixed value not allo" "wed"); else error(mpl, "both upper bound and fixed value not allo" "wed"); } strcpy(opstr, mpl->image); xassert(strlen(opstr) < sizeof(opstr)); get_token(mpl /* = | == */); /* parse an expression that specifies the fixed value */ var->lbnd = expression_5(mpl); if (var->lbnd->type == A_SYMBOLIC) var->lbnd = make_unary(mpl, O_CVTNUM, var->lbnd, A_NUMERIC, 0); if (var->lbnd->type != A_NUMERIC) error(mpl, "expression following %s has invalid type", opstr); xassert(var->lbnd->dim == 0); /* indicate that the variable is fixed, not bounded */ var->ubnd = var->lbnd; } else if (mpl->token == T_LT || mpl->token == T_GT || mpl->token == T_NE) error(mpl, "strict bound not allowed"); else error(mpl, "syntax error in variable statement"); } /* close the domain scope */ if (var->domain != NULL) close_scope(mpl, var->domain); /* the variable statement has been completely parsed */ xassert(mpl->token == T_SEMICOLON); get_token(mpl /* ; */); return var; } /*---------------------------------------------------------------------- -- constraint_statement - parse constraint statement. -- -- This routine parses constraint statement using the syntax: -- -- ::= -- : ; -- ::= -- ::= subject to -- ::= subj to -- ::= s.t. -- ::= -- ::= -- ::= -- ::= -- ::= , >= -- ::= , <= -- ::= , = -- ::= , <= , <= -- ::= , >= , >= -- ::= -- -- Commae in are optional and may be omitted anywhere. */ CONSTRAINT *constraint_statement(MPL *mpl) { CONSTRAINT *con; CODE *first, *second, *third; int rho; char opstr[8]; if (mpl->flag_s) error(mpl, "constraint statement must precede solve statement") ; if (is_keyword(mpl, "subject")) { get_token(mpl /* subject */); if (!is_keyword(mpl, "to")) error(mpl, "keyword subject to incomplete"); get_token(mpl /* to */); } else if (is_keyword(mpl, "subj")) { get_token(mpl /* subj */); if (!is_keyword(mpl, "to")) error(mpl, "keyword subj to incomplete"); get_token(mpl /* to */); } else if (mpl->token == T_SPTP) get_token(mpl /* s.t. */); /* the current token must be symbolic name of constraint */ if (mpl->token == T_NAME) ; else if (is_reserved(mpl)) error(mpl, "invalid use of reserved keyword %s", mpl->image); else error(mpl, "symbolic name missing where expected"); /* there must be no other object with the same name */ if (avl_find_node(mpl->tree, mpl->image) != NULL) error(mpl, "%s multiply declared", mpl->image); /* create model constraint */ con = alloc(CONSTRAINT); con->name = dmp_get_atomv(mpl->pool, strlen(mpl->image)+1); strcpy(con->name, mpl->image); con->alias = NULL; con->dim = 0; con->domain = NULL; con->type = A_CONSTRAINT; con->code = NULL; con->lbnd = NULL; con->ubnd = NULL; con->array = NULL; get_token(mpl /* */); /* parse optional alias */ if (mpl->token == T_STRING) { con->alias = dmp_get_atomv(mpl->pool, strlen(mpl->image)+1); strcpy(con->alias, mpl->image); get_token(mpl /* */); } /* parse optional indexing expression */ if (mpl->token == T_LBRACE) { con->domain = indexing_expression(mpl); con->dim = domain_arity(mpl, con->domain); } /* include the constraint name in the symbolic names table */ { AVLNODE *node; node = avl_insert_node(mpl->tree, con->name); avl_set_node_type(node, A_CONSTRAINT); avl_set_node_link(node, (void *)con); } /* the colon must precede the first expression */ if (mpl->token != T_COLON) error(mpl, "colon missing where expected"); get_token(mpl /* : */); /* parse the first expression */ first = expression_5(mpl); if (first->type == A_SYMBOLIC) first = make_unary(mpl, O_CVTNUM, first, A_NUMERIC, 0); if (!(first->type == A_NUMERIC || first->type == A_FORMULA)) error(mpl, "expression following colon has invalid type"); xassert(first->dim == 0); /* relational operator must follow the first expression */ if (mpl->token == T_COMMA) get_token(mpl /* , */); switch (mpl->token) { case T_LE: case T_GE: case T_EQ: break; case T_LT: case T_GT: case T_NE: error(mpl, "strict inequality not allowed"); case T_SEMICOLON: error(mpl, "constraint must be equality or inequality"); default: goto err; } rho = mpl->token; strcpy(opstr, mpl->image); xassert(strlen(opstr) < sizeof(opstr)); get_token(mpl /* rho */); /* parse the second expression */ second = expression_5(mpl); if (second->type == A_SYMBOLIC) second = make_unary(mpl, O_CVTNUM, second, A_NUMERIC, 0); if (!(second->type == A_NUMERIC || second->type == A_FORMULA)) error(mpl, "expression following %s has invalid type", opstr); xassert(second->dim == 0); /* check a token that follow the second expression */ if (mpl->token == T_COMMA) { get_token(mpl /* , */); if (mpl->token == T_SEMICOLON) goto err; } if (mpl->token == T_LT || mpl->token == T_LE || mpl->token == T_EQ || mpl->token == T_GE || mpl->token == T_GT || mpl->token == T_NE) { /* it is another relational operator, therefore the constraint is double inequality */ if (rho == T_EQ || mpl->token != rho) error(mpl, "double inequality must be ... <= ... <= ... or " "... >= ... >= ..."); /* the first expression cannot be linear form */ if (first->type == A_FORMULA) error(mpl, "leftmost expression in double inequality cannot" " be linear form"); get_token(mpl /* rho */); /* parse the third expression */ third = expression_5(mpl); if (third->type == A_SYMBOLIC) third = make_unary(mpl, O_CVTNUM, second, A_NUMERIC, 0); if (!(third->type == A_NUMERIC || third->type == A_FORMULA)) error(mpl, "rightmost expression in double inequality const" "raint has invalid type"); xassert(third->dim == 0); /* the third expression also cannot be linear form */ if (third->type == A_FORMULA) error(mpl, "rightmost expression in double inequality canno" "t be linear form"); } else { /* the constraint is equality or single inequality */ third = NULL; } /* close the domain scope */ if (con->domain != NULL) close_scope(mpl, con->domain); /* convert all expressions to linear form, if necessary */ if (first->type != A_FORMULA) first = make_unary(mpl, O_CVTLFM, first, A_FORMULA, 0); if (second->type != A_FORMULA) second = make_unary(mpl, O_CVTLFM, second, A_FORMULA, 0); if (third != NULL) third = make_unary(mpl, O_CVTLFM, third, A_FORMULA, 0); /* arrange expressions in the constraint */ if (third == NULL) { /* the constraint is equality or single inequality */ switch (rho) { case T_LE: /* first <= second */ con->code = first; con->lbnd = NULL; con->ubnd = second; break; case T_GE: /* first >= second */ con->code = first; con->lbnd = second; con->ubnd = NULL; break; case T_EQ: /* first = second */ con->code = first; con->lbnd = second; con->ubnd = second; break; default: xassert(rho != rho); } } else { /* the constraint is double inequality */ switch (rho) { case T_LE: /* first <= second <= third */ con->code = second; con->lbnd = first; con->ubnd = third; break; case T_GE: /* first >= second >= third */ con->code = second; con->lbnd = third; con->ubnd = first; break; default: xassert(rho != rho); } } /* the constraint statement has been completely parsed */ if (mpl->token != T_SEMICOLON) err: error(mpl, "syntax error in constraint statement"); get_token(mpl /* ; */); return con; } /*---------------------------------------------------------------------- -- objective_statement - parse objective statement. -- -- This routine parses objective statement using the syntax: -- -- ::= : -- ; -- ::= minimize -- ::= maximize -- ::= -- ::= -- ::= -- ::= -- ::= */ CONSTRAINT *objective_statement(MPL *mpl) { CONSTRAINT *obj; int type; if (is_keyword(mpl, "minimize")) type = A_MINIMIZE; else if (is_keyword(mpl, "maximize")) type = A_MAXIMIZE; else xassert(mpl != mpl); if (mpl->flag_s) error(mpl, "objective statement must precede solve statement"); get_token(mpl /* minimize | maximize */); /* symbolic name must follow the verb 'minimize' or 'maximize' */ if (mpl->token == T_NAME) ; else if (is_reserved(mpl)) error(mpl, "invalid use of reserved keyword %s", mpl->image); else error(mpl, "symbolic name missing where expected"); /* there must be no other object with the same name */ if (avl_find_node(mpl->tree, mpl->image) != NULL) error(mpl, "%s multiply declared", mpl->image); /* create model objective */ obj = alloc(CONSTRAINT); obj->name = dmp_get_atomv(mpl->pool, strlen(mpl->image)+1); strcpy(obj->name, mpl->image); obj->alias = NULL; obj->dim = 0; obj->domain = NULL; obj->type = type; obj->code = NULL; obj->lbnd = NULL; obj->ubnd = NULL; obj->array = NULL; get_token(mpl /* */); /* parse optional alias */ if (mpl->token == T_STRING) { obj->alias = dmp_get_atomv(mpl->pool, strlen(mpl->image)+1); strcpy(obj->alias, mpl->image); get_token(mpl /* */); } /* parse optional indexing expression */ if (mpl->token == T_LBRACE) { obj->domain = indexing_expression(mpl); obj->dim = domain_arity(mpl, obj->domain); } /* include the constraint name in the symbolic names table */ { AVLNODE *node; node = avl_insert_node(mpl->tree, obj->name); avl_set_node_type(node, A_CONSTRAINT); avl_set_node_link(node, (void *)obj); } /* the colon must precede the objective expression */ if (mpl->token != T_COLON) error(mpl, "colon missing where expected"); get_token(mpl /* : */); /* parse the objective expression */ obj->code = expression_5(mpl); if (obj->code->type == A_SYMBOLIC) obj->code = make_unary(mpl, O_CVTNUM, obj->code, A_NUMERIC, 0); if (obj->code->type == A_NUMERIC) obj->code = make_unary(mpl, O_CVTLFM, obj->code, A_FORMULA, 0); if (obj->code->type != A_FORMULA) error(mpl, "expression following colon has invalid type"); xassert(obj->code->dim == 0); /* close the domain scope */ if (obj->domain != NULL) close_scope(mpl, obj->domain); /* the objective statement has been completely parsed */ if (mpl->token != T_SEMICOLON) error(mpl, "syntax error in objective statement"); get_token(mpl /* ; */); return obj; } #if 1 /* 11/II-2008 */ /*********************************************************************** * table_statement - parse table statement * * This routine parses table statement using the syntax: * * ::= *
::= * * ::= * table
IN : * [ ] , ; * ::= * ::= * ::= * ::= * ::= , * ::= * ::= <- * ::= * ::= , * ::= * ::= , * ::= * ::= ~ * * ::= * table
OUT : * ; * ::= * ::= * ::= , * ::= * ::= ~ */ TABLE *table_statement(MPL *mpl) { TABLE *tab; TABARG *last_arg, *arg; TABFLD *last_fld, *fld; TABIN *last_in, *in; TABOUT *last_out, *out; AVLNODE *node; int nflds; char name[MAX_LENGTH+1]; xassert(is_keyword(mpl, "table")); get_token(mpl /* solve */); /* symbolic name must follow the keyword table */ if (mpl->token == T_NAME) ; else if (is_reserved(mpl)) error(mpl, "invalid use of reserved keyword %s", mpl->image); else error(mpl, "symbolic name missing where expected"); /* there must be no other object with the same name */ if (avl_find_node(mpl->tree, mpl->image) != NULL) error(mpl, "%s multiply declared", mpl->image); /* create data table */ tab = alloc(TABLE); tab->name = dmp_get_atomv(mpl->pool, strlen(mpl->image)+1); strcpy(tab->name, mpl->image); get_token(mpl /* */); /* parse optional alias */ if (mpl->token == T_STRING) { tab->alias = dmp_get_atomv(mpl->pool, strlen(mpl->image)+1); strcpy(tab->alias, mpl->image); get_token(mpl /* */); } else tab->alias = NULL; /* parse optional indexing expression */ if (mpl->token == T_LBRACE) { /* this is output table */ tab->type = A_OUTPUT; tab->u.out.domain = indexing_expression(mpl); if (!is_keyword(mpl, "OUT")) error(mpl, "keyword OUT missing where expected"); get_token(mpl /* OUT */); } else { /* this is input table */ tab->type = A_INPUT; if (!is_keyword(mpl, "IN")) error(mpl, "keyword IN missing where expected"); get_token(mpl /* IN */); } /* parse argument list */ tab->arg = last_arg = NULL; for (;;) { /* create argument list entry */ arg = alloc(TABARG); /* parse argument expression */ if (mpl->token == T_COMMA || mpl->token == T_COLON || mpl->token == T_SEMICOLON) error(mpl, "argument expression missing where expected"); arg->code = expression_5(mpl); /* convert the result to symbolic type, if necessary */ if (arg->code->type == A_NUMERIC) arg->code = make_unary(mpl, O_CVTSYM, arg->code, A_SYMBOLIC, 0); /* check that now the result is of symbolic type */ if (arg->code->type != A_SYMBOLIC) error(mpl, "argument expression has invalid type"); /* add the entry to the end of the list */ arg->next = NULL; if (last_arg == NULL) tab->arg = arg; else last_arg->next = arg; last_arg = arg; /* argument expression has been parsed */ if (mpl->token == T_COMMA) get_token(mpl /* , */); else if (mpl->token == T_COLON || mpl->token == T_SEMICOLON) break; } xassert(tab->arg != NULL); /* argument list must end with colon */ if (mpl->token == T_COLON) get_token(mpl /* : */); else error(mpl, "colon missing where expected"); /* parse specific part of the table statement */ switch (tab->type) { case A_INPUT: goto input_table; case A_OUTPUT: goto output_table; default: xassert(tab != tab); } input_table: /* parse optional set name */ if (mpl->token == T_NAME) { node = avl_find_node(mpl->tree, mpl->image); if (node == NULL) error(mpl, "%s not defined", mpl->image); if (avl_get_node_type(node) != A_SET) error(mpl, "%s not a set", mpl->image); tab->u.in.set = (SET *)avl_get_node_link(node); if (tab->u.in.set->assign != NULL) error(mpl, "%s needs no data", mpl->image); if (tab->u.in.set->dim != 0) error(mpl, "%s must be a simple set", mpl->image); get_token(mpl /* */); if (mpl->token == T_INPUT) get_token(mpl /* <- */); else error(mpl, "delimiter <- missing where expected"); } else if (is_reserved(mpl)) error(mpl, "invalid use of reserved keyword %s", mpl->image); else tab->u.in.set = NULL; /* parse field list */ tab->u.in.fld = last_fld = NULL; nflds = 0; if (mpl->token == T_LBRACKET) get_token(mpl /* [ */); else error(mpl, "field list missing where expected"); for (;;) { /* create field list entry */ fld = alloc(TABFLD); /* parse field name */ if (mpl->token == T_NAME) ; else if (is_reserved(mpl)) error(mpl, "invalid use of reserved keyword %s", mpl->image); else error(mpl, "field name missing where expected"); fld->name = dmp_get_atomv(mpl->pool, strlen(mpl->image)+1); strcpy(fld->name, mpl->image); get_token(mpl /* */); /* add the entry to the end of the list */ fld->next = NULL; if (last_fld == NULL) tab->u.in.fld = fld; else last_fld->next = fld; last_fld = fld; nflds++; /* field name has been parsed */ if (mpl->token == T_COMMA) get_token(mpl /* , */); else if (mpl->token == T_RBRACKET) break; else error(mpl, "syntax error in field list"); } /* check that the set dimen is equal to the number of fields */ if (tab->u.in.set != NULL && tab->u.in.set->dimen != nflds) error(mpl, "there must be %d field%s rather than %d", tab->u.in.set->dimen, tab->u.in.set->dimen == 1 ? "" : "s", nflds); get_token(mpl /* ] */); /* parse optional input list */ tab->u.in.list = last_in = NULL; while (mpl->token == T_COMMA) { get_token(mpl /* , */); /* create input list entry */ in = alloc(TABIN); /* parse parameter name */ if (mpl->token == T_NAME) ; else if (is_reserved(mpl)) error(mpl, "invalid use of reserved keyword %s", mpl->image); else error(mpl, "parameter name missing where expected"); node = avl_find_node(mpl->tree, mpl->image); if (node == NULL) error(mpl, "%s not defined", mpl->image); if (avl_get_node_type(node) != A_PARAMETER) error(mpl, "%s not a parameter", mpl->image); in->par = (PARAMETER *)avl_get_node_link(node); if (in->par->dim != nflds) error(mpl, "%s must have %d subscript%s rather than %d", mpl->image, nflds, nflds == 1 ? "" : "s", in->par->dim); if (in->par->assign != NULL) error(mpl, "%s needs no data", mpl->image); get_token(mpl /* */); /* parse optional field name */ if (mpl->token == T_TILDE) { get_token(mpl /* ~ */); /* parse field name */ if (mpl->token == T_NAME) ; else if (is_reserved(mpl)) error(mpl, "invalid use of reserved keyword %s", mpl->image); else error(mpl, "field name missing where expected"); xassert(strlen(mpl->image) < sizeof(name)); strcpy(name, mpl->image); get_token(mpl /* */); } else { /* field name is the same as the parameter name */ xassert(strlen(in->par->name) < sizeof(name)); strcpy(name, in->par->name); } /* assign field name */ in->name = dmp_get_atomv(mpl->pool, strlen(name)+1); strcpy(in->name, name); /* add the entry to the end of the list */ in->next = NULL; if (last_in == NULL) tab->u.in.list = in; else last_in->next = in; last_in = in; } goto end_of_table; output_table: /* parse output list */ tab->u.out.list = last_out = NULL; for (;;) { /* create output list entry */ out = alloc(TABOUT); /* parse expression */ if (mpl->token == T_COMMA || mpl->token == T_SEMICOLON) error(mpl, "expression missing where expected"); if (mpl->token == T_NAME) { xassert(strlen(mpl->image) < sizeof(name)); strcpy(name, mpl->image); } else name[0] = '\0'; out->code = expression_5(mpl); /* parse optional field name */ if (mpl->token == T_TILDE) { get_token(mpl /* ~ */); /* parse field name */ if (mpl->token == T_NAME) ; else if (is_reserved(mpl)) error(mpl, "invalid use of reserved keyword %s", mpl->image); else error(mpl, "field name missing where expected"); xassert(strlen(mpl->image) < sizeof(name)); strcpy(name, mpl->image); get_token(mpl /* */); } /* assign field name */ if (name[0] == '\0') error(mpl, "field name required"); out->name = dmp_get_atomv(mpl->pool, strlen(name)+1); strcpy(out->name, name); /* add the entry to the end of the list */ out->next = NULL; if (last_out == NULL) tab->u.out.list = out; else last_out->next = out; last_out = out; /* output item has been parsed */ if (mpl->token == T_COMMA) get_token(mpl /* , */); else if (mpl->token == T_SEMICOLON) break; else error(mpl, "syntax error in output list"); } /* close the domain scope */ close_scope(mpl,tab->u.out.domain); end_of_table: /* the table statement must end with semicolon */ if (mpl->token != T_SEMICOLON) error(mpl, "syntax error in table statement"); get_token(mpl /* ; */); return tab; } #endif /*---------------------------------------------------------------------- -- solve_statement - parse solve statement. -- -- This routine parses solve statement using the syntax: -- -- ::= solve ; -- -- The solve statement can be used at most once. */ void *solve_statement(MPL *mpl) { xassert(is_keyword(mpl, "solve")); if (mpl->flag_s) error(mpl, "at most one solve statement allowed"); mpl->flag_s = 1; get_token(mpl /* solve */); /* semicolon must follow solve statement */ if (mpl->token != T_SEMICOLON) error(mpl, "syntax error in solve statement"); get_token(mpl /* ; */); return NULL; } /*---------------------------------------------------------------------- -- check_statement - parse check statement. -- -- This routine parses check statement using the syntax: -- -- ::= check : ; -- ::= -- ::= -- -- If is omitted, colon following it may also be omitted. */ CHECK *check_statement(MPL *mpl) { CHECK *chk; xassert(is_keyword(mpl, "check")); /* create check descriptor */ chk = alloc(CHECK); chk->domain = NULL; chk->code = NULL; get_token(mpl /* check */); /* parse optional indexing expression */ if (mpl->token == T_LBRACE) { chk->domain = indexing_expression(mpl); #if 0 if (mpl->token != T_COLON) error(mpl, "colon missing where expected"); #endif } /* skip optional colon */ if (mpl->token == T_COLON) get_token(mpl /* : */); /* parse logical expression */ chk->code = expression_13(mpl); if (chk->code->type != A_LOGICAL) error(mpl, "expression has invalid type"); xassert(chk->code->dim == 0); /* close the domain scope */ if (chk->domain != NULL) close_scope(mpl, chk->domain); /* the check statement has been completely parsed */ if (mpl->token != T_SEMICOLON) error(mpl, "syntax error in check statement"); get_token(mpl /* ; */); return chk; } #if 1 /* 15/V-2010 */ /*---------------------------------------------------------------------- -- display_statement - parse display statement. -- -- This routine parses display statement using the syntax: -- -- ::= display : ; -- ::= display ; -- ::= -- ::= -- ::= -- ::= , -- ::= -- ::= -- ::= [ ] -- ::= -- ::= [ ] -- ::= -- ::= [ ] -- ::= -- ::= [ ] -- ::= */ DISPLAY *display_statement(MPL *mpl) { DISPLAY *dpy; DISPLAY1 *entry, *last_entry; xassert(is_keyword(mpl, "display")); /* create display descriptor */ dpy = alloc(DISPLAY); dpy->domain = NULL; dpy->list = last_entry = NULL; get_token(mpl /* display */); /* parse optional indexing expression */ if (mpl->token == T_LBRACE) dpy->domain = indexing_expression(mpl); /* skip optional colon */ if (mpl->token == T_COLON) get_token(mpl /* : */); /* parse display list */ for (;;) { /* create new display entry */ entry = alloc(DISPLAY1); entry->type = 0; entry->next = NULL; /* and append it to the display list */ if (dpy->list == NULL) dpy->list = entry; else last_entry->next = entry; last_entry = entry; /* parse display entry */ if (mpl->token == T_NAME) { AVLNODE *node; int next_token; get_token(mpl /* */); next_token = mpl->token; unget_token(mpl); if (!(next_token == T_COMMA || next_token == T_SEMICOLON)) { /* symbolic name begins expression */ goto expr; } /* display entry is dummy index or model object */ node = avl_find_node(mpl->tree, mpl->image); if (node == NULL) error(mpl, "%s not defined", mpl->image); entry->type = avl_get_node_type(node); switch (avl_get_node_type(node)) { case A_INDEX: entry->u.slot = (DOMAIN_SLOT *)avl_get_node_link(node); break; case A_SET: entry->u.set = (SET *)avl_get_node_link(node); break; case A_PARAMETER: entry->u.par = (PARAMETER *)avl_get_node_link(node); break; case A_VARIABLE: entry->u.var = (VARIABLE *)avl_get_node_link(node); if (!mpl->flag_s) error(mpl, "invalid reference to variable %s above" " solve statement", entry->u.var->name); break; case A_CONSTRAINT: entry->u.con = (CONSTRAINT *)avl_get_node_link(node); if (!mpl->flag_s) error(mpl, "invalid reference to %s %s above solve" " statement", entry->u.con->type == A_CONSTRAINT ? "constraint" : "objective", entry->u.con->name); break; default: xassert(node != node); } get_token(mpl /* */); } else expr: { /* display entry is expression */ entry->type = A_EXPRESSION; entry->u.code = expression_13(mpl); } /* check a token that follows the entry parsed */ if (mpl->token == T_COMMA) get_token(mpl /* , */); else break; } /* close the domain scope */ if (dpy->domain != NULL) close_scope(mpl, dpy->domain); /* the display statement has been completely parsed */ if (mpl->token != T_SEMICOLON) error(mpl, "syntax error in display statement"); get_token(mpl /* ; */); return dpy; } #endif /*---------------------------------------------------------------------- -- printf_statement - parse printf statement. -- -- This routine parses print statement using the syntax: -- -- ::= ; -- ::= > ; -- ::= >> ; -- ::= printf : -- ::= printf -- ::= -- ::= -- ::= -- ::= -- ::= , -- ::= -- ::= */ PRINTF *printf_statement(MPL *mpl) { PRINTF *prt; PRINTF1 *entry, *last_entry; xassert(is_keyword(mpl, "printf")); /* create printf descriptor */ prt = alloc(PRINTF); prt->domain = NULL; prt->fmt = NULL; prt->list = last_entry = NULL; get_token(mpl /* printf */); /* parse optional indexing expression */ if (mpl->token == T_LBRACE) { prt->domain = indexing_expression(mpl); #if 0 if (mpl->token != T_COLON) error(mpl, "colon missing where expected"); #endif } /* skip optional colon */ if (mpl->token == T_COLON) get_token(mpl /* : */); /* parse expression for format string */ prt->fmt = expression_5(mpl); /* convert it to symbolic type, if necessary */ if (prt->fmt->type == A_NUMERIC) prt->fmt = make_unary(mpl, O_CVTSYM, prt->fmt, A_SYMBOLIC, 0); /* check that now the expression is of symbolic type */ if (prt->fmt->type != A_SYMBOLIC) error(mpl, "format expression has invalid type"); /* parse printf list */ while (mpl->token == T_COMMA) { get_token(mpl /* , */); /* create new printf entry */ entry = alloc(PRINTF1); entry->code = NULL; entry->next = NULL; /* and append it to the printf list */ if (prt->list == NULL) prt->list = entry; else last_entry->next = entry; last_entry = entry; /* parse printf entry */ entry->code = expression_9(mpl); if (!(entry->code->type == A_NUMERIC || entry->code->type == A_SYMBOLIC || entry->code->type == A_LOGICAL)) error(mpl, "only numeric, symbolic, or logical expression a" "llowed"); } /* close the domain scope */ if (prt->domain != NULL) close_scope(mpl, prt->domain); #if 1 /* 14/VII-2006 */ /* parse optional redirection */ prt->fname = NULL, prt->app = 0; if (mpl->token == T_GT || mpl->token == T_APPEND) { prt->app = (mpl->token == T_APPEND); get_token(mpl /* > or >> */); /* parse expression for file name string */ prt->fname = expression_5(mpl); /* convert it to symbolic type, if necessary */ if (prt->fname->type == A_NUMERIC) prt->fname = make_unary(mpl, O_CVTSYM, prt->fname, A_SYMBOLIC, 0); /* check that now the expression is of symbolic type */ if (prt->fname->type != A_SYMBOLIC) error(mpl, "file name expression has invalid type"); } #endif /* the printf statement has been completely parsed */ if (mpl->token != T_SEMICOLON) error(mpl, "syntax error in printf statement"); get_token(mpl /* ; */); return prt; } /*---------------------------------------------------------------------- -- for_statement - parse for statement. -- -- This routine parses for statement using the syntax: -- -- ::= for -- ::= for { } -- ::= -- ::= -- ::= -- ::= -- ::= -- ::= -- ::= */ FOR *for_statement(MPL *mpl) { FOR *fur; STATEMENT *stmt, *last_stmt; xassert(is_keyword(mpl, "for")); /* create for descriptor */ fur = alloc(FOR); fur->domain = NULL; fur->list = last_stmt = NULL; get_token(mpl /* for */); /* parse indexing expression */ if (mpl->token != T_LBRACE) error(mpl, "indexing expression missing where expected"); fur->domain = indexing_expression(mpl); /* skip optional colon */ if (mpl->token == T_COLON) get_token(mpl /* : */); /* parse for statement body */ if (mpl->token != T_LBRACE) { /* parse simple statement */ fur->list = simple_statement(mpl, 1); } else { /* parse compound statement */ get_token(mpl /* { */); while (mpl->token != T_RBRACE) { /* parse statement */ stmt = simple_statement(mpl, 1); /* and append it to the end of the statement list */ if (last_stmt == NULL) fur->list = stmt; else last_stmt->next = stmt; last_stmt = stmt; } get_token(mpl /* } */); } /* close the domain scope */ xassert(fur->domain != NULL); close_scope(mpl, fur->domain); /* the for statement has been completely parsed */ return fur; } /*---------------------------------------------------------------------- -- end_statement - parse end statement. -- -- This routine parses end statement using the syntax: -- -- ::= end ; */ void end_statement(MPL *mpl) { if (!mpl->flag_d && is_keyword(mpl, "end") || mpl->flag_d && is_literal(mpl, "end")) { get_token(mpl /* end */); if (mpl->token == T_SEMICOLON) get_token(mpl /* ; */); else warning(mpl, "no semicolon following end statement; missing" " semicolon inserted"); } else warning(mpl, "unexpected end of file; missing end statement in" "serted"); if (mpl->token != T_EOF) warning(mpl, "some text detected beyond end statement; text ig" "nored"); return; } /*---------------------------------------------------------------------- -- simple_statement - parse simple statement. -- -- This routine parses simple statement using the syntax: -- -- ::= -- ::= -- ::= -- ::= -- ::= -- ::= -- ::= -- ::= -- ::= -- ::= -- -- If the flag spec is set, some statements cannot be used. */ STATEMENT *simple_statement(MPL *mpl, int spec) { STATEMENT *stmt; stmt = alloc(STATEMENT); stmt->line = mpl->line; stmt->next = NULL; if (is_keyword(mpl, "set")) { if (spec) error(mpl, "set statement not allowed here"); stmt->type = A_SET; stmt->u.set = set_statement(mpl); } else if (is_keyword(mpl, "param")) { if (spec) error(mpl, "parameter statement not allowed here"); stmt->type = A_PARAMETER; stmt->u.par = parameter_statement(mpl); } else if (is_keyword(mpl, "var")) { if (spec) error(mpl, "variable statement not allowed here"); stmt->type = A_VARIABLE; stmt->u.var = variable_statement(mpl); } else if (is_keyword(mpl, "subject") || is_keyword(mpl, "subj") || mpl->token == T_SPTP) { if (spec) error(mpl, "constraint statement not allowed here"); stmt->type = A_CONSTRAINT; stmt->u.con = constraint_statement(mpl); } else if (is_keyword(mpl, "minimize") || is_keyword(mpl, "maximize")) { if (spec) error(mpl, "objective statement not allowed here"); stmt->type = A_CONSTRAINT; stmt->u.con = objective_statement(mpl); } #if 1 /* 11/II-2008 */ else if (is_keyword(mpl, "table")) { if (spec) error(mpl, "table statement not allowed here"); stmt->type = A_TABLE; stmt->u.tab = table_statement(mpl); } #endif else if (is_keyword(mpl, "solve")) { if (spec) error(mpl, "solve statement not allowed here"); stmt->type = A_SOLVE; stmt->u.slv = solve_statement(mpl); } else if (is_keyword(mpl, "check")) { stmt->type = A_CHECK; stmt->u.chk = check_statement(mpl); } else if (is_keyword(mpl, "display")) { stmt->type = A_DISPLAY; stmt->u.dpy = display_statement(mpl); } else if (is_keyword(mpl, "printf")) { stmt->type = A_PRINTF; stmt->u.prt = printf_statement(mpl); } else if (is_keyword(mpl, "for")) { stmt->type = A_FOR; stmt->u.fur = for_statement(mpl); } else if (mpl->token == T_NAME) { if (spec) error(mpl, "constraint statement not allowed here"); stmt->type = A_CONSTRAINT; stmt->u.con = constraint_statement(mpl); } else if (is_reserved(mpl)) error(mpl, "invalid use of reserved keyword %s", mpl->image); else error(mpl, "syntax error in model section"); return stmt; } /*---------------------------------------------------------------------- -- model_section - parse model section. -- -- This routine parses model section using the syntax: -- -- ::= -- ::= -- -- Parsing model section is terminated by either the keyword 'data', or -- the keyword 'end', or the end of file. */ void model_section(MPL *mpl) { STATEMENT *stmt, *last_stmt; xassert(mpl->model == NULL); last_stmt = NULL; while (!(mpl->token == T_EOF || is_keyword(mpl, "data") || is_keyword(mpl, "end"))) { /* parse statement */ stmt = simple_statement(mpl, 0); /* and append it to the end of the statement list */ if (last_stmt == NULL) mpl->model = stmt; else last_stmt->next = stmt; last_stmt = stmt; } return; } /* eof */ glpk-5.0/src/mpl/mpl2.c0000644000062000006210000013043713766346220014107 0ustar maomkpasswd/* mpl2.c */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2003-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "mpl.h" /**********************************************************************/ /* * * PROCESSING DATA SECTION * * */ /**********************************************************************/ /*---------------------------------------------------------------------- -- create_slice - create slice. -- -- This routine creates a slice, which initially has no components. */ SLICE *create_slice(MPL *mpl) { SLICE *slice; xassert(mpl == mpl); slice = NULL; return slice; } /*---------------------------------------------------------------------- -- expand_slice - append new component to slice. -- -- This routine expands slice appending to it either a given symbol or -- null component, which becomes the last component of the slice. */ SLICE *expand_slice ( MPL *mpl, SLICE *slice, /* destroyed */ SYMBOL *sym /* destroyed */ ) { SLICE *tail, *temp; /* create a new component */ tail = dmp_get_atom(mpl->tuples, sizeof(SLICE)); tail->sym = sym; tail->next = NULL; /* and append it to the component list */ if (slice == NULL) slice = tail; else { for (temp = slice; temp->next != NULL; temp = temp->next); temp->next = tail; } return slice; } /*---------------------------------------------------------------------- -- slice_dimen - determine dimension of slice. -- -- This routine returns dimension of slice, which is number of all its -- components including null ones. */ int slice_dimen ( MPL *mpl, SLICE *slice /* not changed */ ) { SLICE *temp; int dim; xassert(mpl == mpl); dim = 0; for (temp = slice; temp != NULL; temp = temp->next) dim++; return dim; } /*---------------------------------------------------------------------- -- slice_arity - determine arity of slice. -- -- This routine returns arity of slice, i.e. number of null components -- (indicated by asterisks) in the slice. */ int slice_arity ( MPL *mpl, SLICE *slice /* not changed */ ) { SLICE *temp; int arity; xassert(mpl == mpl); arity = 0; for (temp = slice; temp != NULL; temp = temp->next) if (temp->sym == NULL) arity++; return arity; } /*---------------------------------------------------------------------- -- fake_slice - create fake slice of all asterisks. -- -- This routine creates a fake slice of given dimension, which contains -- asterisks in all components. Zero dimension is allowed. */ SLICE *fake_slice(MPL *mpl, int dim) { SLICE *slice; slice = create_slice(mpl); while (dim-- > 0) slice = expand_slice(mpl, slice, NULL); return slice; } /*---------------------------------------------------------------------- -- delete_slice - delete slice. -- -- This routine deletes specified slice. */ void delete_slice ( MPL *mpl, SLICE *slice /* destroyed */ ) { SLICE *temp; while (slice != NULL) { temp = slice; slice = temp->next; if (temp->sym != NULL) delete_symbol(mpl, temp->sym); xassert(sizeof(SLICE) == sizeof(TUPLE)); dmp_free_atom(mpl->tuples, temp, sizeof(TUPLE)); } return; } /*---------------------------------------------------------------------- -- is_number - check if current token is number. -- -- If the current token is a number, this routine returns non-zero. -- Otherwise zero is returned. */ int is_number(MPL *mpl) { return mpl->token == T_NUMBER; } /*---------------------------------------------------------------------- -- is_symbol - check if current token is symbol. -- -- If the current token is suitable to be a symbol, the routine returns -- non-zero. Otherwise zero is returned. */ int is_symbol(MPL *mpl) { return mpl->token == T_NUMBER || mpl->token == T_SYMBOL || mpl->token == T_STRING; } /*---------------------------------------------------------------------- -- is_literal - check if current token is given symbolic literal. -- -- If the current token is given symbolic literal, this routine returns -- non-zero. Otherwise zero is returned. -- -- This routine is used on processing the data section in the same way -- as the routine is_keyword on processing the model section. */ int is_literal(MPL *mpl, char *literal) { return is_symbol(mpl) && strcmp(mpl->image, literal) == 0; } /*---------------------------------------------------------------------- -- read_number - read number. -- -- This routine reads the current token, which must be a number, and -- returns its numeric value. */ double read_number(MPL *mpl) { double num; xassert(is_number(mpl)); num = mpl->value; get_token(mpl /* */); return num; } /*---------------------------------------------------------------------- -- read_symbol - read symbol. -- -- This routine reads the current token, which must be a symbol, and -- returns its symbolic value. */ SYMBOL *read_symbol(MPL *mpl) { SYMBOL *sym; xassert(is_symbol(mpl)); if (is_number(mpl)) sym = create_symbol_num(mpl, mpl->value); else sym = create_symbol_str(mpl, create_string(mpl, mpl->image)); get_token(mpl /* */); return sym; } /*---------------------------------------------------------------------- -- read_slice - read slice. -- -- This routine reads slice using the syntax: -- -- ::= [ ] -- ::= ( ) -- ::= -- ::= , -- ::= -- ::= * -- -- The bracketed form of slice is used for members of multi-dimensional -- objects while the parenthesized form is used for elemental sets. */ SLICE *read_slice ( MPL *mpl, char *name, /* not changed */ int dim ) { SLICE *slice; int close; xassert(name != NULL); switch (mpl->token) { case T_LBRACKET: close = T_RBRACKET; break; case T_LEFT: xassert(dim > 0); close = T_RIGHT; break; default: xassert(mpl != mpl); } if (dim == 0) error(mpl, "%s cannot be subscripted", name); get_token(mpl /* ( | [ */); /* read slice components */ slice = create_slice(mpl); for (;;) { /* the current token must be a symbol or asterisk */ if (is_symbol(mpl)) slice = expand_slice(mpl, slice, read_symbol(mpl)); else if (mpl->token == T_ASTERISK) { slice = expand_slice(mpl, slice, NULL); get_token(mpl /* * */); } else error(mpl, "number, symbol, or asterisk missing where expec" "ted"); /* check a token that follows the symbol */ if (mpl->token == T_COMMA) get_token(mpl /* , */); else if (mpl->token == close) break; else error(mpl, "syntax error in slice"); } /* number of slice components must be the same as the appropriate dimension */ if (slice_dimen(mpl, slice) != dim) { switch (close) { case T_RBRACKET: error(mpl, "%s must have %d subscript%s, not %d", name, dim, dim == 1 ? "" : "s", slice_dimen(mpl, slice)); break; case T_RIGHT: error(mpl, "%s has dimension %d, not %d", name, dim, slice_dimen(mpl, slice)); break; default: xassert(close != close); } } get_token(mpl /* ) | ] */); return slice; } /*---------------------------------------------------------------------- -- select_set - select set to saturate it with elemental sets. -- -- This routine selects set to saturate it with elemental sets provided -- in the data section. */ SET *select_set ( MPL *mpl, char *name /* not changed */ ) { SET *set; AVLNODE *node; xassert(name != NULL); node = avl_find_node(mpl->tree, name); if (node == NULL || avl_get_node_type(node) != A_SET) error(mpl, "%s not a set", name); set = (SET *)avl_get_node_link(node); if (set->assign != NULL || set->gadget != NULL) error(mpl, "%s needs no data", name); set->data = 1; return set; } /*---------------------------------------------------------------------- -- simple_format - read set data block in simple format. -- -- This routine reads set data block using the syntax: -- -- ::= , , ... , -- -- where are used to construct a complete n-tuple, which is -- included in elemental set assigned to the set member. Commae between -- symbols are optional and may be omitted anywhere. -- -- Number of components in the slice must be the same as dimension of -- n-tuples in elemental sets assigned to the set members. To construct -- complete n-tuple the routine replaces null positions in the slice by -- corresponding . -- -- If the slice contains at least one null position, the current token -- must be symbol. Otherwise, the routine reads no symbols to construct -- the n-tuple, so the current token is not checked. */ void simple_format ( MPL *mpl, SET *set, /* not changed */ MEMBER *memb, /* modified */ SLICE *slice /* not changed */ ) { TUPLE *tuple; SLICE *temp; SYMBOL *sym, *with = NULL; xassert(set != NULL); xassert(memb != NULL); xassert(slice != NULL); xassert(set->dimen == slice_dimen(mpl, slice)); xassert(memb->value.set->dim == set->dimen); if (slice_arity(mpl, slice) > 0) xassert(is_symbol(mpl)); /* read symbols and construct complete n-tuple */ tuple = create_tuple(mpl); for (temp = slice; temp != NULL; temp = temp->next) { if (temp->sym == NULL) { /* substitution is needed; read symbol */ if (!is_symbol(mpl)) { int lack = slice_arity(mpl, temp); /* with cannot be null due to assertion above */ xassert(with != NULL); if (lack == 1) error(mpl, "one item missing in data group beginning " "with %s", format_symbol(mpl, with)); else error(mpl, "%d items missing in data group beginning " "with %s", lack, format_symbol(mpl, with)); } sym = read_symbol(mpl); if (with == NULL) with = sym; } else { /* copy symbol from the slice */ sym = copy_symbol(mpl, temp->sym); } /* append the symbol to the n-tuple */ tuple = expand_tuple(mpl, tuple, sym); /* skip optional comma *between* */ if (temp->next != NULL && mpl->token == T_COMMA) get_token(mpl /* , */); } /* add constructed n-tuple to elemental set */ check_then_add(mpl, memb->value.set, tuple); return; } /*---------------------------------------------------------------------- -- matrix_format - read set data block in matrix format. -- -- This routine reads set data block using the syntax: -- -- ::= ... := -- +/- +/- ... +/- -- +/- +/- ... +/- -- . . . . . . . . . . . -- +/- +/- ... +/- -- -- where are symbols that denote rows of the matrix, -- are symbols that denote columns of the matrix, "+" and "-" indicate -- whether corresponding n-tuple needs to be included in the elemental -- set or not, respectively. -- -- Number of the slice components must be the same as dimension of the -- elemental set. The slice must have two null positions. To construct -- complete n-tuple for particular element of the matrix the routine -- replaces first null position of the slice by the corresponding -- (or , if the flag tr is on) and second null position by the -- corresponding (or by , if the flag tr is on). */ void matrix_format ( MPL *mpl, SET *set, /* not changed */ MEMBER *memb, /* modified */ SLICE *slice, /* not changed */ int tr ) { SLICE *list, *col, *temp; TUPLE *tuple; SYMBOL *row; xassert(set != NULL); xassert(memb != NULL); xassert(slice != NULL); xassert(set->dimen == slice_dimen(mpl, slice)); xassert(memb->value.set->dim == set->dimen); xassert(slice_arity(mpl, slice) == 2); /* read the matrix heading that contains column symbols (there may be no columns at all) */ list = create_slice(mpl); while (mpl->token != T_ASSIGN) { /* read column symbol and append it to the column list */ if (!is_symbol(mpl)) error(mpl, "number, symbol, or := missing where expected"); list = expand_slice(mpl, list, read_symbol(mpl)); } get_token(mpl /* := */); /* read zero or more rows that contain matrix data */ while (is_symbol(mpl)) { /* read row symbol (if the matrix has no columns, row symbols are just ignored) */ row = read_symbol(mpl); /* read the matrix row accordingly to the column list */ for (col = list; col != NULL; col = col->next) { int which = 0; /* check indicator */ if (is_literal(mpl, "+")) ; else if (is_literal(mpl, "-")) { get_token(mpl /* - */); continue; } else { int lack = slice_dimen(mpl, col); if (lack == 1) error(mpl, "one item missing in data group beginning " "with %s", format_symbol(mpl, row)); else error(mpl, "%d items missing in data group beginning " "with %s", lack, format_symbol(mpl, row)); } /* construct complete n-tuple */ tuple = create_tuple(mpl); for (temp = slice; temp != NULL; temp = temp->next) { if (temp->sym == NULL) { /* substitution is needed */ switch (++which) { case 1: /* substitute in the first null position */ tuple = expand_tuple(mpl, tuple, copy_symbol(mpl, tr ? col->sym : row)); break; case 2: /* substitute in the second null position */ tuple = expand_tuple(mpl, tuple, copy_symbol(mpl, tr ? row : col->sym)); break; default: xassert(which != which); } } else { /* copy symbol from the slice */ tuple = expand_tuple(mpl, tuple, copy_symbol(mpl, temp->sym)); } } xassert(which == 2); /* add constructed n-tuple to elemental set */ check_then_add(mpl, memb->value.set, tuple); get_token(mpl /* + */); } /* delete the row symbol */ delete_symbol(mpl, row); } /* delete the column list */ delete_slice(mpl, list); return; } /*---------------------------------------------------------------------- -- set_data - read set data. -- -- This routine reads set data using the syntax: -- -- ::= set ; -- ::= set [ ] ; -- ::= -- ::= -- ::= , := -- ::= , ( ) -- ::= , -- ::= , : -- ::= , (tr) -- ::= , (tr) : -- -- Commae in are optional and may be omitted anywhere. */ void set_data(MPL *mpl) { SET *set; TUPLE *tuple; MEMBER *memb; SLICE *slice; int tr = 0; xassert(is_literal(mpl, "set")); get_token(mpl /* set */); /* symbolic name of set must follows the keyword 'set' */ if (!is_symbol(mpl)) error(mpl, "set name missing where expected"); /* select the set to saturate it with data */ set = select_set(mpl, mpl->image); get_token(mpl /* */); /* read optional subscript list, which identifies member of the set to be read */ tuple = create_tuple(mpl); if (mpl->token == T_LBRACKET) { /* subscript list is specified */ if (set->dim == 0) error(mpl, "%s cannot be subscripted", set->name); get_token(mpl /* [ */); /* read symbols and construct subscript list */ for (;;) { if (!is_symbol(mpl)) error(mpl, "number or symbol missing where expected"); tuple = expand_tuple(mpl, tuple, read_symbol(mpl)); if (mpl->token == T_COMMA) get_token(mpl /* , */); else if (mpl->token == T_RBRACKET) break; else error(mpl, "syntax error in subscript list"); } if (set->dim != tuple_dimen(mpl, tuple)) error(mpl, "%s must have %d subscript%s rather than %d", set->name, set->dim, set->dim == 1 ? "" : "s", tuple_dimen(mpl, tuple)); get_token(mpl /* ] */); } else { /* subscript list is not specified */ if (set->dim != 0) error(mpl, "%s must be subscripted", set->name); } /* there must be no member with the same subscript list */ if (find_member(mpl, set->array, tuple) != NULL) error(mpl, "%s%s already defined", set->name, format_tuple(mpl, '[', tuple)); /* add new member to the set and assign it empty elemental set */ memb = add_member(mpl, set->array, tuple); memb->value.set = create_elemset(mpl, set->dimen); /* create an initial fake slice of all asterisks */ slice = fake_slice(mpl, set->dimen); /* read zero or more data assignments */ for (;;) { /* skip optional comma */ if (mpl->token == T_COMMA) get_token(mpl /* , */); /* process assignment element */ if (mpl->token == T_ASSIGN) { /* assignment ligature is non-significant element */ get_token(mpl /* := */); } else if (mpl->token == T_LEFT) { /* left parenthesis begins either new slice or "transpose" indicator */ int is_tr; get_token(mpl /* ( */); is_tr = is_literal(mpl, "tr"); unget_token(mpl /* ( */); if (is_tr) goto left; /* delete the current slice and read new one */ delete_slice(mpl, slice); slice = read_slice(mpl, set->name, set->dimen); /* each new slice resets the "transpose" indicator */ tr = 0; /* if the new slice is 0-ary, formally there is one 0-tuple (in the simple format) that follows it */ if (slice_arity(mpl, slice) == 0) simple_format(mpl, set, memb, slice); } else if (is_symbol(mpl)) { /* number or symbol begins data in the simple format */ simple_format(mpl, set, memb, slice); } else if (mpl->token == T_COLON) { /* colon begins data in the matrix format */ if (slice_arity(mpl, slice) != 2) err1: error(mpl, "slice currently used must specify 2 asterisk" "s, not %d", slice_arity(mpl, slice)); get_token(mpl /* : */); /* read elemental set data in the matrix format */ matrix_format(mpl, set, memb, slice, tr); } else if (mpl->token == T_LEFT) left: { /* left parenthesis begins the "transpose" indicator, which is followed by data in the matrix format */ get_token(mpl /* ( */); if (!is_literal(mpl, "tr")) err2: error(mpl, "transpose indicator (tr) incomplete"); if (slice_arity(mpl, slice) != 2) goto err1; get_token(mpl /* tr */); if (mpl->token != T_RIGHT) goto err2; get_token(mpl /* ) */); /* in this case the colon is optional */ if (mpl->token == T_COLON) get_token(mpl /* : */); /* set the "transpose" indicator */ tr = 1; /* read elemental set data in the matrix format */ matrix_format(mpl, set, memb, slice, tr); } else if (mpl->token == T_SEMICOLON) { /* semicolon terminates the data block */ get_token(mpl /* ; */); break; } else error(mpl, "syntax error in set data block"); } /* delete the current slice */ delete_slice(mpl, slice); return; } /*---------------------------------------------------------------------- -- select_parameter - select parameter to saturate it with data. -- -- This routine selects parameter to saturate it with data provided in -- the data section. */ PARAMETER *select_parameter ( MPL *mpl, char *name /* not changed */ ) { PARAMETER *par; AVLNODE *node; xassert(name != NULL); node = avl_find_node(mpl->tree, name); if (node == NULL || avl_get_node_type(node) != A_PARAMETER) error(mpl, "%s not a parameter", name); par = (PARAMETER *)avl_get_node_link(node); if (par->assign != NULL) error(mpl, "%s needs no data", name); if (par->data) error(mpl, "%s already provided with data", name); par->data = 1; return par; } /*---------------------------------------------------------------------- -- set_default - set default parameter value. -- -- This routine sets default value for specified parameter. */ void set_default ( MPL *mpl, PARAMETER *par, /* not changed */ SYMBOL *altval /* destroyed */ ) { xassert(par != NULL); xassert(altval != NULL); if (par->option != NULL) error(mpl, "default value for %s already specified in model se" "ction", par->name); xassert(par->defval == NULL); par->defval = altval; return; } /*---------------------------------------------------------------------- -- read_value - read value and assign it to parameter member. -- -- This routine reads numeric or symbolic value from the input stream -- and assigns to new parameter member specified by its n-tuple, which -- (the member) is created and added to the parameter array. */ MEMBER *read_value ( MPL *mpl, PARAMETER *par, /* not changed */ TUPLE *tuple /* destroyed */ ) { MEMBER *memb; xassert(par != NULL); xassert(is_symbol(mpl)); /* there must be no member with the same n-tuple */ if (find_member(mpl, par->array, tuple) != NULL) error(mpl, "%s%s already defined", par->name, format_tuple(mpl, '[', tuple)); /* create new parameter member with given n-tuple */ memb = add_member(mpl, par->array, tuple); /* read value and assigns it to the new parameter member */ switch (par->type) { case A_NUMERIC: case A_INTEGER: case A_BINARY: if (!is_number(mpl)) error(mpl, "%s requires numeric data", par->name); memb->value.num = read_number(mpl); break; case A_SYMBOLIC: memb->value.sym = read_symbol(mpl); break; default: xassert(par != par); } return memb; } /*---------------------------------------------------------------------- -- plain_format - read parameter data block in plain format. -- -- This routine reads parameter data block using the syntax: -- -- ::= , , ... , , -- -- where are used to determine a complete subscript list for -- parameter member, is a numeric or symbolic value assigned to -- the parameter member. Commae between data items are optional and may -- be omitted anywhere. -- -- Number of components in the slice must be the same as dimension of -- the parameter. To construct the complete subscript list the routine -- replaces null positions in the slice by corresponding . */ void plain_format ( MPL *mpl, PARAMETER *par, /* not changed */ SLICE *slice /* not changed */ ) { TUPLE *tuple; SLICE *temp; SYMBOL *sym, *with = NULL; xassert(par != NULL); xassert(par->dim == slice_dimen(mpl, slice)); xassert(is_symbol(mpl)); /* read symbols and construct complete subscript list */ tuple = create_tuple(mpl); for (temp = slice; temp != NULL; temp = temp->next) { if (temp->sym == NULL) { /* substitution is needed; read symbol */ if (!is_symbol(mpl)) { int lack = slice_arity(mpl, temp) + 1; xassert(with != NULL); xassert(lack > 1); error(mpl, "%d items missing in data group beginning wit" "h %s", lack, format_symbol(mpl, with)); } sym = read_symbol(mpl); if (with == NULL) with = sym; } else { /* copy symbol from the slice */ sym = copy_symbol(mpl, temp->sym); } /* append the symbol to the subscript list */ tuple = expand_tuple(mpl, tuple, sym); /* skip optional comma */ if (mpl->token == T_COMMA) get_token(mpl /* , */); } /* read value and assign it to new parameter member */ if (!is_symbol(mpl)) { xassert(with != NULL); error(mpl, "one item missing in data group beginning with %s", format_symbol(mpl, with)); } read_value(mpl, par, tuple); return; } /*---------------------------------------------------------------------- -- tabular_format - read parameter data block in tabular format. -- -- This routine reads parameter data block using the syntax: -- -- ::= ... := -- ... -- ... -- . . . . . . . . . . . -- ... -- -- where are symbols that denote rows of the table, -- are symbols that denote columns of the table, are numeric -- or symbolic values assigned to the corresponding parameter members. -- If is specified as single point, no value is provided. -- -- Number of components in the slice must be the same as dimension of -- the parameter. The slice must have two null positions. To construct -- complete subscript list for particular the routine replaces -- the first null position of the slice by the corresponding (or -- , if the flag tr is on) and the second null position by the -- corresponding (or by , if the flag tr is on). */ void tabular_format ( MPL *mpl, PARAMETER *par, /* not changed */ SLICE *slice, /* not changed */ int tr ) { SLICE *list, *col, *temp; TUPLE *tuple; SYMBOL *row; xassert(par != NULL); xassert(par->dim == slice_dimen(mpl, slice)); xassert(slice_arity(mpl, slice) == 2); /* read the table heading that contains column symbols (the table may have no columns) */ list = create_slice(mpl); while (mpl->token != T_ASSIGN) { /* read column symbol and append it to the column list */ if (!is_symbol(mpl)) error(mpl, "number, symbol, or := missing where expected"); list = expand_slice(mpl, list, read_symbol(mpl)); } get_token(mpl /* := */); /* read zero or more rows that contain tabular data */ while (is_symbol(mpl)) { /* read row symbol (if the table has no columns, these symbols are just ignored) */ row = read_symbol(mpl); /* read values accordingly to the column list */ for (col = list; col != NULL; col = col->next) { int which = 0; /* if the token is single point, no value is provided */ if (is_literal(mpl, ".")) { get_token(mpl /* . */); continue; } /* construct complete subscript list */ tuple = create_tuple(mpl); for (temp = slice; temp != NULL; temp = temp->next) { if (temp->sym == NULL) { /* substitution is needed */ switch (++which) { case 1: /* substitute in the first null position */ tuple = expand_tuple(mpl, tuple, copy_symbol(mpl, tr ? col->sym : row)); break; case 2: /* substitute in the second null position */ tuple = expand_tuple(mpl, tuple, copy_symbol(mpl, tr ? row : col->sym)); break; default: xassert(which != which); } } else { /* copy symbol from the slice */ tuple = expand_tuple(mpl, tuple, copy_symbol(mpl, temp->sym)); } } xassert(which == 2); /* read value and assign it to new parameter member */ if (!is_symbol(mpl)) { int lack = slice_dimen(mpl, col); if (lack == 1) error(mpl, "one item missing in data group beginning " "with %s", format_symbol(mpl, row)); else error(mpl, "%d items missing in data group beginning " "with %s", lack, format_symbol(mpl, row)); } read_value(mpl, par, tuple); } /* delete the row symbol */ delete_symbol(mpl, row); } /* delete the column list */ delete_slice(mpl, list); return; } /*---------------------------------------------------------------------- -- tabbing_format - read parameter data block in tabbing format. -- -- This routine reads parameter data block using the syntax: -- -- ::= , ... , , := , -- , ... , , , ... , , -- , ... , , , ... , , -- . . . . . . . . . . . . . . . . . -- , ... , , , ... , -- ::= -- ::= : -- -- where are names of parameters (all the parameters must be -- subscripted and have identical dimensions), are symbols -- used to define subscripts of parameter members, are numeric -- or symbolic values assigned to the corresponding parameter members. -- Optional may specify a simple set, in which case n-tuples -- built of for each row of the data table (i.e. subscripts -- of parameter members) are added to the specified set. Commae between -- data items are optional and may be omitted anywhere. -- -- If the parameter altval is not NULL, it specifies a default value -- provided for all the parameters specified in the data block. */ void tabbing_format ( MPL *mpl, SYMBOL *altval /* not changed */ ) { SET *set = NULL; PARAMETER *par; SLICE *list, *col; TUPLE *tuple; int next_token, j, dim = 0; char *last_name = NULL; /* read the optional */ if (is_symbol(mpl)) { get_token(mpl /* */); next_token = mpl->token; unget_token(mpl /* */); if (next_token == T_COLON) { /* select the set to saturate it with data */ set = select_set(mpl, mpl->image); /* the set must be simple (i.e. not set of sets) */ if (set->dim != 0) error(mpl, "%s must be a simple set", set->name); /* and must not be defined yet */ if (set->array->head != NULL) error(mpl, "%s already defined", set->name); /* add new (the only) member to the set and assign it empty elemental set */ add_member(mpl, set->array, NULL)->value.set = create_elemset(mpl, set->dimen); last_name = set->name, dim = set->dimen; get_token(mpl /* */); xassert(mpl->token == T_COLON); get_token(mpl /* : */); } } /* read the table heading that contains parameter names */ list = create_slice(mpl); while (mpl->token != T_ASSIGN) { /* there must be symbolic name of parameter */ if (!is_symbol(mpl)) error(mpl, "parameter name or := missing where expected"); /* select the parameter to saturate it with data */ par = select_parameter(mpl, mpl->image); /* the parameter must be subscripted */ if (par->dim == 0) error(mpl, "%s not a subscripted parameter", mpl->image); /* the set (if specified) and all the parameters in the data block must have identical dimension */ if (dim != 0 && par->dim != dim) { xassert(last_name != NULL); error(mpl, "%s has dimension %d while %s has dimension %d", last_name, dim, par->name, par->dim); } /* set default value for the parameter (if specified) */ if (altval != NULL) set_default(mpl, par, copy_symbol(mpl, altval)); /* append the parameter to the column list */ list = expand_slice(mpl, list, (SYMBOL *)par); last_name = par->name, dim = par->dim; get_token(mpl /* */); /* skip optional comma */ if (mpl->token == T_COMMA) get_token(mpl /* , */); } if (slice_dimen(mpl, list) == 0) error(mpl, "at least one parameter name required"); get_token(mpl /* := */); /* skip optional comma */ if (mpl->token == T_COMMA) get_token(mpl /* , */); /* read rows that contain tabbing data */ while (is_symbol(mpl)) { /* read subscript list */ tuple = create_tuple(mpl); for (j = 1; j <= dim; j++) { /* read j-th subscript */ if (!is_symbol(mpl)) { int lack = slice_dimen(mpl, list) + dim - j + 1; xassert(tuple != NULL); xassert(lack > 1); error(mpl, "%d items missing in data group beginning wit" "h %s", lack, format_symbol(mpl, tuple->sym)); } /* read and append j-th subscript to the n-tuple */ tuple = expand_tuple(mpl, tuple, read_symbol(mpl)); /* skip optional comma *between* */ if (j < dim && mpl->token == T_COMMA) get_token(mpl /* , */); } /* if the set is specified, add to it new n-tuple, which is a copy of the subscript list just read */ if (set != NULL) check_then_add(mpl, set->array->head->value.set, copy_tuple(mpl, tuple)); /* skip optional comma between and */ if (mpl->token == T_COMMA) get_token(mpl /* , */); /* read values accordingly to the column list */ for (col = list; col != NULL; col = col->next) { /* if the token is single point, no value is provided */ if (is_literal(mpl, ".")) { get_token(mpl /* . */); continue; } /* read value and assign it to new parameter member */ if (!is_symbol(mpl)) { int lack = slice_dimen(mpl, col); xassert(tuple != NULL); if (lack == 1) error(mpl, "one item missing in data group beginning " "with %s", format_symbol(mpl, tuple->sym)); else error(mpl, "%d items missing in data group beginning " "with %s", lack, format_symbol(mpl, tuple->sym)); } read_value(mpl, (PARAMETER *)col->sym, copy_tuple(mpl, tuple)); /* skip optional comma preceding the next value */ if (col->next != NULL && mpl->token == T_COMMA) get_token(mpl /* , */); } /* delete the original subscript list */ delete_tuple(mpl, tuple); /* skip optional comma (only if there is next data group) */ if (mpl->token == T_COMMA) { get_token(mpl /* , */); if (!is_symbol(mpl)) unget_token(mpl /* , */); } } /* delete the column list (it contains parameters, not symbols, so nullify it before) */ for (col = list; col != NULL; col = col->next) col->sym = NULL; delete_slice(mpl, list); return; } /*---------------------------------------------------------------------- -- parameter_data - read parameter data. -- -- This routine reads parameter data using the syntax: -- -- ::= param : ; -- ::= param -- ; -- ::= -- ::= -- ::= default -- ::= -- ::= , := -- ::= , [ ] -- ::= , -- ::= , : -- ::= , (tr) -- ::= , (tr) : -- -- Commae in are optional and may be omitted anywhere. */ void parameter_data(MPL *mpl) { PARAMETER *par; SYMBOL *altval = NULL; SLICE *slice; int tr = 0; xassert(is_literal(mpl, "param")); get_token(mpl /* param */); /* read optional default value */ if (is_literal(mpl, "default")) { get_token(mpl /* default */); if (!is_symbol(mpl)) error(mpl, "default value missing where expected"); altval = read_symbol(mpl); /* if the default value follows the keyword 'param', the next token must be only the colon */ if (mpl->token != T_COLON) error(mpl, "colon missing where expected"); } /* being used after the keyword 'param' or the optional default value the colon begins data in the tabbing format */ if (mpl->token == T_COLON) { get_token(mpl /* : */); /* skip optional comma */ if (mpl->token == T_COMMA) get_token(mpl /* , */); /* read parameter data in the tabbing format */ tabbing_format(mpl, altval); /* on reading data in the tabbing format the default value is always copied, so delete the original symbol */ if (altval != NULL) delete_symbol(mpl, altval); /* the next token must be only semicolon */ if (mpl->token != T_SEMICOLON) error(mpl, "symbol, number, or semicolon missing where expe" "cted"); get_token(mpl /* ; */); goto done; } /* in other cases there must be symbolic name of parameter, which follows the keyword 'param' */ if (!is_symbol(mpl)) error(mpl, "parameter name missing where expected"); /* select the parameter to saturate it with data */ par = select_parameter(mpl, mpl->image); get_token(mpl /* */); /* read optional default value */ if (is_literal(mpl, "default")) { get_token(mpl /* default */); if (!is_symbol(mpl)) error(mpl, "default value missing where expected"); altval = read_symbol(mpl); /* set default value for the parameter */ set_default(mpl, par, altval); } /* create initial fake slice of all asterisks */ slice = fake_slice(mpl, par->dim); /* read zero or more data assignments */ for (;;) { /* skip optional comma */ if (mpl->token == T_COMMA) get_token(mpl /* , */); /* process current assignment */ if (mpl->token == T_ASSIGN) { /* assignment ligature is non-significant element */ get_token(mpl /* := */); } else if (mpl->token == T_LBRACKET) { /* left bracket begins new slice; delete the current slice and read new one */ delete_slice(mpl, slice); slice = read_slice(mpl, par->name, par->dim); /* each new slice resets the "transpose" indicator */ tr = 0; } else if (is_symbol(mpl)) { /* number or symbol begins data in the plain format */ plain_format(mpl, par, slice); } else if (mpl->token == T_COLON) { /* colon begins data in the tabular format */ if (par->dim == 0) err1: error(mpl, "%s not a subscripted parameter", par->name); if (slice_arity(mpl, slice) != 2) err2: error(mpl, "slice currently used must specify 2 asterisk" "s, not %d", slice_arity(mpl, slice)); get_token(mpl /* : */); /* read parameter data in the tabular format */ tabular_format(mpl, par, slice, tr); } else if (mpl->token == T_LEFT) { /* left parenthesis begins the "transpose" indicator, which is followed by data in the tabular format */ get_token(mpl /* ( */); if (!is_literal(mpl, "tr")) err3: error(mpl, "transpose indicator (tr) incomplete"); if (par->dim == 0) goto err1; if (slice_arity(mpl, slice) != 2) goto err2; get_token(mpl /* tr */); if (mpl->token != T_RIGHT) goto err3; get_token(mpl /* ) */); /* in this case the colon is optional */ if (mpl->token == T_COLON) get_token(mpl /* : */); /* set the "transpose" indicator */ tr = 1; /* read parameter data in the tabular format */ tabular_format(mpl, par, slice, tr); } else if (mpl->token == T_SEMICOLON) { /* semicolon terminates the data block */ get_token(mpl /* ; */); break; } else error(mpl, "syntax error in parameter data block"); } /* delete the current slice */ delete_slice(mpl, slice); done: return; } /*---------------------------------------------------------------------- -- data_section - read data section. -- -- This routine reads data section using the syntax: -- -- ::= -- ::= ; -- ::= -- ::= -- -- Reading data section is terminated by either the keyword 'end' or -- the end of file. */ void data_section(MPL *mpl) { while (!(mpl->token == T_EOF || is_literal(mpl, "end"))) { if (is_literal(mpl, "set")) set_data(mpl); else if (is_literal(mpl, "param")) parameter_data(mpl); else error(mpl, "syntax error in data section"); } return; } /* eof */ glpk-5.0/src/mpl/mpl3.c0000644000062000006210000064642413766346220014120 0ustar maomkpasswd/* mpl3.c */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2003-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "mpl.h" /**********************************************************************/ /* * * FLOATING-POINT NUMBERS * * */ /**********************************************************************/ /*---------------------------------------------------------------------- -- fp_add - floating-point addition. -- -- This routine computes the sum x + y. */ double fp_add(MPL *mpl, double x, double y) { if (x > 0.0 && y > 0.0 && x > + 0.999 * DBL_MAX - y || x < 0.0 && y < 0.0 && x < - 0.999 * DBL_MAX - y) error(mpl, "%.*g + %.*g; floating-point overflow", DBL_DIG, x, DBL_DIG, y); return x + y; } /*---------------------------------------------------------------------- -- fp_sub - floating-point subtraction. -- -- This routine computes the difference x - y. */ double fp_sub(MPL *mpl, double x, double y) { if (x > 0.0 && y < 0.0 && x > + 0.999 * DBL_MAX + y || x < 0.0 && y > 0.0 && x < - 0.999 * DBL_MAX + y) error(mpl, "%.*g - %.*g; floating-point overflow", DBL_DIG, x, DBL_DIG, y); return x - y; } /*---------------------------------------------------------------------- -- fp_less - floating-point non-negative subtraction. -- -- This routine computes the non-negative difference max(0, x - y). */ double fp_less(MPL *mpl, double x, double y) { if (x < y) return 0.0; if (x > 0.0 && y < 0.0 && x > + 0.999 * DBL_MAX + y) error(mpl, "%.*g less %.*g; floating-point overflow", DBL_DIG, x, DBL_DIG, y); return x - y; } /*---------------------------------------------------------------------- -- fp_mul - floating-point multiplication. -- -- This routine computes the product x * y. */ double fp_mul(MPL *mpl, double x, double y) { if (fabs(y) > 1.0 && fabs(x) > (0.999 * DBL_MAX) / fabs(y)) error(mpl, "%.*g * %.*g; floating-point overflow", DBL_DIG, x, DBL_DIG, y); return x * y; } /*---------------------------------------------------------------------- -- fp_div - floating-point division. -- -- This routine computes the quotient x / y. */ double fp_div(MPL *mpl, double x, double y) { if (fabs(y) < DBL_MIN) error(mpl, "%.*g / %.*g; floating-point zero divide", DBL_DIG, x, DBL_DIG, y); if (fabs(y) < 1.0 && fabs(x) > (0.999 * DBL_MAX) * fabs(y)) error(mpl, "%.*g / %.*g; floating-point overflow", DBL_DIG, x, DBL_DIG, y); return x / y; } /*---------------------------------------------------------------------- -- fp_idiv - floating-point quotient of exact division. -- -- This routine computes the quotient of exact division x div y. */ double fp_idiv(MPL *mpl, double x, double y) { if (fabs(y) < DBL_MIN) error(mpl, "%.*g div %.*g; floating-point zero divide", DBL_DIG, x, DBL_DIG, y); if (fabs(y) < 1.0 && fabs(x) > (0.999 * DBL_MAX) * fabs(y)) error(mpl, "%.*g div %.*g; floating-point overflow", DBL_DIG, x, DBL_DIG, y); x /= y; return x > 0.0 ? floor(x) : x < 0.0 ? ceil(x) : 0.0; } /*---------------------------------------------------------------------- -- fp_mod - floating-point remainder of exact division. -- -- This routine computes the remainder of exact division x mod y. -- -- NOTE: By definition x mod y = x - y * floor(x / y). */ double fp_mod(MPL *mpl, double x, double y) { double r; xassert(mpl == mpl); if (x == 0.0) r = 0.0; else if (y == 0.0) r = x; else { r = fmod(fabs(x), fabs(y)); if (r != 0.0) { if (x < 0.0) r = - r; if (x > 0.0 && y < 0.0 || x < 0.0 && y > 0.0) r += y; } } return r; } /*---------------------------------------------------------------------- -- fp_power - floating-point exponentiation (raise to power). -- -- This routine computes the exponentiation x ** y. */ double fp_power(MPL *mpl, double x, double y) { double r; if (x == 0.0 && y <= 0.0 || x < 0.0 && y != floor(y)) error(mpl, "%.*g ** %.*g; result undefined", DBL_DIG, x, DBL_DIG, y); if (x == 0.0) goto eval; if (fabs(x) > 1.0 && y > +1.0 && +log(fabs(x)) > (0.999 * log(DBL_MAX)) / y || fabs(x) < 1.0 && y < -1.0 && +log(fabs(x)) < (0.999 * log(DBL_MAX)) / y) error(mpl, "%.*g ** %.*g; floating-point overflow", DBL_DIG, x, DBL_DIG, y); if (fabs(x) > 1.0 && y < -1.0 && -log(fabs(x)) < (0.999 * log(DBL_MAX)) / y || fabs(x) < 1.0 && y > +1.0 && -log(fabs(x)) > (0.999 * log(DBL_MAX)) / y) r = 0.0; else eval: r = pow(x, y); return r; } /*---------------------------------------------------------------------- -- fp_exp - floating-point base-e exponential. -- -- This routine computes the base-e exponential e ** x. */ double fp_exp(MPL *mpl, double x) { if (x > 0.999 * log(DBL_MAX)) error(mpl, "exp(%.*g); floating-point overflow", DBL_DIG, x); return exp(x); } /*---------------------------------------------------------------------- -- fp_log - floating-point natural logarithm. -- -- This routine computes the natural logarithm log x. */ double fp_log(MPL *mpl, double x) { if (x <= 0.0) error(mpl, "log(%.*g); non-positive argument", DBL_DIG, x); return log(x); } /*---------------------------------------------------------------------- -- fp_log10 - floating-point common (decimal) logarithm. -- -- This routine computes the common (decimal) logarithm lg x. */ double fp_log10(MPL *mpl, double x) { if (x <= 0.0) error(mpl, "log10(%.*g); non-positive argument", DBL_DIG, x); return log10(x); } /*---------------------------------------------------------------------- -- fp_sqrt - floating-point square root. -- -- This routine computes the square root x ** 0.5. */ double fp_sqrt(MPL *mpl, double x) { if (x < 0.0) error(mpl, "sqrt(%.*g); negative argument", DBL_DIG, x); return sqrt(x); } /*---------------------------------------------------------------------- -- fp_sin - floating-point trigonometric sine. -- -- This routine computes the trigonometric sine sin(x). */ double fp_sin(MPL *mpl, double x) { if (!(-1e6 <= x && x <= +1e6)) error(mpl, "sin(%.*g); argument too large", DBL_DIG, x); return sin(x); } /*---------------------------------------------------------------------- -- fp_cos - floating-point trigonometric cosine. -- -- This routine computes the trigonometric cosine cos(x). */ double fp_cos(MPL *mpl, double x) { if (!(-1e6 <= x && x <= +1e6)) error(mpl, "cos(%.*g); argument too large", DBL_DIG, x); return cos(x); } /*---------------------------------------------------------------------- -- fp_tan - floating-point trigonometric tangent. -- -- This routine computes the trigonometric tangent tan(x). */ double fp_tan(MPL *mpl, double x) { if (!(-1e6 <= x && x <= +1e6)) error(mpl, "tan(%.*g); argument too large", DBL_DIG, x); return tan(x); } /*---------------------------------------------------------------------- -- fp_atan - floating-point trigonometric arctangent. -- -- This routine computes the trigonometric arctangent atan(x). */ double fp_atan(MPL *mpl, double x) { xassert(mpl == mpl); return atan(x); } /*---------------------------------------------------------------------- -- fp_atan2 - floating-point trigonometric arctangent. -- -- This routine computes the trigonometric arctangent atan(y / x). */ double fp_atan2(MPL *mpl, double y, double x) { xassert(mpl == mpl); return atan2(y, x); } /*---------------------------------------------------------------------- -- fp_round - round floating-point value to n fractional digits. -- -- This routine rounds given floating-point value x to n fractional -- digits with the formula: -- -- round(x, n) = floor(x * 10^n + 0.5) / 10^n. -- -- The parameter n is assumed to be integer. */ double fp_round(MPL *mpl, double x, double n) { double ten_to_n; if (n != floor(n)) error(mpl, "round(%.*g, %.*g); non-integer second argument", DBL_DIG, x, DBL_DIG, n); if (n <= DBL_DIG + 2) { ten_to_n = pow(10.0, n); if (fabs(x) < (0.999 * DBL_MAX) / ten_to_n) { x = floor(x * ten_to_n + 0.5); if (x != 0.0) x /= ten_to_n; } } return x; } /*---------------------------------------------------------------------- -- fp_trunc - truncate floating-point value to n fractional digits. -- -- This routine truncates given floating-point value x to n fractional -- digits with the formula: -- -- ( floor(x * 10^n) / 10^n, if x >= 0 -- trunc(x, n) = < -- ( ceil(x * 10^n) / 10^n, if x < 0 -- -- The parameter n is assumed to be integer. */ double fp_trunc(MPL *mpl, double x, double n) { double ten_to_n; if (n != floor(n)) error(mpl, "trunc(%.*g, %.*g); non-integer second argument", DBL_DIG, x, DBL_DIG, n); if (n <= DBL_DIG + 2) { ten_to_n = pow(10.0, n); if (fabs(x) < (0.999 * DBL_MAX) / ten_to_n) { x = (x >= 0.0 ? floor(x * ten_to_n) : ceil(x * ten_to_n)); if (x != 0.0) x /= ten_to_n; } } return x; } /**********************************************************************/ /* * * PSEUDO-RANDOM NUMBER GENERATORS * * */ /**********************************************************************/ /*---------------------------------------------------------------------- -- fp_irand224 - pseudo-random integer in the range [0, 2^24). -- -- This routine returns a next pseudo-random integer (converted to -- floating-point) which is uniformly distributed between 0 and 2^24-1, -- inclusive. */ #define two_to_the_24 0x1000000 double fp_irand224(MPL *mpl) { return (double)rng_unif_rand(mpl->rand, two_to_the_24); } /*---------------------------------------------------------------------- -- fp_uniform01 - pseudo-random number in the range [0, 1). -- -- This routine returns a next pseudo-random number which is uniformly -- distributed in the range [0, 1). */ #define two_to_the_31 ((unsigned int)0x80000000) double fp_uniform01(MPL *mpl) { return (double)rng_next_rand(mpl->rand) / (double)two_to_the_31; } /*---------------------------------------------------------------------- -- fp_uniform - pseudo-random number in the range [a, b). -- -- This routine returns a next pseudo-random number which is uniformly -- distributed in the range [a, b). */ double fp_uniform(MPL *mpl, double a, double b) { double x; if (a >= b) error(mpl, "Uniform(%.*g, %.*g); invalid range", DBL_DIG, a, DBL_DIG, b); x = fp_uniform01(mpl); #if 0 x = a * (1.0 - x) + b * x; #else x = fp_add(mpl, a * (1.0 - x), b * x); #endif return x; } /*---------------------------------------------------------------------- -- fp_normal01 - Gaussian random variate with mu = 0 and sigma = 1. -- -- This routine returns a Gaussian random variate with zero mean and -- unit standard deviation. The polar (Box-Mueller) method is used. -- -- This code is a modified version of the routine gsl_ran_gaussian from -- the GNU Scientific Library Version 1.0. */ double fp_normal01(MPL *mpl) { double x, y, r2; do { /* choose x, y in uniform square (-1,-1) to (+1,+1) */ x = -1.0 + 2.0 * fp_uniform01(mpl); y = -1.0 + 2.0 * fp_uniform01(mpl); /* see if it is in the unit circle */ r2 = x * x + y * y; } while (r2 > 1.0 || r2 == 0.0); /* Box-Muller transform */ return y * sqrt(-2.0 * log (r2) / r2); } /*---------------------------------------------------------------------- -- fp_normal - Gaussian random variate with specified mu and sigma. -- -- This routine returns a Gaussian random variate with mean mu and -- standard deviation sigma. */ double fp_normal(MPL *mpl, double mu, double sigma) { double x; #if 0 x = mu + sigma * fp_normal01(mpl); #else x = fp_add(mpl, mu, fp_mul(mpl, sigma, fp_normal01(mpl))); #endif return x; } /**********************************************************************/ /* * * SEGMENTED CHARACTER STRINGS * * */ /**********************************************************************/ /*---------------------------------------------------------------------- -- create_string - create character string. -- -- This routine creates a segmented character string, which is exactly -- equivalent to specified character string. */ STRING *create_string ( MPL *mpl, char buf[MAX_LENGTH+1] /* not changed */ ) #if 0 { STRING *head, *tail; int i, j; xassert(buf != NULL); xassert(strlen(buf) <= MAX_LENGTH); head = tail = dmp_get_atom(mpl->strings, sizeof(STRING)); for (i = j = 0; ; i++) { if ((tail->seg[j++] = buf[i]) == '\0') break; if (j == STRSEG_SIZE) tail = (tail->next = dmp_get_atom(mpl->strings, sizeof(STRING))), j = 0; } tail->next = NULL; return head; } #else { STRING *str; xassert(strlen(buf) <= MAX_LENGTH); str = dmp_get_atom(mpl->strings, strlen(buf)+1); strcpy(str, buf); return str; } #endif /*---------------------------------------------------------------------- -- copy_string - make copy of character string. -- -- This routine returns an exact copy of segmented character string. */ STRING *copy_string ( MPL *mpl, STRING *str /* not changed */ ) #if 0 { STRING *head, *tail; xassert(str != NULL); head = tail = dmp_get_atom(mpl->strings, sizeof(STRING)); for (; str != NULL; str = str->next) { memcpy(tail->seg, str->seg, STRSEG_SIZE); if (str->next != NULL) tail = (tail->next = dmp_get_atom(mpl->strings, sizeof(STRING))); } tail->next = NULL; return head; } #else { xassert(mpl == mpl); return create_string(mpl, str); } #endif /*---------------------------------------------------------------------- -- compare_strings - compare one character string with another. -- -- This routine compares one segmented character strings with another -- and returns the result of comparison as follows: -- -- = 0 - both strings are identical; -- < 0 - the first string precedes the second one; -- > 0 - the first string follows the second one. */ int compare_strings ( MPL *mpl, STRING *str1, /* not changed */ STRING *str2 /* not changed */ ) #if 0 { int j, c1, c2; xassert(mpl == mpl); for (;; str1 = str1->next, str2 = str2->next) { xassert(str1 != NULL); xassert(str2 != NULL); for (j = 0; j < STRSEG_SIZE; j++) { c1 = (unsigned char)str1->seg[j]; c2 = (unsigned char)str2->seg[j]; if (c1 < c2) return -1; if (c1 > c2) return +1; if (c1 == '\0') goto done; } } done: return 0; } #else { xassert(mpl == mpl); return strcmp(str1, str2); } #endif /*---------------------------------------------------------------------- -- fetch_string - extract content of character string. -- -- This routine returns a character string, which is exactly equivalent -- to specified segmented character string. */ char *fetch_string ( MPL *mpl, STRING *str, /* not changed */ char buf[MAX_LENGTH+1] /* modified */ ) #if 0 { int i, j; xassert(mpl == mpl); xassert(buf != NULL); for (i = 0; ; str = str->next) { xassert(str != NULL); for (j = 0; j < STRSEG_SIZE; j++) if ((buf[i++] = str->seg[j]) == '\0') goto done; } done: xassert(strlen(buf) <= MAX_LENGTH); return buf; } #else { xassert(mpl == mpl); return strcpy(buf, str); } #endif /*---------------------------------------------------------------------- -- delete_string - delete character string. -- -- This routine deletes specified segmented character string. */ void delete_string ( MPL *mpl, STRING *str /* destroyed */ ) #if 0 { STRING *temp; xassert(str != NULL); while (str != NULL) { temp = str; str = str->next; dmp_free_atom(mpl->strings, temp, sizeof(STRING)); } return; } #else { dmp_free_atom(mpl->strings, str, strlen(str)+1); return; } #endif /**********************************************************************/ /* * * SYMBOLS * * */ /**********************************************************************/ /*---------------------------------------------------------------------- -- create_symbol_num - create symbol of numeric type. -- -- This routine creates a symbol, which has a numeric value specified -- as floating-point number. */ SYMBOL *create_symbol_num(MPL *mpl, double num) { SYMBOL *sym; sym = dmp_get_atom(mpl->symbols, sizeof(SYMBOL)); sym->num = num; sym->str = NULL; return sym; } /*---------------------------------------------------------------------- -- create_symbol_str - create symbol of abstract type. -- -- This routine creates a symbol, which has an abstract value specified -- as segmented character string. */ SYMBOL *create_symbol_str ( MPL *mpl, STRING *str /* destroyed */ ) { SYMBOL *sym; xassert(str != NULL); sym = dmp_get_atom(mpl->symbols, sizeof(SYMBOL)); sym->num = 0.0; sym->str = str; return sym; } /*---------------------------------------------------------------------- -- copy_symbol - make copy of symbol. -- -- This routine returns an exact copy of symbol. */ SYMBOL *copy_symbol ( MPL *mpl, SYMBOL *sym /* not changed */ ) { SYMBOL *copy; xassert(sym != NULL); copy = dmp_get_atom(mpl->symbols, sizeof(SYMBOL)); if (sym->str == NULL) { copy->num = sym->num; copy->str = NULL; } else { copy->num = 0.0; copy->str = copy_string(mpl, sym->str); } return copy; } /*---------------------------------------------------------------------- -- compare_symbols - compare one symbol with another. -- -- This routine compares one symbol with another and returns the result -- of comparison as follows: -- -- = 0 - both symbols are identical; -- < 0 - the first symbol precedes the second one; -- > 0 - the first symbol follows the second one. -- -- Note that the linear order, in which symbols follow each other, is -- implementation-dependent. It may be not an alphabetical order. */ int compare_symbols ( MPL *mpl, SYMBOL *sym1, /* not changed */ SYMBOL *sym2 /* not changed */ ) { xassert(sym1 != NULL); xassert(sym2 != NULL); /* let all numeric quantities precede all symbolic quantities */ if (sym1->str == NULL && sym2->str == NULL) { if (sym1->num < sym2->num) return -1; if (sym1->num > sym2->num) return +1; return 0; } if (sym1->str == NULL) return -1; if (sym2->str == NULL) return +1; return compare_strings(mpl, sym1->str, sym2->str); } /*---------------------------------------------------------------------- -- delete_symbol - delete symbol. -- -- This routine deletes specified symbol. */ void delete_symbol ( MPL *mpl, SYMBOL *sym /* destroyed */ ) { xassert(sym != NULL); if (sym->str != NULL) delete_string(mpl, sym->str); dmp_free_atom(mpl->symbols, sym, sizeof(SYMBOL)); return; } /*---------------------------------------------------------------------- -- format_symbol - format symbol for displaying or printing. -- -- This routine converts specified symbol to a charater string, which -- is suitable for displaying or printing. -- -- The resultant string is never longer than 255 characters. If it gets -- longer, it is truncated from the right and appended by dots. */ char *format_symbol ( MPL *mpl, SYMBOL *sym /* not changed */ ) { char *buf = mpl->sym_buf; xassert(sym != NULL); if (sym->str == NULL) sprintf(buf, "%.*g", DBL_DIG, sym->num); else { char str[MAX_LENGTH+1]; int quoted, j, len; fetch_string(mpl, sym->str, str); if (!(isalpha((unsigned char)str[0]) || str[0] == '_')) quoted = 1; else { quoted = 0; for (j = 1; str[j] != '\0'; j++) { if (!(isalnum((unsigned char)str[j]) || strchr("+-._", (unsigned char)str[j]) != NULL)) { quoted = 1; break; } } } # define safe_append(c) \ (void)(len < 255 ? (buf[len++] = (char)(c)) : 0) buf[0] = '\0', len = 0; if (quoted) safe_append('\''); for (j = 0; str[j] != '\0'; j++) { if (quoted && str[j] == '\'') safe_append('\''); safe_append(str[j]); } if (quoted) safe_append('\''); # undef safe_append buf[len] = '\0'; if (len == 255) strcpy(buf+252, "..."); } xassert(strlen(buf) <= 255); return buf; } /*---------------------------------------------------------------------- -- concat_symbols - concatenate one symbol with another. -- -- This routine concatenates values of two given symbols and assigns -- the resultant character string to a new symbol, which is returned on -- exit. Both original symbols are destroyed. */ SYMBOL *concat_symbols ( MPL *mpl, SYMBOL *sym1, /* destroyed */ SYMBOL *sym2 /* destroyed */ ) { char str1[MAX_LENGTH+1], str2[MAX_LENGTH+1]; xassert(MAX_LENGTH >= DBL_DIG + DBL_DIG); if (sym1->str == NULL) sprintf(str1, "%.*g", DBL_DIG, sym1->num); else fetch_string(mpl, sym1->str, str1); if (sym2->str == NULL) sprintf(str2, "%.*g", DBL_DIG, sym2->num); else fetch_string(mpl, sym2->str, str2); if (strlen(str1) + strlen(str2) > MAX_LENGTH) { char buf[255+1]; strcpy(buf, format_symbol(mpl, sym1)); xassert(strlen(buf) < sizeof(buf)); error(mpl, "%s & %s; resultant symbol exceeds %d characters", buf, format_symbol(mpl, sym2), MAX_LENGTH); } delete_symbol(mpl, sym1); delete_symbol(mpl, sym2); return create_symbol_str(mpl, create_string(mpl, strcat(str1, str2))); } /**********************************************************************/ /* * * N-TUPLES * * */ /**********************************************************************/ /*---------------------------------------------------------------------- -- create_tuple - create n-tuple. -- -- This routine creates a n-tuple, which initially has no components, -- i.e. which is 0-tuple. */ TUPLE *create_tuple(MPL *mpl) { TUPLE *tuple; xassert(mpl == mpl); tuple = NULL; return tuple; } /*---------------------------------------------------------------------- -- expand_tuple - append symbol to n-tuple. -- -- This routine expands n-tuple appending to it a given symbol, which -- becomes its new last component. */ TUPLE *expand_tuple ( MPL *mpl, TUPLE *tuple, /* destroyed */ SYMBOL *sym /* destroyed */ ) { TUPLE *tail, *temp; xassert(sym != NULL); /* create a new component */ tail = dmp_get_atom(mpl->tuples, sizeof(TUPLE)); tail->sym = sym; tail->next = NULL; /* and append it to the component list */ if (tuple == NULL) tuple = tail; else { for (temp = tuple; temp->next != NULL; temp = temp->next); temp->next = tail; } return tuple; } /*---------------------------------------------------------------------- -- tuple_dimen - determine dimension of n-tuple. -- -- This routine returns dimension of n-tuple, i.e. number of components -- in the n-tuple. */ int tuple_dimen ( MPL *mpl, TUPLE *tuple /* not changed */ ) { TUPLE *temp; int dim = 0; xassert(mpl == mpl); for (temp = tuple; temp != NULL; temp = temp->next) dim++; return dim; } /*---------------------------------------------------------------------- -- copy_tuple - make copy of n-tuple. -- -- This routine returns an exact copy of n-tuple. */ TUPLE *copy_tuple ( MPL *mpl, TUPLE *tuple /* not changed */ ) { TUPLE *head, *tail; if (tuple == NULL) head = NULL; else { head = tail = dmp_get_atom(mpl->tuples, sizeof(TUPLE)); for (; tuple != NULL; tuple = tuple->next) { xassert(tuple->sym != NULL); tail->sym = copy_symbol(mpl, tuple->sym); if (tuple->next != NULL) tail = (tail->next = dmp_get_atom(mpl->tuples, sizeof(TUPLE))); } tail->next = NULL; } return head; } /*---------------------------------------------------------------------- -- compare_tuples - compare one n-tuple with another. -- -- This routine compares two given n-tuples, which must have the same -- dimension (not checked for the sake of efficiency), and returns one -- of the following codes: -- -- = 0 - both n-tuples are identical; -- < 0 - the first n-tuple precedes the second one; -- > 0 - the first n-tuple follows the second one. -- -- Note that the linear order, in which n-tuples follow each other, is -- implementation-dependent. It may be not an alphabetical order. */ int compare_tuples ( MPL *mpl, TUPLE *tuple1, /* not changed */ TUPLE *tuple2 /* not changed */ ) { TUPLE *item1, *item2; int ret; xassert(mpl == mpl); for (item1 = tuple1, item2 = tuple2; item1 != NULL; item1 = item1->next, item2 = item2->next) { xassert(item2 != NULL); xassert(item1->sym != NULL); xassert(item2->sym != NULL); ret = compare_symbols(mpl, item1->sym, item2->sym); if (ret != 0) return ret; } xassert(item2 == NULL); return 0; } /*---------------------------------------------------------------------- -- build_subtuple - build subtuple of given n-tuple. -- -- This routine builds subtuple, which consists of first dim components -- of given n-tuple. */ TUPLE *build_subtuple ( MPL *mpl, TUPLE *tuple, /* not changed */ int dim ) { TUPLE *head, *temp; int j; head = create_tuple(mpl); for (j = 1, temp = tuple; j <= dim; j++, temp = temp->next) { xassert(temp != NULL); head = expand_tuple(mpl, head, copy_symbol(mpl, temp->sym)); } return head; } /*---------------------------------------------------------------------- -- delete_tuple - delete n-tuple. -- -- This routine deletes specified n-tuple. */ void delete_tuple ( MPL *mpl, TUPLE *tuple /* destroyed */ ) { TUPLE *temp; while (tuple != NULL) { temp = tuple; tuple = temp->next; xassert(temp->sym != NULL); delete_symbol(mpl, temp->sym); dmp_free_atom(mpl->tuples, temp, sizeof(TUPLE)); } return; } /*---------------------------------------------------------------------- -- format_tuple - format n-tuple for displaying or printing. -- -- This routine converts specified n-tuple to a character string, which -- is suitable for displaying or printing. -- -- The resultant string is never longer than 255 characters. If it gets -- longer, it is truncated from the right and appended by dots. */ char *format_tuple ( MPL *mpl, int c, TUPLE *tuple /* not changed */ ) { TUPLE *temp; int dim, j, len; char *buf = mpl->tup_buf, str[255+1], *save; # define safe_append(c) \ (void)(len < 255 ? (buf[len++] = (char)(c)) : 0) buf[0] = '\0', len = 0; dim = tuple_dimen(mpl, tuple); if (c == '[' && dim > 0) safe_append('['); if (c == '(' && dim > 1) safe_append('('); for (temp = tuple; temp != NULL; temp = temp->next) { if (temp != tuple) safe_append(','); xassert(temp->sym != NULL); save = mpl->sym_buf; mpl->sym_buf = str; format_symbol(mpl, temp->sym); mpl->sym_buf = save; xassert(strlen(str) < sizeof(str)); for (j = 0; str[j] != '\0'; j++) safe_append(str[j]); } if (c == '[' && dim > 0) safe_append(']'); if (c == '(' && dim > 1) safe_append(')'); # undef safe_append buf[len] = '\0'; if (len == 255) strcpy(buf+252, "..."); xassert(strlen(buf) <= 255); return buf; } /**********************************************************************/ /* * * ELEMENTAL SETS * * */ /**********************************************************************/ /*---------------------------------------------------------------------- -- create_elemset - create elemental set. -- -- This routine creates an elemental set, whose members are n-tuples of -- specified dimension. Being created the set is initially empty. */ ELEMSET *create_elemset(MPL *mpl, int dim) { ELEMSET *set; xassert(dim > 0); set = create_array(mpl, A_NONE, dim); return set; } /*---------------------------------------------------------------------- -- find_tuple - check if elemental set contains given n-tuple. -- -- This routine finds given n-tuple in specified elemental set in order -- to check if the set contains that n-tuple. If the n-tuple is found, -- the routine returns pointer to corresponding array member. Otherwise -- null pointer is returned. */ MEMBER *find_tuple ( MPL *mpl, ELEMSET *set, /* not changed */ TUPLE *tuple /* not changed */ ) { xassert(set != NULL); xassert(set->type == A_NONE); xassert(set->dim == tuple_dimen(mpl, tuple)); return find_member(mpl, set, tuple); } /*---------------------------------------------------------------------- -- add_tuple - add new n-tuple to elemental set. -- -- This routine adds given n-tuple to specified elemental set. -- -- For the sake of efficiency this routine doesn't check whether the -- set already contains the same n-tuple or not. Therefore the calling -- program should use the routine find_tuple (if necessary) in order to -- make sure that the given n-tuple is not contained in the set, since -- duplicate n-tuples within the same set are not allowed. */ MEMBER *add_tuple ( MPL *mpl, ELEMSET *set, /* modified */ TUPLE *tuple /* destroyed */ ) { MEMBER *memb; xassert(set != NULL); xassert(set->type == A_NONE); xassert(set->dim == tuple_dimen(mpl, tuple)); memb = add_member(mpl, set, tuple); memb->value.none = NULL; return memb; } /*---------------------------------------------------------------------- -- check_then_add - check and add new n-tuple to elemental set. -- -- This routine is equivalent to the routine add_tuple except that it -- does check for duplicate n-tuples. */ MEMBER *check_then_add ( MPL *mpl, ELEMSET *set, /* modified */ TUPLE *tuple /* destroyed */ ) { if (find_tuple(mpl, set, tuple) != NULL) error(mpl, "duplicate tuple %s detected", format_tuple(mpl, '(', tuple)); return add_tuple(mpl, set, tuple); } /*---------------------------------------------------------------------- -- copy_elemset - make copy of elemental set. -- -- This routine makes an exact copy of elemental set. */ ELEMSET *copy_elemset ( MPL *mpl, ELEMSET *set /* not changed */ ) { ELEMSET *copy; MEMBER *memb; xassert(set != NULL); xassert(set->type == A_NONE); xassert(set->dim > 0); copy = create_elemset(mpl, set->dim); for (memb = set->head; memb != NULL; memb = memb->next) add_tuple(mpl, copy, copy_tuple(mpl, memb->tuple)); return copy; } /*---------------------------------------------------------------------- -- delete_elemset - delete elemental set. -- -- This routine deletes specified elemental set. */ void delete_elemset ( MPL *mpl, ELEMSET *set /* destroyed */ ) { xassert(set != NULL); xassert(set->type == A_NONE); delete_array(mpl, set); return; } /*---------------------------------------------------------------------- -- arelset_size - compute size of "arithmetic" elemental set. -- -- This routine computes the size of "arithmetic" elemental set, which -- is specified in the form of arithmetic progression: -- -- { t0 .. tf by dt }. -- -- The size is computed using the formula: -- -- n = max(0, floor((tf - t0) / dt) + 1). */ int arelset_size(MPL *mpl, double t0, double tf, double dt) { double temp; if (dt == 0.0) error(mpl, "%.*g .. %.*g by %.*g; zero stride not allowed", DBL_DIG, t0, DBL_DIG, tf, DBL_DIG, dt); if (tf > 0.0 && t0 < 0.0 && tf > + 0.999 * DBL_MAX + t0) temp = +DBL_MAX; else if (tf < 0.0 && t0 > 0.0 && tf < - 0.999 * DBL_MAX + t0) temp = -DBL_MAX; else temp = tf - t0; if (fabs(dt) < 1.0 && fabs(temp) > (0.999 * DBL_MAX) * fabs(dt)) { if (temp > 0.0 && dt > 0.0 || temp < 0.0 && dt < 0.0) temp = +DBL_MAX; else temp = 0.0; } else { temp = floor(temp / dt) + 1.0; if (temp < 0.0) temp = 0.0; } xassert(temp >= 0.0); if (temp > (double)(INT_MAX - 1)) error(mpl, "%.*g .. %.*g by %.*g; set too large", DBL_DIG, t0, DBL_DIG, tf, DBL_DIG, dt); return (int)(temp + 0.5); } /*---------------------------------------------------------------------- -- arelset_member - compute member of "arithmetic" elemental set. -- -- This routine returns a numeric value of symbol, which is equivalent -- to j-th member of given "arithmetic" elemental set specified in the -- form of arithmetic progression: -- -- { t0 .. tf by dt }. -- -- The symbol value is computed with the formula: -- -- j-th member = t0 + (j - 1) * dt, -- -- The number j must satisfy to the restriction 1 <= j <= n, where n is -- the set size computed by the routine arelset_size. */ double arelset_member(MPL *mpl, double t0, double tf, double dt, int j) { xassert(1 <= j && j <= arelset_size(mpl, t0, tf, dt)); return t0 + (double)(j - 1) * dt; } /*---------------------------------------------------------------------- -- create_arelset - create "arithmetic" elemental set. -- -- This routine creates "arithmetic" elemental set, which is specified -- in the form of arithmetic progression: -- -- { t0 .. tf by dt }. -- -- Components of this set are 1-tuples. */ ELEMSET *create_arelset(MPL *mpl, double t0, double tf, double dt) { ELEMSET *set; int j, n; set = create_elemset(mpl, 1); n = arelset_size(mpl, t0, tf, dt); for (j = 1; j <= n; j++) { add_tuple ( mpl, set, expand_tuple ( mpl, create_tuple(mpl), create_symbol_num ( mpl, arelset_member(mpl, t0, tf, dt, j) ) ) ); } return set; } /*---------------------------------------------------------------------- -- set_union - union of two elemental sets. -- -- This routine computes the union: -- -- X U Y = { j | (j in X) or (j in Y) }, -- -- where X and Y are given elemental sets (destroyed on exit). */ ELEMSET *set_union ( MPL *mpl, ELEMSET *X, /* destroyed */ ELEMSET *Y /* destroyed */ ) { MEMBER *memb; xassert(X != NULL); xassert(X->type == A_NONE); xassert(X->dim > 0); xassert(Y != NULL); xassert(Y->type == A_NONE); xassert(Y->dim > 0); xassert(X->dim == Y->dim); for (memb = Y->head; memb != NULL; memb = memb->next) { if (find_tuple(mpl, X, memb->tuple) == NULL) add_tuple(mpl, X, copy_tuple(mpl, memb->tuple)); } delete_elemset(mpl, Y); return X; } /*---------------------------------------------------------------------- -- set_diff - difference between two elemental sets. -- -- This routine computes the difference: -- -- X \ Y = { j | (j in X) and (j not in Y) }, -- -- where X and Y are given elemental sets (destroyed on exit). */ ELEMSET *set_diff ( MPL *mpl, ELEMSET *X, /* destroyed */ ELEMSET *Y /* destroyed */ ) { ELEMSET *Z; MEMBER *memb; xassert(X != NULL); xassert(X->type == A_NONE); xassert(X->dim > 0); xassert(Y != NULL); xassert(Y->type == A_NONE); xassert(Y->dim > 0); xassert(X->dim == Y->dim); Z = create_elemset(mpl, X->dim); for (memb = X->head; memb != NULL; memb = memb->next) { if (find_tuple(mpl, Y, memb->tuple) == NULL) add_tuple(mpl, Z, copy_tuple(mpl, memb->tuple)); } delete_elemset(mpl, X); delete_elemset(mpl, Y); return Z; } /*---------------------------------------------------------------------- -- set_symdiff - symmetric difference between two elemental sets. -- -- This routine computes the symmetric difference: -- -- X (+) Y = (X \ Y) U (Y \ X), -- -- where X and Y are given elemental sets (destroyed on exit). */ ELEMSET *set_symdiff ( MPL *mpl, ELEMSET *X, /* destroyed */ ELEMSET *Y /* destroyed */ ) { ELEMSET *Z; MEMBER *memb; xassert(X != NULL); xassert(X->type == A_NONE); xassert(X->dim > 0); xassert(Y != NULL); xassert(Y->type == A_NONE); xassert(Y->dim > 0); xassert(X->dim == Y->dim); /* Z := X \ Y */ Z = create_elemset(mpl, X->dim); for (memb = X->head; memb != NULL; memb = memb->next) { if (find_tuple(mpl, Y, memb->tuple) == NULL) add_tuple(mpl, Z, copy_tuple(mpl, memb->tuple)); } /* Z := Z U (Y \ X) */ for (memb = Y->head; memb != NULL; memb = memb->next) { if (find_tuple(mpl, X, memb->tuple) == NULL) add_tuple(mpl, Z, copy_tuple(mpl, memb->tuple)); } delete_elemset(mpl, X); delete_elemset(mpl, Y); return Z; } /*---------------------------------------------------------------------- -- set_inter - intersection of two elemental sets. -- -- This routine computes the intersection: -- -- X ^ Y = { j | (j in X) and (j in Y) }, -- -- where X and Y are given elemental sets (destroyed on exit). */ ELEMSET *set_inter ( MPL *mpl, ELEMSET *X, /* destroyed */ ELEMSET *Y /* destroyed */ ) { ELEMSET *Z; MEMBER *memb; xassert(X != NULL); xassert(X->type == A_NONE); xassert(X->dim > 0); xassert(Y != NULL); xassert(Y->type == A_NONE); xassert(Y->dim > 0); xassert(X->dim == Y->dim); Z = create_elemset(mpl, X->dim); for (memb = X->head; memb != NULL; memb = memb->next) { if (find_tuple(mpl, Y, memb->tuple) != NULL) add_tuple(mpl, Z, copy_tuple(mpl, memb->tuple)); } delete_elemset(mpl, X); delete_elemset(mpl, Y); return Z; } /*---------------------------------------------------------------------- -- set_cross - cross (Cartesian) product of two elemental sets. -- -- This routine computes the cross (Cartesian) product: -- -- X x Y = { (i,j) | (i in X) and (j in Y) }, -- -- where X and Y are given elemental sets (destroyed on exit). */ ELEMSET *set_cross ( MPL *mpl, ELEMSET *X, /* destroyed */ ELEMSET *Y /* destroyed */ ) { ELEMSET *Z; MEMBER *memx, *memy; TUPLE *tuple, *temp; xassert(X != NULL); xassert(X->type == A_NONE); xassert(X->dim > 0); xassert(Y != NULL); xassert(Y->type == A_NONE); xassert(Y->dim > 0); Z = create_elemset(mpl, X->dim + Y->dim); for (memx = X->head; memx != NULL; memx = memx->next) { for (memy = Y->head; memy != NULL; memy = memy->next) { tuple = copy_tuple(mpl, memx->tuple); for (temp = memy->tuple; temp != NULL; temp = temp->next) tuple = expand_tuple(mpl, tuple, copy_symbol(mpl, temp->sym)); add_tuple(mpl, Z, tuple); } } delete_elemset(mpl, X); delete_elemset(mpl, Y); return Z; } /**********************************************************************/ /* * * ELEMENTAL VARIABLES * * */ /**********************************************************************/ /* (there are no specific routines for elemental variables) */ /**********************************************************************/ /* * * LINEAR FORMS * * */ /**********************************************************************/ /*---------------------------------------------------------------------- -- constant_term - create constant term. -- -- This routine creates the linear form, which is a constant term. */ FORMULA *constant_term(MPL *mpl, double coef) { FORMULA *form; if (coef == 0.0) form = NULL; else { form = dmp_get_atom(mpl->formulae, sizeof(FORMULA)); form->coef = coef; form->var = NULL; form->next = NULL; } return form; } /*---------------------------------------------------------------------- -- single_variable - create single variable. -- -- This routine creates the linear form, which is a single elemental -- variable. */ FORMULA *single_variable ( MPL *mpl, ELEMVAR *var /* referenced */ ) { FORMULA *form; xassert(var != NULL); form = dmp_get_atom(mpl->formulae, sizeof(FORMULA)); form->coef = 1.0; form->var = var; form->next = NULL; return form; } /*---------------------------------------------------------------------- -- copy_formula - make copy of linear form. -- -- This routine returns an exact copy of linear form. */ FORMULA *copy_formula ( MPL *mpl, FORMULA *form /* not changed */ ) { FORMULA *head, *tail; if (form == NULL) head = NULL; else { head = tail = dmp_get_atom(mpl->formulae, sizeof(FORMULA)); for (; form != NULL; form = form->next) { tail->coef = form->coef; tail->var = form->var; if (form->next != NULL) tail = (tail->next = dmp_get_atom(mpl->formulae, sizeof(FORMULA))); } tail->next = NULL; } return head; } /*---------------------------------------------------------------------- -- delete_formula - delete linear form. -- -- This routine deletes specified linear form. */ void delete_formula ( MPL *mpl, FORMULA *form /* destroyed */ ) { FORMULA *temp; while (form != NULL) { temp = form; form = form->next; dmp_free_atom(mpl->formulae, temp, sizeof(FORMULA)); } return; } /*---------------------------------------------------------------------- -- linear_comb - linear combination of two linear forms. -- -- This routine computes the linear combination: -- -- a * fx + b * fy, -- -- where a and b are numeric coefficients, fx and fy are linear forms -- (destroyed on exit). */ FORMULA *linear_comb ( MPL *mpl, double a, FORMULA *fx, /* destroyed */ double b, FORMULA *fy /* destroyed */ ) { FORMULA *form = NULL, *term, *temp; double c0 = 0.0; for (term = fx; term != NULL; term = term->next) { if (term->var == NULL) c0 = fp_add(mpl, c0, fp_mul(mpl, a, term->coef)); else term->var->temp = fp_add(mpl, term->var->temp, fp_mul(mpl, a, term->coef)); } for (term = fy; term != NULL; term = term->next) { if (term->var == NULL) c0 = fp_add(mpl, c0, fp_mul(mpl, b, term->coef)); else term->var->temp = fp_add(mpl, term->var->temp, fp_mul(mpl, b, term->coef)); } for (term = fx; term != NULL; term = term->next) { if (term->var != NULL && term->var->temp != 0.0) { temp = dmp_get_atom(mpl->formulae, sizeof(FORMULA)); temp->coef = term->var->temp, temp->var = term->var; temp->next = form, form = temp; term->var->temp = 0.0; } } for (term = fy; term != NULL; term = term->next) { if (term->var != NULL && term->var->temp != 0.0) { temp = dmp_get_atom(mpl->formulae, sizeof(FORMULA)); temp->coef = term->var->temp, temp->var = term->var; temp->next = form, form = temp; term->var->temp = 0.0; } } if (c0 != 0.0) { temp = dmp_get_atom(mpl->formulae, sizeof(FORMULA)); temp->coef = c0, temp->var = NULL; temp->next = form, form = temp; } delete_formula(mpl, fx); delete_formula(mpl, fy); return form; } /*---------------------------------------------------------------------- -- remove_constant - remove constant term from linear form. -- -- This routine removes constant term from linear form and stores its -- value to given location. */ FORMULA *remove_constant ( MPL *mpl, FORMULA *form, /* destroyed */ double *coef /* modified */ ) { FORMULA *head = NULL, *temp; *coef = 0.0; while (form != NULL) { temp = form; form = form->next; if (temp->var == NULL) { /* constant term */ *coef = fp_add(mpl, *coef, temp->coef); dmp_free_atom(mpl->formulae, temp, sizeof(FORMULA)); } else { /* linear term */ temp->next = head; head = temp; } } return head; } /*---------------------------------------------------------------------- -- reduce_terms - reduce identical terms in linear form. -- -- This routine reduces identical terms in specified linear form. */ FORMULA *reduce_terms ( MPL *mpl, FORMULA *form /* destroyed */ ) { FORMULA *term, *next_term; double c0 = 0.0; for (term = form; term != NULL; term = term->next) { if (term->var == NULL) c0 = fp_add(mpl, c0, term->coef); else term->var->temp = fp_add(mpl, term->var->temp, term->coef); } next_term = form, form = NULL; for (term = next_term; term != NULL; term = next_term) { next_term = term->next; if (term->var == NULL && c0 != 0.0) { term->coef = c0, c0 = 0.0; term->next = form, form = term; } else if (term->var != NULL && term->var->temp != 0.0) { term->coef = term->var->temp, term->var->temp = 0.0; term->next = form, form = term; } else dmp_free_atom(mpl->formulae, term, sizeof(FORMULA)); } return form; } /**********************************************************************/ /* * * ELEMENTAL CONSTRAINTS * * */ /**********************************************************************/ /* (there are no specific routines for elemental constraints) */ /**********************************************************************/ /* * * GENERIC VALUES * * */ /**********************************************************************/ /*---------------------------------------------------------------------- -- delete_value - delete generic value. -- -- This routine deletes specified generic value. -- -- NOTE: The generic value to be deleted must be valid. */ void delete_value ( MPL *mpl, int type, VALUE *value /* content destroyed */ ) { xassert(value != NULL); switch (type) { case A_NONE: value->none = NULL; break; case A_NUMERIC: value->num = 0.0; break; case A_SYMBOLIC: delete_symbol(mpl, value->sym), value->sym = NULL; break; case A_LOGICAL: value->bit = 0; break; case A_TUPLE: delete_tuple(mpl, value->tuple), value->tuple = NULL; break; case A_ELEMSET: delete_elemset(mpl, value->set), value->set = NULL; break; case A_ELEMVAR: value->var = NULL; break; case A_FORMULA: delete_formula(mpl, value->form), value->form = NULL; break; case A_ELEMCON: value->con = NULL; break; default: xassert(type != type); } return; } /**********************************************************************/ /* * * SYMBOLICALLY INDEXED ARRAYS * * */ /**********************************************************************/ /*---------------------------------------------------------------------- -- create_array - create array. -- -- This routine creates an array of specified type and dimension. Being -- created the array is initially empty. -- -- The type indicator determines generic values, which can be assigned -- to the array members: -- -- A_NONE - none (members have no assigned values) -- A_NUMERIC - floating-point numbers -- A_SYMBOLIC - symbols -- A_ELEMSET - elemental sets -- A_ELEMVAR - elemental variables -- A_ELEMCON - elemental constraints -- -- The dimension may be 0, in which case the array consists of the only -- member (such arrays represent 0-dimensional objects). */ ARRAY *create_array(MPL *mpl, int type, int dim) { ARRAY *array; xassert(type == A_NONE || type == A_NUMERIC || type == A_SYMBOLIC || type == A_ELEMSET || type == A_ELEMVAR || type == A_ELEMCON); xassert(dim >= 0); array = dmp_get_atom(mpl->arrays, sizeof(ARRAY)); array->type = type; array->dim = dim; array->size = 0; array->head = NULL; array->tail = NULL; array->tree = NULL; array->prev = NULL; array->next = mpl->a_list; /* include the array in the global array list */ if (array->next != NULL) array->next->prev = array; mpl->a_list = array; return array; } /*---------------------------------------------------------------------- -- find_member - find array member with given n-tuple. -- -- This routine finds an array member, which has given n-tuple. If the -- array is short, the linear search is used. Otherwise the routine -- autimatically creates the search tree (i.e. the array index) to find -- members for logarithmic time. */ static int compare_member_tuples(void *info, const void *key1, const void *key2) { /* this is an auxiliary routine used to compare keys, which are n-tuples assigned to array members */ return compare_tuples((MPL *)info, (TUPLE *)key1, (TUPLE *)key2); } MEMBER *find_member ( MPL *mpl, ARRAY *array, /* not changed */ TUPLE *tuple /* not changed */ ) { MEMBER *memb; xassert(array != NULL); /* the n-tuple must have the same dimension as the array */ xassert(tuple_dimen(mpl, tuple) == array->dim); /* if the array is large enough, create the search tree and index all existing members of the array */ if (array->size > 30 && array->tree == NULL) { array->tree = avl_create_tree(compare_member_tuples, mpl); for (memb = array->head; memb != NULL; memb = memb->next) avl_set_node_link(avl_insert_node(array->tree, memb->tuple), (void *)memb); } /* find a member, which has the given tuple */ if (array->tree == NULL) { /* the search tree doesn't exist; use the linear search */ for (memb = array->head; memb != NULL; memb = memb->next) if (compare_tuples(mpl, memb->tuple, tuple) == 0) break; } else { /* the search tree exists; use the binary search */ AVLNODE *node; node = avl_find_node(array->tree, tuple); memb = (MEMBER *)(node == NULL ? NULL : avl_get_node_link(node)); } return memb; } /*---------------------------------------------------------------------- -- add_member - add new member to array. -- -- This routine creates a new member with given n-tuple and adds it to -- specified array. -- -- For the sake of efficiency this routine doesn't check whether the -- array already contains a member with the given n-tuple or not. Thus, -- if necessary, the calling program should use the routine find_member -- in order to be sure that the array contains no member with the same -- n-tuple, because members with duplicate n-tuples are not allowed. -- -- This routine assigns no generic value to the new member, because the -- calling program must do that. */ MEMBER *add_member ( MPL *mpl, ARRAY *array, /* modified */ TUPLE *tuple /* destroyed */ ) { MEMBER *memb; xassert(array != NULL); /* the n-tuple must have the same dimension as the array */ xassert(tuple_dimen(mpl, tuple) == array->dim); /* create new member */ memb = dmp_get_atom(mpl->members, sizeof(MEMBER)); memb->tuple = tuple; memb->next = NULL; memset(&memb->value, '?', sizeof(VALUE)); /* and append it to the member list */ array->size++; if (array->head == NULL) array->head = memb; else array->tail->next = memb; array->tail = memb; /* if the search tree exists, index the new member */ if (array->tree != NULL) avl_set_node_link(avl_insert_node(array->tree, memb->tuple), (void *)memb); return memb; } /*---------------------------------------------------------------------- -- delete_array - delete array. -- -- This routine deletes specified array. -- -- Generic values assigned to the array members are not deleted by this -- routine. The calling program itself must delete all assigned generic -- values before deleting the array. */ void delete_array ( MPL *mpl, ARRAY *array /* destroyed */ ) { MEMBER *memb; xassert(array != NULL); /* delete all existing array members */ while (array->head != NULL) { memb = array->head; array->head = memb->next; delete_tuple(mpl, memb->tuple); dmp_free_atom(mpl->members, memb, sizeof(MEMBER)); } /* if the search tree exists, also delete it */ if (array->tree != NULL) avl_delete_tree(array->tree); /* remove the array from the global array list */ if (array->prev == NULL) mpl->a_list = array->next; else array->prev->next = array->next; if (array->next == NULL) ; else array->next->prev = array->prev; /* delete the array descriptor */ dmp_free_atom(mpl->arrays, array, sizeof(ARRAY)); return; } /**********************************************************************/ /* * * DOMAINS AND DUMMY INDICES * * */ /**********************************************************************/ /*---------------------------------------------------------------------- -- assign_dummy_index - assign new value to dummy index. -- -- This routine assigns new value to specified dummy index and, that is -- important, invalidates all temporary resultant values, which depends -- on that dummy index. */ void assign_dummy_index ( MPL *mpl, DOMAIN_SLOT *slot, /* modified */ SYMBOL *value /* not changed */ ) { CODE *leaf, *code; xassert(slot != NULL); xassert(value != NULL); /* delete the current value assigned to the dummy index */ if (slot->value != NULL) { /* if the current value and the new one are identical, actual assignment is not needed */ if (compare_symbols(mpl, slot->value, value) == 0) goto done; /* delete a symbol, which is the current value */ delete_symbol(mpl, slot->value), slot->value = NULL; } /* now walk through all the pseudo-codes with op = O_INDEX, which refer to the dummy index to be changed (these pseudo-codes are leaves in the forest of *all* expressions in the database) */ for (leaf = slot->list; leaf != NULL; leaf = leaf->arg.index. next) { xassert(leaf->op == O_INDEX); /* invalidate all resultant values, which depend on the dummy index, walking from the current leaf toward the root of the corresponding expression tree */ for (code = leaf; code != NULL; code = code->up) { if (code->valid) { /* invalidate and delete resultant value */ code->valid = 0; delete_value(mpl, code->type, &code->value); } } } /* assign new value to the dummy index */ slot->value = copy_symbol(mpl, value); done: return; } /*---------------------------------------------------------------------- -- update_dummy_indices - update current values of dummy indices. -- -- This routine assigns components of "backup" n-tuple to dummy indices -- of specified domain block. If no "backup" n-tuple is defined for the -- domain block, values of the dummy indices remain untouched. */ void update_dummy_indices ( MPL *mpl, DOMAIN_BLOCK *block /* not changed */ ) { DOMAIN_SLOT *slot; TUPLE *temp; if (block->backup != NULL) { for (slot = block->list, temp = block->backup; slot != NULL; slot = slot->next, temp = temp->next) { xassert(temp != NULL); xassert(temp->sym != NULL); assign_dummy_index(mpl, slot, temp->sym); } } return; } /*---------------------------------------------------------------------- -- enter_domain_block - enter domain block. -- -- Let specified domain block have the form: -- -- { ..., (j1, j2, ..., jn) in J, ... } -- -- where j1, j2, ..., jn are dummy indices, J is a basic set. -- -- This routine does the following: -- -- 1. Checks if the given n-tuple is a member of the basic set J. Note -- that J being *out of the scope* of the domain block cannot depend -- on the dummy indices in the same and inner domain blocks, so it -- can be computed before the dummy indices are assigned new values. -- If this check fails, the routine returns with non-zero code. -- -- 2. Saves current values of the dummy indices j1, j2, ..., jn. -- -- 3. Assigns new values, which are components of the given n-tuple, to -- the dummy indices j1, j2, ..., jn. If dimension of the n-tuple is -- larger than n, its extra components n+1, n+2, ... are not used. -- -- 4. Calls the formal routine func which either enters the next domain -- block or evaluates some code within the domain scope. -- -- 5. Restores former values of the dummy indices j1, j2, ..., jn. -- -- Since current values assigned to the dummy indices on entry to this -- routine are restored on exit, the formal routine func is allowed to -- call this routine recursively. */ int enter_domain_block ( MPL *mpl, DOMAIN_BLOCK *block, /* not changed */ TUPLE *tuple, /* not changed */ void *info, void (*func)(MPL *mpl, void *info) ) { TUPLE *backup; int ret = 0; /* check if the given n-tuple is a member of the basic set */ xassert(block->code != NULL); if (!is_member(mpl, block->code, tuple)) { ret = 1; goto done; } /* save reference to "backup" n-tuple, which was used to assign current values of the dummy indices (it is sufficient to save reference, not value, because that n-tuple is defined in some outer level of recursion and therefore cannot be changed on this and deeper recursive calls) */ backup = block->backup; /* set up new "backup" n-tuple, which defines new values of the dummy indices */ block->backup = tuple; /* assign new values to the dummy indices */ update_dummy_indices(mpl, block); /* call the formal routine that does the rest part of the job */ func(mpl, info); /* restore reference to the former "backup" n-tuple */ block->backup = backup; /* restore former values of the dummy indices; note that if the domain block just escaped has no other active instances which may exist due to recursion (it is indicated by a null pointer to the former n-tuple), former values of the dummy indices are undefined; therefore in this case the routine keeps currently assigned values of the dummy indices that involves keeping all dependent temporary results and thereby, if this domain block is not used recursively, allows improving efficiency */ update_dummy_indices(mpl, block); done: return ret; } /*---------------------------------------------------------------------- -- eval_within_domain - perform evaluation within domain scope. -- -- This routine assigns new values (symbols) to all dummy indices of -- specified domain and calls the formal routine func, which is used to -- evaluate some code in the domain scope. Each free dummy index in the -- domain is assigned a value specified in the corresponding component -- of given n-tuple. Non-free dummy indices are assigned values, which -- are computed by this routine. -- -- Number of components in the given n-tuple must be the same as number -- of free indices in the domain. -- -- If the given n-tuple is not a member of the domain set, the routine -- func is not called, and non-zero code is returned. -- -- For the sake of convenience it is allowed to specify domain as NULL -- (then n-tuple also must be 0-tuple, i.e. empty), in which case this -- routine just calls the routine func and returns zero. -- -- This routine allows recursive calls from the routine func providing -- correct values of dummy indices for each instance. -- -- NOTE: The n-tuple passed to this routine must not be changed by any -- other routines called from the formal routine func until this -- routine has returned. */ struct eval_domain_info { /* working info used by the routine eval_within_domain */ DOMAIN *domain; /* domain, which has to be entered */ DOMAIN_BLOCK *block; /* domain block, which is currently processed */ TUPLE *tuple; /* tail of original n-tuple, whose components have to be assigned to free dummy indices in the current domain block */ void *info; /* transit pointer passed to the formal routine func */ void (*func)(MPL *mpl, void *info); /* routine, which has to be executed in the domain scope */ int failure; /* this flag indicates that given n-tuple is not a member of the domain set */ }; static void eval_domain_func(MPL *mpl, void *_my_info) { /* this routine recursively enters into the domain scope and then calls the routine func */ struct eval_domain_info *my_info = _my_info; if (my_info->block != NULL) { /* the current domain block to be entered exists */ DOMAIN_BLOCK *block; DOMAIN_SLOT *slot; TUPLE *tuple = NULL, *temp = NULL; /* save pointer to the current domain block */ block = my_info->block; /* and get ready to enter the next block (if it exists) */ my_info->block = block->next; /* construct temporary n-tuple, whose components correspond to dummy indices (slots) of the current domain; components of the temporary n-tuple that correspond to free dummy indices are assigned references (not values!) to symbols specified in the corresponding components of the given n-tuple, while other components that correspond to non-free dummy indices are assigned symbolic values computed here */ for (slot = block->list; slot != NULL; slot = slot->next) { /* create component that corresponds to the current slot */ if (tuple == NULL) tuple = temp = dmp_get_atom(mpl->tuples, sizeof(TUPLE)); else temp = (temp->next = dmp_get_atom(mpl->tuples, sizeof(TUPLE))); if (slot->code == NULL) { /* dummy index is free; take reference to symbol, which is specified in the corresponding component of given n-tuple */ xassert(my_info->tuple != NULL); temp->sym = my_info->tuple->sym; xassert(temp->sym != NULL); my_info->tuple = my_info->tuple->next; } else { /* dummy index is non-free; compute symbolic value to be temporarily assigned to the dummy index */ temp->sym = eval_symbolic(mpl, slot->code); } } temp->next = NULL; /* enter the current domain block */ if (enter_domain_block(mpl, block, tuple, my_info, eval_domain_func)) my_info->failure = 1; /* delete temporary n-tuple as well as symbols that correspond to non-free dummy indices (they were computed here) */ for (slot = block->list; slot != NULL; slot = slot->next) { xassert(tuple != NULL); temp = tuple; tuple = tuple->next; if (slot->code != NULL) { /* dummy index is non-free; delete symbolic value */ delete_symbol(mpl, temp->sym); } /* delete component that corresponds to the current slot */ dmp_free_atom(mpl->tuples, temp, sizeof(TUPLE)); } } else { /* there are no more domain blocks, i.e. we have reached the domain scope */ xassert(my_info->tuple == NULL); /* check optional predicate specified for the domain */ if (my_info->domain->code != NULL && !eval_logical(mpl, my_info->domain->code)) { /* the predicate is false */ my_info->failure = 2; } else { /* the predicate is true; do the job */ my_info->func(mpl, my_info->info); } } return; } int eval_within_domain ( MPL *mpl, DOMAIN *domain, /* not changed */ TUPLE *tuple, /* not changed */ void *info, void (*func)(MPL *mpl, void *info) ) { /* this routine performs evaluation within domain scope */ struct eval_domain_info _my_info, *my_info = &_my_info; if (domain == NULL) { xassert(tuple == NULL); func(mpl, info); my_info->failure = 0; } else { xassert(tuple != NULL); my_info->domain = domain; my_info->block = domain->list; my_info->tuple = tuple; my_info->info = info; my_info->func = func; my_info->failure = 0; /* enter the very first domain block */ eval_domain_func(mpl, my_info); } return my_info->failure; } /*---------------------------------------------------------------------- -- loop_within_domain - perform iterations within domain scope. -- -- This routine iteratively assigns new values (symbols) to the dummy -- indices of specified domain by enumerating all n-tuples, which are -- members of the domain set, and for every n-tuple it calls the formal -- routine func to evaluate some code within the domain scope. -- -- If the routine func returns non-zero, enumeration within the domain -- is prematurely terminated. -- -- For the sake of convenience it is allowed to specify domain as NULL, -- in which case this routine just calls the routine func only once and -- returns zero. -- -- This routine allows recursive calls from the routine func providing -- correct values of dummy indices for each instance. */ struct loop_domain_info { /* working info used by the routine loop_within_domain */ DOMAIN *domain; /* domain, which has to be entered */ DOMAIN_BLOCK *block; /* domain block, which is currently processed */ int looping; /* clearing this flag leads to terminating enumeration */ void *info; /* transit pointer passed to the formal routine func */ int (*func)(MPL *mpl, void *info); /* routine, which needs to be executed in the domain scope */ }; static void loop_domain_func(MPL *mpl, void *_my_info) { /* this routine enumerates all n-tuples in the basic set of the current domain block, enters recursively into the domain scope for every n-tuple, and then calls the routine func */ struct loop_domain_info *my_info = _my_info; if (my_info->block != NULL) { /* the current domain block to be entered exists */ DOMAIN_BLOCK *block; DOMAIN_SLOT *slot; TUPLE *bound; /* save pointer to the current domain block */ block = my_info->block; /* and get ready to enter the next block (if it exists) */ my_info->block = block->next; /* compute symbolic values, at which non-free dummy indices of the current domain block are bound; since that values don't depend on free dummy indices of the current block, they can be computed once out of the enumeration loop */ bound = create_tuple(mpl); for (slot = block->list; slot != NULL; slot = slot->next) { if (slot->code != NULL) bound = expand_tuple(mpl, bound, eval_symbolic(mpl, slot->code)); } /* start enumeration */ xassert(block->code != NULL); if (block->code->op == O_DOTS) { /* the basic set is "arithmetic", in which case it doesn't need to be computed explicitly */ TUPLE *tuple; int n, j; double t0, tf, dt; /* compute "parameters" of the basic set */ t0 = eval_numeric(mpl, block->code->arg.arg.x); tf = eval_numeric(mpl, block->code->arg.arg.y); if (block->code->arg.arg.z == NULL) dt = 1.0; else dt = eval_numeric(mpl, block->code->arg.arg.z); /* determine cardinality of the basic set */ n = arelset_size(mpl, t0, tf, dt); /* create dummy 1-tuple for members of the basic set */ tuple = expand_tuple(mpl, create_tuple(mpl), create_symbol_num(mpl, 0.0)); /* in case of "arithmetic" set there is exactly one dummy index, which cannot be non-free */ xassert(bound == NULL); /* walk through 1-tuples of the basic set */ for (j = 1; j <= n && my_info->looping; j++) { /* construct dummy 1-tuple for the current member */ tuple->sym->num = arelset_member(mpl, t0, tf, dt, j); /* enter the current domain block */ enter_domain_block(mpl, block, tuple, my_info, loop_domain_func); } /* delete dummy 1-tuple */ delete_tuple(mpl, tuple); } else { /* the basic set is of general kind, in which case it needs to be explicitly computed */ ELEMSET *set; MEMBER *memb; TUPLE *temp1, *temp2; /* compute the basic set */ set = eval_elemset(mpl, block->code); /* walk through all n-tuples of the basic set */ for (memb = set->head; memb != NULL && my_info->looping; memb = memb->next) { /* all components of the current n-tuple that correspond to non-free dummy indices must be feasible; otherwise the n-tuple is not in the basic set */ temp1 = memb->tuple; temp2 = bound; for (slot = block->list; slot != NULL; slot = slot->next) { xassert(temp1 != NULL); if (slot->code != NULL) { /* non-free dummy index */ xassert(temp2 != NULL); if (compare_symbols(mpl, temp1->sym, temp2->sym) != 0) { /* the n-tuple is not in the basic set */ goto skip; } temp2 = temp2->next; } temp1 = temp1->next; } xassert(temp1 == NULL); xassert(temp2 == NULL); /* enter the current domain block */ enter_domain_block(mpl, block, memb->tuple, my_info, loop_domain_func); skip: ; } /* delete the basic set */ delete_elemset(mpl, set); } /* delete symbolic values binding non-free dummy indices */ delete_tuple(mpl, bound); /* restore pointer to the current domain block */ my_info->block = block; } else { /* there are no more domain blocks, i.e. we have reached the domain scope */ /* check optional predicate specified for the domain */ if (my_info->domain->code != NULL && !eval_logical(mpl, my_info->domain->code)) { /* the predicate is false */ /* nop */; } else { /* the predicate is true; do the job */ my_info->looping = !my_info->func(mpl, my_info->info); } } return; } void loop_within_domain ( MPL *mpl, DOMAIN *domain, /* not changed */ void *info, int (*func)(MPL *mpl, void *info) ) { /* this routine performs iterations within domain scope */ struct loop_domain_info _my_info, *my_info = &_my_info; if (domain == NULL) func(mpl, info); else { my_info->domain = domain; my_info->block = domain->list; my_info->looping = 1; my_info->info = info; my_info->func = func; /* enter the very first domain block */ loop_domain_func(mpl, my_info); } return; } /*---------------------------------------------------------------------- -- out_of_domain - raise domain exception. -- -- This routine is called when a reference is made to a member of some -- model object, but its n-tuple is out of the object domain. */ void out_of_domain ( MPL *mpl, char *name, /* not changed */ TUPLE *tuple /* not changed */ ) { xassert(name != NULL); xassert(tuple != NULL); error(mpl, "%s%s out of domain", name, format_tuple(mpl, '[', tuple)); /* no return */ } /*---------------------------------------------------------------------- -- get_domain_tuple - obtain current n-tuple from domain. -- -- This routine constructs n-tuple, whose components are current values -- assigned to *free* dummy indices of specified domain. -- -- For the sake of convenience it is allowed to specify domain as NULL, -- in which case this routine returns 0-tuple. -- -- NOTE: This routine must not be called out of domain scope. */ TUPLE *get_domain_tuple ( MPL *mpl, DOMAIN *domain /* not changed */ ) { DOMAIN_BLOCK *block; DOMAIN_SLOT *slot; TUPLE *tuple; tuple = create_tuple(mpl); if (domain != NULL) { for (block = domain->list; block != NULL; block = block->next) { for (slot = block->list; slot != NULL; slot = slot->next) { if (slot->code == NULL) { xassert(slot->value != NULL); tuple = expand_tuple(mpl, tuple, copy_symbol(mpl, slot->value)); } } } } return tuple; } /*---------------------------------------------------------------------- -- clean_domain - clean domain. -- -- This routine cleans specified domain that assumes deleting all stuff -- dynamically allocated during the generation phase. */ void clean_domain(MPL *mpl, DOMAIN *domain) { DOMAIN_BLOCK *block; DOMAIN_SLOT *slot; /* if no domain is specified, do nothing */ if (domain == NULL) goto done; /* clean all domain blocks */ for (block = domain->list; block != NULL; block = block->next) { /* clean all domain slots */ for (slot = block->list; slot != NULL; slot = slot->next) { /* clean pseudo-code for computing bound value */ clean_code(mpl, slot->code); /* delete symbolic value assigned to dummy index */ if (slot->value != NULL) delete_symbol(mpl, slot->value), slot->value = NULL; } /* clean pseudo-code for computing basic set */ clean_code(mpl, block->code); } /* clean pseudo-code for computing domain predicate */ clean_code(mpl, domain->code); done: return; } /**********************************************************************/ /* * * MODEL SETS * * */ /**********************************************************************/ /*---------------------------------------------------------------------- -- check_elem_set - check elemental set assigned to set member. -- -- This routine checks if given elemental set being assigned to member -- of specified model set satisfies to all restrictions. -- -- NOTE: This routine must not be called out of domain scope. */ void check_elem_set ( MPL *mpl, SET *set, /* not changed */ TUPLE *tuple, /* not changed */ ELEMSET *refer /* not changed */ ) { WITHIN *within; MEMBER *memb; int eqno; /* elemental set must be within all specified supersets */ for (within = set->within, eqno = 1; within != NULL; within = within->next, eqno++) { xassert(within->code != NULL); for (memb = refer->head; memb != NULL; memb = memb->next) { if (!is_member(mpl, within->code, memb->tuple)) { char buf[255+1]; strcpy(buf, format_tuple(mpl, '(', memb->tuple)); xassert(strlen(buf) < sizeof(buf)); error(mpl, "%s%s contains %s which not within specified " "set; see (%d)", set->name, format_tuple(mpl, '[', tuple), buf, eqno); } } } return; } /*---------------------------------------------------------------------- -- take_member_set - obtain elemental set assigned to set member. -- -- This routine obtains a reference to elemental set assigned to given -- member of specified model set and returns it on exit. -- -- NOTE: This routine must not be called out of domain scope. */ ELEMSET *take_member_set /* returns reference, not value */ ( MPL *mpl, SET *set, /* not changed */ TUPLE *tuple /* not changed */ ) { MEMBER *memb; ELEMSET *refer; /* find member in the set array */ memb = find_member(mpl, set->array, tuple); if (memb != NULL) { /* member exists, so just take the reference */ refer = memb->value.set; } else if (set->assign != NULL) { /* compute value using assignment expression */ refer = eval_elemset(mpl, set->assign); add: /* check that the elemental set satisfies to all restrictions, assign it to new member, and add the member to the array */ check_elem_set(mpl, set, tuple, refer); memb = add_member(mpl, set->array, copy_tuple(mpl, tuple)); memb->value.set = refer; } else if (set->option != NULL) { /* compute default elemental set */ refer = eval_elemset(mpl, set->option); goto add; } else { /* no value (elemental set) is provided */ error(mpl, "no value for %s%s", set->name, format_tuple(mpl, '[', tuple)); } return refer; } /*---------------------------------------------------------------------- -- eval_member_set - evaluate elemental set assigned to set member. -- -- This routine evaluates a reference to elemental set assigned to given -- member of specified model set and returns it on exit. */ struct eval_set_info { /* working info used by the routine eval_member_set */ SET *set; /* model set */ TUPLE *tuple; /* n-tuple, which defines set member */ MEMBER *memb; /* normally this pointer is NULL; the routine uses this pointer to check data provided in the data section, in which case it points to a member currently checked; this check is performed automatically only once when a reference to any member occurs for the first time */ ELEMSET *refer; /* evaluated reference to elemental set */ }; static void eval_set_func(MPL *mpl, void *_info) { /* this is auxiliary routine to work within domain scope */ struct eval_set_info *info = _info; if (info->memb != NULL) { /* checking call; check elemental set being assigned */ check_elem_set(mpl, info->set, info->memb->tuple, info->memb->value.set); } else { /* normal call; evaluate member, which has given n-tuple */ info->refer = take_member_set(mpl, info->set, info->tuple); } return; } #if 1 /* 12/XII-2008 */ static void saturate_set(MPL *mpl, SET *set) { GADGET *gadget = set->gadget; ELEMSET *data; MEMBER *elem, *memb; TUPLE *tuple, *work[20]; int i; xprintf("Generating %s...\n", set->name); eval_whole_set(mpl, gadget->set); /* gadget set must have exactly one member */ xassert(gadget->set->array != NULL); xassert(gadget->set->array->head != NULL); xassert(gadget->set->array->head == gadget->set->array->tail); data = gadget->set->array->head->value.set; xassert(data->type == A_NONE); xassert(data->dim == gadget->set->dimen); /* walk thru all elements of the plain set */ for (elem = data->head; elem != NULL; elem = elem->next) { /* create a copy of n-tuple */ tuple = copy_tuple(mpl, elem->tuple); /* rearrange component of the n-tuple */ for (i = 0; i < gadget->set->dimen; i++) work[i] = NULL; for (i = 0; tuple != NULL; tuple = tuple->next) work[gadget->ind[i++]-1] = tuple; xassert(i == gadget->set->dimen); for (i = 0; i < gadget->set->dimen; i++) { xassert(work[i] != NULL); work[i]->next = work[i+1]; } /* construct subscript list from first set->dim components */ if (set->dim == 0) tuple = NULL; else tuple = work[0], work[set->dim-1]->next = NULL; /* find corresponding member of the set to be initialized */ memb = find_member(mpl, set->array, tuple); if (memb == NULL) { /* not found; add new member to the set and assign it empty elemental set */ memb = add_member(mpl, set->array, tuple); memb->value.set = create_elemset(mpl, set->dimen); } else { /* found; free subscript list */ delete_tuple(mpl, tuple); } /* construct new n-tuple from rest set->dimen components */ tuple = work[set->dim]; xassert(set->dim + set->dimen == gadget->set->dimen); work[gadget->set->dimen-1]->next = NULL; /* and add it to the elemental set assigned to the member (no check for duplicates is needed) */ add_tuple(mpl, memb->value.set, tuple); } /* the set has been saturated with data */ set->data = 1; return; } #endif ELEMSET *eval_member_set /* returns reference, not value */ ( MPL *mpl, SET *set, /* not changed */ TUPLE *tuple /* not changed */ ) { /* this routine evaluates set member */ struct eval_set_info _info, *info = &_info; xassert(set->dim == tuple_dimen(mpl, tuple)); info->set = set; info->tuple = tuple; #if 1 /* 12/XII-2008 */ if (set->gadget != NULL && set->data == 0) { /* initialize the set with data from a plain set */ saturate_set(mpl, set); } #endif if (set->data == 1) { /* check data, which are provided in the data section, but not checked yet */ /* save pointer to the last array member; note that during the check new members may be added beyond the last member due to references to the same parameter from default expression as well as from expressions that define restricting supersets; however, values assigned to the new members will be checked by other routine, so we don't need to check them here */ MEMBER *tail = set->array->tail; /* change the data status to prevent infinite recursive loop due to references to the same set during the check */ set->data = 2; /* check elemental sets assigned to array members in the data section until the marked member has been reached */ for (info->memb = set->array->head; info->memb != NULL; info->memb = info->memb->next) { if (eval_within_domain(mpl, set->domain, info->memb->tuple, info, eval_set_func)) out_of_domain(mpl, set->name, info->memb->tuple); if (info->memb == tail) break; } /* the check has been finished */ } /* evaluate member, which has given n-tuple */ info->memb = NULL; if (eval_within_domain(mpl, info->set->domain, info->tuple, info, eval_set_func)) out_of_domain(mpl, set->name, info->tuple); /* bring evaluated reference to the calling program */ return info->refer; } /*---------------------------------------------------------------------- -- eval_whole_set - evaluate model set over entire domain. -- -- This routine evaluates all members of specified model set over entire -- domain. */ static int whole_set_func(MPL *mpl, void *info) { /* this is auxiliary routine to work within domain scope */ SET *set = (SET *)info; TUPLE *tuple = get_domain_tuple(mpl, set->domain); eval_member_set(mpl, set, tuple); delete_tuple(mpl, tuple); return 0; } void eval_whole_set(MPL *mpl, SET *set) { loop_within_domain(mpl, set->domain, set, whole_set_func); return; } /*---------------------------------------------------------------------- -- clean set - clean model set. -- -- This routine cleans specified model set that assumes deleting all -- stuff dynamically allocated during the generation phase. */ void clean_set(MPL *mpl, SET *set) { WITHIN *within; MEMBER *memb; /* clean subscript domain */ clean_domain(mpl, set->domain); /* clean pseudo-code for computing supersets */ for (within = set->within; within != NULL; within = within->next) clean_code(mpl, within->code); /* clean pseudo-code for computing assigned value */ clean_code(mpl, set->assign); /* clean pseudo-code for computing default value */ clean_code(mpl, set->option); /* reset data status flag */ set->data = 0; /* delete content array */ for (memb = set->array->head; memb != NULL; memb = memb->next) delete_value(mpl, set->array->type, &memb->value); delete_array(mpl, set->array), set->array = NULL; return; } /**********************************************************************/ /* * * MODEL PARAMETERS * * */ /**********************************************************************/ /*---------------------------------------------------------------------- -- check_value_num - check numeric value assigned to parameter member. -- -- This routine checks if numeric value being assigned to some member -- of specified numeric model parameter satisfies to all restrictions. -- -- NOTE: This routine must not be called out of domain scope. */ void check_value_num ( MPL *mpl, PARAMETER *par, /* not changed */ TUPLE *tuple, /* not changed */ double value ) { CONDITION *cond; WITHIN *in; int eqno; /* the value must satisfy to the parameter type */ switch (par->type) { case A_NUMERIC: break; case A_INTEGER: if (value != floor(value)) error(mpl, "%s%s = %.*g not integer", par->name, format_tuple(mpl, '[', tuple), DBL_DIG, value); break; case A_BINARY: if (!(value == 0.0 || value == 1.0)) error(mpl, "%s%s = %.*g not binary", par->name, format_tuple(mpl, '[', tuple), DBL_DIG, value); break; default: xassert(par != par); } /* the value must satisfy to all specified conditions */ for (cond = par->cond, eqno = 1; cond != NULL; cond = cond->next, eqno++) { double bound; char *rho; xassert(cond->code != NULL); bound = eval_numeric(mpl, cond->code); switch (cond->rho) { case O_LT: if (!(value < bound)) { rho = "<"; err: error(mpl, "%s%s = %.*g not %s %.*g; see (%d)", par->name, format_tuple(mpl, '[', tuple), DBL_DIG, value, rho, DBL_DIG, bound, eqno); } break; case O_LE: if (!(value <= bound)) { rho = "<="; goto err; } break; case O_EQ: if (!(value == bound)) { rho = "="; goto err; } break; case O_GE: if (!(value >= bound)) { rho = ">="; goto err; } break; case O_GT: if (!(value > bound)) { rho = ">"; goto err; } break; case O_NE: if (!(value != bound)) { rho = "<>"; goto err; } break; default: xassert(cond != cond); } } /* the value must be in all specified supersets */ for (in = par->in, eqno = 1; in != NULL; in = in->next, eqno++) { TUPLE *dummy; xassert(in->code != NULL); xassert(in->code->dim == 1); dummy = expand_tuple(mpl, create_tuple(mpl), create_symbol_num(mpl, value)); if (!is_member(mpl, in->code, dummy)) error(mpl, "%s%s = %.*g not in specified set; see (%d)", par->name, format_tuple(mpl, '[', tuple), DBL_DIG, value, eqno); delete_tuple(mpl, dummy); } return; } /*---------------------------------------------------------------------- -- take_member_num - obtain num. value assigned to parameter member. -- -- This routine obtains a numeric value assigned to member of specified -- numeric model parameter and returns it on exit. -- -- NOTE: This routine must not be called out of domain scope. */ double take_member_num ( MPL *mpl, PARAMETER *par, /* not changed */ TUPLE *tuple /* not changed */ ) { MEMBER *memb; double value; /* find member in the parameter array */ memb = find_member(mpl, par->array, tuple); if (memb != NULL) { /* member exists, so just take its value */ value = memb->value.num; } else if (par->assign != NULL) { /* compute value using assignment expression */ value = eval_numeric(mpl, par->assign); add: /* check that the value satisfies to all restrictions, assign it to new member, and add the member to the array */ check_value_num(mpl, par, tuple, value); memb = add_member(mpl, par->array, copy_tuple(mpl, tuple)); memb->value.num = value; } else if (par->option != NULL) { /* compute default value */ value = eval_numeric(mpl, par->option); goto add; } else if (par->defval != NULL) { /* take default value provided in the data section */ if (par->defval->str != NULL) error(mpl, "cannot convert %s to floating-point number", format_symbol(mpl, par->defval)); value = par->defval->num; goto add; } else { /* no value is provided */ error(mpl, "no value for %s%s", par->name, format_tuple(mpl, '[', tuple)); } return value; } /*---------------------------------------------------------------------- -- eval_member_num - evaluate num. value assigned to parameter member. -- -- This routine evaluates a numeric value assigned to given member of -- specified numeric model parameter and returns it on exit. */ struct eval_num_info { /* working info used by the routine eval_member_num */ PARAMETER *par; /* model parameter */ TUPLE *tuple; /* n-tuple, which defines parameter member */ MEMBER *memb; /* normally this pointer is NULL; the routine uses this pointer to check data provided in the data section, in which case it points to a member currently checked; this check is performed automatically only once when a reference to any member occurs for the first time */ double value; /* evaluated numeric value */ }; static void eval_num_func(MPL *mpl, void *_info) { /* this is auxiliary routine to work within domain scope */ struct eval_num_info *info = _info; if (info->memb != NULL) { /* checking call; check numeric value being assigned */ check_value_num(mpl, info->par, info->memb->tuple, info->memb->value.num); } else { /* normal call; evaluate member, which has given n-tuple */ info->value = take_member_num(mpl, info->par, info->tuple); } return; } double eval_member_num ( MPL *mpl, PARAMETER *par, /* not changed */ TUPLE *tuple /* not changed */ ) { /* this routine evaluates numeric parameter member */ struct eval_num_info _info, *info = &_info; xassert(par->type == A_NUMERIC || par->type == A_INTEGER || par->type == A_BINARY); xassert(par->dim == tuple_dimen(mpl, tuple)); info->par = par; info->tuple = tuple; if (par->data == 1) { /* check data, which are provided in the data section, but not checked yet */ /* save pointer to the last array member; note that during the check new members may be added beyond the last member due to references to the same parameter from default expression as well as from expressions that define restricting conditions; however, values assigned to the new members will be checked by other routine, so we don't need to check them here */ MEMBER *tail = par->array->tail; /* change the data status to prevent infinite recursive loop due to references to the same parameter during the check */ par->data = 2; /* check values assigned to array members in the data section until the marked member has been reached */ for (info->memb = par->array->head; info->memb != NULL; info->memb = info->memb->next) { if (eval_within_domain(mpl, par->domain, info->memb->tuple, info, eval_num_func)) out_of_domain(mpl, par->name, info->memb->tuple); if (info->memb == tail) break; } /* the check has been finished */ } /* evaluate member, which has given n-tuple */ info->memb = NULL; if (eval_within_domain(mpl, info->par->domain, info->tuple, info, eval_num_func)) out_of_domain(mpl, par->name, info->tuple); /* bring evaluated value to the calling program */ return info->value; } /*---------------------------------------------------------------------- -- check_value_sym - check symbolic value assigned to parameter member. -- -- This routine checks if symbolic value being assigned to some member -- of specified symbolic model parameter satisfies to all restrictions. -- -- NOTE: This routine must not be called out of domain scope. */ void check_value_sym ( MPL *mpl, PARAMETER *par, /* not changed */ TUPLE *tuple, /* not changed */ SYMBOL *value /* not changed */ ) { CONDITION *cond; WITHIN *in; int eqno; /* the value must satisfy to all specified conditions */ for (cond = par->cond, eqno = 1; cond != NULL; cond = cond->next, eqno++) { SYMBOL *bound; char buf[255+1]; xassert(cond->code != NULL); bound = eval_symbolic(mpl, cond->code); switch (cond->rho) { #if 1 /* 13/VIII-2008 */ case O_LT: if (!(compare_symbols(mpl, value, bound) < 0)) { strcpy(buf, format_symbol(mpl, bound)); xassert(strlen(buf) < sizeof(buf)); error(mpl, "%s%s = %s not < %s", par->name, format_tuple(mpl, '[', tuple), format_symbol(mpl, value), buf, eqno); } break; case O_LE: if (!(compare_symbols(mpl, value, bound) <= 0)) { strcpy(buf, format_symbol(mpl, bound)); xassert(strlen(buf) < sizeof(buf)); error(mpl, "%s%s = %s not <= %s", par->name, format_tuple(mpl, '[', tuple), format_symbol(mpl, value), buf, eqno); } break; #endif case O_EQ: if (!(compare_symbols(mpl, value, bound) == 0)) { strcpy(buf, format_symbol(mpl, bound)); xassert(strlen(buf) < sizeof(buf)); error(mpl, "%s%s = %s not = %s", par->name, format_tuple(mpl, '[', tuple), format_symbol(mpl, value), buf, eqno); } break; #if 1 /* 13/VIII-2008 */ case O_GE: if (!(compare_symbols(mpl, value, bound) >= 0)) { strcpy(buf, format_symbol(mpl, bound)); xassert(strlen(buf) < sizeof(buf)); error(mpl, "%s%s = %s not >= %s", par->name, format_tuple(mpl, '[', tuple), format_symbol(mpl, value), buf, eqno); } break; case O_GT: if (!(compare_symbols(mpl, value, bound) > 0)) { strcpy(buf, format_symbol(mpl, bound)); xassert(strlen(buf) < sizeof(buf)); error(mpl, "%s%s = %s not > %s", par->name, format_tuple(mpl, '[', tuple), format_symbol(mpl, value), buf, eqno); } break; #endif case O_NE: if (!(compare_symbols(mpl, value, bound) != 0)) { strcpy(buf, format_symbol(mpl, bound)); xassert(strlen(buf) < sizeof(buf)); error(mpl, "%s%s = %s not <> %s", par->name, format_tuple(mpl, '[', tuple), format_symbol(mpl, value), buf, eqno); } break; default: xassert(cond != cond); } delete_symbol(mpl, bound); } /* the value must be in all specified supersets */ for (in = par->in, eqno = 1; in != NULL; in = in->next, eqno++) { TUPLE *dummy; xassert(in->code != NULL); xassert(in->code->dim == 1); dummy = expand_tuple(mpl, create_tuple(mpl), copy_symbol(mpl, value)); if (!is_member(mpl, in->code, dummy)) error(mpl, "%s%s = %s not in specified set; see (%d)", par->name, format_tuple(mpl, '[', tuple), format_symbol(mpl, value), eqno); delete_tuple(mpl, dummy); } return; } /*---------------------------------------------------------------------- -- take_member_sym - obtain symb. value assigned to parameter member. -- -- This routine obtains a symbolic value assigned to member of specified -- symbolic model parameter and returns it on exit. -- -- NOTE: This routine must not be called out of domain scope. */ SYMBOL *take_member_sym /* returns value, not reference */ ( MPL *mpl, PARAMETER *par, /* not changed */ TUPLE *tuple /* not changed */ ) { MEMBER *memb; SYMBOL *value; /* find member in the parameter array */ memb = find_member(mpl, par->array, tuple); if (memb != NULL) { /* member exists, so just take its value */ value = copy_symbol(mpl, memb->value.sym); } else if (par->assign != NULL) { /* compute value using assignment expression */ value = eval_symbolic(mpl, par->assign); add: /* check that the value satisfies to all restrictions, assign it to new member, and add the member to the array */ check_value_sym(mpl, par, tuple, value); memb = add_member(mpl, par->array, copy_tuple(mpl, tuple)); memb->value.sym = copy_symbol(mpl, value); } else if (par->option != NULL) { /* compute default value */ value = eval_symbolic(mpl, par->option); goto add; } else if (par->defval != NULL) { /* take default value provided in the data section */ value = copy_symbol(mpl, par->defval); goto add; } else { /* no value is provided */ error(mpl, "no value for %s%s", par->name, format_tuple(mpl, '[', tuple)); } return value; } /*---------------------------------------------------------------------- -- eval_member_sym - evaluate symb. value assigned to parameter member. -- -- This routine evaluates a symbolic value assigned to given member of -- specified symbolic model parameter and returns it on exit. */ struct eval_sym_info { /* working info used by the routine eval_member_sym */ PARAMETER *par; /* model parameter */ TUPLE *tuple; /* n-tuple, which defines parameter member */ MEMBER *memb; /* normally this pointer is NULL; the routine uses this pointer to check data provided in the data section, in which case it points to a member currently checked; this check is performed automatically only once when a reference to any member occurs for the first time */ SYMBOL *value; /* evaluated symbolic value */ }; static void eval_sym_func(MPL *mpl, void *_info) { /* this is auxiliary routine to work within domain scope */ struct eval_sym_info *info = _info; if (info->memb != NULL) { /* checking call; check symbolic value being assigned */ check_value_sym(mpl, info->par, info->memb->tuple, info->memb->value.sym); } else { /* normal call; evaluate member, which has given n-tuple */ info->value = take_member_sym(mpl, info->par, info->tuple); } return; } SYMBOL *eval_member_sym /* returns value, not reference */ ( MPL *mpl, PARAMETER *par, /* not changed */ TUPLE *tuple /* not changed */ ) { /* this routine evaluates symbolic parameter member */ struct eval_sym_info _info, *info = &_info; xassert(par->type == A_SYMBOLIC); xassert(par->dim == tuple_dimen(mpl, tuple)); info->par = par; info->tuple = tuple; if (par->data == 1) { /* check data, which are provided in the data section, but not checked yet */ /* save pointer to the last array member; note that during the check new members may be added beyond the last member due to references to the same parameter from default expression as well as from expressions that define restricting conditions; however, values assigned to the new members will be checked by other routine, so we don't need to check them here */ MEMBER *tail = par->array->tail; /* change the data status to prevent infinite recursive loop due to references to the same parameter during the check */ par->data = 2; /* check values assigned to array members in the data section until the marked member has been reached */ for (info->memb = par->array->head; info->memb != NULL; info->memb = info->memb->next) { if (eval_within_domain(mpl, par->domain, info->memb->tuple, info, eval_sym_func)) out_of_domain(mpl, par->name, info->memb->tuple); if (info->memb == tail) break; } /* the check has been finished */ } /* evaluate member, which has given n-tuple */ info->memb = NULL; if (eval_within_domain(mpl, info->par->domain, info->tuple, info, eval_sym_func)) out_of_domain(mpl, par->name, info->tuple); /* bring evaluated value to the calling program */ return info->value; } /*---------------------------------------------------------------------- -- eval_whole_par - evaluate model parameter over entire domain. -- -- This routine evaluates all members of specified model parameter over -- entire domain. */ static int whole_par_func(MPL *mpl, void *info) { /* this is auxiliary routine to work within domain scope */ PARAMETER *par = (PARAMETER *)info; TUPLE *tuple = get_domain_tuple(mpl, par->domain); switch (par->type) { case A_NUMERIC: case A_INTEGER: case A_BINARY: eval_member_num(mpl, par, tuple); break; case A_SYMBOLIC: delete_symbol(mpl, eval_member_sym(mpl, par, tuple)); break; default: xassert(par != par); } delete_tuple(mpl, tuple); return 0; } void eval_whole_par(MPL *mpl, PARAMETER *par) { loop_within_domain(mpl, par->domain, par, whole_par_func); return; } /*---------------------------------------------------------------------- -- clean_parameter - clean model parameter. -- -- This routine cleans specified model parameter that assumes deleting -- all stuff dynamically allocated during the generation phase. */ void clean_parameter(MPL *mpl, PARAMETER *par) { CONDITION *cond; WITHIN *in; MEMBER *memb; /* clean subscript domain */ clean_domain(mpl, par->domain); /* clean pseudo-code for computing restricting conditions */ for (cond = par->cond; cond != NULL; cond = cond->next) clean_code(mpl, cond->code); /* clean pseudo-code for computing restricting supersets */ for (in = par->in; in != NULL; in = in->next) clean_code(mpl, in->code); /* clean pseudo-code for computing assigned value */ clean_code(mpl, par->assign); /* clean pseudo-code for computing default value */ clean_code(mpl, par->option); /* reset data status flag */ par->data = 0; /* delete default symbolic value */ if (par->defval != NULL) delete_symbol(mpl, par->defval), par->defval = NULL; /* delete content array */ for (memb = par->array->head; memb != NULL; memb = memb->next) delete_value(mpl, par->array->type, &memb->value); delete_array(mpl, par->array), par->array = NULL; return; } /**********************************************************************/ /* * * MODEL VARIABLES * * */ /**********************************************************************/ /*---------------------------------------------------------------------- -- take_member_var - obtain reference to elemental variable. -- -- This routine obtains a reference to elemental variable assigned to -- given member of specified model variable and returns it on exit. If -- necessary, new elemental variable is created. -- -- NOTE: This routine must not be called out of domain scope. */ ELEMVAR *take_member_var /* returns reference */ ( MPL *mpl, VARIABLE *var, /* not changed */ TUPLE *tuple /* not changed */ ) { MEMBER *memb; ELEMVAR *refer; /* find member in the variable array */ memb = find_member(mpl, var->array, tuple); if (memb != NULL) { /* member exists, so just take the reference */ refer = memb->value.var; } else { /* member is referenced for the first time and therefore does not exist; create new elemental variable, assign it to new member, and add the member to the variable array */ memb = add_member(mpl, var->array, copy_tuple(mpl, tuple)); refer = (memb->value.var = dmp_get_atom(mpl->elemvars, sizeof(ELEMVAR))); refer->j = 0; refer->var = var; refer->memb = memb; /* compute lower bound */ if (var->lbnd == NULL) refer->lbnd = 0.0; else refer->lbnd = eval_numeric(mpl, var->lbnd); /* compute upper bound */ if (var->ubnd == NULL) refer->ubnd = 0.0; else if (var->ubnd == var->lbnd) refer->ubnd = refer->lbnd; else refer->ubnd = eval_numeric(mpl, var->ubnd); /* nullify working quantity */ refer->temp = 0.0; #if 1 /* 15/V-2010 */ /* solution has not been obtained by the solver yet */ refer->stat = 0; refer->prim = refer->dual = 0.0; #endif } return refer; } /*---------------------------------------------------------------------- -- eval_member_var - evaluate reference to elemental variable. -- -- This routine evaluates a reference to elemental variable assigned to -- member of specified model variable and returns it on exit. */ struct eval_var_info { /* working info used by the routine eval_member_var */ VARIABLE *var; /* model variable */ TUPLE *tuple; /* n-tuple, which defines variable member */ ELEMVAR *refer; /* evaluated reference to elemental variable */ }; static void eval_var_func(MPL *mpl, void *_info) { /* this is auxiliary routine to work within domain scope */ struct eval_var_info *info = _info; info->refer = take_member_var(mpl, info->var, info->tuple); return; } ELEMVAR *eval_member_var /* returns reference */ ( MPL *mpl, VARIABLE *var, /* not changed */ TUPLE *tuple /* not changed */ ) { /* this routine evaluates variable member */ struct eval_var_info _info, *info = &_info; xassert(var->dim == tuple_dimen(mpl, tuple)); info->var = var; info->tuple = tuple; /* evaluate member, which has given n-tuple */ if (eval_within_domain(mpl, info->var->domain, info->tuple, info, eval_var_func)) out_of_domain(mpl, var->name, info->tuple); /* bring evaluated reference to the calling program */ return info->refer; } /*---------------------------------------------------------------------- -- eval_whole_var - evaluate model variable over entire domain. -- -- This routine evaluates all members of specified model variable over -- entire domain. */ static int whole_var_func(MPL *mpl, void *info) { /* this is auxiliary routine to work within domain scope */ VARIABLE *var = (VARIABLE *)info; TUPLE *tuple = get_domain_tuple(mpl, var->domain); eval_member_var(mpl, var, tuple); delete_tuple(mpl, tuple); return 0; } void eval_whole_var(MPL *mpl, VARIABLE *var) { loop_within_domain(mpl, var->domain, var, whole_var_func); return; } /*---------------------------------------------------------------------- -- clean_variable - clean model variable. -- -- This routine cleans specified model variable that assumes deleting -- all stuff dynamically allocated during the generation phase. */ void clean_variable(MPL *mpl, VARIABLE *var) { MEMBER *memb; /* clean subscript domain */ clean_domain(mpl, var->domain); /* clean code for computing lower bound */ clean_code(mpl, var->lbnd); /* clean code for computing upper bound */ if (var->ubnd != var->lbnd) clean_code(mpl, var->ubnd); /* delete content array */ for (memb = var->array->head; memb != NULL; memb = memb->next) dmp_free_atom(mpl->elemvars, memb->value.var, sizeof(ELEMVAR)); delete_array(mpl, var->array), var->array = NULL; return; } /**********************************************************************/ /* * * MODEL CONSTRAINTS AND OBJECTIVES * * */ /**********************************************************************/ /*---------------------------------------------------------------------- -- take_member_con - obtain reference to elemental constraint. -- -- This routine obtains a reference to elemental constraint assigned -- to given member of specified model constraint and returns it on exit. -- If necessary, new elemental constraint is created. -- -- NOTE: This routine must not be called out of domain scope. */ ELEMCON *take_member_con /* returns reference */ ( MPL *mpl, CONSTRAINT *con, /* not changed */ TUPLE *tuple /* not changed */ ) { MEMBER *memb; ELEMCON *refer; /* find member in the constraint array */ memb = find_member(mpl, con->array, tuple); if (memb != NULL) { /* member exists, so just take the reference */ refer = memb->value.con; } else { /* member is referenced for the first time and therefore does not exist; create new elemental constraint, assign it to new member, and add the member to the constraint array */ memb = add_member(mpl, con->array, copy_tuple(mpl, tuple)); refer = (memb->value.con = dmp_get_atom(mpl->elemcons, sizeof(ELEMCON))); refer->i = 0; refer->con = con; refer->memb = memb; /* compute linear form */ xassert(con->code != NULL); refer->form = eval_formula(mpl, con->code); /* compute lower and upper bounds */ if (con->lbnd == NULL && con->ubnd == NULL) { /* objective has no bounds */ double temp; xassert(con->type == A_MINIMIZE || con->type == A_MAXIMIZE); /* carry the constant term to the right-hand side */ refer->form = remove_constant(mpl, refer->form, &temp); refer->lbnd = refer->ubnd = - temp; } else if (con->lbnd != NULL && con->ubnd == NULL) { /* constraint a * x + b >= c * y + d is transformed to the standard form a * x - c * y >= d - b */ double temp; xassert(con->type == A_CONSTRAINT); refer->form = linear_comb(mpl, +1.0, refer->form, -1.0, eval_formula(mpl, con->lbnd)); refer->form = remove_constant(mpl, refer->form, &temp); refer->lbnd = - temp; refer->ubnd = 0.0; } else if (con->lbnd == NULL && con->ubnd != NULL) { /* constraint a * x + b <= c * y + d is transformed to the standard form a * x - c * y <= d - b */ double temp; xassert(con->type == A_CONSTRAINT); refer->form = linear_comb(mpl, +1.0, refer->form, -1.0, eval_formula(mpl, con->ubnd)); refer->form = remove_constant(mpl, refer->form, &temp); refer->lbnd = 0.0; refer->ubnd = - temp; } else if (con->lbnd == con->ubnd) { /* constraint a * x + b = c * y + d is transformed to the standard form a * x - c * y = d - b */ double temp; xassert(con->type == A_CONSTRAINT); refer->form = linear_comb(mpl, +1.0, refer->form, -1.0, eval_formula(mpl, con->lbnd)); refer->form = remove_constant(mpl, refer->form, &temp); refer->lbnd = refer->ubnd = - temp; } else { /* ranged constraint c <= a * x + b <= d is transformed to the standard form c - b <= a * x <= d - b */ double temp, temp1, temp2; xassert(con->type == A_CONSTRAINT); refer->form = remove_constant(mpl, refer->form, &temp); xassert(remove_constant(mpl, eval_formula(mpl, con->lbnd), &temp1) == NULL); xassert(remove_constant(mpl, eval_formula(mpl, con->ubnd), &temp2) == NULL); refer->lbnd = fp_sub(mpl, temp1, temp); refer->ubnd = fp_sub(mpl, temp2, temp); } #if 1 /* 15/V-2010 */ /* solution has not been obtained by the solver yet */ refer->stat = 0; refer->prim = refer->dual = 0.0; #endif } return refer; } /*---------------------------------------------------------------------- -- eval_member_con - evaluate reference to elemental constraint. -- -- This routine evaluates a reference to elemental constraint assigned -- to member of specified model constraint and returns it on exit. */ struct eval_con_info { /* working info used by the routine eval_member_con */ CONSTRAINT *con; /* model constraint */ TUPLE *tuple; /* n-tuple, which defines constraint member */ ELEMCON *refer; /* evaluated reference to elemental constraint */ }; static void eval_con_func(MPL *mpl, void *_info) { /* this is auxiliary routine to work within domain scope */ struct eval_con_info *info = _info; info->refer = take_member_con(mpl, info->con, info->tuple); return; } ELEMCON *eval_member_con /* returns reference */ ( MPL *mpl, CONSTRAINT *con, /* not changed */ TUPLE *tuple /* not changed */ ) { /* this routine evaluates constraint member */ struct eval_con_info _info, *info = &_info; xassert(con->dim == tuple_dimen(mpl, tuple)); info->con = con; info->tuple = tuple; /* evaluate member, which has given n-tuple */ if (eval_within_domain(mpl, info->con->domain, info->tuple, info, eval_con_func)) out_of_domain(mpl, con->name, info->tuple); /* bring evaluated reference to the calling program */ return info->refer; } /*---------------------------------------------------------------------- -- eval_whole_con - evaluate model constraint over entire domain. -- -- This routine evaluates all members of specified model constraint over -- entire domain. */ static int whole_con_func(MPL *mpl, void *info) { /* this is auxiliary routine to work within domain scope */ CONSTRAINT *con = (CONSTRAINT *)info; TUPLE *tuple = get_domain_tuple(mpl, con->domain); eval_member_con(mpl, con, tuple); delete_tuple(mpl, tuple); return 0; } void eval_whole_con(MPL *mpl, CONSTRAINT *con) { loop_within_domain(mpl, con->domain, con, whole_con_func); return; } /*---------------------------------------------------------------------- -- clean_constraint - clean model constraint. -- -- This routine cleans specified model constraint that assumes deleting -- all stuff dynamically allocated during the generation phase. */ void clean_constraint(MPL *mpl, CONSTRAINT *con) { MEMBER *memb; /* clean subscript domain */ clean_domain(mpl, con->domain); /* clean code for computing main linear form */ clean_code(mpl, con->code); /* clean code for computing lower bound */ clean_code(mpl, con->lbnd); /* clean code for computing upper bound */ if (con->ubnd != con->lbnd) clean_code(mpl, con->ubnd); /* delete content array */ for (memb = con->array->head; memb != NULL; memb = memb->next) { delete_formula(mpl, memb->value.con->form); dmp_free_atom(mpl->elemcons, memb->value.con, sizeof(ELEMCON)); } delete_array(mpl, con->array), con->array = NULL; return; } /**********************************************************************/ /* * * PSEUDO-CODE * * */ /**********************************************************************/ /*---------------------------------------------------------------------- -- eval_numeric - evaluate pseudo-code to determine numeric value. -- -- This routine evaluates specified pseudo-code to determine resultant -- numeric value, which is returned on exit. */ struct iter_num_info { /* working info used by the routine iter_num_func */ CODE *code; /* pseudo-code for iterated operation to be performed */ double value; /* resultant value */ }; static int iter_num_func(MPL *mpl, void *_info) { /* this is auxiliary routine used to perform iterated operation on numeric "integrand" within domain scope */ struct iter_num_info *info = _info; double temp; temp = eval_numeric(mpl, info->code->arg.loop.x); switch (info->code->op) { case O_SUM: /* summation over domain */ info->value = fp_add(mpl, info->value, temp); break; case O_PROD: /* multiplication over domain */ info->value = fp_mul(mpl, info->value, temp); break; case O_MINIMUM: /* minimum over domain */ if (info->value > temp) info->value = temp; break; case O_MAXIMUM: /* maximum over domain */ if (info->value < temp) info->value = temp; break; default: xassert(info != info); } return 0; } double eval_numeric(MPL *mpl, CODE *code) { double value; xassert(code != NULL); xassert(code->type == A_NUMERIC); xassert(code->dim == 0); /* if the operation has a side effect, invalidate and delete the resultant value */ if (code->vflag && code->valid) { code->valid = 0; delete_value(mpl, code->type, &code->value); } /* if resultant value is valid, no evaluation is needed */ if (code->valid) { value = code->value.num; goto done; } /* evaluate pseudo-code recursively */ switch (code->op) { case O_NUMBER: /* take floating-point number */ value = code->arg.num; break; case O_MEMNUM: /* take member of numeric parameter */ { TUPLE *tuple; ARG_LIST *e; tuple = create_tuple(mpl); for (e = code->arg.par.list; e != NULL; e = e->next) tuple = expand_tuple(mpl, tuple, eval_symbolic(mpl, e->x)); value = eval_member_num(mpl, code->arg.par.par, tuple); delete_tuple(mpl, tuple); } break; case O_MEMVAR: /* take computed value of elemental variable */ { TUPLE *tuple; ARG_LIST *e; #if 1 /* 15/V-2010 */ ELEMVAR *var; #endif tuple = create_tuple(mpl); for (e = code->arg.var.list; e != NULL; e = e->next) tuple = expand_tuple(mpl, tuple, eval_symbolic(mpl, e->x)); #if 0 /* 15/V-2010 */ value = eval_member_var(mpl, code->arg.var.var, tuple) ->value; #else var = eval_member_var(mpl, code->arg.var.var, tuple); switch (code->arg.var.suff) { case DOT_LB: if (var->var->lbnd == NULL) value = -DBL_MAX; else value = var->lbnd; break; case DOT_UB: if (var->var->ubnd == NULL) value = +DBL_MAX; else value = var->ubnd; break; case DOT_STATUS: value = var->stat; break; case DOT_VAL: value = var->prim; break; case DOT_DUAL: value = var->dual; break; default: xassert(code != code); } #endif delete_tuple(mpl, tuple); } break; #if 1 /* 15/V-2010 */ case O_MEMCON: /* take computed value of elemental constraint */ { TUPLE *tuple; ARG_LIST *e; ELEMCON *con; tuple = create_tuple(mpl); for (e = code->arg.con.list; e != NULL; e = e->next) tuple = expand_tuple(mpl, tuple, eval_symbolic(mpl, e->x)); con = eval_member_con(mpl, code->arg.con.con, tuple); switch (code->arg.con.suff) { case DOT_LB: if (con->con->lbnd == NULL) value = -DBL_MAX; else value = con->lbnd; break; case DOT_UB: if (con->con->ubnd == NULL) value = +DBL_MAX; else value = con->ubnd; break; case DOT_STATUS: value = con->stat; break; case DOT_VAL: value = con->prim; break; case DOT_DUAL: value = con->dual; break; default: xassert(code != code); } delete_tuple(mpl, tuple); } break; #endif case O_IRAND224: /* pseudo-random in [0, 2^24-1] */ value = fp_irand224(mpl); break; case O_UNIFORM01: /* pseudo-random in [0, 1) */ value = fp_uniform01(mpl); break; case O_NORMAL01: /* gaussian random, mu = 0, sigma = 1 */ value = fp_normal01(mpl); break; case O_GMTIME: /* current calendar time */ value = fn_gmtime(mpl); break; case O_CVTNUM: /* conversion to numeric */ { SYMBOL *sym; sym = eval_symbolic(mpl, code->arg.arg.x); #if 0 /* 23/XI-2008 */ if (sym->str != NULL) error(mpl, "cannot convert %s to floating-point numbe" "r", format_symbol(mpl, sym)); value = sym->num; #else if (sym->str == NULL) value = sym->num; else { if (str2num(sym->str, &value)) error(mpl, "cannot convert %s to floating-point nu" "mber", format_symbol(mpl, sym)); } #endif delete_symbol(mpl, sym); } break; case O_PLUS: /* unary plus */ value = + eval_numeric(mpl, code->arg.arg.x); break; case O_MINUS: /* unary minus */ value = - eval_numeric(mpl, code->arg.arg.x); break; case O_ABS: /* absolute value */ value = fabs(eval_numeric(mpl, code->arg.arg.x)); break; case O_CEIL: /* round upward ("ceiling of x") */ value = ceil(eval_numeric(mpl, code->arg.arg.x)); break; case O_FLOOR: /* round downward ("floor of x") */ value = floor(eval_numeric(mpl, code->arg.arg.x)); break; case O_EXP: /* base-e exponential */ value = fp_exp(mpl, eval_numeric(mpl, code->arg.arg.x)); break; case O_LOG: /* natural logarithm */ value = fp_log(mpl, eval_numeric(mpl, code->arg.arg.x)); break; case O_LOG10: /* common (decimal) logarithm */ value = fp_log10(mpl, eval_numeric(mpl, code->arg.arg.x)); break; case O_SQRT: /* square root */ value = fp_sqrt(mpl, eval_numeric(mpl, code->arg.arg.x)); break; case O_SIN: /* trigonometric sine */ value = fp_sin(mpl, eval_numeric(mpl, code->arg.arg.x)); break; case O_COS: /* trigonometric cosine */ value = fp_cos(mpl, eval_numeric(mpl, code->arg.arg.x)); break; case O_TAN: /* trigonometric tangent */ value = fp_tan(mpl, eval_numeric(mpl, code->arg.arg.x)); break; case O_ATAN: /* trigonometric arctangent (one argument) */ value = fp_atan(mpl, eval_numeric(mpl, code->arg.arg.x)); break; case O_ATAN2: /* trigonometric arctangent (two arguments) */ value = fp_atan2(mpl, eval_numeric(mpl, code->arg.arg.x), eval_numeric(mpl, code->arg.arg.y)); break; case O_ROUND: /* round to nearest integer */ value = fp_round(mpl, eval_numeric(mpl, code->arg.arg.x), 0.0); break; case O_ROUND2: /* round to n fractional digits */ value = fp_round(mpl, eval_numeric(mpl, code->arg.arg.x), eval_numeric(mpl, code->arg.arg.y)); break; case O_TRUNC: /* truncate to nearest integer */ value = fp_trunc(mpl, eval_numeric(mpl, code->arg.arg.x), 0.0); break; case O_TRUNC2: /* truncate to n fractional digits */ value = fp_trunc(mpl, eval_numeric(mpl, code->arg.arg.x), eval_numeric(mpl, code->arg.arg.y)); break; case O_ADD: /* addition */ value = fp_add(mpl, eval_numeric(mpl, code->arg.arg.x), eval_numeric(mpl, code->arg.arg.y)); break; case O_SUB: /* subtraction */ value = fp_sub(mpl, eval_numeric(mpl, code->arg.arg.x), eval_numeric(mpl, code->arg.arg.y)); break; case O_LESS: /* non-negative subtraction */ value = fp_less(mpl, eval_numeric(mpl, code->arg.arg.x), eval_numeric(mpl, code->arg.arg.y)); break; case O_MUL: /* multiplication */ value = fp_mul(mpl, eval_numeric(mpl, code->arg.arg.x), eval_numeric(mpl, code->arg.arg.y)); break; case O_DIV: /* division */ value = fp_div(mpl, eval_numeric(mpl, code->arg.arg.x), eval_numeric(mpl, code->arg.arg.y)); break; case O_IDIV: /* quotient of exact division */ value = fp_idiv(mpl, eval_numeric(mpl, code->arg.arg.x), eval_numeric(mpl, code->arg.arg.y)); break; case O_MOD: /* remainder of exact division */ value = fp_mod(mpl, eval_numeric(mpl, code->arg.arg.x), eval_numeric(mpl, code->arg.arg.y)); break; case O_POWER: /* exponentiation (raise to power) */ value = fp_power(mpl, eval_numeric(mpl, code->arg.arg.x), eval_numeric(mpl, code->arg.arg.y)); break; case O_UNIFORM: /* pseudo-random in [a, b) */ value = fp_uniform(mpl, eval_numeric(mpl, code->arg.arg.x), eval_numeric(mpl, code->arg.arg.y)); break; case O_NORMAL: /* gaussian random, given mu and sigma */ value = fp_normal(mpl, eval_numeric(mpl, code->arg.arg.x), eval_numeric(mpl, code->arg.arg.y)); break; case O_CARD: { ELEMSET *set; set = eval_elemset(mpl, code->arg.arg.x); value = set->size; delete_array(mpl, set); } break; case O_LENGTH: { SYMBOL *sym; char str[MAX_LENGTH+1]; sym = eval_symbolic(mpl, code->arg.arg.x); if (sym->str == NULL) sprintf(str, "%.*g", DBL_DIG, sym->num); else fetch_string(mpl, sym->str, str); delete_symbol(mpl, sym); value = strlen(str); } break; case O_STR2TIME: { SYMBOL *sym; char str[MAX_LENGTH+1], fmt[MAX_LENGTH+1]; sym = eval_symbolic(mpl, code->arg.arg.x); if (sym->str == NULL) sprintf(str, "%.*g", DBL_DIG, sym->num); else fetch_string(mpl, sym->str, str); delete_symbol(mpl, sym); sym = eval_symbolic(mpl, code->arg.arg.y); if (sym->str == NULL) sprintf(fmt, "%.*g", DBL_DIG, sym->num); else fetch_string(mpl, sym->str, fmt); delete_symbol(mpl, sym); value = fn_str2time(mpl, str, fmt); } break; case O_FORK: /* if-then-else */ if (eval_logical(mpl, code->arg.arg.x)) value = eval_numeric(mpl, code->arg.arg.y); else if (code->arg.arg.z == NULL) value = 0.0; else value = eval_numeric(mpl, code->arg.arg.z); break; case O_MIN: /* minimal value (n-ary) */ { ARG_LIST *e; double temp; value = +DBL_MAX; for (e = code->arg.list; e != NULL; e = e->next) { temp = eval_numeric(mpl, e->x); if (value > temp) value = temp; } } break; case O_MAX: /* maximal value (n-ary) */ { ARG_LIST *e; double temp; value = -DBL_MAX; for (e = code->arg.list; e != NULL; e = e->next) { temp = eval_numeric(mpl, e->x); if (value < temp) value = temp; } } break; case O_SUM: /* summation over domain */ { struct iter_num_info _info, *info = &_info; info->code = code; info->value = 0.0; loop_within_domain(mpl, code->arg.loop.domain, info, iter_num_func); value = info->value; } break; case O_PROD: /* multiplication over domain */ { struct iter_num_info _info, *info = &_info; info->code = code; info->value = 1.0; loop_within_domain(mpl, code->arg.loop.domain, info, iter_num_func); value = info->value; } break; case O_MINIMUM: /* minimum over domain */ { struct iter_num_info _info, *info = &_info; info->code = code; info->value = +DBL_MAX; loop_within_domain(mpl, code->arg.loop.domain, info, iter_num_func); if (info->value == +DBL_MAX) error(mpl, "min{} over empty set; result undefined"); value = info->value; } break; case O_MAXIMUM: /* maximum over domain */ { struct iter_num_info _info, *info = &_info; info->code = code; info->value = -DBL_MAX; loop_within_domain(mpl, code->arg.loop.domain, info, iter_num_func); if (info->value == -DBL_MAX) error(mpl, "max{} over empty set; result undefined"); value = info->value; } break; default: xassert(code != code); } /* save resultant value */ xassert(!code->valid); code->valid = 1; code->value.num = value; done: return value; } /*---------------------------------------------------------------------- -- eval_symbolic - evaluate pseudo-code to determine symbolic value. -- -- This routine evaluates specified pseudo-code to determine resultant -- symbolic value, which is returned on exit. */ SYMBOL *eval_symbolic(MPL *mpl, CODE *code) { SYMBOL *value; xassert(code != NULL); xassert(code->type == A_SYMBOLIC); xassert(code->dim == 0); /* if the operation has a side effect, invalidate and delete the resultant value */ if (code->vflag && code->valid) { code->valid = 0; delete_value(mpl, code->type, &code->value); } /* if resultant value is valid, no evaluation is needed */ if (code->valid) { value = copy_symbol(mpl, code->value.sym); goto done; } /* evaluate pseudo-code recursively */ switch (code->op) { case O_STRING: /* take character string */ value = create_symbol_str(mpl, create_string(mpl, code->arg.str)); break; case O_INDEX: /* take dummy index */ xassert(code->arg.index.slot->value != NULL); value = copy_symbol(mpl, code->arg.index.slot->value); break; case O_MEMSYM: /* take member of symbolic parameter */ { TUPLE *tuple; ARG_LIST *e; tuple = create_tuple(mpl); for (e = code->arg.par.list; e != NULL; e = e->next) tuple = expand_tuple(mpl, tuple, eval_symbolic(mpl, e->x)); value = eval_member_sym(mpl, code->arg.par.par, tuple); delete_tuple(mpl, tuple); } break; case O_CVTSYM: /* conversion to symbolic */ value = create_symbol_num(mpl, eval_numeric(mpl, code->arg.arg.x)); break; case O_CONCAT: /* concatenation */ value = concat_symbols(mpl, eval_symbolic(mpl, code->arg.arg.x), eval_symbolic(mpl, code->arg.arg.y)); break; case O_FORK: /* if-then-else */ if (eval_logical(mpl, code->arg.arg.x)) value = eval_symbolic(mpl, code->arg.arg.y); else if (code->arg.arg.z == NULL) value = create_symbol_num(mpl, 0.0); else value = eval_symbolic(mpl, code->arg.arg.z); break; case O_SUBSTR: case O_SUBSTR3: { double pos, len; char str[MAX_LENGTH+1]; value = eval_symbolic(mpl, code->arg.arg.x); if (value->str == NULL) sprintf(str, "%.*g", DBL_DIG, value->num); else fetch_string(mpl, value->str, str); delete_symbol(mpl, value); if (code->op == O_SUBSTR) { pos = eval_numeric(mpl, code->arg.arg.y); if (pos != floor(pos)) error(mpl, "substr('...', %.*g); non-integer secon" "d argument", DBL_DIG, pos); if (pos < 1 || pos > strlen(str) + 1) error(mpl, "substr('...', %.*g); substring out of " "range", DBL_DIG, pos); } else { pos = eval_numeric(mpl, code->arg.arg.y); len = eval_numeric(mpl, code->arg.arg.z); if (pos != floor(pos) || len != floor(len)) error(mpl, "substr('...', %.*g, %.*g); non-integer" " second and/or third argument", DBL_DIG, pos, DBL_DIG, len); if (pos < 1 || len < 0 || pos + len > strlen(str) + 1) error(mpl, "substr('...', %.*g, %.*g); substring o" "ut of range", DBL_DIG, pos, DBL_DIG, len); str[(int)pos + (int)len - 1] = '\0'; } value = create_symbol_str(mpl, create_string(mpl, str + (int)pos - 1)); } break; case O_TIME2STR: { double num; SYMBOL *sym; char str[MAX_LENGTH+1], fmt[MAX_LENGTH+1]; num = eval_numeric(mpl, code->arg.arg.x); sym = eval_symbolic(mpl, code->arg.arg.y); if (sym->str == NULL) sprintf(fmt, "%.*g", DBL_DIG, sym->num); else fetch_string(mpl, sym->str, fmt); delete_symbol(mpl, sym); fn_time2str(mpl, str, num, fmt); value = create_symbol_str(mpl, create_string(mpl, str)); } break; default: xassert(code != code); } /* save resultant value */ xassert(!code->valid); code->valid = 1; code->value.sym = copy_symbol(mpl, value); done: return value; } /*---------------------------------------------------------------------- -- eval_logical - evaluate pseudo-code to determine logical value. -- -- This routine evaluates specified pseudo-code to determine resultant -- logical value, which is returned on exit. */ struct iter_log_info { /* working info used by the routine iter_log_func */ CODE *code; /* pseudo-code for iterated operation to be performed */ int value; /* resultant value */ }; static int iter_log_func(MPL *mpl, void *_info) { /* this is auxiliary routine used to perform iterated operation on logical "integrand" within domain scope */ struct iter_log_info *info = _info; int ret = 0; switch (info->code->op) { case O_FORALL: /* conjunction over domain */ info->value &= eval_logical(mpl, info->code->arg.loop.x); if (!info->value) ret = 1; break; case O_EXISTS: /* disjunction over domain */ info->value |= eval_logical(mpl, info->code->arg.loop.x); if (info->value) ret = 1; break; default: xassert(info != info); } return ret; } int eval_logical(MPL *mpl, CODE *code) { int value; xassert(code->type == A_LOGICAL); xassert(code->dim == 0); /* if the operation has a side effect, invalidate and delete the resultant value */ if (code->vflag && code->valid) { code->valid = 0; delete_value(mpl, code->type, &code->value); } /* if resultant value is valid, no evaluation is needed */ if (code->valid) { value = code->value.bit; goto done; } /* evaluate pseudo-code recursively */ switch (code->op) { case O_CVTLOG: /* conversion to logical */ value = (eval_numeric(mpl, code->arg.arg.x) != 0.0); break; case O_NOT: /* negation (logical "not") */ value = !eval_logical(mpl, code->arg.arg.x); break; case O_LT: /* comparison on 'less than' */ #if 0 /* 02/VIII-2008 */ value = (eval_numeric(mpl, code->arg.arg.x) < eval_numeric(mpl, code->arg.arg.y)); #else xassert(code->arg.arg.x != NULL); if (code->arg.arg.x->type == A_NUMERIC) value = (eval_numeric(mpl, code->arg.arg.x) < eval_numeric(mpl, code->arg.arg.y)); else { SYMBOL *sym1 = eval_symbolic(mpl, code->arg.arg.x); SYMBOL *sym2 = eval_symbolic(mpl, code->arg.arg.y); value = (compare_symbols(mpl, sym1, sym2) < 0); delete_symbol(mpl, sym1); delete_symbol(mpl, sym2); } #endif break; case O_LE: /* comparison on 'not greater than' */ #if 0 /* 02/VIII-2008 */ value = (eval_numeric(mpl, code->arg.arg.x) <= eval_numeric(mpl, code->arg.arg.y)); #else xassert(code->arg.arg.x != NULL); if (code->arg.arg.x->type == A_NUMERIC) value = (eval_numeric(mpl, code->arg.arg.x) <= eval_numeric(mpl, code->arg.arg.y)); else { SYMBOL *sym1 = eval_symbolic(mpl, code->arg.arg.x); SYMBOL *sym2 = eval_symbolic(mpl, code->arg.arg.y); value = (compare_symbols(mpl, sym1, sym2) <= 0); delete_symbol(mpl, sym1); delete_symbol(mpl, sym2); } #endif break; case O_EQ: /* comparison on 'equal to' */ xassert(code->arg.arg.x != NULL); if (code->arg.arg.x->type == A_NUMERIC) value = (eval_numeric(mpl, code->arg.arg.x) == eval_numeric(mpl, code->arg.arg.y)); else { SYMBOL *sym1 = eval_symbolic(mpl, code->arg.arg.x); SYMBOL *sym2 = eval_symbolic(mpl, code->arg.arg.y); value = (compare_symbols(mpl, sym1, sym2) == 0); delete_symbol(mpl, sym1); delete_symbol(mpl, sym2); } break; case O_GE: /* comparison on 'not less than' */ #if 0 /* 02/VIII-2008 */ value = (eval_numeric(mpl, code->arg.arg.x) >= eval_numeric(mpl, code->arg.arg.y)); #else xassert(code->arg.arg.x != NULL); if (code->arg.arg.x->type == A_NUMERIC) value = (eval_numeric(mpl, code->arg.arg.x) >= eval_numeric(mpl, code->arg.arg.y)); else { SYMBOL *sym1 = eval_symbolic(mpl, code->arg.arg.x); SYMBOL *sym2 = eval_symbolic(mpl, code->arg.arg.y); value = (compare_symbols(mpl, sym1, sym2) >= 0); delete_symbol(mpl, sym1); delete_symbol(mpl, sym2); } #endif break; case O_GT: /* comparison on 'greater than' */ #if 0 /* 02/VIII-2008 */ value = (eval_numeric(mpl, code->arg.arg.x) > eval_numeric(mpl, code->arg.arg.y)); #else xassert(code->arg.arg.x != NULL); if (code->arg.arg.x->type == A_NUMERIC) value = (eval_numeric(mpl, code->arg.arg.x) > eval_numeric(mpl, code->arg.arg.y)); else { SYMBOL *sym1 = eval_symbolic(mpl, code->arg.arg.x); SYMBOL *sym2 = eval_symbolic(mpl, code->arg.arg.y); value = (compare_symbols(mpl, sym1, sym2) > 0); delete_symbol(mpl, sym1); delete_symbol(mpl, sym2); } #endif break; case O_NE: /* comparison on 'not equal to' */ xassert(code->arg.arg.x != NULL); if (code->arg.arg.x->type == A_NUMERIC) value = (eval_numeric(mpl, code->arg.arg.x) != eval_numeric(mpl, code->arg.arg.y)); else { SYMBOL *sym1 = eval_symbolic(mpl, code->arg.arg.x); SYMBOL *sym2 = eval_symbolic(mpl, code->arg.arg.y); value = (compare_symbols(mpl, sym1, sym2) != 0); delete_symbol(mpl, sym1); delete_symbol(mpl, sym2); } break; case O_AND: /* conjunction (logical "and") */ value = eval_logical(mpl, code->arg.arg.x) && eval_logical(mpl, code->arg.arg.y); break; case O_OR: /* disjunction (logical "or") */ value = eval_logical(mpl, code->arg.arg.x) || eval_logical(mpl, code->arg.arg.y); break; case O_IN: /* test on 'x in Y' */ { TUPLE *tuple; tuple = eval_tuple(mpl, code->arg.arg.x); value = is_member(mpl, code->arg.arg.y, tuple); delete_tuple(mpl, tuple); } break; case O_NOTIN: /* test on 'x not in Y' */ { TUPLE *tuple; tuple = eval_tuple(mpl, code->arg.arg.x); value = !is_member(mpl, code->arg.arg.y, tuple); delete_tuple(mpl, tuple); } break; case O_WITHIN: /* test on 'X within Y' */ { ELEMSET *set; MEMBER *memb; set = eval_elemset(mpl, code->arg.arg.x); value = 1; for (memb = set->head; memb != NULL; memb = memb->next) { if (!is_member(mpl, code->arg.arg.y, memb->tuple)) { value = 0; break; } } delete_elemset(mpl, set); } break; case O_NOTWITHIN: /* test on 'X not within Y' */ { ELEMSET *set; MEMBER *memb; set = eval_elemset(mpl, code->arg.arg.x); value = 1; for (memb = set->head; memb != NULL; memb = memb->next) { if (is_member(mpl, code->arg.arg.y, memb->tuple)) { value = 0; break; } } delete_elemset(mpl, set); } break; case O_FORALL: /* conjunction (A-quantification) */ { struct iter_log_info _info, *info = &_info; info->code = code; info->value = 1; loop_within_domain(mpl, code->arg.loop.domain, info, iter_log_func); value = info->value; } break; case O_EXISTS: /* disjunction (E-quantification) */ { struct iter_log_info _info, *info = &_info; info->code = code; info->value = 0; loop_within_domain(mpl, code->arg.loop.domain, info, iter_log_func); value = info->value; } break; default: xassert(code != code); } /* save resultant value */ xassert(!code->valid); code->valid = 1; code->value.bit = value; done: return value; } /*---------------------------------------------------------------------- -- eval_tuple - evaluate pseudo-code to construct n-tuple. -- -- This routine evaluates specified pseudo-code to construct resultant -- n-tuple, which is returned on exit. */ TUPLE *eval_tuple(MPL *mpl, CODE *code) { TUPLE *value; xassert(code != NULL); xassert(code->type == A_TUPLE); xassert(code->dim > 0); /* if the operation has a side effect, invalidate and delete the resultant value */ if (code->vflag && code->valid) { code->valid = 0; delete_value(mpl, code->type, &code->value); } /* if resultant value is valid, no evaluation is needed */ if (code->valid) { value = copy_tuple(mpl, code->value.tuple); goto done; } /* evaluate pseudo-code recursively */ switch (code->op) { case O_TUPLE: /* make n-tuple */ { ARG_LIST *e; value = create_tuple(mpl); for (e = code->arg.list; e != NULL; e = e->next) value = expand_tuple(mpl, value, eval_symbolic(mpl, e->x)); } break; case O_CVTTUP: /* convert to 1-tuple */ value = expand_tuple(mpl, create_tuple(mpl), eval_symbolic(mpl, code->arg.arg.x)); break; default: xassert(code != code); } /* save resultant value */ xassert(!code->valid); code->valid = 1; code->value.tuple = copy_tuple(mpl, value); done: return value; } /*---------------------------------------------------------------------- -- eval_elemset - evaluate pseudo-code to construct elemental set. -- -- This routine evaluates specified pseudo-code to construct resultant -- elemental set, which is returned on exit. */ struct iter_set_info { /* working info used by the routine iter_set_func */ CODE *code; /* pseudo-code for iterated operation to be performed */ ELEMSET *value; /* resultant value */ }; static int iter_set_func(MPL *mpl, void *_info) { /* this is auxiliary routine used to perform iterated operation on n-tuple "integrand" within domain scope */ struct iter_set_info *info = _info; TUPLE *tuple; switch (info->code->op) { case O_SETOF: /* compute next n-tuple and add it to the set; in this case duplicate n-tuples are silently ignored */ tuple = eval_tuple(mpl, info->code->arg.loop.x); if (find_tuple(mpl, info->value, tuple) == NULL) add_tuple(mpl, info->value, tuple); else delete_tuple(mpl, tuple); break; case O_BUILD: /* construct next n-tuple using current values assigned to *free* dummy indices as its components and add it to the set; in this case duplicate n-tuples cannot appear */ add_tuple(mpl, info->value, get_domain_tuple(mpl, info->code->arg.loop.domain)); break; default: xassert(info != info); } return 0; } ELEMSET *eval_elemset(MPL *mpl, CODE *code) { ELEMSET *value; xassert(code != NULL); xassert(code->type == A_ELEMSET); xassert(code->dim > 0); /* if the operation has a side effect, invalidate and delete the resultant value */ if (code->vflag && code->valid) { code->valid = 0; delete_value(mpl, code->type, &code->value); } /* if resultant value is valid, no evaluation is needed */ if (code->valid) { value = copy_elemset(mpl, code->value.set); goto done; } /* evaluate pseudo-code recursively */ switch (code->op) { case O_MEMSET: /* take member of set */ { TUPLE *tuple; ARG_LIST *e; tuple = create_tuple(mpl); for (e = code->arg.set.list; e != NULL; e = e->next) tuple = expand_tuple(mpl, tuple, eval_symbolic(mpl, e->x)); value = copy_elemset(mpl, eval_member_set(mpl, code->arg.set.set, tuple)); delete_tuple(mpl, tuple); } break; case O_MAKE: /* make elemental set of n-tuples */ { ARG_LIST *e; value = create_elemset(mpl, code->dim); for (e = code->arg.list; e != NULL; e = e->next) check_then_add(mpl, value, eval_tuple(mpl, e->x)); } break; case O_UNION: /* union of two elemental sets */ value = set_union(mpl, eval_elemset(mpl, code->arg.arg.x), eval_elemset(mpl, code->arg.arg.y)); break; case O_DIFF: /* difference between two elemental sets */ value = set_diff(mpl, eval_elemset(mpl, code->arg.arg.x), eval_elemset(mpl, code->arg.arg.y)); break; case O_SYMDIFF: /* symmetric difference between two elemental sets */ value = set_symdiff(mpl, eval_elemset(mpl, code->arg.arg.x), eval_elemset(mpl, code->arg.arg.y)); break; case O_INTER: /* intersection of two elemental sets */ value = set_inter(mpl, eval_elemset(mpl, code->arg.arg.x), eval_elemset(mpl, code->arg.arg.y)); break; case O_CROSS: /* cross (Cartesian) product of two elemental sets */ value = set_cross(mpl, eval_elemset(mpl, code->arg.arg.x), eval_elemset(mpl, code->arg.arg.y)); break; case O_DOTS: /* build "arithmetic" elemental set */ value = create_arelset(mpl, eval_numeric(mpl, code->arg.arg.x), eval_numeric(mpl, code->arg.arg.y), code->arg.arg.z == NULL ? 1.0 : eval_numeric(mpl, code->arg.arg.z)); break; case O_FORK: /* if-then-else */ if (eval_logical(mpl, code->arg.arg.x)) value = eval_elemset(mpl, code->arg.arg.y); else value = eval_elemset(mpl, code->arg.arg.z); break; case O_SETOF: /* compute elemental set */ { struct iter_set_info _info, *info = &_info; info->code = code; info->value = create_elemset(mpl, code->dim); loop_within_domain(mpl, code->arg.loop.domain, info, iter_set_func); value = info->value; } break; case O_BUILD: /* build elemental set identical to domain set */ { struct iter_set_info _info, *info = &_info; info->code = code; info->value = create_elemset(mpl, code->dim); loop_within_domain(mpl, code->arg.loop.domain, info, iter_set_func); value = info->value; } break; default: xassert(code != code); } /* save resultant value */ xassert(!code->valid); code->valid = 1; code->value.set = copy_elemset(mpl, value); done: return value; } /*---------------------------------------------------------------------- -- is_member - check if n-tuple is in set specified by pseudo-code. -- -- This routine checks if given n-tuple is a member of elemental set -- specified in the form of pseudo-code (i.e. by expression). -- -- The n-tuple may have more components that dimension of the elemental -- set, in which case the extra components are ignored. */ static void null_func(MPL *mpl, void *info) { /* this is dummy routine used to enter the domain scope */ xassert(mpl == mpl); xassert(info == NULL); return; } int is_member(MPL *mpl, CODE *code, TUPLE *tuple) { int value; xassert(code != NULL); xassert(code->type == A_ELEMSET); xassert(code->dim > 0); xassert(tuple != NULL); switch (code->op) { case O_MEMSET: /* check if given n-tuple is member of elemental set, which is assigned to member of model set */ { ARG_LIST *e; TUPLE *temp; ELEMSET *set; /* evaluate reference to elemental set */ temp = create_tuple(mpl); for (e = code->arg.set.list; e != NULL; e = e->next) temp = expand_tuple(mpl, temp, eval_symbolic(mpl, e->x)); set = eval_member_set(mpl, code->arg.set.set, temp); delete_tuple(mpl, temp); /* check if the n-tuple is contained in the set array */ temp = build_subtuple(mpl, tuple, set->dim); value = (find_tuple(mpl, set, temp) != NULL); delete_tuple(mpl, temp); } break; case O_MAKE: /* check if given n-tuple is member of literal set */ { ARG_LIST *e; TUPLE *temp, *that; value = 0; temp = build_subtuple(mpl, tuple, code->dim); for (e = code->arg.list; e != NULL; e = e->next) { that = eval_tuple(mpl, e->x); value = (compare_tuples(mpl, temp, that) == 0); delete_tuple(mpl, that); if (value) break; } delete_tuple(mpl, temp); } break; case O_UNION: value = is_member(mpl, code->arg.arg.x, tuple) || is_member(mpl, code->arg.arg.y, tuple); break; case O_DIFF: value = is_member(mpl, code->arg.arg.x, tuple) && !is_member(mpl, code->arg.arg.y, tuple); break; case O_SYMDIFF: { int in1 = is_member(mpl, code->arg.arg.x, tuple); int in2 = is_member(mpl, code->arg.arg.y, tuple); value = (in1 && !in2) || (!in1 && in2); } break; case O_INTER: value = is_member(mpl, code->arg.arg.x, tuple) && is_member(mpl, code->arg.arg.y, tuple); break; case O_CROSS: { int j; value = is_member(mpl, code->arg.arg.x, tuple); if (value) { for (j = 1; j <= code->arg.arg.x->dim; j++) { xassert(tuple != NULL); tuple = tuple->next; } value = is_member(mpl, code->arg.arg.y, tuple); } } break; case O_DOTS: /* check if given 1-tuple is member of "arithmetic" set */ { int j; double x, t0, tf, dt; xassert(code->dim == 1); /* compute "parameters" of the "arithmetic" set */ t0 = eval_numeric(mpl, code->arg.arg.x); tf = eval_numeric(mpl, code->arg.arg.y); if (code->arg.arg.z == NULL) dt = 1.0; else dt = eval_numeric(mpl, code->arg.arg.z); /* make sure the parameters are correct */ arelset_size(mpl, t0, tf, dt); /* if component of 1-tuple is symbolic, not numeric, the 1-tuple cannot be member of "arithmetic" set */ xassert(tuple->sym != NULL); if (tuple->sym->str != NULL) { value = 0; break; } /* determine numeric value of the component */ x = tuple->sym->num; /* if the component value is out of the set range, the 1-tuple is not in the set */ if (dt > 0.0 && !(t0 <= x && x <= tf) || dt < 0.0 && !(tf <= x && x <= t0)) { value = 0; break; } /* estimate ordinal number of the 1-tuple in the set */ j = (int)(((x - t0) / dt) + 0.5) + 1; /* perform the main check */ value = (arelset_member(mpl, t0, tf, dt, j) == x); } break; case O_FORK: /* check if given n-tuple is member of conditional set */ if (eval_logical(mpl, code->arg.arg.x)) value = is_member(mpl, code->arg.arg.y, tuple); else value = is_member(mpl, code->arg.arg.z, tuple); break; case O_SETOF: /* check if given n-tuple is member of computed set */ /* it is not clear how to efficiently perform the check not computing the entire elemental set :+( */ error(mpl, "implementation restriction; in/within setof{} n" "ot allowed"); break; case O_BUILD: /* check if given n-tuple is member of domain set */ { TUPLE *temp; temp = build_subtuple(mpl, tuple, code->dim); /* try to enter the domain scope; if it is successful, the n-tuple is in the domain set */ value = (eval_within_domain(mpl, code->arg.loop.domain, temp, NULL, null_func) == 0); delete_tuple(mpl, temp); } break; default: xassert(code != code); } return value; } /*---------------------------------------------------------------------- -- eval_formula - evaluate pseudo-code to construct linear form. -- -- This routine evaluates specified pseudo-code to construct resultant -- linear form, which is returned on exit. */ struct iter_form_info { /* working info used by the routine iter_form_func */ CODE *code; /* pseudo-code for iterated operation to be performed */ FORMULA *value; /* resultant value */ FORMULA *tail; /* pointer to the last term */ }; static int iter_form_func(MPL *mpl, void *_info) { /* this is auxiliary routine used to perform iterated operation on linear form "integrand" within domain scope */ struct iter_form_info *info = _info; switch (info->code->op) { case O_SUM: /* summation over domain */ #if 0 info->value = linear_comb(mpl, +1.0, info->value, +1.0, eval_formula(mpl, info->code->arg.loop.x)); #else /* the routine linear_comb needs to look through all terms of both linear forms to reduce identical terms, so using it here is not a good idea (for example, evaluation of sum{i in 1..n} x[i] required quadratic time); the better idea is to gather all terms of the integrand in one list and reduce identical terms only once after all terms of the resultant linear form have been evaluated */ { FORMULA *form, *term; form = eval_formula(mpl, info->code->arg.loop.x); if (info->value == NULL) { xassert(info->tail == NULL); info->value = form; } else { xassert(info->tail != NULL); info->tail->next = form; } for (term = form; term != NULL; term = term->next) info->tail = term; } #endif break; default: xassert(info != info); } return 0; } FORMULA *eval_formula(MPL *mpl, CODE *code) { FORMULA *value; xassert(code != NULL); xassert(code->type == A_FORMULA); xassert(code->dim == 0); /* if the operation has a side effect, invalidate and delete the resultant value */ if (code->vflag && code->valid) { code->valid = 0; delete_value(mpl, code->type, &code->value); } /* if resultant value is valid, no evaluation is needed */ if (code->valid) { value = copy_formula(mpl, code->value.form); goto done; } /* evaluate pseudo-code recursively */ switch (code->op) { case O_MEMVAR: /* take member of variable */ { TUPLE *tuple; ARG_LIST *e; tuple = create_tuple(mpl); for (e = code->arg.var.list; e != NULL; e = e->next) tuple = expand_tuple(mpl, tuple, eval_symbolic(mpl, e->x)); #if 1 /* 15/V-2010 */ xassert(code->arg.var.suff == DOT_NONE); #endif value = single_variable(mpl, eval_member_var(mpl, code->arg.var.var, tuple)); delete_tuple(mpl, tuple); } break; case O_CVTLFM: /* convert to linear form */ value = constant_term(mpl, eval_numeric(mpl, code->arg.arg.x)); break; case O_PLUS: /* unary plus */ value = linear_comb(mpl, 0.0, constant_term(mpl, 0.0), +1.0, eval_formula(mpl, code->arg.arg.x)); break; case O_MINUS: /* unary minus */ value = linear_comb(mpl, 0.0, constant_term(mpl, 0.0), -1.0, eval_formula(mpl, code->arg.arg.x)); break; case O_ADD: /* addition */ value = linear_comb(mpl, +1.0, eval_formula(mpl, code->arg.arg.x), +1.0, eval_formula(mpl, code->arg.arg.y)); break; case O_SUB: /* subtraction */ value = linear_comb(mpl, +1.0, eval_formula(mpl, code->arg.arg.x), -1.0, eval_formula(mpl, code->arg.arg.y)); break; case O_MUL: /* multiplication */ xassert(code->arg.arg.x != NULL); xassert(code->arg.arg.y != NULL); if (code->arg.arg.x->type == A_NUMERIC) { xassert(code->arg.arg.y->type == A_FORMULA); value = linear_comb(mpl, eval_numeric(mpl, code->arg.arg.x), eval_formula(mpl, code->arg.arg.y), 0.0, constant_term(mpl, 0.0)); } else { xassert(code->arg.arg.x->type == A_FORMULA); xassert(code->arg.arg.y->type == A_NUMERIC); value = linear_comb(mpl, eval_numeric(mpl, code->arg.arg.y), eval_formula(mpl, code->arg.arg.x), 0.0, constant_term(mpl, 0.0)); } break; case O_DIV: /* division */ value = linear_comb(mpl, fp_div(mpl, 1.0, eval_numeric(mpl, code->arg.arg.y)), eval_formula(mpl, code->arg.arg.x), 0.0, constant_term(mpl, 0.0)); break; case O_FORK: /* if-then-else */ if (eval_logical(mpl, code->arg.arg.x)) value = eval_formula(mpl, code->arg.arg.y); else if (code->arg.arg.z == NULL) value = constant_term(mpl, 0.0); else value = eval_formula(mpl, code->arg.arg.z); break; case O_SUM: /* summation over domain */ { struct iter_form_info _info, *info = &_info; info->code = code; info->value = constant_term(mpl, 0.0); info->tail = NULL; loop_within_domain(mpl, code->arg.loop.domain, info, iter_form_func); value = reduce_terms(mpl, info->value); } break; default: xassert(code != code); } /* save resultant value */ xassert(!code->valid); code->valid = 1; code->value.form = copy_formula(mpl, value); done: return value; } /*---------------------------------------------------------------------- -- clean_code - clean pseudo-code. -- -- This routine recursively cleans specified pseudo-code that assumes -- deleting all temporary resultant values. */ void clean_code(MPL *mpl, CODE *code) { ARG_LIST *e; /* if no pseudo-code is specified, do nothing */ if (code == NULL) goto done; /* if resultant value is valid (exists), delete it */ if (code->valid) { code->valid = 0; delete_value(mpl, code->type, &code->value); } /* recursively clean pseudo-code for operands */ switch (code->op) { case O_NUMBER: case O_STRING: case O_INDEX: break; case O_MEMNUM: case O_MEMSYM: for (e = code->arg.par.list; e != NULL; e = e->next) clean_code(mpl, e->x); break; case O_MEMSET: for (e = code->arg.set.list; e != NULL; e = e->next) clean_code(mpl, e->x); break; case O_MEMVAR: for (e = code->arg.var.list; e != NULL; e = e->next) clean_code(mpl, e->x); break; #if 1 /* 15/V-2010 */ case O_MEMCON: for (e = code->arg.con.list; e != NULL; e = e->next) clean_code(mpl, e->x); break; #endif case O_TUPLE: case O_MAKE: for (e = code->arg.list; e != NULL; e = e->next) clean_code(mpl, e->x); break; case O_SLICE: xassert(code != code); case O_IRAND224: case O_UNIFORM01: case O_NORMAL01: case O_GMTIME: break; case O_CVTNUM: case O_CVTSYM: case O_CVTLOG: case O_CVTTUP: case O_CVTLFM: case O_PLUS: case O_MINUS: case O_NOT: case O_ABS: case O_CEIL: case O_FLOOR: case O_EXP: case O_LOG: case O_LOG10: case O_SQRT: case O_SIN: case O_COS: case O_TAN: case O_ATAN: case O_ROUND: case O_TRUNC: case O_CARD: case O_LENGTH: /* unary operation */ clean_code(mpl, code->arg.arg.x); break; case O_ADD: case O_SUB: case O_LESS: case O_MUL: case O_DIV: case O_IDIV: case O_MOD: case O_POWER: case O_ATAN2: case O_ROUND2: case O_TRUNC2: case O_UNIFORM: case O_NORMAL: case O_CONCAT: case O_LT: case O_LE: case O_EQ: case O_GE: case O_GT: case O_NE: case O_AND: case O_OR: case O_UNION: case O_DIFF: case O_SYMDIFF: case O_INTER: case O_CROSS: case O_IN: case O_NOTIN: case O_WITHIN: case O_NOTWITHIN: case O_SUBSTR: case O_STR2TIME: case O_TIME2STR: /* binary operation */ clean_code(mpl, code->arg.arg.x); clean_code(mpl, code->arg.arg.y); break; case O_DOTS: case O_FORK: case O_SUBSTR3: /* ternary operation */ clean_code(mpl, code->arg.arg.x); clean_code(mpl, code->arg.arg.y); clean_code(mpl, code->arg.arg.z); break; case O_MIN: case O_MAX: /* n-ary operation */ for (e = code->arg.list; e != NULL; e = e->next) clean_code(mpl, e->x); break; case O_SUM: case O_PROD: case O_MINIMUM: case O_MAXIMUM: case O_FORALL: case O_EXISTS: case O_SETOF: case O_BUILD: /* iterated operation */ clean_domain(mpl, code->arg.loop.domain); clean_code(mpl, code->arg.loop.x); break; default: xassert(code->op != code->op); } done: return; } #if 1 /* 11/II-2008 */ /**********************************************************************/ /* * * DATA TABLES * * */ /**********************************************************************/ int mpl_tab_num_args(TABDCA *dca) { /* returns the number of arguments */ return dca->na; } const char *mpl_tab_get_arg(TABDCA *dca, int k) { /* returns pointer to k-th argument */ xassert(1 <= k && k <= dca->na); return dca->arg[k]; } int mpl_tab_num_flds(TABDCA *dca) { /* returns the number of fields */ return dca->nf; } const char *mpl_tab_get_name(TABDCA *dca, int k) { /* returns pointer to name of k-th field */ xassert(1 <= k && k <= dca->nf); return dca->name[k]; } int mpl_tab_get_type(TABDCA *dca, int k) { /* returns type of k-th field */ xassert(1 <= k && k <= dca->nf); return dca->type[k]; } double mpl_tab_get_num(TABDCA *dca, int k) { /* returns numeric value of k-th field */ xassert(1 <= k && k <= dca->nf); xassert(dca->type[k] == 'N'); return dca->num[k]; } const char *mpl_tab_get_str(TABDCA *dca, int k) { /* returns pointer to string value of k-th field */ xassert(1 <= k && k <= dca->nf); xassert(dca->type[k] == 'S'); xassert(dca->str[k] != NULL); return dca->str[k]; } void mpl_tab_set_num(TABDCA *dca, int k, double num) { /* assign numeric value to k-th field */ xassert(1 <= k && k <= dca->nf); xassert(dca->type[k] == '?'); dca->type[k] = 'N'; dca->num[k] = num; return; } void mpl_tab_set_str(TABDCA *dca, int k, const char *str) { /* assign string value to k-th field */ xassert(1 <= k && k <= dca->nf); xassert(dca->type[k] == '?'); xassert(strlen(str) <= MAX_LENGTH); xassert(dca->str[k] != NULL); dca->type[k] = 'S'; strcpy(dca->str[k], str); return; } static int write_func(MPL *mpl, void *info) { /* this is auxiliary routine to work within domain scope */ TABLE *tab = info; TABDCA *dca = mpl->dca; TABOUT *out; SYMBOL *sym; int k; char buf[MAX_LENGTH+1]; /* evaluate field values */ k = 0; for (out = tab->u.out.list; out != NULL; out = out->next) { k++; switch (out->code->type) { case A_NUMERIC: dca->type[k] = 'N'; dca->num[k] = eval_numeric(mpl, out->code); dca->str[k][0] = '\0'; break; case A_SYMBOLIC: sym = eval_symbolic(mpl, out->code); if (sym->str == NULL) { dca->type[k] = 'N'; dca->num[k] = sym->num; dca->str[k][0] = '\0'; } else { dca->type[k] = 'S'; dca->num[k] = 0.0; fetch_string(mpl, sym->str, buf); strcpy(dca->str[k], buf); } delete_symbol(mpl, sym); break; default: xassert(out != out); } } /* write record to output table */ mpl_tab_drv_write(mpl); return 0; } void execute_table(MPL *mpl, TABLE *tab) { /* execute table statement */ TABARG *arg; TABFLD *fld; TABIN *in; TABOUT *out; TABDCA *dca; SET *set; int k; char buf[MAX_LENGTH+1]; /* allocate table driver communication area */ xassert(mpl->dca == NULL); mpl->dca = dca = xmalloc(sizeof(TABDCA)); dca->id = 0; dca->link = NULL; dca->na = 0; dca->arg = NULL; dca->nf = 0; dca->name = NULL; dca->type = NULL; dca->num = NULL; dca->str = NULL; /* allocate arguments */ xassert(dca->na == 0); for (arg = tab->arg; arg != NULL; arg = arg->next) dca->na++; dca->arg = xcalloc(1+dca->na, sizeof(char *)); #if 1 /* 28/IX-2008 */ for (k = 1; k <= dca->na; k++) dca->arg[k] = NULL; #endif /* evaluate argument values */ k = 0; for (arg = tab->arg; arg != NULL; arg = arg->next) { SYMBOL *sym; k++; xassert(arg->code->type == A_SYMBOLIC); sym = eval_symbolic(mpl, arg->code); if (sym->str == NULL) sprintf(buf, "%.*g", DBL_DIG, sym->num); else fetch_string(mpl, sym->str, buf); delete_symbol(mpl, sym); dca->arg[k] = xmalloc(strlen(buf)+1); strcpy(dca->arg[k], buf); } /* perform table input/output */ switch (tab->type) { case A_INPUT: goto read_table; case A_OUTPUT: goto write_table; default: xassert(tab != tab); } read_table: /* read data from input table */ /* add the only member to the control set and assign it empty elemental set */ set = tab->u.in.set; if (set != NULL) { if (set->data) error(mpl, "%s already provided with data", set->name); xassert(set->array->head == NULL); add_member(mpl, set->array, NULL)->value.set = create_elemset(mpl, set->dimen); set->data = 1; } /* check parameters specified in the input list */ for (in = tab->u.in.list; in != NULL; in = in->next) { if (in->par->data) error(mpl, "%s already provided with data", in->par->name); in->par->data = 1; } /* allocate and initialize fields */ xassert(dca->nf == 0); for (fld = tab->u.in.fld; fld != NULL; fld = fld->next) dca->nf++; for (in = tab->u.in.list; in != NULL; in = in->next) dca->nf++; dca->name = xcalloc(1+dca->nf, sizeof(char *)); dca->type = xcalloc(1+dca->nf, sizeof(int)); dca->num = xcalloc(1+dca->nf, sizeof(double)); dca->str = xcalloc(1+dca->nf, sizeof(char *)); k = 0; for (fld = tab->u.in.fld; fld != NULL; fld = fld->next) { k++; dca->name[k] = fld->name; dca->type[k] = '?'; dca->num[k] = 0.0; dca->str[k] = xmalloc(MAX_LENGTH+1); dca->str[k][0] = '\0'; } for (in = tab->u.in.list; in != NULL; in = in->next) { k++; dca->name[k] = in->name; dca->type[k] = '?'; dca->num[k] = 0.0; dca->str[k] = xmalloc(MAX_LENGTH+1); dca->str[k][0] = '\0'; } /* open input table */ mpl_tab_drv_open(mpl, 'R'); /* read and process records */ for (;;) { TUPLE *tup; /* reset field types */ for (k = 1; k <= dca->nf; k++) dca->type[k] = '?'; /* read next record */ if (mpl_tab_drv_read(mpl)) break; /* all fields must be set by the driver */ for (k = 1; k <= dca->nf; k++) { if (dca->type[k] == '?') error(mpl, "field %s missing in input table", dca->name[k]); } /* construct n-tuple */ tup = create_tuple(mpl); k = 0; for (fld = tab->u.in.fld; fld != NULL; fld = fld->next) { k++; xassert(k <= dca->nf); switch (dca->type[k]) { case 'N': tup = expand_tuple(mpl, tup, create_symbol_num(mpl, dca->num[k])); break; case 'S': xassert(strlen(dca->str[k]) <= MAX_LENGTH); tup = expand_tuple(mpl, tup, create_symbol_str(mpl, create_string(mpl, dca->str[k]))); break; default: xassert(dca != dca); } } /* add n-tuple just read to the control set */ if (tab->u.in.set != NULL) check_then_add(mpl, tab->u.in.set->array->head->value.set, copy_tuple(mpl, tup)); /* assign values to the parameters in the input list */ for (in = tab->u.in.list; in != NULL; in = in->next) { MEMBER *memb; k++; xassert(k <= dca->nf); /* there must be no member with the same n-tuple */ if (find_member(mpl, in->par->array, tup) != NULL) error(mpl, "%s%s already defined", in->par->name, format_tuple(mpl, '[', tup)); /* create new parameter member with given n-tuple */ memb = add_member(mpl, in->par->array, copy_tuple(mpl, tup)) ; /* assign value to the parameter member */ switch (in->par->type) { case A_NUMERIC: case A_INTEGER: case A_BINARY: if (dca->type[k] != 'N') error(mpl, "%s requires numeric data", in->par->name); memb->value.num = dca->num[k]; break; case A_SYMBOLIC: switch (dca->type[k]) { case 'N': memb->value.sym = create_symbol_num(mpl, dca->num[k]); break; case 'S': xassert(strlen(dca->str[k]) <= MAX_LENGTH); memb->value.sym = create_symbol_str(mpl, create_string(mpl,dca->str[k])); break; default: xassert(dca != dca); } break; default: xassert(in != in); } } /* n-tuple is no more needed */ delete_tuple(mpl, tup); } /* close input table */ mpl_tab_drv_close(mpl); goto done; write_table: /* write data to output table */ /* allocate and initialize fields */ xassert(dca->nf == 0); for (out = tab->u.out.list; out != NULL; out = out->next) dca->nf++; dca->name = xcalloc(1+dca->nf, sizeof(char *)); dca->type = xcalloc(1+dca->nf, sizeof(int)); dca->num = xcalloc(1+dca->nf, sizeof(double)); dca->str = xcalloc(1+dca->nf, sizeof(char *)); k = 0; for (out = tab->u.out.list; out != NULL; out = out->next) { k++; dca->name[k] = out->name; dca->type[k] = '?'; dca->num[k] = 0.0; dca->str[k] = xmalloc(MAX_LENGTH+1); dca->str[k][0] = '\0'; } /* open output table */ mpl_tab_drv_open(mpl, 'W'); /* evaluate fields and write records */ loop_within_domain(mpl, tab->u.out.domain, tab, write_func); /* close output table */ mpl_tab_drv_close(mpl); done: /* free table driver communication area */ free_dca(mpl); return; } void free_dca(MPL *mpl) { /* free table driver communucation area */ TABDCA *dca = mpl->dca; int k; if (dca != NULL) { if (dca->link != NULL) mpl_tab_drv_close(mpl); if (dca->arg != NULL) { for (k = 1; k <= dca->na; k++) #if 1 /* 28/IX-2008 */ if (dca->arg[k] != NULL) #endif xfree(dca->arg[k]); xfree(dca->arg); } if (dca->name != NULL) xfree(dca->name); if (dca->type != NULL) xfree(dca->type); if (dca->num != NULL) xfree(dca->num); if (dca->str != NULL) { for (k = 1; k <= dca->nf; k++) xfree(dca->str[k]); xfree(dca->str); } xfree(dca), mpl->dca = NULL; } return; } void clean_table(MPL *mpl, TABLE *tab) { /* clean table statement */ TABARG *arg; TABOUT *out; /* clean string list */ for (arg = tab->arg; arg != NULL; arg = arg->next) clean_code(mpl, arg->code); switch (tab->type) { case A_INPUT: break; case A_OUTPUT: /* clean subscript domain */ clean_domain(mpl, tab->u.out.domain); /* clean output list */ for (out = tab->u.out.list; out != NULL; out = out->next) clean_code(mpl, out->code); break; default: xassert(tab != tab); } return; } #endif /**********************************************************************/ /* * * MODEL STATEMENTS * * */ /**********************************************************************/ /*---------------------------------------------------------------------- -- execute_check - execute check statement. -- -- This routine executes specified check statement. */ static int check_func(MPL *mpl, void *info) { /* this is auxiliary routine to work within domain scope */ CHECK *chk = (CHECK *)info; if (!eval_logical(mpl, chk->code)) error(mpl, "check%s failed", format_tuple(mpl, '[', get_domain_tuple(mpl, chk->domain))); return 0; } void execute_check(MPL *mpl, CHECK *chk) { loop_within_domain(mpl, chk->domain, chk, check_func); return; } /*---------------------------------------------------------------------- -- clean_check - clean check statement. -- -- This routine cleans specified check statement that assumes deleting -- all stuff dynamically allocated on generating/postsolving phase. */ void clean_check(MPL *mpl, CHECK *chk) { /* clean subscript domain */ clean_domain(mpl, chk->domain); /* clean pseudo-code for computing predicate */ clean_code(mpl, chk->code); return; } /*---------------------------------------------------------------------- -- execute_display - execute display statement. -- -- This routine executes specified display statement. */ static void display_set(MPL *mpl, SET *set, MEMBER *memb) { /* display member of model set */ ELEMSET *s = memb->value.set; MEMBER *m; write_text(mpl, "%s%s%s\n", set->name, format_tuple(mpl, '[', memb->tuple), s->head == NULL ? " is empty" : ":"); for (m = s->head; m != NULL; m = m->next) write_text(mpl, " %s\n", format_tuple(mpl, '(', m->tuple)); return; } static void display_par(MPL *mpl, PARAMETER *par, MEMBER *memb) { /* display member of model parameter */ switch (par->type) { case A_NUMERIC: case A_INTEGER: case A_BINARY: write_text(mpl, "%s%s = %.*g\n", par->name, format_tuple(mpl, '[', memb->tuple), DBL_DIG, memb->value.num); break; case A_SYMBOLIC: write_text(mpl, "%s%s = %s\n", par->name, format_tuple(mpl, '[', memb->tuple), format_symbol(mpl, memb->value.sym)); break; default: xassert(par != par); } return; } #if 1 /* 15/V-2010 */ static void display_var(MPL *mpl, VARIABLE *var, MEMBER *memb, int suff) { /* display member of model variable */ if (suff == DOT_NONE || suff == DOT_VAL) write_text(mpl, "%s%s.val = %.*g\n", var->name, format_tuple(mpl, '[', memb->tuple), DBL_DIG, memb->value.var->prim); else if (suff == DOT_LB) write_text(mpl, "%s%s.lb = %.*g\n", var->name, format_tuple(mpl, '[', memb->tuple), DBL_DIG, memb->value.var->var->lbnd == NULL ? -DBL_MAX : memb->value.var->lbnd); else if (suff == DOT_UB) write_text(mpl, "%s%s.ub = %.*g\n", var->name, format_tuple(mpl, '[', memb->tuple), DBL_DIG, memb->value.var->var->ubnd == NULL ? +DBL_MAX : memb->value.var->ubnd); else if (suff == DOT_STATUS) write_text(mpl, "%s%s.status = %d\n", var->name, format_tuple (mpl, '[', memb->tuple), memb->value.var->stat); else if (suff == DOT_DUAL) write_text(mpl, "%s%s.dual = %.*g\n", var->name, format_tuple(mpl, '[', memb->tuple), DBL_DIG, memb->value.var->dual); else xassert(suff != suff); return; } #endif #if 1 /* 15/V-2010 */ static void display_con(MPL *mpl, CONSTRAINT *con, MEMBER *memb, int suff) { /* display member of model constraint */ if (suff == DOT_NONE || suff == DOT_VAL) write_text(mpl, "%s%s.val = %.*g\n", con->name, format_tuple(mpl, '[', memb->tuple), DBL_DIG, memb->value.con->prim); else if (suff == DOT_LB) write_text(mpl, "%s%s.lb = %.*g\n", con->name, format_tuple(mpl, '[', memb->tuple), DBL_DIG, memb->value.con->con->lbnd == NULL ? -DBL_MAX : memb->value.con->lbnd); else if (suff == DOT_UB) write_text(mpl, "%s%s.ub = %.*g\n", con->name, format_tuple(mpl, '[', memb->tuple), DBL_DIG, memb->value.con->con->ubnd == NULL ? +DBL_MAX : memb->value.con->ubnd); else if (suff == DOT_STATUS) write_text(mpl, "%s%s.status = %d\n", con->name, format_tuple (mpl, '[', memb->tuple), memb->value.con->stat); else if (suff == DOT_DUAL) write_text(mpl, "%s%s.dual = %.*g\n", con->name, format_tuple(mpl, '[', memb->tuple), DBL_DIG, memb->value.con->dual); else xassert(suff != suff); return; } #endif static void display_memb(MPL *mpl, CODE *code) { /* display member specified by pseudo-code */ MEMBER memb; ARG_LIST *e; xassert(code->op == O_MEMNUM || code->op == O_MEMSYM || code->op == O_MEMSET || code->op == O_MEMVAR || code->op == O_MEMCON); memb.tuple = create_tuple(mpl); for (e = code->arg.par.list; e != NULL; e = e->next) memb.tuple = expand_tuple(mpl, memb.tuple, eval_symbolic(mpl, e->x)); switch (code->op) { case O_MEMNUM: memb.value.num = eval_member_num(mpl, code->arg.par.par, memb.tuple); display_par(mpl, code->arg.par.par, &memb); break; case O_MEMSYM: memb.value.sym = eval_member_sym(mpl, code->arg.par.par, memb.tuple); display_par(mpl, code->arg.par.par, &memb); delete_symbol(mpl, memb.value.sym); break; case O_MEMSET: memb.value.set = eval_member_set(mpl, code->arg.set.set, memb.tuple); display_set(mpl, code->arg.set.set, &memb); break; case O_MEMVAR: memb.value.var = eval_member_var(mpl, code->arg.var.var, memb.tuple); display_var (mpl, code->arg.var.var, &memb, code->arg.var.suff); break; case O_MEMCON: memb.value.con = eval_member_con(mpl, code->arg.con.con, memb.tuple); display_con (mpl, code->arg.con.con, &memb, code->arg.con.suff); break; default: xassert(code != code); } delete_tuple(mpl, memb.tuple); return; } static void display_code(MPL *mpl, CODE *code) { /* display value of expression */ switch (code->type) { case A_NUMERIC: /* numeric value */ { double num; num = eval_numeric(mpl, code); write_text(mpl, "%.*g\n", DBL_DIG, num); } break; case A_SYMBOLIC: /* symbolic value */ { SYMBOL *sym; sym = eval_symbolic(mpl, code); write_text(mpl, "%s\n", format_symbol(mpl, sym)); delete_symbol(mpl, sym); } break; case A_LOGICAL: /* logical value */ { int bit; bit = eval_logical(mpl, code); write_text(mpl, "%s\n", bit ? "true" : "false"); } break; case A_TUPLE: /* n-tuple */ { TUPLE *tuple; tuple = eval_tuple(mpl, code); write_text(mpl, "%s\n", format_tuple(mpl, '(', tuple)); delete_tuple(mpl, tuple); } break; case A_ELEMSET: /* elemental set */ { ELEMSET *set; MEMBER *memb; set = eval_elemset(mpl, code); if (set->head == 0) write_text(mpl, "set is empty\n"); for (memb = set->head; memb != NULL; memb = memb->next) write_text(mpl, " %s\n", format_tuple(mpl, '(', memb->tuple)); delete_elemset(mpl, set); } break; case A_FORMULA: /* linear form */ { FORMULA *form, *term; form = eval_formula(mpl, code); if (form == NULL) write_text(mpl, "linear form is empty\n"); for (term = form; term != NULL; term = term->next) { if (term->var == NULL) write_text(mpl, " %.*g\n", term->coef); else write_text(mpl, " %.*g %s%s\n", DBL_DIG, term->coef, term->var->var->name, format_tuple(mpl, '[', term->var->memb->tuple)); } delete_formula(mpl, form); } break; default: xassert(code != code); } return; } static int display_func(MPL *mpl, void *info) { /* this is auxiliary routine to work within domain scope */ DISPLAY *dpy = (DISPLAY *)info; DISPLAY1 *entry; for (entry = dpy->list; entry != NULL; entry = entry->next) { if (entry->type == A_INDEX) { /* dummy index */ DOMAIN_SLOT *slot = entry->u.slot; write_text(mpl, "%s = %s\n", slot->name, format_symbol(mpl, slot->value)); } else if (entry->type == A_SET) { /* model set */ SET *set = entry->u.set; MEMBER *memb; if (set->assign != NULL) { /* the set has assignment expression; evaluate all its members over entire domain */ eval_whole_set(mpl, set); } else { /* the set has no assignment expression; refer to its any existing member ignoring resultant value to check the data provided the data section */ #if 1 /* 12/XII-2008 */ if (set->gadget != NULL && set->data == 0) { /* initialize the set with data from a plain set */ saturate_set(mpl, set); } #endif if (set->array->head != NULL) eval_member_set(mpl, set, set->array->head->tuple); } /* display all members of the set array */ if (set->array->head == NULL) write_text(mpl, "%s has empty content\n", set->name); for (memb = set->array->head; memb != NULL; memb = memb->next) display_set(mpl, set, memb); } else if (entry->type == A_PARAMETER) { /* model parameter */ PARAMETER *par = entry->u.par; MEMBER *memb; if (par->assign != NULL) { /* the parameter has an assignment expression; evaluate all its member over entire domain */ eval_whole_par(mpl, par); } else { /* the parameter has no assignment expression; refer to its any existing member ignoring resultant value to check the data provided in the data section */ if (par->array->head != NULL) { if (par->type != A_SYMBOLIC) eval_member_num(mpl, par, par->array->head->tuple); else delete_symbol(mpl, eval_member_sym(mpl, par, par->array->head->tuple)); } } /* display all members of the parameter array */ if (par->array->head == NULL) write_text(mpl, "%s has empty content\n", par->name); for (memb = par->array->head; memb != NULL; memb = memb->next) display_par(mpl, par, memb); } else if (entry->type == A_VARIABLE) { /* model variable */ VARIABLE *var = entry->u.var; MEMBER *memb; xassert(mpl->flag_p); /* display all members of the variable array */ if (var->array->head == NULL) write_text(mpl, "%s has empty content\n", var->name); for (memb = var->array->head; memb != NULL; memb = memb->next) display_var(mpl, var, memb, DOT_NONE); } else if (entry->type == A_CONSTRAINT) { /* model constraint */ CONSTRAINT *con = entry->u.con; MEMBER *memb; xassert(mpl->flag_p); /* display all members of the constraint array */ if (con->array->head == NULL) write_text(mpl, "%s has empty content\n", con->name); for (memb = con->array->head; memb != NULL; memb = memb->next) display_con(mpl, con, memb, DOT_NONE); } else if (entry->type == A_EXPRESSION) { /* expression */ CODE *code = entry->u.code; if (code->op == O_MEMNUM || code->op == O_MEMSYM || code->op == O_MEMSET || code->op == O_MEMVAR || code->op == O_MEMCON) display_memb(mpl, code); else display_code(mpl, code); } else xassert(entry != entry); } return 0; } void execute_display(MPL *mpl, DISPLAY *dpy) { loop_within_domain(mpl, dpy->domain, dpy, display_func); return; } /*---------------------------------------------------------------------- -- clean_display - clean display statement. -- -- This routine cleans specified display statement that assumes deleting -- all stuff dynamically allocated on generating/postsolving phase. */ void clean_display(MPL *mpl, DISPLAY *dpy) { DISPLAY1 *d; #if 0 /* 15/V-2010 */ ARG_LIST *e; #endif /* clean subscript domain */ clean_domain(mpl, dpy->domain); /* clean display list */ for (d = dpy->list; d != NULL; d = d->next) { /* clean pseudo-code for computing expression */ if (d->type == A_EXPRESSION) clean_code(mpl, d->u.code); #if 0 /* 15/V-2010 */ /* clean pseudo-code for computing subscripts */ for (e = d->list; e != NULL; e = e->next) clean_code(mpl, e->x); #endif } return; } /*---------------------------------------------------------------------- -- execute_printf - execute printf statement. -- -- This routine executes specified printf statement. */ #if 1 /* 14/VII-2006 */ static void print_char(MPL *mpl, int c) { if (mpl->prt_fp == NULL) write_char(mpl, c); else #if 0 /* 04/VIII-2013 */ xfputc(c, mpl->prt_fp); #else { unsigned char buf[1]; buf[0] = (unsigned char)c; glp_write(mpl->prt_fp, buf, 1); } #endif return; } static void print_text(MPL *mpl, char *fmt, ...) { va_list arg; char buf[OUTBUF_SIZE], *c; va_start(arg, fmt); vsprintf(buf, fmt, arg); xassert(strlen(buf) < sizeof(buf)); va_end(arg); for (c = buf; *c != '\0'; c++) print_char(mpl, *c); return; } #endif static int printf_func(MPL *mpl, void *info) { /* this is auxiliary routine to work within domain scope */ PRINTF *prt = (PRINTF *)info; PRINTF1 *entry; SYMBOL *sym; char fmt[MAX_LENGTH+1], *c, *from, save; /* evaluate format control string */ sym = eval_symbolic(mpl, prt->fmt); if (sym->str == NULL) sprintf(fmt, "%.*g", DBL_DIG, sym->num); else fetch_string(mpl, sym->str, fmt); delete_symbol(mpl, sym); /* scan format control string and perform formatting output */ entry = prt->list; for (c = fmt; *c != '\0'; c++) { if (*c == '%') { /* scan format specifier */ from = c++; if (*c == '%') { print_char(mpl, '%'); continue; } if (entry == NULL) break; /* scan optional flags */ while (*c == '-' || *c == '+' || *c == ' ' || *c == '#' || *c == '0') c++; /* scan optional minimum field width */ while (isdigit((unsigned char)*c)) c++; /* scan optional precision */ if (*c == '.') { c++; while (isdigit((unsigned char)*c)) c++; } /* scan conversion specifier and perform formatting */ save = *(c+1), *(c+1) = '\0'; if (*c == 'd' || *c == 'i' || *c == 'e' || *c == 'E' || *c == 'f' || *c == 'F' || *c == 'g' || *c == 'G') { /* the specifier requires numeric value */ double value; xassert(entry != NULL); switch (entry->code->type) { case A_NUMERIC: value = eval_numeric(mpl, entry->code); break; case A_SYMBOLIC: sym = eval_symbolic(mpl, entry->code); if (sym->str != NULL) error(mpl, "cannot convert %s to floating-point" " number", format_symbol(mpl, sym)); value = sym->num; delete_symbol(mpl, sym); break; case A_LOGICAL: if (eval_logical(mpl, entry->code)) value = 1.0; else value = 0.0; break; default: xassert(entry != entry); } if (*c == 'd' || *c == 'i') { double int_max = (double)INT_MAX; if (!(-int_max <= value && value <= +int_max)) error(mpl, "cannot convert %.*g to integer", DBL_DIG, value); print_text(mpl, from, (int)floor(value + 0.5)); } else print_text(mpl, from, value); } else if (*c == 's') { /* the specifier requires symbolic value */ char value[MAX_LENGTH+1]; switch (entry->code->type) { case A_NUMERIC: sprintf(value, "%.*g", DBL_DIG, eval_numeric(mpl, entry->code)); break; case A_LOGICAL: if (eval_logical(mpl, entry->code)) strcpy(value, "T"); else strcpy(value, "F"); break; case A_SYMBOLIC: sym = eval_symbolic(mpl, entry->code); if (sym->str == NULL) sprintf(value, "%.*g", DBL_DIG, sym->num); else fetch_string(mpl, sym->str, value); delete_symbol(mpl, sym); break; default: xassert(entry != entry); } print_text(mpl, from, value); } else error(mpl, "format specifier missing or invalid"); *(c+1) = save; entry = entry->next; } else if (*c == '\\') { /* write some control character */ c++; if (*c == 't') print_char(mpl, '\t'); else if (*c == 'n') print_char(mpl, '\n'); #if 1 /* 28/X-2010 */ else if (*c == '\0') { /* format string ends with backslash */ error(mpl, "invalid use of escape character \\ in format" " control string"); } #endif else print_char(mpl, *c); } else { /* write character without formatting */ print_char(mpl, *c); } } return 0; } #if 0 /* 14/VII-2006 */ void execute_printf(MPL *mpl, PRINTF *prt) { loop_within_domain(mpl, prt->domain, prt, printf_func); return; } #else void execute_printf(MPL *mpl, PRINTF *prt) { if (prt->fname == NULL) { /* switch to the standard output */ if (mpl->prt_fp != NULL) { glp_close(mpl->prt_fp), mpl->prt_fp = NULL; xfree(mpl->prt_file), mpl->prt_file = NULL; } } else { /* evaluate file name string */ SYMBOL *sym; char fname[MAX_LENGTH+1]; sym = eval_symbolic(mpl, prt->fname); if (sym->str == NULL) sprintf(fname, "%.*g", DBL_DIG, sym->num); else fetch_string(mpl, sym->str, fname); delete_symbol(mpl, sym); /* close the current print file, if necessary */ if (mpl->prt_fp != NULL && (!prt->app || strcmp(mpl->prt_file, fname) != 0)) { glp_close(mpl->prt_fp), mpl->prt_fp = NULL; xfree(mpl->prt_file), mpl->prt_file = NULL; } /* open the specified print file, if necessary */ if (mpl->prt_fp == NULL) { mpl->prt_fp = glp_open(fname, prt->app ? "a" : "w"); if (mpl->prt_fp == NULL) error(mpl, "unable to open '%s' for writing - %s", fname, get_err_msg()); mpl->prt_file = xmalloc(strlen(fname)+1); strcpy(mpl->prt_file, fname); } } loop_within_domain(mpl, prt->domain, prt, printf_func); if (mpl->prt_fp != NULL) { #if 0 /* FIXME */ xfflush(mpl->prt_fp); #endif if (glp_ioerr(mpl->prt_fp)) error(mpl, "writing error to '%s' - %s", mpl->prt_file, get_err_msg()); } return; } #endif /*---------------------------------------------------------------------- -- clean_printf - clean printf statement. -- -- This routine cleans specified printf statement that assumes deleting -- all stuff dynamically allocated on generating/postsolving phase. */ void clean_printf(MPL *mpl, PRINTF *prt) { PRINTF1 *p; /* clean subscript domain */ clean_domain(mpl, prt->domain); /* clean pseudo-code for computing format string */ clean_code(mpl, prt->fmt); /* clean printf list */ for (p = prt->list; p != NULL; p = p->next) { /* clean pseudo-code for computing value to be printed */ clean_code(mpl, p->code); } #if 1 /* 14/VII-2006 */ /* clean pseudo-code for computing file name string */ clean_code(mpl, prt->fname); #endif return; } /*---------------------------------------------------------------------- -- execute_for - execute for statement. -- -- This routine executes specified for statement. */ static int for_func(MPL *mpl, void *info) { /* this is auxiliary routine to work within domain scope */ FOR *fur = (FOR *)info; STATEMENT *stmt, *save; save = mpl->stmt; for (stmt = fur->list; stmt != NULL; stmt = stmt->next) execute_statement(mpl, stmt); mpl->stmt = save; return 0; } void execute_for(MPL *mpl, FOR *fur) { loop_within_domain(mpl, fur->domain, fur, for_func); return; } /*---------------------------------------------------------------------- -- clean_for - clean for statement. -- -- This routine cleans specified for statement that assumes deleting all -- stuff dynamically allocated on generating/postsolving phase. */ void clean_for(MPL *mpl, FOR *fur) { STATEMENT *stmt; /* clean subscript domain */ clean_domain(mpl, fur->domain); /* clean all sub-statements */ for (stmt = fur->list; stmt != NULL; stmt = stmt->next) clean_statement(mpl, stmt); return; } /*---------------------------------------------------------------------- -- execute_statement - execute specified model statement. -- -- This routine executes specified model statement. */ void execute_statement(MPL *mpl, STATEMENT *stmt) { mpl->stmt = stmt; switch (stmt->type) { case A_SET: case A_PARAMETER: case A_VARIABLE: break; case A_CONSTRAINT: xprintf("Generating %s...\n", stmt->u.con->name); eval_whole_con(mpl, stmt->u.con); break; case A_TABLE: switch (stmt->u.tab->type) { case A_INPUT: xprintf("Reading %s...\n", stmt->u.tab->name); break; case A_OUTPUT: xprintf("Writing %s...\n", stmt->u.tab->name); break; default: xassert(stmt != stmt); } execute_table(mpl, stmt->u.tab); break; case A_SOLVE: break; case A_CHECK: xprintf("Checking (line %d)...\n", stmt->line); execute_check(mpl, stmt->u.chk); break; case A_DISPLAY: write_text(mpl, "Display statement at line %d\n", stmt->line); execute_display(mpl, stmt->u.dpy); break; case A_PRINTF: execute_printf(mpl, stmt->u.prt); break; case A_FOR: execute_for(mpl, stmt->u.fur); break; default: xassert(stmt != stmt); } return; } /*---------------------------------------------------------------------- -- clean_statement - clean specified model statement. -- -- This routine cleans specified model statement that assumes deleting -- all stuff dynamically allocated on generating/postsolving phase. */ void clean_statement(MPL *mpl, STATEMENT *stmt) { switch(stmt->type) { case A_SET: clean_set(mpl, stmt->u.set); break; case A_PARAMETER: clean_parameter(mpl, stmt->u.par); break; case A_VARIABLE: clean_variable(mpl, stmt->u.var); break; case A_CONSTRAINT: clean_constraint(mpl, stmt->u.con); break; #if 1 /* 11/II-2008 */ case A_TABLE: clean_table(mpl, stmt->u.tab); break; #endif case A_SOLVE: break; case A_CHECK: clean_check(mpl, stmt->u.chk); break; case A_DISPLAY: clean_display(mpl, stmt->u.dpy); break; case A_PRINTF: clean_printf(mpl, stmt->u.prt); break; case A_FOR: clean_for(mpl, stmt->u.fur); break; default: xassert(stmt != stmt); } return; } /* eof */ glpk-5.0/src/mpl/mpl4.c0000644000062000006210000013373413766346220014114 0ustar maomkpasswd/* mpl4.c */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2003-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "mpl.h" #define xfault xerror #define xfprintf glp_format #define dmp_create_poolx(size) dmp_create_pool() /**********************************************************************/ /* * * GENERATING AND POSTSOLVING MODEL * * */ /**********************************************************************/ /*---------------------------------------------------------------------- -- alloc_content - allocate content arrays for all model objects. -- -- This routine allocates content arrays for all existing model objects -- and thereby finalizes creating model. -- -- This routine must be called immediately after reading model section, -- i.e. before reading data section or generating model. */ void alloc_content(MPL *mpl) { STATEMENT *stmt; /* walk through all model statements */ for (stmt = mpl->model; stmt != NULL; stmt = stmt->next) { switch (stmt->type) { case A_SET: /* model set */ xassert(stmt->u.set->array == NULL); stmt->u.set->array = create_array(mpl, A_ELEMSET, stmt->u.set->dim); break; case A_PARAMETER: /* model parameter */ xassert(stmt->u.par->array == NULL); switch (stmt->u.par->type) { case A_NUMERIC: case A_INTEGER: case A_BINARY: stmt->u.par->array = create_array(mpl, A_NUMERIC, stmt->u.par->dim); break; case A_SYMBOLIC: stmt->u.par->array = create_array(mpl, A_SYMBOLIC, stmt->u.par->dim); break; default: xassert(stmt != stmt); } break; case A_VARIABLE: /* model variable */ xassert(stmt->u.var->array == NULL); stmt->u.var->array = create_array(mpl, A_ELEMVAR, stmt->u.var->dim); break; case A_CONSTRAINT: /* model constraint/objective */ xassert(stmt->u.con->array == NULL); stmt->u.con->array = create_array(mpl, A_ELEMCON, stmt->u.con->dim); break; #if 1 /* 11/II-2008 */ case A_TABLE: #endif case A_SOLVE: case A_CHECK: case A_DISPLAY: case A_PRINTF: case A_FOR: /* functional statements have no content array */ break; default: xassert(stmt != stmt); } } return; } /*---------------------------------------------------------------------- -- generate_model - generate model. -- -- This routine executes the model statements which precede the solve -- statement. */ void generate_model(MPL *mpl) { STATEMENT *stmt; xassert(!mpl->flag_p); for (stmt = mpl->model; stmt != NULL; stmt = stmt->next) { execute_statement(mpl, stmt); if (mpl->stmt->type == A_SOLVE) break; } mpl->stmt = stmt; return; } /*---------------------------------------------------------------------- -- build_problem - build problem instance. -- -- This routine builds lists of rows and columns for problem instance, -- which corresponds to the generated model. */ void build_problem(MPL *mpl) { STATEMENT *stmt; MEMBER *memb; VARIABLE *v; CONSTRAINT *c; FORMULA *t; int i, j; xassert(mpl->m == 0); xassert(mpl->n == 0); xassert(mpl->row == NULL); xassert(mpl->col == NULL); /* check that all elemental variables has zero column numbers */ for (stmt = mpl->model; stmt != NULL; stmt = stmt->next) { if (stmt->type == A_VARIABLE) { v = stmt->u.var; for (memb = v->array->head; memb != NULL; memb = memb->next) xassert(memb->value.var->j == 0); } } /* assign row numbers to elemental constraints and objectives */ for (stmt = mpl->model; stmt != NULL; stmt = stmt->next) { if (stmt->type == A_CONSTRAINT) { c = stmt->u.con; for (memb = c->array->head; memb != NULL; memb = memb->next) { xassert(memb->value.con->i == 0); memb->value.con->i = ++mpl->m; /* walk through linear form and mark elemental variables, which are referenced at least once */ for (t = memb->value.con->form; t != NULL; t = t->next) { xassert(t->var != NULL); t->var->memb->value.var->j = -1; } } } } /* assign column numbers to marked elemental variables */ for (stmt = mpl->model; stmt != NULL; stmt = stmt->next) { if (stmt->type == A_VARIABLE) { v = stmt->u.var; for (memb = v->array->head; memb != NULL; memb = memb->next) if (memb->value.var->j != 0) memb->value.var->j = ++mpl->n; } } /* build list of rows */ mpl->row = xcalloc(1+mpl->m, sizeof(ELEMCON *)); for (i = 1; i <= mpl->m; i++) mpl->row[i] = NULL; for (stmt = mpl->model; stmt != NULL; stmt = stmt->next) { if (stmt->type == A_CONSTRAINT) { c = stmt->u.con; for (memb = c->array->head; memb != NULL; memb = memb->next) { i = memb->value.con->i; xassert(1 <= i && i <= mpl->m); xassert(mpl->row[i] == NULL); mpl->row[i] = memb->value.con; } } } for (i = 1; i <= mpl->m; i++) xassert(mpl->row[i] != NULL); /* build list of columns */ mpl->col = xcalloc(1+mpl->n, sizeof(ELEMVAR *)); for (j = 1; j <= mpl->n; j++) mpl->col[j] = NULL; for (stmt = mpl->model; stmt != NULL; stmt = stmt->next) { if (stmt->type == A_VARIABLE) { v = stmt->u.var; for (memb = v->array->head; memb != NULL; memb = memb->next) { j = memb->value.var->j; if (j == 0) continue; xassert(1 <= j && j <= mpl->n); xassert(mpl->col[j] == NULL); mpl->col[j] = memb->value.var; } } } for (j = 1; j <= mpl->n; j++) xassert(mpl->col[j] != NULL); return; } /*---------------------------------------------------------------------- -- postsolve_model - postsolve model. -- -- This routine executes the model statements which follow the solve -- statement. */ void postsolve_model(MPL *mpl) { STATEMENT *stmt; xassert(!mpl->flag_p); mpl->flag_p = 1; for (stmt = mpl->stmt; stmt != NULL; stmt = stmt->next) execute_statement(mpl, stmt); mpl->stmt = NULL; return; } /*---------------------------------------------------------------------- -- clean_model - clean model content. -- -- This routine cleans the model content that assumes deleting all stuff -- dynamically allocated on generating/postsolving phase. -- -- Actually cleaning model content is not needed. This function is used -- mainly to be sure that there were no logical errors on using dynamic -- memory pools during the generation phase. -- -- NOTE: This routine must not be called if any errors were detected on -- the generation phase. */ void clean_model(MPL *mpl) { STATEMENT *stmt; for (stmt = mpl->model; stmt != NULL; stmt = stmt->next) clean_statement(mpl, stmt); /* check that all atoms have been returned to their pools */ if (dmp_in_use(mpl->strings) != 0) error(mpl, "internal logic error: %d string segment(s) were lo" "st", dmp_in_use(mpl->strings)); if (dmp_in_use(mpl->symbols) != 0) error(mpl, "internal logic error: %d symbol(s) were lost", dmp_in_use(mpl->symbols)); if (dmp_in_use(mpl->tuples) != 0) error(mpl, "internal logic error: %d n-tuple component(s) were" " lost", dmp_in_use(mpl->tuples)); if (dmp_in_use(mpl->arrays) != 0) error(mpl, "internal logic error: %d array(s) were lost", dmp_in_use(mpl->arrays)); if (dmp_in_use(mpl->members) != 0) error(mpl, "internal logic error: %d array member(s) were lost" , dmp_in_use(mpl->members)); if (dmp_in_use(mpl->elemvars) != 0) error(mpl, "internal logic error: %d elemental variable(s) wer" "e lost", dmp_in_use(mpl->elemvars)); if (dmp_in_use(mpl->formulae) != 0) error(mpl, "internal logic error: %d linear term(s) were lost", dmp_in_use(mpl->formulae)); if (dmp_in_use(mpl->elemcons) != 0) error(mpl, "internal logic error: %d elemental constraint(s) w" "ere lost", dmp_in_use(mpl->elemcons)); return; } /**********************************************************************/ /* * * INPUT/OUTPUT * * */ /**********************************************************************/ /*---------------------------------------------------------------------- -- open_input - open input text file. -- -- This routine opens the input text file for scanning. */ void open_input(MPL *mpl, char *file) { mpl->line = 0; mpl->c = '\n'; mpl->token = 0; mpl->imlen = 0; mpl->image[0] = '\0'; mpl->value = 0.0; mpl->b_token = T_EOF; mpl->b_imlen = 0; mpl->b_image[0] = '\0'; mpl->b_value = 0.0; mpl->f_dots = 0; mpl->f_scan = 0; mpl->f_token = 0; mpl->f_imlen = 0; mpl->f_image[0] = '\0'; mpl->f_value = 0.0; memset(mpl->context, ' ', CONTEXT_SIZE); mpl->c_ptr = 0; xassert(mpl->in_fp == NULL); mpl->in_fp = glp_open(file, "r"); if (mpl->in_fp == NULL) error(mpl, "unable to open %s - %s", file, get_err_msg()); mpl->in_file = file; /* scan the very first character */ get_char(mpl); /* scan the very first token */ get_token(mpl); return; } /*---------------------------------------------------------------------- -- read_char - read next character from input text file. -- -- This routine returns a next ASCII character read from the input text -- file. If the end of file has been reached, EOF is returned. */ int read_char(MPL *mpl) { int c; xassert(mpl->in_fp != NULL); c = glp_getc(mpl->in_fp); if (c < 0) { if (glp_ioerr(mpl->in_fp)) error(mpl, "read error on %s - %s", mpl->in_file, get_err_msg()); c = EOF; } return c; } /*---------------------------------------------------------------------- -- close_input - close input text file. -- -- This routine closes the input text file. */ void close_input(MPL *mpl) { xassert(mpl->in_fp != NULL); glp_close(mpl->in_fp); mpl->in_fp = NULL; mpl->in_file = NULL; return; } /*---------------------------------------------------------------------- -- open_output - open output text file. -- -- This routine opens the output text file for writing data produced by -- display and printf statements. */ void open_output(MPL *mpl, char *file) { xassert(mpl->out_fp == NULL); if (file == NULL) { file = ""; mpl->out_fp = (void *)stdout; } else { mpl->out_fp = glp_open(file, "w"); if (mpl->out_fp == NULL) error(mpl, "unable to create %s - %s", file, get_err_msg()); } mpl->out_file = xmalloc(strlen(file)+1); strcpy(mpl->out_file, file); return; } /*---------------------------------------------------------------------- -- write_char - write next character to output text file. -- -- This routine writes an ASCII character to the output text file. */ void write_char(MPL *mpl, int c) { xassert(mpl->out_fp != NULL); if (mpl->out_fp == (void *)stdout) xprintf("%c", c); else xfprintf(mpl->out_fp, "%c", c); return; } /*---------------------------------------------------------------------- -- write_text - format and write text to output text file. -- -- This routine formats a text using the format control string and then -- writes this text to the output text file. */ void write_text(MPL *mpl, char *fmt, ...) { va_list arg; char buf[OUTBUF_SIZE], *c; va_start(arg, fmt); vsprintf(buf, fmt, arg); xassert(strlen(buf) < sizeof(buf)); va_end(arg); for (c = buf; *c != '\0'; c++) write_char(mpl, *c); return; } /*---------------------------------------------------------------------- -- flush_output - finalize writing data to output text file. -- -- This routine finalizes writing data to the output text file. */ void flush_output(MPL *mpl) { xassert(mpl->out_fp != NULL); if (mpl->out_fp != (void *)stdout) { #if 0 /* FIXME */ xfflush(mpl->out_fp); #endif if (glp_ioerr(mpl->out_fp)) error(mpl, "write error on %s - %s", mpl->out_file, get_err_msg()); } return; } /**********************************************************************/ /* * * SOLVER INTERFACE * * */ /**********************************************************************/ /*---------------------------------------------------------------------- -- error - print error message and terminate model processing. -- -- This routine formats and prints an error message and then terminates -- model processing. */ void error(MPL *mpl, char *fmt, ...) { va_list arg; char msg[4095+1]; va_start(arg, fmt); vsprintf(msg, fmt, arg); xassert(strlen(msg) < sizeof(msg)); va_end(arg); switch (mpl->phase) { case 1: case 2: /* translation phase */ xprintf("%s:%d: %s\n", mpl->in_file == NULL ? "(unknown)" : mpl->in_file, mpl->line, msg); print_context(mpl); break; case 3: /* generation/postsolve phase */ xprintf("%s:%d: %s\n", mpl->mod_file == NULL ? "(unknown)" : mpl->mod_file, mpl->stmt == NULL ? 0 : mpl->stmt->line, msg); break; default: xassert(mpl != mpl); } mpl->phase = 4; longjmp(mpl->jump, 1); /* no return */ } /*---------------------------------------------------------------------- -- warning - print warning message and continue model processing. -- -- This routine formats and prints a warning message and returns to the -- calling program. */ void warning(MPL *mpl, char *fmt, ...) { va_list arg; char msg[4095+1]; va_start(arg, fmt); vsprintf(msg, fmt, arg); xassert(strlen(msg) < sizeof(msg)); va_end(arg); switch (mpl->phase) { case 1: case 2: /* translation phase */ xprintf("%s:%d: warning: %s\n", mpl->in_file == NULL ? "(unknown)" : mpl->in_file, mpl->line, msg); break; case 3: /* generation/postsolve phase */ xprintf("%s:%d: warning: %s\n", mpl->mod_file == NULL ? "(unknown)" : mpl->mod_file, mpl->stmt == NULL ? 0 : mpl->stmt->line, msg); break; default: xassert(mpl != mpl); } return; } /*---------------------------------------------------------------------- -- mpl_initialize - create and initialize translator database. -- -- *Synopsis* -- -- #include "glpmpl.h" -- MPL *mpl_initialize(void); -- -- *Description* -- -- The routine mpl_initialize creates and initializes the database used -- by the GNU MathProg translator. -- -- *Returns* -- -- The routine returns a pointer to the database created. */ MPL *mpl_initialize(void) { MPL *mpl; mpl = xmalloc(sizeof(MPL)); /* scanning segment */ mpl->line = 0; mpl->c = 0; mpl->token = 0; mpl->imlen = 0; mpl->image = xcalloc(MAX_LENGTH+1, sizeof(char)); mpl->image[0] = '\0'; mpl->value = 0.0; mpl->b_token = 0; mpl->b_imlen = 0; mpl->b_image = xcalloc(MAX_LENGTH+1, sizeof(char)); mpl->b_image[0] = '\0'; mpl->b_value = 0.0; mpl->f_dots = 0; mpl->f_scan = 0; mpl->f_token = 0; mpl->f_imlen = 0; mpl->f_image = xcalloc(MAX_LENGTH+1, sizeof(char)); mpl->f_image[0] = '\0'; mpl->f_value = 0.0; mpl->context = xcalloc(CONTEXT_SIZE, sizeof(char)); memset(mpl->context, ' ', CONTEXT_SIZE); mpl->c_ptr = 0; mpl->flag_d = 0; /* translating segment */ mpl->pool = dmp_create_poolx(0); mpl->tree = avl_create_tree(avl_strcmp, NULL); mpl->model = NULL; mpl->flag_x = 0; mpl->as_within = 0; mpl->as_in = 0; mpl->as_binary = 0; mpl->flag_s = 0; /* common segment */ mpl->strings = dmp_create_poolx(sizeof(STRING)); mpl->symbols = dmp_create_poolx(sizeof(SYMBOL)); mpl->tuples = dmp_create_poolx(sizeof(TUPLE)); mpl->arrays = dmp_create_poolx(sizeof(ARRAY)); mpl->members = dmp_create_poolx(sizeof(MEMBER)); mpl->elemvars = dmp_create_poolx(sizeof(ELEMVAR)); mpl->formulae = dmp_create_poolx(sizeof(FORMULA)); mpl->elemcons = dmp_create_poolx(sizeof(ELEMCON)); mpl->a_list = NULL; mpl->sym_buf = xcalloc(255+1, sizeof(char)); mpl->sym_buf[0] = '\0'; mpl->tup_buf = xcalloc(255+1, sizeof(char)); mpl->tup_buf[0] = '\0'; /* generating/postsolving segment */ mpl->rand = rng_create_rand(); mpl->flag_p = 0; mpl->stmt = NULL; #if 1 /* 11/II-2008 */ mpl->dca = NULL; #endif mpl->m = 0; mpl->n = 0; mpl->row = NULL; mpl->col = NULL; /* input/output segment */ mpl->in_fp = NULL; mpl->in_file = NULL; mpl->out_fp = NULL; mpl->out_file = NULL; mpl->prt_fp = NULL; mpl->prt_file = NULL; /* solver interface segment */ if (setjmp(mpl->jump)) xassert(mpl != mpl); mpl->phase = 0; mpl->mod_file = NULL; mpl->mpl_buf = xcalloc(255+1, sizeof(char)); mpl->mpl_buf[0] = '\0'; return mpl; } /*---------------------------------------------------------------------- -- mpl_read_model - read model section and optional data section. -- -- *Synopsis* -- -- #include "glpmpl.h" -- int mpl_read_model(MPL *mpl, char *file, int skip_data); -- -- *Description* -- -- The routine mpl_read_model reads model section and optionally data -- section, which may follow the model section, from the text file, -- whose name is the character string file, performs translating model -- statements and data blocks, and stores all the information in the -- translator database. -- -- The parameter skip_data is a flag. If the input file contains the -- data section and this flag is set, the data section is not read as -- if there were no data section and a warning message is issued. This -- allows reading the data section from another input file. -- -- This routine should be called once after the routine mpl_initialize -- and before other API routines. -- -- *Returns* -- -- The routine mpl_read_model returns one the following codes: -- -- 1 - translation successful. The input text file contains only model -- section. In this case the calling program may call the routine -- mpl_read_data to read data section from another file. -- 2 - translation successful. The input text file contains both model -- and data section. -- 4 - processing failed due to some errors. In this case the calling -- program should call the routine mpl_terminate to terminate model -- processing. */ int mpl_read_model(MPL *mpl, char *file, int skip_data) { if (mpl->phase != 0) xfault("mpl_read_model: invalid call sequence\n"); if (file == NULL) xfault("mpl_read_model: no input filename specified\n"); /* set up error handler */ if (setjmp(mpl->jump)) goto done; /* translate model section */ mpl->phase = 1; xprintf("Reading model section from %s...\n", file); open_input(mpl, file); model_section(mpl); if (mpl->model == NULL) error(mpl, "empty model section not allowed"); /* save name of the input text file containing model section for error diagnostics during the generation phase */ mpl->mod_file = xcalloc(strlen(file)+1, sizeof(char)); strcpy(mpl->mod_file, mpl->in_file); /* allocate content arrays for all model objects */ alloc_content(mpl); /* optional data section may begin with the keyword 'data' */ if (is_keyword(mpl, "data")) { if (skip_data) { warning(mpl, "data section ignored"); goto skip; } mpl->flag_d = 1; get_token(mpl /* data */); if (mpl->token != T_SEMICOLON) error(mpl, "semicolon missing where expected"); get_token(mpl /* ; */); /* translate data section */ mpl->phase = 2; xprintf("Reading data section from %s...\n", file); data_section(mpl); } /* process end statement */ end_statement(mpl); skip: xprintf("%d line%s were read\n", mpl->line, mpl->line == 1 ? "" : "s"); close_input(mpl); done: /* return to the calling program */ return mpl->phase; } /*---------------------------------------------------------------------- -- mpl_read_data - read data section. -- -- *Synopsis* -- -- #include "glpmpl.h" -- int mpl_read_data(MPL *mpl, char *file); -- -- *Description* -- -- The routine mpl_read_data reads data section from the text file, -- whose name is the character string file, performs translating data -- blocks, and stores the data read in the translator database. -- -- If this routine is used, it should be called once after the routine -- mpl_read_model and if the latter returned the code 1. -- -- *Returns* -- -- The routine mpl_read_data returns one of the following codes: -- -- 2 - data section has been successfully processed. -- 4 - processing failed due to some errors. In this case the calling -- program should call the routine mpl_terminate to terminate model -- processing. */ int mpl_read_data(MPL *mpl, char *file) #if 0 /* 02/X-2008 */ { if (mpl->phase != 1) #else { if (!(mpl->phase == 1 || mpl->phase == 2)) #endif xfault("mpl_read_data: invalid call sequence\n"); if (file == NULL) xfault("mpl_read_data: no input filename specified\n"); /* set up error handler */ if (setjmp(mpl->jump)) goto done; /* process data section */ mpl->phase = 2; xprintf("Reading data section from %s...\n", file); mpl->flag_d = 1; open_input(mpl, file); /* in this case the keyword 'data' is optional */ if (is_literal(mpl, "data")) { get_token(mpl /* data */); if (mpl->token != T_SEMICOLON) error(mpl, "semicolon missing where expected"); get_token(mpl /* ; */); } data_section(mpl); /* process end statement */ end_statement(mpl); xprintf("%d line%s were read\n", mpl->line, mpl->line == 1 ? "" : "s"); close_input(mpl); done: /* return to the calling program */ return mpl->phase; } /*---------------------------------------------------------------------- -- mpl_generate - generate model. -- -- *Synopsis* -- -- #include "glpmpl.h" -- int mpl_generate(MPL *mpl, char *file); -- -- *Description* -- -- The routine mpl_generate generates the model using its description -- stored in the translator database. This phase means generating all -- variables, constraints, and objectives, executing check and display -- statements, which precede the solve statement (if it is presented), -- and building the problem instance. -- -- The character string file specifies the name of output text file, to -- which output produced by display statements should be written. It is -- allowed to specify NULL, in which case the output goes to stdout via -- the routine print. -- -- This routine should be called once after the routine mpl_read_model -- or mpl_read_data and if one of the latters returned the code 2. -- -- *Returns* -- -- The routine mpl_generate returns one of the following codes: -- -- 3 - model has been successfully generated. In this case the calling -- program may call other api routines to obtain components of the -- problem instance from the translator database. -- 4 - processing failed due to some errors. In this case the calling -- program should call the routine mpl_terminate to terminate model -- processing. */ int mpl_generate(MPL *mpl, char *file) { if (!(mpl->phase == 1 || mpl->phase == 2)) xfault("mpl_generate: invalid call sequence\n"); /* set up error handler */ if (setjmp(mpl->jump)) goto done; /* generate model */ mpl->phase = 3; open_output(mpl, file); generate_model(mpl); flush_output(mpl); /* build problem instance */ build_problem(mpl); /* generation phase has been finished */ xprintf("Model has been successfully generated\n"); done: /* return to the calling program */ return mpl->phase; } /*---------------------------------------------------------------------- -- mpl_get_prob_name - obtain problem (model) name. -- -- *Synopsis* -- -- #include "glpmpl.h" -- char *mpl_get_prob_name(MPL *mpl); -- -- *Returns* -- -- The routine mpl_get_prob_name returns a pointer to internal buffer, -- which contains symbolic name of the problem (model). -- -- *Note* -- -- Currently MathProg has no feature to assign a symbolic name to the -- model. Therefore the routine mpl_get_prob_name tries to construct -- such name using the name of input text file containing model section, -- although this is not a good idea (due to portability problems). */ char *mpl_get_prob_name(MPL *mpl) { char *name = mpl->mpl_buf; char *file = mpl->mod_file; int k; if (mpl->phase != 3) xfault("mpl_get_prob_name: invalid call sequence\n"); for (;;) { if (strchr(file, '/') != NULL) file = strchr(file, '/') + 1; else if (strchr(file, '\\') != NULL) file = strchr(file, '\\') + 1; else if (strchr(file, ':') != NULL) file = strchr(file, ':') + 1; else break; } for (k = 0; ; k++) { if (k == 255) break; if (!(isalnum((unsigned char)*file) || *file == '_')) break; name[k] = *file++; } if (k == 0) strcpy(name, "Unknown"); else name[k] = '\0'; xassert(strlen(name) <= 255); return name; } /*---------------------------------------------------------------------- -- mpl_get_num_rows - determine number of rows. -- -- *Synopsis* -- -- #include "glpmpl.h" -- int mpl_get_num_rows(MPL *mpl); -- -- *Returns* -- -- The routine mpl_get_num_rows returns total number of rows in the -- problem, where each row is an individual constraint or objective. */ int mpl_get_num_rows(MPL *mpl) { if (mpl->phase != 3) xfault("mpl_get_num_rows: invalid call sequence\n"); return mpl->m; } /*---------------------------------------------------------------------- -- mpl_get_num_cols - determine number of columns. -- -- *Synopsis* -- -- #include "glpmpl.h" -- int mpl_get_num_cols(MPL *mpl); -- -- *Returns* -- -- The routine mpl_get_num_cols returns total number of columns in the -- problem, where each column is an individual variable. */ int mpl_get_num_cols(MPL *mpl) { if (mpl->phase != 3) xfault("mpl_get_num_cols: invalid call sequence\n"); return mpl->n; } /*---------------------------------------------------------------------- -- mpl_get_row_name - obtain row name. -- -- *Synopsis* -- -- #include "glpmpl.h" -- char *mpl_get_row_name(MPL *mpl, int i); -- -- *Returns* -- -- The routine mpl_get_row_name returns a pointer to internal buffer, -- which contains symbolic name of i-th row of the problem. */ char *mpl_get_row_name(MPL *mpl, int i) { char *name = mpl->mpl_buf, *t; int len; if (mpl->phase != 3) xfault("mpl_get_row_name: invalid call sequence\n"); if (!(1 <= i && i <= mpl->m)) xfault("mpl_get_row_name: i = %d; row number out of range\n", i); strcpy(name, mpl->row[i]->con->name); len = strlen(name); xassert(len <= 255); t = format_tuple(mpl, '[', mpl->row[i]->memb->tuple); while (*t) { if (len == 255) break; name[len++] = *t++; } name[len] = '\0'; if (len == 255) strcpy(name+252, "..."); xassert(strlen(name) <= 255); return name; } /*---------------------------------------------------------------------- -- mpl_get_row_kind - determine row kind. -- -- *Synopsis* -- -- #include "glpmpl.h" -- int mpl_get_row_kind(MPL *mpl, int i); -- -- *Returns* -- -- The routine mpl_get_row_kind returns the kind of i-th row, which can -- be one of the following: -- -- MPL_ST - non-free (constraint) row; -- MPL_MIN - free (objective) row to be minimized; -- MPL_MAX - free (objective) row to be maximized. */ int mpl_get_row_kind(MPL *mpl, int i) { int kind; if (mpl->phase != 3) xfault("mpl_get_row_kind: invalid call sequence\n"); if (!(1 <= i && i <= mpl->m)) xfault("mpl_get_row_kind: i = %d; row number out of range\n", i); switch (mpl->row[i]->con->type) { case A_CONSTRAINT: kind = MPL_ST; break; case A_MINIMIZE: kind = MPL_MIN; break; case A_MAXIMIZE: kind = MPL_MAX; break; default: xassert(mpl != mpl); } return kind; } /*---------------------------------------------------------------------- -- mpl_get_row_bnds - obtain row bounds. -- -- *Synopsis* -- -- #include "glpmpl.h" -- int mpl_get_row_bnds(MPL *mpl, int i, double *lb, double *ub); -- -- *Description* -- -- The routine mpl_get_row_bnds stores lower and upper bounds of i-th -- row of the problem to the locations, which the parameters lb and ub -- point to, respectively. Besides the routine returns the type of the -- i-th row. -- -- If some of the parameters lb and ub is NULL, the corresponding bound -- value is not stored. -- -- Types and bounds have the following meaning: -- -- Type Bounds Note -- ----------------------------------------------------------- -- MPL_FR -inf < f(x) < +inf Free linear form -- MPL_LO lb <= f(x) < +inf Inequality f(x) >= lb -- MPL_UP -inf < f(x) <= ub Inequality f(x) <= ub -- MPL_DB lb <= f(x) <= ub Inequality lb <= f(x) <= ub -- MPL_FX f(x) = lb Equality f(x) = lb -- -- where f(x) is the corresponding linear form of the i-th row. -- -- If the row has no lower bound, *lb is set to zero; if the row has -- no upper bound, *ub is set to zero; and if the row is of fixed type, -- both *lb and *ub are set to the same value. -- -- *Returns* -- -- The routine returns the type of the i-th row as it is stated in the -- table above. */ int mpl_get_row_bnds(MPL *mpl, int i, double *_lb, double *_ub) { ELEMCON *con; int type; double lb, ub; if (mpl->phase != 3) xfault("mpl_get_row_bnds: invalid call sequence\n"); if (!(1 <= i && i <= mpl->m)) xfault("mpl_get_row_bnds: i = %d; row number out of range\n", i); con = mpl->row[i]; #if 0 /* 21/VII-2006 */ if (con->con->lbnd == NULL && con->con->ubnd == NULL) type = MPL_FR, lb = ub = 0.0; else if (con->con->ubnd == NULL) type = MPL_LO, lb = con->lbnd, ub = 0.0; else if (con->con->lbnd == NULL) type = MPL_UP, lb = 0.0, ub = con->ubnd; else if (con->con->lbnd != con->con->ubnd) type = MPL_DB, lb = con->lbnd, ub = con->ubnd; else type = MPL_FX, lb = ub = con->lbnd; #else lb = (con->con->lbnd == NULL ? -DBL_MAX : con->lbnd); ub = (con->con->ubnd == NULL ? +DBL_MAX : con->ubnd); if (lb == -DBL_MAX && ub == +DBL_MAX) type = MPL_FR, lb = ub = 0.0; else if (ub == +DBL_MAX) type = MPL_LO, ub = 0.0; else if (lb == -DBL_MAX) type = MPL_UP, lb = 0.0; else if (con->con->lbnd != con->con->ubnd) type = MPL_DB; else type = MPL_FX; #endif if (_lb != NULL) *_lb = lb; if (_ub != NULL) *_ub = ub; return type; } /*---------------------------------------------------------------------- -- mpl_get_mat_row - obtain row of the constraint matrix. -- -- *Synopsis* -- -- #include "glpmpl.h" -- int mpl_get_mat_row(MPL *mpl, int i, int ndx[], double val[]); -- -- *Description* -- -- The routine mpl_get_mat_row stores column indices and numeric values -- of constraint coefficients for the i-th row to locations ndx[1], ..., -- ndx[len] and val[1], ..., val[len], respectively, where 0 <= len <= n -- is number of (structural) non-zero constraint coefficients, and n is -- number of columns in the problem. -- -- If the parameter ndx is NULL, column indices are not stored. If the -- parameter val is NULL, numeric values are not stored. -- -- Note that free rows may have constant terms, which are not part of -- the constraint matrix and therefore not reported by this routine. The -- constant term of a particular row can be obtained, if necessary, via -- the routine mpl_get_row_c0. -- -- *Returns* -- -- The routine mpl_get_mat_row returns len, which is length of i-th row -- of the constraint matrix (i.e. number of non-zero coefficients). */ int mpl_get_mat_row(MPL *mpl, int i, int ndx[], double val[]) { FORMULA *term; int len = 0; if (mpl->phase != 3) xfault("mpl_get_mat_row: invalid call sequence\n"); if (!(1 <= i && i <= mpl->m)) xfault("mpl_get_mat_row: i = %d; row number out of range\n", i); for (term = mpl->row[i]->form; term != NULL; term = term->next) { xassert(term->var != NULL); len++; xassert(len <= mpl->n); if (ndx != NULL) ndx[len] = term->var->j; if (val != NULL) val[len] = term->coef; } return len; } /*---------------------------------------------------------------------- -- mpl_get_row_c0 - obtain constant term of free row. -- -- *Synopsis* -- -- #include "glpmpl.h" -- double mpl_get_row_c0(MPL *mpl, int i); -- -- *Returns* -- -- The routine mpl_get_row_c0 returns numeric value of constant term of -- i-th row. -- -- Note that only free rows may have non-zero constant terms. Therefore -- if i-th row is not free, the routine returns zero. */ double mpl_get_row_c0(MPL *mpl, int i) { ELEMCON *con; double c0; if (mpl->phase != 3) xfault("mpl_get_row_c0: invalid call sequence\n"); if (!(1 <= i && i <= mpl->m)) xfault("mpl_get_row_c0: i = %d; row number out of range\n", i); con = mpl->row[i]; if (con->con->lbnd == NULL && con->con->ubnd == NULL) c0 = - con->lbnd; else c0 = 0.0; return c0; } /*---------------------------------------------------------------------- -- mpl_get_col_name - obtain column name. -- -- *Synopsis* -- -- #include "glpmpl.h" -- char *mpl_get_col_name(MPL *mpl, int j); -- -- *Returns* -- -- The routine mpl_get_col_name returns a pointer to internal buffer, -- which contains symbolic name of j-th column of the problem. */ char *mpl_get_col_name(MPL *mpl, int j) { char *name = mpl->mpl_buf, *t; int len; if (mpl->phase != 3) xfault("mpl_get_col_name: invalid call sequence\n"); if (!(1 <= j && j <= mpl->n)) xfault("mpl_get_col_name: j = %d; column number out of range\n" , j); strcpy(name, mpl->col[j]->var->name); len = strlen(name); xassert(len <= 255); t = format_tuple(mpl, '[', mpl->col[j]->memb->tuple); while (*t) { if (len == 255) break; name[len++] = *t++; } name[len] = '\0'; if (len == 255) strcpy(name+252, "..."); xassert(strlen(name) <= 255); return name; } /*---------------------------------------------------------------------- -- mpl_get_col_kind - determine column kind. -- -- *Synopsis* -- -- #include "glpmpl.h" -- int mpl_get_col_kind(MPL *mpl, int j); -- -- *Returns* -- -- The routine mpl_get_col_kind returns the kind of j-th column, which -- can be one of the following: -- -- MPL_NUM - continuous variable; -- MPL_INT - integer variable; -- MPL_BIN - binary variable. -- -- Note that column kinds are defined independently on type and bounds -- (reported by the routine mpl_get_col_bnds) of corresponding columns. -- This means, in particular, that bounds of an integer column may be -- fractional, or a binary column may have lower and upper bounds that -- are not 0 and 1 (or it may have no lower/upper bound at all). */ int mpl_get_col_kind(MPL *mpl, int j) { int kind; if (mpl->phase != 3) xfault("mpl_get_col_kind: invalid call sequence\n"); if (!(1 <= j && j <= mpl->n)) xfault("mpl_get_col_kind: j = %d; column number out of range\n" , j); switch (mpl->col[j]->var->type) { case A_NUMERIC: kind = MPL_NUM; break; case A_INTEGER: kind = MPL_INT; break; case A_BINARY: kind = MPL_BIN; break; default: xassert(mpl != mpl); } return kind; } /*---------------------------------------------------------------------- -- mpl_get_col_bnds - obtain column bounds. -- -- *Synopsis* -- -- #include "glpmpl.h" -- int mpl_get_col_bnds(MPL *mpl, int j, double *lb, double *ub); -- -- *Description* -- -- The routine mpl_get_col_bnds stores lower and upper bound of j-th -- column of the problem to the locations, which the parameters lb and -- ub point to, respectively. Besides the routine returns the type of -- the j-th column. -- -- If some of the parameters lb and ub is NULL, the corresponding bound -- value is not stored. -- -- Types and bounds have the following meaning: -- -- Type Bounds Note -- ------------------------------------------------------ -- MPL_FR -inf < x < +inf Free (unbounded) variable -- MPL_LO lb <= x < +inf Variable with lower bound -- MPL_UP -inf < x <= ub Variable with upper bound -- MPL_DB lb <= x <= ub Double-bounded variable -- MPL_FX x = lb Fixed variable -- -- where x is individual variable corresponding to the j-th column. -- -- If the column has no lower bound, *lb is set to zero; if the column -- has no upper bound, *ub is set to zero; and if the column is of fixed -- type, both *lb and *ub are set to the same value. -- -- *Returns* -- -- The routine returns the type of the j-th column as it is stated in -- the table above. */ int mpl_get_col_bnds(MPL *mpl, int j, double *_lb, double *_ub) { ELEMVAR *var; int type; double lb, ub; if (mpl->phase != 3) xfault("mpl_get_col_bnds: invalid call sequence\n"); if (!(1 <= j && j <= mpl->n)) xfault("mpl_get_col_bnds: j = %d; column number out of range\n" , j); var = mpl->col[j]; #if 0 /* 21/VII-2006 */ if (var->var->lbnd == NULL && var->var->ubnd == NULL) type = MPL_FR, lb = ub = 0.0; else if (var->var->ubnd == NULL) type = MPL_LO, lb = var->lbnd, ub = 0.0; else if (var->var->lbnd == NULL) type = MPL_UP, lb = 0.0, ub = var->ubnd; else if (var->var->lbnd != var->var->ubnd) type = MPL_DB, lb = var->lbnd, ub = var->ubnd; else type = MPL_FX, lb = ub = var->lbnd; #else lb = (var->var->lbnd == NULL ? -DBL_MAX : var->lbnd); ub = (var->var->ubnd == NULL ? +DBL_MAX : var->ubnd); if (lb == -DBL_MAX && ub == +DBL_MAX) type = MPL_FR, lb = ub = 0.0; else if (ub == +DBL_MAX) type = MPL_LO, ub = 0.0; else if (lb == -DBL_MAX) type = MPL_UP, lb = 0.0; else if (var->var->lbnd != var->var->ubnd) type = MPL_DB; else type = MPL_FX; #endif if (_lb != NULL) *_lb = lb; if (_ub != NULL) *_ub = ub; return type; } /*---------------------------------------------------------------------- -- mpl_has_solve_stmt - check if model has solve statement. -- -- *Synopsis* -- -- #include "glpmpl.h" -- int mpl_has_solve_stmt(MPL *mpl); -- -- *Returns* -- -- If the model has the solve statement, the routine returns non-zero, -- otherwise zero is returned. */ int mpl_has_solve_stmt(MPL *mpl) { if (mpl->phase != 3) xfault("mpl_has_solve_stmt: invalid call sequence\n"); return mpl->flag_s; } #if 1 /* 15/V-2010 */ void mpl_put_row_soln(MPL *mpl, int i, int stat, double prim, double dual) { /* store row (constraint/objective) solution components */ xassert(mpl->phase == 3); xassert(1 <= i && i <= mpl->m); mpl->row[i]->stat = stat; mpl->row[i]->prim = prim; mpl->row[i]->dual = dual; return; } #endif #if 1 /* 15/V-2010 */ void mpl_put_col_soln(MPL *mpl, int j, int stat, double prim, double dual) { /* store column (variable) solution components */ xassert(mpl->phase == 3); xassert(1 <= j && j <= mpl->n); mpl->col[j]->stat = stat; mpl->col[j]->prim = prim; mpl->col[j]->dual = dual; return; } #endif #if 0 /* 15/V-2010 */ /*---------------------------------------------------------------------- -- mpl_put_col_value - store column value. -- -- *Synopsis* -- -- #include "glpmpl.h" -- void mpl_put_col_value(MPL *mpl, int j, double val); -- -- *Description* -- -- The routine mpl_put_col_value stores numeric value of j-th column -- into the translator database. It is assumed that the column value is -- provided by the solver. */ void mpl_put_col_value(MPL *mpl, int j, double val) { if (mpl->phase != 3) xfault("mpl_put_col_value: invalid call sequence\n"); if (!(1 <= j && j <= mpl->n)) xfault( "mpl_put_col_value: j = %d; column number out of range\n", j); mpl->col[j]->prim = val; return; } #endif /*---------------------------------------------------------------------- -- mpl_postsolve - postsolve model. -- -- *Synopsis* -- -- #include "glpmpl.h" -- int mpl_postsolve(MPL *mpl); -- -- *Description* -- -- The routine mpl_postsolve performs postsolving of the model using -- its description stored in the translator database. This phase means -- executing statements, which follow the solve statement. -- -- If this routine is used, it should be called once after the routine -- mpl_generate and if the latter returned the code 3. -- -- *Returns* -- -- The routine mpl_postsolve returns one of the following codes: -- -- 3 - model has been successfully postsolved. -- 4 - processing failed due to some errors. In this case the calling -- program should call the routine mpl_terminate to terminate model -- processing. */ int mpl_postsolve(MPL *mpl) { if (!(mpl->phase == 3 && !mpl->flag_p)) xfault("mpl_postsolve: invalid call sequence\n"); /* set up error handler */ if (setjmp(mpl->jump)) goto done; /* perform postsolving */ postsolve_model(mpl); flush_output(mpl); /* postsolving phase has been finished */ xprintf("Model has been successfully processed\n"); done: /* return to the calling program */ return mpl->phase; } /*---------------------------------------------------------------------- -- mpl_terminate - free all resources used by translator. -- -- *Synopsis* -- -- #include "glpmpl.h" -- void mpl_terminate(MPL *mpl); -- -- *Description* -- -- The routine mpl_terminate frees all the resources used by the GNU -- MathProg translator. */ void mpl_terminate(MPL *mpl) { if (setjmp(mpl->jump)) xassert(mpl != mpl); switch (mpl->phase) { case 0: case 1: case 2: case 3: /* there were no errors; clean the model content */ clean_model(mpl); xassert(mpl->a_list == NULL); #if 1 /* 11/II-2008 */ xassert(mpl->dca == NULL); #endif break; case 4: /* model processing has been finished due to error; delete search trees, which may be created for some arrays */ { ARRAY *a; for (a = mpl->a_list; a != NULL; a = a->next) if (a->tree != NULL) avl_delete_tree(a->tree); } #if 1 /* 11/II-2008 */ free_dca(mpl); #endif break; default: xassert(mpl != mpl); } /* delete the translator database */ xfree(mpl->image); xfree(mpl->b_image); xfree(mpl->f_image); xfree(mpl->context); dmp_delete_pool(mpl->pool); avl_delete_tree(mpl->tree); dmp_delete_pool(mpl->strings); dmp_delete_pool(mpl->symbols); dmp_delete_pool(mpl->tuples); dmp_delete_pool(mpl->arrays); dmp_delete_pool(mpl->members); dmp_delete_pool(mpl->elemvars); dmp_delete_pool(mpl->formulae); dmp_delete_pool(mpl->elemcons); xfree(mpl->sym_buf); xfree(mpl->tup_buf); rng_delete_rand(mpl->rand); if (mpl->row != NULL) xfree(mpl->row); if (mpl->col != NULL) xfree(mpl->col); if (mpl->in_fp != NULL) glp_close(mpl->in_fp); if (mpl->out_fp != NULL && mpl->out_fp != (void *)stdout) glp_close(mpl->out_fp); if (mpl->out_file != NULL) xfree(mpl->out_file); if (mpl->prt_fp != NULL) glp_close(mpl->prt_fp); if (mpl->prt_file != NULL) xfree(mpl->prt_file); if (mpl->mod_file != NULL) xfree(mpl->mod_file); xfree(mpl->mpl_buf); xfree(mpl); return; } /* eof */ glpk-5.0/src/mpl/mpl5.c0000644000062000006210000005313713766346220014113 0ustar maomkpasswd/* mpl5.c */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2003-2017 Free Software Foundation, Inc. * Written by Andrew Makhorin and Heinrich Schuchardt * * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #if 1 /* 11/VI-2013 */ #include "jd.h" #endif #include "mpl.h" double fn_gmtime(MPL *mpl) { /* obtain the current calendar time (UTC) */ time_t timer; struct tm *tm; int j; time(&timer); if (timer == (time_t)(-1)) err: error(mpl, "gmtime(); unable to obtain current calendar time"); #if 0 /* 29/I-2017 */ tm = gmtime(&timer); #else tm = xgmtime(&timer); #endif if (tm == NULL) goto err; j = jday(tm->tm_mday, tm->tm_mon + 1, 1900 + tm->tm_year); if (j < 0) goto err; return (((double)(j - jday(1, 1, 1970)) * 24.0 + (double)tm->tm_hour) * 60.0 + (double)tm->tm_min) * 60.0 + (double)tm->tm_sec; } static char *week[] = { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" }; static char *moon[] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }; static void error1(MPL *mpl, const char *str, const char *s, const char *fmt, const char *f, const char *msg) { xprintf("Input string passed to str2time:\n"); xprintf("%s\n", str); xprintf("%*s\n", (s - str) + 1, "^"); xprintf("Format string passed to str2time:\n"); xprintf("%s\n", fmt); xprintf("%*s\n", (f - fmt) + 1, "^"); error(mpl, "%s", msg); /* no return */ } double fn_str2time(MPL *mpl, const char *str, const char *fmt) { /* convert character string to the calendar time */ int j, year, month, day, hh, mm, ss, zone; const char *s, *f; year = month = day = hh = mm = ss = -1, zone = INT_MAX; s = str; for (f = fmt; *f != '\0'; f++) { if (*f == '%') { f++; if (*f == 'b' || *f == 'h') { /* the abbreviated month name */ int k; char *name; if (month >= 0) error1(mpl, str, s, fmt, f, "month multiply specified" ); while (*s == ' ') s++; for (month = 1; month <= 12; month++) { name = moon[month-1]; for (k = 0; k <= 2; k++) { if (toupper((unsigned char)s[k]) != toupper((unsigned char)name[k])) goto next; } s += 3; for (k = 3; name[k] != '\0'; k++) { if (toupper((unsigned char)*s) != toupper((unsigned char)name[k])) break; s++; } break; next: ; } if (month > 12) error1(mpl, str, s, fmt, f, "abbreviated month name m" "issing or invalid"); } else if (*f == 'd') { /* the day of the month as a decimal number (01..31) */ if (day >= 0) error1(mpl, str, s, fmt, f, "day multiply specified"); while (*s == ' ') s++; if (!('0' <= *s && *s <= '9')) error1(mpl, str, s, fmt, f, "day missing or invalid"); day = (*s++) - '0'; if ('0' <= *s && *s <= '9') day = 10 * day + ((*s++) - '0'); if (!(1 <= day && day <= 31)) error1(mpl, str, s, fmt, f, "day out of range"); } else if (*f == 'H') { /* the hour as a decimal number, using a 24-hour clock (00..23) */ if (hh >= 0) error1(mpl, str, s, fmt, f, "hour multiply specified") ; while (*s == ' ') s++; if (!('0' <= *s && *s <= '9')) error1(mpl, str, s, fmt, f, "hour missing or invalid") ; hh = (*s++) - '0'; if ('0' <= *s && *s <= '9') hh = 10 * hh + ((*s++) - '0'); if (!(0 <= hh && hh <= 23)) error1(mpl, str, s, fmt, f, "hour out of range"); } else if (*f == 'm') { /* the month as a decimal number (01..12) */ if (month >= 0) error1(mpl, str, s, fmt, f, "month multiply specified" ); while (*s == ' ') s++; if (!('0' <= *s && *s <= '9')) error1(mpl, str, s, fmt, f, "month missing or invalid" ); month = (*s++) - '0'; if ('0' <= *s && *s <= '9') month = 10 * month + ((*s++) - '0'); if (!(1 <= month && month <= 12)) error1(mpl, str, s, fmt, f, "month out of range"); } else if (*f == 'M') { /* the minute as a decimal number (00..59) */ if (mm >= 0) error1(mpl, str, s, fmt, f, "minute multiply specifie" "d"); while (*s == ' ') s++; if (!('0' <= *s && *s <= '9')) error1(mpl, str, s, fmt, f, "minute missing or invali" "d"); mm = (*s++) - '0'; if ('0' <= *s && *s <= '9') mm = 10 * mm + ((*s++) - '0'); if (!(0 <= mm && mm <= 59)) error1(mpl, str, s, fmt, f, "minute out of range"); } else if (*f == 'S') { /* the second as a decimal number (00..60) */ if (ss >= 0) error1(mpl, str, s, fmt, f, "second multiply specifie" "d"); while (*s == ' ') s++; if (!('0' <= *s && *s <= '9')) error1(mpl, str, s, fmt, f, "second missing or invali" "d"); ss = (*s++) - '0'; if ('0' <= *s && *s <= '9') ss = 10 * ss + ((*s++) - '0'); if (!(0 <= ss && ss <= 60)) error1(mpl, str, s, fmt, f, "second out of range"); } else if (*f == 'y') { /* the year without a century as a decimal number (00..99); the values 00 to 68 mean the years 2000 to 2068 while the values 69 to 99 mean the years 1969 to 1999 */ if (year >= 0) error1(mpl, str, s, fmt, f, "year multiply specified") ; while (*s == ' ') s++; if (!('0' <= *s && *s <= '9')) error1(mpl, str, s, fmt, f, "year missing or invalid") ; year = (*s++) - '0'; if ('0' <= *s && *s <= '9') year = 10 * year + ((*s++) - '0'); year += (year >= 69 ? 1900 : 2000); } else if (*f == 'Y') { /* the year as a decimal number, using the Gregorian calendar */ if (year >= 0) error1(mpl, str, s, fmt, f, "year multiply specified") ; while (*s == ' ') s++; if (!('0' <= *s && *s <= '9')) error1(mpl, str, s, fmt, f, "year missing or invalid") ; year = 0; for (j = 1; j <= 4; j++) { if (!('0' <= *s && *s <= '9')) break; year = 10 * year + ((*s++) - '0'); } if (!(1 <= year && year <= 4000)) error1(mpl, str, s, fmt, f, "year out of range"); } else if (*f == 'z') { /* time zone offset in the form zhhmm */ int z, hh, mm; if (zone != INT_MAX) error1(mpl, str, s, fmt, f, "time zone offset multipl" "y specified"); while (*s == ' ') s++; if (*s == 'Z') { z = hh = mm = 0, s++; goto skip; } if (*s == '+') z = +1, s++; else if (*s == '-') z = -1, s++; else error1(mpl, str, s, fmt, f, "time zone offset sign mi" "ssing"); hh = 0; for (j = 1; j <= 2; j++) { if (!('0' <= *s && *s <= '9')) err1: error1(mpl, str, s, fmt, f, "time zone offset valu" "e incomplete or invalid"); hh = 10 * hh + ((*s++) - '0'); } if (hh > 23) err2: error1(mpl, str, s, fmt, f, "time zone offset value o" "ut of range"); if (*s == ':') { s++; if (!('0' <= *s && *s <= '9')) goto err1; } mm = 0; if (!('0' <= *s && *s <= '9')) goto skip; for (j = 1; j <= 2; j++) { if (!('0' <= *s && *s <= '9')) goto err1; mm = 10 * mm + ((*s++) - '0'); } if (mm > 59) goto err2; skip: zone = z * (60 * hh + mm); } else if (*f == '%') { /* literal % character */ goto test; } else error1(mpl, str, s, fmt, f, "invalid conversion specifie" "r"); } else if (*f == ' ') ; else test: { /* check a matching character in the input string */ if (*s != *f) error1(mpl, str, s, fmt, f, "character mismatch"); s++; } } if (year < 0) year = 1970; if (month < 0) month = 1; if (day < 0) day = 1; if (hh < 0) hh = 0; if (mm < 0) mm = 0; if (ss < 0) ss = 0; if (zone == INT_MAX) zone = 0; j = jday(day, month, year); xassert(j >= 0); return (((double)(j - jday(1, 1, 1970)) * 24.0 + (double)hh) * 60.0 + (double)mm) * 60.0 + (double)ss - 60.0 * (double)zone; } static void error2(MPL *mpl, const char *fmt, const char *f, const char *msg) { xprintf("Format string passed to time2str:\n"); xprintf("%s\n", fmt); xprintf("%*s\n", (f - fmt) + 1, "^"); error(mpl, "%s", msg); /* no return */ } static int weekday(int j) { /* determine weekday number (1 = Mon, ..., 7 = Sun) */ return (j + jday(1, 1, 1970)) % 7 + 1; } static int firstday(int year) { /* determine the first day of the first week for a specified year according to ISO 8601 */ int j; /* if 1 January is Monday, Tuesday, Wednesday or Thursday, it is in week 01; if 1 January is Friday, Saturday or Sunday, it is in week 52 or 53 of the previous year */ j = jday(1, 1, year) - jday(1, 1, 1970); switch (weekday(j)) { case 1: /* 1 Jan is Mon */ j += 0; break; case 2: /* 1 Jan is Tue */ j -= 1; break; case 3: /* 1 Jan is Wed */ j -= 2; break; case 4: /* 1 Jan is Thu */ j -= 3; break; case 5: /* 1 Jan is Fri */ j += 3; break; case 6: /* 1 Jan is Sat */ j += 2; break; case 7: /* 1 Jan is Sun */ j += 1; break; default: xassert(j != j); } /* the first day of the week must be Monday */ xassert(weekday(j) == 1); return j; } void fn_time2str(MPL *mpl, char *str, double t, const char *fmt) { /* convert the calendar time to character string */ int j, year, month, day, hh, mm, ss, len; double temp; const char *f; char buf[MAX_LENGTH+1]; if (!(-62135596800.0 <= t && t <= 64092211199.0)) error(mpl, "time2str(%.*g,...); argument out of range", DBL_DIG, t); t = floor(t + 0.5); temp = fabs(t) / 86400.0; j = (int)floor(temp); if (t < 0.0) { if (temp == floor(temp)) j = - j; else j = - (j + 1); } xassert(jdate(j + jday(1, 1, 1970), &day, &month, &year) == 0); ss = (int)(t - 86400.0 * (double)j); xassert(0 <= ss && ss < 86400); mm = ss / 60, ss %= 60; hh = mm / 60, mm %= 60; len = 0; for (f = fmt; *f != '\0'; f++) { if (*f == '%') { f++; if (*f == 'a') { /* the abbreviated weekday name */ memcpy(buf, week[weekday(j)-1], 3), buf[3] = '\0'; } else if (*f == 'A') { /* the full weekday name */ strcpy(buf, week[weekday(j)-1]); } else if (*f == 'b' || *f == 'h') { /* the abbreviated month name */ memcpy(buf, moon[month-1], 3), buf[3] = '\0'; } else if (*f == 'B') { /* the full month name */ strcpy(buf, moon[month-1]); } else if (*f == 'C') { /* the century of the year */ sprintf(buf, "%02d", year / 100); } else if (*f == 'd') { /* the day of the month as a decimal number (01..31) */ sprintf(buf, "%02d", day); } else if (*f == 'D') { /* the date using the format %m/%d/%y */ sprintf(buf, "%02d/%02d/%02d", month, day, year % 100); } else if (*f == 'e') { /* the day of the month like with %d, but padded with blank (1..31) */ sprintf(buf, "%2d", day); } else if (*f == 'F') { /* the date using the format %Y-%m-%d */ sprintf(buf, "%04d-%02d-%02d", year, month, day); } else if (*f == 'g') { /* the year corresponding to the ISO week number, but without the century (range 00 through 99); this has the same format and value as %y, except that if the ISO week number (see %V) belongs to the previous or next year, that year is used instead */ int iso; if (j < firstday(year)) iso = year - 1; else if (j < firstday(year + 1)) iso = year; else iso = year + 1; sprintf(buf, "%02d", iso % 100); } else if (*f == 'G') { /* the year corresponding to the ISO week number; this has the same format and value as %Y, excepth that if the ISO week number (see %V) belongs to the previous or next year, that year is used instead */ int iso; if (j < firstday(year)) iso = year - 1; else if (j < firstday(year + 1)) iso = year; else iso = year + 1; sprintf(buf, "%04d", iso); } else if (*f == 'H') { /* the hour as a decimal number, using a 24-hour clock (00..23) */ sprintf(buf, "%02d", hh); } else if (*f == 'I') { /* the hour as a decimal number, using a 12-hour clock (01..12) */ sprintf(buf, "%02d", hh == 0 ? 12 : hh <= 12 ? hh : hh - 12); } else if (*f == 'j') { /* the day of the year as a decimal number (001..366) */ sprintf(buf, "%03d", jday(day, month, year) - jday(1, 1, year) + 1); } else if (*f == 'k') { /* the hour as a decimal number, using a 24-hour clock like %H, but padded with blank (0..23) */ sprintf(buf, "%2d", hh); } else if (*f == 'l') { /* the hour as a decimal number, using a 12-hour clock like %I, but padded with blank (1..12) */ sprintf(buf, "%2d", hh == 0 ? 12 : hh <= 12 ? hh : hh - 12); } else if (*f == 'm') { /* the month as a decimal number (01..12) */ sprintf(buf, "%02d", month); } else if (*f == 'M') { /* the minute as a decimal number (00..59) */ sprintf(buf, "%02d", mm); } else if (*f == 'p') { /* either AM or PM, according to the given time value; noon is treated as PM and midnight as AM */ strcpy(buf, hh <= 11 ? "AM" : "PM"); } else if (*f == 'P') { /* either am or pm, according to the given time value; noon is treated as pm and midnight as am */ strcpy(buf, hh <= 11 ? "am" : "pm"); } else if (*f == 'r') { /* the calendar time using the format %I:%M:%S %p */ sprintf(buf, "%02d:%02d:%02d %s", hh == 0 ? 12 : hh <= 12 ? hh : hh - 12, mm, ss, hh <= 11 ? "AM" : "PM"); } else if (*f == 'R') { /* the hour and minute using the format %H:%M */ sprintf(buf, "%02d:%02d", hh, mm); } else if (*f == 'S') { /* the second as a decimal number (00..59) */ sprintf(buf, "%02d", ss); } else if (*f == 'T') { /* the time of day using the format %H:%M:%S */ sprintf(buf, "%02d:%02d:%02d", hh, mm, ss); } else if (*f == 'u') { /* the day of the week as a decimal number (1..7), Monday being 1 */ sprintf(buf, "%d", weekday(j)); } else if (*f == 'U') { /* the week number of the current year as a decimal number (range 00 through 53), starting with the first Sunday as the first day of the first week; days preceding the first Sunday in the year are considered to be in week 00 */ #if 1 /* 09/I-2009 */ #undef sun /* causes compilation error in SunOS */ #endif int sun; /* sun = the first Sunday of the year */ sun = jday(1, 1, year) - jday(1, 1, 1970); sun += (7 - weekday(sun)); sprintf(buf, "%02d", (j + 7 - sun) / 7); } else if (*f == 'V') { /* the ISO week number as a decimal number (range 01 through 53); ISO weeks start with Monday and end with Sunday; week 01 of a year is the first week which has the majority of its days in that year; week 01 of a year can contain days from the previous year; the week before week 01 of a year is the last week (52 or 53) of the previous year even if it contains days from the new year */ int iso; if (j < firstday(year)) iso = j - firstday(year - 1); else if (j < firstday(year + 1)) iso = j - firstday(year); else iso = j - firstday(year + 1); sprintf(buf, "%02d", iso / 7 + 1); } else if (*f == 'w') { /* the day of the week as a decimal number (0..6), Sunday being 0 */ sprintf(buf, "%d", weekday(j) % 7); } else if (*f == 'W') { /* the week number of the current year as a decimal number (range 00 through 53), starting with the first Monday as the first day of the first week; days preceding the first Monday in the year are considered to be in week 00 */ int mon; /* mon = the first Monday of the year */ mon = jday(1, 1, year) - jday(1, 1, 1970); mon += (8 - weekday(mon)) % 7; sprintf(buf, "%02d", (j + 7 - mon) / 7); } else if (*f == 'y') { /* the year without a century as a decimal number (00..99) */ sprintf(buf, "%02d", year % 100); } else if (*f == 'Y') { /* the year as a decimal number, using the Gregorian calendar */ sprintf(buf, "%04d", year); } else if (*f == '%') { /* a literal % character */ buf[0] = '%', buf[1] = '\0'; } else error2(mpl, fmt, f, "invalid conversion specifier"); } else buf[0] = *f, buf[1] = '\0'; if (len + strlen(buf) > MAX_LENGTH) error(mpl, "time2str; output string length exceeds %d chara" "cters", MAX_LENGTH); memcpy(str+len, buf, strlen(buf)); len += strlen(buf); } str[len] = '\0'; return; } /* eof */ glpk-5.0/src/mpl/mpl6.c0000644000062000006210000007624513766346220014121 0ustar maomkpasswd/* mpl6.c */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2003-2017 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "mpl.h" #include "mplsql.h" /**********************************************************************/ #define CSV_FIELD_MAX 50 /* maximal number of fields in record */ #define CSV_FDLEN_MAX 100 /* maximal field length */ struct csv { /* comma-separated values file */ int mode; /* 'R' = reading; 'W' = writing */ char *fname; /* name of csv file */ FILE *fp; /* stream assigned to csv file */ jmp_buf jump; /* address for non-local go to in case of error */ int count; /* record count */ /*--------------------------------------------------------------*/ /* used only for input csv file */ int c; /* current character or EOF */ int what; /* current marker: */ #define CSV_EOF 0 /* end-of-file */ #define CSV_EOR 1 /* end-of-record */ #define CSV_NUM 2 /* floating-point number */ #define CSV_STR 3 /* character string */ char field[CSV_FDLEN_MAX+1]; /* current field just read */ int nf; /* number of fields in the csv file */ int ref[1+CSV_FIELD_MAX]; /* ref[k] = k', if k-th field of the csv file corresponds to k'-th field in the table statement; if ref[k] = 0, k-th field of the csv file is ignored */ #if 1 /* 01/VI-2010 */ int nskip; /* number of comment records preceding the header record */ #endif }; #undef read_char static void read_char(struct csv *csv) { /* read character from csv data file */ int c; xassert(csv->c != EOF); if (csv->c == '\n') csv->count++; loop: c = fgetc(csv->fp); if (ferror(csv->fp)) { xprintf("%s:%d: read error - %s\n", csv->fname, csv->count, #if 0 /* 29/I-2017 */ strerror(errno)); #else xstrerr(errno)); #endif longjmp(csv->jump, 0); } if (feof(csv->fp)) { if (csv->c == '\n') { csv->count--; c = EOF; } else { xprintf("%s:%d: warning: missing final end-of-line\n", csv->fname, csv->count); c = '\n'; } } else if (c == '\r') goto loop; else if (c == '\n') ; else if (iscntrl(c)) { xprintf("%s:%d: invalid control character 0x%02X\n", csv->fname, csv->count, c); longjmp(csv->jump, 0); } csv->c = c; return; } static void read_field(struct csv *csv) { /* read field from csv data file */ /* check for end of file */ if (csv->c == EOF) { csv->what = CSV_EOF; strcpy(csv->field, "EOF"); goto done; } /* check for end of record */ if (csv->c == '\n') { csv->what = CSV_EOR; strcpy(csv->field, "EOR"); read_char(csv); if (csv->c == ',') err1: { xprintf("%s:%d: empty field not allowed\n", csv->fname, csv->count); longjmp(csv->jump, 0); } if (csv->c == '\n') { xprintf("%s:%d: empty record not allowed\n", csv->fname, csv->count); longjmp(csv->jump, 0); } #if 1 /* 01/VI-2010 */ /* skip comment records; may appear only before the very first record containing field names */ if (csv->c == '#' && csv->count == 1) { while (csv->c == '#') { while (csv->c != '\n') read_char(csv); read_char(csv); csv->nskip++; } } #endif goto done; } /* skip comma before next field */ if (csv->c == ',') read_char(csv); /* read field */ if (csv->c == '\'' || csv->c == '"') { /* read a field enclosed in quotes */ int quote = csv->c, len = 0; csv->what = CSV_STR; /* skip opening quote */ read_char(csv); /* read field characters within quotes */ for (;;) { /* check for closing quote and read it */ if (csv->c == quote) { read_char(csv); if (csv->c == quote) ; else if (csv->c == ',' || csv->c == '\n') break; else { xprintf("%s:%d: invalid field\n", csv->fname, csv->count); longjmp(csv->jump, 0); } } /* check the current field length */ if (len == CSV_FDLEN_MAX) err2: { xprintf("%s:%d: field too long\n", csv->fname, csv->count); longjmp(csv->jump, 0); } /* add the current character to the field */ csv->field[len++] = (char)csv->c; /* read the next character */ read_char(csv); } /* the field has been read */ if (len == 0) goto err1; csv->field[len] = '\0'; } else { /* read a field not enclosed in quotes */ int len = 0; double temp; csv->what = CSV_NUM; while (!(csv->c == ',' || csv->c == '\n')) { /* quotes within the field are not allowed */ if (csv->c == '\'' || csv->c == '"') { xprintf("%s:%d: invalid use of single or double quote wi" "thin field\n", csv->fname, csv->count); longjmp(csv->jump, 0); } /* check the current field length */ if (len == CSV_FDLEN_MAX) goto err2; /* add the current character to the field */ csv->field[len++] = (char)csv->c; /* read the next character */ read_char(csv); } /* the field has been read */ if (len == 0) goto err1; csv->field[len] = '\0'; /* check the field type */ if (str2num(csv->field, &temp)) csv->what = CSV_STR; } done: return; } static struct csv *csv_open_file(TABDCA *dca, int mode) { /* open csv data file */ struct csv *csv; /* create control structure */ csv = xmalloc(sizeof(struct csv)); csv->mode = mode; csv->fname = NULL; csv->fp = NULL; if (setjmp(csv->jump)) goto fail; csv->count = 0; csv->c = '\n'; csv->what = 0; csv->field[0] = '\0'; csv->nf = 0; /* try to open the csv data file */ if (mpl_tab_num_args(dca) < 2) { xprintf("csv_driver: file name not specified\n"); longjmp(csv->jump, 0); } csv->fname = xmalloc(strlen(mpl_tab_get_arg(dca, 2))+1); strcpy(csv->fname, mpl_tab_get_arg(dca, 2)); if (mode == 'R') { /* open the file for reading */ int k; csv->fp = fopen(csv->fname, "r"); if (csv->fp == NULL) { xprintf("csv_driver: unable to open %s - %s\n", #if 0 /* 29/I-2017 */ csv->fname, strerror(errno)); #else csv->fname, xstrerr(errno)); #endif longjmp(csv->jump, 0); } #if 1 /* 01/VI-2010 */ csv->nskip = 0; #endif /* skip fake new-line */ read_field(csv); xassert(csv->what == CSV_EOR); /* read field names */ xassert(csv->nf == 0); for (;;) { read_field(csv); if (csv->what == CSV_EOR) break; if (csv->what != CSV_STR) { xprintf("%s:%d: invalid field name\n", csv->fname, csv->count); longjmp(csv->jump, 0); } if (csv->nf == CSV_FIELD_MAX) { xprintf("%s:%d: too many fields\n", csv->fname, csv->count); longjmp(csv->jump, 0); } csv->nf++; /* find corresponding field in the table statement */ for (k = mpl_tab_num_flds(dca); k >= 1; k--) { if (strcmp(mpl_tab_get_name(dca, k), csv->field) == 0) break; } csv->ref[csv->nf] = k; } /* find dummy RECNO field in the table statement */ for (k = mpl_tab_num_flds(dca); k >= 1; k--) if (strcmp(mpl_tab_get_name(dca, k), "RECNO") == 0) break; csv->ref[0] = k; } else if (mode == 'W') { /* open the file for writing */ int k, nf; csv->fp = fopen(csv->fname, "w"); if (csv->fp == NULL) { xprintf("csv_driver: unable to create %s - %s\n", #if 0 /* 29/I-2017 */ csv->fname, strerror(errno)); #else csv->fname, xstrerr(errno)); #endif longjmp(csv->jump, 0); } /* write field names */ nf = mpl_tab_num_flds(dca); for (k = 1; k <= nf; k++) fprintf(csv->fp, "%s%c", mpl_tab_get_name(dca, k), k < nf ? ',' : '\n'); csv->count++; } else xassert(mode != mode); /* the file has been open */ return csv; fail: /* the file cannot be open */ if (csv->fname != NULL) xfree(csv->fname); if (csv->fp != NULL) fclose(csv->fp); xfree(csv); return NULL; } static int csv_read_record(TABDCA *dca, struct csv *csv) { /* read next record from csv data file */ int k, ret = 0; xassert(csv->mode == 'R'); if (setjmp(csv->jump)) { ret = 1; goto done; } /* read dummy RECNO field */ if (csv->ref[0] > 0) #if 0 /* 01/VI-2010 */ mpl_tab_set_num(dca, csv->ref[0], csv->count-1); #else mpl_tab_set_num(dca, csv->ref[0], csv->count-csv->nskip-1); #endif /* read fields */ for (k = 1; k <= csv->nf; k++) { read_field(csv); if (csv->what == CSV_EOF) { /* end-of-file reached */ xassert(k == 1); ret = -1; goto done; } else if (csv->what == CSV_EOR) { /* end-of-record reached */ int lack = csv->nf - k + 1; if (lack == 1) xprintf("%s:%d: one field missing\n", csv->fname, csv->count); else xprintf("%s:%d: %d fields missing\n", csv->fname, csv->count, lack); longjmp(csv->jump, 0); } else if (csv->what == CSV_NUM) { /* floating-point number */ if (csv->ref[k] > 0) { double num; xassert(str2num(csv->field, &num) == 0); mpl_tab_set_num(dca, csv->ref[k], num); } } else if (csv->what == CSV_STR) { /* character string */ if (csv->ref[k] > 0) mpl_tab_set_str(dca, csv->ref[k], csv->field); } else xassert(csv != csv); } /* now there must be NL */ read_field(csv); xassert(csv->what != CSV_EOF); if (csv->what != CSV_EOR) { xprintf("%s:%d: too many fields\n", csv->fname, csv->count); longjmp(csv->jump, 0); } done: return ret; } static int csv_write_record(TABDCA *dca, struct csv *csv) { /* write next record to csv data file */ int k, nf, ret = 0; const char *c; xassert(csv->mode == 'W'); nf = mpl_tab_num_flds(dca); for (k = 1; k <= nf; k++) { switch (mpl_tab_get_type(dca, k)) { case 'N': fprintf(csv->fp, "%.*g", DBL_DIG, mpl_tab_get_num(dca, k)); break; case 'S': fputc('"', csv->fp); for (c = mpl_tab_get_str(dca, k); *c != '\0'; c++) { if (*c == '"') fputc('"', csv->fp), fputc('"', csv->fp); else fputc(*c, csv->fp); } fputc('"', csv->fp); break; default: xassert(dca != dca); } fputc(k < nf ? ',' : '\n', csv->fp); } csv->count++; if (ferror(csv->fp)) { xprintf("%s:%d: write error - %s\n", csv->fname, csv->count, #if 0 /* 29/I-2017 */ strerror(errno)); #else xstrerr(errno)); #endif ret = 1; } return ret; } static int csv_close_file(TABDCA *dca, struct csv *csv) { /* close csv data file */ int ret = 0; xassert(dca == dca); if (csv->mode == 'W') { fflush(csv->fp); if (ferror(csv->fp)) { xprintf("%s:%d: write error - %s\n", csv->fname, #if 0 /* 29/I-2017 */ csv->count, strerror(errno)); #else csv->count, xstrerr(errno)); #endif ret = 1; } } xfree(csv->fname); fclose(csv->fp); xfree(csv); return ret; } /**********************************************************************/ #define DBF_FIELD_MAX 50 /* maximal number of fields in record */ #define DBF_FDLEN_MAX 100 /* maximal field length */ struct dbf { /* xBASE data file */ int mode; /* 'R' = reading; 'W' = writing */ char *fname; /* name of xBASE file */ FILE *fp; /* stream assigned to xBASE file */ jmp_buf jump; /* address for non-local go to in case of error */ int offset; /* offset of a byte to be read next */ int count; /* record count */ int nf; /* number of fields */ int ref[1+DBF_FIELD_MAX]; /* ref[k] = k', if k-th field of the csv file corresponds to k'-th field in the table statement; if ref[k] = 0, k-th field of the csv file is ignored */ int type[1+DBF_FIELD_MAX]; /* type[k] is type of k-th field */ int len[1+DBF_FIELD_MAX]; /* len[k] is length of k-th field */ int prec[1+DBF_FIELD_MAX]; /* prec[k] is precision of k-th field */ }; static int read_byte(struct dbf *dbf) { /* read byte from xBASE data file */ int b; b = fgetc(dbf->fp); if (ferror(dbf->fp)) { xprintf("%s:0x%X: read error - %s\n", dbf->fname, #if 0 /* 29/I-2017 */ dbf->offset, strerror(errno)); #else dbf->offset, xstrerr(errno)); #endif longjmp(dbf->jump, 0); } if (feof(dbf->fp)) { xprintf("%s:0x%X: unexpected end of file\n", dbf->fname, dbf->offset); longjmp(dbf->jump, 0); } xassert(0x00 <= b && b <= 0xFF); dbf->offset++; return b; } static void read_header(TABDCA *dca, struct dbf *dbf) { /* read xBASE data file header */ int b, j, k, recl; char name[10+1]; /* (ignored) */ for (j = 1; j <= 10; j++) read_byte(dbf); /* length of each record, in bytes */ recl = read_byte(dbf); recl += read_byte(dbf) << 8; /* (ignored) */ for (j = 1; j <= 20; j++) read_byte(dbf); /* field descriptor array */ xassert(dbf->nf == 0); for (;;) { /* check for end of array */ b = read_byte(dbf); if (b == 0x0D) break; if (dbf->nf == DBF_FIELD_MAX) { xprintf("%s:0x%X: too many fields\n", dbf->fname, dbf->offset); longjmp(dbf->jump, 0); } dbf->nf++; /* field name */ name[0] = (char)b; for (j = 1; j < 10; j++) { b = read_byte(dbf); name[j] = (char)b; } name[10] = '\0'; b = read_byte(dbf); if (b != 0x00) { xprintf("%s:0x%X: invalid field name\n", dbf->fname, dbf->offset); longjmp(dbf->jump, 0); } /* find corresponding field in the table statement */ for (k = mpl_tab_num_flds(dca); k >= 1; k--) if (strcmp(mpl_tab_get_name(dca, k), name) == 0) break; dbf->ref[dbf->nf] = k; /* field type */ b = read_byte(dbf); if (!(b == 'C' || b == 'N')) { xprintf("%s:0x%X: invalid field type\n", dbf->fname, dbf->offset); longjmp(dbf->jump, 0); } dbf->type[dbf->nf] = b; /* (ignored) */ for (j = 1; j <= 4; j++) read_byte(dbf); /* field length */ b = read_byte(dbf); if (b == 0) { xprintf("%s:0x%X: invalid field length\n", dbf->fname, dbf->offset); longjmp(dbf->jump, 0); } if (b > DBF_FDLEN_MAX) { xprintf("%s:0x%X: field too long\n", dbf->fname, dbf->offset); longjmp(dbf->jump, 0); } dbf->len[dbf->nf] = b; recl -= b; /* (ignored) */ for (j = 1; j <= 15; j++) read_byte(dbf); } if (recl != 1) { xprintf("%s:0x%X: invalid file header\n", dbf->fname, dbf->offset); longjmp(dbf->jump, 0); } /* find dummy RECNO field in the table statement */ for (k = mpl_tab_num_flds(dca); k >= 1; k--) if (strcmp(mpl_tab_get_name(dca, k), "RECNO") == 0) break; dbf->ref[0] = k; return; } static void parse_third_arg(TABDCA *dca, struct dbf *dbf) { /* parse xBASE file format (third argument) */ int j, k, temp; const char *arg; dbf->nf = mpl_tab_num_flds(dca); arg = mpl_tab_get_arg(dca, 3), j = 0; for (k = 1; k <= dbf->nf; k++) { /* parse specification of k-th field */ if (arg[j] == '\0') { xprintf("xBASE driver: field %s: specification missing\n", mpl_tab_get_name(dca, k)); longjmp(dbf->jump, 0); } /* parse field type */ if (arg[j] == 'C' || arg[j] == 'N') dbf->type[k] = arg[j], j++; else { xprintf("xBASE driver: field %s: invalid field type\n", mpl_tab_get_name(dca, k)); longjmp(dbf->jump, 0); } /* check for left parenthesis */ if (arg[j] == '(') j++; else err: { xprintf("xBASE driver: field %s: invalid field format\n", mpl_tab_get_name(dca, k)); longjmp(dbf->jump, 0); } /* parse field length */ temp = 0; while (isdigit(arg[j])) { if (temp > DBF_FDLEN_MAX) break; temp = 10 * temp + (arg[j] - '0'), j++; } if (!(1 <= temp && temp <= DBF_FDLEN_MAX)) { xprintf("xBASE driver: field %s: invalid field length\n", mpl_tab_get_name(dca, k)); longjmp(dbf->jump, 0); } dbf->len[k] = temp; /* parse optional field precision */ if (dbf->type[k] == 'N' && arg[j] == ',') { j++; temp = 0; while (isdigit(arg[j])) { if (temp > dbf->len[k]) break; temp = 10 * temp + (arg[j] - '0'), j++; } if (temp > dbf->len[k]) { xprintf("xBASE driver: field %s: invalid field precision" "\n", mpl_tab_get_name(dca, k)); longjmp(dbf->jump, 0); } dbf->prec[k] = temp; } else dbf->prec[k] = 0; /* check for right parenthesis */ if (arg[j] == ')') j++; else goto err; } /* ignore other specifications */ return; } static void write_byte(struct dbf *dbf, int b) { /* write byte to xBASE data file */ fputc(b, dbf->fp); dbf->offset++; return; } static void write_header(TABDCA *dca, struct dbf *dbf) { /* write xBASE data file header */ int j, k, temp; const char *name; /* version number */ write_byte(dbf, 0x03 /* file without DBT */); /* date of last update (YYMMDD) */ write_byte(dbf, 70 /* 1970 */); write_byte(dbf, 1 /* January */); write_byte(dbf, 1 /* 1st */); /* number of records (unknown so far) */ for (j = 1; j <= 4; j++) write_byte(dbf, 0xFF); /* length of the header, in bytes */ temp = 32 + dbf->nf * 32 + 1; write_byte(dbf, temp); write_byte(dbf, temp >> 8); /* length of each record, in bytes */ temp = 1; for (k = 1; k <= dbf->nf; k++) temp += dbf->len[k]; write_byte(dbf, temp); write_byte(dbf, temp >> 8); /* (reserved) */ for (j = 1; j <= 20; j++) write_byte(dbf, 0x00); /* field descriptor array */ for (k = 1; k <= dbf->nf; k++) { /* field name (terminated by 0x00) */ name = mpl_tab_get_name(dca, k); for (j = 0; j < 10 && name[j] != '\0'; j++) write_byte(dbf, name[j]); for (j = j; j < 11; j++) write_byte(dbf, 0x00); /* field type */ write_byte(dbf, dbf->type[k]); /* (reserved) */ for (j = 1; j <= 4; j++) write_byte(dbf, 0x00); /* field length */ write_byte(dbf, dbf->len[k]); /* field precision */ write_byte(dbf, dbf->prec[k]); /* (reserved) */ for (j = 1; j <= 14; j++) write_byte(dbf, 0x00); } /* end of header */ write_byte(dbf, 0x0D); return; } static struct dbf *dbf_open_file(TABDCA *dca, int mode) { /* open xBASE data file */ struct dbf *dbf; /* create control structure */ dbf = xmalloc(sizeof(struct dbf)); dbf->mode = mode; dbf->fname = NULL; dbf->fp = NULL; if (setjmp(dbf->jump)) goto fail; dbf->offset = 0; dbf->count = 0; dbf->nf = 0; /* try to open the xBASE data file */ if (mpl_tab_num_args(dca) < 2) { xprintf("xBASE driver: file name not specified\n"); longjmp(dbf->jump, 0); } dbf->fname = xmalloc(strlen(mpl_tab_get_arg(dca, 2))+1); strcpy(dbf->fname, mpl_tab_get_arg(dca, 2)); if (mode == 'R') { /* open the file for reading */ dbf->fp = fopen(dbf->fname, "rb"); if (dbf->fp == NULL) { xprintf("xBASE driver: unable to open %s - %s\n", #if 0 /* 29/I-2017 */ dbf->fname, strerror(errno)); #else dbf->fname, xstrerr(errno)); #endif longjmp(dbf->jump, 0); } read_header(dca, dbf); } else if (mode == 'W') { /* open the file for writing */ if (mpl_tab_num_args(dca) < 3) { xprintf("xBASE driver: file format not specified\n"); longjmp(dbf->jump, 0); } parse_third_arg(dca, dbf); dbf->fp = fopen(dbf->fname, "wb"); if (dbf->fp == NULL) { xprintf("xBASE driver: unable to create %s - %s\n", #if 0 /* 29/I-2017 */ dbf->fname, strerror(errno)); #else dbf->fname, xstrerr(errno)); #endif longjmp(dbf->jump, 0); } write_header(dca, dbf); } else xassert(mode != mode); /* the file has been open */ return dbf; fail: /* the file cannot be open */ if (dbf->fname != NULL) xfree(dbf->fname); if (dbf->fp != NULL) fclose(dbf->fp); xfree(dbf); return NULL; } static int dbf_read_record(TABDCA *dca, struct dbf *dbf) { /* read next record from xBASE data file */ int b, j, k, ret = 0; char buf[DBF_FDLEN_MAX+1]; xassert(dbf->mode == 'R'); if (setjmp(dbf->jump)) { ret = 1; goto done; } /* check record flag */ b = read_byte(dbf); if (b == 0x1A) { /* end of data */ ret = -1; goto done; } if (b != 0x20) { xprintf("%s:0x%X: invalid record flag\n", dbf->fname, dbf->offset); longjmp(dbf->jump, 0); } /* read dummy RECNO field */ if (dbf->ref[0] > 0) mpl_tab_set_num(dca, dbf->ref[0], dbf->count+1); /* read fields */ for (k = 1; k <= dbf->nf; k++) { /* read k-th field */ for (j = 0; j < dbf->len[k]; j++) buf[j] = (char)read_byte(dbf); buf[dbf->len[k]] = '\0'; /* set field value */ if (dbf->type[k] == 'C') { /* character field */ if (dbf->ref[k] > 0) mpl_tab_set_str(dca, dbf->ref[k], strtrim(buf)); } else if (dbf->type[k] == 'N') { /* numeric field */ if (dbf->ref[k] > 0) { double num; strspx(buf); xassert(str2num(buf, &num) == 0); mpl_tab_set_num(dca, dbf->ref[k], num); } } else xassert(dbf != dbf); } /* increase record count */ dbf->count++; done: return ret; } static int dbf_write_record(TABDCA *dca, struct dbf *dbf) { /* write next record to xBASE data file */ int j, k, ret = 0; char buf[255+1]; xassert(dbf->mode == 'W'); if (setjmp(dbf->jump)) { ret = 1; goto done; } /* record flag */ write_byte(dbf, 0x20); xassert(dbf->nf == mpl_tab_num_flds(dca)); for (k = 1; k <= dbf->nf; k++) { if (dbf->type[k] == 'C') { /* character field */ const char *str; if (mpl_tab_get_type(dca, k) == 'N') { sprintf(buf, "%.*g", DBL_DIG, mpl_tab_get_num(dca, k)); str = buf; } else if (mpl_tab_get_type(dca, k) == 'S') str = mpl_tab_get_str(dca, k); else xassert(dca != dca); if ((int)strlen(str) > dbf->len[k]) { xprintf("xBASE driver: field %s: cannot convert %.15s..." " to field format\n", mpl_tab_get_name(dca, k), str); longjmp(dbf->jump, 0); } for (j = 0; j < dbf->len[k] && str[j] != '\0'; j++) write_byte(dbf, str[j]); for (j = j; j < dbf->len[k]; j++) write_byte(dbf, ' '); } else if (dbf->type[k] == 'N') { /* numeric field */ double num = mpl_tab_get_num(dca, k); if (fabs(num) > 1e20) err: { xprintf("xBASE driver: field %s: cannot convert %g to fi" "eld format\n", mpl_tab_get_name(dca, k), num); longjmp(dbf->jump, 0); } sprintf(buf, "%*.*f", dbf->len[k], dbf->prec[k], num); xassert(strlen(buf) < sizeof(buf)); if ((int)strlen(buf) != dbf->len[k]) goto err; for (j = 0; j < dbf->len[k]; j++) write_byte(dbf, buf[j]); } else xassert(dbf != dbf); } /* increase record count */ dbf->count++; done: return ret; } static int dbf_close_file(TABDCA *dca, struct dbf *dbf) { /* close xBASE data file */ int ret = 0; xassert(dca == dca); if (dbf->mode == 'W') { if (setjmp(dbf->jump)) { ret = 1; goto skip; } /* end-of-file flag */ write_byte(dbf, 0x1A); /* number of records */ dbf->offset = 4; if (fseek(dbf->fp, dbf->offset, SEEK_SET)) { xprintf("%s:0x%X: seek error - %s\n", dbf->fname, #if 0 /* 29/I-2017 */ dbf->offset, strerror(errno)); #else dbf->offset, xstrerr(errno)); #endif longjmp(dbf->jump, 0); } write_byte(dbf, dbf->count); write_byte(dbf, dbf->count >> 8); write_byte(dbf, dbf->count >> 16); write_byte(dbf, dbf->count >> 24); fflush(dbf->fp); if (ferror(dbf->fp)) { xprintf("%s:0x%X: write error - %s\n", dbf->fname, #if 0 /* 29/I-2017 */ dbf->offset, strerror(errno)); #else dbf->offset, xstrerr(errno)); #endif longjmp(dbf->jump, 0); } skip: ; } xfree(dbf->fname); fclose(dbf->fp); xfree(dbf); return ret; } /**********************************************************************/ #define TAB_CSV 1 #define TAB_XBASE 2 #define TAB_ODBC 3 #define TAB_MYSQL 4 void mpl_tab_drv_open(MPL *mpl, int mode) { TABDCA *dca = mpl->dca; xassert(dca->id == 0); xassert(dca->link == NULL); xassert(dca->na >= 1); if (strcmp(dca->arg[1], "CSV") == 0) { dca->id = TAB_CSV; dca->link = csv_open_file(dca, mode); } else if (strcmp(dca->arg[1], "xBASE") == 0) { dca->id = TAB_XBASE; dca->link = dbf_open_file(dca, mode); } else if (strcmp(dca->arg[1], "ODBC") == 0 || strcmp(dca->arg[1], "iODBC") == 0) { dca->id = TAB_ODBC; dca->link = db_iodbc_open(dca, mode); } else if (strcmp(dca->arg[1], "MySQL") == 0) { dca->id = TAB_MYSQL; dca->link = db_mysql_open(dca, mode); } else xprintf("Invalid table driver '%s'\n", dca->arg[1]); if (dca->link == NULL) error(mpl, "error on opening table %s", mpl->stmt->u.tab->name); return; } int mpl_tab_drv_read(MPL *mpl) { TABDCA *dca = mpl->dca; int ret; switch (dca->id) { case TAB_CSV: ret = csv_read_record(dca, dca->link); break; case TAB_XBASE: ret = dbf_read_record(dca, dca->link); break; case TAB_ODBC: ret = db_iodbc_read(dca, dca->link); break; case TAB_MYSQL: ret = db_mysql_read(dca, dca->link); break; default: xassert(dca != dca); } if (ret > 0) error(mpl, "error on reading data from table %s", mpl->stmt->u.tab->name); return ret; } void mpl_tab_drv_write(MPL *mpl) { TABDCA *dca = mpl->dca; int ret; switch (dca->id) { case TAB_CSV: ret = csv_write_record(dca, dca->link); break; case TAB_XBASE: ret = dbf_write_record(dca, dca->link); break; case TAB_ODBC: ret = db_iodbc_write(dca, dca->link); break; case TAB_MYSQL: ret = db_mysql_write(dca, dca->link); break; default: xassert(dca != dca); } if (ret) error(mpl, "error on writing data to table %s", mpl->stmt->u.tab->name); return; } void mpl_tab_drv_close(MPL *mpl) { TABDCA *dca = mpl->dca; int ret; switch (dca->id) { case TAB_CSV: ret = csv_close_file(dca, dca->link); break; case TAB_XBASE: ret = dbf_close_file(dca, dca->link); break; case TAB_ODBC: ret = db_iodbc_close(dca, dca->link); break; case TAB_MYSQL: ret = db_mysql_close(dca, dca->link); break; default: xassert(dca != dca); } dca->id = 0; dca->link = NULL; if (ret) error(mpl, "error on closing table %s", mpl->stmt->u.tab->name); return; } /* eof */ glpk-5.0/src/mpl/mplsql.c0000644000062000006210000013312213766346220014537 0ustar maomkpasswd/* mplsql.c */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2003-2017 Free Software Foundation, Inc. * Written by Heinrich Schuchardt . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifdef HAVE_CONFIG_H #include #endif #include "mpl.h" #include "mplsql.h" #ifdef ODBC_DLNAME #define HAVE_ODBC #define libodbc ODBC_DLNAME #define h_odbc (get_env_ptr()->h_odbc) #endif #ifdef MYSQL_DLNAME #define HAVE_MYSQL #define libmysql MYSQL_DLNAME #define h_mysql (get_env_ptr()->h_mysql) #endif static void *db_iodbc_open_int(TABDCA *dca, int mode, const char **sqllines); static void *db_mysql_open_int(TABDCA *dca, int mode, const char **sqllines); /**********************************************************************/ #if defined(HAVE_ODBC) || defined(HAVE_MYSQL) #define SQL_FIELD_MAX 100 /* maximal field count */ #define SQL_FDLEN_MAX 255 /* maximal field length */ /*********************************************************************** * NAME * * args_concat - concatenate arguments * * SYNOPSIS * * static char **args_concat(TABDCA *dca); * * DESCRIPTION * * The arguments passed in dca are SQL statements. A SQL statement may * be split over multiple arguments. The last argument of a SQL * statement will be terminated with a semilocon. Each SQL statement is * merged into a single zero terminated string. Boundaries between * arguments are replaced by space. * * RETURNS * * Buffer with SQL statements */ static char **args_concat(TABDCA *dca) { const char *arg; int i; int j; int j0; int j1; size_t len; int lentot; int narg; int nline = 0; char **sqllines = NULL; narg = mpl_tab_num_args(dca); /* The SQL statements start with argument 3. */ if (narg < 3) return NULL; /* Count the SQL statements */ for (j = 3; j <= narg; j++) { arg = mpl_tab_get_arg(dca, j); len = strlen(arg); if (arg[len-1] == ';' || j == narg) nline ++; } /* Allocate string buffer. */ sqllines = (char **) xmalloc((nline+1) * sizeof(char **)); /* Join arguments */ sqllines[0] = NULL; j0 = 3; i = 0; lentot = 0; for (j = 3; j <= narg; j++) { arg = mpl_tab_get_arg(dca, j); len = strlen(arg); /* add length of part */ lentot += len; /* add length of space separating parts or 0x00 at end of SQL statement */ lentot++; if (arg[len-1] == ';' || j == narg) { /* Join arguments for a single SQL statement */ sqllines[i] = xmalloc(lentot); sqllines[i+1] = NULL; sqllines[i][0] = 0x00; for (j1 = j0; j1 <= j; j1++) { if(j1>j0) strcat(sqllines[i], " "); strcat(sqllines[i], mpl_tab_get_arg(dca, j1)); } len = strlen(sqllines[i]); if (sqllines[i][len-1] == ';') sqllines[i][len-1] = 0x00; j0 = j+1; i++; lentot = 0; } } return sqllines; } /*********************************************************************** * NAME * * free_buffer - free multiline string buffer * * SYNOPSIS * * static void free_buffer(char **buf); * * DESCRIPTION * * buf is a list of strings terminated by NULL. * The memory for the strings and for the list is released. */ static void free_buffer(char **buf) { int i; for(i = 0; buf[i] != NULL; i++) xfree(buf[i]); xfree(buf); } static int db_escaped_string_length(const char* from) /* length of escaped string */ { int count; const char *pointer; for (pointer = from, count = 0; *pointer != (char) '\0'; pointer++, count++) { switch (*pointer) { case '\'': count++; break; } } return count; } static void db_escape_string (char *to, const char *from) /* escape string*/ { const char *source = from; char *target = to; size_t remaining; remaining = strlen(from); if (to == NULL) to = (char *) (from + remaining); while (remaining > 0) { switch (*source) { case '\'': *target = '\''; target++; *target = '\''; break; default: *target = *source; } source++; target++; remaining--; } /* Write the terminating NUL character. */ *target = '\0'; } static char *db_generate_select_stmt(TABDCA *dca) /* generate select statement */ { char *arg; char const *field; char *query; int j; int narg; int nf; int total; total = 50; nf = mpl_tab_num_flds(dca); narg = mpl_tab_num_args(dca); for (j=1; j <= nf && j <= SQL_FIELD_MAX; j++) { field = mpl_tab_get_name(dca, j); total += strlen(field); total += 2; } arg = (char *) mpl_tab_get_arg(dca, narg); total += strlen(arg); query = xmalloc( total * sizeof(char)); strcpy (query, "SELECT "); for (j=1; j <= nf && j <= SQL_FIELD_MAX; j++) { field = mpl_tab_get_name(dca, j); strcat(query, field); if ( j < nf ) strcat(query, ", "); } strcat(query, " FROM "); strcat(query, arg); return query; } static char *db_generate_insert_stmt(TABDCA *dca) /* generate insert statement */ { char *arg; char const *field; char *query; int j; int narg; int nf; int total; total = 50; nf = mpl_tab_num_flds(dca); narg = mpl_tab_num_args(dca); for (j=1; j <= nf && j <= SQL_FIELD_MAX; j++) { field = mpl_tab_get_name(dca, j); total += strlen(field); total += 5; } arg = (char *) mpl_tab_get_arg(dca, narg); total += strlen(arg); query = xmalloc( (total+1) * sizeof(char)); strcpy (query, "INSERT INTO "); strcat(query, arg); strcat(query, " ( "); for (j=1; j <= nf && j <= SQL_FIELD_MAX; j++) { field = mpl_tab_get_name(dca, j); strcat(query, field); if ( j < nf ) strcat(query, ", "); } strcat(query, " ) VALUES ( "); for (j=1; j <= nf && j <= SQL_FIELD_MAX; j++) { strcat(query, "?"); if ( j < nf ) strcat(query, ", "); } strcat(query, " )"); return query; } #endif /**********************************************************************/ #ifndef HAVE_ODBC void *db_iodbc_open(TABDCA *dca, int mode) { xassert(dca == dca); xassert(mode == mode); xprintf("iODBC table driver not supported\n"); return NULL; } int db_iodbc_read(TABDCA *dca, void *link) { xassert(dca != dca); xassert(link != link); return 0; } int db_iodbc_write(TABDCA *dca, void *link) { xassert(dca != dca); xassert(link != link); return 0; } int db_iodbc_close(TABDCA *dca, void *link) { xassert(dca != dca); xassert(link != link); return 0; } #else #if defined(__CYGWIN__) || defined(__MINGW32__) || defined(__WOE__) #include #endif #include #include struct db_odbc { int mode; /*'R' = Read, 'W' = Write*/ SQLHDBC hdbc; /*connection handle*/ SQLHENV henv; /*environment handle*/ SQLHSTMT hstmt; /*statement handle*/ SQLSMALLINT nresultcols; /* columns in result*/ SQLULEN collen[SQL_FIELD_MAX+1]; SQLLEN outlen[SQL_FIELD_MAX+1]; SQLSMALLINT coltype[SQL_FIELD_MAX+1]; SQLCHAR data[SQL_FIELD_MAX+1][SQL_FDLEN_MAX+1]; #if 1 /* 12/I-2014 */ SQLDOUBLE datanum[SQL_FIELD_MAX+1]; #endif SQLCHAR colname[SQL_FIELD_MAX+1][SQL_FDLEN_MAX+1]; int isnumeric[SQL_FIELD_MAX+1]; int nf; /* number of fields in the csv file */ int ref[1+SQL_FIELD_MAX]; /* ref[k] = k', if k-th field of the csv file corresponds to k'-th field in the table statement; if ref[k] = 0, k-th field of the csv file is ignored */ SQLCHAR *query; /* query generated by db_iodbc_open */ }; SQLRETURN SQL_API dl_SQLAllocHandle ( SQLSMALLINT HandleType, SQLHANDLE InputHandle, SQLHANDLE *OutputHandle) { typedef SQLRETURN SQL_API ep_SQLAllocHandle( SQLSMALLINT HandleType, SQLHANDLE InputHandle, SQLHANDLE *OutputHandle); ep_SQLAllocHandle *fn; fn = (ep_SQLAllocHandle *) xdlsym(h_odbc, "SQLAllocHandle"); xassert(fn != NULL); return (*fn)(HandleType, InputHandle, OutputHandle); } SQLRETURN SQL_API dl_SQLBindCol ( SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber, SQLSMALLINT TargetType, SQLPOINTER TargetValue, SQLLEN BufferLength, SQLLEN *StrLen_or_Ind) { typedef SQLRETURN SQL_API ep_SQLBindCol( SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber, SQLSMALLINT TargetType, SQLPOINTER TargetValue, SQLLEN BufferLength, SQLLEN *StrLen_or_Ind); ep_SQLBindCol *fn; fn = (ep_SQLBindCol *) xdlsym(h_odbc, "SQLBindCol"); xassert(fn != NULL); return (*fn)(StatementHandle, ColumnNumber, TargetType, TargetValue, BufferLength, StrLen_or_Ind); } SQLRETURN SQL_API dl_SQLCloseCursor ( SQLHSTMT StatementHandle) { typedef SQLRETURN SQL_API ep_SQLCloseCursor ( SQLHSTMT StatementHandle); ep_SQLCloseCursor *fn; fn = (ep_SQLCloseCursor *) xdlsym(h_odbc, "SQLCloseCursor"); xassert(fn != NULL); return (*fn)(StatementHandle); } SQLRETURN SQL_API dl_SQLDisconnect ( SQLHDBC ConnectionHandle) { typedef SQLRETURN SQL_API ep_SQLDisconnect( SQLHDBC ConnectionHandle); ep_SQLDisconnect *fn; fn = (ep_SQLDisconnect *) xdlsym(h_odbc, "SQLDisconnect"); xassert(fn != NULL); return (*fn)(ConnectionHandle); } SQLRETURN SQL_API dl_SQLDriverConnect ( SQLHDBC hdbc, SQLHWND hwnd, SQLCHAR *szConnStrIn, SQLSMALLINT cbConnStrIn, SQLCHAR *szConnStrOut, SQLSMALLINT cbConnStrOutMax, SQLSMALLINT *pcbConnStrOut, SQLUSMALLINT fDriverCompletion) { typedef SQLRETURN SQL_API ep_SQLDriverConnect( SQLHDBC hdbc, SQLHWND hwnd, SQLCHAR * szConnStrIn, SQLSMALLINT cbConnStrIn, SQLCHAR * szConnStrOut, SQLSMALLINT cbConnStrOutMax, SQLSMALLINT * pcbConnStrOut, SQLUSMALLINT fDriverCompletion); ep_SQLDriverConnect *fn; fn = (ep_SQLDriverConnect *) xdlsym(h_odbc, "SQLDriverConnect"); xassert(fn != NULL); return (*fn)(hdbc, hwnd, szConnStrIn, cbConnStrIn, szConnStrOut, cbConnStrOutMax, pcbConnStrOut, fDriverCompletion); } SQLRETURN SQL_API dl_SQLEndTran ( SQLSMALLINT HandleType, SQLHANDLE Handle, SQLSMALLINT CompletionType) { typedef SQLRETURN SQL_API ep_SQLEndTran ( SQLSMALLINT HandleType, SQLHANDLE Handle, SQLSMALLINT CompletionType); ep_SQLEndTran *fn; fn = (ep_SQLEndTran *) xdlsym(h_odbc, "SQLEndTran"); xassert(fn != NULL); return (*fn)(HandleType, Handle, CompletionType); } SQLRETURN SQL_API dl_SQLExecDirect ( SQLHSTMT StatementHandle, SQLCHAR * StatementText, SQLINTEGER TextLength) { typedef SQLRETURN SQL_API ep_SQLExecDirect ( SQLHSTMT StatementHandle, SQLCHAR * StatementText, SQLINTEGER TextLength); ep_SQLExecDirect *fn; fn = (ep_SQLExecDirect *) xdlsym(h_odbc, "SQLExecDirect"); xassert(fn != NULL); return (*fn)(StatementHandle, StatementText, TextLength); } SQLRETURN SQL_API dl_SQLFetch ( SQLHSTMT StatementHandle) { typedef SQLRETURN SQL_API ep_SQLFetch ( SQLHSTMT StatementHandle); ep_SQLFetch *fn; fn = (ep_SQLFetch*) xdlsym(h_odbc, "SQLFetch"); xassert(fn != NULL); return (*fn)(StatementHandle); } SQLRETURN SQL_API dl_SQLFreeHandle ( SQLSMALLINT HandleType, SQLHANDLE Handle) { typedef SQLRETURN SQL_API ep_SQLFreeHandle ( SQLSMALLINT HandleType, SQLHANDLE Handle); ep_SQLFreeHandle *fn; fn = (ep_SQLFreeHandle *) xdlsym(h_odbc, "SQLFreeHandle"); xassert(fn != NULL); return (*fn)(HandleType, Handle); } SQLRETURN SQL_API dl_SQLDescribeCol ( SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber, SQLCHAR * ColumnName, SQLSMALLINT BufferLength, SQLSMALLINT * NameLength, SQLSMALLINT * DataType, SQLULEN * ColumnSize, SQLSMALLINT * DecimalDigits, SQLSMALLINT * Nullable) { typedef SQLRETURN SQL_API ep_SQLDescribeCol ( SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber, SQLCHAR *ColumnName, SQLSMALLINT BufferLength, SQLSMALLINT *NameLength, SQLSMALLINT *DataType, SQLULEN *ColumnSize, SQLSMALLINT *DecimalDigits, SQLSMALLINT *Nullable); ep_SQLDescribeCol *fn; fn = (ep_SQLDescribeCol *) xdlsym(h_odbc, "SQLDescribeCol"); xassert(fn != NULL); return (*fn)(StatementHandle, ColumnNumber, ColumnName, BufferLength, NameLength, DataType, ColumnSize, DecimalDigits, Nullable); } SQLRETURN SQL_API dl_SQLGetDiagRec ( SQLSMALLINT HandleType, SQLHANDLE Handle, SQLSMALLINT RecNumber, SQLCHAR *Sqlstate, SQLINTEGER *NativeError, SQLCHAR *MessageText, SQLSMALLINT BufferLength, SQLSMALLINT *TextLength) { typedef SQLRETURN SQL_API ep_SQLGetDiagRec ( SQLSMALLINT HandleType, SQLHANDLE Handle, SQLSMALLINT RecNumber, SQLCHAR *Sqlstate, SQLINTEGER *NativeError, SQLCHAR *MessageText, SQLSMALLINT BufferLength, SQLSMALLINT *TextLength); ep_SQLGetDiagRec *fn; fn = (ep_SQLGetDiagRec *) xdlsym(h_odbc, "SQLGetDiagRec"); xassert(fn != NULL); return (*fn)(HandleType, Handle, RecNumber, Sqlstate, NativeError, MessageText, BufferLength, TextLength); } SQLRETURN SQL_API dl_SQLGetInfo ( SQLHDBC ConnectionHandle, SQLUSMALLINT InfoType, SQLPOINTER InfoValue, SQLSMALLINT BufferLength, SQLSMALLINT *StringLength) { typedef SQLRETURN SQL_API ep_SQLGetInfo ( SQLHDBC ConnectionHandle, SQLUSMALLINT InfoType, SQLPOINTER InfoValue, SQLSMALLINT BufferLength, SQLSMALLINT *StringLength); ep_SQLGetInfo *fn; fn = (ep_SQLGetInfo *) xdlsym(h_odbc, "SQLGetInfo"); xassert(fn != NULL); return (*fn)(ConnectionHandle, InfoType, InfoValue, BufferLength, StringLength); } SQLRETURN SQL_API dl_SQLNumResultCols ( SQLHSTMT StatementHandle, SQLSMALLINT *ColumnCount) { typedef SQLRETURN SQL_API ep_SQLNumResultCols ( SQLHSTMT StatementHandle, SQLSMALLINT *ColumnCount); ep_SQLNumResultCols *fn; fn = (ep_SQLNumResultCols *) xdlsym(h_odbc, "SQLNumResultCols"); xassert(fn != NULL); return (*fn)(StatementHandle, ColumnCount); } SQLRETURN SQL_API dl_SQLSetConnectAttr ( SQLHDBC ConnectionHandle, SQLINTEGER Attribute, SQLPOINTER Value, SQLINTEGER StringLength) { typedef SQLRETURN SQL_API ep_SQLSetConnectAttr ( SQLHDBC ConnectionHandle, SQLINTEGER Attribute, SQLPOINTER Value, SQLINTEGER StringLength); ep_SQLSetConnectAttr *fn; fn = (ep_SQLSetConnectAttr *) xdlsym(h_odbc, "SQLSetConnectAttr"); xassert(fn != NULL); return (*fn)(ConnectionHandle, Attribute, Value, StringLength); } SQLRETURN SQL_API dl_SQLSetEnvAttr ( SQLHENV EnvironmentHandle, SQLINTEGER Attribute, SQLPOINTER Value, SQLINTEGER StringLength) { typedef SQLRETURN SQL_API ep_SQLSetEnvAttr ( SQLHENV EnvironmentHandle, SQLINTEGER Attribute, SQLPOINTER Value, SQLINTEGER StringLength); ep_SQLSetEnvAttr *fn; fn = (ep_SQLSetEnvAttr *) xdlsym(h_odbc, "SQLSetEnvAttr"); xassert(fn != NULL); return (*fn)(EnvironmentHandle, Attribute, Value, StringLength); } static void extract_error( char *fn, SQLHANDLE handle, SQLSMALLINT type); static int is_numeric( SQLSMALLINT coltype); /*********************************************************************** * NAME * * db_iodbc_open - open connection to ODBC data base * * SYNOPSIS * * #include "mplsql.h" * void *db_iodbc_open(TABDCA *dca, int mode); * * DESCRIPTION * * The routine db_iodbc_open opens a connection to an ODBC data base. * It then executes the sql statements passed. * * In the case of table read the SELECT statement is executed. * * In the case of table write the INSERT statement is prepared. * RETURNS * * The routine returns a pointer to data storage area created. */ void *db_iodbc_open(TABDCA *dca, int mode) { void *ret; char **sqllines; sqllines = args_concat(dca); if (sqllines == NULL) { xprintf("Missing arguments in table statement.\n" "Please, supply table driver, dsn, and query.\n"); return NULL; } ret = db_iodbc_open_int(dca, mode, (const char **) sqllines); free_buffer(sqllines); return ret; } static void *db_iodbc_open_int(TABDCA *dca, int mode, const char **sqllines) { struct db_odbc *sql; SQLRETURN ret; SQLCHAR FAR *dsn; SQLCHAR info[256]; SQLSMALLINT colnamelen; SQLSMALLINT nullable; SQLSMALLINT scale; const char *arg; int narg; int i, j; int total; if (libodbc == NULL) { xprintf("No loader for shared ODBC library available\n"); return NULL; } if (h_odbc == NULL) { h_odbc = xdlopen(libodbc); if (h_odbc == NULL) { xprintf("unable to open library %s\n", libodbc); xprintf("%s\n", get_err_msg()); return NULL; } } sql = (struct db_odbc *) xmalloc(sizeof(struct db_odbc)); if (sql == NULL) return NULL; sql->mode = mode; sql->hdbc = NULL; sql->henv = NULL; sql->hstmt = NULL; sql->query = NULL; narg = mpl_tab_num_args(dca); dsn = (SQLCHAR FAR *) mpl_tab_get_arg(dca, 2); /* allocate an environment handle */ ret = dl_SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &(sql->henv)); /* set attribute to enable application to run as ODBC 3.0 application */ ret = dl_SQLSetEnvAttr(sql->henv, SQL_ATTR_ODBC_VERSION, (void *) SQL_OV_ODBC3, 0); /* allocate a connection handle */ ret = dl_SQLAllocHandle(SQL_HANDLE_DBC, sql->henv, &(sql->hdbc)); /* connect */ ret = dl_SQLDriverConnect(sql->hdbc, NULL, dsn, SQL_NTS, NULL, 0, NULL, SQL_DRIVER_COMPLETE); if (SQL_SUCCEEDED(ret)) { /* output information about data base connection */ xprintf("Connected to "); dl_SQLGetInfo(sql->hdbc, SQL_DBMS_NAME, (SQLPOINTER)info, sizeof(info), NULL); xprintf("%s ", info); dl_SQLGetInfo(sql->hdbc, SQL_DBMS_VER, (SQLPOINTER)info, sizeof(info), NULL); xprintf("%s - ", info); dl_SQLGetInfo(sql->hdbc, SQL_DATABASE_NAME, (SQLPOINTER)info, sizeof(info), NULL); xprintf("%s\n", info); } else { /* describe error */ xprintf("Failed to connect\n"); extract_error("SQLDriverConnect", sql->hdbc, SQL_HANDLE_DBC); dl_SQLFreeHandle(SQL_HANDLE_DBC, sql->hdbc); dl_SQLFreeHandle(SQL_HANDLE_ENV, sql->henv); xfree(sql); return NULL; } /* set AUTOCOMMIT on*/ ret = dl_SQLSetConnectAttr(sql->hdbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_ON, 0); /* allocate a statement handle */ ret = dl_SQLAllocHandle(SQL_HANDLE_STMT, sql->hdbc, &(sql->hstmt)); /* initialization queries */ for(j = 0; sqllines[j+1] != NULL; j++) { sql->query = (SQLCHAR *) sqllines[j]; xprintf("%s\n", sql->query); ret = dl_SQLExecDirect(sql->hstmt, sql->query, SQL_NTS); switch (ret) { case SQL_SUCCESS: case SQL_SUCCESS_WITH_INFO: case SQL_NO_DATA_FOUND: break; default: xprintf("db_iodbc_open: Query\n\"%s\"\nfailed.\n", sql->query); extract_error("SQLExecDirect", sql->hstmt, SQL_HANDLE_STMT); dl_SQLFreeHandle(SQL_HANDLE_STMT, sql->hstmt); dl_SQLDisconnect(sql->hdbc); dl_SQLFreeHandle(SQL_HANDLE_DBC, sql->hdbc); dl_SQLFreeHandle(SQL_HANDLE_ENV, sql->henv); xfree(sql); return NULL; } /* commit statement */ dl_SQLEndTran(SQL_HANDLE_ENV, sql->henv, SQL_COMMIT); } if ( sql->mode == 'R' ) { sql->nf = mpl_tab_num_flds(dca); for(j = 0; sqllines[j] != NULL; j++) arg = sqllines[j]; total = strlen(arg); if (total > 7 && 0 == strncmp(arg, "SELECT ", 7)) { total = strlen(arg); sql->query = xmalloc( (total+1) * sizeof(char)); strcpy (sql->query, arg); } else { sql->query = db_generate_select_stmt(dca); } xprintf("%s\n", sql->query); if (dl_SQLExecDirect(sql->hstmt, sql->query, SQL_NTS) != SQL_SUCCESS) { xprintf("db_iodbc_open: Query\n\"%s\"\nfailed.\n", sql->query); extract_error("SQLExecDirect", sql->hstmt, SQL_HANDLE_STMT); dl_SQLFreeHandle(SQL_HANDLE_STMT, sql->hstmt); dl_SQLDisconnect(sql->hdbc); dl_SQLFreeHandle(SQL_HANDLE_DBC, sql->hdbc); dl_SQLFreeHandle(SQL_HANDLE_ENV, sql->henv); xfree(sql->query); xfree(sql); return NULL; } xfree(sql->query); /* determine number of result columns */ ret = dl_SQLNumResultCols(sql->hstmt, &sql->nresultcols); total = sql->nresultcols; if (total > SQL_FIELD_MAX) { xprintf("db_iodbc_open: Too many fields (> %d) in query.\n" "\"%s\"\n", SQL_FIELD_MAX, sql->query); dl_SQLFreeHandle(SQL_HANDLE_STMT, sql->hstmt); dl_SQLDisconnect(sql->hdbc); dl_SQLFreeHandle(SQL_HANDLE_DBC, sql->hdbc); dl_SQLFreeHandle(SQL_HANDLE_ENV, sql->henv); xfree(sql->query); return NULL; } for (i = 1; i <= total; i++) { /* return a set of attributes for a column */ ret = dl_SQLDescribeCol(sql->hstmt, (SQLSMALLINT) i, sql->colname[i], SQL_FDLEN_MAX, &colnamelen, &(sql->coltype[i]), &(sql->collen[i]), &scale, &nullable); sql->isnumeric[i] = is_numeric(sql->coltype[i]); /* bind columns to program vars, converting all types to CHAR*/ if (sql->isnumeric[i]) #if 0 /* 12/I-2014 */ { dl_SQLBindCol(sql->hstmt, i, SQL_DOUBLE, sql->data[i], #else { dl_SQLBindCol(sql->hstmt, i, SQL_DOUBLE, &sql->datanum[i], #endif SQL_FDLEN_MAX, &(sql->outlen[i])); } else { dl_SQLBindCol(sql->hstmt, i, SQL_CHAR, sql->data[i], SQL_FDLEN_MAX, &(sql->outlen[i])); } for (j = sql->nf; j >= 1; j--) { if (strcmp(mpl_tab_get_name(dca, j), sql->colname[i]) == 0) break; } sql->ref[i] = j; } } else if ( sql->mode == 'W' ) { for(j = 0; sqllines[j] != NULL; j++) arg = sqllines[j]; if ( NULL != strchr(arg, '?') ) { total = strlen(arg); sql->query = xmalloc( (total+1) * sizeof(char)); strcpy (sql->query, arg); } else { sql->query = db_generate_insert_stmt(dca); } xprintf("%s\n", sql->query); } return sql; } int db_iodbc_read(TABDCA *dca, void *link) { struct db_odbc *sql; SQLRETURN ret; char buf[SQL_FDLEN_MAX+1]; int i; int len; double num; sql = (struct db_odbc *) link; xassert(sql != NULL); xassert(sql->mode == 'R'); ret=dl_SQLFetch(sql->hstmt); if (ret== SQL_ERROR) return -1; if (ret== SQL_NO_DATA_FOUND) return -1; /*EOF*/ for (i=1; i <= sql->nresultcols; i++) { if (sql->ref[i] > 0) { len = sql->outlen[i]; if (len != SQL_NULL_DATA) { if (sql->isnumeric[i]) { mpl_tab_set_num(dca, sql->ref[i], #if 0 /* 12/I-2014 */ *((const double *) sql->data[i])); #else (const double) sql->datanum[i]); #endif } else { if (len > SQL_FDLEN_MAX) len = SQL_FDLEN_MAX; else if (len < 0) len = 0; strncpy(buf, (const char *) sql->data[i], len); buf[len] = 0x00; mpl_tab_set_str(dca, sql->ref[i], strtrim(buf)); } } } } return 0; } int db_iodbc_write(TABDCA *dca, void *link) { struct db_odbc *sql; char *part; char *query; char *template; char num[50]; int k; int len; int nf; sql = (struct db_odbc *) link; xassert(sql != NULL); xassert(sql->mode == 'W'); len = strlen(sql->query); template = (char *) xmalloc( (len + 1) * sizeof(char) ); strcpy(template, sql->query); nf = mpl_tab_num_flds(dca); for (k = 1; k <= nf; k++) { switch (mpl_tab_get_type(dca, k)) { case 'N': len += 20; break; case 'S': len += db_escaped_string_length(mpl_tab_get_str(dca, k)); len += 2; break; default: xassert(dca != dca); } } query = xmalloc( (len + 1 ) * sizeof(char) ); query[0] = 0x00; #if 0 /* 29/I-2017 */ for (k = 1, part = strtok (template, "?"); (part != NULL); part = strtok (NULL, "?"), k++) #else for (k = 1, part = xstrtok (template, "?"); (part != NULL); part = xstrtok (NULL, "?"), k++) #endif { if (k > nf) break; strcat( query, part ); switch (mpl_tab_get_type(dca, k)) { case 'N': #if 0 /* 02/XI-2010 by xypron */ sprintf(num, "%-18g",mpl_tab_get_num(dca, k)); #else sprintf(num, "%.*g", DBL_DIG, mpl_tab_get_num(dca, k)); #endif strcat( query, num ); break; case 'S': strcat( query, "'"); db_escape_string( query + strlen(query), mpl_tab_get_str(dca, k) ); strcat( query, "'"); break; default: xassert(dca != dca); } } if (part != NULL) strcat(query, part); if (dl_SQLExecDirect(sql->hstmt, (SQLCHAR *) query, SQL_NTS) != SQL_SUCCESS) { xprintf("db_iodbc_write: Query\n\"%s\"\nfailed.\n", query); extract_error("SQLExecDirect", sql->hdbc, SQL_HANDLE_DBC); xfree(query); xfree(template); return 1; } xfree(query); xfree(template); return 0; } int db_iodbc_close(TABDCA *dca, void *link) { struct db_odbc *sql; sql = (struct db_odbc *) link; xassert(sql != NULL); /* Commit */ if ( sql->mode == 'W' ) dl_SQLEndTran(SQL_HANDLE_ENV, sql->henv, SQL_COMMIT); if ( sql->mode == 'R' ) dl_SQLCloseCursor(sql->hstmt); dl_SQLFreeHandle(SQL_HANDLE_STMT, sql->hstmt); dl_SQLDisconnect(sql->hdbc); dl_SQLFreeHandle(SQL_HANDLE_DBC, sql->hdbc); dl_SQLFreeHandle(SQL_HANDLE_ENV, sql->henv); if ( sql->mode == 'W' ) xfree(sql->query); xfree(sql); dca->link = NULL; return 0; } static void extract_error( char *fn, SQLHANDLE handle, SQLSMALLINT type) { SQLINTEGER i = 0; SQLINTEGER native; SQLCHAR state[ 7 ]; SQLCHAR text[256]; SQLSMALLINT len; SQLRETURN ret; xprintf("\nThe driver reported the following diagnostics whilst " "running %s\n", fn); do { ret = dl_SQLGetDiagRec(type, handle, ++i, state, &native, text, sizeof(text), &len ); if (SQL_SUCCEEDED(ret)) xprintf("%s:%ld:%ld:%s\n", state, i, native, text); } while( ret == SQL_SUCCESS ); } static int is_numeric(SQLSMALLINT coltype) { int ret = 0; switch (coltype) { case SQL_DECIMAL: case SQL_NUMERIC: case SQL_SMALLINT: case SQL_INTEGER: case SQL_REAL: case SQL_FLOAT: case SQL_DOUBLE: case SQL_TINYINT: case SQL_BIGINT: ret = 1; break; } return ret; } #endif /**********************************************************************/ #ifndef HAVE_MYSQL void *db_mysql_open(TABDCA *dca, int mode) { xassert(dca == dca); xassert(mode == mode); xprintf("MySQL table driver not supported\n"); return NULL; } int db_mysql_read(TABDCA *dca, void *link) { xassert(dca != dca); xassert(link != link); return 0; } int db_mysql_write(TABDCA *dca, void *link) { xassert(dca != dca); xassert(link != link); return 0; } int db_mysql_close(TABDCA *dca, void *link) { xassert(dca != dca); xassert(link != link); return 0; } #else #if defined(__CYGWIN__) || defined(__MINGW32__) || defined(__WOE__) #include #endif #ifdef __CYGWIN__ #define byte_defined 1 #endif #if 0 /* 12/II-2014; to fix namespace bug */ #include #include #endif #include struct db_mysql { int mode; /*'R' = Read, 'W' = Write*/ MYSQL *con; /*connection*/ MYSQL_RES *res; /*result*/ int nf; /* number of fields in the csv file */ int ref[1+SQL_FIELD_MAX]; /* ref[k] = k', if k-th field of the csv file corresponds to k'-th field in the table statement; if ref[k] = 0, k-th field of the csv file is ignored */ char *query; /* query generated by db_mysql_open */ }; void STDCALL dl_mysql_close(MYSQL *sock) { typedef void STDCALL ep_mysql_close(MYSQL *sock); ep_mysql_close *fn; fn = (ep_mysql_close *) xdlsym(h_mysql, "mysql_close"); xassert(fn != NULL); return (*fn)(sock); } const char * STDCALL dl_mysql_error(MYSQL *mysql) { typedef const char * STDCALL ep_mysql_error(MYSQL *mysql); ep_mysql_error *fn; fn = (ep_mysql_error *) xdlsym(h_mysql, "mysql_error"); xassert(fn != NULL); return (*fn)(mysql); } MYSQL_FIELD * STDCALL dl_mysql_fetch_fields(MYSQL_RES *res) { typedef MYSQL_FIELD * STDCALL ep_mysql_fetch_fields(MYSQL_RES *res); ep_mysql_fetch_fields *fn; fn = (ep_mysql_fetch_fields *) xdlsym(h_mysql, "mysql_fetch_fields"); xassert(fn != NULL); return (*fn)(res); } unsigned long * STDCALL dl_mysql_fetch_lengths(MYSQL_RES *result) { typedef unsigned long * STDCALL ep_mysql_fetch_lengths(MYSQL_RES *result); ep_mysql_fetch_lengths *fn; fn = (ep_mysql_fetch_lengths *) xdlsym(h_mysql, "mysql_fetch_lengths"); xassert(fn != NULL); return (*fn)(result); } MYSQL_ROW STDCALL dl_mysql_fetch_row(MYSQL_RES *result) { typedef MYSQL_ROW STDCALL ep_mysql_fetch_row(MYSQL_RES *result); ep_mysql_fetch_row *fn; fn = (ep_mysql_fetch_row *) xdlsym(h_mysql, "mysql_fetch_row"); xassert(fn != NULL); return (*fn)(result); } unsigned int STDCALL dl_mysql_field_count(MYSQL *mysql) { typedef unsigned int STDCALL ep_mysql_field_count(MYSQL *mysql); ep_mysql_field_count *fn; fn = (ep_mysql_field_count *) xdlsym(h_mysql, "mysql_field_count"); xassert(fn != NULL); return (*fn)(mysql); } MYSQL * STDCALL dl_mysql_init(MYSQL *mysql) { typedef MYSQL * STDCALL ep_mysql_init(MYSQL *mysql); ep_mysql_init *fn; fn = (ep_mysql_init *) xdlsym(h_mysql, "mysql_init"); xassert(fn != NULL); return (*fn)(mysql); } unsigned int STDCALL dl_mysql_num_fields(MYSQL_RES *res) { typedef unsigned int STDCALL ep_mysql_num_fields(MYSQL_RES *res); ep_mysql_num_fields *fn; fn = (ep_mysql_num_fields *) xdlsym(h_mysql, "mysql_num_fields"); xassert(fn != NULL); return (*fn)(res); } int STDCALL dl_mysql_query(MYSQL *mysql, const char *q) { typedef int STDCALL ep_mysql_query(MYSQL *mysql, const char *q); ep_mysql_query *fn; fn = (ep_mysql_query *) xdlsym(h_mysql, "mysql_query"); xassert(fn != NULL); return (*fn)(mysql, q); } MYSQL * STDCALL dl_mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long clientflag) { typedef MYSQL * STDCALL ep_mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long clientflag); ep_mysql_real_connect *fn; fn = (ep_mysql_real_connect *) xdlsym(h_mysql, "mysql_real_connect"); xassert(fn != NULL); return (*fn)(mysql, host, user, passwd, db, port, unix_socket, clientflag); } MYSQL_RES * STDCALL dl_mysql_use_result(MYSQL *mysql) { typedef MYSQL_RES * STDCALL ep_mysql_use_result(MYSQL *mysql); ep_mysql_use_result *fn; fn = (ep_mysql_use_result *) xdlsym(h_mysql, "mysql_use_result"); xassert(fn != NULL); return (*fn)(mysql); } /*********************************************************************** * NAME * * db_mysql_open - open connection to ODBC data base * * SYNOPSIS * * #include "mplsql.h" * void *db_mysql_open(TABDCA *dca, int mode); * * DESCRIPTION * * The routine db_mysql_open opens a connection to a MySQL data base. * It then executes the sql statements passed. * * In the case of table read the SELECT statement is executed. * * In the case of table write the INSERT statement is prepared. * RETURNS * * The routine returns a pointer to data storage area created. */ void *db_mysql_open(TABDCA *dca, int mode) { void *ret; char **sqllines; sqllines = args_concat(dca); if (sqllines == NULL) { xprintf("Missing arguments in table statement.\n" "Please, supply table driver, dsn, and query.\n"); return NULL; } ret = db_mysql_open_int(dca, mode, (const char **) sqllines); free_buffer(sqllines); return ret; } static void *db_mysql_open_int(TABDCA *dca, int mode, const char **sqllines) { struct db_mysql *sql = NULL; char *arg = NULL; const char *field; MYSQL_FIELD *fields; char *keyword; char *value; char *query; char *dsn; /* "Server=[server_name];Database=[database_name];UID=[username];*/ /* PWD=[password];Port=[port]"*/ char *server = NULL; /* Server */ char *user = NULL; /* UID */ char *password = NULL; /* PWD */ char *database = NULL; /* Database */ unsigned int port = 0; /* Port */ int narg; int i, j, total; if (libmysql == NULL) { xprintf("No loader for shared MySQL library available\n"); return NULL; } if (h_mysql == NULL) { h_mysql = xdlopen(libmysql); if (h_mysql == NULL) { xprintf("unable to open library %s\n", libmysql); xprintf("%s\n", get_err_msg()); return NULL; } } sql = (struct db_mysql *) xmalloc(sizeof(struct db_mysql)); if (sql == NULL) return NULL; sql->mode = mode; sql->res = NULL; sql->query = NULL; sql->nf = mpl_tab_num_flds(dca); narg = mpl_tab_num_args(dca); if (narg < 3 ) xprintf("MySQL driver: string list too short \n"); /* get connection string*/ dsn = (char *) mpl_tab_get_arg(dca, 2); /* copy connection string*/ i = strlen(dsn); i++; arg = xmalloc(i * sizeof(char)); strcpy(arg, dsn); /*tokenize connection string*/ #if 0 /* 29/I-2017 */ for (i = 1, keyword = strtok (arg, "="); (keyword != NULL); keyword = strtok (NULL, "="), i++) #else for (i = 1, keyword = xstrtok (arg, "="); (keyword != NULL); keyword = xstrtok (NULL, "="), i++) #endif { #if 0 /* 29/I-2017 */ value = strtok (NULL, ";"); #else value = xstrtok (NULL, ";"); #endif if (value==NULL) { xprintf("db_mysql_open: Missing value for keyword %s\n", keyword); xfree(arg); xfree(sql); return NULL; } if (0 == strcmp(keyword, "Server")) server = value; else if (0 == strcmp(keyword, "Database")) database = value; else if (0 == strcmp(keyword, "UID")) user = value; else if (0 == strcmp(keyword, "PWD")) password = value; else if (0 == strcmp(keyword, "Port")) port = (unsigned int) atol(value); } /* Connect to database */ sql->con = dl_mysql_init(NULL); if (!dl_mysql_real_connect(sql->con, server, user, password, database, port, NULL, 0)) { xprintf("db_mysql_open: Connect failed\n"); xprintf("%s\n", dl_mysql_error(sql->con)); xfree(arg); xfree(sql); return NULL; } xfree(arg); for(j = 0; sqllines[j+1] != NULL; j++) { query = (char *) sqllines[j]; xprintf("%s\n", query); if (dl_mysql_query(sql->con, query)) { xprintf("db_mysql_open: Query\n\"%s\"\nfailed.\n", query); xprintf("%s\n",dl_mysql_error(sql->con)); dl_mysql_close(sql->con); xfree(sql); return NULL; } } if ( sql->mode == 'R' ) { sql->nf = mpl_tab_num_flds(dca); for(j = 0; sqllines[j] != NULL; j++) arg = (char *) sqllines[j]; total = strlen(arg); if (total > 7 && 0 == strncmp(arg, "SELECT ", 7)) { total = strlen(arg); query = xmalloc( (total+1) * sizeof(char)); strcpy (query, arg); } else { query = db_generate_select_stmt(dca); } xprintf("%s\n", query); if (dl_mysql_query(sql->con, query)) { xprintf("db_mysql_open: Query\n\"%s\"\nfailed.\n", query); xprintf("%s\n",dl_mysql_error(sql->con)); dl_mysql_close(sql->con); xfree(query); xfree(sql); return NULL; } xfree(query); sql->res = dl_mysql_use_result(sql->con); if (sql->res) { /* create references between query results and table fields*/ total = dl_mysql_num_fields(sql->res); if (total > SQL_FIELD_MAX) { xprintf("db_mysql_open: Too many fields (> %d) in query.\n" "\"%s\"\n", SQL_FIELD_MAX, query); xprintf("%s\n",dl_mysql_error(sql->con)); dl_mysql_close(sql->con); xfree(query); xfree(sql); return NULL; } fields = dl_mysql_fetch_fields(sql->res); for (i = 1; i <= total; i++) { for (j = sql->nf; j >= 1; j--) { if (strcmp(mpl_tab_get_name(dca, j), fields[i-1].name) == 0) break; } sql->ref[i] = j; } } else { if(dl_mysql_field_count(sql->con) == 0) { xprintf("db_mysql_open: Query was not a SELECT\n\"%s\"\n", query); xprintf("%s\n",dl_mysql_error(sql->con)); xfree(query); xfree(sql); return NULL; } else { xprintf("db_mysql_open: Query\n\"%s\"\nfailed.\n", query); xprintf("%s\n",dl_mysql_error(sql->con)); xfree(query); xfree(sql); return NULL; } } } else if ( sql->mode == 'W' ) { for(j = 0; sqllines[j] != NULL; j++) arg = (char *) sqllines[j]; if ( NULL != strchr(arg, '?') ) { total = strlen(arg); query = xmalloc( (total+1) * sizeof(char)); strcpy (query, arg); } else query = db_generate_insert_stmt(dca); sql->query = query; xprintf("%s\n", query); } return sql; } int db_mysql_read(TABDCA *dca, void *link) { struct db_mysql *sql; char buf[255+1]; char **row; unsigned long *lengths; MYSQL_FIELD *fields; double num; int len; unsigned long num_fields; int i; sql = (struct db_mysql *) link; xassert(sql != NULL); xassert(sql->mode == 'R'); if (NULL == sql->res) { xprintf("db_mysql_read: no result set available"); return 1; } if (NULL==(row = (char **)dl_mysql_fetch_row(sql->res))) { return -1; /*EOF*/ } lengths = dl_mysql_fetch_lengths(sql->res); fields = dl_mysql_fetch_fields(sql->res); num_fields = dl_mysql_num_fields(sql->res); for (i=1; i <= num_fields; i++) { if (row[i-1] != NULL) { len = (size_t) lengths[i-1]; if (len > 255) len = 255; strncpy(buf, (const char *) row[i-1], len); buf[len] = 0x00; if (0 != (fields[i-1].flags & NUM_FLAG)) { strspx(buf); /* remove spaces*/ if (str2num(buf, &num) != 0) { xprintf("'%s' cannot be converted to a number.\n", buf); return 1; } if (sql->ref[i] > 0) mpl_tab_set_num(dca, sql->ref[i], num); } else { if (sql->ref[i] > 0) mpl_tab_set_str(dca, sql->ref[i], strtrim(buf)); } } } return 0; } int db_mysql_write(TABDCA *dca, void *link) { struct db_mysql *sql; char *part; char *query; char *template; char num[50]; int k; int len; int nf; sql = (struct db_mysql *) link; xassert(sql != NULL); xassert(sql->mode == 'W'); len = strlen(sql->query); template = (char *) xmalloc( (len + 1) * sizeof(char) ); strcpy(template, sql->query); nf = mpl_tab_num_flds(dca); for (k = 1; k <= nf; k++) { switch (mpl_tab_get_type(dca, k)) { case 'N': len += 20; break; case 'S': len += db_escaped_string_length(mpl_tab_get_str(dca, k)); len += 2; break; default: xassert(dca != dca); } } query = xmalloc( (len + 1 ) * sizeof(char) ); query[0] = 0x00; #if 0 /* 29/I-2017 */ for (k = 1, part = strtok (template, "?"); (part != NULL); part = strtok (NULL, "?"), k++) #else for (k = 1, part = xstrtok (template, "?"); (part != NULL); part = xstrtok (NULL, "?"), k++) #endif { if (k > nf) break; strcat( query, part ); switch (mpl_tab_get_type(dca, k)) { case 'N': #if 0 /* 02/XI-2010 by xypron */ sprintf(num, "%-18g",mpl_tab_get_num(dca, k)); #else sprintf(num, "%.*g", DBL_DIG, mpl_tab_get_num(dca, k)); #endif strcat( query, num ); break; case 'S': strcat( query, "'"); db_escape_string( query + strlen(query), mpl_tab_get_str(dca, k) ); strcat( query, "'"); break; default: xassert(dca != dca); } } if (part != NULL) strcat(query, part); if (dl_mysql_query(sql->con, query)) { xprintf("db_mysql_write: Query\n\"%s\"\nfailed.\n", query); xprintf("%s\n",dl_mysql_error(sql->con)); xfree(query); xfree(template); return 1; } xfree(query); xfree(template); return 0; } int db_mysql_close(TABDCA *dca, void *link) { struct db_mysql *sql; sql = (struct db_mysql *) link; xassert(sql != NULL); dl_mysql_close(sql->con); if ( sql->mode == 'W' ) xfree(sql->query); xfree(sql); dca->link = NULL; return 0; } #endif /* eof */ glpk-5.0/src/mpl/mplsql.h0000644000062000006210000000365513766346220014553 0ustar maomkpasswd/* mplsql.h */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2003-2016 Free Software Foundation, Inc. * Written by Heinrich Schuchardt . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef MPLSQL_H #define MPLSQL_H #define db_iodbc_open _glp_db_iodbc_open void *db_iodbc_open(TABDCA *dca, int mode); /* open iODBC database connection */ #define db_iodbc_read _glp_db_iodbc_read int db_iodbc_read(TABDCA *dca, void *link); /* read data from iODBC */ #define db_iodbc_write _glp_db_iodbc_write int db_iodbc_write(TABDCA *dca, void *link); /* write data to iODBC */ #define db_iodbc_close _glp_db_iodbc_close int db_iodbc_close(TABDCA *dca, void *link); /* close iODBC database connection */ #define db_mysql_open _glp_db_mysql_open void *db_mysql_open(TABDCA *dca, int mode); /* open MySQL database connection */ #define db_mysql_read _glp_db_mysql_read int db_mysql_read(TABDCA *dca, void *link); /* read data from MySQL */ #define db_mysql_write _glp_db_mysql_write int db_mysql_write(TABDCA *dca, void *link); /* write data to MySQL */ #define db_mysql_close _glp_db_mysql_close int db_mysql_close(TABDCA *dca, void *link); /* close MySQL database connection */ #endif /* eof */ glpk-5.0/src/npp/0000755000062000006210000000000013766346220013066 5ustar maomkpasswdglpk-5.0/src/npp/npp.h0000644000062000006210000005325313766346220014044 0ustar maomkpasswd/* npp.h (LP/MIP preprocessor) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2009-2017 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef NPP_H #define NPP_H #include "prob.h" #if 0 /* 20/XI-2017 */ typedef struct NPP NPP; #else typedef struct glp_prep NPP; #endif typedef struct NPPROW NPPROW; typedef struct NPPCOL NPPCOL; typedef struct NPPAIJ NPPAIJ; typedef struct NPPTSE NPPTSE; typedef struct NPPLFE NPPLFE; #if 0 /* 20/XI-2017 */ struct NPP #else struct glp_prep #endif { /* LP/MIP preprocessor workspace */ /*--------------------------------------------------------------*/ /* original problem segment */ int orig_dir; /* optimization direction flag: GLP_MIN - minimization GLP_MAX - maximization */ int orig_m; /* number of rows */ int orig_n; /* number of columns */ int orig_nnz; /* number of non-zero constraint coefficients */ /*--------------------------------------------------------------*/ /* transformed problem segment (always minimization) */ DMP *pool; /* memory pool to store problem components */ char *name; /* problem name (1 to 255 chars); NULL means no name is assigned to the problem */ char *obj; /* objective function name (1 to 255 chars); NULL means no name is assigned to the objective function */ double c0; /* constant term of the objective function */ int nrows; /* number of rows introduced into the problem; this count increases by one every time a new row is added and never decreases; thus, actual number of rows may be less than nrows due to row deletions */ int ncols; /* number of columns introduced into the problem; this count increases by one every time a new column is added and never decreases; thus, actual number of column may be less than ncols due to column deletions */ NPPROW *r_head; /* pointer to the beginning of the row list */ NPPROW *r_tail; /* pointer to the end of the row list */ NPPCOL *c_head; /* pointer to the beginning of the column list */ NPPCOL *c_tail; /* pointer to the end of the column list */ /*--------------------------------------------------------------*/ /* transformation history */ DMP *stack; /* memory pool to store transformation entries */ NPPTSE *top; /* pointer to most recent transformation entry */ #if 0 /* 16/XII-2009 */ int count[1+25]; /* transformation statistics */ #endif /*--------------------------------------------------------------*/ /* resultant (preprocessed) problem segment */ int m; /* number of rows */ int n; /* number of columns */ int nnz; /* number of non-zero constraint coefficients */ int *row_ref; /* int row_ref[1+m]; */ /* row_ref[i], 1 <= i <= m, is the reference number assigned to a row, which is i-th row of the resultant problem */ int *col_ref; /* int col_ref[1+n]; */ /* col_ref[j], 1 <= j <= n, is the reference number assigned to a column, which is j-th column of the resultant problem */ /*--------------------------------------------------------------*/ /* recovered solution segment */ int sol; /* solution indicator: GLP_SOL - basic solution GLP_IPT - interior-point solution GLP_MIP - mixed integer solution */ int scaling; /* scaling option: GLP_OFF - scaling is disabled GLP_ON - scaling is enabled */ int p_stat; /* status of primal basic solution: GLP_UNDEF - primal solution is undefined GLP_FEAS - primal solution is feasible GLP_INFEAS - primal solution is infeasible GLP_NOFEAS - no primal feasible solution exists */ int d_stat; /* status of dual basic solution: GLP_UNDEF - dual solution is undefined GLP_FEAS - dual solution is feasible GLP_INFEAS - dual solution is infeasible GLP_NOFEAS - no dual feasible solution exists */ int t_stat; /* status of interior-point solution: GLP_UNDEF - interior solution is undefined GLP_OPT - interior solution is optimal */ int i_stat; /* status of mixed integer solution: GLP_UNDEF - integer solution is undefined GLP_OPT - integer solution is optimal GLP_FEAS - integer solution is feasible GLP_NOFEAS - no integer solution exists */ char *r_stat; /* char r_stat[1+nrows]; */ /* r_stat[i], 1 <= i <= nrows, is status of i-th row: GLP_BS - inactive constraint GLP_NL - active constraint on lower bound GLP_NU - active constraint on upper bound GLP_NF - active free row GLP_NS - active equality constraint */ char *c_stat; /* char c_stat[1+nrows]; */ /* c_stat[j], 1 <= j <= nrows, is status of j-th column: GLP_BS - basic variable GLP_NL - non-basic variable on lower bound GLP_NU - non-basic variable on upper bound GLP_NF - non-basic free variable GLP_NS - non-basic fixed variable */ double *r_pi; /* double r_pi[1+nrows]; */ /* r_pi[i], 1 <= i <= nrows, is Lagrange multiplier (dual value) for i-th row (constraint) */ double *c_value; /* double c_value[1+ncols]; */ /* c_value[j], 1 <= j <= ncols, is primal value of j-th column (structural variable) */ }; struct NPPROW { /* row (constraint) */ int i; /* reference number assigned to the row, 1 <= i <= nrows */ char *name; /* row name (1 to 255 chars); NULL means no name is assigned to the row */ double lb; /* lower bound; -DBL_MAX means the row has no lower bound */ double ub; /* upper bound; +DBL_MAX means the row has no upper bound */ NPPAIJ *ptr; /* pointer to the linked list of constraint coefficients */ int temp; /* working field used by preprocessor routines */ NPPROW *prev; /* pointer to previous row in the row list */ NPPROW *next; /* pointer to next row in the row list */ }; struct NPPCOL { /* column (variable) */ int j; /* reference number assigned to the column, 1 <= j <= ncols */ char *name; /* column name (1 to 255 chars); NULL means no name is assigned to the column */ char is_int; /* 0 means continuous variable; 1 means integer variable */ double lb; /* lower bound; -DBL_MAX means the column has no lower bound */ double ub; /* upper bound; +DBL_MAX means the column has no upper bound */ double coef; /* objective coefficient */ NPPAIJ *ptr; /* pointer to the linked list of constraint coefficients */ int temp; /* working field used by preprocessor routines */ #if 1 /* 28/XII-2009 */ union { double ll; /* implied column lower bound */ int pos; /* vertex ordinal number corresponding to this binary column in the conflict graph (0, if the vertex does not exist) */ } ll; union { double uu; /* implied column upper bound */ int neg; /* vertex ordinal number corresponding to complement of this binary column in the conflict graph (0, if the vertex does not exist) */ } uu; #endif NPPCOL *prev; /* pointer to previous column in the column list */ NPPCOL *next; /* pointer to next column in the column list */ }; struct NPPAIJ { /* constraint coefficient */ NPPROW *row; /* pointer to corresponding row */ NPPCOL *col; /* pointer to corresponding column */ double val; /* (non-zero) coefficient value */ NPPAIJ *r_prev; /* pointer to previous coefficient in the same row */ NPPAIJ *r_next; /* pointer to next coefficient in the same row */ NPPAIJ *c_prev; /* pointer to previous coefficient in the same column */ NPPAIJ *c_next; /* pointer to next coefficient in the same column */ }; struct NPPTSE { /* transformation stack entry */ int (*func)(NPP *npp, void *info); /* pointer to routine performing back transformation */ void *info; /* pointer to specific info (depends on the transformation) */ NPPTSE *link; /* pointer to another entry created *before* this entry */ }; struct NPPLFE { /* linear form element */ int ref; /* row/column reference number */ double val; /* (non-zero) coefficient value */ NPPLFE *next; /* pointer to another element */ }; #define npp_create_wksp _glp_npp_create_wksp NPP *npp_create_wksp(void); /* create LP/MIP preprocessor workspace */ #define npp_insert_row _glp_npp_insert_row void npp_insert_row(NPP *npp, NPPROW *row, int where); /* insert row to the row list */ #define npp_remove_row _glp_npp_remove_row void npp_remove_row(NPP *npp, NPPROW *row); /* remove row from the row list */ #define npp_activate_row _glp_npp_activate_row void npp_activate_row(NPP *npp, NPPROW *row); /* make row active */ #define npp_deactivate_row _glp_npp_deactivate_row void npp_deactivate_row(NPP *npp, NPPROW *row); /* make row inactive */ #define npp_insert_col _glp_npp_insert_col void npp_insert_col(NPP *npp, NPPCOL *col, int where); /* insert column to the column list */ #define npp_remove_col _glp_npp_remove_col void npp_remove_col(NPP *npp, NPPCOL *col); /* remove column from the column list */ #define npp_activate_col _glp_npp_activate_col void npp_activate_col(NPP *npp, NPPCOL *col); /* make column active */ #define npp_deactivate_col _glp_npp_deactivate_col void npp_deactivate_col(NPP *npp, NPPCOL *col); /* make column inactive */ #define npp_add_row _glp_npp_add_row NPPROW *npp_add_row(NPP *npp); /* add new row to the current problem */ #define npp_add_col _glp_npp_add_col NPPCOL *npp_add_col(NPP *npp); /* add new column to the current problem */ #define npp_add_aij _glp_npp_add_aij NPPAIJ *npp_add_aij(NPP *npp, NPPROW *row, NPPCOL *col, double val); /* add new element to the constraint matrix */ #define npp_row_nnz _glp_npp_row_nnz int npp_row_nnz(NPP *npp, NPPROW *row); /* count number of non-zero coefficients in row */ #define npp_col_nnz _glp_npp_col_nnz int npp_col_nnz(NPP *npp, NPPCOL *col); /* count number of non-zero coefficients in column */ #define npp_push_tse _glp_npp_push_tse void *npp_push_tse(NPP *npp, int (*func)(NPP *npp, void *info), int size); /* push new entry to the transformation stack */ #define npp_erase_row _glp_npp_erase_row void npp_erase_row(NPP *npp, NPPROW *row); /* erase row content to make it empty */ #define npp_del_row _glp_npp_del_row void npp_del_row(NPP *npp, NPPROW *row); /* remove row from the current problem */ #define npp_del_col _glp_npp_del_col void npp_del_col(NPP *npp, NPPCOL *col); /* remove column from the current problem */ #define npp_del_aij _glp_npp_del_aij void npp_del_aij(NPP *npp, NPPAIJ *aij); /* remove element from the constraint matrix */ #define npp_load_prob _glp_npp_load_prob void npp_load_prob(NPP *npp, glp_prob *orig, int names, int sol, int scaling); /* load original problem into the preprocessor workspace */ #define npp_build_prob _glp_npp_build_prob void npp_build_prob(NPP *npp, glp_prob *prob); /* build resultant (preprocessed) problem */ #define npp_postprocess _glp_npp_postprocess void npp_postprocess(NPP *npp, glp_prob *prob); /* postprocess solution from the resultant problem */ #define npp_unload_sol _glp_npp_unload_sol void npp_unload_sol(NPP *npp, glp_prob *orig); /* store solution to the original problem */ #define npp_delete_wksp _glp_npp_delete_wksp void npp_delete_wksp(NPP *npp); /* delete LP/MIP preprocessor workspace */ #define npp_error() #define npp_free_row _glp_npp_free_row void npp_free_row(NPP *npp, NPPROW *p); /* process free (unbounded) row */ #define npp_geq_row _glp_npp_geq_row void npp_geq_row(NPP *npp, NPPROW *p); /* process row of 'not less than' type */ #define npp_leq_row _glp_npp_leq_row void npp_leq_row(NPP *npp, NPPROW *p); /* process row of 'not greater than' type */ #define npp_free_col _glp_npp_free_col void npp_free_col(NPP *npp, NPPCOL *q); /* process free (unbounded) column */ #define npp_lbnd_col _glp_npp_lbnd_col void npp_lbnd_col(NPP *npp, NPPCOL *q); /* process column with (non-zero) lower bound */ #define npp_ubnd_col _glp_npp_ubnd_col void npp_ubnd_col(NPP *npp, NPPCOL *q); /* process column with upper bound */ #define npp_dbnd_col _glp_npp_dbnd_col void npp_dbnd_col(NPP *npp, NPPCOL *q); /* process non-negative column with upper bound */ #define npp_fixed_col _glp_npp_fixed_col void npp_fixed_col(NPP *npp, NPPCOL *q); /* process fixed column */ #define npp_make_equality _glp_npp_make_equality int npp_make_equality(NPP *npp, NPPROW *p); /* process row with almost identical bounds */ #define npp_make_fixed _glp_npp_make_fixed int npp_make_fixed(NPP *npp, NPPCOL *q); /* process column with almost identical bounds */ #define npp_empty_row _glp_npp_empty_row int npp_empty_row(NPP *npp, NPPROW *p); /* process empty row */ #define npp_empty_col _glp_npp_empty_col int npp_empty_col(NPP *npp, NPPCOL *q); /* process empty column */ #define npp_implied_value _glp_npp_implied_value int npp_implied_value(NPP *npp, NPPCOL *q, double s); /* process implied column value */ #define npp_eq_singlet _glp_npp_eq_singlet int npp_eq_singlet(NPP *npp, NPPROW *p); /* process row singleton (equality constraint) */ #define npp_implied_lower _glp_npp_implied_lower int npp_implied_lower(NPP *npp, NPPCOL *q, double l); /* process implied column lower bound */ #define npp_implied_upper _glp_npp_implied_upper int npp_implied_upper(NPP *npp, NPPCOL *q, double u); /* process implied upper bound of column */ #define npp_ineq_singlet _glp_npp_ineq_singlet int npp_ineq_singlet(NPP *npp, NPPROW *p); /* process row singleton (inequality constraint) */ #define npp_implied_slack _glp_npp_implied_slack void npp_implied_slack(NPP *npp, NPPCOL *q); /* process column singleton (implied slack variable) */ #define npp_implied_free _glp_npp_implied_free int npp_implied_free(NPP *npp, NPPCOL *q); /* process column singleton (implied free variable) */ #define npp_eq_doublet _glp_npp_eq_doublet NPPCOL *npp_eq_doublet(NPP *npp, NPPROW *p); /* process row doubleton (equality constraint) */ #define npp_forcing_row _glp_npp_forcing_row int npp_forcing_row(NPP *npp, NPPROW *p, int at); /* process forcing row */ #define npp_analyze_row _glp_npp_analyze_row int npp_analyze_row(NPP *npp, NPPROW *p); /* perform general row analysis */ #define npp_inactive_bound _glp_npp_inactive_bound void npp_inactive_bound(NPP *npp, NPPROW *p, int which); /* remove row lower/upper inactive bound */ #define npp_implied_bounds _glp_npp_implied_bounds void npp_implied_bounds(NPP *npp, NPPROW *p); /* determine implied column bounds */ #define npp_binarize_prob _glp_npp_binarize_prob int npp_binarize_prob(NPP *npp); /* binarize MIP problem */ #define npp_is_packing _glp_npp_is_packing int npp_is_packing(NPP *npp, NPPROW *row); /* test if constraint is packing inequality */ #define npp_hidden_packing _glp_npp_hidden_packing int npp_hidden_packing(NPP *npp, NPPROW *row); /* identify hidden packing inequality */ #define npp_implied_packing _glp_npp_implied_packing int npp_implied_packing(NPP *npp, NPPROW *row, int which, NPPCOL *var[], char set[]); /* identify implied packing inequality */ #define npp_is_covering _glp_npp_is_covering int npp_is_covering(NPP *npp, NPPROW *row); /* test if constraint is covering inequality */ #define npp_hidden_covering _glp_npp_hidden_covering int npp_hidden_covering(NPP *npp, NPPROW *row); /* identify hidden covering inequality */ #define npp_is_partitioning _glp_npp_is_partitioning int npp_is_partitioning(NPP *npp, NPPROW *row); /* test if constraint is partitioning equality */ #define npp_reduce_ineq_coef _glp_npp_reduce_ineq_coef int npp_reduce_ineq_coef(NPP *npp, NPPROW *row); /* reduce inequality constraint coefficients */ #define npp_clean_prob _glp_npp_clean_prob void npp_clean_prob(NPP *npp); /* perform initial LP/MIP processing */ #define npp_process_row _glp_npp_process_row int npp_process_row(NPP *npp, NPPROW *row, int hard); /* perform basic row processing */ #define npp_improve_bounds _glp_npp_improve_bounds int npp_improve_bounds(NPP *npp, NPPROW *row, int flag); /* improve current column bounds */ #define npp_process_col _glp_npp_process_col int npp_process_col(NPP *npp, NPPCOL *col); /* perform basic column processing */ #define npp_process_prob _glp_npp_process_prob int npp_process_prob(NPP *npp, int hard); /* perform basic LP/MIP processing */ #define npp_simplex _glp_npp_simplex int npp_simplex(NPP *npp, const glp_smcp *parm); /* process LP prior to applying primal/dual simplex method */ #define npp_integer _glp_npp_integer int npp_integer(NPP *npp, const glp_iocp *parm); /* process MIP prior to applying branch-and-bound method */ /**********************************************************************/ #define npp_sat_free_row _glp_npp_sat_free_row void npp_sat_free_row(NPP *npp, NPPROW *p); /* process free (unbounded) row */ #define npp_sat_fixed_col _glp_npp_sat_fixed_col int npp_sat_fixed_col(NPP *npp, NPPCOL *q); /* process fixed column */ #define npp_sat_is_bin_comb _glp_npp_sat_is_bin_comb int npp_sat_is_bin_comb(NPP *npp, NPPROW *row); /* test if row is binary combination */ #define npp_sat_num_pos_coef _glp_npp_sat_num_pos_coef int npp_sat_num_pos_coef(NPP *npp, NPPROW *row); /* determine number of positive coefficients */ #define npp_sat_num_neg_coef _glp_npp_sat_num_neg_coef int npp_sat_num_neg_coef(NPP *npp, NPPROW *row); /* determine number of negative coefficients */ #define npp_sat_is_cover_ineq _glp_npp_sat_is_cover_ineq int npp_sat_is_cover_ineq(NPP *npp, NPPROW *row); /* test if row is covering inequality */ #define npp_sat_is_pack_ineq _glp_npp_sat_is_pack_ineq int npp_sat_is_pack_ineq(NPP *npp, NPPROW *row); /* test if row is packing inequality */ #define npp_sat_is_partn_eq _glp_npp_sat_is_partn_eq int npp_sat_is_partn_eq(NPP *npp, NPPROW *row); /* test if row is partitioning equality */ #define npp_sat_reverse_row _glp_npp_sat_reverse_row int npp_sat_reverse_row(NPP *npp, NPPROW *row); /* multiply both sides of row by -1 */ #define npp_sat_split_pack _glp_npp_sat_split_pack NPPROW *npp_sat_split_pack(NPP *npp, NPPROW *row, int nnn); /* split packing inequality */ #define npp_sat_encode_pack _glp_npp_sat_encode_pack void npp_sat_encode_pack(NPP *npp, NPPROW *row); /* encode packing inequality */ typedef struct NPPLIT NPPLIT; typedef struct NPPLSE NPPLSE; typedef struct NPPSED NPPSED; struct NPPLIT { /* literal (binary variable or its negation) */ NPPCOL *col; /* pointer to binary variable; NULL means constant false */ int neg; /* negation flag: 0 - literal is variable (or constant false) 1 - literal is negation of variable (or constant true) */ }; struct NPPLSE { /* literal set element */ NPPLIT lit; /* literal */ NPPLSE *next; /* pointer to another element */ }; struct NPPSED { /* summation encoding descriptor */ /* this struct describes the equality x + y + z = s + 2 * c, which was encoded as CNF and included into the transformed problem; here x and y are literals, z is either a literal or constant zero, s and c are binary variables modeling, resp., the low and high (carry) sum bits */ NPPLIT x, y, z; /* literals; if z.col = NULL, z is constant zero */ NPPCOL *s, *c; /* binary variables modeling the sum bits */ }; #define npp_sat_encode_sum2 _glp_npp_sat_encode_sum2 void npp_sat_encode_sum2(NPP *npp, NPPLSE *set, NPPSED *sed); /* encode 2-bit summation */ #define npp_sat_encode_sum3 _glp_npp_sat_encode_sum3 void npp_sat_encode_sum3(NPP *npp, NPPLSE *set, NPPSED *sed); /* encode 3-bit summation */ #define npp_sat_encode_sum_ax _glp_npp_sat_encode_sum_ax int npp_sat_encode_sum_ax(NPP *npp, NPPROW *row, NPPLIT y[]); /* encode linear combination of 0-1 variables */ #define npp_sat_normalize_clause _glp_npp_sat_normalize_clause int npp_sat_normalize_clause(NPP *npp, int size, NPPLIT lit[]); /* normalize clause */ #define npp_sat_encode_clause _glp_npp_sat_encode_clause NPPROW *npp_sat_encode_clause(NPP *npp, int size, NPPLIT lit[]); /* translate clause to cover inequality */ #define npp_sat_encode_geq _glp_npp_sat_encode_geq int npp_sat_encode_geq(NPP *npp, int n, NPPLIT y[], int rhs); /* encode "not less than" constraint */ #define npp_sat_encode_leq _glp_npp_sat_encode_leq int npp_sat_encode_leq(NPP *npp, int n, NPPLIT y[], int rhs); /* encode "not greater than" constraint */ #define npp_sat_encode_row _glp_npp_sat_encode_row int npp_sat_encode_row(NPP *npp, NPPROW *row); /* encode constraint (row) of general type */ #define npp_sat_encode_prob _glp_npp_sat_encode_prob int npp_sat_encode_prob(NPP *npp); /* encode 0-1 feasibility problem */ #endif /* eof */ glpk-5.0/src/npp/npp1.c0000644000062000006210000007107313766346220014120 0ustar maomkpasswd/* npp1.c */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2009-2017 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "npp.h" NPP *npp_create_wksp(void) { /* create LP/MIP preprocessor workspace */ NPP *npp; npp = xmalloc(sizeof(NPP)); npp->orig_dir = 0; npp->orig_m = npp->orig_n = npp->orig_nnz = 0; npp->pool = dmp_create_pool(); npp->name = npp->obj = NULL; npp->c0 = 0.0; npp->nrows = npp->ncols = 0; npp->r_head = npp->r_tail = NULL; npp->c_head = npp->c_tail = NULL; npp->stack = dmp_create_pool(); npp->top = NULL; #if 0 /* 16/XII-2009 */ memset(&npp->count, 0, sizeof(npp->count)); #endif npp->m = npp->n = npp->nnz = 0; npp->row_ref = npp->col_ref = NULL; npp->sol = npp->scaling = 0; npp->p_stat = npp->d_stat = npp->t_stat = npp->i_stat = 0; npp->r_stat = NULL; /*npp->r_prim =*/ npp->r_pi = NULL; npp->c_stat = NULL; npp->c_value = /*npp->c_dual =*/ NULL; return npp; } void npp_insert_row(NPP *npp, NPPROW *row, int where) { /* insert row to the row list */ if (where == 0) { /* insert row to the beginning of the row list */ row->prev = NULL; row->next = npp->r_head; if (row->next == NULL) npp->r_tail = row; else row->next->prev = row; npp->r_head = row; } else { /* insert row to the end of the row list */ row->prev = npp->r_tail; row->next = NULL; if (row->prev == NULL) npp->r_head = row; else row->prev->next = row; npp->r_tail = row; } return; } void npp_remove_row(NPP *npp, NPPROW *row) { /* remove row from the row list */ if (row->prev == NULL) npp->r_head = row->next; else row->prev->next = row->next; if (row->next == NULL) npp->r_tail = row->prev; else row->next->prev = row->prev; return; } void npp_activate_row(NPP *npp, NPPROW *row) { /* make row active */ if (!row->temp) { row->temp = 1; /* move the row to the beginning of the row list */ npp_remove_row(npp, row); npp_insert_row(npp, row, 0); } return; } void npp_deactivate_row(NPP *npp, NPPROW *row) { /* make row inactive */ if (row->temp) { row->temp = 0; /* move the row to the end of the row list */ npp_remove_row(npp, row); npp_insert_row(npp, row, 1); } return; } void npp_insert_col(NPP *npp, NPPCOL *col, int where) { /* insert column to the column list */ if (where == 0) { /* insert column to the beginning of the column list */ col->prev = NULL; col->next = npp->c_head; if (col->next == NULL) npp->c_tail = col; else col->next->prev = col; npp->c_head = col; } else { /* insert column to the end of the column list */ col->prev = npp->c_tail; col->next = NULL; if (col->prev == NULL) npp->c_head = col; else col->prev->next = col; npp->c_tail = col; } return; } void npp_remove_col(NPP *npp, NPPCOL *col) { /* remove column from the column list */ if (col->prev == NULL) npp->c_head = col->next; else col->prev->next = col->next; if (col->next == NULL) npp->c_tail = col->prev; else col->next->prev = col->prev; return; } void npp_activate_col(NPP *npp, NPPCOL *col) { /* make column active */ if (!col->temp) { col->temp = 1; /* move the column to the beginning of the column list */ npp_remove_col(npp, col); npp_insert_col(npp, col, 0); } return; } void npp_deactivate_col(NPP *npp, NPPCOL *col) { /* make column inactive */ if (col->temp) { col->temp = 0; /* move the column to the end of the column list */ npp_remove_col(npp, col); npp_insert_col(npp, col, 1); } return; } NPPROW *npp_add_row(NPP *npp) { /* add new row to the current problem */ NPPROW *row; row = dmp_get_atom(npp->pool, sizeof(NPPROW)); row->i = ++(npp->nrows); row->name = NULL; row->lb = -DBL_MAX, row->ub = +DBL_MAX; row->ptr = NULL; row->temp = 0; npp_insert_row(npp, row, 1); return row; } NPPCOL *npp_add_col(NPP *npp) { /* add new column to the current problem */ NPPCOL *col; col = dmp_get_atom(npp->pool, sizeof(NPPCOL)); col->j = ++(npp->ncols); col->name = NULL; #if 0 col->kind = GLP_CV; #else col->is_int = 0; #endif col->lb = col->ub = col->coef = 0.0; col->ptr = NULL; col->temp = 0; npp_insert_col(npp, col, 1); return col; } NPPAIJ *npp_add_aij(NPP *npp, NPPROW *row, NPPCOL *col, double val) { /* add new element to the constraint matrix */ NPPAIJ *aij; aij = dmp_get_atom(npp->pool, sizeof(NPPAIJ)); aij->row = row; aij->col = col; aij->val = val; aij->r_prev = NULL; aij->r_next = row->ptr; aij->c_prev = NULL; aij->c_next = col->ptr; if (aij->r_next != NULL) aij->r_next->r_prev = aij; if (aij->c_next != NULL) aij->c_next->c_prev = aij; row->ptr = col->ptr = aij; return aij; } int npp_row_nnz(NPP *npp, NPPROW *row) { /* count number of non-zero coefficients in row */ NPPAIJ *aij; int nnz; xassert(npp == npp); nnz = 0; for (aij = row->ptr; aij != NULL; aij = aij->r_next) nnz++; return nnz; } int npp_col_nnz(NPP *npp, NPPCOL *col) { /* count number of non-zero coefficients in column */ NPPAIJ *aij; int nnz; xassert(npp == npp); nnz = 0; for (aij = col->ptr; aij != NULL; aij = aij->c_next) nnz++; return nnz; } void *npp_push_tse(NPP *npp, int (*func)(NPP *npp, void *info), int size) { /* push new entry to the transformation stack */ NPPTSE *tse; tse = dmp_get_atom(npp->stack, sizeof(NPPTSE)); tse->func = func; tse->info = dmp_get_atom(npp->stack, size); tse->link = npp->top; npp->top = tse; return tse->info; } #if 1 /* 23/XII-2009 */ void npp_erase_row(NPP *npp, NPPROW *row) { /* erase row content to make it empty */ NPPAIJ *aij; while (row->ptr != NULL) { aij = row->ptr; row->ptr = aij->r_next; if (aij->c_prev == NULL) aij->col->ptr = aij->c_next; else aij->c_prev->c_next = aij->c_next; if (aij->c_next == NULL) ; else aij->c_next->c_prev = aij->c_prev; dmp_free_atom(npp->pool, aij, sizeof(NPPAIJ)); } return; } #endif void npp_del_row(NPP *npp, NPPROW *row) { /* remove row from the current problem */ #if 0 /* 23/XII-2009 */ NPPAIJ *aij; #endif if (row->name != NULL) dmp_free_atom(npp->pool, row->name, strlen(row->name)+1); #if 0 /* 23/XII-2009 */ while (row->ptr != NULL) { aij = row->ptr; row->ptr = aij->r_next; if (aij->c_prev == NULL) aij->col->ptr = aij->c_next; else aij->c_prev->c_next = aij->c_next; if (aij->c_next == NULL) ; else aij->c_next->c_prev = aij->c_prev; dmp_free_atom(npp->pool, aij, sizeof(NPPAIJ)); } #else npp_erase_row(npp, row); #endif npp_remove_row(npp, row); dmp_free_atom(npp->pool, row, sizeof(NPPROW)); return; } void npp_del_col(NPP *npp, NPPCOL *col) { /* remove column from the current problem */ NPPAIJ *aij; if (col->name != NULL) dmp_free_atom(npp->pool, col->name, strlen(col->name)+1); while (col->ptr != NULL) { aij = col->ptr; col->ptr = aij->c_next; if (aij->r_prev == NULL) aij->row->ptr = aij->r_next; else aij->r_prev->r_next = aij->r_next; if (aij->r_next == NULL) ; else aij->r_next->r_prev = aij->r_prev; dmp_free_atom(npp->pool, aij, sizeof(NPPAIJ)); } npp_remove_col(npp, col); dmp_free_atom(npp->pool, col, sizeof(NPPCOL)); return; } void npp_del_aij(NPP *npp, NPPAIJ *aij) { /* remove element from the constraint matrix */ if (aij->r_prev == NULL) aij->row->ptr = aij->r_next; else aij->r_prev->r_next = aij->r_next; if (aij->r_next == NULL) ; else aij->r_next->r_prev = aij->r_prev; if (aij->c_prev == NULL) aij->col->ptr = aij->c_next; else aij->c_prev->c_next = aij->c_next; if (aij->c_next == NULL) ; else aij->c_next->c_prev = aij->c_prev; dmp_free_atom(npp->pool, aij, sizeof(NPPAIJ)); return; } void npp_load_prob(NPP *npp, glp_prob *orig, int names, int sol, int scaling) { /* load original problem into the preprocessor workspace */ int m = orig->m; int n = orig->n; NPPROW **link; int i, j; double dir; xassert(names == GLP_OFF || names == GLP_ON); xassert(sol == GLP_SOL || sol == GLP_IPT || sol == GLP_MIP); xassert(scaling == GLP_OFF || scaling == GLP_ON); if (sol == GLP_MIP) xassert(!scaling); npp->orig_dir = orig->dir; if (npp->orig_dir == GLP_MIN) dir = +1.0; else if (npp->orig_dir == GLP_MAX) dir = -1.0; else xassert(npp != npp); npp->orig_m = m; npp->orig_n = n; npp->orig_nnz = orig->nnz; if (names && orig->name != NULL) { npp->name = dmp_get_atom(npp->pool, strlen(orig->name)+1); strcpy(npp->name, orig->name); } if (names && orig->obj != NULL) { npp->obj = dmp_get_atom(npp->pool, strlen(orig->obj)+1); strcpy(npp->obj, orig->obj); } npp->c0 = dir * orig->c0; /* load rows */ link = xcalloc(1+m, sizeof(NPPROW *)); for (i = 1; i <= m; i++) { GLPROW *rrr = orig->row[i]; NPPROW *row; link[i] = row = npp_add_row(npp); xassert(row->i == i); if (names && rrr->name != NULL) { row->name = dmp_get_atom(npp->pool, strlen(rrr->name)+1); strcpy(row->name, rrr->name); } if (!scaling) { if (rrr->type == GLP_FR) row->lb = -DBL_MAX, row->ub = +DBL_MAX; else if (rrr->type == GLP_LO) row->lb = rrr->lb, row->ub = +DBL_MAX; else if (rrr->type == GLP_UP) row->lb = -DBL_MAX, row->ub = rrr->ub; else if (rrr->type == GLP_DB) row->lb = rrr->lb, row->ub = rrr->ub; else if (rrr->type == GLP_FX) row->lb = row->ub = rrr->lb; else xassert(rrr != rrr); } else { double rii = rrr->rii; if (rrr->type == GLP_FR) row->lb = -DBL_MAX, row->ub = +DBL_MAX; else if (rrr->type == GLP_LO) row->lb = rrr->lb * rii, row->ub = +DBL_MAX; else if (rrr->type == GLP_UP) row->lb = -DBL_MAX, row->ub = rrr->ub * rii; else if (rrr->type == GLP_DB) row->lb = rrr->lb * rii, row->ub = rrr->ub * rii; else if (rrr->type == GLP_FX) row->lb = row->ub = rrr->lb * rii; else xassert(rrr != rrr); } } /* load columns and constraint coefficients */ for (j = 1; j <= n; j++) { GLPCOL *ccc = orig->col[j]; GLPAIJ *aaa; NPPCOL *col; col = npp_add_col(npp); xassert(col->j == j); if (names && ccc->name != NULL) { col->name = dmp_get_atom(npp->pool, strlen(ccc->name)+1); strcpy(col->name, ccc->name); } if (sol == GLP_MIP) #if 0 col->kind = ccc->kind; #else col->is_int = (char)(ccc->kind == GLP_IV); #endif if (!scaling) { if (ccc->type == GLP_FR) col->lb = -DBL_MAX, col->ub = +DBL_MAX; else if (ccc->type == GLP_LO) col->lb = ccc->lb, col->ub = +DBL_MAX; else if (ccc->type == GLP_UP) col->lb = -DBL_MAX, col->ub = ccc->ub; else if (ccc->type == GLP_DB) col->lb = ccc->lb, col->ub = ccc->ub; else if (ccc->type == GLP_FX) col->lb = col->ub = ccc->lb; else xassert(ccc != ccc); col->coef = dir * ccc->coef; for (aaa = ccc->ptr; aaa != NULL; aaa = aaa->c_next) npp_add_aij(npp, link[aaa->row->i], col, aaa->val); } else { double sjj = ccc->sjj; if (ccc->type == GLP_FR) col->lb = -DBL_MAX, col->ub = +DBL_MAX; else if (ccc->type == GLP_LO) col->lb = ccc->lb / sjj, col->ub = +DBL_MAX; else if (ccc->type == GLP_UP) col->lb = -DBL_MAX, col->ub = ccc->ub / sjj; else if (ccc->type == GLP_DB) col->lb = ccc->lb / sjj, col->ub = ccc->ub / sjj; else if (ccc->type == GLP_FX) col->lb = col->ub = ccc->lb / sjj; else xassert(ccc != ccc); col->coef = dir * ccc->coef * sjj; for (aaa = ccc->ptr; aaa != NULL; aaa = aaa->c_next) npp_add_aij(npp, link[aaa->row->i], col, aaa->row->rii * aaa->val * sjj); } } xfree(link); /* keep solution indicator and scaling option */ npp->sol = sol; npp->scaling = scaling; return; } void npp_build_prob(NPP *npp, glp_prob *prob) { /* build resultant (preprocessed) problem */ NPPROW *row; NPPCOL *col; NPPAIJ *aij; int i, j, type, len, *ind; double dir, *val; glp_erase_prob(prob); glp_set_prob_name(prob, npp->name); glp_set_obj_name(prob, npp->obj); glp_set_obj_dir(prob, npp->orig_dir); if (npp->orig_dir == GLP_MIN) dir = +1.0; else if (npp->orig_dir == GLP_MAX) dir = -1.0; else xassert(npp != npp); glp_set_obj_coef(prob, 0, dir * npp->c0); /* build rows */ for (row = npp->r_head; row != NULL; row = row->next) { row->temp = i = glp_add_rows(prob, 1); glp_set_row_name(prob, i, row->name); if (row->lb == -DBL_MAX && row->ub == +DBL_MAX) type = GLP_FR; else if (row->ub == +DBL_MAX) type = GLP_LO; else if (row->lb == -DBL_MAX) type = GLP_UP; else if (row->lb != row->ub) type = GLP_DB; else type = GLP_FX; glp_set_row_bnds(prob, i, type, row->lb, row->ub); } /* build columns and the constraint matrix */ ind = xcalloc(1+prob->m, sizeof(int)); val = xcalloc(1+prob->m, sizeof(double)); for (col = npp->c_head; col != NULL; col = col->next) { j = glp_add_cols(prob, 1); glp_set_col_name(prob, j, col->name); #if 0 glp_set_col_kind(prob, j, col->kind); #else glp_set_col_kind(prob, j, col->is_int ? GLP_IV : GLP_CV); #endif if (col->lb == -DBL_MAX && col->ub == +DBL_MAX) type = GLP_FR; else if (col->ub == +DBL_MAX) type = GLP_LO; else if (col->lb == -DBL_MAX) type = GLP_UP; else if (col->lb != col->ub) type = GLP_DB; else type = GLP_FX; glp_set_col_bnds(prob, j, type, col->lb, col->ub); glp_set_obj_coef(prob, j, dir * col->coef); len = 0; for (aij = col->ptr; aij != NULL; aij = aij->c_next) { len++; ind[len] = aij->row->temp; val[len] = aij->val; } glp_set_mat_col(prob, j, len, ind, val); } xfree(ind); xfree(val); /* resultant problem has been built */ npp->m = prob->m; npp->n = prob->n; npp->nnz = prob->nnz; npp->row_ref = xcalloc(1+npp->m, sizeof(int)); npp->col_ref = xcalloc(1+npp->n, sizeof(int)); for (row = npp->r_head, i = 0; row != NULL; row = row->next) npp->row_ref[++i] = row->i; for (col = npp->c_head, j = 0; col != NULL; col = col->next) npp->col_ref[++j] = col->j; /* transformed problem segment is no longer needed */ dmp_delete_pool(npp->pool), npp->pool = NULL; npp->name = npp->obj = NULL; npp->c0 = 0.0; npp->r_head = npp->r_tail = NULL; npp->c_head = npp->c_tail = NULL; return; } void npp_postprocess(NPP *npp, glp_prob *prob) { /* postprocess solution from the resultant problem */ GLPROW *row; GLPCOL *col; NPPTSE *tse; int i, j, k; double dir; xassert(npp->orig_dir == prob->dir); if (npp->orig_dir == GLP_MIN) dir = +1.0; else if (npp->orig_dir == GLP_MAX) dir = -1.0; else xassert(npp != npp); #if 0 /* 11/VII-2013; due to call from ios_main */ xassert(npp->m == prob->m); #else if (npp->sol != GLP_MIP) xassert(npp->m == prob->m); #endif xassert(npp->n == prob->n); #if 0 /* 11/VII-2013; due to call from ios_main */ xassert(npp->nnz == prob->nnz); #else if (npp->sol != GLP_MIP) xassert(npp->nnz == prob->nnz); #endif /* copy solution status */ if (npp->sol == GLP_SOL) { npp->p_stat = prob->pbs_stat; npp->d_stat = prob->dbs_stat; } else if (npp->sol == GLP_IPT) npp->t_stat = prob->ipt_stat; else if (npp->sol == GLP_MIP) npp->i_stat = prob->mip_stat; else xassert(npp != npp); /* allocate solution arrays */ if (npp->sol == GLP_SOL) { if (npp->r_stat == NULL) npp->r_stat = xcalloc(1+npp->nrows, sizeof(char)); for (i = 1; i <= npp->nrows; i++) npp->r_stat[i] = 0; if (npp->c_stat == NULL) npp->c_stat = xcalloc(1+npp->ncols, sizeof(char)); for (j = 1; j <= npp->ncols; j++) npp->c_stat[j] = 0; } #if 0 if (npp->r_prim == NULL) npp->r_prim = xcalloc(1+npp->nrows, sizeof(double)); for (i = 1; i <= npp->nrows; i++) npp->r_prim[i] = DBL_MAX; #endif if (npp->c_value == NULL) npp->c_value = xcalloc(1+npp->ncols, sizeof(double)); for (j = 1; j <= npp->ncols; j++) npp->c_value[j] = DBL_MAX; if (npp->sol != GLP_MIP) { if (npp->r_pi == NULL) npp->r_pi = xcalloc(1+npp->nrows, sizeof(double)); for (i = 1; i <= npp->nrows; i++) npp->r_pi[i] = DBL_MAX; #if 0 if (npp->c_dual == NULL) npp->c_dual = xcalloc(1+npp->ncols, sizeof(double)); for (j = 1; j <= npp->ncols; j++) npp->c_dual[j] = DBL_MAX; #endif } /* copy solution components from the resultant problem */ if (npp->sol == GLP_SOL) { for (i = 1; i <= npp->m; i++) { row = prob->row[i]; k = npp->row_ref[i]; npp->r_stat[k] = (char)row->stat; /*npp->r_prim[k] = row->prim;*/ npp->r_pi[k] = dir * row->dual; } for (j = 1; j <= npp->n; j++) { col = prob->col[j]; k = npp->col_ref[j]; npp->c_stat[k] = (char)col->stat; npp->c_value[k] = col->prim; /*npp->c_dual[k] = dir * col->dual;*/ } } else if (npp->sol == GLP_IPT) { for (i = 1; i <= npp->m; i++) { row = prob->row[i]; k = npp->row_ref[i]; /*npp->r_prim[k] = row->pval;*/ npp->r_pi[k] = dir * row->dval; } for (j = 1; j <= npp->n; j++) { col = prob->col[j]; k = npp->col_ref[j]; npp->c_value[k] = col->pval; /*npp->c_dual[k] = dir * col->dval;*/ } } else if (npp->sol == GLP_MIP) { #if 0 for (i = 1; i <= npp->m; i++) { row = prob->row[i]; k = npp->row_ref[i]; /*npp->r_prim[k] = row->mipx;*/ } #endif for (j = 1; j <= npp->n; j++) { col = prob->col[j]; k = npp->col_ref[j]; npp->c_value[k] = col->mipx; } } else xassert(npp != npp); /* perform postprocessing to construct solution to the original problem */ for (tse = npp->top; tse != NULL; tse = tse->link) { xassert(tse->func != NULL); xassert(tse->func(npp, tse->info) == 0); } return; } void npp_unload_sol(NPP *npp, glp_prob *orig) { /* store solution to the original problem */ GLPROW *row; GLPCOL *col; int i, j; double dir; xassert(npp->orig_dir == orig->dir); if (npp->orig_dir == GLP_MIN) dir = +1.0; else if (npp->orig_dir == GLP_MAX) dir = -1.0; else xassert(npp != npp); xassert(npp->orig_m == orig->m); xassert(npp->orig_n == orig->n); xassert(npp->orig_nnz == orig->nnz); if (npp->sol == GLP_SOL) { /* store basic solution */ orig->valid = 0; orig->pbs_stat = npp->p_stat; orig->dbs_stat = npp->d_stat; orig->obj_val = orig->c0; orig->some = 0; for (i = 1; i <= orig->m; i++) { row = orig->row[i]; row->stat = npp->r_stat[i]; if (!npp->scaling) { /*row->prim = npp->r_prim[i];*/ row->dual = dir * npp->r_pi[i]; } else { /*row->prim = npp->r_prim[i] / row->rii;*/ row->dual = dir * npp->r_pi[i] * row->rii; } if (row->stat == GLP_BS) row->dual = 0.0; else if (row->stat == GLP_NL) { xassert(row->type == GLP_LO || row->type == GLP_DB); row->prim = row->lb; } else if (row->stat == GLP_NU) { xassert(row->type == GLP_UP || row->type == GLP_DB); row->prim = row->ub; } else if (row->stat == GLP_NF) { xassert(row->type == GLP_FR); row->prim = 0.0; } else if (row->stat == GLP_NS) { xassert(row->type == GLP_FX); row->prim = row->lb; } else xassert(row != row); } for (j = 1; j <= orig->n; j++) { col = orig->col[j]; col->stat = npp->c_stat[j]; if (!npp->scaling) { col->prim = npp->c_value[j]; /*col->dual = dir * npp->c_dual[j];*/ } else { col->prim = npp->c_value[j] * col->sjj; /*col->dual = dir * npp->c_dual[j] / col->sjj;*/ } if (col->stat == GLP_BS) col->dual = 0.0; #if 1 else if (col->stat == GLP_NL) { xassert(col->type == GLP_LO || col->type == GLP_DB); col->prim = col->lb; } else if (col->stat == GLP_NU) { xassert(col->type == GLP_UP || col->type == GLP_DB); col->prim = col->ub; } else if (col->stat == GLP_NF) { xassert(col->type == GLP_FR); col->prim = 0.0; } else if (col->stat == GLP_NS) { xassert(col->type == GLP_FX); col->prim = col->lb; } else xassert(col != col); #endif orig->obj_val += col->coef * col->prim; } #if 1 /* compute primal values of inactive rows */ for (i = 1; i <= orig->m; i++) { row = orig->row[i]; if (row->stat == GLP_BS) { GLPAIJ *aij; double temp; temp = 0.0; for (aij = row->ptr; aij != NULL; aij = aij->r_next) temp += aij->val * aij->col->prim; row->prim = temp; } } /* compute reduced costs of active columns */ for (j = 1; j <= orig->n; j++) { col = orig->col[j]; if (col->stat != GLP_BS) { GLPAIJ *aij; double temp; temp = col->coef; for (aij = col->ptr; aij != NULL; aij = aij->c_next) temp -= aij->val * aij->row->dual; col->dual = temp; } } #endif } else if (npp->sol == GLP_IPT) { /* store interior-point solution */ orig->ipt_stat = npp->t_stat; orig->ipt_obj = orig->c0; for (i = 1; i <= orig->m; i++) { row = orig->row[i]; if (!npp->scaling) { /*row->pval = npp->r_prim[i];*/ row->dval = dir * npp->r_pi[i]; } else { /*row->pval = npp->r_prim[i] / row->rii;*/ row->dval = dir * npp->r_pi[i] * row->rii; } } for (j = 1; j <= orig->n; j++) { col = orig->col[j]; if (!npp->scaling) { col->pval = npp->c_value[j]; /*col->dval = dir * npp->c_dual[j];*/ } else { col->pval = npp->c_value[j] * col->sjj; /*col->dval = dir * npp->c_dual[j] / col->sjj;*/ } orig->ipt_obj += col->coef * col->pval; } #if 1 /* compute row primal values */ for (i = 1; i <= orig->m; i++) { row = orig->row[i]; { GLPAIJ *aij; double temp; temp = 0.0; for (aij = row->ptr; aij != NULL; aij = aij->r_next) temp += aij->val * aij->col->pval; row->pval = temp; } } /* compute column dual values */ for (j = 1; j <= orig->n; j++) { col = orig->col[j]; { GLPAIJ *aij; double temp; temp = col->coef; for (aij = col->ptr; aij != NULL; aij = aij->c_next) temp -= aij->val * aij->row->dval; col->dval = temp; } } #endif } else if (npp->sol == GLP_MIP) { /* store MIP solution */ xassert(!npp->scaling); orig->mip_stat = npp->i_stat; orig->mip_obj = orig->c0; #if 0 for (i = 1; i <= orig->m; i++) { row = orig->row[i]; /*row->mipx = npp->r_prim[i];*/ } #endif for (j = 1; j <= orig->n; j++) { col = orig->col[j]; col->mipx = npp->c_value[j]; if (col->kind == GLP_IV) xassert(col->mipx == floor(col->mipx)); orig->mip_obj += col->coef * col->mipx; } #if 1 /* compute row primal values */ for (i = 1; i <= orig->m; i++) { row = orig->row[i]; { GLPAIJ *aij; double temp; temp = 0.0; for (aij = row->ptr; aij != NULL; aij = aij->r_next) temp += aij->val * aij->col->mipx; row->mipx = temp; } } #endif } else xassert(npp != npp); return; } void npp_delete_wksp(NPP *npp) { /* delete LP/MIP preprocessor workspace */ if (npp->pool != NULL) dmp_delete_pool(npp->pool); if (npp->stack != NULL) dmp_delete_pool(npp->stack); if (npp->row_ref != NULL) xfree(npp->row_ref); if (npp->col_ref != NULL) xfree(npp->col_ref); if (npp->r_stat != NULL) xfree(npp->r_stat); #if 0 if (npp->r_prim != NULL) xfree(npp->r_prim); #endif if (npp->r_pi != NULL) xfree(npp->r_pi); if (npp->c_stat != NULL) xfree(npp->c_stat); if (npp->c_value != NULL) xfree(npp->c_value); #if 0 if (npp->c_dual != NULL) xfree(npp->c_dual); #endif xfree(npp); return; } /* eof */ glpk-5.0/src/npp/npp2.c0000644000062000006210000012604413766346220014120 0ustar maomkpasswd/* npp2.c */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2009-2017 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "npp.h" /*********************************************************************** * NAME * * npp_free_row - process free (unbounded) row * * SYNOPSIS * * #include "glpnpp.h" * void npp_free_row(NPP *npp, NPPROW *p); * * DESCRIPTION * * The routine npp_free_row processes row p, which is free (i.e. has * no finite bounds): * * -inf < sum a[p,j] x[j] < +inf. (1) * j * * PROBLEM TRANSFORMATION * * Constraint (1) cannot be active, so it is redundant and can be * removed from the original problem. * * Removing row p leads to removing a column of multiplier pi[p] for * this row in the dual system. Since row p has no bounds, pi[p] = 0, * so removing the column does not affect the dual solution. * * RECOVERING BASIC SOLUTION * * In solution to the original problem row p is inactive constraint, * so it is assigned status GLP_BS, and multiplier pi[p] is assigned * zero value. * * RECOVERING INTERIOR-POINT SOLUTION * * In solution to the original problem row p is inactive constraint, * so its multiplier pi[p] is assigned zero value. * * RECOVERING MIP SOLUTION * * None needed. */ struct free_row { /* free (unbounded) row */ int p; /* row reference number */ }; static int rcv_free_row(NPP *npp, void *info); void npp_free_row(NPP *npp, NPPROW *p) { /* process free (unbounded) row */ struct free_row *info; /* the row must be free */ xassert(p->lb == -DBL_MAX && p->ub == +DBL_MAX); /* create transformation stack entry */ info = npp_push_tse(npp, rcv_free_row, sizeof(struct free_row)); info->p = p->i; /* remove the row from the problem */ npp_del_row(npp, p); return; } static int rcv_free_row(NPP *npp, void *_info) { /* recover free (unbounded) row */ struct free_row *info = _info; if (npp->sol == GLP_SOL) npp->r_stat[info->p] = GLP_BS; if (npp->sol != GLP_MIP) npp->r_pi[info->p] = 0.0; return 0; } /*********************************************************************** * NAME * * npp_geq_row - process row of 'not less than' type * * SYNOPSIS * * #include "glpnpp.h" * void npp_geq_row(NPP *npp, NPPROW *p); * * DESCRIPTION * * The routine npp_geq_row processes row p, which is 'not less than' * inequality constraint: * * L[p] <= sum a[p,j] x[j] (<= U[p]), (1) * j * * where L[p] < U[p], and upper bound may not exist (U[p] = +oo). * * PROBLEM TRANSFORMATION * * Constraint (1) can be replaced by equality constraint: * * sum a[p,j] x[j] - s = L[p], (2) * j * * where * * 0 <= s (<= U[p] - L[p]) (3) * * is a non-negative surplus variable. * * Since in the primal system there appears column s having the only * non-zero coefficient in row p, in the dual system there appears a * new row: * * (-1) pi[p] + lambda = 0, (4) * * where (-1) is coefficient of column s in row p, pi[p] is multiplier * of row p, lambda is multiplier of column q, 0 is coefficient of * column s in the objective row. * * RECOVERING BASIC SOLUTION * * Status of row p in solution to the original problem is determined * by its status and status of column q in solution to the transformed * problem as follows: * * +--------------------------------------+------------------+ * | Transformed problem | Original problem | * +-----------------+--------------------+------------------+ * | Status of row p | Status of column s | Status of row p | * +-----------------+--------------------+------------------+ * | GLP_BS | GLP_BS | N/A | * | GLP_BS | GLP_NL | GLP_BS | * | GLP_BS | GLP_NU | GLP_BS | * | GLP_NS | GLP_BS | GLP_BS | * | GLP_NS | GLP_NL | GLP_NL | * | GLP_NS | GLP_NU | GLP_NU | * +-----------------+--------------------+------------------+ * * Value of row multiplier pi[p] in solution to the original problem * is the same as in solution to the transformed problem. * * 1. In solution to the transformed problem row p and column q cannot * be basic at the same time; otherwise the basis matrix would have * two linear dependent columns: unity column of auxiliary variable * of row p and unity column of variable s. * * 2. Though in the transformed problem row p is equality constraint, * it may be basic due to primal degenerate solution. * * RECOVERING INTERIOR-POINT SOLUTION * * Value of row multiplier pi[p] in solution to the original problem * is the same as in solution to the transformed problem. * * RECOVERING MIP SOLUTION * * None needed. */ struct ineq_row { /* inequality constraint row */ int p; /* row reference number */ int s; /* column reference number for slack/surplus variable */ }; static int rcv_geq_row(NPP *npp, void *info); void npp_geq_row(NPP *npp, NPPROW *p) { /* process row of 'not less than' type */ struct ineq_row *info; NPPCOL *s; /* the row must have lower bound */ xassert(p->lb != -DBL_MAX); xassert(p->lb < p->ub); /* create column for surplus variable */ s = npp_add_col(npp); s->lb = 0.0; s->ub = (p->ub == +DBL_MAX ? +DBL_MAX : p->ub - p->lb); /* and add it to the transformed problem */ npp_add_aij(npp, p, s, -1.0); /* create transformation stack entry */ info = npp_push_tse(npp, rcv_geq_row, sizeof(struct ineq_row)); info->p = p->i; info->s = s->j; /* replace the row by equality constraint */ p->ub = p->lb; return; } static int rcv_geq_row(NPP *npp, void *_info) { /* recover row of 'not less than' type */ struct ineq_row *info = _info; if (npp->sol == GLP_SOL) { if (npp->r_stat[info->p] == GLP_BS) { if (npp->c_stat[info->s] == GLP_BS) { npp_error(); return 1; } else if (npp->c_stat[info->s] == GLP_NL || npp->c_stat[info->s] == GLP_NU) npp->r_stat[info->p] = GLP_BS; else { npp_error(); return 1; } } else if (npp->r_stat[info->p] == GLP_NS) { if (npp->c_stat[info->s] == GLP_BS) npp->r_stat[info->p] = GLP_BS; else if (npp->c_stat[info->s] == GLP_NL) npp->r_stat[info->p] = GLP_NL; else if (npp->c_stat[info->s] == GLP_NU) npp->r_stat[info->p] = GLP_NU; else { npp_error(); return 1; } } else { npp_error(); return 1; } } return 0; } /*********************************************************************** * NAME * * npp_leq_row - process row of 'not greater than' type * * SYNOPSIS * * #include "glpnpp.h" * void npp_leq_row(NPP *npp, NPPROW *p); * * DESCRIPTION * * The routine npp_leq_row processes row p, which is 'not greater than' * inequality constraint: * * (L[p] <=) sum a[p,j] x[j] <= U[p], (1) * j * * where L[p] < U[p], and lower bound may not exist (L[p] = +oo). * * PROBLEM TRANSFORMATION * * Constraint (1) can be replaced by equality constraint: * * sum a[p,j] x[j] + s = L[p], (2) * j * * where * * 0 <= s (<= U[p] - L[p]) (3) * * is a non-negative slack variable. * * Since in the primal system there appears column s having the only * non-zero coefficient in row p, in the dual system there appears a * new row: * * (+1) pi[p] + lambda = 0, (4) * * where (+1) is coefficient of column s in row p, pi[p] is multiplier * of row p, lambda is multiplier of column q, 0 is coefficient of * column s in the objective row. * * RECOVERING BASIC SOLUTION * * Status of row p in solution to the original problem is determined * by its status and status of column q in solution to the transformed * problem as follows: * * +--------------------------------------+------------------+ * | Transformed problem | Original problem | * +-----------------+--------------------+------------------+ * | Status of row p | Status of column s | Status of row p | * +-----------------+--------------------+------------------+ * | GLP_BS | GLP_BS | N/A | * | GLP_BS | GLP_NL | GLP_BS | * | GLP_BS | GLP_NU | GLP_BS | * | GLP_NS | GLP_BS | GLP_BS | * | GLP_NS | GLP_NL | GLP_NU | * | GLP_NS | GLP_NU | GLP_NL | * +-----------------+--------------------+------------------+ * * Value of row multiplier pi[p] in solution to the original problem * is the same as in solution to the transformed problem. * * 1. In solution to the transformed problem row p and column q cannot * be basic at the same time; otherwise the basis matrix would have * two linear dependent columns: unity column of auxiliary variable * of row p and unity column of variable s. * * 2. Though in the transformed problem row p is equality constraint, * it may be basic due to primal degeneracy. * * RECOVERING INTERIOR-POINT SOLUTION * * Value of row multiplier pi[p] in solution to the original problem * is the same as in solution to the transformed problem. * * RECOVERING MIP SOLUTION * * None needed. */ static int rcv_leq_row(NPP *npp, void *info); void npp_leq_row(NPP *npp, NPPROW *p) { /* process row of 'not greater than' type */ struct ineq_row *info; NPPCOL *s; /* the row must have upper bound */ xassert(p->ub != +DBL_MAX); xassert(p->lb < p->ub); /* create column for slack variable */ s = npp_add_col(npp); s->lb = 0.0; s->ub = (p->lb == -DBL_MAX ? +DBL_MAX : p->ub - p->lb); /* and add it to the transformed problem */ npp_add_aij(npp, p, s, +1.0); /* create transformation stack entry */ info = npp_push_tse(npp, rcv_leq_row, sizeof(struct ineq_row)); info->p = p->i; info->s = s->j; /* replace the row by equality constraint */ p->lb = p->ub; return; } static int rcv_leq_row(NPP *npp, void *_info) { /* recover row of 'not greater than' type */ struct ineq_row *info = _info; if (npp->sol == GLP_SOL) { if (npp->r_stat[info->p] == GLP_BS) { if (npp->c_stat[info->s] == GLP_BS) { npp_error(); return 1; } else if (npp->c_stat[info->s] == GLP_NL || npp->c_stat[info->s] == GLP_NU) npp->r_stat[info->p] = GLP_BS; else { npp_error(); return 1; } } else if (npp->r_stat[info->p] == GLP_NS) { if (npp->c_stat[info->s] == GLP_BS) npp->r_stat[info->p] = GLP_BS; else if (npp->c_stat[info->s] == GLP_NL) npp->r_stat[info->p] = GLP_NU; else if (npp->c_stat[info->s] == GLP_NU) npp->r_stat[info->p] = GLP_NL; else { npp_error(); return 1; } } else { npp_error(); return 1; } } return 0; } /*********************************************************************** * NAME * * npp_free_col - process free (unbounded) column * * SYNOPSIS * * #include "glpnpp.h" * void npp_free_col(NPP *npp, NPPCOL *q); * * DESCRIPTION * * The routine npp_free_col processes column q, which is free (i.e. has * no finite bounds): * * -oo < x[q] < +oo. (1) * * PROBLEM TRANSFORMATION * * Free (unbounded) variable can be replaced by the difference of two * non-negative variables: * * x[q] = s' - s'', s', s'' >= 0. (2) * * Assuming that in the transformed problem x[q] becomes s', * transformation (2) causes new column s'' to appear, which differs * from column s' only in the sign of coefficients in constraint and * objective rows. Thus, if in the dual system the following row * corresponds to column s': * * sum a[i,q] pi[i] + lambda' = c[q], (3) * i * * the row which corresponds to column s'' is the following: * * sum (-a[i,q]) pi[i] + lambda'' = -c[q]. (4) * i * * Then from (3) and (4) it follows that: * * lambda' + lambda'' = 0 => lambda' = lmabda'' = 0, (5) * * where lambda' and lambda'' are multipliers for columns s' and s'', * resp. * * RECOVERING BASIC SOLUTION * * With respect to (5) status of column q in solution to the original * problem is determined by statuses of columns s' and s'' in solution * to the transformed problem as follows: * * +--------------------------------------+------------------+ * | Transformed problem | Original problem | * +------------------+-------------------+------------------+ * | Status of col s' | Status of col s'' | Status of col q | * +------------------+-------------------+------------------+ * | GLP_BS | GLP_BS | N/A | * | GLP_BS | GLP_NL | GLP_BS | * | GLP_NL | GLP_BS | GLP_BS | * | GLP_NL | GLP_NL | GLP_NF | * +------------------+-------------------+------------------+ * * Value of column q is computed with formula (2). * * 1. In solution to the transformed problem columns s' and s'' cannot * be basic at the same time, because they differ only in the sign, * hence, are linear dependent. * * 2. Though column q is free, it can be non-basic due to dual * degeneracy. * * 3. If column q is integral, columns s' and s'' are also integral. * * RECOVERING INTERIOR-POINT SOLUTION * * Value of column q is computed with formula (2). * * RECOVERING MIP SOLUTION * * Value of column q is computed with formula (2). */ struct free_col { /* free (unbounded) column */ int q; /* column reference number for variables x[q] and s' */ int s; /* column reference number for variable s'' */ }; static int rcv_free_col(NPP *npp, void *info); void npp_free_col(NPP *npp, NPPCOL *q) { /* process free (unbounded) column */ struct free_col *info; NPPCOL *s; NPPAIJ *aij; /* the column must be free */ xassert(q->lb == -DBL_MAX && q->ub == +DBL_MAX); /* variable x[q] becomes s' */ q->lb = 0.0, q->ub = +DBL_MAX; /* create variable s'' */ s = npp_add_col(npp); s->is_int = q->is_int; s->lb = 0.0, s->ub = +DBL_MAX; /* duplicate objective coefficient */ s->coef = -q->coef; /* duplicate column of the constraint matrix */ for (aij = q->ptr; aij != NULL; aij = aij->c_next) npp_add_aij(npp, aij->row, s, -aij->val); /* create transformation stack entry */ info = npp_push_tse(npp, rcv_free_col, sizeof(struct free_col)); info->q = q->j; info->s = s->j; return; } static int rcv_free_col(NPP *npp, void *_info) { /* recover free (unbounded) column */ struct free_col *info = _info; if (npp->sol == GLP_SOL) { if (npp->c_stat[info->q] == GLP_BS) { if (npp->c_stat[info->s] == GLP_BS) { npp_error(); return 1; } else if (npp->c_stat[info->s] == GLP_NL) npp->c_stat[info->q] = GLP_BS; else { npp_error(); return -1; } } else if (npp->c_stat[info->q] == GLP_NL) { if (npp->c_stat[info->s] == GLP_BS) npp->c_stat[info->q] = GLP_BS; else if (npp->c_stat[info->s] == GLP_NL) npp->c_stat[info->q] = GLP_NF; else { npp_error(); return -1; } } else { npp_error(); return -1; } } /* compute value of x[q] with formula (2) */ npp->c_value[info->q] -= npp->c_value[info->s]; return 0; } /*********************************************************************** * NAME * * npp_lbnd_col - process column with (non-zero) lower bound * * SYNOPSIS * * #include "glpnpp.h" * void npp_lbnd_col(NPP *npp, NPPCOL *q); * * DESCRIPTION * * The routine npp_lbnd_col processes column q, which has (non-zero) * lower bound: * * l[q] <= x[q] (<= u[q]), (1) * * where l[q] < u[q], and upper bound may not exist (u[q] = +oo). * * PROBLEM TRANSFORMATION * * Column q can be replaced as follows: * * x[q] = l[q] + s, (2) * * where * * 0 <= s (<= u[q] - l[q]) (3) * * is a non-negative variable. * * Substituting x[q] from (2) into the objective row, we have: * * z = sum c[j] x[j] + c0 = * j * * = sum c[j] x[j] + c[q] x[q] + c0 = * j!=q * * = sum c[j] x[j] + c[q] (l[q] + s) + c0 = * j!=q * * = sum c[j] x[j] + c[q] s + c~0, * * where * * c~0 = c0 + c[q] l[q] (4) * * is the constant term of the objective in the transformed problem. * Similarly, substituting x[q] into constraint row i, we have: * * L[i] <= sum a[i,j] x[j] <= U[i] ==> * j * * L[i] <= sum a[i,j] x[j] + a[i,q] x[q] <= U[i] ==> * j!=q * * L[i] <= sum a[i,j] x[j] + a[i,q] (l[q] + s) <= U[i] ==> * j!=q * * L~[i] <= sum a[i,j] x[j] + a[i,q] s <= U~[i], * j!=q * * where * * L~[i] = L[i] - a[i,q] l[q], U~[i] = U[i] - a[i,q] l[q] (5) * * are lower and upper bounds of row i in the transformed problem, * resp. * * Transformation (2) does not affect the dual system. * * RECOVERING BASIC SOLUTION * * Status of column q in solution to the original problem is the same * as in solution to the transformed problem (GLP_BS, GLP_NL or GLP_NU). * Value of column q is computed with formula (2). * * RECOVERING INTERIOR-POINT SOLUTION * * Value of column q is computed with formula (2). * * RECOVERING MIP SOLUTION * * Value of column q is computed with formula (2). */ struct bnd_col { /* bounded column */ int q; /* column reference number for variables x[q] and s */ double bnd; /* lower/upper bound l[q] or u[q] */ }; static int rcv_lbnd_col(NPP *npp, void *info); void npp_lbnd_col(NPP *npp, NPPCOL *q) { /* process column with (non-zero) lower bound */ struct bnd_col *info; NPPROW *i; NPPAIJ *aij; /* the column must have non-zero lower bound */ xassert(q->lb != 0.0); xassert(q->lb != -DBL_MAX); xassert(q->lb < q->ub); /* create transformation stack entry */ info = npp_push_tse(npp, rcv_lbnd_col, sizeof(struct bnd_col)); info->q = q->j; info->bnd = q->lb; /* substitute x[q] into objective row */ npp->c0 += q->coef * q->lb; /* substitute x[q] into constraint rows */ for (aij = q->ptr; aij != NULL; aij = aij->c_next) { i = aij->row; if (i->lb == i->ub) i->ub = (i->lb -= aij->val * q->lb); else { if (i->lb != -DBL_MAX) i->lb -= aij->val * q->lb; if (i->ub != +DBL_MAX) i->ub -= aij->val * q->lb; } } /* column x[q] becomes column s */ if (q->ub != +DBL_MAX) q->ub -= q->lb; q->lb = 0.0; return; } static int rcv_lbnd_col(NPP *npp, void *_info) { /* recover column with (non-zero) lower bound */ struct bnd_col *info = _info; if (npp->sol == GLP_SOL) { if (npp->c_stat[info->q] == GLP_BS || npp->c_stat[info->q] == GLP_NL || npp->c_stat[info->q] == GLP_NU) npp->c_stat[info->q] = npp->c_stat[info->q]; else { npp_error(); return 1; } } /* compute value of x[q] with formula (2) */ npp->c_value[info->q] = info->bnd + npp->c_value[info->q]; return 0; } /*********************************************************************** * NAME * * npp_ubnd_col - process column with upper bound * * SYNOPSIS * * #include "glpnpp.h" * void npp_ubnd_col(NPP *npp, NPPCOL *q); * * DESCRIPTION * * The routine npp_ubnd_col processes column q, which has upper bound: * * (l[q] <=) x[q] <= u[q], (1) * * where l[q] < u[q], and lower bound may not exist (l[q] = -oo). * * PROBLEM TRANSFORMATION * * Column q can be replaced as follows: * * x[q] = u[q] - s, (2) * * where * * 0 <= s (<= u[q] - l[q]) (3) * * is a non-negative variable. * * Substituting x[q] from (2) into the objective row, we have: * * z = sum c[j] x[j] + c0 = * j * * = sum c[j] x[j] + c[q] x[q] + c0 = * j!=q * * = sum c[j] x[j] + c[q] (u[q] - s) + c0 = * j!=q * * = sum c[j] x[j] - c[q] s + c~0, * * where * * c~0 = c0 + c[q] u[q] (4) * * is the constant term of the objective in the transformed problem. * Similarly, substituting x[q] into constraint row i, we have: * * L[i] <= sum a[i,j] x[j] <= U[i] ==> * j * * L[i] <= sum a[i,j] x[j] + a[i,q] x[q] <= U[i] ==> * j!=q * * L[i] <= sum a[i,j] x[j] + a[i,q] (u[q] - s) <= U[i] ==> * j!=q * * L~[i] <= sum a[i,j] x[j] - a[i,q] s <= U~[i], * j!=q * * where * * L~[i] = L[i] - a[i,q] u[q], U~[i] = U[i] - a[i,q] u[q] (5) * * are lower and upper bounds of row i in the transformed problem, * resp. * * Note that in the transformed problem coefficients c[q] and a[i,q] * change their sign. Thus, the row of the dual system corresponding to * column q: * * sum a[i,q] pi[i] + lambda[q] = c[q] (6) * i * * in the transformed problem becomes the following: * * sum (-a[i,q]) pi[i] + lambda[s] = -c[q]. (7) * i * * Therefore: * * lambda[q] = - lambda[s], (8) * * where lambda[q] is multiplier for column q, lambda[s] is multiplier * for column s. * * RECOVERING BASIC SOLUTION * * With respect to (8) status of column q in solution to the original * problem is determined by status of column s in solution to the * transformed problem as follows: * * +-----------------------+--------------------+ * | Status of column s | Status of column q | * | (transformed problem) | (original problem) | * +-----------------------+--------------------+ * | GLP_BS | GLP_BS | * | GLP_NL | GLP_NU | * | GLP_NU | GLP_NL | * +-----------------------+--------------------+ * * Value of column q is computed with formula (2). * * RECOVERING INTERIOR-POINT SOLUTION * * Value of column q is computed with formula (2). * * RECOVERING MIP SOLUTION * * Value of column q is computed with formula (2). */ static int rcv_ubnd_col(NPP *npp, void *info); void npp_ubnd_col(NPP *npp, NPPCOL *q) { /* process column with upper bound */ struct bnd_col *info; NPPROW *i; NPPAIJ *aij; /* the column must have upper bound */ xassert(q->ub != +DBL_MAX); xassert(q->lb < q->ub); /* create transformation stack entry */ info = npp_push_tse(npp, rcv_ubnd_col, sizeof(struct bnd_col)); info->q = q->j; info->bnd = q->ub; /* substitute x[q] into objective row */ npp->c0 += q->coef * q->ub; q->coef = -q->coef; /* substitute x[q] into constraint rows */ for (aij = q->ptr; aij != NULL; aij = aij->c_next) { i = aij->row; if (i->lb == i->ub) i->ub = (i->lb -= aij->val * q->ub); else { if (i->lb != -DBL_MAX) i->lb -= aij->val * q->ub; if (i->ub != +DBL_MAX) i->ub -= aij->val * q->ub; } aij->val = -aij->val; } /* column x[q] becomes column s */ if (q->lb != -DBL_MAX) q->ub -= q->lb; else q->ub = +DBL_MAX; q->lb = 0.0; return; } static int rcv_ubnd_col(NPP *npp, void *_info) { /* recover column with upper bound */ struct bnd_col *info = _info; if (npp->sol == GLP_BS) { if (npp->c_stat[info->q] == GLP_BS) npp->c_stat[info->q] = GLP_BS; else if (npp->c_stat[info->q] == GLP_NL) npp->c_stat[info->q] = GLP_NU; else if (npp->c_stat[info->q] == GLP_NU) npp->c_stat[info->q] = GLP_NL; else { npp_error(); return 1; } } /* compute value of x[q] with formula (2) */ npp->c_value[info->q] = info->bnd - npp->c_value[info->q]; return 0; } /*********************************************************************** * NAME * * npp_dbnd_col - process non-negative column with upper bound * * SYNOPSIS * * #include "glpnpp.h" * void npp_dbnd_col(NPP *npp, NPPCOL *q); * * DESCRIPTION * * The routine npp_dbnd_col processes column q, which is non-negative * and has upper bound: * * 0 <= x[q] <= u[q], (1) * * where u[q] > 0. * * PROBLEM TRANSFORMATION * * Upper bound of column q can be replaced by the following equality * constraint: * * x[q] + s = u[q], (2) * * where s >= 0 is a non-negative complement variable. * * Since in the primal system along with new row (2) there appears a * new column s having the only non-zero coefficient in this row, in * the dual system there appears a new row: * * (+1)pi + lambda[s] = 0, (3) * * where (+1) is coefficient at column s in row (2), pi is multiplier * for row (2), lambda[s] is multiplier for column s, 0 is coefficient * at column s in the objective row. * * RECOVERING BASIC SOLUTION * * Status of column q in solution to the original problem is determined * by its status and status of column s in solution to the transformed * problem as follows: * * +-----------------------------------+------------------+ * | Transformed problem | Original problem | * +-----------------+-----------------+------------------+ * | Status of col q | Status of col s | Status of col q | * +-----------------+-----------------+------------------+ * | GLP_BS | GLP_BS | GLP_BS | * | GLP_BS | GLP_NL | GLP_NU | * | GLP_NL | GLP_BS | GLP_NL | * | GLP_NL | GLP_NL | GLP_NL (*) | * +-----------------+-----------------+------------------+ * * Value of column q in solution to the original problem is the same as * in solution to the transformed problem. * * 1. Formally, in solution to the transformed problem columns q and s * cannot be non-basic at the same time, since the constraint (2) * would be violated. However, if u[q] is close to zero, violation * may be less than a working precision even if both columns q and s * are non-basic. In this degenerate case row (2) can be only basic, * i.e. non-active constraint (otherwise corresponding row of the * basis matrix would be zero). This allows to pivot out auxiliary * variable and pivot in column s, in which case the row becomes * active while column s becomes basic. * * 2. If column q is integral, column s is also integral. * * RECOVERING INTERIOR-POINT SOLUTION * * Value of column q in solution to the original problem is the same as * in solution to the transformed problem. * * RECOVERING MIP SOLUTION * * Value of column q in solution to the original problem is the same as * in solution to the transformed problem. */ struct dbnd_col { /* double-bounded column */ int q; /* column reference number for variable x[q] */ int s; /* column reference number for complement variable s */ }; static int rcv_dbnd_col(NPP *npp, void *info); void npp_dbnd_col(NPP *npp, NPPCOL *q) { /* process non-negative column with upper bound */ struct dbnd_col *info; NPPROW *p; NPPCOL *s; /* the column must be non-negative with upper bound */ xassert(q->lb == 0.0); xassert(q->ub > 0.0); xassert(q->ub != +DBL_MAX); /* create variable s */ s = npp_add_col(npp); s->is_int = q->is_int; s->lb = 0.0, s->ub = +DBL_MAX; /* create equality constraint (2) */ p = npp_add_row(npp); p->lb = p->ub = q->ub; npp_add_aij(npp, p, q, +1.0); npp_add_aij(npp, p, s, +1.0); /* create transformation stack entry */ info = npp_push_tse(npp, rcv_dbnd_col, sizeof(struct dbnd_col)); info->q = q->j; info->s = s->j; /* remove upper bound of x[q] */ q->ub = +DBL_MAX; return; } static int rcv_dbnd_col(NPP *npp, void *_info) { /* recover non-negative column with upper bound */ struct dbnd_col *info = _info; if (npp->sol == GLP_BS) { if (npp->c_stat[info->q] == GLP_BS) { if (npp->c_stat[info->s] == GLP_BS) npp->c_stat[info->q] = GLP_BS; else if (npp->c_stat[info->s] == GLP_NL) npp->c_stat[info->q] = GLP_NU; else { npp_error(); return 1; } } else if (npp->c_stat[info->q] == GLP_NL) { if (npp->c_stat[info->s] == GLP_BS || npp->c_stat[info->s] == GLP_NL) npp->c_stat[info->q] = GLP_NL; else { npp_error(); return 1; } } else { npp_error(); return 1; } } return 0; } /*********************************************************************** * NAME * * npp_fixed_col - process fixed column * * SYNOPSIS * * #include "glpnpp.h" * void npp_fixed_col(NPP *npp, NPPCOL *q); * * DESCRIPTION * * The routine npp_fixed_col processes column q, which is fixed: * * x[q] = s[q], (1) * * where s[q] is a fixed column value. * * PROBLEM TRANSFORMATION * * The value of a fixed column can be substituted into the objective * and constraint rows that allows removing the column from the problem. * * Substituting x[q] = s[q] into the objective row, we have: * * z = sum c[j] x[j] + c0 = * j * * = sum c[j] x[j] + c[q] x[q] + c0 = * j!=q * * = sum c[j] x[j] + c[q] s[q] + c0 = * j!=q * * = sum c[j] x[j] + c~0, * j!=q * * where * * c~0 = c0 + c[q] s[q] (2) * * is the constant term of the objective in the transformed problem. * Similarly, substituting x[q] = s[q] into constraint row i, we have: * * L[i] <= sum a[i,j] x[j] <= U[i] ==> * j * * L[i] <= sum a[i,j] x[j] + a[i,q] x[q] <= U[i] ==> * j!=q * * L[i] <= sum a[i,j] x[j] + a[i,q] s[q] <= U[i] ==> * j!=q * * L~[i] <= sum a[i,j] x[j] + a[i,q] s <= U~[i], * j!=q * * where * * L~[i] = L[i] - a[i,q] s[q], U~[i] = U[i] - a[i,q] s[q] (3) * * are lower and upper bounds of row i in the transformed problem, * resp. * * RECOVERING BASIC SOLUTION * * Column q is assigned status GLP_NS and its value is assigned s[q]. * * RECOVERING INTERIOR-POINT SOLUTION * * Value of column q is assigned s[q]. * * RECOVERING MIP SOLUTION * * Value of column q is assigned s[q]. */ struct fixed_col { /* fixed column */ int q; /* column reference number for variable x[q] */ double s; /* value, at which x[q] is fixed */ }; static int rcv_fixed_col(NPP *npp, void *info); void npp_fixed_col(NPP *npp, NPPCOL *q) { /* process fixed column */ struct fixed_col *info; NPPROW *i; NPPAIJ *aij; /* the column must be fixed */ xassert(q->lb == q->ub); /* create transformation stack entry */ info = npp_push_tse(npp, rcv_fixed_col, sizeof(struct fixed_col)); info->q = q->j; info->s = q->lb; /* substitute x[q] = s[q] into objective row */ npp->c0 += q->coef * q->lb; /* substitute x[q] = s[q] into constraint rows */ for (aij = q->ptr; aij != NULL; aij = aij->c_next) { i = aij->row; if (i->lb == i->ub) i->ub = (i->lb -= aij->val * q->lb); else { if (i->lb != -DBL_MAX) i->lb -= aij->val * q->lb; if (i->ub != +DBL_MAX) i->ub -= aij->val * q->lb; } } /* remove the column from the problem */ npp_del_col(npp, q); return; } static int rcv_fixed_col(NPP *npp, void *_info) { /* recover fixed column */ struct fixed_col *info = _info; if (npp->sol == GLP_SOL) npp->c_stat[info->q] = GLP_NS; npp->c_value[info->q] = info->s; return 0; } /*********************************************************************** * NAME * * npp_make_equality - process row with almost identical bounds * * SYNOPSIS * * #include "glpnpp.h" * int npp_make_equality(NPP *npp, NPPROW *p); * * DESCRIPTION * * The routine npp_make_equality processes row p: * * L[p] <= sum a[p,j] x[j] <= U[p], (1) * j * * where -oo < L[p] < U[p] < +oo, i.e. which is double-sided inequality * constraint. * * RETURNS * * 0 - row bounds have not been changed; * * 1 - row has been replaced by equality constraint. * * PROBLEM TRANSFORMATION * * If bounds of row (1) are very close to each other: * * U[p] - L[p] <= eps, (2) * * where eps is an absolute tolerance for row value, the row can be * replaced by the following almost equivalent equiality constraint: * * sum a[p,j] x[j] = b, (3) * j * * where b = (L[p] + U[p]) / 2. If the right-hand side in (3) happens * to be very close to its nearest integer: * * |b - floor(b + 0.5)| <= eps, (4) * * it is reasonable to use this nearest integer as the right-hand side. * * RECOVERING BASIC SOLUTION * * Status of row p in solution to the original problem is determined * by its status and the sign of its multiplier pi[p] in solution to * the transformed problem as follows: * * +-----------------------+---------+--------------------+ * | Status of row p | Sign of | Status of row p | * | (transformed problem) | pi[p] | (original problem) | * +-----------------------+---------+--------------------+ * | GLP_BS | + / - | GLP_BS | * | GLP_NS | + | GLP_NL | * | GLP_NS | - | GLP_NU | * +-----------------------+---------+--------------------+ * * Value of row multiplier pi[p] in solution to the original problem is * the same as in solution to the transformed problem. * * RECOVERING INTERIOR POINT SOLUTION * * Value of row multiplier pi[p] in solution to the original problem is * the same as in solution to the transformed problem. * * RECOVERING MIP SOLUTION * * None needed. */ struct make_equality { /* row with almost identical bounds */ int p; /* row reference number */ }; static int rcv_make_equality(NPP *npp, void *info); int npp_make_equality(NPP *npp, NPPROW *p) { /* process row with almost identical bounds */ struct make_equality *info; double b, eps, nint; /* the row must be double-sided inequality */ xassert(p->lb != -DBL_MAX); xassert(p->ub != +DBL_MAX); xassert(p->lb < p->ub); /* check row bounds */ eps = 1e-9 + 1e-12 * fabs(p->lb); if (p->ub - p->lb > eps) return 0; /* row bounds are very close to each other */ /* create transformation stack entry */ info = npp_push_tse(npp, rcv_make_equality, sizeof(struct make_equality)); info->p = p->i; /* compute right-hand side */ b = 0.5 * (p->ub + p->lb); nint = floor(b + 0.5); if (fabs(b - nint) <= eps) b = nint; /* replace row p by almost equivalent equality constraint */ p->lb = p->ub = b; return 1; } int rcv_make_equality(NPP *npp, void *_info) { /* recover row with almost identical bounds */ struct make_equality *info = _info; if (npp->sol == GLP_SOL) { if (npp->r_stat[info->p] == GLP_BS) npp->r_stat[info->p] = GLP_BS; else if (npp->r_stat[info->p] == GLP_NS) { if (npp->r_pi[info->p] >= 0.0) npp->r_stat[info->p] = GLP_NL; else npp->r_stat[info->p] = GLP_NU; } else { npp_error(); return 1; } } return 0; } /*********************************************************************** * NAME * * npp_make_fixed - process column with almost identical bounds * * SYNOPSIS * * #include "glpnpp.h" * int npp_make_fixed(NPP *npp, NPPCOL *q); * * DESCRIPTION * * The routine npp_make_fixed processes column q: * * l[q] <= x[q] <= u[q], (1) * * where -oo < l[q] < u[q] < +oo, i.e. which has both lower and upper * bounds. * * RETURNS * * 0 - column bounds have not been changed; * * 1 - column has been fixed. * * PROBLEM TRANSFORMATION * * If bounds of column (1) are very close to each other: * * u[q] - l[q] <= eps, (2) * * where eps is an absolute tolerance for column value, the column can * be fixed: * * x[q] = s[q], (3) * * where s[q] = (l[q] + u[q]) / 2. And if the fixed column value s[q] * happens to be very close to its nearest integer: * * |s[q] - floor(s[q] + 0.5)| <= eps, (4) * * it is reasonable to use this nearest integer as the fixed value. * * RECOVERING BASIC SOLUTION * * In the dual system of the original (as well as transformed) problem * column q corresponds to the following row: * * sum a[i,q] pi[i] + lambda[q] = c[q]. (5) * i * * Since multipliers pi[i] are known for all rows from solution to the * transformed problem, formula (5) allows computing value of multiplier * (reduced cost) for column q: * * lambda[q] = c[q] - sum a[i,q] pi[i]. (6) * i * * Status of column q in solution to the original problem is determined * by its status and the sign of its multiplier lambda[q] in solution to * the transformed problem as follows: * * +-----------------------+-----------+--------------------+ * | Status of column q | Sign of | Status of column q | * | (transformed problem) | lambda[q] | (original problem) | * +-----------------------+-----------+--------------------+ * | GLP_BS | + / - | GLP_BS | * | GLP_NS | + | GLP_NL | * | GLP_NS | - | GLP_NU | * +-----------------------+-----------+--------------------+ * * Value of column q in solution to the original problem is the same as * in solution to the transformed problem. * * RECOVERING INTERIOR POINT SOLUTION * * Value of column q in solution to the original problem is the same as * in solution to the transformed problem. * * RECOVERING MIP SOLUTION * * None needed. */ struct make_fixed { /* column with almost identical bounds */ int q; /* column reference number */ double c; /* objective coefficient at x[q] */ NPPLFE *ptr; /* list of non-zero coefficients a[i,q] */ }; static int rcv_make_fixed(NPP *npp, void *info); int npp_make_fixed(NPP *npp, NPPCOL *q) { /* process column with almost identical bounds */ struct make_fixed *info; NPPAIJ *aij; NPPLFE *lfe; double s, eps, nint; /* the column must be double-bounded */ xassert(q->lb != -DBL_MAX); xassert(q->ub != +DBL_MAX); xassert(q->lb < q->ub); /* check column bounds */ eps = 1e-9 + 1e-12 * fabs(q->lb); if (q->ub - q->lb > eps) return 0; /* column bounds are very close to each other */ /* create transformation stack entry */ info = npp_push_tse(npp, rcv_make_fixed, sizeof(struct make_fixed)); info->q = q->j; info->c = q->coef; info->ptr = NULL; /* save column coefficients a[i,q] (needed for basic solution only) */ if (npp->sol == GLP_SOL) { for (aij = q->ptr; aij != NULL; aij = aij->c_next) { lfe = dmp_get_atom(npp->stack, sizeof(NPPLFE)); lfe->ref = aij->row->i; lfe->val = aij->val; lfe->next = info->ptr; info->ptr = lfe; } } /* compute column fixed value */ s = 0.5 * (q->ub + q->lb); nint = floor(s + 0.5); if (fabs(s - nint) <= eps) s = nint; /* make column q fixed */ q->lb = q->ub = s; return 1; } static int rcv_make_fixed(NPP *npp, void *_info) { /* recover column with almost identical bounds */ struct make_fixed *info = _info; NPPLFE *lfe; double lambda; if (npp->sol == GLP_SOL) { if (npp->c_stat[info->q] == GLP_BS) npp->c_stat[info->q] = GLP_BS; else if (npp->c_stat[info->q] == GLP_NS) { /* compute multiplier for column q with formula (6) */ lambda = info->c; for (lfe = info->ptr; lfe != NULL; lfe = lfe->next) lambda -= lfe->val * npp->r_pi[lfe->ref]; /* assign status to non-basic column */ if (lambda >= 0.0) npp->c_stat[info->q] = GLP_NL; else npp->c_stat[info->q] = GLP_NU; } else { npp_error(); return 1; } } return 0; } /* eof */ glpk-5.0/src/npp/npp3.c0000644000062000006210000030055713766346220014124 0ustar maomkpasswd/* npp3.c */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2009-2017 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "npp.h" /*********************************************************************** * NAME * * npp_empty_row - process empty row * * SYNOPSIS * * #include "glpnpp.h" * int npp_empty_row(NPP *npp, NPPROW *p); * * DESCRIPTION * * The routine npp_empty_row processes row p, which is empty, i.e. * coefficients at all columns in this row are zero: * * L[p] <= sum 0 x[j] <= U[p], (1) * * where L[p] <= U[p]. * * RETURNS * * 0 - success; * * 1 - problem has no primal feasible solution. * * PROBLEM TRANSFORMATION * * If the following conditions hold: * * L[p] <= +eps, U[p] >= -eps, (2) * * where eps is an absolute tolerance for row value, the row p is * redundant. In this case it can be replaced by equivalent redundant * row, which is free (unbounded), and then removed from the problem. * Otherwise, the row p is infeasible and, thus, the problem has no * primal feasible solution. * * RECOVERING BASIC SOLUTION * * See the routine npp_free_row. * * RECOVERING INTERIOR-POINT SOLUTION * * See the routine npp_free_row. * * RECOVERING MIP SOLUTION * * None needed. */ int npp_empty_row(NPP *npp, NPPROW *p) { /* process empty row */ double eps = 1e-3; /* the row must be empty */ xassert(p->ptr == NULL); /* check primal feasibility */ if (p->lb > +eps || p->ub < -eps) return 1; /* replace the row by equivalent free (unbounded) row */ p->lb = -DBL_MAX, p->ub = +DBL_MAX; /* and process it */ npp_free_row(npp, p); return 0; } /*********************************************************************** * NAME * * npp_empty_col - process empty column * * SYNOPSIS * * #include "glpnpp.h" * int npp_empty_col(NPP *npp, NPPCOL *q); * * DESCRIPTION * * The routine npp_empty_col processes column q: * * l[q] <= x[q] <= u[q], (1) * * where l[q] <= u[q], which is empty, i.e. has zero coefficients in * all constraint rows. * * RETURNS * * 0 - success; * * 1 - problem has no dual feasible solution. * * PROBLEM TRANSFORMATION * * The row of the dual system corresponding to the empty column is the * following: * * sum 0 pi[i] + lambda[q] = c[q], (2) * i * * from which it follows that: * * lambda[q] = c[q]. (3) * * If the following condition holds: * * c[q] < - eps, (4) * * where eps is an absolute tolerance for column multiplier, the lower * column bound l[q] must be active to provide dual feasibility (note * that being preprocessed the problem is always minimization). In this * case the column can be fixed on its lower bound and removed from the * problem (if the column is integral, its bounds are also assumed to * be integral). And if the column has no lower bound (l[q] = -oo), the * problem has no dual feasible solution. * * If the following condition holds: * * c[q] > + eps, (5) * * the upper column bound u[q] must be active to provide dual * feasibility. In this case the column can be fixed on its upper bound * and removed from the problem. And if the column has no upper bound * (u[q] = +oo), the problem has no dual feasible solution. * * Finally, if the following condition holds: * * - eps <= c[q] <= +eps, (6) * * dual feasibility does not depend on a particular value of column q. * In this case the column can be fixed either on its lower bound (if * l[q] > -oo) or on its upper bound (if u[q] < +oo) or at zero (if the * column is unbounded) and then removed from the problem. * * RECOVERING BASIC SOLUTION * * See the routine npp_fixed_col. Having been recovered the column * is assigned status GLP_NS. However, if actually it is not fixed * (l[q] < u[q]), its status should be changed to GLP_NL, GLP_NU, or * GLP_NF depending on which bound it was fixed on transformation stage. * * RECOVERING INTERIOR-POINT SOLUTION * * See the routine npp_fixed_col. * * RECOVERING MIP SOLUTION * * See the routine npp_fixed_col. */ struct empty_col { /* empty column */ int q; /* column reference number */ char stat; /* status in basic solution */ }; static int rcv_empty_col(NPP *npp, void *info); int npp_empty_col(NPP *npp, NPPCOL *q) { /* process empty column */ struct empty_col *info; double eps = 1e-3; /* the column must be empty */ xassert(q->ptr == NULL); /* check dual feasibility */ if (q->coef > +eps && q->lb == -DBL_MAX) return 1; if (q->coef < -eps && q->ub == +DBL_MAX) return 1; /* create transformation stack entry */ info = npp_push_tse(npp, rcv_empty_col, sizeof(struct empty_col)); info->q = q->j; /* fix the column */ if (q->lb == -DBL_MAX && q->ub == +DBL_MAX) { /* free column */ info->stat = GLP_NF; q->lb = q->ub = 0.0; } else if (q->ub == +DBL_MAX) lo: { /* column with lower bound */ info->stat = GLP_NL; q->ub = q->lb; } else if (q->lb == -DBL_MAX) up: { /* column with upper bound */ info->stat = GLP_NU; q->lb = q->ub; } else if (q->lb != q->ub) { /* double-bounded column */ if (q->coef >= +DBL_EPSILON) goto lo; if (q->coef <= -DBL_EPSILON) goto up; if (fabs(q->lb) <= fabs(q->ub)) goto lo; else goto up; } else { /* fixed column */ info->stat = GLP_NS; } /* process fixed column */ npp_fixed_col(npp, q); return 0; } static int rcv_empty_col(NPP *npp, void *_info) { /* recover empty column */ struct empty_col *info = _info; if (npp->sol == GLP_SOL) npp->c_stat[info->q] = info->stat; return 0; } /*********************************************************************** * NAME * * npp_implied_value - process implied column value * * SYNOPSIS * * #include "glpnpp.h" * int npp_implied_value(NPP *npp, NPPCOL *q, double s); * * DESCRIPTION * * For column q: * * l[q] <= x[q] <= u[q], (1) * * where l[q] < u[q], the routine npp_implied_value processes its * implied value s[q]. If this implied value satisfies to the current * column bounds and integrality condition, the routine fixes column q * at the given point. Note that the column is kept in the problem in * any case. * * RETURNS * * 0 - column has been fixed; * * 1 - implied value violates to current column bounds; * * 2 - implied value violates integrality condition. * * ALGORITHM * * Implied column value s[q] satisfies to the current column bounds if * the following condition holds: * * l[q] - eps <= s[q] <= u[q] + eps, (2) * * where eps is an absolute tolerance for column value. If the column * is integral, the following condition also must hold: * * |s[q] - floor(s[q]+0.5)| <= eps, (3) * * where floor(s[q]+0.5) is the nearest integer to s[q]. * * If both condition (2) and (3) are satisfied, the column can be fixed * at the value s[q], or, if it is integral, at floor(s[q]+0.5). * Otherwise, if s[q] violates (2) or (3), the problem has no feasible * solution. * * Note: If s[q] is close to l[q] or u[q], it seems to be reasonable to * fix the column at its lower or upper bound, resp. rather than at the * implied value. */ int npp_implied_value(NPP *npp, NPPCOL *q, double s) { /* process implied column value */ double eps, nint; xassert(npp == npp); /* column must not be fixed */ xassert(q->lb < q->ub); /* check integrality */ if (q->is_int) { nint = floor(s + 0.5); if (fabs(s - nint) <= 1e-5) s = nint; else return 2; } /* check current column lower bound */ if (q->lb != -DBL_MAX) { eps = (q->is_int ? 1e-5 : 1e-5 + 1e-8 * fabs(q->lb)); if (s < q->lb - eps) return 1; /* if s[q] is close to l[q], fix column at its lower bound rather than at the implied value */ if (s < q->lb + 1e-3 * eps) { q->ub = q->lb; return 0; } } /* check current column upper bound */ if (q->ub != +DBL_MAX) { eps = (q->is_int ? 1e-5 : 1e-5 + 1e-8 * fabs(q->ub)); if (s > q->ub + eps) return 1; /* if s[q] is close to u[q], fix column at its upper bound rather than at the implied value */ if (s > q->ub - 1e-3 * eps) { q->lb = q->ub; return 0; } } /* fix column at the implied value */ q->lb = q->ub = s; return 0; } /*********************************************************************** * NAME * * npp_eq_singlet - process row singleton (equality constraint) * * SYNOPSIS * * #include "glpnpp.h" * int npp_eq_singlet(NPP *npp, NPPROW *p); * * DESCRIPTION * * The routine npp_eq_singlet processes row p, which is equiality * constraint having the only non-zero coefficient: * * a[p,q] x[q] = b. (1) * * RETURNS * * 0 - success; * * 1 - problem has no primal feasible solution; * * 2 - problem has no integer feasible solution. * * PROBLEM TRANSFORMATION * * The equality constraint defines implied value of column q: * * x[q] = s[q] = b / a[p,q]. (2) * * If the implied value s[q] satisfies to the column bounds (see the * routine npp_implied_value), the column can be fixed at s[q] and * removed from the problem. In this case row p becomes redundant, so * it can be replaced by equivalent free row and also removed from the * problem. * * Note that the routine removes from the problem only row p. Column q * becomes fixed, however, it is kept in the problem. * * RECOVERING BASIC SOLUTION * * In solution to the original problem row p is assigned status GLP_NS * (active equality constraint), and column q is assigned status GLP_BS * (basic column). * * Multiplier for row p can be computed as follows. In the dual system * of the original problem column q corresponds to the following row: * * sum a[i,q] pi[i] + lambda[q] = c[q] ==> * i * * sum a[i,q] pi[i] + a[p,q] pi[p] + lambda[q] = c[q]. * i!=p * * Therefore: * * 1 * pi[p] = ------ (c[q] - lambda[q] - sum a[i,q] pi[i]), (3) * a[p,q] i!=q * * where lambda[q] = 0 (since column[q] is basic), and pi[i] for all * i != p are known in solution to the transformed problem. * * Value of column q in solution to the original problem is assigned * its implied value s[q]. * * RECOVERING INTERIOR-POINT SOLUTION * * Multiplier for row p is computed with formula (3). Value of column * q is assigned its implied value s[q]. * * RECOVERING MIP SOLUTION * * Value of column q is assigned its implied value s[q]. */ struct eq_singlet { /* row singleton (equality constraint) */ int p; /* row reference number */ int q; /* column reference number */ double apq; /* constraint coefficient a[p,q] */ double c; /* objective coefficient at x[q] */ NPPLFE *ptr; /* list of non-zero coefficients a[i,q], i != p */ }; static int rcv_eq_singlet(NPP *npp, void *info); int npp_eq_singlet(NPP *npp, NPPROW *p) { /* process row singleton (equality constraint) */ struct eq_singlet *info; NPPCOL *q; NPPAIJ *aij; NPPLFE *lfe; int ret; double s; /* the row must be singleton equality constraint */ xassert(p->lb == p->ub); xassert(p->ptr != NULL && p->ptr->r_next == NULL); /* compute and process implied column value */ aij = p->ptr; q = aij->col; s = p->lb / aij->val; ret = npp_implied_value(npp, q, s); xassert(0 <= ret && ret <= 2); if (ret != 0) return ret; /* create transformation stack entry */ info = npp_push_tse(npp, rcv_eq_singlet, sizeof(struct eq_singlet)); info->p = p->i; info->q = q->j; info->apq = aij->val; info->c = q->coef; info->ptr = NULL; /* save column coefficients a[i,q], i != p (not needed for MIP solution) */ if (npp->sol != GLP_MIP) { for (aij = q->ptr; aij != NULL; aij = aij->c_next) { if (aij->row == p) continue; /* skip a[p,q] */ lfe = dmp_get_atom(npp->stack, sizeof(NPPLFE)); lfe->ref = aij->row->i; lfe->val = aij->val; lfe->next = info->ptr; info->ptr = lfe; } } /* remove the row from the problem */ npp_del_row(npp, p); return 0; } static int rcv_eq_singlet(NPP *npp, void *_info) { /* recover row singleton (equality constraint) */ struct eq_singlet *info = _info; NPPLFE *lfe; double temp; if (npp->sol == GLP_SOL) { /* column q must be already recovered as GLP_NS */ if (npp->c_stat[info->q] != GLP_NS) { npp_error(); return 1; } npp->r_stat[info->p] = GLP_NS; npp->c_stat[info->q] = GLP_BS; } if (npp->sol != GLP_MIP) { /* compute multiplier for row p with formula (3) */ temp = info->c; for (lfe = info->ptr; lfe != NULL; lfe = lfe->next) temp -= lfe->val * npp->r_pi[lfe->ref]; npp->r_pi[info->p] = temp / info->apq; } return 0; } /*********************************************************************** * NAME * * npp_implied_lower - process implied column lower bound * * SYNOPSIS * * #include "glpnpp.h" * int npp_implied_lower(NPP *npp, NPPCOL *q, double l); * * DESCRIPTION * * For column q: * * l[q] <= x[q] <= u[q], (1) * * where l[q] < u[q], the routine npp_implied_lower processes its * implied lower bound l'[q]. As the result the current column lower * bound may increase. Note that the column is kept in the problem in * any case. * * RETURNS * * 0 - current column lower bound has not changed; * * 1 - current column lower bound has changed, but not significantly; * * 2 - current column lower bound has significantly changed; * * 3 - column has been fixed on its upper bound; * * 4 - implied lower bound violates current column upper bound. * * ALGORITHM * * If column q is integral, before processing its implied lower bound * should be rounded up: * * ( floor(l'[q]+0.5), if |l'[q] - floor(l'[q]+0.5)| <= eps * l'[q] := < (2) * ( ceil(l'[q]), otherwise * * where floor(l'[q]+0.5) is the nearest integer to l'[q], ceil(l'[q]) * is smallest integer not less than l'[q], and eps is an absolute * tolerance for column value. * * Processing implied column lower bound l'[q] includes the following * cases: * * 1) if l'[q] < l[q] + eps, implied lower bound is redundant; * * 2) if l[q] + eps <= l[q] <= u[q] + eps, current column lower bound * l[q] can be strengthened by replacing it with l'[q]. If in this * case new column lower bound becomes close to current column upper * bound u[q], the column can be fixed on its upper bound; * * 3) if l'[q] > u[q] + eps, implied lower bound violates current * column upper bound u[q], in which case the problem has no primal * feasible solution. */ int npp_implied_lower(NPP *npp, NPPCOL *q, double l) { /* process implied column lower bound */ int ret; double eps, nint; xassert(npp == npp); /* column must not be fixed */ xassert(q->lb < q->ub); /* implied lower bound must be finite */ xassert(l != -DBL_MAX); /* if column is integral, round up l'[q] */ if (q->is_int) { nint = floor(l + 0.5); if (fabs(l - nint) <= 1e-5) l = nint; else l = ceil(l); } /* check current column lower bound */ if (q->lb != -DBL_MAX) { eps = (q->is_int ? 1e-3 : 1e-3 + 1e-6 * fabs(q->lb)); if (l < q->lb + eps) { ret = 0; /* redundant */ goto done; } } /* check current column upper bound */ if (q->ub != +DBL_MAX) { eps = (q->is_int ? 1e-5 : 1e-5 + 1e-8 * fabs(q->ub)); if (l > q->ub + eps) { ret = 4; /* infeasible */ goto done; } /* if l'[q] is close to u[q], fix column at its upper bound */ if (l > q->ub - 1e-3 * eps) { q->lb = q->ub; ret = 3; /* fixed */ goto done; } } /* check if column lower bound changes significantly */ if (q->lb == -DBL_MAX) ret = 2; /* significantly */ else if (q->is_int && l > q->lb + 0.5) ret = 2; /* significantly */ else if (l > q->lb + 0.30 * (1.0 + fabs(q->lb))) ret = 2; /* significantly */ else ret = 1; /* not significantly */ /* set new column lower bound */ q->lb = l; done: return ret; } /*********************************************************************** * NAME * * npp_implied_upper - process implied column upper bound * * SYNOPSIS * * #include "glpnpp.h" * int npp_implied_upper(NPP *npp, NPPCOL *q, double u); * * DESCRIPTION * * For column q: * * l[q] <= x[q] <= u[q], (1) * * where l[q] < u[q], the routine npp_implied_upper processes its * implied upper bound u'[q]. As the result the current column upper * bound may decrease. Note that the column is kept in the problem in * any case. * * RETURNS * * 0 - current column upper bound has not changed; * * 1 - current column upper bound has changed, but not significantly; * * 2 - current column upper bound has significantly changed; * * 3 - column has been fixed on its lower bound; * * 4 - implied upper bound violates current column lower bound. * * ALGORITHM * * If column q is integral, before processing its implied upper bound * should be rounded down: * * ( floor(u'[q]+0.5), if |u'[q] - floor(l'[q]+0.5)| <= eps * u'[q] := < (2) * ( floor(l'[q]), otherwise * * where floor(u'[q]+0.5) is the nearest integer to u'[q], * floor(u'[q]) is largest integer not greater than u'[q], and eps is * an absolute tolerance for column value. * * Processing implied column upper bound u'[q] includes the following * cases: * * 1) if u'[q] > u[q] - eps, implied upper bound is redundant; * * 2) if l[q] - eps <= u[q] <= u[q] - eps, current column upper bound * u[q] can be strengthened by replacing it with u'[q]. If in this * case new column upper bound becomes close to current column lower * bound, the column can be fixed on its lower bound; * * 3) if u'[q] < l[q] - eps, implied upper bound violates current * column lower bound l[q], in which case the problem has no primal * feasible solution. */ int npp_implied_upper(NPP *npp, NPPCOL *q, double u) { int ret; double eps, nint; xassert(npp == npp); /* column must not be fixed */ xassert(q->lb < q->ub); /* implied upper bound must be finite */ xassert(u != +DBL_MAX); /* if column is integral, round down u'[q] */ if (q->is_int) { nint = floor(u + 0.5); if (fabs(u - nint) <= 1e-5) u = nint; else u = floor(u); } /* check current column upper bound */ if (q->ub != +DBL_MAX) { eps = (q->is_int ? 1e-3 : 1e-3 + 1e-6 * fabs(q->ub)); if (u > q->ub - eps) { ret = 0; /* redundant */ goto done; } } /* check current column lower bound */ if (q->lb != -DBL_MAX) { eps = (q->is_int ? 1e-5 : 1e-5 + 1e-8 * fabs(q->lb)); if (u < q->lb - eps) { ret = 4; /* infeasible */ goto done; } /* if u'[q] is close to l[q], fix column at its lower bound */ if (u < q->lb + 1e-3 * eps) { q->ub = q->lb; ret = 3; /* fixed */ goto done; } } /* check if column upper bound changes significantly */ if (q->ub == +DBL_MAX) ret = 2; /* significantly */ else if (q->is_int && u < q->ub - 0.5) ret = 2; /* significantly */ else if (u < q->ub - 0.30 * (1.0 + fabs(q->ub))) ret = 2; /* significantly */ else ret = 1; /* not significantly */ /* set new column upper bound */ q->ub = u; done: return ret; } /*********************************************************************** * NAME * * npp_ineq_singlet - process row singleton (inequality constraint) * * SYNOPSIS * * #include "glpnpp.h" * int npp_ineq_singlet(NPP *npp, NPPROW *p); * * DESCRIPTION * * The routine npp_ineq_singlet processes row p, which is inequality * constraint having the only non-zero coefficient: * * L[p] <= a[p,q] * x[q] <= U[p], (1) * * where L[p] < U[p], L[p] > -oo and/or U[p] < +oo. * * RETURNS * * 0 - current column bounds have not changed; * * 1 - current column bounds have changed, but not significantly; * * 2 - current column bounds have significantly changed; * * 3 - column has been fixed on its lower or upper bound; * * 4 - problem has no primal feasible solution. * * PROBLEM TRANSFORMATION * * Inequality constraint (1) defines implied bounds of column q: * * ( L[p] / a[p,q], if a[p,q] > 0 * l'[q] = < (2) * ( U[p] / a[p,q], if a[p,q] < 0 * * ( U[p] / a[p,q], if a[p,q] > 0 * u'[q] = < (3) * ( L[p] / a[p,q], if a[p,q] < 0 * * If these implied bounds do not violate current bounds of column q: * * l[q] <= x[q] <= u[q], (4) * * they can be used to strengthen the current column bounds: * * l[q] := max(l[q], l'[q]), (5) * * u[q] := min(u[q], u'[q]). (6) * * (See the routines npp_implied_lower and npp_implied_upper.) * * Once bounds of row p (1) have been carried over column q, the row * becomes redundant, so it can be replaced by equivalent free row and * removed from the problem. * * Note that the routine removes from the problem only row p. Column q, * even it has been fixed, is kept in the problem. * * RECOVERING BASIC SOLUTION * * Note that the row in the dual system corresponding to column q is * the following: * * sum a[i,q] pi[i] + lambda[q] = c[q] ==> * i * (7) * sum a[i,q] pi[i] + a[p,q] pi[p] + lambda[q] = c[q], * i!=p * * where pi[i] for all i != p are known in solution to the transformed * problem. Row p does not exist in the transformed problem, so it has * zero multiplier there. This allows computing multiplier for column q * in solution to the transformed problem: * * lambda~[q] = c[q] - sum a[i,q] pi[i]. (8) * i!=p * * Let in solution to the transformed problem column q be non-basic * with lower bound active (GLP_NL, lambda~[q] >= 0), and this lower * bound be implied one l'[q]. From the original problem's standpoint * this then means that actually the original column lower bound l[q] * is inactive, and active is that row bound L[p] or U[p] that defines * the implied bound l'[q] (2). In this case in solution to the * original problem column q is assigned status GLP_BS while row p is * assigned status GLP_NL (if a[p,q] > 0) or GLP_NU (if a[p,q] < 0). * Since now column q is basic, its multiplier lambda[q] is zero. This * allows using (7) and (8) to find multiplier for row p in solution to * the original problem: * * 1 * pi[p] = ------ (c[q] - sum a[i,q] pi[i]) = lambda~[q] / a[p,q] (9) * a[p,q] i!=p * * Now let in solution to the transformed problem column q be non-basic * with upper bound active (GLP_NU, lambda~[q] <= 0), and this upper * bound be implied one u'[q]. As in the previous case this then means * that from the original problem's standpoint actually the original * column upper bound u[q] is inactive, and active is that row bound * L[p] or U[p] that defines the implied bound u'[q] (3). In this case * in solution to the original problem column q is assigned status * GLP_BS, row p is assigned status GLP_NU (if a[p,q] > 0) or GLP_NL * (if a[p,q] < 0), and its multiplier is computed with formula (9). * * Strengthening bounds of column q according to (5) and (6) may make * it fixed. Thus, if in solution to the transformed problem column q is * non-basic and fixed (GLP_NS), we can suppose that if lambda~[q] > 0, * column q has active lower bound (GLP_NL), and if lambda~[q] < 0, * column q has active upper bound (GLP_NU), reducing this case to two * previous ones. If, however, lambda~[q] is close to zero or * corresponding bound of row p does not exist (this may happen if * lambda~[q] has wrong sign due to round-off errors, in which case it * is expected to be close to zero, since solution is assumed to be dual * feasible), column q can be assigned status GLP_BS (basic), and row p * can be made active on its existing bound. In the latter case row * multiplier pi[p] computed with formula (9) will be also close to * zero, and dual feasibility will be kept. * * In all other cases, namely, if in solution to the transformed * problem column q is basic (GLP_BS), or non-basic with original lower * bound l[q] active (GLP_NL), or non-basic with original upper bound * u[q] active (GLP_NU), constraint (1) is inactive. So in solution to * the original problem status of column q remains unchanged, row p is * assigned status GLP_BS, and its multiplier pi[p] is assigned zero * value. * * RECOVERING INTERIOR-POINT SOLUTION * * First, value of multiplier for column q in solution to the original * problem is computed with formula (8). If lambda~[q] > 0 and column q * has implied lower bound, or if lambda~[q] < 0 and column q has * implied upper bound, this means that from the original problem's * standpoint actually row p has corresponding active bound, in which * case its multiplier pi[p] is computed with formula (9). In other * cases, when the sign of lambda~[q] corresponds to original bound of * column q, or when lambda~[q] =~ 0, value of row multiplier pi[p] is * assigned zero value. * * RECOVERING MIP SOLUTION * * None needed. */ struct ineq_singlet { /* row singleton (inequality constraint) */ int p; /* row reference number */ int q; /* column reference number */ double apq; /* constraint coefficient a[p,q] */ double c; /* objective coefficient at x[q] */ double lb; /* row lower bound */ double ub; /* row upper bound */ char lb_changed; /* this flag is set if column lower bound was changed */ char ub_changed; /* this flag is set if column upper bound was changed */ NPPLFE *ptr; /* list of non-zero coefficients a[i,q], i != p */ }; static int rcv_ineq_singlet(NPP *npp, void *info); int npp_ineq_singlet(NPP *npp, NPPROW *p) { /* process row singleton (inequality constraint) */ struct ineq_singlet *info; NPPCOL *q; NPPAIJ *apq, *aij; NPPLFE *lfe; int lb_changed, ub_changed; double ll, uu; /* the row must be singleton inequality constraint */ xassert(p->lb != -DBL_MAX || p->ub != +DBL_MAX); xassert(p->lb < p->ub); xassert(p->ptr != NULL && p->ptr->r_next == NULL); /* compute implied column bounds */ apq = p->ptr; q = apq->col; xassert(q->lb < q->ub); if (apq->val > 0.0) { ll = (p->lb == -DBL_MAX ? -DBL_MAX : p->lb / apq->val); uu = (p->ub == +DBL_MAX ? +DBL_MAX : p->ub / apq->val); } else { ll = (p->ub == +DBL_MAX ? -DBL_MAX : p->ub / apq->val); uu = (p->lb == -DBL_MAX ? +DBL_MAX : p->lb / apq->val); } /* process implied column lower bound */ if (ll == -DBL_MAX) lb_changed = 0; else { lb_changed = npp_implied_lower(npp, q, ll); xassert(0 <= lb_changed && lb_changed <= 4); if (lb_changed == 4) return 4; /* infeasible */ } /* process implied column upper bound */ if (uu == +DBL_MAX) ub_changed = 0; else if (lb_changed == 3) { /* column was fixed on its upper bound due to l'[q] = u[q] */ /* note that L[p] < U[p], so l'[q] = u[q] < u'[q] */ ub_changed = 0; } else { ub_changed = npp_implied_upper(npp, q, uu); xassert(0 <= ub_changed && ub_changed <= 4); if (ub_changed == 4) return 4; /* infeasible */ } /* if neither lower nor upper column bound was changed, the row is originally redundant and can be replaced by free row */ if (!lb_changed && !ub_changed) { p->lb = -DBL_MAX, p->ub = +DBL_MAX; npp_free_row(npp, p); return 0; } /* create transformation stack entry */ info = npp_push_tse(npp, rcv_ineq_singlet, sizeof(struct ineq_singlet)); info->p = p->i; info->q = q->j; info->apq = apq->val; info->c = q->coef; info->lb = p->lb; info->ub = p->ub; info->lb_changed = (char)lb_changed; info->ub_changed = (char)ub_changed; info->ptr = NULL; /* save column coefficients a[i,q], i != p (not needed for MIP solution) */ if (npp->sol != GLP_MIP) { for (aij = q->ptr; aij != NULL; aij = aij->c_next) { if (aij == apq) continue; /* skip a[p,q] */ lfe = dmp_get_atom(npp->stack, sizeof(NPPLFE)); lfe->ref = aij->row->i; lfe->val = aij->val; lfe->next = info->ptr; info->ptr = lfe; } } /* remove the row from the problem */ npp_del_row(npp, p); return lb_changed >= ub_changed ? lb_changed : ub_changed; } static int rcv_ineq_singlet(NPP *npp, void *_info) { /* recover row singleton (inequality constraint) */ struct ineq_singlet *info = _info; NPPLFE *lfe; double lambda; if (npp->sol == GLP_MIP) goto done; /* compute lambda~[q] in solution to the transformed problem with formula (8) */ lambda = info->c; for (lfe = info->ptr; lfe != NULL; lfe = lfe->next) lambda -= lfe->val * npp->r_pi[lfe->ref]; if (npp->sol == GLP_SOL) { /* recover basic solution */ if (npp->c_stat[info->q] == GLP_BS) { /* column q is basic, so row p is inactive */ npp->r_stat[info->p] = GLP_BS; npp->r_pi[info->p] = 0.0; } else if (npp->c_stat[info->q] == GLP_NL) nl: { /* column q is non-basic with lower bound active */ if (info->lb_changed) { /* it is implied bound, so actually row p is active while column q is basic */ npp->r_stat[info->p] = (char)(info->apq > 0.0 ? GLP_NL : GLP_NU); npp->c_stat[info->q] = GLP_BS; npp->r_pi[info->p] = lambda / info->apq; } else { /* it is original bound, so row p is inactive */ npp->r_stat[info->p] = GLP_BS; npp->r_pi[info->p] = 0.0; } } else if (npp->c_stat[info->q] == GLP_NU) nu: { /* column q is non-basic with upper bound active */ if (info->ub_changed) { /* it is implied bound, so actually row p is active while column q is basic */ npp->r_stat[info->p] = (char)(info->apq > 0.0 ? GLP_NU : GLP_NL); npp->c_stat[info->q] = GLP_BS; npp->r_pi[info->p] = lambda / info->apq; } else { /* it is original bound, so row p is inactive */ npp->r_stat[info->p] = GLP_BS; npp->r_pi[info->p] = 0.0; } } else if (npp->c_stat[info->q] == GLP_NS) { /* column q is non-basic and fixed; note, however, that in in the original problem it is non-fixed */ if (lambda > +1e-7) { if (info->apq > 0.0 && info->lb != -DBL_MAX || info->apq < 0.0 && info->ub != +DBL_MAX || !info->lb_changed) { /* either corresponding bound of row p exists or column q remains non-basic with its original lower bound active */ npp->c_stat[info->q] = GLP_NL; goto nl; } } if (lambda < -1e-7) { if (info->apq > 0.0 && info->ub != +DBL_MAX || info->apq < 0.0 && info->lb != -DBL_MAX || !info->ub_changed) { /* either corresponding bound of row p exists or column q remains non-basic with its original upper bound active */ npp->c_stat[info->q] = GLP_NU; goto nu; } } /* either lambda~[q] is close to zero, or corresponding bound of row p does not exist, because lambda~[q] has wrong sign due to round-off errors; in the latter case lambda~[q] is also assumed to be close to zero; so, we can make row p active on its existing bound and column q basic; pi[p] will have wrong sign, but it also will be close to zero (rarus casus of dual degeneracy) */ if (info->lb != -DBL_MAX && info->ub == +DBL_MAX) { /* row lower bound exists, but upper bound doesn't */ npp->r_stat[info->p] = GLP_NL; } else if (info->lb == -DBL_MAX && info->ub != +DBL_MAX) { /* row upper bound exists, but lower bound doesn't */ npp->r_stat[info->p] = GLP_NU; } else if (info->lb != -DBL_MAX && info->ub != +DBL_MAX) { /* both row lower and upper bounds exist */ /* to choose proper active row bound we should not use lambda~[q], because its value being close to zero is unreliable; so we choose that bound which provides primal feasibility for original constraint (1) */ if (info->apq * npp->c_value[info->q] <= 0.5 * (info->lb + info->ub)) npp->r_stat[info->p] = GLP_NL; else npp->r_stat[info->p] = GLP_NU; } else { npp_error(); return 1; } npp->c_stat[info->q] = GLP_BS; npp->r_pi[info->p] = lambda / info->apq; } else { npp_error(); return 1; } } if (npp->sol == GLP_IPT) { /* recover interior-point solution */ if (lambda > +DBL_EPSILON && info->lb_changed || lambda < -DBL_EPSILON && info->ub_changed) { /* actually row p has corresponding active bound */ npp->r_pi[info->p] = lambda / info->apq; } else { /* either bounds of column q are both inactive or its original bound is active */ npp->r_pi[info->p] = 0.0; } } done: return 0; } /*********************************************************************** * NAME * * npp_implied_slack - process column singleton (implied slack variable) * * SYNOPSIS * * #include "glpnpp.h" * void npp_implied_slack(NPP *npp, NPPCOL *q); * * DESCRIPTION * * The routine npp_implied_slack processes column q: * * l[q] <= x[q] <= u[q], (1) * * where l[q] < u[q], having the only non-zero coefficient in row p, * which is equality constraint: * * sum a[p,j] x[j] + a[p,q] x[q] = b. (2) * j!=q * * PROBLEM TRANSFORMATION * * (If x[q] is integral, this transformation must not be used.) * * The term a[p,q] x[q] in constraint (2) can be considered as a slack * variable that allows to carry bounds of column q over row p and then * remove column q from the problem. * * Constraint (2) can be written as follows: * * sum a[p,j] x[j] = b - a[p,q] x[q]. (3) * j!=q * * According to (1) constraint (3) is equivalent to the following * inequality constraint: * * L[p] <= sum a[p,j] x[j] <= U[p], (4) * j!=q * * where * * ( b - a[p,q] u[q], if a[p,q] > 0 * L[p] = < (5) * ( b - a[p,q] l[q], if a[p,q] < 0 * * ( b - a[p,q] l[q], if a[p,q] > 0 * U[p] = < (6) * ( b - a[p,q] u[q], if a[p,q] < 0 * * From (2) it follows that: * * 1 * x[q] = ------ (b - sum a[p,j] x[j]). (7) * a[p,q] j!=q * * In order to eliminate x[q] from the objective row we substitute it * from (6) to that row: * * z = sum c[j] x[j] + c[q] x[q] + c[0] = * j!=q * 1 * = sum c[j] x[j] + c[q] [------ (b - sum a[p,j] x[j])] + c0 = * j!=q a[p,q] j!=q * * = sum c~[j] x[j] + c~[0], * j!=q * a[p,j] b * c~[j] = c[j] - c[q] ------, c~0 = c0 - c[q] ------ (8) * a[p,q] a[p,q] * * are values of objective coefficients and constant term, resp., in * the transformed problem. * * Note that column q is column singleton, so in the dual system of the * original problem it corresponds to the following row singleton: * * a[p,q] pi[p] + lambda[q] = c[q]. (9) * * In the transformed problem row (9) would be the following: * * a[p,q] pi~[p] + lambda[q] = c~[q] = 0. (10) * * Subtracting (10) from (9) we have: * * a[p,q] (pi[p] - pi~[p]) = c[q] * * that gives the following formula to compute multiplier for row p in * solution to the original problem using its value in solution to the * transformed problem: * * pi[p] = pi~[p] + c[q] / a[p,q]. (11) * * RECOVERING BASIC SOLUTION * * Status of column q in solution to the original problem is defined * by status of row p in solution to the transformed problem and the * sign of coefficient a[p,q] in the original inequality constraint (2) * as follows: * * +-----------------------+---------+--------------------+ * | Status of row p | Sign of | Status of column q | * | (transformed problem) | a[p,q] | (original problem) | * +-----------------------+---------+--------------------+ * | GLP_BS | + / - | GLP_BS | * | GLP_NL | + | GLP_NU | * | GLP_NL | - | GLP_NL | * | GLP_NU | + | GLP_NL | * | GLP_NU | - | GLP_NU | * | GLP_NF | + / - | GLP_NF | * +-----------------------+---------+--------------------+ * * Value of column q is computed with formula (7). Since originally row * p is equality constraint, its status is assigned GLP_NS, and value of * its multiplier pi[p] is computed with formula (11). * * RECOVERING INTERIOR-POINT SOLUTION * * Value of column q is computed with formula (7). Row multiplier value * pi[p] is computed with formula (11). * * RECOVERING MIP SOLUTION * * Value of column q is computed with formula (7). */ struct implied_slack { /* column singleton (implied slack variable) */ int p; /* row reference number */ int q; /* column reference number */ double apq; /* constraint coefficient a[p,q] */ double b; /* right-hand side of original equality constraint */ double c; /* original objective coefficient at x[q] */ NPPLFE *ptr; /* list of non-zero coefficients a[p,j], j != q */ }; static int rcv_implied_slack(NPP *npp, void *info); void npp_implied_slack(NPP *npp, NPPCOL *q) { /* process column singleton (implied slack variable) */ struct implied_slack *info; NPPROW *p; NPPAIJ *aij; NPPLFE *lfe; /* the column must be non-integral non-fixed singleton */ xassert(!q->is_int); xassert(q->lb < q->ub); xassert(q->ptr != NULL && q->ptr->c_next == NULL); /* corresponding row must be equality constraint */ aij = q->ptr; p = aij->row; xassert(p->lb == p->ub); /* create transformation stack entry */ info = npp_push_tse(npp, rcv_implied_slack, sizeof(struct implied_slack)); info->p = p->i; info->q = q->j; info->apq = aij->val; info->b = p->lb; info->c = q->coef; info->ptr = NULL; /* save row coefficients a[p,j], j != q, and substitute x[q] into the objective row */ for (aij = p->ptr; aij != NULL; aij = aij->r_next) { if (aij->col == q) continue; /* skip a[p,q] */ lfe = dmp_get_atom(npp->stack, sizeof(NPPLFE)); lfe->ref = aij->col->j; lfe->val = aij->val; lfe->next = info->ptr; info->ptr = lfe; aij->col->coef -= info->c * (aij->val / info->apq); } npp->c0 += info->c * (info->b / info->apq); /* compute new row bounds */ if (info->apq > 0.0) { p->lb = (q->ub == +DBL_MAX ? -DBL_MAX : info->b - info->apq * q->ub); p->ub = (q->lb == -DBL_MAX ? +DBL_MAX : info->b - info->apq * q->lb); } else { p->lb = (q->lb == -DBL_MAX ? -DBL_MAX : info->b - info->apq * q->lb); p->ub = (q->ub == +DBL_MAX ? +DBL_MAX : info->b - info->apq * q->ub); } /* remove the column from the problem */ npp_del_col(npp, q); return; } static int rcv_implied_slack(NPP *npp, void *_info) { /* recover column singleton (implied slack variable) */ struct implied_slack *info = _info; NPPLFE *lfe; double temp; if (npp->sol == GLP_SOL) { /* assign statuses to row p and column q */ if (npp->r_stat[info->p] == GLP_BS || npp->r_stat[info->p] == GLP_NF) npp->c_stat[info->q] = npp->r_stat[info->p]; else if (npp->r_stat[info->p] == GLP_NL) npp->c_stat[info->q] = (char)(info->apq > 0.0 ? GLP_NU : GLP_NL); else if (npp->r_stat[info->p] == GLP_NU) npp->c_stat[info->q] = (char)(info->apq > 0.0 ? GLP_NL : GLP_NU); else { npp_error(); return 1; } npp->r_stat[info->p] = GLP_NS; } if (npp->sol != GLP_MIP) { /* compute multiplier for row p */ npp->r_pi[info->p] += info->c / info->apq; } /* compute value of column q */ temp = info->b; for (lfe = info->ptr; lfe != NULL; lfe = lfe->next) temp -= lfe->val * npp->c_value[lfe->ref]; npp->c_value[info->q] = temp / info->apq; return 0; } /*********************************************************************** * NAME * * npp_implied_free - process column singleton (implied free variable) * * SYNOPSIS * * #include "glpnpp.h" * int npp_implied_free(NPP *npp, NPPCOL *q); * * DESCRIPTION * * The routine npp_implied_free processes column q: * * l[q] <= x[q] <= u[q], (1) * * having non-zero coefficient in the only row p, which is inequality * constraint: * * L[p] <= sum a[p,j] x[j] + a[p,q] x[q] <= U[p], (2) * j!=q * * where l[q] < u[q], L[p] < U[p], L[p] > -oo and/or U[p] < +oo. * * RETURNS * * 0 - success; * * 1 - column lower and/or upper bound(s) can be active; * * 2 - problem has no dual feasible solution. * * PROBLEM TRANSFORMATION * * Constraint (2) can be written as follows: * * L[p] - sum a[p,j] x[j] <= a[p,q] x[q] <= U[p] - sum a[p,j] x[j], * j!=q j!=q * * from which it follows that: * * alfa <= a[p,q] x[q] <= beta, (3) * * where * * alfa = inf(L[p] - sum a[p,j] x[j]) = * j!=q * * = L[p] - sup sum a[p,j] x[j] = (4) * j!=q * * = L[p] - sum a[p,j] u[j] - sum a[p,j] l[j], * j in Jp j in Jn * * beta = sup(L[p] - sum a[p,j] x[j]) = * j!=q * * = L[p] - inf sum a[p,j] x[j] = (5) * j!=q * * = L[p] - sum a[p,j] l[j] - sum a[p,j] u[j], * j in Jp j in Jn * * Jp = {j != q: a[p,j] > 0}, Jn = {j != q: a[p,j] < 0}. (6) * * Inequality (3) defines implied bounds of variable x[q]: * * l'[q] <= x[q] <= u'[q], (7) * * where * * ( alfa / a[p,q], if a[p,q] > 0 * l'[q] = < (8a) * ( beta / a[p,q], if a[p,q] < 0 * * ( beta / a[p,q], if a[p,q] > 0 * u'[q] = < (8b) * ( alfa / a[p,q], if a[p,q] < 0 * * Thus, if l'[q] > l[q] - eps and u'[q] < u[q] + eps, where eps is * an absolute tolerance for column value, column bounds (1) cannot be * active, in which case column q can be replaced by equivalent free * (unbounded) column. * * Note that column q is column singleton, so in the dual system of the * original problem it corresponds to the following row singleton: * * a[p,q] pi[p] + lambda[q] = c[q], (9) * * from which it follows that: * * pi[p] = (c[q] - lambda[q]) / a[p,q]. (10) * * Let x[q] be implied free (unbounded) variable. Then column q can be * only basic, so its multiplier lambda[q] is equal to zero, and from * (10) we have: * * pi[p] = c[q] / a[p,q]. (11) * * There are possible three cases: * * 1) pi[p] < -eps, where eps is an absolute tolerance for row * multiplier. In this case, to provide dual feasibility of the * original problem, row p must be active on its lower bound, and * if its lower bound does not exist (L[p] = -oo), the problem has * no dual feasible solution; * * 2) pi[p] > +eps. In this case row p must be active on its upper * bound, and if its upper bound does not exist (U[p] = +oo), the * problem has no dual feasible solution; * * 3) -eps <= pi[p] <= +eps. In this case any (either lower or upper) * bound of row p can be active, because this does not affect dual * feasibility. * * Thus, in all three cases original inequality constraint (2) can be * replaced by equality constraint, where the right-hand side is either * lower or upper bound of row p, and bounds of column q can be removed * that makes it free (unbounded). (May note that this transformation * can be followed by transformation "Column singleton (implied slack * variable)" performed by the routine npp_implied_slack.) * * RECOVERING BASIC SOLUTION * * Status of row p in solution to the original problem is determined * by its status in solution to the transformed problem and its bound, * which was choosen to be active: * * +-----------------------+--------+--------------------+ * | Status of row p | Active | Status of row p | * | (transformed problem) | bound | (original problem) | * +-----------------------+--------+--------------------+ * | GLP_BS | L[p] | GLP_BS | * | GLP_BS | U[p] | GLP_BS | * | GLP_NS | L[p] | GLP_NL | * | GLP_NS | U[p] | GLP_NU | * +-----------------------+--------+--------------------+ * * Value of row multiplier pi[p] (as well as value of column q) in * solution to the original problem is the same as in solution to the * transformed problem. * * RECOVERING INTERIOR-POINT SOLUTION * * Value of row multiplier pi[p] in solution to the original problem is * the same as in solution to the transformed problem. * * RECOVERING MIP SOLUTION * * None needed. */ struct implied_free { /* column singleton (implied free variable) */ int p; /* row reference number */ char stat; /* row status: GLP_NL - active constraint on lower bound GLP_NU - active constraint on upper bound */ }; static int rcv_implied_free(NPP *npp, void *info); int npp_implied_free(NPP *npp, NPPCOL *q) { /* process column singleton (implied free variable) */ struct implied_free *info; NPPROW *p; NPPAIJ *apq, *aij; double alfa, beta, l, u, pi, eps; /* the column must be non-fixed singleton */ xassert(q->lb < q->ub); xassert(q->ptr != NULL && q->ptr->c_next == NULL); /* corresponding row must be inequality constraint */ apq = q->ptr; p = apq->row; xassert(p->lb != -DBL_MAX || p->ub != +DBL_MAX); xassert(p->lb < p->ub); /* compute alfa */ alfa = p->lb; if (alfa != -DBL_MAX) { for (aij = p->ptr; aij != NULL; aij = aij->r_next) { if (aij == apq) continue; /* skip a[p,q] */ if (aij->val > 0.0) { if (aij->col->ub == +DBL_MAX) { alfa = -DBL_MAX; break; } alfa -= aij->val * aij->col->ub; } else /* < 0.0 */ { if (aij->col->lb == -DBL_MAX) { alfa = -DBL_MAX; break; } alfa -= aij->val * aij->col->lb; } } } /* compute beta */ beta = p->ub; if (beta != +DBL_MAX) { for (aij = p->ptr; aij != NULL; aij = aij->r_next) { if (aij == apq) continue; /* skip a[p,q] */ if (aij->val > 0.0) { if (aij->col->lb == -DBL_MAX) { beta = +DBL_MAX; break; } beta -= aij->val * aij->col->lb; } else /* < 0.0 */ { if (aij->col->ub == +DBL_MAX) { beta = +DBL_MAX; break; } beta -= aij->val * aij->col->ub; } } } /* compute implied column lower bound l'[q] */ if (apq->val > 0.0) l = (alfa == -DBL_MAX ? -DBL_MAX : alfa / apq->val); else /* < 0.0 */ l = (beta == +DBL_MAX ? -DBL_MAX : beta / apq->val); /* compute implied column upper bound u'[q] */ if (apq->val > 0.0) u = (beta == +DBL_MAX ? +DBL_MAX : beta / apq->val); else u = (alfa == -DBL_MAX ? +DBL_MAX : alfa / apq->val); /* check if column lower bound l[q] can be active */ if (q->lb != -DBL_MAX) { eps = 1e-9 + 1e-12 * fabs(q->lb); if (l < q->lb - eps) return 1; /* yes, it can */ } /* check if column upper bound u[q] can be active */ if (q->ub != +DBL_MAX) { eps = 1e-9 + 1e-12 * fabs(q->ub); if (u > q->ub + eps) return 1; /* yes, it can */ } /* okay; make column q free (unbounded) */ q->lb = -DBL_MAX, q->ub = +DBL_MAX; /* create transformation stack entry */ info = npp_push_tse(npp, rcv_implied_free, sizeof(struct implied_free)); info->p = p->i; info->stat = -1; /* compute row multiplier pi[p] */ pi = q->coef / apq->val; /* check dual feasibility for row p */ if (pi > +DBL_EPSILON) { /* lower bound L[p] must be active */ if (p->lb != -DBL_MAX) nl: { info->stat = GLP_NL; p->ub = p->lb; } else { if (pi > +1e-5) return 2; /* dual infeasibility */ /* take a chance on U[p] */ xassert(p->ub != +DBL_MAX); goto nu; } } else if (pi < -DBL_EPSILON) { /* upper bound U[p] must be active */ if (p->ub != +DBL_MAX) nu: { info->stat = GLP_NU; p->lb = p->ub; } else { if (pi < -1e-5) return 2; /* dual infeasibility */ /* take a chance on L[p] */ xassert(p->lb != -DBL_MAX); goto nl; } } else { /* any bound (either L[p] or U[p]) can be made active */ if (p->ub == +DBL_MAX) { xassert(p->lb != -DBL_MAX); goto nl; } if (p->lb == -DBL_MAX) { xassert(p->ub != +DBL_MAX); goto nu; } if (fabs(p->lb) <= fabs(p->ub)) goto nl; else goto nu; } return 0; } static int rcv_implied_free(NPP *npp, void *_info) { /* recover column singleton (implied free variable) */ struct implied_free *info = _info; if (npp->sol == GLP_SOL) { if (npp->r_stat[info->p] == GLP_BS) npp->r_stat[info->p] = GLP_BS; else if (npp->r_stat[info->p] == GLP_NS) { xassert(info->stat == GLP_NL || info->stat == GLP_NU); npp->r_stat[info->p] = info->stat; } else { npp_error(); return 1; } } return 0; } /*********************************************************************** * NAME * * npp_eq_doublet - process row doubleton (equality constraint) * * SYNOPSIS * * #include "glpnpp.h" * NPPCOL *npp_eq_doublet(NPP *npp, NPPROW *p); * * DESCRIPTION * * The routine npp_eq_doublet processes row p, which is equality * constraint having exactly two non-zero coefficients: * * a[p,q] x[q] + a[p,r] x[r] = b. (1) * * As the result of processing one of columns q or r is eliminated from * all other rows and, thus, becomes column singleton of type "implied * slack variable". Row p is not changed and along with column q and r * remains in the problem. * * RETURNS * * The routine npp_eq_doublet returns pointer to the descriptor of that * column q or r which has been eliminated. If, due to some reason, the * elimination was not performed, the routine returns NULL. * * PROBLEM TRANSFORMATION * * First, we decide which column q or r will be eliminated. Let it be * column q. Consider i-th constraint row, where column q has non-zero * coefficient a[i,q] != 0: * * L[i] <= sum a[i,j] x[j] <= U[i]. (2) * j * * In order to eliminate column q from row (2) we subtract from it row * (1) multiplied by gamma[i] = a[i,q] / a[p,q], i.e. we replace in the * transformed problem row (2) by its linear combination with row (1). * This transformation changes only coefficients in columns q and r, * and bounds of row i as follows: * * a~[i,q] = a[i,q] - gamma[i] a[p,q] = 0, (3) * * a~[i,r] = a[i,r] - gamma[i] a[p,r], (4) * * L~[i] = L[i] - gamma[i] b, (5) * * U~[i] = U[i] - gamma[i] b. (6) * * RECOVERING BASIC SOLUTION * * The transformation of the primal system of the original problem: * * L <= A x <= U (7) * * is equivalent to multiplying from the left a transformation matrix F * by components of this primal system, which in the transformed problem * becomes the following: * * F L <= F A x <= F U ==> L~ <= A~x <= U~. (8) * * The matrix F has the following structure: * * ( 1 -gamma[1] ) * ( ) * ( 1 -gamma[2] ) * ( ) * ( ... ... ) * ( ) * F = ( 1 -gamma[p-1] ) (9) * ( ) * ( 1 ) * ( ) * ( -gamma[p+1] 1 ) * ( ) * ( ... ... ) * * where its column containing elements -gamma[i] corresponds to row p * of the primal system. * * From (8) it follows that the dual system of the original problem: * * A'pi + lambda = c, (10) * * in the transformed problem becomes the following: * * A'F'inv(F')pi + lambda = c ==> (A~)'pi~ + lambda = c, (11) * * where: * * pi~ = inv(F')pi (12) * * is the vector of row multipliers in the transformed problem. Thus: * * pi = F'pi~. (13) * * Therefore, as it follows from (13), value of multiplier for row p in * solution to the original problem can be computed as follows: * * pi[p] = pi~[p] - sum gamma[i] pi~[i], (14) * i * * where pi~[i] = pi[i] is multiplier for row i (i != p). * * Note that the statuses of all rows and columns are not changed. * * RECOVERING INTERIOR-POINT SOLUTION * * Multiplier for row p in solution to the original problem is computed * with formula (14). * * RECOVERING MIP SOLUTION * * None needed. */ struct eq_doublet { /* row doubleton (equality constraint) */ int p; /* row reference number */ double apq; /* constraint coefficient a[p,q] */ NPPLFE *ptr; /* list of non-zero coefficients a[i,q], i != p */ }; static int rcv_eq_doublet(NPP *npp, void *info); NPPCOL *npp_eq_doublet(NPP *npp, NPPROW *p) { /* process row doubleton (equality constraint) */ struct eq_doublet *info; NPPROW *i; NPPCOL *q, *r; NPPAIJ *apq, *apr, *aiq, *air, *next; NPPLFE *lfe; double gamma; /* the row must be doubleton equality constraint */ xassert(p->lb == p->ub); xassert(p->ptr != NULL && p->ptr->r_next != NULL && p->ptr->r_next->r_next == NULL); /* choose column to be eliminated */ { NPPAIJ *a1, *a2; a1 = p->ptr, a2 = a1->r_next; if (fabs(a2->val) < 0.001 * fabs(a1->val)) { /* only first column can be eliminated, because second one has too small constraint coefficient */ apq = a1, apr = a2; } else if (fabs(a1->val) < 0.001 * fabs(a2->val)) { /* only second column can be eliminated, because first one has too small constraint coefficient */ apq = a2, apr = a1; } else { /* both columns are appropriate; choose that one which is shorter to minimize fill-in */ if (npp_col_nnz(npp, a1->col) <= npp_col_nnz(npp, a2->col)) { /* first column is shorter */ apq = a1, apr = a2; } else { /* second column is shorter */ apq = a2, apr = a1; } } } /* now columns q and r have been chosen */ q = apq->col, r = apr->col; /* create transformation stack entry */ info = npp_push_tse(npp, rcv_eq_doublet, sizeof(struct eq_doublet)); info->p = p->i; info->apq = apq->val; info->ptr = NULL; /* transform each row i (i != p), where a[i,q] != 0, to eliminate column q */ for (aiq = q->ptr; aiq != NULL; aiq = next) { next = aiq->c_next; if (aiq == apq) continue; /* skip row p */ i = aiq->row; /* row i to be transformed */ /* save constraint coefficient a[i,q] */ if (npp->sol != GLP_MIP) { lfe = dmp_get_atom(npp->stack, sizeof(NPPLFE)); lfe->ref = i->i; lfe->val = aiq->val; lfe->next = info->ptr; info->ptr = lfe; } /* find coefficient a[i,r] in row i */ for (air = i->ptr; air != NULL; air = air->r_next) if (air->col == r) break; /* if a[i,r] does not exist, create a[i,r] = 0 */ if (air == NULL) air = npp_add_aij(npp, i, r, 0.0); /* compute gamma[i] = a[i,q] / a[p,q] */ gamma = aiq->val / apq->val; /* (row i) := (row i) - gamma[i] * (row p); see (3)-(6) */ /* new a[i,q] is exact zero due to elimnation; remove it from row i */ npp_del_aij(npp, aiq); /* compute new a[i,r] */ air->val -= gamma * apr->val; /* if new a[i,r] is close to zero due to numeric cancelation, remove it from row i */ if (fabs(air->val) <= 1e-10) npp_del_aij(npp, air); /* compute new lower and upper bounds of row i */ if (i->lb == i->ub) i->lb = i->ub = (i->lb - gamma * p->lb); else { if (i->lb != -DBL_MAX) i->lb -= gamma * p->lb; if (i->ub != +DBL_MAX) i->ub -= gamma * p->lb; } } return q; } static int rcv_eq_doublet(NPP *npp, void *_info) { /* recover row doubleton (equality constraint) */ struct eq_doublet *info = _info; NPPLFE *lfe; double gamma, temp; /* we assume that processing row p is followed by processing column q as singleton of type "implied slack variable", in which case row p must always be active equality constraint */ if (npp->sol == GLP_SOL) { if (npp->r_stat[info->p] != GLP_NS) { npp_error(); return 1; } } if (npp->sol != GLP_MIP) { /* compute value of multiplier for row p; see (14) */ temp = npp->r_pi[info->p]; for (lfe = info->ptr; lfe != NULL; lfe = lfe->next) { gamma = lfe->val / info->apq; /* a[i,q] / a[p,q] */ temp -= gamma * npp->r_pi[lfe->ref]; } npp->r_pi[info->p] = temp; } return 0; } /*********************************************************************** * NAME * * npp_forcing_row - process forcing row * * SYNOPSIS * * #include "glpnpp.h" * int npp_forcing_row(NPP *npp, NPPROW *p, int at); * * DESCRIPTION * * The routine npp_forcing row processes row p of general format: * * L[p] <= sum a[p,j] x[j] <= U[p], (1) * j * * l[j] <= x[j] <= u[j], (2) * * where L[p] <= U[p] and l[j] < u[j] for all a[p,j] != 0. It is also * assumed that: * * 1) if at = 0 then |L[p] - U'[p]| <= eps, where U'[p] is implied * row upper bound (see below), eps is an absolute tolerance for row * value; * * 2) if at = 1 then |U[p] - L'[p]| <= eps, where L'[p] is implied * row lower bound (see below). * * RETURNS * * 0 - success; * * 1 - cannot fix columns due to too small constraint coefficients. * * PROBLEM TRANSFORMATION * * Implied lower and upper bounds of row (1) are determined by bounds * of corresponding columns (variables) as follows: * * L'[p] = inf sum a[p,j] x[j] = * j * (3) * = sum a[p,j] l[j] + sum a[p,j] u[j], * j in Jp j in Jn * * U'[p] = sup sum a[p,j] x[j] = * (4) * = sum a[p,j] u[j] + sum a[p,j] l[j], * j in Jp j in Jn * * Jp = {j: a[p,j] > 0}, Jn = {j: a[p,j] < 0}. (5) * * If L[p] =~ U'[p] (at = 0), solution can be primal feasible only when * all variables take their boundary values as defined by (4): * * ( u[j], if j in Jp * x[j] = < (6) * ( l[j], if j in Jn * * Similarly, if U[p] =~ L'[p] (at = 1), solution can be primal feasible * only when all variables take their boundary values as defined by (3): * * ( l[j], if j in Jp * x[j] = < (7) * ( u[j], if j in Jn * * Condition (6) or (7) allows fixing all columns (variables x[j]) * in row (1) on their bounds and then removing them from the problem * (see the routine npp_fixed_col). Due to this row p becomes redundant, * so it can be replaced by equivalent free (unbounded) row and also * removed from the problem (see the routine npp_free_row). * * 1. To apply this transformation row (1) should not have coefficients * whose magnitude is too small, i.e. all a[p,j] should satisfy to * the following condition: * * |a[p,j]| >= eps * max(1, |a[p,k]|), (8) * k * where eps is a relative tolerance for constraint coefficients. * Otherwise, fixing columns may be numerically unreliable and may * lead to wrong solution. * * 2. The routine fixes columns and remove bounds of row p, however, * it does not remove the row and columns from the problem. * * RECOVERING BASIC SOLUTION * * In the transformed problem row p being inactive constraint is * assigned status GLP_BS (as the result of transformation of free * row), and all columns in this row are assigned status GLP_NS (as the * result of transformation of fixed columns). * * Note that in the dual system of the transformed (as well as original) * problem every column j in row p corresponds to the following row: * * sum a[i,j] pi[i] + a[p,j] pi[p] + lambda[j] = c[j], (9) * i!=p * * from which it follows that: * * lambda[j] = c[j] - sum a[i,j] pi[i] - a[p,j] pi[p]. (10) * i!=p * * In the transformed problem values of all multipliers pi[i] are known * (including pi[i], whose value is zero, since row p is inactive). * Thus, using formula (10) it is possible to compute values of * multipliers lambda[j] for all columns in row p. * * Note also that in the original problem all columns in row p are * bounded, not fixed. So status GLP_NS assigned to every such column * must be changed to GLP_NL or GLP_NU depending on which bound the * corresponding column has been fixed. This status change may lead to * dual feasibility violation for solution of the original problem, * because now column multipliers must satisfy to the following * condition: * * ( >= 0, if status of column j is GLP_NL, * lambda[j] < (11) * ( <= 0, if status of column j is GLP_NU. * * If this condition holds, solution to the original problem is the * same as to the transformed problem. Otherwise, we have to perform * one degenerate pivoting step of the primal simplex method to obtain * dual feasible (hence, optimal) solution to the original problem as * follows. If, on problem transformation, row p was made active on its * lower bound (case at = 0), we change its status to GLP_NL (or GLP_NS) * and start increasing its multiplier pi[p]. Otherwise, if row p was * made active on its upper bound (case at = 1), we change its status * to GLP_NU (or GLP_NS) and start decreasing pi[p]. From (10) it * follows that: * * delta lambda[j] = - a[p,j] * delta pi[p] = - a[p,j] pi[p]. (12) * * Simple analysis of formulae (3)-(5) shows that changing pi[p] in the * specified direction causes increasing lambda[j] for every column j * assigned status GLP_NL (delta lambda[j] > 0) and decreasing lambda[j] * for every column j assigned status GLP_NU (delta lambda[j] < 0). It * is understood that once the last lambda[q], which violates condition * (11), has reached zero, multipliers lambda[j] for all columns get * valid signs. Such column q can be determined as follows. Let d[j] be * initial value of lambda[j] (i.e. reduced cost of column j) in the * transformed problem computed with formula (10) when pi[p] = 0. Then * lambda[j] = d[j] + delta lambda[j], and from (12) it follows that * lambda[j] becomes zero if: * * delta lambda[j] = - a[p,j] pi[p] = - d[j] ==> * (13) * pi[p] = d[j] / a[p,j]. * * Therefore, the last column q, for which lambda[q] becomes zero, can * be determined from the following condition: * * |d[q] / a[p,q]| = max |pi[p]| = max |d[j] / a[p,j]|, (14) * j in D j in D * * where D is a set of columns j whose, reduced costs d[j] have invalid * signs, i.e. violate condition (11). (Thus, if D is empty, solution * to the original problem is the same as solution to the transformed * problem, and no correction is needed as was noticed above.) In * solution to the original problem column q is assigned status GLP_BS, * since it replaces column of auxiliary variable of row p (becoming * active) in the basis, and multiplier for row p is assigned its new * value, which is pi[p] = d[q] / a[p,q]. Note that due to primal * degeneracy values of all columns having non-zero coefficients in row * p remain unchanged. * * RECOVERING INTERIOR-POINT SOLUTION * * Value of multiplier pi[p] in solution to the original problem is * corrected in the same way as for basic solution. Values of all * columns having non-zero coefficients in row p remain unchanged. * * RECOVERING MIP SOLUTION * * None needed. */ struct forcing_col { /* column fixed on its bound by forcing row */ int j; /* column reference number */ char stat; /* original column status: GLP_NL - fixed on lower bound GLP_NU - fixed on upper bound */ double a; /* constraint coefficient a[p,j] */ double c; /* objective coefficient c[j] */ NPPLFE *ptr; /* list of non-zero coefficients a[i,j], i != p */ struct forcing_col *next; /* pointer to another column fixed by forcing row */ }; struct forcing_row { /* forcing row */ int p; /* row reference number */ char stat; /* status assigned to the row if it becomes active: GLP_NS - active equality constraint GLP_NL - inequality constraint with lower bound active GLP_NU - inequality constraint with upper bound active */ struct forcing_col *ptr; /* list of all columns having non-zero constraint coefficient a[p,j] in the forcing row */ }; static int rcv_forcing_row(NPP *npp, void *info); int npp_forcing_row(NPP *npp, NPPROW *p, int at) { /* process forcing row */ struct forcing_row *info; struct forcing_col *col = NULL; NPPCOL *j; NPPAIJ *apj, *aij; NPPLFE *lfe; double big; xassert(at == 0 || at == 1); /* determine maximal magnitude of the row coefficients */ big = 1.0; for (apj = p->ptr; apj != NULL; apj = apj->r_next) if (big < fabs(apj->val)) big = fabs(apj->val); /* if there are too small coefficients in the row, transformation should not be applied */ for (apj = p->ptr; apj != NULL; apj = apj->r_next) if (fabs(apj->val) < 1e-7 * big) return 1; /* create transformation stack entry */ info = npp_push_tse(npp, rcv_forcing_row, sizeof(struct forcing_row)); info->p = p->i; if (p->lb == p->ub) { /* equality constraint */ info->stat = GLP_NS; } else if (at == 0) { /* inequality constraint; case L[p] = U'[p] */ info->stat = GLP_NL; xassert(p->lb != -DBL_MAX); } else /* at == 1 */ { /* inequality constraint; case U[p] = L'[p] */ info->stat = GLP_NU; xassert(p->ub != +DBL_MAX); } info->ptr = NULL; /* scan the forcing row, fix columns at corresponding bounds, and save column information (the latter is not needed for MIP) */ for (apj = p->ptr; apj != NULL; apj = apj->r_next) { /* column j has non-zero coefficient in the forcing row */ j = apj->col; /* it must be non-fixed */ xassert(j->lb < j->ub); /* allocate stack entry to save column information */ if (npp->sol != GLP_MIP) { col = dmp_get_atom(npp->stack, sizeof(struct forcing_col)); col->j = j->j; col->stat = -1; /* will be set below */ col->a = apj->val; col->c = j->coef; col->ptr = NULL; col->next = info->ptr; info->ptr = col; } /* fix column j */ if (at == 0 && apj->val < 0.0 || at != 0 && apj->val > 0.0) { /* at its lower bound */ if (npp->sol != GLP_MIP) col->stat = GLP_NL; xassert(j->lb != -DBL_MAX); j->ub = j->lb; } else { /* at its upper bound */ if (npp->sol != GLP_MIP) col->stat = GLP_NU; xassert(j->ub != +DBL_MAX); j->lb = j->ub; } /* save column coefficients a[i,j], i != p */ if (npp->sol != GLP_MIP) { for (aij = j->ptr; aij != NULL; aij = aij->c_next) { if (aij == apj) continue; /* skip a[p,j] */ lfe = dmp_get_atom(npp->stack, sizeof(NPPLFE)); lfe->ref = aij->row->i; lfe->val = aij->val; lfe->next = col->ptr; col->ptr = lfe; } } } /* make the row free (unbounded) */ p->lb = -DBL_MAX, p->ub = +DBL_MAX; return 0; } static int rcv_forcing_row(NPP *npp, void *_info) { /* recover forcing row */ struct forcing_row *info = _info; struct forcing_col *col, *piv; NPPLFE *lfe; double d, big, temp; if (npp->sol == GLP_MIP) goto done; /* initially solution to the original problem is the same as to the transformed problem, where row p is inactive constraint with pi[p] = 0, and all columns are non-basic */ if (npp->sol == GLP_SOL) { if (npp->r_stat[info->p] != GLP_BS) { npp_error(); return 1; } for (col = info->ptr; col != NULL; col = col->next) { if (npp->c_stat[col->j] != GLP_NS) { npp_error(); return 1; } npp->c_stat[col->j] = col->stat; /* original status */ } } /* compute reduced costs d[j] for all columns with formula (10) and store them in col.c instead objective coefficients */ for (col = info->ptr; col != NULL; col = col->next) { d = col->c; for (lfe = col->ptr; lfe != NULL; lfe = lfe->next) d -= lfe->val * npp->r_pi[lfe->ref]; col->c = d; } /* consider columns j, whose multipliers lambda[j] has wrong sign in solution to the transformed problem (where lambda[j] = d[j]), and choose column q, whose multipler lambda[q] reaches zero last on changing row multiplier pi[p]; see (14) */ piv = NULL, big = 0.0; for (col = info->ptr; col != NULL; col = col->next) { d = col->c; /* d[j] */ temp = fabs(d / col->a); if (col->stat == GLP_NL) { /* column j has active lower bound */ if (d < 0.0 && big < temp) piv = col, big = temp; } else if (col->stat == GLP_NU) { /* column j has active upper bound */ if (d > 0.0 && big < temp) piv = col, big = temp; } else { npp_error(); return 1; } } /* if column q does not exist, no correction is needed */ if (piv != NULL) { /* correct solution; row p becomes active constraint while column q becomes basic */ if (npp->sol == GLP_SOL) { npp->r_stat[info->p] = info->stat; npp->c_stat[piv->j] = GLP_BS; } /* assign new value to row multiplier pi[p] = d[p] / a[p,q] */ npp->r_pi[info->p] = piv->c / piv->a; } done: return 0; } /*********************************************************************** * NAME * * npp_analyze_row - perform general row analysis * * SYNOPSIS * * #include "glpnpp.h" * int npp_analyze_row(NPP *npp, NPPROW *p); * * DESCRIPTION * * The routine npp_analyze_row performs analysis of row p of general * format: * * L[p] <= sum a[p,j] x[j] <= U[p], (1) * j * * l[j] <= x[j] <= u[j], (2) * * where L[p] <= U[p] and l[j] <= u[j] for all a[p,j] != 0. * * RETURNS * * 0x?0 - row lower bound does not exist or is redundant; * * 0x?1 - row lower bound can be active; * * 0x?2 - row lower bound is a forcing bound; * * 0x0? - row upper bound does not exist or is redundant; * * 0x1? - row upper bound can be active; * * 0x2? - row upper bound is a forcing bound; * * 0x33 - row bounds are inconsistent with column bounds. * * ALGORITHM * * Analysis of row (1) is based on analysis of its implied lower and * upper bounds, which are determined by bounds of corresponding columns * (variables) as follows: * * L'[p] = inf sum a[p,j] x[j] = * j * (3) * = sum a[p,j] l[j] + sum a[p,j] u[j], * j in Jp j in Jn * * U'[p] = sup sum a[p,j] x[j] = * (4) * = sum a[p,j] u[j] + sum a[p,j] l[j], * j in Jp j in Jn * * Jp = {j: a[p,j] > 0}, Jn = {j: a[p,j] < 0}. (5) * * (Note that bounds of all columns in row p are assumed to be correct, * so L'[p] <= U'[p].) * * Analysis of row lower bound L[p] includes the following cases: * * 1) if L[p] > U'[p] + eps, where eps is an absolute tolerance for row * value, row lower bound L[p] and implied row upper bound U'[p] are * inconsistent, ergo, the problem has no primal feasible solution; * * 2) if U'[p] - eps <= L[p] <= U'[p] + eps, i.e. if L[p] =~ U'[p], * the row is a forcing row on its lower bound (see description of * the routine npp_forcing_row); * * 3) if L[p] > L'[p] + eps, row lower bound L[p] can be active (this * conclusion does not account other rows in the problem); * * 4) if L[p] <= L'[p] + eps, row lower bound L[p] cannot be active, so * it is redundant and can be removed (replaced by -oo). * * Analysis of row upper bound U[p] is performed in a similar way and * includes the following cases: * * 1) if U[p] < L'[p] - eps, row upper bound U[p] and implied row lower * bound L'[p] are inconsistent, ergo the problem has no primal * feasible solution; * * 2) if L'[p] - eps <= U[p] <= L'[p] + eps, i.e. if U[p] =~ L'[p], * the row is a forcing row on its upper bound (see description of * the routine npp_forcing_row); * * 3) if U[p] < U'[p] - eps, row upper bound U[p] can be active (this * conclusion does not account other rows in the problem); * * 4) if U[p] >= U'[p] - eps, row upper bound U[p] cannot be active, so * it is redundant and can be removed (replaced by +oo). */ int npp_analyze_row(NPP *npp, NPPROW *p) { /* perform general row analysis */ NPPAIJ *aij; int ret = 0x00; double l, u, eps; xassert(npp == npp); /* compute implied lower bound L'[p]; see (3) */ l = 0.0; for (aij = p->ptr; aij != NULL; aij = aij->r_next) { if (aij->val > 0.0) { if (aij->col->lb == -DBL_MAX) { l = -DBL_MAX; break; } l += aij->val * aij->col->lb; } else /* aij->val < 0.0 */ { if (aij->col->ub == +DBL_MAX) { l = -DBL_MAX; break; } l += aij->val * aij->col->ub; } } /* compute implied upper bound U'[p]; see (4) */ u = 0.0; for (aij = p->ptr; aij != NULL; aij = aij->r_next) { if (aij->val > 0.0) { if (aij->col->ub == +DBL_MAX) { u = +DBL_MAX; break; } u += aij->val * aij->col->ub; } else /* aij->val < 0.0 */ { if (aij->col->lb == -DBL_MAX) { u = +DBL_MAX; break; } u += aij->val * aij->col->lb; } } /* column bounds are assumed correct, so L'[p] <= U'[p] */ /* check if row lower bound is consistent */ if (p->lb != -DBL_MAX) { eps = 1e-3 + 1e-6 * fabs(p->lb); if (p->lb - eps > u) { ret = 0x33; goto done; } } /* check if row upper bound is consistent */ if (p->ub != +DBL_MAX) { eps = 1e-3 + 1e-6 * fabs(p->ub); if (p->ub + eps < l) { ret = 0x33; goto done; } } /* check if row lower bound can be active/forcing */ if (p->lb != -DBL_MAX) { eps = 1e-9 + 1e-12 * fabs(p->lb); if (p->lb - eps > l) { if (p->lb + eps <= u) ret |= 0x01; else ret |= 0x02; } } /* check if row upper bound can be active/forcing */ if (p->ub != +DBL_MAX) { eps = 1e-9 + 1e-12 * fabs(p->ub); if (p->ub + eps < u) { /* check if the upper bound is forcing */ if (p->ub - eps >= l) ret |= 0x10; else ret |= 0x20; } } done: return ret; } /*********************************************************************** * NAME * * npp_inactive_bound - remove row lower/upper inactive bound * * SYNOPSIS * * #include "glpnpp.h" * void npp_inactive_bound(NPP *npp, NPPROW *p, int which); * * DESCRIPTION * * The routine npp_inactive_bound removes lower (if which = 0) or upper * (if which = 1) bound of row p: * * L[p] <= sum a[p,j] x[j] <= U[p], * * which (bound) is assumed to be redundant. * * PROBLEM TRANSFORMATION * * If which = 0, current lower bound L[p] of row p is assigned -oo. * If which = 1, current upper bound U[p] of row p is assigned +oo. * * RECOVERING BASIC SOLUTION * * If in solution to the transformed problem row p is inactive * constraint (GLP_BS), its status is not changed in solution to the * original problem. Otherwise, status of row p in solution to the * original problem is defined by its type before transformation and * its status in solution to the transformed problem as follows: * * +---------------------+-------+---------------+---------------+ * | Row | Flag | Row status in | Row status in | * | type | which | transfmd soln | original soln | * +---------------------+-------+---------------+---------------+ * | sum >= L[p] | 0 | GLP_NF | GLP_NL | * | sum <= U[p] | 1 | GLP_NF | GLP_NU | * | L[p] <= sum <= U[p] | 0 | GLP_NU | GLP_NU | * | L[p] <= sum <= U[p] | 1 | GLP_NL | GLP_NL | * | sum = L[p] = U[p] | 0 | GLP_NU | GLP_NS | * | sum = L[p] = U[p] | 1 | GLP_NL | GLP_NS | * +---------------------+-------+---------------+---------------+ * * RECOVERING INTERIOR-POINT SOLUTION * * None needed. * * RECOVERING MIP SOLUTION * * None needed. */ struct inactive_bound { /* row inactive bound */ int p; /* row reference number */ char stat; /* row status (if active constraint) */ }; static int rcv_inactive_bound(NPP *npp, void *info); void npp_inactive_bound(NPP *npp, NPPROW *p, int which) { /* remove row lower/upper inactive bound */ struct inactive_bound *info; if (npp->sol == GLP_SOL) { /* create transformation stack entry */ info = npp_push_tse(npp, rcv_inactive_bound, sizeof(struct inactive_bound)); info->p = p->i; if (p->ub == +DBL_MAX) info->stat = GLP_NL; else if (p->lb == -DBL_MAX) info->stat = GLP_NU; else if (p->lb != p->ub) info->stat = (char)(which == 0 ? GLP_NU : GLP_NL); else info->stat = GLP_NS; } /* remove row inactive bound */ if (which == 0) { xassert(p->lb != -DBL_MAX); p->lb = -DBL_MAX; } else if (which == 1) { xassert(p->ub != +DBL_MAX); p->ub = +DBL_MAX; } else xassert(which != which); return; } static int rcv_inactive_bound(NPP *npp, void *_info) { /* recover row status */ struct inactive_bound *info = _info; if (npp->sol != GLP_SOL) { npp_error(); return 1; } if (npp->r_stat[info->p] == GLP_BS) npp->r_stat[info->p] = GLP_BS; else npp->r_stat[info->p] = info->stat; return 0; } /*********************************************************************** * NAME * * npp_implied_bounds - determine implied column bounds * * SYNOPSIS * * #include "glpnpp.h" * void npp_implied_bounds(NPP *npp, NPPROW *p); * * DESCRIPTION * * The routine npp_implied_bounds inspects general row (constraint) p: * * L[p] <= sum a[p,j] x[j] <= U[p], (1) * * l[j] <= x[j] <= u[j], (2) * * where L[p] <= U[p] and l[j] <= u[j] for all a[p,j] != 0, to compute * implied bounds of columns (variables x[j]) in this row. * * The routine stores implied column bounds l'[j] and u'[j] in column * descriptors (NPPCOL); it does not change current column bounds l[j] * and u[j]. (Implied column bounds can be then used to strengthen the * current column bounds; see the routines npp_implied_lower and * npp_implied_upper). * * ALGORITHM * * Current column bounds (2) define implied lower and upper bounds of * row (1) as follows: * * L'[p] = inf sum a[p,j] x[j] = * j * (3) * = sum a[p,j] l[j] + sum a[p,j] u[j], * j in Jp j in Jn * * U'[p] = sup sum a[p,j] x[j] = * (4) * = sum a[p,j] u[j] + sum a[p,j] l[j], * j in Jp j in Jn * * Jp = {j: a[p,j] > 0}, Jn = {j: a[p,j] < 0}. (5) * * (Note that bounds of all columns in row p are assumed to be correct, * so L'[p] <= U'[p].) * * If L[p] > L'[p] and/or U[p] < U'[p], the lower and/or upper bound of * row (1) can be active, in which case such row defines implied bounds * of its variables. * * Let x[k] be some variable having in row (1) coefficient a[p,k] != 0. * Consider a case when row lower bound can be active (L[p] > L'[p]): * * sum a[p,j] x[j] >= L[p] ==> * j * * sum a[p,j] x[j] + a[p,k] x[k] >= L[p] ==> * j!=k * (6) * a[p,k] x[k] >= L[p] - sum a[p,j] x[j] ==> * j!=k * * a[p,k] x[k] >= L[p,k], * * where * * L[p,k] = inf(L[p] - sum a[p,j] x[j]) = * j!=k * * = L[p] - sup sum a[p,j] x[j] = (7) * j!=k * * = L[p] - sum a[p,j] u[j] - sum a[p,j] l[j]. * j in Jp\{k} j in Jn\{k} * * Thus: * * x[k] >= l'[k] = L[p,k] / a[p,k], if a[p,k] > 0, (8) * * x[k] <= u'[k] = L[p,k] / a[p,k], if a[p,k] < 0. (9) * * where l'[k] and u'[k] are implied lower and upper bounds of variable * x[k], resp. * * Now consider a similar case when row upper bound can be active * (U[p] < U'[p]): * * sum a[p,j] x[j] <= U[p] ==> * j * * sum a[p,j] x[j] + a[p,k] x[k] <= U[p] ==> * j!=k * (10) * a[p,k] x[k] <= U[p] - sum a[p,j] x[j] ==> * j!=k * * a[p,k] x[k] <= U[p,k], * * where: * * U[p,k] = sup(U[p] - sum a[p,j] x[j]) = * j!=k * * = U[p] - inf sum a[p,j] x[j] = (11) * j!=k * * = U[p] - sum a[p,j] l[j] - sum a[p,j] u[j]. * j in Jp\{k} j in Jn\{k} * * Thus: * * x[k] <= u'[k] = U[p,k] / a[p,k], if a[p,k] > 0, (12) * * x[k] >= l'[k] = U[p,k] / a[p,k], if a[p,k] < 0. (13) * * Note that in formulae (8), (9), (12), and (13) coefficient a[p,k] * must not be too small in magnitude relatively to other non-zero * coefficients in row (1), i.e. the following condition must hold: * * |a[p,k]| >= eps * max(1, |a[p,j]|), (14) * j * * where eps is a relative tolerance for constraint coefficients. * Otherwise the implied column bounds can be numerical inreliable. For * example, using formula (8) for the following inequality constraint: * * 1e-12 x1 - x2 - x3 >= 0, * * where x1 >= -1, x2, x3, >= 0, may lead to numerically unreliable * conclusion that x1 >= 0. * * Using formulae (8), (9), (12), and (13) to compute implied bounds * for one variable requires |J| operations, where J = {j: a[p,j] != 0}, * because this needs computing L[p,k] and U[p,k]. Thus, computing * implied bounds for all variables in row (1) would require |J|^2 * operations, that is not a good technique. However, the total number * of operations can be reduced to |J| as follows. * * Let a[p,k] > 0. Then from (7) and (11) we have: * * L[p,k] = L[p] - (U'[p] - a[p,k] u[k]) = * * = L[p] - U'[p] + a[p,k] u[k], * * U[p,k] = U[p] - (L'[p] - a[p,k] l[k]) = * * = U[p] - L'[p] + a[p,k] l[k], * * where L'[p] and U'[p] are implied row lower and upper bounds defined * by formulae (3) and (4). Substituting these expressions into (8) and * (12) gives: * * l'[k] = L[p,k] / a[p,k] = u[k] + (L[p] - U'[p]) / a[p,k], (15) * * u'[k] = U[p,k] / a[p,k] = l[k] + (U[p] - L'[p]) / a[p,k]. (16) * * Similarly, if a[p,k] < 0, according to (7) and (11) we have: * * L[p,k] = L[p] - (U'[p] - a[p,k] l[k]) = * * = L[p] - U'[p] + a[p,k] l[k], * * U[p,k] = U[p] - (L'[p] - a[p,k] u[k]) = * * = U[p] - L'[p] + a[p,k] u[k], * * and substituting these expressions into (8) and (12) gives: * * l'[k] = U[p,k] / a[p,k] = u[k] + (U[p] - L'[p]) / a[p,k], (17) * * u'[k] = L[p,k] / a[p,k] = l[k] + (L[p] - U'[p]) / a[p,k]. (18) * * Note that formulae (15)-(18) can be used only if L'[p] and U'[p] * exist. However, if for some variable x[j] it happens that l[j] = -oo * and/or u[j] = +oo, values of L'[p] (if a[p,j] > 0) and/or U'[p] (if * a[p,j] < 0) are undefined. Consider, therefore, the most general * situation, when some column bounds (2) may not exist. * * Let: * * J' = {j : (a[p,j] > 0 and l[j] = -oo) or * (19) * (a[p,j] < 0 and u[j] = +oo)}. * * Then (assuming that row upper bound U[p] can be active) the following * three cases are possible: * * 1) |J'| = 0. In this case L'[p] exists, thus, for all variables x[j] * in row (1) we can use formulae (16) and (17); * * 2) J' = {k}. In this case L'[p] = -oo, however, U[p,k] (11) exists, * so for variable x[k] we can use formulae (12) and (13). Note that * for all other variables x[j] (j != k) l'[j] = -oo (if a[p,j] < 0) * or u'[j] = +oo (if a[p,j] > 0); * * 3) |J'| > 1. In this case for all variables x[j] in row [1] we have * l'[j] = -oo (if a[p,j] < 0) or u'[j] = +oo (if a[p,j] > 0). * * Similarly, let: * * J'' = {j : (a[p,j] > 0 and u[j] = +oo) or * (20) * (a[p,j] < 0 and l[j] = -oo)}. * * Then (assuming that row lower bound L[p] can be active) the following * three cases are possible: * * 1) |J''| = 0. In this case U'[p] exists, thus, for all variables x[j] * in row (1) we can use formulae (15) and (18); * * 2) J'' = {k}. In this case U'[p] = +oo, however, L[p,k] (7) exists, * so for variable x[k] we can use formulae (8) and (9). Note that * for all other variables x[j] (j != k) l'[j] = -oo (if a[p,j] > 0) * or u'[j] = +oo (if a[p,j] < 0); * * 3) |J''| > 1. In this case for all variables x[j] in row (1) we have * l'[j] = -oo (if a[p,j] > 0) or u'[j] = +oo (if a[p,j] < 0). */ void npp_implied_bounds(NPP *npp, NPPROW *p) { NPPAIJ *apj, *apk; double big, eps, temp; xassert(npp == npp); /* initialize implied bounds for all variables and determine maximal magnitude of row coefficients a[p,j] */ big = 1.0; for (apj = p->ptr; apj != NULL; apj = apj->r_next) { apj->col->ll.ll = -DBL_MAX, apj->col->uu.uu = +DBL_MAX; if (big < fabs(apj->val)) big = fabs(apj->val); } eps = 1e-6 * big; /* process row lower bound (assuming that it can be active) */ if (p->lb != -DBL_MAX) { apk = NULL; for (apj = p->ptr; apj != NULL; apj = apj->r_next) { if (apj->val > 0.0 && apj->col->ub == +DBL_MAX || apj->val < 0.0 && apj->col->lb == -DBL_MAX) { if (apk == NULL) apk = apj; else goto skip1; } } /* if a[p,k] = NULL then |J'| = 0 else J' = { k } */ temp = p->lb; for (apj = p->ptr; apj != NULL; apj = apj->r_next) { if (apj == apk) /* skip a[p,k] */; else if (apj->val > 0.0) temp -= apj->val * apj->col->ub; else /* apj->val < 0.0 */ temp -= apj->val * apj->col->lb; } /* compute column implied bounds */ if (apk == NULL) { /* temp = L[p] - U'[p] */ for (apj = p->ptr; apj != NULL; apj = apj->r_next) { if (apj->val >= +eps) { /* l'[j] := u[j] + (L[p] - U'[p]) / a[p,j] */ apj->col->ll.ll = apj->col->ub + temp / apj->val; } else if (apj->val <= -eps) { /* u'[j] := l[j] + (L[p] - U'[p]) / a[p,j] */ apj->col->uu.uu = apj->col->lb + temp / apj->val; } } } else { /* temp = L[p,k] */ if (apk->val >= +eps) { /* l'[k] := L[p,k] / a[p,k] */ apk->col->ll.ll = temp / apk->val; } else if (apk->val <= -eps) { /* u'[k] := L[p,k] / a[p,k] */ apk->col->uu.uu = temp / apk->val; } } skip1: ; } /* process row upper bound (assuming that it can be active) */ if (p->ub != +DBL_MAX) { apk = NULL; for (apj = p->ptr; apj != NULL; apj = apj->r_next) { if (apj->val > 0.0 && apj->col->lb == -DBL_MAX || apj->val < 0.0 && apj->col->ub == +DBL_MAX) { if (apk == NULL) apk = apj; else goto skip2; } } /* if a[p,k] = NULL then |J''| = 0 else J'' = { k } */ temp = p->ub; for (apj = p->ptr; apj != NULL; apj = apj->r_next) { if (apj == apk) /* skip a[p,k] */; else if (apj->val > 0.0) temp -= apj->val * apj->col->lb; else /* apj->val < 0.0 */ temp -= apj->val * apj->col->ub; } /* compute column implied bounds */ if (apk == NULL) { /* temp = U[p] - L'[p] */ for (apj = p->ptr; apj != NULL; apj = apj->r_next) { if (apj->val >= +eps) { /* u'[j] := l[j] + (U[p] - L'[p]) / a[p,j] */ apj->col->uu.uu = apj->col->lb + temp / apj->val; } else if (apj->val <= -eps) { /* l'[j] := u[j] + (U[p] - L'[p]) / a[p,j] */ apj->col->ll.ll = apj->col->ub + temp / apj->val; } } } else { /* temp = U[p,k] */ if (apk->val >= +eps) { /* u'[k] := U[p,k] / a[p,k] */ apk->col->uu.uu = temp / apk->val; } else if (apk->val <= -eps) { /* l'[k] := U[p,k] / a[p,k] */ apk->col->ll.ll = temp / apk->val; } } skip2: ; } return; } /* eof */ glpk-5.0/src/npp/npp4.c0000644000062000006210000014234113766346220014120 0ustar maomkpasswd/* npp4.c */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2009-2017 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "npp.h" /*********************************************************************** * NAME * * npp_binarize_prob - binarize MIP problem * * SYNOPSIS * * #include "glpnpp.h" * int npp_binarize_prob(NPP *npp); * * DESCRIPTION * * The routine npp_binarize_prob replaces in the original MIP problem * every integer variable: * * l[q] <= x[q] <= u[q], (1) * * where l[q] < u[q], by an equivalent sum of binary variables. * * RETURNS * * The routine returns the number of integer variables for which the * transformation failed, because u[q] - l[q] > d_max. * * PROBLEM TRANSFORMATION * * If variable x[q] has non-zero lower bound, it is first processed * with the routine npp_lbnd_col. Thus, we can assume that: * * 0 <= x[q] <= u[q]. (2) * * If u[q] = 1, variable x[q] is already binary, so further processing * is not needed. Let, therefore, that 2 <= u[q] <= d_max, and n be a * smallest integer such that u[q] <= 2^n - 1 (n >= 2, since u[q] >= 2). * Then variable x[q] can be replaced by the following sum: * * n-1 * x[q] = sum 2^k x[k], (3) * k=0 * * where x[k] are binary columns (variables). If u[q] < 2^n - 1, the * following additional inequality constraint must be also included in * the transformed problem: * * n-1 * sum 2^k x[k] <= u[q]. (4) * k=0 * * Note: Assuming that in the transformed problem x[q] becomes binary * variable x[0], this transformation causes new n-1 binary variables * to appear. * * Substituting x[q] from (3) to the objective row gives: * * z = sum c[j] x[j] + c[0] = * j * * = sum c[j] x[j] + c[q] x[q] + c[0] = * j!=q * n-1 * = sum c[j] x[j] + c[q] sum 2^k x[k] + c[0] = * j!=q k=0 * n-1 * = sum c[j] x[j] + sum c[k] x[k] + c[0], * j!=q k=0 * * where: * * c[k] = 2^k c[q], k = 0, ..., n-1. (5) * * And substituting x[q] from (3) to i-th constraint row i gives: * * L[i] <= sum a[i,j] x[j] <= U[i] ==> * j * * L[i] <= sum a[i,j] x[j] + a[i,q] x[q] <= U[i] ==> * j!=q * n-1 * L[i] <= sum a[i,j] x[j] + a[i,q] sum 2^k x[k] <= U[i] ==> * j!=q k=0 * n-1 * L[i] <= sum a[i,j] x[j] + sum a[i,k] x[k] <= U[i], * j!=q k=0 * * where: * * a[i,k] = 2^k a[i,q], k = 0, ..., n-1. (6) * * RECOVERING SOLUTION * * Value of variable x[q] is computed with formula (3). */ struct binarize { int q; /* column reference number for x[q] = x[0] */ int j; /* column reference number for x[1]; x[2] has reference number j+1, x[3] - j+2, etc. */ int n; /* total number of binary variables, n >= 2 */ }; static int rcv_binarize_prob(NPP *npp, void *info); int npp_binarize_prob(NPP *npp) { /* binarize MIP problem */ struct binarize *info; NPPROW *row; NPPCOL *col, *bin; NPPAIJ *aij; int u, n, k, temp, nfails, nvars, nbins, nrows; /* new variables will be added to the end of the column list, so we go from the end to beginning of the column list */ nfails = nvars = nbins = nrows = 0; for (col = npp->c_tail; col != NULL; col = col->prev) { /* skip continuous variable */ if (!col->is_int) continue; /* skip fixed variable */ if (col->lb == col->ub) continue; /* skip binary variable */ if (col->lb == 0.0 && col->ub == 1.0) continue; /* check if the transformation is applicable */ if (col->lb < -1e6 || col->ub > +1e6 || col->ub - col->lb > 4095.0) { /* unfortunately, not */ nfails++; continue; } /* process integer non-binary variable x[q] */ nvars++; /* make x[q] non-negative, if its lower bound is non-zero */ if (col->lb != 0.0) npp_lbnd_col(npp, col); /* now 0 <= x[q] <= u[q] */ xassert(col->lb == 0.0); u = (int)col->ub; xassert(col->ub == (double)u); /* if x[q] is binary, further processing is not needed */ if (u == 1) continue; /* determine smallest n such that u <= 2^n - 1 (thus, n is the number of binary variables needed) */ n = 2, temp = 4; while (u >= temp) n++, temp += temp; nbins += n; /* create transformation stack entry */ info = npp_push_tse(npp, rcv_binarize_prob, sizeof(struct binarize)); info->q = col->j; info->j = 0; /* will be set below */ info->n = n; /* if u < 2^n - 1, we need one additional row for (4) */ if (u < temp - 1) { row = npp_add_row(npp), nrows++; row->lb = -DBL_MAX, row->ub = u; } else row = NULL; /* in the transformed problem variable x[q] becomes binary variable x[0], so its objective and constraint coefficients are not changed */ col->ub = 1.0; /* include x[0] into constraint (4) */ if (row != NULL) npp_add_aij(npp, row, col, 1.0); /* add other binary variables x[1], ..., x[n-1] */ for (k = 1, temp = 2; k < n; k++, temp += temp) { /* add new binary variable x[k] */ bin = npp_add_col(npp); bin->is_int = 1; bin->lb = 0.0, bin->ub = 1.0; bin->coef = (double)temp * col->coef; /* store column reference number for x[1] */ if (info->j == 0) info->j = bin->j; else xassert(info->j + (k-1) == bin->j); /* duplicate constraint coefficients for x[k]; this also automatically includes x[k] into constraint (4) */ for (aij = col->ptr; aij != NULL; aij = aij->c_next) npp_add_aij(npp, aij->row, bin, (double)temp * aij->val); } } if (nvars > 0) xprintf("%d integer variable(s) were replaced by %d binary one" "s\n", nvars, nbins); if (nrows > 0) xprintf("%d row(s) were added due to binarization\n", nrows); if (nfails > 0) xprintf("Binarization failed for %d integer variable(s)\n", nfails); return nfails; } static int rcv_binarize_prob(NPP *npp, void *_info) { /* recovery binarized variable */ struct binarize *info = _info; int k, temp; double sum; /* compute value of x[q]; see formula (3) */ sum = npp->c_value[info->q]; for (k = 1, temp = 2; k < info->n; k++, temp += temp) sum += (double)temp * npp->c_value[info->j + (k-1)]; npp->c_value[info->q] = sum; return 0; } /**********************************************************************/ struct elem { /* linear form element a[j] x[j] */ double aj; /* non-zero coefficient value */ NPPCOL *xj; /* pointer to variable (column) */ struct elem *next; /* pointer to another term */ }; static struct elem *copy_form(NPP *npp, NPPROW *row, double s) { /* copy linear form */ NPPAIJ *aij; struct elem *ptr, *e; ptr = NULL; for (aij = row->ptr; aij != NULL; aij = aij->r_next) { e = dmp_get_atom(npp->pool, sizeof(struct elem)); e->aj = s * aij->val; e->xj = aij->col; e->next = ptr; ptr = e; } return ptr; } static void drop_form(NPP *npp, struct elem *ptr) { /* drop linear form */ struct elem *e; while (ptr != NULL) { e = ptr; ptr = e->next; dmp_free_atom(npp->pool, e, sizeof(struct elem)); } return; } /*********************************************************************** * NAME * * npp_is_packing - test if constraint is packing inequality * * SYNOPSIS * * #include "glpnpp.h" * int npp_is_packing(NPP *npp, NPPROW *row); * * RETURNS * * If the specified row (constraint) is packing inequality (see below), * the routine npp_is_packing returns non-zero. Otherwise, it returns * zero. * * PACKING INEQUALITIES * * In canonical format the packing inequality is the following: * * sum x[j] <= 1, (1) * j in J * * where all variables x[j] are binary. This inequality expresses the * condition that in any integer feasible solution at most one variable * from set J can take non-zero (unity) value while other variables * must be equal to zero. W.l.o.g. it is assumed that |J| >= 2, because * if J is empty or |J| = 1, the inequality (1) is redundant. * * In general case the packing inequality may include original variables * x[j] as well as their complements x~[j]: * * sum x[j] + sum x~[j] <= 1, (2) * j in Jp j in Jn * * where Jp and Jn are not intersected. Therefore, using substitution * x~[j] = 1 - x[j] gives the packing inequality in generalized format: * * sum x[j] - sum x[j] <= 1 - |Jn|. (3) * j in Jp j in Jn */ int npp_is_packing(NPP *npp, NPPROW *row) { /* test if constraint is packing inequality */ NPPCOL *col; NPPAIJ *aij; int b; xassert(npp == npp); if (!(row->lb == -DBL_MAX && row->ub != +DBL_MAX)) return 0; b = 1; for (aij = row->ptr; aij != NULL; aij = aij->r_next) { col = aij->col; if (!(col->is_int && col->lb == 0.0 && col->ub == 1.0)) return 0; if (aij->val == +1.0) ; else if (aij->val == -1.0) b--; else return 0; } if (row->ub != (double)b) return 0; return 1; } /*********************************************************************** * NAME * * npp_hidden_packing - identify hidden packing inequality * * SYNOPSIS * * #include "glpnpp.h" * int npp_hidden_packing(NPP *npp, NPPROW *row); * * DESCRIPTION * * The routine npp_hidden_packing processes specified inequality * constraint, which includes only binary variables, and the number of * the variables is not less than two. If the original inequality is * equivalent to a packing inequality, the routine replaces it by this * equivalent inequality. If the original constraint is double-sided * inequality, it is replaced by a pair of single-sided inequalities, * if necessary. * * RETURNS * * If the original inequality constraint was replaced by equivalent * packing inequality, the routine npp_hidden_packing returns non-zero. * Otherwise, it returns zero. * * PROBLEM TRANSFORMATION * * Consider an inequality constraint: * * sum a[j] x[j] <= b, (1) * j in J * * where all variables x[j] are binary, and |J| >= 2. (In case of '>=' * inequality it can be transformed to '<=' format by multiplying both * its sides by -1.) * * Let Jp = {j: a[j] > 0}, Jn = {j: a[j] < 0}. Performing substitution * x[j] = 1 - x~[j] for all j in Jn, we have: * * sum a[j] x[j] <= b ==> * j in J * * sum a[j] x[j] + sum a[j] x[j] <= b ==> * j in Jp j in Jn * * sum a[j] x[j] + sum a[j] (1 - x~[j]) <= b ==> * j in Jp j in Jn * * sum a[j] x[j] - sum a[j] x~[j] <= b - sum a[j]. * j in Jp j in Jn j in Jn * * Thus, meaning the transformation above, we can assume that in * inequality (1) all coefficients a[j] are positive. Moreover, we can * assume that a[j] <= b. In fact, let a[j] > b; then the following * three cases are possible: * * 1) b < 0. In this case inequality (1) is infeasible, so the problem * has no feasible solution (see the routine npp_analyze_row); * * 2) b = 0. In this case inequality (1) is a forcing inequality on its * upper bound (see the routine npp_forcing row), from which it * follows that all variables x[j] should be fixed at zero; * * 3) b > 0. In this case inequality (1) defines an implied zero upper * bound for variable x[j] (see the routine npp_implied_bounds), from * which it follows that x[j] should be fixed at zero. * * It is assumed that all three cases listed above have been recognized * by the routine npp_process_prob, which performs basic MIP processing * prior to a call the routine npp_hidden_packing. So, if one of these * cases occurs, we should just skip processing such constraint. * * Thus, let 0 < a[j] <= b. Then it is obvious that constraint (1) is * equivalent to packing inquality only if: * * a[j] + a[k] > b + eps (2) * * for all j, k in J, j != k, where eps is an absolute tolerance for * row (linear form) value. Checking the condition (2) for all j and k, * j != k, requires time O(|J|^2). However, this time can be reduced to * O(|J|), if use minimal a[j] and a[k], in which case it is sufficient * to check the condition (2) only once. * * Once the original inequality (1) is replaced by equivalent packing * inequality, we need to perform back substitution x~[j] = 1 - x[j] for * all j in Jn (see above). * * RECOVERING SOLUTION * * None needed. */ static int hidden_packing(NPP *npp, struct elem *ptr, double *_b) { /* process inequality constraint: sum a[j] x[j] <= b; 0 - specified row is NOT hidden packing inequality; 1 - specified row is packing inequality; 2 - specified row is hidden packing inequality. */ struct elem *e, *ej, *ek; int neg; double b = *_b, eps; xassert(npp == npp); /* a[j] must be non-zero, x[j] must be binary, for all j in J */ for (e = ptr; e != NULL; e = e->next) { xassert(e->aj != 0.0); xassert(e->xj->is_int); xassert(e->xj->lb == 0.0 && e->xj->ub == 1.0); } /* check if the specified inequality constraint already has the form of packing inequality */ neg = 0; /* neg is |Jn| */ for (e = ptr; e != NULL; e = e->next) { if (e->aj == +1.0) ; else if (e->aj == -1.0) neg++; else break; } if (e == NULL) { /* all coefficients a[j] are +1 or -1; check rhs b */ if (b == (double)(1 - neg)) { /* it is packing inequality; no processing is needed */ return 1; } } /* substitute x[j] = 1 - x~[j] for all j in Jn to make all a[j] positive; the result is a~[j] = |a[j]| and new rhs b */ for (e = ptr; e != NULL; e = e->next) if (e->aj < 0) b -= e->aj; /* now a[j] > 0 for all j in J (actually |a[j]| are used) */ /* if a[j] > b, skip processing--this case must not appear */ for (e = ptr; e != NULL; e = e->next) if (fabs(e->aj) > b) return 0; /* now 0 < a[j] <= b for all j in J */ /* find two minimal coefficients a[j] and a[k], j != k */ ej = NULL; for (e = ptr; e != NULL; e = e->next) if (ej == NULL || fabs(ej->aj) > fabs(e->aj)) ej = e; xassert(ej != NULL); ek = NULL; for (e = ptr; e != NULL; e = e->next) if (e != ej) if (ek == NULL || fabs(ek->aj) > fabs(e->aj)) ek = e; xassert(ek != NULL); /* the specified constraint is equivalent to packing inequality iff a[j] + a[k] > b + eps */ eps = 1e-3 + 1e-6 * fabs(b); if (fabs(ej->aj) + fabs(ek->aj) <= b + eps) return 0; /* perform back substitution x~[j] = 1 - x[j] and construct the final equivalent packing inequality in generalized format */ b = 1.0; for (e = ptr; e != NULL; e = e->next) { if (e->aj > 0.0) e->aj = +1.0; else /* e->aj < 0.0 */ e->aj = -1.0, b -= 1.0; } *_b = b; return 2; } int npp_hidden_packing(NPP *npp, NPPROW *row) { /* identify hidden packing inequality */ NPPROW *copy; NPPAIJ *aij; struct elem *ptr, *e; int kase, ret, count = 0; double b; /* the row must be inequality constraint */ xassert(row->lb < row->ub); for (kase = 0; kase <= 1; kase++) { if (kase == 0) { /* process row upper bound */ if (row->ub == +DBL_MAX) continue; ptr = copy_form(npp, row, +1.0); b = + row->ub; } else { /* process row lower bound */ if (row->lb == -DBL_MAX) continue; ptr = copy_form(npp, row, -1.0); b = - row->lb; } /* now the inequality has the form "sum a[j] x[j] <= b" */ ret = hidden_packing(npp, ptr, &b); xassert(0 <= ret && ret <= 2); if (kase == 1 && ret == 1 || ret == 2) { /* the original inequality has been identified as hidden packing inequality */ count++; #ifdef GLP_DEBUG xprintf("Original constraint:\n"); for (aij = row->ptr; aij != NULL; aij = aij->r_next) xprintf(" %+g x%d", aij->val, aij->col->j); if (row->lb != -DBL_MAX) xprintf(", >= %g", row->lb); if (row->ub != +DBL_MAX) xprintf(", <= %g", row->ub); xprintf("\n"); xprintf("Equivalent packing inequality:\n"); for (e = ptr; e != NULL; e = e->next) xprintf(" %sx%d", e->aj > 0.0 ? "+" : "-", e->xj->j); xprintf(", <= %g\n", b); #endif if (row->lb == -DBL_MAX || row->ub == +DBL_MAX) { /* the original row is single-sided inequality; no copy is needed */ copy = NULL; } else { /* the original row is double-sided inequality; we need to create its copy for other bound before replacing it with the equivalent inequality */ copy = npp_add_row(npp); if (kase == 0) { /* the copy is for lower bound */ copy->lb = row->lb, copy->ub = +DBL_MAX; } else { /* the copy is for upper bound */ copy->lb = -DBL_MAX, copy->ub = row->ub; } /* copy original row coefficients */ for (aij = row->ptr; aij != NULL; aij = aij->r_next) npp_add_aij(npp, copy, aij->col, aij->val); } /* replace the original inequality by equivalent one */ npp_erase_row(npp, row); row->lb = -DBL_MAX, row->ub = b; for (e = ptr; e != NULL; e = e->next) npp_add_aij(npp, row, e->xj, e->aj); /* continue processing lower bound for the copy */ if (copy != NULL) row = copy; } drop_form(npp, ptr); } return count; } /*********************************************************************** * NAME * * npp_implied_packing - identify implied packing inequality * * SYNOPSIS * * #include "glpnpp.h" * int npp_implied_packing(NPP *npp, NPPROW *row, int which, * NPPCOL *var[], char set[]); * * DESCRIPTION * * The routine npp_implied_packing processes specified row (constraint) * of general format: * * L <= sum a[j] x[j] <= U. (1) * j * * If which = 0, only lower bound L, which must exist, is considered, * while upper bound U is ignored. Similarly, if which = 1, only upper * bound U, which must exist, is considered, while lower bound L is * ignored. Thus, if the specified row is a double-sided inequality or * equality constraint, this routine should be called twice for both * lower and upper bounds. * * The routine npp_implied_packing attempts to find a non-trivial (i.e. * having not less than two binary variables) packing inequality: * * sum x[j] - sum x[j] <= 1 - |Jn|, (2) * j in Jp j in Jn * * which is relaxation of the constraint (1) in the sense that any * solution satisfying to that constraint also satisfies to the packing * inequality (2). If such relaxation exists, the routine stores * pointers to descriptors of corresponding binary variables and their * flags, resp., to locations var[1], var[2], ..., var[len] and set[1], * set[2], ..., set[len], where set[j] = 0 means that j in Jp and * set[j] = 1 means that j in Jn. * * RETURNS * * The routine npp_implied_packing returns len, which is the total * number of binary variables in the packing inequality found, len >= 2. * However, if the relaxation does not exist, the routine returns zero. * * ALGORITHM * * If which = 0, the constraint coefficients (1) are multiplied by -1 * and b is assigned -L; if which = 1, the constraint coefficients (1) * are not changed and b is assigned +U. In both cases the specified * constraint gets the following format: * * sum a[j] x[j] <= b. (3) * j * * (Note that (3) is a relaxation of (1), because one of bounds L or U * is ignored.) * * Let J be set of binary variables, Kp be set of non-binary (integer * or continuous) variables with a[j] > 0, and Kn be set of non-binary * variables with a[j] < 0. Then the inequality (3) can be written as * follows: * * sum a[j] x[j] <= b - sum a[j] x[j] - sum a[j] x[j]. (4) * j in J j in Kp j in Kn * * To get rid of non-binary variables we can replace the inequality (4) * by the following relaxed inequality: * * sum a[j] x[j] <= b~, (5) * j in J * * where: * * b~ = sup(b - sum a[j] x[j] - sum a[j] x[j]) = * j in Kp j in Kn * * = b - inf sum a[j] x[j] - inf sum a[j] x[j] = (6) * j in Kp j in Kn * * = b - sum a[j] l[j] - sum a[j] u[j]. * j in Kp j in Kn * * Note that if lower bound l[j] (if j in Kp) or upper bound u[j] * (if j in Kn) of some non-binary variable x[j] does not exist, then * formally b = +oo, in which case further analysis is not performed. * * Let Bp = {j in J: a[j] > 0}, Bn = {j in J: a[j] < 0}. To make all * the inequality coefficients in (5) positive, we replace all x[j] in * Bn by their complementaries, substituting x[j] = 1 - x~[j] for all * j in Bn, that gives: * * sum a[j] x[j] - sum a[j] x~[j] <= b~ - sum a[j]. (7) * j in Bp j in Bn j in Bn * * This inequality is a relaxation of the original constraint (1), and * it is a binary knapsack inequality. Writing it in the standard format * we have: * * sum alfa[j] z[j] <= beta, (8) * j in J * * where: * ( + a[j], if j in Bp, * alfa[j] = < (9) * ( - a[j], if j in Bn, * * ( x[j], if j in Bp, * z[j] = < (10) * ( 1 - x[j], if j in Bn, * * beta = b~ - sum a[j]. (11) * j in Bn * * In the inequality (8) all coefficients are positive, therefore, the * packing relaxation to be found for this inequality is the following: * * sum z[j] <= 1. (12) * j in P * * It is obvious that set P within J, which we would like to find, must * satisfy to the following condition: * * alfa[j] + alfa[k] > beta + eps for all j, k in P, j != k, (13) * * where eps is an absolute tolerance for value of the linear form. * Thus, it is natural to take P = {j: alpha[j] > (beta + eps) / 2}. * Moreover, if in the equality (8) there exist coefficients alfa[k], * for which alfa[k] <= (beta + eps) / 2, but which, nevertheless, * satisfies to the condition (13) for all j in P, *one* corresponding * variable z[k] (having, for example, maximal coefficient alfa[k]) can * be included in set P, that allows increasing the number of binary * variables in (12) by one. * * Once the set P has been built, for the inequality (12) we need to * perform back substitution according to (10) in order to express it * through the original binary variables. As the result of such back * substitution the relaxed packing inequality get its final format (2), * where Jp = J intersect Bp, and Jn = J intersect Bn. */ int npp_implied_packing(NPP *npp, NPPROW *row, int which, NPPCOL *var[], char set[]) { struct elem *ptr, *e, *i, *k; int len = 0; double b, eps; /* build inequality (3) */ if (which == 0) { ptr = copy_form(npp, row, -1.0); xassert(row->lb != -DBL_MAX); b = - row->lb; } else if (which == 1) { ptr = copy_form(npp, row, +1.0); xassert(row->ub != +DBL_MAX); b = + row->ub; } /* remove non-binary variables to build relaxed inequality (5); compute its right-hand side b~ with formula (6) */ for (e = ptr; e != NULL; e = e->next) { if (!(e->xj->is_int && e->xj->lb == 0.0 && e->xj->ub == 1.0)) { /* x[j] is non-binary variable */ if (e->aj > 0.0) { if (e->xj->lb == -DBL_MAX) goto done; b -= e->aj * e->xj->lb; } else /* e->aj < 0.0 */ { if (e->xj->ub == +DBL_MAX) goto done; b -= e->aj * e->xj->ub; } /* a[j] = 0 means that variable x[j] is removed */ e->aj = 0.0; } } /* substitute x[j] = 1 - x~[j] to build knapsack inequality (8); compute its right-hand side beta with formula (11) */ for (e = ptr; e != NULL; e = e->next) if (e->aj < 0.0) b -= e->aj; /* if beta is close to zero, the knapsack inequality is either infeasible or forcing inequality; this must never happen, so we skip further analysis */ if (b < 1e-3) goto done; /* build set P as well as sets Jp and Jn, and determine x[k] as explained above in comments to the routine */ eps = 1e-3 + 1e-6 * b; i = k = NULL; for (e = ptr; e != NULL; e = e->next) { /* note that alfa[j] = |a[j]| */ if (fabs(e->aj) > 0.5 * (b + eps)) { /* alfa[j] > (b + eps) / 2; include x[j] in set P, i.e. in set Jp or Jn */ var[++len] = e->xj; set[len] = (char)(e->aj > 0.0 ? 0 : 1); /* alfa[i] = min alfa[j] over all j included in set P */ if (i == NULL || fabs(i->aj) > fabs(e->aj)) i = e; } else if (fabs(e->aj) >= 1e-3) { /* alfa[k] = max alfa[j] over all j not included in set P; we skip coefficient a[j] if it is close to zero to avoid numerically unreliable results */ if (k == NULL || fabs(k->aj) < fabs(e->aj)) k = e; } } /* if alfa[k] satisfies to condition (13) for all j in P, include x[k] in P */ if (i != NULL && k != NULL && fabs(i->aj) + fabs(k->aj) > b + eps) { var[++len] = k->xj; set[len] = (char)(k->aj > 0.0 ? 0 : 1); } /* trivial packing inequality being redundant must never appear, so we just ignore it */ if (len < 2) len = 0; done: drop_form(npp, ptr); return len; } /*********************************************************************** * NAME * * npp_is_covering - test if constraint is covering inequality * * SYNOPSIS * * #include "glpnpp.h" * int npp_is_covering(NPP *npp, NPPROW *row); * * RETURNS * * If the specified row (constraint) is covering inequality (see below), * the routine npp_is_covering returns non-zero. Otherwise, it returns * zero. * * COVERING INEQUALITIES * * In canonical format the covering inequality is the following: * * sum x[j] >= 1, (1) * j in J * * where all variables x[j] are binary. This inequality expresses the * condition that in any integer feasible solution variables in set J * cannot be all equal to zero at the same time, i.e. at least one * variable must take non-zero (unity) value. W.l.o.g. it is assumed * that |J| >= 2, because if J is empty, the inequality (1) is * infeasible, and if |J| = 1, the inequality (1) is a forcing row. * * In general case the covering inequality may include original * variables x[j] as well as their complements x~[j]: * * sum x[j] + sum x~[j] >= 1, (2) * j in Jp j in Jn * * where Jp and Jn are not intersected. Therefore, using substitution * x~[j] = 1 - x[j] gives the packing inequality in generalized format: * * sum x[j] - sum x[j] >= 1 - |Jn|. (3) * j in Jp j in Jn * * (May note that the inequality (3) cuts off infeasible solutions, * where x[j] = 0 for all j in Jp and x[j] = 1 for all j in Jn.) * * NOTE: If |J| = 2, the inequality (3) is equivalent to packing * inequality (see the routine npp_is_packing). */ int npp_is_covering(NPP *npp, NPPROW *row) { /* test if constraint is covering inequality */ NPPCOL *col; NPPAIJ *aij; int b; xassert(npp == npp); if (!(row->lb != -DBL_MAX && row->ub == +DBL_MAX)) return 0; b = 1; for (aij = row->ptr; aij != NULL; aij = aij->r_next) { col = aij->col; if (!(col->is_int && col->lb == 0.0 && col->ub == 1.0)) return 0; if (aij->val == +1.0) ; else if (aij->val == -1.0) b--; else return 0; } if (row->lb != (double)b) return 0; return 1; } /*********************************************************************** * NAME * * npp_hidden_covering - identify hidden covering inequality * * SYNOPSIS * * #include "glpnpp.h" * int npp_hidden_covering(NPP *npp, NPPROW *row); * * DESCRIPTION * * The routine npp_hidden_covering processes specified inequality * constraint, which includes only binary variables, and the number of * the variables is not less than three. If the original inequality is * equivalent to a covering inequality (see below), the routine * replaces it by the equivalent inequality. If the original constraint * is double-sided inequality, it is replaced by a pair of single-sided * inequalities, if necessary. * * RETURNS * * If the original inequality constraint was replaced by equivalent * covering inequality, the routine npp_hidden_covering returns * non-zero. Otherwise, it returns zero. * * PROBLEM TRANSFORMATION * * Consider an inequality constraint: * * sum a[j] x[j] >= b, (1) * j in J * * where all variables x[j] are binary, and |J| >= 3. (In case of '<=' * inequality it can be transformed to '>=' format by multiplying both * its sides by -1.) * * Let Jp = {j: a[j] > 0}, Jn = {j: a[j] < 0}. Performing substitution * x[j] = 1 - x~[j] for all j in Jn, we have: * * sum a[j] x[j] >= b ==> * j in J * * sum a[j] x[j] + sum a[j] x[j] >= b ==> * j in Jp j in Jn * * sum a[j] x[j] + sum a[j] (1 - x~[j]) >= b ==> * j in Jp j in Jn * * sum m a[j] x[j] - sum a[j] x~[j] >= b - sum a[j]. * j in Jp j in Jn j in Jn * * Thus, meaning the transformation above, we can assume that in * inequality (1) all coefficients a[j] are positive. Moreover, we can * assume that b > 0, because otherwise the inequality (1) would be * redundant (see the routine npp_analyze_row). It is then obvious that * constraint (1) is equivalent to covering inequality only if: * * a[j] >= b, (2) * * for all j in J. * * Once the original inequality (1) is replaced by equivalent covering * inequality, we need to perform back substitution x~[j] = 1 - x[j] for * all j in Jn (see above). * * RECOVERING SOLUTION * * None needed. */ static int hidden_covering(NPP *npp, struct elem *ptr, double *_b) { /* process inequality constraint: sum a[j] x[j] >= b; 0 - specified row is NOT hidden covering inequality; 1 - specified row is covering inequality; 2 - specified row is hidden covering inequality. */ struct elem *e; int neg; double b = *_b, eps; xassert(npp == npp); /* a[j] must be non-zero, x[j] must be binary, for all j in J */ for (e = ptr; e != NULL; e = e->next) { xassert(e->aj != 0.0); xassert(e->xj->is_int); xassert(e->xj->lb == 0.0 && e->xj->ub == 1.0); } /* check if the specified inequality constraint already has the form of covering inequality */ neg = 0; /* neg is |Jn| */ for (e = ptr; e != NULL; e = e->next) { if (e->aj == +1.0) ; else if (e->aj == -1.0) neg++; else break; } if (e == NULL) { /* all coefficients a[j] are +1 or -1; check rhs b */ if (b == (double)(1 - neg)) { /* it is covering inequality; no processing is needed */ return 1; } } /* substitute x[j] = 1 - x~[j] for all j in Jn to make all a[j] positive; the result is a~[j] = |a[j]| and new rhs b */ for (e = ptr; e != NULL; e = e->next) if (e->aj < 0) b -= e->aj; /* now a[j] > 0 for all j in J (actually |a[j]| are used) */ /* if b <= 0, skip processing--this case must not appear */ if (b < 1e-3) return 0; /* now a[j] > 0 for all j in J, and b > 0 */ /* the specified constraint is equivalent to covering inequality iff a[j] >= b for all j in J */ eps = 1e-9 + 1e-12 * fabs(b); for (e = ptr; e != NULL; e = e->next) if (fabs(e->aj) < b - eps) return 0; /* perform back substitution x~[j] = 1 - x[j] and construct the final equivalent covering inequality in generalized format */ b = 1.0; for (e = ptr; e != NULL; e = e->next) { if (e->aj > 0.0) e->aj = +1.0; else /* e->aj < 0.0 */ e->aj = -1.0, b -= 1.0; } *_b = b; return 2; } int npp_hidden_covering(NPP *npp, NPPROW *row) { /* identify hidden covering inequality */ NPPROW *copy; NPPAIJ *aij; struct elem *ptr, *e; int kase, ret, count = 0; double b; /* the row must be inequality constraint */ xassert(row->lb < row->ub); for (kase = 0; kase <= 1; kase++) { if (kase == 0) { /* process row lower bound */ if (row->lb == -DBL_MAX) continue; ptr = copy_form(npp, row, +1.0); b = + row->lb; } else { /* process row upper bound */ if (row->ub == +DBL_MAX) continue; ptr = copy_form(npp, row, -1.0); b = - row->ub; } /* now the inequality has the form "sum a[j] x[j] >= b" */ ret = hidden_covering(npp, ptr, &b); xassert(0 <= ret && ret <= 2); if (kase == 1 && ret == 1 || ret == 2) { /* the original inequality has been identified as hidden covering inequality */ count++; #ifdef GLP_DEBUG xprintf("Original constraint:\n"); for (aij = row->ptr; aij != NULL; aij = aij->r_next) xprintf(" %+g x%d", aij->val, aij->col->j); if (row->lb != -DBL_MAX) xprintf(", >= %g", row->lb); if (row->ub != +DBL_MAX) xprintf(", <= %g", row->ub); xprintf("\n"); xprintf("Equivalent covering inequality:\n"); for (e = ptr; e != NULL; e = e->next) xprintf(" %sx%d", e->aj > 0.0 ? "+" : "-", e->xj->j); xprintf(", >= %g\n", b); #endif if (row->lb == -DBL_MAX || row->ub == +DBL_MAX) { /* the original row is single-sided inequality; no copy is needed */ copy = NULL; } else { /* the original row is double-sided inequality; we need to create its copy for other bound before replacing it with the equivalent inequality */ copy = npp_add_row(npp); if (kase == 0) { /* the copy is for upper bound */ copy->lb = -DBL_MAX, copy->ub = row->ub; } else { /* the copy is for lower bound */ copy->lb = row->lb, copy->ub = +DBL_MAX; } /* copy original row coefficients */ for (aij = row->ptr; aij != NULL; aij = aij->r_next) npp_add_aij(npp, copy, aij->col, aij->val); } /* replace the original inequality by equivalent one */ npp_erase_row(npp, row); row->lb = b, row->ub = +DBL_MAX; for (e = ptr; e != NULL; e = e->next) npp_add_aij(npp, row, e->xj, e->aj); /* continue processing upper bound for the copy */ if (copy != NULL) row = copy; } drop_form(npp, ptr); } return count; } /*********************************************************************** * NAME * * npp_is_partitioning - test if constraint is partitioning equality * * SYNOPSIS * * #include "glpnpp.h" * int npp_is_partitioning(NPP *npp, NPPROW *row); * * RETURNS * * If the specified row (constraint) is partitioning equality (see * below), the routine npp_is_partitioning returns non-zero. Otherwise, * it returns zero. * * PARTITIONING EQUALITIES * * In canonical format the partitioning equality is the following: * * sum x[j] = 1, (1) * j in J * * where all variables x[j] are binary. This equality expresses the * condition that in any integer feasible solution exactly one variable * in set J must take non-zero (unity) value while other variables must * be equal to zero. W.l.o.g. it is assumed that |J| >= 2, because if * J is empty, the inequality (1) is infeasible, and if |J| = 1, the * inequality (1) is a fixing row. * * In general case the partitioning equality may include original * variables x[j] as well as their complements x~[j]: * * sum x[j] + sum x~[j] = 1, (2) * j in Jp j in Jn * * where Jp and Jn are not intersected. Therefore, using substitution * x~[j] = 1 - x[j] leads to the partitioning equality in generalized * format: * * sum x[j] - sum x[j] = 1 - |Jn|. (3) * j in Jp j in Jn */ int npp_is_partitioning(NPP *npp, NPPROW *row) { /* test if constraint is partitioning equality */ NPPCOL *col; NPPAIJ *aij; int b; xassert(npp == npp); if (row->lb != row->ub) return 0; b = 1; for (aij = row->ptr; aij != NULL; aij = aij->r_next) { col = aij->col; if (!(col->is_int && col->lb == 0.0 && col->ub == 1.0)) return 0; if (aij->val == +1.0) ; else if (aij->val == -1.0) b--; else return 0; } if (row->lb != (double)b) return 0; return 1; } /*********************************************************************** * NAME * * npp_reduce_ineq_coef - reduce inequality constraint coefficients * * SYNOPSIS * * #include "glpnpp.h" * int npp_reduce_ineq_coef(NPP *npp, NPPROW *row); * * DESCRIPTION * * The routine npp_reduce_ineq_coef processes specified inequality * constraint attempting to replace it by an equivalent constraint, * where magnitude of coefficients at binary variables is smaller than * in the original constraint. If the inequality is double-sided, it is * replaced by a pair of single-sided inequalities, if necessary. * * RETURNS * * The routine npp_reduce_ineq_coef returns the number of coefficients * reduced. * * BACKGROUND * * Consider an inequality constraint: * * sum a[j] x[j] >= b. (1) * j in J * * (In case of '<=' inequality it can be transformed to '>=' format by * multiplying both its sides by -1.) Let x[k] be a binary variable; * other variables can be integer as well as continuous. We can write * constraint (1) as follows: * * a[k] x[k] + t[k] >= b, (2) * * where: * * t[k] = sum a[j] x[j]. (3) * j in J\{k} * * Since x[k] is binary, constraint (2) is equivalent to disjunction of * the following two constraints: * * x[k] = 0, t[k] >= b (4) * * OR * * x[k] = 1, t[k] >= b - a[k]. (5) * * Let also that for the partial sum t[k] be known some its implied * lower bound inf t[k]. * * Case a[k] > 0. Let inf t[k] < b, since otherwise both constraints * (4) and (5) and therefore constraint (2) are redundant. * If inf t[k] > b - a[k], only constraint (5) is redundant, in which * case it can be replaced with the following redundant and therefore * equivalent constraint: * * t[k] >= b - a'[k] = inf t[k], (6) * * where: * * a'[k] = b - inf t[k]. (7) * * Thus, the original constraint (2) is equivalent to the following * constraint with coefficient at variable x[k] changed: * * a'[k] x[k] + t[k] >= b. (8) * * From inf t[k] < b it follows that a'[k] > 0, i.e. the coefficient * at x[k] keeps its sign. And from inf t[k] > b - a[k] it follows that * a'[k] < a[k], i.e. the coefficient reduces in magnitude. * * Case a[k] < 0. Let inf t[k] < b - a[k], since otherwise both * constraints (4) and (5) and therefore constraint (2) are redundant. * If inf t[k] > b, only constraint (4) is redundant, in which case it * can be replaced with the following redundant and therefore equivalent * constraint: * * t[k] >= b' = inf t[k]. (9) * * Rewriting constraint (5) as follows: * * t[k] >= b - a[k] = b' - a'[k], (10) * * where: * * a'[k] = a[k] + b' - b = a[k] + inf t[k] - b, (11) * * we can see that disjunction of constraint (9) and (10) is equivalent * to disjunction of constraint (4) and (5), from which it follows that * the original constraint (2) is equivalent to the following constraint * with both coefficient at variable x[k] and right-hand side changed: * * a'[k] x[k] + t[k] >= b'. (12) * * From inf t[k] < b - a[k] it follows that a'[k] < 0, i.e. the * coefficient at x[k] keeps its sign. And from inf t[k] > b it follows * that a'[k] > a[k], i.e. the coefficient reduces in magnitude. * * PROBLEM TRANSFORMATION * * In the routine npp_reduce_ineq_coef the following implied lower * bound of the partial sum (3) is used: * * inf t[k] = sum a[j] l[j] + sum a[j] u[j], (13) * j in Jp\{k} k in Jn\{k} * * where Jp = {j : a[j] > 0}, Jn = {j : a[j] < 0}, l[j] and u[j] are * lower and upper bounds, resp., of variable x[j]. * * In order to compute inf t[k] more efficiently, the following formula, * which is equivalent to (13), is actually used: * * ( h - a[k] l[k] = h, if a[k] > 0, * inf t[k] = < (14) * ( h - a[k] u[k] = h - a[k], if a[k] < 0, * * where: * * h = sum a[j] l[j] + sum a[j] u[j] (15) * j in Jp j in Jn * * is the implied lower bound of row (1). * * Reduction of positive coefficient (a[k] > 0) does not change value * of h, since l[k] = 0. In case of reduction of negative coefficient * (a[k] < 0) from (11) it follows that: * * delta a[k] = a'[k] - a[k] = inf t[k] - b (> 0), (16) * * so new value of h (accounting that u[k] = 1) can be computed as * follows: * * h := h + delta a[k] = h + (inf t[k] - b). (17) * * RECOVERING SOLUTION * * None needed. */ static int reduce_ineq_coef(NPP *npp, struct elem *ptr, double *_b) { /* process inequality constraint: sum a[j] x[j] >= b */ /* returns: the number of coefficients reduced */ struct elem *e; int count = 0; double h, inf_t, new_a, b = *_b; xassert(npp == npp); /* compute h; see (15) */ h = 0.0; for (e = ptr; e != NULL; e = e->next) { if (e->aj > 0.0) { if (e->xj->lb == -DBL_MAX) goto done; h += e->aj * e->xj->lb; } else /* e->aj < 0.0 */ { if (e->xj->ub == +DBL_MAX) goto done; h += e->aj * e->xj->ub; } } /* perform reduction of coefficients at binary variables */ for (e = ptr; e != NULL; e = e->next) { /* skip non-binary variable */ if (!(e->xj->is_int && e->xj->lb == 0.0 && e->xj->ub == 1.0)) continue; if (e->aj > 0.0) { /* compute inf t[k]; see (14) */ inf_t = h; if (b - e->aj < inf_t && inf_t < b) { /* compute reduced coefficient a'[k]; see (7) */ new_a = b - inf_t; if (new_a >= +1e-3 && e->aj - new_a >= 0.01 * (1.0 + e->aj)) { /* accept a'[k] */ #ifdef GLP_DEBUG xprintf("+"); #endif e->aj = new_a; count++; } } } else /* e->aj < 0.0 */ { /* compute inf t[k]; see (14) */ inf_t = h - e->aj; if (b < inf_t && inf_t < b - e->aj) { /* compute reduced coefficient a'[k]; see (11) */ new_a = e->aj + (inf_t - b); if (new_a <= -1e-3 && new_a - e->aj >= 0.01 * (1.0 - e->aj)) { /* accept a'[k] */ #ifdef GLP_DEBUG xprintf("-"); #endif e->aj = new_a; /* update h; see (17) */ h += (inf_t - b); /* compute b'; see (9) */ b = inf_t; count++; } } } } *_b = b; done: return count; } int npp_reduce_ineq_coef(NPP *npp, NPPROW *row) { /* reduce inequality constraint coefficients */ NPPROW *copy; NPPAIJ *aij; struct elem *ptr, *e; int kase, count[2]; double b; /* the row must be inequality constraint */ xassert(row->lb < row->ub); count[0] = count[1] = 0; for (kase = 0; kase <= 1; kase++) { if (kase == 0) { /* process row lower bound */ if (row->lb == -DBL_MAX) continue; #ifdef GLP_DEBUG xprintf("L"); #endif ptr = copy_form(npp, row, +1.0); b = + row->lb; } else { /* process row upper bound */ if (row->ub == +DBL_MAX) continue; #ifdef GLP_DEBUG xprintf("U"); #endif ptr = copy_form(npp, row, -1.0); b = - row->ub; } /* now the inequality has the form "sum a[j] x[j] >= b" */ count[kase] = reduce_ineq_coef(npp, ptr, &b); if (count[kase] > 0) { /* the original inequality has been replaced by equivalent one with coefficients reduced */ if (row->lb == -DBL_MAX || row->ub == +DBL_MAX) { /* the original row is single-sided inequality; no copy is needed */ copy = NULL; } else { /* the original row is double-sided inequality; we need to create its copy for other bound before replacing it with the equivalent inequality */ #ifdef GLP_DEBUG xprintf("*"); #endif copy = npp_add_row(npp); if (kase == 0) { /* the copy is for upper bound */ copy->lb = -DBL_MAX, copy->ub = row->ub; } else { /* the copy is for lower bound */ copy->lb = row->lb, copy->ub = +DBL_MAX; } /* copy original row coefficients */ for (aij = row->ptr; aij != NULL; aij = aij->r_next) npp_add_aij(npp, copy, aij->col, aij->val); } /* replace the original inequality by equivalent one */ npp_erase_row(npp, row); row->lb = b, row->ub = +DBL_MAX; for (e = ptr; e != NULL; e = e->next) npp_add_aij(npp, row, e->xj, e->aj); /* continue processing upper bound for the copy */ if (copy != NULL) row = copy; } drop_form(npp, ptr); } return count[0] + count[1]; } /* eof */ glpk-5.0/src/npp/npp5.c0000644000062000006210000006360513766346220014126 0ustar maomkpasswd/* npp5.c */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2009-2017 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "npp.h" /*********************************************************************** * NAME * * npp_clean_prob - perform initial LP/MIP processing * * SYNOPSIS * * #include "glpnpp.h" * void npp_clean_prob(NPP *npp); * * DESCRIPTION * * The routine npp_clean_prob performs initial LP/MIP processing that * currently includes: * * 1) removing free rows; * * 2) replacing double-sided constraint rows with almost identical * bounds, by equality constraint rows; * * 3) removing fixed columns; * * 4) replacing double-bounded columns with almost identical bounds by * fixed columns and removing those columns; * * 5) initial processing constraint coefficients (not implemented); * * 6) initial processing objective coefficients (not implemented). */ void npp_clean_prob(NPP *npp) { /* perform initial LP/MIP processing */ NPPROW *row, *next_row; NPPCOL *col, *next_col; int ret; xassert(npp == npp); /* process rows which originally are free */ for (row = npp->r_head; row != NULL; row = next_row) { next_row = row->next; if (row->lb == -DBL_MAX && row->ub == +DBL_MAX) { /* process free row */ #ifdef GLP_DEBUG xprintf("1"); #endif npp_free_row(npp, row); /* row was deleted */ } } /* process rows which originally are double-sided inequalities */ for (row = npp->r_head; row != NULL; row = next_row) { next_row = row->next; if (row->lb != -DBL_MAX && row->ub != +DBL_MAX && row->lb < row->ub) { ret = npp_make_equality(npp, row); if (ret == 0) ; else if (ret == 1) { /* row was replaced by equality constraint */ #ifdef GLP_DEBUG xprintf("2"); #endif } else xassert(ret != ret); } } /* process columns which are originally fixed */ for (col = npp->c_head; col != NULL; col = next_col) { next_col = col->next; if (col->lb == col->ub) { /* process fixed column */ #ifdef GLP_DEBUG xprintf("3"); #endif npp_fixed_col(npp, col); /* column was deleted */ } } /* process columns which are originally double-bounded */ for (col = npp->c_head; col != NULL; col = next_col) { next_col = col->next; if (col->lb != -DBL_MAX && col->ub != +DBL_MAX && col->lb < col->ub) { ret = npp_make_fixed(npp, col); if (ret == 0) ; else if (ret == 1) { /* column was replaced by fixed column; process it */ #ifdef GLP_DEBUG xprintf("4"); #endif npp_fixed_col(npp, col); /* column was deleted */ } } } return; } /*********************************************************************** * NAME * * npp_process_row - perform basic row processing * * SYNOPSIS * * #include "glpnpp.h" * int npp_process_row(NPP *npp, NPPROW *row, int hard); * * DESCRIPTION * * The routine npp_process_row performs basic row processing that * currently includes: * * 1) removing empty row; * * 2) removing equality constraint row singleton and corresponding * column; * * 3) removing inequality constraint row singleton and corresponding * column if it was fixed; * * 4) performing general row analysis; * * 5) removing redundant row bounds; * * 6) removing forcing row and corresponding columns; * * 7) removing row which becomes free due to redundant bounds; * * 8) computing implied bounds for all columns in the row and using * them to strengthen current column bounds (MIP only, optional, * performed if the flag hard is on). * * Additionally the routine may activate affected rows and/or columns * for further processing. * * RETURNS * * 0 success; * * GLP_ENOPFS primal/integer infeasibility detected; * * GLP_ENODFS dual infeasibility detected. */ int npp_process_row(NPP *npp, NPPROW *row, int hard) { /* perform basic row processing */ NPPCOL *col; NPPAIJ *aij, *next_aij, *aaa; int ret; /* row must not be free */ xassert(!(row->lb == -DBL_MAX && row->ub == +DBL_MAX)); /* start processing row */ if (row->ptr == NULL) { /* empty row */ ret = npp_empty_row(npp, row); if (ret == 0) { /* row was deleted */ #ifdef GLP_DEBUG xprintf("A"); #endif return 0; } else if (ret == 1) { /* primal infeasibility */ return GLP_ENOPFS; } else xassert(ret != ret); } if (row->ptr->r_next == NULL) { /* row singleton */ col = row->ptr->col; if (row->lb == row->ub) { /* equality constraint */ ret = npp_eq_singlet(npp, row); if (ret == 0) { /* column was fixed, row was deleted */ #ifdef GLP_DEBUG xprintf("B"); #endif /* activate rows affected by column */ for (aij = col->ptr; aij != NULL; aij = aij->c_next) npp_activate_row(npp, aij->row); /* process fixed column */ npp_fixed_col(npp, col); /* column was deleted */ return 0; } else if (ret == 1 || ret == 2) { /* primal/integer infeasibility */ return GLP_ENOPFS; } else xassert(ret != ret); } else { /* inequality constraint */ ret = npp_ineq_singlet(npp, row); if (0 <= ret && ret <= 3) { /* row was deleted */ #ifdef GLP_DEBUG xprintf("C"); #endif /* activate column, since its length was changed due to row deletion */ npp_activate_col(npp, col); if (ret >= 2) { /* column bounds changed significantly or column was fixed */ /* activate rows affected by column */ for (aij = col->ptr; aij != NULL; aij = aij->c_next) npp_activate_row(npp, aij->row); } if (ret == 3) { /* column was fixed; process it */ #ifdef GLP_DEBUG xprintf("D"); #endif npp_fixed_col(npp, col); /* column was deleted */ } return 0; } else if (ret == 4) { /* primal infeasibility */ return GLP_ENOPFS; } else xassert(ret != ret); } } #if 0 /* sometimes this causes too large round-off errors; probably pivot coefficient should be chosen more carefully */ if (row->ptr->r_next->r_next == NULL) { /* row doubleton */ if (row->lb == row->ub) { /* equality constraint */ if (!(row->ptr->col->is_int || row->ptr->r_next->col->is_int)) { /* both columns are continuous */ NPPCOL *q; q = npp_eq_doublet(npp, row); if (q != NULL) { /* column q was eliminated */ #ifdef GLP_DEBUG xprintf("E"); #endif /* now column q is singleton of type "implied slack variable"; we process it here to make sure that on recovering basic solution the row is always active equality constraint (as required by the routine rcv_eq_doublet) */ xassert(npp_process_col(npp, q) == 0); /* column q was deleted; note that row p also may be deleted */ return 0; } } } } #endif /* general row analysis */ ret = npp_analyze_row(npp, row); xassert(0x00 <= ret && ret <= 0xFF); if (ret == 0x33) { /* row bounds are inconsistent with column bounds */ return GLP_ENOPFS; } if ((ret & 0x0F) == 0x00) { /* row lower bound does not exist or redundant */ if (row->lb != -DBL_MAX) { /* remove redundant row lower bound */ #ifdef GLP_DEBUG xprintf("F"); #endif npp_inactive_bound(npp, row, 0); } } else if ((ret & 0x0F) == 0x01) { /* row lower bound can be active */ /* see below */ } else if ((ret & 0x0F) == 0x02) { /* row lower bound is a forcing bound */ #ifdef GLP_DEBUG xprintf("G"); #endif /* process forcing row */ if (npp_forcing_row(npp, row, 0) == 0) fixup: { /* columns were fixed, row was made free */ for (aij = row->ptr; aij != NULL; aij = next_aij) { /* process column fixed by forcing row */ #ifdef GLP_DEBUG xprintf("H"); #endif col = aij->col; next_aij = aij->r_next; /* activate rows affected by column */ for (aaa = col->ptr; aaa != NULL; aaa = aaa->c_next) npp_activate_row(npp, aaa->row); /* process fixed column */ npp_fixed_col(npp, col); /* column was deleted */ } /* process free row (which now is empty due to deletion of all its columns) */ npp_free_row(npp, row); /* row was deleted */ return 0; } } else xassert(ret != ret); if ((ret & 0xF0) == 0x00) { /* row upper bound does not exist or redundant */ if (row->ub != +DBL_MAX) { /* remove redundant row upper bound */ #ifdef GLP_DEBUG xprintf("I"); #endif npp_inactive_bound(npp, row, 1); } } else if ((ret & 0xF0) == 0x10) { /* row upper bound can be active */ /* see below */ } else if ((ret & 0xF0) == 0x20) { /* row upper bound is a forcing bound */ #ifdef GLP_DEBUG xprintf("J"); #endif /* process forcing row */ if (npp_forcing_row(npp, row, 1) == 0) goto fixup; } else xassert(ret != ret); if (row->lb == -DBL_MAX && row->ub == +DBL_MAX) { /* row became free due to redundant bounds removal */ #ifdef GLP_DEBUG xprintf("K"); #endif /* activate its columns, since their length will change due to row deletion */ for (aij = row->ptr; aij != NULL; aij = aij->r_next) npp_activate_col(npp, aij->col); /* process free row */ npp_free_row(npp, row); /* row was deleted */ return 0; } #if 1 /* 23/XII-2009 */ /* row lower and/or upper bounds can be active */ if (npp->sol == GLP_MIP && hard) { /* improve current column bounds (optional) */ if (npp_improve_bounds(npp, row, 1) < 0) return GLP_ENOPFS; } #endif return 0; } /*********************************************************************** * NAME * * npp_improve_bounds - improve current column bounds * * SYNOPSIS * * #include "glpnpp.h" * int npp_improve_bounds(NPP *npp, NPPROW *row, int flag); * * DESCRIPTION * * The routine npp_improve_bounds analyzes specified row (inequality * or equality constraint) to determine implied column bounds and then * uses these bounds to improve (strengthen) current column bounds. * * If the flag is on and current column bounds changed significantly * or the column was fixed, the routine activate rows affected by the * column for further processing. (This feature is intended to be used * in the main loop of the routine npp_process_row.) * * NOTE: This operation can be used for MIP problem only. * * RETURNS * * The routine npp_improve_bounds returns the number of significantly * changed bounds plus the number of column having been fixed due to * bound improvements. However, if the routine detects primal/integer * infeasibility, it returns a negative value. */ int npp_improve_bounds(NPP *npp, NPPROW *row, int flag) { /* improve current column bounds */ NPPCOL *col; NPPAIJ *aij, *next_aij, *aaa; int kase, ret, count = 0; double lb, ub; xassert(npp->sol == GLP_MIP); /* row must not be free */ xassert(!(row->lb == -DBL_MAX && row->ub == +DBL_MAX)); /* determine implied column bounds */ npp_implied_bounds(npp, row); /* and use these bounds to strengthen current column bounds */ for (aij = row->ptr; aij != NULL; aij = next_aij) { col = aij->col; next_aij = aij->r_next; for (kase = 0; kase <= 1; kase++) { /* save current column bounds */ lb = col->lb, ub = col->ub; if (kase == 0) { /* process implied column lower bound */ if (col->ll.ll == -DBL_MAX) continue; ret = npp_implied_lower(npp, col, col->ll.ll); } else { /* process implied column upper bound */ if (col->uu.uu == +DBL_MAX) continue; ret = npp_implied_upper(npp, col, col->uu.uu); } if (ret == 0 || ret == 1) { /* current column bounds did not change or changed, but not significantly; restore current column bounds */ col->lb = lb, col->ub = ub; } else if (ret == 2 || ret == 3) { /* current column bounds changed significantly or column was fixed */ #ifdef GLP_DEBUG xprintf("L"); #endif count++; /* activate other rows affected by column, if required */ if (flag) { for (aaa = col->ptr; aaa != NULL; aaa = aaa->c_next) { if (aaa->row != row) npp_activate_row(npp, aaa->row); } } if (ret == 3) { /* process fixed column */ #ifdef GLP_DEBUG xprintf("M"); #endif npp_fixed_col(npp, col); /* column was deleted */ break; /* for kase */ } } else if (ret == 4) { /* primal/integer infeasibility */ return -1; } else xassert(ret != ret); } } return count; } /*********************************************************************** * NAME * * npp_process_col - perform basic column processing * * SYNOPSIS * * #include "glpnpp.h" * int npp_process_col(NPP *npp, NPPCOL *col); * * DESCRIPTION * * The routine npp_process_col performs basic column processing that * currently includes: * * 1) fixing and removing empty column; * * 2) removing column singleton, which is implied slack variable, and * corresponding row if it becomes free; * * 3) removing bounds of column, which is implied free variable, and * replacing corresponding row by equality constraint. * * Additionally the routine may activate affected rows and/or columns * for further processing. * * RETURNS * * 0 success; * * GLP_ENOPFS primal/integer infeasibility detected; * * GLP_ENODFS dual infeasibility detected. */ int npp_process_col(NPP *npp, NPPCOL *col) { /* perform basic column processing */ NPPROW *row; NPPAIJ *aij; int ret; /* column must not be fixed */ xassert(col->lb < col->ub); /* start processing column */ if (col->ptr == NULL) { /* empty column */ ret = npp_empty_col(npp, col); if (ret == 0) { /* column was fixed and deleted */ #ifdef GLP_DEBUG xprintf("N"); #endif return 0; } else if (ret == 1) { /* dual infeasibility */ return GLP_ENODFS; } else xassert(ret != ret); } if (col->ptr->c_next == NULL) { /* column singleton */ row = col->ptr->row; if (row->lb == row->ub) { /* equality constraint */ if (!col->is_int) slack: { /* implied slack variable */ #ifdef GLP_DEBUG xprintf("O"); #endif npp_implied_slack(npp, col); /* column was deleted */ if (row->lb == -DBL_MAX && row->ub == +DBL_MAX) { /* row became free due to implied slack variable */ #ifdef GLP_DEBUG xprintf("P"); #endif /* activate columns affected by row */ for (aij = row->ptr; aij != NULL; aij = aij->r_next) npp_activate_col(npp, aij->col); /* process free row */ npp_free_row(npp, row); /* row was deleted */ } else { /* row became inequality constraint; activate it since its length changed due to column deletion */ npp_activate_row(npp, row); } return 0; } } else { /* inequality constraint */ if (!col->is_int) { ret = npp_implied_free(npp, col); if (ret == 0) { /* implied free variable */ #ifdef GLP_DEBUG xprintf("Q"); #endif /* column bounds were removed, row was replaced by equality constraint */ goto slack; } else if (ret == 1) { /* column is not implied free variable, because its lower and/or upper bounds can be active */ } else if (ret == 2) { /* dual infeasibility */ return GLP_ENODFS; } } } } /* column still exists */ return 0; } /*********************************************************************** * NAME * * npp_process_prob - perform basic LP/MIP processing * * SYNOPSIS * * #include "glpnpp.h" * int npp_process_prob(NPP *npp, int hard); * * DESCRIPTION * * The routine npp_process_prob performs basic LP/MIP processing that * currently includes: * * 1) initial LP/MIP processing (see the routine npp_clean_prob), * * 2) basic row processing (see the routine npp_process_row), and * * 3) basic column processing (see the routine npp_process_col). * * If the flag hard is on, the routine attempts to improve current * column bounds multiple times within the main processing loop, in * which case this feature may take a time. Otherwise, if the flag hard * is off, improving column bounds is performed only once at the end of * the main loop. (Note that this feature is used for MIP only.) * * The routine uses two sets: the set of active rows and the set of * active columns. Rows/columns are marked by a flag (the field temp in * NPPROW/NPPCOL). If the flag is non-zero, the row/column is active, * in which case it is placed in the beginning of the row/column list; * otherwise, if the flag is zero, the row/column is inactive, in which * case it is placed in the end of the row/column list. If a row/column * being currently processed may affect other rows/columns, the latters * are activated for further processing. * * RETURNS * * 0 success; * * GLP_ENOPFS primal/integer infeasibility detected; * * GLP_ENODFS dual infeasibility detected. */ int npp_process_prob(NPP *npp, int hard) { /* perform basic LP/MIP processing */ NPPROW *row; NPPCOL *col; int processing, ret; /* perform initial LP/MIP processing */ npp_clean_prob(npp); /* activate all remaining rows and columns */ for (row = npp->r_head; row != NULL; row = row->next) row->temp = 1; for (col = npp->c_head; col != NULL; col = col->next) col->temp = 1; /* main processing loop */ processing = 1; while (processing) { processing = 0; /* process all active rows */ for (;;) { row = npp->r_head; if (row == NULL || !row->temp) break; npp_deactivate_row(npp, row); ret = npp_process_row(npp, row, hard); if (ret != 0) goto done; processing = 1; } /* process all active columns */ for (;;) { col = npp->c_head; if (col == NULL || !col->temp) break; npp_deactivate_col(npp, col); ret = npp_process_col(npp, col); if (ret != 0) goto done; processing = 1; } } #if 1 /* 23/XII-2009 */ if (npp->sol == GLP_MIP && !hard) { /* improve current column bounds (optional) */ for (row = npp->r_head; row != NULL; row = row->next) { if (npp_improve_bounds(npp, row, 0) < 0) { ret = GLP_ENOPFS; goto done; } } } #endif /* all seems ok */ ret = 0; done: xassert(ret == 0 || ret == GLP_ENOPFS || ret == GLP_ENODFS); #ifdef GLP_DEBUG xprintf("\n"); #endif return ret; } /**********************************************************************/ int npp_simplex(NPP *npp, const glp_smcp *parm) { /* process LP prior to applying primal/dual simplex method */ int ret; xassert(npp->sol == GLP_SOL); xassert(parm == parm); ret = npp_process_prob(npp, 0); return ret; } /**********************************************************************/ int npp_integer(NPP *npp, const glp_iocp *parm) { /* process MIP prior to applying branch-and-bound method */ NPPROW *row, *prev_row; NPPCOL *col; NPPAIJ *aij; int count, ret; xassert(npp->sol == GLP_MIP); xassert(parm == parm); /*==============================================================*/ /* perform basic MIP processing */ ret = npp_process_prob(npp, 1); if (ret != 0) goto done; /*==============================================================*/ /* binarize problem, if required */ if (parm->binarize) npp_binarize_prob(npp); /*==============================================================*/ /* identify hidden packing inequalities */ count = 0; /* new rows will be added to the end of the row list, so we go from the end to beginning of the row list */ for (row = npp->r_tail; row != NULL; row = prev_row) { prev_row = row->prev; /* skip free row */ if (row->lb == -DBL_MAX && row->ub == +DBL_MAX) continue; /* skip equality constraint */ if (row->lb == row->ub) continue; /* skip row having less than two variables */ if (row->ptr == NULL || row->ptr->r_next == NULL) continue; /* skip row having non-binary variables */ for (aij = row->ptr; aij != NULL; aij = aij->r_next) { col = aij->col; if (!(col->is_int && col->lb == 0.0 && col->ub == 1.0)) break; } if (aij != NULL) continue; count += npp_hidden_packing(npp, row); } if (count > 0) xprintf("%d hidden packing inequaliti(es) were detected\n", count); /*==============================================================*/ /* identify hidden covering inequalities */ count = 0; /* new rows will be added to the end of the row list, so we go from the end to beginning of the row list */ for (row = npp->r_tail; row != NULL; row = prev_row) { prev_row = row->prev; /* skip free row */ if (row->lb == -DBL_MAX && row->ub == +DBL_MAX) continue; /* skip equality constraint */ if (row->lb == row->ub) continue; /* skip row having less than three variables */ if (row->ptr == NULL || row->ptr->r_next == NULL || row->ptr->r_next->r_next == NULL) continue; /* skip row having non-binary variables */ for (aij = row->ptr; aij != NULL; aij = aij->r_next) { col = aij->col; if (!(col->is_int && col->lb == 0.0 && col->ub == 1.0)) break; } if (aij != NULL) continue; count += npp_hidden_covering(npp, row); } if (count > 0) xprintf("%d hidden covering inequaliti(es) were detected\n", count); /*==============================================================*/ /* reduce inequality constraint coefficients */ count = 0; /* new rows will be added to the end of the row list, so we go from the end to beginning of the row list */ for (row = npp->r_tail; row != NULL; row = prev_row) { prev_row = row->prev; /* skip equality constraint */ if (row->lb == row->ub) continue; count += npp_reduce_ineq_coef(npp, row); } if (count > 0) xprintf("%d constraint coefficient(s) were reduced\n", count); /*==============================================================*/ #ifdef GLP_DEBUG routine(npp); #endif /*==============================================================*/ /* all seems ok */ ret = 0; done: return ret; } /* eof */ glpk-5.0/src/npp/npp6.c0000644000062000006210000014420713766346220014125 0ustar maomkpasswd/* npp6.c (translate feasibility problem to CNF-SAT) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2011-2017 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "npp.h" /*********************************************************************** * npp_sat_free_row - process free (unbounded) row * * This routine processes row p, which is free (i.e. has no finite * bounds): * * -inf < sum a[p,j] x[j] < +inf. (1) * * The constraint (1) cannot be active and therefore it is redundant, * so the routine simply removes it from the original problem. */ void npp_sat_free_row(NPP *npp, NPPROW *p) { /* the row should be free */ xassert(p->lb == -DBL_MAX && p->ub == +DBL_MAX); /* remove the row from the problem */ npp_del_row(npp, p); return; } /*********************************************************************** * npp_sat_fixed_col - process fixed column * * This routine processes column q, which is fixed: * * x[q] = s[q], (1) * * where s[q] is a fixed column value. * * The routine substitutes fixed value s[q] into constraint rows and * then removes column x[q] from the original problem. * * Substitution of x[q] = s[q] into row i gives: * * L[i] <= sum a[i,j] x[j] <= U[i] ==> * j * * L[i] <= sum a[i,j] x[j] + a[i,q] x[q] <= U[i] ==> * j!=q * * L[i] <= sum a[i,j] x[j] + a[i,q] s[q] <= U[i] ==> * j!=q * * L~[i] <= sum a[i,j] x[j] <= U~[i], * j!=q * * where * * L~[i] = L[i] - a[i,q] s[q], (2) * * U~[i] = U[i] - a[i,q] s[q] (3) * * are, respectively, lower and upper bound of row i in the transformed * problem. * * On recovering solution x[q] is assigned the value of s[q]. */ struct sat_fixed_col { /* fixed column */ int q; /* column reference number for variable x[q] */ int s; /* value, at which x[q] is fixed */ }; static int rcv_sat_fixed_col(NPP *, void *); int npp_sat_fixed_col(NPP *npp, NPPCOL *q) { struct sat_fixed_col *info; NPPROW *i; NPPAIJ *aij; int temp; /* the column should be fixed */ xassert(q->lb == q->ub); /* create transformation stack entry */ info = npp_push_tse(npp, rcv_sat_fixed_col, sizeof(struct sat_fixed_col)); info->q = q->j; info->s = (int)q->lb; xassert((double)info->s == q->lb); /* substitute x[q] = s[q] into constraint rows */ if (info->s == 0) goto skip; for (aij = q->ptr; aij != NULL; aij = aij->c_next) { i = aij->row; if (i->lb != -DBL_MAX) { i->lb -= aij->val * (double)info->s; temp = (int)i->lb; if ((double)temp != i->lb) return 1; /* integer arithmetic error */ } if (i->ub != +DBL_MAX) { i->ub -= aij->val * (double)info->s; temp = (int)i->ub; if ((double)temp != i->ub) return 2; /* integer arithmetic error */ } } skip: /* remove the column from the problem */ npp_del_col(npp, q); return 0; } static int rcv_sat_fixed_col(NPP *npp, void *info_) { struct sat_fixed_col *info = info_; npp->c_value[info->q] = (double)info->s; return 0; } /*********************************************************************** * npp_sat_is_bin_comb - test if row is binary combination * * This routine tests if the specified row is a binary combination, * i.e. all its constraint coefficients are +1 and -1 and all variables * are binary. If the test was passed, the routine returns non-zero, * otherwise zero. */ int npp_sat_is_bin_comb(NPP *npp, NPPROW *row) { NPPCOL *col; NPPAIJ *aij; xassert(npp == npp); for (aij = row->ptr; aij != NULL; aij = aij->r_next) { if (!(aij->val == +1.0 || aij->val == -1.0)) return 0; /* non-unity coefficient */ col = aij->col; if (!(col->is_int && col->lb == 0.0 && col->ub == 1.0)) return 0; /* non-binary column */ } return 1; /* test was passed */ } /*********************************************************************** * npp_sat_num_pos_coef - determine number of positive coefficients * * This routine returns the number of positive coefficients in the * specified row. */ int npp_sat_num_pos_coef(NPP *npp, NPPROW *row) { NPPAIJ *aij; int num = 0; xassert(npp == npp); for (aij = row->ptr; aij != NULL; aij = aij->r_next) { if (aij->val > 0.0) num++; } return num; } /*********************************************************************** * npp_sat_num_neg_coef - determine number of negative coefficients * * This routine returns the number of negative coefficients in the * specified row. */ int npp_sat_num_neg_coef(NPP *npp, NPPROW *row) { NPPAIJ *aij; int num = 0; xassert(npp == npp); for (aij = row->ptr; aij != NULL; aij = aij->r_next) { if (aij->val < 0.0) num++; } return num; } /*********************************************************************** * npp_sat_is_cover_ineq - test if row is covering inequality * * The canonical form of a covering inequality is the following: * * sum x[j] >= 1, (1) * j in J * * where all x[j] are binary variables. * * In general case a covering inequality may have one of the following * two forms: * * sum x[j] - sum x[j] >= 1 - |J-|, (2) * j in J+ j in J- * * * sum x[j] - sum x[j] <= |J+| - 1. (3) * j in J+ j in J- * * Obviously, the inequality (2) can be transformed to the form (1) by * substitution x[j] = 1 - x'[j] for all j in J-, where x'[j] is the * negation of variable x[j]. And the inequality (3) can be transformed * to (2) by multiplying both left- and right-hand sides by -1. * * This routine returns one of the following codes: * * 0, if the specified row is not a covering inequality; * * 1, if the specified row has the form (2); * * 2, if the specified row has the form (3). */ int npp_sat_is_cover_ineq(NPP *npp, NPPROW *row) { xassert(npp == npp); if (row->lb != -DBL_MAX && row->ub == +DBL_MAX) { /* row is inequality of '>=' type */ if (npp_sat_is_bin_comb(npp, row)) { /* row is a binary combination */ if (row->lb == 1.0 - npp_sat_num_neg_coef(npp, row)) { /* row has the form (2) */ return 1; } } } else if (row->lb == -DBL_MAX && row->ub != +DBL_MAX) { /* row is inequality of '<=' type */ if (npp_sat_is_bin_comb(npp, row)) { /* row is a binary combination */ if (row->ub == npp_sat_num_pos_coef(npp, row) - 1.0) { /* row has the form (3) */ return 2; } } } /* row is not a covering inequality */ return 0; } /*********************************************************************** * npp_sat_is_pack_ineq - test if row is packing inequality * * The canonical form of a packing inequality is the following: * * sum x[j] <= 1, (1) * j in J * * where all x[j] are binary variables. * * In general case a packing inequality may have one of the following * two forms: * * sum x[j] - sum x[j] <= 1 - |J-|, (2) * j in J+ j in J- * * * sum x[j] - sum x[j] >= |J+| - 1. (3) * j in J+ j in J- * * Obviously, the inequality (2) can be transformed to the form (1) by * substitution x[j] = 1 - x'[j] for all j in J-, where x'[j] is the * negation of variable x[j]. And the inequality (3) can be transformed * to (2) by multiplying both left- and right-hand sides by -1. * * This routine returns one of the following codes: * * 0, if the specified row is not a packing inequality; * * 1, if the specified row has the form (2); * * 2, if the specified row has the form (3). */ int npp_sat_is_pack_ineq(NPP *npp, NPPROW *row) { xassert(npp == npp); if (row->lb == -DBL_MAX && row->ub != +DBL_MAX) { /* row is inequality of '<=' type */ if (npp_sat_is_bin_comb(npp, row)) { /* row is a binary combination */ if (row->ub == 1.0 - npp_sat_num_neg_coef(npp, row)) { /* row has the form (2) */ return 1; } } } else if (row->lb != -DBL_MAX && row->ub == +DBL_MAX) { /* row is inequality of '>=' type */ if (npp_sat_is_bin_comb(npp, row)) { /* row is a binary combination */ if (row->lb == npp_sat_num_pos_coef(npp, row) - 1.0) { /* row has the form (3) */ return 2; } } } /* row is not a packing inequality */ return 0; } /*********************************************************************** * npp_sat_is_partn_eq - test if row is partitioning equality * * The canonical form of a partitioning equality is the following: * * sum x[j] = 1, (1) * j in J * * where all x[j] are binary variables. * * In general case a partitioning equality may have one of the following * two forms: * * sum x[j] - sum x[j] = 1 - |J-|, (2) * j in J+ j in J- * * * sum x[j] - sum x[j] = |J+| - 1. (3) * j in J+ j in J- * * Obviously, the equality (2) can be transformed to the form (1) by * substitution x[j] = 1 - x'[j] for all j in J-, where x'[j] is the * negation of variable x[j]. And the equality (3) can be transformed * to (2) by multiplying both left- and right-hand sides by -1. * * This routine returns one of the following codes: * * 0, if the specified row is not a partitioning equality; * * 1, if the specified row has the form (2); * * 2, if the specified row has the form (3). */ int npp_sat_is_partn_eq(NPP *npp, NPPROW *row) { xassert(npp == npp); if (row->lb == row->ub) { /* row is equality constraint */ if (npp_sat_is_bin_comb(npp, row)) { /* row is a binary combination */ if (row->lb == 1.0 - npp_sat_num_neg_coef(npp, row)) { /* row has the form (2) */ return 1; } if (row->ub == npp_sat_num_pos_coef(npp, row) - 1.0) { /* row has the form (3) */ return 2; } } } /* row is not a partitioning equality */ return 0; } /*********************************************************************** * npp_sat_reverse_row - multiply both sides of row by -1 * * This routines multiplies by -1 both left- and right-hand sides of * the specified row: * * L <= sum x[j] <= U, * * that results in the following row: * * -U <= sum (-x[j]) <= -L. * * If no integer overflow occured, the routine returns zero, otherwise * non-zero. */ int npp_sat_reverse_row(NPP *npp, NPPROW *row) { NPPAIJ *aij; int temp, ret = 0; double old_lb, old_ub; xassert(npp == npp); for (aij = row->ptr; aij != NULL; aij = aij->r_next) { aij->val = -aij->val; temp = (int)aij->val; if ((double)temp != aij->val) ret = 1; } old_lb = row->lb, old_ub = row->ub; if (old_ub == +DBL_MAX) row->lb = -DBL_MAX; else { row->lb = -old_ub; temp = (int)row->lb; if ((double)temp != row->lb) ret = 2; } if (old_lb == -DBL_MAX) row->ub = +DBL_MAX; else { row->ub = -old_lb; temp = (int)row->ub; if ((double)temp != row->ub) ret = 3; } return ret; } /*********************************************************************** * npp_sat_split_pack - split packing inequality * * Let there be given a packing inequality in canonical form: * * sum t[j] <= 1, (1) * j in J * * where t[j] = x[j] or t[j] = 1 - x[j], x[j] is a binary variable. * And let J = J1 U J2 is a partition of the set of literals. Then the * inequality (1) is obviously equivalent to the following two packing * inequalities: * * sum t[j] <= y <--> sum t[j] + (1 - y) <= 1, (2) * j in J1 j in J1 * * sum t[j] <= 1 - y <--> sum t[j] + y <= 1, (3) * j in J2 j in J2 * * where y is a new binary variable added to the transformed problem. * * Assuming that the specified row is a packing inequality (1), this * routine constructs the set J1 by including there first nlit literals * (terms) from the specified row, and the set J2 = J \ J1. Then the * routine creates a new row, which corresponds to inequality (2), and * replaces the specified row with inequality (3). */ NPPROW *npp_sat_split_pack(NPP *npp, NPPROW *row, int nlit) { NPPROW *rrr; NPPCOL *col; NPPAIJ *aij; int k; /* original row should be packing inequality (1) */ xassert(npp_sat_is_pack_ineq(npp, row) == 1); /* and nlit should be less than the number of literals (terms) in the original row */ xassert(0 < nlit && nlit < npp_row_nnz(npp, row)); /* create new row corresponding to inequality (2) */ rrr = npp_add_row(npp); rrr->lb = -DBL_MAX, rrr->ub = 1.0; /* move first nlit literals (terms) from the original row to the new row; the original row becomes inequality (3) */ for (k = 1; k <= nlit; k++) { aij = row->ptr; xassert(aij != NULL); /* add literal to the new row */ npp_add_aij(npp, rrr, aij->col, aij->val); /* correct rhs */ if (aij->val < 0.0) rrr->ub -= 1.0, row->ub += 1.0; /* remove literal from the original row */ npp_del_aij(npp, aij); } /* create new binary variable y */ col = npp_add_col(npp); col->is_int = 1, col->lb = 0.0, col->ub = 1.0; /* include literal (1 - y) in the new row */ npp_add_aij(npp, rrr, col, -1.0); rrr->ub -= 1.0; /* include literal y in the original row */ npp_add_aij(npp, row, col, +1.0); return rrr; } /*********************************************************************** * npp_sat_encode_pack - encode packing inequality * * Given a packing inequality in canonical form: * * sum t[j] <= 1, (1) * j in J * * where t[j] = x[j] or t[j] = 1 - x[j], x[j] is a binary variable, * this routine translates it to CNF by replacing it with the following * equivalent set of edge packing inequalities: * * t[j] + t[k] <= 1 for all j, k in J, j != k. (2) * * Then the routine transforms each edge packing inequality (2) to * corresponding covering inequality (that encodes two-literal clause) * by multiplying both its part by -1: * * - t[j] - t[k] >= -1 <--> (1 - t[j]) + (1 - t[k]) >= 1. (3) * * On exit the routine removes the original row from the problem. */ void npp_sat_encode_pack(NPP *npp, NPPROW *row) { NPPROW *rrr; NPPAIJ *aij, *aik; /* original row should be packing inequality (1) */ xassert(npp_sat_is_pack_ineq(npp, row) == 1); /* create equivalent system of covering inequalities (3) */ for (aij = row->ptr; aij != NULL; aij = aij->r_next) { /* due to symmetry only one of inequalities t[j] + t[k] <= 1 and t[k] <= t[j] <= 1 can be considered */ for (aik = aij->r_next; aik != NULL; aik = aik->r_next) { /* create edge packing inequality (2) */ rrr = npp_add_row(npp); rrr->lb = -DBL_MAX, rrr->ub = 1.0; npp_add_aij(npp, rrr, aij->col, aij->val); if (aij->val < 0.0) rrr->ub -= 1.0; npp_add_aij(npp, rrr, aik->col, aik->val); if (aik->val < 0.0) rrr->ub -= 1.0; /* and transform it to covering inequality (3) */ npp_sat_reverse_row(npp, rrr); xassert(npp_sat_is_cover_ineq(npp, rrr) == 1); } } /* remove the original row from the problem */ npp_del_row(npp, row); return; } /*********************************************************************** * npp_sat_encode_sum2 - encode 2-bit summation * * Given a set containing two literals x and y this routine encodes * the equality * * x + y = s + 2 * c, (1) * * where * * s = (x + y) % 2 (2) * * is a binary variable modeling the low sum bit, and * * c = (x + y) / 2 (3) * * is a binary variable modeling the high (carry) sum bit. */ void npp_sat_encode_sum2(NPP *npp, NPPLSE *set, NPPSED *sed) { NPPROW *row; int x, y, s, c; /* the set should contain exactly two literals */ xassert(set != NULL); xassert(set->next != NULL); xassert(set->next->next == NULL); sed->x = set->lit; xassert(sed->x.neg == 0 || sed->x.neg == 1); sed->y = set->next->lit; xassert(sed->y.neg == 0 || sed->y.neg == 1); sed->z.col = NULL, sed->z.neg = 0; /* perform encoding s = (x + y) % 2 */ sed->s = npp_add_col(npp); sed->s->is_int = 1, sed->s->lb = 0.0, sed->s->ub = 1.0; for (x = 0; x <= 1; x++) { for (y = 0; y <= 1; y++) { for (s = 0; s <= 1; s++) { if ((x + y) % 2 != s) { /* generate CNF clause to disable infeasible combination */ row = npp_add_row(npp); row->lb = 1.0, row->ub = +DBL_MAX; if (x == sed->x.neg) npp_add_aij(npp, row, sed->x.col, +1.0); else { npp_add_aij(npp, row, sed->x.col, -1.0); row->lb -= 1.0; } if (y == sed->y.neg) npp_add_aij(npp, row, sed->y.col, +1.0); else { npp_add_aij(npp, row, sed->y.col, -1.0); row->lb -= 1.0; } if (s == 0) npp_add_aij(npp, row, sed->s, +1.0); else { npp_add_aij(npp, row, sed->s, -1.0); row->lb -= 1.0; } } } } } /* perform encoding c = (x + y) / 2 */ sed->c = npp_add_col(npp); sed->c->is_int = 1, sed->c->lb = 0.0, sed->c->ub = 1.0; for (x = 0; x <= 1; x++) { for (y = 0; y <= 1; y++) { for (c = 0; c <= 1; c++) { if ((x + y) / 2 != c) { /* generate CNF clause to disable infeasible combination */ row = npp_add_row(npp); row->lb = 1.0, row->ub = +DBL_MAX; if (x == sed->x.neg) npp_add_aij(npp, row, sed->x.col, +1.0); else { npp_add_aij(npp, row, sed->x.col, -1.0); row->lb -= 1.0; } if (y == sed->y.neg) npp_add_aij(npp, row, sed->y.col, +1.0); else { npp_add_aij(npp, row, sed->y.col, -1.0); row->lb -= 1.0; } if (c == 0) npp_add_aij(npp, row, sed->c, +1.0); else { npp_add_aij(npp, row, sed->c, -1.0); row->lb -= 1.0; } } } } } return; } /*********************************************************************** * npp_sat_encode_sum3 - encode 3-bit summation * * Given a set containing at least three literals this routine chooses * some literals x, y, z from that set and encodes the equality * * x + y + z = s + 2 * c, (1) * * where * * s = (x + y + z) % 2 (2) * * is a binary variable modeling the low sum bit, and * * c = (x + y + z) / 2 (3) * * is a binary variable modeling the high (carry) sum bit. */ void npp_sat_encode_sum3(NPP *npp, NPPLSE *set, NPPSED *sed) { NPPROW *row; int x, y, z, s, c; /* the set should contain at least three literals */ xassert(set != NULL); xassert(set->next != NULL); xassert(set->next->next != NULL); sed->x = set->lit; xassert(sed->x.neg == 0 || sed->x.neg == 1); sed->y = set->next->lit; xassert(sed->y.neg == 0 || sed->y.neg == 1); sed->z = set->next->next->lit; xassert(sed->z.neg == 0 || sed->z.neg == 1); /* perform encoding s = (x + y + z) % 2 */ sed->s = npp_add_col(npp); sed->s->is_int = 1, sed->s->lb = 0.0, sed->s->ub = 1.0; for (x = 0; x <= 1; x++) { for (y = 0; y <= 1; y++) { for (z = 0; z <= 1; z++) { for (s = 0; s <= 1; s++) { if ((x + y + z) % 2 != s) { /* generate CNF clause to disable infeasible combination */ row = npp_add_row(npp); row->lb = 1.0, row->ub = +DBL_MAX; if (x == sed->x.neg) npp_add_aij(npp, row, sed->x.col, +1.0); else { npp_add_aij(npp, row, sed->x.col, -1.0); row->lb -= 1.0; } if (y == sed->y.neg) npp_add_aij(npp, row, sed->y.col, +1.0); else { npp_add_aij(npp, row, sed->y.col, -1.0); row->lb -= 1.0; } if (z == sed->z.neg) npp_add_aij(npp, row, sed->z.col, +1.0); else { npp_add_aij(npp, row, sed->z.col, -1.0); row->lb -= 1.0; } if (s == 0) npp_add_aij(npp, row, sed->s, +1.0); else { npp_add_aij(npp, row, sed->s, -1.0); row->lb -= 1.0; } } } } } } /* perform encoding c = (x + y + z) / 2 */ sed->c = npp_add_col(npp); sed->c->is_int = 1, sed->c->lb = 0.0, sed->c->ub = 1.0; for (x = 0; x <= 1; x++) { for (y = 0; y <= 1; y++) { for (z = 0; z <= 1; z++) { for (c = 0; c <= 1; c++) { if ((x + y + z) / 2 != c) { /* generate CNF clause to disable infeasible combination */ row = npp_add_row(npp); row->lb = 1.0, row->ub = +DBL_MAX; if (x == sed->x.neg) npp_add_aij(npp, row, sed->x.col, +1.0); else { npp_add_aij(npp, row, sed->x.col, -1.0); row->lb -= 1.0; } if (y == sed->y.neg) npp_add_aij(npp, row, sed->y.col, +1.0); else { npp_add_aij(npp, row, sed->y.col, -1.0); row->lb -= 1.0; } if (z == sed->z.neg) npp_add_aij(npp, row, sed->z.col, +1.0); else { npp_add_aij(npp, row, sed->z.col, -1.0); row->lb -= 1.0; } if (c == 0) npp_add_aij(npp, row, sed->c, +1.0); else { npp_add_aij(npp, row, sed->c, -1.0); row->lb -= 1.0; } } } } } } return; } /*********************************************************************** * npp_sat_encode_sum_ax - encode linear combination of 0-1 variables * * PURPOSE * * Given a linear combination of binary variables: * * sum a[j] x[j], (1) * j * * which is the linear form of the specified row, this routine encodes * (i.e. translates to CNF) the following equality: * * n * sum |a[j]| t[j] = sum 2**(k-1) * y[k], (2) * j k=1 * * where t[j] = x[j] (if a[j] > 0) or t[j] = 1 - x[j] (if a[j] < 0), * and y[k] is either t[j] or a new literal created by the routine or * a constant zero. Note that the sum in the right-hand side of (2) can * be thought as a n-bit representation of the sum in the left-hand * side, which is a non-negative integer number. * * ALGORITHM * * First, the number of bits, n, sufficient to represent any value in * the left-hand side of (2) is determined. Obviously, n is the number * of bits sufficient to represent the sum (sum |a[j]|). * * Let * * n * |a[j]| = sum 2**(k-1) b[j,k], (3) * k=1 * * where b[j,k] is k-th bit in a n-bit representation of |a[j]|. Then * * m n * sum |a[j]| * t[j] = sum 2**(k-1) sum b[j,k] * t[j]. (4) * j k=1 j=1 * * Introducing the set * * J[k] = { j : b[j,k] = 1 } (5) * * allows rewriting (4) as follows: * * n * sum |a[j]| * t[j] = sum 2**(k-1) sum t[j]. (6) * j k=1 j in J[k] * * Thus, our goal is to provide |J[k]| <= 1 for all k, in which case * we will have the representation (1). * * Let |J[k]| = 2, i.e. J[k] has exactly two literals u and v. In this * case we can apply the following transformation: * * u + v = s + 2 * c, (7) * * where s and c are, respectively, low (sum) and high (carry) bits of * the sum of two bits. This allows to replace two literals u and v in * J[k] by one literal s, and carry out literal c to J[k+1]. * * If |J[k]| >= 3, i.e. J[k] has at least three literals u, v, and w, * we can apply the following transformation: * * u + v + w = s + 2 * c. (8) * * Again, literal s replaces literals u, v, and w in J[k], and literal * c goes into J[k+1]. * * On exit the routine stores each literal from J[k] in element y[k], * 1 <= k <= n. If J[k] is empty, y[k] is set to constant false. * * RETURNS * * The routine returns n, the number of literals in the right-hand side * of (2), 0 <= n <= NBIT_MAX. If the sum (sum |a[j]|) is too large, so * more than NBIT_MAX (= 31) literals are needed to encode the original * linear combination, the routine returns a negative value. */ #define NBIT_MAX 31 /* maximal number of literals in the right hand-side of (2) */ static NPPLSE *remove_lse(NPP *npp, NPPLSE *set, NPPCOL *col) { /* remove specified literal from specified literal set */ NPPLSE *lse, *prev = NULL; for (lse = set; lse != NULL; prev = lse, lse = lse->next) if (lse->lit.col == col) break; xassert(lse != NULL); if (prev == NULL) set = lse->next; else prev->next = lse->next; dmp_free_atom(npp->pool, lse, sizeof(NPPLSE)); return set; } int npp_sat_encode_sum_ax(NPP *npp, NPPROW *row, NPPLIT y[]) { NPPAIJ *aij; NPPLSE *set[1+NBIT_MAX], *lse; NPPSED sed; int k, n, temp; double sum; /* compute the sum (sum |a[j]|) */ sum = 0.0; for (aij = row->ptr; aij != NULL; aij = aij->r_next) sum += fabs(aij->val); /* determine n, the number of bits in the sum */ temp = (int)sum; if ((double)temp != sum) return -1; /* integer arithmetic error */ for (n = 0; temp > 0; n++, temp >>= 1); xassert(0 <= n && n <= NBIT_MAX); /* build initial sets J[k], 1 <= k <= n; see (5) */ /* set[k] is a pointer to the list of literals in J[k] */ for (k = 1; k <= n; k++) set[k] = NULL; for (aij = row->ptr; aij != NULL; aij = aij->r_next) { temp = (int)fabs(aij->val); xassert((int)temp == fabs(aij->val)); for (k = 1; temp > 0; k++, temp >>= 1) { if (temp & 1) { xassert(k <= n); lse = dmp_get_atom(npp->pool, sizeof(NPPLSE)); lse->lit.col = aij->col; lse->lit.neg = (aij->val > 0.0 ? 0 : 1); lse->next = set[k]; set[k] = lse; } } } /* main transformation loop */ for (k = 1; k <= n; k++) { /* reduce J[k] and set y[k] */ for (;;) { if (set[k] == NULL) { /* J[k] is empty */ /* set y[k] to constant false */ y[k].col = NULL, y[k].neg = 0; break; } if (set[k]->next == NULL) { /* J[k] contains one literal */ /* set y[k] to that literal */ y[k] = set[k]->lit; dmp_free_atom(npp->pool, set[k], sizeof(NPPLSE)); break; } if (set[k]->next->next == NULL) { /* J[k] contains two literals */ /* apply transformation (7) */ npp_sat_encode_sum2(npp, set[k], &sed); } else { /* J[k] contains at least three literals */ /* apply transformation (8) */ npp_sat_encode_sum3(npp, set[k], &sed); /* remove third literal from set[k] */ set[k] = remove_lse(npp, set[k], sed.z.col); } /* remove second literal from set[k] */ set[k] = remove_lse(npp, set[k], sed.y.col); /* remove first literal from set[k] */ set[k] = remove_lse(npp, set[k], sed.x.col); /* include new literal s to set[k] */ lse = dmp_get_atom(npp->pool, sizeof(NPPLSE)); lse->lit.col = sed.s, lse->lit.neg = 0; lse->next = set[k]; set[k] = lse; /* include new literal c to set[k+1] */ xassert(k < n); /* FIXME: can "overflow" happen? */ lse = dmp_get_atom(npp->pool, sizeof(NPPLSE)); lse->lit.col = sed.c, lse->lit.neg = 0; lse->next = set[k+1]; set[k+1] = lse; } } return n; } /*********************************************************************** * npp_sat_normalize_clause - normalize clause * * This routine normalizes the specified clause, which is a disjunction * of literals, by replacing multiple literals, which refer to the same * binary variable, with a single literal. * * On exit the routine returns the number of literals in the resulting * clause. However, if the specified clause includes both a literal and * its negation, the routine returns a negative value meaning that the * clause is equivalent to the value true. */ int npp_sat_normalize_clause(NPP *npp, int size, NPPLIT lit[]) { int j, k, new_size; xassert(npp == npp); xassert(size >= 0); new_size = 0; for (k = 1; k <= size; k++) { for (j = 1; j <= new_size; j++) { if (lit[k].col == lit[j].col) { /* lit[k] refers to the same variable as lit[j], which is already included in the resulting clause */ if (lit[k].neg == lit[j].neg) { /* ignore lit[k] due to the idempotent law */ goto skip; } else { /* lit[k] is NOT lit[j]; the clause is equivalent to the value true */ return -1; } } } /* include lit[k] in the resulting clause */ lit[++new_size] = lit[k]; skip: ; } return new_size; } /*********************************************************************** * npp_sat_encode_clause - translate clause to cover inequality * * Given a clause * * OR t[j], (1) * j in J * * where t[j] is a literal, i.e. t[j] = x[j] or t[j] = NOT x[j], this * routine translates it to the following equivalent cover inequality, * which is added to the transformed problem: * * sum t[j] >= 1, (2) * j in J * * where t[j] = x[j] or t[j] = 1 - x[j]. * * If necessary, the clause should be normalized before a call to this * routine. */ NPPROW *npp_sat_encode_clause(NPP *npp, int size, NPPLIT lit[]) { NPPROW *row; int k; xassert(size >= 1); row = npp_add_row(npp); row->lb = 1.0, row->ub = +DBL_MAX; for (k = 1; k <= size; k++) { xassert(lit[k].col != NULL); if (lit[k].neg == 0) npp_add_aij(npp, row, lit[k].col, +1.0); else if (lit[k].neg == 1) { npp_add_aij(npp, row, lit[k].col, -1.0); row->lb -= 1.0; } else xassert(lit != lit); } return row; } /*********************************************************************** * npp_sat_encode_geq - encode "not less than" constraint * * PURPOSE * * This routine translates to CNF the following constraint: * * n * sum 2**(k-1) * y[k] >= b, (1) * k=1 * * where y[k] is either a literal (i.e. y[k] = x[k] or y[k] = 1 - x[k]) * or constant false (zero), b is a given lower bound. * * ALGORITHM * * If b < 0, the constraint is redundant, so assume that b >= 0. Let * * n * b = sum 2**(k-1) b[k], (2) * k=1 * * where b[k] is k-th binary digit of b. (Note that if b >= 2**n and * therefore cannot be represented in the form (2), the constraint (1) * is infeasible.) In this case the condition (1) is equivalent to the * following condition: * * y[n] y[n-1] ... y[2] y[1] >= b[n] b[n-1] ... b[2] b[1], (3) * * where ">=" is understood lexicographically. * * Algorithmically the condition (3) can be tested as follows: * * for (k = n; k >= 1; k--) * { if (y[k] < b[k]) * y is less than b; * if (y[k] > b[k]) * y is greater than b; * } * y is equal to b; * * Thus, y is less than b iff there exists k, 1 <= k <= n, for which * the following condition is satisfied: * * y[n] = b[n] AND ... AND y[k+1] = b[k+1] AND y[k] < b[k]. (4) * * Negating the condition (4) we have that y is not less than b iff for * all k, 1 <= k <= n, the following condition is satisfied: * * y[n] != b[n] OR ... OR y[k+1] != b[k+1] OR y[k] >= b[k]. (5) * * Note that if b[k] = 0, the literal y[k] >= b[k] is always true, in * which case the entire clause (5) is true and can be omitted. * * RETURNS * * Normally the routine returns zero. However, if the constraint (1) is * infeasible, the routine returns non-zero. */ int npp_sat_encode_geq(NPP *npp, int n, NPPLIT y[], int rhs) { NPPLIT lit[1+NBIT_MAX]; int j, k, size, temp, b[1+NBIT_MAX]; xassert(0 <= n && n <= NBIT_MAX); /* if the constraint (1) is redundant, do nothing */ if (rhs < 0) return 0; /* determine binary digits of b according to (2) */ for (k = 1, temp = rhs; k <= n; k++, temp >>= 1) b[k] = temp & 1; if (temp != 0) { /* b >= 2**n; the constraint (1) is infeasible */ return 1; } /* main transformation loop */ for (k = 1; k <= n; k++) { /* build the clause (5) for current k */ size = 0; /* clause size = number of literals */ /* add literal y[k] >= b[k] */ if (b[k] == 0) { /* b[k] = 0 -> the literal is true */ goto skip; } else if (y[k].col == NULL) { /* y[k] = 0, b[k] = 1 -> the literal is false */ xassert(y[k].neg == 0); } else { /* add literal y[k] = 1 */ lit[++size] = y[k]; } for (j = k+1; j <= n; j++) { /* add literal y[j] != b[j] */ if (y[j].col == NULL) { xassert(y[j].neg == 0); if (b[j] == 0) { /* y[j] = 0, b[j] = 0 -> the literal is false */ continue; } else { /* y[j] = 0, b[j] = 1 -> the literal is true */ goto skip; } } else { lit[++size] = y[j]; if (b[j] != 0) lit[size].neg = 1 - lit[size].neg; } } /* normalize the clause */ size = npp_sat_normalize_clause(npp, size, lit); if (size < 0) { /* the clause is equivalent to the value true */ goto skip; } if (size == 0) { /* the clause is equivalent to the value false; this means that the constraint (1) is infeasible */ return 2; } /* translate the clause to corresponding cover inequality */ npp_sat_encode_clause(npp, size, lit); skip: ; } return 0; } /*********************************************************************** * npp_sat_encode_leq - encode "not greater than" constraint * * PURPOSE * * This routine translates to CNF the following constraint: * * n * sum 2**(k-1) * y[k] <= b, (1) * k=1 * * where y[k] is either a literal (i.e. y[k] = x[k] or y[k] = 1 - x[k]) * or constant false (zero), b is a given upper bound. * * ALGORITHM * * If b < 0, the constraint is infeasible, so assume that b >= 0. Let * * n * b = sum 2**(k-1) b[k], (2) * k=1 * * where b[k] is k-th binary digit of b. (Note that if b >= 2**n and * therefore cannot be represented in the form (2), the constraint (1) * is redundant.) In this case the condition (1) is equivalent to the * following condition: * * y[n] y[n-1] ... y[2] y[1] <= b[n] b[n-1] ... b[2] b[1], (3) * * where "<=" is understood lexicographically. * * Algorithmically the condition (3) can be tested as follows: * * for (k = n; k >= 1; k--) * { if (y[k] < b[k]) * y is less than b; * if (y[k] > b[k]) * y is greater than b; * } * y is equal to b; * * Thus, y is greater than b iff there exists k, 1 <= k <= n, for which * the following condition is satisfied: * * y[n] = b[n] AND ... AND y[k+1] = b[k+1] AND y[k] > b[k]. (4) * * Negating the condition (4) we have that y is not greater than b iff * for all k, 1 <= k <= n, the following condition is satisfied: * * y[n] != b[n] OR ... OR y[k+1] != b[k+1] OR y[k] <= b[k]. (5) * * Note that if b[k] = 1, the literal y[k] <= b[k] is always true, in * which case the entire clause (5) is true and can be omitted. * * RETURNS * * Normally the routine returns zero. However, if the constraint (1) is * infeasible, the routine returns non-zero. */ int npp_sat_encode_leq(NPP *npp, int n, NPPLIT y[], int rhs) { NPPLIT lit[1+NBIT_MAX]; int j, k, size, temp, b[1+NBIT_MAX]; xassert(0 <= n && n <= NBIT_MAX); /* check if the constraint (1) is infeasible */ if (rhs < 0) return 1; /* determine binary digits of b according to (2) */ for (k = 1, temp = rhs; k <= n; k++, temp >>= 1) b[k] = temp & 1; if (temp != 0) { /* b >= 2**n; the constraint (1) is redundant */ return 0; } /* main transformation loop */ for (k = 1; k <= n; k++) { /* build the clause (5) for current k */ size = 0; /* clause size = number of literals */ /* add literal y[k] <= b[k] */ if (b[k] == 1) { /* b[k] = 1 -> the literal is true */ goto skip; } else if (y[k].col == NULL) { /* y[k] = 0, b[k] = 0 -> the literal is true */ xassert(y[k].neg == 0); goto skip; } else { /* add literal y[k] = 0 */ lit[++size] = y[k]; lit[size].neg = 1 - lit[size].neg; } for (j = k+1; j <= n; j++) { /* add literal y[j] != b[j] */ if (y[j].col == NULL) { xassert(y[j].neg == 0); if (b[j] == 0) { /* y[j] = 0, b[j] = 0 -> the literal is false */ continue; } else { /* y[j] = 0, b[j] = 1 -> the literal is true */ goto skip; } } else { lit[++size] = y[j]; if (b[j] != 0) lit[size].neg = 1 - lit[size].neg; } } /* normalize the clause */ size = npp_sat_normalize_clause(npp, size, lit); if (size < 0) { /* the clause is equivalent to the value true */ goto skip; } if (size == 0) { /* the clause is equivalent to the value false; this means that the constraint (1) is infeasible */ return 2; } /* translate the clause to corresponding cover inequality */ npp_sat_encode_clause(npp, size, lit); skip: ; } return 0; } /*********************************************************************** * npp_sat_encode_row - encode constraint (row) of general type * * PURPOSE * * This routine translates to CNF the following constraint (row): * * L <= sum a[j] x[j] <= U, (1) * j * * where all x[j] are binary variables. * * ALGORITHM * * First, the routine performs substitution x[j] = t[j] for j in J+ * and x[j] = 1 - t[j] for j in J-, where J+ = { j : a[j] > 0 } and * J- = { j : a[j] < 0 }. This gives: * * L <= sum a[j] t[j] + sum a[j] (1 - t[j]) <= U ==> * j in J+ j in J- * * L' <= sum |a[j]| t[j] <= U', (2) * j * * where * * L' = L - sum a[j], U' = U - sum a[j]. (3) * j in J- j in J- * * (Actually only new bounds L' and U' are computed.) * * Then the routine translates to CNF the following equality: * * n * sum |a[j]| t[j] = sum 2**(k-1) * y[k], (4) * j k=1 * * where y[k] is either some t[j] or a new literal or a constant zero * (see the routine npp_sat_encode_sum_ax). * * Finally, the routine translates to CNF the following conditions: * * n * sum 2**(k-1) * y[k] >= L' (5) * k=1 * * and * * n * sum 2**(k-1) * y[k] <= U' (6) * k=1 * * (see the routines npp_sat_encode_geq and npp_sat_encode_leq). * * All resulting clauses are encoded as cover inequalities and included * into the transformed problem. * * Note that on exit the routine removes the specified constraint (row) * from the original problem. * * RETURNS * * The routine returns one of the following codes: * * 0 - translation was successful; * 1 - constraint (1) was found infeasible; * 2 - integer arithmetic error occured. */ int npp_sat_encode_row(NPP *npp, NPPROW *row) { NPPAIJ *aij; NPPLIT y[1+NBIT_MAX]; int n, rhs; double lb, ub; /* the row should not be free */ xassert(!(row->lb == -DBL_MAX && row->ub == +DBL_MAX)); /* compute new bounds L' and U' (3) */ lb = row->lb; ub = row->ub; for (aij = row->ptr; aij != NULL; aij = aij->r_next) { if (aij->val < 0.0) { if (lb != -DBL_MAX) lb -= aij->val; if (ub != -DBL_MAX) ub -= aij->val; } } /* encode the equality (4) */ n = npp_sat_encode_sum_ax(npp, row, y); if (n < 0) return 2; /* integer arithmetic error */ /* encode the condition (5) */ if (lb != -DBL_MAX) { rhs = (int)lb; if ((double)rhs != lb) return 2; /* integer arithmetic error */ if (npp_sat_encode_geq(npp, n, y, rhs) != 0) return 1; /* original constraint is infeasible */ } /* encode the condition (6) */ if (ub != +DBL_MAX) { rhs = (int)ub; if ((double)rhs != ub) return 2; /* integer arithmetic error */ if (npp_sat_encode_leq(npp, n, y, rhs) != 0) return 1; /* original constraint is infeasible */ } /* remove the specified row from the problem */ npp_del_row(npp, row); return 0; } /*********************************************************************** * npp_sat_encode_prob - encode 0-1 feasibility problem * * This routine translates the specified 0-1 feasibility problem to an * equivalent SAT-CNF problem. * * N.B. Currently this is a very crude implementation. * * RETURNS * * 0 success; * * GLP_ENOPFS primal/integer infeasibility detected; * * GLP_ERANGE integer overflow occured. */ int npp_sat_encode_prob(NPP *npp) { NPPROW *row, *next_row, *prev_row; NPPCOL *col, *next_col; int cover = 0, pack = 0, partn = 0, ret; /* process and remove free rows */ for (row = npp->r_head; row != NULL; row = next_row) { next_row = row->next; if (row->lb == -DBL_MAX && row->ub == +DBL_MAX) npp_sat_free_row(npp, row); } /* process and remove fixed columns */ for (col = npp->c_head; col != NULL; col = next_col) { next_col = col->next; if (col->lb == col->ub) xassert(npp_sat_fixed_col(npp, col) == 0); } /* only binary variables should remain */ for (col = npp->c_head; col != NULL; col = col->next) xassert(col->is_int && col->lb == 0.0 && col->ub == 1.0); /* new rows may be added to the end of the row list, so we walk from the end to beginning of the list */ for (row = npp->r_tail; row != NULL; row = prev_row) { prev_row = row->prev; /* process special cases */ ret = npp_sat_is_cover_ineq(npp, row); if (ret != 0) { /* row is covering inequality */ cover++; /* since it already encodes a clause, just transform it to canonical form */ if (ret == 2) { xassert(npp_sat_reverse_row(npp, row) == 0); ret = npp_sat_is_cover_ineq(npp, row); } xassert(ret == 1); continue; } ret = npp_sat_is_partn_eq(npp, row); if (ret != 0) { /* row is partitioning equality */ NPPROW *cov; NPPAIJ *aij; partn++; /* transform it to canonical form */ if (ret == 2) { xassert(npp_sat_reverse_row(npp, row) == 0); ret = npp_sat_is_partn_eq(npp, row); } xassert(ret == 1); /* and split it into covering and packing inequalities, both in canonical forms */ cov = npp_add_row(npp); cov->lb = row->lb, cov->ub = +DBL_MAX; for (aij = row->ptr; aij != NULL; aij = aij->r_next) npp_add_aij(npp, cov, aij->col, aij->val); xassert(npp_sat_is_cover_ineq(npp, cov) == 1); /* the cover inequality already encodes a clause and do not need any further processing */ row->lb = -DBL_MAX; xassert(npp_sat_is_pack_ineq(npp, row) == 1); /* the packing inequality will be processed below */ pack--; } ret = npp_sat_is_pack_ineq(npp, row); if (ret != 0) { /* row is packing inequality */ NPPROW *rrr; int nlit, desired_nlit = 4; pack++; /* transform it to canonical form */ if (ret == 2) { xassert(npp_sat_reverse_row(npp, row) == 0); ret = npp_sat_is_pack_ineq(npp, row); } xassert(ret == 1); /* process the packing inequality */ for (;;) { /* determine the number of literals in the remaining inequality */ nlit = npp_row_nnz(npp, row); if (nlit <= desired_nlit) break; /* split the current inequality into one having not more than desired_nlit literals and remaining one */ rrr = npp_sat_split_pack(npp, row, desired_nlit-1); /* translate the former inequality to CNF and remove it from the original problem */ npp_sat_encode_pack(npp, rrr); } /* translate the remaining inequality to CNF and remove it from the original problem */ npp_sat_encode_pack(npp, row); continue; } /* translate row of general type to CNF and remove it from the original problem */ ret = npp_sat_encode_row(npp, row); if (ret == 0) ; else if (ret == 1) ret = GLP_ENOPFS; else if (ret == 2) ret = GLP_ERANGE; else xassert(ret != ret); if (ret != 0) goto done; } ret = 0; if (cover != 0) xprintf("%d covering inequalities\n", cover); if (pack != 0) xprintf("%d packing inequalities\n", pack); if (partn != 0) xprintf("%d partitioning equalities\n", partn); done: return ret; } /* eof */ glpk-5.0/src/proxy/0000755000062000006210000000000013766346220013452 5ustar maomkpasswdglpk-5.0/src/proxy/main.c0000644000062000006210000000405713766346220014550 0ustar maomkpasswd/* Last update: 08-May-2013 */ #include #include #include #include "glpk.h" #include "proxy.h" /**********************************************************************/ int main(int argc, char **argv) /**********************************************************************/ { glp_prob *lp; int ncols, status; double *initsol, zstar, *xstar; /* check arguments */ if ( (argc == 1) || (argc > 3) ) { printf("ERROR: Usage: ts <(possibly) xml initsols>\n" ); exit(1); } /* creating the problem */ lp = glp_create_prob(); glp_set_prob_name(lp, "Proxy"); /* reading the problem */ glp_term_out(GLP_OFF); #if 0 /* by mao */ status = glp_read_lp(lp, NULL, argv[1]); #else status = glp_read_mps(lp, GLP_MPS_FILE, NULL, argv[1]); #endif glp_term_out(GLP_ON); if ( status ) { printf("Problem %s does not exist!!!, status %d\n", argv[1], status); exit(1); } ncols = glp_get_num_cols(lp); initsol = (double *) calloc(ncols+1, sizeof(double)); if (argc == 3) { FILE *fp=fopen(argv[2],"r"); char tmp[256]={0x0}; int counter = 1; while(fp!=NULL && fgets(tmp, sizeof(tmp),fp)!=NULL) { char *valini = strstr(tmp, "value"); if (valini!=NULL){ int num; double dnum; valini +=7; sscanf(valini, "%d%*s",&num); dnum = (double)num; initsol[counter] = dnum; counter++; } } fclose(fp); } xstar = (double *) calloc(ncols+1, sizeof(double)); if (argc == 3) { status = proxy(lp, &zstar, xstar, initsol, 0.0, 0, 1); } else { status = proxy(lp, &zstar, xstar, NULL, 0.0, 0, 1); } printf("Status = %d; ZSTAR = %f\n",status,zstar); /* int i; for (i=1; i< ncols+1; i++) { printf("XSTAR[%d] = %f\n",i, xstar[i]); } */ glp_delete_prob(lp); return 0; } glpk-5.0/src/proxy/proxy.c0000644000062000006210000010370313766346220015003 0ustar maomkpasswd/* proxy.c (proximity search heuristic algorithm) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2013, 2016 Free Software Foundation, Inc. * Written by Giorgio Sartor <0gioker0@gmail.com>. * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . * ************************************************************************ * * THIS CODE IS AN IMPLEMENTATION OF THE ALGORITHM PROPOSED IN * * M. Fischetti, M. Monaci, * "Proximity Search for 0-1 Mixed-Integer Convex Programming" * Technical Report DEI, University of Padua, March 2013. * * AVAILABLE AT * http://www.dei.unipd.it/~fisch/papers/proximity_search.pdf * * THE CODE HAS BEEN WRITTEN BY GIORGIO SARTOR, " 0gioker0@gmail.com " * * BASIC IDEA: * * The initial feasible solution x_tilde is defined. This initial * solution can be found by an ad-hoc heuristic and proxy can be used to * refine it by exploiting an underlying MIP model whose solution from * scratch turned out to be problematic. Otherwise, x_tilde can be found * by running the GLPK mip solver until a first feasible solution is * found, setting a conservative time limit of 10 minutes (by default). * Time limit can be modified passing variable tlim [ms]. * * Then the cutoff tolerance "delta" is defined. The default tolerance * is 1% of the last feasible solution obj value--rounded to integer if * all the variables and obj coefficients are integer. * * Next, the objective function c' x is replaced by the Hamming distance * between x (the actual obj coefficients) and x_tilde (the given * solution). Distance is only computed wrt the binary variables. * * The GLPK solver is then invoked to hopefully find a new incumbent * x_star with cost c' x_star <= c' x_tilde - delta. A crucial property * here is that the root-node solution of the LP relaxation is expected * to be not too different from x_tilde, as this latter solution would * be optimal without the cutoff constraint, that for a small delta can * typically be fulfilled with just local adjustments. * * If no new solution x_star is found within the time limit the * algorithm stops. Of course, if the MIP solver proved infeasibility * for the given delta, we have that c' x_tilde - delta is a valid lower * bound (in case of minimazation) on the optimal value of the original * MIP. * * The new solution x_star, if any, is possibly improved by solving a * simplified problem (refinement) where all binary variables have been * fixed to their value in x_star so as to find the best solution within * the neighborhood. * * Finally, the approach is reapplied on x_star (that replaces x_tilde) * so as to recenter the distance Hamming function and by modifying the * cutoff tolerance delta. * * In this way, there will be a series of hopefully not-too-difficult * sub-MIPs to solve, each leading to an improvement of the incumbent. * More aggressive policies on the definition of tolerance delta can * lead to a better performance, but would require an ad-hoc tuning. * ************************************************************************ * * int proxy(glp_prob *lp, double *zstar, double *xstar, * const double[] initsol, double rel_impr, int tlim, * int verbose) * * lp : GLPK problem pointer to a MIP with binary variables * * zstar : the value of objective function of the best solution found * * xstar : best solution with components xstar[1],...,xstar[ncols] * * initsol : pointer to a initial feasible solution, see * glp_ios_heur_sol * If initsol = NULL, the procedure finds the first solution * by itself. * * rel_impr : minimum relative obj improvement to be achieved at each * internal step; if <= 0.0 a default value of 0.01 (1%) is * used; for some problems (e.g., set covering with small * integer costs) a more-conservative choice of 0.001 (0.1%) * can lead to a better final solution; values larger than * 0.05 (5%) are typically too aggressive and do not work * well. * * tlim : time limit to find a new solution, in ms. * If tlim = 0, it is set to its default value, 600000 ms * * verbose : if 1 the output is activated. If 0 only errors are * displayed * * The procedure returns -1 if an error occurred, 0 otherwise (possibly, * time limit) * ***********************************************************************/ /**********************************************************************/ /* 1. INCLUDE */ /**********************************************************************/ #include "glpk.h" #include "env.h" #include "proxy.h" /**********************************************************************/ /* 2. PARAMETERS AND CONSTANTS */ /**********************************************************************/ #define TDAY 86400.0 #define TRUE 1 #define FALSE 0 #define EPS 1e-6 #define RINF 1e38 #define MAXVAL 1e20 #define MINVAL -1e20 #if 0 /* by gioker */ #define PROXY_DEBUG #endif /**********************************************************************/ /* 3. GLOBAL VARIABLES */ /**********************************************************************/ struct csa { int integer_obj; /* TRUE if each feasible solution has an integral cost */ int b_vars_exist; /* TRUE if there is at least one binary variable in the problem */ int i_vars_exist; /* TRUE if there is at least one general integer variable in the problem */ const double *startsol; /* Pointer to the initial solution */ int *ckind; /* Store the kind of the structural variables of the problem */ double *clb; /* Store the lower bound on the structural variables of the problem */ double *cub; /* Store the upper bound on the structural variables of the problem */ double *true_obj; /* Store the obj coefficients of the problem */ int dir; /* Minimization or maximization problem */ int ncols; /* Number of structural variables of the problem */ time_t GLOtstart; /* starting time of the algorithm */ glp_prob *lp_ref; /* glp problem for refining only*/ }; /**********************************************************************/ /* 4. FUNCTIONS PROTOTYPES */ /**********************************************************************/ static void callback(glp_tree *tree, void *info); static void get_info(struct csa *csa, glp_prob *lp); static int is_integer(struct csa *csa); static void check_integrality(struct csa *csa); static int check_ref(struct csa *csa, glp_prob *lp, double *xref); static double second(void); static int add_cutoff(struct csa *csa, glp_prob *lp); static void get_sol(struct csa *csa, glp_prob *lp, double *xstar); static double elapsed_time(struct csa *csa); static void redefine_obj(glp_prob *lp, double *xtilde, int ncols, int *ckind, double *clb, double *cub); static double update_cutoff(struct csa *csa, glp_prob *lp, double zstar, int index, double rel_impr); static double compute_delta(struct csa *csa, double z, double rel_impr); static double objval(int ncols, double *x, double *true_obj); static void array_copy(int begin, int end, double *source, double *destination); static int do_refine(struct csa *csa, glp_prob *lp_ref, int ncols, int *ckind, double *xref, int *tlim, int tref_lim, int verbose); static void deallocate(struct csa *csa, int refine); /**********************************************************************/ /* 5. FUNCTIONS */ /**********************************************************************/ int proxy(glp_prob *lp, double *zfinal, double *xfinal, const double initsol[], double rel_impr, int tlim, int verbose) { struct csa csa_, *csa = &csa_; glp_iocp parm; glp_smcp parm_lp; size_t tpeak; int refine, tref_lim, err, cutoff_row, niter, status, i, tout; double *xref, *xstar, zstar, tela, cutoff, zz; memset(csa, 0, sizeof(struct csa)); /********** **********/ /********** RETRIEVING PROBLEM INFO **********/ /********** **********/ /* getting problem direction (min or max) */ csa->dir = glp_get_obj_dir(lp); /* getting number of variables */ csa->ncols = glp_get_num_cols(lp); /* getting kind, bounds and obj coefficient of each variable information is stored in ckind, cub, clb, true_obj */ get_info(csa, lp); /* checking if the objective function is always integral */ check_integrality(csa); /* Proximity search cannot be used if there are no binary variables */ if (csa->b_vars_exist == FALSE) { if (verbose) { xprintf("The problem has not binary variables. Proximity se" "arch cannot be used.\n"); } tfree(csa->ckind); tfree(csa->clb); tfree(csa->cub); tfree(csa->true_obj); return -1; } /* checking if the problem needs refinement, i.e., not all variables are binary. If so, the routine creates a copy of the lp problem named lp_ref and initializes the solution xref to zero. */ xref = talloc(csa->ncols+1, double); #if 0 /* by mao */ memset(xref, 0, sizeof(double)*(csa->ncols+1)); #endif refine = check_ref(csa, lp, xref); #ifdef PROXY_DEBUG xprintf("REFINE = %d\n",refine); #endif /* Initializing the solution */ xstar = talloc(csa->ncols+1, double); #if 0 /* by mao */ memset(xstar, 0, sizeof(double)*(csa->ncols+1)); #endif /********** **********/ /********** FINDING FIRST SOLUTION **********/ /********** **********/ if (verbose) { xprintf("Applying PROXY heuristic...\n"); } /* get the initial time */ csa->GLOtstart = second(); /* setting the optimization parameters */ glp_init_iocp(&parm); glp_init_smcp(&parm_lp); #if 0 /* by gioker */ /* Preprocessing should be disabled because the mip passed to proxy is already preprocessed */ parm.presolve = GLP_ON; #endif #if 1 /* by mao */ /* best projection backtracking seems to be more efficient to find any integer feasible solution */ parm.bt_tech = GLP_BT_BPH; #endif /* Setting the default value of the minimum relative improvement to 1% */ if ( rel_impr <= 0.0 ) { rel_impr = 0.01; } /* Setting the default value of time limit to 10 minutes */ if (tlim <= 0) { tlim = INT_MAX; } if (verbose) { xprintf("Proxy's time limit set to %d seconds.\n",tlim/1000); xprintf("Proxy's relative improvement " "set to %2.2lf %c.\n",rel_impr*100,37); } parm_lp.tm_lim = tlim; parm.mip_gap = 9999999.9; /* to stop the optimization at the first feasible solution found */ /* finding the first solution */ if (verbose) { xprintf("Searching for a feasible solution...\n"); } /* verifying the existence of an input starting solution */ if (initsol != NULL) { csa->startsol = initsol; parm.cb_func = callback; parm.cb_info = csa; if (verbose) { xprintf("Input solution found.\n"); } } tout = glp_term_out(GLP_OFF); err = glp_simplex(lp,&parm_lp); glp_term_out(tout); status = glp_get_status(lp); if (status != GLP_OPT) { if (verbose) { xprintf("Proxy heuristic terminated.\n"); } #ifdef PROXY_DEBUG /* For debug only */ xprintf("GLP_SIMPLEX status = %d\n",status); xprintf("GLP_SIMPLEX error code = %d\n",err); #endif tfree(xref); tfree(xstar); deallocate(csa, refine); return -1; } tela = elapsed_time(csa); if (tlim-tela*1000 <= 0) { if (verbose) { xprintf("Time limit exceeded. Proxy could not " "find optimal solution to LP relaxation.\n"); xprintf("Proxy heuristic aborted.\n"); } tfree(xref); tfree(xstar); deallocate(csa, refine); return -1; } parm.tm_lim = tlim - tela*1000; tref_lim = (tlim - tela *1000) / 20; tout = glp_term_out(GLP_OFF); err = glp_intopt(lp, &parm); glp_term_out(tout); status = glp_mip_status(lp); /***** If no solution was found *****/ if (status == GLP_NOFEAS || status == GLP_UNDEF) { if (err == GLP_ETMLIM) { if (verbose) { xprintf("Time limit exceeded. Proxy could not " "find an initial integer feasible solution.\n"); xprintf("Proxy heuristic aborted.\n"); } } else { if (verbose) { xprintf("Proxy could not " "find an initial integer feasible solution.\n"); xprintf("Proxy heuristic aborted.\n"); } } tfree(xref); tfree(xstar); deallocate(csa, refine); return -1; } /* getting the first solution and its value */ get_sol(csa, lp,xstar); zstar = glp_mip_obj_val(lp); if (verbose) { xprintf(">>>>> first solution = %e;\n", zstar); } /* If a feasible solution was found but the time limit is exceeded */ if (err == GLP_ETMLIM) { if (verbose) { xprintf("Time limit exceeded. Proxy heuristic terminated.\n"); } goto done; } tela = elapsed_time(csa); tpeak = 0; glp_mem_usage(NULL, NULL, NULL, &tpeak); if (verbose) { xprintf("Time used: %3.1lf secs. Memory used: %2.1lf Mb\n", tela,(double)tpeak/1048576); xprintf("Starting proximity search...\n"); } /********** **********/ /********** PREPARING THE PROBLEM FOR PROXY **********/ /********** **********/ /* adding a dummy cutoff constraint */ cutoff_row = add_cutoff(csa, lp); /* proximity search needs minimization direction even if the problem is a maximization one */ if (csa->dir == GLP_MAX) { glp_set_obj_dir(lp, GLP_MIN); } /********** **********/ /********** STARTING PROXIMITY SEARCH **********/ /********** **********/ niter = 0; while (TRUE) { niter++; /********** CHANGING THE OBJ FUNCTION **********/ redefine_obj(lp,xstar, csa->ncols, csa->ckind, csa->clb, csa->cub); /********** UPDATING THE CUTOFF CONSTRAINT **********/ cutoff = update_cutoff(csa, lp,zstar, cutoff_row, rel_impr); #ifdef PROXY_DEBUG xprintf("TRUE_OBJ[0] = %f\n",csa->true_obj[0]); xprintf("ZSTAR = %f\n",zstar); xprintf("CUTOFF = %f\n",cutoff); #endif /********** SEARCHING FOR A BETTER SOLUTION **********/ tela = elapsed_time(csa); if (tlim-tela*1000 <= 0) { if (verbose) { xprintf("Time limit exceeded. Proxy heuristic " "terminated.\n"); } goto done; } #ifdef PROXY_DEBUG xprintf("TELA = %3.1lf\n",tela*1000); xprintf("TLIM = %3.1lf\n",tlim - tela*1000); #endif parm_lp.tm_lim = tlim -tela*1000; tout = glp_term_out(GLP_OFF); err = glp_simplex(lp,&parm_lp); glp_term_out(tout); status = glp_get_status(lp); if (status != GLP_OPT) { if (status == GLP_NOFEAS) { if (verbose) { xprintf("Bound exceeded = %f. ",cutoff); } } if (verbose) { xprintf("Proxy heuristic terminated.\n"); } #ifdef PROXY_DEBUG xprintf("GLP_SIMPLEX status = %d\n",status); xprintf("GLP_SIMPLEX error code = %d\n",err); #endif goto done; } tela = elapsed_time(csa); if (tlim-tela*1000 <= 0) { if (verbose) { xprintf("Time limit exceeded. Proxy heuristic " "terminated.\n"); } goto done; } parm.tm_lim = tlim - tela*1000; parm.cb_func = NULL; #if 0 /* by gioker */ /* Preprocessing should be disabled because the mip passed to proxy is already preprocessed */ parm.presolve = GLP_ON; #endif tout = glp_term_out(GLP_OFF); err = glp_intopt(lp, &parm); glp_term_out(tout); /********** MANAGEMENT OF THE SOLUTION **********/ status = glp_mip_status(lp); /***** No feasible solutions *****/ if (status == GLP_NOFEAS) { if (verbose) { xprintf("Bound exceeded = %f. Proxy heuristic " "terminated.\n",cutoff); } goto done; } /***** Undefined solution *****/ if (status == GLP_UNDEF) { if (err == GLP_ETMLIM) { if (verbose) { xprintf("Time limit exceeded. Proxy heuristic " "terminated.\n"); } } else { if (verbose) { xprintf("Proxy terminated unexpectedly.\n"); #ifdef PROXY_DEBUG xprintf("GLP_INTOPT error code = %d\n",err); #endif } } goto done; } /***** Feasible solution *****/ if ((status == GLP_FEAS) || (status == GLP_OPT)) { /* getting the solution and computing its value */ get_sol(csa, lp,xstar); zz = objval(csa->ncols, xstar, csa->true_obj); /* Comparing the incumbent solution with the current best one */ #ifdef PROXY_DEBUG xprintf("ZZ = %f\n",zz); xprintf("ZSTAR = %f\n",zstar); xprintf("REFINE = %d\n",refine); #endif if (((zzdir == GLP_MIN)) || ((zz>zstar) && (csa->dir == GLP_MAX))) { /* refining (possibly) the solution */ if (refine) { /* copying the incumbent solution in the refinement one */ array_copy(1, csa->ncols +1, xstar, xref); err = do_refine(csa, csa->lp_ref, csa->ncols, csa->ckind, xref, &tlim, tref_lim, verbose); if (!err) { double zref = objval(csa->ncols, xref, csa->true_obj); if (((zrefdir == GLP_MIN)) || ((zref>zz) && (csa->dir == GLP_MAX))) { zz = zref; /* copying the refinement solution in the incumbent one */ array_copy(1, csa->ncols +1, xref, xstar); } } } zstar = zz; tela = elapsed_time(csa); if (verbose) { xprintf(">>>>> it: %3d: mip = %e; elapsed time " "%3.1lf sec.s\n", niter,zstar,tela); } } } } done: tela = elapsed_time(csa); glp_mem_usage(NULL, NULL, NULL, &tpeak); if (verbose) { xprintf("Time used: %3.1lf. Memory used: %2.1lf Mb\n", tela,(double)tpeak/1048576); } /* Exporting solution and obj val */ *zfinal = zstar; for (i=1; i < (csa->ncols + 1); i++) { xfinal[i]=xstar[i]; } /* Freeing allocated memory */ tfree(xref); tfree(xstar); deallocate(csa, refine); return 0; } /**********************************************************************/ static void callback(glp_tree *tree, void *info){ /**********************************************************************/ struct csa *csa = info; switch(glp_ios_reason(tree)) { case GLP_IHEUR: glp_ios_heur_sol(tree, csa->startsol); break; default: break; } } /**********************************************************************/ static void get_info(struct csa *csa, glp_prob *lp) /**********************************************************************/ { int i; /* Storing helpful info of the problem */ csa->ckind = talloc(csa->ncols+1, int); #if 0 /* by mao */ memset(csa->ckind, 0, sizeof(int)*(csa->ncols+1)); #endif csa->clb = talloc(csa->ncols+1, double); #if 0 /* by mao */ memset(csa->clb, 0, sizeof(double)*(csa->ncols+1)); #endif csa->cub = talloc(csa->ncols+1, double); #if 0 /* by mao */ memset(csa->cub, 0, sizeof(double)*(csa->ncols+1)); #endif csa->true_obj = talloc(csa->ncols+1, double); #if 0 /* by mao */ memset(csa->true_obj, 0, sizeof(double)*(csa->ncols+1)); #endif for( i = 1 ; i < (csa->ncols + 1); i++ ) { csa->ckind[i] = glp_get_col_kind(lp, i); csa->clb[i] = glp_get_col_lb(lp, i); csa->cub[i] = glp_get_col_ub(lp, i); csa->true_obj[i] = glp_get_obj_coef(lp, i); } csa->true_obj[0] = glp_get_obj_coef(lp, 0); } /**********************************************************************/ static int is_integer(struct csa *csa) /**********************************************************************/ { int i; csa->integer_obj = TRUE; for ( i = 1; i < (csa->ncols + 1); i++ ) { if (fabs(csa->true_obj[i]) > INT_MAX ) { csa->integer_obj = FALSE; } if (fabs(csa->true_obj[i]) <= INT_MAX) { double tmp, rem; if (fabs(csa->true_obj[i]) - floor(fabs(csa->true_obj[i])) < 0.5) { tmp = floor(fabs(csa->true_obj[i])); } else { tmp = ceil(fabs(csa->true_obj[i])); } rem = fabs(csa->true_obj[i]) - tmp; rem = fabs(rem); if (rem > EPS) { csa->integer_obj = FALSE; } } } return csa->integer_obj; } /**********************************************************************/ static void check_integrality(struct csa *csa) /**********************************************************************/ { /* Checking if the problem has binary, integer or continuos variables. integer_obj is TRUE if the problem has no continuous variables and all the obj coefficients are integer (and < INT_MAX). */ int i; csa->integer_obj = is_integer(csa); csa->b_vars_exist = FALSE; csa->i_vars_exist = FALSE; for ( i = 1; i < (csa->ncols + 1); i++ ) { if ( csa->ckind[i] == GLP_IV ){ csa->i_vars_exist = TRUE; continue; } if ( csa->ckind[i] == GLP_BV ){ csa->b_vars_exist =TRUE; continue; } csa->integer_obj = FALSE; } } /**********************************************************************/ static int check_ref(struct csa *csa, glp_prob *lp, double *xref) /**********************************************************************/ { /* checking if the problem has continuos or integer variables. If so, refinement is prepared. */ int refine = FALSE; int i; for ( i = 1; i < (csa->ncols + 1); i++ ) { if ( csa->ckind[i] != GLP_BV) { refine = TRUE; break; } } /* possibly creating a mip clone for refinement only */ if ( refine ) { csa->lp_ref = glp_create_prob(); glp_copy_prob(csa->lp_ref, lp, GLP_ON); } return refine; } /**********************************************************************/ static double second(void) /**********************************************************************/ { #if 0 /* by mao */ return ((double)clock()/(double)CLOCKS_PER_SEC); #else return xtime() / 1000.0; #endif } /**********************************************************************/ static int add_cutoff(struct csa *csa, glp_prob *lp) /**********************************************************************/ { /* Adding a cutoff constraint to set an upper bound (in case of minimaztion) on the obj value of the next solution, i.e., the next value of the true obj function that we would like to find */ /* store non-zero coefficients in the objective function */ int *obj_index = talloc(csa->ncols+1, int); #if 0 /* by mao */ memset(obj_index, 0, sizeof(int)*(csa->ncols+1)); #endif double *obj_value = talloc(csa->ncols+1, double); #if 0 /* by mao */ memset(obj_value, 0, sizeof(double)*(csa->ncols+1)); #endif int obj_nzcnt = 0; int i, irow; const char *rowname; for ( i = 1; i < (csa->ncols + 1); i++ ) { if ( fabs(csa->true_obj[i]) > EPS ) { obj_nzcnt++; obj_index[obj_nzcnt] = i; obj_value[obj_nzcnt] = csa->true_obj[i]; } } irow = glp_add_rows(lp, 1); rowname = "Cutoff"; glp_set_row_name(lp, irow, rowname); if (csa->dir == GLP_MIN) { /* minimization problem */ glp_set_row_bnds(lp, irow, GLP_UP, MAXVAL, MAXVAL); } else { /* maximization problem */ glp_set_row_bnds(lp, irow, GLP_LO, MINVAL, MINVAL); } glp_set_mat_row(lp, irow, obj_nzcnt, obj_index, obj_value); tfree(obj_index); tfree(obj_value); return irow; } /**********************************************************************/ static void get_sol(struct csa *csa, glp_prob *lp, double *xstar) /**********************************************************************/ { /* Retrieving and storing the coefficients of the solution */ int i; for (i = 1; i < (csa->ncols +1); i++) { xstar[i] = glp_mip_col_val(lp, i); } } /**********************************************************************/ static double elapsed_time(struct csa *csa) /**********************************************************************/ { double tela = second() - csa->GLOtstart; if ( tela < 0 ) tela += TDAY; return(tela); } /**********************************************************************/ static void redefine_obj(glp_prob *lp, double *xtilde, int ncols, int *ckind, double *clb, double *cub) /**********************************************************************/ /* Redefine the lp objective function obj as the distance-to-integrality (Hamming distance) from xtilde (the incumbent feasible solution), wrt to binary vars only */ { int j; double *delta = talloc(ncols+1, double); #if 0 /* by mao */ memset(delta, 0, sizeof(double)*(ncols+1)); #endif for ( j = 1; j < (ncols +1); j++ ) { delta[j] = 0.0; /* skip continuous variables */ if ( ckind[j] == GLP_CV ) continue; /* skip integer variables that have been fixed */ if ( cub[j]-clb[j] < 0.5 ) continue; /* binary variable */ if ( ckind[j] == GLP_BV ) { if ( xtilde[j] > 0.5 ) { delta[j] = -1.0; } else { delta[j] = 1.0; } } } /* changing the obj coeff. for all variables, including continuous ones */ for ( j = 1; j < (ncols +1); j++ ) { glp_set_obj_coef(lp, j, delta[j]); } glp_set_obj_coef(lp, 0, 0.0); tfree(delta); } /**********************************************************************/ static double update_cutoff(struct csa *csa, glp_prob *lp, double zstar, int cutoff_row, double rel_impr) /**********************************************************************/ { /* Updating the cutoff constraint with the value we would like to find during the next optimization */ double cutoff; zstar -= csa->true_obj[0]; if (csa->dir == GLP_MIN) { cutoff = zstar - compute_delta(csa, zstar, rel_impr); glp_set_row_bnds(lp, cutoff_row, GLP_UP, cutoff, cutoff); } else { cutoff = zstar + compute_delta(csa, zstar, rel_impr); glp_set_row_bnds(lp, cutoff_row, GLP_LO, cutoff, cutoff); } return cutoff; } /**********************************************************************/ static double compute_delta(struct csa *csa, double z, double rel_impr) /**********************************************************************/ { /* Computing the offset for the next best solution */ double delta = rel_impr * fabs(z); if ( csa->integer_obj ) delta = ceil(delta); return(delta); } /**********************************************************************/ static double objval(int ncols, double *x, double *true_obj) /**********************************************************************/ { /* Computing the true cost of x (using the original obj coeff.s) */ int j; double z = 0.0; for ( j = 1; j < (ncols +1); j++ ) { z += x[j] * true_obj[j]; } return z + true_obj[0]; } /**********************************************************************/ static void array_copy(int begin, int end, double *source, double *destination) /**********************************************************************/ { int i; for (i = begin; i < end; i++) { destination[i] = source[i]; } } /**********************************************************************/ static int do_refine(struct csa *csa, glp_prob *lp_ref, int ncols, int *ckind, double *xref, int *tlim, int tref_lim, int verbose) /**********************************************************************/ { /* Refinement is applied when the variables of the problem are not all binary. Binary variables are fixed to their value and remaining ones are optimized. If there are only continuos variables (in addition to those binary) the problem becomes just an LP. Otherwise, it remains a MIP but of smaller size. */ int j, tout; double refineStart = second(); double val, tela, tlimit; if ( glp_get_num_cols(lp_ref) != ncols ) { if (verbose) { xprintf("Error in Proxy refinement: "); xprintf("wrong number of columns (%d vs %d).\n", ncols, glp_get_num_cols(lp_ref)); } return 1; } val = -1.0; /* fixing all binary variables to their current value in xref */ for ( j = 1; j < (ncols + 1); j++ ) { if ( ckind[j] == GLP_BV ) { val = 0.0; if ( xref[j] > 0.5 ) val = 1.0; glp_set_col_bnds(lp_ref, j, GLP_FX, val, val); } } /* re-optimizing (refining) if some bound has been changed */ if ( val > -1.0 ) { glp_iocp parm_ref; glp_smcp parm_ref_lp; int err, status; glp_init_iocp(&parm_ref); parm_ref.presolve = GLP_ON; glp_init_smcp(&parm_ref_lp); /* If there are no general integer variable the problem becomes an LP (after fixing the binary variables) and can be solved quickly. Otherwise the problem is still a MIP problem and a timelimit has to be set. */ parm_ref.tm_lim = tref_lim; if (parm_ref.tm_lim > *tlim) { parm_ref.tm_lim = *tlim; } parm_ref_lp.tm_lim = parm_ref.tm_lim; #ifdef PROXY_DEBUG xprintf("***** REFINING *****\n"); #endif tout = glp_term_out(GLP_OFF); if (csa->i_vars_exist == TRUE) { err = glp_intopt(lp_ref, &parm_ref); } else { err = glp_simplex(lp_ref, &parm_ref_lp); } glp_term_out(tout); if (csa->i_vars_exist == TRUE) { status = glp_mip_status(lp_ref); } else { status = glp_get_status(lp_ref); } #if 1 /* 29/II-2016 by mao as reported by Chris */ switch (status) { case GLP_OPT: case GLP_FEAS: break; default: status = GLP_UNDEF; break; } #endif #ifdef PROXY_DEBUG xprintf("STATUS REFINING = %d\n",status); #endif if (status == GLP_UNDEF) { if (err == GLP_ETMLIM) { #ifdef PROXY_DEBUG xprintf("Time limit exceeded on Proxy refining.\n"); #endif return 1; } } for( j = 1 ; j < (ncols + 1); j++ ){ if (ckind[j] != GLP_BV) { if (csa->i_vars_exist == TRUE) { xref[j] = glp_mip_col_val(lp_ref, j); } else{ xref[j] = glp_get_col_prim(lp_ref, j); } } } } tela = second() - refineStart; #ifdef PROXY_DEBUG xprintf("REFINE TELA = %3.1lf\n",tela*1000); #endif return 0; } /**********************************************************************/ static void deallocate(struct csa *csa, int refine) /**********************************************************************/ { /* Deallocating routine */ if (refine) { glp_delete_prob(csa->lp_ref); } tfree(csa->ckind); tfree(csa->clb); tfree(csa->cub); tfree(csa->true_obj); } /* eof */ glpk-5.0/src/proxy/proxy.h0000644000062000006210000000226013766346220015004 0ustar maomkpasswd/* proxy.h (proximity search heuristic algorithm) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2013 Free Software Foundation, Inc. * Written by Giorgio Sartor <0gioker0@gmail.com>. * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef PROXY_H #define PROXY_H #define proxy _glp_proxy int proxy(glp_prob *lp, double *zstar, double *xstar, const double initsol[], double rel_impr, int tlim, int verbose); #endif /* eof */ glpk-5.0/src/proxy/proxy1.c0000644000062000006210000000605013766346220015061 0ustar maomkpasswd/* proxy1.c */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2013, 2018 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "ios.h" #include "proxy.h" void ios_proxy_heur(glp_tree *T) { glp_prob *prob; int j, status; double *xstar, zstar; /* this heuristic is applied only once on the root level */ if (!(T->curr->level == 0 && T->curr->solved == 1)) goto done; prob = glp_create_prob(); glp_copy_prob(prob, T->mip, 0); xstar = xcalloc(1+prob->n, sizeof(double)); for (j = 1; j <= prob->n; j++) xstar[j] = 0.0; if (T->mip->mip_stat != GLP_FEAS) status = proxy(prob, &zstar, xstar, NULL, 0.0, T->parm->ps_tm_lim, 1); else { double *xinit = xcalloc(1+prob->n, sizeof(double)); for (j = 1; j <= prob->n; j++) xinit[j] = T->mip->col[j]->mipx; status = proxy(prob, &zstar, xstar, xinit, 0.0, T->parm->ps_tm_lim, 1); xfree(xinit); } if (status == 0) #if 0 /* 17/III-2016 */ glp_ios_heur_sol(T, xstar); #else { /* sometimes the proxy heuristic reports a wrong solution, so * make sure that the solution is really integer feasible */ int i, feas1, feas2, ae_ind, re_ind; double ae_max, re_max; glp_copy_prob(prob, T->mip, 0); for (j = 1; j <= prob->n; j++) prob->col[j]->mipx = xstar[j]; for (i = 1; i <= prob->m; i++) { GLPROW *row; GLPAIJ *aij; row = prob->row[i]; row->mipx = 0.0; for (aij = row->ptr; aij != NULL; aij = aij->r_next) row->mipx += aij->val * aij->col->mipx; } glp_check_kkt(prob, GLP_MIP, GLP_KKT_PE, &ae_max, &ae_ind, &re_max, &re_ind); feas1 = (re_max <= 1e-6); glp_check_kkt(prob, GLP_MIP, GLP_KKT_PB, &ae_max, &ae_ind, &re_max, &re_ind); feas2 = (re_max <= 1e-6); if (feas1 && feas2) glp_ios_heur_sol(T, xstar); else xprintf("WARNING: PROXY HEURISTIC REPORTED WRONG SOLUTION; " "SOLUTION REJECTED\n"); } #endif xfree(xstar); glp_delete_prob(prob); done: return; } /* eof */ glpk-5.0/src/simplex/0000755000062000006210000000000013766346220013752 5ustar maomkpasswdglpk-5.0/src/simplex/simplex.h0000644000062000006210000000236113766346220015606 0ustar maomkpasswd/* simplex.h */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2015 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef SIMPLEX_H #define SIMPLEX_H #include "prob.h" #define spx_primal _glp_spx_primal int spx_primal(glp_prob *P, const glp_smcp *parm); /* driver to the primal simplex method */ #define spy_dual _glp_spy_dual int spy_dual(glp_prob *P, const glp_smcp *parm); /* driver to the dual simplex method */ #endif /* eof */ glpk-5.0/src/simplex/spxat.c0000644000062000006210000002075413766346220015265 0ustar maomkpasswd/* spxat.c */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2015 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "spxat.h" /*********************************************************************** * spx_alloc_at - allocate constraint matrix in sparse row-wise format * * This routine allocates the memory for arrays needed to represent the * constraint matrix in sparse row-wise format. */ void spx_alloc_at(SPXLP *lp, SPXAT *at) { int m = lp->m; int n = lp->n; int nnz = lp->nnz; at->ptr = talloc(1+m+1, int); at->ind = talloc(1+nnz, int); at->val = talloc(1+nnz, double); at->work = talloc(1+n, double); return; } /*********************************************************************** * spx_build_at - build constraint matrix in sparse row-wise format * * This routine builds sparse row-wise representation of the constraint * matrix A using its sparse column-wise representation stored in the * lp object, and stores the result in the at object. */ void spx_build_at(SPXLP *lp, SPXAT *at) { int m = lp->m; int n = lp->n; int nnz = lp->nnz; int *A_ptr = lp->A_ptr; int *A_ind = lp->A_ind; double *A_val = lp->A_val; int *AT_ptr = at->ptr; int *AT_ind = at->ind; double *AT_val = at->val; int i, k, ptr, end, pos; /* calculate AT_ptr[i] = number of non-zeros in i-th row */ memset(&AT_ptr[1], 0, m * sizeof(int)); for (k = 1; k <= n; k++) { ptr = A_ptr[k]; end = A_ptr[k+1]; for (; ptr < end; ptr++) AT_ptr[A_ind[ptr]]++; } /* set AT_ptr[i] to position after last element in i-th row */ AT_ptr[1]++; for (i = 2; i <= m; i++) AT_ptr[i] += AT_ptr[i-1]; xassert(AT_ptr[m] == nnz+1); AT_ptr[m+1] = nnz+1; /* build row-wise representation and re-arrange AT_ptr[i] */ for (k = n; k >= 1; k--) { /* copy elements from k-th column to corresponding rows */ ptr = A_ptr[k]; end = A_ptr[k+1]; for (; ptr < end; ptr++) { pos = --AT_ptr[A_ind[ptr]]; AT_ind[pos] = k; AT_val[pos] = A_val[ptr]; } } xassert(AT_ptr[1] == 1); return; } /*********************************************************************** * spx_at_prod - compute product y := y + s * A'* x * * This routine computes the product: * * y := y + s * A'* x, * * where A' is a matrix transposed to the mxn-matrix A of constraint * coefficients, x is a m-vector, s is a scalar, y is a n-vector. * * The routine uses the row-wise representation of the matrix A and * computes the product as a linear combination: * * y := y + s * (A'[1] * x[1] + ... + A'[m] * x[m]), * * where A'[i] is i-th row of A, 1 <= i <= m. */ void spx_at_prod(SPXLP *lp, SPXAT *at, double y[/*1+n*/], double s, const double x[/*1+m*/]) { int m = lp->m; int *AT_ptr = at->ptr; int *AT_ind = at->ind; double *AT_val = at->val; int i, ptr, end; double t; for (i = 1; i <= m; i++) { if (x[i] != 0.0) { /* y := y + s * (i-th row of A) * x[i] */ t = s * x[i]; ptr = AT_ptr[i]; end = AT_ptr[i+1]; for (; ptr < end; ptr++) y[AT_ind[ptr]] += AT_val[ptr] * t; } } return; } /*********************************************************************** * spx_nt_prod1 - compute product y := y + s * N'* x * * This routine computes the product: * * y := y + s * N'* x, * * where N' is a matrix transposed to the mx(n-m)-matrix N composed * from non-basic columns of the constraint matrix A, x is a m-vector, * s is a scalar, y is (n-m)-vector. * * If the flag ign is non-zero, the routine ignores the input content * of the array y assuming that y = 0. */ void spx_nt_prod1(SPXLP *lp, SPXAT *at, double y[/*1+n-m*/], int ign, double s, const double x[/*1+m*/]) { int m = lp->m; int n = lp->n; int *head = lp->head; double *work = at->work; int j, k; for (k = 1; k <= n; k++) work[k] = 0.0; if (!ign) { for (j = 1; j <= n-m; j++) work[head[m+j]] = y[j]; } spx_at_prod(lp, at, work, s, x); for (j = 1; j <= n-m; j++) y[j] = work[head[m+j]]; return; } /*********************************************************************** * spx_eval_trow1 - compute i-th row of simplex table * * This routine computes i-th row of the current simplex table * T = (T[i,j]) = - inv(B) * N, 1 <= i <= m, using representation of * the constraint matrix A in row-wise format. * * The vector rho = (rho[j]), which is i-th row of the basis inverse * inv(B), should be previously computed with the routine spx_eval_rho. * It is assumed that elements of this vector are stored in the array * locations rho[1], ..., rho[m]. * * There exist two ways to compute the simplex table row. * * 1. T[i,j], j = 1,...,n-m, is computed as inner product: * * m * T[i,j] = - sum a[i,k] * rho[i], * i=1 * * where N[j] = A[k] is a column of the constraint matrix corresponding * to non-basic variable xN[j]. The estimated number of operations in * this case is: * * n1 = (n - m) * (nnz(A) / n), * * (n - m) is the number of columns of N, nnz(A) / n is the average * number of non-zeros in one column of A and, therefore, of N. * * 2. The simplex table row is computed as part of a linear combination * of rows of A with coefficients rho[i] != 0. The estimated number * of operations in this case is: * * n2 = nnz(rho) * (nnz(A) / m), * * where nnz(rho) is the number of non-zeros in the vector rho, * nnz(A) / m is the average number of non-zeros in one row of A. * * If n1 < n2, the routine computes the simples table row using the * first way (like the routine spx_eval_trow). Otherwise, the routine * uses the second way calling the routine spx_nt_prod1. * * On exit components of the simplex table row are stored in the array * locations trow[1], ... trow[n-m]. */ void spx_eval_trow1(SPXLP *lp, SPXAT *at, const double rho[/*1+m*/], double trow[/*1+n-m*/]) { int m = lp->m; int n = lp->n; int nnz = lp->nnz; int i, j, nnz_rho; double cnt1, cnt2; /* determine nnz(rho) */ nnz_rho = 0; for (i = 1; i <= m; i++) { if (rho[i] != 0.0) nnz_rho++; } /* estimate the number of operations for both ways */ cnt1 = (double)(n - m) * ((double)nnz / (double)n); cnt2 = (double)nnz_rho * ((double)nnz / (double)m); /* compute i-th row of simplex table */ if (cnt1 < cnt2) { /* as inner products */ int *A_ptr = lp->A_ptr; int *A_ind = lp->A_ind; double *A_val = lp->A_val; int *head = lp->head; int k, ptr, end; double tij; for (j = 1; j <= n-m; j++) { k = head[m+j]; /* x[k] = xN[j] */ /* compute t[i,j] = - N'[j] * pi */ tij = 0.0; ptr = A_ptr[k]; end = A_ptr[k+1]; for (; ptr < end; ptr++) tij -= A_val[ptr] * rho[A_ind[ptr]]; trow[j] = tij; } } else { /* as linear combination */ spx_nt_prod1(lp, at, trow, 1, -1.0, rho); } return; } /*********************************************************************** * spx_free_at - deallocate constraint matrix in sparse row-wise format * * This routine deallocates the memory used for arrays of the program * object at. */ void spx_free_at(SPXLP *lp, SPXAT *at) { xassert(lp == lp); tfree(at->ptr); tfree(at->ind); tfree(at->val); tfree(at->work); return; } /* eof */ glpk-5.0/src/simplex/spxat.h0000644000062000006210000000542513766346220015270 0ustar maomkpasswd/* spxat.h */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2015 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef SPXAT_H #define SPXAT_H #include "spxlp.h" typedef struct SPXAT SPXAT; struct SPXAT { /* mxn-matrix A of constraint coefficients in sparse row-wise * format */ int *ptr; /* int ptr[1+m+1]; */ /* ptr[0] is not used; * ptr[i], 1 <= i <= m, is starting position of i-th row in * arrays ind and val; note that ptr[1] is always 1; * ptr[m+1] indicates the position after the last element in * arrays ind and val, i.e. ptr[m+1] = nnz+1, where nnz is the * number of non-zero elements in matrix A; * the length of i-th row (the number of non-zero elements in * that row) can be calculated as ptr[i+1] - ptr[i] */ int *ind; /* int ind[1+nnz]; */ /* column indices */ double *val; /* double val[1+nnz]; */ /* non-zero element values */ double *work; /* double work[1+n]; */ /* working array */ }; #define spx_alloc_at _glp_spx_alloc_at void spx_alloc_at(SPXLP *lp, SPXAT *at); /* allocate constraint matrix in sparse row-wise format */ #define spx_build_at _glp_spx_build_at void spx_build_at(SPXLP *lp, SPXAT *at); /* build constraint matrix in sparse row-wise format */ #define spx_at_prod _glp_spx_at_prod void spx_at_prod(SPXLP *lp, SPXAT *at, double y[/*1+n*/], double s, const double x[/*1+m*/]); /* compute product y := y + s * A'* x */ #define spx_nt_prod1 _glp_spx_nt_prod1 void spx_nt_prod1(SPXLP *lp, SPXAT *at, double y[/*1+n-m*/], int ign, double s, const double x[/*1+m*/]); /* compute product y := y + s * N'* x */ #define spx_eval_trow1 _glp_spx_eval_trow1 void spx_eval_trow1(SPXLP *lp, SPXAT *at, const double rho[/*1+m*/], double trow[/*1+n-m*/]); /* compute i-th row of simplex table */ #define spx_free_at _glp_spx_free_at void spx_free_at(SPXLP *lp, SPXAT *at); /* deallocate constraint matrix in sparse row-wise format */ #endif /* eof */ glpk-5.0/src/simplex/spxchuzc.c0000644000062000006210000003045413766346220015773 0ustar maomkpasswd/* spxchuzc.c */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2015 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "spxchuzc.h" /*********************************************************************** * spx_chuzc_sel - select eligible non-basic variables * * This routine selects eligible non-basic variables xN[j], whose * reduced costs d[j] have "wrong" sign, i.e. changing such xN[j] in * feasible direction improves (decreases) the objective function. * * Reduced costs of non-basic variables should be placed in the array * locations d[1], ..., d[n-m]. * * Non-basic variable xN[j] is considered eligible if: * * d[j] <= -eps[j] and xN[j] can increase * * d[j] >= +eps[j] and xN[j] can decrease * * for * * eps[j] = tol + tol1 * |cN[j]|, * * where cN[j] is the objective coefficient at xN[j], tol and tol1 are * specified tolerances. * * On exit the routine stores indices j of eligible non-basic variables * xN[j] to the array locations list[1], ..., list[num] and returns the * number of such variables 0 <= num <= n-m. (If the parameter list is * specified as NULL, no indices are stored.) */ int spx_chuzc_sel(SPXLP *lp, const double d[/*1+n-m*/], double tol, double tol1, int list[/*1+n-m*/]) { int m = lp->m; int n = lp->n; double *c = lp->c; double *l = lp->l; double *u = lp->u; int *head = lp->head; char *flag = lp->flag; int j, k, num; double ck, eps; num = 0; /* walk thru list of non-basic variables */ for (j = 1; j <= n-m; j++) { k = head[m+j]; /* x[k] = xN[j] */ if (l[k] == u[k]) { /* xN[j] is fixed variable; skip it */ continue; } /* determine absolute tolerance eps[j] */ ck = c[k]; eps = tol + tol1 * (ck >= 0.0 ? +ck : -ck); /* check if xN[j] is eligible */ if (d[j] <= -eps) { /* xN[j] should be able to increase */ if (flag[j]) { /* but its upper bound is active */ continue; } } else if (d[j] >= +eps) { /* xN[j] should be able to decrease */ if (!flag[j] && l[k] != -DBL_MAX) { /* but its lower bound is active */ continue; } } else /* -eps < d[j] < +eps */ { /* xN[j] does not affect the objective function within the * specified tolerance */ continue; } /* xN[j] is eligible non-basic variable */ num++; if (list != NULL) list[num] = j; } return num; } /*********************************************************************** * spx_chuzc_std - choose non-basic variable (Dantzig's rule) * * This routine chooses most eligible non-basic variable xN[q] * according to Dantzig's ("standard") rule: * * d[q] = max |d[j]|, * j in J * * where J <= {1, ..., n-m} is the set of indices of eligible non-basic * variables, d[j] is the reduced cost of non-basic variable xN[j] in * the current basis. * * Reduced costs of non-basic variables should be placed in the array * locations d[1], ..., d[n-m]. * * Indices of eligible non-basic variables j in J should be placed in * the array locations list[1], ..., list[num], where num = |J| > 0 is * the total number of such variables. * * On exit the routine returns q, the index of the non-basic variable * xN[q] chosen. */ int spx_chuzc_std(SPXLP *lp, const double d[/*1+n-m*/], int num, const int list[]) { int m = lp->m; int n = lp->n; int j, q, t; double abs_dj, abs_dq; xassert(0 < num && num <= n-m); q = 0, abs_dq = -1.0; for (t = 1; t <= num; t++) { j = list[t]; abs_dj = (d[j] >= 0.0 ? +d[j] : -d[j]); if (abs_dq < abs_dj) q = j, abs_dq = abs_dj; } xassert(q != 0); return q; } /*********************************************************************** * spx_alloc_se - allocate pricing data block * * This routine allocates the memory for arrays used in the pricing * data block. */ void spx_alloc_se(SPXLP *lp, SPXSE *se) { int m = lp->m; int n = lp->n; se->valid = 0; se->refsp = talloc(1+n, char); se->gamma = talloc(1+n-m, double); se->work = talloc(1+m, double); return; } /*********************************************************************** * spx_reset_refsp - reset reference space * * This routine resets (re-initializes) the reference space composing * it from variables which are non-basic in the current basis, and sets * all weights gamma[j] to 1. */ void spx_reset_refsp(SPXLP *lp, SPXSE *se) { int m = lp->m; int n = lp->n; int *head = lp->head; char *refsp = se->refsp; double *gamma = se->gamma; int j, k; se->valid = 1; memset(&refsp[1], 0, n * sizeof(char)); for (j = 1; j <= n-m; j++) { k = head[m+j]; /* x[k] = xN[j] */ refsp[k] = 1; gamma[j] = 1.0; } return; } /*********************************************************************** * spx_eval_gamma_j - compute projected steepest edge weight directly * * This routine computes projected steepest edge weight gamma[j], * 1 <= j <= n-m, for the current basis directly with the formula: * * m * gamma[j] = delta[j] + sum eta[i] * T[i,j]**2, * i=1 * * where T[i,j] is element of the current simplex table, and * * ( 1, if xB[i] is in the reference space * eta[i] = { * ( 0, otherwise * * ( 1, if xN[j] is in the reference space * delta[j] = { * ( 0, otherwise * * NOTE: For testing/debugging only. */ double spx_eval_gamma_j(SPXLP *lp, SPXSE *se, int j) { int m = lp->m; int n = lp->n; int *head = lp->head; char *refsp = se->refsp; double *tcol = se->work; int i, k; double gamma_j; xassert(se->valid); xassert(1 <= j && j <= n-m); k = head[m+j]; /* x[k] = xN[j] */ gamma_j = (refsp[k] ? 1.0 : 0.0); spx_eval_tcol(lp, j, tcol); for (i = 1; i <= m; i++) { k = head[i]; /* x[k] = xB[i] */ if (refsp[k]) gamma_j += tcol[i] * tcol[i]; } return gamma_j; } /*********************************************************************** * spx_chuzc_pse - choose non-basic variable (projected steepest edge) * * This routine chooses most eligible non-basic variable xN[q] * according to the projected steepest edge method: * * d[q]**2 d[j]**2 * -------- = max -------- , * gamma[q] j in J gamma[j] * * where J <= {1, ..., n-m} is the set of indices of eligible non-basic * variable, d[j] is the reduced cost of non-basic variable xN[j] in * the current basis, gamma[j] is the projected steepest edge weight. * * Reduced costs of non-basic variables should be placed in the array * locations d[1], ..., d[n-m]. * * Indices of eligible non-basic variables j in J should be placed in * the array locations list[1], ..., list[num], where num = |J| > 0 is * the total number of such variables. * * On exit the routine returns q, the index of the non-basic variable * xN[q] chosen. */ int spx_chuzc_pse(SPXLP *lp, SPXSE *se, const double d[/*1+n-m*/], int num, const int list[]) { int m = lp->m; int n = lp->n; double *gamma = se->gamma; int j, q, t; double best, temp; xassert(se->valid); xassert(0 < num && num <= n-m); q = 0, best = -1.0; for (t = 1; t <= num; t++) { j = list[t]; /* FIXME */ if (gamma[j] < DBL_EPSILON) temp = 0.0; else temp = (d[j] * d[j]) / gamma[j]; if (best < temp) q = j, best = temp; } xassert(q != 0); return q; } /*********************************************************************** * spx_update_gamma - update projected steepest edge weights exactly * * This routine updates the vector gamma = (gamma[j]) of projected * steepest edge weights exactly, for the adjacent basis. * * On entry to the routine the content of the se object should be valid * and should correspond to the current basis. * * The parameter 1 <= p <= m specifies basic variable xB[p] which * becomes non-basic variable xN[q] in the adjacent basis. * * The parameter 1 <= q <= n-m specified non-basic variable xN[q] which * becomes basic variable xB[p] in the adjacent basis. * * It is assumed that the array trow contains elements of p-th (pivot) * row T'[p] of the simplex table in locations trow[1], ..., trow[n-m]. * It is also assumed that the array tcol contains elements of q-th * (pivot) column T[q] of the simple table in locations tcol[1], ..., * tcol[m]. (These row and column should be computed for the current * basis.) * * For details about the formulae used see the program documentation. * * The routine also computes the relative error: * * e = |gamma[q] - gamma'[q]| / (1 + |gamma[q]|), * * where gamma'[q] is the weight for xN[q] on entry to the routine, * and returns e on exit. (If e happens to be large enough, the calling * program may reset the reference space, since other weights also may * be inaccurate.) */ double spx_update_gamma(SPXLP *lp, SPXSE *se, int p, int q, const double trow[/*1+n-m*/], const double tcol[/*1+m*/]) { int m = lp->m; int n = lp->n; int *head = lp->head; char *refsp = se->refsp; double *gamma = se->gamma; double *u = se->work; int i, j, k, ptr, end; double gamma_q, delta_q, e, r, s, t1, t2; xassert(se->valid); xassert(1 <= p && p <= m); xassert(1 <= q && q <= n-m); /* compute gamma[q] in current basis more accurately; also * compute auxiliary vector u */ k = head[m+q]; /* x[k] = xN[q] */ gamma_q = delta_q = (refsp[k] ? 1.0 : 0.0); for (i = 1; i <= m; i++) { k = head[i]; /* x[k] = xB[i] */ if (refsp[k]) { gamma_q += tcol[i] * tcol[i]; u[i] = tcol[i]; } else u[i] = 0.0; } bfd_btran(lp->bfd, u); /* compute relative error in gamma[q] */ e = fabs(gamma_q - gamma[q]) / (1.0 + gamma_q); /* compute new gamma[q] */ gamma[q] = gamma_q / (tcol[p] * tcol[p]); /* compute new gamma[j] for all j != q */ for (j = 1; j <= n-m; j++) { if (j == q) continue; if (-1e-9 < trow[j] && trow[j] < +1e-9) { /* T[p,j] is close to zero; gamma[j] is not changed */ continue; } /* compute r[j] = T[p,j] / T[p,q] */ r = trow[j] / tcol[p]; /* compute inner product s[j] = N'[j] * u, where N[j] = A[k] * is constraint matrix column corresponding to xN[j] */ s = 0.0; k = head[m+j]; /* x[k] = xN[j] */ ptr = lp->A_ptr[k]; end = lp->A_ptr[k+1]; for (; ptr < end; ptr++) s += lp->A_val[ptr] * u[lp->A_ind[ptr]]; /* compute new gamma[j] */ t1 = gamma[j] + r * (r * gamma_q + s + s); t2 = (refsp[k] ? 1.0 : 0.0) + delta_q * r * r; gamma[j] = (t1 >= t2 ? t1 : t2); } return e; } /*********************************************************************** * spx_free_se - deallocate pricing data block * * This routine deallocates the memory used for arrays in the pricing * data block. */ void spx_free_se(SPXLP *lp, SPXSE *se) { xassert(lp == lp); tfree(se->refsp); tfree(se->gamma); tfree(se->work); return; } /* eof */ glpk-5.0/src/simplex/spxchuzc.h0000644000062000006210000000560213766346220015775 0ustar maomkpasswd/* spxchuzc.h */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2015 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef SPXCHUZC_H #define SPXCHUZC_H #include "spxlp.h" #define spx_chuzc_sel _glp_spx_chuzc_sel int spx_chuzc_sel(SPXLP *lp, const double d[/*1+n-m*/], double tol, double tol1, int list[/*1+n-m*/]); /* select eligible non-basic variables */ #define spx_chuzc_std _glp_spx_chuzc_std int spx_chuzc_std(SPXLP *lp, const double d[/*1+n-m*/], int num, const int list[]); /* choose non-basic variable (Dantzig's rule) */ typedef struct SPXSE SPXSE; struct SPXSE { /* projected steepest edge and Devex pricing data block */ int valid; /* content validity flag */ char *refsp; /* char refsp[1+n]; */ /* refsp[0] is not used; * refsp[k], 1 <= k <= n, is the flag meaning that variable x[k] * is in the reference space */ double *gamma; /* double gamma[1+n-m]; */ /* gamma[0] is not used; * gamma[j], 1 <= j <= n-m, is the weight for reduced cost d[j] * of non-basic variable xN[j] in the current basis */ double *work; /* double work[1+m]; */ /* working array */ }; #define spx_alloc_se _glp_spx_alloc_se void spx_alloc_se(SPXLP *lp, SPXSE *se); /* allocate pricing data block */ #define spx_reset_refsp _glp_spx_reset_refsp void spx_reset_refsp(SPXLP *lp, SPXSE *se); /* reset reference space */ #define spx_eval_gamma_j _glp_spx_eval_gamma_j double spx_eval_gamma_j(SPXLP *lp, SPXSE *se, int j); /* compute projeted steepest edge weight directly */ #define spx_chuzc_pse _glp_spx_chuzc_pse int spx_chuzc_pse(SPXLP *lp, SPXSE *se, const double d[/*1+n-m*/], int num, const int list[]); /* choose non-basic variable (projected steepest edge) */ #define spx_update_gamma _glp_spx_update_gamma double spx_update_gamma(SPXLP *lp, SPXSE *se, int p, int q, const double trow[/*1+n-m*/], const double tcol[/*1+m*/]); /* update projected steepest edge weights exactly */ #define spx_free_se _glp_spx_free_se void spx_free_se(SPXLP *lp, SPXSE *se); /* deallocate pricing data block */ #endif /* eof */ glpk-5.0/src/simplex/spxchuzr.c0000644000062000006210000005442313766346220016014 0ustar maomkpasswd/* spxchuzr.c */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2015-2018 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "spxchuzr.h" /*********************************************************************** * spx_chuzr_std - choose basic variable (textbook ratio test) * * This routine implements an improved textbook ratio test to choose * basic variable xB[p]. * * The parameter phase specifies the search phase: * * 1 - searching for feasible basic solution. In this case the routine * uses artificial bounds of basic variables that correspond to * breakpoints of the penalty function: * * ( lB[i], if cB[i] = 0 * ( * lB'[i] = { uB[i], if cB[i] > 0 * ( * ( -inf, if cB[i] < 0 * * ( uB[i], if cB[i] = 0 * ( * uB'[i] = { +inf, if cB[i] > 0 * ( * ( lB[i], if cB[i] < 0 * * where lB[i] and uB[i] are original bounds of variable xB[i], * cB[i] is the penalty (objective) coefficient of that variable. * * 2 - searching for optimal basic solution. In this case the routine * uses original bounds of basic variables. * * Current values of basic variables should be placed in the array * locations beta[1], ..., beta[m]. * * The parameter 1 <= q <= n-m specifies the index of non-basic * variable xN[q] chosen. * * The parameter s specifies the direction in which xN[q] changes: * s = +1.0 means xN[q] increases, and s = -1.0 means xN[q] decreases. * (Thus, the corresponding ray parameter is theta = s (xN[q] - f[q]), * where f[q] is the active bound of xN[q] in the current basis.) * * Elements of q-th simplex table column T[q] = (t[i,q]) corresponding * to non-basic variable xN[q] should be placed in the array locations * tcol[1], ..., tcol[m]. * * The parameter tol_piv specifies a tolerance for elements of the * simplex table column T[q]. If |t[i,q]| < tol_piv, basic variable * xB[i] is skipped, i.e. it is assumed that it does not depend on the * ray parameter theta. * * The parameters tol and tol1 specify tolerances used to increase the * choice freedom by simulating an artificial degeneracy as follows. * If beta[i] <= lB[i] + delta[i], where delta[i] = tol + tol1 |lB[i]|, * it is assumed that beta[i] is exactly the same as lB[i]. Similarly, * if beta[i] >= uB[i] - delta[i], where delta[i] = tol + tol1 |uB[i]|, * it is assumed that beta[i] is exactly the same as uB[i]. * * The routine determines the index 1 <= p <= m of basic variable xB[p] * that reaches its (lower or upper) bound first on increasing the ray * parameter theta, stores the bound flag (0 - lower bound or fixed * value, 1 - upper bound) to the location pointed to by the pointer * p_flag, and returns the index p. If non-basic variable xN[q] is * double-bounded and reaches its opposite bound first, the routine * returns (-1). And if the ray parameter may increase unlimitedly, the * routine returns zero. * * Should note that the bound flag stored to the location pointed to by * p_flag corresponds to the original (not artficial) bound of variable * xB[p] and defines the active bound flag lp->flag[q] to be set in the * adjacent basis for that basic variable. */ int spx_chuzr_std(SPXLP *lp, int phase, const double beta[/*1+m*/], int q, double s, const double tcol[/*1+m*/], int *p_flag, double tol_piv, double tol, double tol1) { int m = lp->m; int n = lp->n; double *c = lp->c; double *l = lp->l; double *u = lp->u; int *head = lp->head; int i, i_flag, k, p; double alfa, biga, delta, lk, uk, teta, teta_min; xassert(phase == 1 || phase == 2); xassert(1 <= q && q <= n-m); xassert(s == +1.0 || s == -1.0); /* determine initial teta_min */ k = head[m+q]; /* x[k] = xN[q] */ if (l[k] == -DBL_MAX || u[k] == +DBL_MAX) { /* xN[q] has no opposite bound */ p = 0, *p_flag = 0, teta_min = DBL_MAX, biga = 0.0; } else { /* xN[q] have both lower and upper bounds */ p = -1, *p_flag = 0, teta_min = fabs(l[k] - u[k]), biga = 1.0; } /* walk thru the list of basic variables */ for (i = 1; i <= m; i++) { k = head[i]; /* x[k] = xB[i] */ /* determine alfa such that delta xB[i] = alfa * teta */ alfa = s * tcol[i]; if (alfa <= -tol_piv) { /* xB[i] decreases */ /* determine actual lower bound of xB[i] */ if (phase == 1 && c[k] < 0.0) { /* xB[i] has no actual lower bound */ continue; } else if (phase == 1 && c[k] > 0.0) { /* actual lower bound of xB[i] is its upper bound */ lk = u[k]; xassert(lk != +DBL_MAX); i_flag = 1; } else { /* actual lower bound of xB[i] is its original bound */ lk = l[k]; if (lk == -DBL_MAX) continue; i_flag = 0; } /* determine teta on which xB[i] reaches its lower bound */ delta = tol + tol1 * (lk >= 0.0 ? +lk : -lk); if (beta[i] <= lk + delta) teta = 0.0; else teta = (lk - beta[i]) / alfa; } else if (alfa >= +tol_piv) { /* xB[i] increases */ /* determine actual upper bound of xB[i] */ if (phase == 1 && c[k] < 0.0) { /* actual upper bound of xB[i] is its lower bound */ uk = l[k]; xassert(uk != -DBL_MAX); i_flag = 0; } else if (phase == 1 && c[k] > 0.0) { /* xB[i] has no actual upper bound */ continue; } else { /* actual upper bound of xB[i] is its original bound */ uk = u[k]; if (uk == +DBL_MAX) continue; i_flag = 1; } /* determine teta on which xB[i] reaches its upper bound */ delta = tol + tol1 * (uk >= 0.0 ? +uk : -uk); if (beta[i] >= uk - delta) teta = 0.0; else teta = (uk - beta[i]) / alfa; } else { /* xB[i] does not depend on teta */ continue; } /* choose basic variable xB[p] for which teta is minimal */ xassert(teta >= 0.0); alfa = (alfa >= 0.0 ? +alfa : -alfa); if (teta_min > teta || (teta_min == teta && biga < alfa)) p = i, *p_flag = i_flag, teta_min = teta, biga = alfa; } /* if xB[p] is fixed variable, adjust its bound flag */ if (p > 0) { k = head[p]; if (l[k] == u[k]) *p_flag = 0; } return p; } /*********************************************************************** * spx_chuzr_harris - choose basic variable (Harris' ratio test) * * This routine implements Harris' ratio test to choose basic variable * xB[p]. * * All the parameters, except tol and tol1, as well as the returned * value have the same meaning as for the routine spx_chuzr_std (see * above). * * The parameters tol and tol1 specify tolerances on bound violations * for basic variables. For the lower bound of basic variable xB[i] the * tolerance is delta[i] = tol + tol1 |lB[i]|, and for the upper bound * the tolerance is delta[i] = tol + tol1 |uB[i]|. */ int spx_chuzr_harris(SPXLP *lp, int phase, const double beta[/*1+m*/], int q, double s, const double tcol[/*1+m*/], int *p_flag, double tol_piv, double tol, double tol1) { int m = lp->m; int n = lp->n; double *c = lp->c; double *l = lp->l; double *u = lp->u; int *head = lp->head; int i, i_flag, k, p; double alfa, biga, delta, lk, uk, teta, teta_min; xassert(phase == 1 || phase == 2); xassert(1 <= q && q <= n-m); xassert(s == +1.0 || s == -1.0); /*--------------------------------------------------------------*/ /* first pass: determine teta_min for relaxed bounds */ /*--------------------------------------------------------------*/ teta_min = DBL_MAX; /* walk thru the list of basic variables */ for (i = 1; i <= m; i++) { k = head[i]; /* x[k] = xB[i] */ /* determine alfa such that delta xB[i] = alfa * teta */ alfa = s * tcol[i]; if (alfa <= -tol_piv) { /* xB[i] decreases */ /* determine actual lower bound of xB[i] */ if (phase == 1 && c[k] < 0.0) { /* xB[i] has no actual lower bound */ continue; } else if (phase == 1 && c[k] > 0.0) { /* actual lower bound of xB[i] is its upper bound */ lk = u[k]; xassert(lk != +DBL_MAX); } else { /* actual lower bound of xB[i] is its original bound */ lk = l[k]; if (lk == -DBL_MAX) continue; } /* determine teta on which xB[i] reaches its relaxed lower * bound */ delta = tol + tol1 * (lk >= 0.0 ? +lk : -lk); if (beta[i] < lk) teta = - delta / alfa; else teta = ((lk - delta) - beta[i]) / alfa; } else if (alfa >= +tol_piv) { /* xB[i] increases */ /* determine actual upper bound of xB[i] */ if (phase == 1 && c[k] < 0.0) { /* actual upper bound of xB[i] is its lower bound */ uk = l[k]; xassert(uk != -DBL_MAX); } else if (phase == 1 && c[k] > 0.0) { /* xB[i] has no actual upper bound */ continue; } else { /* actual upper bound of xB[i] is its original bound */ uk = u[k]; if (uk == +DBL_MAX) continue; } /* determine teta on which xB[i] reaches its relaxed upper * bound */ delta = tol + tol1 * (uk >= 0.0 ? +uk : -uk); if (beta[i] > uk) teta = + delta / alfa; else teta = ((uk + delta) - beta[i]) / alfa; } else { /* xB[i] does not depend on teta */ continue; } xassert(teta >= 0.0); if (teta_min > teta) teta_min = teta; } /*--------------------------------------------------------------*/ /* second pass: choose basic variable xB[p] */ /*--------------------------------------------------------------*/ k = head[m+q]; /* x[k] = xN[q] */ if (l[k] != -DBL_MAX && u[k] != +DBL_MAX) { /* xN[q] has both lower and upper bounds */ if (fabs(l[k] - u[k]) <= teta_min) { /* and reaches its opposite bound */ p = -1, *p_flag = 0; goto done; } } if (teta_min == DBL_MAX) { /* teta may increase unlimitedly */ p = 0, *p_flag = 0; goto done; } /* nothing is chosen so far */ p = 0, *p_flag = 0, biga = 0.0; /* walk thru the list of basic variables */ for (i = 1; i <= m; i++) { k = head[i]; /* x[k] = xB[i] */ /* determine alfa such that delta xB[i] = alfa * teta */ alfa = s * tcol[i]; if (alfa <= -tol_piv) { /* xB[i] decreases */ /* determine actual lower bound of xB[i] */ if (phase == 1 && c[k] < 0.0) { /* xB[i] has no actual lower bound */ continue; } else if (phase == 1 && c[k] > 0.0) { /* actual lower bound of xB[i] is its upper bound */ lk = u[k]; xassert(lk != +DBL_MAX); i_flag = 1; } else { /* actual lower bound of xB[i] is its original bound */ lk = l[k]; if (lk == -DBL_MAX) continue; i_flag = 0; } /* determine teta on which xB[i] reaches its lower bound */ teta = (lk - beta[i]) / alfa; } else if (alfa >= +tol_piv) { /* xB[i] increases */ /* determine actual upper bound of xB[i] */ if (phase == 1 && c[k] < 0.0) { /* actual upper bound of xB[i] is its lower bound */ uk = l[k]; xassert(uk != -DBL_MAX); i_flag = 0; } else if (phase == 1 && c[k] > 0.0) { /* xB[i] has no actual upper bound */ continue; } else { /* actual upper bound of xB[i] is its original bound */ uk = u[k]; if (uk == +DBL_MAX) continue; i_flag = 1; } /* determine teta on which xB[i] reaches its upper bound */ teta = (uk - beta[i]) / alfa; } else { /* xB[i] does not depend on teta */ continue; } /* choose basic variable for which teta is not greater than * teta_min determined for relaxed bounds and which has best * (largest in magnitude) pivot */ alfa = (alfa >= 0.0 ? +alfa : -alfa); if (teta <= teta_min && biga < alfa) p = i, *p_flag = i_flag, biga = alfa; } /* something must be chosen */ xassert(1 <= p && p <= m); /* if xB[p] is fixed variable, adjust its bound flag */ k = head[p]; if (l[k] == u[k]) *p_flag = 0; done: return p; } #if 1 /* 22/VI-2017 */ /*********************************************************************** * spx_ls_eval_bp - determine penalty function break points * * This routine determines break points of the penalty function (which * is the sum of primal infeasibilities). * * The parameters lp, beta, q, dq, tcol, and tol_piv have the same * meaning as for the routine spx_chuzr_std (see above). * * The routine stores the break-points determined to the array elements * bp[1], ..., bp[nbp] in *arbitrary* order, where 0 <= nbp <= 2*m+1 is * the number of break-points returned by the routine on exit. */ int spx_ls_eval_bp(SPXLP *lp, const double beta[/*1+m*/], int q, double dq, const double tcol[/*1+m*/], double tol_piv, SPXBP bp[/*1+2*m+1*/]) { int m = lp->m; int n = lp->n; double *c = lp->c; double *l = lp->l; double *u = lp->u; int *head = lp->head; int i, k, nbp; double s, alfa; xassert(1 <= q && q <= n-m); xassert(dq != 0.0); s = (dq < 0.0 ? +1.0 : -1.0); nbp = 0; /* if chosen non-basic variable xN[q] is double-bounded, include * it in the list, because it can cross its opposite bound */ k = head[m+q]; /* x[k] = xN[q] */ if (l[k] != -DBL_MAX && u[k] != +DBL_MAX) { nbp++; bp[nbp].i = 0; xassert(l[k] < u[k]); /* xN[q] cannot be fixed */ bp[nbp].teta = u[k] - l[k]; bp[nbp].dc = s; } /* build the list of all basic variables xB[i] that can cross * their bound(s) for the ray parameter 0 <= teta < teta_max */ for (i = 1; i <= m; i++) { k = head[i]; /* x[k] = xB[i] */ xassert(l[k] <= u[k]); /* determine alfa such that (delta xB[i]) = alfa * teta */ alfa = s * tcol[i]; if (alfa >= +tol_piv) { /* xB[i] increases on increasing teta */ if (l[k] == u[k]) { /* xB[i] is fixed at lB[i] = uB[i] */ if (c[k] <= 0.0) { /* increasing xB[i] can cross its fixed value lB[i], * because currently xB[i] <= lB[i] */ nbp++; bp[nbp].i = +i; bp[nbp].teta = (l[k] - beta[i]) / alfa; /* if xB[i] > lB[i] then cB[i] = +1 */ bp[nbp].dc = +1.0 - c[k]; } } else { if (l[k] != -DBL_MAX && c[k] < 0.0) { /* increasing xB[i] can cross its lower bound lB[i], * because currently xB[i] < lB[i] */ nbp++; bp[nbp].i = +i; bp[nbp].teta = (l[k] - beta[i]) / alfa; bp[nbp].dc = +1.0; } if (u[k] != +DBL_MAX && c[k] <= 0.0) { /* increasing xB[i] can cross its upper bound uB[i], * because currently xB[i] does not violate it */ nbp++; bp[nbp].i = -i; bp[nbp].teta = (u[k] - beta[i]) / alfa; bp[nbp].dc = +1.0; } } } else if (alfa <= -tol_piv) { /* xB[i] decreases on increasing teta */ if (l[k] == u[k]) { /* xB[i] is fixed at lB[i] = uB[i] */ if (c[k] >= 0.0) { /* decreasing xB[i] can cross its fixed value lB[i], * because currently xB[i] >= lB[i] */ nbp++; bp[nbp].i = +i; bp[nbp].teta = (l[k] - beta[i]) / alfa; /* if xB[i] < lB[i] then cB[i] = -1 */ bp[nbp].dc = -1.0 - c[k]; } } else { if (l[k] != -DBL_MAX && c[k] >= 0.0) { /* decreasing xB[i] can cross its lower bound lB[i], * because currently xB[i] does not violate it */ nbp++; bp[nbp].i = +i; bp[nbp].teta = (l[k] - beta[i]) / alfa; bp[nbp].dc = -1.0; } if (u[k] != +DBL_MAX && c[k] > 0.0) { /* decreasing xB[i] can cross its upper bound uB[i], * because currently xB[i] > uB[i] */ nbp++; bp[nbp].i = -i; bp[nbp].teta = (u[k] - beta[i]) / alfa; bp[nbp].dc = -1.0; } } } else { /* xB[i] does not depend on teta within a tolerance */ continue; } /* teta < 0 may happen only due to round-off errors when the * current value of xB[i] is *close* to its (lower or upper) * bound; in this case we replace teta by exact zero */ if (bp[nbp].teta < 0.0) bp[nbp].teta = 0.0; } xassert(nbp <= 2*m+1); return nbp; } #endif #if 1 /* 22/VI-2017 */ /*********************************************************************** * spx_ls_select_bp - select and process penalty function break points * * This routine selects a next portion of the penalty function break * points and processes them. * * On entry to the routine it is assumed that break points bp[1], ..., * bp[num] are already processed, and slope is the penalty function * slope to the right of the last processed break point bp[num]. * (Initially, when num = 0, slope should be specified as -fabs(d[q]), * where d[q] is the reduced cost of chosen non-basic variable xN[q].) * * The routine selects break points among bp[num+1], ..., bp[nbp], for * which teta <= teta_lim, and moves these break points to the array * elements bp[num+1], ..., bp[num1], where num <= num1 <= 2*m+1 is the * new number of processed break points returned by the routine on * exit. Then the routine sorts the break points by ascending teta and * computes the change of the penalty function relative to its value at * teta = 0. * * On exit the routine also replaces the parameter slope with a new * value that corresponds to the new last break-point bp[num1]. */ static int CDECL fcmp(const void *v1, const void *v2) { const SPXBP *p1 = v1, *p2 = v2; if (p1->teta < p2->teta) return -1; else if (p1->teta > p2->teta) return +1; else return 0; } int spx_ls_select_bp(SPXLP *lp, const double tcol[/*1+m*/], int nbp, SPXBP bp[/*1+m+m+1*/], int num, double *slope, double teta_lim) { int m = lp->m; int i, t, num1; double teta, dz; xassert(0 <= num && num <= nbp && nbp <= m+m+1); /* select a new portion of break points */ num1 = num; for (t = num+1; t <= nbp; t++) { if (bp[t].teta <= teta_lim) { /* move break point to the beginning of the new portion */ num1++; i = bp[num1].i, teta = bp[num1].teta, dz = bp[num1].dc; bp[num1].i = bp[t].i, bp[num1].teta = bp[t].teta, bp[num1].dc = bp[t].dc; bp[t].i = i, bp[t].teta = teta, bp[t].dc = dz; } } /* sort new break points bp[num+1], ..., bp[num1] by ascending * the ray parameter teta */ if (num1 - num > 1) qsort(&bp[num+1], num1 - num, sizeof(SPXBP), fcmp); /* calculate the penalty function change at the new break points * selected */ for (t = num+1; t <= num1; t++) { /* calculate the penalty function change relative to its value * at break point bp[t-1] */ dz = (*slope) * (bp[t].teta - (t == 1 ? 0.0 : bp[t-1].teta)); /* calculate the penalty function change relative to its value * at teta = 0 */ bp[t].dz = (t == 1 ? 0.0 : bp[t-1].dz) + dz; /* calculate a new slope of the penalty function to the right * of the current break point bp[t] */ i = (bp[t].i >= 0 ? bp[t].i : -bp[t].i); xassert(0 <= i && i <= m); if (i == 0) *slope += fabs(1.0 * bp[t].dc); else *slope += fabs(tcol[i] * bp[t].dc); } return num1; } #endif /* eof */ glpk-5.0/src/simplex/spxchuzr.h0000644000062000006210000000536013766346220016015 0ustar maomkpasswd/* spxchuzr.h */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2015-2017 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef SPXCHUZR_H #define SPXCHUZR_H #include "spxlp.h" #define spx_chuzr_std _glp_spx_chuzr_std int spx_chuzr_std(SPXLP *lp, int phase, const double beta[/*1+m*/], int q, double s, const double tcol[/*1+m*/], int *p_flag, double tol_piv, double tol, double tol1); /* choose basic variable (textbook ratio test) */ #define spx_chuzr_harris _glp_spx_chuzr_harris int spx_chuzr_harris(SPXLP *lp, int phase, const double beta[/*1+m*/], int q, double s, const double tcol[/*1+m*/], int *p_flag, double tol_piv, double tol, double tol1); /* choose basic variable (Harris' ratio test) */ #if 1 /* 22/VI-2017 */ typedef struct SPXBP SPXBP; struct SPXBP { /* penalty function (sum of infeasibilities) break point */ int i; /* basic variable xB[i], 1 <= i <= m, that intersects its bound * at this break point * i > 0 if xB[i] intersects its lower bound (or fixed value) * i < 0 if xB[i] intersects its upper bound * i = 0 if xN[q] intersects its opposite bound */ double teta; /* ray parameter value, teta >= 0, at this break point */ double dc; /* increment of the penalty function coefficient cB[i] at this * break point */ double dz; /* increment, z[t] - z[0], of the penalty function at this break * point */ }; #define spx_ls_eval_bp _glp_spx_ls_eval_bp int spx_ls_eval_bp(SPXLP *lp, const double beta[/*1+m*/], int q, double dq, const double tcol[/*1+m*/], double tol_piv, SPXBP bp[/*1+2*m+1*/]); /* determine penalty function break points */ #define spx_ls_select_bp _glp_spx_ls_select_bp int spx_ls_select_bp(SPXLP *lp, const double tcol[/*1+m*/], int nbp, SPXBP bp[/*1+m+m+1*/], int num, double *slope, double teta_lim); /* select and process penalty function break points */ #endif #endif /* eof */ glpk-5.0/src/simplex/spxlp.c0000644000062000006210000006661013766346220015275 0ustar maomkpasswd/* spxlp.c */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2015 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "spxlp.h" /*********************************************************************** * spx_factorize - compute factorization of current basis matrix * * This routine computes factorization of the current basis matrix B. * * If the factorization has been successfully computed, the routine * validates it and returns zero. Otherwise, the routine invalidates * the factorization and returns the code provided by the factorization * driver (bfd_factorize). */ static int jth_col(void *info, int j, int ind[], double val[]) { /* provide column B[j] */ SPXLP *lp = info; int m = lp->m; int *A_ptr = lp->A_ptr; int *head = lp->head; int k, ptr, len; xassert(1 <= j && j <= m); k = head[j]; /* x[k] = xB[j] */ ptr = A_ptr[k]; len = A_ptr[k+1] - ptr; memcpy(&ind[1], &lp->A_ind[ptr], len * sizeof(int)); memcpy(&val[1], &lp->A_val[ptr], len * sizeof(double)); return len; } int spx_factorize(SPXLP *lp) { int ret; ret = bfd_factorize(lp->bfd, lp->m, jth_col, lp); lp->valid = (ret == 0); return ret; } /*********************************************************************** * spx_eval_beta - compute current values of basic variables * * This routine computes vector beta = (beta[i]) of current values of * basic variables xB = (xB[i]). (Factorization of the current basis * matrix should be valid.) * * First the routine computes a modified vector of right-hand sides: * * n-m * y = b - N * f = b - sum N[j] * f[j], * j=1 * * where b = (b[i]) is the original vector of right-hand sides, N is * a matrix composed from columns of the original constraint matrix A, * which (columns) correspond to non-basic variables, f = (f[j]) is the * vector of active bounds of non-basic variables xN = (xN[j]), * N[j] = A[k] is a column of matrix A corresponding to non-basic * variable xN[j] = x[k], f[j] is current active bound lN[j] = l[k] or * uN[j] = u[k] of non-basic variable xN[j] = x[k]. The matrix-vector * product N * f is computed as a linear combination of columns of N, * so if f[j] = 0, column N[j] can be skipped. * * Then the routine performs FTRAN to compute the vector beta: * * beta = inv(B) * y. * * On exit the routine stores components of the vector beta to array * locations beta[1], ..., beta[m]. */ void spx_eval_beta(SPXLP *lp, double beta[/*1+m*/]) { int m = lp->m; int n = lp->n; int *A_ptr = lp->A_ptr; int *A_ind = lp->A_ind; double *A_val = lp->A_val; double *b = lp->b; double *l = lp->l; double *u = lp->u; int *head = lp->head; char *flag = lp->flag; int j, k, ptr, end; double fj, *y; /* compute y = b - N * xN */ /* y := b */ y = beta; memcpy(&y[1], &b[1], m * sizeof(double)); /* y := y - N * f */ for (j = 1; j <= n-m; j++) { k = head[m+j]; /* x[k] = xN[j] */ /* f[j] := active bound of xN[j] */ fj = flag[j] ? u[k] : l[k]; if (fj == 0.0 || fj == -DBL_MAX) { /* either xN[j] has zero active bound or it is unbounded; * in the latter case its value is assumed to be zero */ continue; } /* y := y - N[j] * f[j] */ ptr = A_ptr[k]; end = A_ptr[k+1]; for (; ptr < end; ptr++) y[A_ind[ptr]] -= A_val[ptr] * fj; } /* compute beta = inv(B) * y */ xassert(lp->valid); bfd_ftran(lp->bfd, beta); return; } /*********************************************************************** * spx_eval_obj - compute current value of objective function * * This routine computes the value of the objective function in the * current basic solution: * * z = cB'* beta + cN'* f + c[0] = * * m n-m * = sum cB[i] * beta[i] + sum cN[j] * f[j] + c[0], * i=1 j=1 * * where cB = (cB[i]) is the vector of objective coefficients at basic * variables, beta = (beta[i]) is the vector of current values of basic * variables, cN = (cN[j]) is the vector of objective coefficients at * non-basic variables, f = (f[j]) is the vector of current active * bounds of non-basic variables, c[0] is the constant term of the * objective function. * * It as assumed that components of the vector beta are stored in the * array locations beta[1], ..., beta[m]. */ double spx_eval_obj(SPXLP *lp, const double beta[/*1+m*/]) { int m = lp->m; int n = lp->n; double *c = lp->c; double *l = lp->l; double *u = lp->u; int *head = lp->head; char *flag = lp->flag; int i, j, k; double fj, z; /* compute z = cB'* beta + cN'* f + c0 */ /* z := c0 */ z = c[0]; /* z := z + cB'* beta */ for (i = 1; i <= m; i++) { k = head[i]; /* x[k] = xB[i] */ z += c[k] * beta[i]; } /* z := z + cN'* f */ for (j = 1; j <= n-m; j++) { k = head[m+j]; /* x[k] = xN[j] */ /* f[j] := active bound of xN[j] */ fj = flag[j] ? u[k] : l[k]; if (fj == 0.0 || fj == -DBL_MAX) { /* either xN[j] has zero active bound or it is unbounded; * in the latter case its value is assumed to be zero */ continue; } z += c[k] * fj; } return z; } /*********************************************************************** * spx_eval_pi - compute simplex multipliers in current basis * * This routine computes vector pi = (pi[i]) of simplex multipliers in * the current basis. (Factorization of the current basis matrix should * be valid.) * * The vector pi is computed by performing BTRAN: * * pi = inv(B') * cB, * * where cB = (cB[i]) is the vector of objective coefficients at basic * variables xB = (xB[i]). * * On exit components of vector pi are stored in the array locations * pi[1], ..., pi[m]. */ void spx_eval_pi(SPXLP *lp, double pi[/*1+m*/]) { int m = lp->m; double *c = lp->c; int *head = lp->head; int i; double *cB; /* construct cB */ cB = pi; for (i = 1; i <= m; i++) cB[i] = c[head[i]]; /* compute pi = inv(B) * cB */ bfd_btran(lp->bfd, pi); return; } /*********************************************************************** * spx_eval_dj - compute reduced cost of j-th non-basic variable * * This routine computes reduced cost d[j] of non-basic variable * xN[j] = x[k], 1 <= j <= n-m, in the current basic solution: * * d[j] = c[k] - A'[k] * pi, * * where c[k] is the objective coefficient at x[k], A[k] is k-th column * of the constraint matrix, pi is the vector of simplex multipliers in * the current basis. * * It as assumed that components of the vector pi are stored in the * array locations pi[1], ..., pi[m]. */ double spx_eval_dj(SPXLP *lp, const double pi[/*1+m*/], int j) { int m = lp->m; int n = lp->n; int *A_ptr = lp->A_ptr; int *A_ind = lp->A_ind; double *A_val = lp->A_val; int k, ptr, end; double dj; xassert(1 <= j && j <= n-m); k = lp->head[m+j]; /* x[k] = xN[j] */ /* dj := c[k] */ dj = lp->c[k]; /* dj := dj - A'[k] * pi */ ptr = A_ptr[k]; end = A_ptr[k+1]; for (; ptr < end; ptr++) dj -= A_val[ptr] * pi[A_ind[ptr]]; return dj; } /*********************************************************************** * spx_eval_tcol - compute j-th column of simplex table * * This routine computes j-th column of the current simplex table * T = (T[i,j]) = - inv(B) * N, 1 <= j <= n-m. (Factorization of the * current basis matrix should be valid.) * * The simplex table column is computed by performing FTRAN: * * tcol = - inv(B) * N[j], * * where B is the current basis matrix, N[j] = A[k] is a column of the * constraint matrix corresponding to non-basic variable xN[j] = x[k]. * * On exit components of the simplex table column are stored in the * array locations tcol[1], ... tcol[m]. */ void spx_eval_tcol(SPXLP *lp, int j, double tcol[/*1+m*/]) { int m = lp->m; int n = lp->n; int *A_ptr = lp->A_ptr; int *A_ind = lp->A_ind; double *A_val = lp->A_val; int *head = lp->head; int i, k, ptr, end; xassert(1 <= j && j <= n-m); k = head[m+j]; /* x[k] = xN[j] */ /* compute tcol = - inv(B) * N[j] */ for (i = 1; i <= m; i++) tcol[i] = 0.0; ptr = A_ptr[k]; end = A_ptr[k+1]; for (; ptr < end; ptr++) tcol[A_ind[ptr]] = -A_val[ptr]; bfd_ftran(lp->bfd, tcol); return; } /*********************************************************************** * spx_eval_rho - compute i-th row of basis matrix inverse * * This routine computes i-th row of the matrix inv(B), where B is * the current basis matrix, 1 <= i <= m. (Factorization of the current * basis matrix should be valid.) * * The inverse row is computed by performing BTRAN: * * rho = inv(B') * e[i], * * where e[i] is i-th column of unity matrix. * * On exit components of the row are stored in the array locations * row[1], ..., row[m]. */ void spx_eval_rho(SPXLP *lp, int i, double rho[/*1+m*/]) { int m = lp->m; int j; xassert(1 <= i && i <= m); /* compute rho = inv(B') * e[i] */ for (j = 1; j <= m; j++) rho[j] = 0.0; rho[i] = 1.0; bfd_btran(lp->bfd, rho); return; } #if 1 /* 31/III-2016 */ void spx_eval_rho_s(SPXLP *lp, int i, FVS *rho) { /* sparse version of spx_eval_rho */ int m = lp->m; xassert(1 <= i && i <= m); /* compute rho = inv(B') * e[i] */ xassert(rho->n == m); fvs_clear_vec(rho); rho->nnz = 1; rho->ind[1] = i; rho->vec[i] = 1.0; bfd_btran_s(lp->bfd, rho); return; } #endif /*********************************************************************** * spx_eval_tij - compute element T[i,j] of simplex table * * This routine computes element T[i,j] of the current simplex table * T = - inv(B) * N, 1 <= i <= m, 1 <= j <= n-m, with the following * formula: * * T[i,j] = - N'[j] * rho, (1) * * where N[j] = A[k] is a column of the constraint matrix corresponding * to non-basic variable xN[j] = x[k], rho is i-th row of the inverse * matrix inv(B). * * It as assumed that components of the inverse row rho = (rho[j]) are * stored in the array locations rho[1], ..., rho[m]. */ double spx_eval_tij(SPXLP *lp, const double rho[/*1+m*/], int j) { int m = lp->m; int n = lp->n; int *A_ptr = lp->A_ptr; int *A_ind = lp->A_ind; double *A_val = lp->A_val; int k, ptr, end; double tij; xassert(1 <= j && j <= n-m); k = lp->head[m+j]; /* x[k] = xN[j] */ /* compute t[i,j] = - N'[j] * pi */ tij = 0.0; ptr = A_ptr[k]; end = A_ptr[k+1]; for (; ptr < end; ptr++) tij -= A_val[ptr] * rho[A_ind[ptr]]; return tij; } /*********************************************************************** * spx_eval_trow - compute i-th row of simplex table * * This routine computes i-th row of the current simplex table * T = (T[i,j]) = - inv(B) * N, 1 <= i <= m. * * Elements of the row T[i] = (T[i,j]), j = 1, ..., n-m, are computed * directly with the routine spx_eval_tij. * * The vector rho = (rho[j]), which is i-th row of the basis inverse * inv(B), should be previously computed with the routine spx_eval_rho. * It is assumed that elements of this vector are stored in the array * locations rho[1], ..., rho[m]. * * On exit components of the simplex table row are stored in the array * locations trow[1], ... trow[n-m]. * * NOTE: For testing/debugging only. */ void spx_eval_trow(SPXLP *lp, const double rho[/*1+m*/], double trow[/*1+n-m*/]) { int m = lp->m; int n = lp->n; int j; for (j = 1; j <= n-m; j++) trow[j] = spx_eval_tij(lp, rho, j); return; } /*********************************************************************** * spx_update_beta - update values of basic variables * * This routine updates the vector beta = (beta[i]) of values of basic * variables xB = (xB[i]) for the adjacent basis. * * On entry to the routine components of the vector beta in the current * basis should be placed in array locations beta[1], ..., beta[m]. * * The parameter 1 <= p <= m specifies basic variable xB[p] which * becomes non-basic variable xN[q] in the adjacent basis. The special * case p < 0 means that non-basic variable xN[q] goes from its current * active bound to opposite one in the adjacent basis. * * If the flag p_flag is set, the active bound of xB[p] in the adjacent * basis is set to its upper bound. (In this case xB[p] should have its * upper bound and should not be fixed.) * * The parameter 1 <= q <= n-m specifies non-basic variable xN[q] which * becomes basic variable xB[p] in the adjacent basis (if 1 <= p <= m), * or goes to its opposite bound (if p < 0). (In the latter case xN[q] * should have both lower and upper bounds and should not be fixed.) * * It is assumed that the array tcol contains elements of q-th (pivot) * column T[q] of the simple table in locations tcol[1], ..., tcol[m]. * (This column should be computed for the current basis.) * * First, the routine determines the increment of basic variable xB[p] * in the adjacent basis (but only if 1 <= p <= m): * * ( - beta[p], if -inf < xB[p] < +inf * ( * delta xB[p] = { lB[p] - beta[p], if p_flag = 0 * ( * ( uB[p] - beta[p], if p_flag = 1 * * where beta[p] is the value of xB[p] in the current basis, lB[p] and * uB[p] are its lower and upper bounds. Then, the routine determines * the increment of non-basic variable xN[q] in the adjacent basis: * * ( delta xB[p] / T[p,q], if 1 <= p <= m * ( * delta xN[q] = { uN[q] - lN[q], if p < 0 and f[q] = lN[q] * ( * ( lN[q] - uN[q], if p < 0 and f[q] = uN[q] * * where T[p,q] is the pivot element of the simplex table, f[q] is the * active bound of xN[q] in the current basis. * * If 1 <= p <= m, in the adjacent basis xN[q] becomes xB[p], so: * * new beta[p] = f[q] + delta xN[q]. * * Values of other basic variables xB[i] for 1 <= i <= m, i != p, are * updated as follows: * * new beta[i] = beta[i] + T[i,q] * delta xN[q]. * * On exit the routine stores updated components of the vector beta to * the same locations, where the input vector beta was stored. */ void spx_update_beta(SPXLP *lp, double beta[/*1+m*/], int p, int p_flag, int q, const double tcol[/*1+m*/]) { int m = lp->m; int n = lp->n; double *l = lp->l; double *u = lp->u; int *head = lp->head; char *flag = lp->flag; int i, k; double delta_p, delta_q; if (p < 0) { /* special case: xN[q] goes to its opposite bound */ xassert(1 <= q && q <= n-m); /* xN[q] should be double-bounded variable */ k = head[m+q]; /* x[k] = xN[q] */ xassert(l[k] != -DBL_MAX && u[k] != +DBL_MAX && l[k] != u[k]); /* determine delta xN[q] */ if (flag[q]) { /* xN[q] goes from its upper bound to its lower bound */ delta_q = l[k] - u[k]; } else { /* xN[q] goes from its lower bound to its upper bound */ delta_q = u[k] - l[k]; } } else { /* xB[p] leaves the basis, xN[q] enters the basis */ xassert(1 <= p && p <= m); xassert(1 <= q && q <= n-m); /* determine delta xB[p] */ k = head[p]; /* x[k] = xB[p] */ if (p_flag) { /* xB[p] goes to its upper bound */ xassert(l[k] != u[k] && u[k] != +DBL_MAX); delta_p = u[k] - beta[p]; } else if (l[k] == -DBL_MAX) { /* unbounded xB[p] becomes non-basic (unusual case) */ xassert(u[k] == +DBL_MAX); delta_p = 0.0 - beta[p]; } else { /* xB[p] goes to its lower bound or becomes fixed */ delta_p = l[k] - beta[p]; } /* determine delta xN[q] */ delta_q = delta_p / tcol[p]; /* compute new beta[p], which is the value of xN[q] in the * adjacent basis */ k = head[m+q]; /* x[k] = xN[q] */ if (flag[q]) { /* xN[q] has its upper bound active */ xassert(l[k] != u[k] && u[k] != +DBL_MAX); beta[p] = u[k] + delta_q; } else if (l[k] == -DBL_MAX) { /* xN[q] is non-basic unbounded variable */ xassert(u[k] == +DBL_MAX); beta[p] = 0.0 + delta_q; } else { /* xN[q] has its lower bound active or is fixed (latter * case is unusual) */ beta[p] = l[k] + delta_q; } } /* compute new beta[i] for all i != p */ for (i = 1; i <= m; i++) { if (i != p) beta[i] += tcol[i] * delta_q; } return; } #if 1 /* 30/III-2016 */ void spx_update_beta_s(SPXLP *lp, double beta[/*1+m*/], int p, int p_flag, int q, const FVS *tcol) { /* sparse version of spx_update_beta */ int m = lp->m; int n = lp->n; double *l = lp->l; double *u = lp->u; int *head = lp->head; char *flag = lp->flag; int nnz = tcol->nnz; int *ind = tcol->ind; double *vec = tcol->vec; int i, k; double delta_p, delta_q; xassert(tcol->n == m); if (p < 0) { /* special case: xN[q] goes to its opposite bound */ #if 0 /* 11/VI-2017 */ /* FIXME: not tested yet */ xassert(0); #endif xassert(1 <= q && q <= n-m); /* xN[q] should be double-bounded variable */ k = head[m+q]; /* x[k] = xN[q] */ xassert(l[k] != -DBL_MAX && u[k] != +DBL_MAX && l[k] != u[k]); /* determine delta xN[q] */ if (flag[q]) { /* xN[q] goes from its upper bound to its lower bound */ delta_q = l[k] - u[k]; } else { /* xN[q] goes from its lower bound to its upper bound */ delta_q = u[k] - l[k]; } } else { /* xB[p] leaves the basis, xN[q] enters the basis */ xassert(1 <= p && p <= m); xassert(1 <= q && q <= n-m); /* determine delta xB[p] */ k = head[p]; /* x[k] = xB[p] */ if (p_flag) { /* xB[p] goes to its upper bound */ xassert(l[k] != u[k] && u[k] != +DBL_MAX); delta_p = u[k] - beta[p]; } else if (l[k] == -DBL_MAX) { /* unbounded xB[p] becomes non-basic (unusual case) */ xassert(u[k] == +DBL_MAX); delta_p = 0.0 - beta[p]; } else { /* xB[p] goes to its lower bound or becomes fixed */ delta_p = l[k] - beta[p]; } /* determine delta xN[q] */ delta_q = delta_p / vec[p]; /* compute new beta[p], which is the value of xN[q] in the * adjacent basis */ k = head[m+q]; /* x[k] = xN[q] */ if (flag[q]) { /* xN[q] has its upper bound active */ xassert(l[k] != u[k] && u[k] != +DBL_MAX); beta[p] = u[k] + delta_q; } else if (l[k] == -DBL_MAX) { /* xN[q] is non-basic unbounded variable */ xassert(u[k] == +DBL_MAX); beta[p] = 0.0 + delta_q; } else { /* xN[q] has its lower bound active or is fixed (latter * case is unusual) */ beta[p] = l[k] + delta_q; } } /* compute new beta[i] for all i != p */ for (k = 1; k <= nnz; k++) { i = ind[k]; if (i != p) beta[i] += vec[i] * delta_q; } return; } #endif /*********************************************************************** * spx_update_d - update reduced costs of non-basic variables * * This routine updates the vector d = (d[j]) of reduced costs of * non-basic variables xN = (xN[j]) for the adjacent basis. * * On entry to the routine components of the vector d in the current * basis should be placed in locations d[1], ..., d[n-m]. * * The parameter 1 <= p <= m specifies basic variable xB[p] which * becomes non-basic variable xN[q] in the adjacent basis. * * The parameter 1 <= q <= n-m specified non-basic variable xN[q] which * becomes basic variable xB[p] in the adjacent basis. * * It is assumed that the array trow contains elements of p-th (pivot) * row T'[p] of the simplex table in locations trow[1], ..., trow[n-m]. * It is also assumed that the array tcol contains elements of q-th * (pivot) column T[q] of the simple table in locations tcol[1], ..., * tcol[m]. (These row and column should be computed for the current * basis.) * * First, the routine computes more accurate reduced cost d[q] in the * current basis using q-th column of the simplex table: * * n-m * d[q] = cN[q] + sum t[i,q] * cB[i], * i=1 * * where cN[q] and cB[i] are objective coefficients at variables xN[q] * and xB[i], resp. The routine also computes the relative error: * * e = |d[q] - d'[q]| / (1 + |d[q]|), * * where d'[q] is the reduced cost of xN[q] on entry to the routine, * and returns e on exit. (If e happens to be large enough, the calling * program may compute the reduced costs directly, since other reduced * costs also may be inaccurate.) * * In the adjacent basis xB[p] becomes xN[q], so: * * new d[q] = d[q] / T[p,q], * * where T[p,q] is the pivot element of the simplex table (it is taken * from column T[q] as more accurate). Reduced costs of other non-basic * variables xN[j] for 1 <= j <= n-m, j != q, are updated as follows: * * new d[j] = d[j] + T[p,j] * new d[q]. * * On exit the routine stores updated components of the vector d to the * same locations, where the input vector d was stored. */ double spx_update_d(SPXLP *lp, double d[/*1+n-m*/], int p, int q, const double trow[/*1+n-m*/], const double tcol[/*1+m*/]) { int m = lp->m; int n = lp->n; double *c = lp->c; int *head = lp->head; int i, j, k; double dq, e; xassert(1 <= p && p <= m); xassert(1 <= q && q <= n); /* compute d[q] in current basis more accurately */ k = head[m+q]; /* x[k] = xN[q] */ dq = c[k]; for (i = 1; i <= m; i++) dq += tcol[i] * c[head[i]]; /* compute relative error in d[q] */ e = fabs(dq - d[q]) / (1.0 + fabs(dq)); /* compute new d[q], which is the reduced cost of xB[p] in the * adjacent basis */ d[q] = (dq /= tcol[p]); /* compute new d[j] for all j != q */ for (j = 1; j <= n-m; j++) { if (j != q) d[j] -= trow[j] * dq; } return e; } #if 1 /* 30/III-2016 */ double spx_update_d_s(SPXLP *lp, double d[/*1+n-m*/], int p, int q, const FVS *trow, const FVS *tcol) { /* sparse version of spx_update_d */ int m = lp->m; int n = lp->n; double *c = lp->c; int *head = lp->head; int trow_nnz = trow->nnz; int *trow_ind = trow->ind; double *trow_vec = trow->vec; int tcol_nnz = tcol->nnz; int *tcol_ind = tcol->ind; double *tcol_vec = tcol->vec; int i, j, k; double dq, e; xassert(1 <= p && p <= m); xassert(1 <= q && q <= n); xassert(trow->n == n-m); xassert(tcol->n == m); /* compute d[q] in current basis more accurately */ k = head[m+q]; /* x[k] = xN[q] */ dq = c[k]; for (k = 1; k <= tcol_nnz; k++) { i = tcol_ind[k]; dq += tcol_vec[i] * c[head[i]]; } /* compute relative error in d[q] */ e = fabs(dq - d[q]) / (1.0 + fabs(dq)); /* compute new d[q], which is the reduced cost of xB[p] in the * adjacent basis */ d[q] = (dq /= tcol_vec[p]); /* compute new d[j] for all j != q */ for (k = 1; k <= trow_nnz; k++) { j = trow_ind[k]; if (j != q) d[j] -= trow_vec[j] * dq; } return e; } #endif /*********************************************************************** * spx_change_basis - change current basis to adjacent one * * This routine changes the current basis to the adjacent one making * necessary changes in lp->head and lp->flag members. * * The parameters p, p_flag, and q have the same meaning as for the * routine spx_update_beta. */ void spx_change_basis(SPXLP *lp, int p, int p_flag, int q) { int m = lp->m; int n = lp->n; double *l = lp->l; double *u = lp->u; int *head = lp->head; char *flag = lp->flag; int k; if (p < 0) { /* special case: xN[q] goes to its opposite bound */ xassert(1 <= q && q <= n-m); /* xN[q] should be double-bounded variable */ k = head[m+q]; /* x[k] = xN[q] */ xassert(l[k] != -DBL_MAX && u[k] != +DBL_MAX && l[k] != u[k]); /* change active bound flag */ flag[q] = 1 - flag[q]; } else { /* xB[p] leaves the basis, xN[q] enters the basis */ xassert(1 <= p && p <= m); xassert(p_flag == 0 || p_flag == 1); xassert(1 <= q && q <= n-m); k = head[p]; /* xB[p] = x[k] */ if (p_flag) { /* xB[p] goes to its upper bound */ xassert(l[k] != u[k] && u[k] != +DBL_MAX); } /* swap xB[p] and xN[q] in the basis */ head[p] = head[m+q], head[m+q] = k; /* and set active bound flag for new xN[q] */ lp->flag[q] = p_flag; } return; } /*********************************************************************** * spx_update_invb - update factorization of basis matrix * * This routine updates factorization of the basis matrix B when i-th * column of B is replaced by k-th column of the constraint matrix A. * * The parameter 1 <= i <= m specifies the number of column of matrix B * to be replaced by a new column. * * The parameter 1 <= k <= n specifies the number of column of matrix A * to be used for replacement. * * If the factorization has been successfully updated, the routine * validates it and returns zero. Otherwise, the routine invalidates * the factorization and returns the code provided by the factorization * driver (bfd_update). */ int spx_update_invb(SPXLP *lp, int i, int k) { int m = lp->m; int n = lp->n; int *A_ptr = lp->A_ptr; int *A_ind = lp->A_ind; double *A_val = lp->A_val; int ptr, len, ret; xassert(1 <= i && i <= m); xassert(1 <= k && k <= n); ptr = A_ptr[k]; len = A_ptr[k+1] - ptr; ret = bfd_update(lp->bfd, i, len, &A_ind[ptr-1], &A_val[ptr-1]); lp->valid = (ret == 0); return ret; } /* eof */ glpk-5.0/src/simplex/spxlp.h0000644000062000006210000002111413766346220015270 0ustar maomkpasswd/* spxlp.h */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2015 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef SPXLP_H #define SPXLP_H #include "bfd.h" /*********************************************************************** * The structure SPXLP describes LP problem and its current basis. * * It is assumed that LP problem has the following formulation (this is * so called "working format"): * * z = c'* x + c0 -> min (1) * * A * x = b (2) * * l <= x <= u (3) * * where: * * x = (x[k]) is a n-vector of variables; * * z is an objective function; * * c = (c[k]) is a n-vector of objective coefficients; * * c0 is a constant term of the objective function; * * A = (a[i,k]) is a mxn-matrix of constraint coefficients; * * b = (b[i]) is a m-vector of right-hand sides; * * l = (l[k]) is a n-vector of lower bounds of variables; * * u = (u[k]) is a n-vector of upper bounds of variables. * * If variable x[k] has no lower (upper) bound, it is formally assumed * that l[k] = -inf (u[k] = +inf). Variable having no bounds is called * free (unbounded) variable. If l[k] = u[k], variable x[k] is assumed * to be fixed. * * It is also assumed that matrix A has full row rank: rank(A) = m, * i.e. all its rows are linearly independent, so m <= n. * * The (current) basis is defined by an appropriate permutation matrix * P of order n such that: * * ( xB ) * P * x = ( ), (4) * ( xN ) * * where xB = (xB[i]) is a m-vector of basic variables, xN = (xN[j]) is * a (n-m)-vector of non-basic variables. If a non-basic variable xN[j] * has both lower and upper bounds, there is used an additional flag to * indicate which bound is active. * * From (2) and (4) it follows that: * * A * P'* P * x = b <=> B * xB + N * xN = b, (5) * * where P' is a matrix transposed to P, and * * A * P' = (B | N). (6) * * Here B is the basis matrix, which is a square non-singular matrix * of order m composed from columns of matrix A that correspond to * basic variables xB, and N is a mx(n-m) matrix composed from columns * of matrix A that correspond to non-basic variables xN. */ typedef struct SPXLP SPXLP; struct SPXLP { /* LP problem data and its (current) basis */ int m; /* number of equality constraints, m > 0 */ int n; /* number of variables, n >= m */ int nnz; /* number of non-zeros in constraint matrix A */ /*--------------------------------------------------------------*/ /* mxn-matrix A of constraint coefficients in sparse column-wise * format */ int *A_ptr; /* int A_ptr[1+n+1]; */ /* A_ptr[0] is not used; * A_ptr[k], 1 <= k <= n, is starting position of k-th column in * arrays A_ind and A_val; note that A_ptr[1] is always 1; * A_ptr[n+1] indicates the position after the last element in * arrays A_ind and A_val, i.e. A_ptr[n+1] = nnz+1, where nnz is * the number of non-zero elements in matrix A; * the length of k-th column (the number of non-zero elements in * that column) can be calculated as A_ptr[k+1] - A_ptr[k] */ int *A_ind; /* int A_ind[1+nnz]; */ /* row indices */ double *A_val; /* double A_val[1+nnz]; */ /* non-zero element values (constraint coefficients) */ /*--------------------------------------------------------------*/ /* principal vectors of LP formulation */ double *b; /* double b[1+m]; */ /* b[0] is not used; * b[i], 1 <= i <= m, is the right-hand side of i-th equality * constraint */ double *c; /* double c[1+n]; */ /* c[0] is the constant term of the objective function; * c[k], 1 <= k <= n, is the objective function coefficient at * variable x[k] */ double *l; /* double l[1+n]; */ /* l[0] is not used; * l[k], 1 <= k <= n, is the lower bound of variable x[k]; * if x[k] has no lower bound, l[k] = -DBL_MAX */ double *u; /* double u[1+n]; */ /* u[0] is not used; * u[k], 1 <= k <= n, is the upper bound of variable u[k]; * if x[k] has no upper bound, u[k] = +DBL_MAX; * note that l[k] = u[k] means that x[k] is fixed variable */ /*--------------------------------------------------------------*/ /* LP basis */ int *head; /* int head[1+n]; */ /* basis header, which is permutation matrix P (4): * head[0] is not used; * head[i] = k means that xB[i] = x[k], 1 <= i <= m; * head[m+j] = k, means that xN[j] = x[k], 1 <= j <= n-m */ char *flag; /* char flag[1+n-m]; */ /* flags of non-basic variables: * flag[0] is not used; * flag[j], 1 <= j <= n-m, indicates that non-basic variable * xN[j] is non-fixed and has its upper bound active */ /*--------------------------------------------------------------*/ /* basis matrix B of order m stored in factorized form */ int valid; /* factorization validity flag */ BFD *bfd; /* driver to factorization of the basis matrix */ }; #define spx_factorize _glp_spx_factorize int spx_factorize(SPXLP *lp); /* compute factorization of current basis matrix */ #define spx_eval_beta _glp_spx_eval_beta void spx_eval_beta(SPXLP *lp, double beta[/*1+m*/]); /* compute values of basic variables */ #define spx_eval_obj _glp_spx_eval_obj double spx_eval_obj(SPXLP *lp, const double beta[/*1+m*/]); /* compute value of objective function */ #define spx_eval_pi _glp_spx_eval_pi void spx_eval_pi(SPXLP *lp, double pi[/*1+m*/]); /* compute simplex multipliers */ #define spx_eval_dj _glp_spx_eval_dj double spx_eval_dj(SPXLP *lp, const double pi[/*1+m*/], int j); /* compute reduced cost of j-th non-basic variable */ #define spx_eval_tcol _glp_spx_eval_tcol void spx_eval_tcol(SPXLP *lp, int j, double tcol[/*1+m*/]); /* compute j-th column of simplex table */ #define spx_eval_rho _glp_spx_eval_rho void spx_eval_rho(SPXLP *lp, int i, double rho[/*1+m*/]); /* compute i-th row of basis matrix inverse */ #if 1 /* 31/III-2016 */ #define spx_eval_rho_s _glp_spx_eval_rho_s void spx_eval_rho_s(SPXLP *lp, int i, FVS *rho); /* sparse version of spx_eval_rho */ #endif #define spx_eval_tij _glp_spx_eval_tij double spx_eval_tij(SPXLP *lp, const double rho[/*1+m*/], int j); /* compute element T[i,j] of simplex table */ #define spx_eval_trow _glp_spx_eval_trow void spx_eval_trow(SPXLP *lp, const double rho[/*1+m*/], double trow[/*1+n-m*/]); /* compute i-th row of simplex table */ #define spx_update_beta _glp_spx_update_beta void spx_update_beta(SPXLP *lp, double beta[/*1+m*/], int p, int p_flag, int q, const double tcol[/*1+m*/]); /* update values of basic variables */ #if 1 /* 30/III-2016 */ #define spx_update_beta_s _glp_spx_update_beta_s void spx_update_beta_s(SPXLP *lp, double beta[/*1+m*/], int p, int p_flag, int q, const FVS *tcol); /* sparse version of spx_update_beta */ #endif #define spx_update_d _glp_spx_update_d double spx_update_d(SPXLP *lp, double d[/*1+n-m*/], int p, int q, const double trow[/*1+n-m*/], const double tcol[/*1+m*/]); /* update reduced costs of non-basic variables */ #if 1 /* 30/III-2016 */ #define spx_update_d_s _glp_spx_update_d_s double spx_update_d_s(SPXLP *lp, double d[/*1+n-m*/], int p, int q, const FVS *trow, const FVS *tcol); /* sparse version of spx_update_d */ #endif #define spx_change_basis _glp_spx_change_basis void spx_change_basis(SPXLP *lp, int p, int p_flag, int q); /* change current basis to adjacent one */ #define spx_update_invb _glp_spx_update_invb int spx_update_invb(SPXLP *lp, int i, int k); /* update factorization of basis matrix */ #endif /* eof */ glpk-5.0/src/simplex/spxnt.c0000644000062000006210000002267213766346220015303 0ustar maomkpasswd/* spxnt.c */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2015 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "spxnt.h" /*********************************************************************** * spx_alloc_nt - allocate matrix N in sparse row-wise format * * This routine allocates the memory for arrays needed to represent the * matrix N composed of non-basic columns of the constraint matrix A. */ void spx_alloc_nt(SPXLP *lp, SPXNT *nt) { int m = lp->m; int nnz = lp->nnz; nt->ptr = talloc(1+m, int); nt->len = talloc(1+m, int); nt->ind = talloc(1+nnz, int); nt->val = talloc(1+nnz, double); return; } /*********************************************************************** * spx_init_nt - initialize row pointers for matrix N * * This routine initializes (sets up) row pointers for the matrix N * using column-wise representation of the constraint matrix A. * * This routine needs to be called only once. */ void spx_init_nt(SPXLP *lp, SPXNT *nt) { int m = lp->m; int n = lp->n; int nnz = lp->nnz; int *A_ptr = lp->A_ptr; int *A_ind = lp->A_ind; int *NT_ptr = nt->ptr; int *NT_len = nt->len; int i, k, ptr, end; /* calculate NT_len[i] = maximal number of non-zeros in i-th row * of N = number of non-zeros in i-th row of A */ memset(&NT_len[1], 0, m * sizeof(int)); for (k = 1; k <= n; k++) { ptr = A_ptr[k]; end = A_ptr[k+1]; for (; ptr < end; ptr++) NT_len[A_ind[ptr]]++; } /* initialize row pointers NT_ptr[i], i = 1,...,n-m */ NT_ptr[1] = 1; for (i = 2; i <= m; i++) NT_ptr[i] = NT_ptr[i-1] + NT_len[i-1]; xassert(NT_ptr[m] + NT_len[m] == nnz+1); return; } /*********************************************************************** * spx_nt_add_col - add column N[j] = A[k] to matrix N * * This routine adds elements of column N[j] = A[k], 1 <= j <= n-m, * 1 <= k <= n, to the row-wise represntation of the matrix N. It is * assumed (with no check) that elements of the specified column are * missing in the row-wise represntation of N. */ void spx_nt_add_col(SPXLP *lp, SPXNT *nt, int j, int k) { int m = lp->m; int n = lp->n; int nnz = lp->nnz; int *A_ptr = lp->A_ptr; int *A_ind = lp->A_ind; double *A_val = lp->A_val; int *NT_ptr = nt->ptr; int *NT_len = nt->len; int *NT_ind = nt->ind; double *NT_val = nt->val; int i, ptr, end, pos; xassert(1 <= j && j <= n-m); xassert(1 <= k && k <= n); ptr = A_ptr[k]; end = A_ptr[k+1]; for (; ptr < end; ptr++) { i = A_ind[ptr]; /* add element N[i,j] = A[i,k] to i-th row of matrix N */ pos = NT_ptr[i] + (NT_len[i]++); if (i < m) xassert(pos < NT_ptr[i+1]); else xassert(pos <= nnz); NT_ind[pos] = j; NT_val[pos] = A_val[ptr]; } return; } /*********************************************************************** * spx_build_nt - build matrix N for current basis * * This routine builds the row-wise represntation of the matrix N * for the current basis by adding columns of the constraint matrix A * corresponding to non-basic variables. */ void spx_build_nt(SPXLP *lp, SPXNT *nt) { int m = lp->m; int n = lp->n; int *head = lp->head; int *NT_len = nt->len; int j, k; /* N := 0 */ memset(&NT_len[1], 0, m * sizeof(int)); /* add non-basic columns N[j] = A[k] */ for (j = 1; j <= n-m; j++) { k = head[m+j]; /* x[k] = xN[j] */ spx_nt_add_col(lp, nt, j, k); } return; } /*********************************************************************** * spx_nt_del_col - remove column N[j] = A[k] from matrix N * * This routine removes elements of column N[j] = A[k], 1 <= j <= n-m, * 1 <= k <= n, from the row-wise representation of the matrix N. It is * assumed (with no check) that elements of the specified column are * present in the row-wise representation of N. */ void spx_nt_del_col(SPXLP *lp, SPXNT *nt, int j, int k) { int m = lp->m; int n = lp->n; int *A_ptr = lp->A_ptr; int *A_ind = lp->A_ind; int *NT_ptr = nt->ptr; int *NT_len = nt->len; int *NT_ind = nt->ind; double *NT_val = nt->val; int i, ptr, end, ptr1, end1; xassert(1 <= j && j <= n-m); xassert(1 <= k && k <= n); ptr = A_ptr[k]; end = A_ptr[k+1]; for (; ptr < end; ptr++) { i = A_ind[ptr]; /* find element N[i,j] = A[i,k] in i-th row of matrix N */ ptr1 = NT_ptr[i]; end1 = ptr1 + NT_len[i]; for (; NT_ind[ptr1] != j; ptr1++) /* nop */; xassert(ptr1 < end1); /* and remove it from i-th row element list */ NT_len[i]--; NT_ind[ptr1] = NT_ind[end1-1]; NT_val[ptr1] = NT_val[end1-1]; } return; } /*********************************************************************** * spx_update_nt - update matrix N for adjacent basis * * This routine updates the row-wise represntation of matrix N for * the adjacent basis, where column N[q], 1 <= q <= n-m, is replaced by * column B[p], 1 <= p <= m, of the current basis matrix B. */ void spx_update_nt(SPXLP *lp, SPXNT *nt, int p, int q) { int m = lp->m; int n = lp->n; int *head = lp->head; xassert(1 <= p && p <= m); xassert(1 <= q && q <= n-m); /* remove old column N[q] corresponding to variable xN[q] */ spx_nt_del_col(lp, nt, q, head[m+q]); /* add new column N[q] corresponding to variable xB[p] */ spx_nt_add_col(lp, nt, q, head[p]); return; } /*********************************************************************** * spx_nt_prod - compute product y := y + s * N'* x * * This routine computes the product: * * y := y + s * N'* x, * * where N' is a matrix transposed to the mx(n-m)-matrix N composed * from non-basic columns of the constraint matrix A, x is a m-vector, * s is a scalar, y is (n-m)-vector. * * If the flag ign is non-zero, the routine ignores the input content * of the array y assuming that y = 0. * * The routine uses the row-wise representation of the matrix N and * computes the product as a linear combination: * * y := y + s * (N'[1] * x[1] + ... + N'[m] * x[m]), * * where N'[i] is i-th row of N, 1 <= i <= m. */ void spx_nt_prod(SPXLP *lp, SPXNT *nt, double y[/*1+n-m*/], int ign, double s, const double x[/*1+m*/]) { int m = lp->m; int n = lp->n; int *NT_ptr = nt->ptr; int *NT_len = nt->len; int *NT_ind = nt->ind; double *NT_val = nt->val; int i, j, ptr, end; double t; if (ign) { /* y := 0 */ for (j = 1; j <= n-m; j++) y[j] = 0.0; } for (i = 1; i <= m; i++) { if (x[i] != 0.0) { /* y := y + s * (i-th row of N) * x[i] */ t = s * x[i]; ptr = NT_ptr[i]; end = ptr + NT_len[i]; for (; ptr < end; ptr++) y[NT_ind[ptr]] += NT_val[ptr] * t; } } return; } #if 1 /* 31/III-2016 */ void spx_nt_prod_s(SPXLP *lp, SPXNT *nt, FVS *y, int ign, double s, const FVS *x, double eps) { /* sparse version of spx_nt_prod */ int *NT_ptr = nt->ptr; int *NT_len = nt->len; int *NT_ind = nt->ind; double *NT_val = nt->val; int *x_ind = x->ind; double *x_vec = x->vec; int *y_ind = y->ind; double *y_vec = y->vec; int i, j, k, nnz, ptr, end; double t; xassert(x->n == lp->m); xassert(y->n == lp->n-lp->m); if (ign) { /* y := 0 */ fvs_clear_vec(y); } nnz = y->nnz; for (k = x->nnz; k >= 1; k--) { i = x_ind[k]; /* y := y + s * (i-th row of N) * x[i] */ t = s * x_vec[i]; ptr = NT_ptr[i]; end = ptr + NT_len[i]; for (; ptr < end; ptr++) { j = NT_ind[ptr]; if (y_vec[j] == 0.0) y_ind[++nnz] = j; y_vec[j] += NT_val[ptr] * t; /* don't forget about numeric cancellation */ if (y_vec[j] == 0.0) y_vec[j] = DBL_MIN; } } y->nnz = nnz; fvs_adjust_vec(y, eps); return; } #endif /*********************************************************************** * spx_free_nt - deallocate matrix N in sparse row-wise format * * This routine deallocates the memory used for arrays of the program * object nt. */ void spx_free_nt(SPXLP *lp, SPXNT *nt) { xassert(lp == lp); tfree(nt->ptr); tfree(nt->len); tfree(nt->ind); tfree(nt->val); return; } /* eof */ glpk-5.0/src/simplex/spxnt.h0000644000062000006210000000646313766346220015310 0ustar maomkpasswd/* spxnt.h */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2015 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef SPXNT_H #define SPXNT_H #include "spxlp.h" typedef struct SPXNT SPXNT; struct SPXNT { /* mx(n-m)-matrix N composed of non-basic columns of constraint * matrix A, in sparse row-wise format */ int *ptr; /* int ptr[1+m]; */ /* ptr[0] is not used; * ptr[i], 1 <= i <= m, is starting position of i-th row in * arrays ind and val; note that ptr[1] is always 1; * these starting positions are set up *once* as if they would * correspond to rows of matrix A stored without gaps, i.e. * ptr[i+1] - ptr[i] is the number of non-zeros in i-th (i < m) * row of matrix A, and (nnz+1) - ptr[m] is the number of * non-zero in m-th (last) row of matrix A, where nnz is the * total number of non-zeros in matrix A */ int *len; /* int len[1+m]; */ /* len[0] is not used; * len[i], 1 <= i <= m, is the number of non-zeros in i-th row * of current matrix N */ int *ind; /* int ind[1+nnz]; */ /* column indices */ double *val; /* double val[1+nnz]; */ /* non-zero element values */ }; #define spx_alloc_nt _glp_spx_alloc_nt void spx_alloc_nt(SPXLP *lp, SPXNT *nt); /* allocate matrix N in sparse row-wise format */ #define spx_init_nt _glp_spx_init_nt void spx_init_nt(SPXLP *lp, SPXNT *nt); /* initialize row pointers for matrix N */ #define spx_nt_add_col _glp_spx_nt_add_col void spx_nt_add_col(SPXLP *lp, SPXNT *nt, int j, int k); /* add column N[j] = A[k] */ #define spx_build_nt _glp_spx_build_nt void spx_build_nt(SPXLP *lp, SPXNT *nt); /* build matrix N for current basis */ #define spx_nt_del_col _glp_spx_nt_del_col void spx_nt_del_col(SPXLP *lp, SPXNT *nt, int j, int k); /* remove column N[j] = A[k] from matrix N */ #define spx_update_nt _glp_spx_update_nt void spx_update_nt(SPXLP *lp, SPXNT *nt, int p, int q); /* update matrix N for adjacent basis */ #define spx_nt_prod _glp_spx_nt_prod void spx_nt_prod(SPXLP *lp, SPXNT *nt, double y[/*1+n-m*/], int ign, double s, const double x[/*1+m*/]); /* compute product y := y + s * N'* x */ #if 1 /* 31/III-2016 */ #define spx_nt_prod_s _glp_spx_nt_prod_s void spx_nt_prod_s(SPXLP *lp, SPXNT *nt, FVS *y, int ign, double s, const FVS *x, double eps); /* sparse version of spx_nt_prod */ #endif #define spx_free_nt _glp_spx_free_nt void spx_free_nt(SPXLP *lp, SPXNT *nt); /* deallocate matrix N in sparse row-wise format */ #endif /* eof */ glpk-5.0/src/simplex/spxprim.c0000644000062000006210000016577113766346220015641 0ustar maomkpasswd/* spxprim.c */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2015-2017 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #if 1 /* 18/VII-2017 */ #define SCALE_Z 1 #endif #include "env.h" #include "simplex.h" #include "spxat.h" #include "spxnt.h" #include "spxchuzc.h" #include "spxchuzr.h" #include "spxprob.h" #define CHECK_ACCURACY 0 /* (for debugging) */ struct csa { /* common storage area */ SPXLP *lp; /* LP problem data and its (current) basis; this LP has m rows * and n columns */ int dir; /* original optimization direction: * +1 - minimization * -1 - maximization */ #if SCALE_Z double fz; /* factor used to scale original objective */ #endif double *orig_c; /* double orig_c[1+n]; */ /* copy of original objective coefficients */ double *orig_l; /* double orig_l[1+n]; */ /* copy of original lower bounds */ double *orig_u; /* double orig_u[1+n]; */ /* copy of original upper bounds */ SPXAT *at; /* mxn-matrix A of constraint coefficients, in sparse row-wise * format (NULL if not used) */ SPXNT *nt; /* mx(n-m)-matrix N composed of non-basic columns of constraint * matrix A, in sparse row-wise format (NULL if not used) */ int phase; /* search phase: * 0 - not determined yet * 1 - searching for primal feasible solution * 2 - searching for optimal solution */ double *beta; /* double beta[1+m]; */ /* beta[i] is a primal value of basic variable xB[i] */ int beta_st; /* status of the vector beta: * 0 - undefined * 1 - just computed * 2 - updated */ double *d; /* double d[1+n-m]; */ /* d[j] is a reduced cost of non-basic variable xN[j] */ int d_st; /* status of the vector d: * 0 - undefined * 1 - just computed * 2 - updated */ SPXSE *se; /* projected steepest edge and Devex pricing data block (NULL if * not used) */ int num; /* number of eligible non-basic variables */ int *list; /* int list[1+n-m]; */ /* list[1], ..., list[num] are indices j of eligible non-basic * variables xN[j] */ int q; /* xN[q] is a non-basic variable chosen to enter the basis */ #if 0 /* 11/VI-2017 */ double *tcol; /* double tcol[1+m]; */ #else FVS tcol; /* FVS tcol[1:m]; */ #endif /* q-th (pivot) column of the simplex table */ #if 1 /* 23/VI-2017 */ SPXBP *bp; /* SPXBP bp[1+2*m+1]; */ /* penalty function break points */ #endif int p; /* xB[p] is a basic variable chosen to leave the basis; * p = 0 means that no basic variable reaches its bound; * p < 0 means that non-basic variable xN[q] reaches its opposite * bound before any basic variable */ int p_flag; /* if this flag is set, the active bound of xB[p] in the adjacent * basis should be set to the upper bound */ #if 0 /* 11/VI-2017 */ double *trow; /* double trow[1+n-m]; */ #else FVS trow; /* FVS trow[1:n-m]; */ #endif /* p-th (pivot) row of the simplex table */ #if 0 /* 09/VII-2017 */ double *work; /* double work[1+m]; */ /* working array */ #else FVS work; /* FVS work[1:m]; */ /* working vector */ #endif int p_stat, d_stat; /* primal and dual solution statuses */ /*--------------------------------------------------------------*/ /* control parameters (see struct glp_smcp) */ int msg_lev; /* message level */ #if 0 /* 23/VI-2017 */ int harris; /* ratio test technique: * 0 - textbook ratio test * 1 - Harris' two pass ratio test */ #else int r_test; /* ratio test technique: * GLP_RT_STD - textbook ratio test * GLP_RT_HAR - Harris' two pass ratio test * GLP_RT_FLIP - long-step ratio test (only for phase I) */ #endif double tol_bnd, tol_bnd1; /* primal feasibility tolerances */ double tol_dj, tol_dj1; /* dual feasibility tolerances */ double tol_piv; /* pivot tolerance */ int it_lim; /* iteration limit */ int tm_lim; /* time limit, milliseconds */ int out_frq; #if 0 /* 15/VII-2017 */ /* display output frequency, iterations */ #else /* display output frequency, milliseconds */ #endif int out_dly; /* display output delay, milliseconds */ /*--------------------------------------------------------------*/ /* working parameters */ double tm_beg; /* time value at the beginning of the search */ int it_beg; /* simplex iteration count at the beginning of the search */ int it_cnt; /* simplex iteration count; it increases by one every time the * basis changes (including the case when a non-basic variable * jumps to its opposite bound) */ int it_dpy; /* simplex iteration count at most recent display output */ #if 1 /* 15/VII-2017 */ double tm_dpy; /* time value at most recent display output */ #endif int inv_cnt; /* basis factorization count since most recent display output */ #if 1 /* 01/VII-2017 */ int degen; /* count of successive degenerate iterations; this count is used * to detect stalling */ #endif #if 1 /* 23/VI-2017 */ int ns_cnt, ls_cnt; /* normal and long-step iteration counts */ #endif }; /*********************************************************************** * set_penalty - set penalty function coefficients * * This routine sets up objective coefficients of the penalty function, * which is the sum of primal infeasibilities, as follows: * * if beta[i] < l[k] - eps1, set c[k] = -1, * * if beta[i] > u[k] + eps2, set c[k] = +1, * * otherwise, set c[k] = 0, * * where beta[i] is current value of basic variable xB[i] = x[k], l[k] * and u[k] are original bounds of x[k], and * * eps1 = tol + tol1 * |l[k]|, * * eps2 = tol + tol1 * |u[k]|. * * The routine returns the number of non-zero objective coefficients, * which is the number of basic variables violating their bounds. Thus, * if the value returned is zero, the current basis is primal feasible * within the specified tolerances. */ static int set_penalty(struct csa *csa, double tol, double tol1) { SPXLP *lp = csa->lp; int m = lp->m; int n = lp->n; double *c = lp->c; double *l = lp->l; double *u = lp->u; int *head = lp->head; double *beta = csa->beta; int i, k, count = 0; double t, eps; /* reset objective coefficients */ for (k = 0; k <= n; k++) c[k] = 0.0; /* walk thru the list of basic variables */ for (i = 1; i <= m; i++) { k = head[i]; /* x[k] = xB[i] */ /* check lower bound */ if ((t = l[k]) != -DBL_MAX) { eps = tol + tol1 * (t >= 0.0 ? +t : -t); if (beta[i] < t - eps) { /* lower bound is violated */ c[k] = -1.0, count++; } } /* check upper bound */ if ((t = u[k]) != +DBL_MAX) { eps = tol + tol1 * (t >= 0.0 ? +t : -t); if (beta[i] > t + eps) { /* upper bound is violated */ c[k] = +1.0, count++; } } } return count; } /*********************************************************************** * check_feas - check primal feasibility of basic solution * * This routine checks if the specified values of all basic variables * beta = (beta[i]) are within their bounds. * * Let l[k] and u[k] be original bounds of basic variable xB[i] = x[k]. * The actual bounds of x[k] are determined as follows: * * 1) if phase = 1 and c[k] < 0, x[k] violates its lower bound, so its * actual bounds are artificial: -inf < x[k] <= l[k]; * * 2) if phase = 1 and c[k] > 0, x[k] violates its upper bound, so its * actual bounds are artificial: u[k] <= x[k] < +inf; * * 3) in all other cases (if phase = 1 and c[k] = 0, or if phase = 2) * actual bounds are original: l[k] <= x[k] <= u[k]. * * The parameters tol and tol1 are bound violation tolerances. The * actual bounds l'[k] and u'[k] are considered as non-violated within * the specified tolerance if * * l'[k] - eps1 <= beta[i] <= u'[k] + eps2, * * where eps1 = tol + tol1 * |l'[k]|, eps2 = tol + tol1 * |u'[k]|. * * The routine returns one of the following codes: * * 0 - solution is feasible (no actual bounds are violated); * * 1 - solution is infeasible, however, only artificial bounds are * violated (this is possible only if phase = 1); * * 2 - solution is infeasible and at least one original bound is * violated. */ static int check_feas(struct csa *csa, int phase, double tol, double tol1) { SPXLP *lp = csa->lp; int m = lp->m; double *c = lp->c; double *l = lp->l; double *u = lp->u; int *head = lp->head; double *beta = csa->beta; int i, k, orig, ret = 0; double lk, uk, eps; xassert(phase == 1 || phase == 2); /* walk thru the list of basic variables */ for (i = 1; i <= m; i++) { k = head[i]; /* x[k] = xB[i] */ /* determine actual bounds of x[k] */ if (phase == 1 && c[k] < 0.0) { /* -inf < x[k] <= l[k] */ lk = -DBL_MAX, uk = l[k]; orig = 0; /* artificial bounds */ } else if (phase == 1 && c[k] > 0.0) { /* u[k] <= x[k] < +inf */ lk = u[k], uk = +DBL_MAX; orig = 0; /* artificial bounds */ } else { /* l[k] <= x[k] <= u[k] */ lk = l[k], uk = u[k]; orig = 1; /* original bounds */ } /* check actual lower bound */ if (lk != -DBL_MAX) { eps = tol + tol1 * (lk >= 0.0 ? +lk : -lk); if (beta[i] < lk - eps) { /* actual lower bound is violated */ if (orig) { ret = 2; break; } ret = 1; } } /* check actual upper bound */ if (uk != +DBL_MAX) { eps = tol + tol1 * (uk >= 0.0 ? +uk : -uk); if (beta[i] > uk + eps) { /* actual upper bound is violated */ if (orig) { ret = 2; break; } ret = 1; } } } return ret; } /*********************************************************************** * adjust_penalty - adjust penalty function coefficients * * On searching for primal feasible solution it may happen that some * basic variable xB[i] = x[k] has non-zero objective coefficient c[k] * indicating that xB[i] violates its lower (if c[k] < 0) or upper (if * c[k] > 0) original bound, but due to primal degenarcy the violation * is close to zero. * * This routine identifies such basic variables and sets objective * coefficients at these variables to zero that allows avoiding zero- * step simplex iterations. * * The parameters tol and tol1 are bound violation tolerances. The * original bounds l[k] and u[k] are considered as non-violated within * the specified tolerance if * * l[k] - eps1 <= beta[i] <= u[k] + eps2, * * where beta[i] is value of basic variable xB[i] = x[k] in the current * basis, eps1 = tol + tol1 * |l[k]|, eps2 = tol + tol1 * |u[k]|. * * The routine returns the number of objective coefficients which were * set to zero. */ #if 0 static int adjust_penalty(struct csa *csa, double tol, double tol1) { SPXLP *lp = csa->lp; int m = lp->m; double *c = lp->c; double *l = lp->l; double *u = lp->u; int *head = lp->head; double *beta = csa->beta; int i, k, count = 0; double t, eps; xassert(csa->phase == 1); /* walk thru the list of basic variables */ for (i = 1; i <= m; i++) { k = head[i]; /* x[k] = xB[i] */ if (c[k] < 0.0) { /* x[k] violates its original lower bound l[k] */ xassert((t = l[k]) != -DBL_MAX); eps = tol + tol1 * (t >= 0.0 ? +t : -t); if (beta[i] >= t - eps) { /* however, violation is close to zero */ c[k] = 0.0, count++; } } else if (c[k] > 0.0) { /* x[k] violates its original upper bound u[k] */ xassert((t = u[k]) != +DBL_MAX); eps = tol + tol1 * (t >= 0.0 ? +t : -t); if (beta[i] <= t + eps) { /* however, violation is close to zero */ c[k] = 0.0, count++; } } } return count; } #else static int adjust_penalty(struct csa *csa, int num, const int ind[/*1+num*/], double tol, double tol1) { SPXLP *lp = csa->lp; int m = lp->m; double *c = lp->c; double *l = lp->l; double *u = lp->u; int *head = lp->head; double *beta = csa->beta; int i, k, t, cnt = 0; double lk, uk, eps; xassert(csa->phase == 1); /* walk thru the specified list of basic variables */ for (t = 1; t <= num; t++) { i = ind[t]; xassert(1 <= i && i <= m); k = head[i]; /* x[k] = xB[i] */ if (c[k] < 0.0) { /* x[k] violates its original lower bound */ lk = l[k]; xassert(lk != -DBL_MAX); eps = tol + tol1 * (lk >= 0.0 ? +lk : -lk); if (beta[i] >= lk - eps) { /* however, violation is close to zero */ c[k] = 0.0, cnt++; } } else if (c[k] > 0.0) { /* x[k] violates its original upper bound */ uk = u[k]; xassert(uk != +DBL_MAX); eps = tol + tol1 * (uk >= 0.0 ? +uk : -uk); if (beta[i] <= uk + eps) { /* however, violation is close to zero */ c[k] = 0.0, cnt++; } } } return cnt; } #endif #if CHECK_ACCURACY /*********************************************************************** * err_in_vec - compute maximal relative error between two vectors * * This routine computes and returns maximal relative error between * n-vectors x and y: * * err_max = max |x[i] - y[i]| / (1 + |x[i]|). * * NOTE: This routine is intended only for debugginig purposes. */ static double err_in_vec(int n, const double x[], const double y[]) { int i; double err, err_max; err_max = 0.0; for (i = 1; i <= n; i++) { err = fabs(x[i] - y[i]) / (1.0 + fabs(x[i])); if (err_max < err) err_max = err; } return err_max; } #endif #if CHECK_ACCURACY /*********************************************************************** * err_in_beta - compute maximal relative error in vector beta * * This routine computes and returns maximal relative error in vector * of values of basic variables beta = (beta[i]). * * NOTE: This routine is intended only for debugginig purposes. */ static double err_in_beta(struct csa *csa) { SPXLP *lp = csa->lp; int m = lp->m; double err, *beta; beta = talloc(1+m, double); spx_eval_beta(lp, beta); err = err_in_vec(m, beta, csa->beta); tfree(beta); return err; } #endif #if CHECK_ACCURACY /*********************************************************************** * err_in_d - compute maximal relative error in vector d * * This routine computes and returns maximal relative error in vector * of reduced costs of non-basic variables d = (d[j]). * * NOTE: This routine is intended only for debugginig purposes. */ static double err_in_d(struct csa *csa) { SPXLP *lp = csa->lp; int m = lp->m; int n = lp->n; int j; double err, *pi, *d; pi = talloc(1+m, double); d = talloc(1+n-m, double); spx_eval_pi(lp, pi); for (j = 1; j <= n-m; j++) d[j] = spx_eval_dj(lp, pi, j); err = err_in_vec(n-m, d, csa->d); tfree(pi); tfree(d); return err; } #endif #if CHECK_ACCURACY /*********************************************************************** * err_in_gamma - compute maximal relative error in vector gamma * * This routine computes and returns maximal relative error in vector * of projected steepest edge weights gamma = (gamma[j]). * * NOTE: This routine is intended only for debugginig purposes. */ static double err_in_gamma(struct csa *csa) { SPXLP *lp = csa->lp; int m = lp->m; int n = lp->n; SPXSE *se = csa->se; int j; double err, *gamma; xassert(se != NULL); gamma = talloc(1+n-m, double); for (j = 1; j <= n-m; j++) gamma[j] = spx_eval_gamma_j(lp, se, j); err = err_in_vec(n-m, gamma, se->gamma); tfree(gamma); return err; } #endif #if CHECK_ACCURACY /*********************************************************************** * check_accuracy - check accuracy of basic solution components * * This routine checks accuracy of current basic solution components. * * NOTE: This routine is intended only for debugginig purposes. */ static void check_accuracy(struct csa *csa) { double e_beta, e_d, e_gamma; e_beta = err_in_beta(csa); e_d = err_in_d(csa); if (csa->se == NULL) e_gamma = 0.; else e_gamma = err_in_gamma(csa); xprintf("e_beta = %10.3e; e_d = %10.3e; e_gamma = %10.3e\n", e_beta, e_d, e_gamma); xassert(e_beta <= 1e-5 && e_d <= 1e-5 && e_gamma <= 1e-3); return; } #endif /*********************************************************************** * choose_pivot - choose xN[q] and xB[p] * * Given the list of eligible non-basic variables this routine first * chooses non-basic variable xN[q]. This choice is always possible, * because the list is assumed to be non-empty. Then the routine * computes q-th column T[*,q] of the simplex table T[i,j] and chooses * basic variable xB[p]. If the pivot T[p,q] is small in magnitude, * the routine attempts to choose another xN[q] and xB[p] in order to * avoid badly conditioned adjacent bases. */ #if 1 /* 17/III-2016 */ #define MIN_RATIO 0.0001 static int choose_pivot(struct csa *csa) { SPXLP *lp = csa->lp; int m = lp->m; int n = lp->n; double *beta = csa->beta; double *d = csa->d; SPXSE *se = csa->se; int *list = csa->list; #if 0 /* 09/VII-2017 */ double *tcol = csa->work; #else double *tcol = csa->work.vec; #endif double tol_piv = csa->tol_piv; int try, nnn, /*i,*/ p, p_flag, q, t; double big, /*temp,*/ best_ratio; #if 1 /* 23/VI-2017 */ double *c = lp->c; int *head = lp->head; SPXBP *bp = csa->bp; int nbp, t_best, ret, k; double dz_best; #endif xassert(csa->beta_st); xassert(csa->d_st); more: /* initial number of eligible non-basic variables */ nnn = csa->num; /* nothing has been chosen so far */ csa->q = 0; best_ratio = 0.0; #if 0 /* 23/VI-2017 */ try = 0; #else try = ret = 0; #endif try: /* choose non-basic variable xN[q] */ xassert(nnn > 0); try++; if (se == NULL) { /* Dantzig's rule */ q = spx_chuzc_std(lp, d, nnn, list); } else { /* projected steepest edge */ q = spx_chuzc_pse(lp, se, d, nnn, list); } xassert(1 <= q && q <= n-m); /* compute q-th column of the simplex table */ spx_eval_tcol(lp, q, tcol); #if 0 /* big := max(1, |tcol[1]|, ..., |tcol[m]|) */ big = 1.0; for (i = 1; i <= m; i++) { temp = tcol[i]; if (temp < 0.0) temp = - temp; if (big < temp) big = temp; } #else /* this still puzzles me */ big = 1.0; #endif /* choose basic variable xB[p] */ #if 1 /* 23/VI-2017 */ if (csa->phase == 1 && csa->r_test == GLP_RT_FLIP && try <= 2) { /* long-step ratio test */ int t, num, num1; double slope, teta_lim; /* determine penalty function break points */ nbp = spx_ls_eval_bp(lp, beta, q, d[q], tcol, tol_piv, bp); if (nbp < 2) goto skip; /* set initial slope */ slope = - fabs(d[q]); /* estimate initial teta_lim */ teta_lim = DBL_MAX; for (t = 1; t <= nbp; t++) { if (teta_lim > bp[t].teta) teta_lim = bp[t].teta; } xassert(teta_lim >= 0.0); if (teta_lim < 1e-3) teta_lim = 1e-3; /* nothing has been chosen so far */ t_best = 0, dz_best = 0.0, num = 0; /* choose appropriate break point */ while (num < nbp) { /* select and process a new portion of break points */ num1 = spx_ls_select_bp(lp, tcol, nbp, bp, num, &slope, teta_lim); for (t = num+1; t <= num1; t++) { int i = (bp[t].i >= 0 ? bp[t].i : -bp[t].i); xassert(0 <= i && i <= m); if (i == 0 || fabs(tcol[i]) / big >= MIN_RATIO) { if (dz_best > bp[t].dz) t_best = t, dz_best = bp[t].dz; } #if 0 if (i == 0) { /* do not consider further break points beyond this * point, where xN[q] reaches its opposite bound; * in principle (see spx_ls_eval_bp), this break * point should be the last one, however, due to * round-off errors there may be other break points * with the same teta beyond this one */ slope = +1.0; } #endif } if (slope > 0.0) { /* penalty function starts increasing */ break; } /* penalty function continues decreasing */ num = num1; teta_lim += teta_lim; } if (dz_best == 0.0) goto skip; /* the choice has been made */ xassert(1 <= t_best && t_best <= num1); if (t_best == 1) { /* the very first break point was chosen; it is reasonable * to use the short-step ratio test */ goto skip; } csa->q = q; memcpy(&csa->tcol.vec[1], &tcol[1], m * sizeof(double)); fvs_gather_vec(&csa->tcol, DBL_EPSILON); if (bp[t_best].i == 0) { /* xN[q] goes to its opposite bound */ csa->p = -1; csa->p_flag = 0; best_ratio = 1.0; } else if (bp[t_best].i > 0) { /* xB[p] leaves the basis and goes to its lower bound */ csa->p = + bp[t_best].i; xassert(1 <= csa->p && csa->p <= m); csa->p_flag = 0; best_ratio = fabs(tcol[csa->p]) / big; } else { /* xB[p] leaves the basis and goes to its upper bound */ csa->p = - bp[t_best].i; xassert(1 <= csa->p && csa->p <= m); csa->p_flag = 1; best_ratio = fabs(tcol[csa->p]) / big; } #if 0 xprintf("num1 = %d; t_best = %d; dz = %g\n", num1, t_best, bp[t_best].dz); #endif ret = 1; goto done; skip: ; } #endif #if 0 /* 23/VI-2017 */ if (!csa->harris) #else if (csa->r_test == GLP_RT_STD) #endif { /* textbook ratio test */ p = spx_chuzr_std(lp, csa->phase, beta, q, d[q] < 0.0 ? +1. : -1., tcol, &p_flag, tol_piv, .30 * csa->tol_bnd, .30 * csa->tol_bnd1); } else { /* Harris' two-pass ratio test */ p = spx_chuzr_harris(lp, csa->phase, beta, q, d[q] < 0.0 ? +1. : -1., tcol, &p_flag , tol_piv, .50 * csa->tol_bnd, .50 * csa->tol_bnd1); } if (p <= 0) { /* primal unboundedness or special case */ csa->q = q; #if 0 /* 11/VI-2017 */ memcpy(&csa->tcol[1], &tcol[1], m * sizeof(double)); #else memcpy(&csa->tcol.vec[1], &tcol[1], m * sizeof(double)); fvs_gather_vec(&csa->tcol, DBL_EPSILON); #endif csa->p = p; csa->p_flag = p_flag; best_ratio = 1.0; goto done; } /* either keep previous choice or accept new choice depending on * which one is better */ if (best_ratio < fabs(tcol[p]) / big) { csa->q = q; #if 0 /* 11/VI-2017 */ memcpy(&csa->tcol[1], &tcol[1], m * sizeof(double)); #else memcpy(&csa->tcol.vec[1], &tcol[1], m * sizeof(double)); fvs_gather_vec(&csa->tcol, DBL_EPSILON); #endif csa->p = p; csa->p_flag = p_flag; best_ratio = fabs(tcol[p]) / big; } /* check if the current choice is acceptable */ if (best_ratio >= MIN_RATIO || nnn == 1 || try == 5) goto done; /* try to choose other xN[q] and xB[p] */ /* find xN[q] in the list */ for (t = 1; t <= nnn; t++) if (list[t] == q) break; xassert(t <= nnn); /* move xN[q] to the end of the list */ list[t] = list[nnn], list[nnn] = q; /* and exclude it from consideration */ nnn--; /* repeat the choice */ goto try; done: /* the choice has been made */ #if 1 /* FIXME: currently just to avoid badly conditioned basis */ if (best_ratio < .001 * MIN_RATIO) { /* looks like this helps */ if (bfd_get_count(lp->bfd) > 0) return -1; /* didn't help; last chance to improve the choice */ if (tol_piv == csa->tol_piv) { tol_piv *= 1000.; goto more; } } #endif #if 0 /* 23/VI-2017 */ return 0; #else /* FIXME */ if (ret) { /* invalidate dual basic solution components */ csa->d_st = 0; /* change penalty function coefficients at basic variables for * all break points preceding the chosen one */ for (t = 1; t < t_best; t++) { int i = (bp[t].i >= 0 ? bp[t].i : -bp[t].i); xassert(0 <= i && i <= m); if (i == 0) { /* xN[q] crosses its opposite bound */ xassert(1 <= csa->q && csa->q <= n-m); k = head[m+csa->q]; } else { /* xB[i] crosses its (lower or upper) bound */ k = head[i]; /* x[k] = xB[i] */ } c[k] += bp[t].dc; xassert(c[k] == 0.0 || c[k] == +1.0 || c[k] == -1.0); } } return ret; #endif } #endif /*********************************************************************** * play_bounds - play bounds of primal variables * * This routine is called after the primal values of basic variables * beta[i] were updated and the basis was changed to the adjacent one. * * It is assumed that before updating all the primal values beta[i] * were strongly feasible, so in the adjacent basis beta[i] remain * feasible within a tolerance, i.e. if some beta[i] violates its lower * or upper bound, the violation is insignificant. * * If some beta[i] violates its lower or upper bound, this routine * changes (perturbs) the bound to remove such violation, i.e. to make * all beta[i] strongly feasible. Otherwise, if beta[i] has a feasible * value, this routine attempts to reduce (or remove) perturbation of * corresponding lower/upper bound keeping strong feasibility. */ /* FIXME: what to do if l[k] = u[k]? */ /* FIXME: reduce/remove perturbation if x[k] becomes non-basic? */ static void play_bounds(struct csa *csa, int all) { SPXLP *lp = csa->lp; int m = lp->m; double *c = lp->c; double *l = lp->l; double *u = lp->u; int *head = lp->head; double *orig_l = csa->orig_l; double *orig_u = csa->orig_u; double *beta = csa->beta; #if 0 /* 11/VI-2017 */ const double *tcol = csa->tcol; /* was used to update beta */ #else const double *tcol = csa->tcol.vec; #endif int i, k; xassert(csa->phase == 1 || csa->phase == 2); /* primal values beta = (beta[i]) should be valid */ xassert(csa->beta_st); /* walk thru the list of basic variables xB = (xB[i]) */ for (i = 1; i <= m; i++) { if (all || tcol[i] != 0.0) { /* beta[i] has changed in the adjacent basis */ k = head[i]; /* x[k] = xB[i] */ if (csa->phase == 1 && c[k] < 0.0) { /* -inf < xB[i] <= lB[i] (artificial bounds) */ if (beta[i] < l[k] - 1e-9) continue; /* restore actual bounds */ c[k] = 0.0; csa->d_st = 0; /* since c[k] = cB[i] has changed */ } if (csa->phase == 1 && c[k] > 0.0) { /* uB[i] <= xB[i] < +inf (artificial bounds) */ if (beta[i] > u[k] + 1e-9) continue; /* restore actual bounds */ c[k] = 0.0; csa->d_st = 0; /* since c[k] = cB[i] has changed */ } /* lB[i] <= xB[i] <= uB[i] */ if (csa->phase == 1) xassert(c[k] == 0.0); if (l[k] != -DBL_MAX) { /* xB[i] has lower bound */ if (beta[i] < l[k]) { /* strong feasibility means xB[i] >= lB[i] */ #if 0 /* 11/VI-2017 */ l[k] = beta[i]; #else l[k] = beta[i] - 1e-9; #endif } else if (l[k] < orig_l[k]) { /* remove/reduce perturbation of lB[i] */ if (beta[i] >= orig_l[k]) l[k] = orig_l[k]; else l[k] = beta[i]; } } if (u[k] != +DBL_MAX) { /* xB[i] has upper bound */ if (beta[i] > u[k]) { /* strong feasibility means xB[i] <= uB[i] */ #if 0 /* 11/VI-2017 */ u[k] = beta[i]; #else u[k] = beta[i] + 1e-9; #endif } else if (u[k] > orig_u[k]) { /* remove/reduce perturbation of uB[i] */ if (beta[i] <= orig_u[k]) u[k] = orig_u[k]; else u[k] = beta[i]; } } } } return; } static void remove_perturb(struct csa *csa) { /* remove perturbation */ SPXLP *lp = csa->lp; int m = lp->m; int n = lp->n; double *l = lp->l; double *u = lp->u; int *head = lp->head; char *flag = lp->flag; double *orig_l = csa->orig_l; double *orig_u = csa->orig_u; int j, k; /* restore original bounds of variables */ memcpy(l, orig_l, (1+n) * sizeof(double)); memcpy(u, orig_u, (1+n) * sizeof(double)); /* adjust flags of fixed non-basic variables, because in the * perturbed problem such variables might be changed to double- * bounded type */ for (j = 1; j <= n-m; j++) { k = head[m+j]; /* x[k] = xN[j] */ if (l[k] == u[k]) flag[j] = 0; } /* removing perturbation changes primal solution components */ csa->phase = csa->beta_st = 0; #if 1 if (csa->msg_lev >= GLP_MSG_ALL) xprintf("Removing LP perturbation [%d]...\n", csa->it_cnt); #endif return; } /*********************************************************************** * sum_infeas - compute sum of primal infeasibilities * * This routine compute the sum of primal infeasibilities, which is the * current penalty function value. */ static double sum_infeas(SPXLP *lp, const double beta[/*1+m*/]) { int m = lp->m; double *l = lp->l; double *u = lp->u; int *head = lp->head; int i, k; double sum = 0.0; for (i = 1; i <= m; i++) { k = head[i]; /* x[k] = xB[i] */ if (l[k] != -DBL_MAX && beta[i] < l[k]) sum += l[k] - beta[i]; if (u[k] != +DBL_MAX && beta[i] > u[k]) sum += beta[i] - u[k]; } return sum; } /*********************************************************************** * display - display search progress * * This routine displays some information about the search progress * that includes: * * search phase; * * number of simplex iterations performed by the solver; * * original objective value; * * sum of (scaled) primal infeasibilities; * * number of infeasibilities (phase I) or non-optimalities (phase II); * * number of basic factorizations since last display output. */ static void display(struct csa *csa, int spec) { int nnn, k; double obj, sum, *save, *save1; #if 1 /* 15/VII-2017 */ double tm_cur; #endif /* check if the display output should be skipped */ if (csa->msg_lev < GLP_MSG_ON) goto skip; #if 1 /* 15/VII-2017 */ tm_cur = xtime(); #endif if (csa->out_dly > 0 && #if 0 /* 15/VII-2017 */ 1000.0 * xdifftime(xtime(), csa->tm_beg) < csa->out_dly) #else 1000.0 * xdifftime(tm_cur, csa->tm_beg) < csa->out_dly) #endif goto skip; if (csa->it_cnt == csa->it_dpy) goto skip; #if 0 /* 15/VII-2017 */ if (!spec && csa->it_cnt % csa->out_frq != 0) goto skip; #else if (!spec && 1000.0 * xdifftime(tm_cur, csa->tm_dpy) < csa->out_frq) goto skip; #endif /* compute original objective value */ save = csa->lp->c; csa->lp->c = csa->orig_c; obj = csa->dir * spx_eval_obj(csa->lp, csa->beta); csa->lp->c = save; #if SCALE_Z obj *= csa->fz; #endif /* compute sum of (scaled) primal infeasibilities */ #if 1 /* 01/VII-2017 */ save = csa->lp->l; save1 = csa->lp->u; csa->lp->l = csa->orig_l; csa->lp->u = csa->orig_u; #endif sum = sum_infeas(csa->lp, csa->beta); #if 1 /* 01/VII-2017 */ csa->lp->l = save; csa->lp->u = save1; #endif /* compute number of infeasibilities/non-optimalities */ switch (csa->phase) { case 1: nnn = 0; for (k = 1; k <= csa->lp->n; k++) if (csa->lp->c[k] != 0.0) nnn++; break; case 2: xassert(csa->d_st); nnn = spx_chuzc_sel(csa->lp, csa->d, csa->tol_dj, csa->tol_dj1, NULL); break; default: xassert(csa != csa); } /* display search progress */ xprintf("%c%6d: obj = %17.9e inf = %11.3e (%d)", csa->phase == 2 ? '*' : ' ', csa->it_cnt, obj, sum, nnn); if (csa->inv_cnt) { /* number of basis factorizations performed */ xprintf(" %d", csa->inv_cnt); csa->inv_cnt = 0; } #if 1 /* 23/VI-2017 */ if (csa->phase == 1 && csa->r_test == GLP_RT_FLIP) { /*xprintf(" %d,%d", csa->ns_cnt, csa->ls_cnt);*/ if (csa->ns_cnt + csa->ls_cnt) xprintf(" %d%%", (100 * csa->ls_cnt) / (csa->ns_cnt + csa->ls_cnt)); csa->ns_cnt = csa->ls_cnt = 0; } #endif xprintf("\n"); csa->it_dpy = csa->it_cnt; #if 1 /* 15/VII-2017 */ csa->tm_dpy = tm_cur; #endif skip: return; } /*********************************************************************** * spx_primal - driver to the primal simplex method * * This routine is a driver to the two-phase primal simplex method. * * On exit this routine returns one of the following codes: * * 0 LP instance has been successfully solved. * * GLP_EITLIM * Iteration limit has been exhausted. * * GLP_ETMLIM * Time limit has been exhausted. * * GLP_EFAIL * The solver failed to solve LP instance. */ static int primal_simplex(struct csa *csa) { /* primal simplex method main logic routine */ SPXLP *lp = csa->lp; int m = lp->m; int n = lp->n; double *c = lp->c; int *head = lp->head; SPXAT *at = csa->at; SPXNT *nt = csa->nt; double *beta = csa->beta; double *d = csa->d; SPXSE *se = csa->se; int *list = csa->list; #if 0 /* 11/VI-2017 */ double *tcol = csa->tcol; double *trow = csa->trow; #endif #if 0 /* 09/VII-2017 */ double *pi = csa->work; double *rho = csa->work; #else double *pi = csa->work.vec; double *rho = csa->work.vec; #endif int msg_lev = csa->msg_lev; double tol_bnd = csa->tol_bnd; double tol_bnd1 = csa->tol_bnd1; double tol_dj = csa->tol_dj; double tol_dj1 = csa->tol_dj1; int perturb = -1; /* -1 = perturbation is not used, but enabled * 0 = perturbation is not used and disabled * +1 = perturbation is being used */ int j, refct, ret; loop: /* main loop starts here */ /* compute factorization of the basis matrix */ if (!lp->valid) { double cond; ret = spx_factorize(lp); csa->inv_cnt++; if (ret != 0) { if (msg_lev >= GLP_MSG_ERR) xprintf("Error: unable to factorize the basis matrix (%d" ")\n", ret); csa->p_stat = csa->d_stat = GLP_UNDEF; ret = GLP_EFAIL; goto fini; } /* check condition of the basis matrix */ cond = bfd_condest(lp->bfd); if (cond > 1.0 / DBL_EPSILON) { if (msg_lev >= GLP_MSG_ERR) xprintf("Error: basis matrix is singular to working prec" "ision (cond = %.3g)\n", cond); csa->p_stat = csa->d_stat = GLP_UNDEF; ret = GLP_EFAIL; goto fini; } if (cond > 0.001 / DBL_EPSILON) { if (msg_lev >= GLP_MSG_ERR) xprintf("Warning: basis matrix is ill-conditioned (cond " "= %.3g)\n", cond); } /* invalidate basic solution components */ csa->beta_st = csa->d_st = 0; } /* compute values of basic variables beta = (beta[i]) */ if (!csa->beta_st) { spx_eval_beta(lp, beta); csa->beta_st = 1; /* just computed */ /* determine the search phase, if not determined yet */ if (!csa->phase) { if (set_penalty(csa, 0.97 * tol_bnd, 0.97 * tol_bnd1)) { /* current basic solution is primal infeasible */ /* start to minimize the sum of infeasibilities */ csa->phase = 1; } else { /* current basic solution is primal feasible */ /* start to minimize the original objective function */ csa->phase = 2; memcpy(c, csa->orig_c, (1+n) * sizeof(double)); } /* working objective coefficients have been changed, so * invalidate reduced costs */ csa->d_st = 0; } /* make sure that the current basic solution remains primal * feasible (or pseudo-feasible on phase I) */ if (perturb <= 0) { if (check_feas(csa, csa->phase, tol_bnd, tol_bnd1)) { /* excessive bound violations due to round-off errors */ #if 1 /* 01/VII-2017 */ if (perturb < 0) { if (msg_lev >= GLP_MSG_ALL) xprintf("Perturbing LP to avoid instability [%d].." ".\n", csa->it_cnt); perturb = 1; goto loop; } #endif if (msg_lev >= GLP_MSG_ERR) xprintf("Warning: numerical instability (primal simpl" "ex, phase %s)\n", csa->phase == 1 ? "I" : "II"); /* restart the search */ lp->valid = 0; csa->phase = 0; goto loop; } if (csa->phase == 1) { int i, cnt; for (i = 1; i <= m; i++) csa->tcol.ind[i] = i; cnt = adjust_penalty(csa, m, csa->tcol.ind, 0.99 * tol_bnd, 0.99 * tol_bnd1); if (cnt) { /*xprintf("*** cnt = %d\n", cnt);*/ csa->d_st = 0; } } } else { /* FIXME */ play_bounds(csa, 1); } } /* at this point the search phase is determined */ xassert(csa->phase == 1 || csa->phase == 2); /* compute reduced costs of non-basic variables d = (d[j]) */ if (!csa->d_st) { spx_eval_pi(lp, pi); for (j = 1; j <= n-m; j++) d[j] = spx_eval_dj(lp, pi, j); csa->d_st = 1; /* just computed */ } /* reset the reference space, if necessary */ if (se != NULL && !se->valid) spx_reset_refsp(lp, se), refct = 1000; /* at this point the basis factorization and all basic solution * components are valid */ xassert(lp->valid && csa->beta_st && csa->d_st); #if CHECK_ACCURACY /* check accuracy of current basic solution components (only for * debugging) */ check_accuracy(csa); #endif /* check if the iteration limit has been exhausted */ if (csa->it_cnt - csa->it_beg >= csa->it_lim) { if (perturb > 0) { /* remove perturbation */ remove_perturb(csa); perturb = 0; } if (csa->beta_st != 1) csa->beta_st = 0; if (csa->d_st != 1) csa->d_st = 0; if (!(csa->beta_st && csa->d_st)) goto loop; display(csa, 1); if (msg_lev >= GLP_MSG_ALL) xprintf("ITERATION LIMIT EXCEEDED; SEARCH TERMINATED\n"); csa->p_stat = (csa->phase == 2 ? GLP_FEAS : GLP_INFEAS); csa->d_stat = GLP_UNDEF; /* will be set below */ ret = GLP_EITLIM; goto fini; } /* check if the time limit has been exhausted */ if (1000.0 * xdifftime(xtime(), csa->tm_beg) >= csa->tm_lim) { if (perturb > 0) { /* remove perturbation */ remove_perturb(csa); perturb = 0; } if (csa->beta_st != 1) csa->beta_st = 0; if (csa->d_st != 1) csa->d_st = 0; if (!(csa->beta_st && csa->d_st)) goto loop; display(csa, 1); if (msg_lev >= GLP_MSG_ALL) xprintf("TIME LIMIT EXCEEDED; SEARCH TERMINATED\n"); csa->p_stat = (csa->phase == 2 ? GLP_FEAS : GLP_INFEAS); csa->d_stat = GLP_UNDEF; /* will be set below */ ret = GLP_ETMLIM; goto fini; } /* display the search progress */ display(csa, 0); /* select eligible non-basic variables */ switch (csa->phase) { case 1: csa->num = spx_chuzc_sel(lp, d, 1e-8, 0.0, list); break; case 2: csa->num = spx_chuzc_sel(lp, d, tol_dj, tol_dj1, list); break; default: xassert(csa != csa); } /* check for optimality */ if (csa->num == 0) { if (perturb > 0 && csa->phase == 2) { /* remove perturbation */ remove_perturb(csa); perturb = 0; } if (csa->beta_st != 1) csa->beta_st = 0; if (csa->d_st != 1) csa->d_st = 0; if (!(csa->beta_st && csa->d_st)) goto loop; /* current basis is optimal */ display(csa, 1); switch (csa->phase) { case 1: /* check for primal feasibility */ if (!check_feas(csa, 2, tol_bnd, tol_bnd1)) { /* feasible solution found; switch to phase II */ memcpy(c, csa->orig_c, (1+n) * sizeof(double)); csa->phase = 2; csa->d_st = 0; goto loop; } /* no feasible solution exists */ #if 1 /* 09/VII-2017 */ /* FIXME: remove perturbation */ #endif if (msg_lev >= GLP_MSG_ALL) xprintf("LP HAS NO PRIMAL FEASIBLE SOLUTION\n"); csa->p_stat = GLP_NOFEAS; csa->d_stat = GLP_UNDEF; /* will be set below */ ret = 0; goto fini; case 2: /* optimal solution found */ if (msg_lev >= GLP_MSG_ALL) xprintf("OPTIMAL LP SOLUTION FOUND\n"); csa->p_stat = csa->d_stat = GLP_FEAS; ret = 0; goto fini; default: xassert(csa != csa); } } /* choose xN[q] and xB[p] */ #if 0 /* 23/VI-2017 */ #if 0 /* 17/III-2016 */ choose_pivot(csa); #else if (choose_pivot(csa) < 0) { lp->valid = 0; goto loop; } #endif #else ret = choose_pivot(csa); if (ret < 0) { lp->valid = 0; goto loop; } if (ret == 0) csa->ns_cnt++; else csa->ls_cnt++; #endif /* check for unboundedness */ if (csa->p == 0) { if (perturb > 0) { /* remove perturbation */ remove_perturb(csa); perturb = 0; } if (csa->beta_st != 1) csa->beta_st = 0; if (csa->d_st != 1) csa->d_st = 0; if (!(csa->beta_st && csa->d_st)) goto loop; display(csa, 1); switch (csa->phase) { case 1: /* this should never happen */ if (msg_lev >= GLP_MSG_ERR) xprintf("Error: primal simplex failed\n"); csa->p_stat = csa->d_stat = GLP_UNDEF; ret = GLP_EFAIL; goto fini; case 2: /* primal unboundedness detected */ if (msg_lev >= GLP_MSG_ALL) xprintf("LP HAS UNBOUNDED PRIMAL SOLUTION\n"); csa->p_stat = GLP_FEAS; csa->d_stat = GLP_NOFEAS; ret = 0; goto fini; default: xassert(csa != csa); } } #if 1 /* 01/VII-2017 */ /* check for stalling */ if (csa->p > 0) { int k; xassert(1 <= csa->p && csa->p <= m); k = head[csa->p]; /* x[k] = xB[p] */ if (lp->l[k] != lp->u[k]) { if (csa->p_flag) { /* xB[p] goes to its upper bound */ xassert(lp->u[k] != +DBL_MAX); if (fabs(beta[csa->p] - lp->u[k]) >= 1e-6) { csa->degen = 0; goto skip1; } } else if (lp->l[k] == -DBL_MAX) { /* unusual case */ goto skip1; } else { /* xB[p] goes to its lower bound */ xassert(lp->l[k] != -DBL_MAX); if (fabs(beta[csa->p] - lp->l[k]) >= 1e-6) { csa->degen = 0; goto skip1; } } /* degenerate iteration has been detected */ csa->degen++; if (perturb < 0 && csa->degen >= 200) { if (msg_lev >= GLP_MSG_ALL) xprintf("Perturbing LP to avoid stalling [%d]...\n", csa->it_cnt); perturb = 1; } skip1: ; } } #endif /* update values of basic variables for adjacent basis */ #if 0 /* 11/VI-2017 */ spx_update_beta(lp, beta, csa->p, csa->p_flag, csa->q, tcol); #else spx_update_beta_s(lp, beta, csa->p, csa->p_flag, csa->q, &csa->tcol); #endif csa->beta_st = 2; /* p < 0 means that xN[q] jumps to its opposite bound */ if (csa->p < 0) goto skip; /* xN[q] enters and xB[p] leaves the basis */ /* compute p-th row of inv(B) */ spx_eval_rho(lp, csa->p, rho); /* compute p-th (pivot) row of the simplex table */ #if 0 /* 11/VI-2017 */ if (at != NULL) spx_eval_trow1(lp, at, rho, trow); else spx_nt_prod(lp, nt, trow, 1, -1.0, rho); #else if (at != NULL) spx_eval_trow1(lp, at, rho, csa->trow.vec); else spx_nt_prod(lp, nt, csa->trow.vec, 1, -1.0, rho); fvs_gather_vec(&csa->trow, DBL_EPSILON); #endif /* FIXME: tcol[p] and trow[q] should be close to each other */ #if 0 /* 26/V-2017 by cmatraki */ xassert(trow[csa->q] != 0.0); #else if (csa->trow.vec[csa->q] == 0.0) { if (msg_lev >= GLP_MSG_ERR) xprintf("Error: trow[q] = 0.0\n"); csa->p_stat = csa->d_stat = GLP_UNDEF; ret = GLP_EFAIL; goto fini; } #endif /* update reduced costs of non-basic variables for adjacent * basis */ #if 1 /* 23/VI-2017 */ /* dual solution may be invalidated due to long step */ if (csa->d_st) #endif #if 0 /* 11/VI-2017 */ if (spx_update_d(lp, d, csa->p, csa->q, trow, tcol) <= 1e-9) #else if (spx_update_d_s(lp, d, csa->p, csa->q, &csa->trow, &csa->tcol) <= 1e-9) #endif { /* successful updating */ csa->d_st = 2; if (csa->phase == 1) { /* adjust reduced cost of xN[q] in adjacent basis, since * its penalty coefficient changes (see below) */ d[csa->q] -= c[head[csa->p]]; } } else { /* new reduced costs are inaccurate */ csa->d_st = 0; } if (csa->phase == 1) { /* xB[p] leaves the basis replacing xN[q], so set its penalty * coefficient to zero */ c[head[csa->p]] = 0.0; } /* update steepest edge weights for adjacent basis, if used */ if (se != NULL) { if (refct > 0) #if 0 /* 11/VI-2017 */ { if (spx_update_gamma(lp, se, csa->p, csa->q, trow, tcol) <= 1e-3) #else /* FIXME: spx_update_gamma_s */ { if (spx_update_gamma(lp, se, csa->p, csa->q, csa->trow.vec, csa->tcol.vec) <= 1e-3) #endif { /* successful updating */ refct--; } else { /* new weights are inaccurate; reset reference space */ se->valid = 0; } } else { /* too many updates; reset reference space */ se->valid = 0; } } /* update matrix N for adjacent basis, if used */ if (nt != NULL) spx_update_nt(lp, nt, csa->p, csa->q); skip: /* change current basis header to adjacent one */ spx_change_basis(lp, csa->p, csa->p_flag, csa->q); /* and update factorization of the basis matrix */ if (csa->p > 0) spx_update_invb(lp, csa->p, head[csa->p]); #if 1 if (perturb <= 0) { if (csa->phase == 1) { int cnt; /* adjust penalty function coefficients */ cnt = adjust_penalty(csa, csa->tcol.nnz, csa->tcol.ind, 0.99 * tol_bnd, 0.99 * tol_bnd1); if (cnt) { /* some coefficients were changed, so invalidate reduced * costs of non-basic variables */ /*xprintf("... cnt = %d\n", cnt);*/ csa->d_st = 0; } } } else { /* FIXME */ play_bounds(csa, 0); } #endif /* simplex iteration complete */ csa->it_cnt++; goto loop; fini: /* restore original objective function */ memcpy(c, csa->orig_c, (1+n) * sizeof(double)); /* compute reduced costs of non-basic variables and determine * solution dual status, if necessary */ if (csa->p_stat != GLP_UNDEF && csa->d_stat == GLP_UNDEF) { xassert(ret != GLP_EFAIL); spx_eval_pi(lp, pi); for (j = 1; j <= n-m; j++) d[j] = spx_eval_dj(lp, pi, j); csa->num = spx_chuzc_sel(lp, d, tol_dj, tol_dj1, NULL); csa->d_stat = (csa->num == 0 ? GLP_FEAS : GLP_INFEAS); } return ret; } int spx_primal(glp_prob *P, const glp_smcp *parm) { /* driver to the primal simplex method */ struct csa csa_, *csa = &csa_; SPXLP lp; SPXAT at; SPXNT nt; SPXSE se; int ret, *map, *daeh; #if SCALE_Z int i, j, k; #endif /* build working LP and its initial basis */ memset(csa, 0, sizeof(struct csa)); csa->lp = &lp; spx_init_lp(csa->lp, P, parm->excl); spx_alloc_lp(csa->lp); map = talloc(1+P->m+P->n, int); spx_build_lp(csa->lp, P, parm->excl, parm->shift, map); spx_build_basis(csa->lp, P, map); switch (P->dir) { case GLP_MIN: csa->dir = +1; break; case GLP_MAX: csa->dir = -1; break; default: xassert(P != P); } #if SCALE_Z csa->fz = 0.0; for (k = 1; k <= csa->lp->n; k++) { double t = fabs(csa->lp->c[k]); if (csa->fz < t) csa->fz = t; } if (csa->fz <= 1000.0) csa->fz = 1.0; else csa->fz /= 1000.0; /*xprintf("csa->fz = %g\n", csa->fz);*/ for (k = 0; k <= csa->lp->n; k++) csa->lp->c[k] /= csa->fz; #endif csa->orig_c = talloc(1+csa->lp->n, double); memcpy(csa->orig_c, csa->lp->c, (1+csa->lp->n) * sizeof(double)); #if 1 /*PERTURB*/ csa->orig_l = talloc(1+csa->lp->n, double); memcpy(csa->orig_l, csa->lp->l, (1+csa->lp->n) * sizeof(double)); csa->orig_u = talloc(1+csa->lp->n, double); memcpy(csa->orig_u, csa->lp->u, (1+csa->lp->n) * sizeof(double)); #else csa->orig_l = csa->orig_u = NULL; #endif switch (parm->aorn) { case GLP_USE_AT: /* build matrix A in row-wise format */ csa->at = &at; csa->nt = NULL; spx_alloc_at(csa->lp, csa->at); spx_build_at(csa->lp, csa->at); break; case GLP_USE_NT: /* build matrix N in row-wise format for initial basis */ csa->at = NULL; csa->nt = &nt; spx_alloc_nt(csa->lp, csa->nt); spx_init_nt(csa->lp, csa->nt); spx_build_nt(csa->lp, csa->nt); break; default: xassert(parm != parm); } /* allocate and initialize working components */ csa->phase = 0; csa->beta = talloc(1+csa->lp->m, double); csa->beta_st = 0; csa->d = talloc(1+csa->lp->n-csa->lp->m, double); csa->d_st = 0; switch (parm->pricing) { case GLP_PT_STD: csa->se = NULL; break; case GLP_PT_PSE: csa->se = &se; spx_alloc_se(csa->lp, csa->se); break; default: xassert(parm != parm); } csa->list = talloc(1+csa->lp->n-csa->lp->m, int); #if 0 /* 11/VI-2017 */ csa->tcol = talloc(1+csa->lp->m, double); csa->trow = talloc(1+csa->lp->n-csa->lp->m, double); #else fvs_alloc_vec(&csa->tcol, csa->lp->m); fvs_alloc_vec(&csa->trow, csa->lp->n-csa->lp->m); #endif #if 1 /* 23/VI-2017 */ csa->bp = NULL; #endif #if 0 /* 09/VII-2017 */ csa->work = talloc(1+csa->lp->m, double); #else fvs_alloc_vec(&csa->work, csa->lp->m); #endif /* initialize control parameters */ csa->msg_lev = parm->msg_lev; #if 0 /* 23/VI-2017 */ switch (parm->r_test) { case GLP_RT_STD: csa->harris = 0; break; case GLP_RT_HAR: #if 1 /* 16/III-2016 */ case GLP_RT_FLIP: /* FIXME */ /* currently for primal simplex GLP_RT_FLIP is equivalent * to GLP_RT_HAR */ #endif csa->harris = 1; break; default: xassert(parm != parm); } #else switch (parm->r_test) { case GLP_RT_STD: case GLP_RT_HAR: break; case GLP_RT_FLIP: csa->bp = talloc(1+2*csa->lp->m+1, SPXBP); break; default: xassert(parm != parm); } csa->r_test = parm->r_test; #endif csa->tol_bnd = parm->tol_bnd; csa->tol_bnd1 = .001 * parm->tol_bnd; csa->tol_dj = parm->tol_dj; csa->tol_dj1 = .001 * parm->tol_dj; csa->tol_piv = parm->tol_piv; csa->it_lim = parm->it_lim; csa->tm_lim = parm->tm_lim; csa->out_frq = parm->out_frq; csa->out_dly = parm->out_dly; /* initialize working parameters */ csa->tm_beg = xtime(); csa->it_beg = csa->it_cnt = P->it_cnt; csa->it_dpy = -1; #if 1 /* 15/VII-2017 */ csa->tm_dpy = 0.0; #endif csa->inv_cnt = 0; #if 1 /* 01/VII-2017 */ csa->degen = 0; #endif #if 1 /* 23/VI-2017 */ csa->ns_cnt = csa->ls_cnt = 0; #endif /* try to solve working LP */ ret = primal_simplex(csa); /* return basis factorization back to problem object */ P->valid = csa->lp->valid; P->bfd = csa->lp->bfd; /* set solution status */ P->pbs_stat = csa->p_stat; P->dbs_stat = csa->d_stat; /* if the solver failed, do not store basis header and basic * solution components to problem object */ if (ret == GLP_EFAIL) goto skip; /* convert working LP basis to original LP basis and store it to * problem object */ daeh = talloc(1+csa->lp->n, int); spx_store_basis(csa->lp, P, map, daeh); /* compute simplex multipliers for final basic solution found by * the solver */ #if 0 /* 09/VII-2017 */ spx_eval_pi(csa->lp, csa->work); #else spx_eval_pi(csa->lp, csa->work.vec); #endif /* convert working LP solution to original LP solution and store * it into the problem object */ #if SCALE_Z for (i = 1; i <= csa->lp->m; i++) csa->work.vec[i] *= csa->fz; for (j = 1; j <= csa->lp->n-csa->lp->m; j++) csa->d[j] *= csa->fz; #endif #if 0 /* 09/VII-2017 */ spx_store_sol(csa->lp, P, SHIFT, map, daeh, csa->beta, csa->work, csa->d); #else spx_store_sol(csa->lp, P, parm->shift, map, daeh, csa->beta, csa->work.vec, csa->d); #endif tfree(daeh); /* save simplex iteration count */ P->it_cnt = csa->it_cnt; /* report auxiliary/structural variable causing unboundedness */ P->some = 0; if (csa->p_stat == GLP_FEAS && csa->d_stat == GLP_NOFEAS) { int k, kk; /* xN[q] = x[k] causes unboundedness */ xassert(1 <= csa->q && csa->q <= csa->lp->n - csa->lp->m); k = csa->lp->head[csa->lp->m + csa->q]; xassert(1 <= k && k <= csa->lp->n); /* convert to number of original variable */ for (kk = 1; kk <= P->m + P->n; kk++) { if (abs(map[kk]) == k) { P->some = kk; break; } } xassert(P->some != 0); } skip: /* deallocate working objects and arrays */ spx_free_lp(csa->lp); tfree(map); tfree(csa->orig_c); #if 1 /*PERTURB*/ tfree(csa->orig_l); tfree(csa->orig_u); #endif if (csa->at != NULL) spx_free_at(csa->lp, csa->at); if (csa->nt != NULL) spx_free_nt(csa->lp, csa->nt); tfree(csa->beta); tfree(csa->d); if (csa->se != NULL) spx_free_se(csa->lp, csa->se); tfree(csa->list); #if 0 /* 11/VI-2017 */ tfree(csa->tcol); tfree(csa->trow); #else fvs_free_vec(&csa->tcol); fvs_free_vec(&csa->trow); #endif #if 1 /* 23/VI-2017 */ if (csa->bp != NULL) tfree(csa->bp); #endif #if 0 /* 09/VII-2017 */ tfree(csa->work); #else fvs_free_vec(&csa->work); #endif /* return to calling program */ return ret; } /* eof */ glpk-5.0/src/simplex/spxprob.c0000644000062000006210000005550313766346220015623 0ustar maomkpasswd/* spxprob.c */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2015 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "spxprob.h" /*********************************************************************** * spx_init_lp - initialize working LP object * * This routine determines the number of equality constraints m, the * number of variables n, and the number of non-zero elements nnz in * the constraint matrix for the working LP, which corresponds to the * original LP, and stores these dimensions to the working LP object. * (The working LP object should be allocated by the calling routine.) * * If the flag excl is set, the routine assumes that non-basic fixed * variables will be excluded from the working LP. */ void spx_init_lp(SPXLP *lp, glp_prob *P, int excl) { int i, j, m, n, nnz; m = P->m; xassert(m > 0); n = 0; nnz = P->nnz; xassert(P->valid); /* scan rows of original LP */ for (i = 1; i <= m; i++) { GLPROW *row = P->row[i]; if (excl && row->stat == GLP_NS) { /* skip non-basic fixed auxiliary variable */ /* nop */ } else { /* include auxiliary variable in working LP */ n++; nnz++; /* unity column */ } } /* scan columns of original LP */ for (j = 1; j <= P->n; j++) { GLPCOL *col = P->col[j]; if (excl && col->stat == GLP_NS) { /* skip non-basic fixed structural variable */ GLPAIJ *aij; for (aij = col->ptr; aij != NULL; aij = aij->c_next) nnz--; } else { /* include structural variable in working LP */ n++; } } /* initialize working LP data block */ memset(lp, 0, sizeof(SPXLP)); lp->m = m; xassert(n > 0); lp->n = n; lp->nnz = nnz; return; } /*********************************************************************** * spx_alloc_lp - allocate working LP arrays * * This routine allocates the memory for all arrays in the working LP * object. */ void spx_alloc_lp(SPXLP *lp) { int m = lp->m; int n = lp->n; int nnz = lp->nnz; lp->A_ptr = talloc(1+n+1, int); lp->A_ind = talloc(1+nnz, int); lp->A_val = talloc(1+nnz, double); lp->b = talloc(1+m, double); lp->c = talloc(1+n, double); lp->l = talloc(1+n, double); lp->u = talloc(1+n, double); lp->head = talloc(1+n, int); lp->flag = talloc(1+n-m, char); return; } /*********************************************************************** * spx_build_lp - convert original LP to working LP * * This routine converts components (except the current basis) of the * original LP to components of the working LP and perform scaling of * these components. Also, if the original LP is maximization, the * routine changes the signs of the objective coefficients and constant * term to opposite ones. * * If the flag excl is set, original non-basic fixed variables are * *not* included in the working LP. Otherwise, all (auxiliary and * structural) original variables are included in the working LP. Note * that this flag should have the same value as it has in a call to the * routine spx_init_lp. * * If the flag shift is set, the routine shift bounds of variables * included in the working LP to make at least one bound to be zero. * If a variable has both lower and upper bounds, the bound having * smaller magnitude is shifted to zero. * * On exit the routine stores information about correspondence between * numbers of variables in the original and working LPs to the array * map, which should have 1+P->m+P->n locations (location [0] is not * used), where P->m is the numbers of rows and P->n is the number of * columns in the original LP: * * map[i] = +k, 1 <= i <= P->m, means that i-th auxiliary variable of * the original LP corresponds to variable x[k] of the working LP; * * map[i] = -k, 1 <= i <= P->m, means that i-th auxiliary variable of * the original LP corresponds to variable x[k] of the working LP, and * the upper bound of that variable was shifted to zero; * * map[i] = 0, 1 <= i <= P->m, means that i-th auxiliary variable of * the original LP was excluded from the working LP; * * map[P->m+j], 1 <= j <= P->n, has the same sense as above, however, * for j-th structural variable of the original LP. */ void spx_build_lp(SPXLP *lp, glp_prob *P, int excl, int shift, int map[/*1+P->m+P->n*/]) { int m = lp->m; int n = lp->n; int nnz = lp->nnz; int *A_ptr = lp->A_ptr; int *A_ind = lp->A_ind; double *A_val = lp->A_val; double *b = lp->b; double *c = lp->c; double *l = lp->l; double *u = lp->u; int i, j, k, kk, ptr, end; double dir, delta; /* working LP is always minimization */ switch (P->dir) { case GLP_MIN: dir = +1.0; break; case GLP_MAX: dir = -1.0; break; default: xassert(P != P); } /* initialize constant term of the objective */ c[0] = dir * P->c0; k = 0; /* number of variable in working LP */ ptr = 1; /* current available position in A_ind/A_val */ /* process rows of original LP */ xassert(P->m == m); for (i = 1; i <= m; i++) { GLPROW *row = P->row[i]; if (excl && row->stat == GLP_NS) { /* i-th auxiliary variable is non-basic and fixed */ /* substitute its scaled value in working LP */ xassert(row->type == GLP_FX); map[i] = 0; b[i] = - row->lb * row->rii; } else { /* include i-th auxiliary variable in working LP */ map[i] = ++k; /* setup k-th column of working constraint matrix which is * i-th column of unity matrix */ A_ptr[k] = ptr; A_ind[ptr] = i; A_val[ptr] = 1.0; ptr++; /* initialize right-hand side of i-th equality constraint * and setup zero objective coefficient at variable x[k] */ b[i] = c[k] = 0.0; /* setup scaled bounds of variable x[k] */ switch (row->type) { case GLP_FR: l[k] = -DBL_MAX, u[k] = +DBL_MAX; break; case GLP_LO: l[k] = row->lb * row->rii, u[k] = +DBL_MAX; break; case GLP_UP: l[k] = -DBL_MAX, u[k] = row->ub * row->rii; break; case GLP_DB: l[k] = row->lb * row->rii, u[k] = row->ub * row->rii; xassert(l[k] != u[k]); break; case GLP_FX: l[k] = u[k] = row->lb * row->rii; break; default: xassert(row != row); } } } /* process columns of original LP */ for (j = 1; j <= P->n; j++) { GLPCOL *col = P->col[j]; GLPAIJ *aij; if (excl && col->stat == GLP_NS) { /* j-th structural variable is non-basic and fixed */ /* substitute its scaled value in working LP */ xassert(col->type == GLP_FX); map[m+j] = 0; if (col->lb != 0.0) { /* (note that sjj scale factor is cancelled) */ for (aij = col->ptr; aij != NULL; aij = aij->c_next) b[aij->row->i] += (aij->row->rii * aij->val) * col->lb; c[0] += (dir * col->coef) * col->lb; } } else { /* include j-th structural variable in working LP */ map[m+j] = ++k; /* setup k-th column of working constraint matrix which is * scaled j-th column of original constraint matrix (-A) */ A_ptr[k] = ptr; for (aij = col->ptr; aij != NULL; aij = aij->c_next) { A_ind[ptr] = aij->row->i; A_val[ptr] = - aij->row->rii * aij->val * col->sjj; ptr++; } /* setup scaled objective coefficient at variable x[k] */ c[k] = dir * col->coef * col->sjj; /* setup scaled bounds of variable x[k] */ switch (col->type) { case GLP_FR: l[k] = -DBL_MAX, u[k] = +DBL_MAX; break; case GLP_LO: l[k] = col->lb / col->sjj, u[k] = +DBL_MAX; break; case GLP_UP: l[k] = -DBL_MAX, u[k] = col->ub / col->sjj; break; case GLP_DB: l[k] = col->lb / col->sjj, u[k] = col->ub / col->sjj; xassert(l[k] != u[k]); break; case GLP_FX: l[k] = u[k] = col->lb / col->sjj; break; default: xassert(col != col); } } } xassert(k == n); xassert(ptr == nnz+1); A_ptr[n+1] = ptr; /* shift bounds of all variables of working LP (optionally) */ if (shift) { for (kk = 1; kk <= m+P->n; kk++) { k = map[kk]; if (k == 0) { /* corresponding original variable was excluded */ continue; } /* shift bounds of variable x[k] */ if (l[k] == -DBL_MAX && u[k] == +DBL_MAX) { /* x[k] is unbounded variable */ delta = 0.0; } else if (l[k] != -DBL_MAX && u[k] == +DBL_MAX) { /* shift lower bound to zero */ delta = l[k]; l[k] = 0.0; } else if (l[k] == -DBL_MAX && u[k] != +DBL_MAX) { /* shift upper bound to zero */ map[kk] = -k; delta = u[k]; u[k] = 0.0; } else if (l[k] != u[k]) { /* x[k] is double bounded variable */ if (fabs(l[k]) <= fabs(u[k])) { /* shift lower bound to zero */ delta = l[k]; l[k] = 0.0, u[k] -= delta; } else { /* shift upper bound to zero */ map[kk] = -k; delta = u[k]; l[k] -= delta, u[k] = 0.0; } xassert(l[k] != u[k]); } else { /* shift fixed value to zero */ delta = l[k]; l[k] = u[k] = 0.0; } /* substitute x[k] = x'[k] + delta into all constraints * and the objective function of working LP */ if (delta != 0.0) { ptr = A_ptr[k]; end = A_ptr[k+1]; for (; ptr < end; ptr++) b[A_ind[ptr]] -= A_val[ptr] * delta; c[0] += c[k] * delta; } } } return; } /*********************************************************************** * spx_build_basis - convert original LP basis to working LP basis * * This routine converts the current basis of the original LP to * corresponding initial basis of the working LP, and moves the basis * factorization driver from the original LP object to the working LP * object. * * The array map should contain information provided by the routine * spx_build_lp. */ void spx_build_basis(SPXLP *lp, glp_prob *P, const int map[]) { int m = lp->m; int n = lp->n; int *head = lp->head; char *flag = lp->flag; int i, j, k, ii, jj; /* original basis factorization should be valid that guarantees * the basis is correct */ xassert(P->m == m); xassert(P->valid); /* initialize basis header for working LP */ memset(&head[1], 0, m * sizeof(int)); jj = 0; /* scan rows of original LP */ xassert(P->m == m); for (i = 1; i <= m; i++) { GLPROW *row = P->row[i]; /* determine ordinal number of x[k] in working LP */ if ((k = map[i]) < 0) k = -k; if (k == 0) { /* corresponding original variable was excluded */ continue; } xassert(1 <= k && k <= n); if (row->stat == GLP_BS) { /* x[k] is basic variable xB[ii] */ ii = row->bind; xassert(1 <= ii && ii <= m); xassert(head[ii] == 0); head[ii] = k; } else { /* x[k] is non-basic variable xN[jj] */ jj++; head[m+jj] = k; flag[jj] = (row->stat == GLP_NU); } } /* scan columns of original LP */ for (j = 1; j <= P->n; j++) { GLPCOL *col = P->col[j]; /* determine ordinal number of x[k] in working LP */ if ((k = map[m+j]) < 0) k = -k; if (k == 0) { /* corresponding original variable was excluded */ continue; } xassert(1 <= k && k <= n); if (col->stat == GLP_BS) { /* x[k] is basic variable xB[ii] */ ii = col->bind; xassert(1 <= ii && ii <= m); xassert(head[ii] == 0); head[ii] = k; } else { /* x[k] is non-basic variable xN[jj] */ jj++; head[m+jj] = k; flag[jj] = (col->stat == GLP_NU); } } xassert(m+jj == n); /* acquire basis factorization */ lp->valid = 1; lp->bfd = P->bfd; P->valid = 0; P->bfd = NULL; return; } /*********************************************************************** * spx_store_basis - convert working LP basis to original LP basis * * This routine converts the current working LP basis to corresponding * original LP basis. This operations includes determining and setting * statuses of all rows (auxiliary variables) and columns (structural * variables), and building the basis header. * * The array map should contain information provided by the routine * spx_build_lp. * * On exit the routine fills the array daeh. This array should have * 1+lp->n locations (location [0] is not used) and contain the inverse * of the working basis header lp->head, i.e. head[k'] = k means that * daeh[k] = k'. */ void spx_store_basis(SPXLP *lp, glp_prob *P, const int map[], int daeh[/*1+n*/]) { int m = lp->m; int n = lp->n; int *head = lp->head; char *flag = lp->flag; int i, j, k, kk; /* determine inverse of working basis header */ for (kk = 1; kk <= n; kk++) daeh[head[kk]] = kk; /* set row statuses */ xassert(P->m == m); for (i = 1; i <= m; i++) { GLPROW *row = P->row[i]; if ((k = map[i]) < 0) k = -k; if (k == 0) { /* non-basic fixed auxiliary variable was excluded */ xassert(row->type == GLP_FX); row->stat = GLP_NS; row->bind = 0; } else { /* auxiliary variable corresponds to variable x[k] */ kk = daeh[k]; if (kk <= m) { /* x[k] = xB[kk] */ P->head[kk] = i; row->stat = GLP_BS; row->bind = kk; } else { /* x[k] = xN[kk-m] */ switch (row->type) { case GLP_FR: row->stat = GLP_NF; break; case GLP_LO: row->stat = GLP_NL; break; case GLP_UP: row->stat = GLP_NU; break; case GLP_DB: row->stat = (flag[kk-m] ? GLP_NU : GLP_NL); break; case GLP_FX: row->stat = GLP_NS; break; default: xassert(row != row); } row->bind = 0; } } } /* set column statuses */ for (j = 1; j <= P->n; j++) { GLPCOL *col = P->col[j]; if ((k = map[m+j]) < 0) k = -k; if (k == 0) { /* non-basic fixed structural variable was excluded */ xassert(col->type == GLP_FX); col->stat = GLP_NS; col->bind = 0; } else { /* structural variable corresponds to variable x[k] */ kk = daeh[k]; if (kk <= m) { /* x[k] = xB[kk] */ P->head[kk] = m+j; col->stat = GLP_BS; col->bind = kk; } else { /* x[k] = xN[kk-m] */ switch (col->type) { case GLP_FR: col->stat = GLP_NF; break; case GLP_LO: col->stat = GLP_NL; break; case GLP_UP: col->stat = GLP_NU; break; case GLP_DB: col->stat = (flag[kk-m] ? GLP_NU : GLP_NL); break; case GLP_FX: col->stat = GLP_NS; break; default: xassert(col != col); } col->bind = 0; } } } return; } /*********************************************************************** * spx_store_sol - convert working LP solution to original LP solution * * This routine converts the current basic solution of the working LP * (values of basic variables, simplex multipliers, reduced costs of * non-basic variables) to corresponding basic solution of the original * LP (values and reduced costs of auxiliary and structural variables). * This conversion includes unscaling all basic solution components, * computing reduced costs of excluded non-basic variables, recovering * unshifted values of basic variables, changing the signs of reduced * costs (if the original LP is maximization), and computing the value * of the objective function. * * The flag shift should have the same value as it has in a call to the * routine spx_build_lp. * * The array map should contain information provided by the routine * spx_build_lp. * * The array daeh should contain information provided by the routine * spx_store_basis. * * The arrays beta, pi, and d should contain basic solution components * for the working LP: * * array locations beta[1], ..., beta[m] should contain values of basic * variables beta = (beta[i]); * * array locations pi[1], ..., pi[m] should contain simplex multipliers * pi = (pi[i]); * * array locations d[1], ..., d[n-m] should contain reduced costs of * non-basic variables d = (d[j]). */ void spx_store_sol(SPXLP *lp, glp_prob *P, int shift, const int map[], const int daeh[], const double beta[], const double pi[], const double d[]) { int m = lp->m; char *flag = lp->flag; int i, j, k, kk; double dir; /* working LP is always minimization */ switch (P->dir) { case GLP_MIN: dir = +1.0; break; case GLP_MAX: dir = -1.0; break; default: xassert(P != P); } /* compute row solution components */ xassert(P->m == m); for (i = 1; i <= m; i++) { GLPROW *row = P->row[i]; if ((k = map[i]) < 0) k = -k; if (k == 0) { /* non-basic fixed auxiliary variable was excluded */ xassert(row->type == GLP_FX); row->prim = row->lb; /* compute reduced cost d[k] = c[k] - A'[k] * pi as if x[k] * would be non-basic in working LP */ row->dual = - dir * pi[i] * row->rii; } else { /* auxiliary variable corresponds to variable x[k] */ kk = daeh[k]; if (kk <= m) { /* x[k] = xB[kk] */ row->prim = beta[kk] / row->rii; if (shift) row->prim += (map[i] < 0 ? row->ub : row->lb); row->dual = 0.0; } else { /* x[k] = xN[kk-m] */ row->prim = (flag[kk-m] ? row->ub : row->lb); row->dual = (dir * d[kk-m]) * row->rii; } } } /* compute column solution components and objective value */ P->obj_val = P->c0; for (j = 1; j <= P->n; j++) { GLPCOL *col = P->col[j]; if ((k = map[m+j]) < 0) k = -k; if (k == 0) { /* non-basic fixed structural variable was excluded */ GLPAIJ *aij; double dk; xassert(col->type == GLP_FX); col->prim = col->lb; /* compute reduced cost d[k] = c[k] - A'[k] * pi as if x[k] * would be non-basic in working LP */ /* (note that sjj scale factor is cancelled) */ dk = dir * col->coef; for (aij = col->ptr; aij != NULL; aij = aij->c_next) dk += (aij->row->rii * aij->val) * pi[aij->row->i]; col->dual = dir * dk; } else { /* structural variable corresponds to variable x[k] */ kk = daeh[k]; if (kk <= m) { /* x[k] = xB[kk] */ col->prim = beta[kk] * col->sjj; if (shift) col->prim += (map[m+j] < 0 ? col->ub : col->lb); col->dual = 0.0; } else { /* x[k] = xN[kk-m] */ col->prim = (flag[kk-m] ? col->ub : col->lb); col->dual = (dir * d[kk-m]) / col->sjj; } } P->obj_val += col->coef * col->prim; } return; } /*********************************************************************** * spx_free_lp - deallocate working LP arrays * * This routine deallocates the memory used for arrays of the working * LP object. */ void spx_free_lp(SPXLP *lp) { tfree(lp->A_ptr); tfree(lp->A_ind); tfree(lp->A_val); tfree(lp->b); tfree(lp->c); tfree(lp->l); tfree(lp->u); tfree(lp->head); tfree(lp->flag); return; } /* eof */ glpk-5.0/src/simplex/spxprob.h0000644000062000006210000000414313766346220015622 0ustar maomkpasswd/* spxprob.h */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2015 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef SPXPROB_H #define SPXPROB_H #include "prob.h" #include "spxlp.h" #define spx_init_lp _glp_spx_init_lp void spx_init_lp(SPXLP *lp, glp_prob *P, int excl); /* initialize working LP object */ #define spx_alloc_lp _glp_spx_alloc_lp void spx_alloc_lp(SPXLP *lp); /* allocate working LP arrays */ #define spx_build_lp _glp_spx_build_lp void spx_build_lp(SPXLP *lp, glp_prob *P, int excl, int shift, int map[/*1+P->m+P->n*/]); /* convert original LP to working LP */ #define spx_build_basis _glp_spx_build_basis void spx_build_basis(SPXLP *lp, glp_prob *P, const int map[]); /* convert original LP basis to working LP basis */ #define spx_store_basis _glp_spx_store_basis void spx_store_basis(SPXLP *lp, glp_prob *P, const int map[], int daeh[/*1+n*/]); /* convert working LP basis to original LP basis */ #define spx_store_sol _glp_spx_store_sol void spx_store_sol(SPXLP *lp, glp_prob *P, int shift, const int map[], const int daeh[], const double beta[], const double pi[], const double d[]); /* convert working LP solution to original LP solution */ #define spx_free_lp _glp_spx_free_lp void spx_free_lp(SPXLP *lp); /* deallocate working LP arrays */ #endif /* eof */ glpk-5.0/src/simplex/spychuzc.c0000644000062000006210000005333413766346220015776 0ustar maomkpasswd/* spychuzc.c */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2015-2018 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "spychuzc.h" /*********************************************************************** * spy_chuzc_std - choose non-basic variable (dual textbook ratio test) * * This routine implements an improved dual textbook ratio test to * choose non-basic variable xN[q]. * * Current reduced costs of non-basic variables should be placed in the * array locations d[1], ..., d[n-m]. Note that d[j] is a value of dual * basic variable lambdaN[j] in the current basis. * #if 0 (* 14/III-2016 *) * The parameter s specifies the sign of bound violation for basic * variable xB[p] chosen: s = +1.0 means that xB[p] violates its lower * bound, so dual non-basic variable lambdaB[p] = lambda^+B[p] * increases, and s = -1.0 means that xB[p] violates its upper bound, * so dual non-basic variable lambdaB[p] = lambda^-B[p] decreases. * (Thus, the dual ray parameter theta = s * lambdaB[p] >= 0.) #else * The parameter r specifies the bound violation for basic variable * xB[p] chosen: * * r = lB[p] - beta[p] > 0 means that xB[p] violates its lower bound, * so dual non-basic variable lambdaB[p] = lambda^+B[p] increases; and * * r = uB[p] - beta[p] < 0 means that xB[p] violates its upper bound, * so dual non-basic variable lambdaB[p] = lambda^-B[p] decreases. * * (Note that r is the dual reduced cost of lambdaB[p].) #endif * * Elements of p-th simplex table row t[p] = (t[p,j]) corresponding * to basic variable xB[p] should be placed in the array locations * trow[1], ..., trow[n-m]. * * The parameter tol_piv specifies a tolerance for elements of the * simplex table row t[p]. If |t[p,j]| < tol_piv, dual basic variable * lambdaN[j] is skipped, i.e. it is assumed that it does not depend on * the dual ray parameter theta. * * The parameters tol and tol1 specify tolerances used to increase the * choice freedom by simulating an artificial degeneracy as follows. * If lambdaN[j] = lambda^+N[j] >= 0 and d[j] <= +delta[j], or if * lambdaN[j] = lambda^-N[j] <= 0 and d[j] >= -delta[j], where * delta[j] = tol + tol1 * |cN[j]|, cN[j] is objective coefficient at * xN[j], then it is assumed that reduced cost d[j] is equal to zero. * * The routine determines the index 1 <= q <= n-m of non-basic variable * xN[q], for which corresponding dual basic variable lambda^+N[j] or * lambda^-N[j] reaches its zero bound first on increasing the dual ray * parameter theta, and returns p on exit. And if theta may increase * unlimitedly, the routine returns zero. */ int spy_chuzc_std(SPXLP *lp, const double d[/*1+n-m*/], #if 0 /* 14/III-2016 */ double s, const double trow[/*1+n-m*/], double tol_piv, #else double r, const double trow[/*1+n-m*/], double tol_piv, #endif double tol, double tol1) { int m = lp->m; int n = lp->n; double *c = lp->c; double *l = lp->l; double *u = lp->u; int *head = lp->head; char *flag = lp->flag; int j, k, q; double alfa, biga, delta, teta, teta_min; #if 0 /* 14/III-2016 */ xassert(s == +1.0 || s == -1.0); #else double s; xassert(r != 0.0); s = (r > 0.0 ? +1.0 : -1.0); #endif /* nothing is chosen so far */ q = 0, teta_min = DBL_MAX, biga = 0.0; /* walk thru the list of non-basic variables */ for (j = 1; j <= n-m; j++) { k = head[m+j]; /* x[k] = xN[j] */ /* if xN[j] is fixed variable, skip it */ if (l[k] == u[k]) continue; alfa = s * trow[j]; if (alfa >= +tol_piv && !flag[j]) { /* xN[j] is either free or has its lower bound active, so * lambdaN[j] = d[j] >= 0 decreases down to zero */ delta = tol + tol1 * (c[k] >= 0.0 ? +c[k] : -c[k]); /* determine theta on which lambdaN[j] reaches zero */ teta = (d[j] < +delta ? 0.0 : d[j] / alfa); } else if (alfa <= -tol_piv && (l[k] == -DBL_MAX || flag[j])) { /* xN[j] is either free or has its upper bound active, so * lambdaN[j] = d[j] <= 0 increases up to zero */ delta = tol + tol1 * (c[k] >= 0.0 ? +c[k] : -c[k]); /* determine theta on which lambdaN[j] reaches zero */ teta = (d[j] > -delta ? 0.0 : d[j] / alfa); } else { /* lambdaN[j] cannot reach zero on increasing theta */ continue; } /* choose non-basic variable xN[q] by corresponding dual basic * variable lambdaN[q] for which theta is minimal */ xassert(teta >= 0.0); alfa = (alfa >= 0.0 ? +alfa : -alfa); if (teta_min > teta || (teta_min == teta && biga < alfa)) q = j, teta_min = teta, biga = alfa; } return q; } /*********************************************************************** * spy_chuzc_harris - choose non-basic var. (dual Harris' ratio test) * * This routine implements dual Harris' ratio test to choose non-basic * variable xN[q]. * * All the parameters, except tol and tol1, as well as the returned * value have the same meaning as for the routine spx_chuzr_std (see * above). * * The parameters tol and tol1 specify tolerances on zero bound * violations for reduced costs of non-basic variables. For reduced * cost d[j] the tolerance is delta[j] = tol + tol1 |cN[j]|, where * cN[j] is objective coefficient at non-basic variable xN[j]. */ int spy_chuzc_harris(SPXLP *lp, const double d[/*1+n-m*/], #if 0 /* 14/III-2016 */ double s, const double trow[/*1+n-m*/], double tol_piv, #else double r, const double trow[/*1+n-m*/], double tol_piv, #endif double tol, double tol1) { int m = lp->m; int n = lp->n; double *c = lp->c; double *l = lp->l; double *u = lp->u; int *head = lp->head; char *flag = lp->flag; int j, k, q; double alfa, biga, delta, teta, teta_min; #if 0 /* 14/III-2016 */ xassert(s == +1.0 || s == -1.0); #else double s; xassert(r != 0.0); s = (r > 0.0 ? +1.0 : -1.0); #endif /*--------------------------------------------------------------*/ /* first pass: determine teta_min for relaxed bounds */ /*--------------------------------------------------------------*/ teta_min = DBL_MAX; /* walk thru the list of non-basic variables */ for (j = 1; j <= n-m; j++) { k = head[m+j]; /* x[k] = xN[j] */ /* if xN[j] is fixed variable, skip it */ if (l[k] == u[k]) continue; alfa = s * trow[j]; if (alfa >= +tol_piv && !flag[j]) { /* xN[j] is either free or has its lower bound active, so * lambdaN[j] = d[j] >= 0 decreases down to zero */ delta = tol + tol1 * (c[k] >= 0.0 ? +c[k] : -c[k]); /* determine theta on which lambdaN[j] reaches -delta */ teta = ((d[j] < 0.0 ? 0.0 : d[j]) + delta) / alfa; } else if (alfa <= -tol_piv && (l[k] == -DBL_MAX || flag[j])) { /* xN[j] is either free or has its upper bound active, so * lambdaN[j] = d[j] <= 0 increases up to zero */ delta = tol + tol1 * (c[k] >= 0.0 ? +c[k] : -c[k]); /* determine theta on which lambdaN[j] reaches +delta */ teta = ((d[j] > 0.0 ? 0.0 : d[j]) - delta) / alfa; } else { /* lambdaN[j] cannot reach zero on increasing theta */ continue; } xassert(teta >= 0.0); if (teta_min > teta) teta_min = teta; } /*--------------------------------------------------------------*/ /* second pass: choose non-basic variable xN[q] */ /*--------------------------------------------------------------*/ if (teta_min == DBL_MAX) { /* theta may increase unlimitedly */ q = 0; goto done; } /* nothing is chosen so far */ q = 0, biga = 0.0; /* walk thru the list of non-basic variables */ for (j = 1; j <= n-m; j++) { k = head[m+j]; /* x[k] = xN[j] */ /* if xN[j] is fixed variable, skip it */ if (l[k] == u[k]) continue; alfa = s * trow[j]; if (alfa >= +tol_piv && !flag[j]) { /* xN[j] is either free or has its lower bound active, so * lambdaN[j] = d[j] >= 0 decreases down to zero */ /* determine theta on which lambdaN[j] reaches zero */ teta = d[j] / alfa; } else if (alfa <= -tol_piv && (l[k] == -DBL_MAX || flag[j])) { /* xN[j] is either free or has its upper bound active, so * lambdaN[j] = d[j] <= 0 increases up to zero */ /* determine theta on which lambdaN[j] reaches zero */ teta = d[j] / alfa; } else { /* lambdaN[j] cannot reach zero on increasing theta */ continue; } /* choose non-basic variable for which theta is not greater * than theta_min determined for relaxed bounds and which has * best (largest in magnitude) pivot */ alfa = (alfa >= 0.0 ? +alfa : -alfa); if (teta <= teta_min && biga < alfa) q = j, biga = alfa; } /* something must be chosen */ xassert(1 <= q && q <= n-m); done: return q; } #if 0 /* 23/III-2016 */ /*********************************************************************** * spy_eval_bp - determine dual objective function break-points * * This routine determines the dual objective function break-points. * * The parameters lp, d, r, trow, and tol_piv have the same meaning as * for the routine spx_chuzc_std (see above). * * On exit the routine stores the break-points determined to the array * elements bp[1], ..., bp[num], where 0 <= num <= n-m is the number of * break-points returned by the routine. * * The break-points stored in the array bp are ordered by ascending * the ray parameter teta >= 0. The break-points numbered 1, ..., num-1 * always correspond to non-basic non-fixed variables xN[j] of primal * LP having both lower and upper bounds while the last break-point * numbered num may correspond to a non-basic variable having only one * lower or upper bound, if such variable prevents further increasing * of the ray parameter teta. Besides, the routine includes in the * array bp only the break-points that correspond to positive increment * of the dual objective. */ static int CDECL fcmp(const void *v1, const void *v2) { const SPYBP *p1 = v1, *p2 = v2; if (p1->teta < p2->teta) return -1; else if (p1->teta > p2->teta) return +1; else return 0; } int spy_eval_bp(SPXLP *lp, const double d[/*1+n-m*/], double r, const double trow[/*1+n-m*/], double tol_piv, SPYBP bp[/*1+n-m*/]) { int m = lp->m; int n = lp->n; double *l = lp->l; double *u = lp->u; int *head = lp->head; char *flag = lp->flag; int j, j_max, k, t, nnn, num; double s, alfa, teta, teta_max, dz, v; xassert(r != 0.0); s = (r > 0.0 ? +1.0 : -1.0); /* build the list of all dual basic variables lambdaN[j] that * can reach zero on increasing the ray parameter teta >= 0 */ num = 0; /* walk thru the list of non-basic variables */ for (j = 1; j <= n-m; j++) { k = head[m+j]; /* x[k] = xN[j] */ /* if xN[j] is fixed variable, skip it */ if (l[k] == u[k]) continue; alfa = s * trow[j]; if (alfa >= +tol_piv && !flag[j]) { /* xN[j] is either free or has its lower bound active, so * lambdaN[j] = d[j] >= 0 decreases down to zero */ /* determine teta[j] on which lambdaN[j] reaches zero */ teta = (d[j] < 0.0 ? 0.0 : d[j] / alfa); } else if (alfa <= -tol_piv && (l[k] == -DBL_MAX || flag[j])) { /* xN[j] is either free or has its upper bound active, so * lambdaN[j] = d[j] <= 0 increases up to zero */ /* determine teta[j] on which lambdaN[j] reaches zero */ teta = (d[j] > 0.0 ? 0.0 : d[j] / alfa); } else { /* lambdaN[j] cannot reach zero on increasing teta */ continue; } /* add lambdaN[j] to the list */ num++; bp[num].j = j; bp[num].teta = teta; } if (num == 0) { /* dual unboundedness */ goto done; } /* determine "blocking" dual basic variable lambdaN[j_max] that * prevents increasing teta more than teta_max */ j_max = 0, teta_max = DBL_MAX; for (t = 1; t <= num; t++) { j = bp[t].j; k = head[m+j]; /* x[k] = xN[j] */ if (l[k] == -DBL_MAX || u[k] == +DBL_MAX) { /* lambdaN[j] cannot intersect zero */ if (j_max == 0 || teta_max > bp[t].teta || (teta_max == bp[t].teta && fabs(trow[j_max]) < fabs(trow[j]))) j_max = j, teta_max = bp[t].teta; } } /* keep in the list only dual basic variables lambdaN[j] that * correspond to primal double-bounded variables xN[j] and whose * teta[j] is not greater than teta_max */ nnn = 0; for (t = 1; t <= num; t++) { j = bp[t].j; k = head[m+j]; /* x[k] = xN[j] */ if (l[k] != -DBL_MAX && u[k] != +DBL_MAX && bp[t].teta <= teta_max) { nnn++; bp[nnn].j = j; bp[nnn].teta = bp[t].teta; } } num = nnn; /* sort break-points by ascending teta[j] */ qsort(&bp[1], num, sizeof(SPYBP), fcmp); /* add lambdaN[j_max] to the end of the list */ if (j_max != 0) { xassert(num < n-m); num++; bp[num].j = j_max; bp[num].teta = teta_max; } /* compute increments of the dual objective at all break-points * (relative to its value at teta = 0) */ dz = 0.0; /* dual objective increment */ v = fabs(r); /* dual objective slope d zeta / d teta */ for (t = 1; t <= num; t++) { /* compute increment at current break-point */ dz += v * (bp[t].teta - (t == 1 ? 0.0 : bp[t-1].teta)); if (dz < 0.001) { /* break-point with non-positive increment reached */ num = t - 1; break; } bp[t].dz = dz; /* compute next slope on the right to current break-point */ if (t < num) { j = bp[t].j; k = head[m+j]; /* x[k] = xN[j] */ xassert(-DBL_MAX < l[k] && l[k] < u[k] && u[k] < +DBL_MAX); v -= fabs(trow[j]) * (u[k] - l[k]); } } done: return num; } #endif /*********************************************************************** * spy_ls_eval_bp - determine dual objective function break-points * * This routine determines the dual objective function break-points. * * The parameters lp, d, r, trow, and tol_piv have the same meaning as * for the routine spx_chuzc_std (see above). * * The routine stores the break-points determined to the array elements * bp[1], ..., bp[nbp] in *arbitrary* order, where 0 <= nbp <= n-m is * the number of break-points returned by the routine on exit. */ int spy_ls_eval_bp(SPXLP *lp, const double d[/*1+n-m*/], double r, const double trow[/*1+n-m*/], double tol_piv, SPYBP bp[/*1+n-m*/]) { int m = lp->m; int n = lp->n; double *l = lp->l; double *u = lp->u; int *head = lp->head; char *flag = lp->flag; int j, k, t, nnn, nbp; double s, alfa, teta, teta_max; xassert(r != 0.0); s = (r > 0.0 ? +1.0 : -1.0); /* build the list of all dual basic variables lambdaN[j] that * can reach zero on increasing the ray parameter teta >= 0 */ nnn = 0, teta_max = DBL_MAX; /* walk thru the list of non-basic variables */ for (j = 1; j <= n-m; j++) { k = head[m+j]; /* x[k] = xN[j] */ /* if xN[j] is fixed variable, skip it */ if (l[k] == u[k]) continue; alfa = s * trow[j]; if (alfa >= +tol_piv && !flag[j]) { /* xN[j] is either free or has its lower bound active, so * lambdaN[j] = d[j] >= 0 decreases down to zero */ /* determine teta[j] on which lambdaN[j] reaches zero */ teta = (d[j] < 0.0 ? 0.0 : d[j] / alfa); /* if xN[j] has no upper bound, lambdaN[j] cannot become * negative and thereby blocks further increasing teta */ if (u[k] == +DBL_MAX && teta_max > teta) teta_max = teta; } else if (alfa <= -tol_piv && (l[k] == -DBL_MAX || flag[j])) { /* xN[j] is either free or has its upper bound active, so * lambdaN[j] = d[j] <= 0 increases up to zero */ /* determine teta[j] on which lambdaN[j] reaches zero */ teta = (d[j] > 0.0 ? 0.0 : d[j] / alfa); /* if xN[j] has no lower bound, lambdaN[j] cannot become * positive and thereby blocks further increasing teta */ if (l[k] == -DBL_MAX && teta_max > teta) teta_max = teta; } else { /* lambdaN[j] cannot reach zero on increasing teta */ continue; } /* add lambdaN[j] to the list */ nnn++; bp[nnn].j = j; bp[nnn].teta = teta; } /* remove from the list all dual basic variables lambdaN[j], for * which teta[j] > teta_max */ nbp = 0; for (t = 1; t <= nnn; t++) { if (bp[t].teta <= teta_max + 1e-6) { nbp++; bp[nbp].j = bp[t].j; bp[nbp].teta = bp[t].teta; } } return nbp; } /*********************************************************************** * spy_ls_select_bp - select and process dual objective break-points * * This routine selects a next portion of the dual objective function * break-points and processes them. * * On entry to the routine it is assumed that break-points bp[1], ..., * bp[num] are already processed, and slope is the dual objective slope * to the right of the last processed break-point bp[num]. (Initially, * when num = 0, slope should be specified as fabs(r), where r has the * same meaning as above.) * * The routine selects break-points among bp[num+1], ..., bp[nbp], for * which teta <= teta_lim, and moves these break-points to the array * elements bp[num+1], ..., bp[num1], where num <= num1 <= n-m is the * new number of processed break-points returned by the routine on * exit. Then the routine sorts these break-points by ascending teta * and computes the change of the dual objective function relative to * its value at teta = 0. * * On exit the routine also replaces the parameter slope with a new * value that corresponds to the new last break-point bp[num1]. */ static int CDECL fcmp(const void *v1, const void *v2) { const SPYBP *p1 = v1, *p2 = v2; if (p1->teta < p2->teta) return -1; else if (p1->teta > p2->teta) return +1; else return 0; } int spy_ls_select_bp(SPXLP *lp, const double trow[/*1+n-m*/], int nbp, SPYBP bp[/*1+n-m*/], int num, double *slope, double teta_lim) { int m = lp->m; int n = lp->n; double *l = lp->l; double *u = lp->u; int *head = lp->head; int j, k, t, num1; double teta, dz; xassert(0 <= num && num <= nbp && nbp <= n-m); /* select a new portion of break-points */ num1 = num; for (t = num+1; t <= nbp; t++) { if (bp[t].teta <= teta_lim) { /* move break-point to the beginning of the new portion */ num1++; j = bp[num1].j, teta = bp[num1].teta; bp[num1].j = bp[t].j, bp[num1].teta = bp[t].teta; bp[t].j = j, bp[t].teta = teta; } } /* sort new break-points bp[num+1], ..., bp[num1] by ascending * the ray parameter teta */ if (num1 - num > 1) qsort(&bp[num+1], num1 - num, sizeof(SPYBP), fcmp); /* calculate the dual objective change at the new break-points */ for (t = num+1; t <= num1; t++) { /* calculate the dual objective change relative to its value * at break-point bp[t-1] */ if (*slope == -DBL_MAX) dz = -DBL_MAX; else dz = (*slope) * (bp[t].teta - (t == 1 ? 0.0 : bp[t-1].teta)); /* calculate the dual objective change relative to its value * at teta = 0 */ if (dz == -DBL_MAX) bp[t].dz = -DBL_MAX; else bp[t].dz = (t == 1 ? 0.0 : bp[t-1].dz) + dz; /* calculate a new slope of the dual objective to the right of * the current break-point bp[t] */ if (*slope != -DBL_MAX) { j = bp[t].j; k = head[m+j]; /* x[k] = xN[j] */ if (l[k] == -DBL_MAX || u[k] == +DBL_MAX) *slope = -DBL_MAX; /* blocking break-point reached */ else { xassert(l[k] < u[k]); *slope -= fabs(trow[j]) * (u[k] - l[k]); } } } return num1; } /* eof */ glpk-5.0/src/simplex/spychuzc.h0000644000062000006210000000553613766346220016004 0ustar maomkpasswd/* spychuzc.h */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2015-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef SPYCHUZC_H #define SPYCHUZC_H #include "spxlp.h" #define spy_chuzc_std _glp_spy_chuzc_std int spy_chuzc_std(SPXLP *lp, const double d[/*1+n-m*/], #if 0 /* 14/III-2016 */ double s, const double trow[/*1+n-m*/], double tol_piv, #else double r, const double trow[/*1+n-m*/], double tol_piv, #endif double tol, double tol1); /* choose non-basic variable (dual textbook ratio test) */ #define spy_chuzc_harris _glp_spy_chuzc_harris int spy_chuzc_harris(SPXLP *lp, const double d[/*1+n-m*/], #if 0 /* 14/III-2016 */ double s, const double trow[/*1+n-m*/], double tol_piv, #else double r, const double trow[/*1+n-m*/], double tol_piv, #endif double tol, double tol1); /* choose non-basic variable (dual Harris' ratio test) */ typedef struct SPYBP SPYBP; struct SPYBP { /* dual objective function break point */ int j; /* dual basic variable lambdaN[j], 1 <= j <= n-m, that intersects * zero at this break point */ double teta; /* ray parameter value, teta[j] >= 0, at this break point */ double dz; /* increment, zeta[j] - zeta[0], of the dual objective function * at this break point */ }; #if 0 /* 23/III-2016 */ #define spy_eval_bp _glp_spy_eval_bp int spy_eval_bp(SPXLP *lp, const double d[/*1+n-m*/], double r, const double trow[/*1+n-m*/], double tol_piv, SPYBP bp[/*1+n-m*/]); /* determine dual objective function break-points */ #endif #define spy_ls_eval_bp _glp_spy_ls_eval_bp int spy_ls_eval_bp(SPXLP *lp, const double d[/*1+n-m*/], double r, const double trow[/*1+n-m*/], double tol_piv, SPYBP bp[/*1+n-m*/]); /* determine dual objective function break-points */ #define spy_ls_select_bp _glp_spy_ls_select_bp int spy_ls_select_bp(SPXLP *lp, const double trow[/*1+n-m*/], int nbp, SPYBP bp[/*1+n-m*/], int num, double *slope, double teta_lim); /* select and process dual objective break-points */ #endif /* eof */ glpk-5.0/src/simplex/spychuzr.c0000644000062000006210000003747413766346220016024 0ustar maomkpasswd/* spychuzr.c */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2015 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "spychuzr.h" /*********************************************************************** * spy_chuzr_sel - select eligible basic variables * * This routine selects eligible basic variables xB[i], whose value * beta[i] violates corresponding lower lB[i] or upper uB[i] bound. * Positive bound violation rp[i] = lb[i] - beta[i] > 0 is the reduced * cost of non-basic dual variable lambda^+B[i] >= 0, so increasing it * increases the dual objective. Similarly, negative bound violation * rn[i] = ub[i] - beta[i] < 0 is the reduced cost of non-basic dual * variable lambda^-B[i] <= 0, so decreasing it also increases the dual * objective. * * Current values of basic variables should be placed in the array * locations beta[1], ..., beta[m]. * * Basic variable xB[i] is considered eligible, if: * * beta[i] <= lB[i] - eps1[i], or * * beta[i] >= uB[i] + eps2[i], * * for * * eps1[i] = tol + tol1 * |lB[i]|, * * eps2[i] = tol + tol2 * |uB[i]|, * * where lB[i] and uB[i] are, resp., lower and upper bounds of xB[i], * tol and tol1 are specified tolerances. * * On exit the routine stores indices i of eligible basic variables * xB[i] to the array locations list[1], ..., list[num] and returns the * number of such variables 0 <= num <= m. (If the parameter list is * specified as NULL, no indices are stored.) */ int spy_chuzr_sel(SPXLP *lp, const double beta[/*1+m*/], double tol, double tol1, int list[/*1+m*/]) { int m = lp->m; double *l = lp->l; double *u = lp->u; int *head = lp->head; int i, k, num; double lk, uk, eps; num = 0; /* walk thru list of basic variables */ for (i = 1; i <= m; i++) { k = head[i]; /* x[k] = xB[i] */ lk = l[k], uk = u[k]; /* check if xB[i] is eligible */ if (beta[i] < lk) { /* determine absolute tolerance eps1[i] */ eps = tol + tol1 * (lk >= 0.0 ? +lk : -lk); if (beta[i] < lk - eps) { /* lower bound is violated */ num++; if (list != NULL) list[num] = i; } } else if (beta[i] > uk) { /* determine absolute tolerance eps2[i] */ eps = tol + tol1 * (uk >= 0.0 ? +uk : -uk); if (beta[i] > uk + eps) { /* upper bound is violated */ num++; if (list != NULL) list[num] = i; } } } return num; } /*********************************************************************** * spy_chuzr_std - choose basic variable (dual Dantzig's rule) * * This routine chooses most eligible basic variable xB[p] according * to dual Dantzig's ("standard") rule: * * r[p] = max |r[i]|, * i in I * * ( lB[i] - beta[i], if beta[i] < lB[i] * ( * r[i] = { 0, if lB[i] <= beta[i] <= uB[i] * ( * ( uB[i] - beta[i], if beta[i] > uB[i] * * where I <= {1, ..., m} is the set of indices of eligible basic * variables, beta[i] is current value of xB[i], lB[i] and uB[i] are, * resp., lower and upper bounds of xB[i], r[i] is bound violation. * * Current values of basic variables should be placed in the array * locations beta[1], ..., beta[m]. * * Indices of eligible basic variables i in I should be placed in the * array locations list[1], ..., list[num], where num = |J| > 0 is the * total number of such variables. * * On exit the routine returns p, the index of the basic variable xB[p] * chosen. */ int spy_chuzr_std(SPXLP *lp, const double beta[/*1+m*/], int num, const int list[]) { int m = lp->m; double *l = lp->l; double *u = lp->u; int *head = lp->head; int i, k, p, t; double abs_ri, abs_rp; xassert(0 < num && num <= m); p = 0, abs_rp = -1.0; for (t = 1; t <= num; t++) { i = list[t]; k = head[i]; /* x[k] = xB[i] */ if (beta[i] < l[k]) abs_ri = l[k] - beta[i]; else if (beta[i] > u[k]) abs_ri = beta[i] - u[k]; else xassert(t != t); if (abs_rp < abs_ri) p = i, abs_rp = abs_ri; } xassert(p != 0); return p; } /*********************************************************************** * spy_alloc_se - allocate dual pricing data block * * This routine allocates the memory for arrays used in the dual * pricing data block. */ void spy_alloc_se(SPXLP *lp, SPYSE *se) { int m = lp->m; int n = lp->n; #if 1 /* 30/III-2016 */ int i; #endif se->valid = 0; se->refsp = talloc(1+n, char); se->gamma = talloc(1+m, double); se->work = talloc(1+m, double); #if 1 /* 30/III-2016 */ se->u.n = m; se->u.nnz = 0; se->u.ind = talloc(1+m, int); se->u.vec = talloc(1+m, double); for (i = 1; i <= m; i++) se->u.vec[i] = 0.0; #endif return; } /*********************************************************************** * spy_reset_refsp - reset dual reference space * * This routine resets (re-initializes) the dual reference space * composing it from dual variables which are non-basic (corresponding * to basic primal variables) in the current basis, and sets all * weights gamma[i] to 1. */ void spy_reset_refsp(SPXLP *lp, SPYSE *se) { int m = lp->m; int n = lp->n; int *head = lp->head; char *refsp = se->refsp; double *gamma = se->gamma; int i, k; se->valid = 1; memset(&refsp[1], 0, n * sizeof(char)); for (i = 1; i <= m; i++) { k = head[i]; /* x[k] = xB[i] */ refsp[k] = 1; gamma[i] = 1.0; } return; } /*********************************************************************** * spy_eval_gamma_i - compute dual proj. steepest edge weight directly * * This routine computes dual projected steepest edge weight gamma[i], * 1 <= i <= m, for the current basis directly with the formula: * * n-m * gamma[i] = delta[i] + sum eta[j] * T[i,j]**2, * j=1 * * where T[i,j] is element of the current simplex table, and * * ( 1, if lambdaN[j] is in the reference space * eta[j] = { * ( 0, otherwise * * ( 1, if lambdaB[i] is in the reference space * delta[i] = { * ( 0, otherwise * * Dual basic variable lambdaN[j] corresponds to primal non-basic * variable xN[j], and dual non-basic variable lambdaB[j] corresponds * to primal basic variable xB[i]. * * NOTE: For testing/debugging only. */ double spy_eval_gamma_i(SPXLP *lp, SPYSE *se, int i) { int m = lp->m; int n = lp->n; int *head = lp->head; char *refsp = se->refsp; double *rho = se->work; int j, k; double gamma_i, t_ij; xassert(se->valid); xassert(1 <= i && i <= m); k = head[i]; /* x[k] = xB[i] */ gamma_i = (refsp[k] ? 1.0 : 0.0); spx_eval_rho(lp, i, rho); for (j = 1; j <= n-m; j++) { k = head[m+j]; /* x[k] = xN[j] */ if (refsp[k]) { t_ij = spx_eval_tij(lp, rho, j); gamma_i += t_ij * t_ij; } } return gamma_i; } /*********************************************************************** * spy_chuzr_pse - choose basic variable (dual projected steepest edge) * * This routine chooses most eligible basic variable xB[p] according * to the dual projected steepest edge method: * * r[p]**2 r[i]**2 * -------- = max -------- , * gamma[p] i in I gamma[i] * * ( lB[i] - beta[i], if beta[i] < lB[i] * ( * r[i] = { 0, if lB[i] <= beta[i] <= uB[i] * ( * ( uB[i] - beta[i], if beta[i] > uB[i] * * where I <= {1, ..., m} is the set of indices of eligible basic * variables, beta[i] is current value of xB[i], lB[i] and uB[i] are, * resp., lower and upper bounds of xB[i], r[i] is bound violation. * * Current values of basic variables should be placed in the array * locations beta[1], ..., beta[m]. * * Indices of eligible basic variables i in I should be placed in the * array locations list[1], ..., list[num], where num = |J| > 0 is the * total number of such variables. * * On exit the routine returns p, the index of the basic variable xB[p] * chosen. */ int spy_chuzr_pse(SPXLP *lp, SPYSE *se, const double beta[/*1+m*/], int num, const int list[]) { int m = lp->m; double *l = lp->l; double *u = lp->u; int *head = lp->head; double *gamma = se->gamma; int i, k, p, t; double best, ri, temp; xassert(0 < num && num <= m); p = 0, best = -1.0; for (t = 1; t <= num; t++) { i = list[t]; k = head[i]; /* x[k] = xB[i] */ if (beta[i] < l[k]) ri = l[k] - beta[i]; else if (beta[i] > u[k]) ri = u[k] - beta[i]; else xassert(t != t); /* FIXME */ if (gamma[i] < DBL_EPSILON) temp = 0.0; else temp = (ri * ri) / gamma[i]; if (best < temp) p = i, best = temp; } xassert(p != 0); return p; } /*********************************************************************** * spy_update_gamma - update dual proj. steepest edge weights exactly * * This routine updates the vector gamma = (gamma[i]) of dual projected * steepest edge weights exactly, for the adjacent basis. * * On entry to the routine the content of the se object should be valid * and should correspond to the current basis. * * The parameter 1 <= p <= m specifies basic variable xB[p] which * becomes non-basic variable xN[q] in the adjacent basis. * * The parameter 1 <= q <= n-m specified non-basic variable xN[q] which * becomes basic variable xB[p] in the adjacent basis. * * It is assumed that the array trow contains elements of p-th (pivot) * row T'[p] of the simplex table in locations trow[1], ..., trow[n-m]. * It is also assumed that the array tcol contains elements of q-th * (pivot) column T[q] of the simple table in locations tcol[1], ..., * tcol[m]. (These row and column should be computed for the current * basis.) * * For details about the formulae used see the program documentation. * * The routine also computes the relative error: * * e = |gamma[p] - gamma'[p]| / (1 + |gamma[p]|), * * where gamma'[p] is the weight for lambdaB[p] (which is dual * non-basic variable corresponding to xB[p]) on entry to the routine, * and returns e on exit. (If e happens to be large enough, the calling * program may reset the reference space, since other weights also may * be inaccurate.) */ double spy_update_gamma(SPXLP *lp, SPYSE *se, int p, int q, const double trow[/*1+n-m*/], const double tcol[/*1+m*/]) { int m = lp->m; int n = lp->n; int *head = lp->head; char *refsp = se->refsp; double *gamma = se->gamma; double *u = se->work; int i, j, k, ptr, end; double gamma_p, delta_p, e, r, t1, t2; xassert(se->valid); xassert(1 <= p && p <= m); xassert(1 <= q && q <= n-m); /* compute gamma[p] in current basis more accurately; also * compute auxiliary vector u */ k = head[p]; /* x[k] = xB[p] */ gamma_p = delta_p = (refsp[k] ? 1.0 : 0.0); for (i = 1; i <= m; i++) u[i] = 0.0; for (j = 1; j <= n-m; j++) { k = head[m+j]; /* x[k] = xN[j] */ if (refsp[k] && trow[j] != 0.0) { gamma_p += trow[j] * trow[j]; /* u := u + T[p,j] * N[j], where N[j] = A[k] is constraint * matrix column corresponding to xN[j] */ ptr = lp->A_ptr[k]; end = lp->A_ptr[k+1]; for (; ptr < end; ptr++) u[lp->A_ind[ptr]] += trow[j] * lp->A_val[ptr]; } } bfd_ftran(lp->bfd, u); /* compute relative error in gamma[p] */ e = fabs(gamma_p - gamma[p]) / (1.0 + gamma_p); /* compute new gamma[p] */ gamma[p] = gamma_p / (tcol[p] * tcol[p]); /* compute new gamma[i] for all i != p */ for (i = 1; i <= m; i++) { if (i == p) continue; /* compute r[i] = T[i,q] / T[p,q] */ r = tcol[i] / tcol[p]; /* compute new gamma[i] */ t1 = gamma[i] + r * (r * gamma_p + u[i] + u[i]); k = head[i]; /* x[k] = xB[i] */ t2 = (refsp[k] ? 1.0 : 0.0) + delta_p * r * r; gamma[i] = (t1 >= t2 ? t1 : t2); } return e; } #if 1 /* 30/III-2016 */ double spy_update_gamma_s(SPXLP *lp, SPYSE *se, int p, int q, const FVS *trow, const FVS *tcol) { /* sparse version of spy_update_gamma */ int m = lp->m; int n = lp->n; int *head = lp->head; char *refsp = se->refsp; double *gamma = se->gamma; double *u = se->work; int trow_nnz = trow->nnz; int *trow_ind = trow->ind; double *trow_vec = trow->vec; int tcol_nnz = tcol->nnz; int *tcol_ind = tcol->ind; double *tcol_vec = tcol->vec; int i, j, k, t, ptr, end; double gamma_p, delta_p, e, r, t1, t2; xassert(se->valid); xassert(1 <= p && p <= m); xassert(1 <= q && q <= n-m); /* compute gamma[p] in current basis more accurately; also * compute auxiliary vector u */ k = head[p]; /* x[k] = xB[p] */ gamma_p = delta_p = (refsp[k] ? 1.0 : 0.0); for (i = 1; i <= m; i++) u[i] = 0.0; for (t = 1; t <= trow_nnz; t++) { j = trow_ind[t]; k = head[m+j]; /* x[k] = xN[j] */ if (refsp[k]) { gamma_p += trow_vec[j] * trow_vec[j]; /* u := u + T[p,j] * N[j], where N[j] = A[k] is constraint * matrix column corresponding to xN[j] */ ptr = lp->A_ptr[k]; end = lp->A_ptr[k+1]; for (; ptr < end; ptr++) u[lp->A_ind[ptr]] += trow_vec[j] * lp->A_val[ptr]; } } bfd_ftran(lp->bfd, u); /* compute relative error in gamma[p] */ e = fabs(gamma_p - gamma[p]) / (1.0 + gamma_p); /* compute new gamma[p] */ gamma[p] = gamma_p / (tcol_vec[p] * tcol_vec[p]); /* compute new gamma[i] for all i != p */ for (t = 1; t <= tcol_nnz; t++) { i = tcol_ind[t]; if (i == p) continue; /* compute r[i] = T[i,q] / T[p,q] */ r = tcol_vec[i] / tcol_vec[p]; /* compute new gamma[i] */ t1 = gamma[i] + r * (r * gamma_p + u[i] + u[i]); k = head[i]; /* x[k] = xB[i] */ t2 = (refsp[k] ? 1.0 : 0.0) + delta_p * r * r; gamma[i] = (t1 >= t2 ? t1 : t2); } return e; } #endif /*********************************************************************** * spy_free_se - deallocate dual pricing data block * * This routine deallocates the memory used for arrays in the dual * pricing data block. */ void spy_free_se(SPXLP *lp, SPYSE *se) { xassert(lp == lp); tfree(se->refsp); tfree(se->gamma); tfree(se->work); #if 1 /* 30/III-2016 */ tfree(se->u.ind); tfree(se->u.vec); #endif return; } /* eof */ glpk-5.0/src/simplex/spychuzr.h0000644000062000006210000000645513766346220016024 0ustar maomkpasswd/* spychuzr.h */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2015 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef SPYCHUZR_H #define SPYCHUZR_H #include "spxlp.h" #define spy_chuzr_sel _glp_spy_chuzr_sel int spy_chuzr_sel(SPXLP *lp, const double beta[/*1+m*/], double tol, double tol1, int list[/*1+m*/]); /* select eligible basic variables */ #define spy_chuzr_std _glp_spy_chuzr_std int spy_chuzr_std(SPXLP *lp, const double beta[/*1+m*/], int num, const int list[]); /* choose basic variable (dual Dantzig's rule) */ typedef struct SPYSE SPYSE; struct SPYSE { /* dual projected steepest edge and Devex pricing data block */ int valid; /* content validity flag */ char *refsp; /* char refsp[1+n]; */ /* refsp[0] is not used; * refsp[k], 1 <= k <= n, is the flag meaning that dual variable * lambda[k] is in the dual reference space */ double *gamma; /* double gamma[1+m]; */ /* gamma[0] is not used; * gamma[i], 1 <= i <= m, is the weight for reduced cost r[i] * of dual non-basic variable lambdaB[j] in the current basis * (r[i] is bound violation for basic variable xB[i]) */ double *work; /* double work[1+m]; */ /* working array */ #if 1 /* 30/III-2016 */ FVS u; /* FVS u[1:m]; */ /* working vector */ #endif }; #define spy_alloc_se _glp_spy_alloc_se void spy_alloc_se(SPXLP *lp, SPYSE *se); /* allocate dual pricing data block */ #define spy_reset_refsp _glp_spy_reset_refsp void spy_reset_refsp(SPXLP *lp, SPYSE *se); /* reset dual reference space */ #define spy_eval_gamma_i _glp_spy_eval_gamma_i double spy_eval_gamma_i(SPXLP *lp, SPYSE *se, int i); /* compute dual projected steepest edge weight directly */ #define spy_chuzr_pse _glp_spy_chuzr_pse int spy_chuzr_pse(SPXLP *lp, SPYSE *se, const double beta[/*1+m*/], int num, const int list[]); /* choose basic variable (dual projected steepest edge) */ #define spy_update_gamma _glp_spy_update_gamma double spy_update_gamma(SPXLP *lp, SPYSE *se, int p, int q, const double trow[/*1+n-m*/], const double tcol[/*1+m*/]); /* update dual projected steepest edge weights exactly */ #if 1 /* 30/III-2016 */ #define spy_update_gamma_s _glp_spy_update_gamma_s double spy_update_gamma_s(SPXLP *lp, SPYSE *se, int p, int q, const FVS *trow, const FVS *tcol); /* sparse version of spy_update_gamma */ #endif #define spy_free_se _glp_spy_free_se void spy_free_se(SPXLP *lp, SPYSE *se); /* deallocate dual pricing data block */ #endif /* eof */ glpk-5.0/src/simplex/spydual.c0000644000062000006210000020557313766346220015613 0ustar maomkpasswd/* spydual.c */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2015-2017 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #if 1 /* 18/VII-2017 */ #define SCALE_Z 1 #endif #include "env.h" #include "simplex.h" #include "spxat.h" #include "spxnt.h" #include "spxprob.h" #include "spychuzc.h" #include "spychuzr.h" #if 0 /* 11/VI-2017 */ #if 1 /* 29/III-2016 */ #include "fvs.h" #endif #endif #define CHECK_ACCURACY 0 /* (for debugging) */ struct csa { /* common storage area */ SPXLP *lp; /* LP problem data and its (current) basis; this LP has m rows * and n columns */ int dir; /* original optimization direction: * +1 - minimization * -1 - maximization */ #if SCALE_Z double fz; /* factor used to scale original objective */ #endif double *orig_b; /* double orig_b[1+m]; */ /* copy of original right-hand sides */ double *orig_c; /* double orig_c[1+n]; */ /* copy of original objective coefficients */ double *orig_l; /* double orig_l[1+n]; */ /* copy of original lower bounds */ double *orig_u; /* double orig_u[1+n]; */ /* copy of original upper bounds */ SPXAT *at; /* mxn-matrix A of constraint coefficients, in sparse row-wise * format (NULL if not used) */ SPXNT *nt; /* mx(n-m)-matrix N composed of non-basic columns of constraint * matrix A, in sparse row-wise format (NULL if not used) */ int phase; /* search phase: * 0 - not determined yet * 1 - searching for dual feasible solution * 2 - searching for optimal solution */ double *beta; /* double beta[1+m]; */ /* beta[i] is primal value of basic variable xB[i] */ int beta_st; /* status of the vector beta: * 0 - undefined * 1 - just computed * 2 - updated */ double *d; /* double d[1+n-m]; */ /* d[j] is reduced cost of non-basic variable xN[j] */ int d_st; /* status of the vector d: * 0 - undefined * 1 - just computed * 2 - updated */ SPYSE *se; /* dual projected steepest edge and Devex pricing data block * (NULL if not used) */ #if 0 /* 30/III-2016 */ int num; /* number of eligible basic variables */ int *list; /* int list[1+m]; */ /* list[1], ..., list[num] are indices i of eligible basic * variables xB[i] */ #else FVS r; /* FVS r[1:m]; */ /* vector of primal infeasibilities */ /* r->nnz = num; r->ind = list */ /* vector r has the same status as vector beta (see above) */ #endif int p; /* xB[p] is a basic variable chosen to leave the basis */ #if 0 /* 29/III-2016 */ double *trow; /* double trow[1+n-m]; */ #else FVS trow; /* FVS trow[1:n-m]; */ #endif /* p-th (pivot) row of the simplex table */ #if 1 /* 16/III-2016 */ SPYBP *bp; /* SPYBP bp[1+n-m]; */ /* dual objective break-points */ #endif int q; /* xN[q] is a non-basic variable chosen to enter the basis */ #if 0 /* 29/III-2016 */ double *tcol; /* double tcol[1+m]; */ #else FVS tcol; /* FVS tcol[1:m]; */ #endif /* q-th (pivot) column of the simplex table */ double *work; /* double work[1+m]; */ /* working array */ double *work1; /* double work1[1+n-m]; */ /* another working array */ #if 0 /* 11/VI-2017 */ #if 1 /* 31/III-2016 */ FVS wrow; /* FVS wrow[1:n-m]; */ FVS wcol; /* FVS wcol[1:m]; */ /* working sparse vectors */ #endif #endif int p_stat, d_stat; /* primal and dual solution statuses */ /*--------------------------------------------------------------*/ /* control parameters (see struct glp_smcp) */ int msg_lev; /* message level */ int dualp; /* if this flag is set, report failure in case of instability */ #if 0 /* 16/III-2016 */ int harris; /* dual ratio test technique: * 0 - textbook ratio test * 1 - Harris' two pass ratio test */ #else int r_test; /* dual ratio test technique: * GLP_RT_STD - textbook ratio test * GLP_RT_HAR - Harris' two pass ratio test * GLP_RT_FLIP - long-step (flip-flop) ratio test */ #endif double tol_bnd, tol_bnd1; /* primal feasibility tolerances */ double tol_dj, tol_dj1; /* dual feasibility tolerances */ double tol_piv; /* pivot tolerance */ double obj_lim; /* objective limit */ int it_lim; /* iteration limit */ int tm_lim; /* time limit, milliseconds */ int out_frq; #if 0 /* 15/VII-2017 */ /* display output frequency, iterations */ #else /* display output frequency, milliseconds */ #endif int out_dly; /* display output delay, milliseconds */ /*--------------------------------------------------------------*/ /* working parameters */ double tm_beg; /* time value at the beginning of the search */ int it_beg; /* simplex iteration count at the beginning of the search */ int it_cnt; /* simplex iteration count; it increases by one every time the * basis changes */ int it_dpy; /* simplex iteration count at most recent display output */ #if 1 /* 15/VII-2017 */ double tm_dpy; /* time value at most recent display output */ #endif int inv_cnt; /* basis factorization count since most recent display output */ #if 1 /* 11/VII-2017 */ int degen; /* count of successive degenerate iterations; this count is used * to detect stalling */ #endif #if 1 /* 23/III-2016 */ int ns_cnt, ls_cnt; /* normal and long-step iteration count */ #endif }; /*********************************************************************** * check_flags - check correctness of active bound flags * * This routine checks that flags specifying active bounds of all * non-basic variables are correct. * * NOTE: It is important to note that if bounds of variables have been * changed, active bound flags should be corrected accordingly. */ static void check_flags(struct csa *csa) { SPXLP *lp = csa->lp; int m = lp->m; int n = lp->n; double *l = lp->l; double *u = lp->u; int *head = lp->head; char *flag = lp->flag; int j, k; for (j = 1; j <= n-m; j++) { k = head[m+j]; /* x[k] = xN[j] */ if (l[k] == -DBL_MAX && u[k] == +DBL_MAX) xassert(!flag[j]); else if (l[k] != -DBL_MAX && u[k] == +DBL_MAX) xassert(!flag[j]); else if (l[k] == -DBL_MAX && u[k] != +DBL_MAX) xassert(flag[j]); else if (l[k] == u[k]) xassert(!flag[j]); } return; } /*********************************************************************** * set_art_bounds - set artificial right-hand sides and bounds * * This routine sets artificial right-hand sides and artificial bounds * for all variables to minimize the sum of dual infeasibilities on * phase I. Given current reduced costs d = (d[j]) this routine also * sets active artificial bounds of non-basic variables to provide dual * feasibility (this is always possible because all variables have both * lower and upper artificial bounds). */ static void set_art_bounds(struct csa *csa) { SPXLP *lp = csa->lp; int m = lp->m; int n = lp->n; double *b = lp->b; double *l = lp->l; double *u = lp->u; int *head = lp->head; char *flag = lp->flag; double *d = csa->d; int i, j, k; #if 1 /* 31/III-2016: FIXME */ /* set artificial right-hand sides */ for (i = 1; i <= m; i++) b[i] = 0.0; /* set artificial bounds depending on types of variables */ for (k = 1; k <= n; k++) { if (csa->orig_l[k] == -DBL_MAX && csa->orig_u[k] == +DBL_MAX) { /* force free variables to enter the basis */ l[k] = -1e3, u[k] = +1e3; } else if (csa->orig_l[k] != -DBL_MAX && csa->orig_u[k] == +DBL_MAX) l[k] = 0.0, u[k] = +1.0; else if (csa->orig_l[k] == -DBL_MAX && csa->orig_u[k] != +DBL_MAX) l[k] = -1.0, u[k] = 0.0; else l[k] = u[k] = 0.0; } #endif /* set active artificial bounds for non-basic variables */ xassert(csa->d_st == 1); for (j = 1; j <= n-m; j++) { k = head[m+j]; /* x[k] = xN[j] */ flag[j] = (l[k] != u[k] && d[j] < 0.0); } /* invalidate values of basic variables, since active bounds of * non-basic variables have been changed */ csa->beta_st = 0; return; } /*********************************************************************** * set_orig_bounds - restore original right-hand sides and bounds * * This routine restores original right-hand sides and original bounds * for all variables. This routine also sets active original bounds for * non-basic variables; for double-bounded non-basic variables current * reduced costs d = (d[j]) are used to decide which bound (lower or * upper) should be made active. */ static void set_orig_bounds(struct csa *csa) { SPXLP *lp = csa->lp; int m = lp->m; int n = lp->n; double *b = lp->b; double *l = lp->l; double *u = lp->u; int *head = lp->head; char *flag = lp->flag; double *d = csa->d; int j, k; /* restore original right-hand sides */ memcpy(b, csa->orig_b, (1+m) * sizeof(double)); /* restore original bounds of all variables */ memcpy(l, csa->orig_l, (1+n) * sizeof(double)); memcpy(u, csa->orig_u, (1+n) * sizeof(double)); /* set active original bounds for non-basic variables */ xassert(csa->d_st == 1); for (j = 1; j <= n-m; j++) { k = head[m+j]; /* x[k] = xN[j] */ if (l[k] == -DBL_MAX && u[k] == +DBL_MAX) flag[j] = 0; else if (l[k] != -DBL_MAX && u[k] == +DBL_MAX) flag[j] = 0; else if (l[k] == -DBL_MAX && u[k] != +DBL_MAX) flag[j] = 1; else if (l[k] != u[k]) flag[j] = (d[j] < 0.0); else flag[j] = 0; } /* invalidate values of basic variables, since active bounds of * non-basic variables have been changed */ csa->beta_st = 0; return; } /*********************************************************************** * check_feas - check dual feasibility of basic solution * * This routine checks that reduced costs of all non-basic variables * d = (d[j]) have correct signs. * * Reduced cost d[j] is considered as having correct sign within the * specified tolerance depending on status of non-basic variable xN[j] * if one of the following conditions is met: * * xN[j] is free -eps <= d[j] <= +eps * * xN[j] has its lower bound active d[j] >= -eps * * xN[j] has its upper bound active d[j] <= +eps * * xN[j] is fixed d[j] has any value * * where eps = tol + tol1 * |cN[j]|, cN[j] is the objective coefficient * at xN[j]. (See also the routine spx_chuzc_sel.) * * The flag recov allows the routine to recover dual feasibility by * changing active bounds of non-basic variables. (For example, if * xN[j] has its lower bound active and d[j] < -eps, the feasibility * can be recovered by making xN[j] active on its upper bound.) * * If the basic solution is dual feasible, the routine returns zero. * If the basic solution is dual infeasible, but its dual feasibility * can be recovered (or has been recovered, if the flag recov is set), * the routine returns a negative value. Otherwise, the routine returns * the number j of some non-basic variable xN[j], whose reduced cost * d[j] is dual infeasible and cannot be recovered. */ static int check_feas(struct csa *csa, double tol, double tol1, int recov) { SPXLP *lp = csa->lp; int m = lp->m; int n = lp->n; double *c = lp->c; double *l = lp->l; double *u = lp->u; int *head = lp->head; char *flag = lp->flag; double *d = csa->d; int j, k, ret = 0; double eps; /* reduced costs should be just computed */ xassert(csa->d_st == 1); /* walk thru list of non-basic variables */ for (j = 1; j <= n-m; j++) { k = head[m+j]; /* x[k] = xN[j] */ if (l[k] == u[k]) { /* xN[j] is fixed variable; skip it */ continue; } /* determine absolute tolerance eps[j] */ eps = tol + tol1 * (c[k] >= 0.0 ? +c[k] : -c[k]); /* check dual feasibility of xN[j] */ if (d[j] > +eps) { /* xN[j] should have its lower bound active */ if (l[k] == -DBL_MAX || flag[j]) { /* but it either has no lower bound or its lower bound * is inactive */ if (l[k] == -DBL_MAX) { /* cannot recover, since xN[j] has no lower bound */ ret = j; break; } /* recovering is possible */ if (recov) flag[j] = 0; ret = -1; } } else if (d[j] < -eps) { /* xN[j] should have its upper bound active */ if (!flag[j]) { /* but it either has no upper bound or its upper bound * is inactive */ if (u[k] == +DBL_MAX) { /* cannot recover, since xN[j] has no upper bound */ ret = j; break; } /* recovering is possible */ if (recov) flag[j] = 1; ret = -1; } } } if (recov && ret) { /* invalidate values of basic variables, since active bounds * of non-basic variables have been changed */ csa->beta_st = 0; } return ret; } #if CHECK_ACCURACY /*********************************************************************** * err_in_vec - compute maximal relative error between two vectors * * This routine computes and returns maximal relative error between * n-vectors x and y: * * err_max = max |x[i] - y[i]| / (1 + |x[i]|). * * NOTE: This routine is intended only for debugging purposes. */ static double err_in_vec(int n, const double x[], const double y[]) { int i; double err, err_max; err_max = 0.0; for (i = 1; i <= n; i++) { err = fabs(x[i] - y[i]) / (1.0 + fabs(x[i])); if (err_max < err) err_max = err; } return err_max; } #endif #if CHECK_ACCURACY /*********************************************************************** * err_in_beta - compute maximal relative error in vector beta * * This routine computes and returns maximal relative error in vector * of values of basic variables beta = (beta[i]). * * NOTE: This routine is intended only for debugging purposes. */ static double err_in_beta(struct csa *csa) { SPXLP *lp = csa->lp; int m = lp->m; double err, *beta; beta = talloc(1+m, double); spx_eval_beta(lp, beta); err = err_in_vec(m, beta, csa->beta); tfree(beta); return err; } #endif #if CHECK_ACCURACY static double err_in_r(struct csa *csa) { SPXLP *lp = csa->lp; int m = lp->m; int i, k; double err, *r; r = talloc(1+m, double); for (i = 1; i <= m; i++) { k = lp->head[i]; if (csa->beta[i] < lp->l[k]) r[i] = lp->l[k] - csa->beta[i]; else if (csa->beta[i] > lp->u[k]) r[i] = lp->u[k] - csa->beta[i]; else r[i] = 0.0; if (fabs(r[i] - csa->r.vec[i]) > 1e-6) printf("i = %d; r = %g; csa->r = %g\n", i, r[i], csa->r.vec[i]); } err = err_in_vec(m, r, csa->r.vec); tfree(r); return err; } #endif #if CHECK_ACCURACY /*********************************************************************** * err_in_d - compute maximal relative error in vector d * * This routine computes and returns maximal relative error in vector * of reduced costs of non-basic variables d = (d[j]). * * NOTE: This routine is intended only for debugging purposes. */ static double err_in_d(struct csa *csa) { SPXLP *lp = csa->lp; int m = lp->m; int n = lp->n; int j; double err, *pi, *d; pi = talloc(1+m, double); d = talloc(1+n-m, double); spx_eval_pi(lp, pi); for (j = 1; j <= n-m; j++) d[j] = spx_eval_dj(lp, pi, j); err = err_in_vec(n-m, d, csa->d); tfree(pi); tfree(d); return err; } #endif #if CHECK_ACCURACY /*********************************************************************** * err_in_gamma - compute maximal relative error in vector gamma * * This routine computes and returns maximal relative error in vector * of projected steepest edge weights gamma = (gamma[j]). * * NOTE: This routine is intended only for debugging purposes. */ static double err_in_gamma(struct csa *csa) { SPXLP *lp = csa->lp; int m = lp->m; int n = lp->n; SPYSE *se = csa->se; int i; double err, *gamma; xassert(se != NULL); gamma = talloc(1+m, double); for (i = 1; i <= m; i++) gamma[i] = spy_eval_gamma_i(lp, se, i); err = err_in_vec(m, gamma, se->gamma); tfree(gamma); return err; } #endif #if CHECK_ACCURACY /*********************************************************************** * check_accuracy - check accuracy of basic solution components * * This routine checks accuracy of current basic solution components. * * NOTE: This routine is intended only for debugging purposes. */ static void check_accuracy(struct csa *csa) { double e_beta, e_r, e_d, e_gamma; e_beta = err_in_beta(csa); e_r = err_in_r(csa); e_d = err_in_d(csa); if (csa->se == NULL) e_gamma = 0.; else e_gamma = err_in_gamma(csa); xprintf("e_beta = %10.3e; e_r = %10.3e; e_d = %10.3e; e_gamma = %" "10.3e\n", e_beta, e_r, e_d, e_gamma); xassert(e_beta <= 1e-5 && e_d <= 1e-5 && e_gamma <= 1e-3); return; } #endif #if 1 /* 30/III-2016 */ static void spy_eval_r(SPXLP *lp, const double beta[/*1+m*/], double tol, double tol1, FVS *r) { /* this routine computes the vector of primal infeasibilities: * * ( lB[i] - beta[i] > 0, if beta[i] < lb[i] * r[i] = { 0, if lb[i] <= beta[i] <= ub[i] * ( ub[i] - beta[i] < 0, if beta[i] > ub[i] * * (this routine replaces spy_chuzr_sel) */ int m = lp->m; double *l = lp->l; double *u = lp->u; int *head = lp->head; int *ind = r->ind; double *vec = r->vec; int i, k, nnz = 0; double lk, uk, eps; xassert(r->n == m); /* walk thru the list of basic variables */ for (i = 1; i <= m; i++) { vec[i] = 0.0; k = head[i]; /* x[k] = xB[i] */ lk = l[k], uk = u[k]; /* check primal feasibility */ if (beta[i] < lk) { /* determine absolute tolerance eps1[i] */ eps = tol + tol1 * (lk >= 0.0 ? +lk : -lk); if (beta[i] < lk - eps) { /* lower bound is violated */ ind[++nnz] = i; vec[i] = lk - beta[i]; } } else if (beta[i] > uk) { /* determine absolute tolerance eps2[i] */ eps = tol + tol1 * (uk >= 0.0 ? +uk : -uk); if (beta[i] > uk + eps) { /* upper bound is violated */ ind[++nnz] = i; vec[i] = uk - beta[i]; } } } r->nnz = nnz; return; } #endif /*********************************************************************** * choose_pivot - choose xB[p] and xN[q] * * Given the list of eligible basic variables this routine first * chooses basic variable xB[p]. This choice is always possible, * because the list is assumed to be non-empty. Then the routine * computes p-th row T[p,*] of the simplex table T[i,j] and chooses * non-basic variable xN[q]. If the pivot T[p,q] is small in magnitude, * the routine attempts to choose another xB[p] and xN[q] in order to * avoid badly conditioned adjacent bases. * * If the normal choice was made, the routine returns zero. Otherwise, * if the long-step choice was made, the routine returns non-zero. */ #ifdef TIMING /* 31/III-2016 */ #include "choose_pivot.c" #else #define MIN_RATIO 0.0001 static int choose_pivot(struct csa *csa) { SPXLP *lp = csa->lp; int m = lp->m; int n = lp->n; double *l = lp->l; double *u = lp->u; int *head = lp->head; SPXAT *at = csa->at; SPXNT *nt = csa->nt; double *beta = csa->beta; double *d = csa->d; SPYSE *se = csa->se; #if 0 /* 30/III-2016 */ int *list = csa->list; #else int *list = csa->r.ind; #endif double *rho = csa->work; double *trow = csa->work1; SPYBP *bp = csa->bp; double tol_piv = csa->tol_piv; int try, nnn, j, k, p, q, t, t_best, nbp, ret; double big, temp, r, best_ratio, dz_best; xassert(csa->beta_st); xassert(csa->d_st); more: /* initial number of eligible basic variables */ #if 0 /* 30/III-2016 */ nnn = csa->num; #else nnn = csa->r.nnz; #endif /* nothing has been chosen so far */ csa->p = 0; best_ratio = 0.0; try = ret = 0; try: /* choose basic variable xB[p] */ xassert(nnn > 0); try++; if (se == NULL) { /* dual Dantzig's rule */ p = spy_chuzr_std(lp, beta, nnn, list); } else { /* dual projected steepest edge */ p = spy_chuzr_pse(lp, se, beta, nnn, list); } xassert(1 <= p && p <= m); /* compute p-th row of inv(B) */ spx_eval_rho(lp, p, rho); /* compute p-th row of the simplex table */ if (at != NULL) spx_eval_trow1(lp, at, rho, trow); else spx_nt_prod(lp, nt, trow, 1, -1.0, rho); #if 1 /* 23/III-2016 */ /* big := max(1, |trow[1]|, ..., |trow[n-m]|) */ big = 1.0; for (j = 1; j <= n-m; j++) { temp = trow[j]; if (temp < 0.0) temp = - temp; if (big < temp) big = temp; } #else /* this still puzzles me */ big = 1.0; #endif /* choose non-basic variable xN[q] */ k = head[p]; /* x[k] = xB[p] */ xassert(beta[p] < l[k] || beta[p] > u[k]); r = beta[p] < l[k] ? l[k] - beta[p] : u[k] - beta[p]; if (csa->r_test == GLP_RT_FLIP && try <= 2) { /* long-step ratio test */ #if 0 /* 23/III-2016 */ /* determine dual objective break-points */ nbp = spy_eval_bp(lp, d, r, trow, tol_piv, bp); if (nbp <= 1) goto skip; /* choose appropriate break-point */ t_best = 0, dz_best = -DBL_MAX; for (t = 1; t <= nbp; t++) { if (fabs(trow[bp[t].j]) / big >= MIN_RATIO) { if (dz_best < bp[t].dz) t_best = t, dz_best = bp[t].dz; } } if (t_best == 0) goto skip; #else int t, num, num1; double slope, teta_lim; /* determine dual objective break-points */ nbp = spy_ls_eval_bp(lp, d, r, trow, tol_piv, bp); if (nbp < 2) goto skip; /* set initial slope */ slope = fabs(r); /* estimate initial teta_lim */ teta_lim = DBL_MAX; for (t = 1; t <= nbp; t++) { if (teta_lim > bp[t].teta) teta_lim = bp[t].teta; } xassert(teta_lim >= 0.0); if (teta_lim < 1e-6) teta_lim = 1e-6; /* nothing has been chosen so far */ t_best = 0, dz_best = 0.0, num = 0; /* choose appropriate break-point */ while (num < nbp) { /* select and process a new portion of break-points */ num1 = spy_ls_select_bp(lp, trow, nbp, bp, num, &slope, teta_lim); for (t = num+1; t <= num1; t++) { if (fabs(trow[bp[t].j]) / big >= MIN_RATIO) { if (dz_best < bp[t].dz) t_best = t, dz_best = bp[t].dz; } } if (slope < 0.0) { /* the dual objective starts decreasing */ break; } /* the dual objective continues increasing */ num = num1; teta_lim += teta_lim; } if (dz_best == 0.0) goto skip; xassert(1 <= t_best && t_best <= num1); #endif /* the choice has been made */ csa->p = p; #if 0 /* 29/III-2016 */ memcpy(&csa->trow[1], &trow[1], (n-m) * sizeof(double)); #else memcpy(&csa->trow.vec[1], &trow[1], (n-m) * sizeof(double)); fvs_gather_vec(&csa->trow, DBL_EPSILON); #endif csa->q = bp[t_best].j; best_ratio = fabs(trow[bp[t_best].j]) / big; #if 0 xprintf("num = %d; t_best = %d; dz = %g\n", num, t_best, bp[t_best].dz); #endif ret = 1; goto done; skip: ; } if (csa->r_test == GLP_RT_STD) { /* textbook dual ratio test */ q = spy_chuzc_std(lp, d, r, trow, tol_piv, .30 * csa->tol_dj, .30 * csa->tol_dj1); } else { /* Harris' two-pass dual ratio test */ q = spy_chuzc_harris(lp, d, r, trow, tol_piv, .35 * csa->tol_dj, .35 * csa->tol_dj1); } if (q == 0) { /* dual unboundedness */ csa->p = p; #if 0 /* 29/III-2016 */ memcpy(&csa->trow[1], &trow[1], (n-m) * sizeof(double)); #else memcpy(&csa->trow.vec[1], &trow[1], (n-m) * sizeof(double)); fvs_gather_vec(&csa->trow, DBL_EPSILON); #endif csa->q = q; best_ratio = 1.0; goto done; } /* either keep previous choice or accept new choice depending on * which one is better */ if (best_ratio < fabs(trow[q]) / big) { csa->p = p; #if 0 /* 29/III-2016 */ memcpy(&csa->trow[1], &trow[1], (n-m) * sizeof(double)); #else memcpy(&csa->trow.vec[1], &trow[1], (n-m) * sizeof(double)); fvs_gather_vec(&csa->trow, DBL_EPSILON); #endif csa->q = q; best_ratio = fabs(trow[q]) / big; } /* check if the current choice is acceptable */ if (best_ratio >= MIN_RATIO || nnn == 1 || try == 5) goto done; /* try to choose other xB[p] and xN[q] */ /* find xB[p] in the list */ for (t = 1; t <= nnn; t++) if (list[t] == p) break; xassert(t <= nnn); /* move xB[p] to the end of the list */ list[t] = list[nnn], list[nnn] = p; /* and exclude it from consideration */ nnn--; /* repeat the choice */ goto try; done: /* the choice has been made */ #if 1 /* FIXME: currently just to avoid badly conditioned basis */ if (best_ratio < .001 * MIN_RATIO) { /* looks like this helps */ if (bfd_get_count(lp->bfd) > 0) return -1; /* didn't help; last chance to improve the choice */ if (tol_piv == csa->tol_piv) { tol_piv *= 1000.; goto more; } } #endif #if 1 /* FIXME */ if (ret) { /* invalidate basic solution components */ #if 0 /* 28/III-2016 */ csa->beta_st = csa->d_st = 0; #else /* dual solution remains valid */ csa->beta_st = 0; #endif /* set double-bounded non-basic variables to opposite bounds * for all break-points preceding the chosen one */ for (t = 1; t < t_best; t++) { k = head[m + bp[t].j]; xassert(-DBL_MAX < l[k] && l[k] < u[k] && u[k] < +DBL_MAX); lp->flag[bp[t].j] = !(lp->flag[bp[t].j]); } } #endif return ret; } #endif /*********************************************************************** * play_coef - play objective coefficients * * This routine is called after the reduced costs d[j] was updated and * the basis was changed to the adjacent one. * * It is assumed that before updating all the reduced costs d[j] were * strongly feasible, so in the adjacent basis d[j] remain feasible * within a tolerance, i.e. if some d[j] violates its zero bound, the * violation is insignificant. * * If some d[j] violates its zero bound, the routine changes (perturbs) * objective coefficient cN[j] to provide d[j] = 0, i.e. to make all * d[j] strongly feasible. Otherwise, if d[j] has a feasible value, the * routine attempts to reduce (or remove) perturbation in cN[j] by * shifting d[j] to its zero bound keeping strong feasibility. */ static void play_coef(struct csa *csa, int all) { SPXLP *lp = csa->lp; int m = lp->m; int n = lp->n; double *c = lp->c; double *l = lp->l; double *u = lp->u; int *head = lp->head; char *flag = lp->flag; double *orig_c = csa->orig_c; double *d = csa->d; const double *trow = csa->trow.vec; /* this vector was used to update d = (d[j]) */ int j, k; static const double eps = 1e-9; /* reduced costs d = (d[j]) should be valid */ xassert(csa->d_st); /* walk thru the list of non-basic variables xN = (xN[j]) */ for (j = 1; j <= n-m; j++) { if (all || trow[j] != 0.0) { /* d[j] has changed in the adjacent basis */ k = head[m+j]; /* x[k] = xN[j] */ if (l[k] == u[k]) { /* xN[j] is fixed variable */ /* d[j] may have any sign */ } else if (l[k] == -DBL_MAX && u[k] == +DBL_MAX) { /* xN[j] is free (unbounded) variable */ /* strong feasibility means d[j] = 0 */ c[k] -= d[j], d[j] = 0.0; /* in this case dual degeneracy is not critical, since * if xN[j] enters the basis, it never leaves it */ } else if (!flag[j]) { /* xN[j] has its lower bound active */ xassert(l[k] != -DBL_MAX); /* first, we remove current perturbation to provide * c[k] = orig_c[k] */ d[j] -= c[k] - orig_c[k], c[k] = orig_c[k]; /* strong feasibility means d[j] >= 0, but we provide * d[j] >= +eps to prevent dual degeneracy */ if (d[j] < +eps) c[k] -= d[j] - eps, d[j] = +eps; } else { /* xN[j] has its upper bound active */ xassert(u[k] != +DBL_MAX); /* similarly, we remove current perturbation to provide * c[k] = orig_c[k] */ d[j] -= c[k] - orig_c[k], c[k] = orig_c[k]; /* strong feasibility means d[j] <= 0, but we provide * d[j] <= -eps to prevent dual degeneracy */ if (d[j] > -eps) c[k] -= d[j] + eps, d[j] = -eps; } } } return; } #if 1 /* 11/VII-2017 */ static void remove_perturb(struct csa *csa) { /* remove perturbation */ SPXLP *lp = csa->lp; int n = lp->n; double *c = lp->c; double *orig_c = csa->orig_c; memcpy(c, orig_c, (1+n) * sizeof(double)); /* removing perturbation changes dual solution components */ csa->phase = csa->d_st = 0; #if 1 if (csa->msg_lev >= GLP_MSG_ALL) xprintf("Removing LP perturbation [%d]...\n", csa->it_cnt); #endif return; } #endif /*********************************************************************** * display - display search progress * * This routine displays some information about the search progress * that includes: * * search phase; * * number of simplex iterations performed by the solver; * * original objective value (only on phase II); * * sum of (scaled) dual infeasibilities for original bounds; * * number of dual infeasibilities (phase I) or primal infeasibilities * (phase II); * * number of basic factorizations since last display output. */ static void display(struct csa *csa, int spec) { SPXLP *lp = csa->lp; int m = lp->m; int n = lp->n; int *head = lp->head; char *flag = lp->flag; double *l = csa->orig_l; /* original lower bounds */ double *u = csa->orig_u; /* original upper bounds */ double *beta = csa->beta; double *d = csa->d; int j, k, nnn; double sum; #if 1 /* 15/VII-2017 */ double tm_cur; #endif /* check if the display output should be skipped */ if (csa->msg_lev < GLP_MSG_ON) goto skip; #if 1 /* 15/VII-2017 */ tm_cur = xtime(); #endif if (csa->out_dly > 0 && #if 0 /* 15/VII-2017 */ 1000.0 * xdifftime(xtime(), csa->tm_beg) < csa->out_dly) #else 1000.0 * xdifftime(tm_cur, csa->tm_beg) < csa->out_dly) #endif goto skip; if (csa->it_cnt == csa->it_dpy) goto skip; #if 0 /* 15/VII-2017 */ if (!spec && csa->it_cnt % csa->out_frq != 0) goto skip; #else if (!spec && 1000.0 * xdifftime(tm_cur, csa->tm_dpy) < csa->out_frq) goto skip; #endif /* display search progress depending on search phase */ switch (csa->phase) { case 1: /* compute sum and number of (scaled) dual infeasibilities * for original bounds */ sum = 0.0, nnn = 0; for (j = 1; j <= n-m; j++) { k = head[m+j]; /* x[k] = xN[j] */ if (d[j] > 0.0) { /* xN[j] should have lower bound */ if (l[k] == -DBL_MAX) { sum += d[j]; if (d[j] > +1e-7) nnn++; } } else if (d[j] < 0.0) { /* xN[j] should have upper bound */ if (u[k] == +DBL_MAX) { sum -= d[j]; if (d[j] < -1e-7) nnn++; } } } /* on phase I variables have artificial bounds which are * meaningless for original LP, so corresponding objective * function value is also meaningless */ #if 0 /* 27/III-2016 */ xprintf(" %6d: %23s inf = %11.3e (%d)", csa->it_cnt, "", sum, nnn); #else xprintf(" %6d: sum = %17.9e inf = %11.3e (%d)", csa->it_cnt, lp->c[0] - spx_eval_obj(lp, beta), sum, nnn); #endif break; case 2: /* compute sum of (scaled) dual infeasibilities */ sum = 0.0, nnn = 0; for (j = 1; j <= n-m; j++) { k = head[m+j]; /* x[k] = xN[j] */ if (d[j] > 0.0) { /* xN[j] should have its lower bound active */ if (l[k] == -DBL_MAX || flag[j]) sum += d[j]; } else if (d[j] < 0.0) { /* xN[j] should have its upper bound active */ if (l[k] != u[k] && !flag[j]) sum -= d[j]; } } /* compute number of primal infeasibilities */ nnn = spy_chuzr_sel(lp, beta, csa->tol_bnd, csa->tol_bnd1, NULL); xprintf("#%6d: obj = %17.9e inf = %11.3e (%d)", #if SCALE_Z csa->it_cnt, (double)csa->dir * csa->fz * spx_eval_obj(lp, beta), #else csa->it_cnt, (double)csa->dir * spx_eval_obj(lp, beta), #endif sum, nnn); break; default: xassert(csa != csa); } if (csa->inv_cnt) { /* number of basis factorizations performed */ xprintf(" %d", csa->inv_cnt); csa->inv_cnt = 0; } #if 1 /* 23/III-2016 */ if (csa->r_test == GLP_RT_FLIP) { /*xprintf(" %d,%d", csa->ns_cnt, csa->ls_cnt);*/ if (csa->ns_cnt + csa->ls_cnt) xprintf(" %d%%", (100 * csa->ls_cnt) / (csa->ns_cnt + csa->ls_cnt)); csa->ns_cnt = csa->ls_cnt = 0; } #endif xprintf("\n"); csa->it_dpy = csa->it_cnt; #if 1 /* 15/VII-2017 */ csa->tm_dpy = tm_cur; #endif skip: return; } #if 1 /* 31/III-2016 */ static void spy_update_r(SPXLP *lp, int p, int q, const double beta[/*1+m*/], const FVS *tcol, double tol, double tol1, FVS *r) { /* update vector r of primal infeasibilities */ /* it is assumed that xB[p] leaves the basis, xN[q] enters the * basis, and beta corresponds to the adjacent basis (i.e. this * routine should be called after spx_update_beta) */ int m = lp->m; int n = lp->n; double *l = lp->l; double *u = lp->u; int *head = lp->head; int *tcol_ind = tcol->ind; int *ind = r->ind; double *vec = r->vec; int i, k, t, nnz; double lk, uk, ri, eps; xassert(1 <= p && p <= m); xassert(1 <= q && q <= n-m); nnz = r->nnz; for (t = tcol->nnz; t >= 1; t--) { i = tcol_ind[t]; /* xB[i] changes in the adjacent basis to beta[i], so only * r[i] should be updated */ if (i == p) k = head[m+q]; /* x[k] = new xB[p] = old xN[q] */ else k = head[i]; /* x[k] = new xB[i] = old xB[i] */ lk = l[k], uk = u[k]; /* determine new value of r[i]; see spy_eval_r */ ri = 0.0; if (beta[i] < lk) { /* determine absolute tolerance eps1[i] */ eps = tol + tol1 * (lk >= 0.0 ? +lk : -lk); if (beta[i] < lk - eps) { /* lower bound is violated */ ri = lk - beta[i]; } } else if (beta[i] > uk) { /* determine absolute tolerance eps2[i] */ eps = tol + tol1 * (uk >= 0.0 ? +uk : -uk); if (beta[i] > uk + eps) { /* upper bound is violated */ ri = uk - beta[i]; } } if (ri == 0.0) { if (vec[i] != 0.0) vec[i] = DBL_MIN; /* will be removed */ } else { if (vec[i] == 0.0) ind[++nnz] = i; vec[i] = ri; } } r->nnz = nnz; /* remove zero elements */ fvs_adjust_vec(r, DBL_MIN + DBL_MIN); return; } #endif /*********************************************************************** * spy_dual - driver to the dual simplex method * * This routine is a driver to the two-phase dual simplex method. * * On exit this routine returns one of the following codes: * * 0 LP instance has been successfully solved. * * GLP_EOBJLL * Objective lower limit has been reached (maximization). * * GLP_EOBJUL * Objective upper limit has been reached (minimization). * * GLP_EITLIM * Iteration limit has been exhausted. * * GLP_ETMLIM * Time limit has been exhausted. * * GLP_EFAIL * The solver failed to solve LP instance. */ static int dual_simplex(struct csa *csa) { /* dual simplex method main logic routine */ SPXLP *lp = csa->lp; int m = lp->m; int n = lp->n; double *l = lp->l; double *u = lp->u; int *head = lp->head; SPXNT *nt = csa->nt; double *beta = csa->beta; double *d = csa->d; SPYSE *se = csa->se; #if 0 /* 30/III-2016 */ int *list = csa->list; #endif #if 0 /* 31/III-2016 */ double *trow = csa->trow; double *tcol = csa->tcol; #endif double *pi = csa->work; int msg_lev = csa->msg_lev; double tol_bnd = csa->tol_bnd; double tol_bnd1 = csa->tol_bnd1; double tol_dj = csa->tol_dj; double tol_dj1 = csa->tol_dj1; int j, k, p_flag, refct, ret; int perturb = -1; /* -1 = perturbation is not used, but enabled * 0 = perturbation is not used and disabled * +1 = perturbation is being used */ #if 1 /* 27/III-2016 */ int instab = 0; /* instability count */ #endif #ifdef TIMING double t_total = timer(); /* total time */ double t_fact = 0.0; /* computing factorization */ double t_rtest = 0.0; /* performing ratio test */ double t_pivcol = 0.0; /* computing pivot column */ double t_upd1 = 0.0; /* updating primal values */ double t_upd2 = 0.0; /* updating dual values */ double t_upd3 = 0.0; /* updating se weights */ double t_upd4 = 0.0; /* updating matrix N */ double t_upd5 = 0.0; /* updating factorization */ double t_start; #endif check_flags(csa); loop: /* main loop starts here */ /* compute factorization of the basis matrix */ if (!lp->valid) { double cond; #ifdef TIMING t_start = timer(); #endif ret = spx_factorize(lp); #ifdef TIMING t_fact += timer() - t_start; #endif csa->inv_cnt++; if (ret != 0) { if (msg_lev >= GLP_MSG_ERR) xprintf("Error: unable to factorize the basis matrix (%d" ")\n", ret); csa->p_stat = csa->d_stat = GLP_UNDEF; ret = GLP_EFAIL; goto fini; } /* check condition of the basis matrix */ cond = bfd_condest(lp->bfd); if (cond > 1.0 / DBL_EPSILON) { if (msg_lev >= GLP_MSG_ERR) xprintf("Error: basis matrix is singular to working prec" "ision (cond = %.3g)\n", cond); csa->p_stat = csa->d_stat = GLP_UNDEF; ret = GLP_EFAIL; goto fini; } if (cond > 0.001 / DBL_EPSILON) { if (msg_lev >= GLP_MSG_ERR) xprintf("Warning: basis matrix is ill-conditioned (cond " "= %.3g)\n", cond); } /* invalidate basic solution components */ csa->beta_st = csa->d_st = 0; } /* compute reduced costs of non-basic variables d = (d[j]) */ if (!csa->d_st) { spx_eval_pi(lp, pi); for (j = 1; j <= n-m; j++) d[j] = spx_eval_dj(lp, pi, j); csa->d_st = 1; /* just computed */ /* determine the search phase, if not determined yet (this is * performed only once at the beginning of the search for the * original bounds) */ if (!csa->phase) { j = check_feas(csa, 0.97 * tol_dj, 0.97 * tol_dj1, 1); if (j > 0) { /* initial basic solution is dual infeasible and cannot * be recovered */ /* start to search for dual feasible solution */ set_art_bounds(csa); csa->phase = 1; } else { /* initial basic solution is either dual feasible or its * dual feasibility has been recovered */ /* start to search for optimal solution */ csa->phase = 2; } } /* make sure that current basic solution is dual feasible */ #if 1 /* 11/VII-2017 */ if (perturb <= 0) { if (check_feas(csa, tol_dj, tol_dj1, 0)) { /* dual feasibility is broken due to excessive round-off * errors */ if (perturb < 0) { if (msg_lev >= GLP_MSG_ALL) xprintf("Perturbing LP to avoid instability [%d].." ".\n", csa->it_cnt); perturb = 1; goto loop; } if (msg_lev >= GLP_MSG_ERR) xprintf("Warning: numerical instability (dual simplex" ", phase %s)\n", csa->phase == 1 ? "I" : "II"); instab++; if (csa->dualp && instab >= 10) { /* do not continue the search; report failure */ if (msg_lev >= GLP_MSG_ERR) xprintf("Warning: dual simplex failed due to exces" "sive numerical instability\n"); csa->p_stat = csa->d_stat = GLP_UNDEF; ret = -1; /* special case of GLP_EFAIL */ goto fini; } /* try to recover dual feasibility */ j = check_feas(csa, 0.97 * tol_dj, 0.97 * tol_dj1, 1); if (j > 0) { /* dual feasibility cannot be recovered (this may * happen only on phase II) */ xassert(csa->phase == 2); /* restart to search for dual feasible solution */ set_art_bounds(csa); csa->phase = 1; } } } else { /* FIXME */ play_coef(csa, 1); } } #endif /* at this point the search phase is determined */ xassert(csa->phase == 1 || csa->phase == 2); /* compute values of basic variables beta = (beta[i]) */ if (!csa->beta_st) { spx_eval_beta(lp, beta); #if 1 /* 31/III-2016 */ /* also compute vector r of primal infeasibilities */ switch (csa->phase) { case 1: spy_eval_r(lp, beta, 1e-8, 0.0, &csa->r); break; case 2: spy_eval_r(lp, beta, tol_bnd, tol_bnd1, &csa->r); break; default: xassert(csa != csa); } #endif csa->beta_st = 1; /* just computed */ } /* reset the dual reference space, if necessary */ if (se != NULL && !se->valid) spy_reset_refsp(lp, se), refct = 1000; /* at this point the basis factorization and all basic solution * components are valid */ xassert(lp->valid && csa->beta_st && csa->d_st); #ifdef GLP_DEBUG check_flags(csa); #endif #if CHECK_ACCURACY /* check accuracy of current basic solution components (only for * debugging) */ check_accuracy(csa); #endif /* check if the objective limit has been reached */ if (csa->phase == 2 && csa->obj_lim != DBL_MAX && spx_eval_obj(lp, beta) >= csa->obj_lim) { #if 1 /* 26/V-2017 by mao */ if (perturb > 0) { /* remove perturbation */ /* [Should note that perturbing of objective coefficients * implemented in play_coef is equivalent to *relaxing* of * (zero) bounds of dual variables, so the perturbed * objective is always better (*greater*) that the original * one at the same basic point.] */ remove_perturb(csa); perturb = 0; } #endif if (csa->beta_st != 1) csa->beta_st = 0; if (csa->d_st != 1) csa->d_st = 0; if (!(csa->beta_st && csa->d_st)) goto loop; display(csa, 1); if (msg_lev >= GLP_MSG_ALL) xprintf("OBJECTIVE %s LIMIT REACHED; SEARCH TERMINATED\n", csa->dir > 0 ? "UPPER" : "LOWER"); #if 0 /* 30/III-2016 */ csa->num = spy_chuzr_sel(lp, beta, tol_bnd, tol_bnd1, list); csa->p_stat = (csa->num == 0 ? GLP_FEAS : GLP_INFEAS); #else spy_eval_r(lp, beta, tol_bnd, tol_bnd1, &csa->r); csa->p_stat = (csa->r.nnz == 0 ? GLP_FEAS : GLP_INFEAS); #endif csa->d_stat = GLP_FEAS; ret = (csa->dir > 0 ? GLP_EOBJUL : GLP_EOBJLL); goto fini; } /* check if the iteration limit has been exhausted */ if (csa->it_cnt - csa->it_beg >= csa->it_lim) { if (perturb > 0) { /* remove perturbation */ remove_perturb(csa); perturb = 0; } if (csa->beta_st != 1) csa->beta_st = 0; if (csa->d_st != 1) csa->d_st = 0; if (!(csa->beta_st && csa->d_st)) goto loop; display(csa, 1); if (msg_lev >= GLP_MSG_ALL) xprintf("ITERATION LIMIT EXCEEDED; SEARCH TERMINATED\n"); if (csa->phase == 1) { set_orig_bounds(csa); check_flags(csa); spx_eval_beta(lp, beta); } #if 0 /* 30/III-2016 */ csa->num = spy_chuzr_sel(lp, beta, tol_bnd, tol_bnd1, list); csa->p_stat = (csa->num == 0 ? GLP_FEAS : GLP_INFEAS); #else spy_eval_r(lp, beta, tol_bnd, tol_bnd1, &csa->r); csa->p_stat = (csa->r.nnz == 0 ? GLP_FEAS : GLP_INFEAS); #endif csa->d_stat = (csa->phase == 1 ? GLP_INFEAS : GLP_FEAS); ret = GLP_EITLIM; goto fini; } /* check if the time limit has been exhausted */ if (1000.0 * xdifftime(xtime(), csa->tm_beg) >= csa->tm_lim) { if (perturb > 0) { /* remove perturbation */ remove_perturb(csa); perturb = 0; } if (csa->beta_st != 1) csa->beta_st = 0; if (csa->d_st != 1) csa->d_st = 0; if (!(csa->beta_st && csa->d_st)) goto loop; display(csa, 1); if (msg_lev >= GLP_MSG_ALL) xprintf("TIME LIMIT EXCEEDED; SEARCH TERMINATED\n"); if (csa->phase == 1) { set_orig_bounds(csa); check_flags(csa); spx_eval_beta(lp, beta); } #if 0 /* 30/III-2016 */ csa->num = spy_chuzr_sel(lp, beta, tol_bnd, tol_bnd1, list); csa->p_stat = (csa->num == 0 ? GLP_FEAS : GLP_INFEAS); #else spy_eval_r(lp, beta, tol_bnd, tol_bnd1, &csa->r); csa->p_stat = (csa->r.nnz == 0 ? GLP_FEAS : GLP_INFEAS); #endif csa->d_stat = (csa->phase == 1 ? GLP_INFEAS : GLP_FEAS); ret = GLP_ETMLIM; goto fini; } /* display the search progress */ display(csa, 0); /* select eligible basic variables */ #if 0 /* 31/III-2016; not needed because r is valid */ switch (csa->phase) { case 1: #if 0 /* 30/III-2016 */ csa->num = spy_chuzr_sel(lp, beta, 1e-8, 0.0, list); #else spy_eval_r(lp, beta, 1e-8, 0.0, &csa->r); #endif break; case 2: #if 0 /* 30/III-2016 */ csa->num = spy_chuzr_sel(lp, beta, tol_bnd, tol_bnd1, list); #else spy_eval_r(lp, beta, tol_bnd, tol_bnd1, &csa->r); #endif break; default: xassert(csa != csa); } #endif /* check for optimality */ #if 0 /* 30/III-2016 */ if (csa->num == 0) #else if (csa->r.nnz == 0) #endif { if (perturb > 0 && csa->phase == 2) { /* remove perturbation */ remove_perturb(csa); perturb = 0; } if (csa->beta_st != 1) csa->beta_st = 0; if (csa->d_st != 1) csa->d_st = 0; if (!(csa->beta_st && csa->d_st)) goto loop; /* current basis is optimal */ display(csa, 1); switch (csa->phase) { case 1: /* check for dual feasibility */ set_orig_bounds(csa); check_flags(csa); if (check_feas(csa, tol_dj, tol_dj1, 0) == 0) { /* dual feasible solution found; switch to phase II */ csa->phase = 2; xassert(!csa->beta_st); goto loop; } #if 1 /* 26/V-2017 by cmatraki */ if (perturb > 0) { /* remove perturbation */ remove_perturb(csa); perturb = 0; goto loop; } #endif /* no dual feasible solution exists */ if (msg_lev >= GLP_MSG_ALL) xprintf("LP HAS NO DUAL FEASIBLE SOLUTION\n"); spx_eval_beta(lp, beta); #if 0 /* 30/III-2016 */ csa->num = spy_chuzr_sel(lp, beta, tol_bnd, tol_bnd1, list); csa->p_stat = (csa->num == 0 ? GLP_FEAS : GLP_INFEAS); #else spy_eval_r(lp, beta, tol_bnd, tol_bnd1, &csa->r); csa->p_stat = (csa->r.nnz == 0 ? GLP_FEAS : GLP_INFEAS); #endif csa->d_stat = GLP_NOFEAS; ret = 0; goto fini; case 2: /* optimal solution found */ if (msg_lev >= GLP_MSG_ALL) xprintf("OPTIMAL LP SOLUTION FOUND\n"); csa->p_stat = csa->d_stat = GLP_FEAS; ret = 0; goto fini; default: xassert(csa != csa); } } /* choose xB[p] and xN[q] */ #if 0 /* 23/III-2016 */ choose_pivot(csa); #else #ifdef TIMING t_start = timer(); #endif #if 1 /* 31/III-2016 */ ret = choose_pivot(csa); #endif #ifdef TIMING t_rtest += timer() - t_start; #endif if (ret < 0) { lp->valid = 0; goto loop; } if (ret == 0) csa->ns_cnt++; else csa->ls_cnt++; #endif /* check for dual unboundedness */ if (csa->q == 0) { if (perturb > 0) { /* remove perturbation */ remove_perturb(csa); perturb = 0; } if (csa->beta_st != 1) csa->beta_st = 0; if (csa->d_st != 1) csa->d_st = 0; if (!(csa->beta_st && csa->d_st)) goto loop; display(csa, 1); switch (csa->phase) { case 1: /* this should never happen */ if (msg_lev >= GLP_MSG_ERR) xprintf("Error: dual simplex failed\n"); csa->p_stat = csa->d_stat = GLP_UNDEF; ret = GLP_EFAIL; goto fini; case 2: /* dual unboundedness detected */ if (msg_lev >= GLP_MSG_ALL) xprintf("LP HAS NO PRIMAL FEASIBLE SOLUTION\n"); csa->p_stat = GLP_NOFEAS; csa->d_stat = GLP_FEAS; ret = 0; goto fini; default: xassert(csa != csa); } } /* compute q-th column of the simplex table */ #ifdef TIMING t_start = timer(); #endif #if 0 /* 31/III-2016 */ spx_eval_tcol(lp, csa->q, tcol); #else spx_eval_tcol(lp, csa->q, csa->tcol.vec); fvs_gather_vec(&csa->tcol, DBL_EPSILON); #endif #ifdef TIMING t_pivcol += timer() - t_start; #endif /* FIXME: tcol[p] and trow[q] should be close to each other */ #if 0 /* 26/V-2017 by cmatraki */ xassert(csa->tcol.vec[csa->p] != 0.0); #else if (csa->tcol.vec[csa->p] == 0.0) { if (msg_lev >= GLP_MSG_ERR) xprintf("Error: tcol[p] = 0.0\n"); csa->p_stat = csa->d_stat = GLP_UNDEF; ret = GLP_EFAIL; goto fini; } #endif /* update values of basic variables for adjacent basis */ k = head[csa->p]; /* x[k] = xB[p] */ p_flag = (l[k] != u[k] && beta[csa->p] > u[k]); #if 0 /* 16/III-2016 */ spx_update_beta(lp, beta, csa->p, p_flag, csa->q, tcol); csa->beta_st = 2; #else /* primal solution may be invalidated due to long step */ #ifdef TIMING t_start = timer(); #endif if (csa->beta_st) #if 0 /* 30/III-2016 */ { spx_update_beta(lp, beta, csa->p, p_flag, csa->q, tcol); #else { spx_update_beta_s(lp, beta, csa->p, p_flag, csa->q, &csa->tcol); /* also update vector r of primal infeasibilities */ /*fvs_check_vec(&csa->r);*/ switch (csa->phase) { case 1: spy_update_r(lp, csa->p, csa->q, beta, &csa->tcol, 1e-8, 0.0, &csa->r); break; case 2: spy_update_r(lp, csa->p, csa->q, beta, &csa->tcol, tol_bnd, tol_bnd1, &csa->r); break; default: xassert(csa != csa); } /*fvs_check_vec(&csa->r);*/ #endif csa->beta_st = 2; } #ifdef TIMING t_upd1 += timer() - t_start; #endif #endif #if 1 /* 11/VII-2017 */ /* check for stalling */ { int k; xassert(1 <= csa->p && csa->p <= m); xassert(1 <= csa->q && csa->q <= n-m); /* FIXME: recompute d[q]; see spx_update_d */ k = head[m+csa->q]; /* x[k] = xN[q] */ if (!(lp->l[k] == -DBL_MAX && lp->u[k] == +DBL_MAX)) { if (fabs(d[csa->q]) >= 1e-6) { csa->degen = 0; goto skip1; } /* degenerate iteration has been detected */ csa->degen++; if (perturb < 0 && csa->degen >= 200) { if (msg_lev >= GLP_MSG_ALL) xprintf("Perturbing LP to avoid stalling [%d]...\n", csa->it_cnt); perturb = 1; } skip1: ; } } #endif /* update reduced costs of non-basic variables for adjacent * basis */ #if 1 /* 28/III-2016 */ xassert(csa->d_st); #endif #ifdef TIMING t_start = timer(); #endif #if 0 /* 30/III-2016 */ if (spx_update_d(lp, d, csa->p, csa->q, trow, tcol) <= 1e-9) #else if (spx_update_d_s(lp, d, csa->p, csa->q, &csa->trow, &csa->tcol) <= 1e-9) #endif { /* successful updating */ csa->d_st = 2; } else { /* new reduced costs are inaccurate */ csa->d_st = 0; } #ifdef TIMING t_upd2 += timer() - t_start; #endif /* update steepest edge weights for adjacent basis, if used */ #ifdef TIMING t_start = timer(); #endif if (se != NULL) { if (refct > 0) #if 0 /* 30/III-2016 */ { if (spy_update_gamma(lp, se, csa->p, csa->q, trow, tcol) <= 1e-3) #else { if (spy_update_gamma_s(lp, se, csa->p, csa->q, &csa->trow, &csa->tcol) <= 1e-3) #endif { /* successful updating */ refct--; } else { /* new weights are inaccurate; reset reference space */ se->valid = 0; } } else { /* too many updates; reset reference space */ se->valid = 0; } } #ifdef TIMING t_upd3 += timer() - t_start; #endif #ifdef TIMING t_start = timer(); #endif /* update matrix N for adjacent basis, if used */ if (nt != NULL) spx_update_nt(lp, nt, csa->p, csa->q); #ifdef TIMING t_upd4 += timer() - t_start; #endif /* change current basis header to adjacent one */ spx_change_basis(lp, csa->p, p_flag, csa->q); /* and update factorization of the basis matrix */ #ifdef TIMING t_start = timer(); #endif #if 0 /* 16/III-2016 */ if (csa->p > 0) #endif spx_update_invb(lp, csa->p, head[csa->p]); #ifdef TIMING t_upd5 += timer() - t_start; #endif if (perturb > 0 && csa->d_st) play_coef(csa, 0); /* dual simplex iteration complete */ csa->it_cnt++; goto loop; fini: #ifdef TIMING t_total = timer() - t_total; xprintf("Total time = %10.3f\n", t_total); xprintf("Factorization = %10.3f\n", t_fact); xprintf("Ratio test = %10.3f\n", t_rtest); xprintf("Pivot column = %10.3f\n", t_pivcol); xprintf("Updating beta = %10.3f\n", t_upd1); xprintf("Updating d = %10.3f\n", t_upd2); xprintf("Updating gamma = %10.3f\n", t_upd3); xprintf("Updating N = %10.3f\n", t_upd4); xprintf("Updating inv(B) = %10.3f\n", t_upd5); #endif return ret; } int spy_dual(glp_prob *P, const glp_smcp *parm) { /* driver to the dual simplex method */ struct csa csa_, *csa = &csa_; SPXLP lp; SPXAT at; SPXNT nt; SPYSE se; int ret, *map, *daeh; #if SCALE_Z int i, j, k; #endif /* build working LP and its initial basis */ memset(csa, 0, sizeof(struct csa)); csa->lp = &lp; spx_init_lp(csa->lp, P, parm->excl); spx_alloc_lp(csa->lp); map = talloc(1+P->m+P->n, int); spx_build_lp(csa->lp, P, parm->excl, parm->shift, map); spx_build_basis(csa->lp, P, map); switch (P->dir) { case GLP_MIN: csa->dir = +1; break; case GLP_MAX: csa->dir = -1; break; default: xassert(P != P); } #if SCALE_Z csa->fz = 0.0; for (k = 1; k <= csa->lp->n; k++) { double t = fabs(csa->lp->c[k]); if (csa->fz < t) csa->fz = t; } if (csa->fz <= 1000.0) csa->fz = 1.0; else csa->fz /= 1000.0; /*xprintf("csa->fz = %g\n", csa->fz);*/ for (k = 0; k <= csa->lp->n; k++) csa->lp->c[k] /= csa->fz; #endif csa->orig_b = talloc(1+csa->lp->m, double); memcpy(csa->orig_b, csa->lp->b, (1+csa->lp->m) * sizeof(double)); csa->orig_c = talloc(1+csa->lp->n, double); memcpy(csa->orig_c, csa->lp->c, (1+csa->lp->n) * sizeof(double)); csa->orig_l = talloc(1+csa->lp->n, double); memcpy(csa->orig_l, csa->lp->l, (1+csa->lp->n) * sizeof(double)); csa->orig_u = talloc(1+csa->lp->n, double); memcpy(csa->orig_u, csa->lp->u, (1+csa->lp->n) * sizeof(double)); switch (parm->aorn) { case GLP_USE_AT: /* build matrix A in row-wise format */ csa->at = &at; csa->nt = NULL; spx_alloc_at(csa->lp, csa->at); spx_build_at(csa->lp, csa->at); break; case GLP_USE_NT: /* build matrix N in row-wise format for initial basis */ csa->at = NULL; csa->nt = &nt; spx_alloc_nt(csa->lp, csa->nt); spx_init_nt(csa->lp, csa->nt); spx_build_nt(csa->lp, csa->nt); break; default: xassert(parm != parm); } /* allocate and initialize working components */ csa->phase = 0; csa->beta = talloc(1+csa->lp->m, double); csa->beta_st = 0; csa->d = talloc(1+csa->lp->n-csa->lp->m, double); csa->d_st = 0; switch (parm->pricing) { case GLP_PT_STD: csa->se = NULL; break; case GLP_PT_PSE: csa->se = &se; spy_alloc_se(csa->lp, csa->se); break; default: xassert(parm != parm); } #if 0 /* 30/III-2016 */ csa->list = talloc(1+csa->lp->m, int); csa->trow = talloc(1+csa->lp->n-csa->lp->m, double); csa->tcol = talloc(1+csa->lp->m, double); #else fvs_alloc_vec(&csa->r, csa->lp->m); fvs_alloc_vec(&csa->trow, csa->lp->n-csa->lp->m); fvs_alloc_vec(&csa->tcol, csa->lp->m); #endif #if 1 /* 16/III-2016 */ csa->bp = NULL; #endif csa->work = talloc(1+csa->lp->m, double); csa->work1 = talloc(1+csa->lp->n-csa->lp->m, double); #if 0 /* 11/VI-2017 */ #if 1 /* 31/III-2016 */ fvs_alloc_vec(&csa->wrow, csa->lp->n-csa->lp->m); fvs_alloc_vec(&csa->wcol, csa->lp->m); #endif #endif /* initialize control parameters */ csa->msg_lev = parm->msg_lev; csa->dualp = (parm->meth == GLP_DUALP); #if 0 /* 16/III-2016 */ switch (parm->r_test) { case GLP_RT_STD: csa->harris = 0; break; case GLP_RT_HAR: csa->harris = 1; break; default: xassert(parm != parm); } #else switch (parm->r_test) { case GLP_RT_STD: case GLP_RT_HAR: break; case GLP_RT_FLIP: csa->bp = talloc(1+csa->lp->n-csa->lp->m, SPYBP); break; default: xassert(parm != parm); } csa->r_test = parm->r_test; #endif csa->tol_bnd = parm->tol_bnd; csa->tol_bnd1 = .001 * parm->tol_bnd; csa->tol_dj = parm->tol_dj; csa->tol_dj1 = .001 * parm->tol_dj; #if 0 csa->tol_dj1 = 1e-9 * parm->tol_dj; #endif csa->tol_piv = parm->tol_piv; switch (P->dir) { case GLP_MIN: csa->obj_lim = + parm->obj_ul; break; case GLP_MAX: csa->obj_lim = - parm->obj_ll; break; default: xassert(parm != parm); } #if SCALE_Z if (csa->obj_lim != DBL_MAX) csa->obj_lim /= csa->fz; #endif csa->it_lim = parm->it_lim; csa->tm_lim = parm->tm_lim; csa->out_frq = parm->out_frq; csa->out_dly = parm->out_dly; /* initialize working parameters */ csa->tm_beg = xtime(); csa->it_beg = csa->it_cnt = P->it_cnt; csa->it_dpy = -1; #if 1 /* 15/VII-2017 */ csa->tm_dpy = 0.0; #endif csa->inv_cnt = 0; #if 1 /* 11/VII-2017 */ csa->degen = 0; #endif #if 1 /* 23/III-2016 */ csa->ns_cnt = csa->ls_cnt = 0; #endif /* try to solve working LP */ ret = dual_simplex(csa); /* return basis factorization back to problem object */ P->valid = csa->lp->valid; P->bfd = csa->lp->bfd; /* set solution status */ P->pbs_stat = csa->p_stat; P->dbs_stat = csa->d_stat; /* if the solver failed, do not store basis header and basic * solution components to problem object */ if (ret == GLP_EFAIL) goto skip; /* convert working LP basis to original LP basis and store it to * problem object */ daeh = talloc(1+csa->lp->n, int); spx_store_basis(csa->lp, P, map, daeh); /* compute simplex multipliers for final basic solution found by * the solver */ spx_eval_pi(csa->lp, csa->work); /* convert working LP solution to original LP solution and store * it to problem object */ #if SCALE_Z for (i = 1; i <= csa->lp->m; i++) csa->work[i] *= csa->fz; for (j = 1; j <= csa->lp->n-csa->lp->m; j++) csa->d[j] *= csa->fz; #endif spx_store_sol(csa->lp, P, parm->shift, map, daeh, csa->beta, csa->work, csa->d); tfree(daeh); /* save simplex iteration count */ P->it_cnt = csa->it_cnt; /* report auxiliary/structural variable causing unboundedness */ P->some = 0; if (csa->p_stat == GLP_NOFEAS && csa->d_stat == GLP_FEAS) { int k, kk; /* xB[p] = x[k] causes dual unboundedness */ xassert(1 <= csa->p && csa->p <= csa->lp->m); k = csa->lp->head[csa->p]; xassert(1 <= k && k <= csa->lp->n); /* convert to number of original variable */ for (kk = 1; kk <= P->m + P->n; kk++) { if (abs(map[kk]) == k) { P->some = kk; break; } } xassert(P->some != 0); } skip: /* deallocate working objects and arrays */ spx_free_lp(csa->lp); tfree(map); tfree(csa->orig_b); tfree(csa->orig_c); tfree(csa->orig_l); tfree(csa->orig_u); if (csa->at != NULL) spx_free_at(csa->lp, csa->at); if (csa->nt != NULL) spx_free_nt(csa->lp, csa->nt); tfree(csa->beta); tfree(csa->d); if (csa->se != NULL) spy_free_se(csa->lp, csa->se); #if 0 /* 30/III-2016 */ tfree(csa->list); tfree(csa->trow); #else fvs_free_vec(&csa->r); fvs_free_vec(&csa->trow); #endif #if 1 /* 16/III-2016 */ if (csa->bp != NULL) tfree(csa->bp); #endif #if 0 /* 29/III-2016 */ tfree(csa->tcol); #else fvs_free_vec(&csa->tcol); #endif tfree(csa->work); tfree(csa->work1); #if 0 /* 11/VI-2017 */ #if 1 /* 31/III-2016 */ fvs_free_vec(&csa->wrow); fvs_free_vec(&csa->wcol); #endif #endif /* return to calling program */ return ret >= 0 ? ret : GLP_EFAIL; } /* eof */ glpk-5.0/src/zlib/0000755000062000006210000000000013766346220013231 5ustar maomkpasswdglpk-5.0/src/zlib/adler32.c0000644000062000006210000001167013766346220014636 0ustar maomkpasswd/* adler32.c -- compute the Adler-32 checksum of a data stream * Copyright (C) 1995-2007 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $Id$ */ #include "zutil.h" #define local static local uLong adler32_combine_(uLong adler1, uLong adler2, z_off64_t len2); #define BASE 65521UL /* largest prime smaller than 65536 */ #define NMAX 5552 /* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ #define DO1(buf,i) {adler += (buf)[i]; sum2 += adler;} #define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); #define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); #define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); #define DO16(buf) DO8(buf,0); DO8(buf,8); /* use NO_DIVIDE if your processor does not do division in hardware */ #ifdef NO_DIVIDE # define MOD(a) \ do { \ if (a >= (BASE << 16)) a -= (BASE << 16); \ if (a >= (BASE << 15)) a -= (BASE << 15); \ if (a >= (BASE << 14)) a -= (BASE << 14); \ if (a >= (BASE << 13)) a -= (BASE << 13); \ if (a >= (BASE << 12)) a -= (BASE << 12); \ if (a >= (BASE << 11)) a -= (BASE << 11); \ if (a >= (BASE << 10)) a -= (BASE << 10); \ if (a >= (BASE << 9)) a -= (BASE << 9); \ if (a >= (BASE << 8)) a -= (BASE << 8); \ if (a >= (BASE << 7)) a -= (BASE << 7); \ if (a >= (BASE << 6)) a -= (BASE << 6); \ if (a >= (BASE << 5)) a -= (BASE << 5); \ if (a >= (BASE << 4)) a -= (BASE << 4); \ if (a >= (BASE << 3)) a -= (BASE << 3); \ if (a >= (BASE << 2)) a -= (BASE << 2); \ if (a >= (BASE << 1)) a -= (BASE << 1); \ if (a >= BASE) a -= BASE; \ } while (0) # define MOD4(a) \ do { \ if (a >= (BASE << 4)) a -= (BASE << 4); \ if (a >= (BASE << 3)) a -= (BASE << 3); \ if (a >= (BASE << 2)) a -= (BASE << 2); \ if (a >= (BASE << 1)) a -= (BASE << 1); \ if (a >= BASE) a -= BASE; \ } while (0) #else # define MOD(a) a %= BASE # define MOD4(a) a %= BASE #endif /* ========================================================================= */ uLong ZEXPORT adler32(adler, buf, len) uLong adler; const Bytef *buf; uInt len; { unsigned long sum2; unsigned n; /* split Adler-32 into component sums */ sum2 = (adler >> 16) & 0xffff; adler &= 0xffff; /* in case user likes doing a byte at a time, keep it fast */ if (len == 1) { adler += buf[0]; if (adler >= BASE) adler -= BASE; sum2 += adler; if (sum2 >= BASE) sum2 -= BASE; return adler | (sum2 << 16); } /* initial Adler-32 value (deferred check for len == 1 speed) */ if (buf == Z_NULL) return 1L; /* in case short lengths are provided, keep it somewhat fast */ if (len < 16) { while (len--) { adler += *buf++; sum2 += adler; } if (adler >= BASE) adler -= BASE; MOD4(sum2); /* only added so many BASE's */ return adler | (sum2 << 16); } /* do length NMAX blocks -- requires just one modulo operation */ while (len >= NMAX) { len -= NMAX; n = NMAX / 16; /* NMAX is divisible by 16 */ do { DO16(buf); /* 16 sums unrolled */ buf += 16; } while (--n); MOD(adler); MOD(sum2); } /* do remaining bytes (less than NMAX, still just one modulo) */ if (len) { /* avoid modulos if none remaining */ while (len >= 16) { len -= 16; DO16(buf); buf += 16; } while (len--) { adler += *buf++; sum2 += adler; } MOD(adler); MOD(sum2); } /* return recombined sums */ return adler | (sum2 << 16); } /* ========================================================================= */ local uLong adler32_combine_(adler1, adler2, len2) uLong adler1; uLong adler2; z_off64_t len2; { unsigned long sum1; unsigned long sum2; unsigned rem; /* the derivation of this formula is left as an exercise for the reader */ rem = (unsigned)(len2 % BASE); sum1 = adler1 & 0xffff; sum2 = rem * sum1; MOD(sum2); sum1 += (adler2 & 0xffff) + BASE - 1; sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem; if (sum1 >= BASE) sum1 -= BASE; if (sum1 >= BASE) sum1 -= BASE; if (sum2 >= (BASE << 1)) sum2 -= (BASE << 1); if (sum2 >= BASE) sum2 -= BASE; return sum1 | (sum2 << 16); } /* ========================================================================= */ uLong ZEXPORT adler32_combine(adler1, adler2, len2) uLong adler1; uLong adler2; z_off_t len2; { return adler32_combine_(adler1, adler2, len2); } uLong ZEXPORT adler32_combine64(adler1, adler2, len2) uLong adler1; uLong adler2; z_off64_t len2; { return adler32_combine_(adler1, adler2, len2); } glpk-5.0/src/zlib/compress.c0000644000062000006210000000473013766346220015234 0ustar maomkpasswd/* compress.c -- compress a memory buffer * Copyright (C) 1995-2005 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $Id$ */ #define ZLIB_INTERNAL #include "zlib.h" /* =========================================================================== Compresses the source buffer into the destination buffer. The level parameter has the same meaning as in deflateInit. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be at least 0.1% larger than sourceLen plus 12 bytes. Upon exit, destLen is the actual size of the compressed buffer. compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer, Z_STREAM_ERROR if the level parameter is invalid. */ int ZEXPORT compress2 (dest, destLen, source, sourceLen, level) Bytef *dest; uLongf *destLen; const Bytef *source; uLong sourceLen; int level; { z_stream stream; int err; stream.next_in = (Bytef*)source; stream.avail_in = (uInt)sourceLen; #ifdef MAXSEG_64K /* Check for source > 64K on 16-bit machine: */ if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; #endif stream.next_out = dest; stream.avail_out = (uInt)*destLen; if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; stream.zalloc = (alloc_func)0; stream.zfree = (free_func)0; stream.opaque = (voidpf)0; err = deflateInit(&stream, level); if (err != Z_OK) return err; err = deflate(&stream, Z_FINISH); if (err != Z_STREAM_END) { deflateEnd(&stream); return err == Z_OK ? Z_BUF_ERROR : err; } *destLen = stream.total_out; err = deflateEnd(&stream); return err; } /* =========================================================================== */ int ZEXPORT compress (dest, destLen, source, sourceLen) Bytef *dest; uLongf *destLen; const Bytef *source; uLong sourceLen; { return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION); } /* =========================================================================== If the default memLevel or windowBits for deflateInit() is changed, then this function needs to be updated. */ uLong ZEXPORT compressBound (sourceLen) uLong sourceLen; { return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + (sourceLen >> 25) + 13; } glpk-5.0/src/zlib/crc32.c0000644000062000006210000003256113766346220014320 0ustar maomkpasswd/* crc32.c -- compute the CRC-32 of a data stream * Copyright (C) 1995-2006, 2010 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h * * Thanks to Rodney Brown for his contribution of faster * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing * tables for updating the shift register in one step with three exclusive-ors * instead of four steps with four exclusive-ors. This results in about a * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3. */ /* @(#) $Id$ */ /* Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore protection on the static variables used to control the first-use generation of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should first call get_crc_table() to initialize the tables before allowing more than one thread to use crc32(). */ #ifdef MAKECRCH # include # ifndef DYNAMIC_CRC_TABLE # define DYNAMIC_CRC_TABLE # endif /* !DYNAMIC_CRC_TABLE */ #endif /* MAKECRCH */ #include "zutil.h" /* for STDC and FAR definitions */ #define local static /* Find a four-byte integer type for crc32_little() and crc32_big(). */ #ifndef NOBYFOUR # ifdef STDC /* need ANSI C limits.h to determine sizes */ # include # define BYFOUR # if (UINT_MAX == 0xffffffffUL) typedef unsigned int u4; # else # if (ULONG_MAX == 0xffffffffUL) typedef unsigned long u4; # else # if (USHRT_MAX == 0xffffffffUL) typedef unsigned short u4; # else # undef BYFOUR /* can't find a four-byte integer type! */ # endif # endif # endif # endif /* STDC */ #endif /* !NOBYFOUR */ /* Definitions for doing the crc four data bytes at a time. */ #ifdef BYFOUR # define REV(w) ((((w)>>24)&0xff)+(((w)>>8)&0xff00)+ \ (((w)&0xff00)<<8)+(((w)&0xff)<<24)) local unsigned long crc32_little OF((unsigned long, const unsigned char FAR *, unsigned)); local unsigned long crc32_big OF((unsigned long, const unsigned char FAR *, unsigned)); # define TBLS 8 #else # define TBLS 1 #endif /* BYFOUR */ /* Local functions for crc concatenation */ local unsigned long gf2_matrix_times OF((unsigned long *mat, unsigned long vec)); local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat)); local uLong crc32_combine_(uLong crc1, uLong crc2, z_off64_t len2); #ifdef DYNAMIC_CRC_TABLE local volatile int crc_table_empty = 1; local unsigned long FAR crc_table[TBLS][256]; local void make_crc_table OF((void)); #ifdef MAKECRCH local void write_table OF((FILE *, const unsigned long FAR *)); #endif /* MAKECRCH */ /* Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. Polynomials over GF(2) are represented in binary, one bit per coefficient, with the lowest powers in the most significant bit. Then adding polynomials is just exclusive-or, and multiplying a polynomial by x is a right shift by one. If we call the above polynomial p, and represent a byte as the polynomial q, also with the lowest power in the most significant bit (so the byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, where a mod b means the remainder after dividing a by b. This calculation is done using the shift-register method of multiplying and taking the remainder. The register is initialized to zero, and for each incoming bit, x^32 is added mod p to the register if the bit is a one (where x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by x (which is shifting right by one and adding x^32 mod p if the bit shifted out is a one). We start with the highest power (least significant bit) of q and repeat for all eight bits of q. The first table is simply the CRC of all possible eight bit values. This is all the information needed to generate CRCs on data a byte at a time for all combinations of CRC register values and incoming bytes. The remaining tables allow for word-at-a-time CRC calculation for both big-endian and little- endian machines, where a word is four bytes. */ local void make_crc_table() { unsigned long c; int n, k; unsigned long poly; /* polynomial exclusive-or pattern */ /* terms of polynomial defining this crc (except x^32): */ static volatile int first = 1; /* flag to limit concurrent making */ static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; /* See if another task is already doing this (not thread-safe, but better than nothing -- significantly reduces duration of vulnerability in case the advice about DYNAMIC_CRC_TABLE is ignored) */ if (first) { first = 0; /* make exclusive-or pattern from polynomial (0xedb88320UL) */ poly = 0UL; for (n = 0; n < sizeof(p)/sizeof(unsigned char); n++) poly |= 1UL << (31 - p[n]); /* generate a crc for every 8-bit value */ for (n = 0; n < 256; n++) { c = (unsigned long)n; for (k = 0; k < 8; k++) c = c & 1 ? poly ^ (c >> 1) : c >> 1; crc_table[0][n] = c; } #ifdef BYFOUR /* generate crc for each value followed by one, two, and three zeros, and then the byte reversal of those as well as the first table */ for (n = 0; n < 256; n++) { c = crc_table[0][n]; crc_table[4][n] = REV(c); for (k = 1; k < 4; k++) { c = crc_table[0][c & 0xff] ^ (c >> 8); crc_table[k][n] = c; crc_table[k + 4][n] = REV(c); } } #endif /* BYFOUR */ crc_table_empty = 0; } else { /* not first */ /* wait for the other guy to finish (not efficient, but rare) */ while (crc_table_empty) ; } #ifdef MAKECRCH /* write out CRC tables to crc32.h */ { FILE *out; out = fopen("crc32.h", "w"); if (out == NULL) return; fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n"); fprintf(out, " * Generated automatically by crc32.c\n */\n\n"); fprintf(out, "local const unsigned long FAR "); fprintf(out, "crc_table[TBLS][256] =\n{\n {\n"); write_table(out, crc_table[0]); # ifdef BYFOUR fprintf(out, "#ifdef BYFOUR\n"); for (k = 1; k < 8; k++) { fprintf(out, " },\n {\n"); write_table(out, crc_table[k]); } fprintf(out, "#endif\n"); # endif /* BYFOUR */ fprintf(out, " }\n};\n"); fclose(out); } #endif /* MAKECRCH */ } #ifdef MAKECRCH local void write_table(out, table) FILE *out; const unsigned long FAR *table; { int n; for (n = 0; n < 256; n++) fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", table[n], n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", ")); } #endif /* MAKECRCH */ #else /* !DYNAMIC_CRC_TABLE */ /* ======================================================================== * Tables of CRC-32s of all single-byte values, made by make_crc_table(). */ #include "crc32.h" #endif /* DYNAMIC_CRC_TABLE */ /* ========================================================================= * This function can be used by asm versions of crc32() */ const unsigned long FAR * ZEXPORT get_crc_table() { #ifdef DYNAMIC_CRC_TABLE if (crc_table_empty) make_crc_table(); #endif /* DYNAMIC_CRC_TABLE */ return (const unsigned long FAR *)crc_table; } /* ========================================================================= */ #define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8) #define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1 /* ========================================================================= */ unsigned long ZEXPORT crc32(crc, buf, len) unsigned long crc; const unsigned char FAR *buf; uInt len; { if (buf == Z_NULL) return 0UL; #ifdef DYNAMIC_CRC_TABLE if (crc_table_empty) make_crc_table(); #endif /* DYNAMIC_CRC_TABLE */ #ifdef BYFOUR if (sizeof(void *) == sizeof(ptrdiff_t)) { u4 endian; endian = 1; if (*((unsigned char *)(&endian))) return crc32_little(crc, buf, len); else return crc32_big(crc, buf, len); } #endif /* BYFOUR */ crc = crc ^ 0xffffffffUL; while (len >= 8) { DO8; len -= 8; } if (len) do { DO1; } while (--len); return crc ^ 0xffffffffUL; } #ifdef BYFOUR /* ========================================================================= */ #define DOLIT4 c ^= *buf4++; \ c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \ crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24] #define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4 /* ========================================================================= */ local unsigned long crc32_little(crc, buf, len) unsigned long crc; const unsigned char FAR *buf; unsigned len; { register u4 c; register const u4 FAR *buf4; c = (u4)crc; c = ~c; while (len && ((ptrdiff_t)buf & 3)) { c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); len--; } buf4 = (const u4 FAR *)(const void FAR *)buf; while (len >= 32) { DOLIT32; len -= 32; } while (len >= 4) { DOLIT4; len -= 4; } buf = (const unsigned char FAR *)buf4; if (len) do { c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); } while (--len); c = ~c; return (unsigned long)c; } /* ========================================================================= */ #define DOBIG4 c ^= *++buf4; \ c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \ crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24] #define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4 /* ========================================================================= */ local unsigned long crc32_big(crc, buf, len) unsigned long crc; const unsigned char FAR *buf; unsigned len; { register u4 c; register const u4 FAR *buf4; c = REV((u4)crc); c = ~c; while (len && ((ptrdiff_t)buf & 3)) { c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); len--; } buf4 = (const u4 FAR *)(const void FAR *)buf; buf4--; while (len >= 32) { DOBIG32; len -= 32; } while (len >= 4) { DOBIG4; len -= 4; } buf4++; buf = (const unsigned char FAR *)buf4; if (len) do { c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); } while (--len); c = ~c; return (unsigned long)(REV(c)); } #endif /* BYFOUR */ #define GF2_DIM 32 /* dimension of GF(2) vectors (length of CRC) */ /* ========================================================================= */ local unsigned long gf2_matrix_times(mat, vec) unsigned long *mat; unsigned long vec; { unsigned long sum; sum = 0; while (vec) { if (vec & 1) sum ^= *mat; vec >>= 1; mat++; } return sum; } /* ========================================================================= */ local void gf2_matrix_square(square, mat) unsigned long *square; unsigned long *mat; { int n; for (n = 0; n < GF2_DIM; n++) square[n] = gf2_matrix_times(mat, mat[n]); } /* ========================================================================= */ local uLong crc32_combine_(crc1, crc2, len2) uLong crc1; uLong crc2; z_off64_t len2; { int n; unsigned long row; unsigned long even[GF2_DIM]; /* even-power-of-two zeros operator */ unsigned long odd[GF2_DIM]; /* odd-power-of-two zeros operator */ /* degenerate case (also disallow negative lengths) */ if (len2 <= 0) return crc1; /* put operator for one zero bit in odd */ odd[0] = 0xedb88320UL; /* CRC-32 polynomial */ row = 1; for (n = 1; n < GF2_DIM; n++) { odd[n] = row; row <<= 1; } /* put operator for two zero bits in even */ gf2_matrix_square(even, odd); /* put operator for four zero bits in odd */ gf2_matrix_square(odd, even); /* apply len2 zeros to crc1 (first square will put the operator for one zero byte, eight zero bits, in even) */ do { /* apply zeros operator for this bit of len2 */ gf2_matrix_square(even, odd); if (len2 & 1) crc1 = gf2_matrix_times(even, crc1); len2 >>= 1; /* if no more bits set, then done */ if (len2 == 0) break; /* another iteration of the loop with odd and even swapped */ gf2_matrix_square(odd, even); if (len2 & 1) crc1 = gf2_matrix_times(odd, crc1); len2 >>= 1; /* if no more bits set, then done */ } while (len2 != 0); /* return combined crc */ crc1 ^= crc2; return crc1; } /* ========================================================================= */ uLong ZEXPORT crc32_combine(crc1, crc2, len2) uLong crc1; uLong crc2; z_off_t len2; { return crc32_combine_(crc1, crc2, len2); } uLong ZEXPORT crc32_combine64(crc1, crc2, len2) uLong crc1; uLong crc2; z_off64_t len2; { return crc32_combine_(crc1, crc2, len2); } glpk-5.0/src/zlib/crc32.h0000644000062000006210000007355013766346220014330 0ustar maomkpasswd/* crc32.h -- tables for rapid CRC calculation * Generated automatically by crc32.c */ local const unsigned long FAR crc_table[TBLS][256] = { { 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL, 0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL, 0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL, 0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL, 0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL, 0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL, 0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL, 0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL, 0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL, 0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL, 0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL, 0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL, 0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL, 0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL, 0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL, 0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL, 0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL, 0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL, 0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL, 0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL, 0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL, 0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL, 0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL, 0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL, 0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL, 0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL, 0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL, 0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL, 0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL, 0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL, 0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL, 0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL, 0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL, 0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL, 0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL, 0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL, 0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL, 0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL, 0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL, 0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL, 0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL, 0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL, 0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL, 0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL, 0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL, 0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL, 0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL, 0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL, 0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL, 0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL, 0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL, 0x2d02ef8dUL #ifdef BYFOUR }, { 0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL, 0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL, 0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL, 0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL, 0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL, 0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL, 0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL, 0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL, 0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL, 0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL, 0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL, 0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL, 0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL, 0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL, 0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL, 0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL, 0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL, 0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL, 0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL, 0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL, 0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL, 0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL, 0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL, 0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL, 0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL, 0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL, 0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL, 0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL, 0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL, 0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL, 0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL, 0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL, 0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL, 0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL, 0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL, 0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL, 0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL, 0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL, 0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL, 0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL, 0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL, 0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL, 0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL, 0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL, 0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL, 0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL, 0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL, 0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL, 0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL, 0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL, 0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL, 0x9324fd72UL }, { 0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL, 0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL, 0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL, 0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL, 0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL, 0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL, 0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL, 0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL, 0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL, 0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL, 0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL, 0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL, 0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL, 0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL, 0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL, 0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL, 0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL, 0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL, 0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL, 0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL, 0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL, 0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL, 0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL, 0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL, 0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL, 0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL, 0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL, 0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL, 0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL, 0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL, 0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL, 0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL, 0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL, 0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL, 0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL, 0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL, 0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL, 0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL, 0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL, 0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL, 0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL, 0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL, 0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL, 0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL, 0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL, 0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL, 0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL, 0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL, 0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL, 0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL, 0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL, 0xbe9834edUL }, { 0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL, 0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL, 0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL, 0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL, 0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL, 0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL, 0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL, 0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL, 0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL, 0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL, 0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL, 0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL, 0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL, 0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL, 0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL, 0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL, 0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL, 0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL, 0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL, 0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL, 0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL, 0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL, 0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL, 0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL, 0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL, 0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL, 0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL, 0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL, 0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL, 0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL, 0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL, 0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL, 0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL, 0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL, 0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL, 0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL, 0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL, 0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL, 0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL, 0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL, 0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL, 0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL, 0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL, 0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL, 0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL, 0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL, 0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL, 0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL, 0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL, 0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL, 0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL, 0xde0506f1UL }, { 0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL, 0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL, 0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL, 0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL, 0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL, 0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL, 0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL, 0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL, 0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL, 0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL, 0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL, 0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL, 0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL, 0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL, 0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL, 0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL, 0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL, 0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL, 0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL, 0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL, 0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL, 0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL, 0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL, 0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL, 0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL, 0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL, 0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL, 0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL, 0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL, 0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL, 0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL, 0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL, 0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL, 0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL, 0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL, 0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL, 0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL, 0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL, 0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL, 0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL, 0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL, 0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL, 0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL, 0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL, 0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL, 0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL, 0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL, 0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL, 0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL, 0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL, 0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL, 0x8def022dUL }, { 0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL, 0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL, 0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL, 0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL, 0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL, 0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL, 0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL, 0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL, 0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL, 0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL, 0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL, 0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL, 0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL, 0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL, 0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL, 0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL, 0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL, 0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL, 0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL, 0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL, 0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL, 0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL, 0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL, 0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL, 0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL, 0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL, 0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL, 0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL, 0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL, 0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL, 0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL, 0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL, 0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL, 0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL, 0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL, 0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL, 0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL, 0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL, 0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL, 0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL, 0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL, 0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL, 0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL, 0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL, 0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL, 0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL, 0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL, 0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL, 0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL, 0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL, 0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL, 0x72fd2493UL }, { 0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL, 0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL, 0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL, 0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL, 0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL, 0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL, 0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL, 0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL, 0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL, 0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL, 0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL, 0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL, 0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL, 0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL, 0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL, 0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL, 0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL, 0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL, 0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL, 0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL, 0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL, 0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL, 0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL, 0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL, 0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL, 0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL, 0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL, 0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL, 0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL, 0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL, 0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL, 0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL, 0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL, 0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL, 0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL, 0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL, 0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL, 0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL, 0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL, 0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL, 0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL, 0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL, 0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL, 0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL, 0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL, 0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL, 0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL, 0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL, 0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL, 0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL, 0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL, 0xed3498beUL }, { 0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL, 0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL, 0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL, 0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL, 0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL, 0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL, 0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL, 0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL, 0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL, 0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL, 0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL, 0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL, 0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL, 0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL, 0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL, 0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL, 0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL, 0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL, 0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL, 0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL, 0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL, 0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL, 0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL, 0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL, 0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL, 0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL, 0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL, 0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL, 0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL, 0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL, 0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL, 0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL, 0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL, 0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL, 0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL, 0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL, 0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL, 0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL, 0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL, 0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL, 0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL, 0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL, 0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL, 0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL, 0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL, 0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL, 0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL, 0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL, 0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL, 0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL, 0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL, 0xf10605deUL #endif } }; glpk-5.0/src/zlib/deflate.c0000644000062000006210000020463013766346220015006 0ustar maomkpasswd/* deflate.c -- compress data using the deflation algorithm * Copyright (C) 1995-2010 Jean-loup Gailly and Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* * ALGORITHM * * The "deflation" process depends on being able to identify portions * of the input text which are identical to earlier input (within a * sliding window trailing behind the input currently being processed). * * The most straightforward technique turns out to be the fastest for * most input files: try all possible matches and select the longest. * The key feature of this algorithm is that insertions into the string * dictionary are very simple and thus fast, and deletions are avoided * completely. Insertions are performed at each input character, whereas * string matches are performed only when the previous match ends. So it * is preferable to spend more time in matches to allow very fast string * insertions and avoid deletions. The matching algorithm for small * strings is inspired from that of Rabin & Karp. A brute force approach * is used to find longer strings when a small match has been found. * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze * (by Leonid Broukhis). * A previous version of this file used a more sophisticated algorithm * (by Fiala and Greene) which is guaranteed to run in linear amortized * time, but has a larger average cost, uses more memory and is patented. * However the F&G algorithm may be faster for some highly redundant * files if the parameter max_chain_length (described below) is too large. * * ACKNOWLEDGEMENTS * * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and * I found it in 'freeze' written by Leonid Broukhis. * Thanks to many people for bug reports and testing. * * REFERENCES * * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification". * Available in http://www.ietf.org/rfc/rfc1951.txt * * A description of the Rabin and Karp algorithm is given in the book * "Algorithms" by R. Sedgewick, Addison-Wesley, p252. * * Fiala,E.R., and Greene,D.H. * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595 * */ /* @(#) $Id$ */ #include "deflate.h" const char deflate_copyright[] = " deflate 1.2.5 Copyright 1995-2010 Jean-loup Gailly and Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot include such an acknowledgment, I would appreciate that you keep this copyright string in the executable of your product. */ /* =========================================================================== * Function prototypes. */ typedef enum { need_more, /* block not completed, need more input or more output */ block_done, /* block flush performed */ finish_started, /* finish started, need only more output at next deflate */ finish_done /* finish done, accept no more input or output */ } block_state; typedef block_state (*compress_func) OF((deflate_state *s, int flush)); /* Compression function. Returns the block state after the call. */ local void fill_window OF((deflate_state *s)); local block_state deflate_stored OF((deflate_state *s, int flush)); local block_state deflate_fast OF((deflate_state *s, int flush)); #ifndef FASTEST local block_state deflate_slow OF((deflate_state *s, int flush)); #endif local block_state deflate_rle OF((deflate_state *s, int flush)); local block_state deflate_huff OF((deflate_state *s, int flush)); local void lm_init OF((deflate_state *s)); local void putShortMSB OF((deflate_state *s, uInt b)); local void flush_pending OF((z_streamp strm)); local int read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); #ifdef ASMV void match_init OF((void)); /* asm code initialization */ uInt longest_match OF((deflate_state *s, IPos cur_match)); #else local uInt longest_match OF((deflate_state *s, IPos cur_match)); #endif #ifdef DEBUG local void check_match OF((deflate_state *s, IPos start, IPos match, int length)); #endif /* =========================================================================== * Local data */ #define NIL 0 /* Tail of hash chains */ #ifndef TOO_FAR # define TOO_FAR 4096 #endif /* Matches of length 3 are discarded if their distance exceeds TOO_FAR */ /* Values for max_lazy_match, good_match and max_chain_length, depending on * the desired pack level (0..9). The values given below have been tuned to * exclude worst case performance for pathological files. Better values may be * found for specific files. */ typedef struct config_s { ush good_length; /* reduce lazy search above this match length */ ush max_lazy; /* do not perform lazy search above this match length */ ush nice_length; /* quit search above this match length */ ush max_chain; compress_func func; } config; #ifdef FASTEST local const config configuration_table[2] = { /* good lazy nice chain */ /* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ /* 1 */ {4, 4, 8, 4, deflate_fast}}; /* max speed, no lazy matches */ #else local const config configuration_table[10] = { /* good lazy nice chain */ /* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ /* 1 */ {4, 4, 8, 4, deflate_fast}, /* max speed, no lazy matches */ /* 2 */ {4, 5, 16, 8, deflate_fast}, /* 3 */ {4, 6, 32, 32, deflate_fast}, /* 4 */ {4, 4, 16, 16, deflate_slow}, /* lazy matches */ /* 5 */ {8, 16, 32, 32, deflate_slow}, /* 6 */ {8, 16, 128, 128, deflate_slow}, /* 7 */ {8, 32, 128, 256, deflate_slow}, /* 8 */ {32, 128, 258, 1024, deflate_slow}, /* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* max compression */ #endif /* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4 * For deflate_fast() (levels <= 3) good is ignored and lazy has a different * meaning. */ #define EQUAL 0 /* result of memcmp for equal strings */ #ifndef NO_DUMMY_DECL struct static_tree_desc_s {int dummy;}; /* for buggy compilers */ #endif /* =========================================================================== * Update a hash value with the given input byte * IN assertion: all calls to to UPDATE_HASH are made with consecutive * input characters, so that a running hash key can be computed from the * previous key instead of complete recalculation each time. */ #define UPDATE_HASH(s,h,c) (h = (((h)<hash_shift) ^ (c)) & s->hash_mask) /* =========================================================================== * Insert string str in the dictionary and set match_head to the previous head * of the hash chain (the most recent string with same hash key). Return * the previous length of the hash chain. * If this file is compiled with -DFASTEST, the compression level is forced * to 1, and no hash chains are maintained. * IN assertion: all calls to to INSERT_STRING are made with consecutive * input characters and the first MIN_MATCH bytes of str are valid * (except for the last MIN_MATCH-1 bytes of the input file). */ #ifdef FASTEST #define INSERT_STRING(s, str, match_head) \ (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ match_head = s->head[s->ins_h], \ s->head[s->ins_h] = (Pos)(str)) #else #define INSERT_STRING(s, str, match_head) \ (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \ s->head[s->ins_h] = (Pos)(str)) #endif /* =========================================================================== * Initialize the hash table (avoiding 64K overflow for 16 bit systems). * prev[] will be initialized on the fly. */ #define CLEAR_HASH(s) \ s->head[s->hash_size-1] = NIL; \ zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); /* ========================================================================= */ int ZEXPORT deflateInit_(strm, level, version, stream_size) z_streamp strm; int level; const char *version; int stream_size; { return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, version, stream_size); /* To do: ignore strm->next_in if we use it as window */ } /* ========================================================================= */ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, version, stream_size) z_streamp strm; int level; int method; int windowBits; int memLevel; int strategy; const char *version; int stream_size; { deflate_state *s; int wrap = 1; static const char my_version[] = ZLIB_VERSION; ushf *overlay; /* We overlay pending_buf and d_buf+l_buf. This works since the average * output size for (length,distance) codes is <= 24 bits. */ if (version == Z_NULL || version[0] != my_version[0] || stream_size != sizeof(z_stream)) { return Z_VERSION_ERROR; } if (strm == Z_NULL) return Z_STREAM_ERROR; strm->msg = Z_NULL; if (strm->zalloc == (alloc_func)0) { strm->zalloc = zcalloc; strm->opaque = (voidpf)0; } if (strm->zfree == (free_func)0) strm->zfree = zcfree; #ifdef FASTEST if (level != 0) level = 1; #else if (level == Z_DEFAULT_COMPRESSION) level = 6; #endif if (windowBits < 0) { /* suppress zlib wrapper */ wrap = 0; windowBits = -windowBits; } #ifdef GZIP else if (windowBits > 15) { wrap = 2; /* write gzip wrapper instead */ windowBits -= 16; } #endif if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED || windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { return Z_STREAM_ERROR; } if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */ s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state)); if (s == Z_NULL) return Z_MEM_ERROR; strm->state = (struct internal_state FAR *)s; s->strm = strm; s->wrap = wrap; s->gzhead = Z_NULL; s->w_bits = windowBits; s->w_size = 1 << s->w_bits; s->w_mask = s->w_size - 1; s->hash_bits = memLevel + 7; s->hash_size = 1 << s->hash_bits; s->hash_mask = s->hash_size - 1; s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH); s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte)); s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos)); s->high_water = 0; /* nothing written to s->window yet */ s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); s->pending_buf = (uchf *) overlay; s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L); if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || s->pending_buf == Z_NULL) { s->status = FINISH_STATE; strm->msg = (char*)ERR_MSG(Z_MEM_ERROR); deflateEnd (strm); return Z_MEM_ERROR; } s->d_buf = overlay + s->lit_bufsize/sizeof(ush); s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; s->level = level; s->strategy = strategy; s->method = (Byte)method; return deflateReset(strm); } /* ========================================================================= */ int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) z_streamp strm; const Bytef *dictionary; uInt dictLength; { deflate_state *s; uInt length = dictLength; uInt n; IPos hash_head = 0; if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL || strm->state->wrap == 2 || (strm->state->wrap == 1 && strm->state->status != INIT_STATE)) return Z_STREAM_ERROR; s = strm->state; if (s->wrap) strm->adler = adler32(strm->adler, dictionary, dictLength); if (length < MIN_MATCH) return Z_OK; if (length > s->w_size) { length = s->w_size; dictionary += dictLength - length; /* use the tail of the dictionary */ } zmemcpy(s->window, dictionary, length); s->strstart = length; s->block_start = (long)length; /* Insert all strings in the hash table (except for the last two bytes). * s->lookahead stays null, so s->ins_h will be recomputed at the next * call of fill_window. */ s->ins_h = s->window[0]; UPDATE_HASH(s, s->ins_h, s->window[1]); for (n = 0; n <= length - MIN_MATCH; n++) { INSERT_STRING(s, n, hash_head); } if (hash_head) hash_head = 0; /* to make compiler happy */ return Z_OK; } /* ========================================================================= */ int ZEXPORT deflateReset (strm) z_streamp strm; { deflate_state *s; if (strm == Z_NULL || strm->state == Z_NULL || strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) { return Z_STREAM_ERROR; } strm->total_in = strm->total_out = 0; strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */ strm->data_type = Z_UNKNOWN; s = (deflate_state *)strm->state; s->pending = 0; s->pending_out = s->pending_buf; if (s->wrap < 0) { s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */ } s->status = s->wrap ? INIT_STATE : BUSY_STATE; strm->adler = #ifdef GZIP s->wrap == 2 ? crc32(0L, Z_NULL, 0) : #endif adler32(0L, Z_NULL, 0); s->last_flush = Z_NO_FLUSH; _tr_init(s); lm_init(s); return Z_OK; } /* ========================================================================= */ int ZEXPORT deflateSetHeader (strm, head) z_streamp strm; gz_headerp head; { if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; if (strm->state->wrap != 2) return Z_STREAM_ERROR; strm->state->gzhead = head; return Z_OK; } /* ========================================================================= */ int ZEXPORT deflatePrime (strm, bits, value) z_streamp strm; int bits; int value; { if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; strm->state->bi_valid = bits; strm->state->bi_buf = (ush)(value & ((1 << bits) - 1)); return Z_OK; } /* ========================================================================= */ int ZEXPORT deflateParams(strm, level, strategy) z_streamp strm; int level; int strategy; { deflate_state *s; compress_func func; int err = Z_OK; if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; s = strm->state; #ifdef FASTEST if (level != 0) level = 1; #else if (level == Z_DEFAULT_COMPRESSION) level = 6; #endif if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { return Z_STREAM_ERROR; } func = configuration_table[s->level].func; if ((strategy != s->strategy || func != configuration_table[level].func) && strm->total_in != 0) { /* Flush the last buffer: */ err = deflate(strm, Z_BLOCK); } if (s->level != level) { s->level = level; s->max_lazy_match = configuration_table[level].max_lazy; s->good_match = configuration_table[level].good_length; s->nice_match = configuration_table[level].nice_length; s->max_chain_length = configuration_table[level].max_chain; } s->strategy = strategy; return err; } /* ========================================================================= */ int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain) z_streamp strm; int good_length; int max_lazy; int nice_length; int max_chain; { deflate_state *s; if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; s = strm->state; s->good_match = good_length; s->max_lazy_match = max_lazy; s->nice_match = nice_length; s->max_chain_length = max_chain; return Z_OK; } /* ========================================================================= * For the default windowBits of 15 and memLevel of 8, this function returns * a close to exact, as well as small, upper bound on the compressed size. * They are coded as constants here for a reason--if the #define's are * changed, then this function needs to be changed as well. The return * value for 15 and 8 only works for those exact settings. * * For any setting other than those defaults for windowBits and memLevel, * the value returned is a conservative worst case for the maximum expansion * resulting from using fixed blocks instead of stored blocks, which deflate * can emit on compressed data for some combinations of the parameters. * * This function could be more sophisticated to provide closer upper bounds for * every combination of windowBits and memLevel. But even the conservative * upper bound of about 14% expansion does not seem onerous for output buffer * allocation. */ uLong ZEXPORT deflateBound(strm, sourceLen) z_streamp strm; uLong sourceLen; { deflate_state *s; uLong complen, wraplen; Bytef *str; /* conservative upper bound for compressed data */ complen = sourceLen + ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5; /* if can't get parameters, return conservative bound plus zlib wrapper */ if (strm == Z_NULL || strm->state == Z_NULL) return complen + 6; /* compute wrapper length */ s = strm->state; switch (s->wrap) { case 0: /* raw deflate */ wraplen = 0; break; case 1: /* zlib wrapper */ wraplen = 6 + (s->strstart ? 4 : 0); break; case 2: /* gzip wrapper */ wraplen = 18; if (s->gzhead != Z_NULL) { /* user-supplied gzip header */ if (s->gzhead->extra != Z_NULL) wraplen += 2 + s->gzhead->extra_len; str = s->gzhead->name; if (str != Z_NULL) do { wraplen++; } while (*str++); str = s->gzhead->comment; if (str != Z_NULL) do { wraplen++; } while (*str++); if (s->gzhead->hcrc) wraplen += 2; } break; default: /* for compiler happiness */ wraplen = 6; } /* if not default parameters, return conservative bound */ if (s->w_bits != 15 || s->hash_bits != 8 + 7) return complen + wraplen; /* default settings: return tight bound for that case */ return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + (sourceLen >> 25) + 13 - 6 + wraplen; } /* ========================================================================= * Put a short in the pending buffer. The 16-bit value is put in MSB order. * IN assertion: the stream state is correct and there is enough room in * pending_buf. */ local void putShortMSB (s, b) deflate_state *s; uInt b; { put_byte(s, (Byte)(b >> 8)); put_byte(s, (Byte)(b & 0xff)); } /* ========================================================================= * Flush as much pending output as possible. All deflate() output goes * through this function so some applications may wish to modify it * to avoid allocating a large strm->next_out buffer and copying into it. * (See also read_buf()). */ local void flush_pending(strm) z_streamp strm; { unsigned len = strm->state->pending; if (len > strm->avail_out) len = strm->avail_out; if (len == 0) return; zmemcpy(strm->next_out, strm->state->pending_out, len); strm->next_out += len; strm->state->pending_out += len; strm->total_out += len; strm->avail_out -= len; strm->state->pending -= len; if (strm->state->pending == 0) { strm->state->pending_out = strm->state->pending_buf; } } /* ========================================================================= */ int ZEXPORT deflate (strm, flush) z_streamp strm; int flush; { int old_flush; /* value of flush param for previous deflate call */ deflate_state *s; if (strm == Z_NULL || strm->state == Z_NULL || flush > Z_BLOCK || flush < 0) { return Z_STREAM_ERROR; } s = strm->state; if (strm->next_out == Z_NULL || (strm->next_in == Z_NULL && strm->avail_in != 0) || (s->status == FINISH_STATE && flush != Z_FINISH)) { ERR_RETURN(strm, Z_STREAM_ERROR); } if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR); s->strm = strm; /* just in case */ old_flush = s->last_flush; s->last_flush = flush; /* Write the header */ if (s->status == INIT_STATE) { #ifdef GZIP if (s->wrap == 2) { strm->adler = crc32(0L, Z_NULL, 0); put_byte(s, 31); put_byte(s, 139); put_byte(s, 8); if (s->gzhead == Z_NULL) { put_byte(s, 0); put_byte(s, 0); put_byte(s, 0); put_byte(s, 0); put_byte(s, 0); put_byte(s, s->level == 9 ? 2 : (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? 4 : 0)); put_byte(s, OS_CODE); s->status = BUSY_STATE; } else { put_byte(s, (s->gzhead->text ? 1 : 0) + (s->gzhead->hcrc ? 2 : 0) + (s->gzhead->extra == Z_NULL ? 0 : 4) + (s->gzhead->name == Z_NULL ? 0 : 8) + (s->gzhead->comment == Z_NULL ? 0 : 16) ); put_byte(s, (Byte)(s->gzhead->time & 0xff)); put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff)); put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff)); put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff)); put_byte(s, s->level == 9 ? 2 : (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? 4 : 0)); put_byte(s, s->gzhead->os & 0xff); if (s->gzhead->extra != Z_NULL) { put_byte(s, s->gzhead->extra_len & 0xff); put_byte(s, (s->gzhead->extra_len >> 8) & 0xff); } if (s->gzhead->hcrc) strm->adler = crc32(strm->adler, s->pending_buf, s->pending); s->gzindex = 0; s->status = EXTRA_STATE; } } else #endif { uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8; uInt level_flags; if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2) level_flags = 0; else if (s->level < 6) level_flags = 1; else if (s->level == 6) level_flags = 2; else level_flags = 3; header |= (level_flags << 6); if (s->strstart != 0) header |= PRESET_DICT; header += 31 - (header % 31); s->status = BUSY_STATE; putShortMSB(s, header); /* Save the adler32 of the preset dictionary: */ if (s->strstart != 0) { putShortMSB(s, (uInt)(strm->adler >> 16)); putShortMSB(s, (uInt)(strm->adler & 0xffff)); } strm->adler = adler32(0L, Z_NULL, 0); } } #ifdef GZIP if (s->status == EXTRA_STATE) { if (s->gzhead->extra != Z_NULL) { uInt beg = s->pending; /* start of bytes to update crc */ while (s->gzindex < (s->gzhead->extra_len & 0xffff)) { if (s->pending == s->pending_buf_size) { if (s->gzhead->hcrc && s->pending > beg) strm->adler = crc32(strm->adler, s->pending_buf + beg, s->pending - beg); flush_pending(strm); beg = s->pending; if (s->pending == s->pending_buf_size) break; } put_byte(s, s->gzhead->extra[s->gzindex]); s->gzindex++; } if (s->gzhead->hcrc && s->pending > beg) strm->adler = crc32(strm->adler, s->pending_buf + beg, s->pending - beg); if (s->gzindex == s->gzhead->extra_len) { s->gzindex = 0; s->status = NAME_STATE; } } else s->status = NAME_STATE; } if (s->status == NAME_STATE) { if (s->gzhead->name != Z_NULL) { uInt beg = s->pending; /* start of bytes to update crc */ int val; do { if (s->pending == s->pending_buf_size) { if (s->gzhead->hcrc && s->pending > beg) strm->adler = crc32(strm->adler, s->pending_buf + beg, s->pending - beg); flush_pending(strm); beg = s->pending; if (s->pending == s->pending_buf_size) { val = 1; break; } } val = s->gzhead->name[s->gzindex++]; put_byte(s, val); } while (val != 0); if (s->gzhead->hcrc && s->pending > beg) strm->adler = crc32(strm->adler, s->pending_buf + beg, s->pending - beg); if (val == 0) { s->gzindex = 0; s->status = COMMENT_STATE; } } else s->status = COMMENT_STATE; } if (s->status == COMMENT_STATE) { if (s->gzhead->comment != Z_NULL) { uInt beg = s->pending; /* start of bytes to update crc */ int val; do { if (s->pending == s->pending_buf_size) { if (s->gzhead->hcrc && s->pending > beg) strm->adler = crc32(strm->adler, s->pending_buf + beg, s->pending - beg); flush_pending(strm); beg = s->pending; if (s->pending == s->pending_buf_size) { val = 1; break; } } val = s->gzhead->comment[s->gzindex++]; put_byte(s, val); } while (val != 0); if (s->gzhead->hcrc && s->pending > beg) strm->adler = crc32(strm->adler, s->pending_buf + beg, s->pending - beg); if (val == 0) s->status = HCRC_STATE; } else s->status = HCRC_STATE; } if (s->status == HCRC_STATE) { if (s->gzhead->hcrc) { if (s->pending + 2 > s->pending_buf_size) flush_pending(strm); if (s->pending + 2 <= s->pending_buf_size) { put_byte(s, (Byte)(strm->adler & 0xff)); put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); strm->adler = crc32(0L, Z_NULL, 0); s->status = BUSY_STATE; } } else s->status = BUSY_STATE; } #endif /* Flush as much pending output as possible */ if (s->pending != 0) { flush_pending(strm); if (strm->avail_out == 0) { /* Since avail_out is 0, deflate will be called again with * more output space, but possibly with both pending and * avail_in equal to zero. There won't be anything to do, * but this is not an error situation so make sure we * return OK instead of BUF_ERROR at next call of deflate: */ s->last_flush = -1; return Z_OK; } /* Make sure there is something to do and avoid duplicate consecutive * flushes. For repeated and useless calls with Z_FINISH, we keep * returning Z_STREAM_END instead of Z_BUF_ERROR. */ } else if (strm->avail_in == 0 && flush <= old_flush && flush != Z_FINISH) { ERR_RETURN(strm, Z_BUF_ERROR); } /* User must not provide more input after the first FINISH: */ if (s->status == FINISH_STATE && strm->avail_in != 0) { ERR_RETURN(strm, Z_BUF_ERROR); } /* Start a new block or continue the current one. */ if (strm->avail_in != 0 || s->lookahead != 0 || (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { block_state bstate; bstate = s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) : (s->strategy == Z_RLE ? deflate_rle(s, flush) : (*(configuration_table[s->level].func))(s, flush)); if (bstate == finish_started || bstate == finish_done) { s->status = FINISH_STATE; } if (bstate == need_more || bstate == finish_started) { if (strm->avail_out == 0) { s->last_flush = -1; /* avoid BUF_ERROR next call, see above */ } return Z_OK; /* If flush != Z_NO_FLUSH && avail_out == 0, the next call * of deflate should use the same flush parameter to make sure * that the flush is complete. So we don't have to output an * empty block here, this will be done at next call. This also * ensures that for a very small output buffer, we emit at most * one empty block. */ } if (bstate == block_done) { if (flush == Z_PARTIAL_FLUSH) { _tr_align(s); } else if (flush != Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */ _tr_stored_block(s, (char*)0, 0L, 0); /* For a full flush, this empty block will be recognized * as a special marker by inflate_sync(). */ if (flush == Z_FULL_FLUSH) { CLEAR_HASH(s); /* forget history */ if (s->lookahead == 0) { s->strstart = 0; s->block_start = 0L; } } } flush_pending(strm); if (strm->avail_out == 0) { s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */ return Z_OK; } } } Assert(strm->avail_out > 0, "bug2"); if (flush != Z_FINISH) return Z_OK; if (s->wrap <= 0) return Z_STREAM_END; /* Write the trailer */ #ifdef GZIP if (s->wrap == 2) { put_byte(s, (Byte)(strm->adler & 0xff)); put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); put_byte(s, (Byte)((strm->adler >> 16) & 0xff)); put_byte(s, (Byte)((strm->adler >> 24) & 0xff)); put_byte(s, (Byte)(strm->total_in & 0xff)); put_byte(s, (Byte)((strm->total_in >> 8) & 0xff)); put_byte(s, (Byte)((strm->total_in >> 16) & 0xff)); put_byte(s, (Byte)((strm->total_in >> 24) & 0xff)); } else #endif { putShortMSB(s, (uInt)(strm->adler >> 16)); putShortMSB(s, (uInt)(strm->adler & 0xffff)); } flush_pending(strm); /* If avail_out is zero, the application will call deflate again * to flush the rest. */ if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */ return s->pending != 0 ? Z_OK : Z_STREAM_END; } /* ========================================================================= */ int ZEXPORT deflateEnd (strm) z_streamp strm; { int status; if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; status = strm->state->status; if (status != INIT_STATE && status != EXTRA_STATE && status != NAME_STATE && status != COMMENT_STATE && status != HCRC_STATE && status != BUSY_STATE && status != FINISH_STATE) { return Z_STREAM_ERROR; } /* Deallocate in reverse order of allocations: */ TRY_FREE(strm, strm->state->pending_buf); TRY_FREE(strm, strm->state->head); TRY_FREE(strm, strm->state->prev); TRY_FREE(strm, strm->state->window); ZFREE(strm, strm->state); strm->state = Z_NULL; return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK; } /* ========================================================================= * Copy the source state to the destination state. * To simplify the source, this is not supported for 16-bit MSDOS (which * doesn't have enough memory anyway to duplicate compression states). */ int ZEXPORT deflateCopy (dest, source) z_streamp dest; z_streamp source; { #ifdef MAXSEG_64K return Z_STREAM_ERROR; #else deflate_state *ds; deflate_state *ss; ushf *overlay; if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) { return Z_STREAM_ERROR; } ss = source->state; zmemcpy(dest, source, sizeof(z_stream)); ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state)); if (ds == Z_NULL) return Z_MEM_ERROR; dest->state = (struct internal_state FAR *) ds; zmemcpy(ds, ss, sizeof(deflate_state)); ds->strm = dest; ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2); ds->pending_buf = (uchf *) overlay; if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || ds->pending_buf == Z_NULL) { deflateEnd (dest); return Z_MEM_ERROR; } /* following zmemcpy do not work for 16-bit MSDOS */ zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte)); zmemcpy(ds->prev, ss->prev, ds->w_size * sizeof(Pos)); zmemcpy(ds->head, ss->head, ds->hash_size * sizeof(Pos)); zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush); ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize; ds->l_desc.dyn_tree = ds->dyn_ltree; ds->d_desc.dyn_tree = ds->dyn_dtree; ds->bl_desc.dyn_tree = ds->bl_tree; return Z_OK; #endif /* MAXSEG_64K */ } /* =========================================================================== * Read a new buffer from the current input stream, update the adler32 * and total number of bytes read. All deflate() input goes through * this function so some applications may wish to modify it to avoid * allocating a large strm->next_in buffer and copying from it. * (See also flush_pending()). */ local int read_buf(strm, buf, size) z_streamp strm; Bytef *buf; unsigned size; { unsigned len = strm->avail_in; if (len > size) len = size; if (len == 0) return 0; strm->avail_in -= len; if (strm->state->wrap == 1) { strm->adler = adler32(strm->adler, strm->next_in, len); } #ifdef GZIP else if (strm->state->wrap == 2) { strm->adler = crc32(strm->adler, strm->next_in, len); } #endif zmemcpy(buf, strm->next_in, len); strm->next_in += len; strm->total_in += len; return (int)len; } /* =========================================================================== * Initialize the "longest match" routines for a new zlib stream */ local void lm_init (s) deflate_state *s; { s->window_size = (ulg)2L*s->w_size; CLEAR_HASH(s); /* Set the default configuration parameters: */ s->max_lazy_match = configuration_table[s->level].max_lazy; s->good_match = configuration_table[s->level].good_length; s->nice_match = configuration_table[s->level].nice_length; s->max_chain_length = configuration_table[s->level].max_chain; s->strstart = 0; s->block_start = 0L; s->lookahead = 0; s->match_length = s->prev_length = MIN_MATCH-1; s->match_available = 0; s->ins_h = 0; #ifndef FASTEST #ifdef ASMV match_init(); /* initialize the asm code */ #endif #endif } #ifndef FASTEST /* =========================================================================== * Set match_start to the longest match starting at the given string and * return its length. Matches shorter or equal to prev_length are discarded, * in which case the result is equal to prev_length and match_start is * garbage. * IN assertions: cur_match is the head of the hash chain for the current * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 * OUT assertion: the match length is not greater than s->lookahead. */ #ifndef ASMV /* For 80x86 and 680x0, an optimized version will be provided in match.asm or * match.S. The code will be functionally equivalent. */ local uInt longest_match(s, cur_match) deflate_state *s; IPos cur_match; /* current match */ { unsigned chain_length = s->max_chain_length;/* max hash chain length */ register Bytef *scan = s->window + s->strstart; /* current string */ register Bytef *match; /* matched string */ register int len; /* length of current match */ int best_len = s->prev_length; /* best match length so far */ int nice_match = s->nice_match; /* stop if match long enough */ IPos limit = s->strstart > (IPos)MAX_DIST(s) ? s->strstart - (IPos)MAX_DIST(s) : NIL; /* Stop when cur_match becomes <= limit. To simplify the code, * we prevent matches with the string of window index 0. */ Posf *prev = s->prev; uInt wmask = s->w_mask; #ifdef UNALIGNED_OK /* Compare two bytes at a time. Note: this is not always beneficial. * Try with and without -DUNALIGNED_OK to check. */ register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1; register ush scan_start = *(ushf*)scan; register ush scan_end = *(ushf*)(scan+best_len-1); #else register Bytef *strend = s->window + s->strstart + MAX_MATCH; register Byte scan_end1 = scan[best_len-1]; register Byte scan_end = scan[best_len]; #endif /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. * It is easy to get rid of this optimization if necessary. */ Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); /* Do not waste too much time if we already have a good match: */ if (s->prev_length >= s->good_match) { chain_length >>= 2; } /* Do not look for matches beyond the end of the input. This is necessary * to make deflate deterministic. */ if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); do { Assert(cur_match < s->strstart, "no future"); match = s->window + cur_match; /* Skip to next match if the match length cannot increase * or if the match length is less than 2. Note that the checks below * for insufficient lookahead only occur occasionally for performance * reasons. Therefore uninitialized memory will be accessed, and * conditional jumps will be made that depend on those values. * However the length of the match is limited to the lookahead, so * the output of deflate is not affected by the uninitialized values. */ #if (defined(UNALIGNED_OK) && MAX_MATCH == 258) /* This code assumes sizeof(unsigned short) == 2. Do not use * UNALIGNED_OK if your compiler uses a different size. */ if (*(ushf*)(match+best_len-1) != scan_end || *(ushf*)match != scan_start) continue; /* It is not necessary to compare scan[2] and match[2] since they are * always equal when the other bytes match, given that the hash keys * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at * strstart+3, +5, ... up to strstart+257. We check for insufficient * lookahead only every 4th comparison; the 128th check will be made * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is * necessary to put more guard bytes at the end of the window, or * to check more often for insufficient lookahead. */ Assert(scan[2] == match[2], "scan[2]?"); scan++, match++; do { } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && scan < strend); /* The funny "do {}" generates better code on most compilers */ /* Here, scan <= window+strstart+257 */ Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); if (*scan == *match) scan++; len = (MAX_MATCH - 1) - (int)(strend-scan); scan = strend - (MAX_MATCH-1); #else /* UNALIGNED_OK */ if (match[best_len] != scan_end || match[best_len-1] != scan_end1 || *match != *scan || *++match != scan[1]) continue; /* The check at best_len-1 can be removed because it will be made * again later. (This heuristic is not always a win.) * It is not necessary to compare scan[2] and match[2] since they * are always equal when the other bytes match, given that * the hash keys are equal and that HASH_BITS >= 8. */ scan += 2, match++; Assert(*scan == *match, "match[2]?"); /* We check for insufficient lookahead only every 8th comparison; * the 256th check will be made at strstart+258. */ do { } while (*++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && scan < strend); Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); len = MAX_MATCH - (int)(strend - scan); scan = strend - MAX_MATCH; #endif /* UNALIGNED_OK */ if (len > best_len) { s->match_start = cur_match; best_len = len; if (len >= nice_match) break; #ifdef UNALIGNED_OK scan_end = *(ushf*)(scan+best_len-1); #else scan_end1 = scan[best_len-1]; scan_end = scan[best_len]; #endif } } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length != 0); if ((uInt)best_len <= s->lookahead) return (uInt)best_len; return s->lookahead; } #endif /* ASMV */ #else /* FASTEST */ /* --------------------------------------------------------------------------- * Optimized version for FASTEST only */ local uInt longest_match(s, cur_match) deflate_state *s; IPos cur_match; /* current match */ { register Bytef *scan = s->window + s->strstart; /* current string */ register Bytef *match; /* matched string */ register int len; /* length of current match */ register Bytef *strend = s->window + s->strstart + MAX_MATCH; /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. * It is easy to get rid of this optimization if necessary. */ Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); Assert(cur_match < s->strstart, "no future"); match = s->window + cur_match; /* Return failure if the match length is less than 2: */ if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1; /* The check at best_len-1 can be removed because it will be made * again later. (This heuristic is not always a win.) * It is not necessary to compare scan[2] and match[2] since they * are always equal when the other bytes match, given that * the hash keys are equal and that HASH_BITS >= 8. */ scan += 2, match += 2; Assert(*scan == *match, "match[2]?"); /* We check for insufficient lookahead only every 8th comparison; * the 256th check will be made at strstart+258. */ do { } while (*++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && scan < strend); Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); len = MAX_MATCH - (int)(strend - scan); if (len < MIN_MATCH) return MIN_MATCH - 1; s->match_start = cur_match; return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead; } #endif /* FASTEST */ #ifdef DEBUG /* =========================================================================== * Check that the match at match_start is indeed a match. */ local void check_match(s, start, match, length) deflate_state *s; IPos start, match; int length; { /* check that the match is indeed a match */ if (zmemcmp(s->window + match, s->window + start, length) != EQUAL) { fprintf(stderr, " start %u, match %u, length %d\n", start, match, length); do { fprintf(stderr, "%c%c", s->window[match++], s->window[start++]); } while (--length != 0); z_error("invalid match"); } if (z_verbose > 1) { fprintf(stderr,"\\[%d,%d]", start-match, length); do { putc(s->window[start++], stderr); } while (--length != 0); } } #else # define check_match(s, start, match, length) #endif /* DEBUG */ /* =========================================================================== * Fill the window when the lookahead becomes insufficient. * Updates strstart and lookahead. * * IN assertion: lookahead < MIN_LOOKAHEAD * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD * At least one byte has been read, or avail_in == 0; reads are * performed for at least two bytes (required for the zip translate_eol * option -- not supported here). */ local void fill_window(s) deflate_state *s; { register unsigned n, m; register Posf *p; unsigned more; /* Amount of free space at the end of the window. */ uInt wsize = s->w_size; do { more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); /* Deal with !@#$% 64K limit: */ if (sizeof(int) <= 2) { if (more == 0 && s->strstart == 0 && s->lookahead == 0) { more = wsize; } else if (more == (unsigned)(-1)) { /* Very unlikely, but possible on 16 bit machine if * strstart == 0 && lookahead == 1 (input done a byte at time) */ more--; } } /* If the window is almost full and there is insufficient lookahead, * move the upper half to the lower one to make room in the upper half. */ if (s->strstart >= wsize+MAX_DIST(s)) { zmemcpy(s->window, s->window+wsize, (unsigned)wsize); s->match_start -= wsize; s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ s->block_start -= (long) wsize; /* Slide the hash table (could be avoided with 32 bit values at the expense of memory usage). We slide even when level == 0 to keep the hash table consistent if we switch back to level > 0 later. (Using level 0 permanently is not an optimal usage of zlib, so we don't care about this pathological case.) */ n = s->hash_size; p = &s->head[n]; do { m = *--p; *p = (Pos)(m >= wsize ? m-wsize : NIL); } while (--n); n = wsize; #ifndef FASTEST p = &s->prev[n]; do { m = *--p; *p = (Pos)(m >= wsize ? m-wsize : NIL); /* If n is not on any hash chain, prev[n] is garbage but * its value will never be used. */ } while (--n); #endif more += wsize; } if (s->strm->avail_in == 0) return; /* If there was no sliding: * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && * more == window_size - lookahead - strstart * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) * => more >= window_size - 2*WSIZE + 2 * In the BIG_MEM or MMAP case (not yet supported), * window_size == input_size + MIN_LOOKAHEAD && * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. * Otherwise, window_size == 2*WSIZE so more >= 2. * If there was sliding, more >= WSIZE. So in all cases, more >= 2. */ Assert(more >= 2, "more < 2"); n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); s->lookahead += n; /* Initialize the hash value now that we have some input: */ if (s->lookahead >= MIN_MATCH) { s->ins_h = s->window[s->strstart]; UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); #if MIN_MATCH != 3 Call UPDATE_HASH() MIN_MATCH-3 more times #endif } /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, * but this is not important since only literal bytes will be emitted. */ } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); /* If the WIN_INIT bytes after the end of the current data have never been * written, then zero those bytes in order to avoid memory check reports of * the use of uninitialized (or uninitialised as Julian writes) bytes by * the longest match routines. Update the high water mark for the next * time through here. WIN_INIT is set to MAX_MATCH since the longest match * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. */ if (s->high_water < s->window_size) { ulg curr = s->strstart + (ulg)(s->lookahead); ulg init; if (s->high_water < curr) { /* Previous high water mark below current data -- zero WIN_INIT * bytes or up to end of window, whichever is less. */ init = s->window_size - curr; if (init > WIN_INIT) init = WIN_INIT; zmemzero(s->window + curr, (unsigned)init); s->high_water = curr + init; } else if (s->high_water < (ulg)curr + WIN_INIT) { /* High water mark at or above current data, but below current data * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up * to end of window, whichever is less. */ init = (ulg)curr + WIN_INIT - s->high_water; if (init > s->window_size - s->high_water) init = s->window_size - s->high_water; zmemzero(s->window + s->high_water, (unsigned)init); s->high_water += init; } } } /* =========================================================================== * Flush the current block, with given end-of-file flag. * IN assertion: strstart is set to the end of the current match. */ #define FLUSH_BLOCK_ONLY(s, last) { \ _tr_flush_block(s, (s->block_start >= 0L ? \ (charf *)&s->window[(unsigned)s->block_start] : \ (charf *)Z_NULL), \ (ulg)((long)s->strstart - s->block_start), \ (last)); \ s->block_start = s->strstart; \ flush_pending(s->strm); \ Tracev((stderr,"[FLUSH]")); \ } /* Same but force premature exit if necessary. */ #define FLUSH_BLOCK(s, last) { \ FLUSH_BLOCK_ONLY(s, last); \ if (s->strm->avail_out == 0) return (last) ? finish_started : need_more; \ } /* =========================================================================== * Copy without compression as much as possible from the input stream, return * the current block state. * This function does not insert new strings in the dictionary since * uncompressible data is probably not useful. This function is used * only for the level=0 compression option. * NOTE: this function should be optimized to avoid extra copying from * window to pending_buf. */ local block_state deflate_stored(s, flush) deflate_state *s; int flush; { /* Stored blocks are limited to 0xffff bytes, pending_buf is limited * to pending_buf_size, and each stored block has a 5 byte header: */ ulg max_block_size = 0xffff; ulg max_start; if (max_block_size > s->pending_buf_size - 5) { max_block_size = s->pending_buf_size - 5; } /* Copy as much as possible from input to output: */ for (;;) { /* Fill the window as much as possible: */ if (s->lookahead <= 1) { Assert(s->strstart < s->w_size+MAX_DIST(s) || s->block_start >= (long)s->w_size, "slide too late"); fill_window(s); if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more; if (s->lookahead == 0) break; /* flush the current block */ } Assert(s->block_start >= 0L, "block gone"); s->strstart += s->lookahead; s->lookahead = 0; /* Emit a stored block if pending_buf will be full: */ max_start = s->block_start + max_block_size; if (s->strstart == 0 || (ulg)s->strstart >= max_start) { /* strstart == 0 is possible when wraparound on 16-bit machine */ s->lookahead = (uInt)(s->strstart - max_start); s->strstart = (uInt)max_start; FLUSH_BLOCK(s, 0); } /* Flush if we may have to slide, otherwise block_start may become * negative and the data will be gone: */ if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) { FLUSH_BLOCK(s, 0); } } FLUSH_BLOCK(s, flush == Z_FINISH); return flush == Z_FINISH ? finish_done : block_done; } /* =========================================================================== * Compress as much as possible from the input stream, return the current * block state. * This function does not perform lazy evaluation of matches and inserts * new strings in the dictionary only for unmatched strings or for short * matches. It is used only for the fast compression options. */ local block_state deflate_fast(s, flush) deflate_state *s; int flush; { IPos hash_head; /* head of the hash chain */ int bflush; /* set if current block must be flushed */ for (;;) { /* Make sure that we always have enough lookahead, except * at the end of the input file. We need MAX_MATCH bytes * for the next match, plus MIN_MATCH bytes to insert the * string following the next match. */ if (s->lookahead < MIN_LOOKAHEAD) { fill_window(s); if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { return need_more; } if (s->lookahead == 0) break; /* flush the current block */ } /* Insert the string window[strstart .. strstart+2] in the * dictionary, and set hash_head to the head of the hash chain: */ hash_head = NIL; if (s->lookahead >= MIN_MATCH) { INSERT_STRING(s, s->strstart, hash_head); } /* Find the longest match, discarding those <= prev_length. * At this point we have always match_length < MIN_MATCH */ if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) { /* To simplify the code, we prevent matches with the string * of window index 0 (in particular we have to avoid a match * of the string with itself at the start of the input file). */ s->match_length = longest_match (s, hash_head); /* longest_match() sets match_start */ } if (s->match_length >= MIN_MATCH) { check_match(s, s->strstart, s->match_start, s->match_length); _tr_tally_dist(s, s->strstart - s->match_start, s->match_length - MIN_MATCH, bflush); s->lookahead -= s->match_length; /* Insert new strings in the hash table only if the match length * is not too large. This saves time but degrades compression. */ #ifndef FASTEST if (s->match_length <= s->max_insert_length && s->lookahead >= MIN_MATCH) { s->match_length--; /* string at strstart already in table */ do { s->strstart++; INSERT_STRING(s, s->strstart, hash_head); /* strstart never exceeds WSIZE-MAX_MATCH, so there are * always MIN_MATCH bytes ahead. */ } while (--s->match_length != 0); s->strstart++; } else #endif { s->strstart += s->match_length; s->match_length = 0; s->ins_h = s->window[s->strstart]; UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); #if MIN_MATCH != 3 Call UPDATE_HASH() MIN_MATCH-3 more times #endif /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not * matter since it will be recomputed at next deflate call. */ } } else { /* No match, output a literal byte */ Tracevv((stderr,"%c", s->window[s->strstart])); _tr_tally_lit (s, s->window[s->strstart], bflush); s->lookahead--; s->strstart++; } if (bflush) FLUSH_BLOCK(s, 0); } FLUSH_BLOCK(s, flush == Z_FINISH); return flush == Z_FINISH ? finish_done : block_done; } #ifndef FASTEST /* =========================================================================== * Same as above, but achieves better compression. We use a lazy * evaluation for matches: a match is finally adopted only if there is * no better match at the next window position. */ local block_state deflate_slow(s, flush) deflate_state *s; int flush; { IPos hash_head; /* head of hash chain */ int bflush; /* set if current block must be flushed */ /* Process the input block. */ for (;;) { /* Make sure that we always have enough lookahead, except * at the end of the input file. We need MAX_MATCH bytes * for the next match, plus MIN_MATCH bytes to insert the * string following the next match. */ if (s->lookahead < MIN_LOOKAHEAD) { fill_window(s); if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { return need_more; } if (s->lookahead == 0) break; /* flush the current block */ } /* Insert the string window[strstart .. strstart+2] in the * dictionary, and set hash_head to the head of the hash chain: */ hash_head = NIL; if (s->lookahead >= MIN_MATCH) { INSERT_STRING(s, s->strstart, hash_head); } /* Find the longest match, discarding those <= prev_length. */ s->prev_length = s->match_length, s->prev_match = s->match_start; s->match_length = MIN_MATCH-1; if (hash_head != NIL && s->prev_length < s->max_lazy_match && s->strstart - hash_head <= MAX_DIST(s)) { /* To simplify the code, we prevent matches with the string * of window index 0 (in particular we have to avoid a match * of the string with itself at the start of the input file). */ s->match_length = longest_match (s, hash_head); /* longest_match() sets match_start */ if (s->match_length <= 5 && (s->strategy == Z_FILTERED #if TOO_FAR <= 32767 || (s->match_length == MIN_MATCH && s->strstart - s->match_start > TOO_FAR) #endif )) { /* If prev_match is also MIN_MATCH, match_start is garbage * but we will ignore the current match anyway. */ s->match_length = MIN_MATCH-1; } } /* If there was a match at the previous step and the current * match is not better, output the previous match: */ if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) { uInt max_insert = s->strstart + s->lookahead - MIN_MATCH; /* Do not insert strings in hash table beyond this. */ check_match(s, s->strstart-1, s->prev_match, s->prev_length); _tr_tally_dist(s, s->strstart -1 - s->prev_match, s->prev_length - MIN_MATCH, bflush); /* Insert in hash table all strings up to the end of the match. * strstart-1 and strstart are already inserted. If there is not * enough lookahead, the last two strings are not inserted in * the hash table. */ s->lookahead -= s->prev_length-1; s->prev_length -= 2; do { if (++s->strstart <= max_insert) { INSERT_STRING(s, s->strstart, hash_head); } } while (--s->prev_length != 0); s->match_available = 0; s->match_length = MIN_MATCH-1; s->strstart++; if (bflush) FLUSH_BLOCK(s, 0); } else if (s->match_available) { /* If there was no match at the previous position, output a * single literal. If there was a match but the current match * is longer, truncate the previous match to a single literal. */ Tracevv((stderr,"%c", s->window[s->strstart-1])); _tr_tally_lit(s, s->window[s->strstart-1], bflush); if (bflush) { FLUSH_BLOCK_ONLY(s, 0); } s->strstart++; s->lookahead--; if (s->strm->avail_out == 0) return need_more; } else { /* There is no previous match to compare with, wait for * the next step to decide. */ s->match_available = 1; s->strstart++; s->lookahead--; } } Assert (flush != Z_NO_FLUSH, "no flush?"); if (s->match_available) { Tracevv((stderr,"%c", s->window[s->strstart-1])); _tr_tally_lit(s, s->window[s->strstart-1], bflush); s->match_available = 0; } FLUSH_BLOCK(s, flush == Z_FINISH); return flush == Z_FINISH ? finish_done : block_done; } #endif /* FASTEST */ /* =========================================================================== * For Z_RLE, simply look for runs of bytes, generate matches only of distance * one. Do not maintain a hash table. (It will be regenerated if this run of * deflate switches away from Z_RLE.) */ local block_state deflate_rle(s, flush) deflate_state *s; int flush; { int bflush; /* set if current block must be flushed */ uInt prev; /* byte at distance one to match */ Bytef *scan, *strend; /* scan goes up to strend for length of run */ for (;;) { /* Make sure that we always have enough lookahead, except * at the end of the input file. We need MAX_MATCH bytes * for the longest encodable run. */ if (s->lookahead < MAX_MATCH) { fill_window(s); if (s->lookahead < MAX_MATCH && flush == Z_NO_FLUSH) { return need_more; } if (s->lookahead == 0) break; /* flush the current block */ } /* See how many times the previous byte repeats */ s->match_length = 0; if (s->lookahead >= MIN_MATCH && s->strstart > 0) { scan = s->window + s->strstart - 1; prev = *scan; if (prev == *++scan && prev == *++scan && prev == *++scan) { strend = s->window + s->strstart + MAX_MATCH; do { } while (prev == *++scan && prev == *++scan && prev == *++scan && prev == *++scan && prev == *++scan && prev == *++scan && prev == *++scan && prev == *++scan && scan < strend); s->match_length = MAX_MATCH - (int)(strend - scan); if (s->match_length > s->lookahead) s->match_length = s->lookahead; } } /* Emit match if have run of MIN_MATCH or longer, else emit literal */ if (s->match_length >= MIN_MATCH) { check_match(s, s->strstart, s->strstart - 1, s->match_length); _tr_tally_dist(s, 1, s->match_length - MIN_MATCH, bflush); s->lookahead -= s->match_length; s->strstart += s->match_length; s->match_length = 0; } else { /* No match, output a literal byte */ Tracevv((stderr,"%c", s->window[s->strstart])); _tr_tally_lit (s, s->window[s->strstart], bflush); s->lookahead--; s->strstart++; } if (bflush) FLUSH_BLOCK(s, 0); } FLUSH_BLOCK(s, flush == Z_FINISH); return flush == Z_FINISH ? finish_done : block_done; } /* =========================================================================== * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table. * (It will be regenerated if this run of deflate switches away from Huffman.) */ local block_state deflate_huff(s, flush) deflate_state *s; int flush; { int bflush; /* set if current block must be flushed */ for (;;) { /* Make sure that we have a literal to write. */ if (s->lookahead == 0) { fill_window(s); if (s->lookahead == 0) { if (flush == Z_NO_FLUSH) return need_more; break; /* flush the current block */ } } /* Output a literal byte */ s->match_length = 0; Tracevv((stderr,"%c", s->window[s->strstart])); _tr_tally_lit (s, s->window[s->strstart], bflush); s->lookahead--; s->strstart++; if (bflush) FLUSH_BLOCK(s, 0); } FLUSH_BLOCK(s, flush == Z_FINISH); return flush == Z_FINISH ? finish_done : block_done; } glpk-5.0/src/zlib/deflate.h0000644000062000006210000003060013766346220015005 0ustar maomkpasswd/* deflate.h -- internal compression state * Copyright (C) 1995-2010 Jean-loup Gailly * For conditions of distribution and use, see copyright notice in zlib.h */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ /* @(#) $Id$ */ #ifndef DEFLATE_H #define DEFLATE_H #include "zutil.h" /* define NO_GZIP when compiling if you want to disable gzip header and trailer creation by deflate(). NO_GZIP would be used to avoid linking in the crc code when it is not needed. For shared libraries, gzip encoding should be left enabled. */ #ifndef NO_GZIP # define GZIP #endif /* =========================================================================== * Internal compression state. */ #define LENGTH_CODES 29 /* number of length codes, not counting the special END_BLOCK code */ #define LITERALS 256 /* number of literal bytes 0..255 */ #define L_CODES (LITERALS+1+LENGTH_CODES) /* number of Literal or Length codes, including the END_BLOCK code */ #define D_CODES 30 /* number of distance codes */ #define BL_CODES 19 /* number of codes used to transfer the bit lengths */ #define HEAP_SIZE (2*L_CODES+1) /* maximum heap size */ #define MAX_BITS 15 /* All codes must not exceed MAX_BITS bits */ #define INIT_STATE 42 #define EXTRA_STATE 69 #define NAME_STATE 73 #define COMMENT_STATE 91 #define HCRC_STATE 103 #define BUSY_STATE 113 #define FINISH_STATE 666 /* Stream status */ /* Data structure describing a single value and its code string. */ typedef struct ct_data_s { union { ush freq; /* frequency count */ ush code; /* bit string */ } fc; union { ush dad; /* father node in Huffman tree */ ush len; /* length of bit string */ } dl; } FAR ct_data; #define Freq fc.freq #define Code fc.code #define Dad dl.dad #define Len dl.len typedef struct static_tree_desc_s static_tree_desc; typedef struct tree_desc_s { ct_data *dyn_tree; /* the dynamic tree */ int max_code; /* largest code with non zero frequency */ static_tree_desc *stat_desc; /* the corresponding static tree */ } FAR tree_desc; typedef ush Pos; typedef Pos FAR Posf; typedef unsigned IPos; /* A Pos is an index in the character window. We use short instead of int to * save space in the various tables. IPos is used only for parameter passing. */ typedef struct internal_state { z_streamp strm; /* pointer back to this zlib stream */ int status; /* as the name implies */ Bytef *pending_buf; /* output still pending */ ulg pending_buf_size; /* size of pending_buf */ Bytef *pending_out; /* next pending byte to output to the stream */ uInt pending; /* nb of bytes in the pending buffer */ int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ gz_headerp gzhead; /* gzip header information to write */ uInt gzindex; /* where in extra, name, or comment */ Byte method; /* STORED (for zip only) or DEFLATED */ int last_flush; /* value of flush param for previous deflate call */ /* used by deflate.c: */ uInt w_size; /* LZ77 window size (32K by default) */ uInt w_bits; /* log2(w_size) (8..16) */ uInt w_mask; /* w_size - 1 */ Bytef *window; /* Sliding window. Input bytes are read into the second half of the window, * and move to the first half later to keep a dictionary of at least wSize * bytes. With this organization, matches are limited to a distance of * wSize-MAX_MATCH bytes, but this ensures that IO is always * performed with a length multiple of the block size. Also, it limits * the window size to 64K, which is quite useful on MSDOS. * To do: use the user input buffer as sliding window. */ ulg window_size; /* Actual size of window: 2*wSize, except when the user input buffer * is directly used as sliding window. */ Posf *prev; /* Link to older string with same hash index. To limit the size of this * array to 64K, this link is maintained only for the last 32K strings. * An index in this array is thus a window index modulo 32K. */ Posf *head; /* Heads of the hash chains or NIL. */ uInt ins_h; /* hash index of string to be inserted */ uInt hash_size; /* number of elements in hash table */ uInt hash_bits; /* log2(hash_size) */ uInt hash_mask; /* hash_size-1 */ uInt hash_shift; /* Number of bits by which ins_h must be shifted at each input * step. It must be such that after MIN_MATCH steps, the oldest * byte no longer takes part in the hash key, that is: * hash_shift * MIN_MATCH >= hash_bits */ long block_start; /* Window position at the beginning of the current output block. Gets * negative when the window is moved backwards. */ uInt match_length; /* length of best match */ IPos prev_match; /* previous match */ int match_available; /* set if previous match exists */ uInt strstart; /* start of string to insert */ uInt match_start; /* start of matching string */ uInt lookahead; /* number of valid bytes ahead in window */ uInt prev_length; /* Length of the best match at previous step. Matches not greater than this * are discarded. This is used in the lazy match evaluation. */ uInt max_chain_length; /* To speed up deflation, hash chains are never searched beyond this * length. A higher limit improves compression ratio but degrades the * speed. */ uInt max_lazy_match; /* Attempt to find a better match only when the current match is strictly * smaller than this value. This mechanism is used only for compression * levels >= 4. */ # define max_insert_length max_lazy_match /* Insert new strings in the hash table only if the match length is not * greater than this length. This saves time but degrades compression. * max_insert_length is used only for compression levels <= 3. */ int level; /* compression level (1..9) */ int strategy; /* favor or force Huffman coding*/ uInt good_match; /* Use a faster search when the previous match is longer than this */ int nice_match; /* Stop searching when current match exceeds this */ /* used by trees.c: */ /* Didn't use ct_data typedef below to supress compiler warning */ struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ struct tree_desc_s l_desc; /* desc. for literal tree */ struct tree_desc_s d_desc; /* desc. for distance tree */ struct tree_desc_s bl_desc; /* desc. for bit length tree */ ush bl_count[MAX_BITS+1]; /* number of codes at each bit length for an optimal tree */ int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ int heap_len; /* number of elements in the heap */ int heap_max; /* element of largest frequency */ /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. * The same heap array is used to build all trees. */ uch depth[2*L_CODES+1]; /* Depth of each subtree used as tie breaker for trees of equal frequency */ uchf *l_buf; /* buffer for literals or lengths */ uInt lit_bufsize; /* Size of match buffer for literals/lengths. There are 4 reasons for * limiting lit_bufsize to 64K: * - frequencies can be kept in 16 bit counters * - if compression is not successful for the first block, all input * data is still in the window so we can still emit a stored block even * when input comes from standard input. (This can also be done for * all blocks if lit_bufsize is not greater than 32K.) * - if compression is not successful for a file smaller than 64K, we can * even emit a stored file instead of a stored block (saving 5 bytes). * This is applicable only for zip (not gzip or zlib). * - creating new Huffman trees less frequently may not provide fast * adaptation to changes in the input data statistics. (Take for * example a binary file with poorly compressible code followed by * a highly compressible string table.) Smaller buffer sizes give * fast adaptation but have of course the overhead of transmitting * trees more frequently. * - I can't count above 4 */ uInt last_lit; /* running index in l_buf */ ushf *d_buf; /* Buffer for distances. To simplify the code, d_buf and l_buf have * the same number of elements. To use different lengths, an extra flag * array would be necessary. */ ulg opt_len; /* bit length of current block with optimal trees */ ulg static_len; /* bit length of current block with static trees */ uInt matches; /* number of string matches in current block */ int last_eob_len; /* bit length of EOB code for last block */ #ifdef DEBUG ulg compressed_len; /* total bit length of compressed file mod 2^32 */ ulg bits_sent; /* bit length of compressed data sent mod 2^32 */ #endif ush bi_buf; /* Output buffer. bits are inserted starting at the bottom (least * significant bits). */ int bi_valid; /* Number of valid bits in bi_buf. All bits above the last valid bit * are always zero. */ ulg high_water; /* High water mark offset in window for initialized bytes -- bytes above * this are set to zero in order to avoid memory check warnings when * longest match routines access bytes past the input. This is then * updated to the new high water mark. */ } FAR deflate_state; /* Output a byte on the stream. * IN assertion: there is enough room in pending_buf. */ #define put_byte(s, c) {s->pending_buf[s->pending++] = (c);} #define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) /* Minimum amount of lookahead, except at the end of the input file. * See deflate.c for comments about the MIN_MATCH+1. */ #define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD) /* In order to simplify the code, particularly on 16 bit machines, match * distances are limited to MAX_DIST instead of WSIZE. */ #define WIN_INIT MAX_MATCH /* Number of bytes after end of data in window to initialize in order to avoid memory checker errors from longest match routines */ /* in trees.c */ void ZLIB_INTERNAL _tr_init OF((deflate_state *s)); int ZLIB_INTERNAL _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); void ZLIB_INTERNAL _tr_flush_block OF((deflate_state *s, charf *buf, ulg stored_len, int last)); void ZLIB_INTERNAL _tr_align OF((deflate_state *s)); void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, ulg stored_len, int last)); #define d_code(dist) \ ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)]) /* Mapping from a distance to a distance code. dist is the distance - 1 and * must not have side effects. _dist_code[256] and _dist_code[257] are never * used. */ #ifndef DEBUG /* Inline versions of _tr_tally for speed: */ #if defined(GEN_TREES_H) || !defined(STDC) extern uch ZLIB_INTERNAL _length_code[]; extern uch ZLIB_INTERNAL _dist_code[]; #else extern const uch ZLIB_INTERNAL _length_code[]; extern const uch ZLIB_INTERNAL _dist_code[]; #endif # define _tr_tally_lit(s, c, flush) \ { uch cc = (c); \ s->d_buf[s->last_lit] = 0; \ s->l_buf[s->last_lit++] = cc; \ s->dyn_ltree[cc].Freq++; \ flush = (s->last_lit == s->lit_bufsize-1); \ } # define _tr_tally_dist(s, distance, length, flush) \ { uch len = (length); \ ush dist = (distance); \ s->d_buf[s->last_lit] = dist; \ s->l_buf[s->last_lit++] = len; \ dist--; \ s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ s->dyn_dtree[d_code(dist)].Freq++; \ flush = (s->last_lit == s->lit_bufsize-1); \ } #else # define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) # define _tr_tally_dist(s, distance, length, flush) \ flush = _tr_tally(s, distance, length) #endif #endif /* DEFLATE_H */ glpk-5.0/src/zlib/gzclose.c0000644000062000006210000000124613766346220015046 0ustar maomkpasswd/* gzclose.c -- zlib gzclose() function * Copyright (C) 2004, 2010 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ #include "gzguts.h" /* gzclose() is in a separate file so that it is linked in only if it is used. That way the other gzclose functions can be used instead to avoid linking in unneeded compression or decompression routines. */ int ZEXPORT gzclose(file) gzFile file; { #ifndef NO_GZCOMPRESS gz_statep state; if (file == NULL) return Z_STREAM_ERROR; state = (gz_statep)file; return state->mode == GZ_READ ? gzclose_r(file) : gzclose_w(file); #else return gzclose_r(file); #endif } glpk-5.0/src/zlib/gzguts.h0000644000062000006210000000273013766346220014727 0ustar maomkpasswd/* gzguts.h (zlib internal header definitions for gz* operations) */ /* Modified by Andrew Makhorin , April 2011 */ /* Copyright (C) 2004, 2005, 2010 Mark Adler * For conditions of distribution and use, see copyright notice in * zlib.h */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ #ifndef GZGUTS_H #define GZGUTS_H #define ZLIB_INTERNAL #include #include #include #include #include #include "zio.h" #include "zlib.h" #define local static #define zstrerror() strerror(errno) #define GZBUFSIZE 8192 #define GZ_NONE 0 #define GZ_READ 7247 #define GZ_WRITE 31153 #define GZ_APPEND 1 #define LOOK 0 #define COPY 1 #define GZIP 2 typedef struct { int mode; int fd; char *path; z_off64_t pos; unsigned size; unsigned want; unsigned char *in; unsigned char *out; unsigned char *next; unsigned have; int eof; z_off64_t start; z_off64_t raw; int how; int direct; int level; int strategy; z_off64_t skip; int seek; int err; char *msg; z_stream strm; } gz_state; typedef gz_state *gz_statep; void ZLIB_INTERNAL gz_error OF((gz_statep, int, const char *)); #define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX) #endif /* eof */ glpk-5.0/src/zlib/gzlib.c0000644000062000006210000003336713766346220014520 0ustar maomkpasswd/* gzlib.c -- zlib functions common to reading and writing gzip files * Copyright (C) 2004, 2010 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ #include "gzguts.h" #if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 # define LSEEK lseek64 #else # define LSEEK lseek #endif /* Local functions */ local void gz_reset OF((gz_statep)); local gzFile gz_open OF((const char *, int, const char *)); #if defined UNDER_CE /* Map the Windows error number in ERROR to a locale-dependent error message string and return a pointer to it. Typically, the values for ERROR come from GetLastError. The string pointed to shall not be modified by the application, but may be overwritten by a subsequent call to gz_strwinerror The gz_strwinerror function does not change the current setting of GetLastError. */ char ZLIB_INTERNAL *gz_strwinerror (error) DWORD error; { static char buf[1024]; wchar_t *msgbuf; DWORD lasterr = GetLastError(); DWORD chars = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, error, 0, /* Default language */ (LPVOID)&msgbuf, 0, NULL); if (chars != 0) { /* If there is an \r\n appended, zap it. */ if (chars >= 2 && msgbuf[chars - 2] == '\r' && msgbuf[chars - 1] == '\n') { chars -= 2; msgbuf[chars] = 0; } if (chars > sizeof (buf) - 1) { chars = sizeof (buf) - 1; msgbuf[chars] = 0; } wcstombs(buf, msgbuf, chars + 1); LocalFree(msgbuf); } else { sprintf(buf, "unknown win32 error (%ld)", error); } SetLastError(lasterr); return buf; } #endif /* UNDER_CE */ /* Reset gzip file state */ local void gz_reset(state) gz_statep state; { if (state->mode == GZ_READ) { /* for reading ... */ state->have = 0; /* no output data available */ state->eof = 0; /* not at end of file */ state->how = LOOK; /* look for gzip header */ state->direct = 1; /* default for empty file */ } state->seek = 0; /* no seek request pending */ gz_error(state, Z_OK, NULL); /* clear error */ state->pos = 0; /* no uncompressed data yet */ state->strm.avail_in = 0; /* no input data yet */ } /* Open a gzip file either by name or file descriptor. */ local gzFile gz_open(path, fd, mode) const char *path; int fd; const char *mode; { gz_statep state; /* allocate gzFile structure to return */ state = malloc(sizeof(gz_state)); if (state == NULL) return NULL; state->size = 0; /* no buffers allocated yet */ state->want = GZBUFSIZE; /* requested buffer size */ state->msg = NULL; /* no error message yet */ /* interpret mode */ state->mode = GZ_NONE; state->level = Z_DEFAULT_COMPRESSION; state->strategy = Z_DEFAULT_STRATEGY; while (*mode) { if (*mode >= '0' && *mode <= '9') state->level = *mode - '0'; else switch (*mode) { case 'r': state->mode = GZ_READ; break; #ifndef NO_GZCOMPRESS case 'w': state->mode = GZ_WRITE; break; case 'a': state->mode = GZ_APPEND; break; #endif case '+': /* can't read and write at the same time */ free(state); return NULL; case 'b': /* ignore -- will request binary anyway */ break; case 'f': state->strategy = Z_FILTERED; break; case 'h': state->strategy = Z_HUFFMAN_ONLY; break; case 'R': state->strategy = Z_RLE; break; case 'F': state->strategy = Z_FIXED; default: /* could consider as an error, but just ignore */ ; } mode++; } /* must provide an "r", "w", or "a" */ if (state->mode == GZ_NONE) { free(state); return NULL; } /* save the path name for error messages */ state->path = malloc(strlen(path) + 1); if (state->path == NULL) { free(state); return NULL; } strcpy(state->path, path); /* open the file with the appropriate mode (or just use fd) */ state->fd = fd != -1 ? fd : open(path, #ifdef O_LARGEFILE O_LARGEFILE | #endif #ifdef O_BINARY O_BINARY | #endif (state->mode == GZ_READ ? O_RDONLY : (O_WRONLY | O_CREAT | ( state->mode == GZ_WRITE ? O_TRUNC : O_APPEND))), 0666); if (state->fd == -1) { free(state->path); free(state); return NULL; } if (state->mode == GZ_APPEND) state->mode = GZ_WRITE; /* simplify later checks */ /* save the current position for rewinding (only if reading) */ if (state->mode == GZ_READ) { state->start = LSEEK(state->fd, 0, SEEK_CUR); if (state->start == -1) state->start = 0; } /* initialize stream */ gz_reset(state); /* return stream */ return (gzFile)state; } /* -- see zlib.h -- */ gzFile ZEXPORT gzopen(path, mode) const char *path; const char *mode; { return gz_open(path, -1, mode); } /* -- see zlib.h -- */ gzFile ZEXPORT gzopen64(path, mode) const char *path; const char *mode; { return gz_open(path, -1, mode); } /* -- see zlib.h -- */ gzFile ZEXPORT gzdopen(fd, mode) int fd; const char *mode; { char *path; /* identifier for error messages */ gzFile gz; if (fd == -1 || (path = malloc(7 + 3 * sizeof(int))) == NULL) return NULL; sprintf(path, "", fd); /* for debugging */ gz = gz_open(path, fd, mode); free(path); return gz; } /* -- see zlib.h -- */ int ZEXPORT gzbuffer(file, size) gzFile file; unsigned size; { gz_statep state; /* get internal structure and check integrity */ if (file == NULL) return -1; state = (gz_statep)file; if (state->mode != GZ_READ && state->mode != GZ_WRITE) return -1; /* make sure we haven't already allocated memory */ if (state->size != 0) return -1; /* check and set requested size */ if (size == 0) return -1; state->want = size; return 0; } /* -- see zlib.h -- */ int ZEXPORT gzrewind(file) gzFile file; { gz_statep state; /* get internal structure */ if (file == NULL) return -1; state = (gz_statep)file; /* check that we're reading and that there's no error */ if (state->mode != GZ_READ || state->err != Z_OK) return -1; /* back up and start over */ if (LSEEK(state->fd, state->start, SEEK_SET) == -1) return -1; gz_reset(state); return 0; } /* -- see zlib.h -- */ z_off64_t ZEXPORT gzseek64(file, offset, whence) gzFile file; z_off64_t offset; int whence; { unsigned n; z_off64_t ret; gz_statep state; /* get internal structure and check integrity */ if (file == NULL) return -1; state = (gz_statep)file; if (state->mode != GZ_READ && state->mode != GZ_WRITE) return -1; /* check that there's no error */ if (state->err != Z_OK) return -1; /* can only seek from start or relative to current position */ if (whence != SEEK_SET && whence != SEEK_CUR) return -1; /* normalize offset to a SEEK_CUR specification */ if (whence == SEEK_SET) offset -= state->pos; else if (state->seek) offset += state->skip; state->seek = 0; /* if within raw area while reading, just go there */ if (state->mode == GZ_READ && state->how == COPY && state->pos + offset >= state->raw) { ret = LSEEK(state->fd, offset - state->have, SEEK_CUR); if (ret == -1) return -1; state->have = 0; state->eof = 0; state->seek = 0; gz_error(state, Z_OK, NULL); state->strm.avail_in = 0; state->pos += offset; return state->pos; } /* calculate skip amount, rewinding if needed for back seek when reading */ if (offset < 0) { if (state->mode != GZ_READ) /* writing -- can't go backwards */ return -1; offset += state->pos; if (offset < 0) /* before start of file! */ return -1; if (gzrewind(file) == -1) /* rewind, then skip to offset */ return -1; } /* if reading, skip what's in output buffer (one less gzgetc() check) */ if (state->mode == GZ_READ) { n = GT_OFF(state->have) || (z_off64_t)state->have > offset ? (unsigned)offset : state->have; state->have -= n; state->next += n; state->pos += n; offset -= n; } /* request skip (if not zero) */ if (offset) { state->seek = 1; state->skip = offset; } return state->pos + offset; } /* -- see zlib.h -- */ z_off_t ZEXPORT gzseek(file, offset, whence) gzFile file; z_off_t offset; int whence; { z_off64_t ret; ret = gzseek64(file, (z_off64_t)offset, whence); return ret == (z_off_t)ret ? (z_off_t)ret : -1; } /* -- see zlib.h -- */ z_off64_t ZEXPORT gztell64(file) gzFile file; { gz_statep state; /* get internal structure and check integrity */ if (file == NULL) return -1; state = (gz_statep)file; if (state->mode != GZ_READ && state->mode != GZ_WRITE) return -1; /* return position */ return state->pos + (state->seek ? state->skip : 0); } /* -- see zlib.h -- */ z_off_t ZEXPORT gztell(file) gzFile file; { z_off64_t ret; ret = gztell64(file); return ret == (z_off_t)ret ? (z_off_t)ret : -1; } /* -- see zlib.h -- */ z_off64_t ZEXPORT gzoffset64(file) gzFile file; { z_off64_t offset; gz_statep state; /* get internal structure and check integrity */ if (file == NULL) return -1; state = (gz_statep)file; if (state->mode != GZ_READ && state->mode != GZ_WRITE) return -1; /* compute and return effective offset in file */ offset = LSEEK(state->fd, 0, SEEK_CUR); if (offset == -1) return -1; if (state->mode == GZ_READ) /* reading */ offset -= state->strm.avail_in; /* don't count buffered input */ return offset; } /* -- see zlib.h -- */ z_off_t ZEXPORT gzoffset(file) gzFile file; { z_off64_t ret; ret = gzoffset64(file); return ret == (z_off_t)ret ? (z_off_t)ret : -1; } /* -- see zlib.h -- */ int ZEXPORT gzeof(file) gzFile file; { gz_statep state; /* get internal structure and check integrity */ if (file == NULL) return 0; state = (gz_statep)file; if (state->mode != GZ_READ && state->mode != GZ_WRITE) return 0; /* return end-of-file state */ return state->mode == GZ_READ ? (state->eof && state->strm.avail_in == 0 && state->have == 0) : 0; } /* -- see zlib.h -- */ const char * ZEXPORT gzerror(file, errnum) gzFile file; int *errnum; { gz_statep state; /* get internal structure and check integrity */ if (file == NULL) return NULL; state = (gz_statep)file; if (state->mode != GZ_READ && state->mode != GZ_WRITE) return NULL; /* return error information */ if (errnum != NULL) *errnum = state->err; return state->msg == NULL ? "" : state->msg; } /* -- see zlib.h -- */ void ZEXPORT gzclearerr(file) gzFile file; { gz_statep state; /* get internal structure and check integrity */ if (file == NULL) return; state = (gz_statep)file; if (state->mode != GZ_READ && state->mode != GZ_WRITE) return; /* clear error and end-of-file */ if (state->mode == GZ_READ) state->eof = 0; gz_error(state, Z_OK, NULL); } /* Create an error message in allocated memory and set state->err and state->msg accordingly. Free any previous error message already there. Do not try to free or allocate space if the error is Z_MEM_ERROR (out of memory). Simply save the error message as a static string. If there is an allocation failure constructing the error message, then convert the error to out of memory. */ void ZLIB_INTERNAL gz_error(state, err, msg) gz_statep state; int err; const char *msg; { /* free previously allocated message and clear */ if (state->msg != NULL) { if (state->err != Z_MEM_ERROR) free(state->msg); state->msg = NULL; } /* set error code, and if no message, then done */ state->err = err; if (msg == NULL) return; /* for an out of memory error, save as static string */ if (err == Z_MEM_ERROR) { state->msg = (char *)msg; return; } /* construct error message with path */ if ((state->msg = malloc(strlen(state->path) + strlen(msg) + 3)) == NULL) { state->err = Z_MEM_ERROR; state->msg = (char *)"out of memory"; return; } strcpy(state->msg, state->path); strcat(state->msg, ": "); strcat(state->msg, msg); return; } #ifndef INT_MAX /* portably return maximum value for an int (when limits.h presumed not available) -- we need to do this to cover cases where 2's complement not used, since C standard permits 1's complement and sign-bit representations, otherwise we could just use ((unsigned)-1) >> 1 */ unsigned ZLIB_INTERNAL gz_intmax() { unsigned p, q; p = 1; do { q = p; p <<= 1; p++; } while (p > q); return q >> 1; } #endif glpk-5.0/src/zlib/gzread.c0000644000062000006210000005013613766346220014656 0ustar maomkpasswd/* gzread.c -- zlib functions for reading gzip files * Copyright (C) 2004, 2005, 2010 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ #include "gzguts.h" /* Local functions */ local int gz_load OF((gz_statep, unsigned char *, unsigned, unsigned *)); local int gz_avail OF((gz_statep)); local int gz_next4 OF((gz_statep, unsigned long *)); local int gz_head OF((gz_statep)); local int gz_decomp OF((gz_statep)); local int gz_make OF((gz_statep)); local int gz_skip OF((gz_statep, z_off64_t)); /* Use read() to load a buffer -- return -1 on error, otherwise 0. Read from state->fd, and update state->eof, state->err, and state->msg as appropriate. This function needs to loop on read(), since read() is not guaranteed to read the number of bytes requested, depending on the type of descriptor. */ local int gz_load(state, buf, len, have) gz_statep state; unsigned char *buf; unsigned len; unsigned *have; { int ret; *have = 0; do { ret = read(state->fd, buf + *have, len - *have); if (ret <= 0) break; *have += ret; } while (*have < len); if (ret < 0) { gz_error(state, Z_ERRNO, zstrerror()); return -1; } if (ret == 0) state->eof = 1; return 0; } /* Load up input buffer and set eof flag if last data loaded -- return -1 on error, 0 otherwise. Note that the eof flag is set when the end of the input file is reached, even though there may be unused data in the buffer. Once that data has been used, no more attempts will be made to read the file. gz_avail() assumes that strm->avail_in == 0. */ local int gz_avail(state) gz_statep state; { z_streamp strm = &(state->strm); if (state->err != Z_OK) return -1; if (state->eof == 0) { if (gz_load(state, state->in, state->size, (unsigned *)&(strm->avail_in)) == -1) return -1; strm->next_in = state->in; } return 0; } /* Get next byte from input, or -1 if end or error. */ #define NEXT() ((strm->avail_in == 0 && gz_avail(state) == -1) ? -1 : \ (strm->avail_in == 0 ? -1 : \ (strm->avail_in--, *(strm->next_in)++))) /* Get a four-byte little-endian integer and return 0 on success and the value in *ret. Otherwise -1 is returned and *ret is not modified. */ local int gz_next4(state, ret) gz_statep state; unsigned long *ret; { int ch; unsigned long val; z_streamp strm = &(state->strm); val = NEXT(); val += (unsigned)NEXT() << 8; val += (unsigned long)NEXT() << 16; ch = NEXT(); if (ch == -1) return -1; val += (unsigned long)ch << 24; *ret = val; return 0; } /* Look for gzip header, set up for inflate or copy. state->have must be zero. If this is the first time in, allocate required memory. state->how will be left unchanged if there is no more input data available, will be set to COPY if there is no gzip header and direct copying will be performed, or it will be set to GZIP for decompression, and the gzip header will be skipped so that the next available input data is the raw deflate stream. If direct copying, then leftover input data from the input buffer will be copied to the output buffer. In that case, all further file reads will be directly to either the output buffer or a user buffer. If decompressing, the inflate state and the check value will be initialized. gz_head() will return 0 on success or -1 on failure. Failures may include read errors or gzip header errors. */ local int gz_head(state) gz_statep state; { z_streamp strm = &(state->strm); int flags; unsigned len; /* allocate read buffers and inflate memory */ if (state->size == 0) { /* allocate buffers */ state->in = malloc(state->want); state->out = malloc(state->want << 1); if (state->in == NULL || state->out == NULL) { if (state->out != NULL) free(state->out); if (state->in != NULL) free(state->in); gz_error(state, Z_MEM_ERROR, "out of memory"); return -1; } state->size = state->want; /* allocate inflate memory */ state->strm.zalloc = Z_NULL; state->strm.zfree = Z_NULL; state->strm.opaque = Z_NULL; state->strm.avail_in = 0; state->strm.next_in = Z_NULL; if (inflateInit2(&(state->strm), -15) != Z_OK) { /* raw inflate */ free(state->out); free(state->in); state->size = 0; gz_error(state, Z_MEM_ERROR, "out of memory"); return -1; } } /* get some data in the input buffer */ if (strm->avail_in == 0) { if (gz_avail(state) == -1) return -1; if (strm->avail_in == 0) return 0; } /* look for the gzip magic header bytes 31 and 139 */ if (strm->next_in[0] == 31) { strm->avail_in--; strm->next_in++; if (strm->avail_in == 0 && gz_avail(state) == -1) return -1; if (strm->avail_in && strm->next_in[0] == 139) { /* we have a gzip header, woo hoo! */ strm->avail_in--; strm->next_in++; /* skip rest of header */ if (NEXT() != 8) { /* compression method */ gz_error(state, Z_DATA_ERROR, "unknown compression method"); return -1; } flags = NEXT(); if (flags & 0xe0) { /* reserved flag bits */ gz_error(state, Z_DATA_ERROR, "unknown header flags set"); return -1; } NEXT(); /* modification time */ NEXT(); NEXT(); NEXT(); NEXT(); /* extra flags */ NEXT(); /* operating system */ if (flags & 4) { /* extra field */ len = (unsigned)NEXT(); len += (unsigned)NEXT() << 8; while (len--) if (NEXT() < 0) break; } if (flags & 8) /* file name */ while (NEXT() > 0) ; if (flags & 16) /* comment */ while (NEXT() > 0) ; if (flags & 2) { /* header crc */ NEXT(); NEXT(); } /* an unexpected end of file is not checked for here -- it will be noticed on the first request for uncompressed data */ /* set up for decompression */ inflateReset(strm); strm->adler = crc32(0L, Z_NULL, 0); state->how = GZIP; state->direct = 0; return 0; } else { /* not a gzip file -- save first byte (31) and fall to raw i/o */ state->out[0] = 31; state->have = 1; } } /* doing raw i/o, save start of raw data for seeking, copy any leftover input to output -- this assumes that the output buffer is larger than the input buffer, which also assures space for gzungetc() */ state->raw = state->pos; state->next = state->out; if (strm->avail_in) { memcpy(state->next + state->have, strm->next_in, strm->avail_in); state->have += strm->avail_in; strm->avail_in = 0; } state->how = COPY; state->direct = 1; return 0; } /* Decompress from input to the provided next_out and avail_out in the state. If the end of the compressed data is reached, then verify the gzip trailer check value and length (modulo 2^32). state->have and state->next are set to point to the just decompressed data, and the crc is updated. If the trailer is verified, state->how is reset to LOOK to look for the next gzip stream or raw data, once state->have is depleted. Returns 0 on success, -1 on failure. Failures may include invalid compressed data or a failed gzip trailer verification. */ local int gz_decomp(state) gz_statep state; { int ret; unsigned had; unsigned long crc, len; z_streamp strm = &(state->strm); /* fill output buffer up to end of deflate stream */ had = strm->avail_out; do { /* get more input for inflate() */ if (strm->avail_in == 0 && gz_avail(state) == -1) return -1; if (strm->avail_in == 0) { gz_error(state, Z_DATA_ERROR, "unexpected end of file"); return -1; } /* decompress and handle errors */ ret = inflate(strm, Z_NO_FLUSH); if (ret == Z_STREAM_ERROR || ret == Z_NEED_DICT) { gz_error(state, Z_STREAM_ERROR, "internal error: inflate stream corrupt"); return -1; } if (ret == Z_MEM_ERROR) { gz_error(state, Z_MEM_ERROR, "out of memory"); return -1; } if (ret == Z_DATA_ERROR) { /* deflate stream invalid */ gz_error(state, Z_DATA_ERROR, strm->msg == NULL ? "compressed data error" : strm->msg); return -1; } } while (strm->avail_out && ret != Z_STREAM_END); /* update available output and crc check value */ state->have = had - strm->avail_out; state->next = strm->next_out - state->have; strm->adler = crc32(strm->adler, state->next, state->have); /* check gzip trailer if at end of deflate stream */ if (ret == Z_STREAM_END) { if (gz_next4(state, &crc) == -1 || gz_next4(state, &len) == -1) { gz_error(state, Z_DATA_ERROR, "unexpected end of file"); return -1; } if (crc != strm->adler) { gz_error(state, Z_DATA_ERROR, "incorrect data check"); return -1; } if (len != (strm->total_out & 0xffffffffL)) { gz_error(state, Z_DATA_ERROR, "incorrect length check"); return -1; } state->how = LOOK; /* ready for next stream, once have is 0 (leave state->direct unchanged to remember how) */ } /* good decompression */ return 0; } /* Make data and put in the output buffer. Assumes that state->have == 0. Data is either copied from the input file or decompressed from the input file depending on state->how. If state->how is LOOK, then a gzip header is looked for (and skipped if found) to determine wither to copy or decompress. Returns -1 on error, otherwise 0. gz_make() will leave state->have as COPY or GZIP unless the end of the input file has been reached and all data has been processed. */ local int gz_make(state) gz_statep state; { z_streamp strm = &(state->strm); if (state->how == LOOK) { /* look for gzip header */ if (gz_head(state) == -1) return -1; if (state->have) /* got some data from gz_head() */ return 0; } if (state->how == COPY) { /* straight copy */ if (gz_load(state, state->out, state->size << 1, &(state->have)) == -1) return -1; state->next = state->out; } else if (state->how == GZIP) { /* decompress */ strm->avail_out = state->size << 1; strm->next_out = state->out; if (gz_decomp(state) == -1) return -1; } return 0; } /* Skip len uncompressed bytes of output. Return -1 on error, 0 on success. */ local int gz_skip(state, len) gz_statep state; z_off64_t len; { unsigned n; /* skip over len bytes or reach end-of-file, whichever comes first */ while (len) /* skip over whatever is in output buffer */ if (state->have) { n = GT_OFF(state->have) || (z_off64_t)state->have > len ? (unsigned)len : state->have; state->have -= n; state->next += n; state->pos += n; len -= n; } /* output buffer empty -- return if we're at the end of the input */ else if (state->eof && state->strm.avail_in == 0) break; /* need more data to skip -- load up output buffer */ else { /* get more output, looking for header if required */ if (gz_make(state) == -1) return -1; } return 0; } /* -- see zlib.h -- */ int ZEXPORT gzread(file, buf, len) gzFile file; voidp buf; unsigned len; { unsigned got, n; gz_statep state; z_streamp strm; /* get internal structure */ if (file == NULL) return -1; state = (gz_statep)file; strm = &(state->strm); /* check that we're reading and that there's no error */ if (state->mode != GZ_READ || state->err != Z_OK) return -1; /* since an int is returned, make sure len fits in one, otherwise return with an error (this avoids the flaw in the interface) */ if ((int)len < 0) { gz_error(state, Z_BUF_ERROR, "requested length does not fit in int"); return -1; } /* if len is zero, avoid unnecessary operations */ if (len == 0) return 0; /* process a skip request */ if (state->seek) { state->seek = 0; if (gz_skip(state, state->skip) == -1) return -1; } /* get len bytes to buf, or less than len if at the end */ got = 0; do { /* first just try copying data from the output buffer */ if (state->have) { n = state->have > len ? len : state->have; memcpy(buf, state->next, n); state->next += n; state->have -= n; } /* output buffer empty -- return if we're at the end of the input */ else if (state->eof && strm->avail_in == 0) break; /* need output data -- for small len or new stream load up our output buffer */ else if (state->how == LOOK || len < (state->size << 1)) { /* get more output, looking for header if required */ if (gz_make(state) == -1) return -1; continue; /* no progress yet -- go back to memcpy() above */ /* the copy above assures that we will leave with space in the output buffer, allowing at least one gzungetc() to succeed */ } /* large len -- read directly into user buffer */ else if (state->how == COPY) { /* read directly */ if (gz_load(state, buf, len, &n) == -1) return -1; } /* large len -- decompress directly into user buffer */ else { /* state->how == GZIP */ strm->avail_out = len; strm->next_out = buf; if (gz_decomp(state) == -1) return -1; n = state->have; state->have = 0; } /* update progress */ len -= n; buf = (char *)buf + n; got += n; state->pos += n; } while (len); /* return number of bytes read into user buffer (will fit in int) */ return (int)got; } /* -- see zlib.h -- */ int ZEXPORT gzgetc(file) gzFile file; { int ret; unsigned char buf[1]; gz_statep state; /* get internal structure */ if (file == NULL) return -1; state = (gz_statep)file; /* check that we're reading and that there's no error */ if (state->mode != GZ_READ || state->err != Z_OK) return -1; /* try output buffer (no need to check for skip request) */ if (state->have) { state->have--; state->pos++; return *(state->next)++; } /* nothing there -- try gzread() */ ret = gzread(file, buf, 1); return ret < 1 ? -1 : buf[0]; } /* -- see zlib.h -- */ int ZEXPORT gzungetc(c, file) int c; gzFile file; { gz_statep state; /* get internal structure */ if (file == NULL) return -1; state = (gz_statep)file; /* check that we're reading and that there's no error */ if (state->mode != GZ_READ || state->err != Z_OK) return -1; /* process a skip request */ if (state->seek) { state->seek = 0; if (gz_skip(state, state->skip) == -1) return -1; } /* can't push EOF */ if (c < 0) return -1; /* if output buffer empty, put byte at end (allows more pushing) */ if (state->have == 0) { state->have = 1; state->next = state->out + (state->size << 1) - 1; state->next[0] = c; state->pos--; return c; } /* if no room, give up (must have already done a gzungetc()) */ if (state->have == (state->size << 1)) { gz_error(state, Z_BUF_ERROR, "out of room to push characters"); return -1; } /* slide output data if needed and insert byte before existing data */ if (state->next == state->out) { unsigned char *src = state->out + state->have; unsigned char *dest = state->out + (state->size << 1); while (src > state->out) *--dest = *--src; state->next = dest; } state->have++; state->next--; state->next[0] = c; state->pos--; return c; } /* -- see zlib.h -- */ char * ZEXPORT gzgets(file, buf, len) gzFile file; char *buf; int len; { unsigned left, n; char *str; unsigned char *eol; gz_statep state; /* check parameters and get internal structure */ if (file == NULL || buf == NULL || len < 1) return NULL; state = (gz_statep)file; /* check that we're reading and that there's no error */ if (state->mode != GZ_READ || state->err != Z_OK) return NULL; /* process a skip request */ if (state->seek) { state->seek = 0; if (gz_skip(state, state->skip) == -1) return NULL; } /* copy output bytes up to new line or len - 1, whichever comes first -- append a terminating zero to the string (we don't check for a zero in the contents, let the user worry about that) */ str = buf; left = (unsigned)len - 1; if (left) do { /* assure that something is in the output buffer */ if (state->have == 0) { if (gz_make(state) == -1) return NULL; /* error */ if (state->have == 0) { /* end of file */ if (buf == str) /* got bupkus */ return NULL; break; /* got something -- return it */ } } /* look for end-of-line in current output buffer */ n = state->have > left ? left : state->have; eol = memchr(state->next, '\n', n); if (eol != NULL) n = (unsigned)(eol - state->next) + 1; /* copy through end-of-line, or remainder if not found */ memcpy(buf, state->next, n); state->have -= n; state->next += n; state->pos += n; left -= n; buf += n; } while (left && eol == NULL); /* found end-of-line or out of space -- terminate string and return it */ buf[0] = 0; return str; } /* -- see zlib.h -- */ int ZEXPORT gzdirect(file) gzFile file; { gz_statep state; /* get internal structure */ if (file == NULL) return 0; state = (gz_statep)file; /* check that we're reading */ if (state->mode != GZ_READ) return 0; /* if the state is not known, but we can find out, then do so (this is mainly for right after a gzopen() or gzdopen()) */ if (state->how == LOOK && state->have == 0) (void)gz_head(state); /* return 1 if reading direct, 0 if decompressing a gzip stream */ return state->direct; } /* -- see zlib.h -- */ int ZEXPORT gzclose_r(file) gzFile file; { int ret; gz_statep state; /* get internal structure */ if (file == NULL) return Z_STREAM_ERROR; state = (gz_statep)file; /* check that we're reading */ if (state->mode != GZ_READ) return Z_STREAM_ERROR; /* free memory and close file */ if (state->size) { inflateEnd(&(state->strm)); free(state->out); free(state->in); } gz_error(state, Z_OK, NULL); free(state->path); ret = close(state->fd); free(state); return ret ? Z_ERRNO : Z_OK; } glpk-5.0/src/zlib/gzwrite.c0000644000062000006210000003442213766346220015075 0ustar maomkpasswd/* gzwrite.c -- zlib functions for writing gzip files * Copyright (C) 2004, 2005, 2010 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ #include "gzguts.h" /* Local functions */ local int gz_init OF((gz_statep)); local int gz_comp OF((gz_statep, int)); local int gz_zero OF((gz_statep, z_off64_t)); /* Initialize state for writing a gzip file. Mark initialization by setting state->size to non-zero. Return -1 on failure or 0 on success. */ local int gz_init(state) gz_statep state; { int ret; z_streamp strm = &(state->strm); /* allocate input and output buffers */ state->in = malloc(state->want); state->out = malloc(state->want); if (state->in == NULL || state->out == NULL) { if (state->out != NULL) free(state->out); if (state->in != NULL) free(state->in); gz_error(state, Z_MEM_ERROR, "out of memory"); return -1; } /* allocate deflate memory, set up for gzip compression */ strm->zalloc = Z_NULL; strm->zfree = Z_NULL; strm->opaque = Z_NULL; ret = deflateInit2(strm, state->level, Z_DEFLATED, 15 + 16, 8, state->strategy); if (ret != Z_OK) { free(state->in); gz_error(state, Z_MEM_ERROR, "out of memory"); return -1; } /* mark state as initialized */ state->size = state->want; /* initialize write buffer */ strm->avail_out = state->size; strm->next_out = state->out; state->next = strm->next_out; return 0; } /* Compress whatever is at avail_in and next_in and write to the output file. Return -1 if there is an error writing to the output file, otherwise 0. flush is assumed to be a valid deflate() flush value. If flush is Z_FINISH, then the deflate() state is reset to start a new gzip stream. */ local int gz_comp(state, flush) gz_statep state; int flush; { int ret, got; unsigned have; z_streamp strm = &(state->strm); /* allocate memory if this is the first time through */ if (state->size == 0 && gz_init(state) == -1) return -1; /* run deflate() on provided input until it produces no more output */ ret = Z_OK; do { /* write out current buffer contents if full, or if flushing, but if doing Z_FINISH then don't write until we get to Z_STREAM_END */ if (strm->avail_out == 0 || (flush != Z_NO_FLUSH && (flush != Z_FINISH || ret == Z_STREAM_END))) { have = (unsigned)(strm->next_out - state->next); if (have && ((got = write(state->fd, state->next, have)) < 0 || (unsigned)got != have)) { gz_error(state, Z_ERRNO, zstrerror()); return -1; } if (strm->avail_out == 0) { strm->avail_out = state->size; strm->next_out = state->out; } state->next = strm->next_out; } /* compress */ have = strm->avail_out; ret = deflate(strm, flush); if (ret == Z_STREAM_ERROR) { gz_error(state, Z_STREAM_ERROR, "internal error: deflate stream corrupt"); return -1; } have -= strm->avail_out; } while (have); /* if that completed a deflate stream, allow another to start */ if (flush == Z_FINISH) deflateReset(strm); /* all done, no errors */ return 0; } /* Compress len zeros to output. Return -1 on error, 0 on success. */ local int gz_zero(state, len) gz_statep state; z_off64_t len; { int first; unsigned n; z_streamp strm = &(state->strm); /* consume whatever's left in the input buffer */ if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) return -1; /* compress len zeros (len guaranteed > 0) */ first = 1; while (len) { n = GT_OFF(state->size) || (z_off64_t)state->size > len ? (unsigned)len : state->size; if (first) { memset(state->in, 0, n); first = 0; } strm->avail_in = n; strm->next_in = state->in; state->pos += n; if (gz_comp(state, Z_NO_FLUSH) == -1) return -1; len -= n; } return 0; } /* -- see zlib.h -- */ int ZEXPORT gzwrite(file, buf, len) gzFile file; voidpc buf; unsigned len; { unsigned put = len; unsigned n; gz_statep state; z_streamp strm; /* get internal structure */ if (file == NULL) return 0; state = (gz_statep)file; strm = &(state->strm); /* check that we're writing and that there's no error */ if (state->mode != GZ_WRITE || state->err != Z_OK) return 0; /* since an int is returned, make sure len fits in one, otherwise return with an error (this avoids the flaw in the interface) */ if ((int)len < 0) { gz_error(state, Z_BUF_ERROR, "requested length does not fit in int"); return 0; } /* if len is zero, avoid unnecessary operations */ if (len == 0) return 0; /* allocate memory if this is the first time through */ if (state->size == 0 && gz_init(state) == -1) return 0; /* check for seek request */ if (state->seek) { state->seek = 0; if (gz_zero(state, state->skip) == -1) return 0; } /* for small len, copy to input buffer, otherwise compress directly */ if (len < state->size) { /* copy to input buffer, compress when full */ do { if (strm->avail_in == 0) strm->next_in = state->in; n = state->size - strm->avail_in; if (n > len) n = len; memcpy(strm->next_in + strm->avail_in, buf, n); strm->avail_in += n; state->pos += n; buf = (char *)buf + n; len -= n; if (len && gz_comp(state, Z_NO_FLUSH) == -1) return 0; } while (len); } else { /* consume whatever's left in the input buffer */ if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) return 0; /* directly compress user buffer to file */ strm->avail_in = len; strm->next_in = (voidp)buf; state->pos += len; if (gz_comp(state, Z_NO_FLUSH) == -1) return 0; } /* input was all buffered or compressed (put will fit in int) */ return (int)put; } /* -- see zlib.h -- */ int ZEXPORT gzputc(file, c) gzFile file; int c; { unsigned char buf[1]; gz_statep state; z_streamp strm; /* get internal structure */ if (file == NULL) return -1; state = (gz_statep)file; strm = &(state->strm); /* check that we're writing and that there's no error */ if (state->mode != GZ_WRITE || state->err != Z_OK) return -1; /* check for seek request */ if (state->seek) { state->seek = 0; if (gz_zero(state, state->skip) == -1) return -1; } /* try writing to input buffer for speed (state->size == 0 if buffer not initialized) */ if (strm->avail_in < state->size) { if (strm->avail_in == 0) strm->next_in = state->in; strm->next_in[strm->avail_in++] = c; state->pos++; return c; } /* no room in buffer or not initialized, use gz_write() */ buf[0] = c; if (gzwrite(file, buf, 1) != 1) return -1; return c; } /* -- see zlib.h -- */ int ZEXPORT gzputs(file, str) gzFile file; const char *str; { int ret; unsigned len; /* write string */ len = (unsigned)strlen(str); ret = gzwrite(file, str, len); return ret == 0 && len != 0 ? -1 : ret; } #ifdef STDC #include /* -- see zlib.h -- */ int ZEXPORTVA gzprintf (gzFile file, const char *format, ...) { int size, len; gz_statep state; z_streamp strm; va_list va; /* get internal structure */ if (file == NULL) return -1; state = (gz_statep)file; strm = &(state->strm); /* check that we're writing and that there's no error */ if (state->mode != GZ_WRITE || state->err != Z_OK) return 0; /* make sure we have some buffer space */ if (state->size == 0 && gz_init(state) == -1) return 0; /* check for seek request */ if (state->seek) { state->seek = 0; if (gz_zero(state, state->skip) == -1) return 0; } /* consume whatever's left in the input buffer */ if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) return 0; /* do the printf() into the input buffer, put length in len */ size = (int)(state->size); state->in[size - 1] = 0; va_start(va, format); #ifdef NO_vsnprintf # ifdef HAS_vsprintf_void (void)vsprintf(state->in, format, va); va_end(va); for (len = 0; len < size; len++) if (state->in[len] == 0) break; # else len = vsprintf((char *)state->in, format, va); va_end(va); # endif #else # ifdef HAS_vsnprintf_void (void)vsnprintf(state->in, size, format, va); va_end(va); len = strlen(state->in); # else len = vsnprintf((char *)(state->in), size, format, va); va_end(va); # endif #endif /* check that printf() results fit in buffer */ if (len <= 0 || len >= (int)size || state->in[size - 1] != 0) return 0; /* update buffer and position, defer compression until needed */ strm->avail_in = (unsigned)len; strm->next_in = state->in; state->pos += len; return len; } #else /* !STDC */ /* -- see zlib.h -- */ int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) gzFile file; const char *format; int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20; { int size, len; gz_statep state; z_streamp strm; /* get internal structure */ if (file == NULL) return -1; state = (gz_statep)file; strm = &(state->strm); /* check that we're writing and that there's no error */ if (state->mode != GZ_WRITE || state->err != Z_OK) return 0; /* make sure we have some buffer space */ if (state->size == 0 && gz_init(state) == -1) return 0; /* check for seek request */ if (state->seek) { state->seek = 0; if (gz_zero(state, state->skip) == -1) return 0; } /* consume whatever's left in the input buffer */ if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) return 0; /* do the printf() into the input buffer, put length in len */ size = (int)(state->size); state->in[size - 1] = 0; #ifdef NO_snprintf # ifdef HAS_sprintf_void sprintf(state->in, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); for (len = 0; len < size; len++) if (state->in[len] == 0) break; # else len = sprintf(state->in, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); # endif #else # ifdef HAS_snprintf_void snprintf(state->in, size, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); len = strlen(state->in); # else len = snprintf(state->in, size, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); # endif #endif /* check that printf() results fit in buffer */ if (len <= 0 || len >= (int)size || state->in[size - 1] != 0) return 0; /* update buffer and position, defer compression until needed */ strm->avail_in = (unsigned)len; strm->next_in = state->in; state->pos += len; return len; } #endif /* -- see zlib.h -- */ int ZEXPORT gzflush(file, flush) gzFile file; int flush; { gz_statep state; /* get internal structure */ if (file == NULL) return -1; state = (gz_statep)file; /* check that we're writing and that there's no error */ if (state->mode != GZ_WRITE || state->err != Z_OK) return Z_STREAM_ERROR; /* check flush parameter */ if (flush < 0 || flush > Z_FINISH) return Z_STREAM_ERROR; /* check for seek request */ if (state->seek) { state->seek = 0; if (gz_zero(state, state->skip) == -1) return -1; } /* compress remaining data with requested flush */ gz_comp(state, flush); return state->err; } /* -- see zlib.h -- */ int ZEXPORT gzsetparams(file, level, strategy) gzFile file; int level; int strategy; { gz_statep state; z_streamp strm; /* get internal structure */ if (file == NULL) return Z_STREAM_ERROR; state = (gz_statep)file; strm = &(state->strm); /* check that we're writing and that there's no error */ if (state->mode != GZ_WRITE || state->err != Z_OK) return Z_STREAM_ERROR; /* if no change is requested, then do nothing */ if (level == state->level && strategy == state->strategy) return Z_OK; /* check for seek request */ if (state->seek) { state->seek = 0; if (gz_zero(state, state->skip) == -1) return -1; } /* change compression parameters for subsequent input */ if (state->size) { /* flush previous input with previous parameters before changing */ if (strm->avail_in && gz_comp(state, Z_PARTIAL_FLUSH) == -1) return state->err; deflateParams(strm, level, strategy); } state->level = level; state->strategy = strategy; return Z_OK; } /* -- see zlib.h -- */ int ZEXPORT gzclose_w(file) gzFile file; { int ret = 0; gz_statep state; /* get internal structure */ if (file == NULL) return Z_STREAM_ERROR; state = (gz_statep)file; /* check that we're writing */ if (state->mode != GZ_WRITE) return Z_STREAM_ERROR; /* check for seek request */ if (state->seek) { state->seek = 0; ret += gz_zero(state, state->skip); } /* flush, free memory, and close file */ ret += gz_comp(state, Z_FINISH); (void)deflateEnd(&(state->strm)); free(state->out); free(state->in); gz_error(state, Z_OK, NULL); free(state->path); ret += close(state->fd); free(state); return ret ? Z_ERRNO : Z_OK; } glpk-5.0/src/zlib/inffast.c0000644000062000006210000003217713766346220015041 0ustar maomkpasswd/* inffast.c -- fast decoding * Copyright (C) 1995-2008, 2010 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ #include "zutil.h" #include "inftrees.h" #include "inflate.h" #include "inffast.h" #ifndef ASMINF /* Allow machine dependent optimization for post-increment or pre-increment. Based on testing to date, Pre-increment preferred for: - PowerPC G3 (Adler) - MIPS R5000 (Randers-Pehrson) Post-increment preferred for: - none No measurable difference: - Pentium III (Anderson) - M68060 (Nikl) */ #ifdef POSTINC # define OFF 0 # define PUP(a) *(a)++ #else # define OFF 1 # define PUP(a) *++(a) #endif /* Decode literal, length, and distance codes and write out the resulting literal and match bytes until either not enough input or output is available, an end-of-block is encountered, or a data error is encountered. When large enough input and output buffers are supplied to inflate(), for example, a 16K input buffer and a 64K output buffer, more than 95% of the inflate execution time is spent in this routine. Entry assumptions: state->mode == LEN strm->avail_in >= 6 strm->avail_out >= 258 start >= strm->avail_out state->bits < 8 On return, state->mode is one of: LEN -- ran out of enough output space or enough available input TYPE -- reached end of block code, inflate() to interpret next block BAD -- error in block data Notes: - The maximum input bits used by a length/distance pair is 15 bits for the length code, 5 bits for the length extra, 15 bits for the distance code, and 13 bits for the distance extra. This totals 48 bits, or six bytes. Therefore if strm->avail_in >= 6, then there is enough input to avoid checking for available input while decoding. - The maximum bytes that a single length/distance pair can output is 258 bytes, which is the maximum length that can be coded. inflate_fast() requires strm->avail_out >= 258 for each loop to avoid checking for output space. */ void ZLIB_INTERNAL inflate_fast(strm, start) z_streamp strm; unsigned start; /* inflate()'s starting value for strm->avail_out */ { struct inflate_state FAR *state; unsigned char FAR *in; /* local strm->next_in */ unsigned char FAR *last; /* while in < last, enough input available */ unsigned char FAR *out; /* local strm->next_out */ unsigned char FAR *beg; /* inflate()'s initial strm->next_out */ unsigned char FAR *end; /* while out < end, enough space available */ #ifdef INFLATE_STRICT unsigned dmax; /* maximum distance from zlib header */ #endif unsigned wsize; /* window size or zero if not using window */ unsigned whave; /* valid bytes in the window */ unsigned wnext; /* window write index */ unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */ unsigned long hold; /* local strm->hold */ unsigned bits; /* local strm->bits */ code const FAR *lcode; /* local strm->lencode */ code const FAR *dcode; /* local strm->distcode */ unsigned lmask; /* mask for first level of length codes */ unsigned dmask; /* mask for first level of distance codes */ code here; /* retrieved table entry */ unsigned op; /* code bits, operation, extra bits, or */ /* window position, window bytes to copy */ unsigned len; /* match length, unused bytes */ unsigned dist; /* match distance */ unsigned char FAR *from; /* where to copy match from */ /* copy state to local variables */ state = (struct inflate_state FAR *)strm->state; in = strm->next_in - OFF; last = in + (strm->avail_in - 5); out = strm->next_out - OFF; beg = out - (start - strm->avail_out); end = out + (strm->avail_out - 257); #ifdef INFLATE_STRICT dmax = state->dmax; #endif wsize = state->wsize; whave = state->whave; wnext = state->wnext; window = state->window; hold = state->hold; bits = state->bits; lcode = state->lencode; dcode = state->distcode; lmask = (1U << state->lenbits) - 1; dmask = (1U << state->distbits) - 1; /* decode literals and length/distances until end-of-block or not enough input data or output space */ do { if (bits < 15) { hold += (unsigned long)(PUP(in)) << bits; bits += 8; hold += (unsigned long)(PUP(in)) << bits; bits += 8; } here = lcode[hold & lmask]; dolen: op = (unsigned)(here.bits); hold >>= op; bits -= op; op = (unsigned)(here.op); if (op == 0) { /* literal */ Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? "inflate: literal '%c'\n" : "inflate: literal 0x%02x\n", here.val)); PUP(out) = (unsigned char)(here.val); } else if (op & 16) { /* length base */ len = (unsigned)(here.val); op &= 15; /* number of extra bits */ if (op) { if (bits < op) { hold += (unsigned long)(PUP(in)) << bits; bits += 8; } len += (unsigned)hold & ((1U << op) - 1); hold >>= op; bits -= op; } Tracevv((stderr, "inflate: length %u\n", len)); if (bits < 15) { hold += (unsigned long)(PUP(in)) << bits; bits += 8; hold += (unsigned long)(PUP(in)) << bits; bits += 8; } here = dcode[hold & dmask]; dodist: op = (unsigned)(here.bits); hold >>= op; bits -= op; op = (unsigned)(here.op); if (op & 16) { /* distance base */ dist = (unsigned)(here.val); op &= 15; /* number of extra bits */ if (bits < op) { hold += (unsigned long)(PUP(in)) << bits; bits += 8; if (bits < op) { hold += (unsigned long)(PUP(in)) << bits; bits += 8; } } dist += (unsigned)hold & ((1U << op) - 1); #ifdef INFLATE_STRICT if (dist > dmax) { strm->msg = (char *)"invalid distance too far back"; state->mode = BAD; break; } #endif hold >>= op; bits -= op; Tracevv((stderr, "inflate: distance %u\n", dist)); op = (unsigned)(out - beg); /* max distance in output */ if (dist > op) { /* see if copy from window */ op = dist - op; /* distance back in window */ if (op > whave) { if (state->sane) { strm->msg = (char *)"invalid distance too far back"; state->mode = BAD; break; } #ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR if (len <= op - whave) { do { PUP(out) = 0; } while (--len); continue; } len -= op - whave; do { PUP(out) = 0; } while (--op > whave); if (op == 0) { from = out - dist; do { PUP(out) = PUP(from); } while (--len); continue; } #endif } from = window - OFF; if (wnext == 0) { /* very common case */ from += wsize - op; if (op < len) { /* some from window */ len -= op; do { PUP(out) = PUP(from); } while (--op); from = out - dist; /* rest from output */ } } else if (wnext < op) { /* wrap around window */ from += wsize + wnext - op; op -= wnext; if (op < len) { /* some from end of window */ len -= op; do { PUP(out) = PUP(from); } while (--op); from = window - OFF; if (wnext < len) { /* some from start of window */ op = wnext; len -= op; do { PUP(out) = PUP(from); } while (--op); from = out - dist; /* rest from output */ } } } else { /* contiguous in window */ from += wnext - op; if (op < len) { /* some from window */ len -= op; do { PUP(out) = PUP(from); } while (--op); from = out - dist; /* rest from output */ } } while (len > 2) { PUP(out) = PUP(from); PUP(out) = PUP(from); PUP(out) = PUP(from); len -= 3; } if (len) { PUP(out) = PUP(from); if (len > 1) PUP(out) = PUP(from); } } else { from = out - dist; /* copy direct from output */ do { /* minimum length is three */ PUP(out) = PUP(from); PUP(out) = PUP(from); PUP(out) = PUP(from); len -= 3; } while (len > 2); if (len) { PUP(out) = PUP(from); if (len > 1) PUP(out) = PUP(from); } } } else if ((op & 64) == 0) { /* 2nd level distance code */ here = dcode[here.val + (hold & ((1U << op) - 1))]; goto dodist; } else { strm->msg = (char *)"invalid distance code"; state->mode = BAD; break; } } else if ((op & 64) == 0) { /* 2nd level length code */ here = lcode[here.val + (hold & ((1U << op) - 1))]; goto dolen; } else if (op & 32) { /* end-of-block */ Tracevv((stderr, "inflate: end of block\n")); state->mode = TYPE; break; } else { strm->msg = (char *)"invalid literal/length code"; state->mode = BAD; break; } } while (in < last && out < end); /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ len = bits >> 3; in -= len; bits -= len << 3; hold &= (1U << bits) - 1; /* update state and return */ strm->next_in = in + OFF; strm->next_out = out + OFF; strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last)); strm->avail_out = (unsigned)(out < end ? 257 + (end - out) : 257 - (out - end)); state->hold = hold; state->bits = bits; return; } /* inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe): - Using bit fields for code structure - Different op definition to avoid & for extra bits (do & for table bits) - Three separate decoding do-loops for direct, window, and wnext == 0 - Special case for distance > 1 copies to do overlapped load and store copy - Explicit branch predictions (based on measured branch probabilities) - Deferring match copy and interspersed it with decoding subsequent codes - Swapping literal/length else - Swapping window/direct else - Larger unrolled copy loops (three is about right) - Moving len -= 3 statement into middle of loop */ #endif /* !ASMINF */ glpk-5.0/src/zlib/inffast.h0000644000062000006210000000065313766346220015040 0ustar maomkpasswd/* inffast.h -- header to use inffast.c * Copyright (C) 1995-2003, 2010 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ void ZLIB_INTERNAL inflate_fast OF((z_streamp strm, unsigned start)); glpk-5.0/src/zlib/inffixed.h0000644000062000006210000001430713766346220015203 0ustar maomkpasswd /* inffixed.h -- table for decoding fixed codes * Generated automatically by makefixed(). */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ static const code lenfix[512] = { {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48}, {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128}, {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59}, {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176}, {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20}, {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100}, {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8}, {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216}, {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76}, {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114}, {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2}, {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148}, {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42}, {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86}, {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15}, {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236}, {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62}, {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142}, {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31}, {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162}, {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25}, {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105}, {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4}, {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202}, {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69}, {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125}, {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13}, {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195}, {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35}, {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91}, {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19}, {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246}, {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55}, {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135}, {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99}, {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190}, {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16}, {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96}, {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6}, {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209}, {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72}, {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116}, {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4}, {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153}, {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44}, {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82}, {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11}, {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229}, {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58}, {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138}, {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51}, {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173}, {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30}, {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110}, {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0}, {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195}, {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65}, {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121}, {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9}, {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258}, {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37}, {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93}, {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23}, {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251}, {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51}, {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131}, {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67}, {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183}, {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23}, {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103}, {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9}, {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223}, {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79}, {0,9,255} }; static const code distfix[32] = { {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025}, {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193}, {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385}, {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577}, {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073}, {22,5,193},{64,5,0} }; glpk-5.0/src/zlib/inflate.c0000644000062000006210000014661713766346220015036 0ustar maomkpasswd/* inflate.c -- zlib decompression * Copyright (C) 1995-2010 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* * Change history: * * 1.2.beta0 24 Nov 2002 * - First version -- complete rewrite of inflate to simplify code, avoid * creation of window when not needed, minimize use of window when it is * needed, make inffast.c even faster, implement gzip decoding, and to * improve code readability and style over the previous zlib inflate code * * 1.2.beta1 25 Nov 2002 * - Use pointers for available input and output checking in inffast.c * - Remove input and output counters in inffast.c * - Change inffast.c entry and loop from avail_in >= 7 to >= 6 * - Remove unnecessary second byte pull from length extra in inffast.c * - Unroll direct copy to three copies per loop in inffast.c * * 1.2.beta2 4 Dec 2002 * - Change external routine names to reduce potential conflicts * - Correct filename to inffixed.h for fixed tables in inflate.c * - Make hbuf[] unsigned char to match parameter type in inflate.c * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset) * to avoid negation problem on Alphas (64 bit) in inflate.c * * 1.2.beta3 22 Dec 2002 * - Add comments on state->bits assertion in inffast.c * - Add comments on op field in inftrees.h * - Fix bug in reuse of allocated window after inflateReset() * - Remove bit fields--back to byte structure for speed * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths * - Change post-increments to pre-increments in inflate_fast(), PPC biased? * - Add compile time option, POSTINC, to use post-increments instead (Intel?) * - Make MATCH copy in inflate() much faster for when inflate_fast() not used * - Use local copies of stream next and avail values, as well as local bit * buffer and bit count in inflate()--for speed when inflate_fast() not used * * 1.2.beta4 1 Jan 2003 * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings * - Move a comment on output buffer sizes from inffast.c to inflate.c * - Add comments in inffast.c to introduce the inflate_fast() routine * - Rearrange window copies in inflate_fast() for speed and simplification * - Unroll last copy for window match in inflate_fast() * - Use local copies of window variables in inflate_fast() for speed * - Pull out common wnext == 0 case for speed in inflate_fast() * - Make op and len in inflate_fast() unsigned for consistency * - Add FAR to lcode and dcode declarations in inflate_fast() * - Simplified bad distance check in inflate_fast() * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new * source file infback.c to provide a call-back interface to inflate for * programs like gzip and unzip -- uses window as output buffer to avoid * window copying * * 1.2.beta5 1 Jan 2003 * - Improved inflateBack() interface to allow the caller to provide initial * input in strm. * - Fixed stored blocks bug in inflateBack() * * 1.2.beta6 4 Jan 2003 * - Added comments in inffast.c on effectiveness of POSTINC * - Typecasting all around to reduce compiler warnings * - Changed loops from while (1) or do {} while (1) to for (;;), again to * make compilers happy * - Changed type of window in inflateBackInit() to unsigned char * * * 1.2.beta7 27 Jan 2003 * - Changed many types to unsigned or unsigned short to avoid warnings * - Added inflateCopy() function * * 1.2.0 9 Mar 2003 * - Changed inflateBack() interface to provide separate opaque descriptors * for the in() and out() functions * - Changed inflateBack() argument and in_func typedef to swap the length * and buffer address return values for the input function * - Check next_in and next_out for Z_NULL on entry to inflate() * * The history for versions after 1.2.0 are in ChangeLog in zlib distribution. */ #include "zutil.h" #include "inftrees.h" #include "inflate.h" #include "inffast.h" #ifdef MAKEFIXED # ifndef BUILDFIXED # define BUILDFIXED # endif #endif /* function prototypes */ local void fixedtables OF((struct inflate_state FAR *state)); local int updatewindow OF((z_streamp strm, unsigned out)); #ifdef BUILDFIXED void makefixed OF((void)); #endif local unsigned syncsearch OF((unsigned FAR *have, unsigned char FAR *buf, unsigned len)); int ZEXPORT inflateReset(strm) z_streamp strm; { struct inflate_state FAR *state; if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; strm->total_in = strm->total_out = state->total = 0; strm->msg = Z_NULL; strm->adler = 1; /* to support ill-conceived Java test suite */ state->mode = HEAD; state->last = 0; state->havedict = 0; state->dmax = 32768U; state->head = Z_NULL; state->wsize = 0; state->whave = 0; state->wnext = 0; state->hold = 0; state->bits = 0; state->lencode = state->distcode = state->next = state->codes; state->sane = 1; state->back = -1; Tracev((stderr, "inflate: reset\n")); return Z_OK; } int ZEXPORT inflateReset2(strm, windowBits) z_streamp strm; int windowBits; { int wrap; struct inflate_state FAR *state; /* get the state */ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; /* extract wrap request from windowBits parameter */ if (windowBits < 0) { wrap = 0; windowBits = -windowBits; } else { wrap = (windowBits >> 4) + 1; #ifdef GUNZIP if (windowBits < 48) windowBits &= 15; #endif } /* set number of window bits, free window if different */ if (windowBits && (windowBits < 8 || windowBits > 15)) return Z_STREAM_ERROR; if (state->window != Z_NULL && state->wbits != (unsigned)windowBits) { ZFREE(strm, state->window); state->window = Z_NULL; } /* update state and reset the rest of it */ state->wrap = wrap; state->wbits = (unsigned)windowBits; return inflateReset(strm); } int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size) z_streamp strm; int windowBits; const char *version; int stream_size; { int ret; struct inflate_state FAR *state; if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || stream_size != (int)(sizeof(z_stream))) return Z_VERSION_ERROR; if (strm == Z_NULL) return Z_STREAM_ERROR; strm->msg = Z_NULL; /* in case we return an error */ if (strm->zalloc == (alloc_func)0) { strm->zalloc = zcalloc; strm->opaque = (voidpf)0; } if (strm->zfree == (free_func)0) strm->zfree = zcfree; state = (struct inflate_state FAR *) ZALLOC(strm, 1, sizeof(struct inflate_state)); if (state == Z_NULL) return Z_MEM_ERROR; Tracev((stderr, "inflate: allocated\n")); strm->state = (struct internal_state FAR *)state; state->window = Z_NULL; ret = inflateReset2(strm, windowBits); if (ret != Z_OK) { ZFREE(strm, state); strm->state = Z_NULL; } return ret; } int ZEXPORT inflateInit_(strm, version, stream_size) z_streamp strm; const char *version; int stream_size; { return inflateInit2_(strm, DEF_WBITS, version, stream_size); } int ZEXPORT inflatePrime(strm, bits, value) z_streamp strm; int bits; int value; { struct inflate_state FAR *state; if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if (bits < 0) { state->hold = 0; state->bits = 0; return Z_OK; } if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR; value &= (1L << bits) - 1; state->hold += value << state->bits; state->bits += bits; return Z_OK; } /* Return state with length and distance decoding tables and index sizes set to fixed code decoding. Normally this returns fixed tables from inffixed.h. If BUILDFIXED is defined, then instead this routine builds the tables the first time it's called, and returns those tables the first time and thereafter. This reduces the size of the code by about 2K bytes, in exchange for a little execution time. However, BUILDFIXED should not be used for threaded applications, since the rewriting of the tables and virgin may not be thread-safe. */ local void fixedtables(state) struct inflate_state FAR *state; { #ifdef BUILDFIXED static int virgin = 1; static code *lenfix, *distfix; static code fixed[544]; /* build fixed huffman tables if first call (may not be thread safe) */ if (virgin) { unsigned sym, bits; static code *next; /* literal/length table */ sym = 0; while (sym < 144) state->lens[sym++] = 8; while (sym < 256) state->lens[sym++] = 9; while (sym < 280) state->lens[sym++] = 7; while (sym < 288) state->lens[sym++] = 8; next = fixed; lenfix = next; bits = 9; inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); /* distance table */ sym = 0; while (sym < 32) state->lens[sym++] = 5; distfix = next; bits = 5; inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); /* do this just once */ virgin = 0; } #else /* !BUILDFIXED */ # include "inffixed.h" #endif /* BUILDFIXED */ state->lencode = lenfix; state->lenbits = 9; state->distcode = distfix; state->distbits = 5; } #ifdef MAKEFIXED #include /* Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also defines BUILDFIXED, so the tables are built on the fly. makefixed() writes those tables to stdout, which would be piped to inffixed.h. A small program can simply call makefixed to do this: void makefixed(void); int main(void) { makefixed(); return 0; } Then that can be linked with zlib built with MAKEFIXED defined and run: a.out > inffixed.h */ void makefixed() { unsigned low, size; struct inflate_state state; fixedtables(&state); puts(" /* inffixed.h -- table for decoding fixed codes"); puts(" * Generated automatically by makefixed()."); puts(" */"); puts(""); puts(" /* WARNING: this file should *not* be used by applications."); puts(" It is part of the implementation of this library and is"); puts(" subject to change. Applications should only use zlib.h."); puts(" */"); puts(""); size = 1U << 9; printf(" static const code lenfix[%u] = {", size); low = 0; for (;;) { if ((low % 7) == 0) printf("\n "); printf("{%u,%u,%d}", state.lencode[low].op, state.lencode[low].bits, state.lencode[low].val); if (++low == size) break; putchar(','); } puts("\n };"); size = 1U << 5; printf("\n static const code distfix[%u] = {", size); low = 0; for (;;) { if ((low % 6) == 0) printf("\n "); printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits, state.distcode[low].val); if (++low == size) break; putchar(','); } puts("\n };"); } #endif /* MAKEFIXED */ /* Update the window with the last wsize (normally 32K) bytes written before returning. If window does not exist yet, create it. This is only called when a window is already in use, or when output has been written during this inflate call, but the end of the deflate stream has not been reached yet. It is also called to create a window for dictionary data when a dictionary is loaded. Providing output buffers larger than 32K to inflate() should provide a speed advantage, since only the last 32K of output is copied to the sliding window upon return from inflate(), and since all distances after the first 32K of output will fall in the output data, making match copies simpler and faster. The advantage may be dependent on the size of the processor's data caches. */ local int updatewindow(strm, out) z_streamp strm; unsigned out; { struct inflate_state FAR *state; unsigned copy, dist; state = (struct inflate_state FAR *)strm->state; /* if it hasn't been done already, allocate space for the window */ if (state->window == Z_NULL) { state->window = (unsigned char FAR *) ZALLOC(strm, 1U << state->wbits, sizeof(unsigned char)); if (state->window == Z_NULL) return 1; } /* if window not in use yet, initialize */ if (state->wsize == 0) { state->wsize = 1U << state->wbits; state->wnext = 0; state->whave = 0; } /* copy state->wsize or less output bytes into the circular window */ copy = out - strm->avail_out; if (copy >= state->wsize) { zmemcpy(state->window, strm->next_out - state->wsize, state->wsize); state->wnext = 0; state->whave = state->wsize; } else { dist = state->wsize - state->wnext; if (dist > copy) dist = copy; zmemcpy(state->window + state->wnext, strm->next_out - copy, dist); copy -= dist; if (copy) { zmemcpy(state->window, strm->next_out - copy, copy); state->wnext = copy; state->whave = state->wsize; } else { state->wnext += dist; if (state->wnext == state->wsize) state->wnext = 0; if (state->whave < state->wsize) state->whave += dist; } } return 0; } /* Macros for inflate(): */ /* check function to use adler32() for zlib or crc32() for gzip */ #ifdef GUNZIP # define UPDATE(check, buf, len) \ (state->flags ? crc32(check, buf, len) : adler32(check, buf, len)) #else # define UPDATE(check, buf, len) adler32(check, buf, len) #endif /* check macros for header crc */ #ifdef GUNZIP # define CRC2(check, word) \ do { \ hbuf[0] = (unsigned char)(word); \ hbuf[1] = (unsigned char)((word) >> 8); \ check = crc32(check, hbuf, 2); \ } while (0) # define CRC4(check, word) \ do { \ hbuf[0] = (unsigned char)(word); \ hbuf[1] = (unsigned char)((word) >> 8); \ hbuf[2] = (unsigned char)((word) >> 16); \ hbuf[3] = (unsigned char)((word) >> 24); \ check = crc32(check, hbuf, 4); \ } while (0) #endif /* Load registers with state in inflate() for speed */ #define LOAD() \ do { \ put = strm->next_out; \ left = strm->avail_out; \ next = strm->next_in; \ have = strm->avail_in; \ hold = state->hold; \ bits = state->bits; \ } while (0) /* Restore state from registers in inflate() */ #define RESTORE() \ do { \ strm->next_out = put; \ strm->avail_out = left; \ strm->next_in = next; \ strm->avail_in = have; \ state->hold = hold; \ state->bits = bits; \ } while (0) /* Clear the input bit accumulator */ #define INITBITS() \ do { \ hold = 0; \ bits = 0; \ } while (0) /* Get a byte of input into the bit accumulator, or return from inflate() if there is no input available. */ #define PULLBYTE() \ do { \ if (have == 0) goto inf_leave; \ have--; \ hold += (unsigned long)(*next++) << bits; \ bits += 8; \ } while (0) /* Assure that there are at least n bits in the bit accumulator. If there is not enough available input to do that, then return from inflate(). */ #define NEEDBITS(n) \ do { \ while (bits < (unsigned)(n)) \ PULLBYTE(); \ } while (0) /* Return the low n bits of the bit accumulator (n < 16) */ #define BITS(n) \ ((unsigned)hold & ((1U << (n)) - 1)) /* Remove n bits from the bit accumulator */ #define DROPBITS(n) \ do { \ hold >>= (n); \ bits -= (unsigned)(n); \ } while (0) /* Remove zero to seven bits as needed to go to a byte boundary */ #define BYTEBITS() \ do { \ hold >>= bits & 7; \ bits -= bits & 7; \ } while (0) /* Reverse the bytes in a 32-bit value */ #define REVERSE(q) \ ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) /* inflate() uses a state machine to process as much input data and generate as much output data as possible before returning. The state machine is structured roughly as follows: for (;;) switch (state) { ... case STATEn: if (not enough input data or output space to make progress) return; ... make progress ... state = STATEm; break; ... } so when inflate() is called again, the same case is attempted again, and if the appropriate resources are provided, the machine proceeds to the next state. The NEEDBITS() macro is usually the way the state evaluates whether it can proceed or should return. NEEDBITS() does the return if the requested bits are not available. The typical use of the BITS macros is: NEEDBITS(n); ... do something with BITS(n) ... DROPBITS(n); where NEEDBITS(n) either returns from inflate() if there isn't enough input left to load n bits into the accumulator, or it continues. BITS(n) gives the low n bits in the accumulator. When done, DROPBITS(n) drops the low n bits off the accumulator. INITBITS() clears the accumulator and sets the number of available bits to zero. BYTEBITS() discards just enough bits to put the accumulator on a byte boundary. After BYTEBITS() and a NEEDBITS(8), then BITS(8) would return the next byte in the stream. NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return if there is no input available. The decoding of variable length codes uses PULLBYTE() directly in order to pull just enough bytes to decode the next code, and no more. Some states loop until they get enough input, making sure that enough state information is maintained to continue the loop where it left off if NEEDBITS() returns in the loop. For example, want, need, and keep would all have to actually be part of the saved state in case NEEDBITS() returns: case STATEw: while (want < need) { NEEDBITS(n); keep[want++] = BITS(n); DROPBITS(n); } state = STATEx; case STATEx: As shown above, if the next state is also the next case, then the break is omitted. A state may also return if there is not enough output space available to complete that state. Those states are copying stored data, writing a literal byte, and copying a matching string. When returning, a "goto inf_leave" is used to update the total counters, update the check value, and determine whether any progress has been made during that inflate() call in order to return the proper return code. Progress is defined as a change in either strm->avail_in or strm->avail_out. When there is a window, goto inf_leave will update the window with the last output written. If a goto inf_leave occurs in the middle of decompression and there is no window currently, goto inf_leave will create one and copy output to the window for the next call of inflate(). In this implementation, the flush parameter of inflate() only affects the return code (per zlib.h). inflate() always writes as much as possible to strm->next_out, given the space available and the provided input--the effect documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers the allocation of and copying into a sliding window until necessary, which provides the effect documented in zlib.h for Z_FINISH when the entire input stream available. So the only thing the flush parameter actually does is: when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it will return Z_BUF_ERROR if it has not reached the end of the stream. */ int ZEXPORT inflate(strm, flush) z_streamp strm; int flush; { struct inflate_state FAR *state; unsigned char FAR *next; /* next input */ unsigned char FAR *put; /* next output */ unsigned have, left; /* available input and output */ unsigned long hold; /* bit buffer */ unsigned bits; /* bits in bit buffer */ unsigned in, out; /* save starting available input and output */ unsigned copy; /* number of stored or match bytes to copy */ unsigned char FAR *from; /* where to copy match bytes from */ code here; /* current decoding table entry */ code last; /* parent table entry */ unsigned len; /* length to copy for repeats, bits to drop */ int ret; /* return code */ #ifdef GUNZIP unsigned char hbuf[4]; /* buffer for gzip header crc calculation */ #endif static const unsigned short order[19] = /* permutation of code lengths */ {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; if (strm == Z_NULL || strm->state == Z_NULL || strm->next_out == Z_NULL || (strm->next_in == Z_NULL && strm->avail_in != 0)) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */ LOAD(); in = have; out = left; ret = Z_OK; for (;;) switch (state->mode) { case HEAD: if (state->wrap == 0) { state->mode = TYPEDO; break; } NEEDBITS(16); #ifdef GUNZIP if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */ state->check = crc32(0L, Z_NULL, 0); CRC2(state->check, hold); INITBITS(); state->mode = FLAGS; break; } state->flags = 0; /* expect zlib header */ if (state->head != Z_NULL) state->head->done = -1; if (!(state->wrap & 1) || /* check if zlib header allowed */ #else if ( #endif ((BITS(8) << 8) + (hold >> 8)) % 31) { strm->msg = (char *)"incorrect header check"; state->mode = BAD; break; } if (BITS(4) != Z_DEFLATED) { strm->msg = (char *)"unknown compression method"; state->mode = BAD; break; } DROPBITS(4); len = BITS(4) + 8; if (state->wbits == 0) state->wbits = len; else if (len > state->wbits) { strm->msg = (char *)"invalid window size"; state->mode = BAD; break; } state->dmax = 1U << len; Tracev((stderr, "inflate: zlib header ok\n")); strm->adler = state->check = adler32(0L, Z_NULL, 0); state->mode = hold & 0x200 ? DICTID : TYPE; INITBITS(); break; #ifdef GUNZIP case FLAGS: NEEDBITS(16); state->flags = (int)(hold); if ((state->flags & 0xff) != Z_DEFLATED) { strm->msg = (char *)"unknown compression method"; state->mode = BAD; break; } if (state->flags & 0xe000) { strm->msg = (char *)"unknown header flags set"; state->mode = BAD; break; } if (state->head != Z_NULL) state->head->text = (int)((hold >> 8) & 1); if (state->flags & 0x0200) CRC2(state->check, hold); INITBITS(); state->mode = TIME; case TIME: NEEDBITS(32); if (state->head != Z_NULL) state->head->time = hold; if (state->flags & 0x0200) CRC4(state->check, hold); INITBITS(); state->mode = OS; case OS: NEEDBITS(16); if (state->head != Z_NULL) { state->head->xflags = (int)(hold & 0xff); state->head->os = (int)(hold >> 8); } if (state->flags & 0x0200) CRC2(state->check, hold); INITBITS(); state->mode = EXLEN; case EXLEN: if (state->flags & 0x0400) { NEEDBITS(16); state->length = (unsigned)(hold); if (state->head != Z_NULL) state->head->extra_len = (unsigned)hold; if (state->flags & 0x0200) CRC2(state->check, hold); INITBITS(); } else if (state->head != Z_NULL) state->head->extra = Z_NULL; state->mode = EXTRA; case EXTRA: if (state->flags & 0x0400) { copy = state->length; if (copy > have) copy = have; if (copy) { if (state->head != Z_NULL && state->head->extra != Z_NULL) { len = state->head->extra_len - state->length; zmemcpy(state->head->extra + len, next, len + copy > state->head->extra_max ? state->head->extra_max - len : copy); } if (state->flags & 0x0200) state->check = crc32(state->check, next, copy); have -= copy; next += copy; state->length -= copy; } if (state->length) goto inf_leave; } state->length = 0; state->mode = NAME; case NAME: if (state->flags & 0x0800) { if (have == 0) goto inf_leave; copy = 0; do { len = (unsigned)(next[copy++]); if (state->head != Z_NULL && state->head->name != Z_NULL && state->length < state->head->name_max) state->head->name[state->length++] = len; } while (len && copy < have); if (state->flags & 0x0200) state->check = crc32(state->check, next, copy); have -= copy; next += copy; if (len) goto inf_leave; } else if (state->head != Z_NULL) state->head->name = Z_NULL; state->length = 0; state->mode = COMMENT; case COMMENT: if (state->flags & 0x1000) { if (have == 0) goto inf_leave; copy = 0; do { len = (unsigned)(next[copy++]); if (state->head != Z_NULL && state->head->comment != Z_NULL && state->length < state->head->comm_max) state->head->comment[state->length++] = len; } while (len && copy < have); if (state->flags & 0x0200) state->check = crc32(state->check, next, copy); have -= copy; next += copy; if (len) goto inf_leave; } else if (state->head != Z_NULL) state->head->comment = Z_NULL; state->mode = HCRC; case HCRC: if (state->flags & 0x0200) { NEEDBITS(16); if (hold != (state->check & 0xffff)) { strm->msg = (char *)"header crc mismatch"; state->mode = BAD; break; } INITBITS(); } if (state->head != Z_NULL) { state->head->hcrc = (int)((state->flags >> 9) & 1); state->head->done = 1; } strm->adler = state->check = crc32(0L, Z_NULL, 0); state->mode = TYPE; break; #endif case DICTID: NEEDBITS(32); strm->adler = state->check = REVERSE(hold); INITBITS(); state->mode = DICT; case DICT: if (state->havedict == 0) { RESTORE(); return Z_NEED_DICT; } strm->adler = state->check = adler32(0L, Z_NULL, 0); state->mode = TYPE; case TYPE: if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave; case TYPEDO: if (state->last) { BYTEBITS(); state->mode = CHECK; break; } NEEDBITS(3); state->last = BITS(1); DROPBITS(1); switch (BITS(2)) { case 0: /* stored block */ Tracev((stderr, "inflate: stored block%s\n", state->last ? " (last)" : "")); state->mode = STORED; break; case 1: /* fixed block */ fixedtables(state); Tracev((stderr, "inflate: fixed codes block%s\n", state->last ? " (last)" : "")); state->mode = LEN_; /* decode codes */ if (flush == Z_TREES) { DROPBITS(2); goto inf_leave; } break; case 2: /* dynamic block */ Tracev((stderr, "inflate: dynamic codes block%s\n", state->last ? " (last)" : "")); state->mode = TABLE; break; case 3: strm->msg = (char *)"invalid block type"; state->mode = BAD; } DROPBITS(2); break; case STORED: BYTEBITS(); /* go to byte boundary */ NEEDBITS(32); if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { strm->msg = (char *)"invalid stored block lengths"; state->mode = BAD; break; } state->length = (unsigned)hold & 0xffff; Tracev((stderr, "inflate: stored length %u\n", state->length)); INITBITS(); state->mode = COPY_; if (flush == Z_TREES) goto inf_leave; case COPY_: state->mode = COPY; case COPY: copy = state->length; if (copy) { if (copy > have) copy = have; if (copy > left) copy = left; if (copy == 0) goto inf_leave; zmemcpy(put, next, copy); have -= copy; next += copy; left -= copy; put += copy; state->length -= copy; break; } Tracev((stderr, "inflate: stored end\n")); state->mode = TYPE; break; case TABLE: NEEDBITS(14); state->nlen = BITS(5) + 257; DROPBITS(5); state->ndist = BITS(5) + 1; DROPBITS(5); state->ncode = BITS(4) + 4; DROPBITS(4); #ifndef PKZIP_BUG_WORKAROUND if (state->nlen > 286 || state->ndist > 30) { strm->msg = (char *)"too many length or distance symbols"; state->mode = BAD; break; } #endif Tracev((stderr, "inflate: table sizes ok\n")); state->have = 0; state->mode = LENLENS; case LENLENS: while (state->have < state->ncode) { NEEDBITS(3); state->lens[order[state->have++]] = (unsigned short)BITS(3); DROPBITS(3); } while (state->have < 19) state->lens[order[state->have++]] = 0; state->next = state->codes; state->lencode = (code const FAR *)(state->next); state->lenbits = 7; ret = inflate_table(CODES, state->lens, 19, &(state->next), &(state->lenbits), state->work); if (ret) { strm->msg = (char *)"invalid code lengths set"; state->mode = BAD; break; } Tracev((stderr, "inflate: code lengths ok\n")); state->have = 0; state->mode = CODELENS; case CODELENS: while (state->have < state->nlen + state->ndist) { for (;;) { here = state->lencode[BITS(state->lenbits)]; if ((unsigned)(here.bits) <= bits) break; PULLBYTE(); } if (here.val < 16) { NEEDBITS(here.bits); DROPBITS(here.bits); state->lens[state->have++] = here.val; } else { if (here.val == 16) { NEEDBITS(here.bits + 2); DROPBITS(here.bits); if (state->have == 0) { strm->msg = (char *)"invalid bit length repeat"; state->mode = BAD; break; } len = state->lens[state->have - 1]; copy = 3 + BITS(2); DROPBITS(2); } else if (here.val == 17) { NEEDBITS(here.bits + 3); DROPBITS(here.bits); len = 0; copy = 3 + BITS(3); DROPBITS(3); } else { NEEDBITS(here.bits + 7); DROPBITS(here.bits); len = 0; copy = 11 + BITS(7); DROPBITS(7); } if (state->have + copy > state->nlen + state->ndist) { strm->msg = (char *)"invalid bit length repeat"; state->mode = BAD; break; } while (copy--) state->lens[state->have++] = (unsigned short)len; } } /* handle error breaks in while */ if (state->mode == BAD) break; /* check for end-of-block code (better have one) */ if (state->lens[256] == 0) { strm->msg = (char *)"invalid code -- missing end-of-block"; state->mode = BAD; break; } /* build code tables -- note: do not change the lenbits or distbits values here (9 and 6) without reading the comments in inftrees.h concerning the ENOUGH constants, which depend on those values */ state->next = state->codes; state->lencode = (code const FAR *)(state->next); state->lenbits = 9; ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), &(state->lenbits), state->work); if (ret) { strm->msg = (char *)"invalid literal/lengths set"; state->mode = BAD; break; } state->distcode = (code const FAR *)(state->next); state->distbits = 6; ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, &(state->next), &(state->distbits), state->work); if (ret) { strm->msg = (char *)"invalid distances set"; state->mode = BAD; break; } Tracev((stderr, "inflate: codes ok\n")); state->mode = LEN_; if (flush == Z_TREES) goto inf_leave; case LEN_: state->mode = LEN; case LEN: if (have >= 6 && left >= 258) { RESTORE(); inflate_fast(strm, out); LOAD(); if (state->mode == TYPE) state->back = -1; break; } state->back = 0; for (;;) { here = state->lencode[BITS(state->lenbits)]; if ((unsigned)(here.bits) <= bits) break; PULLBYTE(); } if (here.op && (here.op & 0xf0) == 0) { last = here; for (;;) { here = state->lencode[last.val + (BITS(last.bits + last.op) >> last.bits)]; if ((unsigned)(last.bits + here.bits) <= bits) break; PULLBYTE(); } DROPBITS(last.bits); state->back += last.bits; } DROPBITS(here.bits); state->back += here.bits; state->length = (unsigned)here.val; if ((int)(here.op) == 0) { Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? "inflate: literal '%c'\n" : "inflate: literal 0x%02x\n", here.val)); state->mode = LIT; break; } if (here.op & 32) { Tracevv((stderr, "inflate: end of block\n")); state->back = -1; state->mode = TYPE; break; } if (here.op & 64) { strm->msg = (char *)"invalid literal/length code"; state->mode = BAD; break; } state->extra = (unsigned)(here.op) & 15; state->mode = LENEXT; case LENEXT: if (state->extra) { NEEDBITS(state->extra); state->length += BITS(state->extra); DROPBITS(state->extra); state->back += state->extra; } Tracevv((stderr, "inflate: length %u\n", state->length)); state->was = state->length; state->mode = DIST; case DIST: for (;;) { here = state->distcode[BITS(state->distbits)]; if ((unsigned)(here.bits) <= bits) break; PULLBYTE(); } if ((here.op & 0xf0) == 0) { last = here; for (;;) { here = state->distcode[last.val + (BITS(last.bits + last.op) >> last.bits)]; if ((unsigned)(last.bits + here.bits) <= bits) break; PULLBYTE(); } DROPBITS(last.bits); state->back += last.bits; } DROPBITS(here.bits); state->back += here.bits; if (here.op & 64) { strm->msg = (char *)"invalid distance code"; state->mode = BAD; break; } state->offset = (unsigned)here.val; state->extra = (unsigned)(here.op) & 15; state->mode = DISTEXT; case DISTEXT: if (state->extra) { NEEDBITS(state->extra); state->offset += BITS(state->extra); DROPBITS(state->extra); state->back += state->extra; } #ifdef INFLATE_STRICT if (state->offset > state->dmax) { strm->msg = (char *)"invalid distance too far back"; state->mode = BAD; break; } #endif Tracevv((stderr, "inflate: distance %u\n", state->offset)); state->mode = MATCH; case MATCH: if (left == 0) goto inf_leave; copy = out - left; if (state->offset > copy) { /* copy from window */ copy = state->offset - copy; if (copy > state->whave) { if (state->sane) { strm->msg = (char *)"invalid distance too far back"; state->mode = BAD; break; } #ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR Trace((stderr, "inflate.c too far\n")); copy -= state->whave; if (copy > state->length) copy = state->length; if (copy > left) copy = left; left -= copy; state->length -= copy; do { *put++ = 0; } while (--copy); if (state->length == 0) state->mode = LEN; break; #endif } if (copy > state->wnext) { copy -= state->wnext; from = state->window + (state->wsize - copy); } else from = state->window + (state->wnext - copy); if (copy > state->length) copy = state->length; } else { /* copy from output */ from = put - state->offset; copy = state->length; } if (copy > left) copy = left; left -= copy; state->length -= copy; do { *put++ = *from++; } while (--copy); if (state->length == 0) state->mode = LEN; break; case LIT: if (left == 0) goto inf_leave; *put++ = (unsigned char)(state->length); left--; state->mode = LEN; break; case CHECK: if (state->wrap) { NEEDBITS(32); out -= left; strm->total_out += out; state->total += out; if (out) strm->adler = state->check = UPDATE(state->check, put - out, out); out = left; if (( #ifdef GUNZIP state->flags ? hold : #endif REVERSE(hold)) != state->check) { strm->msg = (char *)"incorrect data check"; state->mode = BAD; break; } INITBITS(); Tracev((stderr, "inflate: check matches trailer\n")); } #ifdef GUNZIP state->mode = LENGTH; case LENGTH: if (state->wrap && state->flags) { NEEDBITS(32); if (hold != (state->total & 0xffffffffUL)) { strm->msg = (char *)"incorrect length check"; state->mode = BAD; break; } INITBITS(); Tracev((stderr, "inflate: length matches trailer\n")); } #endif state->mode = DONE; case DONE: ret = Z_STREAM_END; goto inf_leave; case BAD: ret = Z_DATA_ERROR; goto inf_leave; case MEM: return Z_MEM_ERROR; case SYNC: default: return Z_STREAM_ERROR; } /* Return from inflate(), updating the total counts and the check value. If there was no progress during the inflate() call, return a buffer error. Call updatewindow() to create and/or update the window state. Note: a memory error from inflate() is non-recoverable. */ inf_leave: RESTORE(); if (state->wsize || (state->mode < CHECK && out != strm->avail_out)) if (updatewindow(strm, out)) { state->mode = MEM; return Z_MEM_ERROR; } in -= strm->avail_in; out -= strm->avail_out; strm->total_in += in; strm->total_out += out; state->total += out; if (state->wrap && out) strm->adler = state->check = UPDATE(state->check, strm->next_out - out, out); strm->data_type = state->bits + (state->last ? 64 : 0) + (state->mode == TYPE ? 128 : 0) + (state->mode == LEN_ || state->mode == COPY_ ? 256 : 0); if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) ret = Z_BUF_ERROR; return ret; } int ZEXPORT inflateEnd(strm) z_streamp strm; { struct inflate_state FAR *state; if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if (state->window != Z_NULL) ZFREE(strm, state->window); ZFREE(strm, strm->state); strm->state = Z_NULL; Tracev((stderr, "inflate: end\n")); return Z_OK; } int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength) z_streamp strm; const Bytef *dictionary; uInt dictLength; { struct inflate_state FAR *state; unsigned long id; /* check state */ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if (state->wrap != 0 && state->mode != DICT) return Z_STREAM_ERROR; /* check for correct dictionary id */ if (state->mode == DICT) { id = adler32(0L, Z_NULL, 0); id = adler32(id, dictionary, dictLength); if (id != state->check) return Z_DATA_ERROR; } /* copy dictionary to window */ if (updatewindow(strm, strm->avail_out)) { state->mode = MEM; return Z_MEM_ERROR; } if (dictLength > state->wsize) { zmemcpy(state->window, dictionary + dictLength - state->wsize, state->wsize); state->whave = state->wsize; } else { zmemcpy(state->window + state->wsize - dictLength, dictionary, dictLength); state->whave = dictLength; } state->havedict = 1; Tracev((stderr, "inflate: dictionary set\n")); return Z_OK; } int ZEXPORT inflateGetHeader(strm, head) z_streamp strm; gz_headerp head; { struct inflate_state FAR *state; /* check state */ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if ((state->wrap & 2) == 0) return Z_STREAM_ERROR; /* save header structure */ state->head = head; head->done = 0; return Z_OK; } /* Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found or when out of input. When called, *have is the number of pattern bytes found in order so far, in 0..3. On return *have is updated to the new state. If on return *have equals four, then the pattern was found and the return value is how many bytes were read including the last byte of the pattern. If *have is less than four, then the pattern has not been found yet and the return value is len. In the latter case, syncsearch() can be called again with more data and the *have state. *have is initialized to zero for the first call. */ local unsigned syncsearch(have, buf, len) unsigned FAR *have; unsigned char FAR *buf; unsigned len; { unsigned got; unsigned next; got = *have; next = 0; while (next < len && got < 4) { if ((int)(buf[next]) == (got < 2 ? 0 : 0xff)) got++; else if (buf[next]) got = 0; else got = 4 - got; next++; } *have = got; return next; } int ZEXPORT inflateSync(strm) z_streamp strm; { unsigned len; /* number of bytes to look at or looked at */ unsigned long in, out; /* temporary to save total_in and total_out */ unsigned char buf[4]; /* to restore bit buffer to byte string */ struct inflate_state FAR *state; /* check parameters */ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR; /* if first time, start search in bit buffer */ if (state->mode != SYNC) { state->mode = SYNC; state->hold <<= state->bits & 7; state->bits -= state->bits & 7; len = 0; while (state->bits >= 8) { buf[len++] = (unsigned char)(state->hold); state->hold >>= 8; state->bits -= 8; } state->have = 0; syncsearch(&(state->have), buf, len); } /* search available input */ len = syncsearch(&(state->have), strm->next_in, strm->avail_in); strm->avail_in -= len; strm->next_in += len; strm->total_in += len; /* return no joy or set up to restart inflate() on a new block */ if (state->have != 4) return Z_DATA_ERROR; in = strm->total_in; out = strm->total_out; inflateReset(strm); strm->total_in = in; strm->total_out = out; state->mode = TYPE; return Z_OK; } /* Returns true if inflate is currently at the end of a block generated by Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP implementation to provide an additional safety check. PPP uses Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored block. When decompressing, PPP checks that at the end of input packet, inflate is waiting for these length bytes. */ int ZEXPORT inflateSyncPoint(strm) z_streamp strm; { struct inflate_state FAR *state; if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; return state->mode == STORED && state->bits == 0; } int ZEXPORT inflateCopy(dest, source) z_streamp dest; z_streamp source; { struct inflate_state FAR *state; struct inflate_state FAR *copy; unsigned char FAR *window; unsigned wsize; /* check input */ if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL || source->zalloc == (alloc_func)0 || source->zfree == (free_func)0) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)source->state; /* allocate space */ copy = (struct inflate_state FAR *) ZALLOC(source, 1, sizeof(struct inflate_state)); if (copy == Z_NULL) return Z_MEM_ERROR; window = Z_NULL; if (state->window != Z_NULL) { window = (unsigned char FAR *) ZALLOC(source, 1U << state->wbits, sizeof(unsigned char)); if (window == Z_NULL) { ZFREE(source, copy); return Z_MEM_ERROR; } } /* copy state */ zmemcpy(dest, source, sizeof(z_stream)); zmemcpy(copy, state, sizeof(struct inflate_state)); if (state->lencode >= state->codes && state->lencode <= state->codes + ENOUGH - 1) { copy->lencode = copy->codes + (state->lencode - state->codes); copy->distcode = copy->codes + (state->distcode - state->codes); } copy->next = copy->codes + (state->next - state->codes); if (window != Z_NULL) { wsize = 1U << state->wbits; zmemcpy(window, state->window, wsize); } copy->window = window; dest->state = (struct internal_state FAR *)copy; return Z_OK; } int ZEXPORT inflateUndermine(strm, subvert) z_streamp strm; int subvert; { struct inflate_state FAR *state; if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; state->sane = !subvert; #ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR return Z_OK; #else state->sane = 1; return Z_DATA_ERROR; #endif } long ZEXPORT inflateMark(strm) z_streamp strm; { struct inflate_state FAR *state; if (strm == Z_NULL || strm->state == Z_NULL) return -1L << 16; state = (struct inflate_state FAR *)strm->state; return ((long)(state->back) << 16) + (state->mode == COPY ? state->length : (state->mode == MATCH ? state->was - state->length : 0)); } glpk-5.0/src/zlib/inflate.h0000644000062000006210000001437713766346220015040 0ustar maomkpasswd/* inflate.h -- internal inflate state definition * Copyright (C) 1995-2009 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ /* define NO_GZIP when compiling if you want to disable gzip header and trailer decoding by inflate(). NO_GZIP would be used to avoid linking in the crc code when it is not needed. For shared libraries, gzip decoding should be left enabled. */ #ifndef NO_GZIP # define GUNZIP #endif /* Possible inflate modes between inflate() calls */ typedef enum { HEAD, /* i: waiting for magic header */ FLAGS, /* i: waiting for method and flags (gzip) */ TIME, /* i: waiting for modification time (gzip) */ OS, /* i: waiting for extra flags and operating system (gzip) */ EXLEN, /* i: waiting for extra length (gzip) */ EXTRA, /* i: waiting for extra bytes (gzip) */ NAME, /* i: waiting for end of file name (gzip) */ COMMENT, /* i: waiting for end of comment (gzip) */ HCRC, /* i: waiting for header crc (gzip) */ DICTID, /* i: waiting for dictionary check value */ DICT, /* waiting for inflateSetDictionary() call */ TYPE, /* i: waiting for type bits, including last-flag bit */ TYPEDO, /* i: same, but skip check to exit inflate on new block */ STORED, /* i: waiting for stored size (length and complement) */ COPY_, /* i/o: same as COPY below, but only first time in */ COPY, /* i/o: waiting for input or output to copy stored block */ TABLE, /* i: waiting for dynamic block table lengths */ LENLENS, /* i: waiting for code length code lengths */ CODELENS, /* i: waiting for length/lit and distance code lengths */ LEN_, /* i: same as LEN below, but only first time in */ LEN, /* i: waiting for length/lit/eob code */ LENEXT, /* i: waiting for length extra bits */ DIST, /* i: waiting for distance code */ DISTEXT, /* i: waiting for distance extra bits */ MATCH, /* o: waiting for output space to copy string */ LIT, /* o: waiting for output space to write literal */ CHECK, /* i: waiting for 32-bit check value */ LENGTH, /* i: waiting for 32-bit length (gzip) */ DONE, /* finished check, done -- remain here until reset */ BAD, /* got a data error -- remain here until reset */ MEM, /* got an inflate() memory error -- remain here until reset */ SYNC /* looking for synchronization bytes to restart inflate() */ } inflate_mode; /* State transitions between above modes - (most modes can go to BAD or MEM on error -- not shown for clarity) Process header: HEAD -> (gzip) or (zlib) or (raw) (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME -> COMMENT -> HCRC -> TYPE (zlib) -> DICTID or TYPE DICTID -> DICT -> TYPE (raw) -> TYPEDO Read deflate blocks: TYPE -> TYPEDO -> STORED or TABLE or LEN_ or CHECK STORED -> COPY_ -> COPY -> TYPE TABLE -> LENLENS -> CODELENS -> LEN_ LEN_ -> LEN Read deflate codes in fixed or dynamic block: LEN -> LENEXT or LIT or TYPE LENEXT -> DIST -> DISTEXT -> MATCH -> LEN LIT -> LEN Process trailer: CHECK -> LENGTH -> DONE */ /* state maintained between inflate() calls. Approximately 10K bytes. */ struct inflate_state { inflate_mode mode; /* current inflate mode */ int last; /* true if processing last block */ int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ int havedict; /* true if dictionary provided */ int flags; /* gzip header method and flags (0 if zlib) */ unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */ unsigned long check; /* protected copy of check value */ unsigned long total; /* protected copy of output count */ gz_headerp head; /* where to save gzip header information */ /* sliding window */ unsigned wbits; /* log base 2 of requested window size */ unsigned wsize; /* window size or zero if not using window */ unsigned whave; /* valid bytes in the window */ unsigned wnext; /* window write index */ unsigned char FAR *window; /* allocated sliding window, if needed */ /* bit accumulator */ unsigned long hold; /* input bit accumulator */ unsigned bits; /* number of bits in "in" */ /* for string and stored block copying */ unsigned length; /* literal or length of data to copy */ unsigned offset; /* distance back to copy string from */ /* for table and code decoding */ unsigned extra; /* extra bits needed */ /* fixed and dynamic code tables */ code const FAR *lencode; /* starting table for length/literal codes */ code const FAR *distcode; /* starting table for distance codes */ unsigned lenbits; /* index bits for lencode */ unsigned distbits; /* index bits for distcode */ /* dynamic table building */ unsigned ncode; /* number of code length code lengths */ unsigned nlen; /* number of length code lengths */ unsigned ndist; /* number of distance code lengths */ unsigned have; /* number of code lengths in lens[] */ code FAR *next; /* next available space in codes[] */ unsigned short lens[320]; /* temporary storage for code lengths */ unsigned short work[288]; /* work area for code table building */ code codes[ENOUGH]; /* space for code tables */ int sane; /* if false, allow invalid distance too far */ int back; /* bits back of last unprocessed length/lit */ unsigned was; /* initial length of match */ }; glpk-5.0/src/zlib/inftrees.c0000644000062000006210000003271113766346220015220 0ustar maomkpasswd/* inftrees.c -- generate Huffman trees for efficient decoding * Copyright (C) 1995-2010 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ #include "zutil.h" #include "inftrees.h" #define MAXBITS 15 const char inflate_copyright[] = " inflate 1.2.5 Copyright 1995-2010 Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot include such an acknowledgment, I would appreciate that you keep this copyright string in the executable of your product. */ /* Build a set of tables to decode the provided canonical Huffman code. The code lengths are lens[0..codes-1]. The result starts at *table, whose indices are 0..2^bits-1. work is a writable array of at least lens shorts, which is used as a work area. type is the type of code to be generated, CODES, LENS, or DISTS. On return, zero is success, -1 is an invalid code, and +1 means that ENOUGH isn't enough. table on return points to the next available entry's address. bits is the requested root table index bits, and on return it is the actual root table index bits. It will differ if the request is greater than the longest code or if it is less than the shortest code. */ int ZLIB_INTERNAL inflate_table(type, lens, codes, table, bits, work) codetype type; unsigned short FAR *lens; unsigned codes; code FAR * FAR *table; unsigned FAR *bits; unsigned short FAR *work; { unsigned len; /* a code's length in bits */ unsigned sym; /* index of code symbols */ unsigned min, max; /* minimum and maximum code lengths */ unsigned root; /* number of index bits for root table */ unsigned curr; /* number of index bits for current table */ unsigned drop; /* code bits to drop for sub-table */ int left; /* number of prefix codes available */ unsigned used; /* code entries in table used */ unsigned huff; /* Huffman code */ unsigned incr; /* for incrementing code, index */ unsigned fill; /* index for replicating entries */ unsigned low; /* low bits for current root entry */ unsigned mask; /* mask for low root bits */ code here; /* table entry for duplication */ code FAR *next; /* next available space in table */ const unsigned short FAR *base; /* base value table to use */ const unsigned short FAR *extra; /* extra bits table to use */ int end; /* use base and extra for symbol > end */ unsigned short count[MAXBITS+1]; /* number of codes of each length */ unsigned short offs[MAXBITS+1]; /* offsets in table for each length */ static const unsigned short lbase[31] = { /* Length codes 257..285 base */ 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; static const unsigned short lext[31] = { /* Length codes 257..285 extra */ 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 73, 195}; static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 0, 0}; static const unsigned short dext[32] = { /* Distance codes 0..29 extra */ 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 64, 64}; /* Process a set of code lengths to create a canonical Huffman code. The code lengths are lens[0..codes-1]. Each length corresponds to the symbols 0..codes-1. The Huffman code is generated by first sorting the symbols by length from short to long, and retaining the symbol order for codes with equal lengths. Then the code starts with all zero bits for the first code of the shortest length, and the codes are integer increments for the same length, and zeros are appended as the length increases. For the deflate format, these bits are stored backwards from their more natural integer increment ordering, and so when the decoding tables are built in the large loop below, the integer codes are incremented backwards. This routine assumes, but does not check, that all of the entries in lens[] are in the range 0..MAXBITS. The caller must assure this. 1..MAXBITS is interpreted as that code length. zero means that that symbol does not occur in this code. The codes are sorted by computing a count of codes for each length, creating from that a table of starting indices for each length in the sorted table, and then entering the symbols in order in the sorted table. The sorted table is work[], with that space being provided by the caller. The length counts are used for other purposes as well, i.e. finding the minimum and maximum length codes, determining if there are any codes at all, checking for a valid set of lengths, and looking ahead at length counts to determine sub-table sizes when building the decoding tables. */ /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ for (len = 0; len <= MAXBITS; len++) count[len] = 0; for (sym = 0; sym < codes; sym++) count[lens[sym]]++; /* bound code lengths, force root to be within code lengths */ root = *bits; for (max = MAXBITS; max >= 1; max--) if (count[max] != 0) break; if (root > max) root = max; if (max == 0) { /* no symbols to code at all */ here.op = (unsigned char)64; /* invalid code marker */ here.bits = (unsigned char)1; here.val = (unsigned short)0; *(*table)++ = here; /* make a table to force an error */ *(*table)++ = here; *bits = 1; return 0; /* no symbols, but wait for decoding to report error */ } for (min = 1; min < max; min++) if (count[min] != 0) break; if (root < min) root = min; /* check for an over-subscribed or incomplete set of lengths */ left = 1; for (len = 1; len <= MAXBITS; len++) { left <<= 1; left -= count[len]; if (left < 0) return -1; /* over-subscribed */ } if (left > 0 && (type == CODES || max != 1)) return -1; /* incomplete set */ /* generate offsets into symbol table for each length for sorting */ offs[1] = 0; for (len = 1; len < MAXBITS; len++) offs[len + 1] = offs[len] + count[len]; /* sort symbols by length, by symbol order within each length */ for (sym = 0; sym < codes; sym++) if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym; /* Create and fill in decoding tables. In this loop, the table being filled is at next and has curr index bits. The code being used is huff with length len. That code is converted to an index by dropping drop bits off of the bottom. For codes where len is less than drop + curr, those top drop + curr - len bits are incremented through all values to fill the table with replicated entries. root is the number of index bits for the root table. When len exceeds root, sub-tables are created pointed to by the root entry with an index of the low root bits of huff. This is saved in low to check for when a new sub-table should be started. drop is zero when the root table is being filled, and drop is root when sub-tables are being filled. When a new sub-table is needed, it is necessary to look ahead in the code lengths to determine what size sub-table is needed. The length counts are used for this, and so count[] is decremented as codes are entered in the tables. used keeps track of how many table entries have been allocated from the provided *table space. It is checked for LENS and DIST tables against the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in the initial root table size constants. See the comments in inftrees.h for more information. sym increments through all symbols, and the loop terminates when all codes of length max, i.e. all codes, have been processed. This routine permits incomplete codes, so another loop after this one fills in the rest of the decoding tables with invalid code markers. */ /* set up for code type */ switch (type) { case CODES: base = extra = work; /* dummy value--not used */ end = 19; break; case LENS: base = lbase; base -= 257; extra = lext; extra -= 257; end = 256; break; default: /* DISTS */ base = dbase; extra = dext; end = -1; } /* initialize state for loop */ huff = 0; /* starting code */ sym = 0; /* starting code symbol */ len = min; /* starting code length */ next = *table; /* current table to fill in */ curr = root; /* current table index bits */ drop = 0; /* current bits to drop from code for index */ low = (unsigned)(-1); /* trigger new sub-table when len > root */ used = 1U << root; /* use root table entries */ mask = used - 1; /* mask for comparing low */ /* check available table space */ if ((type == LENS && used >= ENOUGH_LENS) || (type == DISTS && used >= ENOUGH_DISTS)) return 1; /* process all codes and make table entries */ for (;;) { /* create table entry */ here.bits = (unsigned char)(len - drop); if ((int)(work[sym]) < end) { here.op = (unsigned char)0; here.val = work[sym]; } else if ((int)(work[sym]) > end) { here.op = (unsigned char)(extra[work[sym]]); here.val = base[work[sym]]; } else { here.op = (unsigned char)(32 + 64); /* end of block */ here.val = 0; } /* replicate for those indices with low len bits equal to huff */ incr = 1U << (len - drop); fill = 1U << curr; min = fill; /* save offset to next table */ do { fill -= incr; next[(huff >> drop) + fill] = here; } while (fill != 0); /* backwards increment the len-bit code huff */ incr = 1U << (len - 1); while (huff & incr) incr >>= 1; if (incr != 0) { huff &= incr - 1; huff += incr; } else huff = 0; /* go to next symbol, update count, len */ sym++; if (--(count[len]) == 0) { if (len == max) break; len = lens[work[sym]]; } /* create new sub-table if needed */ if (len > root && (huff & mask) != low) { /* if first time, transition to sub-tables */ if (drop == 0) drop = root; /* increment past last table */ next += min; /* here min is 1 << curr */ /* determine length of next table */ curr = len - drop; left = (int)(1 << curr); while (curr + drop < max) { left -= count[curr + drop]; if (left <= 0) break; curr++; left <<= 1; } /* check for enough space */ used += 1U << curr; if ((type == LENS && used >= ENOUGH_LENS) || (type == DISTS && used >= ENOUGH_DISTS)) return 1; /* point entry in root table to sub-table */ low = huff & mask; (*table)[low].op = (unsigned char)curr; (*table)[low].bits = (unsigned char)root; (*table)[low].val = (unsigned short)(next - *table); } } /* Fill in rest of table for incomplete codes. This loop is similar to the loop above in incrementing huff for table indices. It is assumed that len is equal to curr + drop, so there is no loop needed to increment through high index bits. When the current sub-table is filled, the loop drops back to the root table to fill in any remaining entries there. */ here.op = (unsigned char)64; /* invalid code marker */ here.bits = (unsigned char)(len - drop); here.val = (unsigned short)0; while (huff != 0) { /* when done with sub-table, drop back to root table */ if (drop != 0 && (huff & mask) != low) { drop = 0; len = root; next = *table; here.bits = (unsigned char)len; } /* put invalid code marker in table */ next[huff >> drop] = here; /* backwards increment the len-bit code huff */ incr = 1U << (len - 1); while (huff & incr) incr >>= 1; if (incr != 0) { huff &= incr - 1; huff += incr; } else huff = 0; } /* set return parameters */ *table += used; *bits = root; return 0; } glpk-5.0/src/zlib/inftrees.h0000644000062000006210000000556013766346220015227 0ustar maomkpasswd/* inftrees.h -- header to use inftrees.c * Copyright (C) 1995-2005, 2010 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ /* Structure for decoding tables. Each entry provides either the information needed to do the operation requested by the code that indexed that table entry, or it provides a pointer to another table that indexes more bits of the code. op indicates whether the entry is a pointer to another table, a literal, a length or distance, an end-of-block, or an invalid code. For a table pointer, the low four bits of op is the number of index bits of that table. For a length or distance, the low four bits of op is the number of extra bits to get after the code. bits is the number of bits in this code or part of the code to drop off of the bit buffer. val is the actual byte to output in the case of a literal, the base length or distance, or the offset from the current table to the next table. Each entry is four bytes. */ typedef struct { unsigned char op; /* operation, extra bits, table bits */ unsigned char bits; /* bits in this part of the code */ unsigned short val; /* offset in table or code value */ } code; /* op values as set by inflate_table(): 00000000 - literal 0000tttt - table link, tttt != 0 is the number of table index bits 0001eeee - length or distance, eeee is the number of extra bits 01100000 - end of block 01000000 - invalid code */ /* Maximum size of the dynamic table. The maximum number of code structures is 1444, which is the sum of 852 for literal/length codes and 592 for distance codes. These values were found by exhaustive searches using the program examples/enough.c found in the zlib distribtution. The arguments to that program are the number of symbols, the initial root table size, and the maximum bit length of a code. "enough 286 9 15" for literal/length codes returns returns 852, and "enough 30 6 15" for distance codes returns 592. The initial root table size (9 or 6) is found in the fifth argument of the inflate_table() calls in inflate.c and infback.c. If the root table size is changed, then these maximum sizes would be need to be recalculated and updated. */ #define ENOUGH_LENS 852 #define ENOUGH_DISTS 592 #define ENOUGH (ENOUGH_LENS+ENOUGH_DISTS) /* Type of code to build for inflate_table() */ typedef enum { CODES, LENS, DISTS } codetype; int ZLIB_INTERNAL inflate_table OF((codetype type, unsigned short FAR *lens, unsigned codes, code FAR * FAR *table, unsigned FAR *bits, unsigned short FAR *work)); glpk-5.0/src/zlib/README0000644000062000006210000000326313766346220014115 0ustar maomkpasswdNOTE: Files in this subdirectory are NOT part of the GLPK package, but are used with GLPK. The original code was modified according to GLPK requirements by Andrew Makhorin . The following files were rewritten: gzguts.h, zconf.h, zutil.h. The following files were added: zio.h, zio.c. Other files were not changed. ************************************************************************ zlib general purpose compression library version 1.2.5, April 19th, 2010 Copyright (C) 1995-2010 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. Jean-loup Gailly Mark Adler jloup@gzip.org madler@alumni.caltech.edu The data format used by the zlib library is described by RFCs (Request for Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). glpk-5.0/src/zlib/trees.c0000644000062000006210000013027213766346220014524 0ustar maomkpasswd/* trees.c -- output deflated data using Huffman coding * Copyright (C) 1995-2010 Jean-loup Gailly * detect_data_type() function provided freely by Cosmin Truta, 2006 * For conditions of distribution and use, see copyright notice in zlib.h */ /* * ALGORITHM * * The "deflation" process uses several Huffman trees. The more * common source values are represented by shorter bit sequences. * * Each code tree is stored in a compressed form which is itself * a Huffman encoding of the lengths of all the code strings (in * ascending order by source values). The actual code strings are * reconstructed from the lengths in the inflate process, as described * in the deflate specification. * * REFERENCES * * Deutsch, L.P.,"'Deflate' Compressed Data Format Specification". * Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc * * Storer, James A. * Data Compression: Methods and Theory, pp. 49-50. * Computer Science Press, 1988. ISBN 0-7167-8156-5. * * Sedgewick, R. * Algorithms, p290. * Addison-Wesley, 1983. ISBN 0-201-06672-6. */ /* @(#) $Id$ */ /* #define GEN_TREES_H */ #include "deflate.h" #ifdef DEBUG # include #endif /* =========================================================================== * Constants */ #define MAX_BL_BITS 7 /* Bit length codes must not exceed MAX_BL_BITS bits */ #define END_BLOCK 256 /* end of block literal code */ #define REP_3_6 16 /* repeat previous bit length 3-6 times (2 bits of repeat count) */ #define REPZ_3_10 17 /* repeat a zero length 3-10 times (3 bits of repeat count) */ #define REPZ_11_138 18 /* repeat a zero length 11-138 times (7 bits of repeat count) */ local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */ = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0}; local const int extra_dbits[D_CODES] /* extra bits for each distance code */ = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */ = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7}; local const uch bl_order[BL_CODES] = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15}; /* The lengths of the bit length codes are sent in order of decreasing * probability, to avoid transmitting the lengths for unused bit length codes. */ #define Buf_size (8 * 2*sizeof(char)) /* Number of bits used within bi_buf. (bi_buf might be implemented on * more than 16 bits on some systems.) */ /* =========================================================================== * Local data. These are initialized only once. */ #define DIST_CODE_LEN 512 /* see definition of array dist_code below */ #if defined(GEN_TREES_H) || !defined(STDC) /* non ANSI compilers may not accept trees.h */ local ct_data static_ltree[L_CODES+2]; /* The static literal tree. Since the bit lengths are imposed, there is no * need for the L_CODES extra codes used during heap construction. However * The codes 286 and 287 are needed to build a canonical tree (see _tr_init * below). */ local ct_data static_dtree[D_CODES]; /* The static distance tree. (Actually a trivial tree since all codes use * 5 bits.) */ uch _dist_code[DIST_CODE_LEN]; /* Distance codes. The first 256 values correspond to the distances * 3 .. 258, the last 256 values correspond to the top 8 bits of * the 15 bit distances. */ uch _length_code[MAX_MATCH-MIN_MATCH+1]; /* length code for each normalized match length (0 == MIN_MATCH) */ local int base_length[LENGTH_CODES]; /* First normalized length for each code (0 = MIN_MATCH) */ local int base_dist[D_CODES]; /* First normalized distance for each code (0 = distance of 1) */ #else # include "trees.h" #endif /* GEN_TREES_H */ struct static_tree_desc_s { const ct_data *static_tree; /* static tree or NULL */ const intf *extra_bits; /* extra bits for each code or NULL */ int extra_base; /* base index for extra_bits */ int elems; /* max number of elements in the tree */ int max_length; /* max bit length for the codes */ }; local static_tree_desc static_l_desc = {static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS}; local static_tree_desc static_d_desc = {static_dtree, extra_dbits, 0, D_CODES, MAX_BITS}; local static_tree_desc static_bl_desc = {(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS}; /* =========================================================================== * Local (static) routines in this file. */ local void tr_static_init OF((void)); local void init_block OF((deflate_state *s)); local void pqdownheap OF((deflate_state *s, ct_data *tree, int k)); local void gen_bitlen OF((deflate_state *s, tree_desc *desc)); local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count)); local void build_tree OF((deflate_state *s, tree_desc *desc)); local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code)); local void send_tree OF((deflate_state *s, ct_data *tree, int max_code)); local int build_bl_tree OF((deflate_state *s)); local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, int blcodes)); local void compress_block OF((deflate_state *s, ct_data *ltree, ct_data *dtree)); local int detect_data_type OF((deflate_state *s)); local unsigned bi_reverse OF((unsigned value, int length)); local void bi_windup OF((deflate_state *s)); local void bi_flush OF((deflate_state *s)); local void copy_block OF((deflate_state *s, charf *buf, unsigned len, int header)); #ifdef GEN_TREES_H local void gen_trees_header OF((void)); #endif #ifndef DEBUG # define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len) /* Send a code of the given tree. c and tree must not have side effects */ #else /* DEBUG */ # define send_code(s, c, tree) \ { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \ send_bits(s, tree[c].Code, tree[c].Len); } #endif /* =========================================================================== * Output a short LSB first on the stream. * IN assertion: there is enough room in pendingBuf. */ #define put_short(s, w) { \ put_byte(s, (uch)((w) & 0xff)); \ put_byte(s, (uch)((ush)(w) >> 8)); \ } /* =========================================================================== * Send a value on a given number of bits. * IN assertion: length <= 16 and value fits in length bits. */ #ifdef DEBUG local void send_bits OF((deflate_state *s, int value, int length)); local void send_bits(s, value, length) deflate_state *s; int value; /* value to send */ int length; /* number of bits */ { Tracevv((stderr," l %2d v %4x ", length, value)); Assert(length > 0 && length <= 15, "invalid length"); s->bits_sent += (ulg)length; /* If not enough room in bi_buf, use (valid) bits from bi_buf and * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) * unused bits in value. */ if (s->bi_valid > (int)Buf_size - length) { s->bi_buf |= (ush)value << s->bi_valid; put_short(s, s->bi_buf); s->bi_buf = (ush)value >> (Buf_size - s->bi_valid); s->bi_valid += length - Buf_size; } else { s->bi_buf |= (ush)value << s->bi_valid; s->bi_valid += length; } } #else /* !DEBUG */ #define send_bits(s, value, length) \ { int len = length;\ if (s->bi_valid > (int)Buf_size - len) {\ int val = value;\ s->bi_buf |= (ush)val << s->bi_valid;\ put_short(s, s->bi_buf);\ s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\ s->bi_valid += len - Buf_size;\ } else {\ s->bi_buf |= (ush)(value) << s->bi_valid;\ s->bi_valid += len;\ }\ } #endif /* DEBUG */ /* the arguments must not have side effects */ /* =========================================================================== * Initialize the various 'constant' tables. */ local void tr_static_init() { #if defined(GEN_TREES_H) || !defined(STDC) static int static_init_done = 0; int n; /* iterates over tree elements */ int bits; /* bit counter */ int length; /* length value */ int code; /* code value */ int dist; /* distance index */ ush bl_count[MAX_BITS+1]; /* number of codes at each bit length for an optimal tree */ if (static_init_done) return; /* For some embedded targets, global variables are not initialized: */ #ifdef NO_INIT_GLOBAL_POINTERS static_l_desc.static_tree = static_ltree; static_l_desc.extra_bits = extra_lbits; static_d_desc.static_tree = static_dtree; static_d_desc.extra_bits = extra_dbits; static_bl_desc.extra_bits = extra_blbits; #endif /* Initialize the mapping length (0..255) -> length code (0..28) */ length = 0; for (code = 0; code < LENGTH_CODES-1; code++) { base_length[code] = length; for (n = 0; n < (1< dist code (0..29) */ dist = 0; for (code = 0 ; code < 16; code++) { base_dist[code] = dist; for (n = 0; n < (1<>= 7; /* from now on, all distances are divided by 128 */ for ( ; code < D_CODES; code++) { base_dist[code] = dist << 7; for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) { _dist_code[256 + dist++] = (uch)code; } } Assert (dist == 256, "tr_static_init: 256+dist != 512"); /* Construct the codes of the static literal tree */ for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0; n = 0; while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++; while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++; while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++; while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++; /* Codes 286 and 287 do not exist, but we must include them in the * tree construction to get a canonical Huffman tree (longest code * all ones) */ gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count); /* The static distance tree is trivial: */ for (n = 0; n < D_CODES; n++) { static_dtree[n].Len = 5; static_dtree[n].Code = bi_reverse((unsigned)n, 5); } static_init_done = 1; # ifdef GEN_TREES_H gen_trees_header(); # endif #endif /* defined(GEN_TREES_H) || !defined(STDC) */ } /* =========================================================================== * Genererate the file trees.h describing the static trees. */ #ifdef GEN_TREES_H # ifndef DEBUG # include # endif # define SEPARATOR(i, last, width) \ ((i) == (last)? "\n};\n\n" : \ ((i) % (width) == (width)-1 ? ",\n" : ", ")) void gen_trees_header() { FILE *header = fopen("trees.h", "w"); int i; Assert (header != NULL, "Can't open trees.h"); fprintf(header, "/* header created automatically with -DGEN_TREES_H */\n\n"); fprintf(header, "local const ct_data static_ltree[L_CODES+2] = {\n"); for (i = 0; i < L_CODES+2; i++) { fprintf(header, "{{%3u},{%3u}}%s", static_ltree[i].Code, static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5)); } fprintf(header, "local const ct_data static_dtree[D_CODES] = {\n"); for (i = 0; i < D_CODES; i++) { fprintf(header, "{{%2u},{%2u}}%s", static_dtree[i].Code, static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5)); } fprintf(header, "const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = {\n"); for (i = 0; i < DIST_CODE_LEN; i++) { fprintf(header, "%2u%s", _dist_code[i], SEPARATOR(i, DIST_CODE_LEN-1, 20)); } fprintf(header, "const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= {\n"); for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) { fprintf(header, "%2u%s", _length_code[i], SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20)); } fprintf(header, "local const int base_length[LENGTH_CODES] = {\n"); for (i = 0; i < LENGTH_CODES; i++) { fprintf(header, "%1u%s", base_length[i], SEPARATOR(i, LENGTH_CODES-1, 20)); } fprintf(header, "local const int base_dist[D_CODES] = {\n"); for (i = 0; i < D_CODES; i++) { fprintf(header, "%5u%s", base_dist[i], SEPARATOR(i, D_CODES-1, 10)); } fclose(header); } #endif /* GEN_TREES_H */ /* =========================================================================== * Initialize the tree data structures for a new zlib stream. */ void ZLIB_INTERNAL _tr_init(s) deflate_state *s; { tr_static_init(); s->l_desc.dyn_tree = s->dyn_ltree; s->l_desc.stat_desc = &static_l_desc; s->d_desc.dyn_tree = s->dyn_dtree; s->d_desc.stat_desc = &static_d_desc; s->bl_desc.dyn_tree = s->bl_tree; s->bl_desc.stat_desc = &static_bl_desc; s->bi_buf = 0; s->bi_valid = 0; s->last_eob_len = 8; /* enough lookahead for inflate */ #ifdef DEBUG s->compressed_len = 0L; s->bits_sent = 0L; #endif /* Initialize the first block of the first file: */ init_block(s); } /* =========================================================================== * Initialize a new block. */ local void init_block(s) deflate_state *s; { int n; /* iterates over tree elements */ /* Initialize the trees. */ for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0; for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0; for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0; s->dyn_ltree[END_BLOCK].Freq = 1; s->opt_len = s->static_len = 0L; s->last_lit = s->matches = 0; } #define SMALLEST 1 /* Index within the heap array of least frequent node in the Huffman tree */ /* =========================================================================== * Remove the smallest element from the heap and recreate the heap with * one less element. Updates heap and heap_len. */ #define pqremove(s, tree, top) \ {\ top = s->heap[SMALLEST]; \ s->heap[SMALLEST] = s->heap[s->heap_len--]; \ pqdownheap(s, tree, SMALLEST); \ } /* =========================================================================== * Compares to subtrees, using the tree depth as tie breaker when * the subtrees have equal frequency. This minimizes the worst case length. */ #define smaller(tree, n, m, depth) \ (tree[n].Freq < tree[m].Freq || \ (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m])) /* =========================================================================== * Restore the heap property by moving down the tree starting at node k, * exchanging a node with the smallest of its two sons if necessary, stopping * when the heap property is re-established (each father smaller than its * two sons). */ local void pqdownheap(s, tree, k) deflate_state *s; ct_data *tree; /* the tree to restore */ int k; /* node to move down */ { int v = s->heap[k]; int j = k << 1; /* left son of k */ while (j <= s->heap_len) { /* Set j to the smallest of the two sons: */ if (j < s->heap_len && smaller(tree, s->heap[j+1], s->heap[j], s->depth)) { j++; } /* Exit if v is smaller than both sons */ if (smaller(tree, v, s->heap[j], s->depth)) break; /* Exchange v with the smallest son */ s->heap[k] = s->heap[j]; k = j; /* And continue down the tree, setting j to the left son of k */ j <<= 1; } s->heap[k] = v; } /* =========================================================================== * Compute the optimal bit lengths for a tree and update the total bit length * for the current block. * IN assertion: the fields freq and dad are set, heap[heap_max] and * above are the tree nodes sorted by increasing frequency. * OUT assertions: the field len is set to the optimal bit length, the * array bl_count contains the frequencies for each bit length. * The length opt_len is updated; static_len is also updated if stree is * not null. */ local void gen_bitlen(s, desc) deflate_state *s; tree_desc *desc; /* the tree descriptor */ { ct_data *tree = desc->dyn_tree; int max_code = desc->max_code; const ct_data *stree = desc->stat_desc->static_tree; const intf *extra = desc->stat_desc->extra_bits; int base = desc->stat_desc->extra_base; int max_length = desc->stat_desc->max_length; int h; /* heap index */ int n, m; /* iterate over the tree elements */ int bits; /* bit length */ int xbits; /* extra bits */ ush f; /* frequency */ int overflow = 0; /* number of elements with bit length too large */ for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0; /* In a first pass, compute the optimal bit lengths (which may * overflow in the case of the bit length tree). */ tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */ for (h = s->heap_max+1; h < HEAP_SIZE; h++) { n = s->heap[h]; bits = tree[tree[n].Dad].Len + 1; if (bits > max_length) bits = max_length, overflow++; tree[n].Len = (ush)bits; /* We overwrite tree[n].Dad which is no longer needed */ if (n > max_code) continue; /* not a leaf node */ s->bl_count[bits]++; xbits = 0; if (n >= base) xbits = extra[n-base]; f = tree[n].Freq; s->opt_len += (ulg)f * (bits + xbits); if (stree) s->static_len += (ulg)f * (stree[n].Len + xbits); } if (overflow == 0) return; Trace((stderr,"\nbit length overflow\n")); /* This happens for example on obj2 and pic of the Calgary corpus */ /* Find the first bit length which could increase: */ do { bits = max_length-1; while (s->bl_count[bits] == 0) bits--; s->bl_count[bits]--; /* move one leaf down the tree */ s->bl_count[bits+1] += 2; /* move one overflow item as its brother */ s->bl_count[max_length]--; /* The brother of the overflow item also moves one step up, * but this does not affect bl_count[max_length] */ overflow -= 2; } while (overflow > 0); /* Now recompute all bit lengths, scanning in increasing frequency. * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all * lengths instead of fixing only the wrong ones. This idea is taken * from 'ar' written by Haruhiko Okumura.) */ for (bits = max_length; bits != 0; bits--) { n = s->bl_count[bits]; while (n != 0) { m = s->heap[--h]; if (m > max_code) continue; if ((unsigned) tree[m].Len != (unsigned) bits) { Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); s->opt_len += ((long)bits - (long)tree[m].Len) *(long)tree[m].Freq; tree[m].Len = (ush)bits; } n--; } } } /* =========================================================================== * Generate the codes for a given tree and bit counts (which need not be * optimal). * IN assertion: the array bl_count contains the bit length statistics for * the given tree and the field len is set for all tree elements. * OUT assertion: the field code is set for all tree elements of non * zero code length. */ local void gen_codes (tree, max_code, bl_count) ct_data *tree; /* the tree to decorate */ int max_code; /* largest code with non zero frequency */ ushf *bl_count; /* number of codes at each bit length */ { ush next_code[MAX_BITS+1]; /* next code value for each bit length */ ush code = 0; /* running code value */ int bits; /* bit index */ int n; /* code index */ /* The distribution counts are first used to generate the code values * without bit reversal. */ for (bits = 1; bits <= MAX_BITS; bits++) { next_code[bits] = code = (code + bl_count[bits-1]) << 1; } /* Check that the bit counts in bl_count are consistent. The last code * must be all ones. */ Assert (code + bl_count[MAX_BITS]-1 == (1<dyn_tree; const ct_data *stree = desc->stat_desc->static_tree; int elems = desc->stat_desc->elems; int n, m; /* iterate over heap elements */ int max_code = -1; /* largest code with non zero frequency */ int node; /* new node being created */ /* Construct the initial heap, with least frequent element in * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. * heap[0] is not used. */ s->heap_len = 0, s->heap_max = HEAP_SIZE; for (n = 0; n < elems; n++) { if (tree[n].Freq != 0) { s->heap[++(s->heap_len)] = max_code = n; s->depth[n] = 0; } else { tree[n].Len = 0; } } /* The pkzip format requires that at least one distance code exists, * and that at least one bit should be sent even if there is only one * possible code. So to avoid special checks later on we force at least * two codes of non zero frequency. */ while (s->heap_len < 2) { node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0); tree[node].Freq = 1; s->depth[node] = 0; s->opt_len--; if (stree) s->static_len -= stree[node].Len; /* node is 0 or 1 so it does not have extra bits */ } desc->max_code = max_code; /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, * establish sub-heaps of increasing lengths: */ for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n); /* Construct the Huffman tree by repeatedly combining the least two * frequent nodes. */ node = elems; /* next internal node of the tree */ do { pqremove(s, tree, n); /* n = node of least frequency */ m = s->heap[SMALLEST]; /* m = node of next least frequency */ s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */ s->heap[--(s->heap_max)] = m; /* Create a new node father of n and m */ tree[node].Freq = tree[n].Freq + tree[m].Freq; s->depth[node] = (uch)((s->depth[n] >= s->depth[m] ? s->depth[n] : s->depth[m]) + 1); tree[n].Dad = tree[m].Dad = (ush)node; #ifdef DUMP_BL_TREE if (tree == s->bl_tree) { fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)", node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq); } #endif /* and insert the new node in the heap */ s->heap[SMALLEST] = node++; pqdownheap(s, tree, SMALLEST); } while (s->heap_len >= 2); s->heap[--(s->heap_max)] = s->heap[SMALLEST]; /* At this point, the fields freq and dad are set. We can now * generate the bit lengths. */ gen_bitlen(s, (tree_desc *)desc); /* The field len is now set, we can generate the bit codes */ gen_codes ((ct_data *)tree, max_code, s->bl_count); } /* =========================================================================== * Scan a literal or distance tree to determine the frequencies of the codes * in the bit length tree. */ local void scan_tree (s, tree, max_code) deflate_state *s; ct_data *tree; /* the tree to be scanned */ int max_code; /* and its largest code of non zero frequency */ { int n; /* iterates over all tree elements */ int prevlen = -1; /* last emitted length */ int curlen; /* length of current code */ int nextlen = tree[0].Len; /* length of next code */ int count = 0; /* repeat count of the current code */ int max_count = 7; /* max repeat count */ int min_count = 4; /* min repeat count */ if (nextlen == 0) max_count = 138, min_count = 3; tree[max_code+1].Len = (ush)0xffff; /* guard */ for (n = 0; n <= max_code; n++) { curlen = nextlen; nextlen = tree[n+1].Len; if (++count < max_count && curlen == nextlen) { continue; } else if (count < min_count) { s->bl_tree[curlen].Freq += count; } else if (curlen != 0) { if (curlen != prevlen) s->bl_tree[curlen].Freq++; s->bl_tree[REP_3_6].Freq++; } else if (count <= 10) { s->bl_tree[REPZ_3_10].Freq++; } else { s->bl_tree[REPZ_11_138].Freq++; } count = 0; prevlen = curlen; if (nextlen == 0) { max_count = 138, min_count = 3; } else if (curlen == nextlen) { max_count = 6, min_count = 3; } else { max_count = 7, min_count = 4; } } } /* =========================================================================== * Send a literal or distance tree in compressed form, using the codes in * bl_tree. */ local void send_tree (s, tree, max_code) deflate_state *s; ct_data *tree; /* the tree to be scanned */ int max_code; /* and its largest code of non zero frequency */ { int n; /* iterates over all tree elements */ int prevlen = -1; /* last emitted length */ int curlen; /* length of current code */ int nextlen = tree[0].Len; /* length of next code */ int count = 0; /* repeat count of the current code */ int max_count = 7; /* max repeat count */ int min_count = 4; /* min repeat count */ /* tree[max_code+1].Len = -1; */ /* guard already set */ if (nextlen == 0) max_count = 138, min_count = 3; for (n = 0; n <= max_code; n++) { curlen = nextlen; nextlen = tree[n+1].Len; if (++count < max_count && curlen == nextlen) { continue; } else if (count < min_count) { do { send_code(s, curlen, s->bl_tree); } while (--count != 0); } else if (curlen != 0) { if (curlen != prevlen) { send_code(s, curlen, s->bl_tree); count--; } Assert(count >= 3 && count <= 6, " 3_6?"); send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2); } else if (count <= 10) { send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3); } else { send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7); } count = 0; prevlen = curlen; if (nextlen == 0) { max_count = 138, min_count = 3; } else if (curlen == nextlen) { max_count = 6, min_count = 3; } else { max_count = 7, min_count = 4; } } } /* =========================================================================== * Construct the Huffman tree for the bit lengths and return the index in * bl_order of the last bit length code to send. */ local int build_bl_tree(s) deflate_state *s; { int max_blindex; /* index of last bit length code of non zero freq */ /* Determine the bit length frequencies for literal and distance trees */ scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code); scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code); /* Build the bit length tree: */ build_tree(s, (tree_desc *)(&(s->bl_desc))); /* opt_len now includes the length of the tree representations, except * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. */ /* Determine the number of bit length codes to send. The pkzip format * requires that at least 4 bit length codes be sent. (appnote.txt says * 3 but the actual value used is 4.) */ for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) { if (s->bl_tree[bl_order[max_blindex]].Len != 0) break; } /* Update opt_len to include the bit length tree and counts */ s->opt_len += 3*(max_blindex+1) + 5+5+4; Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", s->opt_len, s->static_len)); return max_blindex; } /* =========================================================================== * Send the header for a block using dynamic Huffman trees: the counts, the * lengths of the bit length codes, the literal tree and the distance tree. * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. */ local void send_all_trees(s, lcodes, dcodes, blcodes) deflate_state *s; int lcodes, dcodes, blcodes; /* number of codes for each tree */ { int rank; /* index in bl_order */ Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, "too many codes"); Tracev((stderr, "\nbl counts: ")); send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */ send_bits(s, dcodes-1, 5); send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */ for (rank = 0; rank < blcodes; rank++) { Tracev((stderr, "\nbl code %2d ", bl_order[rank])); send_bits(s, s->bl_tree[bl_order[rank]].Len, 3); } Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */ Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */ Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); } /* =========================================================================== * Send a stored block */ void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last) deflate_state *s; charf *buf; /* input block */ ulg stored_len; /* length of input block */ int last; /* one if this is the last block for a file */ { send_bits(s, (STORED_BLOCK<<1)+last, 3); /* send block type */ #ifdef DEBUG s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; s->compressed_len += (stored_len + 4) << 3; #endif copy_block(s, buf, (unsigned)stored_len, 1); /* with header */ } /* =========================================================================== * Send one empty static block to give enough lookahead for inflate. * This takes 10 bits, of which 7 may remain in the bit buffer. * The current inflate code requires 9 bits of lookahead. If the * last two codes for the previous block (real code plus EOB) were coded * on 5 bits or less, inflate may have only 5+3 bits of lookahead to decode * the last real code. In this case we send two empty static blocks instead * of one. (There are no problems if the previous block is stored or fixed.) * To simplify the code, we assume the worst case of last real code encoded * on one bit only. */ void ZLIB_INTERNAL _tr_align(s) deflate_state *s; { send_bits(s, STATIC_TREES<<1, 3); send_code(s, END_BLOCK, static_ltree); #ifdef DEBUG s->compressed_len += 10L; /* 3 for block type, 7 for EOB */ #endif bi_flush(s); /* Of the 10 bits for the empty block, we have already sent * (10 - bi_valid) bits. The lookahead for the last real code (before * the EOB of the previous block) was thus at least one plus the length * of the EOB plus what we have just sent of the empty static block. */ if (1 + s->last_eob_len + 10 - s->bi_valid < 9) { send_bits(s, STATIC_TREES<<1, 3); send_code(s, END_BLOCK, static_ltree); #ifdef DEBUG s->compressed_len += 10L; #endif bi_flush(s); } s->last_eob_len = 7; } /* =========================================================================== * Determine the best encoding for the current block: dynamic trees, static * trees or store, and output the encoded block to the zip file. */ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) deflate_state *s; charf *buf; /* input block, or NULL if too old */ ulg stored_len; /* length of input block */ int last; /* one if this is the last block for a file */ { ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ int max_blindex = 0; /* index of last bit length code of non zero freq */ /* Build the Huffman trees unless a stored block is forced */ if (s->level > 0) { /* Check if the file is binary or text */ if (s->strm->data_type == Z_UNKNOWN) s->strm->data_type = detect_data_type(s); /* Construct the literal and distance trees */ build_tree(s, (tree_desc *)(&(s->l_desc))); Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, s->static_len)); build_tree(s, (tree_desc *)(&(s->d_desc))); Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, s->static_len)); /* At this point, opt_len and static_len are the total bit lengths of * the compressed block data, excluding the tree representations. */ /* Build the bit length tree for the above two trees, and get the index * in bl_order of the last bit length code to send. */ max_blindex = build_bl_tree(s); /* Determine the best encoding. Compute the block lengths in bytes. */ opt_lenb = (s->opt_len+3+7)>>3; static_lenb = (s->static_len+3+7)>>3; Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, s->last_lit)); if (static_lenb <= opt_lenb) opt_lenb = static_lenb; } else { Assert(buf != (char*)0, "lost buf"); opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ } #ifdef FORCE_STORED if (buf != (char*)0) { /* force stored block */ #else if (stored_len+4 <= opt_lenb && buf != (char*)0) { /* 4: two words for the lengths */ #endif /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. * Otherwise we can't have processed more than WSIZE input bytes since * the last block flush, because compression would have been * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to * transform a block into a stored block. */ _tr_stored_block(s, buf, stored_len, last); #ifdef FORCE_STATIC } else if (static_lenb >= 0) { /* force static trees */ #else } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) { #endif send_bits(s, (STATIC_TREES<<1)+last, 3); compress_block(s, (ct_data *)static_ltree, (ct_data *)static_dtree); #ifdef DEBUG s->compressed_len += 3 + s->static_len; #endif } else { send_bits(s, (DYN_TREES<<1)+last, 3); send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1, max_blindex+1); compress_block(s, (ct_data *)s->dyn_ltree, (ct_data *)s->dyn_dtree); #ifdef DEBUG s->compressed_len += 3 + s->opt_len; #endif } Assert (s->compressed_len == s->bits_sent, "bad compressed size"); /* The above check is made mod 2^32, for files larger than 512 MB * and uLong implemented on 32 bits. */ init_block(s); if (last) { bi_windup(s); #ifdef DEBUG s->compressed_len += 7; /* align on byte boundary */ #endif } Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, s->compressed_len-7*last)); } /* =========================================================================== * Save the match info and tally the frequency counts. Return true if * the current block must be flushed. */ int ZLIB_INTERNAL _tr_tally (s, dist, lc) deflate_state *s; unsigned dist; /* distance of matched string */ unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ { s->d_buf[s->last_lit] = (ush)dist; s->l_buf[s->last_lit++] = (uch)lc; if (dist == 0) { /* lc is the unmatched char */ s->dyn_ltree[lc].Freq++; } else { s->matches++; /* Here, lc is the match length - MIN_MATCH */ dist--; /* dist = match distance - 1 */ Assert((ush)dist < (ush)MAX_DIST(s) && (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++; s->dyn_dtree[d_code(dist)].Freq++; } #ifdef TRUNCATE_BLOCK /* Try to guess if it is profitable to stop the current block here */ if ((s->last_lit & 0x1fff) == 0 && s->level > 2) { /* Compute an upper bound for the compressed length */ ulg out_length = (ulg)s->last_lit*8L; ulg in_length = (ulg)((long)s->strstart - s->block_start); int dcode; for (dcode = 0; dcode < D_CODES; dcode++) { out_length += (ulg)s->dyn_dtree[dcode].Freq * (5L+extra_dbits[dcode]); } out_length >>= 3; Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", s->last_lit, in_length, out_length, 100L - out_length*100L/in_length)); if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1; } #endif return (s->last_lit == s->lit_bufsize-1); /* We avoid equality with lit_bufsize because of wraparound at 64K * on 16 bit machines and because stored blocks are restricted to * 64K-1 bytes. */ } /* =========================================================================== * Send the block data compressed using the given Huffman trees */ local void compress_block(s, ltree, dtree) deflate_state *s; ct_data *ltree; /* literal tree */ ct_data *dtree; /* distance tree */ { unsigned dist; /* distance of matched string */ int lc; /* match length or unmatched char (if dist == 0) */ unsigned lx = 0; /* running index in l_buf */ unsigned code; /* the code to send */ int extra; /* number of extra bits to send */ if (s->last_lit != 0) do { dist = s->d_buf[lx]; lc = s->l_buf[lx++]; if (dist == 0) { send_code(s, lc, ltree); /* send a literal byte */ Tracecv(isgraph(lc), (stderr," '%c' ", lc)); } else { /* Here, lc is the match length - MIN_MATCH */ code = _length_code[lc]; send_code(s, code+LITERALS+1, ltree); /* send the length code */ extra = extra_lbits[code]; if (extra != 0) { lc -= base_length[code]; send_bits(s, lc, extra); /* send the extra length bits */ } dist--; /* dist is now the match distance - 1 */ code = d_code(dist); Assert (code < D_CODES, "bad d_code"); send_code(s, code, dtree); /* send the distance code */ extra = extra_dbits[code]; if (extra != 0) { dist -= base_dist[code]; send_bits(s, dist, extra); /* send the extra distance bits */ } } /* literal or match pair ? */ /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, "pendingBuf overflow"); } while (lx < s->last_lit); send_code(s, END_BLOCK, ltree); s->last_eob_len = ltree[END_BLOCK].Len; } /* =========================================================================== * Check if the data type is TEXT or BINARY, using the following algorithm: * - TEXT if the two conditions below are satisfied: * a) There are no non-portable control characters belonging to the * "black list" (0..6, 14..25, 28..31). * b) There is at least one printable character belonging to the * "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). * - BINARY otherwise. * - The following partially-portable control characters form a * "gray list" that is ignored in this detection algorithm: * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). * IN assertion: the fields Freq of dyn_ltree are set. */ local int detect_data_type(s) deflate_state *s; { /* black_mask is the bit mask of black-listed bytes * set bits 0..6, 14..25, and 28..31 * 0xf3ffc07f = binary 11110011111111111100000001111111 */ unsigned long black_mask = 0xf3ffc07fUL; int n; /* Check for non-textual ("black-listed") bytes. */ for (n = 0; n <= 31; n++, black_mask >>= 1) if ((black_mask & 1) && (s->dyn_ltree[n].Freq != 0)) return Z_BINARY; /* Check for textual ("white-listed") bytes. */ if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0 || s->dyn_ltree[13].Freq != 0) return Z_TEXT; for (n = 32; n < LITERALS; n++) if (s->dyn_ltree[n].Freq != 0) return Z_TEXT; /* There are no "black-listed" or "white-listed" bytes: * this stream either is empty or has tolerated ("gray-listed") bytes only. */ return Z_BINARY; } /* =========================================================================== * Reverse the first len bits of a code, using straightforward code (a faster * method would use a table) * IN assertion: 1 <= len <= 15 */ local unsigned bi_reverse(code, len) unsigned code; /* the value to invert */ int len; /* its bit length */ { register unsigned res = 0; do { res |= code & 1; code >>= 1, res <<= 1; } while (--len > 0); return res >> 1; } /* =========================================================================== * Flush the bit buffer, keeping at most 7 bits in it. */ local void bi_flush(s) deflate_state *s; { if (s->bi_valid == 16) { put_short(s, s->bi_buf); s->bi_buf = 0; s->bi_valid = 0; } else if (s->bi_valid >= 8) { put_byte(s, (Byte)s->bi_buf); s->bi_buf >>= 8; s->bi_valid -= 8; } } /* =========================================================================== * Flush the bit buffer and align the output on a byte boundary */ local void bi_windup(s) deflate_state *s; { if (s->bi_valid > 8) { put_short(s, s->bi_buf); } else if (s->bi_valid > 0) { put_byte(s, (Byte)s->bi_buf); } s->bi_buf = 0; s->bi_valid = 0; #ifdef DEBUG s->bits_sent = (s->bits_sent+7) & ~7; #endif } /* =========================================================================== * Copy a stored block, storing first the length and its * one's complement if requested. */ local void copy_block(s, buf, len, header) deflate_state *s; charf *buf; /* the input data */ unsigned len; /* its length */ int header; /* true if block header must be written */ { bi_windup(s); /* align on byte boundary */ s->last_eob_len = 8; /* enough lookahead for inflate */ if (header) { put_short(s, (ush)len); put_short(s, (ush)~len); #ifdef DEBUG s->bits_sent += 2*16; #endif } #ifdef DEBUG s->bits_sent += (ulg)len<<3; #endif while (len--) { put_byte(s, *buf++); } } glpk-5.0/src/zlib/trees.h0000644000062000006210000002043013766346220014523 0ustar maomkpasswd/* header created automatically with -DGEN_TREES_H */ local const ct_data static_ltree[L_CODES+2] = { {{ 12},{ 8}}, {{140},{ 8}}, {{ 76},{ 8}}, {{204},{ 8}}, {{ 44},{ 8}}, {{172},{ 8}}, {{108},{ 8}}, {{236},{ 8}}, {{ 28},{ 8}}, {{156},{ 8}}, {{ 92},{ 8}}, {{220},{ 8}}, {{ 60},{ 8}}, {{188},{ 8}}, {{124},{ 8}}, {{252},{ 8}}, {{ 2},{ 8}}, {{130},{ 8}}, {{ 66},{ 8}}, {{194},{ 8}}, {{ 34},{ 8}}, {{162},{ 8}}, {{ 98},{ 8}}, {{226},{ 8}}, {{ 18},{ 8}}, {{146},{ 8}}, {{ 82},{ 8}}, {{210},{ 8}}, {{ 50},{ 8}}, {{178},{ 8}}, {{114},{ 8}}, {{242},{ 8}}, {{ 10},{ 8}}, {{138},{ 8}}, {{ 74},{ 8}}, {{202},{ 8}}, {{ 42},{ 8}}, {{170},{ 8}}, {{106},{ 8}}, {{234},{ 8}}, {{ 26},{ 8}}, {{154},{ 8}}, {{ 90},{ 8}}, {{218},{ 8}}, {{ 58},{ 8}}, {{186},{ 8}}, {{122},{ 8}}, {{250},{ 8}}, {{ 6},{ 8}}, {{134},{ 8}}, {{ 70},{ 8}}, {{198},{ 8}}, {{ 38},{ 8}}, {{166},{ 8}}, {{102},{ 8}}, {{230},{ 8}}, {{ 22},{ 8}}, {{150},{ 8}}, {{ 86},{ 8}}, {{214},{ 8}}, {{ 54},{ 8}}, {{182},{ 8}}, {{118},{ 8}}, {{246},{ 8}}, {{ 14},{ 8}}, {{142},{ 8}}, {{ 78},{ 8}}, {{206},{ 8}}, {{ 46},{ 8}}, {{174},{ 8}}, {{110},{ 8}}, {{238},{ 8}}, {{ 30},{ 8}}, {{158},{ 8}}, {{ 94},{ 8}}, {{222},{ 8}}, {{ 62},{ 8}}, {{190},{ 8}}, {{126},{ 8}}, {{254},{ 8}}, {{ 1},{ 8}}, {{129},{ 8}}, {{ 65},{ 8}}, {{193},{ 8}}, {{ 33},{ 8}}, {{161},{ 8}}, {{ 97},{ 8}}, {{225},{ 8}}, {{ 17},{ 8}}, {{145},{ 8}}, {{ 81},{ 8}}, {{209},{ 8}}, {{ 49},{ 8}}, {{177},{ 8}}, {{113},{ 8}}, {{241},{ 8}}, {{ 9},{ 8}}, {{137},{ 8}}, {{ 73},{ 8}}, {{201},{ 8}}, {{ 41},{ 8}}, {{169},{ 8}}, {{105},{ 8}}, {{233},{ 8}}, {{ 25},{ 8}}, {{153},{ 8}}, {{ 89},{ 8}}, {{217},{ 8}}, {{ 57},{ 8}}, {{185},{ 8}}, {{121},{ 8}}, {{249},{ 8}}, {{ 5},{ 8}}, {{133},{ 8}}, {{ 69},{ 8}}, {{197},{ 8}}, {{ 37},{ 8}}, {{165},{ 8}}, {{101},{ 8}}, {{229},{ 8}}, {{ 21},{ 8}}, {{149},{ 8}}, {{ 85},{ 8}}, {{213},{ 8}}, {{ 53},{ 8}}, {{181},{ 8}}, {{117},{ 8}}, {{245},{ 8}}, {{ 13},{ 8}}, {{141},{ 8}}, {{ 77},{ 8}}, {{205},{ 8}}, {{ 45},{ 8}}, {{173},{ 8}}, {{109},{ 8}}, {{237},{ 8}}, {{ 29},{ 8}}, {{157},{ 8}}, {{ 93},{ 8}}, {{221},{ 8}}, {{ 61},{ 8}}, {{189},{ 8}}, {{125},{ 8}}, {{253},{ 8}}, {{ 19},{ 9}}, {{275},{ 9}}, {{147},{ 9}}, {{403},{ 9}}, {{ 83},{ 9}}, {{339},{ 9}}, {{211},{ 9}}, {{467},{ 9}}, {{ 51},{ 9}}, {{307},{ 9}}, {{179},{ 9}}, {{435},{ 9}}, {{115},{ 9}}, {{371},{ 9}}, {{243},{ 9}}, {{499},{ 9}}, {{ 11},{ 9}}, {{267},{ 9}}, {{139},{ 9}}, {{395},{ 9}}, {{ 75},{ 9}}, {{331},{ 9}}, {{203},{ 9}}, {{459},{ 9}}, {{ 43},{ 9}}, {{299},{ 9}}, {{171},{ 9}}, {{427},{ 9}}, {{107},{ 9}}, {{363},{ 9}}, {{235},{ 9}}, {{491},{ 9}}, {{ 27},{ 9}}, {{283},{ 9}}, {{155},{ 9}}, {{411},{ 9}}, {{ 91},{ 9}}, {{347},{ 9}}, {{219},{ 9}}, {{475},{ 9}}, {{ 59},{ 9}}, {{315},{ 9}}, {{187},{ 9}}, {{443},{ 9}}, {{123},{ 9}}, {{379},{ 9}}, {{251},{ 9}}, {{507},{ 9}}, {{ 7},{ 9}}, {{263},{ 9}}, {{135},{ 9}}, {{391},{ 9}}, {{ 71},{ 9}}, {{327},{ 9}}, {{199},{ 9}}, {{455},{ 9}}, {{ 39},{ 9}}, {{295},{ 9}}, {{167},{ 9}}, {{423},{ 9}}, {{103},{ 9}}, {{359},{ 9}}, {{231},{ 9}}, {{487},{ 9}}, {{ 23},{ 9}}, {{279},{ 9}}, {{151},{ 9}}, {{407},{ 9}}, {{ 87},{ 9}}, {{343},{ 9}}, {{215},{ 9}}, {{471},{ 9}}, {{ 55},{ 9}}, {{311},{ 9}}, {{183},{ 9}}, {{439},{ 9}}, {{119},{ 9}}, {{375},{ 9}}, {{247},{ 9}}, {{503},{ 9}}, {{ 15},{ 9}}, {{271},{ 9}}, {{143},{ 9}}, {{399},{ 9}}, {{ 79},{ 9}}, {{335},{ 9}}, {{207},{ 9}}, {{463},{ 9}}, {{ 47},{ 9}}, {{303},{ 9}}, {{175},{ 9}}, {{431},{ 9}}, {{111},{ 9}}, {{367},{ 9}}, {{239},{ 9}}, {{495},{ 9}}, {{ 31},{ 9}}, {{287},{ 9}}, {{159},{ 9}}, {{415},{ 9}}, {{ 95},{ 9}}, {{351},{ 9}}, {{223},{ 9}}, {{479},{ 9}}, {{ 63},{ 9}}, {{319},{ 9}}, {{191},{ 9}}, {{447},{ 9}}, {{127},{ 9}}, {{383},{ 9}}, {{255},{ 9}}, {{511},{ 9}}, {{ 0},{ 7}}, {{ 64},{ 7}}, {{ 32},{ 7}}, {{ 96},{ 7}}, {{ 16},{ 7}}, {{ 80},{ 7}}, {{ 48},{ 7}}, {{112},{ 7}}, {{ 8},{ 7}}, {{ 72},{ 7}}, {{ 40},{ 7}}, {{104},{ 7}}, {{ 24},{ 7}}, {{ 88},{ 7}}, {{ 56},{ 7}}, {{120},{ 7}}, {{ 4},{ 7}}, {{ 68},{ 7}}, {{ 36},{ 7}}, {{100},{ 7}}, {{ 20},{ 7}}, {{ 84},{ 7}}, {{ 52},{ 7}}, {{116},{ 7}}, {{ 3},{ 8}}, {{131},{ 8}}, {{ 67},{ 8}}, {{195},{ 8}}, {{ 35},{ 8}}, {{163},{ 8}}, {{ 99},{ 8}}, {{227},{ 8}} }; local const ct_data static_dtree[D_CODES] = { {{ 0},{ 5}}, {{16},{ 5}}, {{ 8},{ 5}}, {{24},{ 5}}, {{ 4},{ 5}}, {{20},{ 5}}, {{12},{ 5}}, {{28},{ 5}}, {{ 2},{ 5}}, {{18},{ 5}}, {{10},{ 5}}, {{26},{ 5}}, {{ 6},{ 5}}, {{22},{ 5}}, {{14},{ 5}}, {{30},{ 5}}, {{ 1},{ 5}}, {{17},{ 5}}, {{ 9},{ 5}}, {{25},{ 5}}, {{ 5},{ 5}}, {{21},{ 5}}, {{13},{ 5}}, {{29},{ 5}}, {{ 3},{ 5}}, {{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}} }; const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = { 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17, 18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29 }; const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= { 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28 }; local const int base_length[LENGTH_CODES] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 0 }; local const int base_dist[D_CODES] = { 0, 1, 2, 3, 4, 6, 8, 12, 16, 24, 32, 48, 64, 96, 128, 192, 256, 384, 512, 768, 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576 }; glpk-5.0/src/zlib/uncompr.c0000644000062000006210000000371213766346220015063 0ustar maomkpasswd/* uncompr.c -- decompress a memory buffer * Copyright (C) 1995-2003, 2010 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $Id$ */ #define ZLIB_INTERNAL #include "zlib.h" /* =========================================================================== Decompresses the source buffer into the destination buffer. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be large enough to hold the entire uncompressed data. (The size of the uncompressed data must have been saved previously by the compressor and transmitted to the decompressor by some mechanism outside the scope of this compression library.) Upon exit, destLen is the actual size of the compressed buffer. uncompress returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer, or Z_DATA_ERROR if the input data was corrupted. */ int ZEXPORT uncompress (dest, destLen, source, sourceLen) Bytef *dest; uLongf *destLen; const Bytef *source; uLong sourceLen; { z_stream stream; int err; stream.next_in = (Bytef*)source; stream.avail_in = (uInt)sourceLen; /* Check for source > 64K on 16-bit machine: */ if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; stream.next_out = dest; stream.avail_out = (uInt)*destLen; if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; stream.zalloc = (alloc_func)0; stream.zfree = (free_func)0; err = inflateInit(&stream); if (err != Z_OK) return err; err = inflate(&stream, Z_FINISH); if (err != Z_STREAM_END) { inflateEnd(&stream); if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0)) return Z_DATA_ERROR; return err; } *destLen = stream.total_out; err = inflateEnd(&stream); return err; } glpk-5.0/src/zlib/zconf.h0000644000062000006210000001317513766346220014530 0ustar maomkpasswd/* zconf.h (configuration of the zlib compression library) */ /* Modified by Andrew Makhorin , April 2011 */ /* Copyright (C) 1995-2010 Jean-loup Gailly * For conditions of distribution and use, see copyright notice in * zlib.h */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ #ifndef ZCONF_H #define ZCONF_H /* (file adler32.c) */ #define adler32 _glp_zlib_adler32 #define adler32_combine _glp_zlib_adler32_combine #define adler32_combine64 _glp_zlib_adler32_combine64 /* (file compress.c) */ #define compress2 _glp_zlib_compress2 #define compress _glp_zlib_compress #define compressBound _glp_zlib_compressBound /* (file crc32.c) */ #define get_crc_table _glp_zlib_get_crc_table #define crc32 _glp_zlib_crc32 #define crc32_combine _glp_zlib_crc32_combine #define crc32_combine64 _glp_zlib_crc32_combine64 /* (file deflate.c) */ #define deflateInit_ _glp_zlib_deflateInit_ #define deflateInit2_ _glp_zlib_deflateInit2_ #define deflateSetDictionary _glp_zlib_deflateSetDictionary #define deflateReset _glp_zlib_deflateReset #define deflateSetHeader _glp_zlib_deflateSetHeader #define deflatePrime _glp_zlib_deflatePrime #define deflateParams _glp_zlib_deflateParams #define deflateTune _glp_zlib_deflateTune #define deflateBound _glp_zlib_deflateBound #define deflate _glp_zlib_deflate #define deflateEnd _glp_zlib_deflateEnd #define deflateCopy _glp_zlib_deflateCopy #define deflate_copyright _glp_zlib_deflate_copyright /* (file gzclose.c) */ #define gzclose _glp_zlib_gzclose /* (file gzlib.c) */ #define gzopen _glp_zlib_gzopen #define gzopen64 _glp_zlib_gzopen64 #define gzdopen _glp_zlib_gzdopen #define gzbuffer _glp_zlib_gzbuffer #define gzrewind _glp_zlib_gzrewind #define gzseek64 _glp_zlib_gzseek64 #define gzseek _glp_zlib_gzseek #define gztell64 _glp_zlib_gztell64 #define gztell _glp_zlib_gztell #define gzoffset64 _glp_zlib_gzoffset64 #define gzoffset _glp_zlib_gzoffset #define gzeof _glp_zlib_gzeof #define gzerror _glp_zlib_gzerror #define gzclearerr _glp_zlib_gzclearerr #define gz_error _glp_zlib_gz_error /* (file gzread.c) */ #define gzread _glp_zlib_gzread #define gzgetc _glp_zlib_gzgetc #define gzungetc _glp_zlib_gzungetc #define gzgets _glp_zlib_gzgets #define gzdirect _glp_zlib_gzdirect #define gzclose_r _glp_zlib_gzclose_r /* (file gzwrite.c) */ #define gzwrite _glp_zlib_gzwrite #define gzputc _glp_zlib_gzputc #define gzputs _glp_zlib_gzputs #define gzprintf _glp_zlib_gzprintf #define gzflush _glp_zlib_gzflush #define gzsetparams _glp_zlib_gzsetparams #define gzclose_w _glp_zlib_gzclose_w /* (file infback.c) */ #define inflateBackInit_ _glp_zlib_inflateBackInit_ #define inflateBack _glp_zlib_inflateBack #define inflateBackEnd _glp_zlib_inflateBackEnd /* (file inffast.c) */ #define inflate_fast _glp_zlib_inflate_fast /* (file inflate.c) */ #define inflateReset _glp_zlib_inflateReset #define inflateReset2 _glp_zlib_inflateReset2 #define inflateInit2_ _glp_zlib_inflateInit2_ #define inflateInit_ _glp_zlib_inflateInit_ #define inflatePrime _glp_zlib_inflatePrime #define inflate _glp_zlib_inflate #define inflateEnd _glp_zlib_inflateEnd #define inflateSetDictionary _glp_zlib_inflateSetDictionary #define inflateGetHeader _glp_zlib_inflateGetHeader #define inflateSync _glp_zlib_inflateSync #define inflateSyncPoint _glp_zlib_inflateSyncPoint #define inflateCopy _glp_zlib_inflateCopy #define inflateUndermine _glp_zlib_inflateUndermine #define inflateMark _glp_zlib_inflateMark /* (file inftrees.c) */ #define inflate_table _glp_zlib_inflate_table #define inflate_copyright _glp_zlib_inflate_copyright /* (file trees.c) */ #define _tr_init _glp_zlib_tr_init #define _tr_stored_block _glp_zlib_tr_stored_block #define _tr_align _glp_zlib_tr_align #define _tr_flush_block _glp_zlib_tr_flush_block #define _tr_tally _glp_zlib_tr_tally #define _dist_code _glp_zlib_dist_code #define _length_code _glp_zlib_length_code /* (file uncompr.c) */ #define uncompress _glp_zlib_uncompress /* (file zutil.c) */ #define zlibVersion _glp_zlib_zlibVersion #define zlibCompileFlags _glp_zlib_zlibCompileFlags #define zError _glp_zlib_zError #define zcalloc _glp_zlib_zcalloc #define zcfree _glp_zlib_zcfree #define z_errmsg _glp_zlib_z_errmsg #define STDC 1 #define MAX_MEM_LEVEL 9 #define MAX_WBITS 15 #define OF(args) args #define ZEXTERN extern #define ZEXPORT #define ZEXPORTVA #define FAR typedef unsigned char Byte; typedef unsigned int uInt; typedef unsigned long uLong; typedef Byte Bytef; typedef char charf; typedef int intf; typedef uInt uIntf; typedef uLong uLongf; typedef void const *voidpc; typedef void *voidpf; typedef void *voidp; #define z_off_t long #define z_off64_t z_off_t #define NO_vsnprintf 1 #endif /* eof */ glpk-5.0/src/zlib/zio.c0000644000062000006210000000450413766346220014201 0ustar maomkpasswd/* zio.c (simulation of non-standard low-level i/o functions) */ /* Written by Andrew Makhorin , April 2011 * For conditions of distribution and use, see copyright notice in * zlib.h */ /* (reserved for copyright notice) */ #include #include #include "zio.h" static FILE *file[FOPEN_MAX]; static int initialized = 0; static void initialize(void) { int fd; assert(!initialized); file[0] = stdin; file[1] = stdout; file[2] = stderr; for (fd = 3; fd < FOPEN_MAX; fd++) file[fd] = NULL; initialized = 1; return; } int open(const char *path, int oflag, ...) { FILE *fp; int fd; if (!initialized) initialize(); /* see file gzlib.c, function gz_open */ if (oflag == O_RDONLY) fp = fopen(path, "rb"); else if (oflag == (O_WRONLY | O_CREAT | O_TRUNC)) fp = fopen(path, "wb"); else if (oflag == (O_WRONLY | O_CREAT | O_APPEND)) fp = fopen(path, "ab"); else assert(oflag != oflag); if (fp == NULL) return -1; for (fd = 0; fd < FOPEN_MAX; fd++) if (file[fd] == NULL) break; assert(fd < FOPEN_MAX); file[fd] = fp; return fd; } long read(int fd, void *buf, unsigned long nbyte) { unsigned long count; if (!initialized) initialize(); assert(0 <= fd && fd < FOPEN_MAX); assert(file[fd] != NULL); count = fread(buf, 1, nbyte, file[fd]); if (ferror(file[fd])) return -1; return count; } long write(int fd, const void *buf, unsigned long nbyte) { unsigned long count; if (!initialized) initialize(); assert(0 <= fd && fd < FOPEN_MAX); assert(file[fd] != NULL); count = fwrite(buf, 1, nbyte, file[fd]); if (count != nbyte) return -1; if (fflush(file[fd]) != 0) return -1; return count; } long lseek(int fd, long offset, int whence) { if (!initialized) initialize(); assert(0 <= fd && fd < FOPEN_MAX); assert(file[fd] != NULL); if (fseek(file[fd], offset, whence) != 0) return -1; return ftell(file[fd]); } int close(int fd) { if (!initialized) initialize(); assert(0 <= fd && fd < FOPEN_MAX); assert(file[fd] != NULL); fclose(file[fd]); file[fd] = NULL; return 0; } /* eof */ glpk-5.0/src/zlib/zio.h0000644000062000006210000000163213766346220014205 0ustar maomkpasswd/* zio.h (simulation of non-standard low-level i/o functions) */ /* Written by Andrew Makhorin , April 2011 * For conditions of distribution and use, see copyright notice in * zlib.h */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ #ifndef ZIO_H #define ZIO_H #define O_RDONLY 0x00 #define O_WRONLY 0x01 #define O_CREAT 0x10 #define O_TRUNC 0x20 #define O_APPEND 0x30 #define open _glp_zlib_open int open(const char *path, int oflag, ...); #define read _glp_zlib_read long read(int fd, void *buf, unsigned long nbyte); #define write _glp_zlib_write long write(int fd, const void *buf, unsigned long nbyte); #define lseek _glp_zlib_lseek long lseek(int fd, long offset, int whence); #define close _glp_zlib_close int close(int fd); #endif /* eof */ glpk-5.0/src/zlib/zlib.h0000644000062000006210000023331413766346220014350 0ustar maomkpasswd/* zlib.h -- interface of the 'zlib' general purpose compression library version 1.2.5, April 19th, 2010 Copyright (C) 1995-2010 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. Jean-loup Gailly Mark Adler jloup@gzip.org madler@alumni.caltech.edu The data format used by the zlib library is described by RFCs (Request for Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). */ #ifndef ZLIB_H #define ZLIB_H #include "zconf.h" #ifdef __cplusplus extern "C" { #endif #define ZLIB_VERSION "1.2.5" #define ZLIB_VERNUM 0x1250 #define ZLIB_VER_MAJOR 1 #define ZLIB_VER_MINOR 2 #define ZLIB_VER_REVISION 5 #define ZLIB_VER_SUBREVISION 0 /* The 'zlib' compression library provides in-memory compression and decompression functions, including integrity checks of the uncompressed data. This version of the library supports only one compression method (deflation) but other algorithms will be added later and will have the same stream interface. Compression can be done in a single step if the buffers are large enough, or can be done by repeated calls of the compression function. In the latter case, the application must provide more input and/or consume the output (providing more output space) before each call. The compressed data format used by default by the in-memory functions is the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped around a deflate stream, which is itself documented in RFC 1951. The library also supports reading and writing files in gzip (.gz) format with an interface similar to that of stdio using the functions that start with "gz". The gzip format is different from the zlib format. gzip is a gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. This library can optionally read and write gzip streams in memory as well. The zlib format was designed to be compact and fast for use in memory and on communications channels. The gzip format was designed for single- file compression on file systems, has a larger header than zlib to maintain directory information, and uses a different, slower check method than zlib. The library does not install any signal handler. The decoder checks the consistency of the compressed data, so the library should never crash even in case of corrupted input. */ typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); typedef void (*free_func) OF((voidpf opaque, voidpf address)); struct internal_state; typedef struct z_stream_s { Bytef *next_in; /* next input byte */ uInt avail_in; /* number of bytes available at next_in */ uLong total_in; /* total nb of input bytes read so far */ Bytef *next_out; /* next output byte should be put there */ uInt avail_out; /* remaining free space at next_out */ uLong total_out; /* total nb of bytes output so far */ char *msg; /* last error message, NULL if no error */ struct internal_state FAR *state; /* not visible by applications */ alloc_func zalloc; /* used to allocate the internal state */ free_func zfree; /* used to free the internal state */ voidpf opaque; /* private data object passed to zalloc and zfree */ int data_type; /* best guess about the data type: binary or text */ uLong adler; /* adler32 value of the uncompressed data */ uLong reserved; /* reserved for future use */ } z_stream; typedef z_stream FAR *z_streamp; /* gzip header information passed to and from zlib routines. See RFC 1952 for more details on the meanings of these fields. */ typedef struct gz_header_s { int text; /* true if compressed data believed to be text */ uLong time; /* modification time */ int xflags; /* extra flags (not used when writing a gzip file) */ int os; /* operating system */ Bytef *extra; /* pointer to extra field or Z_NULL if none */ uInt extra_len; /* extra field length (valid if extra != Z_NULL) */ uInt extra_max; /* space at extra (only when reading header) */ Bytef *name; /* pointer to zero-terminated file name or Z_NULL */ uInt name_max; /* space at name (only when reading header) */ Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */ uInt comm_max; /* space at comment (only when reading header) */ int hcrc; /* true if there was or will be a header crc */ int done; /* true when done reading gzip header (not used when writing a gzip file) */ } gz_header; typedef gz_header FAR *gz_headerp; /* The application must update next_in and avail_in when avail_in has dropped to zero. It must update next_out and avail_out when avail_out has dropped to zero. The application must initialize zalloc, zfree and opaque before calling the init function. All other fields are set by the compression library and must not be updated by the application. The opaque value provided by the application will be passed as the first parameter for calls of zalloc and zfree. This can be useful for custom memory management. The compression library attaches no meaning to the opaque value. zalloc must return Z_NULL if there is not enough memory for the object. If zlib is used in a multi-threaded application, zalloc and zfree must be thread safe. On 16-bit systems, the functions zalloc and zfree must be able to allocate exactly 65536 bytes, but will not be required to allocate more than this if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, pointers returned by zalloc for objects of exactly 65536 bytes *must* have their offset normalized to zero. The default allocation function provided by this library ensures this (see zutil.c). To reduce memory requirements and avoid any allocation of 64K objects, at the expense of compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h). The fields total_in and total_out can be used for statistics or progress reports. After compression, total_in holds the total size of the uncompressed data and may be saved for use in the decompressor (particularly if the decompressor wants to decompress everything in a single step). */ /* constants */ #define Z_NO_FLUSH 0 #define Z_PARTIAL_FLUSH 1 #define Z_SYNC_FLUSH 2 #define Z_FULL_FLUSH 3 #define Z_FINISH 4 #define Z_BLOCK 5 #define Z_TREES 6 /* Allowed flush values; see deflate() and inflate() below for details */ #define Z_OK 0 #define Z_STREAM_END 1 #define Z_NEED_DICT 2 #define Z_ERRNO (-1) #define Z_STREAM_ERROR (-2) #define Z_DATA_ERROR (-3) #define Z_MEM_ERROR (-4) #define Z_BUF_ERROR (-5) #define Z_VERSION_ERROR (-6) /* Return codes for the compression/decompression functions. Negative values * are errors, positive values are used for special but normal events. */ #define Z_NO_COMPRESSION 0 #define Z_BEST_SPEED 1 #define Z_BEST_COMPRESSION 9 #define Z_DEFAULT_COMPRESSION (-1) /* compression levels */ #define Z_FILTERED 1 #define Z_HUFFMAN_ONLY 2 #define Z_RLE 3 #define Z_FIXED 4 #define Z_DEFAULT_STRATEGY 0 /* compression strategy; see deflateInit2() below for details */ #define Z_BINARY 0 #define Z_TEXT 1 #define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */ #define Z_UNKNOWN 2 /* Possible values of the data_type field (though see inflate()) */ #define Z_DEFLATED 8 /* The deflate compression method (the only one supported in this version) */ #define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ #define zlib_version zlibVersion() /* for compatibility with versions < 1.0.2 */ /* basic functions */ ZEXTERN const char * ZEXPORT zlibVersion OF((void)); /* The application can compare zlibVersion and ZLIB_VERSION for consistency. If the first character differs, the library code actually used is not compatible with the zlib.h header file used by the application. This check is automatically made by deflateInit and inflateInit. */ /* ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); Initializes the internal stream state for compression. The fields zalloc, zfree and opaque must be initialized before by the caller. If zalloc and zfree are set to Z_NULL, deflateInit updates them to use default allocation functions. The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: 1 gives best speed, 9 gives best compression, 0 gives no compression at all (the input data is simply copied a block at a time). Z_DEFAULT_COMPRESSION requests a default compromise between speed and compression (currently equivalent to level 6). deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if level is not a valid compression level, or Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible with the version assumed by the caller (ZLIB_VERSION). msg is set to null if there is no error message. deflateInit does not perform any compression: this will be done by deflate(). */ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); /* deflate compresses as much data as possible, and stops when the input buffer becomes empty or the output buffer becomes full. It may introduce some output latency (reading input without producing any output) except when forced to flush. The detailed semantics are as follows. deflate performs one or both of the following actions: - Compress more input starting at next_in and update next_in and avail_in accordingly. If not all input can be processed (because there is not enough room in the output buffer), next_in and avail_in are updated and processing will resume at this point for the next call of deflate(). - Provide more output starting at next_out and update next_out and avail_out accordingly. This action is forced if the parameter flush is non zero. Forcing flush frequently degrades the compression ratio, so this parameter should be set only when necessary (in interactive applications). Some output may be provided even if flush is not set. Before the call of deflate(), the application should ensure that at least one of the actions is possible, by providing more input and/or consuming more output, and updating avail_in or avail_out accordingly; avail_out should never be zero before the call. The application can consume the compressed output when it wants, for example when the output buffer is full (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK and with zero avail_out, it must be called again after making room in the output buffer because there might be more output pending. Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to decide how much data to accumulate before producing output, in order to maximize compression. If the parameter flush is set to Z_SYNC_FLUSH, all pending output is flushed to the output buffer and the output is aligned on a byte boundary, so that the decompressor can get all input data available so far. (In particular avail_in is zero after the call if enough output space has been provided before the call.) Flushing may degrade compression for some compression algorithms and so it should be used only when necessary. This completes the current deflate block and follows it with an empty stored block that is three bits plus filler bits to the next byte, followed by four bytes (00 00 ff ff). If flush is set to Z_PARTIAL_FLUSH, all pending output is flushed to the output buffer, but the output is not aligned to a byte boundary. All of the input data so far will be available to the decompressor, as for Z_SYNC_FLUSH. This completes the current deflate block and follows it with an empty fixed codes block that is 10 bits long. This assures that enough bytes are output in order for the decompressor to finish the block before the empty fixed code block. If flush is set to Z_BLOCK, a deflate block is completed and emitted, as for Z_SYNC_FLUSH, but the output is not aligned on a byte boundary, and up to seven bits of the current block are held to be written as the next byte after the next deflate block is completed. In this case, the decompressor may not be provided enough bits at this point in order to complete decompression of the data provided so far to the compressor. It may need to wait for the next block to be emitted. This is for advanced applications that need to control the emission of deflate blocks. If flush is set to Z_FULL_FLUSH, all output is flushed as with Z_SYNC_FLUSH, and the compression state is reset so that decompression can restart from this point if previous compressed data has been damaged or if random access is desired. Using Z_FULL_FLUSH too often can seriously degrade compression. If deflate returns with avail_out == 0, this function must be called again with the same value of the flush parameter and more output space (updated avail_out), until the flush is complete (deflate returns with non-zero avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that avail_out is greater than six to avoid repeated flush markers due to avail_out == 0 on return. If the parameter flush is set to Z_FINISH, pending input is processed, pending output is flushed and deflate returns with Z_STREAM_END if there was enough output space; if deflate returns with Z_OK, this function must be called again with Z_FINISH and more output space (updated avail_out) but no more input data, until it returns with Z_STREAM_END or an error. After deflate has returned Z_STREAM_END, the only possible operations on the stream are deflateReset or deflateEnd. Z_FINISH can be used immediately after deflateInit if all the compression is to be done in a single step. In this case, avail_out must be at least the value returned by deflateBound (see below). If deflate does not return Z_STREAM_END, then it must be called again as described above. deflate() sets strm->adler to the adler32 checksum of all input read so far (that is, total_in bytes). deflate() may update strm->data_type if it can make a good guess about the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered binary. This field is only for information purposes and does not affect the compression algorithm in any manner. deflate() returns Z_OK if some progress has been made (more input processed or more output produced), Z_STREAM_END if all input has been consumed and all output has been produced (only when flush is set to Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example if next_in or next_out was Z_NULL), Z_BUF_ERROR if no progress is possible (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not fatal, and deflate() can be called again with more input and more output space to continue compressing. */ ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); /* All dynamically allocated data structures for this stream are freed. This function discards any unprocessed input and does not flush any pending output. deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state was inconsistent, Z_DATA_ERROR if the stream was freed prematurely (some input or output was discarded). In the error case, msg may be set but then points to a static string (which must not be deallocated). */ /* ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); Initializes the internal stream state for decompression. The fields next_in, avail_in, zalloc, zfree and opaque must be initialized before by the caller. If next_in is not Z_NULL and avail_in is large enough (the exact value depends on the compression method), inflateInit determines the compression method from the zlib header and allocates all data structures accordingly; otherwise the allocation will be deferred to the first call of inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to use default allocation functions. inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_VERSION_ERROR if the zlib library version is incompatible with the version assumed by the caller, or Z_STREAM_ERROR if the parameters are invalid, such as a null pointer to the structure. msg is set to null if there is no error message. inflateInit does not perform any decompression apart from possibly reading the zlib header if present: actual decompression will be done by inflate(). (So next_in and avail_in may be modified, but next_out and avail_out are unused and unchanged.) The current implementation of inflateInit() does not process any header information -- that is deferred until inflate() is called. */ ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); /* inflate decompresses as much data as possible, and stops when the input buffer becomes empty or the output buffer becomes full. It may introduce some output latency (reading input without producing any output) except when forced to flush. The detailed semantics are as follows. inflate performs one or both of the following actions: - Decompress more input starting at next_in and update next_in and avail_in accordingly. If not all input can be processed (because there is not enough room in the output buffer), next_in is updated and processing will resume at this point for the next call of inflate(). - Provide more output starting at next_out and update next_out and avail_out accordingly. inflate() provides as much output as possible, until there is no more input data or no more space in the output buffer (see below about the flush parameter). Before the call of inflate(), the application should ensure that at least one of the actions is possible, by providing more input and/or consuming more output, and updating the next_* and avail_* values accordingly. The application can consume the uncompressed output when it wants, for example when the output buffer is full (avail_out == 0), or after each call of inflate(). If inflate returns Z_OK and with zero avail_out, it must be called again after making room in the output buffer because there might be more output pending. The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FINISH, Z_BLOCK, or Z_TREES. Z_SYNC_FLUSH requests that inflate() flush as much output as possible to the output buffer. Z_BLOCK requests that inflate() stop if and when it gets to the next deflate block boundary. When decoding the zlib or gzip format, this will cause inflate() to return immediately after the header and before the first block. When doing a raw inflate, inflate() will go ahead and process the first block, and will return when it gets to the end of that block, or when it runs out of data. The Z_BLOCK option assists in appending to or combining deflate streams. Also to assist in this, on return inflate() will set strm->data_type to the number of unused bits in the last byte taken from strm->next_in, plus 64 if inflate() is currently decoding the last block in the deflate stream, plus 128 if inflate() returned immediately after decoding an end-of-block code or decoding the complete header up to just before the first byte of the deflate stream. The end-of-block will not be indicated until all of the uncompressed data from that block has been written to strm->next_out. The number of unused bits may in general be greater than seven, except when bit 7 of data_type is set, in which case the number of unused bits will be less than eight. data_type is set as noted here every time inflate() returns for all flush options, and so can be used to determine the amount of currently consumed input in bits. The Z_TREES option behaves as Z_BLOCK does, but it also returns when the end of each deflate block header is reached, before any actual data in that block is decoded. This allows the caller to determine the length of the deflate block header for later use in random access within a deflate block. 256 is added to the value of strm->data_type when inflate() returns immediately after reaching the end of the deflate block header. inflate() should normally be called until it returns Z_STREAM_END or an error. However if all decompression is to be performed in a single step (a single call of inflate), the parameter flush should be set to Z_FINISH. In this case all pending input is processed and all pending output is flushed; avail_out must be large enough to hold all the uncompressed data. (The size of the uncompressed data may have been saved by the compressor for this purpose.) The next operation on this stream must be inflateEnd to deallocate the decompression state. The use of Z_FINISH is never required, but can be used to inform inflate that a faster approach may be used for the single inflate() call. In this implementation, inflate() always flushes as much output as possible to the output buffer, and always uses the faster approach on the first call. So the only effect of the flush parameter in this implementation is on the return value of inflate(), as noted below, or when it returns early because Z_BLOCK or Z_TREES is used. If a preset dictionary is needed after this call (see inflateSetDictionary below), inflate sets strm->adler to the adler32 checksum of the dictionary chosen by the compressor and returns Z_NEED_DICT; otherwise it sets strm->adler to the adler32 checksum of all output produced so far (that is, total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described below. At the end of the stream, inflate() checks that its computed adler32 checksum is equal to that saved by the compressor and returns Z_STREAM_END only if the checksum is correct. inflate() can decompress and check either zlib-wrapped or gzip-wrapped deflate data. The header type is detected automatically, if requested when initializing with inflateInit2(). Any information contained in the gzip header is not retained, so applications that need that information should instead use raw inflate, see inflateInit2() below, or inflateBack() and perform their own processing of the gzip header and trailer. inflate() returns Z_OK if some progress has been made (more input processed or more output produced), Z_STREAM_END if the end of the compressed data has been reached and all uncompressed output has been produced, Z_NEED_DICT if a preset dictionary is needed at this point, Z_DATA_ERROR if the input data was corrupted (input stream not conforming to the zlib format or incorrect check value), Z_STREAM_ERROR if the stream structure was inconsistent (for example next_in or next_out was Z_NULL), Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if no progress is possible or if there was not enough room in the output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and inflate() can be called again with more input and more output space to continue decompressing. If Z_DATA_ERROR is returned, the application may then call inflateSync() to look for a good compression block if a partial recovery of the data is desired. */ ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); /* All dynamically allocated data structures for this stream are freed. This function discards any unprocessed input and does not flush any pending output. inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state was inconsistent. In the error case, msg may be set but then points to a static string (which must not be deallocated). */ /* Advanced functions */ /* The following functions are needed only in some special applications. */ /* ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, int level, int method, int windowBits, int memLevel, int strategy)); This is another version of deflateInit with more compression options. The fields next_in, zalloc, zfree and opaque must be initialized before by the caller. The method parameter is the compression method. It must be Z_DEFLATED in this version of the library. The windowBits parameter is the base two logarithm of the window size (the size of the history buffer). It should be in the range 8..15 for this version of the library. Larger values of this parameter result in better compression at the expense of memory usage. The default value is 15 if deflateInit is used instead. windowBits can also be -8..-15 for raw deflate. In this case, -windowBits determines the window size. deflate() will then generate raw deflate data with no zlib header or trailer, and will not compute an adler32 check value. windowBits can also be greater than 15 for optional gzip encoding. Add 16 to windowBits to write a simple gzip header and trailer around the compressed data instead of a zlib wrapper. The gzip header will have no file name, no extra data, no comment, no modification time (set to zero), no header crc, and the operating system will be set to 255 (unknown). If a gzip stream is being written, strm->adler is a crc32 instead of an adler32. The memLevel parameter specifies how much memory should be allocated for the internal compression state. memLevel=1 uses minimum memory but is slow and reduces compression ratio; memLevel=9 uses maximum memory for optimal speed. The default value is 8. See zconf.h for total memory usage as a function of windowBits and memLevel. The strategy parameter is used to tune the compression algorithm. Use the value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no string match), or Z_RLE to limit match distances to one (run-length encoding). Filtered data consists mostly of small values with a somewhat random distribution. In this case, the compression algorithm is tuned to compress them better. The effect of Z_FILTERED is to force more Huffman coding and less string matching; it is somewhat intermediate between Z_DEFAULT_STRATEGY and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data. The strategy parameter only affects the compression ratio but not the correctness of the compressed output even if it is not set appropriately. Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler decoder for special applications. deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if any parameter is invalid (such as an invalid method), or Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible with the version assumed by the caller (ZLIB_VERSION). msg is set to null if there is no error message. deflateInit2 does not perform any compression: this will be done by deflate(). */ ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, const Bytef *dictionary, uInt dictLength)); /* Initializes the compression dictionary from the given byte sequence without producing any compressed output. This function must be called immediately after deflateInit, deflateInit2 or deflateReset, before any call of deflate. The compressor and decompressor must use exactly the same dictionary (see inflateSetDictionary). The dictionary should consist of strings (byte sequences) that are likely to be encountered later in the data to be compressed, with the most commonly used strings preferably put towards the end of the dictionary. Using a dictionary is most useful when the data to be compressed is short and can be predicted with good accuracy; the data can then be compressed better than with the default empty dictionary. Depending on the size of the compression data structures selected by deflateInit or deflateInit2, a part of the dictionary may in effect be discarded, for example if the dictionary is larger than the window size provided in deflateInit or deflateInit2. Thus the strings most likely to be useful should be put at the end of the dictionary, not at the front. In addition, the current implementation of deflate will use at most the window size minus 262 bytes of the provided dictionary. Upon return of this function, strm->adler is set to the adler32 value of the dictionary; the decompressor may later use this value to determine which dictionary has been used by the compressor. (The adler32 value applies to the whole dictionary even if only a subset of the dictionary is actually used by the compressor.) If a raw deflate was requested, then the adler32 value is not computed and strm->adler is not set. deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is inconsistent (for example if deflate has already been called for this stream or if the compression method is bsort). deflateSetDictionary does not perform any compression: this will be done by deflate(). */ ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, z_streamp source)); /* Sets the destination stream as a complete copy of the source stream. This function can be useful when several compression strategies will be tried, for example when there are several ways of pre-processing the input data with a filter. The streams that will be discarded should then be freed by calling deflateEnd. Note that deflateCopy duplicates the internal compression state which can be quite large, so this strategy is slow and can consume lots of memory. deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc being Z_NULL). msg is left unchanged in both source and destination. */ ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); /* This function is equivalent to deflateEnd followed by deflateInit, but does not free and reallocate all the internal compression state. The stream will keep the same compression level and any other attributes that may have been set by deflateInit2. deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc or state being Z_NULL). */ ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, int level, int strategy)); /* Dynamically update the compression level and compression strategy. The interpretation of level and strategy is as in deflateInit2. This can be used to switch between compression and straight copy of the input data, or to switch to a different kind of input data requiring a different strategy. If the compression level is changed, the input available so far is compressed with the old level (and may be flushed); the new level will take effect only at the next call of deflate(). Before the call of deflateParams, the stream state must be set as for a call of deflate(), since the currently available input may have to be compressed and flushed. In particular, strm->avail_out must be non-zero. deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR if strm->avail_out was zero. */ ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, int good_length, int max_lazy, int nice_length, int max_chain)); /* Fine tune deflate's internal compression parameters. This should only be used by someone who understands the algorithm used by zlib's deflate for searching for the best matching string, and even then only by the most fanatic optimizer trying to squeeze out the last compressed bit for their specific input data. Read the deflate.c source code for the meaning of the max_lazy, good_length, nice_length, and max_chain parameters. deflateTune() can be called after deflateInit() or deflateInit2(), and returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. */ ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, uLong sourceLen)); /* deflateBound() returns an upper bound on the compressed size after deflation of sourceLen bytes. It must be called after deflateInit() or deflateInit2(), and after deflateSetHeader(), if used. This would be used to allocate an output buffer for deflation in a single pass, and so would be called before deflate(). */ ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, int bits, int value)); /* deflatePrime() inserts bits in the deflate output stream. The intent is that this function is used to start off the deflate output with the bits leftover from a previous deflate stream when appending to it. As such, this function can only be used for raw deflate, and must be used before the first deflate() call after a deflateInit2() or deflateReset(). bits must be less than or equal to 16, and that many of the least significant bits of value will be inserted in the output. deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, gz_headerp head)); /* deflateSetHeader() provides gzip header information for when a gzip stream is requested by deflateInit2(). deflateSetHeader() may be called after deflateInit2() or deflateReset() and before the first call of deflate(). The text, time, os, extra field, name, and comment information in the provided gz_header structure are written to the gzip header (xflag is ignored -- the extra flags are set according to the compression level). The caller must assure that, if not Z_NULL, name and comment are terminated with a zero byte, and that if extra is not Z_NULL, that extra_len bytes are available there. If hcrc is true, a gzip header crc is included. Note that the current versions of the command-line version of gzip (up through version 1.3.x) do not support header crc's, and will report that it is a "multi-part gzip file" and give up. If deflateSetHeader is not used, the default gzip header has text false, the time set to zero, and os set to 255, with no extra, name, or comment fields. The gzip header is returned to the default state by deflateReset(). deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ /* ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, int windowBits)); This is another version of inflateInit with an extra parameter. The fields next_in, avail_in, zalloc, zfree and opaque must be initialized before by the caller. The windowBits parameter is the base two logarithm of the maximum window size (the size of the history buffer). It should be in the range 8..15 for this version of the library. The default value is 15 if inflateInit is used instead. windowBits must be greater than or equal to the windowBits value provided to deflateInit2() while compressing, or it must be equal to 15 if deflateInit2() was not used. If a compressed stream with a larger window size is given as input, inflate() will return with the error code Z_DATA_ERROR instead of trying to allocate a larger window. windowBits can also be zero to request that inflate use the window size in the zlib header of the compressed stream. windowBits can also be -8..-15 for raw inflate. In this case, -windowBits determines the window size. inflate() will then process raw deflate data, not looking for a zlib or gzip header, not generating a check value, and not looking for any check values for comparison at the end of the stream. This is for use with other formats that use the deflate compressed data format such as zip. Those formats provide their own check values. If a custom format is developed using the raw deflate format for compressed data, it is recommended that a check value such as an adler32 or a crc32 be applied to the uncompressed data as is done in the zlib, gzip, and zip formats. For most applications, the zlib format should be used as is. Note that comments above on the use in deflateInit2() applies to the magnitude of windowBits. windowBits can also be greater than 15 for optional gzip decoding. Add 32 to windowBits to enable zlib and gzip decoding with automatic header detection, or add 16 to decode only the gzip format (the zlib format will return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a crc32 instead of an adler32. inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_VERSION_ERROR if the zlib library version is incompatible with the version assumed by the caller, or Z_STREAM_ERROR if the parameters are invalid, such as a null pointer to the structure. msg is set to null if there is no error message. inflateInit2 does not perform any decompression apart from possibly reading the zlib header if present: actual decompression will be done by inflate(). (So next_in and avail_in may be modified, but next_out and avail_out are unused and unchanged.) The current implementation of inflateInit2() does not process any header information -- that is deferred until inflate() is called. */ ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, const Bytef *dictionary, uInt dictLength)); /* Initializes the decompression dictionary from the given uncompressed byte sequence. This function must be called immediately after a call of inflate, if that call returned Z_NEED_DICT. The dictionary chosen by the compressor can be determined from the adler32 value returned by that call of inflate. The compressor and decompressor must use exactly the same dictionary (see deflateSetDictionary). For raw inflate, this function can be called immediately after inflateInit2() or inflateReset() and before any call of inflate() to set the dictionary. The application must insure that the dictionary that was used for compression is provided. inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the expected one (incorrect adler32 value). inflateSetDictionary does not perform any decompression: this will be done by subsequent calls of inflate(). */ ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); /* Skips invalid compressed data until a full flush point (see above the description of deflate with Z_FULL_FLUSH) can be found, or until all available input is skipped. No output is provided. inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point has been found, or Z_STREAM_ERROR if the stream structure was inconsistent. In the success case, the application may save the current current value of total_in which indicates where valid compressed data was found. In the error case, the application may repeatedly call inflateSync, providing more input each time, until success or end of the input data. */ ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, z_streamp source)); /* Sets the destination stream as a complete copy of the source stream. This function can be useful when randomly accessing a large stream. The first pass through the stream can periodically record the inflate state, allowing restarting inflate at those points when randomly accessing the stream. inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc being Z_NULL). msg is left unchanged in both source and destination. */ ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); /* This function is equivalent to inflateEnd followed by inflateInit, but does not free and reallocate all the internal decompression state. The stream will keep attributes that may have been set by inflateInit2. inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc or state being Z_NULL). */ ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm, int windowBits)); /* This function is the same as inflateReset, but it also permits changing the wrap and window size requests. The windowBits parameter is interpreted the same as it is for inflateInit2. inflateReset2 returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc or state being Z_NULL), or if the windowBits parameter is invalid. */ ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, int bits, int value)); /* This function inserts bits in the inflate input stream. The intent is that this function is used to start inflating at a bit position in the middle of a byte. The provided bits will be used before any bytes are used from next_in. This function should only be used with raw inflate, and should be used before the first inflate() call after inflateInit2() or inflateReset(). bits must be less than or equal to 16, and that many of the least significant bits of value will be inserted in the input. If bits is negative, then the input stream bit buffer is emptied. Then inflatePrime() can be called again to put bits in the buffer. This is used to clear out bits leftover after feeding inflate a block description prior to feeding inflate codes. inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm)); /* This function returns two values, one in the lower 16 bits of the return value, and the other in the remaining upper bits, obtained by shifting the return value down 16 bits. If the upper value is -1 and the lower value is zero, then inflate() is currently decoding information outside of a block. If the upper value is -1 and the lower value is non-zero, then inflate is in the middle of a stored block, with the lower value equaling the number of bytes from the input remaining to copy. If the upper value is not -1, then it is the number of bits back from the current bit position in the input of the code (literal or length/distance pair) currently being processed. In that case the lower value is the number of bytes already emitted for that code. A code is being processed if inflate is waiting for more input to complete decoding of the code, or if it has completed decoding but is waiting for more output space to write the literal or match data. inflateMark() is used to mark locations in the input data for random access, which may be at bit positions, and to note those cases where the output of a code may span boundaries of random access blocks. The current location in the input stream can be determined from avail_in and data_type as noted in the description for the Z_BLOCK flush parameter for inflate. inflateMark returns the value noted above or -1 << 16 if the provided source stream state was inconsistent. */ ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, gz_headerp head)); /* inflateGetHeader() requests that gzip header information be stored in the provided gz_header structure. inflateGetHeader() may be called after inflateInit2() or inflateReset(), and before the first call of inflate(). As inflate() processes the gzip stream, head->done is zero until the header is completed, at which time head->done is set to one. If a zlib stream is being decoded, then head->done is set to -1 to indicate that there will be no gzip header information forthcoming. Note that Z_BLOCK or Z_TREES can be used to force inflate() to return immediately after header processing is complete and before any actual data is decompressed. The text, time, xflags, and os fields are filled in with the gzip header contents. hcrc is set to true if there is a header CRC. (The header CRC was valid if done is set to one.) If extra is not Z_NULL, then extra_max contains the maximum number of bytes to write to extra. Once done is true, extra_len contains the actual extra field length, and extra contains the extra field, or that field truncated if extra_max is less than extra_len. If name is not Z_NULL, then up to name_max characters are written there, terminated with a zero unless the length is greater than name_max. If comment is not Z_NULL, then up to comm_max characters are written there, terminated with a zero unless the length is greater than comm_max. When any of extra, name, or comment are not Z_NULL and the respective field is not present in the header, then that field is set to Z_NULL to signal its absence. This allows the use of deflateSetHeader() with the returned structure to duplicate the header. However if those fields are set to allocated memory, then the application will need to save those pointers elsewhere so that they can be eventually freed. If inflateGetHeader is not used, then the header information is simply discarded. The header is always checked for validity, including the header CRC if present. inflateReset() will reset the process to discard the header information. The application would need to call inflateGetHeader() again to retrieve the header from the next gzip stream. inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ /* ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, unsigned char FAR *window)); Initialize the internal stream state for decompression using inflateBack() calls. The fields zalloc, zfree and opaque in strm must be initialized before the call. If zalloc and zfree are Z_NULL, then the default library- derived memory allocation routines are used. windowBits is the base two logarithm of the window size, in the range 8..15. window is a caller supplied buffer of that size. Except for special applications where it is assured that deflate was used with small window sizes, windowBits must be 15 and a 32K byte window must be supplied to be able to decompress general deflate streams. See inflateBack() for the usage of these routines. inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of the paramaters are invalid, Z_MEM_ERROR if the internal state could not be allocated, or Z_VERSION_ERROR if the version of the library does not match the version of the header file. */ typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *)); typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, in_func in, void FAR *in_desc, out_func out, void FAR *out_desc)); /* inflateBack() does a raw inflate with a single call using a call-back interface for input and output. This is more efficient than inflate() for file i/o applications in that it avoids copying between the output and the sliding window by simply making the window itself the output buffer. This function trusts the application to not change the output buffer passed by the output function, at least until inflateBack() returns. inflateBackInit() must be called first to allocate the internal state and to initialize the state with the user-provided window buffer. inflateBack() may then be used multiple times to inflate a complete, raw deflate stream with each call. inflateBackEnd() is then called to free the allocated state. A raw deflate stream is one with no zlib or gzip header or trailer. This routine would normally be used in a utility that reads zip or gzip files and writes out uncompressed files. The utility would decode the header and process the trailer on its own, hence this routine expects only the raw deflate stream to decompress. This is different from the normal behavior of inflate(), which expects either a zlib or gzip header and trailer around the deflate stream. inflateBack() uses two subroutines supplied by the caller that are then called by inflateBack() for input and output. inflateBack() calls those routines until it reads a complete deflate stream and writes out all of the uncompressed data, or until it encounters an error. The function's parameters and return types are defined above in the in_func and out_func typedefs. inflateBack() will call in(in_desc, &buf) which should return the number of bytes of provided input, and a pointer to that input in buf. If there is no input available, in() must return zero--buf is ignored in that case--and inflateBack() will return a buffer error. inflateBack() will call out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out() should return zero on success, or non-zero on failure. If out() returns non-zero, inflateBack() will return with an error. Neither in() nor out() are permitted to change the contents of the window provided to inflateBackInit(), which is also the buffer that out() uses to write from. The length written by out() will be at most the window size. Any non-zero amount of input may be provided by in(). For convenience, inflateBack() can be provided input on the first call by setting strm->next_in and strm->avail_in. If that input is exhausted, then in() will be called. Therefore strm->next_in must be initialized before calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in must also be initialized, and then if strm->avail_in is not zero, input will initially be taken from strm->next_in[0 .. strm->avail_in - 1]. The in_desc and out_desc parameters of inflateBack() is passed as the first parameter of in() and out() respectively when they are called. These descriptors can be optionally used to pass any information that the caller- supplied in() and out() functions need to do their job. On return, inflateBack() will set strm->next_in and strm->avail_in to pass back any unused input that was provided by the last in() call. The return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR if in() or out() returned an error, Z_DATA_ERROR if there was a format error in the deflate stream (in which case strm->msg is set to indicate the nature of the error), or Z_STREAM_ERROR if the stream was not properly initialized. In the case of Z_BUF_ERROR, an input or output error can be distinguished using strm->next_in which will be Z_NULL only if in() returned an error. If strm->next_in is not Z_NULL, then the Z_BUF_ERROR was due to out() returning non-zero. (in() will always be called before out(), so strm->next_in is assured to be defined if out() returns non-zero.) Note that inflateBack() cannot return Z_OK. */ ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); /* All memory allocated by inflateBackInit() is freed. inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream state was inconsistent. */ ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); /* Return flags indicating compile-time options. Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: 1.0: size of uInt 3.2: size of uLong 5.4: size of voidpf (pointer) 7.6: size of z_off_t Compiler, assembler, and debug options: 8: DEBUG 9: ASMV or ASMINF -- use ASM code 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention 11: 0 (reserved) One-time table building (smaller code, but not thread-safe if true): 12: BUILDFIXED -- build static block decoding tables when needed 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed 14,15: 0 (reserved) Library content (indicates missing functionality): 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking deflate code when not needed) 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect and decode gzip streams (to avoid linking crc code) 18-19: 0 (reserved) Operation variations (changes in library functionality): 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate 21: FASTEST -- deflate algorithm with only one, lowest compression level 22,23: 0 (reserved) The sprintf variant used by gzprintf (zero is best): 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! 26: 0 = returns value, 1 = void -- 1 means inferred string length returned Remainder: 27-31: 0 (reserved) */ /* utility functions */ /* The following utility functions are implemented on top of the basic stream-oriented functions. To simplify the interface, some default options are assumed (compression level and memory usage, standard memory allocation functions). The source code of these utility functions can be modified if you need special options. */ ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)); /* Compresses the source buffer into the destination buffer. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be at least the value returned by compressBound(sourceLen). Upon exit, destLen is the actual size of the compressed buffer. compress returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer. */ ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen, int level)); /* Compresses the source buffer into the destination buffer. The level parameter has the same meaning as in deflateInit. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be at least the value returned by compressBound(sourceLen). Upon exit, destLen is the actual size of the compressed buffer. compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer, Z_STREAM_ERROR if the level parameter is invalid. */ ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); /* compressBound() returns an upper bound on the compressed size after compress() or compress2() on sourceLen bytes. It would be used before a compress() or compress2() call to allocate the destination buffer. */ ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)); /* Decompresses the source buffer into the destination buffer. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be large enough to hold the entire uncompressed data. (The size of the uncompressed data must have been saved previously by the compressor and transmitted to the decompressor by some mechanism outside the scope of this compression library.) Upon exit, destLen is the actual size of the uncompressed buffer. uncompress returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. */ /* gzip file access functions */ /* This library supports reading and writing files in gzip (.gz) format with an interface similar to that of stdio, using the functions that start with "gz". The gzip format is different from the zlib format. gzip is a gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. */ typedef voidp gzFile; /* opaque gzip file descriptor */ /* ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); Opens a gzip (.gz) file for reading or writing. The mode parameter is as in fopen ("rb" or "wb") but can also include a compression level ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F' for fixed code compression as in "wb9F". (See the description of deflateInit2 for more information about the strategy parameter.) Also "a" can be used instead of "w" to request that the gzip stream that will be written be appended to the file. "+" will result in an error, since reading and writing to the same gzip file is not supported. gzopen can be used to read a file which is not in gzip format; in this case gzread will directly read from the file without decompression. gzopen returns NULL if the file could not be opened, if there was insufficient memory to allocate the gzFile state, or if an invalid mode was specified (an 'r', 'w', or 'a' was not provided, or '+' was provided). errno can be checked to determine if the reason gzopen failed was that the file could not be opened. */ ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); /* gzdopen associates a gzFile with the file descriptor fd. File descriptors are obtained from calls like open, dup, creat, pipe or fileno (if the file has been previously opened with fopen). The mode parameter is as in gzopen. The next call of gzclose on the returned gzFile will also close the file descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor fd. If you want to keep fd open, use fd = dup(fd_keep); gz = gzdopen(fd, mode);. The duplicated descriptor should be saved to avoid a leak, since gzdopen does not close fd if it fails. gzdopen returns NULL if there was insufficient memory to allocate the gzFile state, if an invalid mode was specified (an 'r', 'w', or 'a' was not provided, or '+' was provided), or if fd is -1. The file descriptor is not used until the next gz* read, write, seek, or close operation, so gzdopen will not detect if fd is invalid (unless fd is -1). */ ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); /* Set the internal buffer size used by this library's functions. The default buffer size is 8192 bytes. This function must be called after gzopen() or gzdopen(), and before any other calls that read or write the file. The buffer memory allocation is always deferred to the first read or write. Two buffers are allocated, either both of the specified size when writing, or one of the specified size and the other twice that size when reading. A larger buffer size of, for example, 64K or 128K bytes will noticeably increase the speed of decompression (reading). The new buffer size also affects the maximum length for gzprintf(). gzbuffer() returns 0 on success, or -1 on failure, such as being called too late. */ ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); /* Dynamically update the compression level or strategy. See the description of deflateInit2 for the meaning of these parameters. gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not opened for writing. */ ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); /* Reads the given number of uncompressed bytes from the compressed file. If the input file was not in gzip format, gzread copies the given number of bytes into the buffer. After reaching the end of a gzip stream in the input, gzread will continue to read, looking for another gzip stream, or failing that, reading the rest of the input file directly without decompression. The entire input file will be read if gzread is called until it returns less than the requested len. gzread returns the number of uncompressed bytes actually read, less than len for end of file, or -1 for error. */ ZEXTERN int ZEXPORT gzwrite OF((gzFile file, voidpc buf, unsigned len)); /* Writes the given number of uncompressed bytes into the compressed file. gzwrite returns the number of uncompressed bytes written or 0 in case of error. */ ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...)); /* Converts, formats, and writes the arguments to the compressed file under control of the format string, as in fprintf. gzprintf returns the number of uncompressed bytes actually written, or 0 in case of error. The number of uncompressed bytes written is limited to 8191, or one less than the buffer size given to gzbuffer(). The caller should assure that this limit is not exceeded. If it is exceeded, then gzprintf() will return an error (0) with nothing written. In this case, there may also be a buffer overflow with unpredictable consequences, which is possible only if zlib was compiled with the insecure functions sprintf() or vsprintf() because the secure snprintf() or vsnprintf() functions were not available. This can be determined using zlibCompileFlags(). */ ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); /* Writes the given null-terminated string to the compressed file, excluding the terminating null character. gzputs returns the number of characters written, or -1 in case of error. */ ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); /* Reads bytes from the compressed file until len-1 characters are read, or a newline character is read and transferred to buf, or an end-of-file condition is encountered. If any characters are read or if len == 1, the string is terminated with a null character. If no characters are read due to an end-of-file or len < 1, then the buffer is left untouched. gzgets returns buf which is a null-terminated string, or it returns NULL for end-of-file or in case of error. If there was an error, the contents at buf are indeterminate. */ ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); /* Writes c, converted to an unsigned char, into the compressed file. gzputc returns the value that was written, or -1 in case of error. */ ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); /* Reads one byte from the compressed file. gzgetc returns this byte or -1 in case of end of file or error. */ ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); /* Push one character back onto the stream to be read as the first character on the next read. At least one character of push-back is allowed. gzungetc() returns the character pushed, or -1 on failure. gzungetc() will fail if c is -1, and may fail if a character has been pushed but not read yet. If gzungetc is used immediately after gzopen or gzdopen, at least the output buffer size of pushed characters is allowed. (See gzbuffer above.) The pushed character will be discarded if the stream is repositioned with gzseek() or gzrewind(). */ ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); /* Flushes all pending output into the compressed file. The parameter flush is as in the deflate() function. The return value is the zlib error number (see function gzerror below). gzflush is only permitted when writing. If the flush parameter is Z_FINISH, the remaining data is written and the gzip stream is completed in the output. If gzwrite() is called again, a new gzip stream will be started in the output. gzread() is able to read such concatented gzip streams. gzflush should be called only when strictly necessary because it will degrade compression if called too often. */ /* ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, z_off_t offset, int whence)); Sets the starting position for the next gzread or gzwrite on the given compressed file. The offset represents a number of bytes in the uncompressed data stream. The whence parameter is defined as in lseek(2); the value SEEK_END is not supported. If the file is opened for reading, this function is emulated but can be extremely slow. If the file is opened for writing, only forward seeks are supported; gzseek then compresses a sequence of zeroes up to the new starting position. gzseek returns the resulting offset location as measured in bytes from the beginning of the uncompressed stream, or -1 in case of error, in particular if the file is opened for writing and the new starting position would be before the current position. */ ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); /* Rewinds the given file. This function is supported only for reading. gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) */ /* ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); Returns the starting position for the next gzread or gzwrite on the given compressed file. This position represents a number of bytes in the uncompressed data stream, and is zero when starting, even if appending or reading a gzip stream from the middle of a file using gzdopen(). gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) */ /* ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file)); Returns the current offset in the file being read or written. This offset includes the count of bytes that precede the gzip stream, for example when appending or when using gzdopen() for reading. When reading, the offset does not include as yet unused buffered input. This information can be used for a progress indicator. On error, gzoffset() returns -1. */ ZEXTERN int ZEXPORT gzeof OF((gzFile file)); /* Returns true (1) if the end-of-file indicator has been set while reading, false (0) otherwise. Note that the end-of-file indicator is set only if the read tried to go past the end of the input, but came up short. Therefore, just like feof(), gzeof() may return false even if there is no more data to read, in the event that the last read request was for the exact number of bytes remaining in the input file. This will happen if the input file size is an exact multiple of the buffer size. If gzeof() returns true, then the read functions will return no more data, unless the end-of-file indicator is reset by gzclearerr() and the input file has grown since the previous end of file was detected. */ ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); /* Returns true (1) if file is being copied directly while reading, or false (0) if file is a gzip stream being decompressed. This state can change from false to true while reading the input file if the end of a gzip stream is reached, but is followed by data that is not another gzip stream. If the input file is empty, gzdirect() will return true, since the input does not contain a gzip stream. If gzdirect() is used immediately after gzopen() or gzdopen() it will cause buffers to be allocated to allow reading the file to determine if it is a gzip file. Therefore if gzbuffer() is used, it should be called before gzdirect(). */ ZEXTERN int ZEXPORT gzclose OF((gzFile file)); /* Flushes all pending output if necessary, closes the compressed file and deallocates the (de)compression state. Note that once file is closed, you cannot call gzerror with file, since its structures have been deallocated. gzclose must not be called more than once on the same file, just as free must not be called more than once on the same allocation. gzclose will return Z_STREAM_ERROR if file is not valid, Z_ERRNO on a file operation error, or Z_OK on success. */ ZEXTERN int ZEXPORT gzclose_r OF((gzFile file)); ZEXTERN int ZEXPORT gzclose_w OF((gzFile file)); /* Same as gzclose(), but gzclose_r() is only for use when reading, and gzclose_w() is only for use when writing or appending. The advantage to using these instead of gzclose() is that they avoid linking in zlib compression or decompression code that is not used when only reading or only writing respectively. If gzclose() is used, then both compression and decompression code will be included the application when linking to a static zlib library. */ ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); /* Returns the error message for the last error which occurred on the given compressed file. errnum is set to zlib error number. If an error occurred in the file system and not in the compression library, errnum is set to Z_ERRNO and the application may consult errno to get the exact error code. The application must not modify the returned string. Future calls to this function may invalidate the previously returned string. If file is closed, then the string previously returned by gzerror will no longer be available. gzerror() should be used to distinguish errors from end-of-file for those functions above that do not distinguish those cases in their return values. */ ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); /* Clears the error and end-of-file flags for file. This is analogous to the clearerr() function in stdio. This is useful for continuing to read a gzip file that is being written concurrently. */ /* checksum functions */ /* These functions are not related to compression but are exported anyway because they might be useful in applications using the compression library. */ ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); /* Update a running Adler-32 checksum with the bytes buf[0..len-1] and return the updated checksum. If buf is Z_NULL, this function returns the required initial value for the checksum. An Adler-32 checksum is almost as reliable as a CRC32 but can be computed much faster. Usage example: uLong adler = adler32(0L, Z_NULL, 0); while (read_buffer(buffer, length) != EOF) { adler = adler32(adler, buffer, length); } if (adler != original_adler) error(); */ /* ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, z_off_t len2)); Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. */ ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); /* Update a running CRC-32 with the bytes buf[0..len-1] and return the updated CRC-32. If buf is Z_NULL, this function returns the required initial value for the for the crc. Pre- and post-conditioning (one's complement) is performed within this function so it shouldn't be done by the application. Usage example: uLong crc = crc32(0L, Z_NULL, 0); while (read_buffer(buffer, length) != EOF) { crc = crc32(crc, buffer, length); } if (crc != original_crc) error(); */ /* ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); Combine two CRC-32 check values into one. For two sequences of bytes, seq1 and seq2 with lengths len1 and len2, CRC-32 check values were calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and len2. */ /* various hacks, don't look :) */ /* deflateInit and inflateInit are macros to allow checking the zlib version * and the compiler's view of z_stream: */ ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, const char *version, int stream_size)); ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, const char *version, int stream_size)); ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, int windowBits, int memLevel, int strategy, const char *version, int stream_size)); ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, const char *version, int stream_size)); ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, unsigned char FAR *window, const char *version, int stream_size)); #define deflateInit(strm, level) \ deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream)) #define inflateInit(strm) \ inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream)) #define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ (strategy), ZLIB_VERSION, sizeof(z_stream)) #define inflateInit2(strm, windowBits) \ inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream)) #define inflateBackInit(strm, windowBits, window) \ inflateBackInit_((strm), (windowBits), (window), \ ZLIB_VERSION, sizeof(z_stream)) /* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or * change the regular functions to 64 bits if _FILE_OFFSET_BITS is 64 (if * both are true, the application gets the *64 functions, and the regular * functions are changed to 64 bits) -- in case these are set on systems * without large file support, _LFS64_LARGEFILE must also be true */ #if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t)); ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t)); #endif #if !defined(ZLIB_INTERNAL) && _FILE_OFFSET_BITS-0 == 64 && _LFS64_LARGEFILE-0 # define gzopen gzopen64 # define gzseek gzseek64 # define gztell gztell64 # define gzoffset gzoffset64 # define adler32_combine adler32_combine64 # define crc32_combine crc32_combine64 # ifdef _LARGEFILE64_SOURCE ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); ZEXTERN z_off_t ZEXPORT gzseek64 OF((gzFile, z_off_t, int)); ZEXTERN z_off_t ZEXPORT gztell64 OF((gzFile)); ZEXTERN z_off_t ZEXPORT gzoffset64 OF((gzFile)); ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); # endif #else ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *)); ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int)); ZEXTERN z_off_t ZEXPORT gztell OF((gzFile)); ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile)); ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); #endif /* hack for buggy compilers */ #if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) struct internal_state {int dummy;}; #endif /* undocumented functions */ ZEXTERN const char * ZEXPORT zError OF((int)); ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp)); ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void)); ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int)); #ifdef __cplusplus } #endif #endif /* ZLIB_H */ glpk-5.0/src/zlib/zutil.c0000644000062000006210000001622113766346220014546 0ustar maomkpasswd/* zutil.c -- target dependent utility functions for the compression library * Copyright (C) 1995-2005, 2010 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $Id$ */ #include "zutil.h" #ifndef NO_DUMMY_DECL struct internal_state {int dummy;}; /* for buggy compilers */ #endif const char * const z_errmsg[10] = { "need dictionary", /* Z_NEED_DICT 2 */ "stream end", /* Z_STREAM_END 1 */ "", /* Z_OK 0 */ "file error", /* Z_ERRNO (-1) */ "stream error", /* Z_STREAM_ERROR (-2) */ "data error", /* Z_DATA_ERROR (-3) */ "insufficient memory", /* Z_MEM_ERROR (-4) */ "buffer error", /* Z_BUF_ERROR (-5) */ "incompatible version",/* Z_VERSION_ERROR (-6) */ ""}; const char * ZEXPORT zlibVersion() { return ZLIB_VERSION; } uLong ZEXPORT zlibCompileFlags() { uLong flags; flags = 0; switch ((int)(sizeof(uInt))) { case 2: break; case 4: flags += 1; break; case 8: flags += 2; break; default: flags += 3; } switch ((int)(sizeof(uLong))) { case 2: break; case 4: flags += 1 << 2; break; case 8: flags += 2 << 2; break; default: flags += 3 << 2; } switch ((int)(sizeof(voidpf))) { case 2: break; case 4: flags += 1 << 4; break; case 8: flags += 2 << 4; break; default: flags += 3 << 4; } switch ((int)(sizeof(z_off_t))) { case 2: break; case 4: flags += 1 << 6; break; case 8: flags += 2 << 6; break; default: flags += 3 << 6; } #ifdef DEBUG flags += 1 << 8; #endif #if defined(ASMV) || defined(ASMINF) flags += 1 << 9; #endif #ifdef ZLIB_WINAPI flags += 1 << 10; #endif #ifdef BUILDFIXED flags += 1 << 12; #endif #ifdef DYNAMIC_CRC_TABLE flags += 1 << 13; #endif #ifdef NO_GZCOMPRESS flags += 1L << 16; #endif #ifdef NO_GZIP flags += 1L << 17; #endif #ifdef PKZIP_BUG_WORKAROUND flags += 1L << 20; #endif #ifdef FASTEST flags += 1L << 21; #endif #ifdef STDC # ifdef NO_vsnprintf flags += 1L << 25; # ifdef HAS_vsprintf_void flags += 1L << 26; # endif # else # ifdef HAS_vsnprintf_void flags += 1L << 26; # endif # endif #else flags += 1L << 24; # ifdef NO_snprintf flags += 1L << 25; # ifdef HAS_sprintf_void flags += 1L << 26; # endif # else # ifdef HAS_snprintf_void flags += 1L << 26; # endif # endif #endif return flags; } #ifdef DEBUG # ifndef verbose # define verbose 0 # endif int ZLIB_INTERNAL z_verbose = verbose; void ZLIB_INTERNAL z_error (m) char *m; { fprintf(stderr, "%s\n", m); exit(1); } #endif /* exported to allow conversion of error code to string for compress() and * uncompress() */ const char * ZEXPORT zError(err) int err; { return ERR_MSG(err); } #if defined(_WIN32_WCE) /* The Microsoft C Run-Time Library for Windows CE doesn't have * errno. We define it as a global variable to simplify porting. * Its value is always 0 and should not be used. */ int errno = 0; #endif #ifndef HAVE_MEMCPY void ZLIB_INTERNAL zmemcpy(dest, source, len) Bytef* dest; const Bytef* source; uInt len; { if (len == 0) return; do { *dest++ = *source++; /* ??? to be unrolled */ } while (--len != 0); } int ZLIB_INTERNAL zmemcmp(s1, s2, len) const Bytef* s1; const Bytef* s2; uInt len; { uInt j; for (j = 0; j < len; j++) { if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; } return 0; } void ZLIB_INTERNAL zmemzero(dest, len) Bytef* dest; uInt len; { if (len == 0) return; do { *dest++ = 0; /* ??? to be unrolled */ } while (--len != 0); } #endif #ifdef SYS16BIT #ifdef __TURBOC__ /* Turbo C in 16-bit mode */ # define MY_ZCALLOC /* Turbo C malloc() does not allow dynamic allocation of 64K bytes * and farmalloc(64K) returns a pointer with an offset of 8, so we * must fix the pointer. Warning: the pointer must be put back to its * original form in order to free it, use zcfree(). */ #define MAX_PTR 10 /* 10*64K = 640K */ local int next_ptr = 0; typedef struct ptr_table_s { voidpf org_ptr; voidpf new_ptr; } ptr_table; local ptr_table table[MAX_PTR]; /* This table is used to remember the original form of pointers * to large buffers (64K). Such pointers are normalized with a zero offset. * Since MSDOS is not a preemptive multitasking OS, this table is not * protected from concurrent access. This hack doesn't work anyway on * a protected system like OS/2. Use Microsoft C instead. */ voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, unsigned size) { voidpf buf = opaque; /* just to make some compilers happy */ ulg bsize = (ulg)items*size; /* If we allocate less than 65520 bytes, we assume that farmalloc * will return a usable pointer which doesn't have to be normalized. */ if (bsize < 65520L) { buf = farmalloc(bsize); if (*(ush*)&buf != 0) return buf; } else { buf = farmalloc(bsize + 16L); } if (buf == NULL || next_ptr >= MAX_PTR) return NULL; table[next_ptr].org_ptr = buf; /* Normalize the pointer to seg:0 */ *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4; *(ush*)&buf = 0; table[next_ptr++].new_ptr = buf; return buf; } void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) { int n; if (*(ush*)&ptr != 0) { /* object < 64K */ farfree(ptr); return; } /* Find the original pointer */ for (n = 0; n < next_ptr; n++) { if (ptr != table[n].new_ptr) continue; farfree(table[n].org_ptr); while (++n < next_ptr) { table[n-1] = table[n]; } next_ptr--; return; } ptr = opaque; /* just to make some compilers happy */ Assert(0, "zcfree: ptr not found"); } #endif /* __TURBOC__ */ #ifdef M_I86 /* Microsoft C in 16-bit mode */ # define MY_ZCALLOC #if (!defined(_MSC_VER) || (_MSC_VER <= 600)) # define _halloc halloc # define _hfree hfree #endif voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, uInt items, uInt size) { if (opaque) opaque = 0; /* to make compiler happy */ return _halloc((long)items, size); } void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) { if (opaque) opaque = 0; /* to make compiler happy */ _hfree(ptr); } #endif /* M_I86 */ #endif /* SYS16BIT */ #ifndef MY_ZCALLOC /* Any system without a special alloc function */ #ifndef STDC extern voidp malloc OF((uInt size)); extern voidp calloc OF((uInt items, uInt size)); extern void free OF((voidpf ptr)); #endif voidpf ZLIB_INTERNAL zcalloc (opaque, items, size) voidpf opaque; unsigned items; unsigned size; { if (opaque) items += size - size; /* make compiler happy */ return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : (voidpf)calloc(items, size); } void ZLIB_INTERNAL zcfree (opaque, ptr) voidpf opaque; voidpf ptr; { free(ptr); if (opaque) return; /* make compiler happy */ } #endif /* MY_ZCALLOC */ glpk-5.0/src/zlib/zutil.h0000644000062000006210000000435513766346220014560 0ustar maomkpasswd/* zutil.h (internal interface of the zlib compression library) */ /* Modified by Andrew Makhorin , April 2011 */ /* Copyright (C) 1995-2010 Jean-loup Gailly * For conditions of distribution and use, see copyright notice in * zlib.h */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ #ifndef ZUTIL_H #define ZUTIL_H #define ZLIB_INTERNAL #include "zlib.h" #include #include #include #define local static typedef unsigned char uch; typedef uch uchf; typedef unsigned short ush; typedef ush ushf; typedef unsigned long ulg; extern const char * const z_errmsg[10]; #define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] #define ERR_RETURN(strm, err) \ return (strm->msg = (char *)ERR_MSG(err), (err)) #define DEF_WBITS MAX_WBITS #if MAX_MEM_LEVEL >= 8 #define DEF_MEM_LEVEL 8 #else #define DEF_MEM_LEVEL MAX_MEM_LEVEL #endif #define STORED_BLOCK 0 #define STATIC_TREES 1 #define DYN_TREES 2 #define MIN_MATCH 3 #define MAX_MATCH 258 #define PRESET_DICT 0x20 #define OS_CODE 0x03 /* assume Unix */ #define HAVE_MEMCPY 1 #define zmemcpy memcpy #define zmemzero(dest, len) memset(dest, 0, len) #ifdef DEBUG #include extern int ZLIB_INTERNAL z_verbose; extern void ZLIB_INTERNAL z_error OF((char *m)); #define Assert(cond, msg) { if(!(cond)) z_error(msg); } #define Trace(x) { if (z_verbose >= 0) fprintf x; } #define Tracev(x) { if (z_verbose > 0) fprintf x; } #define Tracevv(x) {if (z_verbose > 1) fprintf x; } #define Tracec(c, x) {if (z_verbose > 0 && (c)) fprintf x; } #define Tracecv(c, x) {if (z_verbose > 1 && (c)) fprintf x; } #else #define Assert(cond, msg) #define Trace(x) #define Tracev(x) #define Tracevv(x) #define Tracec(c, x) #define Tracecv(c, x) #endif voidpf ZLIB_INTERNAL zcalloc OF((voidpf opaque, unsigned items, unsigned size)); void ZLIB_INTERNAL zcfree OF((voidpf opaque, voidpf ptr)); #define ZALLOC(strm, items, size) \ (*((strm)->zalloc))((strm)->opaque, (items), (size)) #define ZFREE(strm, addr) \ (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) #define TRY_FREE(s, p) { if (p) ZFREE(s, p); } #endif /* eof */ glpk-5.0/THANKS0000644000062000006210000001653313766346220012425 0ustar maomkpasswdAchim Gaedke for bug report. Alexandre Oliva for bug report. Andre Girard for bug report. Andrew Hamilton-Wright for bug report. Andrew Hood for bug report. Anne-Laurence Putz for bug report. Anton Voropaev for bug and typo report. Axel Simon for bug report. Balaco Baco for bug report. Bernhard Schmidt for bug report. Boris Wirtz for bug report. Brady Hunsaker for contribution of a routine for bounds sensitivity analysis. Brady Hunsaker for some suggestions concerning MIP routines. Brian Gladman for suggestion. Cameron Kellough for bug report. Carlo Baldassi for bug report. Cedric[FR] for bug report. Charles Brixko for bug report. Chris Matrakidis for contribution of a patch that implements the tan function in MathProg. Chris Matrakidis for numerous useful suggestions, contributions, and patches. Chris Rosebrugh for contribution of a new version of GLPK JNI (Java Native Interface). Christophe Caron for bug report. David Monniaux for some suggestions. David Monniaux for bug report. David T. Price for bug report. Dennis Schridde for bug report. Enric Rodriguez for bug report. Flavio Keidi Miyazawa for bug report. Gabriel Hackebeil for bug report. Giles Thompson for bug report. Giorgio Sartor <0gioker0@gmail.com> for contribution of routines that implement the proximity search heuristic for MIP. Graham Rockwell for bug report. Hans Schwengeler for bug report. Harley Mackenzie for contribution of GLPK FAQ. Dr. Harley Mackenzie for two example MathProg models (curve fitting problem). Heinrich Schuchardt for contribution of makefiles and testing the package under 64-bit Windows. Heinrich Schuchardt for contribution of two MathProg table drivers for iODBC and MySQL. Heinrich Schuchardt for some patches for the MathProg translator. Heinrich Schuchardt for testing the package on 32- and 64-bit MS Windows platforms. Ivan Luzzi for comments concerning CPLEX LP format. Ivo van Baren for contribution of GLPK DELI (Delphi Interface). Jan Engelhardt for some suggestions. Jeffrey Kantor for reporting typos in the MathProg language reference. Jeroen Demeyer for suggestion. Jeroen Demeyer for bug report. Jiri Spitz for bug report. Joao Flavio de Freitas Almeida for translation of the document "Modeling Language GNU MathProg" to Brazilian Portuguese (pt-BR). Joey Rios for some suggestions. Jonathan Senning for bug report. Karel Zimmermann for bug report. Kelly Westbrooks for suggestions. Kendall Demaree for bug report. Kjell Eikland for bug report. Larry D'Agostino for example model in MathProg. Luiz Bettoni for some suggestions. Marco Atzeri for bug report. Marco Atzeri for bug report. Mark Meketon for bug report. Markus Pilz for bug report. Martin Jacob for bug report. Mike Appleby for example model in MathProg. Minh Ha Duong for fixing doc typos. Morten Welinder for bug report. Morten Welinder for bug report. Nelson H. F. Beebe for bug report. Nicolo Giorgetti for contribution of GLPKMEX, a Matlab MEX interface. Niels Klitgord for bug report. Nigel Galloway for an example MathProg model. Nigel Galloway for an example program in C#. Nigel Galloway for bug report. Nigel Galloway for example models in MathProg. Noli Sicad for testing glpk under Mac OS. Noli Sicad for example model in MathProg. Olivier for bug report. Oscar Gustafsson for contribution of a routine to write data in OPB (pseudo boolean) format. Pablo Yapura for translation of the document "Modeling Language GNU MathProg" to Spanish. Pedro P. Wong for bug report. Peter T. Breuer for bug report. Peter A. Huegler for bug report. Peter Ingerfeld for bug report. Peter Lee for example LP model and bug report. Peter Naszvadi for example models in MathProg. Pietro Scionti for report typos found in the reference manual. Rafael Laboissiere for useful advices concerning shared library support under GNU/Linux. Raniere Gaia Costa da Silva for bug report. Remy Roy for bug report. Rob Schroeder for bug report. Robbie Morrison for correcting the glpk manual. Robert Wood for example model in MathProg. Roberto Bagnara (Department of Mathematics, University of Parma, Italy) for bug report. Sami Farin for bug report. Sebastian Nowozin for example models in MathProg. Sebastien Briais for bug report. Sebastien de Menten for bug report. Sebastien Villemot for bug report. Stefan Vigerske for bug report. Stefan Vigerske for bug report. Sylvain Fournier for bug report. Thomas Kahle for some suggestions. Uday Venkatadri for bug report. Vijay Patil for testing the package under Windows XP. Vlahos Kiriakos for bug report. Xypron for bug fixing and some improvments in the FPUMP module. Xypron for bug patch. Xypron for contribution and testing batch scripts to build Glpk with MS Visual Studio 2010. Xypron for improving the SQL table driver. Xypron for testing GLPK on 64-bit platforms and for maintaining Windows versions of the package. Yuri Victorovich for contribution of GLPK Java binding. glpk-5.0/w32/0000755000062000006210000000000013766346220012115 5ustar maomkpasswdglpk-5.0/w32/Build_GLPK_with_VC10.bat0000777000062000006210000000051313766346220016253 0ustar maomkpasswdrem Build GLPK with Microsoft Visual Studio Express 2010 rem NOTE: Make sure that HOME variable specifies correct path set HOME="C:\Program Files\Microsoft Visual Studio 10.0\VC" call %HOME%\vcvarsall.bat x86 copy config_VC config.h %HOME%\bin\nmake.exe /f Makefile_VC %HOME%\bin\nmake.exe /f Makefile_VC check pause glpk-5.0/w32/Build_GLPK_with_VC10_DLL.bat0000777000062000006210000000052713766346220016753 0ustar maomkpasswdrem Build GLPK DLL with Microsoft Visual Studio Express 2010 rem NOTE: Make sure that HOME variable specifies correct path set HOME="C:\Program Files\Microsoft Visual Studio 10.0\VC" call %HOME%\vcvarsall.bat x86 copy config_VC config.h %HOME%\bin\nmake.exe /f Makefile_VC_DLL %HOME%\bin\nmake.exe /f Makefile_VC_DLL check pause glpk-5.0/w32/Build_GLPK_with_VC10_stdcall_DLL.bat0000777000062000006210000000054713766346220020463 0ustar maomkpasswdrem Build GLPK DLL with Microsoft Visual Studio Express 2010 rem NOTE: Make sure that HOME variable specifies correct path set HOME="C:\Program Files\Microsoft Visual Studio 10.0\VC" call %HOME%\vcvarsall.bat x86 copy config_VC config.h %HOME%\bin\nmake.exe /f Makefile_VC_stdcall_DLL %HOME%\bin\nmake.exe /f Makefile_VC_stdcall_DLL check pause glpk-5.0/w32/Build_GLPK_with_VC14.bat0000777000062000006210000000051513766346220016261 0ustar maomkpasswdrem Build GLPK with Microsoft Visual Studio Community 2015 rem NOTE: Make sure that HOME variable specifies correct path set HOME="C:\Program Files\Microsoft Visual Studio 14.0\VC" call %HOME%\vcvarsall.bat x86 copy config_VC config.h %HOME%\bin\nmake.exe /f Makefile_VC %HOME%\bin\nmake.exe /f Makefile_VC check pause glpk-5.0/w32/Build_GLPK_with_VC14_DLL.bat0000777000062000006210000000053113766346220016752 0ustar maomkpasswdrem Build GLPK DLL with Microsoft Visual Studio Community 2015 rem NOTE: Make sure that HOME variable specifies correct path set HOME="C:\Program Files\Microsoft Visual Studio 14.0\VC" call %HOME%\vcvarsall.bat x86 copy config_VC config.h %HOME%\bin\nmake.exe /f Makefile_VC_DLL %HOME%\bin\nmake.exe /f Makefile_VC_DLL check pause glpk-5.0/w32/Build_GLPK_with_VC9.bat0000777000062000006210000000051113766346220016201 0ustar maomkpasswdrem Build GLPK with Microsoft Visual Studio Express 2008 rem NOTE: Make sure that HOME variable specifies correct path set HOME="C:\Program Files\Microsoft Visual Studio 9.0\VC" call %HOME%\bin\vcvars32.bat copy config_VC config.h %HOME%\bin\nmake.exe /f Makefile_VC %HOME%\bin\nmake.exe /f Makefile_VC check pause glpk-5.0/w32/Build_GLPK_with_VC9_DLL.bat0000777000062000006210000000052513766346220016701 0ustar maomkpasswdrem Build GLPK DLL with Microsoft Visual Studio Express 2008 rem NOTE: Make sure that HOME variable specifies correct path set HOME="C:\Program Files\Microsoft Visual Studio 9.0\VC" call %HOME%\bin\vcvars32.bat copy config_VC config.h %HOME%\bin\nmake.exe /f Makefile_VC_DLL %HOME%\bin\nmake.exe /f Makefile_VC_DLL check pause glpk-5.0/w32/config_VC0000644000062000006210000000062113766346220013674 0ustar maomkpasswd/* GLPK configuration file (Microsoft Visual Studio Express) */ #define __WOE__ 1 #define TLS __declspec(thread) /* thread local storage-class specifier for reentrancy */ #define ODBC_DLNAME "odbc32.dll" /* ODBC shared library name if this feature is enabled */ #if 0 #define MYSQL_DLNAME "libmysql.dll" /* MySQL shared library name if this feature is enabled */ #endif /* eof */ glpk-5.0/w32/glpk_5_0.def0000644000062000006210000000745713766346220014212 0ustar maomkpasswdLIBRARY glpk_5_0 VERSION 5.0 DESCRIPTION "GNU Linear Programming Kit" EXPORTS glp_create_prob glp_set_prob_name glp_set_obj_name glp_set_obj_dir glp_add_rows glp_add_cols glp_set_row_name glp_set_col_name glp_set_row_bnds glp_set_col_bnds glp_set_obj_coef glp_set_mat_row glp_set_mat_col glp_load_matrix glp_check_dup glp_sort_matrix glp_del_rows glp_del_cols glp_copy_prob glp_erase_prob glp_delete_prob glp_get_prob_name glp_get_obj_name glp_get_obj_dir glp_get_num_rows glp_get_num_cols glp_get_row_name glp_get_col_name glp_get_row_type glp_get_row_lb glp_get_row_ub glp_get_col_type glp_get_col_lb glp_get_col_ub glp_get_obj_coef glp_get_num_nz glp_get_mat_row glp_get_mat_col glp_create_index glp_find_row glp_find_col glp_delete_index glp_set_rii glp_set_sjj glp_get_rii glp_get_sjj glp_scale_prob glp_unscale_prob glp_set_row_stat glp_set_col_stat glp_std_basis glp_adv_basis glp_cpx_basis glp_simplex glp_exact glp_init_smcp glp_get_status glp_get_prim_stat glp_get_dual_stat glp_get_obj_val glp_get_row_stat glp_get_row_prim glp_get_row_dual glp_get_col_stat glp_get_col_prim glp_get_col_dual glp_get_unbnd_ray glp_get_it_cnt glp_set_it_cnt glp_interior glp_init_iptcp glp_ipt_status glp_ipt_obj_val glp_ipt_row_prim glp_ipt_row_dual glp_ipt_col_prim glp_ipt_col_dual glp_set_col_kind glp_get_col_kind glp_get_num_int glp_get_num_bin glp_intopt glp_init_iocp glp_mip_status glp_mip_obj_val glp_mip_row_val glp_mip_col_val glp_check_kkt glp_print_sol glp_read_sol glp_write_sol glp_print_ranges glp_print_ipt glp_read_ipt glp_write_ipt glp_print_mip glp_read_mip glp_write_mip glp_bf_exists glp_factorize glp_bf_updated glp_get_bfcp glp_set_bfcp glp_get_bhead glp_get_row_bind glp_get_col_bind glp_ftran glp_btran glp_warm_up glp_eval_tab_row glp_eval_tab_col glp_transform_row glp_transform_col glp_prim_rtest glp_dual_rtest glp_analyze_bound glp_analyze_coef glp_npp_alloc_wksp glp_npp_load_prob glp_npp_preprocess1 glp_npp_build_prob glp_npp_postprocess glp_npp_obtain_sol glp_npp_free_wksp glp_ios_reason glp_ios_get_prob glp_ios_tree_size glp_ios_curr_node glp_ios_next_node glp_ios_prev_node glp_ios_up_node glp_ios_node_level glp_ios_node_bound glp_ios_best_node glp_ios_mip_gap glp_ios_node_data glp_ios_row_attr glp_ios_pool_size glp_ios_add_row glp_ios_del_row glp_ios_clear_pool glp_ios_can_branch glp_ios_branch_upon glp_ios_select_node glp_ios_heur_sol glp_ios_terminate glp_init_mpscp glp_read_mps glp_write_mps glp_init_cpxcp glp_read_lp glp_write_lp glp_read_prob glp_write_prob glp_mpl_alloc_wksp glp_mpl_init_rand glp_mpl_read_model glp_mpl_read_data glp_mpl_generate glp_mpl_build_prob glp_mpl_postsolve glp_mpl_free_wksp glp_read_cnfsat glp_check_cnfsat glp_write_cnfsat glp_minisat1 glp_intfeas1 glp_init_env glp_version glp_config glp_free_env glp_puts glp_printf glp_vprintf glp_term_out glp_term_hook glp_open_tee glp_close_tee glp_error_ glp_at_error glp_assert_ glp_error_hook glp_alloc glp_realloc glp_free glp_mem_limit glp_mem_usage glp_time glp_difftime glp_create_graph glp_set_graph_name glp_add_vertices glp_set_vertex_name glp_add_arc glp_del_vertices glp_del_arc glp_erase_graph glp_delete_graph glp_create_v_index glp_find_vertex glp_delete_v_index glp_read_graph glp_write_graph glp_mincost_lp glp_mincost_okalg glp_mincost_relax4 glp_maxflow_lp glp_maxflow_ffalg glp_check_asnprob glp_asnprob_lp glp_asnprob_okalg glp_asnprob_hall glp_cpp glp_read_mincost glp_write_mincost glp_read_maxflow glp_write_maxflow glp_read_asnprob glp_write_asnprob glp_read_ccdata glp_write_ccdata glp_netgen glp_netgen_prob glp_gridgen glp_rmfgen glp_weak_comp glp_strong_comp glp_top_sort glp_wclique_exact ;; end of file ;; glpk-5.0/w32/glpk_5_0_stdcall.def0000644000062000006210000000746713766346220015721 0ustar maomkpasswdLIBRARY glpk_5_0_stdcall VERSION 5.0 DESCRIPTION "GNU Linear Programming Kit" EXPORTS glp_create_prob glp_set_prob_name glp_set_obj_name glp_set_obj_dir glp_add_rows glp_add_cols glp_set_row_name glp_set_col_name glp_set_row_bnds glp_set_col_bnds glp_set_obj_coef glp_set_mat_row glp_set_mat_col glp_load_matrix glp_check_dup glp_sort_matrix glp_del_rows glp_del_cols glp_copy_prob glp_erase_prob glp_delete_prob glp_get_prob_name glp_get_obj_name glp_get_obj_dir glp_get_num_rows glp_get_num_cols glp_get_row_name glp_get_col_name glp_get_row_type glp_get_row_lb glp_get_row_ub glp_get_col_type glp_get_col_lb glp_get_col_ub glp_get_obj_coef glp_get_num_nz glp_get_mat_row glp_get_mat_col glp_create_index glp_find_row glp_find_col glp_delete_index glp_set_rii glp_set_sjj glp_get_rii glp_get_sjj glp_scale_prob glp_unscale_prob glp_set_row_stat glp_set_col_stat glp_std_basis glp_adv_basis glp_cpx_basis glp_simplex glp_exact glp_init_smcp glp_get_status glp_get_prim_stat glp_get_dual_stat glp_get_obj_val glp_get_row_stat glp_get_row_prim glp_get_row_dual glp_get_col_stat glp_get_col_prim glp_get_col_dual glp_get_unbnd_ray glp_get_it_cnt glp_set_it_cnt glp_interior glp_init_iptcp glp_ipt_status glp_ipt_obj_val glp_ipt_row_prim glp_ipt_row_dual glp_ipt_col_prim glp_ipt_col_dual glp_set_col_kind glp_get_col_kind glp_get_num_int glp_get_num_bin glp_intopt glp_init_iocp glp_mip_status glp_mip_obj_val glp_mip_row_val glp_mip_col_val glp_check_kkt glp_print_sol glp_read_sol glp_write_sol glp_print_ranges glp_print_ipt glp_read_ipt glp_write_ipt glp_print_mip glp_read_mip glp_write_mip glp_bf_exists glp_factorize glp_bf_updated glp_get_bfcp glp_set_bfcp glp_get_bhead glp_get_row_bind glp_get_col_bind glp_ftran glp_btran glp_warm_up glp_eval_tab_row glp_eval_tab_col glp_transform_row glp_transform_col glp_prim_rtest glp_dual_rtest glp_analyze_bound glp_analyze_coef glp_npp_alloc_wksp glp_npp_load_prob glp_npp_preprocess1 glp_npp_build_prob glp_npp_postprocess glp_npp_obtain_sol glp_npp_free_wksp glp_ios_reason glp_ios_get_prob glp_ios_tree_size glp_ios_curr_node glp_ios_next_node glp_ios_prev_node glp_ios_up_node glp_ios_node_level glp_ios_node_bound glp_ios_best_node glp_ios_mip_gap glp_ios_node_data glp_ios_row_attr glp_ios_pool_size glp_ios_add_row glp_ios_del_row glp_ios_clear_pool glp_ios_can_branch glp_ios_branch_upon glp_ios_select_node glp_ios_heur_sol glp_ios_terminate glp_init_mpscp glp_read_mps glp_write_mps glp_init_cpxcp glp_read_lp glp_write_lp glp_read_prob glp_write_prob glp_mpl_alloc_wksp glp_mpl_init_rand glp_mpl_read_model glp_mpl_read_data glp_mpl_generate glp_mpl_build_prob glp_mpl_postsolve glp_mpl_free_wksp glp_read_cnfsat glp_check_cnfsat glp_write_cnfsat glp_minisat1 glp_intfeas1 glp_init_env glp_version glp_config glp_free_env glp_puts glp_printf glp_vprintf glp_term_out glp_term_hook glp_open_tee glp_close_tee glp_error_ glp_at_error glp_assert_ glp_error_hook glp_alloc glp_realloc glp_free glp_mem_limit glp_mem_usage glp_time glp_difftime glp_create_graph glp_set_graph_name glp_add_vertices glp_set_vertex_name glp_add_arc glp_del_vertices glp_del_arc glp_erase_graph glp_delete_graph glp_create_v_index glp_find_vertex glp_delete_v_index glp_read_graph glp_write_graph glp_mincost_lp glp_mincost_okalg glp_mincost_relax4 glp_maxflow_lp glp_maxflow_ffalg glp_check_asnprob glp_asnprob_lp glp_asnprob_okalg glp_asnprob_hall glp_cpp glp_read_mincost glp_write_mincost glp_read_maxflow glp_write_maxflow glp_read_asnprob glp_write_asnprob glp_read_ccdata glp_write_ccdata glp_netgen glp_netgen_prob glp_gridgen glp_rmfgen glp_weak_comp glp_strong_comp glp_top_sort glp_wclique_exact ;; end of file ;; glpk-5.0/w32/Makefile_VC0000644000062000006210000001422713766346220014153 0ustar maomkpasswd## Build GLPK with Microsoft Visual Studio Express ## CFLAGS = \ /I. \ /I..\src \ /I..\src\amd \ /I..\src\api \ /I..\src\bflib \ /I..\src\colamd \ /I..\src\draft \ /I..\src\env \ /I..\src\intopt \ /I..\src\minisat \ /I..\src\misc \ /I..\src\mpl \ /I..\src\npp \ /I..\src\proxy \ /I..\src\simplex \ /I..\src\zlib \ /DHAVE_CONFIG_H=1 \ /D_CRT_SECURE_NO_WARNINGS=1 \ /nologo \ /W3 \ /O2 \ /Zi OBJSET = \ ..\src\amd\amd_1.obj \ ..\src\amd\amd_2.obj \ ..\src\amd\amd_aat.obj \ ..\src\amd\amd_control.obj \ ..\src\amd\amd_defaults.obj \ ..\src\amd\amd_dump.obj \ ..\src\amd\amd_info.obj \ ..\src\amd\amd_order.obj \ ..\src\amd\amd_post_tree.obj \ ..\src\amd\amd_postorder.obj \ ..\src\amd\amd_preprocess.obj \ ..\src\amd\amd_valid.obj \ ..\src\api\advbas.obj \ ..\src\api\asnhall.obj \ ..\src\api\asnlp.obj \ ..\src\api\asnokalg.obj \ ..\src\api\ckasn.obj \ ..\src\api\ckcnf.obj \ ..\src\api\cplex.obj \ ..\src\api\cpp.obj \ ..\src\api\cpxbas.obj \ ..\src\api\graph.obj \ ..\src\api\gridgen.obj \ ..\src\api\intfeas1.obj \ ..\src\api\maxffalg.obj \ ..\src\api\maxflp.obj \ ..\src\api\mcflp.obj \ ..\src\api\mcfokalg.obj \ ..\src\api\mcfrelax.obj \ ..\src\api\minisat1.obj \ ..\src\api\mpl.obj \ ..\src\api\mps.obj \ ..\src\api\netgen.obj \ ..\src\api\npp.obj \ ..\src\api\pript.obj \ ..\src\api\prmip.obj \ ..\src\api\prob1.obj \ ..\src\api\prob2.obj \ ..\src\api\prob3.obj \ ..\src\api\prob4.obj \ ..\src\api\prob5.obj \ ..\src\api\prrngs.obj \ ..\src\api\prsol.obj \ ..\src\api\rdasn.obj \ ..\src\api\rdcc.obj \ ..\src\api\rdcnf.obj \ ..\src\api\rdipt.obj \ ..\src\api\rdmaxf.obj \ ..\src\api\rdmcf.obj \ ..\src\api\rdmip.obj \ ..\src\api\rdprob.obj \ ..\src\api\rdsol.obj \ ..\src\api\rmfgen.obj \ ..\src\api\strong.obj \ ..\src\api\topsort.obj \ ..\src\api\weak.obj \ ..\src\api\wcliqex.obj \ ..\src\api\wrasn.obj \ ..\src\api\wrcc.obj \ ..\src\api\wrcnf.obj \ ..\src\api\wript.obj \ ..\src\api\wrmaxf.obj \ ..\src\api\wrmcf.obj \ ..\src\api\wrmip.obj \ ..\src\api\wrprob.obj \ ..\src\api\wrsol.obj \ ..\src\bflib\btf.obj \ ..\src\bflib\btfint.obj \ ..\src\bflib\fhv.obj \ ..\src\bflib\fhvint.obj \ ..\src\bflib\ifu.obj \ ..\src\bflib\luf.obj \ ..\src\bflib\lufint.obj \ ..\src\bflib\scf.obj \ ..\src\bflib\scfint.obj \ ..\src\bflib\sgf.obj \ ..\src\bflib\sva.obj \ ..\src\colamd\colamd.obj \ ..\src\draft\bfd.obj \ ..\src\draft\bfx.obj \ ..\src\draft\glpapi06.obj \ ..\src\draft\glpapi07.obj \ ..\src\draft\glpapi08.obj \ ..\src\draft\glpapi09.obj \ ..\src\draft\glpapi10.obj \ ..\src\draft\glpapi12.obj \ ..\src\draft\glpapi13.obj \ ..\src\draft\glpios01.obj \ ..\src\draft\glpios02.obj \ ..\src\draft\glpios03.obj \ ..\src\draft\glpios07.obj \ ..\src\draft\glpios09.obj \ ..\src\draft\glpios11.obj \ ..\src\draft\glpios12.obj \ ..\src\draft\glpipm.obj \ ..\src\draft\glpmat.obj \ ..\src\draft\glpscl.obj \ ..\src\draft\glpssx01.obj \ ..\src\draft\glpssx02.obj \ ..\src\draft\lux.obj \ ..\src\env\alloc.obj \ ..\src\env\dlsup.obj \ ..\src\env\env.obj \ ..\src\env\error.obj \ ..\src\env\stdc.obj \ ..\src\env\stdout.obj \ ..\src\env\stream.obj \ ..\src\env\time.obj \ ..\src\env\tls.obj \ ..\src\intopt\cfg.obj \ ..\src\intopt\cfg1.obj \ ..\src\intopt\cfg2.obj \ ..\src\intopt\clqcut.obj \ ..\src\intopt\covgen.obj \ ..\src\intopt\fpump.obj \ ..\src\intopt\gmicut.obj \ ..\src\intopt\gmigen.obj \ ..\src\intopt\mirgen.obj \ ..\src\intopt\spv.obj \ ..\src\minisat\minisat.obj \ ..\src\misc\avl.obj \ ..\src\misc\bignum.obj \ ..\src\misc\dimacs.obj \ ..\src\misc\dmp.obj \ ..\src\misc\ffalg.obj \ ..\src\misc\fp2rat.obj \ ..\src\misc\fvs.obj \ ..\src\misc\gcd.obj \ ..\src\misc\hbm.obj \ ..\src\misc\jd.obj \ ..\src\misc\keller.obj \ ..\src\misc\ks.obj \ ..\src\misc\mc13d.obj \ ..\src\misc\mc21a.obj \ ..\src\misc\mt1.obj \ ..\src\misc\mygmp.obj \ ..\src\misc\okalg.obj \ ..\src\misc\qmd.obj \ ..\src\misc\relax4.obj \ ..\src\misc\rgr.obj \ ..\src\misc\rng.obj \ ..\src\misc\rng1.obj \ ..\src\misc\round2n.obj \ ..\src\misc\spm.obj \ ..\src\misc\str2int.obj \ ..\src\misc\str2num.obj \ ..\src\misc\strspx.obj \ ..\src\misc\strtrim.obj \ ..\src\misc\triang.obj \ ..\src\misc\wclique.obj \ ..\src\misc\wclique1.obj \ ..\src\mpl\mpl1.obj \ ..\src\mpl\mpl2.obj \ ..\src\mpl\mpl3.obj \ ..\src\mpl\mpl4.obj \ ..\src\mpl\mpl5.obj \ ..\src\mpl\mpl6.obj \ ..\src\mpl\mplsql.obj \ ..\src\npp\npp1.obj \ ..\src\npp\npp2.obj \ ..\src\npp\npp3.obj \ ..\src\npp\npp4.obj \ ..\src\npp\npp5.obj \ ..\src\npp\npp6.obj \ ..\src\proxy\proxy.obj \ ..\src\proxy\proxy1.obj \ ..\src\simplex\spxat.obj \ ..\src\simplex\spxchuzc.obj \ ..\src\simplex\spxchuzr.obj \ ..\src\simplex\spxlp.obj \ ..\src\simplex\spxnt.obj \ ..\src\simplex\spxprim.obj \ ..\src\simplex\spxprob.obj \ ..\src\simplex\spychuzc.obj \ ..\src\simplex\spychuzr.obj \ ..\src\simplex\spydual.obj \ ..\src\zlib\adler32.obj \ ..\src\zlib\compress.obj \ ..\src\zlib\crc32.obj \ ..\src\zlib\deflate.obj \ ..\src\zlib\gzclose.obj \ ..\src\zlib\gzlib.obj \ ..\src\zlib\gzread.obj \ ..\src\zlib\gzwrite.obj \ ..\src\zlib\inffast.obj \ ..\src\zlib\inflate.obj \ ..\src\zlib\inftrees.obj \ ..\src\zlib\trees.obj \ ..\src\zlib\uncompr.obj \ ..\src\zlib\zio.obj \ ..\src\zlib\zutil.obj .c.obj: cl.exe $(CFLAGS) /Fo$*.obj /c $*.c all: glpk.lib glpsol.exe glpk.lib: $(OBJSET) lib.exe /out:glpk.lib \ ..\src\*.obj \ ..\src\amd\*.obj \ ..\src\api\*.obj \ ..\src\bflib\*.obj \ ..\src\colamd\*.obj \ ..\src\draft\*.obj \ ..\src\env\*.obj \ ..\src\intopt\*.obj \ ..\src\minisat\*.obj \ ..\src\misc\*.obj \ ..\src\mpl\*.obj \ ..\src\npp\*.obj \ ..\src\proxy\*.obj \ ..\src\simplex\*.obj \ ..\src\zlib\*.obj glpsol.exe: ..\examples\glpsol.obj glpk.lib cl.exe $(CFLAGS) /Feglpsol.exe \ ..\examples\glpsol.obj glpk.lib check: glpsol.exe .\glpsol.exe --version .\glpsol.exe --mps ..\examples\murtagh.mps --max ## eof ## glpk-5.0/w32/Makefile_VC_DLL0000644000062000006210000001433213766346220014643 0ustar maomkpasswd## Build GLPK DLL with Microsoft Visual Studio Express ## CFLAGS = \ /I. \ /I..\src \ /I..\src\amd \ /I..\src\api \ /I..\src\bflib \ /I..\src\colamd \ /I..\src\draft \ /I..\src\env \ /I..\src\intopt \ /I..\src\minisat \ /I..\src\misc \ /I..\src\mpl \ /I..\src\npp \ /I..\src\proxy \ /I..\src\simplex \ /I..\src\zlib \ /DHAVE_CONFIG_H=1 \ /D_CRT_SECURE_NO_WARNINGS=1 \ /nologo \ /W3 \ /O2 \ /Zi OBJSET = \ ..\src\amd\amd_1.obj \ ..\src\amd\amd_2.obj \ ..\src\amd\amd_aat.obj \ ..\src\amd\amd_control.obj \ ..\src\amd\amd_defaults.obj \ ..\src\amd\amd_dump.obj \ ..\src\amd\amd_info.obj \ ..\src\amd\amd_order.obj \ ..\src\amd\amd_post_tree.obj \ ..\src\amd\amd_postorder.obj \ ..\src\amd\amd_preprocess.obj \ ..\src\amd\amd_valid.obj \ ..\src\api\advbas.obj \ ..\src\api\asnhall.obj \ ..\src\api\asnlp.obj \ ..\src\api\asnokalg.obj \ ..\src\api\ckasn.obj \ ..\src\api\ckcnf.obj \ ..\src\api\cplex.obj \ ..\src\api\cpp.obj \ ..\src\api\cpxbas.obj \ ..\src\api\graph.obj \ ..\src\api\gridgen.obj \ ..\src\api\intfeas1.obj \ ..\src\api\maxffalg.obj \ ..\src\api\maxflp.obj \ ..\src\api\mcflp.obj \ ..\src\api\mcfokalg.obj \ ..\src\api\mcfrelax.obj \ ..\src\api\minisat1.obj \ ..\src\api\mpl.obj \ ..\src\api\mps.obj \ ..\src\api\netgen.obj \ ..\src\api\npp.obj \ ..\src\api\pript.obj \ ..\src\api\prmip.obj \ ..\src\api\prob1.obj \ ..\src\api\prob2.obj \ ..\src\api\prob3.obj \ ..\src\api\prob4.obj \ ..\src\api\prob5.obj \ ..\src\api\prrngs.obj \ ..\src\api\prsol.obj \ ..\src\api\rdasn.obj \ ..\src\api\rdcc.obj \ ..\src\api\rdcnf.obj \ ..\src\api\rdipt.obj \ ..\src\api\rdmaxf.obj \ ..\src\api\rdmcf.obj \ ..\src\api\rdmip.obj \ ..\src\api\rdprob.obj \ ..\src\api\rdsol.obj \ ..\src\api\rmfgen.obj \ ..\src\api\strong.obj \ ..\src\api\topsort.obj \ ..\src\api\weak.obj \ ..\src\api\wcliqex.obj \ ..\src\api\wrasn.obj \ ..\src\api\wrcc.obj \ ..\src\api\wrcnf.obj \ ..\src\api\wript.obj \ ..\src\api\wrmaxf.obj \ ..\src\api\wrmcf.obj \ ..\src\api\wrmip.obj \ ..\src\api\wrprob.obj \ ..\src\api\wrsol.obj \ ..\src\bflib\btf.obj \ ..\src\bflib\btfint.obj \ ..\src\bflib\fhv.obj \ ..\src\bflib\fhvint.obj \ ..\src\bflib\ifu.obj \ ..\src\bflib\luf.obj \ ..\src\bflib\lufint.obj \ ..\src\bflib\scf.obj \ ..\src\bflib\scfint.obj \ ..\src\bflib\sgf.obj \ ..\src\bflib\sva.obj \ ..\src\colamd\colamd.obj \ ..\src\draft\bfd.obj \ ..\src\draft\bfx.obj \ ..\src\draft\glpapi06.obj \ ..\src\draft\glpapi07.obj \ ..\src\draft\glpapi08.obj \ ..\src\draft\glpapi09.obj \ ..\src\draft\glpapi10.obj \ ..\src\draft\glpapi12.obj \ ..\src\draft\glpapi13.obj \ ..\src\draft\glpios01.obj \ ..\src\draft\glpios02.obj \ ..\src\draft\glpios03.obj \ ..\src\draft\glpios07.obj \ ..\src\draft\glpios09.obj \ ..\src\draft\glpios11.obj \ ..\src\draft\glpios12.obj \ ..\src\draft\glpipm.obj \ ..\src\draft\glpmat.obj \ ..\src\draft\glpscl.obj \ ..\src\draft\glpssx01.obj \ ..\src\draft\glpssx02.obj \ ..\src\draft\lux.obj \ ..\src\env\alloc.obj \ ..\src\env\dlsup.obj \ ..\src\env\env.obj \ ..\src\env\error.obj \ ..\src\env\stdc.obj \ ..\src\env\stdout.obj \ ..\src\env\stream.obj \ ..\src\env\time.obj \ ..\src\env\tls.obj \ ..\src\intopt\cfg.obj \ ..\src\intopt\cfg1.obj \ ..\src\intopt\cfg2.obj \ ..\src\intopt\clqcut.obj \ ..\src\intopt\covgen.obj \ ..\src\intopt\fpump.obj \ ..\src\intopt\gmicut.obj \ ..\src\intopt\gmigen.obj \ ..\src\intopt\mirgen.obj \ ..\src\intopt\spv.obj \ ..\src\minisat\minisat.obj \ ..\src\misc\avl.obj \ ..\src\misc\bignum.obj \ ..\src\misc\dimacs.obj \ ..\src\misc\dmp.obj \ ..\src\misc\ffalg.obj \ ..\src\misc\fp2rat.obj \ ..\src\misc\fvs.obj \ ..\src\misc\gcd.obj \ ..\src\misc\hbm.obj \ ..\src\misc\jd.obj \ ..\src\misc\keller.obj \ ..\src\misc\ks.obj \ ..\src\misc\mc13d.obj \ ..\src\misc\mc21a.obj \ ..\src\misc\mt1.obj \ ..\src\misc\mygmp.obj \ ..\src\misc\okalg.obj \ ..\src\misc\qmd.obj \ ..\src\misc\relax4.obj \ ..\src\misc\rgr.obj \ ..\src\misc\rng.obj \ ..\src\misc\rng1.obj \ ..\src\misc\round2n.obj \ ..\src\misc\spm.obj \ ..\src\misc\str2int.obj \ ..\src\misc\str2num.obj \ ..\src\misc\strspx.obj \ ..\src\misc\strtrim.obj \ ..\src\misc\triang.obj \ ..\src\misc\wclique.obj \ ..\src\misc\wclique1.obj \ ..\src\mpl\mpl1.obj \ ..\src\mpl\mpl2.obj \ ..\src\mpl\mpl3.obj \ ..\src\mpl\mpl4.obj \ ..\src\mpl\mpl5.obj \ ..\src\mpl\mpl6.obj \ ..\src\mpl\mplsql.obj \ ..\src\npp\npp1.obj \ ..\src\npp\npp2.obj \ ..\src\npp\npp3.obj \ ..\src\npp\npp4.obj \ ..\src\npp\npp5.obj \ ..\src\npp\npp6.obj \ ..\src\proxy\proxy.obj \ ..\src\proxy\proxy1.obj \ ..\src\simplex\spxat.obj \ ..\src\simplex\spxchuzc.obj \ ..\src\simplex\spxchuzr.obj \ ..\src\simplex\spxlp.obj \ ..\src\simplex\spxnt.obj \ ..\src\simplex\spxprim.obj \ ..\src\simplex\spxprob.obj \ ..\src\simplex\spychuzc.obj \ ..\src\simplex\spychuzr.obj \ ..\src\simplex\spydual.obj \ ..\src\zlib\adler32.obj \ ..\src\zlib\compress.obj \ ..\src\zlib\crc32.obj \ ..\src\zlib\deflate.obj \ ..\src\zlib\gzclose.obj \ ..\src\zlib\gzlib.obj \ ..\src\zlib\gzread.obj \ ..\src\zlib\gzwrite.obj \ ..\src\zlib\inffast.obj \ ..\src\zlib\inflate.obj \ ..\src\zlib\inftrees.obj \ ..\src\zlib\trees.obj \ ..\src\zlib\uncompr.obj \ ..\src\zlib\zio.obj \ ..\src\zlib\zutil.obj .c.obj: cl.exe $(CFLAGS) /Fo$*.obj /c $*.c all: glpk_5_0.dll glpsol.exe glpk_5_0.dll: $(OBJSET) cl.exe $(CFLAGS) /LD /Feglpk_5_0.dll \ ..\src\*.obj \ ..\src\amd\*.obj \ ..\src\api\*.obj \ ..\src\bflib\*.obj \ ..\src\colamd\*.obj \ ..\src\draft\*.obj \ ..\src\env\*.obj \ ..\src\intopt\*.obj \ ..\src\minisat\*.obj \ ..\src\misc\*.obj \ ..\src\mpl\*.obj \ ..\src\npp\*.obj \ ..\src\proxy\*.obj \ ..\src\simplex\*.obj \ ..\src\zlib\*.obj \ glpk_5_0.def glpsol.exe: ..\examples\glpsol.obj glpk_5_0.dll cl.exe $(CFLAGS) /Feglpsol.exe \ ..\examples\glpsol.obj glpk_5_0.lib check: glpsol.exe .\glpsol.exe --version .\glpsol.exe --mps ..\examples\murtagh.mps --max ## eof ## glpk-5.0/w32/Makefile_VC_stdcall_DLL0000644000062000006210000001442113766346220016350 0ustar maomkpasswd## Build GLPK DLL with Microsoft Visual Studio Express ## CFLAGS = \ /I. \ /I..\src \ /I..\src\amd \ /I..\src\api \ /I..\src\bflib \ /I..\src\colamd \ /I..\src\draft \ /I..\src\env \ /I..\src\intopt \ /I..\src\minisat \ /I..\src\misc \ /I..\src\mpl \ /I..\src\npp \ /I..\src\proxy \ /I..\src\simplex \ /I..\src\zlib \ /DHAVE_CONFIG_H=1 \ /D_CRT_SECURE_NO_WARNINGS=1 \ /nologo \ /W3 \ /O2 \ /Zi \ /Gz OBJSET = \ ..\src\amd\amd_1.obj \ ..\src\amd\amd_2.obj \ ..\src\amd\amd_aat.obj \ ..\src\amd\amd_control.obj \ ..\src\amd\amd_defaults.obj \ ..\src\amd\amd_dump.obj \ ..\src\amd\amd_info.obj \ ..\src\amd\amd_order.obj \ ..\src\amd\amd_post_tree.obj \ ..\src\amd\amd_postorder.obj \ ..\src\amd\amd_preprocess.obj \ ..\src\amd\amd_valid.obj \ ..\src\api\advbas.obj \ ..\src\api\asnhall.obj \ ..\src\api\asnlp.obj \ ..\src\api\asnokalg.obj \ ..\src\api\ckasn.obj \ ..\src\api\ckcnf.obj \ ..\src\api\cplex.obj \ ..\src\api\cpp.obj \ ..\src\api\cpxbas.obj \ ..\src\api\graph.obj \ ..\src\api\gridgen.obj \ ..\src\api\intfeas1.obj \ ..\src\api\maxffalg.obj \ ..\src\api\maxflp.obj \ ..\src\api\mcflp.obj \ ..\src\api\mcfokalg.obj \ ..\src\api\mcfrelax.obj \ ..\src\api\minisat1.obj \ ..\src\api\mpl.obj \ ..\src\api\mps.obj \ ..\src\api\netgen.obj \ ..\src\api\npp.obj \ ..\src\api\pript.obj \ ..\src\api\prmip.obj \ ..\src\api\prob1.obj \ ..\src\api\prob2.obj \ ..\src\api\prob3.obj \ ..\src\api\prob4.obj \ ..\src\api\prob5.obj \ ..\src\api\prrngs.obj \ ..\src\api\prsol.obj \ ..\src\api\rdasn.obj \ ..\src\api\rdcc.obj \ ..\src\api\rdcnf.obj \ ..\src\api\rdipt.obj \ ..\src\api\rdmaxf.obj \ ..\src\api\rdmcf.obj \ ..\src\api\rdmip.obj \ ..\src\api\rdprob.obj \ ..\src\api\rdsol.obj \ ..\src\api\rmfgen.obj \ ..\src\api\strong.obj \ ..\src\api\topsort.obj \ ..\src\api\weak.obj \ ..\src\api\wcliqex.obj \ ..\src\api\wrasn.obj \ ..\src\api\wrcc.obj \ ..\src\api\wrcnf.obj \ ..\src\api\wript.obj \ ..\src\api\wrmaxf.obj \ ..\src\api\wrmcf.obj \ ..\src\api\wrmip.obj \ ..\src\api\wrprob.obj \ ..\src\api\wrsol.obj \ ..\src\bflib\btf.obj \ ..\src\bflib\btfint.obj \ ..\src\bflib\fhv.obj \ ..\src\bflib\fhvint.obj \ ..\src\bflib\ifu.obj \ ..\src\bflib\luf.obj \ ..\src\bflib\lufint.obj \ ..\src\bflib\scf.obj \ ..\src\bflib\scfint.obj \ ..\src\bflib\sgf.obj \ ..\src\bflib\sva.obj \ ..\src\colamd\colamd.obj \ ..\src\draft\bfd.obj \ ..\src\draft\bfx.obj \ ..\src\draft\glpapi06.obj \ ..\src\draft\glpapi07.obj \ ..\src\draft\glpapi08.obj \ ..\src\draft\glpapi09.obj \ ..\src\draft\glpapi10.obj \ ..\src\draft\glpapi12.obj \ ..\src\draft\glpapi13.obj \ ..\src\draft\glpios01.obj \ ..\src\draft\glpios02.obj \ ..\src\draft\glpios03.obj \ ..\src\draft\glpios07.obj \ ..\src\draft\glpios09.obj \ ..\src\draft\glpios11.obj \ ..\src\draft\glpios12.obj \ ..\src\draft\glpipm.obj \ ..\src\draft\glpmat.obj \ ..\src\draft\glpscl.obj \ ..\src\draft\glpssx01.obj \ ..\src\draft\glpssx02.obj \ ..\src\draft\lux.obj \ ..\src\env\alloc.obj \ ..\src\env\dlsup.obj \ ..\src\env\env.obj \ ..\src\env\error.obj \ ..\src\env\stdc.obj \ ..\src\env\stdout.obj \ ..\src\env\stream.obj \ ..\src\env\time.obj \ ..\src\env\tls.obj \ ..\src\intopt\cfg.obj \ ..\src\intopt\cfg1.obj \ ..\src\intopt\cfg2.obj \ ..\src\intopt\clqcut.obj \ ..\src\intopt\covgen.obj \ ..\src\intopt\fpump.obj \ ..\src\intopt\gmicut.obj \ ..\src\intopt\gmigen.obj \ ..\src\intopt\mirgen.obj \ ..\src\intopt\spv.obj \ ..\src\minisat\minisat.obj \ ..\src\misc\avl.obj \ ..\src\misc\bignum.obj \ ..\src\misc\dimacs.obj \ ..\src\misc\dmp.obj \ ..\src\misc\ffalg.obj \ ..\src\misc\fp2rat.obj \ ..\src\misc\fvs.obj \ ..\src\misc\gcd.obj \ ..\src\misc\hbm.obj \ ..\src\misc\jd.obj \ ..\src\misc\keller.obj \ ..\src\misc\ks.obj \ ..\src\misc\mc13d.obj \ ..\src\misc\mc21a.obj \ ..\src\misc\mt1.obj \ ..\src\misc\mygmp.obj \ ..\src\misc\okalg.obj \ ..\src\misc\qmd.obj \ ..\src\misc\relax4.obj \ ..\src\misc\rgr.obj \ ..\src\misc\rng.obj \ ..\src\misc\rng1.obj \ ..\src\misc\round2n.obj \ ..\src\misc\spm.obj \ ..\src\misc\str2int.obj \ ..\src\misc\str2num.obj \ ..\src\misc\strspx.obj \ ..\src\misc\strtrim.obj \ ..\src\misc\triang.obj \ ..\src\misc\wclique.obj \ ..\src\misc\wclique1.obj \ ..\src\mpl\mpl1.obj \ ..\src\mpl\mpl2.obj \ ..\src\mpl\mpl3.obj \ ..\src\mpl\mpl4.obj \ ..\src\mpl\mpl5.obj \ ..\src\mpl\mpl6.obj \ ..\src\mpl\mplsql.obj \ ..\src\npp\npp1.obj \ ..\src\npp\npp2.obj \ ..\src\npp\npp3.obj \ ..\src\npp\npp4.obj \ ..\src\npp\npp5.obj \ ..\src\npp\npp6.obj \ ..\src\proxy\proxy.obj \ ..\src\proxy\proxy1.obj \ ..\src\simplex\spxat.obj \ ..\src\simplex\spxchuzc.obj \ ..\src\simplex\spxchuzr.obj \ ..\src\simplex\spxlp.obj \ ..\src\simplex\spxnt.obj \ ..\src\simplex\spxprim.obj \ ..\src\simplex\spxprob.obj \ ..\src\simplex\spychuzc.obj \ ..\src\simplex\spychuzr.obj \ ..\src\simplex\spydual.obj \ ..\src\zlib\adler32.obj \ ..\src\zlib\compress.obj \ ..\src\zlib\crc32.obj \ ..\src\zlib\deflate.obj \ ..\src\zlib\gzclose.obj \ ..\src\zlib\gzlib.obj \ ..\src\zlib\gzread.obj \ ..\src\zlib\gzwrite.obj \ ..\src\zlib\inffast.obj \ ..\src\zlib\inflate.obj \ ..\src\zlib\inftrees.obj \ ..\src\zlib\trees.obj \ ..\src\zlib\uncompr.obj \ ..\src\zlib\zio.obj \ ..\src\zlib\zutil.obj .c.obj: cl.exe $(CFLAGS) /Fo$*.obj /c $*.c all: glpk_5_0_stdcall.dll glpsol.exe glpk_5_0_stdcall.dll: $(OBJSET) cl.exe $(CFLAGS) /LD /Feglpk_5_0_stdcall.dll \ ..\src\*.obj \ ..\src\amd\*.obj \ ..\src\api\*.obj \ ..\src\bflib\*.obj \ ..\src\colamd\*.obj \ ..\src\draft\*.obj \ ..\src\env\*.obj \ ..\src\intopt\*.obj \ ..\src\minisat\*.obj \ ..\src\misc\*.obj \ ..\src\mpl\*.obj \ ..\src\npp\*.obj \ ..\src\proxy\*.obj \ ..\src\simplex\*.obj \ ..\src\zlib\*.obj \ glpk_5_0_stdcall.def glpsol.exe: ..\examples\glpsol.obj glpk_5_0_stdcall.dll cl.exe $(CFLAGS) /Feglpsol.exe \ ..\examples\glpsol.obj glpk_5_0_stdcall.lib check: glpsol.exe .\glpsol.exe --version .\glpsol.exe --mps ..\examples\murtagh.mps --max ## eof ## glpk-5.0/w32/readme.txt0000644000062000006210000000166713766346220014125 0ustar maomkpasswdThis directory contains batch files and other stuff which you can use to build GLPK for 32-bit Windows with the native C/C++ compilers. Before running the batch file do the following: 1. Make sure that you have installed the compiler you are going to use to build GLPK. 2. Look into corresponding batch file (just right-click it and choose 'Edit' in the popup menu; DO NOT choose 'Open'). Make sure that HOME variable specifies correct path to the compiler directory; if not, make necessary changes. To run the batch file just double-click it and wait a bit while the Make utility does its job. The message 'OPTIMAL SOLUTION FOUND' in the MS-DOS window means that all is OK. If you do not see it, something is wrong. Once GLPK has been successfully built, there must appear two files in this directory: glpk.lib, which is the GLPK object library, and glpsol.exe, which is the stand-alone GLPK LP/MIP solver. glpk-5.0/w64/0000755000062000006210000000000013766346220012122 5ustar maomkpasswdglpk-5.0/w64/Build_GLPK_with_VC10.bat0000777000062000006210000000052113766346220016257 0ustar maomkpasswdrem Build GLPK with Microsoft Visual Studio Express 2010 rem NOTE: Make sure that HOME variable specifies correct path set HOME="C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC" call %HOME%\vcvarsall.bat x64 copy config_VC config.h %HOME%\bin\nmake.exe /f Makefile_VC %HOME%\bin\nmake.exe /f Makefile_VC check pause glpk-5.0/w64/Build_GLPK_with_VC10_DLL.bat0000777000062000006210000000053513766346220016757 0ustar maomkpasswdrem Build GLPK DLL with Microsoft Visual Studio Express 2010 rem NOTE: Make sure that HOME variable specifies correct path set HOME="C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC" call %HOME%\vcvarsall.bat x64 copy config_VC config.h %HOME%\bin\nmake.exe /f Makefile_VC_DLL %HOME%\bin\nmake.exe /f Makefile_VC_DLL check pause glpk-5.0/w64/Build_GLPK_with_VC14.bat0000777000062000006210000000052313766346220016265 0ustar maomkpasswdrem Build GLPK with Microsoft Visual Studio Community 2015 rem NOTE: Make sure that HOME variable specifies correct path set HOME="C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC" call %HOME%\vcvarsall.bat x64 copy config_VC config.h %HOME%\bin\nmake.exe /f Makefile_VC %HOME%\bin\nmake.exe /f Makefile_VC check pause glpk-5.0/w64/Build_GLPK_with_VC14_DLL.bat0000777000062000006210000000053713766346220016765 0ustar maomkpasswdrem Build GLPK DLL with Microsoft Visual Studio Community 2015 rem NOTE: Make sure that HOME variable specifies correct path set HOME="C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC" call %HOME%\vcvarsall.bat x64 copy config_VC config.h %HOME%\bin\nmake.exe /f Makefile_VC_DLL %HOME%\bin\nmake.exe /f Makefile_VC_DLL check pause glpk-5.0/w64/Build_GLPK_with_VC9.bat0000777000062000006210000000051713766346220016214 0ustar maomkpasswdrem Build GLPK with Microsoft Visual Studio Express 2008 rem NOTE: Make sure that HOME variable specifies correct path set HOME="C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC" call %HOME%\bin\vcvars64.bat copy config_VC config.h %HOME%\bin\nmake.exe /f Makefile_VC %HOME%\bin\nmake.exe /f Makefile_VC check pause glpk-5.0/w64/Build_GLPK_with_VC9_DLL.bat0000777000062000006210000000053313766346220016705 0ustar maomkpasswdrem Build GLPK DLL with Microsoft Visual Studio Express 2008 rem NOTE: Make sure that HOME variable specifies correct path set HOME="C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC" call %HOME%\bin\vcvars64.bat copy config_VC config.h %HOME%\bin\nmake.exe /f Makefile_VC_DLL %HOME%\bin\nmake.exe /f Makefile_VC_DLL check pause glpk-5.0/w64/config_VC0000644000062000006210000000062113766346220013701 0ustar maomkpasswd/* GLPK configuration file (Microsoft Visual Studio Express) */ #define __WOE__ 1 #define TLS __declspec(thread) /* thread local storage-class specifier for reentrancy */ #define ODBC_DLNAME "odbc32.dll" /* ODBC shared library name if this feature is enabled */ #if 0 #define MYSQL_DLNAME "libmysql.dll" /* MySQL shared library name if this feature is enabled */ #endif /* eof */ glpk-5.0/w64/glpk_5_0.def0000644000062000006210000000745713766346220014217 0ustar maomkpasswdLIBRARY glpk_5_0 VERSION 5.0 DESCRIPTION "GNU Linear Programming Kit" EXPORTS glp_create_prob glp_set_prob_name glp_set_obj_name glp_set_obj_dir glp_add_rows glp_add_cols glp_set_row_name glp_set_col_name glp_set_row_bnds glp_set_col_bnds glp_set_obj_coef glp_set_mat_row glp_set_mat_col glp_load_matrix glp_check_dup glp_sort_matrix glp_del_rows glp_del_cols glp_copy_prob glp_erase_prob glp_delete_prob glp_get_prob_name glp_get_obj_name glp_get_obj_dir glp_get_num_rows glp_get_num_cols glp_get_row_name glp_get_col_name glp_get_row_type glp_get_row_lb glp_get_row_ub glp_get_col_type glp_get_col_lb glp_get_col_ub glp_get_obj_coef glp_get_num_nz glp_get_mat_row glp_get_mat_col glp_create_index glp_find_row glp_find_col glp_delete_index glp_set_rii glp_set_sjj glp_get_rii glp_get_sjj glp_scale_prob glp_unscale_prob glp_set_row_stat glp_set_col_stat glp_std_basis glp_adv_basis glp_cpx_basis glp_simplex glp_exact glp_init_smcp glp_get_status glp_get_prim_stat glp_get_dual_stat glp_get_obj_val glp_get_row_stat glp_get_row_prim glp_get_row_dual glp_get_col_stat glp_get_col_prim glp_get_col_dual glp_get_unbnd_ray glp_get_it_cnt glp_set_it_cnt glp_interior glp_init_iptcp glp_ipt_status glp_ipt_obj_val glp_ipt_row_prim glp_ipt_row_dual glp_ipt_col_prim glp_ipt_col_dual glp_set_col_kind glp_get_col_kind glp_get_num_int glp_get_num_bin glp_intopt glp_init_iocp glp_mip_status glp_mip_obj_val glp_mip_row_val glp_mip_col_val glp_check_kkt glp_print_sol glp_read_sol glp_write_sol glp_print_ranges glp_print_ipt glp_read_ipt glp_write_ipt glp_print_mip glp_read_mip glp_write_mip glp_bf_exists glp_factorize glp_bf_updated glp_get_bfcp glp_set_bfcp glp_get_bhead glp_get_row_bind glp_get_col_bind glp_ftran glp_btran glp_warm_up glp_eval_tab_row glp_eval_tab_col glp_transform_row glp_transform_col glp_prim_rtest glp_dual_rtest glp_analyze_bound glp_analyze_coef glp_npp_alloc_wksp glp_npp_load_prob glp_npp_preprocess1 glp_npp_build_prob glp_npp_postprocess glp_npp_obtain_sol glp_npp_free_wksp glp_ios_reason glp_ios_get_prob glp_ios_tree_size glp_ios_curr_node glp_ios_next_node glp_ios_prev_node glp_ios_up_node glp_ios_node_level glp_ios_node_bound glp_ios_best_node glp_ios_mip_gap glp_ios_node_data glp_ios_row_attr glp_ios_pool_size glp_ios_add_row glp_ios_del_row glp_ios_clear_pool glp_ios_can_branch glp_ios_branch_upon glp_ios_select_node glp_ios_heur_sol glp_ios_terminate glp_init_mpscp glp_read_mps glp_write_mps glp_init_cpxcp glp_read_lp glp_write_lp glp_read_prob glp_write_prob glp_mpl_alloc_wksp glp_mpl_init_rand glp_mpl_read_model glp_mpl_read_data glp_mpl_generate glp_mpl_build_prob glp_mpl_postsolve glp_mpl_free_wksp glp_read_cnfsat glp_check_cnfsat glp_write_cnfsat glp_minisat1 glp_intfeas1 glp_init_env glp_version glp_config glp_free_env glp_puts glp_printf glp_vprintf glp_term_out glp_term_hook glp_open_tee glp_close_tee glp_error_ glp_at_error glp_assert_ glp_error_hook glp_alloc glp_realloc glp_free glp_mem_limit glp_mem_usage glp_time glp_difftime glp_create_graph glp_set_graph_name glp_add_vertices glp_set_vertex_name glp_add_arc glp_del_vertices glp_del_arc glp_erase_graph glp_delete_graph glp_create_v_index glp_find_vertex glp_delete_v_index glp_read_graph glp_write_graph glp_mincost_lp glp_mincost_okalg glp_mincost_relax4 glp_maxflow_lp glp_maxflow_ffalg glp_check_asnprob glp_asnprob_lp glp_asnprob_okalg glp_asnprob_hall glp_cpp glp_read_mincost glp_write_mincost glp_read_maxflow glp_write_maxflow glp_read_asnprob glp_write_asnprob glp_read_ccdata glp_write_ccdata glp_netgen glp_netgen_prob glp_gridgen glp_rmfgen glp_weak_comp glp_strong_comp glp_top_sort glp_wclique_exact ;; end of file ;; glpk-5.0/w64/makefile_VC0000644000062000006210000001422713766346220014220 0ustar maomkpasswd## Build GLPK with Microsoft Visual Studio Express ## CFLAGS = \ /I. \ /I..\src \ /I..\src\amd \ /I..\src\api \ /I..\src\bflib \ /I..\src\colamd \ /I..\src\draft \ /I..\src\env \ /I..\src\intopt \ /I..\src\minisat \ /I..\src\misc \ /I..\src\mpl \ /I..\src\npp \ /I..\src\proxy \ /I..\src\simplex \ /I..\src\zlib \ /DHAVE_CONFIG_H=1 \ /D_CRT_SECURE_NO_WARNINGS=1 \ /nologo \ /W3 \ /O2 \ /Zi OBJSET = \ ..\src\amd\amd_1.obj \ ..\src\amd\amd_2.obj \ ..\src\amd\amd_aat.obj \ ..\src\amd\amd_control.obj \ ..\src\amd\amd_defaults.obj \ ..\src\amd\amd_dump.obj \ ..\src\amd\amd_info.obj \ ..\src\amd\amd_order.obj \ ..\src\amd\amd_post_tree.obj \ ..\src\amd\amd_postorder.obj \ ..\src\amd\amd_preprocess.obj \ ..\src\amd\amd_valid.obj \ ..\src\api\advbas.obj \ ..\src\api\asnhall.obj \ ..\src\api\asnlp.obj \ ..\src\api\asnokalg.obj \ ..\src\api\ckasn.obj \ ..\src\api\ckcnf.obj \ ..\src\api\cplex.obj \ ..\src\api\cpp.obj \ ..\src\api\cpxbas.obj \ ..\src\api\graph.obj \ ..\src\api\gridgen.obj \ ..\src\api\intfeas1.obj \ ..\src\api\maxffalg.obj \ ..\src\api\maxflp.obj \ ..\src\api\mcflp.obj \ ..\src\api\mcfokalg.obj \ ..\src\api\mcfrelax.obj \ ..\src\api\minisat1.obj \ ..\src\api\mpl.obj \ ..\src\api\mps.obj \ ..\src\api\netgen.obj \ ..\src\api\npp.obj \ ..\src\api\pript.obj \ ..\src\api\prmip.obj \ ..\src\api\prob1.obj \ ..\src\api\prob2.obj \ ..\src\api\prob3.obj \ ..\src\api\prob4.obj \ ..\src\api\prob5.obj \ ..\src\api\prrngs.obj \ ..\src\api\prsol.obj \ ..\src\api\rdasn.obj \ ..\src\api\rdcc.obj \ ..\src\api\rdcnf.obj \ ..\src\api\rdipt.obj \ ..\src\api\rdmaxf.obj \ ..\src\api\rdmcf.obj \ ..\src\api\rdmip.obj \ ..\src\api\rdprob.obj \ ..\src\api\rdsol.obj \ ..\src\api\rmfgen.obj \ ..\src\api\strong.obj \ ..\src\api\topsort.obj \ ..\src\api\weak.obj \ ..\src\api\wcliqex.obj \ ..\src\api\wrasn.obj \ ..\src\api\wrcc.obj \ ..\src\api\wrcnf.obj \ ..\src\api\wript.obj \ ..\src\api\wrmaxf.obj \ ..\src\api\wrmcf.obj \ ..\src\api\wrmip.obj \ ..\src\api\wrprob.obj \ ..\src\api\wrsol.obj \ ..\src\bflib\btf.obj \ ..\src\bflib\btfint.obj \ ..\src\bflib\fhv.obj \ ..\src\bflib\fhvint.obj \ ..\src\bflib\ifu.obj \ ..\src\bflib\luf.obj \ ..\src\bflib\lufint.obj \ ..\src\bflib\scf.obj \ ..\src\bflib\scfint.obj \ ..\src\bflib\sgf.obj \ ..\src\bflib\sva.obj \ ..\src\colamd\colamd.obj \ ..\src\draft\bfd.obj \ ..\src\draft\bfx.obj \ ..\src\draft\glpapi06.obj \ ..\src\draft\glpapi07.obj \ ..\src\draft\glpapi08.obj \ ..\src\draft\glpapi09.obj \ ..\src\draft\glpapi10.obj \ ..\src\draft\glpapi12.obj \ ..\src\draft\glpapi13.obj \ ..\src\draft\glpios01.obj \ ..\src\draft\glpios02.obj \ ..\src\draft\glpios03.obj \ ..\src\draft\glpios07.obj \ ..\src\draft\glpios09.obj \ ..\src\draft\glpios11.obj \ ..\src\draft\glpios12.obj \ ..\src\draft\glpipm.obj \ ..\src\draft\glpmat.obj \ ..\src\draft\glpscl.obj \ ..\src\draft\glpssx01.obj \ ..\src\draft\glpssx02.obj \ ..\src\draft\lux.obj \ ..\src\env\alloc.obj \ ..\src\env\dlsup.obj \ ..\src\env\env.obj \ ..\src\env\error.obj \ ..\src\env\stdc.obj \ ..\src\env\stdout.obj \ ..\src\env\stream.obj \ ..\src\env\time.obj \ ..\src\env\tls.obj \ ..\src\intopt\cfg.obj \ ..\src\intopt\cfg1.obj \ ..\src\intopt\cfg2.obj \ ..\src\intopt\clqcut.obj \ ..\src\intopt\covgen.obj \ ..\src\intopt\fpump.obj \ ..\src\intopt\gmicut.obj \ ..\src\intopt\gmigen.obj \ ..\src\intopt\mirgen.obj \ ..\src\intopt\spv.obj \ ..\src\minisat\minisat.obj \ ..\src\misc\avl.obj \ ..\src\misc\bignum.obj \ ..\src\misc\dimacs.obj \ ..\src\misc\dmp.obj \ ..\src\misc\ffalg.obj \ ..\src\misc\fp2rat.obj \ ..\src\misc\fvs.obj \ ..\src\misc\gcd.obj \ ..\src\misc\hbm.obj \ ..\src\misc\jd.obj \ ..\src\misc\keller.obj \ ..\src\misc\ks.obj \ ..\src\misc\mc13d.obj \ ..\src\misc\mc21a.obj \ ..\src\misc\mt1.obj \ ..\src\misc\mygmp.obj \ ..\src\misc\okalg.obj \ ..\src\misc\qmd.obj \ ..\src\misc\relax4.obj \ ..\src\misc\rgr.obj \ ..\src\misc\rng.obj \ ..\src\misc\rng1.obj \ ..\src\misc\round2n.obj \ ..\src\misc\spm.obj \ ..\src\misc\str2int.obj \ ..\src\misc\str2num.obj \ ..\src\misc\strspx.obj \ ..\src\misc\strtrim.obj \ ..\src\misc\triang.obj \ ..\src\misc\wclique.obj \ ..\src\misc\wclique1.obj \ ..\src\mpl\mpl1.obj \ ..\src\mpl\mpl2.obj \ ..\src\mpl\mpl3.obj \ ..\src\mpl\mpl4.obj \ ..\src\mpl\mpl5.obj \ ..\src\mpl\mpl6.obj \ ..\src\mpl\mplsql.obj \ ..\src\npp\npp1.obj \ ..\src\npp\npp2.obj \ ..\src\npp\npp3.obj \ ..\src\npp\npp4.obj \ ..\src\npp\npp5.obj \ ..\src\npp\npp6.obj \ ..\src\proxy\proxy.obj \ ..\src\proxy\proxy1.obj \ ..\src\simplex\spxat.obj \ ..\src\simplex\spxchuzc.obj \ ..\src\simplex\spxchuzr.obj \ ..\src\simplex\spxlp.obj \ ..\src\simplex\spxnt.obj \ ..\src\simplex\spxprim.obj \ ..\src\simplex\spxprob.obj \ ..\src\simplex\spychuzc.obj \ ..\src\simplex\spychuzr.obj \ ..\src\simplex\spydual.obj \ ..\src\zlib\adler32.obj \ ..\src\zlib\compress.obj \ ..\src\zlib\crc32.obj \ ..\src\zlib\deflate.obj \ ..\src\zlib\gzclose.obj \ ..\src\zlib\gzlib.obj \ ..\src\zlib\gzread.obj \ ..\src\zlib\gzwrite.obj \ ..\src\zlib\inffast.obj \ ..\src\zlib\inflate.obj \ ..\src\zlib\inftrees.obj \ ..\src\zlib\trees.obj \ ..\src\zlib\uncompr.obj \ ..\src\zlib\zio.obj \ ..\src\zlib\zutil.obj .c.obj: cl.exe $(CFLAGS) /Fo$*.obj /c $*.c all: glpk.lib glpsol.exe glpk.lib: $(OBJSET) lib.exe /out:glpk.lib \ ..\src\*.obj \ ..\src\amd\*.obj \ ..\src\api\*.obj \ ..\src\bflib\*.obj \ ..\src\colamd\*.obj \ ..\src\draft\*.obj \ ..\src\env\*.obj \ ..\src\intopt\*.obj \ ..\src\minisat\*.obj \ ..\src\misc\*.obj \ ..\src\mpl\*.obj \ ..\src\npp\*.obj \ ..\src\proxy\*.obj \ ..\src\simplex\*.obj \ ..\src\zlib\*.obj glpsol.exe: ..\examples\glpsol.obj glpk.lib cl.exe $(CFLAGS) /Feglpsol.exe \ ..\examples\glpsol.obj glpk.lib check: glpsol.exe .\glpsol.exe --version .\glpsol.exe --mps ..\examples\murtagh.mps --max ## eof ## glpk-5.0/w64/makefile_VC_DLL0000644000062000006210000001433213766346220014710 0ustar maomkpasswd## Build GLPK DLL with Microsoft Visual Studio Express ## CFLAGS = \ /I. \ /I..\src \ /I..\src\amd \ /I..\src\api \ /I..\src\bflib \ /I..\src\colamd \ /I..\src\draft \ /I..\src\env \ /I..\src\intopt \ /I..\src\minisat \ /I..\src\misc \ /I..\src\mpl \ /I..\src\npp \ /I..\src\proxy \ /I..\src\simplex \ /I..\src\zlib \ /DHAVE_CONFIG_H=1 \ /D_CRT_SECURE_NO_WARNINGS=1 \ /nologo \ /W3 \ /O2 \ /Zi OBJSET = \ ..\src\amd\amd_1.obj \ ..\src\amd\amd_2.obj \ ..\src\amd\amd_aat.obj \ ..\src\amd\amd_control.obj \ ..\src\amd\amd_defaults.obj \ ..\src\amd\amd_dump.obj \ ..\src\amd\amd_info.obj \ ..\src\amd\amd_order.obj \ ..\src\amd\amd_post_tree.obj \ ..\src\amd\amd_postorder.obj \ ..\src\amd\amd_preprocess.obj \ ..\src\amd\amd_valid.obj \ ..\src\api\advbas.obj \ ..\src\api\asnhall.obj \ ..\src\api\asnlp.obj \ ..\src\api\asnokalg.obj \ ..\src\api\ckasn.obj \ ..\src\api\ckcnf.obj \ ..\src\api\cplex.obj \ ..\src\api\cpp.obj \ ..\src\api\cpxbas.obj \ ..\src\api\graph.obj \ ..\src\api\gridgen.obj \ ..\src\api\intfeas1.obj \ ..\src\api\maxffalg.obj \ ..\src\api\maxflp.obj \ ..\src\api\mcflp.obj \ ..\src\api\mcfokalg.obj \ ..\src\api\mcfrelax.obj \ ..\src\api\minisat1.obj \ ..\src\api\mpl.obj \ ..\src\api\mps.obj \ ..\src\api\netgen.obj \ ..\src\api\npp.obj \ ..\src\api\pript.obj \ ..\src\api\prmip.obj \ ..\src\api\prob1.obj \ ..\src\api\prob2.obj \ ..\src\api\prob3.obj \ ..\src\api\prob4.obj \ ..\src\api\prob5.obj \ ..\src\api\prrngs.obj \ ..\src\api\prsol.obj \ ..\src\api\rdasn.obj \ ..\src\api\rdcc.obj \ ..\src\api\rdcnf.obj \ ..\src\api\rdipt.obj \ ..\src\api\rdmaxf.obj \ ..\src\api\rdmcf.obj \ ..\src\api\rdmip.obj \ ..\src\api\rdprob.obj \ ..\src\api\rdsol.obj \ ..\src\api\rmfgen.obj \ ..\src\api\strong.obj \ ..\src\api\topsort.obj \ ..\src\api\weak.obj \ ..\src\api\wcliqex.obj \ ..\src\api\wrasn.obj \ ..\src\api\wrcc.obj \ ..\src\api\wrcnf.obj \ ..\src\api\wript.obj \ ..\src\api\wrmaxf.obj \ ..\src\api\wrmcf.obj \ ..\src\api\wrmip.obj \ ..\src\api\wrprob.obj \ ..\src\api\wrsol.obj \ ..\src\bflib\btf.obj \ ..\src\bflib\btfint.obj \ ..\src\bflib\fhv.obj \ ..\src\bflib\fhvint.obj \ ..\src\bflib\ifu.obj \ ..\src\bflib\luf.obj \ ..\src\bflib\lufint.obj \ ..\src\bflib\scf.obj \ ..\src\bflib\scfint.obj \ ..\src\bflib\sgf.obj \ ..\src\bflib\sva.obj \ ..\src\colamd\colamd.obj \ ..\src\draft\bfd.obj \ ..\src\draft\bfx.obj \ ..\src\draft\glpapi06.obj \ ..\src\draft\glpapi07.obj \ ..\src\draft\glpapi08.obj \ ..\src\draft\glpapi09.obj \ ..\src\draft\glpapi10.obj \ ..\src\draft\glpapi12.obj \ ..\src\draft\glpapi13.obj \ ..\src\draft\glpios01.obj \ ..\src\draft\glpios02.obj \ ..\src\draft\glpios03.obj \ ..\src\draft\glpios07.obj \ ..\src\draft\glpios09.obj \ ..\src\draft\glpios11.obj \ ..\src\draft\glpios12.obj \ ..\src\draft\glpipm.obj \ ..\src\draft\glpmat.obj \ ..\src\draft\glpscl.obj \ ..\src\draft\glpssx01.obj \ ..\src\draft\glpssx02.obj \ ..\src\draft\lux.obj \ ..\src\env\alloc.obj \ ..\src\env\dlsup.obj \ ..\src\env\env.obj \ ..\src\env\error.obj \ ..\src\env\stdc.obj \ ..\src\env\stdout.obj \ ..\src\env\stream.obj \ ..\src\env\time.obj \ ..\src\env\tls.obj \ ..\src\intopt\cfg.obj \ ..\src\intopt\cfg1.obj \ ..\src\intopt\cfg2.obj \ ..\src\intopt\clqcut.obj \ ..\src\intopt\covgen.obj \ ..\src\intopt\fpump.obj \ ..\src\intopt\gmicut.obj \ ..\src\intopt\gmigen.obj \ ..\src\intopt\mirgen.obj \ ..\src\intopt\spv.obj \ ..\src\minisat\minisat.obj \ ..\src\misc\avl.obj \ ..\src\misc\bignum.obj \ ..\src\misc\dimacs.obj \ ..\src\misc\dmp.obj \ ..\src\misc\ffalg.obj \ ..\src\misc\fp2rat.obj \ ..\src\misc\fvs.obj \ ..\src\misc\gcd.obj \ ..\src\misc\hbm.obj \ ..\src\misc\jd.obj \ ..\src\misc\keller.obj \ ..\src\misc\ks.obj \ ..\src\misc\mc13d.obj \ ..\src\misc\mc21a.obj \ ..\src\misc\mt1.obj \ ..\src\misc\mygmp.obj \ ..\src\misc\okalg.obj \ ..\src\misc\qmd.obj \ ..\src\misc\relax4.obj \ ..\src\misc\rgr.obj \ ..\src\misc\rng.obj \ ..\src\misc\rng1.obj \ ..\src\misc\round2n.obj \ ..\src\misc\spm.obj \ ..\src\misc\str2int.obj \ ..\src\misc\str2num.obj \ ..\src\misc\strspx.obj \ ..\src\misc\strtrim.obj \ ..\src\misc\triang.obj \ ..\src\misc\wclique.obj \ ..\src\misc\wclique1.obj \ ..\src\mpl\mpl1.obj \ ..\src\mpl\mpl2.obj \ ..\src\mpl\mpl3.obj \ ..\src\mpl\mpl4.obj \ ..\src\mpl\mpl5.obj \ ..\src\mpl\mpl6.obj \ ..\src\mpl\mplsql.obj \ ..\src\npp\npp1.obj \ ..\src\npp\npp2.obj \ ..\src\npp\npp3.obj \ ..\src\npp\npp4.obj \ ..\src\npp\npp5.obj \ ..\src\npp\npp6.obj \ ..\src\proxy\proxy.obj \ ..\src\proxy\proxy1.obj \ ..\src\simplex\spxat.obj \ ..\src\simplex\spxchuzc.obj \ ..\src\simplex\spxchuzr.obj \ ..\src\simplex\spxlp.obj \ ..\src\simplex\spxnt.obj \ ..\src\simplex\spxprim.obj \ ..\src\simplex\spxprob.obj \ ..\src\simplex\spychuzc.obj \ ..\src\simplex\spychuzr.obj \ ..\src\simplex\spydual.obj \ ..\src\zlib\adler32.obj \ ..\src\zlib\compress.obj \ ..\src\zlib\crc32.obj \ ..\src\zlib\deflate.obj \ ..\src\zlib\gzclose.obj \ ..\src\zlib\gzlib.obj \ ..\src\zlib\gzread.obj \ ..\src\zlib\gzwrite.obj \ ..\src\zlib\inffast.obj \ ..\src\zlib\inflate.obj \ ..\src\zlib\inftrees.obj \ ..\src\zlib\trees.obj \ ..\src\zlib\uncompr.obj \ ..\src\zlib\zio.obj \ ..\src\zlib\zutil.obj .c.obj: cl.exe $(CFLAGS) /Fo$*.obj /c $*.c all: glpk_5_0.dll glpsol.exe glpk_5_0.dll: $(OBJSET) cl.exe $(CFLAGS) /LD /Feglpk_5_0.dll \ ..\src\*.obj \ ..\src\amd\*.obj \ ..\src\api\*.obj \ ..\src\bflib\*.obj \ ..\src\colamd\*.obj \ ..\src\draft\*.obj \ ..\src\env\*.obj \ ..\src\intopt\*.obj \ ..\src\minisat\*.obj \ ..\src\misc\*.obj \ ..\src\mpl\*.obj \ ..\src\npp\*.obj \ ..\src\proxy\*.obj \ ..\src\simplex\*.obj \ ..\src\zlib\*.obj \ glpk_5_0.def glpsol.exe: ..\examples\glpsol.obj glpk_5_0.dll cl.exe $(CFLAGS) /Feglpsol.exe \ ..\examples\glpsol.obj glpk_5_0.lib check: glpsol.exe .\glpsol.exe --version .\glpsol.exe --mps ..\examples\murtagh.mps --max ## eof ## glpk-5.0/w64/readme.txt0000644000062000006210000000166713766346220014132 0ustar maomkpasswdThis directory contains batch files and other stuff which you can use to build GLPK for 64-bit Windows with the native C/C++ compilers. Before running the batch file do the following: 1. Make sure that you have installed the compiler you are going to use to build GLPK. 2. Look into corresponding batch file (just right-click it and choose 'Edit' in the popup menu; DO NOT choose 'Open'). Make sure that HOME variable specifies correct path to the compiler directory; if not, make necessary changes. To run the batch file just double-click it and wait a bit while the Make utility does its job. The message 'OPTIMAL SOLUTION FOUND' in the MS-DOS window means that all is OK. If you do not see it, something is wrong. Once GLPK has been successfully built, there must appear two files in this directory: glpk.lib, which is the GLPK object library, and glpsol.exe, which is the stand-alone GLPK LP/MIP solver.

–Ì“¥Ê[êù–[žì(WYýŽò ´¼‘´/UŒ—A P´¹wqêÿpÑ4Äå3½½¬f(%Yɤâi¢ýÅOÄi^ñ¶ñ´·%üb1»òÒ?¦IR> endstream endobj 65 0 obj <> stream xÚ]PÁjÃ0 ½û+tì#Ne()a9t s{hoŽ­d†Å6ŽsÈß/vC;H §÷$=eUsjŒµÞJŽzm”ÇÉÎ^"t8hCò=(-ÃV¥,GáHV…û#Bv¿ßÚöµ:ó[Nß®—:?€ÂþA¹,a¿Õ͉/SÀ±1½Æ@ö½Nœ‚_`wT¶Ã—ˆ}y…^›v׊'„ÏÎýâˆ&%e™Æå›¤U89!Ñ 3 a”–Àêº$hÔ¿Þ¦èzù#> stream xÚuTmLSg¾—ÖöŠˆ±Úùq[·)è+: *J4:qÑéÄÁRë…Vúm¡¶Š­-ÐÓúA)‘¦E3çÆ&ÓÎE#.KØü¡cÉþ8³-þYÌÜ’ý{oy Û[:Å™,7÷¼oÎûÜsžóœó^š )š¦‹ŽÜ{ðÚ‡nRä<Õúé#“e.Ìá_£ø×i~M¿VÀ/²ßþ]T°Š¢hÓ¢œ­_³»K­%FT»˜*¢éùK_-Û\³ûPýÝï¹f-wÚÔ~ÜÄ™µœÉÄjWj[ŒœÒÌgöJ£Ñ`1jZÔfNËé8½Yϵ(̓ޤUšÔíz²Óè ØÄ©r^…bs¹BQQkh³Î|$/U­“oªªª,“W(Uò:ΨQ)õòJ³šÓ‘H*¥V~Ø Òpf«¼´Zm6·½µq£Åb)WêLåcËöuer‹Æ¬–¿Ë™8cwB¾Ç 7ËßQê8y^“òüRkеµ&ò†œQO*/¤¨ÅÔz5UAm¥ŽÑÍôIЏ©Ë´›öÐ^ÚGí§tú€j¢©mTqESBjÕO iý¨`{Á™‚ LpC¸_h~Á{Š3 dKÓ¿ðH)A6ÉP’I+ØdÙk"›,– ɯJ£ò4ï&Ð4AòOf‘xX„kð ¼ Wà7‹%h› ‹fÏ“"r"@s‘­D"òl”áðÔ>Éóø|bý,WŠ¿šÌÓªä“Äú"}0ÀÄ\Q;ÛN·Û›½ƒ¥6—§ \à u vówp\ï @˜X4“AÔ²E²Iä“ò¡¬%O¸Îʲ£¢³/•6›n+z( …Â…~wèL8{Å¥a7x±»œØ#=±~ƒ4›Ä`qú\ÐýŠ#ꌱA@<ÌðWqãÿ¤›<›“{|²Py@ä>¢l;î:×´ÇU>Æ>vüÞÄÅ?ïþŠæÜè  áî ×ÿជCÕž_ÐŒËvx£u7ö&uWÔ_µ2SgDÖ¼¢ RV¹*M2ÍôöKó?­­  åHü­)^èT…ïÀ+ñR¼oAdE;d¨â…s…¯,~jGË™bÀÚÔä‚$d¼[)ÌTI"ƒ¤þ îŽw²vðtwufß›š’º:‰vƶÇنƒ áמæ¿MÒãi^Ÿðˆ¿+!¼-°ZY<-Æëqek ÛuÑ÷?ß>÷á2ƒ¦ÄÏ!Ù1.Cö¡Eh)*ý•°¹ˆ)~<=q¡•á x©§t7.a³±¬É$$,š£õ¨rä{î9¿Ñ·ºá|ú}îÛ-±† ƒèÐÂà1(¡õ6w]7á¸N†5dXû Ô_×Û0rîkO”È8Ê f1Ür µŽt¤ôý†ÈÏGoÁwÌ¿¬Ô)^“ʳÒâ¹PÚé®|Nƃ(û<óÿÄ Âê:Œ¤?»zåZ`ØŸç϶¯÷بcÌËg#¬nÀȱkªO÷ôk€q:€Œú û{î±Öx}ЙgOX5Fl#­©Ž+ç?vU™[áSŒ>!¬&¡æ¥hs¦i¶Ó[^Ö4‡ç— ø5¸CÒ×Ùw>þìÊ Ð3€Ÿ¬‘vyÂç€q8s7Î Þ>;Slº”ÙA~6+bb¶PX™,š.*ôÍK¦ç¥/‘w>z¼ä;E÷¼ endstream endobj 69 0 obj <> stream xÚMÍkA‡çM"]Û4Æ]+‰» ºôP-ÙÝVãQŠŠP¡ZOuº’ MJÙd[„%«£RˆKný8 Þö/è¡JCîÒîÑC)=ÌÂ\ÜqèåÇË;ïïa¥RÄGs3 O¦Ç^¾šz:7u÷™µT®-󇢓?}ŸþæÓß.„·PxB-jÉðzê&BèÏež¿.ñü™å)F‘xx ¤‡³W¥êëE¬ßÃú}¬±þlèØ0°a ú¸Y4W+¶Š«•ºµj[Kª]UŸ¯¯Xª®¾YW—ß+¶~GuV˶mUøjWm[Y|W®ŒÇÆ(rÍ øð>Ï𾢋 (ÆÐrÑwt€h0 Xƒn‚ã'£Aô¼vG![æ>¡9ÁkyM×m5™t¨íÊZf=º™¤%Ö;mÏã„Âdò"pˆÀÑúñQΣ V9&¯‘Y“åbÌm»*î*gõ¿ý$Eçš-ו Ë›óÄšÑfç蘎șÀ‰1B"?¡µ`–°œÀoqm*MžÔ¸%ýWÚûe •Éž¹Mn½3zÄþKöI‡–DNÉ[d? ¹˜â2LÒ&kJÜýCÄ~›L¨ì‘m¡mê£,RôýîA·›NûCñ0n\ûc‰ì¥ endstream endobj 71 0 obj <> stream xÚe”MlEÇçyM‚’·‰h©‰Ä‡þˆíX¡M­PL¤TU‚"¢¥Nidʼn*S§j+K­×»Þ¬?Ö†˜¦)í©BßR)7Ä¥ Á ‰CÃ…"!¡Èr¬ç…—{û<ýƒoŸ==>µ|GôxEOôö‹^¿èóˆ>ŸØïýnÑ>1Ø/b0(Câ@H yÅ_ô¸Ý<8çò‰‡G€_Å÷½>A·ÛÓçð ÏÅ®³sñ‹ÓÓQWbÎuúÒü´Ëãúè’köœw>áyÅ•¼0“HLÇÍ­±³s‰„kTŒÍÄûêõóz;  Ž‘çI/ñ’×É›d„œ‚÷É™$S$JΑ™%s$AÈe’†dA…EÐ y(@t(A>…Ï` *ð9Ü€e¸ +p ¾€Ûp‡> stream xÚcd`aa`ddä ˆ r ˆÐvö Ž4 ضÿóa5ü¹Œõ‡ ÃYÆrL?䙈³È=ôbùÏÃ$ËÀÀðGDþä‘_@¤:`Þ=‡cN͌ʪêº*¹îÎ)†=í= ý©=u¿•žJ4Ohíoîæ¨ª®)—ï.ŸÕ:¹}_Ù¾²ýª‰ù•Í5-µmÝåå³kæÈMîž3mú䙓×.œ1eÍ‚é“LïªmÏèªoÔ’¨š]7gî¬säº{šžvMèšÖ¾±k_ñâŸöKØ~+Ng—ãbž¦úŸ‡sW÷~®ýÜûðð1ï÷‡"Eö»— endstream endobj 75 0 obj <> stream xÚÍW{TSW¾>‡ÇÙÛ·rLKö;Nc­cÅë£Õ>´í¨,Z¡>IDyBvÈÊ›Dž"EíÃÚÖ)ÅaÆi­·Õz§gf¹ê¸Ó{¼«wÈL®ÞYó×]IÎÚ+ë·÷þ~¯ï÷š ¡hšžµyÍ k_{bóË›"­X´ÈÿßßbÊä[ì»?D|]üáWÿ{UèCE_˜åføŸ{g’'5Ÿ²pÙóë6mOLWl‡\ý§Ï_úÇïMIyjÑ¢ÅË'‹‹%‹¥ÿX, ,VL,–Œ—Œ—Œ—- ,»–®Xؾ<°}ùSÅâÀ""°œ¼§ÂgÕa×ñ¥À~Š××JÐZÍ+[·–––è–ØõV®¹º«ê[ŽDƒÐ[ôÞ«éj™2½9³c‡kÐA«Ó §ãÈ ´#I$n½ÆnRaJM_ÇT0žƒ)‰Ò ÊFr˜Ñ ?,xêº[U­©œ•!ƒì}/¨ýX(vÏñ­lQ4*:Ú¹®§EíN#·P©Ñ€ ø‡Ÿ=5èäÒH“ŸïÀçÞÀqîàÞoWI¤GÀa!¿Û Su©\Ê7"(õ} ¼Ø*g #‹_Œßµsûc¹%ŒÉÎFÝ&yüvÛ«/sZf‡5¹ À¯0sü+n<&Ï·aê°n¿8Â÷ùÖH¤5à° ßÅ‹í`¸•“âtOPd˜ó¾) k$ì§¥*I„ÌEÊÂδX‘¶eºÒÿyæj‡Žwû¼DZºÛʶòwM•˜JÆËŒ»9g{”ŒBiéâ¿ !uüúKZÜE*ß! ‡|ðÛQœìÿ²Þ®qXíÃ^l Æ×9V%l׈9?åÎbdJKwÛÈÉKŸ!øž}=±,ɲ²T.—³õþ˶XC¬= “™I!¨j7¶ç¶fœˆunCÑ+{T¯A#S<¼¾e#Z6$gn0þ5œ ç¡øM©<â7¨BÕ¦j;Ûu‰üÝv°;Ù˜ÄÉ¥ø„‡ÉGùÆ|SÓ­½<~ *‡Íaë:ÜÕ×Ób-rÙ‹;¶‡÷ÄöÄôÄÖe„; «rP.”ï5jH:*<@Th¿=±N>”Õ}%úÊkŸh+uUÅÐÎ;söôÉ“ÇÏô#èS¤ÀUŸ¯âQN^~aqQqQQQ±%>®RgkTê‚‚ü"ˆ‡Á±³—kñ0Ä‘ÎÓ_G‚ÚiüˆÇ×õI°wÌ'ñ¥ Á®Ãú$•ý„q7¬‹ÖÅL°s“ãw<ª4U  “ÏnSW¨êóâ¼sâ£o‰ ˆL¸5ߢªEÐÄÔš,MÖêñ+£xÃ(^ïht6ÙšLw? OHÓ¥qù(o¬Aq¯'¤IÍGy_;8ÒaëàH8N¿W/µ¡(G̺ûnI®¶¤öøÛ[ñlòų(jÑÖè-ûÑÿà„n7~xóËøü­à¾ŸÏL —iéçq^þbÅ÷½‰ðT„qÊE‘¶Cqƒø¥  ¥²ª•»ÌöÒ‹Oð(¥4!K‘·Q»Áÿÿ]ïÇgð^$„ÝÅ1W¢þ“½ÝNšLÙÚ…Ò^ô‚øLC §Ä•à";ˆCx;оû›®=VXXŸ«üÏí¦7w¯°¯nOínS<‚«ÄxɆ½ýöÉ„Wy-нº%õ5×0*³®µC¼.O¨Îr°Ñ ßaXßàÛšèÕóti<ÁóôŸ–ŠsUx©à›)Ð8® GŒcÖ§´µ’y¤Cz£Ê^œ”)®¢âÆp7c=ŽÞî𴺎”w"ˆÕÌ9ô¦¡~µ]^.3Ë ÀC3™T¹?Ÿý ße>à @\pw†$û@éNÜÍèµåv9j9œ®Ùðtº*.îÏLsea/¾ éÈÕ„×.̼PäÆû\x•@»¯ãÒá` ð dª¬6'žõì§/ ?qÆÍ¹ø!~]:Õ0l2›,Èíz›–ÛŒéEy™ñÛdÛ,abËwveŸÐô• /4¹$¦‹îË—šå“ÁÏ/~f"6–¦R•ï×BØíQ¼o”pß#Q¬F Ø1†kÒ0òtsoª¨pØlÞ3ÇÏ;Ó(4´4¹ hÒ‚u?°ÎfÒ•–£<öNÄGÔ »Û ûxcq±V§Û³3&.F¥TgdgBlgÕEÅ ;ѵóð¼÷„§Rø_÷=ë¦>—A†>è@ ”aʰÖT<ˆš!ÛÕš%È¥j…rÍßrß möqƒå}hmÊ&…<;SÁ!µSS_ù¿°=m÷òKAö|hý„a¿7„²=‚ È–>þ&@Â;í•U„íºcOììµ;sQ>ÌQëóýÛðv²QÏ¡M·Ö}¼¿IÓ˜Óü~÷Ÿ¾&óHW*A¥ÞRŠ´(//G§+.ß°9b @6£Ùa':FÜ|ɺ‚‡šÛªm"í6Þ>ìžáÇÛ ÚÜ¥É| @Q¥´QÚÈÜÇÖ£<”Of l>Ô\ß”× ÏRç(bÈŽñß *¼È6j9U>T~ 5˜k\fx“* •¼8XÍ8%€{'Æ_!y&Á ò=N`y|ÁÙŽ Bi/fTh*@pã>ÍnB.‘ØRÿoÂÇ*Skö=p$¢wqod5–bK¡úr¦®¼ájOï#7ú>·VÛ«-Õ&ñF8;$7l#`† ˜ù?­’p @(G››¶*ùÙÔU…²üÔ\ùÎ;ÛîÄaJ[k<¤@ßK0Î#Âñò¼gùæ’4ŽûÅÈ–#<²“&µAü Þ'>ΤE%pw Šûñ=«·Ým ±â> @WƒíÍñØùg†Û÷ë£:¬ý3ÜydPï{M"‚'žDâlø«Ëâ4<OÂA_àû8ö2ž²OÁ±z¢õ~å*VJ¼€½ü‘€ƒ0ä>Fƒ*V–«ÿcˆNŽWJs’Ðjôú¹üÕ¨ª¬þ[CBá÷êpÙµr¤VÔ‹zË{t5êÓü´)û¿xf‚AÄMDðáWß<·5\gýƒH:¦=ü]%HHG;HP¥ ºÇ$#fÏÎ侬!BüSpÐM,ÁLgó›Ñ¶Ì½‰ð]€›E¤tåι!»þô1/DAÑ߸tü­/ÄIÏrd´1ãç÷w:½„ß»ñcrw‰ÿ0þÎÇI²µû fÖf·µ4Ö·shd©U‹ŠAOŠŠÓ¿~Ïæ?Dïõ¸GÊmÖ ÒœŽK w3´y™»âdd Št žu™g{>qãÉ8”kEm¥B¡Ý`ÓÛ 00džŸ|4¸‡ø_(.u3¦nóP£«¾©ÃêF°Žj ©¼xìH0ìàTJ< ìcR­<>»³‹«cúQQUŒMYžaR’Xˆ—ûßB¸¨(q· Ä³|û…0¶±ÑŸßƒ ÕJnŽ w¯m[ë^Ûñl¸Yë(DÅ(/_­Ë/‡kvI£7—íG9Ö<§ËZu5Bv·+§>]Q©Þv2m€ûyñ<÷ǾñÞ¸UÛß’‹Ràð¹‰ùë)®ôKÝX}}_å4™ÕÍvÓí{^’ýcÙå£ÁYtÞØðüÏIöŠØ›/Bŧ²›w‹ÿ€S ³$WÁ´&=JBIeIfª¬‡yü&hóÆl"€þkÎ H4)׮޻ï©uà:iòºzººÑ1äMëN®ßåÚ^¾ÁÅ0,†÷ß÷Ó­!ü¨óïzˆV¼Áœû m=_L”âÆ4"›_dTÆÆz¿âYàørŒ–¥ Di…|†3FØA¬Áéi’41monnxFzŠ4ÞÇ©ö,IóãM:&Geªæ‘³¶¡²ÊÕÞìqµ7áö ³•¼´\ç1 Y†-ä<>°sý{ð'ðÄÄGuÚ…è™/ÒßÓC<¿Aò³~…ùŽ4ºûmn›‘†<Á4¬ùH§«š|«ë°ÌT݈[à&;Ÿ›:É>u²iꔿM>5…[2ÿÕŠç¼ïfÿ/umû¨ endstream endobj 77 0 obj <> stream xÚS[pS×½²ì{ŽGP u ÷’6a2m‡8-q Åäa0Pcì&8vãà·t¯$K¶ž~nI–¬‡eI¶$ËÆÂæáqˆãÔ l034MMȃ¡u&R2C¦)sÔ9­”éô£Ÿ9³>öY{ïµöÙGD¥¦R"‘hÕ¾]»÷äþìÀ«ÅÅY/fe%cÙñQñµ)ñuâøšTrŒµioþóÏië(ŠšøAûW&±mUŸMýA&%‰RÙY›ž©¾¶WmZ_X_y´©n}±¦á¨ª©:ùŸŠ­ØDåRÛ©ÔaªŠªMi¢øDÅ•Ô:Š£ž¢vRÔ^jµŸ:@•P)”ˆJ¡6R‘L4•R .KýIj, ¥YÒ¾•D¼Z%¯ãÕbÜ‹e²KÕ¨z¤æÖIõGà :Ó8v„•|.ÄÍ êOñUÙtlúäôèò%y¨/ì ùüîÂ(ØÐ°í´¾Ëh6¶UɳK^(Î.i5µš¡u1¶º‹Â¨æöá?¼yûð|•ÜÓæ1÷u#=à 9ˆ½:ïžIyÑÙßž-šÐ¹µ}Ú^ôŸžñt¼ +¯+o(¯Ï>(Wé…VU«Î¤2€šûµ¬ƒî³y\çü9ùòì_./ÏúÜ>‘銕†ëòß}u*ÿÝ¢sr£ÓèÒ[Q;­iÕ6sÀ‡-~ÃJùüñ+ÇçùM}À‚$7ß_Äá[ï/Ц®Ý¿ŠóÄq6Þ"Óx'hCY¹í¹ „ú÷1ÌÜ Þp[Çà4ÂiÞI²È¦§Èòs²á!ÙŠsÙ«0™žt¹nð …]ËÖÂ[%{™h’é/Àé€Ó¦þˆ×áÕì$œRG*Ù@JeÐÓÝtùÔ§ó×£/”•4½XÈîþ‹ŽóHÒ±ˆÝX²k1sv óKyx‡ô<Þgd!kÈ4ó±fGhR¨ «žûkÙgÜÜòÄb£'&º&…èÀýԨУåZhé]…BÞ€ÏêÜËŸßÖ¯²«Aèà–Ηê#êáñþ‘Q²íÌÞuqåîK,\ørð|ï¸cÜ>HBT7qε‹7ð/½r33v½q ï_¿.}lx4%{KS{!Bá§,³_^{Æûwäf°”üp ›ÝN·C‡­…–~gP´Œ„9pÛÜvרnÜ<蓯æsn¦ó¤)Úõ9‚îþ„N[õi@‘Ð@”ƒso‡ªm‰d(Ûy“B/ïèêho‡Nè²uÚôN¹ô¡Aámt6ÊÎÉßÌACo}¿ÒÞîhƒ604ú.S·LÐàæûyd&2YBv·l`GsóÃ3ì'ôµGæ[ÉË]v®ž4\A‰š¿Çenæâ{ï}È~“Gœ‡‰)­¨x}*ßi›Aë-<¿˜iÁ+ö-`IòH¿Á)ñ§e1…MÍ£Õ³’­GèDÒ/ÆÈ,dµ’~Ãk ¼ÚÛå¾¥ÃA÷P¤¹OàÚÀÒÝg1s}–ÎZÕ°D03JQ© šÂÜWtØï 7ûøÿ‡*0 úû9l%” êÕD£¿NÀÛ:¥°±ˆg?Êtáì¼ä›JàÜø“ ãg•V»4æ&!`ä¤w/ÙRZú€×ë4‰6CΡ£Od@ïç¹R¼•†3ŽñðHôÔ¹ÁÄNŒ4ï刪šiÒ~¯*AÏ¢£þÿÒké;Ÿþ˜=ešªßoü­EÑå?áÐ’[ã»e$µuûæŽõÈÈñ=’‚3Ù>§yî>ìù¹,ÎÅ4y’%kˆ:ù“ЃîÌÝùŒµÒw`æW~"/¯,ëy6ÊïYn'M– qfÁ¡Ê<‰_Ë[’ưÙ83bì¯g‰„V5yÁ¯rÒáûd6›–W¶¶¨5ýº'9Áau&†¡¬žPÂCksr´›1¢ï_þÎ`ÂÍCCáà(+õ]*ôgkÞx#áí#<»(ú:9]ñ×ñ±0Pg« *F+/˜¦áCÐ2 z†ÂZ¯šûþœ2ûO°9t3ßQ¯ñꆸ‹¤‚þÕ>¾¸êXχ˜¨9XÃþ‚t¾)d s£7¾Ó…ó¼4 ›.öþ:cEoFº5ã‰Gé>ÁíêXãîÿkõ¿‹Î$V endstream endobj 79 0 obj <> stream xÚÍXyxSeºÏ!ôœ#Bc4^5©((‚€”E¶BY)”¥iéé¾…¤k’.i“¼ÙÛ&éžntIš–Ö–P)¢ ×™+08€¢Ž3‹¨ã\à s˜ÇùNJ¸½ƒ÷>÷>Ïü‘ó|ÏÉ÷~ïûþÞß»|‡àŒË!bÒ–-ë–GFN]1kæü¹ì»9ÞYï+c¼³¹Þ‡Ç22æã'ÈwþöjÀ“q~2û4=Ä>ã'á'g~\œÇbï‰çfÌ[ºfãöøT©Bm®iq :~òÒ͘]‰‰³fΜ5ÿÎbö,ÿbîÅ«wóü ÿæy3ý‹ÙþÅÿâUÿ"Ø¿ðKû¥‚ýº‚_ñ/üRÁ~]Á~ñ`¿ø|¿Ô|¿ÒùófΘ’žš±G’´.=>!+-hyzJ|ÐÊIBZ|Bü=b„ø38q\1‘ÂI#²8BÆ9Êù ççKÎWœ?—ˆ«œkc¯soqÎȇ8+8+9¡œUœ5œµœuœõœ0N8g3g '‚('Ô„†Ð@è=a Œ„‰0¢‚¨$ª+a#ìD5QCÔuœçÆpÎÎ,Ž“XEœ³tÌaî3ÜÜ/Ç&Œý8`^@;AÞ¤vÐ4Ý÷@ì¸àq”Œž°|âä‰WJ›ôø¤}“ÛÓx3xß=ü-ÿ£GT$^Ò$ESeÄ—h*MCÏów•¦g@<ו¸_h!{-í{¡îOéŽâí̱²²>ïä>bšÄE÷ÎàËå¥ÉŽìÞ2º§½¥÷ æK´(Ÿ ‡pÅŽ¤õ1©![kÃzâ‡7‘œÓðI›ë7ÆŠ TÒ6¥¾DXJÊ@“§’Ëv¾%Ù43I†Æ~ñyíh‚ÈM£šžøã˜<—JÕS(õÎw#µ,«GÕ7xÑÍ[!ü(ª*t•@75•¥‰˜*ε­:ÈŒ[ÄLg&þáiô‚è0 5x\4¯ ­>DC‰¶h‰ÌÔ%òþ¡)Æx»’:_sÂ@ÎÞ$c¹±L§¢™| JµªrÍ;˜»-}$‚¸zO{†SÛ_ÞÇÚ6nùò²>ôfZä&œØ²’+\4eðÑI²Î\QƒÈ°kÌLÑF+ŒÚ½ygÆjXM3sУ!ˆ'<ç[{Oš++ì`£õ”Ö¦0a8uÊ‚¬´‘Ò­°¶7dHz5`€î o‡Z»›:ݵ=pꦛB°Äާ/²¥ÞgAñ†°ú¼¨ð‚U?i - Á®µƒþìè—<5q넌#”ºg“Ž·¦'·+mhcE¼‹ã%ojÑ5C“#ìõé÷ ©Ãh „¦27x½ÃÞõü(ÅkÅêSEÌ|lëz¯K¬ó¾@2ÿ¦ xø¼Ž¸òl1$Ñ»Û<û;{z{Ò÷E ÕPj-ý_*n­•`ýãõ¸ã[Ç]ßz±o#ç7áó'„ÞzÒgß(|08‹§üe â¢XŒOß~ÖÀFŠ×ÕÖì3âõá3²X×÷Þߦ>ÿ&=‹OoNgÚP˜%BaY”d­0¬þ…Á,Ûç}d„•6ô5x#ù‘¥Ñ¥1™kc_ƒ%°±!¼?v8âlÎ)63ëÝ7PÞƒ¤Çã#/©_é!¦žÿ>Cº÷Üî–f·µÜàV¶fuïÒm€·èD ¢Õ[Ó%i  ñµ’Îl'ô—ïc6ynÞ¾å]D}èIkšhª1ÖA-|»øÈ‚úC¾1hž÷|Ë•v¸g"½Þ¶µq“~æá‚¿óùhm Z¡UÛ¬ y×e7…ÁfˆÌÙ™(Û¥MÀ»æ¡‹|ÔˆS<ïÕÁ-ËD€mËJÈÞ Ñ€ É•®ñò+ªñÙ÷ºˆžà컵”ÃÚFñ ¢ØˆlÇ< Bè"3DÞóÚ{ù&¦™¢`–ÆÜdj˜‹¨Æÿf$jJÏ-Îâ$šâ5àz߸µž¿G-…=åS ¦Enœ“°!'VÂÜŽ9¼~>M£1€‚½x¡Í¢M”MeV‹ÉÐË5ò†fB.,…Å-›n8^tÎÁgU—Oœ8|ä‚ã .üy®ãiC®À 0”Um%í“U„T•ÚªfCTh>¨ ¤ReÜê^ïxJ€í‚lŸ¾=µÌZÑ‹8A]ˆD ¸FyÐïL~‹y¯®èCÈž%SÌLl6#X|Eüµè¼[×½ßd1Wè+ …êBKa]Ò±²> ÛHGÁaÓXe"ÜÙõ‰PÞD£ š´ŽRGæÙ™!@g“¡O—½*âKv¤öwïmëBCIC¦ü:&”?ƒZ½%úõ¨·: á³o:oµép{ÔÓ#M×¶v¢—œ×qò­@ÔKèAÞõÜå’¨J°ê¬@7Ö«óDÌ%*?W#T€R‡;½ S¿…¯+œ¿7Wk¡NÍí‹6Wš­ú*f›«fÀxggW\u¼=N ôl&™&“˜cEŽxØ)EYR©DšªMú ²H 5"´k,PÕfSµðc’çõ ȶ®Z¦Ø$ʇ|\AîtHf.Ú&v{'8Qê šãƒöù»æVí¨W犀á(™i/,–ä«2ÞCæ2Û<¤é€îØ><µät´ôë{€F9ä>x[Û•Eó<}ɺ ¦´‡ÌEÛP¨•Ãc’\C­Œ:#iôp+7Òu†F¡¬Ú  ]ÔíðÛ/ðíõµ6ÇÁ‹W-—h#&­Ìt±ªIˆH{¥¦@Ä\¥òä 2‹I%(´JC¡Naü—x|s(ŠèB¯àYç*"ŸÂø º„€ï©=S ÂÁØÎ˜Úµ[ô‘»5)ŠRuI&»†,Ys.Њ²R…ÊtePN/¤äúâ&a hêMöÖ#GkýîÙâÐåóJ#E)dk´ :#(”#µLî¦~u ]ÌËT”)Šr’–$./UdefÊùÎBgò©”SɧJK¬™0Šœ(· ½èç';°Þ?rR–eƒ£XÆF.Ÿ\(ŠeB©B™Z†)Yä£äÏ6ÿ:JºYr ŽP’ü È2±èQª¾ág›G˜ø¯0ßM‡—]wqõt߯oñrX¨<#P¥’{rõ5# hô9v£7F´„´YXÙË?…y´ì¯‡ÙugÆe6²SR˜Û؇ÇöÕ ]&ó†|£{·µI,º]ñK·»¤+ýíüA5m#ñü7ù4š&ÎûOfŠ(6Dï¦á;·w<ü²iÏN(ØÑ–ÕWÎÖJ3ò)“ólïA o41ãWâ²*­ŠÝr šîZ5¹ßÿ%`Žï♃M;¤DŸŒþ"ÀVŽ|ØLe6¦Ø’ ´œdÆ1‚5Ì\æE4i1ˆ¬¤ÓÐikqÐÌ* ËcGäJörHyç2‡V‘-ÒN…S'*ÄCüßáV÷È´kÌK"9™¤NQdÊhäÄÞ k·|ÕâÄiÓ€ŽÝæê!eîz·ÕÝèdÈ¥~7n×ñmÔù6D£1B'¸ i¬†rC¹®ŒfLÔÎðT±p*d~£¸ÀÒ&ò¯Gq‰y°›hõq¥Oë(oÌEÏ3+äÊ¢B¥â±ìLIþe RÄbÌ9\6»)y–©Zf»Íl9÷Á`4Á ž©“é4z<ÁÓZJ£ÊÖ(Øí¹nµ Š âýqwˆ.7YÀæ ³Ñèî48êU¶*{uE‹½SÇVKfsUÝRV(ÒPÚ’¢•**BP¬Ì“ªð½¹Ü¬1Hö ¤­Ñ°êÍ-û(JIÑ«x][®Ý·¶ˆ½Bª +ó5òð>c+Á5\ ˜I©äOô\¦@¡V+44³ŒT¨ðAèkªž­ºWtTq\ïD›:^«F¦9|pŽhõü—YŸ ß…Ãö¡&šYJÉs|i©üÿ©~“©”)ù[cž}Â?SµÿMä¶Ëd÷â9òã}wÿÜ ¥z œ9ï¤ëך¶ýOcð9kÈwÿ<ó9ÿ¢#÷1öê€;›“`}ß‚&ÃW÷îûßÚ©ÓðG³ç#[½¥ šè ³Þ™'džE’£û Ö„õ,'½Û ¾ ÀO†|ÖÌŸž§g»·Òõ\CÝ]à~û‹Åø9 GüöVFÌ¿Hy?cµ$%’‚¼Ì”8 ¾ìn"KÊõ•"ÌÎí†`­kCóÜÄG¸(FÝà¢|”ÉOÚ’²+=Y•š©H`Õ¸ìô S›iÖÖV{]s{ÓÞæö†fÉb2W² >ŸMY<•ÝÉ~õØQL½È,R=½ÑÉÃ"4§¿Š\¿Ìôé¡Ú½ˆ}@Út%Å¢‰J›7¬EëÛí$i¢„ã¸Ö%ã°Œ§ÿà÷ã†+ [7ÿøð?ñŒ endstream endobj 80 0 obj <> stream xÚ]PÁnƒ0 ½ç+|ì4M¦í!mTT¨b›JÛ{H ‹T’È„?HQ;Ø’Ÿß³ýœÕ¾²&@òCN5 3VŽn"…Ðbo,K3ÐF…­ŠY Ò³¤¨¥ÿ’Br<NÕõ¹n>딿\Îeú»;å<{„l««}3‡Êv„`Éi™8ša÷¡]‹O+öMÉØv—¢‰H3yÃmÎò<ŽKï7)§qôR!IÛ#œç Ê2ghõ¿Þ¦h;õ+‰‰×raf‹Ü ]U«¿‡=5-{㢣u¹±øø“w~UÅø´²mV endstream endobj 82 0 obj <> stream xÚcd`aa`ddäóövò Óö vò54‰˜…ü±áTÿ¥ÃúC†á‡,ã9¦òÌ?ÄYd^ ‚Èçü ò±ˆTŒ‹„X9êZ:Ss J*‹SK Œõ Œœó *‹2Ó3J4’5 --ÍuŒ ,sS‹2“ó|K2RsK€œ…àüäÌÔ’J ›Œ’’+}ýòòr½ÄÜb½ü¢t;M…òÌ’ … ÔâÔ¢²Ô·ü¼¿ÄÜTˆóõ ”kiNjÐUŒö@¢‰‘‘eó¾Ÿs;7ÿèßÌø D2ÿ ÿ±Ytæôî‰Ýýó*{:åZº;:+«í<$Ê:žúÍÒÍñÛä·ÔoáßVòݺ›BæçU×tuD”Wvvv7qÔOnž.7©»·{ç%¦4^uø.ÐÍñÝî»Àw¹ïúòÝ/’V,ëé™8¡¿ŸãOØïç¢Qºw/äø®òý;Ów9¹oÝÇý¦6p,Ë]?'²;ˆã·ÊoößL¿åäºýO4Nãà+ŸÿÓqÛï¤é웹6s¯›ÀÃļr\,æóy8¿8,¥ endstream endobj 84 0 obj <> stream xÚÕ—{TSg¶Àsœó‰b)1Sè#G{uœvFÅ'ÖŽ ÆV õIÑúÑb§ HB’ì$äABDžŠ &‚øˆoÛ¹:£SõúªÕÑ™¶vYk[gÕŽµ;íq­Þ/Ö8íÜ»ÖÜÎ7Y9k¯“ïÛ{Ÿoÿöã0¢ÈHÃ0±K3Í]˜ùëÌÔ‹ÇOHL Ý›+ Ž‹&ŠƒÃ"…uÂùgÙöïÆG='1O†®ËŸ]ScéUô"½Äþ%Nô †‰–<;jlRJúËr‹*ÕFGËÿ™ë+ó׬Ÿ˜8>é‘0aê#aÊä°0%,„×Ly¼æ¥GBRbX˜&……°ž¤ðö¤ðö¤ðö©áíS'„…°ž©a=/ML;ñ•’¢Ò E^ùð9%¹yåÅÃg”¬Í>³J‘Wœ›—ûOÒ3ˆþ3V4>âÑ»¢¢>øB|7B ‡2H-zB'’ˆ†1 Œ‘11f celL#cgŒ“q1MŒ›ñ0ÍŒ—Ù(z:BĈ"DrÑ%&‚IcŽG¨ÄÑâ¾È쨨¨V6‚}›C“kƒ¾ŒÞ5Ø2ä·C~ózÌ©¡iOH‡~ÏìËõ ë+¿«U2(º-Ư¾ÕJk UÕj ÙÂLf€0ÿ=á LX‡Áetq9]!¾d¥Î‹½ç.ôaä \>p4qÕ²µ_[¨]%<íš3*+Y?Æ‘427fîYqxÁûÊK4fCqØœÌù²so–ížÕ2’aFÙÒ rIH—þ‘ƒÃ–ãý}›7÷yvÂ,q¾jUZ”PEŠ8È2.(Y­(Ϋ͇\ÈmQìX燽 áäõá’^×wœ‘‰H$_÷3¤Eœš-n ­Æõ¼ð9W½ÞX%Ó€Ú¢"ÇýÜ ŒÜ|Ÿ‡³/í]â"’àîçÚà$±r·„Ø–Ù$¡Pz—•|}ºwe&EšbE•¢ªÔ\d.«ÑXZxÌÄg¹MM6ì<+ ܽnñk©êE<-d7/nñãz™»Èˆ}ÿÚ—6?§‚ZÊ)«°mâiÁj„F‚7¸VºIvˆÝ=ænõA…ý k¡œâtÊ}DéÕ¿ “q‘Ü|²7óâx ÕõȞ硽6c:ЛuÆWã × S1J¶ZX`mí'|½DRµ½{wc?S%ûŸp®¡#™H8Km%ÖRj®©fFBåz[+åÀf¶SÛ;l2xÌ´±ôrBÚƒ_I½Ù`&B Û`ѱ‘X8°»›/ßô`ŒÅÄ˵9í­2³›† ¼ð0˜Œ¡p2ãfú1³§û™#Æß`¹ÿÄnt¸¼ß,¾'Lâ߀Œšì‚7W–½iDøŒœˆ¿”]úz¯ZmOÍ­u¨d`V¨×—¬ZR¹–Á²Žò@Å€éHo䵞O>•]ÿ,çìP½´Ö†:ϽNRÃËzq²??ÁÈ‘¢»øš¥û[ÞßgÈ}!É1KV rÞ¤7èÌÄÄR¿­F[¥'ÞШ³éhiÐix0Xho$Ó9•µ¾SÖ ¦ý}Û¶wîrÐÄ=ú~]jÊKº%| [³YEj<à– %üä;«g%§+æñ áe{Í£×¾©ˆ–U7è5|=·iÌg57àà0g'FYìú^˜Þ¿ÐM~áܾ¢)M‘óÿkäÀ_Ê­‡*‹ÑI‰‡&ßÞM]ÓNÞuºn—›\Íz£’nЄ7pu 6×Qxª)aF/†ahë|ƒû! q.pSómÐf²ii¥MaÞ…|yá2ùò‚ÅñtD¨Ói píí?¦èG³g›•qô™’ñ™ñ™dJ÷gÿŸ #¾Î×G¥²%Ž(É­ÖÖvøag™/ßJÖä)²iÁ/=û—Ïû®ó’ký%¾ÜyÙ*mÒt(Ÿ>ƒ#„øÁXšî…ý«÷a"=’ñ8á=@º:ŒJrò —Tp¦,cV]¶6GóV:x^~¹àRÑûÚV“·'àmèçå ª ÊjÛFÓ0[Hãj•ᬳÔÿ[p>â€ZTòôE ¸Žv[;]Óü8áî*²è¢½[‚K¥)õ¯V,O-ÏU-§53£}þÞUG–^¬:çàrû‘£{÷¶ý¢q²òÔ[¥ï$·Ò陎*mÿ~ﵯ…å>Õׇ©%êÞó¤9]œäNw—±ÐÌI¾NÍA¤â¶¯è@õaÚ¨âpÈ‹ƒ_þFx_‹ÖçÈÉ1NxV|N0H ³kÓÓ jêkŒÕ@V&ï<Â£Š³û.r¿SˆMåA:³þqñ>µ‹Ùj9ßÑ™L¥ªWA%vVúôÄÁîìÞêÿXxÒ¶ŠŸ ój—æg®,K…TÈh›»oå¡e”gá"\Þî;ksºB¯O­U+«g•`©Ö«ËW¼Uö&=ª%ròð^óý¿ÓìØjÞbðԻ–¨Å”5;ãp5Mèó»)9!…¶gÉ.8f¿~Íé¥s™ˆu[ Z^øW£6©ezV¡éUŽðsT¶PYϪÕÖM<ÒD§o™í‡}æÍ…Dr¾£Äº„¾<„¦ˆ”Ðôü›9“³KÇ\ˆ1WþoSK'÷)Æw`Ô}ᩎ üL` ÚÒª•¤³ÍXÍ wB•·J¦¦ÂmùÜ¡Éì?À}áGpwþ£ˆ<8KG²Øão¯™ÍC±ª¨bCYe¡y-l]ƒÍÍÕ4ç7á ëv/+,sp²h±'yÈ çhËÁ_F,KzÝN?Žï‡ý7¥kñk endstream endobj 86 0 obj <> stream xÚµW tTUš~!ä¾–y–Æi|Ï¥íѶ¥dUDhwTd‡„„$µ½Ú×,õW%©ýUjMe'€ꀲXLZ;¨ ‚ÂÐŽÓí ¶zlççµ§çV =NŸ3súœ>}ªêÕ9÷Ýÿþ÷ûïÿÿwó˜Ñ£™¼¼¼‰ ¬X¼|ù}¿Z\VöÀÔYÿ’›žý“<*{[~ö–Ñò:ù»ÉK®¿[pÃ0ŸNÊ=Û'äžÎ‰¹ç=ôÁÍ.fòóòFó÷Oòàª;UÊM5·/¯Ú¸©¦òö2qç&MÍ6:òWo&¯èμ{FýŒ™ÂÌÉ{˜Y’÷ó<³–y‘Ù€Ê jF3L>3š)dÆ0c™ñÌf2s#0÷0÷2s™‡™ùÌæQf³˜YÂ<Æ,eg–1Ë™L)ó$óó+¦ŒYÉ<ͬbîÅä1£˜hž1ïʨYù“òŸÉwä=zÝè¡%ªDÙEl5ž„M…ã ÅÂïÆ|7¶aìõqWÆßQ”_ä)úbBýDnâÀ¤[&E‹qùZMiRšb¢¸²à×_ÒwŽüÇuF¡n0‰ Æ–ë÷¬h.m^ÑTã(€Ž€' m8Ær-¯Ãñæ×Ý>·|¸SLÖðܹht5–Þ,6˜ :¬b¹ÝžÒ–Ò¦Rwm}Å+Ðëuö5íÂܵ|#g 9ë[ŸÒJÀY¡¨MMædÈÔ ™«É#Ó²O*DjƒE%S»piå©¥Hi2étSRxÙÖÚÊ`ƒ[1G{PÜŒAÜ{À°é&…ÿïëG©ÖPÉÇAЏc@Ó­1éjww4¶ïÒôiwiÃŽ°MœbQ:7‡µÁj©&ZÆvotwzo4âú AcÓò&0ÛÌŽ m¹¶BãéÈ-ƒã,„=„p›9ªáE0]:xžo^‹‹äB5 P\kŸOzšŽ ;k·êLuúЀ>bˆºâ–b¡ýݽÇà8>Vst9_îÔÖB%ÞÞQ»›÷ý¸‡³·px™Â|ÒLÆ(TÎJlÄ]U}¼µy{$èÇ»vv—ó9—Ù·iýѹr!á¹³‡ßšìü¿rÅ]ý_Î.«³&º¯»Èi…‡=Øv°ï@WO¼7Ñì/i ¤‚¤a‹èy˜­fûÌgf­šµzéú“Ýl=èiàío¯/¹¼úòª+Ï„íakk.+#ô’ê !°¬¿¤t_é¾'_6ùM£¸Ë’Œ¢‘]«Z[¾ng¥¸C[).ÛXb°©­ ¡¹`Œò­†ýWŽ^>~ùØÛ%’?€(Di6ù—”Ì:6ëøÌ£f¿9h¬7iriRÖVÛàÆ’ÌæÌæ77IvÉqà"k†LÏÙ¼}C$ùN~vÌ~…ƒU-éX¼¹‹'‹%6)“i½O#ÈÅHi6‹bÈœ^CeÛîœÃ¯€5oiÞ÷;Ãa¸øâ­©x‡ÔoAÿ_Yó©> ¸»9žȽlÚ&ix%XªZ«×î·z«cåþ ÀV$ßi}L~ä[a±´pïŠ=Ož\ù^=¢#ðr²¯¹3Ôd†¬Í¸5Å)²J¾eˆüdø{…¹š}Mñ'sË©¥ÉªÑ…iÛÏPZq{_AtÜ ~—pZ %®ß’0‡”|ђͲ¶ ý­v#vYs7JӘ܆2 Š§FpÐ2Ä3s‚Ýí¬2˜µ9gê¨-ÉwËkåÍdmwî}*H%La¥0lgÿ#g§4u…¥‘¬i¾hE~}}6©âzH¿Jqýn2‡4$Ê]œÔ®õiy®gdòLdS£ÃÔ`+æ'˜Ý´žñw÷³;â IžÌ@ÜÖX±dK‡Àõ@Ä14áºÒå\é®OP|w·<‡56ØL`ÄÜÖÚ„#A}DˆÌDHnÝJ‰{¸˜ ì C_ŸÂöŠM^¦¾¤‘hè4u59_F¿±µMÊ»R­¬0`uÔÔÉ“ ¨#*%ˆZbZ–/#pRެˋ™¼CDMIyVvœ"áIÒ†ŠO¼#Nd$?V-MûdÝya^ñ½÷5ü^hI©k·îru–P: M¬=mñˆ€5HWí¦®ZÜÍÐŒÉr®ÍsŠoA«g;¯JêÓéD"-@4¹š0Y&? ˜Î.šéX¿é‰øë¼›…“Ÿ¤|}-}M}pcïÑÍý9;VA1%|¬LhÓ|Rs;>?§¹”߆dd~ÈËÿ&çž?§ÛúŽøÂá8DqZÝläwh¬z±|›q <‹Ï5^Á-ìÕ3—®ñmЩºœ³•r6CØLñÞ!Ò4ĽF¾¥ù/Ï`+º6%_¤pÓ\9_.¸ã¢<š°Âqèoß³‡öEÎP¶¤ùË(ÑLÆ,’Jx&E)K¨šŸƒ´”Wİ9)ÈÏÊ_) ÅÕ -øƒS—¯ž:^öKÌ.3XFòˆ{miÙÂÇøy°î#ÇÐ0vþ4QdòÈ$²RAŽ öÖ@§§ÅÁ÷oݽ&úÝÐøŸß-•oþö~R,œ€LÛîC°‡Nêü"_ ZDuù& y.,yÓp »O+’gd.ÁØÿbøIÍmõØr$@3¿ýª4SL–q¥Ù…йˆVÛN«ÆhѨ[mIáyp6täU&Z‚`š¢˜ìEí4Ò)S Føg2HnF‰p$Ú©nÖ òÄèØÁÔÏ}Ú öõ/N%cÝ‚ãèsÞM° ~Q¡[Ü`ú¡½N{Š,:yêYwªESÜsJ3D~9ôò)î ËÈ kÐ9+©&¨ j#µë4;Êà9,³dJùþc ?ÚçýûY‚å±]³ø©è]ò%Á˺}M>¯[×cÛ øÃ+o~%À.Û.±£+X²ÇÛ¬˜pkâ’'‰o oã+ Ü¶SWßX__çÂ.d1bhÁÜ7Ñ+6ia<ºÔ9ÛY¨ð¯ëPb³Ü®à¾µ¸šÀMøÔ‰ž£üçèˆýšfàÙò›†/…Ÿ´ÙÏäV8B®+ìk¯¼~œ?½+±}vÃÓ«øÕ°¾ßùÆðœ=CP¦8Lî[’ÃÎ}~m˜~W³ÜE£Y¤¬Õ.é¨vƸ1, «ÉÌ·vJ¶”Šf’OP¯Ø,ò2¨Ø¡ Y;§B%Öjj“µmIJŒ´kÚ«iNäÔ[#|ß„²l†ŒÏÐtgÙ n€0ÃØËXîÆlÒi% ôJÆümÀÊ>D^ eê÷Ô~«Òl¢-A«ŠÛ)¡Ñ§ÍI`?àöH®ÏêRS´"ÒCCÐTw•ÔöÕöÕÐ_I·Þçôb7 †¥pøÕC%‘Hk*؇¼tJé‘6oŠò\ÌQñòäÅ¡Ñ:”ú!)@òtùgäcrºÛÓöH%ÿ(ÒkœJšhI‚Ìši5+)›)‡ÁÉ·±Z›Á‹§‰27ù%[ý©6c V¹lujs‘|éU Õ´…&ègÈP¦¸Œ*;A&æ¾Üçÿ•½KÑ-¶¨ø‘#0#­Þ®¦¥0Ò3â>ê•)Ý;s‚û\£·ªi(“Âgô’A#i–”ÂH{#Rîõ]Œ¶¸sÜ_²í‚¬5°½]EuI»ð)jûþ¸U—‘=iûx&¿ ^Ti+è½Ä²wk¼Êa»^¥a¢•gþ§Α‡²ÅŠ(ÛaðkøÙœU3Œ€{ë¨<¸qÿ Òé='CÒ¿É'Ùe y¬nÑ} Â&Ö{×ûw’ €CˆŒ‹œýƒC¬ã›_F¦£r‰,* ÙÕB;àû'?úw£ËÇf,˜·rÚl¡Íó­}ßqžò]u†üü 9¢ìZ÷YîE{³"Ħsrè‡hwôO=í¥ÿí&ÔWþ²ê0 /¾JòúãbÂÊ„ça¶¼·ü„¹àéùó/^wqP€;A kŠÁ=úæÕƒÓóP窣·ÕHO¡¬X’Ó+Uä[…k  éŒUò2‹DÑ¡Rç6Áu|$R…µuX¼J¦Õ!-´÷·Ð”ÑáVˆº¨&ïMx;ic¤*EÉÒidº|„ä“q·~_½ØÏNßZÌíöU» TCô4Åã¶Íé5ÂfwËã››·ž+35SX5P~@n'yH‚‡ðy”KÏ»Ð3°&¥:…¹ kÚÛ¸ªNšìNºwV‡LI¾¼m-±á4¡ša½ÅütˆL¥µýSÚ;§¡Z³E£iµ%„ßÉ"z*8ÜtáâáË|ˆíÔyE¥Õ¤äìšµêÍOé^:È ™ÁÆÛšº„aÁH%Ú’OP·Þ«ÓêU|QÝÛ¥¹ª(¾6\‡®åÈX¨ôTÅj;7µ„p ¼»sZÑ«ïæ/¡TÌ—N‚ZáY2„èMÌ>Üf Wòósd²S2¦„còzj—Ê,ª¶¬7olB[<5az#i¶Ã©ægQõBÅ{È”ŠbêìØLÞï©ë–Ú`­_ùª|G‰´>º>¼¾uk°® %Üq¡çj×ÕÞ«Í¡æ '„ûP:LRa_#Èã‘ÚhÑæôºÐ‹dF>'3ä\A/Ê ö¸…6:£ÆlѪbvÊ”ÖPvA€Ì!Yãeù1ù¡GÆúÆqû嘣cù§¶+7jë§ýù¦ÿ7 endstream endobj 88 0 obj <> stream xÚ]‘Mnƒ0…÷>Å,“E…!)É!$ýQIö"c²Èíë±i]`}~xÞŒŸ£²µˆ>í$\ ´²8Ow+:¼ šÅ ¨A.ëίrl ‹Ê·Ö¼·#BtIг–“ôíåz©âöáÀåa’u_‹æ1/8ÖºŸ Ë@ôåüæÅ>`S¨©Ã-iV¡u^°¹–Wš»1?8¢^€³<÷vq˜ÈµÅÙ´m«oÈ2ÎsȪ*g¨Õ¿ÇPÑõò»µ,‹Sw2áñ>gÙéì˜óâD\y>—â}| >>:{Ï ÕŠ4pJ, ßí´û뻎XÒˆåkpãä\8I 'œ×K°ã«W¨¦kQüÏôåÝZŒ#9¥3h|>£™ Uùïm°’‹ endstream endobj 22 0 obj <> stream xÚí[[S¹~?¿bÞ6©¶î—­­T6„Àa°„l|À!®â’³µûïÏ×ÒŒF3;$TR†Q¤nµ¾nµZ3¶à+„.Ç¿+¤õ…”…Æt…ѼP¼p̲ðJBœ1ô4(+î¹ä…ð(XUÁ……Ľ„ …{iÑO\IS  ѼàFØB2­à V(ÁÌat”BËBr¡ MÊxQh°0‹{Vî í<ĉR¢4( ê!B@ËP:VX°jhA¬Ú™Â°BT‰q‹S…“(1ŽÓèÊ¡Wa-5{ô´ºÐB±Â30  R«Âeеp¤3±[tv`£ÎÀ¡3>‚:ãOB=Ž ¼.¼Q^áU¢ÊÑ…KTX6à„¼bÔDQp€pÄ‚Jæ-]!$¬„?.H"Xa*tçÉ5YŽá€Gæ ìdPo@A¨ 0*(‚‘n„"£Á`f(Ósaƒx $À€À¦HKKN}1Q.¥¡Q-5æâ¨ÍÀ¿ý6ܼ¾šSkÂ÷‡›0W$`H¼ ` "AEŠ&)Ò=RhÃh‘äY$V‘”„Q$aIM˜DÒ _¾îÝ\ŸLç†{›ÃÃé?óáÖåä|:ŽÅz,¶>¾|ùŸlZIå4‰Ýsåj•Óü³ uª^MýÑ:&Õ:!ìÖ·C£GëCHÖ­nS;òÌGè‘LÓK½ b•4_wÈLÍÚ7“šÕ-Ó# ž)”ôÈTïT©œã}ÕØŸÞ^ßÝœNo³ƒ Ã¿L‡{èËÍôjNÁžêÇз·D{‘]/a—-vÕÍîz²ÛŒ=õ¾E‡;ô-¥·gg` "h“ëXÊ~Ó–¢›}™ÞªÅn;ÙïǮؽ§-ƒÚ»Wpš²oèªJ |¼‹†îLÏf“õë> ´K8%Jqã›éd~}ó¬8œ×wó/wÐÝ€™Ó¿rÃÝsrdz»Óéͳ³¿g_Î>]þSüõ “Âýõüy2»¾Ú˜Ì§Ï6~%~f°%‚™ûLþÂØ/ÏãxAój’a.ãÉ|rq}ŽæØdŒŸŸå+Ù@/¹[öQÆ×xÅ·§*)'å•þ‘4¡ž¨Š#СwUCãúÄkµ 4Ò‡}>š–‡>Êù8^Yfz-Ôü´®L+ÀÞjuÞÆúê!+¢›Ð—zÀ³–Sq¬ª¬¨Š£®mÜ ì¢|ØÙÁ_¢>ZòDV–ϯ?-»Â掷 ¶N±Ð לæþYÚ±T8_$šE{9È1<Ê ’¼MÄ¡?Qô{jÁ8x:VZ·âlŒ‡VO>À¾®}¤3¯ÊÛÅW0‚„®Zb¹úZIŽœ½ðVz C´ZÆQÉÊe&TvmÌ€b¡ –rÂ…û¦†?âGk1På5âb™ ÿFpèŽã6ùE9?Ã,lëXYÆ«ç,ÑÖʧEúoyŽL%#³ wΫ¥†DE uÝâÕAÞ9‚„¼•8ËÚ`­¨m¤ó~ŽÑú‹×rÞÜeZô@Ä LØë,úÅk˜M¢âÜTXá½±ÞW±ö°0Š˜«ìãä€ô¨¾Më”vfÒ‡b²‰+ <¨å¼\ÉX[žsôŒ³§µ.{÷òÖ\ÉŒ×j¾qþR’ÎÄÕç¿;«ñÏù¥äUF’W9ô¶.â* EÍeð>â68Ëø°c ±®â’†z‡¹—Ru‰3QjªVªXU0JNK\"õHˆÀ‰íuÏØCzÚ¤²°ykTµ”ãIV9EMÅ%õ¶½ò¸bùÞ')$——Øêxre%]¹¡–XdˆhB]H‚b}ä¬úˆ’ÛqÞÝõ½Ñ>!¤ÑB Ë8»’} YS «Ö2p{Ié³·Xôh‰ˆ”ýb¹Š G²¯‹3ÆtäýD©ËdW«¼^X©ž² _\×x µk½¡·,rræôTw¥%±–;Ûr¸8‚£ÉºŸf«bd=Ûî~Um»lJèªY¬ï–q5p倘ÓR-¬Hwk¿¼ÍxÿàL†â²[:R¤œ6+÷ÁWö-z}Lo$è]Øðàîsº¡>üsv6ÿ|Kß)o·f7·óñçÉ Î´Ã·“’Z _]^ŸÍ®Îétx+pýîj†ª)¼'T¬On§AþÑèÕûñ››û;Ü ݘޞÞ̯̾oèkáõYC©º}8ž|y=žc UÃÑí)½o1^©ÑkÜËáÖ|r1;]_L 6<˜O/œ†›“óÛ™ëô.e[U¬IzS/•Åîï?†ÆÍÙÅç‘òå*v'—Ó¶ê-%— g[È)óPäö7övGoãð‚±6rž=-rÈ`Ö¤@ê­åM¢œk"×R½r¾…«“5*‡ÛÛ‡{/Æ;ïœÉóþÈ –a 4Ö¸0UB+FH,Ë0‘¬XóZÓ×>4Îx gÒ¬ I®w/<4o{’Ï=IßÓFÇG›;‡0Çú1WjÑ“DØìã=I`ùa Ò×j´€Ít6Ñ„­¥z?äd 9!ŠÜ»íí7ÇÑ‘fÜFN>ñtÕD„n­A­šÈµTï‡Üª¸Ï9Ë–áû?ߎÆpç-¾èPêëÐx•â–/F+:£(ÖDx ˆhd5k`ÓŠì íû!ÓŽë\fÈ^#óûhüfë²÷;€ÑߘÊ_ŒïðÅ*H˜_€¤²sµû!Ҏל=x™¿·÷Ç+øêáVç23ßz™5ü)­µ†?yU­5ú¾ ´9x¦Ü[ú÷ÂϬŠï:s¨7ïF£Ñ.YfqóßËŸ¬éð'i*²¬íO¦¸3­ûÁ!ÜI/‰=;ë[[¯ÿ«w÷}Cër¡J\ æ.­°œ+¿˜z¹˜–+¤ÌòD©ÓÉÉû½×1åèEþ»åJËIxäJ&`D¯#›¾±MŒŠ÷ó×öž<íÎÒÇWû{G¿¿}qü~¼µ?^£/YÝ]¶¡á¬wj;† kƒÒÈ„…\…p² ªŠo¢Ò¥z/p,kƒ#ò½ËfèŒO^½ÙÅ£ƒ×KÑáO‡Žá])ýçÐXÞ‚¦Cï~Ј4²óбw²¿¹wÒ,â!¾×JÒ‰‚§o†KA_©7 \d—\ï~x¨ö¦¤º§ïŒG¯CþÉüâñ•¾$ÿ¤¹3’Zl§†­ýÜê&n-ÝûAgVœü9·÷€î¿o¶ßŽv(8솮~ÍëM«>A'±ÞãÀFqJÓ¯Q0I§TºVìnéÞ:·ò¡É}¼îèhgýä$ž;2IúÑÅ“žu…-ϺVHx]3е|K÷¾ÙcyvàÚi¥ÉBšÉbÚööïûHøwÖwx‡‹Ý#åÖ ó8s®Ñ#%!jÆy×J*:÷r-×N+Ë]‹ßõNþÜ}wÍ#ºV¥}b×’ÕcúA”hdT®•u¶tï]ûa€Ty@s÷€n}}ws'…îUéž6 1:Û~Fiú\ëYAK÷¨$ͬš>ðº]ÝÎÒýÆìÓ§éÍôêtzûAˆáôòlrûypú/&êÙðünvq1½¼ž_L?Í©¶®¹¡)†ªÉ§Ù i(vŠr‰ò%X¢x¢°Áùº‡N”)ÎçÕ]’&R_™¤É$M&)¥•¤ÓyÝ×á.õR”Þ&‰ô+E‘ÚL’`L¢ÒœMÒÒ$-mÒÒ¦ñlÒÍ&É6I¶I²M’m’l“d—$»¤­Kc¸4†Kc¸4†Kc¸4†Kc¸4†Ocø4†Ocø4†Ocø4†OcxK?ù?—ˆ  endstream endobj 109 0 obj <]/Size 110/W[1 3 2]/Filter/FlateDecode/Length 302>> stream xÚ5Ð;/ÃqÅñsªÕÖµêÚªûµnu+ÚªK]þ!‹Mb‹/€W`°b”-ƒW€Ád‘˜Ä"¶âä±|òÍy~Ór9D© ÈÙ*Ûe§ì–½2&äŒËQ9.rJ&eZf5È´×ÚC„2Ö”…DâÀ—,–srÈnÛ5Ozå¢\&Ö’vuËbóÉ–|é—EÒ'ˈ­{{SNìüw±ïXW‡çÖUÄñ­u¸¼°®&®ï¬CÄC̺†xYµ®%^}¿?€·3[êˆ÷Gëzâc׺ø¼±n$¾âÖaâ{Ï:BzÖ­›H¿ûïoöDÉÈ‘u3=±n!cWÖ™<µn“²KöÈ>Ù/å°‘crBNÊi™’3rVÎˬ\’+¤ó üز2{ endstream endobj startxref 85468 %%EOF glpk-5.0/doc/notes/scf.pdf0000666000062000006210000036037313766346220014665 0ustar maomkpasswd%PDF-1.5 %äðíø 19 0 obj <> stream xÚÕZ_oÜ6 ß§ðã‹U‰Ô»ëŠ¡E3`+°Éžš>dm×hšµk±aŸ~¢(Jòs² è!çÈ$E‘?R¤äîCg:ÿL  Aw//»GgݽÓ™ À¸îì·ÎY…¦ë†îìÕóÍ9{ŽÎÏ6>{>¹OOHã™Þez§#üúü«“–é˜ÇƱXsЈƒø $‘¹ˆÛ~'Ò"׋³:Õ8v=5š¬»È% ÂM\‹¶Ž(Ê4‹áQz¶@úÉÛ´š3ä_Ìü.s”5¦5ò¼qÒðÞ t&ªç’±Öj]Zd…ãPäOv1¾>Ê2›¬5†sY4vA‡‘¢+-KÕg¦ïª@öT°¯­øxzÐÆŠ"³QYšíâDp”ƒ®w  –•d£dSFqh6³Ž»w⪤¾A eFFº8}`·D;CoI8{†Bãˌ䩄Û-n;n*®’¹AP*TìO~›(¬,0¿Ëš%Œ±V [´'\Óoàñv¾„>vmo¬mü!× °éµY¬®‹&µ­ Ä¡éiÈFJè!z¬ J ± eæ•e%*\ B‘Ÿ@X‘†&ˆ3òœ;  OÖÐlŸ ±”h¹̦F(™& ,=«ç3¢Ü ¢á¦£¦ì§ßM¨Í¾|Sµ©º-å›ôv9ßLLQ0Ѥ ;†”‚ŽzTÓ’WÁ#ȵ›IsSLj5Ð L¶+9h\ #²wñ ÚI\³“fq'Éä›Ó—Dú;äóÇç?¾ºüãÝëË×ï‰ìSÿèâÏׯ"/›“£7/?]}|ûÏŧ·WïÏøE^“cv@ •Jž|d^rn)œd ÈÒS&9š©¾úóô4r Î9OòMãkÊR„k ”*™èX:9BÙ™PFÜ ÷OŠvÃ)ÅfŠ¢Qƒr–}ʳ(z´¨ ñV–u÷‚,¢³ANKK!šxÓg-œ¬.ÛÛ È}Tƒ6´Ðì”ÂAël¦[•ßœ>&rÇ»`ÁMJ°IÈM=²­ÇMMÚE…U¼?,Æ»"6Û_ 0Çf©cÇD Û±èk"N»~¢HkAÎÖ×=4Õ|h—‘ŸøŸþrúÓSÖë¹9f8æ|¡b@òÎï;C…ŠO[?ÄB” "+Õg\Y¬EǶ2Y¹‡Žuí1yí[&«šb)š¬ lz£H/6Ui,5˜¦‚å(Ñuo)…Ϋ>5êQdj夯ÝDÇBmÁ0&+êeÙ›%²r€4Ö¨Ù]øÜBP¤}iâûvº ð3Qš&zËLÙ7‹¬fo°°[1;s?g¬U ÑAEPP飇d AB`HUny(# F¦yPÂ$PÅ´MÄ––ÙŒn|KNß(–s!$¦ÔÔN…ˆL£<‹5f^JLY…æï])^m¥L„ «B¾ž›ÇÄ:;®i¥ªpªÂÿ¥ªoUÅUÃMTÅýª~»GÕ_w'±Ês®k%ô&6SRª›•þÔàp w%<(áá@ J³“Œ£²q§L>ÒÛ˜R~µõH¬»b‰câoP^JoÝô RÅÊ^Ïõu£ËEG.ÆãHØ4-•,#µNí!‰5ÓCÀíÖ†9Ê¡Œ– ¥eªí6GÚòq¢p.ËS›C3zá¿¶qçµ€4q”xm-ÊQ9)Ê·:De™ÞÎBÖyò£Î%4ýç-¿Aì7±„õ~NXäðfMÖ¿•4\ˆÙVÚ,Jo TùÇ]ynGÅà”o5 uP{5¶(·Sptt˜[5¤ƒîØÈîÕ°ðíQÑßšSt:A=d\ï 'uÛS†c!YÓøç°S>NS†4¦ép2ätÑ6Y@­—$–r43ixK‹)sòIûLælÚ²…8I «g)b=[¯g>´ý(låÚ.ñƽŸ_hë&½Þ¦÷ ãÞÀÍî-p™…Mí2 $C‘m5mç1ÔéªÎ–Å@*|Q ¿vp넵ë¼]†+:ǵªâ~UÿK†+;GXéøpèPhqÈ{qèF5˜µë<Âáàî ‡øàÐÊk y`/*\›ñppˆ‡ƒÃ•=+ìïYË+3gòÖîžÉ—a9êöõ~—9]ùYw͵-¿û@`»·,WÊÛwßUªû(ëwî(³0¾ÏœéPÓ­Áh6 -÷ðfÒÃKM*oÒѽ^+p§«*ÔÚ=[¾ÞâJuL=9Û~Ü3Õ$ʹš6„©Y~Öìš:WVÆ…i¿“[¬Kß¡xÐT²_vf©•6µ`Œ¿1 )¥‘—[‰æûcSºð»C”m0Â6cÂÛæâ%_Ë㮽¸¼ž éÉ5m‚…Ë—ZÞ6ç"[×fIJjeÒÆ6àn]µÑ¯˜£Üêè-xúúE…\RB‰A禧H>w ±ƒÛ,¨#Qsœ¿ŠñÊQÑõž˜®Ð†&>¥í>¥²f󤿼xû®t®zÃ{Úï8g=¸¼¸úîÍûÏêê㛇3ž‹ý¿J£8ÓGÆf•R’§ŸºµEl=ûê_Ð½è˜ endstream endobj 24 0 obj <> stream xÚíÉŽ,·íž¯(ߺ‘iY¢¨¥b'@ćœò๥sÈbŸò>9ùûˆ’¨¥Jµô›ñ¼ÌC0hLµJ¢¸‹¤ØÓO“šdøS“ƒÉ99ýããô‡çéëïü¤¤˜å<=ÿ8¡^O7k„3Óó?ÿr¹kãÂdž¾k‡wù;BøÈ»¶@ã×[x³Ñ„¦4¢/wpym\CÿiK3­ ßá ö’ß›0ßÑJF¬¾$˜˜v"(´Ê˜Íok1 1°˜6’ ø0–¿µéCèGRLz¦w8‘QÁ¶'óêòÄS¢B>?låa‰ ³ïNO)@á O„uÖq`ðÄÓûHM7…ÙWÉR¤m"äZ9dÑH¦–‹ì;ž=¼õY€4ƒ}R"*ó«Ï2Šï\ŒæøìC¹(A[© ­§)½™wös{û i P  ûfx:?7'¥K'å NdÁZ¾–PÍ÷æ:ƒ–°zZ½•eÖ¦*»á€V¶Ô\)¤¹Gx†‘/9Ì¥ ·ñ~ÔãÃ!í0Öãýºïþ_ÿœõø¡úÞËíáüôoQˆ6Rà—_‡þßW¥7.3wN0 êÕQŽM¥žòŸa‡¶‘\À1áp–c•Ó:eúŒûÒ' µú;úXçô‹©÷Ë~¡ o‚ª~ TwÝ—~¹ûjwér£¨dÎ|¤6’{'Ô\6s^‡a^š»ý2 ØÑ9óÄ–N*J©c:yÝCt¾­öv¥ù@؆NˆK}HgY÷ïHõÇÜô” B8·szsÁ’û†|8Œ“smËâžãP%BÖ¦P>òšŠ‚9 q²¶2µQ}É[^Æý;ÖæÖÇ%ñôTÂû¸Òb“5U¶Xu^”4×{n¾âU©]gñS-…™¹d ¥s©Ò¤ƒËvžUÂß:Ó¥M¿Ï±;|»ònÉÜdß@æyµMcu%';ˆ=?JM,%X²pº¥,ßÔ|5®·”Õt0°\r#—S¼4³SÚe£\L©]Íý*éÖ¤góyŒÑÚ1Å;n&² nyây\…ਈ‚§hS+y¹Íºe•[ø\W=𚪠·°¸¢%Í\ÒåòFæÂ¹«×6µÝgZÕ­1}‰³3˜¢x“Ò7åu³·Ufà¬È¿jŸ½Õï×ÞÊÇ‚i‰/åáíÊS¡–¹ªíeqC¢Ùøø2ŽkD‘w²¬YW®”:óB±«s «KÌ‘è`£0‰K^7©‘Ùc[o¯%2eiÙ¼š3.·”§ÌžÌìàêV505¦CÈÓ‘(yÖžlu'ÛE­YعxÇPÆ™¨VÔÈ3Q8 ^=j¬ ³Õ›*@_ö™cC€ã>ÎoF‡´Òñö’¯ÌþÅuà€õ|;««RCÑéºÓV©ÆV‰­U6±"Ðsv8aù/ÝCöpæÖ»[ t[ç±9€Ê©·éøè6ÒëOìÖæ+sðæÌÉ÷ÃÈ+F×Z¥P…˜d}7ÂØå‘½u : ãhéð6M\5Ë|Ü ÍÍ oòó]Lr2YÿŒ‹.ÿ>ÞªÛ'„ø‚8Pî{]ßÅünº´i=;ä#dÆ|•™Þì\ŽØF(Öä›c’;ZêDr© nì Ðßö ÄиF÷:qÊÜsg¤0¹@]ëM™×©F ´ËüE„²?;Ôq ¹R·iÔ‹"ŠLÎÍçÀœau ¯˜‘%ØâÌ#kA0†,Ö¦ßq—Å%ÚÙŠä\‰u0QQu»Å‘OÉlG‰~Ùç€Èå¯0ƒ©÷ƒŽàHî9Âa¿e¼Ë5› AüfÇ¡„}¦—zȹ…áý÷®½,ç9‰A«ë¸–•}cª™bˆŽÛ[|=›³•{³.ëxäfÌÕ\ÝŒaùõJÛ Woߎ~ÓR~l•pl/6YÚkA9ºqËUHáËvp§ApÚö†iª(i¡ìNÝâOÌʤó‘RÛ ^@À9öÛîn…q+÷`ÀԆ‘êñ'hrFM}ˆ«&°¬¹_ Ã×XPk‚Üq1KUgþçE26«/ÏEp7iºkÏ {ŠtäçEù"l6Åt˜‰¨VJ†¹Èl…®©ˆ=NEà‘Tdö ð‹rgiÂâ8vE„å)Æ JOŠðk{AÛ>²ì{Yö’µ šÉíÉ]œú@éTq7À5Tàòõ‡_ýÍë2Õ endstream endobj 29 0 obj <> stream xÚݹ²ä40ç+L6Sõ¬ÕÑ:¼PlDìò2 WF@Æç£î–dÉ–¯yÔrÔÖìxìvKêûzÃdü§¯ïåðóï×ÏÛwaPRLržœÞ £³ÂÛáù—n/Féc]üØñã<_Ó=uµöÊ9~jÍ‹ñ?Ÿ|ŒO"—p9ü?àù¾mé^~Ëãðù´2bPwZÏ{„t7Æ…O}ú¦½ÑuÙâ;ø8 ÊÎMÂ!ÓŠ¶ÅÃgd<÷Ÿ¿FåÄdâ—6© ÕŒÐ«ô_žp›È@‡HÇ/DcÄoÞ)Yñb²BúÈ0\á‹Pó*5¥Ç"¯¢|"0Y3©ˆQ‰-¼¿ Bûqü”XÀ;¦«PÁeL xïÞˆD@„ôùt5Cj¡7Öôu¥Ú-ÈK‹=ÝG#§[fQþ…LsöNÂ`ÝXÀbãÕ, FÒÝ¥5µOêçMhŸˆÇ“Žœ%UebF8Ÿ7 o!mŽ4Â̪NÇ”.¿vÄ;AtÅ›¸Ó9©ÖQÅM>ëŸDW Ê ° âó¥„Íäú©C®1ML¾å!n Ùƒ¢.‹D<„‘øÔÏâEéÓ¡4 .BéÛ,ÒlOð®:"Ñ qRdø¥h¶Œ2ÆëèÒ7Ì/iUdL0=àT܈Ú"‡|¼m˜¾%í… §ü„ÿX~BŸñêÿê' r%û‰°ï'0v)~¤ÈLõ¤.† ™ô[Üqkî„æÁ¶F”ìÔY_ImK°šlfKôÄçPŸò• ŠR9Û­Úf2´H¹Q4ö­‰•h»µÌFÐ¥¥ô¼9Κç{9Ï6šMgzÿæ"ÍóÍ=7À‹¨Ë9µÚIÂyq?/Î{“I Êá ÝRÓºq;+W9H‰ “¤Xú¥:ôçwª4ÃΈsäŒ'»Pº ­ïÊtpº/+wÁyJÊÞe}ŠºˆÑÂ9?s«Ð^=Ýä"Ks2›Õª­Ã°kåÀ˜"º "Öª@¤“ˆIï•IdìÙi£ç ý»Ž+ª)È|È.’xå³–¿ïFRÎÌE>¸OÍŠUâSËÀœì‚™Ã¬8¹˜é– KÅcáu{µ¬ô¯üÕ‚ ½{P b¼7ûrù Y.òªÞV…¢y/UmE–Ö“‹/•¨°&è²Q_Wý*™…JÍ3ÁQ^©çRNòþR xP‹ì…šk å-Hi W .×¶(îÍÛµ š“ăÃfܺ™I÷u!:Ú¡€#é0G£„tìµÔÅúÁ«v³Y°Âù‘‡G.¸š z[ÖÓF‹anE¿1VUÑð|³ÞX¤uDX‡bÂÚï×û‹™éáþ”FÏŒa,#šÉÊš}Õ!¢Á¤ôbØø¶Ç2¯…T%lœÃFrÜägßFK5F³«•½]ú´öY\Wád×§Ä»@ly¦ ÅVrjwß,sàå½ãÐŰ»ºÐÁñ.¿Å¶“c€€”6Dc ¯S}TZ Ó„ÂÇUPÙ ìwÍj·¾Ìå`>Z@ãa‹0ÆÃ)ÐZWQ Í•ÜV£ðì)½R*ñnQ‰×jïùåÚ?æÊ|Z:ù\j ™ÜÿS% J«·jÂF«¦}³´~2Y%Â"7G ÙÛlöº#±¨àUwÑê×rXÀÈK®ç«L¡i]f|"AÚNTíGbƺöYýLµR.³¡J÷píÂ#zЦÑÊ[;tKîUæn¡*˜FòÁ¥Ÿ™cKRÀˆ^údªr.Q+2¿aȲ$Ѷ{Ö`Ñ Ê‹&lû°Oy˜¦+¿6ÆÜZ»sã,p4Ò ¿Ð)ÊÄÍfóºÊá¸Ó¶×íïÛq“vûJ úŒõê•t±Lî@3yrúPeë³m‡ø Й`Åf»9Q"}VÍ ÐQb@úF n«A .ŠØ ¤^¤K{³ .;ãI çšçèµZ.uik±v½ݺh8Û°~0‰jËP÷Í;SpxaT²)À”Rö­Ô8Ó(‰Çö`üߺMÑÃ膘ý…¤à=a‚°ïEfcNwô?¬ÎFáãñÙB{6‡QëúlËuA͇;Ÿhö, d ÈRŒ¥­)EiHcì‘Ä÷­v|i¢>Å:ËYŠ¥;jÞYZ.‹n„&€Ua>|Í›…O ðwôb„?ÜoøØû}\aͺh`Z—–î uL‹_/ÔÐuU±»!Ï›¢ñR,.Õ*[JÝm,¿œo+…xzÃÈz".ÝÝײ”uƵúñްæ4_塲¿Ü1àá|â‚éKº„w¦Å|fF…~*¿ãmUÜ…¦Ð_LŒ“m†›V«çŸÎ¹ðt²‡Í±[4¢°¶:ï_Á wÖócÏs–«T1t T^q¬Qþ±P¥Q`µ¼Ó€×f?ÉÃ^wÈÛ“#š RŒ;QޚȬéó)-QÿÓ`lU¨ž;M=úšjF£GàxåTÓ_ÔÚl!çz¿]ò”‘@]¥§;[)í<Ñ«osN\¦mr©ŒÕæ [}5·.û ¶WºJ°s7Ê>ÙZª¹E <ŠÚ¡$ýDº¦Yå<Ñiæ’ݽKîžïb•‚zO&'zSM˜'‹˜¹¼–4²Ç°7¨¡ký¯«uý 5p4ûÙÍï¯Ì.`ëþh ô0ªÖ»£G JÏòÝ–}ò€g“©Tu‰W~‡ThTW[]F¹}J1NìG?eèºÏÛ©‘°…~mUnI=#SMç⤧©ïÎ ¡ÜL¢Jvz»7›=þ:¹TGý02no»¥l)WÉ4ÔvàØ3íÿ´?Â…öGø´?êîÇûþð½Ì‹ÿĤ«:3ÁäÎL0M'&˜à"/>ë5™tVŸ(®j³Âó_]X[†ÿ×±‘Q(”C…;õÃìܬ-¼ïÍó9yØÖe@?Ïí¯Hù¿D£ëòv,tù³ªs5”f‡(^cyÃËk¶¼ž}Zœ}1)mqG€!GíœI²G’¤%é|Û³,J;¡¢—ëÏÐ}ý<¼ÿä/4öŠR endstream endobj 32 0 obj <> stream xÚå[K“ä4 ¾ó+­»jâµ%¿2Ô`‹­‚;37š ¯Àþ|$?§ã¼º{f¶¶¦:›8’-Éz|rš?ÕHú§s²ùåæ›§æÍ{ß():Ù5O¿7ÚMkp¦yúõÇà ŽèWË ?þÕÇœ§»ÆÒuB+ãíâ=£ïxHwYæd$îºNéWå74¤§ôk!´rDÏDZ= ºvŽFxÉ“ÒüÎÓ²i„ÍSfêÌϺ4š—ÁtÍÏtæd\z/PÍã´i?=}O¢l “変©¥ÇŽ:5È QñË:/#NÏâÑèC"îÝ¢oÞwM':‹¬ N€jZâK“Æ(YèLð–æ"…öaÔ_y©ZtŽÇX††«ÃU£Ó¦AJtj•†0s'œjÀkÈ/3 (gLW@dhu.Œz[]—†M–ü¸~*ž…¢EÿÓt"^hdÙ8· :ŒëéE÷smº­À®Ôµ¬hŠ(è´8^vÉ-ˆ¦XõWUÙÐ¥×iÙ§ƒ’§ã”]‹4K3Òí0¿§*5ºUÓHƒzÓX§S7 ¦á–MCÕL£¶bÕCf—îÊ¥?L§ìøbÊrfé-—þp¤ÿ >|7*–ÁÔ °çè„'Žd”qwœ¤”µMfºdjÊIJö¶­½¾“õ ×=‚¾Lí~É#Ô¬žl¾Ó…ÞO‡úž+·{í½´B/Ð4ý·32ÎÎéa¢fzß±oê–µìGZ&i“ˆZ'Œ7GÒ…&ÿh\¡X£¯K6ô‚ZLP3'TÁ¤”¦œxެ‘ÖÕ–Ä^Ó®)Ÿ’mbxI>XÍø`ú^üÏt^äÔªÎÒ ^eët>9üX3Û­ù`4Â`‘JËIH•ßUí¥ÜmñÇþ¶þøµÃ°zQ,¤ ‹G»Ón¯p5ï*>™´ˆÌwizÄ@ §9ï–¢‹¯­d¬Fäl±åéš½.ár‘†šáåš[冞qt–5Õ"ù;Ÿ³<—3=ÊÉÀ÷n.gm|7ôbMÊÈBÃù!4GˆMècÿ¦‘9EMÅMx²Ô~ Éìð>¦üº…^ñyß9ŽÞšª‡:Í–<¦ÝîÞÕ˃«5QrPØÐ@v[ȸ© ŸZyf™›¥ /Ù!ÖzÌ@×»”ã¶îÄ‹CÓÏ£ûÝ™àŽfoÂü•!l½¸r· aæêŽˆ¹‘Ëyµ3+ÏÛ¡Nòy‘õ<öï'jvµ,±fúŽë¶µ~5 ܸN͆ ýoWïé!- fÁÊÕÎÈå=s»­3rf!û|’ …ëJClÕ–«mp\/¹/)Й™@gغvºÏ¸ ÿEÉ^½þ¼úúaå°¾ pÝ!ã&‡¼=§<³(Œ%5m_®ß>,슘;wF Îj7ÄÜÙcÅê74ßíÞcY—€b9`škNÔCLp5eˆ±õν¤k¼QçÞnAÌí3"æ—a¬ÿ¥Ðª6´æÕzo^…ó+}ízÛpñ|‹õæÑæòN Íg„&4`¤ÈÆÂ14 uîÅš²rzøˆ!t;ûþr¸ Ýç{6Ý“ùM[JX63y„I´µ:Å&Ñé;ôå>—Áðó!!”.At©³>—ÐçðWÊôÐÇ(a0ÜÀȲÅ˳Աƒl飋@3p =êüŽNß ¤nHºëæå;ôgr¶&sȋغœ#0XÊYÝ÷“sùãá j§ aÛü! g‚‡|¥ç)¦§™JYøð†ñD)òµw5ý$Bû[F‹é’˜~b…Ôã¹ôäPCqƒ5åXyדÐÃçBß…jÛÿ^ ;ý‚iæZ.Šé.·Ô.bX ì70-‡oªDæaœˆ‡{Œ:‡ ?a’ÁvãGJ5ÙÕ@»{¯±~tHÊ¥+Efù~ûÔ|øâ_÷7 endstream endobj 36 0 obj <> stream xÚÕ[K$· ¾çW”o=À–"‰zÚ;H9e‘¹er±7kØH|ÊßI=«Zª®ÞöäÅ`jT*Ф(òÉ]~YÔ"ñŸZ¼^¼—Ë×å»×å·RqQRD—×Ï‹±"À²:+¼]^?ýíòÒ¿‘o` þ¶øÛÒß/«ñß:…?h†Ã|¶R¼üýõÏH;t¤cN#‰ªBª^tOäª,ŽMOî’ÆyUZpŽÊ«2—ù’ôìhVfBÉŽ V8›ÙøvÀ¦ÒÂ76 QZÒ¨Är¸¤¿ùJ"x_Y¨ËÊíŒÁU'b\V¦=øiÀ&ï2—+v/+ø0Ùd:¿efH7:¿Uóï^4é?ÏiRbÑ”TP&ùÅ‹èiŠR#§Ññœ×N8µ¬uŠ vHŸRÓS$ÍfM3#¦g×B2 —5Žú,b¢î= ¼2}ã‹È²oy—LÿíÈœšÑ8IUáFéÐoTâ‰÷¶W0¨Kã²(ÚÊüæâÞ^èQwb1 “-Þ%«·2³É3yUŽÌ.©èë¬æ¸DT+£÷9µÂ&EKž$qÈ <ô]rü~¸íN½(# lÎP·œFãÄmWi©Œ­œýLT¨(U'EÊÎðŒdƒ|]~Yİü —qä¥V¥Ùϵ HêŸË_—ÙÇõkk£„ÇÅÊŽ¼á±Ù®²_þ§[1Wàr‘üÚ¡¤†%õ’Æn)=Ø@ä4,FuF¥þ¤Ja®R`#¸îuÜ«ToT B“ ; 뉫(…މ¸eâÖ³e`¶_*Z¡}>oþaw³eT èüœkƒ@¯úîk 1)ûˆZ„p7]gÔ›cø‡›cøíðJaÍ"\¢óÍHV¥"‘Èú¢ú™[Œþ$ íð7Z‡ÉnÌäÈlÌ,L¡"Ê´ÏŸž~áÀ~¤Ìx“c˜qêÒ¼{¼>}zöc¿ƒKr³d—ëäz]Ý©ëEIžŸ½x—{U‡,ä(h=T î-î‹<·Û‚6ûoöãy1^±T^QškpüÑÏ…ÚÅ¿mÍj²lÙ.¥è—ã¥ÝG\Gq؆©ªËÛ¤éòM›0R#üä*~*…éòý‚Õï :0;ûÜÈÌ´%¤ït‡Tê:iò±0y®&È@ÜóÐK¢ HÇy¾R‡kŠì²ØY•} ·b%,Èô%]9DØQf§b´»^Éù40Ê7ÃgS>ÍHªÍFV(êüÑÄ'ûÁ6VîyÕyç­d. ]3’¼ÕLª##G— á¬Òa6¹¼Ø·—ùyƒþ=$Àœßtg…å*hÒ¶Õùuåî~ÐÜÁˆ¿ª#W8¨o]Û»âpËÁë®LãK,ßmrèý^°€Ì3¯øº eÝÉÕí¶éAùH{áÁPŽÖËøf$á ‘)‚ÿå6@aïa´ Dë T‡¶€×0>„Lü|ÅS¢ð Cp Y…T‰˜éà>"ÒðÇ€_1à×G€_-y>ƒh€)âbuÕ‘$c³ü7å+æRCêè Ä9‚,pðÃAÏ^m&€?àÿ5×¹B£!™®; OÁ.BÆ@ EDogHZôj‰t`Ò¯]m`ŽöÝuV„;Åîßí'qAâyô½üxçpW“´ofhßÜ ýþ\¼²‚øˆŸù8ò3ÈË{ù™=!|ÒL(߀~—*ÞhK­¦±WzDíèu/CQ]ÛÙœY]ú1Üñ(á„@lrè7dì+чüz¾Ò̶ ϰÐú|zÂ=•žÀ-zoµY'RjM$ž¯F áœÞO‰S@Î`¥»—á0S´<Ì+‘!§€áæ);ÓwílðÏßÀ7vMr‘ŸºãÄö'¿×W ɱº«Ëa0ñu SWOV³ÿÆIЬ4§ä$ÕÁèX=ý!OçoÂÀÑõkéqö[‘Ça¦âӆ楘®Ë GáW :KN d(‚QÅ1¥šª?=H>m3KÄ/P!娛#öÙ|3%“oÓÍs¿1¶!àÌù’t3^ãñödÞ×6€‡Cé©[Bü*ŒiŸÂ¢q|LÚ½æ$e#Oˆ°.öyì*¾YÞúd[rҳЋxý8òjáýÿNä…‘fvpGõŠùf@Ç’­3ÎÉõ)§L¿{?cü‰íS§¶¯TÞ?N#óƒrôX¡g)Yk•l¬~­Uÿ×£µÐÝáµ Öa⤣5UœVFÁ—ü¨ÍéØ>?—srÎQbϸ\[v]N™ÓtüfÚA Æ×Dj¦s2)Z’ˆ%Sœ¨¹Iƒ¯sÜȱãužÝ5x¬ܰl¾­2¤Y5©ÙÕ ¼ï:3À_ÚÛ}žŸS™²Ðš÷o¨ ÉË:72{²²݋Š»ò mÞVá9WýRèìò\VéúsV8«·Ñ0w^g£Ë—wÌšQޘð’”-dhBÁc&aªI˜Ó&aŽ7½ÒšžÑ}…íæ ì¾Ü×éŽ}އ‘nÐ਋fµ·uâªÃkŸdÈš0ð°@UÍŒ‹T½µì—ÊWÃ6¡mõ¥}¡ï8×Ö¥³Wbß:.=Õ–K?ϰÀYzë6}{’Ó=¹=ä gOö½^6— ¹ˆùõí)¼”¶ð5m܃T?äšî½Æ=äç ÷€Š‡{Ò6îùËDûöLã^žuÔ¸Ä&\ý<àÒÒUqSÿe'{’¢<ÍðƒêÛ´rû™-¨ÌH•Ú»g†­y¾ôIвåF§K¹£¶<åû¶<åÚòܾ-ï°ËÓUzµ-ˆTÿmyŽ/¸ªvÛ>Õ–'9Oâô#ó¼-ªxJû¬ÖqÎüÚ¬¡™÷åi¾¨[gJ1¤3ÍMN§ë ¢jì»â¬ùOⲊ‚¦jÑu¯ÄyۙΥ•@ŵYã]±‘6‡¤J§:ÊÀ¼çž#55]vw™6Ö|‡ùyR—Ãû ÞÞ}‡ê@t¯ äX»ûÚh,/vij/y’÷m£šAí’¾hy· à‘&<ÜŠ³Mx£p©¶³oÂ3òl^š9m«mJ7áA¼×„—Zµ&Mx®EÙsA8IrÜ„ÇSFMx.œoÂ3NÞiÂK3öMx¹-qÒ„—ÞöÝG®_EîÿãBÏǾ™­uXÊ;¸¤ðT{mk$³¥¿(õâ5[Û¨oÔÒFÑø±–¶Ù[Úò¬›fÇM+Û­Ô¹•Íçÿ¸PÒ‰¶¸°¿ù7æ†|÷ endstream endobj 39 0 obj <> stream xÚÕ[Ë®·Ýç+:»¹ˆšæû!Ã@b!œU$Ý]&Å‘ wáìäëSUl¾ºÉîžÑÈ@`±ù¨*VOQÓÏ“˜8ü'&''çøô—éÛçé«ïü$8 7Œ6D…Þ9 m™hõ/Áa÷¶ òV[þÕ  ¿Ä»88k‚šÚ ±ÇæÈóΖ ½•cÖVÜÝ›MÐÅM…• ô úHyÛƒû HÑHYÏÃc°8&£8ßăLjÁ<ì®qh²òam+N© PÌßYà]d,y¼¶±R%žG÷…y”ØÙƒÂWÛñ@£íØ,=Æ÷N?QÈ¥¿ r5ëÐ btëƒõB!⸠;Šˆz¯HàÏÏYɤBHH «*=>U8@.î9ãâËzÚ:ð«ã« IfM# 0Êo"»¶GðˆdMæ° #)5T樧•aé¤ÒÌW.yWó\䑨q­ÅþN¢T EWB¦ˆY@ø\¯’ˆì¶ö*0£U;`9Ø[É‘"p&ƒÓÌ.(¸wÐdð=k+BZ A3kö ["²Ió¹¹%5ÙåJô rÓ0å>ýYÂ>ëÝR`KƒNï†ØKi€‹jPC €[Ó4Î àäâ!y‚uu,ž‡ÚÏSN•‹±ù²Öv¬œÅýœ1Ë[üüãÖσa>ÎMé¥2I ù9åJàç6œû‡ X¿ÏÖ>ŽáÜéÇî,{‘š¬!¹Å/½VI¬\í=ÜŒjú˜“Brü­9á7a@Ê-¿^ºÔÜʬ¤Ä Ü^™¶Ë-Y«r#†»þö6«ñÔ+ÙÇ4 ÔP@‹—Ç0ûøÇ>XœI$›Sü›*ìð݃VcR¹{ÐýôˆƒVŸ8hCOóUúRëýugƒ™{œ“:†ãŒ?vN±óiþÁîˆewÞŽ.·ê1Ê IÐMÀ™¹£ó; P!{¤ÉAvùº·\s@ê¨ùõ"Åõiš óÇœOħ‰DTC¼-d›µÈØid׬+ìš ÿF_FÌ2XZ»Ì.óœd;;H¢©4›]q‡™ãÓÄ¿%.-±¥Sº–uÌw6:˜§Y—äV…´ ÑÌÂê{©ØJ]X=ç2½ü¥|ú~–8Jžæ¢•Lÿ¸±˜—ñÆùê6HˆÄÏóB“qrW ºV‹ŒËÓ¶CÖA„w6Kr šG$Ú—¥.\.¦ö"æžµ­ÏzCb­mô!üåO°¨q/°·‹Lêò3êªz–Zœ©\Er8~ÉÔ3¹~¡zÝBõúŠv_hæEÐCwˆó¯ÜÁ¶îÐq€†ƒ8€¬,'cÕáĶKª)Œ76õèÅaY…âÅV#[êŠÂ2˸¢Ð1‰tÄâ´Ø_›„îJñó«ZPË“ôÊ ÐqjUÈ>`ÕøqBªÈö‹¦²2® ´#öp4Ö ÒÎÕ˜Q¢%¶Uõ†ä¶Twh°X›-¦rxxTˆÜ nÒbÉ` í zë*tTÐÒéDYdA6¥¨8ê„Á’ƒÄ‡âÛ‘h,ûÅQX¥/Õy–Î ¾¤Á“ĺdmüjhÇs¿T3rt*šUQ€4Ô»O(©gKQXïN+–¯TWêÞŠÜ;#£fë3’ÇA(bBÉ›;„o“4žêg¦=ëÉãi~KiAº>ö¶ûZ¢È¦(ŠCªÚid=í¥^ îvvA½²CÜqPQ•ACçY„†¼8SŽËI›¦”ó™Os¤#WëNå1º[C4ùp*'km½ÒÇzȬ!EÖÈ_! €wÀ¥aXÚIãT¦4ï)õ C¥:˜Æ#¹ Ë##rÃpù4N[,ùÝB¼tµÏË'í–OãnY~H}¤n-¿ôª,¿U6T]CI|’Và™T,\þ.ÈXCž¶Ô'Z¼AÝV!Yl`srŸ[ ?‘AG ‰³ ‚yŸþ>./ktdØtž¶âØt¦%>9%ãñkv¼¡óV)„M߯\â3'S*´$téZ˜¬tÿJÏhÄøšóª@©v~ä„má»yzÆ,ù€ÙU>íËŽ§—À≩yŒ…ò“*Ê úÖSY¦KÖO}ɺ«}£èV:Dêµ¾P”³¤K) ¦Þªâ±xJÇ{£vRp/.ñrÔáˆx›TÝÂ`Ä×_)Õº„˜Ã‰5's¹Îûüõ²ŒgÒÉMæhzÙŸ•z3ÀôBkž#QïÊþ¬ÀH˜ ¤BQúð!Cjæ?iœ HïÊþ Ë’§±Õ°<äSÚå†áòiœZF\^޵ÏË'í–OãnY~/û³w°ò›ìïVÒý]Od¹ï/ÕÖ&A|~l±<®XìRp_þ¾Sö(GÍÙÏÂ˾ZRƇhY­÷[µâÚ{j‰Åûn`˜„AWÂà}grAà–m¦8݇6KãŠÍÞtö^¡÷•vfi->BÐîÞWzsµp;W ðn!wp§âlœeËÐéï–êšÑ”¹³ã(4uØY€³†Ò02¼óhãíÂe½J8æwE çÍ >êy¿OÏèV/~é=Å^⽬o¹ŽÅùV¾Qa[À= ýЂ?Šƒ'‚ƒ„Yof·yì®Ó”Íïrt+•wǸ_7¡rÜPûNì¦R¤q2õ{À#)íåÓvˆUYyœä†ž?4·)ùQ‘qב„Sô¥¸ÒSã.¿Õξ±Zt¼† ×£•sü§—)Ó¢Ý;™E¯Ï}þÛõ0ïïó°Î›&“¯d·ò$7ƒ™9³íiºšF#‹•»Üuv9z}Yü:7ìû5qªñëê ée=ÿÌiu™öS牷£ò6…4Ý!¼KŒQÙüìz¶|ć?{TW²uŠà²»,½b;"4>íK¥ù£w–©â€ã.N÷©7–HÍœœî×¥¬Œ~ǵš™Þ$Øsö#{g4[mÀÐÞp¦ Ý Y_…:ôTíc}ÖÀwC*BsîôˆÝè: ÎrR“>®ý0\×+\Ÿ—´õ:àö/ž½JÎT…÷{Ìï0ÑôHw¶1}) øJiçºééVj¥Hõ ãÕ»Ä8¿òS‚÷$ˆ”äµl‘ö>7 õýðòo•ÁUpNO9¶²Â|»22Ö̱•oY½Ë¯+ʾ++°XÙq?ëƒè7'¢ßì`±ßÅâlWCÙèËÊðãÊGÌ™­Ît÷C5øPlÎ@±ù,Uª)FHü¹P¬þïRìöÒw¿©¸Ã=,ˆ›vWáóayqýâæR¤•"½ÆìRÀ’ž›‡C°Ä'RøO¯ájŸÍöXÀ²l,³nY}·©ÅH}K¨«Y‚§VÕ±fŠ®û<® j‘æ®ZäaTŽk‘¯{UF[%è]z$v³Éfo÷?F›¥ endstream endobj 43 0 obj <> stream xÚ½ZÉŽÞÆ¾ç)xäb§÷E†±‘9:XÑ8—L.‘­8€-؈aY~zWuwõB6’£I ?‡ì¥ê«½º§Ÿ'1qø'&''çøôöÇ鋇éÏ÷~œ¦‡w“6Ì«i±†93=|ûùQ ÷¨Œ}TÎ<*+Ó³Ñð¬îþùð̼Y@hǼ™!™×q…_i˜l†&Ђß?.#™Èßÿ–¿«É±àð£gÊMšŸ(äœÓ¢Œ±ÌÐ"~],³nZ36¾åÃmÓ“d!­ü¯ÏÒL­˜À’šðý‡G0p=ÇÒ› KŽ)9fÉXzØ2 œIyÈŸb^V¿%%Ó>“ÔË {ŽÁwô½Õ-Ï‚Îß[»%à©Ê}ñ <‹23‘)˜j©ü8¦R¥òßc*¹¼@å›­œ¢, ¶U»è"(Tóán‘–¸4 f›¿Ù„ϱùý˜M'.°ùë–Mì ›/‡Ö£<e–Ži—ˆš¥z¼ËC[Â¥Ày€¶j°™}””w^¯æà›ÐGá¯†í´›“ÇÒ<O#´#/ö‡xbò0™†8G_h’…OKÇw&Ï2ëèã ™FƸ6/#ˆ…nþ»LXv±VÜI$<­Yˆdã_aNcâþ2Íw"ÿ-¶T/CÞ*Ô>#‘(X^Þ`Ä)¡%>Ù¹®„ØBd0zNì9}'#A2±Dëiƒ3q”ÖUB™fº2¸iŸVP¡3…ZØÁÎ5>M]Ëʤ}}˜~ž˜7øa‚%˜Aƒ3ŽŠý8Áº,”¿˜ÞL¯S ìt»Lƒß »HåWvX¼ÞJðI4 Ðce' [: [|Ö8C&€†!O2µŽµ+de ¿(K\í£(Š%3z…€ÉïC©k¢;8‚_ñ½[i¼Ê‹D¥Ìb±øq”P8}Ûðá sÜ2&î“©ˆr¢¯×Ï)5<š ­ ›"QÝ Ycy*¦I½j¿!/Á¬’;¬\:X¥¨›ëTU¥M‹‘‘¹¬¦DžÍ9þ:ÌbŒ”9j$½ 7•ô9Éúêø6ĦÍPž†W¹’vçùªI¤d^cÚ%ÊÈú´Ÿ¯D`²Z©Û^EiN€˜OÄj–_dûÎê>åÓi˜ž¡Œ€Ôí\7ˆk¬r± ×!Zf¢\“ŠD['@½^:•’¢´ÊX1õ¤sˆ´Ž™ál#›„˜wË-ópÕ‰§]Z=ËûºEÝûÙd‘)9«¾gRæM6©uäSËÚ¤aM‚GÞ¯øAëY]Ë€nT“øS–¿J{£.BŠ ºšÐÕÍ*IPІyÕA $¿™63šˆõŠÔ+Zø£z%ïá2Ž„§È±Œ°£Ž°Ð™²¸='â¶ϰ†Ø­¬?ªlÈm0Ð6U ±2ˆkD÷’í³ë`Mëèòd™qÄ­?WšO×*/šg®iŠ[ “®ÜnÞ…l{å`Ønµ%³c»¾„ ¼ƒ°ÙBÉîŠUш¢Õ‘ª071ßU‹‹Ú¡hD±®Y“`‹@ÉÃÑQd>4>£B‰Úk¨yNï7£@LÁ‹çÂÓë²ß¸¤œÁ% H%Ћ§/ÉçP†ÐZD 8[)•Î]Ç –%c'¡ ‚’ÅP“$Ð<„Ük%€uh£Æé¾Ù ÜÖÝ ]«ŒN8,)šº¼P¤ Bê¬ ‘É6ák÷u¦)P)@t[ýÃ=8v-s'ù`eéÔxeø’£=ÙYΚŠYȾ÷%™Åß¾co¤AÍ-|M·ùhP[¸Ì÷ƒe¤o–ÁœÂ鎋FÑSë¸ìÜ‚AVG®©D­!ë|ÒE´$#skAøÀ¼_9!Y“¸uB,£ÊRv½&6­’ë>hæîË%¡òæËûQ&okoñí»àq§˜ó¥Q«Tcí$¨@sÏ|]‡Î߇ɫTX¥žÊ^Çn\{&)ÇúËЋ¶Ž©Ó‰OjÕY£8ê(ŽѤX˜S$žiî:]67ýOÝ<7ßÚ@UÂ%}w”½šavLŸ²ÞLŽ¥Põ*|miG;É¿‚z×ã™M™Õ[HoNÏw´uåÇŽ#Æ¢ÎÚÐY½¹`M઴¾mMÍÑLÆ9÷7´¥B7ö«ŠP:~Á ÖÕ¢´þzŽ™LÆ<ÿkå:[tŸ9øRQ?‡ôò †Ì#®PŽésFLj0Õwý]ÝJ6%|I=Ë} ·¤š‹tÉ©{9ÒpIžY´›€-jdá?ïb\¸ùý8úz$íÎyR9W{?l"•Và‹"GWüMkµf"ëü!X<®õç$ûÙ>É%CEøä >>ÂÏU½…Ÿ]á×W£¼°ëÖÞvGóÌ©©Œ¸r ie#ë®Xœ_Ü(Ä©¼á-â}…·©H—Žá·JýËÇŸ¾­êë‘|” [ã«a^®üÒZ×Ýß>j¶ôð½ÌÝFÏo'KuU‚"ˆy[ѵ~?&ûP¥½úf¹˜;¹¼üLˆ5 9ugL=ÌÜ?Þ1*úx ‘mWZ·2Õü¶ÐºìöŸ&+£q¡«¢êNºa¬¬²ú|犥|ð~»‹Ã²d° ßÕˆ¿޲ÇZ¥[‡3<à/vÐO€ãëÁ.×°xõõöäA¨ŠwšÛ5]Übq©=¼@úx·Æ¹›x‘úœ—És㟸Ù7ØŸðóëíZÂÅ«ãV:TÕ)h3"Bšš–ܟ棗ˆn4xϨê9ÿCñX¤Ômr¤i[×1(÷%O:hㆩQ}NÍ‚¶-68,ÈÅÕ(\»QeEs(aÏlëyL>Taã”꽉E˼b_eWâ„Z¶)(]­t‘)k…LŽL]‡qW¶ÜÑIçBñ‰?./%yä‰3Hgǰƒ9'Ï7‚UGX÷ýOZF$X3]’ÚßIÜÖôðnOÂŽàMëîßtóh-zÇcÏtšÇ‹Æk8¦óëQ´¶ò`;EÏ ÒšvoNÚÕqùÆÕáQQJM¹lO¸7§VºÔÇbt«aèWñ®]XÝøép‘~€Ë* 9[Ù CFžpß§ÑßußV¯/c¶îÛ†̸̈›AÂ0CaP5%΢ ¦ñÝÍ[”¶¤jÝžt®Òúå¢?„EŸ–È# gy!æ/r"éîy!ljüÍü¼íA;þ,ÕD¯p¦V}>ÝßMYû-(rÀw¸ÁûíéŽöwã«_ñÆ ÂKÀ9რ_}‚‹ìõ{ùNì¥w  øoûdž™Ë>d€X‡ÅDãQXŒ:÷æ—rx~²œ§N²£«p¯ÿôRÂ;Q endstream endobj 47 0 obj <> stream xÚí[K·¾çWÌqÆÚ¡ù*’mÁÙˆ9XÖ:¯!(±¬ovõB‚ ÿ=,’E²{ª»ç±Î%‚aÌl›,Ö㫯ŠÔæa£62þ§6^o¼—›¿ý¶ùæzóåó°QR rØ\¿ÝXÁlö„‡Íõ/?mo Øcåq:þ?¿;|vµûùúOq%ûÎ ÓËßÓ€¸¦<þì7{%œM?Ëòs/@Àqu®Æ-¿iWyq¸HNŸ¶ŽÔn·7!àŠ>î ò^ӧ½ï´ßf=@|¸?ÏϼÁñu–­ysÕ/”¢'ò 8-XzjãT'÷Ÿ øf'Žue~üL»ÝZ8ˆJ0È’i˜,¯™² ”]á¶Û]žj¯½Æ7U‘Þ¨‹µ›A Îd» "ÚÁåÒšo8ãíµv³¯ƒžqTʽ˜øI¶*5IYöcQɦH\ÔëÔN'u{ÜŸêMáš½]Q0úóûøC1+èf)2/.e‹™!½(HRWMÒ°ÏvRZ£"F†"#$0( +p&;\2!pÚ…€¡›CãN³šÓ¬ÒcÕº¦Û¯ÙTtYå;Æ:C‹Ï›¢yò¾´9Ùâ†tœ7:67;£ç1AEßóeÑ—‡;wÂ=öÎyÏ +žk…7mQFèqˆ'*& ûxwû»Ý”ßþ?\ôÇçùï/þþñíÓüõ›kzö×ù™Ûþ'?y͉¢KhAкäo'ù9§§0ïГYÕ“)zŠ¢Q,!—‚B«^ŸF‚¶²ÿºù€öˆ›²8ÀÞ»UŒpÚCnp:úø‚>VÛm–é¾Å¾•gãüÁÓ¯¥ˆžÀÈj‚°¾ÉšbŽÖNX%÷´V28þŠø—L/KN”œA ©ÊÜ葌¦ª¼a‡µ¾amE£÷Õ™ë ô½Ù Úeò 'ùŒ%”-‚í-°Õî-¡z <ª·DŒ`dÝm œf$tšÒ3NSrÕªÓøÈ¾H³YŒÂ$_—@:B‰ܾ剤/ÓñšŽÏôæ,?zÊbtt}°£uôöîCÆÚ»»W¿½þ'³-·å{¸åŒéîŽFøŠœÑ,ªË0üBÊ -É$Îi»ôJ”ÜPvϧ40Z³-Z—-€ÀÑœÄ>{w®I~ä”(; ·34H]e•Ä$¦’‘?Ò[´úG²X"æ‘l iw…ìâhOd¢8 @dz½1OÛˈ-$XÑ¥éøº««yPY=ÍIá,ë¨B²ë¨žÉ\^XrlM+2V@É Ñ/2¡/C²N 7±€‘¥êH:„&+À˜;ɽIs»®¸pDót®>–@±‘¤œLOvº@âÒYÄ\·D5ÐØI¢ºâY£¹*ž¡ÇªB]¡Žà¢ ýrv€š‹‚ôKªGcæ|¾Œª>_ Œ  Fþ± ËTc!ÀX¸â²"Fl «D{\~Û¡™ÐÎmu€ƒaì7Êœ5 ƒ¦æ4̓øt ‚!ôùàå_ž6þþÓkŽàF-Œ¸·‘êø_F×Ì,u—™“Èæ3y¼îüÃúfK1ÜùBõO) ¢´LßeLò=œ{‰äµ3(~é@˜)ËðDM}TÞNÉaû Ë>ÛÆJhcü¬òËÑ(&¶¬^A{Æ•´”Åý0ƒ)¶cy´ÌZàf1OFÉ0)uÇÍ‘*¨ )4¹uŒÂ…Ãј‚öÙŒ°Í[„PC4!ïµVë“$§ü^Ý8ŽzùíóVÜ/“cw YR˜!,å:˜²U6&â;äiWõ…|9­7gï*”IÂ=›ÑƒZÑPNÊydªø-–R†‘ùI*üóO£0IOVÃ$OÙí:Iä»a£EæC ½ç3ǪsÏSìöØÕ ‹]…á¤îËUcÔŒUl3V³`2׬0a -tWâtëΡ¯H(:1ÿÙPW©AÜјԷ.dӻÅ 9dÐÐ~@l9€íšVˆ:9" ‡U~…ß:ì•r¹Üç#²u°ªì‰dòÝ»WïÞ¼å«2ãDl©W@šŸé™¢‘­aKguŽ#Ómßs!¼rS²·n[o\¥°ô*æÞ¬@¾÷B†Ã¥ÍhK¸ö6 ’£=›æ‰üöèøDwõ•©öŠ*p„9='GÿÖÃB”a|Ë„YY6’lAçÍZPâ¤ßD!Ë ½<>G#Î\H>£Mc Ça û­À[¤cFMŽò¦0t]a8òÂT⭖г `°vyVL3ǨB(×ayÿ~.–#ߟô³‡#CÙz9Êù—¹Pö ¡œW_ å‚®‚ÔàÑŒ¹1›„R¾/êjÀ•’ñÜ-(/…± ºDÚݸýÄoòzµ —ù`º'Ô†.itÎÅ”&ùLS«ñ&)¸sñµ?Pß\èAg8À‘nµ§]‹$ÒM«s«‡}Dz‡ÚlÈr®¸ ž,PÄÇZÆäŽÁƒœS+ùÚ÷¥Ð“ê a´³]¤×X®Ý†TqT™Ví­˜_O¬Œ¾¸¿u{÷ËU¾0ÿúÄzuœbŒÇ©8¤Ž¥[èX¦×}Çr\ÿ«v…[N]æ\zZš”Ëöœ]2f.¡“Ý>á³XeˆwÜ-€õ[" Zî~2ÓvÖkç-¿d ˆ¥¼³3•õ‰Ë)+‡ n³Q _f™aqŽgqÚ »™ÜÔ“3ÎЛã"[h1ŠûCèìm4cÝþÊ[K÷LkÇö„4¡õWQ%·]cÂÌ5xŒiçPç ýÄÛþÆQÔE`/œ¨vXpEf)ØÇ^x±rÒ§¹¿ŸÉS ¯¸‰âª´lDv ¯òä!?±z’ðÿ–›À५üûÏ1æcÙóõ\ÜÒ:¿²WĮ̂Æ]éÍРŽO—ªƒu JŸ¨Ž[î”´iõj&,LEKæpmèú†sgkº]…»}ºÛ+çÚ–&ÙÛ»#&Sã²[Çe£ŽÄeAƒ­0ƒ”~‘žV˜0â‚1‘©ÈQŸÌ`£.Ó˜vUc1f¯£¨ëÝL:ºz3ÑÌ\ÂգƮÆÕÃpb×*¿qAë}»õõ=µz¹™lT=(›qŠD"öbmÝp¾b§Fìy¯Æk¬´kW0:ÖZdªã^¾Û.\dZà…=/Lý¿óB³Î ÍïÆ ícðBåƒ*/´-¶^°Æ2-A#ÒzžÖúûá{YäŸGC·N ¡'†þXbXÿ ̹©t™dD £2fˆa½_‹ÌP…uf¨G䇇Ḭ̈c† ŽÏÌð33ü_0C?Ï ýÅÌÐÁ —‰¡:Šê5^XXà…¼0\Î õ$wM"à ‹ Š"Ç ý/~'^˜ÿ’òN¸h3H….Òó?^o^üá¿ $D endstream endobj 50 0 obj <> stream xÚíZYoG~ϯ˜Ç]âmº«oE‰¢ %B‘’^Xd…ÃÛù÷éê{f{®µA9²˜£¦«ë®úz»?;ÖQ÷u:­i÷â÷îÁiwÿ!³£ÄRÛžwBû’DËîôåÓÍž3½çRm9s×B¸kw¯(>s÷<\ ¼áOÐíŽk»¹xq~öžž]¼{sµåtójûìôGd';C¬RÈv; DyFWï^¿Üî$ˆúÃWûͯß=ÄÇrsÏ=? —¯ß^†‹Ë÷ñÉËwž¿y®ožÞ¿Ç¾|Kïݶß~ÙšJH¦ˆuB2K$D!©ˆBÈð‡×Z;A@o‚ÈNþz± @m ¥ñ˸¶Ðé:¬ªt ‰Ïâ×þ žv‚OÒZšzÙÛ«bá þ¯ R¹u4O •*8å¤3ªá—Dá|„Xï ã4E”𴵆 šw™ä&‘@Eb èÈäëÖŒÉ"Áó†ÅvN ¸£ãDFÇÜÙ¼¼ev`&êu\[ÅS>‹«CÍ^»ý©Èþò}ËcÆÎ’I½2³F6|+Å&Ní·øÎ;­7jW›ŠqJ`h)]YŠëÎ))DÓé¡)wÄ­³Sh¬QS*¢lDëgJCXRõ'5áÎÅá¦çB>€„ ;¨CÑíÆˆBåîTËÆz¿=I¤‚osä ÙÖÓ¯Œ8Ûˆ¸¾ ­(·§ ½Œûñ©ЋÜ=Ëob‚ ,’¢4…R%¯T1™É*ñ©øUòT”]äõ‡ÉŒ&Š´ŠçÂìГ) ,ÑÚŸ‹gÊdìo[*dfV…\V*ŒÞ;—Aë˜}£sˆvæãĈ¸·‡ûP(Þô>ú¹“DýP | – ƒÄø@û*ý¶*L}Vú;HW©x©…ÅËùvüRËâQ)eŒBÍë½ø7Þ5Ö»ÍEÏTy§É[zY+:[¤ÉYÚ˪¢jTËÁ`Ñﻞ â€üŒÅ Bpïø4¹´.);õ Õ·€W<úON$,(Ó[ ËÎÎJðjl¦6f€@r³›§ìYCr”'œ æœiÇ”êý'Ý»pi_æõßÒ&T)k‘$GrÊ$}6mÓ1qSSîMÒÅû&o²ÆŒƒ *M•#QÏz5ÀœW{ЉV¬á»À]ÊJ…ó¦¡`[w"ï6DDÞURœÂ6•#Š(s¦m»`L1àR°°}%Sdjs‰*ç%œŸø¢¡!å¦5ôñ¿ÔåÔZ¹pcdJFÄ Åö‹&J‹5B³"4Nåt奮Š5Î=jSõþŽêÑ㇡¨$X…£³—’"(¬-)|YEaP*Š l“™µ*J|³´¢±éÉ´0Æ*ŠIyõ‡VÞuSŒÊÞE«² t¯ª¤l SîYò¾æ5â®Ñý³„oE=ø>ª(ß½µ›úi\;6Äq¾ÎF k… µn.Ãàfª)UÆîß7žÇª¦›ÓªêÝŒM´!DªÔºî+ÓÜÁ$⹉OR¼©;¼ÁÓÿhÉëÚ¤DSKÑž´Ñ´†ÀŸ›Lc“Öü!Ú­=8DÓKÑäîíêîÑ®þ…‡h½ße(µ®œ˜…åÄõåwŽç6ú» ¿…åDÞ¶œ"æÏÐØmñ=((sQFÝ‹.fÎÚÜ0rùY7ÃÄÏÍ\â߬LüØÎäöîVwW`'ó!”&¿ –X˜Kül(†î‹1•øé‚ŸEÏåü%2Êå9¿¸@ó¼Ç˜UY7õ6®É¬…f¢3³•ãqüâNR?s;Ë£óóËó³ßÆÓµDK.Lý~©éÔ/ê¦,È”½šKô‘:j×øÕ´[kS¿ì¥~ºypšR¿v~æÌc8Á­þýi÷ó|óÔà endstream endobj 54 0 obj <> stream xÚíZK7¾çWô±¶åˆK¢pÈ ²‡H,B $P üûTùí÷ììJ"­Ð2ý(W•Ëõüf¦?&1qü'&+'kùôâÍôíùtï‘ð“àÌs?¿œ@3§¦Åhfõt~ùt¾PÂ^(mvJà5^ã½áô ïU¼º‡ø|·(ëç÷/^>÷ü÷woñVΗ»gç?4=9æ!a|Z$g&Èùëí«ËÝ¢%Ôu—óß=¢‡z¾ƒOÏâååÛ?ùí×xýéé½;âî~çÞ³ÁÛŸÏ"Ço÷ï?t¯I阄iŠé¸Õ‘Gf»I_×g‚)¸›¬Ã!í^Ç?º¶v·€ƒ9Ú m'Í5lNÍ•tZ™xƒÍ×;i‘ÎØH“ž%¹a…j5‰w*ÒkäcD¤Èku¯wÚ•‘I_žVêª;î‹L´üŠv„d”v›:)M äͬ„›ïϧ?&¦¼›þž„W ýYzæìô8æ|yðÛôãô89/oΧ¬C/öÑ­>e·“ cÖ¢óÑû‡ù}ÇG0-ÁaÒû»Cx%Á #`~²[ÜüñÁˆÐ’i—ég »‘÷)ܽ4¸=Ï0f£¥AE7ˆVê☂ÄûÉ€-ù´.ºJ³a› ²ßgŠŽ 0© .G\<3…I~Ù(ÄÒËÉP.‚™èD| *0 S¡X6ÜÔÄ@V·§+ (“UFzòͼ&øgZ«Ã³´jöx™AràÀ€bK¤{Q(R4SlÙ¬oÜ=EO]Q7°Ä`²É %)õ³êldY¥˜Ëþöq|ÆB¶g¼¯Iû†U£DJ$ÄøÜCTÝ!Bk×r0Ã}0cÚ¸nµ ½“·ŠTnNYQ¦â9‡nê#¸­Ò>´áÕç³6îF†_¤· dë%;‰Šá?n\¢Ó@ïj"©d*FGcPkò Rð]öº…ΨÌÃê¦5µÁ„‚Õêr¸Ä˜m¤TLÙ#AÑTñŽL³}ºØ@Ta×&íÅäã$ý©qÊå›ìi’=]^•3˜ˆÏRE\$va±êÕ"‹c*›“[æâ¿r[”’¨J‚ɹy´eg7Ùû4V¿b·§âÙ`ãRVÜEQl‡€‰:ß`ߺðßó‘%k…mg¥(ã%ö¶õ„VO½R0Ý]©ç§§ûýP€£RÜ"ÙÙ$•Õwã÷ÏjY`éЭb^ŽÃ›Í¶“¸…f¤ºIç™ø§Ü¤›N‘ä•yÞ QëÂ7R]Ù}ö}e³jôÀZFüŸšƒEJC¥ð͸ò`«e,ëÐãüf /¨%úÃPŒÁ= ²‘Oap$¡„þ®x}>õ*CW VŠoxLtÒän^Ö¶“ÜqÛ® ˆ&Øšk²b|Y8 sd›5ù*çL ¹µ*5e»»u—Ø^úUŸÛwÙ¢Øþ!õ_(|î5̾‘ð]&°¥Å8í0£Å«×#Y–²Ð ÛyÃliùñÜšˆÔ}I°±$”BHWj®ž£ºÏ4*^çÆ2Oæb¾îK!K1=bÉCž qÒžf{> 1ýòsõÎx×3ä¼”¼{•+Òú¬¥ ΠC6 }:ðOuèÃMíųƒrÇ}û0~$/Qqµæð ú=Åq"KËN2n²_Y¬´“µÝ );òµ¦æû‡c³ÕhQèdèÁ86c DΚlŽÍe¡Ž°›z«ßë˜'©Ÿ ~?r{Ìnb*$›³õ:‘tR”n£k$ESB/$§ àÃå¥5& |ˆwzt= ³¦6Úäñ×qY½e(Ä×nëÉkP¥&ì6ÔÔ«6·cЕÓÑŽîDà+žHDzàx m;^J‰ü=&Ë HeD7^zÜ£'áX©-UtSI~:”³ŒH B’ˆäõá‹“QÎ͇Óji‚®Â©rX'x_'l5ÜÇC.†`•ÊeXl´¥ ©Õf–ú8€DݵoÇU†Žõ%j½ñÖ÷Eul/Cû‰tbë}Ÿ>l÷aâ;;žl•­@ËBZìzqáTéÖÇ Áë7E¯?\¾æŸ _C _ïoáë›Â×ú Á×Î3‡)´`½ÖLû|¿Y…Ë*K1õY൸¼¶×¯Ó5‡Y.í|2ƒî–I6°oÂ.}žÍ-ö}‹}_û6p ûæô]PÁÆAêúØ·®#Ûö*®‚^·pmðWâÚeÂÎÛP§àÚqžëf““pmÇqmø2F ¸¶îPίú½Bì43úú¾…¾ÿ]è{ÿ?¾ù-ôý?€¾µr”ý*ô\}k©óûþo`ßÀŵ±oÁ5ãG]Y1íÓÐæ¨3pyÚœ¨6Ðf³6G)m>•£=±ÉãfÕ&Gˆ¥t ë4¶G@ãÐñRK*ý¦cÔ’¿ ×$7{9‹#/Z§yƒ‹~þNT+ðD³ªéÙëŠøØàÐù÷YV×ýÑîW¡,×÷k¶>@q†~o†\šå›SnYç©Ìý‡~¢u8à"Eú|ßñ·h£ n‰ùÑo¡=­`ã«ÃÞVÖùwlD›W°q0Œ;ê÷€ÿ:Œ/ôCÅ2)zÉ« Ý£öüMß=äRO!ù²è:äÛãC¾ôYé‡|¿Î}kÓ¨ü{ÀbrUæÌ&ºWjÊß ob²‚ó_è+‚+cqˆ.ØŠé<vëeˆJ36ÚÅŠÒW<þæ a endstream endobj 57 0 obj <> stream xÚíZKoE¾ó+æ8›x:ÝÕ¯éD\@äÀ Ù$oAL$[Éšàö¿§ªß3Û3Þµ ’eÙ;êêêz×·î>u¢ãø#: µ¼{÷±ûî¬{ñZ¸Npæ¸ëÎÞwJ³QvƒÑÌêîìâ¼ßJa·R›x­^ã½áô ïe¸Vt¯Â¯â›AZ×ß¼{ÿöæíï\ã-ô›7g?Ònº™3†6ãÝœ¿Ï_×—›Aƒ*ë.¶ýé÷¯é¡îŸáÓ“pyqýç¯~ ×wç/ž‰ç;þìÅ›ÆÛ_NÇw×»›Ï“×$ Œ T7Ét8êm`¶CfÛÍ«(ïX)g‚I#“2j‡«xz~éÚÚÍ FÕ]¡îÀ¡;5ʾP*WFÞʦë X¤36ÐÄgq_¿BÖ’(À;è5ò1"P¤µz*w<•(/+u‘ÏE*„aNÖzœSG¡I€t˜Ù¦Ä懳îSǤ»¿;á$3#±td¢øÀ1ùÁ‡î´û):/¯ì“סGÝ%·ƒŠndÖ¢óÑûoÓû Á´ˆ „‰ïŸ7àUb°åB¢ZûSt@Ûß¾jñO·=ŒÛMËý$ßxÿC-U+ü ¨µ)ÌHº ¼OlñJŽYX0 I$»ô s–Þ²ü ˜ BñDQïb—]&Ùr­}³.í³kÉ*O›š0rïöéʤ@…@O¾™ÖxÿŒkµF«0áõ-‘Dö (¶D¼‘8G3Å–MâðÊÝcô„|gC&kÈ&ÁTÌÊ“–Ú¤$ŵܶMìLmâAaJ.çV³$F‰…lìD…a¼ÇB¢HÕ:ËJožA)¦\3 Þ‚Y5;†¼ÿñ°>ãAÌÅ<åÇEy·%nîÚJU£ÔœeÚÕf?<Êj‘³U-êŸù¥š=õ4k„sв Õ°*Ë E.O{l32ñ°ºªCUi0¾^Õ²ìŸ#òofɤ]‰‰ªø€oðI5Ë€Y¸pð§6ñ,&Yœä§Ìª7éÓD}ŽiUJ`"<‹qŒµÑM-DÇLÖGÏMµ?z¶íó.‘*çýŸ]NôS·Çâ—õv.Þ4Ps¶bìLøÐé¶]Jgþ»]k ¥ÀVÆ™ Êx.ÒËrªZN=0ÞÝ+çÝùŽ77ÀFÀMõl¢BñÝ`ãé³RX4º•ÌA;,±×¬¹†+Qhª‡4ž‘L_ºji?/2OG!j}@øª{›Ïi[Y­j½â{#þ¥Ò0h;FűœŒùÁRǘ×Iììa1Ò”:ºýX ÑÝŒ²–S)ÃÔJFñí]vûdö²‡.äÕÞð;ÈÔäã<¿Ì•&¹uå΋¡U´5$×¥2GO£ö˜x²U +%M«Rk……”Û~µ»kÖkYºöÓ…î¡äk£« ÐÍ,Å ;+>öµî£ûŠØ2š’UµÊÔ¼Lly’K!9ïUÚͨªºyÄÎP`R„™ †–3®/~¡€÷ÕžÖ+USHEÇÉJ‡êûYzZßS×$ÆE?I{,¶µuÎ göõ<']ä§2î­«ªVOÔ~ljۨ`ƒ¼ªjácå3…­Z0ņÕ•Ø‹r˜÷ä/÷'Ø›CÌ+›H®i‚ Ãy(=Xœ`Ó:j£Õ—`íQl¤±¹Å-ð ˜qÓiÀasF†ÆÖO3˜;ÍÏûlªôà|i=ÉÕ~ã+© ЇmöÏ$„¢¿ÂN¢¿ÚÆ` µÆWÍ WºçÛ0 “ö´Oó».Ó¾[Ÿö%gŽ™öÝ8Ë‚S=¸Æ&mm=¦/ÀÀd*TWÍj ª!°„P+ü|šðe Vƒ¬í¥Pš´VηTÕë²4ƒ;±ýóŽ>€7É#žŸ@<µkAžŸÃa¥ÿ)VÊ¿¬t÷ïc¥ê +=+ÕR@W°Òøà>¬TKK^ÿ„•þO°ÒUpj +UŒÏ[Üiƒ W¥‰¦ì횬ÐáÍ~ o¸¼jmfÉ”tØ4ë‡Óa·6!¹ê–oÂn¥8» F´Àø¬KØGs+ÐVs[¶š×Ðh‚7uô‚ ŠVù"®ŸÁ¼ª‚yǘׯ‘io»îæQº5¸×š}¸7ðt‰°˶{ÉÒëù|ízܤÝgq U83¾,ÀäûÅY;/s »k9¼ÿ>)Q,ø»]&9À­w‘õyÕ,FQÈ£PÞ©°¼ ÚmÄÔ:GbM´*³Êi[ÌŒôå²$æm‹AUO‡H޶È 2Ý ¥ö%¶ž)PgǨrÊCLL¦Ê—·B˜pyÂi*XþrÄ€`yŒ·˷˃¨´vÙ„Ô-Í™f ——SYkÝkoOé¥XÇŒ°_Íÿ[A‹­ñI”Öùj<Ó¥–‚µ}[_†ÎÃã¾é~I6|ä»Wá£9Óbo&§ÍňV§‘˜¬EO…H ñ§oþÐÒ endstream endobj 60 0 obj <> stream xÚíX]Õ6}ï¯ÈcãoǪú@Q‘Ú·–í!`AB…»-,ìþüŽ=ÇÉ:ɽۭŠÔ+„n6Ûãã3ã™ÓüÕˆ†Ã?Ñ8Ù8Ç›7›Ï›GO…ogžûæü]£ TÓ[ÜiÎ/ž·;%ÜNÛ)ÏZÃ3ümyx+|Öáoÿ5ïzå|ûùÍ»—¯^~¾üðµS¼}Û½8ÿ%¬fšykÃb¼é%g6®óõòýEש‹qowí³'OÃ[Ó>€×gøxqùåõ‡·ø|óüÑñpÿàÑ‹³¸€˜ÔM/3èÿh¬Ûk4æ÷8àÖl×—ŸþÑèã«›]»çgûý®Ë“sœXßžÆÉ“êÄ*ìºïC}/S~<3*aÏuÂÖàÿðìà«m‹''#í1'£M;Zj“F¦¹µ£çN:°³mÒ»4:ŽPäI´Ks9>Ú›‰¯Và›ðke²‚yœ"bð ØxG߉,L„cN$‹jsœÎ'ƒ×¼5³CúŒÇÛƒÛÌNØpD$žµ©®|¦‰WÖ?èóŽK €ÄPÊ À¯ `Šâx•léÈÐ2kx¶é âH€ðIà\:ÙÉ¡–5‡µc\'—ömØ>~fˆŒ°Žé2"qB– NÄ*pr1 -È–xëä­U4‡3ÈgÔŽç+«ôVs„Íu›x=”WÆlË,EG,%jô˜ðsèbY™CÁ"ò™j¨zfM1Úœf!;ÑÏrQ‚ØäK‚Ê2>TÂ#QÒi¢hÈ Z–ÕEHn:f^…——-Î?×?–ÆÅä†ö£-òÃ&hü óè[L|qŽcï ˜ZÃHZU3r‚ÒM À.PõÔ[”’”Kq?2Xl38G^>Ž„”&Ø6ňÑ8†ÏΖã# Ä„pjáb…bS-"pZç0ˆ…e^M÷Ã)™0纔Ÿ°2تÑ‚ .]‹¤¢³Ÿ¸5ŽÊ+i ”UqÜø.s$ÊOz̼©"Á:B,‰ã€¹­à»J=CµS†;0P»P·>¡®CÍçxåRÊi.Vv AŸÀh/kñøfµG‹j->~ÍÎ, yǵf¡”Á¼òY@Ûɼ ß¡ÐñGHsÁ‚W2¤aÛd‹¥…à‰S±ðìö:H]G×Û-¬Ð¤ 7ã4¿™Db‰âÕf¬¥óOåBqd³—«i÷í@÷Oè´?qlµkÅ+gƒÝ¼f¤.fû¼<tÖÐo…ä4¨y—9L꺕¬2Z— !9ö¼å¨zue*ÓÖ—âÖ@ü¡«ZL;ˆú‘bœó…^Uú2ýÐ~½½ dm±œ¨Ú˃GÒÅ_YÈLTÜ϶žu=¤Òëʾ ªãl_¢\.¶Ñƒ¾Û=^¡1T/ÐVˆ’Š18^þùéò¢Ff¤š­Ðð® ¥¹ŒeÊ °zžÖã›Õ´nźĒ-ÂÓª¶°ØêŠA2!“ŸOj: ( Lj ®§\*ceà§ÌçÚé•>´¤‰ˆ»eÜZ¡Ïc  ¯ïß}!½±vÒ’q1¶³©ÑKb‡5—¡™ê8bÚDQ³O¨hsdYò•û …†i .€ÕÏOgtB~" BÆ¥ôPØßƒz{u€|k|M¿½ú–\óß ¸(4ÝEÀ•F(àÚŠ€‹£Ë«±õ\-àJ?0mgª¨pE׉&EƒóÚP¿˜Ù¦*Cùa74àœ“NðI>iÀ' ø¤Ÿ4à“ü¯kÀú¤Ÿ4àÿ±¬4`C°‹°2¥¬ìA0 Jp> â«b²kpúš¹› ¼ðz®—å¿r•ò…zõ–9µ(Þ“²dέŠ]>ÈÀ3‘xtÄ…ŽmÝ+·|éÈIFþ&ddéù¼×õâ­ïCF–¡qúG2² î¶ÞÊ—«d—ÛMwÑs.Ož‰X»—¹º£ ˜¸Ã0Gg¢eL* ¶ 5Ôº€í*6òó~2ô3Auš ØW‹ ¶ z÷zTÂSVObX.ÏV¨¤p-i!g×¾Y»–´PvšCÐÓ]4l3ö–Ojd0Uj&䔢9Kº6\ÏÂ×’ûíÔ¼¤sËáunÅÃÅUèÜW&Ö䯒¢3ºÉ:<É ¡;mpCè–…n¨¥™†¾ÂÛ ³Å„€AöÓyóëwk¸XÆ endstream endobj 63 0 obj <> stream xÚÝZKs7¾çWÌq¼Bj=’K¨P•Üœ“M¹ÀƆ*XÀl~~ôj©gW3»cBRI¹¶vf§ÕjµºûûÔãîNtÜÿ‰ÎBg-ï.ßw?žvž‰¡œ |èN¯;¥™“ÝÚhfuwzuÖŸKaÏ¥6+)üµRþÚß~ó÷2]«p¯ÒGñÕZÚ¡ÿty}ñòêêâãÅÇÛ•äývõâô—0ŸîŒ Óñn œ™8Ó—Û·W«µ5¹=ïŸ?}~×ýÿà$]^Þn>}N—W·w¯Þ½N×Û³GÄà ðèÅùêIžÐ‘õ ÿ>10 y}\eûuú„kkýÜЧÕúÕƒ]²zçP:H‰$¡ÀßË Û_ûy  dœÙ$ $ ÎnD«3ê(QŸîjˆh"¯Ðéœ8ǬòÎØlP¨Ÿ4Pâáj †÷¢áNŒC Öµf[ûß™ N—Lë9G{£Âó¬Œó¦²¡šUtøˆfƒ OMP°̨(Á+feW$Ö¸iÄÍá:l†nͯlŸ ø­¡Þ1ióc©àlrK Ÿ°!a–øÍk 3}‹½‰› é9J›-ÎÁaU ˆ¡`0œa<[X—‘&Ýkžmì‡óUQirÑ(ò} €õ ˜³t7ëj‚E}Èó0MÂÓ¬’²Ÿöº• E¤NΈJTU—,ƒ”ÚÉ:…šÈ°à¤³3Î`’ž±ÖhžÆ­[AÉi^Ý6ÇæÍQ‚D [>vPØPcÑ5$òkéë#qŠH«†Â@ŠÎÔÜÛž‰­ô„šQ'aÑ{÷ cÒ—Æ»“–~ ¡¾=ÛðæŽyøH2,MwKfquø]ÖÅÓ(wÑQ'¨&ø+p+…ðk#5l Öö߇/GÊ‹-¥Añ°šZÞ¿ü³–©å¡žaTϤž÷éœø›@òÓÅåí»I€ÔÃBÆa‹òË„”‡R)‚fÉÒ•<!Õn–[™²Ü‹,/–«•186¢äH˱(9„Bw% (é·¿‰’œÁ}Pòh€Á¨aÒÕžR%äîâFq ÇÔ¾L:Ôþ¼¡Ü2 &aÒÌÁd”šƒI¬ÄIr&{˜LÉÁ“òþ()…:„’R˜#PR Ý@É—ÚàÓVŽå(1…–U;¢¥9-Óÿ´üòÑòËÿ-å1h)ÿA´¼û௡¿zùùõÅË»›C˜ùvó¹BæÝÖÆL ”¯*P6ž^ѧÁ¿§ÝŠß¨î ílu˜¨Ý(«SU57=¡½øZ/=’Q"›—ÑW-7õ7:g*Qe9“XÖ]\¶n–ûCXëÄ I=Àù*Õ ² KŽN¶ªAæ¨j¡UP†xµ4vCF !Tì¡ì úêé½ý2w™©/ÏT¯š=ã Ž5Æ;†PpÕ­}ÝÂÁ†JuyŒ˜BÖ|Ó4@†ó&˜êxDJ¥sæI¿ÑjòCk5Ó™;¨½XÅŽ[zr I˜ L¾`œ Ødá´Ûp°ÊaÃA TíÓ¦FæMQ¨QèhŽò(‹Ññê(¥8,¡Q[ô¦QM%¶Æ÷72ÑýÓ&º&b \/³Qï˜zÐ×g›ÍWºñækLœp£/Ú’ÙQ#ñfÆRG汰ƈº‹•‚.êë+ˆçŽœ0”‘„Ô Øês>áDæi„ÍfÅîcœ}*ñbAˆË£É«¡,:Z•Ë^rË(¡UvJ(Q§þ’¶¯æc +éJ Â;$^­h„ɤ˪¬$¢:5ѱ|¤ ›>q”Áy÷tÄ3¶&¡÷ü©ê14F »!{WÄ›§B¿yõXø¦Eu³ÄØËy¥è± ‰ –ìtxËŽÖ•1…XIÅŸÒ›i®Ð„P L™»‚ÂÑ ™Ý‰K5¨š”°´G1ËËB"ñb¥™Ú!ÆËwJ æ°øP‹yø5“EOìQ>ùjÀÒÓÊÌI"ç%JßëD1ã¶&ã“w1NŸ¶i—)ïÎJ¶#?’Cx-5ŽaEêÀ$$t:%¢*} d`XþÊaã ,l´øê¢u?Ž¿ŸŸý~¾z¼KÔ“aV UÙÚ«d5’JKN½/™X­ÖûÄüÉ>+‚¥( }JAR»äQ—¤C…¹m`-fÆsÎj^ë²z˜Ú-õ±1%–³:–Iû­hÇØ9²`–£-´Æ+æôþ¹Æïv‹ yPE‹NW'¥³2ÒæâŒïꦼ±7Ìi7{ÔæÅKK8Õ Õ?l–eza‡_O˃¯§iGÍcíüQ€È=²ŸªKE“Ä8°c*B@ƒ|è©\û õÊ9À)®Z0K”ÒÑlܺgí¢p?¶V³3JÙF¦îa÷èœW_ºÍ±šWU´Nenÿ¤™`ÇhP˜ù§i Àw;k¿X‡¬9¢ÃåãQÒ½øã<3†:%‰—l§E؈«RÍßtC QJë'“øVf¯Å«R)Ê[äeù$Ÿ«º—¦ÌßFaž”ß ƒC›FŽZR3Ü.E[ö5²B£©5{­ŒMz¼ÇýŒë‰èò.¤åJlµ¸=¦NI‹å-°fßGÕçÄ USßJþ0Ñ;Ò°§¢¾¸Ho-¾æÇ.÷ZøBëì²^Ø€ 1H+ËhŸ ‰pfzص±C=›á±-Îðñû²£§ô—`æ'ÔCù‚qfpñç Jäÿ:iõ?v¿~÷œîuß endstream endobj 66 0 obj <> stream xÚµZÙnÇ}ÏWLÞ† o«÷%‚b#1Oa@H¢© IY"eËAþÝÕKõ2·ænN œ;ÓkÕ©SK÷ôÃ$&ÿÄäääŸÞ}?}}9½xå'ÁYàaº¼¬dÎNk˜3ÓåÍ?ç+Åõ•2êJ9w¶QBÃã®”6WÊòòWÀ|'Ϥƒ6šÇÖ ž¬Ž¿ —Œ_á¯Í=Mìíò7kóoÃû9Œ-céü;õ‚–Z•¹ãoÿ·ùtœÃ¤7©·-sÄ=hÓ·r*3Ç=ä]Ö}”•Ä–ñ‘›³]þeÚË‚‚?Š”Q¿/§R³¯ï+“¤Û. zÁf}ù|Nõ7q²üýG¢»gâÀÞ?½m[Û¾î_ȵ»Ö}#•,úÏOvnРU?g]”Qö7M–S‹ñ’YÜìϤ(à//Š)0‰t?x¶ê̘¹@#½+-g©®ÎÚ^AV"v2x¶ ©ÖÕ¸“ÚÓäÿ.c°Àˆ3eF5¬maj£¤˜+²áW\YB>Z Ì[ÍíÖFJö#)¹  rEro Áê=µÌ¨òýæ„CwY¾ßÝá‰Ë¦Wâ{r&4œf9%ìÙ"ÙäŸQªU–øß2TÀ@Žé ’¢ã]'Ž-ê”ÉÄ[æ–l‚óš IlzŸj—5& ZùŽf¥ówl΀—ÍFzX³:µà„üãvª-Öæ'eË<¯±«ó8¦ä¤X°©ÁåöB6Ì‚<’TÖ"3vWåêJŠX]ÑfT‰ÎömÒYÔh¶Í¤Œ$ÕcýLew9ìÙp&ŸÞÝ^äןï?G,~#ƒ`\Œ*¯¢” QšnÐOëƒZǬiØÖ‚.OLµ;üß²¹/•ê· Bµ{A¢Â&̾ň.ƒ´~Å9 -Át¨Þ8Ò“ ߈dFëdï©ÅøF‡,æpœŒ¡VmB¹u!™ñuÒfÎP:°°ÐÿÇÎ.`|ýáã#Iæ!Ò߉^ßø&¡÷im0:9j˜UZ[˜µ…m%\H_öB·8Z"ôp«ÎTªÖL60cúèµKX¡EñúrK.˜Çe Ä'S#¤ÕXzð?µµA/^ì±Ú›I2]Í`¦öª[Ô÷ð@Á<êå÷ KfquFHEÂSi·ÉrWNvެR‡,!>n»´[uh†6^0¹ðd£ñ*×ùù,mŽ“mç¸bÅ}ô\£Y­à ¼ÊQ¸rŽy¹#ü¾“Ã1bõÜG•{0’¶ÄHdcIsÝ¢÷ÓqâLµŽ¯Pʪʚ[ [Ä.0ª©»’õé8ÀÀ+[½&Ö•¸ºMÁÌMŒs¶Íc=­;%Ôhsj0¢û¤×þº`$˜æ#ó¾¹¹&ÿøH“›=D˜ó‹á>]¿{¼§†SL†Jå«¢E4ºA&Ú©3 U¬¦·Û^¬É$×X6·§VQÆ>ºFavÑÖJ „–¸~CÒ–ñm¥åÇ¥Vqˆ’fq˜–JFæaÁ\`’ª”8r³]¯¥~ΜWÇ$í¸ðËnsþÓåôÃÄTðÓÝiÆ!?ÀIßÔS1 ýºŸ^O¹¢5Z?öP’y3Hd1ÑÔóUiûÒ‘’sc#“Ä&>¤ò¼Ð¾Ì´öq¥êé•Ôôe;nLÅ”Ýqc,@‰.rü™X-0­ŸdÚylò[:]v°˜º£—¤T¤hœ}5+I;èÂÍJŸº”†¢K¹Ÿ.‹×£ì[žX'¤(Óûæ€ïnŸ¯ß¾¿~þpóæ‰Êµ HöªJ¤ÑJ"$rx˜Æ”†¥=cmñU–Lt¡ˆºÑ7 šþuñ?-§#@›ÞÜ!׬ÃÄ ønˆNNÏ5–Ÿ H±¢é‹qdÛ,LAs°lÖè¿/5&N* ä*xY‘3eŠ®‚‡Ãå¼k¡Ö·t¶gÈ\k†vAá*8«ÖSÅ×ÇцÆPÄ×ìÄ,­×µJI~kնл–ѧHÛôc¬!Ab¿:ÒðÉGÑêØö!ZÆÔŒË3m¢1"š¾Xõ$ØOô-.I-—ŸìHÀW¹Þ‘Ð3ùø¹ =Ö'y‚^d( ¢“&2©<0ý>‰ÕnUbk®wÄä!\ïÅŠÄLø¿Il1™ç-/שö¸NëçÕö»°ËönÉZS.¤0b®ijW‹ëÏ],_š /æ2¤¼‘äñó)MùÒ•½ÐÕk‚èÇxÅ5^³ªKœU™µì GÒßç5›>¤Äú£á‡âj!nð²$ /^¹ˆ «¯£ßÚ2!dŽK‚%Fi)œ…׈ʢPEZÐöþxtW%¹Ù?ÆFsWÚütl¢¹ON·öÃãK:#Œž§epwOìuÀqí(IëÅPÿ¦†2õ@2†1y“‰¼—n›·\ [o ±½—Û'#IçCêœ<‹Ïç4_„Ú/ Rù¬®üVÍF†ÌS;<Ý-ç {i,­·Ïö¬!Ã?€GÇÿú›WþÛ%!2¥Z‰è§Æ0Ž »/5F‘:±¬HXŒ F9Zg¦\œ_ÓP=GšÑ’vè?lÊêD­‰á—£*çhõU¼qF_Nq¢hÞÔ”r¯"; Œ¦ì™CS–{ð’„âùºRÔ À–µöâuL¨½¸óL©áÀœœ›×jÛx¢d¡=u<½çnÆ€‘èeHNñ¡öžmâ¥çþeh/m_¯UÍZ’¸s·£z© Ç´íôµ ß6tº# ߌoíHÃ5?_5·×„$Ý-¬£Þ<ð©¤Kä¨Û?p*÷^FX@þg#ÜüùÍýyJ¤»1—µ•\ÓC­6É“jTª¤4{_rà0³«^ñnu¥N!׫Ô<–©.Pu‚-Îñ±fŸˆ8ñXªçW¤!ôP`ës«¤±ó>ÔéÒk¦HÐLýH5iä °r9A!ywXÄ1ºpu>½y¹™&Ãâ*4L ˜&Ì]…s8SÁ¯ L•.T̘*×ÑahÝ=¥<í ¶ÄÂ0‚?ª¸ÝLUÒòBUùe(Â&Þ'X^ØE^»Òß5òŠáÕꂘÅwÕ=Í–~ËMè·Ó†±™dâêŒÄÌRëz.y~¸{|ȰùOücç¿þ#9¬ôêw÷Ï·w/óó×—Ýû·Oå½ÿ›_=S•%ÙÝ}É ÓÖê³Ò¡sòYéi[ß5°9iï•¶+†Wf^¿ª¸dž“üS¼–¢Jîüˆ}w~t,'Õ WÍ%>Ñ´E)ݸá‰=}ùð…øV H³ˆ*¬ÓjÅY=ŽgÌõêY¹¯7ºr3ª¯?³O:´Òº3¢>Ú]Vé²ûͱî/ÕIµT¨©ŽÒ‹¾|ìVŒëJ´q‰RxFÒp£é8UaùQZÙ)Æ­œRƒ®g ‚ÒŒe6ôÅkô¬]m »ZZªÂÄj4ÑzÔªSÕW(|>§ ±ŸjSëp¿ù`ùw´ endstream endobj 69 0 obj <> stream xÚ½Zë‹#7ÿ~…?Ú{¶¢·º³HÂîɧõ²lfg`ÂÆ“Ç$÷øë£R©JR[ínû ,‹{º«K¥zþªÔ›_6j#ã?µ z‚ÜÜÿ´ùânóÉW:Þ“b”ãæîqãµ~sðN·¹ûðfûáù÷>>ìN…í««=\ùx¥÷tÏìÞÞý+ò*6J—‘‰ÅQj¿;Xç¶GãÍÑ8½Ó!^[ÿüõ:þºø žK¢vžò»2¿£âÿ@ ï…z›¹)üŸžFÎÁ왥Ìd‘uˆL‚b&°ƒ2Vx¿Â¡ª…CyîxI…vw0Fmþü=+¦Qðà… Y1'ùî§÷ÿé¨Ï1˜LôºÇå ¤2ÄßA˜±c(ƲþCÖ4ÖÑ^UÖñ ÖAj²ŽöfÁ:Úë%ëd’yëL—ilqÈÆ“Vßï#9Uô?o¤¨D›‰º\”Ò—ÓSë˦Ž6Öª6õ<3/\mV¤PPJXÅBEØ1†ô<úÕÞ&šþB1¼µß0ØÏZr PYI£Ó„ÐÚÓ)x#Å#¹X~ƒmªá3 2cð;[<òóìqäÓäu|Þ¶ÙyF'ÔØ÷p?ãÇmñêÄ 6cÇŸ„,M’ФK)ñDI#D:Ï<:òÁœh3ÿü[çJïi‚^•®E’()0It… ârzØž/„‹ï‰!Æ#†WúÕ¸6é7]‡¤09ÑU¶NZÔ´E}ÇÌt¿ô‹šŠ”êOv%~mŸH˜ƒp‹¡¥Nu!­²C‘l`5|²Æa“¿ñ[vÑiážè¨(¾¨È*ºr,#×m¦̓…¼Íj1˜µCÌ(¥KR•ÅHYb¾â°³º‹^ˆY6ó«rw¤4$£“ßI&̪ÁØ," ‡’Ñ1âŠHÅ{IÍ‘3Ö†˜?ý¹Ë6ñ°àÂÁôtð¥Xüvÿøtzy÷øþþåù×§ÿ=t´=JH3H.Ž;²™oR¾“˜…9åG×!ájˆ)N":+ú˜¬¹,}MІEoïW>+œ]ƒr¨ôíy±k=¾ÕMô9±k«AšÖôM(YXek/Ë ‹''ñi¢š†ì„g¢.dø÷tz|žþˆ­ì¹)“,ËÓéÛ·ù->C‰×¼ÿøæíq·G*ZÅá*}0yPJµM;Þ˜ŒŒêT8H7&­qUöô=™¦Æ4îz`qž¯>ïN¾à©CÍnk›€œ–KWO[e¯’ÂòK#siÇr½]k8R1+ð”Yã˜Ü¸"šPáìÀâ&üÌG§Þ¸²žN¢ „Õdbæ{3s½Ë(ÄTwgig S, J£ÝtÛψL76‚y«œ5@ÄØžÇ¨}#…qMó”b ŠÕõ¨º*LЉÕêâñù0ó¼NpDà/hP¥YÕÄnó«on~µ<;W¢Y‰²¬CW=4ñhsã¼ÕÝ‚nÓj´•˜~¥˜~¦3ÐÅ÷c±éuò}5–ªàºî:í~¢Ê)#þåj4±4¯mÝãñxF„£n:TUí©JšÕz>™„‚5Å×9Ÿ íœÍWØ®×øˆi~œa¢ÇLü…Ôäa‹\(,–E°–½ºhD¢‰Â­¯0|Ò~(e¢µ ¿õ8óÌ‘âeÀCß‘Î÷2çE½N v¤0E= ¥‹øÞÑxb ¾Ç2'ÏI2ÍH¦°<à¬bf”ŠOoH$Åê!æ®ár„Ja‡&»qøÒu¡PhÑœ›Œ4ð‰Ãùya5ƒàÏI”ŸÌêþ9Ð¥ªþŒçNÙ¥àí`ˆ̄ɹ°ßö+H~§jTbFs)MäŠR5ΙzE½éa™1œv[(%ÄC95Ç­,ç¡,FKߢ]F‹rÓ gpÚàƒuųëžÙP@Ð ¨·Ëg•°F å=þð_û®ŸáÆj…§Þv(ºvŽ¦Ð ÌÊj:²NE^”V˜“ÕñL5-a¯8_CW# 08¡{óË”S™4¥’óWíqÙXN›£¼½4 *ƒŸ#ZW8*»®=d.;½>wz”þ‚Ó£ 3¡|kc×Z…!qß|5ÉÞùS ;)ÏnÃA‹ÜƒC"Ë„í­ÚØvêÌ®j’ßµ^›eQ&AK³>¢4ó¤Ob¨aÅÉ¢Žú­Ä@C>´fŽÅ‹ƒÎØEÖר‰xŠŽ@ 8sP#ÿ¸Û|û·?MP#f endstream endobj 72 0 obj <> stream xÚ­Zmo¹þÞ_¡«ÂbÈáëâpÒC\Q½žû) ÇŽ9äœkcE}9$‡/+rWôKrÈáÌ3Ï ¹û×Nì¸ÿ; ;kùîþ·ÝŸnw¯Þ¸àlæóîöqg€Y³;ͬÞÝ>¼Ž’ë£4â(µôÿ|Žû§F¥âþ øïþ_ÿ‰¿ý¿²ñ1ñ·µØK`/¹;¥ñ°•Ûb/#ÐØÊg½4cc’Ž­±¥â7¹)M#¿ªÅ¡?l‰-ñw˜¤Ÿ˜’ñ{è­â¿âõB+{Ø¿»ýËî ›¥ÿL“b° `EüÄ)ð£ð _‡%k5ÅXÅð à¡Lí¤‚&y¯ã3­¨%éÁ$ÝD$¬Lymj8ÊÌ”Ôæ’göŽ©á&O¢ó$Óvã6i‘§ Ò”ÆOõ…oËžíÚÎÕ>™3÷)¨E¯Þ¯ìWg€vŽ"?¿<~zz~ÿxwÿüåߟþ÷1u¨í}6LËÔü8%%UÆžæÇ‹ÉÙa/£²Ð¤ÍÔª×%õ–Õå Á>¢EF[ æÞ¾¬ªõõ×.õ²ã7B¦ gåêÛªxv8Ǩ³ÏÛ*öK+*Nóëª89ÌÀ¸YX“-pÒÓ½”d‘AIpRc„oq•–Y˜UÄåxÓQ°õú“¾ÞoëW3mH¿Cì´¶€“šáR7ØKNåMqbÈY0îZ}d´:u3P„¡+ÓÊD­ ã˜!M¼î,]æòÊë(³C”´&â_ð•'a¢aÐv(²9wö`$ª´YJÀkmj @¥a^¼&ºx²m­3hRÂøÿ8=Ý‚2óÊ7Óè—ì£Îò†3Îxˆ+ápP¥©ÁߦOXL鮨FvÊÓ˜/’9W!Ô`‡ €ƒKÏLØV?븭”hq» À„¹x5ãPï ¢ø«°ðûC0†àIJ²˄볂`Yrœà¶VO„4ŒË@q8½ø:AË MYÐDm<‘QWN„IÔš,øû»£œ¬Ù«ò ‹ÛaláÍÄÅ£DÄÇ,‘ð¬R<á¦iV§øêÕåL«‡žE+ÇœJ âï»ûogSü¦¹àú®13niœ§3Çñ¦ Öu DÚ¦“æB´HÚÔ‘`à;ÚãŒýy@Jmh3›@“”³Ì’PŠ¢–¸ÉÔ")Ò+^0³ÜQ”¶7yŠ©LÏèžþ<^‘_üüÛ^¨+Œl‚c³+ƒüø·ÛÞ&x¬%IA_bêëÇpz»†,hœ`ùJXŽº…* ÇQ­.¡8Ž—9E‚ÁæyÁz‹VÝaH"Ópz±$2#Ë[ùŸ[èN_Áÿc*¬¦’àP$tS‘S«ˆLµ2êƒÊU©…ØY6Û@ùPoÚlÉÎ4vfõ.7ù¾‹ôÀôBHSæ(ÌM¯»Ç|ÈpÒ›‚ðŒ’šï½¦ŒËSum³Ù¬ B¾… ©,à]y’ÎòR×6¤Öï:3ÑLm¬ØÿÜ0Ø’oÖå› ù ? ¸Jþ›($¯7‚*›>€9`F$sýfà#!ÚÆVƒÄ'Ô²””9àä_rò´CÖh蔾¯N¸¤‡ª±0(ãY‘ÉÜbßÝ*Ÿ&Òäß»{%Š{õ½Ó7 Uÿ4Áœ=Â=î[ܳl6ïoöVÿ°×>·Ÿ 3Ó¼ ðIY!´ï7ÖR#À$N¸©Šk6Fí¨E‘)¬I\|;Ì@‡<+ Â0»ŸL(!Íz¢‡>Ls|¨ê iè U‰sÚ©®Mop#}lޝt:RòÛ¨5”ÆjíWÕž^Ÿ³‘e°i Á' ¹E¢‰yëE-$ç²q©±z†5Vfa±)¢ëD΂sëªPÒ­´Ô•°'«%•4^Ïy´ÄrÚj47i`®£–0ãÑ<mñ+–ÝÎežÒ~½?r©žö’OÏï_~Ç‚àôp÷L­ÐÈ+A¹ÜKäXC‰>ýÝ4(ª‘½ü޽ŽD=ý+=ýññÓMü–ZëÉ7[>úõ&”|þø”ÚÜyúú¼hþééáí»ˆŒ~ýÐïÜ^M_^>|þ»üçîóÛwÇ}/¬<”Iõ3¬D/Ì%•›íµ§s]„©‹L8~`Æ–'Œ(©dle¯)=屩´¢SòÇS &ÅÃ0g‰Åªy%ˆ…u›xš“Û®9^h;v§®+ÙŠÎnVâ$ÐWt;½˜YÚ©ÝØ =7 ¸”Ç› &·*Î|^±*WÖU¥q“q¼ª»‡ü -.^aªŠ¢ìZÎ× *x¨ê˜Çº•‚û8Õê&º¢ä± ú™î<—zúãÁ‰©•Wv.¿]w¢TS¤Ö—:S5ƒ³ ê =–‚g»ñ:R¸£²¸”3rì¦Fu+J¹_ä¦òšƒXÛ¯ë‚f\•“‘ùïï^~éyà,˹Èh.uñA…Zß ˜ sÌ•r¹áµ¬Y2AšÿµK4lZ]¢fùd¸”J™ZQr «âJýÒ«àyÓ%æN`òç)zYÔŒ\)3g5HÎ]¨b1†Œ±™á'í(Yp³ç°6¤ÿætD§P/Äi(ºo4³_UÉÒ¤ä›$.vn¬nÏêÂêv zÍäa‘VR~Cufˆµ`ª‘¥AÉ€C±2Vµ§@Nƒa‘ÒÄ‘­®n{TvLVŠž 'Uðʲ¸§ÝŠ÷é✇â"QÌ ¿èù¹-gO¯ûVTÖ6A4Åcé7EÃéIj`<ÆN…öHÅRŒ¡Íyxè`иd“yD¹á‘Æ%Iƒzô¸¤/lUÓGª,Þ ÊÀPù§æ‘WÓ|è\+‚6­+É?Jðt½'CÕIü dí¿åˆ‚$ýšÉjúÕ¬weÅD>PÐhÎÞ‹$.sPÊIõï\†–Eµ@Ÿ»wQo¡¸T}óëÌ DÉ&®Jñ— âê"çtªœSžï›E7#îZL§'‹i0 ¹à‰ŸeÀ‘ûxNÇ|PÎ"•8ªÂt[½/W†ëÐU® ij,]Þ ¢Ž)wDA,ªhâdß›Qð>lÅâj˜XœâxŸ°ó)¥ÞBmϼâécŒ¢©W·€Bo¯¼å{›E•6§aÜLáóER4õŽì:YU°Î›ñáj]9“\«\LRvßp»|Œrß®R‡í6cÚÍ´[!~·gcÕBã-¦­ˤKÍ×äXñÎÓ¹ws–WÐÒ=+±(y„óä›üš/"¬*HßÔ}u¶ëñ…T?¨“ç(› ¿©•ŠS|{Õµ†0‘³®£ªfÃÍ)or$—Œæ|èÒrFÑ=Äp…¥=ö! ÎìþÐ'ysçÊÂ5sHíùÓAÆ2m'³ û¶FU&¬Ú»Æñb°Ï3&Oè÷ù"ïæ=,.¾Ù=,À%º ðD?ø9ø‘.ŠJ,WŠ€(´ÉQéÑè*ÉÙ±QË‚c]þlÞ.ô÷ÜSŽÌ7·¹N¬JJÂz£ºKH[”©ØGEB Xå&ÛD•0>¥$J´ÇûQ ¹6;ãU´NŠÒžMŒhMHe®¸*°8·<9lI†jxBÇ`Ê—‰E‹Èþþ|»ûéÿŠO¤ endstream endobj 75 0 obj <> stream xÚíXKo7¾÷W,zÚ-$–Ïán‹’ ZÄi +'+dK„&’k)†[ôÇwÈîR6-Å©o c©åp8óÍ듪?+UIüS•ו÷²ºøT=ŸTß¿R]¥¤èdWM.+ëDkª18á]5™ŸÕS£üÔ8hŒÂµµ¸ÆÏ Ã;ülhmÃgKÿV6cã»zs1•Æ®#ëíûËíõlÕ¼›ü.tU+:€pŸ¬ÆZ ˆWݬ—ófì´Å£—ËšÖ§/^ýüfv\ýÝårD«ùúóùÇ­oÏÞM›Y}›¹£@tèŽê„Ó쎴l®£ÿ°öM¶P“s謆Ç8k]=HZÇ'Y·õiÝhràI†ßñéxÂ$K¢ëòrw;¶‚¢7á š¥P7 h™AŽ gðóÛ$¢s´¼ðŠ%~*éPJøŽÎ p[-oâöÍ`1F¸”PÖÁgëŠ÷´!ýØÔRX•pÀûS©Q²ÎPÀ'4Uß(á8úA2Æ5¬#Až¢ /ï9:š­–E‹-ˆݪ`1÷i[ðM¡´\~³ 69º%ä`;`46²‹»V~yž‚I: å¿&Œ)TªÕX•»¡J…$¶ UŸ„CGJ^ YZÓ® éHyÞêÞ)”UYòjF a—QԯĴ‰†¦šÎÌL8jgà¨aI6áè#éðldªºT£ÑU3Ü”e¤N™•[Û÷ IÒ®ÞRHÀç5®J¨;#öÕ¦6e`9jÜ60ÁZ¡Û;%{'ŽÚGçØ¸"™Zk„ÀÛv\…RêÛŸ"PœL»}iª¡µEøRÁé‚&9t{¦Þ\Öz¨º]ƒÅ§ÀÑÒcTº@ƒ°¾×¿:¤_$7ú\ô)9¢å|Œ@~y5s­jƒÖ톨ŸFTx…Ð;P è$}(—¹l÷ä2Iì™Y¥ŒUÙ¼¸-àÛ‰6KÙÞZªƒÞªT½®ßWCÍFŸûr ÆTzq§ýÉl*kwÀC”Pû§2ë°0Ú}lG¢NnN·¦ –ZhÈH3—ãÎ'¾ø®4#î÷^îŠÅ.U2º÷³÷›õÇ›Ei:"IHµúl:ØñYa´§oÖÛņdºî¼¬Ÿ“ÏáÕÛ«À=êù …‚µV™úÅÉKÒ… ÕdVã{´ú§oB?(:szu½\} ¯ËŽQ[;3y0ÑšgüÌ3™cÁ<@Ç@š:Æ÷Ÿ`/Ãþ«¦Õõìb»¾Æx…À„תþ-@‚ÞöAG ŠŽ-Ï—sQjËø}‡ÛØLó(©ˆã¼œT¿ó/«™¡œ endstream endobj 84 0 obj <> stream xÚ­W TSWºÎ1pÎV‘qdb™êÍq:3·sÛÞªÕ«¨mÇJë‹O|µ‚¨­È#@ yç?IÈ B€@*" R­RQ Ž Së£Ö¶¶¶×vlÇÞzmowœãZÞ03]wê]wÝ5kçìõ¯söÿØÿãûÿP‚˜EQãS^Zúrò²§W/\•:}ösI‘w3ÃÏ Â3F…g ÃÅð ø‹“c“ÿ²$öŸêØÏ#»ög‘]2žì‚§È6þìÁã5&aòoŸ=ɪ׳råF»·¹ýðÛg.\º…7KÞxcú´i3¦=$f>÷˜õoQbv”˜ó˜=<{F”˜%fE‰(×ì¤(eOв'MQ¥IQIQIQ3’¢’“¢çDωž3{Ú³3’ós dÅÙ…SRó³² ó¦¬ÊÏÝœ÷?^ÅÏ$  V n>ܤþD}=æO= Λ$øàIÁLÊ@)e¦€â( e¥lT5e§”“rQnª†ª¥üÿ`Tëªà½§ƒÔ‰«Âð™ðˆ6žyµëEµ’ŸÄ¿Â§ð‹ñãüËxë¥ñDû÷˜ür0f«Áb€r¨.3i4¼`Ö¯øxX :ÓO¯*¹ŸÂëݽ=ŸÞèÿ3àxx ü3²VêJ|€6«“ÅnÆf®Ö‰« g‰*'bIös±\Ÿ â“A Ož¾÷¢HÚÂìm1lcAkÖ€ÝçÐrZР¬ÏSÂI¡)ØSªd`}yVš¦Ô¤„R@ɸnvº[ÄXD_‚kš–é®¶Ö ‹pAl|¸^4Èï-l6+&œ8†¯Kh¿s^Ô»f ð2 ,¸vë;ÞϺòʾ%{æVÜ”†tm¨ÿ}ñ÷p~†g WeV¹ÙmV‹‹˜µÙ¦W€r­ZŠÚóN,­ô›¤çÍÂSç–%½.û“q߯­j« THËè_Z·p,EmY§dí»:Ýf§ÕWHcÖiY>IØ ÐÛLÈJ»¡±¯¦…øO˜þØm.xo,qÛ6žÜ›/’™¶ !›Y Zt¿ŠY–]±Y,Å‹ƒÌú¼¦>– ÷­iNkXóËC|Ìa>æëÝâ…Fì½è=…Ÿ:‰Ÿ~?å¸êmõÜý/³rMYâJ)– é…¶,88'ØQØÊ€Ãì'ên³î7ùÇiµ©4“ϼ’ßþD[§¶ÄÆ?ˆ™òÃ".toôpñÑÈ„zþß…šHÓ ‡Z’gÈåÿåå”ΓÚ:Yprއúìf'8PçëÞˆ>¹4H“ëJ"×ÕD®[ÀžÓJt•%FÄëèKU5„Pøs`12ðÿc¢I^9õm( }U5)öb_€ ¶·³0W7[9¯*£dÎzPÒ^Yƒêýµ¾J¿\¡V)2»Š»Ù“Ð|µöxã ø¼úäf ` 4ZÐmºÅ®–³ü‡Lv®Yò“îcHW-,NqÌ5àÛÇ…ÝÝ5L(dÚÊòû™õ…ÒÍ„õY³Ø|ê( Í\ yðŽÄšmþíuÛ»¦˜Ú5Õª±–»Í^¨?_»·ëÖ¡[û¿ª®µ×Xk9þûÄíJí" ÅWÆJ­Ý»íGHèŒ ,Jmù&ž^Ï 7ó ÿt8&±Üûã¤ÙÚ÷Ȥ)a ‹mGXœ„·òIÌSYÊ£RÄÇ["Ìù­töû½ÃWÀÝÃú=[…X^.âãT‹~SÐ„Ç~ˆcñ¨à8~¢˜ < 'i)N¸TóåGû½vŸÍ ×áÈïó9%WJ†‡4ë’Œ¢Üm%˜™h. “<&ú?ÞjØ|â¦÷™»7$&}Ì\ mÐÆ…À~“ê – K9â?bvVU¬|DX v® †ï*(äžAaW˜´O³§ÙÁÞψŒHšHß,0å‰+¤xyPI[ÛY¯ÙÞ_Ü¿ÄqãÿoþlzW‰£ÄZBZË«y²MæË‰¸Ž×‰ôÉYüèßJ[vú‹g3Pc®…ZÔáDÿWù óÄ?†IÈ›»ˆÃø;‘‹€’«• ¹_ÕÐà÷¶¼ÿü±Åü„d~Ü~ôõ'ðxvzç,V®š ¥•±8#ÁJP«dë6e­È«KkSºJ?÷е þ%>½y ô£FFá¬>a;qõ.~jl€¶tqo76Õ7µÛÚuÐA®¤”åéå¹F…QA¤¢2lðå3’ÜHj 2®>(î ‡`¿²š'MdžJfêÛiübù½8å‹ÒÍœ×kÞ­Ÿ<üäÁ'-ZÇ.¨eY¾¦´d}þ‚W‰\¥Så©·xÝЀêÕÞ’µZ±éHa·ø"´_nê?ŽNâ ½øçþž†¡3@c²šiöÊå,¨ô*ºhEÑŠâòõ‰úJ}¥±™imHÕº«µø¢þâwT‰—Ánä­©ë)ë¿ÞKRàÞ݈×qÅ \I|ß™¢HÎÁnƒm‡™¯J,ëL¯—Q~ì^HÖ¨ye»áH½¯‹ã—&æÊ dL –3–}$A–ú²”t“û1¦±Ssq Çn‡%J‰&òïkD5Ìg‡ðϾ‚žlÇÄW1¯mÜ”.N†×¯” ý&ŸÉÂõf‘~n/˜ (;mÿ‹«ç›=‡}s”ObI¯N ¿Îÿ[á\ez¡OçYHš}Þ#›ý0Œ0^adežXKFHdÃ6S6 ¢’ê}‘ÂksÖ Œ8‘ü÷™‡ˆêxãÚ¾„;?­Þœµ]ïp^E.ÞÜÑ!iÈjÜÌeš‰'Òñf1™„nÑç³R–®Ì\ÆÎ§e°»ÅÇôH]Ç$Üj ´ç? ™7 Ö+| ¦@V}Š…:®êQÑéªø+pE±Dø6ˆH¿ÿmæˆôÁA\ø¶Ü¼@”öâKü¸—õ¤:æø*™J%ça¡Æßä®mÞ×ÔÞ¼¯±5Ñî²:ê½ËO¢‰S#ø’-×oî«ÉK™$žÕ<ÃÂü/óΞìÉ@f–JýWë­wûë?aOÓM¹‚Wù jq®¥¾æÓŒxŒ°æ÷q£qc¸¸±ßŽé+ž>—–H$Ûüâ¿-õ“ endstream endobj 86 0 obj <> stream xÚuT{PSg¿—„Ü+‚b¦qGïµíhkµ,*-øØ]ªPWA•ZÞTÌBxåE’s!! O!!Hð"U°#¾ŠNÝ"ÚÇV:;uÝmǭݾ¦kç»ôcƽ±ðOg:ßÌ™ß|s¾ïœß9¿sHB,&H’œÿfòæ{W¤nNÙ¶juttð.†_Fð/…ð/‹øçÄxþtQ(÷K|èb‚ WÌÚ°¹‚%¾Ÿ´¯fÖîHbI†I-ŠÝ˜œ²?·@ Yù®ŠŽ^; ÖDÏ€ÕÓàõ×f@Ü4ˆ™k§AÜÌ«¸™Wq3>q±ÑQkÔÊ¢’â¼#K¶©s󎨖¤¨•Yªß\ GDÑ!1Ä5bŒ'__ß‘??? æó‰HBJÈÈ:ÒLZH+ $GÖ“ ¤´“Äü‚$Bˆ×ˆr.ÙJ> q‰REÿëņ¦‡Þ•ì”ü›J Cç<%ç~Ûà-ý¯¦K)½†|++­Óƒ#ôao±ßïóô2Ò.‰ï0#½f‹Õ ´ðäqé%gòN9x¹îK'PÅd” §³âZXAãŽxJdZ$(¥³iá;Z:Œ©ÐÛ8ž‘N˜ ÎjK¦–ˬNpnÇöÛ ƒö!ß™®SýÞs@£E:œó*»‰‚MuŠö+ÈWfm”àð&'ŠÑ=šÎƒëœ¯!‘êžèÿ½LE ÀcÈMOy©Ü\c.SZ® hº ª¡Âªz¯Ê~‘å?¦-®Z¦ªËª ™ªt]ú 3îcþv€DüѼGæ¹}ùê= ¿z/v Kã×þ5!a¼´¸ôhéÑâÃr£^_U`âJ4OHühCh‰DŸÑ°?Ô ²¨–ë$W¯Ž\¹~ù£¿}sžÐ(ò•O0±|Íúe ¨›JÏéÓ¾|•nµÝF0Xf &Àؽ7.:6ÈÐñ•’lµ%‰Q¡¶ jk Ð…Eöóì7?^âó)—ɦgJ!/¾¸ ‹7aQ"WiäF]jÀÈÁD÷dÈć‡N…Ssž†|ñùëB˜ÌŸ®!OöÉTh_€*Êi;ÃBKc‹­µÑ펫Çv®SèˆVÒ \Mƒ®k‡ÜYì<ê,n0Øt §Uû­EBNbªйªÖêV“ÇÔ‘ˆÒÞD»“Pš©Óì+…j0,5úù6¼= oOÆÛµoi²ÿ,ü» UÊ"? ó‹Œ L† `»ù㟉†&7ÊT§©Ó}uù,¬F0ÒS:jënC–²0@½µÏ5Îrü{¹³¼±|áM¼ü~y/Ƴä¶*›¦ÝLs’v°ùlÍè >[ÞÚßÚßÖßrZÞàhpÔ;¹©Q9è¹ <…IÁUåjƒ‚é¢ ¶\#4Ò|u¾¯±ik3ÐC•›5™8{j Ô"ÁÙü€æbyƒ0P!“9 ßäŸUyýk>ÿ?‚ôŸN¦Éðú ü~p6c‘ïE ´ÉP2JfmÁR´ïg¤ÃB—ž‡b*\ÖA ó ^³Æiéĉ¶>×Iø >Ú1¸îDª+¶–½ƒ·âU¹UæJK%`6¡åZ4Ûâ¶z,îi!ÕviüROäÅOPÖØ}¯ôò^,ëò =ziç.6Z†Õx1[K¹¶<8| ®ÂØ©öBá¤Ú†Œ3áœ>k{—þ´d¥2e2\ìa ™k†f±”€Zô8æÚÚ­ëòþ¤rWtww¸}=eÇ2(Ke+)éåÄ[óÒû®0ðå?†´´Õ·YÛ‚.xóðQò§1Ñ >AVæ¥zýu™,¾BåUèw0TãQSùJÛ0‹nQà±µö4Ðc’q¸n´ã…´WRƒVëÎ~¾æ”}çw¾Rz4”Zm;ÇÖ»\N»cðª|htøý‹7‡ÝÅá.¹¢¶*yÚQUd»À¢+Ô`§ã&ãÆÊ27è5ç²No2äì‘¿r 5s§Qo0˜tVÔ%?él»Ë¸©ß$“3ö»É”c ²à䜂ÆÐóBµž§„IÕ zÌTZ3~?‘¾ælGàArµŒ? ì¶ÎËG{í A{å|ŠlIí«Q€¥ÂÊý'!9 ü3šT8Eà…‚èêÑÕ ¢›‡ƒ;9xî9MœT×átÛ:aΕ÷(û³m©°R­[ó2Ž(òåAd~¦ÿ»¥ š­Mô¯ÄqZýÑïô’ÿCí¢^>^¦ê¤úzÍYìTfž tžÒRÈTª2P"Q¶e9´¥'ëFÉ%Xˆ"!…!q,áv(*È¡Ç)te¦¤£“ ´†Šºr 3Þ¸t…Eë)hµ¶@+ýþÝ‘[?öcùfFX¤F«qf“úøç<$zgLÔ/ô¡¯ õJêÏÕtù=ÞS¶^ OJ|ŽªRpĨ)4›…E´ñ¤² í—X4Jy­>æ¤äœ)³ãðgº[Ô¸÷ñ¯­n6¹™……ÿ`·Âw¨[Ñ\ÙTÞZM[©šZ]emuVš> stream xÚcd`aa`ddäð ps Òvö Ž´ Øæþó—aYøs>놲Œ?ä˜~È3ÿg‘{èÅòŸ‡I–‘AH2üæ‘_@¤:Hø®+ÐD‘ƶ©‰Å%©E™ÅÙ¹‰%ÆzFÎù•E™é% Éš †––æ: F– ޹@¥É‰y ¾@Å©@@NŽBp~rfjI¥‚†MFII•¾~yy¹^bn±^~Qº¦ŽByfI†BPjqjQYjŠ‚[~^‰‚_bnªØ#z`Ò9?· èßü”Ô¢<  ™˜®]ÆØÎÀÌÈÈ¢yýGßÏsßËw2>ù)ÍüÓÿ{¹èì…Ý‹•vWËÿ¹ÈV]Ú]R²°{¶<ßåküšÏø½á(óÃï¢SZûº'tsÌž9c®|÷¼ÆþšI«Š§EÍÿÎy@brß¼)“û¦Nì›Ú=…czë¼\¹ß*š3¿kôÎé\’×-YÙ][ÓWËQÏ>ó·æoÉçM;ºÛº%«kë*å»+¦¶Ïj9—³¸aOùoÎ0‰æŽŠ¦æŽÆÖŽÆî&ŽÊ™u³å&w÷v/™ûý¶DÍoSÖò9M3fÌ™2_®{jûê®éík;6v¬ãà+^üÓ~Ûo¹éìr\ÌÓTÿópNâáêááÞɵ“{ç\ æýþPfÃQ endstream endobj 90 0 obj <> stream xÚuSkLWžaafx”*æ4ÑMê#m•b«€µŠÖZ0ŠÖÚªP±»¬Ôâ*ÏeqwY,ËîœÙe—Ç®àÂZQ ¯˜ Úˆ?š¦ÔDÓôá’ÚH¬iÒÔWz§ôŽ,mÍ$'_îýιç;ç’ˆŽ&H’œ“³uÓ†¾¾íÝì–¥¥¥)gË¥WiA”´P%%G˵òyÔ·ÿdÅÌ'âï¹J¼û¢oÎQâ"¨=IDVF@fÚ ˜¹ÊÌŒ€•i©oåËVUê˵›Œ:}ùm¶ñsv½©R@§×=sI$=FÜ"ˆ)|ÐD:IÉ“@ ¤›ô±QID<¹$*1ê¡Ê¨ú5ÚS8¥Ò¯*FÑ¢Q©¨†¾¤ÞÜ£tYtpÐÙ;vt 5”Òìã}`PÇ!´¶£ÔkóÙš­ÌÒÝè·Ñ”\Þ¦–†ž”wPÞZ´yÚTÒÖóUΊÓ:yóJ9?[Þb=ä­Ó5U:+ W³¢íjD¡~DÉý1‰SQ©“K¢ô’˜4€b‘ŸRh7{eKo¨{|§„`¾¾b\ÌUЙ°Ôž[R\eÐÁ.æU4Ç|Cs~ê }ã±8­-–.ÃUþ0(önG»·›cïÁȪ’Ƴ *§Q¼öÂRÍ!ê=­#}ß—e#ÜYoè @èH§¥ƒAùr®:•Þ°cOÞž{¯hà—‡}×[ÂQ¸Ü¡õÒ%!,ÅŠIƒ(w§t˜wCÑìä T 6Ð~~`ØBN3'ߦëLÎ ;YõÂ` 4;޼"Õõ|=0&³»ƒöÁ³Ç/ŽŒ_÷µµ´zÛ¹/¥®v6¯çá$Ú6ÞLµÙä Yh†f]£ÁÃ+èX·'¤ñƒŸoF”½º üJ'ÝAWöÏô‡« ó‹ò ó¾8â°ó¨/åXNa¯Í$Ñ3 ÑöA´ø?"#}@<­ôwâi©ˆ'ZïŠXû´Xö>Qcötp(í•siKÍ Ûaß«Ÿf?Q‰¯ÿ_(æÎ¶IX/Õéç>ÑtÖq²ZÞ‹Ôô4û¡°[#"×LÌuœ—’ÃäJF­(Y…ŽK;ÕÛ>m*>¸±¸4 ÖÀŽà6QweÛÏÕ?b£Æ£ùß¡t´DNœµœü‚Ü¥ÆÝŒ¸ÇNœ†@Ñz¢|Ð[¡)£¡Èõq_¥Qo)è:«ú*ú…á¦3Š…´›/ gÐa”c“ÂÈÃ?7ÌN ã‘Ú䜘Qнì½ß?ÆO|'OÒu6—MÓHUB_©Xa\¤10n¤l6÷1MÒŸ7 ñSìÄ58oòÊ Ì(eC91Ó+•µÕ(]”‘¼ßÛ‹(Õô •‘µz<¯Û´¹ÖiÒÔƒí±á¤ô¸À÷•ŸÛ/x q½Z´Ó Þ /WÕâÝ ›ÏµÞSu'i°8\6#gQV·Ã AÝ¢ƒ]žnœ˜uÞ'–vADy½(#œ4Ž÷R„™@ëY ë z¿a‰òUò” XE+­4Êû†ÀÉžŽàépÿP¯èõy|øå!ùMªVQcäis=Bü3Þ’žc­G³Ré×äÕ™Xƒ˜}cZqZm‚¾˜÷W»'8òö_níõ†^`F¨@›ËÌ%ÚýÒ–6T$ô(y—ÖÄ©üY ±- qBBüŸq_Åk2ß^0•ü/† ëG endstream endobj 92 0 obj <> stream xÚÝYy|SÕ¶>§¥Ù‡"åªçà€Š80*  Œ 2 ÈÐè”–´I:·iæ¬4S‡t¢M:¤mèÄÔ–yP¡ŠÜª(¨8]qbpïúöiîÕ«÷^ÿy÷½÷K~éþ%笽ö·ÖúÖ·NiªW/ЦéA/. ]ù겑¯Ì\<ô¨Q£„ïÆùž§|S|S}Czñ‹øwïjùiJÐÐtðùð@òI7ˆ|R’Ç®SP4Õ‡S÷Sé§©‰Ô Ôj1µŠŠ â(•E(;UBUQ Ônê u’:O½G}B}Mݤþ‹ÑéúAú ú)z:½hýƨ(âÌèÉ=‹±cý‹ñ=‹qczüßL˜à_Lô/&ù~;GùþÛ'ú-Oç_ø Nôœè78Ñop¢ßà$¿ÁI£ý ¿åI~Ë“ü–'ù-Oò[žä·<Éoy’ßòd¿ÁÉ~;“ýv&ûoŸ]@ÒNºˆ.¦KèRºŒÞJ—Ó´‹vÓ•t]M×к–š)dW•@½G2ä9ZJ˜ðM`c¯)½Þ ʽ"jG³Ñ%¦°wïÞ÷žÕû/}6õ¹Ù7ºï•~Ï÷Sôéz ° øq`û !ƒ¬ƒnÞ³+xJðqÉà)ƒ?“($ûïÝ|ïGC®…ýÓÐÿ”zsßÞûÇÝßøÀ=leÿÄfsOp?;ùàüÏ=¤x=÷Ƚ4 ø™ÖœžÇ'+~JSº”ÁߟǷs$ºeV?¸’Ÿ üàçœà—âÇø>6ƒ]gÆn±[9(Lpe=‚ÆàI€GžÜ€çàAxÝ^à€€§‚ð]ˆçñâA:‹Î¦[ Ivå§)ð!eðǸ·ÂEÎ5«\’«3kA ³b­]e4õ``ô6­-Ïö"wÕ®¢½°—iÏ<±œ_‰“'ÅEÕ${¸(µå1ð‚t!6JÂpù Ô½ƒ[qS€M|¹%‘”I cdR¯§ÖåeÅ®em +>LŽg2tþÆ•“æúÛƒÈá.~æûN‹ZaŸm‡‹¹SŽ""µl*¤š3€‰ÅïyY›Ò€ ßlßÎù. |ƒ#›Í€ÔälõZéRõŠ»ß÷ÞF¸‰×~xÕç•Tl9ø0_í?…ƒgæO[häSÓ‡É bv×Wºê=ÊšXV:“Îï‚¢Ö‹ÃdÕÁ»qàÄïñs_N».Þ…i_§¤qï‘’#Àœð,\ÉA¨bòle’6ÌÉŒ™5S0NQ!8ÍN`ÄoSóô .™æÅK`vô ,&+0Û*«½Ô&WÆ[­(<%>ö!´âSLÝz#¾|þí1¥Œø­ 5çÞ€O˜OGzjêã럌©Jöx*+ê½òŠXvÀϯ`®W)ð7.¼ÓkVcî#|üÚôïÅ­Í·_ ±(‚"Á‘æ:]8wÇ‹"£µQl&d™³…€œCb¹ *L.`~Ä!ð°¯ù ·Ÿår‘¸ébÞç§à ã@jŒxɾÇÈYv+AiJæAþ ž%ºvøÅIcæÍÎ¥Aš™ÄtªH‘j¯áð±^8A}±ÍË`±è8´)jÃq«#Ŧ ÆNY8²![ð€øÿvßã ïí§¼ôÑë¾oS’¬‚좬‚õËÊ—Ã/áÇð“ùUüü$? ¿Êáû÷º^„Y³ ¬`c Ž6lz¥âÑÑ“y^‚9 «/~+õ*\sŽ·½oìúà㓟—ø>E/Ê„tS&0ÑRû?‡ ¤¼ÄYPZRZZZâ,,.,(bÌ¢ÙÖÄÒÄÖyí¡»ç8TùYæLÆ„’â5Élv,.ðŠäÊ‚”üÌ­Y¥ëO…„}ºè“Ÿ˜,RmŒAÞ¶*!‚ƒû¶&Éõò›cE[=ê-¤¤¤efgg‡èôzN?jì¨ñÏŒcðÛ¨½É|’ÍóŠHV$t^'g ¬ÿ7ÏäÛJè¨P £g3y†Gr©Z R`^)sÓmàa|;ÑÎf[[¦|`ê„Mà5·'Õ˜”Á$Ú믋Û}èö2ɘ̤a//x)æx†á_Àù0¼¯À÷ãY8”w’^qžË¯aÅí=ÆGÝ )C€Q‚ÑFÜY[âÍßF â…;žó,É› ‹€‰%¥õôŠ }º1øá0HÇý[¡Ì¸U(…ºð]¤vÔàÓõ±y†ÿJ‚½ir5yl ÖæÙóÖÁóo:†χt³Êmow5¡ÖjýîNâÙ/ù{ð³,‚(½e©BÌ ¾ŒÎŸ´µ’ÂVÅ¢¶º—8þ ôØ~0?Œ‹Ž(Ïf·˜¶Ãv…€Ô+(;›¬ÍlƒP]z!×ýS˜›¾q6ðÆmµä¯éx¤{âOa—Ýè?ß:è&?Ë/ÿ5l¢ü)u÷@•[Þ‚£]Άßã ¦-B›Þ¿t)aÖüiÓ —/'ÕÀû†H¶iÏ$”'{êKݵ¬©.L¨ZD*cÀÈaü >èS^„%Üx«ÙÓ‘k·åuèl’ 9‘šÌĈ ‰¯™†Aôº÷'·Ãå¸(`òD-°#»NÖ“Š*·ïI7¶+é†Ë¸ì\ ~]ˆi)jòèq&~câÎÅ®50”8âA¾ÿ°ù>8„;{«v2s~¼0È›Šbã,{9ßmÄ_¹c–” x7ÿâù=ÎJG%0û;ÂC9È$Ô˜ÉðÏ"ÈÔ‘,ݱNº¦Ãš³ÙçÅPb,þq.ü¢›®½ˆ{át Þ%*´9 oÍý‚ïÅËÓ|_"žNþ4¼RåÑVcuÂéVO§ÙBz©…qè»ÐFk³ekWI—ÃFˆq%xÂ÷Þ‚ãŒÙ%éÜõõ‡¬MôMŽéá‚…=˜½¾.pÀYÙ¸M€ µÔèWqwˆИ5DêF&èãÙÄX¬ðnÅ'Z[8<½ÓòÅ·§í3×±¼EI ±lŠð»L”°ÅÚÈáx ¦†ôúĶ•Ek[ÍH~Å„¿éÎ[²ëãxp—Pýó³ÏН¶øfHbËQ]~ Ç×£Í)Ú…l,Žñ*Ñ–DË6Î×-ÆJ‰¸“Z9$0ÒêÄZOÛ['«ŠgÅ_ˆÀîV³]¶o$Ç <Û]¢¿{–Dâ«4Ѻƒ»M‘r |ñÁi]Xã€Óó:p¸ð_Û&øU‚ê «9¾mˆ7­eµÝ8ˆ/ù‘¸°óó¯O;æ¬aù´)Îͦÿ©ßþ]!ŠK°4qX ÅØØ¸¥a]~8Ì…e‘ ‹’ß~­z&̃áŠù„hM?ý]´z<ÜÐ!þòŸ¹×ùÕ˜VŸÔ¶Â¹@èzåBFüe×–]Rí{¦’´´Ú˸ö²¸gù–HøàÌgžaø «|Šû}ÿ zYßјᇒV¦'­LO v _(iCâÎ?Wa"ÛÙK°gVþ´\9(@s5ÏÎۨ̔k“H=¬x=û=c‹z2“_êÅOº}#ªé›¸øJ §;Eêë ¤e%¢M[ôR6I8I¢(.ÑÚÌ™ñ‹•Ž)[a(ôí-Ü÷{ú&ß›[«7m`ÞB¸Œ×KtÓ#•Côú:ˆ¨JlVj  ˜ÁÏ.3‘žÈ>wàÄ÷Mü—XÐÖ¤rJï˜Ó…;}ól·ÿ¸Î+Ê‚ S01 6úPt¥K¾aIY‚ÕD„NºVMd6$•¤Uꙺò­Õ;#Ý›¸0X¶LµÔô£P¦•} ÍJ¢a?N©JÜ/¾€_"`oÔGh¤²DEFÄÑÞkÀ?Á,X¿„+Žd|lÌ7å“Õz­†ãÇ ³Îb°™˜\Q)”¶8‰xåGæÒ”i·mÀ|ô~ÛœYudNÙü²áqûgKÚöŸKŸcVXó X°™ˆ>g®“ÀÙ yj6 T2" L"5¤eYÉ-)v¥…ô~q§–Z럣I²HÜr/ž¯ ¾Ñ!«Æ÷U‰/â¾;’™Rþžá¬‰ßÿ˜/Atnt©Ô¾7µ ˜K¿8ŵȤU‘ƬUM [œs¾ÅUø!$ÞëåÂóQwJdWù†4Û‰– èJÿήô/FµPg´Çí¢‚l†_… Ú»UêY÷zÖ^ Í«¢ºÅQà(°8ÍcCðpÂÚé(:ÎÒΑdþ+âÏwÞ éôbääI¯H‹o‘Æo¢nj6WûÄnú0Ù-›T-ÊmÊÝ宭ڶײ“—@ÑS|ÿÑüàgø:­6‡PŒÊa(`ñ¢2¼ˆHÍ,Ý䑪$£’€'ºðݻ߽û­»®u”1ùj‹úÿÁø‹¡ðïÎ Y¤9’ÌÝkÛÁù*…QÈv¦¾ÜÚÈb¨ÜXj)sg' ÒG²±Â-¢_ÜâE;¶ÙY²©/úß7öŠØ³ÍÜèû¹kòÀí»g76M^]w§Vx ÄlŠÖŰ!@õÓîFQ–0ZEEÛš9°›||Åh{C×±]Çæ÷ýÊšŽ´:-“¦‹fùQJn €—ñmG;­ÛY¯p‹èÞ"ú¿!){:–ƒ2¸Î“ð‘дnÃHìD›U]:¾çX.”í.h)uîgìÈ¡·h½)²Ótc¥<­™½hæÂTöñL2)I›R2‘(oØ•‡ñ`RêÌ­¯ÈD6øÑ›|?n*LXó"éÎÇøH‹ûc ®ë!™Û¨ÀÊ <ÁL:Üâ÷~(Þ/ôy¥ ƒÖsü>´.Á¸‚•“-N-…2S)0oçýSŸzºyƒï÷_-†ÓÌe¾ÿÖì8~ä†H¼÷ÌŽ×^™¿|Ã|n–(ÑbpB=ƒg÷Â÷ ¨°UX˜7DâýŽÈÍxTµ‰Ks*ô(P³Ûw¯›¾ÞXý›^ÝqhcœµÃG‘ËQRÉž…Ã:;ÿ'¦Z”Ç÷h~˜‚I°„WUá1/ã‰x€`Ñ…ê<úN‹`¸šdRXœL®‰„T>4¤ZdmÍ=å­«÷´Áv‚s¬h?œÐ–ÌÍ˵Äó©84(I-µ¶rx/jõäd݈qçIbª!•åW‹HýXÀye¥ùÎ}ï8¿¶|…&'2[¥—½*ª,T%rü›¤Ð„!û?¦¹»tf:¾à³ÛXÐi8vhCqVqfiŽ.G£UoZ±"rÙÚÕr¹RŒ¯t£4¥½Œƒ¢‚bG~Ëá¶}Û“br%íM!zøq£Ë˜Nb”èV ¸ënî[eNkA^}UˆÝæ°ÚìäâíËÚVµ,säd$5E›ÂvÙ]‰õ÷$4%4&4mÚ¢ÍSçëòßlêüö`ÜüsrT¤·j!²TéµZ’§ˆ—KåÂ_‡´G°ÝÛÌ{Y7Ÿ(w£z!Ì 1 „‡ %í w-ݫΠÑä©JÀ ùV{‘•q£»1ØìÂ3‰¬½ðþË—Äßã ¬–ì.þ¬œ$öuþñüWØhˆÓÇej ­†h)Q6${%ª 9ް–ôÌ Ôæœ|#Q=%[i-¬>r¼è0‡:sÂBc–qËEAÍ™UG(S$þò4œOÉ›ÀLœ! eÃ`ViÚ[ÚÂüJ%¨LFaJxâÛ„ÎqpÕ-.NÞ¶Àé—zJGü^•(Ü)HkiáÌùù›cÇþC§öž;z’á(*C5¯ë’$Ÿ`ÝÅá}¨µÆrˆ ¦oEu^ÃFΔ“£Ñi"^ YºzÖ’… v¢Æâ‚Ó¬ým ј ¾Þ±î;<²Cü—ÿaG0uE§a˜Ÿ$¾Xá,r溙mI®©B–0ã»ôì ¸Ta=ÍØP]¢kKœR&c‰ðM­PÿÃgk~Óï¿OáÊ=ÕÕ©%iδ†õo͆&#=GÑ“¶fYÝæv¾~&DgÏÉ8+K î‚“nä­Õoà`šarú ªU™ÓÈJNƒl{–ƒ1£ªÜò¨f*SÊe‰©©R"×6Gµ±ç¡ê£¥m— “©@à2»j,Ì_DÕÙ2މ“×+ô‹3‚7%Ù”Ù ßHâ U‹ùSâöúngFr|) JYKnu£ðÈ’SdÚoÉtdÚ3‡îáƒÈû H¼´¨mÙ@Ê¿Ðl-²æ×¿ÒòÙö«;®Ú‹ÅÖb3ÿuHx´)‚ÕŠÄír,ýÇŒ¸ÉAŸ©MU%©ä9I/ð/‡d%äÄglY‡é•˜z ÓšS‰ î¯sáñÿªF‘t‹u'yæ<¢h0‹#xVÐ@jRzkc`õï%'i!µ„[ø>|gº°úªÿ'ør Õä9kÙRQ ´ä±T]¡‹âø“h³R³èwáÓ0üŸ|d×%š\¾!DYDw6ßÇÌ-–Õåîm¶Z`ÊEU[›8þ zm£v#KæAKËq«evkéÈ({;‡"”ífËE§ IiãûþMà ô ã×¹}Ÿºér!šÅè8X6ÕÍ­›]3«vvÔ‹Ú‘MÚ¡Éd“F¡Ræ(•¯Jg͇tPÚ³œå–ŠB¨…Êôb…‰NO‘-ß'mã.BÓ…š“ÇðàøÞ£XRÖZy ‹¤ÆË‘§B!ã@eÌÑçH§Ç½3Ã@D€1‡4:Me¶+ÇpFzfËYCž>ò §Z« ºº§0uÝM á^ãGXu«.âzaÆ(CýÎįV4¬/‰„¡|ÿòýøþß>„ƒ¹P¿µ¦žáð×]xœið0#QH"™µånu>€jâêS„Qwà×ñ@4 ñƒ¹HXŸ®ˆ6á#!XuG#Ñ<·vØ“ÀlXÙJ4 ¼¶ƒµÀüÐÊOãzòçγ¤}ØŠýÀ›ì›КåáìS°öV·L7üÝU& _ˆÊˆð-Ñ”«Š•E©®W¼+¡ñµ«>O-˜T« ú•‹ñ 1žåFÊìòR\%eE¥E¥Î’¢Ò¼‚ü|{¡[V_±¥RB:…² •~¹c½;-ÔÙ¶MíQä•ã 1æ-& Øv‹uÛŽÖ£{Nu ¡š)GåFg:¤@\”4Mž£ÊkA»Á¢ô„$Õmn&q)s”˜™»U{W w±ƒ „› Þ#£r±¹Á‘œÒЪzý$)ÐF”R¿…Ý"Їxs<0i¢xµSÝýù.%?ï"“¾~^xÂÛåA9ih†õÜ\É\êÚ¸/c§‘)íƒcæ]U !}’Ð0ëcL¿KÆU¨¶F ãþhËš•+³ö·°d~+'ivÍ–Ò‹]_õÙßp¸Ñ— ïßîý¾[èœÐ•uëþØßG ÕzH?æ!™&3MEÃfc40IJ[#‡O¢¦ Çñ?pa󃻽‹xqùÒï8‰½¨ÃúÅ.xŸ¹8vßK,?÷5—9Þ”Qܽ$8Dý’Ë÷  J­Àérw2ŠM°´ ÐípÙ‘ëQíªèø‘¡œÁê×ÂשÓé„A˜e"…ÉUÊù'Ä¿wè»3å_ï"ü[KUѳÎ|£ãFWÿTâéØ,!=¶ÛV”ÿ²‹ß@âf¾×þüîéÏIÃí;#þ>–LÔÆ)6j F50_.úÃsÀ†w¯¸ðt7}þ#w6'a©$beÄ’µk“’¤ò(¡žW»UdN2sPXZQà¬ô’W}EMHzÅÀ¼Éý2±ÿ1±#Ñ8~„zä´›Ñ8<¼L2E4ªý ΚŵùõPÌ~Q=Èb¹ ·oúV,5Õˆø¥€Ø>…Óúõvôëcî×÷»>ú²cŸþóàÿwJî© endstream endobj 94 0 obj <> stream xÚ­V tSõÏmÚ{ÿ<ÄÑ­L½—•¹édP¡<œ (Ï ˆª¥E öEŸ¡ïô™¤ÉmßͳIÓ$MCÓš´À)µò¨EÀ9dn(ŠÂ|0CØÜ&Åâ?Ûe‡Ý@Ãqnç ·œüÏwnòý¿ß÷øý¾KˆbcEA|gó³O®}.ý¡+ŸL899)ò,9ü°(<7&þËK_mË+(x8)iî#ãÆ¼¤¨1oÜX0?j,ˆ £Æ¢qcaÔkaÔkarÔˆz-Œz-¼í º(ê¾hnÔˆÞ³(zÏ¢(ŒEQ÷EQ÷G&Íž·LV²£ª2·|Æ:YNnyéŒ'eÅ93VÈ+sKsrs¾ñ£P¡‰oo‹Î‹/Š.Œ½"þЏ!”,^$!´„ŽÐŽ0&ÂLX+a#Z ;á Ú'ÑN¸7á!:DÓcD„(F´Rt„xœ8¯_ˆ]ûó¸:ò òoÔ^Ô2!y¾‰‹'Mš=éìdÃ]Iw}9åFÌýç<Ü`øz k1!þ4|QšM ëæƒnt}_vxê Oø} Ìœ ¬ÈÕÒÚ@Ë¡¦²Z•V¾ž}Ðø8. ƒÄ1<oÂSĘ ¿& ìöt~äÉÅŒ‚bºôñuk6¥nؘ¾^­Ö·€U‡“¨Î‹Ë%Ù¹gs BW€øÇÈ#:6ôÇa á~Úë3çðTÚŒmÁŠþî`ÿ€¬;žrC¼åèdå@.Þį _Œâ,Ù·cÛñT‰oüë2i6Ž¡$^˜©OTÍdŸÒ¬–¯mÈ(_»ª@n«s£¡ž¾=Œäù½¥½ù92Ù¶U‡ÒÎҟžÓ'}ï´¾g}IµGaaûõ«‰ÙøÂ`bøêØ 9åF¬d¢‰‹„%ðýCá˘Fâ]?GÕfë èâllÌ% Œ^† ¿o–;«íòéŸð«Ïò)òOÙL5~Ø fŸÍs¯û¯û?Ýêux-^îúÕ!Ô™[¡ø²X Û¨¬HXÍ'­äç¬âçhêÕõlÒ“l§Ê«ö¦àÙ+ñ,áTv'°.ÖÖéK¤:ãg}9‡§Š÷ÜBx;|îëIQ·zÙÂ9Ýûñ¬âPüžk+q,N{}@òžž-íµ¬½€Ž)Kd (~ŸZÆOKÆDÕ¯˜cp:à}qäs/|-ô}"7•ªÓ”WW±7s¨Ë+Nòß§%—Öð„rþö@Mo¨ÇßÇ@w“[îBB—KgQk6g¬¡%ŸoÛÒ;ÂÀ(–øÎØÆG¬ew˜ b¶†íÇa$þ ,’•_Ÿ¹Ðu©?–ønd£ôv­EEÛP¤I¬æ,©?xáÃ`6ZKµñ?ÁÔ:<PIïá9 œÚñî†W²votm‚å0«"/â—IPp˜ûž¿¿¿­NÃpfëc WrTAA†>µ$·¢$¯1r!Ç]*ë‡!í¾(‚øùžˆÃË®ÍÇ1’±¾ð©Œ²ƒ“käóêêþ U_«“Ó PpÍ€Šñ~êm|— S¢ù[lHÞ×qªÞB—ù©í+èù|t””Œemb HYV]]^]l(´‘T)ÁÍàí±˜¦<­f'ý) ¿R•–’R¿‘™.å‚áïˆ/ÆÄÁÿ âj ZHµJ¥ÑŬ7ƒ áKT‡“sÐÉ  †¡rsš1 JühܔĨ„õ-»qz/é#‚˜ÄMŸ‰ñq•¿I¶›mN,zö*?‹IƒM [ 7mÛ±V"~&&æbšþÎ…Bsf£ ÌÈÞlQ êÒR¦n,{1½*žƒôîòaù€a? ¡@,ì· öî ìöôúÌÿÐRF~ù¿ Á³xQ(zíA¡äWð)lîë<瀓è*ÿ}9]ùúâ&žmÑÚÔƒÜ_¨YÛ¬f …Ó‚-¥Föá%‡ë¥WŽ8í:òžbÕ²ÇiL!ÙÌêš“é'%—ý–}ˆa)õ£O7¤ÂÓð¸­é jטT4K*tlóƒX\óó;Àb[ÿyK›ÉÉ9áÄÖþto“¥ÑÒÄEFåE\í μv'ÍчdTM ×Ê€#ô²Ç¿ûpÿký‡^gG›×Òjµ™íÿjÂ7](4”€jêLž[Ý4#|–“Á"X>ÓNº Ú ­€vñzY€ê„NƒIô¨5¬–Ý4oÝ‚´¹-jV£m6à‘¯Ïä»í@ÝNã»»ˆ/®ÜIlˆR‚r‹ù’‹Á pÛ-«ËÑÞîn5k,¬…í*KèËîÏéË6i­,°¨©šèb\’S%ÐÔV·“ŸÓX[K«ÆŠ8ê7#'Ï_ˆä°TàÕªhز£º>='=7=áŸQ¾\ïáã#àãqþnAä$0}3'D†|ºZ&“‚dÜŠ%ÍEÂH²PƒÆè¶Û;À‹z+ºd¥UUEéC%#4ž­øË—ÆƃpÌBZVäiµxè1ÒãÔ×2ü(%‘7Öèjh¡œú[·'ú“®q¡ðwĵ¡ð´?ˆ÷ÞDë/x‡NÎð¨ú2ZUŒŸ 5“²BcáðyGag¡«púE~«£ÒQ娜nQZ.2’=àyÓÝ|;øNä›`uµºÌ.Žÿ{BCíM¤M·6~«AšCÉÀРiÈš“÷“¬Ù:µV­k8§³k…OÅÑ„Â3Eg¶¿¯qÜ2¸Í…[²¡Ã–±;£ƒIq{”ðZ¼…_Kýæ_¨¥ƒsêòFjy¿ßGu~sr¢«ˆ J綇3¤üä¦ÄàçÀêžÕǶÜ~¼ñ aÏÜ…§œÄÉ «{#o(ãçK}˄כ»yï¿b„ZñiƒøPøžÝñ}xYâ6c*²dÖK³{(ÉŸºüúBæºWx´"ëWàÍäžÒÁšWáø°çà/{_n„ãV`’ŸEo„ ùÖt„£Â±<'e—•'΄,ØÚS¾O+Œ°0ÄXMYúN ŒúÊÇO[Í ‹¢Ê+à öbJŒùp’´^¡j„j$ó•öÓVr·7ð{~—ÇèÉ ðLãóyÏmݱ V!žMÂ÷Ò§àt0tÒd³: ÙÕF ­!å`lÐ(ª2_¨ÈôÀóã¸xžÊô@Ö¯”¥^äúp ^,¼ ôõãÄ1ÉÙa^”üâ¸Rrà¸õÿÐ=¤ÃØÒ!]½B¯d¹ª •‘™8¢›lA«Fƒ/FÇÁn¶ØénaÇíÑt–!ÉYŸÌ¸d7×ÜbaÍÅ,/üŒÏ …?ÙEì¼*¨ŸrA»¡•u)=í²C3‡ï?0Ó¨5 ëõeêúªÍ%ϬmAZR *“Òäi÷Ø!€BU;óéb¶±ÊPêë²Côïaÿ'¡wNà{Žã{…Óæ¶úÚžv?ç‹Ìå|Õ½ZS]D–ª¶«*KSd«‹Öž*9]xªâp‚Þirú¹Nº}9>%3ªñ‚›bqÇ”úƒ‡sÃQ8¡ê|Ê.3K…ìëqZ-ÔA-7½…T©L®;àÑ?…¥@¡Ó)ôˆ”T°ñŸÿ•U·4`~gþ3àˆº ŒÜQ·d *¡º]Þ›uR5, <Ô~¨ ñ«þO¤ßÙ)È=ÿ=ªäÁºÍYê‘Ýôç”'òWÇ×P.ÿ<ƒ á]ø‰ñ+þWĸWHey¥ù¥ù…ÛÊŠ*Ôùõ¡F*"Ÿ:+2Ràôû]A¯?èíN°XMVáÆ>~ Ù$¿ ]q :û­ ×R)°ž.-j(/|ôø—Gi<»KšBnxÂü[ú,¡m/YÜK€^'ÛŒ¬Š™¢t†Ÿ±ãÌ'ÉgZ)z¢¸mÉä ¶É¹É“¾˜82‰^P˜~cÚ?¬½†Œ endstream endobj 96 0 obj <> stream xÚÕWyxSÕ¶?§iÏÙÌØ-WÌ…‹ 2C®‚ …Ê<…ÒB[JJ:Ñ&“tHšfen“¦óLi›¶”!̃‚"2 N¨ˆ xEwôàóí‚¢÷}^üüç5ÍùV›¬µ×ð[¿µ6MùúR4M÷œ=uÖä×f¾°0hò²á#† óüo”{åïãž p÷òå7ò§û0? ÷{†¢|Æ=Ažô­žç…žäI &ÞCý©~>Mu¦„Tj5„ ¤&QÁÔ*„Š ¤”ŒRRZÊB•Pµ”“ÚA ŽR§©KÔgÔ êõ3ÍÐ=hz(ýJxÔúõÇ 1æ0r„WéF=F>ÆŒö ^­1?÷@æ¼v½v½ê^õ@¯zàX¯àµ3Ökg¬×±±^ƒc½Çz Žõëµ3Ökgœ×θá^Ákgœ×θÀaCFN‰“Æ''E&ö™Ûwr܆ˆ¾ÓR’"c#"#~÷!©I×!ÔpßcÔ»>QW|®Ò_²·|ðô/¤P=(R^”ˆz’Σµt>­£ÖÓÚH›h3m¡­t]HÛh;]D;èbº„.¥Ëèrº‚®¤«èjº†®¥ë¨žBûPÃ)9õ=ÝâÓÙç°€T Îû¾â7Àï<“Á Ù/Ph§>nt¡ºìè*ë¶ »O÷¼={{vïyì‰ÿ¹þÿ#<Õ«U”.ºóäæî¿Ðc7¤VËp9ý î/ÀñÑºÜø8X‡"7Gï[™6ë¦hCí±­¡âî¿øŒXy^ïrÿ(§q&ö|æþBÆ—å Ý«æ¹0woÿŒû &½,È‘gOç2JÈÍÊÖÌ[31g VpgwŽ‹>Œ{ã¹X$ÀB÷QQsskÅ@çÞ^ü—ÅÊø§ûŽ"‘L›R”ìËnÆ1~aŒ:L·, 6j`# ~ s`ëž]¶ž?üíQÀ>wã;â»ã»…òlxsb˶MMmbhKhXgxp´r»ûj›ÿÜÇ"^€ŸÞƒÝEzÖf),°[êMÖF8µkõ«P seãgdD«WÛ )¬ùEâmŒð«cpLnú'(ô™‰‚’¦Œ¯‚EEê·˜+›¡mkŠÛÆwÂ¥Å_Ãuç¶«…Uæ¨OgžT£0fš2õHxëý†÷Á§S|Ïæaâñ0hjÒ°QõÒööM›Ú‰ëë%^×õ.̸ܡr| wæ}°ðV!Â[x†§ÃðE×`ÌÜt v3%¹–L±ŠI‚™2#dvÀô‘A£fŒ  Qç©!í) ¿ÂùøŒ†½o\µ ç¼…ýšåþo`á¤=8¾µm®mw&6EFÇÆ¯å`àõ™Ÿ«Q1ƒ;ã§â!¸÷€ <â„?¬„•ªˆX„±5¹uºø.5½yÎZh.2³ù–<“²!;7;?4cUÎJXË V•« j£ZŸ µ.ñ'Y•IY*®[•£¨±n{ÑVhúŒòØâ8CHP;Aö¯þ⥰xSÂN’A¼5˜ ò¦‹Æý –.áÞ‚ö§ˆÂîÞ»Ù/ ßtõcñe·ÃïžãÙŽ¿Ü7ïºø›awYþò=‡ŸÛqÇE‚ÌÚ6RÕþcÏ-ôqü¬;÷¸ûÿ8W49wzÆÜ°—f„ñ~Àû’_ßé›Y'Ã/¤\&±Ý¨}÷ø{§Z¯Ã¿‘‰…+¯,ywú'¼ ½ä‚ruˆ_~¯›Hg…°Â+ö;{rkÛÁŠƒð:¼.ߺæxpá Ï©ø€3cäQYQÀs0 sðóˆhXtÖßG€?À¿‹Î}ð«|·#jñb‚“’v|¨CMˆw“ˆUÃ%8€½ XlÛ……æRc”éÿc|Wâçñ7Dø~‚Ý oç;Ãkâõ°ÞÓ ¡°"Dº.)T·ÆÓÆ‚gR¹pÚ…œc¸Âå|§[‹û ?tßÁn‘B«P+´©š”üTX1Õa%H¸OjÛ`‰´405*×”eãlPRXj@Væ(ìYy8 ?,Ó”êÊà(¼UÿF-L–Ž]´dÙŠ)ÉÓ`8ð=ödÿ_b*’Êf”y%§f ù8p1îØp×y,h³ò œ/£o¾ööÄó¼Oós0æ(Jr49µzîµ9Ç’ (+/7‡ãCY•1·Tlc*AWlpÔ~sõÝà |.90mÛ‚¢)0ÝÓwÏî?¡qºŸqú;±ïdúј&­3Þ=Œ0F­¹ÞXèè~é`.†å»óËbyáì›|‰³3ÇšËö3ó2­™’ÚV@LJÉVäФs¹L²a½!¿áDŽ%î^¸9¼j•y áÅù<«ÅA|y¼SCÒÓ´¹z 9é6„góA¢¡ìôe«fŠ…_­^Ù¸ƒÏno~§ Hï€"/OhÚÜÿpbµœnÚG@ÓCð›YÏ6ž:ÓŠ}à•ÓD6­5M¼¢2cr¦ðÿ(˜=`ÕDõ@Šf°°°xá¶Õ{]Ÿ„»ã^ïàÑœJ8µÄ²ufɘ“VÌGçø`Ñ[,ìÕnk­©iµ·ÀûàZnjë傤,¬Ò.Š[—™Q’Ô´Ñ ÛóÚ½tÖŒ—7â¡þ·1'cßa ﴺ狤¬ Šô6@•eÚTŽ¿Î¦¥jSÄ*PêIé$x'û)ö­¹ËÁÉqÛ— ¡{kñ©r8Š ì5¾gÉ$ñ(>Ft‹Þ9Ѿ©*6)%)%^h£RéK8å‹û°¥…F»ø4#tïÞºqÙô åRޏñ{~4^*qºŸhôÇQ»ñpRî]xÀ¯ì^•kS8OŸërµS4}Wðcx “Æ/õs1ÆÝæ#ÍH˜ÒP·ÕÔF2(cÞ€Sy•‘p—5ÞgˆG.& /U€B§€Þ²Tc‡?bÁ¨3ƒ UT+Åv°ë 5²üŒ{Ï‹´„5„QÒ™7DóÔ~ALœÅOx­¬¬ÂNhIhŽ2 õ‘I¡„ŠãO~x½õNx¹-®9"Z’°F ÒRU¥üÑßþoÊ«¹“ PJš±”à ÕÛK++ž)J+Îpd8#›£š#Lyf5¨‘J¦Sˆ%XîT²ë ÓžZ±+ äpè[Ë•ZKK¶ÚòºòÚ²-›[ªözR0¤ T›ÅA¦$U™3/lNø‚Uf++L¨dŽ+ ÷ãZÜ= GÅ´­Û‡‘:–à~YʨºR+ç "/"P2›¿J»*+4;Lµ6ìöÂb(GÂÐ ¯“P¤l£dÎÁ¤]îf,²^AÂ1æ#ú·à˜už=¾¼D_"¾Å”Øóÿ#4£Òž¾9ÓWï¡WÓ{ÝOÝlû·ò³±ºD±F‚ç85LB¤¾‘ÓãK&…EiQöÞüÚæ`Ï»wc°YiUëz˜°™‹ß ØqmëW;®™£CÏßHyÄ×ÌÇBåP6òÙiÒIÑS$¯n\—¥ÎÒªIiíj[žmãë’óÑ礲Ëò±ðQ÷§Úãë!/‚,yš±˜Ã3p(?ƒÍ”wtT–>ç/uÔåß›Ž ˜Œä;Eká]<“U—¸Wˆ&åLM^”¡XIˆ~~żíkö­8›rNÁùŠ}û·o/“@ã¨ìØZ׊CËÈ¥Žl>å}ðÌÜÅ.<Àé~ªÍ¿ñØ‚»y–¹¢°jVx³®ZÃÝ+b…w‚Â0¸‚ð"¦Uº+töÇ]ß'×.~àq‹`ij˜`ù>j?÷3¼F¤™•ž“®M>±e‡¬¹ùlû~@w«øžA\Ǿ®~8±ÜOm¡·xæäOdÅS(r ƒ˜*Y³Y˜–ºzçgüÆ5ܘ›¹"jaxBÁüò9;Â÷„œ‘Ÿ„³p¾¡ù¤ÑZP…ÈžmÈç0rЧ©•‰«×&,!©ê&Çì'¼Wt÷{ò ¦êuµOzÝÒ·àl¬ôùô¥áÙ{ÛÅ_°eUÆ*±hXï»+(öÖ?Ìë’ûïÿ"·?~ý]û}.Gý_¹ü+:z,Ô¶ šu éûãLÁ¦eTþöð^œ=êál½E"[Œ»½O‚kþón¨b¿Ä•Øï.ÿTåî%Ü›ytbó“ ¶ûÒ¦qüMÏ:û8ê­¹'`¾_ó3¿©yÕ¯Kν“äz…9|pý,bÒäŒYŒn ELVžÑÆ=zýõówDô§/ÚKïÄóêð8'}‚°ÔÊÛ,'7ÂÄhé†xITh@¼$Iµöþ²”Éz ³xv~{m}QIuCMCuCym€Õj´'›ù@æÑ¾Õ±k'k×Îú®]¾í¼¿‹8ð53ù±üÒëÄ“ä endstream endobj 98 0 obj <> stream xÚÝztTÕÚöBÎ>3Î5p¯çˆ ÄB•¢"HGzï% %mÒ3“^¦Ïìé%½L2É$“R€@Pª"EA®bEïUQ¯{âæÿ¿ŸIõÞ«ŸßZß¿þoýkfur²Ï»ßý¶çy÷J0x°€¢¨Qó6®^úê’gÖ-Z»bò¤Y/ðϦy× ¼ëy×xŒWãwÿXýÓ¼ÀG‚€³ò×Ñ#ÉuÐ÷£ÈU0\fÌ ¼8H@ † þ"x^0C0W°T°V°M°G HÙÀ"(¸ ‚ÁQÁ)ÁEÁ{‚Û‚¯?þES#©`j,5šJ½L-¤VR›¨ÝT•@¥S Ê@åQåT-ÕJ¢z©óÔêõ9õ-Õ7hРÀAc=½W¼'$1üù°Ô„ýÉÑÑ{űIÑ{÷%ýêABÄþpß“}“'Mš<Ã3Ó3kàfÊ$ÿÍdÿÍÿÍ þ›éþÿëSýoMõ¿5ÕÿÖÔ©þ›iþ¿œ©~9SýúLó¿5íþ¿bÓýoM÷¿5Ý?fº_éþÁ3üúÌð œáWc†_~3ügøÎð œá8Ó/p¦3ý’gú%ÏôKžé—<Ó/y¦_òL¿ä™~ɳü’gù%ÏòKžå—<Ë/y–_ò,¿äY3&=?u~¬8.9io£+b÷ìMˆytm¬8$æŸ TˆO=3j¶àÕA‹H€.¬¬ Ø%8 NQgçÁuÁ‚¿>*ÄRjÁÁPÁpÁ‚‚‘‚Q‚A¡à!Hð'ÁÂ`ÁhÁÁŸI¨³‚Ç žŒL<'˜(˜&xA0JCi))= `#e¢Ì”…²R6ÊN9H@çST!UDS%T)UFÜIUP•”‹ª¢ª)7UCÞCÕQõTÕH5QÍT I€TÕNuPTÕM$ q˜ê¡Ž¶ð™7ˆ¨7Nà ÔVòBõÍ ƒ¾ Xpipêàï›è­ôy `&0ÙLßÈ!÷†^2ìîðíÃÏ?°pDàˆÔ‘Á#[G~?êÒƒÍA¯ ð£‡–Š†ˆªþ”ò°$xÝè'Gÿ8FýçIîýËÊ¿\|ÄÀÆq3¸ï-»lì;?öúãÏ<±æÉ‘Oæ=6nÔ8Çøyã{žæž–OR'|ûŒýÙØçž{®áù'ž¯8â‰I&õLΚòÌ”îÿAÝ}údwRÈ3XâU8ÁˆÿËvóO ‘G$é+àQ²&œ*ù)Cê”}sRx]쓉2U©Òìl<ÜŠçAüÄ+Ná×Гx”IcQY c1šMÌ‹sæ<…†G YM„èÅz´B£Ìæ|´3³ʤb…uP«ÓAf`¶~6 ¥ž 8M¦Rku¨9U)Žìà zü ÄÓ ~6O›€G$Æ+Ùr(cT&™5Òù†rg~>z=؃æB4¢e«Ñ ü©6*ÍJ¨ƒüddª€Àgw­– wè])åî ðG…"|’VÈt2NrÐÊ¢^þ^fgõ´]ï°r¨õ«]oçôÀ‘ ,>NÒV]Æêh™.WÁ‘E<´MˆçHÐAiÐÇ(@â$6[X*Ò+ ÿY™°&t—F#WB%#7kLlt5å•Uµ†‡˜²ó›Xá‡Q© ñ1.i5W ¬3­>Iå!­h-*= úg¨|Í»Dx =ü(V™“™¤â¸úº²ª*Vè¬LwG±ÂcÄt:­Ï²ÄÙX*ù),v1k®F£H›„Õ“±†\%ë$ë¤ëd‰ÁZ•FUŒ(Mj3k ó ¶Fk jêÓ—.;\ÒcÎ3åó‹Ú¬d‰)¡N7 ]RÑìÔKƒÚÞGŽ÷…×QVßó"¼:M‰SàXø¼>³°aïëIG zö¢IÄÁR}),…wd(`å%FØy`SÕ&ȯ t*È`úÞ‘ŽD ùœ…gÍg­¦gCEC“ëôÀÚLgR×vÓl8ŸY `¼>Æ2ø¡4<²jÌw ñ¹_hgrË$}ÏIƒPÂ;–Ͻ_‹Äàl¶*eÐ}šýìfZ'Fc€°¥Úˆ¦ºét˜ªK‡LX„¥•ó¾ ìk.›3R³e»b6Ê7û­ª¿â}ÃC¡{|è­=uød>=8ã. ('®|uõÒ-ë·®Û¼^’¬”ËÕ0 ªô*¨f¼´Í L¤•bÍÖô•*[—Mf£3u™d ƒgÐÇŽ½÷èÅ3^0ÇØñÄå±&Í~"®0¶Éítº]i®vÀVýºHÝ}#ª‚Ú¿w-¼½äKáÿð^yÚT…½°+¸Q¸<é•åÉq¹+ò ”‘Ùµ66·ùúbùO¾‚ 3ôó9˜ûÜó츺>òc§«ÝE t¥UÅ%½73.S(pó'hð7 ~6íÃYÆ”%ÍÉiP©W’8v{DHíxo°Pµ÷'b¯{¤ÔÝ”y+à)2ë,:3dªËÊ«\) ñ’ñÄ+“~Dÿ¼‹øæ54âdômXJTƒB@­¬VU ߆g\GO˜Í ´2 3«ŒÄZz[Úî¬Íp ³‡© J£JOª F­S1ø2ä6ÚJlŽÚ†ŽÒ.Șè]ÝþÂý…û ¡pœ¯|iVhº"]“—ÂeÇÒÎù¬ÆûXŠ$þýÅ|´â¶Ð‹„è}‘ކwÌ?^¾T[Ó\|6À¦œ²X&1>':©XRÍUÂòb½‹1‚wV5¿†_~/ÇYˆ‡àh}…Ì¥rÁwaogk/#ü¡ºÕÞ»4hŒ‡±«à†=)+=ˆlàºçîìX?×¼ÁɇY¬ÄÃ1`•ôT›äoªkÐ:‡?)$Þßi"U|áG·ûf‰¢ð®@m;¨íé$v¦+¡ËP ´†Þ±d󲫞؇‡­˜`L.˨€LmAe-W N Å…:Î9ÝyÞæ°Xa!“¦ÃšÇá¸Ú¢©ý9ô¨j?,íDÕ’á'h úL¤s#æ­‚“˜Ç¿[|÷D]DÃXø†øøöÆÄ’¸‚¤2­§ªÎ¾ß·_îfa²éÉ“_ÇÁ¯¯¼ÍŒÇ[DÂO ‰‡ ^~ýXo³É`6™¡Z•fMG\ðÑð÷ÀÅÌ ¯l™ÍÎsç~DVxÙÁ…÷šNœ½6“…k·mÚ¨ÖÌ6$—¥åm­_Q%?}_oYî}¢Šjÿ+Ò~à DWEzNÕ_=?>r_ÒNCmIµL•« ¶"£"–K†)éÚ$F \ˆ¸Ä¢éð&ZdCO1¥ÄZ =‡¾™”oއóáÊ=a«ã÷ÊvÁÌ£Wp ÂÚé7`oWáIFKâæè³aŽzQôS!óx6ùÁr~øª­æ š¯šñ£÷Un>ù;A³‡½óþqZúçââà[ƒÿiˆïÿ?ãQ?Hö â¥öÃdí&/þ3LîðNúOõê~ô„ÍáÁJxì òŠÈJùЬ´Èë{€¶¨ç„N;ÉT¡|UCæÞ=šç!„;èñz‘J§UC5$ôÅ¢cúFÒ6«ÁÎçü£òÖðà8èΊ?ë=h§Ç»YJÕ׉ÄäĆ5r‹¥æ¢‚†âVk=ƒ´ttl¶Ç;Ä» „oƒ±¬Pa |‡îÑzâ&2ó³ ÔåªâhùnFã×¢éÁª<% J¡6Y‘º¯Z†W-ÁkÒCÓÃ^"y¶ eˆÐt‹T²[D£cÌ×úZR‚¿.Gíbôè{èü§¯}!ììì›K ‘ǃ<È4֨¸{%€SqÄþHUKFŸ 1: „Ée°\W?†?xZ4 a!ühùÉù®«Ô,%N)Ñ@h:_yòI±+ËŽ/¯Ü[f #PÓ‘St)‡?¡Wi7tk]Ù'âêVÃÕÌÄy¯M`Ó`š> 2³iiªÉÍ¡7#3¨-²T°(ˆv^„W¢,ãœM}iå lQ*‡wî ·¼g¤u}Ïz¨_x?ôbі㫚_&ñ¸OÀ¯âux=zÏF[¸|;ý#DáaDƦBón•4ñÉÉsƒ ࢺí'Ö\LýÞ†wJ¿¼t¹³ëíÚ³=ßÁNšû‡¯ø¼dì”È“ÕÉp\{\r!§Y×[ô 6âûÏÖzKK¢_çà_¦Áϱ$é›î¡Jy½*@¬Ôfåg™¥–´wñšwñ:rµ'›rÌÊXÍSž­"ø]´ü´â"ZQÜæl¿Â Ü*NèTeXdÁžó«`–2K•%ݼ܆G’«"U™"O]†f®F/.A3dUÁZ³– BØÌU]°š—@2¯[8ù@Š$H˜ów¼Štpj9”39Vyëm¤…s +ёֻ È\Ä s ]aÏ50÷ÎüˆH´Vò@N¡—©¹JÅÊ¥sW.ؤÒ(ÔÄâZ`Ì©O)Ë<·õäú“kI¨!´Øl2šI/ŸäÊ)ˆl oÝß,ö« ³ÎÌè´Ô¸ l?ÒÑc4Y­Du‹’4õ­á÷¡"¥F¥P©âÄÁa¡!{ví×hTj_ƒiU§dÜÓ¶£s·IC>üLü®#½Táˆ;Ýݬ6©LZ3!×ÐRVf'|¹º±ªÙlµÙ v2·EÕ?QÿÞ¿:BSæ‘Õ­!«Ø7Èv%9²šö6ï÷ˆƒM+q£#ù“½sçömû6©UJ>7x,'m~¾¡ÒS\ôÆñ7Ÿ?h2YM¤Ë0M^TYJáòž5'Öõ|û¾õ=Jȃ–Ÿ(£)¤”0îRI‰´0#Ø 5òÕjµFC¿xqBTR¤B–™s•Ymaó %Uùùí]Ý­Ýmľ¼Ë‰1«ºb݉•I®d—Ê"+Ê…?¯î&‰ðäJÐ ¨Âã£)ìùãâf”ûrùDî²#–q ;¹ð¸‘Ð;áNÍNMª6M“ªcÔóè6˜~ÞÔÖNÌ‹2F˜#Ð-óžA¤\ºsÅÒ FØ“¢J…„XàtŠÔPÇ¡j`Ì»il‡|…!8÷Ñí%“9’‹JÒŽýM…ûjûXù¶ø@ñwA˜/ç4)çýœcajã¡·¶ÄTÎ"š¾ßRÕMqD#ï[žÔ¥ÁŸ]Âs%hcCŸ€pƒ Á[hYÿdõ>â%Yx7‚ÇÇìÎÙ ™,:Kù~ð¸áJ{c“ç°` ú‰>/Ë+f9"ŒáæpŸ|iÌÐeÂÑbs3çmê*6ñˆà¥ÿk¨H’¬#¶Á¥å9ÐÁ顸´Ð^ˆ(4ÕŽB šÍ” :XôítÂpÙ’‘µ|Ñ)tJÞNU±+Hfõ f’¶»þsS‰ 5hóñ•œ•ʹ»víܱP·š¨ñ ˜jlàûÐ۴θ¢d½˜4Ë2žªÉŒÓ‰3’%qaÚÈLAº®ÌXÉ»±^еîh 3­µn¹oÚA»,Ë¥ô‰öy׺ìsá·^€úDV“Mo3¸ìÁ§ªO—ô fß|’]7el×j5ZRïu„®EœÈ @'Wpx ”ùlÔÔ™ŠËï~~èSÈ\»º‚¤Â²‹ç§JT]2dÖÓ²\ŒÓ½Ü¦µ‘F׬7Bæ0] ‹`±Ž~ñWÅåWátfüŒ…ϲ“á“’»j§ÙM‚W¦RË8€«6?²ûìsÄ¥hÒèQÎT_áÀ·_±1ýáò+Š>ø«°¡ý>ýý\FûXqƒ‹D(뎡Å0Ò¨®"h ó ­Ž+ˆ¹Ž˜«ˆ9y;ØVàÈ·êïi‚÷E«¢‰€¬àÛZ"Œ6*šÄ´è­¤Ú{K~fÂ… „`6®–öÀ)ј•©È}3¯`f.fÖN –gåf+2u^MpK™PÀ3‹_øÅêýIù‡çÓ»e@ï,˜åÓ;ÎÒÊ¡—,­u乫ªjj*M¹V¹EvdÁ¡=óóR«a“«N`y Cˆ§1ð{7cMÑmåYÎLçòOWßYþ1A,#4AkÍlîjïêêj½ç`ÛEžl'L¦,3•ƒ áñ)iÏN}vÊĉ º:ëŒ]lYÝ¿8ã L˜Ýcnoùµ€n_Íëï/<*R >z/,Û(ßEp)žpò Ö „_ðœ\ïµ›%ö›ôÀøà7ñ„7ñ3½øYsŽ)‘ Þì2åu£!Á'Ñ“ÇÑ“äj¯pTX*ô÷ŽC¹^FÈÐÞhŸÅ²úËrà­5æxÙƒg€T,ÇÞ{Çyß–¥á.ô…µøãõÖ-açv›Äç¶Î· 4PQ1–*C·pÔ„°Éô? üqÙä «Îþ¸¤Ti¨Uíá°ßB ÐÖ`ì`+è_ ì'‘Òª¾™U:iЉ/½Ñ_ »½}DϤO/ÀCö¯LY2x.Ž× (´ =„V …¬ð:ZŒG£x++ìVBq"CL5\D„-èUôb=#¼žgp%>ƒ—V˜]»Î¶®‚ø¡p¼O ÍTgh3 ~ ¾ŠžÏDB]!,Ò2ÿ’¼q»Ûÿ ðòÛÄdeÝý6‹¦Ãâ휷 @³Ž7Xm±©•Ejº\[¨†±Ì½® e%ô¯ßû#Ñúa —ªÐ9¢+w õúéÎïƒj†T{øÙù9bùÌÕ •àŽ = Ñ`x÷é‹ R ýäe¾#B  ªØâdÑ0úÚ•}x(÷«÷$Åìß½F¶éÚf‡¿‘|ì~#9÷ß5’-teµ6ŠhGï¹@èU¸ÏŸ²í'WÒ{÷šˆG]„þ“ÎÆÂÔW·­¬ŽG+½Ä;Aß’BÇçhß¿é s‹rléöŒOñ¸ÏðÓã§-9Ei0G“/NËÇí–„ÀQ‘ÜJšzLMEy-'ŒsKªbã’£çœ[{•EBx1Ýhd;¢É·ÑΓeÍøÚ±Q jdDpj Í§«2wcŠ™ÌNkJª—6¬ýjÍWk¾T:rHD‘~ÂPq€´±äM¦¿·¼ãË•ú†>Ê_bzø¯ð毪Œ/µïý»Dˆü©¼ œ’ø¨’?Œ‹ú÷hz\a¯Üì/ut[µ&”»W  Ê'1.]ÁâH:Ín€5Œ·´7ÛY'ýßðÞ@°zÐÍvÔ㡼çHÀžC߉²4YŠ,T%ÑHa,Œ7'äí* )Ú™=s²Ä„¥øýU] Ë Êà5xjí5xöu¹dKsW‡¯Ùµ`Þæé*FF?ÇŸMEƒpèò²sµ2%«v< g£‘„ˆ¬ESÐt´­ÅãÑ|¼…[_MرIR%~='©tý§3Q Ê‹ÙbŒU·ß¿ñ#¼ol?´¨}eÑ\8o ^¶x¤ 07êKtûFúÝm_´qñæÅ{·ìß¶ˆÇ­'dÀ¨.äÉI©»®¨¼ûLçùç-y–|’L¤ÀZé0_í'å®ì/¨Žƒçà„Œy‹’RÅ0>…†­ú<ƒA1e¢§égñØ|ôOV<éê(éæSîíΗÇrý§ 2§¤E–£™Î Î«(ô—ð(¢¼Œ¨º¾Åٙ˭+q‘Óø¥½X8÷cñ%®€î1h.8ÈèichMØAØ MÌ»‰[€0+N­h«b €çÃ<±Àw—Ï|1õøÌå/D¼W’Rí*+­ªL-O`µý»ð( ?,„GáÂíë—ª5½=¤å0g–¿ýãÀãÀшÌå}®¤Ažêø÷Pý á½èºÈ àÕŠ›§¼yø}Ã¥Ò6[{I~cVµQN%IVš*F#+Ve.ÎØ²xE&$„5 K S˜0`ûÁx4TÅ¢8ìë¯ÑƒhÈdDã?qsá¤Í ˜c8X$ü›ïØÙƼ_JpÄ÷MãŸaዹXˆG*%ý"ÜvQñžöW^NBÌZôôáêúëÂj½óEÒ PS­áðš¬ÚÀJ\Ftb8ù™i ÛŒÐÛUx½ž†‡¶¸Ã‹¢ó¢ôQ™Šw‹¾£…?œ;²rŪ°uÜ":Ѩ·-Œ°ÄX\adNÑBïÑ“IkæÏ ãý{ðÇqz§wt9õý…€š;»Â Bâ-: ÊÌ¥Uì9úmxLeÁcHÍAS¶4ñ£4Ý' m«D“/,FÓÐH^b1¨«Õ„qJ€ƒÓñ<ƒMÇËH7vOy<Õ®Vc#qn} žÐ:ç[cŒbC ‘œŽ–‘F):ÆÔÉ¡Ð^a>Ζüä½ Qbš&Å[i¥^i„Vè()´å÷\.üÞ áÎÇSÙUÇ~BW:r’8|ž?þ¸›ñ-VAzª˜r4×IÕÞD²ó¤åË¡Úa6;¾Þø5˜Š) 0õ>Æp×๶š÷ô&¡¹ŒEiV±éP¡ÌIÙ³®ƒ[$MkÓuÃNF_.z¯óέªÇÍgIο¼[ÐoXï¨ó­¼À)xvý‘Ðâì†$Ru¤ÊjÕžÍÁa›÷¬ÚµK"IQˆ!#Aœ 5ÝZÌÁ{‘Õîn®iªiÎ/.,r”geg; ˜Í<"U™ ˆƒÄÎoì侰⻪ܑV˜‘Ÿ^³¿&ܽß*³gÀ,&#K.a}¢7ÃdÏþ®ØæØ–Øæ=GƒÕf¹µÉÒPYœ¤ýì‰S)+4O¦Ñùj‹ æÂ¬œ …\.Þ½wKøÎ}9²Y¶œAcxˆµ’€ï¨5f˱Xêµnõž°ËÉ ñ°§.¬nO]ZaJAz‘ܬ°åÁè°˜óMdŽþð# /G‹œAèʵ%ï ¿EÅH&ê.ý$¾ÃÜÅ“,;Ø(¡g(5J¥‚oQsaJ-)xrM®’óý.BÃn†y»ŽÔ›|¨Ï3:œçÞp¾ ™×¯¥-\µ,z#·‘V(4rN/·™ZøÅ)x-Ýþ2#Óç&­d×ÁùEéo©ó,•©ü¸BÎÁè’È IsTâ¼ ÑÈÂ<$€ooª__’mÊ2eévýɃÂ~+✩ .ZßÊéí6›ÅzàHp][ݺ¶òª2·ÓÅàR– Ùì˜ bãM$ÑŽ Ä;Ž“–ó&ÝÇéd2¹J±gKðæe[—l\ΠRÐXì8ÅòF¼¯F[]4äÓEø·ÿ'Ê !·E:›­Ãh(6Æä;­eÐÍoBWJe¼ž‰ÈHH˜÷÷Ôî7nW]p¥¹Â¹xmZL‚’BIµú×6=ÿýï–ÏtÉxuƒú«ž° ã•.õµ„ðÀ…ªù9 dÓ&­™0Üc/3{T2•é%q ¹‰i;[ÄìXu!ÿhé»–›ð*CÈZ«¾ÄmeîÐn[V"‡ß”ÐTåšë^‰¼“Ó;õïsD ýtZØ]ÇëPjjÕ{9œ|göÙÌòý©!DÊR'ÛWt†Ó£×mÎðˆѭ“LjDz#£ÜœíàO²ò ©Àd÷\ný¤åÓÖ-…Ö"s‘,ì ‡¼”H^—¸~]:\¦c$@IP“¡ÊØŽ©Ý8`+lEÔn4h;¢TEš¢$xß½ý°÷ŸdÄÄ™Ú8hÓÛ¥A ÃOdùŒÝbÝöß RR„ªIÂà0ôh.¶ög ¸¹U„Pµï^€²¼kEø¡ŒW‡8ûŠAÞù EC§ @<†ÅÆVÑÓÿh=ð+}¸mù5l1Ý› -©*WEpø,kwü¦·y¨ÝàAÏ;½O»(BŠoÔzç‰Ä¾e“®7„Æê¶±bçI1‰¦fâç¡oJºàhôÀß~DÃР™„»ŒàÖÁ’°Ì[•a•H='ôñ‰ B‹·-ê>êÛ* `ZÀûÈé»MX4½¿ÿÝ_µ½Ï¸¨FbÇÿí)J¤Ç'•%»\eenÎr¯Mq­#-åÈÉ8ÁC>Ã4Š;ßj©¾d´mÐʘ€Ö¬6¨ ÓÐìŒÄ}¡É» 3v/·9øA b¾µ26b—Ã9ÕQþ_ã95$Æ LD^¶4Óæài„Fšõ¯W¸Ê*êÍ5©£«MiR0A)Ô0¸$ _^¬Ø {ŒtŒ¥ 4Ò|CÇ@¹©¤š­£;a{Nþ:s¢!QŸèã5Óx^3¼·ïrzû¤T™w®(ÍŽAKjË´š%ÕKk–4Ì6Ê­9PÓÓ”é’Mây¯Á4˜nÍÌ+3óYîÌ(MNHOOÚvPÜÍ^-WªÏ GÑçÁ¯;o_å«ÎMà´4º¦T’ÀA™6W#K\¿:quêÎ`µL-ÓÈÚÉ«³]9UñçbÏ%œWÛÔüd]t²åAêý#>@ «”jzÉßBò›¨ŽßgȪµk8Þ™Z¿£dœHƒøûã(ˆë€5åUµÌÏ©E¢g+‰1‰q¢©õçüU15RB÷шïhð$’$BnÜ‘–¥C½Áø{2‘Ü"Ýî]ö<i c°lݸwû*Üt5ズHW¬-"ÍžN¤œµmìóÙµ­£›CZ`ë8TGà›Ãxø,þœ¥Ÿ¯ñæïϧb>“òÀQXšèŠ®ßݰ»1Ĩ²ó?úá9”:2$xçºó¦ón^àÒÜRžܕ%å%%¥Nk–#ÇžS$-–IÙ¥©0¦&Ë2tdøNgØS+ë=IuIž}‡ DÈlüfÕb4Õ·wï>ÿ>q^ Nµ=“¸8jo¸4Q!“å*s‰‡’ÛB›“Zµ& š`Iy^±ž¹Ÿ©÷IñïU ŽÃ#ÊòÅ¿Ë}Ie+M5ºî ÊŒX–ôÑ„üìƒû´û “bnàÐ9ÐTníý+@¯”£m¿š½4ÖjC¹E€t6©ŽÔê².x6u•3øáþ*Öþf­n_â'(·n”kb/€6·±Ç7oÀ£o®º_7òß÷ÀªÝý«ITod%}Yÿ ÷G½Yq,þ,/pqè,hvZzÿÐ~eúßÑÃ{—$õ›ÊâEÖØkýÿfÕøã™~œá¤H)Cá7~³˜U™3Hs„JUk‰72ÁAØ­ï¨l)ol†]̵‰—²xÌ´–X™ÆR#) `/i?¥{ßÚ¿Œ“åÊÕQë!³–èœÅ\ÿŽÊ/ñwÿ›¿•Õà’éó6ÒT]ŸÖ¶ÐLØJDªy‘ñÔC3Ìg8TšòòߺÌ¿Véÿ‚Bý •[…–ÐÔ£)® tã†ð:ºDðEɔɑ¹Ú\mdô*ÓÞÆÄ^­]“OþTªÔ¤ÇØudcW ÿ³Wþç§#¾@4ôÇ9h$~„‹‚û屩*J¥Ô1ZÒ™H=Y¤3ÑÊÜÀ/¶ç¨àÏÅ3¯7U˜íU]GÜÇ sûð¸EiqºTNؽÆÕn…Lòje¢Æ¤6qh5ó;o×;aÍþC°ÖÖåûŽó­Ke®ÌS)„éÿpƒß⢹ŠúÉÎé_¢?ÈQ‚S bÅ~:eeû6cp?€Chð‡„ý€ih(Í> 'ÏH«Uh´rÈ|²AÔूë׋­ÅÆbx¶¦V‰›ÂLkáf¸@3{ÑIV’2 Ά[ÎçÞÒÝçBcÌo“2ì¤.Þ@±¤ÑND±¢ÌD©4-9dã¶9Kµ¤önr‚”XÄÁ¼¢rG~m[S›»ÝfÓ[ s–äÎ@) ‹Õl!+ˆý×r¦áqЧçþuˆCO‹ŽÄLÒß¹t6ﮓ.ÏS…s#¤Nï¼"k(¬¢ñ.`‡äÍ>Ä:|¨~ø°o†ÆN³!Q:Øúý™Yd endstream endobj 99 0 obj <> stream xÚ]PÁj„0½ç+渥M Û-ˆ`µ‚‡Ý–ºB¯šŒ6P“õàß7‰²,=dxó2ïÍð¢¼**%gˆ>­æ5ÎÐK%,Nz±¡ÃA*BÉç½ •­!Q~nÍ¥¢²¹dYñ˜Ÿß¿iüÔ\Kzý6r] Ûûª¨×iƱR½†$!Ñ—sœf»Â!ºÃÏ}XVªM^¦^ŒùÅÕ 1IÓ`G·›¸8™–£mÕ€$‰ã’²L *ñïï¸)ºžÿ´–$ÔOÆ1;¥Ó ¿:ÌîxvÏŸ~ysøÙcÆœÌïÙýFŸÍ-¾Xën†4üáRá-c£W…÷»x¶ endstream endobj 101 0 obj <> stream xÚ}TmPSg~/ É‘¶@ìÄ$Nw§¬"ÕEÐÒÔºÓbk…ªÝêJH¦|„ˆ ‚|“Üs„„,¸]wìZÙÑ®Zñc´ãî:ÛÎÚúÑÝÚnë:ÖmžNl÷^¤öGNÎû¾ç}ÎyÎsÞË1µšq³6ýªU«ŸÎÉ]³yIª²“^¥¿oÓG¾Ú)¥0é眴(BZ¬’Ôó‹xì ÙrwSìGË–dÃËtŒcsØ“l[ƲY.ÛÂ,¬‚Õ²&æc=l˜egÙev…ËâVsmvky©u‡#»¤h·—O-&fž™í…ÖGÊÂa{å°MÅLsÍŽ)·¬Ä2á[wNÝ7;ÝŸô•íɈ‰mëΪ겲GIE¹¥¤ÊVZàr””Z¬Î‹55õ™E©©i96×D¨)¹p¡iIFFzŠ)-55ôªÌj/),(7å8Š­ FaA©icEa‰Õá2%¯TjÎ\¼Øét.*(«ZTa/ÊZ˜br–8ŠM¯X«¬ö«Å´¶¢ÜaZ_Pf5=TiÑÿœŠ2[µÃj7åVX¬örYÙs&.™¥rËY&[ɲØ/U›™U>hç<œ—8àDÎÇù¹n×Éuq.Èus{¹},VQOÍZqíñçT•[5¦æÕNõˆú‡ÈÂÈÎÈ1ÍMŸä‰‘¾Ò‡æê5Ÿp¸îªJÚ§¥è|B°Q~HãˆA#tx}^ÑóÏçb1Ì+DléeŒÅÌÁ5~?øÁÇw·ÀnC=x¡©9%ÃDƵT´´ (¨ñ8 âÚuÈrÔ B÷îžÚ@ ?#ÿ—rþ¥¾ÖŽ®Ã‹´«ëì8V5ØÒé…zà› Ñíí>ï‘âsy—)åµ@x-ES?­£¼^¯<|cº ûÁÁÀí›ß¡ñ ÀyCø Àe|Lèúû•ƒúÙ~9mÃUÈ«¿_«SH´v=ü Œ”€—6á8HÙ e–¢0o\ĸ«õ/d>¿Ï å]†]2e¯Wr_z–"(›„gèä6:SEËši9P:„£N†cq)Ýþ¥Ü¦ywŸ 6‹Bð½]Ðmœ^‹´íŽJÓ¿¨)êu)––âíÕ˜’‚ó’¿m ¢øºæ‡]hóyþCüuŠ¿DFL Kc4álg½Ž¢dº±âž£¨4b‚×Ó®ô#=†^¹>Ÿ(^~ÿŒÀl>Ç“ïâ™7qY—¦Ëùó£Æ|'³I/Ý”‰xŸ¥ìÏ‘]DÎÚ‡/‰‰¡_iá&ôÞé¿~ê.Æý=°G¡ŸÄjƒKn‰­–WO롘ðk-ä@æ¦Å[3òÍÛËëšÜà…@Û?7~‘6DéþjùÊnþAP ™ïÑJÌÿÙÁz§P‡ŒÐ/ˆí¾í‡(áš ³ÛGdûåbЇ~"Ï—r±'P¥’¢äµn¨zŒ¾Ð†Ò5üFªë *¤¥j µJµ{(Ž’’h+%Rßrº°#Ì<¥5d‘g”·hņN„àR©~]Z'ë‚Äáxé½çÑN*¬§hÞÕß¾GJQkß5¡œf¿ ï…ÝŸ„ïˆ2øºN2œ× B'ˆ{ù˜ñèïCweäxŒVIbx‹náF\‹±û»'ÚxPí†Z ½A|mZÀ‡³µ•¢pÈðWÍ!Q1* @Bë¾OÐ ‹âÁ‡½ò—Ì9óú¿-WÃ-^ÊÖŽ¢Íð‚Æ&•F (ùcÚ€oV©F/I2ÓüXO¼>4K7=—”©œ³·“õXƒóN£0Š—÷gà®ÐBº‹,ô"™‰]ŠÄ{›FœW^=•tlÅ@¤)éèì î›"ïÖMÇ ßÎd©È0šÆøá{ºh¡AÖ ÂˆNú€ì¨¢z\Aæ^WG›üÅDAžÊ Sôo Òg’ytVµñ=­Pm˜Ž<)ð1°·j€ÏÓT·B~*PS%ùòÃ=4—Æ©‚ÞoiR´U^S¯áÀÄkêðc&Ý혈}Ÿâ…£óD `£2Dá;ƒÒ…ç3i’kÞd¿þòëù)®“Ñ“õüÿh}ä°~ÜsK¯þï)N¯þFöu8?Š´k,OÍž´e5m +)øðשSúª+àóÞ¹rÑþ–îðŽÐ‰Ò»|¾¨ zÏ5ßr_Û2\ûÁ¶#™ü°†æà‘H=™5O«àÐ <(N ÷†¿mÜ m ÌmB¿!F“îÿÝq¤1•ôNh‡î5ó«e›¡ÊûŠÊûJû Á•ÍÕÎFgƒ».ÿ7‰=îÓ:ûû30wÞr¿í|Ë}Ø= Ã0êèØÛ×sîDbŒs@£'×€ödÔÉÙ£]ÑÑòoŽ!Jíªˆž…ŸÅÿáS7¯ endstream endobj 103 0 obj <> stream xÚ¥XyxÓUºNÔC©ÔHp4¿‚"à‚ŽrAÙE–BYK)Ý·4iÓ&iÓ6ûöeßÓ%mº7]¡J¨ì‹(KÑ{™A–ïŒzÇ{Òùuž¹'­pǹÎ}æ>÷ž>I“ßyÏû¾ßû}§LÆèÑ &“½qÙŽ5ï­üåòõë×Ì›~gQmþsÛ bLè%FˆË Q£B1¬Ð¤ÑÜ»kGÿ5jÔK sïÄðÊOVÆÂët²pÞz†ÁdFDN,S;³ùé‰ûR„‰sç¾9gîÜ7–çò%yié˜I3cæ-X0VÌsç.ˆY–“’—‘”È‹YŸ(LOÉI’Ù1±¹I)BIÌŒEéB!á믋D¢9‰9ùsróÒ–Ìœ#ʦÇlNÉOÉ+LIŽY™ËÆ|˜˜“3rŒ9#¿–çæð „)y1ës“SòxòøqÌ…£–0–1–3V2Ö0>`ldme&2“#x >«` ƒ©eêãO3^bPŒ©ŒWÓ¯1f3æ1Þ`¼ÉøãmÆ|Æ{ä»+È·W1V“'¬e¬cl`lblfÄ2¶0âÛÛ;;»¯Žb0£ULÓ¼5jÆ( +Šå-ýpŒ4‚q÷©KÈ4vÉØ3‘9‘x\CÔĨýOo‰ŽŒ®?müWüçO<óÌšg™ÏÊž‹ec_z^ÒE>+ „f˜oà¾OY!–±ñ¼9-£_¢9ôËô”9ç–~ǽ×ko÷Ƶe÷Ɡ°«ÍjJ:N%Ù™z@Ùp»Ž‚0¹öwúГS ›LE(:tŽ«Áoð_¾¶˜5þNïEVèzè2ûæ– ¹› ·8]°%iËkâ¥ô›Ï1h­j8Àl2š¯âfŽÃáÔ€›½‡i½7àzꉴú3m§/ÀuD¯¦²K52}>”€È ·š\z79ƒ¼„'àMlX‘²|[6ß%2å*Œ5fR†Üæ*è‚rc‹gš5ÛoÚ”ÿnnròÖÕi›-M9s”[ý—°¸{¿‰£éÈÞ@Eãøy÷ÞÒÏnίãñòóy¼ºüææººf.ù+½µ¿û¯ °p‚‘}9ï@r¦(/—_-hãzÀkq9ÉÑŒF@F£¡„‚eé23e2B¿©¬Z«ûËÏñXnô`UrM¨½šy'„YƒóC¶Çf·‚¹NWG>]ª:Nû82RePæÐ¸5¡ð^• Ì€ÜN§›·ÊZf `#çïˆÅl·Õax”V™uè8öqJí ™B!£@aUûT¡mä ‘¥D¥Qƒb²Ì©psÍ`¯E* ˆãƒ¡ÕL¼ ?ÅNZ\’ +3(ÄHmÕ8¸AsS[GkÔT›ün…QE Mù¨ÍíðÝÂÏq°%ÂTè£_9ÊÙ¦•ÈA$ó€‰{ðù`ýÅzòMT»åPJ­°ëš?ÃÑWƒ¥ŠA«RË-ZÃÆ;ðVúΘèÁ=ÁÁÙAæñû¬Aãà:¶YoW² ™lŎ“f¢óéZ@Ké8’fâÙÔWp«»ÿÈë¼fä’ƒž«^¯Tð„ï¯Ü´2öƒ¢m€æM9çRpº¿ýG<öüµGǾôÝÙ%4¢ Ig '»ÁÂõ˜¬U„I„¾ >ÒÎħðmö77Å< TP¦ÊÑk ZÐ#¥MkãºÌÖª“8‡cvfÍȤwÊIÁ4ÚâÂÅBÉÛ€æF\Âvg‡Ñr&cN_›¹„!hu|}é°q4f•“ë£Í䝯Ë8æF ä*…u‚¿« $M5š3ÔÀ‘'ë•‹É@\æ3Õ|ÃÜÜv§-jªÓ~ juF=٤ȳL<³Î^‚Ïf)'e½‚ƒÌ 3úžíì4»¾Tç¿GZŠ·LÇËy/'jªªtdïžFSä)z½‚þÅP'G‘ª““½…Ša±ÉÞææ–-QSdo ( ù´ÈThÒZÀ “öۢ'{~ÞÓýPËÈž*s.sdϲ‘=)ø¡R_¥w ´®Œ~a¨ýɹGh©¢BIu`[å8›c `Dq‚ *Îx=Ž —šQBˆVå„•p8ý(òóDäý øb98ã!‹}…—D੘ú<úó57èIýy„8̲ª)/T<† ½M²ŸõXŒ&¸fn"0èkÙ½¤ NÍ% Áf²m¿êe;;LæC€~q§Ÿ¿’‚dÑ[Éi;ölP&ŸO‰ˆ ÒqßܬÇã¡æzæ±{ „ž¿Ç ­µ±ñëgñt¼ðV„ßš‚ôL:›æÓ"º„^ˆG¿Š_áÖC»å€[»>6( ßÁãŽâun»Ê¬å*‰“ôêü÷7å¥Cð ¸;¶Q ²ÉÀ€.ÈØ%Yp¨{wO?ÿC ¤ƒ\+å¨r BsŸ ê7Ùþú3ÛVgvùÍNc+Tº†Y0ƒ‚Œâ•ÉÉA\Ö+9¿ˆ#ñd<‚+íRŸ°Vjy£¶À–æR˜øÎŒfèGÿúåo~wçü^z4²´P#(<$ÄŒfK%Ñj 9Á¤ ó³ÏYƒãC7Ù®ƒU-_š‘ÕcôÁUJe¦ë22R3£¦ªÃuêuÚà.$£ÓK ºyô 'ƒ~~êWÓ­Úzø.Eê±Õ}ø›Ðd޳Óä"^jp d £r—ëryïó¢¦*e?'§Z–¨¼ÉQ$ï¢7iÅÄHR":úþŠ?qñ3@æ‚1m˜C(ÿ² fp )_D’n÷˜»L£±’¤€CcQr<?3#‹à-±Ìi°Sz¿ A*-}nHÊYjSYë=âsCµSiRs“`¯nH@l”„WS ’JᨠNQaÎûbè/³È¢óBX¬/Q?2Àu_c…Ɔ¢Ù’.^ã¢óXz=~uöÉ5·©j8f9w͑ؑy: ¶¶¢µ²Ó{>,®tᆡՕ­•l܈¯k¨¦ `r¸»{L.çþNñ76-¨²ÌUÄÍi®­¥=lôÒ¢„-ûŠI±í(9I¬y¬•´˜#Á³½]Ý€>ñ-PS Ö« ‚sÙ0NœÚÃì;‡e×YX9¸”––+„÷”½Ò 3€‘Ö5©ä\P)24… è/8e;´ÅŽfõ¯¿A<6Ïįܻò7öñr²‘h Û“ÓýÑ'½å €:sÖQ°1“~J’’¹:>-PFfã Šˆì¯¸HT>A&Íû†f)Š µ†„Ö:ÑZ>Bêäÿ©u&;1ú:ßÿ‘·YóøóÈu\ÙÆÂp1»n˜ŽÕ\m±ž:œrp%Í¢ù½|ÚÙEÿŽ_þõ›Ú®—­^­\4ƒf’9-Vüº•1X~ÙìxÖ÷aºúy/Ó¿‚}Tt¨„N øï…øA<í몳ÿþì+Ä ½Â¾Qíž§Š¨‰¨Á–ß5›g²Ó_Y^h¿$A+O'•"¬*ó74ö‰¯ÝÇÍ€$93Ô…:y>ý Zù¸Ÿù©ËïQ’׊ænƒÉZ2qˆ«Ž˜PŽj%±€W²çpþAîIè>[µ¿õb-~ÚHyˆOðy~s7š`\g…²BO³Éäbûˆ9åÀWiÓ$]é äŠAÚï:†~eÆùש³Ð×çr œÂ7Êö^«È˜1ÄiÌu¶8Ý P‰*d~~A–$i_—è÷\<®ß.?‡Äx[-æˆ %Ù‘Kz¢›‚£Í8²ñxãG‡º{]ö-Ô!…È¥%ž˜ ß=W~‰…»ÿw›ëDô´¡íðŒ0YX­qr+ Âcõùoq¿µlkíd“ÍÑf´™ÁS튠ŸtíCîŒ4 ¶¦ÐÌü•B ÉD´»#½ïQ~Õñ£ɽK*Ëz ™T®Z êuÎ@Å¡^<ΠO’zÞå~»²SãQ4þfõó_3¿êni䨄, U…Z¹R°‡FÅ{å‚ÒL(D»ÛÓ”Óœƒ’Ü?Üþ¥ÍW{žù:ÑÚõUÈ<Œªôæ‘»ßË_R™/Ìæˆ|ŵ \:þ/óÙ⥻6Ç‚šdµÄÙb'¾®4W˜–Ô]p”{ö×ÿáAhÇZMÚ¦NìØ1mócìNÒÍþúóGΟä«Ò&’!Y'Ó†ï¡#Ô0ñŸÃjÞ;ËÖIÕBÐ ‰OQN.eU{µÑäé³Õ~Ë‘ËRéh6Zʃý÷¨×™šIÁúôsÅ{BCÈ~V'ÑªÌØ?ÑÉß߃GÁiôéÞîåÜy°s]‘Psj_0žÌLâd¹¤8£d#hÑcâ¶@åµê£€ªÝ¥dÃB¬tt\Ï>@èíë¬^:š­ÌЫȈWF*QiÕ:¨ÆfrÕj'W-«w¸ÀKv€ÝIr¢Ï·×{yMéÇIsGx"~O´ùòRjìJËL–¼·&uŒB"É(Ý@æ‚ÿ ¦Ò§LyÌä%ÛÞØØTUÞl¶Wê®Kßø8¦3VìÊL´¦ôŽ-ܸMfÁ¾ù¿±‡sz{h9Û¢³©¸2HJ*â|œ\‘EŠ<’OÏ §Í<»~€:ê:;é™ô/t e®Rk@¥d^'W,/ÕÚankïl{rÎâ]Ãç´›l&'¢)ü"{ƒöóÊáÚfVöoœè9Žâ…*Å[è\Vš».–L•¡m²|þk/ñÄïþ¼#L–vü¢¥ÊÑVuÕÖhñ6õÕöæ†C$'ËËŒ£)È*v‹ !µY-Û¹k!a§8WÙ›ÖºûŸcõ±Äé²@ÿ=!?!ƒ-H œOGqK` û÷kê[  Õ{ 9…{6ŸNº‹ß>€ŸîåB§¸¾ÌÃoâYœiŽ$;ô¢æºó÷ȘLUžL0\ù±F—Ü$<¾?Åvïëú‡m±$V¼*P¡ÜÛFf OŸ££ 38ær×~K¹µÖµl¨Š'ýK`PfˆßK ——Å´Iï雼·‹‚SM_4\ñ´`á¯ðI¶­¡öÁU°BÔ”æjDy?lþ@kU÷‰¾ î&H+æ]Þê"-öåÍ4;/Œ ÿ+Ïälÿár=é(þÅ& ²‹V§Ò1ÅëÓHÚ ¡Ð[o ÔÛ68¤9y‚¬øc¢Ãa¯šmžÔÎäs€¾?Ùõa÷Qä.¥Õ«2cVå“äH.nm'î³܇ îRÒmzîõüCE¡‰l‹Ä‘}D j…T¯Qfk%D ¾š¿‡^ÍÑJ÷®Xh»ì0±å‘Ê í÷*ZÜa~Æ–?iŽyrJœ4E²v£7.æœå€öʦ¦Òme;“â)¼x(=æ¢àŸÇåty‰ß‚|‹\˜Y¼sÇáÔ ÜïáûûMxÌð”ø©#€=ǧ$î°?>Ó\ßã…þÎÎß= %Ó;a@ÏU‘ë’F‘³«°8ò¡¬\Z)®-ªÎônüœBYí¤œ`²šlþ#gŒ¨¿ªVÙ-u“ÜJÛ;¹¸xÞ|ΪÕé›A5K0™lîÚŽ–ÆV¨—¢žWYXUL¬ÿ‡3øÙF«Öª s®Ö©„k׉3A[¡=Ã+µ’q§:]-w»½8'A'ºŸâFŽž_5ÖiŒŒ¼>®Þ…ï>÷_¦3ùF endstream endobj 105 0 obj <> stream xÚ¥R‹OSw¾—–Þ f™Ý0›·7>6uVQñÇ"B|%êJ)”J[,W BiL[VÄ¡ˆì°2Ü@ øDt꘸ˆÁáX¦3>¶8§#þZï–ìÞ¿aÉ/_rò}çw¾sòá˜Pˆá8.ÎJLÉLIú 9}ã*¾^‘Ï:^¿ ¼ƒÞÅsB” ð¶p†a¯%<>}ƒÇ©™<.à@ˆ¢0!Ž“Lé…byŒB±,ÙPTf,È×0ôBÕ"zilìJ9½L¡ˆ¥ujcJ©§Ó•ŒF­S2\QHgTj¦Œ^¯a˜¢¸%KL&SŒRWc0æ¼HN›  ½Q]¬6–¨séTƒž¡3”:5Í[Žá!Ù +Úètº!WmÔcª|„)1VÊ™”`QØ›Ø,ŒÂ’° l+‚ᘳbßá«ñ‘QH`…àqÀð•ø‚á>¼÷!j(˜Ñm)¼²Žj¿ßù[\[6°Q°ýC³!?ɾ6Cšã½¡Õƒ‰wJ/ÂÜwžû³ç¶ã!Œ’,ÃŽJ µ¹dÚ:OáÜ‚‡[_üÔà†Spk¯Kq4>µ°–Z²J榚µ@r³Á8éïwáÈ2)@7ƒ©×^[Då¨6ËÔ^¸W¼ä? DžÍ"§4ZQ¯ã> <€^ñ|¿†ÛŽöÈøo¦Ðóég~üâ4b~ nô¹´ÙÙçonº>ru‘hÆûwY +ŽW,ÛöMuSk—óô…­`¡:ÆoºÏùd(~¥ æ%%°álžm±‚Œd@&ê@kC E6SÕVKé—U P$›*âÏÖ9ŽèôË+üÎ ”ó·F¤“ç2ç²’”¼M2n_—æ"ùµ»Ý’ißUdØ«’¿HG"4ûÉãç2ø%mbAÛ¤ïêÜ#ï-™GÇe&ä¹Ë=]®¶ zv5í©í¾ëhÒ3Q5_kôJs¹®±g(­©ªJÒü£"ƒ7QÄ Šį7 ‚t_êtA{{1TÈþ UøÀ) F°©óǘxF"ª0qÌ ŽáVÙçCF¯ÿ±Ç‡÷O!ýÄx— ° —>“ŸS¬JÜ•¦k-óøŽ»¼œ¨8¶§®Ç} ê¼|97VVHdÚ>µ­Ñ/WïÍ-¹â¯Ý·¨qèmû¶NíQ÷Ùðë¡G²áÂl"§¢¼$©„óÒű»U›wvQðÃõ1¤¨##_‡qI˜éÃQØg€{‚`º,ýY3ÂâÔؾ¾\_v{£ë3X ÛS+‹Èš?Dìk¨–;R½MÆ6;,°ŽÒgýàíèƒ3\<ˆu¡4bzòìÑÆ-Ù[öÿu‘Î*îÇÑ5T)õuwœêôû»»=7jI?‘k³ÃŽý P<_K·²@%Tî·XÌë£ãŸZš¸»œ õ‡n^­²eµl èxõÔÖ\ÈxÉJ¢´Ñ—“`Ÿ­%zõÐwðœäÇW´ÖC ´mrÔ¹;½žŽ©EÑ.† j5TU›‹kHÞïo9|C:ì«ÛÝEF–´’ÈÐp¤UÄ* øÄ _X<Ñ,Ž Â…+]â0ôjÖëIN? endstream endobj 107 0 obj <> stream xÚ­XyTSç¶?!s@%žm{‚ÕÖYQkÑVë€sª8‹ ‚ÌY"cÈNÂ$ƒ2Â`@@ŠâX[­·ÖªÕVq¨S­CkµûàÇ»ë}i{×½ëýñÞ[‹õ­Erηû·÷þí½#a,-‰Dbí´`Õ"çÏF;-Y1ÁÁüÁdO¢•Ò‘h%¾ÅˆoKÄw,DA*¾iùÃH"˜OY?z2·ú›Ï÷è1x²-c)‘p1铯98Lt ‰Vnññ ·á9Ò~ÂÔ©Žcì':8LµŸè­Üâéd¿Ä#Ü×;Ð#œþ`ïì¹Å;<Ú~Ä4ßððÆŒŒç6.XéóÉÈ1ö‘[Â}íWx‡y+·z{ÙÏ  ·_êèmß…y\×éî­´_ìå­ ¢(mßeFHFKzOgfYÌ•,¶tfV1,af3NÌf.3™Ï,`1‹™¥Ì2æ3f9ã̬¤VW3k˜õÌ&™bÁHK&“y,Y É‘\—<³°¶H·¸ /ýÙr¦å «T«_d±¬-»€Õp}8m¯¾½¶÷zÚÛ©÷•>ëúÔõåû~g½ÐÚÇú…­MS¿éý*ûOì_<ÀrÀ¶ŸÚÞ–|w`*?O|cÊÛÞhsÉ›ívŽv‹Eµ¨e[±mÈKÛ:ìa¸l>äÿıâmþLØ!wßèÐТ¡væfeiuZ­8ħ)À?Ùiñ’„H5—œ™–™×þ=öpõÿ»mD;¢/{å\*yzZŠ7I2zÐÅ‘hëËÇÎÞ‹³±(Èè¹ì4}а&ÌÿŒÈ׋"G˜žG¬O«3¤ßíE¹Àeeè³ݱôòfÔópM…Ö+Ñjö›üõvàRÒÒR †ô’è'#N‘I@¼ÌØLæþÄv[7Ø”Œ´,!î}óÊ¢E>Já&gÓQ<¥ 5ááR‰hÕ$Çb µ²%PZñ R‹u²P Qñ©#ul|DF–ÀNÒÿdñUZ %;ÜMVu…£Ìö6ö¢‘ÑMËŸ Ûïù'Ÿ…Ÿ•›£ÓÙiµšx|¼ÔÍ%%E£´..óøYzѲӒ<,–b .ãO“âå,½^Jn¿”âÊc|MXEPPXXPPEXMMEE %_aè°3HöµcN»TtÇK<ü˜ú£ïå¿L-ô€e0;tÓ8ÿy©Óác˜™1aÿŒ]Šl…ãð}ÙÁGµ2¯Áñ!—x/øÌý‹ê <€/àœÏ9^‚}®ì0Bœ.‘ë 3`1Ì„ùªOãÆ¬tŽÚ“Øh:H£rYŠ-ù Ð… K>þÀ°¥ôª¶J®së£N˜ øÈêõw ©éÔ÷fòg'¨óæk®â‹¿šl¼@·ûJ#eO~•ùP8sž BÙ„‰ ±š5~¢óÐÕç﯌®ô’ÌÑÕ”}¼ñ4p÷|4U¯›¶r YIüìT*úm'!²²jœm¥”¥&»mKNZ]è#ª/"‡Ãʱ÷¯_m›ÑòÃßðã3žË ƒð£êô·”ž“NŽ~Ʋ~†¨S©¡æˆ Ä ¦Öó Àí?1A éËCÝ7lQ+5Iš°ôdHÒ$k`;'ïT©²¡H8(»Ñ8$y{^›Âfù~QŸj2À^®!¤4(Ì?ÞÍááB” Íýû¿ Ô8ÜX|mhY7¿8Ø$zP‚[®R‚q*ÿë“®š%l í×·Asó1ØO©ÜÊÎJÏkPÜyf.n ´gÅ ‰´&’È™Î-v,MË6¦†w§O™øõUÉIã£R1D|Éï0‹[GÒdÄÒ ÒJ8¥Ìl²2Êô…;Îägg]ƒJ¥§L;H"ü&·üˆÞ£Ô¹> ‡r…£,œÐŸÈ9žQ¾óöÁ¯ºsÿq ‹¨×GÂbåÁð#òÇè(nä7îNÛEÜ—_7_¼tn“+¼6,óå qüw­mpž{0ñ”Ãðf ZçÚ쒗Ш4Æpòç˃&;ÃnÈo ^ Õ£ö?hPònŽ*‹Íý´‰îÁc¿éÕQ-°tЬ™k¦Nvúª]€Óµçnµtãixp³\fâèu&Ž/òþ,Ù6tãr!VéBöpsjŠLa»"b½ßt y´Á·ÑŸF „ýf¢°ÖG»»nr ÷€™ðÓH´ä| û›ËOs¤ÿ'|,l„€³ÑpÌzÕRÖXudoA= HÝ–"×|ÿŒÅ°‘›²eÔ$¡K"1øµJŠ6ÿ.“äšå¿KgG1jÂqM’“c¥Nø#¿«Gú;‘½–ú] ñYÍ¿n qŠÎŸeq=MÀ¦#‘è:“¸°TRÛ1K*¾Û±˜O-HÏŽ…XP§¤ÆÏÎGvÑk=ãVi¨–kèLméµ´`ÙuJc¥ôÚ\­î0¾i‡ ;FÆjÓt)6(ÐB„¶Aÿ-ì=pXÓLŸf—A|¶ªŽ#1—G+rÍŠDÈl:ÖRç ¸Ïd‹Šv<ýxö3*žJÑ‚G [§Ën°¿ìqý‡«?]ïH¤Šû‰üã’ çà2wgü ò†ÐiP!»ªSù(:+Xù ª,ŸaâÛ2tïîÏ ¸3õ ‘æsKÈ< sIÏ®S`%~Æ>m·`Κ©Ã(›#LcM¶'Ÿ‹þõT¹žÄG<ñÄÉ\ŠŽOP\.doT)šíId¨ýT"n)Y»*ä¿b®Ù󥀸ëPJÞ×Ńz'p… /Sàv¶²UB¤Q%[7ËnsÃÚ#£“?$ËÈd2‰¸SûÓ(gLX·G‚oßÅõFmÔ¥øö5¾Ç›Ë²fÌ£ê¯$ãÂg“™À‘A¯])½Ç>ÎóÿPaÄb¥l²*`”0“eÝ´ñ2:·T­,$ Î( Æ«Î3=\ÙtØS£-&<Ümt¥‡¥âÓøÎÃZƾ@{Þ5Ø·ÿ>4Ð8ú±c  ^šÛì/¹=¦·û&cÖkÓ}e8 ŒÎ…D ¦m:¬¨1ÏRQ0u»e¶„y¼R¦z/ž s€›Ú편›Ý; u&™Ú6yMß¾Ã*Øž÷R,³y5Lz£}µXq]Š)#ùDƒ¨°‘麠fCÀeÍÄzm«®®®5ÝܵÙaÐR¥´,¦ü—Eæ¶ÌÄ\”úœŒ<ÔtXÛi;/Êz—Eç – BDe‡c¥„&³Ûsi‡7>àÑŒ¦É¼ˆÌ'cÉdñÀqÄçá"“ÐU ·ÈOüh2ø'܉ùøþ7íwp貃“wÇ¿ÎϽ•x–:&ÜÅ–çRŒÄ wi ìõã´PÈ/Á³…7Ké(žHÑ¿Ùá&s†ÇòäÝQq!½¸BôdÌW= ¼½gþKn[³dr„¾. ÷¡L_ ; ‰ÃKl2‡ÜG³!}‹ïÏŸ!7Oíú¦Wcš$Ø»IŠ9DÏ7z5æqyçŸq¬yÅ^Á¶ÈR[cˆÀ¾—ÍݱŒ¢3_Så#DBüv:§kèÏ¥ÃÎ Ôfwö«ü×[NjFªjÊ Ò{Y…ëúâªJóŽõ¿{ñoPûP¨“:yòŽçãŽå‰ïÈ(T•!Æ„þ†Ê{6Ø6_Ýð/\2Êáíïù Ï*àʾÜy]qRéÌ.W¦¨üÒe èÂB3ìóiôÚ·®p•’y. Kc*«‹KiwÊO­Û¨­ªoÍ£`ë)¯‰ŠÍ¬üÀ±µê¹êÅ3·(×€÷ÑcåYZ9‡›JZ¸dœÂgÇ8mq]¿©þˆ'šÛqjÚTU™8Ô€››m_^ÀÂvyέyü–%ÃTVì·9Éë¬V›³³ª…“·î o^w™æJŸßŸÐéA>ò)‘)äqÓÁÝ%6šÓ“B7±PÚ¼Â}'OäTÀ!h­ð®Ü¤_›`sú² ×­Þ~«À|*ÂãËèVZL‘|¦2b݃F£ížv\ó Þ¼lô o4vÀYM½Ï&uJ lãB‹#«+K‹v3cß'dÀxZgýù 2ðéº5 ®Å¾¹¹ÛAMíô´ô” q‹6ÓÞ$®žt'+º<ŽhuyLM^ljýOð Yžgebç&e·*ä­âï÷Ÿ°A î•«híõ~w$ZåOF Ùësph±–Ã2KâÁB4¤«b7¸F¸›« Ûº_} öC£îLÍ¡2ÓÞºãPÍq&×¼:˜G¿v:° gl«Û1ñ|׊e‰™|޼iÜÜó\ò–—‚$n5/À=”=]õ˜6nü02@A}üb²hs¥%¹IºT³Ï)éI¾Ã&ÀvXž»Ã?‡óÐÀÙàiºZ™ðƒ›9 ZžpGŠN¢ûÓçŸô° v%'¤Eo%^YU³«´¢qsÝê¹®"vZÀä*몂TÜ÷i[tÕM-Ðô׊ƒWPf2'ÙTŽ+Nß,G(·­n‹¼‚³¯Ô·¹–ÿ¡B%Îä?€gå ¨ÒÖî2æä—W7w†‡+ Dã§LJö¤$s^!)™ !6vbøß«À¦ãr—«[´¸€Þæ?y+Zàcž”õøX¯=ª«ªlëö± !.f¿xòÜÙ¼U+ÿzn Œf7‡Î,ÜS@C|‘_érp·e1Þñwfå¹ÒÅÕÅ=x '¿þ‚¶3ryk7v±í_±ËýÿÏ€z@\ýÄ¡× Ô*£è`ÐbßÝ.ýÑÇÃ_k2`‘ÐÂæMUÏú×'(H(qáÝÁ­,ä°ò | °ŽW¬:ÜRÖá@D¥{¥;,oðUn®nAëÌûoYm¢QÔ¬4¾ÖôÇTÓûòç_óbvŠ›B~½Ó·Ç¥=Ú6]eÕÑîY­Ûõiì63¶yÕ÷ ý¨§„nþ§ƒ‡[dú]<†±5G[kŽwéËIÄŠXÏuœ¥ðïÒýTÖµ@ñ­Ú_žy[~?Æ[§¢n© 4Û{"»î(´Ú’5S\rÐ㦌úÎþÇw 8¸;!߯Ö+Ç#‡FÕ9oAœæê+÷ßÐ2'è´‰;(¼î±í×î©-•Jü¶uÚöÄ4µwõ&ˆ£ºfã½ÀY¾…ÁUœünmhuÊwñµíÃK1Ø„SJ%¿_ÀÁtQš%ãq¨‰ ÅÅJ™fj ýÈ4.â©aI¿‡ «/žN)W²³½7/€ûEBOc³jîIð(ñ­ø ,û«­BdÉð¿ÚÚ<öƒ óg;¦µ´ xëõ7×@=QAF±ÓÁÇò¨“p°ºÆü“G›$%b¼Tüoó;Ê‹œ7kHxz&†}û^(ík-ô¶t,íÛ oüo€üÍ. endstream endobj 109 0 obj <> stream xÚcd`aa`ddäõððpõˆÒvö Ž4 ضÿóa5ü¹Œõ‡ ÃYÆrL?䙈³È=ôbùÏÃ$ËÀÀðGDþä‘_@¤:`Þ=‡cN͌ʪêº*¹îÎ)†=í= ý©=u¿•žJ4Ohíoîæ¨ª®)—ï.ŸÕ:¹}_Ù¾²ýª‰ù•Í5-µmÝåå³kæÈMîž3mú䙓×.œ1eÍ‚é“LïªmÏèªoÔ’¨š]7gî¬säº{šžvMèšÖ¾±k_ñâŸöKØ~+Ng—ãbž¦úŸ‡sW÷~®ýÜûðð1ï÷‡"ô„»l endstream endobj 111 0 obj <> stream xÚÍW{TSW¾>‡ÇÙÛ·rLKö;Nc­cÅ룭µjÛQm¡>IDyBvÈÊ›DžZ#*ŠÚ‡µÖ)â0ã´ÖÛj½Ó‡3³\uºÓ{¼«wÈL®ÞYó×]IÎÚ+ë·÷þ~¯ï÷š ¡hšž¾zͺ•ÑëŸÚüʦ¨Ë,ðÿ·È·òEùû _ÿðpèõÿ^úEÑføŸ†iþçžéäIÍ%VFÍ¢é‰ìÃÍ_òâÚMÛ’2T…ÛAWçÑÓ燮|Žö¤¦>³`Á¥㋈Å¢ñÅâÿ,–ËÆKÆKÆKÆK]KW, l_ؾô™Àba`XN^8yià䥗Œ—-Y0?bµ1yÒÌIÍ“gM®š2gJÔÿ™Z=M;}æôC3â§~G?"­W¨ðYuØMRyÄoPjL5vuè’ø{`WŠ1™“Kñ S€ Œ¦eXûxü@Õ›ÃÖ}¨ûHo«µØQl/éÜÞ×ÛWŸî(ªÎEyP¾Ç¨!é¨ô5R¡}ö¤zù`vW̵˜k¯~¬­ÒU—TB8wìÌÙÓ'O?stA˜*®†ró ŠJŠKŠ‹‹KÄhqE¸J£Q© ‹Š Š!Ç:Í^®ÕÃGºNI ê ñc_÷ÇÁÞQ_œÄ—j»é“yTjôƽ<°6FO0zÀŽMŽßñ¨ÊT‰*M>[¸M]©r¨Ï‹sΉ¿->Ö/2áÖ‹ªASg²4[k.ãu#xýŽt49›mͦ{—ÃÓué\ÊmPÜçIéRó¼¯î´ur$œF§ß«•@m(γï½WZ««+­{(áî<“|ãð̇Š[µµzË>ôÐ?8¡Ç/o~y Ÿ¿|äç3“ÊÄgYŽò¸¯±âÞBx2ÂŒ8é’HÛ¡¸^üB‚ÐZUÝÆ]e{éŧx”Z–˜­H‰ß } Áÿÿ]ïÇgðv^ „}3‚c¯Eÿ'{·ƒ4™²te‰¼è Y†XN‰«À%v‡ðv }ï7Ý»­°°>WÅŸ;Lo"ïaoýîº]¦—‹ ’oöî;'7òZ ÛøZÚ«®fTf]ê€xmžP½å@“¾Ë°¾w41«æèÒy‚çÙ?-g«ðbÁ7] q|;Ž ƬOho7¤ðH‡ôF=”½8!K\#ÎGûÅ ánÆz½Óéis®èB«™sè-CÃ*»¼Bf–Þ7„f1ir>‚£.óNâ¼{Ó$9ûËösâ.F¯­°óÈQwÐá¼pÆg¡kÐUåtqfZªŠ²yñ-€ôHG®&¼vaú…b7ÞëÂËÚ}— c€÷KðSmµ9ñŒþø¨8uù‰ÓnÏÆðÃèÊ©Æ!“ÙdAh×Û´Ü>dÌ(ÎÏJØ*ÛŠ`)W±£;ç„æHy?òB“Kbºä¾z¥ÅQá09üôÐÂçÆcci.Sù~-„ÝÁ{GØ~÷}Åj”€íe¸f #Ï0wó¦ÊJ‡Íæ=sü̱3MBck³ ŠV -*\ûë&CiyƒÇÞñøˆtw‡a/o,)Ñêt»bwÄÆÇª”êÌœ,ˆ­À㬾D¢ød'º÷b~ž÷¾ðTÊÿ+ð¾gýoÂÃÔg#ÈÔgH2M™ÖÚÊP d»Û²¹T­P®þ[Þ›¤Í>j´¼Í ]Ù¬çd)8¤vjJá#ÿ÷a¶·ý~~)ÒÞËæÐVñ{C(Û+¨€La9ÂßHx·£ªš°]O܉}q¶g*€¹j}ÞF6 `ÚtgíGûš5M¹-ï÷üé+2ñy%¨Ò[Êåççêt%%á›ãc7ÇC,Èf´#;<Ú…Ž7_6„.cÆ æµi›Iû„µÛ§ùñ¶€vwY _ PtÙzm´6*ï‰H” ÈŒ-[šóåÙê\EÜaÙ1þkTØF,§*+N¡Fs­Ë o3BU‘’«£pÿÄø+¢+$ß$T¾' Œ /øÛß9ŽB(KæÅl€ŠL…¨nØ«ÙEÈ%J»RÞæMøXUjcRíÞ‡Gô-ì‹€¬ÆRb)&T_ÁÔW4¾[ãé»uøÖ‘Ϭ5öKI¼Îö'Ë [ ˜!fîO«$(ÊÕæ¥/Oy!my‘¬ -O¾ã›­ßÄcJ[g<¨@ßK0Î%±ò¸oùæ‘4ŒùÍÈ–Ã<²“&µAü0Þ+> ΤE¥pW*Šÿñ}«·Ãm ±â^ @w£í­±Øùg†Û÷ëV£:¬ãSÜuƒdPï{U"§žFâLø««â<OÀAŸã8ö*ž4OÁ±ýz¢õ~å*VI¼€½ú¡€ƒ0ä>Bë+Ÿ¯P!ÿ'Ö“’ ”&å&£UèõskPuy ü·†„ ÓïÕ)à²lãH=­¨õUô!èjÒ§ûiSöñÌ8ƒˆ›ˆàÃëß·5ÞdüƒH:¦Ýü=%HÌ@ÛIP¥ ºG%#f+@WÊ‘ìABü“pÐm,ÁLgò›ÑÖ¬=Ið=€[D¤ìù³Ÿ@0.òô1/DAÑß¼rüí/úÅ /pd´1ãç÷w»¼„ß{ðrw‰ÿþÎÇIr´û ‘fÕå´·65tphx±]‹ŠAO‹‹S¿zÏä/£‹½îá ›µ’4§£ÔRÊíGÆLm~ÖÎxƒ"Šg\åÙÞÝx"åÚP{™Pd7Øôv äÑá' î%þ‰KCÝŒ©Ç<Øäjhî´º¬g„:C/žÛ Û9•÷ {™Ä4k?OÁîìæê™£èhqu¬MY‘iR’X„—úßB¸èhq— Ä3|û„0¶©ÉŸß ÕLi‰ w¯i_ã^ÓùB¸Yë(B%(¿@­+(”‡kvJc6—ïC¹Ö|§ËZ}5Av—+·!CQ˜¥Þz2½Ÿûyñ÷ǾöÞé¿Sw´e༟¿–(ç`vÙÉ…ʘ̘오O’?K½apèÈÛ»Qãhó ¨ïU¶©IäqÙ0Ößdñ¨Rs‚>wù&^Ü ¤éÁ$ËÉ"ý$)ö©_ÿKx/joÜ0ЃZ¸;øc I¹ ^Æ¿qç0„{ÉoX ÈÛ5^R530u‡<&?vWdù$$Í“J!âïîKjÀõ“ÞázÐÙs ygñò„9¡ø Ø›´››‹âÿ^r úÎ%Ú¥;~5Á¤×Ž\”‡wÐMôÈ_O‰ðy¿tÑÖ×÷UN³Y=Þl·Ý¾%9?–]>œEç/þœ”a¯ €½ý’!T|&§…q·ú8²JóAkÒ£d”\žŒ`–ÊzˆÇovÿhüÇ&è¿f­ È@š I½q}$Ø}_¨'ÐI“×ÕÛØÝƒŽ!ozOJÃN×¶Š-.Ä€g1¼ïŸnÕ9àGÏC´â-æÜé‘| QŠÒ‰l~‰Q›üŠgžã‹QZ–6¥6ü)Îf°gH¤ÉÒ¤ô=yyᙩÒ#£Ú³$ÍO6ë˜\•©†GκƪjWG‹ÇÕÑ(„Û+ÍVòÒrAœÃ$f^'ç±çØ?'¦‚$>®ÓÎGÏ}žqQñÜFÉJ&r™ù7¹ÚÜ67" y‚i6X NU5ûVÕc™©¦•_C€›ì\1y‚}òDÓäI›xj·hîÆÊçœïfþ/> stream xÚµXyte¶¯¤êc ’¢!nUȀ㊈ Š "‹Q†}•5kïûžõvº“twz_ÓYHÂ2ˆ€ö­#¢&â‚(3£ãvðÌ8ó5§˜óÞWç½7gÞ;óÞ9ïtú£ª¾û}÷Þß½¿ßí,*'‡ÊÊʺãÕٯΚ;ïáWçNxzÂñÙ¤ÌÝTæž™{³3£r„M‚pOîÚ_æÞKQYh8¹S-ÃÄ{Åâýr»kY>•••Ã=:aü³K‹Ëò7¤£”n|CZ2ºPSö†Jº•<ù‡7ÄܰrÆç>“õ,5“šMÍ¡^¢^¡^ÍZA­¢ÖPë†IE ¤Qƒ©!ÔPju5œÊ§Xjuu/ÅS÷Qc©_SQQ“¨ÉÔ4J´ò±ó<õ±5—z‘Ø›Gͧ^¦» ©EÔbêUªzzZJý†ZF-§VPPYÔ²åɬhðÄ€Õº³çdïËy0§'w|n’I`žbÞA,º0póÀsƒÆ ²Ú5xæàî!‡\:aèÁ¼ô°ÂaçîX<ü¡áÅù“òßfïd÷˜8â=ÉIóÈ'Fžu¢@SðmÞ+ÊUžÙ›}cžd[åÂEÛ7ÌfË8Âè´pÎy2hŠiã€"@ˆ‡˜ÆmðþêýB<ðPÀÃN`òÉ%Ÿ»ÉAÑû´\5_-M‡UqU>îèeßÇ9ĺ¾Æbè}VŸSÏŸ$ ° ä/†yÎ`ÑÛAtC˜‹@ÈhÂC¿Jcð¯ß÷"¾W`®"v¾IPb߯!›ÔÊô23“¸ }/kñ¿IJ‚¥ÑÒÑcðjÕК“´ Kš[Œ)c»ªÙ†j˜íæ¥Åz­ÝjòÒ§‹Ô :: ¯ßÓj‹¶aCÕ؈da}4¦8h¬m„F´“©×Æ!Þ®oS·éüÖ€% de¤Î‚04Ë›ÊýRILæFuLgÓÞ¶Áp£Çä¥)¤©#§Ñ‚Áb´–êJÕ%zˆ;ÈØ„F‡hkq¶ñ“špm¤&ŒòéÕÊÙèö^v¶gÊ%7ÏÈ &Ï–i|ºÇzG=1å£#oˆø5øeÜøLMâ*f?iË9T(lZõ–’Íë-²Ê²:ØŽªY¢2HB»ËÙlMŠ»eÌé¬ÌR±cz$‚‚>ßýÞ‘³'Ž9t¶á2ò3˜r. Y Y…£·GUm-±X ³šÐî‹oõ}ºú ‹–o//*Û^¾l]Þ¨¶€'ª£þšŽÅ];ùLÒ)Ui쥜hHçg†ö­êe¿Ä3m’ÎØ®Æ½€^T,æ¡pÕÊ×íkí °’Ø¡Zc€Þ¢Ù÷?€¾MÓ‘™ùìª9ÜZx½©¸³¦®ÚYëG<‘ƒiQĤیeR®šñŒÆùÛ®úç|€ï-ÿ`aŒ”ûåþäoÏÃIô£@½=åßGʃò=\ÊŒC<5žJw?ª3=$ šÂü é9ÿ;hK33ÿÍì—ÿÏŸ)36ý‡ðiÉÁöƒ­Û®+ˆùâþ˜?è‰y ŽÂ††«¤M5›¥bÉæ‚I¯O.œôºÑj´–tº’£Ê6ÍÅuﯽ¸îäæo…׿«EõtÄ óP6ê›^Þ[°d×â]Köè=:Ÿ®ÝÞ33Ÿ‘¬.Y]¶ºtÒk*“Ò¨2ê­*+(‘6 ‹põ´¯Îëö6œÜ]p­û«ã׺ý¿Â$t5íK㥑¹oÍÙ?÷­%» , ·É*iQ§åA·Íç7œÜrjËÉMAkȲ£¼ê o§q¼çítÖþ³WOãYg²3\Æ Ñ4)€î_# ›þø»õÿ!º>ïîtt@¹Jüœ0AŸ0QxD¸ÿ{á)<; '÷ºÝõð¢™SÇÃú×_d¥…üà‹xà\„©ð½x·v¨kp¿°T.‚‘zt|Ç''Ï5O^ùºôéÜ"P|^µåYÒY{û²3dz%[Z6EÖÔ! -<>Y˜!ŒãA¸÷3á9üHrÓ?þõ"ÎM˜|åüP_V)·-Z¼þ5‘VÀºÎÒ=otëÒ†c¾-ï´¼}èÐI@^úBÅ›…¾…®íþŠ  ‘(dšMW¶r‹J¬A¼Q¼²®÷â‘}{z³¯gHn*¶0r­U®ñéã<žA·øü±¨É/çãx µ`G%ak<iØÁ]cú+¿µi=J¥ÖZÂA…ÃHE¾¯\D‡íñTS Å]a•‘íÜÍQt™Á"—Æìq^ìŠtVôfcEÿÞBSn2)Õ>c’ÇiBIž !ä˜! ål`#[£‰Î!§òÅûO%¤ 7Zõ Gª€!ŹûYèV3ËH;Tù_ŸÁÒ3l××ýæË¹Î¢P7Zùïh¶¨Ü„QsÀãÙ®¸Á'ãJiG¦È¥r+Õwv c ÷Æzä^Õ.@aºÃ•ˆðg+“ yQs Œ„fÃ`#.#©Ñ@Ze—*`jæÚnÑ¡Jò+û¤`ÎYs×ãSgu§Â] hqÿ² qH¥3)É2yÈ’àncâè%Üy)çuIŽm?b> è§/?þ7ž]ÐþØ~a‚ðtöü®cÜ98¼5<¿±´F¾PG},ÂcæVFÜ(e *9)XåUª•í›Ka—f?¯S„+¢$Ð>_ ÿ“2øÜÍqt™M'å§0e!k,nlçòž)h•˜5\Ü˶ãZÉ»ñ4&äì‡ëO)ÝjŽm·ƒ½–\˜JkÕEüßÖ3ny †l€Ÿ¦Ù-·³I4´òl;­AýgÛÑ¶áÆ Éßî¦1ºê~ø°[¤q[”o¼!<•Ž$œüõŒ-i¨#bM Æý·s­QT”‰Æõ}¨å=Ü—uM!QW›4¤E*Ãú6÷Ñí¡Pœ‡ˆ)¢¬Cš” )”W•ÆœGÂØÝK€? Ïd÷á™FsÄêßúP3“haL¸ãñ¯W~Êï‡o{{Ûö=5„¨bt(éÜѦtéxÍ^–É!Æã‰ ø~ðÕ¹'§TN5¨½6±zviBê ´´ñøEáQɳÌ+/ª 7ÎãàÝßE÷5vÖw:;I±Töàs=8;õm/†¾ìoÅR©c¶…l‰f_ É50;Š÷©÷“ þý_ñÀçàÁ˯€ º7J~‰Ù«p¨¸'hmѤö\ ßK*f/}~ ×\>ÁƒÏá#V,Ð_ý góïÀÁXW23R¿)Å}IÇÂÞdBçUñË2^î¨)(ãØDˤœ_¦5²ê•ߘà…e$ PßÏ}§>ùŒ܉êw—C!˜k-`‹Ã4oÅŒYÜ4Øð©í9Ø<òB”QÁÇÙx$^"ÁïÐm>êçWÿ"Ü' ~dŒ€„»ñ Ix ÞKî<Öèm €_äȘÁ­€b¨U›uª¢7 [`Ì8aîEŽ ’@úøñà_çš~»9H‚)‚BüR/àK™Ù’érƒI)Xcüu¡{ –Ýa$3ÔªqKiVND_-™:ãõíQC@N—ý–ß“q7–ÐDDDZeõZ^ÚM¿µ·åMŽÝ—€šµ¿ÔI´òÕ‡–6­4eƪ‡ù{ÝöÜSÂó5N¾ÆEͧ±ùþ‹ÄÃ=pàwönhX¬ÌÒ5k–qËa㛇ú9ù”ˆÌ|7ž4KŒûC=*–2ìÏ “^#[ 5N¥› ELA¿?EÃÎúÎxKóŽÝQÒ#ö´h_áÕVFª³Èo}>nþýóbº¯ü“1Ü X©Ù¼áWþY‹çèNÃg?õ¾Ö^öglÍ ÝÂp¦ÌDFÐyõdÞ$m.éóGc¦@9/´]Âgô[Î ÒdzPj|‚×JJ«tr#y´´½+ÞÜJj&©n+æØŸÅI»š4"AÕ“iþû®GÄ]]oŽa^QÌÂiɬuÓá$An“GdœTúª2TÉÌü©z7×H 弄W1ˆB egºT.5'L£µŠŠriØÖÂãqÿÊ9nFbƒˆà‡ža÷bª? … »Oä:%ay?I·ns]a/ýñG˜~«¥¥‘Ò岘5Nð/J ÏIõZ®u“Rðâ¤rÚN § Õ`Øa mÛ¿ußöÕ®J2cAC8àu·¥ŸŽj¤‰qUsÐO©Õ¼0…–éÍJEМâwÑÂØ\|åÖüíFÍ¢Vb÷ݦÈ$«&3¨‘¦IŸäþ‰ÞÅ”ÍJž™ø÷Æt"à6ë=e¼02ã¢w©]JŽð¬Žô4YÐÚF$[>™Î·ã Ïà<ñ"½s@f¬¤]V§æ6ÑjMÞB‹ìçB7]Ñ/ûƒBg¥W3ÿ{’ ­OÉßnšxsÂ÷ÇÞ]ŽEœ ´1r}?rãüèxÐkI€ÿŸ*™3¦«S¹°Z©.Rí)n…í°M/Wö×Y÷¥ÿ(²?âi™‘¤2wÉI)L§•›T2Gyöò»B÷RšýãÿGé‰4Ô“Î:þŽ‘„8DÞË1>ûXÕh"Ñ„ì+œÏùhœë½ü½ëÏÈÍàìi`#9a” '‹zp¡¾}Ÿrº½àžKÖÍZ9á Â&«¯Ø/’z*Oã‡{ð©_…>RQÓ2wK™r§š+ü¥Ç+ÔÖÛþþðîÍ(ñ÷¿k5+éÿI €°ð_gýþ"cÎÔ«ò[ñ²Y¢$“cAÒÉ´X¥œG«´…2HªŒM]º'a''L¤ èDx5@½XS8ñËä|e¿ŒaD_=þ3•ŵÉd<ÜÆ±þc ¼[¸—ൢU«n)ŽÙx~€à‡iìM³a|_‡dwùAë@WqV‘Ûx¤°Ø9ß_Ö°.-èËî7¹.8Uëވخy­8tºâ1þ³„•œŒöJSQp³k+!8a€ìa2Â=ƒû~ƒ^y°JFfê°:¢8‚Ø"Kª:\Ô¯³ÕüCŒÊ«Mp1ð‡\Ñ[g›ŽW¥ñ0ÒêeÕø!BΓh©Ñ¨"³E‚ÿ½´ûÙã«>Ôûù‘/b¶P1¿¢Eêmˆ=h(/3”ZhÜ·Ç2<çíL$£–žþŠn׺UJµ”Ë«ºDZ¼¨ùõÍGš»’º’°¬mã»Öƒ°z»RµßLæÇký¢'®kRó¿!ý=i n禒¶ZU*6þ¨°†~f¡¢pó&×)ǘf[¸ˆ{’VêÍŠ[ƒ^X™¡ÅfÊvOvª³¸,NKxYAdY`yxYë´‚ÐJžÄÓIï‚&wðMÿނعØÙø¹ø¹—¯ÞWçC" “<DnuÛoåzt?Ç(B–$ßNÎÅçrÛÅ $!Žsühš‹·ßÒ1<ÛMæ¬fîÖy².’³8¥ å.éaFAä¾:í~8^_+¾ÃvEä ayb‘­wk¤*‡ î”÷|à‹ÈM_  øâ)u£’$´ŒdG-ª¤“ô áìÑí³ì¾ÓÚ^‘Ò‡ËàÎ P±Õ^nZoZg]·(8y‹5Í~©¸V©¶K Ÿ$ù_ˆG Tk±LR˘L½Å°dfQo“]_Bk¤D_Œ„~Fбˆ'×û¼žþ£+ÊÕ‹£™C×ÊÃd dã„n³ÏÚÛì#òH»Ü¥áÅÐôS¶•6C«Â=ßUPã¬t‹ÌÝAwS,m‰¦‚±‚úFg} t"Ô”hV»5¼E³õ·[;iìDÆÕ~c’óÓ/=6ç›\?ð#I‡Œ‘#HŠŒª’Tu”¤(`wÛ¢Ò‚ˆ<¢ˆÈ=&·±ÉB:•²'“¼ë"@L f—¹czdz;¦·Î)pZ‰Z†ÊêÊÚ*ky~•rÖ@¶ W€Ó)M¬L¦Ð–®Ü³é‡À^|Oûï0Â× œ^G“PœŽÅ»øª„¶^C”=E AB½•Z“‚@BIˆ”k§ç ËÊÍ­¡­]â¦ÜV:EÒA$úJBÕï«ÜÐ"EÈÜÜ/’ŽödîŤ#çÆ–ZU«Ôéïœ1kúìéÏ)•åF(F*Ÿ®™ÌDt§3å/2íêF]QÆ­<Ìî;wíìJŸ½p®çlÐðAu*êUœð-­‘“áv1#skÛ’Aw'—giÊ<çÆ³šhAYÏpƒ²›f Ø8dcÈà냎 æ–Ì«å©*ø·ÿš£ endstream endobj 115 0 obj <> stream xÚ•V{teÏ´˜|€«HÈš=Ç êîŠ ËCdw¥¢¸ hAŠ<Úb[ZÚ¦mš¦IšÇ$3“›ÉdfòNÚ¦/ú~Ðb©ˆˆˆ/\Eð±î®t‡³î=NÖñ¬û¥Ò}ý·gÎùÎ=ßù¾ù{¿K¨fÌP1gû¶ Û6þê®ÇÖoÛ°tÉêÙ½{3wª2 s2wå’mœñíõ9™›g,RÞ¾åºÆ¯qÝU*býMÙõÇ7fWí¼ªâå{óçªn"ˆYÚ[îX¼r톭»‹+MÍ®XÏþƒeeK—,Y¾üšqÏŠkÆÊ%ÓÆÝÓÆªicõ5cÕ²icúúªéë¦ÿ³júÖªé[«§ÿ¼úž%‹—¯«ª¬®¯+1Îß\U\b<<CÝþв¢ÿÙÅ¡Ì\¬zCõ¡êSÕUW‰¿æ~•óÙM0Kø üGž!RÍÉQªÕ bq9§$÷ÎË®#®ûZ]«9ŒnŸ9gæ¥YÍž¸á[bÉîÊvÓ_Ò sµ§å{?×U3ÕF8ŒêZ̽ƒÝ¤6ÝÑØZGjO³Àø@7|›óµ%êïû{n!»ÿ~ŸÎËÒPÈ)0!²]ÝÖá³ Î^î©Qf}S©w–P͹կÛi`4~J`…‘À(ŒÁQf ¯ýB$vqnÒ¬6ý)§ñ§Ä>%ß”¡õBO ³P‡Âà0x5l3cgš•9ßPzç¾| :5ÅzÝàFÎ0+’q?þð…›Õ)H±©ïÞþë «º¡ÊŸÀo@<çãò¼Œ¤Ç¢±Ó€ÚÕ"”@æ=úæ 5 °>7ñ§•+ùiš¸òZ®üÛó:¡h°ò\†ä—áaÀ‰ÞMºÀK³û^ûò=`¦•M QB‡ÐqNvêa>â ts¨‰4‚«ž¶˜‡ŒE€”9w(k”y–þÎp††‡†Ñ9©ó9hã,Uæë;Ûäi6íÞZ°PMe÷+ŒI#mï“¿ÿ[@'ÚóË ØÑ‰¾]®´\–×´ûæþù‚Lh??ÈlÖ)7ÛîPfƒ2Öüô*…¢êËð騸«Çc÷ƒîˆ›dÕC»¼Þ’ÇÜ¡Ûb>7y*ôr‹‡ /èy/Ï ½zfW_©ý€¯ÆÎß®äë´Wïœÿì7€F{jJ(‹}¿Âîä,z!ö]ÞäÅçs3·ÕKŽVÂEhûJôóS/‹T€"K ¡ÜºP#Õ‘0@—Ø-tNÊz±;6 (áˆXÉjpÖÑõ+a=ãò¹wCѾ‚í€\êBÑ9†ëêÃãï·¿ËI~ !z¶¼ÿy?”®lÚÁzYxý”ȈÐ /x§ŽƒààìˆÒ€™jðXŒëþîCž,|‹‡¡DO·$‰¡”­ùßÿh­+í3e6OuÊ>ù™Ì:]O™¼õ+…zÛŽº·)†b)@¶¦pÚÐÕ™êMÙb–2ë¡ÃeéÒQÃQLwM<y3ùZÛ{ú@<˜àȯ’*‚‡âk’k"kNŸ= ÐuªµçÔ;“ï?)Úo ·âctµ«ÆSS¢,ÔÓMÞ&Ÿ;­MÃGNzÞ‡èÇÉçp³(Qœ‡l¿…¶67=X ÈìM' ¢†ë voÈzNH ¢P¶šÕÚ 'ÆuÐ\ao|tÙ#Ëò—:mn«ÃÞ$F™°ÊÒ¦™h Õ4ÕüS`fkkK‘¹_¶êX;mgìëõŒ•i+*,š$Ï@ú\|"4¢çxÜAÐø‚ž€LŒÍYbY=³¸ÛZ Ðî{ÏÉv=á#ñ%!Ô‚ËBÕ‚KžnfíHÙªõH}|/ŠhNVL¬©S~ä¦D6Hvt’á‘–WG B#gC ”6?é.ËWlzÖ͸À6Égß/t“Wë’/ˆC|•›TÖšÚMòÃÙ ›ÙyAk– NëüêXÉhí8æWäü//>ùá2Cì+-?è}ª¬·ßJ³²“#p2!JLD®œÔ*ÔY Pd-r-S¾Ò{˜šæ&·Ûrª]¶ÉÀj€мÅÔ¾*øÑ6¿Hûô 1ƒ€ÂA)Œ;`}-Ó…s"'q‬Õó©`2B²$ÇtL±«ØQbÎÛ£äþОêG ¼ÆæÃ\xHþ¡>2,´kKtÕǼ±ÝþRðåó iŽÈä5Ÿ]ÈÍ,ÏÌÖÙz T#K–H ôÔ¹=;p_/PånE»v|ù†ËpyxòE>(…pqVôˆ¸vÑÞF“þÀÞM•[m«?{ÜÑ„þ0"¯•göŠSÝ8ÖD%~8÷®»>Žš2yi"³ëœ¼ã¥ÜLDþRçS¿´³w¹ö?yp=qhdäå6W©f½@#wê'úi@m‚Él€z¯ÉczHéÒ³.Œ³5Å\q’WwòBJè|A®Õ·¼}þÌGGCe•8`?à,*T¶`î`œø´5ꌓ »Ÿ—éSo¾òá»~$¨C%5Prò”™°Ñþ@OÅ\€SŸH/c8Äl™ÅÌm;`|¤WÝÌy£A¼Ú„6±µëcWà"zó‰¡-d>l:Xµ3›sež¢ìMËySyÏÌÓ™—(?Pr j£M#¨£«åH‹#Vc¨ð4×`,¶ž9ƒþÝñßw\Ⲛ-¡Så}EäCðÄJÇQþ ¸äŸBœåí`‡Ò¦JGy}~ÍFØ„xvÏ[äiîíÌÆ:¯âÌn¿LË•¸>o“Ku¬ƒÁŸm«ž¶2VÌn{†‹N’!õEdøãþ—rÕ3G°rõG¤¾³²ÃŇ²pQq3Y N‹Çˆ)22vS£©±Ê^‡À˜¤ûPPGÓ#0‚ ïÄáÞ"Ø ë¬;Y7E9EV"ÃÀóœ$tê£O¥^ÁD“ ÚìØWµŠÐ£/Ö¾HÁ`¨'}­Ã¾kí)½ýÉëºH=רfmµuy:á ¼<|äxxogédV¿¹lÁÿTG±+‡¼-xt i 5ØÆ·\Ûô\(‚0JØÃ6<&Ô°îzoíŪoÚøPÞz@Å®á^‹‡ÇNÈ_;íK:$®pªÊ[³SÙ)‘mðšmû·ç?–Åðqçä!¦ážKŸm=ŽõÀ8/í+!7ÂÁ‡Ì[§RàF® #‘­À¥ùd|¢ëüÉìDey'çȲ}#ÕàmªÍ+þVïu“{.b@ŸèžÈúz™úÚ(”ö7Ì•¯¼!G­½*ÿ —»Ö[5hÕ©ÕŸÉY#/’o!9Ío Þ_DÞ Vßëu³¬ Ðêp_ô(ô#í'JïÆ…y¾»|Š˜¼hJƒÚÁ×L"íÕðHêÂèÿ!C¢/”YúªÎóè^¥NÑáq«þ…“†°Fº:"ßúù3ñ`ŒÇƒì™¶ü½Àc¶B74´e6ûå:Hvª•½ !gåFî»~¦xý,ÿõ³?ŸõìlrŮ܆”ðí¼¾.³ endstream endobj 117 0 obj <> stream xÚ­”{LSWÇï…ŠgÊØØÖØeÚÛÅdSgu›™-Ž…9  ÃCP*\yh[z{[ ”Gé›_é“RZ¡Ð"­(ЍÀPD§nšÌ8ŒËœqÌ8c¶d‹‰÷âÕmˆÿ8³¿–“|“srŸï÷üÎÁ1ÃqüÅÍy™[s>y'5=ý³uÓUœãÑäTÓö Œ]ˆ³‹âXq<»@ ¾³EðwbÜ" Ãã’yż4­÷_žÖ·yIXó &Àq¤®±¥¤¬Y‘’²:UQYM•—–Ñ’%ÅK%«Ö¯_»\²:%e½d“Œ¤Ê‹¥rIº”.#eRšïì—|¡(.'éjÉ’e4]¹aåʪªªR™j…‚*ýpérIU9]&É"U$¥!K$i 9-ÉÊHÉ úŠMUÈ*Õ4IIÒ%$%çYçdcR¬—áZó=ìcl ¶ËÀ2±< Åa8&ÀFðBü8m¼G;gkMbÿ‚~öáIœÍeÿ¶Ø[Nº™ðÀ_‘Ge*j6Û››À†ê[­nq8ÝŽP”Ù& 4@µøñ l`Ôdp›D6³Õ&dð˜¼ü¼—»ãóî!?³Љ„>{³«¥ªÙ‰‡EM¤µq1 }zÐ6C}… GÐÏ 1¸nò!h„JBP¶ìsXœÐN»ÓáCIì}Œ%bøð­xv!›,lêgâæs 8‚[²øZæÄ·pa¼³«3í;›F!2èíè| Nä¶xÄ `3™¨ºlmN º)# £õ¨û û`ð²³³ë¦ÈÕÓ6.ÑzëÅ: ôæýèS®W˜—–£Ù¨:GÀéèÃðÈ¡+cC£€®†>n ÀB-5)ë À¦/BIÌ“JFx¿;Ñ=žŸõh¥\%S¨ôêéso=ŽîàÄf¹j^Ï,=ÿÛ)FÒî38ŒÓ˜F«žþ`Ïžb@ ®(=žÎöþ¨/Ú=ü“¨5â? èlñ±ÜeRNRßä±xÅí`w;|±ÉÑh €Ï¬ @ß\§—ñÁmâŠbì&Ý$C߈gWñP!]H%S*”Ú ¶§¯7Ö+æÈ'ï uù[2 tN›ýpÐ…VÔSÝ®‘WRäqê’ø 0qƒ}Lâ=æ‘ÈáoñB]Ø}bû›éO9ÚÀîðû&ÆÇÏêö×UPgåJzôÑìNm˜p݈g ˜uBGÐ7è:|îž_‹«ÿêHÿÑÞ~/_ ǻԅ¨Ltã.£²f³©R—)2×e`FtÈÐ.î„ ßãw¸½G]Ý‘_D³û¾{¤¿ìôÈ5@Ýš²¥Ü\íN½Òj-Ê:­þý™˜Uë¤$ ¨Öà‹ñ†}ƒƒ#Ì\¸ˆ~ÈH§AVé®tÃí­9PµÙ©ÆË;cP”¦¦\U ÏçÉÓüž^ÿXç7C€zÝ”š€j³ÖPa3è¶YêörËD‰Ë¿ùQÒ”h6öÕg’y¾£m~}˜ þùŽÖKKþÃÑÈÉ—“Æ »äB)Ptí~ÞEÞÿá‚ÔÇ‚÷˜ô{Á~äWæöd> stream xÚ]P±nÄ Ýù WUUHªvB‘ZNQ3\ZwCGNŠÔ"dÈß7pÑ lÉÏïÙ~.x{l­‰P|§FŒÕg·…Ðãh,)+ÐFŽÊYMÒ“‚Ÿ¤ïä„PtüãÜuü$¾Kút½4å+hn”Ëꪽnb#N­0FŠó6qŽa…Ûv=>$ì3h ÆŽp¸r‘±xÿ‹Ú”ÔuWÞnRNãì¥Â 툄QZkšš Õÿz»¢Ô „=¿o̪¢/™»£I•üÝí©%„mo~Bv”–‹÷?yç“*ǹ+mX endstream endobj 120 0 obj <> stream xÚ5oHgÇïIÒô¦™n£Á„brë‹Z™¤±D×::aˆÂ´të´/Òx5v&Ñä4M–™3‰æÏ/§9MµíÅRޱ±­no ƒ qŒ½ÚºBÙúj¯ö\zÙŸK³ñð|ž/?ø~??Dh4B¨®¿»g ¿ÿµî¾Á+­ÖŠsÎõ÷¥g”n‘L„dF¥’^UK Ó£^Í?:U#A /W´¡¾¢µ/)JœTD|…8ŠPMƒùd¶°3N{½ôä”mÜæñ¸}#ׯ=c£†vN0~/ÍX­m«õL·{ÂÿܧNÙ›©ÖŽŽöêŒÕÚA]pÒž1»ÍEõÙí´1ÊgœtÛÇhÆO:ç`˜‰ÎÓ§}>ŸÅæôZܞѮæÊ7Æ8¨ÚK{¦éê-·‹¡úmNšªÂYªO·Û91ÅЪÏ=B{\ ‚PLjfâu…d›øÅP%­Š@„F±wQ#º£zOŠ×•Öq@D‡V—šp@¿¶‚à‡€¹|_ðƒÏ·kfe([”ú„›$ŸZ2âOôò0 å\Œ³³aÖ Q.‘cñ°|Õ +²‰DìrxÙ”ŽËçñ2`»lç’Kó<ó™lÎ ,ÆÓINníWöðE|Ñæ +i>Å-.™‹dC¦Äb,K*%äF[ŠÒ®PíÛ.=ÑçÒ™4䫃óŽÅåòª!‰G!a>º:'=W +Q€Ìe+©ÙÈ”œ4H|ÙWež† ¹|OœþŸùY•8•nàŸõŸŽîMÞ Ž~øþä5ùW½6pó¿9é±vèê»m0C²+À+°K°˜)Þ¿óÍ÷¾Ýßþº°Æ§RÇ¥”x®r’\œ3$RÉÔM^>.6=ü“’©€œ›e3{g¿&˫ۿ]i"ÅÏw7J½÷ôÅ>ÞÜWK†RTÿœ9qvn:d_Þeí!þƒÂu€^çõ®‘ÎùV°ÀÛ ÷üzžé‚ÄI6Λ °°ÌoäÅYGNܜىlÖÀg¿¯¹õÃÂ!ü?î<{HÊ®òSýÀõð~ƒÕïnÿöpçs`knkŠÜ±ëï¾2 -ð&\õøO\¦/ÞŒ·HÖy7Kolhåã¹£¦M» {aIW“ÒÕŠ5b­xK§Sî‹øÑ±žm endstream endobj 122 0 obj <> stream xÚÕYyx“UÖOº¼ïYûN†ª˜TEPQ–V+à°¥ØÒBºRº¥{Ò%ëÉž4I÷nIº`K¨€(ŠòÉ"ˆŽ‚30Z•?á¦sùç¾-õcÆçùœ™¾™?šç>oÞ{ï9çw~çüN* „Bᤨå+W¯[;s}døæ¹sÎãŸ=åŸ-ðÏ ðÏ ôÿ*ˆÈÈ™©Ìëy:ø>@xu2ÿ©˜È®D?Òqxˆ`ŠP8–›úÐãó—®X·5.%[®±T6¹û|®ÅìJH˜;gÎón/ž|rt1úäéŸO.Œ.Þ^ÌŸ3ºxjt1úòüù£‹Ñ]óGw-ݵ`îèâ‰ÑŨ F\0jÆ‚s2bOJZVf|zت=qñé©aá{’ãÂ^ÈÉŒO‹û»/i4¦L<.˜#ˆD VV Ö wb˜A² 5 =8OpRðà¬àsáÕ€AÁ×cnÒÀ¥& & ¦ fÌ<%˜'X*§ûŸ¼@ÏxQ°\°R°J°F°V%X/Ø xY°Q°I°Y°U¨j„Z¡NB½Ð 4 MB³Ð"´ mB»°\è:….a…°RðD€@(‡…„?$T>4>h{Pmðòàw˜pæ2»ƒýýiLÔãØ cmw=r—}Üòq]ã%㵞™Ð:±dâ“ò&O›|:d7…sýªT´ë×SýÍ”ã¡ËCoÜ ÷ߣ¾wþ½xÂyg=¦¾Œlÿƒ¾ècx·7ä‡x žrÿ Îûƒ?J´,ú¹Ép©Ñß²œ§ÁŒ'ôEâ›xSgÈ/"Ù‘ïjoçŸE"Î[LþšýöZËyqÔ7—fÈe€¤-©=b3Óejlútž{¹x:Yi…$MøQøœôbC6ž!~ŽgâGñâ]e{Ò íìH8 ¶2ÝÖÖ}Ћö'{vˆ©é‹\Ut “ÕËBà‰¸Oæ.ạ‡D[•1%±ÉÏ­.$yzr×ée¶ž–½'î£þÝ/Ì)ðsdY/â|9Æ£ wI J Ð÷fˆtv°NÁ)Ó)Ó{•×¾‚h/jÈè‰QF^Ö§è“!­eÉ]¥d" “0ÝTà Ô‹À…(\ážÂÓýƃþß ­ei²!K=½àÑ-랊ʉ„`^ÛSo¿ôñ<^Ї~ì;ž‹Ì¬Si‘‹K˜0i‹J "Á$–Â⦗E,þ .Á§åƒï¼sôÍOêÏ„/æÕ?`Ì 5ʪ @Æe5;$XΖkrqDGæƒJíJÓ&ïšú— J T‡& ÅòÈãs>Üâ ÁÓñTÎ×;´X}óÖÕ0–ˉÆ3XÎ×AqÝÒGîÆ-L?ÒTn4Ë dȇ;£Hƒ´¢½2iŒv m¸O`Þ‡+ºžÈÆxÓË«ÈǤâ²` mÇ1“Þçô ñCxj {h©(Ý$AÑx&ÛNïx±ùqÌd5tK`Á'ZÞ¾!QŸQFÍ;ì׿ª{‡"Dœ›šxÍ‹ÓJʼn —…,çn¤‡„ö1EP¨+”d¬—ø;Ùƒ›û7؈ëȹÐÎ8O|G<â’í%Fµ …©´Z«$þA¶®×à{®ÚGø“25Á$4†qA¥ž†ÓÓ¡‘In-`oÝïO.psÕ†`ž7n¥Â—ž=ôÄk!§ñÅA·{õ£‚àp½»O6Vª¡~·ñ£ç¼ÒÊæxÛªŠ'Í9Wt,èÓsmïˆ)ôWÔ¡H'¯dbå†j ÞÎ:4öBŠ]ö†\@Z¦ÄPì(¶D7owl¢ùI&¾BfJ`Áñ&aÁ6üL‡“HP1û†­KijLîÈÁHg×Ùtvdae¦bšNê2…„ÄP`KÌ%åb8*­6»=”þÙ¬å|âÞ£übt™bôÅèÝ¡…¢lRìcŒ¯›Oîëñœ4¼ èí[—ÉÌh¼šé¡ñNì#3ý—ßfÎÀ'ê†Y¶dS‚!‰bž=Œy`-§ßÒËB(ÕÆ»¨@SVE¨À^T'BLmµAÂ-­Íwd‰9E)MÉ2@·¾eÔ  MÏfnMQyq3~Lê qcÇã@æ%þ9¢&Ë>} #oË”$±d ‰Í ¡‹¿’þAò&¼Qí9`¶Zl›±PSh-¬N<¡êÔÂÔWëZ‡LRÆÈ  n@8™…]}YýÞ sÚ#e0‘¨ž–p—’êSö{öµxÄP[Z[àDx‰=Î.߸ã¥èmí‡Äðé7í9œz8 h$T^ÿ¯½X#Ò Z'vÑLfiÑÛ5Ö©R$·þÌÐ9á~/ç(ÜÇáIðlÌ=ñ-yL² 6çÆ&!<@ëwË*ÒìPïÚ“˜‘¶«2+z±ç Îc-ž‹]Gh v„…Kö²Ã<.å+'9¡Rõú'÷ {èÍøü‹ŠŠÊ ’ê3ºU¨«µ©û cÝ!ÉgÖÃzùöÄ51)›ªÖvÅÞp>ó<œƒ‹-îÓ&›Í väTJÅ4L ÍSÉ^Ý–¹™$ÃAW.W}‡ÇKê¡^[§¹í¹²«0Û¿÷=„^+np‡ðÍaïm#Þ74¨RùÔÛé~¥b3=(„Œ}–Ì$~÷~Drj}nÄlÆË°¼G%€2eæ‰ÿ/4ÄtË.:Ä~\y÷C_ξD“Ú¤Ò+Ég¡L§T+whOì+{^Vdµ¦uêö«{yÛÆ†‡«zñêü¬WØI-+ý*ÏÁi"|Š©¶Ø*1³ö:™#Yk £w¿üjÚrXŽÈSxJæÄgáãæîS»"Œ ¬Î)7Ópê驯nÉÞ[akíÞ¾ÌníAèCAðši ÙÓÐî­ê‚¯¡z¦9‚‡eûƒ·›+ÀÓicöÛ7þ€Çqû1{G{Íà[è~¾‚‰ûæÑöŠ|düÃy BW•è°ýÓ¯Äf°èÌP”_,‡lÄíßÕšáö6µužˆjÝ,‡¹™ K‹Ó!ÒÐHg$ÛrþmÑ4tAÌ—†í{ÒKÍâéÿ=âXZózðÖ±\GKã°,×KÏHþŽåöñY3‰Š²gpé\àBŸ»ò¥¯rç*1©§Ž ¿Ô;ú’¯¶;§=u`­u3D²èÌ•:J‚™‘´QõÐ*6L'žˆký[D[Êv”Åì]›ð,uµë÷ÇÞ|!ç,_0jŽëé«9Çáíì“;û7]Ró<å÷DR#z‹…ýq¯·©Ñëð€¼ŠætÏ.}lC ,ìÐlÚ“™_qW•ÙžÑ ûÕ=· YÇë’µ^HoH^NilTÝ tñqh`¹þæM’ä–åhòxF]\Ǹ÷¼–߯AN‡àÉçð“xÂü?“é’õ°¡`Çntd¸Â©žO6¢a{Kz¯š²‹¶dœÏš;/tt£Œ{A¼"Tò¸ž ‹¥S8ŒÒ¸ /œùÍÌ\[×m`š¦$åÁµŽÒù>æšOÃH,/*˃<ĵIÛ3Û;÷µ¸®oÝ&^ Q[ Wè0J„*^*kŸF{É}´qöœÁŠ3TÔn¥0<[º0fY‰ßºdz)R¾]/7í½HÕL°ÅL¦¤HB&±P¬/)×R5Ñ5U´pX”fmGN—Ú èóën,Àos(¢:ª‚éá$zçcsøux3DZѯΥÕÌT­NÉ·¬]c—‹©F†üCAyQfÊ6fóz¹ŒÖ_Ú³©Í‡Ö:iÿ ðJ}x½,ä{íÃ|ÜEüÜÐ$Ñ¢d<ˆ¥,÷Ég¤–CjÍÞÖØãE€Þ;µÿ¨ÔUÒ2Gåd‘¾ Q¬bõ¦Í¥‡ûÅTPR :à#3ðzö§6tTˆƒG¨8ÌŒF¶j5ÖlDÔ,a?ˆ~Wg7•6å&‡~Q(Ž8’ÅddÛ$þ1ä~6®4˜Ò½¥ò‘¬gŸO\6W¬abâô—$࢒¶ûô-zß–ïUgûö ›ý«E1GY+˜µ†2ODèYý3}³Ês ²NhS­¶ÿ‹¾/û¿Üw"´¼Åa h_ÍVB›ÖP‚4,(ÕeuBxÒ²ÝáêU‰¦„ˆpGèQß4&{XìÒ¡aä¦&þ¦·Y{RM‚3±{Îþ¹žÙÖ\sa ;Ób´ìw4µ÷|Ø|gLýΪîgB-ùÖpÞÌq¾YU¼è. Y12匌`¼ôæÇ°~ üß1¬•“ˆ¾0:!}F3?{|ÓÇü'žÿIÚ~´+b¥LènŒ“/û‘Èæ³tw¾„%ƒåoZŽ6ÁäÔXsÅ) -HT=Cîµ®|pã|#Aºh#ë Ó1Z‰'Ó„;SóÆÀýõ'iéÅ÷Nÿ™-^ +3¢¢Ð‡ä¥¹s ¯—f™:вýs:ù Ìu{(3éâÐ;ÕÕhò$äK6?W“#–ƒBOU6—&¥³›oT÷wR±/ÓÓ.¢b C…Lz¾ÌV—ë⦠ÜМ÷Zºy£añäxéí1˜ÌïH½þñ!8¥?5ŒãÃ?]]¨¾F“+"PGY,+ÈWî”Åä’WhÍ0ÔŸè¡ê?§­i¿¡‹j»¦^Óu¤#Ê‚$}”y;½+¿"§c}Ü™k¬1Í„ð,©$6¡ê:cØ ›½µþÖ#"W]M•³þÐg¶¯­_" æá‘»ÒTÞ ÆÁŒË®¥³é×l^(Ädñ°ÚU@ê妇ÁaX CÙfn§8qní )ÿ' É< Ã?…LêLer!W¯µ€Õj3™{Þ =ðîÁwûOYËm凞xC rèN꺾ôïv2Å4Å€²ó~)Ú\µû!º-KL&§43õõºb*šÊh¯‹Z´aÁÚgËŠK‹• ö„ÖÔké.ç»25Á?s•jª_öR*¥úªmX<ó¶*(vH–g¬à`ê_«j¨CzÆ™_Qè*hJkÜÓ”¶/9Ô¤¶P1‡2•3Ré,çª3ש`¡ÐžÕDîŇæ×æ×æÕTX]WysMKMsM¥£ÒUmotµ˜[øÜâÚ^Ї¥0V—ºT…‰yEÅkcÖÄFí@øI¶¶öŽÀ¸Ü´>·eºXê‹ÆÓH¨Û—›Òä¥\5ž6L“òWj©«ÛYXª{&?¼$¦0n =ë²Yj©6â¶µeíKŒËMMYu4ó ø#è<ì<^yÎ|ΣØ*‹¹^üg¦Ê©Ë‘/Fƒ5 ,ë³ÿ,¬n^ü Ù·ë½þqn!<ìŸz=°ï¶±NžÓuÕ”Óä·lšT›..‘R±^¤K m=¾Pž\“ìJ¹»ãÅŽÈöÛW„ZäV¯ðl‹³¼ÑÑXÞø N­ì¬q;U2r¹¡J‚Y›ÁZ.63§áˆÆB¦«ˆðà‘9‹lñ$PÑçi ­®»™Ožf¶ Šò¬ã#è(Aæ[!”j ‹deù“6¬V"5SņC•«²Z©¤éÈlIÜ•³'eñÄCâïáàÕý¿ O>‰'ÑOç¾ÐZw³¾¯‹Ù :ž™r‘–…2U©F¹„‡*2™Å™¯^‰¿ºós­Ie£X£­F_¨ÊýàÈð3œAaÙøiªzî,%×±”Hýb¶ú cï¿$n¸Oyâ_çÿA1)…ù›{Yk4r-"˹’„ÿÀÖð[Ëÿ~ë…Ó¿ÖŽwZ] ÙbfÅcKƱŽ«w×·cß%^0V&u¼üã¯þ §ãDx endstream endobj 124 0 obj <> stream xÚµx ”UšnEE\ ¬0é¢ÕÚeZP‘FDEÔD”AÖ‚Ú«23rß3++ÿZr©Ü*÷ÌÚ µ@D¶),A-TñaO·Òê08­}“ö™w#©î9ÝgÞ;ï9s2‰ÃÉŠ¸ÿýÿûÿßÔðáTAAÁØU¯,^0îý‹ç,Yò›)="ý6-w;•»cXîÎÂÜ/†‹ëÄ¿ÜQ4÷ÆGEwRTAÉ­äJm#]íc¥ë}ärgi UXP0œ{pÊ䇟­®¬QÈ7ÕM˜_½qS]Õ„%êšMBÝVòË?ü…,wë$êaS†Ï¤fQO›CÍ£^¢P‹ _¥ÖPk©×QùX=‰0Šº…*¦ÆP·R%KÝFɨ;(žº‹º›º‡ú55‰zzˆšF=BM§¥ž +ͦž¡ž¥~K=GÍ¡æRÏ“U_ ëÎ'+/¤^¦^¡Q‹©%ÔRjµœZA­¤VQ¯R«©×¨G†QÔ0êó‚» Ö8‡&  ƒÃK†‡_+JГè43 3?¡Ž³F$FÎù㨵£ÎŽÂ£ƒ·Œ¿ÅQ,+6)[4Ö}kÁ­_—LdG±~ö§ÛZe#dþqÓÇ…qç/\¥«Æë~ùà/Ûnw{¨)sÏX“-Äœ“U$Êãq£×Øf¤2h´<Ôî1ÆÍ†m§52eÚmò2­Þªµ iCš8‚`[л#Þß‘h¬pU@R3.;ØÁAm‚‹A(Ü…¤®LSGcf‡Ð«Ú¡ Ú‚– x(á¡ssPå¯ ÕEjƒ¨™ÙÙ™Þ û"^ˆ£ˆ!ªâ `´mªrU…ÐÜ!-ƒb ›C@)cDàÔ`л4ð¬i]‹ŠÅJÜFòZ¹BÜÓ"³m¨©/ÓZ'  ë"®¤CÑÀîíÇà8:Vwt>WnWÕCÚÖQ¿“óù4¡b¼ Û$”°&LáF™Þi5€©‚¦‡{èT0å!lm×6#1@³³m`m²Jy»ì.TœRâùŒ(Ä­x¤La¯2ÀFTÑUÝËyé”§'ûÐŽšîr®Ø4󸄒#ƒx× {»nÊÄ ÚEâ3 –ÀËþ™¥ÛŸ{÷éËpNôžÙž ½À‡ºÏÊN#öâ¶“Kúçb9 Áå$ÊÄK²0Wø¶?î"7øZ|Í>@Íô»°g~rex£o¼÷lŸºÇ‰i‘‚ü‚ý,*nÊæN“-[ ±%§–ýüăLÙ QûÇéhS[;´£˜1PÏMÎ5Ó¤B^ð¢„%ªäê QaÖjʪ¶l0›œ†f³ÃèpÁˆœŒWéoˆòÒ»ZwF:2ù0®lAnÂ`an€L4ÒG²ÇNè?yÖsù<úŸ.ˆ£¹ÇaÖšºYCƒt¨:.tdbÉ4a“üï芇’íO  —Ö<ÌÃÝžzqiemU]eíÊ×KõÁ T“rF9ü{:uw󻘤=Z£ÒÚk¸bs·¾‡WfKr£7²×ñÏø_dz„Ñw÷šñ‚X,L¬Ž«3ÑDška= ðø{>&ÁGÊæE¨ùKW.tnv, À UЏÐiš½úág«g=ûü’'øu°2P¾Ýá¶z]>ÒÕàó àÊ1 *C­B¤ðí/]ÇôY<†oc¼Ú¿°KªÏz%~*›› ”às'I?|ˆgÉÄ‚…Á¤V IþͪöÃÆý€:Ò­Ý<{(¥õ©¸pÁe: ÄcÆ ‚ß cÎd5WFo‹RWûú¼Òå3–O_6Ãj0@‹tL]Èœáz³2\…(`¤¹É½OÂ’®G`Ž=÷ßžºÜìhzöÊßµýeeÎ äFବ‘Y«X[¾®¦J]©ªR¿´±TgQšA £píô}_½|üò±÷ûJC¾`D B0Ê7¯¯ô±cŸqÔè3úu€´=,!in·œÙXšÝœÝ|zSȲ„m¤¬¤¬3³¹»É@ï¹2 ³Œ+’Œ*utøUš­ñ€×å” †b<»'©õ ¹ Yæ§R<ÎüÊN²ÁxAkVòl:hHqì2M@WéL0‹‚rÞJ²AcÔkˆ>œ»µÔü–í‹-nTM—M°×Ö‰c+ıUâÅý¥ ‡ºQƒþŒ—½ƒÞ£EÍ´wå;b¢ˆôVeñÚlɱjpõ ûãrGd?+AkUh†tt6uøÏf¾G0áãåggG›;Õyd/|„®Î<ó 'ÖÓJ’£"n‹ñÿú³Q†Ux“‚¤+aEì}ªÎ×j.X±îe;yÜ'ÃkqÃæŽ¾§œÍÃâU¯-²#2.9¶`?™Ø‰¹e[ßXy…ï3Ïg‚È“ïEq6ždG>úû?ÃÃ;µ¿ ¼…qñªµÏƒ8Æ·? _ûáwwïî;´÷8|æ¶n :€ºÝÑ`R抓ƒ¾Ò!H£€+²¸\áëƒxü¹ƒƒìµëù"”1‚ƪP¶[Ò<žr³ðÆ€’_„+ð/i°“#³¡Ú°9‹xº¹/Ò¤)Q§®MPklÕ\þI¿Äå¸ñºŠœT2Lrß1ì— 1­GKõÚÍSDâ º^oV í–/—1[€å#åùLgnâ>ª—)`Lòømn ¨ŒšBuœ¬Ò*äŒWh/ø\Š3¡`@5£Ð›T<[!´›’»s¨§¿Î—6aðËùjº)'´h½Z·vüî{ˆ#ˆ#Š#ƪC†7$|ïvÇ"|.ÜͤCþD>ðšÞœ¤ÔÉê;•K‚ëþY üÎ@C`Ûw¥ë1Z‡‹ÈÕ´£TµÏå€^¢­E© Kõ¾ÙyÇÏâ=g ñÈ=²ƒeïOºöÕ§×yÜpfÞöeéÝË"Û·í†>töìî“Üûðö¦È Þj§|7 í-±(ïfÒæÀÕ€³Ú®Ú¸cud% '~µJdxxð“•_ gt¥I{Ò™°ìVwlnÞ€̼—×,øíÔÞéѺU•NAˉw1r¿!ÁuAK·'ž?¤»ñ ³%ƒxœôeü‘”ûÙ¸ˆVjUÀÔÉã§éRޏ> âåŒxÜ+4û…Ôn‰?MÚÍÕIÍöó´’ô%ÿ#Ó‰p[Fâ(“äœÎbà {ñÿ–KA’ù`K³ø\–$\²k·Á?I£>©èÚ”xôàmOˆ…bѯ>‡c†?û2o¼4 ««šÒÜe:ÞîO¦Qð+s:i Ôr3iPDÕ$xq•x]nW+¸ÑÅS—¯œ:¾dF—LCÌ™·äÙç¹'aݶÁ|îÜ;XF8îV¼T†Ó™ö¶NÞQŸyý@ÙÎÕñ‹·öf²c¯v‚uý^@ÉD´›·}Õ³ ^‚§+4sœz bU§ðs'OÂëN¹…’žS ^4¸÷û¯¦køE™‹ÑiìU)«ýªpý:¡r ¼ŠDO.¿Àýðí{?qÆ û£ZoT Ä$ðDü¦ÚÛ’1}PͯÀOÒŸ8‰óÓÇmž °‰ºUŒt«R’Hx*‘ÀÍ[khØ×øVõŽúž-ÁͰ^S–•!üê5¤7ÛÏ’1̓ìUlÎ12ñŒx Ñ&'X§“Žý, üMgçµÕ bñ¶«[ÕœÈÑćT 3a^Ûe u½PŸ¨ïìH%4_Ì™ZÒàt5æuÑBLß’-Iâ»–ô³}˜Ê羄a FƒF2‘„~Cü£/•OhÉ%úÒbަ ¹Ñ@dJ³ ?4ä‰=#ÿÍ+½p Ah´KI²UÓZpú­~eWi}o}oùWêð4xíÔÄ„ýÁP0øö¡Òp¸=™·ËC^$œò$ ÒF-a'Þñ×áT6¹6 Kðiqšø@þCby‰ÒÖp÷[Z+Øå¤Ñÿ…bïdTNª§p¾J'Ú}É”¾(E6£;UR%¦µ g­&¨“%ð`¶Ä‰‡-éÇc¥/ûýŸsw˺ÕnÅ_å­‘Vi­J2šmzrFìÛÅ3´ÄëäOì÷’]"¥LðßÑÉvRIcHÎ,~˜ ¿÷Ë3w“Äh?,ÙÆ‹*]Þã9-ù²ÔÍãVü·žÑ3'-¿›Ám‚ת ¢$L»ÊbåDmnÓ*CH´tà?‡à<~4W"‹0:ŸÀ=N’3 ù Ø÷ŽŠgVÐlßÿÐh qÏÉpúƒBܘ{I&ŽÒ6ý™'—N}œwÐOz×~jû„à]m?D¶É_³m:Ç~K²' 0ic@þwÙ~}ôç’íçÿ‡l7ÑÿW.n_üÿ`]igS²øÓlÁ¾A;W˜C§dbÕR&?ˆâ|HqÿssïнDš zK-——D¶Š=k«IFL¾G5á’X„Góoû™ô^$Æð¯eAæ‹w/]Éž~q·™=wþ|î xõSË'Ãrþ½xÁ\I«UãŸd®¾¢„=Zʼn ­VÛJ)}¶ã ñÌ "ùäDà«C¢9{ÜD÷¸I –ŸÛ!âj'¦#îé”Ìφ†æc*C_>Œ ñhŽÜO¹YÑ®N^ŠÇÒÇ´mã“[«VHç¿ÏÁßOXñ£,eÙ(¾ã Ù¾Ê7-‡}um×w<àgÅóÏÁ7èíÏÛp{à¤Ý»ËVëÒýÔÓ‹ñ_2)“_ÍéÀbµëËc›[·¿#Ru“yXÞW~P{¾?‚GÑ\q˜K˹蕰:©8…Ø sÚ­TíP«y2fv²wRˆïÉ€'åŽæ”¨•1Bž4ˆ§T™DX{*]o4 Ä"Çù¯E5ýŠ*¾íÂgo]&j­SãQËÍ9gcV¯Un~E³ûM›ðt&–jéâób™ÈÓ¹¿§»µJKÌy±ãý…Ò<–|›ÅCßJ4 T5WGë;7µ¼ á`pg7bUj¶›ûœNF½é„ίâWáAéŤ¼(eVq³%«Ñˆõ=&®§AéRÕŠ-ëè-ÍuA8Žpšé°„k¹Çˆn2 é[qT™•-ø†„v×ûë}ò·Å_•†ÖGÖ×·—ùÝÐî`Ç…ž+]W¶_i ´ú›¨—N‡‰Õ3êxñZIü´dwùí´H‰çE Ÿ/ÚN'‰¯"Ö_.ÝQg4©Qkb(XÞKá^,k¢aUçüàZÿ–HC†Æ¶ÃáËí—×›ýˆíM@S;jfØdR íÄP£ÝG«56‚‚†’^!ö7ö©˜÷·ôØ3úö:¿ìr›ÜRa©´V846µK½ ÷—ž$€Š¥4^5?‘82XòL'½æ:!é­öF¢ú%¯ÕdóV¶Vº+C³ÃO‡f»Ë=ÊÝÐÁæðÞ¶ÞÒÀþp_ë¿ ɨ/%ãôä€ì+<öâØ"­0J6¯,ÿ&@ò>>‰2/٢̎`0Þ¥lU“ɲÞÄn m‚F·Ã«Ê”Vî­ØW¹·±ÅÙB@®™iö·GüÌÎ#“@ÊŸ"ÅM©}jþî¼Qºé*ó¯êz-¤¹0=ûÞ§~( åÙÌfJÓ&ä½^ÞÝ>E²ÝtW Q¨K9È==¾›ôÑíàWøM]e]›{¶5;[¤·íŽgƒPSª¨V’Z^j·:íF@å´œ$Y—hhçÿ=o=’çÇüÄR÷ ª¸bQÈæv ùhq¦LŒ¤gÓ꘼Z/(V¬ÜÏ]‡ÝxtÇ…ƒ¸ä.yßÚl pIÓÑXK/ßÒ´èÝ“7Ðùw, £Tí„D5\=QìiÜ_ÔM8·-™…s_þhóÊ FÉl×WÅ¥é8„*ߘ¶ë‘ÓZln XQãÔZUv­fêù`ˆ! 0"é‰ï™´~}‚ÒÇçæ#‘ì`£wÅ ›¹gÚðì- †Yxjôïè‘M£GýÛÈ££¸W¶É7ª¦þÇmÿ Øô endstream endobj 126 0 obj <> stream xÚ…R}Lg~¯-Ç X¥ œ^O²áµºŒ2Æ¤ÙØJfX‚«ÐµUÊ•£¥Š™¦ðš¨›c&òQ,àÈ\Ü›0Œ‹zì‹cb2L¶!™Û0%æ=÷úÇ®T'$[öÏsù]~yžç}ž @„r!3«À˜•k4nÓþ<}׉÷^Ÿâ:B\/i¹ø¸b=DØc‚»‘œ]À „$DAPU^¨ÕnOÖjuY¬ÃÃÙ,V'³©d3³M¯&‰Ñiµzf—ÝÌÙJLåL®Éi5ÛMNi(c Ø›Ùéa6¥[NGZJŠÛíN6Ù+“YÎ’±9‰qÛœV&ß\iæªÌ¥Œ-w2¯˜ìf&h:9øÉbí—ÓÌ1¹l©™+—ÜR¥„ ”rà œ  x$»ÙÀr@.È{@>(¯‚".øŽØHXˆŸd…²QùZ¹[!S6ðFó(„úX@§•ý5¢¶Àº‹ô$Ùæƒý}°NS,ž"û޳љd-Ëì=°E3„u¤jø@ïþ¶×!…‰Ä$¬Âkæ¶ÜÕ¨¼_ÁÏÎù{)tP±;´ 85cwÞ·þ˜øvâ›á#-I¢u×Q4O\P· ÓQº£^@äKwp O܈#±r1©Qìs>9lÐxà[Çê«]{ °p'Ü9Rû3uüººeòÚ• 8 ǸÓORJÈ£1~f! ™ ‚ê6ת—LãxÒ[íe=°UƒBð^ýðÒ|‰lí}ýЫ‰'U‹b£ÂïêdY—‹e;]~g§Ÿ–˜Å:ž@Õ‚ˆß? Õ=ŠÅܯÃêeóM²Õ'‘VÂZ Ž!ƒÎŒ|Ô¼€Œ‚êJ£ÕçakÉÊ8Çö-cØN¶lqÃ>”Mª†¦>ùòr ›GcwièÒÞ¹ÀÞÖå{^rqï`:­ºñ,¶UWSJÌñ(%ÐoP\ªw¥¡Õ×®^þzêjæŽÄìœì笳—hœ øÔ4xä<¤1ÿ;R¡HÝ š×`±ÇVF©æ{[Ì+ÌÞ÷ÿ—Yò¡èO\P—T°QdÔí°Óf…5fÚÑ»¿'_:ÅSKóÛ$ÓŒÃÏ/ttQø`Q¨—“Šê†môì£ ‹HBêü"½~WÎÄܯÂÓC/.]Ò8ÿçYmN*‡I5J]–}êM2(\å¦õ;‚±ù¤Ögñ12qÜ2953xë ì°hªª¡›ró;!•G}åÑQ4ÍÝ¢C.fJ¬}ËHW‘ÿ˜ô“˜ÀÓ˜@Ó!þµ•”úHŠo¿o; ;`\;ì‚ÍIµTóâO þò?äYØvèO}Y\ùvû‘ŽúödTëûw¥~Åã{'ÃFØ9ý!®Ühiô6Áã'ß…P>ÏÎQã©0 ” Ó pÅžh¦”o6‹Y§ÑóÍ$ö¼ʇ á|D„±šSx؈Ubgô߀`Z endstream endobj 128 0 obj <> stream xÚcd`aa`ddäñöwóq Ñvö 2ñÍÊ÷ɰ¬üÙÄúCšá‡ ãY¦rÌ?ÄYdž ‚ÈGü òžˆTŒB ,ŒŒ%íÆzFÎù•E™é% Éš †––æ: F– ޹©E™É‰y ¾‰%©¹‰%@NŽBp~rfjI¥‚†MFII•¾~yy¹^bn±^~Qº¦ŽByfI†BPjqjQYjŠ‚[~^‰‚_bnªÈÍz Â9?· ´$µHÁ7?%µ(è$F ã˜YÒtðýø^¶ú'ÓjÆã¯¾xÅüc×÷Ë¢Wº¿/ýÝù»³û÷R'çîß ¾w~ïìþ¾à²Pð„hb·ûüâ{ÕG»ßvŸì>×}cæÁ%O¯ÏX×½³ûléBûYa=NÝvÝÞÝjUÁù&ÎuYÝ|e ~8Ïúž?uò¶ß‰ÓØ7qÝã^=‰‡çÞ^9.óù<œ?LDaŠ~ endstream endobj 130 0 obj <> stream xÚ]‘Ënƒ0E÷þŠY&‹ CÒ……Ä#H,úP!ö@‘б Yð÷õƒfÑ…­3cÏñuWE%Ç‚O=óWèG)4.óCs„‡Q’01òuÜΧV‘ kÕ{;!M”Þ$ŸÅ(‡—{S†Øû ͦ¢=®Šz[Vœ*ÙÏÀ¾ŒÞ²ê ©˜;<Ú܇¨îyí2õC©œP®@I’8¹ÐOdÚâ¢ZŽº•Fi¬,‚Rü;‹}E×óïV^Ì͈†ç„°ìf˜Ò4³\:Î,ç±ås[¾z¾.‘Z™Òî´Ê]ËWÛ§XËŸŽó‡ÖÆ ÷/ÎfëÈ(ñùujV¶Ê­_l—Y endstream endobj 21 0 obj <> stream xÚí\ioÜ8ý¾¿Bß&Á ݼÁ €ñØIìqlçšL>ôÚ¤ÇìÎbæßï+R¢(5»-ŸÈ.‚¶%ŠW=¾*‹j©«X%t%˜ª$«¤ø¯”CÒVF¸J±Êj[)U9§QPqfT¥yÅוÖ—ÚTùZøÊ ß2Q¡ wZUÆ¢gf* !VVB*^YS åe…K‘Ʋ-ú’¼N šÃÙ™ª„‡,‰"ÆŠãìx¥ÅÍúJ ”tÆ…¦Q(Q™T 0‘¯Œ«hX”&+ƒöƘ EÒ¾E¿Ö‹ÊB¤ƒ<‡zò Jz`¶ÁÀT(„ +*âÇB”³ dåÊ=¯´‚4Œ×pæ* Ô†|ðA¤pŽ=QæG1‡6œ&2Á³ŠhGWœ3$8*sQyC­è‚1èŠs”3jyj‹ºPRÌp@â\b  çÜ’ò®8Q­Âµ@ZcÄTÊú‚‚¸ÞUH eÐ L}€%êËJªƒöP4ƒæaÔX¨O fy¨§ £ GUÑt°1ŽrŵA¶âšzFBÂ4¸DJ[C„4Q–Æ QÊJN,iF¡¢æ–j 2K胈ъHPèBj‘«-¡qí ^hšF`XÜ&¨ÜHªNL qD™1P6 å =Âa¼!4ø·¤P¾¤’ ÂtÐ1¬›½%Þ¨SëÁ„Ç 6r‡$!¯H%Ä5ºp ¬þúëxëülN'R«Æ[0ó˜€yÅé%$`Á1AZ ²¶˜"s‰)2˜ Š©“4ä:Iðê$ÑQ'Q“š¨CòéÓñþÅùñátþ~¼¿¹5>šþ=ï|™|šnÄÓz<í|xúô_ÙXn„¥ y7òs©­¨ UÅ’)t™çä°ºð”“{Æó”ºo>9¨V|™²é}‘ÒÊÏIiÜRʆҒ^´“L…)¹ˆX±%ºèÝBnáeD¶ãÈ ÐÚ`–äL)¹«Á–!&\&³«V›Ä.ä rìw¢Ð‚ÍHlq—Á¶&‘`?,ØV÷w¯ñûš­¹Ieb3\¥U+[*›qß`&õª% -ËÝ™/“œ|ÏíéÌÙºrÍè,¢½5®ÛO‹–æz%¹.”ƒéåù·‹ãé%vh¡££¾NÇû¨ÃÅôlN»/Êßf\^¾çAÎbs=¬¹PÅær tQ–.å°æRdÍSíKTø†Ú*5‹¤>Ÿ  %ioNAß´3-¢°KPø Sl®ØÀæe”Ö\Érs7°¹½>…*²$ж=œt†æeŽuahVn®6/›¡v›Ûbs3¼a׿P5Ð=pŠv¨Ë–`–X‚ã=eK0v`ó²[6°y¼]2•è6·¢ÜÜ l®W©@ô@Øh¸V­j©KÊ3QkFÇSœn¥/â¶+ÇYXRêÃxwz2›¬Ÿÿýž²µÇF_‰ºÃ‹éd~~ñ¨:š¾­Î¿Í¿~èW#&G\ÿÂói©8ùv<½xtòŸÙד_þ®þz„JŒIáþzü8v2;?̧ۜ6¡öLrM…ù™ÉŸûéq”°7ƒ£Ù˜Ì'§çŸPü^6¢qt?ƺ‘).Gb¡¼ùh±¼ìÿõã ñ%eœiÛËRÆ‚›3Q¦¸‘ÁÅs$‘Žôo„©ób‹&?ÖyÊë‘Çtd#ßSBT\# eÌü¨ÙòPW9O½dG–Î?>‹+eazÔ†àI׿ ôÔ²¬¤Î H«\B¼jê6em[ÍÍÈBŸV¥jÉG’r óÛNF­]°’Ž++h¯´U©žVj$‹uSËBéFá[ kQ[‚aY§;Þ£ïü¸R?°oQÙz-F‘¥JölѯÁœRµÌúÚ±†=­CÊ*ßÑsƒ§ÅÅF[ª4úxÝÖ)‡Ññ¦nhßH”ž‰ôÔ>rÒ”ÔÒ2^¿›ÙØ^Z¸eIÉ)rпàÔ¼Hk$/Ï_<ÜåÁy?u¾ xdLç51Ym älkUG³ÐŠÖ*ô£®2ÊŸÒªIqgJf—Wú£ŒðxT!ÄÓ,zTš5&lÉéHÿä¯EH5j¢t¬©#CJs¿iÓ“‰rZ1%0”Zvü¡Úʧ&¿Väb®5n…ŸsÐBí_•¡•§Ã|ôëºQã¤y‹Ç8•ëöµ{$I{9 ßèëÌÛ{Aa_<6¸Z ÐðãV£¼Ç–‡ˆùG:VD¤YKã–Vv)iuˆéØçmޱŸxläÔ>[iŒÃ2UYç£QÍú,S4`0j‘j·ÑžÚÕ½tJÛUAŽþ·7 qœõh[¾ðy±VÝÕìR´cê<–ΞS¬¯"#y«Àaâ±]7ò·+MTPlVP4=M RÊ W§rðùÑÀt]Ó"ô—RË:7Nž9¦ózŽ‘ÇzàôôGBDÂ:‹°ÐÐú{ Ç•aB#[;΀éŽ yV‡ÿ®»‰†»ô\·)µ]õáN¨v¢Ã0ôÁS-‚½ËÅ—®>ÚpdéLE“i/£dí‘ÐE\&óʆ”åƒ?Ö~$Ӷ߸`&N.ñцf*%âÞƒVXÚ£ÒÈiÏ‚£¥Ý‚A©T•+ÎÓºo`6¡‹a^ðušf”2Ñi;íSi–ÓžWc‹O+9äQÑþ§Z<Ö’´gºŸ°DF4?½Dަ¨‡0³î*@f)kã´™^Û½‘«£ž!ÿ¢µ‚”ŠAñ»¤·Ö-é›öLy$f„†·¢µ6´=´–l<ÙW×»²k<¡~œ7yZ†©yHãñì¨cí¶¸c²aǤj¶ê:¢‘SÍ,匱0ë[ A-R‘I‰¥*b+ÊŒ¿ù›‚·TRL9m¾»-ß56‡>,tªõÚCøjxIgKk‰Ò¶vWñzñHÏwÕסe^¦tc¾¢@ÍÖHbyBŒ2žœ·‰k”Pa¯X>²juyS«ë"Û³¬æêÔ²«EIË$ A|›ã %Ћ©¨ÛÏ;#ܾ¥å¸õ-*ݨÓ:["ÂÉ6G3Q×tœ–eÍÒ¬ŒÑ£ 1 çYnµ*ò»Ü­€´YÔ½4ä;(˜ˆØ¼ [6¥ 7iËåFrƒŸ+øX¯¹£Ï¹÷z©Qƒº–DQpG|à‚â„Î6ô˜É$9/2g@((|VKÌ‚Â`îXÆÚ¤Zפ¹L‰ý2OÄmª®Êcš¾ã  ‹ÒŒÔn½ÅÃ_3†(ë{N†ÌjáN¿Š»~¡¯Ø)†Š5gÊÓÄÌ9mµÓœk]Úí/2šëF+–˜LýЂbµú›Î±”×-Ï—á&§Ÿê·X•êö{•Ü~«a¨—÷z³v7”BúžN§åWgçöXÊçà"9¹°æKfzøh|øíßsº >~3;™¾¤7£D³‹ËùÆçÉvdã“:-´ÿvv|~2;ûEßóž¿:›!oJû‡œõÉå4Hx¶ö|scïçíƒ]n… b7§—dz¯óó‹ð‚Ax\©ƒ«­0Þ˜|ÝžÎ>}ž#SãµËcúNÝx=¦:”~½ïÌ'§³ãµ³O§ÓŠçÓ/¯aÉã­ÓɧËÊ„>×éûñ'ܪꉤGû¥²ˆý‡P¸5;ÊÊÕ!coòeÚÇÞ¹„<Ý#O™Œ)ÅP}{{û·í?CÄk¹·P]ç‹§W²%½ÜïL—ße$>ŒÞ÷³JÝ"Tß~¾¶÷"¸~æ k¾R»la]Þ¾§Û´½h“sÞ·¦øô‰Á:yåëÐw¸q¸öû3 8:*Ó7ÉðI†O2|’á“ Ÿdø$Ã[zõ¿é¯w endstream endobj 153 0 obj <<389ca7086ec9f10d40df7883bd7d880e>]/Size 154/W[1 3 2]/Filter/FlateDecode/Length 414>> stream xÚ5Ñ9LTaÄñð#Ö|%“ˆô·^¢eŠ&[ÞÉ3Dñ//‡eª|AT,z?"Óä(ÑøÑûQyŽè^ö#ÏË×ÄÀ¦÷X™NŒD¾"N^ Æg½“ÄDÈËq™I¼ x9!³ˆé?^NÊlb&×K¼Ì!æ‚^NÉK2Yž•e® ÈËÄ|¹Ÿ  pßÞ» ‰Åßî+Ä÷!w±¾ê.&þþw_%vÃÿ4럗kdN©û:üê¾AVE»o’õIî[d(r%äà°»”«s—‘“ãîÛd¸äà3;^ÊÉO‘û¹CÎn»+È/a÷]òÇgw%¹Ôï#W²ÝÕ²VÖË{²I¶È6Ù!ïËnÙ+ûä#’ƒrH>•Ïåˆ|)_É7䯰÷Mõ endstream endobj startxref 122501 %%EOF glpk-5.0/doc/notes/simplex1.pdf0000666000062000006210000136024613766346220015654 0ustar maomkpasswd%PDF-1.5 %äðíø 13 0 obj <> stream xÚ¥VÛjA}÷+úqvÚ®¾ÎˆˆT¼ JöÍøC «& þ¾uéÝDƒH²Ì­ûTÕ©SUí®¸€àZÄÿà>ïÝÓ»ÿ4¡¸ÝW9û<¹±d_šÛ}ù8œ&h§©†M¬xßð¾düUüÁfLñm| ú…V¤Ó” ^ã&þ>ÊGzY#m¸œ7Ÿv¯ÝÉ77Fðs£ƒ˜È W6PôîÏAŸaš%Ð]&ƒAlñº¤ëš<×*Ïʆ­ß é ÔäcvcOŒ0!xf‡¡®·YñŠÄÂ~%¢(rrÍÏpÛìçê²OIPCH·X[óuvcBB`1¯Ac 5mbSÆkWb€bNå´™`ðŠœM<ûœ6ö°Ì¡òŠp‰X<äH‘ÊŠ4RT¯ÍÃl`èK‰‰SÚ¥§¬J‘¯¬Ž*1––Ä«ãlù¶Ý–BF º; É ÄhÉׯ¼"[€«0{ñÊRitÏl§©tÕž¥{µù/b]™ ªjGUEYFϤ,²ŸQ‹,­‹×û³KT.*´ ¶ÍªIݵ«f‘UyìL90‡hõŽB®*äiÉúvñªu5¨©ÌZƒr¯2n]:nõˆw'V"¾™ºÚn}*C¿Âd"N™¥Å7î#3„ܪ*f×nº[é³/¦5&,ÿ…nvpK0U0ÀªÌòBÚ`„Z‘{“Ö”Ó^Æ‚ÊÅҕƱðtÕ]!·‰ûš×¢%ËØ„J:uÀÖœ%׆¸jƒÞT\µôÜ[“ÍÔÍr1֥ljÙ`+¬v„0%¯ÈÊI©E“ÃË·ïßlåö°hE¶wK:?öOS£’þª6\q1u§›-¦cÂåñ(Ö Fx\¾sºh+ ´–[›®ý/ùÝ”ü“w'¯;¥á™\¦YfÇó»r>Í“ûE;jj¾¸½ƒ O öxéNÜ9BTWpÌM|‚ˆ>â,¯x°ºŽºæ&4]iNBœ!ÉO6@ý­yÕ¸ÄGÑÇ£J Zaý…µÃ,‡‰Æ^s7›;£„­€Üup%ߨ”wºÀ¢K•J×rÙ•b8p ºùER(°© ^Üy>îÏ..(sÓʲãqæíáþìûãóo?ý÷ëóG7Y®xŒ™t© fÁÏa–a>Gyˆ8Þå`–ÿ÷~$ÝTÝ endstream endobj 20 0 obj <> stream xÚíZMoÜ6½÷WìQ{X•Î ¥cж‡¢‡õ¡@SŽí4ÒØMÜ4è¯/?†"µ’VÚõº©7Ab¬­•HéÍã{3C­þ\é•rÿôÊ‚û¯V¬¾9[}ý½vǰ6È«³—îûVuë~¿üµzf@?3Äk£Üïˆî‡žVk£ýßé¸rç¸ã¤ü÷ëßÎ~ðƒê•Gµ2(`aL½Þ´à/ÓìNwÃ[Ý]º1˜Ý„8Yš4M`m˜Y×Öºý(s¶Å”DªÉ=Œ©I&®ÝÔZiö¥Ö`åÖ1<¢›ÕÆÈfÂ2Ê7þ(ƳÒ·Ú¸»q‡­ NYƒŸ ¶Þ0sU¯7¤Ô‰}hRV€We”¡CYiFõqõq´F¢QV1ÂV "í΀S ÛöÈ@›LgYBž¤äÁ6%Dš³Þƒýò…°¤#ÿq½±Úœ&EƒšÇ Æ 5¬(•÷mæv¡ ‡¦‘À´ ž(ÎJµ•VcN±Ñ\ƒ-ì:»ÀèDZœ(€ž>Y>Uì`ɕʠ4jwP$hàˆA ÞCä=%z6£æcÚð™CPºx A_n]e3IU0<ô„šú«#ãü=fŸÊcú±¬S j͉pÇ )ÆãS‹χ¡ñàlÊiú°Ÿ´w/†™Æ`ζ£Kð(BÎéX—'y­ãwZr’ü>ž­fXŽ&¬Eaú®¼ÁÚdzV•æ%4m€Þ$)T TN™«J™sÂtV+‚ÒVü¨ÌµóÙ͵LóL¡yž+i‘…å¨Ä;9ñDaí´ ÑDzÓ|IPªôUéBü&òQ/KÏ©”O™-¥èé)S9·í ^J»Tp¡Äpws=ân걑L`W}ˆ‹n8™lQ s¬qt,þTÒû°om6ØŽtÝ(×Û25ZÜÜEBè]«³SÆÂL-陯@6ÑÆ@.oðÀPäVÛÎ [lÁ£䈵]Ö—ˆHPY×M©MÔ¸RIò·‘ƒY‰‹|.÷ ºMG¨¶['ì¥%åQ~ÊÕô*$•›ù#MØá½Ã2•õ÷ä…ÖbÑÅ–j/¨?…æX`YdÖÏOùñ©LA—•ÒlS45[Ö‹ˆ.)¨;ZBëÁmXW)1Í%qê¯' ö‹ð aÉpmzŸ<þÄ'#§FPƒˆÚû[OÆÏ_ž_Üݼ»þçJ:ñ0eBe±g¦´•÷ØÜ ÕÍqïÍ ËÍGf ÓèêÚ¨:óü…u®®îÎå®)½R V.¹c¶ñï*·Ã\¹i7Sn§³ÛB¥i¤p©aõz¨eûQªŠ«©¤4líq6í ê°M!–ÊŸ¶užŠÄG¶PÂIÐh´Ûë{¯À›Î\±GUÙ;wâ¾§w£h¿3Ö>^õðÂ/žÀëòõ}ñ"î×( ¿Ý Œõ!iÚ^›1q¬eͲ«+¢I^Ù œî.nÞƒYIÓIƒáùUY ξðP‹½w(DÊÍ1ßH‰ëp¯f¯w¯nŽWJH3= ¨¬ÊdyXdÜßÁâ‘ j§¨u}ï5¸«åš6EâgÕMÖì`e§Jš±Q¹x6íﱇÜÞÝø…ð÷Ãòì8K²=º5îL÷ûë6¤\—çwW!ûjRöµU -za.™ˆ‹J-ʺ`¬«5xd”`¥Ëan:ìé…[Ùç¶"vãÎxáa˜j­¨"; ‘éCtáUáÕùÛßÎß_¿ïsh%Šë¢ßWUùláä‘Ë^g¨ïwT8þ[¦ÿ²§CÍ4X8ͧë·þ؇C¥Z¶èª(Ô3Þךf/tÚØï4ÀžMœ'þMѳŽMÜ0voDBÑRÒlê¶•¦Ó“‘ž“v9Œ|]6n·M!½ º¼ |ê$GHü›¹uƒÃˆ¹÷ã"¦}Äç±ñ%øéVÕÊ®\[c#¯Õúãß­~úê_e¯M endstream endobj 25 0 obj <> stream xÚå[[“Û4~çWø1&®îÇzàvZ`J/Ë ËdÒMJ—ɶK’Ò¯GÇ’lÙ–œ8›d³0mÖŽ#;Ò§ï\¾#%û3£1ÿhÌü'ÙÕMöø"{ôLg”äšèìâm&hÎX6Á *»˜ÿ:ºär–³ñ¤Pt´¾35ú<-—Æsz5mÆÎÙè’0…gÔÜ¢È%ø‚K.…9ÊKÔ%¾ð3éî³-ÌEí«ü”™£Âãx¢AŽòñDr6Jˆ)2þíâ;ƒè„ò\Ê.Þ„ëÍÇëåÜ!E*¤pìJØq"bˆ޽ÊÎæW1:˜Ù–Ì5H<€z¶|}€9£®ÁÚó‰Š r åç<ç÷ä"ö•›é­š|ŽqRåÚ}GŽDÒ ²PR‘…¿·KÙ$Ëû1+Fž00šSÇ“Àwg ==c C fBæ¼@Æ(3‹þmš0ö&IsEïFº…0°0ž/Ï#|‘9í„¡[£sÑOº…0ªI˜Å_c)G³åtc(c¸ó‰vÝ÷0Óv¨ƒ Ý­ôa‚ç0ì~>ÁÛ±+.ºº/ ¼ÿDê:×&;ycÄ‹…áM„HA©·«Å"Ýʸ@ƒhNK“0ægÎU—øãJä’óóÌ ˜ a†c²Ã13A ž Î+‚ øXâ9N' Âë??¿è:©Tì$jzJä…7¾ç1?kzG þ†Dì~æÉk3¡ •Wg"rj)|ÉY0PÅ­Q–ï¹–´&.i5hæ òìÒÔ=9Ìy-ï‘ïñJ,ÁÝY ìböZ ²–¸~½q¹HÓ¶ËáÙ¾ò‰©½|™4ŸT0s(`TÃ]cLhÊÀ%Î-å皈æn³ù|zõaÙÅMˆ:¾O™d† ©€hMŒJ|¸}¾óµÆ‘'I$A’1‘™¢Öp¡Éöš…Úl¥)\Àƒª“ž­ÎÿzGQ§ÒålÓÀ¥8g3¢ :R#3E.DXeß|±Œ³ƒ·pãñÖwo‡až<±ÜÆÃV6øñÖ*òÙfQEª¤ƒŒ*É ¬8P›§YÈtnäÉÎ)O—…´žÌRã‚.ÅB΋ýá5y£É®#ýböiY’sn©ý±²ü¡Pú }õ¼’+y.ýí¶ ˆÀbP¯¢½ŠÖ<=¢Ó’¹GB«©^­FvÑjDÝÅý V¯;kÙ§ÕÄ@­†¹×“oúåI$=q¶h!EÛ©,I:«‰8“JmU)Ú¶.sêV [ƒÒ÷ T‰fL¯·<¯…ï³ÿ\M׋e¢xÀÚ¨y3"mQ¯î€MJ4å®–Ó´Vº8 W-U¢Ò"Ú‚«Ûfž.IE`Û™llÙSÒ U.î²"c:®=uÊY)î¦ÔôXqÕÏ3á?¨¦ýSJýÑôDM$5ýzqì¥=Jر‹&{šd¯–ìZ-Ö‹ùûÖ\èú°¶©À8Âl©W2(æ ÕTÓ ë쌴²³PäWææ®YÕgîÇáUªœþûìæf6ý#–ñVe ½ÊáÉáKz¾µp®DF7™Ⱥ.-[•ÔZ³}>ýÖÝút×ÖªR‡•}zÙ'|Oýì›kq3úV5V~Zuf¨r9nŒ–È@VИÖ³ÂÐh ´õ‡å1!‹ouñAHg[K `5j.DC`²ÅéEëfI¦ÒßàÅšx•¥ºTh> stream xÚÅ˪d·qŸ¯hgÕ»©ô</&,²3™oŽC`ðÌ€&Æ_•T%•Në<Ú ûÎôí#•Jõ~¹ü|1ÿ3—ù}ùñÓåÏï/ú«Éß9e]¸¼ÿw~þ0Z-ù󿾿š[þeY®oÖ„7ëÌ›ùÇëüÙß6Äü$äoà7ùÇÕ¿½¯«b¼ýãýßð1F-ÞÓ°¨hë 1à2(Ð7«óßN×Ã|>4Ä Êçe6âªàè ~ëêêøÔ#¢6ÿÄGþ: ²¤®À§å‚Õ £ä•¥7«œÁ{ã!åSú„€¦Ûkº9!WÐí|]á-í ÜB Ëi^íé, NÞ]Ýì µB+盤k¡2Ÿ7ˆD@_î€Ï=Ž0¢}Æ¿Ëø§‚ ‹5 RÈÔ©d úæwùãìÀŸ Gž Ÿ¼ ±°âY¹ ñŒïB,wBüÍ£@}Ø%)o³ðZ…RVÀ1DÁÅM!ƒ°æZI[XGO˜Å…uŽXÀωTB 3¸¾íHšÀúíö “Ä¥M ²ÄZ\Aõ7^e%i”OD™o§PŒò@ ~äîÕñ±SYͪ´x?T0—/ùuŽCðtÄ×Sò'³Æ!Ž8<Œ õš¬y& QÅxiK¾ša‘yš UOùôásYb’A+E’s53ìZñÍ ®UÚÒsóv›Ax€ËjàÕ»)¡LTÎq‹)õÏ)„eQÎ}± Áæ…‚JÈ”EA½ÐÇW‚âÛ¼ipGúu"OÀ`þeN¯ì£‰m4‘&èá|RVRíÒâЦ¨/ʆõõí€WZš@d£‘Máu ((›Ö€ºD*«PLeÅO³£<Šh[2½dR`;3дÍì¸=T—Bv;? d)‹³΢¹w_Gð÷9g3âÌÚß&-h¦ŸBXްä5ÉÃ[B÷,!݇Æ8GDgDÒÚD6ÎÆ³ŒZìíÿ‹QP#ü6z¢»²À[¥ïv@ŽÓieF¿9cB jJ”µÅ¯§LXœÒñ„›°ƒ›É’Ü¥­ ÊT8R*ZA´ªnŒ£  äc¿šÇ86†ÃK‡×/m–â`ë­ßM­tÛ„¢çͶèy66?<‹žGÚEïÃTöÒ¡àÙ•BÆ1zëo!•f² ‡hÞå`µ‰Tf°ú: Ï( qÌ1¼ÙÐ{­RÚs¸I9Äw°M|Ö€¤Þ‡$„÷ÃÜÙ$¤wCïÓŠüzOï+b§®¬™Ÿ†(r†c¾}³tG˜³KGæUú~|¦¯U¾Œ]]Ñ7,Çô%¸ èãIšã¢LZIóŒžCâñ{Ý©¶¨:;‘ÒÒï—© 1nQÛw¶ý2 7|¡v<¦vܦvic¥v¡À&µ‡§˜8{ëªçUz—ÆpšÆª²ÐXÀõaJêH©¿§ÜRÚé–‰  s)! æÃ;¨×u™DNÚDž¬©×'.@.iÂY€¨ŒÝ$턵£’,Np¶òÈ‚Xñê•‡Éłߒ½Þ™bäŠéV³š —6ê­Ú>Ók < +Æ¢G?*¶ã¦OïK ÝuÏÊìÈ}v8ßÎRSl˽ÖfBc°Êô¼u†±ë‘óïÔÐŒ©‘¨>¬6=—ƒÆ‹S<Á?1²7…G†˜!uº1¨\–7z*P±`5™à@«¬?» >PÕÏqì©R–,0¶4-Ú{Û´ScQ WYÅjc™‘ÖõÚ˜é!#ׯœ{Òهˉã2º«(g5§Ü+mSÇÜ Ûâݓ帕Šê®õøì²;gN+¶È+c8‘Uë”ßõÝ'd‹ÃOjuX&˜¤ÈÛ†mtYw¾_3R§|‡*ÚÁdT2'rø=Ë­´¼k3'f0nʦ7”6Ѥ`Ü“m8÷$fF»&U”0¤ÝgVI —NVf¾F ù÷Fá¼Ú‘,udý»ÜÛîÑà· W@€YŒ¯=*48"Ì&5S‡¬Ö–}ðç C/{4¤Ñùï k_‹Ö¼ˆ³.ëkÁOÆ© 2¯fXÑM8,³)(VE»Ó÷^ kè§yµ'õkWÈÌâ(Ò?ïÈ[h·Ÿ{΋ Á®ÒíeeEšNxÝNÑË”X—Þ¾VNà—Á4L5`ê=¦ø:Ý Ÿ§4Kñ xÓ CÉuÑaÅ'A 5€0^å WØ/ hU¦r:¢I¦¸d:¨žF™­ŒepÒIÜ+(8mæ¼!ˆYYשO× qºJhP¾ìÄ#]zká??|þi¦ïó݆gkFõi±s÷¦Õ¸u‡.Qø¬˜¦.g4üd`§Ub£9¡PRæ2jòÇVÅ7×/´ê©;7lïbõ«&]át†FwOU;”Íe·È±¦%ò©®æÞ2D`¾®€°‡k¿×Mpí&—õbžÚÔ¨a7ßkUZósÌ ×ÏtWüˆšõØ02ËcÝ 6Ú¡5Úµé‘o£5iJ1µNJ& ê®þNÝp“5k5Ø´­¯Øl¨ÑËC,^–sÉÜtƒlCdUØqÞIPƒAløtÅ¡}ä?¥¦a *ÌvŠèÚw™ë]÷¾c“:æÞ˜¥Ð ÎÓ^õ'x\õ÷zUÊçøP|²±¦52ý8Ãâþ=Ò1ÛâÑRŠ)b$ „µ­|&T)zw—Û‚é TMòøi3U%šl{ôxTK ëžõ4DG81 Ñ[~apØ¡—4I1 ±¥H®€P¥¥EOi{áJûµØ(èö ð Š| •˜XÏE1ë¨ï|øÀëz ÇÍdJ ,8 ødJÏʃ+³Â5®ëág-îãÓ°kOÚ~àOž¬—ÚK%1¤¥¯Ú·µâ%°Êe¹´YÔ¡‡uo8M'|eþáE.áW ?F“ˆ~Ï=¹”ÅP¤Æ.­ð¢%Wœ`9at‚Ô8]êÜÒ¼U¹à<ÏnzËe"§GVJbžWê‹ä û^î:Qý™˜zãg> ª•“s=Ém>4s¾cûj3> %š)C²”Ì21æÛzÞœùFë0êmœ¨œ:è…áο¼¿ü|QvI—ÿb´S!\>]LŠøîýþñò÷Ëwõ-XÐ9–^p„¸tèrÿY<¬ê§‰BÓ3Ø`ÃÉŸ­ÑQ™th1¨ë&ªë¦I]·î0g£ˆÐ¢~—múŒål€½^º S=ÔC–lÐô™=Ø)ˆ·W/VW?(†ÃMÉšG%{Ä?eq—1 ÿ6”ä×!”=àbÙmµð°Ý™kþ‰žÂÍ­#‡z «Ê>=È«+ìxìf‰ËQ¤y9ÜdÒšN7‹=ƒð4ÑX¤`9DÙƒÕÏlÈá¡«õÀÉ ¹t /í ^„Ge¸#ÙaÔ­JóÉq·¼N{Q¬ò$G Y_" jÁ)FCæhûû<Óú!ÛDmVC”9ño„œØ¥ÃP×a”WÛŠo'§dSÖ¦~™âË+ë3NøØ¸·«:iȺ¥©4yåõy–í‘„\hêšvnÜjÔ'mé3ÏáBÐøÆ„øÇ"µ§ÕÐUk@{áíËFzн=KÕú!ðBáT€Î! ȃ–>\þÇ)ŒdŸGSFqý’Á(G`ð,¯)<Ž9/®R%Fj|}ŽQb)¦»}g™ð.õrßMÒWDé镞éèúOfµ‰ÿ¢FZÊ*ÇñÏwø¢Yw8 endstream endobj 43 0 obj <> stream xÚÕËŽ¹ñž¯ÐQBF\’ÅW;ða d9àÛÎ^âÀ‹5Ö ä°@>?|TñѪî¦4cÃ=T],Ö‹õ¢Nÿ9©“ŒÿÔÉëø_ž>~9½ûpúá§å¤¤Xärúð餬XÌéšÞp§ÿþùü Z_‚Ž¿|«ãOúm.W2¾k]üD=ƒ“Âøòž5O $?¨ºâoÿ¶µ•Äw=þβ‡Püµ ÊMú}Ñ>=ž‘'Pu~>+¡ž/ÏR»ôž/„ºž¬$øò:a „)†ØÊ~|#1¯›  #ÕµýZÜ#Iyé/ËËëå—ÿˆ|Fvƒ°ÙM›«HõâÎåQ·’Bb ~êqYbžé(KL‚NËû­ éµûs:]Èóžðn‰.áKkXùDH#ûðUÛ%KªE&Σ¶u–…~Åã"ÉK%;± B'yÈQG\-OF2Ë;“ $±Ô+W ÂwÆ’¸‘Ÿ9wzîpÿéIWŸ„= ¬ƒ o{ø¤âÍ ·K0P u+]2®h~%k¥¬k¥¬8d‘Î-K×úOç8ïmÑÈL|rv{kéÓ^Ý蹬áÙ®(4âl•ùºC§–ßÍÆ ›Ú8ÀÚµ¡$£·½!Jx¨té¢k‘»i§?ü¤tçpµ[„Óqÿiã Äà‘¥0?ßÞd²šÂ¨ªg³üè[“f"‘ -|Vfxù«™­&SÜ—RH·227rÒº37T‡fã"#"7„D£Ö¶§:¿›ªh`|UO'(Û®b£íw[Ïd Þ¡gñ>ôôDpϼd”jÏue!ÀÞf• DY¡cB’¤ê © tZàœKd¸Ïe)Y} BÔ–ÿrˆ¡=~þ?×®W7%¬J€ëÄóŸY'ŠÜ¨Ó5Jl3'/Ÿi¢P…+ï84W'\R"¸<&ã)½gÉ!íIƒšÈn½E›]ÜÞß8yˆG;l^ä#ÂÛ¯Áæ·ì1"ÆsGl¶BéžÍ<xE6›6‡c6Èï¬YˆC.ë¸üû-w@h{ÈeÎö\æñ¸ïˤÌ>ê3fÙÜqùOÖÔíŒË0=—ÿü\†ƒî”>+#.¿áPDr?71œ»®ÆéÔÒS<-¡iFV-Mº !†®ŸëNI ~ût)lxhb g0yP-èkOöGw9ÙºP‘/ —\MÀ‹YÎ6Ê‹Qkb^ÀÅQéå²>ùŽ#C­h¿æmJÝ–óÏÏgV™#_aw=s´ž:´åªÌŸŒXJXô¯7±_ùº¤Á·¦Œ¢Æ“.gñÓ© ‡•5—x:ûÄ{Ké’{ï¢Çc¹½gåÓýAlÚ‡M±á—i±±Ë…ó‰ÍvbûÌa1b« VĦìˆM3™^'ñ!ôãâS’#—÷†%+ƒƒµäüžäÂËÖ›28û×\jJ§ØÓ  ÷x3³Zïg´þÁåò¡s³úZ_òlÔe¬j¤OrZoÊ¥b¤T[Ùj:Ql— Õ^§òQ@ˆ¾ØG§V)0eƒ"qZþ¤R`ÄMP» nÚÍ©‚Ì;¼—#³ _ýœÒáÐlô<ïvÍ&Üér\ŽÌ&|u³ÑËh6‹?2›eaêTr+ºÍ—Ü6ô:ˆÅ®ó&¶½Òyp½ïH³¯Æ©´f瞎7µ¥áñÅîáÁõ¾ŠCÃXy¤â#D*»®t^«ËÒí¨:"É”CôºCª[í®’26…ÂL8-©Ü¯&ã8„žŠãJ±õ_[ôÌPoµ9JÑØfÜ"s‡Íä¶Ú¢j®ˆ5_:±¹TxÔCöm4Ê k ‡ªÅ¥Z›®gûÔ¬ÈNƒ€dÛƒn{0•FêÝUaÕÏ1éQíLW§ÞÞº—« ÃvM‡RU&$YvoØBMUÃTV*ãý‘·G.áïÌ1WÕŒ(¤}àëjñ`#ˆW,5®'×@ À¿ ô¦(OÜ :žåµR˺·ÏËñ«”Ÿê6Ÿy5w~Ïo²’X=ßPfr9[ü.ëéËLq nŠcë³ÆõÕ±W”´Þô»ËÕJnc‘ éŽrÀEtiÌ_Yjã+Ue~UrasÉÌîÌÑŽxÃWp¥êÕj‹v¿¶hHçj‹Nø±ÿ÷=XaßE;[¾3LùN5:O=:O•½§Úˆò^€5¡º]¡¦¾*zŸ.´>j:èZ»±_Tcø;¶bœæƒ†Ẋs; i:‡Îb§W%^¿_â­¾Ö·t\1ýä+egš·øÂ¿$~·!Òm ´ò¸ mÃ6B½§åß¡KÛ¥TW·GMbôà÷¶oë@Êz@ ¨zNãÔ±/»  ׂìÖ¯©áC5KŒF;‰ÃnÜEçáÃЩ£•ÕfÈ%O_¤†8ؾ@ïî*A† È›»°ÊÔÚ5–Ä¿àÜóáÖh°ÎƒtÈ2×Q„ÒãàÆÅÊ̄ڡ¼Œ~Ày4KRû•'¤h~Šƒ‹Š:ßü##ªÎߥñ Ê¯™L§‹)•Šjs86FëÌ$-Q \m+ 0ÄS³VDÞsÆCŽ.%oËcÂÂyEhí¥mu_b™cšUÁ³h‡àÜ)¹ c r#˜wÈÛÅúûjc.Ó©õ˜qÓXOÊiäÁ¤¡ÃIùEŒg{²Ê„Tã“z]¬GõÚÔ‘ž¹ÙÅ:L4©ßeÔHp;E£g·ãAƒfšÖ~þ´ˆz¨ÉØÕÄi£äÓ(Ö S bœ_rs\É1cV4Àj ŒU;­-üô`öÍ”lcH°à˜-« ôd{ŒdæÁ+-ÐBáÙÃÂÆÝiY´¼´ë3’¸ƒQ÷VÍ[9ðàfªfj€”ÏEËê±oÒÙß!Ù*¿²t_¬ã«5`zhacKjúœoÖòú°Ð(?N5¯¶=¨ýã¹õ>Ý w‰‡¥QÜ•E þò6µ9é¤/Ž?‰Øò€ß nbF.ŒßnÜqpcÍûÌìóÛ§E}P¥ÄÃM7ŽÏŸoØ\(îÙ©+°U8Œgi+þUÇÜrTÓb¬^A ©_gjèžÕù°* ÁèS®‚½N%Ç•çÀ³÷²ú)ónw!¾ãÌ£@Ù»/õ‰ÕáAœì3e#É{GeÛh»®<ÑcXA&ìÕþæ¬â»;†&Q–ì}®B–Þ•ms#(Ä“Æu'¬íKdOˆ«åX91¹”ôÚ‰=xyÉcœ+²vI…¨ÛòcT¨Ã=Ü•zƒZZ§–­*±´‚™[]3Tt±•,ô»,ô8Ø¡–|³w{Õ먃©ÁžÇ‹Ž}<Õw-r#ÎI×M4¸×>¼ó¢txü¦QÍÞ†ï¶îÿÖ-è. 4-‚;îmwöb&oÖÕÄ 3wîrUÎÈk.lÖVª‡Õ¥Ô¾« µâgû5z’rýp:ë7wùí]¥u¾¥Uºö²AfàúNa£ï´qÅ jYÙ1t O]¸bð­uBTñmtå„p¼4š‰Úùàåìèå½Î'Ëi@p˜ˆŽ;2_i$ú^ÞÿšjÜüMЍ]ÿâx*ìÇSÕÒfÚZêu.˜X:¶Ã(É m,|S³°ÁøE§m½ã—VÛfÕ“ü•¯¦8˜aÙÇl w2ßÄ ùÖÇü$ÔÜRU]n Muqaìâ6Kê4µxƒ39%‰ôHvVÜwU¬ß>oÌUúƒ°n(od_ë~Ëú ëŠzÃ3µ–ÇÖpÂnÛ%tÝÝ­ÊD·È>­¶~=%´ð×ý«OWPð¢nµŠÞ«5‘‡|)ÁЕàsØI˜v|a¢S½øt£`çŒsÂ@= Žì?«íFáÖ¦Ô{…¨/ë^W÷†w÷UÕO¨ªÛŸ8ðMÀ|Ÿ£v܂К);íˆ;gºŠmó›v¾ŒÙyûæ–ÕÀ‚køÇVU:´ÍÎÄm7€e½K¾ÐG¹K»@f(ì^'IоU¡%HÆÃ6ø0Šà—ÚæÅNDþšõ· Ì|à ͮè2;ºäÙQ­hlWãÏÈö¾SõtFÿ}šëLnß–åU7~«ÆoK… ë÷x¬¾ã &FZÍ4 ÑC3aû m†&}kÃP£Âl¯9z'¡öôý ¥òÂçVNæQµvyöxfµøv LåHèfl(á†äãâŸÁßs+úø ^2ø óƒŸúÞÁÏ}vùcné9nÉ~NöYªû”/8¨5†OÕ:Å,[Á˯|+°-¡yyô§øèOÇÂFFÇÅt!º°÷ïNÿüËÿQ7Ž endstream endobj 46 0 obj <> stream xÚµ\I,· ¾çWô±î®h—*€/Y€y7Ï;8 l8±H ¿>’¸ˆR©–y ìÁëébQ”D‘Íí—›¾©üŸ¾E“ÿW·¿þ|{÷þöë߯7­–U­·÷ßçÇÏòK¸½ÿÛ·÷Wë싉å_—üˇ÷ÌôÚˆ´ÓKÒù-»xo)íˆÒ Êu‰1ó/$_¿¤û÷³©ey óÕtó'ý©Ò®'ÒZ!í_fbÆ%j¹ß±Œå¦òŠ ˜Î8-«»:á¦K¦×ÅÚãùœ²~"Áoæ ¥,-‰Éú$òì<7KòY33«D'ȿڠóyµq:{ãMÂÿYùFíëÀ EÀHo,Öçrõ¦HR&ЃæHê})žuIŸÉ-.tÖ_rÁM\Ù®ä´&%t0nÇnÜžL2÷n1dþ;óùiñ+ÚÒ©IQñÆ$|žG\@×þ>—Õéæe¾žÚ&Ýôl.«-£dßX(þ1ÑT¿†Dñ(¶´ž[>ÕSj`«-`›Ðt©é*±i–©hDù.Pyt${~âAG*àù -H¯èY©@vÈôÕJXÔ,qXC(VùL÷Þ$»½üi» v1a² ÃækßVt tqn èÉÆ³XF*eöSà°’kû÷t÷ý[…­®ô«™ÌF >{Ýñ‘¯/`Ÿ.¨Â¸;¿Æ¼$Þ}‹¦ÐUŸò´k}â`ìjñ7¶"ÂtV;_éƒ:ép¿-˜N°eÄ‹´¡ê¥nÔUWÑÌWÝbãËo⨼Y›YâkÚ¨-ž§È¼xxnê|œ? ¯«ƒcVo¸Úë¾s¢3JnÈu›qEÅÏ,“ía3¬¶Rd)ãbÒ¾~I±àp³ÜÖ2ÈNHpQ„åd Šåô£špÕÛç©`—&»Ã‚½*ã稵٠5™^j^ðU 6ôª™T:0õ¹8zäî÷T¨__ó¸--ösïæñª¹Ï¹j¦•H°á¼ý•soX9´»V­‹v½ÝÕìÅ\[ƒg‡ø™Îqd'×V}ÇÏåO&|Á£œ¥ðp‰M‰}" Ʀ#‘h…·¨ôGÑOå¥è}V×p·3G¸üAƒ„Ѥ(ÀZÿ­c}là­‚9ty]øü‡ˆ¤NÈóÄ ¨šV9˜GUs”ž„ &†ûÜùV[2UÂU5¤ón†?ô’øÜñ¶ÔÓVa£ço1YÀnÕ)–Hn†j'‹6m¸Ö³e³øøK²­ë8Vð/ë¢PiŒí ­ "h0( b“m)s‹¼‰FÓ½ „‘‘؃öÑ,Éö&ƒ’ ¸Š3G½^ˆ>Ž^¨Ñ%4.…šZ]Ð2§)h€O4üd¢£Œ¥GгdPêôŒ5p/ãøˆpâ#2í˃„àl@ý­í5"q³¨Á!Dœ½3=ð­ZDÀÕíã}®@ùQr@|¶EÖ§‹[#\sƒSE±Ù/âÅ”€‚¯d>CS ŽY‡¸x´î³ /CÝpUöOƱU§pÿ}úø•ÏáŠZœŸÅŸs9¶_rbø¼xýhýó¢»Ë£R^Mþ!uÙVGh`Ç5nnö8è{Iò¤­<Š~ë’‚ž$Ye8=C"ZÊ%‚­ñóý—6e‰{ÿµ“*Û§Iʼn-Xºæâ÷ÍvñâI_òŽÚgÔª?É=æ˜$½Õ=ÂÌ®©φ 7ü&܇øæ-ÞBr¼È'½J,ói[Àœ°®`†>)|9˜É¸Èé/w”SI‰œF3kI «/h ³¾l‚™ã°Äu„eÛÝ@pÕ†“8ä44@oÈèÛÝP¦>½ô ¡ŠîõîZe’FºÄKê¸áÏmÇg*B¸ý"D*Óe’yªÏ,ÁŸLÀZéhuÍšuWj}-³;­õrNBÚÕ ÷âнÄcï¤jíÖòÓ·šÒÖŽ‘bñ«‰bÊú `¢êXí¬B htq ½¯Ûñ¤œz¶z2Uò¤JøÍbÁõrLÚ—fW,U;ÁÒz°SâZHuƒª± §W·E pÙ»¿2ì )M@˜˜1$¢ÇʇE¾ZÈÆ%À€ƒvƒP)Þ á@,ÁþãÚËíb•SáÖp9«q37Ó“oi[rO‘…pýÊ”z¦õ¢šCÇŽ |;rÒ©&”7îzI »5~AQTS‰aÓt«ƒ&¦1ïg]}5x€‹Kìõ³·A,2‡"˜x˳6ƒÕD{:HßaÕév®Z&òèô!·ƒÓׄb¼ÐR†„‘ÙI â7>F¹©ìÃë þ”E½ÎÊêmÙwmDáv4?I§:‹¾¾b€õˆx¸«æxÍÀ÷†Ý/g%=ñ’8Í}/9Ye:¯uÇ:SÐ*ùÞp£O^¡äÆ`Šòà~ñ E ŠDú«‰  [žúz¼l1*HJ88õÆÞû$k¶ÜAUã-j…™c—çTe«S¼^Ü] ¹ûØ(F:5Ñ™B‘WUëš¹¨\\x L´r .<ìºpzãh#çid®dÁâ Ë¡ó»i ‡Z¬@×¢\¸W—í¦©o LL²ÏFŸ7z ò®]/‘ÁÀƒa å ¦#èW•ÊšÊÝ´î™Dd5 %äúrT1NrT0[Öž%PÔS‹B].9XúUWAGÓ]@a#ëWÎ@ÿæÙ©uÆœAm ð­ZÈó3ÍhpS JÖúûEnŒ–ü•ìSä!#÷‹ DÏ+AÐŽÕÑHÁ“½yèL¾9v¼ðiL+À·GA§k°`ôYJô~Ú1?Z€T{·k†ëŸ*à´­).Ȧ8~/œÄv¦Ø S5Ôke-n~•å­(Œ„ÙC{J¾«Uåtê~–®*Tú`ê6:=éÝj]d4ÒˆpA®ö–te„|àMÆHZ„N¦>kÀdp£Ü̸±‘Œ{37’èÎA±ÂV5Çb°Š±,Š¥ûºvíhˆ?tzC…ú;£ÆBæÔ»u½žÅ‘‚4é¤8<ӛㄴ1;r­ Ugæày²ýèY¨™á½’mï8­ˆ ‚¦í"Ä+ÌY6‘ØéûñMÓ½9éQ—µ²†.çæÓw­¥&)vQ$ûø‰Ö²ÜÍÙzË¡6§.Ù}hm“"j5/Nï³7myþ8» ‚ÊÃ_nK`#ë>s\-sL;+« Ö«fÙg̵ë!Ú¦“£‰r#òæÌ>^YöJÛ²Q|ÖÍ“³ÝHYÞV…iXhPåqÀÒÙiÐÿÚôêo¿ûgñ_ÿûñ‡xàñOzu±7pmÛëå&M+µøÙ¥­l©ý>)W´hç3ë@†ùº‹lÖÖ3‡©„´ÃdÓò+¢XµÈB®”¦i߆m ÇÚŠÇ>ÈcOR–hxdµƒÎô E“"$Ãsʵ:Îì.Š"ø¦ô½?CÕ¿ _0°è¥2âÆC–ƒ¾MÀ¹JmîãÈ.vଌîݨ•îfÀ^QºìÉ] z¯9ý¨¤_e~ow3pñ·aœy£Û€7ŽÜ†qöªÛ@nºÚ/z³ƒõÌooõjë 3"©0žIÓ svÉ,SîðQŸ"kš®¸Ýë;Wy†» ~ tðÁ‹i•Ö-¾£©Ì„ð±˜<–!OÄ 7âèÐ9ë—æ©*73–Fz%Jóe,\ñÔ˜bÐò¾?h-Ƥ“æp2Tž¸m¢µoV]~6¸‰—Ôa¿h¤´“fŒ€ç¦†xÔ:a}GVÚ¨ô¼qÃmìЧÖE‡ ñÃ}®ïÜ%XôÞ4’}RU[$i›ì¬·‹’]™DÉÀ×u¡ë[£*6¢dZª^_´„1ö)ØÆƒg6,u“;]ªôwáýþ†[HMÏýæ ›`­ì¶j ŒÊ9,å†pQ6‰¢lMk—oc®z2]ŵdzÏQ$°ŠNÅía;‘vÊè‰Ä±M¬1ÃÞ·T<—D£2¡%*a¶L/v¦ê yî¢æÊÓ5ö¿5b‚˜p}á,bÂ~z~W"Aß‚ÿ.(Nó9ÒÓõ -€s“+8ŒÒ]# i¥=Më†2 òx:C ÓðEÏ]Fçâ6o˜&µKæµÝæÝFMy@CE,´Íåêê…5Äߤ¡w확:€îÀ*a›÷pTÀÌOà¾sj‰²‰sdFIô}3JÉð-só-<®©¿H s6ºMÚ|C"g§_<µWìôônÖ2˜EÛvm˜Êù­ä­™C¢Ú‡¦r.}šÉtár“v{í›ù4/‰¿3+ï0+Çû íò“plà´4M¡Ò³ÚÍ/R«±=aÎøyàIY†É ˆEÇeža¦ÿZºå3-ïr|LúiEë‹ÊZMß´Ð Ï -ÚpÊ‘uºÛœmZ¨‰ü­þ°]͹…çÒ¡up¦ë]¼j>Ìö ËÆ .,lû‹ű…{«kIËÖ bž´¹Ý’Âà)è¯ÔÃn™B\ rÝËxq2¼ÃIdÕ`ÛÇ8¬,ª0ÌÆõç¬Pè£B¼ HÇ… ªñÿºIX1GçÕ¤>ï¨x0é¶NÿÔõ/õÖA´AÆ0»r¥BÜï7}¥¨*Ý…Ž–¶Tp Ü„±“ØêŬ9*[ËQjJ™è7¿ú?¢× endstream endobj 49 0 obj <> stream xÚÕËŽä¶ñž¯Ð±iÉ|“Ú —âC ™[Æ—õ"@ŒøàS‚|}X$‹,JEI=;Xǰg§[*’ÅzW±8Ó¯“œDüON^ÅÿÅôÓ/ÓÇ—é»ï×IŠeëôòøz†/nzùò÷Û«öâU[ø1÷YŸ¿Ùø[Ü•‹ß]ünl~és‚No]y¢óo£âçøÌJ€aâ.ãU‘V‘V#c>ßUÂ(þ¸ŒÅ‚ˆ •9A¶‘Ô™a6Y°ÜMþíãs/Ëg_1,UYSdO”ÙRPˆK{³A#p…%^ ؤU„’qŒôsÛS¦DÞ+pØŠ%a+í²šˆqX¬.+ÑHâÊF3{2žŽˆZ×[ÃØ PÈ‚gD‘J3‚'VYœé`Ëš• "Ci! J º¬s&á”s!¡-$EIÊ»ÇÅ<ÝDOF§š|#â,«ðÓ)ÛÞLäŠbNÄŸ‘úD^P2"…ë7¹È×û«P>ê×ûyÒ'qS(±0Œ2Â$‰‡Ou0»>!Ô@úÅ·i&Ð#P„«ÐnÖ©¬)¬-#dÓ.do¦*…‹uÁHið¨dAÄ55lh·g äUý-™°±¡ „•õjqÆüê,ð<èÂźIÝ~W­°Û÷û‘Íú[ÓŸºWç .²lˆ«Øˆmå‚ ÂË&z(_2dBQÐYÚúeš9¨›ôÝ–‹,¢^&iQD½ËšÞqtRÙpk†*­é¡Ê®CÆ%ˆH¤dJ’n ³T´¦ýjK(ÚR0B‹¾ðÕ4•'h½òRyЬs¦AZOâüºp„X¨ü†âk‘ŽDÛÊ’œ8 Î÷×¾í¿‰"ñÙ­ `¿b‰²ïá™]rèÕv$e2Äéª×C§ŽÔôš$0Ø¢¼õ±ÉÚž"× ®‘àÆ`áÝÞÔ–ÀìDÙ…—‰•ºgS7ÍkIGeÅS[˜{ÕÄ—;‹ÓFS­^ïðEn£B4|б6hÜM…x Ž2Ôа‰.ÑtO>^!×Lénî›ðL9wÛG»ÕÀ%œe´&sŠÚÙf:Ò†Ò¸§4;ÍY­<ÆHÎßJ”ñhë‚|-uˆmÜÅH»@q9²ÞV>kˆh%góVms/£#š~N6Ƭ û‘ß}/5ɦìºx§KóÜB³(SþƒïÍä—ÕÃ[·(qYÜš >qk„Eø©‚DEÚÍ’Ö€Y²”ý\ Ö ½NØ¥ÅÎP8^ ’>UM÷-µ‰ #鳸 MÆÆ] ÓÅ5¢ùh ¦›‡‰Ã—è|ižú-Q!ŠjšÁ[¢f)•Í¡_p»Ðo»ˆ®ã¸ ¢YóÐ }"Ž Úßö´ii0I.-Fô˜[ã|Þ£MÙ¸ëÐÝæOãü”rZ÷DgÅ\0$áBC…†ó ofNþ/HA¢ä<[}z¥Â…”ÄäæâA}ZÂÃü­Š¹käLäËë ÍÜ£N (rÕQ™â¿Ç©ƒÊK;wÚBåÂ|Ûí˜ ô†»?ÎVQ‹0©/ö¢ùG”8Èý”Üè½Qê …+Ð×ޱÍJ‰E…߃ËJÀذ©¾Â°,ÓëcÇ^7Y6 „;+ôfëŒ8 >™ÍHóãfáËë® „SÓZ]gU…gh¹IT˘£°òñ¶þ‘dŒ© b ?ÎÐ1î—Ü,@å ð›Aƒ¦æ÷R× ž†ì³±*é &öèÕš›¬'ÁÅCãùQ>ù-G+õxëÍX×6¤ê“çII?Œ…80«Ï‹—Çø}Pîѵ0”<¯çh£ò–ÄE‹ð‘¡ا”Ñ„.£iž9À±h¡‚PÛóò Xs«å(6!t;s·>ž€ ¤[ ÌREC¢1Ž©×8Xé#µœ)¢Fé Š8Ö~«÷Ikè“V‹Ò-„àÕÙ ¯Çe4qCàE§ð„Çѳjá\'ùtŸ¥X9a‘â—sËaÖ'LÇ7ÙÓgS"-0ןUL¹yl} Ÿ±‰®¢ñÛÛhsî~ QY†ÂŒY‰E£_.ö€EÃ-Ú¾‚r³û°“3 t:Òž+ö`éQhÚÊßH)Y“¶Ú&À|IÌ~]IìYmþ“ø3/ýRþ‰Ô,ýºˆL½‚1œcN_ѧOû•’Hn˜½™!æ)’ýÞŽ·£EÈç$;ðózðSÛ}/=Lîj 1voð®uà uåÿ'yGJü:ü¬“T1-…‚ÕáãÀóËž‚ ZuNû--ý—=¥® ¥¸”ÏŒS>e,£e-A|uÞgyŸYelL±}=Mk9œ±¼±Qw$ý…¯Áù¯­8¾Í(a˜Ø=• ã>ÏäAÞ¨Ôñ“– §7–k®x+û>ÎêŒ$"¯BÃI®ã¥Vš¨eêÝ*–èfe<` FEè†:sUn‚Ö¡ßì&ê$OH”º žö!Rþí݈öVƒ%Ú«#è/¸ ¿u:B9L©©û„BC×86ø,í¥7 mïÅ>\ä#š£…'Î2§˜µµj¼ø20z®û¸’…f(väì=I~櫹ÁL÷QÓÚѪ®.D„t %µO%݈€·ëîHÇÔ'_ºpUkx"ýíÏîA‡†îúðJI)ý){Û7áhäwÄí ’¶?§½[q;>d-óu‡¬wen£ƒV†¼Ê´ˆí[_+5‡zV†Ó…*K’;fmÃ)Ùz’µvµÀ‘¬žN³‚eÜŸ…¡{Éì_H-ŸTq7]¾[)ÊmsW»44ÅÓÆØ¼ÙÔ«m»d„=5ýŘBQ?Õ6ÞvÍlÛšÇyR÷o•m\óèd¿Ä3Än}®6‡âd2)µ "·†oº2Z“âyon„_Õ«´¦²wèÇ çýXá(A´'b¹.Úwr™Û8 ½¸.–ÜQ!], ¢u1!]‡,Øo¬ëÛéj/–Ü´±_½?!¯4¬4h{Yú*tíR> stream xÚÝ\Kä¶¾çWèØ÷Ð|S´ã ćÙ[&§° Füü,Y”H‰šédÇ=;=R‰z×ÇR/¿,báá?±8þçËß\¾þ°|þ_gžûåÃ÷‹0Ìëå9^°Ë‡ïþz{Q\>=+gÂ'+^”Qáwüq/Jóðcð®Ñá'\1&ÿÎëLim¾Îñ (´ÌTöIÚxÍÔ`l}ªHm,¬ÀéxÇæ;.\Ñam–ÃLÇÔZÅßef¨Ôt-8º¶ø<ÎbЧUÉtG:|*îMâšâjÄç"§"pW.|vi ÏOûð§ÀèÌoÅŒÉüÆÝ»0»\Å 8—FPyõ2¯UD )tž+RIÊk†$R>¥ß‰A‡Ÿ€íå*ß05Ndy™¨ÃÀ|'Ó&z™Efàs¼‡×¬Ê¬K÷pûe;n gÕY¥ÛEteFV=¯•  Rß‘ÜåE™F‘ð4lžÎ¤Í¦¥WÝO[XÕ-¦m¾• W\6 §ð~2 Tõð{E•×HÑShT¯iÉæŠÒ ’-sdÄ-‘qdõiÌá ‚N„oÙUv|p¥#Á|gR‚™zR‚@%ŸN$Øa~±f4ÓJUŸH5©×JL»#I‡’Š3I‚ÛsÕÛWsa˜sÕ£w.AÛ‚? ƒßª0jÔÕî$i·•Ö9Ž‹3Cá†ö,äeŠ£$)s±ò(s¡DF÷ç®#¢ü…€?Ÿr¢4+»&1ÉÜ,:R”ÛáSw\N B°¤~rešŒí5vXŸyT˜I@Kä[Fsz2úÖqÝHk=Yó½j‘—d3@}&JíIw9‚7¹ Œ×±yç0Š'?œžªcjYF'‘í0ß™¶C†pS5?šg¨ä²áŠáM´›Ðì¦ÙÀKjW632•(}ž\ Íš©¢s^k¥°`½ÙèI&¼¿b~œ_IOÎ!gsðp1 ™£« F•èTœäÑ]òiKuÐ-åc÷•]=:å° B:r¼@1t¼™ârBåt®Õ{CO¢o$‘¤yë{¬ò‰áxvá†("<|/«$‰x®álõJÕiF†ëèöÆað·»à_t¶Çù žT'*ƒ6žö”¨g{ ¾Sò¸‰Ö d¥(5 -„ o+GÔ½¼XWS.-ˆ‡Ò9ìêLÒêÝân8ñ…ŠØYyõ픡kah× ¨QJ\ñ"j¾Èdij,òWf‚*§yXÞj²>Â<€}æ„1;_Š‘]Ϥ2•Ú·ÎȄϿŠML© •Ä’HB¢™Ô™àßx_/ŽyïZ&Uà)³>Qü¹7Éʸ[ ÉËÓ~”4Gë_2…oQz)XÆ™7I¢Í…t‚X6ÁÐi?GíQ~ﺩ½iPÜ ù<¡Ó³òb= «™LÖé‰ÿ(˜† Ì«Gݦ-°R«ªûN±°<óòt/‘ÜÛæ6™®“Po#Np3ƒèy扣ƒÒ\LzbBm÷lq¶Æ¢…È« ð/šòbì€;£bcF¦•îi,†dˆ"´Z½,,„£nñ+ˆ`Ñ–¼‘üé&ØšM¶'j3ê€t5W‚ŸÈS•ÜyBžg&¹gÒº3MÜÙ×Gä˜\«7c¸×-°›9°váêaúzȇ’¾&ªÃôµ©2ÒèºE\Òø˜¶¢¿“R2·ñwÝDLÙI¿icŒ£ÊÑD>ý• ån}dw—} œ¸:DRÉ& ”‰(*´±‘NŒ’Ú2mÞO TPš¥PÔH“ ·ÉºF n«a7 …Vê%›A™3Õq¼gµrŽéuf¦‰cu Õ‰õK«.xs p0­«‡‚)óì€yè©y­’zMÊWõ¦¤\Xó܇ññëÞ$Ʀùøs—¾å#Ý3…,V¹ÃP³’)RÎKä]×Å;'Z™ë5cdzŠx†Þ öǧ(ÏÊó¯æÔI`ªo†«% ä¤ÔöâJMçù›ÔG:Á„þmÔt«jjº‘ú€8fÔÇ‹‘úx±õ„4¤Y¬÷xÈL0ªÇTîF›òðZžj àCÐí©w¸Ò‹WÔQ'çà«îHÚŠœÃÔ}vfÿWÎIÑ (·Û·j, ’Ql@©³ÁhšœK5Ç`y%‘}]Pª)”4{HLúïƒ6ÔRjlÌ­-œÃ‡æÄi.KÝEuOÃïu!›jÆè^cÌV³étï`MR4–%›rlBÙW9éHØQÌ.[ñjb€ïâí`Žˆ6ÎÃû€´xå¥6˜rîä+\v"­,•åQYЂ]®jËŽ Ï«<½©ÿÊy¢*˘„žJŒ[ÎŽ:Gp„oš±WÙ;m±­²ŒYfƒ˜*ïì\•hiÐPòÀÝ%cSS‡KJVçw*žQD°ö^nèBî*B^ÙpŸ>›N¢½I3¯âW½¥ ÁŒÌký~?‹‰ÀïÉ,–y2ËgÝY§<ɯ/\¦–·Û—]¯fìç¼:̹Vf¸LY«>(õk^jÊHa®œàø m½˜¥ÇpÏ êJêÞ`€)È'ŠCþª‘—1üÞU c™À|è×Þ–=S"ß/溶šë£ÁÒèÊ9ïsO£€~ýøŸº€¬ˆú4ßõÚ®' 혣 =Ry´çµL_ÇàÖÛg¢3•4LÛLá¯÷àKgvEê±ù=6C ’ßwÝq£¼³xSñͲö˜kˆˆaK8ëÚZÝÙ¿æÔ“U˜:ðj»‡½Þc[Q1'ÊdŽ ( -ìÀr0Z‰IY~=üÃ#ô0«=ÔÇzø.p sQ÷‡¦¹NÑ*§¶{Úòt¸Ë íÄ,¦£_)Ç.$f$# #Ï„¬C¤Ì¸¼y²=«Åª®9£)‘“lö«ñBÕôƒÞËωÝLÁk3S¯ë$×S„Z—³«a.‡L‡¨F±¬w²þÎiݳ 9æÚo¢ìõL—ê‹;Rµ¦ °Voš€øŠÍæÜ_Z`Î.àùÝ‹&÷:ôëJçºÿ¦ôOÙµZû»†9uÌ C·Ï]óRLLù¢á6jcUå=ÂÑÖí„åêO’žŽ¶%šb«ßû¶°(.¥l4M¼i1éeííõD@i^Ù€ Û=;DzÝ@ÃíoDµB¤Q[ÐP6hùLKQæU×C”>({¢«×kDÚ”Çâ×Ðcóƒ6ïÅà3C¬½ßø!˜ô—Q†ž+4cX‡˜|ö<Ùò„Ô³mNWÚb¨Œr4’!!ç`;bfm3HòV¶éÑv%ô¸ ï›&°t7÷eRèR‡ËB’ë–díú཈´Ó6óõ]“FF»{˜8< nùØÑY›ý‚®ÃÓ%à›#yÇþò^-•EgÓñݬ˜Ý7Ð@7Xx’É—ª!Zš1d$”º´ÝV#~ª¿!y¶M¯ßËiúÇ>Œ©Å°ô… Ý[®pg¶NÀ¥µHU¼·!×Ì3¨5iVBàÕ €Wgb¯í£€W ¼ ]^¥˜ã»Z£‹0Ô{5£Ã ó£MË™fÞꆦ7žÏ6å jä jäk`P]û@Oô[·úí[k”¾/Qg6¯\Ô.E\² ™˜#Ô³µgz+BU‚døxŒ‡ ÁÒÇ÷r –{ÉäS¶ªTùªMÏwá4”¶ ÀI×)¨$8æýNv=…ÎÀZBaû@§Ný`" ­RüÖQÛ\_0îßC(7'6„g\cP‰„ór`¼ûºˆ£{ÐEÞè¹ñ„Ü•¯§/»àŠÿŸb?u¯´_&º¹ýwì´Bî´‚áe1~1­'&î˜ÿ-¤ÆŽqѤÆ3íe¥A`ß-­Žz•œªXÛ.PÏüôùæ{(gœ¼vÈ?ÃÉæ›6”œùÞ %®ó‡×\ð”=ÿì*šùŸ(Ú³¶šÙX^‡0-IOanïÃü¶·mˆìö˜I™êóªW)¬Ã’äè´E!¬ë¢ë—‰}zg¢Ç—kS½;—§ÓåØ?,¿,L+»ükk(ƒâ«"{~\¤RL”¿Xþ²| ß̶ã RÆé˜A¦?ëL}Lèá8YòXT¤÷eâÅ/{u‡!¡a"Y“¦6u´p²dJF% &æýc`&Éa&mâ‰}f§]º£æßøcž“Æ'½jôªÄ~!AŸL…Zç’Üá;gi&ÈômüÃŽÙú qâmï¼N2¦·7>&Yþ¹{ŠälÕÞš ézðY¿Ë›t¾B­¿§æ¾µé)ɘ~îoÖyš1¥ÂüÇ?íG V½œÃpø±ë+eìšr5d^Éäš&¦Ø7QH°¿ˆ+zŽ,EßÀeð±w'xãIÆÜû·¿û çzS endstream endobj 55 0 obj <> stream xÚí\K$· ¾çWô±ØVô–jÍÁ@rÈ!@€½y|²aÀ‹8°Œüúˆ’(QUTUõLgã {0½],=HŠüøÐ\~¹¨‹Lÿ©KÐéyùî§Ë×/¿ÿórQR,r¹|ü!=¾Ã?üåã÷ß\_ŒÒ/ÆËã|ú±/ƺÛÝ.:=ñº|k ü~_›ôµs@”~TúI/Ú¾K¿½ªÏÒçp 5L¿Ë…’Pûñ/i™Êuª¸£Óró:¯H¢ ‰ÚV‚_ñ¹½±xê…6i¯Â/™â¯Ü$QÈpi$/·í(yÅf’_*åè"{iiO¶08’™(++ç¼n,"›#ªq9t±´1*%<Ë¿³`n:Àœ¾òÔã(0>Ìš9/ëSS¢†Ê'Ï#9ßµÖBÂþp®lOjÍsÒº*‹ÜPJ פIÆÓN¤€Ó&µE2JÁ_IDZªCæ’ŒÀ\_kRkcTfÕMû*<ëØ+–+Ž·a¦ÛøÀí”îá7†Òœ=ßêµÚ?ñt˜át ;ñbY¨Ì$Ëø¤ÎîçŸìi·Ÿg?V¸Ð÷ó‰[*‘Í{v³n1´Ý*nŒE„½!ÈZ·­P-¿[§Eti;Qø€æ¾ÚŽàº›ì °*~|“mD³eÕÖHjËàÙMÇk±úõ0i|ma¶3¦¼Oí¢ÃçÞ×ú+–-H_FϳÕ7Á‚£ª+ÞØ0Ê(í“ØÕÊ M¦ké–Éά—b¬×jÿÊa¦Öã§ÿÁHVYáUWÁlX²^Žã]+–3ë°«uŒz€ Q}¸Ýuˆ@ÌŸ`cÀSn·ogÓþÌÛúœ_ÝîÊûÉ.À9}8V?ÒpÔ{ßLž½}æy6“ól<ØÈ»ö"ÄzžÓ®£Æ3ÙÎTRˆëÉœ†À"r° 3a¹âQª`àA…sœñ~Pƒæ½]‹£Ž8††k`• ë°+7•Eg4D$Zo;ÆÉ¿+‚Ê›”….Ø6Ê6+øš˜ S5 ’ùÎØlú Ëé º2Øþ]-숦&`±Zܸ6~µ‰PO›¼n‰´enñ™¯`X >AB›a¿íúBÓÇA6RH ƺ®s6tªÊˆÊúÍhx‚åÀCƒà}4Y`´Õ°Ê#Ã\9´ˆ.lQ®&‘®©Ó4îø®œ·KÜÜ¿+X3ý¨º ƒY_×üyÊA0Á½C-½˜NAêÑY6'\Xžt{––°®~M°Ç9nÛX9è®bË6t«ÆÀÏÚøY¨äüÌ/ö·òúΕèYàqv“Ý(:FÓ4"޾—œT}síÛÜ+|/ÖfIwekìöu£?D£ À®7åÞi6n†ì޳qîa±êL¬fiâ(ó¤09˜UЀæ7‹íÇÃNŒ—"Jƒiµ2—ìFe@U+xÖiZ`ñi‚øÏA­ÑüJå›TD~WDò|ø™L£ZE×;Ù$†N‚|ºÙ òÊ'Q1=’©“©>¬8”Úémƒgk$ ïѯ(š¤;C®¨æv‡s->ôÖÛÌ‘Eáií(°˜›/¯žj¾>ç© Éž¿sþŽ1EŽ˜FÓÊ„pÔ` eî¡òùUb©PÃ,-[†L¹CÕƒ£¬,à[¦ÉQ!‰}‰5TB’q…â’½x'žyq5Koäz@éHo‚¡éñ!,Õ—àô¢PËpPØÄöBêÿÍò¹;8wëMI‹*ˆî¶P%ã!ϘÇ%õGPԊͱ/¾ïxÊwš%»ùªÓfág¶£VÕ|Öq´*ܲœHã´^Yð+Œ–m€CðT3˜U×mäàXƒ¼¹|{·Î@y-»mMÜö¶% ŽG8È~нpÏ Üx¼yR‘-í!$ÀT«è»ÕowÓe{éÀÕŒlUØf<ôŽ Â…bÐÃ,œë)B&¥É;äÖ.Óšsææfâ;¢µºàä¤ßAbíõ_¼1rqÝ0§U)?5Ô|ÏÅœ¹³içÒÓv®GËÄqÞ–ó ºaÂÐ ´*6°5éRœ4HèyVÓ‰=h:1£~É ­Â´MK„@McÌùÀ©›BšÁ4mPs4´ ´ÝcÝ ¦‡bÃèMÖU¢Xk;­ò’gÊV×ÊÐîèü„$![¢°}G»×Ž¢UïjIÍù“Š"»½ÇÛ¤–6f@ •‹>6¶¢“+ ¦ír%…;¢òj¦sòº*å7-®Ðµo‡[õlL³s &«ùö1Ã7á}xcž=èÀÓC×ní 'TÓ^¨i;O>.E, x·•á^ãx)ÔµE©=F xR{< èæB+˜`¢*JÙÊ)´ñ³æˆ<Ú!‘» ð2©¡1ÓO9úÝÚÅjÌ"¢zBíê]cŸ£q p$«Qî_jZ¨A6„Aëv(e1eÕR:S*ïÅÕÝõ¢„Y׆àR‚¶‡¨¨f)¸þ”CQ ¸Š ŠêqvùS?YëMîf ïp#nÞë\¥…lmÈÙÙÉy£utÚTX÷¥ˆ,PC[¥èÎÁ5båïF.$ûåKzTN é”-#é i¸Tw„Ür¯½$^ÇúM(*ÍK(«"þ¬Ù4[¡¥Œ«`¨(Em´p-@Ûf-ä²Ú^s_E†­e©Œ¹jÅ6IóSõ_«€"CÛÁtµ¼'ô ­RãŸU‹Õ¼RŸ+‰–öûT)e6 ‰Ú] [T?§y6ý´H½ÖÚ¦a­—´áµÍµÞXÓ´Ä2çU„~ÚQQ¼ºï)3,ÓŽ[÷$Ä –¨zÙ ÆOµ;g“hnmÚÉQð³P/·ä$<|49{i#5#ywkwž­ ¼¿ê²›9ûÚë°ndÖºŠý-et®miä ¥>{낼qЖ[Öü•5©]«JýÊ«‡ÉißZ@wªŸ¡D [my1ohê¹?_±Éxú³ùÂBɦj7üË™zü|Ø©ÎÑŒ~«¥e@}Ø/Ó±«È’]WKä$Óë+PŸÕ6i½¡/ãl@V^EÀÚ$ˆ ag±(ÿ’¿ÿÓÇËß~÷oon ü endstream endobj 60 0 obj <> stream xÚ½\K¯,7Þó+†ÝŒ˜iü(¿"eA¤ Á"RÄÙqXqÅUP‚Èñë±]®rÙãî™sÎ%ÑÛ]~•ëùUuN?ŸôIåô)˜ü¯:ýõ§Ó7/§ßþ>´Ú’J§—¿´Ûœnå?½|úóùÕ*÷j½~µÎæÿÔåf­ÎOÁ¼ÚŸ@yã3E}cò—éÁ!Ey!ÿ å÷Å„22ÿÏHãÜ•&ô•œ&1yZ“Ÿè<F~_¨ëùOŸ·t[ÔñËÕ–Wí®mÉñ< ÇEBê>Oí(¶ýv¸º×ãëûB©Î8³ í$ ]vPGÎ]Xæ`»üåå™óÚ Ö«Ìö¸9ÛØnUÛ¿Íós¶4H^— › y$Ñ´v€v(ÛXPî hm#æñf3‘æQÆM8…-…Bá¶<à¦7•è§þ±ØŽ[„á…™äÎí(º]ƒoLñY®]b¥öMº†·KDJ¢¢³VŠÆ.ºÈr=}N’X¢v® …Óe™öB¦¿&š(iôæL[K¯ô"ÿÒíýÂàé¥Á3lðÊ{mË󲫲­Z´A¾>c;¤뫵šMsµvRƒ¦fRB«µÒ<ºÒ~ߞ݂ݔß7j í–F-mÖ±Q{â¦ó_ä¦ãõâ¦åZÚl~e(ao­.˜šê5+Yd]¿^Š`TƒÂ‚Áæ§ûaÌ3•¿3B÷¶¦™×Õ©}V®ôåŒÍ7«EBq/Ï›§Ù–} (Tý9Oor4È7¯‰Ï8Kç/˜;+]ôkSf²ê1x¡_yV0–t±N`@¸¶0ÕÝ{7«Æq¥^RA3·¸[#N«(ð¿ãÉhl}j䮯p®Z”•¶¥Ì÷øaí~ªšÝÌÇ5ÍÆIÓTÕ´Æ5Å÷ô~ýQI˜„÷éý"ÎÚ f¬œõ ¼Ý h™.ïó:6UóBÕ@‡ó#Û YZ$8eIê”nyùÅyØçŒº=4ê©0Ÿ©ö$M?ZÊŠ¥ÔRÒ²í‘P‘4ƒ’Vy@6½±Sõ´H«éi'Ç!ëÕx¸c³:U:°%9®VÍ(ò0Zµú°»zµEÿHÜÿAÞ»V#Ìù-ç~b¯:c1«­bìGÙ¯œ n‹i \Mg,ÑãµcJÆ”’C·À‘f@婦è)ç€Ò eqåPŠ>WâÔT®8Ûmtú›…M#õ–Oëê ²$+’¶! “qa€óäkR£Ü^ê!¼¾MöÅ_0E‡<ظÑ!Ãò^‚ç½\L‰ööæp?˽ˆ} 1; V¡D Uç‚ê—ÁÝQ*JzVãnÔä}a °àb$5È¿ÒÚÀ3ÒHOßŵ¦Xš†#nAOÜD0§Íýt¾%ÕÞµì¶òæ. âÔBShƒ§`ä:Ê•ù’í¡'ÙÍ÷ùÀä_„î)f4ëÎ/ ™x–Çö"TÚ7/TÄoCiͨ©,dÈÈîxݯÐâ‹;÷ý†8î3=£¥ š37-.² Í ?ïûüKg0˜XØëÐ /6“µž³ä}„o¹Àƒ]V“‡-r81åД÷®RÑlÛ¨fÒö›²Z½äÛ1Ïøª“9ß'õA&õIŸG¹¯>#ô;¾ƒ#qD]V@ýézΣ•‘¸ŽßEhs ÆÉƒÈ2„e‘rΖ©ŽífA¸VÂJÉy‘ºZ´> £–ÖÇvh…änè ’Þ•ñƒ»ª÷t%‘Jaè¬;9€°”§5î“ÜlÓìv¿ © Ø”‘׌?S°€G“ÖŸ°ƒ«,¸òã ^ébFè ƒÝNòŒ’ÃO2\ÅYýèJºq#§QÁêáÞ–ßæ_î ·÷y]·Ø/Æd¿ËdSÜ`e2ŠÁ÷g¶NMLŽûLÎÖ)Ø®óƒ+ýë}°·ŽjD*>| á@Öm²¾¾¿½©”õ$oôÛë[h} î¡2…´ù/z ‘/a„W³*D'U¡º8õ]#™Ì›«+i¬IY;°²DnÞʼÚÈp“ßÄ6%7Gªgbï®kWõÒÜó¶0MØìâpæðpðd÷e™#˜é”; I‡—S0‹§2‚ñcND°ƒà‰ì3)§31ÑH/NäQhoŸäT£~ŠSºD–®€"˽êàÃóH“z ºc»IŒsFj:LÂ}uGx‰Ë §}k,+†&æPnŠDW‰¥ÞàìAZT«'…¢ð5¾öÎDáø{2™ 3‚›má ÒPYp©x¦e;Xw˜v.¾dÎŒÖ|^+Œƒiwæ—A— ŽL†³r~%r^G7?)$a0 s8j—Ðç'›,”h°(—ª¨çe•%ê “èŠÔ@†–j%™-EcØ\Å¡Yj/±“ù6Ã!bdŒ@G»~’-#ŠŠu×Ùø=\ùQ <’SóÁO fÊÚ‘J€1,ñþ …t#8UpS÷e™ËŠø{å\/_׉ þq„âu˜bi*¼¨p,íDèmöøyyB—:(›Ye—^Œp¬{ð¾2·y*{„ Ck Œ{aM~›çºò”MŒƒ“â5LbÆ­9#@‡È­£ cmGcØN>‘β ¯~B^Á-ºÛ=×˶ٳø„J1;'Ÿ ­¹DssßÈÜì;>]¿³j;–ð[ÝA˜ûЂl4èÐ!æHuœÕî’tg"‰Ê"Vý–õ¾‚ÏñÎÀ‰F¶•aeØ:ÂQ)ÜãÍ6>íQ÷K4ÍS]È£NÖµo(«pñfè†ÕF¶¼Ç ×; S3I=´4®™š&¢²(ö¯ÓBJýTHœ¥´{;î}t;˜§µÍJ Sw”'§V£Ù©;x¼ †! qäñÜv_.ÈdÅ‘Ø-¡7Ñj–¯õ'Zº©<Óꀤ¯ò vàcdwëát;²¶b-lj*íîõÈ÷ÀÒDöH{¸ÂŠÔï)šc®Í¼á›#þ­òáÛ6nÌo𤲠LjVp’î™ Î(û¸_Í̲º;Ç4$ˆ&X®úñU”Ç0é:>á¾Å0Y^MSq,óA»ŸsöÑ@6ð¿!äžz+{gâ•·v²2•ô¶Øˆ²#¨HaÏcËÆŽÑî’Ø÷TEËMÊ~JîÖ°6¸i;s»ÁÈ›†h2 óØ)âd3þMt€ïvwçñNiW2ëlû•ó¦ÄÜ€úíËéçÓfS<ý»Ü†ón‹§ŸN:†òUþõÇÓŸNßãçLFåÀ3…HÕfš`ÊײLNqK9¡«²vÅèFꉴ²ÅG¹wV¡~Û¤|ã<¨ú¶E@x8ßÅßîÅ`½{å‰ôÊpo /{|ÜÍeÄ7;aá*u‰¿ƒ S sm5ê’Éü)UÆÌν+5b ØÖƒÀù¾S õA8CÉš/u¹á³µ1R*}¾ñ<šÆ\ðMkùi\7ñîS5þ2¬5Ý™.B)•X\ ­ïb ÄÛL)rþ9»b"WŠiã7$BHs‘!ª£†z™ƒÐ}0I4~ÄG¥Eã÷‹âxQ#æÏ«°_´ñJZ3iç°C‡§^õðF`¤®wÎY,Cî’í¦t S‚ú;"€NàEG‘R|s¶s½R0[_sÔêAçü×´©Å~tNÉ&)0®¿Ž%®Ã×_ŒN¦¿[l#êpòa{®}%Fƒi`² ¨sD× ‚ ¤/ÐäÄ4µ” &ØÊƒy²9‰Ès0°Õ â@½h—›´Kr—}ÀØ·,w!8ü¿¸\¨Uæèwä,w†ôXìÅ÷¯B×{QéÃÜœmÕtXÁÍÇÒœOêØØóoPšZÄÆAŠRéÞë˜×J•R/×\‡žâ÷vs"ö¥†ÎÛ"H¹™Š»…¶!9@ì?‚Jx3Û3ˆFDƒ1A4Ì}—õÔÛ Ñ hB‡ÂöpˆDÝhØË$»Ñê“ÝÐ9¶Ð¹ 4ôkv÷Ή–M5ˆ%ÂCì·;]y‰±*ÛÖsÁuN¬¿¢(o Õ¬­tz°{ÁÉÔ6Jtsµ÷Ê¦Ç Ïýãé¡Ù9Å)èÂOú‚Jâ,÷Vx?Ã_’-² ]y~YZI/>êr+ %cµ Ö=—é§jÖœÆÞ|ê5•}d£g¢1½¿9ÿlë_Šoi8ä[% ¼ÁV^rµÛdŒ`Ýè)Ò£5ßu*{ð P°W"9ÄÄ­}ð?]hËtð¬÷0Oÿ[ÜöQ´­vPmjDy_¹m[+éc%Eú2ØBÑÎ}+Î7 ž±¤ô–Ô:ÇÃW*CZ›j"0ÈÉ“ùæÉÔ 7…=Ùö~Yï­Zz·”ºÁå$¿éþ¼b2'°ú"ÜŪ6gúQ:Èo_Nßÿê¿Tî¤+ endstream endobj 63 0 obj <> stream xÚÕ\K$9¾ó+êX-:Ûáç®æÀJpà0ÒŠ9 ÑœvÄ íˆ_ÃŽ°ÃYΪ¬~°ƒvGÓ¶Ã_<íœÓóIŸTþOŸ‚Éÿ«Ó_¿ž~øtúÍïÓI«5©túô·üzÁ_üéÓç?ŸŸÀ¹'°ùóùoý`B~æÝƒ‰øÎ×ß­Í?«üÇ–g‹µ Ÿš'Ÿ„:ÚA-äß=¾³L‰¸†Wô·Îø™A*Móá›Âæ§ø¤­ê*…¯z)“TFqM¬äŸ½GþòéY„LL«²YE JY"’’ « DñØØqu%Ü0®Šb ¡‰ÄÖµë-„T¸ò$ÕÞjâ9¿ºŠ°ˆ³‰`ßR8]Lò+è¬KXc]Z’ÛL–4í‘•¬UfJ| é[ =ƒ#x‰‚6¦èÑtí[ïÛØà…n3Úºm|ƒ›êªZ™D~ÅìSY¦³4•e¨:¦g U,´¥‹”;Ìm0ò]¯h°Šm‡Ù¬E•˜±.­Ñj~;ÕBƒâÐdP;lSäÆÄ¦Ï¢'Ũ.4«ªzQW1Æ8B@‚å±-ê°­u·!ª ÛÄø~V &®&I+]LçL¥Eë.øL:ÕN\m$’è=d3O¡¾Ìã¡yF1Eh4~uÌŽžª pZÚ$'Èz×ÌfV:J %°´ü†AŒ¶ëI+YòÅ @Ê»†K/Ð<7C›<-»tJì¥é)HE `„3 …ƒµ° Ýšlf ®ˆ… X°5uGÁxîEUjk:Bqˆúq§º'eˆõñ­SÙGÙ@2ûXê`É6€=È¥íÕÑÈŸUÝ Žª`£Á12‹“×oXg´-(¾Ðã%܃Zƒkàpdëìx½íö"÷É 8Ž ýêÓŽV.ú¾n³d¯NØ·LõŠ3h`æy~›=:h+`\tf+œƒ¯8(lh¤„ó% SðôЦ*Ó³ PŸî+ŠàR–éð2ð£—+m„p¡l¯’Ù©2P(šàx> _[ƒyÌPÃø†)ÇôÞõueÆ…õ YÉ¿Ô1-Ä8!­ºº!)Q#ŒCÉe”$¨©?9jG ÷:’mœôYg œT ƒL-½Ì‹(6?±Ï2·LE›Áþ« ¿E/ª*ÅnR'OaÍÚ8IŽýÍäXø:U’FÖ%¹¿ü$»à,kÅoƒ?S–é »Kž¾ Òõ€¿™›…HÖsòtEÄLÉJ ¶gŽ¡­QìÎÖ?Íg0ŽʘÛ`¥Ð·ùª Õ²©›„AÉß*Bb2Âè7‘öÖˆ€YL‚m,<ìF…·ÔÌȵ ÇŸ§“³Ê6…È×P`=8·ŽO<ç=NŒF„±’Øêä¦_=˜‰pÕƒ•„ÒXŽ.»ì‹&añZ'v¡…ç6†Ù,@Ó E.ÁÀ7ўǨ‚#ê›2—í qæJ¬’_ÙÇnº`¸€¢·¡sŸuä‰kù(ÊMcÍíJ›àÇã§Qßý6()Ü]‹s…â¬Wãžž”ñåçøô wÆáÎ^]s÷­œ+¦Å{Í?I0ÕBˆùÜUAÁgr;Õz~[s¿JÂ,kHé¶ÄÙ î)ù#LVxµ¢M/ ¾än8©£fÉm±Txi­‹þʘ}n¥<®á1œå|%-TÔ¥`³r3Åì§\ΔŒÅPH —®Ý;.k¼ncŒg rSÛJ ŽMO­õ¹o7¨mÁ\SâÂÉ‘lkNˆÊ„ ,`H2Dô®Ö8±*óˆ0´+˜J½«ßž%òÒY•ßï"û¡'Z´S|· zë»n‹ŠþQPùàXUÉK¾ŒäG('Aï–ȲcbwbʶtaDÑ{»£Fø6ßÎvëÆ)+}HW†@kt ‰Ùí4§—´ªØª¸yÃpúo~oE‡¤Ô;XÊ6˰HÈžýÔHHOCŸ%¯aË,5?WóY‚?5’3Vµ^÷„þ3)XB¢¾^YvJ‰~ˆx>ÄøG)ê¡1›½úšôË’*N93ÒÉÑßSü¶-¬D2ïø-7ŠZ¹àä̼'YDòþ¤¿rÓ&—qjµÜûûD¬qaÓŘØZJ/´5ÚÃÆÖhßWZÒDÁõZkMâïÜUwi?*o¯>h>ÉÈRñ–õ‹ Tû¸zsË@íUµÂ@?Ή« oo ‹ ±µM‡¾‘ÇY›VaÃăE3Qr5½ßä$ÎIZª‰ ØÖ¹¨TÇ+­ ¥¼+=Æ=m±:?O]”íj2ܯ6Ã…šÊhT jJÛ–u£xœ)R¬qä¨lÎ¥½â0\o«cÆOýh3ë‘f©ÆŸÐ:uî.D¶€¥=q÷œ=ÒùôܲÕÆÇ“ S›U±¿c¾SÓ¬J÷³=µìŤ,`×d¶ÂîÇEÔvušI`×ö–Fö¡œÌ˜¤LÌúué32F‚€ÑO_v¢zè@*•›8«1ƒã® äa”1SΊܖˆð¸…ð#¦±èÊÍçË –Y²~ª¡~šM²À V7y÷ƒ'¡™/“ë¡d»²¦óßMs!•Õ“±Ñ,ívĦÄù'è—båÔþ«íX¡´ÿÍA¤-ö0Oÿ8?.•iÀ;:fÀ»·‚¨ø/9u.NlâSF*Nèʲ¸T ÆºMj¬¿RFñÑ¥º•¥õŽXÀ¿]–vWe÷²´Ÿ§‘ÛÚîûÅ‚fÏ2)R“k ÖÞ‘ý’\UÓC Nÿ[û·ÒÛñì£ëq]Nè+–°g^•ŽG#r£÷ËÆýM=;¡ççišçD2þØvnä}¦ñ@¬ž#šM»¢dTÎýê‰"úØ`åÀ{€•9Ðï ](fä ˆ~(ÚÈ쮕ViMñÐ]«™‹:_xWàn¸;ÔkXˆ)Tn—8ð SõóôMwøˆ–©oõ´ë*G;Å•:ˆþ ÔDëžöÕÕíê I™£'}|÷ïø]¦Åç$sì í¦÷òL,àÄ5£ñt„r¡ƒ§#DmdÛüòt¤…ì·ÁëQHmn¯`n·¶“Ç CoLvV?Þ‚‹9¿ã!:U8àá‰z–Ñ›ž¿ùþîÓéù´æ¤äô¯“±9MO9EÉ™6ꯧÌþÀþqúãéÇz wLÛ8Ê|oÛŸ¥Û‚1mš5GêÅ;2Ë# ¦»BZÀK¦.Û„é‰sô´cýŠ 'l˜ú«q×Rê·Öžo. ·-߀«Ã1Eõ|µÎñ Pßû·ÛR•zj ÞàzCýr«H a·oÉbë/ ¯>d³Uî¶ñƒ]³hãrÈ}w„YÑÔxž[…ï-74Š×2Ü âÜΚ¾vx?ÞÚÂQ-¸zXïÅ©B ‰ÓVË.®i¸ñöó´á×Ê#1úˆCvE°ç2FMÏAÆïáèÃR®q ¿À¼èËÑyÕ« ­Øª3æ9*{s¿˜¤”enþy‘—8ìV]Þ®–»im¨¯³®×’ :aÒ’ó$úÓåÅò `C)¾\vûcf]äÃ^«/S`ß0ég’̾Ì=ˆw"¼üZv¼Ó{µú޳ÐcRyžóáÕR7—ÊóüÜ" ØÿzÚ‹UØXÒ¥[³‡JÌÚ3*ƒä3PúKÈ*ÆëU“yžŸš8„2¸oÊð~Pù¡´ïgíÀ±ÐG,`p_ýˆÝ› \ÿ8hêÀ¬J‰¢áÿÉ”‡HóÖ~ sà(>G‘)˜N£Óâ §&¥2QõË#z°—‚µqÖa$¥¿È?)sJX }›q2³h=çÞÃgÄ—úŒtÍgDE.=ÃýñoÈß}Bx"àÇS·ÀÓÆ}£ày_Ç;xæy#~Ïöf‡u oÖéî5×€›“o7ÖvzK—E]ìŒ\þµýo@-p¥I`D=DŠú ÏäSJùÕ_ª¢s¤‹ºß„5Qܨ9 ?Ts<ò ñ‚w=ŽvÃ܆þ]K;Úä-µe;›BJ'ì$ª_>ºÊ\¬<¯Zr2Ëw$šF[Õ¦k¥ØÎ-@Þu¯ ËOЦFXZ—uÃ?M^ìËúõze:•¬óh¤ãJCLòèÊ7‘†ïùÕõ¤Ÿ¿6½Q‡s©[£¤˜£€:-Þ”,õëIÇlJíwáÿÊÓ¤uŠ–óß‹@D W]B~—¼¯&±Œtƒ…nz1Zñ»ëp°qß¿Ô÷|„œv÷¶|²aÓ/Ùµ(¸Æ B’ØáÓÖ€§þüúlû ñc7÷$Û½ÈGžðÚGäíŸ)¨‚¾ÈW®À‰S­EÅÿx„„{½ZN¿ƒ0> stream xÚÕZKä¶¾çWè8ƒÝ¦ÉâÛÆ\ $‡™CON1ìÀìœä×§ŠdQ”šlIÓÚ {¶»)>«¾z}Ôô6©Iâjò€ÿË韧Ÿ§ïþ¤ô¤¤ˆ2NÏÿÄoA€š.Ú ç§ç_~~xyxüûóŸ©4ýŒƒ“Q‡ÿðs3y==uôtQÂ…ÔãGîѮ䄩vyy¼ž%­A³èÔåSw–©>ºžAP“Ò™Ôã_¥‡®¬P|Œ)eï$6–ŸËSpÍú%QX²¬þv=°( ÐÂØÔã•{øÚC‹ÊO²'keD¤SÈ"*©eOXÞ·ÂzÈÜÍjÖîÖì_z«!ý!Íöj £Ü…`”°ªªoTÞ+ÙR¹wsºTº{u"Æy¯z¤oŠþÕcP:•@‰ž •¿îaÒ]#V2\oÚË[OŽN˜„emok-œ…åo­µ–ÕËcÒƒŽÂßÀ¸&ãfÌM ó?>Oo“0ÚMÿž”•ÂNÔçó¤œAÏX~þ:ýuú©Ä‚ÅÒyLìþÅ¿tq‹ß$LQ(¸ßõÄí ·ÕUvË=Âb•ŒÌ¬ÃÀÎܦ©omgždRøx6W3eïx_^¯ð€€s3ÁD¶Z TÌItBšÜã0â¶ÃØÀ×¾›jú‡ßüöºùüFnÞ7ðûMkݼiÝ<`ú¦Š›W;ü¼=ÃÏ+Ì|QöÕÑ—ßž^ëö§S®^•ežS?|éÏ¢~oùÔbsÉÐ Ïî 'nÄ7 Ô ß“wµÁ1’•ÌyWS5-E•×»ÐüuÂõ„ìÙ. `Ѷià´°áÃX)E „,Ð=HF v­®~s©ír:Ìpø¾ëT ×g¤ìÅUo*ʃåxMÎÏ5ÔíÆ¶Ge“­^<¢¦¨K+xÑÖ½ho_´3ùÏJütùÓ`»¥gØÏëÇ‹GY-’z´-Ô×ñ3¥?¯ñ™åÞø[êOЬ¥òz©M6ã”Ð ÏÆkʦævïóX«ówïò|N=‚OÏkO›{­wì ÷¤Õ­á•ÂC9+ó“ŒT)W¬ˆ„´ˆ‚ßz4:Ž—E¬r)–2†?ó{Z^Ò7[+Ûqê²Ü›Q¹kÌëë‡!.’‘ZG¹Æ<Ì*ÁÖ†Ö¸— aç,u/ÞÌ\ùî” ŸeöEê¾5ðj·'§fÛ]l7&ÃK»SÉÉ”'qÃ0Fó¸v»=_d)0^0±†­ê¹öéZS ErEÃh[¨² ʸ7¤-ǽHI¾è0ýþXC16÷îáÚ° HÔ´ìÊ MÚBýÂYXLõǾÅâ„Þ]¡ÍŸx|úÌFªƒð7R¸ ÿ•2A+ŠÜrØaº›ŽB:b3K·§A`;9·UZ—ÌsMX_à«H—ý%ù5z¢ŠÂ ¾²Dûø¬T̆°›~U¹ËTôù¢0ó± I2Í5–;鼯ÈŒZ±¦‹vélé.Ÿ"GêI›HñÈ•h“z>Z‚s’†æùÖÑ'En«þòûëÄeŽ™&â!¢ÉÛ 7¦6 3sÔyßx›AI DhÜM¦CZOù5ªë½£"%%Ö˜?`1{·:gÚ¹a¸w‡y±†÷ð0f®~èž/XZIž”Ýèâ—QR6FĉNQÎyb¿¹a6xœ sÛ£È×"1_\)rU ,Yù~yIòÛ¤f[ô²z) =x6+| ¥TEÏ C€ð8 ¥ÑÝM,ir› ûe²8ŠÎ÷nU½`4ékK½uÜQõ¾õËÄ ›¬`W©óÚŸÈ5W*?<^ćn9‰þôº4nÅ{Un€ÞÐWºAb€6t–}šž}bÒ™ô€®ü( õ»Ú0´O›šzOZ7â^LÏ>WL“¹ÿBl(Z:^Ê|Éö In¸e{i\œ©Ø;¸&T‹]ÛÞÒ®_±Q h›˜€ µÔq;Ôr²]ígCŠ]}êz\ÓßeWϾôM c±:/äÙŽIEMÜöEcÆâ"ª <8ÿiŽG¹}ù±«LR öÔÈê ÑÝãÕÌ.^mWàÜ@’ÙÁ«…Û¼š2>¥Z˜hS̵7zZnÎIù”“ö'}/©2¾ŽÀ‡ßïÕÒ2åÖÉñWÜRí)·[ÇEîØSs9ã”ϯo5Î3=î‡A6•ŸÐ¡Õ*(zJß7Äã*h˜"™YAßÈ•ã2ʹ~&¦RyÆ2”‰Ù¾Ï÷šÔsVÔp·i`­„fØ.+ëT—ö•8È\máeS-îf^ÆÈÚãç3Ï9â|ÜN·’ªDC$¢ä‰]!`&˜3<·á±ó!2U°uT[{¸²ÑF\«£b#.cž¸Pí‰dVšéñô‰vcÇ| +êŠSV‰CdÆ$Ee"ÍŠEA–æy€K¤(O±ŸèÁd–¯XþÛ§|ëÝÜÓ#qEƒ«”úõ¯ò^‹ÝOËŽ]"|jÁP¾¹ ag"жEQUMnST,uF-ë“ͤÒ~4·aöÖ:*‚—<\{çb Oé[̰H­¬‘_zþÛ…í»~g·£¢·XåG±J®àäbKŽ^é–FM–…ág¹f­fwC×E­UºÞ0»^”Múêát“¹’Ÿoå×=ÖÂxÎ^«%Ùƒ<¦ËZ±ÓLÎlá8øèTýÖ¿á8ÒÞŸ‘é¦Î¦›:c[…P»kÚçûÅÎáð@¬cøOýׄüÊu…àHbmH]ÞGåŒÝHMŸŸÓE“Öµa|UÆ‘ŒíNS¼kã ݆׺gïBË´8E¯ï¦Ú4ÉWÓ;ž¨—à‰Œç†ñ}FÌÞÉy/}~ÙOœ«›åû±^´(%çDØ@);Ò‘Nýû^³êÞ}¸o¿ ;¤ öJeI„TÉThiÒ]Ë–Nxܬ”ƒ7nW7)kšàÿw“mÃôÜí°C¿~§—Å“h°€åvX??ýááŸ=5 endstream endobj 69 0 obj <> stream xÚµ[M47¾ó+ú8#í»‰¯D{ËæâÄJääßcW¹Êe·»§g”¼Ú™n”ËUO}ÎòÓbÿ3K²ù½üísùö¾üö;“Ÿyå|\Þÿ‘ß?ŒV[þü÷nöž¿lÛíÃÿáB¼ÛòÙ—ÏúÃEúë_]Æä÷6ÿ+ŸþK.ÿ5÷‡‹!ÏŽG‡2;åù­/#-®Í_–‡Ñ¶ÎÀ¶÷ßÿTèK!Qo•^»)ã€^¢óиùS§ô Ú6AšYWb¦°öƒ{Ë«'óõoøÿ~hë'—Ú‘ë¢èÖæhiÄ?ã?íZ¯Ñk ÆÁN´"Í,£ß‚çñ÷J Žþ¨§}§B¨·Q¨/œ©rßú>ËóóŠk]F¡¡<-òPÆÁøÂfSÏðå(IHd9&ì³ñ/à®@A¥$´õ‰®TOXÎTX“¿G‡ûë¢Á}Í8«Žò=eÄä”Ǥz.äÌÂUxꑆX9_n¹P>òªÍŽVH¤këƒ #7ó'Pý€ ÒÃÕÈ+©ì…ɈóUìl½¢BÉ‘Z!è«Skªrþm¦V™­¾ÿ¸?îo¼Se{¡Ç[q…iq`œÞHI<þcØÊ K§¡Ñ$‚òzAáÎJžF‚˜ nÐZÉÑîkUÖ‘¨ Ià4­MG­•üÝ:þâå<¶¨ô <’ïtµvË*ÄŽ„Ÿ(.z…3×?îõó‡Ó¶|jz“G½(ÅñuTýÖI¦æÃ2Þn¿.Ñaa%Ϲtv£<Y=±Ð5Ä‘~ZˆsŒ„¯pe£­ ½õPð¬ŽÈDØðq/ŸW¤(:žLK±"V/‚Ó¨ûˆ¾u~U üF7J(DˆWpŒD8Âh3à;ßNH‹öeu·7>«¥­R’ZÖ‘D:è;Ò˜P ÀÝO#˜_°6Á†™ ï|å.™GïÂôðÕLâH€W”·Â@„†ÃÚdÄ Ñ‹¨£ŽL¯hà=®aY£¶íûõjª5a7£_U‘'|0R$@:goM­’îÅG˜[¯hlðb3¬ÒÃítqäò7“GjFüé­vÒj¤ç¾÷ÈÚ Ù¶°£¶Âð/SÛ†þ°*FÕØ"Œ¶B8_Y^Zê ú ¡ÒËÔÌÌ/Œzj~·ÁÊ%ò€üŠô̯X·g~Ŧ¯œF½æ@X«•?q VµÚúúwxâ·%/ŠøŒàé2•Ò{{%b`oùv¢Ž Õ ½ÍÑŠµƒî V01ŒöéÖÔ’¡¦ª¥õÚÈPí¹°í`ªp¶®#ûõÖ|êDÀžÚ­À•ÇÞyžnDÌâ›fxÇ™$¤^fpn|A£8°w’c3ñrÛªœ9sP $Çžù^ƒêz½©5 wÐÀçSÈÕO½•ħŒ«Q×6vΚ*½%å€ Š"|ì/•–gÐZEùé"Êçò,9†ÈmIjK »«Wz]å ŒG…A<aªìÞùÇT7SÎ5kæ…HD†—.­ƒ=ÔÉì}onv¸+DUýe(HJVM‘%“ãýžÓ¢ÂNN³ÆYå-Kbô÷ o×µ‚‘:xŒQAÎÐF¾doLò*¬•FE4¿dE£TŒ5Ò¨„êÒ‚‹«Š¥c.åû)¨^!Þ7LÂ'„ÊäõÛȈvà’ò6ñÎÏlåºs¿Ú)vºÁµ­¨c‚Úü°L…3ˆ,ÊU7BæL9W2”R Äb o0èŸ4ËÀ'4y—N)VÝÅÁÅÇ'¯Øy ÐêZ¯zh.Þz¸ƒÐÔÜòvˆ™+}Õ©ðÂÔæA’b磡G+²hu®¥J€[¼nLÙÉ çµÎ’mÓ¤‡ù0Ä‘À¨)ÂÙ’¬%€3UžbšÛ&8tÔÓ8ënøÔ•…¯‚gVÛy×%;R‡JÀ˜‹$ìiDP’f!ÌF¬³d‘Û®¤œpn‡GX8÷@þ¨‰Ê0âçy* påõAn0šk®½¢¬nÑaUs´ñ ÈæbÛ×[£„ÝqXá3Ì•õîüY®jbõh1Óëµ§ð_kÊ7´IͲsÍrJ›¦YSêC ïŽbM_|š=šV(i¹ïÞÿò‡?çˆ`¢2qS.´;õ¦± Ò£§g¢]øVG]L•wY³ÞúŒq×<Ê[À ­Þ›È@†™œ?L 2¤}»?2?ÿKƒ]‡*JSBü÷³ÕJ@Bwùó„ǙÑê \Šô7CjoòH/Å™ÍXTg¥IË;´ê8½5ëì^¤ËÆþf+®#fÊ­0Çg̲Ä8ŽO`Zà¡5S‘xLT®ÃÌvð*9½Ìn$¨Ää9ÑjdÄÉ.›53®» —¸h¬WñD`y“£Ep3¯?+…-BûÈ,fÃ܆ŒŠ©ÁÐ\âèYs I}sI°ÂíB’ššñÀ$HÔÊgH´/$\E¢Z@™ ®y†DuÄkHd³•mnEuœ?P‹÷ÙBVá1¿X7€,|ÈìÈô¯döÿdé*êOÌÍÌK £ÈüÊ•~ÈÌe ³_2ãKH–‘)A’?D¦µsXÙ)jë¬ûZ‘gZQ>êzËÉ,‘܃xßz‘ˆ+1Ï5äfÏÎz§’8œn¾nK (ˆ3gŠÝÒăŧÏ”:|r ;’QCÔqê«C3ÇË}Ú.µJ¼X¬ÐA…'í[37 Ø‘q 2Ü{”¶CuycZ­Lô7´EÖ#ñ’Âk…>Ÿv°fׂäC‰VHƒi“¢û&PNÔ„g·`Ί^ßf— |—¡¥D6ƒ ®ç›D¼ê?¾/?-*ÇHË“Š%iûÍ.Ÿ‹-Xâÿ\þº|_;è:ù¨ó¼Î¨|5îâfqoqo:‹{¿’*6^ŠŽa½¦q¬·ÈƒN .À]–éb¼»ã¼²Ù÷YÏ2)Ÿ‹Éا?8ºžg3ô„k3±"“Í1}®Û¤F6'¤Óè¨Î€;®]ÔnϓҜ‰IxŽ^·žƒ)óCúJ ;¬WRذöi ;¬'LñÖMzC`×*{«+¸:íÐaõä2v½‘Þ„S£OÂÉë¼Ì1ƒ^,ÝÉL*ʃµXü&;¼xà 短±‘.ìüä`Ë)KÞØ1)‡EXˆëX¼®õ¾<&óÅCo\»³”hîï’“êVTvô® Ú5j gžFÞf•ˆ¡F$½ùð•NN‡®ÈõÛØF‚6íMI Ü“ ÿŒÓ¤Z¦‚žEµq\F¦­.­ÞÌþÁ)9í|E¥/̂Ū\QÐbˆ/O«D!Œ Î!>Ñüý=ÆNm.Û2¤Ub“=“Éi/ ˆ€|J¢y$}±y„¢$\íBÉ“vÉºŽ¨y‡’MñÖ×ÑÛSÙpÍõ¹Z:­óv=g=7YS^Ç•xÐÁƻϊ^¢ÇîxJXº=©9ýr¼ÿÞ«yÙ Ý8ªJ>5Í:|ÅÐètÅ4ëøÌ4Ã:œÔÒ}­r¯¼&7d“è£Sߤáy<¶C_uY8,Ðq§ǵï†]R=ö6¾’Ûk §1·×Jµ2%{Š‰ÏºD‡®ËØš¯)˜{dΖ…‡} [¥Ûí&/=tßU‡½i]>Ž—„ƒC…€Öó.ktÞèL£9‚!ÓçÛÁš_Å£½PäL äIvëÌ¥Vð}Šò¿Î\P9{Z!E*ìÐG;pFDì‚“H[&ƒf áHîË)\áP ²EV“~QöFÉå9Q~ëzÜ`÷øbÓM£÷X¬ûðyÃI™eûñ)ÞŽl¯vÒˆ"¥æØví³¨çñH«Q´,,õæy'›=ìéO޺ߩûŽKˆ}IäÏãwÄòCd€> stream xÚÍZK$9¾ó+òX%:½vø™ƒV‚Yn+ú¶µ'Ð -Í^àïa;üÈtfVMWKh¦ÔY.;l‡¿x}éé×IMÿ©Éþ—ÓßަϯÓwZ&%Å"—éõ—IY±˜i¦7½þý§ËM\à_#oÚÂuÖZ^â¸Úúóë_P’‚F”ᜤ|κ©@“¿Ip$Y‘d‹Ré7íõM;šÁ]ÁÓl?&ýnó‡Và}mR‹ƒ<’ži”|á.ô“ÓѶ¨ƒÍ"éã E-j=†Ó$´D^ ÷2©ç@!J;áQ¹`„UZôäÅâ©O¦òûMJÉ’|éã„ Yoj¨ø8Ëf¥Ûµ(lòýp±ŠÆ§¾Î>\> å,FàÒò)^†@X„c eh!5ïçv e66Ý*©õù(lƒ ÍGz†§‡û–8 kæË¶Zزáxê4%/Áá³Gá^m–A T v|j³æÓhÁGC¤-Ÿ@å)K‡”?¾N¿NÂh7ýwp¦Ù[ñ6¶Bò×O~LΡ[TŒ0áIØúrÑì`ËÑ’ž…-¸[ùhâáBò<ñ¨èp µô´ µN8E¾S ©P¥ÎâåûžN˨ –åÐYÐŵñº2Þϰ²éê á’=c|Ê£Jôè©Ou<¬uÁúIÖ¾êÿë@4jˆoÎÆ×Z]n6/•l6ÌKéÆ^–ìÉoEØì$ø0Yiì»Ùrc(‘². ȱædm†Ô¼ m?KOQ$èËKÜòL@v„M®%ëÑ—åô²*æÜ =Œ‡âR°ƒKÝDtZ¶ÊˆÏ¤FuæOýØŸz' ”@²ÝÊ" q§V™² Š÷¬RÎ;Føs»øóR„Çà—2„CøÕÌ¡¨$cÌÛf\BÄi–qH5޳Bÿ„¹ØìáCˆÞY¹Þé‚Û8]k„KLáB:ѧWÛÇ fÓb¿©ý(ÉKÒÅ@_ŽqÎígI½2cã£Ð u#œéE˜ÒÃ0ØšQÕ6ÄTÚ$¿.b/Fá†}i„m£¢DÎÅéJ#n^óæÛ–vàJ3¡lë~† ÁÔߨµBL«%*Dw[Ö­>\IçïÊFÖêäHñ»¯cK0d3yQ§«LÇöuGˆð¨¤í~š ÿv°!œ/ÀfGN=Apƒ±E`…Wq©Ê<Â^ã§À/œar­4‹³ñ2ŠÆJ HÞ†ÛÆ¼ìT:©¡·’TRêZå´îê‡Ãøaã0íc?JrV÷vÒaÌuÜqË8©ö5Õ}2¬“a ›zÉ!ÙpV£×pý¶ww”UGQ6ÆÆRgwñô[ð»U.Õ@vÒì¼Uœ'&£tùK*¹ìxÑ2Û‘$QÿÜ™ÎÙ:Ý𤼮fMújm>¢Xf6©m¥$HYœ®“3Bc\+ã>ПÁg,'|†nøŒÿŒTÈKÞ]rnëe¸êµÆk=”w[¨¹»\l"¥êL”ÕD:¦ü>¬+:Z9¤Ðéãzp©àKÏÀ,GL؃¼ÔB¤X{ì»Ü:Ã=SÙõÂã8Û¦ßËæZR.Þmc–Ù™2¿a³(Ùº5–[vÔL{NZmWGÆÂo1)‰h꾨*ûeÞãâ>myĶÇì‹R –o`õˆ1‰vɧ£‘>‡Îù|­<"uíӌĉ¤žÙH‡móa{ÝrßpØ\Ê™,Ï—²o%Ãe F^Û–^ÃÓ^óá‘ѰžÉ4¼xCWï” ÕÍÔ õGsC½n¦=1Ž%Î&€Í {@+ã‚¥:d(°;P²š‰Åû#Å*NS¥ÌBvÑ «H ›@€9ê^¸z"o{8Å8_ôFhó4CsÙÐz<`Ot a€…Ù6,éÕCjØÇCGÈ=Ž3ÒÓëh åPwàA­¢Ý‡u¼ˆŽh®žÕqî|†p2ƒ:…ƒ"NäYpð§~î/”˜ãPãŸk•[×À2v2x*Cöaì×321da‡!k•Þ劵¶{‰6Lºså5¨¨TdÉ”O‡L¿ë†dŒÈ¸-béO ã $kKÆ…çºÿÇ|ô•ç?>:½bë:iHÄ“¢¨±Qa%K}h®p8×S•ÿ^òð#ԛ؛ ×ûuIa$!õ!Ø·1´›c³ ½õtç<½€®ä#~i—…yû:&Ž2Mù ¾§ç;ÂáÆ ~4ßùa\æ³ùÎa²±øú6âýùJ8ÌWœ§¥™Ö÷*µ`¤>¼ÆñB]Ìá¤m ­5¹­Ùš@ˆ)4†ð¥a7…æqÖSî·ËÔèê¤ó²ª)À¼±kWnçÚiôÁµ€¬üTß–Õ³9éÅuQ(_ÂJï¶Kk~[;ë,2ß+Ëȵ¶UùM¼Á”'ôŒŒ·ÍE€f“îôVÛ¹g&#èXðçÊï>Hh›xäï¾wYnóuwUVÉ0ïE±å:Xº/Uõö ï¢\¡ó=gb¬¬Ü5·EÐe½¬9•iNW5ÕÒëD;‚ó'äñ=©W’Wï2o’e~Î÷à^3A´ohTX±@MËà B½gQffºÕkÅ2 $ù\çñÅžsd ÖåS!bÕê¬%öse5’ù ½QdÊÚšîòB¦|“Ôþn(¶Â¥Ú&Égõ† Ÿk²ãÔ–ÊÛÜÀ7·-Œœi'W+yNæ»$vô#  íIÖOñ:®Ûý,xøió*n{«üC%31™zS…—'뼿&¾÷²ë0^U¶w^ÈÕÎÖ W.å‹D¾»Hd }£·w2s¡$O€·!Zm{ûFm ·w‡RêÑû©ÇùmXé­ÉäC ØÅËÝ+¹¥Ë—­EH7ª”{šÇ6ùè§ë¬ÐWÄ?Ž¿ ^mŽRf¾=ô¯qñ‹‰Üe‡AbŸ•‘-㌌Ì<¾”ˆÅgT…á¬éÇßü¨œ†Z endstream endobj 75 0 obj <> stream xÚ­[K$· ¾çWô±™V$êUÚ /#ÈÁ@‚¹er±œÀr‹ÿ}DQ”¨*Õ£gö¢kªTE‰äÇGÝþ{37ÿ3·ù}ûé×Ûç·Û¾O7£UÒéöös~üÀ?ÂííË?îïÖÙˆøëò?ÿòÏ·¿æñÄ  •uù5ÿ™Ä[T)âãEÁ’IªàÊ]GÈ)“Š·6à]Cxy8ò¤ÞçI51"^ç{öÝFÇÏòuÄÑY4tÇå‘>ÿ³Uh:º ÿÓud(óМ ^¸«FØ«ö6Ò•¶-"áA™^´}>-³{úõ#FâSäÂU.|áˆG1Í Wd÷h†º2"ä‡]”…,{«¼¯Û‰«.üו»¸™{²ÅÞ«ü÷j‹­`g¢šQ0F¥txHb9$v÷8í­xy}yd Ö-)"ôtJQHyéÔjâ 4q$ˆ‚Iˇ~⃧k¼·Ô{1‰¦Òsøæ(ü¹ño䤌aNSXêf—ѤiÄѽóËë,Ûäøè¼n±"TŽBåìx GF°Ê‘³e½ðpïjRf³ütTÃÉ[Z¨"=r YŽÃ.› Þý*çÄT(ô0 ¼ÍoDOÂU$mxëý†±|'ên¢kOM×3|B3¡ˆx¶A¶S]q°(/ØÃñ¨4†³þ¿™Æ%Ô˜c…ó¦øm¢N@AX‰)7I¹e½'Ö³ÀͲÃxÛ.øôA-Ëþ‚£2á*Áá‚ÃÙ‚á`Á^EöRœ½ú®ýe»ˆ¤t»fæÊõMC½4}ˆ ž~ÿ¼NÝhTn=¿“ócñïÉü‹òèFër£È¾ËÃcmMÜkzïž:ÙY«½hÖ@“.‡jcY5 ´]¦¸DvÙ®k|hs²’±Š£-*n(TcfÈÎ…˜¯ò'‹2Iø“âuiÊ |2)²Ýž:µÂŒÚƒLÃâ&¦œîn±®¡Y=óZ(5gÔt}"7Ût{V©3»xáSp‡Ê²êôlð6SBÙa/=ëcàKe>¤ öE2h?óU;4ýnÙzK¶›X™ZE“µ ­tDniÞ Í6bôåèÇéÇÙÇ뺔ñ´Žß÷U¬¹“4šdàfª»ÁÍBm³0• æýE1)S_ÿÊJ–Þ_ê»›£}½,¬W¦‚Lú|ššCŸhº=T4'VUisfW<†•ÍŽÀ¡·!»£õVƒòìBÌŽÃsy˜Èo3V4m§¬šÎê_6¬&tSy–ô$«Ý?"º‰G6f0Ä#Niô‰žlË'´ú‘~ÿµe2cÈÜrÌ\˜«üDÞä©t3:GvŒ=ÙÁggÎûÌzgG–Чþ-ÞÐÝïA¸F.}ó²ḇH?Ÿft² °JVµ—)øñ OÚÑ"#ŽùÈ„—˜o9‹ÕPíqÔ÷oÿî‡ö‚QDèÔ-G¢opô• ­Ñj‰õŽŽÃ*:.1iµ‡gÑ óÉô4.ÆwæJ›/ƒÿ*'œ¯´]{aâ§E¦ïjª3¾NkSýaÏšg#r ±›¨;?è^’9~Œ" b\Çø9cE“sü˜Ôbd°qÙY·ÕïÏ8}b‹Py+&¢”H£Ü7DºSA%éÑÇ‘ †tŒU68Î$Y=À,*¤m\Á3w™c0“Ã#k4ã0šñÁ^@38ê3¡z—ÑLX¡™Jù š¡™gh¦òôþ»Ò>ÈÜñˆ6Û‡<ü`º¦6£’UìI¯|¦`ßéFŒÒ,fÏ9kdý3^?¢)8ðú)œ$ç–$’s3\’M‘LÎÕL‰õsŒ–Ÿ„*mºzW­ÀaÆÑ~$㸞‹‹zìÐÚ? vBu·U‚Ðä´òóVE‚6ëà᡼©%!³X\ó˜·â¤Ÿ‹0Ou‚yÊ(JAºådu‚êÇq0¾¥– …nµŠÆFt‘‰ÍÒ—%eZV´—¾’ SÚ«UÅØr>ß²¥,’2%š3“. QÄ47Ç®e5´7«“ï‘÷Õ¶vD Ó=È6O”Ý‚íNøzÜ"´Ý©ÀÆâ÷SûTZD\SòŽÄêYÑn}ª‹((cW㊼Zn]cåL˜–IÛB¸ïÐúÊ`ŠÂŽ)ªyEÌ òT¨¬ô®[BÔ¯ÌDO23e-Ç`öyÁÌöÕÀÁ>Û`è Xe”e1±Iu/ñBOõ*ªHbmYjMö×ê”Åþ^v”­uKZ#¹÷Œf€³2‰¨Ðóâ%˔̽Ÿ•¦ôz\±sc¡»½MtwT³ÌLô÷$˜ôA¼ÖÓVðÀ¹‰œšáÈNÔ˜âb¬-ÜÂqÈš·7Lkßz©†¾/ý ÈaÁ…6ûÔÂ,¨¬àÆ€cM4ÂË{êñ¢?÷£[¥ÈÓo©Z«µh°¬ 9ôNö¾jð‚rÝ·u? ‹’»w´ÂÅ“¡ž$ê.§& ÷Q5#˜Çʉފ’fI@Å¢ ÏÌ¥›Àm8fï«“r¥{}ìH‰6kNÓ+Ïp_ûº3õß›ºgàÊáÖ‡ó´Ñk&¬…4Å»@½½ÖÍ+½–ÙÞlg„gâ4ú“ç6ñÑu³îgkÔ¢¡¸·9xxA$øÎf[&·¸lAù¥Ð“V³Vš‚:i>|. p«Âfл/\Ë1Šm@X•9 õ½§ÅÖàÊZWMk1ƒ¬&õIå}õú>ïq+ó5zñòuö•g¨oÌbJÌV×åhãæI6‘Àz@Ì쾓»‰aBK&aŒ,ü2Ï‚ØE6MÓçÀµ tª;1ôQä4«exe–-›«ÑØ^]~Já˜!‰´¬1 HLÍfÉynäËFóRCîÔËx…-Û`Ñb·üsðZ+àd…-L+}s~ýå?3É,ãöd-Ú9Rk€¸òéû¥”‡“Õ1ŽsÈ2¶§;-žÍ‡»íñß}ýÊDÙ*¬-l+ë;w^šç©uo `7¢¤Ú[¿Ao¾ªmT˜[GsšŸìÉ€Zñ0ÝZzn)$Ò <^ùvôbùÐf›«P~Ê ªÍ޶Ô[›ÈSÉ ¥çí{͸Ñ(»mÏÁЩ<­§Í”ÓÖ ¹}዇ÎyDœ.¥Á6‹>äÁ>§VÆ6tnN¬tJŽé…ÖÙ ÚVÿy'ÁE9ýÐÐH”D¼¢ê}—®ËÅ š¶"E##N‘ÝIˉòvº{èƒ;¯ÀdK?”c*~9-úkÀz':³£ÅaÝ`CddœL/»ËîÄÄ’t8ô'9¼ÝìÄ]ÄÊ^Šgˆ½ˆÇ£ w¨öÂgŤY[Hšª;³é˜nYÆ ìʼm0„áICíu"Í9ëpáûŠÚôɹÑ9èû%#ï6£Œøè¨‹™r7ÈÉϼ°j­D§±5ÏmÊÔôxtH$æïæýƼK¯C»gèÈ“OÕŠú½`ÇTEzæ"â ¸."ïæ1¡Åör=v]È ®dÁ±Çfï.T¶Š»¹¼ AFØ0°AÅÃÛïØN/‡ -8sšS¥ œ„îj1œæ2{-tãl§. _EÓcè¼Ã{1tè­]’Ø ~ÙôÃÚ]Ž¡—'cèŒy&l®Qiøx ½lbèd®&Wúfú%”,H¶f‚IŽº™yÏø©³9²„ö1ÓÅp út(nWáÝÝõYþ(»O‹¹†2ý”ÉEî.%ZÝ<·7žhÝjJ1]xVËw–#¶V¾äö|l~xù4Wr§’ì!ÞÑó„:÷í±æq‹Õ~?ÚO[Û¯ºõþ<ÿD –n¾çpÑJûo†íåÞíK°Åcs؉֦+uÔæ{¤tõÔ}*iÖÅöÂßX±*ô¸ë Vmv“â'ŽÏ—áÂYñdJŸ‡ v/1oý‡p$êzZãúÛ[ï0=žº»ø/; £FæÛã…|û—­à3Ú’e÷ÍCÓ+@Áu !>Äë_æ_2¦ƒaˆ½½Ä2==sÕUå(8I‰ì媓ùZÊ™|ÌNQ¯¥œ½=OVÕQÓÍyTk4ó³ÌrñˆþZf¹0¿FÖ&ŠËÓ=äAÏ‘G£÷ÚfîÜÏܹßqç&Eòè¹"žtnŸ»Úfy|åWs%¹3ïýd§¿‡ D ÑËþçY±|Nø­\»›»vW¾ÂoYhí†ÜËŸßnûÝÿ°Ôð endstream endobj 78 0 obj <> stream xÚÝ\Id· ¾çW¼c5Ð¥h_ø0ć 8™[:';ìd÷Éùù)Q¢ÞÓ[ª{‚8=èé*-IqùHÍòº¨EæÿÔtþ_.ß^>~Z~ûMZ”I¦åÓßò×wøÅ/Ÿ~øóíÅXó¤ü´ù{ú˧?äñJ³ * ëÂøïi€]‚H¾¶"ovWÂ'ñmÁ·TJȼ" y‘Ú?ݵO°­†m_ŒË?}þã|þ)ó·AÝàÓB|ò(oË'óO_~âl×g[MkÃüÖ”Ÿ¶Žp Ö—·ºž)󑂺¦“4 gøÄÕÕTþû‡J*ß…¼žw|>ŒöD©í³Ñ¶ç)ÀÙÂ÷mùî…6òý¦„}yÄÊ Mw\àn•†Iwe„sUGµ8ð9Ï> ÄqøÄÝ*«¼ˆ/¸z=)ü=„6ß’¬ËþÞ<9øe¼Ž¦re˜ô ¬S¹ªiw®ƒ>É:ÓqZáä<—]]fK#‘Æ6¿Ž”å3Ò­`»,­£âhϤ­«±uùÕ£µŠä(®XF¥Ô°Ž¾¤†Y3Œ­U%‚ÔÁ‚•'UÍ`´0¾jéËm¦ÈVhû°›D!Sã§™ÒW18ä§Ù*AXµ´!_OMNÒja—pÄß'W. ¿´ÅÐòâ&­¼~=®Iw5úDºe´ áZ?EUIóI%ŒÀß\swm¢Hj¥ŽÜŠFªQÓ[AƒFàA6:7HÉx‘\Ó[19áãV†¿Îv‘q1äH?Ñ­ Bªq[¾¦^åIÒ ´sBâ˦Ï%§>Z;Xø˜Ö-GÅíÜ@µ1„]õŸ¦¤+¢á^¼l!Ÿ¤IÖ•¤ —ÃhÒ·ê×Q+dµÍ®{ì2U»jZñËEŸ‚´ ,` mÑÅ|5;Õ]©$2¯²SyÿçuJŸÈÉL§ô¡J-šlãõøLEN–ŽÇgRN‰Ïûâ´«Nü·ÛE\ôÕ¢³5îmÌ‹4j&œ${Íd- \­é76ZH Ÿ«g½àjÌKˆ­úg åd*"«Å,'Á|pÔ…`¾ŽžÈ[‡Ø#°7æbö‚sós1{®šöý¹XÜUÍ‚I©#DÑ “<ÎŒ¤VÐê~H2À¬U^¹ ž´»õ‹OzB·VÚÏFªj2$å*‚`‡að…ºW킅󆄰k2Ó‰,’ä1í–wèùºñx;wÃmÇÝžGLY˜ FN-s`ûýøº£Ž<3'È´7_O«×‚çÓ -¸TV›‡.qYÀ¥2›à"”Ÿa-vï:æCĕŹzù/eòû—²ù«b,»ü¯S)ºÐï~C%ä ¾ú‘‰þ‚ö‡#dèmDWôïvÄ(Y,§ðM”sd›ÒQBÚ<eº÷èÐ „£Õܺª†Ú ŠUWÛ"Œ¨Í.Rmûj%%€Äse'Mp»åêN KU…`*–‘ÄOL‘m¬wžz‚x8F,*3Ša ƒ¤N—òáR;œná}`™¯ÒL¡>ÿøÏ„ÑL§H«¬à´“C9 âôxLÀëtEÕnòbX»ÓSÞ³Ž‡nÂÊ,»Ä=uNã°ÜªTÒêªqx®5 oEJ+e¾R·Òæ]Ädkn˜Èö`±<¢nó:B´Q1íõYx쯢beä~ on¬XS& 'ª¿Ý”HÙ–Ó@ÅòÛëÕ%FsÃ5ÕºäObþYÚ«?}§±^I©ÄR¾íYéiÞ+ý|lUº̃äFÜ›&V‹²Å²Ÿ Ö-™yjV•%-¡bŸß|úã‡oŸ[¦ª/)™ÇQÌMå³û3JðŽ›ï'!zÜ Ñ÷°™(,Y„õ{Ãò˨áÊoV,,q4_̓š`þ«QË]É8»î9ì—æÿóÈûàÀê¨z×ÐNa-e5ØÈ/lù÷[£[ö “g ñŠ_3¼RäY¹ çG¸EYã­ uýË(ż¤:tôaztÅKL¥Wâ(FŸ—ú"Z¢Ãú"(VMXz{΀œ„Æ…_Y%z'Æñ]õ*.á¸1„%ÊçnK俵+‰¥.³{ ª-9dŒ½-™‰n ›\c(Ї©órXîäm+Iof±­É*U‰‚¨}™)ñBI§íTg>1pèêÊí*JB^16j¬ºXH@È ÁL­ À£éÌÊ€›ü< F47+ÓüWí$Ç÷¥Æ"IÄU|`„fªºÞ|œ‰0á¦V{L«©ëlùÔÿ7Ûcw•qYÏf@BLFîöJ¥ÞRðL;XBƒl…sñ"Q8޲ͪäÀµùÞÏ%w•&û²5º½W3n¯Ó%4˯òbhq ž ; YñlGH"j¶Aªn••+óÊ¢Ú|©¾dýqÕéøP=öç©~¦Àõ 8¦´r]s|Â|Êþ<Þ_~ø XQQ•gâF7Ñ3Ï^“¦–Ò[Ï€b`¦eÐÄF˜&áz<ó5³³’‡/LË›ÄÎkíI¸ÖV†5DQ1®MS^ëjLGyxõ6¿ÿ´¼.ÙÍûå—Å;ðw#3[ýòy j7ôû?–?-ß•Þݱ*]gåO¼Û5æ˜c4[VH{K€×לò&x`C2; 5FH 5èà‚,Pn]cš<ò#qœ§v¸Ix]•ÅeA¹W±pD?ÞRй{¢6,ê\A ¸rƆ¤Þ{W×ò–¾ŠÌ:l{üÔˆ!T¦,BVÔ0XÇË•©µn"n:ÜA‡6ÑP:akõË34w~dRëßÖ­ê·Þë~®ºca’놧åX}–ëÁ:ÈPœ–Á›[ûÔ´PñÂi”ÉòпC‡(•<¿Æ¯Öæ·ÌŒ—$ÖðvŠLhà‚ÆjKÜ@]k¹æ”\ÓÃç6Üqx®çà¦×»É7óÊp®BGI¹QïNÊ•L½žüaÞ«ßpfOLs¼S¶£…ú0Ó)ÊY‰Jƒ~ÎÔ[X§u›».…‹»Ö€j‘v‚µ<ùÒÕÌù-CŠÑšém¿Ñý] eüd­eãþ.£‡·¾VȬïJh¬;ží*(uºõráÑX/sCÝ ­¬tEú GÃö•dËûtÁî+nø¡{O[|ÍÞÀ0%°PT…l̪d}·ÿ¡oÀZ»çI»f¸û`ïW˜@I4ÜÇPT§{ÛÍëÂëëd¯Ëhpªm¿Œºb˜jD°r=¸[½¡X³ g(GÁÀTGþëŒNý-;3áyãzø©ÞY¹ÐÓ7J£ÓeýùA½ÅÙuœÎϸz­SêÐ5k–t'Ùœÿ5êóömi³£,vŠñI±ÐU Ôg£út϶ÕÎ𹑳™7®\À^/²L ÝØs˜ÍÐ oº\K´‚œjòæY vÂE†,ú èƒÕúe`Þ½3·^ÅÚ¶Àã.¹Ž¹¸kW\ŽÏM¼¦­ÍmRÍknñÈv•Í[­Íðnf0¥ô8ÔMéðv}„é{¯V‘ýAšaXÏjëB5NkAKéŠÒÚ3®–û¡øhŒ§ŠhK}€Ÿ‚¾ÞNÁI¢ÆŒ²Y{·7¶4 eäY9výš¨)J!õb:(L¡Ð®,ã(Ë2‹Gý—Iê‹hTjUüMï¸êÆ‘$ÏÔ]qÓ>¦Fz‰Šº28»> <ÜFΩ½ûR#ô²ê*Z?yäÈÀU¬ïˆ/XÅúæwß*Öµ(®îo„÷_ªÖ%˜)~yz®áWSÚ*Ò= †Ï-~8+‘ƒ«&( ?•ž)ãÕД`ç òÔܬüRÔ7*}# »Axlj<ÀüŽ4ÚÚ,zλn£kh[nAoaÒøÖÁŸÀr ßæóÎÐC*k9Ín¨ÒÎ0S6F7ïSKöúU™]:QA'/´Ö‘ø0:¢vmìô4‚ÀWâÌV”·ÑaÒÆçY.´mã£÷×þ ¤¢}xd&©NÙšÎ'Aíú¤•jSݹ.¼ÆÒ ë:¢,jôéþ,@® ]˜õ”Wi•Y¾FL’ERšëj8ìM¯`mµí¹Udü;ÕZG¤¿×ië+öq}á®»ß[ÆÓÍ]Ã2—6¶&92¼«þâÍ,£ãÔ΄‡ìŒG´°Éƒ-Ê}¦Í¬ƒ<§Ù%Ç{˜LsfùN%rm6&ÈFó“—Y37Zÿ8–ÐÔRd1).¿ažõÆåó¢"> stream xÚå\Iod·¾çWô±«î‹b >ä`À‰n–ON à …·®L)«éúž7Ó(Ó$‡’x_ØÊÉa0B"gþÉ‘Õñn”蟯io„öwä Yå`:œúˆf$ üd•Z —îu|ßþ‹`û&Ç·"ã?¢| Ùz¹/¤¿ŸË­… 7Ñà+2REÙRàF"ÝUèJU«å¼˜lÇ\œõZë‡8´ÜŒ;—ßÊrã©?W}®f•| Úk‡ó±®Ïá*g¶[:¶:Ú÷¹û_8;y'°*ÕÚxõ a\¸¹b„Ôm•Í7ÓãÇëA»yh9³â o¿£¦]ÁN58™±ã}µ¬oëùú,›Ý6ž;Oý´ˆ›<.£*IaÃ颭h–RqZ˜„L›Zh÷´P)¡†¢ÝËËñjŸwíëV¼Aïí¤÷ ûãüðÞ¿žÄeØŸ$ŒIþÀÒÇ;áu7…šçú/ùЭ»Ýt=0VìbÑU†+4e-8k¢ÈŠ èVY–ÕÆ˜ÿËfSíH¸%5„1^´Eý‘¨¾h£bÉ•£úö¼š}¤š…û‘Û©t%oþ;Ô‚œðháåp³8ˆõêÇ—jÙ3c¢(Ü0Í"× ×Ñ ¢gîÁk˜xˆ·U&Š{’#ÌÍñ,Q5"oS#í›kÒ—êеÏz°p"m© ga ¡ò³1³Ú~3vŽè©¡ØhJ Ö¡+ºÍæº ŽÆö7Úäáà‹B_]ÆŠÓÎìˆÓ]wN³ËÔ7;X\µï“·W&C5Y¹{ø56Âο™…_‹°œ][RgÈßÜ—¾] ½pƒfÕ ‘¸í@[·Zœêɬž§Ï˜§Pçá†ŒÂø»…ñ®áF„­Ë#D0[Bà`;Œ³Ÿ¥‘ó]ïÃʂֈøÀ§‚Fµê¥Úv„av„:¥=G(eƒWݶb¹U¡š ·Õ.£äéËç— 4cšVa"„xʺ©û¬ÍËô:ŠZáåGZü´iޱ<©®µ.oÑ5x‹¼.ºærH¬v‰r"7¼&T& 4+£¿ä¥Ø€Ó…6Cgûf©J³žýõÂjª5Ü^â{iË;Afߨšu‹¨\!Ýͨ¦£*…ÔM‚e˜2mWéˆÀs(Û<Ž­žû¸ÛÉÅ[°ôðŒ¼KËÊа·þ´n ó£Xd1cÞ Ñ#¤ÖX¢YеEŒúRø|•ŒÅ,‘ÆU;Ö¡'¿ãdaFØ!%›@‡ßÔ^!+p{Õ«¬^ɹÄaw_­¯Z¾6ÒsÎÅ›cDXÏÜ'PKbdK.dY­®=0f¡Ô@'©ðýÃ.3uPš6ƒÛwƵŠ&5jb8%ÊZ¡²³ç"˜v„³Å–’­·$-C÷<ÔëäºÌJà{ù†àzý‡gÊ(ÓÂúµþ§£p‹¼Â5úŸ3'׌ûxVë{ƒü³8æ3^—$Ó£¿›$ÙVéGM¥Ÿuóžú´™YFgãÐ:‹s.Jg³|º˜lªô;N®nbk’%>(ˆè컊s©søÓÓéÓIØì{~;i•·š!@Fàh>ž´+ÔÅ?Ÿþzú®5›Ly‚ÌU¯ò0È¿è#pÛKÈì²\%œiÍ”P¾±ChdÁ܃f)–ÒÑÍB€¸ùÍ"K³¹µÔªÓŒ­hq/§®¶º‘"¢S—²›áE©vŽ2ç§ö@Ío+¥º’C±V$óùÍëѬ×qójÃÜh‚Yyìáj´´s}“±£ÊÝk)ÜD„-\bf\BNF•QŵÂì8áÇ,+€Ö”±¿—qjr›æ äsk¼2ÔíCVÁ†R?q©\³ën¼HÄÝ|ñpÑÐN±•ÊÕï°l¼‚>,-¾ÖP黢âénåÜœêŒË²6v¬ôœal¬õœYy´;e#_‘)oÂýòŸ¯@» bqõô[@ªQu?V‡‡üùHÃPÜd Gµ‡X÷ª:ŠÓ<Ëbk´o(œ1Ë%w¶V2ÙrT7_ëj)L*%Ý©ÈJ{s:P…ñ‚NEXŠúüu…WÎïÊ -t‚ÖP ©¤ìLü¶?Xuøž.öyÓ 8âÖ2Æê7p(üdr4÷tȼuóï:}ösfw§Ï. 8„¯fîíT¥¼ Øû¼¾x*‡^l6V8,¥Ü6 ”›‰ÂÇ_xl’“Då¯uùfÅåŒÎ6Y؄ؤ”ã°¿Ûißì”dªjvzãªe¤íâ"y>E`w¥G»;¦Z³»e¶ˆÓÞy§±NIè÷Ói¼åòÓt]àHiï:Döô/lüåÞxB4 !Ä‹ÔCO•bç6b¸žö­£Vb¸’™užÞQ(ã{îÑ/föÃá–r³oRæém…Ǿ,­"׉ý˜}.V’¯²æ­l¤AëhÏåÈûÔE×q9ô5ÂÅèa/é CŽ8JîâXO‰YÐ> ±Á&ØöwI'Ëq‡g?ãŠÈ²ðâîVüª÷õ2Þ\æ2Ÿæ˜ø•wÒ =ð÷üqKÔ±ç㳜62ÀÛ\eÍZH±¤¶®ð¼à<+«|âéÞÛG`«>ëòXÝáï‡Õí>V¿¥PØ+®¿ò÷¥׌‹ç/³zFf=\S¹B0ßvšŽ¥APþz#¤Ò×ðŠM ÃÂ/AçŒÇBܽû•ЇyÁ ¸1Éü™ „bûìÿ?â¢o­n% —\HE/æDÉuGWJí”ÅGlé'ëàEìÖ¡XUÖ8E·áª m¿]ZÝÔ.ÍÞ>j÷¡úpB5>Á¢z®ãˆ·¯)œ}dtRï¸eT•€¯¥€Ý. 4¦Š³Ú®øCX›6ÝÄ¢)w›6ªK˜Tfwô¹Ïí²¡Ô„”LÓ".¥]Ž%\’Ø©HW¥[\ïrrùFŸ×b¼Û÷ëç•-ŒGšÓnöð^ï7Oùã·ý çtY˜Vªà0Ö’ØVãÕdÄÝz¶ܘÇ.6/ÉèÞgEYîN6ÉÓêh{j›õâ’ìWQèÊ|” ˆ€u#±Þ‹‰5-Ã÷¦˜%©†´ÀoÓÍ Ù”µ<ÝT¬>Ríõú*uŸN^DçE©c­Ù›7\Ùp”’®èV XË©^0Äš)Šæ:I øìm.ðIW»N0MСZfd«UŒçî.Úa0yÂ=‘}wÎp ¹©$Ѷóø(Š4šÊ{hHµ¦|qüã‡ð_ÚàiÞ¡Ùîšo6)ž~)÷9JtRͱ´®´¿I¦Y˼^ ±9ëìäÓپ袦¾‚«:M¾QIY·DL{ñVï˜ÚxÌ+Yeu_ÙÛÌ@Tá€0L‰””WÌyÑø0I)œDs7v'~¨Š×E€égaMæ„ÖÄ5Ž9>±sdD€¾b¶™ bØ0ÕŠÔÔ¾,œ„—›R£Â!Ü×Ö\2=L(ió˜Ú-j´ßýî?£^]s endstream endobj 84 0 obj <> stream xÚÍ\I·¾çW¼ãdÃ¥¸Éð!’Cœè ““6"@:9??\ªÈ"›½BŠqÀ÷/ðiûr*/¢g‚[ºëóc+œO\ʈ_Wk0ñÖ†¼½Ð5ŒÑ€«|9i…ÏߌdFb›M?;óbíYgÒn¬ÌWÇÇ¡]2†ø…ÇVËC[) 3Èk‘ú<&•×O<®¤ÆÙQ‹]äý¶•†Ñúþ&µ£÷¼Åý8|fÜ‚kÀ¸fLâÚ] ãÓá;Vâ|ù~h÷ïH-NfZª2\Ü@\ x{yWó§·Ï7ÆÝ~»i¥E:åhôícºöÂ{ºþÏío·Q÷¸\Ò[V‰¨¤30éü¼’N/\Îï—*PØ €§Ööh‚iD¡bÞc"ÛµëÝ=â[6 Ôiävu(ìj«ú¼Ü„Ì!-W™õÝÒ(/4)ûÛ}iZ¢ð8àÝjŠdw >×U3Bù˜ æÃkUb„ 6Ó×{Œ ·‚Λ8;³oŠÒ!ª[²>m%¬¾`ð¦U›Â‰ÀVy“RîœHl6íø`ëDŸ~ÝÊd½ììÔà…tg줷žaçR¨@X×7ú]²ˆ1¬Y¢œp´Y·:ÙœÑÉ™|NÆÄ®…O9™¬×7“_×\wEÉê'Ãdk‚mºôÕÜ‘u.–·\¿¾y×=Z'Œ}z£ShãYÐÏBŽ­VI¦ÉäÔXð¡ ·GŠrì~¸”žÞtŠ?8åü é²ùlYpºéI•yFsi;æÙ£ôøà}ÎöƒÏY¤GtÆÆrw+4=~ ñ‘öØøÐm‡º dúŽÖ¹,t3Ix êùk[޼äÁIµÐh5l5ÍE„Ù¤9I™e»PÉç6Ýô•*ÄÍHð@mrö­(—mž<vãn×q+QÉòüŒÊîûT¤ÝF¤Ýî™§ŸÒ”$Ó=èx0VÄ$r ÉDÛ\§î;¥Q¸'Ì=*¡,åçøO ™‚3Xœ e‰Úû½ô¸ž¤þ§eG_9ýiÈ g$»ÁÝþ>ѬõŽóNÀZ…#¨ñ¤};.¯õN ÛéûÕ5´!;)Yö­R8~'…c\Î¥sš28xÿLýÀ»ý*@­¬4èY¯Š–3„<’iñÑql„h$ý Ö«2²RÉìM¸ï"Yî•sŸ–b7ðQ¤¦þØ sŽpœ»ˆã?ŒÆlL—2äk5ÔŠc‚ížÒ;¡üYæ–;ÝO¿®WL·u±8 QŠe>rêNðX±‡ÇðqŽƒx­ÙÆÁKâ;ÊüÖ¼^«˜TtòJ ËôhCÎ!ЧeÆÄûNÑ+qäúrýˆ¾lé$úúj ôså,ˆÉÂú²—ÑWµ8‡è«I¦uXüŒ±Ã˜/(2Ù‹Š±×Sí¾,ÄB°àyq“§¦f­aHæa.iïòÐŒç±R ÇœæHÝ*¬³<âçuÔ %[°ïv‰ÍžMg`öuZšÂ‚E¦ ©—°Öe®Ðó‡-1‡P Šœh7 XaÚAÓ&à4𼿥°joÕ—¸®Ä³|üÿàÛK:{½®ôZÉ\ØWìp\)cÂ8V£rfDʧÔ×Ù´W¯ƒ’Öü [Õ³• ‡.<…{¤:Ã=e[s^ÐM5úЬ®íW’\ðŽ>4gÈÅ̯B­}!0‡úJûåiš~H=׈£v,a}zn ûr)SB¶ˆdÚ9¦ e冗½¸êÑ4¿ÿð×?þ°´£Zº¹s§KÛ ãüYñZ—>·_ñÄ~}‘ù+§žµÁ¬C³ 2RùV6#ž„f)†§Æ:­Æü@Ë‚hV]vp¡ÇI;Lê—^¦úNÎAhgëýØï;ueV^¡)³Ÿä•iÔÅL/Ѹ]ÝÊÌûzË„ æì.f©&y§¥¡i©‘z†b’²>u훦ÖéírЬzØñ¼,Lópƒ[ch¼6tï%è{+"ǦÚ—äxË×*·r:'0mP·<½—®?2©å»ä¦b¨Y¦™¾ÂTV±óÔ'ÕyÆAµ~kèžm]4&ˆ>µ”º‹Œe , ð¼$:Ž$W3ÒÔ õÏàú§^æ»ñÍ+ªSØÎ¨¡+·0%ƒÊ±‘mYx†Y²ó¨êž©:%oŒ‹´ÖȽ´R攵Š1uì(5)š•׳ïÕ”GÒÙ±Qxµ[{icí|¯ýŸ§8߯Y–âDúOM«ÅQhàÊöÝsÁžöB~mxCUÌ“ü²¿i x@‚•jŠ~Bí&7QœQ5A™QY¨2y7ùïÓÙ;º‘/Ã#Ÿ‹·4BöÖt¸®ºðn‹¸S[­ñÒ{˺žAs«¯Ä2¯Ø»+ìÛÆž‹ Âô}®€5ë95šé6íä2ðõ ¬{¬ý‰³eœÞøï!Y‚“—þæ¸u ›Zçúk\ßlŽŽwwÙ-Aš@¹••”£Aƒì@iÌÇr MhñžÃjÃÓ€fÖûëp"7\]A¨‰±¥Êª÷€©ÃÎõØŽ¨àûN’}ßo¡lsƒ<Œß^ R}R'ÐÛ¸­ˆS}£kÐcå뎔j#F>íg”´<=²Ùèmh{‘¦Ž_ÐqfÓ&bvÛ9Êþ®êLkñ0O´xàÛk«͉Â}If~? Žíà`Óï8´o°¤mkΆ¹†C”i‰èÍ•|‹¯g0ÔõC=¤ÝwKoµ¹‹±¯qwc¦vÕ¦šºog„ií­ý„  ¸ÀÁ¾a³-Ã0'®5r’ âhíÓä@uo+(JßGÍ .6²>5œ}GC7Ý‘ªõð'D€ûiëègø<9%ذîð*Õt•døaQiUmÔÞ9)üjÌÜ©ßM%:ZäKÎPM1­1³ç47²£ÿ1cev*:Žš°Þç ‰Ô^¸j`WBÙ–áó‹±!u4¶vˆì̈k~Ö.a*V¹sîÜ,{µÚVSÌÚ'ÚZ’Û‹§Å¨²‘¹@ù#yûúÊ‹sK o7†ÎO¶”ÞGöUÊiom–HýyÇVÒÜE^9Óâá>öÚ¶¦ {õ{ΰ$“§°1®ìò^vWæ÷¬¯×N)©ºw(&‚–[õª·`o‘’)‡DŒÀŸNÂbÆu tlÉifž–o…§Â5ÞÝ3,‰¹Df¡VµW•šz!·™0¤Öæ(zñÂDó„€ÒÓø|íÄXaô´“)u¬³²r‚+"`×L*J°ñ¶a¿é¬KÚ+(mñ‹©Ž¹ù•0=S»ÍT޼z ¼‚¬;éìeìå0òŒ’%©f¯Ø?–ÑÏxEÏ{ 7XÁ¨§EDû¿>9;×8†¦$åb®'>tlâþ%øKUe}^Uß¶ª|µv¥þÍš} §é“YÃ6Æ8DÈI“ëÀyÐßóäp.!A¥ø—m T³ß Ö¶"7¯¤¿eÜìzè&vˆ¿¬øbO î}¸HBõËBæŒðv¬@ï }«@£º=%üÑçÎP¹ß«Ê„¿7ªî|¹¬F“SÁߨ†häð…¹‰áö[iYV6W*?ÖÚÛ5ûÞHËt*ч*¶¹ÛÇå&?V‡|zs÷sí…I"È$öëzc1”~jèt½O’7j¶Øoù¡y*‘¨ûê97ÒæÓ–:è…ÙG :M³ïÌ©áÞ·¹×•xWf<úº¦v¿ûh•§b*’u}«µPnÒ1ž¾ċœmË}Y9¬VHµ+_Åó_é²[ «¿åêoòPñ™ßä¡Â”ˆB¤1}|Ö-Õà`¨O€¡%_i’Œ Û[)³Z–¹ÚއÛ[<ªDŸå//1G£óüI(Ì_€sE1½U‚>צ«º­ß/…*¾€ËèPæ¿_¦Ç÷?­Œ„ŠôúâƒJiCvKƒ˜-ëB¿èO3Ióôaaðj>00ÃÇÔ({`¦ï„Ã}û«š¤ÂS¿¡Ì}[|­Ôi¦9ª»Õ÷¼Z‡Ü½”ÑU¨ŽYò?þ endstream endobj 87 0 obj <> stream xÚ¥[K#·¾çWè@F4ß>dûC's0àñ%±,’²§8ÿ>,²Š,²ÙÝÒ’õHÝÅW½ëcéòå¢.2ÿO]‚Îÿ——|¾¼¾]¾ù!]”I¦ËÛ?/ʉd/wxà/o¿þ|}7ƽoë?›?;?çNæïðžyxw»›d®õWùo¨oœy7Fãwe%Ž”|$¬Þšææìg0@¥¯ïW-Œ|¿Ñ˜²³—ñ7íá¹§½á¸2 ¬àŸíãÛê8“kïÊ) ì#ÿ u×Ö½Àë²-}ÓáŠË››Ž0T6VØ:¦.‡’÷Û/oÎFFá2Úû2^óƒÒ£TBÈ¢º¿ Á 5+4½¯;(LT¸®AQ8Ú°§ ‡¾5Z‰,À“1Yd.U(Áà8·Šœp¢A(_˜Ì_‰{0’æƒ9Êש Ÿòžm#[§Z”PÑÌÂì—v&¶¬kK'ëQ½#IÖ¥<*z^ª*B#…œDHš]Eݧ‚먮“†Z<1ýõøW.섬ÌT±é(I?ÑVŠ@‰x¯îÈ–&°QKqSÈP‹§æ†[„f:Ïìpœgµn4ëJe =˜`£ÓS#eiäÊdñi³ªjMr2$ÙùY¼†K“±æÓ8çiû¤ÛÅ7ÔÑÈ{~X®­M×ÕÒ€C&¢…þieÁZ¨nÀmUZÍry†5£x­:J1ë4ÕFÊ }·OF=ù\rWÅ+û¬eWt•z0¾ (ª¥úž[$ =¢é¨$…£Ô¶®²IpÁQ„G†½®ùiíÈP£ð°´ubQ3Ö°ov…]Foôôý&ꉬͼ«(œÁE¥Å¸•ý–uæÚ%ä¨3ŒÂŒʆÅVPë?z_çÔò– LÐ ©ºS¨,e°DŠë_ ­½~/ꯟ~ÿ;Ðþb.ü~¡É7žƒyŒÙå×õgáPä`Ý8çdÝËXÉÄ/DG¡âqÌ4zÐ+ÕW˜œ•r?}˜©Ô¡© "‘$qî´Ë÷—6Kh¾Ÿì™Î:›Ð)ˆx’NÓXÓLÃv„ÐwçUeNÑâ J4ps\Ÿ}OOZÍùE¨ÒµlÉ– <ÈE;ðVëkS«l¤RXÜŸÇÐãtóÒ™b÷<«ooHÙÛ–JÖBe ª8¦Oe&KªÄcØëÂoÖ·†%(ÄIØ&#l•Ùë—]ú¥ÿÔ9‹¶“({ "xEðY(ÂW™|Y¨‰.\ÅËpZŒ6Í„­q‡E²Ô”%Žùj±ª.,S Þ hríMWAwŒˆz,Wõ)te&nKÙï“—y¿.-4±ù÷-›=¼6§Q|(¤¿4’ì„7³ä5ܹ°ü ,Óü… [Õ±yº’¦W¾ON‰\ùíÎsŠŸE5-_e/!ÉTË„)A$¦A=U‚‡X(þµ8±0#Q¼ z+RšbÉ °Oè%œ/<¬—A]ÐÇðA}t‰…µ+äëj‘ trך2Û2 a(‰æˆýüB¡¬k"oÑžË6J¨Bô˜')Õ¹6;iA3Z©pXá×Ò„år­:oeF…H÷yñC>c/¤³l÷:Ì?êe÷Òš@õ°©¬¬ïmË­á@æ=k§ Q=ç1•VÂêc˜¯Ö 5õsð‹!øM\éIJ‹JcÿŠQ= êPÀ>Ž/T.Ì;]•þÈU*°C‡Gû:DÅÒ’ ð#‚žbé®G‰–ÔÄ(¯QØQ´6h`Å¼÷¢u«šJ @0'è•X‡D±þüÊ¢ÇJþ!2XVì«-Ì_g8¸V@Ï)t¤˜m:Aë‹ Õs:otöxæ()6%H†ò:RDžC–íƒusµHíxg»PÉ›ý¹ø8#Ÿ>ŸgN~ǤcqIJÊÓ8¢yG4ç8b™È8–A”‘5‡oæ«×n]kz9«tŸ‹Ò¶iÉ¢ö¬ZmœGÌ/f¦Íˆî2®õP±R—R‚Ç7?Ä·"Ò7n~ä0`"õSð©Š9Í G¡D–¹Û¯ÐªûŒè>uÁæÊa¤n!ž„GJׯkút†PÖÙwʨ)ûQ) 3¡|Š _×*ÚÒÝÖ"”qSœmï…éæžÆ4–1‘ó‰Ñ'O—©}–¯hY¨#ÏZÊZË®æ·×<?Òû b‡Â¹_³/Sž•—­!X@lN®òu²±¤¿ (‘Æ=³)zhñä2–u†)¾mH¹B˜B(“¦4ÀT©àÓf…˜hâ¨M&DNo:= O5ÜNм‹â”*²çªðüÑ•¯wë¢nºA9¸—;rC5“Ú“í€ù6Ê­\×e¸êH¹Tf祸 §ê1vÌp¥Ôè´#Ò 4ª)-Ûi!wDZ“ÊgE:{¬|»šà®£`3¯.Ì1Gà D\ °qŒg®5'H¹”n6àVTïô¶Ì²„ÏŠŒÙâõ1öww7ªíQVX):…ÏH¢ý`Pâ1ÐSD?-æ2Sh#lÝñ'" „¥…ß­{B 'ÿW¦Í©ûJDÓEøiÅ'43Š3ÐÿÓBáXŠ~çŽ`¿-¬YÑSšŸÂ6ušDÜ4¿ß+ìäÛÕ)Gަ¬×% ˜†¿œÁ€lë{£Ú&&›¥›=®)=åÛÖV)gæÐú°ƒ+È,^RcÅç€'{ß0g[E†¹æ›J€:ˆä9”²Ì¡åHœ<`b˜l]†jY§N26ºÅìÑuŠðs+NmcÊó_3ÇQøw# \vmÊ•`ÕxqJZæ•}*L&ÓóÕ™O¬ÁœÕÜÊ2ÖðËËä•稻ò¸¨(Œr'ˆmƒß”>m ¡›ÉIޱÏ< ¾°QÚôacr¦gUo’ƒp3fæ¼f3îÁDºRûGÒUãŸÈmvpffl*~”šˆ˜%•+U¸£ƒ›@»¡æwÎ{zTÐ]ºþÑ2@¢³„—·W(ÔIþ<¨–bO¹^—[¢s{¡RO€›qC=ü*¬C†)YNkôw‡ÍÝé:¶Íý€XzÜic¬U²*UrïM!qû¹Ÿpª[Rm|mŸät2vëͦ&¿Ð9NS%õÀÝ\¹ß°þA×fmxÚµ)ç Ù\ΙâØëàm»Âýȶ^AÉ4&oƒð } ƒ_£§b#MâuÖ‰—»*Ø_—¸ _Qµ¢«¨²ó¥NíÜ=î]z?ÝOá“£û©Jrt?… P¨` [4Ç/=¯ìØáZÊTSÊÙvæÇ~t~d|jFè´À9@qÝþÞ‚ç~%ÈÕ©Æ%ù-eo”ü#8&¢’í“6;£‹[Ä£vѵµ”üJ <ˆbè 1>o±Y”^Ÿerg€G&=Â;t$V‚ Úa‘}õgq!ÛÆ9S‡¹uºÐu7Ë Ä×Öx® ÐV uRÖÈ4*;zjë<¨Â²Ÿô<É6ž]I=àLáõ÷o—/‘ãÔå¿€¶zí¡£òs.er°mßÿ}ùÛåÇú³:-ó$ J7m–´7Fh=†äߥœ´"“ãqTü‡wšõ€ÇÛÙMŠð6±$FÖ‡“^‘xím››ŠçÙe[¦ÎŠ7ôÞM~fh\(áÿå|mDÆëzŽu=¸ñ֘߄Ö9Om0ó·14»0ø•I•âoD`ºX,42Þ¡aƒÛ‰…izÿB[˜§é©[?¥Þò:r}Oƒ°ÙOÕ@–uÑŽ!t*¿xì­bSÓnìM»ÑÕ>&µ-IFþDæ¡^ì ÐÌr€íø®Üâ³$m¹Z5¡v|Ž7ÿ‡"‚„ìP@Š™éä@d*¿ÑÓI¤J¥Yóø?gKoÈ endstream endobj 91 0 obj <> stream xÚ½M«$¹íž_ÑÇzÐíøC¶ËB ²dnóæ°dÙ°CfavÉÏmI¶\íêª~ÆyCw—eY¶¾%×åËÅ\tþg.Ñæ?}ùççËß_~ûg“Ÿr.ïÈã7£UÊß¿ÿ°¸—ü#¥åÕiûê¢{u`^¯.è—› 1xŸŸzÿÇü,ƒcÚ› tDè ñÓ}úúãûw™°t)¤èDtÙ¤œ«tz^nÁš…Ö DU¦,­`qŒŸš¼.³\U¾Y¢(h/ó}§}”=ù¼óã~pvÆc˾‚±ëÒ÷Ô¡šF"â«–f›[?ŠB°„®<Ó׆‡è©û2}¥ºW==I¢,LYùú~Áó •º€TÜ*#ŠH8å==Q  2gµ]ŒrWüFQäC—õ"ƒ;\§ÀX”„ ‰ë Äß1–fAV² ¶ã(Ï€qò"³F>‹&Öõòg`ÜG¢Ü¡Ý Q&heã„,»Õ©X”±è V€€²žþËãp‰*Å2”u™)*¤ ñ·Ù"«ÒñÒ@^_î±ä5 b òe¢u |E‚Ã|8bËmëõ8*®S¨ÄGÊŠ:éÉ« †äÕGìªc±‹ëuÓ©2eF—¿®Ù••VhïÖ€fVj €eº|£+ÓâaA¬…Õ!’¬‹аÔy ÂÈó*öä>ó‰ñ#ªÁÊ3ª¶kµ$ÂriÅÌNÙ>) Ǧݬvßêf¢ò†fó‚+SøÃh­øèk„é¦I†¨Áðˆ$@¬*nL˜F­§Ñ‰ûÁ‘³î‡ Ï¹‚>ëZF«ÕNëŽæ ɸ¥Õ«B:³µ^8rúüÉb-éÆñ,É3I”CwP’öb¨qÆE+ûÉö”fð¶b\E4!6ÞÄ9 ÍWV]źÛûb³ã2úA¶ÙõÔÆ½V¾óšÁ²s%Ls:Uig׳›0¡‚óá8r5ÎØ2&‘ u6ç˜Q’)}Î S=ªÓöW:²Æ«TtUžÃ,3‘…¼ý‰Ãr ²ûAõŽV]ALìó´-j’éþaæº2Ùã ¨™-æ°wü]QsdùMùˆÃGÀ±¸ü4#Ç9µ®­gËd’³ûC˜Ï3$IyÆñ¯‰9Íßtì[ÎŒ ²Nꦯ3X«¥ƒ8Fa¡Š»$È{È öŒ=$è ,d&…0p"„YC˜õ8„Aý4 a\º4ˆkÛ9«,YO Ño·X§‚Ý„½¶ëçÀNÊ9FÄ“`*\«QÉÒù|¿3¯B<ØYRÆôí[£Ærgw,Q¥ßÆ "¹mì´É‚ Noòœº{ Þ"/«øP4Ç®zûÉAXz°»g:›Ži@­ið÷4h-tʱ–þarŒ«¾2Õlˆû¯™GÏ¢†óµ¢LL¥üܪÛÔSvtÅr$ãìñÔ¸ÕãHŽpŸŒäD4Äù_`ˆoŸ'ùõ 2¾œ›O)!ª™ g¸”Ô¹'sHƃqÎL‡rÀnÓF‡¤G¥yXñâÙ¯•ašƒqb²g+"·TÙXbõ-Ü1"ÁŠ++Õ³8G“ð`=ü)ï=CÈN[ E·ÇÙ£nQó±1=жËŽV=H¬ÐöÀ¤éìrÖæž¬ôYÎÇ$4((1YB '­'Òˆ» òÌýŽ‹f€(^õ]1WŒ-tœVˆ”»âq¹k7-E?©n´xt¬Pɰ8CxýD!-:ÆÙb¶ê¶Q×âÜj2@ÂH;ØÑ ZílQÕëÓ¶ðÚÇžËGªÄÇ-Ù{E„Ó$Ì7Ì2FUUì¼ÐlÉÝÌ­:°Õ0|õÿ…ªZÎ;–´œÊ`ŒÎS&áJM¦¢/²#$†¥ÜKMz€6g_‘ 鯗eÜþ2b‰!òHje«üÁ~Ì8Œ90‰âÛDŒ<ŽÕÜÇ¥PN‘ÑÏ`[çŒ3æýµy|Z­¾­tºï¬Š.ãèÄ59/#ÒöMĉ±õﺷŒË·D}š1̃ÿ,1èµ±kËà«?V*¯¤ÆœîšŒ¥f”^¿.OƒÿW©9Œ¥fתRŽ:‡E—~2¸™’¬¦/0þOÓ†ÒîaF¶Nö0¬4nâÓì°2?BKW²‹]—ÏßMÎÝä#Ëhë€Ë5QÀ°SjæTUgî°¿ý8>Í#Ggæì™3­ŵ¨5 °›áHEôàk˜&cݬr! ȪŒ4øMÏeÓŒõ+¿ÙIŒN­=9h’ ä35l‚~³1°°ª¿¾1‡ÆÀO$gLW U !bVd¯ÃTB‚+m Ü×/ÓõVVÊy%•+=HÀ^%!zIšb«ìw«ùÙVö[”¹“Ê;ãd;Õø7í=‡H àD¥é–r vOЗbT«¢8¢Š‚”ûG1Z…߉Ñ0|Ñí<(ÛlA&ŸžWA‹2;®Î¥)݃%ÖdN1p‚7øzœé§E{°mTÁŒB0¯æ›_­šÿ ‡)ÙX-ùä{0&«^c…z:sÃáÂ;„Øã0U‰n`ÒÉ2BÊ^X³©IÈ:´<÷Ê“9‹\Ԥà …žäã“9ir(I²Ö˘¶þ2ó.Œ¥÷z´zA½¬dân6aÓ¤oIË£HËi†Ë¾GïÔ¬ã•๼g¸UÀø÷µcVŽØÕ”ÒŒ]7Îâ¬07kHVzp¾åo\L¨TYœàæoÚ)÷ÑV»Õ½àӌΞ: ^RÕdº,‚Oÿ†”¦Ó8ëuìsaV&½Ë×§n”!ôéâGC^=κRÍŸ‹l/¦Cq•Ѓ‘1mýçˆïâZ†¸®-,˜ÞךE cŒ8xúPJ¢MK0QÄ ÆŠÎÔçšµ>sLDsj1ʺחb{ƒ}ĵŽZàK!Ò™tùlxÿr'e !O_ çCnÅÈ4'õÉèb†S­ÜŒN$›0¡ì¤É´ÕM´6<(Îõ¯ T÷0JZ ®÷óƒ¶ë¡»'º‘Øz\Ø(Ú»XÒ07Û8éi…FáÁõFF½v¡;°wÿF#z—ÖI¬¶ÚèìRYÜ\*s)’ûp‰ëü{±Ö¶ë€«dÖÚ¼@ Ë<¨eσK)çŽGÖ£2¿¶üU7Yi˾_%ƒÍZ¦vŒÏMÞC¬”ÉàÈÉ»Lòþ„~Kk¸aæÎ6L›QÀüî.Ûµ!‹Ü>ævé 'þþ– CÊ-á…1Ñ<€¶ˆ]îý´ówòX1çÍßGœG}ŒÛlQCö3Ü3ŽgÊ'¶7F‘IJqÎ$‡-)¬-o;O˜ù04v.õÝßd}…ÒÔLMd¹ßG‚ðØÐ#–ç„õÃú±| Õ÷(žeiWA‹+š†—¿S(QæÿUáÓw4÷/ßýüó¿”»¨ˆ”Íç ØÍÚ_™QÜœÀ‰¼¸×ƒçmÂÆbN¢ÂD²õ&ô„½[”H—€n¯Ãä:¿´^ò²q·+}æW%WŒFúBzò¤Æ™ñÀ?#ÄQ:ŽœIÇR¤ã3®7Ç4¹B£b>kÖzsÿ"Ç> stream xÚÝÙŽ$ÅñÝ_Qoî–»ÓygÖ"^ KHà}°´ËƒÍ.Ö.¬1‡âëWDFVGÓ3`@0;ÓÝ™‘‘q_ÕÓדšdúOMA§ÿåôÙ»éƒçÓÿ2OJŠYÎÓóÏÓÇ×üÂOÏ_½8½4^½4N¦›~Bú1/ué·>ëP>¿¦Ò‹˜^شЪº(oò>¿w¾•—Z[? Þ)ÀmhÓZ—ç=y¿Ï« TÕ ‡UÔüiAÊWÈ>ÿ„¶Úe¼òêŠh?Õj<¿­Ë½9;{jÚzß.™áeXÖåþÔo˜1.äPkØgüàœò©j¯áFù=]_2ãz9úüÃÄ5OAÌ!3ƺYH;àšÛʽk[uUA8Õx¼ÊGåk”ß²¯dä ®’_éB®ŠVeØ 9:uh¹^¿Á“@Ðú:äÏì)\,@ %ʆ&VÀk}Žútáq,âãÛ×ÉZNBœáø4ï*?ºïo†èeÁ²æ¬õÁˆB|åÄœ‰…3Ø’H¹¾l®áPŠf‘ r0ìèL9Aùhr䬆K¡šZÂ.ÙÞ——¼<þi2u»þd6e-õ¶A-ú ¢hˆœé … ÉX”KŸþÔ@þõ«/_}þÏoþõòÌȦ"Á ”ðϳ‘Ò ekÛ;§Ûgk¿?yýæU;ášp>³Àç4Q90:Àébf$(pâ¯7§nV¨1)ÄX(h&i2 ž\N+Bì·#<(ÒeL´'¢`+b`w,ˆw,H5þ«¦¶%:j¿ŠM9; :•÷Ÿ¾ýîõÙΧ×ÿ=;uzýíwƒ×yÙ«¿fY¤õ,"°õÅü©ɬFÞ¢ÒucRHƒÆ¡¿W¥ö{ÕØå­ðndW:ù=_­27¬T˜éa•^auј¦sKO›éªgd<³I²M{ÐDT6·Ue¯É¯,ú›&LYW׿m5'AUÎ7r[K–?[¬¾Ãk«/€u® €nöбú®²C.ôD3¥‰Ïo†Êº|¬›Ár,xP–·álw5ÖËÈP½c¥%JG9w”|Š À9Úl† ÓšWh¸QÇQû5©ù.~Láu ñzQÄÏëW–令®·6³9uÚ’ÅÝ–ìp4vi»!ò™Q‹o"&8ÇÙÝ W!~ȃ•ÉŠ4ˆƒQ­Øî`ç;}; –AÒô–„öB[ßeµ°[wÏÚܾm¾Ø5kŒoÜ?U¾“Ã` fˆrØ.{%â°žÈÈ/Ux*ƒÙ83 f©Ö†Þàl9•«'D¢Î=ªÂà­í-¬­k5QÖ8 ú°h'þiêW< ð€2v¡)¤8uÑ@ŠÉûñÉ ˜kETui P)5fpªm&­œà¬ÓºÈWó®ãŒí8º¯¨#b»å>êú ¢)aãV$nN—܈ ã-hi ‰‰¾Bå»ßˆ†BXVñ¹àA¢CÄÿ¡Æ5Wn¤| G KŽÊãô®®¨äÔ†'Ñën’–¼!!~fa§CX•µ®È Vtâ–Jð>Ï 5ê»ÔÚaPÆS @&G•uCpÔ4ÀçP(ÄS`¶ð¥ï”ê|K˜éÁgv¿XáFÆBÏqCB*Œ"Æ͆=0Ó³êö‹:QG9€æ1'v³Þ ø*Õôi¹¬½g%xòÃÝõ×¢«¿^ žt‰–ÆZ·>XÌÓ%¨ÀYÄ%ú@\‚8¦ä°QΊUòÞ%AŽ;QI…¾•\WÕ !«—VS–¶"]ŒÉiutBkÌiy }ÖîÔ"ó*}2Û5 y*ï6tw}u·ùUc® ¿›m-¦ˆÝ2·d›·Î· qT²¢•´{WÑJ¢?úÄÑ68^ù°îY+†6ˆÅD¢ö²çÍ´Œ± Dï÷[DJc=­z(ß<”&E%} žž¤í-d«DÙ¶å0Н9  -8‰~ºûJIë®ÿzIÖ9‡bœ‡šã±òÚj=PKRCVݧð ‹‚G*ðé½¹³ïeSKDÖÒÊ·@£G.  Å7Ę‘‚‘™há`t&Œ…í1ž”8YÒùL!R… Œ%%§ÄJ¡ Ë\×ôœ¡‚;‘#_餄R/ÏØ„‰HÓ¾@RôvM‹ÂX‰àÑzZ ƒ\ší“VèùÖ=µr:8Ë"«Ï€pšeŽ"*ºÿX°åà…¶“…F‚äèDðÓ×¼5[îȤi±O³ô4“~.+>àÓqÂ%ïq§XÝæ!–òwHÒ÷C²kÖ!ÂÕ^ðwÓ^Èð”wÃú,á‡äk¦«øë3á’÷ÎWåýéYþ†_¾So(ì§3PNü ‰Ÿä¢ví¢ïx(ó|sQåY¤ß‰ð‹àÝã;Ì›]t•7ÿi+ .pBÙn%‡‡v¬q6v2}Ê]Ôä&gñŒkƒ&!R,›Û :@g®u» Ë9rºërºf VkD§Õk«œ™Kz½dCÙ€m\É ?g—v5½ ¤ÛÑäüOI44=ÀKI ½ž®êééN.Jê„ËÍó“úÁì#iKZ¥ÍnE¦…ý*ÙZ}[\"I—Ë$ßãH0T-˜F˜ËÌ’¤4r¤¸ccv¾*½RáJ2€Z­MàP£Å¶VZÒC!ÖЋCq‡àJÇ£5Œë;Ø^^éþCìVÁïÕûj}€ m5£ÛW§DÐC½ö>/cŸÜ’½åò?º%â‡M ÀP[P$±‹ ĺ8s1ûEö‚Wˆ\µV…”ñJ3ªù´˜«h­F­n+6³¾ù!sÜaeŽ;°åW-M¶^(Æ–¹ZñÙu…¨ŒÌùѱF}]½>Qd¢n´ü4[ÉZ¤_Œ›Åf,ieXOöŒÄÈœKÝ}ö*ŒS&û … /Œ1¯O"C%$’4þ¶ýš7³qˆÐ=Iýb'ŒÑ’xyHê/«ÃlZ ÃáÈ oy A!©¥P«R[ÿ…ºÔy5‚¼ÀÕ1]éd;4Ö ;è4FgZ ´/U …2ˆßVŽ˜A7צTÐß9‰]´‚C¥ãz,ÕáT¦ˆÂNRJuWDYÒ©ÍlJ—lª%Slq1çZÛ’wsFƒ°~ <Ö²Ÿ¾Ð¶ÐúBˆ&ö2­™/¼/.ÈØ !…RqQŸƒ §­ÑÙ(&νÅj'ÎeÅÑ ëÖƒèã} Ù­Ó(í~^—‹¬Ïer5;0XÕ#¬fŸX¸Z…ÙŒ`¡­ÎUåàµ^ÍažáœxzhÙÓy„bC?¡MÌq$ŠÉØýôŽÆï:·SãqÑ ñsI]Çi4ÌFž­Ðøf:`1RWw,FÂX½ñùÈJ—ßßÞ(ä'ö*»Ö¥]òb«ÂûÏæŒê%XOiïŒÂ&Ç[+ì3[^¨ÐcuugQĈÙm‘µ¶®yΫbßïØ<¾5±ÚS:ð1Ò×ê±›cûzs@ŽsˆùÉ-‰ö7;4ù‘Mݜߴa:hI[²OÍ«>ûêÛ•¢‡Õ›2½[a)åX\RˆVÆôIRàjfÖXŸØ`Ì>ïýúñÅJ¾åZP‹+žóŠWÊ1–üùùôõ$¬ñÓ÷“Ö®<è”JMï&Uvio|9ý}ú¸>ù<Œû´ÎjøÜ5]6ò±‘ ÉEèÕ0­D,W\óÅß𕘅\0\V+9ÞC„vYdâºì*?<çùXn6}xŠ9 ÷íè=>ÑK ½Ã1ߥ"ØÐ?ò>Ks»QúglñI3J ×•à‹Yh¿‡…ÞÁ"”8Öÿ5Sÿ»M„¸ÞD˜EPÈn»eÕ8çÄÝ`i23IyÄ|º?â®±*å,>dõŒÓ»k EƒÒ£~åÁRvÃßEæÀÖôíÌm‘ÿi¦×Ó y–Øý ãis´x´Oµòc§×~5¼ù´eX™gsÍ“9]{8q–PW§•Êö°¦Öˇ5uI>\›²¨¯Ö‡Ëó _GªËsа»ý•ß÷ýýòÿ}¿N¡Ì[ãTÓÚè7_®ÑΙé1›s ï¼í_cñŠÂð^y!æq8A+"æ+E¼˜ePŽPú9s-vc‚|p£*EJ{´¿§-Gâœ;mr­£áš÷[~éæLj’_B!²7ªÈAÕ >„$wb ñÐ|h‚?„äW«>"è»Ï[¹Š|ÏÎÆ÷¡À£€d:iUçKÛ°Í_¥ì²Î_õ¯ÖÑåm[°X Ðyë–X•̸˜0<*«ÝžqªY-®Yõ*¸b#«Å5Oùu9ŸK÷]LÍk?˜ýR30ýŽI„µÉ•œ¼äÍm¸ EDß_£º÷ù_·›ð8ã7o·â-s¬JúÄáëjäð†¯ ÜL¸èõ¶‡ú¹£C5£2Á·e!r.§k"Þz量,ï7™ÔbþJ誗µ¸2Á«ÛS\ND™S¶f¹ë$mõOMºFZp3sœ¾Ï"àMÈÝï’Œdi€×¤Ô¦å”‡êc ‘ÒͼMÆh¿Ì.¤Ïæd: K11ÂרG¿'DßùÝzõ+OÌŸû´IQÏ&Î ž´­€‰¡ï¢k…Ç9<™å¦_Ag¹oÁŠÃ×»èöT‹«ã)-\>÷¡¡:(!u:CÂM%…Ý Á=¡²˜³©/ý7|ÿøwÿΘ“# endstream endobj 97 0 obj <> stream xÚÕ\K%µÞçWܬr[érü¶k‹ … $’^DbXD H“I“iˆ”ˆ_Ÿslû¸Êõèî;@ͽ·ÊÏóø|^æòtQ ÿ¨KÐð¯¼|ûxùìáò‡Ïç‹’b–óåáïðzÂþòðÝ××·Æš;ðÓŸ»ûæá h¯ ë fátKí¥´ÔÆ^‚˜¶BGUx›ý£´à³Fáü¥¶x+µ§a4ŸJ‹Ù”©F£8¡Ty=½5NÝM&X¼Wð§á‰‡?Q¸xæ±…½æ·øÄÁ§‡¡´ÈcØ2†“ð„p¡Œ“zdy5á0w:"µdža's?ÜÓ<‹Ù–U·&ž>/,ˆW6ŽNwå{ÙDÝ.nÕæ÷¸æh»©µ/­Ø6­¬c»ü6÷ÊØªÍ×X€$³nJ«Ÿ´Â+Ø•AÑÉ‚æe™Ì²IÛ0ÁsRÄH‚wÑÖ M”ýïš²ß"eçÔâËÑQÈDÚÜäíÝzK£˜MþXa⥶w“Uv¬`þNû¢^YJ™é “{%E”Mþ@)éF!+”Ä?›()»Ö–F§'‰qºô‘mn8aMZódå\˜šÞú2zÈ«Hë²ýÌyu¥–å×DÈZ·Ð›Bí)\/,iÂ"‘é;*sÈËÉ6.ÙY–L0€Šî©õ›!¸E…X8©(Tfß·ÿúq¨Æ^X]díw#Tv ÅÝ\AXÕÔøÓÑ,Ɖ°¡Ý‹5ÖþéáòtÖøË.Z;|99#¬¿<^4ì0*úýÏË_._åCAE61õòáG~?TI£j´…YÀçžNš‹Êõdн6Í—©¶yÿþ‡Ñ4Z–I~áÚ‘õ~ÔÛ ïÌ15ùd(^#ìü˜ñ^=íu(]FH:Î|ÅŽ“uQL%äþ‰Ìw§Œ h¤- ÃGf–Ní2 ı¶y?ÆXK“ÐkÏ·£°;h Ï$¸¬W†èÅä„Ô©ÉãhXÌ ’£3Qþ:2iP…,\ï¨I¨Mt;t>ÒL%ÿÊrhH#×Ã8¡C£^/e€y`9å‘ä ¶žšüþnÒZ]Õ„^€ò7þv½ ˜ôËTÓÎ,øÄú³³VÑ- Ž:4vò“ Ç6£NºQ ôZHF‘!A@o+=že‹.F‰ ‡YõUµ³ŸÉ‚D3¦.ò&4ëí—`˜öŒq¾Æ›ÁPhÛäj ¬šEÔ <‹¤ÊCØU¶!ëiä=ƒÛì@7CµoLjôÁª~“ˆwêP qÆÃ4@ &½ë3&ñ¶ÁŒ—:’>W§øx²·-7ʱóáõ²7Ž@«¼•É /¦s3Y«H6_rãÀ曓UÉbK†p±5µªÞÖšù03®Þf›Ñ‘£XÌ^'‡’:áho?œ®?mÀ»_2pá¯$°åh›(›àÁxýþÇ<…ç§$뺸…z¹#’ûD—ìeV*m¸Òä:”Q^£•÷|ç‹·8ƒN›ÞàÞ‹Žû"²÷!—>ˆŽè_Q‹2OõÁн-ã—Ø‘+ï{Ÿ«Œ£ó¬É•н”[_‹cd!¤Ò|óûÈï¢q’kâh¬PXAëÂVÁÖYôRH)ê~ž ¦Ûc ˜è$îü1͵`“UÈ_ÝèXµèΰ¯l+…åÁÐËeP³V¸ =õÒBÐPc>EZZÔ¡SkçÑý’»vµ{­]mK nÇ®®mÞƒau‚è¢ê¶éIpLx,§_0Mð}j?ŸQ‹Ì™Ú 1÷®ŠcoØÖ`a¶tÔž*e`áÒ `Èq¦…“ÀÂñ¿žpR÷§¡B¨Ø)„oòÜE^Jü†pΫ̄„‚f¦ˆi½\ûÌ–Œ£Ô²ŽÏ‚Ü$±±MùŒeR”8eùv8@šFRp˵Óý]_"e1%€Ô–Ö…Ñd“›FŽW#À~3T¤œB´äç^ÝôØJ9޹<–Çh×a¥g´öÐ×@ô\6)\{°˜©ýŒ¦|TP*Q—­=z™Ù°ib‹¬ ûñoƒ Á•Ð:9|=šÚÂ4W\¹B;þbäQƒ³„ñ}¨÷ø>Ï(ïš‚7|§~Ç|ÿÙ#r¯ç»úˆ|7™úKó]ûÝ·ÆwcÀùÎéXûC‘­Jv•nB‘û!ìTˆ¿D '‚(jEQÛQ”0¿ãÈÚ]GÖì9²s†]¡mGVÎx ÜÊ‘÷Y@Cg·D·)8vSR–lMy[Óo‹ÄbXçfÀŒ?ÈWzÊW.Ý ÈÜ Ò }óŠ?bÝÀ|xµk8í²ZÇ¡|jbWñƒs+–Ê.â³äö¹¥«‘sÓ1ɺ[™´g‚Ö¹³|ßËS[9T;£†²4ÿdÁ¯Æ%´ÇA®¢ß]tŒÈ»‘ß§4ò‘Ù¹½¿\B1Õ#Æý{J!¦o¡d#«ÙkváÚ Ð’B)íÛ8‰Â\ã|›]•Liî=“ÑÙBB‚Ržñ\rž«Y'é‹o¸¦jè¬Ù`®LC/(jÞ´l/Yû±Xû¥·í²4šmŒ'_8;Éͧˆ@Úy0gk!–Ø’§½Ç1ô3€ÅÛBL-N³Jð²ÜtTó±-ÞÖ´å™Co7Ñ?·Da¯õVÌóB¥IÿqAÅ-C9^×,rvïV-`@Ë“…ÖìPlL67 iÐ2îiÛ¯5ÆFéQãD®³ÑA 2ó¨ÇšM3ç1ɧ1J_{Ï<³»wQWÚÖØ4©èðâ¢sýüáÏüòíÀ‹ÑŠ…Âû@N kµ·NG-Nò©uÂ]ŽŽa¾¶^˜4#ߺOuY©·>ZÌuüé[£Â%Ü÷Ø&™\ @³!'¡Ü€ Xõ´aÄ9«¯-‚›Õ3i›ñýd "–Ák{Š·ñ‡Æ†oÔpz±m‰¬ñ±Žú°}Þ8·C&À*gƒ%Üí,– qŒ Õ­aÁDìN'= 63jÔ¯l+^ÚIU<"Mœ³ÕXüãL™\èW9æ Ý•@©E¾DçcЇßJ’7)¿6΄eÜ”Ÿ õC¶70z*ûL8F°qÕÍOo[§%5$ȘWhnùŠ1´„9?j©Ú)hHuhd –¾,9³4Œ‡¦ ú"³©¹d÷´4qó· ª%xlÙÅ×ó7µƒ*œáËYÆŒs8vˆ…Ö·C5S ‡v%'Ês0<‰¥©•P?Ém…?VYšZ×£LGÒhdŸöÛœ«Â<#¦£õ;M#%îâ7g‡ij5’6OûlÑhj-™Ýo˜Fv+öŠïfL§#ªy6ƨëÂ?´ÌSp‹”wj½—di¨©Y3ÈÍdxUgn¿JuAy‘;i¬ñ4€–,ª?H®h”W?¼KâÒÛ•å ä5ÉÙ„|©U­•â%“§(CÖ³W5 Î–^íËr¯5š#IÅÞŒÌì¨s‰Ú,(@§ÜF ôeå¦ËbýêT§:® \ßà‡Ï>>É¿& &­ªFŒK"à­çqXÓq[Ñèp2­äVe1°ˆlÍ’ƒ33ìr,²ÔŒÍê?ÌÅQ(Æ ººZžÕ•~Ú š§áym¿ ŸunïBÐhËë us©¯ ÎrA‡°¢C%Cçq“iRCgÛƒÃÏ[”JñiyÂÖµ]$¨ò:¡ôQ„;t·œçûl n:¥ÆâÙ;5†wžØ•šõÝ™jÅ0'Œ;`™ŒçŠMî+ÕÇ‘q8‹í+ G8Ív GviæÍžÆ÷ÄXx²Ü òzš@ᨱš¨ÐÉ:€^T‘´ ’’×ð¹þ›¹u[råV- ÔmîÞÑP{˜"ÃÛ$ŠG@O¤4>ŒM;ÖȤ…ARjýDŠ•?PŠtRäÀé>Xžå¬–[ocë>V·3íY&i&áõ"°@ÀîœÕ Ò3[Í[ðØ{,ãÃd;®#|z-˜ãùx üb^ %ïSZ¹ã“l(‘–'ÙNP|,F¯Rl5«`7»«æµn?Ù’Ç—Ð+0ÍçÅ}Þ외[­°ºAnîÏ¡Hô‚ö¤ÒhõH­›v•Û«´ËmçJ–ЇyŽÚåÖG˜hu§¯ÉóÖ%^•0àˆãy¾ãU´—;õ”÷¼{ÕT×.YòB˜0£®Oˆ ¾æã%z¡BýÍË`:ã¿ôŠF»£`Òˆ*]ÙZo8¼EUšpÿÐTg«ó¤Œ©¿ñ[ŽT*^9R]Ý—Uùf°øù|!Dz°µñÚï|ó‚™/Q‚‡6ç,2ú½{Å ”“ƒ5"K·ŸºÌ·3kœèp;¥Û wóa¼…öQ»+7º$—ü²]¾*,B¾Õ9Èfäûõ6ä̸È8‚ºëj1£qÊF^m _<$oí÷ J‹ÞS"‡_¬Ñað@ŒãÈJÃ:º€ø`nÝÅÄ™GU¡6ÓƒMºP¿Y¡¿þ|«n)8àBk gÀVÌè~eŠÛÑýÊH•BYÓ5Íÿ1]¬¶ÔÅ»cK®öá‹9•xÎöEBO+öÃјJ1û±:2²¿ö»ûÍKÙßßt޳ÿÍÈF6Ñá]ð 4;Ö5™žÕ†·£—·µ¡ ˆ€ G"ª»gw†þfK”XÚ9ycÑÁ|L¤m6ê†Ën‡j_ì1„áðF¼C`ŸÆYx? h ÖÚdÆs¾oDcê÷«£±rœÆ0ŽaVÿR0kÏÁìëtLƒi=ã¿öÃ!Gü¯ýnÆs†ÿæù:vÞä?Îì C|©0ÌûŸ§¤áˆkL¾çS¥Áؘì–i¨ý~^4xÆ©ºÿËBwê*` Í,~Ja¾úÍÿÄm endstream endobj 100 0 obj <> stream xÚå[Kä¸ ¾çW8·*ìX‘H='ØËÉ!‡‹ôatNy;Hݧüýzت²d»º\=“ öÑe[OòÓ'’¢†·A ’þQƒúW~z~÷Ç0()‚ ÃÓ¿èóÈvxúÇ_OÏhýgŸÑ™g´~M¿ñóùoOþð4¼ B£þ3(å„1ÃV=¼ Pøòøïá/ÃÏ©;U¥¢P.u*•‰mSI=8—³¸ia!z+%°jË ;L%~Ì%À^ô&Œ”r_­– F/¤ŠÅÔr®nD)tœ«5ÂMÏÝÉæZZ kòP.'«…s¤au,ôúÖœ‹Ð<£<,M¹©)šƒf¹¹$hËM‘l‰.ià‡NwAñÿ1ú¥¥#Í}¡Ðir¿vT@UÀ í*¨e¸»‘šÞ%(L¾-*³¢€€¦qKQ¥ÖaŠÂ=ŠÂmE9[+*a\Yá<}Cß+XZ\µ ÕØ–A®Õ–ÁáÍš'Xø$Ê¡5ÏŠý±yª#tðê… ïÃëA1^‰¤_‚& ·…Àh†§W#v<PÓh~ÛäB•~ŸKÕ>¢¦¶ R/êÂä6380{Ÿ¡wš˜\Ë3‘¯Ê% œÁ•ßÌùŽK¤ššž Ò^ Ó7cKM«Ò.¡ãîZÑq×8{<}šŠº²‘,7„K’’¦ô`Ês¦¹’c¢;|ÿØ^[Ä'¤ÅÑiŠ­­ðÓswй–'ÈÀ#ÖÖ5hdœ§ò+2Ìb3—5[¢áºa*ò¹¹uú¸’eêé„mnw¹@³ äá¦ïJ=Ÿ['áÇýA`±U@fÔɄȈJ=#ßÒ{Ãÿi£>U¨v«’ÑÍ_Íéòmü«òzH¨¦R–{«V·Î%b/¦© ˜áä~=|iL?nêS‰´æâÊtÓØm/­g›eR¯]G¿­™ä *ëŽ×1?Ûô¬!·yj·;”ù”¡Ì걂ÊßmKÙ2ü±C¾Æço ADÚÍÂ<‹2P… ²zdQ–ÉÐ(fm‰v3i‘¹£‘d$4o·Èj´-p’Å NDÛÁ‰HדAZJ;3“'·ÿVævRÀD³¹ç8ƒR++Ùª1uà³Æµªpi«!žh—Áç3Y"6þ¶´ÊÊà¹^ÄLö²ÎS’I`Z‹TI ý©®^f‘f´äy«˜FF¥cãe°.[ù¹Ç™¥–1lÀ­2½­˜þK›éµª©~çV­ 2•býL6»‰ Ÿ>ÒŒhž´-ct<;"åE×k(õê™w+lo³ ß.ˆl)7ÅÂ$±¸®T.¦cié‡z:´çÛžN©·c:~çt^ÛÓQBÚi>^MW±ŠÝ,Vl¶Ì‹•ˆS Þ_Sœ«†yEp5fLÈ__ž ²Ý3Ë—¹ —©ÞׇKs™bLõ=?„èùé<¯/ ¯‡på@CŒ¦™¶¶Ê‹¾ß“ëYà¿»Ï-/ýnßOeßÏÞ gµ çð^8û 8/ÅžÓ«êO¨a²Cÿ¿6m l¨ì$)eÛ†¡q9¦ïÕî|Ý]Ó:ŽmTÝíh¨[ÚÆEðnÑ;Þ©¶p‹ÖZ+¤y/h/öìÛ›Aû¹iËKÚ4ÉÞ2SHev;‹%m¡øÜu$¯¦à‘[#JbGø#âUß;l&ÇÀpø˜C¢Š7ðò¢khÅè 5Ø9¼:„-äê#èÖs¦Bn;œÌ*¸Ÿm2lK¤[ÿ±¸u{pkîÇ-èæœpËû?÷¾[ o…Ãæ{pû`ÆmÇò·Í„MKì]œöÚÄÛân8nEG;èåÙ§ÜFdžI^p:@)è@Ø©ØB"èHt8<Î.YmTÁqlpÄÀÆ6ݹo™îðHºÃt‡ÇÑî ;¼a\¡;kÝ¥›tçŒðîî#±›èNí10]ÿ88Ìnb°x ™Þr°íBÌäʧZŽð7¾Ú-ò‚«V{z±¹Ú Àïfµ/r 0æ„­¸÷ž\µ›«üÞз©2‡%ôÚoÄß]”²Ö:e ƒ“ì£lLÊÁ8È÷,ü kbÇ…ÚåECW†4¸#°|HR|O< #ºIßBŠWÜpÀVúMÜðÄr{7n.ÔHÛý|0Xm à¢í±t¹)‡¨—k¥ÍµÊTb÷äZ=‚¯Qnc²•½L¶ZžV2¸+˜rÛþÛuàTÐÑÉÖ2öK´%°ó‹îþ[ê±ác÷_Õg›èÀ>þØKûÓ-$ú5$ÞÃî~XÕ°nD¬]VާY· Ö©Þ°úwƒ5D—”,ïG`eGH ®Yi;Æsk°¨yì†Þ”týI¢tÔ5ÙQÖGG@1ÒË‹¾#ë‘ÄÓ½EÊÿ"…Lm%Ü™FÂÝEG–ý²©Hwø@7,@ÌáÖÚs€ù%æÁâü¢¿ äzÆßÕßHm?ø ø¶UÑRè„7¾>O®äª@Œ®ÎÚt&žlhsª÷PmN< ·:Šïãɇx{N‰Ú<‰2N|CI•TcÎèÄœ‰™’è[‘Ç»ö1W°sáñÌk+ñ–VêÅiDŒ§—|ט(ªê\×”‡›R”ëjY²ZmNVå(¼*ɧñKÕF©³oK~¯©³nã[’Xçäl]åÕÆoÍälà kþ*™ù2ÝXÒ©¼¾ÑÊ¡N‰¾°‘¾ëêô]×Mßm¦ËÇL?cÓ¹ÛD{z©ØÈi³bû™±S‘œÔW7 k; äŸ-º–nGP÷·±ƒÿ´8PôœìXÝ­’ ;½:;Tík qK,üù<*Z3¢ Aê[Eضç+£¤÷ßþÐY/¦ë/™àK“ÙI¹SIx-‹"e·×šë‰ý¶³ÒN—ËšiØ©üË¥\vX_“Mwßq~¨\_A®a€„î™O5;­7^mäùÄ“eK¬èÓ;i¯ø²Ÿ]e™jÉEŽ™PúKÈÊ«îØësâ÷.2ì\3a9ÌSsE>ÒÙ\Ñ~mEãŽí7V´Þ\Ñv‹¿4›’³šÏ½¨”L}“;TûטS`wò 4.Z ¹Ä³›ÏHnáØfVÊS‡cÝÆ×/ÞÙ-;•¯ÏØh§–ûºHN‹‡b=A}ýMžf««¾Ô“xéÓtÿçÝwBë+VÌÑÓ½8Ý %Äð×h‰¦,»? SÊs~Ñ%”z¡Ä»»ôµc êãÜO¾•ÈIAVÅS$&¤(A~Ñ•©®ø8Ó=.˜`ZË»Á„8ð¬ÚñÚ¦”ÿÀË-äðó$g¹ ØÐØTïÑ»œ3ÇfÙ´9Ü ¥k _cp¿ƒÀàïÛm›ïM“=“ËÝ÷¦¡}o ÝÑ3IY_„¬Ÿó_P8šÈ endstream endobj 103 0 obj <> stream xÚ½Ën$·ñž¯èãÖÐdñÙkø`ñ!Nt0`ù” @Q°J`$ŸŸ*‹nöôhw½°µ£é.>êýÔòº˜Eãf‰€ÿëå¯/Ë÷OË×?¬‹ÑjÕëòô÷ÅxµºåJÂòô·_.ÏÖèg̳õþØgݳuå»üAïñ?¸‚O¸28†ôöÁ»KÙÁT¼ð¾Î3Tþij‚<ƒÚ¿@_¬2ðüPO€¶Î™|ÃóÚr‚s|Ë€ç†|»õRpéÏ&<ãàœ14Lé¹¥Ï Û]¶«ŽhãïOBz²[å=“ýòýÓŸ¿û‘0u©ä™ å[¥ þÆ0ãc‚Þør×)vyŸ|ç¼î„Jy•|è̽íÝ7à[e))¼ÎÒb 5ࡼ¿òKfÏx´ÓïêÝûxßàÒR°òÌk¢LYOTÖyw[ÖY’KÂ0Z–>/R/8øîë:úî­kPŒíÖï›%Ôñ½¢)ÐFöÊ2Ö —êÛSº†ò%‹D¹¸°•ðõ:]·`T ›é¡­ ·DµFq*&¤š 6}Ûm³ª– ò-^Úk”ßÙ‰&ªàÎŒýïg'&|;u„az;æÈA²ÅZO±Jü§˜8Г PR¢Y®¶ÙÁ,…•ŸÂe‘Â*B…k–µÜ¦¤p÷Q ï”9kM'I~wƒ)¹5’³Páû`+’J¶áYë ;‚ò©lð4ãD ºö›¸ý&QAÏÓ×)»|lUÅ(¨ø™”/¬F‘mäau*R_ ¾%Ùc²ÀÆÖƒÝ#Á…i^ÌPyâÝÖ¶Zo¬?qŒ´ÿ9÷`eïÊ;QÌÂqïg¼ƒd•mºbüž®žÔ Ñõý„®Ié4…%wKÂb{4ÿ]ð"Ó¡ËS#Ô¨´êh“­maÅDzYúQìÍèäFÿƒŸ©c¥è¼j¾tô ÉPÞ^Чe›Ï¶1޾P¢ár‰Kd(|Òã:ö¢åë Žù\ ø”zæ°ºjul’Æoaƒ]¸4)“»y£”˜±sE¦ú€$Æõ΋H#,gmAv›PДbÃ=kâ-q©o·â¦âBúiü…=(/®q”i<’ƒ±¿Ö3ºLŒo^f;ßX˜ ?+çUÃu£Ðb ýc=æÎˆxKÀžN0‰‘}% ®%© ¨×P,hÁI,(ïšdÃ]0„;Љžänj Y xŸr‡–=©l€*ºF®½åÑx ”o†³²)ù肳i¼©±Õ°Ì±JÍ3 cÈAû9îf—µFÌOö~néÇÞµß ú«Z¸t†©ˆ]0#E{Ã>î"gòJÙïVºÆ§jEýüðn*1«W ãpj}»Ô ŠMl0¦„/”“!å¿*ðúXV«¼Ür òó,”qè|À*ÇŒùÇC. ¹§×];0 Á…£ÇýQW|uŨ‡Ïyé€Ñ|3£€‰9/êw™Fðk ïÞͶ@4lyoì4LÆXTÂÛZPΈŽöa‘ Žö¤’ªäOè-«¬¡·bÙæ³4Õ¤np[õ¨N˜%¿ém,[¹zH=NÔ%rº¿òçÊs»³>>Ï¥mì.-¼ÎÜs4­Á*[c±mÅT†ªÔGþ€÷€Ï›OöâÚ«¸V‡q3¸©ú~Ýè~:Ê'ñÀp_>é6Êh·ÊØœÔLQ¢Jõ Zm©Y»m!ƒ÷Í Ëo.9ècNáD¹³°(Y %Ùfš-±° Ÿ«uÏ®WˆëNB\GâXzZ%Êr8Ny\Ð:g/­ØÄ±=uo(¢1ôQUÄ9ÿ¶"šÜéT)ŒßBcEî}‘XÁU=+&ui¤‡.}r)bU&lX¡?+>º1°b,öp Pĺ«$Õ*P<«…¾ ”Ž«@²•åöwbåé™o– ‘|†ÕIúoÕ¤º#%ýûVàztX½Ëö· ZLŒo-Fï¶{ßBŠÃMÞÖÊuÖ«55R\'óVî »áç5¥ËcwÏ´¥Õ‡zknŠK¯CJ…O×IilѶõ™Ïƒ÷ÚEÈt×Ð bñ eô©z3”Áfä÷®rÖí©ÕÐi·ÇÂ'tÆ<†O†žTrïaß´As5knOY øwïÐt;bòå,5VJöù2K>¯NáW+ÉÆ¼˜c§]œ8«æ|k¦ì³””~é&Ï»Yn ‘%†D)1ÀÇH?lÂK·±¤óuŠåÆlQ- ߊae첋xo ꕎcžpœ7ÓšÉU~›»gHÛâܦ›çÍíù§Vèøøñ§n7Ä0r7$ÅY•¨”(y!0»“”ž5bÁFIɱ,t4«V»¿²Ó§V ;‚Hã+3Š5˜mˆ.ºô=¯&Ä?"ÔoßðÇë¬li • õŽqvW–šåä"˜„ñS3‡¤— ÓWlÞŽð²3¼Fô¢¼û×/KãZ{¼à¯—‰ ¬Md•Ô; »W–.÷ ûü™æ³† QQ8vXÿžÖ«Oû¶Qç®N¬ÅÉ4ì6™‚1™rÝIó¨ðÞßùÃë|+´PgfÁå9U2 L ÿùÛ‚)iM÷E4¶&%{ÞA×Á¾â\Á1 ;˜7±9œinâ?³X&äl§$§Òa÷§¬4«á¤9 <”j#¼Ÿ‡±kÀüö͜ǫ ¡W‚>I:RU´ÇNc6ú~ÚóŽ}ÆAƒÍ³s@™_³~cÖou:›cЫTV»’ÛÃìF›Ú)øqjW_Âå9ëTò•ðŸ~;è¦WrŸÁígNf3À74­&¼~LvÛèÌtz8¸6ÚÿÝQò±%‡$QyÀRj 6¨ì@&mÆr_ŸâS+R0œå*u*ÂôQJŸŒ÷5özæ­Ñ_´Ðà2µê_üoZæD|gŒttN}Ö±F38 ð'ÊåȯUվ횸ð ÇŸ/ˆÙùÞU¾A£~­è”X¡Ñ9Š!ìøg ß­h@xŒ…ò«$£^ú` $×_ytjœ uðQêBnR+Ý@tµ$J2Z5¡ä­ö°©²k·M óMϪ:ãýêð·ïFÐn¤NÁ+C'¤2ùÌ·8þÍ^'Â_ ÙÁdèÿZ¯}È”9hý2ÆÕ’æ ”}~P1 ,èX¥y Ndõ§?ü·Mµ endstream endobj 106 0 obj <> stream xÚ½[MÏ$9 ¾ó+êØ-Þ ùp’ªA{`%Vb#-Ìæ€Xq@ŒÄÀa÷ç“ıã¤SÕõÎ"´³êîJʱûñGò._³èôŸY¢Mÿôò·ÏË·Ÿ–ß|·/F«]ï˧¿/Æ«–5?˧ÿ| ê¾:gn§íÃE÷p!>œ×éÓ¤OW¿ç1È3mš éx1ZßðéYp÷¿|ú~ùý§åË¢À…å§Å¸ ‚YVPÑ-ŸVm±þüçò§ådÓXÉg}§1úÐÆÒi&,Qí1Ï Ê†eµ*Ø2éu†y[x8± ÈvŒ$vP („OŸ… 4 Ò,H"‚PèϲBPÎ-«ÓÊgY½U~¯?e¥w‚Šöý²'hE¦ÉûÍ}µ1Þ>ÿõçÇf˕ӊ:$“9^Ó«àÓ.¨Çkµ™…§üz¶PþV×ù7G±ˆu $ åqûÌĪ’v¢Ä–ô½Ò.‰¯Kòe.ɾKIVkmc¨(mY%j‹ÚíLm’('ûÏŒcc.Ù‘ß΄ÚÄÊ©A‰æ[´©x¾Göý{ä÷è>—Æúʇ‰''7Êï¯vW°—Yñÿ‡^~ÏÆÑà ¿Â¯œÖ\÷é/3üRæa÷µ|^€1«“ñ%!7¯bÆ1kŒK¿„¦·v£öí\h?z² qlf°Fys ¼\¿Nor>.<囇vúÙøÓôXÊ›cûÿ×t©MmÙÂÞ¸R¦}Ï1€„Ò0ó§ü&ÝàáLÄ-'³/¦h 廿¯ Ý ·>›L ßM¢ÍôönC5˜@ñÏ£;s·Û °Î&§«œ…jj¡ºXG¼™f]éÛêŒYgÀíqsjÜÍ·y(TMv{ÉC‘Ï3 *€¶r¦mú*šð‡Yû+åLI뾪ÛÛ&PV3±_ؼÏî»PfÙ¤ª†¬í|ZëŠRϲ(ôNVŽò¶NÒZßž] uië½ïfO¼ÐÆäð@öx;ÀlšðóÔÕ¡¸ êÇy€ÒÅ÷!2ÈpZ©¸C”ŒjƒæÇd†¬}h¦›žÚXužðžføjžºéœɳ&-j18a‚„²eéÌŠÖãtJbo>¸™o„Ì™;æŠñ›G/:Vå¢oVêµp?×ö¾³VÏ븣fûoSLöΓ|¨ügÙCˆ‹£T~‚Ÿ:…ÊŒÖm{ûp„k˜sìÍñÈfbôà8 Ùœ­fK6¶ýÂä0Á÷¾ìÊŒ©õ359YÊÑ téãNm[u{À Ž~ù’4)­¼Ì¾½RxTÚþ:…§ºE©ð`KðJáé=û~}äô16}˜m‰‰AyF'7£’âéQv\NJkrìzúp›R¹=éÂyâÃ-ùHÁÛrÉ‚3?Þ„wAøulpÆ&tƧ„ø%j„HïSÖJÀ›I¾WèÓó õ-Æ'ÁÙÁ^rK¦÷Α†ß>@àÓp#ðúwrß 2C€È ÁwÈÜ¢)Ž€%*’~–-jQ¤ŒõS­ Wp-•*«XšÁû@x*¤Çê¤É ©fŠÑ4{jk‘»Æ1ÁOhúÈüÞÝ@+ŽÕ`ò«‡l§FÎ!òïP5Sìhe²¯("Mõƒ`ÖWfàDàNÓH2ùgQÄòý{ua2J\§šI¥•S,4R8 }rÖajVV~•š•"ÕË[j¶Nµ?dkH '¡‚æoR^›Ÿ†ÛsE M‰§¼ýè:o‚tý\ÏyÉÓ¦Æ>Ó,ªŒ‚=ÈIY¤#´,øšñˆTß7Á%ÏŒÌVl'Ž"O¶ pÅÁI’¯{^’-©ùœÀצ¼%qG.¤ÇÔ«ÌöT0`¥Õà•.+°ZàW»”e†LÍMð7Ì”\’Éa‚hÅ:OàÑm*Š$ ß(9L±3ˆÒTË8™P ]h <ú"SŒ“gñÂQ<(#^”ÇÈ Øí=qu±Ë¦w)hH[ßò¢À ì°Ô]«V¶}›Ûf1 b¬À‹HÎÒ9S 7ª³ óÓŠY;ô¼(`bö‚NüÆ/عôQ«ƒhCÄÆZ¶ÈÛ>!íãß´ ækúà}ŸÎ·N¬@ˆ_!Î8G¬%¨- ›ú5awa×:'jвÙ4£ê´Îòiå¾Ðñ5RX5­J@Fâ1ÀÈ<¦®F¦eEž\•C'qplu®Â¿º·É[Bì7I‡ÝT”p=Š’ݲמôR\ö¤Š8ž•£ìÀÕ¸1AäôŠÍÂØÅCÔ>…F^4ówr{ŸÍŠcb‘ÊC#ÕZ L¨krÔOžAñ«€A:³Ô˜1 é‘1”£–Ižœn£v‡›•¨n5Ëa“f¶O¼óì}b›øôÌ6‘—¾'¸ß„çØ>Ö4îöãJ–Ô&Æ á¬Ò úœ #O zšhCØü&»psÊèÇý-÷OF1ñ ù 7Pñ©B¶£õÜ‘¶ñl›Ä‘PÅùЃyÑ‚gW?|“Â÷RBbÁsºÉ0ÛÀŒ uÆ4—… H¡ÊbŠä·LÕ_lW„[× ^­v¹q7M"ŠV+ôƒ¥ÆE˜$ê`;7üDôßcìw2ÒÙ‚–CP-XC@ÕÜ-†‚¨ë˜çoóŠžhvq’Rrhú?ìª =¨Ûy¼ÝXÜ–„³*6¢ŠPÛSZ;2ºùÛÆÃ5QpG¶CËåÅ&®.ÃE/âXÄ<™‹KF]hQ1t’|[P#E<ŠNKÇó­æÃÉÁX)´nß}úãï>惯ƒJJkQ 9±¾nY pµìÄ& »æ$+δ‡Á¸y‡î`¹ á&ù9”:.î÷ ™[ñº$PϫاÑWÅv¸Ø¯:>ÿ;tÀÒ2ürN&Sî”ν¸ˆ§ÍlcágÞóB¬<*+ CÕ^;^Ì¿ÌpVÚ%ý¾†|ɼ»?L œåŠBkÞÀLyÉ0·äbý´ƒ•–w°³N»ê¶rŠ>Æ6Ì£ïÞßúô.‹ç »8®)$šåo^6 ^5qó[Çáç‰jú&»OìŽFûÑ¡8#‘]Ÿ&ísZÉtÆ.R—Z×v` waˆ&Ø ¢í å–€‘5SlUÉ&Ïøg½«à‰Ê«£ðaöxtâû¼IØDuÄÑ:“¯þ¹œ!–383K rÉ]yÒ³–ÍÞËíùë¤ôJÂK–Omê&{î´µ–¢hï! Ú*()a NÜ\pÝ“&öjaSj¾Ü$Œá9L.öØëW.4Z«¯Èç`c±µKnŒl]ãvÜðœ%ÎÈw—¯‚!h;=Æ´ù„>½êé˜ò3ÆoÄö˜ü¢X¢“=ab¾…!n­v¥MJeÛ½4UÏ/<Á>ÈÝŽÀ7µÙvB-IDq{Äï|uqz÷$ºâ=áøvI²?;êv;Ðí‰ t\ÿq¢þ=3€Ã˜«åÓµ|;°3þ³¾w2ÎÛØÇ}qheè­Ë0î·#÷Û‹r,ûyq¾+Ìäí&+¢9ù ËÇe¹¾ïΖiýð ²×Ù¾ý~Ýgm ’Þ‰¸tx %!Ïó¹ØDRV)b°vá ¾Ñú%õ(ÃÙñ| •ZZ3X)NŠ ó,)Î%'nJH£Êyt‡­7êòìa’ô½’ß’»B>£ZÈòâìvt…þZ^¸à<ÏoÌÛkІm‰ÞÝ ÜìÌOü¤®iB°ÿˆ4Šë5‘Néºït>[ÙvóÄyA^e0õ‡h_èJJ+¢ZT%4­®ŽpZ ‚_|g¹àù„K;?ô‰™6¸ÞJ¦E œõ5ƒ·F°uZÂBÆÎ¦î0K\+ÛnGÇqí¦H=pžlÔ!îü Ñ꺿îZKÐÞVÊ”¸Uæömù©\ò³!_¸þ¼˜-_–¦ßâ>™Õ)Ùã†q7}®Á¹|Ÿ®K¢cÛC¨7?s°ꊈ `rËÊl/ʉíB9áL!$akìŠ|»õÉС¯G®ÈU8?¤œ],tH¼úÅ’§dfv_mc ^0³ º;`ÙÝþ°kšqðÕ0ï¸ÎÓàÌ…HxæW÷é@EÉ«C|ÆE?/\Yp˜YyœSQ“üÓÚþ ïP[O¾÷ïþ ¶»Ä endstream endobj 109 0 obj <> stream xÚí[K¯,7Þó+š3bÆøQ~tP6‘‚RÄQ6 «D ä&A B üzl—Ë.w»3ç²@ {NÏ´]®—ëñÙgúqR“ŒÿÔäuü/§¯¾Ÿ>{›~ó;e'¥Älíôö—øþ®¤˜ÝôöõŸ.F˜ë]) —‡Qþaœ|ëlü­ãçølËwÖâ7ñ·ºÞ·q–ítu52~Þ&ši‰æ¦$œ‹hÚ ë³hÏ V¡0åÍJ˜kV¨ŒÜGô]mV 53™´ñBé(Êä£L qÍü\8uêª}~W0†VH?4C^ÊÊhä„™@æ‡F˜±ŒÚ–:Éu/¢Ü•ɳ¢€X‡ãÒyi(¸HªñlCDþµ}\SšŸÃãZâNU]¦’ïˆ0€(.ƒiÚà=Â2–cN„H¤ùN¬æF«ùRÓ‘ 0„,æôJ"‰é=¯d‘0_`-•2iïÜ×öq5X”¡Ñ&ª™Ç<®‚V•Yï÷¡ÂMÉÕŒXÏE;ŽÕ —ý OE õˆ¡~zÁ£kÎÄ-¶¡1Ëp#õ› lU Ô²|+$qÄ^ÀÄçÓÉáÉW!@.Ûú¬^ÆŽpWîáZa¸žr‹3Ÿ {!/çëçQsKJÞŸAñ_:^¦„ètH“^"M4b«5l=ó†¨L}[óë!£ñI-õ=£íìIޱïÚáÓ/‡œ˜T9á*ßóð‘ *aD±ÐLJøÝZj“Ê;!ølxR" *€!KÑB OO>«íã)™}„s&øë¸{w¦ýÀ–¿ Yµ#½uð€8L XjÏ ·[U©ª9äø ÿ~ßB{ªéê;{:°\5cºr3VX^aTXév [b/­!È‹èv†^Ë"¤4:ú åè =›µ‘.em¿ÈÚ~µQ#ÛÉúFC¨,JÐë¬ÛÎåxæ†EZ ¢Ú¼¦³~{²ÉÙW»grµvO28cË̘‘áζ4Ý4ªÚw¬¥Öv£« „zV²z-ipUÖYX]Ws­V§£ð3*§Î*1¼²oªBì*4õ!4Z_3ÀA¢–/.ÛUUºBCžƒ*‰³åm‰JëT‡¼£›a {¤.Ì®ºÒMèz0&JßPƒç^Ãpq…ÓB[óŒÂÊè'v$r³[—!;»Ý²ÑÅÅíùÄÄnÈžî øÕÖy½ÏDG/ªzîZÄEß…Þ*£Ch-½µg.A"½K(h½+·¹rÇYoáÓ³7Ÿ`xó©Ñ:ãš‹•åbä¦FëÌÊý«±²H±Ucdý•>oÅþ3×L åt±ÓŒŒˆ,Ž8uñ2ÝŸ…>ª*æ'%fWnÞê—gÐSx&7ìiý ß*ºî卵«ïðÊv}‡¨÷4×’]Xڀ΅NßäéótKwNåÔ?µ“ÊDvð—<ËÓÿßÇ›‡*!S<³¿[Å z¼÷·1àyÈó6~¯ŠÍ±Š¶ñþ.6s ‡ñl­£> stream xÚÍ\M¯ì¶ Ý÷WÌ®s‘±«oÉ}è&@ ´‹A/Þ&·‹"-’× HºhÐ__I%JCÛ㙹Mo®-[”D‘‡‡”O?œäIÄÿäÉ«ø¿8}óýéË×Óoþ°œ¤˜±œ^ÿ~’v^ÌiJÜéõÓ×ç7-Ý›¶þM;ý¢|üÛÉø·zQ!þ6âM{ÿ2iíÒ_&ÞÑx%µÍÏÅ6ÖÁsN•ßñ_¯i+c¡eþ7·|Q®ô`-Sñº¥Œ>\ Ò–œ‡kNg3mÙ®i϶WG‚E4h%å”;œâ¯Y.Q‹ƒµi5’Åf3(ÆÁdWa‹ n­¹³ÞY›íè7Ä%2"ýÒëW4øR=E¿vì«^fO½ªí{ÞN±ªWQ -¯ÕlT(ýB)‘}ó­*ź7o3ìãLÚÌÔõkéa&¼mªTðJÄrÀgUéŒÜ&ÕinÒlYJÒÜT\VFë,¾sMÁÕžmÙZ‘M€æ—Ãy®K¯t-¢ó¬…jÚ÷‘×Ó°gJÿiÄY7´8·žsoy¼¿eá—Ô=«âA ïhò?®€Ml~ÄÊ{‚Tò}¶BIî}vòQâïtB:¦W‚Þ„t¼ìʽ«Ó]ƒŽAƒƒð …ÿÀ®¢Õ ˽5/º/ X5Ô³@—%—&Eè…¨ý4Õ?É@ohems—V^+—ø‚½A¯ÿ_;j›ÙÖ6;ÛåYÚ¦ µ#~Si¦}h$¬Í:Ê/·mTüå |Œ;úöoÿˆ ^Ñ1íÓ¾~+{£òÜÃ6þ–´Î:¢o 0A¢zÇŠÅ_R³£3£ã4³ÎÀJ èlhoöGRÜ_gÑEáÀõ€ÙYê8lqÛ r™r„•œÿY\äÛË´Nàx=cÓ7- ÜL:wQ8˜„V   !cdj‹ 6Ù‚=Þ J{C›P­A›dŒSÖ”¿žk¤ ³ÛB5Ñ}èÆ7˜¦#CšÜ$Ùagœ,$—qúÜ ­ñ=ÁåM¡ ˜e¶õ¾Mº©ß ÄyŸ' ˜gÍ!h·x%Ë¡/+3[àhû‚̲hZ¥Œ€ýR–Ô©ä»%¥/êÃ-äòD­æÂâs­cï)jŒSÉ- 0³ßÂ¥c EžËÞ›?[— ¨Õ„•ͨU´%À½Ð-«ç†\M™&Td,¡•M‹/%áxñãB9ÂÆb$Qž%ªm1F( iht$€³…~Lë‘Æ[‰Ðò\•Rî°¯å9ë9ÎÐËŒI|5ÙÉBl·8Ñ’1®Ä9ðb™/ñMê?/ŒoD»žÜ䥪Þè ï4pWöW ¬pãÔdUHÂ_j³+ޏs«.úL»ãC#_¹—¸ÙIBþ®¹ç@iIn/ÈÙÊkQzúÔh†>íŠ3›>/c±Ýuãár˜õíé¯XxXx¡1øh¤a'óQ¦r2™IEìæ rÛ ½µ¹?DûÈäØž s(È éƒWô~ÑÇ¢»è6áj’Â&Në=#ÚÓuã†ëö­<¨ç?W•‚ŠÚâ‹*µµ,$j¾cYޤn\–§›Ÿc1åƒÉ›¬Kº]À†¾…hoâ]õÔ}tÏ62ï´~éúofðYõt:oS[ÿ¾³y¥·…dژϰgO¶³ß9D&CççÏî;Á‡}`à| ÝumÂB —Iœ_žDÉ"H»yI0W)¦1P–œŒA¬mð—“I°X¹œ -âIQY¢2 6W`:WPït%`¯É)Uw$xúÒÌ” ¬Òº…®…`Ø #F¸Ä÷®‰aE4O’PCH˜§ËM«AM•Ò’ .÷íHŸƒ76BßPà¢l ±Š2,U-SŒ«‰ò+µR\C+HÞ´’d.LOàÐPY$ë.(l>E½²ðuÌ¥Sêoˆ/að_ÖÞ Þómû>oúÊ•ú¸¡Ô–KF+¤† ´v“Ò„mRŽкC@˜ÖTë3IÖ+4Ì®TÕ²F©!æ‰^ñœÝSD„à5+Ï¥ÊKÈ–Ž(«)q-]¶Ìùžµrçn„ÈúTyú‘@KuÆThOl KYËÌt7ǫބ®vd ¶h=ÃÆ°V%jü&R(Åʃ¿²ÎZ?WÊË”cl$2WØHT ­öŒ¼sÃ8q‘è²$ë°QÅZ=Þjx¥ßpþÖ«Cxå§!Ћ}ÁÓw³÷£¾"9dÀU‚]Jµœj‹¶¯ŒÅR\‚J›iº”®BG‡æçP9‡üQYTÆ]ëE% Ù«÷†Z%6Ô"?•[É›üÖº‚7lø'ò)Ý0ôZR›úM>¾á‡ÅÜAÚl zî$þâ>–F+{Ųú^Ö–,ñƒ½–êj{ËBïT…ôj±Æ>{ö¾rKXì%TJp\é$žd³î¸ëÄȤ±”_ƶIõ²…'Es0M²–Þ*‹ËÒ…ÎuáÊÑ`Ûc@±ðÉ€J60«®¸…Ǭ36Á‚ ¤÷ݹGù1]†^Ïâ•Z´“ßÖ•IÎÞ¼èBícÖ;ZþƳ¶KM˜%Þb 7$Q•ÞK¢š’¨K—D]{Þ°(™j1 Ã?rHYÌ¢2ög‚ |Å’xT #ôFI¼4ês]ŸZŽ 29úüѤö´lå{QÀñ¶ë)à%qâÃJ•ºö£Ýì+‹jÁÁ-uŰ ˜4R}‘YÎ Õ|úd¤ÏduümWÄ×ÒI¶e™Ü@ab …Dèj’¨›4—U.Ëažb0…YØàR°É*… 6Ò Øäk™ìAši¶û¥Î̽À| 5Lü_¨%'f_JÅ•êi¥Jj›¡RY©‘¡*ø¦;´£èƦ‘ohGq;\ÓÈ_s,G+D¨]:’tVëˆ×$MÝZÏ-KOºÓ–%+ü²£ðî¡SE«¼jàmìyØÊÐê~»kêh¤¬Õ^¤ -EÊ“Žª»~¹ñ2)cû‚_‹å±p9ǵ]¸¼²äþ¸T]ªJ!˜§¤~¶<ú@£Ç,è¶Qa¹q(On²àÐâÑ\Êx¼³?»kãìžò°³Ý óãî 7Dù›»‹øÝ·Û sU+¡ýÄ\a¿d§ÚàÛI¡¦xI¥Ñ-}]yU¬ëj¼qÀ²8!±à ~mÆž—Ú Ë;ññB'] ¬å*ã6½‹(GÞ„¸‘Ö†–Ghí&=vv¤45…øž•“30äähå®ò挿)m÷GB¢< 5¸¯07Å£pÕRÒ£‹Ž ßè|å'ìŽ2deªïÞJŒøýÄvˆ‚wâÑZ`ƒ¶‡míf–"³`PUɘáz®Kn¢9c“Íg¹E¸$ÍøŒ We•RÝœ›øWÈÙåeâ ÚQñÛ‘ó°?¦¦l¤¼¥ØZ1vÌñv¬€]®jš'eä½nÙì¡ÚÒbÕ-_°IÝæ=Û}:åjÆóþ0cÞ0ë–iƱË/½3uŽ@zxâ‘Á¯ò ­ŽW‘êz9Ò4ÔoAnS÷´ú{HJâ3÷Å ÂB+«Ï=ý»VÝ]“ V­îN‹j±2Ãä¿,T>CÉø U®ïV~{ƒÏp™yC3óIÖ–™‡·Ëúô ‘V¥CN€­•0ôäD:…àÎÛ.ÅX<ᨕú^2qÐÚŽÉ–š–@í¾úTÊØk=)Ñ8{˜x)û@ãy•üñŽ+XàÈAg«Ú1i›è –Ò¥\=òpZEÓÕJ”)Dÿ*WÇb£!ÃŒ© öLåœ^­ÙUWiQ¼³qó•ÐrýäÏD«OÚxp1È®`Â7T¢§ÁÕ|æ gcßõ(ëGN®¾Æû3‹ò­§(ÿøŒÒÝ`F^M—5®âþ‘?%•xëÃdï0ªE_Ÿ¹œ{:Š”4µSا¤Þ}Hq™¸!ç®ký˪+¾"ü+•x]#×-ò©;Òå›9,} 1’}J©{Á#/¤¬!E,W»„9¤wxbô›ý›]h—NkÂDýúz¡}ÊØ$~8v:™ñX-{+Ãôû×Ó§¸‡Üé?1hépódJ™ùïãÎwI¹ðÂ?O9}Ÿãê >gMB[f½ëiýõMÒÌ¿•xx'Jf'|‹=Õ¢R>}`Ië>œ?Ð+Àë%Ä5ŽÓe½L•ZߟdðIËßduãlDtáC©ê ©M@ͪ…’>Ÿ°u…¢I\RX%ÉXüšZ¶ªF¡…z°úúج]d­Åöøõ³0|ý¬ÉÂDJísŒGÀKñÀ¢(]4‰ÂPÚ±pqÀ²-×qÖÚºÄ0vÑëj*3àÄbëÎ ÷Vx%q =ôjJ¥4=ìÚubÎ ÉS&Ë(:±‰§èËUGÚ§‘Ö5€HcIM¹ª¨È°FeÞ=ã,‚ul}8γöºåðÔ†:µ ŠÆ%´ä1«³mÄšãªÖù©-)œû/å©Ò n(K¼¸»Žœ*ùªT³'JHúa¾"›ÿb˜ò‘Iv@ &)»‰b’ÃA[ùv.ùRL똸#¾ÏÁLƒ#vÀp5â´žw9°%¼/»YA I¿7· -h¶®7·¾}…Jm|;©ÕO—¨£êþÎ7 Î™nRϬû:°pò Q±p¦'’Çi¥'¤D¿z÷¨o§uÕáÚél:+›‚…©»Ô[úÅV~Ûu›Ú‘3¸áÚ—à{áÜ–¨#‰ƒ'Û¶ÊU?†y«çߨñ…6èÖÜ~ÕøUò Þ3¨Àš¥ƒ'Âðñ«Æ©ÙûXIë ï ÞË{d¿†%Ú`–AL‰)*]ƒ–Vû@„(%TíksìãG8°årpûu_¼3v&]ûwý íý E\.ÓÉ>Œ1]¾²T—:W4a[‰tèu+Sà7¶rmíP*ÿW¼ˆw]JêNŒ"Ûw`ðªÅoú}ݶ-}ùÂNÁÕDÀ›Ž®<<©È—#¡­ÕÒª÷•/’3C(•“Öt¦rˆ*xŒ?¾úÕÿÊ]d endstream endobj 115 0 obj <> stream xÚå\Ke7Þó+.»ÛÊ\ã÷c¢ÙD‚EHB¢Y D‰z Ã4 øõTÙ.»|ŽÏ£{z‚N÷=×.—Ë媯g.Ou‘ð?u þ//ß>^¾zùůÒEI‘dº¼ÿ¾¾áyÿÝ®÷F뻨ᷕ÷Æé»›qášÿÒ¾?ýãû¯ŠŠŒŒ5 †TþF4ü.ßÿ›¾7ã÷±~ÿ–Õúúí_üû?êPα•"š:Ø‘Èd„¿‚»7 Ĩ?®þÀßÖÑhðImËg/Ë(¯Rùœ)¹þÌêè:’å—ù[W”€þrLl•M£²‹§Ѱ^/UJßÙwÜ0‡[’+GDŸÎÆ)á—Ç)¢"±*tvn*ŸBáÚQhI]^Ý”¼/Gˆ4]ø©vþšµØûsüÈKçË&𖯧vžZhеÐd’?Ý’€&å•óL¹ä±à†ÌÜi™mõ„gÉlÖoEb2+¨;ëˉý‡+D›åúŸzÑ{ÀúʈàºýâêØÛpj—ëf¦«0×,‘þ­~¤*Å,ƒ/AGu®9sVv?{N¯;dí‚xRõBzEOÈ’‘í¤kœ•¼vv`'šÎ‚³ÊQ®y¾ó¥IÈ´šèâàh¹k_gòÑFa Ežãf€Šc7 iv¥¹/){ز”Õ—dý1i¥?sç²îhÙ͈W}UÂ-ÚËÞÜWiÕ cQÈбFñÕþø`T8öl3éK`þÒŸ÷"%µ%ý¾Ëå:åà" ¯¨rsÐ'7+y€d_ÖÏF¨V9=½¨Íöç˜_»´'©9ß™gÏÕfXâAp*³ªÖpUí,a`‘al uÉ€YjÙ¬½VC{S2hæo´~?ƒ„ ­ô€÷¶Œ?šçÅ^Lœ}ûM ¯Ç¬Ñ9;ÌóÖ!ïÖÝ7pU ð¼YìÏÌí7—…öy‹Å6³ègšªýDS!eb~ì ¤ »!e®¶œ )‹ ˆ{$ H,^-‚óØC¸X}“fy%jó›I{@›Àì-ZÆC Ó<&áÍ86Ç—, ÌT)<<ÍÃX`Gy; ÔtP[os¿ÙF_»‰,€ŸæPÊÊplLڲ=“ÍëiôÖ¥ÐMÒÿ4Ž˜íám¤r^Àé.úó5žHÕãn؉åÆb¿n«ºdy@Çb2te9ìÍÃXÏ ¿w&j=/LyÂ+mbÄ:?=غwm^”BÅÝšFTÌú~œëC2Kë»vtÞKËm ™mˈ7+a@`+"&ágOdMNу-a´y\Ïàq™£dxyS'+IϾ?\·äA=Jþ{K84Y‘â˜oK#íM¿?Ê·}œQp½‚÷ÃÉÖ‰M´´Å¢uÓ1‰m®^'±Å7›èœÀ9Ÿ6êä,_?Ç™1Kx¯tq‹¹©íj¦m¨)3uØnÂ0ð ôXZ¥P“fÖßsÃtÜšÕ%·¬Ñ†Š7Ü“%õÃbuŽi¾F{¿®mÖñÁÆ“ûð´Ñc æ‘öDñëD£Ö†;Wq]üú´®™§µ´£+]n$í¤°äHÚ4맸FîU®QÌíÊ¿Vð'¸ ´ä 9ùý³i³>ÇMX„r¶Í4’3®t›ˆkõÎõ˜…žç ¶„`T*)°\îv¶×ª›yN~2¾Bülîï0…ÿöå×Fˆ˜ò†%Ðf  º bŽÙ1ƒÿ±­%=Øt@uZÒ¤Œ¯›oÙk§Ú¥¶lQú<¶hq™}îN Ôr ëyÙ_M¬‡oL3•T‰‹ ¯&¦™J—n}°gªóR:ìçýŸ6ÒH° öD{ÏxèG”¼q£ÝB!XÓx•^É º—ZAûÓXÁ•VH þ*¬´bìHø’Z¿ÓÅ–‡‰KLù-®>Fæ—"Õ‡æPŸpJ}ÌKÕgÒ’ÚÔ‡[2‘fP½É/‰‚‹Ø†BŸÙVµ„óO ÷¥=É[‹fax…>`BµØ©ùTùn”)n[Çš`«goÿo4½YÿCàÙš>.þmù׫FoNe¹Î7](}ÜM WØØquÛîsKÖ”ÒA¿÷Ú7­õÝåùÖ²J7{}¾Ð µå¢’æ%)Vzff¾ü¸ºÕKÚ¾€Üòí=)fÿ ƒT9ê…»«¦ERßo~ö+†“ endstream endobj 118 0 obj <> stream xÚí\Kä¸ ¾çW8·.d¬H¢žä 9ä¶›>Hå”ÅÛÈݧüýzØrYò£Ê]]ƒmì`«ì’d™üH~¤¤îÞ:ÑqüOtVâ?Þýë[÷§çî÷ñàÌsß=ÿŒ?÷taºçŸþñtnÏ ø´ÂO}#ñ{¸þrê616Ý6_Oÿ|þ+Ž'M1 5L‹®—‚>hп§VBu–yKm˜¢À „¿¤04Ì9œý(çÝ53*ýúcm ŽÝÉðÿðV\ƒÈ¢™g^v=ªR3àóg)f-Šˆž¦úšüù¹{÷Óý8âLˆî['„ Çëÿtë~ˆbŸ<<÷Òœ>6U߇¼}zRŽ×©û5%.éüćaDÀL§¤£Ãxh}¾nú°Ôk2CSÃ3%3<_„r' å!ûßÊ£0ÕLUE 5s†¤  }É7J1Œ{yrû#˜hb.;È×(z‹5ù¦^¥|›ìÁ°&sãHYb7/5+³¤ $­‡<ñ¶Ò Be´.…vô2:y™ì?‚—‰T¡ò‰R9h37]ìEDHúd¹B•n4M7u—iÃõ†áÉt‡&kﻉK׊ yxnÁ²\" ®® $è`x s’&0½|—˜MlàyÝ&…R G±U§Ô׆ ûe^MAì‰A 2SÀdÐŒ7šõ¤¡_¡•zõÐþôµ®»ZÙ©”R=%xE”×|. g"WGD’gšôùº)‹Ük”ÅõØ vVƒ”3Ÿ<-CNF@{q•È)Yäcƒ¦Åe‚u1GsóýŧþBå°È ºoï'¼`ð†Ûê{†NÃ)f_‘´Ò”o´+|¹Ÿ!¾/' â"©æ…“„XJH7š“Ìý&“\ò~°N   ÓÊŸ"å’Ä/Ò¯KrèWLr«3˜®Ùiª¥R²<êhEJ¹_9¥à.6D÷ת ‘Cc‚Œïต E¨(-¬v¸[èçTB*¡)¸£´=V¢ã½Ê½\(-5—JäaK%Óº£™jW"¸iE|E»C¿ Úµ[µûËKÃ嬆 f‹±h§).xÚæƒÔ¬Ä0‘¸Ó´(THÜóPË_“xîw¤ÄïbOßÁêá„p(ÃJý€[ô“»éî“™¤¯õg¬A “A¦›2;Íb”K™±ºò…\Uâ9ÊŸ´zJ½`cý(Ñé\]A9Âù„aÈ„ïæ|úR”'EŒ{(1ÕÊ ˜»sZ|”‚–!0"!$Ÿ•n4#ÒЯX®Ù°~¸™\\ï•v× ö{¥[*§…MØ¿è¥R3AÊ€áVÊ,q’v¸Ñ.¥~ É,NÁ=Úšæà3Ím>sß²æ;шùŽ ³aÇE¦Ðc†ºeÁ´ZCñäÇä‘s^/ߢ[¶TÁÚ€5]~ºp»8Fñ¸ UpH÷ˆ—¸dR¥5Ü;:·à~ÃRoÜsÈn‘É.¸z4R"®d²ðö¸ê°y¢ëºE`„¼ß!› ¯woI˜C^o€üš«G…ð샇Çx­ãÒ`ºÑγAتÉ)~$äaZŽQòv!öK"ë+[øD9évç^°×z]Zß„°½«/܆7CLBXd!È:¬BŒ¶ÙÄ]ãA̱lÂÞ!û 6aØ¿¹ùö@×úH¾¦H‡3ðÁ:ʩ׀O{OQ›€ï6ùVuð{Ú£qúñµJ÷:y äL|ÏØ?–Ißû /&MëÒž aý}¾ e•|£½èvÕõJéì_‹IÛöÆ5I¤ýõû®‘3ÓS CÉÕœ‡Ë–À†NŽiu㚌[«™LxÓbõWX3QŠy MhæBáKÇý)éF“H§~š¶ÈÂç>ðwJòÔ#Ö5#"kÞlôª›Ò•¬aS"6¹8 ›G%yõ#˜½ðœ^¦‡áʧ»Ö‹i9F/–n¬z1üü<̲êÄæ'Ø£_lÑoìå2~Øg÷Ÿë‘p幞wIô¤ÖärF«¡ýtdnÅj¤1¡:ÄjnÉó܂ՔAþMÖÏ„ ¤?а|8Ä™×D}9{“]0y×ÂÂJ«o´UœNª¬à 0«òn?ÞêG1lq£zžEï%½r¹;¤—.þÅ€y˜žÂ9„éñ¬Pë0ì>ÌõÞ;À>PˆJ¤˜nå0ÌŠÑ…ì—dV0ïw^¸†päSÛ°ˆwyéñÆÒi‡ÐÏö#ùËåƒF…zÿyœñAŽ3º% ¸1PÞËH@Jb4Ãɲ‘ ý3’ÚzLÚ½ÎùÎ]þ4ÒVŒ=khüÑþìȇœš ÌSio­ =ù²½‚œ:ª¼i;¹Ü·ãkýêŽ}¨3/Ù•¥ÿkÖ;L©òHñ†ØVŠx|¸^ x¡¢Yû׉¶,.´7¥jG…]%œÁÍ®ÙmS¦Ø¢L·¬Lidpƒ2­ Çû–•9ôz_eú@"–=ó]诹fI­æ˜w”4—3´÷W Ž (E4•'.}Öû¿ù?y¢í endstream endobj 121 0 obj <> stream xÚí[Ko$·¾çWÌq«¾Ù\`/9p¢ƒ(‡ † /²tÊ߫Ȫ.v³»gV+Ç[+MÅb=¿ª¾¼^ÌE—ÿÌ%Ùò¿¾üãóåÛ§ËoŸ/F«¬óåéÇòõdfeâå釿^Ÿ5Ï.ºg|ýñúáoO,sl“\R>º:íû6ÆøKR9ÁåÍe²NE‹#~n#°jžËæð¥ÝN*úöíŸé[+˜U ã”mtk§·‹x•R9,…4|­””MsÛB¯4ĉ…ŒQ:.+}Ü.c¢²¨nC>X;yU–ÊÑæ=Þ–,2ׇ޹&IîæÆ¿ftl "¿ðñèàó-Œ’ƒÖŒîÓ[¹Ðh§Üü¥7‘û‹(·,äB*2­‹,‡òSd:‚ŒÛ›® ßåÇ–1EæSªcÊwSQ‚kbyÚ~Ó}#Ö ù°OmV ÑD®;¦º+Q¿qR9b޵µ^é§Á©ƒ2¦}=•E@…£$6Ú¶½«Ç‰•»ŒðtÝÔ>M¸þäRV$Í«ˆ—®QÛÎÍT™93M«ÁÉ”%i‰Üg­ýö¦Q/—›þ4\E…,5n²¹÷:”÷ ²ã ï²n_Öê–¬ë³Ü1ƒ"óõØŒyRÓo7rV³-J‘ãf‰EÏ#p .0Tór(4&m‘?m=÷ljVq:Ôx}]D8ØE¾Pц‡ VibÈFÌÍ f'2!ÍÑHù½ â‚™R÷`ã•”m´yѯÂî;$òu,)½›DîìX¼ÀÿšDÆ“[ž•ÍˉC[åc£åuh2m\L&Úv–ko›!JdMa0ÚF¯]uiN²#3‹þ q63{`MÓ®5}žÔkì‘n¯4Å[E,]š¯?üü÷ŸÊväÓ%•CîzîÝ‘lŽn2,~À2£€ñè 5ù²ê ÙÕúåsJ0Ë^)`­—€îV“Ÿ{ìn .1@\Å쉻Åõ•ü6mŦ.'µ›zïÉêYeÓ‰Ë=\•‹*gÁÔ«S&=?¨B˜ÂLªLA#Šñ‡Q¸iì C‰:g³Ë×PÞ}i(n åÓWåã ä|ÊkåçÞŒ§´ãJòTV,n‡>ဒSZöã–ÁUíÀ×±™´þ=|e·Hï,Ñw”sŽ}G9f¾Ýw Ì:RÜó©gò€Wý¥–}‰WC—äxUI˜—‰Äói´ÞÆDk|1·‡±A¥AĪ=¹jw^\¸šÉ«Xû0[Ê2,ùPw´J-;‰d,©ü#YüØ| ÙQ0Wd)ÉŒ‘MżÁ™–¶37ÈFÎWê÷ty-ÖÁÅË¿‹!‰`í'pEÅ|.*má¬ôàŸ—¿\¾«ðÃÊIÓ¼¤Lã° £[,Ê=Yv¢szÕ†|zJ³8ÊñF¡R}˜xD°–<䛡aÕ`ðKçf²÷vDPV΂ ä;ÒÞ—O[öÏ@œÂF;öçTã¨ú`—ý4/xÜn ¡z—×Ck{±‹>Z·gHÊM&Û»Œ^'‹›œJãñU…3Gî’®j²Öòž=ñÅοÜÙàÀ0-7fcÎnŒç½÷õgžÓÌ›±}ïbßí¹}Ï'öýܼÇw2﫸¢XÎÀ®;œ¦¸ûÃ8¤æÚæaD=ñÂXÓ`mu"Æ£]¯yE\켦³ÞzÀÀ<Â×à@Àì×P’Ÿø%Ù¯ÁåCð JŽ– „§5ì cîckIN}ÄCÜ!èö<Ïõy‡ÈÙ¶>‘ ±z¬Ø]£ÑÐ_^÷ÉΗq{ª[V¦ÎÓ "ƒ$Þ÷Y ¯’bÎ Vô<Õç¶>'X¢"ˆ<²ùõä™îȣąñõúÆU\™Ï­ŠÙòÀ'Û:-aB'o×;Á:ŒŸr¬¡h²K¾Â’sŠzHt9 Á:‰ª£â&][Ôh)Ж¬÷ÜLó¬ ƒÌZŠë“:üLžÅ5FÜY³Ž¼pm‰üÖQ{Þ‹ÕQºC€W³ 3 v.H5Ê923U<<ÞyX·hFø÷è‚x_»ðh‹„ø0¸ß7Óq€9÷#Þ† lPˆ¹)7r§8¢ciFļþeùg“œ0c8§"8Yš‡~Â$½x­7¦ˆw³A¦’T´¢¦y˜>xÝKn¬’[ë !×€Nªt›#¥Ÿ*1Þd)í4Å£¡D‘‚4±&[=KëŽ%±‹Þê“ÒÊB_çùEDí¥xõÛïíцˆ]Wž! ÏЖ\mžs¤Ô«éG[ɇìrˆGx’DÂ¥æRÎ~vdoT¹æ=YÕÆ9yӆ…ä“Cž!Ðj±e’!Á¦ † ¤Åø‘Ø *}{æŽÛ¨wÜv>qÇmw\×ÙºãGIDOÞ² ôS¬«uÖq¬Æìº õÜFGÇiœÛ-AåÈ9QÒE%ŒéÌ“.Å(‚Lç&¸[çö¼‹–ÛïÆ\§sÌÄ6š×±D!%»„ l¸šÛO‘æ1v«›éÂ5˜OûE¢1]åìYDD2à£Xè9€{òÂîVamÎ8õÄ¢ä×È"åEÑàh„¦× òU/,öÂOe»™GTðîpŒw?Ì=Vè£?RdÚ“º]8¶ò …Õ²ÐHªT VñZ]Kvˆ <:ûã^,5Ê×\5Ýa!“ŒnM©£OžA •ÈGyµuNñH`]ªP{­& «4£B"ÛÚì‡F(¬?Bþ|ƒ”W)ðƒýT›gËͧ7W r^W :"CUo"ÀŅȨký½>Ø%’æuDÆ‘ôÚxCõê¶âÕqƒoá¶+ì*Y²¡äøX­ŠõjÊñûŒÆ jídƒ,µ·Y^CÑ¢¡‡sÒ˜ÁVkàØ)ƒÛ4ÉßÅNXQØÑë3då:©¬Ôo5¥w—(ûð–ïØèuPÄòÐc%Øнñ§ìæy7ð{¾‘ß/ŸöÚ²3ü›Â_ÎÇÒ>ÍÐ( °­Sþ?khw²x²ÁÿúqÔçÉ„¿læú¥‰í§Íõ¸’ÙyinJØýw'×Ãó¾âõ,ê0÷2h—úß³¶”’Î3¢“ÐØ–ûï¶]~æTŠý¯C]À‚Íì^é66—˜Eî_¤¦?+÷àÅ&ƒµØö`ß¶yÉõ¼„Ýš¾{.Œq Z¢CÛÑ«$oŽCÍqê33i:gÄe:¯ Nð4?½Ôò!€Z~ÔJCP‹È–ioÜÇ:Ko‹P€½œ‹ÅÎhé1Û§»–žæeÔÃè7 ¢ß¾XTtG‰#ßñÏ˸JïB×jî­Ù{c(A”¢ïŽPV;Ö†{Ñõ=z+ciöé‡g!Ýõr 2ùìåšÕU ^¥F­êƒo}y+C Þ_…þZWqãË['WÑ—Zš÷Å÷åÞôv˜}²'Ý6ñÆ9i)'Ë¢ôôÌ͗ЖC(h«ÖfU'Ofe߸F÷Ž+ˆ×wл¶s6ûÚQ¿ÈÞFœµ%Æ«¤ä¾’·wA²÷ô—÷wÞ‰…l¬74€›—ÏØWÅQà b8n—T›só/vÖ¢ïŽêÖ\ã¶Û88ð|l¹LyõÂ3 ,UˆââojÛ%íº×?QCv^û´¥1Ÿ¶4æa…¤CÖÿgQÿ_ø˜{ñAð³É\m³Y4s§aÅ(r½ú¤‹F„ÈÍÕ×ê¼/+F–”ÂÄ·#k·ýPÈíÃbj ŒEúÃø5<h‹%„äÿ±__Aì¼óþ TÅȰ¿Ö´(Çøî7ÿÑZŽ{ endstream endobj 124 0 obj <> stream xÚ½[[%µ~ϯèÇ1DZËe»½(Š@!A !AFyaxØd7Â"†( ??._ËÝî>}fV«†sÚíK¹ê«¯.gzšÔ$ÃÿÔä ü_Nÿx7}ú0ýþÏ~RRx駇NÊÓ…¾°ÓÛogw­Õü¨%Íôä„wôt L(L|ü(¥,S`b…) <Œ6`…UÓ¥Î160ÏñùøÞäça¸Ý„£S^”°=& [°Sòx·³‘²ÐÇù9Wà X/¤æBgêC·lÆ÷$ürt>ÂûzKpn~óÃëïï. w$¦ƒA¨*P[‘ÀDòÃh]-ô2 ?²‹mëØj˜””uVd“>sÛ¡ÏIÝ£q`³2Rw“Õ“ý‘F۱鯅f˜dv4q4=3œœF¹™(Èð`†7Æ ÔÏ‘§ß§ˆ#Âv¬X’Êè vq°ˆ‡Û`Wáò‹H7a+¬a¹êžÆ¦[?Ž”`Êôº§†YD±‹²v~E\úS?}œþT\¸€”ðÐ YmA6Ín$\„í÷ñ´cS¦ÜèGá\»çÒ£sõÇsåÙÏÃsijp.Ø9×»òø†£Ys Œj“ô ? Ë³ºøŸc[¢‘;®i!c`@ùëÖ¤‚fêhRz_;@5Õ!».¬I_ËÑBna ýòãhš… ·­4ž) ¾ç_žÆS‹¯c^ = †M…û-lræÞocÊzq†µ M2DoF›òÄÌm’|`14cíðZ(àÚñïà*¸‡Úç´ã«í*žea'‰À„5•Ÿ.Sô C·°óˆL¼Æ\½°6r¹…+8½¿ÝðÔ L¦÷ØÎ4å‹N{´µò ¾YU€ú’Ù¯\æâ–›·B•É+…ô>Þé1**áVÇõcæw_÷w Ì¢|D#ÞËîʈl4‡£w1ýc5/*^ÖB(;HÆ×È|õæ®7 3ôE`‘Ør:ï'q_½lÄ‘SdMpI*ŒuD÷¡…1Eù²‘Zh’ŠÁ>ü£êÞŠ©›lÖ*“0HÒèÂQj c²¬]Ë£G¾:x‹F ®…¿‚ÀhKo8=Ï‘‘ÿ/+þÏÝD`ÿÇÆ…™âéÎQKIŠQ<ûL,ß÷²q¥Ï¦§)U;ý/»Y)/Åâ§w“B‹«_ü4ýuú:EÒ+BXÞsdã #”Ê4  »ÒX¦ú¸ã¡Ü¯d%@Ë|I *»(ÊWÛ£Œ· aý•Ò­@_¿Ø=p}Ï iŽlâաéÉ|ùÝëßv¢4K:'Ö4äý¯P ?4•ûè·¬<˱EgArƒ1u²ÝÅEhuÅá!‘îÏæi|ß&s¸FÌÇäF’ƒ]k=â§' aú…`ìPGAÖÁàۈEÝpŸã•P,CQà á¡ô®éÅ@-ô¾ZÜ]î!nŒØ£ÂîÃÁ'„øŸù‹kð UÜyô|Úsæï@Ch:ŸQAåé”&œ2œ=¦¼Fú¼wèú–•WB(ì#€¶úD@w Ò¬ÔßíÄsŽÇsî6š„êZÀW¢äàºÇ Û$fg ˆš²Ìµr-!V`ˆŒ›…À b®1“Mc¬ë9héåÜ{¶¸ßÊ ï`ÉIê4ïQJ;±ß~ö¦kL8&ðrp‰2ïdÖïDÙ8FªU¢åy*Ó€Å5+}ÌKÐß…¶I]Í´¶\Ê F`;Oü£2«ÀÀ² €ÖAJÔvŒÊfPÁW Ⱥ‚i³Ó%¶iéȲ%&úד‘eËÕ(æ à>ON—Â)ŒþÛhUGžM ÄýuÃI8¬5h"`[»v=~ `»ô_GÑõz ÇŸO3²äpî%þ[í2Ú@á5†s‚-zP²õ–Ê¢âºÀïðLÈ”G¿ dÒM»!“9 ™R"ˆLBýQÈ„ƒÂ‹à0æ°5ŧ6¦¥»ø4%¯²Woww1)²>‰BÅôMŒæiæo$Ã*½ŠâYš+¯·ƒ]ÆÞ—É lA`¶['r,>“¸†B tË|zËÌ»‹“˜ò¨žÊ„K)ïäúG›¡ /Åȹ¼ë´©’]Z5LÙzóBiõäæÞŒ¥uÁxJv«.a–’bMWzr’Ö ”ŽZ";š¬|±OO€ÔënQè—( Ͼ„Æ-°}$þLÔÀuxÒʧZ,Ë>Åݤ§_ìР€W! Rú@àË5;Bå¶¿Nà ™À-D:xMàá=¸]Þ;¥sMÞ¯†XçlõxAëG³øšE|5.tÊ‚•†uΚ1G<­q¯fйæŸs€¥âÙwÀÌøp¬OK•T6Ry©£r~’rs•UÖss4G²dz¢3Ô¨!L~Ê:blÞ[—Ú¯uH›À m‹¶F}KöUõ9F^á­¯m¸§aÜ'T"˜I“6X} í Ê'¤ç8v1’vzB¹_°¸*Œ”³ó™™…ž†±˜•üQZÎ|qÜÁW?ß×å«Ä¨\ÈöÐ0;XPŠžV×Q+iÚ,Í4O`BžçÒG˜ß•C¾•ñ1Þ͇Y«:QÆäë H©ÞÄ^¶p3åRÈ—'ÃÑ”}‚25”_ר¬eu0}Mñ]Qü®¿‡'öbA.WŠO¨¥•vÉDÓM§à'ø=ü„å ~Âò^ð3mªn¨o/k‰íPÆG=N㋦ã}Ýç/)U–¯Éî\S$,X7sÓ]ö¤ÜZ Á›y ºlË–á+gÆí`…¿1áf_è\# ñx"9’X _óŠG—À…Ð*âû…ï¢ki9Üü>öy8«‡·2™Y9iãRPÑÌ2—ï—ôý’¾wUe²lLípÕ€’z».M°hªú§ ˜»H´°çÚ*UvÕ{Ca9Êšyj°’ƒ:FÚìÊ“ŒrUHy7y´ç_Þ¥X›s—⨠<-±–©~:Æàz’Q¥«E·’*i²o†±­¢ºÏh‚ßiÐþã°Š„Uô\íFÂ1Tạ¬xª#¯»ŒSZ‘2€A4ÒmÝ̱ž¤ÊÈûéfíºHÝ3º>cfô¸ëÓSñødÓgˆÔˆ`Alo*q\ñåi!ÁªùÛ廼Víuuñ^oŠÕ4Ÿ©y(íD¥ªMØ6 X÷ ¦Q0ÌÕP/σMb,G4JÖ0uL™†X2ò¶Kßï5²“ÊNiÃ[úYAÑ6Gn¤Ø-ç£Ejú»Ú¼Œ>ÙÿÅû…iŽö2> stream xÚµ\[¯$7~çWôã9ÊŽñÝîò@E‘p!åä!"m¢=?—]U.w»gzvƒ’èÌôøRåº}U®Îò²˜E—Ì’lùW/{»|ú´üú÷&,ƨ5„åéûòûÅhµÆåéÛ¯œòc¬xvÆ?;ž]´Ï.ÄG§Ë3_~v ~ ±üÛˆÿéò¹ŒôºO F‡‡ß~÷o˜þÝ¿~ú ö l©WÜßRÝ»kÛÑkwÇŽ^{Ø‘w[ÅfÆáTêfÚÆB`vRg´< °ÝȾÄ~b`ãäÊ_ƒ„1šç†6~ò|jäEƒ¤–Áðè„;idÎ &yô+nm¢ó°}{ §- ÁÖõ‰£'° má=üs/õ”.x0寵¨¢ð±mÔheà›I >æòцÆ^Äÿ‹8ðáÏÙ<¨öíø÷3œû‡o~þùÍ?Ÿi%¢-hzÒ´6‚kKÄaõpñaermMÐÂ2¥èEðUþú#y++¥—Q @Y‰Óíx‹FÀéê͹ڮ°UÖB¯3é¦o^waŽÔN¢8Ež+m¤Gh±/UÝÛ¡–×QUÅx<žH=òHm¥Í“á%éë·íªÒK@§Kg å“EÉÖ)ÈVúYY’ñ5Íu8l¢Qj2¹íøêçëÎ$áô^V•-Ôê kYG A¸}–ÈÔË_QÁÍQt÷ö.¨aƒ +miyaÀ>€µ_#¥Ÿ5®z8p“€cBÏ ó„ðˆ…öŒ@$DR£„¾Î¬¢™w|%rœàR1Ä»îÙÉB2[;g$´=MBãlŽ×‡5³ÒqNUÜ>Tqµ"&œðÀ±ßFAÍÆxÛzæQÍèIå¦5öD'‚iõë©GŠ?• Ÿ$V Qølr/qôŽUÀuþ-M.?Èè&ÇžÀkᜠ+ê€ß0—xöJ²#¥'Á¥oÃlÉ}Üó#OÑ÷›ùÒÐ#ëÞOmT xr™Íˆë.Š€ŸsIÈK:´æîaÄÊþ;?ÈhþŠ%‘É8ÂgÕÖ-°uu+ŽOäΉ ¨0*éÑÞ$ ©ª›:žk+ð±l˜.Yf„V$i¾¤aå$Íð ¿$µ&T E"*¶ðã$ÕËJ§…G<ñÚTì—Zy)›Tr‹£ ØúÉZV¥Á#Ê êÀQÒ`]¾ËÙñŒÔשNJ‡µ½Žf&Šâärî u¬|. ë+Þ俌 VÄNLæÞ,UóLDîy€­wDHÐêÊ £õù‘‰åÐ]Obf‡Äù²IŽD}=¶à š€7ùãÖņ–ªs!8Ä®¥Á¨k•©zEtÓ´Ue(†LP:ÃÆðcgLÉA²éÉX5St+ál]K8•»„ó° ¥}—…"Îç4æk¾Æ‘¯ML)U ׃–”§Ÿ/X“2­Ê1u|UO!lx“¦®ofDGåÃ].dæA Ú ƒÏòÖù¬Èðÿ峯l‘™sûpK©˜5ŠÂÆ.ŠZm«¡z.Švu±+'Õtâ®é3ŸŒöû“IÍÜwÀp…‰Qè_Jo^æËß%ŠñÒ]™÷V¹uôeC\Oö,TÈ#7-ådNOoA–ä š” šUòžl º "JvseW™µ³vw¾ín]"_ËQÖvkŸ*÷0[wk\ñ~ù}²ÉQæƒZH|Ø$4”svÕOy㶃٭V6©ˆW^½æJÚº¹r”•¼–<ôgÆêüŽê§#ÑoLÖ{€D]Dl@¢UT†ªL¶( âÕƒ$r,yÈ:]3… @äJ½Ì^ñˆ?¬m2ª¬Y¢2ÔßQ±œ0ó¹ïÖP+Ý08ä®ô(ë<p4àûÙÅ÷Sæòæ rÛÊïÈúz3¸˜IpÙlbc79ÈE||0S~2\=´ý~˜žHÑ6wëDâ §O¤PšŽ²&« -ôßéNCÆ­þéÜ–m½ÇÌ›‚›´Tf§›ÇÓÑÓÞ¢õËùœ˜ý0ƒKº@¡µÖ;*¯aHnª.¡ëÒhzxM²; «»þпJ0æ»§ÇË;;\Äb¾ ÷G¶`/Úa¸½ŽpìHCÞ—éd§ U4ÛŒi‡k×¾ —"\¯7ƒ+QíY t÷öð)¾Gz„+žåþ—›“*©Å4éöhÒ7{(™óç°€¿<‹·¹)Ý“иj#`½å®Oªür)ÔŒ4µž&,‹Öǵn\x¼/Oó™+ÄÚ:G0 ×0-ÍaÚäÌ‹Ý=ßaÆCOC=`BŠ,4·b?•‡LISÒ¬} k‡8óv3 ¿I°×žÜ‚„¸Êm¸ã®7dRîZÅ›¤ýèJ±1í½’¸JœßÈ9™ÂÏ:7>(§leWz·ï‘¬œð+CŸ‡Ëpoñk„6¥·‹ñ›6z༠-ÈÕN0ëô¯ØÜÚ;=>.òXÓ¼OÃÄþÆK½ Ló®ÛÓ­ÝÅÄÐÆÄÔþð·ÛŸ—BpF­®W¥õ8c´hn`/¤cš{¸h¯ _ÖòåîàëS¾ Ä6¾ì_o§¯)®ŸÏòÉ›ÕÌ[ù䨋¤ë j°Få:š#„1zpÜŒDóJüÍHî°éLz¾ÑoÚ‰äº.˜ãKpsòËm.”ìäB s•ùJe¸µ³v¡M&‘¨4<îsÓz›î©ïÐνA*^ÇÜ(û«B¢iòõ4‹¹‘]ñÁ_ÖáÆ™Ã­.삆J8\ JLŽ.ÍK÷(óa=¨7Ö}€ý/ópΆ¡oЗ)Â5ÝÛ¥¶Z~pØÎFór½%;g+I¿° ŸP¼OæUš2<¹‰) uÓ 5ï^æÆ[,®ð´:Ivçi]!To®W›pÜš‹p š‰Ú«²0øVؾ ±X]x_SÆä9CFÉHÌØhœh½‹í´3t½:¨½qíåWJø]@‹Ý-õ9 o3¶ˆü˜_W©Ý™‹ƒâ³˜c°´®u1mE3¸ç%ÈžøbýZS4%Cì­É¼dg¾Ƭ’³À‰‚( |š0l(WpP~7ƒ»éËk0îq}'U%­`ÇE™|ÕàïÛÅé %=z FÍÓ fÙ{%°a Þ`€€ÔO“é^¾1­Íä„T§Æ"×xÀep-Ru Á~€lYl’DÅÐÒÚë• êiþµ7£›¡˜+}û]¥È;×yvxS¦]‘”¸“äkóÏ6ÅýüÝ7ß–¼m}TÇÂÿPƒ%üØÞ<‡OµÿT¾ËýVÞ‰Ký±ÞSÁ3Û¹˜g謻â`\n¥œA}·ÖÔG¸Ý¥ZK^WlŽh#î}Ùk%s¯³e|m4íaÀÝãØz+ß èõ‚M­pþÿ5hüÓ¯'ß-Ó|teìSßZêÓ»ÜéÕ¼X{Õ…îMÞf*ŠeÛÛL{(c ´¯Ýî«Êá,ù¬Ïõ?”ú endstream endobj 130 0 obj <> stream xÚ•T±®Õ0 ÝùŠŒ­DCbÇN»"ÁÀ€„Ô2ØÞÆç;vÚò:€î»Ê“sr||lßðrHí“C…ö—Â÷_áýÞ}ÜBNqK[؆Lq+a‘‡ýÇ×éÀV<°ä‰ä4/X Ýµ(õ›’Ú·¶X;9÷;AS4 ºv4§~R±“nèoû§¦)ãMEÞšt49.¡à·ß—PãVå–#`+JHñù)ÉS r̯Y4‡°…¼b»‘`Ñê3ï¤v­{­Õ½qk†:ILœÊ“£¯¾©g©ó‰ÃÂÃhˆ #Bl]œvÆp’· u¦º×Î. TYQƦ·£½Ð…)hµ $ˆm|–Œ‘ÈŠ¬ä4óRHH‹·MöC©éÅQ ‹eµØpq·ÀK¤ñ²\¹Ø²KF6ßM z}­Š^µÄNUnh:A«Ó(è OcÏL¢Ñ‡_8zS£?ΚbžzŸ¼RüMÚ†to€Š©ò«ýtZ¥Bs+Îlö¸›4&Æv¹\îÚÄÎöº[Þÿû{§ÿW‰ O¯ú:±ÍÊ|nÇhÒµí28 羃Çúàx^¾ w;‘<ÏëÝ]Í·u®ü°Î˜þq!5Q‘` ='äœ}*Q%¬‘Ö°0´_¶U… ê͇=|yóÊ#Zü endstream endobj 133 0 obj <> stream xÚÍ[K¹ ¾çWô±žQô ^ÉîÅ@rÈaE|Ëä´‹ì F$??¢(JTµª«ÚžFã.±$ŠÏ”êòåb.ºüÇ\¢-ÿÕ—_>_Þ¸üö¦<å \>ü­Œ¿­rù÷¯¹ÂSù‘óõÕiûê¢{u`^¯.è§╞€.ÿ‹e¤ü Há‰Ê¤ …Ê—QðøýõÐþú‰ú¯þTÊdAçÆÍʹÊòQfÔþÚÖ ›Âض‚¥1~†a-ÁÆؾ϶Voû/gÆEC[4è¡M…dp5Ê=WÕ q8å}SNE´6ºò+ò«ŽÀ§Ž«VšîÑb‚r#Ñïñ ËüFñï×5;C‹„f1Æ “1¾L,ÌV.µµL/Qåˆ$^•7^Œ P‰>üûÂôLTáÒiÊDy«Û4ÂÑNšV×ß¼wÖXç< «ë’:f-D#t¬Y:Ðæddê­%´yýúì§/uÏ/&YU6|£ÙnP½Ólœc™>%ÖÆu¥0PÁxº®Ž¢®r¥øi¹†ÒUUDòút;KYÃ×Y(’|Y蔯“:_u ݈iï<šPQ¨Ž1²RP3Y¢˜<†žAaœ_߉ªlYç”Ò¨³ÑãF´âïjÅ ­¼_-•M‡Z¡•,µ'­´9rŸÃ)mËÿµ”eÃÊ“ MY§ÍQ‘¯ðºHŽ6©6Ž!%n¥¯åAëL-ÿxR.EWÍÑŽ©«ñ´9ªÖpž¤¯B'¯Ö·£cŠ-x6ÏÖ"l@ÆŽB¹²—”og{Þ²ƒ•w–`l‡P†›¥^eÒ¤-5Ðó2tYù&Û(2žù¹ËL±ÀíP2…9w“:ZPµ!©¼±À¶c6Y¹Y}–ˆz´zªEˆL(³AI›`ÓÑ¡³Ju2¸7^¶Y™d-¬¼I2Æañm?æSÌy'ÛË=WäB;»ñ‘6ÒÆXzß’±ËNAaÐSIÖÇ0ghx ço4Ÿ*o}'Aø(“Õ¹æ×õI_C3â”ïaÆht;1£B1¢8°…ÆÁ)[xîäÇ´i Á¨«‘ŸÎm»,Jf¡:Ž^ƒE§Ó°ìÌ6X¶U`„÷²`èâó€gà¬&$L³{Q2€W@Æoßl< Þ¤ÁàïDðÃÐP •…7ðâ&´ ì@£›™ò®‰/­"Ð\š4[¬–ôÌ´dT£0ªšáv Þ7hÝ“þ²g±+ 7¢•†Sï §1A2/}¶¯tÚÁ¡9 ¸i½p/ƒÐn4vù,Ó3>¥[ÞñÅB•vý¯OšC×ÁnD}‰0‹ î¤&ÂgI²ʧ”=%4 ‰äº|G×ÅÚ“©0ÝQüUlÍõiô27-uq# |×\G^ëÒ`—µ£B‘ÓBnÿY6M–#W·Ëˆ·ùßR•qãUF”T[o‡Ë£R­Qœˆwa]B:0º9Þ¤ëê 'bs>,òÌ"6 éŠÓ|ß dezg„×Y&º¾«çi±©›9o}~ì·#:–¾4èFuÓ‚P¶aæO<žÄxPÑź‹aT¼©ŠåYù¦ø×ª,Òøåj©¡`„j‰r9 Í99°#ÀÔÐhª–žoªÎ¡VÒŽ[b“õ íûœ~`oÉM:Z¬±iÜŒÈë´“…T‹ù«Å@šñ«Š5ÃÚÓ Í¼@°hgÒÜ(6'{Å®œ«Í+Žs,6t†K”#\Ü 4pÃ{×Ö›ÓØÁ§ûAÓÆÄ).7a5–îš÷z)7:-”•ËóBïV/+1?fiç*ó8e:Çè…BKO"­ô"Ñ2’âdÓ­¿¸Þ¡`)MÙš¤íMp¶ÆI™'ö®ì­FÙP{#ݳ3ôÕ¼«pèŠ;3ò‰±XuÛ^±Y%'ú+qe®eæ”KÕkÑpF§ÞWpWS’XŽ‘ä6=@Î'ÃR·¹ÍJJ<º—‹oymîVNL¥O@¢Üï¸.©¿º±ºHIÿ»öêÙì6p²2²^ñX}ï£QX{TºV*s¯šÑLA­ EmÕy©Îé†C¶™­¬%ÒîïµÐÖÙùµò‰rT:j}לÞfÜ3ËZpY#âDìÇGÍãQÙo Ö¬,¸ê¯’ýMªéßJŸêý鬿)¹ ºMžBèX'wdzÿ\–ßcº¾[p›p;·™dNÞ~?§ ³lºâ>?øq¸ÍŒ,)¯€)ž»â:<¨Ê!x`¹}ØQ/ÜoÚj&Ÿ sÍ„N†¹F}>̽X“•Ýæ+#0áÔŠl ñ‚áÃMÇi7ÝZŽD=¥‘g~¼jµvÊmÙÖ³…ÂÜ$ ;Mª,y3Gªªc"ÕQ´_õæðy3êÐí3º}ÛNÝÆº_kXM=‹S}fªz¿:×oT oçßos^õquN!)H¦Kᾋg<´Ò"[’¨G°— …= Dïl/;°]Hï¡yº±Áï֘èýbAyó-º 3£t¬‹töD÷ãºP3ô±k{q  ¬Ø5ñh!¯’XèÝr!Y…h§W;ŠÓB_VÓD^˜šNIœ×ß/½&&e{-z…u˜b©q§4§pÓÕ0ת>)G6Ñ{j¢Ä\Ñ%ÂÚð¾Ôa–zšd§ ëZÛ¢nökíRßÀpÄÀm\™2Ã:e® Î(k¾Ÿ0ûa mm‹Æïwß¡‹æÓ<»hüyÝ2 hÙ§üfÿȳ;unníCQž'ŠÌìtT°s_+ð}­Ðú| ¨_ë¡zÂßV+gçÒ¬@ò×'Ø™›Ž½ó½A£{ZNR雵¹ÎÇÂhO£¿Üw,p]¡ê+íTIÓ ‹Z«µÍŸÎ4û‡Þž{ó“›ÍÔpä: Z-Ú¤u’­Èì²NšÃ´hþ;ÆÊ¨q¯ž¦¯®Ä 4j³«‹q{ ft{WÐA%­pç²L›‡›szZ×jTßÏ­ÑO¬·-3î¾êÑ}µ·W½S¾*Ðmñ¤¡Œvú̽Ôë*Ò‹*rƒW«–RܹÅÝʹNî³>RÞ lîg~\Ÿ¡¶ƒ£N»7÷%¶8†/•Fð™±ñø66Õ.Úi¢j½#SmËÂ.=Š©þðáòå¢À…Ë¿/,îOåÇ|¾XªŒðƒO—?_~n·Æ'«à÷Ð(í·ZvRÁc»Ðî£R“5î÷­­½l&s öäm‚¹¬½q.Y¨{>tìØ|—‹Ï e zç§ÑVÝæ›ªn§£UßKbZÝMhø21*xͺàµs“]c ‘%ïcWÊ7© Ž»æ(<º…@6bS›±¶ŒWc6Z泌Úo=·Ôé¾P%r—X7híÆu¥ºëšâ‡[!ì}ÎÁxÚzÀ°*y$¨Ng´“9¬#H(¾]qÃp=J4#l!4†ÑúM*ŽiŒEPcD_̦:©÷ýuþâCdý²B¥ºSÝ´{)Ì_Ø|^ã•OýÐîv©q ê2Ovà±Ö—[”Ø^"¬È\òS+K>ÙÙŪRZ>BRI^0ÿ²s;ÜɮݽûgÄæ[Š4•…ÏÓÄ^Vc¹zþèßvd”¼¼¹ììËI'š¹«Ãÿ¶=Nå ݳä¹ãŒ‚Kê÷îþ/° e“#Jy¾{V ¢Dñ? Kâ‡é 6=Y’]œ;iö—ŽŠDyÌÕÝËv^Piô‰ôæVK¹ýš`y çîÃn{»Ö`z2Z×ùH*‰/SäËŒhÖ¶ørå§Ûݦ¹k¼£ù$ܵ€õ@(Òö1öP‘ʲçû~mµÉ)*—•…ÕvÖ× LJ²aK6Æ5B1g¥µvzî¹So†+ 9;Ui.§R¥•¤4¨JfRbÿ-ê3«tK5 †bÐÎÌ_IÅ2–C $4´Ô@n'òˈtÝÞh ¼>Ñ=$ª³ÝC¢~4VPïÍuþ‚ Î RqN^åùÁÁNžO§ó<äšçåyod—‘„·¹0Û/@{ùm xÎê›øN[4†Û s}»·{Ëxîmú¡²© &-KZïbtíj#ÉÛJ•¿%®Bq© ÑZæW²h?¦ákh҆ˮ5¥N1~¾ŠvLj±ÍîEC@ìdõ©;ó©CpOÎ_ŸÉö›³ ½¸!Mð\~ËÍ‹ÌÓþµÊϼv®Ú³šúY>o©ñ›EƒÝœ8 §·_.ÀÔ NÚñ% Zø¡+¹û<_Óµ§1 }©·¸7dS]ï0trÀÑôçßü·"» endstream endobj 136 0 obj <> stream xÚµ\Éη¾ç)æ8?2Ãpg·" Fàƒ'À¿O1ȱ 9$’µ°Èf/ŠØ#ÍtW“Åb-«ªuût37ÿ3·dóÿúö··wïo¿ûr½­V½ÞÞÿ=ß~–ñöþûoï¯.èüqåï—§s&_ñ¶|³ù[Ì÷|ù¤r5\ åïüLÌ×BÌßž…½/Ôo^¾{ÿUžÞø[Rk*³›ÕªoϤ¢¯|DO¯Œ»=²©ýu2Òöö´NùPI>Ib«–5/·ÜýÂÐm+¦1NÅXþ,?3Õ»í4‹²Kqûa6ŒSn¹1É«vz;ŽW)Éq>‰­jIm ßNYÎß .êë»Ý4ÓY’ k›å‹—§MË]O'‹eX˜ìíl(W¥=R¼ÞýlUEÚ…7³1²ôÞ¯/H±vÊ•µÁfñ8ÔZï^lº“žMyÏÔÇïkšìëÚÉIîÆ«¶qG‡,ñ?Å©Dl<³m˜—§7ÅR¢ö“mÉ´¯ÈhqÁ‚µ%¤€1Š}ÖgÐ>‹Õ•1‹mÖ1y¦àªŒW­·|ÏÉ=f ²ÚªhiO?K™åºQ«ÿÿ‰/[ÀtKv6KH*‘Θ ÊŠY|q‡´ ÷æúŠ²Éº¬³[ZíA„ϼ“Êeß—×*òÑ&;§qÔê¤óì!‰U[0hžuÙ`¦Nû<5]·ª´ð6k¿ÝæÔû¾™à|qæL1Õ§Ø´éºÃ’s,ÊŒv(D³gCöuŸÆ(bŒw£(Uôð!ÊÍX¹€®FH»âSE (RVë+O¦öTÝ<ó –ê~FøÔݧÀjŸ &&e–AML#®jAU`ì6A’÷‘g„þäïoŸnÊgòïêÖì*Ýíc–Æbé×·?ß¾ØÉ¼b@«’éÂã:øeàwÐÈ*ðKÈE4à~Êê¼¶+}ýåÍp2ªsnˆÝûÌyd¦ÓJŠ€Ú;æaú%)ã/#‡Ÿ'ü­½ÇÚ±ó,`ieÖ_ä5{ϬH& WÇð½ì*íUÝS!SiåÖ3€ #ÇÏŸæ¨S¢nM D»ý®(\cŒ¡Mµ¥ë/Ô·ê@½óʯ½gqÔ@­9¤:Ô1z€XÌRI“œIãñÈk òÔÞÛ‰¼;S´iÓ6C¨ t ÄoÖV­  {ÆÍÏeøn㑱Š!î%ø{Ã9±„¹µ†9„6‡ – ­Ô ?‰FYBRE/úA¢+ޱ=á 9º¼¶ìr0„ €¿1É`è(Á0J|Û˜†Ã: &ÐÞf¦ät/S`ïÃóìUôr s$œ¿ÑIáûíDAE)ª¦¹GIÍÀEÛîä:ŒÄÎ /ø†…bRI‚Äæ’#ÙGVo>ˆ¨8××!JÚUÜ;çŽóɹ+Y[ scÍñÃŒV Ä€‡MÝa\Ü@?ÄyDÀ°OL[žÑô”ʱ“ªÇøáOâ‡úä¼Wu'’§†19>»-¦WyÊÁǃƄ\RDüȇˆ*8Íñ ÀÞ>x,KCΰ>ƒêRqÌë™6儬f±»s`¢´­w3D: „hðнÖE81 i†[ó•‚¶¹›V‹Ãûjî-"HóQÓ@8nçQ{»É‚‚TŽ]Dzë–)“•4‡³hTJ“gFÊI¬›s"ˆ‚ò'qÙv!¶±›"e±ÂQµ¿M]ñäºÊ@€0‡iC9Æ +c5•fG;v™œZ²ºÖÖ£ÑUÁÄlÓ“…©?ˆ¨ÅzÎàë4µÍÁsˆHyÿJÁÄ¿ÿòáÇ|øé_ÿü©œŒaf@’×y‡¹æ$r7Ò'ÁÝoùŽWèºg?Ká?K'ŒUT-RMu=ùÑHÑBƒ Õ "O§éWĘBËÐŒÑ) “|o3y€{³L‹ ~¨’ÛL£Ü°Œq5¼Ó*Ó½7{p0\¼vØÔÕ]´èp‘³Üû|-–B©!dK‰Ò¤9wò43ãt~HAQƒ©5óÂyбˆNñÆ á]îKJý)>v\ËÔ%Î”ÄØöGKNY*“<§Y%®5ká-“ž8°${Q8˜R2ÚÐM”ç«*ã3|ØêF#¡ ¶>#m<é!9áÅ£«‡I³ æEàGäÈìûV æW3D36CŠð FÑÃ"Û;<ÂÁ@ý–è«þ&á…cñ?ø’4Kg{”ÒòødJI(²‘gõÞñ´ À<×1Å^LËl‚ CŒBª†<»ý¬0k÷ñöNÎdDÚI í Û„ht᥯$]àÕø¹9vgN37gÈ›$Ä F¡/iÈ6²3<Ì+œT3eó/Ûhk>©òH‰-œŠØG·Å[® "XŽõxˆvMÇ@Žè¯F¡:Þ9n{»Cc*-B¸z˜ØÅ¯\þãÝíS»½ðl]ª=7³GŒefâˆlõ‰“†ôgÿÝû?;¼̬ãÝÅqc"+R…!£J‡•­³Éš ’)‰3æ:‡B¦lϸÛžŸGgÃ'MË$eÈ@–ø–Iñi¿Zùúòà¡g¡ -WJ¢<é…®ÁE®…¦!ÛY}ºïÕìÑf#Rݽ¢µ¬w‰ƒúã&=ŽBÃ1º¢4å"R0\4вpNŒ±6˜Tª]ìo8ÅÎÍMǶ9ÁQÖ-G¼\>À”I2pÅu¶&e·#ª0ùM&Ç8UæDòC‹“èÆôù>lq´-O5jp½bñ©g-m¥JfÏÚ]ýa»«í®ïæïoØåb»«;x¹Ú]¹*"½ChFµo¼4é(–qPRœü_ÂÎ4UQjT¡1å½p“`¢YIKùi¡çiM‚.º¦_ÚÚYÍÇØ‰»­ˆÊ›&Å/æiÚÛm¢´7ÑÇ?í´@:±a“¼§ë’Dz¼äcƒ¹ç•0Wú‚ÿ'†{[H] ½¾g´ÓÞ)^3ŸíÌ¡cq ¥Hwz7™d']²=¯½f1-/cÀ¢èÔº­Ý‡2Â4„~݆½xjÓýJÍAxo+:‡ðù³’ ¯ÔƳ’Mà1ÏrL^/€;Xý˵0Ø ”˜=èÁ#ô?äÕ0–SO܉w”]×]¸X°)Žù¨kéšãJT¡øÇ}tØ^È^êH±õw´Áädƒž”ýØ MR€—ž³zQY¢äºn0v–̄ˡD¾xºd:ä»,âØëö5•ÖÐgM$ªJUí$6 ߎ·M{éµs«¢Ãe³>¿¹Ó2q£%ð c¿È›ñ ̹(4P©Åõl* QT\4{1„ŠË'pÐ7"MßC³Ÿ´"ÛoênÚ™-µ³.߸#®F¥§±o„Vâ[·h§Âm/_P­9ëÜVz¼xËäm´Hr2Ù"ö@fOÉðÛ™$7³‡¾µgãÞþR<üÊrÛ’ß²£Qvž’4¢²ú '#ºu\Šf%ºVýÏæ•ËËoÇ]ZÚÁÛq¡†µ_Ḱœ¿·\=.½M$»›à]·.ðþY´±Ü>ÖCåßâ-«3t\Ó‚K¦qõõß®®™ò½5F|»5#ðÖAßr6ðås:×£Îã% ˜e—u§É:uMÖĽý†¿Rïe¶­¿™Ì(?ЋåìuvÔ®d~¦ äfè®Þ”Æh9—hxÌ1èÊ3ú6ÿn¡g¨ÆÿòÄ¥¤¾§J`*k—ƒ-ogºØZP›['ß=늲v©¼•_ÎÔ.‚ó›ÿåL4 endstream endobj 139 0 obj <> stream xÚÝˎܸñž¯è£z1MóQ$¥u ć6¯¹erHböÄ›9ìç‡dU‘E‰R÷Œ÷ØFwK|ÔûíÓד9éôÇœ¢Mõ韟O?ÜŸÞ¼_NF«E/§ûO'ãÕ§K~N÷þ:=LNÛþÁýà|8Û˜žÅ˜~§çÞçgw狳.=ö1ÿL¯Lút¸ —å-1æ•V‚Å•w@;ЧäK"Ô @ãëòéèˆü™~‡ØÞµ‹òÓü„“+óî|yp¬˜7‚æ·žÞ2J!­Š†~HøŒèòùôò™ég E]±±ç¿Ýÿ>Ñ›Èî”÷Höº±€Ì´)ÏÒfŸyBÊ[¼.B–®óL¿d&ºólñr;O©rf!KFCßñÁ™QÀ‡ÆF0Ìû¼2R9¡Å*Û=¯Ê+€é`‰ŠZÊOúg/7¡ÉL9<‘-LDà`"­e9ËÌ`F·‹Y®Ñ®PŒ?}j"ËÂu)<Ñ+vx!k |½¦‹¢àºeâ^8™Å@1`ri/ùA#¦tá=ƒ±–×ÃÔk dæÌÌDd,‹ì]}+Ø\9ÊÉm±¢&©ã§µZãux=ï­æ‚.„0=šh:éñ'6Vâ<9Ý Ó“4êÜ0Ö• ŽUY¬sC‚H(a¾U*š1 °\“Ëè2 °­(§Bµnt Ciϳ›î*ŠdÀ¤ô”m~%1ßF ÞÊ®„–y“Îrfzÿçßþ˜auvp剽Á£ HMabf¼B†Ýéµ(–ó÷ ¼k‹˜ ‚«ùT{•Åêá\PóÞø“1jÉØÊ”p ÌR(*I‚1ÙØl“m9ñŒ0³û¢0ƒ…k&íÉFØúšÂo'¬W>"+ĵ·_ .n®×uQBº+Ät)2~ä3³Ü‚5$bEÈ%SªÕϫ촜•ßܬžF$0Ôl¨ç??ÿãìõôtöfzú7¢÷Ó–éïÏOùgH‹þû<ÀnöÊò9‰Ý„F`M!£Â¡ÚÒö,ûÕ XMDÈ>Ê[ô.—$q*,½UÃNʸ‰Pœ™¡ÕÀ%ÄPÅOè_l³£@çf±ÍØ’fêöØÕÇS¸¨pEû‡³*H%Î> "(°+A´ÅH¥($m5 H øÝ柹’aù/¨š¼ÊÓ ²¶¶çÍw¼ìÖH2I‹Õ+«˜L-UkWß‚_Û”ÂA-ÈLë¿{ÃÂh{}làý‡W8)eÊ[²ïß/ ëIN²šV½M²´$œ´µ¼.ž¢ZbþtÙœîTÁ•ÅŸ¿Œ.5Q…d·xUº˜Ír(t©ž’¾™ ÕV.YƒÆü©îÙ7Á•êM"Î^£¡È‰Fg³¥3”k>=ý4¢ ™U î㟠â²b…¹Æ Âô}þˆøQ½ÅÏ#h]TÀ”ýð„† Z¥gI¬ÇOC$Ò2ÇFI»**PETD @b<~£̧ºè×Cö噽z„Æ¢4ÿç}ü2’rÙ‹Àèªd*˜5ͪK€“UbŠý¼Å9ä·gô¼?ŒîˆÊŒ6èÊÑ)ÐɈD(6š¡!Ïæ ˜ËIŵ(æêÎ0Qº[ƒ# Ð]ëíõXå+±šXzÎ0µÆvébæ$Hg¤Ai4ñÊØMVz¦Ñåº1yÐzˆÙ¬`©K ŒØœLÝyˆSNö»±Ž¤åÖ •¤—ðí¨¡…Kî/.ÿ¯òÍQ…¬˜€éJ•uMî’ÍŽë^ ˜/‹šç­8¯œd%ß»¡NSõ"9ÞÁ}ìd.&zî¥Fzä§8Rþ„›¶+7 ªß O#hBöæå0c…Åî-DåÝ Ã–ì÷“·-1˼³Då`LŒaÌWn…×BwUoCÞeaé"›_> …'¸`lôº¿è$-…Úl3÷ødªæ$ñ™Ç®Üjå—c_ng¥ù¨¿ÜÿáoØfð$\^«¯…)QªÍÏ£0Å1Gý­‘ÊÊÎ-KíÊì“UpƒZgŸ2üUèØ™åbïo犊$’篶ƒ¤‰¾u%‚.¸Z"@»*.b©³–Hv2sJm®dæ-–¹ž™cx )]´%$wätv!®*εto¹*C5˜:ÇÑׯ ´Üš¯¯5¡²ó– PA-Ä×VZÃLLãð-^aZ«§ãÇ!ãˆ=.æ…X™wÙíüL•51®îÉz¹ìÙ0æÃúò°p¨ge¹´ gw—Y5Têj*<úsö`%mUà ‘S³­öÀpñQ ›?ÛZ¹výoÔ½óÅk»Ó báò¥¨Ó^މò9’éØ R£ÒZ\š¹ÅÖÛºK6ïvɲ·µG¹ÅMãF ¾A=h²8ªÅ–.ÞªíÕn=hŽAµzFû/$õ¦v;ÝVH9 “ ;eõ¶”ÑdÿˆÌb'Ù›þÑ]U“º#à¹)é°>†Ú( q×Ó*÷ò¸7î]Ôb«¥¯Œ¤t¨¹Ùä=65qe]x•V¼¿¥Þ‹«É«X³R·c·Ê-î”cØŠцv®XõRd`¢^÷K†ªjšzàLÑoØÃxÅQóµÊy0Ò×é%^‘{zå‚ÊMGæŸJΗ']ãTº„r¹×õô@°¬R¤­ìÄ#Ù™Í-²3»›e§®ÞüÆJ\[>C­N˜oÖê’ì\Ñj› ¯Òê>,žs1XÜ•xæ†rÊ­X_SÅØÚvgµpzó¼Ž+`ž‹çHSjTÚÊ„Ð)šn’M.¶EtŠíÖ?Ô&4î±Åµ ÒéK³ï×»Škʾ¦šªU;N›ˆ !ìJ¨Ú9v _çûÇ­œo6Ø •ÜŽ%íã$iÝŽéòÅòc”{l= !ŒÌç²ë™ûCv‚‡ŽFF×õ)S8S}}iñã[Ñ&Óv"¦˜0æ¹flÐ`ÝjllLAnH(E4TnéQúdVS©W‘ýž—Ù äzﶺêº<9βXwŠ•Ix¢¿­Rë«,‹:ÎüZê{9Ýîh’}iIlq†Í…¬ã×'R²a‰Ó`D ŸÚºO gÕI—Q×Ö 6naoÕH€ÒÛ"8óœ9²™(ÛÇqa ûÕø Æwuy<ò›&¹³fF^$-¶‹†½mÒ²×° Çe ;e pèà[-B%‘xIXãÂM!ñ|³¥¹c0B1™ªÞá½Ôä‹qRèIåRÌæs¾":¨lÃ×ö;ïL§/Ë‹!úô># ú– WÝjxi5´BK_ËðXEmMɱ`×Bî8òx5 Æò]¯¹ú!ärØ*ÜÞ-¼ê`±`wÄgoÝ컑¿d½ß£ â<"óh6”lÖx't³UÜX*«iN†µˆEÏwkeQÁwS¯|[®ö‡lh{ÙgCÍojvdßÖRà7Fßôú°GÔ¾Ó6ȯøIË_’Þßñã°Ž‘‚EN´¶9"æ'fžfgÀp597ê»&-µˆ3?_ëÁå²±hAÖœÀuˆƒØºà ƒÁaš¹,#t3WYQíÔF¨ky, ú⎆ŒkѬÆ‹{EY¹îü¶²òb¯••‹ƒ®{‹{Iùx±uøm¨tbRÎØUº^«šÆÝœ®Ï!OŸÝ”D÷`—ܪ½2)ã¢ß’ù;F.ë®É>ŒaŸÈåoû±Ÿ2âQ)âÒI;kâFA¯p:¥—ˆÛ”U8÷Ë 6ü8naêø¢Á†¯ã`7ÛÀ¦¤ÃUo[Diúÿ “2ãêÖÚ©usâ¢ÄPøWfº«}³@ì´W ]Ú1ãÜ¥ëa®ÃÚzíà‹ …:<· ㆮiešWĪË8CÚ)/Ä=w«…"×)zž‡Êåòô j¥Hò<4 ;ž98ŒŽókKA,ñ4›ÿRô@Óñ»ûÓŸ~õ?+Öà endstream endobj 142 0 obj <> stream xÚÍ[K“·¾çW°|"%„70–íª¸|°óØ[6§HªHÉV’C~~thÌ4È!w“JI[;Ëéº~|ýaxø|P™þ©CÐé¿<üõãá»Çë’b‘Ëáñ]¾Šîp^D°‡Ç7>>mNÎ¥ßÊäëôžŒ‘OFºôþ˜ô¹R§³1êø¤ƒOR*ýèSÔéI)AJZ¸ÖùGÓ'Ó3!?-ó<Æ.þ¤}ÁžþòøCÒý¬Œp®höêKœÏØ$éÒVžtHû¯ÓgilëªT–pïfét×yzd5ŽòÓÉ /q4×å¿|Uôyõ½ÒdíP=X¸_ª„!Q8Äòý¯¾9“ÕGɤ%J½>í’l’i-Q.‚XBÙ«4YLs S~|ÿ‰›TáÝ¡I¥‰Q(R!›‡I;JºRM+ ŽsŽNh~\ò¯ê öýÊ×®zñöÇå»v¢¯³Ú®3Lóîçp+¨¢Õ}ÏÙãEXV[¡®m…òþøUþàWûë5üúÈik‚°ueßü\$ÎA ©ïß±F$1ƒ>Ie«Œm.à…¢ðžÅ «úöÍî¾Nµ‰$ë“QØ¥ëâ·îhKæh)n1¢0¶ëò¯¿½ýĹ’õb¡«ó§ÇŸ~ÿü¤{UŽã›9rÓµ³pí%ñ´Ñà®O‘ðÉšzžÈyaˆy ¾.úäâƒ(ýöïÿ| cò›kœ°W77ܹ¹f²¹¿¾agÇ}‹EȦiOWÀ[LY`¸É’=:¹‰ÎÞnº™šÞòékv{´ÉF®·‡1#Åœò/m…¹n…Y%g=IÎ÷Ïd„‰}&~™l€’Ò—éÓ›Á‰å­YËÈ­¶ÉQ"Õö3›“¤°DßT-ìð,AµLý“SR9À»)ƒðõÏÖzñ ×1*Õ×múP ÒŽ]È´a—M|NÊ6…mÔ©V)—}k¬Û\!ëótä´µBWý7ç Ú–ÕxùŽ›#]6CêÄ­1Ž2º9µ(—)™>c¸‚å4äôR#tÃ&XEœФ‡šRë@F/陂Ei]p’€E¸¶XºQ5!ífóÆ Syº3ö5qBé{“Lœ&™bcr”B›CËz³Ô˜z‡{S£ž&¬oø°•¸¸3Ó¸cñ«Wÿ_„åz ,×Á^„ÚÄYÛa¸×y ´KcPHK>µ}öMToÎH¸0–/K‡ ÔYǨ-_ë(zÑáwÙ>ƒk¡À¯‹×…%u ß„­r¹'È÷Û–ù•ÏŽzýú#æ.ÖµÍatޝ$L7Oß³y«lµ,}¢ßüø[.]éÔJèçlŠ1a v¾¦ëò‡à²zô´¹zQM/C‹•¦f2щ ‹ ¢ß†1½ké³Z$rvPPëj‡^xŽ8ã9Bîïç9æPú^­•É^€Ò‹¾„£™~q¿Då<ö€q)bmîfû¤Z>NI)vFJ àZ¸å2–L)ëPcÇÎèådö黜^sMBM«Ï'7.#m,¥­(VĘ k)¢,’·N,k6j¨W¬ |Ú}'L‚:ÔFˆÓBG(s' *á °­Y·Œ{3?2°p00nyZÙf W¢é“”§m|KÁË8‚]û¤¼1Ù%Pù<¯TÇ®]:–ïRîµé.‘ß¾ KýMl+˜½rºR­ì ·ØW´\ÛWF°ôn׆°Ã²³ÉÈzâìÅÊl—¥Ÿõ5–}½{u mæ2¦AÞË"›•ù)…=‰Å-H>74v¸D„Ò.ËZ¿ˆŠîšéìcO'ØÖ:dʤ³Œµ&ªÐÙ7ЬީûéB_ƒº>}%à‰T7ãœ1Jâê4IIxdyMƒúÚâxÞ"KÝøD]v(Å×C5•~×`ɽ@Q×-Ј>l(—¦÷~N$´êö‘´f iÇÖÔQÞeHx`;“ðÎ6áL»ò·ìkÍÏd?È›á3áº\tºÕ5ðhÒòî!‹ç=òåT);çRÒ…íNß’&‹CiŒTÚ¶Ég*6öÆAÕXÖ¸Œ“}©0¯1sx™±äP[±âkîÒ¶,›_¼Õ¶'tÕÃ…1"Š.ýÞm1ØU쳄¹XgK³0z…㘿,ßò¹Ü¦^ñ8ËxÜ0JÈH§‰|;a±}-¡’õZÕ<Ÿðý½a¥'ƒÑàÛ*9Fï§U7¿#a¬EU5Á´¡Rìºe k¤HÒp5«Dfl¡^ú§’ÃãNTkå(\—•C­r9JÁÕ¿!ÒÄO 9Ýk'*ËììEŽ1JŒ<@.Ñί©¯ØÚ8¶v@y ¢áRR@-z,¬]Úy’Ê8þH‚„h=`vP¨ã$iäT€3Ê6Ã:¶„Ðd5•õ,ö£Ü,Œ©î[]/¦AÓªÜpÂ}ÙB„ÆXÖ„^-:1ହ¹8æ =YC|’±ÒÊ ¶ó2²ÖNoc‡ë£ÐN0òœàóÏWW¹f$‚_™ð\Üð+ ÓÝ^ô”t¾z4É%u×ɇº-8}$ØݧnzEoëÎG;Caª™‡7|¯Âš ²í,ØÒZ¦èpSŸÑ z ´I× Äùuuïóº!©ÃãR{„ýZeãT8‚œGL(ùï¡vt~2}­ñáÍ™º Ì{7#:b˜…0è·œþ.SŽ1R ò°î*&£õž’ZÒ"=¾çÃPá¾v¸Öç“*Ò ™\l‹ Ÿ0†“98îy³#‹5Y„I´§ [ôíçÿ+p¥oWe®‚+6á–wI¸É(7ÁM `&Ìã.ã¦:×Âã&SpŽq*6’mÀ"(½Í>I–ÂØ®ç‰EÊ+ú4EïåTÒöλw*j)ñÔ§AÂæ¥s¡Ò²h³‚P×Ò€^–UÀOfi@Êg¤Øyóg¤JùbÚ.:oÒ@Ñušà.Màz„Çz‰³D!å$QàCÆ?’’@8: ;Ç&9‚¼v&u®î¿ò2ŸÅûoˆ¼éoC“÷´>ÊÑìÝrnUxz'˜L’á€,%Ž@Vwž´ôªWæÖ1÷qqæÆ¢­Ù4_ײø+ŠTëuü:F]SxæÌµáx^: Ž”z²´Ý'¼›½RjâªÔ˜—y³åÊñ“½zPÖþ×9–k×éê¶ZãöÔš†3¿˜œ‚XZiÂ¬Òø:t%Ù£„|xFZôV.;±Õ¥[`ܺy/Ÿ^ð”Ø+iÒ³Šd†úÎcÑæ¿½{­;>s–Ú™ˆ¾ZÁZ#Ý"ØÑJ uóŠäJ?¢êr®Ò“¬óCk)Ù;¦8ú FöŽg«W›’ãݼ䰤±¡mâM‡b+À'zRŸÒaû+º·’u©~è»­ñ›Téïl"ÂcêÊ%»‡eõ‹Ò\ÀjÔó^Ã1ÿ›×prÎ&¥}Ñ ,@£g5)•c8Ê<í¯éh„…A]*ÆE:ÊÒÌ"iW^Àz±¢~äÓ³ôWw‚¾|þ™ùÎ÷¸P¹††Ž#Zƒ]þ~¨ë³:íIŸ."ªÕ¾ÎÒ^^ÂÎ^­°³ßÓ¥¹/Q,cž ¯14MP7 ¯zJ« \;zpÕRôÔbÇz+Nöƒ?{þM³‡qáê”ôdŽ9¡à3•ëvªþÿý¦^~“‰nƒOº#!¶qÙjç””î„5Óè¬!™ÀäâÙ÷!‚ßû}ˆUÝSôÍÚ)¥ÑÂí{ªËö®–r9,ë®þ,?Uó^áëùw}5˜ëYŽ£oÎ^ª mµþ™„ ÌË¿|ÑY昶$ÖÆãõ¬³ìÜ¢.=6­çù›ëfÖÐ/æQ¶~Èfè±ÃØ Í[‘ŽëÕˆ†Kóf¶í׋Å]½ØCP6U/¦Ö\V1î‰ÆP%ùh,û u,_ÞH ôÓïøÕúf" endstream endobj 145 0 obj <> stream xÚÍ\K·¾çW ršEfh¾Ù â Ä ˆÝ,‚tp 9—üüðUÅ"»Ø=³+ ’½Po7ßõþª¨Ë§‹ºÈôŸºþ——þrùîÝå›ïãEIe¼¼ûwú|Ï¿øË»ýt}}o¬{o¼zoœI?òå®}HoC~«ÓŸßléKo¬LoóOjdí›ß»ò }KK‡ýBí“ÛÚ4b€¾í×ÐφöÖÖ¿ŒîÓ%·ÈoËØæEçÞeº>§Þ/"7öé­_6Õ6ê,¼iûf¬£›IÃ;{­Ç“·íôuW·änßÂÆÊ’ë‚,~•½EÛþÏï~(d1¹J–t`µ_µ¯1òJV×¶Ÿ·œúkm¤ÑõÊŽò¡iQWND›&Ø„3måÛ0åœÓQµÅÙ€¿-¦ Ót§Ë=e£E¡uèTí³xOÀVµd£kÞrÔQºìð›ï•&L®­Á§CÍ›ý}kA¥ ãÚgàlº&ØuásÕN We#³Ce¨Î ¾0š€C;7Aƒ±«¦¹9cg´ ¬™Tžµw2 ½Î·PÎ5ìÍUm¯„¥õ(2”ãöŠæ€í×mƒÑió ½îÍò¹ ’#»`µ4l0'6Ù$ØC0˜fœ' ÎÍicS)¶:ƒ7£Àƒ‚¤ÞpkÙØªlDuh›‚*ká˜Ê•Q÷º_‡=Ьеé í¸‡S°Ò‚z‘îÀ ¨íÎÜ€:ÆcnŒé{¿'¬k[7c]ûz»G­k?ƒµuÅ1W^ˆe}Œ¥G<šXÙÕ)§°®¾µ@y—ßH`H¢ßºc›ÖÿÈr—ñʆBÕ†yY!ûEMŸzuÎ{´Ù QduÊx^îÃH²“c&\x0dÓІh_¯A÷^9n…†`äðÝ^‚ˆ¡tÚ¤…K‹ï¸ ‚ÐÛ›¼Ù’æ°e”*ÆYáô[´3Lѯ»v%í ÝÇv:{ÿ*Ô=Ì’cRî¦íš5kéɶïJC;“m›ÝïLEá™ “Ù ö­!¶‘ ¨¶ì’Œ°foh‡©œÐx""?Í N 4tû Ô‘în•¨¡!·Cz8¢f°ËÔ8Â=hŒÚ¨Yôšd#Ò¡MPE[.a†ú.a&è„wa‚’¾†6©ì„Ò„Ê¿|øwø‰œê„þ–£sZ»‰8—d׳ Û›pLçEZÃtzÉtß¾—F2Ü+…¦ûøiÁxIX°ÑŸÙ½“}I†ñÒ“Šó8ýÕN‚*kÀæ×§nƒ nºò·™¼ì†§{·Y“ß»‘h^OÄn{„ˆò_¨ôÖªp° ›ê9ÅNúÏŠ]Š-žév{¨Ûíg×íâ'ÞØ:ÿÜÀ'§ª„†µýþd >ýIT|×|¨2Ö8ÐÖä»)Tô}Lð§rOêœôÝ€·^ðk[`'wÎD-cÊ™‚äs›¤šJþ‡Oœ¨©LbJ‹l'´ªð£Mªžá½UFcà2#¼Fa}`µ°0*™»ñnPj%"šÂæx#³…PZA€¶YÌ9€dCÛ¥³Þõf-h°³AøX¢ÒæÂÔ~+72çn8xè¬ æ­°š†à»! eFú¯d¤e矔‘ÞstQÒcüë<’öC¹5=´e %8Ž:h3ÀÔûqK[Y39ôm×}~;ÌáF|LuØ3ôªâ[šì®òj ÜпÍÂŽµC¶¸pËï!‚ì²Ö‰yW%Çgl¶öy‡V¤#RJçóUcjªlÀM)ÔSŒðËì æ\RË£hI.I{yíV÷©G°³õ!À¬U4Ö½á@'&K;›ÐBRø³n„faa\æiÃË'Œ:&€ =jêâk‚§.€7¥ Œ'a1êO%Ï}¨Öêõ“Ú¬ØÔ׿2qáð&ÔdÃ/Hɧ§¸B•|Þ‡©ãg³jä¦lÒ£I/,a¼Øü3ÎÑÇOì¹nftEU•ço õ\6´ÚËeþ²íÂâTª9'ùýú¥A|-K_”̉ï2–…FRáZÎ`Lµ=cæÖ:ÅW³ ÝTÞF‹[M<ê*šÍi‹×S|býä\š±£TDhtó¡¤#{p¸®#­ÊYèŽØi½A~XÆØgßF h@ª™ ³S‚|—ÿ°Â¿&Z£Ê¤Ýâ’ѧÒ]²°”D¯Á:»WD- H"é)†WUwÃß|M‹Ö¡¸­UÄí>´Ý¹ä ²Ѝôžjk#"§¥ÂY}ž\“W ÿþjˆ3¬t:‹Än¹îãÒB)‡±[kÂÆcNX@tÙS#p—¬XDR¾–«‰<ƒ›·Á\Ȭ¤ù%+Ÿéx¼æ¯MŒ¦çÝ×B|ýeˆ/? ñÕ—$¾|3ñëŸ#£Fï:C¹1Q"æƒl ÷¬Â"÷]J&«À&ç¡xʱø¬OÁÅŠ?›Ÿ­uA\¸£¥Ðª#§ì Fû?²¢µBØ­hE°ø(ÁxJe’ûžˆ¨8ˆò9¹Ž9ü ¨}È ö‚©GHÍé×ð˜{¡(º®œS¥#7Òbâew³[[§m.Åt®s»—Sޏââ´ÕŒ%£÷^ù&¬‚bëÚi’;ÒnxuðU;³q+¥$ôøxãïÄöÛÇráTõ»§ÃÝ:Š%ô2½z²L¬Á¥ŒÐoLüv¾Ïèáº9»[üƒÜQÞ'A E+knbbªÆ…´äÛvµ‚ÀĜެwÂì¼YôVi‚ASŽlc‰™:)ÊÈ{7XE0Ó\mNÊ€›XW_‚Ã4/©j¾-¯}¡ˆ1påMz.jÐRÛ~$ù®™/­(¨=•„AÐxVµQq†œê@~Œá ¸^¾€i'õðxFîù¢Dìe£Êä¼Ï÷zØèÀ?mO£_ƒÕÒ [¦<Í/ÊÓ`-¥ aˆ™­sWŽ×ß6ÃQMimåkÛnÐÄšhÔŽvÝö€} 0ï8ß ôÜÖÝà§RRƒ;i}Ší³YW"*Z®ïÖH0BÊZ=P“«‘í©ÉÍt¿( ë ] •î¢/Q,^"à“¢ ué6zmðö‘/Û‹P;¬©-÷PLFC‰e½mÃ.±õd8@UuáZ‡nÿÀý¶Ð™¸=uÄU OYÝ*U G4Ä–Ä|³¡†qãÞŽÙõeiµç -'ÕÔÅÚ=rq¡öz9AØvÂ2YDÉOˆ¢©²-‘FIjHºH¶ªBLª €;•,‚Ÿíªê ½xäé1›)µ§Ö%äy—s•.lHª+9+X¨ý”ן¶Ÿ¡©*Èåq‘ƒ«_¯ÏFWÔþk}~hÿõ¿þúá¿…ó¥âœ03…d ö‚Æ À>úiû4{e¸»½çpöâÁ}m°é¥©zo‡•Bø:¤ØIÅÌG½-šƒ¬ÕÝXV§FÇ’m­I—¡î5·/fícâ±…mQÞ†òn¿,ï†1jüRã6¼êî_ßàF6ˆõ„¡“€É$K7j•„9¬ÀÃÃ)‘–WÇy¹$NiÃ%q ©´MIHMŒS}êæ÷šë7ŸzȲl©F6ý®ÒF à¢^°ÑSœãÆ¢Œ:ÎpáÖá苌Dïçd7ÀEÿ—·KåÏ2ذl«©PŸªi¹K5aw׎+ Wà]r2ÚƒKSõ¤#7hŽÃH«5n;Á¯Ì LO¦ eB§Ì!ŒùÊÆ[Â@J•ƒžôkŽ(6DuÙºk)¬ýzÀ³ˆb®ãÄ“ŠÒäî@Ð+n#93,¤ já"´Ã<¨Õ&³-ÝÎìÕ¼K¬ä7$=¢8ÚÁ¬û\âx8>dyÞ_™¸©‚Œ“ÈÊÀtOÍŽ÷ÔüƒÐ 'Ö^lÛ32§Ž@ys–& ˜ü ¯ì“”ù$/­ëAšGØ£9ÎGQÉPE6²kÍ<«k´ÜHÁø®ÔY ¯âQ“Qâ‚h‚Zµ‹˜²¼P­ôÓ8ôÚ•‚¨|O¸UMó fªá•žþ±¶ ¦ø~¸ƒkmOÏLJx“œúOZ"¸Ïq/i;'ïö6ݬ ÕÍ¥ÐSqÿ@Å\&I/%·rÒâ@˜-‰ê6\k|²¨¶ð9ت8 -X$Øf(þM•`BZàTÉUšiŠª©Þ32ÍOsú €CQξ¦àÌéºëÆË”¸s„dÊ¢üë2M›ê;’›î¶Ð(´*©¦¯¹™éÖoÎÇÛè¡2-wо6•\PsãÒü:$1È‹€ÊȘ!è»-z&2[ùò—w—÷îU¢ñ endstream endobj 149 0 obj <> stream xÚå[I“cžûW(|’p«¦*+k›¦aÂæÀ°éò`z‚!ÝqΔó/äL›øÂ‡L# £9F"`Ö¦Íq€Bfv†9ˆóÏÓ‰Þ¿û¡ÐÈ^P&Tª×w…ÈöDöÏ#… WñßD&¸-¢ç-è%ùöÇ_¨­ ËŒÎ+½£^¥™qù¾göÆ4–ú…€W~ŽBëýëðaÒGýë6}¼§X–†¡Ìk¼ù1R 0nú]¼{Kn“•GO\`¡Áªͼ€›rÞQ«h†¢iæcR1"xyçÔ2–¡k¼èsCÁè*õE‚†e²³’_¿{(Æä%kæzé|uÿÅ—·É%šãèìÁyÐ$×(ޤTrTÉEÒäé®ö.fò“‘’ʰ.ʼ.owµŽ9q·Ñ0“évL?üçÃCZ“V®TÍ.f•k¢@åºrå¨\9£\Nñî‚1ò©F†hrT:p»P5D”Kö%g÷U<”ÓAd°Í©ì‰mx‡ú%wA9¹Šx•ôo’LÚö¦™ØéÓ˜ÄôÛÁBsŠÂÍ!Iòsn‘™!$ýLÎж@à3& ÏEŸ†ÿL ëó]較%|Oúâ“lÊzÕöô}Ù(R^fÓžè€öDxíG…PA›#î "D'ŸÓžâý/e €Q:.R|B½Ã0ˆ O$§%ã¼Ê˜Ëú™ÎdbG‘S@N˜Cº†3ôÄkp‡œL òWùg@ïÇ ¯8펩*¬†˜ÜPqª¼1œ +‚úÐp -¢5t†3 `OíL‚ÊðS„×…])f»]ý…TW‡({Ø2.U¡‡뿣ョI9 n)—µ–Ù°odw‹Ø*™PÁDà%S Õy/¥"aàl¿–Þï…v͆í0[ï÷á…ÊXQtgqbêNe¹»9¼"Ö܉é-!B®(ÊCn×t5¶ 2/[WƬê©éøã«-×$ö(ö&àM‹s—ž†D¼ž£Ëâ|Ùã·3µŠd– QΊRps²~ÍW”÷¬ÊX°•»µJWÌà*%—qXÆËciJìOqf̶4dê€yÀü×'¨â—QgŽÖ¡T6=z ±;ÆiÕ¢bNMÚ.cüôö9 #_¼)fÝ‹/Ì­´Á®lŽ l¶û™k¾Y)>#å²!µX(É-ÕŸüUrCõ'ÿ°ÕŸ]Ç’vKÊe,)“Õߤ²Þtßly™Ên_PÁ,üxîZI‹2§ÝµRž;«Õò pßçl¾Z¤8€×ÅEÊèì¸ÀŽgö>×`7*µ /ÊQTCƒËŒn3ÔL}ö¬øÖÂûM%úÛçÏq´i j­!œp(¬Ëÿ‰ì‹Q’òUÞW§×>²üD¦Wˬ웫ä,„CrÁSrº­ |.Ôþ=ÊØMØìYvŸ&Ǥ¹ÈÎÌÔ0• ¸ÒØJ#¯¬&¯¬7¿ùðáá—_gÆjBMíÞÒ![@¼w ÛP¿Ëœ€Á”6HšöÇQ¡`‰od’à!Êl2 6†Cu6Y—)“Ër( €Raƒ4"§SžkÓOUר6+Uª§fIÖs®ãP͸îÐCÏ¿Éüƒ– üƒV>8õ×X¸ˆA4ÞîÓýÄqŸèt¦†BSŸI¦ÄëB‹ÐLcR:¬é1ì8B=ÈÏ­Ö‹úDÑKµ®^9™‘½©œáÙ'êÓ!K߃v7€v/}•ß ’80åtØÉAwr³m€hºI!ÎÍ /24{íÅŒHo;Sƽæ=§¹:™=¶ÿ¿äˆLC‹º7UZYkEÏ̓ÂînÚöŠa~h²Ù$HÙ¨Ò3`t«#LWGDñÇ€îX‚ŒŸÐÄ«ÈÑ©½$f3Pv’l¾xgÛg°OÄŒDKp:Ü„ïòBƒ0Ù ¤¨*Tùk襕y{Ê;ØýÈ\ï(¯s ùž fgÔ»+.™yßä’Tr@áBÃ÷QÅ„|¶bbŠ`a@°jëá76¯Kò¿I–‡è`°¼ÝÄÒ•meVhêÜ'T>¯bŠ{ÙC©—T‡º¸ P[^ݨÊÑ“ª›*|Ùü ɾ`7à {P­›<ÈÖ—† †áÃO+²tåÀd%c§>ÕN5vFR"Oæ9§Øb4ª7ª-‡·–L‡•…d ±¹÷ìÒ >ŠæQf!1g†¢ÛÊ$óz --™áPçTŸÅ¶‚ªÏw#DEÕHðúÉà%ÙU.eWÚ]÷­‹Ë9½¦Ÿ@!ìgDØé,Yl‚QÄìîíÉ~d—YÔ$³D[Òõ™™ƒþÉÂCÎyyUì2ZÙ›`{£¡9KÑ5׊xýß^~¨Ì‚'5ü(-áMºySâ‰îd*Ÿ[1¥ÉÌ _ŒæwS,w)Pä—wXN;g¨Ñ–š¢ãS­ª¼¬”Béùm¥BóXu }ùv¢*Ý¡H u{¥¸©ã0ÖƒŒ<Šbl(»Iëõ‘ý¹¡ó#ÇIºóãËvá¬Ú¿ÿ†}B;GWËöƕǾòòU}êxDT0ióôZ4AC™âãó¸ª[˜'7²ñ0`Þ{Vsг’Id]I†¶|½ß¥ É+ z­Ê!U4nޱ”(='¶Š‹ Üt?¶aü[?]l¸-¿è–Ä8Ê„ü_ð#’-òvŒç5Ý«ïÐ䙡ž|%ºE¢æÏU¤æÅpMW}a:t·Ö]ÙM•3`é€c¹YoSd*ežŒy©«¾k{—@l4™Ù<ŠX_œªPŠU¬Þx¨ÓÉt%·mÈ0š…\oÈ_©±AKÐòùlæR/T»ŽgÑŒ¼jÆ ö©“^USØQ:>ùíж.Ek¥ò….Åp4¥ï¤Yô†"8­£¹ñ;ûC”Ô*B,åNaRFµ¦“·;¬8¼Ô+¶;ÕSwƒMÒ­ÂÂ,•ðŒÖ’ gº5ùÍ+È?­±ùgþ:.v‘ï/½LÕU×0+QDg›²ƒ„4U¢‡EŸõôÛd†nøLÆ=‚>ºßŠ·µ |bÃ'` "ÐIH<¨R2AW ñîz@¿8þJ,?iºiEé‹ófC£^K#hÔY¹©—€w{M9å¢JÕŸMW£`¬cÞ8Á1›¢®tñò?îwÿüÓÿðI– endstream endobj 152 0 obj <> stream xÚµZK¯+· Þ÷Wxi¶¢75@ÚE€fÑ]€³Ëɪà.Räîòó#Q$EÍhl'iq¯q슢øüDéòõâ.¶þsðõ¿½üóçËw—o¾ß.ΚÍn—ÿÔ×ö#_>þõãõ3¤\?ð²ý 1ÕOìS ¿í“o_ÒõÓC¥Î®~üÍç::ÚN£lç’}•CŠu ´ÑñŠ¿'RdâI†Hsô'ulמ¤ÆÕuúœn¾\ûx`jš­¾ã™Ú,á–ð;­$zMUù®’Ö…´Mn§™áóÖF£ä´F:@)³¬Â'`ù'9úøZ"˜”Ø@Ú!K°¶æùÍí6[ɽ¿Ï&ð}’¦Äþ¶-¨‰À¢¨æ;“Dß¾¹…]X¯1ÉdIÙ׊Ex2öèšî|›ýʵ[•æÃûðoPzôà ,Üæ£›>qZ¨ö§hÛ"ËÖD#GE9.¢1ÎK3D¥„< †íªL©„n²~›H‘‘Gi—ޱ+¿´‹Îv’·'΃3:‘å…Ãuì ão¬ÌdÇü$Is×J]^30¸á{1”V‘ý’‚Vhè9jí±T¿dŽjBœˆ¡_Y yd^4Q+?BE’B)îo2‡ï‹j£¡©4öOiR©•ݨJØäÿæ{çUzõ luU¸,Å ˜ I4uÑ&$úå+‘è,í¼‰!¡`ºÌãy‰=ÈÆ3\¦åfQIM‹ƒO^+KŒ4Ó5šüy3<·>?Iw\Åç؊ËÃÕ?Qe6ɰJÓÝÅZh³2ËI”YSÞA™ÉÔJ™LQ—bbQÊ´ž-çó¬òr©Ÿ‚Tÿ^‰ó0i«Kd-œIôó—ÿ®ì[æ†L-_åí:)Ê[=êb³JÆoÀLvõ–œ¿S>/A4ã{e§Rƒ¥Ù[žcWÀÓã¼c®e™ä>)¬¬¡îhÎZã¶9yà IŽ‘»É§ƒ;Ñ –¹à0í´:–Òqâ1ÏR ê¡Ï«ŠÝžìk—É$:³ ÿwyáIÉT/î†B08ã[†)&qþpvXUÚž”uŸCèÊõ¼xȯl  ,@;Ÿ™Ê¿Ô]ÒŠöëVÔû”MÅ„UˆiKôŽÍá©È»‘ÖˆöYq‡D»ãœÏƒ<3µÔ·¬jè\àÞ ;E¿¬2,½2•FH†øf`-ÓCóh—¬æ*ÞS¶DuTØ@ÙªOnUuiâqDtL4 <‚¹FM°§õïòUÝsŠãZØ—È~s^©È ebNQ ¥†º<±÷k3h³Y2™=QDÇÀšqO¶8˜3áJÞî²(åÝødZòé^m¶ð.ÝÀu®¾•ú& RJât„ “¤¿ô7¥å™J…Ã!&Å8^YÁ?[D¬3º¨O—~…˜îmPþ¶)2Ì#&Ãox9Ù]’C4Þq²½®òq%ˆÇl¬j4%aíï¾åVh¤~óGâŽLâ h¡¹n¯…‰Gh”%Ì—“b¶0dùv©—h,OdWPÆš,ˆÒ­žÆ9ãâ{ ˜„ýºdóެámYÏ’NøÔ’ùÞÂu0³ë@Èvë)ø*°ïoá+meÊ$?íW>ûëÊG|DµoHñÝj* ÝvΨG\fOÓš&(§o‹Ùú Ä”®?–Ÿú—hà>M}(Î7±n~Ðf|…ùSiþ‰úãõÏþ¹™mhá¯UØ׎ºÖ±²ë7ä”cP^…oGŽ%¥fÆwQèœôidÇU+iUâ–œ*qàM7'v˜†$(¡uï¡íu /mT„<ñÛjÌ©~¨ås€ÍMË» ¡*¤› €€ÕÞ®ppŠž”CiŽ@)”›D$·ìt½Öô]GvŒÝÌц’÷]–LY|ˆ2aØÃž»€Pí©Ë(®ÎH¡Þdöco$…X7Ü#äYÀ]M4Ê[fT¶gqäÞxy²ß‘µ@ëjG ꕇƒ]l[ f•ŠB6ðç‹~6e{UHëÆs{RH7d_ê!ï Ç L½û_ýáÆÅzÅ[n…ç¬x[T0Fü’;¼ §‹à¶(åCÃ}8/:R$®÷'›ˆNYtO3q¤ïEšÜ<ó8 ±$˜…ã>¨®æ®½úpŵ՟6Y}ÜžȦ8–gý‚ÆCÕYŒÔ’Ò4EtŽÒ=ˆ¼éî­È£ü ž ® ê`Ãû 3ªÚ‚ߌuÈŒ²Ëß?.?üå7Æ|·é endstream endobj 156 0 obj <> stream xÚ­É®$9ñÎW·,M=ã%¼ šHpà6¢#ñ8°J-h¤91Ã×ã%Â;YYÝ­î§W•ǾÙïöãMÝdú§n^§ÿòö·O·ß~¸ýê÷*=aÀÝ>ü3½SRÄôùïÚì=}‰q{7ʽ§ß7é·z7Vßu~2}¶é'ý†nœÝêÂy„J+= tÂ&ÿ¦õ©MÐÎàJU÷̸-,W©Š|…råûýÏþØŠ·ÌˆŒÈ•ŽÂ˜ÂÕ»‘úþ¦ÙgZåóÊLЛÂeæÖt2‡¸®Ðs×>Sáˆ+¾ÖM¡$JL£h ƒmaa?³+óØê·L˜Çß$ì ‘×¨D òoU …J¨Ò÷QA’$3¢ü“7wê®]zç}ƒÂ·)·ŽÈ¬äd°j€–ÇJ×#tÕØ[QQ65#¬E¥t%fؘE ó€´üé¹wUs…¯¼GàÖçϬÏÒ+¡ì‰À B$k„4mv±7á"‚í3u_qq58õÖÑ Ùè°5}#Þ2miB¾çr©ò¼5Yw!6በñ”P,9?Õ ïu ï-vPl¿ *º‘Ü ––RÛ°˜pÔ”ÛÌ-ê5Û¥oÙ˜@wÃâÎáÉ9ª^g½B¹/‹ u³•>ša”j&7F1ÿä±ÙO±93€ÐW¼ƒ¢¬Y±ìŸÅf£c³(l*+"$Vƒ°’¹yNGî<³Ý]¼lVTµÉt¶ºDw©ó'uâÊÞ53)È3a¢ˆFŽ”ä Aúœkéw…öéJÜÈÔ>Eèo$un`S8ñ,œÓ³!²ææ–æ6„pf,ç&çŽ;¾}– P?µ PŽÕÚ{!¹Æ;, Ùm´fÊÙ)PÔwÑÙÒâã$Üð¾$Q`„öHÊ£‰Û“‡’ÝÆEU‚–ÂÛQ—« Jž+ #‹Äd™M‚²‡ùŠçJ h;Ü«ø‹4É^zì½vò³‚ë°Îq¬ÎA–d#Ùs-ÖúŽÐÙ'Ý~϶{Ønªød¹[ø¨,ñ0VhÑX/1Ù=É‚–h}zcñÒÔVß»ŽG ]³«©e›cÉÜw›0¬¨«ÂÈ$ ïZªÚyVª¯m÷,@ï2•Jó…\ÏR5d:/–¥Yã]—(+sN8Ë=¬„YÓÓEÒ@u§ÔûõK¼e/YÙ «NZ‰Å’¬§7å)"æµDFÞƒ©ŸVŸd¦d »€ÅƒÕØd´"yV^ogôh rØr\ë[©Ýuâ)È4‹Öq{/baÂOaÂïÂÄû=kXž²wX}Hr:nc«8ÓúXjÖð 0©Ò*Çè1ôÆ…º—꯼+Vë¾Õu©0]ĸ­z­Š+ÒÔñ,w¬Tè¸pÆÏQ²÷'Êö¼¾¢°ÝkŽ}ÝN+ÉA1³­·êú«².Ö•8Ç({Vù%§øÜ¢ÎQ©Cm^4 =Sä¼Ã2„mäãÊB¶êEUKß²[ྕ¿íM)³ʄĀP5Z‘$¥T ­ õ׊s;æCÉç-²õªªz%®m…ÒÛ<(NÌ~Ū°õdÇ ¨@U4 1ëš9g¶V¹·4‡*·šÍµP¾ŠõÊÔL:;™ÅPîS{ëà`¾äÝ£!a“£ûÐèw’åÖ"Ž‹ª+ýrÁym–T@÷³¤UDÎêŸX@kÛݱ܃Ú ¤Ô?‚X­s˜úQ³8®Ø„Í•ˆ±’‡$ÆÆˆq-p)oJ˜-d*ÿ+o„ž ¬aYAU²Ô޸ѣ;Oð=šÍZ\¶ccIpEŠ>Ј´|'4ùi<úðJ§mÅÁn„:Ã͸Ү6N ?žš8–*Õñ Ïø¾2Þœšóùbƒ8p÷b]¥K$³¦¢ÓýâIæªßï‚°ÎmDU½µS4…Vv>…Ķˆ$WüGu£ç‰(´ó€£0¾y:œ}"¼×÷Ù4ø™D ´üÜ‹š4ƒåµœcI¿”&fšICËØÌ öžŸ!¿¥¬¬yW¥¼P!¥¸”šc!ÿ7?œá­Ž@Îw+D)Ñ[…]bˆQPÿ¶Ù’(\DˆoW8Œßçr|!),Qª9CŸ0ìÔF#©Ç°K‚G5àiiDÔ_ÝXàõFêµ0®pÈ·µdí«Éæ@RíA>iäÜI#× Pye$’«PÓ«Ð!ë:ã/aËÎ%í\lû©Øæ™c,ŠKõgÔ¶/ÔŸVÕ§«?R˜vC“¯DîÞS¨UQÇ?–†×‡ÿ[é=ä’ü§ó6?„›Ñ×½òUíVû8áT²ùy½•÷“«ŽÃNßM=„ýaOˆË®š|);}ùxàòiI |2ŽÄt<6KåM #š0p‰ùåÒMné*KŸ>þ§6Ù^‹ ¾š3š£x’šzçrïrDß7KQ¥ODëUí«> ¯!ŠøÕ¤GÒH±É'ûSQ_£ë¯S#—*ÓŸWªÍ`öB˜ÕC˜U1÷õ¬=³6S9qTAv@±ÜVæ²k=¸-YáÝŒhðXùÍÈ¢‰Ýo–Lzaºôs—(5´Ág/E3WBªÏ:ÌpÛþÔÔ­Úë˜>õó’k=ă8á-"/‹\9VogWÀÎ’ÌŠO•åT`™^³žU¥zÁ@ª7\h3`D›&M– ¡û.:.rJø©kPWL Ï©]Ÿ—tà#ƒÐqà3×mž¤J“ì:I¬CX̶帓 ÎQMú $¯ÌßZ™Ü61ë9ÜêÁjášCÔm Šèè"¾ªo„&OÄ’Ò½ ¤aHóÉæÊ¥”ó®@µ™T–„Ims+¡-¡ ÆÃªñ´ L z7»8‰Æ·_x: ­¹vÎ&ìdü0m8q¤Yz]6\|²pñ8Œ qœ¿ì~üµlÊO'bÙØò(ôýž]6ÔeÐSp?þÂ7—í¥ O/¤ºL¿VãÀa)–26‰¬RÖhì3zr:€:¸ Ö™o8/KçÔì |ˆšƒ:®¨q̳¡çÙµ n}4‚ߘ]ÒĪ5d_¹§[%+ŸH¬âüâÓ:ˆ×f²…ë0åÓ½ ~¸Ý΀ ôbË™ \ ±C‚| %AvM~N†´yq;«'ƒ¼®ºaã‚…veÀ©Ïèa)„\®xc:n?Ü»O|+ùóu:ÄÂ6Édy9`ü0èàB%Bä˜vÛ™„®GS%C±ƒÊéÞ]MºÕj8j§Ú“ƒk¥-IÖˆÉGšB|^ñF›­mÉ+N ÏR~ §4ñÂ}ŸºYJ¦gÔé<–“álRnO.4åPãÛ‚T/»­2ºw9Ÿã²‘Û†é3ž©W³ÁæS®úŠrJvÏo‘Å:´oüt¢]Ì‘g¦P1©—s•v!×rÏ›Bó4W™æšÚÝÁEëvE%uÂó¹9…GËÃc6¦î L!å.âÉaPHuóÑIñép£´m@­n·²JPG–ñŒv{ä“ü]7y¥ê‚§¡‚1È.Ÿø¡(=.(©œŽðìÜ&ÂKÇ´¹ŒåØfj8æ kûàõh»õ›!ûÄ47Ѽpå¹´õñì.P—ÊQ½ï×ÿç±³~÷áöãM˜nÿÍ:qÊ {ûtSÁ M_ÿ}ûãíûú7/Z&>àP(U/NƒˆãÀ§Wѹ:ª)€ hâŸr¨eaœÜû Æ\ÝÑ'  >îw1BQ<~£¿§‘OOöè/bÔ“ì®d7·ºAØé?rºh:õù3ª3¨¥Úæi»fÛÚtu@ž.æÁέÿµc ©º Ûlsþe‰'ä¢TÈ:µù¸Âã ùiÅfˆŽ¥!ŽÄ Ï|³Ø& £§Ä1RjSd1v1lq£·ß-¥1ž9r#¢Ý#ŸŽÞ?šÉévekÚ, /3㹸 m7†rÝi4x¿¿ÞP¡»7gðfêwœÂ8ŸU”mJÇéæ;8ʹfÓ|Þ%ùD&¿5ÕvzêGªYhR6:äåë¯ßfFt94 ¤a ¤q ¤ãªgˆÊ:ÿ‹ZFërf–ÿ®.T¡‚¢Hüý/þd ׿ endstream endobj 159 0 obj <> stream xÚ½¹Ž,·1÷WLØÌP$‹W[V`VàÀ€à—yøI6 Ø Yö×›GYd³Ù}0tìÌv‘,Ö}õÞ~¹©›Œÿ¨›×ñ_yûáçÛ·Ÿn_}·Þ”«\oŸþ?Ówûôã_–7°î ¼“ñgüÏÚø_üé|ünÛw«îOüò¶X¡ÞîoR»ôQ¿Ýñ÷àî¦ãO_v3Æ]œN!CÒkðw×.~7ñg‚Èð*­Áý\‚­«\9!=͸á)6ÞÃãŽ>ÝÉVÜ/g·Ê'j¼§Óˆ6wvHûgllN†­÷Qñ‰òÏû_?ý1„µHhÓ‘¤lšˆlåý™ °öíþÀ·ôɦ›ëB§tªCº¤»Ñm#ºÈ x‡r­·åé¶Þ¤ò tFù«ï´c¢¢uÖÇ‹¤ü!”fOŸÿŸsY[(|Ü$,óÓV±rp·ùs¢­ô,]´^Á!Ú¶§#³K¥óã‰ùÏ·L0™ŠªP™xN’¡Óýž¼°0°Ö0™Dy!é%ù$=ËxH{ “/™å\f])ûÙòÓ’† òÒ‘J¦;¶œî ^Ñ÷²‚nWöD=•Lþ|Õa¼YaMÚƒhPotAs3†¶Þh‡Jb¦dÔb°¡iñ‘Î ‚•’obùÍ‚ÓÌjnã„ ©å0!™ÉgW2—Œi3ò¡¼bj ò ¯™£æC¦Àøj ðœÊ’t¶‡b6Ÿ¢‡q[¾6oZ‘.ªWµ0Ž+[;”í]Ž?hy¢‹^u¥ ÿÆMQlXNÌÃE¨·õ6Lô–ØTVìé-Cë?Wd¦j²u‡´³Làȃ›Þ 3-azg ÙÔ„Ó6ß /ÚÊêÍò^û¾ûí.22ÊŠÕD„BEä; ±Å-ÜÑÿÄ– ±ñÙé÷ë ñÝBgøÉnaLU„I±UÉ´Vc‰n¥œœ +'cšý¨Ïõèä|ëP%‰Àãàmói[—<Œ[GÿZ~C²áå™ßsÕÌÕˆy–¦'\ãûȀѥ²G7õTÅ|±oÊLfÈ©ç`ÄɈA'+"-·÷þÈ«<êñÜÂï‘É0nLÕíK¹9cÕIDŠxNf C É¿<`UYŸ=Ï`ç9k Ô,’Cy†õ`@ÜŽa+T;½O–rͼÆLš¹ªNó¨^1Q"ÊhØ *Ý6¨DhÇCNM¡Óí µ½ h˜ .ßÈKQ¬låÀ‹+ Ú^jZÜÓ£;à€Q zY; ¢vµàáW‚07/VŸž;¡SÄ-Üš!¾%`{¤ à›Ù!‘kš’‘ÿL”ø E(;èWiÌvÕ¸PÙ^*FëïÝÖõÆÍN4Ùh²4©yKF2I´Í’èçNÐWçž6Ë‚œ‘OÛ ü!‹ cÑŸ¦,R‰B'\RiÃþ˜K^aÇ%náõ®ñÆMÒ/ ã< ã%5\czI¸Æ™ÈÕí$u ðKËZÉ×ÊÁ"O#œ´Z•XŒ¶­5±¬Þµê;•i[õùnó=œ0ªqûwïádhÖw[Jõ‡¥T¹°Ú—µR¥×•©k)ª}¦ŽJáâÉ€ü4¹4¥yò¶<•…ìIK,µvë–œ)PÔSU½‰”rF÷ )™:V ÒHÉnû(Ý+{+ÏÉK™+œ8¯uPÂfûpçÕJfþ•Œ×<êY·žÄ4h±MRXÆÚB«½" øÝ"Ì“a!öû5-ÎÈÚà’Ôà èÀB°N¨,­»’654îW 1@5žjÆŠõÊ-ÞãÎÇéQŠªOw ™ ªBšz‰yŠô( ÷ZøuËïK‹<V#`á\sœú5qó*î ÃõŠ;Bentq^­Owñ”KL±-÷/™ÓçYåQ±í‹¤rË…* ¼§â5XäýÔ`x4Â’?’·M4æb$R "‘ A^! X :¾ +e<Îah€E¥ð­.©f.S¹n„­ÁŽÖÓ )-Ÿ†šhs™&Ë3ÚTÓÁFg¤¨#ÕW>ê¯&~?|PYCÕy4؆«µw¬Ô ¬¡—•?>÷4Å‘ÐSËûâ0EÖ³ÝwgmXl¢ÂÛÖ'_†è¹s1º“ãwÖTz»~ZSqð5vX‚víøCáRgep+¿DÈÊk/Jèn;ÉÊe^î¬ñSÍ.ªG#EdçKÑîh}Øé¾us% ûøÌìT,Í*.ÕíL> {>ûèõñì£cogÌëäñÓõÍù ”í"¦¿N| ¬Õ0ÄÏu¬—Š'ݯñl­+TÈGË1Jï^ðaCN¹#‡‘EÉ øs¶Úš×r.Ãû“ܾ¥÷PavÕO‡©Ñnoüï×{~ñÇü¦'¼0ZÌ’ºy­ #ŠÆD²ßaéßüu…M{±ª¾ŸËŒ¾Dc·d“—êä“Ë©}¹øÖL>×Ϋ8ñ‰“o'Mû1õ%²Ý~LÙórô %cñ7²}W{ö¢k¤íú¡ª?¬:Íö|¬ÖXÚ~fx©-t/µ5©±÷“™p=-¥ä’ýáÓí—›€¸üß)žsÒçn?ßTŒtýþ¯ÛŸoß—7ÁµŒW[Sr•G“â±N©4'ÕåR>>[ãÂ<Ìa@E]I}vjìîiþS´^Æz̽ե“QVä{s\GFWñ¬6 R¼NÞ±+ûœeÍô¥*öƒ£C ‰Ñ^ñ 5—l¬ýºé…t¼·ƒ¡¤•,šv®*©1 Tõí1lÇ”±töÖÿÑ0I a’”n¬$Ì,Iv8raRÁzQbÍå8“‹ÇʰâHñù«ýw‚2AýèÔKIýd4«‘Û_ïBàÞã‹N]ûI…áfcf¹PE}ÓVQôRݳŸ¤™ ݴδùïßoµr Ø6o[Ëb xþ÷†¼«Æ:0ŸR+É~ Ŭ|¤V0©ë™ ŠOP•îÈð*hêf–ç¡ÚÍ…áÖ«ºbÝí×OÿrÀØ&×þ•V‚üõWÝ*Cû€½2H`)9C/ ³2vyÔ¼=ÇâL•ŠTvåÉšY(€ãRÌ]Ñ«éÅóµd­ºÉD£^øC4zÖ;Ðüç%B,@Ñ©}ÿ›ÿû²Œ endstream endobj 162 0 obj <> stream xÚÕ\K¯,7Þó+†ÝqÆñÛÝ!,r%²`„tH6I@ŠPØÝðë±]—»Ý9}BÉIfºý(—ËU_=<·ÝÌMçÌ-Ùü¯¾ýðóíÓçÛWßÍ7£Õ¬çÛç¿ßLP³¿=ʃxûüã_îoΦ7í› ñÍyóæ’{yØyÎo¢{±±üß@‹¨s‹üBþÓð,ùÒzºÃS_þ<Œ½`­CùÓØãþÃÛËËÃi}‡‡õÓýÇ·—W"€‡,e2}jC`¿:Ù‹Me’ˆ¤EîqZ‡"ú×7ÜÞòó 7Xr‚‘è{¡*øGkXH¥0Ýã察ÿYŽœw*ä|m[Ï»°¤Ÿúgmb¢-‚…뼇y³Š3¶øz4®SÚáû˜uáHjlð*å5ØY¹ÚðÛ/C £šˆÂß 9•?Ñ®|ûËÆsXn¬ÝÀï‡#LAMæÃX’¶Xâ+¥3+kkË/c9ñˆ#øþXÎ6Mwe«w¼¾Èigß3·ë"]¿È©›É&>k6 wEœG=š«êxÿÛ—‡Ï¦ù—á¹NÊú6—ßšËvs™)~¤LÌÌ.‰j>Lùxfeó@–=iÒ픩©¦Ó!º@k€=ÐdvöBó[Ö„á2Œ_Ì´öݨ`ö^ùã¯úÍ=SXL¿3b$x/QI¥ ðh-9"¯üÿ‚Î$ü©‹Ž4,áµb‘—ˆ/h1[¨G>—t†‚a*4°¡Ž€†iþ1²Í?Ê ynÚ3-ÈDLiáž@i0¦#€•¥7"ª¡‘H>*k:L!P¶äÙ«²: Y𨮊Y-Ø[i`‡Ø|Øa7PB”†Ðñq„€Þ ¿xg&· ¿€ñA;y”{øD͈<ºx¥íB9Y•*€u4ØŒ #0Qk©WLÚ×øÕ‡Îû¢Â ‚íÉn„ò@)¢v­l3Dß,C X®7NO/õg~˜îq”„ßÎþþŒá+NÖøg¼7´ ßÈ쎈fFºLš(ä§É#i" “?å.ÌAšÊH슭IXuÓæ¬•[ë‘5 ºØžc{8w&lX°\µ!>z5ÏkTÈŒ³àÁEöà¢\?zß^ÿd¤ÙâŽf#ägÓYþù!ÿ¬%t¦Ÿ õ(¸ŒH-­L3/ˆ*Â<Á?ªÊ.µ8¯‹$;Å{¯P)l00ŽÜØ›ÒBÕŒ8áw¢2Óâd?il¼¶çŒÍki[}‰  …Ûí¦Öê9aèÐgš•IGè3ìž6'NÛ§Ñ$}Ní¸µ¸VÅÓ™ðöÓRÖAüFÈ¾Š‡%ŽŒ<|#¬7ò˜ÝsÞ‡·Nî ],§'ˆA6qÒÆø–Ù¾¿b§œXqñc¢'¢DŠ'á§‘®‘#xBžöx˜c.ú)¼ýJdxA¸$QŸ4'¢õ¹ ˜CjIÊ.u-;USÌeGW`éÝfϼˆöÒ“Ïn—X¼xwŒ * %…¨W®Å\Ÿ°…[èB“°o†[«¼_‰ç>DëØÕc˜H›U¾/@)phÞ8÷Ù@Ȩƒ]ÿeœ0-˜}ÉËÞ×séPυѦô£8ß6eœp±m1;:yÇ‚ÏÊÎÍ‚SHÊî@Ô™•²’‹#¨äéôâ˜.LWt¬ äÇ¿åG×6ïñ[QhÞ§$¦ƒIxû±0 h2ÒïC®‹CÕ•ÖîÐ36ãÜx,Ò»býBLÆ 3ŽŠŽ9ubžÐÏÓššöð.*—Jx©ZçG0²$TQѺ‹T ã«Iˆ¨¾0DS>Í÷‰_Kj+ƒÕqôèrbË "ôì¤ZI˦mÕÓS¶u·â„&…`WjñŽ ŠKôÄ™¨­HO°(Á‡Y¯ÎŠ¥aÞ[ó[!Ê2vç=ÃÜÚïì íå¡v¡êOA,š56{¦7²’Ôdä\޵4°)a%^ ]·ø³!‘v#Ǽ싳–Ü2͆ifó*, „Ejt›Œ2n]3B^´™˜’<Ø.‘rZ©Ô|÷&"ô$£L.×xul滵òî¨rÛ *› sã&ߜͼ÷†ƒ…PŸmÞ\Ë©_é›ûvdÓÉvãôÂÒŽÒÛæô »<²5·#!‹Ê¼ð,¦‘†ö]|çaµ.5N½ð­t›§õèOÀ³5 ºá«…ÏŽ§ìà”œ#º?%]ƒÕ¢lêóCn3?´‹\ÝŽ‡®m| *®Ê(ú2Ô‹5’A·–õã‘“ŠÁ8Hù¹¤û$ÐßEÿå1ÎÃ|<#@žÂzG³ºZÿö¿nêc%FÄJ¶ê¬šì9-TáÄF–{…1”‹Õ›8ö»wËL“2ׂšs©PzÇv}€žì±~´UìÜBÚ²$c3úT Ü¢;öÖ¡Ô9vÊ· 19³¡8—J´ÝJôÕq–‘—¾Ðv™#ÙL)Vu½J:û!‰Cs>qh‰C,pÀªnQá`µ À •¾¯ÃòÔs©ˆ¨o`z=…Í× 2êÛÁ!ÛG<±…9i³H²‘ùõ¢@…æÝ¨íO]m?êlc”R~E#hšÁ,K›ûôÊ“o•Œxaù·jì7¡€“:gвB”<{x µÚ*Ýãü7 ²dy6]ÉñÅZXÈ6p‡…[:>]¸•²:\Ý–Ž$Õ?®Û’™ø.\­Ó3u[ۋ߬Û2iV:\2n“òIX†[LZ—²«1íúJ÷öyAÛ/k{%¾vIx3ûâm­L‡48‹ðøÈ¶ÅÝef—"j¡»^jcG&ê^zæI§{om¸®(ÇÖLg« ¤'d×W•¨òÂdIEmyYÑr:×'ú¥|:”„hï'Js¢¹”3y·È }Dâ¤Ø_HóâÆ Á?´ kˆ×B“6\õþWÉ ÐØv{žÔ#$m•v¿<ê‘WDÀ‹à¾tÃ"s¬å«dGŠ#¬/oQn2º¢¥ž À„pÄ}:¥¡ER%tß6¢åìABÒæ æ]‘1´<8 Ž«o×ú*›sÈ6àÌ®@y#$#"«%Äý°ýRÿe$3¹KyázQTÚæçê_¢•þ JÂo»Èƒ"Ng d餯ûøžÕDÆÖÛò·SÒ…ÓZzÝ¿—ÈÚÁiØö•&éb(–3ëÝ·E$.üù(ãÎÖ\Ê {“”™/B¸èŽóÂ5{W?|´j*™‘㩌„ƒ!u–XHÛBzêÆ~é1J¶1¯¹ä0Ê©ÐÒr2|W±iHï:{N¸†U‘Á(ÊÅ’?Ö"éøêt:¼€ºÕ¬Û¿ª¹Ú*ApæéTâúƬ¤ÙoDb£?4¥Ÿ6àËGRêêÏ"8é5kzrº˜mî’ÊÂ}B‰§²¶‘ÛD?»°c¡PžG–Ú6´ºŠmtՠѦΣË|Õ8B;ßo„5XúQ.û仟ÁÝ“a$?‰;ǰ?À‚]¦)—ÉõÉ| 3þ9kh+5?øÜæá;¼±ÿÎYRY79}‘þøLÚˆNxomt Sj‰Í{äéä5r£·î‘[¸±È?-p¦¾"Ëu GqÓ‚H¡Ø]bó éÐßña°Ÿ¢ ¯éjØI| %ð4WÈ4Çv‘ÏoŠ—®n¸ò›þjá¢=U‘fÜÅl íNr2c-ú£ŸÊQŸòjßx_â£þÑ81éAM7ÿ_Ô»R½L_ïÚ«N£Ž‚ÿé¬3Ÿc­¹Qíj|©\E{‰¼^Ù³áe¤ø(¼ì´Y–[¶Î‡Žè8Ya;>ðîƒÖ"d~PjÏ ©üVÎÕ²Š^R?ÕÆ ÝÜ~f2Q6†e6ò=´˜v‚*ÐŽ‚=ÒƒJ ZøÏ£ Ž®!¢óò<„(“ü±š2Ù‹ÿ#=µ+‘° ÛÿY°‘4Z•.æ›ôóù¦xæ’&»ªEXîrYËŒa×r5,Ñ’júBMa”ß©š`<¸¿ÿ|ûÓ¯þ?¯L) endstream endobj 167 0 obj <> stream xÚÝ[I%9¾ó+’Û{R¥ñngÃH0¸èÅ…e¤4ÒœX~=ŽÍK¦ó-ÕL£™®z/ÓiÇòÅa×òýb]þ3K²å½üñÓòý¢Ü–—¿/Æy•¶eÍAi¿|ZœsÊùþ×å7Ë7Ë×—ŸüÊÙeS[tËÇogË  ƒ>þéw—õúû¿^~ù± ¶Î/ë¶°OøEŸI£‘åJŠ(©ŒpmÄš´ÊiYW&㨟ã¨2 uÖ‹ñÉ‹éM22®Ì ~¶‹¤‚Td° ªbµÇ5kìb´Úô†º°VÅòª¬ ]XåmQÞ–!IeR†æA6vƒ¶ ºÒ8àÏ"¥ÕZ Å÷ÿ!÷ý’Pß.QY‹K¤›¿ðˆ­`µS.Áo6öê¬~u¡ü‹F]WçÌ%(údËMcË wµéÊÀX~§ò;Àçµüpô4\ðpÑðçr-%Xñ †‘‘ž*#&ë4¹h"ñJ§úLÊ‹&^/3]zýg©ý$åA•Ê–Š@òz¨ÛƒEè% o¯E-h%WÆXÖ¿×EKÖ‰‚i ” : f6}Up¢mül ÂOErõïfR¢òf©C~6u\£‚áéɳڪ!Ð9|û³Óð:À7¢½fwyåZ¾-<& ð>yødø±$Î "dœ8X WñÅW›á)Ï£ÁÅ ]k.6¬+FåÜÞ…F`Þu‘HaôõÜKm^êê"Ï1»·’;µÒWÓ€)V²<×ß” wA¼™F¼TEƒ‰äJ b´òÏÏ&¼ é³`*CðÖ`Bp Š üš‰Ó…q¦9F˜»AV¨µxæQãTì¼ÒŽëFvx–œç_¯JnêЂ¹ ô‘¼µøñ±Œ Ê»ÿ(üoÊ<¯×˜Ö+¸MÜ'©êÚAC<…†˜öЀ"Q€€‰”³ˆàù7ÿK®Sõ˜²3å{ª2èi\j`Ÿ—«HÃjZª9Ø-ʼnݜ~Àn £àÙI!áOüþ0¦ú~| VP¨.Czbz‘`À4’ƒ`l@tל&£“±u$O½.Ã6œ‡‘#Dv—hû7Ýs•8w›T| ÜF³|ßU6ò{#x””XKjòº™¤‘¹^Y¢(ïOŽÊ‡§s—(ž‚lî Øã•«MP·_rNðË´±0ÑâYâu^.×x4㇚Z­!¿¯Å!Mº ©bÜÍronVùj Ú˜xËwGeÆog¦ @¸Jv$“P”/N„œ0Þpð¾Gòxžðî9“àÝO§´+(¾d!a Â>ÌD8¥E€1SÚ½úP0³8—ÍJ fz.bÈg¦¶D|ïšal¸™NƒÚ–˜³€¢6‘ÛS¼D(Ó*+Œ7Í j¹2}¥Ud$–vî¤6³!býz}™¢ŸNÊ™/¿KÍg:­S%ꘌ¼¥¸µHÿn·¬b!Ñ\dÃÛˬEé«Åç݆è;$Æ)t\ í:ÖÙL:+vSvvI|É×Îé¸f{_ÿa P!+èØMš'ÿSwH÷Ý!‰;”\“NÐ;CP~Ƹ«ÝÀ• HÀtêà±êQ>îo¾/”ýXÌòW¨(øŽpž‡ÔVVÕƒQx´þĬÙÇ]My'kQëé’24ÓÞ}Iö ~¸f°§fx°c¼Uå^jú>™ÔÞɤ›Òl]§+ ôŽk3BÏDŸÆuD_z[#ÝÂ-úÜs?Z¦¤÷sqÍsªXé¥^)š©¦Ù•£Ñ}˜E!6Àâ àÛƒMš»l2|‰l2ý3qàOÃAµI>}÷7 TLeßaº9Ï-(µIÂFn ý”_Ì1/<n˜iÕÀiãO áSmEGùÝÔáoÃDI¥Úéèl-6u%,ü¢Áé\‹ê!›ªÅžÐ^×Èl´µ£4!}Nù*­Ò™´#¿ö¨wš¨èš7êê% úBXS§ë‚:7’1Y½ÕÈFj/_­ôXf4”1í¸ôh¡ÒЭ©ùü.×é.gåwuz{5°+`Àyr¥ØÈåg,¹Ž€“ºKc³™š ,ÍQ?5Q?µ\ÍMi,å‘ö&=w–HUú‰$ý…¶’Ô•k®ù½4GNË9Œ j¥éQé:5²šC5¶ëÑ`àȦH€fŽû¶*>|mÿPú¬µ^œ¯O<ÑKcùƒ\=Ó7¶uë Ö¥ 0Ç™a£I÷žóÞP㮎œ­?Ý\ÝîØæQ}x¯…2^q w »WÝF=MkÙVbÃôÊ{s™x™4 R7-2©¯fÄY¨C«¨Ö%‘B€œ¦ùRçÔÍ®Ó:£Þm]ãO2@­ã9Më{ÀLÉYß^RL¸uQ6 mô—fhQ;ŒïÎvV(èn »Yýl{ £M ­Uz¹  ·×Úw®ëaïl£Þ®‹MÙŒ÷¦cÛ)«+Äor -—8¥û¶¯ø.+öP·è´#c¼éZVˆô~¡Æq+Oöo¨U‹“‡ð ·G¤Y&û.üC U@;¬ÆN9=ÃÞäM‹ÔáN}Ô靖gÒYQl tûâ[xYumc…õj¡eÍ’¾ºÝ ¼+ ˆŽjZϬwGIÁÕNÉv–1äa§6uÏãsžº¯ôœò—lTA3Žè”‘wÒLo€*úH2§!ÅlmË`Š!\žÛÕAWTÖQ‹4vÄŸF«Œ¾K]lök¢Šö¿ˆqÀê×Ì ®éB<á¶µíŠë¾{¼i,óK¡³ÝYê¾0î=û!™Ëߨ»‹ýÞÝ@‡h“ÆÆÂà9¦u‰}s¦ W{OÿÇdfõ ~W­˜±ïá•O­ò«áu úRCllã %‰÷pèýi[Õ®d)&p°â·L6ˆA‹‹–íUT|Wa5zÞ3b{iæÙASï3‘eš¬IxÆooËytîYòèü„<òu V“ü[›#ôÜþ¼A{öxÆæEnµAõ±0NdW—á‡í‹ÒípªSÅXSœÔÏ2jžêËÉ9™p¬KmÝàœ˜“¯ÎÌ5¦ÌÒCÑJ#³„€ßMRògîÛûº“r%¡M•å´MeUþà ]{ꑳS¤AËghG‚mùCøæ½È*&ßê²ÐÕ\µ)gG‚PH‚jGžaÅD>QÑŸØð õ†S\Þø]»®L˜Ó°¡êÍÒix [oäS8¥•›BBiâgFÜMÜ´ŠDH"…9ÆüØíÙoÐqklgSv0kô¦ß^õ·áZN0Û¤ìŽcš‡›(à]éÙ´‰OÜL›$óÆÎPºÜ-8EÊI;7è—:l…Ètœ?æ'ò )C½;†…³/"LN؉®miHÐ:Ë?Q Ûÿ N›Ý®6E²¿Ñí³œÇéÃ:fúÚ¯já¿ðXbÓ<ZžKjÀJ=q¦—c˜óà·0sóíâR;÷aIo›eiJŒŒ<ìµ³½ 'Ç-•4õ½º5ßÓÍýNÁu„Ð:¶M¡/ B×v&ÑçIª€³ tPZ«tÉ ºAоa^šÞ1Lòð·M%@¢ Pb~ZL.V¿w×cua0Èõå÷ Q²i$T þèNŒmÉàYö¼l±}˜hÊ:sOS4¤;8͙δ·e«R# ÷(bl&އvu”½Ì.·Gï%ÜnÍÆ!];…ÈY÷%!] ó«±}[#vò¡][ õY}B°:¦Ûˆé1j_ÍÙÊöï÷…}÷îRª. ›÷k‚óCÞ¾á/¦#Ö‚Óµ³àípÔ®Ì:®xÌÇžY‘x>,½|t¿Øºæí…tÔº~;ÙÄ­¹w *ºØît¹æn(MÚî[㵬•7Émþ6îCÔíÍÃm¦©™ÐÍFnf#ÍÒJ”ãq‰µzL÷WØt;mºûƒ ÔRkîz×½Ñï{-û D庀$íõ#…1ËK»Ã3á£Õ4uÜ8.ei¦JÓ{Aåo~ôoY endstream endobj 170 0 obj <> stream xÚÝK&7ñίèãŒ2íøQ¶»Ã²HÉq‰27† \ÈrˆXþ=®*—]ÝŸý=v ÐîÌ÷M»\®÷˽ü²¸Å–nɾü·Ë–_ömùç☼/ë…åÃB0ÞÉß?/?,ß/x]¾þ.øe7{ ËëOKð( Ðëßþü´>ÿåõË·¯ 1l|Y÷ñ}¿í gƒÇ߈2Ê4qyYñc# ?P0û®v¶‡ÛèáÈüI8 ²qA=cI䂱Hbw¶.b_8E..E¬8=!â7k-á&B úqZÓ½ÀML—_þøøëïÊgÍnwdeuŒßMbVƒ%ҟʧC!fVë?Fx ™\$½¥Š@?_ba³,hòM `i0¿^bIÆÃ-,ÙKóñn,»–Œ÷Þl¡|Zwbðö-Äò“œy^CpOÑxúæËbˆe1¼ÀO¨Ÿå'ùgŸË:àFËÏð{θӖ•Œ+žW ÎPˆŸ¦À+¡S B@òúô\©C­­4Ÿòö4Ô<ŠÒ^txð”ç2m‡1´¼†¸›\(!1¹ªÈ,2@á[zÊ(´"B¢ˆ-£s¥g•Å"J O$ÛWD5¨Xú±jÝ×µØR°žîú·j¹Ñ*Ï˹ªqƶ“T*7ŽW‘+†\+bWøÐÑ Ch- ,‰>ALì‹q6r8ŽØ¢Õ`b¬¢ŸÑ@Â&q±¿ Z…†,‰Ç°e窤å•[9vš&}fó(álGßL âºþyC/ÂíI‹wnäÏ«O$‡Ês¶gŠ$Uä*C¾”§û¹b+–‰¹F¡¤Dޞ߬OôŠoè½5Æ %d…5€Á“Š(®R ºTƒ™pgLKÎ/ ie”PÔpFÌs\`¬"tm¾z_&Ñ{ùFxÄ«Ùå‚/»j Q ùägŸž*¤X‚aj»Ü„m¢ßwõÆv¸Î TñËcu.rƒHyªŠì«-zØc*ˆSÃh;};ÛvUΪ̫±ž#sMT®#ÿlÎÒrSQmÌø#Ù-í@5ú¸=ƒ˜„%>A`“ÞmÏ/8žœñbâÎk7²ÕU}‰üè»ä[•FVÒ«­7&Iž…\7NÔ£ùíJ®C’9JŽ÷l–É E~ [QJ&ƒÐj`ÉéVèÉñI²VõÛƒHŒ§Ã'\ Též@ÅXN*é@Õι•W™ÃÏÍ«,PñŸBã&˜™;%± ¤:†Dyz¯„7 „ h½4‡M™C'EÌ!ÜÌD|t®¹ü1–7äD,wÉ,Áåõz 5 ¥ž…ö·ç—‘ˆ[î“è’òÓ)Y@:ÊŒT]녥ƕºuHíÐ\7ú¤ G—Ù¤tüû°*=ñÕúõV£°z³q•„½ñä̦=úD¦ˆ«l{ÎÕOŽ›TîH5wŒ¢% -Ŷã§8l4RÖgIP†`ëZ!uù7V%JꞸ¶ôŸQ—‰(j…úÉ¢p›CšYÿº”E4!>$ #8ââ jöì»§¹Fã¸3-mèóêèv.×L­ÙÅ|ÚÉuNƒÐኞ]7yÚ©µ•¹?–ŽFë,ðЯ¨Íû:…ÃLÄrýÑ”.¦K®áðjîYó ãmN­=zéå1x7(šù)xAzN¥üt–J;‰w&ꃤ[%žSÇÙ¬¾Ž¬ü•Фr@zëEE£k“(i¼h¼µÛCC^#›]%ð(ûÊ£,©€Mu?Pžn®Zu˜Ïñj±,K€ýÑqÚ(1„s¤ºU?Œm¿*•º—o1gë#Ô'_½v4×.VÛAOªÄ¢7 ÊCª5_%é2‰´€•uÝ~8øv‡;JV“ª|Òå:|O¢¨'X Kÿ{o¬>o­í>7|ýÊ·Wc6‘Vé+ùµš÷ò$`¿ŠOÞ5‰î²íh,ÇlR^¼¼Aó£¼bÕ¸“}ù·‹7zºÊ)ŠzÊ~6å3´\ú…¼N)ÖÔ…©Q´2‰–¹]”sÃp ®ÓýùRžÚ¨¥¿=½ô'­`xiä¨.QW’¹ŒLè–”œQVôˆ[¦íÚË„§N‹ûôø4¨ªo#Rc°íj3WmZßA F"ɶ‰ ´É‡~%å0ýpê" ηF—jþÊì»ïÕÓÙ|˜Îö+®þÂÒð¾}ÃÂÀþ'«Äæ”áx)µMœRÁ²9žØünl»å™Dlª¢oºîöÉ õ‚SŠç_¨õªŠÂkîM`ð]S älƒ5’~ûº|ÿ›®iR endstream endobj 173 0 obj <> stream xÚµ\K$· ¾çWtnÝØiYêå6r`2¹ÄA#v€ 8ùõÑ‹¥’ªª§g`/f¶Š%Q_úHíå?qáá?q±2üÏ/?þrùîËå«ïýEp湿|ùçEhæárÌåË?þz}U¾*mÂýªløÝÈü»6/·»"|lâžèø„‡Ÿñ¼*Ðå#ž)ÓßUp°ú¥Äߌ(ô‚|“ƪ´-Py&àdÛϨEù⪙Я·W.MúݼÞp ËŒ¸\ÀñoÒ\óø3Îãskë(6?È'¿I[¤~ÿÛ—?Áù*¦u‘¯ ÌI,XU„ÊË[Õoús]øÊî4RÛ'÷0Ê"f„µ8ueHÆuó … ñ‰§ç0Ž‚Ú‹£šO­ëèy+º3Y½W]œF^It-Ô¡¼³T‘r¥ÔI‚—àV’»6K ¨úZö"æe$‡„M‘.+0tXqm‰CÝÞšT ŒûVgÈyÐL–a L¢cœ‡ºY¬ëÝž nϪ@f1áÄ“íTñOqË–}è.ÙÖó¨níÉÏ …7YªüêTZ e!ó˜ ÒòL‘ˆ]U2zA[¼ +^"ѵØkçQe3o´®¸ãÊf½¨-œ®|zŽ0 _†Ÿ‡TÉ,’»4ʘJ›ïÕí4—Ú3Í(q¦,ÛÿEP( —”G&¹qηŒÜ™ò—»‹É÷’‘°œKÐ)ùÂ.ù4ãfLÈNàŸçèfï½H¾½ÔÝÍç¾>ÚƒŽ½¦‘c¯ÚU ¬BJyaJÁm3ß.YoÙÔ(-©AY3…3%WÌûzˆµÅU,U¶-¾¥Peú´P¡byã>ÚRÙÇg%˜÷£îâ–faK¿‹ØºŠÚÝ¥µ 4dë?nÌ"Z´tc-½Q†Ÿ÷JuÛê2D‡†_flfÚk³ÝåÃG²ò)¬:F‹Õª…VMŒ³[ö§\³Ø.zâ#z6\ïdã<ƬyÔž÷ò b…1[ñüæ³a9<ô¥ßnµ#®P>¬gç!ÒO4UŒaG–ˆ¹ÜE̵gÞm{äj{@DìŸ@æ?Ï”ÌT‡ŽEpTøm6„ou½1P(¿N…â|S“ç…¢VB ÉYLUšPpG£mJâ#ȺÕBvSÄU3@ý9dÀÞÎ\…îæØUôìèsì mgž—;œ/ßÔ³=¬Ô@]!ÁÅ6©Úh°ð aÅQ«t!\†ô`8L̹?:» ‰m‰ÝT`.’`‚²‚ê[s]êª?}ˆhKxß]0\¦JqO”¤ Àª$At K|ø‰‘{@ÃË, ˜€¶?2rÜÔæ!HIL¶Õ,¶•0™†<^Å”ƒ~úH@ôg0âѧ þ—iJ”J»Ùè±=Ë^c!6xÌ5Ö2£sß=cæÇ Ëݡ’£ÆÒ’7IzŸ®ª#K~H(pœ/ÍøŒHü±H\gà`׆#…&¨ME¡”,øBp-—(áT½4¾Æ°Zœ8éQ¬{^]À®Vb;¸2>qÏ[*÷Œ]òt„,¦×RLeŠÊºß 2é›÷$õÍ%89º`£ZO™5¥ÔÇÓ2‡U«ê¸nËâRZm…ºÎ‡±ËÔŠ%CEß |Ø8µ×רvqSÑŠ:iÀhsX¤ Ðëê‹0Dªb‹µ£~ÊÍIÌ=á$Ü`îv…¹[‚¹çI»f—ôd·A&M½€hh¼ vÕ,žt±6”2YÊ?‘C­þJ¤Ö´ìÏ”´ï(Õ†ºB¢QO@ºEÿ˸g\À*Ó6ñìû™¯ïNP$8,â¡o!ó3Í}Fˆ>#ì½²ý´ë¥Æ‡û·T³¡wtLö”g\v‰$hR‹lUŽže™ì³à\ID”+‚œvµdý„Æ›!DÑJe… \¯”gËݨ‘Ròç42$‹Æ=ÜÃé—-œ/u;uÉBQ jfèÊkJ:ÑÚgº;Œ¹”ò­n0Ë–ò>ó»cźÀäÙ'Yèó’ðÕWRA#aæ-éK+Gív¾cœœÔîwÛ ö«£}PKzká´};vŽÎŠïÒúçÚž¸}ºÏ¨yðt¦ë{¬t¯4/|¯TZ÷`SJÉ´Ý3…±R*7(e5¦R;²} H¢OÈ\p÷A0Ïcº“Ð2ØÕóØÇ;AùxÞ^ù™ˆ§y3ÜIbU{º¦iIïjtýMõo}>5ö~–,L0%Æk2%‚‹­Rõ ÇAO}=b7§'Š; ´´”¡þÒvéõG l[É_Õî¬Ú¬0­l>B@a©k+á,Ÿ<@ xÕõu«½²¤ñ«Œ‰l¶ßt‹&Gïmœ‚„¬ZÄšBŸ§,ºí) Ýî±€Rú“MÅ´;ð•™â_‰\L7Ó+FÀNŽ{2œì¯ !² uNĹs‡3†´HÒ`&ó™ò[ĆÞE;­ÖHI®ô,oÁqoÉû»y_‡t—JòùvÆÌÆŠÄ‘Áþ'z ߬´´vz%ª#-í›Í:ÉApãð!EQD§œJPÙd÷ÍJçà©Óªýã-]å¬RnºæäR‚w«[8y7§·pˆÃÓƒ¨â©¶}˜l&6õ»@i”3ØôôR7¹ƒ÷ÖþbßmÂÞå‡Úq™W¾“5¤Ø[È…NËÜ;uïʽ󮊅䊭ÞξÇÁû<#9ùÒôÊΙ3MØ•k÷Û¿Ä„LLõ6e°lª|öÜ\$ÓÔc[…0yJ˜]aóf{…m“;iu{(Hõ)³&^ý‹eÜY7;îæÃÜìA„Ò}„‚¡Ì©¥ŸŒPœ9ÿ\„R—©¥¬"ÔAÙàø)Ìï‘.c’bR¹ÞȸìéEy„¢­)·N8_Ư|<_ÓMd5ŽåRRìE­B÷dÔâü|E• ¤:sóNz?“ÅR¯8+ÆKBg¯ õ°iõ]¯š‰šû®¹tü…§¸6¾µÏ¿Õ„‚‰>˜_YÆ Æ (ÿöMþ C.qléGªW6ÓÛ•ñªRk Ç¥ ŽÑcƵA6õ?~¹üåwÿÆI} endstream endobj 176 0 obj <> stream xÚÕ\K$9¾ó+êX-ºŒßv2 ‡•àÀ in4'ÐJËãÀ þ=ްÃg9Ó™U]Ò¬fZ]YéG8ñÅÃá¾üû¢.2ýS— Óyùë¿.?|»üê÷Ê\”‹\.ß~Lïoðà/ßþöçëÇõí/ßþM4kb…¶©4ø'½·— –oÐ>!ü‚-~ |’ t¼Ô&o÷£à0ŠÅ&?FñªKmòuDªR©9­!b‹” ! “¤ÆÉ·›^,| ƺãeþílù]~lú>„U~Ž8ø?j*UN›à2w~yOöM$ÞD¡Ô&ÕéSb®N²«a¦|ÂÓ³Wo:â{X–¹ÒáGå%Ø‹†–ei>ý(b.^–±ïÞÂ7Þ¼9ü 3{¯tz”!w$®1ŸßëØ¡|íé«éS .0Ÿ%Ú‘FsæÞH™«½mÌ YvSƊįô[8WåÛÅÒÝHu3ÄH}@*J둬š(¢Y‰…ÙŠ)åH0Ì2—Œ¸dÜïàˆ8“ôŒéC*{?·I„AcM¯±‘â„r—Ú„¯Áô$&µ”¯F 0E 7XÏÒl9ˆ YV@ H¬Í²âõ›öWÆìN¡§$öYÚV’å‹ÊÊ">ß¡„Áx–””zZÖ{ .ꉺ éëtP fÄe¯6¯—´Å7Êmžß41£–@}0ÔâœÖðÔra’¹%-®4øïHnµùD{e¶íULZÆæJ‹¸K)ΑôwK»“a¹Ôˆî…Á„•¸õ:‹jÙ&ªýÆâÆÈl#Œá²­HÏÖö˜EX’È·íd›í¹H,Ö>ˆèîåä•“çT2#fZ¤lbŠâ]Æ®bŽô½CóåZdL‘& ·À*€ÏGNw{Ü’Úä·C˜Ó"¸£0÷Ÿ¡8¸— .*#Llk©¼L˜õµî„u¢ryÃR¨´:ç?™ÕÉø3ÑyïæJк«õ6pµâ¶d–&ïŸ*vÈ£­@-4‹Î‹bZHÖÃK‚€SM½¢ÐâO…ö~7´Û¡½œMª+*4Ü}ĺ˜¼Áð:üÎýýxømBá9dœee’¸I¼!Ã&OÇß1óJí^üV;‹¿Cø^±£¿Ö“ãom¿±ç0þÖîʬ²É!Žå‹0îÅàÚÎcpšã@Ä[N-Gžu;òFü‹FX}þ¶Cñ$ÜÑ?^ùó™cý”Ï0˜ÍAßÀ¨`ܘ½`<÷£`ܯ‚ñ8ÆËL;Áxž±Æ÷cîÂÌY@`¤)•€Ñ§ÈÁ •7ʼn4¸R(Z¾Yâîµ,cf5Ø}÷>÷ž¸÷y”-÷>3"°€éÏ;´«F9 Ðl\òïW†± ™8l©‹5S·U†›¥N,ìºÒ´w¦ì4L¹¾`Ê$ »:¹ÈýwL£Íh•ZZšÉ|4D$Ͼ¯{ék“È!á¸gÒDeÌ;Éì✊F$¬2œVèK„™?¨Ej@o|Y´§=¯âVZ\!oýñö!µÇÏ>áš«ŸÝ ~ò0*pªæ½×¯Ø±GYveB\ï†\/f*ù¼kÀl(þ¬Ò²€†²nÄ{¯×=ã^Üíiµ¦L’˜«Uc´¶o¢Žâ›(eŽç¹Ja]³`ÁRÿ1ÛXRjVÚTjÆá¡øƒ €£z褓 X˜AØòSÂÊO¹ƒÈ*t²R„ÛÔ‘ TlÐÍS ¶Ù\:æ(2æPÿ;š rºFD~ ¥%§hf½ªà,rÇzù¶Ê! Œ%|€VOÌOÝ‘~ 8;Åð›Jë‘«C˾.nÔ¢ 7ÒßRxÿòôPd„¼½Ó>ÿûH1o·­.8¢´o Žº—{¦ÊVÇö‚±†–¤ŽÅÑéFf÷u9½Ð|Ò>oÚŸ5ÜõW¦¥®Cv7‚¨¾gÓñv´QõÅÅ# NTçI-Û¤²“ç»äÖœ„(s ä±Ð4æO£|³Y€ôžqüÛJÍA̺G–  ÏWì8‰iÁ%9˜ÅÜ9UXg£ôf6êËÛMy?Káyuì#Š££”誱&Ø{€+ãÓJâ×)³ü,câ)é|¯öfrÀI­ý¸Àl•˜ö”“û ~‚ÛØYåW«íd ©îÁînHXmHàÉ^ÍÔŽŽœ´Þ½u1U´àOxwà${ vø(TÉã U57Ì÷º5º2ü@ÀFK(§…ôŠñ,®KÓç9(MO®¦Ã5]b¨oLm™k¿*z^£|59÷æøSê$¼ˆ)j‰>÷#š‚¹Ù)ç~“[Éô m/tm¦}·¤î øÂyQc%ïÊ`Úüó1ù%§ÒêÀ©´zöTÚ° nÉ%¬\&g5UæDù¥g²¶F~òy¯·¼Ùq‘^_Þð}ð¤i\!üºÒ¹îÄ•Nš¨âYÛÙaÓãÕÕÛs™­¹;ݵŸÂ»yuuôl9“:b£b ài™œ¦†]ŠU¥ ‹ò—v¨ù˜–G¨Ùïµ¼L;ÕéLœâdŽ<LÕä§åØzè2-PWò€ ®JE^*:˜èf½…r.†n¯»ì à~»ì0Nz.€óÏ\Ç9Bˆbtd0ê@MN0}J¥žoÔ—¡obéLY *up6=j¹Yg†Þè*ÔVìνÀ£g‹ª“*2éúÍÝÜë/Ž<_Q½”P¯AÛTAJÉi=¸fAå£ùíÎöÔåF;P”XôËïØè•*8­ÀaY€âKقчán©7¸ö„avúÀµ'lñJoGGz¦†É1U]8aɨ¾+áÉŠø¨XE< ™Õ˼%a³†êys¿Y=on¿yJÏëxßÇy‘x_SúÙÆITò$·4y*¶Vììp+ß5H®ÕráL•[™ª¾¨iŸ_Î…++¥ì'X)fWðõgpõ'ЍÏ*»¹ï`—87XvY¦Ëé—ëF²kÝXâsUÈW|![æªp™+Ö\™O4Wü¾×޹²Ÿ"Ãq.Ãñ)s )7½‹·¸§ì•}úâærg°ä)VÕ`)yÄ`)¹£¨íïÆ ¯¾½ô@ên¾’iÙnY %^ß•á²íêÂq‡iuú¤ØÕá¯o7 '7ãÓ¬ø'iãü¬ë°bÿ}°ÿv}/UGÃï¥æG¸—:¶õ><¥²É æ>æÁÛ€§þÄF4‡ òqù¶»aiYÑP¾Kiž¬vË£ì_د[í fˆâõýâ;Jõ„ôÅfA”gG¹÷ã™"ÝÝ6˜ÞD4z'KÔçÿ÷L”ã‹ä5ÆÂÔZ\;D‚ì¥V{¼øÖáÍŽ ëEa^ïkû“eBí¶Ï^™æšµœ” ùq™+Ò­´ÉKA+óŠS¿_”šaUÐû]µŠeWy¨Tû²KÃ!¼—ô¾àkïZY¢ß+8Ç·‹]-:ôÓ¢C?-:ôƒ¢Ã÷Yå ò=¯ïÌ=‚Ü£–pm–ÏWjû[”tŸL¹f5åõH»´¬—Wçra§¦(_¹œ–>.g—×37J—ZÀ˜ ÷ÍZlƒUZ”SfGáoEF4ªTCÖxVW`Ï+>Hõ'ÿH_”ÒiÈRʃ—hÊx;5Æ:PÐ׿^]•ù6Š®òÛG*rÏém $ÈZ—!éäÁ¥{óÀk›/<ÿîÛåO¿ø?ƒÆ… endstream endobj 179 0 obj <> stream xÚí\K$9¾ó+òX¥é2~†íYv+ÁÒŠ¾ms€!»‡9 àßã°~dÙ™YUݳ#„vV•égD8¾xe.Ÿ±ððŸX¬ ÿøòúóòýóòëß Xgžûåù¯‹0Ìëå‚7`yþôãéE)þ¢4þ¯ÎeÌIü™ÿôüûÐÓ7µbÆ„áS._”U/ ì‹2¡/ˆðWåk|¦óB6cÇ< Á…Ì®”¥&'Á„|9‡U):HÈWJ‡´ ³É4›ð—ãSyJwÊÓ°&+òºLé«6¸ë³„SÚEìaRK#°%Ç–"ӦݧÉ{74£Éýçqt3^m= ˆt–Y"ë¿©…^,óŸ“È->¶ø~@2ˤ]J b]Çô‹šqr̨Û5‡“øË횉Â%ÃöAÁÓF#YxºSE࢜Ý`H$sl1aè€`$ òôJ-TÓÂ1ëòóoÃø60ü4©6|½¦¼ÆiåClñÑT†áˆÔ$Hê5ýÓ•|Fž%n·gM"% !ý%¹!2hYÈù©JunQÉÇSYîdÓð'lâNY€!SX^âŠ/-ÂfãOK%Žà2°Oä!ñzJ;ç!ö ¸}¸cûÒb/›å ²ÜÆž¦’ Í1'¶py‘ 6÷ÍòÎAdÉ/‘Úçተ—¤â1ÒIŸØiżð“aáØœ?FR“úmÎa¤rQŸC%´€ÜÔjOR=[%5œ -`v.¢B¹U#u³…\UIå\t§+¢c“¿ õš_JƒiÂUE¥ )Ýz…ÌÔÚª:×oF[ gƒ«L£Aâ–RƒŸ®—¡˜„w#Ûj”v3ß©Ölf¼V3(?Õ|O(OúD§™¨kúûù`Èt8R<>À{øµ–úÙ|Š£ªã_HMÑœÏ4î¡ó™&A“¯h¯n‡#k—½’L6DÄö¬×Ï2ª]-¡@„ø 7%•=ÕmjÈÖ¥§¨'Í»9v,’Üz¤l”g†´Ír UdÃ0«ƒš,£œókù¹0å—‹cBLåÇ2킜…‰²üÔet•C2yèªG²9bíŸ{嫬–Ë}•MÁØ3³‘WÉ¢‘æÆíEÉ”i%dˬ°se(g–Òd|‚EeÒë“â$;Lâ»â ‡¾É†Oªá6ø2¨‘ve¾„ïà+˜Ôs³Îícå©aµ^€ Ô|X8_j ¾4Ô¹Æð%œœÁ5øç»£¾Ú‚/mêfÆÂ6›k=_¢ƒ¯lgøRÎgUÑÞïá+µ™ÁWêw|¥qÁùNe1›ðå™ôÂWë|9Ïf câM`L> cί`,¥1Ž}¸Äì Ää.ˆ©bò.“ÄTbòí@ÌŠ_Äõ(öá…0`Z€° z„+.Z‚\´vs äÃ.˜ÝUÆfÄ\R“[íÌš¯Ç5ÚÀ—‰¢6]#åö׺洛sú…K½7ÓmØï¦[jçR³¹öX´©_‹¶àßîz¯¶x¯Q-ï5ýýý•÷ªô–÷ûóA "ä« — öAS\ò,&­ˆâؼ¶Ž×tФßÐÂ9dÀ­:u“uM3ü¥üAÉ܈¿©´ ±Á_Uð×>„¿28KʈJ߀¼1bÉGÉÀQy‹Ž:˜MZnÂcð½p¯’­¡‡y ­ê6¶B–›Ûð=^†#1÷ùŒ8Œ—ÏÆíMÚëï£d *¦Òâ)»©Õ­°¤W ‡nEl3u+âÓ»Ü »©‘ u+eÑ=Ír·Ë<’÷ˇ rf回þ‘5«A3ßy=ïÑ N©’ÕÚÜðø}_·äj%è™EYQÙKƒkXÐZ˜˜í´gÊù!hj½£mµ6o¤ƳÒŠjYÙßcµèkt¼nSV¿ÕH¢×Z5¦ #õ¬¢ž÷zÂÍá¹(î˜+à¿ûðDe÷ÎÞàÜ…‹Ýóà+cßë8¬’ØÓàY²HÌé @_`Uk%iK¿îRÆqÆÊ8eä/ÁT‚•Ï*t2Í¢ °Þ»S5gH& ;b©ð>OBà”VgƒâÜæ›« ©šØRg“¯ éiÑ$Ø%^–zcRù{ÚŠGu-[Õy‡ª5žrÜ,'lƒüèµÅÍs:<'¤Û´xœMRš¢dêq¥2†êTMdÀãn­bÔD´Û‹wz[†²uI¨™ÒÝÛJ H)KTSêæB‰A0œê$ª*l”*n#ª¬|~’ØWê·\ÇPaÚ(¿æd”²Mzç-Ë1C~“‚ͧy¤`ÈÃÍ>ò_K±‘ÌëãÐø1žùViÜPä"î„ÛÈ.4¼¢úŠ7m×ö¦ÚV£tiR¿sÆ~3$ŠR˜,ykª|÷Å©²…Ïåk÷SGTr÷ ²Ø'Kq6Db\w%«º8ÁOâuRW3w÷–CúšÇú4oÚZHˆ‘_j!½Üª…ô¢5²¾Q528cMc7¶††ÆI_ÓÓŽB3ÖÝõ‘J*tàöó¹®sí}ç¢"ÄV]¯ljr‡JLgP¤w¨²ó®äF‘[£®î,rËq¹­¿cš¸ Á[3ç¶Ê%-³PË%cqÛ8Æbj”ÿN­Ð{ìÃrÉ& Í™•QwD%æ¿ä,4›žÌB(RÞ[X”Æ=Ô1‚ûµþtM?ƒ"¼]ædêZS5 éÎ-ç¾ÚQjtî³<ëHÙ6J 9JìQâžfóóO¨Êâæ®Ì칉…i<ùXQIá»Â‡«J 0êÝ£.gÓfœ“ÿZ ÿêuEm AB=V= £›ÅUJÈï…bïšµ› A1ŠÎ€¾®—FœªÓÔó¹ !nD;ŒmæÉ¯¤>ë#ï ád¹`0x•°)ðþ0µü!0ÚV0~ÜÃ#0Þ²[úÄa?òãÞ >£ ÇóA(/1¡Õ¡©q$Ç,vibEƒ°Ziæå\¦šGRW2RµlBLuêi©•³;2é±nÕªV·Ð§W=Ý9ǺºÒâÄ¥^ì%ºŠ±Ôà€l5AÅ/ºÙAñŠ{ xÅ׎½°I?O¼ÅõIŽœÕ(¬ÎKVÞ¿À“^½Hz/K¿熣ã)è‘ÒsGµÕÖGª–s뿤ÒL®ÏÿaœÏC7ÐC¸µEô[nM×Uå-ÛšxPß¿Jï§•˜YbX|fש9•šÁ §t4*í¼ 5¯y¥îõ9N=@õ;Bð-ÈMjTû‰ãC‘ǚ8>žÊ òìd8+)UÆaôä{8oznüU'™‚úçó0ô§l÷âË¿Ó^Ûðg¦lb¬¦{ DZhäkÍK~m&úØë—'qmŒüR±sÒ©éOº­&ë'ýËë®åb{/OÝ 6þÕ¨÷]¦%qˆ71¤Æ,*oúzºú5îZöÆ[3ü»ÿ3üí>êÆó/Ìx7eüÐã}(q7äÿ¿Äüu™Í\µ·9a-z5ß× ð))` æÛQf²Ö%Ëdæ€ë•´¼(™ã×dŠëiõÚÿªô$¸¹p0¼‘ZÛãe-ÔÚt¿tC£âjÏÌkkÉÏYñ(­š·+šÖ“V9»®"á}ÙtsiyUl@VøUF ë“áVû •$0ê*rDƒx¼€©Y"† [éý¢¹uÔjó…ÅÄû¯pAízfä°˜ÏøaE9{0³x%gkvP¡Oð!Ú@WüuWÙ“?üå„8É©¶;4P¿ü˜có¤((——{.壾¾ê¡V *úPŽ~¯FÅ·êTýšÎ¦¶ð”Lš›H]D2ÕV»SÖ)¾êÐÌ>Ì\­cOåáh^8Ð3 £Ì$ìCÆN5L^FO¼î(Fô”p¯8žE³<ÑÜz”ZÞäõïÁ˪õME=ªËøs¬Âû O³AW1­cÆÛ‹.œCƒ$_‰šë"ËÇ{J^|]Á'ʉóÖ:i2ß}n¼sk'ÙC;|Ç„?ö(H<ž·~9eþ¡‹l"Ic™íM$¾®6v%ÅT˜‘ž©%3ÐÎYdLîµU¦`ʜ砶"b®Ëhj‹»¾½akxm`ÇfÎ6ÒÌ2*1MÙø]£è•N ™Fš§vq ‹6ÕTç[ŽåM"“äá·ÏËç% º[þ…a}Np”~^0õ"Ë?.?¤/²IäÊ£LåÏU…6ÓaÎX| y^AÆÑaFõjšV®wk$Ø*:4ÆRëÒ²ï1“Ÿú¥=ù¹*¯ˆ½¦²ãºï*Yz ÚºÑaX­\áÍWßÜà«oI·PëýÏM¹ýjœ ¾™äúÏíu/Öè½ô²;``§Q;NiN]Õz /¡Xë@÷õãéx:raòÊ:VÌþä( ]¤Œ’{íè0ýð«ÿE$Oî endstream endobj 182 0 obj <> stream xÚíÉŽì¶ñž¯èc<¢Éâ*ÇöÁ@rÈ!@€wóä8`8ž’|}¸U±(QKO·ç{0ó¤U,Ö¾èòËE]düO]<Äÿå凟/ß}¸|ùGå.JŠYΗÿ¸(+fs™Òwùð÷ï¯/ZËmÒ~š4ÀU‹§¿~øS|pfÏi/ÀÇÕË#ʽhë_´KÙøcÊo«ãO¼æàE{S—QÀÖq à:aüÅ‹Ù'+â“Îd Ÿü×åE0Š+¹§ f{­[Q‡øc]ÁÉ»‚“8ºüïí4,0÷åwD(Ük†¨äòª>iËuïùš^W,*´EÈ„‘¢um¥Ÿªx×·gÜ;h[±HÐ…êS&ˤtƦßÂÚz<Ö0ÔÚ2•Ôšë,ëut`F€©ÿÁû†Ë¥»é°æ ñçÑ;‚þB /OëU ®¢3È/ƒB… A$GfÕêZiU7lÛ°IpSרÂå“/ïÂâÒ ê‘ÅW™^a%þeÚ5WN™†½¶@dÄta¸‘Q°énDŠ´`ZÄ=¿yBÎIX›&¯JèF@~L Œ>'XzO°‚˜gNh»#êÒn êI ¦´!¤†)ke12Y¸¬¹–u Uâ3q7H4Iz&½0ËI9ÈrãÊáAT'&,˜Ÿd5®R¡··À%8>1 l˜“|­ k¶ûã}¥fT½Vuä*錄å3â›™¬`NûeȦ Øë¶ö0U+Õµ:í±Vz À mS›ZÂîj Í´Äw£—ødnÑ'È\xÇŠdú3WdL"ó"…²^¨TΔQt"z¡É•]þ‚hÔ4Ñ"ù5'&Ð*œ­|׬Ϡ}(ʦð‚³OŠ äßyuMö6Ýl™C{T[±ÎÏꑹðÊ‘9ªÈ0Tƒž¯„^!=¢^ÉßÞšµiqð-ÐŽËlÁªÜáAå¹`h¹>˜ó¢ÀùÜ·csè}†øiÀ¢YYD<0ùTÛc«áã«O‘Á£™©\Á¸Ù1_Æ÷DÀõ^½qå™üo…ÐLzÔVé•R®‰3 =_¦hÈÕ&qâ_Ñ`Å“<)‰®ÙÐèIáݧÎàq¤¾xF>ÙBH !U=o›b®BMFG{ øyEüvÜx8¤¼ÐèÍ‘ {†ë§ ‡ÏŸvøþ¹&™à²»ª<;|aO•Û*ïV™“?C ß ™Ò$ìáj¤1þeMGÎh¥˜pDµï¸ÉáØ¾ Õöq½™jèê¢wåP+¡}-ÑŽ\è°ª§LýwoŸÒS~×ö>ÓÂ'|Ô$M}ͼðé(¦À®Ôay™”~8übÞRË_ ù¢.Š.–‰î–½ÛÝ(Ý{Q‘ŠÊ¨éh+ã"Ûæ„QÀ7 ‡ëÅ%*̸çž4³eåoñŠNº"]ùš õŒ­¾Z›'Ôá|èXº·ìÕ.߸Rh„)Ô̽uÒ=^Z½¯Ù)Œ•F>ÒC\—î„À ë‰%à‡Ñf<½&šsÛÞòM´¨Þ_e#M`°Q¦}Ú×qG¾‹R`NÞ‚üÌGìñPï°ç èæ>ƒ`“ƒ¾Þp,žgd&e”ŠóÖžµý¬šÉ{ˆ>=ç}{–ó&žœt³½ßK½Ó¿°‰Üwº~ß»Poç]D\Tò.ä|D·…Ç<”a¿-ÃúÑ|&oÿ«‡q(Àz_€ÕÍI••oaYDr|úcßÂ7ß"lëÿÈ4¶¨{¢Þ§þ? ëÌǬ3³Îýº_úáQ~‡~~,µ¿2³†;_ŒœÝ úc7þµçß~f²}#<ÄÁÐïÁÁ€•kË9aÒ&úSXì–¢ë[’©aG2‡ûS ³{d-çW²¶#]uLº¼Ã«Èuhx<ݵ;ü+Àµ6ƒi)Ó±v¬ [´¬T-+î6 óÈóRBë_½~®=YýœÚY|Û}©'·¶¤ tЛí2­ %Ÿ@°­2:ÖPé$vg°6‚ªí•¬Îô¥"|6u â‘;ÖOÅ0qEf•×ë{®èîà´´ Í >èú2›î‘:4ñÜHT-§QÒ²g¨ÌVÇ—˱¶†˜A”CâK‚T•¸¹¡fpÈ• ]:.ÌBµäóR »9qŒIA«Üí`@lw—fë³6i*eoLKë=fdÒs ìy«Ç™Ø»Åꟓûg,(Ó™¹-Ž{»Z‘¢¡ë›TÝjA¥pwЮ¦zl@•кDZêö=Ô!`æqf¬Jñô= `Î2N–"°Lí£5‚Ñ­!ÑÎ}tÙd1”`· eYcCQÖçŽ $Ø#YÖÉmhvi ë=Ôžv ƒÒoÈè©Ëùá²’—Èwd+Ú¯8¬Îüm ó*î!ƒH£ÇÑ䔉d¡…/4°‰‘ÙÃ9›¨Õmm°ñ y·M´þ¡6±Ô.SÑÒ÷#²ŽKP $`Þç™òƒfíšg¨+˜6 e©uu å«:'/Ô¬FŽ&å!yS}†WCKêp#iP|8Š9»˜`t‹.rkÛc¾‰;Wdl ¶éfè-üI…ì`Û °×¿þëäÄIžC':8§ä§W|Xæ´ä}èÍ»‘r¡#ǽŽ2¹ã£€Fº«Ž΂"£œNgÁYÝé^YóGÞ"´†àSFéã(ÿÇæ S[¶zyÊ‚é¹SµoÆçjŠ&™9‰:8¬jë„ö;K‡}º¡3'Ûzj#SïhܱPâ —ãÒNÍvK»ÎYnÓL*[ü&&½éòV¤U×#’ Ì€,Äó,nÏÕKIYõºÉÂ¥ÛpÔ ãa»ÍwÉ13*>leª C'ÃúÚTh'• ë ‰+ e½‹æbܸ¼{'x*θáÙ‰9«Q|-Ep˼Ýt/Z»êåúæôwäu}¤9=ïgÊz+¼ô}õD¤37̃|JÂf— R•ÉÂÎ\)MŒZô2º¹4ÛÂx‘nì׉áA“"×<¯Ÿÿb•.¼‚³nÙTèÍ$Ž(äÝn„‡ý>–Q’_NOÚÕÃI{é“*Þ´o#·v1㋞ûWñ Ì:ç{;³ÎÂÜ9ÁZõá û˜ ÞC†õ †…½<@£·a ë6\Ù)üCCe1ÈÚÍ9•Rh?ÈZ£\›ò%Ã\?Yr?ŸŒé©àÃÍ¢oP©íè8¦¿ažµì¢; L³Ë!æYÝu/Mø Ÿ’}oPƒæY!z*o™ìx\ÑÓ*þIÏŠC-57¹òŠÐJÝsz—#w°Óÿ×XÇ,@¼ÁóÜ–´d7 ¿´Må)ô"Ð9Ën`~#ù†yN‘ƒˆpž‡y„/e,¿zÄYG 4ûêGNgÖšP¡ àþ¡£’i¾½5Ý]k!¹bÒZ+×Ûfyæ#Tiéü*Zu™RªK®RJ]<2+–~/= Ç«øùí†_áÐq£À¨Ðå«°M;È=ùª'tSŸùʯÓ“qÚj'Å¿µáÖ9.D°œl6 ¸-Í@%ã`÷ªïa¯™Õä2Sé<#TÎtäx¡ß­©]G7œYaÙ!ý¶=9LÇíÔÛŽš {SOŽ7w6å€îšr6}Âz Ò}…”G/åZ—€ÜjÁÌwŽ$ ¬Æ»}ܨQ³@í·uËQ쨱ã(Ú5ª}QáÕíê#ôno<ÏÕŒè›ã)ÝQ|aÕ— ¦LY½þh£0F±9ιŽKvÈÖÍÞö/Ñã3õ¦ £¥a§ñ.,ËÂÊü…•ŸõQ”uâ[;ƒÕOoUE´:®Š¬zsó ÷=.!}‡ñÍþ&šú†ƒ]4³° Ü{ ÊLXtˆvÍ]«I¼ªþ6,åË2¾1W;*ãÉ  9"B ÁPxü_m¨üÿ¿³ùWÓ·…¥ÔÛÔcÏ r1²ÈxRs•Ex›#ìâì7žÔõ¶ÛLè@°{CKv/CLP(^.?/úŒ {mmÕ*MJÚdŒû¼o:gëã«•PL¥H<Ø2h9ÑÚáš#p/tkøô ¿Æ Ç#©ÃØ“ªqùƒŠclTíF(Eå+Lùh´Q7–ˆêúªñqNMQˆó)›ŠE”Se_ž^ùoW¾È{¡°1lø}@ËÞÎæÖÚI±•rE©‹j±x¡´â@%à*”ºÌ̶Éñ*ʼné5¹øC”gHï1s¾ñ‡—¿üîÿË}ùÛ endstream endobj 185 0 obj <> stream xÚÝZ9+¹Îý+:”°Í£Xd›,`ΞÌãÀÞ… øE>~½yT‘Å»[š·cÆ{IÍb‘¬ã«ƒ½|YÌ¢Ó?³›þë凟–ïÞ–_þz]ŒV«^—·?-Æ«–{~€ËÛ¿»¼;íßšwç]úÓ×ß¿ý&Í1VL²«2!qÎôÿ&·µ†<ê•÷‹kü´vÌà «Zýrodß^ïâ…—¶˜Vó´Ú-‘y“6‰6mÛ/3>OŸ!}ÚrôuúLÇóù/}¡Z:t¨ó=ÔOpWò¸®¼Ëì$˜Ä%Ó–Õu¢2iÄ„{],OÈŸ•EÙ’fR^>ÛNÏöäÖª—ó¯€5 KOÝŶUR³lµ²l¹ñÒ58âX¦6—Ñ&'Ç/˜Šëè+ý¬==eTïK „¼|=Qa!Ö‹0pN{Iž$¯ºñ<‹7›@ƒ=¹*Ç+”`:ßq¤ñÐJŒXE¶9:e!#¹ËcTøcꢣzlÛƒxÑ2™ö÷uÙn”€tÁ&XæyÖ2s ÏÇc=K¤Š„TuÆ©ÂR™6cÈu„ ¡âEÁ¡¬Õ'e­} ¡n<…=6%•ENTé²fóÑPB®{,Õ:×YlC?‹*š#·@ò¨ÒÁ²³b™úÉ* §UšIå @Cb³²8}ΘSMœ6• ~ÎMŸ0“Y_JµSÖ‡ÕJÿ<[Îå¼±‘¼_'`• Ë$â:ƒÄôÔü%Žũ¡Dg4*üæPÝ0ÀI1ˆ@¶5±{"N‹¢únuPfS?EY©úÖs¥;Ssö(öÄžÂ#>¸:j9gìèR2"»nqrZmžöÞx8i&Ú‹jÔ¾}D\»ˆ'I„s^­¦™ ˜kM»÷¥÷hlØÎâƒM©T—¢§s›èùáNKráT|v‘r}ªÓbÝ'×ÛL›Ñï69ÊÐC“#⦪ªOŽƒ>sã`!S–²•ipãiãR»YQ¥5â¤Rˆ:ok9-@7 jFYÎc!)ð)õ§šû°"ÿֹʆxé‘ç’ãX)9a½ô"ºåÜ-¸1‰tíº„l9›ÍQ‹P„Œ' Š$ܸ&Ž3Q›·-NÐÊ1¸ü¸9£ï‘ìEÎä[F Ü£ˆš™-çQsU:Ž—ª,î""ÒO·¿;õ15(» CT˜€Yw‚RŽÊe´qÏí«[âÕcŒ4m(dižU.„àœ¸xàQÕÍ•x¦ / ´iÛ¿‘ÉrK£g ‡E…bvÓS“¸SåO ¸i•:ßzÒ¤~Œ 4èFσ€÷RîØ»¤„Ö 8®o-¾Ë`\&ʦ`)P³‘ÚZ^Í—Õ•v¿,’µ²_¡©i‰„«%ÍFÑí®]+3GS>ë¨<¯çðÃ/¦+ïS}ØÜ6vsÄY3€;[V<©³Ëêë+±%´ØR§m\]2‹s ;—R•fïRªŽ~ ¯F3Ÿë¥•Í7s,[Ý–YaešOq!7‰ÝªŸ¬F¡\¿Ü ¢€OÞ2È)þCöʱæMßÍ ¹$j$ ÿ—´†Qäï3.QEE¾7ö>ÑÖ» œW™SÜX¾þ ްÔe3©<5/ã ó Zô@4ÍÌÔãÌì6ÉzåX?Ì„ì‰<Ö¹‰bH{jè…U­v¯ýOÝp‡O˜h§;ýºÙÅTåý˜eW8¥•2m)!Ö…P&Ú)(+f/¤oöîZ¦˜”ФþÚMT\ØA0"Èî|¤(d„3½¢ »ˆâLÛáQÜ>¢¬ÊâÒHöe]ÿ l¢ß'ùo¯ìP^Ùíê1ÛÀW©Á=¡†xªxB ájøùk÷ž ª7ÖP«}= ÔÖ‹M%>–À‡q!†—ã‚ÑÅ9ÎãB8“¡Åɲyê–ÄéÞ‡¯%É…c8{Û$†£\8†“Jzx[ Ìõñ‰·—všóVÛ”Þ^Jé–3\`Sä!®®1ÓlÄìE£bݨ×´Òç^âü /´ØL¾±´°³£o^ßNÈBm»¹±´ ec‡ÕÖjŽ,lµ—vU’€þ:e€ö—mf°ÁºŸ\ŠpÜö"gäo¯Ü•¯æ5+Ü('#6À³8ðRÖ\å¥Û·É¥e,ÑÕ îHØetâÄž3Z^ ùaLYƒùüüðÙÄä â *¬g§Éàs–ƯÎuygÏí‚®ß"l—.ÿ—žd~q?óƒ'¤éîtsãA7—ükó^j˶_- —¶ýuÊ!wî_º”'OûÕÛòeQ©^]þ±æ¾Nâæò½÷O‹O‘¸ýüÛòÛåûúrûh4ÉY^û¼ãÿev-©|èzÍï7`œ½· Ú*å}…BÅ%±EÙZ¯ý?þèÓû ›Íã,kŠ_“5éü®ñ¡o^ÖæNÙ endstream endobj 188 0 obj <> stream xÚ…kSÛFð{…?µòŒ¥ètI|3à < tÒ æƒ°ÐD–\IPÈôÇw÷veËÄI';íëö½Ëèï‘…ðOŒâþ‡£År´3ú𻘠¤2£›Àû" R¸ç·Þ\ 9—:œKÍ¥ÒpÂ]ñ·‘ý÷øîæEj”«“Büȱr¢nÅÝØ7aâc_E¡·ÏçaV£Äë¾1Iâ]6õc“-—EõH$õÇDi›Ü®Æ>\m•[‚H½é¢+^Š®°í2õŽ ~Oˆÿ,ëžì2ëŠEVÃYír[2Ãjå”H=‘ú2b`QíPD½||ñÍÙ,t ’¡Ç¦UV¾µE;öÁ-Nq©ZDï<ƒ€º"dVå„–%¡b'µ9:Hï& ÀA@|§D\¯–YÕ2͹ý‡ˆ¾ŒíÕÍ×=„kï¤~ªñ¹(í ø• ×uÕò[ÇÕ"à«Hµ8žñ&œJ†Äü¡´ˆ¤…":Ÿq[yc"tåŠÆÜ1ü­÷v$‹A$YølQWõÒvM±p^Œ<Oèr^;scO:€ôÁçÞÉsùF é¸Xt쑪t>f^¼DaèGBô˜@¡iF”­Ñ0[cCÙ §ËÖ¸ÏÖtùTT6k»¹p1VqìÍ^;[µÝÖ±a’ÕÂv.Ü:L½ó€O]© Iú³*^ðeÛ´˜€)$ À5ÙèE¦¹#vß%é-Ô5ÆEQM»ºÆz£8†“!Üt<¨z¤*ÝGR¢(2—! 2r‰þå#§¡þ¡$&fÐ îÛŠæçµ »6ø=|ŸvP¹i>¨¸û øhó¨{POz1Nsé4g ׂ^X«Â^×|øØœ±xÏÌÃȬ­TL¾ï²$ðg⢶Õ{!˜&¸ÛQ,~OÈVIñ”ƒlÅ‚Øç,ßî­X õrõܹ>ƒ=‰¦åcÝÝÓ’x©gIZ%]®ìKÑÚœ°×ÅrUÚWœÙî©v8缚ž2×™/"c¸r¡«pf†[e¦¶†BÂC!*Ž=X¥ÞgÆ\4 ÄXG¶²MVß~°Ôë‡Ëû€)n”`‡Ú0Ã&lR§Þ°÷¡ˆë·¶³Ëéô=÷à:õ.|¡þšÙçlé—`RèxÿŒ0u³ Öê@1 ÕaƬÎK›±´ýâõž¦4u4Õ)Í’(‹Š(Knß[mLà|¾¸ºžÝ ¿P3PrtÌZÓTmÈ~ r—7Vÿ’ÕÔ!ÄÈÊ=ˆçǬi LñF÷% ºC×––7 $„·%3ž.çQú¡¥)òJŸŸ.é<è÷ ~g;¼(a+¼¸i—4–?¨ç7„¡Iü°,RöÂ!ËØ;ªËü!kî±òMäàSwbÙ®*±LsÙd Tõ¾´DrÝY·!¦žm;–?Z"Ü9­û {·:¹Ãq,hó;C5—}Ü/)l3,)Fø0!z³Ó N·Ì!ÛýÇbJÇ󨱴ÕÞÓ’Û¸ åš`ÆçiVf¾›V³¯à º>Ó’œ»Žˆ×ñB9õ}Ü\ͦ‡N¢|çÄnù×ÝsþFWÅzõšÃV~Ÿ‘–ï}Á… ú¿\°v>ÁÖÖ¯EÕÖhf[Ѭi\T¶^µ•1ô7@ó¢±è¼/7ó©%HO&6Å+Ý ·Ñ½àN…ËÕú©^•iÛ’#°ôÝUƒ¿h¹Oé%˜²)îœýHÿ‰CHØœy§#¤ SœðQh‚þz‚tÂÅÙ´pt³›Ñ¿üÞâko endstream endobj 194 0 obj <> stream xÚÅ[É®\·Ýç+zÙ©Åiá/°- è B$%€ð¤—Näëá8Ý.Þ¡%ð…×/Y,žûôÏ“8ñðŸ8Yþç§÷ŸO/_~÷‚“°L }zõ·“2‚©ÓUæÄéÕ‡×ç%ìƒ2üAéøO…æ"}øÌEñøW‡ÏtþôåÍ«?†IEXX'½JÉ™ Ó*ÎÀ-§5á1•_C|øOç÷Ö^®Ê˜3ŽÀO“ ñ½ÍïÉïÃh@ŸÂ&¼N»º ŒÛ 0á«L\ÂN%Ä76–7^u1êœ×±$°pþó?}ÿC|©Ï\|•6`ê nFæ×V%}t£´Í([-Bk^„'Á™ç> ̓Þ4Ó®7 2¼•aE#ó\&*Câ{Te‘@‡G”çümZÍæOòvòÂþv]‹ëYH‚_,”?‰[Æ›¥»ÅE€ˆõA†¸øLÂ0¦ É+%õ[Tr:±ŒŒpŠÒ"D“Ìâ"Ý9cªI–ž¨ŸhÛ! òÜF^dD`ÜC:^5Â>?íª4yÕ°Ãô7^WÖj»_× ~+T<ùkzŽ ØŠ«×øðW±ˆù¤á¤5?7Ä@¼"u„¶Nèü¯`§DÇ9Î}—üøR=\ž×G%N†¨°µ—ÉEˆKÞØrfÀë$Ze!€P–Šá|8æö€ÒÒéǃ6xÐùIƒ;/óƒìG·ÏÒLÛDZ;K˜æ¿&uóQÑEœ‚{îδPª½|'†¼åNÝ…h#5àòH ª¿%Ò1eÊà\—DHæêpbðp‰ fÖW·ƒm¤«ûM@ÿDþ¶]òží"lqTOèºl©®ªñôHŒsùó‚55ªK//Ìó& ^ˆ@ùR.ΩߖL&,?A®Ê5¶hF-hŸšm¤œ³Rr圭Âá”L<%œ´£¦<ÁæE› œ%­Í<8¦U±+3ôÅÝqWÓàå³:ë(ÑE§‹r Eg‰z¸;ö½ÀÁŽÚ.{{Íô3Œ_P0L›Á|äÛ]6Q榻¢…‚±'Äð†iÀU>—n!†jR’{ ÞOóDlÅ3/»TÉ5¡¼%Ç¥‘@î¶r¥A#–”žy,Rãz¼%¹Á8H+ÏM9žFˆ3r[­VM +Cxäíë$‹]Gv/»¶Å„'áâ®ó3IŒ`—QÈ%Ù‡Åuõ=Â÷>C–òìºÏ@Y’ƒü vð¬ó…V«˜ˆÇ—\s®ÏëÝý[ZÑ,jqÓ /èE¦3‰hÈk£š%ûLQ0¨§.QD2½NTò ñ›MóSÞc~òuâÁ}‹#ÝE¼¸…Ž…)ØõÕb¯ ì!z½v´ ;ÆnÎOtéòš[Nµ™8ÕEöý!>Ñ… y_ûCˆVâ—ß}K äŠcús)^Ñ›è|B~¿; w¹bõ:>\¦Öz+N©H‡ø^oU!ä_·£Y#¢QY”Š1PÜ;–Qr]ÏÖ§îðãÓÏ—«˜ø¼!bÀ³H7¤Šðõ..\´|OÐ#›.Ýßä¶Ís§ØOzË@¬8@Ž Wi˜˜À0£*y{eÏ¿§B LåÄ2šAá`ú(U´äQ>}•£ÜEôý跸ة½ûöý7YEgr&ͬ^N'˼͚–ñ¶2›S6ÔR:j¹ Îþ­j NSíê–^Ö]³û0'”Š®bÎïÄÜå-û˜Öª§OŸZp¨ÅŠÑ輦àQ;æ'€|ú¥wÅø~LŠ.ŽML¡.Î7ÊæHäÑVwN LB¦ÁÉ­HIn÷­14&iýöÅÛüü/Š\L÷J“2¹ÑªÅÐKÙ%l ŒÎi‡ú®lZ Ò9:ù)S[Âb] 2C†¹‚ÑèfœŸ‘(ƒhHU#’ñëgAgAºŸU«¸e;#úl é¿SE†¤æ×ü OÛE˜½¢“ûr wÊ{U d{g*‹ýHŠoI#!¨ÇDP…cà¾`‹*iºáæÀ”½2q«•”%ðÝÉÈ8Z6Œ×Äm©bX(©:7ždu!K}ÃÒÝŒÆ#)>/ÆýÚòEy©™IäqëÁ ×26¼Žx±ó–ÉkŸ‘ž¿NeŠrs>>} ]å#EØ}~æÅÛÿüå1Ü­+p5dQã'€\oºÄH˜kÎ9;$Gèï™éQ+ÛÕxAzd¶¨ñ-õ|¸9åñÆÝ#IÚ¶™×ÔÁ"ªåå/¯-ß¿ &Ë»è?Å?‚®Ú´k˜“±NFÒž‚&ÍŠö_Ov±bÒ"…×4ÚÔçõ²FÒ2Û= –< ûóìׯi”*u5ÿ £´x•\D¾'Lú<ÕÆyª¯wž¤µ ànæŽx^´ÂÛzÈ"º Q*ÐËâì ô’Û^=ýFѯ–G½¸tr !áÍÉÍü:Œl»Œ*ƒ }Ûe†î´[_ÑyœØ-½e·ÄnÃEDšnÕ=¾µÆ¯oÞïÙ¥â$MÊâ¤4¡^M2s˜%h›¤}«¾b’Áó#Içû$ƒçkI/ö'4o1ylÍ ÆŸÆŸaþÖáñ‹³õ]!Éx0 kJ5)r’Fp-ÙÙ¥²N¦lM#$âÖ3ÄÚÃ~É©g¡û\HÜ„ØL*\Qg˜ᮠ‡a i[š//Nä :Ó4•«x¨ƒÚ?€ïK /‚¨”Ští LQG5DÅP žMqaê\G»—4G£”ÖÙ•}ät´-5–aC ­¬”c«çd#} oMäÅ>üýßï>ýµ2íuZÓ•‚3S$“¼—)°! ™»•&L‘»“ö2…aº… ^I±OVlESŠx(ºœmRä„) Ü2Eé »§>Ì0§F Ýî`FÀ‚=›3‘öP„îLyZbN­dpˆ"R·(áYj³ ¯/¥¿´5éu™D²õK(#ϰƒ22/Xó#ÅJb1ûÊM“Zgn(#dñŽ:9Åœ]…ëˆÂnº=Qäg§.yÌ] åz—bV¹0m›õ1á°?a‹×õަˆpQŒ¿u&²n»d˜²Uؤ°²Ïế‚æ‡.‘YIÂí(';ô‘vµí‘²ÆÆ ?º3L—YF JÔaJï`­3nIk‹­YµEF´UH+ð{â¾i(«}\©”³æ¶Hììä°v»Í©ahQõ6­øî¶¼̸XÞ70Ý=Õ¯±SdV›ž”ŸÖ{š°ô¢ÐšÒ» KCOXÖK)´ºÖ€Lë³Iï„òû l¬Hp˜¯jzäý”¯”Üi¯Ûe‘Zíµ¼Ùßl+K¨ÔÚU žKG!åâçÆŽ]£)q“_Ó·x õJ昪ӥÉöæ§FÃáH{%Pwe„í Ÿ|ñ‚mNÚèÀœúEÎMÞÉÚ¤‹r’w‘y×ó#&-(›5á°†_«+‹¾ú°c’íÂ2Þ˜7,îù^Ïñ}—<ßnä¿ ?§!~ MF€®Á°öON`Øõu™áÇ[^¸ia$3ë ZŠhÐòÓþ¬I ˸˜(›±7—jRkѬq}€½U_× ïÌ {ç™÷º›¢Õ&¢»iÜ„¾ímKׯ]Lá }›Vñû4¥oçnÜMÔͽîf~ü¸»é›°¿¨»é[ú}…dj|Òcü9v•ÑGÜÍ4º'*3#ª4²~bºY”ßÓ?.›&¢¼jý&ŸnIAåž·5R' º¦Í/`(#Z#ö}åÇÒüSLVÇuW¾"M}ð<ë9îׯ¢Ú¾­C¾!-c¦X0!k÷ªy„Óºª<Ün»zpº¶N^!hB,ÓÓ¶÷)"sÃÿ‘Ø+^mÈò@üuºXʤró啟ÔáL›m U³:W×÷íËï72”[Á?½øi3Ç¿OH¸†PCeÿ)ô‡W§ó;îÇf endstream endobj 197 0 obj <> stream xÚÍ[Y7~ß_ÑÝö”¬[¥~ˆ‘ÍÃ"kd±~00cãk3ޝM#ȯ_QuT±Žî$À"1¦–’úø‰dþ{þ'ÃÿüðòýáѓÃï”9Î<÷‡'oÂ0¯|`O^]_}üõÅ»×§Á{¼÷ëéÙ“„G|ó„ÑŒÛ0.ßpiOƒâæx£¬ºQFž¤ ¯5ÿ\úkeøkÂwá{§AZ cà[xgáβ"ý3ð¼Ä‘µNOçðœSyYBu;L©¼0q„÷QP¶‚ŽY”û@lÐ2£ó× — Âf¬ËíFóRµegøõš?#&‘†µ˜´ap2“5a„Ƣæ’F­Ê›¤Y+Ò{çªö¼µ ©Áp±?‘‹•̘,rEé~Ð6Œâƒ)LÈrc#72+«ëhÒ:‚Yœë'j ÏÂÛýc,X¸ngPj¬Œ›lœˆÔ Œ…¹ÎÕFçÀ#“c]ÂÃÓ =¯èѺŸäLè‚2óÍÍ :©Õj&ñ üv©éDgº 8hã˜0í9̰™Í™`#¨Ö‰=¾éøªoÞœàø8yLXŽOÛ)D153O«|ÃjäšA1®§ˆ°ðü³°mÀ€ðç>5štÌ 8ûè{Ê„®BÌsjˆ‘i\Ð?¿yº1Cmo;²2USk¾á}#€£;  ÉÊ1„8*làê¬Îž’£†a°<þè+|ùé}ð‘bÇ Ýl£sÒ5ÿaÚn¸Úpµá>ªºt.¸µŽà7hœwù:æ¦mgT ôÈDPêî Rw>g÷ãëÛW“3Z&§mËäì“KÒÈä´]créÛL.„Q‰œ’&rŠÝþ0Ÿ×gꞀ·F§…ÏjœkÍçt…¡ªG  ‘ÓªzTŒ¬t€®\ óâdx£ÕÄôNF´ô¬;ÏÂg’¤qŠàÙE‚7h©˜îbøMKV;=§¥^î ¥vBKÇBKããçÒRÇœÏ+‰ë½#…¯à@2SÇÔ$XOȤÝâ’²Þî¨!:‹3ÆxO¢vA–+T×n>ÚØ&#·IRð´ÃCgŠk‡'ıAå:6µòàvœ VéxQðZ2= — +&ô¤ á˜Äµe×€S`¨ "V’Â#ˆœ¡'sÒ¼Fî;c   a*[”]¾œÙl€$!ã:RÐ-ÞY1E€j kÚ9×Bj–¦pQ©JÉi¡€GØÄ Šp‰g‰b˜ ÖQF J[5õ¥F’»\2b“èn‘K0«“{èu ­·i’õÝö&°ö—DnNóQ4Ž¢û£¯º£‰g‘‡ WQ#þÝ7L47µ piƳƒ€Ž£4húþþ[ O ¯$äŠ&)£^Ô@ýöí¼¨ä-=†0gŒñFeU³œÄ6Ï”X层²4¾e·ÊÉDÊv(Kãöƒ²rl4+ dª,äÛp&™#E2jW‰+D°©4%:Ÿf'C²¦Ýñ6‘Ëñ~t³êÕ1E¦Ÿbj\É•³R@²•+gÃ*b’-©ûøù´ è,QT—”cþ">Crl/š¥¾Ü¾»#‹RЉ¾½HJy¬w“\=ÅO5±ß®9²ŒnŠí4ûò ÎÜßé Ú~ZÝ&)\;ÉÅËò7ð,oaéêE·Ž Ö³.Oe…lÀ®²ÖM015šŸœQ¶v#,ëo—øªÎ.D’è ÁÊÐ!ÔiKx*yÊk&“SðW&ÅË;,ÇñÆC²È¦Oä’HÒu{h|…:ÍçªYï<›¾û6³ôo¨£©Gh,è:ÿ”=£^ÂMÛù§Lâègœ.SÇÝ8;Ijåì¤Ù'¾Ø!°®©¿â@ªÍí¸.ù˜Ìm5s‚h}à9ñÔöL‘Z 4ÉkˆS«epIMS® ì¹D¿YVxž=Î8ÍŸ´|?å¤sÏø>ÎÕ$YUÝÂçEš¹{]>µ4g9ñøhs×nßåÙ‹Ó™ã“Ì5aÔä¢ €µ€Ñ È¡É×Ë ³æ%öw'x… èìáù\dzU#Gq”öæ²Êê¢mÅÏbdÙ#FJâÕØS]E›5p<ãuM¶ ’å)1sgD! PŠÉ¬h–baSBhyüåÓ)ŒòÛó7·/?üùî÷×aØ‘#ÜŒX`uîËÑVDÿå(.4Ç|D©ÍÐÛã­…NAHDu\è—O͆oŽÿþáé÷?À7îxïݧ›Ó×Àý#vçB©â“ †IQÅÛ3agg‚>©7›¯¨»I¥â9[f›lY‡0eœ¤ÏbMõ©Ö¤ø.Óqq6kÒZÕ{Řmb_rWº÷-qžÅÚY;àÔt—ÌO54ï2®œPR;ŽæW8àEîâ(FÝÖ4¯L² µ+U­ò¯²¼óžùr«¬õìhÊF] qmôNRœÆ¿Œ_áDày YÓZ6•1©ëüE°…ÁÆ4§Ä%¾ÚóÓp4Ï.“u—Œ²{> stream xÚÕ[Y·~ϯ˜ÇICñ>dèÁ ØA ØÉ>Ð. ëVÖZø€‘_Y¼zÈîž™Ã6f<]MëæWµ»ïØŽúØÎpÿ/ݽ½ß]]ïžívŒGÝîúƒ|€ÿÑ»ëw¯§¡Ô0ÂÊýAX¿˜!ý¯šÆO%ñS5Ô·×÷+3^-í(áÎo+H¢"ðߤA‚—~?-¦›©·ÓD­$w†8Òƒh(>öö’DØ]&¹Ù#M- K$ÇMn(×I’ãý§öÿ) ÂÈOiõ„Fê$­2•@RœÿÔyøv,RHƒl¾–بOÝ#׊HGüýXŽšpäèÅ«®Î8¡b—i‚Úøôz 7G ¿l?K¨)Ûe½U«H·hßíßv”/àX‘Óg½£¤–Ä9¿‘ Jµü^,1&ð"ƼXâä.“¼ìÊÍs#‘›/{»0 »(~ìÇ­v™"š³djŠF•ÌX 4:Í1Rƒ¢‘ Œ,+V—Wê`g̶nÅl–lÅD`@Çm’…-YùM{ lÍ"Še&W|&¬^¨W|©;Ú✒d}#ö÷GÙø²]©ìªÏ«\±+E`ÁDÑõC”ܫۓ´ãX9H°] :Hå×µ¢ÚÁ èž0,S)6(Û›] ÔÙP¨êÚö›`(%±f«u|:–† \=Šu¨uë0|Í:8±bWáÆQGë0©š 1Æ(Úw-"íVáýÚ5WõG¹ÖIÂ[àõámp”_á˜pÖ^âäÿ¥–BÜv=HŽáGs¢l~t]Š˜§¢ô¡Zƒ€ÔÓžT$=f½\k’Ê£ê³èTª´X@x¢1À™ò¶”Ga±[ ((ªÑ_ \ᵄ¼Áä ¶%gmž S§ôf50Ëã/1*ç_Æ 4}ÅRtOïšêÝpPEœß¢‡¨-n}ͧfÚBÉ„¥Cë l ~zAäo+Fg)ö Ì©R!#&1’75Ȫ1±XäšÞmßÅžëTdyYÙ©°odÞ‘£ñ, bpDgˆå³#¶e°^Iòé>&Z9€¡ÆSf9TÚ®`|Í1Ö>µi!’ÕæÀ™hç^×.ùÁ8Á%„ ³Da #¨)*ÈñÁ˜¬ftÙ*³)Fd²CxSWŽ— %8šˆ±S1Œœhå :ròõõ?¿|•˜j´xyT"µÆA+2o6ÔmØð˜¬òj¦àòt\ö.ËÙ76\–ÑÖ$o½cØ#m7°¿èÆUjávyð†\S&{fç °¦ ÉÅà DåuÞ'Ë4]¦J*á(¬Ÿèç3­ñæh I´Í[ÐîY‰- ¼èxŒ—‹¢`¨A¦Ð2bγVBç°SJa‰*¹>Åm¨@{ O*½Á~Áfiå:TaôÑU®ÉΦŠ…¸*ŽøyŠ*\†höY𘎽pˆÕ«S®qpÌ>H£Jºª×ª‹&f*„å®·›XÇ×üŰ.’À ^e÷gQxa±TβxÎÆ …K“ò’¹ªÚ¢91Éäß¼ÿå‡×¬‹þ¸Œa.ò%Ó*~èôñ¬·7å [ܶh3…— «ƒIO⣛À2ú†!Œø˜Ã˜äÓÏ{ÏØïß¿ÿm¯Åôçï?¿Ù4÷)ÌWF,ƒ–lc¼Ž¥#k£q®FŽ"»¥XB…'¸V®LXZKË1U²fL4ª«ÈŸ”ÖpäwŸ}óéýþ ˜öç…³†s~¼™þõÍwÿø˜éɧ‡gñÛÛÏ?ýüKüZ¿Ôðü {zÿäùíÍþ‹^ãn“´¬îýUÕÉ=3âÄ7×+d tÑŒ¸æ’âZ zH»å}—²žaé*ó:? es:Jß#LÜì_ô‘Eëzãûùú—œÓV“æÛÞ½Ó”¬yžÓÝÁÞdÙÂÅ­Otf%ü²äîOû§Ë?“­W½Ã;±õa=ŸÊ“iy*y€ö+gŸL2ÉËãƒyhZ¤âúI¼Šk´=hÞ+>žæ»Î:„ò`RµY©ðëk‘l}èƒ+*ê–ѵ¢¨‚~\õ…ÂíIMŒ»nÖoSìÙ©Ú׬¬ó´#Ú`EE?Õ ÔC MÙ+4û ftY½–+í~<Ö®(¨Õ@»^¯v‹våfí>r‹Š[Tgv95±Í>‚‹Ï. ²ìÒÍ­>/€g›ÅŠO”[îb¥=ÓÓ˜„^vÝž4¾È´'£yýIž=.žo»˜Ñ¬7­¬^èM«dƒ_Â’@üJÑö“P/eÕJ‰×_*1ƒT$å_ÖzÜå½õk{¿Qëq¢)2¾ñjüÊ×ÑøAN$ÝÜêBna1ïÄÒ‚“ƒâ-HV%ŠM`KÜimÁÉË´³º,Ü2ÕL Ø¥ 'þ¬ð>ž?¹í^…˜)_.*_Ìð‰ÖÅ1ó¿BÏ·‹ƒ÷|_³vÍvÅ÷ãµïÇw6Ϲä÷ϵ2[ÕüúÕ¹Ö8}…8’¼ÿ»É#Sª^˜%ÕG ,ù½0ë³IÑ>xÀôZHu4­!ÕÍZä—i‘iÙ¹¹5µŠèÔ*m@².™y9…¿Ø³ÔVÈÍÔ¦š·«§9 Œ’θì-|Ñ[°iÀtà²Á#߆;rmNF5Öèv8:´@Æ¢ZËöQD¦ ‚(«v•NÚJâHÀÈfšõXr3,¶&-¶&“ Ó·cdáô2®õÉx$s²à€›Ià§E"žì’º¤’KÉ4òvHª ùp‡@!B‘ôd(2I0}¢äûèó(cê ÂQ‘Jê¢åÚ3óÄ2ùÛç»w3òán€@ØÑLw:Ê\ŸÚ”Vm¥]Ê2‘ƒ}ÄZr¦ä»è#ò¾¦èða±ÔÛb0µÒÌ+1 N>X/ÖÌ„ðª!¼œÄ88¹ªxŸx€5“8ª~jlkx/:*ÊlîÅþx¯ëH æOÀå,ïë2³Z_9ˆÌ–ÚõfÕñ¤DZ§µCs./XRUàS5½ÂÚéйEYóDPK tž9]™2`§ô·?=×r[Æj*tí]”çê¿pPµöáp§;‚KU³5)¡–Úýx†+h÷wQwï{Ô6 Ú:HÕ+¸;_mV³e1Õ×½4Ñ,4›Ùêýή ù™¤µ¹¦P-U ü-h¿ÊRs ”%Ù”eÿ2P–6ÍeGS»†âÓñ=wù:«éÚu6®¿tÕÔÍ®³ÈñÊ9?ûÏ5NEç,±>_~5ºk, ¦^óen˜¯{Ž,iëÄòE–TýÍFš½ò¢Ò³[Tž.Q›¦KÔ¹CYqýÍÓ%º3ɸ<]¢Îš.ÑgM—TxÄ0ú«Óå×ÅÓ%v6]¢¶L—ÈÇš.ñÅ÷*ÇÛ?€É³%Û®r@޼Áýh×ø£ÁûÐA cü ½¯®wßþí¿«ÃÞ endstream endobj 203 0 obj <> stream xÚ½ZK·¾çWÌqFQSdñÙr°€ø‚“ì!€G0IAv£Õ*±cùõ®â›=dwϬ`HÀôÎ_õü¾bþsŽÿÄÁþç‡w‡×w‡WßqœÍ|>ÜýŸès¸{ÿÝñ,…e‚™Ó$„‚ãŸORþþÃO'#ÿøýû‡Ó$?ž9˜ø$œ¥•giìYjŽŸ?ño¥ñS‡ï”&iÒÚ Ä_L”æá;?GZU~×¢iªyižÕá…ó)Z±ÞÍå\6HçSÕ¼EúíÝQ]RWê†Íâ0fÚz•½úß?>~8MZÔéÊëé|üë·ûÓ·ô½=¾øøùexz÷ôé‡Ãc=ðóýw¯^ˆß>¾xõ6 ÞŠbçÓïâFæj›-ZÎ1-£å¸ 'Og gkO¸UO¬Í ,YL…¿éôtR%£&xЄ×§‘rž6éòWØÖгiF.lkd<¶€êÜà€ Àƒî“„:XÒþ®™q¨f”—xè¨=ܲÄ~× ê¸Êu„¬]cËȸõó±w:Å@EŸ/ÏfH¶ÙK¼é-â·‡,r>]Îâ׸ÔP3‹e ŠŠ~ïE&¥g¦‡J¦uõÃâ BÔæ!¬óÿîH3š0I¼ìmÐMf]»F jNšæ FûLŽôПCè+æøÔŸcvyλsàSyì(užfÀÔ ¥ð!IOp¬B bH‰ä•YvÍ«Už'z³åmâö ÖKÄg5*mL¬!eLö$uÔàùôUïÔóÌ)ðºX^zªXzꊑÞõâÁBÇ!3Zòø,²fÉ´Ð×— ¡?9\-„Îÿ‹¯%=4 Cëç(ëJª`æØ-`8S¦V)eö’ñÑ,½=Ï·(§uP°µn<2°39„ÕÉQ¬N㇇l¯+g£*Få:1ÕŸR½yt>rö\)Lå¬^"W·¾fKÕ{-E©ÛR,Ë̺3l*Ö,Û; 0—òGoÃxÊÆSTbP³ˆÅÚDUÇÌa2°ÓPTPfPµ•Yâ*G°¡š€ÓlVu5逑˜…Œ]d%ÑÕ¸™Y.¯*—ÊÀ'("`JB­Ò(¤Ô–“cÄ1:⦌nãñSJõ(É'¿¤¾hO`h s‰†ü§H#<.“µ­§wRRHÆ0Hñг gƒú[¤(’ÙÓyLAÉTÞÈ+ºñ±›±ôÚK+4I{¦|ÍcÆžÀÚšYÝ™« U¨JÄ}o5ɤ«ðÞ© ]ŠÕh†&™6©#Ak4´7+™×¥QѼrßc¶U› söiQ)ΛVJñ'Š zcð.1Á¤6§C Ÿo;çL;s‹&r=£Ã‡I/{+€eV–G $¸Â’1jº9)…QŠ6“’Ù¹&vD:|÷ôñ¹´³—í|¡áµÄ È⓯RÁ”šØ‹pÇ åyÚ¦|…®•/#ø4næåuS™<Ä÷šÉ›|ÜPÑΨ_]¦-ú(mÉ1²ÅÂN˜3Š`ž´J ò$pæª<É»8ÎV Þ°´Q¦›(‘<êœ?:SLÊ(6Ï¡¬«U~ævp+øø™ÝÁÏÄ>‚Æñ9KHa¶¨š:ÖiUA¤íz0Â&™¬­A·0O§È)^# ̾˜åoU)Y)þ<:_íß±èH“–óVÉV¢XÃ>ìcÔŽc§»2T¨Ú&Ví0*ñ^ rïõcˆ÷ÌãGÔÝ'ÞP¯cQ@uÐñ7wùúÍWÝü2£!ü=JUöFîÑ<Š´*)¼Nµ´"LNfö\Ï`+0˜#Qô»kˆ_¦4Ç›)³Ý³¶“ÔhrÀÄ aà Ó2—û™¸+Líu»ˆ&gRïTÉQÎH½_/1Ê­Ô(g(Þ%[qœKû]Ó¥Üö¹¯yÓ§Ñó¶´‘E"jn%û¬ë„’ (u;ÆÑpá ºš5W[¨K åºB.½ÑM‘J´.d½òf´€þRS&Ù½×+¹Wx[¤!žú¬¹ú‚=òç;ïžV¸Ýì3ÙŠQ!a–̘§Oõ»½³ÑÉ5šìƒRp#Ø#‚Ñ•Ðz©€eçñ»±u·Cuú ¾„n:]væ{Z®»^+@SCõ¹ÈÜ2×X~’b„Ì‘þ ó« sÌ„¥ƒQTÑi(XAd3,rÉU=Äáꞌv›r¦¾ô3šP/ñ8Z®¶¨\)Õi;¸QÛá¿ÿzúR]‡T‹+kÝ•—"syU½óB{\¨nlJàñ·z÷žÛݒغ¹VöÖ›keåí- «YÂY÷=_cÖ”ŽÝa‡ÕzÆÆbšN±e çTTžV°0à>ÒK#0ŒÈˆqÑàáùã4:…fØê6TW:]¨*©PCÕ¨¢¨×^‡ª>oáPÆõ oÁkOF¾ø‚÷Ç÷½9LIŽ{æØî-À½[ý0ØÕ[)¶0ñjo¡¬R÷ ß}<£·`çàUV‹xLMÌTRíHÀZêó‰« RÕ?ÇfcÆÁì aLÙã­…0úºÆBˆ¹×Mc¡íFú«Ï¦³ ¡ÄÍ÷@á1È‚½Ž€j“ ¯.Ü;×ë¹!ð¡÷w½ë%^/õÚCÆëù呵½Éa©²f_K³»Ú•>äêõqˆs].Åj^{M·2)ëðÕ²Šï¸Šï({ëåF¹—ï„ÝlñµJVz #p²ç“èp™%¢£Kºr «ax ÛtëËdÍ›:›|95ÎV8Ì\­ãILÔç*‰ju~!CèµÏadivÕÆ,¨ÌæÅ)­ð¸µB¦0¦¡0xTÛ]‡-!“\ÍØe²g½÷BêF‹äý z®e©{á -åå6ÝAèD "ÀÚ‹éM5ؼ0—1ÂÜõËvýeŒ^EUßu_-A¢ÚWd:l¼Õ%Æo5u¶„(3wÓ ü¿ÄjW¿jáV^µ0;Új®)ÆË&…/8n­­¦7J–l²Dp\á$ôšº¢n/}¯CÁüÃÝáÏ¿ù½º™ endstream endobj 206 0 obj <> stream xÚÕ[[Ç~ϯ˜Ç9d§éûÅAJ¢Ùò>Db€È.»`0–}úÞÕsjfÎpXK–±ÎÙž¾T×嫯j‡÷¨ÿ †ûtxy3<¾þ“±Qâ¨.òϧðƒ._=¯3„w˜“|üåî ØøÛó׿´_\?ÿøæía–ŽW”ëüMH~%Œ¸Ú\ Eý'óŸþg©ü§J¿“*Œf~´Qà©l£4?ˆ8õ#ó<4R¼•Gj6¥×x|ÍÿŸŽ›ÐaS‡g—ÿò ˜iâØ0qE”‰‡~uûéÇëׇI1íON›Nz5þðÝþý]x`Æ×wéÛËÛw¿|L_á›þ{ûôáö×›Ÿå‘oÞåqo¯ßæ­8°“‰8ã¥o‰YúT¦“¨,”ðÝ?‰ ¢‹BÐnÂy³PtíÏ*Eú.‹Àd¥RkWdL©—b^cåzÒ'à\åU(îž ZÆÈÁ„³ù’ëÏH´Œƒ¼þË ÂÍPÇ„ÅÊMûïa›,ÿÌÊ6Wt#ЧèF’Õšn0w"%Ñõɧ|íÊÄ Y°AS×#S ®ŒdŒPÒx@ø°â# ¡›¿PÙ˘¥yÞR*¹µy³K½#jÂ=‡‡¤F!sA-Ô›vï1«jx@!‚­ L ¯%„dÑ4q†L«(ÜŽ-(Gá… ÁÒó¨°‰däEu¦M¡—ZÐÉó–•Š‚±F=ÅË (Ãè¼Lа/ÈžaÆ$‚¢ui3ñVéC— l n‚A·n–V(zNÊuhˆ6¥7z•4͈Jð‰¢Î%˜“1DÔIˆ]L¢ŸQØÓx4±Â$R"5P°Dpò9ÙÙ«w|lñ½x—rÍ•‹I™zt'Ë›Di€[Þ ž öjJ1¥ÞL´¤“AF>ìƒ Æ ý¶•0â[ÞÈèR)©Ñ!êø|‚C‡"Š+ˆL²n÷ÈçÑ%âNQî¶aO<ß`Œ5âïwüt5ÞŸìr·ùxV¶»‰Gý”\‹Þ‘À"ÒÄ”‰ŽÄ»ã`)‰ÑÅZÒ‡ÛPºùÜ”Øî‚Ò1øˆW“‹STé×Û7¯æ%¤·ŸÏ®!åÇa yÍ¢Âqü»)¼±Pdò×`íie&mä–™´§•™Pò£Cu:ìÔe9ìæµ(ÇX+"å+E$ ‹Hv³ˆÔ1Ô„ÔyOMõ´œh SøÉ*¾à*<¾n™ßYU(PŠÏ Ѫ‡÷º’8ÕôORÄÉ(]øh!{sYF2™®ÐrÅq­ö,÷é³"¤Òçêšž±E>*Ù•¨¤ï¡à‰A&úL nÔäˆ=*” ¼P–cî0 gHã¾MðûðaÊG~†ÖÓ¼¹A0;"åŠVzÓ— ZñªF#xV'çXT¯æ•9™ Ž0 Y£³Æ{ìMÅ,;ßð(itKq`gvÙ,øž+ó!%™oI€õPRjÁÃÅöÁ M’ÑÒ½Œî+æÇú´üxMÇáèÚCýÌ8 /$Aeà—²8,Ð"ÁOŠÖ^Ö|W°N«/ë¼· 6(ÚLnÒ\ûØ G[–üÕz"ÜrKD½µžÜÈ÷CKaÍTp] D_© oÜ 7›¨ pz4‡ oÛM¸]FÒV[ð'yì×ñÜ©V©îÃcä÷ÁQ÷‘6qä>òNÙLri神 Mò.Ð1Ь‚ ltµ "È4Yd¥’2¸<õ£¹%«–1l«XáŠLÏ(2cŽcÇAùIˆ•÷NñSè1у?éã Ÿ%KL%J©¡±ÎÔfý( @ïH¡Ò›²0mÀÃzŤK·ž”fµ[/)ÐlÏKù4p¡é,‹ÅPoeÚœ @m€ú€JC—"-dˆï5×q¡€ÔPXαMTáÄJGŸ¤ïµÉ[V|Ü:\CˆgYG\âÝ„ˆ¢ Éâüq(¥óùcÓ¾DRtýe»,,9·y°,sKS¾çìß4 ioâv ¥ÕWçÙQŒ0µ(NÁ^y/pBZË[ºµdQ<œóy¡ÖÇf|ܧ;¿ _½øøúù!,ޝ?¾ÈÜhòž3Æñ, {83wM†IZ¦gí"©›»— \ö­y¾-ž:Æ:Óx?Ž ºOwéÀþ¬ ]ãå̆õÄœnÍÝw}··ïžÿtýâçyøû œÄ«T î–üøòöº.¹Äìå¹lÀ>ëFëêï5.`yE+™‡ äm5Eá_PÉä>ÈØÆo1‰9t*ý»+™m.Ȭ³ýghÍ$ñÀ»˜ËàüËàb·eôµ"0‹]5~»äñBW­`­¼i£§ b}w_^ÍØ. ©}7÷ ï…« 2rBCaæ!ŽëG¬ ¿”¨¤Ž\jEé=ÝÁ‘ªfD‡…áDT"Dš¤³nå¢PóX £Fñ‰ ßJ?ж ªÿG†×#.î0Ê/b‰Ò/²æB®È:?]h)H+¬åKó–;½I^VØÊ™òJ»PáÄŒœm J»À¡žaÄÍ΂¸ÄÍÖYG‹H+Aá!$„ƒRrÐ8k^üküÕÄ>ø;™íÚÃC«TçÜ (ƒI7|éU9}ÐÅT/Ûâ³â¨3Šõü9Óù ç–˜ew%3Š $cõä ¼fE5Q¾s³z`Þl¶ãÇ [m˜(ìg© ¦r°õŒË³.Ç22ë£øÇåð~ Rèáó`uüå¢Tn—Z[óÏ×ÃÃ÷ù9»ÆõòVÌ‘ï»Í†Ú÷h{0ƒ=å‘Uâr%f*YF >\‘ò˜3 ùÒ L{‚³ß`I‘ÂFÍF^KϽKHòoh¿-mEWŠßµ`ÀÍ]X½uÚ.ä “DN‘^­çˆcÚøXœ‡I&ºv£w¨˜›¬äîšÆçј;R°¤w½CúlÍuÁDàŸCÌ“šÅŽÃ ¥Ö6^då](Ü܃Ÿ¬t)Ä#`M «3(Z Åå7µE½0 ¾À¬lÎ’gwǬ;"» Y!gÕÉ"U‰5Ñçþ4¢P'ù'mv3ëY^Y€o>nꬿÓH8MäÁ…¤ß–Æýt-s•™¶2­¼mÚGüÞé=Ž2²‘ëe%ð>Þʘ€ç645L¢‰Ôú®t /ßÿåÿ?£1 endstream endobj 209 0 obj <> stream xÚÝ\K·¾çWÌqFÚ¦øfÓ±r0‚ °a hAÖJ‚]i7ZÁþùañÍîb÷ÌÎŒV6lA3=ìâ£^_«´¹Û° uÿ±áîºy{³ùáÅæÙ?ì†Qb©Ý¼x¿aŠX¹àÞ¼¸z¹½T] Í.…îÝ \R÷T÷”“K!ÝgåFIøÎw¯^üÓQª"«-›(Þ¾~ýæ?qT=·ÐDª8È;n¶ajÍw|ÜÆ ÜDJ»Ï<,IÂwu‘Ö¥á±Nß$‡O,’Q2 —ºQ2,LàwCÃReJ~o‘>Ó',ÓáTòBŽŽ‹dõÙÁ?R•u)ÕÐ 'ÄD}Dl$vLg´MCx5D.ã€ßÓïrcˆ5žðëÀˆ¶~ÄØ$†ðq“‡\îæTd¢"GfR‹0ŠËO#/ ÆKW³Àkcvƒ´zY¦à›§ÃÛqøUÇC3¦y§ÇJ"!lžˆ•$'HDxš¤^Ã¥#/d‹0Ú-å¢$ìÛa¢è2Ñ}bžŠˆ ”2ž‘(Z$i>ZNNÓHŒi¦fš†?~æÁ„5L¥Ò|6:ã0Á¶Á" Á·q-*=m6¢¬#ŒÑ2®’ãâiÒ"ˆy®J»ã\{é-‰‡LéHT:>…(o©:,w4'6 B6cõ»%<ý~I¹Äd‰q"xs‡Ó`ø¸º JQŒpÇÜ`²&ˆÎ–Ía¯n2©·ƒÓÔmm¼³X¹_tܘ7 tlˆÙh»'Óác“Œ„êUV•ß!ç*‰ÒE…/òÖy0Ÿ°Ådù’X‚uJýg8Øÿ´×™{¡'ÚÛó¨Â>À„·ÖFÁXk¦¶ùï/6w"Ýî~ÛpʈpŒs»u^íÆ}7DéûõæçÍOT5¢Þ2ΞÊ#­º9H"0«nˆ0•Q¶‚xÈÄÜY1¾dˆF"Ç5+ [œFþ}‰[°"¸AÓé$i zEåC« ‡9y”Iá1É¿®eWF­ÉØ.ü=ÇŠnNÃòˆ 'T’©š¬@K÷þ‚+4à e¶}43Å­5”uø-¹ñ¼å¨Ô~Ñ:ÎÚ•Fº…"Òfƺ-²í÷¨QØtGæ92:3”%N+›òbü{^©¤çé¸zØ­ÐyvcƹKuœá^AÇEÃï5t<Æð{.#ç+.©9€‹àJGÓ[V‡ë(?‚Îà™—A=ÇÖ¤;¼_V™G›=}У'z¶xÇ’òa‘±`Òƒ´Ü¿ýt0’[0Øå`Ô]¿®Ý ¹,¦Êï[„"h]"étbá-r<]íר-VšP9A–­>ó¤ÏC`1XPÍ£aáEkKÆõö##N¨6ÍR(WH¢ë-DÚFfþÐæd¶gYÊ-tѺ%c‘P*çÊè½ò\büVòÜFŠwì3Dg;HŴߌՄîp¬ UåæwƒFbm,ˆ†…Þ†PZ›ä·J´ä…FaR¬<Ê,Rü’½Â<¶ø ˜Lm•gZ7)÷2… 5ý›ý¤($ÐAUp¯ó&1±òš¢Óˆ%M󴣦›m"/ô3Là­ÖÅU paX3ïk¼üÉÈ%%ëèCÃîבoŒ•aO>[B±8È“19êŠÌ‡Ñr[§û¢z™Ê:Ò`GãÈX÷öZõfŸZÛùèÚºÕ8§ñ"2R*ëæeÝf[`A0™¾.4“y’*X‰DËjR4Ìy—νÂy &O¨–ØØz%~\P#y­Ï—qÚ76é§ G"|ÂIVF)zô…nÿ3NÈYƒL¯Ò}#ë€8¡€õ¨ˆAFýÂ"vÕ°è;ÜÙAFÃyÉ@p£³cåb}ñHÒ2¡bl—çqˆCÓˆÑů1 =úAt38ßPñßÒÅð'ß§'Î$ÇÙ–_ Ð=j¡3OXÇA ÇM¹-é¦Ó(l(aã3ØùµZot9¿¿¢i¹P}¨×ͬZ8CÃENd’U4L¬…ù›3VÍ:Zñën&ÉÓŽ…˜exÅd† pÏÁB¶ß¡\Ï·#‹Ÿëâg"¼¬6á߸ü6³–ßþ5¥¨š&Þ„âŒã:àtÇ8¾ã¾ Ò¬ÎvÙƒ2NœŠqbqâq“rÜŽþ|¸€Œ{ºz*©@©Ð“°Å $Â-à1¼ÖðC‹ Ì6ÌöÐF 9+[W:ÕÙ¬sß'»s3`èwß͸Ê|’(0¼@ÃtYdä›3³ rÓ¨¶ ðÏg{Nû»Z’}þÛ,‰/ýã¯4¿µ\$ï›-‘l¿ûf‡óiù#jJŸÅŒÙ*25D¦æ¾1g˜g߬CÈäW‰5•ç›E­è4ìkß;U¶|õ6d ]ø²}ræ‰Úóß²šƒÔñ`ö ¸•wÍ:8‘¥ê1Ú±'³ù4DÙ:óÙ‰Ñø×ÑL?F㒌҇ijs–ä °ðsç=Õ UF¬«Œ8Ê|ùÚSñ'V±ª2â0•YwN˱¦4Ã!@³çÎo‡$4_»nR/wx¡%mÄß[£í\ɧ=aéb•@±toêËxÓ½Œ¿@E’2bØÁ’Ò‚ô‘w6¾O®%Œ\+Öò‡°XÎbë¸a¯%ŒzüÐH¬†Fb-enB#’¯X©˜\m¯ÑênåRÈxÑ^Yæ³9:ÄÄï+œp-Ô¿†Î 'Ä’0_ëp2Ïß»°ñ5I)ˆîcTÀ¢÷†{ú ½w|w>5jüEÝ“¼n;X|È”wP³îüÇ ÅÖñŽYík¶ãƒóò{psgÓÝ’èé¶£òyÈó5õz ŠÖwò§Ž¿œ/Äðü³HS$WÁÿï0èÀ;€D4{+î˧H-Û–âÙ¦ð>U@Tµ6aôZýް|ÿúÌ;ücÅ)ŠiO™]ù€ÖÌkÝä÷J º/—»vÔ];ë}èÔBcÕÇ ×Û¹«gm ;š/ÛVw‹ƒ×•´T§–ÚE@ÒRÑ¥…Älyúp  ÆYÛŠ–¥&šRåk½DÉ˶vUBî 5»ÊãùAß®Æ÷ ùhWUeW?àO²ìê^÷•èDŠŒµe]½!^ Säõ«ò¤ د–¹Â·–`Hà¢9Ç},–às›B°h0sGÊX¢B¸ª~`dx35֩ʤ×j“®šÂjRЖPEnQ³ñD?­¿vbÛ¤jð²ë 4Ýh3m#óþOŽª}o܃.‰Òƒž¶å÷¬>M• ½55¦Ô p3bHXRí‹Ãó:E9t¶¶Žü¾ŽÃ´^@Þ-Ak¼ QM‰w8ðy‰w˜Γ›´×thCCfд©Ê ³þúîþ ÖÔàl.©¡¶ EV潉y‚D¥⹆L¥«mUéH×ÔžHF(b'mcms‰$¬Qt¦áJÛ-ŠÝR÷/¿°“|ûùvç÷ûë/Ð1ŶWoîß½¾‚:e&˜^/Ív£LÝÅ©ªþ¨ú’ƒx,÷êJ?µ×úôëÊÕo¡e‚ÀÄji®Ò½æÕ§/¿^¿Û Ê-ãó-œR8 ËíÏ?þò¯á³}r}{>•áîóËgOØÓÃÍ“g¯.…ïÃoi|| ·wñÁÛO?ß7´|ñ¼OV)Âýÿ>ý6'?Ù ߨƒaèåËËi†‘p^•ç×­I©#WRöÀ"uW–¹iþSÓ¢v¾‡Ì…•¦UàùrI×U§Ve¬ª³¬ê·Çäœóê[ü½F‡p·@ ¼5¦¤Z¤^áÐ{êºQ¯Ø9 œxxT×¥ôôn¯—  ÀZ¨Æàžû¨È—ù<&zÌ—æÅ3œ¿+~Y*û µñºôyº`[BKZt(UÍr ®8¢n.¹½L…Ô µ®'Ýö. cnešecF”ùæâº1¡K™tü¦Æ¥qâ“ñ®¶øÎ+¼„µÍŽñ ã¿ãÓÉg<)—:þŠ4Á†ýd¥¤|‘¸ÚÀ2Dú„uÐéÒA—þ ƒ@ÕÀL“ô¿Â›ì8/MÖ1KØv×Åoh“7Pf™óÒ99´ÍNÀ=J~˜“F­;ÓEh¨™P&æŸþò¤¬à· endstream endobj 212 0 obj <> stream xÚÍ[K·¾çWÌq&Ùaø&[|0à‚ °a x a#Éö Zi7RbÿüT‘,>ºÉîž] 0$h4Ó|Yůª¾bâÀá88 ùáÕÝá뇿þ}:Î&>^ü|†MúpÆìáÅë×J¸k¥ùµ²<~ Ÿ¾KüíôÓ‹ÀBUƒŸ™°¿ ¾j01£Óók.55‘µ ’ŸÚÜÆp;Æ 6w©A³Xż¢1”NëÔ:}†5žÎÊOðÔÀ7c«Õsz¢Ejý Z‹ÜßQ¿øIãÓ´îì¦p³‰yì-T3Iûù;=×Ç&‡O->= [|Ý›Ä1é¹Éõi9 ÌaÂ(ºÑÉÔˆáì!·¸ÊK—'éŽq‰h4á3“sØÊã¶ÁvK{Lf–6EË´­hnâ$±mé…­p£ÎA¨³RЇ©´ÛÕŽOÒÎ䘕­r¾yqx80­ìá7h(˜w ŠgÒîà»g‚¾¾;|ø.žÁÖnS'©™+ZU•VÿÕÎ3¾­Õh*4yèhö‡ÜB»ê8‡ÝK»¥m}N¨Uï|h⪜Qk†õxÀ‘lZǵ ŠÔøÐB\0Äû-)8ï!P©«€eý6`93¬ü¤œ™•£áìÓ€ËOèL>p}9‡sf‹‰_åJp4®ÐŠ€Ëí®ˆPV1ågµ¥Ž'"Bv+Pì› gð  Îädèû«¨—efz¢ò)ò¾‹UjˆUOÃ) #f8•Î]0;Á„Q*ejû(WÜùOÿùð[Gré˜®Ž¶NÒ)”6ÙVÐðé¬ §õØä.ËV†=|²F´>§±®Ñ™4æÌrB+Õ…¤¨~>ÜrÃ4aï9j˜ê@Øn˜È¤N¤ hZÉ|x¢9‡‡CCâÒ®¢¨høYôt0­8dzG«Eb£ ?;Z“äºBsÅ{¦æ|ÇÔZÏϦ©ØÚóh'Ú@\*ëƒýüt6 ðÌI¹‹$yÛAˆ¹ŠÙŸ:jš˜–żàXh§ ÁF¹¬—«Ó1=[6 ðÊ”?ufS0ÍUœ‹A¬`Mü°ôqÕ›Aqæ›)ÞŸïz“€e:jÇÒ‚@tej<¦…. mÞ¢=sÉM6ýÃÓä ȸ#º—ßù›³ý„$ã‡p<¢ùHáb8´á ½—G–4MIÛã°IaèŸvûÕ‡w=lš*+]Å&+õ#°)öz 6YÆõ,jk±IÚ‚MZ±`:³ŠO±bTh™Õ›-"¸ q”Ÿ §êc ÀÄ|&p®— ²·eˆ3ƒ+È%*¸ŠÜG%0B{ *Ý>ô=º6¨äCTRöq¨B¸bÅû`IÍñ(Ô–êñïFã» ‘”©‰°ƒÙ3«pR,µX”y**E)º¨t&8‚´gG ®V‚¦Mpâ:®)ÄÐÚu¢Ú0ŒË)M"rkŠÇS GÇ/¯ÇÖñ¹SÁd §§ž¶Š˜£'¨¤¨q ¿“¿@P¨Ò€PY"-³¿Z²)5‹@P· òÔ¾Šæž“· §•æ ᕹ*ÓÈOµ#9’i÷+æƒe’[ÀÞŠ÷v'c„°“tp_/áÁ`šºÉ*¸&R¯m"H3ò—ã+Q;¯³¥ÒÖê’Ã%36èy²–pÞ£0½>]å!HQ®¨ '„‚ºSZ73Ñ=¹Ýî©äxkÈPe3‡ãú‡¸1­£‚Eh:Ò›ž"S‘k.Hofٱų®çQ’)H³ ÛRæBëšùÛ8;é†!¸aŽÈêW]Oi6¿ÊA„Ùü6yº"²mò‰¿,I!ÚAH7 Q3@j>uØè‡Î8ŒÃ’¤B÷¼75q¹‰Ä°#îÉsÑW³ÿå~=Lp—† [HåÖjÌîÕ|ºè¶³D±‹kܬf‰ ºŽà>L¾HPRÏì@Éuˊ‹-R¾A.–ÆCÞC¬æ—5Ú/…9=è¶á€}qÖî,­Ú–Ýe[êS Û–j¨È«¬üaÄž´–<ªMÈ&ÚÆ…ìeH‰AwŠ:e/äèî1Ñmè¹+nUòÂÈ<Ät9¢ §ƒ%(ê{Ö§ïÆ.beØ¡7}›Dò=ï•c"q iIhò¶÷\íˆrõ¸lNÝ—˜gX÷áH.·©vEùŽ›å‡³ÅŒ}(…Æ:8,·ZiÍüK ·,n¨Fq˜!Ã1I?ÔÜ-Rcì.O#ÆòÄn²D/¾%;% _h»Û³;‰Åzm ÛÇ.ÜBl”|¸[õá²õáN~^%Ψ™u˜\Õä­+ȹâ4­åŠáiÉ«œužNþ¢¼P@b¨/Váb™åÀd6J‚Hn.UåRz£kYCÅgš*¼s;ñ.ÒWyÑ&áüôä¤m/! WîD.J7÷G¦Åý‘œ«MÈSv=ÁÖÅ’Œ RÔ"RÔæúôlÈCN HÄa– ¼p‚K?Œ,‡úiîbü|¼kOÕ94À/›§Y¦òÈ;‚¸ÙbX¦ Ìý0\&õŒÜÃ[&Ky$m\â½@¹’Ior&/I$Ìæ¥šW½èß„ljNny3(|‡(BP‹q-žZì®@¸qÉ;†jÇYY'Џ'9 ^.ŽÌ“ìñb8ÎßÚ,eX©ûw,_×éí°F²U;kÌ=¦&B RfÁjP#Ô ó¾PÓÓ§K/©i=tKÅiõıGQO”¡wô¢å$ÅÆÕÒÚ<‰-ÕèšÕíÎêÛ‘¥XÙZJUEíQÁ¢¼wѽ'íKª0¼å,ðÉŒÄiÇfÇ«7¥=nßM™ÝuÓšüúÈÕ€RË ­²½½äsjq´ÀÂïÕ²T-/)UÛ^ ¦@%µ“Ì ä’)E߇Wy©—Ã[qεk|;¨è5߆mEoûÔªû¨Õ}W™t}Á² 7L8°e7áà!í¹¾›¹×Ænv9M9ä4„¥§²¹¼€°ô˜.\¾7³8°ÖƒÌÁìJÑǘräö]4noK̯§ƒtùM‰=Wˆ…6åU}›·ùÂTºj.•Avº½ÎI,¨hê1#&TðGðŸÕøt{©r²K(ÏÓ0=7g:%R>íaÞL‘2@¢¨i’…7oc,3h/C–k Æ4HynïÇïÃü™zÁ1š%'­÷v¥®T_,©%ÐÜ2WÐør߀:-çßFÆ&ˆI¥G=¾xéŠûKY®àÝ‹—™é‡d7dn‹Ë€ËkÆUˆÜ^5–%B~ݧ"M¡"Ms‘K·Œvñ”Ñ€Òa6ñ 4f?7¦\Ò\1¦Åi˜ë%7å½,Fˆ¡Åäñ²:ÌN‰/¾çÆp*„Ðòøñþ+ýýå«,ë×›÷¿¼yùï›·ÁšÒ·Þ+@°êÄOÆO­‰”L)_}ý%QZ~å6gG•†y­‰…´ÿ}¸}o:XX,¢ZÀõñûoøç·ñ5ˆ?¿»¿Šÿ»}ÿ)þ'þ`«^þüîæ—y³‡ëS×÷á¹XÜ.Íïa™R(©Á¥¨{Žj5ãØO?–8“ ÐÇîPP’apÝVsngèqåpœ· ¿7¨ª…Øê¦Jjp¹rp³ô8»$麷¨Áä ÞÝŸ¿úõÍMï@é e«bc3Ô„WFB£édÊ»>§üÖ©gî’—N«0 Ár¼ø²³d»wÊ-Ö™S÷—ƒ(×Th[‘¯ø> stream xÚÍWMÜ6 ½÷WøhcU”DÉFO ŠRtâ"èv Øf±AÒ ?¿¢HJš‰3û‘K°kŒm‘ùÞ“(ïlþƒ!¹üo‡¿Þ ÏÃ÷? `Íj×áø&Ïô‡ãõ«qó Ó Üøánò0þ÷úß»iÎ7×~üûõÛ[z÷é*¿Yì¸Yé²/¦ÍÜ|´ò ùÒwN­bÈo²:z›#{ y%‹‘ŸÑªW! ¡ØˆìP3ØWcR¬ä§?Ž?çÒ=v¥C4+ ³Cƒ©”ÿööã4#Ä\7Õ,å~ºÚÆß^þþËKKã³î|'æùæÀnõÅÍ6ý 3®Ý„³YS†{1èn«` _tŸPŒ“K@àçRV.)xÚrÙ\ºzGEk„|yŽŸz:êI+V& ÒCHã î# \‡¡_2k.Ë–|¾28ã’Œo#˜¸M§xJžj,þs4à33Þ 3ZUÉNØÉÍÞ9bõ>˽±^¦¿ÛIMXexf1jÔ‚½kŒ~„Dæuo¦ÕÄ(¡nvfŠ-‘™ê¸o–ò\­.°’-Y8V&ù%dÐ…9/¸ÿ\Ã(ž©y5Á^í.T?î©ÌÒ‰Àm“a®}Z‰“Uª`{Ê9×®óû{צ¯ .ÁÒhÎ[dØ«!§ˆp¦”³èCmÞíÁà Ô<ª¦ƒp[×83¢+S«·Êô]Þ¯–½¬±ƒgo /fѪuŠ,·(Âé· ²ÍÑfâ­n“šfd–Sµö¡)h‰{ËE7.9ê’ߘnnöb¬ÆÆGĸÝÓ5¾J7p¯nÜÓt³\XõKSû‰nÒEÝ+mO]ÃLK^Z°R “[FiÔÜ‚x¤KzJ^µW³ø³“¶¾D4,áÝ9,ø„î,^R––M1“îÄQ3øÒI‚‹:h°§Ux‚>(\iC(bs ß÷l õåª'ºãÛûNÛ;ÈPå(ÖüTŠ"‰KhDZ`Ã#an^åÈåT§*Š£ZzÁ­dméOÛe'ºlǨƒNT˜µÊY^¦V𵤠ûa!Ë} ohˆTl›QÇgt¶ø+J"âè炾ýxÎ!/„§žrQ÷—²§ˆE”­ý\&bí[ eX—§lh/ŠŠ,œàÍ‘Š·øaw.êp/gJ׎9ÚöxÓ áðùÐv6ìûú=:Î7˜P?Hú½­R.6аöÐG$Püq÷Ë,%“´ÿ\½¹–±½ãt4¾6*=ãåºÜ©1×iCÁµ ¼8¿~÷?kóy endstream endobj 219 0 obj <> stream xÚÍ[KoǾçWÌqWâ¶úýpƒ$‡ æ!€H²èDHŠe[ʯOõ»z¶fv–ÌÁ°¥í®úêÕš~™ÄÄá?19 ÿóéãýô×ËéÍß…™„`Á˜éòßðûApìtyónw¥„crBêøE_)c÷ŠÃ³†g«öVÁ³QWÊéýþÚýøý¿ÞîƒÜ]æ¯W\Úò¤ LѦIøŸ&>Ûøn}ù`D9Ĉ䖩Èqdäm1°*“¶ €Ud¤càÉ DÖ·>M~6ºrcuù•œiSi‰)J‚‡Hë E`ÆÁ§‰]8LDñh _%¢kA$F–ïªP\|S”»ük”‚qùMžáeâ€gÚ¾Ð>‡˜¶|F,¿ÑeÛI8e¼­ÛWÊ1달#—‡ ΣG:\©Á'z.ét‘¾)<‹üÝEÎL(œ¥׸NÜWœ“t/í¿¬ß˵g¢žÆ¨ŽEâiŸñ$ã.D¡DR0–q]–¸'(|˜s‹2²¥×ðTù{ çLØ£Õ«šhQDžDÜö— \EC«2ÕX'lשªÏÍàÓü“°G-«‡íYðé™Qe|fHº(ß1aÊTÿÊÆâî«â`eI†”̯UÞ¹,†J½¯•æØ­<$!Êô¥ÕLšnúÿüž2}Á<2}J%³±Ü)dΪ+m6µ¶÷ÅâAÐfƒÏäöáËþ`„ݽzüò™`XÃȦÙG‰¨>Y6{iw]ź W'âˆ&qá1Ȉ²?^”6ýZ!Í4p®–£°eÉxõzѵ½{M™˜@pO®$˜­ò:/$(SÉUA°*åP‰ŽÝScñkË*’€°ßñkJAÀU" 1儳ÜÎt>¹Šg2{¤` IÖ‘éÛkÚ¡yÙ`–±ëJY~ÌŠ®dš‰ø¤B@Ř™Þ=õ1¶4äýâ/‘<)…‡?{VqäBªsïl‡,´bÂͱêþ5)Y HÑ$K©¸èþðð_Òg¦U÷NÐ.ÃE/ËQ »H¤±«Ðp‡¸¡AÅ™<2;çú­.=Ÿß"m]G:ƒr}×÷‘º3~¶'GcW äíÄ9–®W,]â “ ®“ þä!„ªùy^†’h% Ž‹”ÕEN¦ bmް¶$ø"H§)-”\2ÕlG&]•—‚éPðc ø¹ÚÓ'à‘s‰¦Ÿ·° )ɤó®å‚*RXI:;JÕ“½„5Ö˜]gÏU32=¤›Õ”TG³ªç_+¢GœK…æ,Š×mÉä˜çŒLb??:´•…çAoc)FBJVd‹6ªMª½Ñ;$&Ùêeô)k†{J‡”…³çÅr5îâŽ<¤B>½–ÐÊ5wIVÀöm÷CĹMGÎɵ œ¯E®ÎZë|:.ªëpF;1i™²trFâL„19Ë…½­ÉY.7V}sv-9K+oMÎLtÇ-9“F,$gÈvWÆô­…ì¬rqfÚå˜Eîe1ï ò8ïJäžW¢cU¾ÇÜ.º0¡" ‹Ó9WªEaíðaZ>6Ö*s ‰dM'ÿn,n™Z=Ò5ÌË¡`¬*ù]Õ²y1….Xe|BŒŠ}›ŠÛâ2Uª§g.º›Õ ¿¿›J¦’Êile¦³R£ǘmµH4Ø3*f7Ÿ~ýéîç‚t4cuÏ’2H«ÏÀiQÞ ßÌ ä•7b@'T ñn óúÈLP`—!Àô8ĸv2 drφ€,Þ³ ¼€Ÿå«› @ÚP~D€ŒC"Y†®6C€C ­OáËÅ’Äîãû_J#2‹4·$Qo¥u“ĨªÉ·y±’£îØ<ðLõ(ÔFýíÓíM>ý§ÇÌ]d쪴à·{u÷x‘Ÿrë1¿„Aû?’:älyK{e1½¸…“¡¡ƒ§ë~ëÌjæ=“*àúi¦13e­ ‰æôÁujq;$¸/ZÞ ]ΉäÉs¹&›šß¼+„‡£lg@µÔ26aKÌÄLå¸#žjšO%›b¼ºÐT¦%*x¬Ü/u}A“·Î~QKWÏ‚Y¯0÷ª"{v·Óó-ÝÎ> stream xÚí[Y·~ϯèÇy›âQÌsÞå\„ Ý:];u_?œIyJˆgKJFCœ¬F´A› £ê²9‹ôå!FÒõæLÕI ÜšA†U} d*j+nKÎx-E›¨{…Î<(¨,VÜ {VN0W§9bCÓ>ãd7]üÈEÑ«Ëv€1HN¡H¦Zd¼9!_[lÛ^Á–ÜluÙåžÄßÞa€ØÌÑE&1\m›ÄÞ7ý6‘?å $)cø$Á¢H¡C_¤p ,ZzÐ\P¤H£Ž›©×E í… j‡baŽÔ(&ÊÔ×+îy¬D‘yÔ(ÂJ‰ÂçÅ’¿\‰Âw%ŠÔŸ‡L·*˜{ÇzM§ƒ'$ä´Àøó/êÇÔŽ$*ºQ€3+/óÓ &/Ü ˜BW›gøœš„"4@Úä@™Z [b”°ë¬•[Æ*e)5ÀŸ% Qd¸-#Ãj̉‰uºVñkÎ`yž3ƒå.ƒåaV‰Ëq(H§ Dzèl Ì2\RÐy™7Ÿ! ËQk’¼ÑAÆvã“ë…1'Q¶3>îíQò¹ƒµp[ϱD3=ÞM5Ê«Ê _YÍù ´æµvÂfC •,ùÔÁï$·ß© (s×B™]+”ù¾Pfm—C»Ósè ”KáÍ¢†zZé,»ôã…2}Q¡LW(Ób´m0͵ŽÒcܙյa-=®ãÀÐ÷Iµ²ÿúR–²rr•aTÙ’²zž½5-E’”Üõèk9THGÈ$0è*¯j¹£ê× vW^|Y]Ÿu‰BLƒƒy؆)yE PµZ~˜Ä!ú0«!q‰!”°V¯Ô0âa3Ôï+náèȶ±ÄnJ šš¥A™‰(™­™P›@ð†ª‹æqîT-³Ätê÷‚/xál„.Ã4+.ŠTñè_°<Ôñ‚©˜8ÃJ@ß1ÏL¨üd£ƒÊïq8JãTÖ4¾ ƒô÷j3gFMa‚Ö-,½›ñîK–ÒZŸ~ßf.<8iÛ7åZ¯jAø”=2R†´×G!ëÄC‹X k.á߉¨3€úRÂõ‰Ç$Ýü˜H {k0£«cEavbÀÑÍõ¼®g]¢n«j W‰F戄(;“Îz7˜¼LÀ%’ÝO¯ÒÎ¥âr9ô þçL0+í±ð;J»æ‡C“„†;NA îªKŒ®{M ¬ÖÿuàTxÉZdóùoCô¼à»tŒS I” ³’°{Nn3CÙF8.™‹+ù=tÉÌïõ´žá²œ&Œ«Êõ¿’ÍP3¢hµ×±{HiÍ ×µJlº «%VÎW¹¶acоžÃ–Óì”íQD‘ Gº)¬r…9‰þLJX¶C_ø+EÆö5µeʨÙMkåŠÖ¢lóZ»eRùŠ!ÝTè3mü§¯U5°£^ŠX*¡l0ÀÇCÖzºo=ª’xþ}%βCírúí‡þJŽ±Ý•œ¿±øuY誦¢sxŒ/UM°YËs7˜D‘…úUô4Ç+GÓÜ_¦t4ÍÁüŽ Ì/WÃ.èÍL¾Œ³ ̮ڨ5Ä Oa/tⱫœûö7?tãp endstream endobj 225 0 obj <> stream xÚÍ[K·¾çWÌqFÙ¦ø~HÑA’C6¼^A-‘£Ý•eÅ2òëSE²øèf÷ô¬œ8°W3ÓÍ&‹õüªX}øé þ'á~øþöðÅõáñ_„8·ëàþ„?ìáúõ·Ç%“Ìž&!´<þüþ¤Äñ×—o~9Yu|õîåÇ÷'%ŸÄiRžo¸´øMÀƒZÞ(§n”u7Êpøð ¿µO“®iC£ñ®…',\5þ$ŽÈ³¦gñކ?×Ì#O*ÝŸðq$nàÄy±¸°EBN/®ÿ [U¦Ùª0,èÃ$áCÅíþrÿöõi2ÂÂNq—i‡ŸÄÍñë/¿ùÛ—x˽{•¾ÁÅç×ùâ«WéÉïïï~þ˜.¾¾ÿ×wïÞ¤ïþqÿíãGâ·¿È#óm$LX0^1c"%¸l7á7§§y¡¡¢Ç<“*Ë‹ëēٌß;MÖécfž=I‡|ÊÌ$–k•¾kbtœ ŸTât.‰¸Ÿ²å°— XÎ#qo[PÌÙ|Dè,-7Ò«hx'ɯÂs"ÿeĺÆHÛhŒôç4¦ÛäŽ Ÿ ¾áŠÓ }p,8¢™s fU·i¡Z¶€IùCóì4yª{.)W­øãhI0c[W¼9 d¡™$Q]¦˜´Õ,„VMóÍ8Ïte‘ÔC½ÌÈ™ZtsXæÂŽ9Ds;ØN`Æ—íLJ¡›)šë²Z¡ò ž»¨^Q5ÐZ”â%Œºo²µ ëŠþ†lÕ m*=•mŒ'Ë:¾DQ¶×²NÕ?‘UWuhi:ýÑHÃëÜ8K¤NÒ–)°®§Èˆ•óŒ”ïù€Ç¾Z‹·' ÎHËè“LñI­¹f -¯Ç|•»’#5ô̺< G:·b8àÝ‹oi窆c˜Õá íF3åÏÛ®Š&£K1YâVË–“ E/•GíT3NýÿE>6­¾æc3m69ERœ¸‹¬üu8"RÚ†…Ũ %í'pæiC_Pà.RóxS„ÂyÑ$WÆXfHÄPbN¦2G‘Z ‰Ù-h “ÑH²rTкu€‰10b€ÔY!’EIFÐîÉ$²J<£§·±²¢]-ÒéÇxˆ³:ÛHŽdOà& p‘d Dh3à±uh]ä2bÆ–ÖG5RògیלC9¹½YU’ ̉᭓Kk¦]Êôî29Zt•®u *É#¹x=t` å ¡–5´ê©h”sóЊÉMËcC.YTêóœó`!*ÂIš5”–WÌ’ þ/FÞAUcËqÄ%¬M†~] —phIu…Ûs+0˜bb%DV?mF²/,+ÆD¬kãyünÉ-µâ;—Ф6S‘ºÚ °tû€eâow/ÐB4>¯L3§^¨êÀ]+½y@ìÑŒ­q®3†èȵÛàMº»•#8»”hzªUuøÞ¬ÔÝÉóØŒaœJ(Jj{ìÝ™ÉሌV륤¥.î>Î;ÞÁ0EÊýã‰Ó#‘!ˆÂ,ËÓdLOðÃ¥òëiú¸áa%˜rEÈ|žãv~2z|R€˜4( Ø«úÜt¾ÉÐf8ƒ=µIÀÚžš\âïKRFpi¸N¾E09 ä;½àd— Av!Ñ9Oÿó%ý>Ïèç‘v¯üshïÌ „ð¹Ä‹ñ•8¡ë@H…0Þêæ‘MNÈD„R2‘óÍ`ÆÁÓKÅ´éó½ ×dEýÏÆ&TXü—'Ƽù¤–™/o‡¼C(?`ÜjJðv˜¤t)Á°0MÉDSÊÜk°MôGcà‹ðeUÛ=âx¤Mo¹$Ó|ÝK^öÅm6u2D>ö*Ø{’hÛyýÚ²MÁt¹0cˈÍ|7h€ÛEù®—å»W-Ñ‘à¢(p¤pU¯ÅJSF×9e†ô±bÊ3ÙPtOìw†T)»ã˰?{z&m€½EaÆIp“›þº”µÅ»¨Q¡×¹^£x¡O€»€fÙЃh¯Œ°£8 K΀BDÜ\joùÒ?ò+ÂÏéÛ¬ì™P?Ý¥ùm'šJ0é.o²mÓR12˜gúÚ,BLÔ‚ Û 2´O·êŠúò±yLIm‡õªñùä£Vùb9p\݉ñ9gªEÍ9íÈEò¶å|ä›J#3@g;@·ÛÎÂôdùµÎFåîuˆ¸YÍû¡"äYN삊¡a¾\ŠvPËZ;Ðþ-‚àZYÇÔC•ß%ú-”M ²cÈP¢óˆéÂ*J46«àél.á*ë(çP"Çè”Øwt žý}†X±‰^EZ¹ ÒO½y¤y7º†¼X©\l<Œ÷}µRŠýÿ£Ò9¤~$Ÿ ìx©W°c:-•ÆÂ|¨ö¡IÑ2î‚býŒÄÐ$ç˜ú]ÒL"‚dJÌšILÃÎq‰` ÒwÃÂ’ûþ€Ôed:MÞÚÕ™¤Æò6ï‚G¯ÿº)µX/Ú…Û$ËHÞK½i‘j^T”µñ$Q0޲ùî±–Òèä­ÄiÞvAÍ÷³·¹ xâî,y§Ï;8Ö5aŽÒgUÝæV› žåÅÌè1"bCU»2"0)#È4][>.s\(¼#RfŠK –6“¡ÍÙÄuež7»ôeŒª¡0…Y9àf¿Í¬(ºmeÁ¨èõÉ®þ (ÃzÔJÖ,€ü^êw[·€6 î¸âÆbW:qT­n¡Ü}|ùþÃýk±Ò‰3Ë|aeætr¬ÄM‘róIk{ìbPihiŒ2±|NOꜚ&B¶&I²Ô±ÀmwEÌi^ëóhÓZm×ûFAR|ë>»ó×cšÐ6þjÇתÎ!óÿ¢ñ7` –—ª1gÙ“T˜3i)KÇzgŽ»»“´¬-¾±Û}Üz·BÝI¦kRÚèN’íwÓ°AÉp4†Ö@fïDÀ.߆ 7£eMiÁp’£²Ë&•ôfßàjy£×Ò[Òà‰Âòµ†Lã®wVÞ;@ýëAÙÊ[J¹z ¥ÚŽ¢Ö /½½_gpòYk .ÔÑêT02üŠ&.ŽÊ4·K(¡j“Õ9¥ ¦ß´yÕî}­]4æ˜_Vér€¶/ñ>ŵe[q F™S®Ëûf•Î^¹Ð-Ñ¡hú Yj’ÂdMŒ[r"P‰õ+I%ƒ¯þðyâýâ endstream endobj 228 0 obj <> stream xÚíZK$· ¾çWô±;»­è­R‡HA`ØÈx Ãñ:À³³›xcùõ!EQbU«ª«f{¶««%‘âã#)ñô÷“9iøÏœ’…ÿõéû÷§ß=œ~ñNƨÂéáoðûÕh•ãéáÝ×çGg’r—«1ÖãÿèB¼8 Ïž£»DÏÁ=ºä/Wøçüç/ÿòÅ>†ó£¶±>¹Ã½†)þà3àsÄw—oþL¸$˜°:©”dâ‹:bƦ ʘ:V±DÖ4‚¬|zž¹‰¾þªçœùÀ´Ì ¥ 3ÒºZkU† BrQ%ã-|µ‚li[¿»JXHø¦¸ÉœéWBHô†äFÔ³ ®‰îTé"”ã’PNUu¾Žåñ‘wî‚ n\P‘żơ³*Ø¦Š¢XƒäªÐ‹mÁTìÅBeÚ\ìßSbf‘µ2£1‹ëàÆpN±¹"€º¾·4Ã×Í ý¾ÞšÙ%ÇŠ¶b'ÖDåìÂìäV3:ýü¶É×T[ªš±±l þLe¬ið©, o¼òüÍ)4j_¨[5u{Iˆ´ëêêµ´v4ÎÂíáwô µ!Q¼³ ç¥@þQ|¤Ž º ˜éÑú®ÎòÕþš]iò=©Â@è|=NUª¿ÝX…yµ]±ï¢TâLÖ*Q«èë*ïGDœÊ¹QY¢Hè²Ô£Õ½Ed Ù/<`šNàŵ.Ðæ·¼ú0)oçÖ²­4Qgâ«ÈK¯ŠÝ+\–ùwA•F­‚ª*ûÈÎøŸTp•½@"ÏÎ{Cv„u;ê¶pïl…ÒòŠ×X²š¾&Bz' ©÷µÈŸ÷òPD`FØi£W6tìüÓ—#ì4jšÙ6Q•¶M`9ãÎ 8tÝúÉKÛ€Ó/G,^mŽJ©“§—O—k0ñüóŸþ1`8èfÇܽÏg Á[W×~ϼŸÎ]Ü>h N¦nNWh)+s<-´±ï8é;!+Ëa ¡V›ó›!Àk̆“e ´ô³b\HfäFG"õÀ /üZ3Òú¤’ëj¤6"÷ºø¹ÉmZåö ƒF*@™~2íÔd[ðhA¤lf„ðäm·?DA§<ƒýÓhÜž5Â>%BzÇo™i4ËMÝ ½\DªžJˆ,NÙÖ®šl¡¼T1â>œÍB3=¨ÄºRfAdncV–ÄÄ¡DÈh£bÞH„Œ—\üuNfæÍõÝ0ÅךÆ_Þ#ŸQð8Ï“†ö O‰e÷ÓwÏ#Æ£ÊFhßf‘c’¸•’Ht0ÂÑ8okAý» ~͹2h* (0+PÐé7DÇT&Jî~™l"¢”d¹¥0FNb¿0 ðü… Ý#°„—TÓs_€†­ôkÜLþ.Š—p,c’ÞQ¼jÙs~ã$ïãÀB¡^ÍÚF©IáI÷èÉ»¼Û²^àÄȳ|¥–Fá{žsItõYä Ï’Žν COàß­¨(BåÌ[©“þ޲¼?ºþ«9k}´tÀQž>)#q•2Ýñ@F´&ÚAîYÊ×–-xö·Ô"dã$)Ö”Ì΋™’WVš/Ѻ5+]fmF _‰…o†~+ó °E­”\©³D€­7AéÒ(*>Œ¿Ïm6ÖR2®#)]‚?‹¼ÑÎjþ«ƒô//*‹DYíGÕßãed%P¤(z¹6¢ÔȰÓ!¥¨¬m”®nòç_ÓÇ(è;­ZÞpa¢Ç¶h¥NõY&ó£L¬‚Å3Þ <àååߣ5¬é"~s¹Bq6M’!”KwÌ4wD+}¿b¥fÝJI”+[Çfž{-­CD”eýÓìœE€3TÈã:ùƺ¨R:d“W9m˜Ákîz$égŒv®«hoô>Ó¦U6Ί¯Ê}¬…2´Zq€uÎ>t¨£ïcÁíAÃêyïx÷²À°O¨j\È@Úl츒}þáåÿ•ìgU² Áÿ½J™~m%«ÃV%›»5®¡VF§ÁIù=k˜Ý…¬‹ù@!ë’> ³®'Zˆ!\¼Òˆ¥Ù‚âˆÒ¾”Y»ñ%NŸ‘kØœQׇ’"¤ÕpæiñµŸÓOaQî_&dD¢Í»„° i¶BCDÊà±&Ï#Ýví5ºAk§¡)n€­¼Ô‚2©ƒš + f²òn3‚0b—ZåâRø¤¢8pXÁµ„ñ×êUæA\KŒk$ß[n×N3 ¦å( 6÷1 Rzò11ÐGä·Ã¢')„H@ö#~’}õœ\ä5èãXÖMg¶2dÇݽ­ T(b6í~G"XµàX«ggŽÔÊËsòØèìÊnŒ?œ'b…Ùrý;—‰c€8¸8÷áŸ}þ¡‚Àø€+VÍA „ý `éF¿‚€ahå €è$2›)­`@P“?‚ÄÄÁÜ&ô* ĸ‚±&v r¯Æï! ˆÊMá=€0{B/k¤®žc`iîÉ àùRgÐb=­ŒçÛ[e<¯³>& °öa<Šîƒ‚yŠ·ÎPÔ‚ŠS–-(¶¶ üøñØ¿¾ýîùùâÕùûo_ðÍ'<ÑœP牸nèf.ÔÓÙ8ѯâ|•#vѵòÓ‡§w„Y?~$¹OõR~HP£}|KOµ¨¼„A—_nÐT÷]$[Ûúy½Ë¯³z#nJزö®^ÞÎ&Úz`ô½;¥Åº]ž7ïj‘í6|XO—ùòJ†"dQ±ŠÙ^ÄBn;¼fj·5{ºÈæGi¹·TÜÉÀËI_éæI²›§u(¸ÞÍÃßvöîtJ[½;4j«w§Rµ¬Ýc½;õœfØ»S ®<-”v6õØ^z­œ•j3o|(°Ãm‹ ˆ=´c¦`6úYâZ?KÐ{úYÂv?Ëãí%؉1®—Î]æË‹FÏ5t0"ÿ²Ñ¯y4]&CΈ—ŽóK´Þs«àÌÔ{“ Ï0]>­­˜q®=¬× â>qÈt a“Œ`nÁž^ž>aì²£Ød{·îùgËj£è¤¨Gù/S®ä¿mÓÊuâv´KƒhG»ùï;K¹TZÜ\îv6¸Á®Ò8ª†Xghž ž¢ëUÎ(ÙxKÈ£œîÒçÜ/uXÕuÆXÕÃ(w(ñÃÆýý¤­÷k¢ÌúÓÖjê—=a£fÚ¸ÑLK³õÝXd?£TÜd¼¾tW»î°›KôMçê½<î™$—ÒLïÇ ‹¡Ç 6ƒ‹¡$zhøj˜’ƒQƒB™;kPp^–]â"íÖzþÚ#g[áæ nÄioJ˜Ïc™]×=ëŽ,›‡-û‡Úqž,/FG#©ß>Ö–Tmð’Ф<Áw$*¿8}õ³ÿP«H endstream endobj 231 0 obj <> stream xÚÕZI·¾çWÔ±[ž¦¸³ÊF1‚@°á9˜[-’fÍŒ’™ŸGòq©êǪê–lȰ…é®âööï{ìÿDç$üÏ»·×Ý÷çÝËÑ Î>tç¿Âûÿb»óýÅæR ÇÓÛZnî¶JlžÞÜl•Ü<¾ùy¿óööj»S=ß\riý'“´¾TÆÂ_ÿ8ü“ð]Á_ý?ÿ̤ÑÎToue%®"ÓH+ÊÓ0Ã÷#øöõù?Ae*I„eƒèvÒ0ã‚4ÿ½}¿ß ‘¸Üüôÿÿõƒå6/®îÎâ'xøêÞ<žÅ™ïoã£8*?øx¹ý1T§Ø±ÁJ{fª”먃rúÏÎŒ°<ÁHY»| 8ë0LmLXqT I6Þ]â¬mx7—î¤4›´Õ><†%¡ÓÌ“°[ ru|ÍÒ¹Àùé‘c>Å|à¿û£r?Ê‚Å\„Âð*FxÊ(^øøÌ¹³$¡×ZLi᥄é꤯êù‡©hÍ)zP›sÔN)_3‚%.¡ªÏ2jÂ?s³#”5¬7J,¸ƒÑi|ËÜŒ;:‡ Üž7¶ÉÆÆêâí àÝNÆÜP—p3)á¿|zµÇB~XÀ-–› Ÿ¸§ ùqž-+Ò¼¢¤š‰TQÐ!–JÞhB8˜1¹=ú‚‘TžH´ÃN:(&B†ž€ ¨´ÇU€áóá€>¨ÚÄ虯œæXW³ÕÑþ‹ynļêi÷ˆ"-¹G5vL+ÊIïzã´z¼`†´ÎGy[^%7«Ò»–:ʈ -¬:£Ò´ šÇ¯ΠÑ5p¤á ÄgOÝ jÝ$Ÿ Ò„½dC?AkÃí˜Q ¶%I—b3MÜÉ`ƒ`ÂŽ æí0Öƒ@¤ÿΩi^OurZ¸Êh2s"[šDíß]Ñ$ ÜÀÊHy‹@ñÕŠÿ ÿ•(9œš1ãLи1×ä)ŽZÄ2ƒ>ž<éž);Kžì×Iž¢´+È“fýaV€}±ÀÌçs§j&wóÔÉÍS'©¾ &þê”B+äL$R†ªÃÙ Ð÷§‰âqö‘Ê”2³ˆªq‹…êÍ E FQ(KP¨>S¨°ÌˆBõ«ÒN8¤/Ц֣§ÊÊÈŸ@7 +©+ÕQWéýÏÀ«ÀWùðY¼Ê š¨ênRÕ?Ýy`¹ÙÿüøÎWxáÙ•°+»° ŠiQDÎU÷#Y•ÕLêSYU2Nr0møxVeӺͪ>ÝEm=ž#î¦0âþ³a„îO…zμ#(öXl7哜ÔnЧ9Žtƒ›9Î%™µ¤ó‰æœ'Ž¢;tpR6¡^4¼¹}©É÷$l‘éÔ»@VvZ©Fª &²iDÝ“Šóæ Yò…‚ȹ¢ŸÔbÅ®øî}caX䆆N. á{n+›Ç¨Ç\ˆªÒU¢n#R;ZHµÉ¾w¤}3fÚÅÒ¶¯µ¥Ðà¨F£ Ø»EÑ+¢ßzµŒýö¸ØÓŽ%ë}Orå^ÍãJ«¾`KþŽ^ÃÈ#°é‚sÐ¥VøãˆRÛÓúî?·±äbiªï!edé¶6[ó’´–kÀº˜„´dÉÒäê%ýûywß1 DïÌ ðY1r¢»î|Úóbルî§îG¼ž%è4OÁ£Hõž)o×m|l,sÉ7 4$;?”UÆ]§ÒMò9ÖÌB¦ÏcžHø ¹d\ø0(º .°?<ìo?ýrõ.>}¾xùB|s³»~ñòõJÈøíÕ3bøaw¤ÄûÛÛ›‡Çà žÂ~ù0I 9fìRO8Ãï£{Â#àžÙ‰©òZøW­Û{eö+"¤_°êÜklÿר·&Ș¦Ûn}õ¿Œ ™òƒV„åy‡ôðÕG˜öév. ‚Ò'Òÿ¤XßÃß—[BÕvmX(„¼±½\n}3ÀÚª#¾H€kc«†MµN …;p»p?F ù8öJÏD^)`p¾·’ªNíˆuW Dk³}Ó •;ú¦¡\(X“VX{¡ U¿úB¾®<ðé0„ž¢ïÍxì}²È#Ψ]Œ/Çã=&TÖ:HÈ^OjV†´•ž„¯‚ˆ»b•€ÎeºÓ$вtш…]ù…Ò‘ ¼eu³-‘üÖéxû™[ÙÑé°ê®Òïˆ ¨*”{ïW‹]ðA|¹œH[™a—ø³žtoBÙ+"–˜–b;kWQ·hCØ;ì§Ì@'«Ö÷_õ¦%FNThKÇx?và*w\L£<‰9Ǫ˜c¹·²ØäJY7XB¼.ÝD—‹‚Ó#º~ ß)iOBÄf{ä2#0RA«55ýy÷m€*Ÿ.ÄkB`)G—»¾±ïÛ°áIßΨm$¤Ú¤®§‹kr}0™<´Éøò”—žÄóï|Ìç à/ÔÀ¡sÎÆÖ—½º4ë„éÂ÷£¹)8ßß{ħéW% £ô›*[ô¸ÓQê‹„ÂA‚ËP"ƒÂ2ænF¡NàR‡ãE îÉ£ûDdâI ›B¢…ާîæTYm 0ÃN¬NÅ…G dôtVËó—ðÞÐz&ºá“­y”©’ùËŸqëpóìi²š‘ wV¨rgEÕ [µ8I>l€Ų̂vºwNÉ;'`iïT âá3-­²XÅf’°nl½4:6úgnrg–Û›ô'H?–Ë?¶RbÍï¯×‘ëÚ,f*ž¾fÈÒ·šm[áü}10d PtzÐbÈyžTLº9> stream xÚ•V[OA ~÷WÌ㮲unÙÑøb¢Æ çD  Qü÷¶3íîÙ£8É\Ú¯_;½¬¹5ÎXús&{ú·æë•y»1/ßã,[ÌæÜ8„ÍÀÉlN?wÇÁå〩÷™Ö1ÒšöÉòíC[GÞÇö‹¶H¤‘N“k,$Y‚‚ "­½j°tò3~bM[8á ÖeFM«÷©kL¢o¶ø¾j[Õr\Øá5áçÐÙ| x8¿H°)RØ8û"±±ÙÉ=ƒ)I&‘ƒ¸ àä¥ÓØ-\iaÁêb UïÇ®­üãó4TC¾Ðk@Ù5atœ©‘ðÅqešÁ³!/ï`ëZtØ|EAÑumÝÌORóú¶U·Ð’¨ò¾iØ•÷m™GÆ™ÝÌ}÷[½ª!x·1·bHæ§qÅ-´€Þ\Ñ>ƒÓí¥94ŸZºo=樂 ÇÂ_ša!6BÎòÆoÖ²Ä9@M‚N^¬ÐJîT š % ¾Mœj)T‘+ñi1D ›CŸ«ÐÑ X’ðbË— É“ˆ‡qTWÝ*UbQ¹ð–sÎúüØBàÌäÚÙ2´U[F3‰<<IàãÓ@^¯Tèà3Qv\/€Â™ZÁÜѨ7¬ù9BÑH<ÉÇ¥íO¨ƒîӳ߅9’ endstream endobj 237 0 obj <> stream xÚí[YÇ~ϯ òDÊd«ïC‚ò#A †ƒ¬ÀZÁHvíØÊJ² `ø×§ª>fŠœá®elÁ)NOwWÕ×u|Õڼ߈ ÿˆ“ñ_¾¹z³ùóÅæñ_…ÙÁ‚1›‹âóƒà,ØÍÅõËí¥ŽéÝA©Óô¥2v§xü®ãw«vVÅïF]*‡Åÿmÿñõ?Ó€/ÿöÍ·_–_.¹´é›IoÉ82ŽÖ"ÍgàøÄ˜ø«)O4ÿ¹ø[ü´¢Í0úÕÅó$ŸØ$‘xù¤aÆuò1‘$ÔrûáçÛ_¾»Ú)¹ý1}ÿøëÕw¾¿‰ËzŽ‚¤oeór"ˆ°µAI&ÍV~“ð›‹cœMsA¨¤¸8º¥L'”0,è,XüH‚ýôövw0ÂF‘¢8?‚—É:/¾NOÜöÑÍÏûòíêÝÛ·åëõ»ÿ¾ù¾¼zýòñ#ñÅÛÛG_í§ÝööÝÍŽ¿Š}Þ¢°,ˆ&Űú=Ýüôá¶›ûr÷d H|ßáû—Šë‚ THúîÜî {ÅK JNNªLæÑ ÔÊ‹Z³j9¾‰¨,3W"¾ãpÞ 4PŠ‘{ÔJz9ëPÁ’p(#h³‘: ¦YѰ¢Ž»Ö:™N|<{ñW²äu;xVõïKð ¼èÉo[ì)#VÆXYK|/û$ Se”uŸëôFõ œÐ±wox•}Žì¼Og•Bâ;q/FC·ªhÐñqg³-ø`…mßËŸ¬>7¼ƒRI¢ {4²ì"{Vìù`”7ŠŒ¬„ðJž…1'Ñ ï l³{ 8Ó8yþ”ñgžìzdŒ£N¶-ІyW:z˜ë,ÏÚ{ ¥S‡Ñ»Åø8Àógq9)Ž8à‚¥:Ûó Kγzà08in¾;$ %­:Éü‚æžY;ñ =[9¹ ÷IÍåYöD%=“ˆº™ÑsÑ»d0IF¯ü#ŸZÑNYuÜcR¦\3ÃKñŠ]Ê´u^K\%ÆgaMù°ø±§æ—Ñ­W뼌¹µ‚RÌKÄÀŸòèOíä-@³0%V@FpR0-—¢¾9õÕŠ¨ï£¾^ˆ™=j‹Á]u¡Ú4hùíTEÓtp LL èöøjž¡áO(¢MˆŠ)}âxº,¤§2ƒh:$81öÄP¿q2‘LóGj=î‰õfJEÌNû&«>ÖŠ¢;k£…1eRXbäB¤ å%øwŽFæ2š²··lðt¿•¹ÉÌ\Dp¡ãú‚ÚŽg:ü¿àÀ/ãÀÿŽ8°@~dDÎìO´b"™:$Su1Qõ.uÒ^õÈ8eq‘¡!+ ‘‹Xæ“È1LÈSÈI߈9\Ý«L÷›Œ5szsZŸZ[\^Q†wò“…™‰,}‚ôšÌçš,$SKû´`ÂŒòˆÕb¦OyD˜x¨*óÚÈ&òIë Ô˜ñY¬ì°ˆoÙ°Tƒ8q²©+×:«ÿe=#Ù+IŸ¢ø'gBîo‰)BìÔ1nfç;Œ5…ké¾áG¼·K^"^b„s3Ød¤œ³· ˜}²A”Jj åC{O†Aï A4²U©q·vÎÏwW©#V¬ë6Ä [7ÌúDç e&ø*_qÐ2lÇú¥ýjUWþ*8'Ž`BÔù§ Ò›¶Ö‰SVæ?uÊ4ÖgT8ÓèÿKAŒ'[¡‚*qâ–ÔÐʹµÁø†y?1þ™AV+—$û"ó9ýÔg8‚Vаñ«?­”æî;¥ìÛÊ@˜qµâŒÀ^ŽPZ µÏTºÓ"ú°ì!´¸¯‡)Y骼cÜÈ Ydk¨5hÔÆ€Dì ç0ÑkºãìecâS±/Ø?(!mY´Ùªñƒ…µè;=7á¦e*‚»!²թ㼚VLÙ®I’*Y;©d³×Ì£¦uïš& ÌïÙ‰ÔCŸ%·<™ *¶© å.¤O•?‘_tîô.m|-»Wõt·¾‰ð®¹¿.´U̦¨)RÖ‡,õÒ'9·âe8Ÿkó¾Õ¹½HÒm*¦¼¶Ñmi¡3è6ÛÚ0y‰·IÆ-¦•–Û£¬Zµ¾d:,åW<áH•'bÛ‘MÈÙúdˆì]/1ð{ÂJ2‹òqªRñ©2ã(ÙI‰ˆ‘7ª‡šEr&Å|šY¥Y§¡·ÂÛVøÑ×yC‚ÓäÂbpÌ=K“3x+'æ|RÉR{„µáCêU<B¼wúÙÐ:l›¡´11”·¡¥—Î`ÙÔØÂ:­*ÁTë˜žàæ 8úò.}ò¨##Dó4éLPw&›+½?K+êªcßW½º}Õ$6°ÎñÀqÐ ÎÌ[ÞëܺXþ0~ bEt¶Ïfð±æ˜'W\b–eBÅEž¾âr{=¿âBÞÕYuc¡VÓ^œÑ/®Ït¢ºËVáˆþNH­JÔ®h”/\–QG/ËÜ^ßû² Lë’'„›2ÝËé)yM&Ç–—bìÂ¥eø/Ũ|PÖ\ЉvƒëÈe×#lÚ!·¼ÕJÃu€affhóö´–“¦Ž:#c+©FÕÍ:O/Ãè.U¼ãk5oZì=Ýšú`ºñØGëžùåŒL’•澘–.ÓƒÝ œ‡Pm\Üfýä$º J—ab«˜¸Ü=¡² Á-‹5uפ\EË.7ÇßÓܯ± <¶mLسԚóÛ7ÿ"!tÚêÁ1醹T¡…Q&’änoÏ©æÃf6ûÝÕñɨpëÒˆC¬ùœ9I…-”¦œç4"Z_#†HY,ñ™GÛ$1›ýb¦Õ OK¹ñ$}¸òQÿô´|鯊iNXÎÝ$ýXÔàóÿ'¿J9άø¶ÖärÛy‚›#¸äGò-d •”g¶ÊkÉ-Ϲ9 £WÞœ¤`Çcq$îyχ-ÅŒJÄË-29=§oVêèÈ C±6…Sò~Í `¬[¼ðѺþº˜êÒˆÊÂQ*Dæþ ¥fN|¾¯öù¾Úçûj¿ñ}5¢Š/ßän$®Sç@¾®s7ÈKÅ[“ã5Mq5Í×&Ÿæ,a|.ü2L‹¦"§¢Ñh¬WÜÞl.ïSh´=‹nÏBcº†–sÚIe¼†ØÍ¸dŒF¡dJœOãE3Ò¸I%Mb¼g ¨:€>#³ÍŽþ\Ê‚ŸÓ׼ĩ׻šâOK÷¿8Ù7ã“ÜpèWõl6”}›Ñulw¶–Êz6Ü„¼øw²ƒ%&¬)Ìõ°èÙŒ‰â«Ùãžü]ݽêú¥t‰^\Jݧ!3ºÕùŸ¸Wþ'œm…ƃéV½'/·ôÅx—¾q™ùT^®VÙò7!þr±ùûþl k endstream endobj 240 0 obj <> stream xÚ½ZÝoEç¯ð£]âe¿÷N¼!ÊB¨¨Bª«(4)4Mš’–Ò?ŸÙ™ý8ïÙç¡Ö`ßÍÍ÷üfv®«¿Vj%áZ åêÕÝê»óÕ7?(µRRŒr\¿†ûÛøÃ¯Î¯^¬wFa…Ùl•²~jµ3^ÃGÂÇìŒÓôÛà5çv&Äëj³5ƒZã]ï¼òüÙoÏŸn^žÿ‚ÇV®vÂ’{Š mÝD¶®X ¢ezïH¶q•pe¤ðtˆÂç4š! Šò*Šƒ‡0Q`ˆJntˆ 8RZmô¿C`eñ)¢²ø;™œ,™˜T·øÉßåY¶W¢€tË B(› Èé±Zpäȯž(}ë+ðmôÂVy%œÿá›o‹yűІ:Ö+ꤊƒ’¾.Rk’MñE>h<ð#Šl£b—Ð59ß ¸ eÇ£ìÁè›È@3#Ìn“ÅËümbŒoñè"K®IFé*µ$F6òúþúSTáúsOO”µLO»Ûˆä}åÄhÁ÷C Á²Ú/urܡݱWbh2œ=ƒÞåŒb“8œv?åRˆ^Oª#ˆž^ÛaÒÕ¾y÷q³uʯ?]Þ¾¹ê¨éPžRCºXk¸Þ—C¾Úx7Å §®fŠXÍž¬¤JÎü<æ{ù³ø˜^çdb&ªN-RU3_UªG÷#‘&RÚ-E‘ô½‚ž@Ѓ`M=y¸~ýá}§¨¼R5E¥Cê3É,ª=u"µÍÈÏÏrëòd¦ßM:F’ÔR¦¶ÅŽÂ3*Aœ•Ö_3¡® ½0lÀ»žÑÍx[°º&Pæ‘Ï£¡)ê]µNXÆäÆòeG|É0J=Å-mµ…â4Ï1wÕVg˜÷#]÷@êŨp˃è§û7WþïQ»¨Ø.n¦~zo„õ“Û÷gø ×Uxˆ6ßv\µ9߬ÉädQ`yO§uµ‡ó‹7°üd´4-ªvžr!T{2]c&wk;Õ¼…bi’ï6hŒW4W\š€YÞÁ¸œ5;4=º` Q0¯ð Ó”üºì°Ê",o4í‰ië0AúXk¡Æ“ÃÓ $4—dê~ •-µµ# ÊGÍk֙ݵ,^²o6Òødwï]m¦ÿ‹Ýw’ÔÝ}£òm–-¯Sü\ª9·åmöns–ñôÈ0ëiÙˆÔMæ& ®c0îŠù,H›5/«Œ¦à„ÜÊs=ìò²Tr=5Óp–fžÊDÝ–æB^Í'|'»€,;Pì&Püpýáúã®áPeÄ{3‡/ÙÚ@ˆ™g:®'CçŽëÙñƒ<ñpÞ/Ú ÞCÞ+‹ÿ„·Á?áñÉ%oCøÂp!‡%ÛW±ky¸ÎXPjü†À—…;: )æqœgÖDº…û™´Ï'rÍ=§@.ÆÉ!²÷&#øÎ› äwdšÇ7ô*(={~;4àZégÜlŒ•…U™E#;Ë-5›tè ’•ÅÜœ)Ïzïrïg<ë6Ù©„­ N›ý˜Ò2nóŽœ6Ý)ÇŒ ¿z?Nd•Ž«ºv±þ×}Cè`¯Ÿ`/44oÖ—·irqÓpÃMê^!LÞó$ ö®¯Ó­ ÇòÀ& @°jãƒ}³· ‹&ëúhÁ÷úS1wúžá³ô6¬o¾ŽÝ£áØ.†c_!SzÕBq““> stream xÚÕ[[oÝ6~ß_¡GôˆáTƒìCö¡X,Z$â ÈÚî%°{m£Åþúå’’FçèØÉ‹¶Ð±Äëðã73Ùî®ÿˆÎÉð/ïί»ïÞv/¢œ|ìÞþ¾ð‡íÞ^¼ëÏ”pL3·„в¿¿Ý)Ñÿõá|§dÿ;ü~üÏù‡ÛûËÝ <ïϸ´ù—ÒòL9žâL{¦,‡/"|1&¼5鋿á?Þ…§é”6¢”v©´åéit~šµÒÆ–¿rY+ã[ïtxgŽ2Ž…§þq¤Fåñ™Ýû·?vZ0L¢˜1Ù$F¦áX…M‡Âªí MÆß<6õòeKÒ0Ú–šYÛþãæa7aƒ¡ƒ‘ÏÆ=ëßüôË?~‚/®qu»O¿ÂË7ßç—÷—ûTñüóÍýCzyñùñ_W—ù÷»—/Ä77Ãõ‹—ïsÉÜ—ëo¯÷qx²Q´S-5¥¯þ¸x÷þl÷*Ïhl'„-8f?\g ›jmðdƱ®—tyeào0š4/­d\M5}ƒ¯ÔBZ5hß!^än°| ‰¹÷ë?£Eô˜„´ã†^ÈÈ8Æ­H¯ýl@z2»P»6ê H{,'›ršIö7ø ¿ëαÑÁW _‡€ö1–ø'Õ“gÜu¥ÈÙnÙŠÆVT,rGÀÄ3á»R(웸9-.‚M; –70|Ãw&.Ô’±ÖŸÀÇäjsy[M£±þŒ&*-–À’Kâ†4Ú%7¤º½bJží¾¥VN8ÁŒTa’í/°˜+¦lâ:…Ô-—k¨ÝãÔ…ùþmw×1­l÷g'¹ø "t"lwÝI!¡1|qÕ½é~ΣԳ}š)—Ö” ³ì>ŒÏИÌÝÈDâÃ×»A:×_$à*Òd78&SŸŸbK żÏp—+£I_$M.÷À‰B0¸ƒ›wŒ‹f|ƒ ƒ[É´\5ë“=X³Ø[&WYb'ö¡¬¨i$aaEÙX™póX–âXK"p—-Ö²ÙÁqÇY U ŒÊŒÀVS4æpg *kÏ‚D%Ôd)œÏA¡g#-!+q”ÀÙÔê6†Ê¡q㚉ÇE’õÂÀ›ô°øØSíKÇ\Yw! ¦z€Gw”6Ð ¹eº…ß7„Ó+~w-W,~×äwK?Oƒ¼ aGL¢¢ÏF5›—ñ4²§ß…?Ó4SSÐè4zDc´UDc¬O¡Ñ¶htêd4BÊS‹º]¢èAâR5öD\2F£P2…( Þ<’@ ü]ÐºÇ ·Ü!m³ˆÒSµÐ29p&E¡3:&7rŽ a‚—<Ô×}LV·U¤ï'}Q=9'#hî¦tñ‚°o0ŠHéxL¶Û]TÒð(54H1²Ù‘ï¶í¯Lbä‰ßg4Q2û"AQ0דN[¡i‹†ôœK¹ôK:$“,ˆe½cAa$QÈ@ˆhmZÆ)Ÿ§"[ç\¢-½o “ųÂdá,3îë‡É[õ0½jH ji)Á°V”tÈùƒ' NÊ­2ïgÊüãm°œè/>>\~øíãõõÇ,Igež2idÅF5M¥¨¨·ø ¤×¨7ˆzQÍg:‡„ßÄÖó’¢wh$3Z'SƒÃ »^‰î¿ˆâId¼­¦:Eg/z8–*Òý]~±TâIýáߟÿ\Šó+2þÃùç«XŠÑà=ø°Ã¼rü‰¼²ãF >õQÒ×°€ · ‘ŽKG&%HÌ:¾1S˘¥ø EdšÓ”alS†°7WSíž’µžš5 ÚÖ˜î¡^1éÎv%¼(ܬ$$n°Å,j}™~‹E³k+ľQ|ŸÉê3ñÝ.ÝâQá]ÞéC¹=VžS=‰X'&¬G2Ñjú-ÅÜõGç›ò/´”F îéMÝLðY™OqúqÂÖý%£GÜŠÑa’©ÿØw¶ªÓå­®Q÷ühf-ý7¥6ÞHoO9ò±³ÏG²®%¥“Þ:‹ùR…¯^b²'d>çz‰Ë6XÇ©ýhB„læZõL#nD`M2ƒ¬:òíJnCn¦UO‚;Uç©õ,^ô#/æ/ÇðÇgÆp#ÄV_,†ûŽê$ž "uÞ’1œkb¸}™ºÄ€î³0 ò=â¼ÉGL£4RY°_ŠdYêQ!B ðÆK_)Â]Í8óâ´Ç[‚ È-d×áœãàßk§[¥Z˜‰´VýO‚s<¬ÖÄauˆ½{ÚMTÿFëØÈ9a›Fÿ<Αl Ñ›zÇj¨â…•æ ?¥rÀQ±dYÞ2i‘ïy[â ñÔäb«Ô#\âkáÀ¹^’DÌáŽ\-A.E^g¦YÉÕËk›Xé;Ú£ks„•|U 3+)û4VŠQ\Eñ6ZRs>Ê$µBKmû×kí»†‘”i ¹'IÁ*î‹%FÊ<—•Ò(HVŽBð7¿;†ÿÁjÐt”œx£7j­KàåªY*}HèÖÚœ&t7#8õ ×<"Û¾fgyü<@Õ´Ggô¾LÂÕO-WÍObÓ$L_ž¸¿¼šÁëÂiÍ’Úò’õËSO9'Qœ8k®7<ijóêÉIJ½ñµñÊU„s«¡´kuôxúº¹7ÀZpå7ß&¿¤£.qø:AL‚ 7](ØtBª–­F³&/pH`}©6I³õþ> stream xÚVMo1 ½ó+rœAoψR9 EÝ‹z [ DK%ÄÏÇŽíLf;@Õîf&±¿çg̓ñÆáŸ7ðß™/ßÍ›ƒyõv1ÞÙÅ-æp‡Ë½s¸ý4cŠc~òøùðí}èülcA·jï¼ÚDv2(6d5¤Ó©L¶˜©ØÂbÐ'6g,È&¡ŒS€„i嚎™GLQVJÀÙ‚#ð*=¯«If“cxd¥q²ÛX^)^bHÜiìóà]„®ÂqŠxg´Ø£/„Ù&ÿ”¿ŽŸlKªÐ÷?*¦Y4l†’93Êp^ Ú,èP$~/nÅLÏÉ bü”8Îq¸ ÷HîuÓ¾¿¢y^~»¿à'œ¼¾”I4_ï°‰®¨ ä(d¸¤]AO® ºÛ¥<óvIN=U¢Aä–E ÒcœÿNpí.Á-;ݽ‰Õ]hà+´¶\x³²uVµ¤þR»–·î¶.g·5€ôYŸí’¶‡$äºik!±5‹CÁ*Kb ô8‡ÞrW\¨ûY»ïã^ûõÞ†Y l]_›3å˜ìÌ¿UÊR.æÃ‹?Ûàn5 endstream endobj 249 0 obj <> stream xÚí\Y·~ϯ˜Çi‡æQ¼98‰ñ ‚-˱•µÊÊ‘_Ïbû˜=$%6tLO7›GÝüª8»7;±ãáØYþòÝ‹W»OŸî>ú½Ð;!˜×z÷ô›ðü(8óf÷ôë/ö—JX¦G!$à¸TÚ×®:®µºTÇðßþ¯ŸÿüöûÇ_ÒK. ^i|K†–¡5ì)ôÀë“pxøgÓði°…N­´(­tx ßKŸò§îZ?{úG\—ØáR¸Ïë’šiKÖÅ® äþæú Äþ§ç/Jî¿Åëÿó¯ç7o¿Ã:^€WÒš45#3xÉ×81#Ó=\¨á›ß/?=Y[¾ç._i²|¡™‡H‚ð$øî‡·‡£&,>,üÛ¼àKäßgŸã»tu}‘®rc»¿þöË›—éů¸É·¿~ýãWW/ÓõW/ß~ùÅGÄãW>zvç" ó"È•b(ctð7§Üä{µÓ=~ûâõ鿟ߣëçß\}ùÏ‹Ák¯¯ž_÷ï4!N'ÓZl5˜Q¸+.¿Îtõ„¬Ç²4[z»TšXDÑ×I|faÐ!i²áwd'²Tf-O¬ì"âöéñ©Jb‚â´0õ¦£XæqÂ]­³nüZZÞ‹KÐümiÏí¸.(3 ë+s?ü¼2¿Iøc«$üÇÈ…c–çÆÅ­6AîgÆaˆïïK I[0 ¹ÁOå9ì,óŸ|zÌøØâÓÑ–I·«M.§½@é%)æõ@ÌãjW[\î3‰€ŽÒ¤ªHRJ³0Pÿ¨x¡f”;>¡Xærüíz¡bK–>„BCzÌÃð"*i&²«¼²\Õ©Q°…m¥[MHt>™z‹-ö‚}D³Œ—êòÀ’PŬ ¤tL«jç›ðïÅ4XߥԒÌ<ænÀ%˜Ep&«'ЍÐf[=Q)[ž$¦‘¯­>NëqcŠ®uAT*ô¸“ü2u¶v_ô»q½XmrÏU‹:[-+ó:„­ Ÿù—º½ÙI4é'œWºÕÆ~ëË’³x PE’°/Ù– Ä„µYµ‘ç LUƒo.Î/ìß`ÿ!¦X÷Ü©õEéÔdåˆj Ó¤«ØŠvIŒvÛŠ¼¸:`a 2@Sñƒ*~eÒª00;‰-/J’&69iñ‰L¤‰Ï"<1†Bu•»£’̈ÞìJCõ‹9³“Ì¹ØæåÈ23åB8Sš\šUŤ¹wãüݨÃ@4ëüÉhA!¾Ör'%S)°v% ñÌÉxçI L‚SJÚ>&¡e&Іãÿ‹~Kgû4&~8ÒÈŽ‘Ê5ÒŒ"¨0hµ£ºÙÍG“ á«[ö‹Ñ”ÃÖç½ÈÄQZ·Ok:zδïLË|G±Ç/<”³<üÍP£^§¹ÖÕ:ºAð†‰nïsÉ9£á‚â+ŸûúÙRùÉ6*÷¬™DOL›OhLù¼96š?¼’©E{!wµÉ¬чØ->|H ŠÛâC`‘4[|ˆ]%¾û#™÷ïV9Ôí}ÅØ¢aw`¨ay<²?ŽA¡ÌØèpÄ/øÏ„´·°î¢·;ÞOÍùÚ"ošþ¢;÷Èà'Û<÷7LCÄ÷ @â Úæ5ì·FÝ:tJü¡åãvÎ×w$ÒD<æXî™\åøûŠTVAéeE2.¥!IÄ \Á ߨŠgˆ„78—cé=Ö¤Wû †1A R‹ó’òCÕøÀË/zÃs1ömòƒP7Š•L"… ‹P4È© !…±F&¢œCТ–Ö±±ˆµPÉÔ;b Љ­`Tj@Õ‚ƒU ²¹ ƒ¬Xò ™žü‘`ŽS¢$ˆg1ÈØ1¯CL1ÈÜÅI&|™Áï Ò ’¾±Õöø‰í™G#·Ù¤ŒQ.ؤ$ë(¦ØŒbÎÎ¥²!•€šêHž”d)hÞÒ¼QjaËò3ºm{yIï·,øæåL•´œµý90ö£¾4ù¤ø™aL('}Q3.ìÚŽ²X`ÕÛ>ß™G¯[èM¢Á”WÒd)C ¶S Îæ ¥%ŸÇÄ *™ŸÔ‡µ„E"K¶’·¾=ÐNðêÄ»'© ‘ù—Á|¦qŒB‹SÒâÙÈMyŒëxvRa ·&F>Lù¸ !ãžñjm–†Hi©šÏ…ÞœD9U ÷/¤½($1¶&\sljڎ8ƒ2DIè5¢ú…$² öÇKÕÎÖ;kêe ±NÓÌJУ'¹ÛXY;]7ŠT± Ñ^¨æ7›»»fVZ*çݘÊ-yËNßiÞR¬@ÁyÃÐòýЛqrKe?Œûð5„圯¡¯†P(“Ó¯5ž)¬±­Ièäå$ËU|Ôj‚w ï5îü6nµÆá=Ý\ÿi4H0Zö,¼òÍ€€•TµEN¿+oÑÃÝBŽe/ǦÐàfX ÑÄgž÷Z§UMaIÿªÞPÅÀP͉ž˜4­¶JOl¹YzôÝ6‡ ±pñ¿'=W’Á§­ô¦] |3ž%´BgûÇCôSšFÇAW øf IôK³?©·dîoóþpüqèŸ[è˜tÆäM'Q˜œF)§% Ä©¸s•³>–ºð,x! .IÜJ߸%0\·Hí>¤þ?¥Ád«­Ÿì¹/cˆ‹+ e¼‘Mc e¢@‰¾T-9êJ<½î<ŽÒ9´z}4y‹/ZèR •¼~à]j¤Ò†g¼²B.åŠ(~2EÁ’>h&JôÅX|lƒ —ÄÇ-ŠÙÕ&‹8¼š‰©ßï}s:Šfj8Šê}Ši=MÄ´íZ`‹žKÀvÏûVw ct@£ --o]…§dŒØ[’Ç•MX«ƒ™B¸½®À×Â.À­Ë¬˜Ú †öVbØ¥rÀ¨:DWŠc«ÛB 6©fR¹œ\+R®EusÐ¥æ,O|°ÙSšÄ¤pЇA4£µv³à"qmSn1·Aû¨µŸ–Œš‘l#ŽÉ­»=©ÒUkb A¶ çÄ*£WJÓ"ˆ£Æíþ#sm—yÉæ:ŒìÍ8Az$#ò{Ñ‘ñ&õ²a ‘öUa26½@jQßÅ–T`U’üpÂXÚTšq*»ü9XSÉXÓÎÀš®bP¢3=¬Ùt©m³:½”°F0Q5žxÙ_†ùô¸e3Çð¥ÅT<b|å@ [¢ ƒÛ×Ù+VGOgsFLUxmm·B.C™¡…¨ÜÆoŠ˜·ªÌYY A­©½“3Q2lK¿UZÙKÞ:Û{°Ä™"¢auàÃý…¤g…®ß G¸Úf^ab^ÝÀ¼Âü@®1øÉðàšbVåd¢ d•ãYà·¤€rë‘¥Tƒ´ÏÍß®2¦&­êª>Hö³(ÛOϤô‰W…Ôyïñ0hVŸˆ¦+†XÆqgéèšò®œ¡I/矔Ñ>q´{&á±%!o J dS¾ÉÕÍ)=J1ÙHŽ6au?H¶Œ“­‡êí°ä²Úámx+‰ßz[쉷y}5BÜ=ÉàÓ:¡®— Ê®u"½„øYsn3}¥åsnªDâøAX¤ñ“ š%®)u³ž¶ovŸæšÈ4½SüE:[×ï”R+AG”“ÓW¢GŸ‘Ú}º?‹IQ³R’Ú#ý´S^x¼)©r¸’qö¦?Û‡.?!ȞͅO†ðoQ ,*.(úÓ‡1¾‹ç>%Íðôû•v"Í/úÔbXŽ¯âŒ˜£¨[ø•äú¤¶ÐÍÖÒTØ\Ýú‡W'Ú£I!v¨MÏ`4†ÎŒrÊÂü´,,ìÌkP'Õ-£"ËÉÐɵùèÛÝšMh6ã8-¨·Å®Ío``ƒœ•¹ ‰ Mv˜Á…Îq¿Qx'ÃÜlà÷CY©KÁ½°$¤Sœ[äWhÅDì2näâ³ÕŠ aW*&ì~Îà ¯ItxŽÝéK]¹UW$[ÀêÙ}rlFo,xj™Ý2Ò6DPoB{båHI_IÛêý ÜrAC—@‚ËE°¬TmƒÒ'uúf\T~Õ«^fÈ¢Gs2Ž™ã‰W) Y’0©£xü‰zdKŠÂDã¤g…^éwâFF[á«Q¤þh[= hÉF¡-qzÐʯž»Á÷öå7ÐRE‡çE@êEÜ-QuÎafX<ÕÊ €˜ŒˆM÷÷t÷ç_ý_O¤ endstream endobj 252 0 obj <> stream xÚÍYKo7¾÷WìQr´ ßä¢hÚCQ-êC80'©]8±;EÐ__93ä®(ÉŽ/†-ˆâ‡óøæAîp;¨A¦?5þåpþqxu<¼üy”“œ†ãéñ?üpüîõêÄ8™>¾×£ *Íx‹³z­=üVå·‡9b¬N;üÀœƒÕ2QÛPf­ÄÕž"¥„ñ¦*øÒ«©=Ž g;­u€µ¸.ø|ÖYXÍçßë ±ªêÓ,b(cZTùÎj^‡ 9Ë¢¼9þ%™P鯆&ºdG0à >n-œFÞâsØ“$ƒ‚Z–ÔCÓ€½&õÉYN7fþ£™ð•Îã´Ü›µs«âÁ`‘mÚ&®Šru,Ö£±à‰;’Óˬõ(›ƒ™Ì’¤“Õ†N1½-3${v­!ýªU / b?8âpó¡Ý~ƒ¤$Ÿo|¤ˆÿ.HCòfH‡¼J\ ĺÕÝU4ä‘‘aÑU}´êÇ MèøJÏíÄੇ§£~Ê¿õ6‰B†INÖÛ\,q1™ä¶ƒR+œ˜"Žf…NððK¯È%’³ËwÍŒnÑH’Vì ÇöqìË:29¡Û6莈îºëƒ‚½cSíH#¹p\ì;îDJÙ÷Œ%ŠýÒZ}¯A’š•'ä[vFª7h8J¡Õ¶°¾„_D?õ-’½´H˜a”ÑÏ3 Í–·)ÄÂ<,¨³L¼´²ø¼z°VZåPÉYÅk4”zµ4K/Ò´ö±O¥Ö‡8a5RlZ‹zcä#Š jà–\¾qÔÊCÄ* gÐ7Šdjm–V½!pyjùÔÚ‘5jkö&W€¡µXŠòã&«S[Ê¡0YWiAg0âu6L‘ݸ֥ ¦“¢â{úáêìƈhªW‹\b\-]YXØLLB @j®(„ÝŒ+1ÆQdçå(¯¥½²U©€ëIX·(àÝG&Ïh¦2¦é}M#ŠC5 Eì$-•RÁ“jV̯z›¡ãÀ$¨Y½Î* ¯jÍÂþÅ‘s)Lsù íMA^)({@ö–ˆÂ¶'iû·?4ºØ•QLÔ8^ÝŒ?z_ß¾éŨR1€3‚¬·bš S)CaGq†IÉÖ>ÊRZ˨` ŒWà‘ -¦'ý\7iãA óœó²dõʧmšlá6­à0޹Èð.ªÒκDË´Þ¯¦H¥æm\Ê!aâ$)œH;)eõêîfØ}==_§}/`üå¿Ï§gŸ?_Þ¥­¢Ä3Me#åT¨È=ðd—83ã£Ì›ÊE¿šÚ™f‹lv,J§]­¶^õÀ«œ˜RxêôU¢ïòÓýztÊ'{$[\Tœ¬þüý¯_‡‡autu³)#¤«›‹³»÷›²öüúÓN¿»þòöê}¿}öúå‘zññè囂ÿTSÞoÐÏûßn¶Üáó÷³Ç÷ç×W ÿ¹|G¥¬l:Ë®¯No.ÿ-Í:ýJåª#QšMéüûN¬¤ZZ#इOll»òðˆþÄfDpzäS?wÚxüÃÃp?ØÑÓØA·qOrè`¿êùm%ÍJ)‚ZI3Í1loIÛ{ s™‹ÝwY sM³(+e2ißFÔ"í/üOþΉՊ’‰­0¹}0zQðfVÄþ‡K%·¼RSúTáXó74škžÚsV&ÑÔåqVö¶i—,ìˆ[â±R"EäT&¥Še0!µ=±Ô”ÔS'æåNpA ý·ôü¥ûõ’»_fDpÆê|ï,[ ×#˜Xq™rF1Smh:l¢ˆ¡2Q.Zžj‹\4a-<,©‚¾!®ZÓ>ä¨ãl=¾íõ`è^b¿,0ËãhãÀlU†&÷>Œ»Ù}V¡Qõ RNÕ|Þ!èÞQ/¹iØjg›}w4ƒÉÑ*¢j ½»×qVH‚“YMÍA´ Å꣞&¡ìö©ñ@J=—l.8kži|§¶« óN5Ç]n²âб†k\[²ªÅæ×…{·³ç§;ÊWÆó8T¾ µ rY‘–ý§ŒÒnßÈdA}s;çÎ0¸-O8$Z0zfõ²wv‚Ãl-¨&¸y‚@[í„Ok+®™®I?²‰™öÞ Ä¶àéêdNõ3s)…U|;¥|OÛØÓvf3L˜ä‡îNJ8½¿s÷ز¼èñhŠNÃ"°¨J YUÿ5˜*ë?=AŒQÆgèm‹ÂÇSQf{v3AMÜÖeꫲaØÉ›p·)ÜÝòÏŽbü¥t[ûÞ~ä’µ ¬‘{B žÅEž‡‡€vQøð\BÀ ¥÷…ŒÔs‹/_!=—À¶DéožRÑK'”ôP õÓñðÇwÿ…õ¡ endstream endobj 255 0 obj <> stream xÚÅZ[«$·~ϯ˜¼Í3²®¥î5yˆ! $†lì0äøÁ8v‰y,ùõ‘TUR©[šé9»^ãË陑ꮪ¯J}úÏÉœtúÇœ¢MÿêÓ?¾z>}ñNƨ5„Óó?ÓïW£Õ §çüýüâLTp¹c}þà_\€‹ÓéÙ§gppé9¸ýåšþwþöíwo¿ÉKþò~ñ¢-ä§êô_Hm"ÿ¦Ïàñ9˜ôlxe&_ÈÆº7¦oó~K:gó³F^üúíŸ/ß?ÿ))µž²z%lP!Vs€´Óás¡ìé¿D9º,Q¢êàLßÂÅBS<©¸ ¤xZR/Û á@ĪïcÙncS™1Ž‹$N¡ U¦qGµú¬™âìqw–³p´¨.˜kc˜EËvXÈÉîÙÚ9fœÊñSì‹ÄMï3¡0Š<®Ê>Sù1;ÒIH+Üá%i(zÓÊ´ õˆQ®´‡ìJTèæý…«Ãç¸3Y¿Ø#Æ7EgÔê“Þ‹ ®èm’>."¾<+aš#²ûY1O‚•°¼;ÊÌŠsþ•6gÓäèÄž¬LÁMàcƒ8úpK‰ÝîÛY-’ù>DÛjÛ%œÂ…ÖvaMfÂõ]fd'Âc¼Õ8 Ø–6QVœ®vÚ?.WˆhÌɰsäî$—¨ž8opæIª¨{3ÆšGFg“ê,3Á>3Ùû’]§y Pñóèü™ÄÀ+¶¹u9‹s¿Í­ˆ2nåV\a+õy5W=ßÈ.ï‘wS˜R]ÄÅ]«QúªÀ)»gI‰’Þèôß g}àüùhȨ%›ƒÊ•@úðY|âåY­èZ•)⸙z5jŠäsN8b'ºÀ‘¬¤ØFï£Óìk¥÷bý¦îÀuÇ9¶;»7ËèEÀKh† ožÞ¨ÒÓczçT\EŸ¢LîT¼ýæ–,Šq™ÂuwúQN:ýnÑ”¿pÓ42@_nú´bÚ·,¬c ´µf\®÷ Z5ÿÚ5ºÅ!kÒe¹5h¢cº%Û­›~ #&ˆüµzƃ+È!êU>YûfóóR€6»„Iœ[•vÉ2}Vš¥\jãö¦MÜØJf‚AIS ¬B^{•ærd=mŸ‰7¬ƒ¼M4*ÈCÿ?^åĪ)Vð·C*‰ˆ¡?òŠjùg¯R—ï2x&éCK>Œe ¿Êžv2Ä^†«Q€†Ò¼b$¢ŠÉ¿¼ä×#)’¡RáG.?½û÷H«·¦ryÿ¨¨PžE9"Ä+ëk€˜8âº(Ï¡øfÄ×µP5/—…t¾½ÒKú«óÚ¼òë‘•Ò“,¶þ^@üîÃJx TûaÏò¯™ òíˆ d1ë’Ö ÈV—¨ø^ç¾ÍLÝÞÈÂ÷›ŸÎ•aäJÛ…¿[£/‡½@HËgì üÍ^ÀµðÍxEM¾^íº?å—­è¿„ÇÃÀãkïðµs8ŒÆIÉá ´1i °[Ë•€’"!ž’§Ý¡‹‹õç=ÂðZ ³¤ˆÆFчs»û¤>ÔÇ{P¦cÔKl”[N9l΋H*YäÅ`Î#ƒ}]¼Èïp ¿ãŽÙ`V^,•¢k—¢›¬ºÔ­ks}Òâkí+¯XÄnËO÷`­ºCPÂ(.ˆÇ5w°ádìl¡œYƒPdv]tH²Lá©‚„ œÝãÖšû°6ýöfœÉ¼ZpÀî>&9‘ξ§³Õ,`®¯+=,`®sîðAÝÅûønãwD)ñM|ðÉÌ;©æ!뾋UÛݨÚ`[Éý U;Ü­Úp¼jËæÌá³…¹Ÿ6)dŽTm›Wh1uk—K6sÑ…ÛöÒÞ¦š××)ªæý± &Ÿ˜Ã7¾ayh  x‹¾s‹> Wî}>‚›Å‚}ÁMba‘Œwõ_ŒøŠep%j „:r·ÔAÔ«q]º\½Ykî¹Ô€íK¬õM³Š¹u½û6›{X3E”{WÜð­Àúy,ªž˜‘ΑØÀ—ÃÓ(^’C!·5ô3‘0y]ô~›ß¦tz:_ìÚü;æÏëÄþn†ÈÀ ÜvŽWÇÎ5߈ÑÊà5 £³I\=¾C^}¹¾µ>Ï>nô0iŒÝ¤1þE“†õ(ezç÷Iý1ÄŒV@‚Ÿ2ÀíK¿*ôžu;Ý«!Ž÷“zûð¸ºÎÏ‚œXw¿@û%Ò=RȶWçÛûBœdËp¨‹¬/Ê?tÏÝÕ€ç)¹µK~1'ã0ïçD|mî÷ϧ¿þêÿ’È?ž endstream endobj 258 0 obj <> stream xÚÝ[K¯d7Þó+š]·¸mlWùq"Í"H€€,¹Yåf!%Ê ±ˆøõØe—]vûôcîÌ ŒrnÛU®—«>×9üó`:ýÏ‚Mÿׇ·ï¿y>üúwÆŒV›ÞÏ?§6<œóþðü·oŽ/` xý.ÿÃ@—þN¿aþÛ•ßѩӷÏL«mb1ïUÄD²¬£íél9–YygO6ä¿}ZÑÖÿ¦Õ¤ÿº×n2ÜÐ*¶W޹€eýUG·ª­|’CÛîDÁØLÄ– b¨)OC ä8èxU–9a Õ‹œyF`=2{¡Ìâ"ÖÓû³¨ËñGæ@N«y™¾ó¢=wS¬ÏT„àN€¨zª!óç˜v¡è«IPéf2?Ùp=²î„ÇÐ蕘²m£f £ç.¹ºÕVÛ5:Î}aé×ËPìÖRåvNìwŽ2ÏsG¿ôuFÊZÍôMU< ”D9LºÊ¿SVþr*Žb<¼QWzôn¶È ¿…>6$_ ˆaú,b(³ v'X(x) Øæêê¾oÜô{[I“ܵqt[Ôb‰òü”nhΙ|5šB;{yf,lí/S ŠëÈA-ȉQµÀ­7Ô)ÀÖUhÞôJµóPÔ”y9åc±þ•­Œ™7]0Ø‚ ¿ 8Kb+ÖYe>UÍ´ä)r ÆL3ÄfûŸ-“Üri`Yüß«„ ©›Ç7™ÝØÒ‘Ÿ€±Åç=¯¼IŹ–³—ìó/+v¶œé´!ë¢;=qÂþv•­û¡YýjGrö}X #«™ ùØTÄʵË_.s:ÈVT¨¼ûþË:^7/1Ë6ð—ijŒ9³<'£O¢»•õ_Õï&ô{3ÿ|AÆ`ÎtÊóê䬡xX g_¬¤›žÐ÷|oˆì:îîú°ïë ЫôNˆýÇuêïîØƒ½º‡¥¹{0pßXX?-5nÙÚlÈ` ­t\$,˜…ÚÒ•°® ‘ó§ÏV„@i~j60#£.¦ìŒ1W#µt¿ˆéN÷=cœ± ‚t‚3nÛñ›&ˆ‘žÉ‚z=Ÿ] kî´Š™Õ†q¿Žæ· ùvY;ê£CÏ@I¸eÅ‘ßÞ:õç~¡qß©ÿ´°VÚ?îsUG£_­5jRèÞÆ£PÎB©t>ÊSQÀ˜¨„º¸kZ5¥\%ý®I³ã2½×g}NNÅhÖÝIï­&"zÂë|+}Ÿê J¹Æ)T^“­"í0ÞÉ+¶\íd)„*ŽTTðÚÎ?QÁàD>i9Ÿ\•°¾f›ŽUËå´oå‹i……ë^jTF hŽ,ýƒ«T°4 Öœn‡Ë*ª÷¢8±‹ÙüP ÷2x®×ÙJ©RG9x”˜Ž,O†«Êêi|»Ðµ]åKjW×…K‰Á¡*^àèÅïnú•€÷ŽÃî6Øón‘2Ó‚xoµ)@"+@¢àºb20‚m*¢iNûá2޼ñjižM„q•µ‰«‰cØ TîÂËx~³.oñ¾Æ™dK®™~'ð—„T©¨µäÝ„ËH2ªÀ; !äðWHÈðW&ÞU8ÓäR*çLp×ðdÃîžV€tN¬T¤$HÈ`LC°XF&hÄQ`P­)tG_ _vÔ8QÖK»èµ¹çhÙ@] D_ G× ‚èÓéÇnšÖ\€ éßiÐ*$Pö:.°M5ãxáD‰~Š Ð »Sœj“ïœÜ6¹’§œ I¿]Ôù*ÚZe ÂeâsÖ¶ù‚J–ÿÃJ1ß ¶!’q{…ñJ¿¡u*–î‹ø(Úp!ïƒáb÷0´Žb6|\nãðqq‰0á\¿ü¥cd Ù -Á¦´©k òع”æ=ýPÛ·v®>eKÄçk5 Û´`°Ÿ ›l ñÌÒq»ÇÔMÞÞ¹ïoÀ/Mð¹´ùd†²­U’/›·s6ߺ߫†Xµ }„?îÄÆÄè:6Æk"0ÎNtÿ¿1YácÊá못áæé§uãFKÕ ÖŽ¶XBçeǨ݇3j£w3ðù9ƒá»…|YTS2™R{mÂS}Ý“L6$™¯Æ†(¯òUæÅ}•®Ïómº·Ç©ej¸âMé©ê!FT2‹Ú¨bè-wö&€“lˇUâ6cL‹[Ïš< (%(…+e pâÎkbÓ/˳ökáÚ›9É. oáW­ä}’àʹ­+ P(‡Fy›nÝŠúøM¿:k+Üè † H¥5RÙ¦úæòcg‹¬Fÿz›üÂ5‡zã‹ËHm7pZ_»Þðú ‹.f*nAeÛƒ_N¹ãiÛŽcI]ëÔh*\{á&N÷*é£ä›wÝÛú—-ASûÃ|_žG…Y†ÊúO®5R,Á(¾Ÿo4šWv÷<3yÑB7ÖfNJ^‘?öóÇDË>š?n©f%2zM·$º©ÞŒ¥Ä\³ôî”܇”ò!@-Ñ–ÀXcÁ!ÓÁÓð ºv”ïaWƒšE<¶szß;nܱ7€±+s˜ðvl•·õ#Ï×vW€±¶;ïALcCL™ÛŽSä_Â{¤ þÙ­¤Œ{@}0AîÁNˆUY`!Å¡×R]šgbÿŽ(©‡¦ð<‘(©•ÂØUÖú¶ ÿW¢Gep2/̃žNÙ /ßÛÔF®Ê©Àu.ÝG­€z! ÄK:ò1ŒºO†Ž'ú³OhgµüÂÍKhlhü© Öí)\~ T]»¨¤¬çôš²y(½9ßîVoœ•h# ‘‡ÐÁÄü¼Lá C» ñZ­³Ÿìh ÍrR!‘¹òÆh-” [b”y–NUËcØQÉÿz¯ê–.È'"“‘9~Ïî¹uãT±lj7Uôík±Jf·ª“s¶ÎJí£œAÙkº+`lÀòBA¢ƒïÃ&[i̘ãä¯Y¸FS)WO'¹!;38f>É«€û”Ñ\ÿÀ±\qè+êÓvqð%άËí`ýûÑÅ÷›Dâ÷_|ù§vc2ãù²ÉqX™m¹^¿§ ð²¼¡M•ȳÜ$®vŽ™Ûß‚Öû—;Ê¢Ö‘µpÑ‹~U’ÆE“’fÌÝÛ Å÷ÃëŃ“·WÐ’âa¾¿¸çÓ?ðsaCëÈ›_9aqqZæ·öx7²ùÆdᲕÕ_9¢´Ýݼi^‡íE¾ˆÎPŸ€›‘²Èwqe®íǤ?3Þ8V vLf¿(TÛA„<Øe»ï™O¦€ …> stream xÚåËŽÇ힯˜Üfu¹¬—d øàx×§¬JìI È×§Xïªa÷tϬt1¤•zwØ$‹dñ½§ĉ‡?âdeøËO?ü|úòùôÙWþ$8óÜŸžÿ>^ðszþñOç¥í‹2<ü_2|©á <ëðe—¸,Jª:üTzFh é˪ ~jÄEÚðlôE:ü™IßÜii|CæŸF\zþTE5ü9‘†µdåA#†ÄD~þ/3ˆOd^Ë©äÈE—Òb¼ÕXÞˆó› šU¤MóB% J΋Ÿ-F‡Ê…’F§”f®¼"Û‚Vgñ„}™câÑVk.)±$«ÕVœ>v™~jDÖÙã!ÞÇOû@á3jÛÁÞ´C&Ô¶)B³åhb¹õž©éé(9á,%~2Šæ¡ só£gzSP”rS¥¬—ðB¥WÈšêK-c ¨™¬È›#¦^'¾ãâŠñr?@^¤½}w›ÒXHO;OµTõp3ç7‡sþtž›p=zJêm3Sk(ŠA]b_-¨Ò9¦µPMWæløtާ}—Zcâ×\|¦E|& 4¢ R.œª8SŠÎ+[aLcF• ³j JòÿìB4hfüzYÊ&}ª ¿Y¹ü¾´~ ²(+Éä)ä?®º5° ¯,B*¡&STžV¬AÞ#;J©¤QO↢Áƺ"üš,y›Dåç÷ÿ¤«' Lù¾Óñ˜AøÎ ö·ƒH•*Á„G•nkÔíÒè†BRè $'R»,\?hŒM©%À¸®˜ƒ]"8 m7JÛ4ioQ=µïRȲ¡2•½â¯5`™’¯ª€Ÿ¨cö±¸„[fBÞûQxލãÞ³øýÿ@µ7e0hé’îUÍÝrWÛËFÔi‚jÍÂZÍ—Xšm!‚Ó!Ô(¬K—þøvu;C¨*C¸gª·îi »ÚèïøNE{áÉ«&¹`Ü܈Š6O Ÿ0ŒÁí0GÃØ ÅjfÐ_Zf·ûܨz`áAbOjs²bãdEÓ‚‘kÓ„Ç ù‰&R‘Ô¶AÈûn DÇ=ÎÀ\»ñQ2‚ù‡;"¢&]ðÈG8®8Õóмt³íÐß­É01ˆ>wý®«8E ^ðX ¼žxusØÀŽ2Rnëò:;…)’´87üTs>¹=çËÀÑs¾%Ôžç®Wmv¦ËJŽÝ¡†Ìô$[HÅ>@W=ƒØè¹¢ç–š …—Òs+m­Â›‘cÏ€ì˜æ‰ºo ë«Îxyãá©^á>×÷d;:ò&ÇØÂŠxµ„Fû~xÒ7ëÉÄ9ýXíúî¾]q_Þ¼¾'Ü;λ™ÇŠ–Á<’ÈV$womc[ ‹@ÍÈ”>È­œÍÎÉΘ0)Ø\„hò§8”‰ÄÛð GÁ\ LNìÓ~×;•Êb’!àxU#?²E†›†™ë]±"$'£‰‰Xþm„oO…o5d±ÜïV=Yóݾ+; ØŠä§Ë"<}h)[6}OøöÌ™½âÿ$~áü…Ö¸€Y†üdY†ZÉ2”Á”iÑqXÒ&že¦s??”åÓÀµ/¼ûÞ½Œ£~V÷ÀL~K¶õÀƒÓ½Òé þŒÏL™A7…¥ær×8Ats‡2½‚”ç–ùXNN|äU;ÐnçvQÍ=7“â»5SŠ—ü 55©óÎòæÚFj¨ãø1Ó˜¦9Q§…¦F(ÿà¢FÂ’60Úä(¾!—ƒ^ÜI¹\ñônXñL¸0¿”ÞçýŒºü™`W,$Þ”øÎÞ> stream xڽɎ,·íž¯¨cÒ-k—ÊÆ;$@|È!@’¹yrñ8±v ŸQ"%ªJµõ› ÞkLw‹ER$ÅU=ý:©I¦j :ý—Ów¿L|¾øzž”³œ§×'åÄl§|á§×½©_FÏéWoÆ™ô^áÍX™^.­™VƒOé¥p%A8‰O¥ï<Õ Cö²üuÿº´µ qø«_t¸!=…ôÒËùôY—ï3Fâ4ï#C5Üy——Œx^Õç߯×{ í òâpM•Ï!ÜA¼v=²ëªXÛDûÖê—¼þ9©5b„s¨‘€`—ξ<´ßÓNYÉ9ä=îÎÃj¼1=Äšp‹²a²ª¡§èË V2TÝ}û8 &¨¦ d¥‹rwå/pQçd eé[fg#[ðgl¡â|{¡ýÑ£Teg´A²×5¨}faöhÀ>×Rµ6}ÚîE&IªÂ:Œ’Œµ()oÎ ‘@jM§cDjd—¤‘¤?@þÅ×Ú³ƒ?a'-bÌ„~@¥ÈC o¦Gúž€ìÄÄ  þ‰ÜÃØL…x“Œ0fû׸}î8L/ØwðõSî ÃTŒ•åð==&M¢2Ò“žqYͰâ>pŒù)<íÚŠY÷¦vd2ìù¤ Ãdí•Ð&YnÆséÔ mà¿kuzXuÎâ/#QÈ0Ut¤VX,aéb‰…Yŧ«J evy5@%„ ñ¯é9 B¤#é]’¯Vh{¡è\Y!IƒÃwäM·ò¤óA}%L6»ÀŠÓ}fëp»ÓVý@ÓKîÆ™…é¡GÊÑÕaÃäkë ëôõ%ï(P8«$EÌ¡ J˜É®Ö–9b'ƒÀF3è›$2ÍdX l `e£ 7ã1 >*Ö.@+w|ŽÅ(Ú¨À6Z#?Š#G›¼Ý€Q&?‘N ¸¶\e™i9™^Ømw¤Ê¾“ËѶw6sŸ ¹*KF;ŠÂRòåˆ<¦¬+W¹åDÖ¤Ó>vÆtþ=9k©0¤QPÉÛöAŠêŸÐÓWª§Ø“],Ç@–Wky©¯Ôòšª¦VcU<.G4—Ó¢\3Þ«Hö`auÕ"xlÐÏ´°èçü²•°¦ÇŠÞè®} O¶bnlƒ µ5ö0*KXm/û@º@Wk±\IîÂs2$ñN-˜Æð^Óê+;«ƒ yÝÉÐìlJ/…èîÕ`vÓ`HQA.zC9åó·^ À„¥.Fî:9®~„_«ßÕ¯;Ü,û­‡[S~캔Hɼ±Š åƒh«‘T>(…·L¶®J¾Åb1•j@5¡¬z_Ž0›båIjylÅA£ˆÕÁr]Ƽ[e'½$ØáíåÞŽób#˜vÓz·¥²ö.̨šíë’í±”ù§¯Í/d%Vµ Š\ŠÅ¥$2cD˜kD^$cRÊfŒtVŒ‰êJ+8CSÕ–Ä–ãO4ïÊÓÉë@œ6œ²™3ÕÁ]hk’ §àIØ9´;3'ŠÁtLü’:}ªT ûšy…ïfÁC„È Â[üž@Ë1H°€Ù›¹jÄœÐciæº^e—§š°ÃózB§ÙÚlàŽµ|²­+š[Ắж¨)Êöí‰ún/ÿ¨\Ðî©IbMó”¹býŠ_êzò#Ÿ;Œ¾_¹òKWÒqÇ;¦Öö÷üÁxP)[ÝÛ„•Ãf7ÈÐÅaü„6šƒf¬áÇEÆV60Í‚U`!ÅÍ|þ°p/ŽÍ ÎQ–…éÂéTsϤ`–Ì÷r÷¦þÀ­¢½”­;ÔxþÜ‚ñÀ™öh±¾v§#%l%U¥í/LSÀyêèªÊ—Îò^žÌ8 ²Un!×…Gör÷Ú’8U^úð¡T~°@¹¶Õ­u:ê·˜‡f(²‹{y«³±Q~ÎÐ,G<%Ù §ÊDaÎëñ¤*É»|²m€Wz•l\U .õSµ¼«êq—#±Ñ0UIî·kߌnbä“6bR‘Û*ÉZì;i2êÛfe¥MII,yƒV40/×eKY=ç+€D ¹êíao} ŠóvuaÊDÛº«û§/L¤x5eÉ“©vÔª!— øa14Ñ»Ú\_ÂCùg#Kk(Ð(–»¶%§[Ufí³‚ 0Z0ð²Êo•²r9h;íjí¹MÊQ2£ZJX®EO3ì¼…¾jki½;Ã3¢¡Î` ÅF¾#ˆÀÎA³†³v’ƒiûñ¨M 7§´Ž¤ˆ’é ¥õŽ c$É4ݯöC¸ƒŠ°s´ó n±SÓoDã:dJZß~?Ä¡s°ÀcW[]½ytÇ~Æ_CòÕÐãÕxýˆ1€ß8-¢ã°¨Ý– /Ëyî9÷ÌCæë7Fºëõô”=:|5ÕØ K¿ _M0V. 6p5(ΛFt¯ÛchbÛvÀèˆLŠ[v=eÙqÌ &ùWolûeå¥_ÑïtYŠ÷wë½X»ºrV¾93³lµS–³rÙ–kß¶o Ÿ-¶‘Þóõ¡1p¿æsbá ‹íl³.ÛŸ¤’ ·§ÅŒ¼[^Ë6f¼ëƒ,¢hò¨£÷ …ÈEÝBðµÏUL´'„Œ'å…à7Û;žµwlÔ;ÃÔÂÊò6„ócMκ¨Á#èáÿ]ƒ³[Ç¢JôÂ,ËEÌõ4¸Ô‚½Û¥`\?”GWwê`ù YÝý4êü!¦›"–Y<û±þ`eãž|–Ô©ôÞï:èÂI›H/ü.N¹i = -àfÓæõQÛÕ4çeº{Çìléz\röi¤s<ñx>“¬û}¥fG*Ìw²B/<æ ›|c{+;ôíÊÞG¤‡ñ½ëÕ3kØ9_Ž]ÚÇ‚UéËi> stream xÚÍ[Kl9 Þó+jyZteòpç¢Y0  zG³˜Û  #ñó‰;¯ÊyuO_¡™Ö­:qDZ??ŽëöŸ›ºÉøŸºyÿ—··ß~x¹}÷[ånJŠU®·—¿ß”+ÜîøÀÝ^þö—åÕ(ÿjœ|5ÿàÕ€ßã3Àï6?+žþúòû¸ÚÚ,æ¼P6n™×‘DŸæ™øçâg“çãzi-|fŸîÚ¯ ¨ø¯Î3¼£m»3SƒÊkƒofF*gºB…OAÓNHáž´ÇÙ0R‡åu!Žmå%Ñž¼ã§Ì}*g ñ4ÏV öôIx÷`DÜ]a- ôÓ´á…pcM ã¢: ´^~÷Ç?ý¡ÐÆgjá1ž=^bÚÞוœÊ+{ŸW̳¢€â7 ¡è^ÌVv$úrÍ ˜L&™ßhÀ3Ó¹x<·Ô£†¥j1uR+2Ó–5zЬIîr¹B¦žî&˜­rig¤J»@¦Jbda _æ)èåÉudÓé,Sšèéxt˜Ä¢.ì5Ld–Ò=$Mà±ÄPQæø§ÊÚ­êÒÝFUKÿ¢ÚV{Ò ¤ÃÕCeo¾£V¦&jL¢^áÊöŒ­ ¤=ŠÞ‘6Ëh2³Ë°t™^"÷ÀŠÁr¬â²{âA ž¦$ÖBV¨ZèÕpQ4“Åk˜R¤ ª9žÎ[´–n]Y>YužL2aPô Ñ Âð½2™¢Ì–ÂXœÈÝYŒ;÷´Â“£Hš|Úr¹ÄM²ÊThV§jåúëu_À3Š ÂŸuìq”j\N<1¯Åw '¢*+hZÕ#ñuµaBbpóŽG/zï #kÚ ëÜj\YyÒî¢Ñd—é3áCËOž ’*X̹S3Ê1ŽËŽi½C]« £;Î i³sª´íFŒÌФj4*;Þs5·óU‹Òx2¦ûTÉÉÞ’Jz½4Æâ™:†«aI‡Œ$v´©Y{K›¼>­Mè@|r¶Eû{øªÇQ­SñõhIty{[1Ë’ç-ÔÐzà‡µÙ-(:RMrtÅ–7oàA¦©{9Ê3›;ǧAXC‹éèð ¸e@55€ïõ‰¯‚_ªãK4QVÞ4 ßE"]”P¯O¯R;üh0$æ°'³r¤äá ùt/ÑŽ÷r´ý/¦€›«OãBÛ(8áC¢ø'S„6úŸâw¦‰§€ÙV „á¸þ¿;9¡ávúiºÓìLk¿èf#†“pCô"ÖnD°.Í  [ð/Îm;AÚì0Ò‹°{Aîø0²=L~3Sžš&¼LTÏ…¬ qægõd$»gEh{1SäžÊž£3‚Ž‹[èó¸7Ý©ÒJÈðÖ´>‘w KsSâöËìµ4íºTß4«LŠ É÷SMQªÁÀL¿ ŽËG."Úz¡wXðÂÂM Ÿc‘_ΕU¬ê²²vKX¡eýÕŒå#‘çÁ2Qy@—%fší"ù2Û$fÕ<®VJ3úM¢k"èd`¦*LŠc@í‰}`$qpTÓ5З¡¿“âP%d¯¡‘cäÙ„ÚxS:g¸(tVçz ®`ô!zð]K ù[Œ”Rné÷ú!0¨1c¡«»iY³¡ÀÙPѧŽ6%Êœ[ݬ¦Ë•ËdÂ5w ×øyÆI”ë#N–|Zy„¤ÀÑȈÆOz£ÀÒ…YŽ)ÒÒR¬‰Ÿïk éäyÄÕ0¿YÙ ¨RE•Z˜BûóDÖ‡7¦ðEÕ2ꃃÎz¤òÑ(™bê@îJ:´€».ðýö`ji«8Þ[š,­íÁ=âz÷sîåm¶T#Œ×ZoøˆP#ηGb™÷ŸéhTåõ8-MQ€G³!èËrî± \m£‰I»ôYŸ·d6P=—m²¦dþŽÌOº}ó#Š6r­OÞ—üh ¨{)‰9Q¯DÏ…'É’*õ<=æÞ㉠+m‰p…B5UŠ"¯ùû…;aõê1ê°z,yod…C½,—¯S­/Á±”ªÝùë°âñ¨é„¢ü Í!*};v¥J³íÕ™æ×jCïÔÀƒ‰?L¤O/²H¦dƒßÔ»#ßi&TwÞ“ón*«ÂI³ ­Bš­âé<|§zƒ¥ÚX©ØsJê˜bë ¾f!ЦÖvŒŒhál³œ|_(·ñ,F±£"÷€®X.ϼ%gÄ\dÀrzÌũޡ |äM& 2ÑoÁ¼–·q…¯4¯–жqYP’ï+º2à¹×Ë©’ 'Êq™êýIùµf¶ï,DZš52-ÌÇŠq—÷ùé]7¹ŠY!Ž$Íe7úƪËïl_~ËÕð‹å·¨‹%Ä÷ Ôvù-3…•.·S~Ëv´®àÑ¡——ÃåýKÁ·RðÝû´½šCI¼Îæòªï)ÌåÔpúBÚè2œ¿Z†K‘BCŸøÞS‰Ó{UóáJœ½P‰»P¹œ ™¦Fô âýî)ZØÃ¶ŽLµgAnUäNõîì¸=)E'ÐßïÕ±ÖBn¼ óãcåØÙgÅKi6ÚFÿõ˃‰‹iyÐlp!§mK’½ ç×S¹¤W\s\óáRAŽ3»„ª¦Ì¥2|T–#Êòé=Á ë¸Ã8W«O÷2å•âq8)îÑÈNuvÛ©.0ç¼ÚNÞ¾Ñ3ÍáKAršÃgÿv:æŸçÚktHô† >¯8莋ƒúÿ±8ø™¾O–Ðö[¸>S\__ÖÑ÷¡T07Å–µ–sw¼Ujù™*-¼^{m‘/óëÕßôza#²1E†M`’#©›F˜=we& #^<³|¶k&4Ô Cx[ÚW†ŠD¤<ßœTÖÕM5º¶oúçd­PC º¦ÑÕu­í¾ø¾ ´ô̹þj¦Ív“›â_rl£›FR¦‘3ýKè“+ z¸Y÷ìiÍó¶Í&@Å ‘P-:÷µcyT¹±áIù3-y¹Ëu£3žÆÈ¦{µ|›D×]£uÙÎâײƥ÷wM•:Ëd;Ò1´¨Ó¥÷êàø½h2¤ì{¿ÇßÌøê¢ûxÃbäz9œ4›¡ÂÔI{läH¡X¯jÿç‘Bàe­ÿ±—RaoÍ‹™¡J ®JùÇG)[¬T)ÿc^U;1Ô^¥gHä,:¡7˜: ‰&5î«5 †¶n *RF¬‰q²@·~é£ä¾*ÌÂÆxX:ë³—`Zôê–÷(µpuõG/>½àÈŒÖåtYjH_Ç>ìÔJÓÝÉš¯\Û®üÙ¯­98jÖX°ýû¿W¹cŸÎ±»Çlíü&wÖ™›óoöBZGÿ“ë± Œ¼øü ó7/·?ÿâí> r endstream endobj 270 0 obj <> stream xÚµZ[\5~ß_ÑÝ¡ÛñÝçh%V$àaṼ¢ÀîH“É¡ýõërUÙåÓ>}™ !§OûR®úê«‹{óëÆltþc6ÉæÿôæÝ‡Í¿n7¯¿4fc´šõ¼¹ý%€qsûþ‡í3IEvc¼…ñÎEsçBÈó³·øœ\~ÎÃÜdò¨ò'Gjü7xø6¶ø.992ăgïñ3Œ(k»~…àw?Þ~å{qmP!‘¸Ú–õΖ-J[öé¬m{ÚtÑžt’Pפ7E¡Íj»òú‘Fóz>Ñl˜úÒ0CŸÕÚql›¬Js>=û»›ï¿½ÁÝ_=< ”¬2†ÓÊWOž¥ŽpKR³´G±Ä8ºHX~ÖèºE¢<Ô«9ƒË©HFN0»ƒ×aK+dÙï °»Én÷0Ä‹Íàë¢Þr!¸%a󸔗KWÍ›À Õ 7Œ Ÿ"‹a ÿдÀVÇ¡0¬lgyBô´”˜±èeìÖ(s·»Ó6£»ÛÑÌ-ù“WU'á£øÙ1ó‚û¢[½PëÕpò³²òŸ‡§7O¿}üiw°1êf€§h•žVñÓ.Ç“O6žÇSÜm 7pC[¼7´ˆopF&;mÑRIh8B±GèÆdûÞTkørȈž¬8_='±šd¡àyÞ)4Âz_}{ó ­HBh–Oªˆl‚š}xRÁÕxÐkÑÊ„æ"bÕsu”cž·tNâj|S]nŔԚŒÃÈ$8Â餿F{ÅÍ„µŠtš¤d] âLdßHŠ” üüm‘ϱèÒ[uÓ‚^Ñ’åoó¼íðL! ;usøü 2V²P“¥1ŸΖ<}¯$HÐâa¨|ʳb‹^Ä­ÆfŸ¨ê¬Ä?‹Ôô`}T.e:H~D‚)Aýý RÉ¿ÞÜ?Þz“S¡ ØLÜ™Ùj¾AÍǘKµÌeeø­T¨ˆÍW ×Ïé“Fô¬Ùo,ÆÓÐXIs§rè??f‚‰ù¼õ¬wœ“ ÜãS‹æåýÍ'Þ?~Â7?ÿõîán÷Ï=jN=÷ëEê ÏÀ‰nŠÏJ«af8c”ŽQ¦TE¨çÄ{b®îv"cVf’ƒ°’m_6W±nÎu•‹ÑÍ` üzÏ2650|Òsb´ƒDwzñ¿V)ÖÀG¨:øhФ‚JFâY |AèÅíB1y èŒÄË£á›$}H„)2‹Dq‚–hg2`] ›B9‚ZÇ뇫@0ò5gg9~|üßH¹³r"ùõŒSÿ”û㈕ꂨ¸XdOñ6'æšRFÏæ”UD öFë§«"y,ùξ$Óåhƒ3VÏ„Nðó02äü2œÊ߂о9‹O³`Ñ 0\úV¦Ÿ<:…ÆÓ4_{FHÐì|m?]‘˜N©%`Ê܈˜¨hÊ®™#Sª%º¯ÕÊúãÜ‹ÑGQ,$åä#a£ˆ’Õ«iîÏ ¬Xȵ·P« B/BÌ­Õó XXZt‘ñ‘Ïš r¹]t˜ †yZµ د¤–£xMb”ºº•ó…ÀÉâ%Î@6ƒŠ…8<Ð}9!ˆ˜‚Âq“+¹nÓúæÂ$§Í¸*ÉégŒ’œ2â #tÚ6ü†Kå8«).B•=SYºšGU!>(’­¥ÍµwY°Ç‘†i6RùQfû$¨Í6õ6$‚Øê¹Õã(ÑÁµXFnLÄ>Š%·Z¥ká@1×µ/11õƒÞÓ9×ÂF®?¢…SŠsàˆ%5La©0’:Ôo›ÜøËz©á­¶—ÚGç^žÿº,uÏ —.2,^›9¤ôA/G$oŒIÓ¡KtfV‘UñS×8åpeí ÒŠ­ Á ÁO„\gqD-Ü5»+„—Nåõ°|Ó¥p›dÝ–uÛÛ‡‡ye³}G՛骷Mu°®r«™¦i^ÜB?«ZÓ—VkiP­Á ß Êµ×`ÝÕF¼¦³2äÊ~^²¬¿ì¹`^ `èCËl¦ ¯|Ûå.øf|]sÒŒûnrmÚµTµ´s™ÃC;.ÏãD™#} 1vÕѯϱ¼U~¾<ÄÜ?A“ï,­ÛJe#Z§šë´nÛhAëQк­R­ }ÏdõF ˆ° p3jÈ÷9ž¥ž2Q­»BöÁ¿àÜãC@´]VnGLgËe G·±¦þôÇýÃûaëº8ò·u¦P1¶üsÌu,þ ZS4”Þåeÿ{ÿË',މh[i\}xûôÃëWæ3hŸÃÿ_½þq…_y‘IÙ³ «ŸÍ°úb†ÕnqSÅ\Ó…¾5#£„+µ{ÔîN›s·cËçTL§¯^¸^»cjŠáƒã!ë]ƒ;ê|/olÝ.I~âзg ö1‹Åñ%®‚í!?tATsx‰çH`9ÊûEO÷ðõ‰Ã¦7xâØ"ÙÕL1׋|ªá—3_#Ò¢6Kz<ÍùlýDßrft.|F6%->Ùq æÒZ´ •÷ñ$˹ûxÚ¼nˆëY~oñ®¼¨A,Ø Š°qŒqAO™/ƒnŸÞÁ LΊ„/¾¸ÝüûÿŽ!ÿ endstream endobj 273 0 obj <> stream xÚí[Ko¹¾çWÌqÆž¦Y|vg‘$‡ Ñ!€ÇüÚ¬6²ä¬œÀ??$‹EV÷°#+»9,²†zºÉbYõÕ‹Ùýk;þ;¯Âr÷þÓî×»W·)9쮿߃Ùuñ…Û]x½?ið'íäIÛøÏœ´±áwxgâo‹ï‡7×ÔFÌ9áLXéHã<(¿Ï4,§q蔆ðŲM™þ*œ(àbÚ²Õ'¤Í«}üúþ®Á²Bö…!„±.üÓáÙeF1aà¤}øâTøkâ[µÇ_‰éòƸƒrñ¯=ÒÔ(YˆÄâ +ËS‘­P¸P’ÔáoÜ è Ü†Í#5>›|2ñŸ×­½é”ÔÂC8X-¬Mò?~þzs{ûåæîsëè¬pšv*Š‘¼8t7'óìÓ¹xú„Â"½°šNÝæÉe¶^Gr:ëÄ¢S¥#@úéX’~ÄYjY/2ƒöb ¸ýþKK#z¤GâîÒ=7E.Úë«jE.}Öõ +íTkòpn ™_-u.~5ãci1Þá¡@¯¢a°£¯4ã.š8ßH“L]8aN‡øÛfq\fÎYzkII¶ÀØ·Ùj¢5T"6Ÿ§w;h*¯£é©ð¸—ɪ :²Üe1$V„GF¨½Þñ¦ºXÅ!‹Ä7Þ’ý¢¡çq6óœõ5ñ”G¯Þ§=—ãÝ^Û°<³3ºßq–tÆè!¯hõ#¿!Éð÷7í~•ôdqíÎNÇ÷³ÚOèH„ÖÔ¶.·l‘²Â/‚–͇Bq†µˆº­_>£€brŸÙ!Íœ°æö|$?1o î%5Çéü‹ôÖAÝO¼Ø*\EÓDMgÁ|Ö[=+9f­€Î´3À!9˜R½X: !ÜІ3©Û˜¾J|ŽPŽþ/«*” “à!ëG¦•–BS”ðémËTFyçŽ8éÐ(<¾hIÝ]–BáhxÙt#0¥òêWÝï?µ¼ˆŠª‡CšDzat%qß"á…¬±RÔFŠ2æ ƒ52Râº>ma'Áú´ ôTôÊT4s{¦©ïÀïÓÔ¡À^ù•Ï”[v4ã«SçfÔ#{‡#­otU¾@¶¥Ê +îЙœ¤rENÏXÔh‘È8FUÙØäižØPCÅù#x%êD1 yhT¶“.½š›¬È-½ŸX:ÕË-N2"L«™ã‹V¡z5oËùëR(—–SØÐÉŠ¸jŠ0T†`Ÿ£íº²EKl‡µè Éi˜k-ÈGÁæH¥Ðœì-¡h¾·Ìå˜r2ç­Àeì,fÏó¢BjŒâg %ÐHŠ x\‡Ûó[RîV–WœIÅ]Ð|œ¯Ññk Ø-$áÚm‹@H:\þþ&l³÷ûßÅ?ý^¶ì‰Q;¶¨…ì è{?FÙ¡Ú£i1 P±å¶Eà ߠ1ñÂôÛBL c¸Ž‡ÔJ‚«E=LÃõ8‹lâ~"ÈÐÞù#d‚Búà†œÆeÉ’Ü î0g£~ƒ"oÛ³NÉlÔMl´áüòŒ¬÷ÙµJO qÖ(­*AgŽáKšªj¬”6c’cèM2_=U07ÔÊäWa‚îu\E˾Ÿ5ƒ^ø õ4b '`¦5q¢ôÝÿRHÑ0?¢ßR¶Vb®øWùDþG ö[@ì7ƒØEÑ« bûÍ n[°q¤±¼\^(úÊäT¸¿P¹+[âhþZ%éQáz;Jã£)JVØ”‹•? ÀFåÚQAný`Ÿ=2Ã[†#­ÒÑ’þØ"`kâM–sª^hµˆ´ 4¬A­©¼&Ôo ëX뇕zË8©2½«–÷n?.dàC9‡¥Ù¤Ä©²íc™Îšxø&•ӑШýU¦äA†*ËÍ0[ËêlHkk…«ËˆYX¦BV,Ä„&ýÎv2­NÁW—5$Æåé ê"k¡NE©Ùª¶¥¤ý%­ ]Lbó€³4l°yvt¥Xñ4]:Hœ³µŽ4õÛƒª«©þÁ-*Ïãþ~1ͮᬢ?Q'Þ¨‘ð{'4 *rǪ8Žjé}ýzŽrŽ7;8ÞKÃ{Cý|b=©©^™êYêÚ&¦Rº²)K’`"}ÝÐÿżÄÉócó¬)¢rW8r†¥Þ[*÷\(ø®â–s¹Õe›Ðc]ÕëfQo`Å&.”°0=Uò¸œ!}°\”V¬àaÜËÉ” F1>­hêj¼oK—zø¡§$/•[9ÒWä•”† $lžÞ}©7xƒU_µpÔUmFKum­åF<¢¼G­0óœêù;›ûø¦–dÚ]|%k¥â<èò,è ¼/´îýž©) ÀpÖ&,qѬÚ×ö÷ìE ­–‚å×Ñ(¶+!)X£º’Œ=ͦð£…5#ìì.ŽFD¿8¼Œ1:7§+‚Ôp¥éôS®†E·œ"VÃ̃ÜþÃÛ?¼~õ^Þ¿x5—ØÑl/l¹”¿áVJ”ÀÍÊ”_äkY­´+Up“¬4â‰I–Ò¾ÞŠk'Y¶êü¹k(Ùl)v_~±Ñ]t±ÑåxÔ¸pƒP3Åmµžâ§çŽÀ™iæ›Þ\Ôhqú[Ée·%GZkT:ufåxÚÛ<Šžèҹᗄí$Õ4ð²üÿ-À.#ç½*ô!—7Ô{ ©ùÐJÍÇí²¨<×Çk{¾uYúÙ{‡CŠŸžÚ¢+7æÁo¾ä–.õÓ}G2úEŽç/)ö%ú[+DWN‡EN»¦ãdÌKYîéŒ.NSWý$¥y`Ž 5ÈH‡y(gݺ]¥Rƒ/ºY:åûôá×»¿þæ¿¶|J endstream endobj 276 0 obj <> stream xÚíZKo$¹ ¾çWô-ÝI·¢·ª$‡É!Èa‚øÀmö¶'ãŒg쌽ÁþüH")±ÔªênïfO‹£_”D‘ßGRT­þ³R+ÿ©UÐñ¿\}÷eõ§«Õïþ2®”£WWWʉѮvé ¿º:\¯÷FÙ½±ro¼‚?ß[½¹¹úkkl¥0q4ìËÝ JðÙµÁ¡Dœ$Nì|ü3ñ½ßè¾sñ³ÛìŒSk\Ž~±ð«—ø9~?¬Q5½7ÁÒ¨¤ K’8¿OŸi~~›Äu×í×(ªë$Mj£*Á ²²Œ (ëPAËHX&Í—·d’‚ VÜ޶¤Ó,-lQyXÃàÕ»lÖ]ðb£ŸŒpÍIº$ý­©{H[wdjÕó›7BtËëË·÷ß?>nŸz ªŠîÉCVD]M¶’+°ÉF€¶J ÂÇ—A8C¨Â=ZiÙ8ïÈèÜìt’šZâôŽëü-úÈ› ;¯Ë:g#^ë1ìq¸{øÔ½N>AKÇÀ–vó Ó& ¾aC6”'À´úmO]eFaÔåée÷ǯ}¾p4$¸Ëdɵ‘ëÖLØH;ÔÊæM`V>ïÞKi'DCØe²E’të<4M’…]ù„fLT†%NM½šÍFŠêmêòe¦†ÃÙøEqÀfž=TœàâB‰ŠºÎÉ®c³a:n2A ë™›>=Ü:ž²N(”ÚëÍ Îàc©oqm“wßYwgUÎs¯Òêן}3HÑ?àïJsÄi!Iàsg/¤f[ÈAxÑ¥›ñMeÛõçžRÖ9œRÊ5J™Uc@•ÌÊPþ“=F‹co´†â¶TÁ&®Å=%i zAx¡"”²:†ÚMÜï·¯oÏßn_ŸŸ¢¹ÞK2Ä âVFž®Ù¢ m \•‘Ëò dˆ“®Î¸Çx]æÊyoP…gpŒÛ Ñ9¿Z[çu µ/YÍB†‘asXpèø©á¿Ï‡ÍÎEȦTTl³_ÿãÃ?ÿö!ýÖ¿yzÙ»=½Ü¾|{¾Çï?laèã×7øæõÓãÇ7”ýîùëë[ó{¬S®o¶Y1SªâØïÉgÔÝ´ÆïŸ¿¿záû‡·»e™°~yD ?'q¸¾Ùo~ßAߎÍ\`I˰àjíâÞ7Ý$/ó(›æç±ÐAêbQ´‹6Ì#Ö)uRŠÖ¦FRB+¬q®q¾\Ã\E7L75maÉ‚…0+°”I Þ!<Ûuán¾óŽC£#KÜ#°,SmB/K©(åÑ5P+à<–ÍW¤·$NùÉ!RrÅëj2ç‹dj*]°º…ÅWÀ)碴,ÊQÕ~¤Õ{•3®H°šØC}_ö¦a!Cà æ”ÍPú,›¥rBcá[Þ-´Ì?PÐ5ð‚É0³À«|?>#áj:üÐÁç ”¿ž 3~×Ëx–1©ŠPS_.¸?–3jÁÛFi \“òÐR˜¨…Ýܾ®!é…thÀ@…ÁÊËv¬¾A‚Ô#AYþ1µšÀQíJN–¸L/§FÏ vÄq ˜+ûÔñc8¯hƒl*fuºRÁÙt]Ë—où‰¼D!_)ì0óhçÏÌ Ú '²B^™haH›:¹ù-ˆ*ìô~³åËæJ™#®3'XÅ.ˆqÖ÷á³)éWÒ¢…Ä&ˈ3#&JŸ…w”žtÊðECƒX6´É††/¬®fjOnz׃{Ç;ëy®4ª¿q*(¦(m½<#g£gZ3KskÖá¼UpdMÐ%[Ófkâ8RŒ-×7QÝ𔯶YÞjÈ!s ®I]–O¬®Í«ÉŠIK8óMbI+Ÿ”iö&!‡¦OÅëns^BÕåº\Ôgñš·ÔòFlQÄV³‡¶`#'Ë.ä©ýÿ6å¼ ZèuCÍz¬®mðˆk8ß9¥쿸ç*nSE7‹™—Ž e+pþ¦‚õå‰å³¢#ïãü»©‰û}šq®ôMÓA³ßM³ÃLË›õƒ³ÔúÊ›Ÿ@†µ¸GCm4xG ²ÉŸ£]W¥Û†6U °ohƒ æèðÎ43yÄäqE“^ëZÙpqï:˜S'«3úÖþ}k+Æ¡i\ÿròËuÈOr6ªÌ(l8qãàRgè\éàp5¬Ù†+Ü%¸Ò!,D%¨Òâª*xn+´Žj‹ ÷#b7ÈÔføª½Éû»×Ç×Þ©9›‡‹¡´ÐmK';,^¯àé)K]v×0ÚrÛ“û–ª×QO˜óµMŸÖ‰QÞÁ‹§—m·iïR»’-ñ¥Û´×B…Å<síЕ=ݺ‚S~ïSF2Ο,ùZ–w&'°-§KÿìZ*›–ÕÉ£ÕͨîM‡ÒÂÓÉ^*KB†C@„P®K"wâ¦ÖÝÉœ¾3—eW'*±Dx8Ì>öV3éV¤ˆì7½¨*†š«•P:_Ûm,]Æ•ºp¾‘‹cfËp_úb˜#ÐýØ¡_çÐÏ—ÓÏ Cäxyì³O³H²e8íÜ2ûâqy¬ t¹g¢Íiîe#pî…¶%9Ç=0Ì%ÜË#¹Ô…½jdÈN±XpM±Àº×a¦{ÍnbxËB½4ªO²ˆxF²°@2×™‹“LëÿÉüÏE²1_âq Î=ŽyÆ1£ßÁ±PêðÃ ÃØ#[På‚üDPeþ¯»>ÅBz\âŰðŠáÈ (#–(fZ÷m-u¸–2ÝãN¹uœÏf{:ú’¶ã̓-Oz$ª_Ϧìᘯ.ªˆŒÿî-e/ç«û™øÚ>× cF±Ýçtó\ÃÇoéØtôTÁˆš< %<)è`m§O“Ÿ-˜#>ë<¶ÏÀey: ç PÇöé‚™›w8ðÀ5sïnLxÇHμw7f˜·eÉb][íhõvs£qK—Ó¸c?—ŽÜÐ\ÞÀ‰¬(5ŸIrËwÚ«ãCØÍ^ćIóž¨ ú»˜<ÉÅ#P>jNÂßR¯OEŒjñ_ =”çüÒïc<6¥L§Ó+}ÆüýŸ¯VÿÕÿI< endstream endobj 315 0 obj <> stream xÚÅV{pSeÏíãÞ¯ж»+›Ë2®ãy¨K‹EdaE¨Š€JË£MÒWh’6}Ò&¹IÎÍ»y´iúNS¡­-(T Pd ­¢‚òð½èâ£âã ~̰7-]ÙÙÙvîÜoÎÜäœï|¿óû~çP¢ˆEQw¤¯\œ¶æ¹‡V.Z‘6+é‘äà·Ç3D™aYá»#ÈòîäÈ…?/‰üƒHDéï ®/L ®‹ïVуÂ2Á/º›¢¢&ÿizÒü%+^ÌÊSTé¬ íݯ Œ~¸Aºeˬ™3}ô–1ûÏ!cvÈH snI3CFÈ+é±rO ¹'…Ü“’CF(Nr(Nò¬ñHÈENEN¹ÏIš9ýÑ…y…òâlÙ”´‚¬lYþ”yòÿ壀ºŸzXô¶èÓ°KÔ?b~Ý ‰E‹â(ŽÒQzÊ@ÅSFÊD™) e¥l”ª£”“rQnªžj%†‰(Q˜(OtFô9¥ {0ì\xNQ9-r/]ÊÜ͘ѽȀ~Ž’F}=3/f4î&•÷ìZR¢øY¥lQƽ/á4>|}‡x£bEJþÊô{$H%‡ÈJ<•Ä™u­Éb4±`ËóU5Þ‡ïÌÇsÏüð.<ç*žàòtµ%ô™8#'I8­ƒÁè—­Ê”.Þ~ôzµXo0?ƒÚ/s•_%»I2™@R¶åd"™Èiw¨Aƒ8“Þ,qA›Ï]cð¤Wq2àÀ‹Vãt2Çr&΢=Á (?¿ràq&6ícân†]¨ý‘÷]ñQxò(>?*l;_\ÔÎìôqÙ,ÔÔ F7L høZÁ’æé¶I”EXá+¢ó‹Ì},ØyØQÀÉ€Õ`êtÙv ¹¸ N@8ŸnÒ;´P€naròt¹’Ò «ŒÞ&3¿"àÃÛÁŠBp›!dw—i—¤ÙG Hœ}ãMµ?ð¸2þõxýÐóxZ·Wð7â†ýû»z§÷©%l#A)_H©.Õlªe¬©…!8áoF<ÍoìÚ¸N¸Üoéè1÷¡3¥k™mÚL©$á[©~°ƒÅËè2øË; ¬ô§ÃjXU(_©­Ò–A9’5”µ¶xê[[ʯâK¡Ò¹g¥ÛórJ¤ëÏÕžFz7¸õn4žm«"°@ÿÃ^{bÃI£ÀBq…‡éðé²Yò#-Òm””a7sÜ|q7œ‡3SödëÌN£Ã„¾Ýã>Ò¡oó˹ 9žl> Ð\²N|MÀúÔàúg–¤mzŽ]BËkëzYœ'1-¦f¿ä Ý >C{¹ ­¼±PàEÚÜâ’¸@™¢\RRÑP8Ž&âfü>]& ÉÜŒÜ'*¶ä®Ë*¯ÐV€ðE‰^Ú´Ïxª³Óß¹úš­¦_‡¡gª5ß”gÌG^º/ŠTÑy…¦},azšmû%õ ™p#Q,¯àÊ$d ­áµf°BÛi­;ù¥ ‹á;Ôlöú%_Ðm`­2*9/4m®VîµzEày%Õ=Š+‡Ã¯âj1î¦ëÌFÇÕÕWH$‰ž/, Sß%Q8Vƒìôixk ù]ÞÄ›À,5'©®PS%_Ÿ±e-äC®SÞ¼â€öœF¼Gl<¿ûëOà,tͳ.3V*Uã»r®«‚ʃGO¬>™Ð‡k…›Ë3ƒÎÏ|p}N⼋%`Síæ\”pºÆ­òUÒӜޠáá9Сûàx΢GFÚ õím»}pÞ*³?´LúRéZÉrZ­Ö«Õ°²~:¡ëø¥Ši³Ÿ-eŸ†Ô–ªOUgÖh9N#Ìöì>åNU×  ¼ôÖ]ƒ ³_M3#¡ˆc„¢¾Â„÷ý&›–yj˜Ü"ãÖXWWgµí>’¸÷ØÀ±½Ç­uö:‹ƒ'=‰[Õ•ËÆþXÅûYüÞ­ò‘e.Æß©—²P"Í.-Úš±5Sx355µ5ÚüJâ.ký›BÇ3yl´'Æ%“pîÿ˜ þýGâ‚íRMlÍvY+êhnè`šËšäŪÒí©çe‡_h{«]å-..S”µU¶I~óÐmLó”3²B“R$î»ÃîmhlðÖ;TîrW™?ëå,ÿ&[£ *ÐŽÚ*¹à‘ìa^åÎâëN¬;õÒIƒÑÀ "ddÀb·˜M½]‰û÷ûÛ° Õ“©ŒCgÓÀ(UÈÕêôÕÏd¬Xƒp2ÓmlØ¡,½u]ã‚ùy_§n3 k’T)5%sÖ@9¨¬ÕNÔÔèjñT7*”åÊõýÅ»Ù#Ðþë`˧ð¹åcä`Àkö¶ÑºÃZ¡`É&;Ï ýM̃ÍJV¼n˜›ñ•ƒá»ƒ{;¿_¿‰%=ÌYÑÁuº‡YlxãuÚùáÅ[9›ë7÷ÏxeFÿ S­©Òah€¦S®ý—_½Üó•Åeuš\<ù!q³J½Vê)cdE¦¾àÞ½­Ö¡Þ"FF•º2“ÐkHø‡‰•ÆÈ_ó~ÓÐmy_ÂÈŠÍ,NÆ›H2³U_–z;^y_GÐyÙ$èfO£mpìèAž%AÁËÄ$¶üé?Â4õAvîÁ1p$ûiŽ%“$äâÿ¹Cüw§K_€é}¦ÃÚà—Ø„À]ÐÅû¡õPÏ«Œ•ˆ\d¶ÕT-¿MYù_å \SRB/r„÷„ÄͼÜÎe°72P “G-’êó%UEx™OE›ºY¯j]7\¼~ì“8‚…¿oølV‰­ÄT"ôògó噆3‰¸žhÄÚ…Y$ê~@éK`qNƒ0¢ áÓ‡‡¿ÚCâS$¿Vznæ~ãþ^ÌñAEŠ •RÑXÞÜÜØÐñþÜ‹IüB2a ‰úh*¾ƒ…cƒÞ“FoÄÞĘ9^'È=”ëjä«3³V‚–RWjéÇð:ïÃwá0ÉAÌ÷füºS8k(¼[€z™é¥ýü¡–¶¦¶ns ^ÚÇ—”²d„¹V‘§Sê”BTT†9O#Í Rk„ñòM>I/= =* ‰úà<#ò—îúŸjù3C÷"¡…æß¶…ޱsÜñ,#çTùaúä5 9úl@ÛK,»‚\è²×çìoÖŸldË…ãm¸Pœ>ï/dÂ_µBês<ÕLµŠw³àlls¸Úwµu·ïjéL´Ö™lõ€Þ&÷Ðccg-ÊVh_½»/Ï0É„­ÆÂü/ósOv‹å 7È¥=lºüöpÓÇìQºÍ¨P²qåžÀÎ365Ód‘D‡;ŸŒ²ÅFó±1ßDÆHf=NK¥Òœ›wýʾi™ endstream endobj 317 0 obj <> stream xÚuU{PSWÏÈ=*V%fw4×v·U[‹¯JÕÝV´VÊjWë[ž>0 „!Oòݼ ‚Äâ;¾ÚR§VJíS:»ºîn×ên¶kç\zìtoTþé´sgÎüæÎwÎù~ß÷û$& (Šš²~eVæ¦5s7¬ÎZ;Ajjüß"n¶€›3Ž››À=šHÖ’g$±?¤'ͨµSãë““ãkò~Ìá—‰)‚©5A4ã‰yK^ÈÈÚV ¯ÐÕ5uåîÞ·o~jêü%ÁÂÔ1°à!xvñ‹y6í!X²h <÷¤mOÛž¶p Œ§˜¶$uÞ•Åò’rea鬵Å…¥ŠYYÅò\ÅÏ~ƙ̤Ž[,¸  nþIÝ|EÝIøž§7Y0U" ~CY(+UOÙ( XÊN9('å¢Ü”‡òR>Á´qJ0N°Xp–šLùÇm÷u‘Äe‰×’dIÇ…+„ôRú2ZŠZÇ/ÿã#?Q“¿t„+þ«jW¥ˆ.ài_Š+,ªJ(EÂÊh4ê–ŠÚ£å‘RÑ+ÔÛ¬€ø-·+N«B£¿ ±ª”þ«ØwU4‚«Fç‰IV¥èa."3»ÉV¼JÚ$ÄYmv¬…¯hÏPà]$]*1ƒÅfD„÷f‹m^ð.Áe×%G¿ëTäHû¡Þp <£Žä?ͬ a…eyÉ«•{vËs™„$¹Á‹ÕÝ|˜Û=:UEaÅ•„›Ü×b=Ç<§‚è^˜.(0H«@ËÖRà÷b´ªlZ@[®“ ÷!í®÷é¥Õ S×s›ë61c?ä.Å(Ì]O¸Æ…Ä¡KgÎ_ôùëK–3ðDús^¹r©¤BYQVQ¦< 1 ¨3ËSBœ@Å˓ʅ†íŽm9P ŠúbžåRáùógϽqæƒwÿsî"œ2ç#"˜½pÙ“R(n¨8jB‡‘N"ÕÁb—L`¬+q73„g}rPE}Ó…«þ–0‚§ˆÝ6—Í ( F;UÁ2F åU¶Rd¢ç^]ø-Nþâ.N–Â7X0˃ôÂ]°N£ÜmÃ’X]9Cp©ó̧Ûí²Ó6—Ån-”WW™‹ r‹vBacN³Ùnv˜YT/4ƒ•o"Ò»¡AêwÐë:< È-¼ai!I°V=¿WcÐX5/_¨ºÌwí³gÙΉq›UÔÁ±oÑ%ùÍGhr79ýî ‡ÿ|ξ6¾×Z¡ØZG]û+¯Ò[æU:ŒÎ:0 Å6[‰TÝ1%­%[ã×ùÍ!s`Î~oZƒ³ÍmÖHèÀd¬¯5”KÖ’ukȺ ²N»C•÷'þܸZŒ¾¹‘ôÈb66šÄ÷–éàZ?M85ú‚Xq˜>ÜcÙÍ€ÑfºWGgn2æòWÅè[}à Ëpi¼·fúÛdö›äƒdö/qÖ8U-VÄ [Àq6â¹<‰¿×ßÛÜÛtXâð8”¨¾]㞥œüç] ‹ÎÜåÅÇN…N<½~#“M?IV“™Œžö½týÀE8C‡ZÞä 'Ò:¶Ù×'àðQçqôqùVZaÎ)Úo<Ù)…F¶fh5ñèö¢ Ïe.-ü£"XÕÑF:Õ­eRœODâ§hÑ™U;3Wnî9'…ýuàzS³½ÙÖìssˆ›§JùßÞøqö§¢[ÝÜJ±:LwG-9 9GV^‘ª°‹~®ø{?pù~há9Çvxœ öÝ9á?Û0Ý»×§h³r@‹È.ñ·BÑ­÷ïÈÊÌÊ_Ǽ,,sXš áŒD,¦!àh ;Ð;BÑ3ƒÊõ«k73|:ýÓ¿ŸõÝPB×/&R*¦wË ¾HCÈéït !á0¼ar‘é(,¬Å â2`>Û6vÎ{ïWŽ’‡Ttq±³±û|^—§ÿ¼äÔàÀ['ßv{=—%홾&ãa ¢Äy‚Áçèþ6ÏÛÒ ‘«ƒt¬ÛZÀÔ×ÕÌÆüW%»²vnÈYo2æ:n—ô6¿/ Ò?K&èW“©ˆßÑÏ€—õò’ÇñÍ{Œkàí‘#·mÿõDzº¬y ™Dòñ$ú¯iøþµñÖÖ…¹Ô0o…ØUÜ3Â[AÃe‰g韞DÄÏ–¿“,ÁÉ·¿Çãã&HLÓÈtÞÞÞSˆ;>|âßÏÍ‘£¼ Þ ³ ŽAŸ¦SÞ›çܯÂ[fáöRÙîÊBHƒœO ŸÔ7@£­= N²cø™÷T˜âÖ2’ÐÍ¥‹mtO·5—¹—§g#*”×I«X+peXüRgî›å§a:žtSxN\‚È$f#ì,Ù“†iÜJLbóš²ÖìÑ«,@Û_<}ŽÁËhðÛšÀÞzÿìÅ;½D²ZÊO “̈́ȋ/É3aªw$ÿÈ!1?°Y~`++ÕÊÒ & µv]›(“LZL’"ô?øMa†áâÑØ»ÛÉÏaä¤mÎ3´V½zÓæÂ €Û‹'^¿Å"œÈôÃë•ûÆÌá QxïPB/ßöZ²0),´÷Ù϶GCáCÎn@…OM9Ci(5©Š¬J+ÿŒRá#¡}t^‘ë4ƒé°Ç‘¾GÔ.’|_æ ã2Oì¾Mv…¸TT[\T^ú-m9çÕOÆŸ&”Óà®áËk¡-¥šýz•z§â/YPµ¾Jbév{k3„Q»6P^®Ñ*·¼^r\úôâßw^ì»Ù÷ï¾›m’¶“áóIªšî ”•1P¡SÕûÓKVÈÒuQ}—>ZònÉå²ËVŸÙ>ä¢]‡Ø ¿ƒ~ßå·ÄÓk¤! ‹îëEöwÈ«4~²Ñµúºj½.7[R°%gûO}Eˆ®pÖ5C:æ@0î Fù±½(*ë5èÚÔP‹Ì4hTúªxüÖžÞ ªðž³ò~ùqÙkf¯Ékôð ßyçÞ§Ÿ®¦Cê*ʵZF§Õikµ÷½j@6aewyTÕ7©C¼nìü³ôµ±qªv.½+ì-B’ ´tBBãóÉã=ÉØä‰ßL8;Qº (Õår¹šöÖdgÏ endstream endobj 318 0 obj <> stream xÚ]PÁj„0½ç+渥5²Š‹ ¬Û¥Ù…ö“Ñjb<ø÷5QöÐC†™É{÷&©šs£•‡äæŒ`è¡WZ:œÌìB‡ƒÒ$£ •ðû«¹%IÕr{å#BÒ¶·æëòZµìûôö¸×Ù$öâ¾XºÏÍ™-“DZѽ¢ Éç*8y·Àá]š_ÂîÃItJpxT,nØlí/ލ=¤¤,£\¶YFâd¹@Çõ€¤HÓŠº. jùïnŒ®?Ü‘"Hšæ´\ûãÚ§y~мBÔgR1;·zˆ÷ˆé‚¥ñy2kl`Å÷©o endstream endobj 320 0 obj <> stream xÚU’lSUÇßÛ+íÝóÕ"Ú>Qt‹s”Ð~(‹8Љa lkÆ-ôÇh;Ë€¶ë/úãl}m÷Z÷£ÛÛØ Ó5#$šMˆ è?¨ñBBB"þaLÈ}åNñ–¢É½'¹ç$ßó9ßsYF¡`X–]ÑÔôþΖw_nhjÞÿz)±ÅúÏîgãÅü2™gäçXyM™ü<'?¥ÐÞØ¥¸WYö,ðohrñÕ5üzƒáµZ¾^¯7ðoZ©X‡ÑÆ7Q9jÒ‡…o¶w˜W_½ÙärumZ·Îív×­Î:»ãàÖšZÞmv™ø=‚Sp|"àwØm.þ=£Uàï[w?6Ø­]Ý””o²6:bŽYÉè™zf#ÓÉÒ3ÅFØ(cã,01­Ì¦¢ŒaSÃüÌî ¥ÛeÕe_sû¸´­*^Áîöfq5WÜÝê¡q˜˜è†ãºÅŸ”Ç»Áå‡!]•<}~L~:ÏâÞï8y=Ö¨Óáœ4”ËŽè`Ô?pBlœu~ÇåßhR‰Ñt*‘I&2FRxÔª%/ÔäpuÿplÒ«zÀs"áA>UŽÔU·É(œ„UÇ=ÞÍD> ]±œî½ä&å{5ÁèÑ@0êGý@=9ï6ý09‚U¿iN ËÜÃlv8×B&2—"磟G ˆŽD¶.`Ø|=¿4X{‘UKÉt²HòzµqÚÑ^¼Næ5¾p ^ð¦ÃRX¾N šl¨€²™LVRPô&/áQ<·8¾dŽ«dÎU屇æà Æä#yvG8<"ÛÔ§²"dÐ9ë¸]Û½¦ˆ‡<±Ø ‰ø q$c™èH°J}’ Sà–wp¬tØ›9ù×ÿía2‹uÝÁµ€°Aù°@6+I#YKx²4à‰¿­Ã›ÿS7(I-tÇ‹u¨ Èá±»+è«å3\±¾¸AÊR‚4Æ“… ¡%@ØÌxúŒ(Ä›Œ)Ä›¬"ã9^ÒŸH¶VŽ +¬ÙûcGºÝGù@•ãûµ÷{ìãl`@¡uaK•$¥³kfUm©0çìU- ˜•½® kÌÜ@ƒzз]ã& ¼xD¾n‹´ÍeE:NEzØ0'Ô=ßr…/ S÷,©X}vâ^cÉN×’¥Uæl9 îQOjU2¶T=¼7êâÑ¿WµªÉ93Ŷ³ÂZîÕ.\]PtVp[­ ZU§Í‚½®½sÕÙÝWg«SlaaµŠ©ÛRgf‘±êµÍœÝþ<Ã+hNÈc‡V2õu ×HzýP­Ý Až2Í”+ KCREx Å‹W}Õ\¾^FÔÒVà SAÂíÕ™¿Î§¬õ¨½:‰_O•ìþã2®ªZ„À¾"]Ya\Fëz°®ÚR$êºY³ã¯»ò)ÝU-…»Óëzj­.Ÿ+Ü­¯HëÌk+Ìvõs¯õjM¸]¥w‚*U’^¨è¬­êl­¦’­ó¤zåè®&Õ¬¿Ïº{cÎ)g®±vÞpò¼õP#±ïݱRE]¼t*·õI´]½›chX_Hvýá"å©„XÝ+íÖàÀá)ŸÖvÉJ]cá¶¼{âhºm<»0á“-7ZÔžP5bf¶fÛ´S°¿€«x]ÅúáJî6|Þzeé*=Vwu®·-ßа®V¡÷S7áø¤ÝÏ8ð·?ýñÑÚ¾K÷²KQU·nYÁýǶÆÿ´gtîÒ_l¿½P»¶ÃY _IõgkuB±¹²ÉÞÖSµ{g»öÜðB[ÿkϹkˉ 朢Dß§§>¦áŒÒ qõ±õ3 ü4Qê}@VÂÅϘrB©Ä ÏëZêÔvK÷¶×jŠ+†µ¨!V[ìÝu¡²¹Ðä³%UýÓ‡Òg9K.×K¾'+Vÿxoqƒ'Ò÷éI½¶D\ß›Z{Fºamµ¾ UÙ{ZYp_yû®B©Z–Øv™_ÿ”Ò†Ûí)õ×›Ú]Þá`zÂÂuCö6 ¡Úx‹ïüx÷ñþÓ‡_î>z²åÕÿ~¿»ý=ðïÃÝû‡ñûd¼ðªâýÇ×z¼çÑxÑãEÕÇûÞñ®:ÞªÎñ&ãwÝ?¢Ã't·»qarýßß½Å6ù­;D¦C¨ëÑô£>ÔÃÖýhCïx_ïTïøToZãåp¼“úxß;Þ=†ƒ,õqpc›ßZ|d¨«Bh§¡ÖM‡8aëFø&™Í¡¾Nfo{Ç×IàCïø: B“v1¾N‚`:ÇéÑì‘ð“ïƒ>D7ú…ßG.ƒhëF4™èFÔ3J¾qÇøXŸ ¿>>êúx×ïãëöÇØ;>t‚èöHL€ÑŸb°þ–Szž•jIÒi/*îEÉn´ÎG“uHS’xè’T‡$¹ÞñuHRì_Ÿ\ø“ i1K+Õ`»%˜NZ€¤4Í”Júx1Q/Sj;`üz÷„djØÑJ‘iY¯¨zŽÔZuKhè M¯- ­•ôR‚kHHÝbžYù=•…ã—âO”߸ŸØ³¥èÒÒ Ï´¨´´$¸n ¶!!vKhĨiÅh2ËJº£ÆvKèŒÑ¬ü‹ä 5g©žÊ÷ñצcŽÓd¶4ãÔ.miÄi³²?–ЈSkz%ØFœÚfœº¥„Fœ6ëòc ©S[ÀbsœÚsâÔä859Ní§—èª1'çÚ:å¹9åõRcNÔÍÇ4 ži,9´ Ýóª[Bƒc¾iÅbj×¾a…Ý: ¶T‚<­iÆŸébÈ4çÁyá¥]¦™›1®—¾:4sà²Êl·„Fæ ¡[Bƒ±Á £–ó{h°"š^ ±s%•ŠJZ‡°QŸ©ÏÓÀ´†é…GÓª£oÙ²¬4Õ·Ž©[BƒW­üXB+Û´Jp£–ó{£—V ~$A<ÙÆtV~‚%¾:¥309>§ô>þî΄©4l±-[ÌҖƶ_«¯HðCÕ-!5$4£l1¿K£í»%¸NL‹™ _}Fî•çÏ\MK®¦³j§ÎΫç<2soÖ÷Ø3ÒDÇ/=Ó@GL¯i #¾[‚kHhfž°”PÏ> stream xÚuSkLWžaafx”*æ4ÑMê#m•b«€µŠ¶µ@”Z«U¡bwY©E”粸»,ʲ;gvÙå±+¸°VÃkÇ&ˆ6â¦)5Ñ4}øƒ¤6kš4õAz§ôŽ,mÍ$'_îýιç;ç’ˆŒ$H’œ÷q^fÞö¯o}7sÇŠ””ål¥ô !-Š«¤ÄH¹V¾¹€úöŸŒ¨…Aü=_‰÷^Tâ­yJ\‚µ'ˆ%ÉvÁâä´õ›rKŒEÅ%%¸ÜŠ´0H]i+gÁê0HO™³Wééa°:-%ù­¬²ÒƒU•úrm^™N_~@›Yö…N»ÑX©? Óëž¹$’#n÷ˆ?ȇÄ_Ä4>h"¤“äI ÒEº‰è‚$"ž\ñHU¦ú5Ò•?­Ò¯)FÑ’Q©°†¾¬Þ\£ti>tpÐÙ;vl 5˜Ôìå½~`P' ¸¾£ÄcõZ›-ÌòÝè·ÑU” œž¦–†ž¤wPÎz´yÊ«?åé9J•‚£¢Á¸AÞ¼ZÎÍ”·XyêtM•Ž ¨ÄÕ,h›Q¨QrTütDòä2»(½$&  h¤Ç§ÚÍÞG™Òêïi¡˜¯¯–-å*ètXnË..ª2è`ó*šgº©¹?õ¿q›–s—ᘋ{¯£ÝÓͱ÷adMqã9•Ó(V{q¹æõ¾ÖžºïËÒîœ'x x¤ÓÜÁ \9[L¿·}OΞOz¯jà—G}7ZýÂ1ð»Ü¡åòe!$E‹ ƒ(w§t˜sCÑìä ”¯6Ð>ð >`Ø‚'ߡ댎 ;YõÂ` 4;Ž<"Õõ|=0F“«ƒöÁs'.Œ_÷¶µ´zÚ¹/©®v.¯çá$ÚVÞLµÉà Yh†f]§ÁÍ+èx·;¨ñoF”=º |J'Ýg¶Ïõ‡« r s rޱÛxÔ—t¼ §°×g“èY…hÛ Zú‘aÈ>$žVú;ñ´Ô‡Ä­w E¬mF,û€¨1¹;8”öÊÙ´¹f–m ³ï×ϰŸ¨Ä×ÿ/sçÚÆ$¬—j÷ó€è8ê8Y-ïEjz†}—PØ­a‘ë&æÛ/H‰!r%¢V”¨B'¤êm Ÿ5ÜTT’ë`{`«¨»ºõçê±QcÑÂïP*Z&ÇOÈZN~AîRãnF\cƒ'O†üC ‚h9Y>h€¡€)¥¡ÐùQÙ¾Ê2½¹t ë¬ê«è†›Î*Òn¾"œE‡Q–AL #ÿÜ0;1ŒGj•³¢F)öŠç|?Œò{íVNž¤ë¬N«¦‘ª„*¾R±Â¸Hc,`ÜHY­®ãš¤ý^_ã£Ø‰ëpÁè‘ã˜QÊŠ²¢fV*k«Qª(1"ù¿·Qª™*#k&øx^whS­Ã¨©ëcÃI‹è³p‘ï+?¿_È÷àzµh§̼^®ªÅ»A·žk½§êNÒ`¶;­NFΠ,.»  ºMºÜÝ8Ç?ç¼OÍ킈rzQZ(aï¥26²ÖAõ~Ãþbå«6ä(°ˆZi”÷2 þS=3¡þ¡^Ñãu{ñËCò›T­¢ÆŠI3æšBü3Þ’žc­©9)ôkòZ»L¬C̾1­:£6B _Ìk] yú¯´özÏ@/0#”¿Íiââm>iK*úü”¼ËKkbT¾Œ¸è–¸!.öϘ¯b5éo/šNüÍhëR endstream endobj 325 0 obj <> stream xÚÕX tSÕº>§¥Ù‡A††Hp8g”YD&•©L2 2¶”NiÚ4 hÓÌÉŸfjÒ¤ii“Î --S)£Xd)"‚¢¢¢Þë,¢;ÜÃ}¾Òà½W½^×zë­÷V²’½’s¾ýïú¾ÿÐTMÓýgÅ-X²lÞ°/¼8ûÉáLJzš =ÔƒŸÏ¿}WLëß&ÄÜMQQ’áÏè~䓾؟|R’!ÂXêÞ(ЦzQBê.êêqj 5‰šA½H-§â©4JAPFÊAù¨jª‰ÚE¤ŽQg¨‹ÔÇÔ—Ô5êï´€îG‹é;éáôÄ5ë“’ˆ!OŽë^ŒYŒŽ,ÆDc#‹ÈÅc†GOE#"‹‘‘EpLpLpLpLplpì“‘Eylylylylylylyly\y\y\p\p\gܘᘚž&•g%d™Ÿ)òbzÚÉ¿üHÂ2ðaúѨ±ôdj*5„`=‡šG- ÖPIT*-¥2©êò`žþ/š¢z’€ÝFõ¥úQƒ©;¨{©û©‡©G¨G©Ç¨'¨'©‘Ôj&5›šCͧÐÚH›h3 ´….¢­´¶ÓÚIÓ.ÚM—ÐÚK—Ò>ºŒ.§7Ót%í§t]M×еÔèpvDQRê"ý=ž–D=u<:)úz–˜¨˜ó‚ñ‚64“éÁÔ÷Œî9¡ç‡½RzuövôÙçÒmi·í軪ïÛý>éo0`À¹ØŒØŸ…ÛX#bD®ÛÜ®tÏ ŸÄ?7øè‹ïøûÖ;¯ÝµùîQ}¦µ'gñËUú•±ßžÁ×Õ¢MúleAßï·Œø ÀÏ8Ê/Âñ½ìF‡ÞŒÃê°qP"õ«¼÷ã~)x,à'kÂ3pÜßáp;¡˜¶:ô6+¦¨¿Þ¯&v×~y;®i“^Ásð§"š’ñÜ$Ǩãáâ¾æK,8{qp!¡còî‚b•+ßÁ/Ûvl¼Ë|4æøcO=>{ “:–¾¾yŒ_*^›Ù6è<ÐѱÕVd·ÙÁ Y›ó·Ë¾]Ï3c&-ÏN…g÷¨>!HÐ`‘ ¾ÐÒÁž‚ã ž‰`°ÁóW®Z-!®1èA þM®%M³´GnY7BÔÆîº2ësÿ©ð«PîY0ÊÓVpÛ]VWI“»É»ÅêO)0X)ð€EeSûãÄîŒÍ  ` H-‹7K€Ñ¥âú D²¢Êc(×ù–â¡Kñ#‹ñÐìWdù‡ ^c(Á Ð)ðfóã_äŸQÌë²uÙ›6eÉ6èRÈ/ã"Ü_Ä1üÅbàÙÞGÁë鎫ѡ®S¢·Ê[à^Ó¼¸b0üBþ)~¿œ_ˆå'â—8|'àW½˜µØIHíL‰Ñ©f7‚=Þ T<øä8ž†ç`FÓŠC/¾‘s.ÛγÁã;ßûèØg€ûÃ%¾——§¬*]¶˜Ò"‡›ÃNä4»Tl¬xƨ%ÁŒîo8¯â¼`èÁ°I¡1W¢CŸy3[¼]Õ]Ìág8ÌNp2[k‹v³A¾%y¡ÌR̾-Æ•\‚‹ ˜ÑâŸaŸ€‘«/%¿®é„3ðuåÕKo¶µ¼Vupœ^ÇÓ¥.±˜›ó_­Éõæûr½«ƒ/•.&ŽXÂåŸççryÈÉÇáGø±x1œƒ7ý{O†S0)æcKãõèFßu%ºáú$QؤR ‰éÖ ~=w£%¤è’ pž¥˜T|8ˆòa“9˜ )Žm\¨µ6Û›YrÙL”qtÏ’ì‚lê†ôZÈß- úuÜ JHÖ%±ù]‡%ûÂyaÈd‰c;‡Ç#ðUø<î2_YY™ÏSRZâö2/s³¬LÖ6«=n× g¡«À’ϘQVºv#«JÅî @2Pº³]ù› ÊÖœÏûdþÇs>6[V°2ÅvWûϜܰý-`Š‚ü†TÁæ:MÙÙ¹ù*•J¬'5ª7 1|Ô#|µoµc‹ƒ’lÒ WqÓŸ)´Õã’˜Læé|žá‘\¢‘©…ÉeQžê˜Ð´£ÅÞÄ–€Û즡k“®’»Þ¤>4®¾{ŸÒ›ÒXgÌãnÔ¢ççëW²©8?ˆVÏqœæÀeqb©QY¶WîUâ~ü4܇Ÿþv:sI ÝV§‹ G§ÙÛHÒå§¢¶cúÜɈÿ¯PmvQ¸˜Öí´4âíµød£E‹ï¾‚÷]~ÕüŸ/ ­‘íâ°Ç¡/œ¸÷À~¼·óA7#¼”gÙdÉFø•”æÀ<ÁÿU„ƒêÊ­EÌyÁaxô}EµÄº!ј OKZ=_½4ÜÛ£†¥èH¯§;Nâ3'£1³_tâ¥ýŠ ¤ô>ÿÓ÷|°âÂø¦95M‹·¬«ÉjƒÝÌ»§že¿3Ï”=dÍ3J7“ò°¸\NCN“SC²X•®Éשµ…†Âµ;W4LfèÓx!÷½3ík…__©óëçÞT=ÕžgÍ…ÔZkXÎÝ(B µh‰úHÒYY*–3™m;w ·ŽÉ÷L$V‰±8êä¬N¼.ü~µ%l—55Wp|Z›n^ÅVQ3ÂKé2[+‡g¡s;>ûò¤sÆË,¯F‰i&Ò²n^ñïÿWÒ¤Ö­V h55Éš3šV»ÖÁLXœ ¿ñìÊš`ÌY§˜M2Øü}Ìͤäñ£ÐÐúZ'.½]wÓm FR2”˜a°Yap™ Mfká,xrÕÚÃÊ6Œûó#¾ ÷yüß“[Ëe‰k™7.ç "ý”ø{‡«`5ÄWËZ4%:7”2øi3)@æÐ›Ž~·•ô zЙõa?œ3º¼E_;}Óˆ_ûHvMZwŠÔNü0]®Ä¢¯YX‰¸! 4O§É…\ÈòåV˜†ŠÍ5;‰ÜÌß-ÚÞ©Æ Ža/Áži®‰Err§fjŸžµ^™/×eÁXúšê¢‰»ÉÛm§%`R`e%ˆ%Ùÿâ»sßîçž¼*Ü7Öpü>´ZjZÊÊq:æ”A¹™p×Ùoƒßs𷬵3ÂýÁÒ+¥p’ù¿móv$¿Zôƒ@¸÷Ôö• f/Y;››&Yhdðôx‚J»·ÒÊ÷xU>ꃅ‰\6d[rºb»Ñ"K t{€¾Ú]ó›V˜ih}šm7‡;ßé«bO NÃ!½ƒ¿ƒ©¨ð¨HMQ#…‘ðòjüTçóxL4îFô£†:C<§Cð€†¿ì¼´L¹6rø8qÀÖVt"ØÐX·¶?§ öÃQo¦+­(ÕšFàsp\L– Ybkãð^ÔVWt ~è"YŽ1‡åWtÈ`W^æòì{Ëó¥õc(!:ª„©³WÙ+‚ª’BÇ¿ŽÈˆ¥¿YóäÄ…58Í'èúËÑDç‰ðNA‰ÝYòãÌÏù|¿<Í÷æà‰ƒã>YWUX§«Æ*¸'Ûê.XHÑ5ä4ص„ uÉ:Uæªå’%°RüÒºu{ŒoÀÆâ]Øùåû¬]ðµÚ|Ÿ{.ÓÝ—»¼Š=½-ìtNÍ{emiAi~™Z¯Ö¨ušÄ—ÅñK¯Z!—+µiÀÈñ²ÊU:Ê9ðºK®ÖC»÷m;DŠÉŸµ7›ðÇÃ(E¿i ‰‘, @iRÛ.îå›»¸±Zì°;mv¹xÛâÝË[;ÕîMÏ䉀íÂ] ²Æõ{¤[¥ÍÒ­‰{ĺbKïz}ë…o>&À—#¯Á¦#WAažV£Ñˆ¥²4Eº\"3XâÅDˆïÚbÙËx™<€Ãa­Y :†£…ísw.Ú«)k‹ }à—Íáµ1t+üøBTçÞ}þ’ð;\‰5¢]¥ŸVľÊ?ìZÀ&Cš!-_gÔê´¤Ï T°±Ž(\Q­å@o1€™„@cQ»LL‘ÀEU¶’šWx_æ•NÅŒyq)‹¹%­Ö¨á,…Dám-þå$œÉ.ÍŒ™šÇ΃ie¹oèJ\UJ(4›Â¬úÈ7Ò áØêY8?nËO·ŠŠ”Žÿ½*Q²‘$ÕÚʵä´;·ï¿rbï›ÇÞƒ’6Îêº$ ¥Km;9¼µÕZ_!^SÈ7£† q=gV«µzmüKâ%q+¦-œË`j.uŸdÃÞºeÀî¦dÌÅ^í\ý-Ö)üâÙL]¥é¦gÇÏWz¼ž¢³%Ë/•(2¥S¿Í;À…K•¶“Œ5ÈüiÊÌL–bN¥æŸ|øÃéèÚß´ûS¸jOMM¥;Ç—ëÉmZóÆtHa6å©ÝikÉlØÐÎ÷ÁOˆõµ ìàl®ò•Üq¢ãXwâz =B¾*ON\¹23[–œ‘"M–ý*q»ý›[«›‹—×à';…í¸WØÈ ÖÖr0Ñ8.oRáòü)óÅnÌ•£ÀI&¢ê¢ Ô0UÙ™²œ +l_Õ’´›=Õo•t”·_‚ L%¿Å_ke¾Ô¸U™ÿn\£0¼ø›q[ãSQ–(BÈ5T=æOÛoCÚhÇ—¡¸¤ìUäö¸Z—à;AÔÑ~k¾3ß‘?xCÞùhb¥UcW¹”‰Å浹߷~ºíÊö+ŽRg©­ÔÂ)^—lŽgua»K~·#9òu9…Y…ruÖ$þyqT¾)c5¦—aj%¦µ>³/n¯öãQT#2$ɰíà ØR ³8žgIk¶hHé­J¿—œ„BêIoá{ññ¸jò¸Ouù*BûUfelý‡aÎoÇ¡…">6ÿé{€g>æ …ã>ß}cYáÜûIÌðƒI¤ „ d¶ïÇ—^øs<þŸö„ÈQ£ÚbO=[&h…Ö""–j*õI mPjçÿn"ü_Ê7v~,³&¶éCÀKˆ/ùÐ Q†I‘ 錴bc]cY žu Âs£«çÇö6„ïÏÇ| °ˆ;o´Ôu9ì.RxN}yª´ù²øµ²•æ!ü“þ]ƃ„íð^ÜL1qÕvUCfD4ùCƒˆ²HîŒn!.Pñ£bj–VëÊšŠÀ{=0‚êͦDŽ?ˆV®×­g ?,^å¸-€ˆ”?IHr´sø òCù.¶Bp¶*í|ï_4L¿º!üê@è“]Žf):ÖĆ™ Ók§ÕOoš ¶jœ*B‡f³ ÌZE¡R­T¾$™6ò@é(ðTX+K ªòJv&9/;sÉ>Énîú¡pŒ§RUQÆßWî-ó–y|Þ²b·Ëå( dV¤WfTIÄ„)4P9Dð›Ék*´rj3·$¶'‘—Ú#6™¬f+8œ«mËvq[Çž¡zAŽ*Lž<Ȇ´$I®\]¸I®F«²NœÕ°¡…Ä¥<àöY˜[U{K wu‡°þíq±ëI¡^WÕeqÿVõFš`B¸m$) ,Ì!Ý’L® ]ã u|«%?ã'ŒI_=ƒº[T!4ãn&‚°Ñã_¿oÓS*؇-;«ÒôIRhAˬI1ÿn3®Fõµáf|ÊxD»lYÁþV–Ìo¥à!d×b-;ßeAôË?ífüN¼(üþmÞ¿®%[RØÕµEä¨U¨¾Ž/ejó¥lž 6˜’ÉRÚ›9| m­tùvÛóK\þ½M¡Ñ+pT_~sIýýˆüÏ›~&‹K‰•ñ^ú#quÚ>ß ï2çGì{Žåã^‚–rçñ°RK»$ Qãäò=h­Ræy`#J•ZÛÂ~Þîw&×Ý('£ãÁ‘ã qœÁŠ•ëVkòLy¤£1‹ ³¿Œ‹L¬ÿhП6gÂï~p[X³©{} ö‡Îºø\‰§`‹ˆpþM¬.Wþ¡ªø [øçøø~ÜÓŸÐû)Œø;Y2᩸Ϥ5š4ÀüeþŸà£î6¾EܱÀ§è3à´ÓÑ8 KDñËâ®Z••%‘'…ûËŠ@!™Û,¥””Uº=UAòj¬¬áY Ìëü@Á?šì×…–€FòC5Ã&^K>ÀáÊE³Ÿu\æ ÙS»½´ÞÕ Àì4Bf*×WMÙŒ%o­€_ˆí]2±OOgŸ^–>½¿íu 7;âé~øß¼ëü endstream endobj 327 0 obj <> stream xÚcd`aa`ddäu rvŒÔvö Ž4 ضÿóa5ü¹Œõ‡ ÃYÆrL?䙈³È=ôbùÏÃ$ËÀÀÈ $~óƒÈ¯ R$üYˆh¢HcÛÔÄâ’Ô¢ÌâìÜÄ’ c=#çü‚Ê¢ÌôŒdMCKKs#KÇ\ ÒäÄ<_ âT  'G!8?93µ¤RAÃ&£¤¤ÀJ_¿¼¼\/1·X/¿(ÝNSG¡<³$C!(µ8µ¨,5EÁ-?¯DÁ/17Uì=0霟[P t‡‚o~JjQÐ…L Ì@×.clg`fddÑzû£ƒïWØ÷’ýŒßÆ0ÿÜð½Dtö’î¥K‹º«åÿr±Uu.éž-Ï÷Shí‚Ró¤~W]ZÙÛ=©›cÎìYóå»ç×LlîX± |Þǭ˧Îyæäµ gLY³`úäÓ»jÛ3ºêµ$ªf×Í™;kƹ§]º¦µoìšÁÁW¼ø§ý¶ßŠÓÙ帘§©þçáœÄÃÕÃýŸk?÷þ<<@Ìûý¡û4ά endstream endobj 329 0 obj <> stream xÚÕzyxSÕÖwNKÏ9 ‚6‹Ã9‚ˆˆ Ê ‚¢‚Leži¡¥Sš¤i›¤cšyX™ÓyÒ¦ ¡”2Q.PÅ‹ŠŠr¯#¯è÷ðÞûí´ Ž/×ûýñ½Ï÷$ÍsžtŸµÖ^ÃoýÖ>!xƒñ‚¸{Ñ¢õ«^žÿøª—V.2kÊ”ÀwOûWðü‘!þ•¡þûqë¹w ûèsÂâñBî |?C>¼ò&â©óÂy3Cxo(ïAÞdÞ Þó¼E¼•¼M¼^2OÆSòŒ<'¯”WÇkæíåá½Á;Ï{w…÷ïï¿ ’AD‰iÄsÄBb±Žˆ")‘Eh +QHTDq€8Nœ!._ß?„Ð!÷Å&ÇD§ÆOÞ‘!KO c“ÅiÂØi¿úBšß÷Mô΄„©S¦L5pñÔ”àÅÔàÅSÁ‹§ƒÏ/¦/f/‚r¦åL Ê™”3mZð"(pZPà´ ÀiA9Oå<=càbzpñôàâé·ÿ4czðöÁÛgµÏjŸÔ>#(pFPàŒ ÀA3‚gÎ îkfPòÌ ä™AÉ3ƒ’g%Ï Jž”<3(yVPò¬ äYA³‚gÎ œ5cÊäi/ˆ“%éi±ÒÑKÅ1±RÑè•âähÑo¾äñÁHÞbRÈÔ°™! qnáEóbˆžòÒxGˆ×È·è‹Ä‡¼OFq¸ ¼Á¼!¼»xÃy#xá<>ï^ž€7’woï~Þ¼ñ¼çxsy x y/ñó–ò–ñVñÖFÂD˜ ,8Am„pNÂE¸‰|¢'lQL”¥DQNT•8«‰¢–¨#bÑL´­DÑŽ|7±‡è$ö]Ä>¢›Øþ oy ªB°A9¼/‰§‰¸*Ž„, ù!tÛ ±ƒŽ…ù颯S ©z ƒ‰ÁkÛ‡,Ò9ôÞ¡ß {ó®”»Nwwì=ãï¹^Ãßtïø{s#'ŽâÈ(ñZèþ&AÙçºÞú»–‰sYÕ#K^Z¼põòÕK"#5ƒréᨠlf;ÐÍÕ ^_Z­0&+Yü0²þê D¾†°p>úÔ¢æL·<_n-*¨q”Òü3=-­¯ÁYl¬ê“q³ž=aËÔÄZ…·¡¶ÆëM¯³8fãm§ùÐý>¿LŽ^û`þEþ÷èYªŸBnO2½ÌQ³R‚Ò¬:!Ù±›ýâºoœ?G ?‡Iƒ˜ù©ñó¸°9‡”#‹0hô:P‚ÎÈ¢]>ÿ?v‹¤n{f”Ý÷‘O^-?òÍVR]åó)"p˜ífÐÞêªÆzyD’*N¼üôOhØ}ƒîA¼ù(”Áò¿Ú›2h´jÐyt^]Lž‡sMû:œN'.*+erìzÐJ§5%e­Ól‡-U]FóÐ[õ6=Ð&R½YGs½”ÚšWÄöœ£±yoÅ> m%ÿËÉ=´„…Wó,ŽSäÉô2Xë»ÅgŽ.[ÿ!š*õ„w}‰ _ò/£Ñ'3 Ÿ9¿zóBcKgM7´@snµ„Ö“)éY"–ÿujyZ£·²r×Û¯´,å>έà¦r\ZÉ| ¾[ó©£ÚZ54 y…q#˜•°rgÆ Ú‘7o6|w©¸Àšð±€ iõ¼ƒÀ`† b´ïܶîæpœxGQÏ”cØý+Ñ• ŠJ$ÉÂŒ(ˆ¢G#bñõëˆ<†1pcö¾÷ÓüïOzN‡óôÇMcÔä4ÂÈì)t‹Ú7KÈ×åk ôdn½a²Ã…£GµØ­»œàÒ9Œ{%ük'.&¹Ÿ§Ÿ~vó/R{êM+X.–Jܽ¹jöêÝcÇr#8òŠîaÀéZO§åÕôxa˜/›JÙ°þ›÷÷[fA u¹ ݋¼»”\Œ¥¹47“‚\½Z«’Älo†ˆ«Jõ‰Ú Ýúî@:ºû”Ê‹âëÐáý ·" e Ð!²Èá,D÷ÌýëÃÜðIøñõhôÛ o®:o±Yì`§]z§†És²*'5z£h#ÐZruKkúÅS7tÑ–:å¬÷ÒÛµn«ÛâúÓ]OÍfûc‡Ûq¸<üý/öòÏïñ¿ –Q»<ú­,×Dí˜7à†ìË¢$)¶]¬(‰þ')™ ç°¨sYo¯®/ݘZ—ÌÜ–ù8nña½¡mWQm¦ ì- ZK€ÁD‹ÌQŒNˆÒ}RR"µ·²7áT ]¿ð‚Ý«’ùŸö„£Aç^¾ˆâo~Wk¿YM>ãf–k¤¶§˜×3|™â·öÚÂÐTo)’ÚÛY´…rö|ûS O»ã•J*NdJd²É¾µ]z-RàÕ>%Ùp É(h27e7¤XW¸–ë;d«i3©>¿¸~9,†%q©KÌßFà};¯%­ÿéÌâ^~{Ó™-Á¦4^À¦,ð& b{‹ž£\ç+üh3•£ÕeC6ÆÌ:OEu]çöêxfl\Ÿ³Šæ·› ë§…2ÿdÔ‡–Êü(ö¢øï¢Iþ[‚ Ü Œ”â¸Â•“ ´&—Iê¢gá²É'ÿZ\üœ¤ÛÅäXZ¶©æ­X£|ëƒjÑ87-¥úëãÚ¾b@ËÑ¥‰‘ë#×½¥7è0tÓFÊ–×&«Ì9³éäš+í‡Ñ`ÀöN«Í+‰>¼åЦ.£Mã0;hrWcMIIgçî½mûJ+"lvܶ´S÷3F¼í‚mVjNN²019Q’(‰0 ÐcUVU}fqÞ¡í—'—b%®Í.È*׈v‹Ú’Úpã·›˜€»²,¿ ±ÙÛæis¸Ü¶m¡\:»îg¾ý‹mÄÓ™L“!ëèšz‘/±9®Ed5ÙmJ#–çænÞºccÔFƒ“ãßÖ»˜bk½¯¬ìø±·ŽžîrÚ]pöV +Ìs/:ðê±È×3*" vƒ]9b»ÀÐOè•%9.UcLÓÎ]qØ]«ž6Q Qd©U¢DI‚4N¯ÕhÌj¼[­Óèd¬d¡µª¡¨¸³û`Gw»Íf·ƒƒ¶Q†Â”òœÂÍ»wì‹ê2ØV=VdØÚ_=ƒ»Æ™:Ôá Gc?F½_-ü–£3P{T[ŠniÒŰ·š¨¨8s,#úGGá ó çDã¾×á ü4úØ”bÜçìåNšï?é9qzáÌÚžÕžµë¬˜os“¸kô Y e þïNÍŸ>ñÙ•“Xn$)É+l`QÏ T}aa=ƒF’|ÿù…oêÓ«f³¹ ´(ûاz´cÑ×ÛpcûŸíCoûÈlÈ ÌÑ;¬¿ƒò–91Ö‡‘oC¯¶ñÉ|¡=Éžt»I…²´‘{^†Ö¶øÿÕD Ýu¨ðj(ZÒ§¡x@C£.–UPÀ½ ã"¹PnLrœ(gÐÙ¤˜S„yI÷q[ï¾öfï~ë^ ý£ÈÓpNã™SoÛéˆëÓ£ÈÁCI6ŒŠOr´³þ&ª«ÍÒÁx}$·æ¿iQ.3gb7ý@jµ7k-®ª((½‚îª@ãŠÐ8[«¥ ZéªÞ]°‡Aϵ5Æ$öV!…™‡ Ô 5k1=½ÝÿßlÆ,üçþ‡0~BÞ©ÿ{þTÿ‡;÷ÿA§±?hþ3WCOôYsŽFܲ+¹¿ªUòêL ^jµN©Q½<þÅñ/<–«ÈV¤«2´2cšBÀ·ÂKÊã ‘…Ò¢2waE}D{OûÑöžæƒ®|w£ CÒ²£UèÖ¹ñ@As³©ØÃNF(DÓ`®9èÄd†ËÙ¹ngë®Ö=íõ•[åR7oŠh_×¾¶}]EJ„;¯( £›x§Y›W¾’ƒ 2\1âž´–ÈË‘—W¨)Щóq¿¶ïè±#î?º÷<Ð>.AHUÖ©ÒXHÉóòô˜ªê 3æNŸ7kŽ2/O™«¢Ñyj_³­‹©÷q„»È}õÆm,wžÊ-È+RÎzoú_g\Ê*‰­‡zº¼¢ÌÃø€šúí·2ºâA'}áþ¨¯^ü–ÿ½ÿtS`¡Þ­¸|,ÿºBwqœæB™U0;+~‡¢2©=´#ËJeÉ+aªÁØb/óü×Õî/á=¸°Ü1ƒVS3æ½4“y–TçÕy…Æ|ÖÌè#d9T@¹‰æ_{_yf‘}6`Êü—žÔÐ*òQ̽™èAºÐ\“mÎËc`}ÃÊΤ£Ñç•gFCд“h ßrÃz¸èþÒÂñiêKÈ«_ܹnøbI î<úzÚŽU\ì*xQï!¿+½• ÞüâÂ"g‰åVvÄŽxáäÀ=1d’ÐÖ(ªÝÍÎfË6r@ØA5€ÏäH¡ (ssµª95'0}’ ±B’!Vçæ)u9fvÄžV{;Óä#o[üg`æÿmrÕUæÊXÈÊÉÍS«Ô*•JÍ-ãæEÈäé ™üw6°‘ÀTô7%°p/"Ðc^äºÊ¯D/ÿÛÚ}ú6c­áîÊä¨ÜgR¸qÏki™ò²ŒúþŽÞUSïeù[›Ò%7ª²¸´[oiËtåÚòQÑ76 {ñ{ºw”ª^S¦·gÀ¨`6¡S>ÔÚ__ü¹œÂ/^„[*C_peTT¢1ŠI¹s²·Pûê јr_ %Õí³ôöAH(;…'kº¹40k¾þ½?í:ÿ’ÿž›kÓòæ —¾üê¤'a2Í-@÷p+­FÐ\‰Gà‰Ï  ÜGi~wRaœ+wíKº>¯ÓœôÖ0A9ˆjB¡¡'¼¥»\»€v“è)õ;Ü à0J srƒ&e$hã€{Ð61™hˆ±Ú\eª¦SdÂ'Á]×2+@}U¶VYÉ*S©Dô­j{¢!ŽI¼ƒ‹¨Û²Í‹NãhŒ¹ŠÞ¸ºçΚÈm©ö½,R¡EÔ74ò a€HnèYŽpÑÜîoä¡ê Š˜K$žåõÜã,$¶§Iâ¶-׬é#._Ü?_æ»ù„8qݯó†ú¿÷ÿS >0«}±Î#¹MÜtn&·‰Í¤Š¹uh27 ­ÄHÊ¢ûp½Žgݔ٥µkV´jVK©Æ-à†`Ï9{6½µáLî5¸ßz¾ýë_öu¼QwÞ㪸Pk®Is½ÔêÎg‘“\<ºåÓæb%“ ’©¢Ë,M7C±3ÞïïÎr.³ÛqÇ»-ÍÞ#Ö.\÷¤ÇkÆÕ‹]¼C‡‹#³:Ièî[DÆÄ`ç`~å«ÂøÙ‚iÏÛÚê)®${¢5@¯äýô*$§ ?Ø}¾öP‡ÍeÚý‹¾áÆD”¥•¥–¥eFX¶£6&£23"zYÔò¨eŠ”L‰D!”ÇjwxÀYÌæyIi|i#k§lÅ.·³ vWDËÁÖC-‡n§ËdQz¹¼D†#4+®sÆôêtŒ >µ-¢nIGÄšV}°úƒœÊ“͈‡`°Ùl[QYDIUIuiÕ[W#J«KjjÊvÕuºwrg‘1Œ›+&ëÍÍÙ òÔ”Ü,¹X.Rˆó²•Ùê,ÌòÝz—Ì‘¸?i¿ð€Á¡wà$µRÕ»ókªð6Åü篓>x8SDÏ·::.QŸ<£Ið¤NÃCìO%1ì&ûeUQ ï“•”f–0œ‹”[³mxÊö·SÍö6¦9€²ýi‰ªz\Ý8Ï ÿû×Cý—Ð7z 7››ÁŒ±of¢A¦b{YÐ*#N?•Ï=„œFà ]‚^@£X4‰Ös v5¬ÏÞ*ÊQ+órT¹µÛä&ÀB´4—@©AUÊT‚±ÒQQ÷ÕÇ 0|ÿŒÜãÜlÖ”µ6Od¦•d*¤ZÓòÓ]²¢t·$?Ù!zû¬,±Î®u²ùPì.°º­x6ƒ÷áÔŠKpV©¢ÿ?8# Øçõ?æA ÷5Š>A-Wø7Þ œ[Á†_'j/¶wž¾ð%|TÑU°§´¸¬ Xé"•EÍäš2µ9ú©ÉãŒóVÍ]¥£}ƬÁ~ÕÒé”9Àät,åâ¾| ñ±KÃý bÐð‰(ŒÉ.„—£Và1TcTÓü¯_ãtQï{P¢™àÐ’üç¬2¼Ö#㢥˜¬XXë_ËýÀ\ E¦âà‰¿m®CS<á?]Dk//û˜#p6!­¡š<†í,×EE§×2RT@Eá%hë¢4o=Ùº#0ZóýuÖ/›,Ç¡k§'¾bGy”%è9\´à'’ãäÁí+X ¥[±&q5Ð/2›®šh´hº‹‚ {Iµ~Ï‚‡N*"ŒÕ%ΜÞlé²×dØá?^ä·7þ%|‰”â·l^¬’ñÉö},:DU»Jk™¿à3×e¶¥:–B<.¦<43¬ºçFËÐtÿn¶5¢iC? »’jl4ƱCg³žSznp*÷ 72¹å^Ò±N6ûêv[[°ûåäkpÂX¹À%¶Šl",>-K%Ų—Ú[g;Êx(nÒ­‚ôLC&ÃE‘zÕÅ‚»¼Ô]xêŠÝ—麂Â:æK²¶ /åNàJVý¿uÊ×w®6àqÿ½üö=þçéÔ)8³ºgG™²,»B••¦e¤GoعjË–ôt™Fˆ¹B_ ŽâŒ¯!såŽ2Š Kù=ö·õ`Ö(Ú£)=‘JÔ*„ì‚-ìC’/yÇÆo÷È(‘ľ‡ýšÏ›MEø–¶u¶t¬sª ³!—Î’ës·¡MøF5V^_ôAF¢:«öLÛ{_} ´‡{NJèí\.99Y:Z±j[äöUÛh$иè½-°‡d¡1l¹À&­¥¼õ†,7ŽJ¬y„µÒJIEjµÆ¡sæ”A ¸íöí¡^1†õ'#HLšï1ËÃч—_ø˜ µ  »êãb8KÃ+ZÌ$A‚19GkÒhu¥…'è<³FÍN§@cQ˜pß*¨vá©ËsøXIЇ?Ê]ÀºHáf½ˆÔªSš)Ÿuâ)ÍÅ|~ò{ý„y/‹ç²«à•òìS†bG †é¼K€ä’¤YG|æ0\^Z€Báý™­‘ùGYÁ€Þ¸ˆâ/ò»½TE ’î¾cÏ)N¶µ²–ü|·ÓÙutÿÑ}G«=Uõ5u4ç „yÊE¿ZN&K혹v $<§ÀUäm2ƳfµZ£ÓE­Ý²vÛZ™Tž’žJ#å+,:Ëx¨_Yv 5±æuý¡y2iðTöϘ÷‹Õÿ—æ!Þç3•¢O1K@)–GY~I ÔÒüÖ†4X(—H_ø.û8n%TÙÏÐ6ªQZ#§§J**µ¿ñü½w¯ÿåJè75»ASƒñ0¼ùÝhDÀÞZªÑkˆÃD––h–i–f?ºr O»tmimeMN•8Mž%Y·[´ýŠÐçEûakõ0TÙÊêlôפ§ OÊr=_Ñß9¨?L #ZåXK"( @–&;iNÜÜÄ9y¢ÜÄlñ–Ÿ6þ´ ñ4åæR ü"À(½¯_ö§ï¡?LßlæCýûN#Åûn\u4zÅs¸` ËG%À¶_-þÃìmò±/(.QTk•óD¿ïxG=†¦¦O¤£éý«­|ü àÄÝ…&¢Á(äÉð/¡¡“Ñ`î†ß­ƒY8 ä 0cà_ú9Ã0Ø)]¦ê\¥ ÎG³: ÃÚt]µ>)ÐEÿg„[éUÉЫÿXo€±T}Æ?Ô÷,¥ÏM;Ø[Rj{2lÆNêí{ŽÔÆ¢yTKÜž4Œ½h( ù 9 âîÅ»1ug ý…j9ÀðܖѽnñL,fRxºÄÃ#}üíý¯ÿ­›<—¾1™¾ÝÚУbo8öÿyô/?#H×d(AB§–§7ÖWW61Ð;ݳÌJ«HŽæBžÀSóð¯F÷²àt»·×êtäãâtã OmæMNêÖm"Ì–8"Ýs‰å·èECPÓOžËèÔ»Œ·y[›_ mÇûÏãfâÁÎÒfë©®«¬ivx® =åÆD–;@mÞnÜÌȤ¨ÛOnOtt³èåq¶2ä^Ø«*Zë”ZS,ÒŸ ³lå‘¢{üžp~uu ¾%T”©Jãj×Fx_i|ÅûJóÜ›ÆjÈÉ•ër•âÅVaä*Sd9r ëE¥PMó£ê²*“%ÊTùƃIÝÌÐ…ÆzÏíû¡ëz÷õò½µ‡Þà× )å+MKgA’«L–F¦D¦EÆ|ûy£[x^ÓØ U}8íøE §{z‘þ3~ÚÓÿl¶ÃkZÉr)¡OXƒ}9Œ#&àdþÃ$`» ±Ò㥃5¨¡w$›71|%N—žÀ£·'½é$äv¶o¢,å7*ð øåÉuü1lÜ ŽÏÆ€0[(¤QÅýå–JPL}tÑ×™68g‹ÃÃYà•cÎ <Ü}‰Ú´6f3¶ý¨¾Lûšš™[™tÌš=8ÊÝÕãÅóÛÃý\€‹êúÏûqúƒ\ð!UæRm•ªX^œYRR•Ò¶5®ÇC°ÔɬŒ­«6/œ´”:‚7"¨!3T%,x*ËK+*j«kÊëps©ÕIjÄÊ6MOA¦B“m¦¥h‡'Ê€LK–[‘Ÿ[•[¶s|÷ÎýF‡W+8]N›½ywÄþc{ß¼„AÖC®Ã³ ¬Ê—ç² ËÎÉËÎ)äÙi´‰ÌhLõÈÔEª|} n”PQ™_f¡o×ﯱÉàãko€rþvÞðÔ1xÃ\õüØ6ÿ²‡âý"¶ejz-‰¹p˜JÕfKì‹b!Ö tªÌ±‹E'¨Æ@³¿}Ó/=²­ÆpöJøÑë ;ÙÅCEQFCôkªýp;º«hÌ·§×ü;䮦¼^,‚#)§šsô;U;ÌØ˜MÊž6Š,EPˆ0§w§ÇÞpŸö‡üÇ‹h}àÚØßû÷tÎÍ|OÕ©¿Ð\u˜’js%L6™q¦ Óäý»o©püÕÂ*U£La²ðÂøß/°ç— ZÅÿ¶1³ß™5ˆ: 'ô•/Þ1fa÷ûë˜ÝÑ?ºáŽ[¼}ÃÀ ØÀ€KàtK¸òÑÅPïη:ê´tÕµWµ¶Á>èJj‹«ÜZ·Éºè§E4^”1ò÷·*<éÔošÕ-ž‚¯’¯KZ̪ñ ¼ÿ®…A]ýmªïÙögWBÑd¤êð´‚ñi”ä%)îLG¦-蔵 Á«Á˜WÜàrà1ÑNî_lßOØJwÑsÄÜÝøÙA‡ì¸©ÀT‹M­AÂÊéÌkŠ|=á\ ¿þð-â£!SÉbãA¤NÊÑõzÃõø.µI¥a_¡ú¨ˆVÙ5…L)¸\‡*Ž›?Sï™b™8M©LÝSÓFM€vüt%Àxäh/² ¸ÛžÀ¹ý[RÌÂ~¢à…ºÅ¯o¢ùm{Ždõ D¼Ÿ"è" а©?püZMŽŽ˜­ä†Ð¯øÏOW&¹ÿÖ‡.Â*<Ó‡÷~ŠRzù‡% „±Â˜¤ÙÙ)É Âh3Ý$ǰ©jtd–ÌRÌBayUAQ]S­¯®©ÊáÊ·9Š€>Å%=ý“Dv`’8ô»$ä¨iÀ×i&Ãìkɧõ4šX%˜O.že»ÂÂîjï^§×éÌ5FG.Èèá²ÿ‚ $²דÜ ˜!¡…ó† v b6ô»!‡‡2OO\‘?­pì¿îý?žQ([ endstream endobj 331 0 obj <> stream xÚSkP”×þ–…ï;fµ¬·Sý>Ó¦N§­J i E+A-"$J F‰ÜÙïÛ]va¯°À» {ao°»,²^b ‰¢ xÁ1—bÌű%“Ž©™1ÓÔ9Û9?ÚÝL§?ú³3gžïyÞ÷}ž÷¼GD%'S"‘hÕväþjÿ‹EEÏgd$b™±ŸP±µI±uâØšdrŒµ)¯ÿóÏ)ë(ŠšøQ½+ض*¿ˆý~:%‰’Ù›žÝYWSÏ+Ž6®/¨«8ÚX»¾H]TÙXüÏ E‰Vl¢²©íÔê0UIÕ$5R|¼âJjÅQOQ¹T>µ‡ÚKí£öSÅTZ%¢’¨TX$M%å‹K“–<–‚RÌ)ßIÂ^­áƒxµ÷a™¬ÚÜÈCª©~‹í¥Çû†Ãpi?ÂJ¾b¦8õ—øªlzlúäôèò%y°?ä z|ΠB(ÐâW³í´®Ó`2´VÊ3‹Ÿ+Ê,n5¶š u2¶Ú‹Â¨úöá_¿}x¾Rîjs™ú»ðø„…>­ûåIyáÙ?ž-œÐ:5ýš>ôŸž±T¼ +«-«/«Ë< Wê„Ve«Ö¨4‚€š½šÖN÷Û\Wïü9ùòì_./Ïzœé+ Õ ä½ýâTÞÛ…çä†^ƒCgEí´ºUÓÌ2ûô7*äóǯŸ?æ3úu~3’tÜ|w‡n½»(šºvÿ*ÎYÇØX‹Lízy@ÊÉÊmÏ\ Ô߸O`æfà†#j‡Ó§8—dMO‘-ä×dÃC²g³Wa.<=épØàB#MݶÞ(~‘&é¾|œ 8aêc¼¯f'á”*\ŽÈR"ƒž®°£Ë§>›¿y®´¸ñùvð_ZÎ#‰e;±ä¥ÅôÙ%Ì/åàÒóxGŒ‘­A[ÐÌ'ê¡IAYõÌ_K?ç¦à–kllôÄDç$  íê>5*ôh¸Zz·IAoaÀcõ€îåÍoó*»U t`KÇκ°j8êåp>Ù(ÛÎìÉWUì¸ÄÂ…¯Ï÷EíÑî( QÞÄY×.ÞÀ¿}´ëfúØõ†%¼o)z]úXÿhJö†ºf?B„ÂOYf¿¼öŒûïÈÉ`)ùñ@&»n‹­™–~¯oj qà´9»£Ú¨iЧ_Ï=æœLÇIc¤%ⱜ޸N[Õi@áà@„ƒso«lñä&P´óÆ&ÜÒiio‡è´uØt½réC}“»¡·PfVÞfêû꼊îv{´Q¯îÐu» `„z'ï呉ÈdqÙ]Ý`ƒn47?<Ã~J_{dÊÝJ^èìæŠàçƒú+(^ó=üXæd.¾óÎìû0y¤÷22%å寲¡â­¶$±ÞÂó‹éf¼bï–$Žô[œ{Z6ÖdS±Çh•Ú¤à@ãÒú;ôËq2KÇYÍ€¤ßò=¯r·D¸ïèPÀ9nî¸60wµÂÌ\ÿƒ¥³ÖCÕ,LŒBkP(Æ÷5òyCÍþÿ¡ Ì‚î~[e‚ªZ9Ñà«‚ð¦V!Äm,âÙÒ83'ñ¦Ò8;ödÜøY…UÉn£µ©Qðë9éÝ d¶„–>àuZu¼Í‡³èˆßÐùx®o¥áŒ=‰œ:7߉‘æ=QV1šTÅétÄ÷_z }§á³Ÿ²‡ T]y⇿µ(ºü'\ckl·Œ$·nßlY ß#I8í§qŠëîÞÁâlL“'Y²†¨?É=èÎÜÏY+}fv9òây9¥ϲÙPvÏ|;a²Lˆ1 veúIüjÎ’t +0‘E™ƒ·Ž%ZÙlàŸ.ÂI‡ï“ÙLZz\ÑÚ¢R{µaN:Ö vko|ˆazÀêòƒÅ=Ô³&0%F»#úþåà4¶>Ô<4 Œ²RÏ¥×qöp úµ×âÞ>³‹¢oÓK’3µ¶Ú@ÓhÅã4œ‡i×éa«Ê£Z¦ƒ×PHãVq¯à/è!“ï›E7ó–:µ[;Ä]$åôïöòE•Çz®°8ÈDLjö7´ ÕóAsˆ“ܱ\ÎqÓD°3lªØýû´}i©Ö´'¥~ð[ø’eÓ"ÿ×ê~6$T endstream endobj 333 0 obj <> stream xÚí¼ xSÕÖ?œPzö”˜kôê9Î "ƒ ƒŠ 32ÏóЙiÓ)é¶iædgNÓ4é´iÓ¦ó¥ÌeAÄy@½÷ª;õpïûß'mDîÈý?ï÷~÷{ŸïIÈ’“µ×^Ão­µ×:åræp¹Ü{Vnœ½bѺgVÏ_µtâ„éϳŸMnà7 nŠÞ?˜YÁ¼ýPdÝ/³#æp§Þ‹_#¶`_Ÿ¿¿rÆà—uëFrf âp9wqâŒãLåÌâ,â¬âlæÄr„1§ˆ£åX9nŽÓÌÙÍ9Ä9É9Ïy—ó1çkΜ?s û(w w÷%î<î2îzîn"7ƒ›ÏUrÜR®‡ÛÀíàîããžå^â^ç~ÁýžÛ7hР»Ý7èáAO ?hÚ ­´=N•¹s\LnFBvbJJœ0-+%.>ë¶2v†>‰ŠOLœ8aÂÄ©á7ÓÂo¦¼ynBøÍÄð›çÂož¿™~¦ó\˜Îsa:“Ât&…éL Ó™4)üfrøM˜ò¤0åIaʓ”'…)Oœ&89üóÉá_M_<%üÕ”0å)ák¦„)O _<5ÌóÔ0å©aV§†Y&85Lpj˜àÔ0Á©a‚Ó§…yž¦<-LyZ˜ò´0åiaÊÓ”§…)O Sž¦<=Lyz˜òô0åéaÊÓÔ§‡)OŸ:aܤ9iBQvV\Æ#KÓbã2RY•&ŒJý«9î}\Ÿû$g4oçð*±*b=ww+g;'jDyœþ÷*ç}Îp8œ4®†Cp†p†b·ƹ›3œ3‚sç^ÎHs‡Ïùç~Ž€óçAÎï±ÛPœÇ8sžà<ÉyŠ3Š3šó4çÎXÎ³ØÆs&p&r&q&sžçLáLãLç¼Èy‰ó2v²Ùœ9œ¹œyœùœœ…Øå^å,æ,á,å,ã,ç¬à¬ä¬æ¬á¬å¬ã¬çlàlälâlæj¹:®ž ¹ìX&®™káZ¹6®[Âu`Gsr˸.®›[έàVr«°ãy¹ÕÜ®[Ë­ãú¹õØÜFn·™ÛÂmå¶qÛ±cvr»¸»¸»¹ÝÜ=Üî^ì¨û¹¸¹‡¸‡¹½Ü#Ü£Üc-‹ƒ8¯`–âñâ¿ Š‹PF\üÜàYƒ3_ˆL‹i}J8jô¨F¯xzܘacªž‰ûòXÿ³ñã¸ã.¿8ñ®‰_>×<©pòòÉ>¯›òДú©OOý|Ú™é—_(}1÷%ÃŒÕ/yÿÌ„™ßΚ<ëê+ f ç<3§snѼ±ó:æo›eÁ‹ < _èX4lQû«pñ¢Å§–ÌZr|éö¥×—¥/»²Ü½bÁŠ·‡ÿ÷‡§? :Äh¬„‹ÄA¿Úâ¯ñ•U8*ì¿z¬%«ò+r( ‘¯“Ie²´´—Á"¨²+L²ÿç¨ÄËEÁâ Ò †ÿWÄ£Tû‰ øâ¾²ÐG/íମыƒ£ª‘Ùû‰W/yôZU‡¦á×Zž¤îËß›Ö+={àáÒ¿¢ ¸P^°yŽ aÝε 똻™E‚‹w¼ºcq^º@­R+ ÊíŠi$Êa‰×^zq? g@cñë×è ­¬²ºÈÒb»œ’À‚¤ü‚èø5™«á¸Ø»n/ÉÛß›U“^•ÇÀm ÐÎ$U`Ò^fèw_t¢»ß£à.y{A‰ÞaÎó'ȶ='‘Óö3wýá‹t÷»¼šŒ"Ÿ/UP I˜4¾zYúSs ù’ÝýÚëehÈ¥<ÌC[i¨†*½š¼¹48ê_\‚E)?jfrÅ¿H%^ÉÈïŽóΣó}r~:WRTÄŒ`FlbfCæEÈ,=É¼Šždî1k­j+$­&‹™†¥"¯¬ì)4,M‡hI]Ël9­8Î-E:þ*Tyô¯P-þ–µX^/ºÿ;~š¦ f“Y墦ƪÚZŠç­É÷'S¼^lYz°F"þ%ov&¶ºb­*U™7ÑLd´øU¼Z¼Z²Zž)Щµ¬u@eÖX(#Qj´·Ø*PkŸVP¹¿jÅK©¹Ôä$­‹ŠÂ–õa[W÷ ¼ÉÈ®÷ã=ÞTØ7ŽÏ¬ÈS19ðQ8®„|z^sÜᬃ=¡ FDÃJC%¬„7ä(bÙ’דԹ¾v=$yW0z5$âæ¾;~¼_·¼nê0ïö6W7·ú:a6x³öl1Ï€sȦÒ`ÉÜ—Ç<ÊDbÜdF8htñ·Ü™ýrqß³Ø2Þâµü–/û`›}_%yӢ㵠Ԃ'¢¯½Î‰&ù‰|˜«Ï‡dL¢µƒ¾ J´¶blqÒÜ"ùöÔuŠ a©.O¸èæG«ùî×Oî?ÉÏöN}™.ªñË^Y±hãšM«7¬g T …BµA 5d0’𣙑™„J¨Ý”/S«‹ôEx5¢@_€¯!™©Doï‘ÃÇ?ýá9ËI;@߸øè˜ 3ž¹ÒZý^¯ß—çK¥dÕÏ‹Äß7¼vä®ïgß@ó>^øïËŸ‚—ø]kÁcpO¢i©pIÖËK²EÅKK¡„”—èìT)Õ€½‘÷é×°yªa6©³ÓžG-„+š’Ž’%DßÝLC_^mº‰Tq"ÃE‘>Eƒ¿{EÐðóÉN7•ZœæR Vßký'á[äç£÷OŸ1:zbjU¶ß竬oNw¥P·´^3±B]àõÔ£ù¨êY"&Q·Ê%x9B4ðzj°"ð2X¤—A2Yhé o|\ Ù`V²Tk“Q™0~nfü|†˜Á žÃ *”Èd0ª *lÇþi‚C"oª >ìEÔ•€„ûC=*¸qà[ôV½’uUžZ_NuFº8G8þÒ„ŸÑ°¯~@w÷*ÂÜCˉ­º˜œädEyƒº¾ OûµX¬VhÃP¥·¨MX:bsÞŽÂ p;Œ)‰q«*“Ú€?TC­Çæ"PªÚ+쎆æÝ•{ i&vë\ ®xc4Œ…sT/NÎWækóá"¸¸7ïLØÁêƒU£$¬ßQêGK?æ½Ç×ð†åç‹êÛÊ;a3l•U¥‘™é²”¬rq]=åio-o{•yéf 3ž‚ÌÐ2æyÄ_S-÷©}ðmx¬»ãÉû±®£dì!Ñ ™h0sµ®ÍYJß®~ø‘:›fYÖE?È*f(1É.þFýt@‡Þv qð“·Zq›÷QÄÇ}ÓùÉÌöHaß«;ÐåLÔ@Ÿ±Çð•ÄÖ…GÍ]þD<3 sEÊ€)»JZ Ɇ²šÚ †âÜ»Ï<Õ}Öî°ÚpráSàRíãp%\aÕ6Ü2ý»ëFîÚ/éFu»ÅxŸ¢•ès¾ÌJœ½N ÿゾCÜóè. žÙÒ’Y!*˪ÂÖz²öõð-øñKÇ&[É"bâÄWGÑpîáeçRÈÑÌF>ïShÆÆa†÷k3-f] MeÑî íü0. Ÿyã j&œµ¿ø#L°:x?¿œ{·õèëWb¦QpÕæõ;25Zü€EÆìª¼ÒMMKk§~å%y‚OÔrw}€tF#Ñe¾€“ô£WÌIOŠÏÚwÂh{VYë+k¨–V§ÑÙ0'_—…#ÚÜs‰(4^Cóíè)²K ¢qÌÐײJÓ-ép\³"=N¾n#¹ÄD¢!T qÛã:Nê°ÝC™¡Ê4óSžÉNjЈ÷¯zøñëjfä jp^J6CÑ&ø n>ýŽf÷gÿmÄiï8ç"s}ð_]úþV<ê’}ƒXªýa²áß “çÿ:Ln Nø—|õ~ô„Ídƒ¯÷4 òñNYDVÙqÈë»›°âPOó¼%ØSqeVÉ›7 6Mé•YÃWëuˆ“³Úª'ûFv›±„½ž_ýKèj-ÝXú{Cm 7H¸M|!~ Ò¢Ý-´@·£Òâ.k.ï°5‘HGTAdž’t‡°z;“ÂÍ0"ªM‘o´‘t †ÙÆga™Æ£._‡Fáç4zš"P—j­…PuÙÊÜÌòÅÌò…ÌÊüèü˜±Ÿ­GR>‚®c$»‰9ê%¿54`þÖƒv°Ð#Ÿ½ú%¯»»ol<(…dK½:†¾Y0˜*±"’ÔÉ6C1$…èàeWAÞ??:~6—™\Ð?Zr|Ž/Ç&±H°R* .ZÏÖïÅ.viñ‘%5q®S 5»s`Ž>’£˜ÏùèÂý:_ÑQQã ¸‚?ûÕ1TÌ3äAr!É5ûitb0²€·µšB# ^÷yx)Ù: ‡³I/.{ž’a¦d¬r½<-iìàý*"øaáo<²¼í%lë˜1Ì+Ìjf ËÌ@i'Dü ÑCl‘S¹Ð²C-É|râ¬Çà\8¿qËÑ•çs?Õ_]¸Ø½ç͆×!º¾ÅDz™A†"}N9$ËŒ¶YEïSr¨*Ò¨¤™yY…,+è¥C¬ûo‰è«ÁßÉëÙ}ÇÒm¼/ôê«á×ðó¶3í;]s^ÁEÆShóJE¾1âÜå1ó738މ`ø±© !Bò9B"6¶ÐÐf°â TX¢ÇèL¶˜Ç(Ä%Á£i g–ºÆ¦°œÖ¦-Åz*€Zq"C]G[|»ûfð…Í ¹Q“@ãJ‰eð¦ Ä$ce<Oƒ.äÀ Œl™jÖöíÛ¶ÎÓ¯À‚¾—ÈÌ55Ó¨öSлt^‘;Û ÄáBîC™rEz¡4[,ŠÑ%bF‘h¬2Õ°:=Ïé;¶¶Ä˜WÙ6’>B„²XKÕ^Zk®SˆÑ»´?0’enw`ËÝírtý=9ò¤¬ûðÔâDây?QóÙŒnsšy ×À±ãÚ1tËW˜“•öµ9‰¦ 3æ‡Äüœ‡››cL«l›Âüôy%$ G±öœý~Dðó7øÎŒ–X$m›•F3´êm8!h«5öP¦AÊqž‹m¥«UEC¹ž-¢‹0î’³ælžD='ÝüqòqåEx~]ýÓÕ7÷t¯9Ñ`xyB3Èœ«Ýé¤óYÚ¦ÃëšçYHÁ,g¦2“˜íÌRô3EÑ—àÏá7($Ä/¨Ío’„Äxô:¯›U²è¯”\q›’yb!"¯Û‡øp&†“ÔäTk'ªÐQ¦ D'k£¨lâo.”±)[RŠ¥†Vƒ5à ÐÕdi©O)6FŒ †ýA–6’¡D¡ Ô É¦zUÍ(qU¥]ͦ]T5¾0S‹íû—‹?J¼b´4Xyè{4î*¯-b½êhiÖÄÒ7i€q#æ‘KsŸxžÚ·×fw’v"Pím y9µ9µ)©Ù’¤©ïo~ûû÷ÞBƒ¨àÐVkØGØ“ÁŸ_`Õ÷hÈÔxí¬‰îÀ_ÙÊÛY;»{е³Â˜D¸r@/XÙà-+õ×ÖÖ×ט‹m «üàÜ}sÌ)Í­Í„dfš&ƒb) Á¼¦È?ù‰˜fNé’z ½Þ%Ÿ­¸±äIkÂIˆ­Ìn±ìÙµgÏž]‡ìí:ɳE¼U¹4ÌØ™ž“7vÒØçÆ'Ñ; »Ñ´‡ª0€‰nðE¡¡¡oð€ðÎÿkí ƒ6à¹xñxùfxrš YœMHò-õt°tµX±FKô%ô¼öóà­aúr¼!Ð7¸‹ó=ïDô„À¯´_ÑÍu< •z6Àß,‹×)¶ãP—Û×ÚÎѰԀñÊ´ ,â’»¤s´à5fÌkÌ3ǘ±™9³º Ÿ¹´ GOAOâ×’jGµµÚpóˆ* r¨ ãRB*ìGÔÀjçÁ[F|»mv6Z)¬i})+Ó© W+—2i7ßdDÁ7åî\Sd8÷E° é>çÁyÔé¤ôÍz0jÞDÞĺ’³4Þ ºÁbP%v§¹³Á,@ÙوdæÚŠ­ù3 „ÃXb¥1’žíµwc¸H‚î^Å«ôÍ…€¹,NÞ“gŒìOY$µ}ÓjÙ#¼¯‚)_ñz‚‘}kùÏäÎe†$,Ë™ç‘Ì,4ŒY‰’ÑftZŠæQ¸_À<€–2›(^®†°°I¼¥a|lÈ׎^A/4á|µÔèÀæý9¼°´sFÃjû"¸2÷íd0¢ 4R2OÁWиÄÓ» [çˆ!D¹P‹Î`_¡¯£c_ñ„’‡Ž'ÒL€‰¢U¤±Ž¢EËÀ zŠÅ¾ž>?¦,ǘ qŠ€#÷ >jµåV/…î"Þ¹Ï ¥a‚&6+5aÇJùúPä¿Zó¥ÄkªCG½è(¶9ú*Úw#âÎ.jnñÄBWªc\)®C{á|ÿ– ¶ür3€ |Ë>’¸5å:7$÷l¾bÓØ´š²tŪdI\<|îB‹·¿“Ñ_¹ÙsÉóý>×¹÷ÄøÒ£$´£Hæ>ªµŽÒ:êmâúbæ~¾°i㌑†­®Ø Þª7âüa™äÑ“èÒIŒt —ߺþ³ì× ùÓ矢!4ühó{› Í…ÆBóÜ A®%Ç”gßâIÛ«9HšÁÅÓ§.S?Á3/UŒ2hÓ* i7[í4J¡+m.ÎÜÐçŸÉgŸXÀÜY80÷rêWñèq_3‘”ƒ«L§FçŽK¡+v} ®¾ôVµ ›’\«’ÓÌZ,Îórä†B'å2U쫨HÅB`ú0Î.`0=Ú÷"?‡ÉÂu ¥×x¡©µ©å˜©’»‰j¯6™¾Ù ¢ãU a…¤„NcÆ`DlÀj™ï_BÄî4旅­ Åkh¥Zˆ“ð-eõ4{¢)Á´‡çœþt{¨$Ð÷@C(é«¥1,€—…ôïÇúÇX•$s0‚댽L¡xý»ŠïÍ5†XJh«HT`•¡ª¬ÜSÝbªgA$=‡Š_¥™ËŽa8ÛÄŠlM6œ WŸ“µéÛa‰¾XFìÑoGÓœ8Ø ÿ¼Üj÷M p+Y¾ªÁAhÏ.‹>È<¹‡u€yʽͽݵÍ\`ʨ‚¤‘p›Ìµ÷ô@7z`7ÎVKšœõs0¡D$0*ÍJ»Ž4•ÐTcq•í)ßãÚ³ ݇ŸÝè¾Ê^û¹X6 Aó~)FÜüâu¾,©8Y–4‡ÉÆÄÅäwï.ìŒF¼Äß‚îÕ›u¸à%ê1$ Æ!:BT‰‹“*}™Ü›gÛ‚ Nc`«C-ЫdÚâ8†·¹'–áid™VFê U»dwQG<‹†Å »ÔNU9,%MÀæë4ÔAÒÊÆ%±ö6Tmcµ4ÁMmüÑN¼Ð;Í™+0jMx%¨ÕjuÚ¢ñ%QEN¯ª²¶&דAéúO P2s?à‚ó¶¬Y¤!5Ä–¨öý´X¿ù©ó†i©åÕÁg¼È&áþxy®F4°¦ìMíúæw ÆØqªvËÑôÃð4ü›ŸÐ04x*Ìèu0*=!–Dªº©çk7+¶&Çecsã`L¨Îl•;•Nè&Ù,²LqŒ_U•Ÿ¶ƒâwžó­Æê1Gž!ÌϺ‡> ßh¯»`²šìØÍ@gÑÕ¸ªTEI3㣳·CòÑ8>¦áûõˆüÞ†³èv¸_V—Þ²7øL5»å–«Ès6`÷\ ºjuËi&$uDûÖá5‡zй—‰ø‰D÷ÒGசÎnr@O8" YhÚĠ7!ß à%Ç¥ û<ÎjK5$]ˆ]BãLgÓ$ó€j…B–»-m+œ ·½Uü¦Î]¡tï_‰ËËTšåå6\CrÌ ðÑnÂa±8¾]÷-3œ¹{ÃeÃ}ޤßgºêß5˜8«&­*‹šÂOTÉ2¢¶¦n‚«á¦ÎìCy]úØM<üw»o\ÿ¨nÔöøzü6‚Dù%\4¯4(8‡?Cø.ó!±S¤QÙB$ „ œÙ¤-­4ú3ôK[`³«©¬¡6ÐbÄmPãÔJåJ˜If»süu.OuÏæê¸‰Kæ8)g¢jÐêãÔ ­¯T2²þ&€Îâýé'´Ž!L"Û‰“…øŠôºt’÷ÓVùö(¸™|MÉ|íSô»ÖoP$CÔ=NÍ'x_oL÷ï¦ae‰ËêªÏk(jÖam^…ç”}H:l.j×êL:#4‘FPæÙ[Ñ€‹ “Þ •*•J''5 ¿¬È]ew¹šRÝ™T"L”¦gcHÖ`´ÀX%R3æ@b›Åðe8k­ü%²À8wTc&)bùvpô@ —úŠ8 ß)t,"•`Ö#Â%Ô"8>P|ŽìE7ùNpÄyùòYßÊÅ çÌ¢VÁÌ}Êc¦†þ@È»÷,Š?ÑÌšZ%hªÓl¥o6€ø M:•!D¢@‘šin§q&y±ë³¯Îد ˜Ö û½(Ý€óº,õÍyõY][][á2¸06¥ýIÐmx¹ÑHê¯a ó¾ìÎæ ËA“O½f &C·GŽø@>¥›šèà]` ÊþÛ£Ç+ýG_Þ:ôĶÃl÷ÿ&þ8&þK¼ ´4j·ÒÌWær`.¹^5u• %Ö|6PxMÎ*è!ëÄåÙ¢|±ˆ2o8)醗à±SÖwÉ ¬º£å ;VÖoº,NõƒÔßJ1KI˜eî¤oX½«®ÆS’_–_*½ø¤À*·Â"2W¢)Àû_"˜mÌôIË‹* +$HدÆÙ°ÊŠY>Û}øýÏÙи@*J‹Šh˜™‘—_¿#!:‘ f°¨ûÆöûQ˯Ül q#Ò¦R!bnÒ2Lmt_äÀLCȰ%œC±ì3¢¹_;k±v¢ÓôQ”ê·Æ°\èüü›“Îeë)F~›1ü«ïû%À&ÖX2»7”n…¤ŒX§^]°¾ìâ²Úåp \#Y¦ÿ^ðc ñsÌýSKÅU‘À€¾QêÏìÙèÜÂ.µ-ouh)ŠkƒÏVsÞCM÷ ƒ«øÌ}Ò—‡L$ùèûÌPô0º÷ÆÏh(úF‚)æ÷Œ­¿Ÿj'ß«ÄEâð?µŽ~†‚/ã4b„ŠT/ÀÍç•ïêÂv7ÌÚç >íãþx•_‹h`7ä u\K¥³ÚL…øx?m´Í­Ž~M¼º»¿ùÝ…MÃuïpz5Ü*ŽÙF¾ã£ækfF?>^IʉÍó{Ñ·‚Û‘7žú¡•áϦn›Ïè—(k±_šÅ['S,Ó‡À»åèÁï)s¨uƒs=©J‘¥P\žëÕ‘õ•¾Î8O½nYU´^¸¬4µ ®á€6_2²y/*ðŠ÷ò¾ü¤_!<œß߂ը‚o$ô¬®ÉtˆL±YkßàÈoT Þ†-Ûì‹H9,vR¼ïK Ž ì T”‹ŠCiPâ²)Û™nɀ䲧$£hˆƒð0Ùi·¢'Ű™œ½X²žz ÆŸÊ}S[jôæC’µ Uî*Ra,rPncYcyÙ€\pÌÿW@K%#ÿt.Ó‡ªá]F£ƒ7ù Ò˜‘ORbÀ{ï#¦Š€B£Ð-ª‰Ù›·’W+>9Cwb“–¤PJn)žµbUñù}ªAÞ¾óZ úUïŸmµb˜ ™2ïJÈ–Ë@-lÔYÒŒ8Âá<šÙ `ª!Õ%òoæk9‚±ÌÓFN5úœ‰Ãœâ\EnöÊŒUY+•yª\E^âqŸÅ}¦µiX0kuô°¿ê¯Uû׫d×s£ÐœX³¨ù™ÖqÍcÍŦ‚2v䩺ßt6{Wâ‡Õmu›ËqžY>¿eaõBg¢ûU/[³¹ &—¹´þƒ¦ëª_w_¸À.°@ù¬ˆ¨Óû Li8”ÂBU¡º0cnæÑ<­B«ÀñUO¤÷EÒ§ÌÕµ<¸0X…9é€eEΓÒÌžhé€6G–¥”ÄÆÄ)ÅÅbu6þ­Ú'«QÔdÍ8›}V‡§su-†JÊ ~ƒúÜò~Y¹5)ÍѨæh“º„m·©J&)J°áÕèµÓô¸ š¹ÅnÖú<®ÊJoyM¥ÇVè•ÈÜ’r‰[R"+—Â(+ ÙË·$`=̯Îj×g׋ëã÷ 4¹]oƒV›Õdnêì;ÞÙ{’æ3WHT:r i¿&>+†õ ‡Â¡,‰:"P8òݰ º½ö2C¿Z0ël¼¼ÊžYòz«‚³ø"78 Mù-/uŽo{¶k¼Ia“A9ÌÏËPå‹× g¿ ó`¾­ Ôcv»`5Y“çÎÎ(ÈoØ/ê¦.Áö·ëNûN ö A{g/T¹Ç×~ ’YYR×ÎŽ„6a@ 1)-z ŽßÐZïs¹öîÝup÷“ÙfcGªTfuxæçOÑ|•V­T«EBALtTìö­V­ MåuyeE{c»¶vï0kñƒ]‰–säW*¢Î”ö”6YmÖYp® ­UU%Ž†æº–Ú6‹Í^b,Ák[Õý õÏ̱»«fçØ¸h%ÞÝÀ¼\‘/ËQØÓ×– ÌZ›Ú ÆHU©EEÛ¶mÙ¿^£V±¸É6i)á4ÖÊÝ'޼väì^³Ùf†V¼¼¶4¹*ǵäÀÊ£«ažBós¡ý=Í×èuìBÒ֨ʬrq¥¸Bâ’ ŒºÐi„F£ÑjÅ™‚taFrV’R^ ÅX¨¶h¬T©±¢Öéܵ§§£§ Ë—EÃÂt,ß“æÏ¬ÉòeûÔV¹»ÞÚÝfw8P,F?6£ê@¨7üIøp÷ŽŽROžÔ:H»Ñï÷” Š­10õ!ç·“bbܦݦÍÕåisõ$ÒƒÆr¶ã6˜x ^Ó5Œ/M6%Z:n7|Õ¢mKIIÞuÿqðp"Gbl¤Q0•^3í‚ìñž’}¼pâ­¹ÎÿÅ=ná‹ÂÛºT»ÿõ±»(tìÞÞß]OìL4w±í›† ³‡Bq¾¡n|ΑdJúUòýÝ0f–­kî㸨هàõ´¸±–€&g0 ™ÌftjBŠl$ #a}Ž/íji ì7ö`ûú…8 /*ª§;M;-;Cô%…Pª/€$ -mt°ùöî `ýy(_““­Ç²a> 2è  ÀX^é*qáÂ~R Š‚hYe,ÛM¡ç ¯î 5€åx¯r¨Ô+õª[míרí7mí%ªÕÖößQ[Ûø/ÚÚÛ­K$ô© Œ ®ùlñ¼ïƒõñmf»Ánô•NÖ</’è^†zíIj%\/ݲS§Óê´z†Š`âQ)$åz…’f6…Q太 ¶Ñ\îùá‹}ŸAòËK±+,Þ¶`N®X-ÖgCr !/ÖËi0(ì:;;!k0Ar?Qݰ\Oò¾ü@yñ8…=uÞXj"|²EüƒÆkñcã•«5rZ àºÚu;îx«è Višp=BÛúk&òÍ—íäoš§Õ ´˜ßÿ€×|ÇÔ”Pµ¹¿ƒšJa’ISKšt–¹lŽKˆ¼‚Èˈ<þ±€ …6—á¦VŸ¢N 7øn'pM>^{¶ÍkÎ 5 ˆlÖš3H-€E…ÊâWòe†œÅ«& …ÅEÊ}P+ho´°ÊBì[nÛýžô«íºC°á†ø?ô/€ÛÜQ—€ÿëÍüø"8ü3¾¤Ê„š˜…æÔRÍë„õЗSn$“ò22g}“¿ïä5çkskétm^6ÌÂ¥˜¸VCþ/o¹³›“ø2Ñ+ÌÓþ¾ˆÀHÿ÷è/2_çBóÌ"¹Zê:@f˜’!a†¾ dž™ wBIÔÓ1¶ˆ xªhÞ¶úìêÔ´lIÒ’ÎUo²ã˜×*O¶¡¡f4¢ '½v˜wÁN²ÊäÄÈ8ƒ¨Ò¹t0…¼¹ ÛEôNm4%ÆB#îÜBÀÿÆ6~ØäØq˜ö0V]¿Îë¾cÓ‡L¯{@ŽE·Å\g‡b’~ŠùÍ…w€I­!Héμ5ƒ?mnPDzC1×û‡bv Å€ðPÌÜxÀ_95+Üž;ÆÁœÌzúe–BĤ›vÑÁZ-l5I6”›;(¤!<:—¦‘7wƒ~»&nÿÝ÷âÃÐc¸ƒÿدüY¯ƒßNÔÔé’é9€›>«ÞÒ§üoùˈ¸83Ö¨”cÇ›jŒ-ÿ´Ÿ_—Ž–¥X;#¿Ç`Íúh¨†5zW±[fÏ/‘~ÆŒúœyúæi«ÌeÚÜtažT(Ú!Ž‚Q0±:»ƒÅOŒ õÕŒ "¿¸6M”‘2ó̪ËâÁãˆìA#v!?w#Â{¼ªí‹ë„ ¡SšHk€NªÈWì`@4CF1$NÀòZ³š$Í«¾^ùõʯTÛB4cu'¬aI‚ì[¾´ƒcö‹ÐCÌPqð, Œ<úÊyå|Á3#kc½ µYGç‚tm†!]»J¹2KÒšØôùp\T³èpôÁسù§•5:¼_v$j©uojèF3{£Êdÿ"!ÑÜMw#¾Ìˆ†¹àD/Ãséç×tni^Y¾Ê–nÊЧ›ÈJÐÑfn¢z̃Dš6rÁ[¼ÙÁÎàû¹=‹ëb,àV¸Q±bgÜÖ³óáâ$8—s.`Hfpz‰†¯ÙOîÛÛÝ}¹ôè­òõÿïÞ¨ÇÞØÒ[‡®úÿ:®4€®z]Í<Æ!îškÔø¶ém?É8@Ì_°`'(T8Xh@#P¾JÅ; ;[‹º4š¡‹DSôY+&ÑËž}ÞFoýj™¡¹‰Ø'ïÚmQ1Šnºÿp'ýâi·ê„ʺ0×nÐÑhm Ãð„–¼ÖÏu#ÑU§¦oÖ¨Qå«)&‰È3æ±Aw]­¦]”—øoøVÑk¿omÔ4 m|Šó±ëp£ðÎ7ä;ÀDØL^$‚oê=Ñ8ôoœh|Ô³Óš-/ W9ˆKQ±¼õóÀ¿›üÄ›º¶ pƒgpÌ9ƒþÈ/Ô* µµX+i0Ý’Qº½*ʽ’±3 …˜%#{߃‘¨„ž²*ø<¹êxsïñɯعrûÜÙ¦¨I9ñ8ýz.DÚC_ZT¬“«(5(aD¼h®#W¡çд ­bF£9ÌFz!|%cëzq­ðpÛ4QëûïšJÅPQN•CØl*«ýø½«?Ãëðê–}ów-sÏ‚³R\ì¬ ÿÝóúøjú}Ìß2Ý‚ â6&lžÏŠH)Ì€[ZUúÝžžÓÝg÷Ÿ²–Z8âÉFô{$ŽðDÍísÏÿLžGÀ³pŒtöü¬Œ\!NÝŸBw-ÿBJ¢Ô*þÓÄXæQ'zŒ†Çëö÷í®èa£æUÂïT¤Ñÿ›u 1ë >[Œ’‘ºôwQÓUÞÇо ÀËÕ×N|mÿ{Æ •]ö]ΤØ4&•Å…yêTEª\¨\^°@º-jÁÒ&N!³€>J`nöG߆ªIœ×Üõí·è^4d""˜ßÑ³à„ sÉ^FÀç}óï´/C7¢yQ«gäçÐÚËk®ð~lÎáKªA}£ñA­^K‰‘\D„‘´âôäæÍ’ÜãºR OÁ}ý;Ý)¥É†dHNbvðÿHð~<³7jÙÒå1«éùD¦Iã„-Œî°ÂT^m"O¼à¡ãY+g.Ž¡šÞàîŸÎEÔÿÝÕ•Þ4•nÝM£ã ÊRYK!Þ„½j+ó N…dhRä@/ö1š¢„6× ‰ç ÉhK±46hch`ùL,3•Êgã4ÍÔc:Ôù:L-X¹"¢ÕyçØRMBc*¦œGf)©8{@À®jËʘ'oŽägæió(f¡2¨LÐ.»óÀE×áUlî¬=Õ[|Ô§DC–E3g1T²·¡þ℆BâÞs6¢ƒ•8 __s0º¼¨9 ¤„:[êØ ‚˜ ±Ë·o‹s”BHŠÑZ/ÈÍ·•Ó°¬Äm+ñ·Õ·Ö·9Ë]nGEy‘»°¼È¡,SÂ"ò1¤.˜‹$ô怔tS7ý€ÕûüµGžKê̯O¨ßéO°ÉK¤°”*ÄTˆô˜H֖ؓ֞Ö{H ±(lýmksM¹óà®×ž„¤,ÕF>™G85V5,†…2©R¡PvÄmܹ-^&—É‹$ÎòB·“ØÉÝ Æý”‡J¼ Á¯‰eC€ïyÄ6Æ4Æ6æ¹rÊòÝ »@i—±M4‡Õâ4ã5ÂÃah§Í÷ŽD—ÞYø.ï{TŽäüžÊOKá[äÌëV*&j„R•V¥R²'ŒÅ0§žB[¬¢C÷+kÉ[—è1Þ8¡¡Ôäðž9á} ’‡ßÉ›·|qÊ:z¡Tj´AaÓÍïË“ðü’—H9˜2+kµÎqç¿¡)µÖä²ÃÃJ S*’ªÅmÉ”ûà5ˆF¸J¾¹¾iME‘¹Ð\hOÿ 8;Oñ÷ýGäÍ¢Cm(±Û­¶Îƒ‚Æ®ÆÎÆ.Om•ßë#™J“¡Ýº0¤¥›±£°wF$ñ°"§õr¹B­ŒÝ(ذxÓÂuKHT ZÊ')ø ])èÑ‘!^xßü¿Â ò1_ÒŠR´BöÀÍ”êôڪʠŸä]ƒ¾œšt™(ÍȘý‡ÜžמóåùvÒ麼,öÌÍ%®ÓÜ.Ó³ÿ@ ÿ!ö> ùŸœewd?êñzÐ],ÓU ©ç€pžzŽl®|]Þ„•lGÚ"+©2byÔ5ù¢Œâ̼míÂnê4¬=ç> stream xÚÕXyXSgÖ¿×À½¯Z±ã`mïµÚÎhÝE»Øv\QQ«Ð²hÕÊ.öHIN’@Ø!@€°XDÜк´ë´Ãhujë8ãØ:ã|SµèçÚ§ß5¶Î÷=ÏØ™ùãû¸pŸó$÷žsÞßù šòò¢hš~?jÃhfôo;?Æâ4vòØ¡Ç×>~e\Ƹ«¾QbñWãm’%ø ×–âçïƒW^¢«p£Ä¸Äú|?âÙ µº~×lçbZô×eÉv•¨AwÚ…§v¸Æõ “\Ÿ±P®3ƒ U—Vp9‘Uš¶^µÐ}ØÛýôq<‡`f]G$ŽÝƒöƒ€.þå^ƪf½òRðš¯m [¯PhJA޲\sYŽñŽfToé^‚tu:¤^dŽ8zðøÀÇÇ/Ÿ€a„ý„ñïN#°¡“·w¦w÷µtv÷I[b¸{–åo»–áÈøßØï<ÏÂ>Ïà‰â=øi×9IGÇê}€Ž½¸žW°œñâ²Âô²p ¤!«—W‚…\º @Ìnè-nÞ‰Ä7'ê·B Z§˜ó,÷DUE8Ží)oiƒèÊêŒ5"óVjrŒà…''}Ž)<áü×üOα"ñG§:¾€¿¢o…ѽ žDQ3âÚ’wíjuôö¤·%pÈñÈ~×[Ù¾ø$öž2,¾æÄó%Ø)Œœ¼ŸêŸG^íŸáZÏØÊLœ’IEVQþ/„ÉÂaâυɥʲ2(A{+$â+¸ Ÿñΰ0ð­®›·œÙ¾Çñè =8ûŠoaê†Dü÷ž®ú=Ýémq )YÛ§ÿeÙ<OzÏÇÞ/üE˜Ä‹om†ÈÂØ$„ýÙ¶ÒÖ²6@fæ¼îLß‘¦ cXYmVrPƒFžó†<b ÆgM²ø© äÒ!5£µZ«BÂ'l±QQÉ5BU[ÍÑÔSÑ£G̨Õ| Û4[Sc3’ce±°";‰Æô~J@9æÄŽ~_<•8÷7KÄÃ}·—Jv ß¹1e‡k{0e=öuu«ÙíèÖ3§¦qb×…¦KoÃß`hËÑõŽ0{„êðÝ| ³­Ð¢µËxøhjÓðÜð-)ñÙ1ÚhB´ùø¢;ðóä©6m yʵ7³16CxÖ–m©q™oÁ7ÁE›=&ï‹Æ!ª~×~ßNì‡Å»Sú°×âMnñV\S5SЧªV+Wå¬-ˆH[»2!ÇœWƒZ»zyñ–]ɱQRéö•CÏq€ÞO†OU|bú‰_°\×_‡ë[ÜGÅ—ú§¸n ÷3>ß{‰Gtn³4~vÀu3¢þ{ˆ\`swhâ¹ÄØØÍ$Äëëyë³òœª,KÎÄ/…Uç„ Ï…ÕæC¶š ¼Ñ\{ƒÏãuõÖzc½îÎ ?bêì=SBS*¥ªPžî·J˜»B˜³R˜£ÌWä«ò†Q5×+êƒðìx&¹Ë[üTÕ*sÁ]t¥Ë{oKzè°Ÿk5~Bäšt{½ä¥’à‚õÛæ®Š¼@³Úg­ZyUúg¸·výæÂ‘[.„Ã_¼H(â„Ø;c$Z3Tëk ¦?ûm_Ï`Ý!xÞËèßö«Õ3ày˜"xNÊ/‰‡µ°®+úJ(:ª8¢i»ºù~°îã5™T£ xœ¨÷…îáŠ/üc’:¢'^m•í¹=ªŸa¢èöøÛ^’ˆÁeŽ• ˆ@@;—nX#õ‡°Ð1ïÄêÏžÇ(î ü$žq?ÇYE¡S*cJ”Ú"RgŠCŠbãb·m]—¾ÁÜΰOÞüué—ð) ™?{ûýCç¾êùà‘ðûÙ¥/Ò4²06ƒ©’ÇŬEm*æ !'¥°PN~Še÷+l©GµìÃ3¾½7W`/¼`øÝ>ñy<Ó5[Òav˜:H™;š:…g…ÑÂÆTaüLg~ćOõ óÆž„ÁGœG¸“ÑÙŒ—Þ\ˆGˆ‡»\¯I¤¬ªt•¤ú׫óxᛟ«Îád Ó•JÄûØßâ1Õ˜%-ìÛl&åawÝi|ˆ®ãl˹…B¼ä:#>éÜÂÃNyjVVZV¢6 Ð&¦X5<ŽóÂ[[Q^Å}Ȉ]ƒ{3Cƒ‚ò7ñ>®d]§ëgú›aQç?w£ÆÉfC9(*eär}5Ozq9þš­«ÒY¹L'tjiå¡ú­¨‘ã¼É¹ßÂÙÂBšètMpøâ¸]xÞ°x?žr× •´jªSgó0K%Œ_˜–’¶P6“/„z÷1†ýÆ]$Îioí3î"ÑIdÞƒÓš¦¥H¼ß"5$꓉¥|š y«›XÊî»VŽð9 Z#‘ê M\%TjImgיּ3K¢glµ­U‡.TâðªbÍÆÓLu…&Ÿn°%šBNx•)¹VEy9‰$=µ’Ý ¬0„n3,˸xˆÕ$)5ªR¥–t“|ȱç*)+QðPª+ƒ2ô +Ó+ÉÌ m³V·í=j%“ãÑOd+—¾( 嘕ºDfTWñÝŒøÊñß«fð*Vñº‚°^2E6¥¡˜S12µªd:eŸáÿXdî¾h¬4Téªàä¶î°ú"c¡±H‡î¥†'qäÍGIBSÊfgë*x°:÷ÔÚ{Þé>ÒýNU}U]e½±Âd.·è„C~ÿø [ E÷CYûORCÐHl4h ¤aA¡T•©Büƒ…Îw3«¬D‹ûÕÿ8DìŽñö`$~Õ÷›áå˜ÌN7ÅùyL_–¤”z/e6”{‹Ï4Ûl Ð ]ñ´=%9&‹2>àOÃ×m¦3ÈÄö'·ÅEeÄ'rY•a/þ!¨Úéo®=JDÿodÚý0*ð$Á×í¼/Ží!­jîîªÀM_ÔX§Îå#YX “þrÉNR¶TJP€R_c±ÔA=êHo–&gfî H:ÌáÑP§¿Õï×€ýPNŽeBµÆZn˜©­ÒäòÂuVœS˜}·îÈïÕŸ\·Ó_N»©swúæ€küŸE»´•Ê»ÞæðÂ%6%^“Ê'âÕÎFš ïäuø¢5¡!¡:aâea›5Úi͘h”eÕZ¤gZ¡öƒš®Îßvžrÿù™ª+ªË«uÂw~WÈŸDÃ9¬´Ê‚­sbžÛ:[­(S¨KHR[ÊÈ•~Ì/áìγqŸ)k´5Rx@¢{»8l~´â@\’= ^‹7 kÙ`’=K«»þ6×»±|JØŒŸbþ‘9žŒv’nh%㶸"$ÂcES‚@˜«ZWß~ îDáû¤Á>CxÇóÞˆxï•Æ¥d+ÔÿëƒÕ ÷€’ Šeåê€p‰›±¼Rp Si¹GГžîá'´Osº&õøvá¥S†q9fÝcßzÉŽVVü×f»&¿SO>Z¾kú—ãp¦7¹?ûœÏ[üºcí0FØ{9f„™Ü&ˆÈÙŽ Þ¬ËKÐITKÓ¦L…­°­5mwI/’`XÁ»N÷t«Q¿Š(É6ìé‘ÄzfEXpÍ•äËŠ ! I“»9Ó[ßáø“0^Ãk˜×`Cá–˜7¶¥¬„•Hà®ÏÅOr§áÓNçÁl²B²(ôJNÉ䀾@)ËŒ|3=д-_`ïóV²5ã[¡µÌ^æÚxY×…Kñ²2tuã)Ãâs}$Dra ïÄûO˜>ÿ×ÊXõ¥%n¼óei ©Íp#~ÌÉYGdÒUeúZ_ö€m)7Z¸2uö*R‘ø\£TÒ»ƒç÷à¹,á+!Òéú²nº!jv³ÂÎVƒM[¡ª–×Fؤ§>»ª¾LO?ÈòSù™áIÖ–’ JŹ¡ÖVkrf6År‰ªÂ,HEß•äþû¾tž:‰'ÀO’»¹ÆÔh³ÖÚìºFwÎ,”²uÐQfÈs7œ‚̸âŒä éªkN'}šp:ý?M¹;T¨Ê®kàlíd·½ñ€%XíK„çâ—~ gb$þŸpoŽvV,´6«“x!’µKmQ$o¦Í›*ŒžÁl –ð}ÐQÝiGB0+þŽIEÈÌtftö‘´‹ÇœÃÏáqþß ÏñQ -ŠÍ@¸›ðHH¸#“T±0d;wrwCe³¹XèC©ÆD$Ô²Û^—ÆqKàÍÓòSjØ46ä:¤•¨^Œ›>PLXçײ=ƒö@7;ŸWÝŒSÝeÜ]öO΋îèGÎÎ?“(Õêjàœ,nXý¯ùîÚõ™ë,ÈÔj™ /02É^ü_ÿ³’Ý«» 8òa‡˜Bsø,d@–-§cëPñ ñò í`3Vþ‡ mSi±ÂÏØ¤éyá[‡{¸«l­ûQë^Š”Ý=„kˆû÷ ½=“í…·¡+÷ÔTþÕÿõ§¿qÿ!?n¡˜9ûHÔ©eÂQý`[_“£ö¢aÁ§i>7?Å> stream xÚÝztgÖ¶„ñÌPBÀ‘‰’…ÐBKB¨&”PMu°1.¸ã*¹K–¬zÕ«»åÞå†0˜ž@H²!!$Þv I¾òŠrö{GF,Iv7»ûçüßÿë̽sß{ïûÜ{Ÿ{Ç\ÎС.—;zǺ=7/Ÿ±-xÅ®¹s?ÉÞ›ï æx× ñ>à}`(#f.Ž'ŽþeAà#NÀž1ø{Hëýì·x4þæLÇ_‹ â<>„ÃåŒàŒç<ÎYÈYÆYËÙÊ åDq’8"Ž„£æ˜9¥œZN§—sœsŽs‘s•ó)ç+ΜŸ¹÷~.Ÿ;‘;;û4w5w#w'w7Ž›ÆÍåqõ\·„ÛÇ}1:)*"=öñÈì´™q‰‰ÑI3£c2~q#-î@¬ïNDL\ÜÜ9sæ.¾sñÄ\ÿÅÿ…ÿ§ysüOø/æù/žô_ø/ðßYà—³`¡ÿb‘ÿ¿x¡_òB¿ä…~É çû/üú.ô \è¸Ð/p‘_à"¿9‹ü’ù%/òK^ä—¼È/y‘_ò"¿äE~É‹ý’û%/ö \ì¸Ø/p±_àâ…sŸ·ò`RJfFtÚ„çFE§%OXq01jÂꬌèä¨è¨_ýÈápÇåÌâζœ³š³³‘³™³»‹Ή–84Èáçžæœåœç¼Âý#÷ ÎeÎÇã Sgç~ÎN‡æ<ÀáqÆräð9ã8q&q¦pfqfsæræsžä,ÆÀ[ÁYÉY…¥sÖpžÃ0\ÇYÏyï´ ïµ…³ÂÙÎÙÁÙÉÙÅÙÍ åª¹®– \šk䚸f®…kåÚ¸v <'·ƒ¯”[Æ-çVp+¹U\·š[íåÖqë¹ ÜFn·™ÛÂmå¶qÛ¹nn·“ÛÅÙÅF¬æd×1ªû†¤y/ uè¶¡ï–k‰ ä"2›zR Ö:CÁ4xRÇŒxmùáÐ×į…âÐ&4Qˆ–¢g˜åÝíÉ2dÄ@ÑW Ð*zìöTžÖV°Á¸`¼`|¥ôóëÐÍÕé]Š•úíº$]"$Q›If„œ¹Ÿ"`†€ñ')E ª¥óx½b.’ *àïŸxaä18«ï« nW2ÂÐÒmD;{™ Þ× 0éL`¦Jv‘ är™|ýþ•òà—„îóx¸g‘m@ãÐxïk¼ÆÆžÒ >8µv‰PJJ>óà¬y3D™™"QfN_&Ó¨ €Êð>K6¡äÀ0B±vEAº:Òbæ'º>ÑýÖ™o^‚Ÿ(4‰›¸€ ÚÇ M¬Ü?ÐÝÒtH=)Õñ–;*Hy?é :Šc†¡‡ÑŸ!Ñúšã½Âk®ï+îêŒûà*!l<øÌsR*…ÈH׈…JR/qbR]ýùËr˜ñ›åO<&Œƒ–Äb©Qf‘š(Ùa®i‡vêpLCÔþÄ„}QPÄ Á€8 =ß[*UP—÷œYÞ”cÎ2géœæ£ÓŒꥆSð…8LPëÜ% =)²å`gOCk‡Ü©õ ¦;ª{ÓEhŽÇ»W„.¡û˜@{ZÑ\êa˜‚Î C’´§ŸÇ¼Þi(àkÏ4ïj¢TeËH 1ˆ%92LeÆNaxyb¾²H©5`åч ×™×I¿“Ð7îhX ‹Æ³hìÓ(=DFÝàu66vºÓ›÷G§¤†Oº¹áºð |\=p¡¹£¤ŽÀù´ó¡ÝûÚCŠw`~µöJ£R𩕪JM¥–*'>†O;N\´ØÌVpP&RcQ ™B® ÍÛ+Û ‘eŠv$Ùøô ½ÿHiˆ"P*µEÖ¯À$+T½ºÄÑRßcï†z¨-ªJkŽQ=¡©ŽÅg&DæEÃ.©I9ì?ôô—ö´1š=ùÑv4êèAú}ôú‚§%àmøôȹ¦Î~W?Ô‚[Y‘IÅ‹ãS„ô„ÚäÎö†ºCŸ<Ó,X ãCÖmß9–À4C\]Ñ}&÷ 6ôK4 {MA#Ÿú’™ …q¥cæòÚÈ7j¿ûâSëÜ¥‚$}¨crR³Sò *²3[ô=ªŽ;zÚEÞV4’‰èz|Æ!h}å«[‹yñŒ!ÐC˜{t§z ÁÐ 8ò7Ì&ˆá2syž:Xu´³¶Ñ-è%ÁvÝp•ox½òjÏ™ŽãGŽômïáÛ63T€Eks(ìÑîÁz{VÁjý*“âASÿËùpç[¨òòŽéÏÑôOK§>¿ Q̯žGÐ4â'€O7^XÞNéIúÊ™²c¯À9 2#Úæ?Îû˜±ØxhõK™ýy(³–ç áÅÖþ£­F½Ñ`JG˜Á¬4©{Óù5µ5¢Ã¦Pjö¼ìµ‚U°ªIògªÚÄ£¯h €?Ô_YÝç/§/À¾ÔˆètµF¥VþÔú™'ù /T*ݵíjGŒï´E£ð?Hßð>„Îót)s‹˜'™i‚DȰ$”5Ú\UÐBµ¥5ÅD¤"?’aÞû‰¯«)q Þ¬;~üÍ7]ßÀ øXŠˆà×÷ÚZ¾{îGf83| 3M˜Gš˜aŸ.F<8 G[«(-z§H冤…Oµ*íìUa7 %ÚR(·¡³²±²¾­¤¨O+–<)Äe$lW°Îƒfz¼abnÏ^RyȤ­P"“µÂd/nwuXÝ2Uš ÌôÀYaè1‚ ð9½3]iWÙÓÏò—¡5ëѦEhUQ¹Ò–Ž-PË3¶®dÖ.e‚W0ëdéÚìª ud`àä Ý< ×.D1]Ø]_ù+ÐíAÅ.Fðx´ÄÐ}k)/ì§ÛŸM»5Š<ŒêpÚ•<_´&ô…н«UëqÚˆºO犘!Bj # Ò%)âê BP1G\„ geuŒ)ÜAyˆdTÄîæ†Ëɵ^Æ7ÞŒ¾Ø}k/â§Û×&„yÿˆ3<»•tR,3Š™Ô$ï5,ˆîô0ËHúb† È{WÃæÁ[¼A^õ]Þ}k%nÃ_&s¢4±‚x‚N C\’n«Á®â÷¯Í*.Áàz[É#»úvÞª˜7ù­QíÑ-Ñh“TÅ@™‰R‹¥Lè½FVuëÛí]îaXIx{†AC©®¨öµXx{y{¢71¯8.O׳Ú|úi_–>ÓƒŽ{X DGpy9Æ*ÆZIÒyah*IkÄŠ­ì€8’Ñ4æut?[Æ™±ç™ûŒ³™ùЇޣ1äi¸¤nÜæLÓ„*ƒ„}ªÈˆä˜Œ0í>_QÍiSH=i¢[O ºp ½}ö Iý¼ÓûÞÉ{¾†ÍhŒ¡\_åðÉŽwžqÇ–Fš¢­Ï—Ì3e}¤5kqRï¿Ùt^€†ÀÛk+޾@+qe$v}¹í%j[¾ D!Ùl–é …æ°º½Ž˜X0÷ïffaÑ™µo% Î hI‹“R…äêÐg³Ó’…(­MkÕÚ(3é,2 dDžªH*d"H:Kf’ÙÅà(µXm6>þ³ZìØ¤€‡?bˆ|ˆÑøð2Î"¦ç?ÃQÓ¹†.wÿ9ý) ^ºý!3# m$º°ã{™Þ_Â{WU=ËšhŒÓ'`ȉ|c#Ìx(ãbh×Qp“.¨Ù[‘ÞÒÒÒµ“oRXåP{¶§'ìß±=j{NÚU,ä@Ž.Çû¾°ïIÚU‡7›ÑKl1Æ[ÐjLˆ‚màÿˆfà_Ãr!Õ3Vô]EEYmIÕ¸®î®ã®F·É¡çŠ6y&ãå, fFupÌJCBQfš4?-!->=Aš—Ÿ'ËeCáü¼ž™‰Hó@VžyíE6EІ36^žº¨¤<[A•àETVYª…ô²Ê\G¦€–ÊA®-êö·„ Ô Ö²™š¤t£:43ÖÔ†ÍÒô¬w¯ÖÜ «êøKâÉÂ’ÆìOgøK¯ÇþIx N”·6YÌV½Õ¯Î·ä—ÇŸUb®TO¸Ê .§Æ!b}¨ª)”HBµÖUäJ½<§y%PéDð$å!}%Á•ÔÓÞPß.€Jyež“BÏ3Á¼ÇÉçv„¯{¡ù˜Þÿªù‡SW Nýp+ÝÞ±n¤s¼‰JÐè€6HLgu˜ŒÕT)“„· 뎟u‡½’uÆ¡‘hôe4ÑO|ËÌî„]Ùû(ÔÏP¤wäm O®Š9Ÿž“óTØÒöB”CšÛßî8Ž3c c a* 2ì49ÞŸËœU*»½cº¹]xgô³÷q^AAQdA‚+½SIu4Öv~Ä ³„ s‰m°M²7~SDÒJX ;Ë6wD „\ÊÀÞ®o{ÍhµböH9¥z¹» 49Šñ¾2Bq*-FC?ú°ì;tŸÐ.M•úŽåŠŽ|‘w1k{Þ•ܤ¡Ÿ|Ö[­¯®V&³‘Ù¶»dÄ š™ÁŒúdš&< ý•ž6ŠÎÛ…ž;N²É€Ê›Z„Þ¿`g0ÆÛ6Þ1òjéM4RнY ñF•Q©SPL.¢V¡RPô±ƒûwÜyJlIfcJ«¶GÕÍê6|Å e7ÚØ‚žvs[±fòëhJá¡ D¹ÙZŠˆÍ7˜9­°9?ìÀö})ÏÁs˜¦£W"Zð\­ë¼`¶Yñ cÒ uJ …Ø:i^Zò¾=¢˜Â…V¦öftjŽ@/Õ2ûëÚ«›Ýeð%”Ï0­deï¤kl’õNö !h F1"¿zóOh$݃HïÞò°ËÌOÁö-I÷°@Ðû$ú Qæ¾~‚nÇÕ¸J©Ûû׸[Ñš  ·P"Šî‰iLos×6µžÝÒ¸K°æfÄ-+Lƒ4œz‰óB;š}ý­v$n·ˆƒZ?_‡¸súQ â?¢oœDüˆ¢ð8£˜¡h]þÛFOT²:2³­¸­ÚOHA¢•SÓ'§ÉartewË{1@íˆBG®;­®Úî²ÖTE½TFevMMUEmkBC‚ ¢òD¹* wȬrE2¡4Ê Ô†L`† á@IRmªAmU‚’Ò’Z…B©VRôw'óEE©Ø”˜ÒئtJ3›g!¡±ª¾ÑìÔãÓÀðB ÀÇë6ªˆ\Î É ¬‡i%ÒKìÇÐ-^+Ùgxõ£ õ±‹·åo_.Ø ©nå‰;XõÇ<V£•o¢8§ôfÑZGÒ}5.u²ðöy’îǧ’ö¾`Oeto0ZB@±¶Š©÷Oô…§4òyã &µHG€[ӑݒܿպ ÖÃÒ¨ŒZtƒÏPÄ`ŸíÛ߃¦  g™ h*x“îðnâ…¹HºoŸ$d.a±),":]X,Õû¼wÁ<¤|xtS¤*=â©ÑžÃÍ»ÂjÌ.})“EêŽE3¼×ñ&˜—CS'Þ¤½ÏnQG6Ö¨„·'“{e‹× ò!ßP ÇÝ`¹ÍZ UÕ“\›š»ê£¬ÓŸ\;õ­À[ÄL&Ï!5ïŸïzǰ[ëÄAGX¯ÒGîx´é®G;±G­ªÆVê ¾õˆÏ+‡ÿkÛSÁG²tÊMAhÿàÝs˜Õ»Š¤[ëk|®Áaâ‹ìôÆß9ߢžkÑߎo‹ïøžÊÜLi‰œW—®ƒ`x&"c á3Ä/Ðô ½én¿Î-wuîÆ:§±;5üŽ:¾EÝþEzVάæäþÍ–]xÿåaëþ¶?re®9¾ÔæD÷ JïÞž¢ð¢ˆÔuûãžgakå¶žý».g½Á¦÷Šã§»z+Nã*þ’è\dß®“ÏV¬ÂÙø~¦‚÷" ýº3nwmÛÑnpKëÒÚct[à*Ž„põ΃qÉѸY‚¨²ŒæôVèQuÝ )f+Ë#7»½AÝAè9¶ÙGV4†îï`ýP£ª®šEõïEÕV¢íà¡Ü>5å$Pó&š‡F-ü™"Ü!yá¨ã¾zÈO¹*ùÑ){ëÓºU8b>ˆrISëåÎc@ݬfF®;GR°x¼tã#·Ðœt;Ðâ_͸I7uÜ9˜º»Ó„ŠeAiñ'ßGˆÏmèQD $E˜RQtSlsFskC}ÛÉm/6Ö=ùkµˆä3\%&9ÜÓÍâÊÿH ¦9]‘ô"}…âcxZ¾8f³½ø90£©õÁ’½‚-°½6õmÌÝ«Ä@yjYMB¡Nf×`*[ ­e8Í›&MKV‡Ê ÔÇ7ÚGïm8¶²|K 3T‡×óWM]‚£p*˱CŸ«ÊÆ<ÈD”,Ná·¤Mm“hOäfI¡òìy±Qd±S¶"\-‹X*Î=¶Ù‰ÙÂw¬m}†#ˆ%éw?`* HÒ'W¤6î?SÐÔ+z¾B)¦†¥n¥ 0á̧öK7îÜ%è z¶_è÷0SÑ6ò.)z’‹C#À5dTª-"ŠQ‘ ùèš`úŠ[;1¯¶º§øhåñL"=ÃÐ$ôc&’Qò@œë«qa¶‘«â—Ϩ‰ˆ(Ý!㓳³xÞoÏ÷§ËEÞÇ<Ü:ïF^ÄIÒ&¾¨}%ÿ𬾞Yö,½¸šÀXa­ìûsï}_4œåÛë¶×Û§ÂÈRhÒèe”š…ªH­Š[‘°üÀ •L)SËjáŸô$c’#“£Ö/Ú°pÝ"e‘ óAªÀ¡p ¼h/î¹ÕÑÊpQbÒÞmjL%Ÿ"ZkÝõmüì⧯}n2›0ߦŠ%&©`Õ"ï1©P:ïTÿ‹‡O;K«kqÖµÉ0¿ÍQrnþ†­kw®•+ò€IO¨*ïõݯ„\Øf)2*0Ù°[ 6 ´ÌiIBO|÷ÎüÒüŠ…6Œ­p•Õ”Õ4{øöòŠj})e mr£L †Œ˜œœ¨ÈðØ}”ª"%arr«Ò¤:~4ôÄN‹Ì*Åý»Íj´ ¤¦$»VZžÖ‘Ñ—ØBÝ«µ÷a”ÁÛþ [ÂC$y™é¸s’Ù4VA%¸šÊJ.œ}íÄG­æR38Àé—®XzÙ"‹Ê\€“‹B%BAu†#¿5²-ª#¦$¯$»\J1Æf‹r3r3’Âø…9Ù™š<Œ.™UeTAMgyywÏaw_‡Éh1pÆUçG¸£z¢º‹lr–,“«dB5©Ï¯HwäÔ¨ÙגȶÂ3~*ÒyP¿Uù† Aè8ò¹æôz„öÜ&‘ì0çMÏàœe"Þóšo›'þê‡ Þk?áÔJ$âý–EÜ$˜÷n›½æ›ø™èËJx©'©×{ÍÔ‚¦¢Ñ‡c}†Ò}(”µ ÅÉfkfÍV®V¬Ì^“·9}Ã3 ÕIõ…Æ6›«ÜT_BK„@EìUd$Bµâtè;4ÊQ‚M¢h‘ù3ãçð9ÕŒ-Ã牕kª­T [:ô©â»–NðzÑ(ÚÓ;xþ›weùæ]žÁyW$¯/ê¼/›³m9Öœq¯0¾ÆLÆßå1e1å1˜”ZsÌÙÕP –JKù‡hí{h=þ¶UÚ«,˜²zt·¿œà:ᎫžºãªL" eEy…™üÕÌã«™ÙÁÌì¢À·‰¿b°nI=·8G°eS¼†#Þ Ø°Lµ2USò¦ïÙ:?zKV0¬†'›æ¿´þê"t_,h ™ïÚÐ\ÊD:f‰@Fd¾@S g(&p%Ë`iíöÓ[Î^‡+ð¾ýÚùó'O½ëº(þü¤k’!›o”%@9ˆb‹É!DÒ®vH霋Y›Ü¦0îtor­g_¯€œm)þ?›…ý?4Êò·H!æ¶û:‹Ñz)žÕc;ÒÖñÚÄ‘]³Ÿ2Ÿ¬…‹”SmÉ$Al^¼rRó°eÝä ¥Jí ÌD­Ccà"\¬8ѸÇuŽ}éòð”o˜Ù‚¥°.}Ëê-fýÞz°oiÛÑÎf4«5èGL0W!rAÿØ©EÜ=vwk;P® u¶Ž”™>m©8/W‘ T&‘ÍìÆÅÏtDw¶« 'á¦Ú}P(‹è‚CÚ–4œy»t[L{ñ^Ùh·òµ0.#ÛP6¨š‘B¯“`КðU9¦…8´V ÚÈÛÛnOãWU”9]Ç>°~iù‚2’`ò øKöj $ŠmšØ׉I_vN®(7+á@â„Qaü¬ôly"PÒX$v…™à‚³®ÚYR×X‹?Î’Òb[iu~—pkDùYj±@Š‘ Ljý–ô MZ‰BbWPâC‰ðÖÁF0A©Ýä´–ØK¥v[^i3¿-ª-ÊmP™qGLI2¡Pû#Yeü®UJ$B¶5«6ÊÃOèHìHèÈ­Ìue—c®Wf+q–:jËë*jË»[\€m$}qµ:pBaÕ:589çÇgKä›Ã7Fm £Ð<²²òoG‹Wã’s1'ÈQI„}\×YBf¹îXð‘uÇdæB3ØÀæÔ[u>éþÑ5ÚÕ‚žp¡/1Çð¡/ð‹ù_ŠMîåü~.Ëä°ª’þ'VÿòÙÝn¬ÿ¿i3~Û»‚@¯ÞäiÉTeŠ:ðÇj¢èVŽËQ^ TolC\TrBô¢oâÞ¼ ß´¯R²;¹5*"56N™ÅIµòßâã&ÝôûЈšN7ý`G$¸•UWQ:™[’_œW›Rs°6¥!‘oŒs©X+`?’tñX‡|[f-ó0zœã¼2§¢ÄRì(¶×UÔWÔU”:J‹Ëm5Åõ¦z6/ÓMƒn)f[Çüøœ‚ÂÍ›öo ÿMœ³qÞ”éDž܆eømÞm¸ÄFóp‰)Gúa4µº›º—„eÚ%¹+dùQÏÎ8ÅVs%”Rô M™ ñQÙÉIÏŸÌ8"xZœgJß4]†KÔ;d™Ùäü@”9µ8üÙï,.XP<ýoc‚ݲíeów xÇßè½£¬Ó—²Êq=dÞ#Sb5iY,Úì–i±ú&¡]¶'V$'kYÓܼ¦y-ß,±HÙq˜ÕavÚk5öš¯P¿´µ¢ÍÑ®c¾ãgçÜQ×G; Üä¿®'3›L¥¤0+þÙ¸e±Ë$)…)ù©­¹­ù­ o$¾‘ð†¼JîH…{p†²[ÐL*b'Ñ}¿7ëľ{œÈâ-—Å[0ÚÏ“ùb_*ôÅáoÿkÙÇÍæ‘¾ÁH$~áä™ýèA²¢ò7‹“Îÿ– ·/ˆg·Ýõ«ç÷Ó]ë*Ï «’ˆÌl}é=” ŠL¶Ñ³„ÓÂ>{í—n¾÷ÙØÿ;Çñÿ÷ÞNï{ÈØ–'B5hÅŽ w7š€½1¡›vº;¤+õ¯Y_½bqêœìËEa×ÉÙ3É•h$‘ ÚL|*ɱˆ&iw=öÔÌVö®ßU‰¾Lˆ®‘V½Å.0¯Áqµ™ïcà+îL^™=íq¸ßŽj ªÆÅ²“ÁÆ×‘ —Ú3Ï0Ôi†:ÉP&™5äêüqQnúŽ„ JEÈ P/Ó——Ú¡·-õñ1Y“BNÇ|G>ëùôE4æ¿ üʶ:]3›9žŠ'K IcÌöõ§J¹Z±˜YÁ—fH3 3ö}ýYäÇ£ÒŠLO¬º2 ÊÚ&ßmgåUßEИÿ;ýù¾w¥YFÇ¥èí{ßíÓÒÁ×ûÛÉÔªDg¼* ˜á -ó$3^ŠøBÑjhvÖº(f ‰ŸÇ +²ï\ŽKï¼ DkˆZQ³¤•ýO6D#Þ[˜Í~ƒ™%, âÕ‰’T1…Z1òÐÛžbiÜôé@íßÝÖ#D&ÒÜr¢Î!×ÌËü»}NÇs’Wë…†Z¡-ß•ÌêiPT:%ŘÈ}Û’bS!õ+É»Ôé¸Û;¢Ý7'»µ.UU6zŒYU -Ì—JÆ¥§f¤à¿T~bl,Î8“ow“i&܆™‹fË•OøƒÑl¼;¹\¬Óè5 Áü_£H×HØåÙn12CìáÈcûŽD üb„ÞïôÐíN{q‰µ¶¸YÇÖcf;>ÄZe¾PCjå…r…"l_&Í)Ø$4k  |Q]¸zs­¡øžðŸ B p»wo¸ñ»u Ö+ ;¡ZRÿ£®Ž~ŸÍÚ7ØÙÈè$âû\#A¢VK4³œ(° ô'²‚}ÔþëGï)d›ZQHóo Ù½=ÅÓäc§½'8'‹û«)fYpO¿ô?_©Æ‰Srwî—xº&ËþAÁ h‹u÷ø~Ïàýþïûÿú7¸}ŒÝóý;zþw/þûîþ?~ô®¥¿FšßÚoþkƒqúë„Ö¬£õëL»ÿ]´}È*òÍ?GÛ?°áâÑÁA*;{Â|«•ËÚ¾¾‚ÚôÔH¾ Ÿ™=¯:+,ÕPM½;÷èBó(z¸—ùÛo¨á‰„}®¯.ýBžžÅÔ‡›lCù]Çýñ÷C·w2±¼ˆS/¦<'„ yF^Njb¤&¨B®ÒÛ„­ÝkÞÿ¸mˆ÷{jü7 hLÀ÷Þ%<-‘Wr°çT‰Z.Î"%E¹ÀBT¾ÆVÜÐuÜ…ÙÇå“[f •¤Z^ÀzEA„CRÓn ’×Ë’…jÒ¤Ôª,¸‰7̺F¨Ml(t¨œtA§«½ö«÷‰cÒÃCÓCa„6Š(¥Ccaß{r©F*™5Ï$kßðVêëð¼W{ôBswé 8çEç"zCûƒ«Öâ ±SžœÎΉv6*{[|žlÊp³aòà •¥Å(•ð~Å~}óhþÊÏß‘—¯ÿ@¦Ҟ0Šî8¶çMñE ÐÄ-@LùŠ™)d¸À 1¨åZ –ƒø+ÿsVjX¤s£çëÑB7÷UlRØÍ”‹Ryñ£c&ðÓ’R%Ñ,(òÜ6³éÔfö…¢£®®¸¼¦±º¡¦±²†o²˜Ì6¶Ø-& þÁ¸ë_n—däLæiŤ%ˆJ¢ùõ¼5Ħå¦÷Ž—5 BøáÔÉeÂQR§w³ …ë‹ f‰ p<;r˜eäpÝÈß!X4\9!Ö±ý¯ü7þ’† endstream endobj 338 0 obj <> stream xÚ]P±jÄ0 Ýý¯”b'…ëb%GÀCÚÒøàVÇVRCcÇò÷M|á†èé=IO´álú½î0Á`‰8û%j„GëHQ‚±:UÎzRкUáCM´•·›”ÏuÛŠ‚½\eSœÁàp§È5 ”G-.Ý:'œ„íØg4­át­»ŒtK¿8¡KÀHUåqÅý&í ÎAiŒÊH8cð¦©:ó¯w(úAÿ¨Hxù¶1Ùk}ÎÜÝU»¿‡=½Ä¸íÍOÈŽöåÖáãOÁ‡]•ã؃m{ endstream endobj 340 0 obj <> stream xÚ¥yy|TU¶uåCõ¶‡ºEAú颙çyˆIÈT•y¨$UI%5»æ¹2WæTF!ÌcBDA@Eß§"Nh·Ý­­§âI¿~§’†î¶õ}ö÷þÈÍ/CÝ»öÞkí½ö¹lÖØ±,6›¹fóöí›7?³fÍŠ¹s¿Y˜Ž-?¶)Ç…¦±BÓÙ¡cBÏpBåß\9ö¯cc±Ø‡'‡¯+&…¯Óï#WÖÓäòä÷³&³ÙÜ “|èQ~ô”©Óž· ¥óXBFŽ aO²(!5!33!)9C”@~ È%«@,Ìæ ²sò…Éä+#;+G œ;gμÙsæ<“#ɦ DÑÓ§GÏ?ÿ…™ÑÏÍ™3?zqfrž01!+zMø6™ "òCFô¦ìDa²H=m¡@$ÊYðì³EEE³2ógg祾<}ft‘P$ˆÞ˜œŸœW˜œýZv–(zmBfrôhè³G¿Ådg戒ó¢×d'%çe‘'ÝË™Ì~ˆÍšÂzšµ`ìböRÖò1«YkYÙ[Ø Q,¶Ž­gØF6°Ml3Û¶²ml;ÛÁv²&±&²cÝÇbÈgŸ`=ŚΚÁz†5‹õ,kë·¬çY/°–°bX¯²–²^c-c-g­`­d­b­f­!w_ÇZÏÚÀÚÈÚÄÚÌÚÂÚÊÚÆÚÎÚÁÚÉÚÅš?†ÅfeU±sÙ#â<ɱqBãèqÍÜ'¸?ÜSE½Hí Ô·ãŸ/ŸðÀ„¾{«#鉖È)‘—&õÝ'™zⱘÇúøÙüo˜SÑ’Çç?þ]H9ô€<š`ᅫ¿É å"9æÎ>º?†yø üøìÁEâ_€«uïžómmÏ8ÔÉàé ‡Æ¢aÔ ×ëÕ’©`*nÔ3P f·÷6šP‹(0Qf£SÎWèµÉê´E»×SË_¡ç½ü²<¨u™/2p´±Ú޾vªº¨o?ô)°Á\LE†Îã­µè?è¯Ù쿎™ôáÁ œÐÕÐ%úÍçð7@v‰ wsâæâExÞ_&ñŒ:›Æ N°˜M–+¨…W½®/å\ƒw:ö9Ôv®ÃÕ”© íýçá*…—ãt™VnȇR(2*lfw—ÁCbpOK¡ûЖ&ÇlËÈq™3*ÜdJcŒÙ',UÐ å¦VïÞT[†)Ö¼!ÿ•줤-ËS7µ(yàmÜPn«¾ˆì¼ÀÍ«hŠj 3còãôÚй«lô_ œýÈAïC÷ ¶Ézƃc2°V[¬.*X’‰)È¥ä6µ“ïgÀ³·î#w¿5hö™}V_Û7Ñôž÷^o¬”[¾4 Wo›™øtâSÆ ñݤßåŸK<úPxòR<3Cá7yúzY`hn»÷üšþp™ƒ*C+h<9sþ à‰Ô3cn£ñ¢¹ˆÏ‡Ï ¦\ÿôQšúN~+Ô”Õ–ÖÈjÊÊj(¯¯` PbIunó”B P/¥Æ¯c`K˦àZÊ[@7ĶnjE2~qöæ=½ïòáB7Zé"eUãŒÚ°C¯^䄤¨•¶UY|ÐD½‘Øû !lÛ–/Ðö'´¾± NRJ$²u §n0óÝ`2Ù•o×éªÒ¯Jf P//Û¶—ðôR´”į,ç{¡Êé¨1™½‡í Ïxö€=`«3Ûí&»Å<ÓѨVê€G˜Ê€$ŠDÌŽçée„ÉJê‘Uòƒàh±x^¡<€®µ¡kvï%Ôq‰ÚÒÓ—$ˆ™Š<wbɬÌù=Žf¢$âãAü]y±æƒž·›ŽvŸ!‚9j_µ‘ªíùÓ(e:--|>9F°,yg¨e»Õ9k±§“ª³ b¹Ûhçû¹W¼ˆ½ïÛ¯MjB‚‹ª”¹‹ù*éTY«pž‰Çbn yÎ œe„u•F.5ìúãÍ|ÒZšƒf£³4fÇÌ‚TØÕ”mÖ·¥¹tïd£‰»yåê5dQ"If?ÒêåNÕhÒ¥2¨u²“©gÎ÷eàHJ•ÜVjúÊlEÎ"g¡c]=ïõªÌè…ýû>ù¨·»¬•hŒj½Á†xs#,H‘å6êÚ¡Ît½÷NwUAÔš]„`cœ)‰)ƒ|ÈÕRz—Á•à·‘.s,â §Ö¦–@¬žEv©I¹ìExRªçPh:j¡+È?z ¬Æ*­J¯ÐÆd wQ/áFºÎo'ùSÄ“*B "P‚ÄI’ó¦¼ýu€>=ÊAU¡ñ4ÇMÃÓ”ñ°¤ãºã<"‚šÚªì`Öø³®ÂÐ '§<'(Äåúº £¾Ä ¾Å-€dˆÛ-HÊ%ì4‚ÒËw‚Ùjw}oj€êç¦ã‰[ðÄ„9*)!ŸšW¨|DmÎfo·ÿ˜}Ǩp×ȨE«GÚthÉUN;^Lÿ#UkÁ[e¶Ø\mèá&ĪIlË9LÊxDNNÿ~EÿfLy:G’ž†“é¥%¸°Új,¾f4ÖÝè9píX Tw[Ök lÎÂcsv¦­Þ•ž TäƒjÑâ𳑴†Æ^² ¢ã·9¡Â¡9´Éj¶ƒr«MZÒæ/øËtÞ"Wr7\"Ñ5žBÑV¯£j¨ƒéÝ;f¦à©Ê;B6Û*š¾êiéÊY é ä*òÊ»ðý Å0óÆž¯5*2WJ·êåE ˆþG2gÉÅlo°ø÷¢é¼n¸·Ø¨¶ÏÓêj|BšÕ™q^^nÊì—Ê#oÈ…]°jÛ|Aê¼çVN“t¦BÂäô»©±¡CòTD·—¶@=P§!X/°$3… 0¤‹¼ÅÕ¤9û}×gü 肞lÊLhHùü>õÚ½Ëð=˜µ|ñ]yVýú´ôMK­ì_û=â¹Un×Z5|-èu}©(?“A°öùr2 :šOžk¥Ú}t³ÖT #•ª Æd( ÛHæ§à¬Z´v}6À>Öò6sÐËøeZWf4&TkÜ|,î:‹ÓÖÞ„¦¸Œc%©û"á¹è¹Iƒ¯0x*¬Ã[×ám˜U³é \…æ:4fð²Óf0SVƒ]‘ý2žú f]ZòCõñQZEh¥2Q2£É€¹òsKy=xãëOºÜ´e‡i‰g3‘¨¾gßüžƒ6Ÿ¤[òë³²òó³²êó[Zêë[øä¯xK-zå{6Zà 8})o_RZQ^vNMn;iÏ>«ÛE†´É”Éd,e`±`]Zš\N®§Ô6ÍóÁ{hŽý<¹V¥%i“9µm(ü ŸÚ  <.—‡Ú&³‰ÒcKí›jØgBqB«†vÓ6X‰U¹£Ôz½ÿá¿Öð´e #%w)=d[öJê'h˜öØœ6ð‚We“Û†#?¯ÌAJ®TÊPÚ4~u(€M¼ar)Uk5 Œ¹¡…¤ßç 7TBÅCK‰°–¡{èÄåI¥qz™Q ¦46­“ß´4·w¶EL±û Ú£4©‘9ßIøâµ{œþwуé…ʘ5}ËÚ¡qÕ´\³´´^o˜BžUíUA±Z(2šuVbœf§™ˆ2t¼ p Ù×ÐNhoèÚÙnvªÂÕ.EÅä­Õç¥-H‹˜¢”‘{;¡‘©#ž¿ÁP¯wèÉ.¡1¨ *|Ïp/Ʋ­ÛÈHÛê.9a1–µ¯±£µ-Ç],Ù)[¶æäî÷™/à»K ßz/¼ìŸÂÁzn“4¬–I›¯O Vö«ÊuW­¡Dn=˜À^ù>ÊàY=‰²êJÂl£V]"|6sñâ0·ÿU(Sß(¦!}èÚÝSüÀBÙ¼¦ê°9eÒú4¡€dAÆä'Óoô’¦7Hz>ÔÛêMv“•Ìbó¨“#"Aêt›°˜4EMg'FÃdòúöólx«t€˜ŒGIÿB÷1pYØ!õ‹ê¤Öçê ì©n¥9Ç%l“Ô~ðñWž‹Çcù®“€fÔÀßg±†'éË$‚‡‚ì·Þã M 3kUëO˜%¦ü³æâ!ž?ŒïùíÓ@-ÛÒw“8hóôý.Åû7›¤Fž Ìã)“vá :1Y¦¤ ¥päçKÿÌG÷ºkG<’ò j‡': B—è£7z-Ýf¯‰7åÔZUüÜ,}Nš0à-±œ81¦ÉP­€BJ Àˆ‡¥¼e¡Æq•u¾C~Ô¸Tf ?âõ{@b“$|5E´žÌ0)-yïÿ…g)²ê}PAìºÓG`4ŒÖô¼Í EҒ×IÇãûðÓø©Y§WÜ`jà˜uðmgBgÚ脺ºŠ¶Ê.ß¹pq• Ût¾´x¥dý rôd… ˜ž>O¯ÙíÚÛ…¢yŽf’Mëèê˜Ò}µ{i­ Òâ¸Í{J²ÚQzšPóXšTw(xö`wPoøçkÒù4F-Á¹x'JéeDò«¤Zô?o´J¡¶p>~Ÿ'Û¡+5óäšë„c“È"÷äç[/¿È…=Y™TÑË4YÜÌ.ÏÑ7–7ÕÕ”¹ŠõiøIrÚòØÔ$ „iM×RäêŠ É«d}ï¸Õ3rÀ•EZBtè>º„ôèÒÒ©¡˜,\ùUòê–¦úž£»»_Åà¨ð¡×Ü…ß¡'>úÞk×8ÂÞ`ШNÃlâ1©Õ9GØ_ó»ŽóÁþÓN“so™?‡<ªònÐáúøîD,…™Êb±F eX_´+Fëõ¿«_½ÙA4µÊÿo–(™$&'€^ °]E•í´•Ð-pÝ|¬öJ«í,ø©¾äý¯a~fŽ™zváï)!/)?jcÀk –Ÿ£ìzšùm¸2‡›²„OàßÂ&2TŠÕ·B9A4õÓªûäè­/8!NèIú&·Æ=âO‹™ÿíE\k­ÿm»7ÊU]Y^KŒy#TKât ¥¨JVÝØØ{(¶n_«%™Ó4…zE>¾Ÿz+¾ãŸ.q_f$3Šçlƒ(ñ^âªCW”Su¯87« ùõ¾üýüÓÐs¶joÛ…:4Ñù9Ÿ÷ã›Ð”ûÚUN(=4‘&ÎŽQ( G­K•t ‰Ú¸¤ZÑøÉiçÖ_eÎÂáÃnÉÈ+|N¶‡A¥pÚã †4S¶«Õåi„JªB^S.IÜÓ]ô5M†«7Ê)1ÚFkrEyâBI†$‹”Kz¢‡#-hBÓñ¦£zzºä_ %v†”KG ^»K.ts°ü"õüÏŠÒá©Ã×t#C=JT£u‘õµÂkóW¿Ë |6z"õ‹Gb[’1;­J¤%í—ÚÝ)8|»=åüA¯•J·¦¿º™¸ µ»ŽW½+Pqà ºFñVX*ýnõo>e0x`ƒº‡ÆÑ5¥¢œœÜ±¿¸¾®µ®•¿h8‚ö¶€ÙÝ䬱ù¡zä°`VòO n÷´Þ=,(TêªÜ×1U¯È-KƒBjw‡àA9Õõ(%«ÓÖn¿‹Òî¯;Gù,©µû“eUÙ(ë'ô8U]Z™/ÊeùKêšš›ø8ö//ÐâE»6n  W«ƒðºf¤ yY…©‰=GøWàË“ ß|Ã³Õ m¡ú:wLÝx»‹ NguùCçˆ}ôWééåºâÑn?óŽ–ôÀ›_þ”Ôå.»×æ:ˆÖØ:ôÿ·VF§WdÈ©õ=‰'ø­ÐTènèóœþç&R´D´=(q™§‹JkµÂZI$ç†7V·<ï VµµÕÕ9yèÀQ°i6z ÄjÌF0š Ô.½2 dT‰GÜDD¹¯UÔþ:?bU1/ “““¥¤öÇå!º—}èy~&01E{ù“Rìþa½^nPCIÔÆ>Áa~;4ÔTvUíõü´ñ‰× fB›Ÿ4>“ÍVMEþ8ft(M ëâÖYúÿyl­t¶˜¬åÁ“ŸÔAWJyêlUf6¦xE‹tEJ!h£F>{ƒ³Í†ÐßµÏâ;‰"ûŽH6&`nÑVe¾Nþ«ER}¢—ÐþQ‘¼ÛãR¶}úŽìú¼Út[Ì…«ŠEÿtú-([ÿ³§ßåwO¿ —FeÆF?þ/2°f'~°$^)2†‰ósá-KÛ´óŸÃ9Ù‹ÆpÞŒï‰áÿ ü™=ÁØð I‰°t=è~|§,íïàÅw_@u\ã„„¨‘þnés‰¿{OÁS¦½¹ôKb5A|ô×àr:>.xãΛ£cïõ—75кkIES’W 6lƆOùo ¢™£‡¦Ï_åÄ‘´JhPÆËȰP…צKs{GÛèºAfPép¸È(ëE/8|YÍ‚ãÄêRh2z =}{ã¥EÌØ•š–¤8_›òë^OŒŠý¢œv455W•w[•@õÔ Öß1-Â¥»ÒR€ZQö¡=lcÍ/Á¾ñïØÃVb{(†¶êíj¾‹³ N%U¤“94OÂÓðÔég×\cÀ¾ú®.¥ ?¢Wª²UºMFªŒì€FPøþy­"q–ì‰Óa¶›]fУô:Ý{•#ã‡]Ù¼~¢wØ-,P·°gëuÒìM«6…“ºM^‹Î}ê#TûúËŸ'šÙÚµV9Û«®Ø›¬¾æÃõ§£¥ñåå2dj ò!w¤o45×uu¦·n範¸âlÕÁÔ¶ÝÿÆK‚F œ¼…¦];LðDõ£éýœÐ#¡ t¶±¨ ¨R—4¨¯Üw0~ÿ"ÌK™LJ—®K[4''䰙ʽ€#ø¥ð2ˆNîÕ6´B3UWâ-ÌÍ,|}câMôü>4ñ ºÄ 2oNs–-ΕêLtÀAª¥þÜ-~S—'‘.÷ÂÞ¨ Š©a_$n±4·ïX 3Û…¦Á`µzÈ6*IxoVø@H,#[ s‹ƒ»uŤÑoÙ›|êOýaÑ©@ÞÏõZyü[ó…@*|íwœ^dèòßäκè!3õÛ3´gOgî_t‹¥›ÄËîÜ#à=ììlF,ž¥Ü½×Zn«sï%ðªH²ˆ­Ë5ª„â%q8F¶Õ¨K|q PÛ»8Óü~ãeoëÝáüÓ“ü†OövïÊUa$Ã9_ž¥‘¦L+\;©™—óNñ/A×ÁÊÀߕި݃è¡Ûœ Dѧr+$yù#'ö6G^[äË…T*a-–àñÛE'øp¦éZðCGå/Zƒ–?¨k¹c ò9jI¦Êb!ž¬×·J¡…ýè£üÈ¡¸;Ã5ø§‹h=°}AÛîî;)D¥.Ò«wãMê\u¦!¼šÉÁ`ÒŠ¶ffÝâE¸NtÒfÛwMò´Úýá7iÝ;ÿåÍÆ—û‚wò‘'ÏVÇá ²XH¦æ¼)x‡_ ‡¡çJãªËšVxú.4vÜhCÃêtNùϼ¾fMÏÝž»U íwwNk?ÍŽ ÕO2ú–<àû%„Ùòzó ú¦íu_\ÔCmY¶¶(òGh«ê9±Þ/äoÁV™(ïÒ7qžOlÄt^;~qnvu|©­êNå2Š—§àè’5‚„8b‚DPèk°j‰Tš œÒ̼ÜôØcE}á_±Ø½)]Iƒ@}Ûè†0û%ñÃuZô²|Ò­’JÚ:ûìOÁ]FLXï­Þ q¨84™¶úI tŒ–‚´)RjЪ2tR‹MÎëx9O'_º¨íò>BËC•ç;nUì·z~éÓ?zÆ> stream xÚ]P=kÄ0 Ýý+4^)ÅN†›B ä„’~\îJ鿨Jjhl£8Cþ}c_¸¡ƒzzOÒ¯šScMþNNu`0VÎn!…Ðãh,ËrÐF…½JYMÒ3^µÒ¿Ê ¾´ß_U{ÎÄÓõRgGÐ8Ü—Õ#ä{Ýœºu85vpP €Ÿ·s ÏÚõø±7ÒHÆŽp¸V]BºÅû_œÐ¬,Ó¸ìv’rg/’´#²BˆŠº.Zý¯·+úAýHÚ˜ÙÆÌsqLܪhïîN-DÛÞôƒä(.7ïoòÎGUŠ?h¾m endstream endobj 343 0 obj <> stream xÚ­XyTS×Ö¿!{ë€J¼¯Øá†¶¶jŠZµX'œµ*N83Ï3“ì$̃€$0dŽ(EqÖj}N­Ã³Új¾jÕZé¹ôз¾¬¾~ë½õýó}kÝuÖʽgøíßÞû·÷‰€²¶¦ÁðM_¬Þ¶eÝÄE«×Ou´¼˜áƒµ¿gö§ÙðÅK¼ƒÿžÓú]ŠDŒ²ŒAFêñHËø!X³E "fȨ”ôüÅ~¡1^[‚Ö9:NŸâè8mQD¤Lã0Þg‚ÃT'§Y“¦9::98‡ùIƒ|¼ÂV{Åú…yÅ¡"|‚übdãçÆÄDÎþ䓸¸¸)^aÑS"¤ó&Lrˆ Š tXïí'Ýéçë°4"<ÆaW˜ŸÃ þ)ƒã¢ˆ°ÈØ?©Ãê_?i8AÓ£ýè€NÀÛtùÉ(E¢Ý• ÓÅC²7¢&Ñn¨Œ‹ƒød7á&:9ââ*a·‘_¢dˆ×é r7g‹ Op»Oˆ6f룫Ãã£Ãë£ëë««ë9[^kè·7Úo¡‚[BÞ}ìߺ=r*÷Xå=%diÖ\øäL휿oö7q=p®ê»~j¼{þÁàü ë k²GòSð€DÊY8Wp¤ ½Rh„&8'«_´æÃ*XËä_$MZæ 9›„@«©‹0ù­u÷f«Aíþb:„JëÈV½5Ì@ HÊ…X||::î ú8„žª(n•X¶¹†^¼xf²;øyÜ—Å<_cûž#GÄ:OÇ ÑÔØÛ82mÃAÐV4—tÖÈj¹t‹TU_i=Ìý}³$ðùÖ9Wã8Ø^.'_£ñ žÕ¡…$̳Â2FÖñoˆùåK1óïWݺßAuù>XyO<€ìÑwl5òÐÈ–C\5˜3 AL’¸‡V'Ê ÛOy|ù߯,Ž’ˆÇ:Ä,~ˆ„?ýY)žö 9ñÀ2ðß·ACñv„Ê,“uà ØÃ\o|z+‡`Z½Ç¶À6Ø[Â\ܲb^†žÿúšà˜ñ§B>’ïc -¤gp¶Û‚²4»’Hg0ö&b¬-/"yâ,ˆ žŠßÆøPç~àì/âÑpT{´àHNÕîÛ]_½ŒQô÷㨂X}0¦ ÕtÅ?F³x7Ö­!{/T0§¿6_úæìæE¬÷ÝîÈ’ØË­=½pŽy0í¸ã¸ÙÎS8iÜÍ;ŠS[¥ÆFü|]øŒ 0žyï—å/ÍO·~ã E¾ßϯO,ú¢ƒçÅ¢sëâ»Ã`Íç›f,úê'ÏþÐýOËƒï«ø±7¬|€|ï‘À¢KlS>p[Ç%€«&r/ÓUP_aŠ.‹M Kó]~ÄûÄ"[ô !^@LŸŸÆm„m2Owo÷/XÀàQ?N@Öœø·ÓÐi®:Áà‘óØDpƒÐ3²V8½êÖ·Öl+m&i ªp/ ÉYnÌgAO)‘(âO•ämÿ]&ñuë—NÔ€]õhe¥Ýí¾xƒøÙ^,~? d!æ~áœ1(9LFnvnñ利W~ë(‹ŒŠªˆlár‰ÿÕê|u±¦ ßRИ4¥Cp¬²°ºÁ–½RÿG¢?Õ¾LÂÿ„7±Ö…$ÉÀ‰’^ÕÁ‹¶šø:Ac¿³¿›UªÌO„DPdf%cŸŸìe[|’\UDl«Ôû4-¦^e#Ñz«ÔX#­ºH­9€Þ´G :Œ'«³5™=&lDr¡t‹ö"´í; 2“ù2Ú’óåM 6ðE,²Á×mp,©ñ9`ꘈ»Í‹Ÿ ›û糡ÕôËÊ^ýªnóV"4qhXŒ ñüî¬OHxÅÄH€6 ^“q1R!›ùÏÕA},*¡¡ J Ú"M=耹‡¬³ñ‡K£gãñ’§)ìãêë§á:ó‹¾Çã8ü÷×-ßëÀµh/A{û%hùWCG´š¦Å”ƒšƒÚ –ÃJðéôë 8šÙÌõŠ›uyPœ"‘¤©22ʤDyÓ%?L¹a/;»­ic%cÉ\mÇï“:hH‡`-Ûññï“wàwÿ™DÿåëPòuz‹ßõyüÏIû wEDÂä† 1ÔÜ›úà€ÁÎ|mû4ëÂ7FqØatû*›ãSëÕ Œþôîï$ǤèuÒLypöþ\í  êö€Vßö­åÛqZºcE˜.¡¦nޤZIV“›º¶¹§˜Ëžã¾Ó$þ´xßá-Š%ŠUa ‚¤›Áƒ™ýXz†#§œƒ•ÝLúŒGOZä¾Í»ù GÍ·SÑØ^¹A®ç?0 ³]ßT~Kœ„ðÃYt‘Æcå6¡ôÅ‚Œm’‡FZ­.Ø]Û͈{ÊbÌ[¿%¥eè¯?¥Ox‚E$|ç‚çŽD£Åå,ò¦¡ÔÅåíÇŽTÃ~h‰ªö«ñÖ®oðWº„»ï õ vw¨ŽnMÖ“.{A²VnDMZv{o¡Í’-Ù(œE³nšs…pFÕà­È ƒ&jO\]®¢áüüöyxÔ'˜Â#9ñ <úÉxÒa½Õˆ†íiJ”ÙÊÌð)+Sýó›¦ïC3$ƒÇšù1ƒ“£Ê/äy”]A£qÅ6&zIz~DÜÃÿúWûq(ÞâYãJRpÈûH…ÿ<Y¬> û÷¤·Æ^4È@)OÛîëi1®&º-ªSq:¡Usª~¿ÞÔÖtšÁœdr/&1‘Ø:AšZúôûƒYŸ{pGˆñ‹XÄÐ?~ùe§…2(ËHÍ–¥€”‰)«­/ÓU·ú7mZ2sÓ{¦ç„þ_£Ýå°œ(@»º[S×Ñ ÿêÑÐ$2Ñ$ ±wZâû*Uvu½qWÐÂ+ͽ'Ŀɑ-`?…§U¨U7– Jªê:€¹ãb$© I’¦§ÆDøË_r ªB×Ñ©¨æá… ×$КØ*­jÙÛ’»‡¤\ЪäÙYrHeJSË‹*ó«*R}¹8ðÈôòöjòÒ’fxÊÒ¥ó$àað3îLI’C #î§ ´ÔÏç’â >Ì¢'Iòë¡ë4'ÚR·©n¬)xB†:$g§ åcñö£¥‡Kà@[k—–9)º¬a†ëâ­$–"Mˆ5£á}vWú–œ?DKø5,v°xôëÂLâQÃ+ÚÕG4ÕÍÍʽá\‘Û.?ËáÛØF©>"462*Òeª3êÉõ§ú¥·¢Ì‚¾s¾«ìŸ;4âë:TâéårØ/yNŸ=zí=ó‰OÈŽ'sêÔ'5úúzU½eŽ?¹øÆb´Ì^¥ÉÊ# séTQÁ™Cf^͘èpE D¬Ö$[T¹RU$‡ˆKNMÏÀïa[{>毡9hj¿À,@ÂsB´¤%û×¼­ _c<¬1{”­¯1Zþ#°pk°CVŸå÷ +ô˜ÅúWËšÕ‡4µ5½/É\†VÑ¿^:vöL±ëz'ÿŸæm&U50h ·ÁÚ’\¬[G.Ð. ~Éwœ‹ÝI˾Ã3b5#þîß³X%îyi4ßû?±‹÷ÿÿÏ€^¸öÄþ?A(äFÞÑ ¨»…Èu8³hô¸><ú ð(Ìþ:‘hØðg?#1‡£ðÖ<ô‘¤]pZ ŽTwÕèÖw@ì‹­ñ¬ñ„uààëëî¾ÕÒù¿ýÊоs}·Å×ÐçèYÑXòÚÉâýÿ2û?iÀú‰ùîUË- 4*…*.¢˜}’a±¤±1´Þ“_[Ë“=ÉiœÜÀϬ´k2J¿D2cÌ—â»Èmb Ù7a³%Ðg.7 ŽÇÿ (Uåì&2dlO'@F1iIÕêÊJ 9fOe—×~•ž úÀß/KàpXCjIp£oWáqCñòR8Á4×tÞæäNÕ„ªÓ <¦r+%Ï^¶LYD"SRÙ»Ò²~uÞD$ÈÖoù –GÔÆ2â»Qu™—“ j{R:ÆéP„ }¦üz½e"g~,‹>0áÐ*©Håæ0!›‰ý×ÓxÄÃÔ–Ku—ÎrÇ¥iç0?ÿåp¿âuv Jxµu T¶¡­­§ºÆÔÒYÖmIÊ(e˜**l“&Å’”zeA iŒw¥de®žk?÷YZÁŸ7ÊÊ uƒ³U+”‰;w¨#-³/‚ZÕíò³ö“ñÐíëÖ*w˜PºFcR×Ô›•ՖЋÕf”±7Ô7¾|uœ}¼42!--)ÒÒn7¨i µíªËTWrÇŠ©glc ü¢ ^œgaïÚ4äÂPCá°atÆsC¬g醽nþoÛz¥ endstream endobj 345 0 obj <> stream xÚ­VypTõ›ËˆÁ¢[;¾·EkEž¶¤¥H€DäH „dÍ›k7›M6Ùûx»ß·÷½I6—É&aAÃ}XŽj,ÈX/DetT´NÇþ^|±í/P§ÖvúWgg~3ûö·¿÷ù~¿Ÿã'¢23)‘Ht{^þÓ¿Î/˜»<7÷w‹&<©<ß|:n¾¿—âiÏdðr1w&}mUæß³2î¥(Ñ‚M®hY©?ß1¹þœ,·÷Ϥ$"‘Íh1ùÔ u‰¶2'ç‘ù99/¯©mª¯,¯PË,#_¸xñóäçä,–/S*ê+KKªå¹%äÊ5ù²K^PSZ©P7É|²B­®]²`Accãü¥j~M}ù/çÌ“7Vª+äù •¢^£(“¯¨©VËóJ” ùÍæß\—×(kÔŠzynM™¢¾šÀ>“’QK3ž¢VQyT~Æ3Te†RT+¢DKÝNÝKÝAÝGÍ¥PPRQO}«©5dïZj=•OÝ•A‰¨LªBdȘ‘±&ãCñöÌi™ø¶³ý4¥ Ý7õ¶iÌ´ëÓ»²Vól6o1¥ð¹a|.%:ø:>pIÌ«xƒÿ¨ðÃEÂa0$¨æ¦…©_àðBÜ‹›iá²p§ôÞö.ÎxÐË ×2Pдİ™+¥EÂÖÅ‚8ÐÛÛ‡øcòÈ~”Í— ÛSüÖT8…M»Ç:E½/u^ûh(ýŠã£Ò‘Öè4|ön€J¦vA™¾¡Ëœ‚œ~þâë{ºÕ}Ðhß÷0ÙQÁ4C3Ô8œ6 1ˆ{ÛÁÃqà…¬~kl3Ó õ5sN!³zÅRx6÷Wîkç=ûl…œ«vNkÜp¬¹×üBKÀÑf‚V°¡&}õNÚ;Ü¥½¦€‹³2²&‡îìÎÓ¯Žþ‘”ÒaMâú¸ÞWÐùèЪ]hg»¦Ò0:òæ{‡VãQ©ÉibËA0øQ›7 ýW"ëþ•BÔL~+Óš@—u·/ 0AWœEÙø¨ðL^†Å"¼6%ÆkRXÕšŸ›ë`N°#KЈ¾÷žzVu°¸¢±¦¶&Y3Ò›ˆstöøùÕ]üÕNÑGã?oçcÒ¨?䇊™Âzš'è­W…=2ƒÍl=èC¶¨Ÿ|³ºÁ(Lj™ýÿÄ1œ”eó)ÁÓõMA§è%>GÌ+Æ7Iýq [o¨‡Áa„¿=)³µ’ÓY¤›btx£Þ0Êßi<–ÂÃiÑø¬ÏÅøoIÍ §e ­´­1hgø)¼ÏÀS?gàõ5/ý<‚Q÷——áCôÆSç„™´ð•¤IO¶F¡==:.«GÝHÇ0æ<£0 ß/¹Ñ½zÇã99Â]Œ >’šÝ,@‚î ÛÊp±ä“¡5sææYL6ÿ¦&uòk¾1-z‹Åüÿih;ø" x ’œ+ÖÊæ°sA ¥`ã \!gdk!8"ÐËpÐÏ9û~2Ó[x4¡5.þÝúudÒ~ÍQtÁó_ª!¡V•h×åž*¼Ê| ˜:ûÜ—¤'W!ÍK’æ/J£Çº{/yP8èùíAcղ˖êÍY³u¬Ñ¢¹B̘j í`w脌‰U2ÁÆ'-NPÁ,áÇß5§‹  ôØ„{&†e†Íu +Èfp5Ù|–0ãíñ\z+ÊšíM@2jt[™rNé‡=àóÄÃwóI'ÁCŸtœ3³ÈC¯· Õ¤¬i|4…¤gòc×nÜÙÂËøqé­¶£w$ᄅYÂ@±ú7[« +óë 3$X¯“âCŸ½ï£æœZ8z g Ú¾7Ä›X¿G‡Çc’ÐãîäÐ+’O`€õ"dKÆõÐ̰ÐÍnÛéøÜ~Îw·Éî<†,¹ž*ÜÁ@«µÆ®±T›J¡ ýòÕª?}0z#ée GÀš]ކÛ5Õ€žu¤Ò ¤ý½iï ø! /—íy¦‹{&=þР¯ºˆ#ÅãŒ/–r^·|(`óYi+8FƒQ_·Óh(;³&¾‰ÔÊÓ…©‚„õC•>kºbÀr©yÙ ÖëY,B>6ö*az'¾ƒ&âêò÷raYÔÈ9h=¸võá ™£ÅZKdcñÛt8.;zZÖ£|L¿3f"ÔЙõv‹peÂ([ÄG\!—<³b‰Ä‰(ôM˜¡Ôiq¡5’… ÷˜9Zn2ÁœÎì­¿1ñµÌÓÈY’ÐþP B<ø[SŠgRXú±èÃ×ÒÄøÄx¦´[צ®«V)Út=}½ƒ´ðÀ„XºA í-v4ÏÚ²¯ü÷Ÿby,lñXi8­¬I½tÇŽR@ƒ¯ŸÞ@Gl(Üîô½# õD‡ /ݳé¡A®7A:œßN}z¸RØ^ÀÉÕjR’æ,›ŒÌk71µ|ŠÕ$—PÉ–¤JYWS§Mh{ûR}´ øöqiKÞ–Uy ƒ¯“Jxû!„z›bšêÚú*ÅHýz pƾAœu#óDÝAH SÅϯÿiîw8"Ày‰Á×Nœ8¨+ÚZE4Æ’Áqœ\\O¤°âŸ¹|ú31>4>Oʹ=<ò9BÚ»Xµ³À!kpš\D’­qˆIa’Bö&aöÄ«„û`jŽ·&éaîöÆÃûû¾Žì?e;¯…üIÏ#©w÷Cënÿ½ú†bÉÞ‘¶—Á¾ë°ÍѤ/ª[Y¨ÎÖM:㢾žIþCÞ½¿cS`¤{x8;uòÐÈQ³(4m°ByoC{Kwÿ`÷è°jïfz=l,ÎÏ_Ÿ_oÔYQö7¿º9|Ñø’×|—ĸ/’zá}ž„'ìïu‡Ý¾ô¹ƒéá¾tðy¤³a+*›Ú¸ÍZ×¼ÒVÛ²Vfo¶* juÒ£;  D=þà°¯«ç#Ù­sâ'ëI§9xÐÞ.MO—S´…¦:Ö Z”¤æÀIµ¨D¡¤³„{è v‡ŸKì;ˆ§ÀiôÆÆ½Ëé_¾-×òöêŽäJ“§{z¹õåÂTT@½¦¹RUdÚB¤þü¾è±Ž—öêó×70Ðd×Zªœ––uŽÖg…‡ÈdlõÄMþ?ñIÙ­Îðwþ 3ÿ½"‰v‹¾ŠLYÿß+Z\Rö?*Z·T+¬§Šwo‚r¨Wëv‘*6ÿ?ªà‡„gÒxî­Jò®ˆ_n—Zv:-D§­$ŠÌ!» {=ºÔ¸›ñV0g` ÐqqO©‡ÊO‡žï³ñϾX}n)³ wT+5W‚éŸpÕÛŒ›ˆ¹nìDÇâÂÏÔ*"k‡ÊiA—tR_;¸ûèÙ èxrË6žm+×Õm(,&Äþ­îJ€7qB^ý/讈ùZ>‡7T~GÐL:»£LWcìV"7nPw“˜zð¾ókßdŽÃèÀ`Ÿ‹Ý%Ìt4·¬×2\¾yIˆ‘àqè÷’·¡ƒ ú÷¢9ðyHÝR¢Y¶Y»1¯Ø¢´U½ÿEŽôÿµûàÀرý‡oÿ…•ä»Óê²£lM¿<‰àÚ.‰°=<…ž–ùDgÖÔ@Ö4.kúîiW¦§¼YYøÚ]ÿ¿Ï¶" endstream endobj 347 0 obj <> stream xÚÕy xSeÖn—{/«ÚIGM@A*;¨²*ˆì´Ð–Ýé¾$ݳ¯'ûÖtßiKÓ• eWYT\qDÄeÞ8¿7­atfþÏŒ>óü¿oÚ&Ïû¤÷ž÷¼çüÎïüÎ Á bñàÖð#׬{jCø’Ègf†…ù>›í gyWxWzÇ19Ì¥GÉš¿>ü‹8ÿ!üÐö€ï]ô ~gMÅoÓ"BXÓXkëQÖtÖ<ÖbVk=k+Ž•Æ²Ä, ˪`5²Ü¬ý¬£¬Ó¬K¬k¬?°¾d}Çú ‰.1ž˜JÌ"ž#–kˆ-„€H&²‰"BA'QNxˆ×âÓâvä$MßU˜—œšŸ–‘›Ÿû‹²““?Ù‘œüLXØ3óý‹?-f>ã_ø?™æ_Ìô/fù³ý‹9þÅ\ÿÂoy–ßÎ\ÿ5sý×Ìç_ø/žë¿xžÓyþ½æù÷šç·3ÏogžßÎ<¿y~;óývæûÏ5ߊù~Ëóý–çû-Ï÷[žï78ßopßà¿Á~; üvøí,˜6}ÖÒŒ´Ì¼Üøìq/eÄÅg§[’‘7ny~n|z\|Üßý“Å"¸³¦Ï¿¸‚XE¬ XÉÚÊŠÇ Ég%N¯²Îo½M\þ|Ô_™€ñ-jÖhÖ¬›5†Åa=ÌËzœõkk"k2k ëiÖ4Ö VëÖ,ÖlÖÖ\ÖÖ³¬pÖV¡!´„ŽBad$L„™°VÂFØ †UáÂЪ *‰*¢š¨!j‰:¢žh ‰&¢™ØC´­D±—h'ÜDÑItÝDk¥çØ‘'0Â]›x#à©€ö qA§‚‹‚¿"É›”Ž:D/ ßöܰ[Ã_1jDÁÈ9#ûGÍÕ6:bôô<øûo<´ó¡Û!åìYìDö¥1Ê19¥/|øöX w2×*½ö»²G-z,ì±oxø%ãÆÕŸ2¾åñIòÄÀ„¤‰c'~ñäéIöÉ£&ŸR2úÇ@µ•¹‰Jt“òýnj4Zþ9Q†ê93ÐñÏ©Ñ?óS ê…h‚ˆøMD“ÐDN¢"3éøÖ¤ƒ<+ÙeÝÓ]tOzg,oô3£¯è=ÞïE*AÁð~ÆPGÁc9æ¢ïÕ3|7ÔÃ<æ½LIo íR;‹x R ©Lµvç"ùr ²‚†{åâŠ^Fœ@Äöžæ´·wÖôýÖ뛦ñ¥”ydܼ™ÓSR–¯ƒ4:Ï;ŸjE»ƒ¤R ‹L€MäÍÌ%öö<Ú{å•?@£Q̰‹ÌÈ0fT,CíhÏîØ·goº²Z ?m-îóÞè éGãÑBÄaÑãì¯ÑTïUŽžrXì6§¥Ùµ×Úg¡q—>†–Sð²páÊâ$åvdÐ¥VmoÉþâ œ™ž„R} ”Ðá¹Kgób`cYjs·¹¶ÚéÞŒ½q‚Ô 3 MJ»Ê»·ÝûnØëÌ ÐŸ¬zeqC©±ÄT¢§Ù_¿Ûòöqø„F,æÁö0ÞB˜’(™B«¨„æ´žž={z°ë9Í)~×õDz¼±¢t gPûë½h&u3$CÐUÏTDÞñLõF K OBæ‚\(.ÞöwŬðÙ+gEÌ媔j%Èé~‡ýÒ¢ËÁÌejȸdúÆý5 n…œDìÅý(qÙEÃþÄéjmìqgïOJÏÜŇI·W}ª¤ËI4=rMG¡ßah>û/Ñ-‰K§ÑªAѤk€OáÚÞ×Þ²ÚÍ6pÐfJkQ›” ™B¦-Ž‘GÃVˆ´ÅT+ J£R¯•R§ ™ ”Ä$®äÕ€£ÎUÖÖÔWÖ Ð\\^žaH€zõ¬ð¹ ¼-°iOÖú¾ã÷ÚO }Yƒ6¡áO PöhºÉѹàºáožm®í,ë„h‘׉ÒT¹BØM³ï¤Õ§uñZ¡¥ÖØNÛ©÷Wô-á͆‰›—n]Y8Â,ÇäSËöGžš}@Ä5ÄG¿{úf¬Ë,Ü@ë™ßqº(Ó¹öë×à0ô$™"ú|ȧçS¤e䤊Ӏž“÷á|\‘ë6æâ,†ù²HôàÂC¥nлø`Ðõ{#×Ùìhr6Û긛ÉléÈ:p?^IO ÷¶|ú¥ÙÏ÷A½(ä,Ͼä]þýËœ9òEE˶ÎXÀÿf·Î>õâÕùhD bzÐÔìh:m¡ìZ[)OF–*Õ¥|UÀŒœ²ŒÓaò¾Ø™'•—àœµ\l}õà'ì½(nÌ©g,à%F• hYn6;ùìn$¦Z‡˜Wi‰"‘DÂÕê´Z ¨AbW™7w®­[…rIrPè|NÇŽ~UïÉ~Ï= ÃÕ:óÛ#è1vU,Û=ZôŠZõ¸Th´E|Žth „æ3>»*rt8gSq(Ùnï4úTõéÎö°ÊXc´>š^KéŠç,Ù¼3=²(j0L¹#ÆKmÿÐp¸VÉŒÐ+ r›–®&6CÀ¥2Ëx™ /ZK* J«ÊÙµ¾öE`‘úü¼53aÌi›yzõµhøn€‰ô\YŸÑh¶šô´ž´ÃéÈFXƒÝâ+‡Œ”‰‚=¨ÚCà0qÑ{ØížûðCw<ãÑAôsphí½s×ÃÜÜeª™÷Põ]¦®ÀLkîIw†îÿû{7S†šon˜¥6™UêŽ=ºòÈ‹+Cj› T´–ÒÈR|Q–ÐëR¥ºRH‚Rk~Ó³ß>ÿ—çï×rµFµL`v9¬æÓG¹=íÝí=îŽVn þ ÁPoÄ ÚÃ(T]¿FÎ×Q 9:#wÚs3çM]D£} h<ùásÏûnh ¸¡ÉÆÅ3#™™@?Óê!ýQ:Ò€W6à?Ô5ªp—6™·[€\²ŠtÅ@§d˜êøÞnjÿÖ}Q}Qèf nSÐCÌd«Ì¬qm!Ëm– ¾÷UÛitóÊÁ¥súbX½o–¤çû»1÷F ñÞ ¸æ–(V¿,˜¶RÀ„ÿ<̰¯V_ØñNþ{˜ì¿l|ãìÛ;oÃi×s®o~cÅÇL`ÏxP€ÒWLÔ½Ql`…ëVüæ…Þ®c5Çàœõî<aŸsà øj·(Aš –!¶M¦ñÕ‡rÖ¦M/=èø`¾Ùèöîïr^¸Ô]@<ÇAÄ6W«  3r†i¢™µÌ—t=D ÀëZ÷ކL}$ûÚ|,lÝ––˜«Û9XNá·³ÄBêv£.Ï`£^Ì>Å?Ûës¼W7  Þ:?—¿’‚«V¡ 4ûp¹®\[ýpªÁù.m¥œ*{!®s¼¼@,,(Îù`AS4 ªã÷Æ}%¶BG¡Ñ…ÙÕe>Ût¾®ÂÛëOFì¡WîYjX ôtæ=êúŽ:t];3ñ ;T1;²vfGi£UæÕ?cФög?Coˆ*p¶6*7ïÚ•œTQvö÷Ÿe÷Hú”=ÒSâE0™^°"þEÞS8‰¹ˆÒ¸¹N•IÌ“’•RÊg’(½Ò¨¶hi¹jWqášÁ.µ«§Ÿ-=çáRíþã{»+㞇†-¼Ê6.¯àfXÓY®¤ªŒí>̽¼Ýr†÷ |QÎЉ^¡f'Ë,&'íÂÄlóJA%“Ér³¸jµZ®ZGb¤ØÔÆØÎµŽ ƒi=/ W§8Ù×pqŸù~!GÄHƒ=¤ñ¨éuwO羓†#@Ÿ¹÷)3Uà]æa¦z?=M^„wTÓl©ÆÝ†Ý´‡!©Ó‚í/H<^ïMxÇõûQ³˜r2 ÐÜ—P(¦a.â]D|¨ÒUB>¡êº~ª‡¯fÊT9Tê+pÍ´¨…ü{)åÌ-S|µ;nÉ14™ï ¢$_“ßïýÊCôíqªƒØ&íˆæönØ·q߆žÍ\“Ê.Ã…¡—*äÌR¦”+ÌNV'CbEI Еû¢O˜­ƒMA[¹f«Õf²¡•Œ;_€>òÌ#‹@å’;ãOpc^=ûºàWi•–c¶²8Ê,V4Eq+ºL]¸*uå¾´¨†óºR>¨U*­v*ó0·´°4¿¤ˆ™„vq?ôqO@®°CY¸syB¼w°3oà#HcǪOvw÷÷_2b9„H’ËD2Ü¡—\¬RB]lQTòØÝXûëÍ@{ídjǧ}I¶,&fÛÖeªÜøÇÎWUY5Ëñk‰–Ûʬv¨ +dæßœAÌX¢êBÚÐónb/ˆžFÙt–,·Ø\‰ü–™Í_ëŠb“6ïÈZ+iæ 4 =É{>êl»j0êM`¢2K)/t¹â‚ŒQ­° ¶Õf{òz´ýà¡Û‚ÞkýìsÞ[à^e]íSñ†_%­«ø°Jèê!½ë8‚s”AaRÉÜŽ¥î%íKËS+Ò\©Ž|cn+´‚¥ÚV稵×Ùk¿D \{½Ö^ãj19^÷…z¡€ª€YŠÛ (Ur­:o+W+Ú.Œ•æÉr%Bf rsOÆïŠYí¯¢Á·k?…û >‚ÌJ³¢6‡ÛÛӳݤ²a&¥q‡QÊ•jõ&ˆ[T (NV‹4Bù@³ÉC¥›¤Ö¦ö>GÌ#Á;¨ÀMªA¥ÃB4V…UØÌÝ9wx×aµYfÅ´êØÛRQ}ü4·qÓùÏíªUmW¨¤³&OA#ƒ÷ú‡ù¥^è]‡Ç>9Êá¼öÚÑ3GÏYl˜i#e“帒R¹|mÔÆM«cs bs Ôç¨øPfCQÒÁO\S^Sr Ð6›ÑÆ7RPžØSX—phÇÉí4Šx¸ç ûdË€Ñb¶è­>“2l² ÒŠ‹wîìŒNT©jPøLJ;r*KûûâºvÙäf)Öh6û ImE~£¤ZØ•u ½•þ¹Ï^Êå¬[¹&r•R.Å”Ck(¹McÃCFkW]í©çβ˜f°Ñz ÊböäVFwÆv z³ë³;ò–Ëqc×PPÒ_%ìŽÙ¿ñ@2ÍD<›²1c›F98¸`“vlKá¶ŠŠ¾ýž¾þ.3V<`õ™t$7¹vvíìMÜ'·©X>Éeƒ& Å59΂ºÄæí­éô}A~zi1Mùùû¸»ýLŒ/¢Þ„7¬§öt6½¯Â›qgVuli]kY t&¹A»^½QB£ ªºô@·’—à}õþ5Mñ–hK,fÂtÌ„÷FùÄùuÔxÔ~º¡Sí.Ȩ‹„Ͱ1oCdffIº.èÿšé«?f±m>ä½…cvʃ¬¸O èA)`¶2y̓̓ÅÅ%…… •^ôF2Q`B³²\<ÞÓÓ<`<„Éj<ÙG´½éGã-+mëÃ¥f†yoÝõ?„ý0†ƒgÝéõH (šFÖ{·È¡Ý%žTŸT Ù‹Æ£‡<Ƀ°=h‹ÏH±ûašöiÅ4Õù’üeÅ›³×.Ç,/¶›iv¡žê47 >_ÉrÇòd¬² ¹lÏÒãQWyŸAç•Ú‹4»¿îmÛ»æwh¶Ðú¥áK¸ãÛýÎßô0ö#hêGi? ÆIÞoЈÀ¾TŒ»È”C_ï½`ûH-´"ù æñ³Ì“¯3O„fl…æÂF­Õ[j¬•GÉ=Œ£@üÞÿ×Ví¨±Ôèï}Éïë=CB<›,¹\Y,ÉåF0a/0Ó"˜Š"Y‘ªÏ¥û³úE6¢µ(dbK¸Ê ¹­p0iÿwõå/† \~?P`‰þþσOýÿÔ¤ÿ•“ð‚»s_Á-ýç îÎ}wç y.©[| .åç ®myªÞóñ^ïøŽ¾÷QI)=ˆö [è&Š)ažƒXf’ÝÓÛç¹Rvk îçxÇSWà›œÆ§méú H§'ÅÎ`æóþËEàãGΩÜÞÇÜ!n´k´9ˆ`zÃ8zªÑÜllúô‘´©üÝ3š‰LgØ3QPÞ5¾“üáÛÖó¶2½ ÊüÏFU]Þß¹‘RDì=ŒëöÀ÷½$ÇúfÛÅË(èU½Ð$Ú¡±òR!¡d·bR>ó;ÛKc)'Á OoÊ7ìÛ>°ñÑ[8±£Ñ˜óh.f]ÜìÙÖ»ªb ,‚%Y[×Ño1œS è_éêlhètvÀ»à‰².3ˆô"ȧÓ(ˆÑlÌHÌM/I€8ˆ«ÈÝ›ã†>uÿn;ŠjC3ÚB¾EZ‚‚Ân€Xö¥Q(Óã1£¶JSÀgnS…š|žÄzžòÑêÔp—ôEÙp;ì-¿X §iu“y°b1o6³›ó5Éþî\ÛŽ |H“¤çæçægê2€^CJ$ú >JBR•v£“w‰d{õæD®oáþ‘¸qå¶¾ÝÒF|ˆÀöíKµ›*…Ö1YyÆJ>˜õ6ž–ªðM¼~<3¶êšÄ‡rÍë 1¸|%èùà!AÆÌA[RÜÞ‡ÚBPÂ!ô ÕA4ñ§ýœƒûUkòù>B×)4˸ªq[™¹L ÐB²ÙâãŒCæWÛÛhv~KS/F4„äI¸¨®]D³Z3†L¼]!ÚR:ø$'TX`¬â£)0êÌØÁšZc-Ï N è6ŠYyo2GƒÅ› ·Ž"R­W€ÆäSkf‡ÝdºrÉF™Q í¢ª­æ* $+-ªb>s‹ò©­†þ_œRˆo¯ŸÆokCsÜ!è34ƒèkôÒqT¼S çé»Ì<Ë*^$©S$J­R…©XKb¿ £ÐÉUùÚ?еBÂTDjúyªÔ ¯ã5ö@çž–ºn .Ü#ïHÃ/PDñ3H)HtºRºÈ Þ«$û‹ÓÇW-ŠÈ}™¿ ž5׸̕y@ËH±Z)áË©Êi·Š>›€ÆXëP0}¿—ŸïÚäøI™Áí\±rî 9pgR¯×X1âÁÞÞWYï9wðœçu«Ãâ°9h¦‡**Јð ÿ ”Ä:)O!F£oúÁP]7Ç H£làÀÛcµª5Ê|#›dw|qnJôîm)ÑI‘\¥T!UÈhÔCÕÔüE?;NZ­…à3-B|ŒY„Ñ}ë¿ød(àKÎZep8™a f߬ªªq‚:²Ú tr|n,&üÌ Üî|ŸÏ~¯+£=.)%k'Ò*%µ¢_æøÛ'½ª¡3I€Î/ÄŒ‚H êû*kkh=YVX^ì*vÇ·'´Ç™Ôf%%B])/‰Üb*Jœõq¹Û^‰=u¼ÒZYár4V7U7Vu·vÔ øB°‡ R#åCIJX¾V°fÇúÍ¡jkLÿI¹G€Æ3Ü£vw%îGa8hü}–r]_«ñ!Nqt¥ÑÄHceÉ®p:íåPM³·B‹¨)Í@Ç sRÖË=ÈG£ÀŒ8Öë4{®ùUý)<¼™u¾oH«+ô¼¯É §öŸBãWdÚw€¯.Óûè•@Ä€wì—ûþ[™¨ô8]6O•‚Ö¸UdV¼¾¯G×L¥±EÚúbk„ïÚa[%åºPYÖ2sYÛÜý7{¿ØÓì²¹Œ.=ó-7ÿ¾–ü*TΠÒA[*+L[œ´4å…œM\µT)ÕH0IiœJ‡Ú‘s‚›r%é­´wdUZW:ÜGÔPïüuÄAùÈ #KTh,磕(–YI•ˆ+Jª—ÿ¦Šú xGŸ ebQ(“±_Sv?~Iâë Ȇ ªðnå,–/ˋώ+ÆD¿®fmßÎÃ[ßÌ¿áJÍá#}}Õ¯ahœžÙåÙz|QÕr<fª»àømTû³hü­»_§Àe69 4ZH–ÙÔEÿ¸úÁ&šèöŽí éDá Æ-² Q>Aô2GPO±ï4Õkvóï•QìïÂ<áh#Ù™v°×5 A#ßÅ#ùˆgÿÂLáo„-‚ú(Å<ª ö>ƨ8ªÕ%IEò" ž9w,ê8ÌG¥”¹ýͼ]v÷Ïø ²šu*_’Æ„­ï@2´8¹#%bº¹Ô‹³$acÅÃîÆÇûïY]Xêâ)ÌL: *ŸùŠ*kÅ<%™ y¾/°RÐkn ¯õx­$ÅbæÐOüq·›Ìvž™ì‚ýº†Ýx6«Í0DAÆ 0[<ôô‘ÙæNA¼)m!õxÿnßÃÏ´ê8€ aÛ¡©ž)‡¦še¶P =ËTh”Å)ܼ¨”5«5¸ˆ R#n]uVg=ÔÑìLwV]zbAfú–c‰Gyˆ„~ôÀ¾Ç} {Q–rs¥ËQéjÐ×øŠiaU -jc¡Ïr©0Iš'ˆ¶‹¾G¤b¡´A‚W#WZ/ì„2ÚH™ì5úJ ËÛ|_Rή¿ ¤…àô¡™è…'¾EB4šýºä›¼pÿ³éíxÆ`êëUé|f •Öœ`‡M°¡x{ÚÚiKagŸ‘Ï¢±¼Nè*kn¤™ŠýFœ #.‚lÎí,ÅzqÐWÑTÄžñ ó?diY4j„³å^>§Œºº{@ðØLË6ï¦'µcsZo ¤ÿQzöžÐqTÏÆ?5è„ÍmûùÈI™÷kîÀˆlcF¼àC¤r‘ƒ¥1Nˆæ²ù¯(Þ¯¨ ¨ÔWÁ+pVR½üWjb?µÝo·qNÔ±–fž#K *ƒï;‘›>ªû' =Ó†"[ÿÁ×Aku>¢\@AäUˆÚçćápžl ™ßS¾ˆñ~;û¶¨V qüt>1ËPi“‹¶ì ôð>£ªêŒu<¾Ã:än`yH„þ~\7½þØ~ë7ºö÷±œýÿŠåo¹ç§ý,¿âPK©½Ð®k):’aŠ0Eþ' ò?ÞÓ/;ßùñ„Š6¡Qïþ{ƒjõ9âÖ¢à»ÌØÚ™üi(”üe›Fæ‡}CÒò™;>±ý38êÿ–s_4¿—Á9¿ü³œ×ý­§Ý»€§ðëä+Ç’Wó!½4-¯8K¸[—ê{â,Uü_>ðæ?q’ðµñO3ã37¿‹@·|}î²q$8üØ)­Ñ@Ço*ÉU𔾬&+ìSÕî< ]p°fOý|1C1^$lmË?¢¶kbß¼'“j±®–Ù‹,’ÎÕ—r.c’| ¿‚G{vØ×¸-'C¢2µD©Qø'PµIe–q•F¥ O b­TÆŸIÙÔe¼FP9ª÷´ô­9çáðβz©÷®Ÿ1FïFk›Ð7q3lô·H„gí줴ÔÌ”„XnfJ®d× -¡|ÉÓY|Ó”³±¹¬¢¾¥¡¥¾¥º‘kµ­8ÀíÌ<ò—œ£úU…]JMcªÇ-DTêÍlâ,&7„[®)Û‹†ó_%¥”?ZRæ]kGÛ -.’Ùf¡xËF³Ž®9âOÃŒàÍ{ÑŒ,?Žù«-Ám endstream endobj 349 0 obj <> stream xÚÝ{t›UÚ¦ç S€`™ïƒ3Ô„0@$â„$vljãÞ»U¬Þ¥W½7Kr·ÜÓ{¯RB:Ìÿð3? WÌ—³ÿÞO¶)ÿîž³»g÷œÝ=J|¾ÈÒ-ï}Ëó<ï ŸwÅ<>Ÿíò§—-.xöÞ—–¬yîÁ9 áÞ{,³„—Y:#³,‡þøù+þý—327^q?{é–+eÿüý•¿áñržºŽüœ‘¾†ûÙv-ùÉ»‡üxòÏ3y³gðø¼™¼;x÷óå=É[Æ[Å+à•ðjym<ÏÌsó"¼nÞ0oï ïïïmÞǼá}û̿’ÿkþü[ùwóâ/ä?Ã_Á_Çßįä7ñå|=ßÎðÃü1þÁжªÚÚ²º†ÖÚ²òÖÙ%²æÞh®ª¨Ì¾S\^Uõàœ9.˜zxèÁé‡éwæÎ™~˜þÕ܇¦æN?<2ýðèÔÃÃÓŸytúWNÿêÑyÓó§¦çš7=×¼é¯Ï›žbÞÃÓÓΛpÞô€ó¦œ7=àüéçO/~þôÈó§Gž?=òüé‘çO<zäùÓ#ÏŸyÁôÈ ¦G^0=à‚éL¸`zÀóæÌžûtC]c[kYó­+JËšëo}®µ¸¶ªä?¼Ëãñoº‹ߌ¯XĆ·„÷"o5o ¯øŠ ^¯†×ÀožÑΓòññNð^¹â5þÛ¼nb¯àñ®â]Íûï×¼kˆc y×óD¼x³x·óîäýŽ÷o.ïÞbÞÓ¼gxÏ’1—ñžç-çå·{‰Œ½–—Ç[Ï7ó-|+߯âF¾“ïâ»ù¾—ïãû‰[ù!âZ~”ãÇùü?ÉOñ»øÝü~/¿ßÏàòÓü!þ0„?Jœpœ?ÁßÊ[Îyú ž„÷!ÿwü<¾mÆüœks.\1qe=U'xýâª{®®ü…ã—ú_Ý÷«~]pÍo¯ÙzmÃuw^wyæa“ð?_ß*º]tôï+Ä¿»éŠ›gÿ§GoúAú0³ûÖÒÛJg}~»ûŽywœ¾³ì·×þ6ù»×ï2ܽìžü{¸÷_ïûîþ“³™Í>ð휺+¢ç¾ôð- GÎ=úÎüß,¸sÁ‰ÇÖ/œýøÕ¿þw~`Ï*VÖþO…$%™‰ïÙ/¼˜1}¯)MR¹ZÃÎb¯žË.,b—ÈŸÓ,¥pgŠå]|Ümr¼€Ün—›pË€!Ú|Lõ œwƒït¾½?s /À7âC¡„‘pÂmviáEXm6@?Nª”ðñ‡ûsp’Ìh¶Ú,`U²Õ«Z|–̶Hµ¸ãéÍìòÇÙ¥ì¬È`T@‡Ln³‡9R‰Pçá‡qîì„¿6þý¹wÌ.“Ûd°Ù¸yæl¨cŸlÇ{É32:M^’Jb=‘Ðpïx|' µÓ.´W ÅEl{׊ʣçè_ÿûŒo_éÔµce:“'™™±Ÿ.úT¸#Ã*Èœr»ÌY•®*0Û-$ÔëªMí6¤¡ÔVƒ™B©Ýà!Qˆ„{\à¶;E¨>èsô“w¤#0fá‚Ýa„;|&—–6PJ‚Ú«ö;ºm$ K•x½Ÿ¶˜«§ä`RéU+g‰fï%aïm*jÙ¼R£²v8ABBÊä¡»¡×ÙË͘‚¤-eCQJØê—ÍE¦òú ¤ò°¹Žx0æ‹îy[LùRQ $‚Œi^…?èc?¸’lßmÿjOã )¼==3óÑÍï ¿È âïEQOÌõ¼ÑÿÖyøWïËKUE*í€Øí”ÊhTk=Ö§’½69cØÔf•EÍ^Ù'V­“YÉÇÚ(µÑ¤`ì:Ÿ8þŠú7ïß/¦ÿŽ„s…aˆ ‹Ë/.£Y™F„å,fí’ ¶+¡±3fÏagÐìLJ«±ÉnBCžž¸@ì 8ýöò¤D‰“õ|àêtEúœßC ¿Øk+‡Õ0oé·KM2bcâ™3¾ºø¬œí÷³Ò3¿_ú¶p¾Rd´šI¶AZ¯ÅOÇ©î^›ŒYk3²7\ŽŠµe®Ö'é)-X-&-2¸-ÆJ؇¸-FžëðãXƒ·0€g¬ÆöWQ¥C Jbœ£¤àXIIE™<¶J$œÐ°‹Ï&X %™](Ÿâ2*øÁë /|sfDìë3ý31D¿­Ow¾ih)<ËmÀÜ2×ÕOœóA| m'5hŸÅïŠ>'µz«ˆB«¦$¤X¼¤Ê¸ðsÙ`?%ÜG–a%‘ä÷zƒŒ°= sé6ª­Íg êïvÅà ±Ã~Ÿý•º8R’ǀܬ0uh·ˆ…ûL­†hEkvm|ƒ> cã‡ì.‡‹KpV—óö›ñÎå€ê½Œpœê<§O`ÞS±·0„ØÜ°È×ãîõôìÇkÈù9ã=NôêÔGº¹ ¬k_YQQ\œ«z)›BNžÿ§s@˹Ø-i±ãûÇD:‹±É¬,f…b³J'Ò“@ÇÁq†"»ã‡†ÆFG¹örí ƒ†ÉâI++¾Ü#6+¬rƒRÝZai´™Òê-J’>…st>2‚Ѐ„#AòË3©{P ˜Ñm#/~O(¤qh n4‚‘kâMPa·Æ‘K@Ü×ãðà3 ±»×>´ˆC“/‘Dk:pD“Ë@©¶ÂR†ôä8¸@¦ûðް; ᛂ•/÷PÖÉÔ5YÒu©Ì})þw¯æà¯Ïˆ<%#u;àMˆ}³; *p!zLf«QµI5w#I¹–„5мèñt{ºOa-ÉØ® =ˆRjÝ º6³\:ÚÜSB¼èÚ;Ù…ìõÏ?øsFÇFÇÐ1Ù4fE[ÉÞJ@µÃ¨nß°:¿PS]ßY&‚Û|ãIBenxÐÞ®Üj\)/Ï.{ ¸ò8n8—ƒe™E¡ÃáCáCx†Øô„!@P¦ÓH“òb¬$C«]& ÐÚ€ÍO¨h?HIZ°q1¥xŠ="V( -ž÷.¾ãc¼_q¶æÓtÔ6Õ6 <÷Y‘¥\_©«/k[¶ªP­—ëPdW…q”8¶·ú'"ÇÄáCGÞy‹Úf m°WƒH@ Ö¼ˆ,˜>'óLæ¢fk›‘<ªŒ¥CÇÖ š7ƒ}˜Î=úÔô»ðæÎ‡Ýn‚ż$©[½F/I`Ö™M²vqIñ‹5ÄY ÔªŽWv2Ðãêvww¾ÝûÑ…}‰H¯¿`P¬ûé±rÖ"'›y$#ýwOä¿yæÄˆR…¹CS*¦ ÄØc`_òXh¾:S#&†Ä!{6¯Áa€fh17[$¶4“D@ZŒJ¦¸Š+Óµ˜$Ë/È—#EîÿâÉwá†^˜"…_y›¶Üù×Ì {³ê.öZ`ƒl»ÿ[ú|¶cÛËN'—![ÔÓVJmR4Ê:J+×7¯´ªýØ¡ƒÁWâÌBz Ïwã_2Â÷ެ^O ¿"`JDøn®(þîéOÿh{W]í,öÛ’©¥°›Rø…TfVŠ* ™O‰ÌR£Ä,•.n¹ívh…zhÆ}¡$!¦HíÈF5¶·4­yv1_À{ÇzÿúÌB1ÀGÂÙQùTÐJ‰UÖ>ÜÚ»Š¡¸¥¡eIîæÙðzn|ÁûôNïI§ÑyÜ%²Ê`QU±7‹¹ëžÉ2úfå¡q¶·ù·FO'ÎîÛvEHasP»¬=k¡8joâÅ“NQ•­¡á Ä„Ï몟Tä[MV#á¤úûèN°÷¹£¡§÷Šz5 4i[ôÍòBy¡¬P]%)…*TÖ½åí¥.x†ß°»np£,×¼l5¨×7Qï 9ÃÎЙ«Å$8¦}ÞH|¾* ÕV•Mê$Øô‡~‚£Úõm& —1±EcT‚Éú=îoß(fÄ®°‹”ÛŸ%^’pè"I¾œ?‹•·±³€½=¹}î7tÂ7¿Ã¿|z«ä“[éwØ;EÆ•›ØVVDœ¹íø~& ð}5Žoûz_ÄM†t,™»‰{mô%íjç\ö>.|2/œ¶â¼ƒ";©jÙ Æú©Nñ…S;þŸ¢Wÿô I€[ªj*°V·½~h31vëZÕu‘Øf¶fÕ·ÙK“ N?¶Fw?#%0énQ0P¢(Ñ•>Ä~'6I,Mê½^Á: ˆ„ŠšfGûHÕ# R“X wŒÀh–C¹9bÓ»¤ÅÂ1ÉIè<„g’âí‰;b[pRdZUÁêØ«tÈBml{y˜±\G` ß&Œyº‡ÇS]Cýd(ç•»K>µg¥ø™™{DR=¡Ïm ðk:MÈM $zûŽ,ö42j“©¸¾½L¹«m°ž†ŽÙªMdçiÖsJ‡ÜN§?´;ú1 ¸W"g ÝÜn’<˦ÅVEZ¤k#´ƒJ;œýÞîX.޽²÷Ís>BM4ǵ“2œtÊî?‚o8’ó×D½ŽîN@QeDV­¨ixöRÓñýôÂ×tP`<·²+7TëkŒð9qxâ qª±o¥Ä,'é©ýÊÄ@h çäšþü…O­zˆözüÂkÀæ EO—®¤IR‰)wr³>·-JL0;óH8åeˆ?ÉÌR³¬€Í›Zt­${oL¥ß„ƒts¸œ\`ûÞ%ÕÀÒhPHŠëÖçëQ¥;E›·Ë<ƒmbgÈr„Ð9‚®³,0tG‡Ž™Kù¸*¹Õ?"¶{»%5>%)ÏæCSûK±Uo×*˜–ƒ¾/PJ­Yɘƒ—cb?‰~>ž}:z4'ó‰’6[›„dZyXïS…$n¡ÙÐbhn¼Œ½jåªvmcàüà¥ÞW¼)_ºÑŽ–­ùôb(›­Ê'YÅÂIVNKN‚­× mï{y9HŠàîÂÆu›…òM‡V æ~Aû©Ü{¿î{-¶7´/°ß•rw“ñzõ;k韮îË>QÂA7D A©©YsSñ~ù³ F»¶†««Á%8òZ×Ù¬æ%ÉßJ›ÚÁÖ`TÊ6—½”¨Z1:D*»¯×Ý=Œ¯GŽ'>y… ù°!bD6Ì(SB ’•]ƒñþî=yÑjz3TÔÉÊåãMCùÄWó–´­°šÌ:Â{  '!@Ÿ7Þ¹{Ûу€Òñº:ÚÌíÆv®+×*æ¯4¾*¥Géã@ðýÇÃ]í™ÅÄ5l¸Fäs{=^ÏxZ|tÿÑýû;N¸Ln3­†ºj©¢¨lcEaU~…Xg’@ºIPµ/Çš­¹³ËL°¬Çåò0V% á†cµGË |÷ ¡h<ß1‘ÞawØ9ñ“|ØDj‡¤E¥.(Z·ym™Ùl¶'Ó9Ô)¹_ÝSÛ]“¬öh|-anP·›¿.fÊvKv5oÿùÒOfO ÚfЄ۽ªÞ‚‚‘"‡ÙÃE°MÆš¹r]Ñê‚Mù&“Ž“L.³‡¶S>»ÇçqŸ>vþй}ûGÄn—ßEÎÉ.°†šªXåÖšõ;µ1eZ5-rß¶…›ˆK‰oËÄsÉ nÛ“³Ú;´ÚêêššÚ*NÖA’‚ÉIfqP~èî„÷ï>´íð6bE¸)‚Ò˜6Ü2Ô:,5„t=ܶI½þÿoåæŸò»ˆ«PëF¾çâÕ˜á}ÿ¤Èd5ëɹh6 ’=d@ ŠÍ\Èæ®bóY𽫾®¾y#§p´ƒ~‹A"/h-P¬ÏF·•¤iK–¦Å½ñäáÔˇû‡ãÎ É6Žt­£’²§`;œ´&Ë}½* ÎØ`©G ÏDæÛ¨=îÙéÞåÙéšLN-Ý@µ¶r¬•€» 3qx¿ið Âר°×ÙÉØ|»ÐåZŠ8˜m¿³Id%!k–³×^Ö‹ Îæ*b? ¬v«àíŠÃøf|ûi¼æ^áé³mÍÒ9Rñý”×êÐ/ ®6e)IZ—þ>'«¥þúªÈmsq|q ¯;TÆê™R£² ¡$RvÂH Ú!Øyj`ï—øcxã.ü¸·º&ÈÈOQ[vd•IeQÝu™«7h6¨6 a®¦ªÕZO°>¥6X”z—ÉÇl…­NnQYeì!T>ÌQŸÃå'6 ¶$T{“=Æ8ö˜'æŒâk2±oÐ6vhz3g')zF˜â6Éô—Ë) -5§9MÊn)*ÕgUzjA¹Õ¬°”™Ïþªî™\vÖóPŠË±CŽl6ØÓúöïo%Þ’Âûþ×Ë$Ùõq¶ Å®·Ë¬­$az#ÞÎÁ/b>ù{%^LF“¾²SÆz}ƒ¡¾˜] ndyÍ,¯žåéËVÔNH: 0º-n[¢ö°SÚƒÙx9š¶…ÈïEw… Ö`G ”¼Ùe¦À GÍSâÀVsñ ?ô‘J¨·öfª”Íw°OÝÁ.ºƒ}ÒLœÐšìÀÉðB~ÌvDd$vg‘Ø5u0}vƕ귮·’wVÚ-Ú-š-šâZy‘©µÖ­ÏêezÝö‚¢6 hà–05¥jùî(lj#ÕèjôÀ0$}]î¾2SÀ©‡$…L9פÀ†?Oãñ´xXŸÇ_Šð1Jßjn1¶ldWŠ!…¢¬¬g –æOÚ ÃˆBÄSœAì#œŸàbÍFNU˜ï!d‹k…y8d×·° 9É:éMº“XÙ$6¥ßÈŠÖœøáõ}f·ž)ƒ2 áB4Ú›ì$[ û‰„R™ufÊmâT—ß Ã 5wp(ƪ³iT\rˆ‚¦Â'c'#'9š~¸Ó±•8#å A‚žÙe²©•MeCkɃҦâ&ÌJ¦v°qRîÔ˜tZ£Óägz¨î”UÂX$BùØ+/¯ëŠm›·9YO“'q®0ßà#ÕW8ßgà:‚a‚~ˆ¡$q©à.ÕO 4%E’­‡ô%à]ÂW}8Wìéñõ¸¸ÆßŒŒr‰¤÷ûù½äxð]dªÿ(Ü“ÿ~­ˆ•6²óX%°ÅˆEÇØ;ðbŽ;4$ðb¬\„ocjþû-ÜÃ5™L$ <ʪDF–^É>Í^}oy]q[¡‰,{e9¦>fßy ¯Ã·|I¾:Þ³+±›ëª|«ßy/cçÒë'SvVm÷Xüt•ìæ¥UUmlb¯¾\'Ö–ÔÏsÒLJ³\3Å0NÒò6ØjÙÆ%¯ÝÃ%•€Î¡§¥”´Ùç’JÜÛéŠãë2f±gÀÙ3D–î¤üÐ0&•aRÓ®½l qáª~P+e°šô GÚ€ÕKGìYU ßHÅ!nOÎáþa%i°s=dˆ¸#®¾>ã{·…ÂGuQ^‡Û>ÎMŒtù›l9«™qJ¡$ýýýdßw¿—óýæÌeQãéƒ+ˆ·)Øå¬-fÑ9önü$ƒg¾ vcN-qO2GÇ9Bb5ÛÅ5,oÖíìU° zkv6lÕî‡}Ðçìuõvá›Nâßà«ßÜÞ{ ±Ÿì7~÷c ©SV…Íd%cLV¹(8öÀ\)vF¼$× •°ie[ýÏeÍÛ²²¦“•Öli6NËšœ¬é%#ÅÀvCãâÐHd¢§S6 ¿9Ä)›j”…E™µôÿaeSœé{úíƒÛ¦«Çuà¸ùšÌMæfNòBüá !pø^<[ì»#FA½]G_îýQà¼bÞïgÙ ²°g5TÖU§CÂ#ÄY  S©Ã(7wd’¡F¦'àBC)õF¥ŠøóÏ»©Ï ê «i§¤-¤àÁv¾9“GŽF;%¨Ç%»Éi´“”äÄ”V´ž2fã S Ð`o°#)%ts´‡Ø@§7“dzDëÏ‚²˜.ÉÌ öºË6±± šë lQFÝÏIçÎ@¶Èø†‰ó$¯’"Cª‘Ðí5{´tY6B=48ë¹6I¥&5›! "ˆ:c¤Â‚ÜÀmsæe‡ØÐæhæðb¥ÉŽöÄ\aR¿õbánzßâFÓå ¯@HÒ8ÙÙIJ)›Â† ©,µäŸBw(Ü>¼ñe>o’%}öj~ÿÿbù­è^]Oæî¬Ôô§ó8~./ÀAgt(ÐÕ}tôðá¡á»$ûÿbŸÒš #m¢” Ó*MÕ²34Ï._øL{mÃíšbU1lF¿ß¿ðK|A"ãëß*úø^úX]¹y³Ñh0šõûKEÆ•e¬ŒeUl=ÃxÎqߨo,zªóÔþ]‰¡hšÀŽáÍy?u²öÄIüxjæWç±áõ¶ á·™k±MÔíëñ$#}#0„¯yž½±{? ówÎÆ9rœÂÌçðÝþø¿ÀÙÍ#ëb¨{¶HÿäúçZ_0ñ§Þà ÿ‚?eZÁBÁQ¶ákQü÷>øœœê·ÛöJŠf³7keÚAfWÔª¢ëÊÜÓMªÒ_ÏàMg„{ðQBÓ×ó[JKµÚ (ÁàÕ{­ˆ#?ñÁp„T•±ñƒ‡Hùëî(dà©Åík[V4>U¿Gv]¤=Ôyǫ۷r{¼{‚×è%IØBé@^¯TVVÖªÜÒÝÇÀ›—ºŽ÷¾Üi/ü‘x‹ád^>×1ŸRr§µ?sW›Rü?]ÄG/æd–࿉tý–nIRÚÙêiB×Ùû ³Ïpz‰Rà}ìøŠác8ÿÆöó#Ç»Îtž…cèÏ¥ø6öƺÕíF—)KåŸÏÉuImù$Îò_b W¶NŸ‹$ëE†¹/±kXhMûþ}LHàòûÒ±‹©ÞØñÆÝä+Ç»ò ¶ãšÜRw¥ ¸ƒMá…]Ä–ÿr›Ç…ïá÷8aðFåì/€½ž¾ï+ QoŸ¶måçZ·ÁbÖ™LeëŸ-&¥v•ôÔCþ—;¢u»ð¯áWÇ Òù´ð½Ÿjݯ¢oùóI®hªœÅζ-#ápÅ53-¼óñåó8q>çÛ¢nGOúP\‘ÔÉëW©?Hÿ >|oû'Á®@Ÿ£a>e‘¥fY{‡˜k’T«óÛ¼ô5™¯àõb‡ßî úWJßlnFôäÖ‡þA¿¯O8ér{½Ï@ã(†’Âå[ž´¥$}éßÎâ"| 3 ÝŠh]³­MJ¾-kcC±¡¾k è[á¡ûªç›ôV«Ð]”›Ž+Öõ™Øásr•?Ä]ÂiC³±µév®«ª¶ª›“¦Þ]ÿîz!,]VýœÕd6‘kØ>üàïqzý‰žd²3*NÅ#ý€Æw4Óxl@<û]…IÕá)ÙdZ`;““¹ý„È]¶µa^‡äw¾‘Éf+×R3Ðeeo#g 3tG JõöqŒ?_ìí A7Šj‚ º´­æ¶؀آ#…Z/)Ùœ¿–£è…^í6ö>Úýn×ÛŸÔSt°zh ½*çu¬›l>LÞlHàYïpÝ‹x42@jåÍO—?O¢g÷þÞ£Ñ>ŸÏë÷û~º‡¡Áz¼p&ÙÈk_ ßûq/s2j‘ÇÊ]öCƒ}é^YDR,ÙR¾êDí1æ \ê?ép»8íÐmöi X:ÌZ$üª©xmÛzrðÅ!ÅØÏ{ ,í±œh€–SàצêÁÎÞ¶*Ë%ÍN£GlòZÃ$ñöìÄOˆ=)_7t¡ý…C…ôhiÖUæ5®”­”,QÌy¦šd>’ûP‡&ÒI²éŒû”.ekϬÈÑÍx_æi‘¹¬¨m=[(V®k}vM³Áb È);)†ËqeX^¥¨©¯JUN0[al$Õ»ëhðµØ«Éw¦íb§œ5¾ZwMdalap¡SkSq*tï¡ÄÀ¡·¼{ôPg¤3À æF]“±©Œ½Glî0uØäÄ…)(ê/?`|BŸÄgwïB>ÓHÀ.7+ԥϖ’šR1L½înOÏÜ#vxœ\ÚÏq(õŽ5B+¨kU²•½øPîƒZ¥^¡Qu`~3æ+0Ÿƒƒ!g¢~ˆV.E®’ð3„ rMM•E%["¶(,>¢Â‘’ô1HŠìò‹uâÅæ6ð)h·(µeò%der}2Á9ëwðV‰¹mQ_ - “Zšïšºe‰ØÕ”À—v ¢ `í®ü…­Ä/ ^«›“È{±Àxç+ãÌ¡DFTª+ôU¹¬RlÕ[t ¥O±n×§o^ vúlÁðø"l>à ÀåÊõ J–GŠ5+þ¡‘wKø[|àÑ;EÞI¿ÃÞ!2<ÑÄ^±4·MÚ ¯³¡ÕmÇ÷2‚þ¼cÑÄFÞ{s(à 8vt6µ.Ÿù¡‡Å™/Dè\æ©ÔÌLÁiáNâÿ,2ïª'|åñ–Vp›b8Ýß#¡öò ˜_.a ÑÐdlÎg‹Ä†&U4#E@£Àßíê>Ž›Äñ '¿|“¬Fô¾&¨ƒgjžhYªkÕ5C 6n«ÛF_‚‰#‡§¢Ä!ðrm!9˜kM2$œPlnY¿”s˜”§ñαàhd"´5°ÕÛïí‡tqÃð~7UVlâ¬ö]Nì'É™™¼óB)Î?"²SᲉ–í„?Îú ç~ûzÅG1ù°¹²ºÜ´³*Màû<){¿km0“ È©îãd6áº%ÿ+ÝÇ=ÿ½î£ÏáÆB±+îŽ9ãûpXd)Õ•jʤ‹6²9ÚØxrœq &[£ø7âà˜§kbG25Ü3 ÈKí0…7Ø+lAf1w'äÏçs2s~%d8><@NmìYÇé€,Ÿ»òñæMxsŒF>ÿëZÈ–MËëV˜Ùvb7ø?ÇO᫽Ùâ4=&q²é½÷~2Õû,8…×ÎÉñ·"u:o°€~Š+Ê7O:Ñ"ß®«Ìö;ÍHÏȆ&h#éi—2Ðfj7¶/e{§û\›ÛEõ¸{;j¡%Ô1Žº{;û;5á&¦Ö¨n"g±úXý_gÿÏèÇ3þ„/sØ1~Ñ„8d`h3dà+W.'(b½jï8§ºN$އciCÛÚ¶¿D?U(6Ø,YCf¯È§¸ ŒFvtÙëEq¿VÎ@µ¢FSÛ–Ûø<Ùðâ}…oÐ{a$90Àz÷šZ²jÀ‹ {ý!N8é«™ªs9™ßdrpªšD-Á¦úº¦ç_,ž¢eÃD†ñÑáý&í&Í&í–Že…Ð ‡Ÿñ”³3 )ÕÆÚ¥-MëNªÇèoaÏéþ(YӯवYâu¹ñó˜BØR][~+òNâMïpèàn ß5Å”íf¹ ڲſ?Ù×{pE¤œÖRìÕ*5û`;æå.a"Mž´ÜíLmnƒ®@W®ß”[Ø¡jQ´£K†Í‡Q@#þïPòÛñx“,ªa°±Vd©ÒWé«¥O•°‚'täËë÷Œ0v®ÇìÇ·‰ƒÇ&Ξô»‚äLÐŽÈúò¹1Á¯NA^ŸÈ.ètFâ$n=‚˜6ÚÞ mnZN7Hïƒ]éÔŽÎê¾²3ðœ:ÓwÎůwR†èPš5òõ…Ë–*•Œ³MûÓ¾Á|…8r<õþë@àº)NÊ‹LI ÑÓÆû}={VGKéuP_S[ªÞ³¡o</,m'TÂ2¥Õùè8ØÂ®@òÐÎ ¯Úž¬.#øG[£¯o`sÄŠ—$? Ryå^n#½±–}®¯éšj~ã³»r2ôa‘§b¨™€TH£QÔ €Eå¥ëÌf#ÇWŒn3­¾€Ï³}àU;¼ £ò4Œ爻;]qûg³Ã 2ÐÞOò†V뉓 C‘Oú^+öô† Eu!9]ÆfÎÙýbUÞ†ˆAÌT¡b1É»?ì~ÃÁ)¤>t¨:]B/…¢yšŸáßÐáY‚ˆÕ¥TvÔiªÛr›ž‡å虃ÿ@±Á¡‘€~"…ëHvºWЬ y)W‹Í ÷46Ž•ì'l)þMpl ¥ü Æ·Yú Œ zÍݵpø\~.X )ÝZ¹±™ÀC³EÕ.k—5¨ šcæ4r `kjÆÉƒiWý` ¬€Ú§yV½™ ~¤õZ}t\.‡ÏÓ#팟%e&îVªØÜ° JÐÊ“-'éQâÄ©©ü:uÙ#RwÛ²¤"¡ì5öÀ1xy¬w`SO厎|ëqLVÑŸ -M©œ -9˜:­Q‚Ÿ!áNº:Ïãdö4PTP’ßdÕ·™ZV± qÇóK-!.ªd`Gx{`Û^üÂÔ§m1OIBÍÐ`jÊc‹IA´JLReñÚÜ—¸3\¯=0Ê„ŽÃ©‰Cá±ðlGÛ+ÓeôóP¾Tº:k=Ò¹-\+Ô‘rÅ"»zÏìçôóÕ¥uh8„$3HL-‹JO¨ÌÓ6¾Nôàpß.Îs~ÿç¼k'#ñÓ™S»²&ñËQER:`è'&98<¾Öo§» Œýïqg ˜<æò õ œÆf±“³ˆ† ÒI²IÛôM?3àè´÷àç¹s¹>ª&,°Ì6å±%b“”3 Y¥U4­Uåµ›³¡ "f œÇ’G;Åv‰=1w âhT~` IÿùsŒ«¦Ú·z¿ÍCw‚£Ç oï9{ó$îºIUGµ¦¦-·y9¼€-}•dïÃ#YÎðÝê'A‘Já_Þ{Û·åà0ùÒÑ~B°öÖ o¦Ÿ†’‡4ù“w“ìF.æýžXx{ß)â­¡€–Ôêe®QQ¢Ú¢ÞbhÖ7A“ó¹Ýë_ôõWŸþÛkë<Ïh©fK«®]‰ðõψ Ï7°×> stream xÚ¥R}LSW}¯ÚG-(̧›Ã×úµ¡"T£0” † ¢ Lœ+m•–ÑG+jWâ'ø3ÕDQi›´ –ªc¬_2‚Lݘ:Ütf›sY¼¯^MöºdÙK–%7'÷äܜ߹÷’ !H’”eæä®\™33-kż ŸSŒm/.¶‡òo|4ÉOñ,Å™H$) ñdt‡Çqš¡š("„$inó¥ò8¥2!ÍPZQ¦-ÖpŠ˜¢éŠÙ‰‰sc Je¢ba‰ºL[¤Ò+²TœF]¢â²I‘k(Òª¹ EL²†ãJ“âãÍfsœªÄg(+^0=VaÖrÅ µQ]fR¯W¤ôœ"[U¢V#Ç!ÍPRZΩËY†õê2½T<“PŠæ‘ó -QB„Œˆ$¢ˆ×ˆ7ˆ K,&²‰eÄ(‘p¡aÓGF‘»EcENÑ=JIÝ Éæ«"Sܨ·õ¹H~BÅ¿Ì :+®­ƒúúr°ÈñYä×BÇA¹…Å~ì—XÊãê VŽ&¶@y}=ÔÕ²|£©1 m$[¢ú‡oA7x^Ù¯ëûèǤº<ÀQP8Ëb(N­Ž|È´½å·cá×›/îÛÏ?k¾i{ý4æp?£…t‡i¤²ÁE„¯_vÿ~»¦>…Á-.å‘òÒâS¨ ­eöVŸ£öZwÏeø‰F£ÞþGbY²2¡àôÎZ÷IûçWƒ•õÞh8ô/þä¹r˜’š‚¥8Gáq¯[+¡Êh^.ö¢ŒÐMâ*óŽÕÖÍ»v¤ÀV qº8øl'Òãd[7ºržB? WL—çúy¸M?žÑ7iNê,6Õ6è¦ýÕ×Öã1y¥©Kc¢–"~vïzµ­[[{÷Íé¤qü#Fï4z¡‰îüâÆí¾U‹XX¾¦ GO§d1û«‘x‘³Ò±ýâFXF/Hú01!åê0 ßtõ ž¢ÿJsòép#-$z„<¡øhägp¦UËYäÛJO¶í·ù †>Á9úJuF׺ŸÑD4E#:Š%CS±tR<™§³P({δ»@ã L!èÝåÍ\³ðå Z=- Ÿr…ðfÚv» öÍ3¼66z‰Â;PRÙȧtŸ±»„Ja›üU˜x›Q¨  ìò@8Ö0öc‚b*‘âmfA9&(È/T‚hC2D‘Hz‹BùüKÆËytú¹¯éx“Û{œÅ3p6£“ôÚU ÇNÉ+,au’Ó¶.°ýš„nHï9pZÎ’ˆa‚ã˜F… !}pQ:ÔÅ|§éÆ$…K·ê+n®p-†P˜þI)½÷‰O« ÕI®Ü)¸;þv?ck·ÎÝ—X¡]Ž2%#wÎõöþ Åÿÿ\ÿàŸ¨%C¿EÈù½ºs2kÒ¬ÆÿíWík—þûH“›O³#CÍA·«K|Ò¡Qd²!‡,œ•†ÌuÉÂÐó±Ú…p endstream endobj 352 0 obj <> stream xÚ]P±nƒ0Ýý7¦ª*ŒQI„ÔÑ2T%:û –Šm3ð÷ƒ2tðéÝùÝÓ{Õ©ÒÊCôéŒhÐC§´t8šÉ „{¥IÌ@*á÷.T1pK¢¢æöÌ„èòQ—ç÷Ç¢n¾cút»–q »r-ÛûêỘǡÒ,#Ñ×¢8z7ÃáUšÖÙÅItJ÷p¸M˜4“µ¿8 ö@Iž¹xó$ŒÄÑrŽëIFiYYæµü÷—lm'~¸#Y’.Lš$/9ÉÒ·3Æž|dÓcÐØÙ«Úšû[LÎ-~ÂqBÒÕ”Òx¿Ÿ5vÝ ïqþ endstream endobj 354 0 obj <> stream xÚU{lSç¿7Nìaºqú¸6›D£‰ J)] á1A`å•´N¸ILü¶“ÄÆvbû¿íØ $³C(KÈF†Æ£b)Ó´›Úf¶Cµ«TiEßu¾„ís,Ó´&ëžûÉçèœßù}¿s.MegS4MçÿhýæŠ-o~Ýæª]K•éVëmŸú*u4GXH ‹haq–P$ ²Ù»•ÙÿÌËz‘¢èÁo¦íÁùi[ó b©…Ääf}‹šOÓóžýÎK+×mÜö6·ÿÀ{_¸z wÐØRkäLÎhä´¨4 Neâ ³gUs³A0s4ôfƒº¡Ñ4{ÚW«©Õ›ÕºzµNmjã4œ–Ó™t\ƒÊ¤Ö댕±±Ve Q:U­F¥T.+V*K×é›ÛfS(×)––•­\¢(U*ËåZΠ®Sé›U¦FNKrÔ©4Š*}š3µ)¯n4™šW•”˜Íæb•ÖX¬74ü h‰Â¬65*¶qFÎÐÊíSTèu&Å•–Sdø*μÖéµÍ-¤Åfý>Π#¬äQ„ŒgèBjµ„ZJ¯ êéý´Ž2ªN;B;ií¦yhí¥}´ŸÚKÕPÕt€zRß΢h*›*¢6P7éUôh–,ë=+ºÝ•}7‡Í9+®Ä¿-yUpå§Q{’¾- Qjj— B<ÞíòéÓâö60›a@žFÑ®‡ô݇"´ù¤#ÆaÎhÔé†##ÃÃ#,II›ã4Z$˜EB!:)Å{ÑKÌíµCááÃ6«^wÔŠöâj&Æju»ÁQhíµõ²aðzc1´í‘¡:\çåC=A(Œ…#Q9xÁï ð^¼ -ÝumDeà‘¾@Ðãõû!ÄDí k§Ójeüb''é'IÚL$ 19„µo»Îñ¶Jíë`g,Qˆ°G<‘øÙû“÷QÁDÐç!H½àå½n/ï1GpÖ…²¿íDŒ3âôX€±YÓxí£¯PÉLŸÀ?–jGÔõÿ=3 ñ¨îçÆ³ÆíMZƒÙÌüÖ1¡pŒž þ  ‰„–îø½åˆæxÕùªÁÀàÜ58 çbÉ$‘¾DŽ$pû³K¹úf¬ã¤a¢f¢í 0(÷”EÆBRŽDX"ÇxE¹ûUæ]µôìG“_¡`^ýîÒ¢õ«–É·B͹քá„éä–?3ïHkו/Ä$`ÁŽÜûòæ_?•_ƒóªDëñæcšß¬&óZ\—$79»~Ί„óÿ±}V‹cè9$ù- ”OÍi©¯Á/àgñr¼‘7Z#G¥Où•b¼°ä zŽÉ¬ILÍ'{I.8E©9©2i¸ŸìcBÝ}¬\ÝŽÎé332{'¹@cYúØø‚¡~&_pa_B¨Ô$æ¦ 3RH¾û;D‡²‚dÔÁÊ.åN¾œÁ%°šêö7ê8w ßÃ;Ð ‡ƒÐËßp^lˆîöYIï–€ š.rg´7¬gÈY½$Գɿ{¬ëŠ+B Ž3¨^ìMc­ ]¯>|ëØø¸öUcBP'2¨48W u6bÚ‘©ÉXÓÒú;<¸äù„AÕKþìÔÈiï'ƒ;Smƒϸõ’+š©FPƒ±=§ëNVôªgµF–È,úß:/5õíôÙ2è ªêpûXS¢uäðOíe¦†jØÊA5UEˆš›¡e©)!³ÚÚØGË%mÐÃà ›A?'K¢º6õŽôèlhKû¨TrZÓ¡GYôÖÔËÄ“H'9Ä>z…xÒI†Ž<•dB( ßíÒ@gàpßãJ¨'†?ŸZ+ëp…º€±ÚÒ ‘ hÀBT7¹?‘ÊþN%RER¯Ï?â=&v¦Blây‡œ>‡×…îͬ”…º|Ý0ÖCƒ§r¤Â1>1ýËœ|ãpj ù¤<•°s²WÆórCys> stream xÚ]“}T”uÇŸ™gxžŸ0‘2<’¥ÏckÇÔÞ6ZKcÕsਤ`å (ãÀðÎ 8Ó¼1w†a†áEyof` + ¨,uÅÄS»mAÛº"¹‡­Lý<§†JÿèÜs¾Ü?î÷ÞϽWBÉd”D"™¿cóŽ[SŸLIHNŒ‰‰™ËýI|„KÅ%´%#¯«‹™ˆ×…,¡(êÈ‚95<8§‡çÏéò 0û"(Z"‘-ŠŽYýÔuvnQaFþÒDõþŒüœ¥Éêì=9¿KRA›˜yµ€Š T$ÅQ ©(ê!jõ0&¥$””rR_JöIåÒ"z%m áBN„ÿ$Uð%žÙP¯ääpç5WÏ®æHrž†lˆð&ÙŽ“ùi¸|ÖÿU×Eû8|×+14–y2¥k犈ün4g­…¹@ æ¼c¤vdäı†vg; é"+– „fH D›©5¾fÑ¡ ‡˜± êÀm­C¿¶cóÏÊK$¸ò_ôÿÄNɾƒ®þVt·žMÛ ÉüA%žñ3Z(·–JͪÄë6×Uò% {M«KÏNÑoƒ{µ&Å¿dè.ú†¾)öp­»ðvÐõÓqk… öõåÏ­ß”°aýC*U¶R¥Òë &(G¢Àzñ¦cÊ1§—k ¦_¬1YÖ,Pz‚ ŒÎŽ…„9:ú(¿Vn4/CVÕVÔÓÓÖáéËmÎâì³ðÖÜ7"ú±díw8ñ›çn)NâpñŸœïäpË€Î÷ïM`Kö_þZžgJ®µ#­»ªŽ¯g¡ÑÖHqå¶ïëkݤZû:Ò1I°¡Kuõuvø{óÛ²3˲sHŽÚóo,Åì§xžàfÍ_?s5¶)F¯x. à 4E¨Á5ÏjÏjÞÀÚs[5@ÞŽvŸ/¿5G¸‡GùÅü’<:ÿ™â[/Žãp_³_¯[Å+ñ)¿ŠM+ÿò¶ÿQq7Û`q—ó:0X úBU±²èПIØZ¾†„ô#T‚Á¼Ôçç7°K¤CîÒì}"^ùUO‰äŽWMÑSqÕà°Vò´·{º49êÂ’C˦žý‡aúæî<‹ed° ÒJ3•ogß0t›> stream xÚ]”kTSW†OHrÎ1‡£ÔÒë8Ë.]±^:ÌH-¥ãePG‹¹…p Hl“ùrãH1Ú¢„HKë@­¤@-V¬u\c­kÔåÌT¡³f܇n»:aÕöG÷ZûýñýØï»÷ó}[BÉd”D" ‹‹ùÓ–˜…›×%¬W­P©&kËÄ)12H|I*Î’‘4r#’îù.VþEQGgLªiú¤ ›Ô¡Ë”T"‘½ðŠjñÒ5ZMn¡.5ÎzmJj~Μ­fOÎ/ŠTÀF5…¢fP Š¥Â)ŽšIÍ¢"¨¨ÙÔÔ JBQVj\R$Hã¥ÿ“iå å#¡?©Ÿ®2´LP-’â¾'RÜ5±˜[Q¶Zöª6Þ kyÑKÔ8¿Ý7âH<߀³É~žüúÙ<Îzªá0jg Ïv¾ªÏÙ*´?Õàï®í†vè8ÐÓœ)ìrívî‚Ý0¹÷Tì6¿f 4™(¶t—ŒüÐ~Örý˜ÃÙ¡×O,2(pÃ=¶ OŸp{™¡Oèõ gU ìË]evedbs÷Þgض¿:äx3ÍæöUÈ;Xõ€v¥¹Î(Åæ˜I8ÀÃ;%Ʋ¤¬ ¦MðÜÅöPôuJF1…ß—â0±•ké¿Ô<èúƒ?¿¬"QE¯ŽÛ¼=a[b’ÑXt Ál3‰oÐ>¼QžF›s*’‹K,–bk t:Öºba¤ÿú…Ñ #ç¿€ÇÿŠD^"²ù$ø-¤{ ›}'¼¾–¼z ÿc}»HZCXŽËÆWb);Ž#Þâš;FÜç]Ìy] o¦ÄÄwÚêÍä4 •è š}t·¸Ô%K”ñ°Ò­þÈ_UçftºÀ›•Rœ“ÍÆŽìú}WíÂ÷õÆ«ŸÁm¸ºûb‚¯Ð{$ÏØñAßßý€¥è_dz*š„k•é54ù<ÞÆ“E§rž‡´uàbVÇă×î²ãâ(GÑiæt¾Œ¶wíÅrÆã”?¥o–¼ F«Zcÿ@yOé$SÄÄI FÞLë T÷nÉŽ?F,!ÁËÈôE„±˜ËMpõæØG¸/'ß3Ïû±M¤ý8ô¡Ï }¼·{ÆØïp–qÍÞzß©¢YZ>“ȱ<î[< ϼèJ´ð?D¡L‚cj:Âë™Fsƒ¥±ÕÒ·ášwèŠXPƒìŒU0»L€*袊¢²bKziZyl‡m‡ß®5Û-3 Jš}j³ÅjBä&í–#fä Ý ÔÕg:?ª=è¿õs×,ÕÌ%¬òMXך7€~ÆzïñK†¾Å­cRü[ü5g¥á†p»û“¶ûýÃàÿ!¯.¿²Øù(¯¾àŽ×Ù‘ƒ¹³ÊKbÈl²Œ¬ãa›H?_Ý•¢•·Ñ®&繺£.WU°!Ýgí=ÿWhõ¶;R_Ÿ›DÂD ŒºÂfÞI79Žy ½ÏžV#ÿö¤wørïpuuõ{pª¬U\䛕Mèg¸ÏZCCÙ—ñ•ËYÃì}œ‡rÑé¿ß‹A8|–f3ò žÍÃøò³«º{k°a¤n!L“íQ‹IHA<ün`çÕL´ˆ$rì}pZà„Ï?¸xÂiw9\ €`®ªÀ’gó» „­H5?ý|¼Ú]úuàÄ“"Ë}y¯iøÆWêh¶«wæ•WZ*,€¬täÖí¯6Ôèj2kÕs×OÙÛSñòÛ-ât¿bh ·±½b¾ÆÙhd ›È¾˜Öس\ºz¯ëý:ð"Öx²ø„&O·?ƒ71BÔ]ýÍÀc® Üï ¼ÏSãd²ƒ„°d ~<‡*ké+ði—çªÀ39(µ•A)21åщ+U ©õí­ÖžÅÀw8l»6Òåq7 €õ,]¢ ÕcŽa­ÝÝ@“D`ø`iͪ)BH°-dêXpßT~uæÖ„YQìáÿ¶£» endstream endobj 360 0 obj <> stream xÚÕXit›Õ™–âD¾@JC„Z Ë' ÚaKd¡…†8ûæ,˜Ä‰—ØŽ—x_$ËÚ·OÒ«}ß-[’-9‘xIì,Äu6“ ”¡ÀPJ)0¶sE¿Î0WI t¦çôÇüšsìïÜ£sïýÞûÜç}ÞçýجéÓYl6{Ö†M+ÖmÛúÈ–¼­«ç-™7/ûÛ3™§Y™…Ó2‹r¨×Lÿfæ´Ì§?̼yÏŒ¿,žq/‹ÅþòŽìsì‡Ùgjy²þ™<øÉÙ¬{§±Ø¬[Y\Ö=¬‡X³±žg­få³v²ÊXµ¬6–œ¥gÙYVŒu€5Âz™uŽõëÖG¬ÏY_²§³¹%UUóçÍ[°àæ`áÓSƒ…SƒE7‹æM žœL­ZôÔÔ`jù¢©å‹¾]¾xj°äæ`ñÔ†‹çO ¦v^<µóâ©Oí¼xjçÅS.™ÚgÉÔ>K¦–/™š¼dѼÇ,¯¯mhm)oºo}}YySÝ}«[JöUíù¿€s_eýzÚ'?üV†Í°þ‹ÍbÓl=ÛÀ6²mb›Ù¶•mcÛÙ¶“íb»Ù¶—ícûÙvb‡Ùv';ʺ;{/ÓX_³OMÛ>í£œÆéC3ÖsîË]Šæ ÷o¹vëÈmÜvmæ‡?Ø}{éï•džÙÕÜøažøGŠÛ¿N™ú¾f÷™„³¹ãXóõRžÆ@k@ƒT‡êætuÅÐèUFs÷_øŠ ™v3 š£”:&Uç0…c–£€bœ˜1nˆ²rœ&‡ œÈ­´¨¨&N›Ð˜BŽ5ˆïÈÐ|{9ž„=§”j:ôRfÖ_Õ|e¹©:’#ÅJ'íŒZŽ˜F! iš¬°qf»“lìQ˜U”#l2°­|gÆÃ÷ô:®BÞŸÆzÅׂÖHúë9zЃÁˆnÿ†ý—§RÆ3sãlüéYž‰c+®„7¡ó+÷°Éj¶¹Tf-Õ ¦Z¬,ç• zmÖÚùZ‡ÑctA#îHœÆ|‹Ûê1y97$ñtPBèh×·· ÔuVÀ2Èϯ.)ÝÖ°V†ðÚKu>Ïàƒ18³?zýx-Ó˪˜{ø’MÛ—¯ô¢öbJ`r‚Ëä´&½ŽÞÀÙÈ…±Ã¡@W°™sؘØUää(Ù“|z¥ìÍ̉c»ý›«¸ëµ¼ÿ+ýޕÓoØ/‡ºÏöÃ~䑃†’€H%Õ=¶¹U±bÕ²¼jæöÆ•%Òb(FÏž\òž‹sñãø®w ?œK-‡µ%…ûwó4«*˜zæ~@/UžørÍ)gÊ‘Œ¾?ŒgüÐàhíZ‚³ö[pqM?ŸýÅUl¸Ö8ÄýSæAlä O$àzeeb#`æ<À,øé+óqÅÍüsOb¶NlïÛãGy<õÒ—Ö.´i÷Ø;cŽÑÏæ¤'u '—©GLëW<«Ë춺’WΟ÷O‡&$;°âQÑF])½J!Ë™“ó \Ç…Qáì/®`Ã0÷÷ø“Ìs·tƒ€y-z”Äð|>rhÒb5[ÉíÛÔ>%¥œÖíX[–(¿õ̉cÎs lF  Ïð£vü÷W§¶¥ (îïiÐeYÆÌe6òº/õL^Nøl«PßQéO˜õ?ÜþÍô;ÞRÆ›ðÜÏâxa|v†óŽ]åJpÎ/f‰†¡…äÁÖqMý–‰Ú_R˜ øü#/ž†0›£#T¤Å•Ìý|ƒšVŠd©ÞI¥9~°Ú,¾ãøE¾Ùerxýž£i¡›¡ =sä)<º Œ½b±Z­&a©KéR‘£©%uIÑÖš Z$ç”ÅÞ@Ì·wû/E_{ùX¢{$ HËÜ Ít[Ô£Ö 2œ¤ç¶&·Ssà‘EëÔƒ ÐO8®´3Mþûùf‡Ùar ˆÄ-¡j@S«m©efò “Fh.>®ý-“cGjÎbX½ºr^G“ìD†\µK夼` Û]=¿<=yÐð`Å÷øÃ™BæNªê|²žì…^»»6‹àó¯³ñ¾SðWô‡÷yñXW"Üáoß+©©Yùêž·>Á÷ÅÓôØžý¥Ä>¹˜‚³èÂâäj5äÕUnÕk5¤öj³¯ÍÞsl"5AnlXQ*€E½´c_YìTÎQ©h¥À¤ð‚Ðewtø¤ló“Ë·>+(‚maÅqÙ´e3f(㺶ÌóñÙxþ%îÁ̼ ž½|°á¼ѯ\#DX,„ZNµMEµ4ëeÊ ñªr@íš®â‚þEìå›ì&;ØPPîí êAÙ¬m]ÇØÈUzu[IQÁV@*În»ô‚K©×»^qv¹:!†ŽTÜM-…ÊgDùFA :“ÒitB“ŽP`8>~Ï©  EÓªn“ì‘”ÉKUµê}Pƒ¸ ËÆw^¥F ?˜ìq:äïo4®ÂOgÏu³¸‡ÿ_­îm^FÈ#in´Jíï9ÐÛê·—mº*œ…7ºc›Åvd×95”Œí:ân*ߢØ5PniîÎÂ3ÓÆºYELXĦ/´Âvª… „Âxñ„ê=è{ßwÞd1YÀBÀ±h¨f°vè¤Ê=í+vj¢c¤4öySЇ\¹š‹Kº íÈ”ûÚ3˜ÿ/àíTµè„ЈÄÞŽ®dgOïà¾Xõ¬bnÙ^¢Ò(5 Ú–ò&!…ŽU ½Dm†æM²BU5ßHt@#…Óà ºÁµÜƒ—ŠØÛÚP§ªÓÔm` |½J¯%¢sÍ~µöƒ-éL¤ñ=|+©ª–`öŒsÏ÷eóí.<ŸÍ-þä/ §‚Ê`KeGuuu°rX€ÙБ‹þ±ÐX×H8Ý3AªuÂßÔ,€6u›N´—y€¯mPÖë‘>wOߎD‘ºßwŸ2="d°äÝ$‰‚GkÀÌÜ·…TZúF¥Õ¸>‚C̳uàŸóíQg7t¡áâÁT94Ö ë*¶5n®oÍ“/ZQMDQ¯)¨\úÎlä™ðir;OeuŸ¸›ñÌrž8¯}E{žh™ìñª4×gK@áчQ"í IƒÂjqU]U¨|TpRÑøè„çµÐåð›|«Ïê7û‘‰c/u•:K}«¼+}«, † ®ˆ+pù³KŸ_øÜéu{ì>2nR7i›³R­iEF!AxÇ¡ÒãÔUˆ~æ5ÙH±!—Òª¦DB½T^&YY" £†räBÌ·u_ÆQ¾Ùnq‚¹f5¥àp£:И´Ðò:¹ø…—?¸bŽðùGâå—øÜq:h áfÞzÚ°&[dØ™ XÌ£•…A!ÝBâÑz"M®ckÿ¾c€ìœ£Ö®c¾A{”oõ:ÂàANÕõ$65Òe¥xÍ^ƒ&h#{.ôy8ûNcßì´d-^Pê•P{®T74Í%*Z%©€ë8®ýž4 ¡G+vÂfhÙ$Ý­Ú;EK•ƒvQi ñýg!v±YŠ”¹ÐN·ÓâÌ~"„”*¸à XSŽža¼˜Ô6p{aÊñ\ϺO¯âЛ97Šùý’9Ì\`f¡ŸÎÖ<'?àý3~ðíèÝ]3lêW ÅÓ<ÝxÿÊ-Â}âZ@;÷=#ðæÚßMbÎ碡Þ@oÖdŽwo.mÌ:¥€Ù—e*.æàž ›g8Rr –ƒäéö­Æ¬!²ÓNª h¸…²yµ6w Uצm[Åtó Ù¢`'&ÂÞ‡¹D„ì!sa/vóè¢r˜ÙPhª?‡Ln«ÛìJã{ùž~"Xéhô@ü ç°Ö·*@ šV”Ø?bEÓxncböo¯r_Ëü,ó^-Œ;|âÎþÀ$åÊÕž(è*±ÚÃÌanaaîšwzéW‚kðöÀ±Ó6igÄ8j§” iÕ¥»WWmTT–zSƒîaÏAÄ=½vòß?…^èSxëÉËsV®çNqç<¾ãœÿbN&3¼ÓùɪšuÍŠ:iKK[óÿQ>e€È¶½ÇÞ•eTøÊä¿þ*˨!W%aÔéUùN&ÿÆlåÙip¤íñq\ývñƒkЩçÇ”ö"*këòÚ6*k¤ ° Ö¤^‡¡×Ãg,Kk®Ñ¡¶ª‰JA‹¶]RܘOJ˜Dë÷ àhïÉÀHàxôe˜@cͧQ/À®ò²7K$³¶ oKdJ°3÷ðÄÏU/Y^*V‰´B¨ƒJŸ2Õc‰D¡×»Å€ª%5 [^®~E`æàYð1žÑ‹s>Á QsVq|*¿ˆ˜AU³¶e=câK·ìX³†ôL’Çp.6ÙyÚMã:ZÛ¿‰ÊSWý¬cûMÑQ;ôÊÆIà»Þ²Ý ØäRTuT+öµå7m€õhù±‚w¨Ã0IõfCëëcŠã€Ÿ…ì%â鯮dš¯ædÎÌá9¢T­o‘;ÁÌZfúʃO~ ‡ƒÉtڨЭ•äñ;ÄÏùÚežNK¨:Q@jjhklxñ¬d"…s¯wŽw·DZ³Ýçä+‰ôÈDê ¸‚Þ¨øh>U{öÕT›;mk§÷ŒóLà´³×{x"ЭóËE:±Ú0(ëL†{c'7‹)%ç1Eý|áÙJ¾A¡—«æóè]eŒ‰™IÀ­I €´«f·û¨cŒü¿ÒàLË[~ŠYÓ†·&2K…lbñ•9™GNðì-D6œœ°%èò{Ñî\ز£¸´ˆ¦µ$Y‰10kmzQ5$h?÷ÂèöAšÔKÌ—"Ø946-é_-´RÑÐXU r ítÙr!åM;{Ïc©—× &áùuš4i[Ö1¾lûŽ5ki9;Ò„ËYkéêtvB7:VÙ_Lýv/”o5èˆêëÌJ¢VÐ ¦^[È?Ò52JZ{Žœj³ ©s¡¢½J^%ÜÚ¼6£å' Þ¦† LƾÍ÷› À“\“ÜÑÌ ¼PAË8LÀ¥þĈ]dû¥ö˜*W òkÿI“Õ’ Ø­¶*)%èõzµ¤D¹ ð»¯ Äù‰ Û"¶Ð%¾Qz]Æ ÌÓ{@¿KÛXÀ”ðÛW,Ï#Mê^e:)€!ß{p¯ùv®Ô-zPµh›^dödµZ¨Š‹^ÌߒŤÐ)IÃ0œIœL¸{®g=—>\—Þ«¡,O¸Y¯Ö«j¤²é\$"=ö``$11 (`“ɰ³¡PZ$Þ%)„—`sªàC%âŠn¸ëÓ0ÜŸÊb³ÎÄÍòbÛ »üä…Ì»/çd]àvô7MÀ8’1— Ôg91Ýÿˆ#=ÞŽHÌ´…! ým)èÿ»L‘74Wï#LÑ[uAä$Lñï·''±î&6àWz¥fDsj@Û¬nÈg„|Ɇ•Ï-T¡7A°KÌÇŠ"®äoÝè¬õ7šyöÍ›¦q·ŠjÚ‰¯ÜÚ|êø?ö•×ÛªÌÝñŸ^Ï` Ϙ[ÚQÞ$Ú#k’2Ó6Nu&ÉhwRp³6î•ïm(× ÎÀÉ£±“®¨¥ÛIŽžé>æÐ‰èvbíë5P‹v%‹.P¯Bן雭†3ÛjlI mã«öŠ×}ï6t£ÛèÊúûý^âïÏc;ß”mͬ¤#sêl2Š;NEGÛIÒ"S;¬€‡„-Ïd™:´íJ홄ŸÀ¿àe¿fêeM?å”FZ¨#™‘ ªKìÃHz’ÑhO¬ßÜO®¸-šYgÁ-ˆs˜bÈ¥nÍñ,y‹cæ­¦™·}uë‰Û¨…âZÖÒÚüÍÿ ™›Í0 endstream endobj 362 0 obj <> stream xÚ­VipSW–~BÆ\ÀÂð‘zŽÉ 4é-4ÕMž492eæ”ßO•f,ÈøvZwæ¾”93•d«c©k#„ṃ͟5ZsûàÝž]€Ø¿ÉeTûÁÁ´‚Ãîhíûæ›ö#€ðR»óm¶˜ZŒ-õ¯ _!ÒCsï/„¯wÿÑsÙ}Âæÿâ^î;Ø‘ÇèÔñ- “A\Ò°»±Ð¨æU¿2SußéÃwœ“Ÿàc¿æ¦¤tô•ZÂÎc_e‡XQnœóÏïâ~,泟°<ºã~쳟t¼rÐeçRÓ´¦yÒVÑM›d+KW×–nÞ¨¨å½Ï¸Ù~+tƒ<õ¥:†Ù8ø»÷¸¸;5‘ÆééÍ›êçÂ/ ®ÞrŸÀ«ê‹G:ðX†@õNHÀéðçON Â@·d û]zT@a¡PX¾thŒ$~+Øínß…‘ë@nN/b_YËfë›õ-šF²EémŠóÀ;ûÒMXÇ›©—œÔ¦{Ü~v9mj ¢Må·CÐײ;ûñ\WÔwìþPM_åeB~&~gãy¶üz)³XΫUì,„ŸcKè\Åç­ ¸ÁóxóÃ`' ³ÝÅ;8(e§å6”ì-ÙäízÉEüv¢-Ÿ½Èéé‰õpñKXB´$ (yŽtÖ»÷0¨´”*–$´¢á‡ƒù18j=Që6¹Ì­€|˜huPæmñÔúʈ\2³V¿Å€¤­®GV%Û¾Ö£•wv=Â/ ÿ!â6¹u|XÌzU}É6õj²{ŽòÃnú¼÷A7 Ñ1wØÞAˆsY;LÍ‹µÐ 'ÊõC/ÞÛ›ZÓÁÁñdºàWûÍ¥f½Õ¨-28õ>~ôœ#¿ÏÈv Ò¦²™­M`‡ÃôG®û˜æá`ºCì¨tˆœeîý`FÍ-Šm%ÈÕ­? ]ãOwÙÚáQk—µÝÚim4v]@ *f X=æCkF'ð,q«K-`Ð딈m~²–Æûðƒì3G#ç­ìåŒN|ÈÅË~CkË-Ú•€dj+}aRT:þžŠ§ÞšþÑ aÎüœEl“™zzG9½œÔ3©ïißÝû;@Qͯ±)ˆ-R@bU/‹3²¡ÁN¾ -ãð;˜8©…Í&°‚ɪ¶šØž ò´Í›€$$J£]`: nêì´u’_Fv º,¤"žwˆYB€\c2RÛ´L¡M"Eá±ÙAü\ª‹‡cO¾÷4Ù,>˜›Ó&åô/Лb9©·SÿF»ãv_ØÑjïBžtTÿ÷ (¡Y»ÕªãéǤÚv¯=ÔWñl.›(¨ÿÉmb'V«^–Ǯ晔$`+2:t>¾ìnwäœÓÄ èXz˜u ,z‹Ž}þIO[nV½¨JK €“é†Cö$ôÀ![œ&1 ZpÛBêÕÛFØ×‚ˆ „v±Ceƒ0¸ì­v‰á„zÜŠN~ÆMÍLÍ eÕÝÄ*XÄÒ,Ÿ¸ð„;»?fnÁû—Û£þå}pøÉÈ‘àGàD.³GÃWÕh’I~.©©$2tʼn9¸:¼ý‰xžDäž3ä º»H¼íÊ€œ¯‘ÎX‰6²~Ú(k“¬¼¨¤þ Å¥S \8„'uï»vvð8 C¿Ò3`´¬&‚sÓ8N|à$çÜMlábÝè|Ú$:‘×àÒò[àuÔ¢!ÚRú¡ýèµ| Ö£îbËy-;”ïª õ"} T¡¥çW}…'ãYøE¼ðûM×Vòß…ýb jÙN÷¿tá sÑÂBöÕ±3ªwx{¿˜Ä–/½x‰ø–'ÙùÏСÿ4Æ]ì¯C£×Veoò4M™¶ìÿ‡ì€«Çæ@ëô©Éji’þ_„¾aü3¡õ¤ûV%ð²çÜ=äâ9XN_ò|àÛÎð8ІwÞJ°-ZÀ®\tåuLá…ÿø8àÖ·êùF"Y­z˪én@«e_dHäýÁëÈ“ Oã×0×E<ô艦½óØW`ñ%[œÀ멜‘{ÜTSj=.4ªŒu’¡ªx áa;Íf³^½ºásæ O9¬ÜÙ´^'7ªË—Í)TÙDžhk81WÅUò’‚+ªÏù˜†‘‘ö›HŒói“œ {w[±ŽøWüüŽuá´ÃvŸ;}ŠÌ 7Ãÿ eÀbÑY(?~šDúç‹[C7¹øÔho I„Âz¡4¤èL&=üà =N¾zŒ|eÃò’ &]k‚®Öxk4rìÞöSña_'>ð¢á}ÉÒ…eì\µÖcöb¶¹ØÝ¡K§Iÿ ZjiêµâÕlO/34ö¸ôh¿äãgâ«êÄèÌ“œ3s±ÿèJ¿ÔIxÕº ŽOlÙb”³ÓŸ¨yF)éQ&´éRÍiþˆ øã‘¶aR~?‘b´€HDªö1³{œíDmì®^¼èé\²r„{–}†Ö×Z´E€Ô¤3™ìZ?sÊ>Ñmë„`8l g¼Ôá1Ët?5wE!x¼dñ$íƒxÏרS2Lœð'EÆ4B¾qóºæ+{ÕP Õ-BEEËv‚öG’ì.WGô~lð( ÃPÕÌ€ÎÚlÑ¡[Õ´«ƒ0J=3tæ/K³r{q ecÓ}yÜî²¹H("uâÂ<ïÞ©?ÿ!^r•›z15….2™*Ae´'ÚyäbÁà*öyÁË{ù ˆJªYÒ0 ?£õY"Êv•—´Tßð;/†5ÉYtÑwd @?œP‡ª²¯Ÿº-žH¦Ý&|Ÿvw·%© hÛ%Ä2šµz•Q³Ží2l,/Ý»P܈2p&páNkít!Š.è/x¥”ÍVýTYŸ»xŠÌ¯Žf9 “\ÛPÈÎPÃÄr¨ùÃp¢¿«7ºá6¸Ç<%;9ºù—ž"]Ñ(¨Ô %þlà™©ûêDèkœÿu(Á9ü ù–›R§æÓôê*hF² "Ñ“ìê?›ßYÈß»T² ûdüÎÚÆÎªCÈxÁá²»{¿»Ý;èP·Œ¤®¼ˆý¹r®º&o'©êFÆtutB7JÈü²ÚzQeÁeéIþ‡pô|(™ØpUK†SL ãg»Æà2¤ MÆfIî¶|b>µÂÈyâÁ¼CÎHSvOÛÀá÷/‘*jiãâ[ÈÓÕÐZMÅ+rÿú Œ?PÈZþ× \€þîH„t }eù5¥¥ÂýP}-=è}Ïi_¼)(i¨’íÝ}¶üó=`ÎáÉã:¾‹oÞå`æK:–øàâ©‘ñ@ð÷÷“—vø”|-™¬:¥TXTI¨TúÅÝ Ý2= 7 —ˆÌvŸñÃmsDÏ_…V2ÄuéãºãÊ0„ ºbÇžMïäU×H$Êöm5Ò»L­|/Ï\îc×~"â`s¼¾Sב)î‡kxVÒ«wè é©“pÕju=È@êªñIÝ žFЀÆb²¢LI<•ë÷ûq]<-öOâOI[Ö‘1Ù“1Å–1µwÊÈÔ„;#5ë?tBÇJ endstream endobj 364 0 obj <> stream xÚETkpTÕ¿›l–#®•ÕËö®P"¶¥a¨‚Œ $&!`S‰ÉæQ’ÝdÙl²ìfwïÿÞ½É>³»ÙdÉ&!›Õ€ P ´µ•™–ŽÂtjã´íÐGÇsÃÓÞ N?œÿÌ9_ÎïõÿɹœÉd¼º·ú•j¶ì«¨xñÇË?‰Áµò›‹î"¡„ÖÊ„u‚ºPxL®þ´\þ_eÁ:‚Ý÷4‰¯\ž_µ<ŸÆŠº‡ ¹L†Ì=ÒÒ§·•–îØ§ï°Z›[LšÍ Ojž*+Û¹U³£´´L³·]khm¨×i*êM-Úöz“tiÓ¼¢ohÕš¬šÍ»[L¦Ž]Û·[,–mõíÆmzCó3OnÕXZM-š—µF­¡KÛ¨ù™^gÒTÖ·k5÷°o»7÷éÛ;Ì&­AS¡oÔtVÅsD%QC$Z :d±ØNüˆØI”û‰D5ñ2±²€r"+«+X_p¡°¦ð–übÑb·@ßݳørOÌÊu_â¦OTîæ€g˜!~Úç÷;À´G`°E÷⵸è?üîÕ҆ñŠ4Vü>C×wÿI|\½ôˆ¢Û[ÒTÆ!ãxý½èMѦšÇ®pžåÎÀ\¦ø2w ¾lÃNñAJìTÝÒgÎàu|‘Ä:~8³«aËãeâ*ªøîk0+|1+»+þ¨Šÿ8ˆSìXÔ;袌På7B KZ¡+بÇçpÚR¦ÞeFÐ ~ÆËxÅ‚¥ý¤8!$\à k„5â¾Å˜€1jÞ‚¬O$—²¤Kkkÿ nO7ÅúYW²0Ïgá C¦!Cʰ™ŠN¸À u¬e&`åƒ1¼Z“øÚÒç!;G'`Í0p|/ê%äÿyo"³Í§Œa—`5Þðås>Mí‚å>¯u¾"®ƒ:0þÒa6Ö;õEüi‰ÙÐ@*óIvjÐIxÃEA´änôQ‡j@ª…ôhþä…ü»€.L7URÐj +[ý\WhåfXúœ“*EÊеÿsûh¡P8#<«âè¸Sí„£MÝ펱–s/׉%â&Qv£òoÔE8?övžñ·‰«üVG-0å ²ÙÁày#T~#UYÒÌ,·Y¤…ñ¤z¿eÍI¥•FÌ«|Vôt7¾~ØÐèHÛ©ßRpnìNî½S¿¿<9 èFzw?EÛ‹Š»2¾h,†;2 ñht…z¥|ç¨ò¾r%«¼fåÂý3¼R‰?]ý?²†í endstream endobj 365 0 obj <> stream xÚ]PMkÃ0 ½ûWèØ1F>…AŒ”PÒºýŽ­¤†Å6ŠsÈ¿_ì†v@OïIzÊ~âÖÈ~È)c5áìR=ŽÆ²¢mTØ«”Õ$=ËšNú‹œ²‹8óîüÞt×Ïû­-Ž qxn«G(÷šŸÄ:œ¸TȮۼ9Ð ‡/íz|‹Ø7i$cG8Ü‘±xÿ‹Ú9«ë4®x^¤œÆÙK…$투Ê󪶭Zý¯·+úA=$mÌbc–e~LܪèîeN-DÛÞô‚ä(.7__òÎGUŠ?ú[là endstream endobj 367 0 obj <> stream xÚyXT×ÖöGæœ(BOgˆ-vQc,±ÆØ°kT”ÐDšô&Hú̬zGš " €»Äš`¢ñƨז˜X¢ I®ëŒ›äÿ÷€1yîõæûžï9pž™göÞg­w¯õ®wí#bú÷gD"‘éÚM+V®Y1qÉšsŒßgî$©ÏË ñ&‚”d"ÁºŸð¶XÖÈö6Þ_3§wæáëÆûzÙ3„aE" 7`pt\ú‡n>!.v^ë½llfL±±™¾Ä?`O—‡gˆõ8×ñÖÓæÌ™5ÉzºÍëžnA^®.~Ök\B<Ý|]BèëMþ®^n!{¬ÇÍó ˜;ujXXØßà)þA ÆO²ó ñ´Þèì´Ûm§õ2¿ëµ.¾nÖFó§oKü}BCÜ‚¬×øït ò£öš‹˜þ¢±â‰æó™Åý—¿¶Q¼µŸ=ãÀ¸pÞ&A\"Rˆ” ËpÌkÌÆ”Ę1æÌëÌ`fcÁ exæ fcÉX1Ù7)3’ÅŒfÆ0c™qÌxf3‘™ÄLf¦0Sf3ƒy—™É¼ÇÌfæ0s™yÌæf ó!³”YÆ,gV0+[f5³†YˬcÖ3˜MÌGÌff ³•±c¶1Û{FÉØöc¨ÑtÀÑÜ~Cû9ökóbgq¡¸NüYÿýSúj²Àä¦ÄFr…õbÏr[¸Ç¯~Íýµ¼Ü¸l`‹©­éA©Í¦›%š7O7ÿæõÕƒ>1dê"‹­Cù¡C½ÊûóOÞXýÆåa3†å[zY>²Zlui87üÔ›¾©{kÂ[™#Hñ½t‹ÌTö©õvëCÖç…™á¸&ü¿RуR,8VòñÅÉé‘ IɉÑäÉo3-S”É äâ3¡Hj°—eB¶ Ô IÎáz& ßó¨ïi0é9.13,†Ë¨ºŒ~×D-úÏuøH÷¹^læð=ŸJâÉ4DS©iÌÎOÏ> ¹ÀᯠtAFB޲Óáb;ÖÌ zá÷:ZßÇ ÷ÅaÁã…ž.‰»R¾@â#iM= mm§¡Õt´>„] Ìm %lƒ&÷štŸþ7[Ÿ}’k¹»¬§„ý›f†C¡záM=ækE-wºp„?Õ‹…*Läý\<=rˆ J»þmÛq8ϵDÜûÀvÁ&ÂHÁ7maäñïXº8ÃfîÝ;«~’^‚ ºSí_­ìŠo„kðY§æ.uP¹pÇ6Ø;šÚ[: ³é’eM{Sñi5§g=«@å¤^c:Ú‡í(Û*¹RÉ‘/oñ~7U_A>wZwªãŒfb¼–MžÃ9Îâ+W5m, lÜ’}pç.¿ žË›ô}§ nÖÔœéä̰QQ†‹á­Ý…;üÅÀfÏð€€€’€Ò|ÈOËÍÖhÔj5pHŠ—ÁJßµöŽJ¥BÉ\rFbfΠ©ÔLE4eÏ7–Š~º Ƈ$ž‡tEjR&áqÀN\¸pj ®Ç·qxZš&Ò¹Ìä´Di,L[²™ˆì'2–dÉ)2à 1ðAp™éi™²?—ÆXºö1Lã៱Øo+Š×£ù”/c‹S&(d¬Qd&~²û‘·€4HìÉò¦R‘’BUhr¤ypÿÊIu<®øД£[;µ O´àÉR‘`Ö"6lÁ=|A”•‡C¤Œ4âAI”„î†ÝÑRrd£éÇÐ(’!ý&‰„ðr:¸@ŠYŠ%ÙüK[Š¥m»`ÎÂ%)ɪ^¬ro^ß6ìü`ma¡Zj†k΋r±JŒ¸†?OªÖºÐ7ȈÑî$_¬õõ òó­®©©¨¨¡pçÔ²ç›JEÂ(±°Õ`ϧfkÒ +ŒÍŒ—FBŠ<%–tÿ¾ÀR¯L.*/1[Zi¹iyª5 ÑŠÝÅ‚»bÁ¿ä¡Kq×óNVl€u°0Øi¢÷²ä¹°l5Z浿÷ud| WuÍß×teünpć|ÁûÂ’‚p4‰;w¡.Áõ¼S¥ß^,®ƒF¸V2%÷#˜«a ÌŠ[¿›HÇñá4gô" »&ÆNƒ¯Ui‚¤kVMà|Ø8'+¹žÖ];Eêí#©OýššîC=ÍHovŠ"f$]ävÿÒ­û½¿ ;p)Os(&a}LdRü2£²Lòô!ÎÆ‘çN@·²“nsÂη±ÙÖ’œ]^ST_³»ÜGš HQU\¾X{¸î“–É`Ì‚Ùö[É*²ÝR.%„p‚…Ĉ™î:28²üx^;¤E¸íÁân‹ßñü•pàð—ð9wí½³£FÍ_¿pWyxuuYYõàB/ieó¹Ò#ÀÝ*Zù± |“ìƒÜ|=•~Ê ¥€³ø-^• 9“{¥í’{K'‘¡Ë=ìdá0!Ýñj}²N uÜþ 2¿ ß(—é–!‡ƒÜï–Zü÷–]XÖ*× .4IÎ]W£3)†òEÒPÉ…Ô/ 3ý \ †²‹”ÕîvëÇÛÙRÈ §Y¨RÅGsd; HLz$l¯Ç(zBƒ‡Ý;P¬Ç¸ûâ_ð ¿äÒ,HMËÈ®iî¨8Ü3 SYOK…ù•oó³“Ò’eJŠ|òÇá .à ŽY%qéJP q²^™öÖ÷‡è†|‡¾l¿³èÁáx›‡îÜΪã¥MG>¹ ¥Ð–²Ïƒs ,ÓéJŠkN»ž°!òô²D©Ås¬ ¦ŸM#ì˜)‹ï'"Ý„g_¡Å-á?ä#)ÒÞçÃ)îô:ZÖXsì`~=¥ªeiqîikÁ™û`רÉÒ>öDï— * âk‚+(…ûúUQ ÕVKÉWýÿ“V ‡Ð¢g¶ˆ: ‹Ä;H%´„B”¬ç™$*Bw—B¾LxNœùÂr(/ ‡hYÏï’˜0ZÊ¡PÖ+IÐ^/,/Õ6ЅɆU|r¾"+"A™”I¼{¾³ŒÝâ¹@EÙ®1•îÙrÕiš—ìFu„J [“®IoGÞó$'ÉÄ´85-µV¾› Pêö¦‡¶ÖT¸E'D°k@ž§ãÈ,Ü̹à 3ƒ7µàS-6è‡à¨ÛxùñÒ§† È×i2Û¥ø†äIÓüu V,›,#Ó$¨”óOK¿¸W¹o&Þ$–Òî¥**©Š,~FKð͇ß>Áýw¿$â<ŽØ‘ëüÇÊÌ:Vใã×.X·p4… "To˜¬uv ÉUb¡[ø÷Öo<=–Rò2›Ì$ŽdÎ%Óñ#œû3ŽÀ×r ;Z¨ŠO “ˆéâÑÀ½GVžÀýX‹¶'nɞ¯‹*È{šur>pE^&Ãv/dÇJA¡HЧ…¼ô-+#ï £žŠ/¬ùsBà$¸Gâ8ªB6N#ʨ³ŒÿMÔçˆPÏöBôLòœµ«ò8¼¡p Œƒ0ò£¥[—/Ù½š&·aE÷¬÷÷©N'X0æñ=WþSK w$-˜K¥m™¸„,¤þ[Kú+yÀ>Éó™)Óa±¿df¬ÏxéLôíÏp Ú€ns±¦ÙÌЪǽ0ºÏå÷ņE†÷ù¿¸n·ÈòßÑuÆYä]´“=„+õº#{ê=s€Ë…lªZ±‡ÒÒ»¤zÖV!‡-;g‚'”µìƒÔXwÙj–˜‘I3‡¬?‚ }ÐK_}_ŒŸ×cþå-4,O.`´ä…¶–8*6ƒÃ&p¤ëïcÿ=ž^¡²±/‚¿!”³³º™ yÖÆN@ø‰¯×äÝjõ’Šåàì¼vÐÁZö†&ÖÃhЇ2ö}i¤)õ´´\‚&ú  ö}e^=]JªíDF׋:hŸzO,Œ¢ùÓTç(t+±°ÙuF/tuì##t=öìÔ­[¶J]Á¾$¨ñ`ʾ*Ðs5¡Þ>Á»=?øbí÷Ò;ðíñ‚Çê,8 •FÙù§­Âcáþ™óê½F¡ï§Øq.îj£g¬NUá HHN$wÉ9Küœý¿¼E34Áu¤$Kžr+¿°‡rÊáÔ£ÐZyŽIh5Dg{·‘¼cifx㥕xŸ6<0—Š,ùØh2„ÐNâݾ`tlCZÞwÒZ½ÄSa®k^m“P-1{¾øÅŠcôBýM±ÁÑ åÕ*“ž®—†ŸMí‚ÂŒ«½Jå?öÌ“ì†DHÜCBz.Z’álB©JVdÞËôKfÀ~ u딦@}¤£PuÒèÖ訒 µ¬Zªß˜ô˜´ø<°Ê…ôì´l®7žûüÔ ‹ôb”fð y Š_sOÉ ›ä)¹ò “ÚiLvtÐÿ¿˜”ÊZÔ¡©ä Ôº¥¥Ô¸C|+À©Ã­Ý½÷„ávὊ Èë-%TR'¯ö öo—&ì/¿”Ôšp>¾‹ˆPÑÒE+”NÔyo^ÓÚøÿ~iàE8Ìu¼x[Š<ŸX065\L›ÐȤåf3UÊYFÎU©ccöääïÚQºõèd"¯Í²#ƒùíöéÉ­NÅÉ8Ðÿfx¶r¿—ZUçë¹åÛÙH‘Õ&àU!dÄ a2²™ ƒ„Þþê Æu.¨öùB$+S”‰’G¥a‡X8.Üæ[/ÞPӠ׳v wÙ®^nœÔ¬*¢„¯HL“„;7+Ò’3!à rŠKZÙ¡ ÖI ³èŒ½ìç4àJýpÑZ’$ÙÁv¾*¬¨÷©¡¼±\õ©‘}4Ñ:(„ÜôÌôL–”?äYq´oRXAlh„«Qf¶¦ž€¶Ã¸Ý«í!(m·žàË?©ï­q³¨j'ë±5)GAi̪¢A­—¾0ÊA³{:  Åþ@[’-ÿ%]*rëe¸•Åíx¡´V_]me<Áò/Ïо(¨/‰ ‘A¬"9!ÖxER[žm¡i‹ I*ß2îùا-däïQì_~DM}EF:?ý}ì8gc“*׆@mõôùÚþ¾õŠÎÂ^Ž®ðé.Õ-Ài/Þöÿˆ•Ã6è(’â:¡Î±É}¿}á6àf-uYåSQYURZÙâ”®’UUvdWw¬Óm†lkQÉlV.J^á½Ä3t+¸rs~è’ÒgÜ‚ÆS:.þs~Â"_§êŽJá³Î/pr†‘cäÚè2ÁZ‹îÍCž]Fí]‹ý¸¯ð4CÕ¹EumGŠ¡WºT:kÖS¢ú8iK k¨÷Ÿ-ànÁ Ñe †.þ#^ïtÔÿ$¥…Øï1ÃÁã~"¦²åð±gpgñ1v±dœÜć½”¸]Öó@GqùX®Ãúïªu¢º»èDÛPFÁïN ‹?.°4¬²²l¯þüÒÆdèDk2˜ð¿Œ§Íƒ¬eçÉA!•mV"B–m ´nÕœãT4ÛÜh?+ˇ“ʆ Îé…7z£OÐ^¶Ø/X¡){@µÛÇÑ!Ü•6ì®Í-Ê3P í'*•×6éO@3Ú]å–Is7œK=Ç'g8ž˜OyÔÜz<íÉÿ8ʾ„Ö–â2êÛ*'æšèÙåñ™GdÂ/uÔLp NzVà­¨ú.*.‰…Ѹ‡/O‡²Ÿ7="C‰éäQäu2ì×w¨î1;òl_frF¼,‰ª¯1Ó•Q´mßQR·ëˆê,4sê >§Ü/ÒÁ)8ë¢&CidvQÊ5Ñ£F+B“˾ã a4¯'Ñ„ýîHk‹4‡RmNJ\Jd,%ÛÀ’=Úªâ’ÊF·ýÍŸ³žV6vžÏuòë ‡•T5œÐ䫪P¥Mûñ¯C˜ì¨ÂÕnTab•¨ú4F]«;-ÆÁ¸œ×Fê£Ú€{tåÒuñ¯‹)8TßyL!ìáä™áû ŠrÊJ¢õ®R?p”{z”ï,pnÒ’åód`WãQ¥Tú{‚xyTí±‹tu‡¹ŸnÄ¡hþë‰kRh ?ì^±éÀ˜a44~áUt¿ŠÒ ³ó¹î~:<)—A•¦noEaiU¡¸û0!$&L“µ‘|-š«æn\à8yüâöSE9ŸÝ¥ÛbD­74DØÿ*º_ã*ƒ-ÿ×-ú“vM‰º£#_uÂÈe+åÐ&C[ö_ÿ8~áLþöuRùÊqv*=‡±p ªý„èÜò·Q)°ÝÓg§’ÛºmÍhŠÌëÈ,¾lñW ky2ÚhÁÅì¤í2RöÇÊ­š2õá¢f8b\Ù6%ý Ìâ§T¡±÷ÀÀ'$ÈÏo_þÅ™ëAº¬¤›EÏ.‹qúòB ûJ·k´êæ&­ªõ¥[?±Oþ@†…fÅB´Uœ"Ö§÷ÙêƒÕµPm¶ ‚Õd$n¶|r§íà¥ÔÞc%¸ûª7I³P•—‘ŸÀõ:i5SŒ«ÿß¶ö½ª#/ 1¾2u´vˆqw<ŒG¨ÂÌã‘ùúèÙSÅ;—þ7àÿØ ÿqà_vèèv5ì®pÍs€%°ÝÅKì×úYð>lߺ۳¸©z"!c^ZNJÿûƒûë¥åîW-Z{Íþ¿…Ëp^íOÃÅâÚìÿÚ‚¹N˜ÐK7õwÅB8zñ8lÔ/ÄœXŒµ¦Œ3ø—qhŽ?ý„æRFìømࢠ9ج¢ SÛTsìha=->MÞ¥^û\Ôvàî°!ÈÉßÁ!ÌÅxzØE¶èq’VxC¡òì*–ߥ ¿¿åë>9UÚ Ü×g§†H–Ϙ+£e¢2ø@L)•<%Üòþ•u»>û³J ÿ# Û ÛBÝvpû/¼ÕËIβÏ¿órì8?»üìŠò2J«M¹øJ¤*V©¢lÌ”Eì+ÛWXSë[ã(]..!kzÁ¤=ò`¾‚üÌ„ñr­`S.ª;†1ÇÄøƒ0·ï`#™ª—˜X¥2>>)Ù§Ü'ËË]ØÉÀ» p_hOcâ±øcq{å9 ÚppãfŒ…hé¼{R‘£ÊˆíUØ{dd(ñyÒ ª°‹KÒ2róÓÓ›w´)´Æ3æ–+]2h « Ýçµß#sqA`úùÐÉÕîkþNŠ dÎÖ©c!)¿·(1¾†¢{o¡ÇÙ¥¢]Åá:1~Ý[ ÆàjV5ËsôtT³¤ÿÍ].^–vúofûxx¬€oŠ¥XÃþQ7Mš_F°`ïóÓ·­Z2;¹å¤o³d¢½k ˜.#X°—6Ïê°¦ÄCpŽì«>ËY„«gKpÜË¢ˆøb΋¢xP^& ׋J¥W òŠ edr•õPBÕœ³2DåäéFFi§Z¤ÐǴ̈ÌRdC6UÄ™{ñ-¼iYvì@Þ£(õU8‚ÒßGíoœQ­Ü@wŠ|I§2âÅã ĆÁx/?×”VfœçJ¹k—[4¸絨 h‰S&)§’T˱XE•z*Uê•zM%µËA±"}üÀÛ8ºJU¹ÑÙò|WP€2Yª9$Ôræ'ÒPO³ª:Øë‹õÅu••½/E!_™ç…<ù—ezlj\!Åi¹i9ݸßòg²?-.M^V…š“–ÃõQ¹‰^T äŠñ 峩ÔRƒæëGYYúººŠs}g1à綧σBe~õ 2^žœ´jžåü§‰ÙJ dZA^nÞ>ãh7e ÊQ¹vGeÛúŸ o¸eehжu•»ï·ªS« º¶VUkL· TÅ^È¡0Wè+k´5×ÇZ–„ÒðOy\L°Q»7ÓÑ¢é„ƒÆ ®à ¡:£ýÄE[t[¡Àߣ-þ‹O*€tÐp•uPF¡Ù® S¹(^ÓJÛ¥¼œÞÃZ­Ýâ·Ü¬‚ "_¡ÉRë² Ž« / ÚàØì~\ú)´|Rq W ï[æV7]ÔPß¼>óG ´)ÁR@NuOÂXoIÅ&è3­¨EçôbaŒ0ªïGWRòO‰œÌ¦-jFwqšÐÜë/!z¸xãÛµd«Èl Éñ@²7šøKâˆ8ÆŽ 6¶Õ³çy˜©Áó<±ñ¯ý=/ˆ5 -–ìE¿ÜŒr Ù‘Çê\¨Í05½Zd:H: ÿ¬RÓ×ðÑÐÿG`%K endstream endobj 368 0 obj <> stream xÚ]PM‹ƒ0½çW̱eYÔÀ¶,Áµº_iÛ[LFX“ãÁ¿¥‡=L˜™¼÷xo’²>ÕFH>½•´Ú(ƒ½Dh°Ó†d”–a›â+{áHRž…{=Br»_¼x*Ïüçõùz©²(lWÄert›ëŸ†€}mZ Œ€ä{‚Ÿ`W(Ûà~Ù}x…^›v×’Ç ûÅM€”äy”ËVKÒ*œè…é°4ÍUUNШte4­¼ OØámFRJ_rÂŽ4öé1ò6Ä¢°D}$•£÷³‡x˜n1¢ >Næ¬[X±þ,vo› endstream endobj 370 0 obj <> stream xÚu‘_lZeÆÏŒžQZuŽ&ÛáL—ÙfÃꬷ¥v1Ë’šŒ.1.™zÚKþÔá£p(àËßrF)ЫV“é…YFtñÒ³xaŒ&¯š½™W^œs8=°]x¡ß“7_~ßû¼ïó!L£ÁBCW¯N^ž™<15=ó†µwqÖÕµÖ¥Í}âQL| ‰O«Äcjñ†Ø½¤ù[¯:‚aèÜ==õXOM+ŠWDýóL‡îIòø©qëÎí{Úã¡ßõRކ¦Xšé×øýÌâ‚¥˜ùYCÍ/ÎQ5ë ,–çÌËø”{)Ð'Èѹ1òY«uâ$9n±XÉI'Í(°‹œ¦X;í¤ØÞKrÆ=·H³rôe;Ë.½tú´ßï7SNÙÍ,œ;IúY;i£=4ã£çÉWÝ.–|rÒdes_§ÜÎ%¯2!9íž§—²–â£Øu´„1Ê~;(’(…]C @il¿ C˜ÃÊhÙQý¤:«âÄä°tG´Ð®¤UKBÀ°¹͆‚¦ÎWÚ |Þ-Ø4)ln Ï7ÄoêÑ‹â_>W*@/¯ð"«p#Þ¹/h sq¥†åRœOˆßÊÛÆ .À«…5”c¹•|ç3aÝ(V:C­¦B=»¼¾:ÔþËNøõ‘”¹\$ß¹/|d ¯­B ðÈJtÙôÈî¶Ì;Ëüû±XÂ#±Âr•HCÖ ¸ø¥Lÿ]{ý‡†p¤%u$ý¡d ¾à‘A—¡H¬ÃdË;‚îû_t§)f¡<—gä÷l¿±&7éàÑ6Ad[6 ƒø^ê_ñ ŸËÙF{¦Ž„¡–ZxQºf¨AÝç…÷Dw| þF¶6‰añ¦œi´m 7ÒÎ(èé-C¥²A¢{BAÙfêBx»mQšÜòúÀ"ºgBý&·jİô kk´¯ÔÑÒjñØÞïù’8ÂUéUQKÅâϼbŒÆ àðD6Æ(ä›5¾P¾Y* ov.‹Á<ðP\®XßiŸ7f ¹"~u¸D4€+>×úIw¥QC:›[ƒÎs ö^×8ˆš ‘ãÒIáÁžÅXòeU¨A6_¬âò'f¿ÖÊŸvîîölKç›Zùpi€Ði&êúýkz]Z?ØÒµ[5½^9CÂîÁ,¶ÀÚ endstream endobj 371 0 obj <> stream xÚ]‘ÁN„0†ï}Š9®1†¶Š® !YA ‡E#»Ñ+´’Hi x{Û²am¾™þ3™ù$yš«n‚àà ¢Ä šNIƒã0PcÛ)Â8ÈNL—Èߢ¯4 ’c¥‹ªGÒ¯¼x+n“ãë7£wçSÆAb³JN‹Fà—8OËeœ°ÏU3@€àÓv'³Àî ‡o\îÝH4jawNJŸ)g­±G5%qìÛ±u&1Hu%ÐTªEQC”e1A%ÿ½1º–Ôø© ‰·RJù>¶|¿ò³ãÏá‹ãpåÔñÁó“Ësz­åìZk›&tÎs¼ßØv™ÀèÌܼ³1vI︷ÏmÚ)Ü>EÚUùó³Å‚f endstream endobj 373 0 obj <> stream xÚ}UkTSW>—@rEeª˜‚]—ZkqÕ¥ˆµŠ¨m±£tU­¶Z­S­„D`É3"á ÉÝ7AžXíT;}ꪭZmq¬Ë™Yvú˜i}ΨSg|,_u¹oØWgîøÓ9Ùûœ}¾ýíýí“p,8˜qö⪗–.Zúô‚%¿]==VÛ™•'ÜÉB>l ‘c™<“ã‚ä:9"8б uc´uÆo´5âue&u -ËÆ1Ž…1=ÍX[ÉRX+bµ¬u°]ì#v€cß±sì*#.˜Éreœ/'ÙnËʰmpXÒSSû{zjZŸg±'§l´9¸ÃŽmÃnjNâ0˜Ä¡q‰Cã9ƒQŽœ‡1CL‹ã¡™™ní³m›é:†u<܈èÛ¶mÊËÏÌLv¤gg©¶ã¡cMÏËÉH.t¤gXmÎt«-6vÆÔØØ¸Ù9…}÷Ì1)“ÍÓããgM1ÇÅÆÆ›_È´ÙÓS’³ÌK’i6 #%9ÃüZvJºÍQhŽ™«0gÚ4§Ó9593oj¶=uþä)fgº#Íüª-Ïf/°YÍ Uæ¥É™6s¿ÐSû¿dgæä;lvó’l«ÍžÅ7z¬î1fæbX,7›ÍasÙ|ö¼n[Ílêa-çæ<œÈ'q^ÎÇÕq[¸z®k䚸f®…ÛÊmãü\+ׯÕ†!˜¹Ø-ÎÈÅs?åÝ×½Ì[ƒwßI© ¹¬_¢/Òï2„ü†›²;,àîïF<ÛÉ¡õœ.°L¸û½ê<^oÃGI'’ÑLlIÄ“ »?ćNᄳg÷íóùÀ >¾y3”˜JÀÅÅt‘ŽNPÖJÔÏŠèp§ãcËÞÔ­e^ðïo€æè¡YåeçtòÛm2‚5]6Svn·íµ|X¶Õ%À—UBE4ÔÖÕz=¤žH:A gRËt#Pw*Ý x:4—&Ìžœìq{Üàæ+š`«É¯’kmÅ‹xô޼äx>LÍs÷xÀßêáÐ×£CŸê±­‡¬êZ{¨M?,Æ®ÆØdF²®À6aÄ[Ô¶­ú°@å`ÓΫôŸz§a?ü}ñë¯~¾p7®ºüGœâå pp¾~µ±NãÃw”ß׬ܲ˜5“çP˜Û •Ä+dÀ*±¼rÂÒXÒ/.ªE(—$ú«Nl¸º “ÆÔ9Ô{å¼rÉôä)øÈ²îrø. º£¡M”ª¶X:Éø×œèñC ãÃï wr»„‘>•kù5]À#Ü)2‚*\uÃÓÈ'à¸eMøõ*ì9äùåPŒÁ3G1üG ý72¯Ïë…:MäbS±šßãÅ%¯Ì£ J$qí_G‡òhfÍšJè~e,>CW¾£)W(êúMU’Ø|k¿ìƒ\äu×tòa¡w±*{è›òXz¯¼ˆS¦`TÌ/•¢ä¾¤ª_ø¯û*ñ§iÜ×ôõaê%”ùk”PŠ¡3Ë)ü9 #&zܵšøà7µªÍöz%éø±“„‰(^ÄýŸá¡·qf#Μ¥6æóÁÆÜUɬä³êˆ=‡ó(ñ"²£hÄ[ñ©>2ð’ÎBGãǧ\Çð4n‘$èà»EUÊBµ%9Eä ðRZ iü½ß`ÌY5mmüJËú¬MEJbcÍ¿^»×M³|ùê•2þ^“æ|Asqå“ÛK½Ð|·$©*vˆR­wý;q*kwªulSÉþO<Ú%èÿ«’݇:ªúÆîzðG{ËÏȧð¶\ÒФ­)Ud*êSªÖMá4i­¥HjŸMG6(ÌQ@V  ÞjÊë¡ †Ëøi!¤ê‚ÄaoÆÍEh'–RZŠ;j·¨ïP¥"à‹ûôQÓl+Ä›Šë¤rMºÏ—ÔC·©Gßõ µða½£îGv®«Èãp”N–”7Œp¶_Ã…8v[s_·‹’ÝT¤§Äϧå@OñJ¢!Wß1ýEÿŽ$íŒÖ@"AI÷#Œ;$i{¯|Ûzó?Ö?Á^N4ì¥ÓËúQÌV‘€b~¢å¸‘ A–ÕJÿù€Ï8!0Â84—<Ç8z5®' X€QÑÊ«ûÃp 0«¬´˜ÌåšÄ…šÄ-•;{ýÀ¤O:ã NKG_váևŻŒC1è÷ëÔdx|ˆÆøýƨ±\Õ DŽzwOú†ì¨£RL Kka]úK-J¢:> stream xÚcd`aa`ddäópruwÑö vô54‰˜Mþ“,Ãjü«žõ‡ ÃYÆrL?䙈³È200¼‘¯øAä3© $U…Xy„Û{Š K‹R‹ós2S Œõ Œœó *‹2Ó3J4’5 --ÍuŒ ,sS‹2“ó|K2RsK€œ…àüäÌÔ’J ›Œ’’+}ýòòr½ÄÜb½ü¢t;M…òÌ’ … ÔâÔ¢²Ô·ü¼¿ÄÜTˆô ”kiNjÐaŒ,@¢ È0þÑÁ÷sn÷‚ŸRóÿÔeþ™úSAtUG¶ÜŸçl9íÙòþ°g÷µ¯‘ûñ”mM_ßjy¾Ò…?–Ný®8›íwÒtöÍ\›¹—Ìâáb^9.óù<œßŠuáhv endstream endobj 377 0 obj <> stream xÚ­ŽQHSaÇ¿o›»ËÖLiôÞ]JEIæRQŒ0rb˜LʼnPìâ.ÛÄíÊvuY!i‚®£FÖÂ,ØG®‰Ä°´ (%Ô‡Ya`ö0è!CÁ)øîº>´=E/A~p‡ÿÿ‡‘B0ÆjcsM]SÓq£©¹<µ—{¥ÑlE8ÑŸ&Ab6sd"-+rB»™)nf¤?˜b^r& )0V — †R½ÁPbä;{Ü›]` Ú ™••EL‰ÁPÉœqrnGëbL¬`眬\:3ßæà„¦à”]:O{½^=ëôèy·­ª°ˆñ:;ÓÌy8w7gejy—À4°NŽI9ëS0òÎÎ.s3&Þʹ]a¹;#”‰²Ð9Ô€‘R†0R šÁOËtâF$Ý‘„,‚—¶Éëm¹ø’¬i? I>ÉR¨ÚRøˆHpN—µ,œ xâW߬À*|ºÿfòëúø ¼€X×£Ó­ÃÕPõÅÌ—{ÛA•¬€¨ˆÎ0 }‘)‘¡ ‚“®«Ï¨¬Tb°ôXµ7BµCo.m±*nmÀââ,¨s£*Ƨuò¢äÇ+B5&Ç>ˉWÜÓ†Ýa{‡Ëc³MyžÌL†Ã´T*5h­TìîÀt›²ôA-m¥¦F6Füþu_(™G™úᙎìQšŸ×’bÊ&Gãd 5ò„D´»O i=´´vqÂfð`óy«ºùM)_O³Rþ ~7:?ò§Âkû๎ÔPD¶=»ü~Âb¢%÷xÔ$*~»ÞˆËʤèŽy6Ÿ.…–K®‹ª-ê_ܶfWV°ÉJÏ_*»ƒ¢q‚ðþ;A¥ÄÞ£¢éñý‘1µ:þP}€NWTÔûIJC¿:bÿ endstream endobj 378 0 obj <> stream xÚ]PÁnƒ0 ½ç+|l5M¦í!u 4lÕÒîÃ"•$ áÀߤ¨‡lÉÏïÙ~Ϊ¶n½• Ú(³]¼DèqÔ†ä(-Ã^¥,'áHVuÂ}Š 7õOSŸ?ž:þÞåôùziò7P8Ü)—Õ!{ÝÖ|N­,0F²ïmâü ‡“²=#öåzmF8\+ž¾8wà MJÊ2Ëï7I«pvB¢fDÂ(-5MIШ½]ÑòWxÂ^šYô5qw4ª¢¿‡=¹x¿íMOHŽârmðñ'g]T¥ø®»mP endstream endobj 380 0 obj <> stream xÚcd`aa`ddä ss ðÐö vò54‰˜…ü±áTÿ¥ÃúC†á‡,ã9¦òÌ?ÄYd^ ‚Èçü ò±ˆTŒ‹„X9êZ:Ss J*‹SK Œõ Œœó *‹2Ó3J4’5 --ÍuŒ ,sS‹2“ó|K2RsK€œ…àüäÌÔ’J ›Œ’’+}ýòòr½ÄÜb½ü¢t;M…òÌ’ … ÔâÔ¢²Ô·ü¼¿ÄÜTˆóõ ”kiNjÐUŒö@¢‰‘‘eó¾Ÿs;7ÿèßÌø D2ÿ ÿ±Ytæôî‰Ýýó*{:åZº;:+«í<$Ê:žúÍÒÍñÛä·ÔoáßVòݺ›BæçU×tuD”Wvvv7qÔOnž.7©»·{ç%¦4^uø.ÐÍñÝî»Àw¹ïúòÝ/’V,ëé™8¡¿ŸãOØïç¢Qºw/äø®òý;Ów9¹oÝÇý¦6p,Ë]?'²;ˆã·ÊoößL¿åäºýO4Nãà+ŸÿÓqÛï¤é웹6s¯›ÀÃļr\,æóy8¿.!¥ endstream endobj 382 0 obj <> stream xÚcd`aa`ddäuptòõÕvöu° ˜È|)•aãú9õ‡ ÃYÆrL?䙈³È200|‘øAä)$}„X¹ëš'•d椤–g¦¤ë9çTe¦g”(h$k*ZZšë(X*8æ¦e&'æ)ø&–d¤æ&–99 ÁùÉ™©%• 6%%Vúúåååz‰¹ÅzùEévš: å™% A©Å©Ee©) nùy% ~‰¹© `÷ëIçü܂ҒÔ"ßü”Ô¢< óSD;##KȾ~¼ß7gc÷‡Ì?þ mžÚ6±}b^©_¬GwbwÊü¬Ùñ ó¦fv»vÇ»‡MnœÐÚߺbá‰çº·vo*_Sͱ½tEãÚî‹Ý‡·Ÿ?ÀÁ·“ë÷ÎU<<7¦óðÊq±Tæóp~(ô1yG endstream endobj 383 0 obj <> stream xÚ]PÁjÃ0 ½û+tìÃq`cérè–zul%3,¶qœCþ~±zØA=½'鉖ͱ1:m½•´Qg»x‰Ð㨠a9(-Ã^¥,'á-OÂ}Š ÖmU·õcyú¸¾=]Î{…Ãq^B¾×ͱ[ç€Sc œú½ œƒ_áð®lûò ½6#.e—nqî'42Ri»$­ÂÙ ‰^˜ ϲxUú×Ûý „'üùucæ9c‰»£QíÝÝÉÅûmoúAr—kƒ÷79ë¢*ÅVÒm endstream endobj 385 0 obj <> stream xÚcd`aa`ddäupsp×vöu° ˜É|)’a½þs놲Œ?ä˜~È3ÿg‘e``ø%"¿óƒÈÏ R H0¶1°22 J´vÍ,.ÍÍM,ÉÌÏKÉ,.ÈI¬400Ö300rÎ/¨,ÊLÏ(QÐHÖT0´´4×Q020°TpÌM-ÊLNÌSðM,ÉHiMNÌQÎOÎL-©TаÉ())°Ò×///×KÌ-ÖË/J·ÓÔQ(Ï,ÉPJ-N-*KMQpËÏ+QðKÌMU{CL:çç”–¤)øæ§¤å]É$Ú˜YZtðɰž‘ùÕñP†åÃ^Æ#2¬QÌ2¬b@Ñï‚ß/³æ³™üNý½¡øwn7Ç_F¶³~¼œ:­»§{‚dw_woËÔ?E?ù%~œaûÜý±hAÛwù¬/›u8–³ýü¾žUæ·[Ew{w{Kg{wewý “%þ,û󽱡»£»S²nZ÷\9¾m\W¹·­âá¹:ƒ‡WŽ‹¥2Ÿ‡óûCŸB‘Ø endstream endobj 387 0 obj <> stream xÚcd`aa`ddäóðp òñÓöñôs54‰˜ýÖú­õk¯ ¬?d~È1þgú¡ÀüCœE–á­ ˆ|Á" €Hv Áè-ÄÀÆÈÈÂÎWÓÔžhbšhjb``¬g``äœ_PY”™žQ¢ ‘¬©`hii®£`d``©à˜›Z”™œ˜§à›X’‘š›Xää(ç'g¦–T*hØd””Xéë———ë%æëå¥Ûiê(”g–d(¥§•¥¦(¸åç•(ø%æ¦*@\¯¡|CR#€ŽbÒe0RíŒ Ì@ÇéEüèàûUó[kÁ÷éó¼ù¡Âü«ªGô·üÊß’{ ]àø}€ý»Ð…ï’{¿Ë¯äªüñfÁ÷ßók}?Àü]ëÇQ·ïB‘ß%s¿Ëst²åþ–ü-éö[ˆƒo3×fîïE›r endstream endobj 389 0 obj <> stream xÚcd`aa`ddäwñðötÓöñôs 74 ™ý.ø]ðkɯ%¬?ä~È3þP`ú¡ÈüC„E–á» ˆüÀ"_€H. Á¸Eˆ‘‘™S ¾­;Ñ ÑÌ$ÑÜÌÀÀXÏÀÀÈ9¿ ²(3=£DA#YSÁÐÒÒ\GÁÈÀÀRÁ17µ(391OÁ7±$#57±ÈÉQÎOÎL-©TаÉ())°Ò×///×KÌ-ÖË/J·ÓÔQ(Ï,ÉPJ-N-*KMQpËÏ+QðKÌMU€ú@Jû$†¤F]ÆÌÀàÀàd´3v0v2°02²8ToûÑÁ÷«&yÁ¯Åó“aþ5ãW¼è¤É¦vOãXX9·T®¡»±­¹å_õ¿‰–æ¶ÆîFŽÒ¹• å¦vO0yŠÞå¿fˆ6OjœÐØÍQZYY*ßÝ0¡qRó¯êÕ“[¦¶MëæX8wîBùî©mS[&sðýPjýQ¼áW—hëìš©Õ0­­=m½í?”Z'VÏjœÓ:¡kBg?ßm®ÛÜ=<|ߊ¤C endstream endobj 391 0 obj <> stream xÚ•”kLSgÇÏ¡Øór Sjg7]KD]¦ Ã+º ¹Ü,ƒ[*(m)}--½`¥*Õr‘X¦Ìy:t.Y2Ü-cÙü°M·¹ÍEæ{ÜkâNæÆ§y><ùŸË›÷ùÿþÏyi*:š¢izú+[ó2Ög-Ú¶q]îâ´%+#Ï–qÉ7/Š›/àfF“rreŽ0믅Ӟ¢( ψÔ‹ÔÑ鑺/ÂE‰TMÇŠæÌOI[ûò¦rUaiyùâÔÔ¥K'DZê¤X2)–MŠ´I±jB¬œüxå’Ô”¥ë+ö¾Y­(©JÚ\Q\R%OZWñFqÒ•¢D^\R<å%EÑÂê:ýõ u“ão›h#ÝL›h Yº…6S1QMEQ+¨nz4Ê#(Šžíœ&M¸'Øô¼ˆ s·Ã4–â8|Ç ŽÝY/.½u'—à¯'s_½{{Rß 3 ÷è¢' ½xgÎÑݘÆêk,ÃJ1¶›­®ñ·È3$qÞ*²@Yž¬‚3Ù_¨F¹„ŸXGŽýŒ5·XÀ‚ì-Zi5˜UeeÑkŠ|Ȇœà[gTaÓ»puEüùÆ5ÿÓë"m6>~‡ qOi.ù¦à$—%®43CÐS5°w$[âÒºÚµÈĨ՚}µª#©(SäRÉqUÈ ¬5kt¢ì.—;ê<¹¹ÝŽm¿ˆ<Æh”F¥´êÙF@r¬ 1¼6ÕRªÍe˜fÀbj…Vð…~·Cí®uíï-ê.ê+²,0 fÆX¯6Õ2DöT óA9XÑŸ‚c$µ^_ÝX¦Ýîr¸ì#ç%Ý=]C€ÌA²ºRh÷È@«Ñé d‰–ÔhÔµª§3>ŸÙ'u‚ÓÔ(H´•Œ\¬¿Ã¨”‘˜Ü9¹oöIô­ØQ»Ïl—ù„¢rŠmìQnvýÛÞñ‡ ÆØùÕN@>Q-#ãÌþ£JZu¬6âWÚËÔ@ Ûl`²ÚÚ,Ö‹ß ]¿ô­ÕnsX,–L]À4À @‡d`a#™âo0óœ,¨Ãgö?l^_y„ñ‚×dnäAN×h4l]ž›šµL¯Õ545˜ðE‰çßn'L4ö—áY$!ÈÍ &â]'Êúñ³c"'ž}ß ÚYïçO£Ž¹a{svÓvÃj‰MèY=ËCïh³{ÁƒDy¡jo…|_µ<çŠÓÒQ8|¹ýCÏ÷ìpÖ ­ÈwíŽ mÐÆÚxÆ­:ŒüùŸ©=÷ˆ¶ÿ‰tá÷ÓÈûið»Ô=œ¾LœG2§Lè£ÀO#2=£JF’HNb¼S™ÏVÌ2ôrsü×1%À.O¼E·maAar3lÁïï>U~Q3 Áˆ÷ôé'½À%8¯.Ì¿œÑ¹™N<â!ÞƒËáÃ>W| çv¶¥·¨X%¨‚Í™¯+䥚RH‡‚aÝ—&¾?“=@F^ ã…Ýœ´7±¯Y0†-˜÷p™âÒ.Fôkg yìn€o(Áúãð.á±=§jÎÀÇðy`ðBÿ û<\@˜ÎÄñd±”?VT»ËІ Ó8Š4‰õ/)ˆ`. ÂŒ¾³2l`Z{¯„Ϻí'âe Iê]ÜV;Þe9Ò.$ùVF+p®‰±ÅDzñq¿Çž‹“.wñWñ½™òIá endstream endobj 393 0 obj <> stream xÚµX tTUš~!例`À< ƒM¿§­¶ÚH#"ˆ n(Ê"Y#Ù“ªzõjOm©ª[UIU¥ö½’@Í€ˆlŠ¡5´Š¸€ƒ=¶Ú.´=­Þb}fî«Ä^f;3§Ïœ„:œÊ{÷_¿ÿÿ¾[DMMX²ìÑeO©®ñÒ§u‚ôyù˜|¡Œ*.*ÍN™6õ®GêjêòM7,¬Û¸©±ö† ¡~ßø"ùæ?ü…7þVpç¨9ÔÔCEŽZ@-¢ž¦–­¤ž£ÖPk©&Q¤ÆPWQc©qÔÕT)5º†*£&Sõ3ê&êêçÔ­ÔêNê—Ô ênj6u9i.õ0õõ(õ5zœz‚šO=I=E- ’Ó“ó—PK©eTµœz†ZA­¤ž¥V{w¢Š¨QäO/•}6êÎQü¨}Å×gG­ýÛ’ ¸Øè™ô¼¾3fÙ˜o®Z4ö±ÛÇÉÆ=4î“«7\}¦tmééñ‹',žðá5O]óVÙËe?0ï_»þÚ~ÙjÙ{×_W|Ýæë¾,_1éÖëç_ÿ¯?y¡ç”øC¾ ¯Æ?_œc.â}y‡ -lXº´ÒhÑY‘jbšëo*<Ð3€Þ€ýŠ·akZrT «3u{XæL;jw··ÂÒ…ÊËI¾?8TœŸ|ùI™Î¡3Íâ˜{žoBâ PM{Å[ޯǥ÷¬[ÁX8åPBÝ®÷ßüö<ákf^Ç“pñÙ /èGÓÕ¬9ÝùgÛ‡Š1E èf2 ùvcTÿ»ŽŠW!ñj$ÂÕ"¸ëA•z³É‘.lˆ:÷¡_Ÿy鵓ìø}fàŸŠô§Ú :ªB?K”ù‡ÉÙê\1V㼬:U•¬N|†v=‚*½Zá†=†ds—¾SÓe€ºR³U^©Ñ™5¤‚š°:ɆQ¨=äÛ‘ìMîH9ªÕ$Aí´"+²AEH“b(qÅQ e)g‡«ÓѱƒïUíP…,!SÁd8ãP׿*ÐnŒ5„ ›Þۙ݋øc>”$¹ˆ«X=2˜ –jU•ªšwwJÇÀBî0 ÂŒ!ƳÒëœjôe % ìjÝëì€ReóoÆÀq &xþ;ÊÛ˜Ÿ+SXkõh#¬ÞV×Ëús1ãí £}pG}w[zA™×óEù18'sÐkk«ÖÕ× 5ªZaÁÆr­IÙŒx&]Œ¢P äÿøÈ…c޾ÙWö‡ÚQ ÅýóûÊg}lÖƒßÐ"¨Ñë:ùtsÔ4¸±<·9·ùÔ¦°9lŠXH Ö+ñœ\þ&Ò5{.È,ÈB Êõ•"iü0õ^äsú̄ ŽÙ“Öx–$çÌä% rÄm‰–ø]ùkÊ›_µœßÒë@%²ðÖ†FqBµ8¡V¯¸£¼Emjø¾Wö:NùŽ”¸ïÙ×ÅT ©9*^›+ûíV ­b¾ûmþ°ìŠ¡†æ5f…:¨Oqض¡.WgàtÇ_‘Æ{gÅé¹qÈäOvÞ‹Þ†_̜ŠM@IbT$- î›+AþX:ƒÒΔ2ßõ©ºž'bÑÊuO[¡Èá>^‹Kh&äWʹZ¶êù¥V©ý6(ó‡seç‡p„Àà|ÁFZ©5+8F%¥4”ªNÒ€ŸøÎ3xfqùü˜8ƒW•ƬäCÆ,÷;âAÞ€‹inIh¼2R. ·/K)ù¨)#y”7äŠ~’æÄOÖÒÊf† ÕN.__ ÅGrõ6Eåj¾¥î/¹2‘÷él0”HBMœøà:& Ks?¶ öó~ÜØÏìü¼` ŽVèŒ*Ž©æ£Æ4Ëì)Ìg…¨Sú€œ«®<ïÑø4mšI»oÙ/ŽÙ/^u@3)XÖ¿$ Ÿî¶DŒËGºél8*ž˜ø0Ò Rk §ïTÆL)¶û Zö`KpëWåë1\‡KȧqG¹jŸU!¸ð“RNi&”ÃŽB3Ù†˜ÃÛHÚáF:,ùKK@*ÖžNi ® /ÂcÁ7_¼‹9ôO‹/Þ6º ÈHr]xm3¯”rý{Ñ!¤œmp5z‚°´òŵkTÍ ¨,Žæ\>+:vï9]Œ¯Ú#;Pù+Ãq/}òÞ·Ú08û3Ù§Úž‰mŒnÝúàéÓ»O°o¢×6ÅžôÕÙå»ÜîIÄ9|mól=²×YUw¬Ž=‹à}7®iM9ûì'ü ¶¼2(IËr³iyÐMEÚ;Ø¿ê&gÈ>Ã+¾W”˜IòÌ yÌBÆ2ÑöÌ6¹[Ã退´¯ÓU[OÕäì^›7íò¶z=ÞøKåɽ‰½É½©}åk0Hˆ¢ÔYÉ.…GˉT¡àê€>Ã…Á£â­à[Kü õg8¦-E\g™´µ€78hÖak„µ©–8 ”\nìXÓ¹ºsÛînA-¤„f…^aTÖ-©^R¿¤Åd×¾'¹Á¨ªÏÚãܧ€YGœs’öNFƒ)ŽIKÙaKg“x/¯—âŵCLÞ§]¾Ï¡#žö0¡­L¸Cå#žô o(΄è8,z»©¼@ ­Èà"Tþi ]“°§X<0•^ä—6Q<ÕÖÉ1=„E´ø×¦Ô’)õåñ²?Ý"Ρuv“é SÙ”´$‰­âY ŒÂ.q¥ÜUØË(ä ¡¼<•Þ.xxV$¶ÂVB­ÔÔ¼­Q²¥óë¢vX:u¨èã™`oÖ"-TÆô],>:cá‡bƸŠÐ² €€ItÌ–ÃäŠú‡°’”Ùùq²¤;åN!ØÿkŒ >Ñ –NÿtÝY®½ìÛðµ¶û½¨ …5[Góç6à Û‹sÚœ5ºy npSm®VÔ ñB}9÷ÔT/ÜVÞk}².¥Éf“É,‡<Èãô@¼@ü¥lýØ,ËúMO%޳.ø4Ýçëmëõô4ZðÙLçŠÈ,p).Œ‚ݘ²Å:}ñ$¤{«ö*^%ù‚qßÍô8ž[ƒV«ªª ^Awó Ô£©¡1&Ùü(ñ2ëÃÏ̽Áyë>äPÐD,äwð#§.¾2}­„øÙ~ÌÐ;$=ÿ–+#¼”0S(Oª²l %íðìœÖÅì‹@Í3nC"€bÉ?‰E˜eûÑë™ÞC>2MQ f•­:¶!¾Y#T½¨Û‚îAóÞu| Ûè‹~ÉfPJŒ-Ïá39pÙ®!ì!Çߓřtõ¶M©H^{ŸX,–Üø8ÓÜ1´¯ã¥—ˆ(c´MdG³„©¸1¬àžÍÇ@Úl`çád„(¥8q•ø­ µ9[Q|ÿä…‹'U,e‘Á)ÍÈáNfϯxä ö~´î¼e¨;û:–åŠð5x¹ Ñö.½. ¾°¿rçêØsÄ¡«ï¼E+Nü~ .ãúQ.³ó`;!a(Sj¿ÀÖ"$eÕ&ò}èñSÚ¡ëuYêÌ܇hí!ô´Ûäjv›¤é†sŸ|KÆž?ļçç‘݆ŔëŒÒôNqï#PAȇ´}Ìñ®ÂÞJëÛ¹[ñ ž’¡H¬KÙªáÄ ýàè+é>–ù¢ ™×ïE0Šws–#Ïy7¡è¡jõ<»‘¢U'ñc'NžÄëN¶ñe='ù!¼thïIæã%ü”ÌIkÕÖZ"HëªHÓ:¾¦=EO­:ÇþáŸìñþúi űÛf³ÓÀóêÔnÎK»|ŸÛ×­î1íDð£O‘-²Ã´CèÜ(ÉÛJ–YMJ¢DØ‚¯n ½ÈV£*S½ºÅÑÒbsB'0!!¢mƒÌ‚Wð¨ÐLôè|ë,h¦Qµ]§Äó½ÑéAnä'û{ް_ƒCæ/½h&¼WœjâÙÅèçó€tÂ!|YÖN~ùø1ö(êÛè]Môª Ϭ`W¢õû¬ÿX¨Á™ re!|ÇãRìÌ×ÃËw%Í|'è n&²e†´Ò ]HàVâûÁÙýï~ÄÀ1‹wÚ Eí*Zz´°lñtÐ!qƒáGëÚçxµnGSÏ–Ðf´=¯¬¬„ø¹ÿ ¤Ãí€çKR71_àæ<-Å« m1ñ™uZ©ì§A:øgên–xÕ,ü)Ø.´ ¬È"mjø`3YŠ ¶ÊBß”jêê̤Èh~¿ƒïh =!]H‚QäO=Çä?=4ÄôáCÄè•ûi[EíÓO 5ªDV/däæ¶öCÏ#%âuv9|à‚ýU¶|þ›~|3‡NRK˜M÷ª[ÉžÔª–F¢6’¾ý?¹°sØ…¾](ì_:‡¯Î•¥ñÏ*ú‰T!ý4s7èÕª°‘äô— ÷g 9­ø|tŽH¾i#òFnÐÒ¥’h.áõ#»ä}À¨ÈD¯vD¤õwp›’$\ ‹Õ0”ÛÊ›z›zÉ¿r›·ÅGBtÑ‘@( ½v°<‰¦ JsDaE2Þ4öqSDÁŠ“Ä'¯²È5AmŠ;Äâ?”àßÐzæ‡Ys¤–}hx«œôzêGª‹åd Ê Á‰?¥U&­V*©ž¬/üHEý錮ðX&Ÿ]*©˜wÂÞ é$þ>€‡rev<ª¢O~™¯Èß$ëÚìH Â…L‡viæüvqì<«´-™¯%HR™â¾iB9†°œÙñø.²€|ÆÚ\Òƒ/£Š­œ¨Ò”›,¨ÍÌpÇ)þ®wtô Óof±›Ð U5tã®ÊDáÂ[5 ÅÈ0\>ð¾‹ïÉ—Ébt§Öϳ÷’àšùBÌ¯Žˆƒ+Ó÷ÿ„Αõwâ-œ}«;ò dâXõcw qÔÓÞ›Þû`àq‘3¿G˜‚AÚòLJ0%’oÅrQ¡Vg¡ï8ÿëŽÎ|øþåÓïålà~ßÚ÷,g ìrøN²äû+~ŒÖu†ù’D;Q¤³† üo¢ýìÈ•í‡ÿM´›ÀÿH\âSÿ‡Å/y6-‡ßËí‰3ÅyxR&Ö.§ @ ]F’û æ_½„¸ó:Q°+³TïY“ZMÒ0fêÍâØ>Kð8î5ôFGv/øVYˆ>ÿÆGs§žZÄ.¦ç>¾p!{zî=ÓÙ?ÏRÿ^¼èq‰.Öáïeξ’”5^ËŠ4‹B)…ÏtžgÖ)'ô_“1Ãô´êÕFRPA¾Ž¢˜3J$IÒÛEX!‰á|LÇãÁ…C¸cÉó„¸Q!KVc2‘=¶¨}+·ÝÿbíJ©þ‹ñ< ñd1¿ÃáÇ“_’í«yÅtÁO.íúŠCøñÝÇÐçðµÛ÷³{Ð «o-$‚²Á©%®Ç“HpÓc@`µÈd¶êª›[·5$RS9´¢¯ê€æÝz|OÝG95¬<‹V§'!SÝœuÆk¬³ w—t@ •A¢Š:7Ó/4(!Lãù"ü‹!xõ!Œ]j¯ oÖËY ½z­róõîWXlÄ3éDƳ+ðuÂÿtk¼j•†¨úRÛ›‹%®ÌÍ}NL·5šüò×ÄËÃëcëC룕[7êCm¡Îs=·]Ü~±5Øpa/ÈFˆ49ñj $j_ãÜv Râ»"…ß-ÙÒ#Ùžä‰F¢—qsjĘ$ã0^&s´ªkahm`K¬¥BŽöC‘ Ñ ‘ î€#“@Ô º¢Dþ1é´&¨`™ã#vÔ…tÑÄ+Å~GŸ°¿ùåI¦k‡.Úˆ&½ˆ¬r‹ÜTmª1WÛÔÁ)<ƒûËONdÔ>»0i 2X Vº¼;.Q¾¨ƒIÓ¹,¾šÖš¶šðÜÈCá¹mU^ån´ …Ü‘½í½åÁ—#}­ûÿ (Q/^Nàtÿ€ì<á·â„-PFá˜ÊÂ=…$¿üÒÊ> stream xÚV PSW¾—s¯ŠÐ¯ÙöÞ¸>ÚŠâ£Ê¸ZQéjA[uuJÉò Á"Æ'EQyID¤…–ªKqudÔPíµ«]»‹³Vé¶®¶ÖµÝÿ¶';³7 ŽÝÇLædþä?ÿëûþï^šòõ¥hšöظ|}ÔÆ ѱ±sCÝ¿,x›˜¥Î£”Ò/(é9ZzÞGâÒ$ßç)Š~Ö}ÒòIÝ~Æ}N•±w)_šf84t^phhØ ]Vž>59Å ~qÛK깋¿<[ºX½\«Ñ§nKÈTG'R4Úƒld¨ctÛR5†<õ‹KR †¬ð“Éœ ÍÖé“—¾4[mJ5¤¨×k²5z£&I©Ë4¨×&h5jOÑÁž¯:mVŽA£WGë’4úL¹Nÿ¹Ôrz%åGm¢¨$:…JWdQzÊ@ïK¤~IM£fPs¨`*„ZH-¦"¨UT$µšŠ¢¢©µÔ:ê *†Š£6P[¨I>MùÈæEz]Ißô)ò¹¯ˆV\ñMô½¦œ£lF/ d&€)eþÅ&²§Ç)óÇNÉßù ‘†=¢.IŸsuØ¡ås±¥pO¡fáÆ¢Ü²ürcÖ±ú†=µüÜSy²›u…‡2ùÙ8CëÀµìEµÜ~,ç ¡HøÐ â Ý*¥)@”¹ân³5gâ|\¬!ã]¶ÉflÀ–²"‹eÞÉj[p=ÿ54ËL8Yhz¨„…¨iš2Ù$ÇoÆ ÂTß‚Û|xÏÁÂ}–Š\€Y²BÊá¬è2•d²;'ï ü›âQ%Á|©—ƒgÑM{tZbúêYÂtq:î’ýä<À^]{ƒ(xbDæíX›áÀuB«ËŒTßg¡|½œµ×PŽ@yqès‹[.‡aW“jލÀ<ºÙ¿9éõù‚{xf'}C„QqQnäv­`w™sÐc Lº jXóÀ,2E Œ«—“ÌwPö“)„%cÞ Dñ("Ð"Xd<"å&úQM«<›í¸@ Ñã©w¹Ì¿õZ’:¾¿ªCb±-5›Œ|$±0îÁL¡ÝI_éG¿NHJ®0¹8Ó’É–£]½ó º¬rW³›1ƒ ôò0l¸Cp™™tãHäp8]¶[™Co^"±{w0ÖìÛ]YR½»Æ5ÔTTÞ„Ê곬յýìe3ÓaÃÇÚõr1(¿m.ÞÎŽ´ûu?åâÖKä TdaöUO1Í22—Yïµ~ðrM/鬢\¥‡SêÊ[ð”öêŠnAªt0=¦zäpéÊ‘‘S*uÒŸ‰P$*¤8y¸í¨Î!5<\¸Ùà¬ÜAêÕ7nXsæŸ<Üigj[~Öë[Dn…Ü¿ë+àGšé–âpþÌ J;’¯zЛæé¢ 7 +ÉÌ¥0SÙØ42iÞ MüHŽÌ‰zeŽ·ü‡ž0ÙØ |¾%”†œ'ÿrg0 ‹3Ö s÷çÄ­C-ªŒ’OgÏø¨¼³mö‘„ x×¾’ 2˜OãþJ¦o#´¶üf¾·UY»ð«µñëa\…Ù?ÉX)¨zɪRðÄF~¼æ¯2váý½ÇØ"X˽ÌÈ mLÊKÞK0Øù¾€û¾è‚{YOAŸ8Aé |O„JQU?æ’±ùþê£á›…x©³Lå#¼xŠ„!U_ÚÑĺ­òÂÓA³‰Š<óå¬UA?þ°µí( é¾+™˜øEKW®ûtèî•ËW.õÅÄòrJxî"LpÒçDh–^1œíîôÚ7d"ô‚¼kþßÍ&÷~éhËÄ!—”îÎÍÙW¬Ã¯àWNçÁZ/r5W/œ»‚eÅÐWMw“ÕÓ}O„X9î2ø÷ݦKø_ãøÔÜ\Ö2Oõà2¿5JSæ¡7Vz™›oÁ*tÿZ÷ïÏÖèÖñÄ”Ä {µº½æŒòÖ¶'Œ“EÁGÞ‘àÀ(ßõÂN‚GÉ" Él%|ï)ewsú\æÍ^ ‚½‹´yýåŒ#!ÍÖô±Þðè‘*åÊ’tZú7ZFÇÛØD—YÞ ¯}ÃLé!Öx¶ƹ?ªA ¥\Y» ça6ÝÃ~~O L²qd·=%凼ʨú†zz{šjv¬á‰™É}4¬ÏžpúŸ.{d}ÆkqâN]RA§®! ³ªÁt¬5gç°ëXuÂ¥ \®Ýö$-þ ¤ªSÿ¨P€†y£º>¢wBˆ›^žäòš B8ÔsΟýøÚùˆùA«Ö¬úUÊíx2Ó·'áDqf¾÷wPA@Ø7S…-8>/5ƒUÝ;ZV£y’mÿ©X/*0G„È[ªS ——ùÎ…»0ž·f×›˜µ7Öµ6~¸HØ„_Ë‹bU×;=¼">^* ’ðQĪEL…[ä®þ!¿_ÈIÂdþè%ÄÁ¢QôXtÁvù™e4ñ‹ç{&æ¦àmRŠ‚>I¾zmðÄP¶¥¤•wðåÑëw0»Ÿqix„V.üÔÁYÓm¸³£•EæâÓÊ’*57¼0} >ÞÁCÓÓ{KªP˜}•Wåöàžƒ]m#Ü ûDèq?;àGÎÖh­ÀõlgÎåÉ×(­¤$Mx“ÉÅ9ïb[#ßï0ä2é3šÊKñŽ)©v|„—½7âZö<ó¸i ±3þE‡¤U°ì"yûçXqœÓÏOôÏõÍÓù‘ìþ á(Ž endstream endobj 397 0 obj <> stream xÚ%ŽoHqÆ·ÝÖ¥c•$MÌÝa/R’9-C„± &¡’y¸©skž»­·[k»}ï¦ûkâtJ‘‘Þõ‡ zÕ‹^çkÁÞôª7qwÝ 6|óyxž á8Â0Ìhº=:>vÍîp ÷ôÖ—95ý·¨p:¹É—1¹M#›µò%Ü||ÿgд!„þ\¨ó÷¹:¯ój š™&„c\«õºÅjíµûüá€gÚÍP®Nª§¿¿¯‹êµZû)›—x\ÎyÊádÜ´×ÉÔÊ5æsyh&Lu ¸Æ³»›eY‹Ó»`ñ¦;»(Öø©Qzé)jÈ7ÏP#N/Mº[NÃîóú:@9|St`!LcC#5ÅvÔ´„!ía³rÒ¨ "¹*²­Œ*7´Ò ¤mvßõ°“ÉH*&âk‰¬yë¸U9Ø3´gÖa;â$#†rð62Åç»GR“IÊéb—~´~B„w‚‰@8’‡Œ¹e±Ägý7xË @d‹°]à`‰¼©|rDÁM|9!F qž["ÔÇÕ[ÍÒéäP=Ñ•—PQtì½òI«„äÍÅ7›ûGi"½.”Š$H&xˆIý2„Åe â+Šæ K~åW—J&—U]uܤÎÈ•§›)aZT£žåj¿,l¯}Žž¥’jKõ•iåþBp8I<‹¦ÂѤÉ2|Ë@|Ðo@‰ß8ÕÏG…9#Ìfà5äļ˜“ZåS& ü*'qÕŸ¦µ1ž‡éÕa îÈöB±(ùwôêÃÂsÞW6œÍCãnÃ÷ÆÝ¬Á _üEp µ endstream endobj 399 0 obj <> stream xÚ]QMo„ ½ó+æ¸=4Ùnz0&~,‰‡~¤îþ…Ñ’T$¨ÿ}ìz€¼æ½™y$e]ÕF/|ºI6¸@¯r8O«“ÚÆAi¹Q¸åØZ’”o­}oG„äÆó«‘“Òfx¾ß»€Â>Ü6‹À¸®šm^p¬M?Aš€äk×›·Á)WS‡O>÷áº] N÷² ™fµöG4 P’eAŽÅ‰ö¶8ÛV¢kÍ€$¥4ƒTˆŒ QÿÞ^"£ëåwëHÊ.{%§ìœ‘´¸î˜Ò¼ðX\x\ŸyÀUÄUÐ>TøŸæÑ¾ôí«×Pɨg‰8O Šƒ‹ý„Þɇ‘runß1ØÜó‹jƒ±“õ¬p~9¶ˆ endstream endobj 324 0 obj <> stream xÚí\Yo7~ß_Ñï$Þ, ÓRl)²$KŠ‚ÖC騨y©e§ì<²¤î¼ÃÎÎuÞ{•Ø¡ÁÂPíM|„áÞu!l>ÑšN ô‰f+Ð9„. ìE¥‡IhTVMÅ×Å`l×H @XøVpe„„- ¾­ŒÐx íá;HDh¨EºÐI)5¶¨©à»ßF¥uH*P1HJX”T5À®T–*a¥¡»@TY 7ðž H ï’„{ZC©j €‡D kAªÚ@ÈMj§€-¤ª=H.¤Ž0Ü€à%,@w BÐá¦Ñ€®ZÆ*@Aaã:Ôš€Z az-H汑A­² ˜ÇbƒZ ÐÀ ÒzÄ9´ÄÒ èÓBMæqÚ_°éL„aç@_ŒBEõ æqѸ4/<*T 7¸4¯à ݽ† è´ôÎT±W@p@õ¤(hà& n‰ d ú"]`1 &z\3ÔœEú8À{\4 %‰¨D¤PÀQ\a‰´Ë@³e4 Žq‰Õ%â]\"01ârA=Aå¶öB¤ ‚¨) ¨YÀ@¦€*`£„w)Ô"Ðûô~=t\ ø(ï×ah½®S]Œ>&Æõ˜ÊúŽ7‘èx˜8µ³nÑ €HnÙu0,Êp¯ÔÛ±n¨·µ6Õ¦?Ss\r-ï²¢ª ³Šoúo]=b|)“T2d ¸ÎÈ”íãöÈ+":å]›ÚÊ’%Êõ²gCÉúÐËŽ¥û}ÝþòŸ£ÓÄ?õõ×AMë\ûÑ@Í¥’dp&ð<À=×I¤Æ¹V–u¯alûq0×C$ÔS*)ö3BÍ ¨ë“®–ý¸¬[׃|…$ô†[^—¤Ï G@àùÀC1zRA³àa1Ø,¨Ä¿ áû+è3 òL„J" “Ø4º4=ýý±ˆ @é+Èܲ}\º`ûk¦UÜK#¹fÖ‰k®—=Y¡{µf.K®p5¸uܺõ·`ã*˜Óýöû‘Âk¨L_—eÝ‹jÀ=ø¾Ù[„ûPk¹²‹i[@¬F® Kí½†Ry‡[_£‘ç:ß}LÉt¸iž^Ï,JB6žÕ[”º£~Πõ¡ïƒšˆa*à䔄žZbOƒ¨º~âßZµž('XJìœ.ðy™bÄ 3ÏD /jZ˜ên Z-yc¾f°Ó¨¢w?¢zsïðhd˜k\âŒßˆ]b.ÖAtðÇIÂI82ºÜ6.“ðR‹nF“вàÉ^jÜ¢}ŸvL7K‘ ùö„.V"d’CÛ¸tNeÁ”âh¤V-!‰­èÙ-* 2á¢@SÁa£Å‚L,;$k(0XRŠÿ¦C¿ 'Bžà)Œ&#hQ$޽«¦ˆ &µ~¾¬ÇAŽg¦·d$)æÇ¶òÏk2JØ“Æõíܲ;to¯‡]÷=æÏì䈿AèØÝCTbet?åáHH=³wìו-¸*#ˆñh ¿ yA¶Æ+p¡R”j(Hᜦ¥”Z)›³aEC\WdCaV™xãv^%·‹t-F}i\Ñ,½CSb,"ÎQ9ßqy}I5‘æþ6T=ñ˜ÖXIE8› u®IصÈÆû›¸¼eð†Ÿ’‘BLÄä Ã[ g\z‡~y,‚R°Öˆz?×ËžQ[hç’Wx# ¢µÕdSF•´Žì¬ôIÄ&ÅM˜ ‹­d"lgí×)^Å%ä°FC S¦Κ™‘&Õ!•žJ4!\£ícñ/¤ áuŸÆa‹Ñ‘¢Þ0˜è£¯°Î^‚AòJ–² äÁ‚^&UðOUPžZ%“„x V&àlÆ£¤ôÐç5R¦~8Eô¡Á#Ö¸©M`)rbLfÑ’®8:q’6)ê ÷ôҢƀä %¢1„™1mÕ=ǘ@{Bå)>x0SY¢®R e1篔bIGdN½ÓÉ\û`ƒH2$®ÝDÌÞÓVmšÝ’dH¹«¤Ù¢Z‰8d4¹7÷âC—¤Î‚Œ„µ©&R$—–Ks÷¸ JÕ oWg|v^uÏTWìܼˆ+¶7Ï‹G@&•e‹Èßý úëv-ø´…ÒBZ½V˶T¾™SBK„í]DÆÖ©Sn ©îû¥žŒn‹±~|H‹Qøi/S„ {ȸì >šÓR°$ .ÖšÎ4ºnçÁ}•ÈÙ‡t 7ž² Ýï£êÜ'HÇY–LÃSäO}é<¼” ; ²“÷ú£³ç“>»ÅÞQ¨ápìGãÒß*(©B“‰ÑRˆi2Õ ºàHì…;ÅYCDÓ_ÙÌE5xÆ«)ªüšsƒ&a_ò‡‚qߎ¢`æØ¥½c ÆÀ=áé™§#k ª=¡ÞÓÁ¦££khM𾤠F‚Æ:p‘ÀmPɽGòB}b ûà“Б>A% 0¡=,¶!ÐVé9$_8Xþⱌt<ß>2•ç ª~¶hW>Ÿ±œq[â4Gœù[™ýØ À–^û!ûð1u½(} “·”‹èjd¼fT½šûdÉð ¤Ä؉âhÏÑó7|ðáÑvY—¬º ¡¢>.‹(m|Fféi˜OesÇ &\ǘ%>ªd:Ã앆ðÃ,~,=´2òãê¹ö’RW™9êM SíGz ’ÌžjÂM ë2Œ}cÏÚÀ¢èY÷N„TÃó[-Mq·ƒO­zàBž|è'è5CslºoøP6,Õ¹ä9éɧf%fó¤»j“ýæNqKUËÆ!múF (sæ’ó][­¥>5𑟈¶§ÃAØÑF ÞÒ_{W}§1SckÀíxB9œH-;}s}0À^küÒ#òWœ X™æ°¼Z,Xëã|Q‰xž 1°qÙ½—ý¬`ÁèTòø cb|/ŽžmÞz}¿-8lÛ_!l’Ÿ€¹“m㌽ooks¨Ô}–Ó˜žiúû›,éûÅçù¶ã^ã¾ý½öN=E½¼×ö+é•seIêdÍŠ§aãÜï¿ß8ûûÏÅÆÞ§ÛûÓ¿þuØ"7.n~½ÿýŽ\™èN6ön>ßÝoÿ~ýÔãÍuª+k7voßúõæö½ï†]Ï>½»½¶z1jÙº¾[Ðg§û‡—ÇßîJ¯Í»³¸{ÿùæÏûOŸéUOèÿÏVŒ 6¶¯ÿÜ_Ü|øýb³±y÷~q Õh7°Ö×dÔ÷×oÞoÞ~ø¸èÄÆéýâsˆÛ6ö>^¸ëÑÜÚúôŸŸ×¤7Ýš¦6‡@!þB7÷n>.4¬ÜòÊ¡åèúEË|Ãå2ø\ Ÿ+à3ƒïíöÉëó}æ@ 1†O¾,|‡­iEï, Œ³jø| _Ãüjø $Ã’  …:J)°.ß|·}xúÓ„¢©ùHé)‘qHkÒ¬ “ù2R^PiÑ­E|71ó¾V4%j¤JÎçi™’ (2ª¯ß¥ç‡[‡— ©­Ktƒcðô|ðüãÕL©ˆ»_Öø„¯OÕà5ÌÏÄO?¡‘{ýæôâ§d'&á3/¼K>|—R<—®ákŒ\ÃüLøÜò=©`öN¶O7"½vcTìsíH«¦v$Xþˆ/kÐ.\ JcºJÆg"DÔ#öãÁÁåé«M’‰ˆS å^V¡¢C…Ÿ€)T¬±k˜ŸŸ+¼¦”þaûñjwûp 88;›†ÏφOfÍsR ð)%`Î$øüѤŸÎSÁ§e³kæg§ZwðõÊ÷ö§­ãƒód@gFè…¶f¡9ŒÅZ71GÍüLôF¯}DÄ{ôúêðœÝ‘1Ê_Ö—Ê|©³øž¬­ák#Þšù™ð¹'4}ç?\o&o>¡}R¼p(âûPB†¨E _ã6ægG¼ºŽxuñÊb;K@wyÏ./ÏÎÀOȱªIùÖESbe–»Y?éfÁ­)‹ç)ßã®3mà[ò?.#+¸Ì ã‰G¡[¯¯.ßÂl'S`©§«W,' H0AÁÔXµ’ñy{Ò´&M†ÒŸ1ÚÑÉÙÎÉ)‰`œ5Iý¼¦4H™ dwch‹U²?š§4WW{?\½å?• KóÂæJ÷Ö]«jkosÕ0?¾ð„™Ó›íý­«] v¦­½}êX£NÄ”þEÓBŽ¢]ÓD»Í æahGÑ®^r¦qp|úîÝ1îü‰ÍéžËby7¡[àæ“Åòãmi›(¶à{¶Y·ª2ëV¯:÷1F?îî½¢dmÊ®ûg;ø™Ô<»ˆŽ¬þä¥ÞÖÔ0U¬ÏÔÛêNaÙíÃ¥óƒóã NÕ”õzÙPöÍ;ÏPQ‡;×8Åšù™èù§Coÿ‡­·g[Ì€›B/¾,z”f"z^âï>ë4Ó†½†ù™èµ©þëÿÑñî›wgd:'Ót%þÆâ±|x†¿+¨ÓM×įÍæ¡èFg·zIxÿãÑ«ãW{ÜÄ1<ÏÝ›eÖ-9;r®9™-ÙŸ Mkó[¶¾Û|{ºÏ™ÃøhQ}],ogBì4l12 Ò“2Ý/¹Ÿí­ü£s«ÒžÂ?îî£/žP"ýl1„™Š!²ú@41© O ¾çcTgÒ.ÎŒ!®®@"›äˆ'@2ÏBè¥!þ—iè?AT(ùÆ•œÏ†É×´W«²E!œv.Ž^Ál»—±–š®‹/ÁÔ«‘ñS®3D ²  Þ×FÚ7ÙsÅó<;äG'‚…Öìï^í¾Úùîðtóp ÷ôhL8þЭ‡ÿ\ÿ׺ƢI—+ŽgbáV„LU²²}²spLAÿ„IöÏeh‚ž %û3„¨G†Æ7†¦à{þª o +|º+üÖñùÞÎñ>`kRepÛÇ(Í7ka)°·dte HÙ”,ÏV™ +• ­ ž‚zÏÄQ4ÙØ7iñôøLyn0íˆO 762¹Á¶ø ,ÏÔ·âŒ-mîþÖÉ›£ïÞíNl -_Äæ®I°-Tà?¨£¢Æ£±0Ó3 ËCï ¼ÿúÇ·{Dúb õ䀄å”´UàBf—1\Ô¨4gg5ëó`‰be ÂzH úÃñÕæv:z=M¿ð‹/2ßJßEY€Ä挭a~&~m¨§c|>èQñéÎéþ>=«ž<¾Õæe´ <¹uø­„¸ Ö¾Ø>*®™Ÿ ß(0ŒKr÷­‹Í“7`‘ü™ùÛRÈÈõ€§MÐ_ã¯Ø<ܯ_}‰é®øž Jk»]a»}áÉ6÷vO.øa y„‰{Ö g'Wöi»PãŒ46f¼âŸŵõ[¹Ý¼½»É×;7¿ý¶ø¼¸}¿¸ûYn\¿ÿë~ÑB/n½¾û}cñ~­¿ÿ›6á¿ÿút¿øLË“Ql|øëæãÇÅŸî?.~»Ç>C u¢¦ëßnn ä—>×B®Å¾¦D®É\S¹frÍæšËµLYeÊ*SÖ™²Î”u¦¬u®å9tžCç9tžCç9tžÃä9LžÃà¿ßzØN +3®òÌ&÷ryf—gvyf—gvy„Ï3û¼&Ÿ)û¼&Ÿ)ûLÙgÊ>Sö™rÈ”Cæ;ä9Bž#ä9Bž#ä9Bž#ä9Bž#æ9bž#æ9bž#æ9bž#æ9¢ÿÔü¿Þ²ŒÓ endstream endobj 437 0 obj <<84b0a14030c697fc5bf3fffafd1a82cc>]/Size 438/W[1 3 2]/Filter/FlateDecode/Length 1136>> stream xÚ5ÖkPeÇñç÷<û¨ ˆ€"àõ Š  Þ¼!Šˆâ Añ¦]ÔLSC´L4𖉙*bi¥Vˆ–$™¾È56cÓT659965cÙ”Æùñß7ŸùÏwwöìî9¬RJ=~¬•òWÍô ¥R”‡ö£ýi$¢ƒh B‡Â{¬â æJ¨Ì³¹u8IGA™›²4ƒ=‘Žò} [5Ã>Ž&Ñd:‰N¦SèTšNgжϒ”*kšÅž åy(Ý¡s¡†”J±tTR„”vô ¨é祴§ÙP¹R:Ð\®?—¶î_òŸlõ¡  ÖÜ•âKBU—Ò‘.‚ÚµDJ'ºªöˆ?šU÷£”δêÜx)þt)T³{¶]h!ÔMwåZõ} ”@ZÊ3Ϻ×Gz]õð[)]é“€Ïv)Ýè äo)Át%ЯEJwZÄÅJ ¡åÀØo¤„Ò§´¤„Ñg€œJ)=è³@ñ1)=é Ü=ª] lt¯@oútPû“”¾ôàp¸}8}BJ8Ý\¼ ¥Ý\k’A7_ÝÒŸ¾Äk› ÜY+}Ý Ü»#%’nãž ¿~–>¾ í”H‰¢¯@®M·óØÅ4Úã~ãÑ*èØx)ƒéNè÷¯ÇÐ]ЩîSK_ƒÎê%e­†Î».%Žî. “2”î…^·RÊ0ºgU@ i1ô&÷ü‡ÓýÐU›¥Œ ¯C,2’„> %žÖBŸ9%e=Ý” %¾ }=OJ"= }˽k£é1žU ôm÷ Œ¡oCÿR#e,­ƒþ3YÊ8zú‘ûOOÀø¸÷+‰ž‚ š*em€ n”’LOÃxnI™H߉Þ+e}&>]J }&ñ¾”Éô}˜´1RRé0³š¥L¡ç`rNJI£çaо2•~Sö¯”iôc˜õ«¥¤ÓF˜mó¤L§aªgK™A›`jÝû8“~JKh&Osh]B—ÑbZIŸ¢«èjúÝ@×Ó-´‚¥;è«t7­¡oÐô}‹~BëéIz–ž¡Ò ô2½D?ƒ©s÷®Âœ­÷þglt¯a LÓ™?‡ù’ÏLëS§`¯y¼{~-0¿}'³†¹Ÿ.³ä'³'ô²ÌΜ2·ƒS¸µu5gG¸”öpª2¼¥þ®”pBeösé‘̾pnËÜÎ]ÈÜ ¶g´÷<=Rü`ëeî ½[fØ8wµ.°£öË›þXæ@Øœ{ÞÕò"¥Áægyˆߥt…Ýå-RºÁnY%s0lUŒÌÝaw^öîYÝ(%¶Æý¤¡°{þñnÝ× % v¿{å{À¸*sOض_›Ö¹ì¡L™{ÃuWîÛX.s_Øæ?d^Ûâ®N#è:FÓÁ4–ÆÑat§ t4KÇÓ t"M¡©4N£ÓéLÚö&Öö6Õöþ3fÓùt]D—Ð|º”Ñe´ööB¥þ< endstream endobj startxref 383837 %%EOF glpk-5.0/doc/notes/simplex2.pdf0000666000062000006210000100356313766346220015651 0ustar maomkpasswd%PDF-1.5 %äðíø 13 0 obj <> stream xÚ¥W]¯7 }ï¯È㬴òá$3UÐ ª¶Ø7–DBâQ ñ÷ëø#ÉÌîå‚н£ÙqlçøøÄk>oþySþ;óöÆüv2÷žxã‹ >™Ó;ãýj—ÅÌ l*æôÏ«éœ#„sL/޹^¿ƒ„ßÉUb}˜£[%‡®N¯(ÖὟùeý2“ûC(øàðúô—ñήfÞ®ó˜8ðüIþ“|W3qòìªËšE¨+\½ƒÏq(²‹bWø9g~.å| à÷ž„®‰@ÉÑ03x[AbLœEÇ!ã­ÏýÄ_:Ð3åé‡$ž£)v-ÕoYíš ØÙ«sñJô¹›Šmñ-¼l7’#ãÆeáT‚óY“‚xXüdÅ3˜4VÇ«…HnÃèV«I¹‡C¬(n1O©{š=B”<~ëWuVs‰+Ut(OR"Õ·Ë$äÈ  Ö ͬÀ~5±EJH^œ¬¤¤1¨øò–,@7؉Á¾5ç¤¥Ô †gŠS„¹C<¢b‹ùCdm1{Hý$øgÂ~ö`W$$qDÐ&ší½kÄÈ;ÈZïhçíÊtGKçÛZzi8ªŸº¶µ£T¤ù^]îʈVG"¥ìNý–±ªn´PÆpR©åµ]e½gÌÃî‹tŠ6¦o”v˜Ò]§A)GuƒYÉ]V&Wú@EÎ@^Ç®W`ËhI.o»dÏÁïÜ‚}î+v¬E=JŠ$#xÔdk‚U¹Y:7jÛ!WN#ÞJo¨bÒI˜›Ü5xØ"Ê0¦%³Q¢Õó`úãéó¿|Û UT¶K”î$·· ¹ò/‹örŠqРᘹ8(9úõ3Pß&M:‰>Vo%îTŽmŠ~—4ôìåŸU›âô;,+#WôÇí4¤çp£ƒþ6=lè¨í,h7wD²gKöå´Cµõ.”XªZ‡ &ƒ®fag릱tõõ¼+öüö•m5Š+½ëj¥yhgRéqëI¶eÎ~Ÿ›ºùBðU 姉êÚA£t¬4‘$ÇmèÉÍLÍ£ný›â¬ú%˺ƒÐÇ<× Úg, m)ÜF£ï¢¯×VÚ‡›J¢¸&mcŽ€%mSSà.'Ó4%Ø,bÔ0r~ë¸QGµ ´b¤­éxÝŸeÉs>>™ÏÆÆu1_kR9›Ìñ ŽóúøÑ¼4/xÎÏ&áà¹Ð˜l(hÐFÚ>|³ ÍrµÃÙ§ºh½ÈF†~ÔpUª…Ý”¤¡õ¸ÝŒo¬ÕRë=Lã¨ÅM}Ôª“WØiñíxR£¬¶ÁV“7iùaâ ܱH%M–Óy<ß¼ùðñ¾ ·tä‹Ã±#Üܼùôðý¿_ì§ÿÞÿz‰rÆ‹˜êœ¾Ò ·òx½‹u8póO¯õñËÿ–)L endstream endobj 19 0 obj <> stream xÚíZKsä4¾ó+æl¤V«e_Y–¢8@¨T*;ª²EÈ> øõèѲ$[3ãÉÎ,É„ÊNvbË’ýõëëO^ý¹’+aäÊ€ý'V×oV_œ¯>ÿJÚcØ)¤Õù=ßJÑ öûëŸÏ.È ¥©QÂ~G´}¡H4Jº¿ãqaÇØãZ¸óÍ/ç߸IåÊÍ#ž°C?§lÚÜe’ìp;½‘㥭êÝÄd „Åâ¢qcüH²3ÆNì¦D^sÈ–lu§íèNóÂ]Z Iî±D†oý#ÚUMXAÛaÊ? !ŸqG1Œ&ˆg¥²ÓÚÆ'òCp „Éš–ˆÎº¦ÕBœØR ÃÀ‹€²f”aDYH†‘uvuv4Š­PÁÂFÌ,mG€¡w:o1c‚-œ]’¥¦&0™ €ä) Mu´UòiÕôÀÑ£U@ÈEQÂÒ!åqsxò™è×î ƒŒ>…Y‹à0ìºAÜ=äIy¶®aɳ‘±õ^˜ÐŠYKó ìwf û½E5œfƨ L5”õÁó.´VÊ)°#§h‚§ƒ²©¡L{û²C=«2å—O´âÑÀî,[N.š 5Ð{c¸„B§èÎCû´’:0‚H€öÞ“#wÖ@¤-ÂñvXV€T*@`(H¶kû}UÁÁùÓÚkF¾ŽõG O±(I!†½(a>ný™HD‡²gõ©vDi¬!]V Ï…D0&ò¥¬ñ_†¶éåsè7‹|Ù{mbôhŸ;¤2}K=J$]ÒEKž S¯õ"©³²0ÑŒ·ržÀJ†áyè". (Y-è(;_ÐÕÀÂw¦¥‡¼¯ºÀýæT¯YÄ'S×ÿF𨋽”‘-`¦5ªfÔ rݱ²N…A ˜sµ°Ŭ•àï$è8¹æïï»-óª(YñF2Ù6ÌF``ÜzÂõ݈žl«JiÂŒȬÍ-M3ÍHq;ýNæ*¿¦Œ9BjèË|j´äFŸÚ©"”M e\ˆòâ|8jЇõÝ=v!ƒ‘ƒ Ç®²õɦ¬£M[¡\T¤z¤âÙ£M¥ý²úÌ«G¬“å8ÌD½@b`-L"@–§“¬:nç{OÍ•ÝÅÒœ§wTéN¼ãâ¤Rö…ò'Rm^šÕÄù½/lôÝ=¹únÐßæ}2í¾bÂåÕ·?¾øú‡Ÿ¾çà@ûn•]U `î’BÆ’·@ iÑÀGsJFµÛE‡cOòìíCðïËk·Yó›KSïÿ¹¿|»¾å$’A¦™sÎ>TòÌ:lý¤- °ßü Bú߈ç·v´ÑêÒq¬È l…íÝë9lŸÊg S> stream xÚÕ’;K1Ç{?Å”I±q^I6íV'n#®r‡œ… wXè§7¯S‹-DÝ0Ùÿ<6ó›À3`~"çaý‹ NϺ„ ¦{PrÌ0!À´¹1³PtìØc ³²Ìëjmy4[ËѼ¼­WÛ»ÝîaoV13r(;͙ʳDÉ–fña–€÷YõÍ£˜WÌZ¶š¯D{úˆŽ-:`³^»õÇ¢UÛŸ›ÚjnÚ׬r2¯%˛Ϛ¡f–ÎZ¥ZEíít¢.Rf#ÎûΆ};è«õYQ4Îñ;£)ý0ò_BB£¡rŽ€¬—LÚ%ËXûÈ*Ö2&îßÒ1Æ—Q‹°éc+žX2WËëÅ2—“ñ×[ùë‰5t±¢£„# A’¥²“ê8›àòäƒ0Í- endstream endobj 35 0 obj <> stream xÚÍ\K·¾çWLn3ÈÃGñeC H90¢›VÇAÛ’bø×‡EV‘ì6»G´ؙn6Y¬*Öã«ê=ýrR'™þ©“×é¿<ýðáôêÍé¯Wéîôæ?éþUIÓç¿=«KúãùÙ(÷l@=Ÿ~¬LŸíåjœOw\º¯¤(¿­-£¼¿¼{ó\BŸ”ÑZZBGáMYBà"JCšJË‹‘é7Ȳ˜M‹:_¦²i˜ñ8ÊÝÁ«PF;w-jÒ¿¦Ëž&ÊCÊÄe2¢)žp£22IVXŸIz6§s8.’På§-HHÚ½¤q™Ü6ƒ-#¬¡'ˆ6çhs’G[ZËzš'=á¡<áÌE#Çq¶¼¾*ß—ÓÓ™5šXSéÇϰ$L·mí‚Ð6í¾lÛÉ‹ò?Øÿ/:“ÜdpËØà„3u•L2e$Ús5(óS‘6¡þá=W9åIîš×½&BDI}@=+ š&Â, Kš’D×)ìÕu~žhRGõóå‰Æç …ýxEŸiSùèrí­z÷ ‹:&©Ä%4„U™ðßx”íY)l N¾΢„Õ4ààN^D·A¤cŸVÈ÷ߌ&H¢R§+ùuLƒcuùˆôI­iðK®J8È#ø$ªÐMá…÷§:äÏ#*’„#Ð*~ü˜‡¨ Ðj‘¦%Ë5 . iÄ7£y¬«êù2š!É(¬…¬^¥¼»'-æÔ¿†3Ä(¶!½¹!'nH ©óÈ÷#©8Q̈́԰·¡_GSD¡ý9X…?™b…yOLåIo²®`CZ$sÄT;BfzSº = ãÖÛ· ºB¬ ‘ÌA²açáDN˜°ž¨ãd)/¾êçÑRU´n2Ù}Ó„Q*;r«;g’³#“›Oç쪻O?­­}K6΢ým@PD£}Kzȼ„!/J»ø¸õDý¹w¡SÞÇ>È„N{7Î}X±_ÎÎ}á‘oüÁ‘Å ó]ç»\†çQâoÒnÏ ó~´i/´º—¿ïoùk„v±«+þº¸Ï_⸎?–´ÙG¡féwœ|‰;•Î$RŠm‰ÛÚû-nÛ&¶OÃpÃ>€Û^·ä6%FÜ^ÜÅD3Û[»àz%§<Ö‡y,Š•Ñ£^UJµ8ò“–rCÄ" sÉ! æÏÒ˸Ģ4OØ$ž¬©•6@.i Y­½PfIšh—‡$B'YÂÈ‚˜î³.[^"—`ÎO̱šç]0†:Ê®êsªaŽ< ƒ- ‚„s ÷ø‘–Š3žÞç:Tص2a[ï“Ã8Õ/F)Ê·Yï¥Tk#TË[GC‹œg'tN©êI½©ZßSœ’ÍÔŒ¨ÅOLìE ÇQ jGIAVå€Ëðƒ+øN±ªNp •Çï«]šža/àØ¬ Sæ9¶Nš7Oõ!¢ñ´ =®ÇªæÎ=ªÙci& Ò@ÃÒT K¸9³WH‰c\ºsU§Ü¹¡c®³fÛbáÆr\2Â:µ 9Crç,iÁye ºj@Ø©ï> «øõæXíƒ9l6vYeDñ–Þ!­”ê@&–×›Fà­ô3è7uÓ* J«jR0ném¢3ñ€Ö“õ£¨²ÖÒ.Ýg:’ #C'+3ϯ¯N£Í"’¥ªB‡ç}›žxÑ•å+—«êvÓß=.0‘}¨M^kt$ÒÑ6ì‡?XéôQ ǺšÅŠXs_Ä~åAœy›A¿E¬ª»ì«Wt€P›ÐÙ²H8¼ï¨Û)ý0F|BÛv™™Åì»Ðy óüs 4ÔòÃË‘™S ×,¼"S3'bÓÛÛJI|\xJ©ËþŽ÷1¤dÿ>yüÍäõ\(J°ó9¼’N˜fß¡%¡4Â<à°J)‰\éÔm$Ö[z­0,)»ùï÷G?Ú6GôrÃaTÛvÁó#Ç^#-WØ}}•ãöÌ;_saE½3 2­i`Â˱’x=S2ëÌG— BîjŠZȵ=Y&ºÁ†GŠ/;.FŒJòWƒ©ý*Ra^×¼TMä•ݤhÙŒø¾ÒíåM@‡Í:ªÅg<¶¯–çâþºj¯Tí9FÚ¢2ÛCTrP*Ûˆ…_*³[L7"øÑdó“§@ÐÙ—?xKÆÊ§5;t`‡¾¶Å=]F?ñ"°‚&h³cZ–]æÅ^¡±àu(Qƒ\ÖAh”'°Ž¤›§!ÐÃÝö,”‘0Ñ­R®ªCq“ÖϨ·®·ǧ¶uê,2ÓSØ/œÆ±±;´àjô!HçiÈôÎS K½¸œùAËü\”­\CËŽ5ݮƀtšG—‰ ©rLìpç5ØSê=Ý-4,¥ß>—¢`!±µ]m;øÐŒðñwxHâ>aÿÀ&­ˆzqH´ƒCRFl´Ë¥»Ûcgn<‚!»=0ÄŠ­ðˬ¥ãgÒùÂõXÃKgªáǤ³¡á¡½”s<ÊßÓlD³?s¹Cšm¢ÙênͶ¬´i8ìh8–œOËz)5 qÕª.³jxZ¢Å­’µš­ÞK;ÒÝÝJ™ò¼ËNeKÏîÊ¥«[•íìe˜—Ó¿j-»ËCKwWoŸ¨§ZËÇVßA{-’ÁÐ-ÈõæeÏL"p³RÞnV †ËùmGÛ8V“âð\n£óÒ‘ôÛÆ;Ô•_qÕ.ƒüŠ?ѨR§gxøÖäQö` ôñn­a tØnÎÖ¾¶I„ÄÙU=ÔRC¹Àuœq®.¦5a§–KÏÈÅÓv÷¹¬5Zº›¾¢Åû8]as¡ ¤VóJ€7cפ$t äÑ’]Áõ5îÀ êýAçT®ÈAµ›GÄÚš ¶zªÞeÏÂE#ÀOLQµ«Öi÷Êëf›2Ÿ¢WÃ>Ù§~Ox‚×ãó\_yÀJ;è{ÈnÇPæ¶#ŸÜñ®ô·ãW€ûäã‹ÑLKVåooN¿œDÊSOÿÃâ¤K¡qÊZ>¤]{|‰œ¾¿?ýóô]ùóZaœƒ¦)'ñ`Ò hm´¬Ç(ѹ"…E2la%×ÿð —vj;sÍ^-#H\CdçU»JWeþKÔÕXžâßëkËÀöÏÊÖWšk…Ë‚Ûæ¤ú÷@êý1í/$¯ž`šý­z:6‰(OæNb,O¦ðའ  ·áèü¶p±YèßýéÿŸ›R. endstream endobj 38 0 obj <> stream xÚ½[I\¹ ¾çWTn]˜.EÔ.|°äƒ}Kå26zà$ƒA~}DízE½¥«<°Û] ŸD‘‘ôé¿'8ñðNV„¿üôùÛéãËéOñ'àÌszy __ð9½|ùûÓU*y«ð£Ïÿxùk Õ= Â+\é?f‚~APLÚüý• s¾hîŠZãŠáG\¥•WixøÌœ…ÁÝLÙ1ÑEÚð½µø4ò£UúĈü$¾Æ§8Rx¤°¸~›N`mZS‹³Àý%qðÀ„Èì~#Žã™vùëçry+@†²Àx:š–³cD! •í×ÁáZñ9H‡Â÷Jì*ÍD‘î‚]Ç`ÊndY$6‘Å(KhŸ™À‚5—¸êEºprÀ!™Ö²àõù¢JÇ“Ûü ¤S£‚µB*Ȫ‰ò,›…ªõsYTóú nË#Qä¼_$ 7 Jö(‚éSäó¬ùÍk „-=¬MG*ï\1Ud~Í:Fm¦cð|þ÷^çÛF3/·¹Îf$|ËtÌTû;?“(L’OÔ‘Èz &–¸(í™0=>ŠõvK«Zà¼bZd¼ÒÙ¦È2p¹4ÉyÍœ[ l¢·ÍbÓñЪ…Ÿ¨%ÞRÞ‹2…¢Ä¡~CPL¾ê¹©]RGpÚŒCÅ<>”'L/ݯsM¶úDe]qÓ ìZ¡bÒ‡Ôœ•v& ßÚÎúa©½C#n!e©/jx%m©Ë8ƒ-i+g¶äZ"ýJ©jÓa@á5ôžs³åú?ÜóçÁ(eK ”UzùóøYDZYƒ·Æy±Ü¼^×8¯ÙÄí¬{ûL½£¿lôsƪ¶838#ÎN<±Òç ¦ ¼!ß….ËôWùÔÝ¢±¬±ãÇwöy>ÑEn»¢×™ºW ŠçÁ…uÖÐÏkQj7²ßW>ßßÖº}ˆ|F‡ÁŠ_RP³ç|×uE6€•)>UãJ^Õò…Eóêÿy7‘÷{7qG!-ºÏÌ¢£>:%ÑêÜ¥»«‰tì)¬kõ%+ÁÇæKL3œ-ÞXLÒšÀ—ÃN˾.YY¼˜Ô}ÕØê‰ºuÓ®OBb~˜¹–“ ’ãB#ÀöˆËnKK쓇N\W)l3½Û|%è#ƒ§¬Åæv8µ¼Øtg£ µ!3ðð°JŸ^¯ô‰àPvOvCHiŒ½DP4Þí€w·ÃŸõkõà{¸~w$»›ýðÄJwÓßÙÝÜêÒ©¡» ! Ó9 k#›Åçß¡;©×:ÛÉ•W:6Õ+æ‡R‚GÐ+“›ýeòRñœgüB1€{ï™;Ãh»@m%“G‚mMº<> HCJŒ øË'?®EÓëÁzY®¿²ÝÌj¬·*ç Ú¶ì¹–ûÚÉpo¤®> stream xÚ½M,9íίhnÝÚéïT-⸭˜Ûx ±ï°?Ÿ8ާ*骞Ð{£î®rÇñ·ÛÏ7sÓùŸ¹%›ÿëÛ—¯·ß½ß~õ‡õf´Zõz{ÿ{~ý„ñöþ·ïλ‡Mðéó_xüùýÞx1ÀjÖ<¬Àkg&c•óæ7g°þþqMfåÃ`²xKjM•µE}úÇh9§ÜrcG…‘Û\•O¼Ž§O lÓÂ6?\ÈŸ1ÿ…˜?5¼]óÛ‰àm¬DÉoƒFÈ2ÊÕOCóx¢Œ0~‡<Í yeãSâÕâ~\Y-ÕUêï`ž ˆ7ÿ¢©¨Ù:åÝ(ûñx>)ëEø¨“ ¼K™´•5¾›œóbnOºpÖ“ãÍ{u+6fÈ̺(cÊëŽJ*:윞>:•bæ© *Û=ÄX«ä÷»aÞý‡ÖzH%£ÖÐSÉû0£R’â5[“‰$×ü¶tZéNbœ™JLæcöªÔ”9OI ®.¥W«RQV!‰ 4ÁÞYºËœ1Œà‡òy­DsÔx!™hPæZ>㪴ï˜ìªˆ „#QÏg÷t€{vž®Ë•ó±bÿ¶Ýá¢*È› VÀ}QÁU±î±ð´®îÄ"¶å0<¢` ä½#âÃ7x¾´çgQ‹pІgUsE#ã³¥hš„ª±_Q7¡t Úë Õ$'aWNÒYƒI¸š´Ã¬µ•éÕÞî³o•$M{o—.™bÌL[ÁÍÚŠ¼z~jhôU-EÊ¢Îóʬ"ÄTS)BáŒC…“ ªrdN+·1Õ‚F¢b£¹âT!¸íÄxq®4¤9a©p¾‘¥Â7[KÕ60²Tu¶‰¥ªc-ï⺥ÊzˆÉ"-MEvÇÞcJÖ¹ñ¡·[Nn¶‰ÉÖJÉTCm dU¼FPôFÒ³«ì1Bû'oN·H­ÎÚÖºœô¸å¼éàÐO¶§ÏaR~kYIéUÏ`œ¼|3£Òù¤mµKµ­lkù…$]j®Tèðç¡z¯ÃCSëå•;E–Žw³Ñq²~kZ¨°ƒñt†÷ú"ÍdÂ.m'F„¦ü¥Upñ½hÛ+".ÂIhÖ¨áÛÕ)àj€½‹PÑêUÅÆe©êÇí´2å‚m¼š Ʊ[ 蘭ݽÏmʈ‡lpt½_$PúLõ q$WÑ;J¤ðÝ4$‰F¿/)ä Ðú¯„§¶Œr§’OŠ8Øb5Ôê¦sÊ.e6£2ªÆ”,·öÒ“˜×¹|•Íì¼(ä`Â%q³ë›°A…¥nIOŠ@ó¡7à’úkxï‘INž­D’˜­ëêà"ž«¬BKü¢W:´«¡f…9ÏÚã‘0Zö¨ L d%DKya›§v8º„¬”·¨|Îë–Ç9¸\©ŽƒÈ„ΊÓȽSX5ŽÍ!ùM¶SVÎ^P&MBXå¶:ªN¦éž y/mÚ¶ðKÒ‰òylErž|b‰ØI?]' ‚#QŠœÈbll•îÏ)Áz9Vˆ»ÏL)m†ô²còà·´‰jjuÖ4o±…#ù2«l¿9­º’Q»¨y~ ûêWðiUÃ"»ÞÏI"„2˜Ó³K¤ÔÌ uDÍÐ.éÞ,] Ð™âbzœð•y ù‘üb—0%>U/–tä—I|-Ê ³•N²x½•IöÊæ&ÖfžC V.à}<@arÿB-¤ åÆoò"PØ8¹AËLñÚ"÷ڟh™‰¢e¦ÁÛiËLMúÂŒ®mZctjøÖWoÜ%ï…ÚNÜÈPËœ⑾âã ¼¯mŽ\ªòº>œ[£4ðÅ 2ÛÕˆo(s—D!ÒRvïÙ{cA ÿP4“¶ôm«ÄJ{…”ߦOV&ÙÀ\¢Ÿ–§æ&ŠK^\=BEÑN…Ëe›2Î¥š—žÈÙ `+Ç™mJÊ'+ÞÛ^F+.Ã×vµ‹âì L¶«3ö`¤h.ï¿öúS٢ߓ§¿aë⢢á>ÞÑLFøë¾Ñ«¸@¯byÿ>š ÂO™õ¯J“±ünÒ¨¹?íÑpÐü{„†ÄbÚK ß± b/‡ˆþkØìì¯ÑëEƒèËžÔ‹¸~ÙÓÃ# Q×5¯²tm¦)¶Æì_›c]s?¾þå?˜fq«2Üx{7#ìVEñÓ÷ã–pæ븿µ›B}Ȭ 1øíþHe–K¼3å`–ƒ_7G3þû<óäo9 ç•5×á$Іí¾Ù!ûÙ!‡î"pŽnf¹E­î3·©:®7©¶­'ò¶Ø^'*Âõæ2:×Õ¾,n¬»ààú áFz%O^ek•_)ísПҾ[V†Û<6í Ë]í¦Ž’ÁSWkïº_·á.§uså[2«æ’ºà{s3mTÐY²2ô7¥ '€EufÓ›8Hd%®4u^ËZO÷P¬é#듪FZÒŠ;cï·—’Àu¸ ôK[¿*·¶kŽ¢êñ¥®Žð~®ØëÙ,˜i™_Ú `êdhp“Z¢,p4X™¤Œ®Å¨Ñ cħË.CÜĈÇD8ðÿO¡Õ5×Öïl&A Ý“2PúfžS¬ùû÷ÛÏ·LÊåöoH’Ä,J1Þ¾fg()Ë¿ºýéöÞâµ&sÄ ÜP.búlËb¦µ3];Q‚‹|y`‰ØL¹†¸¢Ð›n„eÒPRF16BõÉ:⨩@qf8Q«_MçPOÎå·‰˜= re}©;³Ö_íJ½L1vßZÊ;.XmF‰‡oxTØ‚΢¦ö4 ‹Ý½ìmy™3`°€4Ô±5€µë„渡F-/6ó. Ë”mF¶Üê:i•©ØœdÎÈØÍ[eðj N»A·krˆËAé«m*³Ò½KyvWìÏÝ-ÙvcC®9ÓJsé²$5Ž5 Çmî„>±öU28Þ ùÛ<åûºôä3×BÝ'®…Þž'§Q}QÔ©2½ªFÚšì%esfWµ óÉüð‹ÿc5ìù endstream endobj 48 0 obj <> stream xÚåM¯$7ñί˜pš§Ì4þ¶{7Ab%8pˆ±7âBö‚ŸËå²Ën÷×Ì{Ë%«×Ó]m—Ëõ]å¾ür‘ÿ“¯âÿâòӗ˧ϗßüa¾H1Íb¾|þG||‡îòùï¾¾jé_µu¯ÚÉøW½(ÅßV¿joà^|¦_îZxbã?ñªÃkïá_y*àjŽW&¾eâs'pDgGðFDü+êÈ.Žìë|žÆÁ¿Öä¿ôð/ùüǸJiØ2• Óâja™ÿ!wñÓìá¹›”Ž”˜|HÿÌœRa êR Z,ÉDtá®ñ¸hFHK÷DŸ h,‘‰FH„€ªFàlC!«È¢ò6¨LVп+o&ËÒ“µ„µCŒ'"¼·NÒQk.Ôòr2ò¢‰mÌ€Z~ò—»®Œ•pt/'uÍØzú ÙB"£NÔT^ÆéN,Y˜ØDfÌe™Åâãö‰udÆ%2w¸VfGæ¹®rRòõ¥b›¯à¾ª÷ ß4‡Áu”yÔKÐ×!ÛžI0àθɕ;_…²äƒjw1“Ì·KŽ‚&)öm&ñSü9Aõ³è•I^…ç±lžx%Uè{ ¿ŠHcâª'dYãÌ4Ï-˪HJÅØ=±E¥MÞ@Ò†ØÃñu’9àm¯YªH‰($¸"{½òL&ˆ'Óx‰ÃýJS[ŽhøÆ&¾éàªNàãƒFÈ‹SxâB-ÇLTi)WE˜GIú‡V++¿“Z¨OÑi‡¯SpÎæªWû¤zý†êõúR V”#ª'EkQéh-®UyÐ" -B£Éb¡Õu<ß$´[òy“·ôÖI3ôH[ÂõæÚbn…Ø3e¬<Àdžœ]âñ¼>i ‰“"z3Ì$uòd²l .žÁjÃï _G¬u3X³p3¹pQV†K'«‘ì;“–{<î<ÞèÍH[™<©ÍpÎÇõæÇ¡¸z¼euâRÛc#ÞèôÆ@rc0ÂCÙùÌ’ìÌR¤ïˆ~w©Ì$³2ïÁaÝL Èo‡Kabb'c¿&„çùCŸæ“tµà•/w3‡1»Åu]—õ,¿éüf"¿™Öäþoøí»ÿ7~kœÓ -ûÕÙå+ ‡!2JÁšdA'z°cûO£!úÄçÊG÷wÀùFG*Ë)j²ÜÑß—Ù—r™[²‡çÅÀ³Ýkîuú…á5Ý÷쾯žbñ×t “ïgyàžÞ(‡ð»„ßÖŸðû èðŽÞ’²,÷ev€œÌ”^±9jЯ/q§] òÔ Ã%i§¹ÓÞbðaXR ­EW¬8U­)~,½‘<Ñcu“WÍ„B‰±7ãH7­ò2ümÉÈÉ 3Ÿ‡‘Ìp/0¯BË"seÂo‡ˆ`@øy‰ˆݵ‹HƒÇ–æ’-"-¢–¯gÙ ³Xæ,Õ6ü-¹PhÏàûÓ’*™‰üñ2MhIîR@¾ª+ R€³|ù+f÷¤žÁ¤Š7R_¡¨¯f„»2‰¿î1`èXþn¹-Qó'f>°+oÆÊœ Û1ô¼'—ªß±†Ø!ÆFîÍ;¯Ø-Eºjòˆtú1i£ú'’$5â åÎÄñ8¿:Ç;ößt¡Ó)sÞ¥FL“•.ey0£…éuU d1]6+Ú¥ rž.b©€Uf° .L!Zñ6"‘‹^î2ÆQq !Yf.[Ó†Ž>¥æ2ý†V>AœLcÑ[­™M;“ðKjF7-zÕÖŸ­†8u?C«ræºî@Z1;vÒ»ž<™&ƒ•ž¹,A¸Q–ÔkžËtÚÆÃTGWÙÂ',§3û¤ñ(Ó¶`Asf͆°&‚A:7X^JŽr€׊ÏKÚß V²öp5/˜á7ò‚–y}y,Ê/çÒC)¾XÏ ø=%‰ñ}QÖÑù¹¥J¦ZÞAÿ±8ˆÎyý+ÒÅw![ ï:QjL¶ºeXÑ¥XtÍ©“¾¸Á£À´4ªºëmÝÏ<„äZ>û­¢ŸÈ(ºÊJ«¼Ãë1¬Æ‰¢ØÄ ):~©#¬ò–›…<€ˆÈ*¢QZ'\’ºãÛÚÃ`ˆ÷‰UIм`Å yñC2&äˆ1KzÛ´,U $8Œ®…2Ÿ÷ÈË~2 ¹ †Íxùÿl¹¡r¨!‰y<‹YïÕÀÒz ³ˆ²ž#z!qÛhXÉŽ€s}oT§Ä!ÕÙ:%’Óväïê”~T§Œj·Qäk2˜ƒïr….WH«ðÕÕV•¨;|›ëцW6Q$XcUD|@rŸuuÖ"+•Ÿpmí[ò/Ni[ÒåºXÜšRâÍOL~/=U “­«‹ް1>Q…t›~Qy­ÌRtl°C¶ o¯ZãŠÊ\B×N¦(¤­”Ïè›ûáÑ—»-¢™ë´7XªzK/ZJ¦„’õÒbw!‘6FøN]²dñ*0³˜83 °)–Å <^|Jôpzà¬[– !öâ“ìŽâ“9ÔX𱞙|i¬±="1Ѻ…¢«ÎXÊ¢+åü,³™¦¶D\À5“ry]ï3PÁøše懔۩^CUÒ4åk±yK·™Û±g'êí wK;h¼à’»ÚRTµM~ã`³DÕS·òj„¶ÖèªÖÁU6nf]Bv§K¡NXßÄ !@Ñaáo™ãQÛPIØJLÒº>­êýQÛgmCè4[Û)öòÉ ¡˜´Siëž[÷TšÃ¨(AïÞ­0‡#í £ô˜^)w?Ö®Y7^«Ô‹P3W¦2cõ "6÷¥»%ŽQ=<Ö^¬Éž»wmÈT\ g ‡³'ç”'_1@ùéY#+wÃ¥„göI¨aËèCöÖvLòËcŠÃvò¬mËXý@Ÿ¾õxŸŠžˆPoß ÑHŽ‚)v%®ü{wú.šãrÈ|Yu=h¶¬~ØlY]IsW΂‰mºCÈÜ´þ Æ ÆZª'?%©Ô+èÎA%KÐd§6ó«ïû²„*Ê-#{£A/÷Îëþ¥ÒÅÏø—P5_f¿÷üLZ§Ë>€‰éZå°ÂQÅý.ýÛv‘©¡§k †ù‹újô'ý¦·iwHÒ–÷'Â…šhÉÛ ÜÛÒþôu¦ÀÃÛ/½Õ¼y¿ÇÜúÔÁÖ®Š=ƸñUIüghWìÐÎ#ùí’Èô§†S¡xœq‹5]ãàaöŽÉ‹Ðò@·qZv÷ ;YwÄq Ïh1éÀ·ê˜,߈(‹Ü’jqWvçQÜè< B­‰ïØDrm¶V›ß«å™æ„É4&ê/hW\ b6-#„Ìg¬"JxŠÓSeïPqàFà]K[¾ûL‚ÂBóÚ–1û õIdà 9b.„Ù8ÅRUüCžêº!1ì@ÉcÌØÚ3ãYñ-*±âSŠÒ;©B‘õ”1Lï÷HÙÔ<™ÖÒ¦…¶uvÚæV»ÒjøÎ^~:„Á<ëíÙÜ©²&×WöpVóæl\@ŸnPr\ž!<¯ƒƒ‚?« »'MN¨`Ê]T¸Ç3¸ÂÅ\•ÄÌ©5ìUÍÓhLp¼©›è²Í ¥Æí¥çÝ‹üÍ^±ÞsaS£<†È­3/x•ógj\!H;e¦[>-}ŸùXWF¹¯0[Bè¾Ú… p‰“%S\©þÜ+.*µùQ©ÍU;jš²> stream xÚÝ\K·¾çWÌqÞ¡Éâ³eˆ$@r`xoÙœ$H|J~~X$‹žê×ÌHQ {¡Ù6Y¬çWÅâž~;©“Œÿ©“‡ø¿<}úõôáõôýŸ§“’b’Óéõ—øõq§×Ï;¿i£/àñ_ì媥ßàM[Ô›vøù™±ñYù1òM{OoYŸ¿u²Œ2ìè¿¿þ5Ò¤lG”²J(iKDiˆé††H°4ļ˜<pBû¸7á¦4è·ŽNuÈÛåv–´ ÎbÒð³HsªCÞÇík³@µŠT†lß“íâª6“ôÝ-EQ`AHØØ”F?´)'¤k›úîrc—6e# ½°¥7)å×ÜÕ4L¢CÛTÖã¤ÓnÔgüÜë¸#«Hß¡~üMe6QÏ­,³Y²åvXAÍYAPBï5‚ÿpPò%, gëÕ8#ÄQJLªðÖÊÈ© p—¾p6íØ$®8¿à0Àapd²Ô=m/ÑtÈv¯ãMOQ$Bb¯ó›Û»ßõI/ôØûâßtù\u “”|Z&Òæo7eó¦i¶s"9½c2A鳈Œ;Ç×Ó¶îzQ¹®INèݵ°–dbójÆrºJ˜pÓýy/½¨N¨¤Õºé"³T¶¶k¿%Çv`Ãjš•àí• l6ºúé`¬ÏoÝëAjáᩱþ#/méwzºÌÅòÒ2ª1:Æzð~9,z÷…ÖØâÛè»TfEÞ¨æ™Tì]Lf4÷½Š8i¬ÙËÉ4ôŒN¢±¦ìò,èµ]~U3%—™EαŒ_AŒIÚ´èÓöî6i*sîÜIMˆ^Æ›–|ƬøQ³äGydº'FR³I§2‰¹q–“¢VȤVlä‡Ä]õšcªshô”ZLY“-KlÄ×:${1ÓÎ$¤ª¾õ—Þ=¬2yÅ œµ’ûBÀ°ñíV—Å&h÷º+•4~÷¬ÜœùÃ<²sö©ö:‰Ðrte¥€’8ÜËŸ#Â2þ€ô²wÅ·ú4×ä7põ6GŠ.éÓQ *”¯&Ìu•}zFûšN€‘á[²Ù$;§ß»ò}íŸGKúäˆC뺲ÁéüßǃÂäшPj@ŠKû²Eµ½¦•ÄTC•BË‹x±VÖ¿ QmÇËn™Z QÕæ:SŠv„VÀÊómT_è+;€2zÚ×AÁ¹%G=gÓ;ÃB‰='Ãpm£r#Ñ:È’šr‰9\‡ui1“‡I2„_ SuðUGT5E·•šq¯^®=$ŒÁ}¹¢5²ÍBŠƒ{°›«ðRv£-Ù >%´òP·N€óÚ‘Û-Ú)SvÈ/­ÐK¾PUæ.ò[‚«Žâ²í4Ù5Öj- {CN0Rfµ™Kí¬°ªFOÉ! ¥DÍt»¼œ„3d>²Gýµ$žRWÐ2ñÇÖ¬j¨?Ô„eYTïX„X­¼B$všïf€  Py;?ÞFùøí„™j>-yå&p"ÂÍ:¤ÇxcÎ,éŒé R“P ~'Ó„¨´¹<¡ÏO?pGBàSá*1*K¥Ì#×Ùl=Z–Mõ“îg_ÂAQFU7IÓé7›³GuîäI¥ìžwŽ‚&ÏMr9ToA öz6.–J¢k vûza‡„¢Ý²°¯‰õWåIÞo§™dßL3R­ •t¯­¹å&l²}ök·žÄ¿~žE&ašZif5à #'F9¬ªãIcð{°x¸9³{Ò™3ËŽL•®çÖû%ÖßÊO\ àa“V(èù°=Ïa&¬i kô:š‹ñhüx¢Pt•3#5‡‚± Î+¬ÑZxs[g›/œšÛßàÿ´t÷‡¤aÉy9S8çRTK£>Ü%œÙe Üñ—keÎW¾ïoÈ:¶Nœ×PÇ,$„™ÇjUÐŽÐÞÚ®¸¦¼æ=GUÄ;Už¨Ðz¤Xès˜¹6õyß½x¼ Ÿ§MË9ìø!J°ÛÉ;ÈÄü©êÊÃQ6¢d—ÓJÓÀ+9› GK4¡(–\Þpk[= 뀎…pÅw×zU†ˆÔXÿa¸9o]ulxÄÔEcêu%¹†äŠõU&[éì]kuûAuûapûAï T)J˜l%³(¹/tQ±(Ÿ»ÂÕÑÅIIZa¦{Ðê´x*ÉÇ(´ ˜¶ÇŠÁÆa!­¸ZÚúR5d³‚¦Ž–Ð6Üäv¼;‘¥Ð¾”)~1‡~tz|Ó<Ù r°#Z«áú€šEOÀ×pl„wnV¸•tp7tÛô‡v¶«¼³îí_F–hä½¾»÷b§×ÆëXàÅ!æ––G¢¸wÉWEpŸàK©Ÿ†Œô:2B üU2ö‚‹˜^GhxÉ¡6Âþx±`è]ñ¨Má9CW|Þƒ`µNò‘m‡™(5zYP âåg^û¼ÚJa‡+v’L®Ži§FŒ®ç“„Ͳœê¸²¿ž=1YZ(--¹Îa@èù±ïåjôáƒY<^èÚãF-•ƒR§Rž‡éGœÃpSë ®Ô¨¥÷÷4l´ÑGzYº5v´yð]ÇÌ©ðƒ-Qa5A÷Mô -QvóL¾ƒ©ç@h¯xƒÑœ©ïè’mILÀä®q7»‚–žß6dó@)žTçŽv(úïîqÓÎ/~¼¤ÝsÁËMö“ûoå‚רßTˆö[0X ¶Þ·jr®6gwj¢#…0ë ¥n ¨‹42Ï¿™ªîSGEoWý(²-{»7Ú¨TÐàÚ^í'Ÿë—Eë+»u îVË­¾ŽÐC®±W™H)žß>Øx밨̶øŽøïÿ¥eÙ o»ýTÙM ¡2WA.A7”4Ä£&4˜{¿±àðÈ;<˜¤¸µð´ÆöÈ[ÁSî¿„g\¿3(„Áv–¶a¬º½ã–F‰€n~å7é®,˜1†S *â³4º–'!˜óì¹Æ®ÂòÀ%×J‹{£7ÈÕÚ…nAk^êÌeˆ‡¶+ÇÆÕÚë®è-þ *{éè_Ìš®7Àfê;Tž›ÊßUØï#ËèÔ†¨Â=À\ù=À<ͽ ÌóU?-t¥õ¨9Œë¸¾i¶dÛFÂ$ ýí?mõûȱõ©ÄŒÜ¿Ã>æ}EÆŸ„2_·K)úˆFõ_ø?Ó’gº=HËö:†{ûÖRÛ‘£ùe•×D®å,õ£‡Jw'žÇ4ÕªÃ妭F4w¼^Îô`i/”íŠÃ6ä/ ‹ÝV¦u‰ÃN‰«çI|Ú!ñðD‰¬4‰)=›ÝUêX)ëa§™±½ê°å¬ëÌA|æØ&5œY¼b¼¥:³:ªxU¶ðçb·O+šânÿôzúíáA8ý u¸þkÔµüþ¯ÓϧŸòŸ«u²‘½¡¨<âB§Ó…ÖþR¶IMؼ„BˆDD1ú[4ÊwpåXµšÚ\ø ÝLÍ÷ìÇ¥+EËW5@ýŽ—Šm‡ÿ!!¼Z.\È­I›W2áôýÀu7%»›B…ô/•Øî` ?®÷ŠÜzJITåKüªjÊEšz™¿ÝS)QÞaùtüƒf x"N¾Š'jAã‹h5‘ÒèŸþð_ɯv endstream endobj 54 0 obj <> stream xÚÝËŽ$·íž¯èc<-ëAIUkäâÀ>sÛÙKüòð!‡üJ¤HQժꪞ½$°Ó]EQ|‹¤¸—_ÜÅ.ÿ¹KöËÿöòóï—ïß.ßþ8_œ5³/o¿]\43\nåAº¼ýòùú¼{1-ŸLÓò;ùŸ—w`—_ž‡÷sù¼ÜÀÛ+A§ò6Ò*põwùTLeeù#}RÁ’ ¥}¢åý*&(PÂ]+ŽÐð"ž²"Wèú;º›ÚÜ·—‚Ú×M¯Î„ðþÂ$DË[!ɱ` Æ×[ã®2^ÞóÀ·—/o^d[ELŒUÄK.ŒÄ—[È3Ñ…Ž0a°ˆõ|QŒÓœ(º"¿¯X‘ ”'©rRø yB¡óÏ(PvC [ ìiúªJÄáåEvEØv%çÂg@î®’â„hT ^¼­¦ßWð« ÁEÕ}ëMÞVâØjñ»¥¿IÁ‰¯Ò'”3Ûôdb¨²>j¡P½gá[ÙŒè$TèpZŽ>Ž€È„\‚¾ýÑEÖR0>.怴]dR  ¬b™ L $]²™sÈÆçKàÐù6‘Lr—›ÀT;íƒðd¼ã}H Ž5 rò½Ç Ü” £8ìØK{‰ŒªAø:IZ'Ó)ܼc]ç¡MªÝ¡dÍ4‹ò”óadödö9÷†ôWÇ+ß¼ŠibåVÙ(K/ÜûG‰ÍØøÛY°Ž#ß!ñÑØ¸ò…§‡§sÆ©[c§>¼»gL]…ÝùžµwoÄÉx¿oQÿ÷B¢™ÜE ΟFO×u°Êê4"î‰/½–%š†%‘T[ðZÊŽ#%RÍ'÷ ÄþHA±ê€ :j÷§€Wî–G1<¸]±|·kØW°ù€};¶¯>ÐZã§»@ [ÖÇ‘†„8#ÐOãPlóE@$Š*,Ë6 Ìø3Î&ÃG̘„µ›T¡ÐGf\Í(¶ÜzmMVA¨­LŠ.ú"Œä~ó6™iÒæû˽آIÓ±MJfëÜçÖmp+o|êÛ?™7ÁbÎ0¥gRYË«‘ºÔ{v³Úô@+0ÜX¦à¬eÞ=Ë‚)*ËJ'Ë[҃ؼŠÓoV!É)&aˆ‚V³œ‘Ð @‹Ë°…ù‹sf.{ýV²òÆá¶‹)½Üœó° ²¥„ž€DÜ–ô¤ËgÓ ™¢¸IPÖ½磉¹ å,Mó.MCz-]Þ“bÉ%V%B9Drã¤>I:ž‡ Ò \ï$Qu(xªÑd;¨oqýr˜—o[žüʘ´ÓqýÚòªú÷žJ2Nb¼³NçM1¿\Ib²áÅ_ñíõO7]¨ÿòëïÿ,ÛýJa*_?û/ô¦ÖŒË77Ç ÏÂË䯼+ ¿×IfÑgc¦¢_Þ_„V }ò-¶‹¸ÖÊHU´¶DPÝ]iQ#,CrôÂäV—l¹ Ôw–yVÉ£škMéÄQͪL\âCj™…×()PÅ+‡_RµJàjÔ)JZ’%9½o᜙&qø“á–ßñ4H¯|Pü;}b/©b†#e3µ²™ŸÀÉðRñ©ÈÆ+(B áË/Ž¡î]Ï%«ÂåÊ¥÷:´3ïÆ½pªÀûŒa§EÖeþh«`í^û|¥áa‘O6Þ'ŒŒÖ‡üb#J:2,ºÊÒ©ãUÙ•~O:éì=I:[­¢­yý:&ì&vv7YÙô+祈¾YXÉlÐ.°%ÛÎ÷@ö™x“Èo÷#œ›V׫ûKÉתézïxðŠsû`Q‹”“ F.®hÅÖÛ(>-¢$*Ÿ›´[n‡ð¬‡MÿPO&4Ã\sdÏ©i‘ šÜù4…ãöªû´¢×V‰ÀÕšågÛ,; „Tut¶N§žéÇ…Éð˜Í©h1°#<ÉiÅN)OPy7¡ÓP§cYÌSAòýJ­Í“±2î÷µƒ¤°úyåÖ+…Ú E¯ï7ûZ—`g%¦V.oœ]àûº‡s ’ÜóšŸáÚ‡­;$^wÚÝi½²”xÚ,K_‰×Bо*­ÐxŸ{¦š{°Y´DºªÉ9jÀø¥9*ÑÓ7Ñí8-ÞFnñÒ·µÈÉwÓƒF—¹Ÿ¹d«´ì)† 6cSN.mló°ûr³³Ñ “O*&bߪe€5DI k'©ÖøÄÕ®$?ä_’LÄ5愵A÷¨ñTÞxq_Aíš÷´cFÁZRètÍÊú SFÊS÷pÒDål?æ>6#Yª[Ç‹ 3J# ‚Ð0*cAŸ±=H‡#2v[,¯ê+Z¦ Ÿ–³)«¬Œ-¨5 â µNVîÜqÝQè~,£q}«;ýxëý E,`Yg9¾F=”Ó|ò×WÆÚ*½ù„H@¨Ú2‚˜Ÿ¹wÁUŒ„IØrG’‡°¤rFéZg¹²E¤ôt[‹á¨8kѳ#ξ{6‹œµÄvµ³¾TÑA¬d3sâúræ°gHX§&ý€ÊRµTxF&ÌÚ9CÔ=îmê^' IZ4sz® ©1‰EøÖEHÛ GD|0à²ñz¼^= 'xfã«Nþ8FdX«Ýϧi0+;³Rj\¥'ƺÏ7C:l3¯Ý²p{`h«£Ã¦ÐBÏÍ~)<0¶u= ‘û AóÍX&QoõP.ÿÎÅÿ¹„ ±l ñ•ÌÏ÷ò“iBŠÜc¸Íâ<8 Ê?n.O8•â­ þÿÀq|Ts:ßPä2 Ôæt¶Ì9/\ʧ¤m´S!µÛ¥g¤x0À×bå§±ùu#GÛžy”•á`Óò-žàeì·ð´ZÂ+Ú›Î)Æ}UnÎiæyn¶tó vž Îâ Ý’.8à)«ÑVÅêi£O#4¡ywˆÃ9ã„T¨½…lbZ¼ì´ä©üµäk£dÐM§†ÂÑ 6Zq4¹oÝœüà‚­¶5N÷Mò±â¿€òÄpDÕJe ××íQ,]%ùé£]Kü·¹›©u—]~´7|·²Uùô;œù§= ›6èV#j™7(i$Ó«ðµ®T7E³q?ìÑ›9™±ÁRõçÕìgX¤ý$#¢A‰I7 ¬î¹#üUh\ß®Ù,> stream xÚí]Io,·¾çWÌq„H —âÒN|1r@·(Û°á 9ä ??d‘E»ÙÛÌHOÏláIÓÕ\«¾ZȪ¹üû¢.2þ§.^Çÿåå‡]¾{½üîOÓEI1ÉéòúÓEY1Áå%}à.¯?þíúf¤~z1^Çßœ|3~|ü‘?VÂÒsPoÆ›7cÓ£O­‹oêø/D ÷ù_›~Üs"3×ü1’µ±«Úxz=>w±qW»´¥1šmØòã3õß_ÿ'ª,›©vNè)®ÎòJ$ÀH@h ©k+þâÅäÆG*;!Ío‰ÀUyy Bj|ü—Ñ(âSw1LîåiÙD„" É? ÅÔ5qØD‘nÔUüMÞ2_çëÚtߤ”·ÍØïÎögl»»'í “¤m™D-˜ÙBrB–R™iÀ‡ ]á©´ëÞ6<´™ù#…eú¹ Ư(ä–ÚCJW¡mHºŽä5AHà6-ãýNdi;Š«†$®mäé]KÏ›T!ì4á¥>3%Í Hu£”Öñ˦“óÈxëÜvð×^k/|QÅ(ºî™8îRÙJaÕ½V% fx“Â}VåÔ[•s­k›¶m ‡\à/»¢,}n—xœ;·€ûYü&R@Y?‹D’4¥”ô[íBõ¦DmuñÐÛ+[Vÿ\®žÚáêM;†S%9á˨ÀZ™ØH C¦3B飓ùÏrŽXaÚa¨½Éì1TD=6çbß9ÓÔÛU›C8¡Ÿ«ï€o¡ bGæL¢@“ 2¿Y2Û\CÃÜGµòNofÝ—ß!€a 1ǽÖúg½ôŒM4K+BvnnË”ž_¹ui*­’A¥ÆæœYÕÅVLáÓÊG¤5çþ0œŒN>ì'»/?ÁÁS²€í4Ú}'W¬àž ²åÈqÈm¿ø¸wH$ãŸMf VõþÜr@u­ôÜòm²ÄíÊUÜöð ™BÐFjU\_Ý`ÆËùf³€ìU3¾YØŠ”}¤ÎÆ•±Â«V ;9Öº LSs/šœ æ~#içÍ™°ä°øét&^cŽ`m£žŽ¹Ù#£bšÄGEÍ;Û~sUM›³Øtjó†ì(¾F‰QCª}=bGAFí…q[V»ºF8w}ïÄúçêW—¨*6Úˆ„äߟÊ3åŸÝš¼Ý(,Ñ÷2A´Ymúj`09­ó¯íTzg˜Ùä³sæ½wÔp"æ/³N…b`#¬QÃ?`xøÿâÆ:‡> Ð+¡ ·eRØr˜!£Š»é )ËæXfúŒT-| °âW”ýƒ=£øž¢¾R×™½Écïall´­"›b7ŠâçžC·º¶ýృªf–D|ç7wÄñ˘~ôøª¼1Š—K/TøÀ°ØwcBûSGX¿ à×ïŸ_M‰à#¯Öfîž­éLÑŽ–l‚ý ¬¡³W h:9ìTÕÍ„Éêé™õ†Å4wïÌ4Z¹AЪh®AЪô3Z‘Þ+øbÚ‘‡ï†žqKè•i6{Š)s»ŽA¼©#Qcagúw!šEçÒÁ÷,¸ß\RK±{pE=¿çN9¾Ž‡ÎKŸK+cl¢ zÅÔhê3}„+tØ…Ú:7-ü\RΑæq0vêtÖE°ÐEnNpÇ‚#ˆ_ B¨—Q$@žRN긵<òõ|Ä‹û1ØÝÁáÔ¡úƒ…êQxËÇÕJ„¯OÎ{á}e~º9D¢gl>AÞóÖE¿P›§ Ï$[ƒrV(xÈÙÁ—¿‘Òë)¶B£¦6©–á*22µ±'€MŸ}>îΟ×sp[‚jÞa”­ Pr2(çÜ('¶Q ŸòÍFÀ~g]2Õ\S;¦©3Åžf-뇸¯‘GÚå¨vηvÂ…ÙdOÔÕb°¤Çq,¾?³ßÎúsPØúÔ‹"eç–Þzi?Oº!µLõög¦=£UK»<ê áeW:pž Å çÙ“÷•.E`"ûGÙpSWf¤âr3 P‚NÊ;”ZŽ%ÞTùvØJ†x&ø~„.$ÐÉRþ:jÁ §"$Í›4jìÒHÒ ¿D&,É?B®±ý“iêÅõê%Á[XÉtdáØp·¢Ú¡Wè0Wè•ä½Ì¥I0ÀßÊ8ØmožÊƒm s“ùa¹ž ¼f×7äX{Óîoü~|À ßÂÁjÔÌToñ|3 h4y0®*â^ÍZ-‚E/Ù× ˜¦…¯ÀW`zC¬0NJBP¢ÌúA‰²›b`?êô9ô!m«_-@=Æb w[¬wÞèÐæœÉš—h¸,vJ?â>Ög¸êÒ/̱‹Çuì$¼ -ezCÊàBj){Lìö“ ÙQ^Ê·ab;fvŸ~%ü{ÓÕðÏxÖ’2:ŒJx¾-«gÅNj¶Lzèîh3ã¯Ø×¶ÝîòyñyÈsÄ…¡]ÓiçMƒMÑÑÇŸªQÐÌàifZÖIKØHciw§­ªÞԣǨŒ> $m`!÷h2³L¦t™"‚›O†|óö4ô]œKŒù¢]B“-×%ŠÁ¦ë¢…Úñ\ ¥v½c2è0Tš&jaMÔäP´¤ß-D1ˆ Û8Æ¢ˆ "÷<ÖÈÏfÕ~>î×¼ÛdØ\~í\±ÑÃN0´9é_ë•ù¤5¶Ë÷ã“P¡Áƒ„åXÊñâ|,ë«·Ê þ±œðãÐFL¯K¶j}üÿ]e~„¼ë*ûÏë*÷bè]s•¿-‡»qÃUT:Z;º‡ï0†ï GLjö±\D·Z;»ë}\a­ ÿãàykEžN˜ë«FÄM÷Ù¦}䘾ä¸e*_4Èv3'«waåÛ,‡qé…ô)¹þq …êhô| ËaË=G,—hè?Ë9ήFü4ne‚£ëp†©üˆ©Ôjt¸mÖ÷ÃÎÎ2»Í§äãW²á^…÷Y¿²§’øŽLÝ—•àŸm!öÏÌÒöÈ}õh¼ Ç›hl ±[¢±Ô\FcsWBoRÁh¼}¤+úÎeQþËÛð;ð£=ÈŸG‡ q§ôÜDun¤ïi¤õwxÕaJ•^´I¨ P¹7£g7°ðvk½Q‚—uØ…œ®TˆQ,=ÂÍ‚î¥QÒYŸ~Ýë+ÇòGoF…tV¢Ú®®^^Qï|ÝtJÙpÇÅà¡nÙ´zýó™gptéñ–]{fÉD<Ÿïv~Š…Æ¨Ö £ö/A'–{Ñ ¼}ãHÕ¸ý‹NÅ€Ö oÏžaMð×t]¿= ÆQ:”U‹=nàŽ2$Ša>Ðh¬ööd­ÄüÖ™ôÐB}{ã-êö%3Àé #¾u¥‡ÙI—ð%[šÝpRR…jꮬ̱Îù©œ` z.²™F•gxI,’sŠêP¡’NîxhË+šœMFÉ^ ó-×úkÆ™VÖ“*–ä·éödiæepÕ¸D~j\pñ_»?YÈ4÷¾%”­×cåNËîÏÒœSsqµþF"`¶®7Ï{›!€ãn!0á9Sœ XB ½{6u,¿µ‘:F]ºXWýƒîζ ²lèQh$ÉÌÓÚ°Â*Ú²'ù)ñ>í ©. -ÛxqGY¢ »¥?[£* í UiéJÌJÄh +5J;¬u^—*¿7¯¿ÓNgÅòò¼°OîïXžy)VŠôTù´²Áo硚ÛyR#Q‹Õ²?ªpŸ.«åÔ¡Œê\@8eft5W{Ìpñé-K·R¨úP9„ÃØgÕ3g­z/7׎UŽÈÈ/€R×£þÅëJUùñHzjµ‘ÜF1ñ@±ÖC³eé¬óàø«u˜Ä±iÀ=EÌ"E`¥¹Ó¿d¶—R!úì^ÉÒ¼'ymð ¬rnyÂO]x½•=m™ÓŠQ4.|«¼j±®Ôb¼×I„u'DèŠß®E—yˆ'¶:ïÈükÊJóŠòíÓ¥ïr«]eoÅwÿHuÂL •kæåóüâ /j™¼õ±B¿KáXá<£üIxwÞ•çE•ßù~wí+Žy¬ßƒ¯-ŠÜ¨°†iÊß…iQ ¤9>4Óê]QmVÕQø¢€WYw|ª5z.Ž,°}/Ä¢¹pÑ$°”ª/öÚD40ûˆ6µðø1­~µI‡^Î0Íù£˜†#˜æÎT\-¥*k‰KØý^úÓŸC°bcñ†žCo4YË·Xr•תn7 D¶Ṳ_ÍW|®ý03±¼ ê3^ÏQS°!\Ò.¾ÿÁo„-¬ªs%»5+”võ;x†¢§Ôð$pšÅykˆ’W@õu%ªmO(Ú¤ZƒªñÅEQúºbssŽP•r¯p:ÿõjý¦lçÿ= B³¼PÇA('¬â¸6¿|H™­/„r%”Ë•£±9µñ5$¥¹‘W¨ôùº¦išF¦òàѤIžpfVúãë寿ù5£/ endstream endobj 61 0 obj <> stream xÚÝ]ËŽì¶Ýç+zÙOËd±øPâxa YdaÀÈÝåf#@ °aÉ燯"‹%QÝ=ƒq`gÜ¢(ªÞuªÈ¾ür‘áÿ‘ þ_qùÇO—o>]¾üó|‘bšÅ|ùôOùþÇ\>}ÿ·ëg¥õg…áGúá¬ÿÌÿ62]ÓÆÿÈ—›šumÓh#Òoù·nFÿýÓ_üS¥f• &¿*‘{¥!ȆàHhb/všm`&eü(=Ç1_ÐSøws“€xù›Þ*ìî¢&Té)/ë)â"nr2‡ü+àT“r—2â•hƒžZ}VÖ†OL ¼€½&ªÈ¿Å•¬ ¯8H¤׫W˜¸úù€eÈ HÇf1ØJ„ÏBˆÞj¥ ´"žJ\?ËLžÁga³bÍþu_¼Â ¥‰Ïô„:_. 3’U˜„?ü- S-vTƒ18^ML¶6©C«0áþ¨VAQòÈøQWî¹Å5ßÀ¹IÚ«IkÒÐ,=Y÷ ÝDŸ•¦M×ü´®éŠUI¯IîüHU]´ÝàCÚþO7*ÇÿíI¨'ʱÚÓåùRF¼êq]N´Ø×å|_ %Q©ò#ÞŸ?%ÎiC¼ˆX‡ü3↚ŒŸ˜j·3ýo ¼&¹VrPeÞ‰z¯1A.ºÑ“ƒ1]UÛºj&ÄJЯºº*'G¡wœ~/ápõ]&ÏØ DeZ’ Ô‘¼–T㕆¯5±\Át5ÉP«Õ=ówáŸñ€ÏÞßÞá°Õ†¿æ>âÙ.[ŸâddÍJÍU_ͳeF‰+ýÚ÷å '©Gé÷ï® Ä7óÆ—{Åו:›¾Üÿ…O°úØ<9îÊ•!W®6]¹²{®\qWnz®\õ\¹á®\UW~‡ÇŽ+ØôØéê¡¶Û‡´ýææÉØF¾ïóÛIÚÜ±Ìºç™æ(r¥Ð0â·ã}]¿®ôüvšyÄo§U‘ÔèÆûQâ´·;OÖ>Ã]ËJǯ·Ü5<ÃŽ½¯LLÉn+å‚y¼I7élßÈ$%‘Û¸ÖGÉ%«Gž=Å×0 ² ÁÈŸd&šìÒÉ”D3 Ö @#”=?.E4wÏHxcDWOé®Ñ€"717©ƒËhcÒüj¤‹ñvÁ¨k«¾‘ý†ý3–ñ@åŒs)N6ée¬Ì$”eŽÌyš+êš ¼\ùHB™Â1À7ñþñ&-³£ÝÔ«uDå:÷óÐÀ‘X€Ä‚휴£šÊó>N*· Ëø(Æ0D"‹u[s­AúÊÂÚJؤHæÊD?3*øaH¢!¾dzÙÜÐ3óþF§Bê"Al\('Ét¼DYÕ8ÉòÜ^ÀiqRòíÑ#{È*ÝCttÇí¤!ì¥Áí”—ñ!©ì°Ü‡Ø®øÀÚ™ž#{åó7/0—Hû®7ÔÁÁ<ä õÛ!tí,ÊpG â‹©ÁÿE!uÌá¯ÂŠ—l9¸²pÈdWX³ã*ʽE:3‰ß à)Ýà ó]€çëzꚎz´A¢ªðëW°i™¥—kÍa ÷ê×.ßÕ$azûäxŸïóßÝÓù~NeÛa0jb1ße½fòåu> F„¤£5•6ɃÕmPgT難&ópÈPÉ=\ÂG¢ Lb‹ç*‡gUŽ]äÍ=yÃçËü$7ŠEg 0Å^`4ÕÑJ^Ò"O©ŽMaú ¸üY{c°M95Ü…°²µ `.°_%Ɇtb2Ð 0rò‘‘†œµ”@æÍO§\§¤=€œ!‹ —±í‘8<Çg˜:¤,qƒi%ñ^HwÄ`Y¤tœB–Œ ÊUlMÄ Øc‰Ï«T{^¦Ã<²‘üÌeÇ0Ùq[²CIÕ|&™®wÈÎbôXš×Kˬ˜œ|—zºz¢‰ø¹c"lèFà‰›ØÍrdÈ@Þ§,ñÖoŽÁ›²N‚ìdqš—ùI“•f£Á;1!’寅ú™•ú‘Kw†{®À*Õ®)ââ Ö"+ÆmyÊ|ËÜ@÷ŒØ3kø[œ²gx`ÏlRª=;¶-HTv  ¡’¥²ÝÕ ¹‰Î2Õ©ÚyV2ë;è`O‹4†¢Ïÿƒùp¹„_ÌFÌœPzdöŸl¾Îò¬Ò«¸b–LŽóæavYÇKw‡$k¤jZ›µ˜P«¨ó„dj•5šb‚•/²æŒ/²î!_j¾/ª7­,=#ŸÓiYÌbç&ÇŠï®ÚG+V%#ïØ‘Ö÷ v^AŸ ²[YX ò(hdòÐ.ê=EÈ·ˆz3ÉΆYJøšŒ¹j[6T^´>%zû.„cKšC L ˆÖ¸ôhF½ðX½ÜcÚ¥6”ë1nH¿”œ)Œ‘m±*éÓD¼—%:¢OZ(…>ˆ{¶Yˆ:”ûfÒ³Gç÷Ä—ßJôJP‡9xÙ,ríá€U¸NÀJ…âÂÛ4*þ5°&ªÂTû]îÚpàuÔ<àÀóèŽøy]Àêïf²¬õo+›C¸vÞžo³o»Ú$ì©Æ¨ún•÷E%qv7ô+íbnr‹Òw?î—%îç½\šûÈ$„û|– Ôç—Mhà%j2U‘#<.jMðþûZ…ªÛåRÄFÅÌ.ÃQÍ+¨ &SÑú¬‚Ä0<® ¤$ú:šÜ¸T¥Y,ŸŸc ¥egÝ“ò•VÙ$q‚„ÚÝ6û¶ iC ë™îý¹Ñ.Ö{Ödã¼Í2}ï&„çmèØ~«1÷¾­çsXAÕó™Z{¢Y£ŽÞÚ4€1o“*D·Ý–Þ«; ýX«¾‹a]¼Û~—Hý6TeަASM!iiŒ§š¾6«L;º@“o“n§ãÎOªÜiP–sbÎöj$j~¿¦ƒNý”+uâeò”ñ‘ó‘ñ‰óÝi|n€.¸†ç6{0¶Ã#”b½#”Gmôø’ÅQÂ[œ\lZ9ë–î™wdrlÓñ땚~¬ÎD÷Ϭ+GHÿŸ¼ÉÔt¥Þÿ¾©ºUR´¨“`ài„]]ëVX±ÊãLû©+7®v${³¾5v’jÑKy²ð€BŸ(0£0mºÙî§÷·Kþç¶Ñ&²1‘k ù'RHõ[VpÄ×ÍŠù8Än‚úÁ ‰íãi:èN£î楒Á;=üyÔ¹'îþҟŵÈ|Üd»åßkÛànjáN-ðìK-¼û™Ú6oêû±Ø›²ëþ~¥wdW>à¦öÀñTÕªÄDFkצvî  Žê}Ú¨D‡èaÕ£¼½_è•@‰¢°+Ôc³í*yÏ&b&R‹£xH©Â¦ué”;‡^iÃL¤‚YTíÓ\P9bEßÙ{§éæ²{£íD¦|‚²„uÄ.N½Aìö®úç"ðZCìBzÙ4ò Þl1båFªÌÇÍ4Ñ^ÄDYR—Eêî§­dÂ/ ‚?²™/…ð’©+^7á1‹r"!VÛ‡›ün*Îy×#jÔxO3ŒÆ‘ ¦züHˆÀÄdTD™ÞöËfXÕŠ8’n€R±(Íž¥T•ñqÅeuu¯Áªá£¡‚è5øŒɱâ¢ö@ñÚ2y_£åf^)· úÛÀ¦Ê£ŸÕ"WÛòNtet•%åµzGbꨉI£_iÒÂÑ*mÚÕ[E¾}Ȗ׈¦Ý꓌ Î…ÞöÅ£bIªçlKJ;¯Ž4VP”b檒öÎpW³ÛjÓß7Qvyýê×;J®ØJfe-vw=̵†þ¾ÛHºÑÒuåÊ[q÷xC ¡1.¨”+Û Ú­Ÿ‚¨Hð¯[eZz.½qü¢·ÓJAØ%ò膛×Þ™¬_coË‘ª ÑÛçd 6J»ÛÚ¨ü¼î]šž ös 4OŒ»7#ûÑŽ<ëc3Û¨ñ¸m¬ä?áüŠdÙO0VÉ¡\HË&ò _ÊüVÝßÕí‚ʬé+ß8ö®Ð3GŽ[£ÚÙŠ]wj¦V¼rˆKKæHÙDî¢Ylþ,ab‡E㞀ÒúÚbØ;°>B_)Ìȱ_gçSé O ¢€è4œ^÷G½fÓ¥wAN à²Í²+l^€‚Á|°öœìíR@E‰ï´‰ó5Ñð²N›hN®‡²ZÇ‚¶šÿ¾·ûìçdõUÜH‚ÝÝv0|:Çü`­ $úCuq«½3¦9™ âYŠÂ®µí!³«=dæÄÎ9FàM…ç]Ìm+ÌÊn+ƒ¶ˆ òóÓvMÓ.2:È2½ÝK´¶Luزæ' .m³em}Îä`ëc/DR¬>ÿ!|´ÚqfnÕhÅ(`fÏm™Šy°à|¢~´yq|2ÓÒ6jÖf°òy¦¹6qæ|Ä’ :Ý•sÉ›’±/8,äCU\9j)‡ßÅês£ :y²‡6Ý5²1³Ž†Á^Z6Z7Oê¨AmÓã+MP,’£m`iª4,:Âã¸ÜþÙ;â')9O[x9ûNܱÓ5C[ÅËŠsÜ»«NgóŽÅËnO“m•UÒÞkÛðedå¯E¾Ü@ãv‘Úk±ÁívfÂOÕJôÞÈò#C~þ¡‹ë„Ëe ahnCóF[»§ahó>†ÆcD“lgÀ8á[Orµ¿*úÉnk÷aaψg£Noh€ÚwOaŠq{9 êì¥eÔf±C¼öá }—pÏ‹SÝmŸ£–íÛæ>¥F¦»¹oŽžØwËæ*þÜ5øûh;€|ÿå™í‰Ê°#Í0¡=]¬5œl¬µÕü"߬À î¯ýul .êyï !ŒïX&ù¶ëjfSús-Ušª`ää›ïjCuì„èC|­Í4O±˜¬þkâBÿx¬y2{g$9¶ƒñ„3dàõýŸp¨Vî¬ÏHøú ,ýÌÚ†­'BÀ?}ºürñnÀ]þBZ#0<þ'Ÿ?ûT®üÿ—¿^¾KßlâõIû7wt¢•—W¾tB6§6¶õ˜Dÿ~^¦d›¤4K™Fc¢×öйyö4ìž= ¬)ÛuÏž–{a×B-ïæµo·q }֪ܽºõΩÄ0• þÉloX³> stream xÚÕÉŽc·ñž¯ÐQH wò9q’CŒÌÍí“6ì`Aà|~X,Y¤øI=ö ìÆh©W$kߨӇ“:ÉôŸ:þ—§ï9}õîô§¿+wRR,r9½ûWúþ oüéÝßž_Ï/ß½û€Xb…¶ .HíÄŸ‚XxaBB#ü’¾&¾NÒŸ*ÈëË-–´ŒËXlù©@,’xª¯Æ›WcÕ« ð¯N2ý¹ô¹~¹ZéÒqÒëô½óøçusø¾ãŸ9úó@àÏøö¢Ã™/™Ž„‹":[–M[ –°Á;Ø´ð¤ T@àPö•´:£¤‘Z8G ù96` ¾ñìK8²^Ùµ Béɶß¶O«:ÜÒow”¤9m[o*œŒ°fëPv_ “Ã,eÄKO²¤‘ÕäO?3¢«MhPÍÀ?(Ç \ wV¢Peñ Y,VžHæ¬K!Ù·gqÂÇ|Ó3(2ADsª œîœnJ‰…DJNHâ„­"™!m÷Ü”€ô,ŸÅ”³=MoŠ–VUƒÓ*ú¦ÒÀ·çð[[¾MZ‚¯ ~Kx¬IÊKø<蛹TD¦,“ÍÅŒÚ)áüÓjç¨]ØU;;ãªë¹jW“Úå×Ô΋$7Û6+Z÷*¥ü¸Šg6/œ&«EñƒûЧ„zC½söY½³ªÓ;»¢wNmëçzgÔQ½ËS½3úÌü$ÑÆ ú—ŸßÕ?#7õVsŽ:9£¶¶š©žÔz.`Õ}9óDI=ÁÁ¹–Ü϶ZabcڥܔhÀ f«_•õðØU{ó›°[Êm÷©s¥^Ú]å ýíÝéÃ))©?ýzÒÆeô‰pñôK2€F„@ï>ýóôM‰';^•§‚Ï„ç4r¦í«ÈûŸf§ˆ°» óŸ ’¬‘‚ƒ!ò?O•&&*¶IÍP/"€/¦A–¦|Ÿ¤öe" Wë´ˆ9ºE‘)ˆvŶd¹×/Ñ€ä |zp#âôç^‰æê¢Rh&ê2Ø R†¶—Évñ³¤ª r¨gÎ7„ mÇpJ;¦¼ùÀhW:Kq»C“Œ}}êˆE£íÝZ´ùvG[e_¶m•áQèŽE‡b£Þ³XŽ{=Ó Ò3¢JBA²¢F(=RÐa¦0Á9Ó‹…3ŸTƒÆçÃÔԺЌܥóm¦£Gáexù_9HÖ`Œ¨÷UKá›âsSœÂ¢S¼âxÂÚB¿üøï9÷Š5¬©”‘·« u ¸qYmÒrK²½ÙÈ-9Ó·ýxù¡€åûµœÌÅ!@鎟£ËÙNÖ)ýã )®×®må­PæÍì¾Ú±ûÜ0ê» ÅbØV]Àà3gK±¨(žé/Kï²+>ýϤÔõy5Ö@¼/„Ì÷š‚ÀV+5Êäb…\Ž ¥ÙÊ(”ç‰Æ$ÒUZH2*3K¯TsFx\~®ÕPëÁÌn93òQ|«¡·]åÁ½†:?¥ m®¸¶•×â’ß5zâ$m*©ì’™ÅD…Ü—^( ÎëúWú}9ÊÓ¾Dº­ò’’\ù\Ö•À^°¯/‰`:.œúºùÎ"Uå(VÓ«£•¶¸”-ûºùšÀ‘ý–̓#Ä>³²çscðÀÓŸ `Á ]{~GŽ¢Ãr| „FØæÏ1©¤cbÊ)ë껉|”´Ì2.—Ýò ž™ð… AöÉ­S"K9Œ^rhP¬™k¤YÉÈr}á ÌGè"ü·IÜV¢ ß'nÙBVŽê¥Èrù\1ø&B Hö áhOůǽÊ2ÙöMÉ|&u2È,‰€ñá:8¶D(.•Þ×ʸl.Ex·t7{ê6‚î|<ïï%7¸öÈ­÷^@Ý’]´ R “Rücõ€E›.~4Æ­×Ír¨Ÿ.ÅÛg²„Øe O ú°Á«‰ ô@¸3ù„Ú-+<6®ç± ë<®¥Åµºoh,~²îkŸÌY)Ç'ÉËmä~Õ¼^]Ì,Gu#àLý™¹Û Yø†m<^eÖZK¶€Þòši1kÁÓÞï6ixâ‚o×´!t6m%> 8Õ…F÷›<'™7~“ÂWó¼ZÇ»,ÞûyŸ®ëgÿBq_¡t;ÇÃ}qˆçü;VŽË\3£o¾rˆÕYÀ[”(Q‘íŠkàQ¼l‘i^Ê è6 ÌS‹WîZ¹Ë¤SÈçⱈê¨N¶ÃÏJ•¾Eþ¨w˜Ÿ–*4DZÌ'Y²ªöi.™ X €ðÕ¬ÿCt%Ø9Ê0C*1‹›Æ,Û|Q B<YH+â²§gî÷Ó³KX†ÊÔª×q]múñ&¿Ù9Ô=>gf<ô“˜ñprLˆºî0/¹†ìŠ÷±ë‘æðÇf˜…î3HhZ¼Ër[°¥@lU_0nYžþ4Í" ¶Æ›–,ûÈÓ¥ÅeòP“iÙ|Nú¯V9µâB {'û¼é€GÚ¼°Ÿ_W½jNk RÈø™4;¢ðú6RQÛ•ˆ2Ö`î>ÕH'ú•d9—¤ò·\’r’ï›/Ç @º3뽘Vsò‹¹Õ4ÀÊÏEê–~úp°;‘N¡ÎnÜÔ.awToõüÒC&lzƒ{9MŠþÌ›=õðêÑ·£!É’gq…I4õ( Œº'…h–,l²£Ömíf;† ŽÖ]™è2ׇ^fœä¹ÑyÉýÃX³¦VC®ƒ¢×«ð÷X’†ãîBuõž3v4¨írv£D}E)V@\üÄ•H?Œ‚ùežyÈUw~îia„šu_ÆâÁ؇ÈOV3ÁÆœ¿ÁŸãÇú¬„É:]@J麬]ú‡Yª› oíJ{EèR8Z³%/®¢>Àg|â²Þ›y76t¿ŽP2oCÙ³ŠPfCxÊûèX<Õ¯ ,ߥ (œC׉εâ]• $ì…6iKc¨„S6üêœâ¡¥&LH‚¥%J–µ4Ädí½êïøSGE"=b¸Xû¨XwD 2þM1°$ö ÄQ ò‰1˜ˆþ!‘0š‹„ÑîN‘0šD¯‹®’Ä@EðNeS¡–¿”aÚ‚’’'n©0ž¼Tb<ü`<²©Îçâ½g€®E5M¤¹F‹Lœ%ù1œ°­XFœÉÆPNûÂ㕳¬¹È\OòqT¾é³ì¤µ'žä>—-7—¹µhrÒuǘv¶²[ëx°è‡îlVµÐœ‡ØÖw|Gú.[°F'ßÑiÞª/QšC««5º§`N3øÔ–Œù5Ãð®îáPÅ €.¥½>h©©{v©«S%ÙЋū ú6…3ÝQ<2Ýà¯õ°¦±9qX¥ËNz1m†ú…éF›½¼ñu“J¥„Æ=¶;%„–^¢‡~}I‰¸¥d lja£ŸÌiíüa^ÉXN× BF«©[½Ï qª»°›Bßm¹ŸIà"èIéÕmÏìfåYÂy>Õ7‹ýú>ï Të;ñ%âÝŠ/3D¹»êx%9p ^* xuCs4á¾rïàhsÀª[‘nVÎÓ^ïèM­>koØÌæ¸YD´Wv™!”ôŠ}—ï ó®B BÛæÀE€r ÉWX+ó¯ó`ýªÁVÈ‚3J#ªtT ?ƒú‘*¬J½§P*¡WoƒÍÉÐåÌ7| ꌿvf÷d¿'#«ÙÈQy™,îsf*%¹Î4ÓÕµf·îøõ©¦æèÉ{û /mª0Jw«CéÓyñ|U©–P=̲zÞ¶×Ü·qã2c7´D;wqjÖp|¸âA™Í‚¦°I)ÿ7£c)­oèÓ+£Z¸pîÛÖE˜xj½»¸ÿݼjmáPnIÊÛ|w7ša¡ž>Ü+®Ósé>Ò¶=z÷oXÉíè;Ñ.áöŠh›Z%õº¯†’Ú×);Äf†¦Û½gb鳕&¼ýAKK÷…t‡Åïë•[½wIû²¹œyóå˜I»žÝºJ“Ü*ñGÖœÈbÎZÌ/²ÈYN¦¸ZWÄlؾš8…#ÁAžÞ8RâðOqåòK?šù“û…ÅôJãóšYø©YQ¼{$ y?CÓöüeí'Opþ|» CÒö±î½9eû ¬Þ˜~}š~ÿê¼ût¾ ûØe.rÏliEQ~]Wš_W 7×ËÜü¼QCÃCó¢%.9‘¡Â!‹"¦óœõ–”>’Œo+ž1æåÉÐOhHñBâà÷&é\çõ¼?›¯§Ã1¯×õÏv½ŸµÏy¿ Ø5‘½©Çß*x9v™Üº>Ð:n”Ü\!°zg>{þ[!*H¸¨&Ÿ¾šõþÕô`»š>\‰6 |6'ÅpZÐ%«ý;…^CYò îÉÇâ|ìæ•äš²¹’ì=Ê•4×^NŒ'Þ@;b<3žåB\»¤f¦>ES™—_­ {~Ï´ÞÇË–w7»gZïÛ­÷îºñ,ãË~‰hz¹díæ)þØŒYâéW¨(yíñ‡fTLg?4£Uûí‚ÄA›l‡7l¯t¨o{jŸ$ãšg qKšºÂ’±È‘ž/ÞV†À§ŽMõ:j?ÈÎdPtÇë/¹~+ÃX2—á.fÁ³Ñ‰»]LS—0°øxÖgi«zê±H¤Ç"Ã#Wšd¸i"P_(3Ÿÿ6e±œ2¬7Wâm5ëÄUÛ H n„W;‘Vµ§cèg=nææ¬~ŽIø{·†Hë˜é ¸’Í•&åùæÿ45 endstream endobj 68 0 obj <> stream xÚ­V=ã6íó+TÚÀš’CR:R,)pwÞê© [¸Ÿœ/’²éx“=ì¤á|¼yoFËëâ¨~)¡þÃòù¯åù¼üø‹‹·Á¶œÿX|r.'z—ó—O‡KŒp‰H¿xQ”8rgEÛ0ä+˜- {$JlUeÆg2@Bô.„…÷úêóÎC4–Vš Ô ’Í&YZÁ»™ª®…¸tÕj&T†Oìôìë¢Ï†°­†,€ m· lŒäLn‘ŠýõªT[¥9 »‘v4QK~kßãÞäSs3^Öù@Ã@o jÝØ[˜ 3Ãp0‘Ý%¬ %1PV’½¡(=/-[l< ¨´¯V‘ÃÕ²Ea sÀÛâ.qhªˆ¬ìë ÖdÁ€'óÑ}õ e ŽóÀÄÂñø4 Ÿ;½3Œµåe[0Ê"œê‚ÿò‰ÿ›A0dfó–hY´.ìu•þ•Á'ý•žÃ-Výô½½«ßeÔ#˜ÌQS+t’ÕÝ0ûT)ÎFÀóŒdÁ!#"]޲ƒ}^YÖ ëµð{/~>/¿ÿð `„ endstream endobj 72 0 obj <> stream xÚÍ\Y$· ~ϯèÇdº¢ƒ:j×N à¼Ù7‚6ðv€ ùù%R¢ª¥ªî9œA2Þî*IQõé—“>©ô?} &ý_þöåôͧÓïþ¤Ó3X,øÓ§Óû‹VËš>ÿýû³yH_ÖõüdœË[|ºôô ßøsy*ý…ôF•ñò^öw¡ŒîÍýlÔú‡ONËXOH¸Zif]¬Í«HÔ§…¨3Íã‰A?~–kBšœÂ^&÷ÂOš(òŠÞc?OŸi¸&—V _OéÆ1¸.ïL<·5µVH#ÜÈk|Èoßè$j€(²ÔÃмúÒ˜èiŠPõ@+K€ÀBïßrƒ(`òlM‚‰k.©Ë#h ÓÔT&s 0¦üøpÑÞŸ?à?¡ûÇ—wáüeD޵Kdrþ1@éS¥!‘‹½¨ïØá9Õ¹i)À6ôGÊgxìY@÷?Qp`T©õÈǰ /…·HÝêaœñyÀ}»ØØ¤ˆA@»:TfLvµ`ÂÅ®°¬qkJjtu'ÎCÑßXp·–· ‚ʹ3tŒF·ƒuIȱ: XÒ »6ž|5Ü8i…úVùþtM†eɼfÀñó0†¥ÅZž¡{b¶]GaÁ@ÊP5õ•2ô¿Y^Q-ðÊâúýL\·hþý+…‡'ÒŠwI«ÄÓyâÂìgìÐËÑL´#GD÷®(×°{ ©ôûÎ.à÷Τtΰ ‡|E/¿¦—¦;Ð .¯4øÃ,N«Ø€¢+,¨ßF¦'C‚ävBÌ­Õ ¶ŽGͨ ¹Íf}ú%œ¥$*2ht›PËÑ\¨KÌ~H\[öé¢Y|¡A¤»r¬\‡=_LWŸ-j¡’9¥/Ô¶¾)³©ã=¾J¡$àuÊFêNzÜc[Û<ÏEÙ’Í‘ÇjSܘ¡Úf íhÚûí@¹];ÑÆ— ÓESƒY¬0û~uYžUÇÉ+jZÝh ‡Íνö–QUá-&Rf)®¿È&HMW6OvWu .Œ'äS–¥FÚT—³Ÿ…,Q=µh»ÝmBgç@p3;þ[º:O•³j ˆÖˆ|/¹Câ:•¤ÛÁø× Ï ”t=ªTž‘bk{~ðeêû`‰‚©°së÷çø]4çm‚\:aÛG ü`¹kp]±i¶VŒ«Å‚Ë`EÄ0š=Co $Ñt“|”ÍÙ g{^–> Ëå© ¶¾° ŠæeFѯæ\÷Üî¾þ€¬9XƒꊔäDArguÁLfIÐ:ÇŠÔ=JŠ”wv9ä¹… Æ[ìCÞ>P±Ý”ÓdxEºz/aªM°ž'ÄåVcâaÛìõ¢« Ò–Îv'Ó%2ÃW(sI«ô޵ÔC}n´@¥43+½U☠¬rWq:µ#’²'Ô\$dëˆJ¦3—ŤnßëGÒí†+‹Ý_·…5h.í¢(±&³£ÃÒ¤öµM"ÚõœhPÌÔ>³v©Ö4L2óÀ’¿V™R(¸A¸ÍVìUw[yq„­yQÆÝÕ|‚wSñ3ré‚ðçè€ gô•0¦ îÃh±Iä듈§2Û¿Fä®Fäù>í1x(2Îä©>ÀèôÉL'·Ú™d(WŒôµ˜ bà•ÿaè—¦%èòþ%¡ÿf’ìœX¬òh™oèÙ«~qL£Ë}Ùÿ´Õ×jþáÐGO‡˜}9]I;ôQh,i‡y¯¡±n”‹6+ŽqA@¢s;uxh®¸g’p3I¼Â?/6Ü)|/í'e† ‰bž£Yq`w®çr³¹Žx7ŽäýjÊåW´¢B¹ÞÁöкÙײnöغٹu³ocÚì±i³;aä{LÛÛÇ‘wNq ë,šOV3¢7Û?5? -–ªP~°Ò"u[pGõç¹ U"VŨ\CàC²#Q$â™Ï{0fŽº<ª©^7b‘ù-'‚S/@VUäÖ^ XYý¯ëøÏǼÆcví=U.î @ò_æ_R粓{/Ȥ‡Îoªò¦Ùxªæ>ëÄ•’ðÈÅÝš°v:ïŠ×ï€= OìøÂ‚§âúÝÈ«(®‡Y<ªRtè¦Á~qѰç@‹õ¢Ö÷ã¸Í+cwH•‹Pä›A_G*Ý÷qÎF†ÊZ<(9Z˱È”æ§9Ë£ZÀZñàú˜ñž/é™;ò†•%2¤1€( ÙòÏññ^c'ôçÑD|MÆö“ô~ªò5i˜Ë¢¿üu .éD´ð¿ÒVµ‚f³D6ªæº¿H¿L›Ñêè/gÇšõxéh’C@D©ÏËÁ€Ù&¢oÊ·–ºÂë ¬ëu96=E³å”d-ËÓYÖR¼½©ª±]¸¼Œp«Yï{õO®é¦õÁùO­Gµâ*.~•óÿåÝÒ'Ó!0º…˜«ó C¾í¦±ðá*c*$¦ÅÀÃæ—“sà­0¿àÝæ·Ìzd~‰¶;Ðc£mŒKhWcÚ·¯kš;õÛä±+„D5¦œ;U|{Y…y+(ÿyâ=*}\ªSKEÔ0^+Mp½âú~³“¬)Xêcç2åëo}fO¥w£Þá^ì©íùþ5Õô¯ád¼:Ýw_úò;7RÞú M,¡dút¨Ñ8ýžFÛ;5ú«gj´“m_ Ñò4A;Ô‘&'ŒHkðŽ|ËÝ[qð¾Ãøœ[q7*tÉç]\B›b‰{]Oq»fâz懮g¾Ó ©V°ÑÊ[‚,·ƒz9©oב\ÓçæÌ¶—¼ ÿÂ@­^r}ðˆ&,Õ-òQØ^#jï²¢ÏÃÏ (®Y”c[•[fÖ#å†üµÂ¦<Ù^x\G*!”xÔò5¨ÅEom›l½*Uï…èÈÎõZ®öýå(†A-TÅ% ýŒƒ:ëà§Adî~rõs„`Þ¤®iš~µ\‰Ê¯&¿èQwŒ%§¶P°ã~U§ÙH*üâ‘9?(qÐXâÐîÒ”žv1?`¤ ù÷ÇO§_N‹M§ý²m29ûå¤c2wõûO§¿œ¾+?–“}Ú!RM.¤ÓÑ[Í?5ÿ NÉûó¾XÅdE/v‰ZÜr©°Xnn†Å†~A`·4Ê/ž¬7ÞÒh­ïusLíY÷¡ß¸°À4ïܳ’L´-²¶yúÂ>JE¨Te‘';'¯‰îÚ®²æ¹|ÛÖÒµ[YE½q½•ªýâ¢ü¤ëÂöólº XÝO‘ Ì‚mPšxIÕ¾éˆVj±"}:ˆWò–ÊÛ‡¡,Æ è#êž'êz­ˆ½.I‰C9Ú)y”¶Æw¿ùàpØå endstream endobj 75 0 obj <> stream xÚÕËŽ$9ñÎW$·*m—ñ#üÈEH0+à€´¢oÛs@; b¤].ðù8l‡ÎtVeVW÷€vKS¶#Âñv¸¦Ÿ'5ÉøŸš¼ŽÿËéÇ/Ó‡çéWPzRJÌÖNÏï/JŠÙMÏŸ~8i¡Ï¥4œ^Œ„úÅX?êÅ8üèü l|V>ÞàûóÅxGYÈo]y62>À·8'ƒŒÿƨ2·É#ÀÖ9âX!œ¡yâ[“æ+ø6Qå»<|þ’f&¤FÎ…4m…õ‰´ãY½&(SÞ¬ˆ9'Æq‚l~r… «ÝŠ ³Ml#¢fF“#÷5Óä}¡É”ïS§ÎÚ§÷qåNSÂØpF„BøôTe8_x±ÍPý&' Æeµ5o.‰˜KÁÿ¢Œ@ùKDp†»Å0pÇžòÆZôõTgõ=ºy\ü ã2¼9¡?¾œiâ Duâ‰,²c ïxÕH 9`§Üå@¢+‘ª­œ/ŒŠs§Ýuê²ÞŒ@Ô™sÐ'‘Ø.{†Ëˆ›Q3­àò‡ã”e¨=KXD-Ó(úæia™¥(?]¢ä J$kymâmÚF(ÔáߦŒcy6*‘¨³”Bám&BûŠIk*^¾ÇÇÙü³ µÈ«,zÞ®¸ ‰JZMå=«Puþ„qÁ¼“˜]L•íMÛ ¡¡èýè½›¼˜=¾uøö¢„›ćÑ"^è0U(ä«Y€fòÓÀðnª¨[UŸ²¢'$¤$Zé_Ij€PõL5õ¢lÉ6 L%ލH¤©RU5Ô·=éÌIѤ}zw0KHšMqìÖò:ª—²‘yÜ›HÎ2ØdXò·éEj;’%㾎,éltßݬtŽŒBÚ„ÜOhGbAÛs’ƒÏ«á–VGhêÓú~¿„fã–GáŒDÆ?‹Œ$:Ž OÁÑ5ñNëN0.Î cz9r N“éŠ$z$G˜Š’lª0f*Šãì0¸Æ7ðñš³„ÿ-\ z¡ŒÎUÍ0j€¡Ž‚¯§Ññ½è–ïuËP¼ýÍ`‰øÍGÅ©0isKÍÃ¥ _É·•^¤”‹™n±£¢˜eEE®*)±”¬á`6®¾Òp‰Š!l/”'%´y9G"\ún_Î9jQVÌhBŽÈØiϧF l î²28Š^y<`á L%êò¨aì\WÞˆvP½#øž´ÇÞ z3ÄÐõ•Á´„bnïÙÅõ˹ëaaŽžÝÞ°\ (N¾Élq0"Ó³]„ zö÷˜Â„Ò†üUÙË`CI£rlXþºIp£ˆ)£PÜiì.Ø”r3sáæÐ¾Àš‡Ê4¢&†l÷ò›Ê!ÍBYÙ#b8* €¼ü’áÍP; /Qä ¶y¬m‚}{¥.ÖL³ÕTŒB´âeŠú ø>Z ¤ÀH>ICa*fq&ﲚ’GKp”+[ÒÓ>ä%Ëà+*Ô¹WyÉ21ÅÅ”°Om(yÒúä€ak£öì ¥ Ñÿص³ìSÀl¼?Ýél§ ±.gx7Hÿ*ãA«R‹ <¡$âòiÏBn…Íö¶kaçε3†D BêAµ`nÕ×xÇ3ž¶èÁvуôwd ‹ð¢RË‹¯Mp4îÑ&ûy§Y!™ !’¾9µ(Oà› O +ìXiÝ‘¤W’² w4 - h»TP[#ÉýÆ6ßê?°(iGöøƒ=ÆÒœp¨âJÌêªdÇof¾C“ÍJ‘ÃNѾJ6ìMGdámKÅ4["¹Çû¢4&)¯yô …õ©N|zòJ9Y¦ôµäy®ehASkÕIædó$ºMÍž:–3úèZ}Ú<¿Ê§Òæ]ꮨƒGOrEã÷"Èöj‚¿©G˜àˆÝÄ'¢¡£˜ê–k6Žù£Å}+ox£l°_ì‚§‚%1¶”i1¦M ›¯áO¶–ÐJ·Tlϵº6«%¦’3äAöÕ•’:5Ì]_©|ßó6å-¬ÄS§¬†ºL‰É¼œŸ*µºÆ™Ñj ¯R&¥6QP[ÒÙÎ^”’~YÅOfTË*“e؇c§•´)5/nN,‡ûO¬&Ùô¤‹73:‡´¬÷Jò㬷sI÷÷hì óig8’Ù C‡/…2‡Î ÄmqÓÝ䦽ÉMË .z›£A\â›~pÓQ %è¤é¾Uh,ô.³@ôTáIoù9XªEV<ö¤ÄœPŽÚÉ.¾måž »·¼cZú$60(”wüvy'˜“ ùÈÕ—ªY=iKø'ˆd¾}ù+ÚV#³m5:ÿ©ñ@–@Ùs“Ÿë…ßʬþvèSmtª.õH³Ê]»0Ò¡—Ϻó `p'WšT×xâÃJù欣m—C[šày£ÞÌ«·¯á?ŒH7—´â7õuˆ5¾áάtF^éýæÍˆ 7ˆUŒÚGVÕçúJèIá³\”wBB.ìš7Íó¢>D•ªl;¤3v¬3Ö˜x¡ÙÁÆæ=²^³K/솨¼Aý°)û×týÍãŠø-JÂ~=ü4J·Œ4˜E]´Æ„å8†|‰ª‡žz+ñË#/ÅHò:1Èe"­… ‡’8NCZ|>“XXí\n<¦¥àÁq‡h ¤L=×ÿåp_V•ðXιNÕû©”°jj@ÓД¢#ùíéÊ܆…»÷†½#"œ»:ItCDް½„ÿϽDlZÓpËø„ñ ý±ük¾”ÄàÐ6üq(}i¨°‘-Š&.hÆZ<š7‰ñ‰£¼Š=™³îþv¨»€îU+L,íq:^zs@¨ð¸æÖR~ÿRG-ýÀìÄÐÜd µÚ˜ïVóÝjc~·a¬fŸPÎó¥°ÌCS×LÕ{ĸwG}ÑÓ8ô}Ñõ:"¼T’µ‡Ç­ý¯‡n6º¸HØð„½«KNœ³mkYÞ§Mí>5íˆeÑä“ȧ ê»*Û¢Ñhö¨îG‡(Á×^^M{kÊKénëófGõƒÚªs˜gZË~‚ŒK£W}ÜH|`݉µwš@9ØúkÓF>pß(²:3 Y¢ CJtê3B þ6,E¥ÀT£©¨†?2Ôƒ‚h £Ä=0(O8ï È]AÞÜ•aݼ~)‰`‡vá@LpËÜ};ô* ±þJel½ÑŸG¤ç0˜.ç÷¦Mû£"ÐÉÛ›è=kÝpw´îÓ(úv«IÀîh]+s]»¯në¾F|“¯gÀ®.įgÔUëå zÒ] p´j…߬$_ï~«yŸßÓ3ÓC·›M]c;ÀÙºJRËÏm¤c+±âhå¹ÇC"9¨ÐJÚ#îdóùD ó ïÍŽu…5Šîm•o7¸Â•óAÃ.¹×vzƒåèÔ…‘.¿ubWFÝZ»HÞ]gù– ˜û¥†Ó ùD¯WÇÙ¡»3ãnÕEÔž.²PKAíê"‹ËÇÀ±¢]ÇIËF›bõìž“„'™­ÿ6‹™;Q:ØÁvçyJ10È:2ÁÌëvù0>Nw¬fuåhvµ ­åÍ›ÍU‚Ø.+;¹…H×Õ$ „–ms9.Oî>V`±6ô~}I[½gþбåç!ý|»Ùî.¥¡ï~^û–„ƒí õèC}#p³oÄÔ¾sÏU…4êÕÇ›Y<‚ŒáYi1'fÓ½†"ôfÙÄÕÐÓí,4·’ÌXÃé ñò Y{Þýë º÷ø9Cû’ëRÌHž·¼×8ÅR§ã(âJíýþµ×êôªó'áO»g[D“»}˜ûá×ü— ˜–¼ïˆúêæbªðú yþáòFZmðœ¢Bº@×7ëµÛ¾Û×õòv=ÕxPú`Û¸ªÝ :£´±¸ß·¼™'[(•!†yäãïÛÛÈ v ù¿ÛÒóÛ–¹uÞ˜çEë<š* ¦—Òj’ïÞ¶æ±\œË`¶¸Ÿ• k½vogØø´ù:·V£xÞ¸ïœ\FbОl(¼?rU ‹[?óPpÝÐÚù”•7ÐkYENœÁa‰‚IQÌÓŸjCôù$ƒëe¤3ؘÅʾœ?Ûv´4©¨]nþµŽ-^6©%"½ÞØ‹0xVPª:y_ÿ<ý<Å@ÈMÿŽKhÔ‹“NÀôeÒ‘èïN™¾/¿žÒ#VF)תnj å‹™-¤úi\,‹š8 ¥Ë©jr^_þ:ul.µØÙ«}gË[¤yE©Žb‹RYŸŸ(ªÎu>W:]×.e>ß‚æTÐá%¬t{Wö[ÄmÙln8|‡1»`¶¿¨½»³lÅF.ÊVž®¾û×9_5[ÿ'ÕŠÏüÞ«¿ç÷#ò¨+?@!øæÿ§: /éúv™®Ö+Mt±¶†b´ßz¦ŸM0’Ž©,ìåÆÏ%䟈UJÚWæ»[N´xf*_óÛ*æ]¤Ä¢ÑnRÂÊ(1!&œêåœ/-›\ËlÛÏ‹n%fVž )ÍuÓ¹ÏûN6õ<>Ù,Er-˜‡ÌÒ‚jô ßÿâ¿âb« endstream endobj 78 0 obj <> stream xÚÕ\K$· ¾çWô±î–õVÉY >ä ÁÀàÙS@Xùÿ—èAJ”JªGÏÆ@Œ·§ZRIE~üHÍí?7qãáâædø?¿ýýëíÓÛíûŸüMp湿½ý+|ýŒ¿ØÛÛ?~YÞ•‘ïJÇ~ô»²<¶òþTÊ-ù©Qá'<5æ]9U¾‰ýLÆc±ÿ3üâò/±êt0ù¹sq¨5 …ƒ–~q0‘Æþ±>Ë/¯ýó7qtkèÔ5L̈¾/Ì#- {­0ƒ4‡VzÔú/‰ƒ¦Øvp+Ÿ÷ÏoJWÌ8ƒ #9[墣˜íý©_à‰®‚O’tðÙæyÙ°Úòå¤¼ËØGkÌKóÿþ'aˆþH£˜´aUi9 6Ѥ‰fRc. 6±7Ǽ‹ ,S6H…YŸ}½Ç1¹ÞJ“÷ûv”ôš8ŠJMþ -¨²+¦Ò ¹Å£¬ž£Ôœ QðـƉ»tKÖPØ ºd4ŽZ›þU¹·V¸iÆOéVæl«%xèò Ë/"雄­ J"QÁq³uœ¾f¹}Ø£Gþèz4AgŒ^òøšÇVa¦¡‡àï÷Ï?Œ6Ô{æÍí©‚Ä%l«l«a6oˆn6¤ÙVË´¼•&?ÞÃêÝ"Â?R.ßA‡`¹È†O7;üs4æ“é•&ïœëíÜ‚:¹ 1Y¾ox0ÃÓfªÍ›Ã—"¬I‹7KEI¥Ù‘ UŽ˜’“½8\o3¦eVDIz°ÃÖº”áäã'QgÏGï ‡¿ý“q°ÇD³>²Î} %C†S¡Õ-^°2_GºôÔL¨p‚¢.ÄFÛŽÃŒ º¤˜Î«þ‚-\}[=ˆíG1l8Ä6þ—ûÍ&º±j 6™êÉ—‘€|´Ê(çDòþV‰ü M™‚¨‚ó‘‡0¸Ô±<?’¦:–æº/M,O#L>&±+aµ‰³UÛàOQœ¿ |åÌT—+‡&:îInñÃhˆ° 4¦8Sßh¨YYTÑð_‰^HU7£Íhd°CúØ<‹3VrLßÈÉéz.²°³3€Æe Šò™0ÎSyOpYòÌÑ3"šŒ˜‰ó °Sè%‚çM®[!hβµâ™Ð¶\.Ä#Þ¶6ãí4E2õ~Œ-Œ‡Ðt;f]cù”—Œ'ãâÒ ¿LPyãP1Wf+˜ü[ž U³ånÄ-± €¢Ô"ÁbNZÕ=Ì㩜L@©"¹OÓ·²U†y»±~ndýÄP"*¢1Äñ‰Iл^ö¤3ì‘É:S Så<}ázF%ìJ8¶ꄌ1Æ®N˜N'”8Ò‰”w´=y Ë»‹µ:E=˜tøTÀ6Fk„¹ÚÆ•9€H– †4'Ë%ŽÌK‰‘ÑÕ¢eˆ0špOˆ8€7ÐÐ%¨œAd£|Ž;¾Fwœg- ÌÑ‘Ÿ×hwϪ¦x_zˆ÷SNÖP6¢Ýؘ̤„KÔB×±R?EbìJvŒÌmp’$ÄÄBæÀŸYæ R&L‡É{dÑû c²FéÊX²Â.¦]Kë(+M2”ä!²-:BÙߊ'l©µl¥A"ÐÔXÖÀ·Ð<6(×òéí¯øsôaá÷ˆ†8_ 5RBkÐ>…Bæ ¶MA„ÎÂìÍX-áA•&¿G,µEžBµöxÈmU¤|¹lkÚ0Ù ;­¨Ùô´²q¤Z"[¶7WuâßKOóñT$u¯êeJ‰Ÿ’TA"ÚnI¨ÜjdZê·ôêÜ/ÛVTðL¿áqvU¢Noµ+ÊÒ$©¨mW6 ´“›% ¢,rp0µgÜV3;5CîK3¾,C?…“‡êùÜ¡úWŒLüÕzàNŸÚª}ÊÛ(ÊìÝÔ»0üZØj†ó Fý{à{ð| O㸉[+oKsRÔEW—”çVúÂ(™Eóî‹Ú‡ósí1´eÒG¶ 1·#ªxk‚ÅPKkÁÊéIßäW]ÿ.M-‡ÕKµ‚ZSâ½nC±Í‰U,/J^ØuRoÏ-ñ5Ÿè:Œ+…FâåÕšÆäveÍèÖ Ý­Ë ÁâX€ a—¶µjÈÙ„¹õÎÑØ'G¦óO“á;ögFÊ¥5w˜NÈçhdÞD8­6Ùðø…m&'¢ >Ôž­æU‹Gˆ”¹Å“žX<çvBsÎä©c“§ö"gÇ@:mc‹l;J·®œ|æ]¾Ó}˜Ic‘UnÍíÔl&T.ö€’’»i¨yΩ¢ä£; ¯™El†0ÑØÚºã1Ý_tÖï!¥<~u;ÍôÜØû+‹{àZ)̃ªœ_°ÄÃä¶4Ʊö5™ÐxˆÛXnÌùëµÓÝìÉð›+ ©ÕH=ÍÖÙ§iåÊQOP Ä{ðžfYX,à{0„.Ù ÐM¬hÉ=pÅŽwd‡(³¨2(³,HÁa*‰YŠõ¥4Iâl=Íis䦅†p¯7‰[ Ü-çИ4¬XØ‘æ‹@$¡AIëo–Dðž‹%J0Öµb¤‘ÊŸ*L¦ö5©ÙáJ ÙH‹9”Ç8Kéå ¨‡&-”«‰ïFôuÀfþDâ"~RÛw©¶~h”Ci!>§/‹Å?àÃcIû™Ÿ¨Ñ×rT­†äÁФø êû]fH‹ƒ(û©õL§î êèôj `mkf¤,˜’¡ý¢’z¦V§*¡ºñ¸Åt§ª6?·´5l”uÆJ)à¦;tpå¿XinJ`cB—†F2M 6× ¼€SUœòƒnÛCœ<Ƀw4¼°¦ŽÐìosBâ¾/¯,ô€l™Ö‚¤¼#© Fz.}anå$ Á¡ÕKn6!ÂôްPËÄ× ÂŒç‘]çÍ`MnߢÏEt¬}'²Z À?Ä¢:­§Ä ȶÓl}U¸hØ_ãòbAª,Ƭ†¯d·sÇ„ÎJ s9áÿ!‡MjNÍÒegÈ Kø¶x^g7R;Ýrª$ÒÛ i(¢y`­§þbc+÷ÌՖX¨U­É׬éë º1ß(ªGœ˅x-ŽOÎ’KMöOájˆÍ¶¥Éð®.0Ècâšò'YÎk=5[ ;µŠ]÷²[¥=‡u™sŠ)Ý%¸]%‡±KÍS5Eœ*vÎJûóÈ+&i™C’š,Üí,<ÃNÝyÿ3^¹öVöÊ8ÊÕ:|ÍÍ•:üºP;‡9éøY³ssP-«$÷)ݘNU™í®ˆA}z#|¬ì^üÍ\pÓÐ÷‚›Î=θiûÀMçù~ÐÑF—%R„=, yk©0wäFeï×ñaIœ„k©²Â©K·Aò49~êÃt· ÓK§& –ŸÕì;¼àÎÝ Í‚} $³œîýþ9¢g½Ã¹õA]0c¢±R@êâ%Í·¨ªšÔ§ºTùjj_|%kn®ÅÄ5«j"õ8Kæb±ÝÇ+†$­*6ÄÜ!ߢ…²E#j@Ö‚…õ²˜s’zR3÷»H|0.»\*…Ùét»oST÷VÕI+2ÛZJ±6HV®AŸ­%lÆp´øv>†ë*Ú»™ÆJj¾skB0iΪœƒrÙ_'2ƒòüK³ñ1ÓÄw;ög¨B’ª·Žª>ÒÓ¢÷è~1-GÓe”ÃÌCìÎÕ£ví8€ïF0­Dôw2¬¿špx¡µX&42 â(§¿±Ëé}¶ ~\™Qá"´ A/¤–F›òñ¾Ë —;>QÇJèÉ5“àÆÖh^ö¯ªx;çð áÞ­ј\>Vv§VkͲØñ˜ßf½m¬ý(š¸W€P´B›'Z~•œjsPN3Zœf ÔÞÆÑ*¶ÊC¯;î "Α³ôñ–Ö¾ .z?³âå"ÎtI¬¸Rc¿%<[ލeâ¸Ä…!~»OýVa&~‹ûc¿ÅõGüV8‚µRª±èuÀõUt”^ϤNìé‘Ó„e†V%rJЋ jFª2_2¥ F“·ç˜Û“Ö^)¿Õ‹}Áȵ&Ýþf&]íÀh'©e˜ÙôØþ?lú•×/Š˜Õƒ·T)-®§´©ânÇ€¦j1^*o¹}%,äîÊí97 yÆFT»aùhAz_^¾-/§F× ¼_¯ZtpÓJ«>"Œ¼ò¢¯Û3è*öÿn÷Þí©¿§ V{V»l ‹mWX\ˤbÓé(P¨á÷RFCxaû‡E =Eð~Çqv¶…£Ëñ²º—I8ªýq(i¼º»2Æ×ÁZƒ\k:%¯,—ô°²P ÀŸ:À5±ÎoH«<ë¼XÁø˜ÜœÏ-Ì]W|âÂÛ_!¥d©qÿ +Áp,A.¹mÊ9Sα¶õQ·“ŠØ «,t7u…zÏö/r$$̯ÿ ¢ ¯Í½ÛÄUE„ƒˆ‰¸%øÔ!è¶‘Ï6ÑU>»ø…9OnMìz?Ï«YúzÝV¿XÍT¯v‹oEÃÓ±hN*2WZµÂëEr™yòWÆIq¾]ù{ CÔû6.$…„x·=˜Áx‰Ç™¨N ÏåK||»ýåwÿˆ€ä endstream endobj 82 0 obj <> stream xÚí\K·¾çWLn»ð6Ã÷C‚.2’CŒF¯N lXˆïÉùù©"Y|ôÝ=³³z‚½šÝ>«ŠU_=ا§“8qøOœœ„ÿùé_Ooßþò·pœNï~9 Â>-øÀžÞýûç»G%ì£2îQYþ¨´>‚xfôý¢”€–V¤§ÔÊÂïz;‘Zjƒ-%´Ô2·†q ޝӧV÷Òá÷ÐÚÊ:Ãïáw§h‘GiWb]^QlYZé<†£ÙËÈ2¯Qä5ã8¶ôi:jã߯îß¿û;Mè–j:0«N‹ổD6.µ´'Ç‚Ãv†i ÄŶØèµ0ÍXŽiq*MÞä&À®f:ÁŒ@V)Ÿ'Sr4”PL¸Óâ™ ±­Öd@*ðû×ùûN $ !Ÿ¨D\6|4§„U j7šP3I•Ì9•,S6R)íî‡Ñ4žqw*MïÏGiôˆÖ~Jk9d-¯ûùi´’Åk¦̤˜1±ÿFæ-2Ûëè,ŒgBÀª]VLc~ÁA$:¾ £Wù{[÷ÓŽ°È 7§EÅu' ;Úº7ÍÖMg¿þÓ,÷ÄL_"foÇ:Oú‹Äì·‘˜Ù›œfÉìç8Ì_)•¯>̹pËÃìÊ~ZN,´f˼#~ƈ8fÈÎD¸‘r ûÊ5ìóCÏ•k`ZŸJ“ ?$SzÅЫ[­IW›~"XÊ€ÉfØÖ>3ôc†›´ÈèÛÈvØ—íôʶÇs}€–jƒ–¾Ùïýý¢5"Έm]"”æIþ­jN„½÷êîšãWHc£y€ quäÌðHqXýURëzJkf’†øîœˆí—;2­P$?·L|þúá8•aÆ]#®Ý×DÄ-aý˜­A|Ž~Xàßc ³æÙ|8.Ìs¥òl>8æý.8sî°0ƒÛ|L˜º£ßˆxNÄÇûBF«„Œ,":~jsXÀ&¸,ùY‘ÝK}XŒV«t£j®Ö$@˜žl¡§H@M")–cøfy¾5YÇ#çüº¥øn)†è)[@)$“9¼h©‘é­þ‰p*i‡Á'á&áâ@SK8,&Í”R˰+.S‚.ö¼Å‘üšXAóÄ}¸ªS «|+Zšg¼—khT\>qFK{΂VL"ŽŸâ¡L— lss«î¾£iÓ4?׿)0G+\"3xφH®Lp­Y ›)¦r˜ ~—€ÊßSÙ~ ã…w0Þ¨ E(Ì(ÞhÍóŽ"º‹PôªJ0SÄ$¢÷&2Ì7}7 …ð¨4TÚý?ÏgZØ…EªuÀ©j+…¦‚÷1€IÒ·ßöê1D+Pt)ÃϳÁ¯A!Î&Yà+P‡É*þöa4CM(™ËA„E?&›0Ø’gî,Ò¹qäGXœœ‚‹°|føpé£üõ:}||=œÌÙ Ÿï”ûM§  ÞôÉ»íyŠãzÈX}Ø7#ÑJñ/;QcX.Ìzãº;IÜV3:ÿ‹ÐY…ÿe{{†û ïWûOG¸Ð1ÊÄýi¢%fG¶ÚNî¬ö§q 8ø¿Q¦nœl‹tÑpLcTéÓôVÌÄê®f² @eçKKjyÔ*¤Îì¦ÔJoÜ ᣜuР`@z½¶þ&Ϭ iÓîð9å ã*<îÐ%ËZZDãlWö>¡šf¾èÑü¶Ò‡ŒYñF‰Ñ˜pHð‡kl°1­‚ÒØÂ V?“%.Ü™ 40)¢Ý¸=SÈ™¶ç\ÅÏzâ8 ÂN=.ƒNÎ ¥ã,=ò;ЧüOÁ>'<è& ɹN*e¨º¤`¾"Î'–œÔßÛ3à±AYí­ûeˆÓbì<;´b4È>ü2 ÁòqQ!B7°gFezrbž‹²—i˜†HgŒ`I½Ž ¦ãФ·Ó“½ô¶–fšÞ.£n§ÖG'Cs4]ür8ÚkOÞ˜?ÄÛ>FQã’ y²×›iQŒÖ¾ON°÷ý“Š2kJ“s‚K:‘ÎùÉФÑZÝ^A˜’Ýз{ᄨÝþhÃÂáˆÙÿF68Ganeÿ}x&’!× Í:F4.9ù†è,û»\ÃtQns+–ÔØC!;§T9“ávD»Mšçix.¼[Û‹¹@U0j&ýF¡ˆx¤eŒ¤¡J•O¶íJEoô̶žõZ–¢ƒ?jHJp#O‘â-8¹/È tæ•§öëLŒm21) ô@M»£Ÿ†–´ç­ƒ^—1:è©ÿžø6}v¹^EXÙ8(W§âÜ%qPÿ}œÎb\wŽFs7ñ ¹<ÆÏc«ç©>@ ê3|³,@! ¾ŒÔé§à—š°kpþ »ÔX餆öŒ”6ÙHÑoÛj!·º^,ˆÖzÅ~…03€ö"{³Ó®â"a&^¦æ¶+áÙ)Zõ<£®äqu ˜»©6¸-ZY3K¬¸å/ãÖõÊàz~™}~ùk”#äšò ‡+£$ƒÈÙ–tùaäçÑñËÉI†”†;‰ŸZ$½V%q¬’»¢ÀKva-PS¬rrSq(©ª)ÛvÕÔUtµ ­ /Mwd#Ú PÉëä“ÜDv)¼4/ǰ‘$??ë×µ—Ÿu©Š³Â ”“J596+êÂ¨è¢æÒ°µÙgbnu…k/,³ò~L©Ã"džeúŒ´²’-+™2Z{¹‹L‘3m)8üªŽ–CM2cî,~>K‹ý>Îxé¦ìœ"Âfç©@… ­D—…ã j „L1Öè^Hn Bд id™§XL£„è˜Dì‘r"}wz:žµ§?N"HÌç-ÊDK÷x¦LyðŸÓ?N?¦;(=a©ŸÕMöРI0h…sʇáúÒäÍÙ"¥pQvAþ±hõãIJ‰õô`¶ÈÒ¯[¤ éöгë,Ë,7*vS£@4/™L&B(°­@ÙÑXö.Ñ"! ,«>h Q'­½Ó®IÏu4~ƒˆ64¢IµOcê×Òxš%5KÈ>,«¦ã`1ð’Ò±¯FIK TêaÖR䥔rªÒ\ j‡4×;àz/vÀ7‚„Ö¯!æçbx¿ïÔû}ü¤6œ)Ñí‰æÆb±[VÃßæjËßí¨ñÀ0-ãì9 ÌB¢Ûv“ÙŠ¥JÔ,ÇŸÖJIµŠòÆÇ“R ‘=˜¨Ò±‘ÛJ˸Ùçk˜çw[Öõ¥ÞìåÄå‘ûÛ:ÏÃ91àd›’Íb8Ïœ,¦Ä(ýbŒ×èEcfžÆâ6cef6‰qàFÑg¨¥ÖÌ“ddâ#Àí*ð9£GéWéñý8nÈŠü÷—I=P"ïi4BSÒòëX²JvïM†Ó&D¨S‘É.$›­ÝÝ|í¡Ç|5ã—‘o¹º®1î3ñX?³hÅQ˜3ñ€BL¦˜©ô³T†ùr˜I€±Xœ 5®Ì×Ó5ænÝ·”Ï…ˆ©["¸Ð(Ì•Ž€fœÝ§cé×,ò°RèV`%z< •¬cˆDÝÚŒê L„ê•‘O“ª(i*+ÇÈ2`¦|ZÆss=¶! ±†U#þã@¾ò÷Y–>È‘îD·±!{všm“ä×nu”U£kyŽ;À ªúVÞI˜3»Ì+ýÆÌs=ó.¬ër7Wë²ÍMã»ʳª9sMÎtæ1»ÖèŽÞÞ´ èDô=öèMý¾ÄÃŽ‚½UêË‹¼Ò1‚ZY ŒJço›¥ß‘¶¦·}4@ÓôϤ|õª‰\b®›ê„åFøÑR#Âh©ËÉœ4æVEòÉoQ¨ž–èWѵfðÛI)ù´µYY~ï¤Á®½ ˜.÷SêñkâïöñþýC½%nÑ=ŠD™dÒѢã†C«ãu_z0µ´¥ŸC%² ™Ì5é},n¤Åå y¥é,Â| /®Ñìµpâ|S&×G×xÔãFüDCªP›Ðƒyt-÷ûñf»ÚÒ·.ÓÓPisÜ…¤Š}ØŠ:×O>âg‰žc§¡V¨‘)ðÙ~Ñ&¢.^c#ÖEå+©à`"¢ïµTô—Ã:|™ÐáJÙ¬õ;ñ #,U|Þç®øP¿âã^V|úÆ´â36b0Q ’ëò2!Å×½ÚÊÐüò¥R­ôj´gbµ*Èf~§¹[Ó­!Þ­‘1Ôº#;âˆìømÙ<2c1ž£LƒY6Je~0÷¤s¿À4ß©ì¨Û¨שž©‰×@þÕW3Íßó Cøžñ‘Ÿl¢5ª|ÂT‚ÙçõûÒø$̧3aó4êò"¾$ a8Æð«ôÄÔ’ß•žÒï€ôøCÒ#?é)) ùML_DLÁÂúÈ*¦xaÁê]1-ý>¿˜n™×mÄ€×è ZÀh)ôêñ.,ýÝlU `€…§ìˆ†y­”t÷–î>;L®àD¸KT® C¯ )ªhÀ›Q¶¿X‡Oìħ§×¤~õ t9¯^AÏßNüQzAš«¤õwôRŽæz›)m$Õ!5Ò$•²ärž2§UÍ}{y“ý;ÅhRÙN’._¥ÏœèJói¢KoÕ§9+Âö-°EDO³{çhœÙ¥jyÍCz…®µúT…ƒÅÒ,­š—"”*¼v¶½ DGDV òÂyn€NÔø¢¾Et™åFDCT«”³åU«y$çÃó¼Í£Ê<9”BEDí±Z„Q±@#â’®’¨Ì1ß«èo4ê†þ2Ên—³$fnd.h*ŸÓr^Ç•ûÐåF?¸ÜXûÏdÏ_tQêJ©‚ºˆÞÔ·6š†µÕÙÄ–Å3µýýC[ùïyWŠ7C„VœYÝ@lgˆ6·²m Œ¾Þæg#_Ó Ìá/`}~©¤#MþãŸþ‰ÄĹ endstream endobj 85 0 obj <> stream xÚå\K$· ¾çWÔqžR$RÏ $1’CnFæ`ÀãSd‚Sþ~H=ªTÝRUuwÍî8†Û]­W‘É”´ÃÛ Iÿ¨Áý+‡¼~~ÿ×0()‚ ÃÓÏôóÈ_ìðôÏžÑ8úÏ>£3Ïh!}6š>ã§ÓOOþò4¼ B£þKƒ8áü0¢Ãë ”R—ïÿþ>|ŸæSºšpêe…ÖiV©LœZÚÁ‰à¸`‡„…Øèsiaª±h¤0LM¾-MÓ)aX y"{9‘Þ„Õ‹‰H^ó(V?('$äZëQ(p}l£.åeP„@oŽÂ)–—u–¯]qåNšþ(“£l½ u~‹·ÖkÐ'zД×À2’›FòB" Þ¥é -xšzT$úœoš³)!#Ô05úárÕ£P´jÀ¢Â—ܧ(¼ÏêƒËþFX“ý®µ/´À©Ôz«…Â0Ò z]®–ðË…‚@H;+а€64\zíа;LÃz[Ãn¡ád\Ê2ÌœÀÆÁV÷,çÙ¹l‰ ÷j‹ÀUêGˆP¦‡‡‘Þ{4lÐ+"RÂëA([¥y؆"Û?¶Ab K ÂõÎäÜxÈ™”&=ÓQ›–¶œÅÛ’åû3°[ú(Xë©Ã ¨ æÂBI„W‹¢ÊøSÇ­£«´ñ‡Ü¨m#E³$¥ ¤/ÎæÀÔNÆÐ3MNËTåNàÊg…Ž[¤žš¾¤©ÓoÆN=sðä_-¦^Fr½ ž mŽžc'¥±Á¥ï];I<²:·­# F/ÙaÒª5-wúÞ]uî¤0¸Ž&¿eÝ*š÷™<ã¿èÿʯˆÈ0ºvZîÔäS3à{Çn$Ó‹‡Np±!·h޼Þô{x>µp¬5$§ ú„c ¡•*ýÇD­àÛÊ‚½Ó*ìºô'·pÓ¯õÓø§Ê¨D[iž­Â?>!Ü4UÁÒ13ù27ÄzHÀø¥ñú–ß}j‘¬5ÚŸ›ÖnózÉjm–Im¡ŽmÑLrP•„’­§_ÚŽFΞ²,ýwµ>Wôk[ú•ùÇMzú¹ñòFè2øóI”W“B¢Úí¬ö¢ ø‚j~•$ç^å•AøŒ¹5E86 ä@—½¥L¨â!£ÞžLØ 1z2`ò Rrð(ºÌ¶ô#tµÇ©¥ÌB LôJ“o/=—òãˡмFŽœª|ïz®Òk±DÛ‚1¸ŒK$¿5Ãx=껨oX¾;£~’šÀR G~b$ûmƒ!ÁÍj9̓νœ0¶¢ ŸdPl1£iUÀ¥W-à.Ó°E¿Ø@”X|’þKËÒì‹kO¼ð³àH Š-a¢¡¨Üì_¬ ø—Ä##>„ßx$[n1åóš ^°!X‚:rV*1›ü §¹ÜË9eÝ0lgû¶;5é¾.leñº1QXZ ó<¢ˆEÕ± úº¥Àè G;åÕsèÁ#5¦FÚæ‡ˆÔR¥ð¦F($4»Öh L­Øos_Còã…â(&sJ'[䮓»Jzª›ûUÊÕRž¯hä[›FÚ÷*À„¥ñêYu1”]Hƒè%§µŒ[ri$ ‚¨UÓƒ®4J¿YßµÌÕ ãòküççñ åEßZ#D[H¿ÿ«%K?Ûì¦${Kô‡/ñÌ«”ŸE" ÚêXžªIƒºª†è…dí‡ÀÊJEDœ¾÷‹ˆ©È)èrSa¸çàÄ‹5&rÙÛ:VUyÐ]dî·\äš“\gêœ>,‹‹šm¾¤%\«mIæ~‹Eîu‹Œ¯¥d3mØRî·XÀØÃš¾*05¢4{…€¡ý‹~ R0¼‰‚9fÖ „sâr¯1§wóƒ+½€ÖºpXAÝ^¿­j~ÚY>VXº…Ù/«š†Ö^)P2·[úíQ¬ß«Ø—f.¹ T4{/¸ÒW\ìF¸Ã*Ü-îsn2 Ü{†Ô¦Às¿bInŸ%Å,°kIaµ„©ÏÂáû[“'¬Ý§ÍvÛÍ•~‡*g-Ñqý<‡"2'8±(JÐÎu¤º†Éùv1¿‰„”+.Fy&»¥Ò$Kh?.,Ä^È­ÂvM)“è2¦Ëu¥Tg˜ ñĉj¥è‘gŽë-½ò˜Võ‰…O%+[–èÏŠIÕà¥äa '/I@y51Žœ `V•W ?ªÇ2X’f^ˆ§âvÅ–¢pòH„‘TKVB?ò'xx¦ÏˆÏ' Ê6~¶Ï§Ÿo©8+@Žn”åÞy¥ A8œttéçMÙ º‹k© \“0¬U[ô!žú¶áe˜æÚ±ÃXïáþÒ Yž\/;M<³dWVtuXú…©¾¾±ü8ÛÈ)³÷…’ëvÃêPbÂa±ä>”ÆN›mø$a*S¶fvíÏáÁŸoGÌ©´”²iq{ÔÍG4öÌ÷ÖG”|WóݶµŽD€¥¯€Ä. Z[ÀGb×jîÝ6î-W nĽ^: Sã¾¥µŠY&Z¦Ñ)Xȼ9ŽJi_O!C@ ™ŸZïàˆ+³Ë/äÕ­e<Š—Ê€x(ÃìÄ|د¸uÌã˜Ç˜Ç+÷ÒØÀõö¸M^„¶öQ5ùA?`'wHPàÌêÞ3CèÕÞÞ§4’P¿–¨‘¦ Ü®CĽ¥"··¶WÅ=Aù6„½µæý>„}5€½52{w&€‘q;f`\ˆÀÜ0·`ê€ÅÝæ `÷Öx>~fz/›øzVäs+¾>º¸ÿ¸|Ê0E8÷ò(Ü—³zµcy›ó;-™ÀÖw±ÜïWkvà l4w$½>Æ v؃ßcz‡=øu{Ï$ŽSR>¶ |­<èoß#³I-g—‡=æ ö°k×?È5Õt.µœI»êì;ˇ^IÍÅŠ×Ábå{O^¥—•™»O¼„p~â¥év¯¨Eï?·rDÍûëVRÈ+2÷ÑÆóŒ¯q#Lκäºô³ž7÷>^%Åí9ï¶äã­…”_wîg>F½ƒÏÌúPÁL`OµOÀd{àùÎ3†â Eɦ0s”ûíU„‹?âHµK¶ü˜áØ­ÿ/æÇÚ×#ÜÖÆöúõ5ßhïmG÷µ¾ÕzÅ]‘¯ZÐ ñ4Ìu·¬ÞÕÇšxh6à#`nÓt€’DœéÜãcýŠéÔ¡îì´Ä¹®—b>äõÞÆµz÷(FJKºe³ãb/ü: ¼ë.ª(º qHaš/Ðl 5ò•Ú]ˆkÃî“XT ヺ2@œ™+÷ÐEikèÌRF¡¾@÷M'¬I©ë"Gpìr™ øTÝhÐñQÞÝ6Ññåý›$¹ŸŽ¾ë‹rÕw¤± ޾fªùô9• ÂPŽ»gªŽ¸hºm'~ÅNÖ¢ªZ«Šö˜ÒWÑ»¦„þ.†É”>X½iJS¿¦´ï6:6L)= Pþrœu/îvZãú-‰‹%Ùjo£}£9[,ßP’v÷f«æ3rZÏçùò9<ÝÓËsð&¾†ñž÷x?ØU–ýsð¹_ÐÌ0¾ô²µ[§×– nŽpcÞs™C™¯¤è¨ækÑ‘ûY WmÀ½C¦¿vf—¦>wŸÎ‰¦wrÐGÔmÀª¸[=kÓ鸷¡ÍÒo6o¯?Ͼ:1p$vGîæ/s·K­/ÿB€…ƒVR²oÓ©´H4|Ñý÷¿ûÁ cˆ endstream endobj 88 0 obj <> stream xÚí[K$G¾ó+úØ-O%ù~,šFXˆƒ%ÃhÆÖX¬µs@ü}"23òQ•ÙÕ==Œ ZÙ«éîÊg¼ã‹¨ÃËA8ü'NÂÿüð÷‡/Ÿ¿þ*g‡ÃÓ÷ðx}xúî¯Ç³’⬬:+£Ó?ÍOß>ýæÀô:I&~W6ÎûK$ìÁ±àpÈÂD8,R1«âóUF(ælåv¾aVç§¿£§º9‚gZ„bÒ¥“sÅ·‹hæÜ—ÂAÏ?ŽVr¸FsÕBŸÊB¦YHhêBÛU`€ÓxèL“Ÿ641LЭϜb™!¢}qfÀÐB•_˜Q‘-Útlv6|ñy‹G1"Xº§bøínÒÛ–ôRŒ]®£™òW°ÐXú›‰v!¥ ¨ª„<+§O‹áþ˜~1ò$ŽàðÆ9ø?à cq&ŽÆ†žÀ¯þjø®eZ[ëô7ÎâqÖˆàF1ã2OžçVÌÙüx…mMG/ÛKܦ»ϺîÒ5âaòÕ¬Xpz½§iN²°œS£Ó.JJ4(‹´L‰Dd¤S—htjÑFÏÇ!•³¦(ÏM2iææà”¶¤9×Ûue`ÞB²†O£ÓYfQ1óŒäœû[©‘‡ø–  Úb`BV¶“4üëíAò–Ë|¹1cžyY—صd³=Ä.ÅFòº› Õê3 ¿VæX5UUÕÕD)f4Z»tÚ?œ/&†^µVfp&ÊZF<à4H¤=’IB:æÝž€ûÁî fý[j”ßõ‹ÿü5£FøÑ(u…Fù»5ÊïH/ĊǶCÁ’‘ºŒ1õñ‚®3qðÌÀ a¶IÑÉùØ»JŒLHÎ.H<ú9rZíˆ;}ÝÃð¦¤[Ë0Š !£˜îqsôJéùwÏûa¸F¨±òXUuÝd'ŒêÃñn £)êÈ òª ÀüL^dNŒ_ðŸÊL0Mt¤ëw`wž•Œ†u™Öš?àK|³Äá†=²á¡.C­$YÒ  Zɪ€˜ì²„ m¯µ ¯!pG¼†¸GÉìùÄà´ Œ .ÝÓ™êŽL”ø£0_jfp7ˤúœµº´rnÒ¹™s3Ì™;\úJsZŸ^4§;?((pmÏ<ÓׇÌÝÕŽK(>[—fÆ.m×ä¼ýÌ.ý*ùÆ^ØÜÂIX[ôʨ¶îðÊ,àL r-Ü(ãõn9¶HK/‰X=ëß_o`“î’ò”ø0ð‹ò ø¢ ŽÍœöHéJ›Ï~á½üBÏËx^Žñ¤¤q¸‚BíË4æÃLnùŒF œÙùIŽç´èœFá§LIúdsnŒé8yÄ»óŒì¢\~Zq•|MZ£EÅ —ròZ“™ÙC¥4)§„©TE' Ì“òx[“Åæœ9댷£¢“5­Ã}hѯ.HŽŸ#L’rÔ+0&]ŠTˆwáM­~z+çoNUƒÓ³çûôpê0~lS—…x «+`š²Ô“A 3™â Ynˆ0Mœ†²¤\ˆ?G©Lß1‰“ô·P «¡ðJ }ʪQjó'›Ÿe˜ àM­ÅY]’n¤­¡_w¨VIc°ßóÓ¦Sk®u½ô­ Ì®ŠF}ªÉm¤\Z,êh®ò¹H 0–i¡e©#ÑTXë‚lŸ¶z€ ´;® •«0Ú~ŽTœÀ@?Ð0<Ѫh TÕáH]OHu¶LY©ïܦJÆ{Ú¯¹(˜ÞÿËlÔÒÀ‹2MË‘<ç)¼‚ˆöXIA7KåIúcµXV$ ;ÏÀéšvYYIRÎ/&HkO9€–Õö 3 _›@6hj7bOǵ mtõêWYIiĵ¥‘ C Vzݘ³Œì{ʃÖúFUÙ<¯¹¦^ór®Â ×ð`…=ÖÅå±15®A/ùX]ûUJ*Fö6]eG6ã9A6ýùôa˜#;i±vo¤íF=E„…Zþæ~Ö &~±m(®YSÔ(G‡4˜iȲÙïœdjñ ëß,b“ˆÑ$1‚ˆQë&b,eÝjXSUx¢sök¹×Ž"ˆ&È+6í¡¬]¼ -+ª“ Pðûçbq‰ôÜŽÈÃW%œ)ܰSï!*s¦Eé€ äô˜ce;ÿ0‡Tò<˻˘ŠÙÃTÜPéN;ˆx ËTD,G  ¦'¤yÝ íHËd›ÃÎÀ˜Z>™Y©®ÜsౄòÔøÎ$B(ˆô€ÞÆL 0’á…Ù9ýТAÀi–ãØ}UmIGã´jH,y¼Ç.‰ó´–ÂS„àóÄA,˜ºÐƒd-èÌí’ÕWû˜[Ïç~#„oØçÓ”1„›–ÚÆãè=j—yWÛ_Kî— ã ¹ÇÒ¿¿,í>V=¥F„öJq߯½÷SY¡ž³Ÿ¾ßNõH ôøe3U3NsØ0Gažj˜£ðª»¼)Óþ+ªàgªpæ’òATs8€ˆOwÏ6–›½›¢ˆû4/%Þ;ŒÍÑâ tôÃÔ.Ѽ`QÂö¹!^­*ð Ab#Ï/Ã6½‚ä+ݶ¨·Âa¯ÅÛAÔj QƒÆxÔœdÐÚ€’~˜[Ã4’uŠÀ¯«Ý¿AQA\ST¸-C¾ ŒªÛÝ3ËË13ÐJQȹçßÑ™ñ«mõµo-Ue#›qt%Ì*«è™ WïÁ¤*Ô˜ ©¬RËSE.ÈödlÜÚq¯!h~m±4±» ”K¿Lš°na„¸éý–—1¬ªoâĬb@UM-mê|mÛÕÝÖ~þf8Lž­Ö£F`‘Â_ã¿b¸€hú©’yéËÅi‹Ö •×Axï¥Z7ª›—‹9ÖÔ¢¥¡µ}Ø/ð’¢çõnìIæ^ã÷yŸ.·¯¼U 5SNÔ»d¶Cz¢V-Õ›z=·Ù—VµÌ«X«çŽº ÊËjQõl_±ræÆ ˜§^„²’nýѼÈKòšf]Û‡PgzèÅÊ—Q{}iÔ¥>„D™M¨þ¹®¢ûã:r(]ÿߤÈ|Û*úÄ»ŠÒ½Î'êhº`CNËuâb¹îõUIá B_üö’×ʺ™†Ô³«ªª+Q aX°[¤Œ¸ŒýÄŸ vÿ'».ê—ÆÆjDmþ•¯Q(¹ŠùõÊÕMº~scÒ:èÞ†|hƒg‰…ÍÈAÒ†‚-¸>t'“ê²6|õô§ß~=®U{⨵IÉпƹt{%9¹Û¥(.·)†6E›źOQîö)öØßzY[AÆß %ǺØÍ[Ñ«>²™ØBüÅÕšéäEµ‚¡¾Ç‹jzÿEµ 1¬cÞö/ª%A¿õEµR³ž¿¨V½h󢚽æEµ¤.éEµFŸ¯±™XïÒS è¦äd¹œ!M„—•F†D-„|ó«ÿüOa# endstream endobj 91 0 obj <> stream xÚ½ÙŽä¶ñ=_¡G5<Íð(ZÃà ˆ‘yÛÞÃ^²ÁîIüùáQE%ªÕšqŒÝAwK<ê¾Xœ>Mj’ñŸš¼Žÿåôý‡éëçé·Z&%Å"—éùÇIY±ÀtMÜôüÃÛÙˆËÕ5ߌÔ7ãÍÍXÿ\üKßmü“7ãÒ;H#õŒ#’Q ­"׃°&¿€ ×GN+äü†ë ñ-É”O0íÓ{œEŠü¸ôÝÑ~ÀFä=pß2òÍ(a" ¬Êà¦anòIâ (X:b(œ¹'\ §:ä«á^*íABaäh#ïùFŸFËx–í4^)׆-õq¸TÁ´¥Þ 8 c„‹üÕ‘NKf_Èß}Îä}ÿø<}šDýoÔe—7õ^h7}˜h<ýþÇô·éÛb~V Ì †@½Ie·´qi‘«Nwìähû©¾îì"ž…‚84eY\ÓgGUy@¾ÙbI¬—d8UâBwêƒ]|ë¼p[›±Uw…WMuH6ŽaþðÝÏ·y$5‘ÌÒU9íi…³G cEPMö¾* ³U-=ÛEë©ê­Þ‚qQ¢Èô@ô&Vš„øò82Cì…Z82Ù ë#+|ÂÔtô&´Íþ½Çò3‹ ?ˆpÛåá`æ ^Ž·†tæ«@ruuÈX&Ì‘L¨PôÈH`Bq¢¡úÒÙ4:B‰~…Ìù²l8ÆÎH,W½ÇV8Ðä:d× é»»@” ážG+3[ǼéL´I[P—n‘ei¦@o¬nê2ZÅ´ØçÊ-´Õ…Ø5˜ À¢#JŽGSp‘fIî¦tq`i†“yÄN(·¢dbŒ–Ô"…s02CxTy3ÊfEË*™$:±™ÇúYb2Z“b{TOKVµÌ ·’f˜ù67É‚ãð½lz¸+½ó>ÚOâ:y×´í|ã;ãƒû“ȯÄwÏæë¢©î— ”*öÁ6¶=Ë–B¢íÁôòu*.J v; Î¥¢²ç1Ú¿€Ñ¬(26Ìô† ÑS7.9UÞ'+Œ³¸L\V(ÔIxíòJQÌmà ȱíÞ{ä£×ŠJŠi¯CÒ·†/rKµjzèL‰“‹ßøz§Vž:&fZ°Dýžw¢Au´¡;Ú0šóÐök±,»5 Âûe7Wx"ú’êdÎ3Þ9ÝóÓ¡µð¨»™CNÎ÷ùX$ù>7Ú´fZ¤¡Aþ¼êþ86ÞÍü*ìŠ8³d4k9qŒbZ_4<;µÂ æÀÈa«@p’lEÑž«qä"ëAs&¤©*2Gùks®hˆ«›·RÐX©éÛ£¢En…fÕoЂ÷SŒŠ- ãr4oŽ,N޾Lå}{ì›?¹šEÎÌqâ–ë%˜¤-Ró£t<ÄÈ*4uW£HË©þ>’Ÿ ÀóôYdDë$ir‡À ²‘¡AŒ‘IN”™ ‚´¤¶VÝAÁNu:ƒ¾­N¯‹ÔøîŸÃª»Ié̶ê¾qJÜ „¬v“CPfóº8ÒÂçQy R‰ª,öû¡u1B©JŒ¦C?@Ò€ß u*/©c¾í«ÀÜ)0øTÆáÊVŽ®$lK’óP &Ppï@'¤ò§òhíè| :2^StEÆ*0>¦X< qÏ4=e–¦ØY³äRU¨6@ù†£Ú’Ũ՚™ršô ²9 ·Ëþ*V”æLå[0Wö 9gó§e·™¦{òÂ,Ê>§²(ŽÙ«²¨uÌ(YÑi(ÊAÔ=³ï 3Ã{ù?%°RÖ¡ÌE¤'Jöïv«JŠ÷‡œ­*!¯«*až¶"w%îê(‚@!¿fžÛ´‚L;’uÎx?êœyi]²˜ÿ£²UO8ùjZ¬6Yf³s"0·"ÇWXG që‹d,+zÒBzB)eÇN‰qNb=\ø¬[([u eÖž[È9t e}·°g­‡~¨ø‰„áõ»*œÖñ”¼g‚uY? ’ÊzŠs%í\ÀX?CL¸OÌV+ý…ˆJ˜ohøÄE³èí•~[‘eUKÉÚö 3UÃÒ%'s26Bj|Z‡˜úAÍè¼5.(ªýreÛäšÒYÞí’ó÷èGE™:¥øK¢ê‰ÂRkF>ñ‘ JéÄ(yVŸý@˜Š}†RdAep+Ó¤YñÈ×úÃûÿ\"¾ïk™Ð°À6B­m:¤DcxVëÍÖ'¾yÎ4:ÂYaì‰d@Z&‘¥‡,ôŽ$YØIw/`š>Z·ìX®mÖË;º,WÙíATK#cA‰©dbR\4à ²Dwå:WäüV¥L^ŽExf y|\Àx—‹4r¹£‰v§Õ1Ÿ(9c©@.gu¬„¸Æ=Sâ"ž¸LÐ3bõU³†äõb·1eOÃHiU‰.bÝ‹¼¯ssc4¹Æ ºlâ(`â°ŽqÜÈ…8&fÆÁÜDµ†¯yåuìUÄX[½†ZËZ*÷>ç´mŽÐ›ÿŠ’XɬEè}ú -L,ª÷;7Ýöl·z{ÛµJc'K k›w/9¸h"õÕtuFÇ'©|Éw5éÁn#xR÷úwV·+Â஑¦{pêè’ÂAc4^KîZŠ–›k)ÑêöÖÃk;K¾—ã“£8{}¯kK™¯:}N‎–[¶»mé4œP}÷i©§v5Ej³í©ç?òÒë¾_¼¿bô}©Xqên ;tå}¯Œ]D¨÷Îæ6Ñ¡òp “p·¦v×õ÷#Yt$¡YR»^Æ\¿ýÍÿ.’Ó— endstream endobj 94 0 obj <> stream xÚÅ[I\·¾çWô±ž¦ÉâR||ˆèƒ;ƒ €Ç'Ç6dD€tIüóÃ¥Š,¾&{ 1¤ÖL¿GV‘µ~U¤æ Ós@HõáÇ÷‡¯žŸ¿ÝF«Mo‡çŸÓësþÏÿúþøb5œÎv é7çÒG¿XïéÒÇñÛ`Ò7›~æ֑η·>åIú˜<ê…¦§wæ1}GÌ3ü±ÒòiæOá‚ùi8ÒZòœnãój(êÊ?¢m>æ·•b^él¡Í´°¯¶¼5¦CzB’ÇñíówþæåÄ[ïË,߀6I…óé‡ç¿‰[å=IÜÑš¼9½ÝŽ•~–Òlo^ó¨¢à¹U#eÍ”zãýz§Ywš¤Uöe-6˜s}Éê’jpe‘n«(*áÌÉ Ê&Œ .W7€^¼u}TyÛ*m)ṡ†¾_l‹çºf*ï,ɪ wCe škÑ¢éÆšI¡-L>k¼ð*cŒÒ>±.<µv<(Pm˜‡ ‚˜V¦‚-ƒ>ÎÈD…é+ù2-:Údr<ÔIŽAm¦1´ú’¡Sˆ‚á»)GTNpLf]ÇȈá8bôÄ$¶ÆÅ* é (ÆL$m@Z‰íQÇ“—¡P¿/Êf=5s®`tkÿ¬±È¿ÒO(.\qZU {>‰YgƒA¡“¶ø—Ÿþ“‰þôÛé Þ1äM9aÉÈxdÞ 3-#}‡JÁk ¥A„Ò,Z~s%”†< jkˤ—_ìCÜÏhüxFt°Ê¾o°Å` ž2Œž ÿ6jzîü åç¨U’›5"!xV-ˆ‡Ù,¸b.-qÚ.<2#¢•'£­£(–ô ;ã,܆ôZ¥Ê†W[¶²¨¼åœîº’s&F,Kì{:)áÛú'1QáF®ÿaâØ^9~}®‘¾P]Eðâ9s:#—Ä’gÛvzïtÈ¡ê€÷aï6eÇëÀ¬",* 1üuÓí»˜‹‡L·¯<Ò˜SU@èªÈ¾X„¼PE±s©ŠžJÉ´Ã<ÙrñV²Ã[ÉnSi¨ ý©Tñêd7¨‚ƒXñN[ÌÙ9Pvà ”,wÍ'ÂL*Oåhîùé-ì…Vå¡9tœÊÏTˆ%çµ(` TÐ#Eà4a¤{¦}R|ñD—ÁÝ@»e¢z‚c—Ûr^ˆ‚¶çýÌ.œ *vK4þÒ0|v?a£òN˜…ºUã^+UãN$N.L…+ʈª‚”TöZßÿ81„1]ÕÚ©?ã ʳ¥;1OK`n–ÀÂ>9s?æ)4  áÐd'rcè&@ŠmG/B Åš—5T‰eAú^6xíKÐÓHB!ƒ+”5²Íg$”¹(UŸˆœL’Dý8¹XkØaKÏó ét€ à†L‚,ÑAãÓÄ ›S'ÃÌ 7(ÓæCæ†eKÇ•5Ûdt…5Åʤ‡æ9RwÎï Å£ÿ& qܹ™TûtV?1ŒÛd¡f1œ)£úú¯ñnyWmÄËT(É´,hžÀmÂR½^3a–¢|ßM³“#_ì|9 B "t§0NO›¤jÒ—6ÝæˆÃ²n$ý ÷x VìŒSÆörµ*«¿ ±áµ›0ÂÈ.±¦ w½Èò"#òú‘€ÃVh#ó!äÎÍÙû\ß•ÝÇGe£0«¡ÓSW7"¡ËŽLÝá<Ý}1--T IßA…ûs÷‡9¦K€M È™ŒòpŸë]edbgô =22ù«Å2柗ŒÎÊ$è–Épp±¢Ÿ€ÂT"Ü‹ùz¶Õ¨”~K¸ÀÊ(ˆ$pî”7+.g•¤‘ ¼Ù•5n_Ö¤øS†¼™Õ°$¡sÂhºY–<·è­•_O«T|p©ÓÔÇ–üïfºŸä+l¾¿,jZûÿHYè¢L3¹¤k’™xtÈ+É’ÙÊ oæÜjrÝÆ*mpWp3ùÆ¥|aµÜ=ˆÚÑhÅà/Sà{í9 "2æõRKÜ;B;žAÀ¯A#èMîŒ×‘#9Œ‹¸|9jÄ{„à@§íÂ<#Ì2\ŽNvÓtOÍœQj¹ÔAFoFðì{ ukçîxƒ×áð:QI47Ú©pÐ;ÔÁ=3/ʲ梟úîÑB.:.äêoT~=­{hã¾ QßÕæjBƒÆ–ƒ)½’–‡£?`ï"Ý&æÕ4€|ÇÊk}&ýûйÞúÆf4,r?#+­ô³ÍµÃ„Ú(ö—IvWO¯$FóWœ=‚KúÕIoƒžC#ŽK„d#C¬²îí¦N¨AG.øIäÒxöU2ò®œ•¾mÇ6ÔÛ=Ro»Ø!;b½VYà”5ÜÒÕôñ8*»v:ƒº8+Ãxz,kYøëùUwmÂ{Ûµ¬ùq͇eé¯(]îˆ%}>|<(—ÒûM™3% ضˆß§¢Ûe#¦ïÿ>üýðm½˜0†šeµÏ€fí AAò„TsÃ2ÙÜ¢m#žæ(.0jz7ƒ!¡'ÿ„Î ¥_³:‡åÆü›ÓÙ„1RûüƒÞ}˜á ˆ¼h­§°WwÔi ÎËu༌I`y½Ÿ¥}Yî«Æ7— þðø~¦TÎ M¨]Qy«‡Z ã+Eå`tÑ(LàÒæêªX]Œ¹6æK³kó6Ýu³ ³Û3Ýî–Õ¨yMËz`äU4²-Š\ r/­ë¡Ã·<<ùrN) +³ÔâšC„É9Œ(Q]vñËuèý+LœÚ˜Ç:;Bâê‹i)ê$ve”ýÄA4Ì‚hÈf{¶.æ2:GQPÛƒu¥yÞ)û€=/CØÍùu> ø0èš(òéUŒiϼ%=Xí¹Í‹ K™Ç÷|ÙQúd>ìnž»ô(”•ìünÍÇy·&ÚÖ­aO-û.›ì’µCÝÁœ³¹æ-~`Ú ÂêÜy ¥/{­ìlU‹Ýî8f Ñ³T–`§²yèW—~›ƒ͈¯æÆñÎfÄ—æ‰åso±(OºZ±Ü.ʲ§²§]Ø»· /ôá{üºö:B¦f‰)Iì.à<¬U·åÙwjuÙeÂ?F±£P‹¼¼V 2ŽT  "Ê Qq:½ìwG.ZˆSó.WüuŠ .-œL6~`0–Ê©¢nëßÕ§½¾n åQÞ¢:$Š­®ã¹ó ~dH2r ÿ Å`_yñ¯Î¼÷þ×dæâ½\— pÇáѹr8UGÌî¥WÙ$Ì®Ägý÷ÒžYÁñz ;iWèáÞƒhVzq«¯YÅ‹ñvvéI¡¥“Ä´¬+ëݪˆÂ]Å4£ü½ÂrÚX¨ > stream xÚå\K“$7¾ó+úXl =RÚ _‚æäá`°MxñÚ–À?I©”²ª¥®ªžžõ¬§»K¥Gfê˧túñ¤N2þO¼Žÿ—§¿½;}üùéwŸ¨øîôù7ñùYI1ÇÏ_}1™‡øež§G#áÑ€~4ÖÅêѸôOão`ãoåŸ7éùÃÙ8?áÓô (|ÓÉôÄMØ6½—ž€Œÿ|üMb¿¹/Çû±[;YFƒå¨¥õ_>ÿ4.g>¥ȹ¬FϘ¼š¸ ýp¶¦2Ž+³bëHŸùÚÒœ¬LoÙüVúäÊŒœ,ÏÓ{®|.ëHk²qå–ë©ýè´.gñ/Ø5á²– a'ÙÓsH¤wmˆ2!(“2å ]†VçFGW†ÈÃÉW•He!®ŒLóËD’C$2ÂÚBtˆD×`&;Ï5¢Å¥ÓSŸç6z Í”p¯Ò' ’ôº§æ†:…$¿Ø”Ï8‰œ3Dxb9~÷¾ÎÆ5&ç·HäLÔ$ÚPDN“9í”Ð:R!/_jMüɋ٧&V(‰$äFï¾ý¾#»Ê íOµQìÉÑrò:“â$i…1™°ù;-¥ MÝ3¹­$âM¤÷Š1Yfò¤yžu0©›ˆjÞÙÖÁkŽâ€²œ˜³ÖS¦ß@hÛ¸f©‰«\s¸̵97ú¸7NäY8Õ&—½Äa ÷‚ ôÏ^/A¨ùT›|—¯Ì`ÖÊ Õ›¶_N„Å)ýörFq¿!õÆ¢ŒstQóbMN·5 ÌÙR+1o² þoØeø¬}ãÖ£”ò6†ùM†Ù †ð®­êUÚƒú€æt“*†ä] Õ*8#”ÄŸ„…”¨AkØÐ`§m¸Ðàž0 çöÊßO=á+b3opiKøs d%ÁþBý¥/‘#Ûkõ ·×ªòGEG$ÝÀë¦yì”Ö½ýo¬ð{áºOÃèÿÇþ¶•þÐæÿ±Kë9ýKsíéâŠE­tOÓÇ÷#Ÿk#Úde‹@Ü"jµEŽì¾Ê“`oÐÓ:¸=.Ø'm8mgf4ÝE?ß—ç«ëx¯½á}ãMõìw«çñšŽ¨çžÇ%…Cê9ŠøSÕ³ÿPܲóŠ]á »Ü†zvGÔóí ³ÛÀ³~܂ſ#€@·»˜óÅ|­’,…o]Í o£ häž Xd—|(ID­³‚!—’T¿‰ÆÃT›çZ|RGuD³²$ú‹ÞP‹æ°”ÞqV~ ;Ü}Èò¬Ew²5ö­ž¢îCÚ5l›‚^³(“Å £ÍÙUƒ ÞÕfn.±Þ¬É&Š­&½€´ÝBò¥pJ—NÒD¤+¦~‚ú[VUQr?Qfêy8eïÛT)¢aäLÈQ ìè=·l^_Ú i<½\O'œ…OŽ:¿rRmÔ[lPóÊØP¶g=s÷žb8C¤9g¼÷m7ã›dðÓª±O»#á”Ã1³íîê2JyF!4B"â3a 1á~xµžì-ÞIžâĦí„,B[p©$W±–$Îáã}$xÓ  B©Õ[Ðì°5‡omºOû£--w]óà’:‹ò€d!òÑh؆-V‡HÑ‹6õ˜¼ÐRsf†·¨ ÓåÝLR`7 '‹È¢Ä $önaŸí0Õ®ÑN-Þ,{4þ SC¦Êä6¿•ðÐËÙõ¼½\­Yñ>¯‹×¹Ë.KY5«8°òçÍ•ÊEMe1L‚„Š]6&§y˜ ¡L(Aí["šf@úf¸çKûïõܾíV$EE“‘}ämž÷h34ûbšvö€ »b«ÊÙíFU-¯vXœØj°ïkwN7cÒVMOajꇧP}·ù\ÑE\§•áT[ Á<¹É¸ª‘hÄtކa3Ãl Ûã‚·|ud{]ƒŒXRÌ•º%xº¢ôWèVsÍòqµï.ü0“§)ìô– U§ÅœV”ÉùËùAÅG)y¤“Ìkœ{›1¢äŸ•Šï¤ùçTÍ/æ$×ÊÚÃqa´ÂÓÛhÙè;Jn‘Â,§FO ½î[ŽªC`¸+)g!«œÉSµ“4v'/Ic«æY¦ö:dÑR&/RVgbmߢÈ" ö ÌêX((êš9Àض™ÞýÓû¿&W}ú!¹¶Óÿx8»_ýçËïÒ'3ýëË÷ßþ€?¾ÿúßï~y4†­;íyüµï`_Gàgém(a6[µr'ý ˜nÃÙGDXE[œoË„F¥54Ž”~šéˆ‚zižNJ˜ðø‡é30ïºùÌÜ3GC—wwØŒ^äUl®°Ã¥d_0hše€ó¼(qik7{¯ Ø•g„5r¤¸+;p‘•?…UÄ*B5Ã|‹Ù0lJc§_Žo0'±uT%ÆèyO‘lš[„Äìêå/M³…[½J/GîJåyñË:éQ€µY{jlùzí…UãÓ¶9¶Vhu³:\5«Ý¡díÛžyå£Óݲµ}×N ³`Âоð_B-ÓÓzª|ì‘OŠ0ß©Ò&l;&aoíÆÛ~ÒœSð–Ú{—Ú¸C•{å_~AÊm¼’=èR¯r-° ‹2‚eÔ°¢+¼áuÁþÙ„w¹3ÃÌk5râ"Í¾ŠæçÅsËÀí° ª}„¤ÓDÓË,ó›bÍ21kþÚ¼æï°qðª«ÈËçÚs=ârÜy12F^%Ô]댞xõ/¹Æq‡Xð¹ÚA|¨_,RʘNèe®¡×Ìü%`¼¨¥|é¢ÖoíÆæ¨_ôÊ\j®µ› %ÇÌ‚+ˆ8õóÁÕ=+TŸÙN;÷ÑNdáÄ‹VÏBÀû¢Õí'p>$^Á/¯žCnÀ+àzVÖ1\ø•r¼”ÈÆ*Éo—z1ÃüêþD}q[FAaå/ÎØÐ¯(¬¡pþt…±í~!Ý?ôrK+® ÓPx7š\Ë¿ìDár‘ÀŒЬ^~~rqösóü¤‘·œŸ¼rŒªçðóã€-µ»Ï]?ppBZÊ?xZ»ôg«EB×w(ݡܿÿüôãI˜9œþ›@Ái— µwQ⣋^¿wúÓé3¼W«È³Ù×ø÷ì¢+¬Íò/JÆH×wÅN’ñ`T£¬V*y­Öj«[ë”ê ««UòAQMºËÂÙ:%ˆŽ~OÎ+N :­!S¥èº¤³µZqtT¿õ3ºý%Ðí/®|¡ûQë§èËb ÌᙦzÉq:©ðš§–Ú òâκҖ"0•#²Ýìkäø6bÔ÷mã97Ô QÒ´k¢¦°rëÚ‘]:F‚ç÷Å'õâ¥ÊˆŽ<›”Øãµ:Kc {ízN%nÙÒÒ´Õ>ûÍÿòøxì endstream endobj 100 0 obj <> stream xÚí[K·¾çWÌqÆÙ¡øfS² ÄHt0;‰×'O^ ñ"’¬ÈòóÃg±È®~ÌîFˆ€À¦wšÏªU_UqâÀÃâàdøŸ~~{øúöðì•?Î<÷‡Û7ñi2‡³gNnï~<^¤³%Eø'O“:^ç%LøÔùYÆ2§Tø¡;•ÇÒ*¾µéM)ÇMîÕzÆ^2ô:¿MãÚ“ti¤ÓO·ß„õŸ…bƤÕ=û¢ÎcUneÃøVægVfÂ(&Ì­ÃH†ÇwåòHÏ^ vî$³2 ÇýX`É&Dy}³ºÏ‡l¾¦°# ›$’ómøÒD¼ $p–Ü1ci»“Äaâ¶‹ýqÅî¨(†Ú*Y!^ÞÆÖ* ¿ÍmeÑ©l=ª€³Ëíiôvfñ[énÏÁFÃ9éF’¼´zq:k?u6ÈrâdAçí/¤.…‹  U;0Óp`ê‘K°*BC“ŽË"±š 0våÙ0ä6+Èķň7A‹%A¿yÿOÒüNÌÙ²Þûb]ˆ-]kÏч«åÝ;J´J1)üëé¾%šb¢Bçî}jqöŠ)EÑ,]7¶d¼žå®øÜy6a ýz¿àÐ,2C_-y±ÏüáÛ?R#È »×.ßSòFÎA.ÈZÕ5~CYunUEì"Ðuñ&‚ŠŒ’$uŠ‚²Ãçtµ¨u#üV6½9=z“ª–©2+ k(²Çf!–Ò1‘6Kæ ÀճĄè>Ú{¤æŸß¿;…íü‚®°ÒQÐЦ‘«ä°!wݨ¯ßÝ >ÒÏý“°Î ©AàF+ÊVp‚‘d ñCTfÏ£´ÏrfÏneö16¹Bî †r5J© ?Å|ÂØuk^&ÍÏié ÔÛƒóžúzÚÝ€f/i2šKE²É 8yr9ÑçØšœ ¼"§s:A8ŠNéèå”ÎW9}AëUØhË ú$â”`$=Eï]ŠkøæYä—_Êqöùˆ×0~zhÑh<Ô¨5«~ž‘hQÓY|šCá»t1fE˜i[‡h‡×Cûýíwy‘Û\^—á̹-”Ë«µJç-%;ÓQ Âw‰ÚÉ0¾+ÞGòÂTË[S,?IT~‹ZÑe%BRŠIñ»–›®ü–ZÉšíl®RVcpO Iººe‡ËÜŽLT¶K˜9µ[g2mDÛ—wÒYá• eÖ[K;…:ÃÞ-ºì¹È•ÕœvÎ׳Ã"ü¬ª¸†WØ»©©SHQOöØÂ²¤KÐÕÜXK¢ªS&Ê7ðØñ½ø-ÉB‡ÈE<@x‚«»ˆ¬‘v£K‰-ïIAÑ-v┎Á ì 6· ©2=[WbHéK„Â3 6gMV´Û®Êcs³8Fs^¹Ày[®3ßÃÞ!k^À"²°ÔdÌN“ä6p^;µ¥¬I"&.Ò5ó%)䦤3êér®Š\ ŠòX{Ó‰ Oz¶ñ!›¹î›’Bð|¨Ó¡ûßÅuk-†c™¿Ð [@å-`Öš_™ïÈ½Ä [+¹“­XÒËJob‚ú)¯•¯zÚÝ×ÊïÉâ•ì*Í™Årp‹fôà@,µ1kb>wW‚åÂ…/u¹µ ª%•7Üj5ÁíËýœ:×Y[A–ù‚¡{Ö•¤ZͼH굆‹+Zoebït\KJT_Ó›ƒØ2ßÓxK`B„9›n†p|ÿÀR÷¸ØE<‰Öß_?FýùàÀr¯NÒ]æB뵄Wwù|Gˆ½–½š¹¤¼E»$ɆD oYIÊÐ+3]e¾ )ƒ^OS}mßÌêý”ß’A¢º%eâ $¦:JSHÕô|~ZLr¤ä¯Ýâ}ÆYð‡9+f0—Øu”ò‚pªËW$XÄäcú³Ë×j_{Z´Žšn6|G„c~µ»éâLåÛåš;ÚœÂÕš—…ëé[¿ÃævTfq°z"C;ˆ0o@+Þ^ƒ¸G¢ãìœèä–Ú¿Fé($ÎûY¾«DÒù/÷Dfg",j6'ï®%)rõ4ô­ö¡æ–R½ÌPMi£­´Qé+ ÆÂd}ª§-èµc—†u)âÄ\ +.tÌâ#¡Vb¾¾%ùüVo]¾Š(D¶Ÿ9b¨Fì Ùýv¦0½ëY<BëMñÚ7NŠM10ƒ±à$äj²¢ŽWÂy's ŽT ïýcdéFLW•‚âFõ@ƒqMùãÔ«áRùßÒfK™– ~àm¥þVÕ—¹y;EÏÂñMºÙPBx2{„O•½'S¸Ýo'"~ƒ",*lÁ5Á!ÖTŸM‚AS1u½ØŽ­*LèË„ÂZæíS*ÿA?ª ÊŸžRùŸ: K)?„7*þü6ïB@¹S³€ö3ÎñR8FBk —S¦¥RNñ–ÔY«ø»ï”òÉ™÷?Ýþú»ÿËz¥ endstream endobj 103 0 obj <> stream xÚÕM‹,·ñž_1ø4Cvd}”¤n°s0ÄCBïæ}‡Çà€ƒã\òó#©ª¤RÔݳëØ~fgºK¥R©Tߚ˿.æ¢Óæmú§/ûþòŇ˧_®£Õª×ˇo/Æ«.÷ü \>|óõõÕÙøê‚}u>¼:0¯.ºÛÝ9“Þ„ôtúkBã3ï34Cå§ql††L#äÑ7\Œy„¾âLÁÖñylÂ4ý4>áóŸyú?¦ïÁË‘yS^¡á…@l L>‘ ̈hiD(#÷&©„(b7ùÙ–,o*Yy”¿ß>~ø*qšî”÷Äpd6Ñ·»]"ÊOC~“é­'æäeÒZ U™Üžñˆàn®²5j¹5/9s;öHó®&4…¤ÌB\Ÿ¿-…T"ÙWl¼+šw#3è…„*nùÉZ¦¯È€&ü¤ ¥½ôÌ Oír]v:o’î÷÷o»OÊÅצˆ—½2ÇH‘a> P"@Ùu„”ê2"/7‘ rÌC#ZºÄYv'áÍT³d-Ê»B¹IóA™ÄlŽT–2p[¤Ul5ËVáNÝ4ÆUë¾ÆË,÷ˆ›%«Bæï–¥ߌ‚Y.+>y¼^o‹X.öúÂH…PeÖ|ú¥¡ôÒcå–´Í™Kß0D¸DµÆüÞ«#U@>þƒ!cU6^*È«¶IÞ’äk­GsZ£ )_µ©tÅ:+¨Å‹Y A¬Ý¤àŤ,>U¨à‹%}Ö©­¾™h-^F”ƒSÉ€ì1k9bVT`:fCyi‹Œò<ÑoG”, –÷²Tt‚”[RÞlU >±ÈªÂNÏOùpTë&­“°H½9(¬J6ökÄŒhóq¦Õ^‡£,üçq_B~›y±ˆ?&Y”.B¼23°céwwí6×XÁÑlß™ƒ|8ÉÛ«‰ÆÑò6ÕÃowEüX”³=Àùoºuðrâ, ý­ë-&2ë/„˺F‡bÿ²êQu”Wõ0m ›­d•…Z¾H“ç13¹*J¯B±¡—ºe¦ äÊ; ‚Þžö­ö€'!= ôày5Á´ð$ˆð¤ÊžáÔOñ„Pû/‚Ø+¢xÀГxÃfÃ×Ç£:P(Iç¦ï[ïf{73Ÿú¼?½j“ó¤OPœ ØuNå\·olÏK†ÞK†žô¤泡 IÓ˜’>…UØ÷8O[$GoÙLÝÓo”á¹?»Ý½õ#N˜U-ëˆx(·Š=9ID‘`~¢ˆæÆ‘C è¥cÐzãSòh¸%VgU0ïóÿÝOèÿÃÔÿ_3mùÅÿ§øÿ5ñÿÑÔ†%ûR³¿C¨“3j7þ˜øÿæœÿ/í9~«ét”"l$Q,XHÊ9¤…Ò Qçc’ ÷s‚'Ø÷¤¿x¶ÎÎÜGvÏô4Sióg&ŸÞ Óa5á+ÇÊ–‰f¾ÓÛRS2^" Ù‡#ëâ¦QÎÆåžÖéòl,ò`@MqG/\7¿Mrv4eÁj‚»¦þ¬Lº[:D2âRTÑ™i—=j§fºS1º)È'¬ZŸûYÖcóšlǺ<¯©{=”(ûÉ,_7·WKx7–Ž %ÑótañJv×ë• Â¦à–îÛ»þªrJ;çFÙekSh6¡f9¥òöý9%¯b|6§”ôû¡MÉPp2öþ0ö71*=òo|Ÿt`AKq½ƒu×»ìvžë×ã¸þõöBËmš<¶¨¿UÛ¥E|îZùŒ-sJ%Ú‡–m«5•M‡*U¡ƒ—áPÒ)-Gk÷ ˜-:º«zyØ1`Öû70A™w°˜•êÆ†!½[F«Ø±a¸’.赘ÀY¸`èabåðÍÈÊÑ+ç· åìDáËtÙP&i“hññ~ÆánüòXÌuÞ‰¹ÌÒøgby¬ʪDt\kr ðè†1F1ç‰üγ›óÁ¼½®°¶ é‰i>*g‚iU1kñ:nªü•^Ê?hmn°†M};êʘ‰o ¢…¡+ɺšL!V”»ê2ÚMQ–Sõ](zÙfÐXÕŽþ$Y¥8¦^XéÚÆ3N$޵Ó#“£8é? }”EÙOQ$|"Âﮟ ”F¶ë3‰ldľ1[lCúÉÐ…ÔJûfÉ )‘%åü KÆfÓè¡{’à6¦ ׋A¦ƒ\+¹xï¸ú÷å‡ ‚Iº( -+ª{oiÀͰ©ékB”ͶnQÆm¼™i±HVÿK \ÚêRɵø„AG8&±º`Ôð¶É,5MT)úV¢×UÙŽlð¨<j¤u ¼’8±ncËë—]؃3¹ Ïd'Ô.GoèsL 3‹rìºj“aZ›Ä>³*€Çú œ£.ý>3ÓCUÆ zÄ’Eç#|2Š)¡Ö )œŸ#é“cžŠ½n ²´i«45ÃÕ~'ü7«‹"d´Ä· º®²=7Ss6…ìK|,èîmª¿avÐ9@>ØSÿÌž~1®cb\yºáá‡q #Š¡¥©Ë;§cózÀËúÊ mW0° N Gé,·‰Âùh`Õ’‡»:Éõ:©S4–˜è¤L7Ê…ëWC)¤Z–øëZHÂ1íéFM¥¶ku£8 ¾ôŒ#]}އ=“>q©Ê­¿uã{qÖµÛÎ/ÿõÌJ½íδM[ÐRÍ–’¹^äÝ >²êøsÕ*uM¯ÖD* [‹ÙYí¬®éqýžâº²aÕ[uÖ`vž9èEè¼¹v71þ®<=ÕgŸàñ~R>lšZEu^ì²—B@z8±4Cý®ÉR5J“,-=›ûL«ÔÙ>½½{»v?Õ½xX½è쬇ªt0ר3nà88G\‡íõ·lÿ•Aºžgæóþx ‹­>øZs*ðE|ØmÍ©æèÊ|¬#É~Ö!ŽwJ}ÅʆgÕ—­m¤á>ív;«ÑôZ<ŠçÀè.8á'GË*ljå›ÙfKɹì[˜xÜ©.<£Ouá½Þ-љкÇqoùÞ ƒønëëÓÊN6M¾§ \3ìf˜o¹öLÒ–SÒbmíËõ‘UU¯„]½ø F5a¼eœ\˜€÷¢ô<Ð’eqOì ådYA8è•+åG\P%‚§èº–¤•ERëbƒeÙ¼a:ÆGäA7²CaóuûãQCÈgy‰\ÀªªÞigÍüªwNÈ„%‡Ì–be¦ùÛL¿ƒÜõ‚…ÕÄclvô³¶¦”162AÔq)ÂÊC^,“儘Ȳ^ùHl}–”®&•7»„ô·Ë´Òµ‰åTO²…¸Wõ!ù²°ø0ˆgB)ïzþaš#n4GÍÃQJ.pJnK\ÓlŸ oF­-%7 d;ó‡Ú'ƒr‹nÅ1†S횟lk6GýàÖk»qUs—`¥6ܨl,W‘'t•ªX œíNy{ý3§®Ò·?Ò߯èïþúãßý»´ê€áÄTkà‡E-ò£AÜ[ æú5|Ì•¤`‰m#ÝÆù« OV•‡OíýqÄW ø4Ç'Cê‰î•>9RÒ¾aC}è»’Ø_˜Vԡκs'pKÕfG¶ö„cÌ|¡´ò ‡ È[Ú¦¤W<6vÅižð<&`ÏÕr=¾„¸Ÿ»ÔwâØÜŠøÞ,ƒ±Ê›–føÓÁ_óV·†Îé”ñvÉhÛ*’NÆæJ]¦¸[Ní\½)"¾]½iP³Âh)‡"„©Ÿ¬¸€L·«éÍ™ÊñN”7qÁ3w qrí–Ãêm-Áž¨ÞNN~OM™àM–¿¦¨ ÷É„4á uˆâßÏB˜‘›¯½‰—nfñ†ç ®î!æ1µð¬‰Òâ Ü„ÚFµ[&|¨Tó0cEôeL¾Øòâ§Iq¬‹4çžFn§ŠsåEÆ O¹ßÆì…dfÏ[)cò^&ç½\iü2õî‡åÎØEÙÛ” lJpåàÆX}8‘ÿŠâí&‰Pvwª ˆñ †ŽF]|Ë» ]m+d¾ÃÐÕÛ¹LýÄÎ%Yë/W/ܹù0²s²Ù#;û¸-Ý+c¹±Ððyj!Ôò#vß§H¤tˆA–Kq¯Šc¦èä²ÑMÎmçPtEýdqÉVwe𘛠m®8f:þ>ÚÆ{¹W˜´“ö±µÃç;6m¾ÿ¸º²íK]ª(–Ôš´eåOp'ÉÜXQ¾<¢áÒX¼>òªD.Q–ÆÊ˜wÕß<ª&-J'ç$pM°§²e Ì)ƒ] 8d÷WGZ“HÎð/$òeNZ7·á>Zçî(ȶB?ˆÔ¬u·ü>À*Ò{¤PC›B½ïýNÉñ €Qð–Šfì"ä6©®c¿éºD[Rˆö@]ºÜsò¬ºìûêƒÝôÕA4»¯[œ3¹°¸æ¢ÿóý nÂ1ÙwöK0Íœº’÷n«ûüc$µß( 9lÀÉ,…ëÝÍ­€âù²ûçkÈ.BFÕBìŸÞO1Üürˆ=¸ óH3üÿH³='Íæà‚ÑzúÂMx'âÉ%2™·1Ô÷3ü}ˆ¼¯gÕT¾3‡{~Ítåàêób]«6ÄýºG‚²°>ý™"ã›" Ä?VŠ_Ëœ¦f·­P-®Z\Ù«¸í÷¤w;Ž]ŠDBh ·ãßr—{ßÕªÕg×u9áº.ïv]—þ6rwµ4võ0j’Òk™t–ÓrßüþÃå/¿ù/±›7 endstream endobj 107 0 obj <> stream xÚí[Y7~ß_ÑØ')vÓ<Š—'6°AÖFsòdå!ˆÇ»Övgüüðl’­bwk¤ `ÄMÔÕ<ªŠ_}UÅÞl î?6hîþÑá§7Ãg·Ã£gv`”Xj‡ÛWþ7#‡Ñ¡†Û—/vÁÅ^J÷É„ÿÝýèƒô ¨tߥá¾gl? Áv®•“bî‡ï woR¥(Äß¹ÿáõ›îíߦ»$埪ð$¿Ãçôs0ˆOøjÏuiÿÃís·å‘ "eØÏ£OÒ*…tãK·åVîM€ø)ݸÒ}§ÜH:ŽðèƒJIãnX?Þ‡$P+QÆÒã‡y6¥ãˆ~Vp;Ò"¯<ãçV,®)ü®×Öa á&:P§í$#+C@&‘'ØŒ9ßK3@µ™ÃšEÈ,¢M¬öŠåL@” BŸa³hÂÍ0‰öÇ£¸idE‘_²„iFÑv˜DêÕÈÙ–ó–(b>K¨N?y„íxäR*k·ú€ëžeÍ<ž”Ïê•€?J¼~…®ÕG³¦~yõ¢~ÛlW˜Jû²»çCF£ƒ+'¤ƒ§8¦éÖ7öÛïÞbË”€H2ö#ç|ÇP=[b³ïþ÷áó.‰á“")íXÃ&vƒh`äT©p¼ êð8Cãöýùö*ðxrB%™N}Bðh¤ê§Q–§µˆè‘ÞOò¸÷6pø÷[n‹ßŽ›§sÒŒÄi’ºÙ`MƒAzò?™­\çÍkÔ–LÅ}Ê1³“ëYˆM«B,dÀ/+h€X&¿ååwÉ& WÑ@Ò?M ^ÍzŠ~õîW~ Ñ*­÷ç†È™-Øš-˜R»ÇÕ‡ÎéÙ[LµBÎÿ‡Žvß M–]çå» 1ZA«UQ®›šÏò‡ôƒ,1Ñ‘¢å~ùu÷<Àl°õ¸À™wòOìrŒø×—Ÿcpg9µ5p¢;©LÏ;ÖÈ {ŽÁ>•ì?Cöà~S²ÀþWßâŽEèÚ2am™ló:¿Àt©|ŒCÂkB˜QÇá¢9ûLëE5:c¾ÔÙœGW»ú?ÚTmä<ÐM€wïr¼l—dzH`YLw–¥CÅ·1+¤"3áµÈ€LŽ,fQ®Š’)®fˆfE"µeø? »wÝ'ÄÌñÑîp| cèêøÓ¸I¾Ò¸&ÆH]*t!¦xy"”1O¾&‘Þ·d^ëæ»Û¯¾¾‰fˆq•çÔ''Y>©I‰–¢U¬•µ‰S¤ÑE4-&¨êª¤VƒW­9Â0$nY!ý&ÿ ËöŽÎƒÌÚmÊ*‹9fPí^ÇÉÑ»kLðïÐ 'ð°‘ûOÜw›"1;zƒÚ… b ƒìÁ­]Š`G¥/³±¾…9+…NwÏi Ép!Mjq÷öeã·c¤g'ºö:窿¹¦Ä"UíaÔÄV?R«ëQ«ïqÿv!ù|jÅ)#æºÌʬ3+³µš´áèŸÅ¬Ä:³ªŽÎ¹Ìê„ÂKôØIL‹'¦¸[ç©®!3ãbã’GŒ‹]‰q‰õ¸Ež^2.#tK¬Ó-±•nÁGºµ•n=½0‘þȸ®¼…3¬3.¸<ãBé@+÷÷,<4,­*Tué€ùjÐ1Ö¸O³›Ç€Rn ]±a4Ì3õ7b0Œžð­Ä¬¥x§v-bÉ¢‘VÚ,ÄÂQ[¨=OÒzbZ™ù§wo÷n;¿½vl÷Ì5@úø@¼P*_#^pÃv@úwô3±ìgSK ñ«¡Hµ§ô˜+Âúª¶jºõûªj­¯Ê1jb|9ä×hh2ÈèÃÂ=Ö|NƼ¹ëÜ„$wjô0…šKW ›š?ÁÓd'Κ'·NS·¸{ü¼+;¶'ð_¼óæ”(ðÆôoOsæŽÙŸ© Ò­¶¤½²“önA|güä–âêý‡ûû|ë#ÒY<‰®Ê¦SÖ@=QÔǼÐ1];á{¼¨`İìòÊ7ÝV†¾ÌJ;å%‘•²f¥ Kím jÛdCÓ»ƒY¥Z3²Øõ¶½®·3æMïX^ÊEqä±"òü)ÁÜ@x³DnpÓ ÈE}#—n²ÅüþkDšå”;S44[ÞR+©raAÑr3w<"Ë .³ .—TÀy¶šj\áR]x‘(,'y—\Ä›xžù,?pí:Ó—±'›;|˜Â-¹\/àõ›ù_æ÷Y³’¾–kE蜥RÁcþ¸;dÎVßv 0(,(ÄòïÎJN7ëRPÒö‚G5³.5’X¡j×™¤Qîe‰à[£Ùï‘NÄa™Hë׳ 9UM¢A¤.9‰ž$œÎŒÏ\HV\PÔüšRUòJã–žhd%§·:)R[ ÒJƒŽEÉô.Rrôk å-5­£SÎò¥Ë2”Í’Z]%µÜØÝì2irÖ°»r‰³Yo9LRŽÇØYUëÒ0ne•ÉØÙ§$LÃS¦æ4JÊ«YíµUž£>ɓѴRÅKé–[µ+…à´(^®·†ÄJÕ²ZÎ’q5 ÕÁö߆÷D²±.p X|ÛCL™±…ƒZA[ü2C@\ãP¤]ß(FÍý%ËÚÀ¡ O0TŒ‡MífʦCTI1"˜aî %ÂÆDbRÆ™46Þ…b`Exáp¶~ó#Ö‘øŽ6‡Ý<˜˜$D) DMÉY¿Î1éžšøXø¤–ë¦Ý ꆞõ mxN³ T3¾)ã×uï&ÉjOr}¥ð®¦±Ä“³®:¬/¤çUwKÐIF{+»ÞfòeE£¿Â>fz%•êÜDÁŸ¹óíÙýQˆ¦/èu‹É lšè/Ói¢ ·h­Êò”¶ W¤ËÍKy qGQP È%5è’^·½£Î³®LʼETÛ6›]Ôõ9Ë$ô¤—gæYÐLB–¿n¸wŸ¹H£6…fj_à$+Ï»i½_O"Wrö½vVQé­õ¢•TVùÏâýw–­Ñ'²ÉÈÌ ›ŒRz#›¼´êRâ+•ÊOcø›î‚ÆJºj&ËÅózÙºý»ðf›C\VäØªñè²¼)á÷ÄMµ,D؆…$“v8GeÊ8ó+h85vë4亞Æ[;ï/Qzb@Òzœœ)‰*»­r×#`UÄŠåjBÕ!ˆCÁT>y~‘µçì.ü¥ËeàY]ýÖÕ::ÛóîPye±«Á³Ùp“”­À³Z†g>Ãg{|NGgŸc5+ýÑ©0lýûvøæµè?Q endstream endobj 110 0 obj <> stream xÚí[YoÜ6~ï¯ú´W4!)Åu€­‚ éá>uûÛ¨ƒÚNêôÿwHŠ©]Þ®[‹x!{5â1Ç7g”âs! ŽÿDa%þðâÃMñú¼8>« ÁYÍëâüÊýVé¢t_˜âüâ·ÕFqÀÜ(að#6Jº ßqß5¥Üýu©”À§„»Ò?¹–ÖïJ¼Ã9^›pW±þýü .°Šiíg?~ŸÐ8»¶ePði€pÕ8«Æï ÎcÁp|& Ù’&$ëÆ»oÒ-k&Dsû›8›±aD7+à~­rwäªûÆÍmDX“ÿÝN­£®˜„f¢ —2ÊèD¦b ‘Sj !˜îï% ÙÌfEÙ"t1…eµu†)ƒ&`¦öB¯©Y,“UÑŠlÖÛ£à4Ú¢¼È§(Qe£ØºhEÒÕèÞ–ã–8a¾šqÛÜ~qLí¸”Z1®S·º§u/¢f^¶ÊéJÀ=$®¯ÈµbôTSê×£~ Ô_gÛUU¢}ÑÝcñààF†à…&ðŒ¤t£qÝqc_þ¸¼¥–­8ÕÈ­K)åJz®Yµxùçý%å;R³J¶Šä|Àu#"N ”’[¦ÍÞĸæA5ÖáŒHïº;Na ù]ºïV´ÞˆPÛMÊtíáÕØ°?Òc½t¾Ô ÛšX;TëL|sMê\Xf 3sçØÕ€c‹!MÆ<¡LV‚› š/vu÷ `³¦éã@ê. Kim·¤t ÉÛõ”˜ÕËäb㥹wKmZ)&áA0°ïÒUÑÇ.î¼DY+¦DêTVdcKÆc4Üo¸âÛQ\³ªö&*ýô‘4Þ÷ ³aôˆZ¦ž¸“¯I¸ˆ(ûÝ»ï© $ZÎÌM=äNÓËkD…½¡€“ë8ψ=¸°Óp¾ÿ™v,Ƨ– S˳×ù–Ò¥qY‚x‘%Êln†oÂÚ7)¾Q¾ ÌάÁ&»zG‡673Y „e :wdIÑÛ³h0Ä,Õà,cA%çqÌ *rÉQ’„³ ÏX¦ê±Ö »l²’ûxËVE'áÓwÇVµÿKÃ*0eÿ¬gáû.‚¯:†A;nZN€4W˹85¶2%„#Mœˆä•£/­ÈP@.Y¦ºùåüý'Á :ÈxxˆÇÈA¤ÞLθ:5‘çZ<¸ˆå‰½Au43é¦;œ ÔÓ dÍžRù!iË*í6¹ËN…N¶î$vsd\ªDÖ©ìH‡,ÃtÊÓŸŽO-ØÔ0ðrRáÚ=‘%S*R „kæ6iF™•‘= O(q¦ Ô‚VÓÜrOÊ  "¡•œÆ°„ÚMQ´Ûqã‰*SñíE!e˜eaM³»*=£³»ö ¡aË‹$îñHܯtˆ €íNâ$¬zŠNM£‡Úéi—„ήnA‘$ãtb§“ §ó,ч0ºÑ‘Û‰„Ûé-n'‰Û©iD^M)þh7b§¦‰zÎÄþb÷ê1ˆÝ,.c÷A쨲£ìÒúœ¢Ñõ=äð±¾Õ¼âG²’\îiVZ2²˜Ø €Y X¡Üݤ<¼V«~ÚèŠã¾‘Ö$: ýÒDL_Ön×ÛÔ9–vÍ*N=@‹Y¢ûÖËô°ÕIy'©vü81ó‡»Û5nçË5^ÄêoÊ5@»45æ…ˆvÖŒ¹a> úlpËÏÚ.á7 †:P)hè¼Td'jÜ dä'¤®—:"åR~ã‹û¹}ôFWhayi7È uƒæñá]kšt‡«Uå¼o²,³Ë¾†OÓYivã<Û–v,cÂR ²ìw†¬3{JWP\*²|û_ÚýÛ¬OHƒÄF»‹½vïJúšJÓºW¾Oûà0™³¼ž³˜Ä£NhwØgàêA‡è¬Ø? i6›±œ<ûåˆ$Ü©k¯ªñ„Ó¡&€è·§û/f¨ñ2ŠÄTÇ ÏvsNöÉɬX¨%c‹SÍ( çJ„¥Ä‘¡¢_`pН0ÅWøC¶Mž9?Ó #ë^ ŸÓ.ë%“Õ^8¼4p¨7^8¼4ðÔ_¸½£Þ9ta2^Q¼7пÙh[†ˆ‡FÛ¡ÑvÀ½áޡѶ_<|Fõç™uÁCýùW†çØç˜Yö\h›)â“¥ãºNÊÌÃ¥c3õ_1QZ‡n¹ì8¯&Œ«Gë©ÊUU}îÅö΋Ÿ¾ú ^Eö endstream endobj 113 0 obj <> stream xÚí\I%G¾ó+Þñ=¹_’{fa 8æ6íbf„-ÙxløùäY•YU¯{,8 Ok¦«"·ÈX¾XÊ—u‘é?u :ý‘—|wùý›Ë¯ÿ¤ìEI±ÈåòæÃE+üåžøË›wo¯ÏRëÛ×oþœ ý%ˆ%d2'”NTÂÛBô-R86UV]ˆä7_" _NYá\ÚT¦øi4IZHÁûçëh+´‚w£}ú8Úg?ƒ‰mŸ_>K#·%rmØL? ók¢y¾}ŽDŠݽ&óØŠ¥~óaÈ-¤Á³ÏnÁŒN§·æ±@•$ [K]´ˆ±P½mç.Ür¹ ßQ˜ÉÅwß|4 _,f^Ñï¾úÃínŒš\°Ñù~*>Ž™Ž\úòv×!\å`M-…ÃYþò·Ñ:‰‚±{$V.L?|ޚѷÃ}Q·4*/t ÕÒË”ã25© "nýç¾ÿ~x}*,B«ô·É*·ÃM½ÀTs•Eûv¢²ÞåßÄÌ"¶‘÷ß¿«ŠPÌR|ø×…Dò·ÿé§÷?þ<ž´·ž8?:‹\IÖçƒ ²V$ ¸k/|¨wd´|6.ýx%ê¶0å_:½”öÙX|úQ™(ýèú̺ô ~‚Éïq”³õ­/#o:É”±ÇèôÆæá§.ŽoóÌy6«êª™ÂJšÙÕ™óÛ<‡ 8öRöY¾„¬þŒóéM€}IؽíOÁF¯x륈á¬mÿ÷V{|~›•g)_¥Ye\VÊÕZ;¦‚G,ÓhQETÇô8_»NäE¹7ä…n~ðÉôº;ŠS9bG8dGeª™+x2úB$I5’¸Lv,\;WÛ¶á»™Á°#)f2ézÚ¸>8–Ögݩڅz ššG”ò ²R55?ñ'ç(’D£pÔüBÁìèùÈÙ9›qÞ\,·hŸFs¡Î¡“}QR\”Æ0ȨÏ#‘Üb‘-·g³Šä†ÑÝ)“¼š92ZîœÑŠÇF+¾F»Ùýg¿ ÜÏ[.Ã4-«ú“9$¯•ŠtÓu>9Ó™›+zhÀ‹’gÇñÖ0í„«÷>[t%R ™àEÀ-J §µ=Pù¹›Å^Ûa µGoziK—˜¨Ýζ³Ió4çxÛ8‡}ÄÔ9˨ ÄèW>ãFÛœŽ=º¸úM¡"ØTÑ¥ËWb[RöÇèØîGÑ“7"ê_4|ê0« }HÀ4k‰¸‘…~4Z³Âë¶Z68UQPaìÌ’ehd>Á¢P±;®Ç=”–ÕÔyPU’Y¥;ØD‹ÆÊf.Û¥µ±Ï‰:žs²H™eÓ€­»^£„Zp½xÖs^w@¹ƒS’É]­Ý!¾'$êü[„™‘/hs ?¸%Á±:øO<ƒ'Ö²PD³PƦ1ÙY?g<3ËÅ9YzbÀvÕ=‚¢Z[8iš7QjZȵ«³x2ì—ÿµLã<¸âB;õêøÐÆ…;2ðoYu+ÂZØZ×·íúË߆]71@e²èPÊš‡T«}Ë'\d&Ám²xe~m%/[`1Úv@ k‰)››¿ƒë9ëÓнë(¯‡as¢R¯ “UH€P"˜õ)cÃQ¨òK†´|cH“í*Hƒg—ž¤¾Õ¬²gY’z¸†•3Π$¼BXö€æÄ³]ÖØíŽx-äÌKàö7nʪM‘ °`ÉÚX-WZQ „­?dPD“…ÛRX.…iúfçoS$Ý¡eG"Žø^1¼ÞZÀ‡ÔzbIV_rÓì…fG´™2k#ôóMà ²ÍÅcaڗ럎œ®6[?®³…)Æë‚¿q.=-õiÑ 9€gªË[¯àµvÉ)¬-âE/’%\Àqã´sÇivCó¢Áø3!C™ûtÈPw¢qö2ž©±%Ú=óniX·rñ>ò.]êÆItLrä…ÌUè‚y*wfU ’+sqwŽ>³ÌEŠ2´1ÙHJ¢ü™jÌÙBôªü"bNÖÇŒöëYÕ$Y­£Þ0:v±¬k¢ T¦0$ºDˆÀ» _aÚä öôÕÑppºÔ)2›á0ð$˼Ã+Ñ IªY³ºÅ#‚y:êæé4è>f÷4«øÚEhV¥ÒçsÚHí6¿­m Ë„V*ŽË>hüˆ××ÊÃ}º> ,—TŽè,“?vÃuqÅ\Ælxƒ­èÒº,Ô× H†m0º±4iá[æ¿fÀ³dTƒ­³qWE Gò˜•_Ã:Ë먫ò€C×´ñ$þ*zæZú|{Â):ÈOè˜öºHâ {`¨âÔPŸÀêÀP1ßiEtÌwªaÂ?p¬z#Æñ€V#þì.âØwÕL·!<ø]ŠƒtUÖ>]õDRªo šÁ/!‡4ˆd¾fdb»ÇQ,¡‚°vKÄYIÙ…]Î1ßvÌ_õ%?ìKX%Í!ÝBŸ¶ô _ŒÙÖ2ir\¢'žñt0•VB½ºÎ>a,wºJà“:ŸëÊIn+%µ¹ #Ó|öŠ*Ÿ}ôP}€Êk¹ ŽKMnKûÕÅÏT:=R˜”N-GÌî»NèæXa²¨b²à³ÉŽã‹”× Lçê*zFS óÿ:1­}3•xeíûUZ‘„oá)þ5z+–ec“þ) ðáa‹¼Ê!-›t¿Ô«‚ªß-¨výHK®®ý/õVœ>;ä…¢ŒJ1Âó5kljï[Bž‚¬Ãü®Á‘žñzFvê,SDòº¾óI˜íŽ¥ž›Üœoªr&ËQI⯰—'¡OÉÑMmñ#«¢ßMî½p/K=[‚ø{¹‘FÎWø5Q†V¯ó{˜Ç#üZz`²TŽÒ]xâ»]=Ü·’^玑º#êj-N { ˆôö­ýÙÛ‡0n§#åaST³³‹êé)áå°Žœ¼KøeëÈ}eAÄ¥wfË2¸‰’¸.ðLÊAŒ’κMÂQ ŒÀgGIÁS5Òq…¢ÖuGJÞ¥YÞª¶tèƒXªâç lÙ°¹&mÿºŸÃñª¥d)iž[cyý:‚›MÏ.sõ€$ïJæ©–SqJ7›Òªuë`Ýh½ªd”³b¡“*÷Âa)Ài}6ç[öõp®¶ŽšåëYWɘÀ,HÝŠhŒ;®µ‚õÕè«B¹†a–JO¹x@™§S,·mÿLέSó•kÈþqHqå÷ÅJKÅz^â p–rãD(̯²p„’W}ú(Ø'\Ž'lÊÀZÃÇJlà}µVÛ< »:'oœ0îUH°7ކú0ânÌ8 Ï}šÞÙÀ¸Ö$v„9^ÿ/ãDwˆ»¯:º¾%4—àgWµ›Pò§Õ ê[ÉÇó¢iKtcæÙÆJy 5` o½¥- ˆX $îX 6¬V:+ÝÖQ}$»¿QôB.]1—¹":³W¼d_sÝ]Q¢´°yþ@~d„©©Ó…ù’'Á+J©nvÁ„· Å^{\m¯ã"[¡J5n} ]¬‹©p¾âSX”*Áì q‚ ÀY´¿ìGF} ÚwÉýö…‰=ß%1zYh|{dl5«ZLßÆÐ‘G®O/ªžÖQóV¦áxHSlBë6®›#2{]½‘¬ Ý@Aæ~²Žw\Â_ûJlå•ÙíQzúQXKÆÓp(î›ø"°Í™Â6Õ.O¶iNìp³–Á«zÞAÇê-¯yQkXõšïe§¤3ºćåM·ªMQ£/ ùMQè Ié’- Þôb¿.X•'d´c°n8¡›ŽJùªŽgé ï<ªîšrÏ“–¼àmµ.±šhŸ“ {h+´ÈûüÉ/ëûá±H±^då–œ8Ù|FÎ[¯êX­áAcƒ‚7=+úíAŒçC9/êÀ'UsMUêø®ÉâÈš½js>4ÙYƒÌ‡ññÊ ¦fÍba`Kürºü6Œb`ÍkÒO8IgKË»ÎYÕ§~kè—½o ýnÿ©_’À‘ µ²øˆÒàg-šÞLÛíÓ´ÒŸèÓ¬Tçú4ŸˆÜ7å&i+[r#ÿÖòQýTݱuž9É–«-wÿÀoŒ\ +}À–<éºm‡Ð«8”âïœìÚÂÃA[x3ýÐìƒ×Ky’àv›žprRš°F;õÓ<7GþƃÂ<vMÀü'[$ûNf:ú0!@Évv`xgß1CjOÇ`—Sß1(»ˆð؇je= ĶR^Ò˜_xA³ñì:›BÃ1G§—QO»¯)Ÿ»Ëùé¦þU=¨9 ÚJ€Ååë—J¼Öî 3èg™ÁÈÕ¢î ô˜é1~"šu–u§7› m]ëO ëS"A»Ý^ìU“½vgZ®gÖŒ½Õî+Šü3Û7dƒb®ÕCJÖ2kÆ£ÿŸDFÓ|UöÓ)‘Q*`';R"£÷”ˆvAÄŒ/â½ÖÛ幤Ž8fÜ¥RDÝ¿\r(žy kòïo.ýÕpis endstream endobj 118 0 obj <> stream xÚÕËŽ$IíÎW$·*ídáxæ¢9€n+ú°Í!!v{@ìçc‡ÃñÈŠ¬¬êéV»=]•é°¿½ü¸˜Eãf‰€ÿëåÓçå·/˯~o`1FmÞ//Ç÷«Ñj ËËßþt±Ê^WcÀ]^­v¯Ö[üÑøãËOxµ¿;ú±üÝ>£ÏæºÚèq¥Ç•¡ÄÕj|æÜõÏ/ âf!zz+ÄÁ+…¸2DÞ.0„Ú jÃäbDôÉ\˜!WHàSF»ÝbMkÙbóY²Wˆø,˜ÂmÎ}¸®=Ž•k|B€´;v^žš¼;Í¿e·"#’E­i}!ê¯.{þN›©’ô˜ƒëM\ñu,‚&º ˆ„²€^Œ2¯×W >Ú×kOTØŠ¶Tß©v ú"ÑPا# S/Þ¶lf€§S U²ŠÔ*Ë$e* -ÊÛÙ­ çO˜Æ0û>ðiÐ;ÞR…6Ej¢2íhóÉÙ ‘Ï‚! Döãªþ4ÇU§gƒú… )Ÿ ¤v8°½^•`Ñeñ`'E'rì•Ò—íëŽiQC-ùœgòÝöè¹YP¿÷&Bž˜h33²Tè”Ø‘Ÿ)©Tˆ°çɪ+ë=«q€ðAP¤)À˜YDä½è‰(|é<™.:Ö^ÞNô:™um5î4Š‹t33è¼5s¦¡BøbSv+ ÉZIû¦˜¼Ša‚+,Qm‘ ‚²e¡"»ÎΨyE\@ðàný¯Sà %bƒØN-»u[ZâGÕÂXNˆž;à³öʸÉÝä·–7Ÿ xƒã'y=ð ¢^\Ú TJƒAÓFQ'—u±xsÍ\`/Ÿ]l²—ftrø.ÊÚX­_ž4M¾§·ÇJÊS·•¨DGaÐ5±‰ã-›50Ýè`sñ)“ðÊfØ+5qUß%f)ú* §¢4ÊÏÅ‘S~Ë0ßÜr‚öH©§¡IÑØ»X‘ ©çªb4äÅ.Áýk& [ÿ?jÛ~FoÎýUk}tôæ£!ä;z… t®íl› "Ýogˆ-¹J~o§IÎê|RäMJÅå`iPJ³‹+5Må ÁŒMåH.*[mØgDŽÁ &®ò3ž‹ ÊmùÜ/×83ýð€é›c66¥S;þo¦lhåÒ‰"†·(â¶#²uzx`}›rö+H¤'•Þƒx¿ &5Z^))ôL6pò®?ˆc:œàR”•WUojˆEHÒœ35”¢ #3]‹„*ÛòFsÝLæ,Ñ u•}§v_yÒ¹ò¬.ÂØg»_SŸ¡g©/þ«¤µ¿H9uõ¹BÈy>²v—ÖŽ`Àçk³ðh/%˜ôR*®s™Aríʘ4Zbë—¸¡´ÌP ,Ý«nX»Úš¾ÉmÊ.âX*Vªµ *‘Àu½H®VôI[Ö6ê“Ý _Ô}pÊ6_oÍÜW÷|¢áR0 8áûÇ<2[Ld›#…d}â°ƒ;í« »Š_ÒV ´U༭âö)˘åÙ–jº¬ç>˜º±“ﯷ»q*$òBùýË A «€kMͰ¾™Vtø)Ï ,§Wßß²’G¸]á8nb"­ U~ϼè}ò|Žj^ÿþаÀAiÿLðÓmør*ÚlLn¬ŒÒ`)¨»ä—Ó|ÀªMôîó_~â$Û“–½~q†}Ñ®€É1Pôbäò7·BMTÙ}}ܧ››y¦{’9š ;:ÿ÷¬?(]dMDËqn¨]h„gO:‚ýü ¶“N[ÛE¸×jsåö4•Ô_ßfÝ{ôÄÏœwêªsÜq‰â¶|®£«.#È2˙ς~çˆ »Nd9–²ŒÈò°%C­ã<7£53ãA­¥hhaב Òõ-Ë5O§$ŸÍ’g#£’…AÇy_EW ^ƶëÛêJŽ2X.Fò+e®(Ëj/>”‘pÙMÉÁ¸½_1Mÿ™bYü˜Ä;?ÑfL‡µxß9Š×·µFåt¡£3öÑoö{ÓGgˆ7wÀWë’ò½fý4Ý…´‹w¥ ‹+JæÛ¸šÌÌwL;¿=8k/¬l••Í“D­Ü™0v*Q|»VxÝNXñøLfp§}Šß½,?.˜Á¤åß ‹âÆ©²óy±”„™úà‡åËw|Û†Šn³WÔ‚ÜM".×Ü`ݲzÀDœ¿áN([=ÀÊ !RâC(ƒ´F Á¬Q9 ÔÉËp O-³¼Ùć)¿ˆO¬xë‹= G¹âêUÚ±ëm3¶ LRÆeä–Êñýã8œ¡í£HÞ€{÷Ø+<§>\Í»]P'Óç¨uf”w’®UiXÖ°²ÃÉÏI‹ß’ßí*ë|ía ZNå•»^¶^Éݘ•õÉDiâ3Í›d"\ä­»§9æÃm&çhº¾u©œ›¥•V™Øår­\ÊöæX[˜ÝýÇ®âÉÝfoîl²ŠÞ›{›ôZð»œ[ËÍÎñ>*ì¶wOdï~>„NÃÖ˳ޡ}¸ÂlÛÓw5‹„ÏÆL•E…Ò×å– Woò†.Éõå–)#ðõž­ Êo_j[³n<÷µmW«æëÀ>]ºº§ôïÃÍ]⦮¼Bꡨ÷7/+Î;W$3›?Ãlq åÛ &_?ö{—þVÚÑÖú²;3 LgÔrJÜFCÄššJýÐß ë¤qtsÕßd‰Ã-ÚgÌMŠ ê÷.KÄŒM˜œ)Õ\4} âX™Å\…’>“B'#—é¤wpi-¹Sìõ®ÅB&ìl7&ÿæÊÅ·ÏXuVíw摪3'뮦î^÷Á’}†­ÓSg'Zšîh)¯?ÖR%½ùNÒk–b¤r{p›wälüBT¹‡â>Zi%‘òežqN¶q™ûÖ«&Iýúì×;'Ücð¤I; ÝsOÂôôbh5s’žo2vWÝ¡‰ ¬WÁÓPéà°îÝ:•Ó37 BìÝ?p컿Dþš£òÈ“ÔÞ¼ú$õN‚»˜H×$¹iC³}Ê»ëŸ}i‚4½‹†n¤«ùFzaz2ºM2ºeJAàáÎ߀³¨™¦&0]aS‰‹"HâW¿ûÅqÓ¾Ñ endstream endobj 121 0 obj <> stream xÚ­[;¯%· îó+¦¼¾GÖû±†Yé o—M• E®ò÷#‰¤DÍpæÌÙöâŒFŠ¢>ñ%Ýí÷Ílºþg¶dëÿzûûoÛï›r%oÿÝŒó*•íQвfûmsεlÿgûuûeûéËöýgg¶¢JtÛ—nÎV¢@D_þñ×·Çûß¾üeûóÆØçJ¾=ŒqõMåŒ/ôSú ½èUœØ_ˆáŒ2™Û| ̺ºÙܦeÀ´`Ú*U˜£-st"0G[&u0G[æè`RSæèŒ«0GŸ^…9:Ã"„Lê$`޶ÌщÀm ˜ÔIÀm ˜£Im˜£9ÚþB &µ90Ä6¨ÀQdíãˆbkKãÍQüéýab„ŸTp­v;EWj‹p¥N‚+µE¸bç€+µE¸R'›2\©3®Rˆp¥>½ !Õ:Ã"„ Wìp¥¶Wê$¸R[„+v¸R[„+u\±-Õ: ®Ôfp@ª®Ê©iŒg>û_G¬•¤óÙ£-b: kÔ±†kÔ±Fˆ5lr¬ Z(Vs¹µVgÃuã쌖Æ×)l°0 D aWU¬Ò•¸¾®JÊÊ[™šjÑrÿ¾÷-¯û÷ž¢~N'õ6ßÙõEª¡{){¢Ý»j’ÒÖvÁ|U•Ô¼©¥~ž?<}ýó”°¾´ì]Óqƒ’nKß^ÿÚ_'Úhîãeº÷ÒC4«‚DÊÿ©¿¬ e_ÃKÓ¶nû:³—ß.<×±¦ÆmÞm׸³ú« õ_4êýáœy«xîO¶všÚáS%ðõ7Ôß0ÛG>¥o¶¾õŸiìê? ïÆúa¤J±×Áïä@|cå~ká‹ÐEFU^ÿõTÐRê®úC†Æ÷ȵòIžÆn­Æ9Öùy­:‡ºEêòÛî=Bµêa›°ž“ï2eó˜D|ÞSulë»Ìáëû¶\J8s‡Ïè£y·±÷7J×DI@ÕDj\›Fúо3 mšØö… ýMgÓäírÛ÷ìÞ>ˆg99àÝ5M’´g¯ˆ¯5l™P¡}’'HÁ´Ðc~ÑŒ'7Õi­}W½^×­#®Í̾Ûô†³Õð> *ûÐɼ€Ä&KŠí+û6ùõ¯5ŽÙ52(,=Eœ~ÔSNPR&«¥¸Ôôe—>wIQ$9i¾ó3sÎçLsíãîÔßq cXXnÔi¥Ïï!©Zš²÷ú´#šèÞæ‹ï?—l/6í›oàÒ€BO¸X´Ì´­Œ„40(‰í3Ä\¨D”œ€f¶ÌìÙè'– E<±LÀsˆ£EtŸÈ{ŽY·ÛÆ'%úò©b+ƒfÏU|•0“—üêtEŽ Ž/-Ž>v\—àƒÈ<ŽSØ6xUØm bäf]¬µ£ç.¸§€‹BÎÊ¢‘ÑŒCœšH~ßá^dpè]ˆl“Ø`on’&#ìÃéoÆoØ<kæ¹tfš=ó¬Þ<Á` Äë¾ó#¾ÝNóHwúŸzH-eÜ[JWˆG“•‚ZNœN¾»Ë8­…‡…ë–®*Nؘqçå"#q`ؽÅ#ñ'Ew8ÁÈÕÖ)Û7EŒ4­ Žß¤x´3à£ÑÀÓ ðž)pö4Z~t´}>v:8¯9õ€ÍÖp ¯§#ñ+-º'¬Åh×·œÆ-GÞ€àš„m{CŠí@2°Ä?³\ˆKËíq”D´^}3IÊá}w‚à©vˆËÔ]ÇãÌF,…óÐãåwqkâvŽçø}ËNó.ªX-ÎÈ„3†ÆÎ–} DšŒµÙÐDw>ä•ù¦ðܧÏ&è8ú ™¡=€å[`‘¤¼Æž‚ ï1‹MªàcŠ÷#†jI§,õòúåžGµWêXž¹±Îï²Tò̧4ÃéÅA/Žøq úc²º1GÝ&’ÒÇp£î e•’zìkX™UQkeC¶O¦ï±þiâg¸ñëŠÈužšêÆbÖ§xQLiˆï´Bx"GùÃÏÝõZÀ!ëcÊÑöPÉOp§gˆ€’\d¬)"5‚SO^ºG"d|oÒ­¯¬¯k 5qgŽÇ¼QE³9ªk™GrÛcÐüÇUçáÈÎe­À/œóC£»V˜³2ClÛãUÿÄõÅ+IƬ;gËü! nªí.ä:Ów8êÛ½¢nÛ¯=­êŽ\ÝnѶy¢m«ò·)›û¤Q(µ«‘â»ç^Ê^žÄ{‰j ÖiåvE¹Çîú·éKï§áÛ7ÍZDqhºbÉ ðÕIVO²‚ù•OÃç3 ^¹¼­OÌBFôvF Oc)Œz%^è%Kîšà¸ÅÞ²§£äÉ2ŒˆF2 (™KÞÁ/¶z1Þí]/¬Â'ÜeVsóA²åp¼¼\Òq휺Ý(,«);9ŽOq$ÓŽå¬UÆ šQ:v_â` O¸³M¢+©$µdÃj±2ãš y š¯Z‹v²=™[¾-œÛG»HR5ÔA£\f++Ê_Yr ±<ÆZÖަs»³_\¿eÏ×–/Ajw$@¤ïÄåï2ÿ_ËÿâšÄ~ü-­Éª¨øTQU·¸¢~·JJHÃ÷Ÿ0Š)>I<\»ŠýQtIJrý¦”Ž£ŽÏS:Qñ¥I®‹“ÑŒp·Î°]ÃÑ‹:˧5Lˆùíx°¶VïÕîŒÓ“ÖJ•:G|A‰LL úþà!b~vF*%ÔŸdïðAŒGõæгwvi=‰&š›.Wö4Ükca=”czßÛžÏõ„Áړ±·ÇK =/²gEÜ‘ÿØ«ãH<çî“r\ˆ1h}²i~<±&>aÒo¤è»¹ŽlëB»ƒ£¯"á–y¬ä®…Š ýŒg‡7tF4-ÙÆÿ¦¶í ÷p k˜i@¼Bp†Æ×¨¡¾MÏR®ó‹T)®‹éúÈpCO±±¯!”û£tzV׉Çõ\=s2\ù'±jn‘Ÿ¾,V%q¥wc톚³¥8ɺr'¡.J¼0ÑÔÙ~¯ßõš_'€»}”Ofv]‚ÔoÐx}u¨ñcá<ÐŽ«ŒûëÖ|^Ç«‘ä^µúС”݆ h¬‹gWù.ì|õª½šc}›½²ÖµÈù•c¬%Jç~‹¬ë2·^ ªng8àí•á€É_ ¸c8`´a0ž0AÃ߈ñ”º‡“ù¾!êqXQnÞ;JŽ4o±Îƒèõb(.S™~ ¸å|ÖDa¡ŒU1,æÊtkOñj>»}7l ;4éQ#}sçˆ~Æ¿ùÉ ò ·r0™Ûÿy^,¢Kø·é9);Úì⪿¬uË0›Ím7½oÒEoikg:ëèMiÙî?´ä:ÂuËåÙHª>Fí‚_Îí.l‰/ ©õ~;b,WW®õ“{ùB#­ñœ™¡ëw zð)…îqùu:”°àí~ž''®ªIuM†=}xâŽp·­âb‹Ê°´¶^~ùÓÿP`) endstream endobj 124 0 obj <> stream xÚå\Id· ¾çWÔ±3%k_ä2@|ÈÁ€‘¹¥s²ÁFÏ$Ä??’(J”žÞVÕÝv؃ª®Gñi¡¸|¤tù|ÿ'ãÿüòç.>^¾ú:\g‡ËÇ¿ÅÇ·ô‡½|üË®ÏÊŠ'éÒ§y’>~j󬌎«§›Ö6SÄ_8üj\ü§ •,-Å ¦­Œßma•~ã… 2Ò ùf^x$RËyüçÒß…L0ûüÔzR¿å×ÄÏÄ#}ϯɜ\á”zh çÎÕwþi õÝø‰- ð6ùm&=‰op±…Ë|+¯H£ãœ(mö!õ.OéCéå?þ.¯€bÆà ”ÞºI¯•eLyf`BaÖŒ:S\ÓÏOÏ\ÚôÕy‰+" 2ËåE @WqÝ€Âá»á5™'3¬Éd2ü6ÊE’€ÒJ4‰Í!F*¹±¾•O¹ŠËǪpÔ)‘i˜™p]:çÆu!›³¼V›´Ré5yµÙZ’l_Ò xGåÏÛêeÊÉôÙ2}ð.Ü iBò’ðÂM#ï3œ7ôÈ”žlL4¡Æ>ò¦Æ&¼Ó,õµ0D'ÞPÛ¶¼"&tšIW(piÄ] .X¦\¤2!Ó¼C[ âòzÆe~üaÖǤ»Äí uß‚E섉]eH> ªã£¹K¥(¢ª^)ó‡ubÜjeØÏœóûFîwG®wF®™³mäI ê@õ>‰Å^L”WÐ6U,U8·BO¦¶¾Ì–]w‘qØ;krßš«¾ŸNÏtG²Š¥D÷Uȉ.Ô¸9ò¯¨ˆå%žgóæÓ®7Pñ7m X£¯0àÔÍ4- ³eµ><• |æZK@¯l{CÖ’Rdw¡Ø!ƒÅ–…ã ™pElŽíœ7ìz^`ô:ÒPã+ñUužmë>ª_cÆ!Íü£“®MÊ;ÈʯPOöPÅo‡÷¿J2e®¿~º ëVô pÌ˸™‹›ùnÆÔ¥·Þ*MægçúE&EcGL¯A¸'« ¡ "0+p(Ê5§ñŒÕ (0¸DÉ º—ÏQ­±ð§À•Í›WË„ž»—ɆBO’¨fOPwEµO*®ýóÔRv-Áж¸&¥X^ƛ〱 ’ƒ1 ‰´Ô_¾õÌ/Š:q”“ḒHAÙ- `³HÔ§Ô%·Í%_né…{žÖ˜2Ô¸'.,P,=«ôÕ}6i¦ 4¯~¼WÉ–Wµ@`²%çLÙfâåTQ¦ÑOøÍÓÍDSðn®/d´åvâ(ÙÞcH¦Üï8•䥂2¯¦E*s¯H™´~ç½¢~öÕÙ/ Oú¶Ò”Õ™w;†Îïy±öa/ö|¹"ø g–ŽN‰äÉï ²«‚\<%ˆƒoLæÆÆ3~Áâ1L¤£™mEt\X §4º»»Bæ_jW„ýa‡ýaëõ]áƒJ7ETŸk›Â2kwBœ¼'üK„8úì°fÛB×Çó´vªØ]Ëqílšÿ›µ›(4ÿ°BÓ Ê¥­VIÞ=ݤ1kƒŠæGþo¤gA´Q%7eÒÿ¦T¢¹cÙ!ä I¤§FøÓÁŽj+/`G…:ëB©\Rk}Ô»PAû÷³µ³Š95±A¾7f"³ƒ™ª"À§¡ wEðjNÜø.’ET’†ðš³ü[æ ³Ë,29 ãq)sH‘©†:¨ŒòßáñɯmI5 ‘jvjÆV•Ïúèòg©ŠCË% UãÂ3H(ÉнM$†}ãÈ R|+âM·Äu ­‚FCŽäùK€¢‡´ï7scÀÝ)5õyª¦À.飠¨ /ŠUЯ7ò؉ÁcУv¦ÀaգТ¢Èµ$ϵX ü1TT q>M…[vÂ|..{Xlž3Ea!ïšã8˜Ú#L@q´0±G Z *ðÇ GɽØ#tPç®Êû°Ç1èþ}p'±@;Áî,PícþűÀ°‡ºdæfX ,ËqD®%Fþ æ€ÜÉgDÐsâ2æE²ì˜šv›`WMS߃òeÞås›(MéW#¯-µve¬v+Pb’g(ÛY]y›ºÑëÔzkÉPiðn1 ׂç˜Å]X‡¤ګ˸Ã/¢~› Ð5´±hÄu´±hé%ˆo$ÎÔ˜$×|a<§Æ­ºMóm;Ľ©úØFTŸ"Má׿Ím$uåà©t›9•é¤8J7Ì¢ ¤ì1,!™j½è+µ+ñdgX©‹é³r¤éÊ<1͘‹µuc ÝÕ\ÃÁr²•z€ª™³©‡ZWã†äxµ\T@ªÊÐvðF#žÝPm¾dž ÷0&â&²îÆÁD>¯À=&"_‡œ}9wÓ7U ʦEï0)×%tá%\îóÃRÑEkZNûxTËÙÀdÓr£à[Ñ—æuÞ¬âŸÕéúKgXWŽõ¬„Jšä°ù‚¿63˜KœÜl*¢ ^#)°˜Šh‡Â¼!äeÔ%èÌ´2Ãj'Á¼Ô4Ñ; ˓҄!œ ÉK«¢$+J’1åîEñÚûu“Ù 1oÚæ(õÝó J—KP¨ÍCA!4?^ ÆœuIÀ»½Yÿi6åR½É”çBêd©Á—Ê5@"îán[¥97Ý­WVl-*º~«Ïu[nGviŠž1zaåiØúðHáP›c˜ Rv¨ç<™Ðïr:óD›R *ÕÎ1LZþXº–Ω+ŠÊ\ˆ™Õ0ëV£<]sKOç.ð ;5œÉ××· ¹绒•x¾jÕóÕicvµ}0S|ft¢š´Áæ‚f1Ö|’()¾Ö´šÙ†NŸ$ÚL ÷ 9wúMÚ£;EŒzéX ÂúZrZÉ6,ÇœžüÔì>6ïP íW m_XÚ‰mŽÖýåv§êþ€o€ Ê-´f~(EܵÌP¾QXj²7 §ÅéP3¤¤Z‹âó“Õ(>ËÎf¡?´?ëˆäV«j½ƒ ²W-¢ !N¿PPµ^Š”ÛžòÜ’¯-uõÚpY¥ÖõÐÔ£¦^@ø©BO üÚza FS6°‘gÝÞïV€²úú>ÛP·\:©$¢ÔæÛk_X†³—–ƒ×ì(境"öô‰õ÷ ¹«£€[… ¦djT©kP —÷$»¸Ú+èŠÕý[(cØE =3‡#ås2ñÕ+ L›Æ­, ´0Nà5}²Lû!:¨Èe8zP‰adØ=L`Þ&h¡Aú÷s@E‹T^9ÍiöeRæƒ*)“r]Á#gE÷ט¼L óûiªFØ1Ø9ªÔ¤‘Säã=nж¹ßãпÑü_òqdsô‡>ä2f]Êë¤/-Õ•GKvU6¿ýÙ=N¼O€1]8’ÊðО–\%GìÑûÆ5s1 •[Mnƒ_Î$‹aÉfÉb‰GÙ FL‡a9³–J†¾Ô´‚¨\ Ø Y—cNÂ$äLtò¯»¢#ÔcæÀÚä1œ7÷`ºêÕ…Ç…^xNT*yF˜„X¦¼ -닇·¡òˆPAŸ6êÊ¡’¨|{“S¨YŸ–²¿áð‹¡înŽZ½ÜËMBMëÄêåq°¯P8<Ó)Ÿ¯îñkNg\^[Œ5SD2¬—ÄC׺·Ãš×u`zd *‚ç«çÏÑÔRñ$°.q÷šÒ˜ð8YÈqÖy|äÉa—E¡¨ë¦ŽºKK‹ýÒy&ÛgZË5¶”Ä«ž/Þ!{—ÙkBÕå ³·d»ÛΫC°]&“DP5‡M¹Z}©Q¯!‚TÞ[D2ë9>h% ÑzŽÏ¶h­*‡r¤…UÍ•A¦“d_ EYáŠ7$Ëɶòl¢Õ`— Žà]}MÕ›‚8ƒ¢ËˆJ?í’hubóTšƒA%.ðÛSÀ…zVom‹U–Yþ 9ß#еð•‡J}¨%iÂMó–LiZ·¦¸kùÕ´e¾iÍSAë¤Q‹J+¶ÐAE·ÔÀ¹tK\ª©¼÷è©vAÉ¡À"o”ùžGûFõµ×>“vÅÅÓbjRÿó&-lšõ˜ ÜVÞYÑCËuòòu%æƒ:¤m‹ÎºädŽäP‡G÷Õ0³—EÖ#û2ý7º‚Îö˜JA¼ÓœQÑð) †g‘¿¾®T\ÎÜQÞ— y ¶íž[à­²Ù4*’?r†ærá(Yn~hf½¤‰/.Æ™”ºzcõ:yrÏRœOR°få}än£II#ÈÞô|yµv›·þôTkBU°ô‰ÓQ\Q5|˜ÛÝ4¥HE}X¸M¨s}®Š÷ç8ãfq×!Bó..Ò$í’Ó©jo*ÿš¶¡¼_½¤Ððø{/&säb2%ñV±ÂpšØëo[Ïbu—p{à΃>ó—¤­WqäÒŒÌ÷@2L´|Ÿ‚JPî®4™agpê2¢)” ÐÓõ»¬™‡yŽÈWo³2ï­|‘ܾ&M,ñX+íÉËX •{Ì%2Gо~A.‘Zõ㺿„j¥hÚú7ß|ă rvrlPvucíÆ“ ®àÙÌTš’zH‡x¬»7õ Õâƒ~°F8<‹Ô÷§+R½éá¨b«‚Ïïçý#òâÓe=T^&ZØ6£–診*t€1<Ù¸5( d¼! –¥7’Ô -JnÖQäzผSh%ûõ¨ålI5“¢7 Q'«F£³<$‹ƒ3RS”2wªwxkçÕšÎ|£Yü³…ø>Óüöãåó…©à/ÿIšÈx™燋ðŽÉú÷?.¿¿| ÷µJqIçð<IüŒ4é6péཱུŒåÓs^ >/+ª‡äN¥h€²×–ø2èW©î"9TJ4N©TºòÆ‹\ýÚE®éeÑe}_›Žî©B)wÄ3a1>SîìMgqÖYJŠ!šIÆE¯¤l4*Ù‘[%iöF†¶$&Eáq‘eg`£Ò¨q•-“o&]±)™ S¡i§>( •’¥7Ñ)×q1šVúެ]øÎPvÕ.‡)FÃú3ŽtÛxT kisz»pÞª]d 'ˆÚ]¾ð$‹ŽdY•)ö”^›<Á¤AËæÈr·;& U Û›}#x×¾ÞNè ­G.³€*–ŽÛ)zú±xÑ^ÑâWRsWH4¦¾õŽ ±ôrvé™×gNxsöZe©ÙÝÙ> stream xÚÍ[ÍŽ$· ¾ç):·nxZÖ¿ªvã ć žÛΞ²0`Ã Ø à¼~D‰”(5«ª{Љ4º©«™X $#ê£9­Ù lY8¦©&p’y!W/ª¼³]”Åâ¬ÂÎë±nÀŒê|r…j`¢"æ<Œ Lqä`|häª £Âè_’o]†Id@2ëñÈB>ΖöÀ-‡ôÔÙ14¡6í¶®àÀ#÷h14½'èDOê . –vw¬:˜÷òy²pž|ñ  ú©~uÂ1I.”F“B gÕŽ„â­“h¢K &Óé£Ê¦R?ä à:ªóÆìÕÛõüBŸ+-¦Ä8(ñ²¸óN)úÇÝb"ó=ÓýjâÒw<˜!Çæáò,$€S6uWϺ«âñÆ"½™å "q5xW®[dÞ8,þå7ÆsààrK¶­Â†¶–ÅSRk‚!A›™U±ÊO8‚ÃlE™(xØãÐ~vLÝ×®ƒqÍÙU«jd^¥‰LînŠuG5¡4É6(¨Ðäv–¨xeý‘` ØaÚé’½H -Ê'Ï›Žf“ç|ܵiLëFn€’Œ³ŽéRu=\ç/0qõ>(«¾GrLD Ò„WÜãºqŠo‚ž[^a‚ÖëÃ·îš Ñ(ñÌ“Cô4Ω Gqš(_»&Œ`Oa°ORû*/‘ÒYËÂÍX‡)âÄ$äÄLq˜‚›¥ VÇ”¶œÒA_ž¦+¨€Kæ}Uj_4o¯ÒÂÁ¨¸1¯¢¹Õj¢Z¤» 0±o}§²¨²=@ê}±Õð&]3 Sfº»Ô€¼—“›S‰$$#^NFÜ»&ªE-6Ÿ<êÖc$3¶°NÙÌd­)ŸÊFä[1ùm÷ØŠ:²?éÍIn¬ücïB±ø1é¥ö†X1: 6ØJQ(Ø5Nžn;ÓùvÕ{šlv.ÞÜ…æOv™J?^t;_çÃö9ª _;£¨v*w^¨Üa¢³y æ¶K«·DÔº`Ö‹=«Ö'T#\?÷ö@°Ž¸_ÒùcxÓDøDw\Q3¢m7…B\¥q“ø'ŽÄöÚ›x:‡{RV+ ¼®»S*³Ëe/rKHLPMÉ9&\·?là"ÄòwÖ4åŽcï5’=Œ6±é…FdSPàœ¡&c‹¼`r9`XÆÒiÐøVÀlÝf æDmßé¶ QC&X«^&ÇìôúŠÂ@¥sT¨´ï,HE¶`û?§"GÎ%Û MÖC;Zy²Õކ÷²Â&!ƒ¶¯ T#•áÿí5å2V?m¤ NWv»dó¥>oœ`b‹®É¯À’y¶Îö™Z‡úOíªjê$Bß,?¥–LÝ=q­ë§óxÑXªH=Dúf¥Ú¸&ÞÀß<;ëKî°{hä÷¼ظžŠˆ—pÚ÷J oú1¬–WK˜<±ËŒv_Û:c`æQoàM«ÚÞѹ[GQ娴%9Ö÷­GIˬ݋P}xª-k†à%ÃÎ+ûˆ}1DD¦MÓ~y!te¡Mm]cE‡÷$S[Ùšã¿ÚÐGô±A¡Csf‘êd}ç¬Ï;ðì'1¼ï‹Ü¬VV®PÇÕšq]•©®û7É3ÚõQ„s5Ú¬çŸü,ˆì!³§MU&wìX´hý¸½%±ð̱Íΰ$›QNŸKÜ_KáËš‘çžæ§öþ ½‘Ý,²íT·õ©uãþãùôë)çOñôßbtù]C4Puú|²1Â6=øùôýé»ús³1Ëór ɨ%¶ênŒ,–¥ºîá# ÝÏø(Ý ŒÞÀG.BMîêò.©AsÛV…kqö»¬Ãä¶÷7Æ)Hñ¨ÀRæK™©kCJŠå’šN¬}ûžà ¬.‰´&ôF£CŽÌV¯±Õ½ˆq·Ù Î÷8r™àKúò ß¤Ýâ®ÝJ·ÓL¬"übÖúo `®V¸Æ–ðG‹¼ßªðûåÍNÙÊJ¬Z˜–ŒM^8<,¡±cü\YôÚp¬ØmëÆ/¸ÚÅWŸØh± Fèƒ.’VÃy˜ñdÛ-ê¶5޲­ñG/ãE]—þ–ÙÖÙÔcxuüœƒ 5¥]mzÆ\°ÔEœ¡À÷Ý_þº®âi endstream endobj 130 0 obj <> stream xÚÍ\9¯$·Îý+&œ‡¡xk(`¼™žÙV H€øøùæUd±»ØÍyÇZofšÍ£X¬ã«*^~¿ˆ ÿ‰‹“ñ~ùû¯—o>_¾ú6\g‡ËçŸâã{úb/ŸÿñýõYqñ¬´‰ÿÜÓ]I16~SÏÊòø7þ3ñ©‰­+-á»߈ý8QŸÆï6~¶2µl­tzò$]ü¬-´LOõµ¶wu$Y[ñÒ‡Ó·ÖÌÕníÓŸÿ—&4Z›TéDƒ¼6.%4rÇ‚KM 2R€YqhaP7Ž9wiM¾~ºKçzKä}0MÍHfš †'ôfcIªËŒéc}|º kËÿ”0? ˤ¯£2ئ8¸——ênê´£m'µ+, VÒ²2™êLg*ZÕX)¿wϳ¹+e™°qY*ͼpµ‘µ ©¥*Á<ìßÐÀ"jÉ©¥r‹Ÿk Õ(æ}£7ç{zGZ†Ú@¤sÌÊKë?->²šÍl.ë)J˧Á¦§†\ƒOì7ó³gÚÖ&_?Â8vÏ8¤g¤ð¤ÐÌéNŠÐa&3êÓô‹«’ÊTÃÌ“eGj½ÂZ¥°ä‰ ÏXÈt™ 6YbwÈâK0:_ŒÃ‹IR=QvÇÆÏÎVM‘¨\Ù]Ç.ôö W­z( Œ´šå—„aAÇW<30׈)ªØéŠ(wW„QšX–<ÁŸ0SS{;åvƒ×÷Š _xÁ\;¦WŠþšIÓÉoöä·LÙLþ}Ck®ÂL¥ÉóÓ¾—8ŒF›øÕK`\ô]ŒúOy?™u”þ±ßý´Ý8majóa?£hxÆåÉ¢ÓêME-F2§öG3¸IÓà ¤ /Ù¬ìXc-樿$!äÔÈØÀYM––º´Î|):Ï516¾•‘ œy¹9F¦ò³@Ljף‰FÕ:Ÿ‚jäÁ)0𭶆ùi×WSæÙ ¸Ü[¤JÒ:ý,\—«H”Ö-5 ÊÁXmŽU0䓹1wgn0RY<¼˜—l«6Õ°Ð'™»·}Ê ¬~°(Îäè“’‚®¨VNÚ>îă;z ÒÐv”C¹õØ¢ Öü¾,o˜¡¨<à#ù[¤%äÝ’ˆ;Š)}Xümu-‰×k'ÜUZ§ƒeeÞ <½ª…‹PïžBd¬ü/'±lnW-›=ÈëBÜ ó}`€‰ï¸hLëï:ÀñÑÊl–Þ¸ ¦Üóƒ¸l]9̰uRš:ƒøÿeóxÁZ±V,¿¤o‰·ÊÔóôän2wLiÝì8û#w` ÏFºE‰ÒPZÕFІ3U«¿¤ªÕƒV ƒQ68vYÈUBèºA¼l™™!hU·òN,yý†NÍà¬FCS.8«’ GÌÔ*[ˆ3ÿ:vã_²àÑùP¾Ï˜ÁlX?8±¹‰qýƒ‰žw(1¹®âXaæ¶¢Ñú¾íìݼ[bÝé»â"™0/R)µŸè+û“ ·‹Bµ&Vä,ˆBĬ˜ÚL"}Œ¾Ž .õ™}¿LjÕm¦ÊXtïf€·ÖYëf0ÉòËùÌ•nr´xWŠØô§ÕÊùiýHr¯É~/îŠK’2Ý}^‘i’î£Ù®‰t ÔÊØ–¿~O÷)-ã M~ÙŸ,•<–÷’’üK,R8íŒÇO]^MÉõ(sˆ±ÌˆDØ>Ö4e²Ÿ{âõ¸¯GRÎ%¯GQΜ­Æ10”yâø¡`oª0FÖ^V ñ×?ÓÚÝ0ÕiEõìÍGª •È^§#]±>¸k#™´•¶hcÚÉGàóÙ!¥ÏÓŠÕáNÏ“!|á¥'Ãi*r·v˜Ô9û©5öû'Å~<9ÿ5^ñ„¯eÖ̇µ “J‰/OóŸ&óÞþ0a5m¾Ù ϼêS_†E÷gãÞ:ù‘–XÝÞ}š!ŒMXÙ"ò÷ÅÌ`Á¯ôv¸"wùñI¯—§düÈ®¾ÏÛ<` pÀ10µ-€¢î]ûîz¹ D<ÙvcDÑ ;«ÈèÎçÖã’!;ƒª˜gÐß™AU[S&èÄ÷‹0â©3+ „ëÏU¶n›AÀ¸‚³@c4&I"œP º#BzÛæìßÈó:b÷1”ùÀúÁáP€DÐoO9z>2Â2j+’Å!$¥™íºÆÄî!&¶KÆ%˜sk¦}^ƒóËx ij—üª#FÓˆÑ>QÃèÎÄhÇlâÙIJ‰ ':æLe:ÌÒ‰—h}â@iþF£Ç0;^W€ªë¨«´öµá6-ê¢ÝeGÈGê±£åÉ*ßy—ÉN1h"ˆ¸I i5âšòT")Ú΄Fê„´0$×Iáí²ãíe¤ŒÈ¹L{Ëä‘¡³XIH0Ö ܬ ݼ‘ÜÎ2ô’ËÄ¢ØÀI¦Í ÈtoËaðw‘ºn©L8/¥ñŒØ)?€ß¤ã/€¨ë['¡…Òj1´@Öa!zö¤÷‰‘r÷³J‡@öföì'Za#¹K hl‚Ë[# ’‚§Â»3Ã+¾YbT¥™Ðí–£‹]Ưèx9?%Ð$B2IwfÔL|« ×Ä74Åø· ì'-±!ÆtƒÆÐ›zÀÞê’S„Òjëó»æU’½´ÄijÒ"Ï“m…/éÝT¿ºv$"4å×E«¾öv¢É¡ÏyATé !þd¬$üÕ½)N6ÚPÏ%Zê’ȇÕ7Ôn‚½o#øý ¯`™èO…:·õ´žŽÂ ZE\E[±Iù #bè½²q“ Å©;/¬Ÿ|¸hp›hôãø~§2Um5k7ç‘ej[dw`>(ÏQ\-ЊŠÚÁ"R zýt°“Š$(\ÂeÜEѵ 'A™ÎmxN$@k”<æ\̤MpÒ¦Þx¦³Z=çZªO©DR'"w¸œ¯*‚„àcÌÁò1Lfå цˆÆJõFzk’,œmü{ôÃɚäÁ>I •_:%ts°Ím¹K)û‚†Ùª´ÑKžÞxžð H‡¬Ó?‚çpWÙT–| W ’ñÿï9èsÏa ¯úH§«ž~óúÔa5IV6Ñ4ŸRQÅŽ0% Øê˜\Ûâïµâý®­Cey8™Æ`©^š Õ’Ö#û°HÛö«„OGÈtéó™Î…fâ0C,bm±¥ÃÕª“>Á•ª“J1•ù·w¶«UƒíA]-?Á“Yq‘ŠàW¤Z…xmÆ/)-oå'ˆõ|œtz´ÕÓ¢67ÍlÓla<¹Is0‹JáË¾Ù±Ž¿Uc ž™å ps?ÓX}´Î>¤=5>¶H·ãè¼lª½Ê¤áÍ•´ãê¦Þ«fwåœ`¢Vµ„öJ˜žn eë5—öÀm—2”ô׌›U s”GúÞaÙæ¹‹êã –m¶àXÏVޱ–~ÂŒ½•9¡[%­ÔV3±DÑÊ÷Z…?\lêp'ø@]ëÇ< g®²å.ð{yœ¾!‹}š ”ZÔ’û¦<È“|£MÉ‚zÿ\70¸\ö‡;°¢ÿø¾‹Éƒ›}3G±Jº0oŸ0l£ÕüW](-_«Ms¿kÓÂÇÚ´ØA§Œß¹¾{(ÿÏrT©ù&—ż-¦ SeEcÕ¸àt0\³  ,QtÝDÉÛ”¼=ÊHkO“ `¦&€9;ÿ|Ì¡!ý®¤ßÆdÎnc’o!ò‘ÊÛE(M|Ašf<Ôa*);l‘Í•¬-â¡JŸË¦Z™Ã*€¸ææ¸=œYæ×¼T<@Ý.V`›[[Ö™¯Ñ¿V¬^*[b*×å(»P¡žcuÈã+I(Ð{@»~Ê4${HNy ä”…æÌreh(½ò–*YxŸÈ5‡LÒE¹Ýα±ËÙæi€«`2îU øåϹžªt2ä¡‹¯%Cu2€Tj¹¹/¬§DÊ!֞Ƣâ#„j=Ó¨&5è¢/ßšgŽž]¾eÎ9ΛñF1áÛšO¹^CÝ(Õ6ª!Ý£…Ðêpî:ÅÂ7é7SU´õ¥ÔÖÍÍo‰Mâï[½+Ù­——xJa”ÿb.«?Wþþ5ʬò\¹7Öâ¬öF}WoIQ³B¸ó/N0´ ™­ék!·ùËçËï—(™üå?‰½MˆêøòëExíÔúõ—Ëß.ß•»q¥ˆ238_¯ã‰‚ɦò ƒ»üê[Ÿ…”Sªçï*á«eÝ隃¼¶.Ї·æž!°ºú«„O€Õyª°&2uauu>È[êÝ/$¹ÖÖ9Ô«°T¶ŒYÕ:]–nn‚ìDúq°IÜ9’8\|<(‘^Ðæ:Þ…+Ø®Kz‹Êçt{ºÆ@×ަ鼟ûëqn½ùÆÐÈ¿&å‡_áfcàXIþÄJü¢ôìj`K#äŒÃY€«YûCr£®·«jK•ÒBo.Hì#ƒ„íH.ÀjF‡Š´Ç &¬rExûµ‡^-ÎsTpþÊ'1^êä8º8v0E£ã¥Ðg)rx2ØúîŽì“ ™,œ¾Émtpé6*ÞÊhõ˜JRÜ`ÞüD{ÙpWâ„:`•k)õ›ÍkÝoïnC&¼f·ÀÉ-a&„+šù&½)ƒ>»U+àøFƀ嶅?—Ë„?ïsü{Gm5“ ÛÈý<âüŽ"¯ÎœÚ‘gQdWÃf»}GZL‹5ƒFˆ”> wR:ILI0¾ûÓÿJ endstream endobj 133 0 obj <> stream xÚÍXK$5 ¾ó+êØ-¦²‰c')Ø$¤¾1œ@8ìñó±çQÕ©y,,;š)UW•í8Ÿ?;N–‹[,ÿ¹%ÿÛå×?—ïnË»÷Ûâ¬Ùì¶Ü~_™ —U^„åöÛÏ—Gï⣧À—ôA.~Fâg¹¬ü¾®žÜ¥<ÉÛ€E#È3ÿF¾‡ ßm“í—Ž€P,#îGè:ù ¨?Ž­Ê]“ê•¿W-;õjî$°Ì-ëÂÌÛ<v$"6ïG\º|,ó®ž QžízýåöC¬H{C¤Hg9Ý]!òsŒ×ÝvÑQc±²CÈc!ˆ³8µ'ÑA°—®/rÙŽxäH»ª›ãMA:kB9býÞÆ Œ„KÅã(Éï¼jä™ NwZƒGŒÀõî½Ã¦ž’A`2gà,Ø*DƒJUä2³‚°Û€*—h¶X,8à™à³Ðt4‘mV‘Ç«@.ßÌÆ0_ã´esEf—£ÉP›;¬‚”Ö!A3§Æ!ä ï(—IK2ÉrºN!çQã­Ñy ©ÈçÏá ñ?&ÓOÚ’*«÷c!MR¡¶Ð.†*‘)ì{IÒF•¤‚KÂ¥§Y.¾<·wÔ#úªU‹ÈXö‚¿æñÕ ,çÑxž,G…œBbÝ ¶ÍðýmrbäPó-]¦¬aܯ§($gœo®ûùü+ñ¦@zc«‡š1«·LF,è~.p'´Æ­àúLmÀMÜxê=D“Òçrß7oRÑÚ{vCUÀ0Ë&ÏËЗÓ"{!úkæ+lÿÚ×ô _Ï ¥bDŒ3bðuÿrŸ>zÏ!‚»è=M²y9t›¡ðŸš.+ú p­@ƺÚà‚6*¼’B¦Dj>†Ò„IUÞ¢+Ÿ´hÇFI[²]š.4ùC'Ûjäz Wôʪ¦k9öÆ-·—»&ðATÒ~(Ð)Ør¯®í»æ¦÷ÊÞºŒ! T‡ò"êRmµ F:ï€ §cÍb†Â÷‚¤û¼Ƈœ[úqÞÑØ¸4‘ÎìnE{ªJþÖ±èÚ¡hhBgŠ·¨Ì ×£-aÈKºá¾%Kxípl¸ƒùN•ž.ÃvX^°Jü_xÎ:@^)@r¨ØÄ†‡&@ËÑÚÒ*ZÓ'ùö†í¹ª Ô’ùí¼êJóiw-ß¶› ÖšüPùàšàbìdžÃûFnEk?d½’¹Ö¦Fc­)¨ºìy»ƒ­H»Ñ\}&gHö#ª[Ñzêä@½8=90Õˆkïú&RLJký¬¼±~to*ýi}Û î6eOVÄxG§™4º6øä;œŽÀxBÒ£7nãZ9LTO#è|:H¿¬xViÛÏix ¨´¿B]Iw§PIòÄy¡Â: áþ؃¦µ„“̼” Ïh üÔ4@éßšÄCCê¤(t> stream xÚÕ[K$9¾ó+’U¢Ëø~äŒ8€n+ú°ÒÖ`Ò"iOŒøõ8l‡v9³2»[Bhv¶³3ÃaG8_„=ËÏ‹Zdü£¯ãrùñëòû×å7Tñnyý{ü~SR¬ñùo?\àY×ËÝ(w7Nß7ñ§º«¯߃ŒÏ6þ?Á^oÆÙK~2S8_¨âH…:rƒ?iÄ/ ó«ò8¾[FYáˈDù;s5òÒFáj,Œó8¥òjÀg*—~¿~yýSTĺ èr-zЫ0&é!ʯ‹9á\Vâ“Bžšž’fPC¦Éµ‚_ÓJ£VpõÞÏVH2ÔõûÌ/i jÜ¥ï·ü_&aÝUR¡Ìl~P/uM²I òwû¥~OzĽñ݈ÈÜK¦{É)T¤WþV˜Ê:wÍyRŽ<±±hXÒF  amQýžBü3…¤i£C²âd—dª ·ùg7ªÚO)û9|äi¥ä<5ñ¡UdM&ÁT·¦¨Ñ3zêGk}©ÓšÍ,iß”ç²|§È ëTÝ>ݶ6bË'!¨GŸ,ÛÓûdÞhCPåóo›H‡SÛ íª¼í,o°#U©ˆ_tÝ6¢;¤§ Oª¹RܦR^¦Z×%:˜kŠõúæ—d iáD#Ù;s F3â±Ý±=ù~æùÄ‚»ˆfΪ,¯èˆõó¨ÍØ.’R•+DÅa)¤k}M–Púá~Õ¿=Å-èM‘+ç¶:±m“yè÷õ1“ä©ß™E^ª*ÈzXì«Ñn*°­–7 '7Ú„C1%óÕ læGFh_ˆ–üEç|ϲ[~sÔÚu‡dŽX»>dØOX{™gŽdHÊœ½’‚ÀñáBôÓ oK<&!¡üUCT{P!¥KÀJjö-¶gašÚ©fPl2,õí9Îx!’­„½ÔÑ@oÔ€ ‰+ÉfJªûÖQuâÌ“mAQ:ØŒæðá~±B…ûõ.µKÏëýú¥|ªÔEߎ‘+[®‰ê“%¸c™±É¶DWÆ6îV÷y,ÍDéÈÝ(Q³X¡Ÿhƒ¾l<푃‘*‰M§/š/ç¥ÉRœ™€.™}¯X(Šõ6­,2Y ù›)âø¡W¸´ÝDöH1šzæ'-&¢Nâ_,„–O|ç4DM3§™/‘‰æÑ{.àŠ ¥iëméô6æÏ—JìkìÍÕ”2}9ÕE]Ф3öS=Ù¦ÐãR˜ÑI‡%»QbTöÓ(Rõfõ¥EQGq} EVO€gÞ'âÆsfÅjÐܯÌTŸÈfHçXçµ*z–Ãìƒï÷mÊÜ °ÏT  Á_ oP Ä{_.WF\d§³3ýÊÙì¶­îӌֵWâó6ß/0ã³¢ïîð1Bšò=¸Y„‰[éq3Š[Q,u}6pºÏ9R–Ò·hóJ¥åþ²ÎNúþ4”D°á@ pŠ{(ç>äÔašù Ï}H1'ºK£æöæà°ýåÛl&-…ÜÈ ½vnô(Br¾ÈÜÁ>ˆ`;ªþzªËø¤žøÔ*Ìz8¦)­EÝ1‡æÌÜùGøôç¹Oƒ0áC}Zïût2á‚ ƒ±vîˆUäî>Æ'Û6áf°ó{™2‹BNx5ÛŠ;¢ãÆàö ÑOsAQ]D25Ðmß5saqFsÜ…_ú“–A{×*OVR5(2¥€44ÕZ_(»z5­åx3îÆjx([ðœiÚHfw¹0ji×sb ç†HÆ•œBµL&ã½ÐÏ|'Æ8m7·ã˜Ýüc6 3Ÿ³›-À¦ÔÞ×Q[–”ÓÐK2ê‰%ù Oq}ç#!LVoÕƒÝZÆåˆ]Hà 8Añ“‘VÅMÍ ©ìÜÛ ¡j¡kAÉsµr3Ú#íYÏ þ•Îï’ÈT>ÊRd­\µød°†ŠÁL¹…KR9°æöB{bsʾ;·y0µzvâßzR0)½Š®ôÚ9P¥~Sšk«‚]0®ïÕ%c×òÁ@0ZätýýcÈË‹ðl,½?Ê seû«G>^(s ð4X€jp‹.Íå:s.hõÃk)%“oÑÉ”úàbj?ÆŠàðR Ò~Ì.øÑkë?V £®ò™É˜ç¹Çì› 0™ã³`—Íû — 7ãÿ–Ô;¦Çj@ i·QzÀN/ExefK?'Ö›Éù„ËÀ¦Ë|žô•<\öš•GVuÞ‰{Ù±9ñ‰8Ön¬!ø4·5U*]E#åóÍ‚™TÊŸÓóÛ7k}¶Y"ü· Þ»]ŸæayEÑùì=Øzžz¹w#ÍpBòËTÛ— ¦ ”-dý?æÒµÛúàš±5=34ÅKâ‰xŸ¯Ñy݆ObÖlW½-Ô¬}K¦ù\=vÖå“ÝÖ±v¸¦IÕÕx‰ bjϨý¯ËÏK:,ÿÆŽ½ÓÛÑ_cÂJ‘~ÿçòçå»ü¯´BX‡]‘”‰B¤1w»;~ô ¶g]ÙCì:ênÈhׯÐç“ÿ$ádçÛ9\¬ñyr‰>Ù;9 Ï/Ñ¿ ŸðFhEõDœVµu²Ý(ö.%„÷àòÌ{÷í‹äšÎ©\œ„KÆèFsašÖébäpÛ/Ðd ì_‡ 7݆͋> stream xÚÕ\M$· ½çW”OžÁnWôEIµ  9ä¶Èܲ9ÄÄÈð)F~}DRd©ªYÕÝ3›ÀíÙeëµDQùDi<ý4ùɵüTBû×M?|™~šæ¸Ôé_Sˆiº,Ëüô…7ýcúãôiúíËôëßG?-ó’ãôò·ŽlÒôò×?=åç?¿ü¡!|š¼›· $ÍðÇBo’§2/enø‹Ÿs"Ä„øÝ˪ŽÏqöqºT˜]jE—æZD>ÒlIó"ì÷b)çç”i0?_k—çp­]*¬C]J!OÞãO}"v[Ú÷û7×óá‡pòºÏŠ&†yüv®³k&‹u.ž>þ윣êV—lü¸ð;Ñ}lõígøÇæãqéƒ_æ<,}Žæ5.ý5¸¹ÇLò18ïÀÙ'jL VÙ5«l356L«lÑñã\¬²^¨± ÐÁ*àæ(ؘJ{•-p¤ÆP¬²ÎÔØFï`Ù×ֿŠXe\=5¶Æà ²NÔ²(Ae ÌÃF1]PÙ·ð^¬U¶À™L0‚È{p Ë—êç;2‰x dwôèx«²^¨1‰¾Ieì¹§(ú‚ʘ{òbcPÙœ¹Ã¸ÀଲŽž«¨QT¶À…ug• pŠÔ¨Ö¨*`V1ŠÃÕEd ›©Ñ‹-*`Š/Žž#‘³`8í²H€ó´KY¶À•ó"`• pÍÔ±ƒƒÊxIÔkG•¯À<›Ö¤ç¤²îrÒ3¨l€%ßEŒ‘E´  5±EVÙGnì»É#ªË8U¦[E4 Àm=ªøyQÙgnìf h‚.à®a±6"˽¶4†TØÔ†(æx%ûdÑ%_NÉ\H]3zª¼[ÍŒ.`Éè63ú Î;p¶ÁyÈè‰Vá £'²ÍšÑ|˜ÑÌÜ` Ê˜Sç:Á ²椼NPe\9Ý'èà ²æ$¬²NœÁ³€U¶Àœ”k°Ê¸§ÿ,`¯²æ ΑÁ*[`6,VÙÍj»¨cˆ4RŠ[‚`U6ÀZc¡=멲枘°ˆ§x‹°´ÆÄ=qhA««l¹'_¬²Ž•ÓòÒÁ=™.¦áÈ{[2¬ˆ4p:Ì¡c³ÊØs¢Mb PÙsb PÙ;Ö‰ÊIå+pÆIc SÄÚE ʉ«Èô¢Ê¸rJèà ². ˜Á^eŒžŒÉ¶cˆxrޱ™³É˜ò ŸC+¢Mž³gíØª²ŽÜ¾ƒ‹Ê80ˆ©ƒ³ÊØscwú6• °£ÆŽL,\Á€¹tŠ.Ú‹£7p¥6>¡ò"ÐBmb\·tÑ@÷YàE#Ù'î·›¨ŒÂ²Æ×ù ‚:©l€Éa³d1 ¨È²&Ž—Å!€|)›þx>´XŒ*àÊ=õ tÂ`Ùcl*y–޽ˆ”vF–„®JY =a~½ÀìûeUŠdL’»;˜ !·*´ä ÆË˜<ÐwœT¾Gv„f¯ÒÁAe\¸'/={•é#¡ÙÒÇhÑG´ìUµmººxŒ¥m=¢G¤¾bpŸ#´ÿ²ŸŸ/1ú§¦TÿÛçèbkh ‰°5<ñ'¹!ðÓö÷ÜÎ,F2·{¨˜Ù°©ˆ6VÈç§Ãª©;)JÆGy6LI¤Ïu&´L³C)–>xv…—®X:mgÕN!Ÿ/>烃„÷äÀ×ýÕÍZjYçèX–ðtˆdÝaÀ”ÏÍ3Tc[eL%1bœé.Všo4ÿ€æÉ7;ÅæAµ´(Ý¿`mK¥ºÿµ?KÂoÖ'n%TÂ?Ÿö–±7é»ùqlK'ùbÆ!;@çåNxhR´«iè7@f¤U)FTÒ~~/xQ‘°Ð{%yÔ% †ÜõJŒ.¿9+ã/è¨ä#:›Y 9Ž7öB[:éö-°. xmß6wÃrîi·@ÝRlU\ ö_–ȶ‚ÝrŽ…XÚ#S´Íª-Ïù|n>˜ñNˆ˜7±`ôï‰-ûïwÏ—PêALiÖ.ù4¨¤‡ƒJ®´Q­Ñ¨¶²­lCXêwï¬Í½PéG z=°Æ!ÛíQÆ.`Ûf0}Ç“zÀ†×³ªÛi­Fv-b&< i4ëˆ+úöY׫>n(›ØÚþ\y>ÈR©kÑ‚y ‹eO%«¥NÛ±êº=/\Ï sÂb.gÝ-çÆq޳BØe…R€DŽÛ?X<¤!Jyð¼ÁÑËa\ )hDìñ’Zð<Ž£Î«%±¢¸]ÜuÚÏAŒcĘ}1<×ø¤_P~$¸J—º£Ž»¨SM`¥“¦ Y¯ïaØél`3ÏÌ¥Q¼ò7¢ñŒH$|æÑ!ƒ»:¡5¢óîLÃæþ£AZðmGGLwÅØßÔIô<ýc ŸÁ—›è m××Ö=Ui­í\§qÉ•àýo–=ÜXöüªe{ÙófsnÍ7¤ýï?Zc!¹Â;FŸð‚þî |”…n[(Ý´PºËBõžQF =rK³çFùlcÐ+¸F #F)Þé Œ´ìêz›~"¾àáv0¯Í. j‹,‹ÉíPŠëü ŠæðÊ5 ÙØ àÐR>x8*C×uC>vwÊ¡®ç:‘÷¶GújБݤb¹wRð*nóà½ç0©v:N%bå6­·XX"’òN Û’IŽ|7”Jºq—Jèwv„m¬Ý©ǵÄî3y­HõÖ²Ö•¤ºÃíaGÿéRë>е+Æ=¬>)Ü¥>mk])ô›8|vÕ…±j˜­`5 i…–¤!FèLM¨ß9”!üÌEö g+g§ Íf7ƒð‘w•!è½Xdä2ÆèíKÝÆ·yÀ_~>ñ”àŸLwƒò{5·²€‘„SP%ƒyÓ&§.sk°>rÇbºã•uâ­³ó®Zй}êmû zà뛚…(ÁpEšW*$÷gD/íc' Ó?¢+B…9Hë×JŸ\æ©£É3:®æk'£o”Ýs ïò⬊ܪ[ÂP·ÌCÝ2í6E?Al™8 ×’›÷‡ßV)QÅ6#õtè±÷†Ž@_ÿk$ï¤þÚDÂO¿†Pyprðãaû®ÈŠ£ßÑyèŠì—hć3?¹ºmÆÍìÁ¾åŠ™Ò{XäÿA~ðÓ¯þŸ“©— endstream endobj 142 0 obj <> stream xÚíZÉŽ$5½óʼn*Í”ñ{` ÜúFs`¤9p›ÏÇ[Øá,çRM1  §–tz‰åÅ‹—uúã¤N2þ§N¨ãÿòôËûÓ×O§Ï¿ '%Eáôô[¼|MÜéé×ÎÏܳq:¾Æ?g.ñ;k㟼\Qñ“Sñª‰ß@¹Gi<—ÏN_¼9¿nC±NæÞ\~|ú.®¬,[Z%âú&½äõ¥‰'Ó8'Œ;Y*yE€MÒÕëí˜a¹ø.d±YYçYJ9[*¾Sš­õvº–J—i-eæ{¶P‡د²—+èóu$wáU;'œ¯RH]ÙXÝš§‹³ÒçäD´ÍÕ“8#´ßµ˜iÑÃ,æo-ÆÆu/ÊÑääœÐ ÖCl=¼Ð ©ŽG×zp¥ý—èÚv¸Þw¸½Ëá[·.oÌ}oœc;ñ–ÓØ¡ãDö£;ú›i {ŒûÉqnjœKÝBAVPÂ]öL1~Ñ>‡J*YÂÆBºSÀ險dJ¡ËŒPÿÒˆé.}.ë¤o*<æ¹²Ì;[áž/< ÓAÖ Ó«­Sì¬ß"l\6n U½KÑœyÓy +k…· „l©75/y`Ï~¦®E”MðÓòûiŠ%iŽFÍãÛQ¬|:ÍÅ8 xÿÓ‡ÙJ1:LQÐòŠ tˆHà„.«¿»=‚ê/a wiއû ƒ0aÏCÚ]M+ ÃDW€dQvöi¶{aÐÈô¾m?ßöGŒye'TzI®«…‘øŠÍ0›Þ‹àwdæËjÙÁo¯&›G!= 7AI/+îdð€Zóç†LVˆÀaJfcµÄR4í½ð«˜ªt-k Iåg-yZÍÆ{biȤÉRiª¡øµBrƒ+nqæÍ¼´Ï>í”äP2^5⪵Ü7¡ÚÃ4Fzi=«ŒBÂtx8ožíÅt¤Š¹ádX7°ë´ÎÊÐßq²‡»j¥‚¶òÕÎù–ÑAx Ób}Ù`dB¤YsKfC”)ß! Ó!:†¶±šƒt¬ð¢=:æÌ”ŽÙ¶©¼ ï‹€xñDÖ+%ù-K#wiþwiØb‰[V¶Q'ücPï$à®íî3Ýakμ`xH‰â®yžÎ—$0›Nc:zcÌ€I¢[«ScZ¸¢F¥”Vµ¯’#ÏÐ)ö­ }ΜC?pú¦J%GU•'ÒëZò¥œjìÀÊúÎõìÌå‰u¹† ê¦2 ÕMáAé-Ï}ÕοÖB!Ç$È© °°àÛµô' R6q¥¢,( ;3ÊêÞ-,Hì#Ïï:Fvb¨*¼YÓ]J#2d•¹9Ä ©ë*!!rzÏQšw¬Å}÷b;z§Õ†Ží1²¿N)’1³Ài¬P!ÖŠx¥tÒvsqæeX#žŽC¡_¥²G…,:¨¨ ©ÿGKNtÕñæÒäÓžIÝ%¹œæ»HÇ@¹tÊ$senn€rVK¦qTóÒ*ÙI²‡„mñRž{  ¼tÝ7ÈÔ‰Èrú2ßVA¶!0±ͨNòÐL™ZF/¬9†þÄšå® kÒ.6⠜ĩîåÆlÚwöˆS÷h’š²Ñ ÂýUQgóîô4`§Áû\¡ !±ÿŽ—Üó ¦q§ýIµÃê ¬Û*IZšDVXÙüJeyHD`‚€˜$f µÆJ—2Ÿ–{2_µ¸4*¨Çöˆ1Ý¥ö0-Í[ŠÇë6^Ó;NVop_Ñ®¶Šc™g«8–9xr7&¯ÛS ËR×ð+yV»™$Ðw•ûlD¼"zIY­ h”àºÐxª…¥×h G„ÇÀ»ÞÁ”SÉÖ_c¶Úñï€3ïUÒMä˜[މ>:Æ¢®¿Ï²/æµ:µ![ ¨7ž•„ÔjÔ>³ã©*#ÅBø|™âO%ÃX5uÙÄg·'A¡l>‰OÂ÷ãןÚçólµ¸Æ¶½î]åRä‚D-GaCú·ÎS´©/QI®Ø8X´7azÒ$’ذxœG£î7Ä,pìݳw°±o ¾H„/íÛø©ÎNeWÝ{‡iÖ'ùýeWýõåÜ5öéA„Ü@ƒÊlØ,³±D<.´c¢#·óÎþmUB§@Y‹¢m&a“©ß=úê%±=“A+i­†¢¾-õÉϬò1*oåX±¨®“†VîLÁ•N-®qgÖeiÎÒUÏ®R—g‰šàÌ#kÞ¶VeÙÙÃÀx\m°Ëž6j~Á«y]ѱ·–×äÚ;{)¼¿å´ï®P¶:§!ÆWF " ™S,ýªPó^ÎÖ•-¢1¾…!› â5¶gñ¢¥M a!‡ƒË»Õñ™ÐKZ÷.°þ²ì\+5BÃÿRéºT ÿ©ö¥Rx‰TúØ ˆ6ýe¿âÁ¨äZÔÂC*Lõ j yK‘ÕB›õ"ÕÒ¦*ÝŒZS4úÿµQ[s®­‚­Mm™ÚJR½«+&ô•ÊìOÝ µY;*û6‡ÏX‚Yã¹i=÷êÀÎnëC4çaM(Ýáróïs/ã`Ûè›Í.W¾n;ãÒ»ƒI{nÛ”åy’0Æ;,{çLÇâP¸Ê¦Ž&иšáO-ܨÙSâí]dfËU—ò°?sE4Ö:v5‘G€²èDÆå ß<¾ÿäOß×»µ endstream endobj 145 0 obj <> stream xÚÝ[KÇ ¾çWtNÙEÜz?,ˆmÄ Ù“¼9Ä r¢ƒOñÏÉ"««{ØÓ3»‚ÖhÄ©¯X$‹Å"ÙíéçÉNþ³SvðÇLÿø8ý<-¾–é¿“óašk]œ>a¦ÿLÞOß>MúÞÛ©.5ùéé_ŒjzúçéñoO?†ɚ¥šŠ°¸ˆU‚üA iÊKÍÈ àg»¤@ˆâ/O«86ùÅúi.q1$ò&,% }$Y K ò5áì)àóË¥tiq—ÒÁRn]jÎe‰i²ÿFÐ{!Û óyæúc:ü1Þ‚¼äYÐÄqg7ûeóvŠñ\5Kª[ã­oë’K;gãÏÀ°0ÑÇà´'h0tp§5p¤A×ÁÖÀ‰ÃàNk`ô3¿”î´®4 0¸Ó 8[ ™Á¶ÓØÓ +î´N4«38 ­ º¥ZwZKƒ2ØuZŒ²)®Ó¸-ëÅt®Ó N+Z±†ï´N4hDA…Þƒ! ÎÅ.Å32y lîhÑñÛi \i0ˆ¼¡Ó Ø6N^äÖÀ“ÇN+`‡š œ:­€½¥Á"bäNkàLƒýdçN+àài°[£tZ7½8\©BkØDƒV|¨vZS|1„´- †jç*ÎÒ)m´.4˜ª€;­€K¢Áèì:­€k A_ì;}nÚÀ Î¡Ó ˜2Â9vZ;ºëª# ©A+ f±Eê´ömO“EÓ 8”vã2¶©@cã¨b—ÚiœÚ ›Í¡ ˜VÀ,!ÇXG±Ñ ½6CBì:=$/›¼Ä·×ö8Óµþllв›•ì¤¬è"„cäAè–!<{gž}„O²Ëãì½}ýËÁ Çøøï eN%áUeîJê7™!øo‡u?½Ñn§Ùú–å‹×k»¢Œ±7ç±ØjܾÂ^5ËÙBñÉY¶˜ÍwÌW ZYîšì3H3ØþÒ{«0x£­0çVhÙ„IûxõnÖ©Ø,0r}«IÈšÜ yµÀd1ü5LRvIfô£InvH±twðA §eNÇP8XùH}£‰YRÜhiµ/Vun?ëûüÌ —Ï×M_U›±€½âvÎl—äoŽsÉÄ™¬—I2DÎWeeÅvû[”­Wxvpk69®HÊ~#¯õÐ~#N·d›ùeÕŽ)ÌÁ‰Ÿaýüóã:,”ÜÌô@-5ëå*]ÿ”¸8U± Ü(¬ƒ3#ë¼æÖ]o©˜nc©~Ä⨧çnU9Øú°-?$¿4ЂL±^µNì!¿D# †õ·ÌЧ¡ÊH­úi؃:«Í—ñ°t]ò*a Raî©—,¥ !Çl¥>Õ}Gü‚ê¬Ðmùˆxò;ß**©é¤³®‚÷£j-á—ùŒHmÄŽ~57Y)Ê,o¾‘ùbEMNÉx×õeÙåÔɹ¤]°]Ë´z‘¸ÇV³ÄrÆÓ¦7±³ÿ~›ÚÞVtÒÿÇi­»ÓPObµ˜%~¡}¨Îi8'äÔ™Ï+ÎÅ~S›lÓ*ØmÙ,Âä° §Ñz²”È\d'9]¼†µ,'v%¤Ìf§8S@-W!×0é7ÓsC[Ìu{“}8š†—¼;ành m‹µ•YíPs|¡öö÷Í%µ "u'‘‘ÝTËVàðùîÝÖ>5Ž5\$ÔW éè/"­•ÛµËqxýÚ|¹á:¦0š¸}#m´Íµßô?¾ÄÃ&fg nâv/¯MM?Ð0cDn­ã`×ëL"6m°ï“yFñã¦S´Ý)OxZï†ͧ!å =-kÚé9B‚̯3<é‰T©òl¼Õk¿$çó÷j]àñ±I|üû/jd¿+6mا‚G/⣺ÏÔä‰Ûz%M£×…‹u­ŽŠ½,T'àCQsË“Ž]-·Jíz‡æ@¦}ú)ú ·áªû¼­ž²kõ”µÕsXÏ^Ø„-·4aÓÿQ¶œq©/kÂLÈhŸ8– [¸ñ³Ù>k¿wãA›5ûP`Æs¯ž±9,»³h½vÐêéž‚€~sòobuÔžõŸ÷ÌîœÓ§õ̾ÑÚ3p×ÒcúðEÎê¹N¡Ô‚žZÒ“4º•9]íµÕ1ù¸ÔíÉóájˆîó/r©ÒÌoãÙ mÏ®hü¤)8¹§gÊþJô ¹°Û4A"ÔNðŠŒ!ç0|RcÌ#ó½NqsìÖ½ÞiŒ×»¹;¢Ÿô–Ü=Ÿ)ZX/§Ír{r ]1ì»ÃFݰ;³‚/šÌwõ˜/r—¸¸OôLáVz«ï2¬z‹•œ¿]¸“]NÄé݃«‘«å4ï,/Ióöš·—5ê™òÙŸ<ÌöXSê[óAw¸.œíÌú‚Ë«wæDšŽ8xìï±ñོ–ýú‡îà!†OøÐjŽ_/k·¤‘aX êÖ¢Àö\ªò‡kݧÍÃö¥†×4°E—ÊëºøÎX¹»“S7–›Ü~àJ=öNš+CC~•¾ž¼êÁ¸ùUžñ‰€¥FíºÂMýŒYZí-æM+‚{ Á„;D¢.¬ w´DºqÚ¬ƒî.uÔoªºÖÞm‚ =žö˾ÇLÜt»úR®•ïË|ÌW8þU>FïmŽN¶{ÂÓÛ¯­3NΖrNÔ’#|ël·§ým§¡ݳÑ<ö졚£¶L÷E³8¼¥ÖÖ¹ÃSÖ™î¯Ì¹½ç\¡wT]ÅwDÑ&>Ëÿ¾ñþwÿøD€ endstream endobj 148 0 obj <> stream xÚ½[Ke7Þó++º•¹¿IH2d²‰˜Y1lBe²ˆñëq½lŸ{Ë÷‘t#˜N»ê;v¹ü¬¯ÜÛ›ÝLûŸÝ²kÿ7Ûw·¶Ýײý´ÙPöš¶S­»³ÛG)›íûí/Û·Û—ï¶ßííV›Ðoïþ9ððóÝ?þú”žÿöîÏ dÃfÍ^MTØ]„!¿HÚò^3òÞð'»§€ˆ#âOï†]¹ìv;•¸›Ð¬r¶îÅKyaš3 ”Õž4ÛìÈ~‡˜Ÿ/K»[—â§­ºÝåaød¶®cÊÖ÷•®Œ¬Í–fC®»ÏhÄcƒf©Í–6DœªÊ{°[‡üáùär~2šgbÞ]iCÏíy­½68·W¸½y€}Òæ€>ñ¸¼œxÿÊϵñ²ÓàúÒZ¼1ó|'®×™y­-7Ú:µ•Óf-üз‚jsûž¿´Æ{—upqÜç¯çµ!ãÔý—ãžýÅâàI`žfg·Åaò-pØËŒå58“.¨ Ü˸¢Òup/+`jÕDÆZ)jPPú½tl/k`Ê”ÜË8¢2d÷²Ψl›ƒ{YÔ50¶JYú¦t{µ v½¬#*Û¡Åà^ÖÀ•QFÄõ²®Ô¬Ïù^ÖÀ •Vœá£”/À¤1Ò;_¥|‰¤5báT#pèe \P™d^„^VÀ8,`{YSM^l޽¬€ÕdÅÉ©—50ôÞÀÂà^VÀèT³1#)+à`QÙ×uée œQÙ½QzYGjÖË”«^Ê 8¡ÎÒ$ê ˆMŒ6!£Á`‰¶ƒ„÷¶„K”Ê VRS¦Ê`×Ë ¸¢.zÆz)jÐB·Ž"Ø^¾S_šÒIÅp¼QYswŒÔ{YÃ1غ*¾H½¬€½Ge_ä^VÀ”¼”9²¨K©ÙHJÁV)*ÐD:ÞSònzYgR²ãÚ¤—p!‹y‡Í¸ ©¬€aÆævˆ ö½¼ºjº’ñÚüKëîÚó¢—ÈéÒZ&äÉW¡“or«ÆXÍ:ç`ôé~û9U©ÜÁlÆ•x½£Gû>׺74Ë­}¢Y^öPYoÕ Z<#Ì>Ô;çdÅýÎ×ïë|å–ÉyÜ×F@eÛ˜&{+µ¡-Ôü1¿Œ:Ç'°D£,¸Ž2ê%¢=ív‡^è.ý7KkÇp¯ÿçâ¼õìý˜ø¾º-lŽøã >sâɶ)ÛsÄ[Ê»˜¿½ùøËÍç0m“Ãív¸=yÜonWáeÌðË0c†»s¸ÓᎴ¦Ã‡@ƒãœ6tá@øhpRŽžö².Œ‚†û8 4x&­ëð!Ðà‘´& |48˜jq52Üu'eÊ‚îe ¡hƒ íhð@Z ­>Ü’Ï~„÷²‚NØt[Ô 6½¬=)³ô(ðXIq†é0<Ö'¥Œ.µ t@x†­‚á¡ ¸¯¤Í…áy48W«À‡@ã͏e< w¤Å«‡@[îªÏÄ!Pà{–`=< w¤MÒÕ0p —HÔF骎‹ÚâõœànxfSû$°C Áq)`ÀÂð!Pà4ÝÛý‚Ѧ—09ãÛSÏQ ÀáümH /C À}&­« ÏC Àk­exnqú °3C À ksfx‚ ¸Á›;h“ã‡@ÓrÞIg‚zÞvDÁmêžXÛ=cb(pÚ“¼xÆðžäUÏ AËÛ†ácīۆ¡Ã³iÙ3†'¨_x†&·—ÒðëÕÒðVîeΞs^›3±öžYÏp? ¼ ©Ž¸€»!Pà´Ã9bkк!PചߺuN»:4mà¶]zYÓ|r|ÎÄÊ‹ÃiçLÓZOZ$óж!¸€ží¸Yܧ b‹$¸Nn´DpÜ Á*X·©Ðý÷¹;bìUH#4}¹Dp=æê¨W¹$Óoלˆ¹tI&æ•‚®e*&ji“xw*&¼X*¦Í8Ú<Þãî »AZ~‰.é!WBºÃôäôÍ}Îßè±Õ á Â5¸;‡»ezC©8å‡X°Ha(§  ôQ­8G¤ÇV’$ÂP*MY",ÒDJå)OÄ‚E¢C©2eŠX°Ha(U§\ ôd(ó”,¢ò"YÊè¦l é"Ðz?å‹X°HÖÆ)cÄ‚EÊc©<åŒX°Ha0U§¬ ´´¨Òœ7bÁ"qÚ>ÏÃ,RG uiʱ`‘<mÏçÅ!X¤0òrSþˆ‹’#‚udX°H!aäU¦ I¤ŠIIÅ$„‘WœòH,X$’0òªS&‰‹TD/ÕO¹$èÉ$Pæ,Ù$.-ÒI¤Ù)¥Ä‚EZ ´!Ny%,K¤M‰%*ë‰%ŒÐÂÈ,qy‘Z‹KrK,X$—0B Sv‰‹ô†huÊ/±`‘`mœ3L,X¤˜0¢›RLT^¤˜0ž›sL,X$™z€'i&=À“DÆsyÊ4±`‘jm™sM,X$›0ü›’MT^$›@Ó”mbÁ­tÓñ {/S{¸#x¹õéŽÐÁ.ïœöÎ ®ìÜßÈWÄ®¸Wï™=îо®¸W„—ù‚ð²¼!Îg3t%.Ïæ¦ui"_±3qE¾‚VèMºõyËóE#_AkÒD¾ŽÎhä«÷†§€Nä+ÚWä+h…T¦—”`ÛŠ{¥I÷Ц¥÷ê]áùÁÜ+gWÜ+Àɋ̽ܦ›Ü«÷…ï'¿„|½x¶6˜p@¾æ»¥²|Ë3?Z=çQŸ[X‡OÊ~Vt÷¯zt?TIp#Gý3|lÿ’ÝŸOm?y »çß>´iÞ®ýkÿ ð{øà³×:RÛgÜ{ÿXà¬îâãO 6<ü:gµò¬¸ Ã*~ æCëqô­×Y|"¾™4è<ø=‚oÚï±#i#hSûÂÆA­~Ôßa*ÿo‹êÃ}®Ë.ïR‡ƒÙYpo3ÃgLCÀ"2´ˆÚjz>YëB3×rhž´ÿBGrd÷ÇZKZè6ÈBäÎÁ¿4èVgòÏÞ<¯ÐY¬ÑWAœ6S½†‡ëµì<Ñ¸àø€iæ™F:`¤²ÐÍïci©QÀaõ´šá@óÉ5Jó!±y‰M ¼BBÔWà¢äx>´àž‡=sLo’§Íª'.sOšÛ:fÔ•žÈl\[Nu<µ«Ç‡ç¶•%øÕ·µ!_ZšéPØ’`=´š²•!+pàìÙÁŸÊ´«}ê¶ —´†S÷ì“ ~:rø_mak o7Þo~w¹ŽX}œßi5 /xꘟ5+*Ü\oXá³Âl§ aH¾ÖŸ•¶“ÜÃ>pk8«ähx»tÈ'ªíí·«¦ûk¦³pé-Ëýdù7úÀ7ímËí/÷úû…×ó#^¯{=¾®éouÓSyÄíoµ Ňó[õúƒQ ÿñ_ÿQûWÀT‚|FÉX×îD°k|mŠ/ÔµÔDì‹ o=ú­¡]3³¬Ê/.{[ðúx¹<Ά!MCu»uºW¸ö>PÉû•)õ‘ZÞê—Æ4™ÒïAÎV'Lñ(Û®‘Ù<J¾I‚Hî\oKøöÿÇ…³Úæ€ùå÷µÃñ‘Û*ýÞzÔ¡;á3„‡êy¿¨'†Çêy« ޼asÓßÌcóÕÅØ|u1W%<6_¨K©ÎV.÷uÿL ÝàñP/Ÿ¿]Ýzí¡[»a¨¡[Á·l7×rCwÌç‹>ü''«m›·µT%· ® ÿ^+ÍÍ¿DAŠÂè~f[>ÕªÁ‡õ<ß¼¸ŸB¤LV5@orï)p *.® éžû¸¥ÔóxG¼Ñoº><¼fë¡—^²÷z?ÊK¶ñViãlýA„o '’d+asºf~M°4±fâ°ºÆCô¯…¹  ùÙ%á'f*Çø6aI†5¥}“-ï§ÞqÛé"üÞa@ýü¦C œøÕbÀz»PGa"n6¥iyâ²§#sVˆë™ŸfC˜¶’$üÕ—« Ö&o„‰Œl¯—2ç©ò_½Ãµeš#êp ½¸ãŽF11g&¶â22Ç‘…Þ¹èïœÍ„†mEú]¸ß²áQ]Ãgšvæ'Äñ[áØ—Ô&uwÛö¦÷Àf0›}¾Tß ÞôÏ}ožý/‡Å8N°:Üdá Φ?´['»!rÎ8ùÆlžwûáo—´ÿ<¹åLÃu ‰rMî¹ÄÎá×Cn«Ð›QxÜÆû"Ø·¿ùù endstream endobj 151 0 obj <> stream xÚí[K7¾çWTnÝØ)ER;ò˜5À—fNé=ìz‘[¹9ÿ>¢%UµTv{0kö gª(’¢(Šü¨þÄÀý?1éÿóáÃïÃOÃ7ïÜ 8sÜ O¿ ™ƒa¤zxú߯§‹ü¢ÀœGÒÿ¥ÕYú…ÊÿhÿVúOO…"SÑS4ž*¿OÅããGŒ4Ä%Ò¤‘'Á„¹œ/\jú]ÊËy’œ$‚ P4¡¿µ<[yz RA¤Y´ž ÖI¨Œ*ÇE z¦IAOcDTØ„‰«S&J\Ä|qÂôSFMrùxþ÷Ó/ުɸŠ!&ãN\0é<*%’ Ák£y2FSÒÜ&yÉèJɤa0°É<Àı9KlƒA ÷æ&™8r˜– '³&Nׯ/vZh‘–àM˜õ7ïÔÆ%r‘{ÉÁ?d2=æ Y&Ü ˜‹VzjñÑLãDráJd*¬¨ãÊ»<‘ü£­ s"xŸÃ6HßGi¼Ëš¬ÛS²~é™vâ]Gí%gšm.ï[\³f‹‰«˜<÷TqGTyl™Î0m ïgW\€IØ^iqÛRû·\j…Œ‹@Ä÷SpL†'?æ'š!\=ÁmgÓﻫ¢€i}ålÅš)½å$#ñ(€¡ÙϪé)^esœÕs‡•Ö‡Y=¶*8ö4qUÄÕ:ýtµ?]­Ó*MZ§Zn$$CKÛ´å[›C0ÌQãCÛï N1£å‹ž|5¾ø¡µ-}ްåˆÀ”ª—|›ÏûŽC‹ƒ|ž;|øA>=ÿs/ê³ü È3&÷{ÈS°õD¥Æ0L¥ÐÊ9-£HŸL®øíyÔFÄ:îüƒ†ïz¦V/ÏÌZ¼eàÒ{Ñ;SÓû·1ïË,­ŒfrWô³s§Ãóp¤äíòÞÔÃ0ÔsE¼ÏûÁb§+‚ÕÙK|8É‘¢©$2¸ÖÑÉÆZ숙Žb¦ ÜEÁ¥3ÎÌõÝç‹!±lÎMXÚÈ-AX•é}»1·ûxò‚¿DÅŒh7¦Cïíxk›7-6ªd.¦$ÉÍB-Jfq§¬+–런7õwLÔÝNi“›OÑÚ’ûzI9qªª™+)ªDèm¨¦.© Sm’G¥J!TŽS©R%²¨h@Ǫ$Ô=rVÅ8y¨ Q]–•R­e%Å‘bJÊÜ?6ÉR\ç+¤$5ü·af €Åç!fgŽt2d33t3ʆ艱[bL#ò¹Y:.q[Ì¡Ù<·gcï,æ±åÿ‚êŠ:Jêtf¡£€6+Ö Ñ˜\z›Ä»®Jåõl£è­¢vouµQbéÝÚ$zÒv X ý \í"™Êþÿ±eg ÛΩ6–ÓWj·Œ=S—€Ø–¡>Ý-7ç¡¶}²²Õ~ìª^LÔ,¥ZRÝ;RS‰!O°Pö€‚Ò=xg»@и Éê VâbE#}‚€> Nœ!W•('=;ZE”î“4—óÃÄÀD&&[K÷!=ŒØ¤·¼Ë»4£¡vZ#£A=Ì#òþ4|®\EÑ™tˆ;†×† ôQF0-¬&fÐ+,6é.¿I'ˆ³@8e,÷,Ã2Èø SlÛšMˆZÚÝ ÍÆ˜™+³Êú{aÚì Ò©u…×S–i¥)ÑD´ºtݲÊÈRtOñ–Jã3æÇs”Ž>“ùô×7PLëé![0´˜ßäµÍ¹bP%Nö±% ˜XJáÝõÓ¤5°õ,¥¡?£ñVib¥âÔ@õ¢¢¼ˆ[¸‚ïSG§v€Gx œ4(UÐ×½Ågñóƒ>RH3€#°pVˆŽŠÁ.,ÆìÄí‰Oy“Sዡ憠 UÔ;v`ä+°_ê-ïƒzïïº|zàj€yºÀÞo[úPÁc+ÐêvŸ¾É]¼ÌμÌs h×`(ΪÄÐÅ›©2•Å£%ÞºX$ð ;ß…ÔÏ6@–¼O{ã.Î`ÁÄ„`‚KèºÑEóÉê×ä ËÃOÏÜ¡~ÊFùÿÏÂûX™ªç³zúI÷·Ç~Å~üÚÝ7ÁY¤¦i^E²«Ðõ*˜7.‰¼ºèØ8*'_k¶”„2”^'¼ó>)ÜèLY–ö¹’<ÕãÂmÐ#Tç rkÀA#À°…Ør ÏKuobµ.†7²j€OiÜ Ô2Iáb àXGeh0_mLY@ŽÊÌúý4wš¯WhÅœZ>®Xñ))h¹Aµ-þlIAf&„:YîÂYÙ)ÝñÛ”i—2˹€äÞß¼§ð¶=w‹7Ì}¦lš!伬Ï{Ø»è±]ŽÜú›·QìÔºKH^ÀåÔä’¹ ¸Ä3u¯ý[dp‡Ô˜GíÜ•ŒÒ†ƒcýêÔDÖ÷‚×ÛØ£¸Õ Š/ò€Ü 0ËN€€ªË‘Ù…@]u, îÄìãï™ÃÞ¥™ÚÄéCãE$ˆ\ÒÌ€5¹™9í‹ãäeä €¹`ì$8¢ê©—c–GKv±µ@Ä»h°¥¿P_Âæ—°cGäM3;õ §Dº6Ƹ޻÷{0 hÚ ÒP0ÓíÈö®]Tƒ®›ômíëËÜ7¨ÿ¾{ùø€úïÛY§vûÔ_Õ^­iß;Ì–ö¸u‹ÌWŸÝömíµ=¢ýcçžž©®Á}ÝΖ©‰•ÿý?›w×8S«×à„• ®€™Mvã÷æ7}^lOÝø}„yz´½Œ½-dï­íŽ$ꥶÌïW@7Óº1][ìô%—¶Ê¡È^݆êÀc»à´!a¶|xñ…™»Œþ˜ìJ••ÍT ™Î´ïÕ.nŠòÍ"¡Ztö%Îh ]áÜgr·Ïä¶¿ó·‹lmq§ûSà\3¸]¿im";—}·n2ãÚmÞQ+ºù^u$yÛÜ”[‡4{tkþfÝn{îù›û þÖO6ü ÅâîÀÍívh ¢êÐtà¶ÿ²â¤ûƒ´D£\ úçÓð¯¯þÔJMî endstream endobj 154 0 obj <> stream xÚµZË®Û6Ý÷+Ô^±| ‡bƒ,R¤YÙ¸Yõv•¢@ ¤@—ùû’œ’’(Û ä¶¥!çðÌ[Îôßd&þ™)Øô§§Ÿ¦ŸŸ§ßÅÉhuœžÿJ·çü§ç?¿¼8¯ÓËå÷§ëìœI—À¿84r9_µé*æo^é®Ç« Yi´/.@]oi=x¹âíÕb~GÞ#ðgOÚò{ÙÃåúÂwôõç_|ã;üV§!£à¿ˆÈÒ‰€²^´î²(XXļ\Y¢§)*Ññ“¬‡îö­Bœf‹J•E §ÉN¸~.‰þ l¹ðn´qPÒ Eäó~S¯œO&T×›øxH_E䇑žüÉð ÏC?Úš3Ðß ƒË7…þá€õpú‡1ëß–ô·c䉯Èߎ§OÁ4쯇Øòöö½Lsù<ŠÜE »ï‡@Ór`Oÿ;Ĺ(YäU˜­v b"•%åoö(Ëqµq×húòàÄü„péA,Zé׈Å1Ôe6R—3P¿BìÝGzk'~•X{óy¸ ª(5îõu¶!\ôp'lÅòÕ(âf“™¡޾f¸f¾hãöÇOº–‘÷/ëãcgªmaˆÛ*p¬lL4< ).i2íT0:• çë‘ÅftÊØžg=Bs%Ò÷/æ&7ÃÈÞpãã×çæ(ရ•†”õÁxÆ?ùàc§‡‡i+2c-~ÌñðÄ>÷r«ræRÛsõ¥‰È(×ç¡Ò«“HPÞo“Ȫ'w‰v;Éî@}ùÑASÝoãrqSŽÃ®|Ÿœ? ½ò 0àx2sŒ{‚ø`êrEèŸî’K\›ÆçC¸/÷Ô$ÑØiÒû¹ªÎfH߃“9ËòœxÎ YèUf4žÕöó–¹´I¬ì™¦3 ÍÊÞ™Ý<†Pׯ#»BÛ=¿26ÚÃúä ®¥9?bÊ…;LrMGŠ'gÒÊEy1–µ×¥!Ϻ–gÞ<®‚†¡»£Ã“ˆäÛõ–f x^šÙ‡E¦Û@Ì’ V™YƒÑ a.tv!‰„IkM˜IuP6¥qè€9âT ^XNä®j`d`õ@@¦. (Ãz¬ûAw@7ÙÆçv|N]yÊĵì$Ç\Ǹq"Ðú"t’Û&ga÷½ÚªÓ JÙã’ÐS’E3%®PRèšî“räÌQŸvpTðåHYˆbT¬ M÷@„Ô‹’ã@‚ Å[oMUª¸.wµŠ'\éƒîš˜§ÈŠN¶6ˆµÙ‡ íœ|(éKQ¶>БDå›w}Há+µ46ÞFØ)#;Ò]âÊ.ÆëøÔG]Íw$+¶½4rXxvü¬}¥C¢Ù‘cÐj_CÜ/Õ?“„»tϾ$mUâLpÚèwÁÙ|º7í«ÛeŸ}H‹zF)ó‹ûÓ*Òa©†/!a% dÃ3³œÖ:¼cËëCÒYs$ÕEæ«s/Ié¦Y"°vŒìæ+ìúÀ J¤A¦ÚlòÕr釂ø9»À#ùªX>o^ó©òr½>Q­¾Sí)¾³?× ¸]- ͱÉ`õNçâEÊ‹²¾†m]Ø2E;`oݰî“ͼØÍcåGÚJï²±&»Vš¥»]qg»N$Ñ}‚f*2$®JœlÎÖh%|%=IPbX§½†¾ÃFìW®[§×¸PòcǾªËªœ*ʃþ¥/¨’ãWá¾ÄKÓBAÖ‚°I-§Î6¯Vºj WhÂpcäï#ê‡ûY%›ÐÙÒ¶À$‹ÇZÙ(5ÏŠâïzQ-Î#xKØ„su¡Ëô$—êî·'á&µbÞ—®¥–®'Aà»:Û'»ÒäøMV;Dä6 ]9ê…IN¶Š¬åF‡hƒ­÷ièó°ù¡Kúaí.]ù–”ÌiWú=²p÷Ó˜ö2Hd¢r™ÓÐå°~6A?wŠÙª…°öÍ]øk©¤b5¹•{·¸æ57*Þ¨8ÕÍõ=þ‹.4»ªK“›ÍUshêÞ]ÐÜ3m^ÓjXÙáTS…æÁ¦J¦Ò±mn$šúæ†$·™¡TBÂygÔ$lǃ㓈ˆåú³wÔRÐÜá·ú—jý鑤QæŒòi•M½Ôƒ”à ë µ«Ÿ“90lQø®u­ñ«{Œ4;÷ý ’Ý0îo”’à”ly³(‰3ÿ íÈs÷œŸŸÍ%¯ö´gµ®åòõoùXuî\ÖÉŽv‡hœùYrààÒw[»äÇzI2¦‘53Àÿà—çé·ïþÜ.p; endstream endobj 157 0 obj <> stream xÚVÍrÛ6¾÷)x„fL‚ì͉’¶i캎:=D>Ð,s,‘ I¹IûòÝÅ.(Úµ§[Âbÿw|«äK¢ *qþe²Þ'o–É÷ïðÌ<3y²¼yªä¼zóY¬2•­2+WY®W™±°mxŸgq?»Y~GÚ$˜?n®l’ê|îLpõYݰ–;));W„¤XRÎgif4†Í™!i8¢éö6§¨˜•µ' ‡lRq@[CªVE\±JP#£’¬&«\¥$ uj4'1èB‰G7гÀÕ2OS–a=±1+Ç$ùzÜW㸺œöúlþB;SjUªÊy©©¡úf–æ²o¡º0â]X­øè÷3턇½Ér±¼÷$X«©^øá¾²µw$øÔîëfKÌ!~¬_uD_uí¶«ö{Ö2ȸÝù}ÉT]ã·µ'ÙÏM?ÔÃqðÓ(V,gðåרÝû¦ÝµÛo³"g¡ìXçxþPuÃÞ7¨>P/Ñ®丯†zÝŸQ¿Ÿ¸®×X0ݵ?„rÛŽ=\¶˜°uB—lyQudF æŒVUÚŒdzAÆGð#_Ã7|keûW½ aø‚èH9iñ©Þvþ+±ÏwÛ¶«‡û=§u}~¹ µë‹Ti'9KHÇP:òÉe0œÉÖ>¬„ŠÂjÄ^ªº®îaS)®êG¼$í€2HÆïüz¨Û†T'¤'¶×p)ÐûÂXn?^Ñú–Í<Ç9ÖžÜ d( ÅYDé²WnÁáÀTpƒ^=ûŸ£%7!'Ã-=A|Öá)ªø¤Ï¢š6Á¢pt"5ccD£Œ?#ŒÏÈJ>uÀ@‚€ãrB#'¦N‚zÔ£ás”r¥YLÔxãxØäÜè‡ÑÌ)ÖPQq‰¼R„Ü1šïÁÐ+ÙNÐ0taŒâ¸G,‰3$1~d:ÞèÉèMžA«sÏ@Ÿã»é\ÀÞŒ$pÒÀ"@!ÙšÓ8 N&ûàHO\GÀ.¡`?áZEÈ0l 2 h¾’:Ÿ³1Al˜þ! –õ¿p?ç§ŽxŸ¹LüÒÈ6>rS0Ð{×âûBªýêŽ;–Ö ­CT¿Ehí±ÙøMú8ƒ—VuuuKúZl¶ÐÛ[°ÙŸp ±pܗǽïxAÁ=ÇÀ îÄЇL]@†ù˯á‡ßû¯‡ˆˆ¾gÊZC-¥æž¢šQÙߺ|!7ï›W8hÞ-ç]ªL­”ÜD˜IŒÖ xBkØ\<-Û<iõ—£ïÉÁ]ÛQ‘å]ÕDU͆ˆ~à6‚ÄYW!cFE)ußûŽXìpx¹wt¢ª¿7ñPZ=Ì ×oô ÃðÔ00Hµñ}×`/µï±–êá¸V °Â*ƒÁ‚Ï0À±a¬;rùGÝ ýƒÝWwCÿ'&Û £ Ož³é,wa–ÿÛ¶n e8/ØÙÆ—Q&X§,ñeh™Ï5üÄ4¹ôÓ¨ ÷n™üöÝ?t° endstream endobj 162 0 obj <> stream xÚí[YoÇ~ϯ˜ÇY™Ûꪾ¦é8Ć86 $1ÖäXuÄ"$¿>]}÷nÏÎì.éЀ!QœÝé©îº¾ºFÿ¸ûƒA÷—/Þ Ÿ^ Oÿ(Ć!¨áê‡Ah`bذ †«—ߌ×̵ÐüZ(úîGoкï¥ÞN¿•ûN…ûRmž_}ÛH2·†ˆn9CG-C¹KV»ÇD¸–ôYÆ>³Ù ­Ç¸"~ëBŸMø¬uøìVÇàà˜°Êsµ Œ›a+³yÇ(Jú =_w­ÅF‹1lc¤;€‘ãW_üí÷úúï_Ò'5^sÔñÊ?!1°¢À=M?¾ËÒq?† ù) ßHOjžï@`Š˜#¦ˆž§¡ëç• Ô“XHhõnqu À™å–ÄÁ&S¦’D…ÄñÃû€ñ?߾ؤë»ÿþôí‡W7nÛ‰'¶é*w˜ ­§"já;Œß·Æ@dPeš L‘Àt22!+¦@3 ±É3öúííf«@;–;?F6®ÿúì ºcÆ'7ï/ÂÕ‹wo?܆˗ïyýþÕíwß<}½yòôùÅî}3Þ¾»¹ð‡Ŭtv&YœÛ½¦âVA|8ÊŒ7¯?ÜfÊ×›#K¶âhY‚‰)uÅe´µã!’¹£‰2V >&IcÂVÆ(DÿRAK^H{ÀœÖ»»;=ùkúnšÓzØ}Æà£¶ÓΫlã"Çy‘å=K„¶#Ml÷z¤m:8-šÔHÄx 3¦µõJưàßé¾ ³Æ?ïјàõioáÓ—\oö©ø=ˆJ0¦×“Lx"a‰2hÎ$kÛ GbÓÂ~AÝš'%™ÅÄ5Ùã ¦…9ÐåDn;LFÌ0˜`e*Áü0]' FBõ`|Ay™¹ChëWÙ*øÞ²®x¢“Ü‘Vú¢³Ý'œ'ºMv#LÖÆ -¶É5¦µD"IŒømŒUÖѵ¿Û±•ÉùE{TqÁ;ÞÝý9ìÑ4ªÏq?qœ…ǃQhµÄ¹¶.½Yéˆw]G\øYd\-›½­yoÐ;ê™r—¨x ¦2Yæ’»&`@ÊKdîªØ°öÀŸ0SÖÞRy—Ì _Cé@ÏOV‚úÑ¿ÑÎ@tð¥V†e6-ùdãòOœQ;Áý"V™ŽÒšÝZøÌªo,Úå¤iŸ£c´Í^›•‘¥G½@Iug!Ü÷y@Œæ‰ÅÛ¬"ˆâIÜ nWeÌþ1ÝÐ1«õð‚^ûL òùÀœÏœày/ƸÍu\u<ÙEfÐ*üÒé×Eo 4dáÕoæ¶0qUò %È¥ÚdjÆBsR%Ö¤² €µ9€»”⼸/ÿ/pãõ¤RYF‰TµÉÕÉŸ®’¿i&ù Æx‘Q\EÑglǹpšE^?+UýLM­È9 •ü²§J¿ ­È´\“ÄÈÏ`†¼ä·}ca ÖÚJ?&ë{ŒÉ;ÌLu^G½(BἋ¨îªªîm5©ÎV{á_Ö`)æ’M²…ýº¬©VOXöü¤ËW¥'WØuU©$úhN6&ŸÉÚ¨ §ÉŒ,‡ýg? qqžM©ŸÇ¦RäÜáE¶¼¤£v«eš²Zï¯êø”ñ¨¡èèu@=¦ÞéBEXò»³¡âô,ö´ô½¡’ Bö…u8±²L¸7œË8! Nˆeœ÷ƒw'ç)'Ô4›aŸˆ®¤vŠeÜæòª´­d¿½81;í©¢&Œœ2Kž‘§GÅ4e"Уâ0BgûÄ\ܧF·ÜiúrN€rAa|iB=§xL…•%!¶UbLª¤©›uáQIÇ­šNl6Fú‘UåÝž¬³Ì´ºôbª<¼›r p~™äÛÉJ‡§µ+çK•­<¾•ÝâÂ¥ýò€uÃiq»q&©%ÓèF6 Œ¨ú”öªÏd†éîqÅ¥Åâ^¾y¾¦¸¤Ž(.mÕõ¢-ÞÞuËKçIFÖ›ð!ºvžf$d.©ì wp¬Ê+Ècµ(—ºà ‹fÅáL³²lJe1ï¡«eÆì‘]DfR¼vâéQq!qŸ Ì‘yÓ5,5íõ(ÒŒÍã„10_¢‚h’¨°és/OæÙÎìÒsyäðTÉ2 ØŠ+x}ÍâãÔbØ©mÃ!¨ž­.yŠ™Úoqì‘*ÞÈ@×kzªr¨^œì¹nC[úQ{Af_lþº³›s ‘(ýùëgÏz›aɽ.²,0Ø~áuì·ÒÙ‚¶;&±ÔdGøLÝyP»w.X]ŒN{£cLw¦®Â¼ºâá¡ëíËý¡kwj<Áš©ñë§Æí 7í°rΨEM'y«ÄR—¹$)é‚L«×zΙfûaƒFºña‹Ò[G™l÷À·/Ïç®Ã¿Ý§µ¿Ûûˆr£^i±Óo[•}YX9ê•VŒ×èM²é±œ&ÁƒŽUÞmpϘÝ}jKõt37^©PµÀS€ «ŽÈÏB‚‘d³à §ÎwÛ*šr³I¯§=ü|7äkï» pÝf‰ƒïTkç’yæé¡RC†ÉcÞ‘jgp!Ï^=í0ˆ6;ЉÉjâñ*Ú†e0"ƒëÍe/nH«U?i®ÜLiéO=X¬jÚ÷3õ¹^¨Ï5ãºc3¾ù®cGΨ© lèß:ey²)U@¸ÿ¼*åégýüpRC¦~¾8Î(ñÅ¡µ¢L× Š&„Jü6'µeøYß"ˆõœØN"Œ?ôsm¦R‰Ý—#J¥ú1•$f¼ •ÉeõÉ„{zìæÙ.›˜’þÑð¦ ÁŒåÕº;šîäÀª<ÑIÉ|”Á¼âˆÙO.fü“‹•4LG¼øÓk ؉qµÂ  !(PTãŽ"KY¥ëþô‘‹˜°‡¤•O!²×æÀhKñ5}h?$Î wZÐWº[ýKè2´Ã<7Ì®T¤Éªz2•8²Hq,ÕXz"¼CSŒ³„T»×q#8B^èäI¯˜úWŽ3·3(ä{½e—éFœü"W`8€Æjn@%‡ËБû¾g¤½¿è²k(.±ž|cò—1œ\7›„uo{ê¶fÙ D”dVÕuÛ è¡•bâüs­6㣠ª¦2Bª~ßhlZW³ñ´Ó²Sä‡5¡æ4ñp¿öÍßj{¶ßV ²¬išê½ñxò qiKZ×ã›§vÐMܺ‰etóè&ÚÎŽãce¶Uбá¿,øÿúºæÃ¼®)—_×”¿¾®ùÈ^×Tu"èÿ‹MÁÇâ„ãWÃ_~ó?Þ…}7 endstream endobj 165 0 obj <> stream xÚÍZÛŽI}ç+ú±zéNòžU xXa$F!{5ìYvÆ6c¯YþžÌŒˆ¼TGuUÛBöhj*¯qÉ'k÷¯ÚÉøO킎ÿåîÍÓîÛ›Ý/~7픓œv7ßÝÓ ¿»yûz8åNÆùøcOÆÆg/ão¹?Zãb« ©u¯C|¶±‡wðœÞø.Ä>AÅw2·Ç‘6µ¨4Oü Ø’zÄùƒ¡^4YÕÕ]8×õþîæQeQ´VbJ"'1¨ÇØô…±]s3(-4¶ÿÛ;]Ia±äÌZŠû±žöV¤p kÒŽŸi'Ë®cï¤=ïC ‘VÓSÒ¢Gm¸¤+Zï´šõƒÚô¨s«³Å@ÓJxÔ~ÊDƒá\åñáã§×ê;F^3 ëQàÃþhŒÄþ¨¼‡_Žþ:p+é ‚ÁÁy‰w?>q‹8Yûá"qóÔf³ñÙéðd«83Yӵ暒kC—_sî ”p4Ç?90Bš™?tÄ=¸K㽤¿ß°;Œ ‡•Œn&!É_OR{ÒNr»t˜ÒKÎ5„-¾=Z&»]lÑ©¥q§ëÑÄ7:‘·xT“fŠ¿GáLƒ #Ð|ºœÓ‚ ¡š3ö’ ’¡ÓßiYÆ-¦6dÍöëÐ8ôgÓãºCƒº•¾´’0Žm‰î±6GöÆ%¼®ËP›ç)ŠQ5wÊc´˜eÉ’Ú3°A73haâ‘£åi²k5¹ _T`0²xߌ—ÇlÙkò ê~•àî·÷Ÿ“RïBôë.@×egÇqZØÓ‚ÒÓ&Ô¬K>ñqÃÜúù»óEʪñD 5¸æ{îð᪴x6Ã/Ù„lŒAÞµ>¼û´?:å‡Ïwo¹Œ)ƒT›Øl¼¼K ü²¼e (¹´–sD!ŠÎ€¦S1p/Ìbe KÙ ¹Ì! ÓCñ/šDõ~Ža&ó NxPαbéœng¯¡n$ø`NZÝ)ðìcÈ9XçÞíI¢d=Aˆ-j„š|B&ï°z†LòD% ¡žd«,N Ìå@ÍssšºÉn½bκ(SÚNé@–kUG­ 7éJR?Ç[«-Fp^°±toþq÷ gê›çûï?rÙIL£¤ê•n QjîlÑPývRïBh,_šQk»7±xäò;;Õ¢5ÚYÉqø9[»zaH€wœ€IÍs/Ü®a*ÌluB­–p'«ñµä :;ŠøP`ƒ'jä‹’–‹û ‹ûî[‹‹Á¶`·íJ~às`bR mªYÖF¦¡& Ó“¬:¡qテ#š#œÕn-(À|]â“— X~à×~Cac!{àê±äÐãź%Ñ"Œ:ûŠ-¤²{ôrÑât s0ï4‘¶ܬr6}zIe¥‡³Ãþ$´^NU[$oΛë*rÞ?ŒP¤¸?/ð£®^ÆSa 5ñâ\û™I3Ärnè„\º°@}T1„Ž•ðöý{¼G°þûÝÓÓ3w…ñ}äí` ½ ¬­¿Öк¬½ÒV°6Jñ`­ã9§~O¬ç– OЮ¿6ÈÆY ís,xÓØ0¬VnLòrÉc‰p+ù¨oëNJÿ\IÉpNÏ¥mìîcif&ÆÐm2ÏšØ%Û驃„½K‡S,!G¨™Usxs™ »%z“Õš7-Œ53†OB…\ —E‰‰týÌÑd“¾V…|[,`œ³„y•]T_Ç.ʱæ|ÿìâµ5J˸µºnø!S)ó\…-´Ö-„+­RœZ Wÿ~ÿÌ¥!±ÂÔž¡ñ)Zù•h…lyaØõÐð&x ‰øoŒ¾Ï`üÆx6ù ‰æÔz¡økÞº‚@<ñk”Æ0įEâ7mQ¬ÿÜÞ=>¾Ouxsûñ^Ð)p½ ŸDn^lî~fTîÎâØÒÒ§+ÆÌCVùùýÃ[0ÿǰ»´±Óðêå_þø25„á›Çxâ ^ÆNû_1ª:&Ÿï/9+ù-”Ö_z‹’GÒ%Fß³/„†ñ‚5|O-ZËhTŸD«ª$µv@ o48¼Ž‚õ.ÚåÐ f.Xç×Ï$.£(F”VI5òÍÈ´I<]¹µxr9‹…!gôTæ6Ù6ù Q©/KPOæ!¶ú+8à–¤†‘[ ô~¤[d‘÷ðn‘޽.é°GŽHÇÝËN?EÈé¹snÒŒ/ pu;²,9O‰k'+%~ÚÊø•ÄÚÓUg‡v£1'‡ çé9/›Ã„Ö UÒòÄÁ¦oH^Ò^Ö{^‰ @×sÄž2 Î5Æ¡B kë..H&"¸YDx¾ÿxÿéx½ˆë²‹g©¯®ß!™YŠH@®°@”ûŸQ^YðóØÑD™ÀD™FâÿI ±Ý•á5Fn 46ß—~¹`†-Œ ™«ÊµÝ\Z(ƒ]9øÊàƒÂ Çr8ÁK¥â8Ælä|à‚ºk }€ioï æW#ÁŸ_À|—¾Ï¢K\ì©éér~móë"„•uªš §é,Eô"Ê¥«(+«˜-÷Ÿ‚ÔtcñZsVåVeΫܰPå:–ÍP2"—ýê*·­r kÎNj¨GÆÍŠ×ZßôY¸J9 ÷ù…Ÿan jÞ w·™Zº}è·‚à>—.!Ì.ŒFÙ~$4ûfé†/1zgö…8"lJìÛÊ.îýç*î&Ô=ÀX¼Î ÃÃWÃð8~) ç‘›`xœx¢ž^õ|1™róõÖ k®w¶…fbﬕBêµØ~ÄôÀ2‚fª1±¤`bOÅÔ}¯²@ÚqØ+(.ƒë×E ‘¿4g„™Ñp¾°E.Eξý öc–¢Fpw™unx<üd”‰þr“° U œÅ‹›ÝŸ~ö_^U“ endstream endobj 168 0 obj <> stream xÚÍ[YoÇ~ϯ˜ÇY…Óê»g,(l AÈh–h[—‡HÂI~}º»ºú˜­Ù%å …]ÍT_u|õUõº»ëDÇýÑ9éÿãÝÇ]÷íy÷ò{!:ÁÙħîügÿ~ÿ°Ýù§wýV Çs›A-ûûÛý¿?|Ü(Ùÿ¾?þçˇÛûËÍ FÞo¹´é›Òr«œòŸb«ŒÝ*ËÃÑÃÍý_çßøO$ HRÆ¿Õ&ŒƒO£Ó§Y’66¯ a}¬„g{sxY«ò¶ ήS¥: Z¹;v´œY­ü¦ÄÍðpöyà5Vݯ^œ‹kffàŠ’Ø\¯(…àåÖ ”lùhzþšh%øXzË\yv¾^Óêôp%cÒƒE¸Êãl¸‰øßô0–јÊEÿlæP%å^=+ÈÎ.E`C×C7TÚÄÎ¥cz\`°É½¢‘7>ä–ESrÔÜ;}VìQ›pFW—zï:¼aâLÙm7Ã4Âï¾—ªê`øaý›/o]/%ûBz±ö‚Ö'nµšoqë)6­ üð´ZT·ãvéL2^Q"+N¹š W›ßÑMÅ×^§ëw3…žuÛ¯¡g²P|{‡u'íä7mý“ ÙÕ²jz ;}üƒðecò%Kl­¹™k­¿, ¿¢i–¸o&t¾.ƒù­+ÓÔ“é ûŽ6— *·vüS+7 ©bEå&…F´®rK–¦j·õؤB´ýñæŠÂ¦©òÒƒØd¥~6Á¨§`“-°;›ò阮Òë°ÒÄ' %³yó¡€KpŽ"ñ•pÊ´}ã‰cÓv朸äE\éÐÝÑpeDéнNL£’ ¿\…J©%xGgtmŽôǦmoVíÓP)²¸âÅë`IÍñ(Ô,Õó¯¸À‡kâŒHˆxHÊ­b¤X”8È”y.*Á.HTŽ|å3ƒ£ü¿ ,’¦£àīޥ&U6k½§ÞJj°kmNk°W;8õú!\Ù´Ž–‡ýó´UÊ ÜÑgù®¼ª±jïWÚG$„ö®wVüd-ÜÜú"ø®”cè Æaøj5Ãú/ý[¾ü endstream endobj 171 0 obj <> stream xÚWKo5¿ó)|Ü…¬±ÇöÌ.ˆ R9 ­’ÔC›JE­H‰âÛ3cÏx½É†>”DëÇxÞó›‰ûࢠüÿ÷ê½ûñÆ}ûÓæbð[ØÜ߲͋[äÝÍëߦKŠtIg ^çÌkÞc3Þ§¶Î²Ïí/‡yI)05 8é-𗹬²/Beŧ$D­±œöúÊå<5}J‰bùXO‚¸ò‰‘Ábx À%T‹/k‘•ö•‚IKµ€µ4Ûm-o=eH¨@€´ó©åX)ƒA-ø¨<`˜‚&­d“¢î 3÷¬ò—TÜ#íg¶™µ,¥i6æhe·ä3AÓ¼ÂteŒJ0FÝQ¤ èCŠí«(zâf|âÂŽÉ—r@»íìÌ€j ¨ò¡aº…VXÃf¸P¡j"Z²)%O†Øú´3„¶nœ½<ç¼áMÐF! êÔLÜMåÈ3ý:}Z‹R3r‹CmS½=µÆSeW^õDMžÆ¿š”÷ܳ\d³T*£AJ…šÅ‡z¡z›#»îe©ÑYj@† }^“$­0 õ”ZÂè)<ÐW[¯æòiÉ{œ¥È&Ðc)R­,~±æ]Ѭy[¢–Ö8ºjÃÖñ¡rÌF•!¬á“ú«ÄnøÁá`ËaéìÀ^QÙᬉƒA)Ô)%+l¥5iéJ€ä6§ÔŽ®A­º¢¡Ï9ˆÜ±üˆ+}ÂêžÆ2;í“Ò>‹%ºMW¤èa³á$² µ9¬ìi¿§éîïÇ Á^>¼OTkƒ¿Ì–wqH«À=2IW·9ÔG¿Íìµ ÓýÝÌLÿ}ùæ¯ÛÛ—÷·âñ -K£­ºu|¬1˜ÛÔ‰CÙ–1jÁšÎ¢6ev.†¤éP (ÖÅ—µ*û÷Ÿo_ÏK‰Èzv/Óõó_y.ç4}ýîøðú™2Ñ|:2H‹Zx(I²¡‚U®‰†î‚Ÿ5²Ó07šnåá@¾>íàž´§îÚ™ôž¬áÊgÚMë×µÀ;¨èbÔ•z"vÝØ&††nÚ­Wõ‘â¬ý+4')Ë]h‡ÔÁâ¤(òáßñY9ÃHyš\œ÷«¡ïýüÆèaU_ï·MÐ%øµ{ 9<’¿øê?9.1± endstream endobj 174 0 obj <> stream xÚí\Y¯I~çWøÑNÜ•ªS»XfB¡A\$ Ž"H@I”õ&–_Om§–võf;QÐ̱ݵõY¾³vï>ìØŽºØNƒû—îž½Ù}w·{ô+;ƈ•rw÷w}`”Xµ»{þxâL8 Œð_ĉKuàÔ}î³âÅÝgÉO\‹Ãàþ³ÿÃþþ×üË÷þ›ÜŸ(¨ô)ÌàWpÌÍöÒý–þ4÷×ó,ˆ¿g*ŠWüX?Ï_Ôýi÷놵T½ŽÔq´¢i7ÑîšF?¹û§Ûy"P›(’H]Q„0OûïœíÿýôÙÃþ…ÿüù?Ïž~üôÜmk(Þ¾ÿZá-'Òt "~öóä($pstš½xqVx†­'ž'‡`D9¡àÄ H Á&ZrQÑrA”5aµ—o?É”#¥#ã‹D¾““£?ýöEï¼~ŒŸž½{ûñSüøüÝ翽þ{œúüñ£ìáÛá̓GOŽãËz Ga’XQßH^M5Ã?Ý¿ûçü‚ŸÞ½~úþåÇÎÜw¯ûãÙéðÓD[Óƒ)b™ûŸ!’'êRQ„#°É}‚@y¢½ÓAÐI(üwÏOsÁOhäIà řȭp•Gv{¶;-Ž«É œ8š¤Lº­üŸ©é„°ùµ€ÇõÖ xØo³€Gj „gv#MTÑ)™ôoŠ’^”ĵÃhUÑ_% ÇuTa´Ö‚*¤Ñ9ç–ýyOŒÝe›®ÿÜmlBaŽ/Td]zA.²þª·• ¼öCWªeB_i,Þi¦I@Ú$H‚:MR­$9‚@dÄ .—XçY¦X¼î!RÉö²,Òo•ü²À¸8‚F¶ÄñYVYŒ R´gš™PD#³'Ûð`‡ãYœŠ3%ãÿ~;öÖKLfõcg[{;pN ²‘à}0]¯ZqxN^î§ž ”:"Ñ<Á’H¿‚ÊѨ;… ºæx²š  )Y£MJÖ8cGæf¬q|„”ƒeõºéœÌhgóyK%=×u73Ú×°^Ð`´þaÆHñìáƒ-hkdUWvdpç"Ûî;le@+ŠÓ vq<dÏÝ>r:hDÝ8²qwЄ¨¨„iDå4#+kžF.Øüt¶‹m>N@ßÂæÛ0â»Þ&.2 fçl~\%¢Ðû¯ÑÁq¨„ |(Ae" ÏR=:ÿ œöÚ&T¸ïº?´Ü¨Ãt¡è¦k¢n^Ÿß GÿåZŠÈE˜iV±¦äDi÷þ] L™è±éÞV¢±wºÚê]ú9ò¦}h‡’Ua´ðÌK°×Ỷ¥¸R,ùWKë#ðƒ>LT`"¸MèŒQ…ö¸/b” ÕÎWé ¬8Ä7h–öP&.œa_E¿2QŸµa”H(–f/>ÙÂm'dIñ¡dt…ç6½hitO …,ö|Qrœo,{ÂÃÕžö´,…CaGz—¿;–PÞ9·nÏ-ˆŒgzx~$ºŒ_dþ®œê‰ÍwÅ[$uqd¥(G!¬§‰y¦,SEA:ÀaJTJP@F°Ÿ~òuz©‰„‘70æF°šŸ»à³Æèë-€!®°@€-™³d¼¬Ê²ÙÏúÚG´7•£™6m¯5´|Ë.Š! ¶Ø‚6žÙs¶€¬±<8GÁmòvc[PѳñêÚ$XN †=×B>_åÃNCþÀ©'ü)™Ä}ýåô¶]EÛöak¤w|ÏŽÍ'P¿Æ€1ðÃ2ðó«€ßŒp_¥'Ä:K8/ÀƒPÆyî‘Ü#½>öbzLƒêºC@C‰‚™ ÐÈJ;0Ìvà[ÒYEª»é¬œñ#ÔÝÊY^¸.Ë;u|6ߺºÌ„~i•P”mŠ€c~dD’œ¿´z_HŒõ‰œá°f_1j3LhÕó1’>¸cª0(6´åÁJi#e:§*“IÎiXZ/aK ,ܘéÔ¤U›v{ÕOè«Ê+è¦'+I:64TEµPÜc’¬ü8 Æ\0+“(q¯h€R¸Ö!!kÕɊ ¿.»bužI%“ß@ÛjØ1'ç¦RÉj÷¦Ê뉌±Iã´.à§¥Œ15émc ‚ `‡¢i7iÌm“ðÇÙ4vê-&òÆ’-²M‹9wNc6êºÌ&'€¤ªo«¼ÒðÉô¦`ÐÉ!ë’Cv#JÔã¬e=æ˜NˆËSî"®^Ê IáâH¥gÐ;„ù´s¬j6“œØÁ@‹ý”bvòÈHÛšMS?ªCõ h] ¸Z¥|Õ;ˆ$ŒÍCùômâ5.&"Þi9© ð*lsß.‰Ò¬…Èøu‘³¢ªŒÝ$4UÔÖ›0øU‡Ê¡ã¢Ž«ŠŽVÑî•–G>$øUH‚4 üAªÃ|*è ‡»7ŠRW®œËÚñYk@³Ë\ÌŠ¬ëCu5©¸Þy|®Bå½&¡Oûq¸ÛuÈ$Ô.@?£-Àƒ dĦÒUå¶ o}T—µ³WÀ²Ä„—]Sa|• /ÂzõSéÓHSv«| él­Ñïï%OÙ}â9)¼ÑÈÜ4 ZUN½ÇÛŠA©kÎÕ1xý ¢ØâѦFâ(Vï­B-D]ÑT@ vë9nÞŒ®\רÞI]TUâ•m¬©0@1ñ¼ù“jãÏ 2#ïŽÑ­+–±‹ORP±åcÓàï5ݶ”vÄÝbfqØ}ª*DØiÚÄ#Ü®o†eÛyë v¶gÉ®íYzÕwÔ¥-}>çcùtÎÇ.¦úõŠT?,ÜÔRƧ{Sfò¦ê³Žëj.-lKægªŠk‹#½¡fö¨bé¨»é¤ +)S=²™ÙFý:ÕIr—DPñP°‹²/\ÜW{6ÿ3¢yºsÚa»…ð›U¥çe_/˾¼±ì{lÅdÅh¥‘—JyÛ¸v̲ÍKš _¨sþˆáK»‹­B7ßQü«–y²4úuáÀ2çk¤ö=F5X?.Ôã»ùÛ©CÊ¥TÒ³nÀ 7 cfd­e{O0¡„_°m ý>KXÝ‘üµïÚÎAJ —“¡¼'c7¯%!iã¥Yµg¼((>d‘ü,lÑõ¼I;ç–æüËÊNò ×t•9Åââv]e_Žog•ˆ‹ÉømC°ì¦ÀyIjp®¹‡£6vh‚Ö¹6ϰΤèr›gZï’zU ¦GõªÌ÷€Ú›1›MSã ÕŽPÓ:*›;ЉB)ð±.…Ñ6 å½³h{ó³(•tŠZW•{ƒ½ÔØ5¥kB4-Éâ.ú»0¿´g'bÔÂ!Q_>ô×à°b ´o'Ö(F²™0ïó¦—àU÷Õú'WÌõO®Hq»BËmðæCob»`ñ‰Œ¥3b8]›$سïØhGH’Ó„Ž–‚ÊKËk UdtÓ¬…ŒnuyF×2Q·jï3ËÌ6[™=ZŪ&î”M73v‹î¾[F=ýg¯¬^{ü‚Ü|m”ú5¸%GÜ‚nÁ·¥nEœ"Þ·£GÈΧXÊ ºƪ[9¥"˜ftQJÒ²Š÷ꚣ„qÚQÖëŒÍýØŽóç´rì§6­¨ujût¨Ì³øÊªB¹>!ñœŽ|BŽÑU% U‡A©P4fÝ}¢¦£c£æý\([nܹ»PäçYrî*±a#¶u›ZOƒ—ÚÆ‡nâÄÈR´(«57‡Õ]]"=!)˜­>Ö#ÿRDŸº‹RO&¸ÍÛ6íõ0Ý^DšÕêÖ¤D(ž­¦ªm¥ =‚ëVö>ówe§€ãJÅmƒ†”Y+4¤ÛHmK%}¹Âv¬w«‹«<|N7ˆj©E¶bAz¯b€†<ÑàŸ¬ßdzïcxñ×ûû—Ï^Épýëpô:‡:Þô¤»È{´Oº·mCbô¢45P7FS¼…‹_Ìéøÿw3t*êùišÍñpìÍ_ýn{É»›}W‚•4w²$¹ê™£,ÿ Ï ³¯f˜Kj¿µ,Xß§g“ïSèâíùû¸rá} .}Ÿgø>…°Æäûtý>…QGáìû²å} ½÷&Àä{®¼×ß*^ЧcO]a½s ê#¦ù7‰É UM ¹OOÎx<îeä¦Hád›‰^n31z¡Í¤}L?ÝI¾‹:³êïDà 2iרn)Š?×-O˜·aåÃDî:ÎÇoê>íÎ*¯ø ÕÃg8†!ãÐÌLÛ:ûúû&”•i €÷Û‰<£sU¯y­Q¯ áŒL†®3<@ÜMÁ£‚å¢ýkOG?SDõ—w»ßÿä¿7þY1 endstream endobj 177 0 obj <> stream xÚÍXK#5¾ó+ú˜ˆ±ËUv7—•àÀ-b.ˆp€E-¬ ñë)»\~$îIF+$4%í.—«>õ°—?·XþsKþ·ËÛß—×Ëg_m‹³f³ÛòðËâÈl¸œÒ@X8œ½‹gö샕oBþ&~‹þøãÃ׬Çc§(X¯–t<}x_Dú¥ÀŠE‚µÚ™–Í„µ)q3-Á@U‚ÅTDùŽ!™yÇRŸÅ™ÕÒoÍá¢ÕÃVíóoûJUÔýµu«‹Kÿ]kR Ꜻc' ÎvD±­×ï[Ô–£0@{Øn>…›Ž¤ô—ÁÏÝ2¼$1f=w&FÑ­ š~zÂ^)_{¥¤VÄìÁ>J&Ò£ÍjÈß™pz(!ÎWt+–Y»³MsNÃV|È.ùà—›.Ç‹Æ4 ÿÏgvÖÍXê=üõ§ã‰\˜·`¬V ­´¾?%è9Ïê›—†™u³Júª’À9=ÜÝݰ§4+‘>ÞQ"ÃÍ)­5Þ,‘ØZ8_º›á€ŸS¶a F ÉŒ‘&~Ûñ‹`r(¨otíPÂXÖ.ÇGo­DKŸ1 O…më{Òfsj„uF“i àZÓ_Û®šwrFŠ ±£¹_VVâ¿€öÌõE·¢/‘»Èxä-7Ò¾1 &;LõBÂL£4Ô‚›†éÓ»§Ÿf¤‰& °•ÛŽr[!Îx}7rX½´nbà|4¯1¸ˆT‹÷Nä&:úc:}KÃq‰ q-˜úȦµìô´¿…vƒŠî/c¿`¹Ç~Ñ¿Çþ<·¯vYœ Ùv>j)»¢ïɘù?üõóûwªÇf4ÅtÔ²?àÅ=EÍ@nré•¥_\ò¬gOe"±*›UÏaYo­u3Êmí²álýTuìÕºÅZ˜±–vK@­##%ã:PÒƒÿHJ\/(õÊàÄS ÀÅánŠv—-d’:j,åÜch]Nè¹¿Ï 1æ_>,ß~ò/H@&q endstream endobj 201 0 obj <> stream xÚÅV{pSUÏ%í=§P‹6†­«›Ë2®«+ ø EP¥Z7¬ÒhS öI“´Ißmr›|77I›gÓ6}¥©Ò' /‹Z´<ðíª‹£ŽoOð¸ãÞP2:»²³³ÿ윹g¾¹÷~óû¾óû>F#cæÊ¥>ºø¾ûo^±hyÚ¬äÛR"ïîÏ”…gMß&ÿ.†. ¯]»ðÇűÉÏU‘]=9²/¿RÚe‘¶„¼DYÃLT\÷§[“ç/^þXVž¶ªÁÑÜÕ÷ô¡Ão|¼A½eˬ™3o›uI˜}gT˜’£ÂœKBǫ̀p{T¸#*DÕ“£êÉQõ䔨µ“µ“õžr[TˆZN‰ZN‰ªÏ‰~š“<óÖÛäjJ²‹§¦deçO]^·!ÿ_^JxÄÝÈÜ"{Aöþ„˜¿OúAFe?KðÄÉ&Êži`ÌŒ…F`¬ŒÈØ;ã`™&ÆÉ¸7ãa¼Œifü²k&ÈÙYžì”ìCfÇ„l¹BÞ³ folNì×ì.´Åx4îÎ¸Ž‰Ó'&É&•Å_ßžð3“÷È:ZªýQ¯k×%~¶Gq’<{¡F¹Q»|nþŠ•×ké$ q@¢+È4š`k°›€E»Uä 1/XÕr¹*ŸÌ2 È-ÛÉœ/Èo'¸±bHä­¼JqÒ ‹ð/® :†”ì‘?¡Zi¶X¤ÏP*ö”A'÷Ñ 3ÎÝB—ÑÉt2oª©#æE³MåΠ×G&‘)»H ¹@­!+é4Ï‹¼ÝfŒYpY½‡q‘Ze÷ „Ÿ'œ«ûžÎ×’Õ¡ qA&ÜuBN–]˜¯,êA¡ ŸËm¢ÞC¯×e>žc¨0ê-倫Ùm´8¶•ußìïr°0yÝ »ÌÛ †sÅ»«p+»Ç²[ lCB#8pØŠ ÑÒMx0hïQ¹Àiq"úçLV6”éÍÀô4[W .|6WóØù An"…AqŸBc¢sXEngíð÷S‚¡j Þ"­ˆ§Ÿ{©>¾K—øÌÉYM¦+¾úœ|©lÞ·¯o?àWXÌå CF÷×¹ÕeÆm ÅuÈ‘úfÑó0c¡–Q,°ÂÆÞÒ‰YÅùa{w¿mŸ*[‡ž0e¨UŠ¯ÔæƒÝY† ×*ï.Ø¿"´ÖÀªBÍ S•É常ÙÐÑî÷u´ü:& oÁ$—Ê”7!Hݘ¶È„lzæÀoÚý7r³öÂ2]b_@wŒôWœ!'”Þ |}úÐþ¾Q÷s¾§]û<­û+H ÛD£JE†2ãÅÉÕi·.æéM0ÏETöñ $†Ä¿M£"¿‡È)rà:vÌY¦Yˆ÷Ò8¥â 4E²¯»?y«¿Ùá·5Ã;°÷Þ¦ù‚^(ƒ2XÉ?¢Nß–—Sª†¹y¦î$6{Ákö^¸C^ Kün„¬ÛpTÂ(¼PYáGÝÁ†l޾ŽÔE UâE/ÚÞÚgáÔÔÙV§Ímu‰XñÕNïá.8C›ŸÌmÎñg Y€çÑõÊo$¬Ì|xqÚ¦G¹Å¬¦Î9À‘´2µ‹êÛAKW¹d ³¼¥ pÚ¼’ª„pª ¤c²9IŒâ•*·!ƒƒ~FîÝ[r×g•W˜*@ZtQR++î±ëé õì„!©f×°ÏÀH­;Õ‘/æY󥚭 ‹bõl^¡¸‡#ÇQ qŸÊ‡è?%)5¼AEײFÁd8½n‡óè'"QÂ×8`k ©>f;ÁQeÕazŒS®þiŸ6¼ZÇô •£ò/Hµ’ô±N›ÕõÅšÏi,8_Ú¦½FãH¼7±'áå½×QÁI5¯ª¾ÐX¥ÉLß²ò!×­ ,ßo:'±àWZÏîøì=8 ½÷8–Z«,•Öªq¯¼äuU„´È‰±5GC¤Nºô:èþ cøCšÐújlªÛœ‹'k½ú`5`3Ë›-&–ÀC¾/ðv3¶²nðvtöôìp ÁaxÙÐô 6¡•KÔëTËØúzs}½ \ˆUô¾øQÅôÙw/á„Ôöª÷°£Áf4ñ¼Q]ÙCº§ôCü¼-Õe«ó87{Wš KI¼XPÌ·#dãaùÐoVÓR-Ê-²îä¬N§ÓѸãpÒî#{ì~ÑálrÚ]íOÚZ_¹ôâU¨ Ð:Ì‘×/¥.­ð PYÍA©:»¬hkúÖ éIO2ÖÖÕšj,d0i»Ã÷’”çñHî8QB’/£8óŒ†üþeÁ6µ1¶Àæ¦âÜhîæ{†6M‰¾l[êÙâgŸ=×ùr—¾µ¤Ä --ê¬ìTýæ¡Ë ™æ/GÅ…¢R,os“«©µ¹¥¹ÕçÒ{Ë=†PÖ“Y¡Mµ.Tàšº*¤‘âGî©’§Ö­?öøQ‹Õ"H$$Q¹½Énz“öí<ò¨ˆ}tZr54%>.ÓjêëW®y8}ùZLRPŸµåø8À.mxɥ뚉¯{6sp—1Y?·6½tÎZ(½£ÚÛZ<íþê­®¢\—9\²ƒ; ]oz´¿ÚßÅ.­¶Öv+þœívTh9zeçYÔ¿‰y¤Ï—¬æûùü€|GÄ·…BæMíGk‹‹6Hª·úÑC–çžá Kè–²5ÉÓ²Ù·yxÆàŒábXé²4CÛ1ÏSÃçwïÿÔîq¸E@¿KÚ¬¯_'HõPq‘8ñ=ÐáØ+å[†4`Õ×WfPv-•o ˆÞŽIª´Æþºî7\¶îKQq‰m/GRÈ&š‚¶š ©—«+? vG”§ÐMoö·4¼xôc_¢ Hw‘“¢ðR%/ð0O{U¢kɤs$–Løa‰§STôZ Êÿ¹Cüw§º¾Ó¨ÛÑRIÃŽÐ+„ ZÌ-àã­UÖJLßBOÔV-»LZ%ú_ £c¤^ä=.K“‹=Ùŧs?¥#¨ê « Íùªª"²4¨g KÄ>N «:Ö–ì†k"}2†Äpð· Ì.m,K¥^þH¾&Ãr*‰ø¨QiZ˜Eãn¼rÉóû9’ŒÀmñ€ž|vôÓ4q®ê×LÏÃ<,a&ß*y!£X[¡×i[Ê–æî7æíˆ&.¤WL¥qïL#Wr'àÈÁÖ£VQ°Kd/"/4Htå µš5Y+@Z{™'u¸ì]xŸ ’«ÉÕ8˜ßšþë^̬yŸu !ÍeÖaáP{g[gŸ­ðJË8zƤÍkÐ5è$«Ø@xRçEJë8jÚ‚ªöôëí4Aêƒ5dFì/Ýõ?åòMtFŒÞER Í¿l ½X㊧‘†×竤ÁU0B6䘳o+µoÔBo“ïÈøuíŸ2$×OÇW(¾úm÷V4f{g éMìD°gë€:Õ¾AÈ|™Â^ºIóÅyöȱ¬Ô‡—e.áæ³èpä@˜UVøâ|wH" zFã"<êסBý9i|àÃ’‹!§g<.æ§/3Ç?~œ’K±*WÞs½â~“é5ªÖ ^Ü-.O×öξ®íí=I§Øèü ½–•Ž)Êl­éñ‹düo÷øa”B¹ºéÌÿ$ÿE“ë¼J h,Ài·ˆç_m{—{ží´ju\B¹?¼ÀCò¬m–®oBª‰r÷½ñqñ…øI_N<8I5ë.V­Vçü|õ?£4× endstream endobj 203 0 obj <> stream xÚuU{PSWÏå‘{D¬JÌ4vl®v[gµ­Å'Ôº»mÕRµ¢Xßòô$ B ò"ß%o hHHB ˆ"tDmKÚ"µ¶[étuÝÝÖÕn»ëvíœK;Ý•:Û¹3g¾¹ós~¿ïûýÎG ââEMY¾aCúªÍÏo|=cíüÉÉÑ‹¸9nn ÷|,÷dYK>ŸÏþ”ÿ´@@­]gOŽ®‰SøU0—_&f& ¦RT‚hÆsóR^]“±=OV¦­ijÏÞ³ÿüääù)ƒ…ÉãÁ‚ÇÁ’ÅãÁxÎ’ÔÇAÊ¢ñàåÇAêøöÔñí© ÇƒñäÔñSS’ç-\Q$+.Uäš¹¶(/ÿ|fF‘,[þ‹ŸQ&óÉ1KÂÁ-Á_©;‚ï©{±?òô& ¦ ’"Á“”‰2Su”…Š¥ê)+e£ì”ƒrR.Ê-˜# 1‚Å‚Aj2å‰I¹ËÆ=w.>=Þ%œ)l¢§ÓGÑt¤žðÔ„?=ñ35ù;k ìÊVe’è"žö¸Ì¤,‡Cè`@ýRQk¸4xP*ºh†:‹¿ånÙ¥ì)?«L껎Ý×E£¸blž˜d”[ˆžGäé² ¯”6 qFK=ÖÀ÷H4€gÈñn’&Ád1"ÂsĸÁ—ácûekŸ½?x¼µ«;ÐϨ!¹/2ËiXnZVüvùÞ=²l@!IlpáE5·ã`;Ʀ*),¿{›û§XN@¯³ß‡è¼j⣻‹.¾œ¾4ÿwr_E(äõÛTGJ¤8—ˆÄ/Тs+w¥¯ÌßÒy^ ûjàfSs}³¥Ù:nV?7O™ôŸa¼éóÌ/Dw:¸bU€î›²ržÎ¯¨]/Ub;ý\õtj÷X=pFæöît6Øê¬Htï”g°` ³{Ÿ[Þ ce€‘Ýâ Ew>9¹3#=#wó†°Äjj‚N„×Äa1 ^ë‘€}(Ý;7¤Øðúb͆‡Ó7홇p¨†cÛÿ/j½Gf`ð%ü6O› Gà]ƒLGa5^•óåöñspΕ_9JæWÒEE¶¦ÞívÙ}$ýCïŸþÀár:ín–´J uUk'Ê‹m§|žîkq~ õ™ÊGG:ÌyL]MM­QŸû¶dwÆ®Y µz½±Æ‚[%G]ÍŸH}ô/Àäÿ*˜²è} ¸X/y<‹oÞ, l-o,™eǯél7ç0dÉÅ“è.wÓÈÃk£­­ pÉÞ ‘ë¸s”·‚šËÏÔ½8ˆˆ&±X‚ïþˆ'DM—Š'‘é¼L¼L¼¦Gt¶D¿«ÎÛ£'xx]>[ ôBºMÖcÛoÃFKzþŽC…{Êó!²¾¨ýc]4ZÐ#â$3‚_òs/(^`‡Gc;¸4±¼…îì0g3²¢ôô Gù²ºi¥Ë"¥Â¢ƒ¶ ‹Wµe¿Wz¦ãI·1…p\ Ž%“˜M°«xo.¡ñbW—¼ºz¯F_aRÚñÚ™ó ~…¥ <èýO/Ýë&’×¥ü@0X 葼ø’¼ ºGcñ9$æç1ÿð#E¹JqȧýGÚoÌïJ'““x‚ý¾DS˜¸t"rµÞaãÇ,²Ñ›©ÞY§Ú¼%# YûðÄ›7ÂX„ã˜>8[Ú?n® ÷¤ŸÂû†c»ù¶W“…ña}Oý`kØè²u:* :«J2DÃ!ƒ²À¬0óÏ8 %>îßOçØÏ0xˆ8=AéQá8®²“ć2_•y\Ç]²ÛÏý¤¤Z¢¢rÑÇÁgjÉ:O¨>2á ¡lµŽ*¾¼&ÚtH}@§Tí’¿•ePí.w#–n­?Ò Ôªñ––ª5Š­g‹OJ€nülÛ¥žÛ=ßôÜn´œ\¸ÈG’Ut§·¤„2­J¯:V¼¼0MÖµëÂÅ\ò±ÙmtƒÙi{¨‹õñ;èGø)ÿp^#=ÞÂðþPað@¨°±²AíÑ" ]­«©Ôi³3%y[³v¬¶ðÔ—ûé2[M3x!äõ6{}á@›/Ì?ˆ­áÂPaƒ¶EÕÈHƒZ©«ˆæoóëè-  ì”õÉN¾ct\z'ÏðÃû±ð~~šŠö7ª*(Õh´j­F«©Ö<ôj-²Ë;JÃʰ®IåçuSÏ?+>w e låÒŽ`yýád-MˆmüCâgb›8ñ_ ƒ¥ ’ív»ãçiÿQCY endstream endobj 204 0 obj <> stream xÚ]PÁjÃ0 ½û+tìÃI c.0º•¹…­7ÇVRCcÇ9äïW»¡‡$ÐÓ{’ž(ow­5è!8%0Bo¬8¹9(„cIY6*®UÎj”žP¾—þSŽ”Ÿ?Í3ߋ߷—Ó±)_AcgP­u»Ëqlmï€1@¿o§ؼk×áS¾‚Æ`웳÷WÑF(H]çqåý$å4N^* ÒHXQÔÀš¦&hõ¿Þªèzu‘°mbVŶÊÜMªdïáNÍ!ÜöædGi¹±øx“w>©rü}½m* endstream endobj 206 0 obj <> stream xÚuSmLSW¾—VzQÔÍÙ­8½íœn V£5"Q6uJâðcB‡ªýÀ¶XÚÒ/úñB±·-½”" j™‹:kH¶ÄhâLÔýq[–˜™˜m–%æÜzêÜ-¨sY–œóæÞ÷œ¼Ïó¾ÏsHB($H’œ[¶ÿ£íU[W–í¨Ü·>›(Ñþµk±p0˜Å-%¸·InY·\À½!¤ïo>ÍÏYBäÞW³±t~6®|…Ä»|˜Å- æð__Z´z}Éû._WM*ƒÚxT«45hTF£êX“RSoP)ùôô·Ò`Л êúS£A­U©4*­JgjÒ©õ:¹ü½b¹|M™¾±eú‚lEm¡lµB±®H¶F.WÈ6kùÒµJl_\Å#ð?Y¥¾V­2µÈVll0™7¬Ze6›‹•Zc±ÞP¿©°HfV›d{TF•á¸ê°l«^g’íTjU²éö‹§c™^ÛØÄ”íÐVt|‹y! ’orb q€¨#ù$1BzH/é#ý$dq8D”ù9I‰Bâ;r+y)‡Î©É¹&X$¸ ¬vpÞyéÛÈœ"¤ß¤w!³¸w††š Ušù6·µ L¦Aè•ÎãFÏp‹$j¿.àV#‰8ìÀI zcl\ ýöî6¦|ÜØ³?ò¾–„ýáP  D LEÝýZ/+Œ¡]}¾a´€¥-`¡l¢.ÄA/t@A«ÅÚ"…æˆç3×mÍ©öI3ÎÛ+qz›N¯Ýíµƒƒj‰Y{étÁp‰~”´áµ³Ì}–í 'hˆxÎú£žóÞ Þ$Å·„7¥b€›JÌ4V“&ÅÑ`8,µ÷Xi?hsg¦ð„Äæv¸Á Ö°;êæ¦pRºº ‰°Rˆ:k03‰ú%ÜÙÌàÌpLÙáÜÉ=ñb8ÿ…C??ƒÖ´3?¡¤ÄÂxÀ”ÕÞn“>ƒ›Äý’Ì?átzÀR`ØY:À7È2wëþîñÕ»hI Ñ 2ý„WLmÐ5Ö×lkߪ-aºÂ`O#Á­)4÷b¨+€DO'.¸²û×ã¿t$ `Êa6)ø"_VŒ)“šáfêIßK¢£‹¸c ry(ÎéÄ'Ùn"Ô9í ž®…ö¿–)“xlà?8‚¾ˆ7îì‚ìü‚ÀôñBTmO!_v‘® ¸þå¯=¹,’"ê* )r_๸/Ç2¼—¡w°}(E_:Wäâ"ÀÔ#+’f!ާ¸¯äçN Ò‹¹â^4™ ©•ƃÝewÞìúŽÀ–îŠ/6¥à¦PFôϽ§"¼•îAóÑTr­¥yÃãÀ(wh„«!Qó=ºÆý)†a8gNŽ ßìŽv†€·SÌP´Ï_JáÈ÷ñ¾Š›ß Ó¦‚ÿ7÷Ù*F°ñâ×Q¸FG¡úVÝeÃMg¨XbRÞ$àì,¹ê÷Føñ%)T'‚¸‹©ä½¡Ñ‰Èç(00NMÓÊrâ>§õ‡ÆàÒÞ åhEO5ï¯v°Hgº“Õ¡º.;¸ÀBa¾b5lCTC剽¥ÊkãÓ —‹ GÔ^Ÿ^÷A‡Õïâ‰S–`iDÀï“ßSèÜ¡3£çÆ&Bçl'ÓÆæ9cc¸gfx <®äeàänn3-Œ+úüñ¦vÇpú±B⊻[öØ­RÞ5¾ …šg<•.ÈÅtTDÏô,šŸÇäÏîÌŸ“šš“Šççó{.º¿ðoëÞÖˆ endstream endobj 208 0 obj <> stream xÚuSkLWžá13tpÐÙ;vl 5˜Üìå½~`P' ¸¶£ÔcõZ›-ÌÒÝè·Ñ” œž¦–†žä÷PîZ´eÚ\ÊÒs”*GEƒi¼e¥œ—%oµòÔi›ŒŽ 0âj´C…(Ô(¹?:a*"er‰]”^P ÒáS ífï£,é-U÷´ÐÌ×W ‹¹ :–ÚrJŠ+õZØÅ¼ŽæÔÞT_ƒŸz‚߸ÍK‹¹K?ÌEн×Ñî鿨û0²ª¤ñƒÊi§¹¸T}ˆú@cOÛ÷eÙwÎ< <Òiî`Pžœ£J¡ßß¹'wÏ'½WÕðË£¾­~áø] îÐrù²’bÄÄA”‹»S:̽!hvrPÊWéiø0ìÁNG-'ß¡ëLŽj5;YõÂ`ô4;Ž<"Õõ|=0¦ZWíƒç:O\¿4îmkiõ´ r_r]Íl^ÎÃI´ ¬¼ ˜ªZw€ƒf¡št7¯ ãÝî Ú>¾ Qöèé6ð)tœ Ø>×®*Ì+Ê+Ìkl8zÄnãQ_òñ.œÂ^ŸI¢g¢ƒhñD†!ûxVéïijROµÞ%±¶i±ì¢ºÖÝÁ¡´WΡÍÕ3l[˜}¿~šýT%¾þ¡˜;Û6&a½T{¸ŸDwÀQÇÉ*y/RÑÓ컄Ân ‹\31×~AJ ‘( µ¢¤HtB*Píhø¬©øàÆâÒLX;ÛEíÕí?Wýˆ‡æ‡ÒÐ9aBÖpòKr— w3â8y2äDËÉòA=lƒB¦Œ†"燆}FƒÎ\ZÐvVöUô ÃMg i¶\΢Ã([/&††‡n˜Æ#µÊÙÑ£{Ås¾ Œò{íVNž¤ë¬N«º‘2B%oT¬0.Ò 7RV«ë8‡&i¿×ãWû(vâ:\0yäxf”²¢ìèé•Êš*”&JŒH>ÀïíETäô •‘µ|2¯;tmä®ëÃI è³p‘ï+?¿_È÷âz5¨ÀfÞ¯VÖàÝ [/´Þ3u'i0ÛV'#gR—Ýݦ]înœãŸuÞ§ævAD¹½(=”8Ž÷R„™@ëY ë j¿~‰òUés• XD ­4Ê{ÿ©žŽÀ™PÿP¯èñº½øå!ùmªFQcŤis=FüsÞ’^`­Ç³Ré7äÕv™Xƒ˜}cZqFe‚j¾˜M«] yú¯´özÏ@/0#”¿ÍYË%Ø|ÒÖ6T$ôù)y——VÇFú2ãcZâc…ø¸?c¿ŠSg¼»`*é_‚çën endstream endobj 210 0 obj <> stream xÚ½X tSÕº>§¥ÙG@À†HÑë98 8€ÌÊŒˆb™gAÆ蔎I:7Íœüiæ¹¥M:7´”±”‹‚ E.õ^gÜÁÃÓ·Sî¤×ëZo½•®d¯æœoÿç¾ïÛ¡©=(š¦ûM™?=~ÞÌ¡ ^œ?kø°aÃÂÿO…&D…&F‡ôàçñþSÌÖŸ&Ä<@QQ…÷„ßô%ïô·ýÈ;õycm±Ô#QMõ¤„ÔŸ¨G©§©1Ôdêej>µœJ Ò()UBé(+å£j¨fju:F¥.QS_Rשÿ¡t_:Ž~B?EO¥ç­YŸ”D‚>®{ñìðÈbT÷bôÅèÈbLd16²ˆÜ>fXdñld1"²YDÇDÇDÇDÇDÇFÇFAAAAAAAAAAÁ7fØÓ#¦¥§eHr³ÍJOHÌšŸž¶Fü/ÿ$Å>5œKO¡¦Q3Ha^¡gSs©¤<¯QÔ¤WòôÏ4EÝMõ¡úR±Ô@ê>ê!êê jõ$õõ 5œI§&ÒZZGëi ´‘.£M´™¶ÐVÚFÛií¤]´›öÐ^ÚG—Óô&º’®¢ýt€®¦kèZºŽ®§¨á^‰¢“ÞpS£¢¦E]Îé1¤GQ̼˜6ÁpÁQT‚*Ѧè®Y=™ž›{-èuµ÷ÞîŽïój_ÔW×ï•~½GûDlµð~aIÿ^ýuý¿yîM0jÀ¾¸ q§æÜs_Êýýïoîó -ÚÕÁO’âC²Øð]R¿ð,žQ)*ÓÕ †)óV-×ëôZÐ1Z‹ÚÂz¡~›'P³Ó³ö2íÅo.a…WÒ$9iIu¹õœÊ-ÓÏ~“va½h.®|ÝÞ! ½.óËb…‡ñ€¢,,²˜¬*q°¾Ád…þ:YC +<¬A ¹å‡+ÇŒM7ûÉhœq!úÓз¢TÔû,ÛýÌ­J”¨N`ó!ßXL*¾Ddm(fÝFë6.t9t69[ù¹rå*ñ"åÒ¢´áfßÚØ]û%í¸¶Mr@xÏÆŸŠôhjæ “a#GÖ'~ˆÿ˜/±à4îÉÁÅÄŽ)»KìrG±•^<¶íØx—ùhÌñ§ž}zÖ &w,}k#ó¿T$¼ fƒÌÐy £c‹¹Ìb¶€šr6oÏþv9LgÆL^ö<; &î‘B¡":}±µƒ=ÇÝ“@kÔæ­\µZL’­Õ€2ýEŽ%ͯ4ªŽÞ‰o „­‹Ýuõ•Ïq§¯BQ¸SdÀ(ÃàÓÓ““rVA¬³ç40õµÞ¦Úüêt.¤ºlF&K=ƒ§\¯áa¸¯ç_dGÀø™âçáuE¦.2žú /À½Ø£pd»ïMÆ€…¢ HûBêБÀ<¬Äqç88m¾|j›Ï^a®æº“h×ç—¨¯;ƒxY0ôšŒÞ¼Y”ŠSƒ(Öúô[Àiq˜®fg³g³Én/0X&pƒQnVøã㜙›AÊh‘";Á FŠ‚bAd—•¸ånm…Ú·^Ї,ƃóewÖzÔÖ"Vª–-à'Ì⟟ϗΉSç©óŠŠr²7ªSȯá\î/áþR ð\¯£Òàͧ‚tǵèÐG7)Q‰Sî)q®iY\¹~!ÿ,?Ž_Î/ÄOò“ð«¾pkÌ-¤¤Æ¥³)Ø\°$heÒdžãix^n^qxþÛùWá œ± ßùÞGÇ>Ü.ó==;)òdmMôc5Y히Àj°ÙRW¶› ò­©ÈåÆr`ömÖ­ä2”åPÂŒž0ž}Fv¬¾œü–²ÎÂ×U×.Ÿik}£úà(¸0¬ž§­2õ†`\fÛ¿FSà)öxV_õ.&‰XÂæ§ós¸Bdããñ~,^ çáŒïÉp &Å|LF2º‰ÆºÝxs²(’×Hjº%¨YÏÝjA‰)êd\h, Ïå‘ *†"C10SÂsÙ‚¶¶XZXrÁ LCô].Œ vA6wCzŒäëÖFÍ:îV%&«“Øâ®‡%ûÂ…aÈd±u;‡ŸGà«ô¹å¾òòrŸÛåu9=ŒQàËÚ”]žÝöJ{ü®—m¥Žc1c@9éª\VžŠA²AæÌso*)_s"nî'ó>žý±Á¤3‰1"°Ø]ã?{*îàþƒíïSä7¦ 6Õ+39ÈË+(–Ëåq2£í°ÃF=3’ÁçPûã1Öf˸xíïiúýg mB Ø“%P>WÌ3<’ˆ•b ³0E ++´@=Úv´ZšY8 `»6é¹›QáMBãº÷ñÞî¦z]!w«MŸ§Yɦââ Z=Ûzš‡Ñ v&¤@åy‰G†ûò3poþåð§­ÔV@ é4Ù\è8:}ÌÒFš®˜î1ÍËÜ­)ˆÿ9T—W¦Æu;Mx{>Ùd”Åâ®â}ׄ_µü7ÅKBk2ÊvqXãÑ6Üë(`7ê|ÌÉ/‹Œ…À¿’Ì Ì3üßD8ˆ ¾ÂTYÆ\·õÛWÔˆMë`lÐ%JÒ’VÏStq{ÔÐ5ða tÇI|öd4fö‹N¼º_z‘pA¯ ?~ÏÁ+.>ß<»v’~ñæuµ9m°›y÷ôÁsì7pv|ùã¦B]Æ&2F‡ƒÃiȦ·)IËÓ•Åj…ªT[ºvçŠÆ—€üè ^ÈÁÙñµÔ¯©Rû5GŠÕL³š  ™¼tÚöqrX†‘Áa ÅblÈ©±(KõJËg U™ÊÎúÀÕ`÷X6§ÙÉt‹oYà§¹ú‡ÓÑ?ÜTŠ~.ÄCc~šûaýÓ×7NGÈ×’ž;F‚‡þTH¾ŽzcpcS©íÇ;‚ájpà£_MýNØÖúûõ8ƒ„?TOýˆãàA_ò1çžãÊpËûg'à ‰_‰/Ú÷8)Ë®î²<È.Â3_ž2öÙWf<Ê@‘HïD4ßZÇá#=p‚&¯%PÆ`¡à(ì–6Ìe„m¶<‹”Œ˜0g4ÈAŽàöüó“¥xqKèÒÊ›k±ñj4ž~'t†-šD.?1—_Ê÷àJOÉÎ'E—ÒùܘZý ó;;›[÷šÚ õœw”5£É¦$KS+HǹÄ aà†K+V£¬LÈ‹¶5[ÃTä6¸ÂTÄ/úFDL‰!°àG¥œ!O Êáý?^ŽžÄ”£—m?‹º4î– ÂX ¥ 2W¸×þ8‰û'|<{ ˆþzê·ÂPè.|Sä±úL^˱ºSûàC&îþ³óaaÉkõzŽxƒ RÉ€Q*Ž),Z[ú¦²òÚkWö~ÌåSŸãàå×fÍÌ•¨%†`– ¥§CF¥Ã`æ#ðúg—&?óäø©OæQ;îçÐYKJ´š–T/عñàês%§ÈTôÄOœÀsð5ßïô ¶nƒQlÅÉþzͼ›ÃÈoóU³'§á°ÆÊßG†HŽGÅÜ&Y~”ŽÉ$‹ÍmÞ‹Úê˲ľu(;_—Ïò+j£Ú6°W”;ÜûÞqiú\ÄC¸˜zKu½*¨v•fsü[ˆX4M÷—Öâ4?ž ®D3X(Â;.‹Íucæç„GúŽài¾Ï÷ɺêÒzu-0&ÁE8ÙVÑh"¶ÏÄØ´Ñu²Zžµj¹x ¬‡Fýº=º·á(cô‹.îüò}Ö"øZaxØ9'LgSœt;Ï¡ØÓÑÛÂiA'áÔÜCk½%Þâr…F¡T¨•^‹KXš¸xÕ ‰D¦J#L†—PÌZÁÇéµ9¶Þ½oÛa2Lþœ½yÄ•?R4ESI²R”–aÞÅ}ƒ ÂmvÚ›j⬛Ùb%o[¼{ùÖÅ6…³Š™|â†Ù.ܥݴ~OÆ–Œ–Œ-öÄ©íJ‡ÆñÖ–‹ß| L€^‚[@Má2‡Ô ‡¶ÏÙ¹h¯Ò§²—úÀ ³Õcfº´ëv 6úñ‹X|þÝé—…ßá*¬íò~ZIûÿ„c› iÚ´bµN¥VÊ!·ž¸;¥Žp hŒZÐ2“( ‡ž)ø ¬Úìª}ý¨çu`uJ_žŸ²˜["P©tJÎXJÜ !sð¯'álž}43fZV<;f”¼­v9ªePjЫ@É ù&ãâG8¶æ Æmžíîv‘Á ¿5%Ò@§š¶rÄ)Ø,¶íûãØ{¦ãûQRQé+]—ä ô óNïCmu¦C$kRÉ&ÔÔ­ç …J£Jx5nIüŠ ç0ØZ¼Î“l8[wØÝœŒ¹Øk«¿ÅC;…_ü?‚©+¢4õ4Ý,{ŒðB•Ûã. 0›sübiVÆ´o °oÂå*óIÆ‚³ý™i²¬,r|ùUÊÊ!±2u¿÷?¶põžÚÚ*g¾¯À]мæí— …)*TH»ÛÖ˜Õ¸±ïŸ‰ÓX°€­¥Úç:¸ãDDZîÆuk­"½ÅòBe¸q%²¬¼ì¼äÌ”ŒäìkÜîüÔ)ÂáÅâåµxx§°÷ @ÁíZ&éÆN.]^9e €44”DC5`þ„°½év0„F9¾Å'å­"·ÇкDß Îˆ÷›ŠmÅÖâ{øòw&Qš”¹Èø»ŒfÙÑôNÜÖO·]Ý~ÕêµyÍ^#ÿeܺdC«Û%Xüïq/’€¶X_šS*QäLæ§Ç•d(Ò‹2Wcz¦VbZå3ø²àNqñj?õ{3’Ä™æØvâµ0‹x–P³QIFoU ¬ø­æ$Ò@¸…ïÉ'àž¨Ùí<Õ•«ˆìWd± †5¿—„ŠøØâçžaø˜«|ˆ{÷5Že…q¯á˜á’Ji‰h‰£ëË»ˆŠ /þ1ÿo9!ò(GPÝÝÀ– ¶ÂÖ2b–j«4I m”©æýf#„EuQ? ®¥‰Uð^‰û„ÔJÔÔ¨#¦=mÈÔŠÙœT, f Ҳͭ¤¦T¯="kƒ¸ß77ðݸ÷Ó×ù»¸…°<{ÃZæm„+x­H35á¡a F-X 5Ù­J—Ú ^'.Ì@¬5søÌ7¿ÛÂx ¨ÿQ4›ñSYµ±Í^Brɇˆ2õÒHg2*së›Ê ¬•ž]3$¶ÏÐA|?>æ^€EÜ)x»µ¾³ÌjqÁ³iºÄS‘¨*ÎNX›½Ò0’Լ˸‘°ޫĽq”“±“Tm—7fEL“?4€8‹äÎèV’9?Šø{ãVÓªÚÊÀfK0•‚šMú ­\¯^Ï–@qø!ÁmDN5៓¬í>ˆüP±‹­œ€-2 ßëï¦oý ~u ôI€® WÓ‹Ž‚iCãÌÆ—êf4¼Ôñnîl9_wìîßÛEmÕºHj”ÕWI³8(Õ+´ ñÔ´))ÓtÄèDèTÕr¿"qJ|*ó´Î®µƒƒpª¹¶*¡K=»ŽF‘ÆÀVÝò.=ƒK?ŒÆMáóQj©×.ä ü ió_" äïü ß›¿û›‡p,·š6Õ51ü‘¹[—fXͪSqv¸‰²Ì[ïLç¨.­)oñe}¿¿†ûâ˜a8†ïÏ%šBi²¿‡Ko©DªçW z˜µËÚˆGdß}°¡˜ïÛøØI\wÿÜÚn¹Ðûm¸ß÷ìØ»Áºá½¶d]û¬º¡xŸ¹þÛUξ UãëSU–zež|†?ݟѲ2άµ+ÃJ¥N»lÞ<>úñpgL^YÎßWá)÷”»}žr»Óá°ºY•éU™Õâ8¢J(|bø äŽ59ZùuY›7´'‘—§/Ó› &°Ú¬&óæíqm{N\ —êE ªÔ» !Ò’ÄEi‘D ZÐYu&Y}\NãÆVR—Š€ÓgdîLí+ÜÅa'üëq©ëW2‚×åñÿÑõFH01LI2m&›)H‡tc:0‚t¥;|¾Žä;”<ÞO“¾v'vST%4Ýn&‚\Èuæû×ï+Ú¡g¼‚}pĸ³†!¤OšB*fMŠá7ɸ5Ô…Éøn”9DµlYÉþ­,9¿yÁMÄ®ÕT~¡+‚èG—Ú­øxQøï×uÿ¦ŠlADaWבG­F õDxù#(KUœÁ ’a£>˜™¥…ÃÇЖ*ÛÑ?paw<¯ËŽ)t‚75·Ï!©¿]‘ÿû0ÿGßÑRe‡—#HDæÏw»̅û^`ù¸§ µÂv<ìÔÒî%ÍBÜ8¹|Z+S‡5FÈE©¦¶pž·û­GÈu·*ÈÑñªàèñÄxN‡`ÅÊu«•…úBÂhÌbÔà/ç"'Ö è‡3á÷w ÿhYZ[Ô½&ûCç]z.ÃS±QD4ÿ6VW*×Uü€„­|óü=ø|¦?# ×³ñ÷³ä„?z¤ôa½J§Wó×yøõ€î’Ž~<5@Ÿý§ŽÆ9X,JX–°pÕªœ±$)Ì/+¥äÜfôrà*¯rº«ƒäÕTUg'ÆÓ Ì[|Á?Zö¿Z"ÉVt=ù‡­MÌšh½ÂA‹»n»·ÁÑÀì4AV*×GMÝ„ÅFO€_ˆííšÔû.[ïžÆÞ½¾íy ;â¹Géÿ¿¥±f¿ endstream endobj 212 0 obj <> stream xÚcd`aa`ddäuõór rÓvö Ž4 ضÿóa5ü¹Œõ‡ ÃYÆrL?䙈³È=ôbùÏÃ$ËÀÀÈ $~óƒÈ¯ R$üYˆh¢HcÛÔÄâ’Ô¢ÌâìÜÄ’ c=#çü‚Ê¢ÌôŒdMCKKs#KÇ\ ÒäÄ<_ âT  'G!8?93µ¤RAÃ&£¤¤ÀJ_¿¼¼\/1·X/¿(ÝNSG¡<³$C!(µ8µ¨,5EÁ-?¯DÁ/17Uì=0霟[P t‡‚o~JjQÐ…L Ì@×.clg`fddÑzû£ƒïWØ÷’ýŒßÆ0ÿÜð½Dtö’î¥K‹º«åÿr±Uu.éž-Ï÷Shí‚Ró¤~W]ZÙÛ=©›cÎìYóå»ç×LlîX± |Þǭ˧Îyæäµ gLY³`úäÓ»jÛ3ºêµ$ªf×Í™;kƹ§]º¦µoìšÁÁW¼ø§ý¶ßŠÓÙ帘§©þçáœÄÃÕÃýŸk?÷þ<<@Ìûý¡ÞΞ endstream endobj 214 0 obj <> stream xÚÍzy|SUÞwnKï½ ‚6F‹Ë½**"¢(‹ ²CÙwhiéÞ´i›¤[ö­ùeoÚt_Ó¦ ]i)e-È&ÛUfPE™Q‘æòŽïIÛ0èðúÌóþó<Ÿ„p?é9¿ó;¿õû='oÐ A¬X¼téŠ%//Ÿ³lÑø)ãÇû¿{÷„ç[ä ö=1ˆ[Ãýéé+ÿ˜ò ìyÔÿ4õ>‚?ycðÇ„ ¡¼IA<‚÷ïiÞ8Þ$Þ;¼y¼e¼õ¼(^OÌ“ó <;¯„WËkâíäàçã}»Æû–w‹÷’N„Ïcˆ ÄÛÄlb1±šØBÄ""›Ðf¢¨$ˆvbq˜8M\ ®ß%~ ‘;nk¦(&#.11:I˜ž½-ýW_ˆâbbû¾‰Ø÷Úøñ¯M )°ú¤À¢“‹N ,:) pR@ऀÀI“'Nlgr@òä€äÉÉ“’'$OHž<9 yJ@ò”€ä)S§N œ2iü¸ ï “R2Ò£EÏ.FE‹’Ÿ]&LŠHþÍ—<ñÄã¼gx/cƒÆ‡LâM!fãøÛÈ‹àEóbxq¼ÄA¢ äqâ$ý1ï3ÞÕŽ~=/™7˜7„÷0oo8ïQ^(Ï{Œ'à=Î ã=É{Š7š÷6o:ooo.o>oo1o o)/œ·œ·‚·’0y„‘„cÔBX a'D>á$ p̺ˆ"¢˜(!J‰2¢œ¨À1\ET5D-á&êˆzƒcº‘ðÛ‰&¢™h!Z‰6ã;ˆ¢“ØIt»ˆnb7±‡·ÜŸVAX©³Ä$,à&q7hlбàÐàâAïê‘„üLÖ“w)ÕJý‘N¦¿ü÷!s†(šþС“†}xìÃ7†ÍþÜð»ä=:åÑk¡oóƒùG fî<~ä‰9O\ [öáˆÈ>ÙôTÚÓü§Ï=³å™.fÓË~ÿlísÓžæùG.ùÏ?À¨A£ä£mýÍ Ê“^šñÒ¹1[Æüðrûعc;_7îÚ°_‚§îù9ÜD1Ú.ÝépSÃ~ z듉VRìéEwèí^ßËßwÛ÷®àíÄO¹+dLr^<“Còs)þ¾-!ŸáÇó†þ>o:%Lµ´°è Šç®P¿w¾ÜÇ}ãDTŠÈÚÂÞD)Œ2½h©™]cɲfš³Lt9’¼ŠÄ¢v.HÀ%Ý&?Þsþg¦*õÕ†\¥J™ ªÒ™sLZð¿äF9(èa¿V×_¸Lñ?r%Ä'ƒÑÅ;*A®.S*—srÃVrÓ€{¸…'¸p4†jÓÛõv í6›WJ•²ã¡á h   €¦¶£Ùh8n·äC>m×Ù4L!Ïøëuüdði¼Ž./OzPÔJ*Ä kö/õp“£¹9Ü0n˜V«Ð€šÖÚµÆDºÌ•UÅEè4ø0šèm@ – uÜX4XgÑÚ´xÀJÏ$–r3Äè$ôKôÈÍ¿Šæ— `®tÁÚµz½ožÖ8t6¦ j[]uÅû`Ý¥<µ4I’,JªIkdøçJ¡ØVXHC‹N…‹Pý ª_tµñ$Ä—ˆŒžD<È Î!Z)Üîö–·Ö‹ëãäÁ¯Jq8%£îNhQÚñ*þ‚ßtw^p³·ro÷:Œ±sÔ¹wZ¶Lï¯àìa梁³Ö —æ_DˆGë¹ ¿[:£hŽºû²À˜Nȇ“pÊvÒÒnÝY½­jj«ÞŸCÓ[Ž9¶u¦µ°–~‡Ž§â‚¦ÅÈ4Ù†XGåªw›»u»43yï ÇÞ\ ¾áû› ‘Ú-ÎýeôÝjctÞr&.}á%emÌzU’µ›õ¡\z»ŒÉy–\µ1y…jd]öð~Bñ7‚¿ö5 JŸí:ôßšÇLg•X8gþìKV, W«õZÑ Ÿò Ù!BRaÚ­UU ZD&…Ædˆ†(S4œ8~òÈé#'=eý’vR(ôÙ^nÐK¯L_“î­¯©i¨“ÖÅ3þÒŒ-öø’ÐÒÔºÐ.D¼õš}cæüNDú. vôÔô}xwÜT¦ÎX,Ý&_Y i ±éFº‡ä÷~½sþ¨9Âq¯²‹a~]ÜA XŒV ›ªê=ÞôšÄ¨ì$áshÈšë·ù¹ˆóš²ò%N‰ÙUPm+-¤ù§{š[>€3XYåÕQSžúâÆ×âk¤žúšj'£FÈâÐ0îÍ‹žôúÄ’PôÁ¥™ø?4 ·¨n<™÷>“ˆš¼”¼/Oé¸$Ûöë½£|ØÎ\&¢f¦ÅÎàBfqä4nP®8L¯Ö᤭?½éí^ÿr—¤îYf„=qÅ+©’„ø~“)¯ó¿ÿ ØŒV£ hOUeC¤6%%Mœ8æò·ÑпE¼™(˜Îò¿]ë3ãâh´–ª×ºµž<ºˆ<gw´Ùívœîf*Ï®·êpiQj5y Ù«Õ‘°¶D”ÒüŸtfGp©½Î¨¥¹^JeV¸˜"À–³54í,ße¢ÍäßíÜ3 YX ˜5?FªëÄ0Öt Ï Ø Ä¾+—¶ã#øú)‚x.:ÄCÚ,»ËJl6§Ña¢=d-¸Íµ@£%dZ²8Qœ4–{l:7¸tByFc%;¦:ðÐí ž Nþ¥å`çþÖõ­av§Ó¥´‹“Q2È2fÂ&XmÍk¸[BôÚçµ¾çqt}ƒôßð÷ùFg&Þ0Œ^<'-%A¼Í@«Éˆp¤5Òv²®¼ÊÍòsÜÒª¡T’ðÎ'I§ÐŒ¯P8Ëžƒ¦qØ›e“Z¤þÔ~éîQ¸ qE}DG;Écp ³ü‡ž€Ê¤­¡t³…/¾‚Gó´èñË,œqœ?Ù^š_n+ú‡rN°œÅ™`=¨T¾™~oãZÅ?‡žôÍ «”ª”¦w-.tmuO®w†¾‰4÷§A¿_ÏöN\„ƒöxòz ôìu´ÙÜ~gš qµÝkˆdïÖSQñÚxF2“èDßUª â,W,R½±iãúw‹ñ*¡dF´²¨ö[ª: åÉÅbS2¤Ò**ª(Xž»i±Nš'l™Ù(l®2U3è oŸZ§•ÆX£lÑØÓB”2PîÍîÌw?÷ÿ|G-øgïžøùWÝÔ¯þ|»7¸ÿYtõŸó'ŠÐøä ¤†Ò-ê@åè‘;´ó Š¾ð‘‡¿ ó… êÝ­Ð ^ieR…Д t&5E5欎¥FA$ýÖ÷Â3Ì Øímèɬݶèãõ>`»…k)¡6:1>oV|5u뵞×K}›á·¤”Š[·©´j ^\œn£Q ÷‚àEêýuKç0jrƒ-¦ºé¿"r÷_¬þ‰GN(=(¶Msž/‘þ\0¢P–í#]6{!ztúŸŸã†Åÿ¸áß=‹ža{á£ý•çL“¬´CgW3™`LRæ¦E¬K^´†\mÞØ’±GÚ‘× ]´©V`:ã¹øQM¾9ß”ôÛ_ŸÊö[…‹¨ÇÝï’)=…’ІÃiŸ ÷/6æ¯@<´J`¤$E!¾x[CæFé&!¬¢G£×R>ºŠžkü å©ÍŒ'㬰.²{œŒ™,6)ŠõÚJC%П^;ü% -²a m¢šjê‹ÚA­Õª1.É*Î-­*(+nJ.KÅFIÔ'*EbƒA¯ÃEĈOFIŽ—…4_l=eÂòñ,l+‹lL§ù?+Ò¹ƒ:ØÓ°‡)€BcÐp:Ýм‹sè n´,…Y/×)ÏûEBw…ÔEçÿ|³ú½e©Ë0"dUeWÜ÷@.á^* ýôÖ{½üsÖ%–RÛݺM,×HmM1®ÅÕ:É›M¥¤Z¶³¾‡¨p$ð¯¦êÅbœJɵR8È:kU.; iµIÌ=™/ãbÒÜzçA¢‹jmÈ[ËÞ5Q 1ùOD²q £MD^}®™}¾j¾áEƒÎ¾Åøßü®–~µ½† ,×@E¦×0|1’-½–ôš'LYÛX´‘²÷îýè  O9æã‘ò{ Ó?¶ë?‹¤x´WJ%'[p*‹)h46æÔ§îY]¸–À‚­âØSªsóë–À|X“¶Ðx3ì> |OûmøT=«ÓôkuæR»¯ýõPéÚEÌ}ºøvö”’÷©ÓS/Ú³ÚµÁÂÈŒðþõýùîñ½äGd_ æk~Dæ[!àhù˯÷ý‡‹ÜÃh Œ‚n ÇŒÂ‡sOõ¡0} å ]ÿâ§n„hæì[è|Û,ÿk•!<&B„±B4Ì‚5È.‹À•WD÷oœ[†wޏ}#=¡·/ Ê/ùûý;¯ =†­ì]™˜~ôß¿¡>Ïã Í šc:0F¤ÑC(è;$@ä4ˆ{Œ]ëÒ¶EÑ')TÃiú·7>ûЫçØÅ¢É]PDþh÷Ñ¿tsƒ§3¸9kp÷Åág¿‘pÃíÓó{ùmrA V¤Ó4ËGÆ ­í,z›rœ«øùœ†T®F›9¸›dպ˫j;#«b™Å°nMîršßf¼í¯Í‹V*ݾW«C› lðÿÆ×Í‚í ò. ?»¼ó;¶ÒÞܵ¶BäZSmùó\p”>úqqsvo³¿G«MJÃÿÁ«ÉA£‡)‡Á©br@!’ûñ„Ƭ±k-â‚TkÐ|>Š…ÑhpÖG¹»Ô{S­ëèw—ˆW1Jr–uëYç …Pš´Â V±œ€êó§ŽVš•… ÆÔ.»Ýf³;ðŽÂR(ös‹¼h‘$ôç Bzªžÿ'4ÖwW0+Žò"#¢ø{®qe$$š“JSj#ögãà$ÿ\TtŽÑmB rM~ mVÎXºR~rƒjÐ(/7 - Œ¸CÏÂàŸ¸5çjÓ“¥™ákÂW/Ø¢Ók1Ž¢ ”EÑ*®È=½þØÊ#ˬz›Áæç^V?÷J¯QGì߸o}—Á¢¶m¸€‚£¡º¸¸³sÇÎÖ]%åa+†evÚ®ý C¼HA®&;-77)1>)>%>%LoÐë± ”YY—U¤Øyy\ ^Äá'xÙeš‚äÉ­ ­ØYólãA~E©³ ¡ÉÓênµ9òý<ÏD9´Ví¿˜Þ}[‡7¦ÍËÃè²®¬KöÆ7Å4'›ó¬0€Z(‘É6lÚºnË:½Ó2?ÓÓ9˜"s·´ôð¡“OuÙ­8ü{+*òçíYp(ühfy˜Þª·ja`EŽˆèû©¤¼8סlˆjܶ=›KoÖÑy¨¥Ù*er|Jœ(F§Q«*¼[Ý`Çí¨Ð\Yï*êìÞÛÞÝf±X­`£-”¾0µ,·pÃŽ­»¶té­³/”׿µà ÜŒÖy}$DóvÌ™Nàäë!“·µ±Pd+²¹ÊöŸ¬Àyª"ËÁµ¼ Å™RR:i¤à.QïRf–»dE¸–¾‹VÎEkÞC+ÕUaúB½3}š6{17}1÷Î"nZæš0ñÂHÉ ,q3Ê !èÂ]ÂÉôçCošqA¹ÕŒ*½¡häçè/?ò÷uú{ …óÞTts£6нÛHm‰1F3ÂDô)ÉÏ©€Jc%Ü„ÛMhÅev ;àž=É aÖú¼õZ™1×(3Ð(ÂØ«’AƒÉ8il‹lÛj]ìX3€½¸pÌ?j>Ÿ{×UM2©1NUÓü}cfÎ{ÉÅÑ/úMR,µzØ}½èt-jï×¶÷ÛÙ7ù·~O_ßpò ìµïuiØuNÃíg/Âp×Z†»¿ï˜ûÈ^è…Ó«zV¸×Õ¬6c2ÊånÐÓd ”špóoýíÄ̉cÞZ6–å'S…õ,ê„€ª+,¬cÐã$ßwî³DŽ÷Ú˧²2›ä}ÔLõ¬ ÷f¢âb|û;öüÈKæ`¦€ rÄ6{'ëk§<¥v ùBHÌá5 ¯:­ Ö„{X5˜¥ Ü;b´ªÙ÷K#vÔ¢ÂëÁhaß E+4h£Y)&ïp.˜{>)&9w5Ð9¤“b¶“ØÒ»«­É³Û¼hßòœU»§¹b-Ûl1}ëHs1cϱ ¶6Ö×HuµšÚ—äVþZ`ˆYØL?‘)Ÿ5U–”\C—£Q.4ÊÒbj…º€ªË/è`ЛdMµ!½[Ha¢îýÝ#(íæM±]s£cÞPß–oß»ÉÿÁ÷º#0Q*¿|Èy‰.¤ÐÃÜS§¸`f9LÍŽÝ*­Hh“f€ü­¥”&E1S†fk©ûï×»¿OàüÛ$ZEMš1g2ó©RTŠBƒ“µ CY àÊ ÊòhþOå§çY§ÒZ ÆÏœóªšV’/`ÞäÉBOÓëåæ ÖÔ/ëL8qN~'Î4ázž…›ÜÐÞYþÚî÷öpPc‰¹þõï;y7šLÁ5^WG[)p9 >AÔ'ˆÄï OE}¹ÇYTè²›îæ„mÕoc’üs¢È„DK§ß;šìM –m,ÚËíIl§êÁ›gK¥õÈe2rGMóóxR*”¦d U2…\›kôå„u´XÛ˜F/yOãÿ$&÷ømdFœzñI6ܱ§bóíùö–í-mu6e¾Ò¡jZÖ¶ºmUÛêòÔ°|…+7)á6£(§—’à”éˆ*ö¤7‡_¿¼â3uÖ¥râ:üÁ®ƒ‡ìÝ»ûàÎsþ½Ä%Rµ21 Ù¹2…J©R*•*n17#L,ÉŠ%r…B.SÒ赫ÉÒÅÔ6âgÒs¸ñþí„z^ò Çu~zÿþDhóê¢XNZÍ=œÅQ²7S¹Qïhh-’ÒÌ:ÿ¡ŒíÕu–¿©1Ý(L'1:j~ç²s̰ýVÙ…²^çǶmgmgá,]Jݘð–Z«Ì4šEVÕ@{·ƒâO¿Ïvò~ÛÅ%ÙwÜŸ>XóæšQ^_ËgÁ]}êbu]@·l×E³~t…÷Ýj^¸v3¶¦ÜKm\–ÿGÜKMNpš|_Hœâ|ÉqnäÜè£Ü¨nŽ ³É¬â2 Md™ÉZm+:\@ / ùùU…ÕöjÓÝóa‘ ÚF†ë©ŸTãòE=8¶fRƒ2›K¿{RSª-Ó”ˆ¸µ=†ß«Ñc#”uêR5F¢ ð¢–þøú?‹)\c“qC¥èk®”ÚoØÂ¤þ~°7S»jõ˜:p_#9Õí5õ2^?‹aÇóÄwùÏ'ŽþàKÿ‘Ñ÷èU‚ Šé‰‹Þ_0;áUGs³Ð£ÜR”ŒV ÑtÎó&z‘{å ÍïN(ŒqÄá±Óâš&º;TPF¢Ñ3è¡#ž’íŽí@ç“èuÕÇÜ$àp•xHÈ=Í ž§‰îiËLÄd¡!†*ce^ý›$ûlØuµ?²ü`Ë[iia™¬Ì+ÑC2}·ŠŒ×Ç0ñ¿c"êÞ©J«ÂÞxþ::þcpÇï¯GnN³îd‘Í£¾·¡Ç ˆä:Ú[ÈýE€ÜT]«ž¹H~‰x:îeâô‘é)1›—¨Wöu¹¯Ÿœ)öÞyÅKùѧõû~ðýS Ü3¥m¾•VÜzn"7™[ÏfQEÜj4Ž‹–áJÊ¢'p¾Žfó)£CcÕ­ÒkT¬†RŽšÅ ÁžÓ:ÖŸ\{Zv.ÂM÷Í?ÿqWûñÚc€ð RÉ›eyRë%æ|'‹DNšòÁI‹äL¤,MKÐÌÔx'ãÓëÁG°%$\n}–ö?u67y˜1{ØNº=Fœ½ØÄ[µ189d¸EÑ ‰¾aÞydT6nÆÞJ\?›qüHS5Þ‘`7û{±¤¿cmjüÊí{Ë}¢‘8re}Ž2F®>Ë—bQ ôÎ6m$›K¥RL©†eš%9ëã—E çÀ˜ïž×³õÔº«ò‹zÿy¼ÓHGS›£´Qx™¦\š~í¥²ûÏ·ÄØw±íT¥ÞXg9î8U¶¯­§£î 4ç’Ï-Û±`×Ô™Vÿ¸ÊDSöL”‹ýáÁÅpƒwߢ–À×ÆÎˆ6Ù‡pùvì†ÌçwßøÞ¢P  H;7›¿hŽ·r ÷ð1ªìqtã !|Ÿþ컈Π¸gŸç¦r“˜çaä‡YhP^‘µ4h¥ûRK9¹gÐÓ3Ñpìî…è]ô2ŠF3¸ÇÑNÊ®€59›’sUrE®RVy@uÆ-]Csq” ”%L*låµß~~ ëD£I·¸—¹©l^ö*E²‘–“iù¦;3bWF~Š3É– tä”l¡Öª±³N(Ê/0ç›1¥€OáÄÒ‹pöV¨¤ÿ÷ÒÜ$¡Þ†ä«þs…[¢«£,øu¤æB[ç©óßÀ•ò®‚Ž’¢0›L`¦]J“Š‘åeiru¯%2ÌX>}¹òyÍ›FŒ¢ACgPF+–àÈrp!ß¼„øØ¤!ˆ¾Š4l ággÃûñ[–bö¤6¨hþwpÏ º¨ÿæÁ„ÿ"Â6Ô¢ñnÿ©ÄªË‹?çßòˆª©F·>’庨ˆ4Ã*F„ ¨3(´ b”úä«-[ýŒï«5Óh: ]Ûܱå[˶˜"€žÆEn“ü[ÇöF.eÕ”véÊxÌ`Þ%Åm4ÒhÞ Ìä¡ÜZ\e¡?Ä(|ß1iø¬‘ÚLˆ›»¬Õz16'&Ýü¶†hÂOÁÔ»ÍBò^u"›dÝÅ¢}T•£¤†ù#Ù^cmVkšmÄâlW É!Ç/ÏŠÑD·ï767  ‚ß/»‚jh0İ õß²ÑBJÇ Nãærã ‹[æ!m»áX“·¾v‡¹›_B~G ³Bs²%‹ÏBKBÒÈx¡¿ï¤vÖZ2nŠ{w¸ #KŸÅp[HÚì`!¿¬$¿ðÄ5;z.Óµ…µÌ7dM"åŽP€Ù>^úê´·ïDqÀâ¾§zùm¾wÔ 8½¢gk©¼4§\™.gfD¬Ý¶|ãÆŒ ±:7Þ>Ä>]MÊ$¶RÌ KìÎöž=»[{0šiHCÅkä³\Ö¥â¿Òns‹©äkûî \xJëê=ÛWÛU…9 £³%:™Z'º©°ìÇy—2«¥UÙ5§[?ùö  ÝÜÛ"ª@gÕãtÉÍÍÖjUª°å›Ã#—o¦‘Àß“à w6Ã.ì’Ù†)ä,Kˆ¨†òÔé·²Ü(*¾:ÙX#ªH)O«Rç‡ií¹¥P ùVkvSs !ýÁˆU‹fº’PôÙåw?çß@ÍH-è®ü¼ÎÐßs£\ó™ˆ3$åjòÔ­’¨@êÆ=@aT«Ø‰¨Mª‚<ÚŒ) TÙ]˜Â¸÷*îzÿÙ,V‡'nÐÓóHÊOyòœ¬SóÕ±t/Îx_8]sËrNè‹lÕ¸L+ü-’ŠªÅí±=êýp PhI †O'·„;N`½uÅ^àw{”ERì’î¾sÆj))L²´°&§3ßnï:¸ûஃUîʺêZš³Q‰ ù¼_Î “DV »ž“â,ò4bY£J¥Öj·¬Ú¸jó*±H’š‘F#å-taîýN¢_³=-±ˆP¯ëê‰EóèÿD½ûFÿª‡x_ ŒTª.Õ˜)jJµ•:‹‹¡†æ·Ô§»…‰’Ñ»Ë9Œ[É¥JëiÚB5ˆªS„i) H ¥šßXþçÞß+^ÿÙЯjN½º×ÃÐþzÈïFÃýúÖP } Fu°X¿P½X½(ç…ù 2Léš’šŠêÜJaº$;eõŽä]ìOàBãí¬ûÍ=æýPi)­µÐߑåz(¾´¿sPvŒ?"šåšÜ±ïE¬F×|†ßÝ4 …[Íré(LrÓKb¥[pZ䦶ÄUeMhWA\eTiìˆÚ_oŸ@ó¥V•U‰1µ™,7W~Xäm¿¾ãzÇW¶"G‘µÈÄ]ãwG ë°2ç°2cþ=J¨€luN´˜éñÓɲøáÆÛënoFó !(„©‡½[á0ØuÃ=ÜÖ‡f„‚ÛðþÜdÌ’L­–žªÚŠê&›èrÒ]fˆg¹=Ô†HÃF,BÝîX22ÞÖÍ¢=”ÛQØÂ”“;a§ÒµÊ.2§šDÿLÌâÅÜ·=êËt‡ò«ªüþ-¦Z¡TYS³*Ì3·a®gnÓô0‹:_*È•I´2¹0Lº)1|y^&dÛr km®¨¢ù[j³+’Räi’u{º™Ÿ  ôœÝõS×Ý?–í¬ÙwÜ_¿&‰(oIz )éÑò$QxjxzxÔÕè¯â®òuþk††¨ì‹ÿÑÁ}€ìly¤ïEº/ù=¨8Ríž¼e,·ŽJô&–Da[åˆq°ûéy$`» ¡Âí¡9¨¦·&×3|9—ÿm׫ž ä6¶žú–r ¤˜uúó#þ:êÇg£ 1'1‘F=÷Ç»JAue/¢dZáPŒ%Ƥÿ+׈+'Í֯͡ŠÚÊŒÍ?«.Ó¾ƒFzòÆ?Œ:jeö…žÊïêñ`€ys?G¿íÇ¢Úþ“Vì…~'Wøí_H•A¹±DS©,’eU¥V¥V¦¶n ³êò5xŠ*)1;sÓò ³'-¢àªÉLey1 ’òòšªê²ZÜ\*“kSª…òj1VMGA–Tc¤Eh«[AeB–);_ê”UÊJ·íŽíÞ¶Û`Sál»Ãn±6íÛ}hç‡q‘u“« !œ ƒ¬tJd,ˆsr9™b©$'Î#3ÒÜâz•KéÔãF åÎR}/€xµE2P>¾óø!çoù† Áqcå;¿‡¶ù—Ýÿ»÷°.¯eÔÛaû©4MN ƒíoÒA4DçE&¶mgѪÁßìïMº¯¢‡×¢¸œ}ŒâþUÑêôÛØù.†RWf}ÄÊÝpöÛº+iŒ#Ó +ÿ«Ê]Eyp@ŸûЊ³Áï³SkuŽè*Þû]Ÿ]Áæ¿ùkŸý®"šð»[¼7aà8i€à8Üâ®]¹ìy ¿ÕR{`¯©«¶­²¥vAWBkLŦÚõæµ@¿Ž(r ñ¢ÌÇÿ}ªÔAý¦YÝõb|üàlÂ|V…9ð’„•@¿GŠU¿±1yÐÚ>µ°Qc¯7HIqj~–-Ë’tê*5.Áz³Þêç+ùà°ašh%w7ºš¡©d»‹ž&äáhÿM»øp^A^ M^Í‚2?Ë®h ?wÖß_º‰øhÈxDr#ØXHV%äê :ֈ˃¤ux–*O©fçößÃëi¥U]È”€£ÞQÐо¯bÿìöKUÇxÓŒ¾›×º—Tõ¹ÕýnTûaÇík~Ä#A;‘EÀݳŽíßšz0 »MÁ»µó®§ù­;ãd÷ D|êDa´‹4ôµŸ8~­"ŸŽ˜*ç†ÐŸ/ýŒÍÿK_uI¬Äœ>´÷ ”ÚË߇¤(I•°-'',5).1ÂH÷W’CXÕ«µd¶ØTÄBaYe«¶±Æ[ÛXés8-6Ð'¸‘ä}µçþŸ‰ÿ[rqÔàFkÕã`ê¤S:©Ì$çO±\caG•g§Ýc÷F {ÈjƒMbz˜¸Ú7«%›ŠêHn%PÌàÂC;†1 }èoCö?ļ1f©sBáÈ_û¿‘Å, endstream endobj 216 0 obj <> stream xÚS[P[×½Bpï1adY±:µïuÚÔÓik›8¤u(v i‰ãG1†8&ÇØ˜˜§Ð½’@O°%!Ð! $!0ùÁ‡ØØ`ãçQçáqK&§ÎŒ3M=GóÑJ™N?úÙ™3ëcŸµ÷^kŸ}DTj*%‰Ví<àÅ¢_í{¡¸8ëÙ¬¬d,;þ*¾6%¾N_“J޲6íõþ9mEQ?JbÿÊ$¶­Jâ/@¿ŸI‰E¢TvcÖ¦§Ÿ«¯mà•GëwÕWQÔ­/Ö4Q)ª‘ÿ¹¡(ÑŠMT.µÚA¢ª¨ÚÅ'*®¤ÖQõ•OR»©=Ô^jUBe¤P"*…ÚHED2ÑTJ¡¸,õg©ci(Í’ö$"àÕ*~¯ã^,“ÕX»Çåé™?+_žýË¥åYŸÛç‚ ²3c¥áú‚·_˜*x»è¬ÜØctém¨Ö´j›9àÿáz¥|þØåcóGý¦€>`A’Žï.âðÍwESWï]Áy â8o‘i¼BhCY¹í©ó„ú÷ ÌÜ^wÅlãp á4ç“,²é ²…üšlx@¶â\ö ÌE¦'].§ÆëðjvNª#ˆl ¥2èîê'ºtò³ùkÑgÊJÏîb÷ÿ¥õ’X±K^ZÌœ]ÂüRÞ!=‡wÄYȲ‡Í|¢ÙÁšìj"«žúkÙçÜÜôŒŸèœ¢CŽ“£B·–k¡¥wš”âð|6øànÁü¶~•C *@û·t2<œ’½¡©Ý¡ð“‡—Ù¯¯=íý;r3XJ~<Ín§ÛÁjod¡¥ßšZF¸ín‡kT3úôë¹Gœ›é8aжD}Π»?¡Ó^} P$4åà웡j{"¹ ”í¼©I/·vZÛÛ¡:ív}\úÀÐämìi”S°™ƒ†Þú~¥£ÝÙm`2h:ô¦.#˜ ÁÍ÷óÈLd²„ì.ØÁææ‡gØOé«Íù[É:\1ü|Ðp%j¾‡ÉÜÌ…wÞù€}&÷D&¦´¢âû*T¾Õ6ƒ$¶›x~1Ó‚WìYÀ’ä‘~‹SâOÊÆšìjö(­Ö˜•h=º@’~9Nfé„ ›ô[^kàÕÞ–(÷º‡"Í}×–®6@8‹™ë»¿tÆv°†%‚™QêŒJeÐ澦Ã~ß`¸ÙÇÿ?TYÐßËa+¡\Pר&ýÕpÞÔ)…„E<ûQ¦ gç%ßTzçÆO?£´©Øm´ 1+„€a“Þ9OfKié}^¯Ó$Ú q8‡Ž<‘½ŸçJñVN;cá‘èɳƒ‰-œiÞÍU5£Ðþ *AÏ¢£þÿÒkéÛŸý”=ešªã?lüÍEÑ¥?áÐ’Ûâ;e$µuûfëzddˆø.IÁ™lÓ> stream xÚÝ| |SÕ¶wBéÙDÐÆhp8ÇdPdFæy:Ó!m:%Ò6ÍœìÌiÒ6’6iÚt.-¥@™ADP@Qçõ9\‡<¼{¿}ÒåNzßï}ï»ßû%äwHNÖ^{ ÿµÖ^+åræp¹Ü;æ,\!û–72“w„Þ‰NHJš0~ü„)á‹©á‹iÏŒ_L_<¾x6|19|¦óL˜Î3a:Ãt&†éL Ó™81|1)|¦<1Lyb˜òÄ0ÁIa:“Ât&…¿5)|ó¤ðÍ“ÃMœ¾gr˜ÕÉá›§„Y¦<%Ìá”0‡S§„ N œ&8%Lpj˜àÔ0ÏSÔ§†)O Sž¦<5Lyj˜òÔ0å©aÊÓ”§…)O Sž¦<-LyZ˜ò´0åiSÆ?=qvºP”“Ÿùà’ô¸øÌ´W¦ £ÓþêM‡;’˹›ógô 'G¼¹€ó2gñà•málãD“)ƒÒ¹™ƒs'†]à¼Í½ÌyóþƒN!WÃÄŠ}âvÎpÎΜ;9Qç.Ó»‡#àŒäÜ˹{ÌÜG8rã<ÎÅy‚3–óö¡qœñœ œ‰œIœg9“9Ïqžç¼ÀyûÕ,ÎlÎÎ\Î<Î|Îìe˜ÎÎRÎrÎ Î*ÎjÎÎZÎ:ÎÎFÎ&®–«ãê¹kÀ^dâš¹®•kãÚ¹¥\öª2n9·‚ëâVr«¸ÕÜìen-·Žëåú¸õ\?·{]€ÛÄmæ¶p[¹mÜvnöÂÜ.n7w·‡»›ÛË݃½r·»Ÿ{€{{ˆ{˜{„SÄÁ ÎK˜™×¹ÏsýƒŽGŒŒ±1¢wðÚÁ‘/D~Bl#Áqr ùíÇ/‡Æ ýù¶³Ã6Ýy»gøøá̈ #NÞQyç]wÖGMå á¼kú]Wø wO¸{ùÝéwwÞ³õž÷+ï\4²çÞ¾ûÆÞ§¹ÿžû_¾ÿË–öÔãàñôQãF½6ºæ‰ª1oí|2ç©ùO žŒ[9îÓñ¢ñšÐþÌÞ‰ù“¶<+š4¢é-ZŽ–0£“Ê¢‚zÈ.Föë})Î’D¡¬î”nÞ¨$xˆŸØïOð—ØeÎ"HJ‹ i¨0+lêj¹À¥¬Pº”3Nu™²LCê@±¦X)S¯ËH•…J©2O.Pª5 ¨ Ë ]T9t:ö§¿½A±^¿V½^¯j¨&UÀX\¦(ƒøa7–“V;”]Ú}µ¾Z[ÝžÞ)ê9NY9$]e4´kìJK^©@j+´Imë|™¥ØVl& Ì\fsZú.[…Íe«.Ø,f;´“ÅRªÊd%ŠQ¼(1äµ0²0˜¡Zð¢Ú2™½[]±BWŒY‚ñ¶8S¼!ÏgÊ#û Ž™!F{$Q£±+~n5ß „ìci折mZ­BU¤Â¢5S.èmsÖøº*öÁ½äNùéu¼ÌŒ4¯¤ž®„å6‡ƒŽ–Ö¨ã¯DÕÇnšô7¬]ñ¡{¾ýk;¤xž)òýjŒXgŒDüK„œm£D«JSæg4-~¯¯’¬’g tj-+gP™5ÊH8öV[j»®Tï«ÙWÕgqš¦2Òª±¨(lP¶qíuÇ ‰êz9Þå]BEןæ3ËóUL.|>]Ê >9·%þ`ö~ˆÆÂ£h¼ѰÚP «á59ŠXzŽäõ&ï\ç[IÞ%Ì^ I†¸1†¯Ç掯Á×,¯™:Í»<-µ-mÞ0 =Ù»7›§ÃÙär3 é0dîÊgb"1<0#ÊhtÉ7Ü™ýrñõ§°Áf¾Éëø<ø _öÂvûÞjò†Ä$h©õO$D÷^G½)Mô0O_ÉØ$k'| ”jm%Ø.¤yÅòmikëÃR5\pÑ#>Öò]¯Øw ’Ÿî™ò"]Tã–¾´|á†ÕW­_-Ψ ,‚jƒjÈ`$áG3"³•P»±@¦Vë‹ñjD¡¾ßC2SˆC‡Ãûä+Ø2Å0‹T€YéO=M-€Ë›“¥D½ßÕBCo¾/ÃDªˆøB‘ˆá¢ÈõŸ Áß¾‡"høÙ¤¦™œ–2³Ó‚Õ÷J`ß ø&ùÙè}ӦޙV“ã÷z«Z2*R©_µž ³°Bœãõ6 çù¨æ)"6I·Ê#x¹B4ðzë°"Fú ,ÖË ™"´tÒ×¾ Œ ®Ðl°@+éÔÚdTL˜“•0!¦3ƒg3ƒŠ$2̇*ƒ Û±?ÀGšàÈCÀ€„êƒxu) á~߀ ¯F\F#ø½Uod}ÛçÍ­ÍÌç Ç]ÿ3öå÷èöo_FC˜;h9±E››’B¢hÐ(oT7Â7àIï#‹Õ mPôµ +BGlÊß^´nƒ±¥±.µQeRð›j¨ÕèÕ$s(Œ å„ö*»£±eWõnHš‰]ú¦ÄŠÄŠc Œƒ³UÏO‹)Ph àB¸èPþ©°ƒ5®EÉX¿ ´—|Ä "z—¯'à5ËÏçÏ56´Wî„-°MV“NfeÈR³+ÅõttW¼¤ ¼¹¬ýeæ…±Ìbf™¡å̳ˆ¿ºVîU{á[ðhOçQ’÷c}génØK¢A3Ð`æ6j\—»„40¾\ |ÿ#u6Ï´¬1Š ~óUÌ0P*b¢]üµúmˆƒ¤Þv qðã7Ûp(šûaÄG×§ñS˜m‘^¾G×׃åLÔA¯±’h±eÁúEÑs–=šÀ Ã\‘2`Ê©‘ÖB²±¼®‘vˆ†a 8óã®Óû_í9mwXm°‚,“áí#p\nÕ6þjú·×Guï“ô ú]â>Þ'húŒ¯3“f-ƒãÉGþ4ÿûo÷,º‚Ç…‡7·fU‰Ê³k°µžð½v¾ ?záè$+YLL˜ðò(Î9¸ôL*9šÙÀç}ÍØ8ÌðüÁCGÛÍF‹ÇhSY´»D‚;>ˆƒóÉg_Ü0šgî+ù¬ ÞÃ/gÞi;òڥة\¹iÝö,?`±1§&ß¹±y‰OñêM¾Q²;ø¨Ûý>Ò}ŒDùNÔ^>;#9!{+ÜcìÙ¤Ï[ÞX+­M§s`n.Ç9g’ÎQh2¼‚æÙÑãd5–(BO3C_ÉvfX2àl¸4.vyF¼|ÜJ>x‰DC¨Râ8<º»â©Ãve†b(ÓÌK}|$)F#Þ»ìFàǯj™¨å4ÔàìAC†£Mð%6Ü|ò8šÝœõ·§£?✈8ÌÕÁÿ<9ê’×±TûÃdã¿&Ïþu˜Üÿ»| ÿË kKî3ÐÖ@p½„ÛÜÄâKãj¥ºÕWyKe§­™D:¢:Ö—f8„µÛ ˜n‚é”PkŠ|“èÓF2€æ ËŠÊ5nuåZ4 ?×£Ñ+ÑdÚ©µA Ôå(óæ3Ë1Ë0+ b bŸÇf¿IùhºŠåj$æèù¡#â7nÔÀ!=ø:ýéË_ðzz®ÏđЅg'$[Ô±ô*€±M‰å’˜¬N¡°þ %¢W/§ºõnø1ü1Ðù³¹ÜT+à‡‹ÍöæÚ$ –Q•¡ãsÛéºc‡°Å_Xtxq]|E¬)#ÿ®\˜«Ï…ä(æ3>z‰ðC¿Î[|DÔ´.'ÇÍzy •ó ùœNHòÌ~Œ, Ñe­¥PÁë9 /¤XGáè2ñù¥ÏR2Ì”,$ë׃'%Mן p|ü Èð7^Öþ6µÌæ%f³=ÉLGè2 ˆø¢ûYT—Syв]-ÉzlÂ̇á8¯ió‘gó>†ÁkÕ_ž;ß³ûÆ× º ¾ÉDz˜A†b}n%$˶RYEïSr¨*Ö¨¤YùÙE™,+è…¬¯?Ò…èËÁû¾àõîúÃÒm¼\ôèkáWð³öSî=Yw ^™ùãh&óRU1âTå3ñ738ž‰`øqi !BòB"6¶ÒÐf°â˜TXªg+ŠV³ã(…¸Äx$½3ñÔ’Š§ “YN}éK°¾@m8¯ ®¢ÍÞˆ]×§ó…- ¥I“HC•žeðFˆMÁ<Êx ž]Èó ÙRÕÌmÛ¶n™«_Ž}'‘•gj¡‘ïÐ »t‘+Ç Äè-÷¢ª,9€"½Pš#Åê’0£È@4Õ˜êX…gô[ZcÍ+mH/!BÙ¬¥j/¬1×+ÄèÚˆb™[ëåõu³ÜÝ*ÇŠ¿'Gž”u^ŸÇõgýD,`¬MéæÝ42\GiÇÐù,_ù`vvú£Ô|TF4W™1?$æç,ìÜÔkZiÛø+?Ø—Cü|@í~“$ÄÑ‘«¼V^¢¿’WÕ-ò≅ˆ¼/æåþ§_)iÖ4ªAG˜“¢¦rˆ¿¹QÆ&#É©–vZ 6V£U «ÙÒŒƒºë;X€a¿­d(Q(·*ƒdsƒ*žf”̤]-¦nª–ߘ¥Å[áþùü- ¢|‡ž¾ÌëE Y=Z[4qô `,€ùä’¼GŸ¥¶Âm¾œ¤Ôzi^®/×—š–#IžòÞ¦·¾{÷M4ˆ ní>Ã^*€SŸAÂç…†ÆëƒdÄ;ûûmÀ2¨’qr\/¦¤«p† ÉY„¤ÀÒ@{@W«¥ oºT_ I?Áë0÷ÞÙÐn"L_Œ3®n䢇ýA÷Û½!WsöË¢% N ¡RÏ¢ûb°h­b֌ضÆv×¾l½mÚqi®]²s´àfÌ+ÌØ£Ì“™9«º ¯ÙÙ‹†Ž¡Ç£Çðki­£ÖZk¸qX9®#ãSCvWÔï¿€Uß½¿êùVõíl²6QXQzl¿f ÈÓÊ¥Lú7Qð ¹+Ï×#X—ôŸñG„À£ êuRúF˜·Vµo"obméiöK@Ø•îÊF3 gf!’™c+±T@Ò@8Œ¥VûíéCö*À¤ AÏ!ÅËô€¹,IÙodEùä6‰ïúTŸ^uäË`ê—¼Þ`äõ5ü±ã„s˜!‰Ksç¹$3 cV ´ Ý…– ¹®Àæ3#qý¾‘âõâT ›Ä[ÆÇ‡xè%ô\3NVœFvÚÏà¹%;§7®²/„Ë s×f>3>¦P#ÕI!ó8| =]ˆxú èÒU àSÈéÎùÐ) ôUtôK^_(Týs—“†<©oÀ“ŠT‘Žë+¤EKÁ5ú*Dƒá÷OœSžk̃8 á8qZ€¯Òê¡ÐmÄÛ˜¡4LÔÄe§%n_!_Š3—ë¾xLõèˆÁ6G_F{¯Eüqx'@ݯ<±ÞfÁ0àÄEÈ!ØWàß\%–ŸJnp¾w釗¦Rç‚äÞý-—l›‚–BS¶®D•"‰O€OÁn´hÛÛ™= Õ›ÜÜßíÅq™;sæ%¡E2ïóQ5ð9œõÔ[ÄÕïÅÌ=4|nã†é…" ›Z³½E'nÂÑj©?êÈ tápˆß¶îÓœW ùÓgŸ !4üpÓ»š‹ÌEÆ"óœ*Až%×”oßìNߣÙOšÁù“¯^¤~‚§^¨e*Ô¦WAÒn¶Úi”lúR9V‰hSIÖúÞxÿõè|ævÌBßœ‹i_& G¼5ÌR¦¯œ? ?&E„®Úõ¥8õÖ[Õ&lJr­JN3k°8C^ÌË•ŠÊ¨ SÕÞªºÀÏÚÈõp´=w•×qäúóü\&–CÆsÍmÍ­GM½ÜEÔz´)ô6\ƒ«à I •âcp)ÞˆÕ2Ï¿˜ˆÛaÞEÛ@«ÇÐFµ¸¼TÖNµ'™M;p0Ƚ $ë#CAózC(hаþËCú÷cýC¹^•$s 0‚«Œ½H¡xõÛªïÌu†:XJŸjHT`¡¦¼Ò]Ûjj`A$½J^¦™‹>-Ãp¶Š9š8 ®<,>#k×wÀN}°ŒØÓ¹Îæ8q°_&@C±Š=…xûÌ—yN–½:€k!}eQY‰½°´¨eàÀ´CÓL--,•Ã<’™  2g8ÅR™!¹Db¹°.t?k®E¬ %§ã¨…Ó ;F34@Óép!e ª«Û¼^¿¿ÃÙɲ²Qjd4Ì•æ–H™˜tJ¦,QÉp…ªq(ªÒÔ>AÊÁdüHxE ±)KñnLÀân‡µì÷‡‚œÐV¶YZŠÄ×f³UÞöËØÑd!å:ŽuvîÝ{žÄéÐ}s7³™¹‹ÙÂð˜­J™¼‘ÅfuųX¡Å`†dpQ‰jpÑ/TÎX¿i[ÌBÝJì"㈦#[}F}F…·:8xeK!Å󰇚›e„ÑóËJ÷‡Ó?\Wðÿ,Ec<“YùAøìwàãŸNGxðÇâþ¼r²ùE ú¡•ÉÙ™+ŽâÉþƒYÆ/Ñ†Ž e6…‹ ¶¼™¸ÐÓ[q^鲸hž –*KKŒä“{¬ª |É=âv\ᩞ¨ž‹(æÌ/ïâI~}s‡g$Ïw.™G'†`žgx3?ž£Ë‰>ó‘öò=8˜bb÷ÀØÚjî!ßÊÚxE"Mtrª²ËGáHX$¢@誌übâá©‹ŸMzAT•[ï­©öÕå¹3)]eƒR˜{ø£ïœ»yõB ©!6Gwì£-ÀúõO;¯™@E^ëA6 ÷ÇÓÈ}9¢‘…È ÐÐn¦o| ꌯú6É8G¢á_ÿ„†¡ÁSÐ`F@¯…щq$:PÍ =_»I±%%>S—£abmV›¼LY]$zÀr=v9òø¹}¯ ®ŸŽ+`%T蕬´öücƒË|!¨rÓ0+3¿ 0.a{bLÌá½^²ß[or³9ÄH›FI„Hˆ¹IÏ4µÓ×#Yha;'¤ ¬Š3(Ž}F´ô‹'À‚OLº>šRýVËÀ¹Ÿ}}¢lé:Бߢßû¼_[Y6³ÚÊêYïÜI±V½4¦p=¶<Ùù¥¾ep1\+YªÿNÐï3%¾àSµÜÆwQ3FâàJ>s—ôÅG I>ô3=€î¼ö3І>ƒýã^й±õwCìä»Õ8ËþCÛè±|®×*RE<7U¾£ ŸÃ²ɬ  §=Á'¼ÜÏ Ê+¬< ±^ƒ“á V›¨ÐÞa;m@sjc^ïÆðû×?£ÛР©¸pN¯‚[ı[É×1ú3j¾fFÌ#㔤œØ4¯÷ý+ä~cÿ«ß·1üYTã¼P=ЕìWkF_þ%_«o –òýàJtïw”9tðJêT¥(€R(®ÌóèȆªjïÎxw2½n^Y¼N¸¬4µó¯`˜Ÿ'‰jÙƒ =â=¼/>îàW ´Ã7á‡uöŸà뉽«ê²"S¦ElÄÙ×»ayüõª>ê-غվ”Ã’2Š÷.>Ki4X°yRùP.* !‡A‰óÞœ² K&$—>.ECš†ÉÎI{½©†Mä¬E’uÔ 0áÕ¼7´N£§’l?“f Tz©H…±ØA¹ŒåM•årÁ‘ðn8€–H¢~8“åE÷×ñ.¢ÑÁüùéLÔc”ðÞý©! Ð(t‰êb÷äï†äåªOÑ;±I R(%7—Ì\¾²äì^ Õ¡‡oo€y-ýª/Ÿj³bdÀö{†w)dýåÀ›t–t#Æ}(#™-¦Ò*Dþ ÇKÂ#ð@[ÍaÃ3ôP(ꥦšzi\yü0Ê"y—„vÐÖ¢ÛD3 Á¬„)ÏRq0©\¾_WñƒÄ÷4‘ýðW:À­Á!GXƒ‹(sjýâ®±]c:ÆXŠÍ….œjלwu4œ ¼Ùp®ö¨·õ00W9QDÔéë q°È-ÉSäå¬È\™½B™¯ÊSä'}ÿiü§Z›†u3°Ö6B7û­ßÀ·²½½°:¯.µ%&ÝcR—²Êj…R£Iެ9fÍT=.ùæ@^I•‹†>¯»¢ºÚSYWí¶9d¥2—¤Râ’”Ê*¥°JÅŠ"öö­ X j³›Ä 9 ↄ}En×Û Õf5™›w öÛyè$ÍfލväÑ0auBv,k=…CY}X p¸`9tyì军¬3Û<ÁËìÁ ïPMp&_ä¡© õ…ãÚŸêgRØdP ò3UâuÂY/Ã|X`+tºÍ® XKÖå»r2 óÄë÷‰z¨ °ã­ú“Þ‚ÝhÐÄÙƒUïövÅ•·'x‡æh#'‰¯¾V 3`‘ªX-ËYµ&guÞVF®‘kå˜UE}±WæË8•y*ý5­MkÉÚâ `³TÆa2y¡ã*œÊ¼A¾‡{Ë\ÆLb“ÿVã®Úoó^SNG#‰ILÔXæŽq̵JÉÎÈ­šR ]à ÿRœðk£5³RÒ7j·±51a/w”9Ê/£Á .~µXíl)Uª0)©~ƒ®c{\ô¶c¹-Ê¥ g.³N­UjpM§&YsnMá©ÇV[iÖX´;,f“…†Îl¯¬<¹kGgb»0 И”½hmðVTìÙÓ½WŸÉl³±­}•YîjÿÃWiÕJµZ$ÄÆDÇmKÔjÕšPoÜ(¯Ï//Þ×µ¥g»Y‹ìJìÔ†£ ZéíLíHmטÕfg)ÐZSSêhl©oõµ[löRc)^Ûªî_¨vƒÝ]-;OÁE+ðîæ6Š½ÙŽ¢–ضøöÄ€P`ÖÚÔ5FC¨JË,.Þºuó¦„uµŠÅLÌJˆ2c] Òuüð+‡Oï1›mf\ Ö™R“[±¸oÅ‘UG1O¡9ŽÐþákô:v!i[tuv¥¸Z\%© Œ:“j F£ÑjÅY‚ afJv²R^(Åx¡¶h¬”ÓXå++ëÞÝÛÙÛ…åËŽD`a:–íN÷gÕe{s¼j«ÜUÝÝ¿gÃ%P"F?¶ Ú@¨Ýòqøë<©;tZp ¢ûv—"ŠÍN1õ!g±“bb+ܪݪÍÓåkóô$Òƒ¦Jö{0ñ&¼¢kçL1%Y’± oùª…[—,”’¼¾\uÿ™×p"Wbl¢Q=09¯˜º!{†QÉ?Z0¾[ÿ·„Ï C§G…z ¼Ž]¿¶( -vô·Ö;’Ì]ìuc•ÙM!‚8_W7=ãH6%ß”¡AmÆÊêŠÒ \N,EÑM'kŒå»(ô,áñÀ¡žŠïU•z¥^õk§èµjÿM§è÷Dõ{"ÿê§S´ÍºX@ŸxЫ¨àêO}Îû.Ðu¾Íl7ØÞRÁ‰úûáyÝÉP¯Ö*þ^ã±ø±ñÊÕ9­p­oíÎû·¿Y| «4?ޤí@ýùÆ‹v²ß\Bfùpý@«é½÷y-ݧŒ¿çk¼ÔPó«…=º£üi„&›4>Ò`Yy…Íq‘—y‘Ç>°¡ÐVa¸¡$¤ªSÃ]Œ[ üN¯*À°_È 5¢‰lÑš3I-€ÅE…Ê’—òE†œÉ+' E%ÅÊB}P+èh²°ÊC¬_ ܲûÝ4è¦tÿA°á…ø?ð_À-þP+€ÿòæ¾üþ)_ÒdBM*L…BsšÓmó”ÁèÍ­Í0’Éù™Y3¿.Ø{âýº³¾¼º$:C›Ÿ³q¹"öi~k5a0ûÃ# m·c`»Eýg½)"¶]‚k®êFO¹Óïó54Ô™Kl «|ÿœ½súf;ó|Y0“ÌJ×dR,…!˜‚ÇùƒŸˆ…éæÔ.©»ÈSèYüéòk‹?Æ‘ÞÍÐVn·XvwïÞ½»û`ßž®³ìÞ7 §¦0†™;2róŸœøä3ãÆ‘èmÐÓdÚMÕbÙ7BâÍB/1Oø¯G¢üß¡±d¾Ê;€æ ˜E(rµÔ‰t>€Ì0%3B -zNÈŒw@IÔÓ1¶Ð ¸kiÞÖ†œÚ´ôIòâ+ß`Ž®TŸhGCÍhD)Nzì4wÃd© #ãt¢FW¡ƒ©änl1;´1” øãþ7ö*Ã&ǶÅ;ÂXuõ*¯ç›ž8dz=r,¾µ9~•mŽ'ßlŽÿæÆ?€Im!HéÉúµ9ŽßmiTDZÍñ«ýÍñ]ÍqnŽÿÛõ@ÿÊ©YáöþaÌ É¬·_f©Dl†©›ú´°Õ$ÙXipë*40¼± ôÛ5që÷þ qÿ;6kÿ†‚Âmʇo¶)gþ½6eQW¯K¡š7¼ &N½#¤Oùßv+—ññf¬Q/.ýôìÄOs±õŸ6-ë3ÐÒ k'ê; Ö¬Ö€ZX§¯(qÉì¥ÒO™QŸ1O|ÌàÍ™ˆvÖžêA3lÔøŽÅl$T• Ú £ªÂ^Öw¾âOð26wÖž,Þ&ê¢Î!˦™Ó*Ùß ýÏ7„¼!qï8ÑÉÊœ€¯­ÞSYÜ’RBMuÜzAìú¸eÛ¶‰Å¹J!$ÅhäØ*iX^겕úÛÚÚË*+\ŽªÊbWQe±CY®„Åäà Y]8+HèÉ©¦ú[k÷ú}nG~…´¬ !±a‡?Ñ&/•Â"RZ¤S!ÒëaN qwz{zGz{ÜÆ¢°õŸ[[ê*Ëöw¿vä$Ý`‰6ò±|¢LcUÃX$“* …`{ü†[dr™¼XA¢{ÙÒ† ~W£qåf„hôkâØ À;dîqM±MqMù¹å.…] ´ËØþ’Ãj)3ã5Â7h‡ÍóD¡ o/x‡÷ªDr~oõ'Nø&ù=3Þº…JI¡T¥U©”ìá[ ÌmÄ€§Ð–¨èÐÕ´äó€-UKõoÊ ÁirxN÷¼ɃoçÏ]¶(u-½–P*µ Ú °aŽÉ‚÷Å øvAé ¤Lž™½”Zg» ^×8­uyìð RAÃÔªäZq{JŸr/¼ш 'âÀ7Ö5¯®*6™‹ ᑊçA±ÿÈDž< J5tÒ†R»ÝjÛ¹_ÐÔÕ´³©Ëí«ñ{¼$S b3µëC7æ€ô 3v´ýöΈ$nV¤ ´^.W¨•qëm\°v1‰ªAk¥ãå¿a£«)=â…÷õÿfÐøz^œª²gQ¦´2­¦úIÞèÍ­Ë0IÒÌÌYÿ‘×{ü#ßo¾w¡ËÏf£*Äõš[ezúôßÄÞ$_蕳ìFõ£¯ÝÆ2]šqçªgËæÈ׿_Á6k-²Ò#–GYWP%Ê,ÉÊßÚ!ì¡NBß™²ÕoY¯À‹$Î_; U~yðÛ‹²hæ8àåÆä©Vü]¥°L8}mðÄÁ§0?úåU^o˃44ℌ)¡R“‹ó¢1•…›à:IÐA{’gGEÒÈÎñ;ÇwŽÇ•¿Ia)v°£ßNh.7—Î :?éø´óck…Íeq˜¯¼Þ襒Ìò"êçe—×|È] j¥jéf†»‰ØÈp6"îv4h3âª]ZW6¼©Þþ°÷;^#i"s íýs£4Šeh6íeG · õ›ÿ‘‘†ÆGp™q;‹ní•¶~/ùšhù#xfúðÛ˨J¢¶; és«“hæ5+Ômù‡Úþw˜šùŸ“ ý(×£Å6ŽÃDò^Gû¯]ývÃÁZoMm³¥’MD½9_B3‡ÌTI’µ$O”­eá‡Õ¡gÕón7ÉÜÓ® $c„º°uÀØ;@ÆÕƵŠCmÔÐå7õ…Öxð•e7Ap-ûŒðìÚß¿ëè,ÍZJ|½èoHæÍ»ŽƒLe‘ˆbî&rå^½Ú=Ö£è–ný?á#ø=vêWT•óléWúÿͬ…~› €S<\ ehÇåˆf>‹W0Ç@ŒD½k£콆]uîÖv¸›|{Üž…sïÏD(-±‘­Õ& ‚ŸG_O\DËjéò”ÕœKˆõžJºÿDå·ñ7ñò•d•õàœùó.\T]šÔ5ׂ³yt;1Mg„–8v /¡êMÑ [”…ºBœákúB}ÁH6 jª×n§™˜¤†%™ƒzŒÔr’F  ÍYöúÍÀ|+KÿêZ%>´p§¶=ãB—/ó.¡Ë(“Ÿ?3!¹DW¢“ARI,3Ç·fÕ•jËðUj ®1¶í_»;—ý[ìßþâ ¡?Ï@#˜è˜¨HÏSkÕj•žÔáÊD(•‰N®¤þŒÆLö2 »Žýë=s­¥Ô·{¿ÿ$?Ú7j^¾HŸGóz·@QãFHæ,WeiÍ3í€6 {y©6$î…-°¹¢©,4¨d[(÷ˆJåÁ™þ—Ù# š‰ ¿?ÙyõC 9ÊôH@º0œNÙHDýxí ¸ÀÜŽFìTÛLBC™‘Ôƒp”¼‡tJ­NÉOÖð»> stream xÚÕXytSÕº?§iÏÙÌÒ-"ç`Q¯Zd†Q@Ë¥þN]¡ú¨Ÿh†BûÑ#è zÞÆ¨˜˜ ãÇOœà¦Ý&Mô“<”{ÂÔûÂTè‚<‚GOàxàQèQ8Ù#xzzzzyy|òhòhòhòhòè òè™æ9>ÍsjšçÔ´Àñc'KãÓR#“G-‘FD&'ŒzU1jNfjdBDdÄo~Ièé?Aôõ.ÕKŸ¦.ˆ¤oQý3áË—P4Œ’кˆÖÒ:h=m ´‰6Óº˜.¡­´.¥Ëh;]NWЕt]M×еôVºŽ®§èFº‰zÊͶ5—:L§Ñï{-ò:!z]ÞÞG}6ûÜf6°ÙíèX¿œþ¯X>°ßÀƒƒlƒƒ²nÈ÷lxäÓ¡Jß)¾Ÿ‹÷3JIN þÙëéó•ú.×í gaZôµë’dÛûM{+ÐímÂÈM®¡]Â×',˜ôÅ`Aå…%¹\&d¤¦+B’—©—º§û¸ ‹>ЇâÕx°³®CÇΞú}€.xu/cÕ/ÌzyÉ¢Õ+W¬ ]¦Tj AŽÒ]ãYŽò‰dÔoê_‹€”¢H$¼ÄÞ{xßÑî^:}û ÃÞ=N`CFmlIiëlhië”6Dqw-Ëw¸fãð˜vß½Øï)<¿€?…‡‹ßÂOºÎIš›÷–ïtdGÜ2^ÉÂ’Ô—fç¥hÖX!©Yƒ¼¬ä)Ñ—ªevB‡¢n XgXQh©rÜÓÜëQæ@z¶ÝÔÐíКÞmFJæÍ¤„(ÁŠÿ SøÑƒx$×&gCâ÷N5Ñ ÿ@?:&¿(ˆ"67%lßÞèèhOiŠå<ã~]®73|ñIìãß'¾æÄ%Ø)ôµ Ÿê Àý®t¸–1v%—S1) LÏÏù‹0Jð†?#Œ*Ti4P€v•HÄ—±Ÿñΰƒ­=2P˜•Ž_ÛåºÚEã#ØŠ‡Špè­`ɦ>„ÙB¡0]xFU¨VË¡ õ…€B˜DAáÓÉ”¼cúààŽ®–#†ý€\2û`Q§ô`”y^É ÔÉ$b…€\Wûº˜Ÿ~zL‚'à µX x#ÂÖÛW™»Öå‘xµ0¿Ëu£Ë·ûañÎÄ;Nˆ+ñ*·Ø‹WÃh­¿b´z¡j~æâܰäÅ‹ 2‹³+Pwck/^·=¡9:B*Ý8o_È9îkèø¸¦·öTÉG–‘xºõºá:\w›¼á¿ _ìòwÝ ãÓzSä·$íô ìçZˆ¹FÜZ&y¹`Iî² ãçGÞ xÁ ÛÆôÎíwEú=Ü€·¿þл à<Âk_†+“„a“1ö>vTŸ@zæõ·b{örâNF®d³UÉéijG‡#ØËsz…Ç9ñw‹Z>e³#£ÙÙXßÊCC~Ef9")5[2†]´&l'¾²qmó®cqíÙb[í.¾«3hçnü9F¢3.J×Þ?{±î»üR4à!¨˜¤1+` DænQù§ ~æ•O¾1M÷$ŒE‹ÙRáyÌ.!p ÂÖ€ð8N'~¸b×úöUå«a6ŒI‰Z€N Á’Ã,Ôÿugg}}[i+³'¼d¦!CŸ™(……0íÊøÈ”ø¨¼(ˆ„ˆŠTgRtkvz:d ^çÀ“¾×ûpðÍ)ØKÜ×êZ!‘²V(Ó—’T]”Í ×Øœ¬¢LN2} 8¼›ý*Ç,ñhJçÚb$ví¬:m‡wÑea¨}7Eˆ‘\gÄ}'ëWó°Ež”žžœ§‹´ŠQÈ¡‚Ç›½1ÇV–˜Ê¸w±«gWZÈ‚9«øÁ®}‹ë1}µOÔòûnT8Ù H'¢BF.7”ód˜ÀˆðwlU™ÞÆíeZ EçÈíN6…Ö“†!ÇÓ}HÜoâ a ‰sºuøâÍÛñ„>ñìÇ ´ÚZU”Áà jaØÂ äØÄäu€2˜!„4%ãóñVgnkì4o'ìÄ1ïÀiíÖ`$Þc•ã ÄRÉ‚lÈÒ/d ã=×LŸcÁ¨3©ªÖ¸•+…RióÛØÛ‹n¿ 1°5öÊÆ²ÚýçK±|‹ÊØÚbs ‡i¦¼D›Ã 7ØÜm'¼Â(@®“C>Bn"LÒ}ý–¶ãPžÙJ·`ç+ÂOá4 >ÁØMÅe˜zí†0†Õ¹bWoLœ s‘0Ó1ÇóNçz“ÁHœ²˜åd&)ó’Þ M ‡×!´!¹'³S·º‘Ãv›{Û·:Ú+Û}[0‹'=š2IïtI¶Ñ®ç®‰vÝAñ"ôNýt Ò±*u¡R­¦¡~Ùéùr’™q8ÍÉä§‚‡ÒƆ²ŠúmõÍõÛêšü̳ÅTÜšÕ YHÄæfep$Jw ‰Ãj'+¿5ÊÈ&xþÀ‚Yg3TXÍ6K¹Ín¯(1©Ìj³º.ɯuS[Dë&£Æ¢5"¦ò9·ÑL6òK³·îCýÔÅ…%* ¡Ÿè½p‘P Ì"ÙV­Qð»61='4"424áÙÚZcí}¢õƒ)"²+w¯è^¹;¯4¾ìÈVi¶qÛHç¤/»E(YïÀAN_üõÍçHi]ç±N²³æ¼ zÑ !À:›‹hm\¾J«.Té–ÉÌú@š%OF¡4h+3¨j¹ZÐ5ÙÊ›v¶‘ååðG²yÁ/ÉBøX¦@]T 3•ñmŒøòѯÔ¼šUN_š»–ÂËÅùg‘]eTpjFV¤.x‹2Îð,*n»`.5–éËà䆶Ðê|sž9_î–†§qøÍ‡)B­SÊfdèKx°9ߪ¬o?Øv¨í`YuYUiµ¹ÄRl²ê…ý~¿=Â* ÿ••¿S‚Vê`k FgT"- J•Z£^=iÉÔ‰îÌÒèð¿ê_SÄþ*Œ=áøß«}s°/}Süÿ/ãÁô%Ib¡O0³Üä#>Sg·×@#´¦6ÇÑÆÄ„¨@,J=ÁŸ†ïš,g…íJhÚ‘ÇAZYj½âRÝF_½ö0Œþߨ´{4*ñÁ×í¼/Žn'£4jîNeàN_T[U”Ň³0Y7.efÁÒ¶Ô*P‚ÊPaµVA5jN©“&¤¥m íŽ?ÀáP‚Ÿ5ÿ`ØcØ {ÀD² Ês%×ÇT–i³xá:+ÎÌ˸ÓwäwûÎ"×íô—ÏÞÔ»' }³Û5ì{Ñöûc¥ôŽ·™¼p‘MŒÑ&qŠ8¼ÐYÀHc -¼_°ÅÖÄ–Ç¿$l°¥ÚÒl©ÃÍr³¬\‡ L#Tž¨hmù å”ûÇÏR^Rn*× ?ù=Ø!óþPŽc¥ ËUå®õüú±EJ²¨€t "«†<)GübÏn9»ùU…®B ÷“èî²ànkû®9—d÷S /Æk…Åì¿0©‚¥ÍÝëªÝXŽÖâ‘lÍo3dz€ÑN2 mdýÂVW˜D˜ï¿„q0¿qþÑ{7Ï;Fæ÷ <¸Oæáhö±¨î°wfÕ“ÛÞ¡ú__¬~)¸?”œ¥”žm¬ºÂEìfS©á ¦Ôz7AÿÍôt/?!]øY§kD»o+öïÃ&̺׾e’M¬øuõÚXþv5ùhÎ&¬íšƒ×0 ]ûá |Ö¸÷oÍoÙÀ„}æ`Fí‚°Ì 1è°àú¼½Dœì?ÖÆÆäR^¤À°’5·žî<èÇZaØ|Ô Ò©‘gF?èí˜aÁ5^’#SäA:’Ö&´q¦£ºÙñ0LÅk™°·á~x(ßšz›´ò’¾âäÊÐÚ†ÉM÷\'¡H.Ì ëxÏqËgÿÅ526Caï™VFh*¤éR݈q²DÖ™LU™¡’Ç—<`[Mf+×@¶ÎUMŸ«•Ö€ôÎâ9ýxÎŽýVwº¾ÜFo½!ªsgE=[v]‰º\^f—îÝóôžÑ ~å$)sÒÖÄ/_\HnPrPåÆJ{¥È™¶5š‹Sç¥CZù¶t÷ ìþÒyê$q?AÞÅ–Z»­Ò^¯¯u×Ì)[Íc¶{àä¦mV¤&,Îß²(ötüDZ§SúiMnªPY½¾†³ocîeɨt<õN#{è,þžDS©¯€#pRQ³ð_]†Ý5þ€™ë,ÈŠŠdZ$Lgdj’åø?ÿgÅßíOS8üA‡ÙÖ2ùÉ,¤Bº=³y}¯¢‡x¹Ï¾¯ óþ¤†´µ†Œ"á16þ¹ì5ë•Ú¹+l¥ûOm¿x)Rµ½÷®«Ýßí­1lì€Ö¬ýRãÓš?ÔIÿ;¨üĽüzL„`æìC¥N%{zš:·:º`êoÈà‘̃°æÑ‡9Ýo%wÕó̱C1‹xHQ¦äd%ÇGE¹oªEF+ÿà-ù^Db> stream xÚÕz t“UÚBéû¾¬Bc$¸$l‚Š ˆ²+{Q6YÊZèB[辦I÷¤Ù“'ûÞtK÷=Ýh …²« ê" £¸2ŠŠøéˆ7ÌËœùnQg>fæÌ9ÿùŸœä¼'½÷¹Ïú{~ÏM™Œ¡CL&sÌúðWW/];}sø²í³fÎÁÿÝó¾% ßÒ!¾e!¾‡ÒBúܣġ?Ï }ŒÁr{¬ÿ3éÿç cð'ã)ü1SÆxbƒÉÁx”ñ,c.c ãÆ&F$#ž‘Æ0D ÃÄp1êíŒ>ÆÆŒsŒËŒÏß0~dü…I0`r˜™O1g31W2×3·1c˜qL1Ó›“øl\~ö¾Ü¤ÔÔ„´ ~jÂ^þ¯¾ÈNÚ—ø&voRÒ¬™3Ÿ›|˜÷aösÁ‡ÙÁ‡‚Á5s‚ßÌ™|˜|˜|.ž;3ø”<7(yîóÁ‡ À¹AsƒçÎ œ8/¨ü¼ äyAÉó‚’ç%Ï œ8/(p~PÎüàöùÁíóƒÛçÏùììåi™¹ü„ì ë2â²Ó',ËHŸ°2ŸŸÿ7d0˜ãÂáE-c¬dl`lfì`D3bqDêÐì¡ùÌ#ÌSŒ7¿gžg\d|º9äƒòW¼IÉx€Æ`1d°1Æ18ŒñŒ‡“S³Ï3àdYÆX%†3V1^Ɖ³š±Ž±žñ*>a#>#‚±…±•±±“ÉT1ÕL ˜Z¦Ž©g˜F¦‰ifZ˜V¦ig:˜NfÓÅ,gV0+™UÌj¦›YìeÖ1ë™ ÌFf³™ÙÂle¶1VûsuVgCÏË|kÈœ"Ä3ô¹¡?…Öˈ.r"ù#ŧú†E»<´ë¡–qœÉœ·Ç žú°ë‘ÌG¾ìÅÇ|ÜÏ'p&л'‰'oŸ|eŠæñ »¦>:õ­i¶'¶<É~êÁ§þ4½àé…Oÿ8ú¯!ÎÈ4d÷0ËÑAvâŸGxÈÑe¾˜ø^M2?AÓBÐSè ö^YF&ÄSq­I¸f¢ËÜÔ=TojG4wô_‡,œ÷¹Öëó ™H„¨O}dG‘‡á”®¿’º]EOˆB H>më£'øÎ`ÔÁD¹ä6·¤R‰tÍžåÒe@Ý•„FùJ¼ÌSˆ‡Ö¢ñ!èQßÛ즦^W/PWŽ¿²€'&E4‡÷Ììé‚Ü\ · €#‘¨•PBñ}‹Éf”EÈc`{<䨲 (úyâhÏ¡G{Þ=yãuø‰B“hÞá‰sè°zhjÕžÁžÖæý\èͬI6ßUA¼ß÷iwØ!ô= =‚GšDSY×ÐLß%vKC¿³¨“žŒÔK˜zµÇ{¡Qß@¡µ=‚£™ô, ×QÎøC]uMn 6°imúËý٪˽';<Ø{¨£—csXMP fL‘°S³ëí]+u+ŒBHuï ä£m‹[?b]E«ÐÇl žµîU˜GÑC¾Y‡& hÄ4ž Ÿ­?³´ƒÒ‘¬K'Ë¿ oP(”Ñþü³4C?Ä…õûW¾žK±®FÒ¯°í$¼Ö6p¨Í 3è @i ˜FU_§¶¤®¤¶¤Kp€oŒ¤fÌÎ…»V4‹¾ j|alÖ%ð‹:ÿÅsúbÎ.ÄdÅ&ä¨ÔJ•ðK¯Ò=}Œ“R¹«J±ÿgÐöD¢=ÆǺî{fk3CgÉèè'¹©À7§”7YÝÕÐJµg7ïåʉ8yq:¤ÃìSϪ(;qÞ©?räwÜ7à:|"FDøÙ˜ý›*6bÏýH§‡¯¢Ÿä‘FzØgóŽÁ¡¶êAJƒ¦`ˆT¬M›»¨Ù§.ózH(Ó¸ <ú®ª¦ª†ö²6 >«\ð#ôôŸdZ/ð joN 0t=B3ÐDÖ=·–³£~º}mB”où Çì=h´Ñe¨À’¾}éø‚Ê"}¡¡ëâ»\÷Uü¶YÓ°­:BqÁ_Øl4€6’õP¯©aäÔl€-°3/2:+I¸W“€WÍEWب½D²|_÷o]ʃݨ¸ì„œˆ`ö·¿ÃÚõx‘ÓËÄÚ=ŠxCzn½ä×ëó Q·F“P=ÆdÑ:ÙªÈ]‘»W*×`¡QÏ âô ŒÂó¢¶(2!G”)Ü«Ú Tr¢ñÄ9øz—×ì5F›b)/‘Žd¡Ø#- `ÜÉ^t$àqè çÃ?{‚dE¡i$ëp†¸å}׋ƞEð±è‡NÓ£ ½þ†Ž ±ä ¸ jÚìÈÖf@&Å'!F›¾—¥‰ ˜WÐ.{³·žÛvæzïË‹& °Oļ_t¾…ë]-h¬¾BWðéÖ÷_ô$ºâŒ –ue³ykLœ¿Ô‡ï4Ÿæ¢!ðÞ+U4CW¢¹2v›®‚‡v“v•µ˜›‚ˆ|?ŠIt¥öRSTýnû6 ž ØAOçÁ¼“¯¼›‚»Ð‚VÍ£JÉ•‘‹¹3€Ûš‡(UcÑX)éJ¹¢H)óèX’•'1Jl\'Ø]f‹ÕÊÁo‹Ù†M ‰Úî÷á-¶7ÌÇ@VWå­%ìØI»m£='ç„Ò‰$+3Ð)ºš±—`7&Pm5[œnœýáì÷®*­£ËP«¯…Z ¼´,Ь…ƒ})¥&¡$e_± fmìÚèµ²R™D.¦ãÐ ÎG^ú"[åa^~û5­0Œ%FÃi+»H%+Áý»ÈZRͽEUÕækIU¡=—ËKAª‘uû;B *Piü1™™¦ð zôt¢'¬(ÁßåÐbßLv©Q[Ô‘×…“y)$=ŒÞ“Cs^ú*ñ¼ãp´¢ã€Ñl²è,úbU±¹¸"ù”·òÂ]¡w;Ôv!OFuI ¬¡P* 5·ÌuqfËr rˆðIŠ9<Ö¥wZoGcCª¤UE ­£ÃÙÏ’/o^µ«å0>ü¦å}»Cë‡kʤO)=¾±=Ìn4&ýÅ÷,»¤DVyâÎéRPMu]ÓÃÌѼBb3líN~56m9,‡må:ã#.ð1¾À{ ío,L.(‡X'åb5A] /ÆìâGâb#DC?þ¨ü{4Šç·ºZu7oåÅß|R Ãðñ¨ì&ë0úÉ_'¤,ZÌTjjéþT‰kßQ¶ £‡/¢§Ó£?„žäƒ*o;Å*ÚŽ^>BJp$@ñ…ÆVžïÏ4EÒ†ÛVöaò²ë&É퇾¼ÆdƒÒ ÐÊ)º™F®”S¬Ã{vdìÀm,±,·)³MÓ«ìñë6|Ù2EZߊy˜mX3éW!h&Êd£3D…ÉâBĆëôLÞ&ØPµoKLæËð2fqhÜrÄ➇Ëõ]gLV ö0î)‡H_ŠÝ©e§ÇìlÃ>²*«ß¥>}TëPØo¨ï¨iñ”wÂ×P1ݸÜ–Ý“®ù+À7Ù‹† ©8‹ùÝ´›D#Y½ˆômd/ºHÿN°r¢¾#Y½µ¸¸}/ ŸNõQ«ƒu¸¨Aë‡_q1™Õ¡¤°TŠÕ»·)§ÝS×ÜvjcÓvî2˜ÅOZRš Ù[îôzWšñÕ»HØa†µ]]˜3P&b>f]?††;ر²è$ˆ¢è¡huñ{_ çªü:Ò3,ôîB "¨ø½µýQ[6S2r)=¤0‚»ž,_ðŸpÝb·‘ýú·>>Ó8sñ–¥ÜMåQ½›«pÌäê´|âM´×ôÀ¶Ö“¬þZ·*wû4ÉÀQ)ˆú?ø£2¦/- À©q‚“úðÄÇ_z]q븴;œü›EZ<êÎüÖôM–í°^Šç¯× ëš"îÌ;ó½hZØ ZLO@ÓèЛ¬®Aß«ì(7ɪÇǧñè á~TÄÑåÆb©¾u¾' úayèkHÏf5Ç)s!™Ú×”à=ÐÒÙÕ™ÑÅUaò€¬à·V Ãúícu¼k[ó϶uaÛîȯÁòG÷…ßz, _ÈÿÙ|×?Ø9/MýŸ©(í¹ófõð+YM²ÚjJâ„ d.6¿é>> ,êý—ýâÈG.ŽÏÝ@iˆ‚VºVC8¼Ë_¥AC8t(ñ«¸þJoVOPçÖŸuîÁ:gûOj¼:E=ÁE:¿:]y-éÌÛñùK£ø«9—›¢Û÷Ðq BP•o'{§,Z›µzOÒ‹°6UmîÝ3¸ýbÞy?ÐV9ÑÝWyNÂë‚7âú·[\¹ãât%û5´'=žºZ½<à×gwìÕn„]T ѪmIüôF\µ¢)ˆâŠJdP@±š[ø-m íÇ67íân€;‹_Ñ ’C3¸Ý3O´LQx|µâ†ß}‰Ï±.¡H†EÒùéð ЫÑkWC­ íæn„-uYï)P-ª”(RIJxôJµ›³¦:¨l+Ç€k’Õ­yJPŸ\oG |°öðòŠeôP-ž0N_6vsÁñ<ûV]¡23#Q¡7;xß‘V•UÄeyó 0O ¥Pd+Ò ½“äK2Ü·d~ÖÇ<¼ÁûöO¢m†ý€B¢¼h´—õzñÖöÂ8zÍà&’¬?\¡«HÓ¥Wf5í9Y2Ô›gz¿å sy…im‰¶Š©=âõÛ¶Kû¹¨ÁOM¼ô4´™¼“Ø5C1QèÒ TF-Y U*³€¢•$M^\ãB¿³­ S8›Á®]ÈAËä9|}3Ï7ŒžHÆKC1L5Ô`¡7“+’—Î⪈Øxí%8µe¸Q¢Sx>oç'*¾'¼Ìzßzvì1Ò FµNÖ±œsà™þéÞgly:a4ƒ¡ÒRÕÿEß—ý_6žâØìÖ×ü$oaé‚fµNB©H+e*eÒ²”¥û–)% ‰JB³Q+ç˜w !ðs<ÿIt¤'Móm÷†Õ#&««÷Õ¨£dè…æâ¾çö?×7»=œcXKðl_Z˜#+ÈÙš±^N) ”ê$ºr§ËM+³•ß¼7/#mˉÄÃÜ?ÁÁkÝW^Cc_G¼ŽÆº:ÔïjWMjƒôgí26emÌÜ æ‹ø¥9X»FÎqïä;Úùi™¶ÇGx˜o`¥Dô2<:kÛ•M½‡ úˆHÝ›—¿fÞÚ¹«ç)dJL¨»ÜÁõ#*Ñn<ϨтԴݛU˜9-$Ûê< í¿ÿüÜgo_5šŒV°PN‘Q̽äo£‰”(‡}|`àµ'®š: mV ¦sy H/,^»é•m+#¥ò"9àß+¨.:»ã͈3›Í2ƒ÷V›YoÅÑÌ­—¥ô&÷ìë*vWØñÿP¥»¼¶¼¶Å˱UTÖè\”ž´J ®ø{ âã¢cö)”2Èp/©EaTžŠ>yt›Yb;²Z VžžT—å׉+²;ùý©­Ô½ZûA|ö–]»6FGˆŠrs0Q—XÕn¸›ËËΜzûèùC“ËvpĹ…®UƒkN¬=)3+M%¸‚åJ)JjøöⶸöøÎ½eEeùbŠ^ûP¾ _ÈO‹â”ä窋pÔ$¥•[ µ]=½<ýFƒÙfJK‚#©¦Ðë‰ïï‘Y¥v,Y"UJx*RW\™c/¨ßWÓšêmJÂ^¡— жþ«x}Ó‹aöÑI #ùt&=™ž\RRœŸ˜Þh@m&ÒiÎË릳G»»šé¼@ùž&ÂaUwæÑÓ*ˆÀª ¥‡ù®þä%þ2ç/cÙh:ZXR%PÈrû*qçt±7­ÏwÍÖŠ¦¡1 °úQ¤_4×>ÌPÏÍP¬”/Ï_U´!gí‹ ÖŠu¥†v«»2£³oõv«>ø%ì‰ûÝjë³0‡¢GçÒ1ôNîZØÐwl÷Õé{wƒœ3W°+¼÷ êyAÝ{wP÷]CWð×Äo¾¾cÙ|j™Ø{‹q[6Õ§?â[‹ ËU W9µè©›žOؘ+á…æç__sy•ˆGn4ÐÓ°¢Y”‘tÈM"<ç®D]"¥):t9Kॺ-'6¾Qú\‚m×NŸ>vüî €Bà‹Ü“ôù½H¯(ÊN8ÍF;‰H›Ê.Â{Tx!n§R«Ü°Íóª{ÿ‚ÏHÁùz?ÛݧÇ3®ûºþ„tCíîʜވވžˆîm£Ü‚= %;·ä¤ìÙ»%~KAö>e"àŽŠ{ÅŠ‰úd¹ë±¦÷ Éf´‰P8­ ]@à?¢éø¯þ[Ü™}s±Ž¶ ï++ËëʪÇwö vq7yŒ¨€ ܉(–Ñ;/çã~:–¨ÇôÆ$òOê²ÜlqqvJvrNЏ¨¸HRH?¢9W¼ž~oŒëÿÿLÛ?ó=$2;”oLÈG>ŠmñZ¶w¾} 1$×lÇMÇêàåP™ó¹iX”¬˜”G?b^=yë\=Mi¦Q[I;=Q«ÑX8ç*èu¿á¿¶|dê z÷%X³q#õ.½æßç„þß9:жôL[ظó¯@ä3hëÇNÜŽ’I+صv ª+U<úK²0_•Ça˜Àów"$´´½o*3”ƒ οÐm²šì:ä|í®>7xáPLk\Y¼3N·¨Ùt %X?)uÇÃnH-Íø‚4M:Pk‰R1¸xhïPÄ!ËLÆ2î9‚åóö ·­Z*ŠàB¡?q¿¼.Í5´–|3Ûü\ˆÕÕq?=Y™‰˜Ãvù)ãÄ6BB-æs B,Ö•ñÀ 5€žB‘6­ƒ;@4C;ÔìÏ6nÕEc ¡%¡wyó hG¢Ç7ª- ¥õ£çy÷ÄÏGÛ€rWªòy@3ÄôSO¾$,*”g•KäÓ;0œjOu·S¬¼æº^]'žNóˆnدiͦ0¥h7wã³òÑkJ`?Žôß©DâWNGïAãÈʪß,¾:ÿ-W"žÑþ³_½÷‡»<¿«¼w\•Fäæë\÷P6pô˜l£Å„Ãìß{í×n¾w￘Øÿ÷¤ÿï~À{´ÿaC{‘Õ¢eû:Ã<=höÆ„–gÿÏwV¬*ÝÛ–·.™Z‡ÿ÷#aÓɤþ˜ŠÔ"®œÈ¾&G%=±H–§{êé6ÿ·Zü­œ‰tåQò® þiÚ)!Ÿ¦É'-@TÊ =ßÀ^E¼ºÔøÁ‘òFDð^'Z©„7Zìðm°¢h]““ wIîðûâ‘ÃÌ#‡kGŽønøàî¼áŠ ‰ö-}ðžËïe endstream endobj 224 0 obj <> stream xÚÕYtTå¶žC’sUÍ02±Ì€Š J‘–€ú@J$‚H¯I˜@:™ÔÉLê”LŸ=½e2é´I£ ª€T°b/ ÊõâUüÇ{ðùþIÔ{ß[÷êºë½õ’œ³þufÎÞûßûÛ{ûÁ gqçòϬ]¶â±5± 7>1cúôà³YE¬Àâa%a±áLsñ>²îoODÜÏb…wáû0ÝÁûú;ñ5ßþ2’õØ0Áɺ5•ÍZÀŠc­fma%³„,1KÆÒ±l,/«™åcíeaf]d½Ãú”õ5ë{ÖOIÜAp‰ Ädb&ñ±„XAl D‘O”R¢šèL&'¤OÝ^œŸV˜‘••"Ìe¥¤Š~ó ?#-}ðIRjFÆÓ§?sk1ã‰Ðâö“¹·3§‡3C‹Y¡ÅìÐ":´½5'ôÑœ9¡Eè;sB*愾RRR’’’’’’ÚNÌŒÐ"$9&$9&$9&$9&$0&$pnHàÜÀ¹!9sCræFOŸ:sQŽ0·P”’?þùœä”üìñ s²’Ç/)¥d'§$ÿ݇,Á½›5…x"b±”µ’µšXÇÚD¤`±Ž/²N²Î »0ìuÖ›¬#¾ýCCüŒ_Ѳưî`E²Ø¬±,ënÖ8ÖC¬‰¬I¬'X3Y³XsXóXO²bY°$¡' FÂD˜ a%l„pNÂE¸‰JÂCT^Œ˜¢–¨#ꉢ‘h"š‰¢•ØI´íDÑIt>¢›èa=ì0¬òA UÁ&^öذ+aÎð¸ðƒáÿ‘FŽ%¿¡6S§éåôKßþÞËÈE#/ŽZ1ꯣKÆL“0æÔ¥w>|ç§wÙ#çF^dÏKUpæß=f܃ã.s«¢ ï™xOç½Kï½tß ÷]¸_ÏÛο“t¼uBÎO=°÷ÁŒ1?‡¨•¨ÒGT£ýœÌòQcÐ’/ˆJÔÈ™†Ž}Aù™ˆÉ*n£‡$ÄGè¡0ôšÈISåæ@Òž¾Ÿg'{í;Û —îÏîIäùyØŒø7þÀ•£ˆ°OŸqÔðÛŽzè› _ˆò3÷.Q`1ÚÀF{´îRžŠ”JQ¡Y¹m¾r з¤ ¥Ÿ8¢Ð ˆ†ØÓœ®®žº _?·n _A‰™{ÇGϘš™¹déÂ@ ÕŽvDHµÀ°1 tyP43‡<²k`ÿ‘]ožøËi@Ãh4š~5ÈPI]ùÝ»wvöò 7¯-ÍtKµlOàJo䚀æ!†`_G“—9FÊes:ܶVO§½ÎBóvc­¤àñ¼¥eéê­.È¡¥v}%o7Éþò œ‘X©±ÊéXÑ¢Y¼X[™ÕÚg­ï‚.zWNg² +GÀ G/ó®ÂW¾ÝWœ Ö&h‚O–XÐ$5—[Ê4ûúÛmoƒOhÄbîìšÎ›“Òä“h •Ú*ìïß¹³›^К2ÝèG¤?(‰DÐfƾމfpPC2„]öOFä5ÿä@éUÙÊyrRJ±¬lËóÜggÆÎZ:3nW£ÖªAI88ì/‘]Š`.QCÂå»Ñ·¾ë(¢Ky±  Äeÿ ÿ §·½¹ß—ß™’ž»|µìOjºŠD#н§ÑT5ñ-†æ³ˆ‡xyr6&QMªCü Þé|éu»Óêm¥ô6­E P¡ªÐ'–%(ãa3lt$ÔªMj³Ú¨Ú ¢™W(¹EVÍ«Wƒ§²£eOå.è†Ö²ÚìªS*dÒ[¨'ÅO=ÄÛëvæí£o~³ëEô\Z0ªcÑ:4âAÅ~-FŸs øØôÍk/FµÖ÷Tö@´)$BH ;hö5a£°—×mõæ.ÚI½÷ìž…¼Y0-mý¢ÍKKb`Ìt=zjñÞM/‹ÏÍþ DÄ;ˆîyü}f4 ¬Ê-YC™{8½”å|×ÇïÀ!èO·l4‹ ˆŽ¡ ]Ÿ"É+.È’ ž]øÁ—|œ‘??Kîÿ1Üo”DžEØK~|3[9¿tñæiËð߬öY§ž»ƒFf" ûM~߉¦Ò6Ê©wHy¤T­•òUT13jÒbf8L…Gw'^É=®¾§à¬íBûÉýŸ|³ë* p¸2»a¼¹˜k–›5 ]d•Õêæ³ûŒré]2^)Ó$¹œ«7èõ:Ђܩ±®ïYÙ° ï÷¢ ” 2`'‡%Ž9iô‹Ä?r÷0öÂÙz/ºŸ]Óÿã"Û'¸qóÚú”bg5B#<žEq_ ZÁ„£ÆÄg׈ À zòOãð k(šú“æOÛº¦W'šãñôJÊ0O6{áúmÙK7KDXNæD öý~Të'°B.zqÂúni»æŸ€ö£w™ýCëÀµ~æšàS˼‹joø1¤ÃXëÖaÞ~tlP@þ^„q©€x®ýˆm­6×@ àšy†e¡™•Ì×t ÝE„sz_RS®12‚!6o¦‰ Ûmý*OÖ-ö£>êõºí¡-û•®/°®>4ŒzýlÊþR ž«Y†*¦Ù‡ª Uú*€SMî·i;åÖ8Kx¹`MQËÄÅe64Iפ9&÷­Ý]î(q•˜=V/¾Î¶¼<—áÕÇãvÒKw.2-z*ó.õ~O…W ½I͹æÈ€$MBRÞ¶üMúøÁÚ›{ù¯ÔnâìgèÏÂÃo­z}ÙöíéÅ›`L?ûŸå÷Ë÷¨û§dHàQzî³)Ïñ&¼[„(ëÖXd<)ר|&2ªÍZ›ž¶;¡þX™6’Vp*œÚcÙg¥gàe¸X¿÷XgŸ÷N4|Þe&¬y‰—›cÏ6çyÒkrºõ»1°ß£í ï[ø(®Š¡Mr£ª h'Yi³¸ùh;F½SÆ“‚¦¢¢B”ÇÕjµJ5ÐR *‡ÖœØ³Òµf0 ‚­ÏÈýÀ^ãB±^@¹™¹hÎó( #“‹xPj ÕPC£O¨†^³Wƒ h?S) ª ÚèÚצóoN¤Ô36Lbf=~áQô(?0}[«ÖŠp¼†u1hlXuPÑG”[60»Í`Š /ýãQ^g•³òÕo/}sáÛª&»»ËÜd6¬K! š`À`Q€R¥ÒªãâŸÝºT˜ÈUU¨³æ~è'qÈz1äáìóG>êfç^ÁêäŒ"ÂOÂÑÚã}}͸@!’dÆ1îÐ¥”iÔPJ—ÙTÕîñAŸc­¸xüÍO4µP°â-¸Àª¶ªê ¸½‰} ý[-‡ Ô´KSªµÚIL8·´XU–¡•èÄ Z€Öù©l‹ÂÞÒõþhsoÄ6*öÇ“ZÐp±]e·r·L>´ýÖZa;¸:Û¼µÇNs›wºÝïÍ^+ ÚµN•F1óÑIhTÄÞAûp7Š«0S¢ÎK/9sä¼Íáò€•6S¥Y‰F¥P*WnZ»ny¢¨8±¤ACer›JÒ÷§ú“[ [2ê€v8̾™‚ª´þ’†ÔIÇ·vÓ(îîþý¾ãmÍ6«ÍhЬÀ"‹¡XXV¶-I°->M£QiA©è.¨–îIۓܻݡ´*pŸq8Eê½EÍòZqoÞ¾ìvú×68HÄYµjãŠËÔJÎlZG):nûí½ õ§^<ðå6«Ë ÚHAeÂNQu|ObŸ`W~c~wÐJ¥NÉ×QPÞ›R#îKØ»v_ÍÄÝ’˜¹6g‹N=H%°H'Y µ^ïž½þ=½V«Ýö HWFs©g[ï¶]i»•KŠEV Š4•Õ¸‹ÒZ·¶g‹ ßÞ‰qpú Òã\Ÿˆî@ïá&²ëva̧^ƒWí§öìi9'áµä3˺7´¯´­:—\£_­]+§‘—ê^cÐíäExO»wEKŠ-Þ–HûÉl¤ˆ¸9wEt:b>â<}УõÌiØëamáš¹¹åÙ†ìÁ —kcˆÑú«ØšS~dÇMÅZC³¡„)df.++/) hŒ ×’ÙŒ — Ç)Û…cýý­Íp˜@Àaý®ì#)¶¥ŽUƒ†¨"˜á«7üäOÓËÁ¼nj#ÒЧ‘ýæUrHû­š÷Ð?öâõ”©îÛ+V…£Â^åK<²ôðs—F™µŽ ]=¥«È ö¹ó“r¤R{QË“ß=ýÃÓ7Êê¹z³Ö 8Ë<.»õônW_W¿¯»[‡4™͘Z“A- p¤0î”/Ä爦<5#zò|}0T—±rVÐÊÈNLðïòg :‰íG‚ö¢0Š=Sô«¦h*-.[Ÿ¿r ”‚ÌVf¥Ù%FªÇÚ28ïäùñà’¨.ÎÀ¤“í_tlÓeÞgÐófýš=Ðð†ãmë[4[lÿÚô5\ zèÚ/<û*|ò‡Â[¾zä`à[42lϻޡJ¶ë3x;ÈãßNffšjøÆÀ+&e°¤Ey3^e8Ë<|Žy0ê3ÌQb-i†¨z£­Î^}‘ÜChØ!†ïßsµ®:[ñæ×\¬øÃ[(Ÿ,¥R]&qã˜éÏ0Sâ˜iªÒŠRM)­'¥{ó$û֢ȕ(rbË›¸j¯ÒQÖ/¡ÅÿûðbÆöÞ¯·ø¿J¯þ_2fLä{“Ц@"f„ÑØì¾ö kÞ¦êÀVä.«Î¯)¨ÎG 7暵ܠ¼@T&ËÊO*Ý"Ø$N\¦zlx˜ì¤Ù¹{v´' r3Sf½Ÿ|‡„‹ˆ=€¨Ãh$þ@£*;¸îÆVK+¸¡Òà ¦I©€Ú ÇÀ&ÃeŠòâeÙ™1)1YѹF¡“c40žÀ}±:Èeöþì'ö-ü˜ª“Ì¡èŽçîZ³{íî5ýë¹³T ’IUJf#åŠó3´8mJp›Æ]n§Ÿ=gôðÁj·™ÌhÚ̵Úí‹-eLܘ @£ÉRÐx” çÏ'žœâªíŠ*œò6W¥ÍŽE›¸ÕM½–^Œ‘jCUpm˜ ½lòA«Ñèõ“™»¹ÒiQy)óÚÎý`° >pø¼Æ¸ßéCá 1s™<ÖÎ LÇÓ|³µÕÜôéÃÂÉü3†Ù˜Í°g ðÂwønò¨ùLWÍ!s¹¶Ü^^—¹O‡‹óÒcqUz4ŽR¾Š,4e˜ô4ʧàLþ5íI ÖâË«J7‹¹µ¹> m';ÛûøP§¬+uÑèy&–3zvcÂ2ûË­ñ‡øðéwí/;*¨ ÍðšÞÀ=>¤–‡p¦Ýö^€äØ_ë¸p©…ŸDñK=B»tö^¤–ïP=RÄÜãx~bÂ|õ#0ƣÚª5»·\û–äuLùÆ ±/£Ù|¸wa½Ë®eÞ0æm^E¿ÎÄqNQpÐx¢·§©©ÇÝ oƒ“}±Ib”àéTHA‚nmNš(;¥<’!Ù+ê,ðÁm訡 mê@Ó:"¿CZˆÂ§#šý}&CBÊ•FÌ–ëktÅ|æ+ª¤XWÄ“ƒÌXt&ÚG}‚›nðᕹ{69hv`WÕ…Z8M›¨Ï™;½ x³˜œë$ûûóIkø ”g‹ŠDE¹† Wr¹ÑËG©áè>ªÚivó.’ìÀ]Ÿ•mÀ³3qåͯŒ]Èâ:"ºþ¹-µ>J å¸×Ðy…æj>XY(&ý5ø%ÞXÚ -²"ëjSîrôtÄMaf£ ™¾À]‘(õzƒj?šxKŸ{P_­®ˆS Ýb®füff´˜,a6àfk>`=ÙÕA³‹ÚZvaDÓHL‡ Úúù4{¿=לcÊÅêJÐé`'Œ›køè Ì+6°®Þ\ÏsƒÛ຃b–Þ|”£Ã”Fc ™RRkTÎä0V—Óby󊶢0ÚCÕÚ­5<FVÛ4e|æ*dzýÈ݉ï>>oé@³}‘è3þÑuô!2pöyߪ†—éL´m/Òµ™rµ^­ÁÅSOb»M:³ØÍÕÛ"f Z•œ?Èf´ôÓ”Ô¤lീ~_Ïζ†>NÜÃo)bÌUmâç  RºÔ .ÞI’ýåéciËæÇ‰^௃'­¥/ë<ÖêB +H™V-ç+©ê)WK?ϵ7 < /=Ý»Îu‹¯Áí[œ‰r¾9ðåRÅPdÔÙ1âÁÙµ§ºÑ~ÿyÿ9»Ëær¸h¦Ÿ*-ÖIð òÐ ”dO FA£¯…ÀPÛ0× Rpaõ˜ÖêÍÁAF¾#¥L”¿cKf|úF®Z¡R¨*hÔOÕÕýE¿Ú뫆 ‰Ä{šîýÝ;£ûêÿã¡a_sVª#bÉ[ûóšš:7ø ;¯+ÕDg¤ˆqÁÏ}åý¯zÞã³ßíÍéJNÏÌÛÆaµ¼^òÛ÷¯„W3´'9ÐE%¸¢ ’‚Æ=Õõu´‘¬,©*ó”ùRºR»’-Z«†r±AÊËDŸŒJƒrwqcò~î–‰§6«¶W{=®æÚ–Úæš¾öA,Á.¨Ö)øPžY,S®¬HZ@£ÙT}å"©ô І۸ר½i{ÑtG/šp»J¹n¬×Iø¬MdºÒ'è‰ùö8p»UPK³7C›¤Eh¢SÄ™+ŽŠöóÑh°"Žýcš=ÇzÒx 4VCð$¿Ökôò®“^·þ¿…Æïˆtp¾4Þ,¯"Æ}¶ûj+ó!•lÈçi2Ñ Ÿ†ÌK1vðè‹Ô&³É¢ÚŸk ^QqV™]^eˆ2‘^°WZ+;^åîý|×—{?·z³ÇÈ|Ç-ú­å¿ •Ó¨lÐK+J„ Òe>S°Ž«U¨‡”έvi]/r3ßL]øVEÞ“ ·5Ô;_á ‚Å #KRb®â£¥(‘YJ•K3JaTþ¡Œº…¬QÂg¢˜D…Ád®ãyb(!Jì È ò6s(ÆÇæ'Kãq¡_U·r϶C›_+ºàͺC‡÷ì©} Cã´øÌvÿæcók–ùUí'¬ÔþÊ¿t÷)ðX-næ‘•mé¿®AF°Î&úãz#{P,ƒq‹lht½À4Rìk-ºü›•ûûX,ZKö÷—à¼F‘hÔÛxœùäÌ$þZØP,ȤPÌ}êˆÀýŒ†£Y^—^ª,ÕáY,i~÷!>’RÖ®×ú}£¹3–j¢/ØÅÿ†i®Tª”‚v4ˆ»Ô´ìniõ}ÊÜeÞÆ_/”oN]“” ±°ªvÅÞ¤-—$¯Àkðf[×+f»£œ´»ÂTÁS’0–¨eù[·ç­Ç-AÔG|x£òÆ_ñ7Èfh54k‚A{ÝØ*ЂŒîH”†ËÍÅ]8Jrff<ì>8b}ï]»S]<7YI—ISÁgþL•Êô2žšAað ½ä£ðÚˆ×jR&3áúIÈïN‹Õɳ’½°×дOSõ9¦M3HÌD É1[|™è¡@fGd#Öß<6QÇM[LöO:0ÙZá(ÕÐ ŸJ§.ËänÊ\±\‡“Ȥ0ãÖÕ`w7Bª|y ÙiŹÙަá!л¯CôQ4ü¢lUÖj«ÚÓd¬ &ÓDåÊ©  ¶àDânn­ô6¶5µ5¶Õ6sív³ÙÅD“¿Í[ÍïJ)5…™§?QYùhF g¹&ÖöÎáÊN4‚’t›Ô þye`¥m5µyHf‹âsÏ5Ü>j„qÔÈ¿Œ8<’ýœÿØ~û_üŠ endstream endobj 226 0 obj <> stream xÚÕšytTU¾ï«ˆVmµ¯eiu_=GQ»/¢6Ð8*BH€BBæ9©y>U§ª~5ÏSª*ó<@˜0Ë b*¶-jÛíµ›×ÚW_ïê>®wß>h÷ûï­õþy«Y;EÕ~ãç»O„‚n…ÂÛW­yÉú¼ÇÞX¶nÅSs>Ë¿÷«ìbAvɬìÒ곕7ü÷Ofeï¾á îâ=7*ÿñü÷ ³&îஹÿùôíä§àQòãÑ˳ϳ žüRð¢àUÁÁ&A‰ ZÐ"Ð XWt‚ƒ‚“‚w >üIð­à{áÂ[…w ï>"œ'\$|Y¸Z¸AX$Ü&TÙ-ÕÕ¥5uÍÕ¥eÍO–(x£±bGùô;[Ë**žš;wÞS×Oÿ0Xx}ð̼ëƒ_>;3øåÌ`þÌ`ÁÌ`æ[óçÎ f¾>ÿé™Á33ƒ™ çÏL8fÂù3Ο™pÁÌ„ fv¸`fæ33/˜™yÁÌÌ ff^03ó‚™™Ì̼pfæ…33/œ™páÌ„ g&\83áÂùsŸ|ú¥ºšú–æÒÆûV×m/m¬½oEóÖꊒÿã]@xëÃÂ'„Oå¼,(´ ‚CÂ7g—ˆ?ý)wƒ@p“àfÁ­‚Ûˆû%‚;RÁC‚e‚<ÁF!+´ íB‡„N¡Kèz„^¡Oè„AaHF„QaL&„Ia›0%L 3Âva‡°SØ%ìö{…}Â~á€pP0®Y¹àŠð6áRá7³Nç°7”ßøÈ¢µâÄŸ }7}~‹íßî¾5~ÛK·ýévÕ²;ŽÏ^+±Þ9ÿNî®[îúüÿ§ŠŸþçÏFþ½÷žûîý÷{ߣEô»÷MÞo˜ã|àüƒ>$ÿùO~þÙ/ÞúßÂо5œ²õyF>?:)9ŸµþÝ$ÕZ*½›ÃÝü4·¨[¦ZaXËá¡ '8ÿœ×êeü€¼^—†hS/o<¦{NÃGáËmNà—/â…øn|w$Ò›€(’ŒyY…’œw€Ýáôã¢Z¹_™ÌÁi²"kwØÀºt³_;°:ü Ym‰n©ú¥bnÕsÜrîANÊXô ˜ÕËú¨ˆ+“Š„q~çàNÀnøKý_W\f=V¯È:àp [qî1áר*5XØ*`‘]Ìøl 良½qÚ%šœ ŕиum~_s7×´·þ…7…äþÕ×Òz[}#Ô¢æ6EGßP÷ %Ét(SÍ”äˆ|Á6}îNÎÝkjmoýûãä[Þì¬ì©¡Ô¼Ý¸}wA¦Ë T=,X@ZÆ¢¦%¹NsÀá$ñ& áL8¾W$™òr .‘$×>þÿCw‚–xCf§™ªÕ×»R4xœ§;|069ˆ…Ùe2§ ÜàF~Ök¡ôÀ¨,æ’ü …¯2z»Ñjd;¿Ýc°7Õßy}·òs­fp$ƒ'2³³ç%üÈ%éÐÔØÞCCß¾‹—œ¼ýnó÷Qœžãn¨ù…UaU€ÕF«F?Ã’Á$3ªµX-Ê.vZݬËê&{tšPÞæg7j,±8¾¸ˆŸÅb@{÷U,¡»qý‚_®Ê/{£¡°pÓæêu-¯:llˆñ±jô…Ð_ׯ@’©nU¯¾>‡©oÛN¹¼n?øŸñš)›Q¬¯XµVÚþÕ`£ÃdŸ9W_ìÇ2³¿ê¿ÔW‹ï¹ðnçI ‡oÿ›”ÉáÔÞ‘éh3ÄZ·¶—Í?·õ,¾ ßuKh8Ütx]ûg#\€?£÷6œy†»ñþÇ«ITí¤$xϮݻI¨$LƒŠlØn·’8}DT[[YMI8“J|õíï>Þ7Q¿Š6ˆ™'×ÿ‚X©EV°8­€ôf‹Ž&® n'YÓ%:2Z¿–›µœ›ÍÝX°~ð}mûÜâV¬îÏþI.Ì ’R_Ê“ö¦zþ&s…¼ˆ ˜1ª¢j€©µ6Öp7Ël:Vo×$JSù$¬ÈBV`ø!L}ƒœÆyþöh?t 6}PKí¦ÈZ¿‰{m!÷*wwZ­’·˜ôŒZ dò›ýT ’=OÒÓæLÂ~Ø¥Pºn‡ÓÆÔæ°:lL­ÌTf*3–9XY éüÚ5 Þ_wÏÿ”9½àê 8G Žæ C™@Ëm›Ö¡á³dÖÕó¯8ûL­ŸÓ?ûïË?”Œaæï/J-v–øý¶ •ut9”4˜X£ÃÂÝõ}\f,õ4¿È,2‚Ýf5"Fì4M[»D’ú$$ 2®ÁÏaÞFžµ‹¹‹k]ZÐ⎒´¶“‚ƒ²y\…T2fà–>Ï¥8 «H J§ P¾ˆ[‚ßE^øgÙ!Y ›íÛ è¢nèqt›Î5 ,‡Wø;]VfjÇu¼(ã$…òƳغSrÿ%»ZÊýL÷0w;p÷¢…»žøŽº_LìzËívyÀƒ¼æ°™²‹ôVM½R½½|cã@kZ:~;I{Àëpú/ðâŸÐ’lÜHI®’jAr‘’—+M~tê÷¿4Þ^S=‡{Ô±Œ¾¾•LöñŒ?y*~4'ûÙC‹£EÍ ŠšºˆÜÛDÆLÓØú\)wÓB#ÊÕíÙEù¾‹]oû34 މ¦ùÔR(}R—ï°ó1n[˜Jƒ£Ë‹Œw¿uPÒ§ÓÑPP¿A]¬)PAZÓ—ûŸTPô©wÿ×Ýï%öG„&=o™¯Ë¼»šúçÝ}Õ-My“ è€8Vx‘ET§llØ:©¡÷ÀP_ûÎhe_Å!¸GÞk?3ç~äÛ=V—ZÁQgÑ*‹KßÈT© ¡3ÐåíÄwÊbÇSŸ¿ ¤±01 rˆ•¥š*¬mïKötìË‹WRŰ£FY¦mȇ— oYËj»•5‘P# ÀGutû“m{w=¨?YSCC Ûji-çî“i×k¼ÎQÖ§ ð¡ûÄñh{kv)iU\% xý>¿o´_vtòèääa·Ûí%n&m‡%¸¦R¡),ݲ£ "‡ÌdU1`S§<¬;?±ng®‹õ°^@>ÇGú¦.ÍDëŽU-Bø‘»Ú"ñd<>::1Ö?át9ùªN>l¥ oÒé7n(^_ʲ¬ øúãÒgTA}guGUºÒg4EùI½¤M 6¬Ü+ßÓ8þ¯[?‘]z­Ã²`ˆ¶úu]›z7 ºXŸÏ1XªšTÚ …k7å[­&>+­Òf¢€ÓðyO;wèìÉ!™×ô?9ÅöHCJ—(ßY5Q»Û˜ÐöëfºîýÛø…XÒomâÀ¶±éü±¯­Â´ªÆÊʪªê “I©#"íÃG¹DAèèŠE'÷Úux±I ~‰°"aŒ6 4ʇ™ˆ©“_Âq fýCá–¦‹7 ý]Ð?[RŸ‚bµ³f²uCÈ R¢t§CEƒÕnq°\î.Ÿ£¸‡kkj·2‰ZÁ¼‘«65oÒlœN;2ûl~* ®¤?™>œyëpÏ`rÌ=iH9R¤Ôl¥!ãÌÀ8œ°§Ëjh ÔXêlµqL+YÃΤo·wo·gL²ºT¨¹Ù•¤Áëò:½X’õÉ¢“Ö¾K€Â¢¨ßÝF;ŒÓ èûj±©â_.’ÚIT³*îöïÍ2¦ÞÝXaEÜ'"»ÓîøÛá(þ~à^7…Wûº#;$Ï ø ‘ßÒäLŽë–ºÆ'øË~<Úï ÅçðWR|Ldnf›,M[¸Õ$îPÈ(Ò3V -ɋ׿u I4qˆ¹ÐaQbNg’)Þ”Iò}¤€ñ¤â „hè^Ô}È+v¥ýio‹³E²èakÿ%àË û°ß°^3] ¥¶R2S°ê NÔ"’Dm¤Q’š§cMúz™OŠÚ»xª«ÞÄåÉì&‡AÇÛÈIÈ‹EO$NÄNÄŽ‘eÚ\;µ‰ ä#èD6‘t­'­CÇ/H(Æ©p"9YÐBz3A2ƒÕd´¸­AºSÔ‘±Ëi›œ‘³ îÆï×ËL[ÅÛ,zyMw!ƒ]MÛÅ’|&@jˆdÜNßÎ%QŸ“˜PZDΞöùµ‡¨:ìíÓGÐÐE Ô‹\b{®Ðœ+óu:=<—Íúì×Ûy†|~š=3ÙÅø¼ÔÛn¶Ä·%¶‘Å27ãaœ ”¼Ú •Èì!Ü$)&e‚ 99aFð9ÑQüΩ¹ŽЉ$Ò…Äàuº½nŸ øÚâB!#¡JV$‡зYöTNÊj>¬¾\Ùæ³†H޻Į@Ðïõ훜8¸wrbÿž©s¨;c…vðÚ½'Ò‰ª Ê^E ›Û ÍÎf)ñ‹EOCëîTBMI¥¢µ¤¨¤¨¬PyH~PqP½Gf#¼7]? ó ;àöº<¤û"¸Ê*j°×: JÜ%`«Ív­é/<¢rªØÖî•+ºV¤òdn«› )26³ÁÈ0dÛËKÊ·o,Ê_¦WÛZ|¤Z]VŸEEƒ0è„aì ê̸ýÆßG\’)ÖÂd2éxâÀÙî©Ý‡÷ï'î¸aþósœ¤°ô:¯¹›¤É£ï“¢v±CmQ±jîÎï2¦Ji&µÅ Òš-Z]ô?E¾XØì2Ñ­"E“3A ÓëôØè—ÅŽÆ]€R¢ˆÏ'¨>«›ØUrDK ‹ÖŽ6Š,H”J2uPç¬s"…Hâ%›§J“™%‰zÄœ®ud3j>U”¬†»ã{‡ÌÒµ¤j(Eƒ3HCÈw‡ðÝÙŒ,0èJ#9+ CÃXxW`4Mî]¿´¿=·’DZâûMÙG2Ø/þáNžÍ!ê÷ÏRh‹„Ú;Ž><ðÙ!ü°|òÏN>Y‰Zc\|´kAiÔZçUs³ ¯¬Zôrw{݆­º­PŒžŸ\ô~(Ûgð~öõ¬-/.¶X kF8¸]jy½”Sr4 Â;OÓ~±{40‰Ÿl;9¹»=5ïtp°8&FfÌöÄõiü\föÕs˜¹Ð2&ù.{;vH;¾t¬»­mÐáµC+¹8)'âž `Áî'qCÜ)É~ ›Lþ ÎmH Ž'¥æ7®\h㦱?Lø§h|‹hô¤u5MZßü¹º¯¥É+|ò%ñêw»öË Ÿä~fü%ÝJÈ[?­›;J¾4µgí é/§qÑiÉ>|”€ìzK~ÓöíFc“œP~Èëóû”‹ßâ"}ÀªZ­¶|GA-ɦúøÞ¿Ø~¼ë­ž‹ûá·$Z˜y=DGIö]'ïëNíÉ>œÆÖŒðçñÑó9Ùeø©©ÇÖ!O+Úš}@ª÷8ó ÷2p9H+öÿêøê+ðœ»4~nèxûé¶3±Ã‘£p ýq;¾Ÿ»»æ×úV‹Ç: ;®P€h{’5I@Ÿ'9á4ä*7˜s‘|£”yú n‡­k<@GÄ®à` ?q>óÉ¥ñ˜?é%_9Þž·‰3˜¯9vOÿ&Þ±D™´[þéfG%ãyar·ö!îàîƒÅƒ_ePDô>üa×øÛÿªMk²ZK7¾²u%Ñ&Š“S‡‚oµý“6ñà£%Wmêϧ$ÿ³6‘\púDŒõ6”Ïážt¼JÒá†ÛžûvF( ñ÷çpê\ÎwoJ;\IèFI]L^£ª­_{¤ö õ \ùxüóp{¨ÛÕ…°PdSZ¬r÷ ÌÎØxŽ#•ßO ‘Râ ¸BSx£Ìtú#€þ‡ÈÜÈ6A=zqç¼ÿI]† cS'<^ŸÏé#M+`01ŽÖ”¬Ú¶ж’þ‹ÿuâÛèAèÐÄk- òmEÒ˜H t¿¹®wuÌ{¼rÕl·…ø°ÈKœãI´!sÜA ¯¿ë€i´47< ³é‰üÖ#.§_ôÑÆæR‹`ù«•+ˆÆ ŠŸà¹Ó0ù‰¬ vºýÑ®Tg:Ý—e}±@£u/>ü:WÌÝA×BUÌÔ?#.¯¹03waËEÉ7¾"íêLö¥4!mU³ú:¨AK.V½C]€/ûÆß %üÄxÁ´ëxQIþó`Û;Cp½÷dº€ú5,««ZÏZ-&0“é¶øY?D!Ô öŽL¶ï48¦ßJC©²¼^QÝZ;HÃ5:tT` ]¿« .‹$߰޶ÀfôìK¹/PPÖ¾.,f$èéœìoJ½¥;ëÆà¤ÿrz¦ÃËϸªâÜýÄJ¦#NÈßíëœÂù2wt„hƸ!¬¡êÁØÌ¶¼Æ…d6“Ãd3ËKŠó×ó„^à7î‚1øtïGíº„jè`åÀ6"ZËç«7Ø Ø“NÈøm~èÀs.©1ð\:‚  `äUãKe/À‹è•É‚ßPã0ïíüÁ`àŸÏ0ÐW‹Í&yïkÉÇÿ?ženV/õÙù{>ÔÛ×ÝߥŒÉ·Ê·•­y³ú}Þè9áòzxuíe}"(mjÖˆ$W¶®oÙH¿5¢¹~…vݧ VI÷ÙÞ¬ƒ<ÐXÕv Ò‹KÒkŽ“Lëû"|œô0!HŸ•4ß2ˆqs–ªÊv´ÑÐêq÷òÝ÷ýE]ëy÷›£˜þœPWÈ0¶Øä hFêˆ&Ý×ÖÝ=^ÑVËß0æq½Pì “æ³{+‡ˆY ç~n¦ŸÝ€O<8–:;JXÉ×LX¤ÆTÃÔ­æœ2›ÑFâ±b—6ÂD`¼}þžLËÜ1oÜçÝ|gõ¯M™V,ÅG2³%ÅWöJ;»ã c¬¥B[^[¨£ß…© §^ ±ÉÉÎ=Éáî£Ã€º#u-4È™V«‚¯JL½±ÞQGÒi{WþAê ¤Æ§‚C2"„®‘[4CI2µàäî_3­SX·Å'³úíQR H¼ø;wãd¾L ÚÑdÁ@µ šê5åyõ¯+_—/ÓÌ}¹’T>RûÚk#ÕtÖ•Ÿ/6e­ÙÕÓ ZŒd_’²-dG-¹™vCó+ëc'¥U‡24_3’Ú¨ªBSU[‘)£wÂÈP¦kÏÑð{‰wÒ—gì⹫ÕުآĢð"·Ñ¡ãïiº¥z}0õÑÑK‘¶X[(E>ÆÖ›, ¥Ü£2VmU;T$%(ì)›²|‘χ§OïAžiäàT±ývõ+Û)¬™W—·Ã×ù.|nýƒ&—™Ò_çX at}µNùú¼_ÏË}ʨ5k :56b¡ yŒ¸S­ðC¶ò%r\˜]Š5R»ŽÕÙtÊe2›ÆFð •LQÇ s2¶'8*syœ×œâðZ|ÊZmZc©jٙʜNñÁ:àï;‰u2‘cvÄ A-4IÅ45>|ý‚qkEÁÞ@¿§…Å“Õ{ò5“¸düv/‰ÔåN„FÛÞ…$ø”.-²ˆ¡\¿Ã\‘Ëiev³ÍDT¸6`ˆÙw‚gÀ×=ÊÜG8ú_L'ÛÏáèy¸|»¾KË H³ædèÅñ§¿¥Â"|Oô;ü à»ÑåÂ+Q—¹¥Ì Ü Ës[uªZÛr|?"ôç §~3ôñû!OÈr¢3™ ù4LƒöuóEˆ¾Ì.ÎÌÎn:%Ãiü¿¤ìžªQ¢Wžkâ( (š¿ó$Hª½5(TÉi¨g,ù\¡ŒiÐU@#Ò„ô ª‚žŽã¸A–|÷ÄW ІÌ¨—«^hZnj65B’Ôo©ÙE]„±+±Ã׳Ä%ö›I)U[mU"ɘ¦¸iãfкØ(iO£m#ááØXdgh§¿ÇßCÄòù̓ëü•ï(â­ö·œ·˜¿Êx·ÝìlÞ9‰ç‘:EÑÒ±¦q@xÎ8÷» ;>GçCqye™uwE?Á÷ù î 'ùG“w0¾'üÅþ™jR¢)1•Ìãþ&³Êm zµÙ¬ƒE¦kŠX7ëáE¤|•hìa^l;ù8û†`Ø6DÔŽ—¿ÿèZÖdë"~‚+þA,‘y’Þ„;‰pG¥¶í¦í†RÅ’-\Îs€¶ÔŸ¥=b'q–+4Œï•…G|ícéÌ`ç ¿hÂÝì,ÿÁ}×/»DNÂ%'ûtöi£½EEF×&“ƒ½srKçÂes8!÷ 'YLâ‡~ÞáÁ(œVóvÂÃDrkb­ÊVÙ¶¢U5kf¶¼¹—‹ƒ_ŽâÅø¦>ÿts‚N‚IdáœÇû<Òš]’f7ÄNådÃø;©Ct*¯oµ¶î(+¾DK@õ€©ÜÁÚ­„ýÍ|‚ühhBi_«‚†k«¥u9×%³›Hv‘:jŠQQ§Ç—ôuÇM²¶‹§ùÛîÁжé¶K ¸5¤•NyMÄ£Á?èí>Š«dÉ÷Î|ú¡ùDCÁÒ¸YK¸›`5ižm½Õ{àú}à-âŽiµ¥;Q~Úm¿.àïÿõ.kž íKûS]L|Ð{…Ãk¨\XUV—w½rE¼dÚîÙÙ»¤Š§ó¹Ÿr³ š"êQÔÑÕÖÓfˆ6ÐÕ}ñÅÚcµS¾ÃùžÕƒgýϳc‚(fˆðdÀ´0„ 2íÚ‚U„"6êöÒp²ýÍÔ±ð`¢FЮ–ñ7¨—¡â?4›¶iCN?ËðIM´ÙïGÉ QEC¥¦ÊPÝ’[¿’xé‚KÔ~J÷öò‰Þ±®šìðàS'‰&}'[q6'{o–&ŽÓõV¥ª¡ŠjkVþzë\x ½:øÌ§Ôa2‹ EÆmêW  4Au4ñŒ»- 7&ZêM NèG¨ï`Ïíø4]Õ£à³î Þð×·ê¿üº¶UV—G?ˆ]N½ïŒÜ ä»Ö„¶•U)¡eºù÷¤»»®Ž•QFw³NÏ=ÕÂÍr>î0"CžÈÈn2n2m6m2•™‹r Ôº&M31º|=ŒBb ùÒ¿ÇwâCnÑh_a-ÕR[…¹Â\©X\‰_0'—Õî¢OÄîÁ÷ËÂÇÆÎœê zÂÄ'h"¶±ìGmLáëè#è–:ÅmîX’ä­Oœ0Æ[ë Ïšú¨°§?3ÑVÙ]z.ÁÉÓÝg=¼ý×®!ÔZÖ ÚXðê*@ÛåCÄ·ýÁþ@_/¾A;žùÝ ¸nM’ö¢ÔC´$ŒÉžTwç¾µñíÔ¨­ªÞ®ß·¹»ÃkË[‰”°ñ—[fþyuQO(}h÷»oOW–þ1V™k븙æ ùs/”~•Ÿ?ȼKë¹­x]ûõÇCøÌžœ,uXêÛ1ÐH ÒáxÕ‰aIÙöMXÖÂë‹—å³5 øÆ{ßq‡0¬ê‡aÂq®¤·Í“tþøh†u± ã¤n¾$©`0òõOáõ2_W¤ºPÜQQµ`iäƒ=(Óåm~„h“|²÷JÇ%YŒðï¡Êþj9Î7ü ÿ ÏùÄìè \]c¨lÉmX «ÐË·ü†:#}C?€~!ƒkHuz—Kíyi×ÊX<»e¤d’¨¥ä·á‘ë”ò/ßbë!?&òúM¬"Éê òÉÊÄTU–F‚L£MתlUÖéê  l?òŠagfFÉÀº§¶¯VCõKš<»™%ÄŒ~{€ Çã ø:e‘ÝÉ3¤Í$½Z ÅuEP‚^?Ñt‚&AÜ›¹^_¯öi!õðYi¸Å¥LkRÚ.K'ƒ·Fzö†Š:˧x9òÈu­‹þm¶«m©ÀÚf~†”7íi;‡ÓD+áBq]HKD~ƒÝÜbmZÃidê•Ë—,#!jé£a":Úµ¿výÓŽ„! %©ÆÔYò¸­¤!ÚåV…vëúÜ7xn4N ÓQ±ëpæÍÔ¡èH´ÆÑxy)µÊ–+ÖN›ÀŒL^ÿ$Ä•ñ$b{ºNOòw·»Çè2ð„¤däVuÓ’íÏ)óÒÔ– Ä¡»÷ð¶˜ûük|𮿖‰ÿq*{rÏ´I‚J—:®I+z™b’ƒƒ£»Qápí8Õ©pâÿM8Àêc( †þèp ÷fenÞ"Aˆ2a­›T“:°´˜þÅ€Ã3܇Wòçk}\OT`5°›ò¸™UÁÕõŒ¡¹¢¬ºx:tÄŒa±ûXúhÛ¡Ä™/áM@ «¦Ö‘òŸ?ײæúÓsÐá£ÚÀÕéŽEÇ;Ïä#‰ [¡®4Tµä6®‚×Т£Ûß!Õûðд gî ’¤Èdð-Ä„ÀÎ]98Š{¥þxXû«‹©— dž!ºWçs.ÐãKDÇ»O’h„Œ¤W×ikLõšÝ6ý6¦ÑÜ î{7¾èë«¿ÿ¯÷6L­¤¢F[³©U‹ð/K™•uÜmϲ¨D92LûÄî=±“É‘XÇî¡1@íõe3·‚¸·Jëí¶F¦ù5.,cµÓ‰j»·ŒìØKªjìëè.'ÿ\ÅÃwnž‰\%êÆÒ$#𾢌ß©ýcœgf"wßùçývøAÌÎØáñS¸å½ÄmÒ`oÛáÊcµƒ…Ô‹P5W]@ìÀ?4û§ŸßAŸ/N¢öø´LJ¿úZs“ºX³U_di67k~ù^õYøÚ‰s~E.Ÿ|‰*]u3¯.•š_(yð@E}G šû®ìýã7€Fv5çÑ0}{6Ãs3—dÙ»ÞÍÉÞ†}Rî)‘ÌN ³ôõ¶Ôòz×ÌI­i9>IL¸:Šïÿú@ÌõÄKçýKkç»DC?ÅJrŸÄZ©C¼Õ°¥B±UY¤Ÿ·NIÓ]]m}´#¥ ©Uh*k·õ4ŒÐ'àà¡öC6W&œìÙªÿ Ç¢²)­JC!i2¬ÆÁÇnIׯCÿOšÃf·™ª„07g%éÍl»=Cá±àðÛØ's^¦‹ÇDI>µ^»NÝ ’œçÿ&E hwGÓÜ g«Ðߦ¥KEµ›\ûhOíI!ɧ‘.è"~5=~ã­òtvµ7C¢SĘº9'üâOnòÿäfçOnùú惷PÏnÊ‘?ËøþûÎÿ ü}‰ endstream endobj 227 0 obj <> stream xÚ]PÁjÃ0 ½û+tì#NÝÅ6—€YÇÒÂ®Ž­d†Å6ŽsÈß/vC;H §÷$=\œ„5ŠÏàT‡cuÀÙ-A!ô8KÊ ´Qq¯rV“ô¤à­ôrB(Îïßü­yäm+Jút½4å47ÊeõÕ^‹S·Î'aŒ€âk›8ǰÂáU»vƒ±#®¼ËH·xÿ‹Ú”ÔuWÞnRNãì¥Â 툄QZkšš Õÿz»¢Ô „U/“>ócæîhR%w{j aÛ›Ÿ¥åÆâýOÞù¤ÊñšÅm? endstream endobj 229 0 obj <> stream xÚ¥y x“eºvB°~`)êøÁ%_EQ@@À3rD¡²É¾#PÚÒ}OÛ´MºeO¾äɾ·M›¦MÓ6Ý)…²hYÅQ ®çà(ŽÊèèŒsœ7·sæÓŠ:ó;ÿæ:WÛ¯W—¼ï³ÜÏsßÏ.gòd—ËÙ¼~OÜÊÕOÇmܸnÑÂÈo^ÌÆ¦¿tŒ*î Ïá„çrÃOO Ïã…œ,øøÕÉ‹žô(‡Ã=u_ä¹czä¹ø^òä»`áÂÅqùBIafz†(vvòœØEÏ?¿d^ìâ… Ÿ]‘›Z˜™œ”»1rTn’ˆü»=?93U$‰ýb†H$\úÌ3¥¥¥ ’r‹ä¦/›3/¶4S”»-µ(µ°$5%vu~ž(vSRnjìD L|‹ËÏ‹R c7槤æOgwï$šÃŸË™ÉyгtòŠI«8k'mâìâ$EeNOâpµ\–«ãê¹À5p\×̵p­\×Îup¦s¦qåÜËaÈ«ç<Áy’3‡3—ó4çÎÎJNçÎ*ÎjÎÎZΫœõœ œœMœÍœ-œ­œmœíœœäžÝœ×8{9û8¿"wq&sê¸Üo&‰x/𾜼{òÙ»nF £¾ºû •6eò”™S²¦œ˜žºnêÜ#‹¾'úÛißÅdÆ|2Ýxï÷ž¼oõ}½÷'ÜõÙÄ<à§çürê/‹,æ/æëf¬šq󡜇þðpÊ#¤7å«¢KÉ'W…ï[…çåÈà$·o‘úGµsû/üæMò†×Ñø¾Ü¹ø—€§QO_»¦ÜD‹@Ÿ%ŸÊHØò¥ü¾¦.Aøª*}R_U Pš¦Züå¦tûnW%”õRzâfv¶nm¢ÜÅt ¾m'ÄQëRñ vìWWzÐôp7Ië:œä­ 9öqŸC{ŽAz/ü.]'i9ü*„ÉÆdFB(kÜ: IIµ…@‹²k,* ij(3Iì3wáÅxà]€û,w¤¨Mf„Vyƒêp%ì§„â”4AÝ%u*«Þ J£ÑªäGR/¿:Ä@¯¸Ai/«[·ø^–[Š’zaê=ƒbPÜÎR.ºÆVè³¾N£dåš(ÈlÄ Îic?7üÊU^¸µÑ–:“‚ÔëÉý/ ^„Ý»‹24CIm Ä) ‰$³j3°”Ü F «ßû¶ïD7PÞje*%¬¬j÷V\Îg+Ô"ÐP’jEÀ uv›Ï`t·ü¿å[ýV¿¥Ñhµw¬&Gè|gÐ_ª?ÔWf:È“qÔX"Ÿ•’‚ÔQ.©W[«ÉEìÍ”ùÑõvtÝÏí¿†:¯ñÂûÂ,}M‚˜Y˜Á p–ÌożÏÐchêC"¾ˆ¥½W}ö½<ÙsžÔýIëúm ìUî)šM)²iY|És©qkR÷&•UÒúýÖáæß“»>¬j]àã†<4ŠèÃ3Oàùµ¢Úb'òG9‰ÿ`“ÎÈšå.uʇÃ×ø%Ã;=ûIšª@¦´ë L‡Ú¦¬ù ø¸¥Rµªf”UKkµàpÙ߃)œiYˆj:Ýòá'mMçxhº@cn\ñ|H‡}Á|#Ûžåíç“ UG‰$¹9‚Èj’ÙÕæq„(u*­t0ýüåþá“ œH«“Y*-™ž*K©½Ô^bÛÜÄ?P—Û ýpøÐ'õ÷TµdRmW`)Œò MZЬí 0:ßýÞ;=uÅÐ8éæC SEP ¡X‡ÎÞ LŸŠ~üGT—Z+ ÚØÜ5/À2H«K:.¤ÐÔJ×’tAçO`()ÈÔK¸™n´úÁÝEþý„R+ׯƒ ±“à¼!k@æ¢OOòP]x îŠÊ³‰°*@hÏt&Øåk¨ó1`£º:o^‡´u¡PT”§:›J@Ìà[QÅ û3R â >õ p ì`4[í'ߎ”íPT6ž¶OKZ¨¬ ðSQâZ¥‡´ {‹»§ú=§¨HûËi@Æù&¼r„×WÐ?k¸ëŒ&‹£=D_r»ð8éŒSMP9ç»uC+™¹0ó©\Cš3N¥W•è`Àlñ™<-h²³Ûßwäú)¨žö¼Õ ìÈÓ…{³6ìËN*f”ÁI hEänTáã¢É×,ÑéÛ¼pÉèBÚ`6ZÁB9U á+½N+ÁKÿ:‡¿Ü‘Ú׈wÍgQ¬Ùmó‚Èîym^ž¥¸SÊFKmðw}­@ٽ͖UX•±ßPóÞ?ø¥ZI²r++]J:ÀxäŒ`!±3­Su/šÃï[pûχ5uµ9þOH×=/¬.+,,(@•UíPºdØëw?Ÿ‘þìâõÓ$œiÅÇÐÖø9Æ 6<§Rº£²š€j>¡¦ S*Sº´2‘»¬ž´§K¿ïþ-)ŸnèËw)†”§ÚS]¿©w ¾sÖ.g ±»ÐÌnÉÊÞñÔ«C›¾Cüó·j¬³Z V«c+EEi˜0Ú¦çjÓu¶ ^j£:|MČ֥4„;}Ü›aÄ]ÖÐn«Í.Ê¥pÈyë J5vWóe¥†„Mj׸4áÈ/<*#é””Ëáp1àRY¤Ö1?2ðcÂ,65üe»{>ü /¼~t?mñ€™h®ñU bY5þæ¿7òI7Õ‚ž’9."%L6«—úk˜vYìpƒ[i‘YÆN£j~•8”L¡1 °¨«Ua?6ðÇÈ£R¥QƒbÆø&~aÃQ„P|(¼ŠÖt7¼6¥2•êbJmÑØÁ©¥£«=z¦Õõ.…AňŒEv‚·Õe¯~=ÀGæ(cI5~äTîn¶´R¥27)±ÃGL‡Wä•nð¹äPÅl°±­›Fïâë|`.#úC«RË),[G£×ÐÍv|ó®˜Q=1éš qÃÿõýÛû´…bÚòžgMê´BPëU¤ChL*‡À«±Þ‡VðMA 5fŒ*ý>==- aÊu æ5óïäYbi${áÚ¨F"¹lµÄÍâæåê qGÍáoiG·ÑyôJ;– X&?ŽÍÏ{%/z¦Röó©×±U›1ËÇÃQÔÑmrŽÀŒÿù« pðCcw,”(&0δÀÛ¦¢%üzò~QöÚ NË'H«Ñb°þùh8* /ÍÓVȳÅú@UükgÖX¡Q.©Š©ãþ›œÕd‡z· ´LÞ 6/wenôLUÕ„ýAÂþD[êt üðX7_‘ÆÊ‰å¢‰[MLëuSkÛ¶è™ä®z·Љ Ò@©±Ä¨5Íb7Úµ|ºØM —…¸×Ñ$^¸7ügÚÞatœªÖõµIÉnb ³–fEÏTHÉÙvhfÉÐ5±6–ÌgjJ§Äw%ð‹æ®Ùµ›°ë.gù“ž ¨CÍmíBg™d¯tÍÆÁý0ŸÃŸ®¾&ù>:áì(~‡vöÕ…>4Q·¡žàºŠÉÊ`³23ÈêÈN°3CzW á-VW¡gñä±­|\®WÖé "˜Š*ULÅrL$‘òä²ì¥ì µL/&ÍÞδw™::»;¢g’fìs* 2f«Qé'Âf°˜\ˆðÍjÐYäÈ8ö1ßVfÒ9HHuÔETsqÃècÄTŠÌ·'ßï7õÝB©2õ˜•‚‚‡Ò¨$C"{$ 6H"OcP*éxQÔ2çÁ 0~0öW¾©ÔÌz –)»‡˜˜Øô½Í O ÇÐ’ž¼àRôSð½ø)üäüsëÞg|pÊ|ñm{RWÖ è‚ÆÆÚvo·çiN°¥e+Ë^•l9”m&âÒo´»ŽºúNGo7ŠåÛZHÒÌ”Wê,AE1[L½ŠÝ´FºŠ²„Ëóz­òÜ!Nµ£éÇBzú€z½úy5C€ Ökˆ+ÆíDiýÜã‘l„‡”£ËéH^"X©,Ð)õ2=H(âlÍ £J.•"SSò<þ€/}M[Ô¼Á7H÷ŸN$öŸízóA<ÌËÍ¡J—ÑDR®“¯Ô4ÕÌ]ÏÀ–,|·$5km|z P™YÁ )íúÚ+Ä’WÈhÕy«o|‡’÷/¾—.'­¬,¯Ð•)\T'«o 6õÜßó ~ψìU ¿ø'ôøGß¹­dÊD L­|q6æö§6O^dà°ï«ÎË¡¡sGÎéß[U-$Wyp:’Ï+`ž¢Œx¬Ö@Õ³¥›±|"3þwùk2ÚÌ^j}õ¿˜¢T¡½àçAÞÚŒÊéV¸a<ÕðV›åTSGS¯Æ<üô\7ë‹¿ÿgyIñQ;nC¨æeõӇмo#™9ÌË|ÿdb•d¬¿†Ð¬OëüÜÁÏѯ?ç…yá'è£|ÎqåPÆü{TŠ27T¿muÏpÔ{kˆdj†zI‚Vž”¨NZßÜêï=ßxP $¹³Õ%¬¼ßO­Žß¡“kQ/1’¹e wà -¡"qÝ1“£j¨F‰[\WœzàhÑaÁ9è»P×Û~¥M3D: ØçþÍÇþðL?÷ú/œžFJ³€m¢ä TiÓ%=ÍɤڢH¶bñ³/ma.ÀñãN—AÏ/Y,=HxQ‘9û12fòmW3x©ZY½°8[’|°§ôKºFÞ¯¹H‰ÑnZ] *,—Hr$y$]gúÈPÛŠ¦OOéëêZõR éî$]Z*}5®_~Êýðâ‘‹<Ô3zí«¬ …BquYSc[c›`ùX4ín£3h÷Yª¡~| šŸúÑí¾¶¢U‰V®,8€©òDyAU”Pû;3NÜîA³ßXM…dCÖ¦=„µUÎFÖêÆK$jϨ9? ›Æ­ªúå]á…#fÕWz‹D¹¢ÜÒêòÆ`°9(Àñ]B‹—ïÛ¶Ôdº•8Úl!¾ñÐ敤'÷Ÿ¼_ ¾þ<<‰oñA5OCI]¯ÍÚvÇv öúÀ¥c—/U×i“±2mÙDÝ¡‹¿uW:òÆ0”}ÿïvÖâYc×µãJi†È§q©Uã°º-Ž´Ñèdÿ³Ö©¤eå:©ŽLóÔ–¾ä3d`Öú{G]çþ¾KWŠö$%®ru3à57škÍ^^'¼¾¡õ9W¨®½½±éÄà±#'É o£Þ­#ÒLmÔƒÞ¨£ö±ŠRå.qÀûP›¨ã€ â•q/d¦¦$§VÜŸ–ùGé~î±+<äúÇÄáÇš…2âØýc,+Ó© |ƶ£Çðy»ëzÝÃÿØBÄ[˜s¡½š´ƒÅROÅüeÒ½ŒN¿Xs•wëýÿ]x™½öVƒ¹&4øÙï€p¤e1P¨ÊWææcŠ_º\[ªÈÍŒñ—‡À°·WŸïAO:™<ƒ(qïlǶ%á¨Ò]Š"-QfÔþ®Œã~OÚ¿Š]Ù¯ìø~Ž&‡¿þL?âÁÐÄFïeØ“¶Kïa;ó› ²-…°ö®/ýÝŽ/£jËÏîøjk~Øñ,M”ýå{ñå‰ ‘>œŸs§tMÖö½ïÎ`?šDÜy#±/Nð½ñç†âÇ—KÊ3+·€ögŒ÷¹ª²~4^üû×yáLÔLÿiÕë‹ðCäc&ž9ûU_ èa$@O °×Љ ¡÷ï¬ùO½7TÓÔpÛ¾Í ¤”ÎL}5cëŽÌøÈ&ð®š7±zn„7€che¦NE/%mWÑVÁV2Av¶Oh+ÒÍ+_›ƒB?Zb xòZ2N…(tz=u{ÛµåÌk°/=+E~6±!í¶„(ö«2Ú ¶ÔÕt…Zm^ úš2¶Ü¡ÿÌUû²Ò€ZWuÓÊD6&7±}Û¶GHyO8Ž6³V•@ÉÉeyÅgSj³IGŸŠ§ãÙxÖœ ¯3GàPSw·"# ?Ì*”ùJív=UE†2•yþ^C?Ë÷ûi3Z 3èz³ö=ïx#çzûC7ÎôŽðîRáÝ8ŸÕVäo_¿=ÔݲtéSÚ—_ü<ÐŒæNôˆ¹ÎÞQ÷–5hö´oòÛm­ÍG)ÖH «).‚‚ñ¾liìîÊnÛ#xöŠó•éíûÿ…Õ6±&Cæ¼…f_?Nì™1„æ ñ‡§ÒùúÒb(¦*~“÷Ð@âá嘟6+A/ݨhUŸ‘Ÿ‘Áª@´„Œä•° Dƒ½š@´Påî’‚Ü’Û†’?FÏBÓÐ-HÝ–ÐÃÀù–šßt·ý@Îÿ¸­ |ÒÛÓ ”£VOȹH–§®H›]²öRóÞ,<+¸Ý^ÿ•ޏWу·yáŒ0EŸ-¨•o%-j—¬¡ÔSéTÒ&,ÁSöˆºÎà|ðzè¦ÍûO¥AëŽ4¶Þ‘…r¡J’€©ªxH¤0çVù1ôâúèŒ &ük™ßó)JŠÀ·õsôÆç<ô :G[›? ,Ð UùšÒB(G§¿½®ïÌ–êLÁVÈØ%^Ûé$‚çñm˜.Œ\ÍDÞ4::¿» ª¤¾K±•œ²µi8¶|cFRQ "(ñ,þ‚«`±½"·° ;þTéÑH4Þ2YÝiÝ)úvÑHª‘a:UVìš"RÚ)åí$UV¿ë( [Q,ý·ú’ópYø>Ú\Mú…m"u¤¦ÕŠ F™£•¨ TBµð^Ë×V$®ZÔÙQ’ÃcÞË·j›]ÿlãüSU(/P‰““lƒýÔâ+¹‡ ÓÛÒRµ[º7yWAfj^<F˜ÊÕ‚ªÝN‡ÓC’šå¢¬ò½¯M»,ø¾ý¬Ý5®Ùß°û‘Ûoƒ”éMúìpk ;†ËƒÝÝ¿ûÂ"ò†#ñ^ "C²F‘»¯¤¼Š@ZSá7–ù²€z9~A‰Æ¤v00ZŒÖúcÃ;4@½ªQÙWá"%=qIœ¸|ÑþšµÛÈp4F««±«-ØdìWò¼%uå'_£_-Z‹’ß©D¯®gA)H¬%¶LO…¹„è«rP°TL±?çryP®? '¹îL¼Ä=Å=Õ}OhêÈ=kt4úøÿ>µvà endstream endobj 230 0 obj <> stream xÚ]P±nƒ0Ýý7¦ª*Û ™RKBĶ‚°t3öA-Û2fàï‹”¡ÃtïÞ»»w´¬OµÑè··²Åƒ6Êãl/zµ!<¥eØ«”å$¡åU¸O1!Пó¥ùè^ËkÃÙ[w«øÆmuÙ^×§vNµ,ä9 Í6p~…û²=¾DìË+ôÚŒpèÊ6!íâÜ'4)Š4Ž?N’Váì„D/̈$g¬€¼ª ‚FýëíŠ~¿ÂoL¾1³ŒwG£*Ú{º“‹÷ÛÞôƒä(.ןorÖEUŠ?EØló endstream endobj 232 0 obj <> stream xÚ­V{XSW¶?!sÅÊé¹Å>Npꌶµt‹o¤ÖGEªèø@P„ðAÏ’,ä€$1AC €ÆTdÀg}Tåú¨[[{+8êXí•îw¦3'X;½ßïþsçûη¿oï½ÖÚ¿õ[ëüöîî„@ »aÑâU ×¼²*Àßµ0#ëž; =8–àÄÎ×›(ä^qƒ Áã]#5މ‡/¹ÆßòÃX§7A "jôøü¢Êb“dQë>Nð÷Ÿîçï?-8%U.Mˆ‹—ùN‰~Ë7 0pæTßiþþ¾A’XiBtT²oH”,>V%ã'I¾a)Ñ ±2¹ï”9ñ2Yê¬÷ÞËÌÌô‹’¤û¥Hãæ½5Õ73Aï»*6=Vº=6Æ÷Ôd™ïŠ(I¬ï~¿‘18E’š!‹•ú†¤ÄÄJ“yÄc„»`ŠàÂßs.NDQD‘(”Yüf©@%P£ˆÑÄb<áMÐÄËCüñ áCL ^%^#^'Xb1XH,#–!Ä "”#Ö¬Áæ'_5‚'nsܺÝþ.Üîîãžâñ¦‡]ôªÈJ‘™äuʇúµšµlÔ7£'Œ¾æ¹Áóì9§òr\ƒB/èqlr++e½zg6dƒºD™ÿ6˧¤Ô ¡Š* ‘u,5V@•Ê@[RM9}¹{ 2:»<œ"/‡\Fü—zC`·\4£AóE‹CŽ@ÆyLT„ý=Ì"íA]KemEÕY¨ =ÕÂi¨(ªTèÒ´[(³ÈÙïÜÍpçDUh¶‡T¤ŠÐ¤å+ÖBPø±H«AYST¯nU¢¤"NŽLŒt<"Å ÌGÐà:3¡¬ÜOŸÐëß¡£ß 9÷ˆéÔÖ°&ëßæ'™DZEœØi ãÔŠylz’¨Cw öï¿c&YÓÉyêÚN1wu^ü¿,¼8¬3< Ó ¢¯±’h³›ðxäˆVzÐÂýh!‡Æ××tTe©®˜Ý‹?Æô:ìV€…0æÖâ±'°Ç<îβ *Êu•¿Šrøàv¤cà¦],‡°XñQîÔU’H ø³ù"wYñ¥^¢ÇËŒ ´26ä£éT©çCm¡œ dœª €MtUñ[°Ù¾©b" ªí»Â  §O[½ûž¢MƒR3Í!z€þù#öÌqø~ÜÂ^Ø#è½ia} kê¨;Ø"o‰g‹\kö\8Þu ¨ÁOgŠaöú9«Cðj¼ÍG¡àwÓ)ú)GŠö¡…|#—H”›vä*‹–ºÙÅܾ+ˆB“ö Ñ?7{Û‘ûž ÙCó 1>EO™¯öžºÌÓóÕô“ïün~èümÆ,‹Uo´ôm„\ÖÚÛ_ß ÔÁb(P¯LÛ$ OPI5EštµŠ4J ì h§BQ Mì!ÑW]‹ß¯˜¼I¼4ÅŸî(±a?Õ™ªONOÌÛäo) ¯ÁÁ',8|µü曆çü¢W­\OpÏO0 d~ïú!‚ØíI¢ƒº£`·ƒƒ<•ÛÉ ×ñí÷ÖÉ\8O{E[ÈwfQ>ãLðI"‘ÙÊ`•©¸Q#‰#·¿¢åFôÊmï¾GáV”õý#·E0È3ð{L°á°9'.žBkI}q»²×ˆq—ë+T;•b Ïj‰*³pC戆ˆÊ†"š_£v@QŽ÷’r(ÚÅV‚VW^QÛØuüK8 æˆ*yãVm ¬§èg¡éQé1[Ó"`!¬:–}Z§Ñijjo2›LÙæmyñʈ—ÞFîbúGD=y€hñfî7{nÚøBÝE1CËîÒN䃾dL$ª@/uaM`/6&P¹Ñ™dÊ56¶V8³éOïã—ñk˜ÁibúÖ#êƒ{Hxÿ/¼'=í²´s1l]—N!O|Y’3Å ò¸»©›mßßeá0XCvo…u°Âa}vœ$4¢Dö¼} Ü…ÁIóý!!—Ê 3Õ.‰1P¸T„½@]_ÚÌ‹ã6¼…—[]cõ¹úºÊŠ›PÏS-RäÌÁ‚ŒmøµmX ¿å©‹<|ºkØ#$œÐ¨:^¾g×CŸ?ïQôŸŸ¡&>ë>Ù!ÔrHÖG?D3¹&¢µôh¢Î^°_¹z~m0 «bÂCã)c.óEWïQ视¦}æ?yV rm¤}cmA—ÔœMÑ?¬LžS¨‰O–Oš;ú?±ÓÝÿàÿÐ ¿€èþÄk/@ ÷ß¡Ðlô ƒÜH,þ¥t÷?!àÛdŸ­lÿ¼R‘ùÈþÝ ×…ZJ“YiTŠ!׸Û\×Ö–dÙÌÒ !nIÞfêE÷ ê¸2!²¡¦uÿþ^S‹µó`C«iÒÔMšäÚ|WÓÔUù9;òKŠCæúÌ}\XÃQ1ªõ#Öš¥êœíËR]Ö—¡LÓú3>ïbÏ𕫷Ä$²Ek-k±ØÕ&5:e=4€ÑÒ~ö‹“}ªõ9P ……¹©þ)ÖZvRkÜ{@Óê2]Ã_ 2 å•aä‚›Prm…Q„·Ô‘ÖÑ—<ÕcÆ\ÒËŽvŸ©3 Ýyù¶•È2 endstream endobj 234 0 obj <> stream xÚ­W{t“ežþÒÔðJÑ,©ãäË ˆ\„ª TÔ9Ø Ú¢ -—¡å’Þ’¦i“&iî_~_îIs¡ ½Ð¦-©…n ¨ Ž ²ÊÅA]tŽsPÇu™7õ­³û¶…]V8û×&ç¼ç$çû¾<¿ç÷üžç“žÎ‚‰//^µ&oV^AÁ‹ F¾xVIÜ?Ü2Ý“zˆIýB’¦¥XajrºôóüôÿÌLûÞºoä̸—žÌ7?9§ÓãÞêIÌ=hb£Á­ª«Êrržœ““óD^UuCí¶ò •ìÑÍ3dçæ>=[öDNN®l‘B^»msY¥¬ Œ^¯(SÑ;eÅU›·ÉU ²GŸ­P©ªŸ™;·¾¾~N™B9§ª¶üù³eõÛT²"¹R^«–o‘-®ªTÉ–—)ä²Ñ挞yUŠê:•¼VVPµE^[I±NœÄ,d^H[̼(XÆ,gV2Åik™mi Aµ€Ø™‰ÌÃÌTf3™ÉÌbcæ23ó˜ùÌSô®|f)3rÏ ¦)b&§1&©`:¹‚3iK„³…ûÒK?rÏ&QšèÒ8å¢w2Öd|6þä„O2;'®ËB)GVÊÜœÀgðÙ„àð‡øÐEaJ™2ˆñ}%_, 3È\ÒO”³’$ã/øü8îÂRr™Ü/~¯ÿ§ýл Ó°PÜðŒa-2m—’u¹DXè%ëǯ±p&þIËA”…’—Ûñ",à !^C~SQAÝÁq`Cæ€Õþ·«8ã=åá õUÕUñª}]±(/Í:I|:’‚¡ì¯…ø¹«b“œ3/¤1€¦)­ljœçâ{qÆ×,|¸ì÷Ó[0êøö2|.½p–L’’ïD zziZ“½ eÁît:ô¨ƒ€ø4vx÷ÈÆSEßt,ÝôTNy€%jò'±ÉåðCÀpùÎã> Þ úsÿ²â³rH&›5Ä©“CÓ“‚·n‡ö åŠyË^ä·z-R 8fÓ¯Ÿ—˜"/_&€ˆŽèÉÒH^À’_â'Y<°ðãW’Ç"GÁ‡‚VIjÎæ0–)ùù<’ hšì]ü {[ðB,Ä÷]ºöÝþ«€ð¤7™ÍB“]¤€G—ÇÓ†²†$S?R’×…xá$á¯E¸oÅë±?6í¯dKþ㮼üÑ!ãá‰"œqu Éba{yzIßP<)O š!ºúëóh—'ñ¡A>‡?/úÔ£­dÁÍ–§Ýir‚>& ƒ;䎼…·Kx—;<ò8Bú‘âMCýsª†'ÍÁÞà ïiËtž0P;Ÿµ­4Èà·¤Qàƒ®Ö6ü¼„÷R^5@ƒt84RNƒŽ–Ãú! ­\;çæ lN»ÃH²‡{%·qbw7GØvèrwÐ:¥¢¸s‹òG!N¦fÕ`•«ÚípCxðyb(+µqŒá”$õ8øª+t Pgâ¼3¢eu°“Ó:‘ŠšørW »v”ÚÝgÀj`ŠÜ®¥z$¦rG3Å 4‚Ææ1…Ù($]1aV¥¢€|·0èÀ ®F—™‡ðòàŽR ©'þ–ªO >ÁBaêtêû$7E#£HšX+è³@›ÁÊøÞȪ£XZ ‹å¡öp=œÏ†±v4,—Ôç¾X¸ÔPìSEçÝïxu1•²L³²àdÉ5ö`æ½=ßÒ&o½€WË—€!ˆ»¸°Ž2¦àÔN”'z”nËÍú#°ë6i‘‡$w o½hð| J|ˆWBÍt„ŒÀY,ºò9I:ù ÕÛý?ÕÛµ›jO¦.ˆÃÇ:º.ºQ(à‹ølfÖ¢q,Z¨7eNÑ:Œf}ÄdOsP M`íBÚp¾„XSqsJÈ&ÿtk ÚÙôA§u§á•šº%²œ V¯9Äz:ݯƂ™S<1ˆ‡. [Î+|ð*xÝTxr*.áE¸ø+¿–çZ ›~éñ´R¤óédìíç)Ø|ê_à³bœ/ÂSñÌoñøÏ~@Ä,¹>ántmåLÿ He¼)Ù8t¹âÞ‹ðƒ©#ÿ=Ëi¢OÏ(± ·=Q¼J§+‘Ï ´Îe =HlfŸç_À-„COÞafg4õ5;Œ†-§–E×ÐÛX2d …ýÛ¼–dE¯ùbã«&ôZz-ïiaš7Δ|2a7þ™ÜÐîëâC’°‘·Kõà´ÛT›ÈÓ»ÎRMMÁì³ù¥~*€–ÈÑ·%ŠS›ÿ‚†'àÉ8“…×tƒÕ Er{ 4\éßTùþâÝp]¹ví»ë(%Œ”v5Ø‘!Èù©¹PÎwÑ)ùUÇß'H­ꨓ Ë¢ïÃÛ_a¡ÖºÑiãŒNpHtø¤-àñ¹ã=x¥dÌF>ÕÒqµ¨—“EjÉf°"³ß ×¹¼¾ÖSx^oÏô[Qï4³à°×;íD2ÜA•í0> hG3h¨Õµ²=pÎÝè3QÎ;€T8Q#T³Jj.5®n»¨ƒówˆÊdmä¤àâ5áÐÜQMwv]¸MÓ¶:GÞ]5muÚœVβ€|a×—“©dÒ³Z\pàKZÝ=ž]ߦ¦J‚ƒ®à‡€vß2+ (9-Í‚š;gÕj*·Ö×=)YM*šVÙuPM2¾|Oâ‡?€ÇíÅbŠw3 ¦~ šnÊ>?„Q‹4ÒáBQ 8VM1Y,qÚ9+wŽ7DGøóøvÅ]ÀY´Ç‹Dà §Ì&« ÙÆ ´IS›DÝT ¾øy\%ñÐ`£ñ0biR+ T§“£/zX3×­'?/,$4,ÈRQþ±9‘bXü¥à‹sÉóBüÆPº¸C»KUS©TÔíÒvv÷võIÉ#ÃBñKDjÓ٠И½vù[_À²HÈì¶ŒÅѬZ¸iÓf@ƒ·‡….[¤?ÔêiééÿDì ÷C+:¾ùÕ53ˈLoòÛ4{yŸ;”¸ñZO5à­Š…fgS³‚*pÙ˜H}>ŠIw«èRõ8×Å•ŠšªMLÓÕ×è–ùO‰uË׿/-è<ßóô@u5DÔ•ÕµÛåûjOIONÛ߇3¯ã$î°+1trÃo Yp G ðn¬ïÜoÔnÚN7}SÇénwèz,åGøÔå·¿â#C³Å7Ã×k¤vØéPqÅvI×ì„Ô…ðQª)8èNÒ@¦ ÿ VFNÔmŠK °× ìþ[ËÁ“Ö÷5P4b¬\³CÏQ‹E+o|Gzºû#ñ®}»Þ¥ûÍ-†­ö}iÍ’R@5ÖÊp„{;G&–æÛ§SÛÖø÷u „#'OÙw”NFØh~É¥ôwëZu=}”ƒ¯H aõ†¢¢Â¢Z£Ö‚²~øÕhóCÏœó^âR¼@쎅ö»cî¯Ëry“g'º“:ûv×­cAiU×[j—X«u+$¶F‹‚¢VÅÍiÄÂþ°Ûð¶wþI2öœè à;“Éc¯~Ð`»º”…Uedœ¦¤¹Æa¡+IÑëU‡¾ù‰” Êär@Zs¨“…Î@GhOlÿa<ÞF—VæICQùúóÇKÛVÃ:X®]•gy·$Q P«nܦ,m^KÍé–Â<þîð±¶ßÔí«­c¡Á¦1oç̺•ö¦­d&팵–úßøéˆJƘIÝÿfî^‘H³V¿vY÷Šr˶ü=«×VÊ-'7ì]åP«Òî¤U¼òÿQEªŸ¼œÄ³Æ*Y~Eø&™(6ïàÌtN›èa Ú¼lÈãþ׋íþ±lŽ6¡|AümúpFDÕ_~‚úͽԻ¦àiYzv!»J6U*Ô–Ðõp ®j½q £ÛàFÞh;Esc_¥¤cmWrftQ+ö¶‚+Ö¶ÿÈ¡ÎA@Çãk׳°µN¦XYóRÉ*ìßh¯øYp¹Zx7…^ù?Ð]¦ªS94Zù‘hõÙ#+ÿ¦-Ú*c‡âý»D#u2 ÖG~ÅGìq8ÐÛ×ítì$“ìºBp.s"ÝF7‘tº"vð5@ï·>g¡›gqÚP–º=•jiÁÕí"²14N:>ýéÝ™þÌñ|愽ã¯LHx23ñçü<†Ç endstream endobj 236 0 obj <> stream xÚ¥R}LSW}¯¯´ZP˜O7‡¯õkCE¨,Fa("Ìð"“gÅJ[¥íÚG+jW¢SÁŸ©&•¶I "Tís `ýB)dêÆÔá¦3Ûü˜Ëæ}õj²×%Ëþ[²,¹9¹'çæüν÷„XL$)Ï*X¹0oéÌÌœUóÂ|N v>¿ÚÁ¿Nðq$?Qij?^<‘ H"F@âñè0 ã4"´±„˜$inË•ê­D•*9Óh*7ëJ´œ2¾xºrvJÊÜe²J•¢\Xª1ëŠÕeŽšÓjJÕœ@6+óŒÅ: W®ŒOÓrœ)5)Éf³%ªK-‰FsÉ‚é J›ŽÓ*Wi,³U³A™e4pÊ\u©FŽœ†Lc©©ŒÓ˜•9Æ ³AH*™I¨DóÈù„Ž(% BNıÄ+ÄkÄ‚%–¹Ärb”H¸XØô‘±änÑX‘Gt—RQwĹ|eth`Šõv >/ÉOè øw‘Ag$5µPWWv>ƒ‚’¨å8(³³8ˆƒR{p\-Ô(À$v(««ƒÚ6šo´6†ddËT÷€âíèÏ*úõ}ü˜Z›8ŠfÙ%UñP‹oßîXøõ–‹„{®sO›o8@?9ÜÏè Ëm©è†‡pá«C—|¿ßª®‡Oap«Wu8ÞlX³yÖÉYv=ÐÂlð'm^9nSh Ã4Tí3±ë‹W[€ÖK .7Ð/ª¥+ ¬V/iqÞƒööûÐ"ŸÐJ*7+Â6Ãè·‘_äÅÄ=¢PZǸ]­wÍÕîžKðF½ù-ŽÁò4Urá©k|'\Ÿ_XÖs þ,пÓæ*`JF:–á(‹Ç½ê¨€*0Ó¼BâGÙ›%•¶k[víL‡m@ã,IøÙއdÇȶntù…~@/™®†kçàýhFgâ¤9³XØxDWoðX÷W]Ý€Çä›2 Æ"D-C$ýôî,ôêZ·y¶º÷î›ÓI㤇ŒÁcñCÝ;øÅõ[}«±°rmá žÃì¯B’Ež ÷Ž ›`9½ õý”äô+Ã,|ÓÕ3x’þ+͉'Ã|œè!:ð˜âãPÁ•˜V¯d­Pà4hÛï @5}œóXÊ šì®õ?£‰hŠCztK‡¦bÙ¤$<3Of¡ö:œn?zžÆ²™"0øÊš¹fáËÏC´6´ÔvÒ{À¿Ø¹ÛW¸o>Øè´u ɬÐKÕR;ÈžP2¢{ŒË+TÒÛ/#%Û-B½àR„¢°–q[X‰‘l· ÊQA‰FA¡D’#ŠD²›*à_0~®AoøÛ¤õ[5ùüÇX<ç2ziß'» Ø#]뀥¬^zÊÙ®#_B“Ð é’=N)xBý2Ñ{K𴊽ôÚÁw÷ßî§mÐào…Óa÷¥hW ÅÒ‘Ûg{û½—Ïâòÿ.š¿ÿOÔÒ!Šß*äü^Ó9™‡µ™ËŒvçì•+®uËþ}¤ÕÇgº±ú O‚Õ‡¤ÙШÆrù[ÅÊÄs½òHôl쟔A…W endstream endobj 237 0 obj <> stream xÚ]P±nƒ0Ýý7¦ª*0Hid©"BbHÚÆÉÐlÆ>ˆ¥`[Æ ü}Á  κ;¿÷ôÞ%e}¨|{+9hµQ;z‰Ð`§ ¡(-Ã6ÅWö‘¤< w=BòÃÏ·úôZù/Mß®—ŠîAa»B.“Cȶ¹>ðiØ×¦µP 9ÏŠCðì>•mðeÙ}y…^›v×’Ç {`&@J‹rtõ$­ÂÁ ‰^˜I‘¦ Šªbú÷—­Œ¦•wágäûŒÌ2š3Räû¹Oóü#ò6Ä¢°d}F•£÷³‡x˜n1¢ >oæ¬[X±þyoo¿ endstream endobj 239 0 obj <> stream xÚUkp×Þ•lim“0–IÄt‚q¶xj Cë†ç R°±[Ù¬-Åz8’l!ƒ‘lëqô–,ÙÄ®d Ô¶< è@yd¨ Ói }$4™¶$M3 4if2ítîÚW¦½² éŸÎΞ{wïÙ{¾ós¿¥©¼<Цéâ]µ»ë¶ì|~óŽÚýËåÙ7ë´öL9õj>·˜âÊhn +çs%y’¶æý»ˆ·¢èOe­enÖ*ž$–ZLLp5—¦ çKŸ_½qûžz¥Æø×ûH£ÒvÚÕ=Û¢f:š ¬QÍ ì+ u«žUYýì\ÑÞ®×ÊMõzI¯jUgg›ÔM:£R¥mQiUF3«f5¬Ö¨e[F•NkP+ Ê-™Éå++äò›uíæÙeKšËeË«ªÖ,•­Ë«dÕV¯jVhe;F%«!_7+Ô²Z]³Š5šeKÖ)Æöµ••&“©B¡1Tèô­/”/•™TF¥l7k`õìAYNk”íThXY޲ŠÜ°Y§iï ™Èvè²z-!¦˜¢x”šG=M—R‹¨¥Ôrz5UOµÐ/Sd™:MÑÚI»h7 ´‡öÒ>ÚOè u€j¤¨õÔ<ESyT9u†.¤;éOx{xÿà×å-ÈûEþÂüºü×›ï )ázÎY<5ŒºRôâO•¡.ÑÐ0Äãfè’fÎ ºÌ`2 Ô8EÜŽ8Ê8Ÿ+E"|Õ[b.¯J³Y¥ÐãuE­èncb¬V— zJ­ý¶~I¼ÞX Õ£z1jÆÍ^w¨/¥±p$*/ø·¯DË÷_CÛÐ6q x| ôxý~1Q{Ä"±ƒÃaµ2^›@SèTŠæòS|n*¡ ÁCÈxzü9ó·G) $>…“ßxN ƒ9‡‘ã’ìÞ S¨"Å9)BwÿxD€7âgp ^¿ƒ$X„ÖKÑÈcqã²ÂGHŒžErUJqhf‹èa4nø‘÷ױܙxŽ÷5ܧ¢h €X.á>°9®ÌU<(î²;{À¶`Ï`/wˆz¼à&ɲq»Â™8r‹¹`Æ”Ü G¤™IÁ‘ÎGµû¯p«Ñû¢Á`0èw‡2—Ñ€¸;ä0{¶––p_´Á ÎÄ1˜ln;ô–Z#¶¨ÄG*6b¸3¸á†K§ï¦Ï‘›NO-ãOµpûD‰žHÄA²r5?hÚ »`ÿÄÎìÜ;¹˜ŠêïWv„íÁ~ÿOýÒÀ‡wÇ߀›pUý†òzëõÖ[ÀÜ¿óû{R|4oÌâuewéswü»|öÎ¥ÅÓG²Ýžž.äOýtûE{“ýhc};¸K Â’! ­7|â‹7?Dù—b~ŸBêõ¹`pÁÌÃXx‡´¾PŠ„ðÁ§Wþtý‡±#útcÚ| Tðâ‘c!¬F|,”b!|W^÷=æ”Jtþ;_¢|`þuý[ËË_\»Rº /t&ô§;ÿÈÔüDÔ´¹z1&‹öþó“/ÞþóÇÒ›pQ‘è<Ù~Bý«uD *šS¤’³ÒužÏ]ü†r­ÄÐ$ü-"äÓ¼?‹çãUx"#Ú E+[— ð"ÀÂÏ-hS X˜žK4OÊ9øS…SU¢ð !ØÇ„zº%pöötgöÎ̈íݤ€NƲ Hbà †³ø:RÜ8NqZ¢Tˆ{SDúÂd³Y‚ñ·ñš¶’FØyéõ®À[pšA3‡.ž/E˶ §Ð|´äw¨LRÌ9±/ÁµŒr*Iý6Mr3"Hz Ñ¡€‡¨eˆX%e ßç®fð!!„¶æ—•ZÖÕáîs;Ð Ç‚Ðï¾í¸Ü­óY êV× Am—ÙsšÛÖsDXÂ@„¥Ÿ¸z¶ûë’G¯9#$éIµá’}¨-Ù™ÐöëÂwOL^‚›ÌW¨” N•È¡Rã4¿² Ó=¹˜Œ5Û¬‡ûW<ï1ˆ :ÉÔkgÆÎzG<9ܹh[üõ“Ö+Îh.Au’õg›'júU³ÝKdiý¯WÚöùl9ôUC¸+Ù–è;ö3{•±µv1Åhœ š®%DÍIñÑÊ©ÆGä?X%4ϪþððWœfýÒ\ Ÿ{wŠÝc_Ë+9M}1üÙôFqï3t«-«Žä´,L±atjù1<J óÖÄ‹ BE…ž¢9©ÂԜԫEEä~}ôôwdYõ endstream endobj 241 0 obj <> stream xÚ]“mTTåÇÏÌÎy„ •áH–žcYÆ2uѪ ÊÄÒH] *ÀE Vš ŒÃ;4àLóÆì††Aä½™)¬4 ²²œB1qõt»^‘¼‹^LŸÃ}\«;Ü›~híµþö‡ýßû·÷–P2%‘Hízæù´ÔgîOIHNŒ‰‰™Ï=$ÞI‰Ë¤ârZŒ’‘É…eLÄ6†,§(êðây5,œ×C‹æuUP˜—#(Z"‘-ŽY÷àfuN^qQfÁŠDõ¾Ì‚ÜÉêœ=¹KRA›˜µ˜Š T$ÅQK¨(êvj)u&¥$””rR?H^–Ê¥Åô: ÛÂ… ÿSªàK=s¡^Éñ⮋4®™[Ç‘ä| Ù $á ²'ó3pî”ÿÇî3ö ø.Ua:i<ëxJw*çʈüF4g­ƒù@ ö´c´ntôØÑÆg é"«W „fH D›¥5¾bÑ¡ ‡˜± êÁm­GÿoÇæŸ“—JpÕwô¿ÅYNɾC®6t£Mß Éü%žõ3Z¨°–JË®Äë6×Wñ¥ {E«ËÈIѧÂÍZSâ _2|ÿL_{¹¶O?{+èÒɸ B%ûêª'6mMؼév•*G©RéõT JQ`½xkˆŠ1åš3*´Óÿ¬2ÙÖlPº ŒN <1³s$tì.~¬Ùb^‰ ¬ª½¸··½ÓӟגÍÿØ'fãgó^‹À’ ¿áÄŸŸ¸ª8ŽÃÅo8ßñ‘Ö÷Ø› ÀöœÇž®È7%×YJÖ]]Ï70MÐdk¤8Í÷À&ÁÀZ·ª6ľŠtLlîVDý]þ¾‚öœ¬òœ\‚£öüK1û%^ ¸YóO^ˆmDбóž³#pMjhý£„Ú³Ž7°ö¼6·³Ãç+hËn¢ÇQ~± 4MÆ¥øÕ‹ã8ÜÇìÓëÖòJ|¯bÓ ƒÄ¸æ¿KÜÍ6Zܼ Vƒ¾HU¢,>ø Û@ÂדPƒÞb„*0Ø‚×úýœâ2v‰tÈ š½E$‹#ì-•\÷ãêiz#®Ö@žŽO·¦+W]Tzpåôã¿á0L_ÆÜõDZŒ,vAzY–áìk†“§f&`Üûþ°Óåt‚ÙY«Óä0²0å–2]™é ^iVBìu¿pÄd7Ö˜U30­FD.°ºZ}4¸›]u¾þ-C5ÈÉÌ6y||>‘$$@Ê@~Ýj{©g÷Hf°k†Æþ‰³20Sí«3Þîþæ7¡Þе©Q^±F]x´È#tB{KM7r³_&ø·“MDBž"ó@P3Yå‰m¯±/ø ò+¿âÛ0ŠÅ²HÈ€—4êLý!}•¹ÙI$÷ëºpâû)˜œ}#ÚÅn;DX"ãïb,³LݼõñÛɾàç<7C_ž‹ã²É^¦Öãx÷H³³¶Áê²!ÓÝö® á³ÌþÔÝ;³vlY±“,…TG }¼ñÚZ: f¡ ŽÚÚP' ÓG®ôíà™‘Óƒcuõ.4£Fbb+¡ÌZ»!ÍQí½Eg.´'b`4ÿüúɼq¾ÄYÙTí¶$ÍNƒÆ¬R´ò÷§0û;ƒòp:{ôù׋›óKZâëÀÑÀY‡+kÞs"-³vu‘ °m(ãC•Ë\g¬³ µ$S\ ž‰pv䓟ÃîtÔBø [uêé}°=¸þÅ|> stream xÚ]PMk„0½çWÌqK)&)í¶ ÂÖ­àÁ¶T—~Üb2Z¡ÆãÁ_ezHxóòæÍäEi~Ìuç z³ƒ,ÑAÓieq&+jl;MÕI·Uá–½0$J a^D}Õ×GqÏŸŒÞœªŒÝƒÂf•T³Aà[ËytØçº Ž @ô¾8ŽÎΰ;¨¡Æ+ϽZ…¶Ó-ìNi˜r2æ{Ô(I’`ÇÖä p4B¢ºESš@œe A­þ½í׎º‘?Â’˜ñEI)H|»âGïŸÌéEÃÙE³gÍÇœ3fnî~ºÏ铜¬]öa†dü':ç¼Í`|W8SN{m endstream endobj 244 0 obj <> stream xÚ}•{TWÇg$#E¶ )Ø3„ÔZ §¬"jyhénè*{V¬ÖêªkBÂã”gÄ—@2¿I·AX+®ënm­mQÁÖU»{tÏÖÝúîª[»UÚÖÓß„;¶;TðŸþ‘›{ïüæûûþ~Ÿ{š ¤hš]Ÿ¹j]Væ+陿Z;7AÞI*c•°Aûý;‚„ŸSÂlZ˜ $(„ˆÀ(Š ˜5Mé~&_<+”F¦ðÓ©ç(š ¥X*Žz•zƒZAm ò¨2j+ÅQ­T/µ—:H Sç©‹Ôçt&½’6”èͦ¢SŽÅŸ›;º0ççæ® f}¶é©GòB÷Tœnrœnrœ¥d"ÊRò$fÒÔ`y2-Ì7ŽÎM[&üX&¹±<ÙÝ6m)+/,Ô[ò‹‹Œùe%z›%¿Àh²æM óf'$$¦—ØFCµ±ÙqÚ¹))IñÚÄ„„í/ Mæül}‘6SoÉ3ÉÙúíÊâì|“Ŧ]${N3ÇjµÎÖ–Í.6ç¦ÅÅk­ù–<í[¦2“¹ÂdÔ...²h—é MÚ1l³Ç¾Ò‹ KÊ-&³6³Øh2I„B¦ÓÏSZ:–J “©Tj•FýB±–2Išií¤9hžvÑnº…ÞN·Òmt;ÝAwÒ]t7½ƒ “‘Rvêkº/ .à°"[q" Ôî š´$ȧ RÎSê•_ªÒG¨ßÂ~wÖËNyµŸFãu…9ûݧjhqºœîœ÷3Îe E`—/ ô½‡0‡.ãÌk׎q»Án¦sTkªÁ UUä95SÜb ˆQ_ˆZl#Ãý–†C¹Ý5.ðãiƒÎèÉY…å×Â;,Ù¢!j® %m8lÝe:dx¯¦Û ÕÀÔÔC]44·4»œûsÏeœ#. ]È%Õ@|¹äI!C‹ÈÌäd½Þép:ÀÁÔu@·Æ#™ëéÁ[xê‘° „&Ô_?Qì )í|vdŽá_K¯¿õÑâ}˜õÕŸqü….¨à,`8®¹ÛÞ"ë0^àËG‹,­‰]·¨‚„:¬PŒhPAdqµõ3—%åÒÊzŽƒJ°óœ§á\ÎÝô~2­Å"½Wˈ·U@^zÏ.÷ÕJšÀxyðEÃNŽoØnè'ê¿Wà,§ºàŒäõOì£R/ûŒ[òZ{Oáw²*Õ 5¼±ídbørŒ&x: G@ÐvLÆX¼z Ã>Ãàÿ"år»\Ð"éÒTIùNŽË|ó5@t„›G7‘¡2² $I1xPœŽóÉ’ø;$êþ‹ <× LÏ® /¦{ a˜Y*á Þ L'óñÎQ±ßÖ·s¼˜ê†1`M.Ç]Â\!á§I4FÓÃdDˆiëÅ`K®® a¯“àDBqNG³ ­<š©Ù.ÏŸ=s P‡Ü-ü‡ÞÁí˜ ˜$5棉Æ|'™Éb…kÒÑ x_#º[HB5NéÆ7ùÖHÿ¯Up úÚô]9zÃþݾç¡ñqJ›Ô’’Jb!a[É2ÈcÿVéš5gcÊjÃæ¢j™¢l<×ÞôŸ•·}$É].½RÃ<îPAêq²W¿´k« vããy‰bÇ7»6ï!—KP×< Õ±C2ûëÎË*ÿ'™=‚ …,­Õ¾VðD»ü+® —ñ¡º­C.Z&U©©%Õì a$&†l$‘¤7™œÌ)GA1©cŒ*¾¶¼ð”¸P ‹_aý$4Ž<\‚f¢À­d!ªúš·K÷‡çøJ`ªFùHivØð¡h¿$Þã§0Õ­àÓ|¢ôB+ð]LèHÈ÷‘^ÿ}I9C/®SÃ5®ÄÅ8}Gçhwq¼YS©$o&¬ò2#êT¥<·Gó7垈–E"&DüßG¨wóü®±^¹ v¥møÒø™õ"Üdj€ãK4¿Q–p\i´¤$ö"Yo•솩ÒÏôÎú§¨'çRU€S×âfbA+0êƒiÿ)Ý…*H²#YJ´µ2b›Œ¸«~Àú5Gc>XØŸ‰r:r‹ÝOŠ·«'kß?]¥Œá…IŒñÓãê h®Vb""MFöÅœ'fT­¸zl-MÒ/,ÇsÒáÙ)ß0™c¹!^Npþ&ÆÓåšÉÊã€?Ps]PÌ*ey#TGÃ,ŽÔ—×jÑCfRLÎl«—ÙÊ·©G³sô6µ¸1 câFŒÄÞëxò}rïó¢°N>Dâ=¯pòÇó3^ëªñ~ýu¬ÖOžÔ:=îç§£Ù Ýìˆã&øõQš üFš«q*^2+/¾°„¨ +šâJÉ*`ÄJ¡Uøª­Ýå†í3ä?•mbŽZ¤ð¡Ÿ‡ÛÕÎnÚ/¯Û]y~Ó»©Ìn%™Šï±Ä ´Ç99lZaàq^¤Ø#~[WMÀͨí€>M¨0,<:ü‡Ã4à á€?G½Þ°¦p-dCQo^QoAo6˜¡´¡¼ÎZg­µW¯þ]¤Ç~ìЉ?ÁŒƒ°×¾ßº×¾Ï~vÃ@»¯³¿³¿«×óñ‘ÈPk¿’%¶~Õ`ðà3ÛBB¤ÏTMp ­8d Þÿ?ª•? endstream endobj 246 0 obj <> stream xÚ]”mPSWÇoHrï1—«ÔÒkݱ£«ëKË®ÔUÑR[Å¢X-jä-„—€ÄV0 'o\)F[ Aˆy)`]¨õ)P+ÖuZë¬:înº³ë¹ôØé†©í‡=3çÿáùpþÿs~Ïs$”LFI$’°Øwãb’&¬ß¨Z¡RMÖ–‰ÏSbdø‚Tœ%#iäz$ÝócŒüŠ¢ŽÌ˜TÓôI=6© B—)(©D"{îeÕâ¥kµšÜB]jþœÚ”Ôüœ9ñZÍîœÿ+RÕŠšA)(– §8j&5‹Š ž£fSSƒ( DY©qIAPD Ý ý¯L+_( ý9Hýd•¡e‚j‘ ü÷=–⮉ÅÜŠ²Õê´W´,1°‘ç½Dóñ{Ý8GâùœMöñäwOçqÖCP ‡P;}¶sU}ÎV¡íØÉwm7´CÇþ†œæLa§k—s'ì‚ɽ»b—ùU¡É4@àî’ÑŸÚÏX΢_r8;ôú‰En¸Ë¶áiâcnó9ô ½ô´Š½9 «Ì®Ì‚l@lîž{ Ûög‡'Ðln_…¼“1@Uhgšë´R`Žš„ý|1¼_b,KÊÚdÚ Ï\lD_§dSøÃq)[¹–þ‹ÍC€®Ý÷E%‰*zul¶ø­‰IFcÑA(³Í$¾Aûpœ<6çT$—X,ÅÖ"@étŒuÄÀHÿµó£çGÎ}=~‰D^$²ù$ø-¤{ ›}ǽ¾–¼z ÿK}»HZCXŽËÆWb);Ž/Þäš;FÜg]Ìy] o¦¬‰5î8¸Å ›Éi*Ñ×4ûðNÿ¦±©K–(7ÀJ·ú3UšÑ©oVJqN6›:²ë÷÷e\1´ §ÝׯünÁ•]â}…îÜÃyÄŽú¾ñ–¢’é=ªh®!T¦×ÐäóxOÌyÒÖgtŠY÷_½ÃŽŠ£8<E§e˜Óù0ÚÞ´ËSþ„¾Qð­F@jýåm<¥“L'1y3­ƒRÝ%ÛߎXB‚—‘é‹c1—›à ê9ıqþIN~bžõc›HûqèŸA1úhO'öŒ±?â,ãš½õ¾“Edz´:}&‘cyìxžy7ЕhΈB™ñÆÔt„72æKc%ª¥oÁUïÐe!° Ù«`v™UÐEEeÅ–ôÒ´ò4Ø[½Wk¶[f@•4ûÄf‹Õ„È Ø-‡ÍÈA»A¨ªOw~V{Ðêç®]ª™KXå›°¾5oý†5ôÞí— ý€[Ǥø5üg¥áºp«û‹¶ÏûýÃàÿA¯.¿²Øù(¯¾à$ŽÕÙ‘ƒ¹½ÊCÖÙdYÏÃ7‘~µº+y°ð @8 Ëþ…g)O]ø=Q¸Ð:Ö§è \V'¸Ð·ƒ·ÿΟ…îüc»?Îv¤CÊfÖ–Š„ðɰ·NÛš×Zz>ùuôâèýS Ö}/ÅÌD·—håm´«Éy¶îˆËUclÈG÷À{OÀÿeZ½uÇö”Ä×ç&‘p (£®°™wÒMŽ£hA1€§UãÈ¿=î¾Ôß;\]]ý!*kU ¹J'ÁfGeú îÓÅÐPö%|ùRÖ0{çá\túßň ¾Ë³yÏæa|ù™U݈½9Ø0Ò 7¦ÉŒö¨Å$$‰ þ0°ãJ&ZD9ö8­pÂW_\8î´».@0WU`I\Ä™ü®a RÍOÿ¯t—~8ñ„Èr½Û4|ý[u4ñÛÔ;òÊ+-@Vº rëöUjô‡ 5™µj¹ë×ìí©xù­qº_14†ÛÆØ^1_ål4 2Íd-_LkìY.]½×õQxk> stream xÚ]T{PT÷¾×]Ö‹´ŽaïݘLÅèàÖ´5vœŽ«¡ãkhx´Š¸,÷ŲËîû^ØÇÙ7˾`À•…DŒAÄ4ÅøjÒ¤ã$íLkmú0ŽÓ$ü.½Î´'túÏ7ó;sæœï;ß9?ãó1ÇŸ9Tu þ`õ¶ÊššªÝ+=J6ðïËö†Ä gD«˜xÌF>yÿçüÿ¯Ú„aøæï­à3k9Ä–×­àVoY­ÆñÕ…ë6:= y“âÔé&µL¢n—ÉUJ±ø• ±xg¥JmÔȤ­ZQyóVÑvïÞµ]´S,Þ-Ú§hdÍMJQM“¶U¢hÒr¹è˜ªY&ÑEå{ZµZõOvìÐëõMŠö •FúÓ­ÛEz™¶UtTÒ.ÑtHN‹¨”ZÑ¡&…DôTLÅS¬T)Ô:­D#ªQ–h”ïB!V†mÆ^Ãa§p9¦Ã \Ð…»qö"¶«Äöc5X-V‡­ÂpŒ)0?»ª†·–—ãóùÆ‚m_1îæ+sn¹"‹3«Ð¬ð:»u†åGÍÙ¶>˜bXñ…Çï Z½‰žAVÆ|Zª½Y‘a7ƒ™[Ÿ7æè«R-ß°¥ìKÛl't—u¤mIrâ©`(aþlÍ!öŽ_ã¡Q¦@ˆ‚îê¶áUpBKTÚ/‰Z²@ä†ÒÃD¼ž„ü3X‚a á½Á?¨P˜†ü¨ ûXЭÐبVKƒƒ°Æ @ößîŸ_º \•EÁIvÛv³³Ûi²up)æh×™‡h>÷GŽJ›î*zƒŽÓèÙ«øøxnœ‡^B:aÞDÃc¿óÃmáJ2Os§$ëƒ>bñáôC2¼•aWÈÝD:6HAFž4DMeÿi ØÑþ×(ÐÅUã†3†£ ð:±÷³ÚGèùÅ¿¤Ã®°ƒìÛii;uĺŸËÞd¾>JÁÔùkŽ3)a.<èÏräCÞ¬«»Çã•B'tA'7ºå4L¢ßÒhz_.xÈC»î íR}/+Íý¦L€~ŒŠÐšGüþðò =º%>¯¼É‘ìCÑÂ¥F!G! žAOÄVèõºÜV"Ç‚ð&òDóþÀ,”¡çßF÷hvVˆÙŠ=É~)4\>›Ïíã–!þPúSt®ܺ­—‹·³ÅTÉò-˜\Æ9† æ®°ÿbæüç"÷ öõ„Ü(¹u áÊ´ûº Ãß „ËÄñ‰C˜šñžµÃÛÐë6—å?9RÊ™{ÆëÓB[&øNb– Á4Œô°Ï=™.µÔk´?s.³·“‘¤â@û¾ŸÎqëâ‡ïä<) B HÇ­>;Õè3¦8s#>_ ‰62#¥(÷äëH—ÏÓe ðƒƒÜZT[if Zfñ¹;¨g‰‡ËåÂ`’+$¢=!;i‚WzÍkõB'aŽÁÀ8í$p¶:Õµ¬´ÔtÌü–µÑ©q*à ñ£+ûî£B´½€^þºúÆ^ò-8ѪÕ¦£Âñw怘Ë46Rð+»N^ÛòÆ ­ˆ:ýÕn'"cÃã¶ÒhâïhüÒ=¤û'ù>³^(ñê• !”£Îx6?8÷Aí…ìóì&–d_ÚòÉþ¡—ÿôm"ììs’½àõÚ­oîëı–é»\Ê<~÷ÎpþÚµÛY׈œ(AYéåõ³øåOx(ör;áU‡ÎãðZ¾“›š‡ƒxzìÚ'ÖÒ^=˜ÀET/(Þ#/C.Jçã‹ B€·×eè<¨¯oBoMž£ ç8ažNG¿ã1]è ax4þ>×5aÐqCî¶;-½¶ƒìHÏÛÒæ_¢ng(¸œ˜¿„ø}Ãá$dˆù–©úmÍìf‹=âŽ1ð…ƒ‰ÜÝw®^âþ@·‘‚N—ÑÞÞÈ®37AÁò¾´N“‹pqjd2Sõ1„á,ÐÉÜ;éó©;\ãÿá«ßÓ!‘ÑîÌÑÜu‡²Ñ)ú›Òæ +z€ê¤h|âh‰3ÃÊ” [œÖ3ÐM’ôøØÈÔûuÃä›ÐZké0ÌŸ €a7´­0¤¢ùÓ?žœâì¨s^z’ý¡¹Á!WÔ=tDlá±PvF Ú3(Û4²ú_ëgÉëpáJjŒ®úÈÎ}N[DÏŽ¬Ð¥¬àuõvë*Ôqþ*Õé+ %?ŒÎÓcóGâù‰¸SϸS6¢D7ÄTÆb1¤°M±Õäþ®lqa¤x¯¸hrÍR..F÷7üÿƒk˜ endstream endobj 250 0 obj <> stream xÚ-“klSeÇÏY»q„:n«”=%B c G‹#ŒÁ@… ÂenÝ%¬íÖvëe½Ø²ÞÎsÚ®]»ÞVZÖ (Õ C nnu‰bdĨヷ#¨ñ=Û;ƒ-òáý'ïó|xÏÿù¿$Áç$I>ýꮲòmÕ+Ë**¶½˜+¼Üƒ= ùw'¬ùÜ‚[Hr‹ò81›ÇßÛÎ$È[DÄ£Ù9ýsfN•Óç²’?wÁ'IªMï*)y¾¸¤dm™¢E§ljhTK–×®¬)-]·J²¶¤¤T²E&U6ÕÖÈ%5êF©¬F½4KÞPÔ6IÕ:Éò juËúÕ«5MqLU¬P6l\±J¢iR7JöHURe»´NòšB®–쬑I%Ù‹k™BÖÒ¦–*%Š:©RN$ÿb'єך…\B¬&¶åÄb1- >‘"’ÿä9x‡øyœ³pr- ¡40DNÈÿæ¡ú„ÖWçfh8œv‡Ã61  ¸•h Zˆòÿ á³·¾Ä³{Ñ´8*ø~¦noø/OÍ-Ð@iˆBœŽC?$;Á6Gõ.6o"Kw†u_€ù¨´à¯ôŽšÒ%ëðLëñ¸P›}Ìì¹®ˆ¼ÍI®¯]¹¸Ï¢ 'À÷pˆœäs_ {.$úïx(_Œí Ú|Z•¼ÉŠtÐîÑ¥·›Ì†tÓ2ÇMÐ ÆÆØpÞT¹pK/ê`>~öÆôÑ>xRv,šJ‰,Rƒì%'e²vjiÖÁZ¢‚›Þ 3¢8$½@%ÙdíŒXÀ YMÀÇz==¨ˆë¡Ñ©_üF·3ó{ÁÝåS…ÜnK†›—AEÉ$¼ÃC&øÂ”.¦n‘·Ê•qÉLº_¼ ?zƒ”7à xƒÐKTŸ©^º‹Úì^kDÏ8uÿFß) ~“šÍàê܇‹Df9¸LM&™ÝzªêrÃðƒ«HtÂÍ„tb#0v›¶£êí]U@鬡 _4|& Öd¸»OÈB÷‘õ;W—%K«‚G•ͪö˜¶ ÝŸã¦×µ›+«våT°^XØhȃ(•iõmõ{o™?œK#ÁOhRäzÉŽq¾çoÅ ´6ï±Ü¬×9ýÅÈõa Ò~¥’“ËÈ8©Â‰å– ÊüÉ Ã×H„¿¿õ;O¬²^·º ¦aÌ æ[EzÆÄ€Š2„!&> ~gØ‘]…ËÑ%S#"GØÁE)Ö¨8qoø¸?|­÷gFí·; 2Û´;ßqÀǨm#Òï¢eÝOœrÙìzKƒbSÖ))\ì¡!lWâñ ÁØ ©þT4;?xõÒõ‹Ã†3`iì4( ::Ð9ñ~ìêÅ£™ýâPyà`í¾CÍ­õƬϣxïZš ùí8»Àmº!³Ø Gêµ2S_ã¥×ÂÏàEx^†É±?ÒWàrß¹ ãhƳ:S0ÛÊ`¥Õo Ð)ø$È8Ä™ãËd²_ú£&èPµBˆw6zqJƒ¼B»\zmÝájePû›Ï~JÃ¥¾ékg?¿qr¨±ø†c´Ó˜_ØžäÊ‚==¨%Y€§‰§ó×%OùÓYÁŒÁéã3½ºWô‡ŠkW endstream endobj 252 0 obj <> stream xÚYXçÖžuegb£ëDH™%¶ØE-±†X£Q±¡(‚HQz“&°ôÝ=»ôŽô……EŠ ( ØHl‰I4ÜØ®F‰±%¤x?nîÿ-ož{½ùÿçæaÙï;ß©ï{ÎŒ„éߟ‘H$æ«6,ZþÁÂñ¶+íf›>OßA’Ÿ–tÇš‰o0â›Qè'*¤â°þo2Œ$i0½3=ƒL÷o^1ÝGÑ›uÑÆL"‘Ø®¶ßic3m’ÍT[_¿°€îAÖc\ÆZO™={æë©66³­z»ìtqö±^éäáêíD?xY¯õuÙéf=fŽGPß»“'‡„„Lröœäà>oìëAÖv®®»]wX/öõ ²þÈÙÛÕÚ¤õ$ÓÍÖ×Û/8È5Àz¥ïתìÀþÌÉx©Í€¹ÌÂAvÒŒ³•qæ<_‰6YÂ¼Ä `Ì™Œ3ˆÌ aäÌP†g^e†1–Œóó:#0ÙÌHf3šy›ÃŒeÆ1ã™ ÌDf3™±a¦0Ó˜w˜éÌ f3‡™Ç¼ÏØ20‹˜ÅÌf)³ŒYά`V21«˜ÕÌÆŽYˬcÖ3˜Œ=³‰ÙLõñeâ˜Åý ÓŸQ1w$ó%I‡äk ö ê×"/=ÛÿÍþÇÍ6˜5Êle—ÙÁìZ¶“ÛÀiÚKå(}yæË±/ß1W›_è?ð{‹w-ÊmeØ+‰¯ü<¸nð§ƒï‰—÷“;Ë¿ºth-ÅÿóÕ ¯~;ìÍa_[n²…NCÓ÷ÕÒþ×8âE¾ä½Á6/Íb>[ПÃÕœ“Åßž/¬…ýp.¤hRö:˜ +`%ÌŒY½›ÈÆG£Ø`”`Èe)vtËy½F ¬üp2xçÅÁ8QÁõä±nªèI‚§—¬>ù[hl¼ õæ#žì$UNƒÂ$ävýÒe”´ÿ‚žßKÅí¸ˆ÷•©£âVGE$Ä.†š{‹eÀY8üÌqè²BvÂ52ˆ°sml65'f–VÔWï.õAIšò‹çkN×U7a±F͛少|H6[*• † N”ËL>3\E‡Wà€Ïê‡4£7Ý[Ø%ÿ?Æ_ù{u‡¾‚/¸Ë3N1wõü]¥¡UU%%Uuù;…Ц3ÅG€»Q°l‹¼\½=Ô>êµ–ÿ#V§%•{…VÙíý‹&¡KÜí¡0.Õ±³>Ñ ‡Zn_@‰O€÷ç©÷#‡ƒïÝíä¿ÃíÅãKúœŠ¯Egšçg:¥UhÏ{aÅtêCå!ØKv.ùKHO½ç¨ƒÙªìÅ­.ã(q3[ é¡´4šØHŽìëqãD™YŒíµ%h>â°’öºB#ÆÜ•þ‚ø0Pæ œ’–YÝÔV~ ¸'@&¹+hWú:ú9;‡î€Õ°´!°S iêtàŠ«rëÁ…~»}£]l¾žŒRøó#|NL$ ØááÎá&¶:Ö˜h¤3èÒ·¹™ )‰ 5õlâ–ЭqÎàŽ[‹bRÕ .b½*Š ýïÒ€|‡Þ÷–'ïÁ×ð&]Ù•ÇŠ|Ü ÅÐ’TæÎ¹E„úù† E…Õ§\ŽÛž¼Eä$P!JÊÑbé(ýñZ¢|òb&È{V“‡ï*_!Wx;ØÕ]zXs ¸ FdpjV¹Âfp ×æP7/»mñ~½\"ž½&é0þpO*F‰OøÌlÐA Gt22T¹ª" „»ˆ+…Ö”²ŒS¹9éiW!Úí&O†‘WÉ’h2쬔àØÒ ‡r…#,àۥȿÔ+ÝÐ=ˆÚ{¿ mþ'ä—q¸™÷. ª„îÓ/|vùìúE,ZµÕ%ˆÓGðGË¿: ×¹&žœ2|ö‚ɸ湗ûì MKúØ“;ÍyõG0›{ë×¥4½¹GGF€‡ Û ”>…ÑéÜ('‡Ì-ÛsÔ>²šóžÃœwÞ?{C€KGOYß§NÃ÷7õâ[¦,¿‡ÞßÉŸˆƒðs>˜%*"u²‚À>Å—"ËPÈ€ƒ\EX±¯oh˜÷²ãNw‘§—%ú ò§XNÌ?›BØQ“¨äßG„'_ÁÁã…Íá?à#¨§=φî§~o£×Ñ’ýÕírë)ìT.N‰ÉsKùœ¸÷w˜(ô z>Aq _XNQ0ÐÛ§<€¢ ¾J _÷ÿOdì>ˆòfœÞ,éè^ í¶§‰”WDñ<ö(zžÈöCðîbÈUˆO‰Ÿ_ ¥%¡©èù]B‘½òÝÙ´Œâ’bIm·TœØý!Ÿ˜«Êˆ€P'$DÏžï,£wyÌÓP´ÛŸLcVWª9Eë’µÓ†¡2u©ºÔVä-1Gv‚ŒO‰Ñª ÑÊ{-ø ^ìáäcÐr8nÐ áìJPfÆ82×óD)ÃxÍÌ¢Û“jð©ŒCpÄM¼ø`Ñc¹ˆ!"òµºôV_•=jœ»jÞÒÅdŠ ÕJþqñ—ç “»3þ:±z8¯2ÙeÒMÑSʺ©•ó„ /™üWq¤ _ÿáÛ{ ¸ûÎWDšÃ{r•ߢN¯U`9®a‘;0ö£y«æ¤.6vO4J:ºÄÄJ©Ø%þÎ{íN¦¼Ì"Ó‰#ÙŽï’©¸ßýßÄ—² 3R¯‰#ˆù‘ÀÍ ËŽã>¬ÁåÇo(ï ÊÉ ]”61¸H-Q`»2£…xP©b)W€±[BieømqÄcé¹nkþߌ9.Äá8†6vDSÈ j¬ cÿ!é3D¬g{]ôDöNÛWºZ“o c`; _·hãÛÝ+hqw¯¢Þ=mÄ}µ´¾‹Û R±»{ßsé¹×Šžø¬³iK@&ûÛ’ùÔ~kYŸÇŠî±r¼¦+ Xè+›í5V˜„q²¾ø¼&C0¬/ Ö´·²èžJÏk5bKßy›éyLç}üŸçÉ'Ÿ…–ƒßA]/SÚ$Q¦Dõ]öa¶çŒ¾“f(=Ç S0õÙICd8ôk ˆÐ{Rk°£ŒâÈÞÈ-¹+í^Ðýÿ''Û/°ü÷8:áLòÚ+~€Kõ†#{ýê=²€Ë†LÚâ,`¦¤^Œìr•6ì˜æ#½jØ{ÉÑnŠ,±  j6Y}ú‚,¼ È}ÕtÖˆµÆ^ëÏÝ•Š "Ë“s)kÐe_ÊŒ2GÕZغu-8Rùeì¿gîáäSÐÒr SŸ±óÔ”ù0Ï‘¼¿Z!–²!ÝB”=Ë5ë»R âëu9×½Q¶]µœœ–ÀvºXÏ^ÓE»›TqWG¿'xÉ“?‡ææÏ¡‘À¾§Î©§¢ôÁúdÄP£¤v“oKÅ´Róá uÝ2U4¬w™ÖëºZö¾Éu=ìä6 .àP°ÿ@RY%¹êàrO¯ÀÝïùÑ÷Â7ðí±¼Ú 8¦õ_ºŠÄ;ü¹OÎj÷j9#ë£Ú1ÎnZ“e¬A“¡§ŠKŒ'·ÈKü‚ýÿ;x>‹h†«HQ†2s(­|v@E¯CÉGápÅAh7ÁÝ ˆÌôl!Qø¥E÷«ÏµÄ»F©x³i;§I†%À½ÓW6¢mHÉùN¨1Ê“8Ê(Ö_—v;v ¼VcÖsá¹â§“/@~ZgoOôq'sd»!âÃHPÏyK$žŽ+ÖèüÀŠÌy^x‰¬8Œ¢fÔåi´åkN˜Ìm• ±†ÕjQó&5*%6¬²!53%“ëÍç>;⣕ÝÓø¸õ|ˆ#æPBÏ&Ši£}0XoÀs&Ľ‹§»hÞâ­»n?x<ò6Q(y¼(Y¢Yíã¦2œ ¤Ÿ£#½‘wd$E%U°^eÄv=¶S>~³\ÙõÈ(Ç0|Âc ºÌ¢”L] ”w å@ÆNß¶‚¼¡@Éþ~å•Oà ÷˜ ¼NÞÈ¥¨ÔJs²­þþI¥dV^‹æ²KPãš’Tí{àX ÛÚ\[Ýzgà›ù·ËÓ §—´hóž¸Â+Ð ¤ÝõU?ÔÑFýŠÃ=|¯ó’Aî Äû—øTç*÷fàôçò¯)Nù®c•°ÉÝÚ ´eé`_ëØè¶Ï!p39èU^QYT\Ѽ-U£¨¬hˬ®½Ãušb+¯`Ö«$.õ´õÞ.Üì‡~zÆ Ø2ÏÀÅ~Á[à½m˶ڣ|Öñ%NL3UˆRY"ZëÑ­iÈ“‹¨¿%߇ËðOóK›]PÛr¤`?4ÃÁÀ ç 'ÝjZf[6ø»{n÷ÚŽàZØYZ(âb×ñÆmG}é/c¿8 ù‰˜+–À@?N¾/°dŒÒÌ‹ý<3~³¢çžúe‹Ò€õßU$µ·p×ñM~wRH$øpþÅ!%{gíŸF†Ž·&ƒ ÿËXÚd+jp`fŽT‚hS´x­¿=pÎ>F›K›k­§¹pBÝðÌ8£øj¯qôýEù>Ñ ÍyÕžÝ^Ž[C]è`ëRîßä߬þj 5íxÅÁÒšFãqh‚ƒ»+]s"hæ…rÉgøÄ4Çãs) ²Kg×Á?ŽÆ—_ÁáæÂjÛ‡,ŽÏ63²KbÓ(Ä_þl¨…¸•éQŽóô’ª[¨ú\*ŽÄ0¾4J~^{Ÿ %æGWȰ_ߦ¬mqäIYzbZ¬"Tñ𤣦ª÷Ðñv{ePí®#šÓÐÄiËùLœt·À'á´³– ¥™y†™uz š]¼÷­‹#y#yÍØïŽn²(Pd%Å$EDS¨ð/ ÓWUìwÝ·nîìÕ—Ù9^WÉ×ìV%,£œw\—«m?X®1sû¾éavšR˜l¯Äç®Ub|¥¤êî¹\{JŠƒq ¯0îiîþ¥Ï¯*àˆomTÞÁúVÈDÚÎ@§L-Ë+È*)Š4º>à¨ôp÷+Ý‘ç ÜÛ%s`_í^°G­öõ€­°³À½2Ì>ÂÅ ¶p<¶Ã¡8è×ã—h =äV¾¶n L€šƒq:Ÿ´ÐJ¯‚ÔüÌ\®+‰Ÿ JP©«Ý[ž_\™oî.Œ ‚qS-d_ƒƒ4ïÚÍsœ8vaëÉ‚¬ÏnѰ˜¼Ö›ì߉nRü°{9ÿç-øÃ'­º"m[[®æ¸©X¦„.gûÛ±sŸän^%ˆ®³‡Ð9\Ç ¨ò­ 2¸æn¢D¶ÙÃk-§‘™Æd¶&4GfÈUd^”ßÃâG<iÒà|fÂf)ùCòa]‰öPA1I^ž”z@!ÿ)YÜß;X{øø”Ÿ=^<@ÅʪѿIò䢣7/ú³/4ëN¯mjÔk?7ë'öü‰‡dXApF4DZŨ¢½zÏ.רª*Ó²]¨uo#Ãq½å£oZ|žLQÓC¥7oízjækrâé´ÇõÙ-i2%¦Wü•[Z÷jŽžÅ;Ëœµöà n°&`›ïÖ­!Φ§lÈ#NЋ¯à Cžtbé-ŠðËð[¾öã“ÅMÀ]9=…0D¶dÚ» JuQÅ”°‹¸%ý+ükw}ö/–2öG2@±6»nçäûÎ=KÕ‹i NŠ¿²òÀ3FöÒGi§ XŸð[®ÚezPœ@$¦Çyò®1ø’¢ Úó›Oräƒÿ.O<Àn%&nHÚãàä칸…+îÐIŠ»xãò•–Yë虣ÿˆí“‹OîÐÈ.¦PÞ˜o£Lаj EØ@ί$¼¬¤,¿ºÆ»ÚQXÎÎA+{Hiaø øÀµÇ*õ¢M©¤¶£Ú¥øP|·ïQ@"¨!*Z­ŽMHô*õJÛI µÜõ¾½<óüË‚k½öǷǶÇìU•†gÅéCÁ•›6"…QàÿMô U–&-º·' S¡l8Äæi´'-,JIËÎMMmÚÞ¢Ò›žÿ6_º €Ã!•Áe;÷¹§/ÌóO}?:¸š²¦ïd }–.@ ¹½=s‘é-Í7¹gK~ëÄ× R¼ÒK@£p…/«™é1rœŠ ¸MªXÒÿzÐñ uç/ ¾ëÙ…^îîKáN¡€Õì\mÖô¼jDk|ŸºéCÛY‰Í'¼É’ñ&ï]ÕTÇÂrpnñ¨ iŒ?ÇàHYÕiNª%Ã1ωñÙžgD|@Y"¾f”‹j).EäUiê4Hç*ꡈöNê Í6p7¡X+íòÝp4AË´ˆ U&dÒ2}/¾×-KÚërêLÝ¢·ÊÔ¾^Z_ÓŽ*õÞ=à´GMRŽ ©tªv\÷i÷`¼Í—žiL)1ís¡x¹Ë5\Lûš5y~”ÔbÔ ªøÉ$Ùr4VÒÞ6™ö¶F]Õk«j;Dxù€§iu k²#3•¹. u¢4³I°åÌMȧå•bUy ×–­Ô—]>°Ó´§ rÕ9;‘'¿Y¦F'ÇäC>¤d§duá>˟ɾ”˜e>XåCrVJ×GfFIž˜-Å1˜Ï¤ítWîgdkkËÏô=½ð×°> òÕ¹qÔ‚ˆXeb‡s,ç>ŽÏTë Ý r²sÊL«]ÕþGµì0­þtê–Õ?Þ2Øòà€M«ìÔ»M’+¡ª¦FSc*É€dÕ^È¢nÈË/,7VTë«¯Ž¶, ¦éŸÊ˜¨@ÓãÛ&ÊKͺ8`ÚàÞl0éOœõ7Å êøo¤¸ãò謮ã*j¡„ºf³:Dã¬z¦Ìa:`äøáÔÖ2`uðŸ%ËÁ*ÂsUº ­!j¹ŠÐ‚ €°?Ç&·c§ÐüqùI\&¾g™]QØx^GmóTyAÔ9ТwH%íµâF“XKÚà‚A´ÐKšxÆ(G‰#úÞF¤pù1.¿Ë”dêÒº ÐŒÖ^©ëábMo¾­"2Ç=Ù^´3ó•Åi”=lDM/Ä0]/1Kjú‹×÷d˜z4ñÓ.Éo]»¤¸Cü'o*óõ òõ- 2ÊÊ :¼úÿ³.m÷¢OvZ©ŒlÏa:_Ö§™›w˜ôŸYlþÞú?‚Àÿh endstream endobj 254 0 obj <> stream xÚMOˆaÆçÓY3ÝjQVhÕ¯K¬´¸¶Ebô‡– ¬ÐSÇÁVAgmÝÒtùV7ÿ céª{ë´àaéÑ)ºu‚N:ÌLãV£]:¼?Þçå÷y†ã`~ãþÝGÇ—¼¾ÀÏôp3öÛ¿Œ§åîœdÅ$ì j¥%Ü6~€ÿ!4V Ĺ)çΨÄNÎNyQ…†XÄtLçKåN„J$¨§!†æ™ðVˆu¹®8]®u/OÍ4\ :àeǽ ×].¼¥˜pŒAɆ¨(ɪ"t0L±)¸r#IJñëkk<Ï;ÉhÂI3[·«³!è§“¤6ácáC2JÁY!çŒ^:çXŠ>z“bbjt-†™° jîCP% w²TZÄÔŒeVv‹)s÷ ú)o-Ù|AÝѳf¡Q”>*CK;¿ÊHÿ¦Ú®Ù‘ðbçÕ䨲H¯'es§‡úe¦ï2â’=Ô±/üj}é‹Ö‘hëù»J1^K(K(§Ï ¨nk¡ª‡¢áóWUËõ ª£F¾R(+‹ÇþoìR»¸—AúçÛ(kG¹¡bnýÉî}Cùö@§,7OÙ ¸»Gœ®†=Â82ŒŒ£A¨3/ŽMOKÝØ endstream endobj 256 0 obj <> stream xÚ¥Wyp[Eš·âDj °V‹–…' !;»\Î!–Lqr'$ÎåÛ–ïC¶lÙ²n=IŸ®§§[²-ÙòmùvbLLî{’ Ç2ìl–aÈ;T«æýÁ¶’8[µÿn•êÕW]­îïëþ~GóRæÏOáñxfíÚµu˦ç·gìØ¾2==9öFâå”Dú¼Ä²Tê›÷æÿ²p^âñùÿÄ]rÁðßV,x*%…×úXò[óHò›ý(ù¦ü ù<Ʀ¥<Îã¥-yqùªõ[³òÊêZhg c`bæÔÙ¯,ª“–•”WÊÊ e/å5Öܨ‘ßÉ)”J—¥§/m.X>¼~/x=}.xu.˜›óúý9+æ‚•÷‚sÿZ±l.øõ\ðÊ\0·àйuVÌ­³rnÎÊWÓ_zeMeyU¬ æé÷+ó j*žÞ Ë)“æýŸQr.èÅ”y¿Ÿw+å)B?ó8^JÊ"Í3ñÌ< xVžgç9xNÃsñXž›çáyy>žŸàSþ~^ /e^ÊJ^ïö¼éÔ©7ç-xƒOño >E#<õÀ§~ùО…ûN_ôÂ#Ï=rjÞtš÷6‹ÔFC5´ kôRXÊ÷k·yín±•q¸En£³…âJù4˜ÀdA‹~™·zÁ‚h}bµ<"OÎ&òïˆt&½Vo\µá­-Ëwht wt_¹øÐþɬøNFïlñr9Œ¼Ê¨ÁW3Sö±tÒl78Á L<öŸž<|¸½]ìtºœàBÂù—žΚÁb±º•+Ò›z#]R.ÞŸ·'w·ÔHëiЃ&ÒèVw—ƤÑb—Ú% b’ûØÚÃy—åf;í‡í{=Cƒñ¡ÁaÆåaínd¸ôE–'üoaïÈy‰·q¹HÖR_/Wä—H‹ŠòóÅ&ÚDƒF† BW_kàò±«Ÿ\?ât0v`ÈbOy¬9xpªøã£‹öhŒFƒÔ™KÙV)îúþ&¯q2üm¾³ Y`S3‡&˜ßV-¶ÑÚJί®Y­Î/Ì+æÒ´Þz¤gh†²ñ]V'ãtôu‹Gãã}ÃÝb§Ý™Üß&VÞ®òU÷×ÖÇ ±Ñm© Yœ9Yïo¯>§‰%–ÆxøÛS"+ß™;Q9סý¶gÂê°‘Bn­Í@Õµ‰Vh ù@®ÜJÛ ŒØà²x-nèvÅ\]'p“Øîqx­^²g¸ÙÛDÉ¡©ÑÔX?\Ñ^«aÛ¶’œÜUkaljͼXá7úÍ~˜†“‘ô ŠÌ-t‹©EÊ=)nÞ²kÍF@.ôI¬,¸­¬£×Õãê žj;?}(Œ†:Ùø‡,];AJÊ09YÉ·7S4=‰Å1ÌÈyÿy G/§âUø/¢Øgñ/®:3ü)s©uÄsjWzª´Jã‹e܃êµëWg”p‹ª—hr”ÙþõèÊðR,À/á'~·ï›¥ÔÈÌÙ·áÀ‘~}!WÉ=hOÉØ9‰_`ëcû\½‘¯&ð‚ŸM•gJHï,†û‡‹K{ñ¯ci?\Ãæ›Õã¿&–`‹èhë±.8ήëÚÂI¸ÅÏr¯üóÙe8•&þ„…G1O3»úó(˜.Ò­Ú“¹ЖÓ¿›vM…%8?cÜ,!°#7¸ºÛ"‡Ûæq¸{¯ž;÷ á_G5gI`í ›¹täB2—“GÓÕ]¸4†7'úÃUlžþßJlqÿ¨\Ì!àžC+Æ_ 9|ßOŽž±;lrûN_CiA¯¢õ³2ó3m«;9s„=Ý&!µØ}‡_`ðÃá—Çwöí¦„&ÝKCÜRn³¨ãb÷™K]~gÐÔ?Øû+n‰é-É]PibÆúÄobixÙEáH"ý˜ˆ)«…Ï rÛ=IšÏN¶guN-UPkjÑ*ÖjÔGȹbLÇì#tdeÀ‰B*_U šZCÝFÎ)6ë,Z“®>çàüŒrFábß•èY6ên‡Nt¸däµ ŠßhØf1š `´jX Q°ôºÂÁ‰Øìa@~V× ™¾NWߜל¯ÊÕ–ëÊ  «VÏî½FMÂP¨·›e]ä—䉅Δ{P²âÑ}¾v\'9ì‹eÓ~ý_ùÏYíV;ØIav=U Ž&£R“׸v? º³Ubí÷õA?r ôVF÷1È*¸J䨡¥ZÀ¤3k5ù5Ë߇»Ñ>l÷Ç£§».Á)tcwßj#ì/-8ÌZ°u+·½WS3“¹§%r¯ §ðÁˆÜ ÇêÆà œŸúpb¶ç ü]+üÃ󔎟Eç—–H ½¹° êv(ªrÈÝ+ÐÄRQG»g8|vxŽHr›óµù¯pÿ-6ÊÍ•--Z] ¨-HÇרÌͳ@Ø@°è¦„S,°6~”/lð A, ëvz%Â)pÑ.ÉùJ¨³Ÿ°06—éÇBBBLØB؇="ú`\ì³V‡Q«Çá±¹ãø)±wˆV<Œ [É?dðgA!£tW‰=Žã¥Õ]i¼&¼œx3ñ°¨†–+È7ùíCÁÁ^Ê-0ÌìŽæØ‰np‹¹¸ç¹'ÒO¬º-¹ 7†œ .ÔM h˜]:VP5t¹6H7:˜ßw]cž ïŽDnýé[è~µ¯’lžºî}á\ïœÃ\HMtá„èĶÞÝT5ÔkÕJ™¬¾öÿÑQM~MÐ6ÓÍD“ÕzõÌ|™ì¨qw1é¨Õ"£5êªji9¨€fèr  Ïg{Îa'‘„;þ‡\eUÚƒl#g·ìÊz/“<4ø{]ÊaƒKIçãngÛ¡)ʦÞËU;ÌFBlF›†ÚÁÚã &£“SÄÂóýÀêl-H'€ÂF©J*ßQ»¶¢53»oPãõv&kïûqœà)Ãr£/ŸóŸÁ)„£¸_äî tAÁ¯yª|xñÿÙ¯‘í’,ª$6Ú± ‚1>— êÁT徭¸>h]øÐíg¢–+þaµ¬®ö—¿ûßÿeò endstream endobj 258 0 obj <> stream xÚcd`aa`ddäsósõ ŒÐö vô54‰˜Mþ“,Ãjü«žõ‡ ÃYÆrL?䙈³È200¼‘¯øAä3© $U…Xy„Û{Š K‹R‹ós2S Œõ Œœó *‹2Ó3J4’5 --ÍuŒ ,sS‹2“ó|K2RsK€œ…àüäÌÔ’J ›Œ’’+}ýòòr½ÄÜb½ü¢t;M…òÌ’ … ÔâÔ¢²Ô·ü¼¿ÄÜTˆô ”kiNjÐaŒ,@¢ È0þÑÁ÷sn÷‚ŸRóÿÔeþ™úSAtUG¶ÜŸçl9íÙòþ°g÷µ¯‘ûñ”mM_ßjy¾Ò…?–Ný®8›íwÒtöÍ\›¹—Ìâáb^9.óù<œßŠ’h‹ endstream endobj 259 0 obj <> stream xÚ]PÁnƒ0 ½ç+|l5M¦í!utHØ&hw‰a‘J™pàï)êa[òó{¶Ÿ“¢:WÖH¾É©ôÆjÂÉͤ:ŒeiÚ¨°W1«Qz–µôŸrDH꟦n>žêö½NùóõR¦o ±¿S.‹GÈöº:·Ëp¬lï@4ëÄ)Ї“v7ì‹4’±®E‘vöþ†#Úœåy—ÞoRNãä¥B’v@&8ÏA”eÎÐê½]ÑõêW/åÊÌ2þ¹;º©6{j&Z÷Æ'DGÛrcññ'ïü¦ŠñÀJma endstream endobj 261 0 obj <> stream xÚcd`aa`ddäó ò rÕö vò54‰˜…ü±áTÿ¥ÃúC†á‡,ã9¦òÌ?ÄYd^ ‚Èçü ò±ˆTŒ‹„X9êZ:Ss J*‹SK Œõ Œœó *‹2Ó3J4’5 --ÍuŒ ,sS‹2“ó|K2RsK€œ…àüäÌÔ’J ›Œ’’+}ýòòr½ÄÜb½ü¢t;M…òÌ’ … ÔâÔ¢²Ô·ü¼¿ÄÜTˆóõ ”kiNjÐUŒö@¢‰‘‘eó¾Ÿs;7ÿèßÌø D2ÿ ÿ±Ytæôî‰Ýýó*{:åZº;:+«í<$Ê:žúÍÒÍñÛä·ÔoáßVòݺ›BæçU×tuD”Wvvv7qÔOnž.7©»·{ç%¦4^uø.ÐÍñÝî»Àw¹ïúòÝ/’V,ëé™8¡¿ŸãOØïç¢Qºw/äø®òý;Ów9¹oÝÇý¦6p,Ë]?'²;ˆã·ÊoößL¿åäºýO4Nãà+ŸÿÓqÛï¤é웹6s¯›ÀÃļr\,æóy8¿K>¥ endstream endobj 263 0 obj <> stream xÚ­Ž]HSaÇßw[;«Ö*itQJ#IæÒP¬(teŸ³P‘><¸Ã¶j;zvt})Y®'‹>ŒfÁìËXö a)Q^h…Á´‹A}^DÅ{æëEÛUtÁÞ‡‡ÿÿ‡‘N‡0ÆÆÊ²-¥›v¯´;*‹2{Q€ž[¬‹¥NÎP!u1V—hTV«.Ô-AýœŸáç¹&çe˜“†VÊB:Œ òá6›­Ðj³ØÅú#’Çå–¹u¹Üª’’â<®Àf+áJ½‚ä©ã}œƒ—Ý‚——ÓË!®J¬óònÅ:·,ׯÉÏVÞë·Š’k}nðÈn®Rð R“àäÊEŸÌUð^Ë8[3°‹ÞúFY8‡è$BX·Ù°y1BF4e¡m¨íDŒa¤C»Ð]4…w`UsPm7M­¥–™è'_ÃXuôkÕV"›IBŠ‚¢HÐl¡ 2¦A´¡¤f–ŽÑÓ,ACCB’ cúf¢!Ö¤’¦ž”¦¿˜ O'´êc2j~ D¡Aª”ÙFHDFÙôñ¥™‡ÍaòØs˜„!±Ð³è‡ÄÕ^xÃ76tÕœ-ƒõ°–­WÛ[€!]q5ÆDy¯%45×k/»u{¸Ààd†7 ÓÌhÉfkúóã088Æìx-“ Wo[Lä;ÄÉ'„!FL–½Ó’€:mŽI1÷!ŸßåêößêÆb,-¤f'3|ùô^ ½ÀÔ¶B9ëdº;Æ;:;A%Ç8NÂ= ™fLSÇÓbúL–&ÉéÌhS” ˜¿í¼“ËZ¡º¦Q?æ€6¨Úãç g>éiþ‰NæÍŸáϾ:÷ðáp{g&¼¼î[ÈF†h&ú^¾îªu°Tú¦Tño×SI­ú -:YÕ·œ-„êý¾}†/Ì¿¸}鹯§+ý©lЍö."v^Šè)…‰ÏJÎî¹h4&¯ç°³tÅaãLuõ‚_zµ‘ endstream endobj 265 0 obj <> stream xÚcd`aa`ddäõ sñÓvöu° ˜È|)•aãú9õ‡ ÃYÆrL?䙈³È200|‘øAä)$}„X¹ëš'•d椤–g¦¤ë9çTe¦g”(h$k*ZZšë(X*8æ¦e&'æ)ø&–d¤æ&–99 ÁùÉ™©%• 6%%Vúúåååz‰¹ÅzùEévš: å™% A©Å©Ee©) nùy% ~‰¹© `÷ëIçü܂ҒÔ"ßü”Ô¢< óSD;##KȾ~¼ß7gc÷‡Ì?þ mžÚ6±}b^©_¬GwbwÊü¬Ùñ ó¦fv»vÇ»‡MnœÐÚߺbá‰çº·vo*_Sͱ½tEãÚî‹Ý‡·Ÿ?ÀÁ·“ë÷ÎU<<7¦óðÊq±Tæóp~(#)yj endstream endobj 267 0 obj <> stream xÚcd`aa`ddäóñŒð÷sÕöñôs54‰˜ýÖú­õk¯ ¬?d~È1þgú¡ÀüCœE–á­ ˆ|Á" €Hv Áè-ÄÀÆÈÈÂÎWÓÔžhbšhjb``¬g``äœ_PY”™žQ¢ ‘¬©`hii®£`d``©à˜›Z”™œ˜§à›X’‘š›Xää(ç'g¦–T*hØd””Xéë———ë%æëå¥Ûiê(”g–d(¥§•¥¦(¸åç•(ø%æ¦*@\¯¡|CR#€ŽbÒe0RíŒ Ì@ÇéEüèàûUó[kÁ÷éó¼ù¡Âü«ªGô·üÊß’{ ]àø}€ý»Ð…ï’{¿Ë¯äªüñfÁ÷ßók}?Àü]ëÇQ·ïB‘ß%s¿Ëst²åþ–ü-éö[ˆƒo3×fîïE£ur0 endstream endobj 269 0 obj <> stream xÚUÒKOQð{[ˆ#hAaH “)Ób€cTÑ5ˆ¯…‰™”0¼RŠP¦¥´W{;íL”R VqÅB—&~W®LØ ŸÁ¤Ó§N» 797s’_þçž uuBØ426:<6Ô=úèÉð++Yiõ--¨{ê^½r(7 rÓ t•Öº«Àî •ÚÖT©†f­‚­s Bcý™†óÍ-m—®\Kdw(’²Rƒ”µŸ²Ú©>ÕßO بA­×G’}’´ Í/x\Ó“Sn¢ÓÑEXíöÂF’vâþ¬Ó5í æˆÇ”{Ê9K¹µb|Þ1ít{ˆÎ;Sn÷ÂíÞÞååe 5»h™wMÞíê!–§ÝSÄ3ç¢ÓõÞ9AŒÌϹ‰'Ô¬“¨¾ÍR½G©çÎ×ÚøgÄ@3hx‚10®5y(À0Œ@£P„1‡h4êÀ=àßÀ_HÂø.^*‚Iõ:>¨Ÿv¡CýaT7Õ·x")¥ÑVðä—Ú×Q€ 1eºì53!.€ØRÞShO£´”L`&E¨Zå—QÙWßá1I”QB·4òYß1¯Y ³ˆÕíʦä,ö?WùRÍ• <+§²(§[±aN(ÓÇ‚ÙÇ}È«[É¢«Z¬j…âw<'erh[·â#|¤Lý1ӜߋVuGñh\ÄL¥`uæÒOcé£:Kr,…Rº]C~– œµ™9F¢n3(#'Ózn1TÍ oá;ñlíêV@B$Œ´Ü7æÞG£ÝŠ(fªmÊjüª 8—ófV¶äñ,u .Ê‹|ñ°L›%:çßFX!Ÿ/t xD;§µ­ìã\ŒÙ¥S¾,«ÒǼYäp¢F·‚YŸ¬ÓÒ JOqF ‰L®%Ö6•>±˜|RHÖè&“YOž^Ó¾šÂCi¿ì¯Ñ`,(±¥Ê– »Y£I!ÅiÅAÃAcôœ©ø»õå„ endstream endobj 271 0 obj <> stream xÚ•”kLSgÇÏ¡Øór *µ³›®%¢.Ó„á݆ש[¢"Ñ‚3 —€›e°bK¥¥-¥Ï¡¥¥¬ôB¥Z.Ë”9/C‡Î%K†»e,›¶é6·¹±È|{MÜ©ÂÜø4χ'ÿsyó>ÿßÿ9/MEGS4MO{i[Φ¬í ·o\—³(mñŠÈ³¥\2ÅÍâæ ¸ѤŒ\-ÌükÁ”§)ŠÂÓ#õ‡©‘:2-RðE¸0‘Š£éXÑìy)ik^Ù\¦*()+[”šºdɸHK‹'ÄÒ ‘6!VŽ‹¯Xœš²d}ù¾7«Å•I[Ê‹Š+åIëÊß(JÚ RË‹Š‹&½¤(Z8LÝ ¢~¡nÑ£üm#m¤›h 4K7Óf*&Š¢©(j9ÕEDy…ÑÓ£S¤ ÷›_±aîN˜ÆR‡¯á8Áñ»ëÅ%·ïáäbüõ‰dãk÷îLèÛa&á>}Sô”¡ïêÄkCt¦±úºË°RŒ‡„mf«klçmò,Iœ»’Ì—A¦'³?ÿlÖªa@.á'ÖáãÇ>cÍͰ {C³VZf•FYQøš"² ;øÖYUØô.œBÑ_¾yÝÿ̺H› OÜeCÜ“AšK¾%8ÅeŠ+ÌÌ tWöïÎ’¸´®ú6-21jµf*…ÄHÊK•ùy€Tr\2kAͨ™{ Óå„:ŽB®Ãn·£Ý_Ó§"SÒ¨”ÖAÛH޵!†×¦:@Jµù Ó XL-оpÀïv¨Ý5®=…]…½…ƒÅÔÄëÔ¦Z@†Èž*a(ÊûRpŒ¤Æ«ñ«ÛË´Ù]—}ø‚¤¿«»s9HVUí>ãAh5:½Ì%Ñ’jºFuátÆç3û¤NpšZ‰¶‚q€‹uò·•2ò"“s2»?çí‚^‰¾Ec;jó™íÒ ŸPTv‘=ÆÍê¤Å;ÿ„"À;¿Ú Èç1ªedŒ9PmTIk¡–ÕFüêCû˜j¨f›¬LV[«Åzé»Á—¿µÚm‹ƒ%C’É ˜z88è° ,l$Sü fž“µûÌþGÍë+Ž2^ðšÌ <(Ð錆mËrR3—굺úÆz¾$ñüÛí¸‰†¾R<“$¹ÙÁD¼ûdi~nTäijøqAëâýæiÔ2"7ìhÊjÜaX¥#±é =«gyèí­v/x(7Tå-—﯒g¿S~F:G®´}èùžýnðÁZ¡ù±íÒ¡ ZYϸE§‘‘?ÿ3¢çÓö?QàüN¼üA¹£ÿ/ ~—ÚGÓ—sIƤ }ÜøéqD¦§ÃcTÉHÉÅIŒw2óYŠ™†nÎÃÿú¦ØÂ劷ê¶(È/ÈWn­°1¸ñý=§Ë.i†à#öž9sò”÷¸ 4CeyWÖv¬D¦x÷àJøH ×Õ ŸÂù]­éÍ*V *¤``gSÆëE y‰¦Ò!H÷¥‰ïÏä@‘‘WÃxA'íIìÆ«çb ¦EcÝ\†¸¤“ýÚhÚ+»`Dcбþļ[x|ïéê³ð1|¸Ø7ྦ3p> stream xÚµX tUº®rë²kÊfâŒV9£Ž8ˆÈà‚ n (›A‰,‚d#IoÕûž¤ÿN'ÝIoé½³BX"²½€t :aE}Ž:nã¼Ñ¹Í)=ïÝjàÍÌÛÎ{gÎ;!u8•ªûïÿ÷}UÀŒÉ\ñðüÏyø–'g—–Þ6õ®ßÈ÷¦ç~Æä®‘»¶0÷“‘R™ôã5Es.¼Ut-à+é•é™ _WÈ×IôòÓyÅLaAÁH~òÔ)·?T]¹I¥\W{Ýüêµëj«®+7­ÓÔ¾@ïü‡¿Ð㮘Tt눙̃Ì#ÌãÌfó$³„YVð ³’YÅ<7Q,`˜QÌhf 3–ÇŒg®`®dŠ™k˜ë™_2“™[™Û˜éÌ æ.ænææ>f=ç!æazÖlfó(3—™ÇQøÊÈ_ŽÜYô\ÑT¾b]øÆQŠQŽž7zÏèÇØÆŽ[3ŽW1îÛñßNÐOøêŠê+K¯ ‹\!·†ûñ*¢PÑ9‘s?,KΟ¯¾Ðû‡ s×\˜§06Í»4êŽyÒõ ]‡u¬Oºñmé§düÝgÀ ‡ÚˆëÚL­7¼µ˜Lr%î5r5)<ô[!‚£¦ Žo€FhpãË6†05ÚÍ`åfK»é÷”Fƒ4$¼BB·ß¯Õ=o%Ãæv÷.øÝ‰m¯}wËWð%Â?N®•ØO A]».MŠÔ¹éÙºl!Ñ‘œ¢"Yž¨H˜ýæ6`­I§ æEsÂÚeêÔw™q#»A¿Q¹Ao´ë Åú°.Á‡!ÔòoIô%¶$+ÜPEÖí'¸°*¤OòqG<1HBº1éîðt6vlÑôi·hCŽ- 8ŽEèz>¤ Ô„k£5!ÜÄnnÍlFZ£~HÐ\Ä´¼ Ì6³£B[®­Ð4uÊÇà8 ¡¦0qÚÕð"˜Œn< +›Wáñß©Ii–”ÒÈ´42-ùD!ý‰fƒ^5Gr»4‰ac,ŽÄy2Lc£±`œ›IË_]_1¹vù¦Òš'kž\1iù¤•“´«7•ËÜrM±Ž†Å7¡´Ç—i¦v'v'wŸ&SÞ&SO‘[C¡Ž`§?ˆBs©¨1¢ç¹Ãô-w#àñ–Á\`Э)Þ?L¶s{‰ûB¡BºNÿ„ô HŰ(° cÉæG^àœ†cƒ}C›³á7á·ð;ûŽaîÌÆ#¥³s{]Pïv–ÒYE„…óIrÕ¶ÓZ½­M­€›ÐëðâüÔÓ‘µ­eðܰ^ºÿ†܈$6‘yÎãx¼'›;F3n£ínˉŠî™ÌÖZM:1`îHŸñË’Õ—‘"zµl)Ñî²@9àÇ‘FoS«#¶ôEw dIc¾t®anÿß—Íp±lûeý€IJFÛRIC@%”“d úúó·H¡.~|ÇþMxu]tž¿ºA¹ðfo<&ëÙŒ5¬á7ACµS»vËŠèÓ€ïùùr‰`ò©§?Ò JRÎTCÒ¶Cì|¾i v±s­\ðð´¾îÕ·h+4z^ú« ˜’|7x{|‰¼gn¹Œ'‡‰i˜;s’¦EJ³ q«éÿj—4‚×Éâ‡SðÆ¡îáØKMý°“·ûØL¤-%p{ÆŠçÎÐÕK;K©L-M{Fè“Î Š©*—ÊüԚŠa!¬yÍ|Ø•†4d09ó¿8áoúŒK‘ƒŠOÉÒ¯¥¥Evšz»JuÐégPº½-Ý­lÒ F$‚áKª|pã±ÊlƒÏ%Pëñ5û¼¾Ø¶’ÄÎøÎÄÎä®oks0Hù„Ü—‰.•× HL¾]tSZ£‡¥›î#7µ¢D{kZàZ’Æ –çRÎü”âÉH†FW-®JÖÇøv‡Ä²pmÇÊÎ+›šê¡ž6€]eRYÔÕ‹+oZ\ok0PZ "¥Ù¢Ý”iˆ Ÿ ®Œ:ç¦Ã‘h&.•MüM¼D9Ìõå ¢]œ© t¦höú¡Už©·Á—^œ‡ã×+Ï_M@öZ‚0µ%áÞÖ¦H«­‹‘­o2YSFé@8&pá¤AŽ¿WŽŸ"Ô¯Q­Õ, NÖ§ŒºÛ‡èéÁõmÂHÚ’‹ÏJ!zü]4’ «ó‘TÉ‘ìR).ÜHf²o[˜ò4.Ü¡õËg:À‘¯úˆ"{£ÃÔ`+És '˜=”»à'³•ñ†$Ofän•Ž%[:©Ïù#ïß™Òɦt&(~¼QšÉl&0bnC]‘ȧ.¿ŽÈ( aŸºRâÉ„Ü!á SØÍ¢WÃKÔVØI¹]9:«V¶el5¶7àñS† >¨Qˆ V°:jêâÉiÔ 'ˆZbZÊCÎ!º¬@æ®,y7[00LÔ‘ïÊU$š’MIÀ¿§ ’­‘ÆOû¤ì”Ð/ùwÄýÍm­>h°>âê°nqw£L[4&xY{ÆÒ$Ö ]‡šjñ4C3&óYøbÖ±)>¼-»Û9¯:©Ïd‰Œ^𺽘<.ݦ˜Î>r§cõºÇâ‡y G>IõûûZú¼}t+9É©AÂf èNôœ(̯Ä8[›tE;ý±dûÊwª^¡ùÂçIAßÍ&¬4AX +´åå˜,e{4^‘Ÿt3è°±$øÜéO çƒOͺðì²w‡z‚€`>¿C¯8vþåi³)ÄÐ>r]ÎÐÛ4=ÿš£ DŒR1¬Lh3|áæ|jfóBþ$!ëôI !,}(ž€×Ò}ûüU Š3êf#_  ±êÅòŒëá˜}²ñÜž|ï > Ê[’%'²4àâíÃÄKA€|/¯»lE÷ºäs´¯ºG*”Š~þ®4’°Â!ØÕ±mU!œ¡.dÉðçè2$c–°Jx:E)K°†Ÿ‰´›Z ™“‚´\úV-îfhÁgŽž;ôPé<˜Ý2V\ìdnÿÜÒ‡åï…²÷ÃùØù׈"[@®$Kdêhoëà5qè¹Ý¶®ˆ>CwëÒiâ÷“I±0ÙôÖ½m¡pb8©kù*Ñ"ªË×Ñï9Ç ïaÏkŠä‰=Ù÷`v?ZÔdóX›l2u!CÙ¾]˜-&sé–'ss)îAÙ2V-2Š%…?KCwÓ›ù¦Š²% S´“íyüN™Új…›È™ˆ¡H´Kݬ¤+ÐÁ—Sý<÷yØWïœJÆzÇg|ëàqx B7»Áô‡ÒFíQòÈ‘£GIÙÑMqïQÍ0ybxçQîkË7ä1…›5èœU-ªÚH]™¦²žÁK¦”Ÿæ?ò³}­,ÁÒ˜î»ø©èY]r‡àc=~¯¿Éߣëµm|öƒcM·Ø¶ˆÝ’m¾f ê ¸:ñpS¿²6ô_å¶MºúÆúz—»‘ Ĉ¡s¶ˆ>Ñ«…ðð\çØÎBEkY§›¥÷½Åí…&ð⣽ø¯Ð>û>˜ï–¦Ø4üBøeÚ>(Ÿ°\P´±û_:|ˆ?ýk}K°]¾æ©¥ü2X½ËùOùœ$(["·Ì‘c羺HB–±Üw¢Ñ,jÂVÊÓ§Ëp–ŠC¢°ŒÜ‹Ní>y– CßxK†å¬ühžti¨CæHÝ„`Wã+Õ[êzׇž‡eð¬zÃLžù¯†ôb;¹²6"Öaîsbͱ iHGé›M#Ð]gË~¥(ùK˜BJÁN±™.Ã;É'h³Ø,ò(—¯Ô­]áˆS¡ë4uɺ®Ît’®æ3šŽÚ²V–’¤9¶ˆŒÊ©.Ý7Ìõ“}Ôè÷²®ÒªE‚6€Ó‡9¥½¥mß³@Ù‡±A‰ï;×ð ߆>ûx€Ü@…¿›ÖçF²}ºfº¤§#¶¾V ™¹ù?¹°õ¢ ý—]È#+›%ã²Å)ò‹Òê“O)ËíÕ˜M:mØBszJÆZÓùœ–žEgOS3õ"ù¼Zi6QÖÊäšçö^Â’3ˆÓÒÿº©@ëˆÈ@¾·[M.RŠÐ°ÔÝ%u}u}µô·Äå«÷Ó=l$ ‡B¯î-‰DÚSyiu È#i_Š.û˜-¢â¥k.ϧFëPꃆ¤°IÓ¥_‘Ù{ì±üBvÖœùóù{à™wl§þ}Ðú÷‘sdºXM¾W¸û‹’ÎX/±H*µ>×ù¾4t'eJ³YÃtÍp½-”zµÐ”ÒÛíg¿›¾.Ê (I _šid:·’±<}žr‚&U»˜¡Ð˜ˆg-hÛ(,„{_¨Z&×!™M0¹…ó[YÎr1rÍ6ŮʗmûôÍö/ I'Ïð«ïµíæ_„#Nÿ*L…uÛ@)\¯7>`Ó–€ÈÀfwËãÏ7¯§ªPbj§°´¿|þä&rGîÀs¤n=ïFOÊ”ê(æ*¬w¬pµK…Ûå/4±X¤ê°|é–X¾A)aš ) ¿&SéVù%ÓP٢ѴÛ§’ˆ¦‘«N¿ûÊ9J»t>Qi5)y»b•úùź/óÄBf°ñ´·[ÈóuÊç|‚zô>Vï¨æÇ»Þ\(Ï£¬Ëé(îýBF"`¡ª©:V×µö€íeØ{B[{0§}úþ=”Šù3Tšk…ådXþˆÕ ~œ¶†ªøYòÛ¤SÂAi5µ[eUëW›×6¡õMµ!8„I†í´Ejø»(u³jtASJSçÆd >£¦[êu­ÊW¥Ÿ—„WGW‡V·o¸z ZB§{ÏwŸß|¾9Øh â>”‰’ s°VÆ!5UhòG a3’é¤Ä“E›QŠÊÛ¸…¢'}¢–*?UÌž¼dL´‡I˜<©ð XÞ5?´*°>Zß û q°m_ä\û¹È¹¦@c0*/€vO0èi§B–K¥ôA*•_j´IHÔ9褚õZ& 4ö‹»­/]mëuvÛkáêÀ©t(m¶J{…KçÝâSd ä]˜áxZç…›—r€-Ï VµÀ–)_{#²:õ8ü•Í•-•áY‘³ZÊ}êÐ ¡¦Èζ¾’àK‘þæÝ2¶gsÛ/4Vš©­HFŒ+«ÕÓ{*_â¿…dlçé=¤x7)~™\é yÂtt2(÷ö õi×ø$+ìüw•Ù$RgäEÊ÷¢›¥ ‘¢Š(m©üg¤IyÇóMi2S{¸ŽÊ>ƒy2X¹múößlîu´ØÀŽëÙ½]ëÔëVj—öÁ´Ü¤Ý|ó Sn¾ÙhÔÛ¡kZ TàD¼¥Gx+ÿ±Ž×ƒÞÕ â%Rœýæ›ùü›o"‘ˆ:qÒN»Hú)õöja)«¤¯¦#­½<ÜhÃã­Á܃mdVIË. Þ?v”ìhÏØ1}` ¿x£r­¶~Ú¿^õoþÉ„? endstream endobj 15 0 obj <> stream xÚí]YoÜÆ–~¿¿‚o7A`©öåâ"€%[‰¼oñzý ±5Ž€Ä2$yù÷s¾:E²H[ìVK6A£Éb±–s¾³V±iÑ(ÑH¥¥L£]£BhtlLÐQ3¦1± Ê5V5RÐÁÚF*c¨g´£z«Mã¨Þ ºŽ Á7ž†Â5žÆTZ5>Ò,Q74°²Ö4ê} ±©>ªÐDÕhá|CCjed‰CtI!‰.å©@zGÓ ¨h)# ‰L娱$Ò¤Õš•%f u§9¬ð’¨–ÄŒBÁ4–¢‚'¶…õ44š$j¤q…Ø8‰î4¨ÓÄ$$œ!2%Aá±*‰ç è¨WÀ-Bƒ*¨±'d )¼%h0—7ˆ&ˆ4¨"À“§š†(ô$¡B˜Fƒª ‚x$bƒ BˆÖ¦k%ˆT‚8("Õmðæš`FKhÈ)üTAÁBˆÔґĈîà1ÕÓÔ€*uñÔ#jPFgê@£°$&IL4d”']+š8R ÜHŸ¢&žˆÓhHÑ‘ˆIpÄj´ÄPÁÌe›èA?!=]‘¾‘Xº%¨MÄh u„>J‰†RØ@U€9 ¡ E€È¤AšÔB’S Âsa0nÄ]‹uRobWB"©Ž†®yŒ Jid̈Ai]„‰4¸#”„Þԙž˜ T^BOÝŽZ[ÜÕšî Ù]M™ÄƒÔ˜F†Ò 0NýI­4ŒŒJôzŒçqÇc¼€~Ð b #[”p e%Åð ÌAÂ`a$R2P Dª« µ*¯Š@'4"î U$üÉHÈ””¿Ú@=&ª$`eªóàR£a’< ,Ír& ²ð6Â!@îšfRd•¤è¡“<,J ?Ò$YÄèPe’üŽ2ðZ†¬BaFaàHPO’Â]’¥#™ ÑMü+’4Ñ SÂè€ µÄ¡B[Ü”µàZ9P ¾ -¢NÌ%GF: È‘·$ T=¸ôèᩎî Ô}4¸·àÜøÄÑ;^$Έ7Ð+Èàܤk à4“©)2²/:;pà|rÈ`“œŸ"Ÿ@êžÔ… @P%G«¡Ñ¸GþªÀxòoà;€ú$C:£ NC`¸gÉÛ*P±qœKŠÊEÎ$0FgŸFû†œ¼Š¸³R¸ç ݈à2ViLO¶ ÿ¦Hˆ¸I#80‰4î9A—PÉà šÄ]6¤ã4ª0—§1u&±TYLBöCÕ4<Ô$‰±@Âùw-D‡æЏ%ÒB“çþ÷¿wN?_àD†¢å³Ý €\ gÉrÏ\€ÌR<à˸ëål¥ŸÞ}rvúáùñÅ»Ý'wv_ÿu±{øçѧã}>íñéðýÏ?ÿ£¤¡ƒ‡‚-†íŒºMª’â ¨¢J Õá¢Êp1© “Špøçb€Jp1©Ë@@¸(!úØW…`HaAwAËetwÊQÚá²]“RXrÕK«`ðÚa-H-ȪQÝóWbYÈ¢g B5U*x.jx.X>-,~;¨3»Z.u³µ] ˆ  ¶ Í)ôiÂáµÁZ¸‰žÀÖ‚þ–¼›%¥  *ìªX±Ü¸’#¾L ^ª~¶'µja8«ؘê~®KýEá<-·¶µÖ1âKkxèëÙdœó —yѯÚq¼-¬|f±5wUª¶ ÜRV"VYÐSÐ[hëÒﺿüF ÞkÛ„¬³ïQΫ> ÁLךKõÉHUHšÒÉõ7f¾‰("`AöŒ3myÜXLWéz÷&ÖÙèç¯qµÝÔz«*UDÕ­íè”çÒ ¬þÑM×çïd²¤I%–öEÿ®ù95øJÍUß¼òñü]š²áÀ2YÏͬ†3+Uí¯ÝÂþÚÖûÇ¥ýÃ*Îu•s•ÐÃçžpÒ¾JQsè!FÖûÇ¥ýCµ¿]:¿•ë#`RìÂÉŠ:vŽ3¢ÀÔû‡¥ýëpja·6³îø´Ò~¤ì†ð±"[a«“­dZú¦üÌâéFüÌôKû×5Êë…ý½Zˆ§íÁpÌ»c<}]£ü¬Wð# ê^ÁÇ¥ýë½°ØÏîħ¡šPG Ì"FÔqiÿ:Q-ìåú°Þ7 &> Y¥`Ö âˆ‚ºİ´Ý«àã¾ËB¬Ad;ˆlqµ_Q3~Åe?âó9äsœáh.͈ã4Aè™ÂâfP•rér!ª±ðÖøÄn‚@Ø|žb6ãŠjLÆ 2.¡nbR©¥#(¹2C!3JÌ1ghQÉ03#„Å#Ìh…–KGЛh…ÊWeƒQ3Z¡gµÂŒÉ˜Ñ NPO¨¥‹Gˆ@¡³V謫óâ9ÏsFóhÙ›É_,Í\@£”B53‚[<‚!.aáZ!þ\š o¥OàWɘÍ×ã(·VÎŒ`0#ŽÙŒ{:‚ß ^'¤¯ðyFÕݬVŒ’ éf´Â¹Å#ÌhÅl²<a­àCú&Ÿg´ÂÏjÅ8Ùð3Záíâf´Â‡Å#l¢>k…ÏZáÝFž'»ð˜sž˜sžÕ”ñmÊ”‰ÙýÅ|Í”¾ß}xüñähïô¯w¨wßSyÐý³ã£‹Ó³šǯ›Ó¯_¾^à› nG„)ÿEAFýˆ  _?ŸýðñN¾|üï?ÿjþó5B«ðŸäANN?ß9º8þáοÐ_|?G+£úŸBüóGž/ÑßqŸXÚ?º8úãôݧÝÑ Ezi©wd.ÿýZòòZìØ ûwÂà(ðe¾ÆHŸÆä3jÊ·S.×rŸ¶ž[·ãˆŠÑ¹í;}¹¸žå¶#•#¶s%©YŸ\l[×·ãR°²JdŠ3F X‘R¦ïë•éNGx’nÈGGr’”Œ²çpTóŽxGÒß^í¨Tb x"£4±«|·¦ƺäE*C›C¤ š’ž´oη+ 7‹¤¯›%À­HJÁõcäÚ$ &?‹¬hDrJé˜Á¡ L‘bRxNîȤÐ?9þ½ [éØÜ8…ék‚²À?_ûh.YªL±ÇïW e´‚4M&·à„PW¾±NTÜ2õkë¹µUªKÀÛ»ø1Á¡*ÑÖËmá䣋V—÷M¶‘}£\÷8AXªnÙQ_x¢VåTÓ Ú§˜ÂÃK+Rº’zY•œ!Í"3%\ßóÃ¥h‘žå>E;ì²À+ L9æ;N¨Œ+—xÖïC3…Üiƒí5´5Á†î*(;ƒsé²Ó¡¯‰HâKÌÑRÓ#ö9\õ\“úZ# ´ù<ä/j›äÊ3MYNèä£X/ÝÖi®¥juÞ%ÿ»ò8ëK$Ж-úÁÇI{ïxs"`YÕ-³ƒ3]Ë@:LºüœL¤^ºÙ¨ÓÒ£=//æ¸Û^èH!ˆ|ÍG)(LÇ¢šAdÀ[ÀúsÍ5§5@!Dz2Z@y\Xyuœ{¤1Ê»yå­Óš"A¼Éùeß**äÑ|l¦W*K†©›ÓÚÑ7|ÌjŠû­Š@éeåxÉnFίöÂJÈ,nµ¬õMf ÉÑØÒûêne­Öëe)üt»û«´Põðt¹,S¦È5i[O ŽŒKIM–£N¹qÚ®åzîܶQy˜ [çG©€OÁ_·ºr™ÛJ;@¨³±Óçp˜Ú’Î9“…¤”Rú“ uz\]~hu0èlk|ŸVÐèWºå­mãÊ=gÍÂu'öC>zÏü‹\JÒ°x#!ð’Ã×!Ò¯Ñ1ag:I c©öœL×Ú‚SIbZåT (Ø,b:¦Ç“Ú`Cˆs|¢¢©;Òø:ÞçK© MáÔÁ*µ“)mQéÁ sƒÜ‘üÑŒØÓ-¥Ø ô m¼t@(âc‰0ûšeïRZã1Öµã¨b+æZYÕÏÍ!mqÝ^¤$•©uÚ±×°W­¢'_và-ÂyðL‹ó­Ï7IO›Ü{J¨\Šd,içÛàíŒKK„ÀËÀÒ©K¤ë0'´¿÷É‘.êËLÖ4"ù3x 4~b2~n2­]õXh›È†´kaD±¯jݼÛ—íj}¤sϹÄè‚ÍrëÓ쨭ñ‰©©`G@'§²É jìŒðqÞÀéøÈÁrD!/Œ³Îàmz‹ÑŠ.®:ç>µ¾«^²^bvYƒåÂx!>ó˜±ÄmC¨Ä0ŠWþH„_ñü,(¹8‘7FägBÓ -jêd£ì"»â¥ÙòÜ|ÑmÊ«áM+™–ƒN ÷®½H¤Y÷¶ö,ñÆç#/7Lz‚cÓÓ(—˼¨ŠÛ1Úñ[Y³{~zÂÏ‚MOI ~/9mí!§âv¿\Lù†ÌO'\ê±ÍÇãp¿<¾·éY —íÈž7‚¤°®ƒ®%«'¯c“:" ¹„E-Mq·ƒÅ¨°ÐMÚ·ãû‰iz È@÷w˜<.ç¶ùôûù ³{ûü>ãë¢ÝE”oɨw/Žþ8ùpûó§?ޱûüâøÏ—ds»}:o\sÓ½…O3ßÒøi|ßô7ñ}ºypòÇ1~”=G›jýy<&~Då|j Ÿ+à3ëÁwûéÓû¿¼d H0SøüÍÂGùÏ­ô/†”Û áÓCøFᆝ!ñ¬ÔŽ-ÔQJуµÿöÉý×?í?|þ¦¢ha9RºEJt8‰H·¤Ù&#Eòe¤¼( Ò¢¹ñ§#ÀÌû‘¢¹!R%å µÌ@‘Qmn¥÷Þ¾zûòIjï5Üþ¼¸<u5S*ÂJ>ýï±Õ1/ Á¿¿8¶R³9|·ŸÝ}ðô+z ¾ nØJþ¿‚Ru‚Ïàk,¦³Ò!ñËàkÿ f“ºæî£{wŸ±^»)*òº,ÒªšE’ç&¤? ¡…œ‚¢† ”„/DDQW°Çž½>Ùiž“ª‡O)¹†;#“»…œ‘øCJ¥‡ðbÁˆø…ðMÂÁæÊwçðÁÁýÇÙ!ÎLÐ37ìÍB›s;É9ä(Œˆ_ˆÞ$ÄÍá{ùàÁÞË}GÆT”ÏÞl,•!ÇRü7T”vŸƒñËàSr‹®ïÑÁã{·äh^Ó>wéˆoS¥Éõ‰!|£°1"~!|ÛŒ^ß~qÿSP[0ÃðéVû¢Á?¬ áEŽñ á³[\®>øíÎíß^ÁùÖµ/lÛ÷ QK\¢i “è«FácÄÁâEWþ-³Õ0(ED‘¤¡ý ÿþëý=¤JiÂ)`qƒ$t¥ÌÌæ«™žV¡ñÿu„´5,Žù%ý‹áÊ¿ìÖÂ¥å|ü%UîÑz{÷—g{¿ÑlÏ*`E±m°Zãt±bœF´0Ñjh “¹¶’ðe†©Ç~M†2¥+– {¤­¯÷“¦ ÷(¯WƒBMƒÈ314ø]™ 4#·U’¿š‰ÏÒ3{¯žÞ~~°WQ×¥.ÞUÔE»V]|“‘*è^nSC¤ÃÂ}Ÿ§ÏŸ½=|”k5£Ò×¶ñSõÖØ»ˆ.©¾ü0Œxzä|¤/Ó3Ùž-ÌÊ®·Pzûøõ«v©*ÙB¼ÙT;ˆéðO»Q‡vf´;;"~±šåŸ`ìð\馄,ÐzøâÍ«‡$¬»¯kz¶8¯—iY ’ñ5àš’‚áŸ*½®‡ÌÈ7 h^¨`v{ öëÛÇ¿>Í2r5»Ùí^‰§1–øäp%nF>lDüBôÆ+q5— <:ýK/®± endstream endobj 275 0 obj <> stream xÚ]‘»n„0E{Å”›"ÂͲ……Äc‘(òP`?ì c(øûøA¶Haëx¡ÙBtœ«¢Þ—§Jö30F‚/£·¬z‡S*æŸlìC ÔF N÷¼v‘zSê'”+P’$N.ô™¶¸¨–£n倄Qš+Ë„ ÿîb_Ñõü»Õ„…“Ñðœ–Ý Sšf–KÇ™å"¶|ŽbËWÏWË™g—Sx.\ÏCýå¯×1VnÇÊ_]fHMUn•‹#àäK?¸Ó*-_mŸb-8Î7­î_œÍÖ‘QâãëÔ¬l•[¿u£_ endstream endobj 301 0 obj <> stream xÚ½—moÚHÇßß§Ø÷‘ë}^©ªZN@¤”^Õ>bˆ%v¤öÛwlÊø!nÏÑU•kvmÏöç™ÙErÎ83œ‘LrÁ$f,SÎáPâ`ÿ´Á¡bÎyæ€WÇš˜|dHïæ†’.Ÿf ½ÂËÀr3h8“¿…·½(È™•ûõLHž‡L(ƒ3€· à´Uøï4{ý:¼ýö‡£ã!Äéæ”f¨W\…Ë,~X1%ÃÑ>Ú¥ÌòÂi¿üú9ž^çñc\ÖÚ/ŽQ²%Z!©E13‹0–qÿýòæêzºüäß¼ù«b¸|ú7Ëù „“»ì>Eúì!9¥Ùõ}tbJ‡“è‡-´‡‡Íñ.9슅çÞ?œ‹qæür?JãBâŸÕj~3»ZŽnÇÜsÞ@S|K|¾ØOØ© ;ã5Ñ ÀËŸÔ¼ àg ¤ÀœP¸X/E ©l,¡#DÛ„X2T%žÑlø÷|}5]ö¦ÐGv…Ãÿ+­ø%£.@LÉñ@a]”y•pY§áùTø×,*i¡}áåBÇð#KÛhÄà;ò{ÖŠ+yâeÇŸÁt6y;ÈÏ·ÀqÕM|À;ヲcƒ(ñ /À‡;f óðԀERÏ>ÛhÙàÏQæK»@f‡Þ!MhÜ endstream endobj 311 0 obj <<597d4fa0ad9f3f54e38e7ca1de3588b3>]/Size 312/W[1 3 2]/Filter/FlateDecode/Length 826>> stream xÚ5Ôile†á÷ù¾.”RZ ¸ÜÀVP±¥*‹à–E*TŠV¥‚EĪ·R6…Z(UTÔº ¢pÁ² ‰‘˜hü£‰511’¸ÄÄHì¹óΟ+OîÎ93™3³S§‚Y®=ˆuXŒ/âZ|[ñu|ßÂwð]¥4¶)þÒê»7àFYÚïÂRYöj//ÅÍø~„[ñÜŽ;ð3Ü…{d9™þm/“Œó’†Cd…3½¤ãP܇ð –•~ãGfà0Ù¨£^2ñ Yy¾—.8BVµÁKŽ ¦A&ÙÜãÞ»âÕ²ú¯½dã5e+þõÞ GÑÓe«&xÏÁke­½tÇ2ÙÆ©^rq ŸÍ”í<é=Çɾ,öÒÇ˾Ýë%¯“u¬õÒ'È~ßá¥Þ ;Þá¥7N”²f{9 o”zñr:N檲¤Ârïg੸ÚË™x“4d„—œÊg³1G*Kžf¬”Êë¼ôÅ›¥é㽜…·Hµë½œUÒÂy^ÎÁÛ¤¦^ÎÅÛ¥–F/çát©µÈK?œ!µ-ñÒgJ[¾÷r>Þ)íªõRˆ³¤¯ª¼á]Òwy¹gK?æy€s¸¹ØCêHÎ2çJÇŽy¹çIÿ”z¹ç+„ /ã½ ?x„µ ½’r >€Wá`¼‡ã•XŽ£q,^“ð¬Àix+VãýXƒwã=x.P(Xî×óBQŸÎ_›PRéåa…ÁË|?¢04y:*Œ\çû1…оë*çø^¨P¿ÉwƒÂ¢ä=|\aû0ßO(nòý¤Â¯É=J1½oêwo@röEŠ·¥JÙ~/‹Çüá{‰â”á¾—*V—¤Ž¬™æe™â¬ßO+ÎoHýµîg/Ï(.HžãrņäÝ^¡¸ø'ߊòý¬bó$ßMŠmú^©¸¹Æ÷*ÅößRgÙÝà¥YqOr7V+îk÷Ý¢x0ùæçmõý¼â“}¯Q<’Ü¥þÚoiOÅÿš½¿„/ã«ø¾ëðm\ïanÂ÷ñCÜ‚ã6üwb;îÆ½¸?ÇC\[çÿ~ò„_gÀ4ÌÀ.Ø»awÌÃ|¥Åfÿ3O¾ endstream endobj startxref 263009 %%EOF glpk-5.0/doc/npp.txt0000644000062000006210000002266513766346220013620 0ustar maomkpasswd@.@ LP/MIP PREPROCESSING ROUTINES ================================= @.@.1 Introduction GLPK has a set of routines that constitute so called the LP/MIP preprocessor. Its main purpose is to improve a given formulation of the LP or MIP problem instance provided by the user. As a rule the LP/MIP preprocessor is used internally (if enabled) in the LP or MIP solver. However, for various reasons the user may need to call the preprocessing routines directly in his/her application program, in which case he/she may use API routines described in this section. The preprocessing of an LP/MIP problem instance and recovering its solution include several steps, which are performed in the following order. 1. Allocating the workspace. The preprocessor allocates the workspace, an internal data structure used on all subsequent steps. 2. Loading the original problem instance. The preprocessor copies all the problem components from the original problem object (glp_prob) specified by the user into the workspace. On this step the user also should specify the solution type: basic solution (assumes the primal or dual simplex solver), interior-point solution (assumes the interior-point solver), or MIP solution (assumes the MIP solver). This is needed, because some preprocessing transformations depend on the solution type. 3. Preprocessing. The user calls preprocessing routines that transform the problem instance residing in the workspace. 4. Building the resultant problem instance. The preprocessor converts the problem instance from an internal workspace representation to the standard problem object (glp_prob) and returns that object to the user. 5. Solving the resultant problem instance. The user calls an appropriate solver routine to obtain a solution to the resultant problem instance. 6. Postprocessing. The user provides the solution to the resultant problem instance found on the previous step, and the preprocessor performs inverse transformations to recover the solution to the original problem instance. Should note that only optimal or integer feasible (for MIP) solutions can be recovered. 7. Obtaining original solution. The preprocessor copies the solution to the original problem instance recovered on the previous step from the workspace to the original problem object (glp_prob). The effect is the same as if the solution were computed by a solver. Note that steps 6 and 7 can be performed multiple times (for example, to recover intermediate integer feasible solutions during the integer optimization). 8. Freeing the workspace. The preprocessor frees all the memory allocated to the workspace. EXAMPLE In this example the program reads the LP problem data from input file murtagh.mps\footnote{This is an example model included in the GLPK distribution.}, performs standard preprocessing, solves the resultant LP with the primal simplex method, and then recovers the solution to the original LP. /* nppsamp.c */ #include #include #include int main(void) { glp_prep *npp; glp_prob *P, *Q; int ret; npp = glp_npp_alloc_wksp(); P = glp_create_prob(); ret = glp_read_mps(P, GLP_MPS_DECK, NULL, "murtagh.mps"); if (ret != 0) { printf("Error on reading problem data\n"); goto skip; } glp_set_obj_dir(P, GLP_MAX); glp_npp_load_prob(npp, P, GLP_SOL, GLP_ON); ret = glp_npp_preprocess1(npp, 0); switch (ret) { case 0: break; case GLP_ENOPFS: printf("LP has no primal feasible solution\n"); goto skip; case GLP_ENODFS: printf("LP has no dual feasible solution\n"); goto skip; default: xassert(ret != ret); } Q = glp_create_prob(); glp_npp_build_prob(npp, Q); ret = glp_simplex(Q, NULL); if (ret == 0 && glp_get_status(Q) == GLP_OPT) { glp_npp_postprocess(npp, Q); glp_npp_obtain_sol(npp, P); } else printf("Unable to recover non-optimal solution\n"); glp_delete_prob(Q); skip: glp_npp_free_wksp(npp); glp_delete_prob(P); return 0; } /* eof */ ------------------------------------------------------------------------ @.@.2 glp_npp_alloc_wksp - allocate the preprocessor workspace SYNOPSIS glp_prep *glp_npp_alloc_wksp(void); DESCRIPTION The routine glp_npp_alloc_wksp allocates the preprocessor workspace. (Note that multiple instances of the workspace may be allocated, if necessary.) RETURNS The routine returns a pointer to the workspace, which should be used in all subsequent operations. ------------------------------------------------------------------------ @.@.3 glp_npp_load_prob - load original problem instance SYNOPSIS void glp_npp_load_prob(glp_prep *prep, glp_prob *P, int sol, int names); DESCRIPTION The routine glp_npp_load_prob loads the original problem instance from the specified problem object P into the preprocessor workspace. (Note that this operation can be performed only once.) The parameter sol specifies which solution is required: GLP_SOL - basic solution; GLP_IPT - interior-point solution; GLP_MIP - mixed integer solution. The parameter names is a flag. If it is GLP_ON, the symbolic names of original rows and columns are also loaded into the workspace. Otherwise, if the flag is GLP_OFF, the row and column names are not loaded. ------------------------------------------------------------------------ @.@.4 glp_npp_preprocess1 - perform basic LP/MIP preprocessing SYNOPSIS int glp_npp_preprocess1(glp_prep *prep, int hard); DESCRIPTION The routine glp_npp_preprocess1 performs basic LP/MIP preprocessing that currently includes: -- removing free rows; -- replacing double-sided constraint rows with almost identical bounds, by equality constraint rows; -- removing fixed columns; -- replacing double-bounded columns with almost identical bounds by fixed columns and removing those columns; -- removing empty rows; -- removing equality constraint row singletons and corresponding columns; -- removing inequality constraint row singletons and corresponding columns; -- performing general row analysis; -- removing redundant row bounds; -- removing forcing rows and corresponding columns; -- removing rows which become free due to redundant bounds; -- computing implied bounds for all columns and using them to strengthen current column bounds (MIP only, optional, performed if the flag hard is on); -- fixing and removing empty columns; -- removing column singletons, which are implied slack variables, and corresponding rows; -- removing bounds of columns, which are implied free variables, and replacing corresponding rows by equality constraints. If the flag hard is GLP_ON, the routine attempts to improve current column bounds multiple times within the main processing loop, in which case this feature may take a time. Otherwise, if the flag hard is GLP_OFF, improving column bounds is performed only once at the end of the main loop. (Note that this feature is used for MIP only.) RETURNS 0 - the problem instance has been successfully preprocessed; GLP_ENOPFS - primal/integer infeasibility has been detected; GLP_ENODFS - dual infeasibility has been detected. ------------------------------------------------------------------------ @.@.5 glp_npp_build_prob - build resultant problem instance SYNOPSIS void glp_npp_build_prob(glp_prep *prep, glp_prob *Q); DESCRIPTION The routine glp_npp_build_prob obtains all necessary information from the preprocessor workspace to build the resultant (preprocessed) problem instance, and stores it in the specified problem object Q. Note that before building the current content of this problem object is erased with the routine glp_erase_prob. ------------------------------------------------------------------------ @.@.6 glp_npp_postprocess - postprocess solution to resultant problem SYNOPSIS void glp_npp_postprocess(glp_prep *prep, glp_prob *Q); DESCRIPTION The routine glp_npp_postprocess performs postprocessing of a solution to the resultant (preprocessed) problem instance specified by the problem object Q and recovers corrseponding solution to the original problem instance. The recovered solution is stored in the preprocessor workspace and can be obtained with the routine glp_npp_obtain_sol. It is assumed that the resultant problem instance Q has been solved with an appropriate solver depending on the solution type previously passed to the routine glp_npp_load_prob (the parameter sol). Note that only optimal or integer feasible (for MIP) solution can be recovered, so the calling program should use the routine glp_status to make sure that this condition is met. ------------------------------------------------------------------------ @.@.7 glp_npp_obtain_sol - obtain solution to original problem SYNOPSIS void glp_npp_obtain_sol(glp_prep *prep, glp_prob *P); DESCRIPTION The routine glp_npp_obtain_sol copies the solution to the original problem instance previously recovered by the routine glp_npp_postorocess from the preprocessor workspace to the problem object P. The effect is the same as if the solution were computed by an appropriate solver. ------------------------------------------------------------------------ @.@.8 glp_npp_free_wksp - free the preprocessor workspace SYNOPSIS void glp_npp_free_wksp(glp_prep *prep); DESCRIPTION The routine glp_npp_free_wksp frees all the memory allocated to the preprocessor workspace. ===EOF=== glpk-5.0/examples/0000755000062000006210000000000013766346220013320 5ustar maomkpasswdglpk-5.0/examples/alloy.mps0000644000062000006210000002300713766346220015163 0ustar maomkpasswd*NAME: ALLOY *ROWS: 22 *COLUMNS: 20 *NONZERO: 203 *OPT SOLN: 2149.247891 *SOURCE: Linear Programming--Aluminium Alloy Blending * Data Processing Application. N.Y.: IBM Corp. *APPLICATION: Aluminium Alloy Blending *COMMENTS: fixed MPS format * encoded by Andrew Makhorin * NAME ALLOY ROWS N COST $ Cost $ G ZN $ Zinc Minimum lbs L ZX $ Zinc Maximum lbs G CN $ Copper Minimum lbs L CX $ Copper Maximum lbs G MN $ Magnesium Minimum lbs L MX $ Magnesium Maximum lbs G CHN $ Chromium Minimum lbs L CHX $ Chromium Maximum lbs G BN $ Beryllium Minimum lbs L BX $ Beryllium Maximum lbs L IX $ Iron Maximum lbs L SX $ Silicon Maximum lbs L MGX $ Manganese Maximum lbs L NX $ Nickel Maximum lbs L TX $ Titanium Maximum lbs L LX $ Lead Maximum lbs L TNX $ Tin Maximum lbs L BIX $ Bismuth Maximum lbs L GX $ General Impurities lbs L SCX $ Scrap 1 Limit lbs G FL $ Furnance Load lbs COLUMNS * Pure Aluminium 1 A1 COST .28 IX .0004 SX .0005 FL 1.0 * Pure Aluminium 2 A2 COST .26 IX .0006 SX .0006 FL 1.0 * Pure Aluminium 3 A3 COST .25 IX .0011 SX .0007 FL 1.0 * Pure Aluminium 4 A4 COST .23 IX .0026 SX .0012 FL 1.0 * Pure Copper C COST .31 CN 1.00 CX 1.00 FL 1.0 * Pure Magnesium M COST .38 MN 1.00 MX 1.00 FL 1.0 * Beryllium/Aluminium Alloy B/A COST 3.60 BN 0.0600 BX 0.0600 FL 1.0 * Pure Zinc Z COST .22 ZN .95 ZX .95 FL 1.0 * Chromium Aluminium Alloy C/A COST .27 CHN .0300 CHX .0300 FL 1.0 * Scrap 1 SC1 COST .21 ZN .0009 ZX .0009 CN .0444 CX .0444 MN .0042 MX .0042 CHN .0001 CHX .0001 IX .0024 SX .0101 MGX .0079 NX .0001 TX .0004 LX .0001 TNX .0001 GX .0001 SCX 1.00 FL 1.0 * Scrap 2 SC2 COST .20 ZN .0012 ZX .0012 CN .0026 CX .0026 MN .0060 MX .0060 CHN .0018 CHX .0018 IX .0026 SX .0106 MGX .0003 NX .0002 TX .0004 LX .0001 TNX .0001 GX .0002 FL 1.0 * Scrap 3 SC3 COST .21 ZN .0568 ZX .0568 CN .0152 CX .0152 MN .0248 MX .0248 CHN .0020 CHX .0020 IX .0016 SX .0013 MGX .0005 TX .0004 LX .0003 TNX .0003 FL 1.0 * Scrap 4 SC4 COST .20 ZN .0563 ZX .0563 CN .0149 CX .0149 MN .0238 MX .0238 CHN .0019 CHX .0019 IX .0019 SX .0011 MGX .0004 TX .0004 LX .0003 TNX .0003 FL 1.0 * Scrap 5 SC5 COST .21 ZN .0460 ZX .0460 CN .0071 CX .0071 MN .0343 MX .0343 CHN .0013 CHX .0013 IX .0017 SX .0013 MGX .0018 TX .0002 LX .0002 TNX .0002 FL 1.0 * Scrap 6 SC6 COST .20 ZN .0455 ZX .0455 CN .0071 CX .0071 MN .0343 MX .0343 IX .0016 SX .0011 MGX .0017 TX .0002 LX .0002 TNX .0002 FL 1.0 * Scrap 7 SC7 COST .21 ZN .0009 ZX .0009 CN .0447 CX .0447 MN .0143 MX .0143 IX .0026 SX .0013 MGX .0052 TX .0003 LX .0001 TNX .0001 FL 1.0 * Scrap 8 SC8 COST .20 ZN .0006 ZX .0006 CN .0623 CX .0623 IX .0017 SX .0010 MGX .0025 TX .0005 LX .0001 TNX .0001 GX .0025 FL 1.0 * Scrap 9 SC9 COST .21 ZN .0009 ZX .0009 CN .0034 CX .0034 MN .0093 MX .0093 CHN .0019 CHX .0019 IX .0030 SX .0062 MGX .0002 TX .0003 BIX .0005 FL 1.0 * Scrap 10 SC10 COST .20 ZN .0008 ZX .0008 CN .0003 CX .0003 MN .0249 MX .0249 CHN .0016 CHX .0016 IX .0015 SX .0011 MGX .0002 FL 1.0 * Scrap 11 SC11 COST .21 ZN .0675 ZX .0675 CN .0195 CX .0195 MN .0265 MX .0265 CHN .0020 CHX .0020 IX .0014 SX .0008 MGX .0002 FL 1.0 RHS ZN 555. ZX 590. CN 140.0 CX 190.0 MN 245.0 MX 275.0 CHN 19.0 CHX 22.0 BN 2.0 BX 4.0 IX 15.0 SX 10.0 MGX 3.0 NX 2.0 TX 2.0 LX 2.0 TNX 2.0 BIX 8.0 GX 8.0 SCX 900.0 FL 10000. ENDATA glpk-5.0/examples/assign.mod0000644000062000006210000000404513766346220015310 0ustar maomkpasswd/* ASSIGN, Assignment Problem */ /* Written in GNU MathProg by Andrew Makhorin */ /* The assignment problem is one of the fundamental combinatorial optimization problems. In its most general form, the problem is as follows: There are a number of agents and a number of tasks. Any agent can be assigned to perform any task, incurring some cost that may vary depending on the agent-task assignment. It is required to perform all tasks by assigning exactly one agent to each task in such a way that the total cost of the assignment is minimized. (From Wikipedia, the free encyclopedia.) */ param m, integer, > 0; /* number of agents */ param n, integer, > 0; /* number of tasks */ set I := 1..m; /* set of agents */ set J := 1..n; /* set of tasks */ param c{i in I, j in J}, >= 0; /* cost of allocating task j to agent i */ var x{i in I, j in J}, >= 0; /* x[i,j] = 1 means task j is assigned to agent i note that variables x[i,j] are binary, however, there is no need to declare them so due to the totally unimodular constraint matrix */ s.t. phi{i in I}: sum{j in J} x[i,j] <= 1; /* each agent can perform at most one task */ s.t. psi{j in J}: sum{i in I} x[i,j] = 1; /* each task must be assigned exactly to one agent */ minimize obj: sum{i in I, j in J} c[i,j] * x[i,j]; /* the objective is to find a cheapest assignment */ solve; printf "\n"; printf "Agent Task Cost\n"; printf{i in I} "%5d %5d %10g\n", i, sum{j in J} j * x[i,j], sum{j in J} c[i,j] * x[i,j]; printf "----------------------\n"; printf " Total: %10g\n", sum{i in I, j in J} c[i,j] * x[i,j]; printf "\n"; data; /* These data correspond to an example from [Christofides]. */ /* Optimal solution is 76 */ param m := 8; param n := 8; param c : 1 2 3 4 5 6 7 8 := 1 13 21 20 12 8 26 22 11 2 12 36 25 41 40 11 4 8 3 35 32 13 36 26 21 13 37 4 34 54 7 8 12 22 11 40 5 21 6 45 18 24 34 12 48 6 42 19 39 15 14 16 28 46 7 16 34 38 3 34 40 22 24 8 26 20 5 17 45 31 37 43 ; end; glpk-5.0/examples/bpp.mod0000644000062000006210000000437313766346220014611 0ustar maomkpasswd/* BPP, Bin Packing Problem */ /* Written in GNU MathProg by Andrew Makhorin */ /* Given a set of items I = {1,...,m} with weight w[i] > 0, the Bin Packing Problem (BPP) is to pack the items into bins of capacity c in such a way that the number of bins used is minimal. */ param m, integer, > 0; /* number of items */ set I := 1..m; /* set of items */ param w{i in 1..m}, > 0; /* w[i] is weight of item i */ param c, > 0; /* bin capacity */ /* We need to estimate an upper bound of the number of bins sufficient to contain all items. The number of items m can be used, however, it is not a good idea. To obtain a more suitable estimation an easy heuristic is used: we put items into a bin while it is possible, and if the bin is full, we use another bin. The number of bins used in this way gives us a more appropriate estimation. */ param z{i in I, j in 1..m} := /* z[i,j] = 1 if item i is in bin j, otherwise z[i,j] = 0 */ if i = 1 and j = 1 then 1 /* put item 1 into bin 1 */ else if exists{jj in 1..j-1} z[i,jj] then 0 /* if item i is already in some bin, do not put it into bin j */ else if sum{ii in 1..i-1} w[ii] * z[ii,j] + w[i] > c then 0 /* if item i does not fit into bin j, do not put it into bin j */ else 1; /* otherwise put item i into bin j */ check{i in I}: sum{j in 1..m} z[i,j] = 1; /* each item must be exactly in one bin */ check{j in 1..m}: sum{i in I} w[i] * z[i,j] <= c; /* no bin must be overflowed */ param n := sum{j in 1..m} if exists{i in I} z[i,j] then 1; /* determine the number of bins used by the heuristic; obviously it is an upper bound of the optimal solution */ display n; set J := 1..n; /* set of bins */ var x{i in I, j in J}, binary; /* x[i,j] = 1 means item i is in bin j */ var used{j in J}, binary; /* used[j] = 1 means bin j contains at least one item */ s.t. one{i in I}: sum{j in J} x[i,j] = 1; /* each item must be exactly in one bin */ s.t. lim{j in J}: sum{i in I} w[i] * x[i,j] <= c * used[j]; /* if bin j is used, it must not be overflowed */ minimize obj: sum{j in J} used[j]; /* objective is to minimize the number of bins used */ data; /* The optimal solution is 3 bins */ param m := 6; param w := 1 50, 2 60, 3 30, 4 70, 5 50, 6 40; param c := 100; end; glpk-5.0/examples/cal.mod0000644000062000006210000000265313766346220014566 0ustar maomkpasswd/* cal.mod - print an ASCII calendar of the given year */ /* Written in GNU MathProg by Andrew Makhorin */ param year, integer, >= 0001, <= 3999, default 2010; param first_day{m in 1..12}, integer, >= 0, <= 6, := time2str(str2time(year & "-" & m & "-01", "%Y-%m-%d"), "%w"); param days_in_month{m in 1..12}, integer, >= 28, <= 31, := (str2time(year + (if m < 12 then 0 else 1) & "-" & (if m < 12 then m+1 else 1) & "-01", "%Y-%m-%d") - str2time(year & "-" & m & "-01", "%Y-%m-%d")) / 86400; param foo{m in 1..12, k in 0..5, d in 0..6}, integer, := 7 * k + d + 1 - first_day[m]; param cal{m in 1..12, k in 0..5, d in 0..6}, integer, := if 1 <= foo[m,k,d] and foo[m,k,d] <= days_in_month[m] then foo[m,k,d]; printf "\n"; printf "%33s%04d\n", "", year; printf "\n"; for {t in 1..12 by 3} { for {m in t..t+2} { printf "%7s%-14s", "", time2str(str2time(m, "%m"), "%B"); printf{0..0: m < t+2} " "; } printf "\n"; for {m in t..t+2} { printf " S M Tu W Th F S"; printf{0..0: m < t+2} " "; } printf "\n"; for {k in 0..5} { for {m in t..t+2} { for {d in 0..6} { printf{0..0: cal[m,k,d] = 0} " "; printf{0..0: cal[m,k,d] != 0} " %2d", cal[m,k,d]; } printf{0..0: m < t+2} " "; } printf "\n"; } } printf "\n"; end; glpk-5.0/examples/cf12a.mod0000644000062000006210000000216313766346220014717 0ustar maomkpasswd/* Curve fitting problem 12.11(a) H P Williams "Model Building in Mathematical Programming" Dr. H J Mackenzie HARD software hjm@hardsoftware.com 2006-01-05 */ # set of points set I; # independent variable param x {i in I}; # dependent variable param y {i in I}; # output input values printf {i in I} "x = %.1f; y = %.1f\n", x[i], y[i]; # define equation variables var a; var b; var u {i in I}, >= 0; var v {i in I}, >= 0; # define objective function minimize error: sum {i in I} u[i] + sum {i in I} v[i]; # define equation constraint s.t. equation {i in I} : b * x[i] + a + u[i] - v[i] = y[i]; solve; printf "y = %.4fx + %.4f\n", b, a; /* * * DATA section * */ data; param : I : x y := 1 0 1 2 0.5 0.9 3 1 0.7 4 1.5 1.5 5 1.9 2 6 2.5 2.4 7 3 3.2 8 3.5 2 9 4 2.7 10 4.5 3.5 11 5 1 12 5.5 4 13 6 3.6 14 6.6 2.7 15 7 5.7 16 7.6 4.6 17 8.5 6 18 9 6.8 19 10 7.3 ; end; glpk-5.0/examples/cf12b.mod0000644000062000006210000000235113766346220014717 0ustar maomkpasswd/* Curve fitting problem 12.11(b) H P Williams "Model Building in Mathematical Programming" Dr. H J Mackenzie HARD software hjm@hardsoftware.com 2006-01-23 */ # set of points set I; # independent variable param x {i in I}; # dependent variable param y {i in I}; # output input values printf {i in I} "x = %.1f; y = %.1f\n", x[i], y[i]; # define equation variables var a; var b; var u {i in I}, >= 0; var v {i in I}, >= 0; var z; # define objective function minimize deviation: z; # define equation constraint s.t. equation {i in I} : b * x[i] + a + u[i] - v[i] = y[i]; # define deviation constrains s.t. u_deviation {i in I} : z - u[i] >= 0; s.t. v_deviation {i in I} : z - v[i] >= 0; solve; printf "y = %.4fx + %.4f Max deviation = %.4f\n", b, a, z; /* * * DATA section * */ data; param : I : x y := 1 0 1 2 0.5 0.9 3 1 0.7 4 1.5 1.5 5 1.9 2 6 2.5 2.4 7 3 3.2 8 3.5 2 9 4 2.7 10 4.5 3.5 11 5 1 12 5.5 4 13 6 3.6 14 6.6 2.7 15 7 5.7 16 7.6 4.6 17 8.5 6 18 9 6.8 19 10 7.3 ; end; glpk-5.0/examples/cflsq.mod0000644000062000006210000000203313766346220015127 0ustar maomkpasswd/*Curve fitting problem by Least Squares Nigel_Galloway@operamail.com October 1st., 2007 */ set Sample; param Sx {z in Sample}; param Sy {z in Sample}; var X; var Y; var Ex{z in Sample}; var Ey{z in Sample}; /* sum of variances is zero for Sx*/ variencesX{z in Sample}: X + Ex[z] = Sx[z]; zumVariancesX: sum{z in Sample} Ex[z] = 0; /* sum of variances is zero for Sy*/ variencesY{z in Sample}: Y + Ey[z] = Sy[z]; zumVariancesY: sum{z in Sample} Ey[z] = 0; solve; param b1 := (sum{z in Sample} Ex[z]*Ey[z])/(sum{z in Sample} Ex[z]*Ex[z]); printf "\nbest linear fit is:\n\ty = %f %s %fx\n\n", Y-b1*X, if b1 < 0 then "-" else "+", abs(b1); data; param: Sample: Sx Sy := 1 0 1 2 0.5 0.9 3 1 0.7 4 1.5 1.5 5 1.9 2 6 2.5 2.4 7 3 3.2 8 3.5 2 9 4 2.7 10 4.5 3.5 11 5 1 12 5.5 4 13 6 3.6 14 6.6 2.7 15 7 5.7 16 7.6 4.6 17 8.5 6 18 9 6.8 19 10 7.3 ; end; glpk-5.0/examples/color.mod0000644000062000006210000000545013766346220015143 0ustar maomkpasswd/* COLOR, Graph Coloring Problem */ /* Written in GNU MathProg by Andrew Makhorin */ /* Given an undirected loopless graph G = (V, E), where V is a set of nodes, E <= V x V is a set of arcs, the Graph Coloring Problem is to find a mapping (coloring) F: V -> C, where C = {1, 2, ... } is a set of colors whose cardinality is as small as possible, such that F(i) != F(j) for every arc (i,j) in E, that is adjacent nodes must be assigned different colors. */ param n, integer, >= 2; /* number of nodes */ set V := {1..n}; /* set of nodes */ set E, within V cross V; /* set of arcs */ check{(i,j) in E}: i != j; /* there must be no loops */ /* We need to estimate an upper bound of the number of colors |C|. The number of nodes |V| can be used, however, for sparse graphs such bound is not very good. To obtain a more suitable estimation we use an easy "greedy" heuristic. Let nodes 1, ..., i-1 are already assigned some colors. To assign a color to node i we see if there is an existing color not used for coloring nodes adjacent to node i. If so, we use this color, otherwise we introduce a new color. */ set EE := setof{(i,j) in E} (i,j) union setof{(i,j) in E} (j,i); /* symmetrisized set of arcs */ param z{i in V, case in 0..1} := /* z[i,0] = color index assigned to node i z[i,1] = maximal color index used for nodes 1, 2, ..., i-1 which are adjacent to node i */ ( if case = 0 then ( /* compute z[i,0] */ min{c in 1..z[i,1]} ( if not exists{j in V: j < i and (i,j) in EE} z[j,0] = c then c else z[i,1] + 1 ) ) else ( /* compute z[i,1] */ if not exists{j in V: j < i} (i,j) in EE then 1 else max{j in V: j < i and (i,j) in EE} z[j,0] ) ); check{(i,j) in E}: z[i,0] != z[j,0]; /* check that all adjacent nodes are assigned distinct colors */ param nc := max{i in V} z[i,0]; /* number of colors used by the heuristic; obviously, it is an upper bound of the optimal solution */ display nc; var x{i in V, c in 1..nc}, binary; /* x[i,c] = 1 means that node i is assigned color c */ var u{c in 1..nc}, binary; /* u[c] = 1 means that color c is used, i.e. assigned to some node */ s.t. map{i in V}: sum{c in 1..nc} x[i,c] = 1; /* each node must be assigned exactly one color */ s.t. arc{(i,j) in E, c in 1..nc}: x[i,c] + x[j,c] <= u[c]; /* adjacent nodes cannot be assigned the same color */ minimize obj: sum{c in 1..nc} u[c]; /* objective is to minimize the number of colors used */ data; /* These data correspond to the instance myciel3.col from: http://mat.gsia.cmu.edu/COLOR/instances.html */ /* The optimal solution is 4 */ param n := 11; set E := 1 2 1 4 1 7 1 9 2 3 2 6 2 8 3 5 3 7 3 10 4 5 4 6 4 10 5 8 5 9 6 11 7 11 8 11 9 11 10 11 ; end; glpk-5.0/examples/cplex/0000755000062000006210000000000013766346220014433 5ustar maomkpasswdglpk-5.0/examples/cplex/concorde.txt0000644000062000006210000000726313766346220017000 0ustar maomkpasswdSolver: Concorde-03.12.19 (options used: -s 99) http://www.tsp.gatech.edu/concorde.html LP Solver: GLPK 4.34 (CPLEX-like interface module examples/cplex) Computer: Intel Pentium 4 CPU 3GHz, 2GB of RAM Platform: Cygwin 1.5.24 (Windows XP 5.1 Build 2600 Service Pack 4) Compiler: GCC 3.4.4 (options used: -O2) Test set: http://www.iwr.uni-heidelberg.de/groups/comopt/software/ TSPLIB95/ Problem Solution B&B Time, s --------- -------- --- ------- a280 2579 1 3.09 ali535 202339 1 21.88 att48 10628 1 0.20 att532 27686 7 74.31 bayg29 1610 1 0.08 bays29 2020 1 0.08 berlin52 7542 1 0.11 bier127 118282 1 0.62 brazil58 25395 1 0.23 brd14051 brg180 1950 1 0.34 burma14 3323 1 0.06 ch130 6110 1 0.92 ch150 6528 1 1.69 d1291 d15112 d1655 d18512 d198 15780 3 4.92 d2103 d493 35002 5 123.89 d657 48913 11 148.17 dantzig42 699 1 0.08 dsj1000 18660188 13 251.00 eil101 (failed due to CPXgetijdiv) eil51 426 1 0.17 eil76 538 1 0.11 fl1400 fl1577 fl3795 fl417 11861 1 47.20 fnl4461 fri26 937 1 0.05 gil262 2378 3 10.39 gr120 6942 1 0.66 gr137 69853 1 2.09 gr17 2085 1 0.03 gr202 40160 1 3.97 gr21 2707 1 0.03 gr229 134602 7 19.45 gr24 1272 1 0.03 gr431 171414 9 40.67 gr48 5046 1 0.22 gr666 294358 3 40.23 gr96 55209 1 1.22 hk48 11461 1 0.08 kroA100 21282 1 0.41 kroA150 26524 1 2.09 kroA200 29368 1 2.44 kroB100 22141 1 1.20 kroB150 26130 1 1.66 kroB200 29437 1 1.41 kroC100 20749 1 0.42 kroD100 21294 1 0.50 kroE100 22068 1 0.94 lin105 14379 1 0.23 lin318 42029 1 4.28 nrw1379 p654 34643 1 17.08 pa561 2763 15 370.70 pcb1173 56892 11 370.30 pcb3038 pcb442 59778 13 35.86 pla33810 pla7397 pla85900 pr1002 259045 1 23.08 pr107 44303 1 0.38 pr124 59030 1 1.23 pr136 96772 1 2.19 pr144 58537 1 0.89 pr152 73682 1 2.73 pr226 80369 1 2.72 pr2392 pr264 49135 1 1.61 pr299 48191 3 14.52 pr439 107217 15 117.75 pr76 108159 1 0.95 rat195 2323 5 12.91 rat575 6773 19 202.52 rat783 8806 1 37.92 rat99 1211 1 0.50 rd100 7910 1 0.28 rd400 15281 11 74.41 rl11849 rl1304 rl1323 rl1889 rl5915 rl5934 si1032 92650 1 82.09 si175 21407 3 8.97 si535 48450 1 71.28 st70 675 1 0.20 swiss42 1273 1 0.06 ts225 126643 1 21.25 tsp225 3916 1 10.14 u1060 224094 13 507.44 u1432 u159 42080 1 0.41 u1817 u2152 u2319 u574 36905 1 32.84 u724 41910 19 238.42 ulysses16 6859 1 0.19 ulysses22 7013 1 0.47 usa13509 vm1084 239297 9 543.38 vm1748 glpk-5.0/examples/cplex/cplex.c0000644000062000006210000017732713766346220015733 0ustar maomkpasswd/* cplex.c (CPLEX-like interface to GLPK API) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2001-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include #include #include #include #include #include #include "cplex.h" struct CPXENV { /* environment block */ CPXLP *list; /* linked list of problem objects */ int *intparam; /* int intparam[]; */ /* integer control parameters */ double *dblparam; /* double dblparam[]; */ /* floating-point control parameters */ }; struct CPXLP { /* problem object */ CPXENV *env; /* pointer to environment block */ glp_prob *prob; /* pointer to underlying GLPK problem object */ int rflen; /* length of the array rflag */ char *rflag; /* char rflag[rflen]; */ /* rflag[i], i = 0,...,nrows-1, is a flag of i-th row: */ #define RF_NOT_RANGED 0 /* not ranged */ #define RF_RANGED_POS 1 /* ranged, RHS = lower bound */ #define RF_RANGED_NEG 2 /* ranged, RHS = upper bound */ int stat; /* solution status reported by CPXgetstat; zero means no solution exists */ int meth; /* method indicator reported by CPXgetmethod */ int iwlen; /* length of the working array */ int *iwork; /* int iwork[iwlen] */ /* working array initialized by binary zeros */ CPXLP *link; /* pointer to another problem object */ }; struct intparam { int which; int defv; int minv; int maxv; }; struct dblparam { int which; double defv; double minv; double maxv; }; struct errstring { int code; const char *string; }; #define BIGINT 2100000000 #define BIGDBL 1e75 static const struct intparam intparam[] = { {CPX_PARAM_ADVIND, 0, 0, 2}, {CPX_PARAM_AGGIND, -1, -1, BIGINT}, {CPX_PARAM_DATACHECK, CPX_OFF, CPX_OFF, CPX_ON}, {CPX_PARAM_DPRIIND, CPX_DPRIIND_AUTO, CPX_DPRIIND_AUTO, CPX_DPRIIND_DEVEX}, {CPX_PARAM_FASTMIP, CPX_OFF, CPX_OFF, CPX_ON}, /* ??? */ {CPX_PARAM_ITLIM, BIGINT, 0, BIGINT}, {CPX_PARAM_PERIND, CPX_OFF, CPX_OFF, CPX_ON}, {CPX_PARAM_PPRIIND, CPX_PPRIIND_AUTO, CPX_PPRIIND_PARTIAL, CPX_PPRIIND_FULL}, {CPX_PARAM_PREIND, CPX_ON, CPX_OFF, CPX_ON}, {CPX_PARAM_REINV, 0, 0, 10000}, {CPX_PARAM_SCRIND, CPX_OFF, CPX_OFF, CPX_ON}, {CPX_PARAM_SIMDISPLAY, 1, 0, 2}, }; static const struct dblparam dblparam[] = { {CPX_PARAM_EPOPT, 1e-6, 1e-9, 1e-1}, {CPX_PARAM_EPPER, 1e-6, 1e-8, BIGDBL}, {CPX_PARAM_EPRHS, 1e-6, 1e-9, 1e-1}, {CPX_PARAM_OBJLLIM, -BIGDBL, -BIGDBL, +BIGDBL}, {CPX_PARAM_OBJULIM, +BIGDBL, -BIGDBL, +BIGDBL}, }; static const struct errstring errstring[] = { {CPXERR_ARRAY_NOT_ASCENDING, "Array entry %d not ascending"}, {CPXERR_BAD_ARGUMENT, "Invalid argument"}, {CPXERR_BAD_CTYPE, "Invalid ctype entry %d"}, {CPXERR_BAD_FILETYPE, "Invalid filetype"}, {CPXERR_BAD_LUB, "Invalid bound change indicator entry %d"}, {CPXERR_BAD_PARAM_NUM, "Invalid parameter number"}, {CPXERR_BAD_SENSE, "Invalid sense entry %d"}, {CPXERR_BAD_STATUS, "Invalid status entry %d for basis specificat" "ion"}, {CPXERR_COL_INDEX_RANGE, "Column index %d out of range"}, {CPXERR_COUNT_RANGE, "Count entry %d negative or larger than allo" "wed"}, {CPXERR_DUP_ENTRY, "Duplicate entry"}, {CPXERR_FAIL_OPEN_WRITE, "Could not open file '%s' for writing"}, {CPXERR_INDEX_RANGE, "Index is outside range of valid values"}, {CPXERR_NEGATIVE_SURPLUS, "Insufficient array length"}, {CPXERR_NO_BASIC_SOLN, "No basic solution exists"}, {CPXERR_NO_ENVIRONMENT, "No environment exists"}, {CPXERR_NO_FILENAME, "File name not specified"}, {CPXERR_NO_MEMORY, "Out of memory"}, {CPXERR_NO_PROBLEM, "No problem exists"}, {CPXERR_NO_SOLN, "No solution exists"}, {CPXERR_NOT_FIXED, "Only fixed variables are pivoted out"}, {CPXERR_NULL_NAME, "Null pointer %d in name array"}, {CPXERR_NULL_POINTER, "Null pointer for required data"}, {CPXERR_PARAM_TOO_BIG, "Parameter value too big"}, {CPXERR_PARAM_TOO_SMALL, "Parameter value too small"}, {CPXERR_ROW_INDEX_RANGE, "Row index %d out of range"}, }; /**********************************************************************/ #define xassert glp_assert #define xprintf glp_printf #define xmalloc glp_malloc #define xcalloc glp_calloc #define xfree glp_free /**********************************************************************/ static int findintparam(int whichparam) { int k, card; card = sizeof(intparam) / sizeof(struct intparam); for (k = 0; k < card; k++) if (intparam[k].which == whichparam) return k; return -1; } static int getintparam(CPXENV *env, int whichparam) { int k; xassert(env != NULL); k = findintparam(whichparam); xassert(k >= 0); return env->intparam[k]; } static int finddblparam(int whichparam) { int k, card; card = sizeof(dblparam) / sizeof(struct dblparam); for (k = 0; k < card; k++) if (dblparam[k].which == whichparam) return k; return -1; } static double getdblparam(CPXENV *env, int whichparam) { int k; xassert(env != NULL); k = finddblparam(whichparam); xassert(k >= 0); return env->dblparam[k]; } static const char *finderrstring(int errcode) { int k, card; card = sizeof(errstring) / sizeof(struct errstring); for (k = 0; k < card; k++) { if (errstring[k].code == errcode) return errstring[k].string; } return NULL; } static int error(CPXENV *env, int errcode, ...) { va_list arg; char buffer[510]; xassert(env != NULL); if (getintparam(env, CPX_PARAM_SCRIND) == CPX_ON) { xassert(CPXgeterrorstring(env, errcode, buffer) == buffer); va_start(arg, errcode); vprintf(buffer, arg); va_end(arg); } return errcode; } static int checkenv(CPXENV *env) { int errcode; if (env == NULL) errcode = CPXERR_NO_ENVIRONMENT; else errcode = 0; return errcode; } static checklp(CPXENV *env, CPXLP *lp) { int errcode; errcode = checkenv(env); if (errcode) goto done; if (lp == NULL) errcode = error(env, CPXERR_NO_PROBLEM); done: return errcode; } static void invalidate(CPXLP *lp) { lp->stat = 0; lp->meth = CPX_ALG_NONE; return; } static void enlargerflag(CPXLP *lp) { int m; xassert(lp != NULL); m = glp_get_num_rows(lp->prob); if (lp->rflen < m) { int rflen = lp->rflen; char *rflag = lp->rflag; while (lp->rflen < m) { lp->rflen += lp->rflen; xassert(lp->rflen > 0); } lp->rflag = xcalloc(lp->rflen, sizeof(char)); memcpy(lp->rflag, rflag, rflen); xfree(rflag); } return; } static void enlargeiwork(CPXLP *lp, int len) { xassert(len >= 0); if (lp->iwlen < len) { xfree(lp->iwork); while (lp->iwlen < len) { lp->iwlen += lp->iwlen; xassert(lp->iwlen > 0); } lp->iwork = xcalloc(lp->iwlen, sizeof(int)); memset(lp->iwork, 0, lp->iwlen * sizeof(int)); } return; } /**********************************************************************/ int CPXaddcols(CPXENV *env, CPXLP *lp, int ccnt, int nzcnt, const double obj[], const int cmatbeg[], const int cmatind[], const double cmatval[], const double lb[], const double ub[], char *colname[]) { int j, k, m, n, beg, end, type, errcode; double lbnd, ubnd; errcode = checklp(env, lp); if (errcode) goto done; if (ccnt < 0 || nzcnt < 0) { errcode = error(env, CPXERR_BAD_ARGUMENT); goto done; } if (ccnt > 0) { if (cmatbeg == NULL || cmatind == NULL || cmatval == NULL) { errcode = error(env, CPXERR_NULL_POINTER); goto done; } } m = glp_get_num_rows(lp->prob); n = glp_get_num_cols(lp->prob); enlargeiwork(lp, m); for (j = 0; j < ccnt; j++) { beg = cmatbeg[j]; if (j > 0 && !(cmatbeg[j-1] <= beg)) { errcode = error(env, CPXERR_ARRAY_NOT_ASCENDING, j); goto done; } if (!(0 <= beg && beg <= nzcnt)) { errcode = error(env, CPXERR_INDEX_RANGE); goto done; } end = (j < ccnt-1 ? cmatbeg[j+1] : nzcnt); for (k = beg; k < end; k++) { if (!(0 <= cmatind[k] && cmatind[k] < m)) { errcode = error(env, CPXERR_ROW_INDEX_RANGE, k); goto done; } } errcode = 0; for (k = beg; k < end; k++) { if (lp->iwork[cmatind[k]]) { errcode = error(env, CPXERR_DUP_ENTRY); break; } lp->iwork[cmatind[k]] = 1; } for (k = beg; k < end; k++) lp->iwork[cmatind[k]] = 0; if (errcode) goto done; if (colname != NULL) { if (colname[j] == NULL) { errcode = error(env, CPXERR_NULL_NAME, j); goto done; } } } errcode = 0; invalidate(lp); if (ccnt > 0) glp_add_cols(lp->prob, ccnt); for (j = 0; j < ccnt; j++) { if (colname != NULL) glp_set_col_name(lp->prob, n+j+1, colname[j]); lbnd = (lb == NULL ? 0.0 : lb[j]); ubnd = (ub == NULL ? +CPX_INFBOUND : ub[j]); if (lbnd <= -CPX_INFBOUND && ubnd >= +CPX_INFBOUND) type = GLP_FR; else if (ubnd >= +CPX_INFBOUND) type = GLP_LO; else if (lbnd <= -CPX_INFBOUND) type = GLP_UP; else if (lbnd != ubnd) type = GLP_DB; else type = GLP_FX; glp_set_col_bnds(lp->prob, n+j+1, type, lbnd, ubnd); if (obj != NULL) glp_set_obj_coef(lp->prob, n+j+1, obj[j]); beg = cmatbeg[j]; end = (j < ccnt-1 ? cmatbeg[j+1] : nzcnt); for (k = beg; k < end; k++) lp->iwork[k-beg] = cmatind[k]+1; glp_set_mat_col(lp->prob, n+j+1, end-beg, lp->iwork-1, cmatval+beg-1); for (k = beg; k < end; k++) lp->iwork[k-beg] = 0; } done: return errcode; } int CPXaddrows(CPXENV *env, CPXLP *lp, int ccnt, int rcnt, int nzcnt, const double rhs[], const char sense[], const int rmatbeg[], const int rmatind[], const double rmatval[], char *colname[], char *rowname[]) { int i, j, k, m, n, beg, end, type, errcode; double temp; errcode = checklp(env, lp); if (errcode) goto done; if (ccnt < 0 || rcnt < 0 || nzcnt < 0) { errcode = error(env, CPXERR_BAD_ARGUMENT); goto done; } if (rcnt > 0) { if (rmatbeg == NULL || rmatind == NULL || rmatval == NULL) { errcode = error(env, CPXERR_NULL_POINTER); goto done; } } m = glp_get_num_rows(lp->prob); n = glp_get_num_cols(lp->prob); enlargeiwork(lp, n+ccnt); for (i = 0; i < rcnt; i++) { if (sense != NULL) { if (!(sense[i] == 'L' || sense[i] == 'E' || sense[i] == 'G' || sense[i] == 'R')) { errcode = error(env, CPXERR_BAD_SENSE, i); goto done; } } beg = rmatbeg[i]; if (i > 0 && !(rmatbeg[i-1] <= beg)) { errcode = error(env, CPXERR_ARRAY_NOT_ASCENDING, i); goto done; } if (!(0 <= beg && beg <= nzcnt)) { errcode = error(env, CPXERR_INDEX_RANGE); goto done; } end = (i < rcnt-1 ? rmatbeg[i+1] : nzcnt); for (k = beg; k < end; k++) { if (!(0 <= rmatind[k] && rmatind[k] < n+ccnt)) { errcode = error(env, CPXERR_COL_INDEX_RANGE, k); goto done; } } errcode = 0; for (k = beg; k < end; k++) { if (lp->iwork[rmatind[k]]) { errcode = error(env, CPXERR_DUP_ENTRY); break; } lp->iwork[rmatind[k]] = 1; } for (k = beg; k < end; k++) lp->iwork[rmatind[k]] = 0; if (errcode) goto done; if (rowname != NULL) { if (rowname[i] == NULL) { errcode = error(env, CPXERR_NULL_NAME, i); goto done; } } } for (j = 0; j < ccnt; j++) { if (colname != NULL) { if (colname[j] == NULL) { errcode = error(env, CPXERR_NULL_NAME, j); goto done; } } } errcode = 0; invalidate(lp); if (rcnt > 0) glp_add_rows(lp->prob, rcnt); if (ccnt > 0) glp_add_cols(lp->prob, ccnt); enlargerflag(lp); for (i = 0; i < rcnt; i++) { if (rowname != NULL) glp_set_row_name(lp->prob, m+i+1, rowname[i]); temp = (rhs == NULL ? 0.0 : rhs[i]); if (sense == NULL || sense[i] == 'E') { lp->rflag[m+i] = RF_NOT_RANGED; type = GLP_FX; } else if (sense[i] == 'L') { lp->rflag[m+i] = RF_NOT_RANGED; type = GLP_UP; } else if (sense[i] == 'G') { lp->rflag[m+i] = RF_NOT_RANGED; type = GLP_LO; } else if (sense[i] == 'R') { lp->rflag[m+i] = RF_RANGED_POS; type = GLP_FX; } else xassert(sense != sense); glp_set_row_bnds(lp->prob, m+i+1, type, temp, temp); beg = rmatbeg[i]; end = (i < rcnt-1 ? rmatbeg[i+1] : nzcnt); for (k = beg; k < end; k++) lp->iwork[k-beg] = rmatind[k]+1; glp_set_mat_row(lp->prob, m+i+1, end-beg, lp->iwork-1, rmatval+beg-1); for (k = beg; k < end; k++) lp->iwork[k-beg] = 0; } for (j = 0; j < ccnt; j++) { if (colname != NULL) glp_set_col_name(lp->prob, n+j+1, colname[j]); glp_set_col_bnds(lp->prob, n+j+1, GLP_LO, 0.0, 0.0); } done: return errcode; } int CPXbaropt(CPXENV *env, CPXLP *lp) { xassert(env == env); xassert(lp == lp); xprintf("CPXbaropt: not implemented yet\n"); exit(EXIT_FAILURE); return -1; } int CPXbinvrow(CPXENV *env, CPXLP *lp, int i, double y[]) { xassert(env == env); xassert(lp == lp); xassert(i == i); xassert(y == y); xprintf("CPXbinvrow: not implemented yet\n"); exit(EXIT_FAILURE); return -1; } int CPXchgbds(CPXENV *env, CPXLP *lp, int cnt, const int indices[], const char lu[], const double bd[]) { int j, n, type, errcode; double lbnd, ubnd; errcode = checklp(env, lp); if (errcode) goto done; if (cnt < 0) { errcode = error(env, CPXERR_BAD_ARGUMENT); goto done; } if (cnt > 0) { if (indices == NULL || lu == NULL || bd == NULL) { errcode = error(env, CPXERR_NULL_POINTER); goto done; } } n = glp_get_num_cols(lp->prob); for (j = 0; j < cnt; j++) { if (!(0 <= indices[j] && indices[j] < n)) { errcode = error(env, CPXERR_COL_INDEX_RANGE, j); goto done; } if (!(lu[j] == 'L' || lu[j] == 'U' || lu[j] == 'B')) { errcode = error(env, CPXERR_BAD_LUB, j); goto done; } } errcode = 0; invalidate(lp); for (j = 0; j < cnt; j++) { type = glp_get_col_type(lp->prob, indices[j]+1); lbnd = glp_get_col_lb(lp->prob, indices[j]+1); ubnd = glp_get_col_ub(lp->prob, indices[j]+1); if (type == GLP_FR || type == GLP_UP) lbnd = -CPX_INFBOUND; if (type == GLP_FR || type == GLP_LO) ubnd = +CPX_INFBOUND; if (lu[j] == 'L') lbnd = bd[j]; else if (lu[j] == 'U') ubnd = bd[j]; else if (lu[j] == 'B') lbnd = ubnd = bd[j]; else xassert(lu != lu); if (lbnd <= -CPX_INFBOUND && ubnd >= +CPX_INFBOUND) type = GLP_FR; else if (ubnd >= +CPX_INFBOUND) type = GLP_LO; else if (lbnd <= -CPX_INFBOUND) type = GLP_UP; else if (lbnd != ubnd) type = GLP_DB; else type = GLP_FX; glp_set_col_bnds(lp->prob, indices[j]+1, type, lbnd, ubnd); } done: return errcode; } int CPXchgcoeflist(CPXENV *env, CPXLP *lp, int numcoefs, const int rowlist[], const int collist[], const double vallist[]) { int i, j, k, m, n, rcnt, ccnt, len, ptr, errcode; int *head, *next, *ind; double *val; errcode = checklp(env, lp); if (errcode) goto done; if (numcoefs < 0) { errcode = error(env, CPXERR_BAD_ARGUMENT); goto done; } if (numcoefs == 0) { errcode = 0; goto done; } if (rowlist == NULL || collist == NULL || vallist == NULL) { errcode = error(env, CPXERR_NULL_POINTER); goto done; } /* check triplets and determine the number of rows and columns to be changed */ m = glp_get_num_rows(lp->prob); n = glp_get_num_cols(lp->prob); enlargeiwork(lp, m); enlargeiwork(lp, n); rcnt = ccnt = 0; for (k = 0; k < numcoefs; k++) { i = rowlist[k]; if (!(0 <= i && i < m)) { errcode = error(env, CPXERR_ROW_INDEX_RANGE, i); goto done; } if (!(lp->iwork[i] & 0x01)) rcnt++, lp->iwork[i] |= 0x01; j = collist[k]; if (!(0 <= j && j < n)) { errcode = error(env, CPXERR_COL_INDEX_RANGE, j); goto done; } if (!(lp->iwork[j] & 0x02)) ccnt++, lp->iwork[j] |= 0x02; } memset(lp->iwork, 0, m * sizeof(int)); memset(lp->iwork, 0, n * sizeof(int)); errcode = 0; invalidate(lp); if (rcnt <= ccnt) { /* change the matrix by rows */ /* build the linked list of triplets: head[i] is a pointer to first triplet for row i next[k] is a pointer to next triplet for the same row */ head = xcalloc(m, sizeof(int)); for (i = 0; i < m; i++) head[i] = -1; next = xcalloc(numcoefs, sizeof(int)); for (k = 0; k < numcoefs; k++) { i = rowlist[k]; next[k] = head[i]; head[i] = k; } /* check duplicate columns */ for (i = 0; i < m; i++) { for (k = head[i]; k >= 0; k = next[k]) { j = collist[k]; if (lp->iwork[j]) { xfree(head); xfree(next); errcode = error(env, CPXERR_DUP_ENTRY); goto done; } lp->iwork[j] = 1; } for (k = head[i]; k >= 0; k = next[k]) lp->iwork[collist[k]] = 0; } /* perform operation */ ind = xcalloc(1+n, sizeof(int)); val = xcalloc(1+n, sizeof(double)); for (i = 0; i < m; i++) { if (head[i] < 0) continue; len = glp_get_mat_row(lp->prob, i+1, ind, val); for (ptr = 1; ptr <= len; ptr++) { j = ind[ptr]-1; xassert(lp->iwork[j] == 0); lp->iwork[j] = ptr; } for (k = head[i]; k >= 0; k = next[k]) { j = collist[k]; if (lp->iwork[j] == 0) lp->iwork[j] = ++len; ptr = lp->iwork[j]; ind[ptr] = j+1, val[ptr] = vallist[k]; } glp_set_mat_row(lp->prob, i+1, len, ind, val); for (ptr = 1; ptr <= len; ptr++) lp->iwork[ind[ptr]-1] = 0; } } else { /* change the matrix by columns */ /* build the linked lists of triplets: head[j] is a pointer to first triplet for column j next[k] is a pointer to next triplet for the same column */ head = xcalloc(n, sizeof(int)); for (j = 0; j < n; j++) head[j] = -1; next = xcalloc(numcoefs, sizeof(int)); for (k = 0; k < numcoefs; k++) { j = collist[k]; next[k] = head[j]; head[j] = k; } /* check duplicate rows */ for (j = 0; j < n; j++) { for (k = head[j]; k >= 0; k = next[k]) { i = rowlist[k]; if (lp->iwork[i]) { xfree(head); xfree(next); errcode = error(env, CPXERR_DUP_ENTRY); goto done; } lp->iwork[i] = 1; } for (k = head[j]; k >= 0; k = next[k]) lp->iwork[rowlist[k]] = 0; } /* perform operation */ ind = xcalloc(1+m, sizeof(int)); val = xcalloc(1+m, sizeof(double)); for (j = 0; j < n; j++) { if (head[j] < 0) continue; len = glp_get_mat_col(lp->prob, j+1, ind, val); for (ptr = 1; ptr <= len; ptr++) { i = ind[ptr]-1; xassert(lp->iwork[i] == 0); lp->iwork[i] = ptr; } for (k = head[j]; k >= 0; k = next[k]) { i = rowlist[k]; if (lp->iwork[i] == 0) lp->iwork[i] = ++len; ptr = lp->iwork[i]; ind[ptr] = i+1, val[ptr] = vallist[k]; } glp_set_mat_col(lp->prob, j+1, len, ind, val); for (ptr = 1; ptr <= len; ptr++) lp->iwork[ind[ptr]-1] = 0; } } xfree(head); xfree(next); xfree(ind); xfree(val); done: return errcode; } void CPXchgobjsen(CPXENV *env, CPXLP *lp, int maxormin) { int errcode; errcode = checklp(env, lp); if (errcode) goto done; if (!(maxormin == CPX_MIN || maxormin == CPX_MAX)) { errcode = error(env, CPXERR_BAD_ARGUMENT); goto done; } errcode = 0; invalidate(lp); if (maxormin == CPX_MIN) glp_set_obj_dir(lp->prob, GLP_MIN); else glp_set_obj_dir(lp->prob, GLP_MAX); done: xassert(errcode == errcode); return; } int CPXchgsense(CPXENV *env, CPXLP *lp, int cnt, const int indices[], const char sense[]) { int i, m, type, errcode; double rhs; errcode = checklp(env, lp); if (errcode) goto done; if (cnt < 0) { errcode = error(env, CPXERR_BAD_ARGUMENT); goto done; } if (cnt > 0 && (indices == NULL || sense == NULL)) { errcode = error(env, CPXERR_NULL_POINTER); goto done; } m = glp_get_num_rows(lp->prob); for (i = 0; i < cnt; i++) { if (!(0 <= indices[i] && indices[i] < m)) { errcode = error(env, CPXERR_ROW_INDEX_RANGE, i); goto done; } if (!(sense[i] == 'L' || sense[i] == 'E' || sense[i] == 'G' || sense[i] == 'R')) { errcode = error(env, CPXERR_BAD_SENSE, i); goto done; } } errcode = 0; invalidate(lp); for (i = 0; i < cnt; i++) { type = glp_get_row_type(lp->prob, indices[i]+1); if (lp->rflag[indices[i]] == RF_NOT_RANGED) { if (type == GLP_LO || type == GLP_FX) rhs = glp_get_row_lb(lp->prob, indices[i]+1); else if (type == GLP_UP) rhs = glp_get_row_ub(lp->prob, indices[i]+1); else xassert(type != type); } else if (lp->rflag[indices[i]] == RF_RANGED_POS) { xassert(type == GLP_DB || type == GLP_FX); rhs = glp_get_row_lb(lp->prob, indices[i]+1); } else if (lp->rflag[indices[i]] == RF_RANGED_NEG) { xassert(type == GLP_DB); rhs = glp_get_row_ub(lp->prob, indices[i]+1); } else xassert(lp != lp); if (sense[i] == 'L') { lp->rflag[indices[i]] = RF_NOT_RANGED; type = GLP_UP; } else if (sense[i] == 'E') { lp->rflag[indices[i]] = RF_NOT_RANGED; type = GLP_FX; } else if (sense[i] == 'G') { lp->rflag[indices[i]] = RF_NOT_RANGED; type = GLP_LO; } else if (sense[i] == 'R') { lp->rflag[indices[i]] = RF_RANGED_POS; type = GLP_FX; } else xassert(sense != sense); glp_set_row_bnds(lp->prob, indices[i]+1, type, rhs, rhs); } done: return errcode; } int CPXcloseCPLEX(CPXENV **_env) { CPXENV *env; CPXLP *lp; int errcode; if (_env == NULL) { errcode = CPXERR_NULL_POINTER; goto done; } env = *_env; errcode = checkenv(env); if (errcode) goto done; while (env->list != NULL) { lp = env->list; errcode = CPXfreeprob(env, &lp); xassert(!errcode); } xfree(env->intparam); xfree(env->dblparam); xfree(env); *_env = NULL; errcode = 0; done: return errcode; } int CPXcopybase(CPXENV *env, CPXLP *lp, const int cstat[], const int rstat[]) { int i, j, m, n, stat, errcode; errcode = checklp(env, lp); if (errcode) goto done; m = glp_get_num_rows(lp->prob); n = glp_get_num_cols(lp->prob); if (m > 0 && rstat == NULL || n > 0 && cstat == NULL) { errcode = error(env, CPXERR_NULL_POINTER); goto done; } for (i = 0; i < m; i++) { if (!(rstat[i] == CPX_AT_LOWER || rstat[i] == CPX_BASIC || rstat[i] == CPX_AT_UPPER)) { errcode = error(env, CPXERR_BAD_STATUS, i); goto done; } } for (j = 0; j < n; j++) { if (!(cstat[j] == CPX_AT_LOWER || cstat[j] == CPX_BASIC || cstat[j] == CPX_AT_UPPER || cstat[j] == CPX_FREE_SUPER)) { errcode = error(env, CPXERR_BAD_STATUS, j); goto done; } } errcode = 0; invalidate(lp); for (i = 0; i < m; i++) { if (rstat[i] == CPX_AT_LOWER) stat = GLP_NL; else if (rstat[i] == CPX_BASIC) stat = GLP_BS; else if (rstat[i] == CPX_AT_UPPER) stat = GLP_NU; else xassert(rstat != rstat); glp_set_row_stat(lp->prob, i+1, stat); } for (j = 0; j < n; j++) { if (cstat[j] == CPX_AT_LOWER) stat = GLP_NL; else if (cstat[j] == CPX_BASIC) stat = GLP_BS; else if (cstat[j] == CPX_AT_UPPER) stat = GLP_NU; else if (cstat[j] == CPX_FREE_SUPER) stat = GLP_NF; else xassert(cstat != cstat); glp_set_col_stat(lp->prob, j+1, stat); } done: return errcode; } int CPXcopybasednorms(CPXENV *env, CPXLP *lp, const int cstat[], const int rstat[], const double dnorm[]) { int errcode; errcode = CPXcopybase(env, lp, cstat, rstat); xassert(dnorm == dnorm); return errcode; } int CPXcopylp(CPXENV *env, CPXLP *lp, int numcols, int numrows, int objsen, const double obj[], const double rhs[], const char sense[], const int matbeg[], const int matcnt[], const int matind[], const double matval[], const double lb[], const double ub[], const double rngval[]) { int errcode; errcode = CPXcopylpwnames(env, lp, numcols, numrows, objsen, obj, rhs, sense, matbeg, matcnt, matind, matval, lb, ub, rngval, NULL, NULL); return errcode; } int CPXcopylpwnames(CPXENV *env, CPXLP *lp, int numcols, int numrows, int objsen, const double obj[], const double rhs[], const char sense[], const int matbeg[], const int matcnt[], const int matind[], const double matval[], const double lb[], const double ub[], const double rngval[], char *colname[], char *rowname[]) { int i, j, k, beg, end, type, errcode; double lbnd, ubnd; char name[255+1]; errcode = checklp(env, lp); if (errcode) goto done; if (numcols < 0 || numrows < 0) { errcode = error(env, CPXERR_BAD_ARGUMENT); goto done; } if (!(objsen == CPX_MIN || objsen == CPX_MAX)) { errcode = error(env, CPXERR_BAD_ARGUMENT); goto done; } if (numcols > 0) { if (matbeg == NULL || matcnt == NULL || matind == NULL || matval == NULL) { errcode = error(env, CPXERR_NULL_POINTER); goto done; } } for (i = 0; i < numrows; i++) { if (sense != NULL) { if (!(sense[i] == 'L' || sense[i] == 'E' || sense[i] == 'G' || sense[i] == 'R')) { errcode = error(env, CPXERR_BAD_SENSE, i); goto done; } } if (rowname != NULL) { if (rowname[i] == NULL) { errcode = error(env, CPXERR_NULL_NAME, i); goto done; } } } enlargeiwork(lp, numrows); for (j = 0; j < numcols; j++) { beg = matbeg[j]; if (j > 0 && !(matbeg[j-1] <= beg)) { errcode = error(env, CPXERR_ARRAY_NOT_ASCENDING, j); goto done; } if (beg < 0) { errcode = error(env, CPXERR_INDEX_RANGE); goto done; } end = beg + matcnt[j]; if (!(beg <= end) || j < numcols-1 && !(end <= matbeg[j+1])) { errcode = error(env, CPXERR_COUNT_RANGE, j); goto done; } for (k = beg; k < end; k++) { if (!(0 <= matind[k] && matind[k] < numrows)) { errcode = error(env, CPXERR_ROW_INDEX_RANGE, k); goto done; } } errcode = 0; for (k = beg; k < end; k++) { if (lp->iwork[matind[k]]) { errcode = error(env, CPXERR_DUP_ENTRY); break; } lp->iwork[matind[k]] = 1; } for (k = beg; k < end; k++) lp->iwork[matind[k]] = 0; if (errcode) goto done; if (colname != NULL) { if (colname[j] != NULL) { errcode = error(env, CPXERR_NULL_NAME, j); goto done; } } } errcode = 0; invalidate(lp); if (glp_get_prob_name(lp->prob) == NULL) name[0] = '\0'; else strcpy(name, glp_get_prob_name(lp->prob)); glp_erase_prob(lp->prob); glp_set_prob_name(lp->prob, name); if (objsen == CPX_MIN) glp_set_obj_dir(lp->prob, GLP_MIN); else if (objsen == CPX_MAX) glp_set_obj_dir(lp->prob, GLP_MAX); else xassert(objsen != objsen); if (numrows > 0) glp_add_rows(lp->prob, numrows); enlargerflag(lp); for (i = 0; i < numrows; i++) { if (rowname != NULL) glp_set_row_name(lp->prob, i+1, rowname[i]); lbnd = ubnd = (rhs == NULL ? 0.0 : rhs[i]); if (sense == NULL || sense[i] == 'E') { lp->rflag[i] = RF_NOT_RANGED; type = GLP_FX; } else if (sense[i] == 'L') { lp->rflag[i] = RF_NOT_RANGED; type = GLP_UP; } else if (sense[i] == 'G') { lp->rflag[i] = RF_NOT_RANGED; type = GLP_LO; } else if (sense[i] == 'R') { if (rngval == NULL || rngval[i] == 0.0) { lp->rflag[i] = RF_RANGED_POS; type = GLP_FX; } else if (rngval[i] > 0.0) { lp->rflag[i] = RF_RANGED_POS; type = GLP_DB; ubnd += rngval[i]; } else /* rngval[i] < 0.0 */ { lp->rflag[i] = RF_RANGED_NEG; type = GLP_DB; lbnd += rngval[i]; } } else xassert(sense != sense); glp_set_row_bnds(lp->prob, i+1, type, lbnd, ubnd); } if (numcols > 0) glp_add_cols(lp->prob, numcols); for (j = 0; j < numcols; j++) { if (colname != NULL) glp_set_col_name(lp->prob, j+1, colname[j]); lbnd = (lb == NULL ? 0.0 : lb[j]); ubnd = (ub == NULL ? +CPX_INFBOUND : ub[j]); if (lbnd <= -CPX_INFBOUND && ubnd >= +CPX_INFBOUND) type = GLP_FR; else if (ubnd >= +CPX_INFBOUND) type = GLP_LO; else if (lbnd <= -CPX_INFBOUND) type = GLP_UP; else if (lbnd != ubnd) type = GLP_DB; else type = GLP_FX; glp_set_col_bnds(lp->prob, j+1, type, lbnd, ubnd); if (obj != NULL) glp_set_obj_coef(lp->prob, j+1, obj[j]); beg = matbeg[j]; end = beg + matcnt[j]; for (k = beg; k < end; k++) lp->iwork[k-beg] = matind[k]+1; glp_set_mat_col(lp->prob, j+1, end-beg, lp->iwork-1, matval+beg-1); for (k = beg; k < end; k++) lp->iwork[k-beg] = 0; } done: return errcode; } CPXLP *CPXcreateprob(CPXENV *env, int *status, const char *probname) { CPXLP *lp = NULL; int errcode; errcode = checkenv(env); if (errcode) goto done; lp = xmalloc(sizeof(struct CPXLP)); lp->env = env; lp->prob = glp_create_prob(); glp_set_prob_name(lp->prob, probname); lp->rflen = 100; lp->rflag = xcalloc(lp->rflen, sizeof(char)); lp->iwlen = 100; lp->iwork = xcalloc(lp->iwlen, sizeof(int)); memset(lp->iwork, 0, lp->iwlen * sizeof(int)); lp->link = env->list; env->list = lp; invalidate(lp); done: if (status != NULL) *status = errcode; return lp; } int CPXdelcols(CPXENV *env, CPXLP *lp, int begin, int end) { int j, n, errcode; errcode = checklp(env, lp); if (errcode) goto done; n = glp_get_num_cols(lp->prob); if (!(0 <= begin && begin <= end && end < n)) { errcode = error(env, CPXERR_INDEX_RANGE); goto done; } errcode = 0; invalidate(lp); enlargeiwork(lp, end-begin+1); for (j = begin; j <= end; j++) lp->iwork[j-begin] = j+1; glp_del_cols(lp->prob, end-begin+1, lp->iwork-1); for (j = begin; j <= end; j++) lp->iwork[j-begin] = 0; done: return errcode; } int CPXdelrows(CPXENV *env, CPXLP *lp, int begin, int end) { int i, m, errcode; errcode = checklp(env, lp); if (errcode) goto done; m = glp_get_num_rows(lp->prob); if (!(0 <= begin && begin <= end && end < m)) { errcode = error(env, CPXERR_INDEX_RANGE); goto done; } errcode = 0; invalidate(lp); enlargeiwork(lp, end-begin+1); for (i = begin; i <= end; i++) lp->iwork[i-begin] = i+1; glp_del_rows(lp->prob, end-begin+1, lp->iwork-1); for (i = begin; i <= end; i++) lp->iwork[i-begin] = 0; for (i = end+1; i < m; i++) lp->rflag[i-(end-begin+1)] = lp->rflag[i]; done: return errcode; } int CPXdelsetcols(CPXENV *env, CPXLP *lp, int delstat[]) { xassert(env == env); xassert(lp == lp); xassert(delstat == delstat); xprintf("CPXdelsetcols: not implemented yet\n"); exit(EXIT_FAILURE); return -1; } int CPXdelsetrows(CPXENV *env, CPXLP *lp, int delstat[]) { int i, m, cnt, ind, errcode; errcode = checklp(env, lp); if (errcode) goto done; m = glp_get_num_rows(lp->prob); if (m > 0 && delstat == NULL) { errcode = error(env, CPXERR_NULL_POINTER); goto done; } errcode = 0; invalidate(lp); enlargeiwork(lp, m); cnt = ind = 0; for (i = 0; i < m; i++) { if (delstat[i] == 1) { delstat[i] = -1; lp->iwork[cnt++] = i+1; } else { delstat[i] = ind; lp->rflag[ind++] = lp->rflag[i]; } } if (cnt > 0) glp_del_rows(lp->prob, cnt, lp->iwork-1); for (i = 0; i < cnt; i++) lp->iwork[i] = 0; done: return errcode; } int CPXdualopt(CPXENV *env, CPXLP *lp); int CPXfreeprob(CPXENV *env, CPXLP **_lp) { CPXLP *lp; int errcode; errcode = checkenv(env); if (errcode) goto done; if (_lp == NULL) { errcode = error(env, CPXERR_NULL_POINTER); goto done; } lp = *_lp; errcode = checklp(env, lp); if (errcode) goto done; errcode = 0; env = lp->env; if (env->list == lp) env->list = lp->link; else { CPXLP *pp; for (pp = env->list; pp != NULL; pp = pp->link) if (pp->link == lp) break; xassert(pp != NULL); pp->link = lp->link; } glp_delete_prob(lp->prob); xfree(lp->rflag); xfree(lp->iwork); xfree(lp); *_lp = NULL; done: return errcode; } int CPXgetbase(CPXENV *env, CPXLP *lp, int cstat[], int rstat[]) { int i, j, m, n, stat, errcode; errcode = checklp(env, lp); if (errcode) goto done; if (!lp->stat) { errcode = error(env, CPXERR_NO_SOLN); goto done; } if (lp->meth == CPX_ALG_PRIMAL || lp->meth == CPX_ALG_DUAL) ; else { errcode = error(env, CPXERR_NO_BASIC_SOLN); goto done; } errcode = 0; if (rstat != NULL) { m = glp_get_num_rows(lp->prob); for (i = 0; i < m; i++) { stat = glp_get_row_stat(lp->prob, i+1); if (stat == GLP_BS) rstat[i] = CPX_BASIC; else if (lp->rflag[i] == RF_NOT_RANGED || stat != GLP_NU) rstat[i] = CPX_AT_LOWER; else rstat[i] = CPX_AT_UPPER; } } if (cstat != NULL) { n = glp_get_num_cols(lp->prob); for (j = 0; j < n; j++) { stat = glp_get_col_stat(lp->prob, j+1); if (stat == GLP_BS) cstat[j] = CPX_BASIC; else if (stat == GLP_NU) cstat[j] = CPX_AT_UPPER; else if (stat == GLP_NF) cstat[j] = CPX_FREE_SUPER; else cstat[j] = CPX_AT_LOWER; } } done: return errcode; } int CPXgetbasednorms(CPXENV *env, CPXLP *lp, int cstat[], int rstat[], double dnorm[]) { int i, m, errcode; errcode = CPXgetbase(env, lp, cstat, rstat); if (errcode) goto done; if (dnorm != NULL) { m = glp_get_num_rows(lp->prob); for (i = 0; i < m; i++) dnorm[i] = 1.0; } done: return errcode; } int CPXgetbhead(CPXENV *env, CPXLP *lp, int head[], double x[]) { xassert(env == env); xassert(lp == lp); xassert(head == head); xassert(x == x); xprintf("CPXgetbhead: not implemented yet\n"); exit(EXIT_FAILURE); return -1; } int CPXgetdblparam(CPXENV *env, int whichparam, double *value) { int k, errcode; errcode = checkenv(env); if (errcode) goto done; k = finddblparam(whichparam); if (k < 0) { errcode = error(env, CPXERR_BAD_PARAM_NUM); goto done; } errcode = 0; if (value != NULL) *value = env->dblparam[k]; done: return errcode; } int CPXgetdj(CPXENV *env, CPXLP *lp, double dj[], int begin, int end) { int j, n, errcode; errcode = checklp(env, lp); if (errcode) goto done; n = glp_get_num_cols(lp->prob); if (!(0 <= begin && begin <= end && end < n)) { errcode = error(env, CPXERR_INDEX_RANGE); goto done; } if (!lp->stat) { errcode = error(env, CPXERR_NO_SOLN); goto done; } errcode = 0; if (lp->meth == CPX_ALG_PRIMAL || lp->meth == CPX_ALG_DUAL) { if (dj != NULL) { for (j = begin; j <= end; j++) dj[j-begin] = glp_get_col_dual(lp->prob, j+1); } } else xassert(lp != lp); done: return errcode; } char *CPXgeterrorstring(CPXENV *env, int errcode, char *buffer) { const char *string; xassert(env == env); string = finderrstring(errcode); if (string == NULL) buffer = NULL; else sprintf(buffer, "CPLEX Error %5d: %s.\n", errcode, string); return buffer; } int CPXgetijdiv(CPXENV *env, CPXLP *lp, int *idiv, int *jdiv) { xassert(env == env); xassert(lp == lp); xassert(idiv == idiv); xassert(jdiv == jdiv); xprintf("CPXgetijdiv: not implemented yet\n"); exit(EXIT_FAILURE); return -1; } int CPXgetintparam(CPXENV *env, int whichparam, int *value) { int k, errcode; errcode = checkenv(env); if (errcode) goto done; k = findintparam(whichparam); if (k < 0) { errcode = error(env, CPXERR_BAD_PARAM_NUM); goto done; } errcode = 0; if (value != NULL) *value = env->intparam[k]; done: return errcode; } int CPXgetlb(CPXENV *env, CPXLP *lp, double lb[], int begin, int end) { xassert(env == env); xassert(lp == lp); xassert(lb == lb); xassert(begin == begin); xassert(end == end); xprintf("CPXgetlb: not implemented yet\n"); exit(EXIT_FAILURE); return -1; } int CPXgetmethod(CPXENV *env, CPXLP *lp) { int method; if (checklp(env, lp)) method = CPX_ALG_NONE; else method = lp->meth; return method; } int CPXgetnumcols(CPXENV *env, CPXLP *lp) { int numcols; if (checklp(env, lp)) numcols = 0; else numcols = glp_get_num_cols(lp->prob); return numcols; } int CPXgetnumnz(CPXENV *env, CPXLP *lp) { int numnz; if (checklp(env, lp)) numnz = 0; else numnz = glp_get_num_nz(lp->prob); return numnz; } int CPXgetnumrows(CPXENV *env, CPXLP *lp) { int numrows; if (checklp(env, lp)) numrows = 0; else numrows = glp_get_num_rows(lp->prob); return numrows; } int CPXgetobjval(CPXENV *env, CPXLP *lp, double *objval) { int errcode; errcode = checklp(env, lp); if (errcode) goto done; if (!lp->stat) { errcode = error(env, CPXERR_NO_SOLN); goto done; } errcode = 0; if (lp->meth == CPX_ALG_PRIMAL || lp->meth == CPX_ALG_DUAL) { if (objval != NULL) *objval = glp_get_obj_val(lp->prob); } else xassert(lp != lp); done: return errcode; } int CPXgetpi(CPXENV *env, CPXLP *lp, double pi[], int begin, int end) { int i, m, errcode; errcode = checklp(env, lp); if (errcode) goto done; m = glp_get_num_rows(lp->prob); if (!(0 <= begin && begin <= end && end < m)) { errcode = error(env, CPXERR_INDEX_RANGE); goto done; } if (!lp->stat) { errcode = error(env, CPXERR_NO_SOLN); goto done; } errcode = 0; if (lp->meth == CPX_ALG_PRIMAL || lp->meth == CPX_ALG_DUAL) { if (pi != NULL) { for (i = begin; i <= end; i++) pi[i-begin] = glp_get_row_dual(lp->prob, i+1); } } else xassert(lp != lp); done: return errcode; } int CPXgetsense(CPXENV *env, CPXLP *lp, char sense[], int begin, int end) { xassert(env == env); xassert(lp == lp); xassert(sense == sense); xassert(begin == begin); xassert(end == end); xprintf("CPXgetsense: not implemented yet\n"); exit(EXIT_FAILURE); return -1; } int CPXgetslack(CPXENV *env, CPXLP *lp, double slack[], int begin, int end) { int i, m, type, errcode; double temp; errcode = checklp(env, lp); if (errcode) goto done; m = glp_get_num_rows(lp->prob); if (!(0 <= begin && begin <= end && end < m)) { errcode = error(env, CPXERR_INDEX_RANGE); goto done; } if (!lp->stat) { errcode = error(env, CPXERR_NO_SOLN); goto done; } errcode = 0; if (lp->meth == CPX_ALG_PRIMAL || lp->meth == CPX_ALG_DUAL) { if (slack != NULL) { for (i = begin; i <= end; i++) { type = glp_get_row_type(lp->prob, i+1); temp = glp_get_row_prim(lp->prob, i+1); if (lp->rflag[i] == RF_NOT_RANGED) { if (type == GLP_LO || type == GLP_FX) slack[i-begin] = glp_get_row_lb(lp->prob, i+1) - temp; else if (type == GLP_UP) slack[i-begin] = glp_get_row_ub(lp->prob, i+1) - temp; else xassert(type != type); } else if (lp->rflag[i] == RF_RANGED_POS) { xassert(type == GLP_DB || type == GLP_FX); slack[i-begin] = temp - glp_get_row_lb(lp->prob, i+1); } else if (lp->rflag[i] == RF_RANGED_NEG) { xassert(type == GLP_DB); slack[i-begin] = temp - glp_get_row_ub(lp->prob, i+1); } else xassert(lp != lp); } } } else xassert(lp != lp); done: return errcode; } int CPXgetstat(CPXENV *env, CPXLP *lp) { int stat; if (checklp(env, lp)) stat = 0; else stat = lp->stat; return stat; } int CPXgetub(CPXENV *env, CPXLP *lp, double ub[], int begin, int end) { xassert(env == env); xassert(lp == lp); xassert(ub == ub); xassert(begin == begin); xassert(end == end); xprintf("CPXgetub: not implemented yet\n"); exit(EXIT_FAILURE); return -1; } int CPXgetweight(CPXENV *env, CPXLP *lp, int rcnt, const int rmatbeg[], const int rmatind[], const double rmatval[], double weight[], int dpriind) { xassert(env == env); xassert(lp == lp); xassert(rcnt == rcnt); xassert(rmatbeg == rmatbeg); xassert(rmatind == rmatind); xassert(rmatval == rmatval); xassert(weight == weight); xassert(dpriind == dpriind); xprintf("CPXgetweight: not implemented yet\n"); exit(EXIT_FAILURE); return -1; } int CPXgetx(CPXENV *env, CPXLP *lp, double x[], int begin, int end) { int j, n, errcode; errcode = checklp(env, lp); if (errcode) goto done; n = glp_get_num_cols(lp->prob); if (!(0 <= begin && begin <= end && end < n)) { errcode = error(env, CPXERR_INDEX_RANGE); goto done; } if (!lp->stat) { errcode = error(env, CPXERR_NO_SOLN); goto done; } errcode = 0; if (lp->meth == CPX_ALG_PRIMAL || lp->meth == CPX_ALG_DUAL) { if (x != NULL) { for (j = begin; j <= end; j++) x[j-begin] = glp_get_col_prim(lp->prob, j+1); } } else xassert(lp != lp); done: return errcode; } int CPXinfodblparam(CPXENV *env, int whichparam, double *defvalue, double *minvalue, double *maxvalue) { int k, errcode; errcode = checkenv(env); if (errcode) goto done; k = finddblparam(whichparam); if (k < 0) { errcode = error(env, CPXERR_BAD_PARAM_NUM); goto done; } errcode = 0; if (defvalue != NULL) *defvalue = dblparam[k].defv; if (minvalue != NULL) *minvalue = dblparam[k].minv; if (maxvalue != NULL) *maxvalue = dblparam[k].maxv; done: return errcode; } int CPXinfointparam(CPXENV *env, int whichparam, int *defvalue, int *minvalue, int *maxvalue) { int k, errcode; errcode = checkenv(env); if (errcode) goto done; k = findintparam(whichparam); if (k < 0) { errcode = error(env, CPXERR_BAD_PARAM_NUM); goto done; } errcode = 0; if (defvalue != NULL) *defvalue = intparam[k].defv; if (minvalue != NULL) *minvalue = intparam[k].minv; if (maxvalue != NULL) *maxvalue = intparam[k].maxv; done: return errcode; } int CPXmdleave(const CPXENV *env, CPXLP *lp, const int goodlist[], int goodlen, double downratio[], double upratio[]) { int k; xassert(env == env); xassert(lp == lp); xassert(goodlist == goodlist); xassert(goodlen >= 0); xassert(downratio != NULL); xassert(upratio != NULL); /* not implemented yet */ for (k = 0; k < goodlen; k++) downratio[k] = upratio[k] = 0.0; return 0; } int CPXnewcols(CPXENV *env, CPXLP *lp, int ccnt, const double obj[], const double lb[], const double ub[], const char ctype[], char *colname[]) { int j, n, kind, type, errcode; double lbnd, ubnd; errcode = checklp(env, lp); if (errcode) goto done; if (ccnt < 0) { errcode = error(env, CPXERR_BAD_ARGUMENT); goto done; } for (j = 0; j < ccnt; j++) { if (ctype != NULL) { if (!(ctype[j] == 'C' || ctype[j] == 'B' || ctype[j] == 'I')) { errcode = error(env, CPXERR_BAD_CTYPE, j); goto done; } } if (colname != NULL) { if (colname[j] == NULL) { errcode = error(env, CPXERR_NULL_NAME, j); goto done; } } } errcode = 0; invalidate(lp); n = glp_get_num_cols(lp->prob); if (ccnt > 0) glp_add_cols(lp->prob, ccnt); for (j = 0; j < ccnt; j++) { if (colname != NULL) glp_set_col_name(lp->prob, n+j+1, colname[j]); if (obj != NULL) glp_set_obj_coef(lp->prob, n+j+1, obj[j]); lbnd = (lb == NULL ? 0.0 : lb[j]); ubnd = (ub == NULL ? 0.0 : ub[j]); if (lbnd <= -CPX_INFBOUND && ubnd >= +CPX_INFBOUND) type = GLP_FR; else if (ubnd >= +CPX_INFBOUND) type = GLP_LO; else if (lbnd <= -CPX_INFBOUND) type = GLP_UP; else if (lbnd != ubnd) type = GLP_DB; else type = GLP_FX; glp_set_col_bnds(lp->prob, n+j+1, type, lbnd, ubnd); if (ctype != NULL) { if (ctype[j] == 'C') kind = GLP_CV; else if (ctype[j] == 'B') kind = GLP_BV; else if (ctype[j] == 'I') kind = GLP_IV; else xassert(ctype != ctype); glp_set_col_kind(lp->prob, n+j+1, kind); } } done: return errcode; } int CPXnewrows(CPXENV *env, CPXLP *lp, int rcnt, const double rhs[], const char sense[], const double rngval[], char *rowname[]) { int i, m, type, errcode; double lbnd, ubnd; errcode = checklp(env, lp); if (errcode) goto done; if (rcnt < 0) { errcode = error(env, CPXERR_BAD_ARGUMENT); goto done; } for (i = 0; i < rcnt; i++) { if (sense != NULL) { if (!(sense[i] == 'L' || sense[i] == 'E' || sense[i] == 'G' || sense[i] == 'R')) { errcode = error(env, CPXERR_BAD_SENSE, i); goto done; } } if (rowname != NULL) { if (rowname[i] == NULL) { errcode = error(env, CPXERR_NULL_NAME, i); goto done; } } } errcode = 0; invalidate(lp); m = glp_get_num_rows(lp->prob); if (rcnt > 0) glp_add_rows(lp->prob, rcnt); enlargerflag(lp); for (i = 0; i < rcnt; i++) { if (rowname != NULL) glp_set_row_name(lp->prob, m+i+1, rowname[i]); lbnd = ubnd = (rhs == NULL ? 0.0 : rhs[i]); if (sense == NULL || sense[i] == 'E') { lp->rflag[m+i] = RF_NOT_RANGED; type = GLP_FX; } else if (sense[i] == 'L') { lp->rflag[m+i] = RF_NOT_RANGED; type = GLP_UP; } else if (sense[i] == 'G') { lp->rflag[m+i] = RF_NOT_RANGED; type = GLP_LO; } else if (sense[i] == 'R') { if (rngval == NULL || rngval[i] == 0.0) { lp->rflag[m+i] = RF_RANGED_POS; type = GLP_FX; } else if (rngval[i] > 0.0) { lp->rflag[m+i] = RF_RANGED_POS; type = GLP_DB; ubnd += rngval[i]; } else /* rngval[i] < 0.0 */ { lp->rflag[m+i] = RF_RANGED_NEG; type = GLP_DB; lbnd += rngval[i]; } } else xassert(sense != sense); glp_set_row_bnds(lp->prob, m+i+1, type, lbnd, ubnd); } done: return errcode; } CPXENV *CPXopenCPLEX(int *status) { CPXENV *env; int k, card; env = xmalloc(sizeof(CPXENV)); env->list = NULL; card = sizeof(intparam) / sizeof(struct intparam); env->intparam = xcalloc(card, sizeof(int)); for (k = 0; k < card; k++) env->intparam[k] = intparam[k].defv; card = sizeof(dblparam) / sizeof(struct dblparam); env->dblparam = xcalloc(card, sizeof(double)); for (k = 0; k < card; k++) env->dblparam[k] = dblparam[k].defv; if (status != NULL) *status = 0; return env; } int CPXpivotin(CPXENV *env, CPXLP *lp, const int rlist[], int rlen) { int i, m, errcode; errcode = checklp(env, lp); if (errcode) goto done; if (rlen < 0) { errcode = error(env, CPXERR_BAD_ARGUMENT); goto done; } if (rlen > 0 && rlist == NULL) { errcode = error(env, CPXERR_NULL_POINTER); goto done; } m = glp_get_num_rows(lp->prob); for (i = 0; i < rlen; i++) { if (!(0 <= rlist[i] && rlist[i] < m)) { errcode = error(env, CPXERR_ROW_INDEX_RANGE, i); goto done; } } errcode = 0; for (i = 0; i < rlen; i++) { if (glp_get_row_type(lp->prob, rlist[i]+1) != GLP_FX) { if (glp_get_row_stat(lp->prob, rlist[i]+1) != GLP_BS) { /* not implemented yet */ break; } } } done: return errcode; } int CPXpivotout(CPXENV *env, CPXLP *lp, const int clist[], int clen) { int j, n, errcode; errcode = checklp(env, lp); if (errcode) goto done; if (clen < 0) { errcode = error(env, CPXERR_BAD_ARGUMENT); goto done; } if (clen > 0 && clist == NULL) { errcode = error(env, CPXERR_NULL_POINTER); goto done; } n = glp_get_num_cols(lp->prob); for (j = 0; j < clen; j++) { if (!(0 <= clist[j] && clist[j] < n)) { errcode = error(env, CPXERR_COL_INDEX_RANGE, j); goto done; } if (glp_get_col_type(lp->prob, clist[j]+1) != GLP_FX) { errcode = error(env, CPXERR_NOT_FIXED); goto done; } } errcode = 0; for (j = 0; j < clen; j++) { if (glp_get_col_stat(lp->prob, clist[j]+1) == GLP_BS) { /* not implemented yet */ break; } } done: return errcode; } int CPXprimopt(CPXENV *env, CPXLP *lp); int CPXsavwrite(CPXENV *env, CPXLP *lp, const char *filename) { xassert(env == env); xassert(lp == lp); xassert(filename == filename); xprintf("CPXsavwrite: not implemented yet\n"); exit(EXIT_FAILURE); return -1; } int CPXsetdblparam(CPXENV *env, int whichparam, double newvalue) { int k, errcode; errcode = checkenv(env); if (errcode) goto done; k = finddblparam(whichparam); if (k < 0) { errcode = error(env, CPXERR_BAD_PARAM_NUM); goto done; } if (newvalue < dblparam[k].minv) { errcode = error(env, CPXERR_PARAM_TOO_SMALL); goto done; } if (newvalue > dblparam[k].maxv) { errcode = error(env, CPXERR_PARAM_TOO_BIG); goto done; } errcode = 0; env->dblparam[k] = newvalue; done: return errcode; } int CPXsetintparam(CPXENV *env, int whichparam, int newvalue) { int k, errcode; errcode = checkenv(env); if (errcode) goto done; k = findintparam(whichparam); if (k < 0) { errcode = error(env, CPXERR_BAD_PARAM_NUM); goto done; } if (newvalue < intparam[k].minv) { errcode = error(env, CPXERR_PARAM_TOO_SMALL); goto done; } if (newvalue > intparam[k].maxv) { errcode = error(env, CPXERR_PARAM_TOO_BIG); goto done; } errcode = 0; env->intparam[k] = newvalue; done: return errcode; } int CPXsolninfo(CPXENV *env, CPXLP *lp, int *solnmethod, int *solntype, int *pfeasind, int *dfeasind) { int type, pfeas, dfeas, errcode; errcode = checklp(env, lp); if (errcode) goto done; errcode = 0; if (!lp->stat) type = CPX_NO_SOLN, pfeas = dfeas = 0; else if (lp->meth == CPX_ALG_PRIMAL || lp->meth == CPX_ALG_DUAL) { type = CPX_BASIC_SOLN; pfeas = (glp_get_prim_stat(lp->prob) == GLP_FEAS); dfeas = (glp_get_dual_stat(lp->prob) == GLP_FEAS); } else xassert(lp != lp); if (solnmethod != NULL) *solnmethod = lp->meth; if (solntype != NULL) *solntype = type; if (pfeasind != NULL) *pfeasind = pfeas; if (dfeasind != NULL) *dfeasind = dfeas; done: return errcode; } int CPXsolution(CPXENV *env, CPXLP *lp, int *lpstat, double *objval, double x[], double pi[], double slack[], double dj[]) { int m, n, errcode; errcode = checklp(env, lp); if (errcode) goto done; if (!lp->stat) { errcode = error(env, CPXERR_NO_SOLN); goto done; } errcode = 0; m = glp_get_num_rows(lp->prob); n = glp_get_num_cols(lp->prob); if (lp->meth == CPX_ALG_PRIMAL || lp->meth == CPX_ALG_DUAL) { if (lpstat != NULL) *lpstat = CPXgetstat(env, lp); if (objval != NULL) xassert(CPXgetobjval(env, lp, objval) == 0); if (x != NULL) xassert(CPXgetx(env, lp, x, 0, n-1) == 0); if (pi != NULL) xassert(CPXgetpi(env, lp, pi, 0, m-1) == 0); if (slack != NULL) xassert(CPXgetslack(env, lp, slack, 0, m-1) == 0); if (dj != NULL) xassert(CPXgetdj(env, lp, dj, 0, n-1) == 0); } else xassert(lp != lp); done: return errcode; } int CPXstrongbranch(CPXENV *env, CPXLP *lp, const int goodlist[], int goodlen, double downpen[], double uppen[], int itlim) { int k; xassert(env == env); xassert(lp == lp); xassert(goodlist == goodlist); xassert(goodlen >= 0); xassert(downpen != NULL); xassert(uppen != NULL); xassert(itlim == itlim); /* not implemented yet */ for (k = 0; k < goodlen; k++) downpen[k] = uppen[k] = 0.0; return 0; } static int xstrcasecmp(const char *s1, const char *s2) { int c1, c2; for (;;) { c1 = toupper((unsigned char)*s1++); c2 = toupper((unsigned char)*s2++); if (c1 == '\0' || c1 != c2) break; } return c1 - c2; } static void getfiletype(const char *filename, char type[3+1]) { /* determine filetype from filename */ int beg, end; beg = end = strlen(filename); while (beg > 0 && filename[beg-1] != '.' && end - beg < 3) beg--; if (beg > 0 && filename[beg-1] == '.' && xstrcasecmp(&filename[beg], "gz") == 0) { end = --beg; while (beg > 0 && filename[beg-1] != '.' && end - beg < 3) beg--; } if (beg > 0 && filename[beg-1] == '.') { memcpy(type, &filename[beg], end - beg); type[end - beg] = '\0'; } else type[0] = '\0'; return; } int CPXwriteprob(CPXENV *env, CPXLP *lp, const char *filename, const char *filetype) { glp_prob *copy; int errcode; char type[3+1]; errcode = checklp(env, lp); if (errcode) goto done; if (filename == NULL) { errcode = error(env, CPXERR_NO_FILENAME); goto done; } if (filetype == NULL) getfiletype(filename, type), filetype = type; if (xstrcasecmp(filetype, "MPS") == 0) { glp_term_out(GLP_OFF); errcode = glp_write_mps(lp->prob, GLP_MPS_FILE, NULL, filename) ; glp_term_out(GLP_ON); } else if (xstrcasecmp(filetype, "LP") == 0) { glp_term_out(GLP_OFF); errcode = glp_write_lp(lp->prob, NULL, filename); glp_term_out(GLP_ON); } else if (xstrcasecmp(filetype, "RMP") == 0 || xstrcasecmp(filetype, "REW") == 0) { copy = glp_create_prob(); glp_copy_prob(copy, lp->prob, GLP_OFF); glp_term_out(GLP_OFF); errcode = glp_write_mps(copy, GLP_MPS_DECK, NULL, filename); glp_term_out(GLP_ON); glp_delete_prob(copy); } else if (xstrcasecmp(filetype, "RLP") == 0) { copy = glp_create_prob(); glp_copy_prob(copy, lp->prob, GLP_OFF); glp_term_out(GLP_OFF); errcode = glp_write_lp(copy, NULL, filename); glp_term_out(GLP_ON); glp_delete_prob(copy); } else { errcode = error(env, CPXERR_BAD_FILETYPE); goto done; } if (errcode) errcode = error(env, CPXERR_FAIL_OPEN_WRITE, filename); done: return errcode; } /**********************************************************************/ static int solvelp(CPXENV *env, CPXLP *lp, int meth) { glp_smcp parm; int errcode; errcode = checklp(env, lp); if (errcode) goto done; errcode = 0; invalidate(lp); glp_init_smcp(&parm); switch (meth) { case CPX_ALG_PRIMAL: parm.meth = GLP_PRIMAL; break; case CPX_ALG_DUAL: parm.meth = GLP_DUAL; break; default: xassert(meth != meth); } switch (getintparam(env, CPX_PARAM_SIMDISPLAY)) { case 0: parm.msg_lev = GLP_MSG_OFF; break; case 1: parm.msg_lev = GLP_MSG_ALL; break; case 2: parm.msg_lev = GLP_MSG_ALL; parm.out_frq = 1; break; default: xassert(env != env); } xassert(getdblparam == getdblparam); switch (getintparam(env, CPX_PARAM_ADVIND)) { case 0: glp_term_out(GLP_OFF); glp_adv_basis(lp->prob, 0); glp_term_out(GLP_ON); break; case 1: case 2: break; default: xassert(env != env); } if (!glp_bf_exists(lp->prob)) { if (glp_factorize(lp->prob) != 0) { glp_term_out(GLP_OFF); glp_adv_basis(lp->prob, 0); glp_term_out(GLP_ON); if (glp_factorize(lp->prob) != 0) glp_std_basis(lp->prob); } } xassert(glp_simplex(lp->prob, &parm) == 0); switch (glp_get_status(lp->prob)) { case GLP_OPT: lp->stat = CPX_STAT_OPTIMAL; lp->meth = meth; break; case GLP_NOFEAS: lp->stat = CPX_STAT_INFEASIBLE; lp->meth = meth; break; case GLP_UNBND: lp->stat = CPX_STAT_UNBOUNDED; lp->meth = meth; break; default: xassert(lp != lp); } done: return errcode; } int CPXprimopt(CPXENV *env, CPXLP *lp) { int errcode; errcode = solvelp(env, lp, CPX_ALG_PRIMAL); return errcode; } int CPXdualopt(CPXENV *env, CPXLP *lp) { int errcode; errcode = solvelp(env, lp, CPX_ALG_DUAL); return errcode; } int CPXlpopt(CPXENV *env, CPXLP *lp) { int errcode; errcode = solvelp(env, lp, CPX_ALG_PRIMAL); return errcode; } /* eof */ glpk-5.0/examples/cplex/cplex.h0000644000062000006210000002351413766346220015724 0ustar maomkpasswd/* cplex.h (CPLEX-like interface to GLPK API) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2001-2013 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef _CPLEX_H #define _CPLEX_H #ifdef __cplusplus extern "C" { #endif typedef struct CPXENV CPXENV, *CPXENVptr; typedef struct CPXLP CPXLP, *CPXLPptr; #define CPX_VERSION 900 #define CPX_OFF 0 #define CPX_ON 1 #define CPX_INFBOUND 1e20 /* error codes: */ #define CPXERR_NO_MEMORY 1001 #define CPXERR_NO_ENVIRONMENT 1002 #define CPXERR_BAD_ARGUMENT 1003 #define CPXERR_NULL_POINTER 1004 #define CPXERR_NO_PROBLEM 1009 #define CPXERR_BAD_PARAM_NUM 1013 #define CPXERR_PARAM_TOO_SMALL 1014 #define CPXERR_PARAM_TOO_BIG 1015 #define CPXERR_INDEX_RANGE 1200 #define CPXERR_COL_INDEX_RANGE 1201 #define CPXERR_ROW_INDEX_RANGE 1203 #define CPXERR_NEGATIVE_SURPLUS 1207 #define CPXERR_BAD_SENSE 1215 #define CPXERR_NO_SOLN 1217 #define CPXERR_NOT_FIXED 1221 #define CPXERR_DUP_ENTRY 1222 #define CPXERR_NULL_NAME 1224 #define CPXERR_ARRAY_NOT_ASCENDING 1226 #define CPXERR_COUNT_RANGE 1227 #define CPXERR_BAD_LUB 1229 #define CPXERR_BAD_STATUS 1253 #define CPXERR_NO_BASIC_SOLN 1261 #define CPXERR_NO_FILENAME 1421 #define CPXERR_FAIL_OPEN_WRITE 1422 #define CPXERR_BAD_FILETYPE 1424 #define CPXERR_BAD_CTYPE 3021 /* control parameters: */ #define CPX_PARAM_ADVIND 1001 #define CPX_PARAM_AGGIND 1003 #define CPX_PARAM_DPRIIND 1009 #define CPX_PARAM_EPOPT 1014 #define CPX_PARAM_EPPER 1015 #define CPX_PARAM_EPRHS 1016 #define CPX_PARAM_FASTMIP 1017 /* ??? */ #define CPX_PARAM_SIMDISPLAY 1019 #define CPX_PARAM_ITLIM 1020 #define CPX_PARAM_OBJLLIM 1025 #define CPX_PARAM_OBJULIM 1026 #define CPX_PARAM_PERIND 1027 #define CPX_PARAM_PPRIIND 1029 #define CPX_PARAM_PREIND 1030 #define CPX_PARAM_REINV 1031 #define CPX_PARAM_SCRIND 1035 #define CPX_PARAM_DATACHECK 1056 /* CPX_PARAM_DPRIIND: */ #define CPX_DPRIIND_AUTO 0 #define CPX_DPRIIND_FULL 1 #define CPX_DPRIIND_STEEP 2 #define CPX_DPRIIND_FULL_STEEP 3 #define CPX_DPRIIND_STEEPQSTART 4 #define CPX_DPRIIND_DEVEX 5 /* CPX_PARAM_PPRIIND: */ #define CPX_PPRIIND_PARTIAL (-1) #define CPX_PPRIIND_AUTO 0 #define CPX_PPRIIND_DEVEX 1 #define CPX_PPRIIND_STEEP 2 #define CPX_PPRIIND_STEEPQSTART 3 #define CPX_PPRIIND_FULL 4 /* CPXgetprobtype: */ #define CPXPROB_LP 0 #define CPXPROB_MIP 1 #define CPXPROB_RELAXED 2 #define CPXPROB_FIXED 3 #define CPXPROB_QP 5 #define CPXPROB_ZEROEDQP 6 /* CPXgetobjsen: */ #define CPX_MIN 1 #define CPX_MAX (-1) /* CPXgetbase: */ #define CPX_AT_LOWER 0 #define CPX_BASIC 1 #define CPX_AT_UPPER 2 #define CPX_FREE_SUPER 3 /* CPXgetstat: */ #define CPX_STAT_OPTIMAL 1 #define CPX_STAT_UNBOUNDED 2 #define CPX_STAT_INFEASIBLE 3 #define CPX_STAT_INForUNBD 4 #define CPX_STAT_OPTIMAL_INFEAS 5 #define CPX_STAT_ABORT_IT_LIM 10 #define CPX_STAT_ABORT_OBJ_LIM 12 /* CPXgetmethod: */ #define CPX_ALG_NONE 0 #define CPX_ALG_PRIMAL 1 #define CPX_ALG_DUAL 2 #define CPX_ALG_BARRIER 4 /* CPXsolninfo: */ #define CPX_NO_SOLN 0 #define CPX_BASIC_SOLN 1 #define CPX_NONBASIC_SOLN 2 #define CPX_PRIMAL_SOLN 3 int CPXaddcols(CPXENV *env, CPXLP *lp, int ccnt, int nzcnt, const double obj[], const int cmatbeg[], const int cmatind[], const double cmatval[], const double lb[], const double ub[], char *colname[]); int CPXaddrows(CPXENV *env, CPXLP *lp, int ccnt, int rcnt, int nzcnt, const double rhs[], const char sense[], const int rmatbeg[], const int rmatind[], const double rmatval[], char *colname[], char *rowname[]); int CPXbaropt(CPXENV *env, CPXLP *lp); int CPXbinvrow(CPXENV *env, CPXLP *lp, int i, double y[]); int CPXchgbds(CPXENV *env, CPXLP *lp, int cnt, const int indices[], const char lu[], const double bd[]); int CPXchgcoeflist(CPXENV *env, CPXLP *lp, int numcoefs, const int rowlist[], const int collist[], const double vallist[]); void CPXchgobjsen(CPXENV *env, CPXLP *lp, int maxormin); int CPXchgsense(CPXENV *env, CPXLP *lp, int cnt, const int indices[], const char sense[]); int CPXcloseCPLEX(CPXENV **env); int CPXcopybase(CPXENV *env, CPXLP *lp, const int cstat[], const int rstat[]); int CPXcopybasednorms(CPXENV *env, CPXLP *lp, const int cstat[], const int rstat[], const double dnorm[]); int CPXcopylp(CPXENV *env, CPXLP *lp, int numcols, int numrows, int objsen, const double obj[], const double rhs[], const char sense[], const int matbeg[], const int matcnt[], const int matind[], const double matval[], const double lb[], const double ub[], const double rngval[]); int CPXcopylpwnames(CPXENV *env, CPXLP *lp, int numcols, int numrows, int objsen, const double obj[], const double rhs[], const char sense[], const int matbeg[], const int matcnt[], const int matind[], const double matval[], const double lb[], const double ub[], const double rngval[], char *colname[], char *rowname[]); CPXLP *CPXcreateprob(CPXENV *env, int *status, const char *probname); int CPXdelcols(CPXENV *env, CPXLP *lp, int begin, int end); int CPXdelrows(CPXENV *env, CPXLP *lp, int begin, int end); int CPXdelsetcols(CPXENV *env, CPXLP *lp, int delstat[]); int CPXdelsetrows(CPXENV *env, CPXLP *lp, int delstat[]); int CPXdualopt(CPXENV *env, CPXLP *lp); int CPXfreeprob(CPXENV *env, CPXLP **lp); int CPXgetbase(CPXENV *env, CPXLP *lp, int cstat[], int rstat[]); int CPXgetbasednorms(CPXENV *env, CPXLP *lp, int cstat[], int rstat[], double dnorm[]); int CPXgetbhead(CPXENV *env, CPXLP *lp, int head[], double x[]); int CPXgetdblparam(CPXENV *env, int whichparam, double *value); int CPXgetdj(CPXENV *env, CPXLP *lp, double dj[], int begin, int end); char *CPXgeterrorstring(CPXENV *env, int errcode, char *buffer); int CPXgetijdiv(CPXENV *env, CPXLP *lp, int *idiv, int *jdiv); int CPXgetintparam(CPXENV *env, int whichparam, int *value); int CPXgetlb(CPXENV *env, CPXLP *lp, double lb[], int begin, int end); int CPXgetmethod(CPXENV *env, CPXLP *lp); int CPXgetnumcols(CPXENV *env, CPXLP *lp); int CPXgetnumnz(CPXENV *env, CPXLP *lp); int CPXgetnumrows(CPXENV *env, CPXLP *lp); int CPXgetobjval(CPXENV *env, CPXLP *lp, double *objval); int CPXgetpi(CPXENV *env, CPXLP *lp, double pi[], int begin, int end); int CPXgetsense(CPXENV *env, CPXLP *lp, char sense[], int begin, int end); int CPXgetslack(CPXENV *env, CPXLP *lp, double slack[], int begin, int end); int CPXgetstat(CPXENV *env, CPXLP *lp); int CPXgetub(CPXENV *env, CPXLP *lp, double ub[], int begin, int end); int CPXgetweight(CPXENV *env, CPXLP *lp, int rcnt, const int rmatbeg[], const int rmatind[], const double rmatval[], double weight[], int dpriind); int CPXgetx(CPXENV *env, CPXLP *lp, double x[], int begin, int end); int CPXinfodblparam(CPXENV *env, int whichparam, double *defvalue, double *minvalue, double *maxvalue); int CPXinfointparam(CPXENV *env, int whichparam, int *defvalue, int *minvalue, int *maxvalue); int CPXlpopt(CPXENV *env, CPXLP *lp); int CPXmdleave(const CPXENV *env, CPXLP *lp, const int goodlist[], int goodlen, double downratio[], double upratio[]); int CPXnewcols(CPXENV *env, CPXLP *lp, int ccnt, const double obj[], const double lb[], const double ub[], const char ctype[], char *colname[]); int CPXnewrows(CPXENV *env, CPXLP *lp, int rcnt, const double rhs[], const char sense[], const double rngval[], char *rowname[]); CPXENV *CPXopenCPLEX(int *status); int CPXpivotin(CPXENV *env, CPXLP *lp, const int rlist[], int rlen); int CPXpivotout(CPXENV *env, CPXLP *lp, const int clist[], int clen); int CPXprimopt(CPXENV *env, CPXLP *lp); int CPXsavwrite(CPXENV *env, CPXLP *lp, const char *filename); int CPXsetdblparam(CPXENV *env, int whichparam, double newvalue); int CPXsetintparam(CPXENV *env, int whichparam, int newvalue); int CPXsolninfo(CPXENV *env, CPXLP *lp, int *solnmethod, int *solntype, int *pfeasind, int *dfeasind); int CPXsolution(CPXENV *env, CPXLP *lp, int *lpstat, double *objval, double x[], double pi[], double slack[], double dj[]); int CPXstrongbranch(CPXENV *env, CPXLP *lp, const int goodlist[], int goodlen, double downpen[], double uppen[], int itlim); int CPXwriteprob(CPXENV *env, CPXLP *lp, const char *filename, const char *filetype); #ifdef __cplusplus } #endif #endif /* eof */ glpk-5.0/examples/cplex/README0000644000062000006210000000347613766346220015325 0ustar maomkpasswdThe program module in this subdirectory is a crude implementation of CPLEX-like interface to GLPK API. It consists of two files: cplex.c and cplex.h. NOTE that this module is NOT a clean room implementation of the CPLEX callable library. It only implements a CPLEX-like interface to the GLPK API routines, and its main purpose is to provide possibility to build and run applications which normally use the CPLEX callable library. This module approximately corresponds to CPLEX 9.0. Currently this module can be used as a linear programming solver for Concorde, the state-of-the-art computer code for solving the symmetric traveling salesman problem (TSP) developed by David Applegate, Robert Bixby, Vasek Chvatal, and William Cook. For details about Concorde see its web page at http://www.tsp.gatech.edu/concorde.html. To build Concorde along with GLPK you need to do the following: 1. Configure, build, and install GLPK. 2. Download the Concorde tarball co031219.tgz (version Dec 19, 2003), unpack and unarchive it. 3. Copy files cplex.h and cplex.c to subdirectory concorde/LP/. 4. Create file named lpglpk.c in subdirectory concorde/LP/. This file must contain the following two lines: #include "cplex.c" #include "lpcplex8.c" 5. Configure Concorde in usual way (./configure) and then build it with the following command: make CPPFLAGS=-I. LPSOLVER_INTERFACE=lpglpk.c LPSOLVER_LIB=-lglpk The Concorde executable can be found in subdirectory concorde/TSP/. Please note that currently this GLPK interface module does not support some important features (namely, CPXgetijdiv, CPXmdleave, CPXpivotin, CPXpivotout, and CPXstrongbranch), so large (more than 1000 nodes) TSP instances cannot be solved in a reasonable time, and some instances may cause abnormal termination of Concorde (if CPXgetijdiv is called). glpk-5.0/examples/cpp.mod0000644000062000006210000000313613766346220014606 0ustar maomkpasswd/* CPP, Critical Path Problem */ /* Written in GNU MathProg by Andrew Makhorin */ /* Note: Reduced costs of auxiliary variables phi[j,k] (see below) can be only zero or one. The critical path is defined by the constraints, whose reduced cost is one. */ set J; /* set of jobs (activities) */ set P{j in J}, in J, default {}; /* P[j] is a subset of jobs that immediately precede job j */ param t{j in J}, >= 0; /* duration required to perform job j */ var x{j in J}, >= 0; /* starting time of job j */ s.t. phi{j in J, k in P[j]}: x[j] >= x[k] + t[k]; /* job j can start only after all immediately preceding jobs have been completely performed */ var z; /* project makespan */ s.t. fin{j in J}: z >= x[j] + t[j]; /* which is the maximum of the completion times of all the jobs */ minimize obj: z; /* the objective is make z as small as possible */ data; /* The optimal solution is 46 */ param : J : t := A 3 /* Excavate */ B 4 /* Lay foundation */ C 3 /* Rough plumbing */ D 10 /* Frame */ E 8 /* Finish exterior */ F 4 /* Install HVAC */ G 6 /* Rough electric */ H 8 /* Sheet rock */ I 5 /* Install cabinets */ J 5 /* Paint */ K 4 /* Final plumbing */ L 2 /* Final electric */ M 4 /* Install flooring */ ; set P[B] := A; set P[C] := B; set P[D] := B; set P[E] := D; set P[F] := D; set P[G] := D; set P[H] := C E F G; set P[I] := H; set P[J] := H; set P[K] := I; set P[L] := J; set P[M] := K L; end; glpk-5.0/examples/crypto.mod0000644000062000006210000000470113766346220015343 0ustar maomkpasswd/* CRYPTO, a crypto-arithmetic puzzle */ /* Written in GNU MathProg by Andrew Makhorin */ /* This problem comes from the newsgroup rec.puzzle. The numbers from 1 to 26 are assigned to the letters of the alphabet. The numbers beside each word are the total of the values assigned to the letters in the word (e.g. for LYRE: L, Y, R, E might be to equal 5, 9, 20 and 13, or any other combination that add up to 47). Find the value of each letter under the equations: BALLET 45 GLEE 66 POLKA 59 SONG 61 CELLO 43 JAZZ 58 QUARTET 50 SOPRANO 82 CONCERT 74 LYRE 47 SAXOPHONE 134 THEME 72 FLUTE 30 OBOE 53 SCALE 51 VIOLIN 100 FUGUE 50 OPERA 65 SOLO 37 WALTZ 34 Solution: 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 5,13,9,16,20,4,24,21,25,17,23,2,8,12,10,19,7,11,15,3,1,26,6,22,14,18 Reference: Koalog Constraint Solver , Simple problems, the crypto-arithmetic puzzle ALPHACIPHER. */ set LETTERS := { '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' }; /* set of letters */ set VALUES := 1..card(LETTERS); /* set of values assigned to the letters */ set WORDS; /* set of words */ param total{word in WORDS}; /* total[word] is the total of the values assigned to the letters in the word */ var x{i in LETTERS, j in VALUES}, binary; /* x[i,j] = 1 means that letter i is assigned value j */ s.t. phi{i in LETTERS}: sum{j in VALUES} x[i,j] = 1; s.t. psi{j in VALUES}: sum{i in LETTERS} x[i,j] = 1; s.t. eqn{word in WORDS}: sum{k in 1..length(word), j in VALUES} j * x[substr(word,k,1), j] = total[word]; solve; printf{i in LETTERS} " %s", i; printf "\n"; printf{i in LETTERS} " %2d", sum{j in VALUES} j * x[i,j]; printf "\n"; data; param : WORDS : total := BALLET 45 CELLO 43 CONCERT 74 FLUTE 30 FUGUE 50 GLEE 66 JAZZ 58 LYRE 47 OBOE 53 OPERA 65 POLKA 59 QUARTET 50 SAXOPHONE 134 SCALE 51 SOLO 37 SONG 61 SOPRANO 82 THEME 72 VIOLIN 100 WALTZ 34 ; end; glpk-5.0/examples/csv/0000755000062000006210000000000013766346220014113 5ustar maomkpasswdglpk-5.0/examples/csv/distances.csv0000644000062000006210000000025413766346220016606 0ustar maomkpasswdplant,market,distance "Seattle","New York",2.5 "Seattle","Chicago",1.7 "Seattle","Topeka",1.8 "San Diego","New York",2.5 "San Diego","Chicago",1.8 "San Diego","Topeka",1.4 glpk-5.0/examples/csv/markets.csv0000644000062000006210000000007313766346220016276 0ustar maomkpasswdmarket,demand "New York",325. "Chicago",300. "Topeka",275. glpk-5.0/examples/csv/parameters.csv0000644000062000006210000000004513766346220016772 0ustar maomkpasswdparameter,value "transport cost",90. glpk-5.0/examples/csv/plants.csv0000644000062000006210000000005713766346220016133 0ustar maomkpasswdplant,capacity "Seattle",350. "San Diego",600. glpk-5.0/examples/csv/transp_csv.mod0000644000062000006210000000307513766346220017003 0ustar maomkpasswd# A TRANSPORTATION PROBLEM # # This problem finds a least cost shipping schedule that meets # requirements at markets and supplies at factories. # # References: # Dantzig G B, "Linear Programming and Extensions." # Princeton University Press, Princeton, New Jersey, 1963, # Chapter 3-3. set I; /* canning plants */ set J; /* markets */ set K dimen 2; /* transportation lane */ set L; /* parameters */ param a{i in I}; /* capacity of plant i in cases */ param b{j in J}; /* demand at market j in cases */ param d{i in I, j in J}; /* distance in thousands of miles */ param e{l in L}; /* parameters */ param f; /* freight in dollars per case per thousand miles */ table tab_plant IN "CSV" "plants.csv" : I <- [plant], a ~ capacity; table tab_market IN "CSV" "markets.csv" : J <- [market], b ~ demand; table tab_distance IN "CSV" "distances.csv" : K <- [plant, market], d ~ distance; table tab_parameter IN "CSV" "parameters.csv" : L <- [parameter], e ~ value ; param c{i in I, j in J} := e['transport cost'] * d[i,j] / 1000; /* transport cost in thousands of dollars per case */ var x{(i,j) in K} >= 0; /* shipment quantities in cases */ minimize cost: sum{(i,j) in K} c[i,j] * x[i,j]; /* total transportation costs in thousands of dollars */ s.t. supply{i in I}: sum{(i,j) in K} x[i,j] <= a[i]; /* observe supply limit at plant i */ s.t. demand{j in J}: sum{(i,j) in K} x[i,j] >= b[j]; /* satisfy demand at market j */ solve; table tab_result{(i,j) in K} OUT "CSV" "result.csv" : i ~ plant, j ~ market, x[i,j] ~ shipment; end; glpk-5.0/examples/dbf/0000755000062000006210000000000013766346220014053 5ustar maomkpasswdglpk-5.0/examples/dbf/cultural_pres.dbf0000666000062000006210000000014013766346220017413 0ustar maomkpasswdm A CUL_PRESN 1 2 9glpk-5.0/examples/dbf/ForestMgt_Model_I_GIS_dbf.mod0000644000062000006210000001645713766346220021410 0ustar maomkpasswd# Model I Forest Estate Modelling using GLPK/MathProg # Reading and writing dbf files # by Noli Sicad --- nsicad@gmail.com # 18 December 2009 # Forest Management 4th Edition # by Lawrence Davis, K. Norman Johnson, Pete Bettinger, Theodore Howard # Chapter 11 - Daniel Pickett # http://warnell.forestry.uga.edu/Warnell/Bettinger/mgtbook/index.htm # Model I Formulation /* Note: This is not the full LP model mentioned in the book. Some of the constraints are deliberately omitted in this model for the purpose of clarity. The features of MathProg in this example are: * reading and writing dbf from regular dbf files, * reading dbf file (database of shapefile (stands.shp)) (e.g. area parameter), * using the area data in the constraints and * writing dbf file from result of LP model. Model I - Harvest Scheduling formulation for Sustainable Forest Management (SFM) Features are: * Net Present Value for the objective function (Revenue - Cost) * Harvest Constraints by period - Sustainable Yield per Period * Even-Flow Constraint / Volume - Harvest Flow Constraint - Alpha (1-Apha) * Even-Flow Constraint / Volume - Harvest Flow Constraint - Beta (1 +Beta) * Forest / Land Constraint -- Total Area of the forest * Forest Stand Constraint -- Individual stands What is next? -- Forest Mgt Carbon Accounting for Climate Change Note: The model file that the data containing in the dbf files is public domain material (so it is compatible with the GNU GPL) and data can be found in http://warnell.forestry.uga.edu/Warnell/Bettinger/mgtbook/index.htm # Noli Sicad --- nsicad@gmail.com */ set G_STAND_TYPE; # A, B, C set I_CULTURAL_PRES; set J_MGT_YEAR; param K_PERIOD; param Forest_Cost{G_STAND_TYPE,I_CULTURAL_PRES, J_MGT_YEAR}; # cost param Yield_Table_Vol{G_STAND_TYPE, I_CULTURAL_PRES, J_MGT_YEAR, 1..K_PERIOD} >= 0; param Alpha >= 0; param Beta >= 0; param TCost_Table{G_STAND_TYPE, I_CULTURAL_PRES, J_MGT_YEAR, 1..K_PERIOD} >= 0; param NetRev_Table{G_STAND_TYPE, I_CULTURAL_PRES, J_MGT_YEAR, 1..K_PERIOD}; var XForestLand{g in G_STAND_TYPE, i in I_CULTURAL_PRES, j in J_MGT_YEAR} >= 0; #reading dbf tables table tab IN "xBASE" "standtype.dbf": G_STAND_TYPE <- [STAND]; display G_STAND_TYPE; table tab2 IN "xBASE" "cultural_pres.dbf": I_CULTURAL_PRES <- [CUL_PRES]; display I_CULTURAL_PRES; table tab3 IN "xBASE" "mgt_year.dbf": J_MGT_YEAR <- [MGT_YEAR]; display J_MGT_YEAR; /* param Forest_Cost{G_STAND_TYPE,I_CULTURAL_PRES, J_MGT_YEAR} default 0; # cost */ set S1, dimen 3; table tab4 IN "xBASE" "Forest_Cost.dbf": S1 <- [STAND, CUL_PRES, MGT_YEAR],Forest_Cost ~FCOST; display Forest_Cost; set S2, dimen 4; table tab5 IN "xBASE" "Yield_Table_Vol.dbf": S2 <- [STAND, CUL_PRES, MGT_YEAR, PERIOD],Yield_Table_Vol ~YIELD; display Yield_Table_Vol; set S3, dimen 4; table tab5 IN "xBASE" "TCost_Table.dbf": S3 <- [STAND, CUL_PRES, MGT_YEAR, PERIOD],TCost_Table ~TCOST; display TCost_Table; set S4, dimen 4; table tab5 IN "xBASE" "NetRev_Table.dbf": S4 <- [STAND, CUL_PRES, MGT_YEAR, PERIOD],NetRev_Table ~NETREV; display NetRev_Table; param MGT; param Area_Stand_Indi{g in G_STAND_TYPE, m in 1..MGT} default 0; set ST, dimen 2; table tab5 IN "xBASE" "stands.dbf": ST <- [VEG_TYPE, MGT], Area_Stand_Indi ~ACRES; display Area_Stand_Indi; param Area_Stand_Type{g in G_STAND_TYPE}:= sum {m in 1..MGT } Area_Stand_Indi[g,m]; display Area_Stand_Type; param Total_Area := sum {g in G_STAND_TYPE, m in 1..MGT } Area_Stand_Indi[g,m]; display Total_Area; param Harvest_Min_Vol_Period; var NetPresentValue; # Objective function maximize Net_Present_Value: NetPresentValue; subject to NPV: NetPresentValue = sum {g in G_STAND_TYPE, i in I_CULTURAL_PRES, j in J_MGT_YEAR} Forest_Cost[g,i,j] * XForestLand[g,i,j]; # Harvest Constraint by Period subject to Harvest_Period_H {k in 1..K_PERIOD}: sum {g in G_STAND_TYPE, i in I_CULTURAL_PRES, j in J_MGT_YEAR} Yield_Table_Vol[g,i,j,k] * XForestLand[g,i,j] >= Harvest_Min_Vol_Period; #Even-Flow Constraint / Volume - Harvest Flow Constraint - Alpha subject to Even_Flow_Constaints_Alpha {k in 6..K_PERIOD-1}: (1 - Alpha) * sum {g in G_STAND_TYPE, i in I_CULTURAL_PRES, j in J_MGT_YEAR} Yield_Table_Vol[g,i,j,k] * XForestLand[g,i,j] - sum {g in G_STAND_TYPE,i in I_CULTURAL_PRES, j in J_MGT_YEAR} Yield_Table_Vol[g,i,j,k+1] * XForestLand[g,i,j] <= 0; # Even-Flow Constraint / Volume - Harvest Flow Constraint - Beta subject to Even_Flow_Constaints_Beta {k in 6..K_PERIOD-1}: (1 + Beta) * sum {g in G_STAND_TYPE, i in I_CULTURAL_PRES, j in J_MGT_YEAR} Yield_Table_Vol[g,i,j,k] * XForestLand[g,i,j] - sum {g in G_STAND_TYPE,i in I_CULTURAL_PRES, j in J_MGT_YEAR} Yield_Table_Vol[g,i,j,k+1] * XForestLand[g,i,j] >= 0; # Forest / Land Constraints subject to Total_Area_Constraint: sum {g in G_STAND_TYPE, i in I_CULTURAL_PRES, j in J_MGT_YEAR} XForestLand[g,i,j] <= Total_Area; display Total_Area; # Forest / Land Constraints for A B C subject to Area {g in G_STAND_TYPE}: sum {i in I_CULTURAL_PRES,j in J_MGT_YEAR} XForestLand[g,i,j] = Area_Stand_Type[g]; solve; #RESULT SECTION printf '#################################\n'; printf 'Forest Management Model I - Noli Sicad\n'; printf '\n'; printf 'Net Present Value = %.2f\n', NetPresentValue; printf '\n'; printf '\n'; printf 'Variables\n'; printf 'Stand_Type Age_Class Mgt_Presc Sign Value \n'; printf{g in G_STAND_TYPE, i in I_CULTURAL_PRES, j in J_MGT_YEAR}:'%5s %10s %11s = %10.2f\n', g,i,j, XForestLand[g,i,j]; printf '\n'; printf 'Constraints\n'; printf 'Period Harvest Sign \n'; for {k in 1..K_PERIOD} { printf '%5s %10.2f >= %.3f\n', k, sum {g in G_STAND_TYPE, i in I_CULTURAL_PRES, j in J_MGT_YEAR} Yield_Table_Vol[g,i,j,k] * XForestLand[g,i,j], Harvest_Min_Vol_Period; } # xbase (dbf) output table Harvest{k in 1..K_PERIOD} OUT "xBASE" "HarvestArea1.dbf" "N(5)N(15,2)" : k ~ Period, (sum {g in G_STAND_TYPE, i in I_CULTURAL_PRES, j in J_MGT_YEAR} Yield_Table_Vol[g,i,j,k] * XForestLand[g,i,j]) ~ H_Area; # xbase (dbf) read set S, dimen 2; table tab2 IN "xBASE" "HarvestArea1.dbf": S <- [Period, H_Area]; display S; printf '\n'; printf 'Constraint\n'; printf 'Harvest Period\n'; printf 'Type AgeClass PrescMgt Period Value\n'; printf{g in G_STAND_TYPE, i in I_CULTURAL_PRES, j in J_MGT_YEAR, k in 1..K_PERIOD}:'%5s %11s %11s %5s %10.2f\n', g,i,j, k, (Yield_Table_Vol[g,i,j,k] * XForestLand[g,i,j]); printf 'Even_Flow_Constaint_Alpha (1-Alpha)\n'; printf 'Period Sign \n'; for {k in 6..K_PERIOD-1} { printf "%s %10.2f <= %s\n", k, ((1 - Alpha) * sum {g in G_STAND_TYPE, i in I_CULTURAL_PRES, j in J_MGT_YEAR} Yield_Table_Vol[g,i,j,k] * XForestLand[g,i,j] - sum {g in G_STAND_TYPE,i in I_CULTURAL_PRES, j in J_MGT_YEAR} Yield_Table_Vol[g,i,j,k+1] * XForestLand[g,i,j]),0; } printf '\n'; # Forest / Land Constraints printf '\n'; printf 'Total Area Constraint\n'; printf 'Type AgeClass PrescMgt Value Sign Total_Area \n'; printf '%5s <= %.3f\n',sum {g in G_STAND_TYPE, i in I_CULTURAL_PRES, j in J_MGT_YEAR} XForestLand[g,i,j], Total_Area; printf 'Area\n'; printf 'Area Value Sign Areas_Stand\n'; for {g in G_STAND_TYPE} { printf '%5s %10.2f <= %.3f\n', g, sum {i in I_CULTURAL_PRES,j in J_MGT_YEAR} XForestLand[g,i,j], Area_Stand_Type[g]; } #DATA SECTION data; # Most of the data has been moved to dbf format param MGT:=31; param K_PERIOD:= 7; param Alpha:= 0.20; param Beta:= 0.20; param Harvest_Min_Vol_Period:= 12000; end; glpk-5.0/examples/dbf/Forest_Cost.dbf0000666000062000006210000000266213766346220016774 0ustar maomkpasswdF$¡$STANDCCUL_PRESNMGT_YEARC FCOSTN A 1mgt_p1 9491.00 A 1mgt_p2 6508.00 A 1mgt_p3 4552.00 A 1mgt_p4 3160.00 A 2mgt_p1 9317.00 A 2mgt_p2 6549.00 A 2mgt_p3 4570.00 A 2mgt_p4 2965.00 A 9mgt_p1 -71.00 A 9mgt_p2 0.00 A 9mgt_p3 0.00 A 9mgt_p4 0.00 B 1mgt_p1 844.00 B 1mgt_p2 477.00 B 1mgt_p3 288.00 B 1mgt_p4 160.00 B 2mgt_p1 0.00 B 2mgt_p2 0.00 B 2mgt_p3 0.00 B 2mgt_p4 0.00 B 9mgt_p1 -47.00 B 9mgt_p2 0.00 B 9mgt_p3 0.00 B 9mgt_p4 0.00 C 1mgt_p1 720.00 C 1mgt_p2 755.00 C 1mgt_p3 682.00 C 1mgt_p4 525.00 C 2mgt_p1 0.00 C 2mgt_p2 0.00 C 2mgt_p3 0.00 C 2mgt_p4 0.00 C 9mgt_p1 -47.00 C 9mgt_p2 0.00 C 9mgt_p3 0.00 C 9mgt_p4 0.00glpk-5.0/examples/dbf/mgt_year.dbf0000666000062000006210000000015213766346220016341 0ustar maomkpasswdm A MGT_YEARC mgt_p1 mgt_p2 mgt_p3 mgt_p4 glpk-5.0/examples/dbf/NetRev_Table.dbf0000666000062000006210000002701213766346220017050 0ustar maomkpasswdFüÁ.STANDCCUL_PRESNMGT_YEARC PERIODN NETREVN A 1mgt_p1 1 9970.00 A 1mgt_p1 2 -30.00 A 1mgt_p1 3 -30.00 A 1mgt_p1 4 4020.00 A 1mgt_p1 5 -30.00 A 1mgt_p1 6 -30.00 A 1mgt_p1 7 4020.00 A 1mgt_p2 1 -30.00 A 1mgt_p2 2 10570.00 A 1mgt_p2 3 -30.00 A 1mgt_p2 4 -30.00 A 1mgt_p2 5 4080.00 A 1mgt_p2 6 -30.00 A 1mgt_p2 7 -30.00 A 1mgt_p3 1 -30.00 A 1mgt_p3 2 -30.00 A 1mgt_p3 3 11020.00 A 1mgt_p3 4 -30.00 A 1mgt_p3 5 -30.00 A 1mgt_p3 6 4020.00 A 1mgt_p3 7 -30.00 A 1mgt_p4 1 -30.00 A 1mgt_p4 2 -30.00 A 1mgt_p4 3 -30.00 A 1mgt_p4 4 11470.00 A 1mgt_p4 5 -30.00 A 1mgt_p4 6 -30.00 A 1mgt_p4 7 4020.00 A 2mgt_p1 1 9970.00 A 2mgt_p1 2 -30.00 A 2mgt_p1 3 -30.00 A 2mgt_p1 4 4020.00 A 2mgt_p1 5 -30.00 A 2mgt_p1 6 -30.00 A 2mgt_p1 7 4020.00 A 2mgt_p2 1 -30.00 A 2mgt_p2 2 10570.00 A 2mgt_p2 3 -30.00 A 2mgt_p2 4 -30.00 A 2mgt_p2 5 4080.00 A 2mgt_p2 6 -30.00 A 2mgt_p2 7 -30.00 A 2mgt_p3 1 -30.00 A 2mgt_p3 2 -30.00 A 2mgt_p3 3 11020.00 A 2mgt_p3 4 -30.00 A 2mgt_p3 5 -30.00 A 2mgt_p3 6 4020.00 A 2mgt_p3 7 -30.00 A 2mgt_p4 1 -30.00 A 2mgt_p4 2 -30.00 A 2mgt_p4 3 -30.00 A 2mgt_p4 4 11470.00 A 2mgt_p4 5 -30.00 A 2mgt_p4 6 -30.00 A 2mgt_p4 7 4020.00 A 9mgt_p1 1 -30.00 A 9mgt_p1 2 -30.00 A 9mgt_p1 3 -30.00 A 9mgt_p1 4 -30.00 A 9mgt_p1 5 -30.00 A 9mgt_p1 6 -30.00 A 9mgt_p1 7 -30.00 A 9mgt_p2 1 0.00 A 9mgt_p2 2 0.00 A 9mgt_p2 3 0.00 A 9mgt_p2 4 0.00 A 9mgt_p2 5 0.00 A 9mgt_p2 6 0.00 A 9mgt_p2 7 0.00 A 9mgt_p3 1 0.00 A 9mgt_p3 2 0.00 A 9mgt_p3 3 0.00 A 9mgt_p3 4 0.00 A 9mgt_p3 5 0.00 A 9mgt_p3 6 0.00 A 9mgt_p3 7 0.00 A 9mgt_p4 1 0.00 A 9mgt_p4 2 0.00 A 9mgt_p4 3 0.00 A 9mgt_p4 4 0.00 A 9mgt_p4 5 0.00 A 9mgt_p4 6 0.00 A 9mgt_p4 7 0.00 B 1mgt_p1 1 580.00 B 1mgt_p1 2 -20.00 B 1mgt_p1 3 -20.00 B 1mgt_p1 4 1820.00 B 1mgt_p1 5 -20.00 B 1mgt_p1 6 -20.00 B 1mgt_p1 7 1820.00 B 1mgt_p2 1 -20.00 B 1mgt_p2 2 555.00 B 1mgt_p2 3 -20.00 B 1mgt_p2 4 -20.00 B 1mgt_p2 5 1180.00 B 1mgt_p2 6 -20.00 B 1mgt_p2 7 -20.00 B 1mgt_p3 1 -20.00 B 1mgt_p3 2 -20.00 B 1mgt_p3 3 505.00 B 1mgt_p3 4 -20.00 B 1mgt_p3 5 -20.00 B 1mgt_p3 6 1180.00 B 1mgt_p3 7 -20.00 B 1mgt_p4 1 -20.00 B 1mgt_p4 2 -20.00 B 1mgt_p4 3 -20.00 B 1mgt_p4 4 -20.00 B 1mgt_p4 5 -20.00 B 1mgt_p4 6 -20.00 B 1mgt_p4 7 -20.00 B 2mgt_p1 1 0.00 B 2mgt_p1 2 0.00 B 2mgt_p1 3 0.00 B 2mgt_p1 4 0.00 B 2mgt_p1 5 0.00 B 2mgt_p1 6 0.00 B 2mgt_p1 7 0.00 B 2mgt_p2 1 0.00 B 2mgt_p2 2 0.00 B 2mgt_p2 3 0.00 B 2mgt_p2 4 0.00 B 2mgt_p2 5 0.00 B 2mgt_p2 6 0.00 B 2mgt_p2 7 0.00 B 2mgt_p3 1 0.00 B 2mgt_p3 2 0.00 B 2mgt_p3 3 0.00 B 2mgt_p3 4 0.00 B 2mgt_p3 5 0.00 B 2mgt_p3 6 0.00 B 2mgt_p3 7 0.00 B 2mgt_p4 1 0.00 B 2mgt_p4 2 0.00 B 2mgt_p4 3 0.00 B 2mgt_p4 4 0.00 B 2mgt_p4 5 0.00 B 2mgt_p4 6 0.00 B 2mgt_p4 7 0.00 B 9mgt_p1 1 -20.00 B 9mgt_p1 2 -20.00 B 9mgt_p1 3 -20.00 B 9mgt_p1 4 -20.00 B 9mgt_p1 5 -20.00 B 9mgt_p1 6 -20.00 B 9mgt_p1 7 -20.00 B 9mgt_p2 1 0.00 B 9mgt_p2 2 0.00 B 9mgt_p2 3 0.00 B 9mgt_p2 4 0.00 B 9mgt_p2 5 0.00 B 9mgt_p2 6 0.00 B 9mgt_p2 7 0.00 B 9mgt_p3 1 0.00 B 9mgt_p3 2 0.00 B 9mgt_p3 3 0.00 B 9mgt_p3 4 0.00 B 9mgt_p3 5 0.00 B 9mgt_p3 6 0.00 B 9mgt_p3 7 0.00 B 9mgt_p4 1 0.00 B 9mgt_p4 2 0.00 B 9mgt_p4 3 0.00 B 9mgt_p4 4 0.00 B 9mgt_p4 5 0.00 B 9mgt_p4 6 0.00 B 9mgt_p4 7 0.00 C 1mgt_p1 1 430.00 C 1mgt_p1 2 -20.00 C 1mgt_p1 3 -20.00 C 1mgt_p1 4 -20.00 C 1mgt_p1 5 1180.00 C 1mgt_p1 6 -20.00 C 1mgt_p1 7 1180.00 C 1mgt_p2 1 -20.00 C 1mgt_p2 2 1055.00 C 1mgt_p2 3 -20.00 C 1mgt_p2 4 -20.00 C 1mgt_p2 5 1180.00 C 1mgt_p2 6 20.00 C 1mgt_p2 7 20.00 C 1mgt_p3 1 -20.00 C 1mgt_p3 2 -20.00 C 1mgt_p3 3 2795.00 C 1mgt_p3 4 20.00 C 1mgt_p3 5 20.00 C 1mgt_p3 6 -20.00 C 1mgt_p3 7 -20.00 C 1mgt_p4 1 -20.00 C 1mgt_p4 2 -20.00 C 1mgt_p4 3 -20.00 C 1mgt_p4 4 1867.50 C 1mgt_p4 5 -20.00 C 1mgt_p4 6 -20.00 C 1mgt_p4 7 -20.00 C 2mgt_p1 1 0.00 C 2mgt_p1 2 0.00 C 2mgt_p1 3 0.00 C 2mgt_p1 4 0.00 C 2mgt_p1 5 0.00 C 2mgt_p1 6 0.00 C 2mgt_p1 7 0.00 C 2mgt_p2 1 0.00 C 2mgt_p2 2 0.00 C 2mgt_p2 3 0.00 C 2mgt_p2 4 0.00 C 2mgt_p2 5 0.00 C 2mgt_p2 6 0.00 C 2mgt_p2 7 0.00 C 2mgt_p3 1 0.00 C 2mgt_p3 2 0.00 C 2mgt_p3 3 0.00 C 2mgt_p3 4 0.00 C 2mgt_p3 5 0.00 C 2mgt_p3 6 0.00 C 2mgt_p3 7 0.00 C 2mgt_p4 1 0.00 C 2mgt_p4 2 0.00 C 2mgt_p4 3 0.00 C 2mgt_p4 4 0.00 C 2mgt_p4 5 0.00 C 2mgt_p4 6 0.00 C 2mgt_p4 7 0.00 C 9mgt_p1 1 -20.00 C 9mgt_p1 2 -20.00 C 9mgt_p1 3 -20.00 C 9mgt_p1 4 -20.00 C 9mgt_p1 5 -20.00 C 9mgt_p1 6 -20.00 C 9mgt_p1 7 -20.00 C 9mgt_p2 1 0.00 C 9mgt_p2 2 0.00 C 9mgt_p2 3 0.00 C 9mgt_p2 4 0.00 C 9mgt_p2 5 0.00 C 9mgt_p2 6 0.00 C 9mgt_p2 7 0.00 C 9mgt_p3 1 0.00 C 9mgt_p3 2 0.00 C 9mgt_p3 3 0.00 C 9mgt_p3 4 0.00 C 9mgt_p3 5 0.00 C 9mgt_p3 6 0.00 C 9mgt_p3 7 0.00 C 9mgt_p4 1 0.00 C 9mgt_p4 2 0.00 C 9mgt_p4 3 0.00 C 9mgt_p4 4 0.00 C 9mgt_p4 5 0.00 C 9mgt_p4 6 0.00 C 9mgt_p4 7 0.00glpk-5.0/examples/dbf/README0000644000062000006210000000015013766346220014727 0ustar maomkpasswdThis subdirectory contains an example MathProg model that demonstrates using data tables in DBF format. glpk-5.0/examples/dbf/stands.dbf0000666000062000006210000001034313766346220016031 0ustar maomkpasswdm AREAN PERIMETERN ACRESN VEG_TYPECCUL_PRESNMGT_YEARCBASAL_AREANAGENMBFNSTANDNMGTN 678347.313 3278.950 16.573A 1mgt_p1 270 75 42.1 8 1 1559350.500 9008.162 35.797A 1mgt_p2 220 55 25.7 6 2 2522098.500 7146.726 57.899A 1mgt_p3 200 50 21.2 1 3 2803427.500 7314.187 64.359A 1mgt_p4 250 65 34.2 4 4 2957964.250 7227.796 67.905A 2mgt_p1 230 60 29.6 14 5 3421375.000 9894.098 78.545A 2mgt_p2 290 90 52.0 12 6 5355937.500 11886.879 122.956A 2mgt_p3 200 50 21.1 28 7 5427447.000 12005.038 124.597A 2mgt_p4 220 55 24.9 13 8 5728451.500 14774.963 131.509A 2 240 65 34.0 19 9 6334165.000 11302.623 145.413A 9mgt_p1 260 70 37.7 24 10 6761519.000 16103.322 155.223A 1 210 55 25.8 3 11 947048.438 3668.863 21.742B 1mgt_p3 10 0 0.1 20 12 983290.750 4240.553 22.573B 1mgt_p4 10 5 0.8 15 13 1417177.250 4942.817 32.535B 1 10 0 0.6 11 14 1750618.250 6395.410 40.189B 1 10 5 0.2 23 15 2005855.000 7811.168 46.048B 1 20 10 1.4 18 16 2277913.250 6446.242 52.294B 1 20 10 1.8 29 17 2558007.500 8362.660 58.724B 1 10 0 0.4 21 18 3039506.500 7666.134 69.777B 1 10 5 0.1 27 19 3194198.250 10899.984 73.329B 1 20 10 1.2 22 20 3601950.500 8392.660 82.688B 9 20 10 1.3 9 21 1018033.125 4197.604 23.369C 1 210 50 21.2 10 22 1020423.875 5466.770 23.425C 1mgt_p1 160 35 9.0 26 23 1893590.750 6982.825 43.471C 1mgt_p2 110 25 4.1 31 24 1897039.375 9009.795 43.549C 1mgt_p3 190 45 17.3 30 25 3144825.500 7770.218 72.196C 1mgt_p4 150 35 8.7 7 26 3150030.000 8650.215 72.314C 1 140 35 8.9 17 27 4222868.000 11840.629 96.942C 1 170 40 13.0 25 28 7130442.000 14321.127 163.692C 1 90 20 3.1 5 29 9389994.000 18714.068 215.566C 1 175 40 12.9 2 30 10706765.000 16504.322 245.795C 9mgt_p2 120 30 5.6 16 31glpk-5.0/examples/dbf/standtype.dbf0000666000062000006210000000014013766346220016542 0ustar maomkpasswdm A STANDC A B C glpk-5.0/examples/dbf/TCost_Table.dbf0000666000062000006210000002701213766346220016701 0ustar maomkpasswdFüÁ.STANDCCUL_PRESNMGT_YEARC PERIODN TCOSTN A 1mgt_p1 1 4030.00 A 1mgt_p1 2 30.00 A 1mgt_p1 3 30.00 A 1mgt_p1 4 2480.00 A 1mgt_p1 5 30.00 A 1mgt_p1 6 30.00 A 1mgt_p1 7 2480.00 A 1mgt_p2 1 30.00 A 1mgt_p2 2 4230.00 A 1mgt_p2 3 30.00 A 1mgt_p2 4 30.00 A 1mgt_p2 5 2480.00 A 1mgt_p2 6 30.00 A 1mgt_p2 7 30.00 A 1mgt_p3 1 30.00 A 1mgt_p3 2 30.00 A 1mgt_p3 3 4380.00 A 1mgt_p3 4 30.00 A 1mgt_p3 5 30.00 A 1mgt_p3 6 2480.00 A 1mgt_p3 7 30.00 A 1mgt_p4 1 30.00 A 1mgt_p4 2 30.00 A 1mgt_p4 3 30.00 A 1mgt_p4 4 4530.00 A 1mgt_p4 5 30.00 A 1mgt_p4 6 30.00 A 1mgt_p4 7 2480.00 A 2mgt_p1 1 4030.00 A 2mgt_p1 2 30.00 A 2mgt_p1 3 480.00 A 2mgt_p1 4 30.00 A 2mgt_p1 5 2480.00 A 2mgt_p1 6 2480.00 A 2mgt_p1 7 480.00 A 2mgt_p2 1 30.00 A 2mgt_p2 2 4230.00 A 2mgt_p2 3 30.00 A 2mgt_p2 4 480.00 A 2mgt_p2 5 30.00 A 2mgt_p2 6 30.00 A 2mgt_p2 7 30.00 A 2mgt_p3 1 30.00 A 2mgt_p3 2 30.00 A 2mgt_p3 3 4380.00 A 2mgt_p3 4 30.00 A 2mgt_p3 5 480.00 A 2mgt_p3 6 30.00 A 2mgt_p3 7 2480.00 A 2mgt_p4 1 30.00 A 2mgt_p4 2 30.00 A 2mgt_p4 3 30.00 A 2mgt_p4 4 4530.00 A 2mgt_p4 5 30.00 A 2mgt_p4 6 480.00 A 2mgt_p4 7 30.00 A 9mgt_p1 1 30.00 A 9mgt_p1 2 30.00 A 9mgt_p1 3 30.00 A 9mgt_p1 4 30.00 A 9mgt_p1 5 30.00 A 9mgt_p1 6 30.00 A 9mgt_p1 7 30.00 A 9mgt_p2 1 0.00 A 9mgt_p2 2 0.00 A 9mgt_p2 3 0.00 A 9mgt_p2 4 0.00 A 9mgt_p2 5 0.00 A 9mgt_p2 6 0.00 A 9mgt_p2 7 0.00 A 9mgt_p3 1 0.00 A 9mgt_p3 2 0.00 A 9mgt_p3 3 0.00 A 9mgt_p3 4 0.00 A 9mgt_p3 5 0.00 A 9mgt_p3 6 0.00 A 9mgt_p3 7 0.00 A 9mgt_p4 1 0.00 A 9mgt_p4 2 0.00 A 9mgt_p4 3 0.00 A 9mgt_p4 4 0.00 A 9mgt_p4 5 0.00 A 9mgt_p4 6 0.00 A 9mgt_p4 7 0.00 B 1mgt_p1 1 3080.00 B 1mgt_p1 2 20.00 B 1mgt_p1 3 20.00 B 1mgt_p1 4 1820.00 B 1mgt_p1 5 20.00 B 1mgt_p1 6 20.00 B 1mgt_p1 7 1820.00 B 1mgt_p2 1 20.00 B 1mgt_p2 2 2945.00 B 1mgt_p2 3 20.00 B 1mgt_p2 4 20.00 B 1mgt_p2 5 1820.00 B 1mgt_p2 6 20.00 B 1mgt_p2 7 20.00 B 1mgt_p3 1 20.00 B 1mgt_p3 2 20.00 B 1mgt_p3 3 2795.00 B 1mgt_p3 4 20.00 B 1mgt_p3 5 20.00 B 1mgt_p3 6 1820.00 B 1mgt_p3 7 20.00 B 1mgt_p4 1 20.00 B 1mgt_p4 2 20.00 B 1mgt_p4 3 20.00 B 1mgt_p4 4 2570.00 B 1mgt_p4 5 20.00 B 1mgt_p4 6 20.00 B 1mgt_p4 7 1820.00 B 2mgt_p1 1 0.00 B 2mgt_p1 2 0.00 B 2mgt_p1 3 0.00 B 2mgt_p1 4 0.00 B 2mgt_p1 5 0.00 B 2mgt_p1 6 0.00 B 2mgt_p1 7 0.00 B 2mgt_p2 1 0.00 B 2mgt_p2 2 0.00 B 2mgt_p2 3 0.00 B 2mgt_p2 4 0.00 B 2mgt_p2 5 0.00 B 2mgt_p2 6 0.00 B 2mgt_p2 7 0.00 B 2mgt_p3 1 0.00 B 2mgt_p3 2 0.00 B 2mgt_p3 3 0.00 B 2mgt_p3 4 0.00 B 2mgt_p3 5 0.00 B 2mgt_p3 6 0.00 B 2mgt_p3 7 0.00 B 2mgt_p4 1 0.00 B 2mgt_p4 2 0.00 B 2mgt_p4 3 0.00 B 2mgt_p4 4 0.00 B 2mgt_p4 5 0.00 B 2mgt_p4 6 0.00 B 2mgt_p4 7 0.00 B 9mgt_p1 1 20.00 B 9mgt_p1 2 20.00 B 9mgt_p1 3 20.00 B 9mgt_p1 4 20.00 B 9mgt_p1 5 20.00 B 9mgt_p1 6 20.00 B 9mgt_p1 7 20.00 B 9mgt_p2 1 0.00 B 9mgt_p2 2 0.00 B 9mgt_p2 3 0.00 B 9mgt_p2 4 0.00 B 9mgt_p2 5 0.00 B 9mgt_p2 6 0.00 B 9mgt_p2 7 0.00 B 9mgt_p3 1 0.00 B 9mgt_p3 2 0.00 B 9mgt_p3 3 0.00 B 9mgt_p3 4 0.00 B 9mgt_p3 5 0.00 B 9mgt_p3 6 0.00 B 9mgt_p3 7 0.00 B 9mgt_p4 1 0.00 B 9mgt_p4 2 0.00 B 9mgt_p4 3 0.00 B 9mgt_p4 4 0.00 B 9mgt_p4 5 0.00 B 9mgt_p4 6 0.00 B 9mgt_p4 7 0.00 C 1mgt_p1 1 1070.00 C 1mgt_p1 2 20.00 C 1mgt_p1 3 20.00 C 1mgt_p1 4 1820.00 C 1mgt_p1 5 20.00 C 1mgt_p1 6 20.00 C 1mgt_p1 7 1820.00 C 1mgt_p2 1 20.00 C 1mgt_p2 2 2945.00 C 1mgt_p2 3 20.00 C 1mgt_p2 4 20.00 C 1mgt_p2 5 1820.00 C 1mgt_p2 6 20.00 C 1mgt_p2 7 20.00 C 1mgt_p3 1 20.00 C 1mgt_p3 2 20.00 C 1mgt_p3 3 2795.00 C 1mgt_p3 4 20.00 C 1mgt_p3 5 20.00 C 1mgt_p3 6 1820.00 C 1mgt_p3 7 20.00 C 1mgt_p4 1 20.00 C 1mgt_p4 2 20.00 C 1mgt_p4 3 20.00 C 1mgt_p4 4 2570.00 C 1mgt_p4 5 20.00 C 1mgt_p4 6 20.00 C 1mgt_p4 7 1820.00 C 2mgt_p1 1 0.00 C 2mgt_p1 2 0.00 C 2mgt_p1 3 0.00 C 2mgt_p1 4 0.00 C 2mgt_p1 5 0.00 C 2mgt_p1 6 0.00 C 2mgt_p1 7 0.00 C 2mgt_p2 1 0.00 C 2mgt_p2 2 0.00 C 2mgt_p2 3 0.00 C 2mgt_p2 4 0.00 C 2mgt_p2 5 0.00 C 2mgt_p2 6 0.00 C 2mgt_p2 7 0.00 C 2mgt_p3 1 0.00 C 2mgt_p3 2 0.00 C 2mgt_p3 3 0.00 C 2mgt_p3 4 0.00 C 2mgt_p3 5 0.00 C 2mgt_p3 6 0.00 C 2mgt_p3 7 0.00 C 2mgt_p4 1 0.00 C 2mgt_p4 2 0.00 C 2mgt_p4 3 0.00 C 2mgt_p4 4 0.00 C 2mgt_p4 5 0.00 C 2mgt_p4 6 0.00 C 2mgt_p4 7 0.00 C 9mgt_p1 1 20.00 C 9mgt_p1 2 20.00 C 9mgt_p1 3 20.00 C 9mgt_p1 4 20.00 C 9mgt_p1 5 20.00 C 9mgt_p1 6 20.00 C 9mgt_p1 7 20.00 C 9mgt_p2 1 0.00 C 9mgt_p2 2 0.00 C 9mgt_p2 3 0.00 C 9mgt_p2 4 0.00 C 9mgt_p2 5 0.00 C 9mgt_p2 6 0.00 C 9mgt_p2 7 0.00 C 9mgt_p3 1 0.00 C 9mgt_p3 2 0.00 C 9mgt_p3 3 0.00 C 9mgt_p3 4 0.00 C 9mgt_p3 5 0.00 C 9mgt_p3 6 0.00 C 9mgt_p3 7 0.00 C 9mgt_p4 1 0.00 C 9mgt_p4 2 0.00 C 9mgt_p4 3 0.00 C 9mgt_p4 4 0.00 C 9mgt_p4 5 0.00 C 9mgt_p4 6 0.00 C 9mgt_p4 7 0.00glpk-5.0/examples/dbf/Yield_Table_Vol.dbf0000666000062000006210000002701213766346220017533 0ustar maomkpasswdFüÁ.STANDCCUL_PRESNMGT_YEARC PERIODN YIELDN A 1mgt_p1 1 35.00 A 1mgt_p1 2 0.00 A 1mgt_p1 3 0.00 A 1mgt_p1 4 26.00 A 1mgt_p1 5 0.00 A 1mgt_p1 6 0.00 A 1mgt_p1 7 26.00 A 1mgt_p2 1 0.00 A 1mgt_p2 2 37.00 A 1mgt_p2 3 0.00 A 1mgt_p2 4 0.00 A 1mgt_p2 5 26.00 A 1mgt_p2 6 0.00 A 1mgt_p2 7 0.00 A 1mgt_p3 1 0.00 A 1mgt_p3 2 0.00 A 1mgt_p3 3 38.50 A 1mgt_p3 4 0.00 A 1mgt_p3 5 0.00 A 1mgt_p3 6 26.00 A 1mgt_p3 7 0.00 A 1mgt_p4 1 0.00 A 1mgt_p4 2 0.00 A 1mgt_p4 3 0.00 A 1mgt_p4 4 40.00 A 1mgt_p4 5 0.00 A 1mgt_p4 6 0.00 A 1mgt_p4 7 26.00 A 2mgt_p1 1 35.00 A 2mgt_p1 2 0.00 A 2mgt_p1 3 6.00 A 2mgt_p1 4 0.00 A 2mgt_p1 5 26.00 A 2mgt_p1 6 0.00 A 2mgt_p1 7 6.00 A 2mgt_p2 1 0.00 A 2mgt_p2 2 37.00 A 2mgt_p2 3 0.00 A 2mgt_p2 4 6.00 A 2mgt_p2 5 0.00 A 2mgt_p2 6 26.00 A 2mgt_p2 7 0.00 A 2mgt_p3 1 0.00 A 2mgt_p3 2 0.00 A 2mgt_p3 3 38.50 A 2mgt_p3 4 0.00 A 2mgt_p3 5 6.00 A 2mgt_p3 6 0.00 A 2mgt_p3 7 26.00 A 2mgt_p4 1 0.00 A 2mgt_p4 2 0.00 A 2mgt_p4 3 0.00 A 2mgt_p4 4 40.00 A 2mgt_p4 5 0.00 A 2mgt_p4 6 6.00 A 2mgt_p4 7 0.00 A 9mgt_p1 1 0.00 A 9mgt_p1 2 0.00 A 9mgt_p1 3 0.00 A 9mgt_p1 4 0.00 A 9mgt_p1 5 0.00 A 9mgt_p1 6 0.00 A 9mgt_p1 7 0.00 A 9mgt_p2 1 0.00 A 9mgt_p2 2 0.00 A 9mgt_p2 3 0.00 A 9mgt_p2 4 0.00 A 9mgt_p2 5 0.00 A 9mgt_p2 6 0.00 A 9mgt_p2 7 0.00 A 9mgt_p3 1 0.00 A 9mgt_p3 2 0.00 A 9mgt_p3 3 0.00 A 9mgt_p3 4 0.00 A 9mgt_p3 5 0.00 A 9mgt_p3 6 0.00 A 9mgt_p3 7 0.00 A 9mgt_p4 1 0.00 A 9mgt_p4 2 0.00 A 9mgt_p4 3 0.00 A 9mgt_p4 4 0.00 A 9mgt_p4 5 0.00 A 9mgt_p4 6 0.00 A 9mgt_p4 7 0.00 B 1mgt_p1 1 18.00 B 1mgt_p1 2 0.00 B 1mgt_p1 3 0.00 B 1mgt_p1 4 12.00 B 1mgt_p1 5 0.00 B 1mgt_p1 6 0.00 B 1mgt_p1 7 12.00 B 1mgt_p2 1 0.00 B 1mgt_p2 2 17.50 B 1mgt_p2 3 0.00 B 1mgt_p2 4 0.00 B 1mgt_p2 5 12.00 B 1mgt_p2 6 0.00 B 1mgt_p2 7 0.00 B 1mgt_p3 1 0.00 B 1mgt_p3 2 0.00 B 1mgt_p3 3 16.50 B 1mgt_p3 4 0.00 B 1mgt_p3 5 0.00 B 1mgt_p3 6 12.00 B 1mgt_p3 7 0.00 B 1mgt_p4 1 0.00 B 1mgt_p4 2 0.00 B 1mgt_p4 3 0.00 B 1mgt_p4 4 15.00 B 1mgt_p4 5 0.00 B 1mgt_p4 6 0.00 B 1mgt_p4 7 12.00 B 2mgt_p1 1 0.00 B 2mgt_p1 2 0.00 B 2mgt_p1 3 0.00 B 2mgt_p1 4 0.00 B 2mgt_p1 5 0.00 B 2mgt_p1 6 0.00 B 2mgt_p1 7 0.00 B 2mgt_p2 1 0.00 B 2mgt_p2 2 0.00 B 2mgt_p2 3 0.00 B 2mgt_p2 4 0.00 B 2mgt_p2 5 0.00 B 2mgt_p2 6 0.00 B 2mgt_p2 7 0.00 B 2mgt_p3 1 0.00 B 2mgt_p3 2 0.00 B 2mgt_p3 3 0.00 B 2mgt_p3 4 0.00 B 2mgt_p3 5 0.00 B 2mgt_p3 6 0.00 B 2mgt_p3 7 0.00 B 2mgt_p4 1 0.00 B 2mgt_p4 2 0.00 B 2mgt_p4 3 0.00 B 2mgt_p4 4 0.00 B 2mgt_p4 5 0.00 B 2mgt_p4 6 0.00 B 2mgt_p4 7 0.00 B 9mgt_p1 1 0.00 B 9mgt_p1 2 0.00 B 9mgt_p1 3 0.00 B 9mgt_p1 4 0.00 B 9mgt_p1 5 0.00 B 9mgt_p1 6 0.00 B 9mgt_p1 7 0.00 B 9mgt_p2 1 0.00 B 9mgt_p2 2 0.00 B 9mgt_p2 3 0.00 B 9mgt_p2 4 0.00 B 9mgt_p2 5 0.00 B 9mgt_p2 6 0.00 B 9mgt_p2 7 0.00 B 9mgt_p3 1 0.00 B 9mgt_p3 2 0.00 B 9mgt_p3 3 0.00 B 9mgt_p3 4 0.00 B 9mgt_p3 5 0.00 B 9mgt_p3 6 0.00 B 9mgt_p3 7 0.00 B 9mgt_p4 1 0.00 B 9mgt_p4 2 0.00 B 9mgt_p4 3 0.00 B 9mgt_p4 4 0.00 B 9mgt_p4 5 0.00 B 9mgt_p4 6 0.00 B 9mgt_p4 7 0.00 C 1mgt_p1 1 6.00 C 1mgt_p1 2 0.00 C 1mgt_p1 3 0.00 C 1mgt_p1 4 12.00 C 1mgt_p1 5 0.00 C 1mgt_p1 6 0.00 C 1mgt_p1 7 12.00 C 1mgt_p2 1 0.00 C 1mgt_p2 2 11.00 C 1mgt_p2 3 0.00 C 1mgt_p2 4 0.00 C 1mgt_p2 5 12.00 C 1mgt_p2 6 0.00 C 1mgt_p2 7 0.00 C 1mgt_p3 1 0.00 C 1mgt_p3 2 0.00 C 1mgt_p3 3 15.00 C 1mgt_p3 4 0.00 C 1mgt_p3 5 0.00 C 1mgt_p3 6 12.00 C 1mgt_p3 7 0.00 C 1mgt_p4 1 0.00 C 1mgt_p4 2 0.00 C 1mgt_p4 3 0.00 C 1mgt_p4 4 17.50 C 1mgt_p4 5 0.00 C 1mgt_p4 6 0.00 C 1mgt_p4 7 12.00 C 2mgt_p1 1 0.00 C 2mgt_p1 2 0.00 C 2mgt_p1 3 0.00 C 2mgt_p1 4 0.00 C 2mgt_p1 5 0.00 C 2mgt_p1 6 0.00 C 2mgt_p1 7 0.00 C 2mgt_p2 1 0.00 C 2mgt_p2 2 0.00 C 2mgt_p2 3 0.00 C 2mgt_p2 4 0.00 C 2mgt_p2 5 0.00 C 2mgt_p2 6 0.00 C 2mgt_p2 7 0.00 C 2mgt_p3 1 0.00 C 2mgt_p3 2 0.00 C 2mgt_p3 3 0.00 C 2mgt_p3 4 0.00 C 2mgt_p3 5 0.00 C 2mgt_p3 6 0.00 C 2mgt_p3 7 0.00 C 2mgt_p4 1 0.00 C 2mgt_p4 2 0.00 C 2mgt_p4 3 0.00 C 2mgt_p4 4 0.00 C 2mgt_p4 5 0.00 C 2mgt_p4 6 0.00 C 2mgt_p4 7 0.00 C 9mgt_p1 1 0.00 C 9mgt_p1 2 0.00 C 9mgt_p1 3 0.00 C 9mgt_p1 4 0.00 C 9mgt_p1 5 0.00 C 9mgt_p1 6 0.00 C 9mgt_p1 7 0.00 C 9mgt_p2 1 0.00 C 9mgt_p2 2 0.00 C 9mgt_p2 3 0.00 C 9mgt_p2 4 0.00 C 9mgt_p2 5 0.00 C 9mgt_p2 6 0.00 C 9mgt_p2 7 0.00 C 9mgt_p3 1 0.00 C 9mgt_p3 2 0.00 C 9mgt_p3 3 0.00 C 9mgt_p3 4 0.00 C 9mgt_p3 5 0.00 C 9mgt_p3 6 0.00 C 9mgt_p3 7 0.00 C 9mgt_p4 1 0.00 C 9mgt_p4 2 0.00 C 9mgt_p4 3 0.00 C 9mgt_p4 4 0.00 C 9mgt_p4 5 0.00 C 9mgt_p4 6 0.00 C 9mgt_p4 7 0.00glpk-5.0/examples/dea.mod0000644000062000006210000001152313766346220014554 0ustar maomkpasswd/* Data Envelopment Analysis (DEA) * * DEA quantifies the relative efficiency of decision making units (DMUs) by * finding the efficient frontier in multiple input multiple output data. The * inputs are resources (eg. number of employees, available machines, ...), * the outputs are productive outputs (eg. contracts made, total sales, ...). * The method is non-parametric. More details are available in the paper * below. * * Models according to: Seiford, Threall, "Recent developments in DEA", 1990. * * Implementation: Sebastian Nowozin */ ### SETS ### set dmus; # Decision Making Units (DMU) set inputs; # Input parameters set outputs; # Output parameters ### PARAMETERS ### param input_data{dmus,inputs} >= 0; param output_data{dmus,outputs} >= 0; ### PROGRAM ### var theta{dmus} >= 0; var lambda{dmus,dmus} >= 0; minimize inefficiency: sum{td in dmus} theta[td]; s.t. output_lower_limit{o in outputs, td in dmus}: sum{d in dmus} lambda[d,td]*output_data[d,o] >= output_data[td,o]; s.t. input_upper_limit{i in inputs, td in dmus}: sum{d in dmus} lambda[d,td]*input_data[d,i] <= theta[td]*input_data[td,i]; s.t. PI1{td in dmus}: sum{d in dmus} lambda[d,td] = 1; /* possibilities: i) (no constraint) ii) s.t. PI1{td in dmus}: sum{d in dmus} lambda[d,td] <= 1; iii) s.t. PI1{td in dmus}: sum{d in dmus} lambda[d,td] >= 1; */ ### SOLVE AND PRINT SOLUTION ### solve; printf "DMU\tEfficiency\n"; for {td in dmus} { printf "%s\t%1.4f\n", td, theta[td]; } ### DATA ### data; set dmus := 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 ; set inputs := AvgInventory LaborCost OperatingCost Population ; set outputs := PrescrVol kDollarValue ; param input_data default 0.0 : AvgInventory LaborCost OperatingCost Population := 1 8000 17030 1280 1410 2 9000 25890 2779 1523 3 13694 29076 2372 1354 4 4250 17506 1385 822 5 6500 23208 639 746 6 7000 12946 802 1281 7 4500 18001 1130 1016 8 5000 14473 1097 1070 9 27000 31760 5559 1694 10 21560 50972 15010 1910 11 15000 39523 4799 1745 12 8500 13076 3489 1353 13 35000 35427 1704 500 14 18000 27554 2882 1016 15 59750 53848 14208 2500 16 19200 38253 1480 2293 17 40000 109404 83016 2718 18 8466 18198 1278 2877 19 16000 40891 7599 4150 20 10000 45444 5556 4421 21 25000 35623 2121 3883 22 14000 20192 5515 3519 23 12500 34973 10475 32366 24 17260 32284 14498 3393 25 7000 17920 7585 4489 26 14000 42094 3742 2217 27 16400 35422 14236 4641 28 13000 19100 3529 5968 29 30000 72167 8656 8715 30 12530 19970 1714 5968 31 31500 39183 4919 5607 32 10000 32048 3483 7324 33 22000 68877 12279 8685 34 10000 29812 3332 8685 35 16000 47686 2507 5420 36 10000 33415 4738 7703 37 9000 12359 4603 4665 38 16439 23614 2989 6317 39 14500 36069 1793 31839 40 39000 76307 9539 15619 41 24927 40706 12661 30213 42 13858 39267 4609 34719 43 33375 29509 11323 31839 44 29044 44482 5542 34719 45 32257 61365 20550 32366 46 8800 49671 3306 43561 47 47000 40425 10396 31263 48 12000 33034 4915 31263 49 28000 69163 4688 15173 50 13300 28931 16735 73064 51 13500 29758 4260 62309 52 24000 40927 8285 23166 53 16000 40403 2131 99836 54 17000 38730 2539 60348 55 25000 35978 2502 99836 56 16000 37509 6278 99836 57 20000 46950 10715 85925 58 14000 35966 3144 85925 59 22000 68318 8015 108987 60 21879 69537 7778 108987 61 15000 25425 2812 201404 62 10000 19508 2454 201404 63 20000 28191 3367 201404 64 18000 37073 8624 108987 65 19051 23763 3496 201404 66 15000 28642 3366 201404 67 10000 35919 3868 201404 68 24000 54653 26494 108987 69 1800 6276 3413 60348 ; param output_data default 0.0 : PrescrVol kDollarValue := 1 12293 61.00 2 18400 92.00 3 16789 92.65 4 10700 45.00 5 9800 50.00 6 6500 29.00 7 8200 56.00 8 8680 45.00 9 33800 183.00 10 23710 156.00 11 24000 120.00 12 17500 75.00 13 25000 130.00 14 26000 122.00 15 26830 178.513 16 16600 106.00 17 90000 450.00 18 11140 73.624 19 25868 136.00 20 32700 191.295 21 29117 152.864 22 18000 100.00 23 11100 60.00 24 23030 137.778 25 10656 58.00 26 24682 152.095 27 26908 120.00 28 16464 80.00 29 57000 321.00 30 17532 94.747 31 30035 168.00 32 16000 100.00 33 63700 277.00 34 18000 90.00 35 27339 139.134 36 19500 116.00 37 13000 80.00 38 15370 102.00 39 18446 90.00 40 56000 260.00 41 73845 364.951 42 28600 145.00 43 27000 243.00 44 52423 279.816 45 73759 363.388 46 20500 80.00 47 27100 115.00 48 15000 110.00 49 50895 277.852 50 19707 128.00 51 17994 78.80 52 36135 167.222 53 30000 153.00 54 26195 125.00 55 28000 216.00 56 24658 152.551 57 36850 190.00 58 29250 183.69 59 50000 250.00 60 40078 265.443 61 20200 110.00 62 12500 75.00 63 30890 195.00 64 31000 175.00 65 31277 192.992 66 11500 75.00 67 30000 175.668 68 38383 190.00 69 2075 8.650 ; end; glpk-5.0/examples/diet.mod0000644000062000006210000000705513766346220014755 0ustar maomkpasswd# STIGLER'S NUTRITION MODEL # # This model determines a least cost diet which meets the daily # allowances of nutrients for a moderately active man weighing 154 lbs. # # References: # Dantzig G B, "Linear Programming and Extensions." # Princeton University Press, Princeton, New Jersey, 1963, # Chapter 27-1. set N; /* nutrients */ set F; /* foods */ param b{N}; /* required daily allowances of nutrients */ param a{F,N}; /* nutritive value of foods (per dollar spent) */ var x{f in F} >= 0; /* dollars of food f to be purchased daily */ s.t. nb{n in N}: sum{f in F} a[f,n] * x[f] = b[n]; /* nutrient balance (units) */ minimize cost: sum{f in F} x[f]; /* total food bill (dollars) */ data; param : N : b := Calorie 3 /* thousands */ Protein 70 /* grams */ Calcium 0.8 /* grams */ Iron 12 /* milligrams */ Vitamin-A 5 /* thousands IUs */ Vitamin-B1 1.8 /* milligrams */ Vitamin-B2 2.7 /* milligrams */ Niacin 18 /* milligrams */ Vitamin-C 75 /* milligrams */ ; set F := Wheat Cornmeal Cannedmilk Margarine Cheese Peanut-B Lard Liver Porkroast Salmon Greenbeans Cabbage Onions Potatoes Spinach Sweet-Pot Peaches Prunes Limabeans Navybeans; param a default 0 : Calorie Protein Calcium Iron Vitamin-A Vitamin-B1 := # (1000) (g) (g) (mg) (1000IU) (mg) Wheat 44.7 1411 2.0 365 . 55.4 Cornmeal 36 897 1.7 99 30.9 17.4 Cannedmilk 8.4 422 15.1 9 26 3 Margarine 20.6 17 .6 6 55.8 .2 Cheese 7.4 448 16.4 19 28.1 .8 Peanut-B 15.7 661 1 48 . 9.6 Lard 41.7 . . . .2 . Liver 2.2 333 .2 139 169.2 6.4 Porkroast 4.4 249 .3 37 . 18.2 Salmon 5.8 705 6.8 45 3.5 1 Greenbeans 2.4 138 3.7 80 69 4.3 Cabbage 2.6 125 4 36 7.2 9 Onions 5.8 166 3.8 59 16.6 4.7 Potatoes 14.3 336 1.8 118 6.7 29.4 Spinach 1.1 106 . 138 918.4 5.7 Sweet-Pot 9.6 138 2.7 54 290.7 8.4 Peaches 8.5 87 1.7 173 86.8 1.2 Prunes 12.8 99 2.5 154 85.7 3.9 Limabeans 17.4 1055 3.7 459 5.1 26.9 Navybeans 26.9 1691 11.4 792 . 38.4 : Vitamin-B2 Niacin Vitamin-C := # (mg) (mg) (mg) Wheat 33.3 441 . Cornmeal 7.9 106 . Cannedmilk 23.5 11 60 Margarine . . . Cheese 10.3 4 . Peanut-B 8.1 471 . Lard .5 5 . Liver 50.8 316 525 Porkroast 3.6 79 . Salmon 4.9 209 . Greenbeans 5.8 37 862 Cabbage 4.5 26 5369 Onions 5.9 21 1184 Potatoes 7.1 198 2522 Spinach 13.8 33 2755 Sweet-Pot 5.4 83 1912 Peaches 4.3 55 57 Prunes 4.3 65 257 Limabeans 38.2 93 . Navybeans 24.6 217 . ; end; glpk-5.0/examples/dist.mod0000644000062000006210000005657113766346220015002 0ustar maomkpasswd# DIST, a product distribution model # # References: # Robert Fourer, David M. Gay and Brian W. Kernighan, "A Modeling Language # for Mathematical Programming." Management Science 36 (1990) 519-554. ### SHIPPING SETS AND PARAMETERS ### set whse 'warehouses'; # Locations from which demand is satisfied set dctr 'distribution centers' within whse; # Locations from which product may be shipped param sc 'shipping cost' {dctr,whse} >= 0; # Shipping costs, to whse from dctr, in $ / 100 lb param huge 'largest shipping cost' > 0; # Largest cost allowed for a usable shipping route param msr 'minimum size restriction' {dctr,whse} logical; # True indicates a minimum-size restriction on # direct shipments using this dctr --> whse route param dsr 'direct shipment requirement' {dctr} >= 0; # Minimum total demand, in pallets, needed to # allow shipment on routes subject to the # minimum size restriction ### PLANT SETS AND PARAMETERS ### set fact 'factories' within dctr; # Locations where product is manufactured param rtmin 'regular-time total minimum' >= 0; # Lower limit on (average) total regular-time # crews employed at all factories param rtmax 'regular-time total maximum' >= rtmin; # Upper limit on (average) total regular-time # crews employed at all factories param otmin 'overtime total minimum' >= 0; # Lower limit on total overtime hours at all factories param otmax 'overtime total maximum' >= otmin; # Upper limit on total overtime hours at all factories param rmin 'regular-time minimums' {fact} >= 0; # Lower limits on (average) regular-time crews param rmax 'regular-time maximums' {f in fact} >= rmin[f]; # Upper limits on (average) regular-time crews param omin 'overtime minimums' {fact} >= 0; # Lower limits on overtime hours param omax 'overtime maximums' {f in fact} >= omin[f]; # Upper limits on overtime hours param hd 'hours per day' {fact} >= 0; # Regular-time hours per working day param dp 'days in period' {fact} > 0; # Working days in the current planning period ### PRODUCT SETS AND PARAMETERS ### set prd 'products'; # Elements of the product group param wt 'weight' {prd} > 0; # Weight in 100 lb / 1000 cases param cpp 'cases per pallet' {prd} > 0; # Cases of product per shipping pallet param tc 'transshipment cost' {prd} >= 0; # Transshipment cost in $ / 1000 cases param pt 'production time' {prd,fact} >= 0; # Crew-hours to produce 1000 cases param rpc 'regular-time production cost' {prd,fact} >= 0; # Cost of production on regular time, # in $ / 1000 cases param opc 'overtime production cost' {prd,fact} >= 0; # Cost of production on overtime, in $ / 1000 cases ### DEMAND SETS AND PARAMETERS ### param dt 'total demand' {prd} >= 0; # Total demands for products, in 1000s param ds 'demand shares' {prd,whse} >= 0.0, <= 1.0; # Historical demand data, from which each # warehouse's share of total demand is deduced param dstot {p in prd} := sum {w in whse} ds[p,w]; # Total of demand shares; should be 1, but often isn't param dem 'demand' {p in prd, w in whse} := dt[p] * ds[p,w] / dstot[p]; # Projected demands to be satisfied, in 1000s set rt 'shipping routes available' := {d in dctr, w in whse: d <> w and sc[d,w] < huge and (w in dctr or sum {p in prd} dem[p,w] > 0) and not (msr[d,w] and sum {p in prd} 1000*dem[p,w]/cpp[p] < dsr[d]) }; # List of ordered pairs that represent routes # on which shipments are allowed ### VARIABLES ### var Rprd 'regular-time production' {prd,fact} >= 0; # Regular-time production of each product # at each factory, in 1000s of cases var Oprd 'overtime production' {prd,fact} >= 0; # Overtime production of each product # at each factory, in 1000s of cases var Ship 'shipments' {prd,rt} >= 0; # Shipments of each product on each allowed route, # in 1000s of cases var Trans 'transshipments' {prd,dctr} >= 0; # Transshipments of each product at each # distribution center, in 1000s of cases ### OBJECTIVE ### minimize cost: sum {p in prd, f in fact} rpc[p,f] * Rprd[p,f] + sum {p in prd, f in fact} opc[p,f] * Oprd[p,f] + sum {p in prd, (d,w) in rt} sc[d,w] * wt[p] * Ship[p,d,w] + sum {p in prd, d in dctr} tc[p] * Trans[p,d]; # Total cost: regular production, overtime # production, shipping, and transshipment ### CONSTRAINTS ### rtlim 'regular-time total limits': rtmin <= sum {p in prd, f in fact} (pt[p,f] * Rprd[p,f]) / (dp[f] * hd[f]) <= rtmax; # Total crews must lie between limits otlim 'overtime total limits': otmin <= sum {p in prd, f in fact} pt[p,f] * Oprd[p,f] <= otmax; # Total overtime must lie between limits rlim 'regular-time limits' {f in fact}: rmin[f] <= sum {p in prd} (pt[p,f] * Rprd[p,f]) / (dp[f] * hd[f]) <= rmax[f]; # Crews at each factory must lie between limits olim 'overtime limits' {f in fact}: omin[f] <= sum {p in prd} pt[p,f] * Oprd[p,f] <= omax[f]; # Overtime at each factory must lie between limits noRprd 'no regular production' {p in prd, f in fact: rpc[p,f] = 0}: Rprd[p,f] = 0; noOprd 'no overtime production' {p in prd, f in fact: opc[p,f] = 0}: Oprd[p,f] = 0; # Do not produce where specified cost is zero bal 'material balance' {p in prd, w in whse}: sum {(v,w) in rt} Ship [p,v,w] + (if w in fact then Rprd[p,w] + Oprd[p,w]) = dem[p,w] + (if w in dctr then sum {(w,v) in rt} Ship[p,w,v]); # Demand is satisfied by shipment into warehouse # plus production (if it is a factory) # minus shipment out (if it is a distn. center) trdef 'transshipment definition' {p in prd, d in dctr}: Trans[p,d] >= sum {(d,w) in rt} Ship [p,d,w] - (if d in fact then Rprd[p,d] + Oprd[p,d]); # Transshipment at a distribution center is # shipments out less production (if any) ### DATA -- 3 PRODUCTS ### data; set prd := 18REG 24REG 24PRO ; set whse := w01 w02 w03 w04 w05 w06 w08 w09 w12 w14 w15 w17 w18 w19 w20 w21 w24 w25 w26 w27 w28 w29 w30 w31 w32 w33 w34 w35 w36 w37 w38 w39 w40 w41 w42 w43 w44 w45 w46 w47 w48 w49 w50 w51 w53 w54 w55 w56 w57 w59 w60 w61 w62 w63 w64 w65 w66 w68 w69 w71 w72 w73 w74 w75 w76 w77 w78 w79 w80 w81 w82 w83 w84 w85 w86 w87 w89 w90 w91 w92 w93 w94 w95 w96 w98 x22 x23 ; set dctr := w01 w02 w03 w04 w05 w62 w76 w96 ; set fact := w01 w05 w96 ; param huge := 99. ; param rtmin := 0.0 ; param rtmax := 8.0 ; param otmin := 0.0 ; param otmax := 96.0 ; param rmin := w01 0.00 w05 0.00 w96 0.00 ; param rmax := w01 3.00 w05 2.00 w96 3.00 ; param omin := w01 0.0 w05 0.0 w96 0.0 ; param omax := w01 48.0 w05 0.0 w96 48.0 ; param hd := w01 8.0 w05 8.0 w96 8.0 ; param dp := w01 19.0 w05 19.0 w96 19.0 ; param wt := 18REG 47.3 24REG 63.0 24PRO 63.0 ; param tc := 18REG 40.00 24REG 45.00 24PRO 45.00 ; param dt := 18REG 376.0 24REG 172.4 24PRO 316.3 ; param cpp := 18REG 102. 24REG 91. 24PRO 91. ; param dsr := w01 96. w02 96. w03 96. w04 96. w05 96. w62 96. w76 96. w96 96. ; param pt (tr) : 18REG 24REG 24PRO := w01 1.194 1.429 1.429 w05 1.194 1.509 1.509 w96 0.000 1.600 1.600 ; param rpc (tr) : 18REG 24REG 24PRO := w01 2119. 2653. 2617. w05 2489. 3182. 3176. w96 0. 2925. 2918. ; param opc (tr) : 18REG 24REG 24PRO := w01 2903. 3585. 3579. w05 0. 0. 0. w96 0. 3629. 3622. ; param sc default 99.99 (tr) : w01 w02 w03 w04 w05 w62 w76 w96 := w01 . 2.97 1.14 2.08 2.37 1.26 2.42 1.43 w02 4.74 . 4.17 6.12 7.41 3.78 7.04 5.21 w03 2.45 4.74 . 3.67 2.84 0.90 2.41 2.55 w04 1.74 5.03 2.43 . 3.19 2.45 2.69 0.58 w05 2.70 5.16 2.84 2.85 . 3.26 3.34 2.71 w06 1.99 4.17 2.13 2.19 2.52 2.06 2.00 1.51 w08 0.21 2.92 1.24 2.07 2.29 1.25 2.32 1.55 w09 0.66 3.76 1.41 2.47 1.82 1.66 . 1.87 w12 1.38 3.83 1.68 2.53 2.39 . 1.96 1.94 w14 2.47 1.58 2.40 3.59 3.85 2.25 . 3.05 w15 1.06 4.95 2.48 1.39 3.41 1.96 . 1.02 w17 0.88 3.39 1.46 2.00 2.67 1.45 . 1.46 w18 7.90 6.57 7.79 9.59 10.81 . . 6.70 w19 1.42 4.12 1.96 1.99 3.52 1.88 . 1.26 w20 3.03 1.59 2.34 4.76 3.98 1.88 . 3.73 w24 1.58 2.80 2.27 2.87 3.19 1.31 . 2.05 w25 1.51 5.05 2.74 0.57 2.98 . 2.95 0.27 w26 1.75 3.61 2.70 1.54 4.07 3.52 . 1.03 w27 2.48 6.87 3.17 1.59 2.08 3.45 . 0.99 w28 2.05 6.83 2.97 1.13 2.91 . . 1.26 w29 4.03 3.68 4.46 3.20 5.50 . . 3.20 w30 2.48 5.78 2.99 2.24 1.79 3.10 . 1.39 w31 2.34 5.41 2.87 1.67 1.66 . . 1.39 w32 14.36 . . . . . . . w33 3.87 4.27 5.11 3.48 5.66 4.03 . 3.05 w34 3.26 4.80 3.21 2.70 4.14 . . 1.77 w35 2.34 2.84 2.89 3.35 3.78 2.68 . 2.52 w36 2.43 5.69 2.96 2.95 1.02 2.61 1.07 2.54 w37 2.23 4.64 2.41 1.99 4.30 2.61 . 1.44 w38 4.66 4.36 5.23 3.04 4.46 . . 3.82 w39 1.11 3.51 1.10 2.53 3.07 1.12 . 2.23 w40 2.99 4.78 4.23 1.57 3.92 . . 1.80 w41 4.93 4.00 5.43 4.45 6.31 . . 3.81 w42 3.86 6.55 5.03 2.11 4.41 . . 2.63 w43 4.61 4.45 3.77 1.22 4.31 . . 2.35 w44 2.05 4.48 1.06 3.70 3.46 1.10 . 3.21 w45 0.92 3.42 1.58 3.04 1.82 1.94 . 2.52 w46 1.36 2.44 0.95 3.08 2.78 0.39 2.16 2.37 w47 1.30 3.39 1.60 2.49 4.29 2.04 . 1.68 w48 1.65 3.78 1.03 2.97 2.21 1.31 . 2.74 w49 1.96 3.00 1.50 3.24 3.68 1.00 . 2.99 w50 0.90 4.14 1.60 1.95 3.61 1.61 . 1.52 w51 1.59 3.95 0.25 2.96 2.58 1.00 2.41 2.71 w53 1.59 3.79 1.28 3.12 3.10 0.89 . 2.98 w54 1.72 4.36 1.61 2.92 2.34 1.91 1.97 3.05 w55 2.45 2.73 2.21 4.47 4.30 2.57 . 4.48 w56 1.10 3.73 1.59 2.74 2.33 1.45 . 2.44 w57 0.95 3.39 1.37 2.30 2.47 1.15 . 1.95 w59 3.29 5.35 3.32 3.81 1.52 3.38 1.34 4.08 w60 2.41 6.12 2.46 3.65 2.35 . 1.37 4.06 w61 3.32 5.50 3.41 3.38 1.23 . 0.99 4.28 w62 1.12 3.00 0.82 3.22 2.95 . 3.33 2.53 w63 3.59 6.36 3.25 4.12 1.84 3.59 1.46 4.03 w64 1.85 4.45 2.17 3.43 2.13 2.03 . 4.02 w65 2.78 4.79 2.81 2.94 1.54 2.90 1.07 2.94 w66 3.90 5.79 3.05 3.65 1.36 3.39 1.22 3.57 w68 2.61 5.20 2.90 2.34 1.68 3.19 1.48 2.31 w69 2.94 5.21 2.78 3.43 0.21 3.26 0.68 2.54 w71 2.06 4.98 2.38 2.44 1.59 2.97 1.05 2.55 w72 2.61 5.50 2.83 3.12 1.35 3.23 0.88 2.99 w73 8.52 6.16 8.03 8.83 10.44 7.38 10.26 . w74 6.11 5.46 9.07 9.38 10.80 . . 8.25 w75 2.66 4.94 2.87 3.69 1.52 3.15 1.24 4.00 w76 1.99 5.26 2.23 3.36 0.58 3.17 . 2.50 w77 4.32 3.07 5.05 3.88 6.04 . . 4.15 w78 5.60 2.59 5.78 5.56 7.10 . . 5.60 w79 4.25 2.32 4.93 4.57 6.04 . . 4.58 w80 5.94 4.00 5.60 7.02 9.46 . . 7.51 w81 5.39 2.21 5.10 6.22 6.46 . . 6.58 w82 8.80 5.69 9.29 9.88 11.69 8.63 11.52 . w83 4.40 . 5.24 5.21 5.81 3.91 7.04 5.33 w84 5.87 5.43 6.17 5.70 7.63 . . 5.70 w85 3.90 3.65 3.38 4.57 5.64 3.05 . 5.04 w86 5.48 2.10 5.70 6.37 7.33 . . 6.19 w87 8.88 5.54 9.50 9.71 11.64 8.85 11.68 . w89 4.62 4.01 4.03 6.30 6.30 3.81 . 7.77 w90 4.35 2.72 4.61 4.01 5.60 . . 3.20 w91 7.61 4.42 7.83 6.85 8.79 . . 7.66 w92 7.15 2.69 6.91 7.20 . . . 7.06 w93 3.17 3.95 4.37 3.74 5.05 . . 2.40 w94 1.21 3.07 0.90 2.74 3.17 . 2.63 2.39 w95 5.82 3.29 6.55 7.06 11.47 . . 7.83 w96 1.77 5.20 2.72 0.59 3.47 2.48 . . w98 3.04 1.92 3.64 3.70 4.90 3.05 . 3.88 x22 4.08 6.25 4.15 4.30 1.77 . 1.77 . x23 3.39 5.74 3.55 4.08 1.69 . 1.47 . ; param msr (tr) : w01 w02 w03 w04 w05 w62 w76 w96 := w01 0 0 0 0 0 0 1 0 w02 0 0 0 0 0 0 1 0 w03 0 0 0 0 0 0 1 0 w04 0 0 0 0 0 0 1 0 w05 0 0 0 0 0 0 0 0 w06 0 1 1 1 1 1 1 1 w08 0 1 1 1 1 1 1 1 w09 0 1 1 1 1 1 0 1 w12 0 1 1 1 1 0 1 1 w14 1 1 1 1 1 0 0 1 w15 0 1 1 1 1 1 0 1 w17 0 1 1 1 1 1 0 1 w18 0 1 1 1 1 0 0 1 w19 0 1 1 1 1 0 0 1 w20 1 1 1 1 1 0 0 1 w24 0 1 1 1 1 0 0 1 w25 0 1 1 1 1 0 1 0 w26 1 1 1 0 1 1 0 1 w27 1 1 1 0 1 1 0 1 w28 1 1 1 0 1 0 0 1 w29 0 1 1 1 1 0 0 1 w30 1 1 1 0 1 1 0 1 w31 1 1 1 0 1 0 0 1 w32 0 0 0 0 0 0 0 0 w33 1 0 1 1 1 1 0 1 w34 1 1 1 0 1 0 0 1 w35 1 1 1 1 1 0 0 1 w36 0 1 1 1 0 1 1 1 w37 1 1 1 0 1 1 0 1 w38 1 1 1 0 1 0 0 1 w39 0 1 1 1 1 1 0 1 w40 1 1 1 0 1 0 0 1 w41 1 0 1 1 1 0 0 1 w42 1 1 1 0 1 0 0 1 w43 1 1 1 0 1 0 0 1 w44 1 1 1 1 1 0 0 1 w45 0 1 1 1 1 1 0 1 w46 0 1 1 1 1 0 1 1 w47 0 1 1 1 1 1 0 1 w48 0 1 1 1 1 0 0 1 w49 1 1 1 1 1 0 0 1 w50 0 1 1 1 1 1 0 1 w51 0 1 1 1 1 0 1 1 w53 1 1 1 1 1 0 0 1 w54 0 1 1 1 1 1 1 1 w55 0 1 1 1 1 0 0 1 w56 0 1 1 1 1 1 0 1 w57 0 1 1 1 1 1 0 1 w59 0 1 1 1 0 1 1 1 w60 0 1 1 1 1 0 1 1 w61 0 1 1 1 0 0 1 1 w62 0 0 0 0 0 0 1 0 w63 0 1 1 1 0 1 1 1 w64 0 1 1 1 1 1 0 1 w65 0 1 1 1 0 1 1 1 w66 0 1 1 1 0 1 1 1 w68 0 1 1 1 0 1 1 1 w69 0 1 1 1 0 1 1 1 w71 0 1 1 1 0 1 1 1 w72 0 1 1 1 0 1 1 1 w73 0 1 1 1 0 1 1 0 w74 0 1 1 1 0 0 0 1 w75 0 1 1 1 0 1 1 1 w76 0 0 0 0 0 0 0 0 w77 1 0 1 1 1 0 0 1 w78 1 0 1 1 1 0 0 1 w79 1 0 1 1 1 0 0 1 w80 1 0 1 1 1 0 0 1 w81 1 0 1 1 1 0 0 1 w82 1 0 1 1 1 1 1 0 w83 1 0 1 1 1 0 1 1 w84 1 0 1 1 1 0 0 1 w85 1 1 1 1 1 0 0 1 w86 1 0 1 1 1 0 0 1 w87 1 0 1 1 1 1 1 0 w89 1 0 1 1 1 1 0 1 w90 0 1 1 1 1 0 0 1 w91 1 0 1 1 1 0 0 1 w92 1 0 1 1 1 0 0 1 w93 1 1 1 0 1 0 0 1 w94 0 0 1 1 1 0 1 1 w95 1 0 1 1 1 0 0 1 w96 0 0 0 0 0 0 0 0 w98 1 0 1 1 1 1 0 1 x22 1 1 1 1 0 0 1 0 x23 1 1 1 1 0 0 1 0 ; param ds default 0.000 (tr) : 18REG 24REG 24PRO := w01 0.000 0.000 0.008 w02 0.004 0.000 0.000 w03 0.000 0.000 0.000 w04 0.010 0.002 0.000 w05 0.000 0.000 0.000 w06 0.010 0.008 0.008 w08 0.030 0.024 0.024 w09 0.014 0.018 0.020 w12 0.014 0.012 0.010 w14 0.007 0.007 0.012 w15 0.010 0.019 0.018 w17 0.013 0.010 0.011 w19 0.015 0.012 0.009 w20 0.012 0.021 0.022 w21 0.000 0.000 0.000 w24 0.012 0.022 0.018 w25 0.019 0.025 0.020 w26 0.006 0.015 0.021 w27 0.008 0.010 0.015 w28 0.011 0.016 0.019 w29 0.008 0.020 0.013 w30 0.011 0.013 0.015 w31 0.011 0.013 0.017 w32 0.006 0.000 0.000 w33 0.000 0.015 0.014 w34 0.008 0.007 0.005 w35 0.002 0.006 0.014 w36 0.015 0.013 0.005 w37 0.017 0.016 0.015 w38 0.015 0.009 0.012 w39 0.007 0.017 0.022 w40 0.009 0.014 0.020 w41 0.003 0.014 0.011 w42 0.017 0.011 0.012 w43 0.009 0.013 0.011 w44 0.002 0.012 0.012 w45 0.016 0.025 0.028 w46 0.038 0.062 0.040 w47 0.007 0.010 0.010 w48 0.003 0.015 0.016 w49 0.005 0.016 0.017 w50 0.011 0.008 0.007 w51 0.010 0.022 0.021 w53 0.004 0.026 0.020 w54 0.020 0.017 0.025 w55 0.004 0.019 0.028 w56 0.004 0.010 0.008 w57 0.014 0.020 0.018 w59 0.012 0.006 0.007 w60 0.019 0.010 0.009 w61 0.028 0.010 0.012 w62 0.000 0.000 0.000 w63 0.070 0.027 0.037 w64 0.009 0.004 0.005 w65 0.022 0.015 0.016 w66 0.046 0.017 0.020 w68 0.005 0.012 0.016 w69 0.085 0.036 0.039 w71 0.011 0.013 0.010 w72 0.089 0.031 0.034 w75 0.026 0.012 0.010 w77 0.001 0.004 0.002 w78 0.002 0.004 0.002 w79 0.001 0.004 0.002 w80 0.001 0.001 0.002 w81 0.001 0.003 0.002 w83 0.009 0.010 0.008 w84 0.001 0.002 0.002 w85 0.001 0.004 0.005 w86 0.001 0.002 0.002 w87 0.002 0.003 0.000 w89 0.001 0.001 0.002 w90 0.006 0.017 0.013 w91 0.002 0.010 0.013 w92 0.000 0.003 0.002 w93 0.002 0.006 0.007 w95 0.001 0.007 0.007 w96 0.000 0.000 0.000 w98 0.006 0.005 0.002 ; end; glpk-5.0/examples/egypt.mod0000644000062000006210000004460513766346220015162 0ustar maomkpasswd# EGYPT, a static model of fertilizer production # # References: # Robert Fourer, David M. Gay and Brian W. Kernighan, "A Modeling Language # for Mathematical Programming." Management Science 36 (1990) 519-554. ### SETS ### set center; # Locations from which final product may be shipped set port within center; # Locations at which imports can be received set plant within center; # Locations of plants set region; # Demand regions set unit; # Productive units set proc; # Processes set nutr; # Nutrients set c_final; # Final products (fertilizers) set c_inter; # Intermediate products set c_ship within c_inter; # Intermediates for shipment set c_raw; # Domestic raw materials and miscellaneous inputs set commod := c_final union c_inter union c_raw; # All commodities ### PARAMETERS ### param cf75 {region,c_final} >= 0; # Consumption of fertilizer 1974-75 (1000 tpy) param fn {c_final,nutr} >= 0; # Nutrient content of fertilizers param cn75 {r in region, n in nutr} := sum {c in c_final} cf75[r,c] * fn[c,n]; # Consumption of nutrients 1974-75 (1000 tpy) param road {region,center} >= 0; # Road distances param rail_half {plant,plant} >= 0; param rail {p1 in plant, p2 in plant} := if rail_half[p1,p2] > 0 then rail_half[p1,p2] else rail_half[p2,p1]; # Interplant rail distances (kms) param impd_barg {plant} >= 0; param impd_road {plant} >= 0; # Import distances (kms) by barge and road param tran_final {pl in plant, r in region} := if road[r,pl] > 0 then .5 + .0144 * road[r,pl] else 0; param tran_import {r in region, po in port} := if road[r,po] > 0 then .5 + .0144 * road[r,po] else 0; param tran_inter {p1 in plant, p2 in plant} := if rail[p1,p2] > 0 then 3.5 + .03 * rail[p1,p2] else 0; param tran_raw {pl in plant} := (if impd_barg[pl] > 0 then 1.0 + .0030 * impd_barg[pl] else 0) + (if impd_road[pl] > 0 then 0.5 + .0144 * impd_road[pl] else 0); # Transport cost (le per ton) for: # final products, imported final products, # interplant shipment, imported raw materials param io {commod,proc}; # Input-output coefficients param util {unit,proc} >= 0; # Capacity utilization coefficients param p_imp {commod} >= 0; # Import Price (cif US$ per ton 1975) param p_r {c_raw} >= 0; param p_pr {plant,c_raw} >= 0; param p_dom {pl in plant, c in c_raw} := if p_r[c] > 0 then p_r[c] else p_pr[pl,c]; # Domestic raw material prices param dcap {plant,unit} >= 0; # Design capacity of plants (t/day) param icap {u in unit, pl in plant} := 0.33 * dcap[pl,u]; # Initial capacity of plants (t/day) param exch := 0.4; # Exchange rate param util_pct := 0.85; # Utilization percent for initial capacity ### DERIVED SETS OF "POSSIBILITIES" ### set m_pos {pl in plant} := {u in unit: icap[u,pl] > 0}; # At each plant, set of units for which there is # initial capacity set p_cap {pl in plant} := {pr in proc: forall {u in unit: util[u,pr] > 0} u in m_pos[pl] }; # At each plant, set of processes for which # all necessary units have some initial capacity set p_except {plant} within proc; # At each plant, list of processes that are # arbitrarily ruled out set p_pos {pl in plant} := p_cap[pl] diff p_except[pl]; # At each plant, set of possible processes set cp_pos {c in commod} := {pl in plant: sum {pr in p_pos[pl]} io[c,pr] > 0}; set cc_pos {c in commod} := {pl in plant: sum {pr in p_pos[pl]} io[c,pr] < 0}; set c_pos {c in commod} := cp_pos[c] union cc_pos[c]; # For each commodity, set of plants that can # produce it (cp_pos) or consume it (cc_pos), # and their union (c_pos) ### VARIABLES ### var Z {pl in plant, p_pos[pl]} >= 0; # Z[pl,pr] is level of process pr at plant pl var Xf {c in c_final, cp_pos[c], region} >= 0; # Xf[c,pl,r] is amount of final product c # shipped from plant pl to region r var Xi {c in c_ship, cp_pos[c], cc_pos[c]} >= 0; # Xi[c,p1,p2] is amount of intermediate c # shipped from plant p1 to plant p2 var Vf {c_final,region,port} >= 0; # Vf[c,r,po] is amount of final product c # imported by region r from port po var Vr {c in c_raw, cc_pos[c]} >= 0; # Vr[c,pl] is amount of raw material c # imported for use at plant pl var U {c in c_raw, cc_pos[c]} >= 0; # U[c,pl] is amount of raw material c # purchased domestically for use at plant pl var Psip; # Domestic recurrent cost var Psil; # Transport cost var Psii; # Import cost ### OBJECTIVE ### minimize Psi: Psip + Psil + Psii; ### CONSTRAINTS ### subject to mbd {n in nutr, r in region}: sum {c in c_final} fn[c,n] * (sum {po in port} Vf[c,r,po] + sum {pl in cp_pos[c]} Xf[c,pl,r]) >= cn75[r,n]; # Total nutrients supplied to a region by all # final products (sum of imports plus internal # shipments from plants) must meet requirements subject to mbdb {c in c_final, r in region: cf75[r,c] > 0}: sum {po in port} Vf[c,r,po] + sum {pl in cp_pos[c]} Xf[c,pl,r] >= cf75[r,c]; # Total of each final product supplied to each # region (as in previous constraint) must meet # requirements subject to mb {c in commod, pl in plant}: sum {pr in p_pos[pl]} io[c,pr] * Z[pl,pr] + ( if c in c_ship then ( if pl in cp_pos[c] then sum {p2 in cc_pos[c]} Xi[c,pl,p2] ) - ( if pl in cc_pos[c] then sum {p2 in cp_pos[c]} Xi[c,p2,pl] )) + ( if (c in c_raw and pl in cc_pos[c]) then (( if p_imp[c] > 0 then Vr[c,pl] ) + ( if p_dom[pl,c] > 0 then U[c,pl] ))) >= if (c in c_final and pl in cp_pos[c]) then sum {r in region} Xf[c,pl,r]; # For each commodity at each plant: sum of # (1) production or consumption at plant, # (2) inter-plant shipments in or out, # (3) import and domestic purchases (raw only) # is >= 0 for raw materials and intermediates; # is >= the total shipped for final products subject to cc {pl in plant, u in m_pos[pl]}: sum {pr in p_pos[pl]} util[u,pr] * Z[pl,pr] <= util_pct * icap[u,pl]; # For each productive unit at each plant, # total utilization by all processes # may not exceed the unit's capacity subject to ap: Psip = sum {c in c_raw, pl in cc_pos[c]} p_dom[pl,c] * U[c,pl]; # Psip is the cost of domestic raw materials, # summed over all plants that consume them subject to al: Psil = sum {c in c_final} ( sum {pl in cp_pos[c], r in region} tran_final[pl,r] * Xf[c,pl,r] + sum {po in port, r in region} tran_import[r,po] * Vf[c,r,po] ) + sum {c in c_ship, p1 in cp_pos[c], p2 in cc_pos[c]} tran_inter[p1,p2] * Xi[c,p1,p2] + sum {c in c_raw, pl in cc_pos[c]: p_imp[c] > 0} tran_raw[pl] * Vr[c,pl]; # Total transport cost is sum of shipping costs for # (1) all final products from all plants, # (2) all imports of final products, # (3) all intermediates shipped between plants, # (4) all imports of raw materials subject to ai: Psii / exch = sum {c in c_final, r in region, po in port} p_imp[c] * Vf[c,r,po] + sum {c in c_raw, pl in cc_pos[c]} p_imp[c] * Vr[c,pl]; # Total import cost -- at exchange rate -- # is sum of import costs for final products # in each region and raw materials at each plant ### DATA ### data; set center := ASWAN HELWAN ASSIOUT KAFR_EL_ZT ABU_ZAABAL ABU_KIR TALKHA SUEZ ; set port := ABU_KIR ; set plant := ASWAN HELWAN ASSIOUT KAFR_EL_ZT ABU_ZAABAL ; set region := ALEXANDRIA BEHERA GHARBIA KAFR_EL_SH DAKAHLIA DAMIETTA SHARKIA ISMAILIA SUEZ MENOUFIA KALUBIA GIZA BENI_SUEF FAYOUM MINIA ASSIOUT NEW_VALLEY SOHAG QUENA ASWAN ; set unit := SULF_A_S SULF_A_P NITR_ACID AMM_ELEC AMM_C_GAS C_AMM_NITR AMM_SULF SSP ; set proc := SULF_A_S SULF_A_P NITR_ACID AMM_ELEC AMM_C_GAS CAN_310 CAN_335 AMM_SULF SSP_155 ; set nutr := N P205 ; set c_final := UREA CAN_260 CAN_310 CAN_335 AMM_SULF DAP SSP_155 C_250_55 C_300_100 ; set c_inter := AMMONIA NITR_ACID SULF_ACID ; set c_ship := AMMONIA SULF_ACID ; set c_raw := EL_ASWAN COKE_GAS PHOS_ROCK LIMESTONE EL_SULFUR PYRITES ELECTRIC BF_GAS WATER STEAM BAGS ; set p_except[ASWAN] := CAN_335 ; set p_except[HELWAN] := CAN_310 ; set p_except[ASSIOUT] := ; set p_except[KAFR_EL_ZT] := ; set p_except[ABU_ZAABAL] := ; param cf75 default 0.0 : CAN_260 CAN_310 CAN_335 AMM_SULF UREA := ALEXANDRIA . . 5.0 3.0 1.0 ASSIOUT 1.0 20.0 26.0 1.0 27.0 ASWAN . 40.0 . . . BEHERA 1.0 . 25.0 90.0 35.0 BENI_SUEF 1.0 . 15.0 1.0 20.0 DAKAHLIA 1.0 . 26.0 60.0 20.0 DAMIETTA . . 2.0 15.0 8.0 FAYOUM 1.0 . 20.0 6.0 20.0 GHARBIA . . 17.0 60.0 28.0 GIZA . . 40.0 6.0 2.0 ISMAILIA . . 4.0 6.0 2.0 KAFR_EL_SH 1.0 . 10.0 45.0 22.0 KALUBIA . . 25.0 16.0 7.0 MENOUFIA 1.0 . 24.0 21.0 30.0 MINIA 2.0 15.0 35.0 1.0 41.0 NEW_VALLEY . . . . 1.0 QUENA . 95.0 2.0 . 3.0 SHARKIA 1.0 . 31.0 50.0 28.0 SOHAG . 65.0 3.0 . 7.0 SUEZ . . 1.0 . . : SSP_155 C_250_55 C_300_100 DAP := ALEXANDRIA 8.0 . . . ASSIOUT 35.0 5.0 .1 . ASWAN 8.0 . . . BEHERA 64.0 1.0 .1 .1 BENI_SUEF 13.0 3.0 . . DAKAHLIA 52.0 1.0 . . DAMIETTA 5.0 . . . FAYOUM 17.0 1.0 . . GHARBIA 57.0 1.0 .2 .1 GIZA 14.0 1.0 .1 . ISMAILIA 4.0 . . . KAFR_EL_SH 25.0 2.0 .1 . KALUBIA 22.0 1.0 . .1 MENOUFIA 33.0 2.0 .1 .1 MINIA 50.0 3.0 .2 .1 NEW_VALLEY 1.0 . . . QUENA 8.0 . . . SHARKIA 43.0 1.0 .1 . SOHAG 20.0 1.0 . . SUEZ 1.0 . . . ; param fn default 0.0 : N P205 := AMM_SULF .206 . CAN_260 .26 . CAN_310 .31 . CAN_335 .335 . C_250_55 .25 .055 C_300_100 .30 .10 DAP .18 .46 SSP_155 . .15 UREA .46 . ; param road default 0.0 : ABU_KIR ABU_ZAABAL ASSIOUT ASWAN HELWAN KAFR_EL_ZT SUEZ TALKHA := ALEXANDRIA 16 210 607 1135 244 119 362 187 ASSIOUT 616 420 . 518 362 504 527 518 ASWAN 1134 938 518 . 880 1022 1045 1036 BEHERA 76 50 547 1065 184 42 288 120 BENI_SUEF 359 163 257 775 105 248 270 261 DAKAHLIA 208 138 515 1033 152 58 219 3 DAMIETTA 267 216 596 1114 233 131 286 66 FAYOUM 341 145 308 826 88 230 252 243 GHARBIA 150 65 485 1003 122 20 226 55 GIZA 287 48 372 890 .9 133 169 146 ISMAILIA 365 142 536 1054 173 241 89 146 KAFR_EL_SH 145 105 525 1043 162 20 266 35 KALUBIA 190 97 439 957 76 66 180 81 MENOUFIA 157 154 472 990 109 33 213 90 MINIA 384 288 132 650 230 372 394 386 NEW_VALLEY 815 619 199 519 561 703 726 717 QUENA 858 662 242 276 604 746 769 760 SHARKIA 240 60 473 991 110 78 214 58 SOHAG 715 519 99 419 461 603 626 617 SUEZ 370 224 541 1059 178 246 . 298 ; param rail_half default 0 : KAFR_EL_ZT ABU_ZAABAL HELWAN ASSIOUT := ABU_ZAABAL 85 . . . HELWAN 142 57 . . ASSIOUT 504 420 362 . ASWAN 1022 938 880 518 ; param : impd_barg impd_road := ABU_ZAABAL 210 .1 ASSIOUT 583 0 ASWAN 1087 10 HELWAN 183 0 KAFR_EL_ZT 104 6 ; param io default 0.0 := [*,AMM_C_GAS] AMMONIA 1.0 BF_GAS -609. COKE_GAS -2.0 ELECTRIC -1960. STEAM -4. WATER -700. [*,AMM_ELEC] AMMONIA 1.0 EL_ASWAN -12.0 [*,AMM_SULF] AMMONIA -.26 AMM_SULF 1.0 BAGS -22. ELECTRIC -19. SULF_ACID -.76 WATER -17. [*,CAN_310] AMMONIA -.20 BAGS -23. CAN_310 1.0 LIMESTONE -.12 NITR_ACID -.71 STEAM -.4 WATER -49. [*,CAN_335] AMMONIA -.21 BAGS -23. CAN_335 1.0 LIMESTONE -.04 NITR_ACID -.76 STEAM -.4 WATER -49. [*,NITR_ACID] AMMONIA -.292 ELECTRIC -231. NITR_ACID 1.0 WATER -.6 [*,SSP_155] BAGS -22. ELECTRIC -14. PHOS_ROCK -.62 SSP_155 1.0 SULF_ACID -.41 WATER -6. [*,SULF_A_P] ELECTRIC -75. PYRITES -.826 SULF_ACID 1.0 WATER -60. [*,SULF_A_S] ELECTRIC -50. EL_SULFUR -.334 SULF_ACID 1.0 WATER -20. ; param util default 0 := [*,*] SULF_A_S SULF_A_S 1 SULF_A_P SULF_A_P 1 NITR_ACID NITR_ACID 1 AMM_ELEC AMM_ELEC 1 AMM_C_GAS AMM_C_GAS 1 SSP SSP_155 1 C_AMM_NITR CAN_310 1 C_AMM_NITR CAN_335 1 AMM_SULF AMM_SULF 1 ; param p_imp default 0.0 := PYRITES 17.5 AMM_SULF 75. EL_SULFUR 55. DAP 175. UREA 150. SSP_155 80. CAN_260 75. C_250_55 100. CAN_310 90. C_300_100 130. CAN_335 100. ; param p_r default 0.0 := ELECTRIC .007 BF_GAS .007 WATER .031 STEAM 1.25 BAGS .28 ; param p_pr default 0.0 := [HELWAN,COKE_GAS] 16.0 [ASWAN,EL_ASWAN] 1.0 [*,LIMESTONE] ASWAN 1.2 HELWAN 1.2 [*,PHOS_ROCK] ABU_ZAABAL 4.0 ASSIOUT 3.5 KAFR_EL_ZT 5.0 ; param dcap default 0.0 := [ABU_ZAABAL,*] SSP 600 SULF_A_P 227 SULF_A_S 242 [ASSIOUT,*] SSP 600 SULF_A_S 250 [ASWAN,*] AMM_ELEC 450 C_AMM_NITR 1100 NITR_ACID 800 [HELWAN,*] AMM_C_GAS 172 AMM_SULF 24 C_AMM_NITR 364 NITR_ACID 282 [KAFR_EL_ZT,*] SSP 600 SULF_A_P 50 SULF_A_S 200 ; end; glpk-5.0/examples/fctp.mod0000644000062000006210000000625113766346220014761 0ustar maomkpasswd/* FCTP, Fixed-Charge Transportation Problem */ /* Written in GNU MathProg by Andrew Makhorin */ /* The Fixed-Charge Transportation Problem (FCTP) is obtained from classical transportation problem by imposing a fixed cost on each transportation link if there is a positive flow on that link. */ param m, integer, > 0; /* number of sources */ param n, integer, > 0; /* number of customers */ set I := 1..m; /* set of sources */ set J := 1..n; /* set of customers */ param supply{i in I}, >= 0; /* supply at source i */ param demand{j in J}, >= 0; /* demand at customer j */ param varcost{i in I, j in J}, >= 0; /* variable cost (a cost per one unit shipped from i to j) */ param fixcost{i in I, j in J}, >= 0; /* fixed cost (a cost for shipping any amount from i to j) */ var x{i in I, j in J}, >= 0; /* amount shipped from source i to customer j */ s.t. f{i in I}: sum{j in J} x[i,j] = supply[i]; /* observe supply at source i */ s.t. g{j in J}: sum{i in I} x[i,j] = demand[j]; /* satisfy demand at customer j */ var y{i in I, j in J}, binary; /* y[i,j] = 1 means some amount is shipped from i to j */ s.t. h{i in I, j in J}: x[i,j] <= min(supply[i], demand[j]) * y[i,j]; /* if y[i,j] is 0, force x[i,j] to be 0 (may note that supply[i] and demand[j] are implicit upper bounds for x[i,j] as follows from the constraints f[i] and g[j]) */ minimize cost: sum{i in I, j in J} varcost[i,j] * x[i,j] + sum{i in I, j in J} fixcost[i,j] * y[i,j]; /* total transportation costs */ data; /* These data correspond to the instance bal8x12 from [Balinski]. */ /* The optimal solution is 471.55 */ param m := 8; param n := 12; param supply := 1 15.00, 2 20.00, 3 45.00, 4 35.00, 5 25.00, 6 35.00, 7 10.00, 8 25.00; param demand := 1 20.00, 2 15.00, 3 20.00, 4 15.00, 5 5.00, 6 20.00, 7 30.00, 8 10.00, 9 35.00, 10 25.00, 11 10.00, 12 5.00; param varcost : 1 2 3 4 5 6 7 8 9 10 11 12 := 1 0.69 0.64 0.71 0.79 1.70 2.83 2.02 5.64 5.94 5.94 5.94 7.68 2 1.01 0.75 0.88 0.59 1.50 2.63 2.26 5.64 5.85 5.62 5.85 4.94 3 1.05 1.06 1.08 0.64 1.22 2.37 1.66 5.64 5.91 5.62 5.91 4.94 4 1.94 1.50 1.56 1.22 1.98 1.98 1.36 6.99 6.99 6.99 6.99 3.68 5 1.61 1.40 1.61 1.33 1.68 2.83 1.54 4.26 4.26 4.26 4.26 2.99 6 5.29 5.94 6.08 5.29 5.96 6.77 5.08 0.31 0.21 0.17 0.31 1.53 7 5.29 5.94 6.08 5.29 5.96 6.77 5.08 0.55 0.35 0.40 0.19 1.53 8 5.29 6.08 6.08 5.29 5.96 6.45 5.08 2.43 2.30 2.33 1.81 2.50 ; param fixcost : 1 2 3 4 5 6 7 8 9 10 11 12 := 1 11.0 16.0 18.0 17.0 10.0 20.0 17.0 13.0 15.0 12.0 14.0 14.0 2 14.0 17.0 17.0 13.0 15.0 13.0 16.0 11.0 20.0 11.0 15.0 10.0 3 12.0 13.0 20.0 17.0 13.0 15.0 16.0 13.0 12.0 13.0 10.0 18.0 4 16.0 19.0 16.0 11.0 15.0 12.0 18.0 12.0 18.0 13.0 13.0 14.0 5 19.0 18.0 15.0 16.0 12.0 14.0 20.0 19.0 11.0 17.0 16.0 18.0 6 13.0 20.0 20.0 17.0 15.0 12.0 14.0 11.0 12.0 19.0 15.0 16.0 7 11.0 12.0 15.0 10.0 17.0 11.0 11.0 16.0 10.0 18.0 17.0 12.0 8 17.0 10.0 20.0 12.0 17.0 20.0 16.0 15.0 10.0 12.0 16.0 18.0 ; end; glpk-5.0/examples/food.mod0000644000062000006210000000647213766346220014761 0ustar maomkpasswd/* Food Manufacture 1, section 12.1 in * Williams, "Model Building in Mathematical Programming" * * Sebastian Nowozin */ set oils; set month; /* Buying prices of the raw oils in the next six month. */ param buyingprices{month,oils}; /* Actual amount bought in each month. */ var buys{month,oils} >= 0; /* Stock for each oil. */ var stock{month,oils} >= 0; /* Price of the produced product */ param productprice >= 0; param storagecost; param oilhardness{oils} >= 0; /* Actual amount of output oil produced in each month */ var production{m in month} >= 0; var useoil{m in month, o in oils} >= 0; maximize totalprofit: sum{m in month} productprice*production[m] - sum{m in month, o in oils} buyingprices[m,o]*buys[m,o] - sum{m in month, o in oils} storagecost*stock[m,o]; /* Constraints */ /* 1. Starting stock */ s.t. startstock{o in oils}: stock[1,o] = 500; s.t. endstock{o in oils}: stock[6,o] + buys[6,o] - useoil[6,o] >= 500; /* 2. Stock constraints */ s.t. stocklimit{m in month, o in oils}: stock[m,o] <= 1000; s.t. production1{m in month, o in oils}: useoil[m,o] <= stock[m,o] + buys[m,o]; s.t. production2{m1 in month, m2 in month, o in oils : m2 = m1+1}: stock[m2,o] = stock[m1,o] + buys[m1,o] - useoil[m1,o]; s.t. production3a{m in month}: sum{o in oils} oilhardness[o]*useoil[m,o] >= 3*production[m]; s.t. production3b{m in month}: sum{o in oils} oilhardness[o]*useoil[m,o] <= 6*production[m]; s.t. production4{m in month}: production[m] = sum{o in oils} useoil[m,o]; /* 3. Refining constraints */ s.t. refine1{m in month}: useoil[m,"VEG1"]+useoil[m,"VEG2"] <= 200; s.t. refine2{m in month}: useoil[m,"OIL1"]+useoil[m,"OIL2"]+useoil[m,"OIL3"] <= 250; solve; for {m in month} { printf "Month %d\n", m; printf "PRODUCE %4.2f tons, hardness %4.2f\n", production[m], (sum{o in oils} oilhardness[o]*useoil[m,o]) / (sum{o in oils} useoil[m,o]); printf "\tVEG1\tVEG2\tOIL1\tOIL2\tOIL3\n"; printf "STOCK"; printf "%d", m; for {o in oils} { printf "\t%4.2f", stock[m,o]; } printf "\nBUY"; for {o in oils} { printf "\t%4.2f", buys[m,o]; } printf "\nUSE"; printf "%d", m; for {o in oils} { printf "\t%4.2f", useoil[m,o]; } printf "\n"; printf "\n"; } printf "Total profit: %4.2f\n", (sum{m in month} productprice*production[m] - sum{m in month, o in oils} buyingprices[m,o]*buys[m,o] - sum{m in month, o in oils} storagecost*stock[m,o]); printf " turnover: %4.2f\n", sum{m in month} productprice*production[m]; printf " buying costs: %4.2f\n", sum{m in month, o in oils} buyingprices[m,o]*buys[m,o]; printf " storage costs: %4.2f\n", sum{m in month, o in oils} storagecost*stock[m,o]; data; param : oils : oilhardness := VEG1 8.8 VEG2 6.1 OIL1 2.0 OIL2 4.2 OIL3 5.0 ; set month := 1 2 3 4 5 6; param buyingprices : VEG1 VEG2 OIL1 OIL2 OIL3 := 1 110 120 130 110 115 2 130 130 110 90 115 3 110 140 130 100 95 4 120 110 120 120 125 5 100 120 150 110 105 6 90 100 140 80 135 ; param productprice := 150; param storagecost := 5; end; glpk-5.0/examples/food2.mod0000644000062000006210000001000213766346220015023 0ustar maomkpasswd/* Food Manufacture 2, section 12.2 in * Williams, "Model Building in Mathematical Programming" * * Sebastian Nowozin */ set oils; set month; /* Buying prices of the raw oils in the next six month. */ param buyingprices{month,oils}; /* Actual amount bought in each month. */ var buys{month,oils} >= 0; /* Stock for each oil. */ var stock{month,oils} >= 0; /* Price of the produced product */ param productprice >= 0; param storagecost; param oilhardness{oils} >= 0; param M >= 0; /* Actual amount of output oil produced in each month */ var production{m in month} >= 0; var useoil{m in month, o in oils} >= 0, <= M; var useoilb{m in month, o in oils}, binary; maximize totalprofit: sum{m in month} productprice*production[m] - sum{m in month, o in oils} buyingprices[m,o]*buys[m,o] - sum{m in month, o in oils} storagecost*stock[m,o]; /* Constraints */ /* 1. Starting stock */ s.t. startstock{o in oils}: stock[1,o] = 500; s.t. endstock{o in oils}: stock[6,o] + buys[6,o] - useoil[6,o] >= 500; /* 2. Stock constraints */ s.t. stocklimit{m in month, o in oils}: stock[m,o] <= 1000; s.t. production1{m in month, o in oils}: useoil[m,o] <= stock[m,o] + buys[m,o]; s.t. production2{m1 in month, m2 in month, o in oils : m2 = m1+1}: stock[m2,o] = stock[m1,o] + buys[m1,o] - useoil[m1,o]; s.t. production3a{m in month}: sum{o in oils} oilhardness[o]*useoil[m,o] >= 3*production[m]; s.t. production3b{m in month}: sum{o in oils} oilhardness[o]*useoil[m,o] <= 6*production[m]; s.t. production4{m in month}: production[m] = sum{o in oils} useoil[m,o]; /* 3. Refining constraints */ s.t. refine1{m in month}: useoil[m,"VEG1"]+useoil[m,"VEG2"] <= 200; s.t. refine2{m in month}: useoil[m,"OIL1"]+useoil[m,"OIL2"]+useoil[m,"OIL3"] <= 250; /* 4. Additional conditions: * i) The food may never be made up of more than three oils every month */ s.t. useoilb_calc{m in month, o in oils}: M*useoilb[m,o] >= useoil[m,o]; s.t. useoilb_limit{m in month}: sum{o in oils} useoilb[m,o] <= 3; /* ii) If an oil is used in a month, at least 20 tons must be used. */ s.t. useminimum{m in month, o in oils}: 20*useoilb[m,o] <= useoil[m,o]; /* iii) If either of VEG1 or VEG2 is used in a month, OIL2 must also be used */ s.t. use_oil2a{m in month}: useoilb[m,"VEG1"] <= useoilb[m,"OIL3"]; s.t. use_oil2b{m in month}: useoilb[m,"VEG2"] <= useoilb[m,"OIL3"]; solve; for {m in month} { printf "Month %d\n", m; printf "PRODUCE %4.2f tons, hardness %4.2f\n", production[m], (sum{o in oils} oilhardness[o]*useoil[m,o]) / (sum{o in oils} useoil[m,o]); printf "\tVEG1\tVEG2\tOIL1\tOIL2\tOIL3\n"; printf "STOCK"; printf "%d", m; for {o in oils} { printf "\t%4.2f", stock[m,o]; } printf "\nBUY"; for {o in oils} { printf "\t%4.2f", buys[m,o]; } printf "\nUSE"; printf "%d", m; for {o in oils} { printf "\t%4.2f", useoil[m,o]; } printf "\n"; printf "\n"; } printf "Total profit: %4.2f\n", (sum{m in month} productprice*production[m] - sum{m in month, o in oils} buyingprices[m,o]*buys[m,o] - sum{m in month, o in oils} storagecost*stock[m,o]); printf " turnover: %4.2f\n", sum{m in month} productprice*production[m]; printf " buying costs: %4.2f\n", sum{m in month, o in oils} buyingprices[m,o]*buys[m,o]; printf " storage costs: %4.2f\n", sum{m in month, o in oils} storagecost*stock[m,o]; data; param : oils : oilhardness := VEG1 8.8 VEG2 6.1 OIL1 2.0 OIL2 4.2 OIL3 5.0 ; set month := 1 2 3 4 5 6; param buyingprices : VEG1 VEG2 OIL1 OIL2 OIL3 := 1 110 120 130 110 115 2 130 130 110 90 115 3 110 140 130 100 95 4 120 110 120 120 125 5 100 120 150 110 105 6 90 100 140 80 135 ; param productprice := 150; param storagecost := 5; param M := 1000; end; glpk-5.0/examples/furnace.mps0000644000062000006210000001261413766346220015470 0ustar maomkpasswd*NAME: FURNACE *ROWS: 18 *COLUMNS: 18 *NONZERO: 90 *OPT SOLN: 2141.923551 *SOURCE: Linear Programming--Electric-Arc Furnace Steelmaking * Data Processing Application. N.Y.: IBM Corp. *APPLICATION: Electric-Arc Furnace Steelmaking *COMMENTS: fixed MPS format * encoded by Andrew Makhorin * NAME FURNACE ROWS N VALUE $ Price per pound (of initial charge materials) E CR $ Chromium E MN $ Manganese E SI $ Silicon E C $ Carbon E FE $ Iron E TOTCHG $ Total elements charged E CRSLAG $ Chromium-oxidized-to-slag relationship E TOTCRS $ Total modified chromium specification constraint E MN/CR $ Total manganese specification constraint E FESLAG $ Iron-oxidized-to-slag relationship G ENDFE $ Total iron specification constraint L CSPEC $ Total carbon specification constraint E BASE $ Basicity relationship L SISPEC $ Total silicon specification constraint G TOTAL $ Total end metal L TOTRS4 $ Inventory limitation on 430 grade scrap L TOTRCF $ Inventory limitation on low-carbon ferrochrome COLUMNS * Steel scrap STSCP VALUE .02 CR 0 MN .01 SI .002 C .006 FE .982 * 430 grade scrap SP430 VALUE .075 CR .16 MN .01 SI .0095 C .0012 FE .8143 TOTRS4 1 * High-carbon ferrochrome HCFCR VALUE .27 CR .556 MN 0 SI .02 C .08 FE .334 * Low-carbon ferrochrome LCFCR VALUE .40 CR .65 MN 0 SI .01 C .0009 FE .3391 TOTRCF 1 * Chromium initially charged CRIT VALUE 0 CR -1 TOTCHG 1 CRSLAG 1 * Manganese initially charged MNIT VALUE 0 MN -1 TOTCHG 1 CRSLAG 1 MN/CR .98 * Silicon initially charged SIIT VALUE 0 SI -1 TOTCHG 1 CSPEC -5 BASE 2.14 TOTAL -1 * Carbon initially charged CEIT VALUE 0 C -1 TOTCHG 1 TOTAL -1 * Iron initially charged FEIT VALUE 0 FE -1 TOTCHG 1 ENDFE 1 * Total initial charge weight TICW VALUE 0 TOTCHG -1 CRSLAG -.074 TOTCRS .074 FESLAG .075 CSPEC 5 TOTAL 1 * Modified chromium in the slag ISCR VALUE 0 CRSLAG -1 TOTCRS .95 FESLAG -1 CSPEC -.25 SISPEC -.395 TOTAL -.05 * Chrome silicide additive at refining stage CRSI VALUE .27 TOTCRS .39 ENDFE .18 BASE 2.7606 SISPEC .43 TOTAL .57 * 430 grade scrap at refining stage RS430 VALUE .075 TOTCRS .17 MN/CR .01 ENDFE .8143 CSPEC 12 SISPEC .0095 TOTAL 1 TOTRS4 1 * Low-carbon ferrochrome at refining stage RCFCR VALUE .40 TOTCRS .65 ENDFE .3391 CSPEC 9 SISPEC .01 TOTAL 1 TOTRCF 1 * Iron in the slag ISFE VALUE 0 FESLAG -1 ENDFE -.05 CSPEC -.25 SISPEC -.238 TOTAL -.05 * Lime at refining stage LIME VALUE .01 BASE -2 * Low-carbon ferrochrome at finishing stage FCFCR VALUE .40 TOTCRS .65 ENDFE .3391 CSPEC 9 SISPEC .01 TOTAL 1 TOTRCF 1 * Slack in the chromium and manganese specifications SIS VALUE 0 TOTCRS 1 MN/CR 1 RHS TOTCRS 3400 MN/CR 200 ENDFE 16200 CSPEC 100000 SISPEC 200 TOTAL 20000 TOTRS4 2000 TOTRCF 2000 BOUNDS UP HCFCR 2000 ENDATA glpk-5.0/examples/gap.mod0000644000062000006210000000475713766346220014605 0ustar maomkpasswd/* GAP, Generalized Assignment Problem */ /* Written in GNU MathProg by Andrew Makhorin */ /* The Generalized Assignment Problem (GAP) is to assign a set of jobs to a set of agents subject to the constraints that each job must be assigned exactly to one agent and the total resources consumed by all jobs assigned to an agent must not exceed the agent's capacity. */ param m, integer, > 0; /* number of agents */ param n, integer, > 0; /* number of jobs */ set I := 1..m; /* set of agents */ set J := 1..n; /* set of jobs */ param a{i in I, j in J}, >= 0; /* resource consumed in allocating job j to agent i */ param b{i in I}, >= 0; /* resource capacity of agent i */ param c{i in I, j in J}, >= 0; /* cost of allocating job j to agent i */ var x{i in I, j in J}, binary; /* x[i,j] = 1 means job j is assigned to agent i */ s.t. one{j in J}: sum{i in I} x[i,j] = 1; /* job j must be assigned exactly to one agent */ s.t. lim{i in I}: sum{j in J} a[i,j] * x[i,j] <= b[i]; /* total amount of resources consumed by all jobs assigned to agent i must not exceed the agent's capacity */ minimize obj: sum{i in I, j in J} c[i,j] * x[i,j]; /* the objective is to find cheapest assignment (note that gap can also be formulated as maximization problem) */ data; /* These data correspond to the instance c515-1 (gap1) from: I.H. Osman, "Heuristics for the Generalised Assignment Problem: Simulated Annealing and Tabu Search Approaches", OR Spektrum, Volume 17, 211-225, 1995 D. Cattrysse, M. Salomon and L.N. Van Wassenhove, "A set partitioning heuristic for the generalized assignment problem", European Journal of Operational Research, Volume 72, 167-174, 1994 */ /* The optimal solution is 261 (minimization) or 336 (maximization) */ param m := 5; param n := 15; param a : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 := 1 8 15 14 23 8 16 8 25 9 17 25 15 10 8 24 2 15 7 23 22 11 11 12 10 17 16 7 16 10 18 22 3 21 20 6 22 24 10 24 9 21 14 11 14 11 19 16 4 20 11 8 14 9 5 6 19 19 7 6 6 13 9 18 5 8 13 13 13 10 20 25 16 16 17 10 10 5 12 23 ; param b := 1 36, 2 34, 3 38, 4 27, 5 33; param c : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 := 1 17 21 22 18 24 15 20 18 19 18 16 22 24 24 16 2 23 16 21 16 17 16 19 25 18 21 17 15 25 17 24 3 16 20 16 25 24 16 17 19 19 18 20 16 17 21 24 4 19 19 22 22 20 16 19 17 21 19 25 23 25 25 25 5 18 19 15 15 21 25 16 16 23 15 22 17 19 22 24 ; end; glpk-5.0/examples/glpsol.c0000644000062000006210000016024513766346220014774 0ustar maomkpasswd/* glpsol.c (stand-alone GLPK LP/MIP solver) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2000-2020 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include #include #include #define xassert glp_assert #define xerror glp_error #define xprintf glp_printf struct csa { /* common storage area */ glp_prob *prob; /* LP/MIP problem object */ glp_bfcp bfcp; /* basis factorization control parameters */ glp_smcp smcp; /* simplex method control parameters */ glp_iptcp iptcp; /* interior-point method control parameters */ glp_iocp iocp; /* integer optimizer control parameters */ glp_tran *tran; /* model translator workspace */ glp_graph *graph; /* network problem object */ int format; /* problem file format: */ #define FMT_MPS_DECK 1 /* fixed MPS */ #define FMT_MPS_FILE 2 /* free MPS */ #define FMT_LP 3 /* CPLEX LP */ #define FMT_GLP 4 /* GLPK LP/MIP */ #define FMT_MATHPROG 5 /* MathProg */ #define FMT_MIN_COST 6 /* DIMACS min-cost flow */ #define FMT_MAX_FLOW 7 /* DIMACS maximum flow */ #if 1 /* 06/VIII-2011 */ #define FMT_CNF 8 /* DIMACS CNF-SAT */ #endif const char *in_file; /* name of input problem file */ #define DATA_MAX 10 /* maximal number of input data files */ int ndf; /* number of input data files specified */ const char *in_data[1+DATA_MAX]; /* name(s) of input data file(s) */ const char *out_dpy; /* name of output file to send display output; NULL means the display output is sent to the terminal */ int seed; /* seed value to be passed to the MathProg translator; initially set to 1; 0x80000000 means the value is omitted */ int solution; /* solution type flag: */ #define SOL_BASIC 1 /* basic */ #define SOL_INTERIOR 2 /* interior-point */ #define SOL_INTEGER 3 /* mixed integer */ const char *in_res; /* name of input solution file in raw format */ int dir; /* optimization direction flag: 0 - not specified GLP_MIN - minimization GLP_MAX - maximization */ int scale; /* automatic problem scaling flag */ const char *out_sol; /* name of output solution file in printable format */ const char *out_res; /* name of output solution file in raw format */ const char *out_ranges; /* name of output file to write sensitivity analysis report */ int check; /* input data checking flag; no solution is performed */ const char *new_name; /* new name to be assigned to the problem */ #if 1 /* 18/I-2018 */ int hide; /* clear all symbolic names in the problem object */ #endif const char *out_mps; /* name of output problem file in fixed MPS format */ const char *out_freemps; /* name of output problem file in free MPS format */ const char *out_cpxlp; /* name of output problem file in CPLEX LP format */ const char *out_glp; /* name of output problem file in GLPK format */ #if 0 const char *out_pb; /* name of output problem file in OPB format */ const char *out_npb; /* name of output problem file in normalized OPB format */ #endif #if 1 /* 06/VIII-2011 */ const char *out_cnf; /* name of output problem file in DIMACS CNF-SAT format */ #endif const char *log_file; /* name of output file to hardcopy terminal output */ int crash; /* initial basis option: */ #define USE_STD_BASIS 1 /* use standard basis */ #define USE_ADV_BASIS 2 /* use advanced basis */ #define USE_CPX_BASIS 3 /* use Bixby's basis */ #define USE_INI_BASIS 4 /* use initial basis from ini_file */ const char *ini_file; /* name of input file containing initial basis */ int exact; /* flag to use glp_exact rather than glp_simplex */ int xcheck; /* flag to check final basis with glp_exact */ int nomip; /* flag to consider MIP as pure LP */ #if 1 /* 15/VIII-2011 */ int minisat; /* option to solve feasibility problem with MiniSat solver */ int use_bnd; /* option to bound objective function */ int obj_bnd; /* upper (minization) or lower (maximization) objective bound */ #endif #if 1 /* 11/VII-2013 */ const char *use_sol; /* name of input mip solution file in GLPK format */ #endif }; static int str2int(const char *s, int *x) { /* convert string to integer */ long t; char *endptr; t = strtol(s, &endptr, 10); if (*endptr != '\0') return 2; if (!(INT_MIN <= t && t <= INT_MAX)) return 1; *x = t; #if 0 xprintf("str2int: x = %d\n", *x); #endif return 0; } static int str2num(const char *s, double *x) { /* convert string to floating point */ double t; char *endptr; t = strtod(s, &endptr); if (*endptr != '\0') return 2; if (!(-DBL_MAX <= t && t <= +DBL_MAX)) return 1; *x = t; #if 0 xprintf("str2num: x = %g\n", *x); #endif return 0; } static void print_help(const char *my_name) { /* print help information */ xprintf("Usage: %s [options...] filename\n", my_name); xprintf("\n"); xprintf("General options:\n"); xprintf(" --mps read LP/MIP problem in fixed MPS fo" "rmat\n"); xprintf(" --freemps read LP/MIP problem in free MPS for" "mat (default)\n"); xprintf(" --lp read LP/MIP problem in CPLEX LP for" "mat\n"); xprintf(" --glp read LP/MIP problem in GLPK format " "\n"); xprintf(" --math read LP/MIP model written in GNU Ma" "thProg modeling\n"); xprintf(" language\n"); xprintf(" -m filename, --model filename\n"); xprintf(" read model section and optional dat" "a section from\n"); xprintf(" filename (same as --math)\n"); xprintf(" -d filename, --data filename\n"); xprintf(" read data section from filename (fo" "r --math only);\n"); xprintf(" if model file also has data section" ", it is ignored\n"); xprintf(" -y filename, --display filename\n"); xprintf(" send display output to filename (fo" "r --math only);\n"); xprintf(" by default the output is sent to te" "rminal\n"); xprintf(" --seed value initialize pseudo-random number gen" "erator used in\n"); xprintf(" MathProg model with specified seed " "(any integer);\n"); xprintf(" if seed value is ?, some random see" "d will be used\n"); xprintf(" --mincost read min-cost flow problem in DIMAC" "S format\n"); xprintf(" --maxflow read maximum flow problem in DIMACS" " format\n"); #if 1 /* 06/VIII-2011 */ xprintf(" --cnf read CNF-SAT problem in DIMACS form" "at\n"); #endif xprintf(" --simplex use simplex method (default)\n"); xprintf(" --interior use interior point method (LP only)" "\n"); xprintf(" -r filename, --read filename\n"); xprintf(" read solution from filename rather " "to find it with\n"); xprintf(" the solver\n"); xprintf(" --min minimization\n"); xprintf(" --max maximization\n"); xprintf(" --scale scale problem (default)\n"); xprintf(" --noscale do not scale problem\n"); xprintf(" -o filename, --output filename\n"); xprintf(" write solution to filename in print" "able format\n"); xprintf(" -w filename, --write filename\n"); xprintf(" write solution to filename in plain" " text format\n"); xprintf(" --ranges filename\n"); xprintf(" write sensitivity analysis report t" "o filename in\n"); xprintf(" printable format (simplex only)\n"); xprintf(" --tmlim nnn limit solution time to nnn seconds " "\n"); xprintf(" --memlim nnn limit available memory to nnn megab" "ytes\n"); xprintf(" --check do not solve problem, check input d" "ata only\n"); xprintf(" --name probname change problem name to probname\n"); #if 1 /* 18/I-2018 */ xprintf(" --hide remove all symbolic names from prob" "lem object\n"); #endif xprintf(" --wmps filename write problem to filename in fixed " "MPS format\n"); xprintf(" --wfreemps filename\n"); xprintf(" write problem to filename in free M" "PS format\n"); xprintf(" --wlp filename write problem to filename in CPLEX " "LP format\n"); xprintf(" --wglp filename write problem to filename in GLPK f" "ormat\n"); #if 0 xprintf(" --wpb filename write problem to filename in OPB fo" "rmat\n"); xprintf(" --wnpb filename write problem to filename in normal" "ized OPB format\n"); #endif #if 1 /* 06/VIII-2011 */ xprintf(" --wcnf filename write problem to filename in DIMACS" " CNF-SAT format\n"); #endif xprintf(" --log filename write copy of terminal output to fi" "lename\n"); xprintf(" -h, --help display this help information and e" "xit\n"); xprintf(" -v, --version display program version and exit\n") ; xprintf("\n"); xprintf("LP basis factorization options:\n"); #if 0 /* 08/III-2014 */ xprintf(" --luf LU + Forrest-Tomlin update\n"); xprintf(" (faster, less stable; default)\n"); xprintf(" --cbg LU + Schur complement + Bartels-Gol" "ub update\n"); xprintf(" (slower, more stable)\n"); xprintf(" --cgr LU + Schur complement + Givens rota" "tion update\n"); xprintf(" (slower, more stable)\n"); #else xprintf(" --luf plain LU-factorization (default)\n") ; xprintf(" --btf block triangular LU-factorization\n" ); xprintf(" --ft Forrest-Tomlin update (requires --l" "uf; default)\n"); xprintf(" --cbg Schur complement + Bartels-Golub up" "date\n"); xprintf(" --cgr Schur complement + Givens rotation " "update\n"); #endif xprintf("\n"); xprintf("Options specific to simplex solver:\n"); xprintf(" --primal use primal simplex (default)\n"); xprintf(" --dual use dual simplex\n"); xprintf(" --std use standard initial basis of all s" "lacks\n"); xprintf(" --adv use advanced initial basis (default" ")\n"); xprintf(" --bib use Bixby's initial basis\n"); xprintf(" --ini filename use as initial basis previously sav" "ed with -w\n"); xprintf(" (disables LP presolver)\n"); xprintf(" --steep use steepest edge technique (defaul" "t)\n"); xprintf(" --nosteep use standard \"textbook\" pricing\n" ); xprintf(" --relax use Harris' two-pass ratio test (de" "fault)\n"); xprintf(" --norelax use standard \"textbook\" ratio tes" "t\n"); #if 0 /* 23/VI-2017 */ #if 1 /* 28/III-2016 */ xprintf(" --flip use flip-flop ratio test (assumes -" "-dual)\n"); #endif #else /* now this option is implemented in both primal and dual */ xprintf(" --flip use long-step ratio test\n"); #endif xprintf(" --presol use presolver (default; assumes --s" "cale and --adv)\n"); xprintf(" --nopresol do not use presolver\n"); xprintf(" --exact use simplex method based on exact a" "rithmetic\n"); xprintf(" --xcheck check final basis using exact arith" "metic\n"); xprintf("\n"); xprintf("Options specific to interior-point solver:\n"); xprintf(" --nord use natural (original) ordering\n"); xprintf(" --qmd use quotient minimum degree orderin" "g\n"); xprintf(" --amd use approximate minimum degree orde" "ring (default)\n"); xprintf(" --symamd use approximate minimum degree orde" "ring\n"); xprintf("\n"); xprintf("Options specific to MIP solver:\n"); xprintf(" --nomip consider all integer variables as c" "ontinuous\n"); xprintf(" (allows solving MIP as pure LP)\n"); xprintf(" --first branch on first integer variable\n") ; xprintf(" --last branch on last integer variable\n"); xprintf(" --mostf branch on most fractional variable " "\n"); xprintf(" --drtom branch using heuristic by Driebeck " "and Tomlin\n"); xprintf(" (default)\n"); xprintf(" --pcost branch using hybrid pseudocost heur" "istic (may be\n"); xprintf(" useful for hard instances)\n"); xprintf(" --dfs backtrack using depth first search " "\n"); xprintf(" --bfs backtrack using breadth first searc" "h\n"); xprintf(" --bestp backtrack using the best projection" " heuristic\n"); xprintf(" --bestb backtrack using node with best loca" "l bound\n"); xprintf(" (default)\n"); xprintf(" --intopt use MIP presolver (default)\n"); xprintf(" --nointopt do not use MIP presolver\n"); xprintf(" --binarize replace general integer variables b" "y binary ones\n"); xprintf(" (assumes --intopt)\n"); xprintf(" --fpump apply feasibility pump heuristic\n") ; #if 1 /* 29/VI-2013 */ xprintf(" --proxy [nnn] apply proximity search heuristic (n" "nn is time limit\n"); xprintf(" in seconds; default is 60)\n"); #endif xprintf(" --gomory generate Gomory's mixed integer cut" "s\n"); xprintf(" --mir generate MIR (mixed integer roundin" "g) cuts\n"); xprintf(" --cover generate mixed cover cuts\n"); xprintf(" --clique generate clique cuts\n"); xprintf(" --cuts generate all cuts above\n"); xprintf(" --mipgap tol set relative mip gap tolerance to t" "ol\n"); #if 1 /* 15/VIII-2011 */ xprintf(" --minisat translate integer feasibility probl" "em to CNF-SAT\n"); xprintf(" and solve it with MiniSat solver\n") ; xprintf(" --objbnd bound add inequality obj <= bound (minimi" "zation) or\n"); xprintf(" obj >= bound (maximization) to inte" "ger feasibility\n"); xprintf(" problem (assumes --minisat)\n"); #endif xprintf("\n"); xprintf("For description of the MPS and CPLEX LP formats see Refe" "rence Manual.\n"); xprintf("For description of the modeling language see \"GLPK: Mod" "eling Language\n"); xprintf("GNU MathProg\". Both documents are included in the GLPK " "distribution.\n"); xprintf("\n"); xprintf("See GLPK web page at .\n"); xprintf("\n"); xprintf("Please report bugs to .\n"); return; } static void print_version(int briefly) { /* print version information */ xprintf("GLPSOL--GLPK LP/MIP Solver %s\n", glp_version()); if (briefly) goto done; xprintf("Copyright (C) 2000-2020 Free Software Foundation, Inc.\n" ); xprintf("\n"); xprintf("This program has ABSOLUTELY NO WARRANTY.\n"); xprintf("\n"); xprintf("This program is free software; you may re-distribute it " "under the terms\n"); xprintf("of the GNU General Public License version 3 or later.\n") ; done: return; } static int parse_cmdline(struct csa *csa, int argc, char *argv[]) { /* parse command-line parameters */ int k; #define p(str) (strcmp(argv[k], str) == 0) for (k = 1; k < argc; k++) { if (p("--mps")) csa->format = FMT_MPS_DECK; else if (p("--freemps")) csa->format = FMT_MPS_FILE; else if (p("--lp") || p("--cpxlp")) csa->format = FMT_LP; else if (p("--glp")) csa->format = FMT_GLP; else if (p("--math") || p("-m") || p("--model")) csa->format = FMT_MATHPROG; else if (p("-d") || p("--data")) { k++; if (k == argc || argv[k][0] == '\0' || argv[k][0] == '-') { xprintf("No input data file specified\n"); return 1; } if (csa->ndf == DATA_MAX) { xprintf("Too many input data files\n"); return 1; } csa->in_data[++(csa->ndf)] = argv[k]; } else if (p("-y") || p("--display")) { k++; if (k == argc || argv[k][0] == '\0' || argv[k][0] == '-') { xprintf("No display output file specified\n"); return 1; } if (csa->out_dpy != NULL) { xprintf("Only one display output file allowed\n"); return 1; } csa->out_dpy = argv[k]; } else if (p("--seed")) { k++; if (k == argc || argv[k][0] == '\0' || argv[k][0] == '-' && !isdigit((unsigned char)argv[k][1])) { xprintf("No seed value specified\n"); return 1; } if (strcmp(argv[k], "?") == 0) csa->seed = 0x80000000; else if (str2int(argv[k], &csa->seed)) { xprintf("Invalid seed value '%s'\n", argv[k]); return 1; } } else if (p("--mincost")) csa->format = FMT_MIN_COST; else if (p("--maxflow")) csa->format = FMT_MAX_FLOW; #if 1 /* 06/VIII-2011 */ else if (p("--cnf")) csa->format = FMT_CNF; #endif else if (p("--simplex")) csa->solution = SOL_BASIC; else if (p("--interior")) csa->solution = SOL_INTERIOR; #if 1 /* 28/V-2010 */ else if (p("--alien")) csa->iocp.alien = GLP_ON; #endif else if (p("-r") || p("--read")) { k++; if (k == argc || argv[k][0] == '\0' || argv[k][0] == '-') { xprintf("No input solution file specified\n"); return 1; } if (csa->in_res != NULL) { xprintf("Only one input solution file allowed\n"); return 1; } csa->in_res = argv[k]; } else if (p("--min")) csa->dir = GLP_MIN; else if (p("--max")) csa->dir = GLP_MAX; else if (p("--scale")) csa->scale = 1; else if (p("--noscale")) csa->scale = 0; else if (p("-o") || p("--output")) { k++; if (k == argc || argv[k][0] == '\0' || argv[k][0] == '-') { xprintf("No output solution file specified\n"); return 1; } if (csa->out_sol != NULL) { xprintf("Only one output solution file allowed\n"); return 1; } csa->out_sol = argv[k]; } else if (p("-w") || p("--write")) { k++; if (k == argc || argv[k][0] == '\0' || argv[k][0] == '-') { xprintf("No output solution file specified\n"); return 1; } if (csa->out_res != NULL) { xprintf("Only one output solution file allowed\n"); return 1; } csa->out_res = argv[k]; } else if (p("--ranges") || p("--bounds")) { k++; if (k == argc || argv[k][0] == '\0' || argv[k][0] == '-') { xprintf("No output file specified to write sensitivity a" "nalysis report\n"); return 1; } if (csa->out_ranges != NULL) { xprintf("Only one output file allowed to write sensitivi" "ty analysis report\n"); return 1; } csa->out_ranges = argv[k]; } else if (p("--tmlim")) { int tm_lim; k++; if (k == argc || argv[k][0] == '\0' || argv[k][0] == '-') { xprintf("No time limit specified\n"); return 1; } if (str2int(argv[k], &tm_lim) || tm_lim < 0) { xprintf("Invalid time limit '%s'\n", argv[k]); return 1; } if (tm_lim <= INT_MAX / 1000) csa->smcp.tm_lim = csa->iocp.tm_lim = 1000 * tm_lim; else csa->smcp.tm_lim = csa->iocp.tm_lim = INT_MAX; } else if (p("--memlim")) { int mem_lim; k++; if (k == argc || argv[k][0] == '\0' || argv[k][0] == '-') { xprintf("No memory limit specified\n"); return 1; } if (str2int(argv[k], &mem_lim) || mem_lim < 1) { xprintf("Invalid memory limit '%s'\n", argv[k]); return 1; } glp_mem_limit(mem_lim); } else if (p("--check")) csa->check = 1; else if (p("--name")) { k++; if (k == argc || argv[k][0] == '\0' || argv[k][0] == '-') { xprintf("No problem name specified\n"); return 1; } if (csa->new_name != NULL) { xprintf("Only one problem name allowed\n"); return 1; } csa->new_name = argv[k]; } #if 1 /* 18/I-2018 */ else if (p("--hide")) csa->hide = 1; #endif else if (p("--wmps")) { k++; if (k == argc || argv[k][0] == '\0' || argv[k][0] == '-') { xprintf("No fixed MPS output file specified\n"); return 1; } if (csa->out_mps != NULL) { xprintf("Only one fixed MPS output file allowed\n"); return 1; } csa->out_mps = argv[k]; } else if (p("--wfreemps")) { k++; if (k == argc || argv[k][0] == '\0' || argv[k][0] == '-') { xprintf("No free MPS output file specified\n"); return 1; } if (csa->out_freemps != NULL) { xprintf("Only one free MPS output file allowed\n"); return 1; } csa->out_freemps = argv[k]; } else if (p("--wlp") || p("--wcpxlp") || p("--wlpt")) { k++; if (k == argc || argv[k][0] == '\0' || argv[k][0] == '-') { xprintf("No CPLEX LP output file specified\n"); return 1; } if (csa->out_cpxlp != NULL) { xprintf("Only one CPLEX LP output file allowed\n"); return 1; } csa->out_cpxlp = argv[k]; } else if (p("--wglp")) { k++; if (k == argc || argv[k][0] == '\0' || argv[k][0] == '-') { xprintf("No GLPK LP/MIP output file specified\n"); return 1; } if (csa->out_glp != NULL) { xprintf("Only one GLPK LP/MIP output file allowed\n"); return 1; } csa->out_glp = argv[k]; } #if 0 else if (p("--wpb")) { k++; if (k == argc || argv[k][0] == '\0' || argv[k][0] == '-') { xprintf("No problem output file specified\n"); return 1; } if (csa->out_pb != NULL) { xprintf("Only one OPB output file allowed\n"); return 1; } csa->out_pb = argv[k]; } else if (p("--wnpb")) { k++; if (k == argc || argv[k][0] == '\0' || argv[k][0] == '-') { xprintf("No problem output file specified\n"); return 1; } if (csa->out_npb != NULL) { xprintf("Only one normalized OPB output file allowed\n"); return 1; } csa->out_npb = argv[k]; } #endif #if 1 /* 06/VIII-2011 */ else if (p("--wcnf")) { k++; if (k == argc || argv[k][0] == '\0' || argv[k][0] == '-') { xprintf("No problem output file specified\n"); return 1; } if (csa->out_cnf != NULL) { xprintf("Only one output DIMACS CNF-SAT file allowed\n"); return 1; } csa->out_cnf = argv[k]; } #endif else if (p("--log")) { k++; if (k == argc || argv[k][0] == '\0' || argv[k][0] == '-') { xprintf("No log file specified\n"); return 1; } if (csa->log_file != NULL) { xprintf("Only one log file allowed\n"); return 1; } csa->log_file = argv[k]; } else if (p("-h") || p("--help")) { print_help(argv[0]); return -1; } else if (p("-v") || p("--version")) { print_version(0); return -1; } #if 0 /* 08/III-2014 */ else if (p("--luf")) csa->bfcp.type = GLP_BF_FT; else if (p("--cbg")) csa->bfcp.type = GLP_BF_BG; else if (p("--cgr")) csa->bfcp.type = GLP_BF_GR; #else else if (p("--luf")) { csa->bfcp.type &= 0x0F; csa->bfcp.type |= GLP_BF_LUF; } else if (p("--btf")) { csa->bfcp.type &= 0x0F; csa->bfcp.type |= GLP_BF_BTF; } else if (p("--ft")) { csa->bfcp.type &= 0xF0; csa->bfcp.type |= GLP_BF_FT; } else if (p("--cbg")) { csa->bfcp.type &= 0xF0; csa->bfcp.type |= GLP_BF_BG; } else if (p("--cgr")) { csa->bfcp.type &= 0xF0; csa->bfcp.type |= GLP_BF_GR; } #endif else if (p("--primal")) csa->smcp.meth = GLP_PRIMAL; else if (p("--dual")) csa->smcp.meth = GLP_DUAL; else if (p("--std")) csa->crash = USE_STD_BASIS; else if (p("--adv")) csa->crash = USE_ADV_BASIS; else if (p("--bib")) csa->crash = USE_CPX_BASIS; else if (p("--ini")) { csa->crash = USE_INI_BASIS; csa->smcp.presolve = GLP_OFF; k++; if (k == argc || argv[k][0] == '\0' || argv[k][0] == '-') { xprintf("No initial basis file specified\n"); return 1; } if (csa->ini_file != NULL) { xprintf("Only one initial basis file allowed\n"); return 1; } csa->ini_file = argv[k]; } else if (p("--steep")) csa->smcp.pricing = GLP_PT_PSE; else if (p("--nosteep")) csa->smcp.pricing = GLP_PT_STD; else if (p("--relax")) csa->smcp.r_test = GLP_RT_HAR; else if (p("--norelax")) csa->smcp.r_test = GLP_RT_STD; #if 1 /* 28/III-2016 */ else if (p("--flip")) #if 0 /* 23/VI-2017 */ { csa->smcp.meth = GLP_DUAL; #else /* now this option is implemented in both primal and dual */ { #endif csa->smcp.r_test = GLP_RT_FLIP; csa->iocp.flip = GLP_ON; } #endif else if (p("--presol")) csa->smcp.presolve = GLP_ON; else if (p("--nopresol")) csa->smcp.presolve = GLP_OFF; else if (p("--exact")) csa->exact = 1; else if (p("--xcheck")) csa->xcheck = 1; else if (p("--nord")) csa->iptcp.ord_alg = GLP_ORD_NONE; else if (p("--qmd")) csa->iptcp.ord_alg = GLP_ORD_QMD; else if (p("--amd")) csa->iptcp.ord_alg = GLP_ORD_AMD; else if (p("--symamd")) csa->iptcp.ord_alg = GLP_ORD_SYMAMD; else if (p("--nomip")) csa->nomip = 1; else if (p("--first")) csa->iocp.br_tech = GLP_BR_FFV; else if (p("--last")) csa->iocp.br_tech = GLP_BR_LFV; else if (p("--drtom")) csa->iocp.br_tech = GLP_BR_DTH; else if (p("--mostf")) csa->iocp.br_tech = GLP_BR_MFV; else if (p("--pcost")) csa->iocp.br_tech = GLP_BR_PCH; else if (p("--dfs")) csa->iocp.bt_tech = GLP_BT_DFS; else if (p("--bfs")) csa->iocp.bt_tech = GLP_BT_BFS; else if (p("--bestp")) csa->iocp.bt_tech = GLP_BT_BPH; else if (p("--bestb")) csa->iocp.bt_tech = GLP_BT_BLB; else if (p("--intopt")) csa->iocp.presolve = GLP_ON; else if (p("--nointopt")) csa->iocp.presolve = GLP_OFF; else if (p("--binarize")) csa->iocp.presolve = csa->iocp.binarize = GLP_ON; else if (p("--fpump")) csa->iocp.fp_heur = GLP_ON; #if 1 /* 29/VI-2013 */ else if (p("--proxy")) { csa->iocp.ps_heur = GLP_ON; if (argv[k+1] && isdigit((unsigned char)argv[k+1][0])) { int nnn; k++; if (str2int(argv[k], &nnn) || nnn < 1) { xprintf("Invalid proxy time limit '%s'\n", argv[k]); return 1; } csa->iocp.ps_tm_lim = 1000 * nnn; } } #endif else if (p("--gomory")) csa->iocp.gmi_cuts = GLP_ON; else if (p("--mir")) csa->iocp.mir_cuts = GLP_ON; else if (p("--cover")) csa->iocp.cov_cuts = GLP_ON; else if (p("--clique")) csa->iocp.clq_cuts = GLP_ON; else if (p("--cuts")) csa->iocp.gmi_cuts = csa->iocp.mir_cuts = csa->iocp.cov_cuts = csa->iocp.clq_cuts = GLP_ON; else if (p("--mipgap")) { double mip_gap; k++; if (k == argc || argv[k][0] == '\0' || argv[k][0] == '-') { xprintf("No relative gap tolerance specified\n"); return 1; } if (str2num(argv[k], &mip_gap) || mip_gap < 0.0) { xprintf("Invalid relative mip gap tolerance '%s'\n", argv[k]); return 1; } csa->iocp.mip_gap = mip_gap; } #if 1 /* 15/VIII-2011 */ else if (p("--minisat")) csa->minisat = 1; else if (p("--objbnd")) { k++; if (k == argc || argv[k][0] == '\0' || argv[k][0] == '-' && !isdigit((unsigned char)argv[k][1])) { xprintf("No objective bound specified\n"); return 1; } csa->minisat = 1; csa->use_bnd = 1; if (str2int(argv[k], &csa->obj_bnd)) { xprintf("Invalid objective bound '%s' (should be integer" " value)\n", argv[k]); return 1; } } #endif #if 1 /* 11/VII-2013 */ else if (p("--use")) { k++; if (k == argc || argv[k][0] == '\0' || argv[k][0] == '-') { xprintf("No input MIP solution file specified\n"); return 1; } if (csa->use_sol != NULL) { xprintf("Only one input MIP solution file allowed\n"); return 1; } csa->use_sol = argv[k]; } else if (p("--save")) { k++; if (k == argc || argv[k][0] == '\0' || argv[k][0] == '-') { xprintf("No output MIP solution file specified\n"); return 1; } if (csa->iocp.save_sol != NULL) { xprintf("Only one output MIP solution file allowed\n"); return 1; } csa->iocp.save_sol = argv[k]; } #endif else if (argv[k][0] == '-' || (argv[k][0] == '-' && argv[k][1] == '-')) { xprintf("Invalid option '%s'; try %s --help\n", argv[k], argv[0]); return 1; } else { if (csa->in_file != NULL) { xprintf("Only one input problem file allowed\n"); return 1; } csa->in_file = argv[k]; } } #undef p return 0; } typedef struct { double rhs, pi; } v_data; typedef struct { double low, cap, cost, x; } a_data; #ifndef __WOE__ int main(int argc, char *argv[]) #else int __cdecl main(int argc, char *argv[]) #endif { /* stand-alone LP/MIP solver */ struct csa _csa, *csa = &_csa; int ret; #if 0 /* 10/VI-2013 */ glp_long start; #else double start; #endif /* perform initialization */ csa->prob = glp_create_prob(); glp_get_bfcp(csa->prob, &csa->bfcp); glp_init_smcp(&csa->smcp); csa->smcp.presolve = GLP_ON; glp_init_iptcp(&csa->iptcp); glp_init_iocp(&csa->iocp); csa->iocp.presolve = GLP_ON; csa->tran = NULL; csa->graph = NULL; csa->format = FMT_MPS_FILE; csa->in_file = NULL; csa->ndf = 0; csa->out_dpy = NULL; csa->seed = 1; csa->solution = SOL_BASIC; csa->in_res = NULL; csa->dir = 0; csa->scale = 1; csa->out_sol = NULL; csa->out_res = NULL; csa->out_ranges = NULL; csa->check = 0; csa->new_name = NULL; #if 1 /* 18/I-2018 */ csa->hide = 0; #endif csa->out_mps = NULL; csa->out_freemps = NULL; csa->out_cpxlp = NULL; csa->out_glp = NULL; #if 0 csa->out_pb = NULL; csa->out_npb = NULL; #endif #if 1 /* 06/VIII-2011 */ csa->out_cnf = NULL; #endif csa->log_file = NULL; csa->crash = USE_ADV_BASIS; csa->ini_file = NULL; csa->exact = 0; csa->xcheck = 0; csa->nomip = 0; #if 1 /* 15/VIII-2011 */ csa->minisat = 0; csa->use_bnd = 0; csa->obj_bnd = 0; #endif #if 1 /* 11/VII-2013 */ csa->use_sol = NULL; #endif /* parse command-line parameters */ ret = parse_cmdline(csa, argc, argv); if (ret < 0) { ret = EXIT_SUCCESS; goto done; } if (ret > 0) { ret = EXIT_FAILURE; goto done; } /*--------------------------------------------------------------*/ /* remove all output files specified in the command line */ if (csa->out_dpy != NULL) remove(csa->out_dpy); if (csa->out_sol != NULL) remove(csa->out_sol); if (csa->out_res != NULL) remove(csa->out_res); if (csa->out_ranges != NULL) remove(csa->out_ranges); if (csa->out_mps != NULL) remove(csa->out_mps); if (csa->out_freemps != NULL) remove(csa->out_freemps); if (csa->out_cpxlp != NULL) remove(csa->out_cpxlp); if (csa->out_glp != NULL) remove(csa->out_glp); #if 0 if (csa->out_pb != NULL) remove(csa->out_pb); if (csa->out_npb != NULL) remove(csa->out_npb); #endif #if 1 /* 06/VIII-2011 */ if (csa->out_cnf != NULL) remove(csa->out_cnf); #endif if (csa->log_file != NULL) remove(csa->log_file); /*--------------------------------------------------------------*/ /* open log file, if required */ if (csa->log_file != NULL) { if (glp_open_tee(csa->log_file)) { xprintf("Unable to create log file\n"); ret = EXIT_FAILURE; goto done; } } /*--------------------------------------------------------------*/ /* print version information */ print_version(1); /*--------------------------------------------------------------*/ /* print parameters specified in the command line */ if (argc > 1) { int k, len = INT_MAX; xprintf("Parameter(s) specified in the command line:"); for (k = 1; k < argc; k++) { if (len > 72) xprintf("\n"), len = 0; xprintf(" %s", argv[k]); len += 1 + strlen(argv[k]); } xprintf("\n"); } /*--------------------------------------------------------------*/ /* read problem data from the input file */ if (csa->in_file == NULL) { xprintf("No input problem file specified; try %s --help\n", argv[0]); ret = EXIT_FAILURE; goto done; } if (csa->format == FMT_MPS_DECK) { ret = glp_read_mps(csa->prob, GLP_MPS_DECK, NULL, csa->in_file); if (ret != 0) err1: { xprintf("MPS file processing error\n"); ret = EXIT_FAILURE; goto done; } } else if (csa->format == FMT_MPS_FILE) { ret = glp_read_mps(csa->prob, GLP_MPS_FILE, NULL, csa->in_file); if (ret != 0) goto err1; } else if (csa->format == FMT_LP) { ret = glp_read_lp(csa->prob, NULL, csa->in_file); if (ret != 0) { xprintf("CPLEX LP file processing error\n"); ret = EXIT_FAILURE; goto done; } } else if (csa->format == FMT_GLP) { ret = glp_read_prob(csa->prob, 0, csa->in_file); if (ret != 0) { xprintf("GLPK LP/MIP file processing error\n"); ret = EXIT_FAILURE; goto done; } } else if (csa->format == FMT_MATHPROG) { int k; /* allocate the translator workspace */ csa->tran = glp_mpl_alloc_wksp(); /* set seed value */ if (csa->seed == 0x80000000) #if 0 /* 10/VI-2013 */ { csa->seed = glp_time().lo; #else { csa->seed = (int)fmod(glp_time(), 1000000000.0); #endif xprintf("Seed value %d will be used\n", csa->seed); } glp_mpl_init_rand(csa->tran, csa->seed); /* read model section and optional data section */ if (glp_mpl_read_model(csa->tran, csa->in_file, csa->ndf > 0)) err2: { xprintf("MathProg model processing error\n"); ret = EXIT_FAILURE; goto done; } /* read optional data section(s), if necessary */ for (k = 1; k <= csa->ndf; k++) { if (glp_mpl_read_data(csa->tran, csa->in_data[k])) goto err2; } /* generate the model */ if (glp_mpl_generate(csa->tran, csa->out_dpy)) goto err2; /* build the problem instance from the model */ glp_mpl_build_prob(csa->tran, csa->prob); } else if (csa->format == FMT_MIN_COST) { csa->graph = glp_create_graph(sizeof(v_data), sizeof(a_data)); ret = glp_read_mincost(csa->graph, offsetof(v_data, rhs), offsetof(a_data, low), offsetof(a_data, cap), offsetof(a_data, cost), csa->in_file); if (ret != 0) { xprintf("DIMACS file processing error\n"); ret = EXIT_FAILURE; goto done; } glp_mincost_lp(csa->prob, csa->graph, GLP_ON, offsetof(v_data, rhs), offsetof(a_data, low), offsetof(a_data, cap), offsetof(a_data, cost)); glp_set_prob_name(csa->prob, csa->in_file); } else if (csa->format == FMT_MAX_FLOW) { int s, t; csa->graph = glp_create_graph(sizeof(v_data), sizeof(a_data)); ret = glp_read_maxflow(csa->graph, &s, &t, offsetof(a_data, cap), csa->in_file); if (ret != 0) { xprintf("DIMACS file processing error\n"); ret = EXIT_FAILURE; goto done; } glp_maxflow_lp(csa->prob, csa->graph, GLP_ON, s, t, offsetof(a_data, cap)); glp_set_prob_name(csa->prob, csa->in_file); } #if 1 /* 06/VIII-2011 */ else if (csa->format == FMT_CNF) { ret = glp_read_cnfsat(csa->prob, csa->in_file); if (ret != 0) { xprintf("DIMACS file processing error\n"); ret = EXIT_FAILURE; goto done; } glp_set_prob_name(csa->prob, csa->in_file); } #endif else xassert(csa != csa); /*--------------------------------------------------------------*/ /* change problem name, if required */ if (csa->new_name != NULL) glp_set_prob_name(csa->prob, csa->new_name); /* change optimization direction, if required */ if (csa->dir != 0) glp_set_obj_dir(csa->prob, csa->dir); /* sort elements of the constraint matrix */ glp_sort_matrix(csa->prob); #if 1 /* 18/I-2018 */ /*--------------------------------------------------------------*/ /* remove all symbolic names from problem object, if required */ if (csa->hide) { int i, j; glp_set_obj_name(csa->prob, NULL); glp_delete_index(csa->prob); for (i = glp_get_num_rows(csa->prob); i >= 1; i--) glp_set_row_name(csa->prob, i, NULL); for (j = glp_get_num_cols(csa->prob); j >= 1; j--) glp_set_col_name(csa->prob, j, NULL); } #endif /*--------------------------------------------------------------*/ /* write problem data in fixed MPS format, if required */ if (csa->out_mps != NULL) { ret = glp_write_mps(csa->prob, GLP_MPS_DECK, NULL, csa->out_mps); if (ret != 0) { xprintf("Unable to write problem in fixed MPS format\n"); ret = EXIT_FAILURE; goto done; } } /* write problem data in free MPS format, if required */ if (csa->out_freemps != NULL) { ret = glp_write_mps(csa->prob, GLP_MPS_FILE, NULL, csa->out_freemps); if (ret != 0) { xprintf("Unable to write problem in free MPS format\n"); ret = EXIT_FAILURE; goto done; } } /* write problem data in CPLEX LP format, if required */ if (csa->out_cpxlp != NULL) { ret = glp_write_lp(csa->prob, NULL, csa->out_cpxlp); if (ret != 0) { xprintf("Unable to write problem in CPLEX LP format\n"); ret = EXIT_FAILURE; goto done; } } /* write problem data in GLPK format, if required */ if (csa->out_glp != NULL) { ret = glp_write_prob(csa->prob, 0, csa->out_glp); if (ret != 0) { xprintf("Unable to write problem in GLPK format\n"); ret = EXIT_FAILURE; goto done; } } #if 0 /* write problem data in OPB format, if required */ if (csa->out_pb != NULL) { ret = lpx_write_pb(csa->prob, csa->out_pb, 0, 0); if (ret != 0) { xprintf("Unable to write problem in OPB format\n"); ret = EXIT_FAILURE; goto done; } } /* write problem data in normalized OPB format, if required */ if (csa->out_npb != NULL) { ret = lpx_write_pb(csa->prob, csa->out_npb, 1, 1); if (ret != 0) { xprintf( "Unable to write problem in normalized OPB format\n"); ret = EXIT_FAILURE; goto done; } } #endif #if 1 /* 06/VIII-2011 */ /* write problem data in DIMACS CNF-SAT format, if required */ if (csa->out_cnf != NULL) { ret = glp_write_cnfsat(csa->prob, csa->out_cnf); if (ret != 0) { xprintf( "Unable to write problem in DIMACS CNF-SAT format\n"); ret = EXIT_FAILURE; goto done; } } #endif /*--------------------------------------------------------------*/ /* if only problem data check is required, skip computations */ if (csa->check) { #if 1 /* 29/III-2016 */ /* report problem characteristics */ int j, cnt = 0; xprintf("--- Problem Characteristics ---\n"); xprintf("Number of rows = %8d\n", glp_get_num_rows(csa->prob)); xprintf("Number of columns = %8d\n", glp_get_num_cols(csa->prob)); xprintf("Number of non-zeros (matrix) = %8d\n", glp_get_num_nz(csa->prob)); for (j = glp_get_num_cols(csa->prob); j >= 1; j--) { if (glp_get_obj_coef(csa->prob, j) != 0.0) cnt++; } xprintf("Number of non-zeros (objrow) = %8d\n", cnt); #endif ret = EXIT_SUCCESS; goto done; } /*--------------------------------------------------------------*/ /* determine the solution type */ if (!csa->nomip && glp_get_num_int(csa->prob) + glp_get_num_bin(csa->prob) > 0) { if (csa->solution == SOL_INTERIOR) { xprintf("Interior-point method is not able to solve MIP pro" "blem; use --simplex\n"); ret = EXIT_FAILURE; goto done; } csa->solution = SOL_INTEGER; } /*--------------------------------------------------------------*/ /* if solution is provided, read it and skip computations */ if (csa->in_res != NULL) { if (csa->solution == SOL_BASIC) ret = glp_read_sol(csa->prob, csa->in_res); else if (csa->solution == SOL_INTERIOR) ret = glp_read_ipt(csa->prob, csa->in_res); else if (csa->solution == SOL_INTEGER) ret = glp_read_mip(csa->prob, csa->in_res); else xassert(csa != csa); if (ret != 0) { xprintf("Unable to read problem solution\n"); ret = EXIT_FAILURE; goto done; } goto skip; } #if 1 /* 11/VII-2013 */ /*--------------------------------------------------------------*/ /* if initial MIP solution is provided, read it */ if (csa->solution == SOL_INTEGER && csa->use_sol != NULL) { ret = glp_read_mip(csa->prob, csa->use_sol); if (ret != 0) { xprintf("Unable to read initial MIP solution\n"); ret = EXIT_FAILURE; goto done; } csa->iocp.use_sol = GLP_ON; } #endif /*--------------------------------------------------------------*/ /* scale the problem data, if required */ if (csa->scale) { if (csa->solution == SOL_BASIC && !csa->smcp.presolve || csa->solution == SOL_INTERIOR || csa->solution == SOL_INTEGER && !csa->iocp.presolve) glp_scale_prob(csa->prob, GLP_SF_AUTO); } /*--------------------------------------------------------------*/ /* construct starting LP basis */ if (csa->solution == SOL_BASIC && !csa->smcp.presolve || csa->solution == SOL_INTEGER && !csa->iocp.presolve) { if (csa->crash == USE_STD_BASIS) glp_std_basis(csa->prob); else if (csa->crash == USE_ADV_BASIS) glp_adv_basis(csa->prob, 0); else if (csa->crash == USE_CPX_BASIS) glp_cpx_basis(csa->prob); else if (csa->crash == USE_INI_BASIS) { ret = glp_read_sol(csa->prob, csa->ini_file); if (ret != 0) { xprintf("Unable to read initial basis\n"); ret = EXIT_FAILURE; goto done; } } else xassert(csa != csa); } /*--------------------------------------------------------------*/ /* solve the problem */ start = glp_time(); if (csa->solution == SOL_BASIC) { if (!csa->exact) { glp_set_bfcp(csa->prob, &csa->bfcp); glp_simplex(csa->prob, &csa->smcp); if (csa->xcheck) { if (csa->smcp.presolve && glp_get_status(csa->prob) != GLP_OPT) xprintf("If you need to check final basis for non-opt" "imal solution, use --nopresol\n"); else glp_exact(csa->prob, &csa->smcp); } if (csa->out_sol != NULL || csa->out_res != NULL) { if (csa->smcp.presolve && glp_get_status(csa->prob) != GLP_OPT) xprintf("If you need actual output for non-optimal solut" "ion, use --nopresol\n"); } } else glp_exact(csa->prob, &csa->smcp); } else if (csa->solution == SOL_INTERIOR) glp_interior(csa->prob, &csa->iptcp); #if 1 /* 15/VIII-2011 */ else if (csa->solution == SOL_INTEGER && csa->minisat) { if (glp_check_cnfsat(csa->prob) == 0) glp_minisat1(csa->prob); else glp_intfeas1(csa->prob, csa->use_bnd, csa->obj_bnd); } #endif else if (csa->solution == SOL_INTEGER) { glp_set_bfcp(csa->prob, &csa->bfcp); if (!csa->iocp.presolve) glp_simplex(csa->prob, &csa->smcp); #if 0 csa->iocp.msg_lev = GLP_MSG_DBG; csa->iocp.pp_tech = GLP_PP_NONE; #endif #ifdef GLP_CB_FUNC /* 05/IV-2016 */ { extern void GLP_CB_FUNC(glp_tree *, void *); csa->iocp.cb_func = GLP_CB_FUNC; csa->iocp.cb_info = NULL; } #endif glp_intopt(csa->prob, &csa->iocp); } else xassert(csa != csa); /*--------------------------------------------------------------*/ /* display statistics */ xprintf("Time used: %.1f secs\n", glp_difftime(glp_time(), start)); #if 0 /* 16/II-2012 */ { glp_long tpeak; char buf[50]; glp_mem_usage(NULL, NULL, NULL, &tpeak); xprintf("Memory used: %.1f Mb (%s bytes)\n", xltod(tpeak) / 1048576.0, xltoa(tpeak, buf)); } #else { size_t tpeak; glp_mem_usage(NULL, NULL, NULL, &tpeak); xprintf("Memory used: %.1f Mb (%.0f bytes)\n", (double)tpeak / 1048576.0, (double)tpeak); } #endif /*--------------------------------------------------------------*/ skip: /* postsolve the model, if necessary */ if (csa->tran != NULL) { if (csa->solution == SOL_BASIC) { if (!(glp_get_status(csa->prob) == GLP_OPT || glp_get_status(csa->prob) == GLP_FEAS)) ret = -1; else ret = glp_mpl_postsolve(csa->tran, csa->prob, GLP_SOL); } else if (csa->solution == SOL_INTERIOR) { if (!(glp_ipt_status(csa->prob) == GLP_OPT || glp_ipt_status(csa->prob) == GLP_FEAS)) ret = -1; else ret = glp_mpl_postsolve(csa->tran, csa->prob, GLP_IPT); } else if (csa->solution == SOL_INTEGER) { if (!(glp_mip_status(csa->prob) == GLP_OPT || glp_mip_status(csa->prob) == GLP_FEAS)) ret = -1; else ret = glp_mpl_postsolve(csa->tran, csa->prob, GLP_MIP); } else xassert(csa != csa); if (ret > 0) { xprintf("Model postsolving error\n"); ret = EXIT_FAILURE; goto done; } } /*--------------------------------------------------------------*/ /* write problem solution in printable format, if required */ if (csa->out_sol != NULL) { if (csa->solution == SOL_BASIC) ret = glp_print_sol(csa->prob, csa->out_sol); else if (csa->solution == SOL_INTERIOR) ret = glp_print_ipt(csa->prob, csa->out_sol); else if (csa->solution == SOL_INTEGER) ret = glp_print_mip(csa->prob, csa->out_sol); else xassert(csa != csa); if (ret != 0) { xprintf("Unable to write problem solution\n"); ret = EXIT_FAILURE; goto done; } } /* write problem solution in printable format, if required */ if (csa->out_res != NULL) { if (csa->solution == SOL_BASIC) ret = glp_write_sol(csa->prob, csa->out_res); else if (csa->solution == SOL_INTERIOR) ret = glp_write_ipt(csa->prob, csa->out_res); else if (csa->solution == SOL_INTEGER) ret = glp_write_mip(csa->prob, csa->out_res); else xassert(csa != csa); if (ret != 0) { xprintf("Unable to write problem solution\n"); ret = EXIT_FAILURE; goto done; } } /* write sensitivity analysis report, if required */ if (csa->out_ranges != NULL) { if (csa->solution == SOL_BASIC) { if (glp_get_status(csa->prob) == GLP_OPT) { if (glp_bf_exists(csa->prob)) ranges: { ret = glp_print_ranges(csa->prob, 0, NULL, 0, csa->out_ranges); if (ret != 0) { xprintf("Unable to write sensitivity analysis repo" "rt\n"); ret = EXIT_FAILURE; goto done; } } else { ret = glp_factorize(csa->prob); if (ret == 0) goto ranges; xprintf("Cannot produce sensitivity analysis report d" "ue to error in basis factorization (glp_factorize" " returned %d); try --nopresol\n", ret); } } else xprintf("Cannot produce sensitivity analysis report for " "non-optimal basic solution\n"); } else xprintf("Cannot produce sensitivity analysis report for int" "erior-point or MIP solution\n"); } /*--------------------------------------------------------------*/ /* all seems to be ok */ ret = EXIT_SUCCESS; /*--------------------------------------------------------------*/ done: /* delete the LP/MIP problem object */ if (csa->prob != NULL) glp_delete_prob(csa->prob); /* free the translator workspace, if necessary */ if (csa->tran != NULL) glp_mpl_free_wksp(csa->tran); /* delete the network problem object, if necessary */ if (csa->graph != NULL) glp_delete_graph(csa->graph); #if 0 /* 23/XI-2015 */ xassert(gmp_pool_count() == 0); gmp_free_mem(); #endif /* close log file, if necessary */ if (csa->log_file != NULL) glp_close_tee(); /* check that no memory blocks are still allocated */ #if 0 /* 16/II-2012 */ { int count; glp_long total; glp_mem_usage(&count, NULL, &total, NULL); if (count != 0) xerror("Error: %d memory block(s) were lost\n", count); xassert(count == 0); xassert(total.lo == 0 && total.hi == 0); } #else { int count; size_t total; glp_mem_usage(&count, NULL, &total, NULL); if (count != 0) xerror("Error: %d memory block(s) were lost\n", count); xassert(total == 0); } #endif /* free the GLPK environment */ glp_free_env(); /* return to the control program */ return ret; } /* eof */ glpk-5.0/examples/graceful.mod0000644000062000006210000001154613766346220015620 0ustar maomkpasswd/* Graceful Tree Labeling Problem */ /* Author: Mike Appleby */ /* The Graceful Labeling Problem for a tree G = (V, E), where V is the set of vertices and E is the set of edges, is to find a labeling of the vertices with the integers between 1 and |V| inclusive, such that no two vertices share a label, and such that each edge is uniquely identified by the positive, or absolute difference between the labels of its endpoints. In other words, if vl are the vertex labels and el are the edge labels, then for every edge (u,v) in E, el[u,v]=abs(vl[u] - vl[v]). https://en.wikipedia.org/wiki/Graceful_labeling */ set V; /* set of vertices */ set E within V cross V; /* set of edges */ set N := 1..card(V); /* vertex labels */ set M := 1..card(V)-1; /* edge labels */ var vx{V, N}, binary; /* binary encoding of vertex labels. vx[v,n] == 1 means vertex v has label n. */ s.t. vxa{v in V}: sum{n in N} vx[v,n] = 1; /* each vertex is assigned exactly one label. */ s.t. vxb{n in N}: sum{v in V} vx[v,n] = 1; /* each label is assigned to exactly one vertex. */ var vl{V}, integer, >= 1, <= card(V); /* integer encoding of vertex labels. vl[v] == n means vertex v has label n. */ s.t. vla{v in V}: vl[v] = sum{n in N} n * vx[v,n]; /* by constraint vxa, exactly one of vx[v,n] == 1 and the rest are zero. So if vx[v,3] == 1, then vl[v] = 3. */ var ex{E, M}, binary; /* binary encoding of edge labels. ex[u,v,n] == 1 means edge (u,v) has label n. */ s.t. exa{(u,v) in E}: sum{m in M} ex[u,v,m] = 1; /* each edge is assigned exactly one label. */ s.t. exb{m in M}: sum{(u,v) in E} ex[u,v,m] = 1; /* each label is assigned to exactly one edge. */ var el{E}, integer, >= 1, <= card(E); /* integer encoding of edge labels. el[u,v] == n means edge (u,v) has label n. */ s.t. ela{(u,v) in E}: el[u,v] = sum{m in M} m * ex[u,v,m]; /* similar to vla above, define integer encoding of edge labels in terms of the corresponding binary variable. */ var gt{E}, binary; /* gt[u,v] = 1 if vl[u] > vl[v] else 0. gt helps encode the absolute value constraint, below. */ s.t. elb{(u,v) in E}: el[u,v] >= vl[u] - vl[v]; s.t. elc{(u,v) in E}: el[u,v] <= vl[u] - vl[v] + 2*card(V)*(1-gt[u,v]); s.t. eld{(u,v) in E}: el[u,v] >= vl[v] - vl[u]; s.t. ele{(u,v) in E}: el[u,v] <= vl[v] - vl[u] + 2*card(V)*gt[u,v]; /* These four constraints together model the absolute value constraint of the graceful labeling problem: el[u,v] == abs(vl[u] - vl[v]). However, since the absolute value is a non-linear function, we transform it into a series of linear constraints, as above. To see that these four constraints model the absolute value condition, consider the following cases: if vl[u] > vl[v] and gt[u,v] == 0 then - ele is unsatisfiable, since the constraint ele amounts to el[u,v] <= vl[v] - vl[u] + 0 (since gt[u,v] == 0) <= -1 (since vl[u] > vl[v]) but el[u,v] is declared with lower bound >= 1; hence, the constraints cannot be satisfied if vl[u] > vl[v] and gt[u,v] == 0. if vl[u] > vl[v] and gt[u,v] == 1 then - elb and elc together are equivalent to vl[u] - vl[v] <= el[u,v] <= vl[u] - vl[v], i.e. el[u,v] = vl[u] - vl[v] = abs(vl[u] - vl[v]) (since vl[u] > vl[v]) - eld and elc together are equivalent to vl[v] - vl[u] <= el[u,v] <= vl[v] - vl[u] + 2|V| the tightest possible bounds are -1 <= el[u,v] <= |V|+1 which is satisfied since both bounds are looser than the constraints on el's variable declaration, namely var el{E}, integer, >= 1, <= card(E); where |E| = |V|-1 The cases for vl[v] > vl[u] are similar, but with roles reversed for elb/elc and eld/ele. In other words, when vl[u] > vl[v], then gt[u,v] == 1, elb and elc together model the absolute value constraint, and ele and eld are satisfied due to bounds constraints on el. When vl[v] > vl[u], then gt[u,v] == 0, ele and eld model the absolute value constraint, and elb and elc are satisfied due to bounds constraints on el. Note that vl[u] != vl[v], by a combination of constraints vxa, vxb, and vla. */ solve; check 0 = card(N symdiff setof{v in V} vl[v]); /* every vertex label is assigned to one vertex */ check 0 = card(M symdiff setof{(u,v) in E} el[u,v]); /* every edge label is assigned to one edge */ check {(u,v) in E} el[u,v] = abs(vl[u] - vl[v]); /* every edge label for every edge (u,v) == abs(vl[u] - vl[v]) */ printf "vertices:\n"; for{v in V} { printf "\t%s: %d\n", v, vl[v]; } printf "edges:\n"; printf "\torig\tvlabel\telabel\tabs(u-v)\n"; for{(u,v) in E} { printf "\t(%s,%s)\t(%d,%d)\t%d\t%d\n", u, v, vl[u], vl[v], el[u,v], abs(vl[u]-vl[v]); } data; set V := a b c d e f g; set E := a b, a d, a g, b c, b e, e f; end; glpk-5.0/examples/graph.mod0000644000062000006210000000450713766346220015130 0ustar maomkpasswd/* graph.mod - graph visualization */ /* Written in GNU MathProg by Andrew Makhorin */ /* This model creates a picture in EPS format to visualize a graph. */ param file, symbolic, default "graph.eps"; /* output file to write the picture */ param R, default 2; /* radius to draw vertices, in mm */ param n, integer, > 0; /* number of vertices */ set V, default 1..n; /* set of vertices */ set E, within V cross V; /* set of edges */ param x{i in V}, default 50 * cos((i - 1) / card(V) * 8 * atan(1)); param y{i in V}, default 50 * sin((i - 1) / card(V) * 8 * atan(1)); /* x[i] and y[i] are coordinates of node i, in mm */ param x0 := (min{i in V} x[i]) - R - 3.0; param y0 := (min{i in V} y[i]) - R - 3.0; param x1 := (max{i in V} x[i]) + R + 3.0; param y1 := (max{i in V} y[i]) + R + 3.0; printf "%%!PS-Adobe-3.0 EPSF-3.0\n" > file; printf "%%%%BoundingBox: 0 0 %d %d\n", (72 / 25.4) * (x1 - x0), (72 / 25.4) * (y1 - y0) >> file; printf "/Helvetica findfont 6 scalefont setfont\n" >> file; printf "/mm { 72 mul 25.4 div } def\n" >> file; for {(i,j) in E} { printf "newpath\n" >> file; printf "%g mm %g mm moveto\n", x[i] - x0, y[i] - y0 >> file; printf "%g mm %g mm lineto\n", x[j] - x0, y[j] - y0 >> file; printf "closepath\n" >> file; printf "stroke\n" >> file; } for {i in V} { printf "newpath\n" >> file; printf "%g mm %g mm %g mm 0 360 arc\n", x[i] - x0, y[i] - y0, R >> file; printf "closepath\n" >> file; printf "gsave 1 1 1 setrgbcolor fill grestore\n" >> file; printf "stroke\n" >> file; printf "%g mm %g mm moveto\n", x[i] - (if i <= 9 then 1.2 else 1.8) - x0, y[i] - 0.8 - y0 >> file; printf "( %d ) show\n", i >> file; } printf "showpage\n" >> file; printf "%%%%EOF\n" >> file; data; param : V : x y := 1 0 40 2 38 12 3 24 -32 4 -24 -32 5 -38 12 6 -19 26 7 19 26 8 31 -10 9 0 -32 10 -31 -10 11 -9 12 12 9 12 13 14 -5 14 0 -15 15 -14 -5 16 0 0 ; set E := (1,*) 6 10 16 12 7 (2,*) 7 6 16 13 8 (3,*) 8 7 16 14 9 (4,*) 9 8 16 15 10 (5,*) 10 9 16 11 6 (6,*) 14 (7,*) 15 (8,*) 11 (9,*) 12 (10,*) 13 (11,*) 12 15 (12,*) 13 (13,*) 14 (14,*) 15 ; end; glpk-5.0/examples/hashi.mod0000644000062000006210000001703713766346220015125 0ustar maomkpasswd/* A solver for the Japanese number-puzzle Hashiwokakero * (http://en.wikipedia.org/wiki/Hashiwokakero) * * Sebastian Nowozin , 13th January 2009 */ param n := 25; set rows := 1..n; set cols := 1..n; param givens{rows, cols}, integer, >= 0, <= 8, default 0; /* Set of vertices as (row,col) coordinates */ set V := { (i,j) in { rows, cols }: givens[i,j] != 0 }; /* Set of feasible horizontal edges from (i,j) to (k,l) rightwards */ set Eh := { (i,j,k,l) in { V, V }: i = k and j < l and # Same row and left to right card({ (s,t) in V: s = i and t > j and t < l }) = 0 # No vertex inbetween }; /* Set of feasible vertical edges from (i,j) to (k,l) downwards */ set Ev := { (i,j,k,l) in { V, V }: j = l and i < k and # Same column and top to bottom card({ (s,t) in V: t = j and s > i and s < k }) = 0 # No vertex inbetween }; set E := Eh union Ev; /* Indicators: use edge once/twice */ var xe1{E}, binary; var xe2{E}, binary; /* Constraint: Do not use edge or do use once or do use twice */ s.t. edge_sel{(i,j,k,l) in E}: xe1[i,j,k,l] + xe2[i,j,k,l] <= 1; /* Constraint: There must be as many edges used as the node value */ s.t. satisfy_vertex_demand{(s,t) in V}: sum{(i,j,k,l) in E: (i = s and j = t) or (k = s and l = t)} (xe1[i,j,k,l] + 2.0*xe2[i,j,k,l]) = givens[s,t]; /* Constraint: No crossings */ s.t. no_crossing1{(i,j,k,l) in Eh, (s,t,u,v) in Ev: s < i and u > i and j < t and l > t}: xe1[i,j,k,l] + xe1[s,t,u,v] <= 1; s.t. no_crossing2{(i,j,k,l) in Eh, (s,t,u,v) in Ev: s < i and u > i and j < t and l > t}: xe1[i,j,k,l] + xe2[s,t,u,v] <= 1; s.t. no_crossing3{(i,j,k,l) in Eh, (s,t,u,v) in Ev: s < i and u > i and j < t and l > t}: xe2[i,j,k,l] + xe1[s,t,u,v] <= 1; s.t. no_crossing4{(i,j,k,l) in Eh, (s,t,u,v) in Ev: s < i and u > i and j < t and l > t}: xe2[i,j,k,l] + xe2[s,t,u,v] <= 1; /* Model connectivity by auxiliary network flow problem: * One vertex becomes a target node and all other vertices send a unit flow * to it. The edge selection variables xe1/xe2 are VUB constraints and * therefore xe1/xe2 select the feasible graph for the max-flow problems. */ set node_target := { (s,t) in V: card({ (i,j) in V: i < s or (i = s and j < t) }) = 0}; set node_sources := { (s,t) in V: (s,t) not in node_target }; var flow_forward{ E }, >= 0; var flow_backward{ E }, >= 0; s.t. flow_conservation{ (s,t) in node_target, (p,q) in V }: /* All incoming flows */ - sum{(i,j,k,l) in E: k = p and l = q} flow_forward[i,j,k,l] - sum{(i,j,k,l) in E: i = p and j = q} flow_backward[i,j,k,l] /* All outgoing flows */ + sum{(i,j,k,l) in E: k = p and l = q} flow_backward[i,j,k,l] + sum{(i,j,k,l) in E: i = p and j = q} flow_forward[i,j,k,l] = 0 + (if (p = s and q = t) then card(node_sources) else -1); /* Variable-Upper-Bound (VUB) constraints: xe1/xe2 bound the flows. */ s.t. connectivity_vub1{(i,j,k,l) in E}: flow_forward[i,j,k,l] <= card(node_sources)*(xe1[i,j,k,l] + xe2[i,j,k,l]); s.t. connectivity_vub2{(i,j,k,l) in E}: flow_backward[i,j,k,l] <= card(node_sources)*(xe1[i,j,k,l] + xe2[i,j,k,l]); /* A feasible solution is enough */ minimize cost: 0; solve; /* Output solution graphically */ printf "\nSolution:\n"; for { row in rows } { for { col in cols } { /* First print this cell information: givens or space */ printf{0..0: givens[row,col] != 0} "%d", givens[row,col]; printf{0..0: givens[row,col] = 0 and card({(i,j,k,l) in Eh: i = row and col >= j and col < l and xe1[i,j,k,l] = 1}) = 1} "-"; printf{0..0: givens[row,col] = 0 and card({(i,j,k,l) in Eh: i = row and col >= j and col < l and xe2[i,j,k,l] = 1}) = 1} "="; printf{0..0: givens[row,col] = 0 and card({(i,j,k,l) in Ev: j = col and row >= i and row < k and xe1[i,j,k,l] = 1}) = 1} "|"; printf{0..0: givens[row,col] = 0 and card({(i,j,k,l) in Ev: j = col and row >= i and row < k and xe2[i,j,k,l] = 1}) = 1} '"'; printf{0..0: givens[row,col] = 0 and card({(i,j,k,l) in Eh: i = row and col >= j and col < l and (xe1[i,j,k,l] = 1 or xe2[i,j,k,l] = 1)}) = 0 and card({(i,j,k,l) in Ev: j = col and row >= i and row < k and (xe1[i,j,k,l] = 1 or xe2[i,j,k,l] = 1)}) = 0} " "; /* Now print any edges */ printf{(i,j,k,l) in Eh: i = row and col >= j and col < l and xe1[i,j,k,l] = 1} "-"; printf{(i,j,k,l) in Eh: i = row and col >= j and col < l and xe2[i,j,k,l] = 1} "="; printf{(i,j,k,l) in Eh: i = row and col >= j and col < l and xe1[i,j,k,l] = 0 and xe2[i,j,k,l] = 0} " "; printf{0..0: card({(i,j,k,l) in Eh: i = row and col >= j and col < l}) = 0} " "; } printf "\n"; for { col in cols } { printf{(i,j,k,l) in Ev: j = col and row >= i and row < k and xe1[i,j,k,l] = 1} "|"; printf{(i,j,k,l) in Ev: j = col and row >= i and row < k and xe2[i,j,k,l] = 1} '"'; printf{(i,j,k,l) in Ev: j = col and row >= i and row < k and xe1[i,j,k,l] = 0 and xe2[i,j,k,l] = 0} " "; /* No vertical edges: skip also a field */ printf{0..0: card({(i,j,k,l) in Ev: j = col and row >= i and row < k}) = 0} " "; printf " "; } printf "\n"; } data; /* This is a difficult 25x25 Hashiwokakero. */ param givens : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 := 1 2 . 2 . 2 . . 2 . 2 . . 2 . . . . 2 . 2 . 2 . 2 . 2 . 1 . . . . 2 . . . 4 . . 5 . 2 . . 1 . 2 . 2 . 1 3 2 . . 5 . 4 . . 3 . . . . . 1 . . 4 . 5 . 1 . 1 . 4 . . . . . . . . . . . 1 . 3 . . 1 . . . . . . . . 5 2 . . 6 . 6 . . 8 . 5 . 2 . . 3 . 5 . 7 . . 2 . . 6 . 1 . . . . . . . . . 1 . . 2 . . . . . 1 . . . 3 7 2 . . . . 5 . . 6 . 4 . . 2 . . . 2 . 5 . 4 . 2 . 8 . 2 . 2 . . . . . . . . . . . 3 . . 3 . . . 1 . 2 9 . . . . . . . . . . 4 . 2 . 2 . . 1 . . . 3 . 1 . 10 2 . 3 . . 6 . . 2 . . . . . . . . . . 3 . . . . . 11 . . . . 1 . . 2 . . 5 . . 1 . 4 . 3 . . . . 2 . 4 12 . . 2 . . 1 . . . . . . 5 . 4 . . . . 4 . 3 . . . 13 2 . . . 3 . 1 . . . . . . . . 3 . . 5 . 5 . . 2 . 14 . . . . . 2 . 5 . . 7 . 5 . 3 . 1 . . 1 . . 1 . 4 15 2 . 5 . 3 . . . . 1 . 2 . 1 . . . . 2 . 4 . . 2 . 16 . . . . . 1 . . . . . . . . . . 2 . . 2 . 1 . . 3 17 2 . 6 . 6 . . 2 . . 2 . 2 . 5 . . . . . 2 . . . . 18 . . . . . 1 . . . 3 . . . . . 1 . . 1 . . 4 . 3 . 19 . . 4 . 5 . . 2 . . . 2 . . 6 . 6 . . 3 . . . . 3 20 2 . . . . . . . . . 2 . . 1 . . . . . . 1 . . 1 . 21 . . 3 . . 3 . 5 . 5 . . 4 . 6 . 7 . . 4 . 6 . . 4 22 2 . . . 3 . 5 . 2 . 1 . . . . . . . . . . . . . . 23 . . . . . . . . . 1 . . . . . . 3 . 2 . . 5 . . 5 24 2 . 3 . 3 . 5 . 4 . 3 . 3 . 4 . . 2 . 2 . . . 1 . 25 . 1 . 2 . 2 . . . 2 . 2 . . . 2 . . . . 2 . 2 . 2 ; end; glpk-5.0/examples/huge.mod0000644000062000006210000000104413766346220014750 0ustar maomkpasswd/*Arithmetic Mean of a large number of Integers - or - solve a very large constraint matrix over 1 million rows and columns Nigel_Galloway@operamail.com March 18th., 2008. */ param e := 20; /* set Sample := {-2**e..2**e-1}; */ set Sample := {1..2**e-1}; var Mean; var E{z in Sample}; /* sum of variances is zero */ zumVariance: sum{z in Sample} E[z] = 0; /* Mean + variance[n] = Sample[n] */ variances{z in Sample}: Mean + E[z] = z; solve; printf "The arithmetic mean of the integers from 1 to %d is %f\n", 2**e-1, Mean; end; glpk-5.0/examples/icecream.mps0000644000062000006210000002601013766346220015610 0ustar maomkpasswd*NAME: ICECREAM *ROWS: 17 *COLUMNS: 27 *NONZERO: 264 *OPT SOLN: 962.8214691 *SOURCE: Linear Programming--Ice Cream Blending * Data Processing Application. N.Y.: IBM Corp. *APPLICATION: Ice Cream Blending *COMMENTS: fixed MPS format * encoded by Andrew Makhorin * NAME ICECREAM ROWS N COST $ Minimum cost $ G MIN.BF $ Butterfat lbs L MAX.BF G MIN.MSNF $ Milk solids (nonfat) lbs L MAX.MSNF G MIN.TMS $ Total milk solids lbs L MAX.TMS G MIN.SUG $ Sweetness lbs L MAX.SUG L CSS $ Corn syrup solids lbs G MIN.TS $ Total solids lbs L MAX.TS G MIN.H2O $ Water lbs L MAX.H2O E STAB $ Stabilizer lbs E EMUL $ Emulsifier lbs E YIELD $ Amount to be made lbs COLUMNS * Cream (40%) I1 COST 27.9 MIN.BF .40 MAX.BF .40 MIN.MSNF .054 MAX.MSNF .054 MIN.TMS .454 MAX.TMS .454 MIN.TS .454 MAX.TS .454 MIN.H2O .546 MAX.H2O .546 YIELD 1 * Cream (38%) I2 COST 26.3 MIN.BF .38 MAX.BF .38 MIN.MSNF .056 MAX.MSNF .056 MIN.TMS .436 MAX.TMS .436 MIN.TS .436 MAX.TS .436 MIN.H2O .564 MAX.H2O .564 YIELD 1 * Milk (3.2%) I3 COST 3.2 MIN.BF .032 MAX.BF .032 MIN.MSNF .087 MAX.MSNF .087 MIN.TMS .119 MAX.TMS .119 MIN.TS .119 MAX.TS .119 MIN.H2O .881 MAX.H2O .881 YIELD 1 * Milk (3.4%) I4 COST 3.2 MIN.BF .034 MAX.BF .034 MIN.MSNF .087 MAX.MSNF .087 MIN.TMS .121 MAX.TMS .121 MIN.TS .121 MAX.TS .121 MIN.H2O .879 MAX.H2O .879 YIELD 1 * Milk (3.5%) I5 COST 3.3 MIN.BF .035 MAX.BF .035 MIN.MSNF .087 MAX.MSNF .087 MIN.TMS .122 MAX.TMS .122 MIN.TS .122 MAX.TS .122 MIN.H2O .879 MAX.H2O .879 YIELD 1 * Milk (3.6%) I6 COST 3.3 MIN.BF .036 MAX.BF .036 MIN.MSNF .087 MAX.MSNF .087 MIN.TMS .123 MAX.TMS .123 MIN.TS .123 MAX.TS .123 MIN.H2O .877 MAX.H2O .877 YIELD 1 * Milk (3.7%) I7 COST 3.4 MIN.BF .037 MAX.BF .037 MIN.MSNF .087 MAX.MSNF .087 MIN.TMS .124 MAX.TMS .124 MIN.TS .124 MAX.TS .124 MIN.H2O .876 MAX.H2O .876 YIELD 1 * Milk (3.8%) I8 COST 3.5 MIN.BF .038 MAX.BF .038 MIN.MSNF .087 MAX.MSNF .087 MIN.TMS .125 MAX.TMS .125 MIN.TS .125 MAX.TS .125 MIN.H2O .875 MAX.H2O .875 YIELD 1 * Milk (3.9%) I9 COST 3.5 MIN.BF .039 MAX.BF .039 MIN.MSNF .086 MAX.MSNF .086 MIN.TMS .125 MAX.TMS .125 MIN.TS .125 MAX.TS .125 MIN.H2O .875 MAX.H2O .875 YIELD 1 * Milk (4.0%) I10 COST 3.6 MIN.BF .040 MAX.BF .040 MIN.MSNF .086 MAX.MSNF .086 MIN.TMS .126 MAX.TMS .126 MIN.TS .126 MAX.TS .126 MIN.H2O .874 MAX.H2O .874 YIELD 1 * Milk (4.2%) I11 COST 3.7 MIN.BF .042 MAX.BF .042 MIN.MSNF .086 MAX.MSNF .086 MIN.TMS .128 MAX.TMS .128 MIN.TS .128 MAX.TS .128 MIN.H2O .872 MAX.H2O .872 YIELD 1 * Skim Milk I12 COST 1.8 MIN.MSNF .09 MAX.MSNF .09 MIN.TMS .09 MAX.TMS .09 MIN.TS .09 MAX.TS .09 MIN.H2O .91 MAX.H2O .91 YIELD 1 * Condensed Whole Milk I13 COST 7.6 MIN.BF .08 MAX.BF .08 MIN.MSNF .2 MAX.MSNF .2 MIN.TMS .28 MAX.TMS .28 MIN.TS .28 MAX.TS .28 MIN.H2O .72 MAX.H2O .72 YIELD 1 * Condensed Skim Milk (28%) I14 COST 3.9 MIN.MSNF .28 MAX.MSNF .28 MIN.TMS .28 MAX.TMS .28 MIN.TS .28 MAX.TS .28 MIN.H2O .72 MAX.H2O .72 YIELD 1 * Condensed Skim Milk (30%) I15 COST 4.9 MIN.MSNF .3 MAX.MSNF .3 MIN.TMS .3 MAX.TMS .3 MIN.TS .3 MAX.TS .3 MIN.H2O .7 MAX.H2O .7 YIELD 1 * Condensed Skim Milk (32%) I16 COST 4.5 MIN.MSNF .32 MAX.MSNF .32 MIN.TMS .32 MAX.TMS .32 MIN.TS .32 MAX.TS .32 MIN.H2O .68 MAX.H2O .68 YIELD 1 * Dry Skim Milk I17 COST 14.8 MIN.BF .01 MAX.BF .01 MIN.MSNF .96 MAX.MSNF .96 MIN.TMS .97 MAX.TMS .97 MIN.TS .97 MAX.TS .97 MIN.H2O .03 MAX.H2O .03 YIELD 1 * Dry Buttermilk I18 COST 15.0 MIN.BF .05 MAX.BF .05 MIN.MSNF .92 MAX.MSNF .92 MIN.TMS .97 MAX.TMS .97 MIN.TS .97 MAX.TS .97 MIN.H2O .03 MAX.H2O .03 YIELD 1 * Dry Whey Solids I19 COST 10.7 MIN.MSNF .95 MAX.MSNF .95 MIN.TMS .95 MAX.TMS .95 MIN.TS .95 MAX.TS .95 MIN.H2O .05 MAX.H2O .05 YIELD 1 * Dry Sucrose I20 COST 10.2 MIN.SUG 1.0 MAX.SUG 1.0 MIN.TS 1.0 MAX.TS 1.0 YIELD 1 * Cane Syrup I21 COST 9.9 MIN.SUG .67 MAX.SUG .67 MIN.TS .67 MAX.TS .67 MIN.H2O .33 MAX.H2O .33 YIELD 1 * Corn Sgr. Solids (50% Sweetness) I22 COST 7.0 MIN.SUG .5 MAX.SUG .5 CSS 1.0 MIN.TS 1.0 MAX.TS 1.0 YIELD 1 * Corn Sgr. Solids (45% Sweetness) I23 COST 9.0 MIN.SUG .45 MAX.SUG .45 CSS 1.0 MIN.TS 1.0 MAX.TS 1.0 YIELD 1 * Corn Syrup I24 COST 6.6 MIN.SUG .4 MAX.SUG .4 CSS .8 MIN.TS .8 MAX.TS .8 MIN.H2O .2 MAX.H2O .2 YIELD 1 * Stabilizer I25 COST 55.0 STAB 1.0 YIELD 1 * Emulsifier I26 COST 78.0 EMUL 1.0 YIELD 1 * Water I27 COST 0 MIN.H2O 1.0 MAX.H2O 1.0 YIELD 1 RHS MIN.BF 10 MAX.BF 16 MIN.MSNF 10.5 MAX.MSNF 13 MIN.TMS 20.5 MAX.TMS 25 MIN.SUG 11 MAX.SUG 17 CSS 6 MIN.TS 37.5 MAX.TS 41.5 MIN.H2O 58.5 MAX.H2O 62.5 STAB .37 EMUL .01 YIELD 100 BOUNDS UP I1 10 LO I6 40 UP I19 4 ENDATA glpk-5.0/examples/INDEX0000644000062000006210000000616113766346220014116 0ustar maomkpasswdalloy.mps Aluminium alloy blending assign.mod Assignment problem bpp.mod Bin packing problem cal.mod Print an ASCII calendar of the given year cf12a.mod Curve fitting problem cf12b.mod Curve fitting problem cflsq.mod Curve fitting problem by least squares color.mod Graph coloring problem cpp.mod Critical path problem crypto.mod A crypto-arithmetic puzzle dea.mod Data envelopment analysis (DEA) diet.mod Stigler's nutrition model dist.mod A product distribution model egypt.mod A static model for fertilizer production fctp.mod Fixed-charge transportation problem food.mod Food manufacture model food2.mod Food manufacture model furnace.mps Electric-arc furnace steelmaking gap.mod Generalized assignment problem graceful.mod Graceful Tree Labeling Problem graph.mod Graph visualization hashi.mod A solver for the Japanese number-puzzle Hashiwokakero huge.mod Arithmetic mean of a large number of integers icecream.mps Ice cream blending jssp.mod Job-shop scheduling problem life_goe.mod Conway's Game of Life garden of eden checker magic.mod Magic square maxcut.mod Maximum cut problem maxflow.mod Maximum flow problem mfasp.mod Minimum feedback arc set problem mfvsp.mod Minimum feedback vertex set problem min01ks.mod Finding minimal equivalent 0-1 knapsack inequality misp.mod Maximum independent set problem money.mod A crypto-arithmetic puzzle murtagh.mps Oil refinery model mvcp.mod Minimum vertex cover problem numbrix.mod Number placement puzzle pbn/*.* Paint-by-numbers puzzle pentomino.mod A geometric placement puzzle plan.lp A simple LP problem (CPLEX LP format) plan.mod A simple LP problem (MathProg format) plan.mps A simple LP problem (MPS format) planarity.mod Graph planarity testing powpl25h.mod Power plant LP scheduler (25hrs for daylightsavings) powplant.mod Power plant LP scheduler prod.mod A multiperiod production model qfit.mod Quadratic curve fitting solution queens.mod A classic combinatorial optimization problem sat.mod Satisfiability problem shiftcov.mod Workforce shift coverage assignment problem shikaku.mod A solver for the logic puzzle Shikaku sorting.mod How to sort arrays in MathProg spp.mod Shortest path problem stigler.mod Original Stigler's 1939 diet problem sudoku.mod Number placement puzzle tas.mod Tail assignment problem tiling.mod Rectifiable polyomino tilings generator todd.mod A class of hard instances of 0-1 knapsack problems toto.mod Covering code generator, especially for football pool systems train.mod A model of railroad passenger car allocation transp.mod A transportation problem trick.mod A transportation design problem tsp.mod Traveling salesman problem wolfra6d.lp Neumann CA grid emulator generator wolfra6d.mod Neumann CA grid emulator generator xyacfs.mod Extended yet another curve fitting solution yacfs.mod Yet another curve fitting solution zebra.mod Who owns the zebra? glpk-5.0/examples/iptsamp.c0000644000062000006210000000047513766346220015147 0ustar maomkpasswd/* iptsamp.c */ #include #include #include int main(void) { glp_prob *P; P = glp_create_prob(); glp_read_mps(P, GLP_MPS_DECK, NULL, "25fv47.mps"); glp_interior(P, NULL); glp_print_ipt(P, "25fv47.txt"); glp_delete_prob(P); return 0; } /* eof */ glpk-5.0/examples/jssp.mod0000644000062000006210000000634113766346220015004 0ustar maomkpasswd/* JSSP, Job-Shop Scheduling Problem */ /* Written in GNU MathProg by Andrew Makhorin */ /* The Job-Shop Scheduling Problem (JSSP) is to schedule a set of jobs on a set of machines, subject to the constraint that each machine can handle at most one job at a time and the fact that each job has a specified processing order through the machines. The objective is to schedule the jobs so as to minimize the maximum of their completion times. Reference: D. Applegate and W. Cook, "A Computational Study of the Job-Shop Scheduling Problem", ORSA J. On Comput., Vol. 3, No. 2, Spring 1991, pp. 149-156. */ param n, integer, > 0; /* number of jobs */ param m, integer, > 0; /* number of machines */ set J := 1..n; /* set of jobs */ set M := 1..m; /* set of machines */ param sigma{j in J, t in 1..m}, in M; /* permutation of the machines, which represents the processing order of j through the machines: j must be processed first on sigma[j,1], then on sigma[j,2], etc. */ check{j in J, t1 in 1..m, t2 in 1..m: t1 <> t2}: sigma[j,t1] != sigma[j,t2]; /* sigma must be permutation */ param p{j in J, a in M}, >= 0; /* processing time of j on a */ var x{j in J, a in M}, >= 0; /* starting time of j on a */ s.t. ord{j in J, t in 2..m}: x[j, sigma[j,t]] >= x[j, sigma[j,t-1]] + p[j, sigma[j,t-1]]; /* j can be processed on sigma[j,t] only after it has been completely processed on sigma[j,t-1] */ /* The disjunctive condition that each machine can handle at most one job at a time is the following: x[i,a] >= x[j,a] + p[j,a] or x[j,a] >= x[i,a] + p[i,a] for all i, j in J, a in M. This condition is modeled through binary variables Y as shown below. */ var Y{i in J, j in J, a in M}, binary; /* Y[i,j,a] is 1 if i scheduled before j on machine a, and 0 if j is scheduled before i */ param K := sum{j in J, a in M} p[j,a]; /* some large constant */ display K; s.t. phi{i in J, j in J, a in M: i <> j}: x[i,a] >= x[j,a] + p[j,a] - K * Y[i,j,a]; /* x[i,a] >= x[j,a] + p[j,a] iff Y[i,j,a] is 0 */ s.t. psi{i in J, j in J, a in M: i <> j}: x[j,a] >= x[i,a] + p[i,a] - K * (1 - Y[i,j,a]); /* x[j,a] >= x[i,a] + p[i,a] iff Y[i,j,a] is 1 */ var z; /* so-called makespan */ s.t. fin{j in J}: z >= x[j, sigma[j,m]] + p[j, sigma[j,m]]; /* which is the maximum of the completion times of all the jobs */ minimize obj: z; /* the objective is to make z as small as possible */ data; /* These data correspond to the instance ft06 (mt06) from: H. Fisher, G.L. Thompson (1963), Probabilistic learning combinations of local job-shop scheduling rules, J.F. Muth, G.L. Thompson (eds.), Industrial Scheduling, Prentice Hall, Englewood Cliffs, New Jersey, 225-251 */ /* The optimal solution is 55 */ param n := 6; param m := 6; param sigma : 1 2 3 4 5 6 := 1 3 1 2 4 6 5 2 2 3 5 6 1 4 3 3 4 6 1 2 5 4 2 1 3 4 5 6 5 3 2 5 6 1 4 6 2 4 6 1 5 3 ; param p : 1 2 3 4 5 6 := 1 3 6 1 7 6 3 2 10 8 5 4 10 10 3 9 1 5 4 7 8 4 5 5 5 3 8 9 5 3 3 9 1 5 4 6 10 3 1 3 4 9 ; end; glpk-5.0/examples/life_goe.mod0000644000062000006210000001353613766346220015602 0ustar maomkpasswd/* Conway's Game of Life garden of eden checker */ /* Written and converted to GNU MathProg by NASZVADI, Peter, 199x-2017 */ /* Conway's Game of Life (ref'd: CGoL) is a Cellular Automata described and inspected by John H. Conway in the 1970s. CGoL is nothing but a 0-player game on an infinite two-dimensional Euclydean grid. In the beginning of the "game", some 1 values are put on some of the grid vertices, and all others are set to 0. Grid vertices with values are called cells, and a cell is called "alive", if its value is 1, and called "dead" otherwise, these are the two "states". The game then turns to an infinite repetitive process: all cells change together independently at the same time their states depending only on their actual state and the actual number of living cells in their so called Moore-neighbourhood: the 4 orthogonal and 4 diagonal neighbouring cells. Conway also defined the transitions rule: dead cell become alive if it has exactly 3 living adjacents, and an alive cell survives only if it has 2 or 3 living neighbours. After executing a transition for all cells, the two patterns are in a relationship: the older is the father, the newer is the child. It is an interesting problem both in Mathematics and Phylosophy if there is a fatherless pattern (in CGoL). Fairly trivial existence proofs had been published since then, and immediately explicit constructions are followed. This GMPL model searches for a father pattern of the pattern specified in the c parameter matrix, and prints the found one if any both in human readable format and in RLE format, which could be open with some Cellular Automata simulators like Golly, for example. See more about Garden of Edens: http://conwaylife.com/wiki/Garden_of_Eden Golly CA simulator: http://golly.sourceforge.net/ Tip for running with the example pattern: glpsol --math life_goe.mod --cuts --last WARNING: Rather CPU- and memory-intensive process to find out if a given pattern is a GOE if it really is! */ param height, integer, > 0; /* height of the successor pattern */ param width, integer, > 0; /* width of the successor pattern */ set ROWS := 0..height + 1; /* set of rows of the predecessor */ set COLUMNS := 0..width + 1; /* set of columns of the predecessor */ set MOORE := {(0, 1), (0, -1), (1, 0), (-1, 0), (1, 1), (-1, 1), (1, -1), (-1, -1)}; /* Moore-neighbourhood relative coordinates */ param c{ROWS, COLUMNS}, >= 0; /* Denotes the cellspace of 1st generation, where 0, 1 and 2 means dead, alive or arbitrary cell values respectively. Usually the frame values must be set to "2", and also "2" is allowed in the inner rectangle. */ set IJalive := setof{(i, j) in ROWS cross COLUMNS: c[i, j] = 1}(i, j); /* set of alive cells in the child */ set IJdead := setof{(i, j) in ROWS cross COLUMNS: c[i, j] = 0}(i, j); /* set of dead cells in the child */ set IJ := IJalive union IJdead; /* set of cells in the child with enforced states */ var x{ROWS, COLUMNS}, binary; /* father's states */ var dpos{ROWS, COLUMNS}, >= 0; /* positive part of the distances from 6 */ var dneg{ROWS, COLUMNS}, >= 0; /* negative part of the distances from 6 */ var dposup{ROWS, COLUMNS}, binary; /* positive part's upper bound enforcement */ var dnegup{ROWS, COLUMNS}, binary; /* negative part's upper bound enforcement */ s.t. maincons{(i, j) in IJ}: x[i, j] + sum{(a, b) in MOORE} (2 * x[i + a, j + b]) = 6 + dpos[i,j] - dneg[i,j]; /* in the LHS, there is a function that maps from all possible 512 state combinations of a father cell and its Moore-neighbourhood to [0..17]. And for CGoL, if the child is alive, then it should be between 5 and 7. Also implicit introduced "d" as distance from 6 in RHS, and immediately decomposed "d" into positive and negative parts denoted dpos and dneg. */ s.t. posbound{(i,j) in IJ}: dpos[i,j] <= 11 * dposup[i,j]; /* constraining positive part of distance */ s.t. negbound{(i,j) in IJ}: dneg[i,j] <= 6 * dnegup[i,j]; /* constraining negative part of distance */ s.t. mutex{(i,j) in IJ}: dposup[i,j] + dnegup[i,j] = 1; /* Ensuring that at most one is positive among the pos./neg. parts */ s.t. alive{(i,j) in IJalive}: dpos[i,j] + dneg[i,j] <= 1; /* LHS of maincons must be 5, 6 or 7 either due to child cell is alive */ s.t. dead{(i,j) in IJdead}: dpos[i,j] + dneg[i,j] >= 2; /* LHS of maincons must be at most 4 or at least 8 */ /* This is a feasibility problem, so no objective is needed */ solve; printf '\nFound a father pattern:\n\n'; for{i in ROWS}{ for{j in COLUMNS}{ printf '%s%s', if j then ' ' else '', x[i, j].val; } printf '\n'; } printf '\nThe father pattern in rle format:\n\n'; for{i in ROWS}{ for{j in COLUMNS}{ printf '%s', if x[i, j].val then 'o' else 'b'; } printf '$'; } printf '!\n\n'; data; /* This example is a halved of a 10x10 garden of eden pattern from: http://wwwhomes.uni-bielefeld.de/achim/orphan_7th.html It has a 90 degree rotational symmetry, so if having enough resources, just comment the line denoted with "8", and uncomment the following part! And also do not forget to increase height parameter, respectively! */ param height := 7; param width := 10; param c : 0 1 2 3 4 5 6 7 8 9 10 11 := 0 2 2 2 2 2 2 2 2 2 2 2 2 1 2 0 1 0 1 1 1 0 1 0 0 2 2 2 0 0 1 0 1 0 1 0 0 1 2 3 2 1 0 1 1 1 0 0 1 1 0 2 4 2 0 1 0 1 1 1 1 1 0 1 2 5 2 1 0 0 1 0 0 1 1 1 1 2 6 2 1 1 1 1 0 0 1 0 0 1 2 7 2 1 0 1 1 1 1 1 0 1 0 2 8 2 2 2 2 2 2 2 2 2 2 2 2; /* 8 2 0 1 1 0 0 1 1 1 0 1 2 9 2 1 0 0 1 0 1 0 1 0 0 2 10 2 0 0 1 0 1 1 1 0 1 0 2 11 2 2 2 2 2 2 2 2 2 2 2 2; */ end; glpk-5.0/examples/magic.mod0000644000062000006210000000272613766346220015110 0ustar maomkpasswd/* MAGIC, Magic Square */ /* Written in GNU MathProg by Andrew Makhorin */ /* In recreational mathematics, a magic square of order n is an arrangement of n^2 numbers, usually distinct integers, in a square, such that n numbers in all rows, all columns, and both diagonals sum to the same constant. A normal magic square contains the integers from 1 to n^2. (From Wikipedia, the free encyclopedia.) */ param n, integer, > 0, default 4; /* square order */ set N := 1..n^2; /* integers to be placed */ var x{i in 1..n, j in 1..n, k in N}, binary; /* x[i,j,k] = 1 means that cell (i,j) contains integer k */ s.t. a{i in 1..n, j in 1..n}: sum{k in N} x[i,j,k] = 1; /* each cell must be assigned exactly one integer */ s.t. b{k in N}: sum{i in 1..n, j in 1..n} x[i,j,k] = 1; /* each integer must be assigned exactly to one cell */ var s; /* the magic sum */ s.t. r{i in 1..n}: sum{j in 1..n, k in N} k * x[i,j,k] = s; /* the sum in each row must be the magic sum */ s.t. c{j in 1..n}: sum{i in 1..n, k in N} k * x[i,j,k] = s; /* the sum in each column must be the magic sum */ s.t. d: sum{i in 1..n, k in N} k * x[i,i,k] = s; /* the sum in the diagonal must be the magic sum */ s.t. e: sum{i in 1..n, k in N} k * x[i,n-i+1,k] = s; /* the sum in the co-diagonal must be the magic sum */ solve; printf "\n"; printf "Magic sum is %d\n", s; printf "\n"; for{i in 1..n} { printf{j in 1..n} "%3d", sum{k in N} k * x[i,j,k]; printf "\n"; } printf "\n"; end; glpk-5.0/examples/Makefile.am0000644000062000006210000000044113766346220015353 0ustar maomkpasswd## Process this file with automake to produce Makefile.in ## AM_CPPFLAGS = -I$(srcdir)/../src LDADD = ../src/libglpk.la bin_PROGRAMS = glpsol glpsol_SOURCES = glpsol.c check: glpsol$(EXEEXT) ./glpsol$(EXEEXT) --version ./glpsol$(EXEEXT) --mps $(srcdir)/murtagh.mps --max ## eof ## glpk-5.0/examples/Makefile.in0000644000062000006210000004145613766346220015377 0ustar maomkpasswd# Makefile.in generated by automake 1.12.5 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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 = glpsol$(EXEEXT) subdir = examples DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am_glpsol_OBJECTS = glpsol.$(OBJEXT) glpsol_OBJECTS = $(am_glpsol_OBJECTS) glpsol_LDADD = $(LDADD) glpsol_DEPENDENCIES = ../src/libglpk.la DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f 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 = $(glpsol_SOURCES) DIST_SOURCES = $(glpsol_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ NOUNDEFINED = @NOUNDEFINED@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ 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@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ 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 = -I$(srcdir)/../src LDADD = ../src/libglpk.la glpsol_SOURCES = glpsol.c all: all-am .SUFFIXES: .SUFFIXES: .c .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 examples/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu examples/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p || 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 glpsol$(EXEEXT): $(glpsol_OBJECTS) $(glpsol_DEPENDENCIES) $(EXTRA_glpsol_DEPENDENCIES) @rm -f glpsol$(EXEEXT) $(LINK) $(glpsol_OBJECTS) $(glpsol_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/glpsol.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -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" cscopelist: $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool 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-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -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: uninstall-binPROGRAMS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ clean-generic clean-libtool cscopelist ctags 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-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 uninstall-binPROGRAMS check: glpsol$(EXEEXT) ./glpsol$(EXEEXT) --version ./glpsol$(EXEEXT) --mps $(srcdir)/murtagh.mps --max # 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: glpk-5.0/examples/maxcut.mod0000644000062000006210000000534013766346220015324 0ustar maomkpasswd/* MAXCUT, Maximum Cut Problem */ /* Written in GNU MathProg by Andrew Makhorin */ /* The Maximum Cut Problem in a network G = (V, E), where V is a set of nodes, E is a set of edges, is to find the partition of V into disjoint sets V1 and V2, which maximizes the sum of edge weights w(e), where edge e has one endpoint in V1 and other endpoint in V2. Reference: Garey, M.R., and Johnson, D.S. (1979), Computers and Intractability: A guide to the theory of NP-completeness [Network design, Cuts and Connectivity, Maximum Cut, ND16]. */ set E, dimen 2; /* set of edges */ param w{(i,j) in E}, >= 0, default 1; /* w[i,j] is weight of edge (i,j) */ set V := (setof{(i,j) in E} i) union (setof{(i,j) in E} j); /* set of nodes */ var x{i in V}, binary; /* x[i] = 0 means that node i is in set V1 x[i] = 1 means that node i is in set V2 */ /* We need to include in the objective function only that edges (i,j) from E, for which x[i] != x[j]. This can be modeled through binary variables s[i,j] as follows: s[i,j] = x[i] xor x[j] = (x[i] + x[j]) mod 2, (1) where s[i,j] = 1 iff x[i] != x[j], that leads to the following objective function: z = sum{(i,j) in E} w[i,j] * s[i,j]. (2) To describe "exclusive or" (1) we could think that s[i,j] is a minor bit of the sum x[i] + x[j]. Then introducing binary variables t[i,j], which represent a major bit of the sum x[i] + x[j], we can write: x[i] + x[j] = s[i,j] + 2 * t[i,j]. (3) An easy check shows that conditions (1) and (3) are equivalent. Note that condition (3) can be simplified by eliminating variables s[i,j]. Indeed, from (3) it follows that: s[i,j] = x[i] + x[j] - 2 * t[i,j]. (4) Since the expression in the right-hand side of (4) is integral, this condition can be rewritten in the equivalent form: 0 <= x[i] + x[j] - 2 * t[i,j] <= 1. (5) (One might note that (5) means t[i,j] = x[i] and x[j].) Substituting s[i,j] from (4) to (2) leads to the following objective function: z = sum{(i,j) in E} w[i,j] * (x[i] + x[j] - 2 * t[i,j]), (6) which does not include variables s[i,j]. */ var t{(i,j) in E}, binary; /* t[i,j] = x[i] and x[j] = (x[i] + x[j]) div 2 */ s.t. xor{(i,j) in E}: 0 <= x[i] + x[j] - 2 * t[i,j] <= 1; /* see (4) */ maximize z: sum{(i,j) in E} w[i,j] * (x[i] + x[j] - 2 * t[i,j]); /* see (6) */ data; /* In this example the network has 15 nodes and 22 edges. */ /* Optimal solution is 20 */ set E := 1 2, 1 5, 2 3, 2 6, 3 4, 3 8, 4 9, 5 6, 5 7, 6 8, 7 8, 7 12, 8 9, 8 12, 9 10, 9 14, 10 11, 10 14, 11 15, 12 13, 13 14, 14 15; end; glpk-5.0/examples/maxflow.mod0000644000062000006210000000372713766346220015507 0ustar maomkpasswd/* MAXFLOW, Maximum Flow Problem */ /* Written in GNU MathProg by Andrew Makhorin */ /* The Maximum Flow Problem in a network G = (V, E), where V is a set of nodes, E within V x V is a set of arcs, is to maximize the flow from one given node s (source) to another given node t (sink) subject to conservation of flow constraints at each node and flow capacities on each arc. */ param n, integer, >= 2; /* number of nodes */ set V, default {1..n}; /* set of nodes */ set E, within V cross V; /* set of arcs */ param a{(i,j) in E}, > 0; /* a[i,j] is capacity of arc (i,j) */ param s, symbolic, in V, default 1; /* source node */ param t, symbolic, in V, != s, default n; /* sink node */ var x{(i,j) in E}, >= 0, <= a[i,j]; /* x[i,j] is elementary flow through arc (i,j) to be found */ var flow, >= 0; /* total flow from s to t */ s.t. node{i in V}: /* node[i] is conservation constraint for node i */ sum{(j,i) in E} x[j,i] + (if i = s then flow) /* summary flow into node i through all ingoing arcs */ = /* must be equal to */ sum{(i,j) in E} x[i,j] + (if i = t then flow); /* summary flow from node i through all outgoing arcs */ maximize obj: flow; /* objective is to maximize the total flow through the network */ solve; printf{1..56} "="; printf "\n"; printf "Maximum flow from node %s to node %s is %g\n\n", s, t, flow; printf "Starting node Ending node Arc capacity Flow in arc\n"; printf "------------- ----------- ------------ -----------\n"; printf{(i,j) in E: x[i,j] != 0}: "%13s %11s %12g %11g\n", i, j, a[i,j], x[i,j]; printf{1..56} "="; printf "\n"; data; /* These data correspond to an example from [Christofides]. */ /* Optimal solution is 29 */ param n := 9; param : E : a := 1 2 14 1 4 23 2 3 10 2 4 9 3 5 12 3 8 18 4 5 26 5 2 11 5 6 25 5 7 4 6 7 7 6 8 8 7 9 15 8 9 20; end; glpk-5.0/examples/mfasp.mod0000644000062000006210000000356113766346220015134 0ustar maomkpasswd/* MFASP, Minimum Feedback Arc Set Problem */ /* Written in GNU MathProg by Andrew Makhorin */ /* The Minimum Feedback Arc Set Problem for a given directed graph G = (V, E), where V is a set of vertices and E is a set of arcs, is to find a minimal subset of arcs, which being removed from the graph make it acyclic. Reference: Garey, M.R., and Johnson, D.S. (1979), Computers and Intractability: A guide to the theory of NP-completeness [Graph Theory, Covering and Partitioning, Minimum Feedback Arc Set, GT9]. */ param n, integer, >= 0; /* number of vertices */ set V, default 1..n; /* set of vertices */ set E, within V cross V, default setof{i in V, j in V: i <> j and Uniform(0,1) <= 0.15} (i,j); /* set of arcs */ printf "Graph has %d vertices and %d arcs\n", card(V), card(E); var x{(i,j) in E}, binary; /* x[i,j] = 1 means that (i->j) is a feedback arc */ /* It is known that a digraph G = (V, E) is acyclic if and only if its vertices can be assigned numbers from 1 to |V| in such a way that k[i] + 1 <= k[j] for every arc (i->j) in E, where k[i] is a number assigned to vertex i. We may use this condition to require that the digraph G = (V, E \ E'), where E' is a subset of feedback arcs, is acyclic. */ var k{i in V}, >= 1, <= card(V); /* k[i] is a number assigned to vertex i */ s.t. r{(i,j) in E}: k[j] - k[i] >= 1 - card(V) * x[i,j]; /* note that x[i,j] = 1 leads to a redundant constraint */ minimize obj: sum{(i,j) in E} x[i,j]; /* the objective is to minimize the cardinality of a subset of feedback arcs */ solve; printf "Minimum feedback arc set:\n"; printf{(i,j) in E: x[i,j]} "%d %d\n", i, j; data; /* The optimal solution is 3 */ param n := 15; set E := 1 2, 2 3, 3 4, 3 8, 4 9, 5 1, 6 5, 7 5, 8 6, 8 7, 8 9, 9 10, 10 11, 10 14, 11 15, 12 7, 12 8, 12 13, 13 8, 13 12, 13 14, 14 9, 15 14; end; glpk-5.0/examples/mfvsp.mod0000644000062000006210000000357413766346220015165 0ustar maomkpasswd/* MFVSP, Minimum Feedback Vertex Set Problem */ /* Written in GNU MathProg by Andrew Makhorin */ /* The Minimum Feedback Vertex Set Problem for a given directed graph G = (V, E), where V is a set of vertices and E is a set of arcs, is to find a minimal subset of vertices, which being removed from the graph make it acyclic. Reference: Garey, M.R., and Johnson, D.S. (1979), Computers and Intractability: A guide to the theory of NP-completeness [Graph Theory, Covering and Partitioning, Minimum Feedback Vertex Set, GT8]. */ param n, integer, >= 0; /* number of vertices */ set V, default 1..n; /* set of vertices */ set E, within V cross V, default setof{i in V, j in V: i <> j and Uniform(0,1) <= 0.15} (i,j); /* set of arcs */ printf "Graph has %d vertices and %d arcs\n", card(V), card(E); var x{i in V}, binary; /* x[i] = 1 means that i is a feedback vertex */ /* It is known that a digraph G = (V, E) is acyclic if and only if its vertices can be assigned numbers from 1 to |V| in such a way that k[i] + 1 <= k[j] for every arc (i->j) in E, where k[i] is a number assigned to vertex i. We may use this condition to require that the digraph G = (V, E \ E'), where E' is a subset of feedback arcs, is acyclic. */ var k{i in V}, >= 1, <= card(V); /* k[i] is a number assigned to vertex i */ s.t. r{(i,j) in E}: k[j] - k[i] >= 1 - card(V) * (x[i] + x[j]); /* note that x[i] = 1 or x[j] = 1 leads to a redundant constraint */ minimize obj: sum{i in V} x[i]; /* the objective is to minimize the cardinality of a subset of feedback vertices */ solve; printf "Minimum feedback vertex set:\n"; printf{i in V: x[i]} "%d\n", i; data; /* The optimal solution is 3 */ param n := 15; set E := 1 2, 2 3, 3 4, 3 8, 4 9, 5 1, 6 5, 7 5, 8 6, 8 7, 8 9, 9 10, 10 11, 10 14, 11 15, 12 7, 12 8, 12 13, 13 8, 13 12, 13 14, 14 9, 15 14; end; glpk-5.0/examples/min01ks.mod0000644000062000006210000000610613766346220015306 0ustar maomkpasswd/* min01ks.mod - finding minimal equivalent 0-1 knapsack inequality */ /* Written in GNU MathProg by Andrew Makhorin */ /* It is obvious that for a given 0-1 knapsack inequality a[1] x[1] + ... + a[n] x[n] <= b, x[j] in {0, 1} (1) there exist infinitely many equivalent inequalities with exactly the same feasible solutions. Given a[j]'s and b this model allows to find an inequality alfa[1] x[1] + ... + alfa[n] x[n] <= beta, x[j] in {0, 1}, (2) which is equivalent to (1) and where alfa[j]'s and beta are smallest non-negative integers. This model has the following formulation: minimize z = |alfa[1]| + ... + |alfa[n]| + |beta| = (3) = alfa[1] + ... + alfa[n] + beta subject to alfa[1] x[1] + ... + alfa[n] x[n] <= beta (4) for all x satisfying to (1) alfa[1] x[1] + ... + alfa[n] x[n] >= beta + 1 (5) for all x not satisfying to (1) alfa[1], ..., alfa[n], beta are non-negative integers. Note that this model has n+1 variables and 2^n constraints. It is interesting, as noticed in [1] and explained in [2], that in most cases LP relaxation of the MIP formulation above has integer optimal solution. References 1. G.H.Bradley, P.L.Hammer, L.Wolsey, "Coefficient Reduction for Inequalities in 0-1 Variables", Math.Prog.7 (1974), 263-282. 2. G.J.Koehler, "A Study on Coefficient Reduction of Binary Knapsack Inequalities", University of Florida, 2001. */ param n, integer, > 0; /* number of variables in the knapsack inequality */ set N := 1..n; /* set of knapsack items */ /* all binary n-vectors are numbered by 0, 1, ..., 2^n-1, where vector 0 is 00...00, vector 1 is 00...01, etc. */ set U := 0..2^n-1; /* set of numbers of all binary n-vectors */ param x{i in U, j in N}, binary, := (i div 2^(j-1)) mod 2; /* x[i,j] is j-th component of i-th binary n-vector */ param a{j in N}, >= 0; /* original coefficients */ param b, >= 0; /* original right-hand side */ set D := setof{i in U: sum{j in N} a[j] * x[i,j] <= b} i; /* set of numbers of binary n-vectors, which (vectors) are feasible, i.e. satisfy to the original knapsack inequality (1) */ var alfa{j in N}, integer, >= 0; /* coefficients to be found */ var beta, integer, >= 0; /* right-hand side to be found */ minimize z: sum{j in N} alfa[j] + beta; /* (3) */ phi{i in D}: sum{j in N} alfa[j] * x[i,j] <= beta; /* (4) */ psi{i in U diff D}: sum{j in N} alfa[j] * x[i,j] >= beta + 1; /* (5) */ solve; printf "\nOriginal 0-1 knapsack inequality:\n"; for {j in 1..n} printf (if j = 1 then "" else " + ") & "%g x%d", a[j], j; printf " <= %g\n", b; printf "\nMinimized equivalent inequality:\n"; for {j in 1..n} printf (if j = 1 then "" else " + ") & "%g x%d", alfa[j], j; printf " <= %g\n\n", beta; data; /* These data correspond to the very first example from [1]. */ param n := 8; param a := [1]65, [2]64, [3]41, [4]22, [5]13, [6]12, [7]8, [8]2; param b := 80; end; glpk-5.0/examples/misp.mod0000644000062000006210000001241313766346220014772 0ustar maomkpasswd/* MISP, Maximum Independent Set Problem */ /* Written in GNU MathProg by Andrew Makhorin */ /* Let G = (V,E) be an undirected graph with vertex set V and edge set * E. Vertices u, v in V are non-adjacent if (u,v) not in E. A subset * of the vertices S within V is independent if all vertices in S are * pairwise non-adjacent. The Maximum Independent Set Problem (MISP) is * to find an independent set having the largest cardinality. */ param n, integer, > 0; /* number of vertices */ set V := 1..n; /* set of vertices */ set E within V cross V; /* set of edges */ var x{i in V}, binary; /* x[i] = 1 means vertex i belongs to independent set */ s.t. edge{(i,j) in E}: x[i] + x[j] <= 1; /* if there is edge (i,j), vertices i and j cannot belong to the same independent set */ maximize obj: sum{i in V} x[i]; /* the objective is to maximize the cardinality of independent set */ data; /* These data corresponds to the test instance from: * * M.G.C. Resende, T.A.Feo, S.H.Smith, "Algorithm 787 -- FORTRAN * subroutines for approximate solution of the maximum independent set * problem using GRASP," Trans. on Math. Softw., Vol. 24, No. 4, * December 1998, pp. 386-394. */ /* The optimal solution is 7. */ param n := 50; set E := 1 2 1 3 1 5 1 7 1 8 1 12 1 15 1 16 1 19 1 20 1 21 1 22 1 28 1 30 1 34 1 35 1 37 1 41 1 42 1 47 1 50 2 3 2 5 2 6 2 7 2 8 2 9 2 10 2 13 2 17 2 19 2 20 2 21 2 23 2 25 2 26 2 29 2 31 2 35 2 36 2 44 2 45 2 46 2 50 3 5 3 6 3 8 3 9 3 10 3 11 3 14 3 16 3 23 3 24 3 26 3 27 3 28 3 29 3 30 3 31 3 34 3 35 3 36 3 39 3 41 3 42 3 43 3 44 3 50 4 6 4 7 4 9 4 10 4 11 4 13 4 14 4 15 4 17 4 21 4 22 4 23 4 24 4 25 4 27 4 28 4 30 4 31 4 33 4 34 4 35 4 36 4 37 4 38 4 40 4 41 4 42 4 46 4 49 5 6 5 11 5 14 5 21 5 24 5 25 5 28 5 35 5 38 5 39 5 41 5 44 5 49 5 50 6 8 6 9 6 10 6 13 6 14 6 16 6 17 6 19 6 22 6 23 6 26 6 27 6 30 6 34 6 35 6 38 6 39 6 40 6 41 6 44 6 45 6 47 6 50 7 8 7 9 7 10 7 11 7 13 7 15 7 16 7 18 7 20 7 22 7 23 7 24 7 25 7 33 7 35 7 36 7 38 7 43 7 45 7 46 7 47 8 10 8 11 8 13 8 16 8 17 8 18 8 19 8 20 8 21 8 22 8 23 8 24 8 25 8 26 8 33 8 35 8 36 8 39 8 42 8 44 8 48 8 49 9 12 9 14 9 17 9 19 9 20 9 23 9 28 9 30 9 31 9 32 9 33 9 34 9 38 9 39 9 42 9 44 9 45 9 46 10 11 10 13 10 15 10 16 10 17 10 20 10 21 10 22 10 23 10 25 10 26 10 27 10 28 10 30 10 31 10 32 10 37 10 38 10 41 10 43 10 44 10 45 10 50 11 12 11 14 11 15 11 18 11 21 11 24 11 25 11 26 11 29 11 32 11 33 11 35 11 36 11 37 11 39 11 40 11 42 11 43 11 45 11 47 11 49 11 50 12 13 12 16 12 17 12 19 12 24 12 25 12 26 12 30 12 31 12 32 12 34 12 36 12 37 12 39 12 41 12 44 12 47 12 48 12 49 13 15 13 16 13 18 13 19 13 20 13 22 13 23 13 24 13 27 13 28 13 29 13 31 13 33 13 35 13 36 13 37 13 44 13 47 13 49 13 50 14 15 14 16 14 17 14 18 14 19 14 20 14 21 14 26 14 28 14 29 14 30 14 31 14 32 14 34 14 35 14 36 14 38 14 39 14 41 14 44 14 46 14 47 14 48 15 18 15 21 15 22 15 23 15 25 15 28 15 29 15 30 15 33 15 34 15 36 15 37 15 38 15 39 15 40 15 43 15 44 15 46 15 50 16 17 16 19 16 20 16 25 16 26 16 29 16 35 16 38 16 39 16 40 16 41 16 42 16 44 17 18 17 19 17 21 17 22 17 23 17 25 17 26 17 28 17 29 17 33 17 37 17 44 17 45 17 48 18 20 18 24 18 27 18 28 18 31 18 32 18 34 18 35 18 36 18 37 18 38 18 45 18 48 18 49 18 50 19 22 19 24 19 28 19 29 19 36 19 37 19 39 19 41 19 43 19 45 19 48 19 49 20 21 20 22 20 24 20 25 20 26 20 27 20 29 20 30 20 31 20 33 20 34 20 35 20 38 20 39 20 41 20 42 20 43 20 44 20 45 20 46 20 48 20 49 21 22 21 23 21 29 21 31 21 35 21 38 21 42 21 46 21 47 22 23 22 26 22 27 22 28 22 29 22 30 22 39 22 40 22 41 22 42 22 44 22 45 22 46 22 47 22 49 22 50 23 28 23 31 23 32 23 33 23 34 23 35 23 36 23 39 23 40 23 41 23 42 23 44 23 45 23 48 23 49 23 50 24 25 24 27 24 29 24 30 24 31 24 33 24 34 24 38 24 42 24 43 24 44 24 49 24 50 25 26 25 27 25 29 25 30 25 33 25 34 25 36 25 38 25 40 25 41 25 42 25 44 25 46 25 47 25 48 25 49 26 28 26 31 26 32 26 33 26 37 26 38 26 39 26 40 26 41 26 42 26 45 26 47 26 48 26 49 27 29 27 30 27 33 27 34 27 35 27 39 27 40 27 46 27 48 28 29 28 37 28 40 28 42 28 44 28 46 28 47 28 50 29 35 29 38 29 39 29 41 29 42 29 48 30 31 30 32 30 35 30 37 30 38 30 40 30 43 30 45 30 46 30 47 30 48 31 33 31 35 31 38 31 40 31 41 31 42 31 44 31 46 31 47 31 50 32 33 32 35 32 39 32 40 32 46 32 49 32 50 33 34 33 36 33 37 33 40 33 42 33 43 33 44 33 45 33 50 34 35 34 36 34 37 34 38 34 40 34 43 34 44 34 49 34 50 35 36 35 38 35 41 35 42 35 43 35 45 35 46 35 47 35 49 35 50 36 37 36 39 36 40 36 41 36 42 36 43 36 48 36 50 37 38 37 41 37 43 37 46 37 47 37 48 37 49 37 50 38 41 38 45 38 46 38 48 38 49 38 50 39 43 39 46 39 47 39 48 39 49 40 43 40 45 40 48 40 50 41 42 41 43 41 44 41 45 41 46 41 48 41 49 42 43 42 44 42 46 42 48 42 49 43 45 43 46 43 48 43 50 44 45 44 48 45 46 45 47 45 48 46 49 47 49 47 50 48 49 48 50 49 50 ; end; glpk-5.0/examples/misp1.dat0000644000062000006210000002561213766346220015051 0ustar maomkpasswd/* misp1.dat (data for misp.mod to illustrate clique cuts) */ /* These data corresponds to the test instance 1dc.128 (graphs from * single-deletion-correcting codes) from: * * N.J.A.Sloane, "Challenge Problems: Independent Sets In Graphs." * http://neilsloane.com/doc/graphs.html (June 2013). */ /* Optimal solution is 16. */ data; param n := 128; set E := /* 1471 edges */ 1 2 1 3 1 5 1 9 1 17 1 33 1 65 2 3 2 4 2 5 2 6 2 9 2 10 2 17 2 18 2 33 2 34 2 65 2 66 3 4 3 5 3 6 3 7 3 9 3 10 3 11 3 17 3 18 3 19 3 33 3 34 3 35 3 65 3 66 3 67 4 6 4 7 4 8 4 10 4 12 4 18 4 20 4 34 4 36 4 66 4 68 5 6 5 7 5 9 5 10 5 11 5 13 5 17 5 19 5 21 5 33 5 35 5 37 5 65 5 67 5 69 6 7 6 8 6 10 6 11 6 12 6 14 6 18 6 19 6 20 6 22 6 34 6 35 6 36 6 38 6 66 6 67 6 68 6 70 7 8 7 11 7 12 7 13 7 14 7 15 7 19 7 20 7 23 7 35 7 36 7 39 7 67 7 68 7 71 8 12 8 14 8 15 8 16 8 20 8 24 8 36 8 40 8 68 8 72 9 10 9 11 9 13 9 17 9 18 9 19 9 21 9 25 9 33 9 37 9 41 9 65 9 69 9 73 10 11 10 12 10 13 10 14 10 18 10 19 10 20 10 21 10 22 10 26 10 34 10 37 10 38 10 42 10 66 10 69 10 70 10 74 11 12 11 13 11 14 11 15 11 19 11 21 11 22 11 23 11 27 11 35 11 37 11 38 11 39 11 43 11 67 11 69 11 70 11 71 11 75 12 14 12 15 12 16 12 20 12 22 12 23 12 24 12 28 12 36 12 38 12 40 12 44 12 68 12 70 12 72 12 76 13 14 13 15 13 21 13 23 13 25 13 26 13 27 13 29 13 37 13 39 13 45 13 69 13 71 13 77 14 15 14 16 14 22 14 23 14 24 14 26 14 27 14 28 14 30 14 38 14 39 14 40 14 46 14 70 14 71 14 72 14 78 15 16 15 23 15 24 15 27 15 29 15 30 15 31 15 39 15 40 15 47 15 71 15 72 15 79 16 24 16 28 16 30 16 31 16 32 16 40 16 48 16 72 16 80 17 18 17 19 17 21 17 25 17 33 17 34 17 35 17 37 17 41 17 49 17 65 17 73 17 81 18 19 18 20 18 21 18 22 18 25 18 26 18 34 18 35 18 36 18 38 18 41 18 42 18 50 18 66 18 73 18 74 18 82 19 20 19 21 19 22 19 23 19 25 19 26 19 27 19 35 19 37 19 38 19 39 19 41 19 42 19 43 19 51 19 67 19 73 19 74 19 75 19 83 20 22 20 23 20 24 20 26 20 28 20 36 20 38 20 39 20 40 20 42 20 44 20 52 20 68 20 74 20 76 20 84 21 22 21 23 21 25 21 26 21 27 21 29 21 37 21 41 21 42 21 43 21 45 21 53 21 69 21 73 21 75 21 77 21 85 22 23 22 24 22 26 22 27 22 28 22 30 22 38 22 42 22 43 22 44 22 46 22 54 22 70 22 74 22 75 22 76 22 78 22 86 23 24 23 27 23 28 23 29 23 30 23 31 23 39 23 43 23 44 23 45 23 46 23 47 23 55 23 71 23 75 23 76 23 79 23 87 24 28 24 30 24 31 24 32 24 40 24 44 24 46 24 47 24 48 24 56 24 72 24 76 24 80 24 88 25 26 25 27 25 29 25 41 25 45 25 49 25 50 25 51 25 53 25 57 25 73 25 77 25 89 26 27 26 28 26 29 26 30 26 42 26 45 26 46 26 50 26 51 26 52 26 54 26 58 26 74 26 77 26 78 26 90 27 28 27 29 27 30 27 31 27 43 27 45 27 46 27 47 27 51 27 53 27 54 27 55 27 59 27 75 27 77 27 78 27 79 27 91 28 30 28 31 28 32 28 44 28 46 28 48 28 52 28 54 28 55 28 56 28 60 28 76 28 78 28 80 28 92 29 30 29 31 29 45 29 47 29 53 29 57 29 58 29 59 29 61 29 77 29 79 29 93 30 31 30 32 30 46 30 47 30 48 30 54 30 58 30 59 30 60 30 62 30 78 30 79 30 80 30 94 31 32 31 47 31 48 31 55 31 59 31 61 31 62 31 63 31 79 31 80 31 95 32 48 32 56 32 60 32 62 32 63 32 64 32 80 32 96 33 34 33 35 33 37 33 41 33 49 33 65 33 66 33 67 33 69 33 73 33 81 33 97 34 35 34 36 34 37 34 38 34 41 34 42 34 49 34 50 34 66 34 67 34 68 34 70 34 74 34 81 34 82 34 98 35 36 35 37 35 38 35 39 35 41 35 42 35 43 35 49 35 50 35 51 35 67 35 69 35 70 35 71 35 75 35 81 35 82 35 83 35 99 36 38 36 39 36 40 36 42 36 44 36 50 36 52 36 68 36 70 36 71 36 72 36 76 36 82 36 84 36 100 37 38 37 39 37 41 37 42 37 43 37 45 37 49 37 51 37 53 37 69 37 73 37 74 37 75 37 77 37 81 37 83 37 85 37 101 38 39 38 40 38 42 38 43 38 44 38 46 38 50 38 51 38 52 38 54 38 70 38 74 38 75 38 76 38 78 38 82 38 83 38 84 38 86 38 102 39 40 39 43 39 44 39 45 39 46 39 47 39 51 39 52 39 55 39 71 39 75 39 77 39 78 39 79 39 83 39 84 39 87 39 103 40 44 40 46 40 47 40 48 40 52 40 56 40 72 40 76 40 78 40 79 40 80 40 84 40 88 40 104 41 42 41 43 41 45 41 49 41 50 41 51 41 53 41 57 41 73 41 81 41 82 41 83 41 85 41 89 41 105 42 43 42 44 42 45 42 46 42 50 42 51 42 52 42 53 42 54 42 58 42 74 42 82 42 83 42 84 42 85 42 86 42 90 42 106 43 44 43 45 43 46 43 47 43 51 43 53 43 54 43 55 43 59 43 75 43 83 43 85 43 86 43 87 43 91 43 107 44 46 44 47 44 48 44 52 44 54 44 55 44 56 44 60 44 76 44 84 44 86 44 87 44 88 44 92 44 108 45 46 45 47 45 53 45 55 45 57 45 58 45 59 45 61 45 77 45 85 45 87 45 89 45 90 45 91 45 93 45 109 46 47 46 48 46 54 46 55 46 56 46 58 46 59 46 60 46 62 46 78 46 86 46 87 46 88 46 90 46 91 46 92 46 94 46 110 47 48 47 55 47 56 47 59 47 61 47 62 47 63 47 79 47 87 47 88 47 91 47 93 47 94 47 95 47 111 48 56 48 60 48 62 48 63 48 64 48 80 48 88 48 92 48 94 48 95 48 96 48 112 49 50 49 51 49 53 49 57 49 81 49 89 49 97 49 98 49 99 49 101 49 105 49 113 50 51 50 52 50 53 50 54 50 57 50 58 50 82 50 89 50 90 50 98 50 99 50 100 50 102 50 106 50 114 51 52 51 53 51 54 51 55 51 57 51 58 51 59 51 83 51 89 51 90 51 91 51 99 51 101 51 102 51 103 51 107 51 115 52 54 52 55 52 56 52 58 52 60 52 84 52 90 52 92 52 100 52 102 52 103 52 104 52 108 52 116 53 54 53 55 53 57 53 58 53 59 53 61 53 85 53 89 53 91 53 93 53 101 53 105 53 106 53 107 53 109 53 117 54 55 54 56 54 58 54 59 54 60 54 62 54 86 54 90 54 91 54 92 54 94 54 102 54 106 54 107 54 108 54 110 54 118 55 56 55 59 55 60 55 61 55 62 55 63 55 87 55 91 55 92 55 95 55 103 55 107 55 109 55 110 55 111 55 119 56 60 56 62 56 63 56 64 56 88 56 92 56 96 56 104 56 108 56 110 56 111 56 112 56 120 57 58 57 59 57 61 57 89 57 93 57 105 57 113 57 114 57 115 57 117 57 121 58 59 58 60 58 61 58 62 58 90 58 93 58 94 58 106 58 114 58 115 58 116 58 118 58 122 59 60 59 61 59 62 59 63 59 91 59 93 59 94 59 95 59 107 59 115 59 117 59 118 59 119 59 123 60 62 60 63 60 64 60 92 60 94 60 96 60 108 60 116 60 118 60 119 60 120 60 124 61 62 61 63 61 93 61 95 61 109 61 117 61 121 61 122 61 123 61 125 62 63 62 64 62 94 62 95 62 96 62 110 62 118 62 122 62 123 62 124 62 126 63 64 63 95 63 96 63 111 63 119 63 123 63 125 63 126 63 127 64 96 64 112 64 120 64 124 64 126 64 127 64 128 65 66 65 67 65 69 65 73 65 81 65 97 66 67 66 68 66 69 66 70 66 73 66 74 66 81 66 82 66 97 66 98 67 68 67 69 67 70 67 71 67 73 67 74 67 75 67 81 67 82 67 83 67 97 67 98 67 99 68 70 68 71 68 72 68 74 68 76 68 82 68 84 68 98 68 100 69 70 69 71 69 73 69 74 69 75 69 77 69 81 69 83 69 85 69 97 69 99 69 101 70 71 70 72 70 74 70 75 70 76 70 78 70 82 70 83 70 84 70 86 70 98 70 99 70 100 70 102 71 72 71 75 71 76 71 77 71 78 71 79 71 83 71 84 71 87 71 99 71 100 71 103 72 76 72 78 72 79 72 80 72 84 72 88 72 100 72 104 73 74 73 75 73 77 73 81 73 82 73 83 73 85 73 89 73 97 73 101 73 105 74 75 74 76 74 77 74 78 74 82 74 83 74 84 74 85 74 86 74 90 74 98 74 101 74 102 74 106 75 76 75 77 75 78 75 79 75 83 75 85 75 86 75 87 75 91 75 99 75 101 75 102 75 103 75 107 76 78 76 79 76 80 76 84 76 86 76 87 76 88 76 92 76 100 76 102 76 104 76 108 77 78 77 79 77 85 77 87 77 89 77 90 77 91 77 93 77 101 77 103 77 109 78 79 78 80 78 86 78 87 78 88 78 90 78 91 78 92 78 94 78 102 78 103 78 104 78 110 79 80 79 87 79 88 79 91 79 93 79 94 79 95 79 103 79 104 79 111 80 88 80 92 80 94 80 95 80 96 80 104 80 112 81 82 81 83 81 85 81 89 81 97 81 98 81 99 81 101 81 105 81 113 82 83 82 84 82 85 82 86 82 89 82 90 82 98 82 99 82 100 82 102 82 105 82 106 82 114 83 84 83 85 83 86 83 87 83 89 83 90 83 91 83 99 83 101 83 102 83 103 83 105 83 106 83 107 83 115 84 86 84 87 84 88 84 90 84 92 84 100 84 102 84 103 84 104 84 106 84 108 84 116 85 86 85 87 85 89 85 90 85 91 85 93 85 101 85 105 85 106 85 107 85 109 85 117 86 87 86 88 86 90 86 91 86 92 86 94 86 102 86 106 86 107 86 108 86 110 86 118 87 88 87 91 87 92 87 93 87 94 87 95 87 103 87 107 87 108 87 109 87 110 87 111 87 119 88 92 88 94 88 95 88 96 88 104 88 108 88 110 88 111 88 112 88 120 89 90 89 91 89 93 89 105 89 109 89 113 89 114 89 115 89 117 89 121 90 91 90 92 90 93 90 94 90 106 90 109 90 110 90 114 90 115 90 116 90 118 90 122 91 92 91 93 91 94 91 95 91 107 91 109 91 110 91 111 91 115 91 117 91 118 91 119 91 123 92 94 92 95 92 96 92 108 92 110 92 112 92 116 92 118 92 119 92 120 92 124 93 94 93 95 93 109 93 111 93 117 93 121 93 122 93 123 93 125 94 95 94 96 94 110 94 111 94 112 94 118 94 122 94 123 94 124 94 126 95 96 95 111 95 112 95 119 95 123 95 125 95 126 95 127 96 112 96 120 96 124 96 126 96 127 96 128 97 98 97 99 97 101 97 105 97 113 98 99 98 100 98 101 98 102 98 105 98 106 98 113 98 114 99 100 99 101 99 102 99 103 99 105 99 106 99 107 99 113 99 114 99 115 100 102 100 103 100 104 100 106 100 108 100 114 100 116 101 102 101 103 101 105 101 106 101 107 101 109 101 113 101 115 101 117 102 103 102 104 102 106 102 107 102 108 102 110 102 114 102 115 102 116 102 118 103 104 103 107 103 108 103 109 103 110 103 111 103 115 103 116 103 119 104 108 104 110 104 111 104 112 104 116 104 120 105 106 105 107 105 109 105 113 105 114 105 115 105 117 105 121 106 107 106 108 106 109 106 110 106 114 106 115 106 116 106 117 106 118 106 122 107 108 107 109 107 110 107 111 107 115 107 117 107 118 107 119 107 123 108 110 108 111 108 112 108 116 108 118 108 119 108 120 108 124 109 110 109 111 109 117 109 119 109 121 109 122 109 123 109 125 110 111 110 112 110 118 110 119 110 120 110 122 110 123 110 124 110 126 111 112 111 119 111 120 111 123 111 125 111 126 111 127 112 120 112 124 112 126 112 127 112 128 113 114 113 115 113 117 113 121 114 115 114 116 114 117 114 118 114 121 114 122 115 116 115 117 115 118 115 119 115 121 115 122 115 123 116 118 116 119 116 120 116 122 116 124 117 118 117 119 117 121 117 122 117 123 117 125 118 119 118 120 118 122 118 123 118 124 118 126 119 120 119 123 119 124 119 125 119 126 119 127 120 124 120 126 120 127 120 128 121 122 121 123 121 125 122 123 122 124 122 125 122 126 123 124 123 125 123 126 123 127 124 126 124 127 124 128 125 126 125 127 126 127 126 128 127 128 ; end; glpk-5.0/examples/misp2.dat0000644000062000006210000007614413766346220015060 0ustar maomkpasswd/* misp2.dat (data for misp.mod to illustrate clique cuts) */ /* These data corresponds to the test instance 1dc.256 (graphs from * single-deletion-correcting codes) from: * * N.J.A.Sloane, "Challenge Problems: Independent Sets In Graphs." * http://neilsloane.com/doc/graphs.html (June 2013). */ /* Optimal solution is 30. */ data; param n := 256; set E := /* 3839 edges */ 1 2 1 3 1 5 1 9 1 17 1 33 1 65 1 129 2 3 2 4 2 5 2 6 2 9 2 10 2 17 2 18 2 33 2 34 2 65 2 66 2 129 2 130 3 4 3 5 3 6 3 7 3 9 3 10 3 11 3 17 3 18 3 19 3 33 3 34 3 35 3 65 3 66 3 67 3 129 3 130 3 131 4 6 4 7 4 8 4 10 4 12 4 18 4 20 4 34 4 36 4 66 4 68 4 130 4 132 5 6 5 7 5 9 5 10 5 11 5 13 5 17 5 19 5 21 5 33 5 35 5 37 5 65 5 67 5 69 5 129 5 131 5 133 6 7 6 8 6 10 6 11 6 12 6 14 6 18 6 19 6 20 6 22 6 34 6 35 6 36 6 38 6 66 6 67 6 68 6 70 6 130 6 131 6 132 6 134 7 8 7 11 7 12 7 13 7 14 7 15 7 19 7 20 7 23 7 35 7 36 7 39 7 67 7 68 7 71 7 131 7 132 7 135 8 12 8 14 8 15 8 16 8 20 8 24 8 36 8 40 8 68 8 72 8 132 8 136 9 10 9 11 9 13 9 17 9 18 9 19 9 21 9 25 9 33 9 37 9 41 9 65 9 69 9 73 9 129 9 133 9 137 10 11 10 12 10 13 10 14 10 18 10 19 10 20 10 21 10 22 10 26 10 34 10 37 10 38 10 42 10 66 10 69 10 70 10 74 10 130 10 133 10 134 10 138 11 12 11 13 11 14 11 15 11 19 11 21 11 22 11 23 11 27 11 35 11 37 11 38 11 39 11 43 11 67 11 69 11 70 11 71 11 75 11 131 11 133 11 134 11 135 11 139 12 14 12 15 12 16 12 20 12 22 12 23 12 24 12 28 12 36 12 38 12 40 12 44 12 68 12 70 12 72 12 76 12 132 12 134 12 136 12 140 13 14 13 15 13 21 13 23 13 25 13 26 13 27 13 29 13 37 13 39 13 45 13 69 13 71 13 77 13 133 13 135 13 141 14 15 14 16 14 22 14 23 14 24 14 26 14 27 14 28 14 30 14 38 14 39 14 40 14 46 14 70 14 71 14 72 14 78 14 134 14 135 14 136 14 142 15 16 15 23 15 24 15 27 15 29 15 30 15 31 15 39 15 40 15 47 15 71 15 72 15 79 15 135 15 136 15 143 16 24 16 28 16 30 16 31 16 32 16 40 16 48 16 72 16 80 16 136 16 144 17 18 17 19 17 21 17 25 17 33 17 34 17 35 17 37 17 41 17 49 17 65 17 73 17 81 17 129 17 137 17 145 18 19 18 20 18 21 18 22 18 25 18 26 18 34 18 35 18 36 18 38 18 41 18 42 18 50 18 66 18 73 18 74 18 82 18 130 18 137 18 138 18 146 19 20 19 21 19 22 19 23 19 25 19 26 19 27 19 35 19 37 19 38 19 39 19 41 19 42 19 43 19 51 19 67 19 73 19 74 19 75 19 83 19 131 19 137 19 138 19 139 19 147 20 22 20 23 20 24 20 26 20 28 20 36 20 38 20 39 20 40 20 42 20 44 20 52 20 68 20 74 20 76 20 84 20 132 20 138 20 140 20 148 21 22 21 23 21 25 21 26 21 27 21 29 21 37 21 41 21 42 21 43 21 45 21 53 21 69 21 73 21 75 21 77 21 85 21 133 21 137 21 139 21 141 21 149 22 23 22 24 22 26 22 27 22 28 22 30 22 38 22 42 22 43 22 44 22 46 22 54 22 70 22 74 22 75 22 76 22 78 22 86 22 134 22 138 22 139 22 140 22 142 22 150 23 24 23 27 23 28 23 29 23 30 23 31 23 39 23 43 23 44 23 45 23 46 23 47 23 55 23 71 23 75 23 76 23 79 23 87 23 135 23 139 23 140 23 143 23 151 24 28 24 30 24 31 24 32 24 40 24 44 24 46 24 47 24 48 24 56 24 72 24 76 24 80 24 88 24 136 24 140 24 144 24 152 25 26 25 27 25 29 25 41 25 45 25 49 25 50 25 51 25 53 25 57 25 73 25 77 25 89 25 137 25 141 25 153 26 27 26 28 26 29 26 30 26 42 26 45 26 46 26 50 26 51 26 52 26 54 26 58 26 74 26 77 26 78 26 90 26 138 26 141 26 142 26 154 27 28 27 29 27 30 27 31 27 43 27 45 27 46 27 47 27 51 27 53 27 54 27 55 27 59 27 75 27 77 27 78 27 79 27 91 27 139 27 141 27 142 27 143 27 155 28 30 28 31 28 32 28 44 28 46 28 48 28 52 28 54 28 55 28 56 28 60 28 76 28 78 28 80 28 92 28 140 28 142 28 144 28 156 29 30 29 31 29 45 29 47 29 53 29 57 29 58 29 59 29 61 29 77 29 79 29 93 29 141 29 143 29 157 30 31 30 32 30 46 30 47 30 48 30 54 30 58 30 59 30 60 30 62 30 78 30 79 30 80 30 94 30 142 30 143 30 144 30 158 31 32 31 47 31 48 31 55 31 59 31 61 31 62 31 63 31 79 31 80 31 95 31 143 31 144 31 159 32 48 32 56 32 60 32 62 32 63 32 64 32 80 32 96 32 144 32 160 33 34 33 35 33 37 33 41 33 49 33 65 33 66 33 67 33 69 33 73 33 81 33 97 33 129 33 145 33 161 34 35 34 36 34 37 34 38 34 41 34 42 34 49 34 50 34 66 34 67 34 68 34 70 34 74 34 81 34 82 34 98 34 130 34 145 34 146 34 162 35 36 35 37 35 38 35 39 35 41 35 42 35 43 35 49 35 50 35 51 35 67 35 69 35 70 35 71 35 75 35 81 35 82 35 83 35 99 35 131 35 145 35 146 35 147 35 163 36 38 36 39 36 40 36 42 36 44 36 50 36 52 36 68 36 70 36 71 36 72 36 76 36 82 36 84 36 100 36 132 36 146 36 148 36 164 37 38 37 39 37 41 37 42 37 43 37 45 37 49 37 51 37 53 37 69 37 73 37 74 37 75 37 77 37 81 37 83 37 85 37 101 37 133 37 145 37 147 37 149 37 165 38 39 38 40 38 42 38 43 38 44 38 46 38 50 38 51 38 52 38 54 38 70 38 74 38 75 38 76 38 78 38 82 38 83 38 84 38 86 38 102 38 134 38 146 38 147 38 148 38 150 38 166 39 40 39 43 39 44 39 45 39 46 39 47 39 51 39 52 39 55 39 71 39 75 39 77 39 78 39 79 39 83 39 84 39 87 39 103 39 135 39 147 39 148 39 151 39 167 40 44 40 46 40 47 40 48 40 52 40 56 40 72 40 76 40 78 40 79 40 80 40 84 40 88 40 104 40 136 40 148 40 152 40 168 41 42 41 43 41 45 41 49 41 50 41 51 41 53 41 57 41 73 41 81 41 82 41 83 41 85 41 89 41 105 41 137 41 145 41 149 41 153 41 169 42 43 42 44 42 45 42 46 42 50 42 51 42 52 42 53 42 54 42 58 42 74 42 82 42 83 42 84 42 85 42 86 42 90 42 106 42 138 42 146 42 149 42 150 42 154 42 170 43 44 43 45 43 46 43 47 43 51 43 53 43 54 43 55 43 59 43 75 43 83 43 85 43 86 43 87 43 91 43 107 43 139 43 147 43 149 43 150 43 151 43 155 43 171 44 46 44 47 44 48 44 52 44 54 44 55 44 56 44 60 44 76 44 84 44 86 44 87 44 88 44 92 44 108 44 140 44 148 44 150 44 152 44 156 44 172 45 46 45 47 45 53 45 55 45 57 45 58 45 59 45 61 45 77 45 85 45 87 45 89 45 90 45 91 45 93 45 109 45 141 45 149 45 151 45 157 45 173 46 47 46 48 46 54 46 55 46 56 46 58 46 59 46 60 46 62 46 78 46 86 46 87 46 88 46 90 46 91 46 92 46 94 46 110 46 142 46 150 46 151 46 152 46 158 46 174 47 48 47 55 47 56 47 59 47 61 47 62 47 63 47 79 47 87 47 88 47 91 47 93 47 94 47 95 47 111 47 143 47 151 47 152 47 159 47 175 48 56 48 60 48 62 48 63 48 64 48 80 48 88 48 92 48 94 48 95 48 96 48 112 48 144 48 152 48 160 48 176 49 50 49 51 49 53 49 57 49 81 49 89 49 97 49 98 49 99 49 101 49 105 49 113 49 145 49 153 49 177 50 51 50 52 50 53 50 54 50 57 50 58 50 82 50 89 50 90 50 98 50 99 50 100 50 102 50 106 50 114 50 146 50 153 50 154 50 178 51 52 51 53 51 54 51 55 51 57 51 58 51 59 51 83 51 89 51 90 51 91 51 99 51 101 51 102 51 103 51 107 51 115 51 147 51 153 51 154 51 155 51 179 52 54 52 55 52 56 52 58 52 60 52 84 52 90 52 92 52 100 52 102 52 103 52 104 52 108 52 116 52 148 52 154 52 156 52 180 53 54 53 55 53 57 53 58 53 59 53 61 53 85 53 89 53 91 53 93 53 101 53 105 53 106 53 107 53 109 53 117 53 149 53 153 53 155 53 157 53 181 54 55 54 56 54 58 54 59 54 60 54 62 54 86 54 90 54 91 54 92 54 94 54 102 54 106 54 107 54 108 54 110 54 118 54 150 54 154 54 155 54 156 54 158 54 182 55 56 55 59 55 60 55 61 55 62 55 63 55 87 55 91 55 92 55 95 55 103 55 107 55 109 55 110 55 111 55 119 55 151 55 155 55 156 55 159 55 183 56 60 56 62 56 63 56 64 56 88 56 92 56 96 56 104 56 108 56 110 56 111 56 112 56 120 56 152 56 156 56 160 56 184 57 58 57 59 57 61 57 89 57 93 57 105 57 113 57 114 57 115 57 117 57 121 57 153 57 157 57 185 58 59 58 60 58 61 58 62 58 90 58 93 58 94 58 106 58 114 58 115 58 116 58 118 58 122 58 154 58 157 58 158 58 186 59 60 59 61 59 62 59 63 59 91 59 93 59 94 59 95 59 107 59 115 59 117 59 118 59 119 59 123 59 155 59 157 59 158 59 159 59 187 60 62 60 63 60 64 60 92 60 94 60 96 60 108 60 116 60 118 60 119 60 120 60 124 60 156 60 158 60 160 60 188 61 62 61 63 61 93 61 95 61 109 61 117 61 121 61 122 61 123 61 125 61 157 61 159 61 189 62 63 62 64 62 94 62 95 62 96 62 110 62 118 62 122 62 123 62 124 62 126 62 158 62 159 62 160 62 190 63 64 63 95 63 96 63 111 63 119 63 123 63 125 63 126 63 127 63 159 63 160 63 191 64 96 64 112 64 120 64 124 64 126 64 127 64 128 64 160 64 192 65 66 65 67 65 69 65 73 65 81 65 97 65 129 65 130 65 131 65 133 65 137 65 145 65 161 65 193 66 67 66 68 66 69 66 70 66 73 66 74 66 81 66 82 66 97 66 98 66 130 66 131 66 132 66 134 66 138 66 146 66 161 66 162 66 194 67 68 67 69 67 70 67 71 67 73 67 74 67 75 67 81 67 82 67 83 67 97 67 98 67 99 67 131 67 133 67 134 67 135 67 139 67 147 67 161 67 162 67 163 67 195 68 70 68 71 68 72 68 74 68 76 68 82 68 84 68 98 68 100 68 132 68 134 68 135 68 136 68 140 68 148 68 162 68 164 68 196 69 70 69 71 69 73 69 74 69 75 69 77 69 81 69 83 69 85 69 97 69 99 69 101 69 133 69 137 69 138 69 139 69 141 69 149 69 161 69 163 69 165 69 197 70 71 70 72 70 74 70 75 70 76 70 78 70 82 70 83 70 84 70 86 70 98 70 99 70 100 70 102 70 134 70 138 70 139 70 140 70 142 70 150 70 162 70 163 70 164 70 166 70 198 71 72 71 75 71 76 71 77 71 78 71 79 71 83 71 84 71 87 71 99 71 100 71 103 71 135 71 139 71 141 71 142 71 143 71 151 71 163 71 164 71 167 71 199 72 76 72 78 72 79 72 80 72 84 72 88 72 100 72 104 72 136 72 140 72 142 72 143 72 144 72 152 72 164 72 168 72 200 73 74 73 75 73 77 73 81 73 82 73 83 73 85 73 89 73 97 73 101 73 105 73 137 73 145 73 146 73 147 73 149 73 153 73 161 73 165 73 169 73 201 74 75 74 76 74 77 74 78 74 82 74 83 74 84 74 85 74 86 74 90 74 98 74 101 74 102 74 106 74 138 74 146 74 147 74 148 74 150 74 154 74 162 74 165 74 166 74 170 74 202 75 76 75 77 75 78 75 79 75 83 75 85 75 86 75 87 75 91 75 99 75 101 75 102 75 103 75 107 75 139 75 147 75 149 75 150 75 151 75 155 75 163 75 165 75 166 75 167 75 171 75 203 76 78 76 79 76 80 76 84 76 86 76 87 76 88 76 92 76 100 76 102 76 104 76 108 76 140 76 148 76 150 76 151 76 152 76 156 76 164 76 166 76 168 76 172 76 204 77 78 77 79 77 85 77 87 77 89 77 90 77 91 77 93 77 101 77 103 77 109 77 141 77 149 77 153 77 154 77 155 77 157 77 165 77 167 77 173 77 205 78 79 78 80 78 86 78 87 78 88 78 90 78 91 78 92 78 94 78 102 78 103 78 104 78 110 78 142 78 150 78 154 78 155 78 156 78 158 78 166 78 167 78 168 78 174 78 206 79 80 79 87 79 88 79 91 79 93 79 94 79 95 79 103 79 104 79 111 79 143 79 151 79 155 79 157 79 158 79 159 79 167 79 168 79 175 79 207 80 88 80 92 80 94 80 95 80 96 80 104 80 112 80 144 80 152 80 156 80 158 80 159 80 160 80 168 80 176 80 208 81 82 81 83 81 85 81 89 81 97 81 98 81 99 81 101 81 105 81 113 81 145 81 161 81 162 81 163 81 165 81 169 81 177 81 209 82 83 82 84 82 85 82 86 82 89 82 90 82 98 82 99 82 100 82 102 82 105 82 106 82 114 82 146 82 162 82 163 82 164 82 166 82 169 82 170 82 178 82 210 83 84 83 85 83 86 83 87 83 89 83 90 83 91 83 99 83 101 83 102 83 103 83 105 83 106 83 107 83 115 83 147 83 163 83 165 83 166 83 167 83 169 83 170 83 171 83 179 83 211 84 86 84 87 84 88 84 90 84 92 84 100 84 102 84 103 84 104 84 106 84 108 84 116 84 148 84 164 84 166 84 167 84 168 84 170 84 172 84 180 84 212 85 86 85 87 85 89 85 90 85 91 85 93 85 101 85 105 85 106 85 107 85 109 85 117 85 149 85 165 85 169 85 170 85 171 85 173 85 181 85 213 86 87 86 88 86 90 86 91 86 92 86 94 86 102 86 106 86 107 86 108 86 110 86 118 86 150 86 166 86 170 86 171 86 172 86 174 86 182 86 214 87 88 87 91 87 92 87 93 87 94 87 95 87 103 87 107 87 108 87 109 87 110 87 111 87 119 87 151 87 167 87 171 87 172 87 173 87 174 87 175 87 183 87 215 88 92 88 94 88 95 88 96 88 104 88 108 88 110 88 111 88 112 88 120 88 152 88 168 88 172 88 174 88 175 88 176 88 184 88 216 89 90 89 91 89 93 89 105 89 109 89 113 89 114 89 115 89 117 89 121 89 153 89 169 89 173 89 177 89 178 89 179 89 181 89 185 89 217 90 91 90 92 90 93 90 94 90 106 90 109 90 110 90 114 90 115 90 116 90 118 90 122 90 154 90 170 90 173 90 174 90 178 90 179 90 180 90 182 90 186 90 218 91 92 91 93 91 94 91 95 91 107 91 109 91 110 91 111 91 115 91 117 91 118 91 119 91 123 91 155 91 171 91 173 91 174 91 175 91 179 91 181 91 182 91 183 91 187 91 219 92 94 92 95 92 96 92 108 92 110 92 112 92 116 92 118 92 119 92 120 92 124 92 156 92 172 92 174 92 176 92 180 92 182 92 183 92 184 92 188 92 220 93 94 93 95 93 109 93 111 93 117 93 121 93 122 93 123 93 125 93 157 93 173 93 175 93 181 93 185 93 186 93 187 93 189 93 221 94 95 94 96 94 110 94 111 94 112 94 118 94 122 94 123 94 124 94 126 94 158 94 174 94 175 94 176 94 182 94 186 94 187 94 188 94 190 94 222 95 96 95 111 95 112 95 119 95 123 95 125 95 126 95 127 95 159 95 175 95 176 95 183 95 187 95 189 95 190 95 191 95 223 96 112 96 120 96 124 96 126 96 127 96 128 96 160 96 176 96 184 96 188 96 190 96 191 96 192 96 224 97 98 97 99 97 101 97 105 97 113 97 161 97 177 97 193 97 194 97 195 97 197 97 201 97 209 97 225 98 99 98 100 98 101 98 102 98 105 98 106 98 113 98 114 98 162 98 177 98 178 98 194 98 195 98 196 98 198 98 202 98 210 98 226 99 100 99 101 99 102 99 103 99 105 99 106 99 107 99 113 99 114 99 115 99 163 99 177 99 178 99 179 99 195 99 197 99 198 99 199 99 203 99 211 99 227 100 102 100 103 100 104 100 106 100 108 100 114 100 116 100 164 100 178 100 180 100 196 100 198 100 199 100 200 100 204 100 212 100 228 101 102 101 103 101 105 101 106 101 107 101 109 101 113 101 115 101 117 101 165 101 177 101 179 101 181 101 197 101 201 101 202 101 203 101 205 101 213 101 229 102 103 102 104 102 106 102 107 102 108 102 110 102 114 102 115 102 116 102 118 102 166 102 178 102 179 102 180 102 182 102 198 102 202 102 203 102 204 102 206 102 214 102 230 103 104 103 107 103 108 103 109 103 110 103 111 103 115 103 116 103 119 103 167 103 179 103 180 103 183 103 199 103 203 103 205 103 206 103 207 103 215 103 231 104 108 104 110 104 111 104 112 104 116 104 120 104 168 104 180 104 184 104 200 104 204 104 206 104 207 104 208 104 216 104 232 105 106 105 107 105 109 105 113 105 114 105 115 105 117 105 121 105 169 105 177 105 181 105 185 105 201 105 209 105 210 105 211 105 213 105 217 105 233 106 107 106 108 106 109 106 110 106 114 106 115 106 116 106 117 106 118 106 122 106 170 106 178 106 181 106 182 106 186 106 202 106 210 106 211 106 212 106 214 106 218 106 234 107 108 107 109 107 110 107 111 107 115 107 117 107 118 107 119 107 123 107 171 107 179 107 181 107 182 107 183 107 187 107 203 107 211 107 213 107 214 107 215 107 219 107 235 108 110 108 111 108 112 108 116 108 118 108 119 108 120 108 124 108 172 108 180 108 182 108 184 108 188 108 204 108 212 108 214 108 215 108 216 108 220 108 236 109 110 109 111 109 117 109 119 109 121 109 122 109 123 109 125 109 173 109 181 109 183 109 189 109 205 109 213 109 217 109 218 109 219 109 221 109 237 110 111 110 112 110 118 110 119 110 120 110 122 110 123 110 124 110 126 110 174 110 182 110 183 110 184 110 190 110 206 110 214 110 218 110 219 110 220 110 222 110 238 111 112 111 119 111 120 111 123 111 125 111 126 111 127 111 175 111 183 111 184 111 191 111 207 111 215 111 219 111 221 111 222 111 223 111 239 112 120 112 124 112 126 112 127 112 128 112 176 112 184 112 192 112 208 112 216 112 220 112 222 112 223 112 224 112 240 113 114 113 115 113 117 113 121 113 177 113 185 113 209 113 225 113 226 113 227 113 229 113 233 113 241 114 115 114 116 114 117 114 118 114 121 114 122 114 178 114 185 114 186 114 210 114 226 114 227 114 228 114 230 114 234 114 242 115 116 115 117 115 118 115 119 115 121 115 122 115 123 115 179 115 185 115 186 115 187 115 211 115 227 115 229 115 230 115 231 115 235 115 243 116 118 116 119 116 120 116 122 116 124 116 180 116 186 116 188 116 212 116 228 116 230 116 231 116 232 116 236 116 244 117 118 117 119 117 121 117 122 117 123 117 125 117 181 117 185 117 187 117 189 117 213 117 229 117 233 117 234 117 235 117 237 117 245 118 119 118 120 118 122 118 123 118 124 118 126 118 182 118 186 118 187 118 188 118 190 118 214 118 230 118 234 118 235 118 236 118 238 118 246 119 120 119 123 119 124 119 125 119 126 119 127 119 183 119 187 119 188 119 191 119 215 119 231 119 235 119 237 119 238 119 239 119 247 120 124 120 126 120 127 120 128 120 184 120 188 120 192 120 216 120 232 120 236 120 238 120 239 120 240 120 248 121 122 121 123 121 125 121 185 121 189 121 217 121 233 121 241 121 242 121 243 121 245 121 249 122 123 122 124 122 125 122 126 122 186 122 189 122 190 122 218 122 234 122 242 122 243 122 244 122 246 122 250 123 124 123 125 123 126 123 127 123 187 123 189 123 190 123 191 123 219 123 235 123 243 123 245 123 246 123 247 123 251 124 126 124 127 124 128 124 188 124 190 124 192 124 220 124 236 124 244 124 246 124 247 124 248 124 252 125 126 125 127 125 189 125 191 125 221 125 237 125 245 125 249 125 250 125 251 125 253 126 127 126 128 126 190 126 191 126 192 126 222 126 238 126 246 126 250 126 251 126 252 126 254 127 128 127 191 127 192 127 223 127 239 127 247 127 251 127 253 127 254 127 255 128 192 128 224 128 240 128 248 128 252 128 254 128 255 128 256 129 130 129 131 129 133 129 137 129 145 129 161 129 193 130 131 130 132 130 133 130 134 130 137 130 138 130 145 130 146 130 161 130 162 130 193 130 194 131 132 131 133 131 134 131 135 131 137 131 138 131 139 131 145 131 146 131 147 131 161 131 162 131 163 131 193 131 194 131 195 132 134 132 135 132 136 132 138 132 140 132 146 132 148 132 162 132 164 132 194 132 196 133 134 133 135 133 137 133 138 133 139 133 141 133 145 133 147 133 149 133 161 133 163 133 165 133 193 133 195 133 197 134 135 134 136 134 138 134 139 134 140 134 142 134 146 134 147 134 148 134 150 134 162 134 163 134 164 134 166 134 194 134 195 134 196 134 198 135 136 135 139 135 140 135 141 135 142 135 143 135 147 135 148 135 151 135 163 135 164 135 167 135 195 135 196 135 199 136 140 136 142 136 143 136 144 136 148 136 152 136 164 136 168 136 196 136 200 137 138 137 139 137 141 137 145 137 146 137 147 137 149 137 153 137 161 137 165 137 169 137 193 137 197 137 201 138 139 138 140 138 141 138 142 138 146 138 147 138 148 138 149 138 150 138 154 138 162 138 165 138 166 138 170 138 194 138 197 138 198 138 202 139 140 139 141 139 142 139 143 139 147 139 149 139 150 139 151 139 155 139 163 139 165 139 166 139 167 139 171 139 195 139 197 139 198 139 199 139 203 140 142 140 143 140 144 140 148 140 150 140 151 140 152 140 156 140 164 140 166 140 168 140 172 140 196 140 198 140 200 140 204 141 142 141 143 141 149 141 151 141 153 141 154 141 155 141 157 141 165 141 167 141 173 141 197 141 199 141 205 142 143 142 144 142 150 142 151 142 152 142 154 142 155 142 156 142 158 142 166 142 167 142 168 142 174 142 198 142 199 142 200 142 206 143 144 143 151 143 152 143 155 143 157 143 158 143 159 143 167 143 168 143 175 143 199 143 200 143 207 144 152 144 156 144 158 144 159 144 160 144 168 144 176 144 200 144 208 145 146 145 147 145 149 145 153 145 161 145 162 145 163 145 165 145 169 145 177 145 193 145 201 145 209 146 147 146 148 146 149 146 150 146 153 146 154 146 162 146 163 146 164 146 166 146 169 146 170 146 178 146 194 146 201 146 202 146 210 147 148 147 149 147 150 147 151 147 153 147 154 147 155 147 163 147 165 147 166 147 167 147 169 147 170 147 171 147 179 147 195 147 201 147 202 147 203 147 211 148 150 148 151 148 152 148 154 148 156 148 164 148 166 148 167 148 168 148 170 148 172 148 180 148 196 148 202 148 204 148 212 149 150 149 151 149 153 149 154 149 155 149 157 149 165 149 169 149 170 149 171 149 173 149 181 149 197 149 201 149 203 149 205 149 213 150 151 150 152 150 154 150 155 150 156 150 158 150 166 150 170 150 171 150 172 150 174 150 182 150 198 150 202 150 203 150 204 150 206 150 214 151 152 151 155 151 156 151 157 151 158 151 159 151 167 151 171 151 172 151 173 151 174 151 175 151 183 151 199 151 203 151 204 151 207 151 215 152 156 152 158 152 159 152 160 152 168 152 172 152 174 152 175 152 176 152 184 152 200 152 204 152 208 152 216 153 154 153 155 153 157 153 169 153 173 153 177 153 178 153 179 153 181 153 185 153 201 153 205 153 217 154 155 154 156 154 157 154 158 154 170 154 173 154 174 154 178 154 179 154 180 154 182 154 186 154 202 154 205 154 206 154 218 155 156 155 157 155 158 155 159 155 171 155 173 155 174 155 175 155 179 155 181 155 182 155 183 155 187 155 203 155 205 155 206 155 207 155 219 156 158 156 159 156 160 156 172 156 174 156 176 156 180 156 182 156 183 156 184 156 188 156 204 156 206 156 208 156 220 157 158 157 159 157 173 157 175 157 181 157 185 157 186 157 187 157 189 157 205 157 207 157 221 158 159 158 160 158 174 158 175 158 176 158 182 158 186 158 187 158 188 158 190 158 206 158 207 158 208 158 222 159 160 159 175 159 176 159 183 159 187 159 189 159 190 159 191 159 207 159 208 159 223 160 176 160 184 160 188 160 190 160 191 160 192 160 208 160 224 161 162 161 163 161 165 161 169 161 177 161 193 161 194 161 195 161 197 161 201 161 209 161 225 162 163 162 164 162 165 162 166 162 169 162 170 162 177 162 178 162 194 162 195 162 196 162 198 162 202 162 209 162 210 162 226 163 164 163 165 163 166 163 167 163 169 163 170 163 171 163 177 163 178 163 179 163 195 163 197 163 198 163 199 163 203 163 209 163 210 163 211 163 227 164 166 164 167 164 168 164 170 164 172 164 178 164 180 164 196 164 198 164 199 164 200 164 204 164 210 164 212 164 228 165 166 165 167 165 169 165 170 165 171 165 173 165 177 165 179 165 181 165 197 165 201 165 202 165 203 165 205 165 209 165 211 165 213 165 229 166 167 166 168 166 170 166 171 166 172 166 174 166 178 166 179 166 180 166 182 166 198 166 202 166 203 166 204 166 206 166 210 166 211 166 212 166 214 166 230 167 168 167 171 167 172 167 173 167 174 167 175 167 179 167 180 167 183 167 199 167 203 167 205 167 206 167 207 167 211 167 212 167 215 167 231 168 172 168 174 168 175 168 176 168 180 168 184 168 200 168 204 168 206 168 207 168 208 168 212 168 216 168 232 169 170 169 171 169 173 169 177 169 178 169 179 169 181 169 185 169 201 169 209 169 210 169 211 169 213 169 217 169 233 170 171 170 172 170 173 170 174 170 178 170 179 170 180 170 181 170 182 170 186 170 202 170 210 170 211 170 212 170 213 170 214 170 218 170 234 171 172 171 173 171 174 171 175 171 179 171 181 171 182 171 183 171 187 171 203 171 211 171 213 171 214 171 215 171 219 171 235 172 174 172 175 172 176 172 180 172 182 172 183 172 184 172 188 172 204 172 212 172 214 172 215 172 216 172 220 172 236 173 174 173 175 173 181 173 183 173 185 173 186 173 187 173 189 173 205 173 213 173 215 173 217 173 218 173 219 173 221 173 237 174 175 174 176 174 182 174 183 174 184 174 186 174 187 174 188 174 190 174 206 174 214 174 215 174 216 174 218 174 219 174 220 174 222 174 238 175 176 175 183 175 184 175 187 175 189 175 190 175 191 175 207 175 215 175 216 175 219 175 221 175 222 175 223 175 239 176 184 176 188 176 190 176 191 176 192 176 208 176 216 176 220 176 222 176 223 176 224 176 240 177 178 177 179 177 181 177 185 177 209 177 217 177 225 177 226 177 227 177 229 177 233 177 241 178 179 178 180 178 181 178 182 178 185 178 186 178 210 178 217 178 218 178 226 178 227 178 228 178 230 178 234 178 242 179 180 179 181 179 182 179 183 179 185 179 186 179 187 179 211 179 217 179 218 179 219 179 227 179 229 179 230 179 231 179 235 179 243 180 182 180 183 180 184 180 186 180 188 180 212 180 218 180 220 180 228 180 230 180 231 180 232 180 236 180 244 181 182 181 183 181 185 181 186 181 187 181 189 181 213 181 217 181 219 181 221 181 229 181 233 181 234 181 235 181 237 181 245 182 183 182 184 182 186 182 187 182 188 182 190 182 214 182 218 182 219 182 220 182 222 182 230 182 234 182 235 182 236 182 238 182 246 183 184 183 187 183 188 183 189 183 190 183 191 183 215 183 219 183 220 183 223 183 231 183 235 183 237 183 238 183 239 183 247 184 188 184 190 184 191 184 192 184 216 184 220 184 224 184 232 184 236 184 238 184 239 184 240 184 248 185 186 185 187 185 189 185 217 185 221 185 233 185 241 185 242 185 243 185 245 185 249 186 187 186 188 186 189 186 190 186 218 186 221 186 222 186 234 186 242 186 243 186 244 186 246 186 250 187 188 187 189 187 190 187 191 187 219 187 221 187 222 187 223 187 235 187 243 187 245 187 246 187 247 187 251 188 190 188 191 188 192 188 220 188 222 188 224 188 236 188 244 188 246 188 247 188 248 188 252 189 190 189 191 189 221 189 223 189 237 189 245 189 249 189 250 189 251 189 253 190 191 190 192 190 222 190 223 190 224 190 238 190 246 190 250 190 251 190 252 190 254 191 192 191 223 191 224 191 239 191 247 191 251 191 253 191 254 191 255 192 224 192 240 192 248 192 252 192 254 192 255 192 256 193 194 193 195 193 197 193 201 193 209 193 225 194 195 194 196 194 197 194 198 194 201 194 202 194 209 194 210 194 225 194 226 195 196 195 197 195 198 195 199 195 201 195 202 195 203 195 209 195 210 195 211 195 225 195 226 195 227 196 198 196 199 196 200 196 202 196 204 196 210 196 212 196 226 196 228 197 198 197 199 197 201 197 202 197 203 197 205 197 209 197 211 197 213 197 225 197 227 197 229 198 199 198 200 198 202 198 203 198 204 198 206 198 210 198 211 198 212 198 214 198 226 198 227 198 228 198 230 199 200 199 203 199 204 199 205 199 206 199 207 199 211 199 212 199 215 199 227 199 228 199 231 200 204 200 206 200 207 200 208 200 212 200 216 200 228 200 232 201 202 201 203 201 205 201 209 201 210 201 211 201 213 201 217 201 225 201 229 201 233 202 203 202 204 202 205 202 206 202 210 202 211 202 212 202 213 202 214 202 218 202 226 202 229 202 230 202 234 203 204 203 205 203 206 203 207 203 211 203 213 203 214 203 215 203 219 203 227 203 229 203 230 203 231 203 235 204 206 204 207 204 208 204 212 204 214 204 215 204 216 204 220 204 228 204 230 204 232 204 236 205 206 205 207 205 213 205 215 205 217 205 218 205 219 205 221 205 229 205 231 205 237 206 207 206 208 206 214 206 215 206 216 206 218 206 219 206 220 206 222 206 230 206 231 206 232 206 238 207 208 207 215 207 216 207 219 207 221 207 222 207 223 207 231 207 232 207 239 208 216 208 220 208 222 208 223 208 224 208 232 208 240 209 210 209 211 209 213 209 217 209 225 209 226 209 227 209 229 209 233 209 241 210 211 210 212 210 213 210 214 210 217 210 218 210 226 210 227 210 228 210 230 210 233 210 234 210 242 211 212 211 213 211 214 211 215 211 217 211 218 211 219 211 227 211 229 211 230 211 231 211 233 211 234 211 235 211 243 212 214 212 215 212 216 212 218 212 220 212 228 212 230 212 231 212 232 212 234 212 236 212 244 213 214 213 215 213 217 213 218 213 219 213 221 213 229 213 233 213 234 213 235 213 237 213 245 214 215 214 216 214 218 214 219 214 220 214 222 214 230 214 234 214 235 214 236 214 238 214 246 215 216 215 219 215 220 215 221 215 222 215 223 215 231 215 235 215 236 215 237 215 238 215 239 215 247 216 220 216 222 216 223 216 224 216 232 216 236 216 238 216 239 216 240 216 248 217 218 217 219 217 221 217 233 217 237 217 241 217 242 217 243 217 245 217 249 218 219 218 220 218 221 218 222 218 234 218 237 218 238 218 242 218 243 218 244 218 246 218 250 219 220 219 221 219 222 219 223 219 235 219 237 219 238 219 239 219 243 219 245 219 246 219 247 219 251 220 222 220 223 220 224 220 236 220 238 220 240 220 244 220 246 220 247 220 248 220 252 221 222 221 223 221 237 221 239 221 245 221 249 221 250 221 251 221 253 222 223 222 224 222 238 222 239 222 240 222 246 222 250 222 251 222 252 222 254 223 224 223 239 223 240 223 247 223 251 223 253 223 254 223 255 224 240 224 248 224 252 224 254 224 255 224 256 225 226 225 227 225 229 225 233 225 241 226 227 226 228 226 229 226 230 226 233 226 234 226 241 226 242 227 228 227 229 227 230 227 231 227 233 227 234 227 235 227 241 227 242 227 243 228 230 228 231 228 232 228 234 228 236 228 242 228 244 229 230 229 231 229 233 229 234 229 235 229 237 229 241 229 243 229 245 230 231 230 232 230 234 230 235 230 236 230 238 230 242 230 243 230 244 230 246 231 232 231 235 231 236 231 237 231 238 231 239 231 243 231 244 231 247 232 236 232 238 232 239 232 240 232 244 232 248 233 234 233 235 233 237 233 241 233 242 233 243 233 245 233 249 234 235 234 236 234 237 234 238 234 242 234 243 234 244 234 245 234 246 234 250 235 236 235 237 235 238 235 239 235 243 235 245 235 246 235 247 235 251 236 238 236 239 236 240 236 244 236 246 236 247 236 248 236 252 237 238 237 239 237 245 237 247 237 249 237 250 237 251 237 253 238 239 238 240 238 246 238 247 238 248 238 250 238 251 238 252 238 254 239 240 239 247 239 248 239 251 239 253 239 254 239 255 240 248 240 252 240 254 240 255 240 256 241 242 241 243 241 245 241 249 242 243 242 244 242 245 242 246 242 249 242 250 243 244 243 245 243 246 243 247 243 249 243 250 243 251 244 246 244 247 244 248 244 250 244 252 245 246 245 247 245 249 245 250 245 251 245 253 246 247 246 248 246 250 246 251 246 252 246 254 247 248 247 251 247 252 247 253 247 254 247 255 248 252 248 254 248 255 248 256 249 250 249 251 249 253 250 251 250 252 250 253 250 254 251 252 251 253 251 254 251 255 252 254 252 255 252 256 253 254 253 255 254 255 254 256 255 256 ; end; glpk-5.0/examples/money.mod0000644000062000006210000000341113766346220015147 0ustar maomkpasswd/* MONEY, a crypto-arithmetic puzzle */ /* Written in GNU MathProg by Andrew Makhorin */ /* This is the classic example of a crypto-arithmetic puzzle published in the Strand Magazine by Henry Dudeney: S E N D + M O R E --------- M O N E Y In this puzzle the same letters mean the same digits. The question is: how to replace all the letters with the respective digits that makes the calculation correct? The solution to this puzzle is: O = 0, M = 1, Y = 2, E = 5, N = 6, D = 7, R = 8, and S = 9. References: H. E. Dudeney, in Strand Magazine vol. 68 (July 1924), pp. 97, 214. (From Wikipedia, the free encyclopedia.) */ set LETTERS := { 'D', 'E', 'M', 'N', 'O', 'R', 'S', 'Y' }; /* set of letters */ set DIGITS := 0..9; /* set of digits */ var x{i in LETTERS, d in DIGITS}, binary; /* x[i,d] = 1 means that letter i is digit d */ s.t. one{i in LETTERS}: sum{d in DIGITS} x[i,d] = 1; /* each letter must correspond exactly to one digit */ s.t. alldiff{d in DIGITS}: sum{i in LETTERS} x[i,d] <= 1; /* different letters must correspond to different digits; note that some digits may not correspond to any letters at all */ var dig{i in LETTERS}; /* dig[i] is a digit corresponding to letter i */ s.t. map{i in LETTERS}: dig[i] = sum{d in DIGITS} d * x[i,d]; var carry{1..3}, binary; /* carry bits */ s.t. sum1: dig['D'] + dig['E'] = dig['Y'] + 10 * carry[1]; s.t. sum2: dig['N'] + dig['R'] + carry[1] = dig['E'] + 10 * carry[2]; s.t. sum3: dig['E'] + dig['O'] + carry[2] = dig['N'] + 10 * carry[3]; s.t. sum4: dig['S'] + dig['M'] + carry[3] = dig['O'] + 10 * dig['M']; s.t. note: dig['M'] >= 1; /* M must not be 0 */ solve; /* solve the puzzle */ display dig; /* and display its solution */ end; glpk-5.0/examples/mplsamp1.c0000644000062000006210000000142013766346220015213 0ustar maomkpasswd/* mplsamp1.c */ #include #include #include int main(void) { glp_prob *lp; glp_tran *tran; int ret; lp = glp_create_prob(); tran = glp_mpl_alloc_wksp(); ret = glp_mpl_read_model(tran, "egypt.mod", 0); if (ret != 0) { fprintf(stderr, "Error on translating model\n"); goto skip; } ret = glp_mpl_generate(tran, NULL); if (ret != 0) { fprintf(stderr, "Error on generating model\n"); goto skip; } glp_mpl_build_prob(tran, lp); ret = glp_write_mps(lp, GLP_MPS_FILE, NULL, "egypt.mps"); if (ret != 0) fprintf(stderr, "Error on writing MPS file\n"); skip: glp_mpl_free_wksp(tran); glp_delete_prob(lp); return 0; } /* eof */ glpk-5.0/examples/mplsamp2.c0000644000062000006210000000174013766346220015221 0ustar maomkpasswd/* mplsamp2.c */ #include #include #include int main(void) { glp_prob *mip; glp_tran *tran; int ret; mip = glp_create_prob(); tran = glp_mpl_alloc_wksp(); ret = glp_mpl_read_model(tran, "sudoku.mod", 1); if (ret != 0) { fprintf(stderr, "Error on translating model\n"); goto skip; } ret = glp_mpl_read_data(tran, "sudoku.dat"); if (ret != 0) { fprintf(stderr, "Error on translating data\n"); goto skip; } ret = glp_mpl_generate(tran, NULL); if (ret != 0) { fprintf(stderr, "Error on generating model\n"); goto skip; } glp_mpl_build_prob(tran, mip); glp_simplex(mip, NULL); glp_intopt(mip, NULL); ret = glp_mpl_postsolve(tran, mip, GLP_MIP); if (ret != 0) fprintf(stderr, "Error on postsolving model\n"); skip: glp_mpl_free_wksp(tran); glp_delete_prob(mip); return 0; } /* eof */ glpk-5.0/examples/murtagh.mps0000644000062000006210000003754013766346220015521 0ustar maomkpasswd*NAME: OIL *ROWS: 74 *COLUMNS: 81 *NONZERO: 504 *OPT SOLN: 126.057 *SOURCE: Bruce Murtagh, "Advanced Linear Programming" *APPLICATION: oil refinery model *COMMENTS: problem is maximization * NAME OIL REFINERY EXAMPLE ROWS N PROFIT L MVOLBOL L MVOLCOL E MVOLLNC E MVOLLNB E MVOLSRK E MVOLSRD E MVOLVBB E MVOLVBC E MVOLRCR E MVOLHVO E UBALKWH E UBALH2O E UBALSTM E UBALFUL E MVOLB95 E MVOLB90 E MVOLLHG E MVOLC3S E MVOLNC4 E MVOLLSR E MVOLHSR E MVOLIC4 L VCAPSGP E MVOLRFG E MSCFHYL E MVOLR90 E MVOLR95 E MVOLF90 E MVOLF95 L VCAPRFG E MVOLLCO E MVOLHHG E MVOLHCD L VCAPHVO L VCAPHOL E MVOLC3U E MVOLC4U E MVOLFCG E MVOLSLR L VCAPCCU E MVOLLA3 E MVOLLA4 L VCAPALK L XLPRPRE L XHPRPRE L XTELPRE L XRVPPRE L X200PRE L X230PRE E EVOLPRE L XPSCPRE L XRSCREG L XLPRINT L XHPRINT L XTELINT L XRVPINT L X200INT L X230INT E EVOLINT L XLPRREG L XHPRREG L XTELREG L XRVPREG L X200REG L X230REG E EVOLREG E EVOLLPG E EVOLJP4 L XRVXJP4 L XRVNJP4 E EVOLDSL E EVOLRSD L XVISRSD COLUMNS VCRDBOL MVOLBOL 1.0 VCRDBOL MVOLLNB -.537 VCRDBOL MVOLSRK -.131 VCRDBOL MVOLSRD -.1155 VCRDBOL MVOLVBB -.037 VCRDBOL MVOLRCR -.0365 VCRDBOL MVOLHVO -.143 VCRDBOL UBALKWH .302 VCRDBOL UBALH2O .150 VCRDBOL UBALSTM .003 VCRDBOL UBALFUL .0587 VCRDBOL PROFIT -12.8 VCRDCOL MVOLCOL 1. VCRDCOL MVOLLNC -.2931 VCRDCOL MVOLSRK -.1170 VCRDCOL MVOLSRD -.0649 VCRDCOL MVOLVBC -.18 VCRDCOL MVOLRCR -.1233 VCRDCOL MVOLHVO -.2217 VCRDCOL UBALKWH .384 VCRDCOL UBALH2O .185 VCRDCOL UBALSTM .003 VCRDCOL UBALFUL .1053 VCRDCOL PROFIT -11.48 VSGPLNC MVOLLNC 1. VSGPLNC MVOLC3S -.0112 VSGPLNC MVOLNC4 -.0378 VSGPLNC MVOLLSR -.1502 VSGPLNC MVOLHSR -.7953 VSGPLNC MVOLIC4 -.0099 VSGPLNC UBALKWH .721 VSGPLNC UBALH2O .185 VSGPLNC UBALSTM .013 VSGPLNC UBALFUL .0488 VSGPLNC VCAPSGP 1. VSGPLNB MVOLLNB 1. VSGPLNB MVOLC3S -.0277 VSGPLNB MVOLNC4 -.0563 VSGPLNB MVOLLSR -.199 VSGPLNB MVOLHSR -.6873 VSGPLNB MVOLIC4 -.017 VSGPLNB UBALKWH .495 VSGPLNB UBALH2O .209 VSGPLNB UBALSTM .013 VSGPLNB UBALFUL .0506 VSGPLNB VCAPSGP 1. VSGPLHG MVOLLHG 1.0 VSGPLHG MVOLC3S -.175 VSGPLHG MVOLNC4 -.27 VSGPLHG MVOLLSR -.028 VSGPLHG MVOLIC4 -.455 VSGPLHG UBALKWH .495 VSGPLHG UBALH2O .209 VSGPLHG UBALSTM .013 VSGPLHG UBALFUL .0448 VSGPB95 MVOLB95 1. VSGPB95 MVOLC3S -.2836 VSGPB95 MVOLNC4 -.3285 VSGPB95 MVOLLSR -.0241 VSGPB95 MVOLIC4 -.2502 VSGPB95 UBALKWH .495 VSGPB95 UBALH2O .209 VSGPB95 UBALSTM .013 VSGPB95 UBALFUL .0506 VSGPB90 MVOLB90 1. VSGPB90 MVOLC3S -.271 VSGPB90 MVOLNC4 -.3289 VSGPB90 MVOLLSR -.0255 VSGPB90 MVOLIC4 -.2656 VSGPB90 UBALKWH .495 VSGPB90 UBALH2O .209 VSGPB90 UBALSTM .013 VSGPB90 UBALFUL .0506 VH2RHSR MVOLHSR 1. VH2RHSR MVOLRFG -1. VH2RHSR MSCFHYL .0327 VH2RHSR UBALKWH .793 VH2RHSR UBALH2O .045 VH2RHSR UBALFUL .094 VH2RHSR PROFIT -.0176 VRFFRF1 MVOLRFG 1.0 VRFFRF1 MVOLR90 -1.0 VRFFRF2 MVOLRFG 1.0 VRFFRF2 MVOLR95 -1.0 VRFFHH1 MVOLR90 -1.0 VRFFHH1 MVOLHHG 1.0 VRFFHH2 MVOLR95 -1.0 VRFFHH2 MVOLHHG 1.0 VRFGR90 MVOLR90 1.0 VRFGR90 MVOLB90 -.0404 VRFGR90 MVOLF90 -0.8564 VRFGR90 MSCFHYL -0.8239 VRFGR90 UBALKWH .792 VRFGR90 UBALH2O .297 VRFGR90 UBALSTM 0.0063 VRFGR90 UBALFUL -0.156 VRFGR90 VCAPRFG 1.0 VRFGR90 PROFIT -0.1512 VRFGR95 MVOLR95 1.0 VRFGR95 MVOLB95 -0.0588 VRFGR95 MVOLF95 -0.8145 VRFGR95 MSCFHYL -.7689 VRFGR95 UBALKWH 1.03 VRFGR95 UBALH2O .387 VRFGR95 UBALSTM 0.008 VRFGR95 UBALFUL -.2112 VRFGR95 VCAPRFG 1.3 VRFGR95 PROFIT -0.304 VHOLLCO MVOLLCO 1.0 VHOLLCO MVOLHHG -.6627 VHOLLCO MVOLLHG -0.2414 VHOLLCO MVOLHCD -.2930 VHOLLCO MSCFHYL 2.3 VHOLLCO UBALFUL -.2054 VHOLLCO UBALH2O 0.826 VHOLLCO UBALKWH 14.61 VHOLLCO VCAPHOL 1.0 VHOLLCO PROFIT -0.2112 VHOLSRD MVOLSRD 1.0 VHOLSRD MVOLHHG -.6627 VHOLSRD MVOLLHG -0.2414 VHOLSRD MVOLHCD -.2930 VHOLSRD MSCFHYL 2.3 VHOLSRD UBALFUL -.2054 VHOLSRD UBALH2O 0.826 VHOLSRD UBALKWH 14.61 VHOLSRD VCAPHOL 1.0 VHOLSRD PROFIT -0.2112 VHOLRCR MVOLRCR 1.0 VHOLRCR MVOLHHG -.5875 VHOLRCR MVOLLHG -0.3321 VHOLRCR MVOLHCD -.3620 VHOLRCR MSCFHYL 2.3 VHOLRCR UBALFUL -.2054 VHOLRCR UBALH2O 0.826 VHOLRCR UBALKWH 14.61 VHOLRCR VCAPHOL 1.0 VHOLRCR PROFIT -0.2112 VHOLHVO MVOLHVO 1.0 VHOLHVO MVOLHHG -.5875 VHOLHVO MVOLLHG -0.3321 VHOLHVO MVOLHCD -.3620 VHOLHVO MSCFHYL 2.3 VHOLHVO UBALFUL -.2054 VHOLHVO UBALH2O 0.826 VHOLHVO UBALKWH 14.61 VHOLHVO VCAPHVO 1.0 VHOLHVO VCAPHOL 1.0 VHOLHVO PROFIT -0.2112 VCCUSRK MVOLSRK 1.0 VCCUSRK MVOLNC4 -0.0184 VCCUSRK MVOLC3S -0.0303 VCCUSRK MVOLIC4 -0.0564 VCCUSRK MVOLC3U -0.0655 VCCUSRK MVOLC4U -0.0780 VCCUSRK MVOLFCG -0.4750 VCCUSRK MVOLLCO -0.3050 VCCUSRK UBALSTM -.0654 VCCUSRK UBALFUL -.2703 VCCUSRK UBALH2O .632 VCCUSRK UBALKWH .6807 VCCUSRK VCAPCCU 1. VCCUSRK PROFIT -.2112 VCCUSRD MVOLSRD 1. VCCUSRD MVOLNC4 -.0184 VCCUSRD MVOLC3S -.0303 VCCUSRD MVOLIC4 -.0564 VCCUSRD MVOLC3U -.0655 VCCUSRD MVOLC4U -.0780 VCCUSRD MVOLFCG -.4750 VCCUSRD MVOLLCO -.3050 VCCUSRD UBALSTM -.0654 VCCUSRD UBALFUL -.2703 VCCUSRD UBALH2O 0.632 VCCUSRD UBALKWH .6807 VCCUSRD VCAPCCU 1. VCCUSRD PROFIT -.2112 VCCURCR MVOLRCR 1.0 VCCURCR MVOLNC4 -.0185 VCCURCR MVOLC3S -.0328 VCCURCR MVOLIC4 -.0568 VCCURCR MVOLC3U -.0658 VCCURCR MVOLC4U -.0806 VCCURCR MVOLFCG -.4934 VCCURCR MVOLLCO -.2922 VCCURCR MVOLSLR -.0096 VCCURCR UBALSTM -.0654 VCCURCR UBALFUL -.2703 VCCURCR UBALH2O 0.632 VCCURCR UBALKWH .6807 VCCURCR VCAPCCU 1. VCCURCR PROFIT -.2112 VCCUHVO MVOLHVO 1.0 VCCUHVO MVOLNC4 -.0185 VCCUHVO MVOLC3S -.0328 VCCUHVO MVOLIC4 -.0568 VCCUHVO MVOLC3U -.0658 VCCUHVO MVOLC4U -.0806 VCCUHVO MVOLFCG -.4934 VCCUHVO MVOLLCO -.2922 VCCUHVO MVOLSLR -.0096 VCCUHVO UBALSTM -.0654 VCCUHVO UBALFUL -.2703 VCCUHVO UBALH2O 0.632 VCCUHVO UBALKWH .6807 VCCUHVO VCAPHVO 1. VCCUHVO VCAPCCU 1. VCCUHVO PROFIT -.2112 VALKLA3 MVOLIC4 .7600 VALKLA3 MVOLC3U .5714 VALKLA3 MVOLLA3 -1.0 VALKLA3 UBALSTM .1869 VALKLA3 UBALFUL .2796 VALKLA3 UBALH2O 2.241 VALKLA3 UBALKWH 2.766 VALKLA3 VCAPALK 1.0 VALKLA3 PROFIT -.512 VALKLA4 MVOLIC4 .6571 VALKLA4 MVOLC4U .5714 VALKLA4 MVOLC3S -.0571 VALKLA4 MVOLNC4 -.0114 VALKLA4 MVOLLA4 -1.0 VALKLA4 UBALSTM .1724 VALKLA4 UBALFUL .2579 VALKLA4 UBALH2O 2.067 VALKLA4 UBALKWH 2.552 VALKLA4 VCAPALK 1.0 VALKLA4 PROFIT -.472 VALKIC4 MVOLIC4 1.0 VALKIC4 MVOLNC4 -1.0 VALKC3U MVOLC3U 1.0 VALKC3U MVOLC3S -1.0 VALKC4U MVOLC4U 1.0 VALKC4U MVOLNC4 -1.0 UTILC3S MVOLC3S 1. UTILC3S UBALFUL -3.814 UTILNC4 MVOLNC4 1. UTILNC4 UBALFUL -4.316 UTILIC4 MVOLIC4 1. UTILIC4 UBALFUL -4.153 UTILC3U MVOLC3U 1. UTILC3U UBALFUL -3.808 UTILC4U MVOLC4U 1. UTILC4U UBALFUL -4.44 UTILHYL MSCFHYL 1. UTILHYL UBALFUL -.305 UTILSTM UBALSTM -1. UTILSTM UBALFUL 1.42 UTILSTM PROFIT -.16 PURCPC4 MVOLIC4 -.5 PURCPC4 MVOLNC4 -.5 PURCPC4 PROFIT -12. PURCH2O UBALH2O -1. PURCH2O PROFIT -.0528 PURCKWH UBALKWH -1. PURCKWH PROFIT -.04 PURCFUL UBALFUL -1. PURCFUL PROFIT -1.6 PURCFLR UBALFUL 1. BLPGC3S MVOLC3S 1.0 BLPGC3S EVOLLPG -1.0 BLPGNC4 MVOLNC4 1.0 BLPGNC4 EVOLLPG -1.0 SELLLPG EVOLLPG 1.0 SELLLPG PROFIT 11.0 BUP4LSR MVOLLSR 1.0 BUP4LSR EVOLJP4 -1.0 BUP4LSR XRVXJP4 14.0 BUP4LSR XRVNJP4 -14.0 BUP4HSR MVOLHSR 1.0 BUP4HSR EVOLJP4 -1.0 BUP4HSR XRVXJP4 0.8 BUP4HSR XRVNJP4 -0.8 SELLJP4 EVOLJP4 1.0 SELLJP4 XRVXJP4 -3.0 SELLJP4 XRVNJP4 2.0 SELLJP4 PROFIT 16.8 BDSLSRK MVOLSRK 1.0 BDSLSRK EVOLDSL -1.0 BDSLSRD MVOLSRD 1.0 BDSLSRD EVOLDSL -1.0 SELLDSL EVOLDSL 1.0 SELLDSL PROFIT 14.4 BPRELSR MVOLLSR 1. BPRELSR XLPRPRE -7.95 BPRELSR XHPRPRE -8.70 BPRELSR XTELPRE -3.00 BPRELSR XRVPPRE 14.00 BPRELSR X200PRE 1. BPRELSR X230PRE -1. BPRELSR EVOLPRE -1. BPREHCD MVOLHCD 1.0 BPREHCD XLPRPRE -8.84 BPREHCD XHPRPRE -9.45 BPREHCD XTELPRE -3.00 BPREHCD XRVPPRE 12.00 BPREHCD X200PRE 1. BPREHCD X230PRE -1. BPREHCD EVOLPRE -1. BPREF95 MVOLF95 1.0 BPREF95 XLPRPRE -9.43 BPREF95 XHPRPRE -9.57 BPREF95 XTELPRE -3. BPREF95 XRVPPRE 3.5 BPREF95 X200PRE .233 BPREF95 X230PRE -.358 BPREF95 EVOLPRE -1. BPREF90 MVOLF90 1.0 BPREF90 XLPRPRE -9.03 BPREF90 XHPRPRE -9.32 BPREF90 XTELPRE -3.0 BPREF90 XRVPPRE 3.5 BPREF90 X200PRE .205 BPREF90 X230PRE -.333 BPREF90 EVOLPRE -1. BPREFCG MVOLFCG 1.0 BPREFCG XLPRPRE -9.23 BPREFCG XHPRPRE -9.22 BPREFCG XTELPRE -3. BPREFCG XRVPPRE 6. BPREFCG X200PRE .381 BPREFCG X230PRE -.509 BPREFCG EVOLPRE -1. BPRELA3 MVOLLA3 1.0 BPRELA3 XLPRPRE -9.4 BPRELA3 XHPRPRE -9.85 BPRELA3 XTELPRE -3.0 BPRELA3 XRVPPRE 2.5 BPRELA3 X200PRE 0.39 BPRELA3 X230PRE -0.77 BPRELA3 EVOLPRE -1.0 BPRELA4 MVOLLA4 1.0 BPRELA4 XLPRPRE -9.74 BPRELA4 XHPRPRE -10.1 BPRELA4 XTELPRE -3.0 BPRELA4 XRVPPRE 3.3 BPRELA4 X200PRE 0.233 BPRELA4 X230PRE -0.58 BPRELA4 EVOLPRE -1.0 BPRENC4 MVOLNC4 1.0 BPRENC4 XLPRPRE -9.74 BPRENC4 XHPRPRE -9.9 BPRENC4 XTELPRE -3.0 BPRENC4 XRVPPRE 66.0 BPRENC4 X200PRE 1.0 BPRENC4 X230PRE -1.0 BPRENC4 EVOLPRE -1.0 BPRETEL XLPRPRE -0.493 BPRETEL XHPRPRE -0.165 BPRETEL XTELPRE 1.0 BPRETEL PROFIT -0.3696 SELLPRE XLPRPRE 10.03 SELLPRE XHPRPRE 10.03 SELLPRE XRVPPRE -9.5 SELLPRE X200PRE -0.5 SELLPRE X230PRE 0.5 SELLPRE XPSCPRE 0.64 SELLPRE XRSCREG 0.35 SELLPRE EVOLPRE 1.0 SELLPRE PROFIT 21.44 BINTLSR MVOLLSR 1.0 BINTLSR XLPRINT -7.98 BINTLSR XHPRINT -8.58 BINTLSR XTELINT -3.0 BINTLSR XRVPINT 14.0 BINTLSR X200INT 1.0 BINTLSR X230INT -1.0 BINTLSR EVOLINT -1.0 BINTHCD MVOLHCD 1. BINTHCD XLPRINT -8.87 BINTHCD XHPRINT -9.33 BINTHCD XTELINT -3.0 BINTHCD XRVPINT 12.0 BINTHCD X200INT 1.0 BINTHCD X230INT -1. BINTHCD EVOLINT -1.0 BINTF95 MVOLF95 1. BINTF95 XLPRINT -9.46 BINTF95 XHPRINT -9.45 BINTF95 XTELINT -3.0 BINTF95 XRVPINT 3.5 BINTF95 X200INT .233 BINTF95 X230INT -.358 BINTF95 EVOLINT -1.0 BINTF90 MVOLF90 1. BINTF90 XLPRINT -9.06 BINTF90 XHPRINT -9.20 BINTF90 XTELINT -3.0 BINTF90 XRVPINT 3.5 BINTF90 X200INT .205 BINTF90 X230INT -.333 BINTF90 EVOLINT -1.0 BINTFCG MVOLFCG 1. BINTFCG XLPRINT -9.26 BINTFCG XHPRINT -9.13 BINTFCG XTELINT -3.0 BINTFCG XRVPINT 6. BINTFCG X200INT .318 BINTFCG X230INT -.509 BINTFCG EVOLINT -1.0 BINTNC4 MVOLNC4 1. BINTNC4 XLPRINT -9.77 BINTNC4 XHPRINT -9.78 BINTNC4 XTELINT -3.0 BINTNC4 XRVPINT 66. BINTNC4 X200INT 1.0 BINTNC4 X230INT -1. BINTNC4 EVOLINT -1.0 BINTTEL XLPRINT -.435 BINTTEL XHPRINT -.208 BINTTEL XTELINT 1. BINTTEL PROFIT -.3696 SELLINT XLPRINT 9.65 SELLINT XHPRINT 9.65 SELLINT XRVPINT -9.5 SELLINT X200INT -0.5 SELLINT X230INT 0.5 SELLINT XPSCPRE -.36 SELLINT XRSCREG 0.35 SELLINT EVOLINT 1.0 SELLINT PROFIT 20.32 BREGLSR MVOLLSR 1.0 BREGLSR XLPRREG -7.99 BREGLSR XHPRREG -8.59 BREGLSR XTELREG -3.0 BREGLSR XRVPREG 14.0 BREGLSR X200REG 1.0 BREGLSR X230REG -1.0 BREGLSR EVOLREG -1.0 BREGHCD MVOLHCD 1.0 BREGHCD XLPRREG -8.88 BREGHCD XHPRREG -9.34 BREGHCD XTELREG -3.0 BREGHCD XRVPREG 12.0 BREGHCD X200REG 1.0 BREGHCD X230REG -1.0 BREGHCD EVOLREG -1.0 BREGF95 MVOLF95 1.0 BREGF95 XLPRREG -9.47 BREGF95 XHPRREG -9.46 BREGF95 XTELREG -3.0 BREGF95 XRVPREG 3.5 BREGF95 X200REG .233 BREGF95 X230REG -0.358 BREGF95 EVOLREG -1.0 BREGF90 MVOLF90 1.0 BREGF90 XLPRREG -9.07 BREGF90 XHPRREG -9.21 BREGF90 XTELREG -3.0 BREGF90 XRVPREG 3.5 BREGF90 X200REG .205 BREGF90 X230REG -0.333 BREGF90 EVOLREG -1.0 BREGFCG MVOLFCG 1.0 BREGFCG XLPRREG -9.27 BREGFCG XHPRREG -9.14 BREGFCG XTELREG -3.0 BREGFCG XRVPREG 6.0 BREGFCG X200REG 0.318 BREGFCG X230REG -0.509 BREGFCG EVOLREG -1.0 BREGNC4 MVOLNC4 1.0 BREGNC4 XLPRREG -9.78 BREGNC4 XHPRREG -9.79 BREGNC4 XTELREG -3.0 BREGNC4 XRVPREG 66.0 BREGNC4 X200REG 1.0 BREGNC4 X230REG -1.0 BREGNC4 EVOLREG -1.0 BREGTEL XLPRREG -0.426 BREGTEL XHPRREG -.204 BREGTEL XTELREG 1.0 BREGTEL PROFIT -0.3696 SELLREG XLPRREG 9.05 SELLREG XHPRREG 9.05 SELLREG XRVPREG -9.5 SELLREG X200REG -0.5 SELLREG X230REG 0.5 SELLREG XPSCPRE -0.36 SELLREG XRSCREG -0.65 SELLREG EVOLREG 1.0 SELLREG PROFIT 18.04 BRSDVBB MVOLVBB 1.0 BRSDVBB EVOLRSD -1.0 BRSDVBB XVISRSD 10.1 BRSDVBC MVOLVBC 1.0 BRSDVBC EVOLRSD -1.0 BRSDVBC XVISRSD 12.63 BRSDRCR MVOLRCR 1.0 BRSDRCR EVOLRSD -1.0 BRSDRCR XVISRSD 6.9 BRSDHVO MVOLHVO 1.0 BRSDHVO EVOLRSD -1.0 BRSDHVO XVISRSD 8.05 BRSDHVO VCAPHVO 1.0 BRSDSLR MVOLSLR 1.0 BRSDSLR EVOLRSD -1.0 BRSDSLR XVISRSD 8.05 BRSDLCO MVOLLCO 1.0 BRSDLCO EVOLRSD -1.0 BRSDLCO XVISRSD 4.4 SELLRSD EVOLRSD 1.0 SELLRSD XVISRSD -10.1 SELLRSD PROFIT 8.00 RHS LIMITMAX MVOLBOL 26.316 LIMITMAX MVOLCOL 21.052 LIMITMAX VCAPSGP 23.25 LIMITMAX VCAPHVO 5.25 LIMITMAX VCAPRFG 13.455 LIMITMAX VCAPHOL 3.87 LIMITMAX VCAPCCU 7.26 LIMITMAX VCAPALK 10. ENDATA glpk-5.0/examples/mvcp.mod0000644000062000006210000000256513766346220014776 0ustar maomkpasswd/* MVCP, Minimum Vertex Cover Problem */ /* Written in GNU MathProg by Andrew Makhorin */ /* The Minimum Vertex Cover Problem in a network G = (V, E), where V is a set of nodes, E is a set of arcs, is to find a subset V' within V such that each edge (i,j) in E has at least one its endpoint in V' and which minimizes the sum of node weights w(i) over V'. Reference: Garey, M.R., and Johnson, D.S. (1979), Computers and Intractability: A guide to the theory of NP-completeness [Graph Theory, Covering and Partitioning, Minimum Vertex Cover, GT1]. */ set E, dimen 2; /* set of edges */ set V := (setof{(i,j) in E} i) union (setof{(i,j) in E} j); /* set of nodes */ param w{i in V}, >= 0, default 1; /* w[i] is weight of vertex i */ var x{i in V}, binary; /* x[i] = 1 means that node i is included into V' */ s.t. cov{(i,j) in E}: x[i] + x[j] >= 1; /* each edge (i,j) must have node i or j (or both) in V' */ minimize z: sum{i in V} w[i] * x[i]; /* we need to minimize the sum of node weights over V' */ data; /* These data correspond to an example from [Papadimitriou]. */ /* Optimal solution is 6 (greedy heuristic gives 13) */ set E := a1 b1, b1 c1, a1 b2, b2 c2, a2 b3, b3 c3, a2 b4, b4 c4, a3 b5, b5 c5, a3 b6, b6 c6, a4 b1, a4 b2, a4 b3, a5 b4, a5 b5, a5 b6, a6 b1, a6 b2, a6 b3, a6 b4, a7 b2, a7 b3, a7 b4, a7 b5, a7 b6; end; glpk-5.0/examples/netgen.c0000644000062000006210000001265513766346220014755 0ustar maomkpasswd/* netgen.c */ /* This main program generates 50 original NETGEN instances of the minimum cost flow problem and writes them in DIMACS format to the current directory. */ #include #include #include #include static int parm[50][15] = { {13502460, 101, 5000, 2500, 2500, 25000, 1, 100, 250000, 0, 0, 0, 100, 1, 1000, },{4281922, 102, 5000, 2500, 2500, 25000, 1, 100, 2500000, 0, 0, 0, 100, 1, 1000, },{44820113, 103, 5000, 2500, 2500, 25000, 1, 100, 6250000, 0, 0, 0, 100, 1, 1000, },{13450451, 104, 5000, 2500, 2500, 25000, -100, -1, 250000, 0, 0, 0, 100, 1, 1000, },{14719436, 105, 5000, 2500, 2500, 25000, 101, 200, 250000, 0, 0, 0, 100, 1, 1000, },{17365786, 106, 5000, 2500, 2500, 12500, 1, 100, 125000, 0, 0, 0, 100, 1, 1000, },{19540113, 107, 5000, 2500, 2500, 37500, 1, 100, 375000, 0, 0, 0, 100, 1, 1000, },{19560313, 108, 5000, 2500, 2500, 50000, 1, 100, 500000, 0, 0, 0, 100, 1, 1000, },{2403509, 109, 5000, 2500, 2500, 75000, 1, 100, 750000, 0, 0, 0, 100, 1, 1000, },{92480414, 110, 5000, 2500, 2500, 12500, 1, 100, 250000, 0, 0, 0, 100, 1, 1000, },{4230140, 111, 5000, 2500, 2500, 37500, 1, 100, 250000, 0, 0, 0, 100, 1, 1000, },{10032490, 112, 5000, 2500, 2500, 50000, 1, 100, 250000, 0, 0, 0, 100, 1, 1000, },{17307474, 113, 5000, 2500, 2500, 75000, 1, 100, 250000, 0, 0, 0, 100, 1, 1000, },{4925114, 114, 5000, 500, 4500, 25000, 1, 100, 250000, 0, 0, 0, 100, 1, 1000, },{19842704, 115, 5000, 1500, 3500, 25000, 1, 100, 250000, 0, 0, 0, 100, 1, 1000, },{88392060, 116, 5000, 2500, 2500, 25000, 1, 100, 250000, 0, 0, 0, 0, 1, 1000, },{12904407, 117, 5000, 2500, 2500, 12500, 1, 100, 125000, 0, 0, 0, 0, 1, 1000, },{11811811, 118, 5000, 2500, 2500, 37500, 1, 100, 375000, 0, 0, 0, 0, 1, 1000, },{90023593, 119, 5000, 2500, 2500, 50000, 1, 100, 500000, 0, 0, 0, 0, 1, 1000, },{93028922, 120, 5000, 2500, 2500, 75000, 1, 100, 750000, 0, 0, 0, 0, 1, 1000, },{72707401, 121, 5000, 50, 50, 25000, 1, 100, 250000, 50, 50, 0, 100, 1, 1000, },{93040771, 122, 5000, 250, 250, 25000, 1, 100, 250000, 250, 250, 0, 100, 1, 1000, },{70220611, 123, 5000, 500, 500, 25000, 1, 100, 250000, 500, 500, 0, 100, 1, 1000, },{52774811, 124, 5000, 1000, 1000, 25000, 1, 100, 250000, 1000, 1000, 0, 100, 1, 1000, },{22492311, 125, 5000, 1500, 1500, 25000, 1, 100, 250000, 1500, 1500, 0, 100, 1, 1000, },{35269337, 126, 5000, 500, 500, 12500, 1, 100, 125000, 500, 500, 0, 100, 1, 1000, },{30140502, 127, 5000, 500, 500, 37500, 1, 100, 375000, 500, 500, 0, 100, 1, 1000, },{49205455, 128, 5000, 500, 500, 50000, 1, 100, 500000, 500, 500, 0, 100, 1, 1000, },{42958341, 129, 5000, 500, 500, 75000, 1, 100, 750000, 500, 500, 0, 100, 1, 1000, },{25440925, 130, 5000, 500, 500, 12500, 1, 100, 250000, 500, 500, 0, 100, 1, 1000, },{75294924, 131, 5000, 500, 500, 37500, 1, 100, 250000, 500, 500, 0, 100, 1, 1000, },{4463965, 132, 5000, 500, 500, 50000, 1, 100, 250000, 500, 500, 0, 100, 1, 1000, },{13390427, 133, 5000, 500, 500, 75000, 1, 100, 250000, 500, 500, 0, 100, 1, 1000, },{95250971, 134, 1000, 500, 500, 25000, 1, 100, 250000, 500, 500, 0, 100, 1, 1000, },{54830522, 135, 2500, 500, 500, 25000, 1, 100, 250000, 500, 500, 0, 100, 1, 1000, },{520593, 136, 7500, 500, 500, 25000, 1, 100, 250000, 500, 500, 0, 100, 1, 1000, },{52900925, 137, 10000, 500, 500, 25000, 1, 100, 250000, 500, 500, 0, 100, 1, 1000, },{22603395, 138, 5000, 500, 500, 25000, 1, 100, 250000, 500, 500, 0, 100, 1, 50, },{55253099, 139, 5000, 500, 500, 25000, 1, 100, 250000, 500, 500, 0, 100, 1, 250, },{75357001, 140, 5000, 500, 500, 25000, 1, 100, 250000, 500, 500, 0, 100, 1, 500, },{10072459, 141, 5000, 500, 500, 25000, 1, 100, 250000, 500, 500, 0, 100, 1, 2500, },{55728492, 142, 5000, 500, 500, 25000, 1, 100, 250000, 500, 500, 0, 100, 1, 5000, },{593043, 143, 5000, 500, 500, 25000, 1, 100, 250000, 500, 500, 0, 0, 1, 1000, },{94236572, 144, 5000, 500, 500, 25000, 1, 10, 250000, 500, 500, 0, 100, 1, 1000, },{94882955, 145, 5000, 500, 500, 25000, 1, 1000, 250000, 500, 500, 0, 100, 1, 1000, },{48489922, 146, 5000, 500, 500, 25000, 1, 10000, 250000, 500, 500, 0, 100, 1, 1000, },{75578374, 147, 5000, 500, 500, 25000, -100, -1, 250000, 500, 500, 0, 100, 1, 1000, },{44821152, 148, 5000, 500, 500, 25000, -50, 49, 250000, 500, 500, 0, 100, 1, 1000, },{45224103, 149, 5000, 500, 500, 25000, 101, 200, 250000, 500, 500, 0, 100, 1, 1000, },{63491741, 150, 5000, 500, 500, 25000, 1001, 1100, 250000, 500, 500, 0, 100, 1, 1000, } }; typedef struct { double rhs; } v_data; typedef struct { double cap, cost; } a_data; int main(void) { glp_graph *G; int k; char fname[100+1]; G = glp_create_graph(sizeof(v_data), sizeof(a_data)); for (k = 1; k <= 50; k++) { sprintf(fname, "netgn%03d.min", parm[k-1][1]); glp_netgen(G, offsetof(v_data, rhs), offsetof(a_data, cap), offsetof(a_data, cost), &parm[k-1][-1]); glp_write_mincost(G, offsetof(v_data, rhs), -1, offsetof(a_data, cap), offsetof(a_data, cost), fname); } glp_delete_graph(G); return 0; } /* eof */ glpk-5.0/examples/nppsamp.c0000644000062000006210000000235213766346220015144 0ustar maomkpasswd/* nppsamp.c */ #include #include #include int main(void) { glp_prep *prep; glp_prob *P, *Q; int ret; prep = glp_npp_alloc_wksp(); P = glp_create_prob(); ret = glp_read_mps(P, GLP_MPS_DECK, NULL, "murtagh.mps"); if (ret != 0) { printf("Error on reading problem data\n"); goto skip; } glp_set_obj_dir(P, GLP_MAX); glp_npp_load_prob(prep, P, GLP_SOL, GLP_ON); ret = glp_npp_preprocess1(prep, 0); switch (ret) { case 0: break; case GLP_ENOPFS: printf("LP has no primal feasible solution\n"); goto skip; case GLP_ENODFS: printf("LP has no dual feasible solution\n"); goto skip; default: glp_assert(ret != ret); } Q = glp_create_prob(); glp_npp_build_prob(prep, Q); ret = glp_simplex(Q, NULL); if (ret == 0 && glp_get_status(Q) == GLP_OPT) { glp_npp_postprocess(prep, Q); glp_npp_obtain_sol(prep, P); } else printf("Unable to recover non-optimal solution\n"); glp_delete_prob(Q); skip: glp_npp_free_wksp(prep); glp_delete_prob(P); return 0; } /* eof */ glpk-5.0/examples/numbrix.mod0000644000062000006210000000500013766346220015500 0ustar maomkpasswd/* Numbrix, Number Placement Puzzle */ /* Written in GNU MathProg by Robert Wood */ /* Numbrix is a logic-based number-placement puzzle.[1] * The objective is to fill the grid so that each cell contains * digits in sequential order taking a horizontal or vertical * path; diagonal paths are not allowed. The puzzle setter * provides a grid often with the outer most cells completed. * * Completed Numbrix puzzles are usually a square of numbers * in order from 1 to 64 (8x8 grid) or from 1 to 81 (9x9 grid), * following a continuous path in sequence. * * The modern puzzle was invented by Marilyn vos Savant in 2008 * and published by Parade Magazine under the name "Numbrix", * near her weekly Ask Marilyn article. * * http://en.wikipedia.org/wiki/Numbrix */ set I := {1..9}; set J := {1..9}; set VALS := {1..81}; param givens{I, J}, integer, >= 0, <= 81, default 0; /* the "givens" */ param neighbors{i in I,j in J, i2 in I, j2 in J} , binary := (if abs(i - i2) + abs(j -j2) == 1 then 1 else 0 ); /* defines which spots are the boards are neighbors */ var x{i in I, j in J, k in VALS}, binary; /* x[i,j,k] = 1 means cell [i,j] is assigned number k */ s.t. fa{i in I, j in J, k in VALS: givens[i,j] != 0}: x[i,j,k] = (if givens[i,j] = k then 1 else 0); /* assign pre-defined numbers using the "givens" */ s.t. fb{i in I, j in J}: sum{k in VALS} x[i,j,k] = 1; /* each cell must be assigned exactly one number */ s.t. singleNum {k in VALS}: sum{i in I, j in J} x[i,j,k] = 1; /* a value can only occur once */ s.t. neighborContraint {i in I, j in J, k in 1..80}: x[i,j,k] <= sum{i2 in I, j2 in J} x[i2,j2,k+1] * neighbors[i,j,i2,j2]; /* each cell must have a neighbor with the next higher value */ /* there is no need for an objective function here */ solve; for {i in I} { for {0..0: i = 1 or i = 4 or i = 7} printf " +----------+----------+----------+\n"; for {j in J} { for {0..0: j = 1 or j = 4 or j = 7} printf(" |"); printf " %2d", sum{k in VALS} x[i,j,k] * k; for {0..0: j = 9} printf(" |\n"); } for {0..0: i = 9} printf " +----------+----------+----------+\n"; } data; param givens : 1 2 3 4 5 6 7 8 9 := 1 . . . . . . . . . 2 . 11 12 15 18 21 62 61 . 3 . 6 . . . . . 60 . 4 . 33 . . . . . 57 . 5 . 32 . . . . . 56 . 6 . 37 . . . . . 73 . 7 . 38 . . . . . 72 . 8 . 43 44 47 48 51 76 77 . 9 . . . . . . . . . ; end; glpk-5.0/examples/oldapi/0000755000062000006210000000000013766346220014570 5ustar maomkpasswdglpk-5.0/examples/oldapi/lpx.c0000644000062000006210000013566013766346220015552 0ustar maomkpasswd/* lpx.c (old GLPK API) */ /* Written by Andrew Makhorin , August 2013. */ /* This file contains routines that implement the old GLPK API as it * was defined in GLPK 4.48. * * To compile an existing project using these routines you need to add * to the project this file and the header lpx.h. * * Please note that you may mix calls to old and new GLPK API routines * (except calls to glp_create_prob and glp_delete_prob). */ #include #include #include "lpx.h" #define xassert glp_assert #define xerror glp_error struct CPS { /* control parameters */ LPX *lp; /* pointer to corresponding problem object */ int msg_lev; /* level of messages output by the solver: 0 - no output 1 - error messages only 2 - normal output 3 - full output (includes informational messages) */ int scale; /* scaling option: 0 - no scaling 1 - equilibration scaling 2 - geometric mean scaling 3 - geometric mean scaling, then equilibration scaling */ int dual; /* dual simplex option: 0 - use primal simplex 1 - use dual simplex */ int price; /* pricing option (for both primal and dual simplex): 0 - textbook pricing 1 - steepest edge pricing */ double relax; /* relaxation parameter used in the ratio test; if it is zero, the textbook ratio test is used; if it is non-zero (should be positive), Harris' two-pass ratio test is used; in the latter case on the first pass basic variables (in the case of primal simplex) or reduced costs of non-basic variables (in the case of dual simplex) are allowed to slightly violate their bounds, but not more than (relax * tol_bnd) or (relax * tol_dj) (thus, relax is a percentage of tol_bnd or tol_dj) */ double tol_bnd; /* relative tolerance used to check if the current basic solution is primal feasible */ double tol_dj; /* absolute tolerance used to check if the current basic solution is dual feasible */ double tol_piv; /* relative tolerance used to choose eligible pivotal elements of the simplex table in the ratio test */ int round; /* solution rounding option: 0 - report all computed values and reduced costs "as is" 1 - if possible (allowed by the tolerances), replace computed values and reduced costs which are close to zero by exact zeros */ double obj_ll; /* lower limit of the objective function; if on the phase II the objective function reaches this limit and continues decreasing, the solver stops the search */ double obj_ul; /* upper limit of the objective function; if on the phase II the objective function reaches this limit and continues increasing, the solver stops the search */ int it_lim; /* simplex iterations limit; if this value is positive, it is decreased by one each time when one simplex iteration has been performed, and reaching zero value signals the solver to stop the search; negative value means no iterations limit */ double tm_lim; /* searching time limit, in seconds; if this value is positive, it is decreased each time when one simplex iteration has been performed by the amount of time spent for the iteration, and reaching zero value signals the solver to stop the search; negative value means no time limit */ int out_frq; /* output frequency, in iterations; this parameter specifies how frequently the solver sends information about the solution to the standard output */ double out_dly; /* output delay, in seconds; this parameter specifies how long the solver should delay sending information about the solution to the standard output; zero value means no delay */ int branch; /* MIP */ /* branching heuristic: 0 - branch on first variable 1 - branch on last variable 2 - branch using heuristic by Driebeck and Tomlin 3 - branch on most fractional variable */ int btrack; /* MIP */ /* backtracking heuristic: 0 - select most recent node (depth first search) 1 - select earliest node (breadth first search) 2 - select node using the best projection heuristic 3 - select node with best local bound */ double tol_int; /* MIP */ /* absolute tolerance used to check if the current basic solution is integer feasible */ double tol_obj; /* MIP */ /* relative tolerance used to check if the value of the objective function is not better than in the best known integer feasible solution */ int mps_info; /* lpx_write_mps */ /* if this flag is set, the routine lpx_write_mps outputs several comment cards that contains some information about the problem; otherwise the routine outputs no comment cards */ int mps_obj; /* lpx_write_mps */ /* this parameter tells the routine lpx_write_mps how to output the objective function row: 0 - never output objective function row 1 - always output objective function row 2 - output objective function row if and only if the problem has no free rows */ int mps_orig; /* lpx_write_mps */ /* if this flag is set, the routine lpx_write_mps uses original row and column symbolic names; otherwise the routine generates plain names using ordinal numbers of rows and columns */ int mps_wide; /* lpx_write_mps */ /* if this flag is set, the routine lpx_write_mps uses all data fields; otherwise the routine keeps fields 5 and 6 empty */ int mps_free; /* lpx_write_mps */ /* if this flag is set, the routine lpx_write_mps omits column and vector names everytime if possible (free style); otherwise the routine never omits these names (pedantic style) */ int mps_skip; /* lpx_write_mps */ /* if this flag is set, the routine lpx_write_mps skips empty columns (i.e. which has no constraint coefficients); otherwise the routine outputs all columns */ int lpt_orig; /* lpx_write_lpt */ /* if this flag is set, the routine lpx_write_lpt uses original row and column symbolic names; otherwise the routine generates plain names using ordinal numbers of rows and columns */ int presol; /* lpx_simplex */ /* LP presolver option: 0 - do not use LP presolver 1 - use LP presolver */ int binarize; /* lpx_intopt */ /* if this flag is set, the routine lpx_intopt replaces integer columns by binary ones */ int use_cuts; /* lpx_intopt */ /* if this flag is set, the routine lpx_intopt tries generating cutting planes: LPX_C_COVER - mixed cover cuts LPX_C_CLIQUE - clique cuts LPX_C_GOMORY - Gomory's mixed integer cuts LPX_C_ALL - all cuts */ double mip_gap; /* MIP */ /* relative MIP gap tolerance */ struct CPS *link; /* pointer to CPS for another problem object */ }; static struct CPS *cps_ptr = NULL; /* initial pointer to CPS linked list */ static struct CPS *find_cps(LPX *lp) { /* find CPS for specified problem object */ struct CPS *cps; for (cps = cps_ptr; cps != NULL; cps = cps->link) if (cps->lp == lp) break; /* if cps is NULL (not found), the problem object was created with glp_create_prob rather than with lpx_create_prob */ xassert(cps != NULL); return cps; } static void reset_cps(struct CPS *cps) { /* reset control parameters to default values */ cps->msg_lev = 3; cps->scale = 1; cps->dual = 0; cps->price = 1; cps->relax = 0.07; cps->tol_bnd = 1e-7; cps->tol_dj = 1e-7; cps->tol_piv = 1e-9; cps->round = 0; cps->obj_ll = -DBL_MAX; cps->obj_ul = +DBL_MAX; cps->it_lim = -1; cps->tm_lim = -1.0; cps->out_frq = 200; cps->out_dly = 0.0; cps->branch = 2; cps->btrack = 3; cps->tol_int = 1e-5; cps->tol_obj = 1e-7; cps->mps_info = 1; cps->mps_obj = 2; cps->mps_orig = 0; cps->mps_wide = 1; cps->mps_free = 0; cps->mps_skip = 0; cps->lpt_orig = 0; cps->presol = 0; cps->binarize = 0; cps->use_cuts = 0; cps->mip_gap = 0.0; return; } LPX *lpx_create_prob(void) { /* create problem object */ LPX *lp; struct CPS *cps; lp = glp_create_prob(); cps = glp_alloc(1, sizeof(struct CPS)); cps->lp = lp; reset_cps(cps); cps->link = cps_ptr; cps_ptr = cps; return lp; } void lpx_set_prob_name(LPX *lp, const char *name) { /* assign (change) problem name */ glp_set_prob_name(lp, name); return; } void lpx_set_obj_name(LPX *lp, const char *name) { /* assign (change) objective function name */ glp_set_obj_name(lp, name); return; } void lpx_set_obj_dir(LPX *lp, int dir) { /* set (change) optimization direction flag */ glp_set_obj_dir(lp, dir - LPX_MIN + GLP_MIN); return; } int lpx_add_rows(LPX *lp, int nrs) { /* add new rows to problem object */ return glp_add_rows(lp, nrs); } int lpx_add_cols(LPX *lp, int ncs) { /* add new columns to problem object */ return glp_add_cols(lp, ncs); } void lpx_set_row_name(LPX *lp, int i, const char *name) { /* assign (change) row name */ glp_set_row_name(lp, i, name); return; } void lpx_set_col_name(LPX *lp, int j, const char *name) { /* assign (change) column name */ glp_set_col_name(lp, j, name); return; } void lpx_set_row_bnds(LPX *lp, int i, int type, double lb, double ub) { /* set (change) row bounds */ glp_set_row_bnds(lp, i, type - LPX_FR + GLP_FR, lb, ub); return; } void lpx_set_col_bnds(LPX *lp, int j, int type, double lb, double ub) { /* set (change) column bounds */ glp_set_col_bnds(lp, j, type - LPX_FR + GLP_FR, lb, ub); return; } void lpx_set_obj_coef(glp_prob *lp, int j, double coef) { /* set (change) obj. coefficient or constant term */ glp_set_obj_coef(lp, j, coef); return; } void lpx_set_mat_row(LPX *lp, int i, int len, const int ind[], const double val[]) { /* set (replace) row of the constraint matrix */ glp_set_mat_row(lp, i, len, ind, val); return; } void lpx_set_mat_col(LPX *lp, int j, int len, const int ind[], const double val[]) { /* set (replace) column of the constraint matrix */ glp_set_mat_col(lp, j, len, ind, val); return; } void lpx_load_matrix(LPX *lp, int ne, const int ia[], const int ja[], const double ar[]) { /* load (replace) the whole constraint matrix */ glp_load_matrix(lp, ne, ia, ja, ar); return; } void lpx_del_rows(LPX *lp, int nrs, const int num[]) { /* delete specified rows from problem object */ glp_del_rows(lp, nrs, num); return; } void lpx_del_cols(LPX *lp, int ncs, const int num[]) { /* delete specified columns from problem object */ glp_del_cols(lp, ncs, num); return; } void lpx_delete_prob(LPX *lp) { /* delete problem object */ struct CPS *cps = find_cps(lp); if (cps_ptr == cps) cps_ptr = cps->link; else { struct CPS *prev; for (prev = cps_ptr; prev != NULL; prev = prev->link) if (prev->link == cps) break; xassert(prev != NULL); prev->link = cps->link; } glp_free(cps); glp_delete_prob(lp); return; } const char *lpx_get_prob_name(LPX *lp) { /* retrieve problem name */ return glp_get_prob_name(lp); } const char *lpx_get_obj_name(LPX *lp) { /* retrieve objective function name */ return glp_get_obj_name(lp); } int lpx_get_obj_dir(LPX *lp) { /* retrieve optimization direction flag */ return glp_get_obj_dir(lp) - GLP_MIN + LPX_MIN; } int lpx_get_num_rows(LPX *lp) { /* retrieve number of rows */ return glp_get_num_rows(lp); } int lpx_get_num_cols(LPX *lp) { /* retrieve number of columns */ return glp_get_num_cols(lp); } const char *lpx_get_row_name(LPX *lp, int i) { /* retrieve row name */ return glp_get_row_name(lp, i); } const char *lpx_get_col_name(LPX *lp, int j) { /* retrieve column name */ return glp_get_col_name(lp, j); } int lpx_get_row_type(LPX *lp, int i) { /* retrieve row type */ return glp_get_row_type(lp, i) - GLP_FR + LPX_FR; } double lpx_get_row_lb(glp_prob *lp, int i) { /* retrieve row lower bound */ double lb; lb = glp_get_row_lb(lp, i); if (lb == -DBL_MAX) lb = 0.0; return lb; } double lpx_get_row_ub(glp_prob *lp, int i) { /* retrieve row upper bound */ double ub; ub = glp_get_row_ub(lp, i); if (ub == +DBL_MAX) ub = 0.0; return ub; } void lpx_get_row_bnds(glp_prob *lp, int i, int *typx, double *lb, double *ub) { /* retrieve row bounds */ if (typx != NULL) *typx = lpx_get_row_type(lp, i); if (lb != NULL) *lb = lpx_get_row_lb(lp, i); if (ub != NULL) *ub = lpx_get_row_ub(lp, i); return; } int lpx_get_col_type(LPX *lp, int j) { /* retrieve column type */ return glp_get_col_type(lp, j) - GLP_FR + LPX_FR; } double lpx_get_col_lb(glp_prob *lp, int j) { /* retrieve column lower bound */ double lb; lb = glp_get_col_lb(lp, j); if (lb == -DBL_MAX) lb = 0.0; return lb; } double lpx_get_col_ub(glp_prob *lp, int j) { /* retrieve column upper bound */ double ub; ub = glp_get_col_ub(lp, j); if (ub == +DBL_MAX) ub = 0.0; return ub; } void lpx_get_col_bnds(glp_prob *lp, int j, int *typx, double *lb, double *ub) { /* retrieve column bounds */ if (typx != NULL) *typx = lpx_get_col_type(lp, j); if (lb != NULL) *lb = lpx_get_col_lb(lp, j); if (ub != NULL) *ub = lpx_get_col_ub(lp, j); return; } double lpx_get_obj_coef(LPX *lp, int j) { /* retrieve obj. coefficient or constant term */ return glp_get_obj_coef(lp, j); } int lpx_get_num_nz(LPX *lp) { /* retrieve number of constraint coefficients */ return glp_get_num_nz(lp); } int lpx_get_mat_row(LPX *lp, int i, int ind[], double val[]) { /* retrieve row of the constraint matrix */ return glp_get_mat_row(lp, i, ind, val); } int lpx_get_mat_col(LPX *lp, int j, int ind[], double val[]) { /* retrieve column of the constraint matrix */ return glp_get_mat_col(lp, j, ind, val); } void lpx_create_index(LPX *lp) { /* create the name index */ glp_create_index(lp); return; } int lpx_find_row(LPX *lp, const char *name) { /* find row by its name */ return glp_find_row(lp, name); } int lpx_find_col(LPX *lp, const char *name) { /* find column by its name */ return glp_find_col(lp, name); } void lpx_delete_index(LPX *lp) { /* delete the name index */ glp_delete_index(lp); return; } void lpx_scale_prob(LPX *lp) { /* scale problem data */ switch (lpx_get_int_parm(lp, LPX_K_SCALE)) { case 0: /* no scaling */ glp_unscale_prob(lp); break; case 1: /* equilibration scaling */ glp_scale_prob(lp, GLP_SF_EQ); break; case 2: /* geometric mean scaling */ glp_scale_prob(lp, GLP_SF_GM); break; case 3: /* geometric mean scaling, then equilibration scaling */ glp_scale_prob(lp, GLP_SF_GM | GLP_SF_EQ); break; default: xassert(lp != lp); } return; } void lpx_unscale_prob(LPX *lp) { /* unscale problem data */ glp_unscale_prob(lp); return; } void lpx_set_row_stat(LPX *lp, int i, int stat) { /* set (change) row status */ glp_set_row_stat(lp, i, stat - LPX_BS + GLP_BS); return; } void lpx_set_col_stat(LPX *lp, int j, int stat) { /* set (change) column status */ glp_set_col_stat(lp, j, stat - LPX_BS + GLP_BS); return; } void lpx_std_basis(LPX *lp) { /* construct standard initial LP basis */ glp_std_basis(lp); return; } void lpx_adv_basis(LPX *lp) { /* construct advanced initial LP basis */ glp_adv_basis(lp, 0); return; } void lpx_cpx_basis(LPX *lp) { /* construct Bixby's initial LP basis */ glp_cpx_basis(lp); return; } static void fill_smcp(LPX *lp, glp_smcp *parm) { glp_init_smcp(parm); switch (lpx_get_int_parm(lp, LPX_K_MSGLEV)) { case 0: parm->msg_lev = GLP_MSG_OFF; break; case 1: parm->msg_lev = GLP_MSG_ERR; break; case 2: parm->msg_lev = GLP_MSG_ON; break; case 3: parm->msg_lev = GLP_MSG_ALL; break; default: xassert(lp != lp); } switch (lpx_get_int_parm(lp, LPX_K_DUAL)) { case 0: parm->meth = GLP_PRIMAL; break; case 1: parm->meth = GLP_DUAL; break; default: xassert(lp != lp); } switch (lpx_get_int_parm(lp, LPX_K_PRICE)) { case 0: parm->pricing = GLP_PT_STD; break; case 1: parm->pricing = GLP_PT_PSE; break; default: xassert(lp != lp); } if (lpx_get_real_parm(lp, LPX_K_RELAX) == 0.0) parm->r_test = GLP_RT_STD; else parm->r_test = GLP_RT_HAR; parm->tol_bnd = lpx_get_real_parm(lp, LPX_K_TOLBND); parm->tol_dj = lpx_get_real_parm(lp, LPX_K_TOLDJ); parm->tol_piv = lpx_get_real_parm(lp, LPX_K_TOLPIV); parm->obj_ll = lpx_get_real_parm(lp, LPX_K_OBJLL); parm->obj_ul = lpx_get_real_parm(lp, LPX_K_OBJUL); if (lpx_get_int_parm(lp, LPX_K_ITLIM) < 0) parm->it_lim = INT_MAX; else parm->it_lim = lpx_get_int_parm(lp, LPX_K_ITLIM); if (lpx_get_real_parm(lp, LPX_K_TMLIM) < 0.0) parm->tm_lim = INT_MAX; else parm->tm_lim = (int)(1000.0 * lpx_get_real_parm(lp, LPX_K_TMLIM)); parm->out_frq = lpx_get_int_parm(lp, LPX_K_OUTFRQ); parm->out_dly = (int)(1000.0 * lpx_get_real_parm(lp, LPX_K_OUTDLY)); switch (lpx_get_int_parm(lp, LPX_K_PRESOL)) { case 0: parm->presolve = GLP_OFF; break; case 1: parm->presolve = GLP_ON; break; default: xassert(lp != lp); } return; } int lpx_simplex(LPX *lp) { /* easy-to-use driver to the simplex method */ glp_smcp parm; int ret; fill_smcp(lp, &parm); ret = glp_simplex(lp, &parm); switch (ret) { case 0: ret = LPX_E_OK; break; case GLP_EBADB: case GLP_ESING: case GLP_ECOND: case GLP_EBOUND: ret = LPX_E_FAULT; break; case GLP_EFAIL: ret = LPX_E_SING; break; case GLP_EOBJLL: ret = LPX_E_OBJLL; break; case GLP_EOBJUL: ret = LPX_E_OBJUL; break; case GLP_EITLIM: ret = LPX_E_ITLIM; break; case GLP_ETMLIM: ret = LPX_E_TMLIM; break; case GLP_ENOPFS: ret = LPX_E_NOPFS; break; case GLP_ENODFS: ret = LPX_E_NODFS; break; default: xassert(ret != ret); } return ret; } int lpx_exact(LPX *lp) { /* easy-to-use driver to the exact simplex method */ glp_smcp parm; int ret; fill_smcp(lp, &parm); ret = glp_exact(lp, &parm); switch (ret) { case 0: ret = LPX_E_OK; break; case GLP_EBADB: case GLP_ESING: case GLP_EBOUND: case GLP_EFAIL: ret = LPX_E_FAULT; break; case GLP_EITLIM: ret = LPX_E_ITLIM; break; case GLP_ETMLIM: ret = LPX_E_TMLIM; break; default: xassert(ret != ret); } return ret; } int lpx_get_status(glp_prob *lp) { /* retrieve generic status of basic solution */ int status; switch (glp_get_status(lp)) { case GLP_OPT: status = LPX_OPT; break; case GLP_FEAS: status = LPX_FEAS; break; case GLP_INFEAS: status = LPX_INFEAS; break; case GLP_NOFEAS: status = LPX_NOFEAS; break; case GLP_UNBND: status = LPX_UNBND; break; case GLP_UNDEF: status = LPX_UNDEF; break; default: xassert(lp != lp); } return status; } int lpx_get_prim_stat(glp_prob *lp) { /* retrieve status of primal basic solution */ return glp_get_prim_stat(lp) - GLP_UNDEF + LPX_P_UNDEF; } int lpx_get_dual_stat(glp_prob *lp) { /* retrieve status of dual basic solution */ return glp_get_dual_stat(lp) - GLP_UNDEF + LPX_D_UNDEF; } double lpx_get_obj_val(LPX *lp) { /* retrieve objective value (basic solution) */ return glp_get_obj_val(lp); } int lpx_get_row_stat(LPX *lp, int i) { /* retrieve row status (basic solution) */ return glp_get_row_stat(lp, i) - GLP_BS + LPX_BS; } double lpx_get_row_prim(LPX *lp, int i) { /* retrieve row primal value (basic solution) */ return glp_get_row_prim(lp, i); } double lpx_get_row_dual(LPX *lp, int i) { /* retrieve row dual value (basic solution) */ return glp_get_row_dual(lp, i); } void lpx_get_row_info(glp_prob *lp, int i, int *tagx, double *vx, double *dx) { /* obtain row solution information */ if (tagx != NULL) *tagx = lpx_get_row_stat(lp, i); if (vx != NULL) *vx = lpx_get_row_prim(lp, i); if (dx != NULL) *dx = lpx_get_row_dual(lp, i); return; } int lpx_get_col_stat(LPX *lp, int j) { /* retrieve column status (basic solution) */ return glp_get_col_stat(lp, j) - GLP_BS + LPX_BS; } double lpx_get_col_prim(LPX *lp, int j) { /* retrieve column primal value (basic solution) */ return glp_get_col_prim(lp, j); } double lpx_get_col_dual(glp_prob *lp, int j) { /* retrieve column dual value (basic solution) */ return glp_get_col_dual(lp, j); } void lpx_get_col_info(glp_prob *lp, int j, int *tagx, double *vx, double *dx) { /* obtain column solution information */ if (tagx != NULL) *tagx = lpx_get_col_stat(lp, j); if (vx != NULL) *vx = lpx_get_col_prim(lp, j); if (dx != NULL) *dx = lpx_get_col_dual(lp, j); return; } int lpx_get_ray_info(LPX *lp) { /* determine what causes primal unboundness */ return glp_get_unbnd_ray(lp); } void lpx_check_kkt(LPX *lp, int scaled, LPXKKT *kkt) { /* check Karush-Kuhn-Tucker conditions */ int m = glp_get_num_rows(lp); int ae_ind, re_ind; double ae_max, re_max; xassert(scaled == scaled); glp_check_kkt(lp, GLP_SOL, GLP_KKT_PE, &ae_max, &ae_ind, &re_max, &re_ind); kkt->pe_ae_max = ae_max; kkt->pe_ae_row = ae_ind; kkt->pe_re_max = re_max; kkt->pe_re_row = re_ind; if (re_max <= 1e-9) kkt->pe_quality = 'H'; else if (re_max <= 1e-6) kkt->pe_quality = 'M'; else if (re_max <= 1e-3) kkt->pe_quality = 'L'; else kkt->pe_quality = '?'; glp_check_kkt(lp, GLP_SOL, GLP_KKT_PB, &ae_max, &ae_ind, &re_max, &re_ind); kkt->pb_ae_max = ae_max; kkt->pb_ae_ind = ae_ind; kkt->pb_re_max = re_max; kkt->pb_re_ind = re_ind; if (re_max <= 1e-9) kkt->pb_quality = 'H'; else if (re_max <= 1e-6) kkt->pb_quality = 'M'; else if (re_max <= 1e-3) kkt->pb_quality = 'L'; else kkt->pb_quality = '?'; glp_check_kkt(lp, GLP_SOL, GLP_KKT_DE, &ae_max, &ae_ind, &re_max, &re_ind); kkt->de_ae_max = ae_max; if (ae_ind == 0) kkt->de_ae_col = 0; else kkt->de_ae_col = ae_ind - m; kkt->de_re_max = re_max; if (re_ind == 0) kkt->de_re_col = 0; else kkt->de_re_col = ae_ind - m; if (re_max <= 1e-9) kkt->de_quality = 'H'; else if (re_max <= 1e-6) kkt->de_quality = 'M'; else if (re_max <= 1e-3) kkt->de_quality = 'L'; else kkt->de_quality = '?'; glp_check_kkt(lp, GLP_SOL, GLP_KKT_DB, &ae_max, &ae_ind, &re_max, &re_ind); kkt->db_ae_max = ae_max; kkt->db_ae_ind = ae_ind; kkt->db_re_max = re_max; kkt->db_re_ind = re_ind; if (re_max <= 1e-9) kkt->db_quality = 'H'; else if (re_max <= 1e-6) kkt->db_quality = 'M'; else if (re_max <= 1e-3) kkt->db_quality = 'L'; else kkt->db_quality = '?'; kkt->cs_ae_max = 0.0, kkt->cs_ae_ind = 0; kkt->cs_re_max = 0.0, kkt->cs_re_ind = 0; kkt->cs_quality = 'H'; return; } int lpx_warm_up(LPX *lp) { /* "warm up" LP basis */ int ret; ret = glp_warm_up(lp); if (ret == 0) ret = LPX_E_OK; else if (ret == GLP_EBADB) ret = LPX_E_BADB; else if (ret == GLP_ESING) ret = LPX_E_SING; else if (ret == GLP_ECOND) ret = LPX_E_SING; else xassert(ret != ret); return ret; } int lpx_eval_tab_row(LPX *lp, int k, int ind[], double val[]) { /* compute row of the simplex tableau */ return glp_eval_tab_row(lp, k, ind, val); } int lpx_eval_tab_col(LPX *lp, int k, int ind[], double val[]) { /* compute column of the simplex tableau */ return glp_eval_tab_col(lp, k, ind, val); } int lpx_transform_row(LPX *lp, int len, int ind[], double val[]) { /* transform explicitly specified row */ return glp_transform_row(lp, len, ind, val); } int lpx_transform_col(LPX *lp, int len, int ind[], double val[]) { /* transform explicitly specified column */ return glp_transform_col(lp, len, ind, val); } int lpx_prim_ratio_test(LPX *lp, int len, const int ind[], const double val[], int how, double tol) { /* perform primal ratio test */ int piv; piv = glp_prim_rtest(lp, len, ind, val, how, tol); xassert(0 <= piv && piv <= len); return piv == 0 ? 0 : ind[piv]; } int lpx_dual_ratio_test(LPX *lp, int len, const int ind[], const double val[], int how, double tol) { /* perform dual ratio test */ int piv; piv = glp_dual_rtest(lp, len, ind, val, how, tol); xassert(0 <= piv && piv <= len); return piv == 0 ? 0 : ind[piv]; } int lpx_interior(LPX *lp) { /* easy-to-use driver to the interior-point method */ int ret; ret = glp_interior(lp, NULL); switch (ret) { case 0: ret = LPX_E_OK; break; case GLP_EFAIL: ret = LPX_E_FAULT; break; case GLP_ENOFEAS: ret = LPX_E_NOFEAS; break; case GLP_ENOCVG: ret = LPX_E_NOCONV; break; case GLP_EITLIM: ret = LPX_E_ITLIM; break; case GLP_EINSTAB: ret = LPX_E_INSTAB; break; default: xassert(ret != ret); } return ret; } int lpx_ipt_status(glp_prob *lp) { /* retrieve status of interior-point solution */ int status; switch (glp_ipt_status(lp)) { case GLP_UNDEF: status = LPX_T_UNDEF; break; case GLP_OPT: status = LPX_T_OPT; break; default: xassert(lp != lp); } return status; } double lpx_ipt_obj_val(LPX *lp) { /* retrieve objective value (interior point) */ return glp_ipt_obj_val(lp); } double lpx_ipt_row_prim(LPX *lp, int i) { /* retrieve row primal value (interior point) */ return glp_ipt_row_prim(lp, i); } double lpx_ipt_row_dual(LPX *lp, int i) { /* retrieve row dual value (interior point) */ return glp_ipt_row_dual(lp, i); } double lpx_ipt_col_prim(LPX *lp, int j) { /* retrieve column primal value (interior point) */ return glp_ipt_col_prim(lp, j); } double lpx_ipt_col_dual(LPX *lp, int j) { /* retrieve column dual value (interior point) */ return glp_ipt_col_dual(lp, j); } void lpx_set_class(LPX *lp, int klass) { /* set problem class */ xassert(lp == lp); if (!(klass == LPX_LP || klass == LPX_MIP)) xerror("lpx_set_class: invalid problem class\n"); return; } int lpx_get_class(LPX *lp) { /* determine problem klass */ return glp_get_num_int(lp) == 0 ? LPX_LP : LPX_MIP; } void lpx_set_col_kind(LPX *lp, int j, int kind) { /* set (change) column kind */ glp_set_col_kind(lp, j, kind - LPX_CV + GLP_CV); return; } int lpx_get_col_kind(LPX *lp, int j) { /* retrieve column kind */ return glp_get_col_kind(lp, j) == GLP_CV ? LPX_CV : LPX_IV; } int lpx_get_num_int(LPX *lp) { /* retrieve number of integer columns */ return glp_get_num_int(lp); } int lpx_get_num_bin(LPX *lp) { /* retrieve number of binary columns */ return glp_get_num_bin(lp); } static int solve_mip(LPX *lp, int presolve) { glp_iocp parm; int ret; glp_init_iocp(&parm); switch (lpx_get_int_parm(lp, LPX_K_MSGLEV)) { case 0: parm.msg_lev = GLP_MSG_OFF; break; case 1: parm.msg_lev = GLP_MSG_ERR; break; case 2: parm.msg_lev = GLP_MSG_ON; break; case 3: parm.msg_lev = GLP_MSG_ALL; break; default: xassert(lp != lp); } switch (lpx_get_int_parm(lp, LPX_K_BRANCH)) { case 0: parm.br_tech = GLP_BR_FFV; break; case 1: parm.br_tech = GLP_BR_LFV; break; case 2: parm.br_tech = GLP_BR_DTH; break; case 3: parm.br_tech = GLP_BR_MFV; break; default: xassert(lp != lp); } switch (lpx_get_int_parm(lp, LPX_K_BTRACK)) { case 0: parm.bt_tech = GLP_BT_DFS; break; case 1: parm.bt_tech = GLP_BT_BFS; break; case 2: parm.bt_tech = GLP_BT_BPH; break; case 3: parm.bt_tech = GLP_BT_BLB; break; default: xassert(lp != lp); } parm.tol_int = lpx_get_real_parm(lp, LPX_K_TOLINT); parm.tol_obj = lpx_get_real_parm(lp, LPX_K_TOLOBJ); if (lpx_get_real_parm(lp, LPX_K_TMLIM) < 0.0 || lpx_get_real_parm(lp, LPX_K_TMLIM) > 1e6) parm.tm_lim = INT_MAX; else parm.tm_lim = (int)(1000.0 * lpx_get_real_parm(lp, LPX_K_TMLIM)); parm.mip_gap = lpx_get_real_parm(lp, LPX_K_MIPGAP); if (lpx_get_int_parm(lp, LPX_K_USECUTS) & LPX_C_GOMORY) parm.gmi_cuts = GLP_ON; else parm.gmi_cuts = GLP_OFF; if (lpx_get_int_parm(lp, LPX_K_USECUTS) & LPX_C_MIR) parm.mir_cuts = GLP_ON; else parm.mir_cuts = GLP_OFF; if (lpx_get_int_parm(lp, LPX_K_USECUTS) & LPX_C_COVER) parm.cov_cuts = GLP_ON; else parm.cov_cuts = GLP_OFF; if (lpx_get_int_parm(lp, LPX_K_USECUTS) & LPX_C_CLIQUE) parm.clq_cuts = GLP_ON; else parm.clq_cuts = GLP_OFF; parm.presolve = presolve; if (lpx_get_int_parm(lp, LPX_K_BINARIZE)) parm.binarize = GLP_ON; ret = glp_intopt(lp, &parm); switch (ret) { case 0: ret = LPX_E_OK; break; case GLP_ENOPFS: ret = LPX_E_NOPFS; break; case GLP_ENODFS: ret = LPX_E_NODFS; break; case GLP_EBOUND: case GLP_EROOT: ret = LPX_E_FAULT; break; case GLP_EFAIL: ret = LPX_E_SING; break; case GLP_EMIPGAP: ret = LPX_E_MIPGAP; break; case GLP_ETMLIM: ret = LPX_E_TMLIM; break; default: xassert(ret != ret); } return ret; } int lpx_integer(LPX *lp) { /* easy-to-use driver to the branch-and-bound method */ return solve_mip(lp, GLP_OFF); } int lpx_intopt(LPX *lp) { /* easy-to-use driver to the branch-and-bound method */ return solve_mip(lp, GLP_ON); } int lpx_mip_status(glp_prob *lp) { /* retrieve status of MIP solution */ int status; switch (glp_mip_status(lp)) { case GLP_UNDEF: status = LPX_I_UNDEF; break; case GLP_OPT: status = LPX_I_OPT; break; case GLP_FEAS: status = LPX_I_FEAS; break; case GLP_NOFEAS: status = LPX_I_NOFEAS; break; default: xassert(lp != lp); } return status; } double lpx_mip_obj_val(LPX *lp) { /* retrieve objective value (MIP solution) */ return glp_mip_obj_val(lp); } double lpx_mip_row_val(LPX *lp, int i) { /* retrieve row value (MIP solution) */ return glp_mip_row_val(lp, i); } double lpx_mip_col_val(LPX *lp, int j) { /* retrieve column value (MIP solution) */ return glp_mip_col_val(lp, j); } void lpx_check_int(LPX *lp, LPXKKT *kkt) { /* check integer feasibility conditions */ int ae_ind, re_ind; double ae_max, re_max; glp_check_kkt(lp, GLP_MIP, GLP_KKT_PE, &ae_max, &ae_ind, &re_max, &re_ind); kkt->pe_ae_max = ae_max; kkt->pe_ae_row = ae_ind; kkt->pe_re_max = re_max; kkt->pe_re_row = re_ind; if (re_max <= 1e-9) kkt->pe_quality = 'H'; else if (re_max <= 1e-6) kkt->pe_quality = 'M'; else if (re_max <= 1e-3) kkt->pe_quality = 'L'; else kkt->pe_quality = '?'; glp_check_kkt(lp, GLP_MIP, GLP_KKT_PB, &ae_max, &ae_ind, &re_max, &re_ind); kkt->pb_ae_max = ae_max; kkt->pb_ae_ind = ae_ind; kkt->pb_re_max = re_max; kkt->pb_re_ind = re_ind; if (re_max <= 1e-9) kkt->pb_quality = 'H'; else if (re_max <= 1e-6) kkt->pb_quality = 'M'; else if (re_max <= 1e-3) kkt->pb_quality = 'L'; else kkt->pb_quality = '?'; return; } void lpx_reset_parms(LPX *lp) { /* reset control parameters to default values */ struct CPS *cps = find_cps(lp); reset_cps(cps); return; } void lpx_set_int_parm(LPX *lp, int parm, int val) { /* set (change) integer control parameter */ struct CPS *cps = find_cps(lp); switch (parm) { case LPX_K_MSGLEV: if (!(0 <= val && val <= 3)) xerror("lpx_set_int_parm: MSGLEV = %d; invalid value\n", val); cps->msg_lev = val; break; case LPX_K_SCALE: if (!(0 <= val && val <= 3)) xerror("lpx_set_int_parm: SCALE = %d; invalid value\n", val); cps->scale = val; break; case LPX_K_DUAL: if (!(val == 0 || val == 1)) xerror("lpx_set_int_parm: DUAL = %d; invalid value\n", val); cps->dual = val; break; case LPX_K_PRICE: if (!(val == 0 || val == 1)) xerror("lpx_set_int_parm: PRICE = %d; invalid value\n", val); cps->price = val; break; case LPX_K_ROUND: if (!(val == 0 || val == 1)) xerror("lpx_set_int_parm: ROUND = %d; invalid value\n", val); cps->round = val; break; case LPX_K_ITLIM: cps->it_lim = val; break; case LPX_K_ITCNT: glp_set_it_cnt(lp, val); break; case LPX_K_OUTFRQ: if (!(val > 0)) xerror("lpx_set_int_parm: OUTFRQ = %d; invalid value\n", val); cps->out_frq = val; break; case LPX_K_BRANCH: if (!(val == 0 || val == 1 || val == 2 || val == 3)) xerror("lpx_set_int_parm: BRANCH = %d; invalid value\n", val); cps->branch = val; break; case LPX_K_BTRACK: if (!(val == 0 || val == 1 || val == 2 || val == 3)) xerror("lpx_set_int_parm: BTRACK = %d; invalid value\n", val); cps->btrack = val; break; case LPX_K_MPSINFO: if (!(val == 0 || val == 1)) xerror("lpx_set_int_parm: MPSINFO = %d; invalid value\n", val); cps->mps_info = val; break; case LPX_K_MPSOBJ: if (!(val == 0 || val == 1 || val == 2)) xerror("lpx_set_int_parm: MPSOBJ = %d; invalid value\n", val); cps->mps_obj = val; break; case LPX_K_MPSORIG: if (!(val == 0 || val == 1)) xerror("lpx_set_int_parm: MPSORIG = %d; invalid value\n", val); cps->mps_orig = val; break; case LPX_K_MPSWIDE: if (!(val == 0 || val == 1)) xerror("lpx_set_int_parm: MPSWIDE = %d; invalid value\n", val); cps->mps_wide = val; break; case LPX_K_MPSFREE: if (!(val == 0 || val == 1)) xerror("lpx_set_int_parm: MPSFREE = %d; invalid value\n", val); cps->mps_free = val; break; case LPX_K_MPSSKIP: if (!(val == 0 || val == 1)) xerror("lpx_set_int_parm: MPSSKIP = %d; invalid value\n", val); cps->mps_skip = val; break; case LPX_K_LPTORIG: if (!(val == 0 || val == 1)) xerror("lpx_set_int_parm: LPTORIG = %d; invalid value\n", val); cps->lpt_orig = val; break; case LPX_K_PRESOL: if (!(val == 0 || val == 1)) xerror("lpx_set_int_parm: PRESOL = %d; invalid value\n", val); cps->presol = val; break; case LPX_K_BINARIZE: if (!(val == 0 || val == 1)) xerror("lpx_set_int_parm: BINARIZE = %d; invalid value\n" , val); cps->binarize = val; break; case LPX_K_USECUTS: if (val & ~LPX_C_ALL) xerror("lpx_set_int_parm: USECUTS = 0x%X; invalid value\n", val); cps->use_cuts = val; break; case LPX_K_BFTYPE: { glp_bfcp parm; glp_get_bfcp(lp, &parm); switch (val) { case 1: parm.type = GLP_BF_FT; break; case 2: parm.type = GLP_BF_BG; break; case 3: parm.type = GLP_BF_GR; break; default: xerror("lpx_set_int_parm: BFTYPE = %d; invalid val" "ue\n", val); } glp_set_bfcp(lp, &parm); } break; default: xerror("lpx_set_int_parm: parm = %d; invalid parameter\n", parm); } return; } int lpx_get_int_parm(LPX *lp, int parm) { /* query integer control parameter */ struct CPS *cps = find_cps(lp); int val = 0; switch (parm) { case LPX_K_MSGLEV: val = cps->msg_lev; break; case LPX_K_SCALE: val = cps->scale; break; case LPX_K_DUAL: val = cps->dual; break; case LPX_K_PRICE: val = cps->price; break; case LPX_K_ROUND: val = cps->round; break; case LPX_K_ITLIM: val = cps->it_lim; break; case LPX_K_ITCNT: val = glp_get_it_cnt(lp); break; case LPX_K_OUTFRQ: val = cps->out_frq; break; case LPX_K_BRANCH: val = cps->branch; break; case LPX_K_BTRACK: val = cps->btrack; break; case LPX_K_MPSINFO: val = cps->mps_info; break; case LPX_K_MPSOBJ: val = cps->mps_obj; break; case LPX_K_MPSORIG: val = cps->mps_orig; break; case LPX_K_MPSWIDE: val = cps->mps_wide; break; case LPX_K_MPSFREE: val = cps->mps_free; break; case LPX_K_MPSSKIP: val = cps->mps_skip; break; case LPX_K_LPTORIG: val = cps->lpt_orig; break; case LPX_K_PRESOL: val = cps->presol; break; case LPX_K_BINARIZE: val = cps->binarize; break; case LPX_K_USECUTS: val = cps->use_cuts; break; case LPX_K_BFTYPE: { glp_bfcp parm; glp_get_bfcp(lp, &parm); switch (parm.type) { case GLP_BF_FT: val = 1; break; case GLP_BF_BG: val = 2; break; case GLP_BF_GR: val = 3; break; default: xassert(lp != lp); } } break; default: xerror("lpx_get_int_parm: parm = %d; invalid parameter\n", parm); } return val; } void lpx_set_real_parm(LPX *lp, int parm, double val) { /* set (change) real control parameter */ struct CPS *cps = find_cps(lp); switch (parm) { case LPX_K_RELAX: if (!(0.0 <= val && val <= 1.0)) xerror("lpx_set_real_parm: RELAX = %g; invalid value\n", val); cps->relax = val; break; case LPX_K_TOLBND: if (!(DBL_EPSILON <= val && val <= 0.001)) xerror("lpx_set_real_parm: TOLBND = %g; invalid value\n", val); cps->tol_bnd = val; break; case LPX_K_TOLDJ: if (!(DBL_EPSILON <= val && val <= 0.001)) xerror("lpx_set_real_parm: TOLDJ = %g; invalid value\n", val); cps->tol_dj = val; break; case LPX_K_TOLPIV: if (!(DBL_EPSILON <= val && val <= 0.001)) xerror("lpx_set_real_parm: TOLPIV = %g; invalid value\n", val); cps->tol_piv = val; break; case LPX_K_OBJLL: cps->obj_ll = val; break; case LPX_K_OBJUL: cps->obj_ul = val; break; case LPX_K_TMLIM: cps->tm_lim = val; break; case LPX_K_OUTDLY: cps->out_dly = val; break; case LPX_K_TOLINT: if (!(DBL_EPSILON <= val && val <= 0.001)) xerror("lpx_set_real_parm: TOLINT = %g; invalid value\n", val); cps->tol_int = val; break; case LPX_K_TOLOBJ: if (!(DBL_EPSILON <= val && val <= 0.001)) xerror("lpx_set_real_parm: TOLOBJ = %g; invalid value\n", val); cps->tol_obj = val; break; case LPX_K_MIPGAP: if (val < 0.0) xerror("lpx_set_real_parm: MIPGAP = %g; invalid value\n", val); cps->mip_gap = val; break; default: xerror("lpx_set_real_parm: parm = %d; invalid parameter\n", parm); } return; } double lpx_get_real_parm(LPX *lp, int parm) { /* query real control parameter */ struct CPS *cps = find_cps(lp); double val = 0.0; switch (parm) { case LPX_K_RELAX: val = cps->relax; break; case LPX_K_TOLBND: val = cps->tol_bnd; break; case LPX_K_TOLDJ: val = cps->tol_dj; break; case LPX_K_TOLPIV: val = cps->tol_piv; break; case LPX_K_OBJLL: val = cps->obj_ll; break; case LPX_K_OBJUL: val = cps->obj_ul; break; case LPX_K_TMLIM: val = cps->tm_lim; break; case LPX_K_OUTDLY: val = cps->out_dly; break; case LPX_K_TOLINT: val = cps->tol_int; break; case LPX_K_TOLOBJ: val = cps->tol_obj; break; case LPX_K_MIPGAP: val = cps->mip_gap; break; default: xerror("lpx_get_real_parm: parm = %d; invalid parameter\n", parm); } return val; } LPX *lpx_read_mps(const char *fname) { /* read problem data in fixed MPS format */ LPX *lp = lpx_create_prob(); if (glp_read_mps(lp, GLP_MPS_DECK, NULL, fname)) lpx_delete_prob(lp), lp = NULL; return lp; } int lpx_write_mps(LPX *lp, const char *fname) { /* write problem data in fixed MPS format */ return glp_write_mps(lp, GLP_MPS_DECK, NULL, fname); } int lpx_read_bas(LPX *lp, const char *fname) { /* read LP basis in fixed MPS format */ xassert(lp == lp); xassert(fname == fname); xerror("lpx_read_bas: operation not supported\n"); return 0; } int lpx_write_bas(LPX *lp, const char *fname) { /* write LP basis in fixed MPS format */ xassert(lp == lp); xassert(fname == fname); xerror("lpx_write_bas: operation not supported\n"); return 0; } LPX *lpx_read_freemps(const char *fname) { /* read problem data in free MPS format */ LPX *lp = lpx_create_prob(); if (glp_read_mps(lp, GLP_MPS_FILE, NULL, fname)) lpx_delete_prob(lp), lp = NULL; return lp; } int lpx_write_freemps(LPX *lp, const char *fname) { /* write problem data in free MPS format */ return glp_write_mps(lp, GLP_MPS_FILE, NULL, fname); } LPX *lpx_read_cpxlp(const char *fname) { /* read problem data in CPLEX LP format */ LPX *lp; lp = lpx_create_prob(); if (glp_read_lp(lp, NULL, fname)) lpx_delete_prob(lp), lp = NULL; return lp; } int lpx_write_cpxlp(LPX *lp, const char *fname) { /* write problem data in CPLEX LP format */ return glp_write_lp(lp, NULL, fname); } LPX *lpx_read_model(const char *model, const char *data, const char *output) { /* read LP/MIP model written in GNU MathProg language */ LPX *lp = NULL; glp_tran *tran; /* allocate the translator workspace */ tran = glp_mpl_alloc_wksp(); /* read model section and optional data section */ if (glp_mpl_read_model(tran, model, data != NULL)) goto done; /* read separate data section, if required */ if (data != NULL) if (glp_mpl_read_data(tran, data)) goto done; /* generate the model */ if (glp_mpl_generate(tran, output)) goto done; /* build the problem instance from the model */ lp = lpx_create_prob(); glp_mpl_build_prob(tran, lp); done: /* free the translator workspace */ glp_mpl_free_wksp(tran); /* bring the problem object to the calling program */ return lp; } int lpx_print_prob(LPX *lp, const char *fname) { /* write problem data in plain text format */ return glp_write_lp(lp, NULL, fname); } int lpx_print_sol(LPX *lp, const char *fname) { /* write LP problem solution in printable format */ return glp_print_sol(lp, fname); } int lpx_print_sens_bnds(LPX *lp, const char *fname) { /* write bounds sensitivity information */ if (glp_get_status(lp) == GLP_OPT && !glp_bf_exists(lp)) glp_factorize(lp); return glp_print_ranges(lp, 0, NULL, 0, fname); } int lpx_print_ips(LPX *lp, const char *fname) { /* write interior point solution in printable format */ return glp_print_ipt(lp, fname); } int lpx_print_mip(LPX *lp, const char *fname) { /* write MIP problem solution in printable format */ return glp_print_mip(lp, fname); } int lpx_is_b_avail(glp_prob *lp) { /* check if LP basis is available */ return glp_bf_exists(lp); } int lpx_main(int argc, const char *argv[]) { /* stand-alone LP/MIP solver */ return glp_main(argc, argv); } /* eof */ glpk-5.0/examples/oldapi/lpx.h0000644000062000006210000004372213766346220015554 0ustar maomkpasswd/* lpx.h (old GLPK API) */ /* Written by Andrew Makhorin , August 2013. */ #ifndef LPX_H #define LPX_H #include #ifdef __cplusplus extern "C" { #endif #define LPX glp_prob /* problem class: */ #define LPX_LP 100 /* linear programming (LP) */ #define LPX_MIP 101 /* mixed integer programming (MIP) */ /* type of auxiliary/structural variable: */ #define LPX_FR 110 /* free variable */ #define LPX_LO 111 /* variable with lower bound */ #define LPX_UP 112 /* variable with upper bound */ #define LPX_DB 113 /* double-bounded variable */ #define LPX_FX 114 /* fixed variable */ /* optimization direction flag: */ #define LPX_MIN 120 /* minimization */ #define LPX_MAX 121 /* maximization */ /* status of primal basic solution: */ #define LPX_P_UNDEF 132 /* primal solution is undefined */ #define LPX_P_FEAS 133 /* solution is primal feasible */ #define LPX_P_INFEAS 134 /* solution is primal infeasible */ #define LPX_P_NOFEAS 135 /* no primal feasible solution exists */ /* status of dual basic solution: */ #define LPX_D_UNDEF 136 /* dual solution is undefined */ #define LPX_D_FEAS 137 /* solution is dual feasible */ #define LPX_D_INFEAS 138 /* solution is dual infeasible */ #define LPX_D_NOFEAS 139 /* no dual feasible solution exists */ /* status of auxiliary/structural variable: */ #define LPX_BS 140 /* basic variable */ #define LPX_NL 141 /* non-basic variable on lower bound */ #define LPX_NU 142 /* non-basic variable on upper bound */ #define LPX_NF 143 /* non-basic free variable */ #define LPX_NS 144 /* non-basic fixed variable */ /* status of interior-point solution: */ #define LPX_T_UNDEF 150 /* interior solution is undefined */ #define LPX_T_OPT 151 /* interior solution is optimal */ /* kind of structural variable: */ #define LPX_CV 160 /* continuous variable */ #define LPX_IV 161 /* integer variable */ /* status of integer solution: */ #define LPX_I_UNDEF 170 /* integer solution is undefined */ #define LPX_I_OPT 171 /* integer solution is optimal */ #define LPX_I_FEAS 172 /* integer solution is feasible */ #define LPX_I_NOFEAS 173 /* no integer solution exists */ /* status codes reported by the routine lpx_get_status: */ #define LPX_OPT 180 /* optimal */ #define LPX_FEAS 181 /* feasible */ #define LPX_INFEAS 182 /* infeasible */ #define LPX_NOFEAS 183 /* no feasible */ #define LPX_UNBND 184 /* unbounded */ #define LPX_UNDEF 185 /* undefined */ /* exit codes returned by solver routines: */ #define LPX_E_OK 200 /* success */ #define LPX_E_EMPTY 201 /* empty problem */ #define LPX_E_BADB 202 /* invalid initial basis */ #define LPX_E_INFEAS 203 /* infeasible initial solution */ #define LPX_E_FAULT 204 /* unable to start the search */ #define LPX_E_OBJLL 205 /* objective lower limit reached */ #define LPX_E_OBJUL 206 /* objective upper limit reached */ #define LPX_E_ITLIM 207 /* iterations limit exhausted */ #define LPX_E_TMLIM 208 /* time limit exhausted */ #define LPX_E_NOFEAS 209 /* no feasible solution */ #define LPX_E_INSTAB 210 /* numerical instability */ #define LPX_E_SING 211 /* problems with basis matrix */ #define LPX_E_NOCONV 212 /* no convergence (interior) */ #define LPX_E_NOPFS 213 /* no primal feas. sol. (LP presolver) */ #define LPX_E_NODFS 214 /* no dual feas. sol. (LP presolver) */ #define LPX_E_MIPGAP 215 /* relative mip gap tolerance reached */ /* control parameter identifiers: */ #define LPX_K_MSGLEV 300 /* lp->msg_lev */ #define LPX_K_SCALE 301 /* lp->scale */ #define LPX_K_DUAL 302 /* lp->dual */ #define LPX_K_PRICE 303 /* lp->price */ #define LPX_K_RELAX 304 /* lp->relax */ #define LPX_K_TOLBND 305 /* lp->tol_bnd */ #define LPX_K_TOLDJ 306 /* lp->tol_dj */ #define LPX_K_TOLPIV 307 /* lp->tol_piv */ #define LPX_K_ROUND 308 /* lp->round */ #define LPX_K_OBJLL 309 /* lp->obj_ll */ #define LPX_K_OBJUL 310 /* lp->obj_ul */ #define LPX_K_ITLIM 311 /* lp->it_lim */ #define LPX_K_ITCNT 312 /* lp->it_cnt */ #define LPX_K_TMLIM 313 /* lp->tm_lim */ #define LPX_K_OUTFRQ 314 /* lp->out_frq */ #define LPX_K_OUTDLY 315 /* lp->out_dly */ #define LPX_K_BRANCH 316 /* lp->branch */ #define LPX_K_BTRACK 317 /* lp->btrack */ #define LPX_K_TOLINT 318 /* lp->tol_int */ #define LPX_K_TOLOBJ 319 /* lp->tol_obj */ #define LPX_K_MPSINFO 320 /* lp->mps_info */ #define LPX_K_MPSOBJ 321 /* lp->mps_obj */ #define LPX_K_MPSORIG 322 /* lp->mps_orig */ #define LPX_K_MPSWIDE 323 /* lp->mps_wide */ #define LPX_K_MPSFREE 324 /* lp->mps_free */ #define LPX_K_MPSSKIP 325 /* lp->mps_skip */ #define LPX_K_LPTORIG 326 /* lp->lpt_orig */ #define LPX_K_PRESOL 327 /* lp->presol */ #define LPX_K_BINARIZE 328 /* lp->binarize */ #define LPX_K_USECUTS 329 /* lp->use_cuts */ #define LPX_K_BFTYPE 330 /* lp->bfcp->type */ #define LPX_K_MIPGAP 331 /* lp->mip_gap */ #define LPX_C_COVER 0x01 /* mixed cover cuts */ #define LPX_C_CLIQUE 0x02 /* clique cuts */ #define LPX_C_GOMORY 0x04 /* Gomory's mixed integer cuts */ #define LPX_C_MIR 0x08 /* mixed integer rounding cuts */ #define LPX_C_ALL 0xFF /* all cuts */ typedef struct { /* this structure contains results reported by the routines which checks Karush-Kuhn-Tucker conditions (for details see comments to those routines) */ /*--------------------------------------------------------------*/ /* xR - A * xS = 0 (KKT.PE) */ double pe_ae_max; /* largest absolute error */ int pe_ae_row; /* number of row with largest absolute error */ double pe_re_max; /* largest relative error */ int pe_re_row; /* number of row with largest relative error */ int pe_quality; /* quality of primal solution: 'H' - high 'M' - medium 'L' - low '?' - primal solution is wrong */ /*--------------------------------------------------------------*/ /* l[k] <= x[k] <= u[k] (KKT.PB) */ double pb_ae_max; /* largest absolute error */ int pb_ae_ind; /* number of variable with largest absolute error */ double pb_re_max; /* largest relative error */ int pb_re_ind; /* number of variable with largest relative error */ int pb_quality; /* quality of primal feasibility: 'H' - high 'M' - medium 'L' - low '?' - primal solution is infeasible */ /*--------------------------------------------------------------*/ /* A' * (dR - cR) + (dS - cS) = 0 (KKT.DE) */ double de_ae_max; /* largest absolute error */ int de_ae_col; /* number of column with largest absolute error */ double de_re_max; /* largest relative error */ int de_re_col; /* number of column with largest relative error */ int de_quality; /* quality of dual solution: 'H' - high 'M' - medium 'L' - low '?' - dual solution is wrong */ /*--------------------------------------------------------------*/ /* d[k] >= 0 or d[k] <= 0 (KKT.DB) */ double db_ae_max; /* largest absolute error */ int db_ae_ind; /* number of variable with largest absolute error */ double db_re_max; /* largest relative error */ int db_re_ind; /* number of variable with largest relative error */ int db_quality; /* quality of dual feasibility: 'H' - high 'M' - medium 'L' - low '?' - dual solution is infeasible */ /*--------------------------------------------------------------*/ /* (x[k] - bound of x[k]) * d[k] = 0 (KKT.CS) */ double cs_ae_max; /* largest absolute error */ int cs_ae_ind; /* number of variable with largest absolute error */ double cs_re_max; /* largest relative error */ int cs_re_ind; /* number of variable with largest relative error */ int cs_quality; /* quality of complementary slackness: 'H' - high 'M' - medium 'L' - low '?' - primal and dual solutions are not complementary */ } LPXKKT; LPX *lpx_create_prob(void); /* create problem object */ void lpx_set_prob_name(LPX *lp, const char *name); /* assign (change) problem name */ void lpx_set_obj_name(LPX *lp, const char *name); /* assign (change) objective function name */ void lpx_set_obj_dir(LPX *lp, int dir); /* set (change) optimization direction flag */ int lpx_add_rows(LPX *lp, int nrs); /* add new rows to problem object */ int lpx_add_cols(LPX *lp, int ncs); /* add new columns to problem object */ void lpx_set_row_name(LPX *lp, int i, const char *name); /* assign (change) row name */ void lpx_set_col_name(LPX *lp, int j, const char *name); /* assign (change) column name */ void lpx_set_row_bnds(LPX *lp, int i, int type, double lb, double ub); /* set (change) row bounds */ void lpx_set_col_bnds(LPX *lp, int j, int type, double lb, double ub); /* set (change) column bounds */ void lpx_set_obj_coef(glp_prob *lp, int j, double coef); /* set (change) obj. coefficient or constant term */ void lpx_set_mat_row(LPX *lp, int i, int len, const int ind[], const double val[]); /* set (replace) row of the constraint matrix */ void lpx_set_mat_col(LPX *lp, int j, int len, const int ind[], const double val[]); /* set (replace) column of the constraint matrix */ void lpx_load_matrix(LPX *lp, int ne, const int ia[], const int ja[], const double ar[]); /* load (replace) the whole constraint matrix */ void lpx_del_rows(LPX *lp, int nrs, const int num[]); /* delete specified rows from problem object */ void lpx_del_cols(LPX *lp, int ncs, const int num[]); /* delete specified columns from problem object */ void lpx_delete_prob(LPX *lp); /* delete problem object */ const char *lpx_get_prob_name(LPX *lp); /* retrieve problem name */ const char *lpx_get_obj_name(LPX *lp); /* retrieve objective function name */ int lpx_get_obj_dir(LPX *lp); /* retrieve optimization direction flag */ int lpx_get_num_rows(LPX *lp); /* retrieve number of rows */ int lpx_get_num_cols(LPX *lp); /* retrieve number of columns */ const char *lpx_get_row_name(LPX *lp, int i); /* retrieve row name */ const char *lpx_get_col_name(LPX *lp, int j); /* retrieve column name */ int lpx_get_row_type(LPX *lp, int i); /* retrieve row type */ double lpx_get_row_lb(LPX *lp, int i); /* retrieve row lower bound */ double lpx_get_row_ub(LPX *lp, int i); /* retrieve row upper bound */ void lpx_get_row_bnds(LPX *lp, int i, int *typx, double *lb, double *ub); /* retrieve row bounds */ int lpx_get_col_type(LPX *lp, int j); /* retrieve column type */ double lpx_get_col_lb(LPX *lp, int j); /* retrieve column lower bound */ double lpx_get_col_ub(LPX *lp, int j); /* retrieve column upper bound */ void lpx_get_col_bnds(LPX *lp, int j, int *typx, double *lb, double *ub); /* retrieve column bounds */ double lpx_get_obj_coef(LPX *lp, int j); /* retrieve obj. coefficient or constant term */ int lpx_get_num_nz(LPX *lp); /* retrieve number of constraint coefficients */ int lpx_get_mat_row(LPX *lp, int i, int ind[], double val[]); /* retrieve row of the constraint matrix */ int lpx_get_mat_col(LPX *lp, int j, int ind[], double val[]); /* retrieve column of the constraint matrix */ void lpx_create_index(LPX *lp); /* create the name index */ int lpx_find_row(LPX *lp, const char *name); /* find row by its name */ int lpx_find_col(LPX *lp, const char *name); /* find column by its name */ void lpx_delete_index(LPX *lp); /* delete the name index */ void lpx_scale_prob(LPX *lp); /* scale problem data */ void lpx_unscale_prob(LPX *lp); /* unscale problem data */ void lpx_set_row_stat(LPX *lp, int i, int stat); /* set (change) row status */ void lpx_set_col_stat(LPX *lp, int j, int stat); /* set (change) column status */ void lpx_std_basis(LPX *lp); /* construct standard initial LP basis */ void lpx_adv_basis(LPX *lp); /* construct advanced initial LP basis */ void lpx_cpx_basis(LPX *lp); /* construct Bixby's initial LP basis */ int lpx_simplex(LPX *lp); /* easy-to-use driver to the simplex method */ int lpx_exact(LPX *lp); /* easy-to-use driver to the exact simplex method */ int lpx_get_status(LPX *lp); /* retrieve generic status of basic solution */ int lpx_get_prim_stat(LPX *lp); /* retrieve primal status of basic solution */ int lpx_get_dual_stat(LPX *lp); /* retrieve dual status of basic solution */ double lpx_get_obj_val(LPX *lp); /* retrieve objective value (basic solution) */ int lpx_get_row_stat(LPX *lp, int i); /* retrieve row status (basic solution) */ double lpx_get_row_prim(LPX *lp, int i); /* retrieve row primal value (basic solution) */ double lpx_get_row_dual(LPX *lp, int i); /* retrieve row dual value (basic solution) */ void lpx_get_row_info(LPX *lp, int i, int *tagx, double *vx, double *dx); /* obtain row solution information */ int lpx_get_col_stat(LPX *lp, int j); /* retrieve column status (basic solution) */ double lpx_get_col_prim(LPX *lp, int j); /* retrieve column primal value (basic solution) */ double lpx_get_col_dual(glp_prob *lp, int j); /* retrieve column dual value (basic solution) */ void lpx_get_col_info(LPX *lp, int j, int *tagx, double *vx, double *dx); /* obtain column solution information (obsolete) */ int lpx_get_ray_info(LPX *lp); /* determine what causes primal unboundness */ void lpx_check_kkt(LPX *lp, int scaled, LPXKKT *kkt); /* check Karush-Kuhn-Tucker conditions */ int lpx_warm_up(LPX *lp); /* "warm up" LP basis */ int lpx_eval_tab_row(LPX *lp, int k, int ind[], double val[]); /* compute row of the simplex table */ int lpx_eval_tab_col(LPX *lp, int k, int ind[], double val[]); /* compute column of the simplex table */ int lpx_transform_row(LPX *lp, int len, int ind[], double val[]); /* transform explicitly specified row */ int lpx_transform_col(LPX *lp, int len, int ind[], double val[]); /* transform explicitly specified column */ int lpx_prim_ratio_test(LPX *lp, int len, const int ind[], const double val[], int how, double tol); /* perform primal ratio test */ int lpx_dual_ratio_test(LPX *lp, int len, const int ind[], const double val[], int how, double tol); /* perform dual ratio test */ int lpx_interior(LPX *lp); /* easy-to-use driver to the interior point method */ int lpx_ipt_status(LPX *lp); /* retrieve status of interior-point solution */ double lpx_ipt_obj_val(LPX *lp); /* retrieve objective value (interior point) */ double lpx_ipt_row_prim(LPX *lp, int i); /* retrieve row primal value (interior point) */ double lpx_ipt_row_dual(LPX *lp, int i); /* retrieve row dual value (interior point) */ double lpx_ipt_col_prim(LPX *lp, int j); /* retrieve column primal value (interior point) */ double lpx_ipt_col_dual(LPX *lp, int j); /* retrieve column dual value (interior point) */ void lpx_set_class(LPX *lp, int klass); /* set problem class */ int lpx_get_class(LPX *lp); /* determine problem klass */ void lpx_set_col_kind(LPX *lp, int j, int kind); /* set (change) column kind */ int lpx_get_col_kind(LPX *lp, int j); /* retrieve column kind */ int lpx_get_num_int(LPX *lp); /* retrieve number of integer columns */ int lpx_get_num_bin(LPX *lp); /* retrieve number of binary columns */ int lpx_integer(LPX *lp); /* easy-to-use driver to the branch-and-bound method */ int lpx_intopt(LPX *lp); /* easy-to-use driver to the branch-and-bound method */ int lpx_mip_status(LPX *lp); /* retrieve status of MIP solution */ double lpx_mip_obj_val(LPX *lp); /* retrieve objective value (MIP solution) */ double lpx_mip_row_val(LPX *lp, int i); /* retrieve row value (MIP solution) */ double lpx_mip_col_val(LPX *lp, int j); /* retrieve column value (MIP solution) */ void lpx_check_int(LPX *lp, LPXKKT *kkt); /* check integer feasibility conditions */ void lpx_reset_parms(LPX *lp); /* reset control parameters to default values */ void lpx_set_int_parm(LPX *lp, int parm, int val); /* set (change) integer control parameter */ int lpx_get_int_parm(LPX *lp, int parm); /* query integer control parameter */ void lpx_set_real_parm(LPX *lp, int parm, double val); /* set (change) real control parameter */ double lpx_get_real_parm(LPX *lp, int parm); /* query real control parameter */ LPX *lpx_read_mps(const char *fname); /* read problem data in fixed MPS format */ int lpx_write_mps(LPX *lp, const char *fname); /* write problem data in fixed MPS format */ int lpx_read_bas(LPX *lp, const char *fname); /* read LP basis in fixed MPS format */ int lpx_write_bas(LPX *lp, const char *fname); /* write LP basis in fixed MPS format */ LPX *lpx_read_freemps(const char *fname); /* read problem data in free MPS format */ int lpx_write_freemps(LPX *lp, const char *fname); /* write problem data in free MPS format */ LPX *lpx_read_cpxlp(const char *fname); /* read problem data in CPLEX LP format */ int lpx_write_cpxlp(LPX *lp, const char *fname); /* write problem data in CPLEX LP format */ LPX *lpx_read_model(const char *model, const char *data, const char *output); /* read LP/MIP model written in GNU MathProg language */ int lpx_print_prob(LPX *lp, const char *fname); /* write problem data in plain text format */ int lpx_print_sol(LPX *lp, const char *fname); /* write LP problem solution in printable format */ int lpx_print_sens_bnds(LPX *lp, const char *fname); /* write bounds sensitivity information */ int lpx_print_ips(LPX *lp, const char *fname); /* write interior point solution in printable format */ int lpx_print_mip(LPX *lp, const char *fname); /* write MIP problem solution in printable format */ int lpx_is_b_avail(LPX *lp); /* check if LP basis is available */ int lpx_main(int argc, const char *argv[]); /* stand-alone LP/MIP solver */ #ifdef __cplusplus } #endif #endif /* eof */ glpk-5.0/examples/oldapi/lpxsamp.c0000644000062000006210000000345313766346220016425 0ustar maomkpasswd/* lpxsamp.c */ #include #include #include "lpx.h" int main(void) { LPX *lp; int ia[1+1000], ja[1+1000]; double ar[1+1000], Z, x1, x2, x3; s1: lp = lpx_create_prob(); s2: lpx_set_prob_name(lp, "sample"); s3: lpx_set_obj_dir(lp, LPX_MAX); s4: lpx_add_rows(lp, 3); s5: lpx_set_row_name(lp, 1, "p"); s6: lpx_set_row_bnds(lp, 1, LPX_UP, 0.0, 100.0); s7: lpx_set_row_name(lp, 2, "q"); s8: lpx_set_row_bnds(lp, 2, LPX_UP, 0.0, 600.0); s9: lpx_set_row_name(lp, 3, "r"); s10: lpx_set_row_bnds(lp, 3, LPX_UP, 0.0, 300.0); s11: lpx_add_cols(lp, 3); s12: lpx_set_col_name(lp, 1, "x1"); s13: lpx_set_col_bnds(lp, 1, LPX_LO, 0.0, 0.0); s14: lpx_set_obj_coef(lp, 1, 10.0); s15: lpx_set_col_name(lp, 2, "x2"); s16: lpx_set_col_bnds(lp, 2, LPX_LO, 0.0, 0.0); s17: lpx_set_obj_coef(lp, 2, 6.0); s18: lpx_set_col_name(lp, 3, "x3"); s19: lpx_set_col_bnds(lp, 3, LPX_LO, 0.0, 0.0); s20: lpx_set_obj_coef(lp, 3, 4.0); s21: ia[1] = 1, ja[1] = 1, ar[1] = 1.0; /* a[1,1] = 1 */ s22: ia[2] = 1, ja[2] = 2, ar[2] = 1.0; /* a[1,2] = 1 */ s23: ia[3] = 1, ja[3] = 3, ar[3] = 1.0; /* a[1,3] = 1 */ s24: ia[4] = 2, ja[4] = 1, ar[4] = 10.0; /* a[2,1] = 10 */ s25: ia[5] = 3, ja[5] = 1, ar[5] = 2.0; /* a[3,1] = 2 */ s26: ia[6] = 2, ja[6] = 2, ar[6] = 4.0; /* a[2,2] = 4 */ s27: ia[7] = 3, ja[7] = 2, ar[7] = 2.0; /* a[3,2] = 2 */ s28: ia[8] = 2, ja[8] = 3, ar[8] = 5.0; /* a[2,3] = 5 */ s29: ia[9] = 3, ja[9] = 3, ar[9] = 6.0; /* a[3,3] = 6 */ s30: lpx_load_matrix(lp, 9, ia, ja, ar); s31: lpx_simplex(lp); s32: Z = lpx_get_obj_val(lp); s33: x1 = lpx_get_col_prim(lp, 1); s34: x2 = lpx_get_col_prim(lp, 2); s35: x3 = lpx_get_col_prim(lp, 3); s36: printf("\nZ = %g; x1 = %g; x2 = %g; x3 = %g\n", Z, x1, x2, x3); s37: lpx_delete_prob(lp); return 0; } /* eof */ glpk-5.0/examples/oldapi/README0000644000062000006210000000071413766346220015452 0ustar maomkpasswdThe program module in this subdirectory contains an implementation of the old GLPK API as it was defined in GLPK 4.48. To compile an existing project using the old GLPK API you need to add to the project two files lpx.h and lpx.c. Please note that you may mix calls to old and new GLPK API routines in the same project (except calls to glp_create_prob and glp_delete_prob). The file lpxsamp.c is an example that illustrates using the old GLPK API routines. glpk-5.0/examples/pbn/0000755000062000006210000000000013766346220014077 5ustar maomkpasswdglpk-5.0/examples/pbn/9dom.dat0000644000062000006210000000221713766346220015443 0ustar maomkpasswd/* 9dom.dat */ /*********************************************************************** * Web Paint-by-Number Puzzle #8098 from . * Copyright (C) 2010 by Josh Greifer. Used by permission. * * Domino Logic III (Abstract pattern) * * created by Josh Greifer * Apr 5, 2010 * * Encoded in GNU MathProg by Andrew Makhorin . ***********************************************************************/ data; param m := 19; param n := 19; param row : 1 2 := 1 3 . 2 1 . 3 3 1 4 1 . 5 3 1 6 1 . 7 3 1 8 1 . 9 3 1 10 1 . 11 3 1 12 1 . 13 3 1 14 1 . 15 3 1 16 1 . 17 3 1 18 1 . 19 1 . ; param col : 1 2 := 1 1 . 2 1 . 3 1 3 4 1 . 5 1 3 6 1 . 7 1 3 8 1 . 9 1 3 10 1 . 11 1 3 12 1 . 13 1 3 14 1 . 15 1 3 16 1 . 17 1 3 18 1 . 19 3 . ; end; glpk-5.0/examples/pbn/bucks.dat0000644000062000006210000000412113766346220015676 0ustar maomkpasswd/* bucks.dat */ /*********************************************************************** * Web Paint-by-Number Puzzle #27 from . * Copyright (C) 2004 by Jan Wolter. Used by permission. * * Party at the Right [Political] * * created by Jan Wolter * Apr 6, 2004 * * Encoded in GNU MathProg by Andrew Makhorin . ***********************************************************************/ data; param m := 23; param n := 27; param row : 1 2 3 4 5 6 7 8 := 1 11 . . . . . . . 2 17 . . . . . . . 3 3 5 5 3 . . . . 4 2 2 2 1 . . . . 5 2 1 3 1 3 1 4 . 6 3 3 3 3 . . . . 7 5 1 3 1 3 1 3 . 8 3 2 2 4 . . . . 9 5 5 5 5 . . . . 10 23 . . . . . . . 11 . . . . . . . . 12 23 . . . . . . . 13 1 1 . . . . . . 14 1 1 . . . . . . 15 1 2 1 . . . . . 16 1 1 1 1 . . . . 17 1 1 1 1 . . . . 18 1 10 1 2 1 . . . 19 1 1 1 1 1 1 3 . 20 1 1 1 1 1 1 1 1 21 1 1 1 1 1 1 1 . 22 1 1 1 1 2 2 . . 23 5 5 3 . . . . . ; param col : 1 2 3 4 5 6 := 1 4 12 . . . . 2 6 1 1 . . . 3 8 1 1 . . . 4 3 2 2 1 1 . 5 2 1 1 2 1 6 6 1 1 1 1 . . 7 3 1 1 2 1 1 8 3 2 3 1 1 . 9 10 1 1 . . . 10 4 2 2 1 1 . 11 3 1 1 2 1 1 12 2 1 1 1 . . 13 3 1 1 2 1 1 14 3 2 3 1 6 . 15 10 1 1 . . . 16 4 2 2 1 1 . 17 3 1 1 2 1 1 18 1 1 1 9 . . 19 2 1 1 2 1 1 20 2 2 3 1 3 . 21 8 1 5 . . . 22 6 1 1 . . . 23 4 9 1 . . . 24 1 1 . . . . 25 2 1 . . . . 26 1 1 . . . . 27 4 . . . . . ; end; glpk-5.0/examples/pbn/cat.dat0000644000062000006210000000251613766346220015344 0ustar maomkpasswd/* cat.dat */ /*********************************************************************** * Web Paint-by-Number Puzzle #6 from . * Copyright (C) 2004 by Jan Wolter. Used by permission. * * Scardy Cat * * created by Jan Wolter * Mar 24, 2004 * * Encoded in GNU MathProg by Andrew Makhorin . ***********************************************************************/ data; param m := 20; param n := 20; param row : 1 2 3 4 := 1 2 . . . 2 2 . . . 3 1 . . . 4 1 . . . 5 1 3 . . 6 2 5 . . 7 1 7 1 1 8 1 8 2 2 9 1 9 5 . 10 2 16 . . 11 1 17 . . 12 7 11 . . 13 5 5 3 . 14 5 4 . . 15 3 3 . . 16 2 2 . . 17 2 1 . . 18 1 1 . . 19 2 2 . . 20 2 2 . . ; param col : 1 2 3 := 1 5 . . 2 5 3 . 3 2 3 4 4 1 7 2 5 8 . . 6 9 . . 7 9 . . 8 8 . . 9 7 . . 10 8 . . 11 9 . . 12 10 . . 13 13 . . 14 6 2 . 15 4 . . 16 6 . . 17 6 . . 18 5 . . 19 6 . . 20 6 . . ; end; glpk-5.0/examples/pbn/dancer.dat0000644000062000006210000000145613766346220016033 0ustar maomkpasswd/* dancer.dat */ /*********************************************************************** * Web Paint-by-Number Puzzle #1 from . * Copyright (C) 2004 by Jan Wolter. Used by permission. * * Demo Puzzle from Front Page * * created by Jan Wolter * Mar 24, 2004 * * Encoded in GNU MathProg by Andrew Makhorin . ***********************************************************************/ data; param m := 10; param n := 5; param row : 1 2 3 := 1 2 . . 2 2 1 . 3 1 1 . 4 3 . . 5 1 1 . 6 1 1 . 7 2 . . 8 1 1 . 9 1 2 . 10 2 . . ; param col : 1 2 3 := 1 2 1 . 2 2 1 3 3 7 . . 4 1 3 . 5 2 1 . ; end; glpk-5.0/examples/pbn/disney.dat0000644000062000006210000000732713766346220016075 0ustar maomkpasswd/* disney.dat */ data; param m := 50; param n := 50; param row : 1 2 3 4 5 6 7 := 1 8 . . . . . . 2 7 15 . . . . . 3 2 2 19 . . . . 4 1 2 16 1 2 . . 5 1 5 14 1 . . . 6 2 4 13 1 1 . . 7 6 12 5 . . . . 8 1 5 6 11 . . . 9 1 4 5 4 8 . . 10 1 4 1 18 . . . 11 1 5 2 11 4 . . 12 1 8 2 6 3 . . 13 1 7 1 3 2 . . 14 1 13 2 . . . . 15 1 12 1 . . . . 16 1 2 7 4 2 . . 17 2 3 4 2 . . . 18 5 4 3 1 . . . 19 8 4 3 1 . . . 20 10 3 2 1 . . . 21 12 1 1 . . . . 22 13 1 1 1 . . . 23 15 1 1 3 . . . 24 3 5 5 1 2 1 . 25 4 5 5 2 4 2 . 26 3 3 5 1 1 2 1 27 3 3 2 4 2 2 . 28 2 3 2 3 3 2 . 29 2 4 3 3 5 . . 30 2 7 4 1 4 3 . 31 3 13 1 4 5 . . 32 9 4 1 4 7 6 1 33 8 1 1 2 1 15 . 34 6 6 3 1 1 6 6 35 6 3 8 1 2 6 6 36 2 5 13 3 1 . . 37 5 1 11 3 4 . . 38 9 8 4 3 . . . 39 9 6 3 10 3 . . 40 10 5 3 2 2 3 . 41 10 6 3 2 10 . . 42 10 4 2 1 9 . . 43 11 3 2 2 4 . . 44 11 2 2 1 1 2 3 45 8 2 2 2 8 . . 46 5 1 2 2 4 4 . 47 6 2 2 2 3 4 . 48 8 2 2 2 3 3 . 49 10 2 4 3 1 5 4 50 12 7 7 4 7 . . ; param col : 1 2 3 4 5 6 7 8 9 10 := 1 14 . . . . . . . . . 2 9 15 . . . . . . . . 3 28 . . . . . . . . . 4 7 5 14 . . . . . . . 5 6 4 14 . . . . . . . 6 5 5 8 4 . . . . . . 7 7 6 8 3 . . . . . . 8 19 8 3 . . . . . . . 9 16 9 2 . . . . . . . 10 15 2 5 2 . . . . . . 11 8 3 1 3 1 . . . . . 12 4 7 2 2 3 1 . . . . 13 2 12 6 3 1 2 . . . . 14 1 1 12 1 2 . . . . . 15 1 4 9 2 1 2 . . . . 16 1 6 5 6 1 . . . . . 17 1 7 5 3 5 1 1 . . . 18 1 8 8 6 2 1 . . . . 19 2 1 7 5 9 1 . . . . 20 2 2 7 6 9 1 . . . . 21 6 15 9 2 . . . . . . 22 7 5 4 14 1 . . . . . 23 8 4 4 3 6 1 1 . . . 24 9 5 2 7 3 2 3 . . . 25 9 7 4 10 1 2 1 . . . 26 8 2 4 2 5 2 2 2 1 . 27 7 2 6 2 3 5 2 1 . . 28 7 4 4 2 5 2 2 1 . . 29 7 3 4 1 1 2 1 . . . 30 7 3 4 1 2 2 2 . . . 31 8 6 1 1 2 1 . . . . 32 6 1 3 1 2 1 2 . . . 33 4 1 3 2 2 1 2 2 . . 34 4 1 3 1 3 1 2 2 2 . 35 3 5 1 1 1 2 1 1 1 2 36 2 6 1 1 3 1 1 3 . . 37 2 5 1 5 6 1 3 . . . 38 2 6 2 6 3 2 . . . . 39 1 4 2 6 2 2 1 . . . 40 2 5 3 4 1 2 2 . . . 41 3 7 3 1 10 . . . . . 42 5 2 1 9 . . . . . . 43 3 2 2 2 6 . . . . . 44 2 1 1 2 3 2 . . . . 45 4 2 2 2 1 . . . . . 46 4 1 2 3 1 . . . . . 47 4 1 1 2 3 2 . . . . 48 6 4 6 . . . . . . . 49 3 3 5 . . . . . . . 50 3 2 3 . . . . . . . ; end; glpk-5.0/examples/pbn/dragon.dat0000644000062000006210000000324013766346220016042 0ustar maomkpasswd/* dragon.dat */ /*********************************************************************** * Hard 20x20 paint-by-numbers puzzle designed by Won Yoon Jo * from the article "Painting by Numbers" by Robert A. Bosch (2000), * . * * Encoded in GNU MathProg by Andrew Makhorin . ***********************************************************************/ data; param m := 20; param n := 20; param row : 1 2 3 4 5 := 1 7 1 . . . 2 1 1 2 . . 3 2 1 2 . . 4 1 2 2 . . 5 4 2 3 . . 6 3 1 4 . . 7 3 1 3 . . 8 2 1 4 . . 9 2 9 . . . 10 2 1 5 . . 11 2 7 . . . 12 14 . . . . 13 8 2 . . . 14 6 2 2 . . 15 2 8 1 3 . 16 1 5 5 2 . 17 1 3 2 4 1 18 3 1 2 4 1 19 1 1 3 1 3 20 2 1 1 2 . ; param col : 1 2 3 4 5 := 1 1 1 1 2 . 2 3 1 2 1 1 3 1 4 2 1 1 4 1 3 2 4 . 5 1 4 6 1 . 6 1 11 1 . . 7 5 1 6 2 . 8 14 . . . . 9 7 2 . . . 10 7 2 . . . 11 6 1 1 . . 12 9 2 . . . 13 3 1 1 1 . 14 3 1 3 . . 15 2 1 3 . . 16 2 1 5 . . 17 3 2 2 . . 18 3 3 2 . . 19 2 3 2 . . 20 2 6 . . . ; end; glpk-5.0/examples/pbn/edge.dat0000644000062000006210000000150113766346220015472 0ustar maomkpasswd/* edge.dat */ /*********************************************************************** * Web Paint-by-Number Puzzle #23 from . * Copyright (C) 2004 by Jan Wolter. Used by permission. * * Nonrepresentational Test Pattern * * created by Jan Wolter * Apr 5, 2004 * * Encoded in GNU MathProg by Andrew Makhorin . ***********************************************************************/ data; param m := 11; param n := 10; param row : 1 := 1 1 2 3 3 1 4 2 5 1 6 3 7 3 8 1 9 2 10 2 11 4 ; param col : 1 2 := 1 1 . 2 3 . 3 1 . 4 2 2 5 2 . 6 4 . 7 1 . 8 3 . 9 3 . 10 1 . ; end; glpk-5.0/examples/pbn/forever.dat0000644000062000006210000000434313766346220016245 0ustar maomkpasswd/* forever.dat */ /*********************************************************************** * Web Paint-by-Number Puzzle #6574 from . * Copyright (C) 2009 by Gator. Used by permission. * * Lasts Forever * * created by Gator * Aug 24, 2009 * * Encoded in GNU MathProg by Andrew Makhorin . ***********************************************************************/ data; param m := 25; param n := 25; param row : 1 2 3 4 5 6 7 8 := 1 1 2 2 2 2 2 1 . 2 1 2 2 2 2 2 1 1 3 1 1 . . . . . . 4 1 1 . . . . . . 5 1 3 1 . . . . . 6 1 13 1 . . . . . 7 1 13 1 . . . . . 8 1 13 1 . . . . . 9 1 4 4 1 . . . . 10 1 4 3 4 1 . . . 11 1 4 5 4 1 . . . 12 1 7 1 . . . . . 13 1 7 1 . . . . . 14 1 7 1 . . . . . 15 1 7 1 . . . . . 16 1 1 5 1 . . . . 17 1 2 6 1 . . . . 18 1 4 6 1 . . . . 19 1 6 6 1 . . . . 20 1 3 1 . . . . . 21 1 1 1 . . . . . 22 1 1 . . . . . . 23 1 1 . . . . . . 24 1 1 2 2 2 2 2 1 25 1 2 2 2 2 2 1 . ; param col : 1 2 3 4 5 6 7 8 := 1 1 2 2 2 2 2 1 . 2 1 1 2 2 2 2 2 1 3 1 1 . . . . . . 4 1 1 . . . . . . 5 1 1 . . . . . . 6 1 2 1 . . . . . 7 1 6 1 1 . . . . 8 1 6 2 1 . . . . 9 1 6 3 1 . . . . 10 1 4 8 1 . . . . 11 1 3 5 2 1 . . . 12 1 4 8 2 1 . . . 13 1 4 9 2 1 . . . 14 1 4 11 1 . . . . 15 1 3 9 1 . . . . 16 1 4 8 1 . . . . 17 1 6 3 1 . . . . 18 1 6 2 1 . . . . 19 1 6 1 1 . . . . 20 1 2 1 . . . . . 21 1 1 . . . . . . 22 1 1 . . . . . . 23 1 1 . . . . . . 24 1 2 2 2 2 2 1 1 25 1 2 2 2 2 2 1 . ; end; glpk-5.0/examples/pbn/knot.dat0000644000062000006210000000553313766346220015552 0ustar maomkpasswd/* knot.dat */ /*********************************************************************** * Web Paint-by-Number Puzzle #16 from . * Copyright (C) 2004 by Jan Wolter. Used by permission. * * Probably Not * * created by Jan Wolter * Mar 27, 2004 * * Encoded in GNU MathProg by Andrew Makhorin . ***********************************************************************/ data; param m := 34; param n := 34; param row : 1 2 3 4 5 6 7 8 := 1 1 1 . . . . . . 2 2 2 . . . . . . 3 3 3 . . . . . . 4 2 1 1 2 . . . . 5 2 1 1 2 . . . . 6 1 1 1 1 . . . . 7 1 1 1 1 . . . . 8 18 . . . . . . . 9 2 1 1 1 1 2 . . 10 1 1 1 1 1 1 . . 11 1 1 1 1 1 1 . . 12 26 . . . . . . . 13 2 1 1 1 1 1 1 2 14 2 1 1 2 2 1 1 2 15 2 1 1 2 2 1 1 2 16 14 14 . . . . . . 17 1 1 1 1 . . . . 18 1 1 1 1 . . . . 19 14 14 . . . . . . 20 2 1 1 2 2 1 1 2 21 2 1 1 2 2 1 1 2 22 2 1 1 1 1 1 1 2 23 26 . . . . . . . 24 1 1 1 1 1 1 . . 25 1 1 1 1 1 1 . . 26 2 1 1 1 1 2 . . 27 18 . . . . . . . 28 1 1 1 1 . . . . 29 1 1 1 1 . . . . 30 2 1 1 2 . . . . 31 2 1 1 2 . . . . 32 3 3 . . . . . . 33 2 2 . . . . . . 34 1 1 . . . . . . ; param col : 1 2 3 4 5 6 7 8 := 1 1 1 . . . . . . 2 2 2 . . . . . . 3 3 3 . . . . . . 4 2 1 1 2 . . . . 5 2 1 1 2 . . . . 6 1 1 1 1 . . . . 7 1 1 1 1 . . . . 8 18 . . . . . . . 9 2 1 1 1 1 2 . . 10 1 1 1 1 1 1 . . 11 1 1 1 1 1 1 . . 12 26 . . . . . . . 13 2 1 1 1 1 1 1 2 14 2 1 1 2 2 1 1 2 15 2 1 1 2 2 1 1 2 16 14 14 . . . . . . 17 1 1 1 1 . . . . 18 1 1 1 1 . . . . 19 14 14 . . . . . . 20 2 1 1 2 2 1 1 2 21 2 1 1 2 2 1 1 2 22 2 1 1 1 1 1 1 2 23 26 . . . . . . . 24 1 1 1 1 1 1 . . 25 1 1 1 1 1 1 . . 26 2 1 1 1 1 2 . . 27 18 . . . . . . . 28 1 1 1 1 . . . . 29 1 1 1 1 . . . . 30 2 1 1 2 . . . . 31 2 1 1 2 . . . . 32 3 3 . . . . . . 33 2 2 . . . . . . 34 1 1 . . . . . . ; end; glpk-5.0/examples/pbn/light.dat0000644000062000006210000000546513766346220015712 0ustar maomkpasswd/* light.dat */ /*********************************************************************** * Web Paint-by-Number Puzzle #803 from . * Copyright (C) 2007 by Robert Kummerfeldt. Used by permission. * * You light up my life * * created by Robert Kummerfeldt * Mar 15, 2007 * * Encoded in GNU MathProg by Andrew Makhorin . ***********************************************************************/ data; param m := 45; param n := 50; param row : 1 2 3 4 := 1 . . . . 2 1 . . . 3 1 . . . 4 3 . . . 5 2 2 . . 6 1 1 . . 7 7 . . . 8 1 1 . . 9 1 3 1 . 10 1 3 1 . 11 1 1 . . 12 11 . . . 13 1 1 . . 14 1 1 . . 15 2 2 . . 16 1 1 . . 17 1 1 . . 18 1 1 . . 19 1 1 . . 20 2 2 . . 21 1 1 . . 22 1 1 . . 23 1 1 . . 24 1 1 . . 25 1 1 . . 26 1 1 . . 27 1 1 . . 28 1 1 . . 29 1 1 . . 30 1 1 . . 31 2 2 . . 32 1 1 . . 33 1 1 . . 34 1 1 . . 35 1 1 . . 36 1 1 . . 37 1 4 1 . 38 1 1 1 1 39 1 1 1 1 40 1 1 1 1 41 1 1 1 1 42 25 . . . 43 6 5 . . 44 5 6 . . 45 4 5 . . ; param col : 1 2 3 4 5 := 1 1 . . . . 2 1 . . . . 3 1 . . . . 4 2 . . . . 5 1 . . . . 6 1 . . . . 7 1 . . . . 8 2 . . . . 9 1 . . . . 10 1 . . . . 11 1 . . . . 12 1 . . . . 13 2 . . . . 14 1 . . . . 15 1 . . . . 16 1 . . . . 17 5 . . . . 18 7 1 . . . 19 6 1 . . . 20 6 1 . . . 21 1 6 1 . . 22 4 1 . . . 23 7 1 . . . 24 1 1 1 1 . 25 2 1 2 1 1 26 3 1 2 1 1 27 2 1 2 1 1 28 1 1 1 1 . 29 7 6 . . . 30 4 1 1 . . 31 1 6 1 1 . 32 6 6 . . . 33 6 1 . . . 34 5 1 . . . 35 7 . . . . 36 1 . . . . 37 2 . . . . 38 1 . . . . 39 1 . . . . 40 1 . . . . 41 2 . . . . 42 1 . . . . 43 1 . . . . 44 1 . . . . 45 1 . . . . 46 2 . . . . 47 1 . . . . 48 1 . . . . 49 1 . . . . 50 1 . . . . ; end; glpk-5.0/examples/pbn/mum.dat0000644000062000006210000000714713766346220015400 0ustar maomkpasswd/* mum.dat */ /*********************************************************************** * Web Paint-by-Number Puzzle #65 from . * Copyright (C) 2004 by Jan Wolter. Used by permission. * * Mum's the Word [has only one solution] * * created by Jan Wolter * Jul 10, 2004 * * Encoded in GNU MathProg by Andrew Makhorin . ***********************************************************************/ data; param m := 40; param n := 34; param row : 1 2 3 4 5 6 7 8 9 := 1 12 . . . . . . . . 2 5 2 5 . . . . . . 3 5 2 2 5 . . . . . 4 1 2 2 2 2 2 1 . . 5 4 2 2 4 2 2 4 . . 6 4 2 2 4 2 2 4 . . 7 1 2 2 2 2 2 1 . . 8 6 2 2 2 2 2 6 . . 9 6 2 2 2 2 2 6 . . 10 1 14 1 . . . . . . 11 10 10 . . . . . . . 12 8 3 3 8 . . . . . 13 1 1 2 1 1 2 1 1 . 14 9 2 2 2 2 9 . . . 15 9 9 . . . . . . . 16 1 1 1 1 1 1 . . . 17 12 2 12 . . . . . . 18 12 12 . . . . . . . 19 1 1 4 1 1 . . . . 20 14 14 . . . . . . . 21 12 12 . . . . . . . 22 2 1 4 1 2 . . . . 23 9 4 9 . . . . . . 24 1 7 4 7 1 . . . . 25 1 1 1 4 1 1 1 . . 26 1 7 4 7 1 . . . . 27 1 7 4 7 1 . . . . 28 1 2 1 2 1 2 1 . . 29 1 7 2 7 1 . . . . 30 1 1 6 2 6 1 1 . . 31 1 1 1 1 2 1 1 1 1 32 1 1 6 2 6 1 1 . . 33 1 1 5 5 1 1 . . . 34 1 1 1 8 1 1 1 . . 35 1 1 4 4 1 1 . . . 36 1 2 6 2 1 . . . . 37 2 4 4 2 . . . . . 38 2 6 2 . . . . . . 39 4 4 . . . . . . . 40 6 . . . . . . . . ; param col : 1 2 3 4 5 6 7 8 9 10 11 12 := 1 5 . . . . . . . . . . . 2 3 2 1 . . . . . . . . . 3 3 2 2 1 . . . . . . . . 4 3 2 2 2 2 . . . . . . . 5 3 2 2 2 2 3 . . . . . . 6 1 2 2 2 2 2 16 . . . . . 7 1 2 2 2 2 2 2 1 2 . . . 8 1 2 2 2 2 2 2 13 1 . . . 9 3 2 2 2 2 2 2 4 1 1 . . 10 6 5 2 2 2 2 6 1 1 . . . 11 1 7 3 2 2 2 2 2 1 1 1 . 12 3 4 1 2 2 2 2 2 2 1 1 1 13 6 1 2 3 2 2 2 2 1 1 1 . 14 1 7 2 16 1 1 . . . . . . 15 1 4 1 1 1 1 1 1 1 1 1 . 16 1 2 1 3 1 1 6 1 1 1 1 . 17 2 7 1 1 11 1 1 1 1 . . . 18 2 7 1 1 11 1 1 1 1 . . . 19 1 2 1 3 1 1 6 1 1 1 1 . 20 1 4 1 1 1 1 1 1 1 1 1 . 21 1 7 2 16 1 1 . . . . . . 22 6 1 2 3 2 2 2 2 1 1 1 . 23 3 4 1 2 2 2 2 2 2 1 1 1 24 1 7 3 2 2 2 2 2 1 1 1 . 25 6 5 2 2 2 2 6 1 1 . . . 26 3 2 2 2 2 2 2 4 1 1 . . 27 1 2 2 2 2 2 2 13 1 . . . 28 1 2 2 2 2 2 2 1 2 . . . 29 1 2 2 2 2 2 16 . . . . . 30 3 2 2 2 2 3 . . . . . . 31 3 2 2 2 2 . . . . . . . 32 3 2 2 1 . . . . . . . . 33 3 2 1 . . . . . . . . . 34 5 . . . . . . . . . . . ; end; glpk-5.0/examples/pbn/pbn.mod0000644000062000006210000002230013766346220015354 0ustar maomkpasswd/* PBN, Paint-By-Numbers Puzzle */ /* Written in GNU MathProg by Andrew Makhorin */ /* NOTE: See also the document "Solving Paint-By-Numbers Puzzles with GLPK", which is included in the GLPK distribution. */ /* A paint-by-numbers puzzle consists of an m*n grid of pixels (the canvas) together with m+n cluster-size sequences, one for each row and column. The goal is to paint the canvas with a picture that satisfies the following constraints: 1. Each pixel must be blank or white. 2. If a row or column has cluster-size sequence s1, s2, ..., sk, then it must contain k clusters of black pixels - the first with s1 black pixels, the second with s2 black pixels, and so on. It should be noted that "first" means "leftmost" for rows and "topmost" for columns, and that rows and columns need not begin or end with black pixels. Example: 1 1 1 1 2 1 1 1 1 1 2 3 3 2 1 2 1 2 3 4 8 9 3 6 # # # . # # # # # # 1 4 # . . . . . # # # # 1 1 3 . . # . # . . # # # 2 . . . . . . . . # # 3 3 . . # # # . . # # # 1 4 # . . . . . # # # # 2 5 # # . . . # # # # # 2 5 # # . . . # # # # # 1 1 . . . # . . . . . # 3 . . # # # . . . . . (In Russia such puzzles are known as "Japanese crosswords".) References: Robert A. Bosch, "Painting by Numbers", 2000. */ /*--------------------------------------------------------------------*/ /* Main part based on the formulation proposed by Robert Bosch. */ param m, integer, >= 1; /* the number of rows */ param n, integer, >= 1; /* the number of columns */ param row{i in 1..m, 1..(n+1) div 2}, integer, >= 0, default 0; /* the cluster-size sequence for row i (raw data) */ param col{j in 1..n, 1..(m+1) div 2}, integer, >= 0, default 0; /* the cluster-size sequence for column j (raw data) */ param kr{i in 1..m} := sum{t in 1..(n+1) div 2: row[i,t] > 0} 1; /* the number of clusters in row i */ param kc{j in 1..n} := sum{t in 1..(m+1) div 2: col[j,t] > 0} 1; /* the number of clusters in column j */ param sr{i in 1..m, t in 1..kr[i]} := row[i,t], integer, >= 1; /* the cluster-size sequence for row i */ param sc{j in 1..n, t in 1..kc[j]} := col[j,t], integer, >= 1; /* the cluster-size sequence for column j */ check{i in 1..m}: sum{t in 1..kr[i]} sr[i,t] <= n - (kr[i] - 1); /* check that the sum of the cluster sizes in each row is valid */ check{j in 1..n}: sum{t in 1..kc[j]} sc[j,t] <= m - (kc[j] - 1); /* check that the sum of the cluster sizes in each column is valid */ check: sum{i in 1..m, t in 1..kr[i]} sr[i,t] = sum{j in 1..n, t in 1..kc[j]} sc[j,t]; /* check that the sum of the cluster sizes in all rows is equal to the sum of the cluster sizes in all columns */ param er{i in 1..m, t in 1..kr[i]} := if t = 1 then 1 else er[i,t-1] + sr[i,t-1] + 1; /* the smallest value of j such that row i's t-th cluster can be placed in row i with its leftmost pixel occupying pixel j */ param lr{i in 1..m, t in 1..kr[i]} := if t = kr[i] then n + 1 - sr[i,t] else lr[i,t+1] - sr[i,t] - 1; /* the largest value of j such that row i's t-th cluster can be placed in row i with its leftmost pixel occupying pixel j */ param ec{j in 1..n, t in 1..kc[j]} := if t = 1 then 1 else ec[j,t-1] + sc[j,t-1] + 1; /* the smallest value of i such that column j's t-th cluster can be placed in column j with its topmost pixel occupying pixel i */ param lc{j in 1..n, t in 1..kc[j]} := if t = kc[j] then m + 1 - sc[j,t] else lc[j,t+1] - sc[j,t] - 1; /* the largest value of i such that column j's t-th cluster can be placed in column j with its topmost pixel occupying pixel i */ var z{i in 1..m, j in 1..n}, binary; /* z[i,j] = 1, if row i's j-th pixel is painted black z[i,j] = 0, if row i's j-th pixel is painted white */ var y{i in 1..m, t in 1..kr[i], j in er[i,t]..lr[i,t]}, binary; /* y[i,t,j] = 1, if row i's t-th cluster is placed in row i with its leftmost pixel occupying pixel j y[i,t,j] = 0, if not */ var x{j in 1..n, t in 1..kc[j], i in ec[j,t]..lc[j,t]}, binary; /* x[j,t,i] = 1, if column j's t-th cluster is placed in column j with its topmost pixel occupying pixel i x[j,t,i] = 0, if not */ s.t. fa{i in 1..m, t in 1..kr[i]}: sum{j in er[i,t]..lr[i,t]} y[i,t,j] = 1; /* row i's t-th cluster must appear in row i exactly once */ s.t. fb{i in 1..m, t in 1..kr[i]-1, j in er[i,t]..lr[i,t]}: y[i,t,j] <= sum{jp in j+sr[i,t]+1..lr[i,t+1]} y[i,t+1,jp]; /* row i's (t+1)-th cluster must be placed to the right of its t-th cluster */ s.t. fc{j in 1..n, t in 1..kc[j]}: sum{i in ec[j,t]..lc[j,t]} x[j,t,i] = 1; /* column j's t-th cluster must appear in column j exactly once */ s.t. fd{j in 1..n, t in 1..kc[j]-1, i in ec[j,t]..lc[j,t]}: x[j,t,i] <= sum{ip in i+sc[j,t]+1..lc[j,t+1]} x[j,t+1,ip]; /* column j's (t+1)-th cluster must be placed below its t-th cluster */ s.t. fe{i in 1..m, j in 1..n}: z[i,j] <= sum{t in 1..kr[i], jp in er[i,t]..lr[i,t]: j-sr[i,t]+1 <= jp and jp <= j} y[i,t,jp]; /* the double coverage constraint stating that if row i's j-th pixel is painted black, then at least one of row i's clusters must be placed in such a way that it covers row i's j-th pixel */ s.t. ff{i in 1..m, j in 1..n}: z[i,j] <= sum{t in 1..kc[j], ip in ec[j,t]..lc[j,t]: i-sc[j,t]+1 <= ip and ip <= i} x[j,t,ip]; /* the double coverage constraint making sure that if row i's j-th pixel is painted black, then at least one of column j's clusters covers it */ s.t. fg{i in 1..m, j in 1..n, t in 1..kr[i], jp in er[i,t]..lr[i,t]: j-sr[i,t]+1 <= jp and jp <= j}: z[i,j] >= y[i,t,jp]; /* the constraint to prevent white pixels from being covered by the row clusters */ s.t. fh{i in 1..m, j in 1..n, t in 1..kc[j], ip in ec[j,t]..lc[j,t]: i-sc[j,t]+1 <= ip and ip <= i}: z[i,j] >= x[j,t,ip]; /* the constraint to prevent white pixels from being covered by the column clusters */ /* this is a feasibility problem, so no objective is needed */ /*--------------------------------------------------------------------*/ /* The following part is used only to check for multiple solutions. */ param zz{i in 1..m, j in 1..n}, binary, default 0; /* zz[i,j] is z[i,j] for a previously found solution */ s.t. fz{1..1 : sum{i in 1..m, j in 1..n} zz[i,j] > 0}: sum{i in 1..m, j in 1..n} (if zz[i,j] then (1 - z[i,j]) else z[i,j]) >= 1; /* the constraint to forbid finding a solution, which is identical to the previously found one; this constraint is included in the model only if the previously found solution specified by the parameter zz is provided in the data section */ solve; /*--------------------------------------------------------------------*/ /* Print solution to the standard output. */ for {i in 1..m} { printf{j in 1..n} " %s", if z[i,j] then "#" else "."; printf "\n"; } /*--------------------------------------------------------------------*/ /* Write solution to a text file in PostScript format. */ param ps, symbolic, default "solution.ps"; printf "%%!PS-Adobe-3.0\n" > ps; printf "%%%%Creator: GLPK (pbn.mod)\n" >> ps; printf "%%%%BoundingBox: 0 0 %d %d\n", 6 * (n + 2), 6 * (m + 2) >> ps; printf "%%%%EndComments\n" >> ps; printf "<> setpagedevice\n", 6 * (n + 2), 6 * (m + 2) >> ps; printf "0.1 setlinewidth\n" >> ps; printf "/A { 2 copy 2 copy 2 copy newpath moveto exch 6 add exch line" & "to\n" >> ps; printf "exch 6 add exch 6 add lineto 6 add lineto closepath } bind de" & "f\n" >> ps; printf "/W { A stroke } def\n" >> ps; printf "/B { A fill } def\n" >> ps; printf {i in 1..m, j in 1..n} "%d %d %s\n", (j - 1) * 6 + 6, (m - i) * 6 + 6, if z[i,j] then "B" else "W" >> ps; printf "%%%%EOF\n" >> ps; printf "Solution has been written to file %s\n", ps; /*--------------------------------------------------------------------*/ /* Write solution to a text file in the form of MathProg data section, which can be used later to check for multiple solutions. */ param dat, symbolic, default "solution.dat"; printf "data;\n" > dat; printf "\n" >> dat; printf "param zz :" >> dat; printf {j in 1..n} " %d", j >> dat; printf " :=\n" >> dat; for {i in 1..m} { printf " %2d", i >> dat; printf {j in 1..n} " %s", if z[i,j] then "1" else "." >> dat; printf "\n" >> dat; } printf ";\n" >> dat; printf "\n" >> dat; printf "end;\n" >> dat; printf "Solution has also been written to file %s\n", dat; /*--------------------------------------------------------------------*/ /* The following data correspond to the example above. */ data; param m := 10; param n := 10; param row : 1 2 3 := 1 3 6 . 2 1 4 . 3 1 1 3 4 2 . . 5 3 3 . 6 1 4 . 7 2 5 . 8 2 5 . 9 1 1 . 10 3 . . ; param col : 1 2 3 4 := 1 2 3 . . 2 1 2 . . 3 1 1 1 1 4 1 2 . . 5 1 1 1 1 6 1 2 . . 7 2 3 . . 8 3 4 . . 9 8 . . . 10 9 . . . ; end; glpk-5.0/examples/pbn/pbn.pdf0000666000062000006210000012514413766346220015364 0ustar maomkpasswd%PDF-1.5 %äðíø 18 0 obj <> stream xÚåXÝoÛ6ß_Aì‰Â*Ž_¢¤a¶ÝÐ}¡EýV÷Aµ[ˆ,¥–Ü´ÁþøÝñ(ÅŽÙ4Íö2  #yÇûݧNfï˜bþË5üK¶Ú±§ öíÏŠ©\h•±Ås¥0†¥Jia ¶X¿æ¯úö}Óm’ÔHÅ_$:ãUÓ%Úñ1}ú1ýó°Cúm’ÂA½M󇛛¶‹ëfÜõËï/~KÞ,~š)%ÊÌëÌ3¡0£¼ÆŸºõ¾¾¸øêrÛïA!‰™#±@k°E¾ßUý›î úý懈ŠÔJá –j+¬#%‡ÍaI‰–J!Ë”y@HYP‘ƒ°C§ ”JÐ5–?ï#ù¸ïÑ0¾>¬Æ¦Ÿ0f¬¥3xƒRFHÍÀ>ĉÅ1%E)KÒBL©.E°¶üˆ ¢&k¯’LaÆôíÇ´;ìÞâ~{¾ R>(ØI¾ê»¡FŒS¼¿ g5™P+–Zè2ܱ å)2­ÂùRJ»C‰‰£‹€ÊN6ûfM'TW͇º H—|ÜÖï¥È‹pÃÊ{§{_ÅüaÔmÒ,Ïš ²BA ŒÀl“±ßÔ hŸ@Þ„>7 JÅê;~q§~ÉÂñ7qŸØ»NÉORÚɤrµÞ§Cs´Zñ¡N2ÉßêΛ[Q·j!M¸â ÊS»šŒºè½u†×Õ*Ñ9ßâJqÈhX\OÕ­‰Xõía× r—–PÇÞZlñNeø¦¯Z¢šžcO˯|ÏÈùˆKíƒè÷W•ß~ŸdŽWA†úRUnVãatŒÛj$j¨ÆfXJeëøÆ ÇEß¶d6.-ñbòû ÑðçPN”Á*Kµ*à2kù3ôCÿ£)‘4s§+쀯â­ºK"ÑÍÆX~½mÆZœƒÑ ÆYÉŸc¶—ÚŒŒƒÃ8˜2§;`“€tÉ·è.¿y’x4Ô>/êHÒico‹uÊ%Y.ÊÏ3¡°„³ŸìWVäÐ…'Ž'%9ö±‡ªÐPᣠ~R.?y¸¨zè£îL¿:ÓŸÓëí2¢?ÃV;s<™³«#7cèªð¯‡Û`¥Di0Ï|†UM¬¯:'Š©¾/ãMÑèÓú÷·Ôá YæK÷’ÔQŸüËWciì ‹ýTSE!2}o°ôgò¡Ä3sD1¡e9·îTç¥(NZÈPƒ³ÖT1Ÿj·RÈ–V…0yéT؈‹µš° }¨â©ùeN¸“WÅó ò¶?´k¤åm/Àƒ®ë5‘Ô»c¹ ÑùšNvuÕ D.—m}1îúùÌwj =ùò’0’ÀØ_¿‡xÔÉ¢¿À@µPÿðFæ“‘°M° Ý ÕÌähÑÕuØˈönšŽÖ“¾š.ȧYg¯ŸuBŠ€˜B«"|º QÏ>T»«¶Ž•L®„qpg.òlž×r­Câ¢:‰Uw~„“¡¶Ççú²RÈö¹Gà4ç:Ì ƒºg8->4/hU†>c…ÄÙUá®Íà…é&W™ã¦Žüv³”ÝegÊ ef*vj?s™eIû©—ªý"¨fVg"Pc§€jÉ«w fbCL23bA|¿s̓]A ³Ó`$®{1>Ô«±Ó/Ms;ï$Àýî´ÿ¶;ÿC¹zUÔì‘àá!þ_A  ™«±?&=Rúæ‘¥ÿåõ·µ?[°wLÀDÌ®Yf4Ó¬ÐB9¶c œqóFË^±—áÇ& £Z‰£µµA¦ùÝ>»>ƒi­t޾à†ÔL,‹-~\«qhô?»øm§W5øù¶èÈÐw!» †è¿Qñøbßïhÿµz#b㎜ʿ­9‚v¿üêo¤M€û endstream endobj 24 0 obj <> stream xÚ•VKoÛ8¾ï¯Ð‘"V¤(JJ±—Ûû(²Xï)ɱäX¨$zõh6ýõáP~Ê­ƒàpøÍpßPþ DÁŸR ÿQ°j‚ËàÝGÅc¥ƒå:Hbž¡Îxª‚eqÏä"B*ö­¿Víó"ŒÓ„Z¶ã·ou¹x\þNt "žG9:‰‚P‚ÇÄyXnJ€‹ˆÝ-dÊLÕ.dƆðÃkøylP~Z„pPv=Á¼W'¯LKb2æµkÛ¡fcm†²]”3ã­ -Q(HÀë4Êç²#àº4}õTÕՀἺè!^ó„âÝvö©.¾•R>ú8ö—¦îÒʶ¤{w?H•×|úóî”{qébX±D§[—‚=±Pì^µ¼±ÅÌ©ˆƒ9d’Ä dâ¢ÔjòrÌ&]Õ®ê±pqh¬®²óÌUQõCW=>yÐP&¢Í~ a³¶cëÉ@QéÞ4çEÕAYm÷:—zšð,ó9•ÿ›f µ|%˜IŸ(¹KŸˆ(S®ÓÃË—n‚ Í:s„ì.ikpÉÙÖtCµ‚¡îH=½>xF¤¦©#ɶõ+ImY½ÇYï«+·nJŽŒíæÅìy˜Ž’¹(±‰-’I‰ê¸‰È(¹›q¥ñH}ø@'DìCƒ£qI‰¾“ùÙ¸øú#"Þ—äug’üµ 3ÿZÙ±'õÁ%0Tß,𬦠³_謮¾LA¿¶†sØ¿ô„~`îe›áI¬&¢43ìI*üwåÁcy˜â0=î­{Ù¾Ft`×ôHw>°zÎM[Ì…%dÄÕDÊ9ÒæõóV¶›¶XÜNw§AÆsí¾Û@þœ§8y)ÏòÝ{÷~ê«<ô¢˜Î@ÿø¨»%a·¿Ò*¢#¸<…·oƒwöÅx<ü”ˆà»"ýûü¡™aËB,–v®~•ÀnÂi¿òWwPé¡Óê24>Š]4P¢‡òP¹óvÑkrk|ª¯5= ¹ Í®‡æ*0`Et˜Ï!6<ëÙ ¾Šê"3’#fȳj_Í+zz‰)ûõÌD½ý–äí·è·ß’¾½bÙ ¥ÕÏM&fegГä˜aùm®bZÙï義æpùô0JúmüýËwžY$Ý endstream endobj 27 0 obj <> stream xÚ­XÝ“œÈ Ï_1LՂ馡!ow—s²‰}µ)Ï=ÝÞ;0»”Ó௿>RKÍ€—;•ÔnU õ—¤–~’f÷a'v1ü‰–ðïŽÝîçÃîÕël'⨈‹Ýá´Óq¤“]˜å‘V»CõGð¦÷¡Ô2Ÿj$DP•cI,[ÇÆôÄ>™¸Ó ìhTuKß³ïâªÓ`:¢®8b,ñ:RÅ[þº#ÞЋ° š#gûvòH%£lå‘/Ë#òH¤ÿU\€8I‘ãPö¶-GxÕ0kxS†Æ²§±ñ®Ý—-rR°ìy¨-»|‰*ð¡ÎypÏüZ–v òN·4äJ58hjGRÇA "ðV¥~Ä’YœêÒ6MÛŒxðZuÌC[w—X§7gg×­÷S:J¼).õÜd©Š”_7Öm»éüRFê»Î&RE²X! ºa_?Ÿ˜ØÐµðºâ 1ŸPÒðËo¯‰e‹îR®¶çñr{LÅW’â¥|€qßàØ[0Ô;Dü˜t Dû#ù“—FFÿü4ߌ‘»CdQ‘,ï¹=ÁÃjl›8 à s£  <§q<•–˜. kyäŸÌÔWq uCqQË›¾jŽ`îÊï%¾ _ÔÜg¥w?nß½¾ýéç7¿n8A&£âGé ¬¼ £y”ç{ŒUüRJ¨¥áËGšNXË¡"¶™Æó4z@•ßÄæ=F=„HÙÞïoè…? Afˆ‘FzõäJÉ"’ KîŒÎvËPb­ÄºÀ]à½ðÊØñÝqhΣϰCWŽ7´’‰ÖV«H£|'¼R’’=W^ÓAÃ~ý­ Ûp«ÁéRé# nDy‰eN4¾-ǧ»Á<Ò¥¤8= j?.ÙÔR)úÞB­#¶,ÒEUdÊQˆ3‘=`¤ë#:Ò{ÚLÌu8‡Ð|võLy­-JÃûŸˆß×G ‘á m¼¿œQÕcÙtº[×Ï‘†Ì’fpÈç‘(Vû~¨ž Fuœ¸ˆà:ñ&ÿý·ë±¨ó(ñ.ÖÕ€Àx|Êp‘¤ú"Ô\ˆCé9ô¼‚óÞ̸Hn±v¿Û©lÛ/h<.Ñtž*©ÎêɼÎ%ãt¦À.‰;‹´s$˜rÕMV\Jq››¯LÝÓ™ïáƒÓ˜Æ Tû ÿHlΔ‡íÔõö~OŸ÷)H34Jª*ŸpÆÖœ°`T蘾r~sêâUz^UU§KèEð’ ݳv•(Vp8-BØ3o2\~·åð¸ªá-}t%#>f¥¡þ05/#o÷å#NwÆÏá ½ð¤ã`ÞkíäÌ6Ç}ý¹ì\(!û"bPl§ ç0¤ Á2RUcÇ¡y˜Â^Š`EvX€ÄŒ•SÏýЇV;ÑŠ ,q ÄðVteI¤3ŽÖþ‚êw ¿¡g”s Fój' Lµ ²b™Íñ‹p5uY ¿ÝÁÈø¬öÁPJDpØç2p°Ÿ ìg+ØOüð(*Bá2~jtŸ »D&íS¼Í¬;ÐNu˜¬?CÇßôΊÈ&·3ÜcÎg8¿ÔjqÖPlÌdùÕ}ÇäÎè«y1³.mø ™æjÉÿ/ùŠùB"|ö{À-zBŠå*Ö´HK»™ÓôG*Jw~̘ë—ñLWI¤P—WUƒâ9„>ÿè“‹}Òù}¥,T$~°~Zbwû £L¾ÔíCá †ÚÑ1XÅ‚K^ ¼ aàá7àŠå,È –à7(Ei͈x.š7-M;á¾p#" £cÐÀeA`ôM «_ â…!Ý*C#àÞCãDÌI¡mAW]´¨óa•=Ð\Xݾ•úšÕãêdþEO- Oé~¨ˆ]ŽcݱáÀ/ú9M±|¼¢7pÕ@ç]ª!Èå©oÎÕµ2neËï–qëzï»ggV3NCkó@ ¾à^â"Cû†íSÓâ/Bºr‘ŽçjÑw^H̰'™‘YÒ@¨Îy[»Ô·R–èÚîœÌ—‰ÙõâRéÜ\~§ …’!_k•)¯U–y­./ M I+ 8lC‹¨X©ÒÖ¥åÎlœ‹7C0[¡s&Mé·b.•+±44€ïÂÿôœ8ö¯‡Ý¿ÿòc1 l endstream endobj 30 0 obj <> stream xÚ•koÛFìû~…Ñ/“‡ø¬“N¯¢mÖ® ²ÖÅ>Ô*Ûçø=\=–8öÛG)Kn´C‚ˆÇãñø&/“o9qáGN"~ÝÉ:Ÿ\,&ó7j"•ðU8Yl'/âÉ,ŒE¤&‹ÍgGMgRzÊùXfmcÊb:ó£ÀiL®ëé—Å;8N¤+7ÁÓîdæ«À]ìôt¦×iÒUfAÏA*NC{Ò)ôcCÐ>½c\½+§^ä<Ôt¼>^mOÚ«O˜¥|,Í÷YÇB3×rÛ_ˆò‚„ÒI¸OM75³ÕԋìÀO›ãßÕt;º‚»|ÏwöíÓS¦íB9ÛªÌ Ý±¿‘C;È0RÁexË«½Ú¯ ±.ó_Gly ˜ô¥Ñ«Ú4Z€ÜÊ#– S@õX[ ?êdY¤xÆ÷œ¶Ö„|Ç ç|E†GDÝVÙÛDúY}aŠ’@Ü}Z1µ^º2\]¬D…vµ¦nLqG«Û‹ÚŸ÷ªVRŠÄʹèIÛfWZ3ÂØâùœ·{àïûª7 ê„^G`—âå$©wghUÐrÞAºÜÔ5†–5æ3·et‰cA¯—h+ür°Ðb[i®ôìS™UÛ '•òÙ¬D«!÷cuB ¬Ì)ÒŒ4Ä “ó$„ÓÙÆ1¸k àèÎÆ4¡ë&mt®‹Ê:J7zƒ¡æ»ÎÛÑ ‹å-ãj{ô¼'O«û©: å3WV0¸$e0g#:7º2õ=­–Î/Ë)ˆ‡!— DºRÙ‹p±.IØF›Š8pó:mv·UyG«MÚ¤DPë5ZY 7ŸÉÆŠ)7ìÃ…U S¬³vƒÎ£~#¾Wïo'èèh*U@d}ƒ[k«5+ ;Zl˶èÙ>“¬n)ª6¦5Êê0VhB_È®xèG› õŠÍHÁšî3©à€‡ºŸÃKÏ3 :0]Õ¢Ù<0Õ$ëgÀï¹,‚1sÑ@úâD@£- Ϲå„EÕÒ(ú,ËÛOtÚ¿úíé í8ÞÕsÜÙ‡ókŒ‹ñìjâ £”CU°V‚â¯!6ÑJFö6%ÁŒUÉíj‰Dc¤M1ŠŒMðÔ8µ…ùÖòÞ`¼‚UYÑ·ó5R§Ei…xî‘ÁQŸÅëÊ2Äzïn¢‹“ Ñ]É娯 »áÓp!¸ð~ÇOŠœ/~^׫´¨3è}XHxÞD o¸ÊK£›®dQ7… ê!õ= x^Äc‘k›Ù«+êÙ°sýö–¶*½¯ôlÄtÜ’muÁ8õ¤½:éUÇ•ÏeÕŵ 7KÞëÕíÏàÎ$luZ›•ÉLs,1tø|Äz<¦\`oÞð€âÖ)³ ™•à|>)€³‹Èrþ ·ÐKŠõèó!*¾ >K˜I×u>”Ü9+ðÎ}/ÊšrïŒÖË¥í:v®Ç¶Ó ¦Çr ¢Þ´6%þ >ë¹®+Ƨy‘DCó¼Ú5Íþå|þðð Ê•®2S½içç]ómº†t?ÌW Û›ñ Ÿ6b×äÙØü" Ÿ6f_%Ø×gž'Lá±)pàx )å%Îõ1z­žˆzŸw­}Háêêæñ1êÅÕÑ%}_;ÑvÉ/Šl–‚ÕÖ­)C;RÂ{°Ûî‡%ZÑ—“/âaÉ‹¾–pS/¢a ~¨† KÏÕÝk†ä‡ÃT÷¸3ô¦\øBFW,§Ý”ä ×'gHr†Ïθ1÷™,弯 Zºž?Å9WcRã8$ù¸”Q4UIeVu]Q a{^0—ÇvŒ¼í‘óiì;‹õdÌ€|ær—f9¾OGö©0Ý ó4¦à÷ï¶Å4!mÃÚeVÞ¦P¤9>ÒÌ·ÑÅ¿äC(T×»\Èa0‡ò j=‹r5uåÐ9­Ôƒ(WlØw);öO”³Ì ¶žQö.—O^®½J'™?£ŒŸÝœ¾æ™’[£ÕÕ6´…àfÿñY?ÇÇ´>Œ+(~§8Zo–„ ø,ˆ}½˜üñÓ?*²ê endstream endobj 33 0 obj <> stream xÚÍXKoÛF¾÷W(P¬Šj³³ï-z²£h¬ uKs $Z&D‰IÙ¨}w¸Ëšz¹Ña"‡»Ão¾yr“o $ÌÿAb¸ÿgÉ|œM“w—:FsÉô&±†:—Œ€jžL_ÈtdIgE6 Á ü>K©ÈuYl›¼Ü T&_g5^JòŸè6 uº¾ »%©³&Ë›ð{·}|,º­7U¹â/òëèëô¯äý4ù–PálòCBãþ7Y'ÂZªMw_$×ÉçCs€9ªÁ/†‚míùÔ¾±Õ®eÆ3‚âëüÑcäÊ)ò±l‘ß«ÑL:õÆým‰âóÛÕ“Ø›u¬*emœ€ÛíR@A´°~†Vµ´Tðˆô"Ý̳êW„ C€µ Þ]ºž­)ÄÕ3ÆãŠ]b¨ë–(´›sr×ÙÞ:g)ï(ú㘠ªGö+‹ñôü~ØÙ?LaìyŸQ¥ ú€„ó´ñ pÃá¯gÀ«sö¦)à£óz•/ÐtÉpuÄtI%¹ñ }( íA~övI0‘„³í|Ä YÕ˜Æg 0êÁYö–‘÷‹e†aÊ×" ØÛ3ZF£%x³¡þu¹BÏc­fLOþïö;{³þýýaS¶@!0Ú+é×<ì”Æíà1Ì7Öÿ¨¸C=蚇|³ló‘k"‡¨LR Q«Èád»F ™c$†Â×à2šÉÖùyz‡ÐÀ5uQ 0I…ÜÍð>6ÖcÌ^๜Ÿ9©Òe>G„~Tlç'öŠgÃW½€o’U«‘R$mÓƒ͆!°ß v`Ê}˜ò$L)tLOmÙjªSÄ)GÄ )Â^‚RcŽ™x¤Ü箄?vš?µPŸ(”ìÜ|/7ÙµJ7Lê#ä™}læ$6ËDôíU¾¼E÷¶š¦ü=Gáw•?Óeò%frYe÷#nIø†@øƒŒ‘\ýÊ®Ç3É"Ê?Ë&ªÊÜ®¯ö0 *ÄÅDýòXÔF¸ñCZ¥ŸAÀ 5L/i­·F“É!F¾‘?“ÎFŒn|Qb¿Éüˆè†Ý \|WJwX¤KŸ*Ž ”*Øâƒg/~‘Ÿ½ŠEn€G¤Wí·Æi†ð³Ùós¿Aæ ?Ý ³6&ð$­Šì½(«nK±]oêðÖÁ$õõ_<è/Ö¨k[4ù]÷¨Žç¡Q(N­/*¨îÍ<>î>ÿô/ÿ*èÔ endstream endobj 38 0 obj <> stream xÚµV{TgŸ1AÓ—©XëLºÕŠU«»ˆ¶ºJEQñX+ „˜ò6$€¥¼%$7 ¯Þ”ÔÖZW[×ÚµÕÚuµ­íZíëú±çì¨{l·{vÿØ=sÎ='“;÷þîï>iÊÅ…¢izüÆeË6‡¬šé´aޝóÅoã°ùÇeC9®ÂdJx–¦Œ8‘0Ñe EÑsž ’~Ì)o>î”Óˆ¯z’r¡i6u§ÞÇg®—ÏKþª$­&6:&E橘!›ãçç;Kö’ŸlI¢R«o—ÉSb”‰òò#A¬RÄ*S´2Ï—cRR’x{§¥¥yÉ“½TšèE3fÉÒbSbd”ÉJÍå6Y€j{ŠlÁcðÓ¹ Sñ+ï£*ò,xï+¹Âõµ˜7e¾ Ør0Ùy”ÃØ ÆÝœ †ü¬_ÍçÖv./ÆÞx&ŽÂr4 ÏF¯òõֶÓ5Q-ªb`‹F;¥Ç;¡aâ‘à*øJÑ´¤sÿÁ–AÓ$“fÐÒ’¶€š bú"-äC¾.[·ßÄŸz Ï˜žr¸DÐo×o„„„°Ý©÷s™VS?´µõC븩& zx´ŒðŠžBëñÑ’K&äLR« “¨¶›ŽÁ¾¦ÃÐèT ƒŒ’Äc¬D¸üÂC¨Dªçyfâ x1°^⦅£L§Éz•kpˆ£ôa•ükH„h’øÀ‡Æê„gêDH>4Wš_n0¦¶žR׊»À^`6°Ã' lYH 5šŽ@só‘QH áx3/t2–Ý ·äÌð·–,32­`®å…·˜f8þá#E/F)NÁ ?¬ ÎYRu½õ袳êΣsWEh3º"EóÄHúÅ'wïzßÂy|V-þ êQ“µŽß}òõ%ó}"V` /,»C³›èc½èƒ^‘°rh¡t¤6b.71ÐC9°¾y5°ÓüLã!ÁÑ!?°uÞG;öæÈ´êN'ï] Á¬ÿ¦Eó8L+É 6ƒ1Ø<ƒ!ÇáŒÖh(á,`*®j3šÁT{ðDà'oö‹èï|ÏÃÉô®l»ü|xEXE¾YÁU¡U)ÍU[N;´³ïž|ÿ&÷=\ø}5~ÂL,Y€-s žgC»lu—¯Ùè®·QTÿÇvFR¸ûå‡ÞØiöå AoìÕ—T6–¶4§—ïäuP`(4Ô¿sʾؾ|³Nÿj^pâêíë dÝNíç ¯­á´)¢EÑ l}Õ5~P»Y“”—'»¹MÒyA!¯o;pŒƒ½•ýgÚ{÷ µ›HéYòlÂK6¤:@ßëC¶ó"ôâÐJ)vÏvU3gËv‡ñÃ_Û™Ö÷[·?“¾¾ =‹&Ìùâ>"â·±¦MR°ƒ¹ªþÐ[ƒÅµÀîýf^7c·ìd>Â+âÏdׂ ìÄÓ‹yv”Z^µÑ{Σü~‘ðÊ’‘­ìƒÐ¿bñs¾/àÇðÓwg~\º¿¯w– —½.+uyHìk ‘MIÝ }p޳Æj©Mý°½ .±UFìB<„ãÈ´µûv R£ëºÊQØÙÞ.¡ÒÚŒ};»€½vñÜ y]‰m-{[¡J ¸PgÈÕÁ.6³,·²ºÔZY›QÏ) &]¥NÜm'yY4Ÿ‡ û¢­9‰1 ¶*;v¼–¥€×Yÿ»‘¹×÷z{Â".Å©bL(ÞÑû¡ jØÏ2¤sQuuDܺ˜JK#b.ïÀßI§ôðÐVÓÚ`k®±’ˆØëH ^!§;ë‚l$E÷ûÑ6BÜ\tZÚ—s»q~ ÌŠc ‰ÍY£Ô¬"}Õdꇣšœ}µJWtˆG!Ìgƒ—Þ»RÆá¼¯'A&âÖýšr~Ð'BÞ°´A[›’š®MIµ§76ÔÚ9<¯';e°”8Å8= ÍgÜ:}I'/ˆ™{CîFŒÍþEý o³£ûQC•#áÆî h> ÿDî'Ø[[¶jCYƒ8ëú:{0¼ Qk2¬á¾˜ÔßCãø@ÆMÚO¹ú×Dýß 9çŠ]˜7ÒT­çE‚?Š“¢ ^_cÓ^ÓÉyòó™ˆFôç_¢'9L:Dº-)‡4=…ƒÐ GL'=uûµ÷AÔ4Å´m@H€múµIaª­‘éJ`%è‡Ñ¨È„`.’ ²¥_¾ý™‘ƒ¥…Ô|urmNuEƒ¥¥=¾.–_ qKrbHUÒbÌþj´ÇÀÑÚ{œQøg‘i/A˜Ì¡ùUts'Êî¡sÂé?~VF¡.7§PßnÜI¶˜H±~=sìhÝýNfƒ®^[™Õ Ѭ<9Ô›› ´· «À˜÷p¢OèÅ`4—–”U7•Xë’ö«½×êÏ<ô%íɬHl‹±ÈKC*–UÁÛ¬£jà>÷”L7Å Š æ‡3ý@¸æȯŽþ[?âÈŸ)xJ‘Ìe(H+ÖO™ó;=»ë/¸ƒIì‚Ø³g®p§µÁL@ÒVùvEÝntâNyØËè¸à¼ÊF ZÉø†/]â—ÿ‡“ºÎàñNêº`,a`D:T•™ÍêËpö].­g^bä^êJº,·¤—G?2!=¯^˜ì ­Â6‘0}.-k°u1±&:é;â ͹°›õUY †\Ðï~“œ`mØõï®$³¸hRÓ>¨9×"@“”©NýƒP hÚ0åQ’a$gYM%Õ¬dÈ{Ô<#®¡»Òº³]¦j#ë<¬È“ ;ß·ék´ |}®>6nö˜†zõ–ÂRâÍѶŸÎ‰dzôœÐׯöÆõžèH•ù¡^²óìH…N½n(/,Cáa¢L31g"Sqõ7hÀã[> stream xÚ­U{Twž!™Z¤VZ;wÝÖ+¨«ÖÖ£+XQÚ¢ÖG• Þ$!BÔ’ÜÂ#¼óà™ðP ¡‚Š´>K[[×Òc[×n·»µµµµßà=g'ØúW÷¿ýcî93çÎw¿ûú.Iøû$INßñÂæˆí‹"cã—,õ}XžŽ+î)&Šø' ~É?ådz"þqÿ§‚|êQÁ¿<â³7gøìŸ3Í:“ð'I:o¿1<|Ùâðð¥‘r…F™žš¦’Ìß·@²dÕª•¡’¥áá«$ë²¥Êô}‰2Il¢*Mš¨^²$[äûÒ¥*dþê4•Jñ\X˜Z­^œ˜»X®L]³ T¢NW¥I⥹Re¾4Y²A.SIâ³¥’)΋§l¤<[‘§’*%±òd©R&pî·Žˆ%‰d2Õ/“‘J‘Z ü(1“˜EüXLD/ˆÄ&"šˆ!^$^"¶[‰mÄ+Äb¶AþD1q‰|Žô‹öû@'êõ¯ x, ULеâ›Ô Ô]z9]÷PoâµùΉ'œäÀ8ªñ[Ñ߸¡ÿ4u<éFdË.xÖËRž•Çèb°°*âèúþµWrOÃ?àÔiϹ£Y¾…s4Þ‹¯1™m/@dчà3¸Öt¾ù½·ºAœS9–×ÇÃjˆ‚°¶(®ûŤ-Dïõ :I$¿"B Ó f5›«Ø™2hÕ §àL=i§R …ËØ,™¸Órz{¿ÎÀyž,j™¡î(çƒùÝ»…<äð-”qCÄÇ ÕLžØ°¿d«î@iqÐ1‹"†ßæ ÚÒß×ÑÒP#¨}À_^Z»;LXf¯  s¦šˆˆ1´oLÄ¿ŒÊø ܪYÿîÊt!þ¾hmmB?ˆ1Wðkƒ']TBDOü(¸=£÷G~s! q(ŽúéÊÙK—vı¸ðwýv‚L]tjâÓ^4ë6‰Ha„"øI¦#¿Už“—¯Èn+hë¶w´°˜ÅqÂ`½SsH¬ößðÜ–“à©=‡§v·ÌÚÏñþT_/Š{P®—üQÀëEvÌ¥Õ`†òË£ÕÕW. š]fÚC©9³TódT³©®ÐjµÆÄâ?â™|>õ»¹úbvu÷ƒ\¦Þ9û fó«Š@¢Ñêó·vË0t³À1Ÿ›²@>@ÿVêÿYç… }¶DM›îŠñœ¡qÛÿ¥Ì‚d´ðK§v¥K8<¯¡ 1 î z:Ïijï,Bb4íö·h&‹3p“ M²aÅé<¼)Ü”‹ÝCîcƒMG ÞÔt&wïH4ˆÍÙ-uOÔw]fÜOïÇË¿\¡ç‘–¹íý×Çl5X ÂTRvà(hYkQ“ÓYßÙ¥pïeW€,ìP0W"1~âwv[Î@W燿Jb„±Öw{4g…ìBš!ú”ž±ƒUÇ–@A^iqV{Ve¦ 8ÓS7må ÒúÒzä‡KŸ)ª7´«íëó@NïU¾ºŒÝ¯öåÝ)³ƒÙd6V”è"Ðk8<‡Ò€ÞÆZÁlnvY«ÀÒØÔ·{šþéô¹ëŒfôפv+*7ÕeWF4ÀºÛuüK‘P¹Ø’e.©‚r kÁjÈΊþ„=ë$9-"´ššAs=x.ŠÉ›þœº(Ü@«oân ‹®©F.÷^ºÊ¾·•Š”%&GÁWÍì}}òÁn¢·ùˆ E­HXÿ×Uú#,ú;…çúJ8†¥^HA,¤ve´å ¾%PïÃOkSúC!îò"^8®Ûu.þIiŸX*â@ÿdZ.Zš}¢4j Kf„m¾ 2Ö) LPZ¦ ÃÁÏ £ú:¡µå!î7ÀÅz(¹1 d™FØâóîƒzcíëÖCuUêØ¼µëë}ƒÒÙÖ‡½r#Äø¼ß[Ym&š‰ï G²´jÀZnmºƒú‚ïà>ë«¡Bj¡¼ª¢–Êwñ‘Hn«v‰qb-å™6ö°³&0p¬)p:;Í¥3ð!t}öª¶ endstream endobj 42 0 obj <> stream xÚ•’LSWÇߣ¥<qêÞs¼W³8¬§8¦&‚PÔ‚&DŠèh‘þ J‘_Â) ­PAlEq¨A‹ËÔR'³Úi4hæÆ6“©s..˼o¹ÿì!KÔlÿ,¹ùÞ{î=÷œÏ9÷’„PH$”’»5"Nš–¶,jjgE®àºÿJòçÜ›$êÇ1îua(AAsy%М)½÷Ê”.äÅ|!$Iª¸ $’å‘ITœNo6¨sUFqXv¸xYtôÊ%â(‰$Z¼N£4¨³Z±TaT)5 #oä‹SuÙj¥Ñ,‹QúÕK—šL¦H…¦0RgÈ]¾DlRUb™²Pi(VæˆãuZ£8E¡QЧ¡#§§8F_dTÄR]ŽÒ åigD1ÄâCBAä?QÄÏ!B –XHÄ D ±‰ØL¤Ûˆ@?‚$üøíBbŒŒ'}~VA˜à `Bø¾°+?‰äÈ_€®¹é½K»Ë`Ø¥é)8>à:ÖÇus]äE.LÀmä*è[k3tRÝfGSßPÓPU5!ø;œSY[[•!`n­µ‚îbe°­În9T{§£›‡¥¥Ê†?G)Á/FLF½´ÃfktVÙjšð]¤ ®Ý_Ó\ T™¹²˜åÃYZjÑ0NÆÃXº§¶ÊæâÎÊv¦Ñj·6B«=$Èâ¹èA'y!‡Ý?¹Ñ:·€ åLtÅB‡¨˜¤XˆgúVß:÷p­½ÈŒ×á`<¿†q ÄÁ(ôáíË®ìaË öT«ó”U* Äï"-B‹ÿñ;Ûg«œ©$|ƒ–gß™üllhtHúÁÊLYË Õž?=¤Û‹J¼. ¢'dßâŠÅ¯?\v„i†FëYh²Z»Öƒ|½N8 †Aè@»¹~KÔ”^š” ¨¾Þô€9ãM_vå}Q(— úú  œ-Scy3µñ* F(Î*Q•fÀ^ 6ï<1tééI4› Âf7Šw{Ü(ËMú¼(Õ{fL€d—éJ9\`áð¾ýûí]åƒ@ý|ýæ,µôô´¹öµ[›óû¬@9ŽÚ.HeÍY§ÈËsªí: $ëcW°PÔ¤ìÍ-ÑíÕ@%¨:töê4i+äP«ž$£ùhþ“ñI´¯‡<&‰èôÌ‘K—FGΖËd;åÛØ>ü„e¡½éÓSNg{ |Ô=äËå±;ÂÙ ð [ò¼QSCÀ¥#7}p9£õnýÇ–ö¢ÓÛ!òµ5Õ 'ŠÁ ”FT^Z­úYì ØUį{ µõð=3B>‹’&ÏôÚU ® (Õó.Çx—›ÿËå¶G^”Æ¿ï{h”~,f6Àei u Ú²™Äi”©ôCØ—õÜBïLÇ™zÁ,”(úÕ7|ÁãÈ“1xwVÀ{‰¦~Ô÷ÒãEÝ|¾ ”O£¹’ß0 Iž‹çÝxúôþ#4ÁÛñ*:N:ñ˃+W¯_¿’!ý0î®ÏC¢/J¾#@ùh fMÞøi‚fhjØ—Û»×”óPÇ‘aÅ¡t6dy*u& ßÒ¢fÞ~Ž>}k_(¤á9â[Ï_h ÷ýìöKmЈ¢7eÆÀ`?ƒ\ÿ>wˆ–~¥»Í\†ÓG»:¨\t0W_jC¥ƒ‹;€Ö:DØl ðÌôÎòzg33…f]à ®õÕ¿A´• endstream endobj 44 0 obj <> stream xÚV TSW~Ï„¼Ç"mѧXëK¨;Zõhuj]P\Q—$Š@„ ˆìK’ŸàYÂ""# q´2eÆÝºµÓjí±Zg,Õ¶Öþ^fÎÜ ¶ÓåÌÌÉÉ}'y÷üË÷÷û.ËÈå ˲î3Ïœ°l„_Àôß1ŽÆ/#ÛßoîÌt’ú3Ò¬4 ‡$ʤÞò Ãú¾FWFzűÞÕ±zÓ¥§Þƒ‘³,¯KŸ±£||ÆøÅlJŠ‹ ˆW [;\å;qâ„‘ª1>>UÓ¢Ââ"×j¢Ušøˆ°(M<ý±Q³62,>I5ìˆøøM“FNLL¥‰Ú<*&.üÝá#U‰‘ñªÅa›ÃâtaëTþ1Ññªš¨0ÕóªG=øÅDmJˆ‹SĬ ‹‹¦Õ:ûÊü˜9ÌbVìUlpŠ“'Ó‚=˜^LoF`1ÞÌXf3™ÁÌdü™YÌlºw.3Ÿ `0 ™@fÄ,a–2˘`&”Ѓa9ÝxŠ]ÆÖôÔcu.YƒÜ[nvrrŠq:¯(Vü“›Á}Äs|¹3ãê|ÙeˆËe××\#]?pë'éÝ¥v°Kö£•,nC'>îä„zl§Í#2H~‹ºBqΘì仪ˆR͵˜¾‡'žA‹Û ;À9"  ^À~­v¶ ûa ö–I&Ü hz]v`JFVödHžŒV4øò£²”}v¥¾âÑEux'ïy#—ÙSªl–ã"´l´lÜ~äø™íàê§„ÉËü´jE=32ÁI|²ô¶#kÚ‘Ã(¢ÇÁ»Ø»ÅÆþ {`zÉpÞPCWƒa”:˜SÚh/*k€ý|st½V­ýd)¾‚?ùò‰§â‘Ñu_Ôýõ|Âßò;O”D>1pÒòÃ[÷Ö¬ Ug4®,li¾fà¢òVmÐÆFÆ iÆDcž!GÙÇ'›¡RìFvi.…ôcdeÒLô:ìÞÒ4E­q{œ˜D›HK!] =Õxˆ(«æêMÁÖøê(¦Þa¥\#À¹wžI³cp%ε ÖΞC/)¿EÖ™Ñ9N¨†‚qª_ÐÉÙ5Ó É"£È`²žhq8ŽôGÝÑewN~Š22À˜žIF!ØæÂØ=Aç#š6œáë²'Ú.ÜzR|nöÔì'3L™EP |5˜j”îÒxÊ;‹ÑS†û:ûRpíŠpÃPÐh†B¸Û 5Ê»:ˆ\ÍÙLO ¥å ؼÓÒ?M³êìxÈŠ6»Â^Ø„^½R¤½øwûÛ¬×á}þÉ›wI€Øå¤~ÖÕá¥VÔ›ž‚Íö=ÔÓ^xˆëu ]Gà@ZUìþHJÆÙô£m<qÇXü·¥víÎ*HUnc¶15wùF] ̃ìËYù^)9g²oÆÊ¯J8£F —Ç‘?(Ý;ÒìÜöܼñ@†…Ò|aX•þ:ìâ[­íbÜ[i!} t`¬ÞÕJ ä* 0E̽13C½Â3βü°7åõÀ)¾„UÂlÛÊ]ÛNïËyÿ$¡ÔP¥Û™Z!¼Z÷‘‹c(÷gáã(H^úx% ä¶@v™XùùÅE%%E;kk?Xu'õ/À£Ï¥gÏ”ð€„­åÝ%{޵u8ÎÊ6¢ µZ©ñ´ðpú9âD\r'h$Õí¯·4‰P‘½'¹ÄZT´ð+Ía•k92†Œ]Cd>È'^U~ §Z*òëAýت°ì€*K&lSÎχr¨æ Û&¼5!ià ­•rÿKd¾þ#ͯϱI}mlºá,t‘Iè,”¦C†¸ŒÆÜ´ì-›f¦PxŽ<Öž}±oa»!WI_ F½>5âxMcr­¥iç‰;„3/%þ3 O8òÆ£Ñ8}/éPr¬ÒëV\ÚÚÉLÛÄ'Ó5w®Ö)Éj.¡bM½?Môæ±DE>ý”gáDÅa+Ì¡¿ÙÉÎdÃa¥$ÑSÔõ@Ð,I §û_ìuI 'àOUM míæjh†£IÖ5´µâÕã»V¶æÌ|(“B0V¨6C­ögßZuBÓ´sá3~0ñ ªï|pŽ8ölwY ä(iÿúœÔعst¡tË`#öoSÖËMÍù‡-¶Š«ìð·üå¼;~E…áG;n¶²èôô>ò2Œ’ T+ˆëwЧ—Ê­b ˜ŒfCJFf2èøµ’öVÙÊŽ6‡·Ìð!²0‹ƒ§©o’ýÕ\µéì«¿ 5ô¤Œs¨!YuÇ<¼uSÙ†;¸ù™ùŽ ûà\ádl”QB‰g?þP ­Ñ¶´âúòší»Mú\}¤òº][öîÝUa©I: Õ Õé’´5ëŠBh7â’wg*ac±¶%2yKR„ƒºz½eëæœ€xXÌ^œóqÒÝ÷o‰ðÅ¢ú¸ÒКy0â` äæ« Óš(wä—•ìäÑÕ,Œƒ«ÇÃÕ{÷ÀÕ*ð§l#¡ÂSƒ#"Qð okºpÊ“ ŽK7(ÓY\íàú>liO‘âX1c[oįdZ–Ó ft}ÐÉuØ·ïTSLü1’CæÓ3Y6OIݯ_sîx‘NCjý9¦!ÃÍ2¡ù½†uÚ‘aa ‘͇­ Í"™AæPöµw³ïÃî W¡nß…nܤùχÚÊ>¥Q>G«€ß–—]…~v.Öëcƒ ž %WZ£ÏRB^NžÁ@æ’!ž’šûm4~ÝÕ=¼Î•—–í¬Úƒ=‰ga5#Ÿ‘ÛD5Wcºu­»º]˜Û ‰ž¿­ ¯ }ßÝ™ÔÑú¼­¨Î¹Âo“\£I®½DâÇÉ݈?‡{Íó¯¬ós ùÃu§©t •³¶nØúù¬²y0‚t¡þ 2ù§¨/ ùüìíÓçU%LþøÿÇkî% ~—~9õÿ«á¿R@j§ªöúós_Šn2©c¨5~L|É„qIÒ÷á[è‹î=F‘˜È"ôt¾Ó-$¶ª#ÇöØáÏ`Û´;¦2‚!”¨ª %#Ëì8Øêͧ´3 ÉÁ—(jŽÆ94~ÀŸáGÝ'ý•’¸vúŒØñËšý¥fáÐÉ3凿ØHOÍ`¿yJ5¨«6ž B¶æ9dOŸ~ç–u˜ X q,:‹ÛÒ³“é½IkM®­µînn Þ*¾‘þÛ4D™‚¼ýk©- ©(«ö³MWpë™ÔSš"tû`¥cJfž>=;WS¾ÞLe6Šx飄7ñÕ„†Üº\kÎv8’y$4ü»> C`~yLGN¥1?ù¥r/-Еå{+XD”y¦).?u‡ã¦ÒmÏîÒ:MÎŽS*Ùo)â=[dîWz„A…qXè°azþ½Û¤óºýæÑ¶›âM07'*zãB¸\ýÂøÿ|&-øÉ}B¸)«LžšW{Vį8âÿ3jÜÐËÑ?ˆ5pì·ùüI œö³É"‘k‘;+eIîBaÙöç·sáh7`±Cêªr³©]‚17ƒ8“bO"`£ÓY»"Þ06E/‚Xºé<‡3º<ж˜r«¡_9ì0U:¬l’+%±4Q&Í—¼…"j"`æ+2`‹Hþ¥H'SZæGUG)hüièâ2Óéì²û%ÑûªäªØ+œ4Š,¯„ â¼Â=­T ,Â5•Å¥ ²ª³» ëÚX俆lµ[OÑE>¡ÒÍ9ßÍ]ríýo‹UŠà endstream endobj 45 0 obj <> stream xÚ]PÁj„0½ç+渥”¨ =‰ÐuWð°¶èn¡Ç˜Œ6°&!ƃß$ÊzÈ03yïñÞв>×J: _Vó R ‹³^,Gèq”ФÉÝ>ÅÊ'f-¯Ì4lB M{ùùn^Ëk›&o÷[•¾ƒÀaCÜVƒís}îÖÙáT«ACžÚzÁÙÙB÷øvŸV •j„ýìâ¦[Œyà„ÊABŠ"Ê¥›%®Άq´LHò$) ¯ª‚ ÿþ²Ñü—Y<äÉ|Ùúcä툠¢>“òÅZï!Þ#¦ F¤ÂçÉŒ6ßùo´ endstream endobj 47 0 obj <> stream xÚ­zX×Úÿ¬ ; *ëÄ%&³XKŒ±Æ˜h j,‰Š½"½Io+–²°»ïîÒ{Y–¶ E…(h¬Ñp£Fݘ‹Ñ›MLÌ<ÜÜï,ˆÞÿssó¿Ïý>ñ™çaæÌ¼¿·ÿÞsP”@ ±vÃGÛ·¬}séš ³fšoÌsú§ŠÞDK~Å¿*à_ÂsB~¬Åk%(M®Ôï#Í×oF™¯¯“Ëä÷­) €‘E©fΜ3cæÌÙKƒ"Cv{y‡ÙNq›j;kÁ‚ùÓmgÏœ¹ÀÖÎß#d·›K€í—0o—0ò‹ŸíÆ@·Ýa‘¶Sz‡…½÷öÛááá3\üCg†x}0uºmøî0oÛ ¡!{<Üm—„Ù®uñ÷°íÇ<£ÿº4Ð?Hæb»&ÐÝ#$€`µ&°¢ÄÔÁcìF¬£6·R;‡8¿ä;2†Š'‡Rþ‚aT,NYP4ÅP/QC©aÔpjeE¤FQ£)kòöŠ¥^¦ÆRʆz…GM &R“¨×©7¨ÉÔj*5z“šN½EÍ Þ¦fQs¨¹Ô<êê]j!µ›ú€²£–PK©eÔGÔrjµ’ZE}L­¦ÖPk){jµžÚ@m¤6Q›©-ÔVjµÚAí¤TTe?„X'»‡8Q _~oÑi9ÜÒÛò¸(@ÔN¡YzD?`æ0¦—V¿T1tëп [;ìÖpÙðºÓGìµzË*gäÐ‘á£ÆŽª…FoÝg½ÞºGì%>7FÍ®d¾<ãåo^þ},Œ­‹$ù6lÔ¯Œ}%ñ•¿»þêöW^[öZ,·€ë”N6Ù¾m[2~ãø‚ñ½¼'J&~>iǤ–I§'ýÎ+­øë`â-M(Ý xÒ<»ï+ä7ñ“XD›ðPĈz>í8Èé  “ãS#ã „ + ¯ª)ÔW4zïÝÈ­'”Ô€¦éAÀLÇÌVLI±h¡ß5|…v”ÃJή×чTMÃ'™è•r8(EWç‹çÍšmuK´ç{h;Un£ס',²¤Ülû‚;Õ`Ôt”*<A¡ ©JTÆA"Ä3˜¦­ø®~ üö#º§Ñ`M´X}ïãnñat‹¨Ñžç*Ååÿ /¤±ub´šüñ-•Z±ÀÕ-Eï´|ÎÕBc‚>ÌU¥„hƧ2®´¼¼¨öä¦6»xØ6,àþei«ÞKÏ!Þ«ï‡èõ e§œÿå?„é®Ü‘š;SmÄ·©ÿ&76¸EÆ„5¸è·ó~‰€þ<äõÿQj•‰Å>Dü£o›OrÐRè®J …påE—¤0V¼’ÏDëÈ­òÃz‡³Ù™Y¹Ç”D–Dr1 —§*ðpü–¤8ÒÒ¼VZ¶ub]†Ë —Ìñïè-þ{*ô ³wdPppqP#§‡‚œŒ V£!!¡…ØT)ø&/]½&>T d’ÓSÓso}†rhËËÿÝ‹ÄYxK:Ù‚f´ SzÁ±^w!_„lX&*(½>b¤ØKDž[¢Å¢Â[±R_4|’ÝnŒ‘BBJ²Z¹išã ç-q…X€^sBôÑS_~ ÝL{ô­ekì6çÀ%ciÃì™Ó$Ž»‚ƒ`33÷æê‡Ü7prSý9û“ÑŸÂ×pæ¸öÓçZÙ ëÊ`bn·Ô5œ‚‰*V½774˜q~Ÿ58úï_SظµÉó“ k’y7ìÁQ)ÜØÛx´‹±BµÏcæN¸ðÈõ¿+^‚ueO7êOÑmœÌ‚´QÅx4²öEë½hÉ>´D£óó@ :&3U§à`ÖŠuX¼ ‰ÇB˜‹rñˆÏ°å)<òÎÇ9Àd¤é2¥/¾¢ÉÇÛŽ…«r4b²´G#ç}‘Œ"5U!%¨J#œrÏìx±'^†Gaë¸°Š´Ô .î~y‰;Ñ<$„Ûæ,C_•íá—â»­§ÈÏ%½õ¼%ÞV.þ*àsÙÃ^—7¦+Ó•:e0E¹…ùRÈMÍŠÊÂã»%HÚ]š– y6ùòÂh.™H ŽÀÂ’Bôea\N\´<>Žƒ„|ÌiexÔ]Il® ÀDËc⤠OK*NBãWI°tUDbj2ÄÛ÷ë9dûS þÀ2&?!¿(7/Ÿƒœ8Ä© ‰ÁwËÐÁÔ®ð–-Bþ-Å¢ºÁœŠ5ýzQ”†‡CD,‡ëq=û< Èo¢XˆÐë¡´€#®Ç›û]_F\ÿR¿ë4ìÙÐV·çž/‚¼Œœ,­V¢Ñ¨c¥ðIàZ'…‚ùÔ~¯ç]»†hò!û‚\T"D5Èž=KÖÓäÛðDpç‰m:ÂÖ„V„†T„ÖÔTTÔ0Q>så1~¬ÿ¸×MÏ7G ÓŸÕ±š LÀû}‰$%ÎìN¦?+ -G—cö•ÌÐ+1šo¡¬[BÞ]dázÊuïK»~XPäö°$Øu†ïò”Eð>|˜6«uñþ÷.†‚£ðuÙïëÎ¥_…k öÂYwXgŒüA~ îÁI8 ÝYGKѰËÙF¨‡îÈÒ)9a1¬†a…ü“˜éüÁ,›´ &Ó„A—„¨£w [Ú0nÍ'sÀ?ZO>ÕUÉôÒ^ÊøYœ¯Ÿ¨A÷-´´| ¤ìûÒ³”¹MRóg® _ýÉd}øWäô]ˆ‘˜^|…}òÍDÜ©£ðȉf]ÇVØÒîíÙƒ®¸!¯µ2²Ò›K2±ºü‹£M'€ùnÿ{ ¤ðþö…›ÖàMØG"—“§¡ŒøWžU£%–!¢ÿd§„˜ä¤U ëG/«¾€4© ýés£u²xçgôþ½ÅŘBûѯìͪç‰ynÎ9öæ‹íû"jLzCÍaˆáL‡ºóiýL6K ñªõÁNþ;w+CÔIêPU2$©“ÕÀˆûäòL(æˆn6­˜Š_]à$u†‹½O6¤˜ °i Ò„úÆ:ͼ¿ ÕwßýÌápsõÕ‰eöE¯˜xbàŽ+ÄÀh;—öRÉí¸=~¢V]´µÖçÛG¦ÉüNböŒh.‘ÄJR<>Õ·[âG##é¬JRò/Yö+ކüˆVÐØ[Ö‡î4¡ˆñoüf´‹EÃ<·œ£½¼´•Ö+ê“ë€A#Ï—Ÿ¡LO–ª‰US”á‰;ÂW‚ìÊt(KÒ©È=&’¢¥ø I\&hui¹EMGo@weEyjÝa;#~ Þ`êêî¼ –À†#Q'uj:˜úbcEE”Ñ'Ö;y×¼sÓ…Tüb~þ‰¥ý˜ù å·¾k!Žº‹Üï}|W܇$è[A£ 4ª±“ð…6…a7ãŽ~1†¢ÚìæSNŸ¾‹Çàq˜ÅÁRñS¬G̲ûHøýßÈ›âÙ?`!'î[žÛÂw2h¾Ì®ÿSŠÂȸ%ÌÕºGwIÊ·ƒiM‰'lƒ°¶GyùÛïJ Ÿ2þ‹+‚cÆïï ù þ ›m®áe Na+På§–2!"ìji銲Ïäçef\…|bJ7‘X ¯Ó9¶·ÃÁ®“†ÏtŸeM+/¸sàóE9ŽŠ‰Ö‡Ã Êa‡ÅÐ|~»«6u/3§¿h»pñìÖ¥lpßiïÍbدšu‘Þyoöñ™“ß³›ÁA¤Ö±Í!7¾)Äň¯˜·¦0ã^ù+²üþÖo4Êz´E”Eç|ÒÂLvaÑÈEÕþ°ÖÆîí æ-ýü'êÎ~Ó1€§ñÞír~’Ù ßCîwIàÑÖ—Æqw­ç¢`³6h/s «¦ØZ(‹öOt_yÔõÄ"+ô*ò%^@L9›Û;"]Ã\àCþëTdÁ‰; ­må'<ê6vß™È&8 æzÕQÖTux_~qHýîbÇ<ß´Õ°‹yw÷´9\}EÏJ,oõ¯5_µø×ºÛ›HÒk»‰_¥ÔõÚ ù ½«Ù”|Uf4&¥H‰Ån}ßK"·¹ÅlV“ZV®Ù¯m4u©êÌ„u{ˆ±R :MŽFÛŽÆJˆŽà·4©Z!Mþ!ˆÜFÝyØ·¿]ÝFÖGÒö›)¯g°Ï!C¾j‰e"«Þm@·5›¬‘ô:ñ`É#RúBø!,RÓõÚÌ=hxgË';æc¡ô»DöAé¹³p‰ùöí›øe®oˆ_…èŠVî%í« Å¿’ºðêÇ¿*B6w{þ&…o\ÆÂö˜÷m u÷þ1ô=‹ÝÐ;xZ‹æÿˆ¤ˆÉÌ8N P'$ቶ °˜µxÛ^Ô)ÿ„ºÐÖ½§9$€ž™zü†6”„€®LŠèbÈ”s©JêÐv;‰gã¶Ão#¾íñ<<;ùi`ꘈ»Ã‹ z³~ô Jƒ ¡…ˆCSÐ:´C³ðb)ów[¶_#~߀¥‰>‡s²Îeû×eσE€…ö^;ƒ6¬ƒäjïBbèS&T¿W€^íA;ŒèM£Î(D¯^e…\µ¡\Ò#BðŒ°%øC2Ù<3™þ.ý ×÷©•„ˆæÉý¦q³P²hÀ=¬ˆ¸ªMEXÊEHfÙwjÐ'V½¶Dh‡ µÝdDBþZïB¶¯ý¹ãʵ$ñ*4·~$^|èéß Eê;ô9ƒ¢ç'ø¼ÉÍCÏD¡i`ÜX„9"Úª×(3%êQˆ‰½ßïôx7ˆcø»gØ|Y‹)®ÙEf%tsZú¡áêM*·wÀ‹Ðð:ú®Nî)ý„w` ,N üïh@Ä·ÛëOq¿Áw³ôxòŸºÖ·nóÑ)Ädkñ;x6vÁ.h.žƒ6HÅ1ázåÞ“Ì@®}nB{MýÆèêò½üÏl£6÷ Way+íÀÃãCð&pžŽÃ](Žþ“/B„ïìÛw¹ŸV„Ò˜{!*D]¸ðÏVX¡¿? ¿W{„Hf†£Ë½ÆUš…-÷…ýÂ*ékºg”ò…\°ùS×`_óµþOÓ •æOñ92à dÁï1 Z‘šzGˆ>CSØ··oÜÂ)`x`ºòj+õ²Ý±Nvì{¤?ÃÅó¹—5Y¤kìeøutkœ!®qRy¨\æ€ÞHÿqÞ$–J^ å'ñóY´Ùee鼡±1ÑÁJ_òÚ»Í3U‹:# !:!!)wã. ºð¿0âRš0¤!h.ËHÌŽ#|ÜßÂIuk0W·†}ýÕÞ {Òü'['»éynÀÉߘÃå²!"ùë±x4^Ì‚œâké½Pð=Woy)g‚«û¢?†Ä—ˆ¬žNy¦ºm5_qCˆ½SÙDƒHÆ‹žç‘’‡If`šCÚúúC*³ô$訒ò)þ>$=.=1lrA—•–‹Ô½#$š¾ ¢Aå›t_Bsó_ é…ò|Å áð"Q0€:9ö’ôó€7ªùÕBÓ;›MÌSk"¤üjD… WªË•5D0}¥­˜NOѨÓüô¾’ìx:˜È,•ò‡è*èxLÂÁ[½Cåã³Ck6ý‚¤}‹éж¯1ÏÔñXˆÂÑ9-¡áˆºñèÇ)ůIñ“êâf%*fQù@!í¡90~‡` Ï!‘&3QG ¨‹t)îR#ËŨ$}<̼¡–GC9ät9ÚÐsY¤â×—‡¾‡§Hű*®ž†«ÌXtOæð_þN£î1ü…þº7uˆ¦Å/‚6hØ½Ï ü`%| n­­^Ÿ)j¹Z|³:r㤤-%ª“˼#C=Kꌽw]yvGý¦RÂUºHs›Ym}¬2ø,úòì–JñEô3/añÓšB÷£pÂæüÑÓW9ô>ð»Ž(ḢôR)Ú5Pà’A­NŽ÷Þ ñ¯qmM¼+œ?g¼Þ=²äjPnjgüy§îW%×&W{–çø€³lûÒù\,NßrhýQåYu£:'‰q&’#¥ØŽ‚ä\BŽ5ÚÌ\ÐètõGL»ÏzõRøÒõÑ©ø"W žËÇ©ÓTnS{*ÍW®  œµ®æõÇ¡ ò¼ I°´ÏÏãådÀÈÝ®½ i)yžÈ¡¯W¢KÔ%äCh3ÓòÑ>]‚Þë˸i3p×¼C„u-O§·ÐÐ!ÊÂ:¶eÚÓéZðk¿ÇÐæ=GîÉxÔ®·FÓ 24ü’ù"þùleT•± …ZeÞfTP&…ºÌ¯Î|ž÷l(%-Eþîb<Ô¾ÂqCIU¥yÓñ¿{ñŸ #Pçô&²ø5·¿OŸæ†^™·º¡~Õ’'Ôù¿I—¢LÈ×PywÖ½vƒuÛ•÷Ðüsbÿ#èÎ×lš[•K0e§ nH…l¤×‡(ä>©Ó9ä@“4oöjroÞ^´“tˆå«üõQ•Õ%z°óRêwiªå’ôÐq÷ÙROZ¼ÿÈ6åGÊÕþîÙ NÌ{BÎpDJ7´·”v0Éè]v2=}énÇ® ‡9ø¬íZa®rƒ¼ŒŸh@žmÖOΡ¢[âô!?‚EçiSÚ¿ -1XWßB‰Ýý›<(Í@So÷ó8s—âÄ=æý;ƒÊn~@8óö$U:p(ÖN4äò8'DC¾fŸªAÓ©­ªìRí}qž³šþå±³gr7oàp,ýGë¶ñêZm¤á˜üc‹}ôëa>8ÙGy0èñ?¦yÆ'nmC#žX_~òQ·ø>úˆ_Ëb[óŠ/²$t ƒ2ê4Gµ 2V¥¦7“I5ßÇÖ…”úÉ‚‚ƒ Á¦jcY)[±Ü&xÒ-|ò\›zâöšÚuËsmÓg?»2¾m#DÚDD¥F5Õš“Ú²šuy'ÈÀ㣵6%ƒdzÚ…S9Yg:Û´eæcez­ÑÆš[N©:GqO(úxl%áÃþEÕ^±²°[ˆ>êý˜ýçUüïOО ¶É Ö"ÿŇ}Àâ2úã¨ÿ ‡Æ~k—ëKÀÁ9p #¾ñ+a f­Ä‡”8r}]|ðÿøqå9ˆƒÏ@(åF~¦A@jTí-!ï‹|X4fò<ž†¤±¿¼IŠõˆŸ~Dbc֜ʂÚCÀih„f8Zq ª½£¬À~Y¥s¥3¬ð‚Í2'™£SÀvóÆaÞb"쀷i 1>kEH+Îv?‹‚ ™ '©øFŸ÷ J{5]ÚʪÎÉa@õ…t6ݶùëýiÚCl!?X.Ná2ÒŸ YJ×tªéæâé9Øøh¾Ô <ôA­¤i€ðL¾âšiFÂÚÄ ~Ôi¯ø÷Òùã2Úc¦¥øA\µë™÷ÍelÂ4ü2ýà Äàç¡u¿¡†Ñ!?§Á72PëäÌ’µ=¤Œ;ëÒõ¶¹[ˆÁÇ zýI÷“;â+è}ô ‹†ÐXú<âÅ_ÄÀ•ãôöž¯Í;ΠU+ÕáñÌ–ÅJŒyuu~5ΜøÊðZëL”åäþRëzcȧ(Òö©¸¹£-¬!õf4,e¶y»-âæƒ×ñˆo”ùê´„AÚ. íé Ñ”–j‰˜’Ò.ÕeÄôtû_¾’ÂÿÚø<Ÿ:÷,—,TsWæÃ ¦¡²õ‡†@ú,­Ÿ&1›À.~˜-RHcŒ‹W¦&$¦*=ª]!†˜ÑÊcåF)xVÉqO]pµâ«X‚ZBzçd= 4¡wõ‚_ΡWŒBdgþ{Љ&<­©øÛNMedßà¼ßx¡úÂYîxÈ&ÚÎßÃs%|WÌ Ò˶ÁüŠàÇ]cgÑhÒ 2p!O~A–Ósw®X2?µ£‹Cß<{r”³¥x½f¢éœ8⨮1oUWzõŠIPÊÇ ù¹è›]^¼¿Û\ûÂTê°Ð]Ú(síkRç†*Ÿ¨JM•¿Ž³$ØÕ)ò;³©l†ÂÎýÕUaAnóò3¦È÷#} I2bµ)ùiÙi9æùh@\‰yçö¨‡-9lÊo0‹“q²Gm„ùýFµ!@ª”¸™8[2Õ¥æ©ISµ©j=‘ Þ¦ õÖEªœ¸tE®fÄ<œ"™Žô)fÊ›6¸º[êMÿsò”y¾Èÿ&IÕ%™±i3Ò ~B’ŸqSšÜ|Ë&týxŸuA¯¢ÏÖîÛw¨¢ÒÔØZØaF¬òWûoÑÆ™¿\¦ÊŠƒhˆNˆKQ¬Y$YôSbA‘a……ÙúþÕêUªè=§èçA£î°ˆYÉ[xØÎõëT{ÀƮԚ4•5mª sÖÊtÉù„öjêOõõdI–üœ~øn¨Å|ýð—Ð1ÿÓÿ6` endstream endobj 49 0 obj <> stream xÚ­V PSg½!ˆ¿e[1»qÝÞ›>ÆB«Ú®–ê¶µ¬í¨‹Q)b…’ÄI  y}ò ‚"!`D„JEX:vÔ>F;ºmék§uw»»Ýuÿ‹·;»hk·™vÚÉÌŸ¹wæÎw¾óCDF'zKÚ–­›w=˜”¼}SBüÌ›õLÍ-zºr½œ ͡I.ýËHòÝÍ‘ÿ]qAp¨;Ù“¸õó™óÆ3çÝì±èƒ%D$‡ƒJÊ!>þ‘Õññ'Ie¥rq~B›'HHL\»Rðp||¢`C±H.ÎJÉBE¨X¨`ö Ò¤¹b‘¢T»¾@¡=þÐCJ¥rµ°øÀj©<ÿ‰¸•¥XQ Ø&: ’—ˆòÏH% ÁVa±H0‡}õÜ_’´XvP!’ ’¥y"¹„E;!Œbb_„,ª”CÑÄÓDñ;âb3‘Ll%RˆTb‘Fl'v;‰tb‘IÄD"’H$Þç”rÞŽØñ÷…Ȭy¿š÷zTI=_3£ð‚ûL-l¢-Ñ8eŒó.vrñyœÂkÔÔÛÎÔ¢úJP“Lz”¬`ÖX«L*0!šÉhÚ­ ÐËýÖÀL\ÂONƼ‰ÿ1Áóîê)é†h úÂͽõã`GI-ØlU+ÒT¿Ú¡F \Ðä긄ƒüÚF°ƒµ–9ôdÅ6ŠPõ5b¸ÌBf%³bÍàÆ+TÌ›ÇátëÉaôvñv3©†¢äǷò݆‰#Œ„ñ‚æ¾àäàÈ)@§ƒéB ¬6“µ EÓÙ,ÒU¼·ƒçŸÇ²‹\<6À«®±»YxuU5Òz›Åkàkm:¨ÎCv£ž‹E¶ØÏ(¾Í¢ÏZÛ÷ì8/Ààûÿ2œBŠ@\".B–Ï¢yòÂÖ+œ®ëîÄQ®6°ûü'{õðl+¢@(cI¶håÙŸ‡9T¸÷Ú@€ƒ#^ÅÂ).ý,ý3^F䀩½êá¶@ïpvÏæ†ÇÜìˆØô>^úöß|ƒ×@šYB ú «6—Ú!§`4ô¯ö¡ã¯Œt€¬¾œÏ‹Èx[%ê26õr±«yGàbÍP˵£ð ¸ÐàÞ[îaî]ÁlLZsã;*lÖ½v‚‚^Ï€+„œ^?~ìÓ “‡eâ»™D(¤¢ñÄËËþ¸/{ñœð­¿ƒïåÍÎ_`5—$²S*ªC´7t5ô\ÀOò=ì ZÐ9Qpï*1gÒ{ÀA6@µ½¶±®«ý£q@^¯IAÁĨ*~Œ¯)Ô²¿ ‘YJ”×–söã.ü@-ó‰Vð‚JwE‰L)•û þŽ–N2³Bæõq>þÞ;sçg¾ÍlRB9Úy|ïÙ þPCðPw㨙¶ ªÀb2ÊùeUBémmûœm(zz|–ΟÄ['ñÎI..ÃI–Ù¸w¸Ø‹O±0ï]6|:À_Q ³Í$Mª½9Üxâìfo!ù äg¨êFóZ Ät€«s–¤•ºÀùëxõ¥‘À’«SÆ1¼äüî7bnaÀ¼Óú=ì@E²u÷‘!Õ¡>sÆ},{-š†…´lÏÖñü×ð½8z„÷~ÛœS‡bnJùnèGm­—®“!èÑ{óŠÌè‘ÎYÖv¨½¾0çÄ&fA΃édÌ-x╊–<ŮDz0Nò³ aý©¾7uÈËRÌ&/µ.ªÇÎÅã²Ùx”ƒ¾Ä\žÇ<Â_UÆŽF[MÔõ¨$æ¤ÍlVCŲŒ®Ü³?óÅÖhl†ÒÒÌܧ¶’A°éóÔeÛïú|/šÄ “\ÚC/çÙÕlô#¯Á§$‹µ"ÃÓÌßT ÖJJ*)δ§òt“]/¹[¬k†³W0±U_qmw8tcÖµ-ûY×ÖË*òöoÜ¿Òѣ㒗ÈQ8v¤íHóŽþª–pQø2Æ98~²q ' si=½˜×­ Kr…‚Ëè4¶í¯)bÍCº›©eæïÐt‘0~ô½ÐëŽ&§ï{£Ý·F™»QüÉ^?ˆÿÓÎÞvJ¡oôú`€¾Ï¯ ,ùdJ2鋹‰§Ûy"&qCV ÌŠ^Ū°ÚUvÔ‡  µª½¥Ú¼ª´ôSâsä?áOŸ?ù+Mò«öoðü"?æÏFInÊs? Ç17!ÜÖÐ0«ó Þ®x/p^¦Wpñ4îãMŒ]…º«æ×nÓ˜ÔP zª]ÛTv˜½zmÈ^¥¬tYÝT=[ÐQït{À͆€¾«Ü >(/«Ô©ÕÌcÌZ~ÚöÌ ¬Ôõuà$½3ø\­¡^€[×,oRúTìVþå%ü‹6,[ÓbÖ”fdгA j—²®¸A[«Àds¹[ƒìÀè$/>`o D1BïüðÂK‹u‹“ #×ú/ÀÓKÿ&ÐÆé endstream endobj 51 0 obj <> stream xÚ¥‘]L[eÇÏië|e•©29=7Sˆ“•™€(ŽIº¹N›(µ-´`)”¥£ô‹R}Zhéé)°;P7>†LDP!‰Ë.t^jBÈŒ.^jÎ’Ì2–“Ýyóó>yŸ<¿ßóâ˜D‚á8žZüîù·Î•?¯P*OæÊw+… ‰¾í«[®G„C˜ð .dŠB,<-!6NIîIE™†Ý{r7ÿ:°›wŸØÍç’!¡ŸÂ$8ŽÚ¬ —¿˜#—S›,&}Ž"³ÔÙdnAAþò˜\^@¾fКôjU#©TQ:­AE%/’gj½–²Y…:ŠjzùèQ³Ùœ£2´äMudzf=¥#Kµ-ZS›VC¾al¤È3*ƒ–ÜcÏÙ;FCS+¥5‘J£FkjÄ0\Rˆ5`¼%‰™‰ÆÎ`ï`eØ>†cìž'zIô·Ø"Щ[£šKÂL ÿUàÅ[ù‚'-‹Xã hè›{çëÄPºÃÓå;ØCÖ#ìÝ~èÄ2 +Ö°w8Þ—ž*Œ88þÆÇ×.àüâ­oóó[Ei>Û Š»š{»¼/XèŠßí$hsâðÎížÎä´î *æaˆAˆ2ÁH€Yâ•Áø ýKœ7ôÐÎ^{¯¨d^½JLÂåaîZüsö𣰠h ÞºÓ\L]¨Ôncge0Ò?Ö?Ü?ý†›§'òØ©Ñéé±ñ•µ/¿„ øÀïôú Ôí÷‚×ߋޣ]°£¶ýòÇÜÜ$uµŠ0Be—â½V£ÖZQê¶ÈÁ /pøÖÑěߥÑÖn <È2äŠ Ä|þÈr0ÎÝIrA.0Ö?šðõG§Ö~» h‰©­—Émì2(Ý\ÔcvéÁ“q¿} ‚ñÐôÐõkü³Ì\ßà/åq@‹¬¾N¥ªÄ>s¹«¥Çfôþ'ºå?’¯B¼öX­å ¯—ºèÉ ÎŒ3ÜG« ¼ÖÑMõ â\¨®-÷Ò3ÆqÓ¥†€ r¡âí‹”g]5Y•ЮqY,:[ ÐÈ?Ÿ/Èü[™4íÒÊ vØÎ£TáϽ ðÛÿcÊŠÄÁŽåÝýχé˜ß¬?[ñ_µ^”Ô¹U3¯ À_ÿ`ªò>¼ÓÒ¡ï,ž‡ÀÇX[ý¿ð:·¶ÉgÝ^N d¬óÙëbá’fôš[¡u2VŽ™[ªù¬(‘^{¸š€W¶Nt¯:WP†š©ü„”è„ã@­}ê‰OÂ4Öik6´U•®«7ø¼9þñ%fÛãöHÓ•Æ@5SRÀšÿ~“ˆÃW¶r‚‚ey·/¡b%R$ù1écÒŸtÿTÊOûãA©”ß8øœ ã endstream endobj 53 0 obj <> stream xÚcd`aa`dd䋊ˆðtuÒvö Ž44‰Øäý ùõáçlÖÒ ?dÈ2ýcþ!Î"÷Ћå?“,ÃGAùŽD¾‘j@‚±^ˆ…‘‘£¬¦ÛÀÀXÏÀÀÈ9¿ ²(3=£DA#YSÁÐÒÒ\GÁÈÀÀRÁ17µ(391OÁ7±$#57±ÈÉQÎOÎL-©TаÉ())°Ò×///×KÌ-ÖË/J·ÓÔQ(Ï,ÉPJ-N-*KMQpËÏ+QðKÌMU€¸]B9çç”–¤)øæ§¤åÅÈtà &FF–Î|?çNYðÃw>ãwõåÌ?$¿¯ýó=º~zgos·dccSƒ|wKoç´†ï1¿c%~‰††ÎÎîɆ©MSå&w÷öNŸþ=ú{´Ä÷äßɽ]“Ú&vKNŸ> stream xÚcd`aa`ddäñóŒõwÒvö ²ñMÓ÷ý:ô³‰õ‡4ÃÆ²L?䘈³È200<‘ùAä]© $W 1°02r”T´ë9çTe¦g”(h$k*ZZšë(X*8æ¦e&'æ)ø&–d¤æ&–99 ÁùÉ™©%• 6%%Vúúåååz‰¹ÅzùEévš: å™% A©Å©Ee©) nùy% ~‰¹© 'ëçü܂ҒÔ"ßü”Ô¢< “ „„˜Y¼÷ÿèàû±¼{ÍÕk¶Ïgü^‹ùû¹Ÿ‚¢Ë:{ 䒒Êuº9²Ø—uì>ºŒãÏTö´Žz¹Œ,¶-}»wìxÔ½…GeM»NÇô ò cî~ÿåíÆ_¾—¼bþ¾î{‚èìY[×ÌžyòȱCÝÏ8¾s«ßø-ø›ÇÆÀ(jSËÌ«fmÜÙ]/·âʹ%{º9^ì¶1—ïVv²ÿÍõ›÷·Ðo1‰ú†îÎî"Žòl+¾»³æ°u”7GÖW´6ÛwWwsüvcã+[ðÃyÖ÷ü©“°ýNœÆ¾†ë:÷ò <<×góðÊq±˜ÏçáüþM ,°Å endstream endobj 57 0 obj <> stream xÚcd`aa`ddäu ˆŒŠÔvöõõ´ Øÿîûõêgëi†2Œ?d™~È1ÿg‘{èÅòŸ‡I–á ˆ|Í"Ÿ €Hu ÁxSˆ…‘‘£´ªÓÀÀXÏÀÀÈ9¿ ²(3=£DA#YSÁÐÒÒ\GÁÈÀÀRÁ17µ(391OÁ7±$#57±ÈÉQÎOÎL-©TаÉ())°Ò×///×KÌ-ÖË/J·ÓÔQ(Ï,ÉPJ-N-*KMQpËÏ+QðKÌMU;]L:çç”–¤)øæ§¤åŘ tž##˳|?ö6.ÿ¾íé¬åßSw0~?rýðkæï;~êˆöôöÍèîá˜Ð>¥^®½;§£¤3¸]¢´³±«»’£vf÷ôÝÝ­MrÝÝm•¿•þœ•h¯éníî⨚Y;Onm÷äÕý3§n]úuÚÖC­ç*ºƒºÛºÛ:;ê:k»Û8¶'•ÛÚ½tÕŒy‹7Ì>Þ=‘cjs_‹\}wgk{e]L¡GL7GaëÂeòÝ3z¦OXÔÓß?»{Z÷]•¹“6,\»vúŒCwlØÝ=£{zÇäÆÐ–î ½¥sj.[¹pËÚâõ‘rÝáñAAAE Õ-|e ~8O6í{Á¶ß SÙå¸XÌçópNâáêáá^Íu“{y?Ï÷‡"¿òÌ” endstream endobj 59 0 obj <> stream xÚ•‘mL[UÇÏ¥åÞ vu´tºõ^ Êx¦âxý@'3¼„ÂVáJ‘—²®£e*™Ìåܨ2 nãeÛ€6®Àôœ²è$1ƨ1&ê>L|Ytb–çâÁÄ‹$~ð›99ÿ'ç<ÿ'Ïï<‡Bj5¢(J›W–SVš[œS‘bÚºyü(éÛ«7:C凑¼—’÷…ÈF•©Þ‡”t„¢hýÁ-]Û¹¥ñŠ¨èš¢Ø¶—±Ét0ÉdJ͵µ¶Ûê­~mŸ’™™‘ȧšL™|v³`o¨µ´ðŇUh¶8”CÔVÛ 8ÚùýOZŽÖCÉÉN§3ÉÒ|2Éf¯ÏŠKä +_*œìmB_`kqð%–fߦNÚ¹¶æÖSÁÎÛê{‹BKç# PÕŠ\ êc( bT‚žE•ˆ AR£cèUE‰!±!—UOÈ=Ún,_‚Á÷)ˆ…G ]RmÔÔÁLŸ"F[*)Æ,Iÿ ýËàñlN‚93Ýy<Þø B" éx2çM²ƒ•è&p‡þE™mÞ!ȼ¡£µò-w Y‚g®À€n² Ò€Ö·Éá_špõÆôè¾4Ñ;¸ã ™µ¼OH\)Ñv<æwM][0â+®ó=Þéq³_ù-Os Œ^Êë!¾NLe`gûgF}Û7Xš_`OCŠ!‘IHî°WÔú¯1 HYîcµò%wŠfáP€šH8û³J~Z ãƒxŠÃWÝ_V.¿(»P ¼8--†D‡~‹‡tH]¼þ‚ wq§±§ËýR[Uic¡b‰î…¨÷¸Yµ÷š¸06; ]Ɔ½d·heµð–äµ X@*plHþÙP3³êÃuÜær™™oxßõÌib¤Fûg©ò÷Vê: •eÙÞú%%ʲªL‹·½o_ûÈ3½UÔ÷K«sãÎ,#™ø¿é!f½b>ÆhÂå•'ª?&÷ 8 —Ö4±úo1äð«~éZ톎”I©•Ú î¾BÔ‘Н¾3à‹¢82œ¿90ŽÙOo•‰Î//ä^Áf\óÁ™a,â‹ìSêEëõWç1 ñ¿ÿD™~"1Üa\Öähgõw—˜g#p›âa­¼®Ìf]¢ÆåÛ*øz »†G|wp”ÄX=å½]öJ¯McfFðgèµn7ötwgØLhP¢Oôyk¼/*–Ï0‘"²›ÄžvÕã*efüÞ›bÿ[zF•vL»«€S°EßëwÚ!dWh™ž?öÎμã™UF ú O£zZ³Ã®ÎÕ„‰­¬ü;Cð] endstream endobj 61 0 obj <> stream xÚcd`aa`ddäóôöðrÓö vô54‰˜Mþ“,Ãjü«žõ‡,Ã9ÆòL?˜ˆ³È200|‘ùAä[© $s„ØÙ…$Û{'–&¥BÉüœÌc=#çü‚Ê¢ÌôŒdMCKKs#KÇÜÔ¢ÌäÄ<ßÄ’ŒÔÜÄ 'G!8?93µ¤RAÃ&£¤¤ÀJ_¿¼¼\/1·X/¿(ÝNSG¡<³$C!(µ8µ¨,5EÁ-?¯DÁ/17Uâ=åZš“Zt#3#c;c3##‹cÁ¾Ÿs»7ÿø¼™ñðæw73ÿLý© ºª£?[îÏs¶œöŽlù?سûÚ×Èýxʶ¦¯oµü_Ö?DÜýóùÏ]6æ?¥æ3þ©K„V¾Ò…?–Ný®8›íwÒtöÍ\›¹—Ìâáb^9.óù<œßŠÓ5Y endstream endobj 63 0 obj <> stream xÚcd`aa`ddäñss‰ rÒvö 2ñÍÊ÷ɰ¬üÙÄúCšá‡ ãY¦rÌ?ÄYdž ‚ÈGü òžˆTŒ¦B ,ŒŒ%íÆzFÎù•E™é% Éš †––æ: F– ޹©E™É‰y ¾‰%©¹‰%@NŽBp~rfjI¥‚†MFII•¾~yy¹^bn±^~Qº¦ŽByfI†BPjqjQYjŠ‚[~^‰‚_bnªÈÍz Â9?· ´$µHÁ7?%µ(è$FC ã„˜Y¼tðýøÞ½éÇüMÛç3~_úùûïŸü¢+Û»så<½U»Ó»9RØ—vŸí>¾œãO/{VwŠ\B Û¡þ›Ý‡ßì>Ä£²)]¥{Æy¾²?œg}ÏŸ:yÛïÄi웸îq¯žÄÃso¯‹ù|Î&"=Gr_ endstream endobj 65 0 obj <> stream xÚTPT×½]xO]—Àòj›Ö·;ŠjèdÄ8*ñ·¨4ˆ®°ÀÊ. ËÂBX‰À²ßBÀá÷ÏvYX@ ÂV ZFS3%-–F“4Sbt¨µ‰­ ÷á³™¾%Õñ“v:óæ›ysï=ß9ç›óH(DAˆö†Ü¿ï­Õ¡aC\ÿ¯Åse-sîìÏû ‚]êÆ2v‰p)BÄË^|E÷tÕ?½äª+ø² À ‚Òe­ ZªIÍÖ*“t2ÿ¸Ù«!!Ákdë‚‚Bd[Ô ­2Nž" “ë’j¹ŽÿQÉÂ5qJ….[æ¿1I§K}}íZ½^(W§j´‰›ÖÈôJ]’ì "]¡ÍTÄ˶kRt²}rµBæ¢è*¡uj†N¡•…iâÚžé‚@ô*Š@GQ4’»'*Ö !Oä^CÑ&´…¢·Ð6´í@»Ðn†ö¡ýè çßB´"ù"%º…f âœÛ7x ´‚O„‘Â>áŒ{›‡¯G±Ç7d9ÍÅx0"î`$À‘WèÎt«Z®MQ·§wuµ·w1b¶ l¿ƒÀú[<>'¡­¦R-¶g-¨€R‘Íð!\±QOêÈc~ “¬òè+û ïBŸÈבLkú¥â¹„ë'ú¸ú.®ræ6Ï…Ðÿ"=ô\†»Ý£‡´tâUÐ PUÒTl> ZêI+©„ÜeL¼ »ÓÉh<¹ ê{¥l+ 6seË{U¥Ðüó–”:.„²{ðš¸2çc?'EN®çÊh§ÿc¿¯Ü²ïrÉçNó§øÓǹܲã_ççœäõ¬ús8ÑÚù—sVoçí£3ø©›vÉQ¾“.—w&:²Þ¨ÿLúkMi€#‰‰p©Á¡$ŒCoÌ`BÏÑú#@o“ïQYrlÍ-6gl¹IÚa»TÙ Ôè¸b½ô$)±¡C%›‹v&‡&e¼ qTÈƒÔ †ïñ \­³S¿£WmVÇ‹í½ÌÀoÇ_© Äì„ÁšgaeVœ0ä=;‰­Ó’¼ ߤyßÌÕ ½Ã# à„óé6¹íxéH†c…‡Óâ2’O¨C (ÚÓûó,`†fª ‚vÄ^Ö\ /ÂnÅK°—ÿCN$ÝÇ’ÒS)É1]|*Ÿ@Zs¶µ£©Ù6 è‰x3äÀJ†#7ª>å>!£ °‹Q‘c¥µæÑóí¦|*ôäVcu¿Oñ£r5™w’ÀÂ)œ0%À{ævÓÏO´á)ÄÅÒfó¥Kµ¦1‚Üe€a)ÞM~ûÇn\«ÚÏp§^x/´`rP8‚„/ SsNgWÔ•¤ §L®ü¹TaFÞŸb´eR2ƒ÷²ûhÎ×Åà£ÊÂ()gyŠ|¡ÔbþUÃŒ¸w—¿/•<,cè®ôvµJ§MIiÓ:¾_E.Ø9bÈåœïý1EÃM#ωçÌ»žgõvù‘èú$#x®¡1º}ùúÕ¦øm?$õ©%ÿõâsž| ö“ý™íq5Ñ QrÍáükq}ÁðD½MI>7ý̓[ñŒ9×òÿå3æ S’ ó´ÿ¿Âñíy~@’[Èÿ™A•ÁήšÏCß´€ÍÂJ/Yþˆóä$~2>^ü±'–<|ˆ=NÏEÒG@nÕ½Ÿ6dƒaè‡që`×èåú>~;&·(ÛäæHCüR«‰ŽÖËϾßS‘³“³wx‰ÛùÐ Vã•Øƒ1‘%&> éTª%§ÍÒVßÕ­îŠaöƒ\® ›WÂxÙ ”¼ b6À`eƒZ‰ÞQüΨ?`_§¡2Ÿ)‚x'¿¤¤  °HÕªªPò«ã§'·FJ!¹.­-£W5pf´`ôt£±5§ê]k(¨õ~Ǭ€´?ç_1V™*òʃw³¥œ™5L˜ÍMÍïUT×–—6ZùEëé¼9!… úŽŒ6eOâÙ-uiå[kaœênºÇ`g7”jÍùPX TœmæÙ.ç—8ð†âÛ)ü²]€oϯŠx¯†4'ù®2RÚ/¹N’~®›8÷Ñ$3®9DnQ%&î„;M î"Å­lh#N©®hõàNÔŽ…S‹¬"ÑTƒh1³PÜ"Z€ïûüúþOÛ endstream endobj 67 0 obj <> stream xÚW TgÚž˜ŒŠA‰ÓÂÖÎЋ—VE´jÕº ^‹+ÖUmDŒ\$CB’rQÈA.á",ˆZ«TÝZk¨œmTê¶ÿ¯nU¶µ­]í¶»ß´{ÎN¸þÿî99“óÍ|ó|ïû>Ï{áéIqDÈÊõCf¬ Ÿäº3ÿ6p­¿¬óâ^ ¸ÉîEŽrÏ{¾H‚ ]W%îOp]_â/Oøž•¢‡  7ƒ‚æ®'iñ±qÊ€é1¯ÌY´èÍ™sƒ‚„È¤Šø˜è}aÑÊ8©,ZÉ/6Écâ¥JmÀô%qJeÒâÙ³Õju`´,9P®ˆ]úÚÌu¼2.`£4YªH‘îX-ß§ X-“ 8ø·B.KR)¥Š€0ùn©bo§x–Çbb ±”¬„ëˆõÄ&h*ÑS!JãM>ÄââE‚%^&^!¦ӈ׉YÄlb1ŸX@,'V+‰UÄjb ñ6J¬%Âx„wˆ Äï‰MD8±™ØBD[‰mÄ»D1݃Äþ•4â´ÀK.px{œ¾&L^ð ô¼íõ¦×1r*YD~-Ú&ê &Q?‰si¬pl˸WÇIÇý÷2ïÛãŽo Å¥>/ú4N‹QÝ5Á%.HÈ-Buti´µÅA:‹¯“éq×¥¬ÐDÚŽ& Ñ—Ýt»¬~¯T‘˜¸§iK‡­¹™/´þ¢¬\æf ¹È_|è"‹ à(U©¯P3*ÈÖç¤á;ÿZí—­3dQÚòÔj¦ŠÊ Ë(0 uƒsžO£ãO<Ÿ>ñ’•‹ª´z§£KŠÊŽBU«)Õ1™k4dâÛ8Æ/3'- 4v4ãX6º‹¥~æÌ|c1P–ªÒZªøûE¸…ú†ÛˆêéâB”e•(Âw‘ÔÏPœkÊJ§IW² áïg£Nê‡ùKF¶ë eUº…)†|“¹˜÷Êñ“9o ¸!rr·è̃)ö2¥x|¿ÕÏJÈÉËÈÉ9i”¬*˜ÉÊ:hjVC,[û“Z@־⫆DYT²?’õÐÄBÙÁcéGròU  ¯àT´‰ìÁN/ìGòg¢Štø~íDzç{N ‡æqgi4‘üª&,a×ÞÐ×ÙWI´YN_­yÿtS½ëoc!ƒSHÃ~%ÚÀÂ6ôHÉÏI¤NÁŸZfIäu¥ïKœïõ,®¢Bq)%(1äWMË#ßݽaë:Wå@Q߇Nô¼óŒs»SòëC-†)g9–<^TÜÂö‰ª &>RÔÌj\-’ô#z^´ tm­PSÅ<z¬ÛÅàçQÊÛBj@ÕÚÖj¦WÔœs,žéCê]ÖºP›\Npý?:Ñdþh!Z†ì4šL>s2J@ùÏÀœè¶ôx¿!Á½Bd¹§$tl„ë4Îà ̇®Àd9ÏIó~г¸Ãm"ú ˜µîµ8Q´šGºDš†7, uÉüñ6þÅö~Ã÷Šób5XyÔ)|sDCp.¡”KB´‘»A§×ç'µ†Ô+x êx^mý…{õ·S Nn"Ѻþܲ8‹±ü›Jó;X®Ð&Ùñ’Û[¿ÜHŠ3ÜQ‡ï…dé‘öH .Ô@Ûsî¨a±sÃFïÄ4D7:e¬4V+÷å"œÅ~"(šø¼/4·tʺ«@!êÆý>®ÆžJ/ÛÕ™TôÛJJòxqet©´ ÎúŸï:wAc¡|Vab¾ª$§(o,òYÀ&c’á`j–lWÛæÒH>„ÁK°ðö¡w’)ɃãC¥9—ŠN½ù;‘ß0q~ÏÁ dBVV»\4òä"òï7DˆFâ†BžPˆ\‡à¦e8…Üf¶‰´Ø ¹i€Ez”Lñ·d@hDÄ–µþÉ o›D¼žµëo$ö¹7ûÑ£{ß Fœãw 9ŽGßœ;ûP˜S’Ây´Ð5‰çŒ@Ùkx ŽdåS(Qt}ó_ð«;§Àr™UWÇ”ƒ½ØÔGM¦êÃfSð%ïÏW²’³xU.öÙ3¨ÕŸ®ý‘‘¤´CwÑÙf*­§ßñ5)e·665²€ ÛÕz‚…®»íhJå2ÈŠy äy¡S¢G‹9?­ŒßrwÑ8Ó_Hª!…Ï¿j#é:}:³…§Zðð;$A>sx‰•è߃Hm|"…·yöŠ>¹|ñÓÏ//Ÿ7cÕÚU¿»Îå<úÂ!èu¢ä>!· hû>Èatp /[“¦ÙÔ‚×¾>gG"ô‚õd²¦¸*CPuÖŠÆÞW ¿ƒ'¿½¿‚|ÛúC;ÐÏìÿÃý¿~HÇ‚¡“é&ÎÀFr…äSþ๤¤+¡q—e'/3ÁŒ™X‚'üõõðn\‚S öF íõ\)Ú¹péÊw®÷}­çÚÕ®MánL¾‚&99Q/’%hm­‚vDþîü7cöÁâÇS¯È³µ¹œdµ•›­QmÝœ)‡`þPw—2]¡Í½Ÿ|t ø¢­(~Õ¥iÔí@ù²Îùðžr$ÄnqbñYòË?As¨xw[u­Å~å-нµtÇiwV$”k( &2t™*AœYQœ k ƒšÿóz4 Mú¹û+ÚµnmH+Š®™Ô*2 Ò ë°r Ýœa6VÃa(8l.8F¡qøSzZðé÷Y¨,ni©¶YŠ¡¨>äó£‚wNhYR±é?n9È77DÎed°+M¾[ß*¯LJrk/È É*jÄÎÚ$_ðhÝå1O¦k÷ÿC”äÌAÒ“j|1¤‡¡Šô±ÙxµÄ¢D~ª üöÄžÓñD,ùn&ò@ß}|çÓ!a7|ÝÓsýÆÕµAaÁ!¬+h¶KuáÃõóZŒ*è§ŠžêùŒŠ9T/%óÌÒ'eiÿ¿¼uÓŠf9Ñê{’3HÁWùo?ùgLÉjP5Õ–†êôS Ù­ð;mø:JòEë ò±‡{`¸…»»WÈ‹íýüÖé¾J°Æ%SRcØÆJ –ÂÛPGé£ýÚB›öZ¡¨Ñ …Oµ§J<¯Ã9‹Ó÷.ã- ª}ºØàbr†3¹—‘hNÂÉcívJ|èºéÔqIBn9ïCÓ(Ƹɱ“X€obºéebÇÈ×D"~PÏ‘à_µPrœ·¢':.CÈípá[y’AËb©MæÑk¡Ší"·áó^FòP}Úé'µŸæ–ÄÁž· Unv f©)#Î{u ~É(A3òº•ÿx¹‚û ”ùúNðï„üâJ‡í¾Éœ_C™È#íxLAVij%”B;ä[ j†rÿ€Š¢N¤ ‰¦{uŽ”‡¼®6dê²Ç^õÃ3øFLëNÅÓñ<ß+Æ}Œ _ÉØ»È§ûxÉUCñៜÃ7BƒkuNßûa_ãÓöäh³ýäÁªLkvU Êö³=›ƒf½Œ)8y`ô‡<Å¢4žðØ<½LGŽBeÓV*’Rµû£[cº˜Gpù”Pb.y¯íñ½‡þ.ùŠ åþL[ô“9³sdòý:ÏEVqZiZ™ÚI ×)SÕú}*ÐRºr…)Â#E…Möz‹ŽÁÑ̲ô²´ê”Vh»¥¶¢º¼±*)qF ·¢-+!±¶HäëçðövzgÆzjåÞc¸šIÿ2º} endstream endobj 69 0 obj <> stream xÚ•V{TeŸawgÄ˨iͬE3„O 4*ã&bXBÅe¹Ã.°ërYˆEx–‹„`a¹è¢\äR ~Š÷r$ ×[©eò•F¦öïï¼þñÍ"N|;{ÞsÞ9ó>Ïóû=¿ù=CR)A’¤}ð–×7ùmY¸Î7(ÈÝzcévœ%tý×O&Ì%„gIá9•³¤Ï¹`ª¸ÿžb]¿s´®óÄe²z!%IZ›Qèââ¶ØÅÅuJž£QÌX Xâî¾|‘ÂÕÅÅ]ᙨL‰KRø†ib”‰aq“ Ø¤ŠˆUjÒóWÆh4jW^Ñét‹ÃS«R¢W-X¤ÐÅjbÊTeÊ6e¤Â[•¤Qø…%*£5/]שÕZ2E᫊T¦$‰µÚ.&\&¿F„6 ÒBCèÄr§S‰iÄtbÁ3‰YÄlâb1—x–`‰µÄz‹ð&| ?Ÿ 6›ˆÍÄb® A6Ä<"è#Éã6ólj%Ó$q’kÒH©Qú@ö²¬‰²¡©³r™¼žžJÒglçÙfO²w4D[Ñt ºñÓ‘`ŽR'ÄG5«[:ÌÍ-¬C/O~fA­‰ Fgäç„fa)–½„çà Øïž…¤HöÍAX‡K™×|Ñ$ô"rúòç¡¡/ñ‹ØÉÛ¾Æ9/Pü#‰ò-4 \cªÀÏf@^îöì¯uÄN}‘¶iÝžÙO «®ÁD?yÅUž™ qñf¨âPUe†–ÖdÈä\)kÀž<ñÚe‘ |Îäåç烞Ž3C5‹~ Z+>nãÊk¡!* ¶©Y¬¥NCÒ»û:Ú‡à&Ï¿Ž±íŠË"Z>ª20b¡.¯|G™±»ûÀq ¿±„.åÀk³D- xÌ“—°õ1»½¶ø,å’auiÌg`(6€aWï6 JéýººäT>Öí^ šŠfÞù×}núž©»|¢ü˜ék«/ažò滯'Ö§ïß_g:ÀBÅÎ=;Ê[Í<ìú«ž¨pTÙá‘)ÉéE!;# uVŠDU¬HÀc^ EF‡ÎK:0¹ÙPÛè¤Ò¬N^ô§²T7ÊÜTe“ÈœôœÿcËøÆ=¢Úò*bØ$*¶eo£±ÛŠAñèž ß“[a7ðh O~gAy¢8á(óÇal¢bsó”Þ'×Aòa¶ÊÊ>Þ}¨½§²èÝ^o­òpç" ¸Z{Ô`˜]¾ÛP\¼wŒ™:SršêC¥ÇÍõH†¦þ:Œ$VŽ`[6Âw| ¥‘Ïhòƒ—ÐRžì»jEΧ¡{Lzæî­a¨€ýP¹=gäÒ£æ ÙT{èXü9'sæøµoNlXçþVàºçµh†A|Ðʓݖ^¬LðæÖ51ÁØ!O‚P:¢;Ú mÕl)Ò"yÿö°¶¦¤ªh+!,¾FåWg@.ÐQ IãÞ“§¦£êÌì¸~ÎZÐ>Ë=t‹9kèAúæòØÛ-_é΂÷@èÙÌ ižAàA/øÑM„<íÇ»#,ÜZÝïSC¯la¼üžêëÿçÕ«ý!ïùàÅá RŸÓ—.œ9ç‡Óþ~oúlòà¬Ù–^BEæ,¨ö¶Dx50ÙxúJWWȆ$ƒ®ª´¬´ ŒtCFC’Z—–Ú€(4MAÓQ0ÊÁÄ•—°Ìi¹X–ìî$e{àä¾Þ#trf ùÅ™Oo ܲjE0?t{ðÔ;mAÆ·‹·¶vІ þŠòúì^°: òwAòW›Ág¤µÌÕ‰FòÇÙÙsÖ牄ÉMU%êówêó!ÖW¥×Öô#ÙugX´ZÃBj¥²¯v@AW®]!;„·%‚aö´CGg$dqx„ÊŠeT;ìáÐc¼ˆ©ì‚ÎŽhÈá°@åDC”² *9‡ÖáGž¦‡mVN{2 mºèŒ÷ è€ðÖO8è}؆ ´5óO~mA ?I„(D2uú -› Y«Í×g„y½Ì{ðÎñæÿ œ*‹JÁTh(2ä–Äš?ªÚl2™¯8AöôÃsݰÃ/óÅN¿Ðü jÔEÙðd›DTk…KLk^E,»zÜ=ºñ"J[Ñð6ÐX²p!žŠ§ ;#‚ë£Æöv:2ްWÇ=å}ÊÍd6¿ç±Æ;àË;wùËçû‚7³ÖTÌEd/xí¾*<ÐFÆTˆÞð3f°Ã"'<;þ6Í@sz†­¹,Q¯¹ÚÔÀ· 6Âò6Ý}Úp‘©½ùE×ø > -_C[瀖'­=A'~¯/£ôj±üPÍ¡™O´xæ„ýñ1"ÞÏ£~ž<~QÖ¿DxbêI]Ù`+„¿SXšvl³Ø¸¼¤ä‚ƒ:H:îi´z8Ìá~yŒvl@ ? ¬…­—ßþôØ'¦}Y¾,Îç&qùõÿõˆµ¶sÄR.Â2b’èö첤?zbšh’Μ;×{aðÜëÿpÝðÆÚõ‘ßž`ÇÚ‡œÅ\äÃ<ølITSþ> êŒMµö¼Ê‚OêÖÍt³ü©:¤”þiÔjîÜ¿b|‡j¨Êƒb±*ëx“ŒòqŽ,ŽØ…–Ñ ZÁ†Anã”a·o©§Ÿ»âUy¦zL ·±žza(æëïÏ['C› ºÂ¢øÂ­ÚX =¡¿Q|÷êÐcž¬r$BˆwÌÄ öÔýé£BñYU`Î> stream xÚµYYoÛF~ï¯Ø·&,í}EËGãºvÛñ‘ÔªÍ:˰ä"ý÷ýf——‡U¶‰ ˜rçøæãììn"ãL&¹bÒ3S‚)Ï™ÒL[Å3Ú2)˜åIˬ“ÐbN¦$sÁ3e™·°1,¨°€w‚ !àÃá®1˜Ð\0ˆÂ Üžžá™kÃ4"Ü °8‹;bx@1±8ž¡GÎ !”X˜â&0+qwŠY»F PÏ@e¯b;¨{øD .š€ gË´ô†!!­´˜6†2,\< bÄýHÊŸ„ò%UÅíÓMñøâö¯ÙÃíŸ_¾²ß_@‰s%ýï/_&'³ùýîtY¼Øý‰ì¹—’Œ…yÅÕœÿø2ŋȫ$c.;ÓåôóüÃ`XŒ(åa?kôH­žÐÅVON„‘fÆQú6¨øÞJ$Gàk£hãG6ÓÒÜŽtë½Ôadãh’ÐDG¢Kz4¦€V6B“äRÃëV!ë¢^zŠQ®ø¨=ù˯ë8p±úú~XÿÊ|ÿýWÇ1ë•2Ñ2½¥7ÒÉÈ›ùZkeƒÕï•·°J2dd„^›E5Þ¾Û¯í¥ÿ9¿6µ¢Dè­Ñ¢}]Û‹¦†Ýzó* ¬\ç [§Xƒ†ó¨‰-jYiEGôV•ÑL ÷é)(WŽÖzTÁ²ŽöºÖˆveDÎ)gOqŒ1‘ ¯T6ÏËZÞynᜃo¯Ê{d“®¤Õ‹I¦±¡É¢1# Už‡7'制9 ñ°9B.Ø2AÛÅùFzÊŠ8'I#¡!>ê<óÒŽæ™%ÍÈHé7Ž .k5üV–R4ÖZSkÊdìD©W•­‘5=‰Ð4^k& àª}%r³Ñ6É隢tžseÚLnîgñ®± §¿ê{ 'î#q1 /\Yë²i'Eì™±¢TLQ‘eåIûH0#7ç6›‘©N|ܰó¬ójëG¾Â@sK ú”t¥'£btå\û_±MX¡p#ÑSq% Æ—óÑ*ßYû,8¯YªpZâwqÊ^–æÉ÷`Ëi™u”øµË(u´*ž¡ã–¡•'I´ª©xN çZ?Iš&ŽÔh5Ç “ Ó#„‘#Ö©ë•ý_Ó´®¼¡ß–yG;×2Ïöø\㹿çôø ËÒºÌyXÄn”ï5GÌVÖEÏx¸^íé@3>}úcIôFŒ/f·ËO úgƒx®™=.–;Ÿ¦¨šñoÓRRŽ'ÓEÍÏ÷ö>œ¾Ú9:.:Ü-7³ìˆéÔÏD€õ8ö­oŠÙݧ% 5Þ^ÜÐîÝ=&’·D0ãlng7Û÷wŸ ÆÇ§ËâË9&ÿxÿóônÁlô9¡ùŽ[kJÐ8‚ëp‡ögŸ ,øå‰ /ާ_Šê¾g mB|Fˆ5!û“½ÃÉEt-;„ˆo'D÷bM!š,xO‹mNˆæMBrԃѢMˆÍ q5!ÇoŽw&ïáú쬇9˜!VŒ@\1"QƒÐ+Ç`LƒÙ$¤z#ªÍHxfÎììmÃ÷䲇5¼FìªÁCI‰´8UòŒ£R¥AÿX×*Ýd¦~=3gó÷÷³›ùmþTTÙUø Uyñœì]Ǻä¦ôÆfSè©L™Ø^°ëëräZÕ“ÁV<~hÃ=<=<þõæA%æ{S²…C×/¾äÅåÅ£LIŒÀ´jšÄ4ÐbÆð3–çÆÔÌL®.Þ¼§Â<êcÆn”'{™‘UÉèN6¢ÉLý0fd‹Y“̇Ë˃½ Ÿ^õÐâþ-|E žÍû‘mKµBÿ¾î-ب&# àÃÑkZ0^ÝV.ß¿%×'¾ÃˆßTWq¶o¶U‰8Þ)Óê*5êattÚ,wÙÜáYŸÝ={wõá*V_—‘°Ù©ÓÛT¤®šŠèòÒê¶9øaÄ´»­m,ÕY¡ìžOÎO¶Ób×™<žol©úÙ¥º*a;ÝÖ´ºmý fl»Ûªš]Óòöêðͯû¯ŽN·zh¼ËåÿÖQx»™dSdz-úïQ¡” 5YåDØVsmàF„\ÓJt¶ß?Þß½:‰“Òvˆ›j%¾ïü#« Šª]¶Õ[3ÔÃèÐk·û¶æã·Ó“·Ç»ä9tøPk­º¯µ†ªµ¢É¶ùhµÖ õ0>ìÚýZÆÇÅöîqœƒ8Ht§ŠÞØñ§w KÇZhÆmƒVKm ƈ_[!ÙŒ¹¸üåôø2úî–ˆÙ!½%bKBpú³Á7iµÒ4àýä7¦p endstream endobj 86 0 obj <]/Size 87/W[1 2 2]/Filter/FlateDecode/Length 226>> stream xÚ%Í»2P…á½D !"!HÄ]ÜÅ-.…‚2Z§P)ŒÉh ¥NcÔJ Òƒ¨Tž#ü³šoþµOq"¢Ýîˆ|ôC$¡ “030 PƒeX…uØ„-Ø=E6‚ ½\]°‡J~û&èVúܳz”ûôL@J¥ªg'ôB2ª”ýUíÌ5 úkPæÿç'ÏœN]Cºøråu•r ëºå*èæÒUTëÉ5¢Û_ר’î®1=|¸ÆõøìšÐKÑU*LÃ,ÌÃ",Á ¬ÁÔav¡p¤·÷ˆ?š¡ ^ endstream endobj startxref 43181 %%EOF glpk-5.0/examples/pbn/pbn.tex0000644000062000006210000002324513766346220015406 0ustar maomkpasswd%* pbn.tex *% \documentclass[11pt,draft]{article} \usepackage{amssymb} \begin{document} \title{Solving Paint-By-Numbers Puzzles with GLPK} \author{Andrew Makhorin {\tt}} \date{August 2011} \maketitle \section{Introduction$^1$} \footnotetext[1]{This section is based on the material from [1].} A {\it paint-by-numbers} puzzle consists of an $m\times n$ grid of pixels (the {\it canvas}) together with $m+n$ {\it cluster-size sequences}, one for each row and column. The goal is to paint the canvas with a picture that satisfies the following constraints: 1. Each pixel must be blank or white. 2. If a row or column has cluster-size sequence $s_1$, $s_2$, \dots, $s_k$, then it must contain $k$ clusters of black pixels---the first with $s_1$ black pixels, the second with $s_2$ black pixels, and so on. It should be noted that ``first'' means ``leftmost'' for rows and ``topmost'' for columns, and that rows and columns need not begin or end with black pixels. \subsubsection*{Example} \def\arraystretch{.8} \begin{center} \begin{tabular}{*{3}{@{$\;\;$}c}c*{10}{@{\ }c}@{}} & & && & &1& &1& & & & & \\ & & && & &1& &1& & & & & \\ & & &&2&1&1&1&1&1&2&3& & \\ & & &&3&2&1&2&1&2&3&4&8&9\\ \\ &3&6&&$\blacksquare$&$\blacksquare$&$\blacksquare$&$\square$& $\blacksquare$&$\blacksquare$&$\blacksquare$&$\blacksquare$& $\blacksquare$&$\blacksquare$\\ &1&4&&$\blacksquare$&$\square$&$\square$&$\square$&$\square$& $\square$&$\blacksquare$&$\blacksquare$&$\blacksquare$&$\blacksquare$\\ 1&1&3&&$\square$&$\square$&$\blacksquare$&$\square$&$\blacksquare$& $\square$&$\square$&$\blacksquare$&$\blacksquare$&$\blacksquare$\\ & &2&&$\square$&$\square$&$\square$&$\square$&$\square$&$\square$& $\square$&$\square$&$\blacksquare$&$\blacksquare$\\ &3&3&&$\square$&$\square$&$\blacksquare$&$\blacksquare$&$\blacksquare$& $\square$&$\square$&$\blacksquare$&$\blacksquare$&$\blacksquare$\\ &1&4&&$\blacksquare$&$\square$&$\square$&$\square$&$\square$&$\square$& $\blacksquare$&$\blacksquare$&$\blacksquare$&$\blacksquare$\\ &2&5&&$\blacksquare$&$\blacksquare$&$\square$&$\square$&$\square$& $\blacksquare$&$\blacksquare$&$\blacksquare$&$\blacksquare$& $\blacksquare$\\ &2&5&&$\blacksquare$&$\blacksquare$&$\square$&$\square$&$\square$& $\blacksquare$&$\blacksquare$&$\blacksquare$&$\blacksquare$& $\blacksquare$\\ &1&1&&$\square$&$\square$&$\square$&$\blacksquare$&$\square$&$\square$& $\square$&$\square$&$\square$&$\blacksquare$\\ & &3&&$\square$&$\square$&$\blacksquare$&$\blacksquare$&$\blacksquare$& $\square$&$\square$&$\square$&$\square$&$\square$\\ \end{tabular} \end{center} \def\arraystretch{1} \section{Solving a puzzle} The Paint-By-Numbers puzzle can be formulated as a 0-1 integer feasibility problem. The formulation used in GLPK was proposed in [1]. For solving puzzles there are used two components, which both are coded in the GNU MathProg modeling language [2]: the model section and the data section. The model section is common for all puzzles and placed in file \verb|pbn.mod|. This file is included in the GLPK distribution and can be found in subdirectory \verb|examples/pbn|. To solve a particular puzzle the user only needs to prepare the data section, which defines input data to the puzzle. The data section for the example puzzle from the previous section may look like follows (here \verb|m| is the number of rows, and \verb|n| is the number of columns): \begin{footnotesize} \begin{verbatim} data; param m := 10; param n := 10; param row : 1 2 3 := 1 3 6 . 2 1 4 . 3 1 1 3 4 2 . . 5 3 3 . 6 1 4 . 7 2 5 . 8 2 5 . 9 1 1 . 10 3 . . ; param col : 1 2 3 4 := 1 2 3 . . 2 1 2 . . 3 1 1 1 1 4 1 2 . . 5 1 1 1 1 6 1 2 . . 7 2 3 . . 8 3 4 . . 9 8 . . . 10 9 . . . ; end; \end{verbatim} \end{footnotesize} \newpage Let the data section for a puzzle be placed in file \verb|foo.dat|. Then to solve the puzzle the user should enter the following command: \begin{verbatim} glpsol --minisat -m pbn.mod -d foo.dat \end{verbatim} \noindent This command invokes \verb|glpsol|, the GLPK LP/MIP stand-alone solver, which reads the model section from file \verb|pbn.mod|, the data section from file \verb|foo.dat|, translates them to an internal representation, and solves the resulting 0-1 integer feasibility problem. The option \verb|--minisat| tells \verb|glpsol| to translate the feasibility problem to a CNF satisfiability problem and then use the MiniSat solver [3] to solve it. If a solution to the puzzle has been found, that is indicated by the message \verb|SATISFIABLE|, \verb|glpsol| prints the solution to the standard output (terminal), writes it to file \verb|solution.ps| in the PostScript format, and also writes it to file \verb|solution.dat| in the form of MathProg data section, which can be used later to check for multiple solutions, if necessary (for details see the next section). The message \verb|UNSATISFIABLE| means that the puzzle has no solution. Usually the time taken to solve a puzzle of moderate size (up to 50 rows and columns) varies from several seconds to several minutes. However, hard or large puzzles may require much more time. Data sections for some example puzzles included in the GLPK distribution can be found in subdirectory \verb|examples/pbn|. \section{Checking for multiple solutions} Sometimes the user may be interested to know if the puzzle has exactly one (unique) solution or it has multiple solutions. To check that the user should solve the puzzle as explained above in the previous section and then enter the following command: \begin{verbatim} glpsol --minisat -m pbn.mod -d foo.dat -d solution.dat \end{verbatim} \noindent In this case \verb|glpsol| reads an additional data section from file \verb|solution.dat|, which contains the previously found solution, activates an additional constraint in the model section to forbid finding the solution specified in the additional data section, and attempts to find another solution. The message \verb|UNSATISFIABLE| reported by \verb|glpsol| will mean that the puzzle has a unique solution, while the message \verb|SATISFIABLE| will mean that the puzzle has at least two different solutions. \newpage \section{Solution times} The table on the next page shows solution times on a sample set of the paint-by-numbers puzzles from the \verb|| website. This sample set was used in the survey [4] to compare efficiency of existing PBN solvers. The authors of some puzzles from the sample set have given permission for their puzzles to be freely redistributed as long as the original attribution and copyright statement are retained. In the table these puzzles are marked by an asterisk (*). The files containing the MathProg data sections for these puzzles are included in the GLPK distribution and can be found in subdirectory \verb|examples/pbn|. All runs were performed on Intel Pentium 4 (CPU 3GHz, 2GB of RAM). The C compiler used was GCC 3.4.4 with default optimization options. The column `Sol.Time' shows the time, in seconds, taken by the \verb|glpsol| solver to find a solution to corresponding puzzle. The column `Chk.Time' shows the time, in seconds, taken by \verb|glpsol| to check for multiple solutions, i.e. either to prove that the puzzle has a unique solution or find another solution to the puzzle. Both these times do not include the time used to translate the MathProg model and data sections into an internal MIP representation, but include the time used to translate the 0-1 feasibility problem to a CNF satisfiability problem. \begin{thebibliography}{10} \bibitem{1} Robert A. Bosch, ``Painting by Numbers'', 2000.\\ \verb||. \bibitem{2} GLPK: Modeling Language GNU MathProg. Language Reference. (This document is included in the GLPK distribution and can be found in subdirectory \verb|doc|.) \bibitem{3} Niklas E\'en, Niklas S\"orensson, ``An Extensible SAT-solver'', Chalmers University of Technology, Sweden. \verb||. \bibitem{4} Jan Wolter, ``Survey of Paint-by-Number Puzzle Solvers''.\\ \verb||. \end{thebibliography} \newpage \begin{table} \caption{Solution times on the sample set of puzzles from [4]} \begin{center} \begin{tabular}{@{}lllcrr@{}} \hline \multicolumn{2}{c}{Puzzle}&Size&Notes&Sol.Time, s&Chk.Time, s\\ \hline \#1&Dancer* &$10\times 5$&L&$<1$&$<1$\\ \#6&Cat* &$20\times 20$&L&$<1$&$<1$\\ \#21&Skid* &$25\times 14$&L, B&$<1$&$<1$\\ \#27&Bucks* &$23\times 27$&B&$<1$&$<1$\\ \#23&Edge* &$11\times 10$&&$<1$&$<1$\\ \#2413&Smoke &$20\times 20$&&$<1$&$<1$\\ \#16&Knot* &$34\times 34$&L&1&1\\ \#529&Swing* &$45\times 45$&L&1&1\\ \#65&Mum* &$40\times 34$&&1&1\\ \#7604&DiCap &$55\times 55$&&10&10\\ \#1694&Tragic &$50\times 45$&&3&3\\ \#1611&Merka &$60\times 55$&B&4&4\\ \#436&Petro* &$35\times 40$&&1&1\\ \#4645&M\&M &$70\times 50$&B&5&6\\ \#3541&Signed &$50\times 60$&&7&7\\ \#803&Light* &$45\times 50$&B&1&1\\ \#6574&Forever*&$25\times 25$&&1&1\\ \#2040&Hot &$60\times 55$&&6&6\\ \#6739&Karate &$40\times 40$&M&2&2\\ \#8098&9-Dom* &$19\times 19$&&1&2\\ \#2556&Flag &$45\times 65$&M, B&2&2\\ \#2712&Lion &$47\times 47$&M&11&12\\ \#10088&Marley &$63\times 52$&M&135&226\\ \#9892&Nature &$40\times 50$&M&850&1053\\ \hline \end{tabular} \begin{tabular}{@{}lp{102mm}@{}} *&Puzzle designer has given permission to redistribute the puzzle.\\ L&Puzzle is line solvable. That is, it can be solved one line at a time.\\ B&Puzzle contains blank rows or columns.\\ M&Puzzle has multiple solutions.\\ \end{tabular} \end{center} \end{table} \end{document} glpk-5.0/examples/pbn/petro.dat0000644000062000006210000000610713766346220015726 0ustar maomkpasswd/* petro.dat */ /*********************************************************************** * Web Paint-by-Number Puzzle #436 from . * Copyright (C) 2006 by Jan Wolter. Used by permission. * * Old Stone Face * * created by Jan Wolter * Jun 17, 2006 * * Encoded in GNU MathProg by Andrew Makhorin . ***********************************************************************/ data; param m := 35; param n := 40; param row : 1 2 3 4 5 6 7 8 9 := 1 2 2 . . . . . . . 2 2 3 2 . . . . . . 3 3 3 3 2 . . . . . 4 3 3 3 3 . . . . . 5 2 3 3 3 3 2 . . . 6 3 3 3 3 3 3 . . . 7 4 2 3 2 2 4 . . . 8 4 2 2 2 2 3 1 . . 9 3 1 2 2 2 3 3 . . 10 3 2 2 2 2 2 4 . . 11 3 2 15 2 4 . . . . 12 5 19 4 . . . . . . 13 6 4 3 3 . . . . . 14 6 4 4 . . . . . . 15 2 4 6 2 . . . . . 16 2 2 3 3 3 2 . . . 17 9 2 2 2 3 9 . . . 18 10 2 2 2 2 2 10 . . 19 4 2 3 3 2 2 3 2 5 20 2 5 2 4 2 . . . . 21 5 3 2 2 5 . . . . 22 6 3 2 3 7 . . . . 23 6 8 9 7 . . . . . 24 4 8 7 5 . . . . . 25 4 . . . . . . . . 26 2 . . . . . . . . 27 2 . . . . . . . . 28 14 . . . . . . . . 29 16 . . . . . . . . 30 3 3 . . . . . . . 31 2 2 . . . . . . . 32 2 2 . . . . . . . 33 4 4 . . . . . . . 34 16 . . . . . . . . 35 12 . . . . . . . . ; param col : 1 2 3 4 5 6 7 := 1 1 . . . . . . 2 3 2 . . . . . 3 2 3 3 . . . . 4 3 3 3 . . . . 5 3 3 3 3 . . . 6 4 2 2 2 . . . 7 3 3 2 3 . . . 8 3 2 2 2 . . . 9 3 2 6 . . . . 10 2 9 . . . . . 11 2 3 3 . . . . 12 4 4 3 2 4 . . 13 7 2 5 2 6 . . 14 12 2 3 2 3 2 . 15 3 1 2 2 2 3 . 16 2 2 3 2 2 2 . 17 6 2 6 2 2 2 . 18 12 4 3 2 2 . . 19 12 2 2 2 . . . 20 2 6 2 . . . . 21 2 6 5 2 . . . 22 10 9 2 2 . . . 23 12 3 3 2 2 . . 24 6 2 2 2 2 2 2 25 2 2 3 2 2 2 . 26 4 3 2 2 2 3 . 27 7 3 3 2 3 2 . 28 5 3 5 2 6 . . 29 4 3 3 3 4 . . 30 3 5 3 . . . . 31 3 9 . . . . . 32 4 2 6 . . . . 33 4 2 2 2 . . . 34 4 2 2 3 . . . 35 3 2 2 3 . . . 36 3 3 3 . . . . 37 3 3 3 . . . . 38 4 3 3 . . . . 39 2 3 3 . . . . 40 2 1 . . . . . ; end; glpk-5.0/examples/pbn/README0000644000062000006210000000044013766346220014755 0ustar maomkpasswdThis subdirectory contains examples, which illustrate how to use GLPK and the GNU MathProg modeling language for practical solving the paint-by-numbers puzzle. For details please see the document "Solving Paint-By-Numbers Puzzles with GLPK" included in this subdirectory (file pbn.pdf). glpk-5.0/examples/pbn/skid.dat0000644000062000006210000000253713766346220015532 0ustar maomkpasswd/* skid.dat */ /*********************************************************************** * Web Paint-by-Number Puzzle #21 from . * Copyright (C) 2004 by Jan Wolter. Used by permission. * * Slippery Conditions * * created by Jan Wolter * Apr 4, 2004 * * Encoded in GNU MathProg by Andrew Makhorin . ***********************************************************************/ data; param m := 25; param n := 14; param row : 1 2 3 := 1 9 . . 2 1 1 . 3 1 1 1 4 1 3 1 5 13 . . 6 13 . . 7 13 . . 8 13 . . 9 2 2 . 10 2 2 . 11 . . . 12 2 2 . 13 2 2 . 14 2 2 . 15 2 2 . 16 2 2 . 17 2 2 . 18 2 2 . 19 2 2 . 20 2 2 . 21 2 2 . 22 2 2 . 23 2 2 . 24 2 2 . 25 2 2 . ; param col : 1 2 3 4 5 := 1 2 . . . . 2 4 6 . . . 3 9 4 4 2 . 4 1 6 2 6 . 5 1 5 2 . . 6 1 6 . . . 7 1 5 . . . 8 1 4 . . . 9 1 4 . . . 10 1 4 2 . . 11 1 4 6 . . 12 1 6 4 4 2 13 9 2 6 . . 14 4 2 . . . ; end; glpk-5.0/examples/pbn/swing.dat0000644000062000006210000001232213766346220015720 0ustar maomkpasswd/* swing.dat */ /*********************************************************************** * Web Paint-by-Number Puzzle #529 from . * Copyright (C) 2006 by Jan Wolter. Used by permission. * * Swing * * created by Jan Wolter * Sep 28, 2006 * * Encoded in GNU MathProg by Andrew Makhorin . ***********************************************************************/ data; param m := 45; param n := 45; param row : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 := 1 7 1 1 1 1 1 . . . . . . . . 2 3 1 3 1 4 1 4 1 5 1 5 1 2 . 3 1 1 1 3 1 4 1 4 1 5 1 5 1 2 4 2 1 2 1 1 1 1 6 2 . . . . . 5 3 30 1 5 . . . . . . . . . . 6 1 5 8 1 1 7 1 1 3 . . . . . 7 3 4 8 1 5 1 2 . . . . . . . 8 3 20 6 6 . . . . . . . . . . 9 3 3 7 2 5 1 . . . . . . . . 10 3 3 1 1 9 1 1 5 6 . . . . . 11 2 3 8 1 3 4 2 . . . . . . . 12 5 3 1 10 4 5 2 . . . . . . . 13 1 2 3 8 4 6 . . . . . . . . 14 2 2 3 11 10 . . . . . . . . . 15 2 2 3 10 7 . . . . . . . . . 16 2 3 1 7 12 2 . . . . . . . . 17 2 3 1 4 11 2 . . . . . . . . 18 4 1 2 1 11 2 . . . . . . . . 19 9 1 2 9 . . . . . . . . . . 20 6 2 1 4 11 . . . . . . . . . 21 2 5 1 2 6 6 . . . . . . . . 22 6 2 4 8 4 . . . . . . . . . 23 4 2 16 1 . . . . . . . . . . 24 2 2 15 2 . . . . . . . . . . 25 3 2 15 4 . . . . . . . . . . 26 3 3 13 4 . . . . . . . . . . 27 4 12 9 . . . . . . . . . . . 28 1 9 10 . . . . . . . . . . . 29 2 1 17 7 2 . . . . . . . . . 30 2 2 8 3 8 2 . . . . . . . . 31 2 3 6 3 8 2 . . . . . . . . 32 2 4 5 4 7 2 . . . . . . . . 33 2 5 5 4 6 . . . . . . . . . 34 4 4 5 4 9 . . . . . . . . . 35 1 4 6 4 4 . . . . . . . . . 36 4 3 6 4 3 2 . . . . . . . . 37 2 1 2 7 4 4 2 . . . . . . . 38 2 2 2 9 5 5 2 . . . . . . . 39 2 2 2 10 6 6 . . . . . . . . 40 3 2 1 9 18 . . . . . . . . . 41 8 4 23 . . . . . . . . . . . 42 1 2 1 2 2 1 1 1 2 . . . . . 43 2 1 4 2 1 4 1 5 1 3 1 2 . . 44 2 1 5 4 4 1 5 1 3 1 2 . . . 45 1 10 1 1 1 . . . . . . . . . ; param col : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 := 1 7 1 1 1 1 1 . . . . . . . . 2 2 2 4 1 4 1 5 1 4 1 4 1 2 . 3 3 1 4 1 4 1 14 4 1 2 . . . . 4 1 1 5 1 2 3 4 1 . . . . . . 5 3 13 1 10 . . . . . . . . . . 6 1 9 4 . . . . . . . . . . . 7 6 7 2 2 . . . . . . . . . . 8 8 4 1 4 . . . . . . . . . . 9 2 8 3 2 5 3 . . . . . . . . 10 10 1 3 7 2 . . . . . . . . . 11 8 6 2 8 1 2 . . . . . . . . 12 1 1 2 2 8 1 1 . . . . . . . 13 2 1 1 1 2 1 3 1 3 3 1 . . . 14 2 1 1 1 5 4 2 1 . . . . . . 15 2 1 1 1 1 7 2 1 . . . . . . 16 2 1 1 2 9 1 2 1 . . . . . . 17 4 6 12 1 3 . . . . . . . . . 18 16 13 3 2 . . . . . . . . . . 19 12 21 2 . . . . . . . . . . . 20 2 13 23 . . . . . . . . . . . 21 2 14 19 . . . . . . . . . . . 22 2 14 20 2 . . . . . . . . . . 23 2 13 7 2 8 2 . . . . . . . . 24 12 8 1 7 2 . . . . . . . . . 25 5 1 1 1 2 8 1 5 2 . . . . . 26 2 1 1 1 9 1 1 4 . . . . . . 27 2 1 1 1 6 1 3 5 . . . . . . 28 2 2 1 5 6 2 . . . . . . . . 29 2 1 3 1 3 7 3 2 . . . . . . 30 2 3 2 1 1 2 4 4 2 . . . . . 31 2 2 1 1 2 3 1 8 2 . . . . . 32 9 3 1 7 2 . . . . . . . . . 33 12 4 1 6 2 . . . . . . . . . 34 7 4 1 2 5 . . . . . . . . . 35 2 6 6 5 6 . . . . . . . . . 36 8 8 6 3 . . . . . . . . . . 37 3 10 8 4 2 . . . . . . . . . 38 5 11 9 5 2 . . . . . . . . . 39 3 1 12 16 2 . . . . . . . . . 40 3 1 12 16 . . . . . . . . . . 41 5 2 13 21 . . . . . . . . . . 42 6 1 3 3 1 1 . . . . . . . . 43 5 1 3 1 3 1 1 2 1 4 1 3 1 3 44 5 1 3 1 3 1 4 1 4 1 3 1 3 . 45 1 1 1 1 1 1 . . . . . . . . ; end; glpk-5.0/examples/pentomino.mod0000644000062000006210000002446413766346220016043 0ustar maomkpasswd/* PENTOMINO, a geometric placement puzzle */ /* Written in GNU MathProg by Andrew Makhorin */ /* A pentomino is a plane geometric figure by joining five equal squares edge to edge. It is a polyomino with five cells. Pentominoes were defined by Prof. Solomon W. Golomb in his book "Polyominoes: Puzzles, Patterns, Problems, and Packings." There are twelve pentominoes, not counting rotations and reflections as distinct: +---+ | | +---+ +---+ +---+ | | | | | | +---+---+ +---+ +---+ +---+ | | | | | | | | | +---+---+---+ +---+ +---+ +---+---+ | | | | | | | | | | +---+---+ +---+ +---+---+ +---+---+ | | | | | | | | | +---+ +---+ +---+---+ +---+ F I L N +---+---+ +---+---+---+ +---+ | | | | | | | | | +---+---+ +---+---+---+ +---+ +---+ +---+ | | | | | | | | | | | +---+---+ +---+ +---+---+---+ +---+---+---+ | | | | | | | | | | | | +---+ +---+ +---+---+---+ +---+---+---+ P T U V +---+ | | +---+ +---+ +---+---+ +---+---+ | | | | | | | | | | +---+---+ +---+---+---+ +---+---+ +---+---+ | | | | | | | | | | | +---+---+---+ +---+---+---+ +---+ +---+---+ | | | | | | | | | | +---+---+ +---+ +---+ +---+---+ W X Y Z A classic pentomino puzzle is to tile a given outline, i.e. cover it without overlap and without gaps. Each of 12 pentominoes has an area of 5 unit squares, so the outline must have area of 60 units. Note that it is allowed to rotate and reflect the pentominoes. (From Wikipedia, the free encyclopedia.) */ set A; check card(A) = 12; /* basic set of pentominoes */ set B{a in A}; /* B[a] is a set of distinct versions of pentomino a obtained by its rotations and reflections */ set C := setof{a in A, b in B[a]} b; check card(C) = 63; /* set of distinct versions of all pentominoes */ set D{c in C}, within {0..4} cross {0..4}; /* D[c] is a set of squares (i,j), relative to (0,0), that constitute a distinct version of pentomino c */ param m, default 6; /* number of rows in the outline */ param n, default 10; /* number of columns in the outline */ set R, default {1..m} cross {1..n}; /* set of squares (i,j), relative to (1,1), of the outline to be tiled with the pentominoes */ check card(R) = 60; /* the outline must have exactly 60 squares */ set S := setof{c in C, i in 1..m, j in 1..n: forall{(ii,jj) in D[c]} ((i+ii,j+jj) in R)} (c,i,j); /* set of all possible placements, where triplet (c,i,j) means that the base square (0,0) of a distinct version of pentomino c is placed at square (i,j) of the outline */ var x{(c,i,j) in S}, binary; /* x[c,i,j] = 1 means that placement (c,i,j) is used in the tiling */ s.t. use{a in A}: sum{(c,i,j) in S: substr(c,1,1) = a} x[c,i,j] = 1; /* every pentomino must be used exactly once */ s.t. cov{(i,j) in R}: sum{(c,ii,jj) in S: (i-ii, j-jj) in D[c]} x[c,ii,jj] = 1; /* every square of the outline must be covered exactly once */ /* this is a feasibility problem, so no objective is needed */ solve; for {i in 1..m} { for {j in 1..n} { for {0..0: (i,j) in R} { for {(c,ii,jj) in S: (i-ii,j-jj) in D[c] and x[c,ii,jj]} printf " %s", substr(c,1,1); } for {0..0: (i,j) not in R} printf " ."; } printf "\n"; } data; /* These data correspond to a puzzle from the book "Pentominoes" by Jon Millington */ param m := 8; param n := 15; set R : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 := 1 - - - - - - - + - - - - - - - 2 - - - - - - + + + - - - - - - 3 - - - - - + + + + + - - - - - 4 - - - - + + + - + + + - - - - 5 - - - + + + + - + + + + - - - 6 - - + + + + + - + + + + + - - 7 - + + + + + + - + + + + + + - 8 + + + + + + + + + + + + + + + ; /* DO NOT CHANGE ANY DATA BELOW! */ set A := F, I, L, N, P, T, U, V, W, X, Y, Z; set B[F] := F1, F2, F3, F4, F5, F6, F7, F8; set B[I] := I1, I2; set B[L] := L1, L2, L3, L4, L5, L6, L7, L8; set B[N] := N1, N2, N3, N4, N5, N6, N7, N8; set B[P] := P1, P2, P3, P4, P5, P6, P7, P8; set B[T] := T1, T2, T3, T4; set B[U] := U1, U2, U3, U4; set B[V] := V1, V2, V3, V4; set B[W] := W1, W2, W3, W4; set B[X] := X; set B[Y] := Y1, Y2, Y3, Y4, Y5, Y6, Y7, Y8; set B[Z] := Z1, Z2, Z3, Z4; set D[F1] : 0 1 2 := 0 - + + 1 + + - 2 - + - ; set D[F2] : 0 1 2 := 0 - + - 1 + + + 2 - - + ; set D[F3] : 0 1 2 := 0 - + - 1 - + + 2 + + - ; set D[F4] : 0 1 2 := 0 + - - 1 + + + 2 - + - ; set D[F5] : 0 1 2 := 0 + + - 1 - + + 2 - + - ; set D[F6] : 0 1 2 := 0 - - + 1 + + + 2 - + - ; set D[F7] : 0 1 2 := 0 - + - 1 + + - 2 - + + ; set D[F8] : 0 1 2 := 0 - + - 1 + + + 2 + - - ; set D[I1] : 0 := 0 + 1 + 2 + 3 + 4 + ; set D[I2] : 0 1 2 3 4 := 0 + + + + + ; set D[L1] : 0 1 := 0 + - 1 + - 2 + - 3 + + ; set D[L2] : 0 1 2 3 := 0 + + + + 1 + - - - ; set D[L3] : 0 1 := 0 + + 1 - + 2 - + 3 - + ; set D[L4] : 0 1 2 3 := 0 - - - + 1 + + + + ; set D[L5] : 0 1 := 0 - + 1 - + 2 - + 3 + + ; set D[L6] : 0 1 2 3 := 0 + - - - 1 + + + + ; set D[L7] : 0 1 := 0 + + 1 + - 2 + - 3 + - ; set D[L8] : 0 1 2 3 := 0 + + + + 1 - - - + ; set D[N1] : 0 1 := 0 + - 1 + - 2 + + 3 - + ; set D[N2] : 0 1 2 3 := 0 - + + + 1 + + - - ; set D[N3] : 0 1 := 0 + - 1 + + 2 - + 3 - + ; set D[N4] : 0 1 2 3 := 0 - - + + 1 + + + - ; set D[N5] : 0 1 := 0 - + 1 - + 2 + + 3 + - ; set D[N6] : 0 1 2 3 := 0 + + - - 1 - + + + ; set D[N7] : 0 1 := 0 - + 1 + + 2 + - 3 + - ; set D[N8] : 0 1 2 3 := 0 + + + - 1 - - + + ; set D[P1] : 0 1 := 0 + + 1 + + 2 + - ; set D[P2] : 0 1 2 := 0 + + + 1 - + + ; set D[P3] : 0 1 := 0 - + 1 + + 2 + + ; set D[P4] : 0 1 2 := 0 + + - 1 + + + ; set D[P5] : 0 1 := 0 + + 1 + + 2 - + ; set D[P6] : 0 1 2 := 0 - + + 1 + + + ; set D[P7] : 0 1 := 0 + - 1 + + 2 + + ; set D[P8] : 0 1 2 := 0 + + + 1 + + - ; set D[T1] : 0 1 2 := 0 + + + 1 - + - 2 - + - ; set D[T2] : 0 1 2 := 0 - - + 1 + + + 2 - - + ; set D[T3] : 0 1 2 := 0 - + - 1 - + - 2 + + + ; set D[T4] : 0 1 2 := 0 + - - 1 + + + 2 + - - ; set D[U1] : 0 1 2 := 0 + - + 1 + + + ; set D[U2] : 0 1 := 0 + + 1 + - 2 + + ; set D[U3] : 0 1 2 := 0 + + + 1 + - + ; set D[U4] : 0 1 := 0 + + 1 - + 2 + + ; set D[V1] : 0 1 2 := 0 - - + 1 - - + 2 + + + ; set D[V2] : 0 1 2 := 0 + - - 1 + - - 2 + + + ; set D[V3] : 0 1 2 := 0 + + + 1 + - - 2 + - - ; set D[V4] : 0 1 2 := 0 + + + 1 - - + 2 - - + ; set D[W1] : 0 1 2 := 0 - - + 1 - + + 2 + + - ; set D[W2] : 0 1 2 := 0 + - - 1 + + - 2 - + + ; set D[W3] : 0 1 2 := 0 - + + 1 + + - 2 + - - ; set D[W4] : 0 1 2 := 0 + + - 1 - + + 2 - - + ; set D[X] : 0 1 2 := 0 - + - 1 + + + 2 - + - ; set D[Y1] : 0 1 := 0 + - 1 + - 2 + + 3 + - ; set D[Y2] : 0 1 2 3 := 0 + + + + 1 - + - - ; set D[Y3] : 0 1 := 0 - + 1 + + 2 - + 3 - + ; set D[Y4] : 0 1 2 3 := 0 - - + - 1 + + + + ; set D[Y5] : 0 1 := 0 - + 1 - + 2 + + 3 - + ; set D[Y6] : 0 1 2 3 := 0 - + - - 1 + + + + ; set D[Y7] : 0 1 := 0 + - 1 + + 2 + - 3 + - ; set D[Y8] : 0 1 2 3 := 0 + + + + 1 - - + - ; set D[Z1] : 0 1 2 := 0 - + + 1 - + - 2 + + - ; set D[Z2] : 0 1 2 := 0 + - - 1 + + + 2 - - + ; set D[Z3] : 0 1 2 := 0 + + - 1 - + - 2 - + + ; set D[Z4] : 0 1 2 := 0 - - + 1 + + + 2 + - - ; end; glpk-5.0/examples/plan.lp0000644000062000006210000000234613766346220014614 0ustar maomkpasswd\* plan.lp *\ Minimize value: .03 bin1 + .08 bin2 + .17 bin3 + .12 bin4 + .15 bin5 + .21 alum + .38 silicon Subject To yield: bin1 + bin2 + bin3 + bin4 + bin5 + alum + silicon = 2000 fe: .15 bin1 + .04 bin2 + .02 bin3 + .04 bin4 + .02 bin5 + .01 alum + .03 silicon <= 60 cu: .03 bin1 + .05 bin2 + .08 bin3 + .02 bin4 + .06 bin5 + .01 alum <= 100 mn: .02 bin1 + .04 bin2 + .01 bin3 + .02 bin4 + .02 bin5 <= 40 mg: .02 bin1 + .03 bin2 + .01 bin5 <= 30 al: .70 bin1 + .75 bin2 + .80 bin3 + .75 bin4 + .80 bin5 + .97 alum >= 1500 si1: .02 bin1 + .06 bin2 + .08 bin3 + .12 bin4 + .02 bin5 + .01 alum + .97 silicon >= 250 si2: .02 bin1 + .06 bin2 + .08 bin3 + .12 bin4 + .02 bin5 + .01 alum + .97 silicon <= 300 Bounds bin1 <= 200 bin2 <= 2500 400 <= bin3 <= 800 100 <= bin4 <= 700 bin5 <= 1500 End \* eof *\ glpk-5.0/examples/plan.mod0000644000062000006210000000164113766346220014755 0ustar maomkpasswd/* plan.mod */ var bin1, >= 0, <= 200; var bin2, >= 0, <= 2500; var bin3, >= 400, <= 800; var bin4, >= 100, <= 700; var bin5, >= 0, <= 1500; var alum, >= 0; var silicon, >= 0; minimize value: .03 * bin1 + .08 * bin2 + .17 * bin3 + .12 * bin4 + .15 * bin5 + .21 * alum + .38 * silicon; subject to yield: bin1 + bin2 + bin3 + bin4 + bin5 + alum + silicon = 2000; fe: .15 * bin1 + .04 * bin2 + .02 * bin3 + .04 * bin4 + .02 * bin5 + .01 * alum + .03 * silicon <= 60; cu: .03 * bin1 + .05 * bin2 + .08 * bin3 + .02 * bin4 + .06 * bin5 + .01 * alum <= 100; mn: .02 * bin1 + .04 * bin2 + .01 * bin3 + .02 * bin4 + .02 * bin5 <= 40; mg: .02 * bin1 + .03 * bin2 + .01 * bin5 <= 30; al: .70 * bin1 + .75 * bin2 + .80 * bin3 + .75 * bin4 + .80 * bin5 + .97 * alum >= 1500; si: 250 <= .02 * bin1 + .06 * bin2 + .08 * bin3 + .12 * bin4 + .02 * bin5 + .01 * alum + .97 * silicon <= 300; end; /* eof */ glpk-5.0/examples/plan.mps0000644000062000006210000000432613766346220015000 0ustar maomkpasswd*000000001111111111222222222233333333334444444444555555555566 *234567890123456789012345678901234567890123456789012345678901 NAME PLAN ROWS N VALUE E YIELD L FE L CU L MN L MG G AL L SI COLUMNS BIN1 VALUE .03000 YIELD 1.00000 FE .15000 CU .03000 MN .02000 MG .02000 AL .70000 SI .02000 BIN2 VALUE .08000 YIELD 1.00000 FE .04000 CU .05000 MN .04000 MG .03000 AL .75000 SI .06000 BIN3 VALUE .17000 YIELD 1.00000 FE .02000 CU .08000 MN .01000 AL .80000 SI .08000 BIN4 VALUE .12000 YIELD 1.00000 FE .04000 CU .02000 MN .02000 AL .75000 SI .12000 BIN5 VALUE .15000 YIELD 1.00000 FE .02000 CU .06000 MN .02000 MG .01000 AL .80000 SI .02000 ALUM VALUE .21000 YIELD 1.00000 FE .01000 CU .01000 AL .97000 SI .01000 SILICON VALUE .38000 YIELD 1.00000 FE .03000 SI .97000 RHS RHS1 YIELD 2000.00000 FE 60.00000 CU 100.00000 MN 40.00000 SI 300.00000 MG 30.00000 AL 1500.00000 RANGES RNG1 SI 50.00000 BOUNDS UP BND1 BIN1 200.00000 UP BIN2 2500.00000 LO BIN3 400.00000 UP BIN3 800.00000 LO BIN4 100.00000 UP BIN4 700.00000 UP BIN5 1500.00000 ENDATA glpk-5.0/examples/planarity.mod0000644000062000006210000000701013766346220016022 0ustar maomkpasswd/* PLANARITY, Graph Planarity Testing */ /* Written in GNU MathProg by Andrew Makhorin */ /* Given a graph G = (V, E), where V is a set of vertices and E is a set of edges (unordered pairs of vertices), this model tests if G is planar, and if it is, finds its faces for some embedding. It is assumed that G is loopless and the degree of any its vertex is at least 2. Though there exist linear-time algorithms to test graph planarity, this MIP feasibility model may be used, for example, to find an embedding subject to some additional constraints or an "optimal" embedding. This model is based on Mac Lane's planarity characterization that states that a finite undirected graph is planar iff the cycle space of the graph (in GF(2)) has a cycle basis in which each edge of the graph participates in at most two basis vectors. */ param nv; /* number of vertices */ set V := 1..nv; /* set of vertices */ set E, within V cross V; /* set of edges */ check{(i,j) in E} i <> j; /* graph must have no loops */ set A := E union setof{(i,j) in E} (j,i); /* set of arcs, where every edge (i,j) gives two arcs i->j and j->i */ check{i in V} sum{(i,j) in A} 1 >= 2; /* degree of any vertex must be at least 2 */ param nf := 2 - nv + card(E); /* number of faces (including outer face) */ set F := 1..nf; /* set of faces = set of vertices of dual graph */ /* Let every face be assigned a unique color. Below we say that arc i->j has color f if on moving from vertex i to vertex j face f is located on the left to that arc. (Note that every face is defined by a cycle mentioned in Mac Lane's characterization. In this model cycles are constructed explicitly from arcs.) */ var x{(i,j) in A, f in F}, binary; /* x[i,j,f] = 1 means that arc i->j has color f */ s.t. r1{(i,j) in A}: sum{f in F} x[i,j,f] = 1; /* every arc must have exactly one color */ s.t. r2{j in V, f in F}: sum{(i,j) in A} x[i,j,f] <= 1; /* two or more arcs of the same color must not enter the same vertex */ s.t. r3{j in V, f in F}: sum{(i,j) in A} x[i,j,f] = sum{(j,i) in A} x[j,i,f]; /* if arc of color f enters some vertex, exactly one arc of the same color must leave that vertex */ s.t. r4{(i,j) in E, f in F}: x[i,j,f] + x[j,i,f] <= 1; /* arcs that correspond to the same edge must have different colors (to avoid invalid faces i->j->i) */ s.t. r5{f in F}: sum{(i,j) in A} x[i,j,f] >= 1; /* every color must be used at least once */ /* this is a feasibility problem, so no objective is needed */ solve; printf "number of vertices = %d\n", nv; printf "number of edges = %d\n", card(A) / 2; printf "number of faces = %d\n", nf; for {f in F} { printf "face %d:", f; printf {(i,j) in A: x[i,j,f] = 1} " %d->%d", i, j; printf "\n"; } data; /* The data below correspond to the following (planar) graph: 1 - 2 - - 3 - - 4 | | | | | | 5 - 6 | | | \ | | | \ | | 7 - - - - 8 - - 9 - - - - 10- - -11 | / | \ | | | / | \ | | | / | \ | | | / | \ | | 12 - - - -13 - - - - - - - 14- - -15 */ param nv := 15; set E := (1,2) (1,5) (2,3) (3,4) (3,8) (4,9) (5,6) (5,7) (6,8) (7,8) (7,12) (8,9) (8,12) (8,13) (9,10) (9,14) (10,11) (10,14) (11,15) (12,13) (13,14) (14,15) ; end; glpk-5.0/examples/powpl25h.mod0000644000062000006210000001723613766346220015512 0ustar maomkpasswd/* Power plant LP scheduler, example data with 25hrs for daylightsavings */ /* Implemented, inspected, written and converted to GNU MathProg by NASZVADI, Peter, 199x-2017 */ /* Fast electric power plant scheduler implementation based on new results in author's Thesis. The base problem is: * given some power plants * a short time scale partitioned to equidistant intervals * the task is to yielding the cheapest schedule for the plants * the daily demand forecast is usually accurate and part of the input The power plants has technical limitations: * upper and lower bounds of produced energy * and also a gradient barrier in both directions (can depend on time, but this GMPL implementation is simplified) * Also units with same properties (technical and price) should be scheduled together usually with near same performance values * Assumed a simplified network topology, which is contractive, so keeping Kirchhoff's laws is a necessary constraint too * All solutions must be integer The LP relaxation is equivalent with the MIP problem due to the model's matrix interesting property: it is Totally Unimodular (proven in 2004 by author) and also a Network Matrix (2006, presented at OTDK 2016, Szeged, Hungary) so: * it is strictly polynomial if it is solved by most simplex algs * all base solutions become integer if the RHS vector is integer (it is in real life, so this is an acceptable assumption) * The transposed matrix is NOT a Network Matrix in most cases! However, adding several other constraints easily turns the problem to be NP-hard, which is also pinpointed and discussed in the Thesis. See more about electric power plants' scheduling in the author's Thesis (in Hungarian): http://www.cs.elte.hu/matdiploma/vuk.pdf It is possible to run with custom parameters, what is needed to define is: * TIME set (daylightsaving cases or other than hour intervals) * PLANTS set (the 'Demand' is mandatory and usually negative) * PRICE parameter (can be negative if energy is sold to a consumer) * BOUND parameter (technical bounds) * MAXGRAD parameter (technical bounds) Then generate a pretty-printed solution by typing: glpsol --math powpl25h.mod */ set TIME, default { '00:00', '01:00', '02:00', '03:00', '04:00', '05:00', '06:00', '07:00', '08:00', '09:00', '10:00', '11:00', '12:00', '13:00', '14:00', '15:00', '16:00', '17:00', '18:00', '19:00', '20:00', '21:00', '22:00', '23:00', '24:00' }; /* Time labels, assumed natural ordering. daylightsaving's bias can be inserted p.ex. in Central Europe like: ... '01:00', '02:00', '02:00b', '03:00', ... */ set TADJ := setof{(r, s) in TIME cross TIME: r < s}(r, s) diff setof{(t, u, v) in TIME cross TIME cross TIME: t < u and u < v}(t, v); /* Tricky adjacent time label generator because GMPL lacks order determination of set elements (except intervals composed of equidistant numbers) */ set PLANTS, default {'Demand'}; /* Demand is a promoted, mandatory one, usually filled with negative MW values in data section */ set DIRECTION, default {'Up', 'Down'}; /* All possible directions of gradients, do not touch */ param MAXINT, default 10000; /* A "macro" for bounding absolute value of all used numbers and used as default value */ param PRICE{PLANTS}, default MAXINT; /* Should be specified in data section, self-explanatory. can be negative if there are energy buyers */ param BOUND{(p, t, d) in PLANTS cross TIME cross DIRECTION}, default if t = '00:00' then if d = 'Down' then BOUND[p, t, 'Up'] else 0 else if p <> 'Demand' or d = 'Up' then sum{(u, v) in TADJ: v = t} BOUND[p, u, d] else BOUND[p, t, 'Up']; /* Obvious, technical bounds of each power plant unit (real or virtual like 'Demand'). If some parts are not given in data section, calculated from preceeding values. Also for time '00:00', its 'Down' values by default are the same as denoted with 'Up' */ param MAXGRAD{(p, d) in PLANTS cross DIRECTION}, default MAXINT; /* Usually nonnegative integer, might differ in distinct directions per unit in the cited thesis, it is allowed to gradient bounds to depend on time, but this is a simplified model */ var x{(t, p) in TIME cross PLANTS}, <= BOUND[p, t, 'Up'], >= BOUND[p, t, 'Down']; /* The schedule, dimension is MW */ s.t. kirchhoff{t in TIME: t <> '00:00'}: sum{p in PLANTS} x[t, p] = 0; /* Conservative property */ s.t. gradient{(p, t, u) in PLANTS cross TADJ}: -MAXGRAD[p, 'Down'] <= x[t, p] - x[u, p] <= MAXGRAD[p, 'Up']; /* Technical limitations, each unit usually cannot change performance arbitrarily in a short time, so limited in both directions per time unit*/ minimize obj: sum{(t, p) in TIME cross PLANTS}(x[t, p] * PRICE[p]); /* The objective is the cost of the schedule */ solve; /* Pretty print solution in table */ printf '+--------+'; for{p in PLANTS}{ printf '-% 6s-+', '------'; } printf '\n'; printf '|%7s |', ' '; for{p in PLANTS}{ printf ' % 6s |', p; } printf '\n'; printf '+--------+'; for{p in PLANTS}{ printf '-% 6s-+', '------'; } printf '\n'; for{t in TIME}{ printf '|%7s |', t; for{p in PLANTS}{ printf ' % 6s |', x[t, p].val; } printf '\n'; } printf '+--------+'; for{p in PLANTS}{ printf '-% 6s-+', '------'; } printf '\n'; data; set TIME := '00:00', '01:00', '02:00', '02:00b', '03:00', '04:00', '05:00', '06:00', '07:00', '08:00', '09:00', '10:00', '11:00', '12:00', '13:00', '14:00', '15:00', '16:00', '17:00', '18:00', '19:00', '20:00', '21:00', '22:00', '23:00', '24:00'; /* Generated random default values and names, the demand is the sum of 2 sinewaves. Also specified a treshold for nuclear plants from 15:00 till 19:00 The sun is shining only morning and in the afternoon: 07:00-18:00, so solar plant cannot produce electric energy after sunset. Only touch this section, or export it to a data file! */ set PLANTS 'Demand', 'Atom1', 'Atom2', 'Coal', 'Gas1', 'Gas2', 'Green', 'Oil', 'Solar', 'Dam'; param PRICE := 'Demand' 0 'Atom1' 2 'Atom2' 2 'Coal' 15.6 'Gas1' 12 'Gas2' 11.5 'Green' 8.8 'Oil' 23.3 'Solar' 7.6 'Dam' 3; /* price per MW */ param BOUND := [*, *, 'Up'] (tr): 'Atom1' 'Atom2' 'Coal' 'Gas1' 'Gas2' 'Green' 'Oil' 'Solar' 'Dam' := '00:00' 240 240 100 150 150 20 90 0 20 '01:00' 240 240 155 192 208 35 230 0 20 [*, *, 'Up'] (tr): 'Atom1' 'Atom2' := '15:00' 200 200 '19:00' 235 235 [*, *, 'Up'] (tr): 'Solar' := '07:00' 20 '18:00' 0 [*, *, 'Down'] (tr): 'Atom1' 'Atom2' 'Coal' 'Gas1' 'Gas2' 'Green' 'Oil' 'Solar' 'Dam' := '01:00' 100 100 50 62 68 0 75 0 20 [*, *, 'Up'] : '01:00' '02:00' '02:00b' '03:00' '04:00' '05:00' '06:00' '07:00' '08:00' := 'Demand' -868 -851 -842 -837 -791 -887 -912 -1046 -1155 [*, *, 'Up'] : '09:00' '10:00' '11:00' '12:00' '13:00' '14:00' '15:00' '16:00' := 'Demand' -945 -873 -797 -990 -1241 -1134 -815 -782 [*, *, 'Up'] : '17:00' '18:00' '19:00' '20:00' '21:00' '22:00' '23:00' '24:00' := 'Demand' -772 -827 -931 -1105 -1215 -1249 -1183 -952; param MAXGRAD (tr) : 'Atom1' 'Atom2' 'Coal' 'Gas1' 'Gas2' 'Green' 'Oil' 'Solar' 'Dam' := 'Up' 30 30 35 89 95 5 56 2 4 'Down' 30 30 45 96 102 5 56 2 4; end; glpk-5.0/examples/powplant.mod0000644000062000006210000001703213766346220015670 0ustar maomkpasswd/* Power plant LP scheduler */ /* Implemented, inspected, written and converted to GNU MathProg by NASZVADI, Peter, 199x-2017 */ /* Fast electric power plant scheduler implementation based on new results in author's Thesis. The base problem is: * given some power plants * a short time scale partitioned to equidistant intervals * the task is to yielding the cheapest schedule for the plants * the daily demand forecast is usually accurate and part of the input The power plants has technical limitations: * upper and lower bounds of produced energy * and also a gradient barrier in both directions (can depend on time, but this GMPL implementation is simplified) * Also units with same properties (technical and price) should be scheduled together usually with near same performance values * Assumed a simplified network topology, which is contractive, so keeping Kirchhoff's laws is a necessary constraint too * All solutions must be integer The LP relaxation is equivalent with the MIP problem due to the model's matrix interesting property: it is Totally Unimodular (proven in 2004 by author) and also a Network Matrix (2006, presented at OTDK 2016, Szeged, Hungary) so: * it is strictly polynomial if it is solved by most simplex algs * all base solutions become integer if the RHS vector is integer (it is in real life, so this is an acceptable assumption) * The transposed matrix is NOT a Network Matrix in most cases! However, adding several other constraints easily turns the problem to be NP-hard, which is also pinpointed and discussed in the Thesis. See more about electric power plants' scheduling in the author's Thesis (in Hungarian): http://www.cs.elte.hu/matdiploma/vuk.pdf It is possible to run with custom parameters, what is needed to define is: * TIME set (daylightsaving cases or other than hour intervals) * PLANTS set (the 'Demand' is mandatory and usually negative) * PRICE parameter (can be negative if energy is sold to a consumer) * BOUND parameter (technical bounds) * MAXGRAD parameter (technical bounds) Then generate a pretty-printed solution by typing: glpsol --math powplant.mod [--data NEW_DATA.dat] where "NEW_DATA.dat" should contain the above 5 structures filled with custom data. Square brackets shoudn't be entered, and specifying custom data file is optional. */ set TIME, default { '00:00', '01:00', '02:00', '03:00', '04:00', '05:00', '06:00', '07:00', '08:00', '09:00', '10:00', '11:00', '12:00', '13:00', '14:00', '15:00', '16:00', '17:00', '18:00', '19:00', '20:00', '21:00', '22:00', '23:00', '24:00' }; /* Time labels, assumed natural ordering. daylightsaving's bias can be inserted p.ex. in Central Europe like: ... '01:00', '02:00', '02:00b', '03:00', ... */ set TADJ := setof{(r, s) in TIME cross TIME: r < s}(r, s) diff setof{(t, u, v) in TIME cross TIME cross TIME: t < u and u < v}(t, v); /* Tricky adjacent time label generator because GMPL lacks order determination of set elements (except intervals composed of equidistant numbers) */ set PLANTS, default {'Demand'}; /* Demand is a promoted, mandatory one, usually filled with negative MW values in data section */ set DIRECTION, default {'Up', 'Down'}; /* All possible directions of gradients, do not touch */ param MAXINT, default 10000; /* A "macro" for bounding absolute value of all used numbers and used as default value */ param PRICE{PLANTS}, default MAXINT; /* Should be specified in data section, self-explanatory. can be negative if there are energy buyers */ param BOUND{(p, t, d) in PLANTS cross TIME cross DIRECTION}, default if t = '00:00' then if d = 'Down' then BOUND[p, t, 'Up'] else 0 else if p <> 'Demand' or d = 'Up' then sum{(u, v) in TADJ: v = t} BOUND[p, u, d] else BOUND[p, t, 'Up']; /* Obvious, technical bounds of each power plant unit (real or virtual like 'Demand'). If some parts are not given in data section, calculated from preceeding values. Also for time '00:00', its 'Down' values by default are the same as denoted with 'Up' */ param MAXGRAD{(p, d) in PLANTS cross DIRECTION}, default MAXINT; /* Usually nonnegative integer, might differ in distinct directions per unit in the cited thesis, it is allowed to gradient bounds to depend on time, but this is a simplified model */ var x{(t, p) in TIME cross PLANTS}, <= BOUND[p, t, 'Up'], >= BOUND[p, t, 'Down']; /* The schedule, dimension is MW */ s.t. kirchhoff{t in TIME: t <> '00:00'}: sum{p in PLANTS} x[t, p] = 0; /* Conservative property */ s.t. gradient{(p, t, u) in PLANTS cross TADJ}: -MAXGRAD[p, 'Down'] <= x[t, p] - x[u, p] <= MAXGRAD[p, 'Up']; /* Technical limitations, each unit usually cannot change performance arbitrarily in a short time, so limited in both directions per time unit*/ minimize obj: sum{(t, p) in TIME cross PLANTS}(x[t, p] * PRICE[p]); /* The objective is the cost of the schedule */ solve; /* Pretty print solution in table */ printf '+--------+'; for{p in PLANTS}{ printf '-% 6s-+', '------'; } printf '\n'; printf '|%7s |', ' '; for{p in PLANTS}{ printf ' % 6s |', p; } printf '\n'; printf '+--------+'; for{p in PLANTS}{ printf '-% 6s-+', '------'; } printf '\n'; for{t in TIME}{ printf '|%7s |', t; for{p in PLANTS}{ printf ' % 6s |', x[t, p].val; } printf '\n'; } printf '+--------+'; for{p in PLANTS}{ printf '-% 6s-+', '------'; } printf '\n'; data; /* Generated random default values and names, the demand is the sum of 2 sinewaves. Also specified a treshold for nuclear plants from 15:00 till 19:00 The sun is shining only morning and in the afternoon: 07:00-18:00, so solar plant cannot produce electric energy after sunset. Only touch this section, or export it to a data file! */ set PLANTS 'Demand', 'Atom1', 'Atom2', 'Coal', 'Gas1', 'Gas2', 'Green', 'Oil', 'Solar', 'Dam'; param PRICE := 'Demand' 0 'Atom1' 2 'Atom2' 2 'Coal' 15.6 'Gas1' 12 'Gas2' 11.5 'Green' 8.8 'Oil' 23.3 'Solar' 7.6 'Dam' 3; /* price per MW */ param BOUND := [*, *, 'Up'] (tr): 'Atom1' 'Atom2' 'Coal' 'Gas1' 'Gas2' 'Green' 'Oil' 'Solar' 'Dam' := '00:00' 240 240 100 150 150 20 90 0 20 '01:00' 240 240 155 192 208 35 230 0 20 [*, *, 'Up'] (tr): 'Atom1' 'Atom2' := '15:00' 200 200 '19:00' 235 235 [*, *, 'Up'] (tr): 'Solar' := '07:00' 20 '18:00' 0 [*, *, 'Down'] (tr): 'Atom1' 'Atom2' 'Coal' 'Gas1' 'Gas2' 'Green' 'Oil' 'Solar' 'Dam' := '01:00' 100 100 50 62 68 0 75 0 20 [*, *, 'Up'] : '01:00' '02:00' '03:00' '04:00' '05:00' '06:00' '07:00' '08:00' := 'Demand' -868 -851 -837 -791 -887 -912 -1046 -1155 [*, *, 'Up'] : '09:00' '10:00' '11:00' '12:00' '13:00' '14:00' '15:00' '16:00' := 'Demand' -945 -873 -797 -990 -1241 -1134 -815 -782 [*, *, 'Up'] : '17:00' '18:00' '19:00' '20:00' '21:00' '22:00' '23:00' '24:00' := 'Demand' -772 -827 -931 -1105 -1215 -1249 -1183 -952; param MAXGRAD (tr) : 'Atom1' 'Atom2' 'Coal' 'Gas1' 'Gas2' 'Green' 'Oil' 'Solar' 'Dam' := 'Up' 30 30 35 89 95 5 56 2 4 'Down' 30 30 45 96 102 5 56 2 4; end; glpk-5.0/examples/prod.mod0000644000062000006210000002466713766346220015004 0ustar maomkpasswd# PROD, a multiperiod production model # # References: # Robert Fourer, David M. Gay and Brian W. Kernighan, "A Modeling Language # for Mathematical Programming." Management Science 36 (1990) 519-554. ### PRODUCTION SETS AND PARAMETERS ### set prd 'products'; # Members of the product group param pt 'production time' {prd} > 0; # Crew-hours to produce 1000 units param pc 'production cost' {prd} > 0; # Nominal production cost per 1000, used # to compute inventory and shortage costs ### TIME PERIOD SETS AND PARAMETERS ### param first > 0 integer; # Index of first production period to be modeled param last > first integer; # Index of last production period to be modeled set time 'planning horizon' := first..last; ### EMPLOYMENT PARAMETERS ### param cs 'crew size' > 0 integer; # Workers per crew param sl 'shift length' > 0; # Regular-time hours per shift param rtr 'regular time rate' > 0; # Wage per hour for regular-time labor param otr 'overtime rate' > rtr; # Wage per hour for overtime labor param iw 'initial workforce' >= 0 integer; # Crews employed at start of first period param dpp 'days per period' {time} > 0; # Regular working days in a production period param ol 'overtime limit' {time} >= 0; # Maximum crew-hours of overtime in a period param cmin 'crew minimum' {time} >= 0; # Lower limit on average employment in a period param cmax 'crew maximum' {t in time} >= cmin[t]; # Upper limit on average employment in a period param hc 'hiring cost' {time} >= 0; # Penalty cost of hiring a crew param lc 'layoff cost' {time} >= 0; # Penalty cost of laying off a crew ### DEMAND PARAMETERS ### param dem 'demand' {prd,first..last+1} >= 0; # Requirements (in 1000s) # to be met from current production and inventory param pro 'promoted' {prd,first..last+1} logical; # true if product will be the subject # of a special promotion in the period ### INVENTORY AND SHORTAGE PARAMETERS ### param rir 'regular inventory ratio' >= 0; # Proportion of non-promoted demand # that must be in inventory the previous period param pir 'promotional inventory ratio' >= 0; # Proportion of promoted demand # that must be in inventory the previous period param life 'inventory lifetime' > 0 integer; # Upper limit on number of periods that # any product may sit in inventory param cri 'inventory cost ratio' {prd} > 0; # Inventory cost per 1000 units is # cri times nominal production cost param crs 'shortage cost ratio' {prd} > 0; # Shortage cost per 1000 units is # crs times nominal production cost param iinv 'initial inventory' {prd} >= 0; # Inventory at start of first period; age unknown param iil 'initial inventory left' {p in prd, t in time} := iinv[p] less sum {v in first..t} dem[p,v]; # Initial inventory still available for allocation # at end of period t param minv 'minimum inventory' {p in prd, t in time} := dem[p,t+1] * (if pro[p,t+1] then pir else rir); # Lower limit on inventory at end of period t ### VARIABLES ### var Crews{first-1..last} >= 0; # Average number of crews employed in each period var Hire{time} >= 0; # Crews hired from previous to current period var Layoff{time} >= 0; # Crews laid off from previous to current period var Rprd 'regular production' {prd,time} >= 0; # Production using regular-time labor, in 1000s var Oprd 'overtime production' {prd,time} >= 0; # Production using overtime labor, in 1000s var Inv 'inventory' {prd,time,1..life} >= 0; # Inv[p,t,a] is the amount of product p that is # a periods old -- produced in period (t+1)-a -- # and still in storage at the end of period t var Short 'shortage' {prd,time} >= 0; # Accumulated unsatisfied demand at the end of period t ### OBJECTIVE ### minimize cost: sum {t in time} rtr * sl * dpp[t] * cs * Crews[t] + sum {t in time} hc[t] * Hire[t] + sum {t in time} lc[t] * Layoff[t] + sum {t in time, p in prd} otr * cs * pt[p] * Oprd[p,t] + sum {t in time, p in prd, a in 1..life} cri[p] * pc[p] * Inv[p,t,a] + sum {t in time, p in prd} crs[p] * pc[p] * Short[p,t]; # Full regular wages for all crews employed, plus # penalties for hiring and layoffs, plus # wages for any overtime worked, plus # inventory and shortage costs # (All other production costs are assumed # to depend on initial inventory and on demands, # and so are not included explicitly.) ### CONSTRAINTS ### rlim 'regular-time limit' {t in time}: sum {p in prd} pt[p] * Rprd[p,t] <= sl * dpp[t] * Crews[t]; # Hours needed to accomplish all regular-time # production in a period must not exceed # hours available on all shifts olim 'overtime limit' {t in time}: sum {p in prd} pt[p] * Oprd[p,t] <= ol[t]; # Hours needed to accomplish all overtime # production in a period must not exceed # the specified overtime limit empl0 'initial crew level': Crews[first-1] = iw; # Use given initial workforce empl 'crew levels' {t in time}: Crews[t] = Crews[t-1] + Hire[t] - Layoff[t]; # Workforce changes by hiring or layoffs emplbnd 'crew limits' {t in time}: cmin[t] <= Crews[t] <= cmax[t]; # Workforce must remain within specified bounds dreq1 'first demand requirement' {p in prd}: Rprd[p,first] + Oprd[p,first] + Short[p,first] - Inv[p,first,1] = dem[p,first] less iinv[p]; dreq 'demand requirements' {p in prd, t in first+1..last}: Rprd[p,t] + Oprd[p,t] + Short[p,t] - Short[p,t-1] + sum {a in 1..life} (Inv[p,t-1,a] - Inv[p,t,a]) = dem[p,t] less iil[p,t-1]; # Production plus increase in shortage plus # decrease in inventory must equal demand ireq 'inventory requirements' {p in prd, t in time}: sum {a in 1..life} Inv[p,t,a] + iil[p,t] >= minv[p,t]; # Inventory in storage at end of period t # must meet specified minimum izero 'impossible inventories' {p in prd, v in 1..life-1, a in v+1..life}: Inv[p,first+v-1,a] = 0; # In the vth period (starting from first) # no inventory may be more than v periods old # (initial inventories are handled separately) ilim1 'new-inventory limits' {p in prd, t in time}: Inv[p,t,1] <= Rprd[p,t] + Oprd[p,t]; # New inventory cannot exceed # production in the most recent period ilim 'inventory limits' {p in prd, t in first+1..last, a in 2..life}: Inv[p,t,a] <= Inv[p,t-1,a-1]; # Inventory left from period (t+1)-p # can only decrease as time goes on ### DATA ### data; set prd := 18REG 24REG 24PRO ; param first := 1 ; param last := 13 ; param life := 2 ; param cs := 18 ; param sl := 8 ; param iw := 8 ; param rtr := 16.00 ; param otr := 43.85 ; param rir := 0.75 ; param pir := 0.80 ; param : pt pc cri crs iinv := 18REG 1.194 2304. 0.015 1.100 82.0 24REG 1.509 2920. 0.015 1.100 792.2 24PRO 1.509 2910. 0.015 1.100 0.0 ; param : dpp ol cmin cmax hc lc := 1 19.5 96.0 0.0 8.0 7500 7500 2 19.0 96.0 0.0 8.0 7500 7500 3 20.0 96.0 0.0 8.0 7500 7500 4 19.0 96.0 0.0 8.0 7500 7500 5 19.5 96.0 0.0 8.0 15000 15000 6 19.0 96.0 0.0 8.0 15000 15000 7 19.0 96.0 0.0 8.0 15000 15000 8 20.0 96.0 0.0 8.0 15000 15000 9 19.0 96.0 0.0 8.0 15000 15000 10 20.0 96.0 0.0 8.0 15000 15000 11 20.0 96.0 0.0 8.0 7500 7500 12 18.0 96.0 0.0 8.0 7500 7500 13 18.0 96.0 0.0 8.0 7500 7500 ; param dem (tr) : 18REG 24REG 24PRO := 1 63.8 1212.0 0.0 2 76.0 306.2 0.0 3 88.4 319.0 0.0 4 913.8 208.4 0.0 5 115.0 298.0 0.0 6 133.8 328.2 0.0 7 79.6 959.6 0.0 8 111.0 257.6 0.0 9 121.6 335.6 0.0 10 470.0 118.0 1102.0 11 78.4 284.8 0.0 12 99.4 970.0 0.0 13 140.4 343.8 0.0 14 63.8 1212.0 0.0 ; param pro (tr) : 18REG 24REG 24PRO := 1 0 1 0 2 0 0 0 3 0 0 0 4 1 0 0 5 0 0 0 6 0 0 0 7 0 1 0 8 0 0 0 9 0 0 0 10 1 0 1 11 0 0 0 12 0 0 0 13 0 1 0 14 0 1 0 ; end; glpk-5.0/examples/qfit.mod0000644000062000006210000000226013766346220014764 0ustar maomkpasswd/*Quadratic Curve Fitting Solution Find a plausable quadratic fit to a sample of points Nigel_Galloway@operamail.com February 1st., 2009 */ set Sample; param Sx {z in Sample}; param Sy {z in Sample}; var a; var b; var c; equalz1 :sum{z in Sample} a*Sx[z]*Sx[z]*Sx[z]*Sx[z] + sum{z in Sample} b*Sx[z]*Sx[z]*Sx[z] + sum{z in Sample} c*Sx[z]*Sx[z] = sum{z in Sample} Sy[z]*Sx[z]*Sx[z]; equalz2 :sum{z in Sample} a*Sx[z]*Sx[z]*Sx[z] + sum{z in Sample} b*Sx[z]*Sx[z] + sum{z in Sample} c*Sx[z] = sum{z in Sample} Sy[z]*Sx[z]; equalz3 :sum{z in Sample} a*Sx[z]*Sx[z] + sum{z in Sample} b*Sx[z] + sum{z in Sample} c = sum{z in Sample} Sy[z]; solve; printf "\nbest quadratic fit is:\n\ty = %f %s %fx %s %fx^2\n\n", c, if b < 0 then "-" else "+", abs(b), if a < 0 then "-" else "+", abs(a); data; param: Sample: Sx Sy := 1 0 1 2 0.5 0.9 3 1 0.7 4 1.5 1.5 5 1.9 2 6 2.5 2.4 7 3 3.2 8 3.5 2 9 4 2.7 10 4.5 3.5 11 5 1 12 5.5 4 13 6 3.6 14 6.6 2.7 15 7 5.7 16 7.6 4.6 17 8.5 6 18 9 6.8 19 10 7.3 ; end; glpk-5.0/examples/queens.mod0000644000062000006210000000246013766346220015323 0ustar maomkpasswd/* QUEENS, a classic combinatorial optimization problem */ /* Written in GNU MathProg by Andrew Makhorin */ /* The Queens Problem is to place as many queens as possible on the 8x8 (or more generally, nxn) chess board in a way that they do not fight each other. This problem is probably as old as the chess game itself, and thus its origin is not known, but it is known that Gauss studied this problem. */ param n, integer, > 0, default 8; /* size of the chess board */ var x{1..n, 1..n}, binary; /* x[i,j] = 1 means that a queen is placed in square [i,j] */ s.t. a{i in 1..n}: sum{j in 1..n} x[i,j] <= 1; /* at most one queen can be placed in each row */ s.t. b{j in 1..n}: sum{i in 1..n} x[i,j] <= 1; /* at most one queen can be placed in each column */ s.t. c{k in 2-n..n-2}: sum{i in 1..n, j in 1..n: i-j == k} x[i,j] <= 1; /* at most one queen can be placed in each "\"-diagonal */ s.t. d{k in 3..n+n-1}: sum{i in 1..n, j in 1..n: i+j == k} x[i,j] <= 1; /* at most one queen can be placed in each "/"-diagonal */ maximize obj: sum{i in 1..n, j in 1..n} x[i,j]; /* objective is to place as many queens as possible */ /* solve the problem */ solve; /* and print its optimal solution */ for {i in 1..n} { for {j in 1..n} printf " %s", if x[i,j] then "Q" else "."; printf("\n"); } end; glpk-5.0/examples/samp1.mps0000644000062000006210000000171013766346220015061 0ustar maomkpasswdNAME SAMP1 ROWS N Z G R1 G R2 G R3 COLUMNS X1 R1 2.0 R2 1.0 X1 R3 5.0 Z 3.0 MARK0001 'MARKER' 'INTORG' X2 R1 -1.0 R2 -1.0 X2 R3 3.0 Z 7.0 X3 R1 1.0 R2 -6.0 X3 Z -1.0 MARK0002 'MARKER' 'INTEND' X4 R1 -1.0 R2 4.0 X4 R3 1.0 Z 1.0 RHS RHS1 R1 1.0 RHS1 R2 8.0 RHS1 R3 5.0 BOUNDS UP BND1 X1 4.0 LO BND1 X2 2.0 UP BND1 X2 5.0 UP BND1 X3 1.0 LO BND1 X4 3.0 UP BND1 X4 8.0 ENDATA glpk-5.0/examples/samp2.mps0000644000062000006210000000152513766346220015066 0ustar maomkpasswdNAME SAMP2 ROWS N Z G R1 G R2 G R3 COLUMNS X1 R1 2.0 R2 1.0 X1 R3 5.0 Z 3.0 X2 R1 -1.0 R2 -1.0 X2 R3 3.0 Z 7.0 X3 R1 1.0 R2 -6.0 X3 Z -1.0 X4 R1 -1.0 R2 4.0 X4 R3 1.0 Z 1.0 RHS RHS1 R1 1.0 RHS1 R2 8.0 RHS1 R3 5.0 BOUNDS UP BND1 X1 4.0 LO BND1 X2 2.0 UI BND1 X2 5.0 BV BND1 X3 LO BND1 X4 3.0 UP BND1 X4 8.0 ENDATA glpk-5.0/examples/sample.asn0000644000062000006210000000055513766346220015311 0ustar maomkpasswdc sample.asn c c This is an example of the assignment problem data c in DIMACS format. c p asn 17 22 c n 1 n 2 n 3 n 4 n 5 n 6 n 7 n 8 c a 1 9 13 a 1 10 21 a 1 12 20 a 2 10 12 a 2 12 8 a 2 13 26 a 3 11 22 a 3 13 11 a 4 9 12 a 4 12 36 a 4 14 25 a 5 11 41 a 5 12 40 a 5 13 11 a 5 14 4 a 5 15 8 a 5 16 35 a 5 17 32 a 6 9 13 a 7 10 19 a 8 10 39 a 8 11 15 c c eof glpk-5.0/examples/sample.c0000644000062000006210000000347713766346220014760 0ustar maomkpasswd/* sample.c */ #include #include #include int main(void) { glp_prob *lp; int ia[1+1000], ja[1+1000]; double ar[1+1000], z, x1, x2, x3; s1: lp = glp_create_prob(); s2: glp_set_prob_name(lp, "sample"); s3: glp_set_obj_dir(lp, GLP_MAX); s4: glp_add_rows(lp, 3); s5: glp_set_row_name(lp, 1, "p"); s6: glp_set_row_bnds(lp, 1, GLP_UP, 0.0, 100.0); s7: glp_set_row_name(lp, 2, "q"); s8: glp_set_row_bnds(lp, 2, GLP_UP, 0.0, 600.0); s9: glp_set_row_name(lp, 3, "r"); s10: glp_set_row_bnds(lp, 3, GLP_UP, 0.0, 300.0); s11: glp_add_cols(lp, 3); s12: glp_set_col_name(lp, 1, "x1"); s13: glp_set_col_bnds(lp, 1, GLP_LO, 0.0, 0.0); s14: glp_set_obj_coef(lp, 1, 10.0); s15: glp_set_col_name(lp, 2, "x2"); s16: glp_set_col_bnds(lp, 2, GLP_LO, 0.0, 0.0); s17: glp_set_obj_coef(lp, 2, 6.0); s18: glp_set_col_name(lp, 3, "x3"); s19: glp_set_col_bnds(lp, 3, GLP_LO, 0.0, 0.0); s20: glp_set_obj_coef(lp, 3, 4.0); s21: ia[1] = 1, ja[1] = 1, ar[1] = 1.0; /* a[1,1] = 1 */ s22: ia[2] = 1, ja[2] = 2, ar[2] = 1.0; /* a[1,2] = 1 */ s23: ia[3] = 1, ja[3] = 3, ar[3] = 1.0; /* a[1,3] = 1 */ s24: ia[4] = 2, ja[4] = 1, ar[4] = 10.0; /* a[2,1] = 10 */ s25: ia[5] = 3, ja[5] = 1, ar[5] = 2.0; /* a[3,1] = 2 */ s26: ia[6] = 2, ja[6] = 2, ar[6] = 4.0; /* a[2,2] = 4 */ s27: ia[7] = 3, ja[7] = 2, ar[7] = 2.0; /* a[3,2] = 2 */ s28: ia[8] = 2, ja[8] = 3, ar[8] = 5.0; /* a[2,3] = 5 */ s29: ia[9] = 3, ja[9] = 3, ar[9] = 6.0; /* a[3,3] = 6 */ s30: glp_load_matrix(lp, 9, ia, ja, ar); s31: glp_simplex(lp, NULL); s32: z = glp_get_obj_val(lp); s33: x1 = glp_get_col_prim(lp, 1); s34: x2 = glp_get_col_prim(lp, 2); s35: x3 = glp_get_col_prim(lp, 3); s36: printf("\nz = %g; x1 = %g; x2 = %g; x3 = %g\n", z, x1, x2, x3); s37: glp_delete_prob(lp); return 0; } /* eof */ glpk-5.0/examples/sample.clq0000644000062000006210000000040713766346220015303 0ustar maomkpasswdc sample.clq c c This is an example of the Maximum Weight Clique c Problem in DIMACS clique/coloring format. c p edge 8 16 n 1 3 n 2 4 n 3 8 n 5 5 n 6 2 n 8 3 e 1 4 e 1 5 e 1 6 e 1 8 e 2 3 e 2 6 e 2 7 e 2 8 e 3 4 e 3 6 e 3 7 e 4 5 e 4 8 e 5 7 e 5 8 e 6 7 c c eof glpk-5.0/examples/sample.cnf0000644000062000006210000000017713766346220015276 0ustar maomkpasswdc sample.cnf c c This is an example of the CNF-SAT problem data c in DIMACS format. c p cnf 4 3 1 2 0 -4 3 -2 0 -1 4 0 c c eof glpk-5.0/examples/sample.col0000644000062000006210000000037113766346220015301 0ustar maomkpasswdc sample.col c c This is an example of the vertex coloring problem data c in DIMACS format. c p edge 10 21 c e 1 2 e 1 6 e 1 7 e 1 10 e 2 3 e 2 7 e 2 8 e 3 4 e 3 8 e 4 5 e 4 8 e 4 9 e 5 6 e 5 9 e 5 10 e 6 10 e 7 8 e 7 10 e 8 9 e 8 10 e 9 10 c c eof glpk-5.0/examples/sample.max0000644000062000006210000000037413766346220015314 0ustar maomkpasswdc sample.max c c This is an example of the maximum flow problem data c in DIMACS format. c p max 9 14 c n 1 s n 9 t c a 1 2 14 a 1 4 23 a 2 3 10 a 2 4 9 a 3 5 12 a 3 8 18 a 4 5 26 a 5 2 11 a 5 6 25 a 5 7 4 a 6 7 7 a 6 8 8 a 7 9 15 a 8 9 20 c c eof glpk-5.0/examples/sample.min0000644000062000006210000000047413766346220015313 0ustar maomkpasswdc sample.min c c This is an example of the minimum cost flow problem data c in DIMACS format. c p min 9 14 c n 1 20 n 9 -20 c a 1 2 0 14 0 a 1 4 0 23 0 a 2 3 0 10 2 a 2 4 0 9 3 a 3 5 2 12 1 a 3 8 0 18 0 a 4 5 0 26 0 a 5 2 0 11 1 a 5 6 0 25 5 a 5 7 0 4 7 a 6 7 0 7 0 a 6 8 4 8 0 a 7 9 0 15 3 a 8 9 0 20 9 c c eof glpk-5.0/examples/sat.mod0000644000062000006210000001211613766346220014611 0ustar maomkpasswd/* SAT, Satisfiability Problem */ /* Written in GNU MathProg by Andrew Makhorin */ param m, integer, > 0; /* number of clauses */ param n, integer, > 0; /* number of variables */ set C{1..m}; /* clauses; each clause C[i], i = 1, ..., m, is disjunction of some variables or their negations; in the data section each clause is coded as a set of indices of corresponding variables, where negative indices mean negation; for example, the clause (x3 or not x7 or x11) is coded as the set { 3, -7, 11 } */ var x{1..n}, binary; /* main variables */ /* To solve the satisfiability problem means to determine all variables x[j] such that conjunction of all clauses C[1] and ... and C[m] takes on the value true, i.e. all clauses are satisfied. Let the clause C[i] be (t or t' or ... or t''), where t, t', ..., t'' are either variables or their negations. The condition of satisfying C[i] can be most naturally written as: t + t' + ... + t'' >= 1, (1) where t, t', t'' have to be replaced by either x[j] or (1 - x[j]). The formulation (1) leads to the mip problem with no objective, i.e. to a feasibility problem. Another, more practical way is to write the condition for C[i] as: t + t' + ... + t'' + y[i] >= 1, (2) where y[i] is an auxiliary binary variable, and minimize the sum of y[i]. If the sum is zero, all y[i] are also zero, and therefore all clauses are satisfied. If the sum is minimal but non-zero, its value shows the number of clauses which cannot be satisfied. */ var y{1..m}, binary, >= 0; /* auxiliary variables */ s.t. c{i in 1..m}: sum{j in C[i]} (if j > 0 then x[j] else (1 - x[-j])) + y[i] >= 1; /* the condition (2) */ minimize unsat: sum{i in 1..m} y[i]; /* number of unsatisfied clauses */ data; /* These data correspond to the instance hole6 (pigeon hole problem for 6 holes) from SATLIB, the Satisfiability Library, which is part of the collection at the Forschungsinstitut fuer anwendungsorientierte Wissensverarbeitung in Ulm Germany */ /* The optimal solution is 1 (one clause cannot be satisfied) */ param m := 133; param n := 42; set C[1] := -1 -7; set C[2] := -1 -13; set C[3] := -1 -19; set C[4] := -1 -25; set C[5] := -1 -31; set C[6] := -1 -37; set C[7] := -7 -13; set C[8] := -7 -19; set C[9] := -7 -25; set C[10] := -7 -31; set C[11] := -7 -37; set C[12] := -13 -19; set C[13] := -13 -25; set C[14] := -13 -31; set C[15] := -13 -37; set C[16] := -19 -25; set C[17] := -19 -31; set C[18] := -19 -37; set C[19] := -25 -31; set C[20] := -25 -37; set C[21] := -31 -37; set C[22] := -2 -8; set C[23] := -2 -14; set C[24] := -2 -20; set C[25] := -2 -26; set C[26] := -2 -32; set C[27] := -2 -38; set C[28] := -8 -14; set C[29] := -8 -20; set C[30] := -8 -26; set C[31] := -8 -32; set C[32] := -8 -38; set C[33] := -14 -20; set C[34] := -14 -26; set C[35] := -14 -32; set C[36] := -14 -38; set C[37] := -20 -26; set C[38] := -20 -32; set C[39] := -20 -38; set C[40] := -26 -32; set C[41] := -26 -38; set C[42] := -32 -38; set C[43] := -3 -9; set C[44] := -3 -15; set C[45] := -3 -21; set C[46] := -3 -27; set C[47] := -3 -33; set C[48] := -3 -39; set C[49] := -9 -15; set C[50] := -9 -21; set C[51] := -9 -27; set C[52] := -9 -33; set C[53] := -9 -39; set C[54] := -15 -21; set C[55] := -15 -27; set C[56] := -15 -33; set C[57] := -15 -39; set C[58] := -21 -27; set C[59] := -21 -33; set C[60] := -21 -39; set C[61] := -27 -33; set C[62] := -27 -39; set C[63] := -33 -39; set C[64] := -4 -10; set C[65] := -4 -16; set C[66] := -4 -22; set C[67] := -4 -28; set C[68] := -4 -34; set C[69] := -4 -40; set C[70] := -10 -16; set C[71] := -10 -22; set C[72] := -10 -28; set C[73] := -10 -34; set C[74] := -10 -40; set C[75] := -16 -22; set C[76] := -16 -28; set C[77] := -16 -34; set C[78] := -16 -40; set C[79] := -22 -28; set C[80] := -22 -34; set C[81] := -22 -40; set C[82] := -28 -34; set C[83] := -28 -40; set C[84] := -34 -40; set C[85] := -5 -11; set C[86] := -5 -17; set C[87] := -5 -23; set C[88] := -5 -29; set C[89] := -5 -35; set C[90] := -5 -41; set C[91] := -11 -17; set C[92] := -11 -23; set C[93] := -11 -29; set C[94] := -11 -35; set C[95] := -11 -41; set C[96] := -17 -23; set C[97] := -17 -29; set C[98] := -17 -35; set C[99] := -17 -41; set C[100] := -23 -29; set C[101] := -23 -35; set C[102] := -23 -41; set C[103] := -29 -35; set C[104] := -29 -41; set C[105] := -35 -41; set C[106] := -6 -12; set C[107] := -6 -18; set C[108] := -6 -24; set C[109] := -6 -30; set C[110] := -6 -36; set C[111] := -6 -42; set C[112] := -12 -18; set C[113] := -12 -24; set C[114] := -12 -30; set C[115] := -12 -36; set C[116] := -12 -42; set C[117] := -18 -24; set C[118] := -18 -30; set C[119] := -18 -36; set C[120] := -18 -42; set C[121] := -24 -30; set C[122] := -24 -36; set C[123] := -24 -42; set C[124] := -30 -36; set C[125] := -30 -42; set C[126] := -36 -42; set C[127] := 6 5 4 3 2 1; set C[128] := 12 11 10 9 8 7; set C[129] := 18 17 16 15 14 13; set C[130] := 24 23 22 21 20 19; set C[131] := 30 29 28 27 26 25; set C[132] := 36 35 34 33 32 31; set C[133] := 42 41 40 39 38 37; end; glpk-5.0/examples/shiftcov.mod0000644000062000006210000002463413766346220015657 0ustar maomkpasswd/* File: shiftcover.mod */ /* WORKFORCE SHIFT COVERAGE assignment problem */ /* Written by Larry D'Agostino Maximize Productivity with Industrial Engineer and Operations Research Tools http://industrialengineertools.blogspot.com /* The WORKFORCE SHIFT COVERAGE is an assigment problem that determines the schedule of crew given available time and shifts. The objective is to cover the available time given hourly demand with the minimum number of crew members. This is a set covering problem that is very common among finding crew and shift allocations. Notice in the data section the workforce shift allocation per day of the week.*/ /* ----- Model PARAMTERS and SETS -----*/ param numhrs; /* number of hours of operations in a given day */ param dys; /* number of days in a week */ set S; /* set of crew shifts */ set H := 1..numhrs; /* set of hours of a day*/ set D; /* set of days of a week*/ param dmnd{h in H, d in D}; /* demand for crew members given h hour and d day */ param shifts{d in D, h in H, s in S}; /* shifts to assign to crew members given d day, h hour, and s shift schedule /*----- Model VARIABLES -----*/ var crew{s in S}, integer, >=0; /* number of crew assigned to shift S */ /*----- Model CONSTRAINTS -----*/ s.t. Coverage{h in H, d in D}: sum{s in S} crew[s]*shifts[d,h,s] >= dmnd[h,d]; /* number of crew to cover with a shift given hourly demand and day */ /*----- Model OBJECTIVE -----*/ minimize obj: sum{s in S} crew[s]; /* minimize number of crew to cover demand*/ solve; display crew; printf "\n"; printf "Total Crew: %3d\n\n", sum{s in S} crew[s]; printf "\n\n"; printf "Weekly Crew Schedule\n\n"; printf "Hour "; printf{d in D} " %s ", d; printf "\n"; for {h in H} { printf " %2s ",h; printf{d in D} " %3d ", sum{s in S} crew[s]*shifts[d,h,s]; printf "\n"; } printf"\n"; data; param numhrs := 16; set D := SUN, MON, TUE, WED, THU, FRI, SAT; set S := Sh1, Sh2, Sh3, Sh4, Sh5, Sh6, Sh7, Sh8, Sh9; param dmnd : SUN MON TUE WED THU FRI SAT := 1 0 3 3 4 3 2 0 2 0 14 14 16 14 12 12 3 0 24 24 27 24 20 15 4 0 28 28 32 28 23 15 5 0 33 33 37 33 24 16 6 0 34 34 38 34 24 15 7 0 35 35 39 35 25 11 8 0 35 35 40 35 27 0 9 0 34 34 39 34 25 0 10 0 31 31 35 31 24 0 11 2 24 24 27 24 25 0 12 3 19 19 21 19 21 0 13 2 24 24 27 24 13 0 14 2 16 16 18 16 0 0 15 0 7 7 7 7 0 0 16 0 5 5 5 5 0 0; param shifts := ['SUN',*,*]: Sh1 Sh2 Sh3 Sh4 Sh5 Sh6 Sh7 Sh8 Sh9 := 1 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 0 7 0 0 0 0 0 0 0 0 0 8 0 0 0 0 0 0 0 0 0 9 0 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 11 0 0 0 0 0 0 0 0 1 12 0 0 0 0 0 0 0 0 1 13 0 0 0 0 0 0 0 0 1 14 0 0 0 0 0 0 0 0 1 15 0 0 0 0 0 0 0 0 0 16 0 0 0 0 0 0 0 0 0 ['MON',*,*]: Sh1 Sh2 Sh3 Sh4 Sh5 Sh6 Sh7 Sh8 Sh9 := 1 1 0 0 0 0 0 0 0 0 2 1 1 0 0 0 0 0 0 0 3 1 1 1 0 0 0 0 0 0 4 1 1 1 1 0 0 0 0 0 5 0 1 1 1 1 0 0 0 0 6 1 0 1 1 1 1 0 0 1 7 1 1 0 1 1 1 1 0 1 8 1 1 1 0 1 1 1 1 1 9 1 1 1 1 0 1 1 1 1 10 0 1 1 1 1 0 1 1 1 11 0 0 1 1 1 1 0 1 0 12 0 0 0 1 1 1 1 0 1 13 0 0 0 0 1 1 1 1 1 14 0 0 0 0 0 1 1 1 1 15 0 0 0 0 0 0 1 1 1 16 0 0 0 0 0 0 0 1 1 ['TUE',*,*]: Sh1 Sh2 Sh3 Sh4 Sh5 Sh6 Sh7 Sh8 Sh9 := 1 1 0 0 0 0 0 0 0 0 2 1 1 0 0 0 0 0 0 0 3 1 1 1 0 0 0 0 0 0 4 1 1 1 1 0 0 0 0 0 5 0 1 1 1 1 0 0 0 0 6 1 0 1 1 1 1 0 0 1 7 1 1 0 1 1 1 1 0 1 8 1 1 1 0 1 1 1 1 1 9 1 1 1 1 0 1 1 1 1 10 0 1 1 1 1 0 1 1 1 11 0 0 1 1 1 1 0 1 0 12 0 0 0 1 1 1 1 0 1 13 0 0 0 0 1 1 1 1 1 14 0 0 0 0 0 1 1 1 1 15 0 0 0 0 0 0 1 1 1 16 0 0 0 0 0 0 0 1 1 ['WED',*,*]: Sh1 Sh2 Sh3 Sh4 Sh5 Sh6 Sh7 Sh8 Sh9 := 1 1 0 0 0 0 0 0 0 0 2 1 1 0 0 0 0 0 0 0 3 1 1 1 0 0 0 0 0 0 4 1 1 1 1 0 0 0 0 0 5 0 1 1 1 1 0 0 0 0 6 1 0 1 1 1 1 0 0 1 7 1 1 0 1 1 1 1 0 1 8 1 1 1 0 1 1 1 1 1 9 1 1 1 1 0 1 1 1 1 10 0 1 1 1 1 0 1 1 1 11 0 0 1 1 1 1 0 1 0 12 0 0 0 1 1 1 1 0 1 13 0 0 0 0 1 1 1 1 1 14 0 0 0 0 0 1 1 1 1 15 0 0 0 0 0 0 1 1 1 16 0 0 0 0 0 0 0 1 1 ['THU',*,*]: Sh1 Sh2 Sh3 Sh4 Sh5 Sh6 Sh7 Sh8 Sh9 := 1 1 0 0 0 0 0 0 0 0 2 1 1 0 0 0 0 0 0 0 3 1 1 1 0 0 0 0 0 0 4 1 1 1 1 0 0 0 0 0 5 0 1 1 1 1 0 0 0 0 6 1 0 1 1 1 1 0 0 0 7 1 1 0 1 1 1 1 0 0 8 1 1 1 0 1 1 1 1 0 9 1 1 1 1 0 1 1 1 0 10 0 1 1 1 1 0 1 1 0 11 0 0 1 1 1 1 0 1 0 12 0 0 0 1 1 1 1 0 0 13 0 0 0 0 1 1 1 1 0 14 0 0 0 0 0 1 1 1 0 15 0 0 0 0 0 0 1 1 0 16 0 0 0 0 0 0 0 1 0 ['FRI',*,*]: Sh1 Sh2 Sh3 Sh4 Sh5 Sh6 Sh7 Sh8 Sh9 := 1 1 0 0 0 0 0 0 0 0 2 1 1 0 0 0 0 0 0 0 3 1 1 1 0 0 0 0 0 0 4 1 1 1 1 0 0 0 0 0 5 0 1 1 1 1 0 0 0 0 6 1 0 1 1 1 1 0 0 0 7 1 1 0 1 1 1 1 0 0 8 1 1 1 0 1 1 1 1 0 9 1 1 1 1 0 1 1 1 0 10 0 1 1 1 1 0 1 1 0 11 0 0 1 1 1 1 0 1 0 12 0 0 0 1 1 1 1 0 0 13 0 0 0 0 1 1 1 1 0 14 0 0 0 0 0 1 1 1 0 15 0 0 0 0 0 0 1 1 0 16 0 0 0 0 0 0 0 1 0 ['SAT',*,*]: Sh1 Sh2 Sh3 Sh4 Sh5 Sh6 Sh7 Sh8 Sh9 := 1 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 1 3 0 0 0 0 0 0 0 0 1 4 0 0 0 0 0 0 0 0 1 5 0 0 0 0 0 0 0 0 1 6 0 0 0 0 0 0 0 0 1 7 0 0 0 0 0 0 0 0 1 8 0 0 0 0 0 0 0 0 0 9 0 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 11 0 0 0 0 0 0 0 0 0 12 0 0 0 0 0 0 0 0 0 13 0 0 0 0 0 0 0 0 0 14 0 0 0 0 0 0 0 0 0 15 0 0 0 0 0 0 0 0 0 16 0 0 0 0 0 0 0 0 0; glpk-5.0/examples/shikaku.mod0000644000062000006210000000747313766346220015473 0ustar maomkpasswd/* A solver for the Japanese number-puzzle Shikaku * http://en.wikipedia.org/wiki/Shikaku * * Sebastian Nowozin , 27th January 2009 */ param ndim := 10; set rows := 1..ndim; set rows1 := 1..(ndim+1); set cols := 1..ndim; set cols1 := 1..(ndim+1); param givens{rows, cols}, integer, >= 0, default 0; /* Set of vertices as (row,col) coordinates */ set V := { (i,j) in { rows, cols }: givens[i,j] != 0 }; /* Set of all feasible boxes of the right size: only this boxes are possible. * The box contains (i,j) and ranges from (k,l) to (m,n) */ set B := { (i,j,k,l,m,n) in { V, rows, cols, rows1, cols1 }: i >= k and i < m and j >= l and j < n and /* Contains (i,j) */ ((m-k)*(n-l)) = givens[i,j] and /* Right size */ card({ (s,t) in V: s >= k and s < m and t >= l and t < n }) = 1 /* Contains only (i,j), no other number */ }; var x{B}, binary; /* Cover each square exactly once */ s.t. cover_once{ (s,t) in { rows, cols } }: sum{(i,j,k,l,m,n) in B: s >= k and s < m and t >= l and t < n} x[i,j,k,l,m,n] = 1; minimize cost: 0; solve; /* Output solution graphically */ printf "\nSolution:\n"; for { row in rows1 } { for { col in cols1 } { printf{0..0: card({(i,j,k,l,m,n) in B: col >= l and col <= n and (row = k or row = m) and x[i,j,k,l,m,n] = 1}) > 0 and card({(i,j,k,l,m,n) in B: row >= k and row <= m and (col = l or col = n) and x[i,j,k,l,m,n] = 1}) > 0} "+"; printf{0..0: card({(i,j,k,l,m,n) in B: col >= l and col <= n and (row = k or row = m) and x[i,j,k,l,m,n] = 1}) = 0 and card({(i,j,k,l,m,n) in B: row >= k and row <= m and (col = l or col = n) and x[i,j,k,l,m,n] = 1}) > 0} "|"; printf{0..0: card({(i,j,k,l,m,n) in B: row >= k and row <= m and (col = l or col = n) and x[i,j,k,l,m,n] = 1}) = 0 and card({(i,j,k,l,m,n) in B: col >= l and col <= n and (row = k or row = m) and x[i,j,k,l,m,n] = 1}) > 0} "-"; printf{0..0: card({(i,j,k,l,m,n) in B: row >= k and row <= m and (col = l or col = n) and x[i,j,k,l,m,n] = 1}) = 0 and card({(i,j,k,l,m,n) in B: col >= l and col <= n and (row = k or row = m) and x[i,j,k,l,m,n] = 1}) = 0} " "; printf{0..0: card({(i,j,k,l,m,n) in B: col >= l and col < n and (row = k or row = m) and x[i,j,k,l,m,n] = 1}) > 0} "---"; printf{0..0: card({(i,j,k,l,m,n) in B: col >= l and col < n and (row = k or row = m) and x[i,j,k,l,m,n] = 1}) = 0} " "; } printf "\n"; for { (col,p) in { cols, 1 }: card({ s in rows: s = row }) = 1 } { printf{0..0: card({(i,j,k,l,m,n) in B: row >= k and row < m and (col = l or col = n) and x[i,j,k,l,m,n] = 1}) > 0} "|"; printf{0..0: card({(i,j,k,l,m,n) in B: row >= k and row < m and (col = l or col = n) and x[i,j,k,l,m,n] = 1}) = 0} " "; printf{0..0: card({ (i,j) in V: i = row and j = col}) > 0} " %2d", givens[row,col]; printf{0..0: card({ (i,j) in V: i = row and j = col}) = 0} " ."; } printf{0..0: card({ r in rows: r = row }) = 1} "|\n"; } data; /* This Shikaku is from * http://www.emn.fr/x-info/sdemasse/gccat/KShikaku.html#uid5449 */ param givens : 1 2 3 4 5 6 7 8 9 10 := 1 9 . . . 12 . . 5 . . 2 . . . . . . . . . . 3 . . . . . . . . . 6 4 8 . 6 . 8 . . . . . 5 . . . . . . . . . . 6 . . . . . . . . . . 7 . . . . . 6 . 8 . 12 8 4 . . . . . . . . . 9 . . . . . . . . . . 10 . . 3 . . 9 . . . 4 ; end; glpk-5.0/examples/sorting.mod0000644000062000006210000000305213766346220015506 0ustar maomkpasswd/* sorting.mod - how to sort arrays in MathProg */ /* Written in GNU MathProg by Andrew Makhorin */ # Sometimes it is necessary to print parameters or variables in the # order of ascending or descending their values. Suppose, for example, # that we have the following subscripted parameter: set I := 1..12; param a{i in I} := Uniform(2, 7); # If we print all its members: printf{i in I} "a[%d] = %g\n", i, a[i]; # the output may look like follows: # # a[1] = 2.64156 # a[2] = 2.04798 # a[3] = 2.14843 # a[4] = 4.76896 # a[5] = 6.09132 # a[6] = 3.27780 # a[7] = 4.06113 # a[8] = 4.05898 # a[9] = 6.63120 # a[10] = 6.50318 # a[11] = 3.46065 # a[12] = 4.69845 # # However, we would like the parameter members to appear in the order # of ascending their values. # # Introduce the following auxiliary parameter: param pos{i in I} := 1 + card({j in I: a[j] < a[i] or a[j] = a[i] and j < i}); # where pos[i] = k means that in the sorted list member a[i] would # have k-th position, 1 <= k <= |I|. Then introduce another auxiliary # parameter: param ind{k in 1..card(I)} := sum{i in I: pos[i] = k} i; # where ind[k] = i iff pos[k] = i. # # Now, the following statement: printf{k in 1..card(I)} "a[%d] = %g\n", ind[k], a[ind[k]]; # prints the parameter members in the desired order: # # a[2] = 2.04798 # a[3] = 2.14843 # a[1] = 2.64156 # a[6] = 3.27780 # a[11] = 3.46065 # a[8] = 4.05898 # a[7] = 4.06113 # a[12] = 4.69845 # a[4] = 4.76896 # a[5] = 6.09132 # a[10] = 6.50318 # a[9] = 6.63120 end; glpk-5.0/examples/spp.mod0000644000062000006210000000325313766346220014626 0ustar maomkpasswd/* SPP, Shortest Path Problem */ /* Written in GNU MathProg by Andrew Makhorin */ /* Given a directed graph G = (V,E), its edge lengths c(i,j) for all (i,j) in E, and two nodes s, t in V, the Shortest Path Problem (SPP) is to find a directed path from s to t whose length is minimal. */ param n, integer, > 0; /* number of nodes */ set E, within {i in 1..n, j in 1..n}; /* set of edges */ param c{(i,j) in E}; /* c[i,j] is length of edge (i,j); note that edge lengths are allowed to be of any sign (positive, negative, or zero) */ param s, in {1..n}; /* source node */ param t, in {1..n}; /* target node */ var x{(i,j) in E}, >= 0; /* x[i,j] = 1 means that edge (i,j) belong to shortest path; x[i,j] = 0 means that edge (i,j) does not belong to shortest path; note that variables x[i,j] are binary, however, there is no need to declare them so due to the totally unimodular constraint matrix */ s.t. r{i in 1..n}: sum{(j,i) in E} x[j,i] + (if i = s then 1) = sum{(i,j) in E} x[i,j] + (if i = t then 1); /* conservation conditions for unity flow from s to t; every feasible solution is a path from s to t */ minimize Z: sum{(i,j) in E} c[i,j] * x[i,j]; /* objective function is the path length to be minimized */ data; /* Optimal solution is 20 that corresponds to the following shortest path: s = 1 -> 2 -> 4 -> 8 -> 6 = t */ param n := 8; param s := 1; param t := 6; param : E : c := 1 2 1 1 4 8 1 7 6 2 4 2 3 2 14 3 4 10 3 5 6 3 6 19 4 5 8 4 8 13 5 8 12 6 5 7 7 4 5 8 6 4 8 7 10; end; glpk-5.0/examples/spxsamp1.c0000644000062000006210000000053013766346220015236 0ustar maomkpasswd/* spxsamp1.c */ #include #include #include int main(void) { glp_prob *P; P = glp_create_prob(); glp_read_mps(P, GLP_MPS_DECK, NULL, "25fv47.mps"); glp_adv_basis(P, 0); glp_simplex(P, NULL); glp_print_sol(P, "25fv47.txt"); glp_delete_prob(P); return 0; } /* eof */ glpk-5.0/examples/spxsamp2.c0000644000062000006210000000061313766346220015241 0ustar maomkpasswd/* spxsamp2.c */ #include #include #include int main(void) { glp_prob *P; glp_smcp parm; P = glp_create_prob(); glp_read_mps(P, GLP_MPS_DECK, NULL, "25fv47.mps"); glp_init_smcp(&parm); parm.meth = GLP_DUAL; glp_simplex(P, &parm); glp_print_sol(P, "25fv47.txt"); glp_delete_prob(P); return 0; } /* eof */ glpk-5.0/examples/sql/0000755000062000006210000000000013766346220014117 5ustar maomkpasswdglpk-5.0/examples/sql/mysql_setup.sh0000777000062000006210000000031713766346220017050 0ustar maomkpasswd#!/bin/sh # This file can be used to create database glpk in MySQL. echo MySQL is called for user root. mysql -f -u root -p < sudoku.sql echo MySQL is called for user root. mysql -f -u root -p < transp.sql glpk-5.0/examples/sql/README0000644000062000006210000000035213766346220014777 0ustar maomkpasswdThis subdirectory contains files which demonstrate using data tables in MathProg models for MySQL and iODBC. Script mysql_setup.sh is used to load the data from the *.sql files to a MySQL database. Change the username, if necessary. glpk-5.0/examples/sql/sudoku.sql0000644000062000006210000001222213766346220016151 0ustar maomkpasswdCREATE DATABASE glpk; CREATE USER glpk@localhost IDENTIFIED BY 'gnu'; GRANT ALL PRIVILEGES ON glpk.* TO glpk@localhost; USE glpk; DROP TABLE sudoku; CREATE TABLE sudoku ( ID INT , COL INT , LIN INT , VAL INT , PRIMARY KEY ( ID, COL, LIN ) ); DROP TABLE sudoku_solution; CREATE TABLE sudoku_solution ( ID INT , COL INT , LIN INT , VAL INT , PRIMARY KEY ( ID, COL, LIN ) ); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 1, 1, 5); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 1, 2, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 1, 3, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 1, 4, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 1, 5, 4); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 1, 6, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 1, 7, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 1, 8, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 1, 9, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 2, 1, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 2, 2, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 2, 3, 3); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 2, 4, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 2, 5, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 2, 6, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 2, 7, 6); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 2, 8, 2); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 2, 9, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 3, 1, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 3, 2, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 3, 3, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 3, 4, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 3, 5, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 3, 6, 9); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 3, 7, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 3, 8, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 3, 9, 4); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 4, 1, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 4, 2, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 4, 3, 6); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 4, 4, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 4, 5, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 4, 6, 7); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 4, 7, 2); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 4, 8, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 4, 9, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 5, 1, 8); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 5, 2, 1); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 5, 3, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 5, 4, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 5, 5, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 5, 6, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 5, 7, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 5, 8, 4); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 5, 9, 3); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 6, 1, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 6, 2, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 6, 3, 9); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 6, 4, 1); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 6, 5, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 6, 6, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 6, 7, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 6, 8, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 6, 9, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 7, 1, 7); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 7, 2, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 7, 3, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 7, 4, 5); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 7, 5, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 7, 6, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 7, 7, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 7, 8, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 7, 9, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 8, 1, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 8, 2, 9); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 8, 3, 2); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 8, 4, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 8, 5, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 8, 6, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 8, 7, 8); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 8, 8, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 8, 9, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 9, 1, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 9, 2, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 9, 3, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 9, 4, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 9, 5, 3); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 9, 6, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 9, 7, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 9, 8, 0); INSERT INTO sudoku (ID, COL, LIN, VAL) VALUES (1, 9, 9, 6); glpk-5.0/examples/sql/sudoku_mysql.mod0000644000062000006210000000660713766346220017370 0ustar maomkpasswd/* SUDOKU, Number Placement Puzzle */ /* Written in GNU MathProg by Andrew Makhorin */ /* This example shows how to use the table statement. The sudoku to be solves is read from file sudoku_in.csv. The solution is written to sudoku_out.csv. The file format is CSV as defined in RFC 4180 - Common Format and MIME Type for Comma-Separated Values (CSV) Files */ /* Sudoku, also known as Number Place, is a logic-based placement puzzle. The aim of the canonical puzzle is to enter a numerical digit from 1 through 9 in each cell of a 9x9 grid made up of 3x3 subgrids (called "regions"), starting with various digits given in some cells (the "givens"). Each row, column, and region must contain only one instance of each numeral. Example: +-------+-------+-------+ | 5 3 . | . 7 . | . . . | | 6 . . | 1 9 5 | . . . | | . 9 8 | . . . | . 6 . | +-------+-------+-------+ | 8 . . | . 6 . | . . 3 | | 4 . . | 8 . 3 | . . 1 | | 7 . . | . 2 . | . . 6 | +-------+-------+-------+ | . 6 . | . . . | 2 8 . | | . . . | 4 1 9 | . . 5 | | . . . | . 8 . | . 7 9 | +-------+-------+-------+ (From Wikipedia, the free encyclopedia.) */ set fields dimen 2; param id; param givens{1..9, 1..9}, integer, >= 0, <= 9, default 0; /* the "givens" */ /* table ti IN 'MySQL' 'Database=glpk;UID=glpk;PWD=gnu' 'sudoku' : fields <- [COL, LIN], givens ~ VAL; */ table ti IN 'MySQL' 'Database=glpk;UID=glpk;PWD=gnu' 'SELECT * FROM sudoku WHERE ID = ' & id : fields <- [COL, LIN], givens ~ VAL; var x{i in 1..9, j in 1..9, k in 1..9}, binary; /* x[i,j,k] = 1 means cell [i,j] is assigned number k */ s.t. fa{i in 1..9, j in 1..9, k in 1..9: givens[i,j] != 0}: x[i,j,k] = (if givens[i,j] = k then 1 else 0); /* assign pre-defined numbers using the "givens" */ s.t. fb{i in 1..9, j in 1..9}: sum{k in 1..9} x[i,j,k] = 1; /* each cell must be assigned exactly one number */ s.t. fc{i in 1..9, k in 1..9}: sum{j in 1..9} x[i,j,k] = 1; /* cells in the same row must be assigned distinct numbers */ s.t. fd{j in 1..9, k in 1..9}: sum{i in 1..9} x[i,j,k] = 1; /* cells in the same column must be assigned distinct numbers */ s.t. fe{I in 1..9 by 3, J in 1..9 by 3, k in 1..9}: sum{i in I..I+2, j in J..J+2} x[i,j,k] = 1; /* cells in the same region must be assigned distinct numbers */ /* there is no need for an objective function here */ solve; table ta{(i,j) in fields} OUT 'MySQL' 'Database=glpk;UID=glpk;PWD=gnu' 'DELETE FROM sudoku_solution' 'WHERE ID = ' & id & ';' 'INSERT INTO sudoku_solution' '(ID, COL, LIN, VAL)' 'VALUES(?, ?, ?, ?);' : id ~ ID, i ~ COL, j ~ LIN, (sum{k in 1..9} x[i,j,k] * k) ~ VAL; printf "\nSudoku to be solved\n"; for {i in 1..9} { for {0..0: i = 1 or i = 4 or i = 7} printf " +-------+-------+-------+\n"; for {j in 1..9} { for {0..0: j = 1 or j = 4 or j = 7} printf(" |"); printf " %d", givens[i,j]; for {0..0: j = 9} printf(" |\n"); } for {0..0: i = 9} printf " +-------+-------+-------+\n"; } printf "\nSolution\n"; for {i in 1..9} { for {0..0: i = 1 or i = 4 or i = 7} printf " +-------+-------+-------+\n"; for {j in 1..9} { for {0..0: j = 1 or j = 4 or j = 7} printf(" |"); printf " %d", sum{k in 1..9} x[i,j,k] * k; for {0..0: j = 9} printf(" |\n"); } for {0..0: i = 9} printf " +-------+-------+-------+\n"; } data; param id := 1; end; glpk-5.0/examples/sql/sudoku_odbc.mod0000644000062000006210000000646113766346220017130 0ustar maomkpasswd/* SUDOKU, Number Placement Puzzle */ /* Written in GNU MathProg by Andrew Makhorin */ /* This example shows how to use the table statement. The sudoku to be solves is read from file sudoku_in.csv. The solution is written to sudoku_out.csv. The file format is CSV as defined in RFC 4180 - Common Format and MIME Type for Comma-Separated Values (CSV) Files */ /* Sudoku, also known as Number Place, is a logic-based placement puzzle. The aim of the canonical puzzle is to enter a numerical digit from 1 through 9 in each cell of a 9x9 grid made up of 3x3 subgrids (called "regions"), starting with various digits given in some cells (the "givens"). Each row, column, and region must contain only one instance of each numeral. Example: +-------+-------+-------+ | 5 3 . | . 7 . | . . . | | 6 . . | 1 9 5 | . . . | | . 9 8 | . . . | . 6 . | +-------+-------+-------+ | 8 . . | . 6 . | . . 3 | | 4 . . | 8 . 3 | . . 1 | | 7 . . | . 2 . | . . 6 | +-------+-------+-------+ | . 6 . | . . . | 2 8 . | | . . . | 4 1 9 | . . 5 | | . . . | . 8 . | . 7 9 | +-------+-------+-------+ (From Wikipedia, the free encyclopedia.) */ set fields dimen 2; param id; param givens{1..9, 1..9}, integer, >= 0, <= 9, default 0; /* the "givens" */ table ti IN 'iODBC' 'DSN=glpk;UID=glpk;PWD=gnu' 'SELECT * FROM sudoku' 'WHERE ID = ' & id : fields <- [COL, LIN], givens ~ VAL; var x{i in 1..9, j in 1..9, k in 1..9}, binary; /* x[i,j,k] = 1 means cell [i,j] is assigned number k */ s.t. fa{i in 1..9, j in 1..9, k in 1..9: givens[i,j] != 0}: x[i,j,k] = (if givens[i,j] = k then 1 else 0); /* assign pre-defined numbers using the "givens" */ s.t. fb{i in 1..9, j in 1..9}: sum{k in 1..9} x[i,j,k] = 1; /* each cell must be assigned exactly one number */ s.t. fc{i in 1..9, k in 1..9}: sum{j in 1..9} x[i,j,k] = 1; /* cells in the same row must be assigned distinct numbers */ s.t. fd{j in 1..9, k in 1..9}: sum{i in 1..9} x[i,j,k] = 1; /* cells in the same column must be assigned distinct numbers */ s.t. fe{I in 1..9 by 3, J in 1..9 by 3, k in 1..9}: sum{i in I..I+2, j in J..J+2} x[i,j,k] = 1; /* cells in the same region must be assigned distinct numbers */ /* there is no need for an objective function here */ solve; table ta {(i, j) in {i1 in 1..9} cross {i2 in 1..9}} OUT 'iODBC' 'DSN=glpk;UID=glpk;PWD=gnu' 'DELETE FROM sudoku_solution' 'WHERE ID = ' & id & ';' 'INSERT INTO sudoku_solution' '(ID, COL, LIN, VAL)' 'VALUES(?, ?, ?, ?);' : id ~ ID, i ~ COL, j ~ LIN, (sum{k in 1..9} x[i,j,k] * k) ~ VAL; printf "\nSudoku to be solved\n"; for {i in 1..9} { for {0..0: i = 1 or i = 4 or i = 7} printf " +-------+-------+-------+\n"; for {j in 1..9} { for {0..0: j = 1 or j = 4 or j = 7} printf(" |"); printf " %d", givens[i,j]; for {0..0: j = 9} printf(" |\n"); } for {0..0: i = 9} printf " +-------+-------+-------+\n"; } printf "\nSolution\n"; for {i in 1..9} { for {0..0: i = 1 or i = 4 or i = 7} printf " +-------+-------+-------+\n"; for {j in 1..9} { for {0..0: j = 1 or j = 4 or j = 7} printf(" |"); printf " %d", sum{k in 1..9} x[i,j,k] * k; for {0..0: j = 9} printf(" |\n"); } for {0..0: i = 9} printf " +-------+-------+-------+\n"; } data; param id := 1; end; glpk-5.0/examples/sql/transp.sql0000644000062000006210000000307013766346220016147 0ustar maomkpasswdCREATE DATABASE glpk; CREATE USER glpk@localhost IDENTIFIED BY 'gnu'; GRANT ALL PRIVILEGES ON glpk.* TO glpk@localhost; USE glpk; # production capacity DROP TABLE transp_capa; CREATE TABLE transp_capa ( PLANT TEXT(127), CAPA REAL, PRIMARY KEY ( PLANT(127) ) ); INSERT INTO transp_capa ( PLANT, CAPA ) VALUES ( 'Seattle', 350 ); INSERT INTO transp_capa ( PLANT, CAPA ) VALUES ( 'San Diego', 600 ); # demand DROP TABLE transp_demand; CREATE TABLE transp_demand ( MARKET TEXT(127), DEMAND REAL, PRIMARY KEY ( MARKET(127) ) ); INSERT INTO transp_demand ( MARKET, DEMAND ) VALUES ( 'New York', 325 ); INSERT INTO transp_demand ( MARKET, DEMAND ) VALUES ( 'Chicago', 300 ); INSERT INTO transp_demand ( MARKET, DEMAND ) VALUES ( 'Topeka', 275 ); # distance DROP TABLE transp_dist; CREATE TABLE transp_dist ( LOC1 TEXT(127), LOC2 TEXT(127), DIST REAL, PRIMARY KEY ( LOC1(127), LOC2(127) ) ); INSERT INTO transp_dist ( LOC1, LOC2, DIST ) VALUES ( 'Seattle', 'New York', 2.5 ); INSERT INTO transp_dist ( LOC1, LOC2, DIST ) VALUES ( 'Seattle', 'Chicago', 1.7 ); INSERT INTO transp_dist ( LOC1, LOC2, DIST ) VALUES ( 'Seattle', 'Topeka', 1.8 ); INSERT INTO transp_dist ( LOC1, LOC2, DIST ) VALUES ( 'San Diego', 'New York', 2.5 ); INSERT INTO transp_dist ( LOC1, LOC2, DIST ) VALUES ( 'San Diego', 'Chicago', 1.8 ); INSERT INTO transp_dist ( LOC1, LOC2, DIST ) VALUES ( 'San Diego', 'Topeka', 1.4 ); # result DROP TABLE transp_result; CREATE TABLE transp_result ( LOC1 TEXT(127), LOC2 TEXT(127), QUANTITY REAL, PRIMARY KEY ( LOC1(127), LOC2(127) ) ); glpk-5.0/examples/sql/transp_mysql.mod0000644000062000006210000000317313766346220017360 0ustar maomkpasswd# A TRANSPORTATION PROBLEM # # This problem finds a least cost shipping schedule that meets # requirements at markets and supplies at factories. # # References: # Dantzig G B, "Linear Programming and Extensions." # Princeton University Press, Princeton, New Jersey, 1963, # Chapter 3-3. set I; /* canning plants */ param a{i in I}; /* capacity of plant i in cases */ table plants IN "MySQL" 'Database=glpk;UID=glpk;PWD=gnu' 'SELECT PLANT, CAPA AS CAPACITY FROM transp_capa' : I <- [ PLANT ], a ~ CAPACITY; set J; /* markets */ param b{j in J}; /* demand at market j in cases */ table markets IN "MySQL" 'Database=glpk;UID=glpk;PWD=gnu' 'transp_demand' : J <- [ MARKET ], b ~ DEMAND; param d{i in I, j in J}; /* distance in thousands of miles */ table dist IN "MySQL" 'Database=glpk;UID=glpk;PWD=gnu' 'transp_dist' : [ LOC1, LOC2 ], d ~ DIST; param f; /* freight in dollars per case per thousand miles */ param c{i in I, j in J} := f * d[i,j] / 1000; /* transport cost in thousands of dollars per case */ var x{i in I, j in J} >= 0; /* shipment quantities in cases */ minimize cost: sum{i in I, j in J} c[i,j] * x[i,j]; /* total transportation costs in thousands of dollars */ s.t. supply{i in I}: sum{j in J} x[i,j] <= a[i]; /* observe supply limit at plant i */ s.t. demand{j in J}: sum{i in I} x[i,j] >= b[j]; /* satisfy demand at market j */ solve; table result{i in I, j in J: x[i,j]} OUT "MySQL" 'Database=glpk;UID=glpk;PWD=gnu' 'DELETE FROM transp_result;' 'INSERT INTO transp_result VALUES (?,?,?)' : i ~ LOC1, j ~ LOC2, x[i,j] ~ QUANTITY; data; param f := 90; end; glpk-5.0/examples/sql/transp_odbc.mod0000644000062000006210000000315313766346220017120 0ustar maomkpasswd# A TRANSPORTATION PROBLEM # # This problem finds a least cost shipping schedule that meets # requirements at markets and supplies at factories. # # References: # Dantzig G B, "Linear Programming and Extensions." # Princeton University Press, Princeton, New Jersey, 1963, # Chapter 3-3. set I; /* canning plants */ param a{i in I}; /* capacity of plant i in cases */ table plants IN "iODBC" 'DSN=glpk;UID=glpk;PWD=gnu' 'SELECT PLANT, CAPA AS CAPACITY' 'FROM transp_capa' : I <- [ PLANT ], a ~ CAPACITY; set J; /* markets */ param b{j in J}; /* demand at market j in cases */ table markets IN "iODBC" 'DSN=glpk;UID=glpk;PWD=gnu' 'transp_demand' : J <- [ MARKET ], b ~ DEMAND; param d{i in I, j in J}; /* distance in thousands of miles */ table dist IN "iODBC" 'DSN=glpk;UID=glpk;PWD=gnu' 'transp_dist' : [ LOC1, LOC2 ], d ~ DIST; param f; /* freight in dollars per case per thousand miles */ param c{i in I, j in J} := f * d[i,j] / 1000; /* transport cost in thousands of dollars per case */ var x{i in I, j in J} >= 0; /* shipment quantities in cases */ minimize cost: sum{i in I, j in J} c[i,j] * x[i,j]; /* total transportation costs in thousands of dollars */ s.t. supply{i in I}: sum{j in J} x[i,j] <= a[i]; /* observe supply limit at plant i */ s.t. demand{j in J}: sum{i in I} x[i,j] >= b[j]; /* satisfy demand at market j */ solve; table result{i in I, j in J: x[i,j]} OUT "iODBC" 'DSN=glpk;UID=glpk;PWD=gnu' 'DELETE FROM transp_result;' 'INSERT INTO transp_result VALUES (?,?,?)' : i ~ LOC1, j ~ LOC2, x[i,j] ~ QUANTITY; data; param f := 90; end; glpk-5.0/examples/stigler.mod0000644000062000006210000004675613766346220015514 0ustar maomkpasswd/* STIGLER, original Stigler's 1939 diet problem */ /* The Stigler Diet is an optimization problem named for George Stigler, a 1982 Nobel Laureate in economics, who posed the following problem: For a moderately active man weighing 154 pounds, how much of each of 77 foods should be eaten on a daily basis so that the man's intake of nine nutrients will be at least equal to the recommended dietary allowances (RDSs) suggested by the National Research Council in 1943, with the cost of the diet being minimal? The nutrient RDAs required to be met in Stigler's experiment were calories, protein, calcium, iron, vitamin A, thiamine, riboflavin, niacin, and ascorbic acid. The result was an annual budget allocated to foods such as evaporated milk, cabbage, dried navy beans, and beef liver at a cost of approximately $0.11 a day in 1939 U.S. dollars. While the name "Stigler Diet" was applied after the experiment by outsiders, according to Stigler, "No one recommends these diets for anyone, let alone everyone." The Stigler diet has been much ridiculed for its lack of variety and palatability, however his methodology has received praise and is considered to be some of the earliest work in linear programming. The Stigler diet question is a linear programming problem. Lacking any sophisticated method of solving such a problem, Stigler was forced to utilize heuristic methods in order to find a solution. The diet question originally asked in which quantities a 154 pound male would have to consume 77 different foods in order to fulfill the recommended intake of 9 different nutrients while keeping expense at a minimum. Through "trial and error, mathematical insight and agility," Stigler was able to eliminate 62 of the foods from the original 77 (these foods were removed based because they lacked nutrients in comparison to the remaining 15). From the reduced list, Stigler calculated the required amounts of each of the remaining 15 foods to arrive at a cost-minimizing solution to his question. According to Stigler's calculations, the annual cost of his solution was $39.93 in 1939 dollars. When corrected for inflation using the consumer price index, the cost of the diet in 2005 dollars is $561.43. The specific combination of foods and quantities is as follows: Stigler's 1939 Diet Food Annual Quantities Annual Cost ---------------- ----------------- ----------- Wheat Flour 370 lb. $13.33 Evaporated Milk 57 cans 3.84 Cabbage 111 lb. 4.11 Spinach 23 lb. 1.85 Dried Navy Beans 285 lb. 16.80 ---------------------------------------------- Total Annual Cost $39.93 The 9 nutrients that Stigler's diet took into consideration and their respective recommended daily amounts were: Table of nutrients considered in Stigler's diet Nutrient Daily Recommended Intake ------------------------- ------------------------ Calories 3,000 Calories Protein 70 grams Calcium .8 grams Iron 12 milligrams Vitamin A 5,000 IU Thiamine (Vitamin B1) 1.8 milligrams Riboflavin (Vitamin B2) 2.7 milligrams Niacin 18 milligrams Ascorbic Acid (Vitamin C) 75 milligrams Seven years after Stigler made his initial estimates, the development of George Dantzig's Simplex algorithm made it possible to solve the problem without relying on heuristic methods. The exact value was determined to be $39.69 (using the original 1939 data). Dantzig's algorithm describes a method of traversing the vertices of a polytope of N+1 dimensions in order to find the optimal solution to a specific situation. (From Wikipedia, the free encyclopedia.) */ /* Translated from GAMS by Andrew Makhorin . For the original GAMS model stigler1939.gms see [3]. References: 1. George J. Stigler, "The Cost of Subsistence," J. Farm Econ. 27, 1945, pp. 303-14. 2. National Research Council, "Recommended Daily Allowances," Reprint and Circular Series No. 115, January, 1943. 3. Erwin Kalvelagen, "Model building with GAMS," Chapter 2, "Building linear programming models," pp. 128-34. */ set C; /* commodities */ check card(C) = 77; /* there must be 77 commodities */ set N; /* nutrients */ param data{c in C, {"price", "weight"} union N}; /* nutritive values per dollar of expenditure */ param allowance{n in N}; /* recommended daily allowance for a moderately active man */ var x{c in C}, >= 0; /* dollars of food to be purchased daily */ s.t. nb{n in N}: sum{c in C} data[c,n] * x[c] >= allowance[n]; /* nutrient balance */ minimize cost: sum{c in C} x[c]; /* total food bill */ solve; param days := 365.25; /* days in a year */ param commodity{c in C}, symbolic; param unit{c in C}, symbolic; printf "\n"; printf "MINIMUM COST ANNUAL DIET\n"; printf "\n"; printf " Commodity Unit Quantity Cost \n"; printf "------------------------- ---------- ---------- ----------\n"; printf{c in C: x[c] != 0} "%-25s %10s %10.2f $%7.2f\n", commodity[c], unit[c], 100 * days * x[c] / data[c,"price"], days * x[c]; printf " -----------------\n"; printf " Total: $%7.2f\n", days * sum{c in C} x[c]; printf "\n"; data; param : C : commodity unit := flour "Wheat Flour (Enriched)" "10 lb." macaroni "Macaroni" "1 lb." cereal "Wheat Cereal (Enriched)" "28 oz." cornflakes "Corn Flakes" "8 oz." cornmeal "Corn Meal" "1 lb." grits "Hominy Grits" "24 oz." rice "Rice" "1 lb." oats "Rolled Oats" "1 lb." whitebread "White Bread (Enriched)" "1 lb." wheatbread "Whole Wheat Bread" "1 lb." ryebread "Rye Bread" "1 lb." poundcake "Pound Cake" "1 lb." crackers "Soda Crackers" "1 lb." milk "Milk" "1 qt." evapmild "Evaporated Milk (can)" "14.5 oz." butter "Butter" "1 lb." margarine "Oleomargarine" "1 lb." eggs "Eggs" "1 doz." cheese "Cheese (Cheddar)" "1 lb." cream "Cream" "1/2 pt." peanutbutter "Peanut Butter" "1 lb." mayonnaise "Mayonnaise" "1/2 pt." crisco "Crisco" "1 lb." lard "Lard" "1 lb." sirloinsteak "Sirloin Steak" "1 lb." roundsteak "Round Steak" "1 lb." ribroast "Rib Roast" "1 lb." chuckroast "Chuck Roast" "1 lb." plate "Plate" "1 lb." liver "Liver (Beef)" "1 lb." lambleg "Leg of Lamb" "1 lb." lambchops "Lamb Chops (Rib)" "1 lb." porkchops "Pork Chops" "1 lb." porkroast "Pork Loin Roast" "1 lb." bacon "Bacon" "1 lb." ham "Ham - smoked" "1 lb." saltpork "Salt Pork" "1 lb." chicken "Roasting Chicken" "1 lb." veal "Veal Cutlets" "1 lb." salmon "Salmon, Pink (can)" "16 oz." apples "Apples" "1 lb." bananas "Bananas" "1 lb." lemons "Lemons" "1 doz." oranges "Oranges" "1 doz." greenbeans "Green Beans" "1 lb." cabbage "Cabbage" "1 lb." carrots "Carrots" "1 bunch" celery "Celery" "1 stalk" lettuce "Lettuce" "1 head" onions "Onions" "1 lb." potatoes "Potatoes" "15 lb." spinach "Spinach" "1 lb." sweetpotato "Sweet Potatoes" "1 lb." peaches "Peaches (can)" "No. 2 1/2" pears "Pears (can)" "No. 2 1/2" pineapple "Pineapple (can)" "No. 2 1/2" asparagus "Asparagus (can)" "No. 2" cannedgrbn "Grean Beans (can)" "No. 2" porkbeans "Pork and Beans (can)" "16 oz." corn "Corn (can)" "No. 2" peas "Peas (can)" "No. 2" tomatoes "Tomatoes (can)" "No. 2" tomatosoup "Tomato Soup (can)" "10 1/2 oz." driedpeach "Peaches, Dried" "1 lb." prunes "Prunes, Dried" "1 lb." raisins "Raisins, Dried" "15 oz." driedpeas "Peas, Dried" "1 lb." limabeans "Lima Beans, Dried" "1 lb." navybeans "Navy Beans, Dried" "1 lb." coffee "Coffee" "1 lb." tea "Tea" "1/4 lb." cocoa "Cocoa" "8 oz." chocolate "Chocolate" "8 oz." sugar "Sugar" "10 lb." cornsirup "Corn Sirup" "24 oz." molasses "Molasses" "18 oz." strawberry "Strawberry Preserve" "1 lb." ; set N := calories /* Calories, unit = 1000 */ protein /* Protein, unit = grams */ calcium /* Calcium, unit = grams */ iron /* Iron, unit = milligrams */ vitaminA /* Vitamin A, unit = 1000 International Units */ thiamine /* Thiamine, Vit. B1, unit = milligrams */ riboflavin /* Riboflavin, Vit. B2, unit = milligrams */ niacin /* Niacin (Nicotinic Acid), unit = milligrams */ ascorbicAcid /* Ascorbic Acid, Vit. C, unit = milligrams */ ; param data : price weight calories protein calcium iron := # aug. 15 edible # 1939 per $1 # (cents) (grams) (1000) (grams) (grams) (mg.) flour 36.0 12600 44.7 1411 2.0 365 macaroni 14.1 3217 11.6 418 .7 54 cereal 24.2 3280 11.8 377 14.4 175 cornflakes 7.1 3194 11.4 252 .1 56 cornmeal 4.6 9861 36.0 897 1.7 99 grits 8.5 8005 28.6 680 .8 80 rice 7.5 6048 21.2 460 .6 41 oats 7.1 6389 25.3 907 5.1 341 whitebread 7.9 5742 15.6 488 2.5 115 wheatbread 9.1 4985 12.2 484 2.7 125 ryebread 9.2 4930 12.4 439 1.1 82 poundcake 24.8 1829 8.0 130 .4 31 crackers 15.1 3004 12.5 288 .5 50 milk 11.0 8867 6.1 310 10.5 18 evapmild 6.7 6035 8.4 422 15.1 9 butter 20.8 1473 10.8 9 .2 3 margarine 16.1 2817 20.6 17 .6 6 eggs 32.6 1857 2.9 238 1.0 52 cheese 24.2 1874 7.4 448 16.4 19 cream 14.1 1689 3.5 49 1.7 3 peanutbutter 17.9 2534 15.7 661 1.0 48 mayonnaise 16.7 1198 8.6 18 .2 8 crisco 20.3 2234 20.1 0 .0 0 lard 9.8 4628 41.7 0 .0 0 sirloinsteak 39.6 1145 2.9 166 .1 34 roundsteak 36.4 1246 2.2 214 .1 32 ribroast 29.2 1553 3.4 213 .1 33 chuckroast 22.6 2007 3.6 309 .2 46 plate 14.6 3107 8.5 404 .2 62 liver 26.8 1692 2.2 333 .2 139 lambleg 27.6 1643 3.1 245 .1 20 lambchops 36.6 1239 3.3 140 .1 15 porkchops 30.7 1477 3.5 196 .2 80 porkroast 24.2 1874 4.4 249 .3 37 bacon 25.6 1772 10.4 152 .2 23 ham 27.4 1655 6.7 212 .2 31 saltpork 16.0 2835 18.8 164 .1 26 chicken 30.3 1497 1.8 184 .1 30 veal 42.3 1072 1.7 156 .1 24 salmon 13.0 3489 5.8 705 6.8 45 apples 4.4 9072 5.8 27 .5 36 bananas 6.1 4982 4.9 60 .4 30 lemons 26.0 2380 1.0 21 .5 14 oranges 30.9 4439 2.2 40 1.1 18 greenbeans 7.1 5750 2.4 138 3.7 80 cabbage 3.7 8949 2.6 125 4.0 36 carrots 4.7 6080 2.7 73 2.8 43 celery 7.3 3915 .9 51 3.0 23 lettuce 8.2 2247 .4 27 1.1 22 onions 3.6 11844 5.8 166 3.8 59 potatoes 34.0 16810 14.3 336 1.8 118 spinach 8.1 4592 1.1 106 .0 138 sweetpotato 5.1 7649 9.6 138 2.7 54 peaches 16.8 4894 3.7 20 .4 10 pears 20.4 4030 3.0 8 .3 8 pineapple 21.3 3993 2.4 16 .4 8 asparagus 27.7 1945 .4 33 .3 12 cannedgrbn 10.0 5386 1.0 54 2.0 65 porkbeans 7.1 6389 7.5 364 4.0 134 corn 10.4 5452 5.2 136 .2 16 peas 13.8 4109 2.3 136 .6 45 tomatoes 8.6 6263 1.3 63 .7 38 tomatosoup 7.6 3917 1.6 71 .6 43 driedpeach 15.7 2889 8.5 87 1.7 173 prunes 9.0 4284 12.8 99 2.5 154 raisins 9.4 4524 13.5 104 2.5 136 driedpeas 7.9 5742 20.0 1367 4.2 345 limabeans 8.9 5097 17.4 1055 3.7 459 navybeans 5.9 7688 26.9 1691 11.4 792 coffee 22.4 2025 .0 0 .0 0 tea 17.4 652 .0 0 .0 0 cocoa 8.6 2637 8.7 237 3.0 72 chocolate 16.2 1400 8.0 77 1.3 39 sugar 51.7 8773 34.9 0 .0 0 cornsirup 13.7 4996 14.7 0 .5 74 molasses 13.6 3752 9.0 0 10.3 244 strawberry 20.5 2213 6.4 11 .4 7 : vitaminA thiamine riboflavin niacin ascorbicAcid := # (1000 IU) (mg.) (mg.) (mg.) (mg.) flour .0 55.4 33.3 441 0 macaroni .0 3.2 1.9 68 0 cereal .0 14.4 8.8 114 0 cornflakes .0 13.5 2.3 68 0 cornmeal 30.9 17.4 7.9 106 0 grits .0 10.6 1.6 110 0 rice .0 2.0 4.8 60 0 oats .0 37.1 8.9 64 0 whitebread .0 13.8 8.5 126 0 wheatbread .0 13.9 6.4 160 0 ryebread .0 9.9 3.0 66 0 poundcake 18.9 2.8 3.0 17 0 crackers .0 .0 .0 0 0 milk 16.8 4.0 16.0 7 177 evapmild 26.0 3.0 23.5 11 60 butter 44.2 .0 .2 2 0 margarine 55.8 .2 .0 0 0 eggs 18.6 2.8 6.5 1 0 cheese 28.1 .8 10.3 4 0 cream 16.9 .6 2.5 0 17 peanutbutter .0 9.6 8.1 471 0 mayonnaise 2.7 .4 .5 0 0 crisco .0 .0 .0 0 0 lard .2 .0 .5 5 0 sirloinsteak .2 2.1 2.9 69 0 roundsteak .4 2.5 2.4 87 0 ribroast .0 .0 2.0 0 0 chuckroast .4 1.0 4.0 120 0 plate .0 .9 .0 0 0 liver 169.2 6.4 50.8 316 525 lambleg .0 2.8 3.0 86 0 lambchops .0 1.7 2.7 54 0 porkchops .0 17.4 2.7 60 0 porkroast .0 18.2 3.6 79 0 bacon .0 1.8 1.8 71 0 ham .0 9.9 3.3 50 0 saltpork .0 1.4 1.8 0 0 chicken .1 .9 1.8 68 46 veal .0 1.4 2.4 57 0 salmon 3.5 1.0 4.9 209 0 apples 7.3 3.6 2.7 5 544 bananas 17.4 2.5 3.5 28 498 lemons .0 .5 .0 4 952 oranges 11.1 3.6 1.3 10 1993 greenbeans 69.0 4.3 5.8 37 862 cabbage 7.2 9.0 4.5 26 5369 carrots 188.5 6.1 4.3 89 608 celery .9 1.4 1.4 9 313 lettuce 112.4 1.8 3.4 11 449 onions 16.6 4.7 5.9 21 1184 potatoes 6.7 29.4 7.1 198 2522 spinach 918.4 5.7 13.8 33 2755 sweetpotato 290.7 8.4 5.4 83 1912 peaches 21.5 .5 1.0 31 196 pears .8 .8 .8 5 81 pineapple 2.0 2.8 .8 7 399 asparagus 16.3 1.4 2.1 17 272 cannedgrbn 53.9 1.6 4.3 32 431 porkbeans 3.5 8.3 7.7 56 0 corn 12.0 1.6 2.7 42 218 peas 34.9 4.9 2.5 37 370 tomatoes 53.2 3.4 2.5 36 1253 tomatosoup 57.9 3.5 2.4 67 862 driedpeach 86.8 1.2 4.3 55 57 prunes 85.7 3.9 4.3 65 257 raisins 4.5 6.3 1.4 24 136 driedpeas 2.9 28.7 18.4 162 0 limabeans 5.1 26.9 38.2 93 0 navybeans .0 38.4 24.6 217 0 coffee .0 4.0 5.1 50 0 tea .0 .0 2.3 42 0 cocoa .0 2.0 11.9 40 0 chocolate .0 .9 3.4 14 0 sugar .0 .0 .0 0 0 cornsirup .0 .0 .0 5 0 molasses .0 1.9 7.5 146 0 strawberry .2 .2 .4 3 0 ; param allowance := calories 3 protein 70 calcium .8 iron 12 vitaminA 5 thiamine 1.8 riboflavin 2.7 niacin 18 ascorbicAcid 75 ; end; glpk-5.0/examples/sudoku.dat0000644000062000006210000000063313766346220015326 0ustar maomkpasswd/* sudoku.dat, a hard Sudoku puzzle which causes branching */ data; param givens : 1 2 3 4 5 6 7 8 9 := 1 1 . . . . . 7 . . 2 . 2 . . . . 5 . . 3 6 . . 3 8 . . . . 4 . 7 8 . . . . . . 5 . . . 6 . 9 . . . 6 . . . . . . 1 4 . 7 . . . . 2 5 . . 9 8 . . 3 . . . . 6 . 9 . . 4 . . . . . 2 ; end; glpk-5.0/examples/sudoku.mod0000644000062000006210000000505213766346220015335 0ustar maomkpasswd/* SUDOKU, Number Placement Puzzle */ /* Written in GNU MathProg by Andrew Makhorin */ /* Sudoku, also known as Number Place, is a logic-based placement puzzle. The aim of the canonical puzzle is to enter a numerical digit from 1 through 9 in each cell of a 9x9 grid made up of 3x3 subgrids (called "regions"), starting with various digits given in some cells (the "givens"). Each row, column, and region must contain only one instance of each numeral. Example: +-------+-------+-------+ | 5 3 . | . 7 . | . . . | | 6 . . | 1 9 5 | . . . | | . 9 8 | . . . | . 6 . | +-------+-------+-------+ | 8 . . | . 6 . | . . 3 | | 4 . . | 8 . 3 | . . 1 | | 7 . . | . 2 . | . . 6 | +-------+-------+-------+ | . 6 . | . . . | 2 8 . | | . . . | 4 1 9 | . . 5 | | . . . | . 8 . | . 7 9 | +-------+-------+-------+ (From Wikipedia, the free encyclopedia.) */ param givens{1..9, 1..9}, integer, >= 0, <= 9, default 0; /* the "givens" */ var x{i in 1..9, j in 1..9, k in 1..9}, binary; /* x[i,j,k] = 1 means cell [i,j] is assigned number k */ s.t. fa{i in 1..9, j in 1..9, k in 1..9: givens[i,j] != 0}: x[i,j,k] = (if givens[i,j] = k then 1 else 0); /* assign pre-defined numbers using the "givens" */ s.t. fb{i in 1..9, j in 1..9}: sum{k in 1..9} x[i,j,k] = 1; /* each cell must be assigned exactly one number */ s.t. fc{i in 1..9, k in 1..9}: sum{j in 1..9} x[i,j,k] = 1; /* cells in the same row must be assigned distinct numbers */ s.t. fd{j in 1..9, k in 1..9}: sum{i in 1..9} x[i,j,k] = 1; /* cells in the same column must be assigned distinct numbers */ s.t. fe{I in 1..9 by 3, J in 1..9 by 3, k in 1..9}: sum{i in I..I+2, j in J..J+2} x[i,j,k] = 1; /* cells in the same region must be assigned distinct numbers */ /* there is no need for an objective function here */ solve; for {i in 1..9} { for {0..0: i = 1 or i = 4 or i = 7} printf " +-------+-------+-------+\n"; for {j in 1..9} { for {0..0: j = 1 or j = 4 or j = 7} printf(" |"); printf " %d", sum{k in 1..9} x[i,j,k] * k; for {0..0: j = 9} printf(" |\n"); } for {0..0: i = 9} printf " +-------+-------+-------+\n"; } data; /* These data correspond to the example above. */ param givens : 1 2 3 4 5 6 7 8 9 := 1 5 3 . . 7 . . . . 2 6 . . 1 9 5 . . . 3 . 9 8 . . . . 6 . 4 8 . . . 6 . . . 3 5 4 . . 8 . 3 . . 1 6 7 . . . 2 . . . 6 7 . 6 . . . . 2 8 . 8 . . . 4 1 9 . . 5 9 . . . . 8 . . 7 9 ; end; glpk-5.0/examples/t1.cs0000644000062000006210000000666713766346220014212 0ustar maomkpasswd/*Find the minimum value which satisfies the linear inequality: a*x + b*y >= 1 {a,b,x,y Integers} {a,b > 0} {a,b entered on command line} Nigel_Galloway@operamail.com February 2008 */ using System; using System.Runtime.InteropServices; unsafe class GLPK{ double *lp; public int a; public int b; const string glpkLibrary = "libglpk.so"; readonly int GLP_FR = 1; readonly int GLP_IV = 2; readonly int GLP_DB = 4; struct ConstraintMatrix{ public fixed int ia[3]; public fixed int ja[3]; public fixed double ar[3]; } [DllImport(glpkLibrary, SetLastError=true)] static extern double* glp_create_prob(); [DllImport(glpkLibrary, SetLastError=true)] static extern void glp_add_rows(double* lp, int rows); [DllImport(glpkLibrary, SetLastError=true)] static extern void glp_add_cols(double* lp, int cols); [DllImport(glpkLibrary, SetLastError=true)] static extern void glp_set_col_bnds(double* lp, int col, int bound_type, double lower_bound, double upper_bound); [DllImport(glpkLibrary, SetLastError=true)] static extern void glp_set_col_kind(double* lp, int col, int kind); [DllImport(glpkLibrary, SetLastError=true)] static extern void glp_load_matrix(double* lp, int elements, int* ia, int* ja, double* ar); public GLPK(int a, int b){ this.a = a; this.b = b; lp = glp_create_prob(); //Col 1 is x, Col 2 is y glp_add_rows(lp, 1); glp_add_cols(lp, 2); glp_set_col_bnds(lp, 1, GLP_FR, 0.0, 0.0); glp_set_col_bnds(lp, 2, GLP_FR, 0.0, 0.0); glp_set_col_kind(lp, 1, GLP_IV); glp_set_col_kind(lp, 2, GLP_IV); //Row 1 is a*x + b*y ConstraintMatrix CM = new ConstraintMatrix(); CM.ia[1]=1; CM.ja[1]=1; CM.ar[1]=a; CM.ia[2]=1; CM.ja[2]=2; CM.ar[2]=b; glp_load_matrix(lp, 2, CM.ia, CM.ja, CM.ar); Console.WriteLine("Hello Nigel"); } [DllImport(glpkLibrary, SetLastError=true)] static extern void glp_set_row_bnds(double* lp, int row, int bound_type, double lower_bound, double upper_bound); [DllImport(glpkLibrary, SetLastError=true)] static extern void glp_simplex(double* lp, void* options); [DllImport(glpkLibrary, SetLastError=true)] static extern void glp_intopt(double* lp, void* options); [DllImport(glpkLibrary, SetLastError=true)] static extern double glp_mip_col_val(double* lp, int col); public int betterGuess(int upper_bound){ //Find a new guess less than the old guess: 1 <= (a*x + b*y) <= (old guess - 1) glp_set_row_bnds(lp, 1, GLP_DB, 1.0, ((double)upper_bound)-0.5); glp_simplex(lp, null); glp_intopt(lp, null); int x = (int)glp_mip_col_val(lp, 1); int y = (int)glp_mip_col_val(lp, 2); int nextGuess = a*x + b*y; Console.WriteLine("x = {0}, y = {1}, a*x + b*y = {2}",x,y,nextGuess); return nextGuess; } [DllImport(glpkLibrary, SetLastError=true)] static extern void glp_delete_prob(double* lp); ~GLPK(){ glp_delete_prob(lp); Console.WriteLine("Goodbye Nigel"); } } class test{ static bool isMinimum(int a, int b, int guess){ Console.WriteLine("Trying {0}",guess); if (a%guess > 0) return false; if (b%guess > 0) return false; Console.WriteLine("Solution is {0}",guess); return true; } public static void Main(string[] args){ Console.WriteLine("a = {0}, b = {1}",args[0], args[1]); GLPK lp = new GLPK(Int32.Parse(args[0]),Int32.Parse(args[1])); int guess = (lp.a > lp.b) ? lp.b : lp.a; while (!isMinimum(lp.a,lp.b,guess)) guess = lp.betterGuess(guess); } } glpk-5.0/examples/tas.mod0000644000062000006210000005005013766346220014610 0ustar maomkpasswd/* TAS, Tail Assignment Problem */ /* Written in GNU MathProg by Andrew Makhorin */ /* The Tail Assignment Problem (TAS) is to construct rosters for a set of aircrafts (tails), which cover all flights for a given scheduling period. This model includes only flight connection constraints while other constraints (for example, maintenance constraints) are ignored. Such simplification allows using a single commodity network to model the problem, where commodity corresponds to the set of aircrafts. Nodes of the network are activities. They include all flights plus two dummy nodes (activities): source node, s, corresponding to initial activity of each aircraft, and sink node t, corresponding to final activity of each aircraft. Arc v->v' exists in the network if and only if the same aircraft is able to operate activity v and then immediately activity v'. In partucular, arcs s->f and f->t exist for all flights f. Arcs f->f', where f and f' are some flights, exist only if the connection time (which is the difference between the departure time of f' and the arrival time of f) is not less than a given minimal connection time. Reference: M. Groenkvist, "The Tail Assignment Problem," Dept. of Comp. Sci. and Eng., Chalmers University of Technology and Goeteborg University, Goeteborg, Sweden, August 2005. */ ######################################################################## param nf, integer, > 0; /* number of flights */ set F := 1..nf; /* set of flights (for a given period from timetable) */ param hub{f in F}, in {1, 2}; /* hub[f] = 1: Sheremetyevo-1 hub[f] = 2: Sheremetyevo-2 */ param dest{f in F}, symbolic; /* destination airport (IATA code) */ param fno1{f in F}, integer; /* first leg flight number */ param dep1{f in F}, integer, >= 0; /* departure time from Sheremetyevo airport, in minutes */ check{f in F: f < nf}: dep1[f] <= dep1[f+1]; /* all flights must be ordered by ascending of the departure time */ param arr1{f in F}, integer, >= 0; /* arrival time to destination airport, in minutes */ param fno2{f in F}, integer; /* second leg flight number */ param dep2{f in F}, integer, >= 0; /* departure time from destination airport, in minutes */ param arr2{f in F}, integer, >= 0; /* arrival time to Sheremetyevo airport, in minutes */ param mct1, integer, >= 0, default 80; /* minimal connection time (within SVO1 or SVO2), in minutes */ param mct2, integer, >= 0, default 150; /* minimal connection time (between SVO1 and SVO2), in minutes */ set E := setof{f in F, ff in F: arr2[f] + (if hub[f] = hub[ff] then mct1 else mct2) <= dep1[ff]} (f, ff); /* connection network; arc f->ff is in E, iff the same aircraft can be assigned to flight f and then immediately to flight ff */ var s{f in F}, >= 0; /* s[f] is a flow from source node to node f */ var x{(f,ff) in E}, >= 0; /* x[f,ff] is a flow from node f to node ff */ var t{f in F}, >= 0; /* t[f] is a flow from node f to sink node */ s.t. into{f in F}: s[f] + sum{(ff,f) in E} x[ff,f] = 1; /* exactly one aircraft must come into each node f */ s.t. from{f in F}: t[f] + sum{(f,ff) in E} x[f,ff] = 1; /* exactly one aircraft must come from each node f */ minimize obj: sum{f in F} s[f]; /* minimize the number aircrafts sufficient to cover all flights */ solve; ######################################################################## param na := floor(sum{f in F} s[f] + .5); /* minimal number of aircrafts found */ printf "At least %d aircrafts needed\n", na; set A := 1..na; /* set of aircrafts */ printf "Building rosters...\n"; param tail{f in F}, in A, := /* tail[f] is the number of an aircraft assigned to flight f */ if f = 1 then 1 /* assign aircraft 1 to the earliest flight */ else if s[f] >= 0.9 then (max{ff in 1..f-1} tail[ff]) + 1 /* if f is the first flight in a roster, assign to it a next aircraft */ else sum{(ff,f) in E} tail[ff] * (if x[ff,f] >= 0.9 then 1); /* otherwise, assign to flight f the same aircraft, which is assigned to a preceding flight in the roster */ ######################################################################## param file, symbolic, default "tas.ps"; /* file to output the assignment chart in postscript format */ param title, symbolic, default "(no title)"; /* chart title */ param left, default 25; /* left margin, in mm */ param top, default 25; /* top margin, in mm */ param right, default 20; /* right margin, in mm */ param bottom, default 15; /* bottom margin, in mm */ param sx := 297 - left - right; /* chart area horizontal size, in mm */ param sy := 210 - top - bottom; /* chart area vertical size, in mm */ param gap, default sy / (na - 1); /* gap between rosters, in mm */ printf "Writing assignment chart to %s...\n", file; printf "%%!PS-Adobe-3.0\n" > file; printf "%%%%Title: Tail Assignment Chart\n" >> file; printf "%%%%Creator: GLPK MathProg\n" >> file; printf "%%%%BoundingBox: 0 0 595 842\n" >> file; printf "%%%%EndComments\n" >> file; printf "<> setpagedevice\n" >> file; printf "72 25.4 div dup scale\n" >> file; printf "210 %.3f sub %.3f translate\n", bottom, left >> file; printf "90 rotate\n" >> file; printf "/HelveticaBold findfont 5 scalefont setfont\n" >> file; printf "%.3f %.3f moveto (%s) dup show\n", 0, sy + 5, title >> file; param period := floor((max{f in F} arr2[f]) / 60. + .5); /* period duration, in hours */ /* vertical bars */ printf ".8 .8 .8 setrgbcolor\n" >> file; for {tt in 0..period} { printf "%s setlinewidth\n", if tt mod 24 = 0 then ".5" else "0" >> file; printf "newpath %.3f %.3f moveto %.3f %.3f lineto stroke\n", tt * (sx / period), 0, tt * (sx / period), sy + (if tt mod 24 = 0 then 2) >> file; } /* rosters */ for {a in A} { printf "0 0 0 setrgbcolor\n" >> file; printf "0 setlinewidth\n" >> file; printf "newpath %.3f %.3f moveto %.3f %.3f lineto stroke\n", 0, sy - gap * (a - 1), sx, sy - gap * (a - 1) >> file; printf "/Dingbats findfont 4 scalefont setfont\n" >> file; printf "%.3f %.3f moveto <28> dup show\n", -4, sy - gap * (a - 1) - 1.4, a >> file; printf "/Helvetica findfont 3 scalefont setfont\n" >> file; printf "%.3f %.3f moveto (%2d) dup show\n", -9, sy - gap * (a - 1) - 1.2, a >> file; for {f in F: tail[f] == a} { printf "0 0 %s setrgbcolor\n", if hub[f] = 1 then "0" else ".8" >> file; printf "1 setlinewidth\n" >> file; printf "newpath %.3f %.3f moveto %.3f %.3f lineto stroke\n", dep1[f] / 60 * (sx / period), sy - gap * (a - 1), arr2[f] / 60 * (sx / period), sy - gap * (a - 1) >> file; printf "/Helvetica findfont 1.8 scalefont setfont\n" >> file; printf "%.3f %.3f moveto (%02d:%02d %s) dup show\n", dep1[f] / 60 * (sx / period), sy - gap * (a - 1) + .8, (dep1[f] mod 1440) div 60, (dep1[f] mod 1440) mod 60, dest[f] >> file; printf "%.3f %.3f moveto (%d %02d:%02d) dup show\n", dep1[f] / 60 * (sx / period), sy - gap * (a - 1) - 2.1, fno1[f], (arr2[f] mod 1440) div 60, (arr2[f] mod 1440) mod 60 >> file; } } printf "showpage\n" >> file; printf "%%%%EOF\n" >> file; ######################################################################## data; param title := "Tu-154 [from 2008-08-18 to 2008-08-24]"; param nf := 261; param : hub dest fno1 dep1 arr1 fno2 dep2 arr2 := 1 1 IKT 743 195 520 744 610 970 2 1 OMS 815 205 405 816 485 700 3 1 CEK 897 205 360 898 430 595 4 1 KRR 763 260 400 764 480 610 5 2 SIP 133 280 420 134 500 620 6 2 BUD 131 290 450 132 520 675 7 1 AAQ 701 305 440 702 510 640 8 1 MRV 785 310 440 786 520 650 9 2 WAW 101 355 475 102 540 660 10 2 GYD 147 370 550 148 675 860 11 1 AER 869 385 530 870 655 795 12 1 KRR 765 430 560 766 630 760 13 1 AAQ 703 520 660 704 740 850 14 1 LED 845 530 620 846 690 775 15 1 KRR 767 540 675 768 765 895 16 2 KBP 183 665 760 184 850 940 17 1 MRV 787 755 905 788 985 1135 18 1 KRR 771 810 940 772 1030 1165 19 1 LED 849 825 900 850 960 1095 20 2 IST 209 880 1050 210 1120 1280 21 1 AER 873 885 1030 874 1760 1900 22 1 ASF 711 995 1145 712 1640 1795 23 2 ULN 563 995 1335 564 1415 1815 24 2 OTP 151 1020 1175 152 1800 1940 25 2 BEY 509 1025 1265 510 1350 1580 26 2 OSL 211 1060 1220 212 1860 2015 27 1 IKT 739 1085 1420 740 1510 1870 28 1 KRR 773 1095 1240 774 1620 1765 29 1 SGC 877 1120 1315 878 1395 1625 30 1 LED 857 1150 1230 858 1610 1690 31 1 CEK 899 1230 1385 900 1455 1620 32 1 PEE 821 1235 1390 822 1450 1600 33 2 TBS 197 1240 1405 198 1560 1715 34 1 UFA 891 1275 1405 892 1475 1610 35 1 KJA 781 1300 1570 782 1680 1990 36 1 IKT 743 1635 1960 744 2050 2410 37 1 OMS 815 1645 1845 816 1925 2140 38 1 CEK 897 1645 1800 898 1870 2035 39 1 KRR 763 1700 1840 764 1920 2050 40 2 SIP 133 1720 1860 134 1940 2060 41 2 BUD 131 1730 1890 132 1960 2115 42 1 AAQ 701 1745 1880 702 1950 2080 43 1 MRV 785 1750 1880 786 1960 2090 44 2 WAW 101 1795 1915 102 1980 2100 45 2 GYD 147 1810 1990 148 2115 2300 46 1 AER 869 1825 1970 870 2095 2235 47 2 EVN 193 1850 2030 194 2105 2275 48 1 KRR 765 1870 2000 766 2070 2200 49 1 AAQ 703 1960 2100 704 2180 2290 50 1 LED 845 1970 2060 846 2130 2215 51 1 KRR 767 1980 2115 768 2205 2335 52 2 KBP 183 2105 2200 184 2290 2380 53 1 MRV 787 2195 2345 788 2425 2575 54 1 KRR 771 2250 2380 772 2470 2605 55 1 LED 849 2265 2340 850 2400 2535 56 2 IST 209 2320 2490 210 2560 2720 57 1 AER 873 2325 2470 874 3200 3340 58 2 ULN 563 2435 2775 564 2855 3255 59 1 ASF 711 2435 2585 712 3080 3235 60 2 DAM 517 2465 2705 518 2790 3020 61 2 OSL 211 2500 2660 212 3300 3455 62 2 KBP 185 2510 2610 186 3160 3250 63 1 IKT 739 2525 2860 740 2950 3310 64 1 KRR 773 2535 2680 774 3060 3205 65 1 SGC 877 2560 2755 878 2835 3065 66 1 LED 857 2590 2670 858 3050 3130 67 1 CEK 899 2670 2825 900 2895 3060 68 1 PEE 821 2675 2830 822 2890 3040 69 2 TBS 197 2680 2845 198 3000 3155 70 1 UFA 891 2715 2845 892 2915 3050 71 1 KJA 781 2740 3010 782 3120 3430 72 1 IKT 743 3075 3400 744 3490 3850 73 1 CEK 897 3085 3240 898 3310 3475 74 1 OMS 815 3085 3285 816 3365 3580 75 1 KRR 763 3140 3280 764 3360 3490 76 2 SIP 133 3160 3300 134 3380 3500 77 2 BUD 131 3170 3330 132 3400 3555 78 1 AAQ 701 3185 3320 702 3390 3520 79 1 MRV 785 3190 3320 786 3400 3530 80 2 WAW 101 3235 3355 102 3420 3540 81 2 FRU 181 3245 3495 182 3590 3860 82 2 GYD 147 3250 3430 148 3555 3740 83 1 AER 869 3265 3410 870 3535 3675 84 1 KRR 765 3310 3440 766 3510 3640 85 1 AAQ 703 3400 3540 704 3620 3730 86 1 LED 845 3410 3500 846 3570 3655 87 1 KRR 767 3420 3555 768 3645 3775 88 2 KBP 183 3545 3640 184 3730 3820 89 1 MRV 787 3635 3785 788 3865 4015 90 1 KRR 771 3690 3820 772 3910 4045 91 1 LED 849 3705 3780 850 3840 3975 92 2 IST 209 3760 3930 210 4000 4160 93 1 AER 873 3765 3910 874 4640 4780 94 2 ULN 563 3875 4215 564 4295 4695 95 1 ASF 711 3875 4025 712 4520 4675 96 2 OTP 151 3900 4055 152 4680 4820 97 2 BEY 509 3905 4145 510 4230 4460 98 2 OSL 211 3940 4100 212 4740 4895 99 2 KBP 185 3950 4050 186 4600 4690 100 1 IKT 739 3965 4300 740 4390 4750 101 1 KRR 773 3975 4120 774 4500 4645 102 1 SGC 877 4000 4195 878 4275 4505 103 1 LED 857 4030 4110 858 4490 4570 104 1 CEK 899 4110 4265 900 4335 4500 105 1 PEE 821 4115 4270 822 4330 4480 106 2 TBS 197 4120 4285 198 4440 4595 107 1 UFA 891 4155 4285 892 4355 4490 108 1 KJA 781 4180 4450 782 4560 4870 109 1 IKT 743 4515 4840 744 4930 5290 110 1 OMS 815 4525 4725 816 4805 5020 111 1 CEK 897 4525 4680 898 4750 4915 112 1 KRR 763 4580 4720 764 4800 4930 113 2 SIP 133 4600 4740 134 4820 4940 114 2 BUD 131 4610 4770 132 4840 4995 115 1 AAQ 701 4625 4760 702 4830 4960 116 1 MRV 785 4630 4760 786 4840 4970 117 2 WAW 101 4675 4795 102 4860 4980 118 2 GYD 147 4690 4870 148 4995 5180 119 1 AER 869 4705 4850 870 4975 5115 120 2 EVN 193 4730 4910 194 4985 5155 121 1 KRR 765 4750 4880 766 4950 5080 122 1 AAQ 703 4840 4980 704 5060 5170 123 1 LED 845 4850 4940 846 5010 5095 124 1 KRR 767 4860 4995 768 5085 5215 125 2 KBP 183 4985 5080 184 5170 5260 126 1 MRV 787 5075 5225 788 5305 5455 127 1 KRR 771 5130 5260 772 5350 5485 128 1 LED 849 5145 5220 850 5280 5415 129 2 IST 209 5200 5370 210 5440 5600 130 1 AER 873 5205 5350 874 6080 6220 131 1 ASF 711 5315 5465 712 5960 6115 132 2 ULN 563 5315 5655 564 5735 6135 133 2 DAM 517 5345 5585 518 5670 5900 134 2 OSL 211 5380 5540 212 6180 6335 135 2 KBP 185 5390 5490 186 6040 6130 136 1 IKT 739 5405 5740 740 5830 6190 137 1 KRR 773 5415 5560 774 5940 6085 138 1 SGC 877 5440 5635 878 5715 5945 139 1 LED 857 5470 5550 858 5930 6010 140 1 CEK 899 5550 5705 900 5775 5940 141 1 PEE 821 5555 5710 822 5770 5920 142 2 TBS 197 5560 5725 198 5880 6035 143 1 UFA 891 5595 5725 892 5795 5930 144 1 KJA 781 5620 5890 782 6000 6310 145 1 IKT 743 5955 6280 744 6370 6730 146 1 OMS 815 5965 6165 816 6245 6460 147 1 CEK 897 5965 6120 898 6190 6355 148 1 KRR 763 6020 6160 764 6240 6370 149 2 SIP 133 6040 6180 134 6260 6380 150 2 BUD 131 6050 6210 132 6280 6435 151 1 AAQ 701 6065 6200 702 6270 6400 152 1 MRV 785 6070 6200 786 6280 6410 153 2 WAW 101 6115 6235 102 6300 6420 154 2 FRU 181 6125 6375 182 6470 6740 155 2 GYD 147 6130 6310 148 6435 6620 156 1 AER 869 6145 6290 870 6415 6555 157 2 EVN 193 6170 6350 194 6425 6595 158 1 KRR 765 6190 6320 766 6390 6520 159 1 AAQ 703 6280 6420 704 6500 6610 160 1 LED 845 6290 6380 846 6450 6535 161 1 KRR 767 6300 6435 768 6525 6655 162 2 KBP 183 6425 6520 184 6610 6700 163 2 AYT 223 6500 6690 224 6750 6940 164 1 AER 867 6510 6660 868 6730 6880 165 1 MRV 787 6515 6665 788 6745 6895 166 1 KRR 771 6570 6700 772 6790 6925 167 1 LED 849 6585 6660 850 6720 6855 168 2 IST 209 6640 6810 210 6880 7040 169 1 AER 873 6645 6790 874 7520 7660 170 1 ASF 711 6755 6905 712 7400 7555 171 2 ULN 563 6755 7095 564 7175 7575 172 2 OTP 151 6780 6935 152 7560 7700 173 2 BEY 509 6785 7025 510 7110 7340 174 2 OSL 211 6820 6980 212 7620 7775 175 2 KBP 185 6830 6930 186 7480 7570 176 1 IKT 739 6845 7180 740 7270 7630 177 1 KRR 773 6855 7000 774 7380 7525 178 1 SGC 877 6880 7075 878 7155 7385 179 1 LED 857 6910 6990 858 7370 7450 180 1 CEK 899 6990 7145 900 7215 7380 181 1 PEE 821 6995 7150 822 7210 7360 182 2 TBS 197 7000 7165 198 7320 7475 183 1 UFA 891 7035 7165 892 7235 7370 184 1 KJA 781 7060 7330 782 7440 7750 185 1 IKT 743 7395 7720 744 7810 8170 186 1 CEK 897 7405 7560 898 7630 7795 187 1 KRR 763 7460 7600 764 7680 7810 188 2 SIP 133 7480 7620 134 7700 7820 189 2 BUD 131 7490 7650 132 7720 7875 190 1 AAQ 701 7505 7640 702 7710 7840 191 1 MRV 785 7510 7640 786 7720 7850 192 2 IST 207 7545 7720 208 7795 7985 193 2 WAW 101 7555 7675 102 7740 7860 194 2 GYD 147 7570 7750 148 7875 8060 195 1 AER 869 7585 7730 870 7855 7995 196 2 AYT 221 7610 7800 222 7895 8085 197 2 EVN 193 7610 7790 194 7865 8035 198 1 KRR 765 7630 7760 766 7830 7960 199 1 AAQ 703 7720 7860 704 7940 8050 200 1 LED 845 7730 7820 846 7890 7975 201 1 KRR 767 7740 7875 768 7965 8095 202 2 KBP 183 7865 7960 184 8050 8140 203 2 AYT 223 7940 8130 224 8190 8380 204 1 MRV 787 7955 8105 788 8185 8335 205 1 KRR 771 8010 8140 772 8230 8365 206 1 LED 849 8025 8100 850 8160 8295 207 2 IST 209 8080 8250 210 8320 8480 208 1 AER 873 8085 8230 874 8960 9100 209 1 ASF 711 8195 8345 712 8840 8995 210 2 ULN 563 8195 8535 564 8615 9015 211 1 KJA 779 8230 8500 780 8575 8870 212 2 OSL 211 8260 8420 212 9060 9215 213 2 KBP 185 8270 8370 186 8920 9010 214 1 IKT 739 8285 8620 740 8710 9070 215 1 KRR 773 8295 8440 774 8820 8965 216 1 SGC 877 8320 8515 878 8595 8825 217 1 LED 857 8350 8430 858 8810 8890 218 1 CEK 899 8430 8585 900 8655 8820 219 1 PEE 821 8435 8590 822 8650 8800 220 2 TBS 197 8440 8605 198 8760 8915 221 1 UFA 891 8475 8605 892 8675 8810 222 1 KJA 781 8500 8770 782 8880 9190 223 1 IKT 743 8835 9160 744 9250 9610 224 1 OMS 815 8845 9045 816 9125 9340 225 1 CEK 897 8845 9000 898 9070 9235 226 1 KRR 763 8900 9040 764 9120 9250 227 2 SIP 133 8920 9060 134 9140 9260 228 2 BUD 131 8930 9090 132 9160 9315 229 1 AAQ 701 8945 9080 702 9150 9280 230 1 MRV 785 8950 9080 786 9160 9290 231 2 IST 207 8985 9160 208 9235 9425 232 2 WAW 101 8995 9115 102 9180 9300 233 2 FRU 181 9005 9255 182 9350 9620 234 2 GYD 147 9010 9190 148 9315 9500 235 1 AER 869 9025 9170 870 9295 9435 236 2 EVN 193 9050 9230 194 9305 9475 237 1 KRR 765 9070 9200 766 9270 9400 238 1 AAQ 703 9160 9300 704 9380 9490 239 1 LED 845 9170 9260 846 9330 9415 240 1 KRR 767 9180 9315 768 9405 9535 241 2 KBP 183 9305 9400 184 9490 9580 242 2 AYT 223 9380 9570 224 9630 9820 243 1 MRV 787 9395 9545 788 9625 9775 244 1 KRR 771 9450 9580 772 9670 9805 245 1 LED 849 9465 9540 850 9600 9735 246 2 IST 209 9520 9690 210 9760 9920 247 1 AER 873 9525 9670 874 10400 10540 248 1 ASF 711 9635 9785 712 10280 10435 249 2 ULN 563 9635 9975 564 10055 10455 250 2 OTP 151 9660 9815 152 10440 10580 251 2 DAM 517 9665 9905 518 9990 10220 252 2 OSL 211 9700 9860 212 10500 10655 253 2 KBP 185 9710 9810 186 10360 10450 254 1 IKT 739 9725 10060 740 10150 10510 255 1 KRR 773 9735 9880 774 10260 10405 256 1 SGC 877 9760 9955 878 10035 10265 257 1 LED 857 9790 9870 858 10250 10330 258 1 CEK 899 9870 10025 900 10095 10260 259 1 PEE 821 9875 10030 822 10090 10240 260 1 UFA 891 9915 10045 892 10115 10250 261 1 KJA 781 9940 10210 782 10320 10630 ; end; glpk-5.0/examples/threads/0000755000062000006210000000000013766346220014752 5ustar maomkpasswdglpk-5.0/examples/threads/Build_Multiseed.bat0000644000062000006210000000054013766346220020513 0ustar maomkpasswdrem Build GLPK DLL with Microsoft Visual Studio Community 2015 rem NOTE: Make sure that HOME variable specifies correct path set HOME="C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC" call %HOME%\vcvarsall.bat x64 copy config_VC config.h %HOME%\bin\nmake.exe /f Makefile_VC set PATH=..\..\w64\ %HOME%\bin\nmake.exe /f Makefile_VC check pause glpk-5.0/examples/threads/clustering.mod0000644000062000006210000000645213766346220017641 0ustar maomkpasswd/* * Author: Heinrich Schuchardt * * This model solves a clustering problem: * * Out of 50 towns select 3 to be cluster centers and assign the other * towns to the clusters such that the sum of the population weighted * euclidian distances between towns and centers is minimized. * * The solution is saved as a scalable vector graphic file with a * pseudo-random file name. */ # Output file param fn, symbolic := "00000" & 100000 * Uniform01(); param f, symbolic := "ct" & substr(fn, length(fn) - 4) & ".svg"; # Centers param nc := 3; set C := {1 .. nc}; # Towns param nt := 50; set T := {1 .. nt}; param xt{T} := Uniform01(); param yt{T} := Uniform01(); param pt{T} := ceil(1000 * Uniform01()); # Image size param scale := 1000; # Colors # saturation [0, 255] param sat := 192; param hue{c in C} := 6 * (c - 1) / nc; param red{c in C} := if hue[c] <= 1 or hue[c] >= 5 then 255 else (if hue[c] >=2 and hue[c] <= 4 then 255 - sat else (if hue[c] <=2 then 255 - sat + sat * (2-hue[c]) else 255 - sat + sat * (hue[c]-4) )); param green{c in C} := if hue[c] >= 1 and hue[c] <= 3 then 255 else (if hue[c] >= 4 then 255 - sat else (if hue[c] <=1 then 255 - sat + sat * hue[c] else 255 - sat + sat * (4-hue[c]) )); param blue{c in C} := if hue[c] >= 3 and hue[c] <= 5 then 255 else (if hue[c] <=2 then 255 - sat else (if hue[c] <=3 then 255 - sat + sat * (hue[c]-2) else 255 - sat + sat * (6-hue[c]) )); var x{T}; var y{T,T}, binary; minimize obj : sum{c in T, t in T} y[c,t] * pt[t] * sqrt((xt[c] - xt[t])^2 + (yt[c] - yt[t])^2); s.t. sumx : sum{c in T} x[c] = nc; s.t. cxy{c in T, t in T} : y[c,t] <= x[c]; s.t. sumy{t in T} : sum{c in T} y[c,t] = 1; solve; for {c in T : x[c] > .5} { printf "Center %5.4f %5.4f\n", xt[c], yt[c]; for {t in T : y[c,t] > .5} { printf " Town %5.4f %5.4f (%5.0f)\n", xt[t], yt[t], pt[t]; } } # Output the solution as scalable vector graphic # header printf "\n" > f; printf "> f; printf """http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"">\n" >> f; printf "> f; printf "xmlns=""http://www.w3.org/2000/svg"">\n" >> f; # background printf "\n", 1.2 * scale, 1.2 * scale>> f; # border printf "\n", .1 * scale, .1 * scale, scale, scale >> f; # circles for towns for {t in T} printf {s in T, c in C : y[s,t] > .5 && c = floor( .5 + sum{u in T : u <= s} x[u])} "\n", (.1 + xt[t]) * scale, (.1 + yt[t]) * scale, .001 * sqrt(pt[t]) * scale, red[c], green[c] , blue[c] >> f; # lines from towns to assigned centers for {t in T, c in T : y[c,t] > .5} printf "\n", (.1 + xt[c]) * scale, (.1 + yt[c]) * scale, (.1 + xt[t]) * scale, (.1 + yt[t]) * scale >> f; printf "\n" >> f; end; glpk-5.0/examples/threads/Makefile0000644000062000006210000000013613766346220016412 0ustar maomkpasswdall: gcc multiseed.c -I. -lglpk -pthread -o multiseed check: ./multiseed clustering.mod 20 glpk-5.0/examples/threads/Makefile_VC0000644000062000006210000000074713766346220017012 0ustar maomkpasswd## Build multiseed example with Microsoft Visual Studio Express ## CFLAGS = \ /I. \ /I..\..\src \ /I..\..\w64 \ /DHAVE_CONFIG_H=1 \ /D_CRT_SECURE_NO_WARNINGS=1 \ /nologo \ /W3 \ /O2 \ /Zi .c.obj: cl.exe $(CFLAGS) /Fo$*.obj /c $*.c all: multiseed.exe multiseed.exe: multiseed.obj ..\..\w64\glpk_4_61.dll cl.exe $(CFLAGS) /Fmultiseed.exe \ multiseed.obj ..\..\w64\glpk_4_61.lib check: multiseed.exe .\multiseed.exe clustering.mod 20 ## eof ## glpk-5.0/examples/threads/multiseed.c0000644000062000006210000001432613766346220017117 0ustar maomkpasswd/* multiseed.c (multithreading demo) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2017 Free Software Foundation, Inc. * Written by Heinrich Schuchardt . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ /* * This program demonstrates running the GLPK library with multiple threads. * * When called the program requires two arguments: * * filename - the name of the MathProg model to be solved * threads - the count of parallel threads to be run. * * Each thread is run with a different seed for the random number generator * provided by the GLPK library. */ #include #include #include #include #include #include #include "thread.h" #define BUFLEN 256 /* Task descriptor */ struct task { pthread_t tid; char *filename; int seed; size_t pos; char buf[BUFLEN + 1]; int line; jmp_buf jmp; }; /* Mutex for console output */ pthread_mutex_t mutex; /* Console output handler */ int term_hook(void *info, const char *text) { struct task *task = (struct task *) info; size_t len = strlen(text); /* Lock mutex so this is the only task creating console output. */ pthread_mutex_lock(&mutex); /* Append the new text to the buffer. */ if (task->pos + len > BUFLEN) { printf("%02d-%05d %s%s", task->seed, ++task->line, task->buf, text); task->pos = 0; task->buf[0] = 0; } else { strcpy(task->buf + task->pos, text); task->pos += len; } /* If a complete line is available, send it to the console. */ if (strchr(task->buf, '\n')) { printf("%02d-%05d %s", task->seed, ++task->line, task->buf); task->pos = 0; task->buf[0] = 0; } /* Unlock the mutex. */ pthread_mutex_unlock(&mutex); /* Disable default output. */ return -1; } /* Error handler */ void error_hook(void *info) { struct task *task = (struct task *) info; term_hook(task, "Error caught\n"); glp_free_env(); longjmp(task->jmp, 1); } void worker(void *arg) { struct task *task = (struct task *) arg; int ret; glp_prob *lp; glp_tran *tran; glp_iocp iocp; if (setjmp(task->jmp)) { /* If an error is caught leave the function. */ return; } /* Set the error handler. */ glp_error_hook(error_hook, task); /* Set the console output handler. */ glp_term_hook(term_hook, arg); glp_printf("Seed %02d\n", task->seed); /* Create the problem object. */ lp = glp_create_prob(); if (!lp) { glp_error("Out of memory\n"); } /* Create the MathProg translator workspace. */ tran = glp_mpl_alloc_wksp(); if (!lp) { glp_error("Out of memory\n"); } /* Set the pseudo random number generator seed. */ glp_mpl_init_rand(tran, task->seed); /* Read the model file. */ ret = glp_mpl_read_model (tran, task->filename, GLP_OFF); if (ret != 0) { glp_error("Model %s is not valid\n", task->filename); } /* Generate the model. */ ret = glp_mpl_generate(tran, NULL); if (ret != 0) { glp_error("Cannot generate model %s\n", task->filename); } /* Build the problem. */ glp_mpl_build_prob(tran, lp); /* Solve the problem. */ glp_init_iocp(&iocp); iocp.presolve = GLP_ON; ret = glp_intopt(lp, &iocp); if (ret == 0) { /* Execute the post solve part of the model. */ glp_mpl_postsolve(tran, lp, GLP_MIP); } /* Release the memory. */ glp_mpl_free_wksp (tran); glp_delete_prob(lp); if (0 == task->seed % 3) { glp_error("Voluntarily throwing an error in %s at line %d\n", __FILE__, __LINE__); } glp_term_hook(NULL, NULL); glp_error_hook(NULL, NULL); glp_free_env(); } #ifdef __WOE__ DWORD run(void *arg) { #else void *run(void *arg) { #endif worker(arg); pthread_exit(NULL); } int main(int argc, char *argv[]) { int i, n, rc; struct task *tasks; /* Make sure thread local memory is used by the GLPK library. */ if (!glp_config("TLS")) { printf("The loaded GLPK library does not support thread local memory.\n" "You need a version of the library configured with " "--enable-reentrant=yes to run this program.\n"); exit(EXIT_FAILURE); } /* Check program arguments. */ if (argc != 3) { printf("Usage %s filename threads\n" " filename - MathProg model file\n" " threads - number of threads\n", argv[0]); exit(EXIT_FAILURE); } /* Parse the arguments. */ n = atoi(argv[2]); if (n > 50) { printf("Number of threads is to high (> 50).\n"); exit(EXIT_FAILURE); } if (n <= 1) { printf("Need positive number of threads\n"); exit(EXIT_FAILURE); } /* Allocate memory for the task descriptors. */ tasks = calloc(n, sizeof(struct task)); if (!tasks) { printf("Out of memory"); exit(EXIT_FAILURE); } /* Create a mutex for console output. */ pthread_mutex_init(&mutex, NULL); /* Create the threads. */ for (i = 0; i < n; ++i) { tasks[i].filename = argv[1]; tasks[i].seed = i + 1; tasks[i].pos = 0; tasks[i].buf[0] = 0; tasks[i].line = 0; rc = pthread_create(&tasks[i].tid, NULL, run, &tasks[i]); if (rc) { printf("ERROR; return code from pthread_create() is %d\n", rc); exit(EXIT_FAILURE); } } /* Wait for all threads to complete. */ for (i = 0; i < n; ++i) { pthread_join(tasks[i].tid, NULL); } /* Destroy the mutex. */ pthread_mutex_destroy(&mutex); return EXIT_SUCCESS; } glpk-5.0/examples/threads/README0000644000062000006210000000427113766346220015636 0ustar maomkpasswdThread local memory example =========================== The GLPK library, when compiled with default options, uses a separate environment for each thread that is executed. So each thread is isolated. The only exeption is error handling. An error in any of the library functions will not only terminate the active thread but the complete process. This can be circumvented by defining an error handling routine with glp_error_hook(). This directory contains an example demonstrating running a multithreaded application with error handling. The example code ---------------- The program multiseed solves a MathProg model multiple times in separate parallel threads. Each threads uses a different seed for the MathProg pseudo random number generator. The MathProg model clustering.mod generates 50 randomly distributed "towns". Out of the towns it selects 3 to be cluster centers and assign the other towns to the clusters such that the sum of the population weighted euclidian distances between towns and centers is minimized. The solution is written to a Scalable Vector File which can be viewed with a web browser. For demonstration purposes at the end of every third thread the error handling routine is triggered by calling glp_error(). This results in output like 18-00086 Model has been successfully processed 18-00087 Voluntarily throwing an error in multiseed.c at line 147 18-00088 Error detected in file multiseed.c at line 146 18-00089 Error caught Terminal output is preceeded by numbers indicating the thread index and the output line. You can pipe it through sort to get a better overiew, e.g. multiseed clustering.mod 20 | sort Building and running the example code ------------------------------------- On Linux multiseed can be compiled with gcc by calling make The code can be executed with make check For compiling the example on 64bit Windows with Microsoft Visual Studio C++ run Build_Multiseed.bat You may have to adust the variable HOME in the batch file depending on the installation path of Visual Studio. You can run multiseed with multiseed Where filename is the path to the model file and count is the number of parallel threads. glpk-5.0/examples/threads/thread.h0000644000062000006210000000353713766346220016402 0ustar maomkpasswd/* thread.h (pthread emulation for Windows) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2011-2017 Free Software Foundation, Inc. * Written by Heinrich Schuchardt . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #ifndef THREAD_H #define THREAD_H 1 #ifdef HAVE_CONFIG_H #include "config.h" #endif // HAVE_CONFIG_H #ifdef __WOE__ #include typedef CRITICAL_SECTION pthread_mutex_t; typedef HANDLE pthread_t; // @todo The return type of routine C is "DWORD" for Windows and // "void *" for Posix. #define pthread_create(A,B,C,D) \ (int)((*A = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)&C,D,0,NULL))==NULL) #define pthread_exit(A) ExitThread(0) #define pthread_mutex_destroy(A) DeleteCriticalSection(A) #define pthread_mutex_init(A,B) (InitializeCriticalSection(A),0) #define pthread_mutex_lock(A) (EnterCriticalSection(A),0) #define pthread_mutex_unlock(A) (LeaveCriticalSection(A),0) #define pthread_self() GetCurrentThreadId() #define pthread_join(A, B) \ (WaitForSingleObject(A, INFINITE),CloseHandle(A),0) #else #include #endif #endif // THREAD_H glpk-5.0/examples/tiling.mod0000644000062000006210000000657713766346220015326 0ustar maomkpasswd/* Rectifiable polyomino tilings generator */ /* Written and converted to GNU MathProg by NASZVADI, Peter, 2007-2017 */ /* This model searches for a maximal packing of a given polyomino composed of unit squares in a given rectangle. In a feasible packing, a placed polyomino and its intersection of a unit square's inner part in the rectangle must be the square or empty. If there exists a packing that covers totally the rectangle, then the polyomino is called "rectifiable" Summary: Decides if an Im * Jm rectangle could be tiled with given pattern and prints a (sub)optimal solution if found Generated magic numbers are implicit tables, check them: # for magic in 3248 688 1660 3260 do printf "Magic % 5d:" "$magic" for e in 0 1 2 3 4 5 6 7 do printf "% 3d" "$((-1 + ((magic / (3**e)) % 3)))" done echo done Magic 3248: 1 1 -1 -1 0 0 0 0 Magic 688: 0 0 0 0 1 1 -1 -1 Magic 1660: 0 0 0 0 1 -1 1 -1 Magic 3260: 1 -1 1 -1 0 0 0 0 # */ param Im, default 3; /* vertical edge length of the box */ param Jm, default 3; /* horizontal edge length of the box */ set S, default {(0, 0), (1, 0), (2, 0), (0, 1), (1, 1), (2, 1), (0, 2)}; /* P-heptomino is the default shape. More info on this heptomino: http://www.cflmath.com/Polyomino/7omino4_rect.html */ set I := 1..Im; /* rows of rectangle */ set J := 1..Jm; /* columns of rectangle */ set IJ := I cross J; /* the rectangle itself */ set E := 0..7; /* helper set to allow iterating on all transformations of the S shape */ set Shifts := setof{(i, j, e) in IJ cross E: setof{(x, y) in S} ((x * (-1 + floor(3248 / 3^e) mod 3)) + (y * (-1 + floor(688 / 3^e) mod 3)) + i, (x * (-1 + floor(1660 / 3^e) mod 3)) + (y * (-1 + floor(3260 / 3^e) mod 3)) + j) within IJ}(i, j, e); /* all shifted, flipped, rotated, mirrored mappings of polyomino that contained by the rectangle */ var cell{IJ}, binary; /* booleans denoting if a cell is covered in the rectangle */ var tile{Shifts}, binary; /* booleans denoting usage of a shift */ var objvalue; s.t. covers{(i, j) in IJ}: sum{(k, l, e, a, b) in Shifts cross S: i = k + a * (-1 + floor(3248 / 3^e) mod 3) + b * (-1 + floor(688 / 3^e) mod 3) and j = l + a * (-1 + floor(1660 / 3^e) mod 3) + b * (-1 + floor(3260 / 3^e) mod 3) }tile[k, l, e] = cell[i, j]; s.t. objeval: sum{(i, j) in IJ}cell[i, j] - objvalue = 0; maximize obj: objvalue; solve; printf '\nCovered cells/all cells = %d/%d\n\n', objvalue.val, Im * Jm; printf '\nA tiling:\n\n'; for{i in I}{ for{j in J}{ printf '%s', if cell[i, j].val then '' else ' *** '; for{(k, l, e, a, b) in Shifts cross S: cell[i, j].val and i = k + a * (-1 + floor(3248 / 3^e) mod 3) + b * (-1 + floor(688 / 3^e) mod 3) and j = l + a * (-1 + floor(1660 / 3^e) mod 3) + b * (-1 + floor(3260 / 3^e) mod 3) and tile[k, l, e].val }{ printf '% 5d', (k * Jm + l) * 8 + e; } } printf '\n'; } printf '\n'; data; param Im := 14; /* here can be set rectangle's one side */ param Jm := 14; /* here can be set rectangle's other side */ set S := (0,0),(1,0),(2,0),(0,1),(1,1),(2,1),(0,2); /* here you can specify arbitrary polyomino */ end; glpk-5.0/examples/todd.mod0000644000062000006210000000202513766346220014752 0ustar maomkpasswd/* TODD, a class of hard instances of zero-one knapsack problems */ /* Written in GNU MathProg by Andrew Makhorin */ /* Chvatal describes a class of instances of zero-one knapsack problems due to Todd. He shows that a wide class of algorithms - including all based on branch and bound or dynamic programming - find it difficult to solve problems in the Todd class. More exactly, the time required by these algorithms to solve instances of problems that belong to the Todd class grows as an exponential function of the problem size. Reference: Chvatal V. (1980), Hard knapsack problems, Op. Res. 28, 1402-1411. */ param n > 0 integer; param log2_n := log(n) / log(2); param k := floor(log2_n); param a{j in 1..n} := 2 ** (k + n + 1) + 2 ** (k + n + 1 - j) + 1; param b := 0.5 * floor(sum{j in 1..n} a[j]); var x{1..n} binary; maximize obj: sum{j in 1..n} a[j] * x[j]; s.t. cap: sum{j in 1..n} a[j] * x[j] <= b; data; param n := 15; /* change this parameter to choose a particular instance */ end; glpk-5.0/examples/toto.mod0000644000062000006210000001277713766346220015024 0ustar maomkpasswd/* Covering code generator, especially for football pool systems */ /* Written and converted to GNU MathProg by NASZVADI, Peter, 199x-2017 */ /* Looks up for minimal covering codes in the specified Hamming-space. Without specifying model data, by default it looks up for covering for a mixed covering code in Hamming-space {X, 1, 2, 3}*{X, 1}^4 with one layer. Hamming space is a set of finite words with all the same length over a finite alphabet: the space could be decomposed to Cartesian products of subsets of the alphabet, e.g. the first letter of an element can be chosen from a 2-element set, the next from 6 letters, and so on. There is a natural metric function in these spaces: the Hamming-distance (hence the name, from now referred as: distance). The distance of two (equal-length) words is the number of different letter pairs in the corresponding positions. Covering Hamming-spaces with minimal number of spheres with given radius - usually difficult problem excluding special cases. Relationship with sports: Football pool system in Hungarian: "Toto'kulcs", so Toto, totogol and other football pool systems are usually need mixed ternary/binary code coverings in order to minimize loss of the gambler. See more at: https://en.wikipedia.org/wiki/Covering_code A tricky workaround is used: floor(), abs() and cosine() magic are used at 'coverings' constraints, because GMPL lacks proper boolean<->integer evaluation/casting. */ param ArgNum1, >= 1, default 1; param ArgNum2, >= 1, default 1; param ArgNum3, >= 1, default 1; param ArgNum4, >= 1, default 1; param ArgNum5, >= 1, default 1; param ArgNum6, >= 1, default 1; param ArgNum7, >= 1, default 1; param ArgNum8, >= 1, default 1; param ArgNum9, >= 1, default 1; param ArgNum10, >= 1, default 1; param ArgNum11, >= 1, default 1; param ArgNum12, >= 1, default 1; param ArgNum13, >= 1, default 1; /* at most 13 matches' outcomes */ param Radius, >= 1, default 1; /* covering radius */ param Layer, >= 1, default 1; /* each point of space must be covered at least Layer times */ set X := 0..ArgNum1 - 1 cross 0..ArgNum2 - 1 cross 0..ArgNum3 - 1 cross 0..ArgNum4 - 1 cross 0..ArgNum5 - 1 cross 0..ArgNum6 - 1 cross 0..ArgNum7 - 1 cross 0..ArgNum8 - 1 cross 0..ArgNum9 - 1 cross 0..ArgNum10 - 1 cross 0..ArgNum11 - 1 cross 0..ArgNum12 - 1 cross 0..ArgNum13 - 1; /* the Hamming-space generated by the Cartesian-products of sets with elements ArgNum[n] */ var x{X}, integer, >=0; /* denotes each point's amount of containing covering sets */ var objvalue; s.t. coverings{(i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13) in X}: sum{(j1, j2, j3, j4, j5, j6, j7, j8, j9, j10, j11, j12, j13) in X: floor(abs(cos(i1 - j1))) + floor(abs(cos(i2 - j2))) + floor(abs(cos(i3 - j3))) + floor(abs(cos(i4 - j4))) + floor(abs(cos(i5 - j5))) + floor(abs(cos(i6 - j6))) + floor(abs(cos(i7 - j7))) + floor(abs(cos(i8 - j8))) + floor(abs(cos(i9 - j9))) + floor(abs(cos(i10 - j10))) + floor(abs(cos(i11 - j11))) + floor(abs(cos(i12 - j12))) + floor(abs(cos(i13 - j13))) >= 13 - Radius } x[j1, j2, j3, j4, j5, j6, j7, j8, j9, j10, j11, j12, j13] >= Layer; /* covering constraints, select at least 'Layer' amount of spheres that cover (i1,i2,...) and has radius 'Radius' */ s.t. oneisset: x[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] >= 1; /* this does not violate symmetry nor excludes important solutions but boosts the solving process */ s.t. objc: sum{(i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13) in X} x[i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13] = objvalue; /* the total number of pools (covering sets) */ minimize obj: objvalue; /* Also 'objc' could be used directly instead of 'obj', but for experiments, it is useful to set up additional constraints for introduced objvalue variable */ solve; printf 'Solution: %s\nRadius: %s\nLayer: %s\n', objvalue.val, Radius, Layer; /* report important scalars */ printf 'Selected bets:\n'; for{(i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13) in X: x[i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13]}{ printf ' Times %s:', x[i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13].val; printf '%s', if ArgNum1 == 1 then '' else ' ' & if i1 then i1 else 'X'; printf '%s', if ArgNum2 == 1 then '' else '-' & if i2 then i2 else 'X'; printf '%s', if ArgNum3 == 1 then '' else '-' & if i3 then i3 else 'X'; printf '%s', if ArgNum4 == 1 then '' else '-' & if i4 then i4 else 'X'; printf '%s', if ArgNum5 == 1 then '' else '-' & if i5 then i5 else 'X'; printf '%s', if ArgNum6 == 1 then '' else '-' & if i6 then i6 else 'X'; printf '%s', if ArgNum7 == 1 then '' else '-' & if i7 then i7 else 'X'; printf '%s', if ArgNum8 == 1 then '' else '-' & if i8 then i8 else 'X'; printf '%s', if ArgNum9 == 1 then '' else '-' & if i9 then i9 else 'X'; printf '%s', if ArgNum10 == 1 then '' else '-' & if i10 then i10 else 'X'; printf '%s', if ArgNum11 == 1 then '' else '-' & if i11 then i11 else 'X'; printf '%s', if ArgNum12 == 1 then '' else '-' & if i12 then i12 else 'X'; printf '%s', if ArgNum13 == 1 then '' else '-' & if i13 then i13 else 'X'; printf '\n'; } /* pretty-print a generated football pool system (covering code) */ data; param ArgNum1 := 4; param ArgNum2 := 2; param ArgNum3 := 2; param ArgNum4 := 2; param ArgNum5 := 2; end; glpk-5.0/examples/train.mod0000644000062000006210000002623313766346220015144 0ustar maomkpasswd# TRAIN, a model of railroad passenger car allocation # # References: # Robert Fourer, David M. Gay and Brian W. Kernighan, "A Modeling Language # for Mathematical Programming." Management Science 36 (1990) 519-554. ### SCHEDULE SETS AND PARAMETERS ### set cities; set links within {c1 in cities, c2 in cities: c1 <> c2}; # Set of cities, and set of intercity links param last > 0 integer; # Number of time intervals in a day set times := 1..last; # Set of time intervals in a day set schedule within {c1 in cities, t1 in times, c2 in cities, t2 in times: (c1,c2) in links}; # Member (c1,t1,c2,t2) of this set represents # a train that leaves city c1 at time t1 # and arrives in city c2 at time t2 ### DEMAND PARAMETERS ### param section > 0 integer; # Maximum number of cars in one section of a train param demand {schedule} > 0; # For each scheduled train: # the smallest number of cars that # can meet demand for the train param low {(c1,t1,c2,t2) in schedule} := ceil(demand[c1,t1,c2,t2]); # Minimum number of cars needed to meet demand param high {(c1,t1,c2,t2) in schedule} := max (2, min (ceil(2*demand[c1,t1,c2,t2]), section*ceil(demand[c1,t1,c2,t2]/section) )); # Maximum number of cars allowed on a train: # 2 if demand is for less than one car; # otherwise, lesser of # number of cars needed to hold twice the demand, and # number of cars in minimum number of sections needed ### DISTANCE PARAMETERS ### param dist_table {links} >= 0 default 0.0; param distance {(c1,c2) in links} > 0 := if dist_table[c1,c2] > 0 then dist_table[c1,c2] else dist_table[c2,c1]; # Inter-city distances: distance[c1,c2] is miles # between city c1 and city c2 ### VARIABLES ### var U 'cars stored' {cities,times} >= 0; # u[c,t] is the number of unused cars stored # at city c in the interval beginning at time t var X 'cars in train' {schedule} >= 0; # x[c1,t1,c2,t2] is the number of cars assigned to # the scheduled train that leaves c1 at t1 and # arrives in c2 at t2 ### OBJECTIVES ### minimize cars: sum {c in cities} U[c,last] + sum {(c1,t1,c2,t2) in schedule: t2 < t1} X[c1,t1,c2,t2]; # Number of cars in the system: # sum of unused cars and cars in trains during # the last time interval of the day minimize miles: sum {(c1,t1,c2,t2) in schedule} distance[c1,c2] * X[c1,t1,c2,t2]; # Total car-miles run by all scheduled trains in a day ### CONSTRAINTS ### account {c in cities, t in times}: U[c,t] = U[c, if t > 1 then t-1 else last] + sum {(c1,t1,c,t) in schedule} X[c1,t1,c,t] - sum {(c,t,c2,t2) in schedule} X[c,t,c2,t2]; # For every city and time: # unused cars in the present interval must equal # unused cars in the previous interval, # plus cars just arriving in trains, # minus cars just leaving in trains satisfy {(c1,t1,c2,t2) in schedule}: low[c1,t1,c2,t2] <= X[c1,t1,c2,t2] <= high[c1,t1,c2,t2]; # For each scheduled train: # number of cars must meet demand, # but must not be so great that unnecessary # sections are run ### DATA ### data; set cities := BO NY PH WA ; set links := (BO,NY) (NY,PH) (PH,WA) (NY,BO) (PH,NY) (WA,PH) ; param dist_table := [*,*] BO NY 232 NY PH 90 PH WA 135 ; param last := 48 ; param section := 14 ; set schedule := (WA,*,PH,*) 2 5 6 9 8 11 10 13 12 15 13 16 14 17 15 18 16 19 17 20 18 21 19 22 20 23 21 24 22 25 23 26 24 27 25 28 26 29 27 30 28 31 29 32 30 33 31 34 32 35 33 36 34 37 35 38 36 39 37 40 38 41 39 42 40 43 41 44 42 45 44 47 46 1 (PH,*,NY,*) 1 3 5 7 9 11 11 13 13 15 14 16 15 17 16 18 17 19 18 20 19 21 20 22 21 23 22 24 23 25 24 26 25 27 26 28 27 29 28 30 29 31 30 32 31 33 32 34 33 35 34 36 35 37 36 38 37 39 38 40 39 41 40 42 41 43 42 44 43 45 44 46 45 47 47 1 (NY,*,BO,*) 10 16 12 18 14 20 15 21 16 22 17 23 18 24 19 25 20 26 21 27 22 28 23 29 24 30 25 31 26 32 27 33 28 34 29 35 30 36 31 37 32 38 33 39 34 40 35 41 36 42 37 43 38 44 39 45 40 46 41 47 42 48 43 1 44 2 45 3 46 4 48 6 (BO,*,NY,*) 7 13 9 15 11 17 12 18 13 19 14 20 15 21 16 22 17 23 18 24 19 25 20 26 21 27 22 28 23 29 24 30 25 31 26 32 27 33 28 34 29 35 30 36 31 37 32 38 33 39 34 40 35 41 36 42 37 43 38 44 39 45 40 46 41 47 43 1 45 3 47 5 (NY,*,PH,*) 1 3 12 14 13 15 14 16 15 17 16 18 17 19 18 20 19 21 20 22 21 23 22 24 23 25 24 26 25 27 26 28 27 29 28 30 29 31 30 32 31 33 32 34 33 35 34 36 35 37 36 38 37 39 38 40 39 41 40 42 41 43 42 44 43 45 44 46 45 47 46 48 47 1 (PH,*,WA,*) 1 4 14 17 15 18 16 19 17 20 18 21 19 22 20 23 21 24 22 25 23 26 24 27 25 28 26 29 27 30 28 31 29 32 30 33 31 34 32 35 33 36 34 37 35 38 36 39 37 40 38 41 39 42 40 43 41 44 42 45 43 46 44 47 45 48 46 1 47 2 ; param demand := [WA,*,PH,*] 2 5 .55 6 9 .01 8 11 .01 10 13 .13 12 15 1.59 13 16 1.69 14 17 5.19 15 18 3.55 16 19 6.29 17 20 4.00 18 21 5.80 19 22 3.40 20 23 4.88 21 24 2.92 22 25 4.37 23 26 2.80 24 27 4.23 25 28 2.88 26 29 4.33 27 30 3.11 28 31 4.64 29 32 3.44 30 33 4.95 31 34 3.73 32 35 5.27 33 36 3.77 34 37 4.80 35 38 3.31 36 39 3.89 37 40 2.65 38 41 3.01 39 42 2.04 40 43 2.31 41 44 1.52 42 45 1.75 44 47 1.88 46 1 1.05 [PH,*,NY,*] 1 3 1.05 5 7 .43 9 11 .20 11 13 .21 13 15 .40 14 16 6.49 15 17 16.40 16 18 9.48 17 19 17.15 18 20 9.31 19 21 15.20 20 22 8.21 21 23 13.32 22 24 7.35 23 25 11.83 24 26 6.61 25 27 10.61 26 28 6.05 27 29 9.65 28 30 5.61 29 31 9.25 30 32 5.40 31 33 8.24 32 34 4.84 33 35 7.44 34 36 4.44 35 37 6.80 36 38 4.11 37 39 6.25 38 40 3.69 39 41 5.55 40 42 3.29 41 43 4.77 42 44 2.91 43 45 4.19 44 46 2.53 45 47 4.00 47 1 1.65 [NY,*,BO,*] 10 16 1.23 12 18 3.84 14 20 4.08 15 21 1.47 16 22 2.96 17 23 1.60 18 24 2.95 19 25 1.71 20 26 2.81 21 27 1.77 22 28 2.87 23 29 1.84 24 30 2.95 25 31 1.91 26 32 3.12 27 33 1.93 28 34 3.31 29 35 2.00 30 36 3.40 31 37 2.08 32 38 3.41 33 39 2.69 34 40 4.45 35 41 2.32 36 42 3.40 37 43 1.80 38 44 2.63 39 45 1.52 40 46 2.23 41 47 1.25 42 48 1.79 43 1 .97 44 2 1.28 45 3 .48 46 4 .68 48 6 .08 [BO,*,NY,*] 7 13 .03 9 15 1.29 11 17 4.59 12 18 2.56 13 19 3.92 14 20 2.37 15 21 3.81 16 22 2.24 17 23 3.51 18 24 2.13 19 25 3.28 20 26 2.05 21 27 3.15 22 28 1.99 23 29 3.09 24 30 1.93 25 31 3.19 26 32 1.91 27 33 3.21 28 34 1.85 29 35 3.21 30 36 1.71 31 37 3.04 32 38 2.08 33 39 3.13 34 40 1.96 35 41 2.53 36 42 1.43 37 43 2.04 38 44 1.12 39 45 1.71 40 46 .91 41 47 1.32 43 1 1.80 45 3 1.13 47 5 .23 [NY,*,PH,*] 1 3 .04 12 14 4.68 13 15 5.61 14 16 3.56 15 17 5.81 16 18 3.81 17 19 6.31 18 20 4.07 19 21 7.33 20 22 4.55 21 23 7.37 22 24 4.73 23 25 7.61 24 26 4.92 25 27 7.91 26 28 5.19 27 29 8.40 28 30 5.53 29 31 9.32 30 32 5.51 31 33 10.33 32 34 9.21 33 35 18.95 34 36 11.23 35 37 16.85 36 38 7.29 37 39 10.89 38 40 5.41 39 41 8.21 40 42 4.52 41 43 6.99 42 44 3.92 43 45 6.21 44 46 3.44 45 47 5.17 46 48 2.55 47 1 1.24 [PH,*,WA,*] 1 4 .20 14 17 4.49 15 18 3.53 16 19 2.67 17 20 3.83 18 21 3.01 19 22 4.12 20 23 3.15 21 24 4.67 22 25 3.20 23 26 4.23 24 27 2.87 25 28 3.84 26 29 2.60 27 30 3.80 28 31 2.77 29 32 4.31 30 33 3.16 31 34 4.88 32 35 3.45 33 36 5.55 34 37 3.52 35 38 6.11 36 39 3.32 37 40 5.53 38 41 3.03 39 42 4.51 40 43 2.53 41 44 3.39 42 45 1.93 43 46 2.52 44 47 1.20 45 48 1.75 46 1 .88 47 2 .87 ; end; glpk-5.0/examples/transp.mod0000644000062000006210000000264113766346220015333 0ustar maomkpasswd# A TRANSPORTATION PROBLEM # # This problem finds a least cost shipping schedule that meets # requirements at markets and supplies at factories. # # References: # Dantzig G B, "Linear Programming and Extensions." # Princeton University Press, Princeton, New Jersey, 1963, # Chapter 3-3. set I; /* canning plants */ set J; /* markets */ param a{i in I}; /* capacity of plant i in cases */ param b{j in J}; /* demand at market j in cases */ param d{i in I, j in J}; /* distance in thousands of miles */ param f; /* freight in dollars per case per thousand miles */ param c{i in I, j in J} := f * d[i,j] / 1000; /* transport cost in thousands of dollars per case */ var x{i in I, j in J} >= 0; /* shipment quantities in cases */ minimize cost: sum{i in I, j in J} c[i,j] * x[i,j]; /* total transportation costs in thousands of dollars */ s.t. supply{i in I}: sum{j in J} x[i,j] <= a[i]; /* observe supply limit at plant i */ s.t. demand{j in J}: sum{i in I} x[i,j] >= b[j]; /* satisfy demand at market j */ data; set I := Seattle San-Diego; set J := New-York Chicago Topeka; param a := Seattle 350 San-Diego 600; param b := New-York 325 Chicago 300 Topeka 275; param d : New-York Chicago Topeka := Seattle 2.5 1.7 1.8 San-Diego 2.5 1.8 1.4 ; param f := 90; end; glpk-5.0/examples/trick.mod0000644000062000006210000000433513766346220015142 0ustar maomkpasswd/* TRICK, A Transportation Design Problem */ /* Translated from the Mosel modeling language to GNU MathProg by Andrew Makhorin */ /* This example model is described in the article "Formulations and Reformulations in Integer Programming" by Michael Trick (it is publicly available at http://mat.gsia.cmu.edu/trick/formul04.pdf). This model demonstrates an amazing effect when including in the formulation an additional constraint, which is redundant even for LP relaxation, makes the model easy for solving with the B&B. */ set TRUCKS := 1..10; set PACKAGES := 1..20; param capacity{TRUCKS}; param size{PACKAGES}; param cost{TRUCKS}; param can_use{PACKAGES, TRUCKS}; var x{PACKAGES, TRUCKS}, binary; var y{TRUCKS}, binary; minimize total: sum{i in TRUCKS} cost[i] * y[i]; f1{i in TRUCKS}: sum{j in PACKAGES} size[j] * x[j,i] <= capacity[i] * y[i]; f2{i in TRUCKS, j in PACKAGES}: x[j,i] <= y[i]; f3{j in PACKAGES}: sum{i in TRUCKS} can_use[j,i] * x[j,i] = 1; redundant_constraint: sum{i in TRUCKS} capacity[i] * y[i] >= sum{j in PACKAGES} size[j]; data; param capacity := [1] 100 [2] 200 [3] 100 [4] 200 [5] 100 [6] 200 [7] 100 [8] 200 [9] 100 [10] 200; param size := [1] 17 [2] 21 [3] 54 [4] 45 [5] 87 [6] 34 [7] 23 [8] 45 [9] 12 [10] 43 [11] 54 [12] 39 [13] 31 [14] 26 [15] 75 [16] 48 [17] 16 [18] 32 [19] 45 [20] 55; param cost := [1] 1 [2] 1.8 [3] 1 [4] 1.8 [5] 1 [6] 1.8 [7] 1 [8] 1.8 [9] 1 [10] 1.8; param can_use (tr): 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 := 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0 2 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 0 0 0 3 0 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 4 0 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 0 0 5 0 0 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 0 6 0 0 0 1 1 1 1 0 0 0 0 0 0 1 1 1 0 0 0 0 7 0 0 0 0 1 1 1 1 1 0 0 0 0 0 1 1 1 1 0 0 8 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 9 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 10 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1 1; end; glpk-5.0/examples/tsp/0000755000062000006210000000000013766346220014126 5ustar maomkpasswdglpk-5.0/examples/tsp/bench.txt0000644000062000006210000000763113766346220015755 0ustar maomkpasswdSolver: TSPSOL for GLPK 4.56 Computer: Intel Celeron J1800 2.41 GHz OS: Debian GNU/Linux 8.1.0 "Jessie" Compiler: GCC 4.7.2 (options used: -O2) Test set: TSPLIB 95 Instance N Solution Lower Bound Nodes Iters Time,s Mem,MB ------------ --- ------------ ------------ -------- ------- ------ ------ att48 48 10628 opt 1 336 < 1 1.2 bayg29 29 1610 opt 1 173 < 1 0.3 bays29 29 2020 opt 1 166 < 1 0.3 berlin52 52 7542 opt 1 253 < 1 0.7 bier127 127 118282 opt 29 1330 14 19.1 brazil58 58 25395 opt 1 458 1 2.0 brg180 180 1950 opt 131 20012 83 52.0 burma14 14 3323 opt 1 55 < 1 0.1 ch130 130 6110 opt 45 2212 38 24.2 ch150 150 6528 opt 271 4967 138 27.5 d198 98 15780 opt 259 11371 719 92.3 dantzig42 42 699 opt 1 171 < 1 0.8 eil51 51 426 opt 115 1368 2 2.4 eil76 76 538 opt 1 517 < 1 2.2 eil101 101 629 opt 1 838 4 9.9 fri26 26 937 opt 1 125 < 1 0.2 gr17 17 2085 opt 1 93 < 1 0.1 gr21 21 2707 opt 1 82 < 1 0.1 gr24 24 1272 opt 1 137 < 1 0.2 gr48 48 5046 opt 3 407 1 2.3 gr96 96 55209 opt 367 5564 63 12.4 gr120 120 6942 opt 121 2940 46 14.7 gr137 137 69853 opt 97 1934 27 16.2 gr202 202 40160 opt 183 4176 287 88.4 hk48 48 11461 opt 1 322 < 1 1.1 kroA100 100 21282 opt 57 2227 23 13.2 kroB100 100 22141 opt 71 1891 27 15.6 kroC100 100 20749 opt 9 1035 5 9.4 kroD100 100 21294 opt 9 1203 10 12.3 kroE100 100 22068 opt 323 5055 100 13.4 kroA150 150 26524 opt 431 8069 487 50.2 kroB150 150 26130 opt 309 12599 610 43.1 lin105 105 14379 opt 5 910 4 7.3 lin318 318 42029 opt 1527 25885 4972 286.4 pr76 76 108159 opt 20537 636616 9218 128.7 * pr107 107 44303 opt 1 3692 38 33.2 pr124 124 59030 opt 19 1306 23 25.6 pr136 136 96772 opt 93 2799 60 27.7 pr144 144 58537 opt 11 1948 37 32.2 pr152 152 73682 opt 125 3269 99 46.0 pr226 226 80369 opt 1 6699 240 163.8 rat99 99 1211 opt 11 467 2 5,6 rd100 100 7910 opt 1 868 3 7.2 st70 70 675 opt 1 688 1 3.2 swiss42 42 1273 opt 1 231 < 1 0.8 u159 159 42080 opt 9 1356 15 30.0 ulysses16 16 6859 opt 1 72 < 1 0.1 ulysses22 22 7013 opt 1 110 < 1 0.2 glpk-5.0/examples/tsp/build.sh0000777000062000006210000000031413766346220015566 0ustar maomkpasswd#!/bin/sh # # Run this script to build TSPSOL executable. # # NOTE: you need to have GLPK properly installed. # gcc -O2 -otspsol main.c maxflow.c mincut.c misc.c tsplib.c -lglpk -lm ./tspsol sample.tsp glpk-5.0/examples/tsp/dantzig42.tsp0000644000062000006210000001110413766346220016461 0ustar maomkpasswdNAME : dantzig42 TYPE : TSP COMMENT : 42 cities (Dantzig) DIMENSION : 42 EDGE_WEIGHT_TYPE : EXPLICIT EDGE_WEIGHT_FORMAT : LOWER_DIAG_ROW DISPLAY_DATA_TYPE : TWOD_DISPLAY EDGE_WEIGHT_SECTION 0 8 0 39 45 0 37 47 9 0 50 49 21 15 0 61 62 21 20 17 0 58 60 16 17 18 6 0 59 60 15 20 26 17 10 0 62 66 20 25 31 22 15 5 0 81 81 40 44 50 41 35 24 20 0 103 107 62 67 72 63 57 46 41 23 0 108 117 66 71 77 68 61 51 46 26 11 0 145 149 104 108 114 106 99 88 84 63 49 40 0 181 185 140 144 150 142 135 124 120 99 85 76 35 0 187 191 146 150 156 142 137 130 125 105 90 81 41 10 0 161 170 120 124 130 115 110 104 105 90 72 62 34 31 27 0 142 146 101 104 111 97 91 85 86 75 51 59 29 53 48 21 0 174 178 133 138 143 129 123 117 118 107 83 84 54 46 35 26 31 0 185 186 142 143 140 130 126 124 128 118 93 101 72 69 58 58 43 26 0 164 165 120 123 124 106 106 105 110 104 86 97 71 93 82 62 42 45 22 0 137 139 94 96 94 80 78 77 84 77 56 64 65 90 87 58 36 68 50 30 0 117 122 77 80 83 68 62 60 61 50 34 42 49 82 77 60 30 62 70 49 21 0 114 118 73 78 84 69 63 57 59 48 28 36 43 77 72 45 27 59 69 55 27 5 0 85 89 44 48 53 41 34 28 29 22 23 35 69 105 102 74 56 88 99 81 54 32 29 0 77 80 36 40 46 34 27 19 21 14 29 40 77 114 111 84 64 96 107 87 60 40 37 8 0 87 89 44 46 46 30 28 29 32 27 36 47 78 116 112 84 66 98 95 75 47 36 39 12 11 0 91 93 48 50 48 34 32 33 36 30 34 45 77 115 110 83 63 97 91 72 44 32 36 9 15 3 0 105 106 62 63 64 47 46 49 54 48 46 59 85 119 115 88 66 98 79 59 31 36 42 28 33 21 20 0 111 113 69 71 66 51 53 56 61 57 59 71 96 130 126 98 75 98 85 62 38 47 53 39 42 29 30 12 0 91 92 50 51 46 30 34 38 43 49 60 71 103 141 136 109 90 115 99 81 53 61 62 36 34 24 28 20 20 0 83 85 42 43 38 22 26 32 36 51 63 75 106 142 140 112 93 126 108 88 60 64 66 39 36 27 31 28 28 8 0 89 91 55 55 50 34 39 44 49 63 76 87 120 155 150 123 100 123 109 86 62 71 78 52 49 39 44 35 24 15 12 0 95 97 64 63 56 42 49 56 60 75 86 97 126 160 155 128 104 128 113 90 67 76 82 62 59 49 53 40 29 25 23 11 0 74 81 44 43 35 23 30 39 44 62 78 89 121 159 155 127 108 136 124 101 75 79 81 54 50 42 46 43 39 23 14 14 21 0 67 69 42 41 31 25 32 41 46 64 83 90 130 164 160 133 114 146 134 111 85 84 86 59 52 47 51 53 49 32 24 24 30 9 0 74 76 61 60 42 44 51 60 66 83 102 110 147 185 179 155 133 159 146 122 98 105 107 79 71 66 70 70 60 48 40 36 33 25 18 0 57 59 46 41 25 30 36 47 52 71 93 98 136 172 172 148 126 158 147 124 121 97 99 71 65 59 63 67 62 46 38 37 43 23 13 17 0 45 46 41 34 20 34 38 48 53 73 96 99 137 176 178 151 131 163 159 135 108 102 103 73 67 64 69 75 72 54 46 49 54 34 24 29 12 0 35 37 35 26 18 34 36 46 51 70 93 97 134 171 176 151 129 161 163 139 118 102 101 71 65 65 70 84 78 58 50 56 62 41 32 38 21 9 0 29 33 30 21 18 35 33 40 45 65 87 91 117 166 171 144 125 157 156 139 113 95 97 67 60 62 67 79 82 62 53 59 66 45 38 45 27 15 6 0 3 11 41 37 47 57 55 58 63 83 105 109 147 186 188 164 144 176 182 161 134 119 116 86 78 84 88 101 108 88 80 86 92 71 64 71 54 41 32 25 0 5 12 55 41 53 64 61 61 66 84 111 113 150 186 192 166 147 180 188 167 140 124 119 90 87 90 94 107 114 77 86 92 98 80 74 77 60 48 38 32 6 0 DISPLAY_DATA_SECTION 1 170.0 85.0 2 166.0 88.0 3 133.0 73.0 4 140.0 70.0 5 142.0 55.0 6 126.0 53.0 7 125.0 60.0 8 119.0 68.0 9 117.0 74.0 10 99.0 83.0 11 73.0 79.0 12 72.0 91.0 13 37.0 94.0 14 6.0 106.0 15 3.0 97.0 16 21.0 82.0 17 33.0 67.0 18 4.0 66.0 19 3.0 42.0 20 27.0 33.0 21 52.0 41.0 22 57.0 59.0 23 58.0 66.0 24 88.0 65.0 25 99.0 67.0 26 95.0 55.0 27 89.0 55.0 28 83.0 38.0 29 85.0 25.0 30 104.0 35.0 31 112.0 37.0 32 112.0 24.0 33 113.0 13.0 34 125.0 30.0 35 135.0 32.0 36 147.0 18.0 37 147.5 36.0 38 154.5 45.0 39 157.0 54.0 40 158.0 61.0 41 172.0 82.0 42 174.0 87.0 EOF glpk-5.0/examples/tsp/gr120.tsp0000644000062000006210000007427413766346220015527 0ustar maomkpasswdNAME: gr120 TYPE: TSP COMMENT: 120 cities in Germany (Groetschel) DIMENSION: 120 EDGE_WEIGHT_TYPE: EXPLICIT EDGE_WEIGHT_FORMAT: LOWER_DIAG_ROW DISPLAY_DATA_TYPE: TWOD_DISPLAY EDGE_WEIGHT_SECTION 0 534 0 434 107 0 294 241 148 0 593 190 137 374 0 409 351 240 190 258 0 332 320 232 139 494 310 0 232 354 261 113 372 188 208 0 464 124 88 171 202 328 188 284 0 566 508 397 347 331 171 467 345 485 0 552 80 127 259 234 365 249 372 61 522 0 802 316 336 509 222 470 588 584 392 502 386 0 633 432 479 552 586 723 417 621 411 874 354 738 0 257 641 541 407 706 522 184 391 372 679 433 915 390 0 187 577 477 337 636 452 375 321 507 609 595 845 572 196 0 91 450 357 210 509 325 248 141 380 482 468 718 661 228 158 0 412 624 531 384 690 506 210 408 398 663 459 892 227 169 351 383 0 400 752 659 512 818 634 338 536 526 791 587 1020 524 151 270 371 167 0 472 805 712 565 871 687 391 589 579 844 640 1073 413 257 342 443 220 57 0 389 665 572 425 731 547 251 449 439 704 500 933 274 146 328 360 53 112 165 0 610 76 183 317 192 442 396 430 202 515 141 233 492 723 653 526 700 828 881 741 0 340 730 630 490 789 605 394 474 582 762 643 998 444 125 185 311 223 67 139 168 806 0 510 152 134 217 248 370 175 330 46 527 72 438 380 359 553 426 385 513 566 426 213 569 0 153 447 354 207 470 280 246 113 377 437 465 715 659 345 275 98 500 488 560 477 523 428 423 0 511 844 751 604 910 726 430 628 618 883 679 1112 407 296 381 482 259 96 39 204 920 178 605 599 0 269 283 190 42 332 148 169 63 213 305 301 544 582 382 312 185 365 493 546 406 359 465 259 170 585 0 525 157 95 232 42 257 316 355 160 330 167 254 521 638 568 441 615 743 796 656 188 721 206 438 835 274 0 150 539 446 299 598 414 279 283 469 571 557 807 488 112 96 120 267 255 327 244 615 195 515 237 366 274 530 0 80 507 414 267 566 382 305 251 437 539 525 775 572 196 88 77 351 339 411 328 583 279 483 205 450 242 498 63 0 130 520 427 280 579 395 318 264 450 552 538 788 543 167 59 101 322 310 382 299 596 250 496 218 412 255 511 56 25 0 401 791 691 551 850 666 474 535 662 823 723 1059 524 238 238 372 303 138 126 248 867 101 649 489 165 526 782 256 340 311 0 134 524 431 284 583 399 314 268 454 556 542 792 530 154 63 105 309 297 369 286 600 237 500 222 408 259 515 34 29 22 298 0 666 942 849 702 1008 824 528 726 716 981 777 1210 446 423 605 637 357 280 217 279 1018 336 703 754 194 683 933 521 605 576 416 563 0 259 281 188 40 364 180 142 72 211 337 299 549 555 372 302 175 338 466 519 379 357 455 257 172 558 27 272 264 232 245 516 249 656 0 505 447 336 286 354 110 406 284 424 70 461 566 819 618 548 421 602 730 783 643 538 701 466 376 822 244 353 509 478 491 762 494 920 276 0 453 358 247 234 265 59 354 232 335 182 372 477 767 566 496 369 550 678 731 591 449 649 377 324 770 192 264 458 426 439 710 443 868 224 95 0 627 334 251 408 168 239 528 406 300 166 348 331 700 740 670 504 724 852 905 765 360 823 346 504 944 366 179 632 600 613 884 617 1042 398 162 177 0 339 275 187 94 313 281 45 184 143 438 204 543 458 229 382 250 255 350 436 296 351 439 130 248 475 136 271 286 312 325 519 321 573 102 377 325 425 0 710 283 254 491 117 375 611 489 319 354 351 202 679 823 753 626 807 935 988 848 272 906 365 587 1027 449 159 715 683 696 967 700 1125 481 345 337 183 430 0 243 353 260 113 419 235 89 133 283 392 368 621 502 209 286 159 285 413 466 326 429 439 226 157 505 94 344 190 216 229 500 225 603 67 331 279 453 96 536 0 376 520 427 280 586 402 106 300 294 559 355 788 340 146 322 306 112 240 293 153 596 296 281 338 332 261 511 220 322 293 376 253 430 234 498 446 620 151 703 181 0 449 594 501 354 660 476 180 378 368 633 429 862 256 206 388 420 45 204 257 101 670 260 355 537 296 335 585 304 388 359 340 346 394 308 572 520 694 225 777 255 82 0 505 781 688 541 847 663 367 565 555 820 616 1049 289 262 444 476 196 119 136 118 857 175 542 593 129 522 772 360 444 415 255 402 161 495 759 707 881 412 964 442 269 233 0 322 611 518 371 677 493 197 395 372 650 446 879 359 69 261 293 94 142 224 84 687 146 372 410 263 352 602 177 261 232 247 219 361 325 589 537 711 242 794 272 99 106 200 0 185 575 482 335 634 450 231 319 419 607 480 843 462 86 124 156 241 226 298 218 651 166 406 273 337 310 566 40 124 95 227 82 495 300 546 494 668 276 751 207 212 278 334 151 0 353 638 545 398 704 520 224 422 412 677 473 906 282 110 292 324 61 125 178 38 714 181 399 441 217 379 629 208 292 263 261 250 315 352 616 564 738 269 821 299 126 82 154 46 182 0 324 314 191 106 275 91 225 104 244 248 332 487 638 437 367 240 421 549 602 462 390 520 290 238 641 64 227 329 297 310 581 314 739 95 187 135 309 196 392 150 317 391 578 408 365 435 0 388 234 127 124 219 113 289 168 215 270 254 431 606 501 431 304 485 613 666 526 310 584 232 302 705 128 163 393 361 374 645 378 803 159 209 120 219 229 336 214 381 455 642 472 429 499 64 0 447 664 571 424 730 546 250 448 438 703 499 932 188 204 386 418 36 202 255 88 740 258 425 535 294 405 655 302 386 357 338 344 392 378 642 590 764 295 847 325 152 68 231 130 276 96 461 525 0 360 606 513 366 672 488 192 390 380 645 441 874 273 117 299 331 46 150 203 63 682 206 367 448 242 347 597 215 299 270 286 257 340 320 584 532 706 237 789 267 94 58 179 48 189 31 403 467 82 0 605 133 180 312 287 418 264 425 112 575 55 439 313 448 648 520 474 602 655 515 193 658 89 517 694 354 220 610 577 591 738 595 792 352 514 425 401 219 404 421 370 444 631 461 495 488 385 307 514 456 0 656 932 839 692 998 814 518 716 706 971 767 1200 444 413 595 627 347 270 200 269 1008 326 693 744 177 673 923 511 595 566 406 553 42 646 910 858 1032 563 1115 593 420 384 151 351 485 305 729 793 382 330 782 0 573 113 101 280 79 329 359 403 163 402 157 235 509 686 616 489 663 791 844 704 131 769 209 486 883 322 57 578 546 559 830 563 981 320 425 336 236 314 176 392 559 633 820 650 614 677 353 220 603 645 210 971 0 293 384 274 143 319 129 262 60 314 286 402 531 675 451 381 201 458 586 639 499 460 534 360 151 678 101 318 343 311 324 595 328 776 132 225 173 353 233 436 187 354 428 615 445 379 472 83 147 498 440 455 766 375 0 372 283 199 153 229 39 273 151 324 196 324 441 686 485 415 288 469 597 650 510 413 568 370 241 689 111 228 377 345 358 629 362 787 143 135 83 263 244 346 198 365 439 626 456 413 483 54 72 509 451 377 777 300 90 0 330 479 386 239 545 361 65 259 253 518 314 747 378 119 276 260 150 278 331 191 555 334 240 297 370 220 470 174 276 247 414 207 468 193 457 405 579 110 662 140 46 120 307 126 166 164 276 340 190 132 329 458 518 313 324 0 610 297 234 391 107 275 511 389 322 248 331 254 693 723 653 526 707 835 888 748 302 806 368 487 927 349 149 615 583 596 867 600 1025 381 239 231 77 408 106 436 603 677 864 694 651 721 292 236 747 689 384 1015 186 336 246 562 0 598 874 781 634 940 756 460 658 648 913 709 1142 370 355 537 569 289 212 197 211 950 268 635 686 157 615 865 453 537 508 348 495 84 588 852 800 974 505 1057 535 362 326 93 293 427 247 671 735 324 272 724 85 913 708 719 400 957 0 214 604 504 364 663 479 402 348 534 636 622 872 599 223 49 185 378 319 391 355 680 234 580 302 430 339 595 123 115 86 287 90 632 329 575 523 697 409 780 313 349 415 471 288 151 319 394 458 413 326 675 622 643 408 442 303 680 564 0 154 401 308 161 460 276 199 78 331 433 419 669 612 298 228 63 453 441 513 430 477 381 377 47 552 136 392 190 158 171 442 175 707 126 372 320 494 201 577 110 291 490 546 363 226 396 191 255 488 401 471 697 440 138 239 250 477 639 255 0 70 464 371 224 523 339 262 208 394 496 482 732 567 191 121 27 346 334 406 323 540 274 440 162 445 199 455 83 47 64 335 68 600 189 435 383 557 269 640 173 295 383 439 256 119 287 254 378 381 294 534 590 503 268 302 249 540 532 148 115 0 606 349 266 387 183 216 507 385 354 147 363 357 715 719 649 522 703 831 884 744 375 802 400 483 923 345 194 611 579 592 863 596 1021 377 139 154 22 447 209 432 599 673 860 690 647 717 288 232 743 685 416 1011 262 332 242 558 103 953 676 473 536 0 631 228 175 412 38 296 532 410 240 306 272 210 640 744 674 547 728 856 909 769 233 827 286 508 948 370 80 636 604 617 888 621 1046 402 293 261 138 351 79 457 624 698 885 715 672 742 313 257 768 710 325 1036 117 357 267 583 69 978 701 498 561 153 0 642 129 176 349 121 369 428 472 232 428 226 187 578 755 685 558 732 860 913 773 98 838 278 555 952 391 132 647 615 628 899 632 1050 389 465 376 260 383 161 461 628 702 889 719 683 746 422 330 772 714 279 1040 75 430 340 587 191 982 712 509 572 275 122 0 503 779 686 539 845 661 365 563 553 818 614 1047 245 260 442 474 141 151 168 116 855 207 540 591 162 520 770 358 442 413 287 400 201 493 757 705 879 410 962 440 267 231 44 198 332 152 576 640 174 177 629 199 818 613 624 305 862 125 469 544 437 858 883 887 0 372 762 662 522 821 637 456 506 644 794 705 1030 506 209 209 343 285 120 108 230 838 72 631 460 147 497 753 227 311 282 29 269 398 487 733 681 855 501 938 471 354 322 237 218 198 243 552 616 320 268 720 388 801 566 600 396 838 330 258 413 306 834 859 870 269 0 641 348 265 422 152 262 542 420 314 189 362 313 714 754 684 557 738 866 919 779 344 837 360 518 958 380 193 646 614 627 898 631 1056 412 185 200 23 439 165 467 634 708 895 725 682 752 323 233 778 720 415 1046 231 367 277 593 59 988 711 508 571 45 122 244 893 869 0 561 837 744 597 903 719 423 621 611 876 672 1105 311 318 500 532 252 175 192 174 913 231 598 649 186 578 828 416 500 471 311 458 154 551 815 763 937 468 1020 498 325 289 65 256 390 210 634 698 287 235 687 152 876 671 682 363 920 77 527 602 495 916 941 945 66 293 951 0 478 754 661 514 820 636 340 538 528 793 589 1022 261 235 417 449 116 132 149 91 830 188 515 566 159 495 745 333 417 388 268 375 226 468 732 680 854 385 937 415 242 206 55 173 307 127 551 615 149 152 604 224 793 588 599 280 837 150 444 519 412 833 858 862 25 250 868 91 0 247 316 223 76 360 176 170 39 246 333 334 572 583 360 290 163 366 494 547 407 392 443 292 133 586 37 307 252 220 233 504 237 684 34 272 220 394 146 477 95 262 336 523 353 288 380 92 156 406 348 387 674 355 83 139 221 377 616 317 92 177 373 398 424 521 475 408 579 496 0 317 336 212 95 289 105 218 79 266 262 354 501 631 430 360 233 414 542 595 455 412 513 312 213 634 53 248 397 290 378 574 382 732 88 201 149 323 189 406 143 310 384 571 401 358 428 21 85 454 396 407 722 375 62 68 269 306 664 387 184 247 302 327 444 569 545 337 627 544 70 0 272 382 289 142 448 264 84 162 234 421 295 650 497 180 315 188 280 408 461 321 458 464 221 186 500 123 373 193 245 258 544 228 598 96 360 308 482 91 565 29 142 250 437 267 159 294 179 243 320 262 310 588 421 216 227 96 465 530 342 139 209 461 486 490 435 526 496 493 410 124 172 0 575 276 199 356 86 240 476 354 287 250 296 266 672 688 618 491 672 800 853 713 289 771 333 452 892 314 127 580 548 561 832 565 990 346 237 205 82 373 141 401 568 642 829 659 616 686 257 201 712 654 349 980 165 301 211 527 35 922 645 442 505 97 56 178 827 803 66 885 802 342 271 430 0 219 479 386 239 545 361 167 259 317 518 378 747 474 83 172 149 253 235 339 230 555 228 304 263 378 220 470 79 139 134 289 112 507 193 457 405 579 174 662 126 154 290 346 136 621 194 276 340 288 201 393 497 518 313 324 108 562 439 199 216 153 558 583 587 344 260 593 402 319 221 269 97 527 0 293 683 583 443 742 558 238 427 426 715 487 951 352 50 232 264 131 101 174 108 759 105 413 381 213 418 674 148 232 203 206 190 385 408 654 602 776 283 859 248 140 168 224 41 122 72 473 537 166 89 502 375 722 487 521 167 759 317 259 334 227 755 780 791 222 177 790 280 197 396 466 219 724 134 0 54 529 429 289 588 404 327 273 459 561 547 797 595 219 92 82 374 362 434 351 605 302 505 227 473 264 520 119 31 43 363 58 628 254 500 448 622 334 705 238 327 411 467 284 147 315 319 383 409 322 600 618 568 333 367 281 605 560 84 180 53 601 626 637 465 334 636 523 440 242 312 267 570 170 255 0 648 188 182 355 68 316 434 430 238 362 232 154 584 761 691 564 738 866 919 779 177 844 284 561 958 390 100 653 621 634 905 638 1056 395 412 323 194 389 95 467 634 708 895 725 689 752 333 277 778 720 285 1046 81 377 287 593 125 988 718 515 578 209 56 66 893 876 178 951 868 418 347 496 112 593 797 643 0 211 601 501 361 660 476 231 345 479 633 480 869 466 74 81 182 243 189 261 220 677 129 406 299 300 336 592 105 150 121 190 108 497 326 572 520 694 276 777 310 204 280 336 143 37 184 391 455 278 191 495 487 640 405 439 166 677 429 160 252 145 673 698 709 334 161 708 392 309 314 384 196 642 99 125 173 715 0 568 844 751 604 910 726 430 628 618 883 679 1112 348 325 507 539 259 182 150 181 920 238 605 656 127 585 835 423 507 478 318 465 98 558 822 770 944 475 1027 505 332 296 63 263 397 217 641 705 294 242 694 96 883 678 689 370 927 30 534 609 502 923 948 952 103 300 958 56 120 586 634 500 892 409 287 530 958 399 0 497 150 67 204 70 257 288 327 155 335 164 282 516 610 540 413 587 715 768 628 216 693 201 410 807 246 28 502 470 483 754 487 905 244 353 264 184 243 187 316 483 557 744 574 538 601 199 135 627 569 217 895 85 292 228 442 167 837 567 364 427 199 108 160 742 725 198 800 717 279 220 345 132 442 646 492 128 564 807 0 290 680 580 440 739 555 317 424 505 712 566 948 506 139 98 261 285 155 227 229 756 88 492 378 266 415 671 144 176 164 140 136 424 405 651 599 773 362 856 389 290 322 263 195 116 226 470 534 320 243 581 414 719 484 518 252 756 356 147 331 224 752 777 788 295 111 787 319 276 393 463 275 721 178 154 190 794 79 326 643 0 475 65 42 182 137 282 261 295 65 439 85 321 437 588 518 391 565 693 746 606 141 671 111 388 785 224 95 480 448 461 732 465 883 222 378 289 272 216 254 294 461 535 722 552 516 579 255 169 605 547 138 873 92 325 241 420 255 815 545 342 405 287 175 161 720 703 286 778 695 257 277 323 220 420 624 470 167 542 785 88 621 0 654 341 278 435 151 319 555 433 366 266 375 298 755 767 697 570 751 879 932 792 346 850 412 531 971 393 193 659 627 640 911 644 1069 425 262 254 100 452 103 480 647 721 908 738 695 765 336 280 791 733 428 1059 230 380 290 606 44 1001 724 521 584 122 113 235 906 882 77 964 881 421 350 509 79 606 803 649 169 721 971 211 800 299 0 445 387 276 226 294 50 346 224 364 125 410 506 759 558 488 361 542 670 723 583 478 641 406 316 762 184 293 450 418 431 702 435 860 216 64 57 193 317 411 271 438 512 699 529 486 556 127 149 582 524 454 850 365 165 75 397 311 792 515 312 375 170 332 405 697 673 216 755 672 212 141 300 276 397 594 440 352 512 762 293 591 318 355 0 375 765 665 525 824 640 384 509 572 797 633 1033 434 160 245 346 213 48 59 158 841 42 559 463 98 500 756 230 314 285 90 272 326 490 736 684 858 429 941 474 286 250 165 169 201 171 555 619 248 196 648 316 804 569 603 324 841 258 294 416 309 837 862 873 197 72 872 221 178 478 548 454 832 263 128 337 879 164 228 728 130 706 885 676 0 268 658 558 418 717 533 231 402 419 690 480 926 420 53 138 239 199 132 204 202 734 72 406 356 243 393 649 123 207 178 185 165 401 383 629 577 751 276 834 367 204 236 240 109 86 140 448 512 234 157 495 391 697 462 496 166 734 333 187 309 202 730 755 766 272 156 765 296 253 371 441 227 699 130 68 230 772 57 303 627 86 599 778 569 107 0 261 519 426 279 585 401 141 299 329 558 390 787 422 43 200 232 211 183 294 178 595 162 316 342 333 260 510 98 200 171 275 131 455 233 497 445 619 186 702 166 114 248 294 67 90 142 316 380 246 159 405 445 558 353 364 76 602 387 227 295 195 598 623 627 292 246 633 350 267 261 309 137 567 69 82 223 633 90 357 482 176 460 646 437 197 90 0 710 184 271 417 239 487 496 530 300 546 249 168 616 823 753 626 800 928 981 841 108 906 321 623 1020 459 241 715 683 696 967 700 1118 457 583 494 378 451 279 529 696 770 957 787 751 814 490 448 840 782 310 1108 184 560 458 655 309 1050 780 577 640 393 240 118 955 938 362 1013 930 492 512 558 296 655 859 705 179 777 1020 269 856 229 353 523 941 834 695 0 396 291 180 177 198 53 297 175 268 218 305 410 710 509 439 312 493 621 674 534 382 592 310 273 713 135 197 401 369 382 653 386 811 167 157 67 215 268 315 222 389 463 650 480 437 507 78 53 533 475 358 801 269 122 32 348 215 743 466 263 326 206 236 309 648 624 238 706 623 163 92 251 180 348 545 391 256 463 713 197 542 222 259 97 627 520 388 427 0 295 424 278 183 308 118 302 100 354 275 442 520 715 491 421 241 498 626 679 539 500 574 400 191 718 141 307 383 351 364 635 368 816 172 214 162 342 273 425 227 394 468 655 485 419 512 114 151 538 480 495 806 364 40 79 353 325 748 448 178 308 321 346 419 653 606 356 711 628 123 93 256 290 353 527 373 366 445 718 281 524 365 369 154 609 502 393 537 111 0 651 927 834 687 993 809 513 711 701 966 762 1195 407 408 590 622 342 265 282 264 1003 321 688 739 276 668 918 506 590 561 401 548 174 641 905 853 1027 558 1110 588 415 379 155 346 480 300 724 788 377 325 777 173 966 761 772 453 1010 90 617 692 585 1006 1031 1035 162 383 1041 96 187 669 717 583 975 492 370 613 1041 482 112 890 409 868 1054 845 311 386 440 1103 796 801 0 175 565 472 325 624 440 311 309 495 597 583 833 504 128 76 146 283 271 343 260 641 211 541 263 382 300 556 32 76 47 272 30 537 290 536 484 658 318 741 222 256 320 376 193 56 224 355 419 318 231 636 527 604 369 403 210 641 469 103 216 109 637 662 673 374 243 672 432 349 278 423 225 606 104 164 99 679 57 439 528 112 506 685 476 246 114 134 741 427 409 522 0 585 67 146 292 135 385 371 405 175 458 147 249 499 698 628 501 675 803 856 716 57 781 221 498 895 334 131 590 558 571 842 575 993 332 481 392 303 326 215 404 571 645 832 662 626 689 365 261 715 657 200 983 74 435 356 530 245 925 655 452 515 318 176 62 830 813 287 888 805 367 387 433 232 530 734 580 120 652 895 159 731 104 289 421 816 709 570 121 325 438 978 616 0 250 640 540 400 699 515 277 384 465 672 526 908 466 99 89 221 245 178 250 220 716 96 452 338 289 375 631 105 189 160 151 147 447 365 611 559 733 322 816 349 250 282 286 155 76 186 430 494 280 203 541 437 679 444 478 212 716 379 138 291 184 712 737 748 318 122 747 342 299 353 423 235 681 138 114 212 754 39 349 603 40 581 760 551 138 46 136 816 502 484 432 96 691 0 717 221 251 424 137 385 503 499 307 417 301 95 653 830 760 633 807 935 988 848 190 913 353 631 1027 459 169 722 690 703 974 707 1125 464 481 392 246 458 117 536 703 777 964 794 758 821 402 346 847 789 354 1115 150 446 356 662 169 1057 787 584 647 272 125 92 962 945 228 1020 937 487 416 565 181 662 866 712 69 784 1027 197 863 236 213 421 948 841 702 162 325 435 1110 748 154 823 0 246 454 361 213 373 183 332 130 384 340 472 585 745 472 402 237 528 656 709 569 530 555 430 167 748 171 372 364 332 345 616 349 846 202 279 227 407 303 490 257 424 498 685 515 400 542 157 221 568 510 525 836 429 70 144 383 390 778 429 174 289 386 411 484 683 587 421 741 658 153 132 286 355 383 508 354 431 426 748 346 505 395 434 219 590 483 423 630 176 65 831 390 505 465 500 0 788 302 322 495 208 456 574 570 378 488 372 23 724 901 831 704 818 1006 1059 919 203 984 424 701 1098 530 240 793 761 774 1045 778 1196 535 552 463 317 529 188 607 774 848 1035 865 829 892 473 417 918 860 425 1186 221 517 427 733 240 1128 858 655 718 343 196 173 1033 1016 299 1091 1008 558 487 636 252 733 937 783 154 855 1098 268 934 307 284 492 1019 912 773 138 396 506 1181 819 235 894 81 571 0 426 596 503 356 662 478 182 380 370 635 431 864 253 183 365 397 27 181 234 82 672 237 357 514 273 337 587 281 365 336 317 323 371 310 574 522 696 227 779 257 84 19 210 83 255 67 393 457 65 35 446 361 635 430 441 122 679 303 392 467 360 675 700 704 208 299 710 266 183 338 386 252 644 267 145 388 710 257 273 559 299 537 723 514 227 213 225 772 465 470 355 297 647 259 779 500 850 0 596 575 330 377 237 179 497 375 552 100 589 407 941 709 639 512 693 821 874 734 421 792 460 467 913 335 236 601 569 582 853 586 1011 367 91 117 72 468 259 422 589 663 850 680 637 707 278 221 733 675 642 1001 308 316 212 548 153 943 666 463 526 47 212 334 848 824 95 906 823 363 292 451 156 548 745 591 268 663 913 241 742 506 172 133 827 720 588 452 185 305 996 627 364 702 322 370 393 665 0 634 910 817 670 976 792 496 694 684 949 745 1178 414 391 573 605 325 248 185 247 986 304 671 722 162 651 901 489 573 544 384 531 32 624 888 836 1010 541 1093 571 398 362 129 329 463 283 707 771 360 308 760 33 949 744 755 436 983 52 600 675 568 989 1014 1018 169 366 1024 122 194 652 700 566 958 475 353 596 1024 465 66 873 392 851 1037 828 294 369 423 1086 779 784 142 505 961 415 1003 814 1164 339 979 0 507 209 111 201 139 172 408 286 213 329 223 351 575 620 550 423 604 732 785 645 275 703 259 384 824 202 87 512 480 493 764 497 922 278 268 141 173 252 256 333 500 574 761 591 548 618 138 74 644 586 276 912 144 233 143 459 156 854 577 374 437 208 177 219 759 735 187 817 734 274 159 362 121 459 656 502 197 574 824 59 653 147 200 208 738 631 499 328 112 222 907 538 218 613 266 287 337 576 208 890 0 463 186 79 155 157 161 251 216 167 318 206 369 558 576 506 379 553 681 734 594 262 659 213 376 773 176 115 468 436 449 720 453 871 210 257 168 219 206 274 282 449 523 710 540 504 567 112 48 593 535 259 861 172 195 120 408 202 803 533 330 393 254 195 247 708 691 233 766 683 204 133 311 167 408 612 458 215 530 773 87 609 121 246 197 694 587 448 350 101 199 856 494 225 569 284 269 355 525 251 839 46 0 408 169 105 116 242 298 131 229 57 455 118 437 468 315 451 325 341 469 522 382 245 525 72 322 561 158 200 413 382 394 605 398 659 155 394 305 344 86 359 228 237 311 498 328 362 355 188 160 381 323 169 649 208 259 269 196 327 591 478 276 339 391 280 277 496 587 358 554 471 191 211 177 292 260 369 403 283 362 561 172 448 110 371 334 515 362 272 345 238 299 644 439 220 408 352 329 423 313 388 627 183 137 0 529 389 278 310 236 127 430 308 366 125 403 447 755 642 572 445 626 754 807 667 420 725 408 400 846 268 235 534 502 515 786 519 944 300 80 68 112 401 299 355 522 596 783 613 570 640 211 169 666 608 456 934 307 249 225 481 193 876 599 396 459 89 231 353 781 757 135 839 756 296 225 384 175 481 678 524 287 596 846 240 675 320 212 84 760 653 521 471 133 238 929 560 363 635 362 303 433 598 52 912 156 199 336 0 192 412 319 172 477 293 160 154 342 450 430 680 573 228 235 108 383 371 443 360 488 311 388 167 482 153 403 119 165 178 372 154 637 126 389 337 511 162 594 71 207 420 476 232 136 324 209 273 418 331 482 627 451 246 256 161 494 569 262 120 110 490 515 590 474 343 525 532 449 127 202 74 459 96 264 187 526 182 539 375 261 353 538 329 346 239 165 588 280 286 622 151 463 221 595 294 666 397 480 605 391 341 287 413 0 529 286 231 310 177 165 430 308 319 182 328 379 680 642 572 445 626 754 807 667 344 725 365 406 846 268 159 534 502 515 786 519 944 300 137 106 75 370 231 355 522 596 783 613 570 640 211 155 666 608 381 934 231 255 165 481 125 876 599 396 459 77 155 247 781 757 89 839 756 296 225 384 99 481 678 524 211 596 846 164 675 252 148 168 760 653 521 365 137 244 929 560 287 635 294 309 365 598 80 912 131 177 314 87 413 0 434 710 617 470 776 592 296 494 484 749 545 978 346 191 373 405 125 82 142 47 786 145 471 522 145 451 701 289 373 344 225 331 238 424 688 636 810 341 893 371 198 162 77 129 263 83 507 571 160 108 560 228 749 544 555 236 793 170 400 475 368 789 814 818 76 207 824 133 51 452 500 366 758 275 153 396 824 265 140 673 233 651 837 628 135 210 223 886 579 584 223 305 761 241 893 614 964 139 779 206 690 639 427 712 405 712 0 535 811 718 571 877 693 397 595 585 850 646 1079 336 292 474 506 226 94 76 129 887 154 572 623 75 552 802 390 474 445 202 432 175 525 789 737 911 442 994 472 299 263 58 230 364 184 608 672 261 209 661 160 850 645 656 337 894 140 501 576 469 890 915 919 91 184 925 113 88 553 601 467 859 376 176 497 925 276 110 774 242 752 938 729 123 219 324 987 680 685 205 406 862 265 994 715 1065 240 880 143 791 740 528 813 506 813 82 0 630 108 191 337 165 424 416 450 220 483 188 190 540 743 673 546 720 848 901 761 43 826 266 543 940 379 161 635 603 616 887 620 1038 877 520 431 315 371 216 449 616 690 877 707 671 734 410 306 760 702 241 1028 104 480 395 575 246 970 700 497 560 348 177 55 875 858 299 933 850 412 432 478 233 575 779 625 121 697 940 189 776 149 290 460 861 754 615 80 364 474 1023 661 41 736 147 550 160 692 394 1006 248 270 265 393 508 317 806 907 0 446 252 145 227 162 111 347 225 233 268 272 374 624 559 489 362 543 671 724 584 346 642 279 323 763 185 161 451 419 432 703 436 861 217 207 141 162 272 279 272 439 513 700 530 487 557 128 50 583 525 325 851 233 172 82 398 179 793 516 313 376 175 200 273 698 674 176 756 673 213 142 301 144 398 595 441 220 513 763 108 592 187 223 147 677 570 438 391 51 161 846 477 289 552 289 226 360 515 167 829 49 66 203 115 330 98 629 730 319 0 166 518 425 277 437 247 336 114 448 404 536 649 749 435 365 150 590 578 650 567 594 518 494 90 689 235 436 402 295 383 579 387 844 189 343 291 471 295 554 247 428 627 683 500 363 531 221 285 625 538 589 834 493 134 208 372 454 776 392 137 252 450 475 548 681 550 485 739 656 150 196 276 419 353 471 317 495 389 746 410 468 459 498 283 553 446 432 694 240 129 829 353 569 428 564 80 635 604 434 812 351 333 393 367 257 373 612 713 614 290 0 471 313 202 252 166 99 372 250 290 210 358 378 679 584 514 387 568 696 749 609 350 667 332 348 788 210 165 476 444 457 728 461 886 242 156 61 135 311 276 297 464 538 725 555 512 582 153 93 608 550 380 876 237 197 107 423 170 818 541 338 401 147 191 277 723 699 149 781 698 238 167 326 135 423 620 466 224 538 788 139 617 244 214 118 702 595 462 395 67 186 871 502 293 577 293 251 364 540 128 854 80 123 260 76 355 70 654 755 323 39 315 0 442 718 625 478 784 600 304 502 492 757 553 986 300 199 381 413 81 137 184 53 794 209 479 530 194 459 709 297 381 352 285 339 261 432 696 644 818 349 901 379 206 126 90 137 271 91 515 579 111 116 568 259 757 552 563 244 801 185 408 483 376 797 822 826 60 267 832 126 35 460 508 374 766 283 161 404 832 273 155 681 293 659 845 636 195 270 231 894 587 592 222 313 769 301 901 622 972 108 787 229 698 647 435 720 413 720 55 123 814 637 620 662 0 523 230 147 304 81 188 424 302 235 255 174 293 596 636 566 439 620 748 801 661 265 719 281 400 840 262 75 528 496 509 780 513 938 294 284 195 104 321 193 349 516 590 777 607 564 634 205 149 660 602 297 928 147 249 159 475 87 870 593 390 453 119 108 192 775 751 118 833 750 290 219 378 52 475 672 518 139 590 840 80 669 168 131 224 754 647 515 310 128 238 923 554 208 629 208 303 279 592 161 906 69 115 240 160 407 84 706 807 238 92 367 87 714 0 566 45 139 273 228 383 352 386 121 540 60 314 411 679 609 482 656 784 837 697 81 762 132 479 876 315 189 571 539 552 823 556 974 313 479 390 366 307 308 385 552 626 813 643 607 670 346 266 696 638 112 964 158 416 342 511 335 906 636 433 496 381 266 155 811 794 380 869 786 348 368 414 314 511 715 561 213 633 876 182 712 97 379 419 797 690 551 189 323 456 959 597 93 672 247 486 284 628 607 942 244 218 178 421 444 346 742 843 124 284 550 345 750 262 0 235 313 220 73 371 187 168 43 243 344 331 583 581 348 278 151 364 492 545 405 389 431 289 137 584 48 304 240 208 221 492 225 682 32 283 231 405 144 488 93 260 334 521 351 276 378 103 167 404 346 384 672 352 95 150 219 388 614 305 94 165 384 409 421 519 463 419 577 494 12 92 122 353 219 384 230 429 302 584 276 381 254 432 223 466 359 259 489 174 135 667 266 364 341 498 165 569 336 374 650 285 215 188 307 115 307 450 551 409 224 154 249 458 301 345 0 432 822 722 582 881 697 441 566 629 854 690 1090 491 217 302 403 270 105 69 215 898 99 616 520 108 557 813 287 371 342 77 329 383 547 793 741 915 486 998 531 343 307 222 226 258 228 612 676 305 253 705 373 861 626 660 381 898 315 351 473 366 894 919 930 254 66 929 278 235 535 605 511 863 320 185 394 936 221 285 785 177 763 942 733 57 164 254 998 684 666 368 303 873 195 1005 647 1076 284 884 351 795 751 572 817 403 817 192 145 819 734 610 759 252 811 854 523 0 435 653 560 413 719 535 239 437 427 692 488 921 220 192 374 406 29 190 243 64 729 246 414 523 282 394 644 290 374 345 326 332 380 367 631 579 753 284 836 314 141 78 219 123 264 84 450 514 34 75 503 370 692 487 498 179 736 312 401 476 369 732 757 761 137 308 767 275 112 395 443 309 701 276 154 397 767 266 282 616 308 594 780 571 236 222 234 829 522 527 365 306 704 268 836 557 907 56 722 348 633 582 370 655 406 655 148 249 749 572 613 597 77 649 685 393 293 0 369 167 79 77 205 259 153 190 97 416 185 435 537 482 412 286 459 587 640 500 243 555 111 283 679 119 163 375 343 356 626 360 777 116 355 266 305 108 322 189 356 429 616 446 411 473 149 121 499 441 238 767 206 220 230 315 288 709 439 237 300 352 243 275 614 587 319 672 589 152 172 218 253 315 518 364 281 436 679 135 515 108 332 295 600 493 355 343 199 260 762 401 218 475 350 290 421 431 349 745 144 98 39 297 248 275 545 646 263 164 354 221 553 201 199 149 657 488 0 121 511 418 271 570 386 309 255 441 543 529 779 518 142 99 84 297 285 357 274 587 225 487 209 396 246 502 35 29 42 286 36 551 236 482 430 604 316 687 220 268 334 390 207 70 238 301 365 332 245 581 541 550 315 349 222 587 483 126 162 55 583 608 619 388 257 618 446 363 224 294 249 552 104 178 60 625 96 453 474 175 452 631 422 260 153 146 687 373 355 536 47 562 135 694 336 765 311 573 519 484 440 386 506 169 506 319 520 607 423 299 448 327 500 543 212 317 320 347 0 DISPLAY_DATA_SECTION 1 8.0 124.0 2 125.0 80.0 3 97.0 74.0 4 69.0 96.0 5 106.0 46.0 6 49.0 57.0 7 80.0 125.0 8 42.0 93.0 9 104.0 94.0 10 35.0 17.0 11 118.0 96.0 12 151.0 22.0 13 154.0 182.0 14 57.0 165.0 15 18.0 159.0 16 27.0 123.0 17 96.0 170.0 18 63.0 198.0 19 59.0 211.0 20 88.0 182.0 21 142.0 72.0 22 48.0 190.0 23 106.0 106.0 24 28.0 102.0 25 63.0 224.0 26 58.0 93.0 27 103.0 56.0 28 38.0 149.0 29 23.0 138.0 30 22.0 146.0 31 32.0 208.0 32 27.0 144.0 33 75.0 258.0 34 59.0 101.0 35 41.0 32.0 36 53.0 46.0 37 76.0 19.0 38 79.0 115.0 39 109.0 13.0 40 59.0 118.0 41 84.0 147.0 42 95.0 160.0 43 87.0 213.0 44 73.0 166.0 45 43.0 153.0 46 81.0 175.0 47 59.0 77.0 48 70.0 68.0 49 106.0 169.0 50 86.0 168.0 51 127.0 109.0 52 68.0 243.0 53 116.0 57.0 54 39.0 78.0 55 54.0 65.0 56 77.0 141.0 57 95.0 24.0 58 89.0 238.0 59 9.0 158.0 60 39.0 109.0 61 25.0 129.0 62 69.0 20.0 63 104.0 34.0 64 132.0 51.0 65 98.0 207.0 66 37.0 203.0 67 80.0 16.0 68 103.0 224.0 69 94.0 202.0 70 49.0 96.0 71 55.0 80.0 72 62.0 123.0 73 91.0 31.0 74 51.0 142.0 75 64.0 172.0 76 14.0 138.0 77 120.0 37.0 78 38.0 160.0 79 86.0 230.0 80 96.0 59.0 81 33.0 177.0 82 108.0 78.0 83 93.0 12.0 84 43.0 47.0 85 52.0 200.0 86 48.0 171.0 87 62.0 153.0 88 159.0 53.0 89 60.0 60.0 90 36.0 73.0 91 111.0 243.0 92 31.0 150.0 93 130.0 67.0 94 36.0 172.0 95 132.0 28.0 96 29.0 73.0 97 150.0 28.0 98 89.0 166.0 99 58.0 21.0 100 78.0 244.0 101 82.0 58.0 102 81.0 68.0 103 92.0 98.0 104 56.0 33.0 105 47.0 126.0 106 70.0 34.0 107 78.0 195.0 108 77.0 215.0 109 140.0 62.0 110 70.0 57.0 111 16.0 89.0 112 66.0 50.0 113 98.0 194.0 114 87.0 45.0 115 132.0 87.0 116 52.0 99.0 117 50.0 212.0 118 103.0 176.0 119 84.0 91.0 120 31.0 140.0 EOF glpk-5.0/examples/tsp/main.c0000644000062000006210000004355213766346220015227 0ustar maomkpasswd/* main.c */ /* Written by Andrew Makhorin , October 2015. */ /*********************************************************************** * This program is a stand-alone solver intended for solving Symmetric * Traveling Salesman Problem (TSP) with the branch-and-bound method. * * Please note that this program is only an illustrative example. It is * *not* a state-of-the-art code, so only small TSP instances (perhaps, * having up to 150-200 nodes) can be solved with this code. * * To run this program use the following command: * * tspsol tsp-file * * where tsp-file specifies an input text file containing TSP data in * TSPLIB 95 format. * * Detailed description of the input format recognized by this program * is given in the report: Gerhard Reinelt, "TSPLIB 95". This report as * well as TSPLIB, a library of sample TSP instances (and other related * problems), are freely available for research purposes at the webpage * . * * Symmetric Traveling Salesman Problem * ------------------------------------ * Let a complete undirected graph be given: * * K = (V, E), (1) * * where V = {1, ..., n} is a set of nodes, E = V cross V is a set of * edges. Let also each edge e = (i,j) be assigned a positive number * c[i,j], which is the length of e. The Symmetric Traveling Salesman * Problem (TSP) is to find a tour in K of minimal length. * * Integer programming formulation of TSP * -------------------------------------- * For a set of nodes W within V introduce the following notation: * * d(W) = {(i,j):i in W and j not in W or i not in W and j in W}, (2) * * i.e. d(W) is the set of edges which have exactly one endnode in W. * If W = {v}, i.e. W consists of the only node, we write simply d(v). * * The integer programming formulation of TSP is the following: * * minimize sum c[i,j] * x[i,j] (3) * i,j * * subject to sum x[i,j] = 2 for all v in V (4) * (i,j) in d(v) * * sum x[i,j] >= 2 for all W within V, (5) * (i,j) in d(W) W != empty, W != V * * x[i,j] in {0, 1} for all i, j (6) * * The binary variables x[i,j] have conventional meaning: if x[i,j] = 1, * the edge (i,j) is included in the tour, otherwise, if x[i,j] = 0, the * edge is not included in the tour. * * The constraints (4) are called degree constraints. They require that * for each node v in V there must be exactly two edges included in the * tour which are incident to v. * * The constraints (5) are called subtour elimination constraints. They * are used to forbid subtours. Note that the number of the subtour * elimination constraints grows exponentially on the size of the TSP * instance, so these constraints are not included explicitly in the * IP, but generated dynamically during the B&B search. ***********************************************************************/ #include #include #include #include #include #include #include #include "maxflow.h" #include "mincut.h" #include "misc.h" #include "tsplib.h" int n; /* number of nodes in the problem, n >= 2 */ int *c; /* int c[1+n*(n-1)/2]; */ /* upper triangle (without diagonal entries) of the (symmetric) matrix * C = (c[i,j]) in row-wise format, where c[i,j] specifies a length of * edge e = (i,j), 1 <= i < j <= n */ int *tour; /* int tour[1+n]; */ /* solution to TSP, which is a tour specified by the list of node * numbers tour[1] -> ... -> tour[nn] -> tour[1] in the order the nodes * are visited; note that any tour is a permutation of node numbers */ glp_prob *P; /* integer programming problem object */ /*********************************************************************** * loc - determine reduced index of element of symmetric matrix * * Given indices i and j of an element of a symmetric nxn-matrix, * 1 <= i, j <= n, i != j, this routine returns the index of that * element in an array, which is the upper triangle (without diagonal * entries) of the matrix in row-wise format. */ int loc(int i, int j) { xassert(1 <= i && i <= n); xassert(1 <= j && j <= n); xassert(i != j); if (i < j) return ((n - 1) + (n - i + 1)) * (i - 1) / 2 + (j - i); else return loc(j, i); } /*********************************************************************** * read_data - read TSP data * * This routine reads TSP data from a specified text file in TSPLIB 95 * format. */ void read_data(const char *fname) { TSP *tsp; int i, j; tsp = tsp_read_data(fname); if (tsp == NULL) { xprintf("TSP data file processing error\n"); exit(EXIT_FAILURE); } if (tsp->type != TSP_TSP) { xprintf("Invalid TSP data type\n"); exit(EXIT_FAILURE); } n = tsp->dimension; xassert(n >= 2); if (n > 32768) { xprintf("TSP instance too large\n"); exit(EXIT_FAILURE); } c = xalloc(1+loc(n-1, n), sizeof(int)); for (i = 1; i <= n; i++) { for (j = i+1; j <= n; j++) c[loc(i, j)] = tsp_distance(tsp, i, j); } tsp_free_data(tsp); return; } /*********************************************************************** * build_prob - build initial integer programming problem * * This routine builds the initial integer programming problem, which * includes all variables (6), objective (3) and all degree constraints * (4). Subtour elimination constraints (5) are considered "lazy" and * not included in the initial problem. */ void build_prob(void) { int i, j, k, *ind; double *val; char name[50]; /* create problem object */ P = glp_create_prob(); /* add all binary variables (6) */ for (i = 1; i <= n; i++) { for (j = i+1; j <= n; j++) { k = glp_add_cols(P, 1); xassert(k == loc(i,j)); sprintf(name, "x[%d,%d]", i, j); glp_set_col_name(P, k, name); glp_set_col_kind(P, k, GLP_BV); /* set objective coefficient (3) */ glp_set_obj_coef(P, k, c[k]); } } /* add all degree constraints (4) */ ind = xalloc(1+n, sizeof(int)); val = xalloc(1+n, sizeof(double)); for (i = 1; i <= n; i++) { k = glp_add_rows(P, 1); xassert(k == i); sprintf(name, "v[%d]", i); glp_set_row_name(P, i, name); glp_set_row_bnds(P, i, GLP_FX, 2, 2); k = 0; for (j = 1; j <= n; j++) { if (i != j) k++, ind[k] = loc(i,j), val[k] = 1; } xassert(k == n-1); glp_set_mat_row(P, i, n-1, ind, val); } xfree(ind); xfree(val); return; } /*********************************************************************** * build_tour - build tour for corresponding solution to IP * * Given a feasible solution to IP (3)-(6) this routine builds the * corresponding solution to TSP, which is a tour specified by the list * of node numbers tour[1] -> ... -> tour[nn] -> tour[1] in the order * the nodes are to be visited */ void build_tour(void) { int i, j, k, kk, *beg, *end; /* solution to MIP should be feasible */ switch (glp_mip_status(P)) { case GLP_FEAS: case GLP_OPT: break; default: xassert(P != P); } /* build the list of edges included in the tour */ beg = xalloc(1+n, sizeof(int)); end = xalloc(1+n, sizeof(int)); k = 0; for (i = 1; i <= n; i++) { for (j = i+1; j <= n; j++) { double x; x = glp_mip_col_val(P, loc(i,j)); xassert(x == 0 || x == 1); if (x) { k++; xassert(k <= n); beg[k] = i, end[k] = j; } } } xassert(k == n); /* reorder edges in the list as they follow in the tour */ for (k = 1; k <= n; k++) { /* find k-th edge of the tour */ j = (k == 1 ? 1 : end[k-1]); for (kk = k; kk <= n; kk++) { if (beg[kk] == j) break; if (end[kk] == j) { end[kk] = beg[kk], beg[kk] = j; break; } } xassert(kk <= n); /* put the edge to k-th position in the list */ i = beg[k], beg[k] = beg[kk], beg[kk] = i; j = end[k], end[k] = end[kk], end[kk] = j; } /* build the tour starting from node 1 */ xassert(beg[1] == 1); for (k = 1; k <= n; k++) { if (k > 1) xassert(end[k-1] == beg[k]); tour[k] = beg[k]; } xassert(end[n] == 1); xfree(beg); xfree(end); return; } /*********************************************************************** * tour_length - calculate tour length * * This routine calculates the length of the specified tour, which is * the sum of corresponding edge lengths. */ int tour_length(const int tour[/*1+n*/]) { int i, j, sum; sum = 0; for (i = 1; i <= n; i++) { j = (i < n ? i+1 : 1); sum += c[loc(tour[i], tour[j])]; } return sum; } /*********************************************************************** * write_tour - write tour to text file in TSPLIB format * * This routine writes the specified tour to a text file in TSPLIB * format. */ void write_tour(const char *fname, const int tour[/*1+n*/]) { FILE *fp; int i; xprintf("Writing TSP solution to '%s'...\n", fname); fp = fopen(fname, "w"); if (fp == NULL) { xprintf("Unable to create '%s' - %s\n", fname, strerror(errno)); return; } fprintf(fp, "NAME : %s\n", fname); fprintf(fp, "COMMENT : Tour length is %d\n", tour_length(tour)); fprintf(fp, "TYPE : TOUR\n"); fprintf(fp, "DIMENSION : %d\n", n); fprintf(fp, "TOUR_SECTION\n"); for (i = 1; i <= n; i++) fprintf(fp, "%d\n", tour[i]); fprintf(fp, "-1\n"); fprintf(fp, "EOF\n"); fclose(fp); return; } /*********************************************************************** * gen_subt_row - generate violated subtour elimination constraint * * This routine is called from the MIP solver to generate a violated * subtour elimination constraint (5). * * Constraints of this class has the form: * * sum x[i,j] >= 2, i in W, j in V \ W, * * for all W, where W is a proper nonempty subset of V, V is the set of * nodes of the given graph. * * In order to find a violated constraint of this class this routine * finds a min cut in a capacitated network, which has the same sets of * nodes and edges as the original graph, and where capacities of edges * are values of variables x[i,j] in a basic solution to LP relaxation * of the current subproblem. */ void gen_subt(glp_tree *T) { int i, j, ne, nz, *beg, *end, *cap, *cut, *ind; double sum, *val; /* MIP preprocessor should not be used */ xassert(glp_ios_get_prob(T) == P); /* if some variable x[i,j] is zero in basic solution, then the * capacity of corresponding edge in the associated network is * zero, so we may not include such edge in the network */ /* count number of edges having non-zero capacity */ ne = 0; for (i = 1; i <= n; i++) { for (j = i+1; j <= n; j++) { if (glp_get_col_prim(P, loc(i,j)) >= .001) ne++; } } /* build the capacitated network */ beg = xalloc(1+ne, sizeof(int)); end = xalloc(1+ne, sizeof(int)); cap = xalloc(1+ne, sizeof(int)); nz = 0; for (i = 1; i <= n; i++) { for (j = i+1; j <= n; j++) { if (glp_get_col_prim(P, loc(i,j)) >= .001) { nz++; xassert(nz <= ne); beg[nz] = i, end[nz] = j; /* scale all edge capacities to make them integral */ cap[nz] = ceil(1000 * glp_get_col_prim(P, loc(i,j))); } } } xassert(nz == ne); /* find minimal cut in the capacitated network */ cut = xalloc(1+n, sizeof(int)); min_cut(n, ne, beg, end, cap, cut); /* determine the number of non-zero coefficients in the subtour * elimination constraint and calculate its left-hand side which * is the (unscaled) capacity of corresponding min cut */ ne = 0, sum = 0; for (i = 1; i <= n; i++) { for (j = i+1; j <= n; j++) { if (cut[i] && !cut[j] || !cut[i] && cut[j]) { ne++; sum += glp_get_col_prim(P, loc(i,j)); } } } /* if the (unscaled) capacity of min cut is less than 2, the * corresponding subtour elimination constraint is violated */ if (sum <= 1.999) { /* build the list of non-zero coefficients */ ind = xalloc(1+ne, sizeof(int)); val = xalloc(1+ne, sizeof(double)); nz = 0; for (i = 1; i <= n; i++) { for (j = i+1; j <= n; j++) { if (cut[i] && !cut[j] || !cut[i] && cut[j]) { nz++; xassert(nz <= ne); ind[nz] = loc(i,j); val[nz] = 1; } } } xassert(nz == ne); /* add violated tour elimination constraint to the current * subproblem */ i = glp_add_rows(P, 1); glp_set_row_bnds(P, i, GLP_LO, 2, 0); glp_set_mat_row(P, i, nz, ind, val); xfree(ind); xfree(val); } /* free working arrays */ xfree(beg); xfree(end); xfree(cap); xfree(cut); return; } /*********************************************************************** * cb_func - application callback routine * * This routine is called from the MIP solver at various points of * the branch-and-cut algorithm. */ void cb_func(glp_tree *T, void *info) { xassert(info == info); switch (glp_ios_reason(T)) { case GLP_IROWGEN: /* generate one violated subtour elimination constraint */ gen_subt(T); break; } return; } /*********************************************************************** * main - TSP solver main program * * This main program parses command-line arguments, reads specified TSP * instance from a text file, and calls the MIP solver to solve it. */ int main(int argc, char *argv[]) { int j; char *in_file = NULL, *out_file = NULL; time_t start; glp_iocp iocp; /* parse command-line arguments */ # define p(str) (strcmp(argv[j], str) == 0) for (j = 1; j < argc; j++) { if (p("--output") || p("-o")) { j++; if (j == argc || argv[j][0] == '\0' || argv[j][0] == '-') { xprintf("No solution output file specified\n"); exit(EXIT_FAILURE); } if (out_file != NULL) { xprintf("Only one solution output file allowed\n"); exit(EXIT_FAILURE); } out_file = argv[j]; } else if (p("--help") || p("-h")) { xprintf("Usage: %s [options...] tsp-file\n", argv[0]); xprintf("\n"); xprintf("Options:\n"); xprintf(" -o filename, --output filename\n"); xprintf(" write solution to filename\n") ; xprintf(" -h, --help display this help information" " and exit\n"); exit(EXIT_SUCCESS); } else if (argv[j][0] == '-' || (argv[j][0] == '-' && argv[j][1] == '-')) { xprintf("Invalid option '%s'; try %s --help\n", argv[j], argv[0]); exit(EXIT_FAILURE); } else { if (in_file != NULL) { xprintf("Only one input file allowed\n"); exit(EXIT_FAILURE); } in_file = argv[j]; } } if (in_file == NULL) { xprintf("No input file specified; try %s --help\n", argv[0]); exit(EXIT_FAILURE); } # undef p /* display program banner */ xprintf("TSP Solver for GLPK %s\n", glp_version()); /* remove output solution file specified in command-line */ if (out_file != NULL) remove(out_file); /* read TSP instance from input data file */ read_data(in_file); /* build initial IP problem */ start = time(NULL); build_prob(); tour = xalloc(1+n, sizeof(int)); /* solve LP relaxation of initial IP problem */ xprintf("Solving initial LP relaxation...\n"); xassert(glp_simplex(P, NULL) == 0); xassert(glp_get_status(P) == GLP_OPT); /* solve IP problem with "lazy" constraints */ glp_init_iocp(&iocp); iocp.br_tech = GLP_BR_MFV; /* most fractional variable */ iocp.bt_tech = GLP_BT_BLB; /* best local bound */ iocp.sr_heur = GLP_OFF; /* disable simple rounding heuristic */ iocp.gmi_cuts = GLP_ON; /* enable Gomory cuts */ iocp.cb_func = cb_func; glp_intopt(P, &iocp); build_tour(); /* display some statistics */ xprintf("Time used: %.1f secs\n", difftime(time(NULL), start)); { size_t tpeak; glp_mem_usage(NULL, NULL, NULL, &tpeak); xprintf("Memory used: %.1f Mb (%.0f bytes)\n", (double)tpeak / 1048576.0, (double)tpeak); } /* write solution to output file, if required */ if (out_file != NULL) write_tour(out_file, tour); /* deallocate working objects */ xfree(c); xfree(tour); glp_delete_prob(P); /* check that no memory blocks are still allocated */ { int count; size_t total; glp_mem_usage(&count, NULL, &total, NULL); if (count != 0) xerror("Error: %d memory block(s) were lost\n", count); xassert(total == 0); } return 0; } /* eof */ glpk-5.0/examples/tsp/maxflow.c0000644000062000006210000001365613766346220015762 0ustar maomkpasswd/* maxflow.c */ /* Written by Andrew Makhorin , October 2015. */ #include #include #include "maxflow.h" #include "misc.h" /*********************************************************************** * NAME * * max_flow - find max flow in undirected capacitated network * * SYNOPSIS * * #include "maxflow.h" * int max_flow(int nn, int ne, const int beg[], const int end[], * const int cap[], int s, int t, int x[]); * * DESCRIPTION * * This routine finds max flow in a given undirected network. * * The undirected capacitated network is specified by the parameters * nn, ne, beg, end, and cap. The parameter nn specifies the number of * vertices (nodes), nn >= 2, and the parameter ne specifies the number * of edges, ne >= 0. The network edges are specified by triplets * (beg[k], end[k], cap[k]) for k = 1, ..., ne, where beg[k] < end[k] * are numbers of the first and second nodes of k-th edge, and * cap[k] > 0 is a capacity of k-th edge. Loops and multiple edges are * not allowed. * * The parameter s is the number of a source node, and the parameter t * is the number of a sink node, s != t. * * On exit the routine computes elementary flows thru edges and stores * their values to locations x[1], ..., x[ne]. Positive value of x[k] * means that the elementary flow goes from node beg[k] to node end[k], * and negative value means that the flow goes in opposite direction. * * RETURNS * * The routine returns the total maximum flow through the network. */ int max_flow(int nn, int ne, const int beg[/*1+ne*/], const int end[/*1+ne*/], const int cap[/*1+ne*/], int s, int t, int x[/*1+ne*/]) { int k; /* sanity checks */ xassert(nn >= 2); xassert(ne >= 0); xassert(1 <= s && s <= nn); xassert(1 <= t && t <= nn); xassert(s != t); for (k = 1; k <= ne; k++) { xassert(1 <= beg[k] && beg[k] < end[k] && end[k] <= nn); xassert(cap[k] > 0); } /* find max flow */ return max_flow_lp(nn, ne, beg, end, cap, s, t, x); } /*********************************************************************** * NAME * * max_flow_lp - find max flow with simplex method * * SYNOPSIS * * #include "maxflow.h" * int max_flow_lp(int nn, int ne, const int beg[], const int end[], * const int cap[], int s, int t, int x[]); * * DESCRIPTION * * This routine finds max flow in a given undirected network with the * simplex method. * * Parameters of this routine have the same meaning as for the routine * max_flow (see above). * * RETURNS * * The routine returns the total maximum flow through the network. */ int max_flow_lp(int nn, int ne, const int beg[/*1+ne*/], const int end[/*1+ne*/], const int cap[/*1+ne*/], int s, int t, int x[/*1+ne*/]) { glp_prob *lp; glp_smcp smcp; int i, k, nz, flow, *rn, *cn; double temp, *aa; /* create LP problem instance */ lp = glp_create_prob(); /* create LP rows; i-th row is the conservation condition of the * flow at i-th node, i = 1, ..., nn */ glp_add_rows(lp, nn); for (i = 1; i <= nn; i++) glp_set_row_bnds(lp, i, GLP_FX, 0.0, 0.0); /* create LP columns; k-th column is the elementary flow thru * k-th edge, k = 1, ..., ne; the last column with the number * ne+1 is the total flow through the network, which goes along * a dummy feedback edge from the sink to the source */ glp_add_cols(lp, ne+1); for (k = 1; k <= ne; k++) { xassert(cap[k] > 0); glp_set_col_bnds(lp, k, GLP_DB, -cap[k], +cap[k]); } glp_set_col_bnds(lp, ne+1, GLP_FR, 0.0, 0.0); /* build the constraint matrix; structurally this matrix is the * incidence matrix of the network, so each its column (including * the last column for the dummy edge) has exactly two non-zero * entries */ rn = xalloc(1+2*(ne+1), sizeof(int)); cn = xalloc(1+2*(ne+1), sizeof(int)); aa = xalloc(1+2*(ne+1), sizeof(double)); nz = 0; for (k = 1; k <= ne; k++) { /* x[k] > 0 means the elementary flow thru k-th edge goes from * node beg[k] to node end[k] */ nz++, rn[nz] = beg[k], cn[nz] = k, aa[nz] = -1.0; nz++, rn[nz] = end[k], cn[nz] = k, aa[nz] = +1.0; } /* total flow thru the network goes from the sink to the source * along the dummy feedback edge */ nz++, rn[nz] = t, cn[nz] = ne+1, aa[nz] = -1.0; nz++, rn[nz] = s, cn[nz] = ne+1, aa[nz] = +1.0; /* check the number of non-zero entries */ xassert(nz == 2*(ne+1)); /* load the constraint matrix into the LP problem object */ glp_load_matrix(lp, nz, rn, cn, aa); xfree(rn); xfree(cn); xfree(aa); /* objective function is the total flow through the network to * be maximized */ glp_set_obj_dir(lp, GLP_MAX); glp_set_obj_coef(lp, ne + 1, 1.0); /* solve LP instance with the (primal) simplex method */ glp_term_out(0); glp_adv_basis(lp, 0); glp_term_out(1); glp_init_smcp(&smcp); smcp.msg_lev = GLP_MSG_ON; smcp.out_dly = 5000; xassert(glp_simplex(lp, &smcp) == 0); xassert(glp_get_status(lp) == GLP_OPT); /* obtain optimal elementary flows thru edges of the network */ /* (note that the constraint matrix is unimodular and the data * are integral, so all elementary flows in basic solution should * also be integral) */ for (k = 1; k <= ne; k++) { temp = glp_get_col_prim(lp, k); x[k] = (int)floor(temp + .5); xassert(fabs(x[k] - temp) <= 1e-6); } /* obtain the maximum flow thru the original network which is the * flow thru the dummy feedback edge */ temp = glp_get_col_prim(lp, ne+1); flow = (int)floor(temp + .5); xassert(fabs(flow - temp) <= 1e-6); /* delete LP problem instance */ glp_delete_prob(lp); /* return to the calling program */ return flow; } /* eof */ glpk-5.0/examples/tsp/maxflow.h0000644000062000006210000000102213766346220015747 0ustar maomkpasswd/* maxflow.h */ /* Written by Andrew Makhorin , October 2015. */ #ifndef MAXFLOW_H #define MAXFLOW_H int max_flow(int nn, int ne, const int beg[/*1+ne*/], const int end[/*1+ne*/], const int cap[/*1+ne*/], int s, int t, int x[/*1+ne*/]); /* find max flow in undirected capacitated network */ int max_flow_lp(int nn, int ne, const int beg[/*1+ne*/], const int end[/*1+ne*/], const int cap[/*1+ne*/], int s, int t, int x[/*1+ne*/]); /* find max flow with simplex method */ #endif /* eof */ glpk-5.0/examples/tsp/mincut.c0000644000062000006210000003577713766346220015614 0ustar maomkpasswd/* mincut.c */ /* Written by Andrew Makhorin , October 2015. */ #include #include "maxflow.h" #include "mincut.h" #include "misc.h" /*********************************************************************** * NAME * * min_cut - find min cut in undirected capacitated network * * SYNOPSIS * * #include "mincut.h" * int min_cut(int nn, int ne, const int beg[], const int end[], * const cap[], int cut[]); * * DESCRIPTION * * This routine finds min cut in a given undirected network. * * The undirected capacitated network is specified by the parameters * nn, ne, beg, end, and cap. The parameter nn specifies the number of * vertices (nodes), nn >= 2, and the parameter ne specifies the number * of edges, ne >= 0. The network edges are specified by triplets * (beg[k], end[k], cap[k]) for k = 1, ..., ne, where beg[k] < end[k] * are numbers of the first and second nodes of k-th edge, and * cap[k] > 0 is a capacity of k-th edge. Loops and multiple edges are * not allowed. * * Let V be the set of nodes of the network and let W be an arbitrary * non-empty proper subset of V. A cut associated with the subset W is * a subset of all the edges, one node of which belongs to W and other * node belongs to V \ W. The capacity of a cut (W, V \ W) is the sum * of the capacities of all the edges, which belong to the cut. Minimal * cut is a cut, whose capacity is minimal. * * On exit the routine stores flags of nodes v[i], i = 1, ..., nn, to * locations cut[i], where cut[i] = 1 means that v[i] belongs to W and * cut[i] = 0 means that v[i] belongs to V \ W, where W corresponds to * the minimal cut found. * * RETURNS * * The routine returns the capacity of the min cut found. */ int min_cut(int nn, int ne, const int beg[/*1+ne*/], const int end[/*1+ne*/], const cap[/*1+ne*/], int cut[/*1+nn*/]) { int k; /* sanity checks */ xassert(nn >= 2); xassert(ne >= 0); for (k = 1; k <= ne; k++) { xassert(1 <= beg[k] && beg[k] < end[k] && end[k] <= nn); xassert(cap[k] > 0); } /* find min cut */ return min_cut_sw(nn, ne, beg, end, cap, cut); } /*********************************************************************** * NAME * * min_st_cut - find min (s,t)-cut for known max flow * * SYNOPSIS * * #include "mincut.h" * * DESCRIPTION * * This routine finds min (s,t)-cut in a given undirected network that * corresponds to a known max flow from s to t in the network. * * Parameters nn, ne, beg, end, and cap specify the network in the same * way as for the routine min_cut (see above). * * Parameters s and t specify, resp., the number of the source node * and the number of the sink node, s != t, for which the min (s,t)-cut * has to be found. * * Parameter x specifies the known max flow from s to t in the network, * where locations x[1], ..., x[ne] contains elementary flow thru edges * of the network (positive value of x[k] means that the elementary * flow goes from node beg[k] to node end[k], and negative value means * that the flow goes in opposite direction). * * This routine splits the set of nodes V of the network into two * non-empty subsets V(s) and V(t) = V \ V(s), where the source node s * belongs to V(s), the sink node t belongs to V(t), and all edges, one * node of which belongs to V(s) and other one belongs to V(t), are * saturated (that is, x[k] = +cap[k] or x[k] = -cap[k]). * * On exit the routine stores flags of the nodes v[i], i = 1, ..., nn, * to locations cut[i], where cut[i] = 1 means that v[i] belongs to V(s) * and cut[i] = 0 means that v[i] belongs to V(t) = V \ V(s). * * RETURNS * * The routine returns the capacity of min (s,t)-cut, which is the sum * of the capacities of all the edges, which belong to the cut. (Note * that due to theorem by Ford and Fulkerson this value is always equal * to corresponding max flow.) * * ALGORITHM * * To determine the set V(s) the routine simply finds all nodes, which * can be reached from the source node s via non-saturated edges. The * set V(t) is determined as the complement V \ V(s). */ int min_st_cut(int nn, int ne, const int beg[/*1+ne*/], const int end[/*1+ne*/], const int cap[/*1+ne*/], int s, int t, const int x[/*1+ne*/], int cut[/*1+nn*/]) { int i, j, k, p, q, temp, *head1, *next1, *head2, *next2, *list; /* head1[i] points to the first edge with beg[k] = i * next1[k] points to the next edge with the same beg[k] * head2[i] points to the first edge with end[k] = i * next2[k] points to the next edge with the same end[k] */ head1 = xalloc(1+nn, sizeof(int)); head2 = xalloc(1+nn, sizeof(int)); next1 = xalloc(1+ne, sizeof(int)); next2 = xalloc(1+ne, sizeof(int)); for (i = 1; i <= nn; i++) head1[i] = head2[i] = 0; for (k = 1; k <= ne; k++) { i = beg[k], next1[k] = head1[i], head1[i] = k; j = end[k], next2[k] = head2[j], head2[j] = k; } /* on constructing the set V(s) list[1], ..., list[p-1] contain * nodes, which can be reached from source node and have been * visited, and list[p], ..., list[q] contain nodes, which can be * reached from source node but havn't been visited yet */ list = xalloc(1+nn, sizeof(int)); for (i = 1; i <= nn; i++) cut[i] = 0; p = q = 1, list[1] = s, cut[s] = 1; while (p <= q) { /* pick next node, which is reachable from the source node and * has not visited yet, and visit it */ i = list[p++]; /* walk through edges with beg[k] = i */ for (k = head1[i]; k != 0; k = next1[k]) { j = end[k]; xassert(beg[k] == i); /* from v[i] we can reach v[j], if the elementary flow from * v[i] to v[j] is non-saturated */ if (cut[j] == 0 && x[k] < +cap[k]) list[++q] = j, cut[j] = 1; } /* walk through edges with end[k] = i */ for (k = head2[i]; k != 0; k = next2[k]) { j = beg[k]; xassert(end[k] == i); /* from v[i] we can reach v[j], if the elementary flow from * v[i] to v[j] is non-saturated */ if (cut[j] == 0 && x[k] > -cap[k]) list[++q] = j, cut[j] = 1; } } /* sink cannot belong to V(s) */ xassert(!cut[t]); /* free working arrays */ xfree(head1); xfree(head2); xfree(next1); xfree(next2); xfree(list); /* compute capacity of the minimal (s,t)-cut found */ temp = 0; for (k = 1; k <= ne; k++) { i = beg[k], j = end[k]; if (cut[i] && !cut[j] || !cut[i] && cut[j]) temp += cap[k]; } /* return to the calling program */ return temp; } /*********************************************************************** * NAME * * min_cut_sw - find min cut with Stoer and Wagner algorithm * * SYNOPSIS * * #include "mincut.h" * int min_cut_sw(int nn, int ne, const int beg[], const int end[], * const cap[], int cut[]); * * DESCRIPTION * * This routine find min cut in a given undirected network with the * algorithm proposed by Stoer and Wagner (see references below). * * Parameters of this routine have the same meaning as for the routine * min_cut (see above). * * RETURNS * * The routine returns the capacity of the min cut found. * * ALGORITHM * * The basic idea of Stoer&Wagner algorithm is the following. Let G be * a capacitated network, and G(s,t) be a network, in which the nodes s * and t are merged into one new node, loops are deleted, but multiple * edges are retained. It is obvious that a minimum cut in G is the * minimum of two quantities: the minimum cut in G(s,t) and a minimum * cut that separates s and t. This allows to find a minimum cut in the * original network solving at most nn max flow problems. * * REFERENCES * * M. Stoer, F. Wagner. A Simple Min Cut Algorithm. Algorithms, ESA'94 * LNCS 855 (1994), pp. 141-47. * * J. Cheriyan, R. Ravi. Approximation Algorithms for Network Problems. * Univ. of Waterloo (1998), p. 147. */ int min_cut_sw(int nn, int ne, const int beg[/*1+ne*/], const int end[/*1+ne*/], const cap[/*1+ne*/], int cut[/*1+nn*/]) { int i, j, k, min_cut, flow, temp, *head1, *next1, *head2, *next2; int I, J, K, S, T, DEG, NV, NE, *HEAD, *NEXT, *NUMB, *BEG, *END, *CAP, *X, *ADJ, *SUM, *CUT; /* head1[i] points to the first edge with beg[k] = i * next1[k] points to the next edge with the same beg[k] * head2[i] points to the first edge with end[k] = i * next2[k] points to the next edge with the same end[k] */ head1 = xalloc(1+nn, sizeof(int)); head2 = xalloc(1+nn, sizeof(int)); next1 = xalloc(1+ne, sizeof(int)); next2 = xalloc(1+ne, sizeof(int)); for (i = 1; i <= nn; i++) head1[i] = head2[i] = 0; for (k = 1; k <= ne; k++) { i = beg[k], next1[k] = head1[i], head1[i] = k; j = end[k], next2[k] = head2[j], head2[j] = k; } /* an auxiliary network used in the algorithm is resulted from * the original network by merging some nodes into one supernode; * all variables and arrays related to this auxiliary network are * denoted in CAPS */ /* HEAD[I] points to the first node of the original network that * belongs to the I-th supernode * NEXT[i] points to the next node of the original network that * belongs to the same supernode as the i-th node * NUMB[i] is a supernode, which the i-th node belongs to */ /* initially the auxiliary network is equivalent to the original * network, i.e. each supernode consists of one node */ NV = nn; HEAD = xalloc(1+nn, sizeof(int)); NEXT = xalloc(1+nn, sizeof(int)); NUMB = xalloc(1+nn, sizeof(int)); for (i = 1; i <= nn; i++) HEAD[i] = i, NEXT[i] = 0, NUMB[i] = i; /* number of edges in the auxiliary network is never greater than * in the original one */ BEG = xalloc(1+ne, sizeof(int)); END = xalloc(1+ne, sizeof(int)); CAP = xalloc(1+ne, sizeof(int)); X = xalloc(1+ne, sizeof(int)); /* allocate some auxiliary arrays */ ADJ = xalloc(1+nn, sizeof(int)); SUM = xalloc(1+nn, sizeof(int)); CUT = xalloc(1+nn, sizeof(int)); /* currently no min cut is found so far */ min_cut = INT_MAX; /* main loop starts here */ while (NV > 1) { /* build the set of edges of the auxiliary network */ NE = 0; /* multiple edges are not allowed in the max flow algorithm, * so we can replace each multiple edge, which is the result * of merging nodes into supernodes, by a single edge, whose * capacity is the sum of capacities of particular edges; * these summary capacities will be stored in the array SUM */ for (I = 1; I <= NV; I++) SUM[I] = 0.0; for (I = 1; I <= NV; I++) { /* DEG is number of single edges, which connects I-th * supernode and some J-th supernode, where I < J */ DEG = 0; /* walk thru nodes that belong to I-th supernode */ for (i = HEAD[I]; i != 0; i = NEXT[i]) { /* i-th node belongs to I-th supernode */ /* walk through edges with beg[k] = i */ for (k = head1[i]; k != 0; k = next1[k]) { j = end[k]; /* j-th node belongs to J-th supernode */ J = NUMB[j]; /* ignore loops and edges with I > J */ if (I >= J) continue; /* add an edge that connects I-th and J-th supernodes * (if not added yet) */ if (SUM[J] == 0.0) ADJ[++DEG] = J; /* sum up the capacity of the original edge */ xassert(cap[k] > 0.0); SUM[J] += cap[k]; } /* walk through edges with end[k] = i */ for (k = head2[i]; k != 0; k = next2[k]) { j = beg[k]; /* j-th node belongs to J-th supernode */ J = NUMB[j]; /* ignore loops and edges with I > J */ if (I >= J) continue; /* add an edge that connects I-th and J-th supernodes * (if not added yet) */ if (SUM[J] == 0.0) ADJ[++DEG] = J; /* sum up the capacity of the original edge */ xassert(cap[k] > 0.0); SUM[J] += cap[k]; } } /* add single edges connecting I-th supernode with other * supernodes to the auxiliary network; restore the array * SUM for subsequent use */ for (K = 1; K <= DEG; K++) { NE++; xassert(NE <= ne); J = ADJ[K]; BEG[NE] = I, END[NE] = J, CAP[NE] = SUM[J]; SUM[J] = 0.0; } } /* choose two arbitrary supernodes of the auxiliary network, * one of which is the source and other is the sink */ S = 1, T = NV; /* determine max flow from S to T */ flow = max_flow(NV, NE, BEG, END, CAP, S, T, X); /* if the min cut that separates supernodes S and T is less * than the currently known, remember it */ if (min_cut > flow) { min_cut = flow; /* find min (s,t)-cut in the auxiliary network */ temp = min_st_cut(NV, NE, BEG, END, CAP, S, T, X, CUT); /* (Ford and Fulkerson insist on this) */ xassert(flow == temp); /* build corresponding min cut in the original network */ for (i = 1; i <= nn; i++) cut[i] = CUT[NUMB[i]]; /* if the min cut capacity is zero (i.e. the network has * unconnected components), the search can be prematurely * terminated */ if (min_cut == 0) break; } /* now merge all nodes of the original network, which belong * to the supernodes S and T, into one new supernode; this is * attained by carrying all nodes from T to S (for the sake of * convenience T should be the last supernode) */ xassert(T == NV); /* assign new references to nodes from T */ for (i = HEAD[T]; i != 0; i = NEXT[i]) NUMB[i] = S; /* find last entry in the node list of S */ i = HEAD[S]; xassert(i != 0); while (NEXT[i] != 0) i = NEXT[i]; /* and attach to it the node list of T */ NEXT[i] = HEAD[T]; /* decrease number of nodes in the auxiliary network */ NV--; } /* free working arrays */ xfree(HEAD); xfree(NEXT); xfree(NUMB); xfree(BEG); xfree(END); xfree(CAP); xfree(X); xfree(ADJ); xfree(SUM); xfree(CUT); xfree(head1); xfree(head2); xfree(next1); xfree(next2); /* return to the calling program */ return min_cut; } /* eof */ glpk-5.0/examples/tsp/mincut.h0000644000062000006210000000130713766346220015577 0ustar maomkpasswd/* mincut.c */ /* Written by Andrew Makhorin , October 2015. */ #ifndef MINCUT_H #define MINCUT_H int min_cut(int nn, int ne, const int beg[/*1+ne*/], const int end[/*1+ne*/], const cap[/*1+ne*/], int cut[/*1+nn*/]); /* find min cut in undirected capacitated network */ int min_st_cut(int nn, int ne, const int beg[/*1+ne*/], const int end[/*1+ne*/], const int cap[/*1+ne*/], int s, int t, const int x[/*1+ne*/], int cut[/*1+nn*/]); /* find min (s,t)-cut for known max flow */ int min_cut_sw(int nn, int ne, const int beg[/*1+ne*/], const int end[/*1+ne*/], const cap[/*1+ne*/], int cut[/*1+nn*/]); /* find min cut with Stoer and Wagner algorithm */ #endif /* eof */ glpk-5.0/examples/tsp/misc.c0000644000062000006210000001004413766346220015224 0ustar maomkpasswd/* misc.c */ /* Written by Andrew Makhorin , October 2015. */ #include #include #include #include #include "misc.h" /*********************************************************************** * NAME * * str2int - convert character string to value of int type * * SYNOPSIS * * #include "misc.h" * int str2int(const char *str, int *val); * * DESCRIPTION * * The routine str2int converts the character string str to a value of * integer type and stores the value into location, which the parameter * val points to (in the case of error content of this location is not * changed). * * RETURNS * * The routine returns one of the following error codes: * * 0 - no error; * 1 - value out of range; * 2 - character string is syntactically incorrect. */ int str2int(const char *str, int *val_) { int d, k, s, val = 0; /* scan optional sign */ if (str[0] == '+') s = +1, k = 1; else if (str[0] == '-') s = -1, k = 1; else s = +1, k = 0; /* check for the first digit */ if (!isdigit((unsigned char)str[k])) return 2; /* scan digits */ while (isdigit((unsigned char)str[k])) { d = str[k++] - '0'; if (s > 0) { if (val > INT_MAX / 10) return 1; val *= 10; if (val > INT_MAX - d) return 1; val += d; } else /* s < 0 */ { if (val < INT_MIN / 10) return 1; val *= 10; if (val < INT_MIN + d) return 1; val -= d; } } /* check for terminator */ if (str[k] != '\0') return 2; /* conversion has been done */ *val_ = val; return 0; } /*********************************************************************** * NAME * * str2num - convert character string to value of double type * * SYNOPSIS * * #include "misc.h" * int str2num(const char *str, double *val); * * DESCRIPTION * * The routine str2num converts the character string str to a value of * double type and stores the value into location, which the parameter * val points to (in the case of error content of this location is not * changed). * * RETURNS * * The routine returns one of the following error codes: * * 0 - no error; * 1 - value out of range; * 2 - character string is syntactically incorrect. */ int str2num(const char *str, double *val_) { int k; double val; /* scan optional sign */ k = (str[0] == '+' || str[0] == '-' ? 1 : 0); /* check for decimal point */ if (str[k] == '.') { k++; /* a digit should follow it */ if (!isdigit((unsigned char)str[k])) return 2; k++; goto frac; } /* integer part should start with a digit */ if (!isdigit((unsigned char)str[k])) return 2; /* scan integer part */ while (isdigit((unsigned char)str[k])) k++; /* check for decimal point */ if (str[k] == '.') k++; frac: /* scan optional fraction part */ while (isdigit((unsigned char)str[k])) k++; /* check for decimal exponent */ if (str[k] == 'E' || str[k] == 'e') { k++; /* scan optional sign */ if (str[k] == '+' || str[k] == '-') k++; /* a digit should follow E, E+ or E- */ if (!isdigit((unsigned char)str[k])) return 2; } /* scan optional exponent part */ while (isdigit((unsigned char)str[k])) k++; /* check for terminator */ if (str[k] != '\0') return 2; /* perform conversion */ { char *endptr; val = strtod(str, &endptr); if (*endptr != '\0') return 2; } /* check for overflow */ if (!(-DBL_MAX <= val && val <= +DBL_MAX)) return 1; /* check for underflow */ if (-DBL_MIN < val && val < +DBL_MIN) val = 0.0; /* conversion has been done */ *val_ = val; return 0; } /* eof */ glpk-5.0/examples/tsp/misc.h0000644000062000006210000000072513766346220015236 0ustar maomkpasswd/* misc.h */ /* Written by Andrew Makhorin , October 2015. */ #ifndef MISC_H #define MISC_H #include #define xprintf glp_printf #define xerror glp_error #define xassert glp_assert #define xalloc glp_alloc #define xfree glp_free int str2int(const char *str, int *val); /* convert character string to value of int type */ int str2num(const char *str, double *val); /* convert character string to value of double type */ #endif /* eof */ glpk-5.0/examples/tsp/moscow.tsp0000644000062000006210000002416513766346220016175 0ustar maomkpasswdNAME: MOSCOW TYPE: TSP COMMENT: 68 cities in Moscow region (Andrew Makhorin ) DIMENSION: 68 EDGE_WEIGHT_TYPE: EXPLICIT EDGE_WEIGHT_FORMAT: LOWER_DIAG_ROW EDGE_WEIGHT_SECTION 0 80 0 99 66 0 73 153 156 0 118 156 205 116 0 136 103 37 190 242 0 134 128 180 141 90 217 0 72 75 127 126 81 164 86 0 131 94 146 184 133 183 67 91 0 75 38 90 136 126 127 94 45 56 0 67 52 46 124 169 83 165 88 132 76 0 134 66 69 207 219 68 189 138 136 101 106 0 179 142 194 204 153 231 87 139 52 104 180 188 0 145 98 63 216 240 26 212 159 178 122 109 53 226 0 83 7 69 156 159 106 131 78 97 41 55 60 145 95 0 85 38 68 158 180 105 152 99 118 62 57 74 166 100 41 0 188 163 97 222 294 77 277 223 243 187 135 145 291 93 166 165 0 38 101 125 92 80 162 96 34 101 71 93 164 149 176 104 116 214 0 88 66 118 142 97 155 62 40 67 36 103 129 115 150 69 90 215 50 0 113 50 102 174 164 139 136 83 92 46 88 94 140 134 53 74 199 109 74 0 67 94 146 113 62 183 81 19 86 64 107 157 134 178 97 118 242 29 35 102 0 133 132 96 167 239 91 245 168 212 156 80 159 260 117 135 137 55 159 183 168 187 0 51 64 54 108 157 91 159 82 139 83 25 118 187 117 67 69 143 77 97 100 101 88 0 122 116 168 129 78 205 12 74 55 82 153 177 75 200 119 140 265 84 50 124 69 233 147 0 148 115 49 202 254 29 229 176 195 139 95 97 243 45 118 117 48 174 167 151 195 83 103 217 0 95 32 84 156 146 121 118 65 84 28 70 95 132 116 35 56 181 91 56 18 84 150 82 106 133 0 133 70 122 194 184 159 156 103 112 66 108 99 160 148 73 94 219 129 94 25 122 188 120 144 171 38 0 57 58 110 118 98 147 103 17 84 28 71 121 132 142 61 82 206 43 42 66 36 151 65 91 159 48 86 0 164 101 142 225 188 167 122 134 55 97 139 109 107 152 104 125 239 150 116 67 135 219 151 110 191 69 87 117 0 145 93 78 218 240 41 212 159 153 122 117 27 205 26 87 100 118 176 150 121 178 132 129 200 70 116 126 142 126 0 142 74 77 215 227 60 197 146 134 109 114 8 186 45 68 82 137 172 137 102 165 151 126 185 89 103 107 129 107 19 0 85 48 100 146 119 137 84 55 63 10 86 111 111 132 51 72 197 72 38 56 57 166 93 72 149 38 76 38 107 132 119 0 106 26 73 179 182 110 154 101 120 64 78 48 168 97 30 62 170 127 92 76 120 158 90 142 122 58 84 84 102 75 56 74 0 171 138 72 225 277 52 252 199 218 162 118 120 266 68 141 140 25 197 190 174 218 80 126 240 23 156 194 182 214 93 112 172 145 0 65 18 48 138 160 85 132 79 98 42 37 69 146 80 21 20 145 96 70 54 98 117 49 120 97 36 74 62 105 80 77 52 44 120 0 90 163 173 17 99 207 124 111 167 138 141 217 187 228 166 168 239 77 127 176 96 184 125 112 219 158 196 120 222 228 225 148 189 242 148 0 47 22 67 116 121 104 106 40 80 24 44 85 128 99 25 39 164 66 44 46 59 124 46 94 116 28 66 23 97 99 93 34 48 139 19 118 0 89 26 78 150 140 115 112 59 78 22 64 89 126 110 29 50 175 85 50 24 78 144 76 100 127 6 44 42 75 110 97 32 52 150 30 152 22 0 31 111 118 42 134 155 153 91 157 101 86 165 205 176 114 116 207 57 107 139 86 152 70 141 167 121 159 83 190 176 173 111 137 190 96 59 78 115 0 115 35 56 188 191 93 158 110 111 73 87 31 159 80 42 45 153 136 101 63 129 152 99 146 105 65 68 93 86 58 39 83 17 128 53 198 57 61 146 0 37 70 103 91 121 140 121 44 101 45 62 124 149 135 73 75 197 41 59 83 63 142 56 109 152 65 103 27 134 135 132 55 96 175 55 93 25 59 56 105 0 143 142 106 177 249 101 255 178 222 166 90 169 270 127 145 147 65 169 193 178 197 10 98 243 93 160 198 161 229 142 161 176 168 90 127 194 134 154 162 162 152 0 152 151 115 186 258 110 264 187 231 175 99 178 279 136 154 156 100 178 202 187 206 45 107 252 98 169 207 170 238 151 170 185 177 121 136 203 143 163 171 171 161 55 0 146 74 81 219 230 70 191 149 124 112 118 12 176 55 72 84 147 175 140 102 168 161 130 179 99 104 107 132 97 29 10 122 56 122 81 229 96 100 177 39 136 171 180 0 118 50 53 191 203 84 173 122 126 85 90 16 174 69 44 58 150 148 113 78 141 149 102 161 102 79 83 105 101 43 24 95 32 125 53 201 69 73 149 15 108 159 168 28 0 50 56 62 107 155 99 151 74 131 75 17 110 179 121 59 61 151 76 89 92 93 96 8 139 111 74 112 57 143 121 118 85 82 134 41 124 38 68 69 91 48 106 115 122 94 0 107 126 110 113 209 117 221 144 201 145 87 179 249 143 129 131 149 133 159 162 162 94 62 209 129 144 182 127 213 158 177 155 152 152 111 130 108 138 98 161 118 104 113 187 163 70 0 105 42 94 166 156 131 128 75 84 38 80 86 132 126 45 66 191 101 66 8 94 160 92 116 143 10 28 58 59 113 94 48 68 166 46 168 38 16 131 55 75 170 179 94 70 84 154 0 114 133 117 120 216 124 228 151 208 152 94 186 256 150 136 138 156 140 166 169 169 101 69 216 136 151 189 134 220 165 184 162 159 159 118 137 115 145 105 168 125 111 120 194 170 77 35 161 0 89 42 72 162 184 109 156 103 122 66 61 70 170 104 45 4 169 120 94 78 122 141 73 144 121 60 98 86 127 97 78 76 58 144 24 172 43 54 120 41 79 151 160 80 54 65 135 70 142 0 218 166 151 291 313 114 285 232 226 195 190 100 278 99 160 173 191 249 223 194 251 205 202 273 143 189 199 215 199 73 92 205 148 166 153 301 172 183 249 131 208 215 224 102 116 194 231 186 238 170 0 81 147 168 48 68 205 93 80 136 117 136 208 156 219 150 159 250 46 96 155 65 195 120 81 217 137 175 89 191 219 216 118 173 240 139 31 109 131 66 182 84 205 214 220 192 119 141 147 148 163 292 0 147 84 125 208 180 160 115 117 48 80 122 100 100 145 87 108 222 133 99 50 118 202 134 103 174 52 70 100 17 119 100 90 85 197 88 210 80 58 173 69 117 212 221 90 84 126 196 42 203 110 192 179 0 93 112 96 99 195 103 207 130 187 131 73 165 235 129 115 117 135 119 145 148 148 80 48 195 115 130 168 113 199 144 163 141 138 138 97 116 94 124 84 147 104 90 99 173 149 56 14 140 21 121 217 127 182 0 97 91 143 151 103 180 37 49 76 57 128 152 100 175 94 115 240 59 25 99 44 208 122 25 192 81 119 66 125 175 160 47 117 215 95 136 69 75 116 121 84 218 227 160 136 114 184 91 191 119 248 105 108 170 0 122 121 85 156 228 80 234 157 201 145 69 148 249 106 124 126 70 148 172 157 176 15 77 222 68 139 177 140 208 121 140 155 147 91 106 173 113 133 141 141 131 25 30 150 138 85 83 149 90 130 194 184 191 69 197 0 179 142 194 232 181 222 115 139 48 104 180 164 38 207 145 166 291 149 115 126 134 260 187 103 243 128 146 132 83 181 162 111 161 266 146 215 128 126 205 145 149 270 279 152 160 179 249 118 256 170 254 184 76 235 124 249 0 38 67 82 99 144 119 146 69 126 70 50 121 174 132 70 72 171 64 84 103 88 116 34 134 131 85 123 52 154 132 129 80 93 154 52 116 40 79 57 102 43 126 135 133 105 33 90 95 97 76 205 107 137 76 109 105 174 0 100 34 86 173 168 123 140 87 100 50 72 70 148 118 37 58 183 113 78 52 106 152 84 128 135 44 57 70 75 97 78 60 27 158 38 180 39 38 131 39 87 162 171 78 54 76 146 44 153 62 170 159 58 132 103 141 134 87 0 69 46 98 130 117 135 82 39 72 16 83 109 120 130 49 70 195 65 20 54 55 163 77 70 147 36 74 22 105 130 117 26 72 170 50 132 24 30 95 81 39 173 182 120 93 69 139 46 146 74 203 111 88 125 45 152 120 64 58 0 160 97 138 219 168 173 102 126 35 91 135 113 87 158 100 121 235 136 102 63 121 215 147 90 187 65 83 113 30 132 113 98 98 210 101 202 93 71 186 82 130 225 234 103 97 139 209 55 216 123 205 171 13 195 111 204 83 150 71 101 0 70 89 73 110 176 104 184 107 164 108 50 142 212 130 92 94 136 96 122 125 125 81 25 172 116 107 145 90 176 145 150 118 115 139 74 127 71 101 89 124 81 91 100 154 126 33 37 117 44 98 218 138 159 23 147 70 212 53 109 102 172 0 188 136 121 261 283 84 255 202 196 165 160 70 248 69 130 143 161 219 193 164 221 175 172 243 113 159 169 185 169 43 62 175 118 136 123 271 142 153 219 101 178 185 194 72 86 164 201 156 208 140 30 262 162 187 218 164 224 175 140 173 175 188 0 94 28 80 167 162 117 134 81 100 44 66 69 148 112 31 52 177 107 72 56 100 146 78 122 129 38 63 64 81 96 77 54 21 152 32 174 33 32 125 38 81 156 165 77 53 70 140 48 147 56 169 153 64 126 97 135 140 81 6 52 77 103 139 0 45 43 75 118 142 112 138 61 118 62 30 97 166 108 46 48 164 76 76 79 80 109 21 126 124 61 99 44 130 108 105 72 69 147 28 128 25 55 76 78 35 119 128 109 81 13 83 71 90 52 181 119 113 69 101 98 166 32 63 56 126 46 151 57 0 113 35 48 186 191 85 163 110 119 73 85 37 167 72 39 37 145 136 101 71 129 144 97 151 97 67 76 93 94 64 45 83 25 120 48 196 57 61 144 8 103 154 163 47 21 89 158 63 165 33 137 182 77 144 126 133 153 100 47 81 90 121 107 46 76 0 97 21 57 170 173 94 145 92 111 55 69 46 159 81 14 55 154 118 83 67 111 149 81 133 106 49 87 75 118 73 54 65 18 129 35 180 39 43 128 33 87 159 168 58 30 73 143 59 150 58 146 164 101 129 108 138 159 84 45 63 114 106 116 39 60 25 0 116 79 131 177 133 168 98 76 51 41 117 127 63 163 82 103 228 86 52 77 71 197 124 86 180 69 97 69 100 154 135 48 105 203 83 163 65 63 142 96 86 207 216 135 111 116 186 69 193 107 227 132 83 172 61 186 63 111 85 57 86 149 197 85 103 104 96 0 EOF Vertices of the graph: 1 Aprelevka 35 Lyubertsy 2 Balashikha 36 Mozhaysk 3 Bronnitsy 37 Moskva 4 Vereya 38 Mytischi 5 Volokolamsk 39 Naro-Fominsk 6 Voskresensk 40 Noginsk 7 Vysokovsk 41 Odintsovo 8 Dedovsk 42 Ozherel'ye 9 Dmitrov 43 Ozyory 10 Dolgoprudny 44 Orekhovo-Zuevo 11 Domodedovo 45 Pavlovsky Posad 12 Drezna 46 Podol'sk 13 Dubna 47 Protvino 14 Egor'yevsk 48 Pushkino 15 Zheleznodorozhny 49 Puschino 16 Zhukovsky 50 Ramenskoye 17 Zaraysk 51 Roshal 18 Zvenigorod 52 Ruza 19 Zelenograd 53 Sergiyev Posad 20 Ivanteyevka 54 Serpukhov 21 Istra 55 Solnechnogorsk 22 Kashira 56 Stupino 23 Klimovsk 57 Taldom 24 Klin 58 Troitsk 25 Kolomna 59 Fryazino 26 Korolyov (Podlipki) 60 Khimki 27 Krasnoarmeysk 61 Khot'kovo 28 Krasnogorsk 62 Chekhov 29 Krasnozavodsk 63 Shatura 30 Kurovskoye 64 Schyolkovo 31 Likino-Dulyovo 65 Scherbinka 32 Lobnya 66 Elektrostal 33 Losino-Petrovsky 67 Elektrougli 34 Lukhovitsy 68 Yakhroma Optimal tour length is 1994 kilometers (obtained by glpk tspsol): 1 39 4 36 52 5 7 24 55 19 60 10 32 68 13 57 9 61 53 29 27 20 48 26 38 59 64 33 67 15 2 35 16 50 66 40 45 12 44 31 63 51 30 14 6 3 25 34 17 22 42 56 43 47 49 54 62 23 46 11 65 58 41 37 28 8 21 18 1 glpk-5.0/examples/tsp/README0000644000062000006210000000315513766346220015012 0ustar maomkpasswdThis subdirectory contains an example application program, TSPSOL, which is a stand-alone solver intended to solve the Symmetric Traveling Salesman Problem (TSP) with the GLPK integer optimizer. Please note that this program is only an illustrative example that illustrates generating "lazy" constraints during the branch-and-bound search. It is *not* a state-of-the-art code, so only small-sized TSP instances (perhaps, having up to 150-200 nodes) can be solved with this program in a reasonable time. For more details see comments in the source code. To build TSPSOL executable you need to run 'build.sh' script. Note that you should have the GLPK library properly installed. To run the TSPSOL program use the following command: tspsol tsp-file where tsp-file specifies an input text file containing TSP data in TSPLIB 95 format. Detailed description of the input format recognized by TSPSOL is given in the report: Gerhard Reinelt, "TSPLIB 95". This report as well as TSPLIB, a library of sample TSP instances, are freely available for research purposes; see: . This subdirectory also includes the following example TSP instances: dantzig42.tsp 42 cities (Dantzig) [from TSPLIB] gr120.tsp 120 cities in Germany (Groetschel) [from TSPLIB] moscow.tsp 68 cities in Moscow region (Makhorin) sample.tsp small example from D.Phillips and A.Garcia-Diaz ulysses16.tsp Odyssey of Ulysses (Groetschel/Padberg) [from TSPLIB] ulysses22.tsp Odyssey of Ulysses (Groetschel/Padberg) [from TSPLIB] Please send comments to the mailing list. glpk-5.0/examples/tsp/sample.tsp0000644000062000006210000000064113766346220016140 0ustar maomkpasswdNAME: SAMPLE TYPE: TSP COMMENT: Example from D.Phillips, A.Garcia-Diaz, p.124 DIMENSION: 8 EDGE_WEIGHT_TYPE: EXPLICIT EDGE_WEIGHT_FORMAT: LOWER_DIAG_ROW EDGE_WEIGHT_SECTION 0 190 0 210 380 0 680 760 890 0 690 790 900 480 0 460 610 340 760 890 0 780 670 410 510 490 720 0 750 450 600 250 560 600 500 0 EOF glpk-5.0/examples/tsp/tsplib.c0000644000062000006210000005674313766346220015606 0ustar maomkpasswd/* tsplib.c */ /* Written by Andrew Makhorin , October 2015. */ #include #include #include #include #include #include #include #include "misc.h" #include "tsplib.h" /*********************************************************************** * NAME * * tsp_read_data - read TSP instance data * * SYNOPSIS * * #include "tsplib.h" * TSP *tsp_read_data(const char *fname); * * DESCRIPTION * * The routine tsp_read_data reads a TSP (or related problem) instance * data from a text file, whose name is the character string fname. * * For detailed description of the format recognized by the routine see * the report: G.Reinelt, TSPLIB 95. * * RETURNS * * If no error occurred, the routine tsp_read_data returns a pointer to * the TSP instance data block, which contains loaded data. In the case * of error the routine prints an error message and returns NULL. */ struct csa { /* common storage area used by the routine tsp_read_data */ const char *fname; /* name of the input text file */ FILE *fp; /* stream assigned to the input text file */ int seqn; /* line sequential number */ int c; /* current character */ char token[255+1]; /* current token */ }; static int get_char(struct csa *csa) { csa->c = fgetc(csa->fp); if (ferror(csa->fp)) { xprintf("%s:%d: read error - %s\n", csa->fname, csa->seqn, strerror(errno)); return 1; } if (feof(csa->fp)) csa->c = EOF; else if (csa->c == '\n') csa->seqn++; else if (isspace(csa->c)) csa->c = ' '; else if (iscntrl(csa->c)) { xprintf("%s:%d: invalid control character 0x%02X\n", csa->fname, csa->seqn, csa->c); return 1; } return 0; } static int skip_spaces(struct csa *csa, int across) { while (csa->c == ' ' || (across && csa->c == '\n')) if (get_char(csa)) return 1; return 0; } static int scan_keyword(struct csa *csa) { int len = 0; if (skip_spaces(csa, 0)) return 1; if (csa->c == EOF) { xprintf("%s:%d: warning: missing EOF inserted\n", csa->fname, csa->seqn); strcpy(csa->token, "EOF"); return 0; } csa->token[0] = '\0'; while (isalnum(csa->c) || csa->c == '_') { if (len == 31) { xprintf("%s:%d: keyword '%s...' too long\n", csa->fname, csa->seqn, csa->token); return 1; } csa->token[len++] = (char)csa->c, csa->token[len] = '\0'; if (get_char(csa)) return 1; } if (len == 0) { xprintf("%s:%d: missing keyword\n", csa->fname, csa->seqn); return 1; } return 0; } static int check_colon(struct csa *csa) { if (skip_spaces(csa, 0)) return 1; if (csa->c != ':') { xprintf("%s:%d: missing colon after '%s'\n", csa->fname, csa->seqn, csa->token); return 1; } if (get_char(csa)) return 1; return 0; } static int scan_token(struct csa *csa, int across) { int len = 0; if (skip_spaces(csa, across)) return 1; csa->token[0] = '\0'; while (!(csa->c == EOF || csa->c == '\n' || csa->c == ' ')) { if (len == 255) { csa->token[31] = '\0'; xprintf("%s:%d: token '%s...' too long\n", csa->fname, csa->seqn, csa->token); return 1; } csa->token[len++] = (char)csa->c, csa->token[len] = '\0'; if (get_char(csa)) return 1; } return 0; } static int check_newline(struct csa *csa) { if (skip_spaces(csa, 0)) return 1; if (!(csa->c == EOF || csa->c == '\n')) { xprintf("%s:%d: extra symbols detected\n", csa->fname, csa->seqn); return 1; } if (get_char(csa)) return 1; return 0; } static int scan_comment(struct csa *csa) { int len = 0; if (skip_spaces(csa, 0)) return 1; csa->token[0] = '\0'; while (!(csa->c == EOF || csa->c == '\n')) { if (len == 255) { xprintf("%s:%d: comment too long\n", csa->fname, csa->seqn); return 1; } csa->token[len++] = (char)csa->c, csa->token[len] = '\0'; if (get_char(csa)) return 1; } return 0; } static int scan_integer(struct csa *csa, int across, int *val) { if (scan_token(csa, across)) return 1; if (strlen(csa->token) == 0) { xprintf("%s:%d: missing integer\n", csa->fname, csa->seqn); return 1; } if (str2int(csa->token, val)) { xprintf("%s:%d: integer '%s' invalid\n", csa->fname, csa->seqn, csa->token); return 1; } return 0; } static int scan_number(struct csa *csa, int across, double *val) { if (scan_token(csa, across)) return 1; if (strlen(csa->token) == 0) { xprintf("%s:%d: missing number\n", csa->fname, csa->seqn); return 1; } if (str2num(csa->token, val)) { xprintf("%s:%d: number '%s' invalid\n", csa->fname, csa->seqn, csa->token); return 1; } return 0; } TSP *tsp_read_data(const char *fname) { struct csa _dsa, *csa = &_dsa; TSP *tsp = NULL; csa->fname = fname; xprintf("Reading TSP data from '%s'...\n", csa->fname); csa->fp = fopen(csa->fname, "r"); if (csa->fp == NULL) { xprintf("Unable to open '%s' - %s\n", csa->fname, strerror(errno)); goto fail; } tsp = xalloc(1, sizeof(TSP)); tsp->name = NULL; tsp->type = TSP_UNDEF; tsp->comment = NULL; tsp->dimension = 0; tsp->edge_weight_type = TSP_UNDEF; tsp->edge_weight_format = TSP_UNDEF; tsp->display_data_type = TSP_UNDEF; tsp->node_x_coord = NULL; tsp->node_y_coord = NULL; tsp->dply_x_coord = NULL; tsp->dply_y_coord = NULL; tsp->tour = NULL; tsp->edge_weight = NULL; csa->seqn = 1; if (get_char(csa)) goto fail; loop: if (scan_keyword(csa)) goto fail; if (strcmp(csa->token, "NAME") == 0) { if (tsp->name != NULL) { xprintf("%s:%d: NAME entry multiply defined\n", csa->fname, csa->seqn); goto fail; } if (check_colon(csa)) goto fail; if (scan_token(csa, 0)) goto fail; if (strlen(csa->token) == 0) { xprintf("%s:%d: NAME entry incomplete\n", csa->fname, csa->seqn); goto fail; } tsp->name = xalloc(strlen(csa->token)+1, sizeof(char)); strcpy(tsp->name, csa->token); xprintf("NAME: %s\n", tsp->name); if (check_newline(csa)) goto fail; } else if (strcmp(csa->token, "TYPE") == 0) { if (tsp->type != TSP_UNDEF) { xprintf("%s:%d: TYPE entry multiply defined\n", csa->fname, csa->seqn); goto fail; } if (check_colon(csa)) goto fail; if (scan_keyword(csa)) goto fail; if (strcmp(csa->token, "TSP") == 0) tsp->type = TSP_TSP; else if (strcmp(csa->token, "ATSP") == 0) tsp->type = TSP_ATSP; else if (strcmp(csa->token, "TOUR") == 0) tsp->type = TSP_TOUR; else { xprintf("%s:%d: data type '%s' not recognized\n", csa->fname, csa->seqn, csa->token); goto fail; } xprintf("TYPE: %s\n", csa->token); if (check_newline(csa)) goto fail; } else if (strcmp(csa->token, "COMMENT") == 0) { if (check_colon(csa)) goto fail; if (scan_comment(csa)) goto fail; xprintf("COMMENT: %s\n", csa->token); if (tsp->comment == NULL) { tsp->comment = xalloc(strlen(csa->token)+1, sizeof(char)); strcpy(tsp->comment, csa->token); } else { xprintf("%s:%d: warning: extra COMMENT entry ignored\n", csa->fname, csa->seqn); } if (check_newline(csa)) goto fail; } else if (strcmp(csa->token, "DIMENSION") == 0) { if (tsp->dimension != 0) { xprintf("%s:%d: DIMENSION entry multiply defined\n", csa->fname, csa->seqn); goto fail; } if (check_colon(csa)) goto fail; if (scan_integer(csa, 0, &tsp->dimension)) goto fail; if (tsp->dimension < 1) { xprintf("%s:%d: invalid dimension\n", csa->fname, csa->seqn); goto fail; } xprintf("DIMENSION: %d\n", tsp->dimension); if (check_newline(csa)) goto fail; } else if (strcmp(csa->token, "EDGE_WEIGHT_TYPE") == 0) { if (tsp->edge_weight_type != TSP_UNDEF) { xprintf("%s:%d: EDGE_WEIGHT_TYPE entry multiply defined\n", csa->fname, csa->seqn); goto fail; } if (check_colon(csa)) goto fail; if (scan_keyword(csa)) goto fail; if (strcmp(csa->token, "GEO") == 0) tsp->edge_weight_type = TSP_GEO; else if (strcmp(csa->token, "EUC_2D") == 0) tsp->edge_weight_type = TSP_EUC_2D; else if (strcmp(csa->token, "ATT") == 0) tsp->edge_weight_type = TSP_ATT; else if (strcmp(csa->token, "EXPLICIT") == 0) tsp->edge_weight_type = TSP_EXPLICIT; else if (strcmp(csa->token, "CEIL_2D") == 0) tsp->edge_weight_type = TSP_CEIL_2D; else { xprintf("%s:%d: edge weight type '%s' not recognized\n", csa->fname, csa->seqn, csa->token); goto fail; } xprintf("EDGE_WEIGHT_TYPE: %s\n", csa->token); if (check_newline(csa)) goto fail; } else if (strcmp(csa->token, "EDGE_WEIGHT_FORMAT") == 0) { if (tsp->edge_weight_format != TSP_UNDEF) { xprintf("%s:%d: EDGE_WEIGHT_FORMAT entry multiply defined\n" , csa->fname, csa->seqn); goto fail; } if (check_colon(csa)) goto fail; if (scan_keyword(csa)) goto fail; if (strcmp(csa->token, "UPPER_ROW") == 0) tsp->edge_weight_format = TSP_UPPER_ROW; else if (strcmp(csa->token, "FULL_MATRIX") == 0) tsp->edge_weight_format = TSP_FULL_MATRIX; else if (strcmp(csa->token, "FUNCTION") == 0) tsp->edge_weight_format = TSP_FUNCTION; else if (strcmp(csa->token, "LOWER_DIAG_ROW") == 0) tsp->edge_weight_format = TSP_LOWER_DIAG_ROW; else { xprintf("%s:%d: edge weight format '%s' not recognized\n", csa->fname, csa->seqn, csa->token); goto fail; } xprintf("EDGE_WEIGHT_FORMAT: %s\n", csa->token); if (check_newline(csa)) goto fail; } else if (strcmp(csa->token, "DISPLAY_DATA_TYPE") == 0) { if (tsp->display_data_type != TSP_UNDEF) { xprintf("%s:%d: DISPLAY_DATA_TYPE entry multiply defined\n", csa->fname, csa->seqn); goto fail; } if (check_colon(csa)) goto fail; if (scan_keyword(csa)) goto fail; if (strcmp(csa->token, "COORD_DISPLAY") == 0) tsp->display_data_type = TSP_COORD_DISPLAY; else if (strcmp(csa->token, "TWOD_DISPLAY") == 0) tsp->display_data_type = TSP_TWOD_DISPLAY; else { xprintf("%s:%d: display data type '%s' not recognized\n", csa->fname, csa->seqn, csa->token); goto fail; } xprintf("DISPLAY_DATA_TYPE: %s\n", csa->token); if (check_newline(csa)) goto fail; } else if (strcmp(csa->token, "NODE_COORD_SECTION") == 0) { int n = tsp->dimension, k, node; if (n == 0) { xprintf("%s:%d: DIMENSION entry not specified\n", csa->fname, csa->seqn); goto fail; } if (tsp->node_x_coord != NULL) { xprintf("%s:%d: NODE_COORD_SECTION multiply specified\n", csa->fname, csa->seqn); goto fail; } if (check_newline(csa)) goto fail; tsp->node_x_coord = xalloc(1+n, sizeof(double)); tsp->node_y_coord = xalloc(1+n, sizeof(double)); for (node = 1; node <= n; node++) tsp->node_x_coord[node] = tsp->node_y_coord[node] = DBL_MAX; for (k = 1; k <= n; k++) { if (scan_integer(csa, 0, &node)) goto fail; if (!(1 <= node && node <= n)) { xprintf("%s:%d: invalid node number %d\n", csa->fname, csa->seqn, node); goto fail; } if (tsp->node_x_coord[node] != DBL_MAX) { xprintf("%s:%d: node number %d multiply specified\n", csa->fname, csa->seqn, node); goto fail; } if (scan_number(csa, 0, &tsp->node_x_coord[node])) goto fail; if (scan_number(csa, 0, &tsp->node_y_coord[node])) goto fail; if (check_newline(csa)) goto fail; } } else if (strcmp(csa->token, "DISPLAY_DATA_SECTION") == 0) { int n = tsp->dimension, k, node; if (n == 0) { xprintf("%s:%d: DIMENSION entry not specified\n", csa->fname, csa->seqn); goto fail; } if (tsp->dply_x_coord != NULL) { xprintf("%s:%d: DISPLAY_DATA_SECTION multiply specified\n", csa->fname, csa->seqn); goto fail; } if (check_newline(csa)) goto fail; tsp->dply_x_coord = xalloc(1+n, sizeof(double)); tsp->dply_y_coord = xalloc(1+n, sizeof(double)); for (node = 1; node <= n; node++) tsp->dply_x_coord[node] = tsp->dply_y_coord[node] = DBL_MAX; for (k = 1; k <= n; k++) { if (scan_integer(csa, 0, &node)) goto fail; if (!(1 <= node && node <= n)) { xprintf("%s:%d: invalid node number %d\n", csa->fname, csa->seqn, node); goto fail; } if (tsp->dply_x_coord[node] != DBL_MAX) { xprintf("%s:%d: node number %d multiply specified\n", csa->fname, csa->seqn, node); goto fail; } if (scan_number(csa, 0, &tsp->dply_x_coord[node])) goto fail; if (scan_number(csa, 0, &tsp->dply_y_coord[node])) goto fail; if (check_newline(csa)) goto fail; } } else if (strcmp(csa->token, "TOUR_SECTION") == 0) { int n = tsp->dimension, k, node; if (n == 0) { xprintf("%s:%d: DIMENSION entry not specified\n", csa->fname, csa->seqn); goto fail; } if (tsp->tour != NULL) { xprintf("%s:%d: TOUR_SECTION multiply specified\n", csa->fname, csa->seqn); goto fail; } if (check_newline(csa)) goto fail; tsp->tour = xalloc(1+n, sizeof(int)); for (k = 1; k <= n; k++) { if (scan_integer(csa, 1, &node)) goto fail; if (!(1 <= node && node <= n)) { xprintf("%s:%d: invalid node number %d\n", csa->fname, csa->seqn, node); goto fail; } tsp->tour[k] = node; } if (scan_integer(csa, 1, &node)) goto fail; if (node != -1) { xprintf("%s:%d: extra node(s) detected\n", csa->fname, csa->seqn); goto fail; } if (check_newline(csa)) goto fail; } else if (strcmp(csa->token, "EDGE_WEIGHT_SECTION") == 0) { int n = tsp->dimension, i, j, temp; if (n == 0) { xprintf("%s:%d: DIMENSION entry not specified\n", csa->fname, csa->seqn); goto fail; } if (tsp->edge_weight_format == TSP_UNDEF) { xprintf("%s:%d: EDGE_WEIGHT_FORMAT entry not specified\n", csa->fname, csa->seqn); goto fail; } if (tsp->edge_weight != NULL) { xprintf("%s:%d: EDGE_WEIGHT_SECTION multiply specified\n", csa->fname, csa->seqn); goto fail; } if (check_newline(csa)) goto fail; tsp->edge_weight = xalloc(1+n*n, sizeof(int)); switch (tsp->edge_weight_format) { case TSP_FULL_MATRIX: for (i = 1; i <= n; i++) { for (j = 1; j <= n; j++) { if (scan_integer(csa, 1, &temp)) goto fail; tsp->edge_weight[(i - 1) * n + j] = temp; } } break; case TSP_UPPER_ROW: for (i = 1; i <= n; i++) { tsp->edge_weight[(i - 1) * n + i] = 0; for (j = i + 1; j <= n; j++) { if (scan_integer(csa, 1, &temp)) goto fail; tsp->edge_weight[(i - 1) * n + j] = temp; tsp->edge_weight[(j - 1) * n + i] = temp; } } break; case TSP_LOWER_DIAG_ROW: for (i = 1; i <= n; i++) { for (j = 1; j <= i; j++) { if (scan_integer(csa, 1, &temp)) goto fail; tsp->edge_weight[(i - 1) * n + j] = temp; tsp->edge_weight[(j - 1) * n + i] = temp; } } break; default: goto fail; } if (check_newline(csa)) goto fail; } else if (strcmp(csa->token, "EOF") == 0) { if (check_newline(csa)) goto fail; goto done; } else { xprintf("%s:%d: keyword '%s' not recognized\n", csa->fname, csa->seqn, csa->token); goto fail; } goto loop; done: xprintf("%d lines were read\n", csa->seqn-1); fclose(csa->fp); return tsp; fail: if (tsp != NULL) { if (tsp->name != NULL) xfree(tsp->name); if (tsp->comment != NULL) xfree(tsp->comment); if (tsp->node_x_coord != NULL) xfree(tsp->node_x_coord); if (tsp->node_y_coord != NULL) xfree(tsp->node_y_coord); if (tsp->dply_x_coord != NULL) xfree(tsp->dply_x_coord); if (tsp->dply_y_coord != NULL) xfree(tsp->dply_y_coord); if (tsp->tour != NULL) xfree(tsp->tour); if (tsp->edge_weight != NULL) xfree(tsp->edge_weight); xfree(tsp); } if (csa->fp != NULL) fclose(csa->fp); return NULL; } /*********************************************************************** * NAME * * tsp_distance - compute distance between two nodes * * SYNOPSIS * * #include "tsplib.h" * int tsp_distance(TSP *tsp, int i, int j); * * DESCRIPTION * * The routine tsp_distance computes the distance between i-th and j-th * nodes for the TSP instance, which tsp points to. * * RETURNS * * The routine tsp_distance returns the computed distance. */ #define nint(x) ((int)((x) + 0.5)) static double rad(double x) { /* convert input coordinate to longitude/latitude, in radians */ double pi = 3.141592, deg, min; deg = (int)x; min = x - deg; return pi * (deg + 5.0 * min / 3.0) / 180.0; } int tsp_distance(const TSP *tsp, int i, int j) { int n = tsp->dimension, dij; if (!(tsp->type == TSP_TSP || tsp->type == TSP_ATSP)) xerror("tsp_distance: invalid TSP instance\n"); if (!(1 <= i && i <= n && 1 <= j && j <= n)) xerror("tsp_distance: node number out of range\n"); switch (tsp->edge_weight_type) { case TSP_UNDEF: xerror("tsp_distance: edge weight type not specified\n"); case TSP_EXPLICIT: if (tsp->edge_weight == NULL) xerror("tsp_distance: edge weights not specified\n"); dij = tsp->edge_weight[(i - 1) * n + j]; break; case TSP_EUC_2D: if (tsp->node_x_coord == NULL || tsp->node_y_coord == NULL) xerror("tsp_distance: node coordinates not specified\n"); { double xd, yd; xd = tsp->node_x_coord[i] - tsp->node_x_coord[j]; yd = tsp->node_y_coord[i] - tsp->node_y_coord[j]; dij = nint(sqrt(xd * xd + yd * yd)); } break; case TSP_CEIL_2D: if (tsp->node_x_coord == NULL || tsp->node_y_coord == NULL) xerror("tsp_distance: node coordinates not specified\n"); { double xd, yd; xd = tsp->node_x_coord[i] - tsp->node_x_coord[j]; yd = tsp->node_y_coord[i] - tsp->node_y_coord[j]; dij = (int)ceil(sqrt(xd * xd + yd * yd)); } break; case TSP_GEO: if (tsp->node_x_coord == NULL || tsp->node_y_coord == NULL) xerror("tsp_distance: node coordinates not specified\n"); { double rrr = 6378.388; double latitude_i = rad(tsp->node_x_coord[i]); double latitude_j = rad(tsp->node_x_coord[j]); double longitude_i = rad(tsp->node_y_coord[i]); double longitude_j = rad(tsp->node_y_coord[j]); double q1 = cos(longitude_i - longitude_j); double q2 = cos(latitude_i - latitude_j); double q3 = cos(latitude_i + latitude_j); dij = (int)(rrr * acos(0.5 * ((1.0 + q1) * q2 - (1.0 - q1) *q3)) + 1.0); } break; case TSP_ATT: if (tsp->node_x_coord == NULL || tsp->node_y_coord == NULL) xerror("tsp_distance: node coordinates not specified\n"); { int tij; double xd, yd, rij; xd = tsp->node_x_coord[i] - tsp->node_x_coord[j]; yd = tsp->node_y_coord[i] - tsp->node_y_coord[j]; rij = sqrt((xd * xd + yd * yd) / 10.0); tij = nint(rij); if (tij < rij) dij = tij + 1; else dij = tij; } break; default: xassert(tsp->edge_weight_type != tsp->edge_weight_type); } return dij; } /*********************************************************************** * NAME * * tsp_free_data - free TSP instance data * * SYNOPSIS * * #include "tsplib.h" * void tsp_free_data(TSP *tsp); * * DESCRIPTION * * The routine tsp_free_data frees all the memory allocated to the TSP * instance data block, which the parameter tsp points to. */ void tsp_free_data(TSP *tsp) { if (tsp->name != NULL) xfree(tsp->name); if (tsp->comment != NULL) xfree(tsp->comment); if (tsp->node_x_coord != NULL) xfree(tsp->node_x_coord); if (tsp->node_y_coord != NULL) xfree(tsp->node_y_coord); if (tsp->dply_x_coord != NULL) xfree(tsp->dply_x_coord); if (tsp->dply_y_coord != NULL) xfree(tsp->dply_y_coord); if (tsp->tour != NULL) xfree(tsp->tour); if (tsp->edge_weight != NULL) xfree(tsp->edge_weight); xfree(tsp); return; } /* eof */ glpk-5.0/examples/tsp/tsplib.h0000644000062000006210000000631013766346220015574 0ustar maomkpasswd/* tsplib.h */ /* Written by Andrew Makhorin , October 2015. */ #ifndef TSPLIB_H #define TSPLIB_H typedef struct TSP TSP; struct TSP { /* TSP (or related problem) instance in the format described in * [G.Reinelt, TSPLIB 95] */ /*--------------------------------------------------------------*/ /* specification part */ char *name; /* identifies the data file */ int type; /* specifies the type of data: */ #define TSP_UNDEF 0 /* undefined */ #define TSP_TSP 1 /* symmetric TSP */ #define TSP_ATSP 2 /* asymmetric TSP */ #define TSP_TOUR 3 /* collection of tours */ char *comment; /* additional comments (usually the name of the contributor or * creator of the problem instance is given here) */ int dimension; /* for a TSP or ATSP, the dimension is the number of its nodes * for a TOUR it is the dimension of the corresponding problem */ int edge_weight_type; /* specifies how the edge weights (or distances) are given: */ #define TSP_UNDEF 0 /* undefined */ #define TSP_EXPLICIT 1 /* listed explicitly */ #define TSP_EUC_2D 2 /* Eucl. distances in 2-D */ #define TSP_CEIL_2D 3 /* Eucl. distances in 2-D rounded up */ #define TSP_GEO 4 /* geographical distances */ #define TSP_ATT 5 /* special distance function */ int edge_weight_format; /* describes the format of the edge weights if they are given * explicitly: */ #define TSP_UNDEF 0 /* undefined */ #define TSP_FUNCTION 1 /* given by a function */ #define TSP_FULL_MATRIX 2 /* given by a full matrix */ #define TSP_UPPER_ROW 3 /* upper triangular matrix (row-wise * without diagonal entries) */ #define TSP_LOWER_DIAG_ROW 4 /* lower triangular matrix (row-wise * including diagonal entries) */ int display_data_type; /* specifies how a graphical display of the nodes can be * obtained: */ #define TSP_UNDEF 0 /* undefined */ #define TSP_COORD_DISPLAY 1 /* display is generated from the node * coordinates */ #define TSP_TWOD_DISPLAY 2 /* explicit coordinates in 2-D are * given */ /*--------------------------------------------------------------*/ /* data part */ /* NODE_COORD_SECTION: */ double *node_x_coord; /* double node_x_coord[1+dimension]; */ double *node_y_coord; /* double node_y_coord[1+dimension]; */ /* DISPLAY_DATA_SECTION: */ double *dply_x_coord; /* double dply_x_coord[1+dimension]; */ double *dply_y_coord; /* double dply_y_coord[1+dimension]; */ /* TOUR_SECTION: */ int *tour; /* int tour[1+dimension]; */ /* EDGE_WEIGHT_SECTION: */ int *edge_weight; /* int edge_weight[1+dimension*dimension]; */ }; TSP *tsp_read_data(const char *fname); /* read TSP instance data */ int tsp_distance(const TSP *tsp, int i, int j); /* compute distance between two nodes */ void tsp_free_data(TSP *tsp); /* free TSP instance data */ #endif /* eof */ glpk-5.0/examples/tsp/ulysses16.tsp0000644000062000006210000000064213766346220016536 0ustar maomkpasswdNAME: ulysses16.tsp TYPE: TSP COMMENT: Odyssey of Ulysses (Groetschel/Padberg) DIMENSION: 16 EDGE_WEIGHT_TYPE: GEO DISPLAY_DATA_TYPE: COORD_DISPLAY NODE_COORD_SECTION 1 38.24 20.42 2 39.57 26.15 3 40.56 25.32 4 36.26 23.12 5 33.48 10.54 6 37.56 12.19 7 38.42 13.11 8 37.52 20.44 9 41.23 9.10 10 41.17 13.05 11 36.08 -5.21 12 38.47 15.13 13 38.15 15.35 14 37.51 15.17 15 35.49 14.32 16 39.36 19.56 EOF glpk-5.0/examples/tsp/ulysses22.tsp0000644000062000006210000000100113766346220016521 0ustar maomkpasswdNAME: ulysses22.tsp TYPE: TSP COMMENT: Odyssey of Ulysses (Groetschel/Padberg) DIMENSION: 22 EDGE_WEIGHT_TYPE: GEO DISPLAY_DATA_TYPE: COORD_DISPLAY NODE_COORD_SECTION 1 38.24 20.42 2 39.57 26.15 3 40.56 25.32 4 36.26 23.12 5 33.48 10.54 6 37.56 12.19 7 38.42 13.11 8 37.52 20.44 9 41.23 9.10 10 41.17 13.05 11 36.08 -5.21 12 38.47 15.13 13 38.15 15.35 14 37.51 15.17 15 35.49 14.32 16 39.36 19.56 17 38.09 24.36 18 36.09 23.00 19 40.44 13.57 20 40.33 14.15 21 40.37 14.23 22 37.57 22.56 EOF glpk-5.0/examples/tsp.mod0000644000062000006210000001500713766346220014632 0ustar maomkpasswd/* TSP, Traveling Salesman Problem */ /* Written in GNU MathProg by Andrew Makhorin */ /* The Traveling Salesman Problem (TSP) is stated as follows. Let a directed graph G = (V, E) be given, where V = {1, ..., n} is a set of nodes, E <= V x V is a set of arcs. Let also each arc e = (i,j) be assigned a number c[i,j], which is the length of the arc e. The problem is to find a closed path of minimal length going through each node of G exactly once. */ param n, integer, >= 3; /* number of nodes */ set V := 1..n; /* set of nodes */ set E, within V cross V; /* set of arcs */ param c{(i,j) in E}; /* distance from node i to node j */ var x{(i,j) in E}, binary; /* x[i,j] = 1 means that the salesman goes from node i to node j */ minimize total: sum{(i,j) in E} c[i,j] * x[i,j]; /* the objective is to make the path length as small as possible */ s.t. leave{i in V}: sum{(i,j) in E} x[i,j] = 1; /* the salesman leaves each node i exactly once */ s.t. enter{j in V}: sum{(i,j) in E} x[i,j] = 1; /* the salesman enters each node j exactly once */ /* Constraints above are not sufficient to describe valid tours, so we need to add constraints to eliminate subtours, i.e. tours which have disconnected components. Although there are many known ways to do that, I invented yet another way. The general idea is the following. Let the salesman sell, say, cars, starting the travel from node 1, where he has n cars. If we require the salesman to sell exactly one car in each node, he will need to go through all nodes to satisfy this requirement, thus, all subtours will be eliminated. */ var y{(i,j) in E}, >= 0; /* y[i,j] is the number of cars, which the salesman has after leaving node i and before entering node j; in terms of the network analysis, y[i,j] is a flow through arc (i,j) */ s.t. cap{(i,j) in E}: y[i,j] <= (n-1) * x[i,j]; /* if arc (i,j) does not belong to the salesman's tour, its capacity must be zero; it is obvious that on leaving a node, it is sufficient to have not more than n-1 cars */ s.t. node{i in V}: /* node[i] is a conservation constraint for node i */ sum{(j,i) in E} y[j,i] /* summary flow into node i through all ingoing arcs */ + (if i = 1 then n) /* plus n cars which the salesman has at starting node */ = /* must be equal to */ sum{(i,j) in E} y[i,j] /* summary flow from node i through all outgoing arcs */ + 1; /* plus one car which the salesman sells at node i */ solve; printf "Optimal tour has length %d\n", sum{(i,j) in E} c[i,j] * x[i,j]; printf("From node To node Distance\n"); printf{(i,j) in E: x[i,j]} " %3d %3d %8g\n", i, j, c[i,j]; data; /* These data correspond to the symmetric instance ulysses16 from: Reinelt, G.: TSPLIB - A travelling salesman problem library. ORSA-Journal of the Computing 3 (1991) 376-84; http://elib.zib.de/pub/Packages/mp-testdata/tsp/tsplib */ /* The optimal solution is 6859 */ param n := 16; param : E : c := 1 2 509 1 3 501 1 4 312 1 5 1019 1 6 736 1 7 656 1 8 60 1 9 1039 1 10 726 1 11 2314 1 12 479 1 13 448 1 14 479 1 15 619 1 16 150 2 1 509 2 3 126 2 4 474 2 5 1526 2 6 1226 2 7 1133 2 8 532 2 9 1449 2 10 1122 2 11 2789 2 12 958 2 13 941 2 14 978 2 15 1127 2 16 542 3 1 501 3 2 126 3 4 541 3 5 1516 3 6 1184 3 7 1084 3 8 536 3 9 1371 3 10 1045 3 11 2728 3 12 913 3 13 904 3 14 946 3 15 1115 3 16 499 4 1 312 4 2 474 4 3 541 4 5 1157 4 6 980 4 7 919 4 8 271 4 9 1333 4 10 1029 4 11 2553 4 12 751 4 13 704 4 14 720 4 15 783 4 16 455 5 1 1019 5 2 1526 5 3 1516 5 4 1157 5 6 478 5 7 583 5 8 996 5 9 858 5 10 855 5 11 1504 5 12 677 5 13 651 5 14 600 5 15 401 5 16 1033 6 1 736 6 2 1226 6 3 1184 6 4 980 6 5 478 6 7 115 6 8 740 6 9 470 6 10 379 6 11 1581 6 12 271 6 13 289 6 14 261 6 15 308 6 16 687 7 1 656 7 2 1133 7 3 1084 7 4 919 7 5 583 7 6 115 7 8 667 7 9 455 7 10 288 7 11 1661 7 12 177 7 13 216 7 14 207 7 15 343 7 16 592 8 1 60 8 2 532 8 3 536 8 4 271 8 5 996 8 6 740 8 7 667 8 9 1066 8 10 759 8 11 2320 8 12 493 8 13 454 8 14 479 8 15 598 8 16 206 9 1 1039 9 2 1449 9 3 1371 9 4 1333 9 5 858 9 6 470 9 7 455 9 8 1066 9 10 328 9 11 1387 9 12 591 9 13 650 9 14 656 9 15 776 9 16 933 10 1 726 10 2 1122 10 3 1045 10 4 1029 10 5 855 10 6 379 10 7 288 10 8 759 10 9 328 10 11 1697 10 12 333 10 13 400 10 14 427 10 15 622 10 16 610 11 1 2314 11 2 2789 11 3 2728 11 4 2553 11 5 1504 11 6 1581 11 7 1661 11 8 2320 11 9 1387 11 10 1697 11 12 1838 11 13 1868 11 14 1841 11 15 1789 11 16 2248 12 1 479 12 2 958 12 3 913 12 4 751 12 5 677 12 6 271 12 7 177 12 8 493 12 9 591 12 10 333 12 11 1838 12 13 68 12 14 105 12 15 336 12 16 417 13 1 448 13 2 941 13 3 904 13 4 704 13 5 651 13 6 289 13 7 216 13 8 454 13 9 650 13 10 400 13 11 1868 13 12 68 13 14 52 13 15 287 13 16 406 14 1 479 14 2 978 14 3 946 14 4 720 14 5 600 14 6 261 14 7 207 14 8 479 14 9 656 14 10 427 14 11 1841 14 12 105 14 13 52 14 15 237 14 16 449 15 1 619 15 2 1127 15 3 1115 15 4 783 15 5 401 15 6 308 15 7 343 15 8 598 15 9 776 15 10 622 15 11 1789 15 12 336 15 13 287 15 14 237 15 16 636 16 1 150 16 2 542 16 3 499 16 4 455 16 5 1033 16 6 687 16 7 592 16 8 206 16 9 933 16 10 610 16 11 2248 16 12 417 16 13 406 16 14 449 16 15 636 ; end; glpk-5.0/examples/wolfra6d.lp0000644000062000006210000004523413766346220015411 0ustar maomkpasswd\* Any Wolfram elementary CA in 6D eucl. Neumann CA grid emulator generator *\ \* Written and converted to *LP format by NASZVADI, Peter, 2016,2017 *\ \* *\ \* Standalone version; GMPL version is in wolfra6d.mod *\ \* This model looks up for a subset of vertices in 6D euclyd. grid, *\ \* which has the following properties: *\ \* 1. each vertex' coordinate pairs' difference is at most 1 *\ \* 2. contains the vertices in the main diagonal of the 6d space *\ \* 3. connecting with directed graph edges from all selected vertices *\ \* to all selected ones with greater coordinate sums with *\ \* Hamming-distance 1, the following in-out edge numbers are *\ \* allowed: (3,6), (1,2), (2,3), (1,2), (4,1), (3,1); according to *\ \* the mod 6 sum of the coordinate values *\ \* 4. Only vertices of the unit cube's with {0,1} coordinates are *\ \* calculated, but the other cells could be obtained via shifting. *\ \* Assume that the grid is a 6dim. cellular automaton grid with Neumann- *\ \* -neighbourhood, now construct an outer-totalistic rule that emulates *\ \* W110 cellular automaton on the selected vertices: *\ \* Suppose that the 1D W110 cellspace cells are denoted with signed *\ \* integers. Every 1D cell is assigned to (at most "6 over 2") selected *\ \* vertices where each coordinate sums are the same with the integer *\ \* assigned to the origin cell in the domain, they must have the same *\ \* value. Rule-110 means that cell's value is being changed only when its *\ \* neighbours are: (1,1,1), (1,0,1), (0,0,1), other cells remain unchanged. *\ \* Let's denote the default cellstate with "2" in the 6D automaton, and *\ \* the remaining 2 states with "0" and "1" respectively, which correspond *\ \* with the states in W110. The selected vertices must be 0 or 1 of course, *\ \* and the others are "2". *\ \* Now, the transition rule for emulating W110 is the following: *\ \* (x),{1,1,1,1,1,1,1,1,1,2,2,2}->(1-x), x!=2, *\ \* (x),{1,1,1,2,2,2,2,2,2,2,2,2}->(1-x), x!=2, *\ \* (x),{1,1,1,1,2,2,2,2,2,2,2,2}->(1-x), x!=2, *\ \* (x),{1,1,1,1,1,2,2,2,2,2,2,2}->(1-x), x!=2, *\ \* (1),{0,0,0,1,1,1,1,1,1,2,2,2}->(0), *\ \* (1),{0,1,1,2,2,2,2,2,2,2,2,2}->(0), *\ \* (1),{0,0,1,1,1,2,2,2,2,2,2,2}->(0), *\ \* (1),{0,0,0,0,1,2,2,2,2,2,2,2}->(0), *\ \* (1),{0,0,0,1,2,2,2,2,2,2,2,2}->(0); *\ \* notation: (old state),{old neighbours - all permutations}->(new state) *\ \* Other states won't change between two generations. And is known that W110 *\ \* is Turing-complete. So there is a universal CA rule in 6+D eucl. gridS *\ \* Result is in x****** binary variables (total 44 among the 64) *\ Minimize obj: x000000 +x000001 +x000010 +x000011 +x000100 +x000101 +x000110 +x000111 +x001000 +x001001 +x001010 +x001011 +x001100 +x001101 +x001110 +x001111 +x010000 +x010001 +x010010 +x010011 +x010100 +x010101 +x010110 +x010111 +x011000 +x011001 +x011010 +x011011 +x011100 +x011101 +x011110 +x011111 +x100000 +x100001 +x100010 +x100011 +x100100 +x100101 +x100110 +x100111 +x101000 +x101001 +x101010 +x101011 +x101100 +x101101 +x101110 +x101111 +x110000 +x110001 +x110010 +x110011 +x110100 +x110101 +x110110 +x110111 +x111000 +x111001 +x111010 +x111011 +x111100 +x111101 +x111110 +x111111 Subject To x000000 = 1 x111111 = 1 x111110 -x111101 >= 0 x111101 -x111011 >= 0 x111011 -x110111 >= 0 x110111 -x101111 >= 0 x101111 -x011111 >= 0 dn000000 -dn111111 = 0 up000000 -up111111 = 0 cup000000: x000001 +x000010 +x000100 +x001000 +x010000 +x100000 -up000000 = 0 cup000001: x000011 +x000101 +x001001 +x010001 +x100001 -up000001 = 0 cup000010: x000011 +x000110 +x001010 +x010010 +x100010 -up000010 = 0 cup000011: x000111 +x001011 +x010011 +x100011 -up000011 = 0 cup000100: x000101 +x000110 +x001100 +x010100 +x100100 -up000100 = 0 cup000101: x000111 +x001101 +x010101 +x100101 -up000101 = 0 cup000110: x000111 +x001110 +x010110 +x100110 -up000110 = 0 cup000111: x001111 +x010111 +x100111 -up000111 = 0 cup001000: x001001 +x001010 +x001100 +x011000 +x101000 -up001000 = 0 cup001001: x001011 +x001101 +x011001 +x101001 -up001001 = 0 cup001010: x001011 +x001110 +x011010 +x101010 -up001010 = 0 cup001011: x001111 +x011011 +x101011 -up001011 = 0 cup001100: x001101 +x001110 +x011100 +x101100 -up001100 = 0 cup001101: x001111 +x011101 +x101101 -up001101 = 0 cup001110: x001111 +x011110 +x101110 -up001110 = 0 cup001111: x011111 +x101111 -up001111 = 0 cup010000: x010001 +x010010 +x010100 +x011000 +x110000 -up010000 = 0 cup010001: x010011 +x010101 +x011001 +x110001 -up010001 = 0 cup010010: x010011 +x010110 +x011010 +x110010 -up010010 = 0 cup010011: x010111 +x011011 +x110011 -up010011 = 0 cup010100: x010101 +x010110 +x011100 +x110100 -up010100 = 0 cup010101: x010111 +x011101 +x110101 -up010101 = 0 cup010110: x010111 +x011110 +x110110 -up010110 = 0 cup010111: x011111 +x110111 -up010111 = 0 cup011000: x011001 +x011010 +x011100 +x111000 -up011000 = 0 cup011001: x011011 +x011101 +x111001 -up011001 = 0 cup011010: x011011 +x011110 +x111010 -up011010 = 0 cup011011: x011111 +x111011 -up011011 = 0 cup011100: x011101 +x011110 +x111100 -up011100 = 0 cup011101: x011111 +x111101 -up011101 = 0 cup011110: x011111 +x111110 -up011110 = 0 cup011111: x111111 -up011111 = 0 cup100000: x100001 +x100010 +x100100 +x101000 +x110000 -up100000 = 0 cup100001: x100011 +x100101 +x101001 +x110001 -up100001 = 0 cup100010: x100011 +x100110 +x101010 +x110010 -up100010 = 0 cup100011: x100111 +x101011 +x110011 -up100011 = 0 cup100100: x100101 +x100110 +x101100 +x110100 -up100100 = 0 cup100101: x100111 +x101101 +x110101 -up100101 = 0 cup100110: x100111 +x101110 +x110110 -up100110 = 0 cup100111: x101111 +x110111 -up100111 = 0 cup101000: x101001 +x101010 +x101100 +x111000 -up101000 = 0 cup101001: x101011 +x101101 +x111001 -up101001 = 0 cup101010: x101011 +x101110 +x111010 -up101010 = 0 cup101011: x101111 +x111011 -up101011 = 0 cup101100: x101101 +x101110 +x111100 -up101100 = 0 cup101101: x101111 +x111101 -up101101 = 0 cup101110: x101111 +x111110 -up101110 = 0 cup101111: x111111 -up101111 = 0 cup110000: x110001 +x110010 +x110100 +x111000 -up110000 = 0 cup110001: x110011 +x110101 +x111001 -up110001 = 0 cup110010: x110011 +x110110 +x111010 -up110010 = 0 cup110011: x110111 +x111011 -up110011 = 0 cup110100: x110101 +x110110 +x111100 -up110100 = 0 cup110101: x110111 +x111101 -up110101 = 0 cup110110: x110111 +x111110 -up110110 = 0 cup110111: x111111 -up110111 = 0 cup111000: x111001 +x111010 +x111100 -up111000 = 0 cup111001: x111011 +x111101 -up111001 = 0 cup111010: x111011 +x111110 -up111010 = 0 cup111011: x111111 -up111011 = 0 cup111100: x111101 +x111110 -up111100 = 0 cup111101: x111111 -up111101 = 0 cup111110: x111111 -up111110 = 0 cdn000001: x000000 -dn000001 = 0 cdn000010: x000000 -dn000010 = 0 cdn000011: x000001 +x000010 -dn000011 = 0 cdn000100: x000000 -dn000100 = 0 cdn000101: x000001 +x000100 -dn000101 = 0 cdn000110: x000010 +x000100 -dn000110 = 0 cdn000111: x000011 +x000101 +x000110 -dn000111 = 0 cdn001000: x000000 -dn001000 = 0 cdn001001: x000001 +x001000 -dn001001 = 0 cdn001010: x000010 +x001000 -dn001010 = 0 cdn001011: x000011 +x001001 +x001010 -dn001011 = 0 cdn001100: x000100 +x001000 -dn001100 = 0 cdn001101: x000101 +x001001 +x001100 -dn001101 = 0 cdn001110: x000110 +x001010 +x001100 -dn001110 = 0 cdn001111: x000111 +x001011 +x001101 +x001110 -dn001111 = 0 cdn010000: x000000 -dn010000 = 0 cdn010001: x000001 +x010000 -dn010001 = 0 cdn010010: x000010 +x010000 -dn010010 = 0 cdn010011: x000011 +x010001 +x010010 -dn010011 = 0 cdn010100: x000100 +x010000 -dn010100 = 0 cdn010101: x000101 +x010001 +x010100 -dn010101 = 0 cdn010110: x000110 +x010010 +x010100 -dn010110 = 0 cdn010111: x000111 +x010011 +x010101 +x010110 -dn010111 = 0 cdn011000: x001000 +x010000 -dn011000 = 0 cdn011001: x001001 +x010001 +x011000 -dn011001 = 0 cdn011010: x001010 +x010010 +x011000 -dn011010 = 0 cdn011011: x001011 +x010011 +x011001 +x011010 -dn011011 = 0 cdn011100: x001100 +x010100 +x011000 -dn011100 = 0 cdn011101: x001101 +x010101 +x011001 +x011100 -dn011101 = 0 cdn011110: x001110 +x010110 +x011010 +x011100 -dn011110 = 0 cdn011111: x001111 +x010111 +x011011 +x011101 +x011110 -dn011111 = 0 cdn100000: x000000 -dn100000 = 0 cdn100001: x000001 +x100000 -dn100001 = 0 cdn100010: x000010 +x100000 -dn100010 = 0 cdn100011: x000011 +x100001 +x100010 -dn100011 = 0 cdn100100: x000100 +x100000 -dn100100 = 0 cdn100101: x000101 +x100001 +x100100 -dn100101 = 0 cdn100110: x000110 +x100010 +x100100 -dn100110 = 0 cdn100111: x000111 +x100011 +x100101 +x100110 -dn100111 = 0 cdn101000: x001000 +x100000 -dn101000 = 0 cdn101001: x001001 +x100001 +x101000 -dn101001 = 0 cdn101010: x001010 +x100010 +x101000 -dn101010 = 0 cdn101011: x001011 +x100011 +x101001 +x101010 -dn101011 = 0 cdn101100: x001100 +x100100 +x101000 -dn101100 = 0 cdn101101: x001101 +x100101 +x101001 +x101100 -dn101101 = 0 cdn101110: x001110 +x100110 +x101010 +x101100 -dn101110 = 0 cdn101111: x001111 +x100111 +x101011 +x101101 +x101110 -dn101111 = 0 cdn110000: x010000 +x100000 -dn110000 = 0 cdn110001: x010001 +x100001 +x110000 -dn110001 = 0 cdn110010: x010010 +x100010 +x110000 -dn110010 = 0 cdn110011: x010011 +x100011 +x110001 +x110010 -dn110011 = 0 cdn110100: x010100 +x100100 +x110000 -dn110100 = 0 cdn110101: x010101 +x100101 +x110001 +x110100 -dn110101 = 0 cdn110110: x010110 +x100110 +x110010 +x110100 -dn110110 = 0 cdn110111: x010111 +x100111 +x110011 +x110101 +x110110 -dn110111 = 0 cdn111000: x011000 +x101000 +x110000 -dn111000 = 0 cdn111001: x011001 +x101001 +x110001 +x111000 -dn111001 = 0 cdn111010: x011010 +x101010 +x110010 +x111000 -dn111010 = 0 cdn111011: x011011 +x101011 +x110011 +x111001 +x111010 -dn111011 = 0 cdn111100: x011100 +x101100 +x110100 +x111000 -dn111100 = 0 cdn111101: x011101 +x101101 +x110101 +x111001 +x111100 -dn111101 = 0 cdn111110: x011110 +x101110 +x110110 +x111010 +x111100 -dn111110 = 0 cdn111111: x011111 +x101111 +x110111 +x111011 +x111101 +x111110 -dn111111 = 0 up000000 -6 x000000 >= 0 up000000 +64 x000000 <= 70 up000001 -2 x000001 >= 0 up000001 +64 x000001 <= 66 up000010 -2 x000010 >= 0 up000010 +64 x000010 <= 66 up000011 -3 x000011 >= 0 up000011 +64 x000011 <= 67 up000100 -2 x000100 >= 0 up000100 +64 x000100 <= 66 up000101 -3 x000101 >= 0 up000101 +64 x000101 <= 67 up000110 -3 x000110 >= 0 up000110 +64 x000110 <= 67 up000111 -2 x000111 >= 0 up000111 +64 x000111 <= 66 up001000 -2 x001000 >= 0 up001000 +64 x001000 <= 66 up001001 -3 x001001 >= 0 up001001 +64 x001001 <= 67 up001010 -3 x001010 >= 0 up001010 +64 x001010 <= 67 up001011 -2 x001011 >= 0 up001011 +64 x001011 <= 66 up001100 -3 x001100 >= 0 up001100 +64 x001100 <= 67 up001101 -2 x001101 >= 0 up001101 +64 x001101 <= 66 up001110 -2 x001110 >= 0 up001110 +64 x001110 <= 66 up001111 -1 x001111 >= 0 up001111 +64 x001111 <= 65 up010000 -2 x010000 >= 0 up010000 +64 x010000 <= 66 up010001 -3 x010001 >= 0 up010001 +64 x010001 <= 67 up010010 -3 x010010 >= 0 up010010 +64 x010010 <= 67 up010011 -2 x010011 >= 0 up010011 +64 x010011 <= 66 up010100 -3 x010100 >= 0 up010100 +64 x010100 <= 67 up010101 -2 x010101 >= 0 up010101 +64 x010101 <= 66 up010110 -2 x010110 >= 0 up010110 +64 x010110 <= 66 up010111 -1 x010111 >= 0 up010111 +64 x010111 <= 65 up011000 -3 x011000 >= 0 up011000 +64 x011000 <= 67 up011001 -2 x011001 >= 0 up011001 +64 x011001 <= 66 up011010 -2 x011010 >= 0 up011010 +64 x011010 <= 66 up011011 -1 x011011 >= 0 up011011 +64 x011011 <= 65 up011100 -2 x011100 >= 0 up011100 +64 x011100 <= 66 up011101 -1 x011101 >= 0 up011101 +64 x011101 <= 65 up011110 -1 x011110 >= 0 up011110 +64 x011110 <= 65 up011111 -1 x011111 >= 0 up011111 +64 x011111 <= 65 up100000 -2 x100000 >= 0 up100000 +64 x100000 <= 66 up100001 -3 x100001 >= 0 up100001 +64 x100001 <= 67 up100010 -3 x100010 >= 0 up100010 +64 x100010 <= 67 up100011 -2 x100011 >= 0 up100011 +64 x100011 <= 66 up100100 -3 x100100 >= 0 up100100 +64 x100100 <= 67 up100101 -2 x100101 >= 0 up100101 +64 x100101 <= 66 up100110 -2 x100110 >= 0 up100110 +64 x100110 <= 66 up100111 -1 x100111 >= 0 up100111 +64 x100111 <= 65 up101000 -3 x101000 >= 0 up101000 +64 x101000 <= 67 up101001 -2 x101001 >= 0 up101001 +64 x101001 <= 66 up101010 -2 x101010 >= 0 up101010 +64 x101010 <= 66 up101011 -1 x101011 >= 0 up101011 +64 x101011 <= 65 up101100 -2 x101100 >= 0 up101100 +64 x101100 <= 66 up101101 -1 x101101 >= 0 up101101 +64 x101101 <= 65 up101110 -1 x101110 >= 0 up101110 +64 x101110 <= 65 up101111 -1 x101111 >= 0 up101111 +64 x101111 <= 65 up110000 -3 x110000 >= 0 up110000 +64 x110000 <= 67 up110001 -2 x110001 >= 0 up110001 +64 x110001 <= 66 up110010 -2 x110010 >= 0 up110010 +64 x110010 <= 66 up110011 -1 x110011 >= 0 up110011 +64 x110011 <= 65 up110100 -2 x110100 >= 0 up110100 +64 x110100 <= 66 up110101 -1 x110101 >= 0 up110101 +64 x110101 <= 65 up110110 -1 x110110 >= 0 up110110 +64 x110110 <= 65 up110111 -1 x110111 >= 0 up110111 +64 x110111 <= 65 up111000 -2 x111000 >= 0 up111000 +64 x111000 <= 66 up111001 -1 x111001 >= 0 up111001 +64 x111001 <= 65 up111010 -1 x111010 >= 0 up111010 +64 x111010 <= 65 up111011 -1 x111011 >= 0 up111011 +64 x111011 <= 65 up111100 -1 x111100 >= 0 up111100 +64 x111100 <= 65 up111101 -1 x111101 >= 0 up111101 +64 x111101 <= 65 up111110 -1 x111110 >= 0 up111110 +64 x111110 <= 65 dn000001 -1 x000001 >= 0 dn000001 +64 x000001 <= 65 dn000010 -1 x000010 >= 0 dn000010 +64 x000010 <= 65 dn000011 -2 x000011 >= 0 dn000011 +64 x000011 <= 66 dn000100 -1 x000100 >= 0 dn000100 +64 x000100 <= 65 dn000101 -2 x000101 >= 0 dn000101 +64 x000101 <= 66 dn000110 -2 x000110 >= 0 dn000110 +64 x000110 <= 66 dn000111 -1 x000111 >= 0 dn000111 +64 x000111 <= 65 dn001000 -1 x001000 >= 0 dn001000 +64 x001000 <= 65 dn001001 -2 x001001 >= 0 dn001001 +64 x001001 <= 66 dn001010 -2 x001010 >= 0 dn001010 +64 x001010 <= 66 dn001011 -1 x001011 >= 0 dn001011 +64 x001011 <= 65 dn001100 -2 x001100 >= 0 dn001100 +64 x001100 <= 66 dn001101 -1 x001101 >= 0 dn001101 +64 x001101 <= 65 dn001110 -1 x001110 >= 0 dn001110 +64 x001110 <= 65 dn001111 -4 x001111 >= 0 dn001111 +64 x001111 <= 68 dn010000 -1 x010000 >= 0 dn010000 +64 x010000 <= 65 dn010001 -2 x010001 >= 0 dn010001 +64 x010001 <= 66 dn010010 -2 x010010 >= 0 dn010010 +64 x010010 <= 66 dn010011 -1 x010011 >= 0 dn010011 +64 x010011 <= 65 dn010100 -2 x010100 >= 0 dn010100 +64 x010100 <= 66 dn010101 -1 x010101 >= 0 dn010101 +64 x010101 <= 65 dn010110 -1 x010110 >= 0 dn010110 +64 x010110 <= 65 dn010111 -4 x010111 >= 0 dn010111 +64 x010111 <= 68 dn011000 -2 x011000 >= 0 dn011000 +64 x011000 <= 66 dn011001 -1 x011001 >= 0 dn011001 +64 x011001 <= 65 dn011010 -1 x011010 >= 0 dn011010 +64 x011010 <= 65 dn011011 -4 x011011 >= 0 dn011011 +64 x011011 <= 68 dn011100 -1 x011100 >= 0 dn011100 +64 x011100 <= 65 dn011101 -4 x011101 >= 0 dn011101 +64 x011101 <= 68 dn011110 -4 x011110 >= 0 dn011110 +64 x011110 <= 68 dn011111 -3 x011111 >= 0 dn011111 +64 x011111 <= 67 dn100000 -1 x100000 >= 0 dn100000 +64 x100000 <= 65 dn100001 -2 x100001 >= 0 dn100001 +64 x100001 <= 66 dn100010 -2 x100010 >= 0 dn100010 +64 x100010 <= 66 dn100011 -1 x100011 >= 0 dn100011 +64 x100011 <= 65 dn100100 -2 x100100 >= 0 dn100100 +64 x100100 <= 66 dn100101 -1 x100101 >= 0 dn100101 +64 x100101 <= 65 dn100110 -1 x100110 >= 0 dn100110 +64 x100110 <= 65 dn100111 -4 x100111 >= 0 dn100111 +64 x100111 <= 68 dn101000 -2 x101000 >= 0 dn101000 +64 x101000 <= 66 dn101001 -1 x101001 >= 0 dn101001 +64 x101001 <= 65 dn101010 -1 x101010 >= 0 dn101010 +64 x101010 <= 65 dn101011 -4 x101011 >= 0 dn101011 +64 x101011 <= 68 dn101100 -1 x101100 >= 0 dn101100 +64 x101100 <= 65 dn101101 -4 x101101 >= 0 dn101101 +64 x101101 <= 68 dn101110 -4 x101110 >= 0 dn101110 +64 x101110 <= 68 dn101111 -3 x101111 >= 0 dn101111 +64 x101111 <= 67 dn110000 -2 x110000 >= 0 dn110000 +64 x110000 <= 66 dn110001 -1 x110001 >= 0 dn110001 +64 x110001 <= 65 dn110010 -1 x110010 >= 0 dn110010 +64 x110010 <= 65 dn110011 -4 x110011 >= 0 dn110011 +64 x110011 <= 68 dn110100 -1 x110100 >= 0 dn110100 +64 x110100 <= 65 dn110101 -4 x110101 >= 0 dn110101 +64 x110101 <= 68 dn110110 -4 x110110 >= 0 dn110110 +64 x110110 <= 68 dn110111 -3 x110111 >= 0 dn110111 +64 x110111 <= 67 dn111000 -1 x111000 >= 0 dn111000 +64 x111000 <= 65 dn111001 -4 x111001 >= 0 dn111001 +64 x111001 <= 68 dn111010 -4 x111010 >= 0 dn111010 +64 x111010 <= 68 dn111011 -3 x111011 >= 0 dn111011 +64 x111011 <= 67 dn111100 -4 x111100 >= 0 dn111100 +64 x111100 <= 68 dn111101 -3 x111101 >= 0 dn111101 +64 x111101 <= 67 dn111110 -3 x111110 >= 0 dn111110 +64 x111110 <= 67 dn111111 -3 x111111 >= 0 dn111111 +64 x111111 <= 67 binary x000000 x000001 x000010 x000011 x000100 x000101 x000110 x000111 x001000 x001001 x001010 x001011 x001100 x001101 x001110 x001111 x010000 x010001 x010010 x010011 x010100 x010101 x010110 x010111 x011000 x011001 x011010 x011011 x011100 x011101 x011110 x011111 x100000 x100001 x100010 x100011 x100100 x100101 x100110 x100111 x101000 x101001 x101010 x101011 x101100 x101101 x101110 x101111 x110000 x110001 x110010 x110011 x110100 x110101 x110110 x110111 x111000 x111001 x111010 x111011 x111100 x111101 x111110 x111111 integer dn000000 up000000 dn000001 up000001 dn000010 up000010 dn000011 up000011 dn000100 up000100 dn000101 up000101 dn000110 up000110 dn000111 up000111 dn001000 up001000 dn001001 up001001 dn001010 up001010 dn001011 up001011 dn001100 up001100 dn001101 up001101 dn001110 up001110 dn001111 up001111 dn010000 up010000 dn010001 up010001 dn010010 up010010 dn010011 up010011 dn010100 up010100 dn010101 up010101 dn010110 up010110 dn010111 up010111 dn011000 up011000 dn011001 up011001 dn011010 up011010 dn011011 up011011 dn011100 up011100 dn011101 up011101 dn011110 up011110 dn011111 up011111 dn100000 up100000 dn100001 up100001 dn100010 up100010 dn100011 up100011 dn100100 up100100 dn100101 up100101 dn100110 up100110 dn100111 up100111 dn101000 up101000 dn101001 up101001 dn101010 up101010 dn101011 up101011 dn101100 up101100 dn101101 up101101 dn101110 up101110 dn101111 up101111 dn110000 up110000 dn110001 up110001 dn110010 up110010 dn110011 up110011 dn110100 up110100 dn110101 up110101 dn110110 up110110 dn110111 up110111 dn111000 up111000 dn111001 up111001 dn111010 up111010 dn111011 up111011 dn111100 up111100 dn111101 up111101 dn111110 up111110 dn111111 up111111 End glpk-5.0/examples/wolfra6d.mod0000644000062000006210000000575513766346220015561 0ustar maomkpasswd/* Any Wolfram elementary CA in 6D eucl. Neumann CA grid emulator generator */ /* Implemented, inspected, written and converted to GNU MathProg by NASZVADI, Peter, 2016-2017 */ /* see background info and more details in wolfra6d.lp */ /* each axis has this two endpoints */ set V := 0..1; /* this model processes a hypercube in 6d, so 6+1 parallel planes intersect */ set H := 0..6; /* denoting all vertices in the 6d unit hypercube */ set Cells := V cross V cross V cross V cross V cross V; /* input parameters, bup/bdn = number of upper/lower neighbour 6d cells of a (cyclic) segment */ param bup{i in H}, default 1; param bdn{i in H}, default 2; /* boolean meaning if a vertex is chosen */ var x{Cells}, binary; /* temporary calculations to enforce bup/bdn */ var up{Cells}, >=0; var dn{Cells}, >=0; /* the total weight of selected cells near the main diagonal */ var obj; /* up/dn vars denote the number of selected upper/lower neighbours */ s.t. cup{(v1,v2,v3,v4,v5,v6) in Cells: v1+v2+v3+v4+v5+v6<6}: sum{(w1,w2,w3,w4,w5,w6) in Cells: max(v1-w1,v2-w2,v3-w3,v4-w4,v5-w5,v6-w6)<=0} if (w1+w2+w3+w4+w5+w6) = (1+v1+v2+v3+v4+v5+v6) then x[w1,w2,w3,w4,w5,w6] else 0 = up[v1,v2,v3,v4,v5,v6]; s.t. cdn{(v1,v2,v3,v4,v5,v6) in Cells: v1+v2+v3+v4+v5+v6>0}: sum{(w1,w2,w3,w4,w5,w6) in Cells: min(v1-w1,v2-w2,v3-w3,v4-w4,v5-w5,v6-w6)>=0} if (w1+w2+w3+w4+w5+w6) = (-1+v1+v2+v3+v4+v5+v6) then x[w1,w2,w3,w4,w5,w6] else 0 = dn[v1,v2,v3,v4,v5,v6]; /* 4 helper constraints, hences the leading "c" */ s.t. cbup1{(v1,v2,v3,v4,v5,v6) in Cells: v1+v2+v3+v4+v5+v6<6}: up[v1,v2,v3,v4,v5,v6] >= bup[v1+v2+v3+v4+v5+v6] * x[v1,v2,v3,v4,v5,v6]; s.t. cbup2{(v1,v2,v3,v4,v5,v6) in Cells: v1+v2+v3+v4+v5+v6<6}: up[v1,v2,v3,v4,v5,v6] + (2**6) * x[v1,v2,v3,v4,v5,v6] <= (2**6) + bup[v1+v2+v3+v4+v5+v6]; s.t. cbdn1{(v1,v2,v3,v4,v5,v6) in Cells: v1+v2+v3+v4+v5+v6>0}: dn[v1,v2,v3,v4,v5,v6] >= bdn[v1+v2+v3+v4+v5+v6] * x[v1,v2,v3,v4,v5,v6]; s.t. cbdn2{(v1,v2,v3,v4,v5,v6) in Cells: v1+v2+v3+v4+v5+v6>0}: dn[v1,v2,v3,v4,v5,v6] + (2**6) * x[v1,v2,v3,v4,v5,v6] <= (2**6) + bdn[v1+v2+v3+v4+v5+v6]; /* these two promoted points should be selected */ s.t. initdiag: x[0,0,0,0,0,0] + x[1,1,1,1,1,1] = 2; /* obvious */ s.t. sumx: sum{(v1,v2,v3,v4,v5,v6) in Cells} x[v1,v2,v3,v4,v5,v6] = obj; minimize cobj: obj; solve; /* pretty-printing hopefully nontrivial solution */ printf "\nChosen vertex subset:\n"; for{i in H}: { printf "Weight=%s\n", i; printf{(v1,v2,v3,v4,v5,v6) in Cells: v1+v2+v3+v4+v5+v6 = i+(8-8*x[v1,v2,v3,v4,v5,v6])} " %s%s%s%s%s%s\n",v1,v2,v3,v4,v5,v6; } printf "\nTotal number of selected cells in the hypercube: %g\n\n", obj; data; /* these parameters were chosen in the first run that yielded a solution */ param bup := 0 6 1 2 2 3 3 2 4 1 5 1 6 6; param bdn := 0 3 1 1 2 2 3 1 4 4 5 3 6 3; end; glpk-5.0/examples/xyacfs.mod0000644000062000006210000000302713766346220015320 0ustar maomkpasswd/*Extended Yet Another Curve Fitting Solution (The poor man's RMA) An extension of yacfs.mod adding a Weight parameter: When set to 1 the model produces best fit by least squares with all error in y and none in x (YonX); When set to zero the model produces best fit by least squares with all error in x and none in y (XonY); When set to 0.5 the model assumes equal error in x and y producing results similar to fitting by Reduced Major Axis Analysis. Nigel_Galloway@operamail.com November 5th., 2009 */ set Sample; param Sx {z in Sample}; param Sy {z in Sample}; param Weight := 0.5; var a; var b; var p; var q; XonY1 :sum{z in Sample} q*Sy[z]*Sy[z] + sum{z in Sample} p*Sy[z] = sum{z in Sample} Sy[z]*Sx[z]; XonY2 :sum{z in Sample} q*Sy[z] + sum{z in Sample} p = sum{z in Sample} Sx[z]; YonX1 :sum{z in Sample} a*Sx[z]*Sx[z] + sum{z in Sample} b*Sx[z] = sum{z in Sample} Sy[z]*Sx[z]; YonX2 :sum{z in Sample} a*Sx[z] + sum{z in Sample} b = sum{z in Sample} Sy[z]; solve; param W := Weight*a + (1-Weight)*(1/q); printf "\nbest linear fit is:\n\ty = %f %s %fx\n\n", b*Weight - (1-Weight)*(p/q), if W < 0 then "-" else "+", abs(W); data; param: Sample: Sx Sy := 1 0 1 2 0.5 0.9 3 1 0.7 4 1.5 1.5 5 1.9 2 6 2.5 2.4 7 3 3.2 8 3.5 2 9 4 2.7 10 4.5 3.5 11 5 1 12 5.5 4 13 6 3.6 14 6.6 2.7 15 7 5.7 16 7.6 4.6 17 8.5 6 18 9 6.8 19 10 7.3 ; end; glpk-5.0/examples/yacfs.mod0000644000062000006210000000164513766346220015134 0ustar maomkpasswd/*Yet Another Curve Fitting Solution Obviously this solution produces the same answer as examples/cflsq.mod Nigel_Galloway@operamail.com February 1st., 2009 */ set Sample; param Sx {z in Sample}; param Sy {z in Sample}; var a; var b; equalz1 :sum{z in Sample} a*Sx[z]*Sx[z] + sum{z in Sample} b*Sx[z] = sum{z in Sample} Sy[z]*Sx[z]; equalz2 :sum{z in Sample} a*Sx[z] + sum{z in Sample} b = sum{z in Sample} Sy[z]; solve; printf "\nbest linear fit is:\n\ty = %f %s %fx\n\n", b, if a < 0 then "-" else "+", abs(a); data; param: Sample: Sx Sy := 1 0 1 2 0.5 0.9 3 1 0.7 4 1.5 1.5 5 1.9 2 6 2.5 2.4 7 3 3.2 8 3.5 2 9 4 2.7 10 4.5 3.5 11 5 1 12 5.5 4 13 6 3.6 14 6.6 2.7 15 7 5.7 16 7.6 4.6 17 8.5 6 18 9 6.8 19 10 7.3 ; end; glpk-5.0/examples/zebra.mod0000644000062000006210000001222013766346220015121 0ustar maomkpasswd/* ZEBRA, Who Owns the Zebra? */ /* Written in GNU MathProg by Andrew Makhorin */ ######################################################################## # The Zebra Puzzle is a well-known logic puzzle. # # It is often called "Einstein's Puzzle" or "Einstein's Riddle" # because it is said to have been invented by Albert Einstein as a boy, # with the common claim that Einstein said "only 2 percent of the # world's population can solve". It is also sometimes attributed to # Lewis Carroll. However, there is no known evidence for Einstein's or # Carroll's authorship. # # There are several versions of this puzzle. The version below is # quoted from the first known publication in Life International # magazine on December 17, 1962. # # 1. There are five houses. # 2. The Englishman lives in the red house. # 3. The Spaniard owns the dog. # 4. Coffee is drunk in the green house. # 5. The Ukrainian drinks tea. # 6. The green house is immediately to the right of the ivory house. # 7. The Old Gold smoker owns snails. # 8. Kools are smoked in the yellow house. # 9. Milk is drunk in the middle house. # 10. The Norwegian lives in the first house. # 11. The man who smokes Chesterfields lives in the house next to the # man with the fox. # 12. Kools are smoked in the house next to the house where the horse # is kept. # 13. The Lucky Strike smoker drinks orange juice. # 14. The Japanese smokes Parliaments. # 15. The Norwegian lives next to the blue house. # # Now, who drinks water? Who owns the zebra? # # In the interest of clarity, it must be added that each of the five # houses is painted a different color, and their inhabitants are of # different national extractions, own different pets, drink different # beverages and smoke different brands of American cigarettes. One # other thing: In statement 6, right means your right. # # (From Wikipedia, the free encyclopedia.) ######################################################################## set HOUSE := { 1..5 }; set COLOR := { "blue", "green", "ivory", "red", "yellow" }; set NATIONALITY := { "Englishman", "Japanese", "Norwegian", "Spaniard", "Ukranian" }; set DRINK := { "coffee", "milk", "orange_juice", "tea", "water" }; set SMOKE := { "Chesterfield", "Kools", "Lucky_Strike", "Old_Gold", "Parliament" }; set PET := { "dog", "fox", "horse", "snails", "zebra" }; var color{HOUSE, COLOR}, binary; c1{h in HOUSE}: sum{c in COLOR} color[h,c] = 1; c2{c in COLOR}: sum{h in HOUSE} color[h,c] = 1; var nationality{HOUSE, NATIONALITY}, binary; n1{h in HOUSE}: sum{n in NATIONALITY} nationality[h,n] = 1; n2{n in NATIONALITY}: sum{h in HOUSE} nationality[h,n] = 1; var drink{HOUSE, DRINK}, binary; d1{h in HOUSE}: sum{d in DRINK} drink[h,d] = 1; d2{d in DRINK}: sum{h in HOUSE} drink[h,d] = 1; var smoke{HOUSE, SMOKE}, binary; s1{h in HOUSE}: sum{s in SMOKE} smoke[h,s] = 1; s2{s in SMOKE}: sum{h in HOUSE} smoke[h,s] = 1; var pet{HOUSE, PET}, binary; p1{h in HOUSE}: sum{p in PET} pet[h,p] = 1; p2{p in PET}: sum{h in HOUSE} pet[h,p] = 1; /* the Englishman lives in the red house */ f2{h in HOUSE}: nationality[h,"Englishman"] = color[h,"red"]; /* the Spaniard owns the dog */ f3{h in HOUSE}: nationality[h,"Spaniard"] = pet[h,"dog"]; /* coffee is drunk in the green house */ f4{h in HOUSE}: drink[h,"coffee"] = color[h,"green"]; /* the Ukrainian drinks tea */ f5{h in HOUSE}: nationality[h,"Ukranian"] = drink[h,"tea"]; /* the green house is immediately to the right of the ivory house */ f6{h in HOUSE}: color[h,"green"] = if h = 1 then 0 else color[h-1,"ivory"]; /* the Old Gold smoker owns snails */ f7{h in HOUSE}: smoke[h,"Old_Gold"] = pet[h,"snails"]; /* Kools are smoked in the yellow house */ f8{h in HOUSE}: smoke[h,"Kools"] = color[h,"yellow"]; /* milk is drunk in the middle house */ f9: drink[3,"milk"] = 1; /* the Norwegian lives in the first house */ f10: nationality[1,"Norwegian"] = 1; /* the man who smokes Chesterfields lives in the house next to the man with the fox */ f11{h in HOUSE}: (1 - smoke[h,"Chesterfield"]) + (if h = 1 then 0 else pet[h-1,"fox"]) + (if h = 5 then 0 else pet[h+1,"fox"]) >= 1; /* Kools are smoked in the house next to the house where the horse is kept */ f12{h in HOUSE}: (1 - smoke[h,"Kools"]) + (if h = 1 then 0 else pet[h-1,"horse"]) + (if h = 5 then 0 else pet[h+1,"horse"]) >= 1; /* the Lucky Strike smoker drinks orange juice */ f13{h in HOUSE}: smoke[h,"Lucky_Strike"] = drink[h,"orange_juice"]; /* the Japanese smokes Parliaments */ f14{h in HOUSE}: nationality[h,"Japanese"] = smoke[h,"Parliament"]; /* the Norwegian lives next to the blue house */ f15{h in HOUSE}: (1 - nationality[h,"Norwegian"]) + (if h = 1 then 0 else color[h-1,"blue"]) + (if h = 5 then 0 else color[h+1,"blue"]) >= 1; solve; printf "\n"; printf "HOUSE COLOR NATIONALITY DRINK SMOKE PET\n"; for {h in HOUSE} { printf "%5d", h; printf{c in COLOR: color[h,c]} " %-6s", c; printf{n in NATIONALITY: nationality[h,n]} " %-11s", n; printf{d in DRINK: drink[h,d]} " %-12s", d; printf{s in SMOKE: smoke[h,s]} " %-12s", s; printf{p in PET: pet[h,p]} " %-6s", p; printf "\n"; } printf "\n"; end; glpk-5.0/INSTALL0000644000062000006210000001661013766346220012537 0ustar maomkpasswdINSTALLING GLPK ON YOUR COMPUTER ******************************** Unpacking the distribution file ------------------------------- The GLPK package (like all other GNU software) is distributed in the form of a packed archive. It is one file named `glpk-X.Y.tar.gz', where `X' is the major version number and `Y' is the minor version number; for example, the archive name might be `glpk-5.0.tar.gz'. In order to prepare the distribution for installation you should: 1. Copy the GLPK distribution file to a working directory. 2. Unpack the distribution file with the following command: gzip -d glpk-X.Y.tar.gz After unpacking the distribution file is automatically renamed to `glpk-X.Y.tar'. 3. Unarchive the distribution file with the following command: tar -x < glpk-X.Y.tar It automatically creates the subdirectory `glpk-X.Y' containing the GLPK distribution. Configuring the package ----------------------- After unpacking and unarchiving the GLPK distribution you should configure the package, i.e. automatically tune it for your platform. Normally, you should just `cd' to the directory `glpk-X.Y' and run the `configure' script, e.g. ./configure 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 also creates file `config.h' containing platform-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, a file `config.cache' that saves the results of its tests to speed up reconfiguring, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). Running `configure' takes about a few seconds. While it is running, it displays some messages that tell you what it is doing. If you don't want to see the messages, run `configure' with its standard output redirected to `dev/null'; for example, `./configure > /dev/null'. By default both static and shared versions of the GLPK library will be compiled. Compilation of the shared librariy can be turned off by specifying the `--disable-shared' option to `configure', e.g. ./configure --disable-shared If you encounter problems building the library try using the above option, because some platforms do not support shared libraries. The GLPK package has some optional features listed below. By default all these features are disabled. To enable a feature the corresponding option should be passed to the configure script. --with-gmp Enable using the GNU MP bignum library This feature allows the exact simplex solver to use the GNU MP bignum library. If it is disabled, the exact simplex solver uses the GLPK bignum module, which provides the same functionality as GNU MP, however, it is much less efficient. For details about the GNU MP bignum library see its web page at . --enable-dl The same as --enable-dl=ltdl --enable-dl=ltdl Enable shared library support (GNU) --enable-dl=dlfcn Enable shared library support (POSIX) Currently this feature is only needed to provide dynamic linking to ODBC and MySQL shared libraries (see below). For details about the GNU shared library support see the manual at . --enable-odbc Enable using ODBC table driver (libiodbc) --enable-odbc=unix Enable using ODBC table driver (libodbc) This feature allows transmitting data between MathProg model objects and relational databases accessed through ODBC. For more details about this feature see the supplement "Using Data Tables in the GNU MathProg Modeling Language" (doc/tables.*). --enable-mysql Enable using MySQL table driver (libmysql) This feature allows transmitting data between MathProg model objects and MySQL relational databases. For more details about this feature see the supplement "Using Data Tables in the GNU MathProg Modeling Language" (doc/tables.*). Compiling the package --------------------- Normally, you can compile (build) the package by typing the command: make It reads `Makefile' generated by `configure' and performs all necessary jobs. If you want, you can override the `make' variables CFLAGS and LDFLAGS like this: make CFLAGS=-O2 LDFLAGS=-s To compile the package in a different directory from the one containing the source code, you must use a version of `make' that supports `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 for some reason `configure' is not in the source code directory that you are configuring, then it will report that it can't find the source code. In that case, run `configure' with the option `--srcdir=DIR', where DIR is the directory that contains the source code. Some systems require unusual options for compilation or linking that the `configure' script does not know about. You can give `configure' initial values for variables by setting them in the environment. Using a Bourne-compatible shell, you can do that on the command line like this: CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure Or on systems that have the `env' program, you can do it like this: env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure Here are the `make' variables that you might want to override with environment variables when running `configure'. For these variables, any value given in the environment overrides the value that `configure' would choose: CC: C compiler program. The default is `cc'. INSTALL: Program used to install files. The default value is `install' if you have it, otherwise `cp'. For these variables, any value given in the environment is added to the value that `configure' chooses: DEFS: Configuration options, in the form `-Dfoo -Dbar ...'. LIBS: Libraries to link with, in the form `-lfoo -lbar ...'. Checking the package -------------------- To check the package, i.e. to run some tests included in the package, you can use the following command: make check Installing the package ---------------------- Normally, to install the GLPK package you should type the following command: make install By default, `make install' will install the package's files in `usr/local/bin', `usr/local/lib', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PATH'. Alternately, you can do so by consistently giving a value for the `prefix' variable when you run `make', e.g. make prefix=/usr/gnu make prefix=/usr/gnu install After installing you can remove the program binaries and object files from the source directory by typing `make clean'. To remove all files that `configure' created (`Makefile', `config.status', etc.), just type `make distclean'. The file `configure.ac' is used to create `configure' by a program called `autoconf'. You only need it if you want to remake `configure' using a newer version of `autoconf'. Uninstalling the package ------------------------ To uninstall the GLPK package, i.e. to remove all the package's files from the system places, you can use the following command: make uninstall ======================================================================== glpk-5.0/install-sh0000755000062000006210000003325513766346220013516 0ustar maomkpasswd#!/bin/sh # install - install a program, script, or datafile scriptversion=2011-11-20.07; # UTC # 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. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false 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: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -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. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; 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 if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? 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 "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # 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: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # 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 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $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 $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 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. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: glpk-5.0/ltmain.sh0000755000062000006210000105377413766346220013346 0ustar maomkpasswd # libtool (GNU libtool) 2.4 # Written by Gordon Matzigkeit , 1996 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, # 2007, 2008, 2009, 2010 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. # GNU Libtool is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, # or obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Usage: $progname [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 # --mode=MODE use operation mode MODE # --preserve-dup-deps don't remove duplicate dependency libraries # --quiet, --silent don't print informational messages # --no-quiet, --no-silent # print informational messages (default) # --tag=TAG use configuration variables from tag TAG # -v, --verbose print more informational messages than default # --no-verbose don't print the extra informational messages # --version print version information # -h, --help, --help-all print short, long, or detailed help message # # 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. When passed as first option, # `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. # Try `$progname --help --mode=MODE' for a more detailed description of MODE. # # When reporting a bug, please describe a test case to reproduce it and # include the following information: # # host-triplet: $host # shell: $SHELL # compiler: $LTCC # compiler flags: $LTCFLAGS # linker: $LD (gnu? $with_gnu_ld) # $progname: (GNU libtool) 2.4 # automake: $automake_version # autoconf: $autoconf_version # # Report bugs to . # GNU libtool home page: . # General help using GNU software: . PROGRAM=libtool PACKAGE=libtool VERSION=2.4 TIMESTAMP="" package_revision=1.3294 # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs 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 BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } # NLS nuisances: We save the old values to restore during execute mode. lt_user_locale= lt_safe_locale= for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${$lt_var+set}\" = set; then save_$lt_var=\$$lt_var $lt_var=C export $lt_var lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" fi" done LC_ALL=C LANGUAGE=C export LANGUAGE LC_ALL $lt_unset CDPATH # 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" : ${CP="cp -f"} test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} : ${EGREP="/usr/bin/grep -E"} : ${FGREP="/usr/bin/grep -F"} : ${GREP="/usr/bin/grep"} : ${LN_S="ln -s"} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} : ${SED="/usr/bin/sed"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} : ${Xsed="$SED -e 1s/^X//"} # Global variables: EXIT_SUCCESS=0 EXIT_FAILURE=1 EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. exit_status=$EXIT_SUCCESS # Make sure IFS has a sensible default lt_nl=' ' IFS=" $lt_nl" dirname="s,/[^/]*$,," basename="s,^.*/,," # func_dirname file append nondir_replacement # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. func_dirname () { func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi } # func_dirname may be replaced by extended shell implementation # func_basename file func_basename () { func_basename_result=`$ECHO "${1}" | $SED "$basename"` } # func_basename may be replaced by extended shell implementation # func_dirname_and_basename file append nondir_replacement # perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value retuned in "$func_basename_result" # Implementation must be kept synchronized with func_dirname # and func_basename. For efficiency, we do not delegate to # those functions but instead duplicate the functionality here. func_dirname_and_basename () { # Extract subdirectory from the argument. func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` } # func_dirname_and_basename may be replaced by extended shell implementation # func_stripname prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # func_strip_suffix prefix name func_stripname () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname may be replaced by extended shell implementation # These SED scripts presuppose an absolute path with a trailing slash. pathcar='s,^/\([^/]*\).*$,\1,' pathcdr='s,^/[^/]*,,' removedotparts=':dotsl s@/\./@/@g t dotsl s,/\.$,/,' collapseslashes='s@/\{1,\}@/@g' finalslash='s,/*$,/,' # func_normal_abspath PATH # Remove doubled-up and trailing slashes, "." path components, # and cancel out any ".." path components in PATH after making # it an absolute path. # value returned in "$func_normal_abspath_result" func_normal_abspath () { # Start from root dir and reassemble the path. func_normal_abspath_result= func_normal_abspath_tpath=$1 func_normal_abspath_altnamespace= case $func_normal_abspath_tpath in "") # Empty path, that just means $cwd. func_stripname '' '/' "`pwd`" func_normal_abspath_result=$func_stripname_result return ;; # The next three entries are used to spot a run of precisely # two leading slashes without using negated character classes; # we take advantage of case's first-match behaviour. ///*) # Unusual form of absolute path, do nothing. ;; //*) # Not necessarily an ordinary path; POSIX reserves leading '//' # and for example Cygwin uses it to access remote file shares # over CIFS/SMB, so we conserve a leading double slash if found. func_normal_abspath_altnamespace=/ ;; /*) # Absolute path, do nothing. ;; *) # Relative path, prepend $cwd. func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath ;; esac # Cancel out all the simple stuff to save iterations. We also want # the path to end with a slash for ease of parsing, so make sure # there is one (and only one) here. func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` while :; do # Processed it all yet? if test "$func_normal_abspath_tpath" = / ; then # If we ascended to the root using ".." the result may be empty now. if test -z "$func_normal_abspath_result" ; then func_normal_abspath_result=/ fi break fi func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcar"` func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcdr"` # Figure out what to do with it case $func_normal_abspath_tcomponent in "") # Trailing empty path component, ignore it. ;; ..) # Parent dir; strip last assembled component from result. func_dirname "$func_normal_abspath_result" func_normal_abspath_result=$func_dirname_result ;; *) # Actual path component, append it. func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent ;; esac done # Restore leading double-slash if one was found on entry. func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result } # func_relative_path SRCDIR DSTDIR # generates a relative path from SRCDIR to DSTDIR, with a trailing # slash if non-empty, suitable for immediately appending a filename # without needing to append a separator. # value returned in "$func_relative_path_result" func_relative_path () { func_relative_path_result= func_normal_abspath "$1" func_relative_path_tlibdir=$func_normal_abspath_result func_normal_abspath "$2" func_relative_path_tbindir=$func_normal_abspath_result # Ascend the tree starting from libdir while :; do # check if we have found a prefix of bindir case $func_relative_path_tbindir in $func_relative_path_tlibdir) # found an exact match func_relative_path_tcancelled= break ;; $func_relative_path_tlibdir*) # found a matching prefix func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" func_relative_path_tcancelled=$func_stripname_result if test -z "$func_relative_path_result"; then func_relative_path_result=. fi break ;; *) func_dirname $func_relative_path_tlibdir func_relative_path_tlibdir=${func_dirname_result} if test "x$func_relative_path_tlibdir" = x ; then # Have to descend all the way to the root! func_relative_path_result=../$func_relative_path_result func_relative_path_tcancelled=$func_relative_path_tbindir break fi func_relative_path_result=../$func_relative_path_result ;; esac done # Now calculate path; take care to avoid doubling-up slashes. func_stripname '' '/' "$func_relative_path_result" func_relative_path_result=$func_stripname_result func_stripname '/' '/' "$func_relative_path_tcancelled" if test "x$func_stripname_result" != x ; then func_relative_path_result=${func_relative_path_result}/${func_stripname_result} fi # Normalisation. If bindir is libdir, return empty string, # else relative path ending with a slash; either way, target # file name can be directly appended. if test ! -z "$func_relative_path_result"; then func_stripname './' '' "$func_relative_path_result/" func_relative_path_result=$func_stripname_result fi } # The name of this program: func_dirname_and_basename "$progpath" progname=$func_basename_result # Make sure we have an absolute path for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) progdir=$func_dirname_result progdir=`cd "$progdir" && pwd` progpath="$progdir/$progname" ;; *) save_IFS="$IFS" IFS=: for progdir in $PATH; do IFS="$save_IFS" test -x "$progdir/$progname" && break done IFS="$save_IFS" test -n "$progdir" || progdir=`pwd` progpath="$progdir/$progname" ;; esac # 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='s/\([`"$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution that turns a string into a regex matching for the # string literally. sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' # Sed substitution that converts a w32 file name or path # which contains forward slashes, into one that contains # (escaped) backslashes. A very naive implementation. lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' # Re-`\' parameter expansions in output of double_quote_subst that were # `\'-ed in input to the same. If an odd number of `\' preceded a '$' # in input to double_quote_subst, that '$' was protected from expansion. # Since each input `\' is now two `\'s, look for any number of runs of # four `\'s followed by two `\'s and then a '$'. `\' that '$'. bs='\\' bs2='\\\\' bs4='\\\\\\\\' dollar='\$' sed_double_backslash="\ s/$bs4/&\\ /g s/^$bs2$dollar/$bs&/ s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g s/\n//g" # Standard options: opt_dry_run=false opt_help=false opt_quiet=false opt_verbose=false opt_warning=: # func_echo arg... # Echo program name prefixed message, along with the current mode # name if it has been set yet. func_echo () { $ECHO "$progname: ${opt_mode+$opt_mode: }$*" } # func_verbose arg... # Echo program name prefixed message in verbose mode only. func_verbose () { $opt_verbose && func_echo ${1+"$@"} # A bug in bash halts the script if the last line of a function # fails when set -e is in force, so we need another command to # work around that: : } # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } # func_error arg... # Echo program name prefixed message to standard error. func_error () { $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 } # func_warning arg... # Echo program name prefixed warning message to standard error. func_warning () { $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 # bash bug again: : } # func_fatal_error arg... # Echo program name prefixed message to standard error, and exit. func_fatal_error () { func_error ${1+"$@"} exit $EXIT_FAILURE } # func_fatal_help arg... # Echo program name prefixed message to standard error, followed by # a help hint, and exit. func_fatal_help () { func_error ${1+"$@"} func_fatal_error "$help" } help="Try \`$progname --help' for more information." ## default # func_grep expression filename # Check whether EXPRESSION matches any line of FILENAME, without output. func_grep () { $GREP "$1" "$2" >/dev/null 2>&1 } # func_mkdir_p directory-path # Make sure the entire path to DIRECTORY-PATH is available. func_mkdir_p () { my_directory_path="$1" my_dir_list= if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then # Protect directory names starting with `-' case $my_directory_path in -*) my_directory_path="./$my_directory_path" ;; esac # While some portion of DIR does not yet exist... while test ! -d "$my_directory_path"; do # ...make a list in topmost first order. Use a colon delimited # list incase some portion of path contains whitespace. my_dir_list="$my_directory_path:$my_dir_list" # If the last portion added has no slash in it, the list is done case $my_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` done my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` save_mkdir_p_IFS="$IFS"; IFS=':' for my_dir in $my_dir_list; do IFS="$save_mkdir_p_IFS" # mkdir can fail with a `File exist' error if two processes # try to create one of the directories concurrently. Don't # stop in that case! $MKDIR "$my_dir" 2>/dev/null || : done IFS="$save_mkdir_p_IFS" # Bail out if we (or some other process) failed to create a directory. test -d "$my_directory_path" || \ func_fatal_error "Failed to create \`$1'" fi } # func_mktempdir [string] # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, STRING is the basename for that directory. func_mktempdir () { my_template="${TMPDIR-/tmp}/${1-$progname}" if test "$opt_dry_run" = ":"; then # Return a directory name, but don't create it in dry-run mode my_tmpdir="${my_template}-$$" else # If mktemp works, use that first and foremost my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` if test ! -d "$my_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race my_tmpdir="${my_template}-${RANDOM-0}$$" save_mktempdir_umask=`umask` umask 0077 $MKDIR "$my_tmpdir" umask $save_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$my_tmpdir" || \ func_fatal_error "cannot create temporary directory \`$my_tmpdir'" fi $ECHO "$my_tmpdir" } # func_quote_for_eval arg # Aesthetically quote ARG to be evaled later. # This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT # is double-quoted, suitable for a subsequent eval, whereas # FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters # which are still active within double quotes backslashified. func_quote_for_eval () { case $1 in *[\\\`\"\$]*) func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; *) func_quote_for_eval_unquoted_result="$1" ;; esac case $func_quote_for_eval_unquoted_result in # Double-quote args containing shell metacharacters to delay # word splitting, command substitution and and variable # expansion for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" ;; *) func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" esac } # func_quote_for_expand arg # Aesthetically quote ARG to be evaled later; same as above, # but do not quote variable references. func_quote_for_expand () { case $1 in *[\\\`\"]*) my_arg=`$ECHO "$1" | $SED \ -e "$double_quote_subst" -e "$sed_double_backslash"` ;; *) my_arg="$1" ;; esac case $my_arg in # Double-quote args containing shell metacharacters to delay # word splitting and command substitution for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") my_arg="\"$my_arg\"" ;; esac func_quote_for_expand_result="$my_arg" } # func_show_eval cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. func_show_eval () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$my_cmd" my_status=$? if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_show_eval_locale cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. Use the saved locale for evaluation. func_show_eval_locale () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$lt_user_locale $my_cmd" my_status=$? eval "$lt_safe_locale" if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_tr_sh # Turn $1 into a string suitable for a shell variable name. # Result is stored in $func_tr_sh_result. All characters # not in the set a-zA-Z0-9_ are replaced with '_'. Further, # if $1 begins with a digit, a '_' is prepended as well. func_tr_sh () { case $1 in [0-9]* | *[!a-zA-Z0-9_]*) func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` ;; * ) func_tr_sh_result=$1 ;; esac } # func_version # Echo version message to standard output and exit. func_version () { $opt_debug $SED -n '/(C)/!b go :more /\./!{ N s/\n# / / b more } :go /^# '$PROGRAM' (GNU /,/# warranty; / { s/^# // s/^# *$// s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ p }' < "$progpath" exit $? } # func_usage # Echo short help message to standard output and exit. func_usage () { $opt_debug $SED -n '/^# Usage:/,/^# *.*--help/ { s/^# // s/^# *$// s/\$progname/'$progname'/ p }' < "$progpath" echo $ECHO "run \`$progname --help | more' for full usage" exit $? } # func_help [NOEXIT] # Echo long help message to standard output and exit, # unless 'noexit' is passed as argument. func_help () { $opt_debug $SED -n '/^# Usage:/,/# Report bugs to/ { :print s/^# // s/^# *$// s*\$progname*'$progname'* s*\$host*'"$host"'* s*\$SHELL*'"$SHELL"'* s*\$LTCC*'"$LTCC"'* s*\$LTCFLAGS*'"$LTCFLAGS"'* s*\$LD*'"$LD"'* s/\$with_gnu_ld/'"$with_gnu_ld"'/ s/\$automake_version/'"`(automake --version) 2>/dev/null |$SED 1q`"'/ s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/ p d } /^# .* home page:/b print /^# General help using/b print ' < "$progpath" ret=$? if test -z "$1"; then exit $ret fi } # func_missing_arg argname # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { $opt_debug func_error "missing argument for $1." exit_cmd=exit } # func_split_short_opt shortopt # Set func_split_short_opt_name and func_split_short_opt_arg shell # variables after splitting SHORTOPT after the 2nd character. func_split_short_opt () { my_sed_short_opt='1s/^\(..\).*$/\1/;q' my_sed_short_rest='1s/^..\(.*\)$/\1/;q' func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` } # func_split_short_opt may be replaced by extended shell implementation # func_split_long_opt longopt # Set func_split_long_opt_name and func_split_long_opt_arg shell # variables after splitting LONGOPT at the `=' sign. func_split_long_opt () { my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' my_sed_long_arg='1s/^--[^=]*=//' func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` } # func_split_long_opt may be replaced by extended shell implementation exit_cmd=: magic="%%%MAGIC variable%%%" magic_exe="%%%MAGIC EXE variable%%%" # Global variables. nonopt= preserve_args= lo2o="s/\\.lo\$/.${objext}/" o2lo="s/\\.${objext}\$/.lo/" extracted_archives= extracted_serial=0 # 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= # func_append var value # Append VALUE to the end of shell variable VAR. func_append () { eval "${1}=\$${1}\${2}" } # func_append may be replaced by extended shell implementation # func_append_quoted var value # Quote VALUE and append to the end of shell variable VAR, separated # by a space. func_append_quoted () { func_quote_for_eval "${2}" eval "${1}=\$${1}\\ \$func_quote_for_eval_result" } # func_append_quoted may be replaced by extended shell implementation # func_arith arithmetic-term... func_arith () { func_arith_result=`expr "${@}"` } # func_arith may be replaced by extended shell implementation # func_len string # STRING may not start with a hyphen. func_len () { func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` } # func_len may be replaced by extended shell implementation # func_lo2o object func_lo2o () { func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` } # func_lo2o may be replaced by extended shell implementation # func_xform libobj-or-source func_xform () { func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` } # func_xform may be replaced by extended shell implementation # func_fatal_configuration arg... # Echo program name prefixed message to standard error, followed by # a configuration failure hint, and exit. func_fatal_configuration () { func_error ${1+"$@"} func_error "See the $PACKAGE documentation for more information." func_fatal_error "Fatal configuration error." } # func_config # Display the configuration for all the tags in this script. func_config () { re_begincf='^# ### BEGIN LIBTOOL' re_endcf='^# ### END LIBTOOL' # Default configuration. $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" # Now print the configurations for the tags. for tagname in $taglist; do $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" done exit $? } # func_features # Display the features supported by this script. func_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 $? } # func_enable_tag tagname # Verify that TAGNAME is valid, and either flag an error and exit, or # enable the TAGNAME tag. We also add TAGNAME to the global $taglist # variable here. func_enable_tag () { # Global variable: tagname="$1" re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" sed_extractcf="/$re_begincf/,/$re_endcf/p" # Validate tagname. case $tagname in *[!-_A-Za-z0-9,/]*) func_fatal_error "invalid tag name: $tagname" ;; esac # Don't test for the "default" C tag, as we know it's # there but not specially marked. case $tagname in CC) ;; *) if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then taglist="$taglist $tagname" # Evaluate the configuration. Be careful to quote the path # and the sed script, to avoid splitting on whitespace, but # also don't use non-portable quotes within backquotes within # quotes we have to do it in 2 steps: extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` eval "$extractedcf" else func_error "ignoring unknown tag $tagname" fi ;; esac } # func_check_version_match # Ensure that we are using m4 macros, and libtool script from the same # release of libtool. func_check_version_match () { if test "$package_revision" != "$macro_revision"; then if test "$VERSION" != "$macro_version"; then if test -z "$macro_version"; then cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from an older release. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from $PACKAGE $macro_version. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF fi else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, $progname: but the definition of this LT_INIT comes from revision $macro_revision. $progname: You should recreate aclocal.m4 with macros from revision $package_revision $progname: of $PACKAGE $VERSION and run autoconf again. _LT_EOF fi exit $EXIT_MISMATCH fi } # Shorthand for --mode=foo, only valid as the first argument case $1 in clean|clea|cle|cl) shift; set dummy --mode clean ${1+"$@"}; shift ;; compile|compil|compi|comp|com|co|c) shift; set dummy --mode compile ${1+"$@"}; shift ;; execute|execut|execu|exec|exe|ex|e) shift; set dummy --mode execute ${1+"$@"}; shift ;; finish|finis|fini|fin|fi|f) shift; set dummy --mode finish ${1+"$@"}; shift ;; install|instal|insta|inst|ins|in|i) shift; set dummy --mode install ${1+"$@"}; shift ;; link|lin|li|l) shift; set dummy --mode link ${1+"$@"}; shift ;; uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) shift; set dummy --mode uninstall ${1+"$@"}; shift ;; esac # Option defaults: opt_debug=: opt_dry_run=false opt_config=false opt_preserve_dup_deps=false opt_features=false opt_finish=false opt_help=false opt_help_all=false opt_silent=: opt_verbose=: opt_silent=false opt_verbose=false # Parse options once, thoroughly. This comes as soon as possible in the # script to make things like `--version' happen as quickly as we can. { # this just eases exit handling while test $# -gt 0; do opt="$1" shift case $opt in --debug|-x) opt_debug='set -x' func_echo "enabling shell trace mode" $opt_debug ;; --dry-run|--dryrun|-n) opt_dry_run=: ;; --config) opt_config=: func_config ;; --dlopen|-dlopen) optarg="$1" opt_dlopen="${opt_dlopen+$opt_dlopen }$optarg" shift ;; --preserve-dup-deps) opt_preserve_dup_deps=: ;; --features) opt_features=: func_features ;; --finish) opt_finish=: set dummy --mode finish ${1+"$@"}; shift ;; --help) opt_help=: ;; --help-all) opt_help_all=: opt_help=': help-all' ;; --mode) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_mode="$optarg" case $optarg in # Valid mode arguments: clean|compile|execute|finish|install|link|relink|uninstall) ;; # Catch anything else as an error *) func_error "invalid argument for $opt" exit_cmd=exit break ;; esac shift ;; --no-silent|--no-quiet) opt_silent=false func_append preserve_args " $opt" ;; --no-verbose) opt_verbose=false func_append preserve_args " $opt" ;; --silent|--quiet) opt_silent=: func_append preserve_args " $opt" opt_verbose=false ;; --verbose|-v) opt_verbose=: func_append preserve_args " $opt" opt_silent=false ;; --tag) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_tag="$optarg" func_append preserve_args " $opt $optarg" func_enable_tag "$optarg" shift ;; -\?|-h) func_usage ;; --help) func_help ;; --version) func_version ;; # Separate optargs to long options: --*=*) func_split_long_opt "$opt" set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} shift ;; # Separate non-argument short options: -\?*|-h*|-n*|-v*) func_split_short_opt "$opt" set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} shift ;; --) break ;; -*) func_fatal_help "unrecognized option \`$opt'" ;; *) set dummy "$opt" ${1+"$@"}; shift; break ;; esac done # Validate options: # save first non-option argument if test "$#" -gt 0; then nonopt="$opt" shift fi # preserve --debug test "$opt_debug" = : || func_append preserve_args " --debug" case $host in *cygwin* | *mingw* | *pw32* | *cegcc*) # don't eliminate duplications in $postdeps and $predeps opt_duplicate_compiler_generated_deps=: ;; *) opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps ;; esac $opt_help || { # Sanity checks first: func_check_version_match if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then func_fatal_configuration "not configured to build any kind of library" fi # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Only execute mode is allowed to have -dlopen flags. if test -n "$opt_dlopen" && test "$opt_mode" != execute; then func_error "unrecognized option \`-dlopen'" $ECHO "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help="$help" help="Try \`$progname --help --mode=$opt_mode' for more information." } # Bail if the options were screwed $exit_cmd $EXIT_FAILURE } ## ----------- ## ## Main. ## ## ----------- ## # func_lalib_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_lalib_p () { test -f "$1" && $SED -e 4q "$1" 2>/dev/null \ | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 } # func_lalib_unsafe_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function implements the same check as func_lalib_p without # resorting to external programs. To this end, it redirects stdin and # closes it afterwards, without saving the original file descriptor. # As a safety measure, use it only where a negative result would be # fatal anyway. Works if `file' does not exist. func_lalib_unsafe_p () { lalib_p=no if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then for lalib_p_l in 1 2 3 4 do read lalib_p_line case "$lalib_p_line" in \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; esac done exec 0<&5 5<&- fi test "$lalib_p" = yes } # func_ltwrapper_script_p file # True iff FILE is a libtool wrapper script # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_script_p () { func_lalib_p "$1" } # func_ltwrapper_executable_p file # True iff FILE is a libtool wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_executable_p () { func_ltwrapper_exec_suffix= case $1 in *.exe) ;; *) func_ltwrapper_exec_suffix=.exe ;; esac $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 } # func_ltwrapper_scriptname file # Assumes file is an ltwrapper_executable # uses $file to determine the appropriate filename for a # temporary ltwrapper_script. func_ltwrapper_scriptname () { func_dirname_and_basename "$1" "" "." func_stripname '' '.exe' "$func_basename_result" func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" } # func_ltwrapper_p file # True iff FILE is a libtool wrapper script or wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_p () { func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" } # func_execute_cmds commands fail_cmd # Execute tilde-delimited COMMANDS. # If FAIL_CMD is given, eval that upon failure. # FAIL_CMD may read-access the current command in variable CMD! func_execute_cmds () { $opt_debug save_ifs=$IFS; IFS='~' for cmd in $1; do IFS=$save_ifs eval cmd=\"$cmd\" func_show_eval "$cmd" "${2-:}" done IFS=$save_ifs } # func_source file # Source FILE, adding directory component if necessary. # Note that it is not necessary on cygwin/mingw to append a dot to # FILE even if both FILE and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # `FILE.' does not work on cygwin managed mounts. func_source () { $opt_debug case $1 in */* | *\\*) . "$1" ;; *) . "./$1" ;; esac } # func_resolve_sysroot PATH # Replace a leading = in PATH with a sysroot. Store the result into # func_resolve_sysroot_result func_resolve_sysroot () { func_resolve_sysroot_result=$1 case $func_resolve_sysroot_result in =*) func_stripname '=' '' "$func_resolve_sysroot_result" func_resolve_sysroot_result=$lt_sysroot$func_stripname_result ;; esac } # func_replace_sysroot PATH # If PATH begins with the sysroot, replace it with = and # store the result into func_replace_sysroot_result. func_replace_sysroot () { case "$lt_sysroot:$1" in ?*:"$lt_sysroot"*) func_stripname "$lt_sysroot" '' "$1" func_replace_sysroot_result="=$func_stripname_result" ;; *) # Including no sysroot. func_replace_sysroot_result=$1 ;; esac } # 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 () { $opt_debug if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` 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 "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; # 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. func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case "$@ " in " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) # 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 func_echo "unable to infer tagged configuration" func_fatal_error "specify a tag with \`--tag'" # else # func_verbose "using $tagname tagged configuration" fi ;; esac fi } # func_write_libtool_object output_name pic_name nonpic_name # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. func_write_libtool_object () { write_libobj=${1} if test "$build_libtool_libs" = yes; then write_lobj=\'${2}\' else write_lobj=none fi if test "$build_old_libs" = yes; then write_oldobj=\'${3}\' else write_oldobj=none fi $opt_dry_run || { cat >${write_libobj}T </dev/null` if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | $SED -e "$lt_sed_naive_backslashify"` else func_convert_core_file_wine_to_w32_result= fi fi } # end: func_convert_core_file_wine_to_w32 # func_convert_core_path_wine_to_w32 ARG # Helper function used by path conversion functions when $build is *nix, and # $host is mingw, cygwin, or some other w32 environment. Relies on a correctly # configured wine environment available, with the winepath program in $build's # $PATH. Assumes ARG has no leading or trailing path separator characters. # # ARG is path to be converted from $build format to win32. # Result is available in $func_convert_core_path_wine_to_w32_result. # Unconvertible file (directory) names in ARG are skipped; if no directory names # are convertible, then the result may be empty. func_convert_core_path_wine_to_w32 () { $opt_debug # unfortunately, winepath doesn't convert paths, only file names func_convert_core_path_wine_to_w32_result="" if test -n "$1"; then oldIFS=$IFS IFS=: for func_convert_core_path_wine_to_w32_f in $1; do IFS=$oldIFS func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" if test -n "$func_convert_core_file_wine_to_w32_result" ; then if test -z "$func_convert_core_path_wine_to_w32_result"; then func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" else func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" fi fi done IFS=$oldIFS fi } # end: func_convert_core_path_wine_to_w32 # func_cygpath ARGS... # Wrapper around calling the cygpath program via LT_CYGPATH. This is used when # when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) # $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or # (2), returns the Cygwin file name or path in func_cygpath_result (input # file name or path is assumed to be in w32 format, as previously converted # from $build's *nix or MSYS format). In case (3), returns the w32 file name # or path in func_cygpath_result (input file name or path is assumed to be in # Cygwin format). Returns an empty string on error. # # ARGS are passed to cygpath, with the last one being the file name or path to # be converted. # # Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH # environment variable; do not put it in $PATH. func_cygpath () { $opt_debug if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` if test "$?" -ne 0; then # on failure, ensure result is empty func_cygpath_result= fi else func_cygpath_result= func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" fi } #end: func_cygpath # func_convert_core_msys_to_w32 ARG # Convert file name or path ARG from MSYS format to w32 format. Return # result in func_convert_core_msys_to_w32_result. func_convert_core_msys_to_w32 () { $opt_debug # awkward: cmd appends spaces to result func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` } #end: func_convert_core_msys_to_w32 # func_convert_file_check ARG1 ARG2 # Verify that ARG1 (a file name in $build format) was converted to $host # format in ARG2. Otherwise, emit an error message, but continue (resetting # func_to_host_file_result to ARG1). func_convert_file_check () { $opt_debug if test -z "$2" && test -n "$1" ; then func_error "Could not determine host file name corresponding to" func_error " \`$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback: func_to_host_file_result="$1" fi } # end func_convert_file_check # func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH # Verify that FROM_PATH (a path in $build format) was converted to $host # format in TO_PATH. Otherwise, emit an error message, but continue, resetting # func_to_host_file_result to a simplistic fallback value (see below). func_convert_path_check () { $opt_debug if test -z "$4" && test -n "$3"; then func_error "Could not determine the host path corresponding to" func_error " \`$3'" func_error "Continuing, but uninstalled executables may not work." # Fallback. This is a deliberately simplistic "conversion" and # should not be "improved". See libtool.info. if test "x$1" != "x$2"; then lt_replace_pathsep_chars="s|$1|$2|g" func_to_host_path_result=`echo "$3" | $SED -e "$lt_replace_pathsep_chars"` else func_to_host_path_result="$3" fi fi } # end func_convert_path_check # func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG # Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT # and appending REPL if ORIG matches BACKPAT. func_convert_path_front_back_pathsep () { $opt_debug case $4 in $1 ) func_to_host_path_result="$3$func_to_host_path_result" ;; esac case $4 in $2 ) func_append func_to_host_path_result "$3" ;; esac } # end func_convert_path_front_back_pathsep ################################################## # $build to $host FILE NAME CONVERSION FUNCTIONS # ################################################## # invoked via `$to_host_file_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # Result will be available in $func_to_host_file_result. # func_to_host_file ARG # Converts the file name ARG from $build format to $host format. Return result # in func_to_host_file_result. func_to_host_file () { $opt_debug $to_host_file_cmd "$1" } # end func_to_host_file # func_to_tool_file ARG LAZY # converts the file name ARG from $build format to toolchain format. Return # result in func_to_tool_file_result. If the conversion in use is listed # in (the comma separated) LAZY, no conversion takes place. func_to_tool_file () { $opt_debug case ,$2, in *,"$to_tool_file_cmd",*) func_to_tool_file_result=$1 ;; *) $to_tool_file_cmd "$1" func_to_tool_file_result=$func_to_host_file_result ;; esac } # end func_to_tool_file # func_convert_file_noop ARG # Copy ARG to func_to_host_file_result. func_convert_file_noop () { func_to_host_file_result="$1" } # end func_convert_file_noop # func_convert_file_msys_to_w32 ARG # Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_file_result. func_convert_file_msys_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_to_host_file_result="$func_convert_core_msys_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_w32 # func_convert_file_cygwin_to_w32 ARG # Convert file name ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_file_cygwin_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # because $build is cygwin, we call "the" cygpath in $PATH; no need to use # LT_CYGPATH in this case. func_to_host_file_result=`cygpath -m "$1"` fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_cygwin_to_w32 # func_convert_file_nix_to_w32 ARG # Convert file name ARG from *nix to w32 format. Requires a wine environment # and a working winepath. Returns result in func_to_host_file_result. func_convert_file_nix_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_file_wine_to_w32 "$1" func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_w32 # func_convert_file_msys_to_cygwin ARG # Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_file_msys_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_cygpath -u "$func_convert_core_msys_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_cygwin # func_convert_file_nix_to_cygwin ARG # Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed # in a wine environment, working winepath, and LT_CYGPATH set. Returns result # in func_to_host_file_result. func_convert_file_nix_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. func_convert_core_file_wine_to_w32 "$1" func_cygpath -u "$func_convert_core_file_wine_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_cygwin ############################################# # $build to $host PATH CONVERSION FUNCTIONS # ############################################# # invoked via `$to_host_path_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # The result will be available in $func_to_host_path_result. # # Path separators are also converted from $build format to $host format. If # ARG begins or ends with a path separator character, it is preserved (but # converted to $host format) on output. # # All path conversion functions are named using the following convention: # file name conversion function : func_convert_file_X_to_Y () # path conversion function : func_convert_path_X_to_Y () # where, for any given $build/$host combination the 'X_to_Y' value is the # same. If conversion functions are added for new $build/$host combinations, # the two new functions must follow this pattern, or func_init_to_host_path_cmd # will break. # func_init_to_host_path_cmd # Ensures that function "pointer" variable $to_host_path_cmd is set to the # appropriate value, based on the value of $to_host_file_cmd. to_host_path_cmd= func_init_to_host_path_cmd () { $opt_debug if test -z "$to_host_path_cmd"; then func_stripname 'func_convert_file_' '' "$to_host_file_cmd" to_host_path_cmd="func_convert_path_${func_stripname_result}" fi } # func_to_host_path ARG # Converts the path ARG from $build format to $host format. Return result # in func_to_host_path_result. func_to_host_path () { $opt_debug func_init_to_host_path_cmd $to_host_path_cmd "$1" } # end func_to_host_path # func_convert_path_noop ARG # Copy ARG to func_to_host_path_result. func_convert_path_noop () { func_to_host_path_result="$1" } # end func_convert_path_noop # func_convert_path_msys_to_w32 ARG # Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_path_result. func_convert_path_msys_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from ARG. MSYS # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; # and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_msys_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_msys_to_w32 # func_convert_path_cygwin_to_w32 ARG # Convert path ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_path_cygwin_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_cygwin_to_w32 # func_convert_path_nix_to_w32 ARG # Convert path ARG from *nix to w32 format. Requires a wine environment and # a working winepath. Returns result in func_to_host_file_result. func_convert_path_nix_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_nix_to_w32 # func_convert_path_msys_to_cygwin ARG # Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_path_msys_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_msys_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_msys_to_cygwin # func_convert_path_nix_to_cygwin ARG # Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a # a wine environment, working winepath, and LT_CYGPATH set. Returns result in # func_to_host_file_result. func_convert_path_nix_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from # ARG. msys behavior is inconsistent here, cygpath turns them # into '.;' and ';.', and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_nix_to_cygwin # func_mode_compile arg... func_mode_compile () { $opt_debug # 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= pie_flag= 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) test -n "$libobj" && \ func_fatal_error "you cannot specify \`-o' more than once" arg_mode=target continue ;; -pie | -fpie | -fPIE) func_append pie_flag " $arg" continue ;; -shared | -static | -prefer-pic | -prefer-non-pic) func_append 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,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result lastarg= save_ifs="$IFS"; IFS=',' for arg in $args; do IFS="$save_ifs" func_append_quoted lastarg "$arg" done IFS="$save_ifs" func_stripname ' ' '' "$lastarg" lastarg=$func_stripname_result # Add the arguments to base_compile. func_append 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. func_append_quoted base_compile "$lastarg" done # for arg case $arg_mode in arg) func_fatal_error "you must specify an argument for -Xcompile" ;; target) func_fatal_error "you must specify a target with \`-o'" ;; *) # Get the name of the library object. test -z "$libobj" && { func_basename "$srcfile" libobj="$func_basename_result" } ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo case $libobj in *.[cCFSifmso] | \ *.ada | *.adb | *.ads | *.asm | \ *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ *.[fF][09]? | *.for | *.java | *.obj | *.sx | *.cu | *.cup) func_xform "$libobj" libobj=$func_xform_result ;; esac case $libobj in *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; *) func_fatal_error "cannot determine name of library object from \`$libobj'" ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no continue ;; -static) build_libtool_libs=no build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done func_quote_for_eval "$libobj" test "X$libobj" != "X$func_quote_for_eval_result" \ && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ && func_warning "libobj name \`$libobj' may not contain shell special characters." func_dirname_and_basename "$obj" "/" "" objname="$func_basename_result" xdir="$func_dirname_result" lobj=${xdir}$objdir/$objname test -z "$base_compile" && \ func_fatal_help "you must specify a compilation command" # 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 # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2* | cegcc*) 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 "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} lockfile="$output_obj.lock" 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 $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "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." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi func_append removelist " $output_obj" $ECHO "$srcfile" > "$lockfile" fi $opt_dry_run || $RM $removelist func_append removelist " $lockfile" trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 srcfile=$func_to_tool_file_result func_quote_for_eval "$srcfile" qsrcfile=$func_quote_for_eval_result # Only build a PIC object if we are building libtool libraries. if test "$build_libtool_libs" = yes; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile if test "$pic_mode" != no; then command="$base_compile $qsrcfile $pic_flag" else # Don't build PIC code command="$base_compile $qsrcfile" fi func_mkdir_p "$xdir$objdir" if test -z "$output_obj"; then # Place PIC objects in $objdir func_append command " -o $lobj" fi func_show_eval_locale "$command" \ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/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." $opt_dry_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 func_show_eval '$MV "$output_obj" "$lobj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi # Allow error messages only from the first compilation. if test "$suppress_opt" = yes; then suppress_output=' >/dev/null 2>&1' fi fi # Only build a position-dependent object if we build old libraries. if test "$build_old_libs" = yes; then if test "$pic_mode" != yes; then # Don't build PIC code command="$base_compile $qsrcfile$pie_flag" else command="$base_compile $qsrcfile $pic_flag" fi if test "$compiler_c_o" = yes; then func_append command " -o $obj" fi # Suppress compiler output if we already did a PIC compilation. func_append command "$suppress_output" func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/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." $opt_dry_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 func_show_eval '$MV "$output_obj" "$obj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi fi $opt_dry_run || { func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" # Unlock the critical section if it was locked if test "$need_locks" != no; then removelist=$lockfile $RM "$lockfile" fi } exit $EXIT_SUCCESS } $opt_help || { test "$opt_mode" = compile && func_mode_compile ${1+"$@"} } func_mode_help () { # We need to display help for each of the modes. case $opt_mode in "") # Generic help is extracted from the usage comments # at the start of this file. func_help ;; clean) $ECHO \ "Usage: $progname [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: $progname [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 -no-suppress do not suppress compiler output for multiple passes -prefer-pic try to build PIC objects only -prefer-non-pic try to build non-PIC objects only -shared do not build a \`.o' file suitable for static linking -static only build a \`.o' file suitable for static linking -Wc,FLAG pass FLAG directly to the compiler 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: $progname [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: $progname [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: $progname [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 following components of INSTALL-COMMAND are treated specially: -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $ECHO \ "Usage: $progname [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 -bindir BINDIR specify path to binaries directory (for systems where libraries must be found in the PATH setting at runtime) -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 -shared only do dynamic linking of libtool libraries -shrext SUFFIX override the standard shared library file extension -static do not do any dynamic linking of uninstalled libtool libraries -static-libtool-libs do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] -weak LIBNAME declare that the target provides the LIBNAME interface -Wc,FLAG -Xcompiler FLAG pass linker-specific FLAG directly to the compiler -Wl,FLAG -Xlinker FLAG pass linker-specific FLAG directly to the linker -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) 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: $progname [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." ;; *) func_fatal_help "invalid operation mode \`$opt_mode'" ;; esac echo $ECHO "Try \`$progname --help' for more information about other modes." } # Now that we've collected a possible --mode arg, show help if necessary if $opt_help; then if test "$opt_help" = :; then func_mode_help else { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do func_mode_help done } | sed -n '1p; 2,$s/^Usage:/ or: /p' { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do echo func_mode_help done } | sed '1d /^When reporting/,/^Report/{ H d } $x /information about other modes/d /more detailed .*MODE/d s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' fi exit $? fi # func_mode_execute arg... func_mode_execute () { $opt_debug # The first argument is the command name. cmd="$nonopt" test -z "$cmd" && \ func_fatal_help "you must specify a COMMAND" # Handle -dlopen flags immediately. for file in $opt_dlopen; do test -f "$file" \ || func_fatal_help "\`$file' is not a file" dir= case $file in *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$lib' is not a valid libtool archive" # Read the libtool library. dlname= library_names= func_source "$file" # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && \ func_warning "\`$file' was not linked with \`-export-dynamic'" continue fi func_dirname "$file" "" "." dir="$func_dirname_result" if test -f "$dir/$objdir/$dlname"; then func_append dir "/$objdir" else if test ! -f "$dir/$dlname"; then func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" fi fi ;; *.lo) # Just add the directory containing the .lo file. func_dirname "$file" "" "." dir="$func_dirname_result" ;; *) func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" 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 -* | *.la | *.lo ) ;; *) # Do a test to see if this is really a libtool program. if func_ltwrapper_script_p "$file"; then func_source "$file" # Transform arg to wrapped name. file="$progdir/$program" elif func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" func_source "$func_ltwrapper_scriptname_result" # Transform arg to wrapped name. file="$progdir/$program" fi ;; esac # Quote arguments (to preserve shell metacharacters). func_append_quoted args "$file" done if test "X$opt_dry_run" = Xfalse; then if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${save_$lt_var+set}\" = set; then $lt_var=\$save_$lt_var; export $lt_var else $lt_unset $lt_var fi" done # 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 } test "$opt_mode" = execute && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $opt_debug libs= libdirs= admincmds= for opt in "$nonopt" ${1+"$@"} do if test -d "$opt"; then func_append libdirs " $opt" elif test -f "$opt"; then if func_lalib_unsafe_p "$opt"; then func_append libs " $opt" else func_warning "\`$opt' is not a valid libtool archive" fi else func_fatal_error "invalid argument \`$opt'" fi done if test -n "$libs"; then if test -n "$lt_sysroot"; then sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" else sysroot_cmd= fi # Remove sysroot references if $opt_dry_run; then for lib in $libs; do echo "removing references to $lt_sysroot and \`=' prefixes from $lib" done else tmpdir=`func_mktempdir` for lib in $libs; do sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ > $tmpdir/tmp-la mv -f $tmpdir/tmp-la $lib done ${RM}r "$tmpdir" fi fi if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. func_execute_cmds "$finish_cmds" 'admincmds="$admincmds '"$cmd"'"' fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $opt_dry_run || eval "$cmds" || func_append admincmds " $cmds" fi done fi # Exit here if they wanted silent mode. $opt_silent && exit $EXIT_SUCCESS if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then 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" case $host in solaris2.[6789]|solaris2.1[0-9]) echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" echo "pages." ;; *) echo "more information, such as the ld(1) and ld.so(8) manual pages." ;; esac echo "----------------------------------------------------------------------" fi exit $EXIT_SUCCESS } test "$opt_mode" = finish && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { $opt_debug # 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. case $nonopt in *shtool*) :;; *) false;; esac; then # Aesthetically quote it. func_quote_for_eval "$nonopt" install_prog="$func_quote_for_eval_result " arg=$1 shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. func_quote_for_eval "$arg" func_append install_prog "$func_quote_for_eval_result" install_shared_prog=$install_prog case " $install_prog " in *[\\\ /]cp\ *) install_cp=: ;; *) install_cp=false ;; esac # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=no stripme= no_mode=: for arg do arg2= if test -n "$dest"; then func_append files " $dest" dest=$arg continue fi case $arg in -d) isdir=yes ;; -f) if $install_cp; then :; else prev=$arg fi ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then if test "x$prev" = x-m && test -n "$install_override_mode"; then arg2=$install_override_mode no_mode=false fi prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. func_quote_for_eval "$arg" func_append install_prog " $func_quote_for_eval_result" if test -n "$arg2"; then func_quote_for_eval "$arg2" fi func_append install_shared_prog " $func_quote_for_eval_result" done test -z "$install_prog" && \ func_fatal_help "you must specify an install program" test -n "$prev" && \ func_fatal_help "the \`$prev' option requires an argument" if test -n "$install_override_mode" && $no_mode; then if $install_cp; then :; else func_quote_for_eval "$install_override_mode" func_append install_shared_prog " -m $func_quote_for_eval_result" fi fi if test -z "$files"; then if test -z "$dest"; then func_fatal_help "no file or destination specified" else func_fatal_help "you must specify a destination" fi fi # Strip any trailing slash from the destination. func_stripname '' '/' "$dest" dest=$func_stripname_result # Check to see that the destination is a directory. test -d "$dest" && isdir=yes if test "$isdir" = yes; then destdir="$dest" destname= else func_dirname_and_basename "$dest" "" "." destdir="$func_dirname_result" destname="$func_basename_result" # Not a directory, so check to see that there is only one file specified. set dummy $files; shift test "$#" -gt 1 && \ func_fatal_help "\`$dest' is not a directory" fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) func_fatal_help "\`$destdir' must be an absolute directory name" ;; 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. func_append staticlibs " $file" ;; *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$file' is not a valid libtool archive" library_names= old_library= relink_command= func_source "$file" # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) func_append current_libdirs " $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) func_append future_libdirs " $libdir" ;; esac fi func_dirname "$file" "/" "" dir="$func_dirname_result" func_append 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 -e "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. test "$inst_prefix_dir" = "$destdir" && \ func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" 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 func_warning "relinking \`$file'" func_show_eval "$relink_command" \ 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' fi # See the names of the shared library. set dummy $library_names; shift if test -n "$1"; then realname="$1" shift srcname="$realname" test -n "$relink_command" && srcname="$realname"T # Install the shared library and build the symlinks. func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ 'exit $?' tstripme="$stripme" case $host_os in cygwin* | mingw* | pw32* | cegcc*) case $realname in *.dll.a) tstripme="" ;; esac ;; esac if test -n "$tstripme" && test -n "$striplib"; then func_show_eval "$striplib $destdir/$realname" 'exit $?' fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. # Try `ln -sf' first, because the `ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname do test "$linkname" != "$realname" \ && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" done fi # Do each command in the postinstall commands. lib="$destdir/$realname" func_execute_cmds "$postinstall_cmds" 'exit $?' fi # Install the pseudo-library for information purposes. func_basename "$file" name="$func_basename_result" instname="$dir/$name"i func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' # Maybe install the static library, too. test -n "$old_library" && func_append 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 func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) func_lo2o "$destfile" staticdest=$func_lo2o_result ;; *.$objext) staticdest="$destfile" destfile= ;; *) func_fatal_help "cannot copy a libtool object to \`$destfile'" ;; esac # Install the libtool object if requested. test -n "$destfile" && \ func_show_eval "$install_prog $file $destfile" 'exit $?' # Install the old object if enabled. if test "$build_old_libs" = yes; then # Deduce the name of the old-style object file. func_lo2o "$file" staticobj=$func_lo2o_result func_show_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 func_basename "$file" destfile="$func_basename_result" 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 func_stripname '' '.exe' "$file" file=$func_stripname_result stripped_ext=".exe" fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin* | *mingw*) if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" wrapper=$func_ltwrapper_scriptname_result else func_stripname '' '.exe' "$file" wrapper=$func_stripname_result fi ;; *) wrapper=$file ;; esac if func_ltwrapper_script_p "$wrapper"; then notinst_deplibs= relink_command= func_source "$wrapper" # Check the variables that should have been set. test -z "$generated_by_libtool_version" && \ func_fatal_error "invalid libtool wrapper script \`$wrapper'" finalize=yes for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then func_source "$lib" fi libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test if test -n "$libdir" && test ! -f "$libfile"; then func_warning "\`$lib' has not been installed in \`$libdir'" finalize=no fi done relink_command= func_source "$wrapper" outputname= if test "$fast_install" = no && test -n "$relink_command"; then $opt_dry_run || { if test "$finalize" = yes; then tmpdir=`func_mktempdir` func_basename "$file$stripped_ext" file="$func_basename_result" outputname="$tmpdir/$file" # Replace the output file specification. relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` $opt_silent || { func_quote_for_expand "$relink_command" eval "func_echo $func_quote_for_expand_result" } if eval "$relink_command"; then : else func_error "error: relink \`$file' with the above command before installing it" $opt_dry_run || ${RM}r "$tmpdir" continue fi file="$outputname" else func_warning "cannot relink \`$file'" fi } else # Install the binary that we compiled earlier. file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyway case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) func_stripname '' '.exe' "$destfile" destfile=$func_stripname_result ;; esac ;; esac func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' $opt_dry_run || if test -n "$outputname"; then ${RM}r "$tmpdir" fi ;; esac done for file in $staticlibs; do func_basename "$file" name="$func_basename_result" # Set up the ranlib parameters. oldlib="$destdir/$name" func_show_eval "$install_prog \$file \$oldlib" 'exit $?' if test -n "$stripme" && test -n "$old_striplib"; then func_show_eval "$old_striplib $oldlib" 'exit $?' fi # Do each command in the postinstall commands. func_execute_cmds "$old_postinstall_cmds" 'exit $?' done test -n "$future_libdirs" && \ func_warning "remember to run \`$progname --finish$future_libdirs'" if test -n "$current_libdirs"; then # Maybe just do a dry run. $opt_dry_run && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi } test "$opt_mode" = install && func_mode_install ${1+"$@"} # func_generate_dlsyms outputname originator pic_p # Extract symbols from dlprefiles and create ${outputname}S.o with # a dlpreopen symbol table. func_generate_dlsyms () { $opt_debug my_outputname="$1" my_originator="$2" my_pic_p="${3-no}" my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` my_dlsyms= if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then if test -n "$NM" && test -n "$global_symbol_pipe"; then my_dlsyms="${my_outputname}S.c" else func_error "not configured to extract global symbols from dlpreopened files" fi fi if test -n "$my_dlsyms"; then case $my_dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist="$output_objdir/${my_outputname}.nm" func_show_eval "$RM $nlist ${nlist}S ${nlist}T" # Parse the name list into a source file. func_verbose "creating $output_objdir/$my_dlsyms" $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ /* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ /* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ #ifdef __cplusplus extern \"C\" { #endif #if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) #pragma GCC diagnostic ignored \"-Wstrict-prototypes\" #endif /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif /* External symbol declarations for the compiler. */\ " if test "$dlself" = yes; then func_verbose "generating symbol list for \`$output'" $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` for progfile in $progfiles; do func_to_tool_file "$progfile" func_convert_file_msys_to_w32 func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $opt_dry_run || { eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi if test -n "$export_symbols_regex"; then $opt_dry_run || { eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols="$output_objdir/$outputname.exp" $opt_dry_run || { $RM $export_symbols eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac } else $opt_dry_run || { eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac } fi fi for dlprefile in $dlprefiles; do func_verbose "extracting global C symbols from \`$dlprefile'" func_basename "$dlprefile" name="$func_basename_result" case $host in *cygwin* | *mingw* | *cegcc* ) # if an import library, we need to obtain dlname if func_win32_import_lib_p "$dlprefile"; then func_tr_sh "$dlprefile" eval "curr_lafile=\$libfile_$func_tr_sh_result" dlprefile_dlbasename="" if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then # Use subshell, to avoid clobbering current variable values dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` if test -n "$dlprefile_dlname" ; then func_basename "$dlprefile_dlname" dlprefile_dlbasename="$func_basename_result" else # no lafile. user explicitly requested -dlpreopen . $sharedlib_from_linklib_cmd "$dlprefile" dlprefile_dlbasename=$sharedlib_from_linklib_result fi fi $opt_dry_run || { if test -n "$dlprefile_dlbasename" ; then eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' else func_warning "Could not compute DLL name from $name" eval '$ECHO ": $name " >> "$nlist"' fi func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" } else # not an import lib $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } fi ;; *) $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } ;; esac done $opt_dry_run || { # 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/$my_dlsyms"' else echo '/* NONE */' >> "$output_objdir/$my_dlsyms" fi echo >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ typedef struct { const char *name; void *address; } lt_dlsymlist; extern LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[]; LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = {\ { \"$my_originator\", (void *) 0 }," case $need_lib_prefix in no) eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; *) eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; esac echo >> "$output_objdir/$my_dlsyms" "\ {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_${my_prefix}_LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " } # !$opt_dry_run pic_flag_for_symtable= case "$compile_command " in *" -static "*) ;; *) 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*) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; *-*-hpux*) pic_flag_for_symtable=" $pic_flag" ;; *) if test "X$my_pic_p" != Xno; then pic_flag_for_symtable=" $pic_flag" fi ;; esac ;; esac symtab_cflags= for arg in $LTCFLAGS; do case $arg in -pie | -fpie | -fPIE) ;; *) func_append symtab_cflags " $arg" ;; esac done # Now compile the dynamic symbol file. func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' # Clean up the generated files. func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' # Transform the symbol file into the correct name. symfileobj="$output_objdir/${my_outputname}S.$objext" case $host in *cygwin* | *mingw* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` else compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` fi ;; *) compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` ;; esac ;; *) func_fatal_error "unknown suffix for \`$my_dlsyms'" ;; 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 "$compile_command" | $SED "s% @SYMFILE@%%"` finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` fi } # 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. # Despite the name, also deal with 64 bit binaries. func_win32_libid () { $opt_debug 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 # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then func_to_tool_file "$1" func_convert_file_msys_to_w32 win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | $SED -n -e ' 1,100{ / I /{ s,.*,import, p q } }'` case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; esac 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_cygming_dll_for_implib ARG # # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib () { $opt_debug sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` } # func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs # # The is the core of a fallback implementation of a # platform-specific function to extract the name of the # DLL associated with the specified import library LIBNAME. # # SECTION_NAME is either .idata$6 or .idata$7, depending # on the platform and compiler that created the implib. # # Echos the name of the DLL associated with the # specified import library. func_cygming_dll_for_implib_fallback_core () { $opt_debug match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` $OBJDUMP -s --section "$1" "$2" 2>/dev/null | $SED '/^Contents of section '"$match_literal"':/{ # Place marker at beginning of archive member dllname section s/.*/====MARK====/ p d } # These lines can sometimes be longer than 43 characters, but # are always uninteresting /:[ ]*file format pe[i]\{,1\}-/d /^In archive [^:]*:/d # Ensure marker is printed /^====MARK====/p # Remove all lines with less than 43 characters /^.\{43\}/!d # From remaining lines, remove first 43 characters s/^.\{43\}//' | $SED -n ' # Join marker and all lines until next marker into a single line /^====MARK====/ b para H $ b para b :para x s/\n//g # Remove the marker s/^====MARK====// # Remove trailing dots and whitespace s/[\. \t]*$// # Print /./p' | # we now have a list, one entry per line, of the stringified # contents of the appropriate section of all members of the # archive which possess that section. Heuristic: eliminate # all those which have a first or second character that is # a '.' (that is, objdump's representation of an unprintable # character.) This should work for all archives with less than # 0x302f exports -- but will fail for DLLs whose name actually # begins with a literal '.' or a single character followed by # a '.'. # # Of those that remain, print the first one. $SED -e '/^\./d;/^.\./d;q' } # func_cygming_gnu_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is a GNU/binutils-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_gnu_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` test -n "$func_cygming_gnu_implib_tmp" } # func_cygming_ms_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is an MS-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_ms_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` test -n "$func_cygming_ms_implib_tmp" } # func_cygming_dll_for_implib_fallback ARG # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # # This fallback implementation is for use when $DLLTOOL # does not support the --identify-strict option. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib_fallback () { $opt_debug if func_cygming_gnu_implib_p "$1" ; then # binutils import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` elif func_cygming_ms_implib_p "$1" ; then # ms-generated import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` else # unknown sharedlib_from_linklib_result="" fi } # func_extract_an_archive dir oldlib func_extract_an_archive () { $opt_debug f_ex_an_ar_dir="$1"; shift f_ex_an_ar_oldlib="$1" if test "$lock_old_archive_extraction" = yes; then lockfile=$f_ex_an_ar_oldlib.lock until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done fi func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ 'stat=$?; rm -f "$lockfile"; exit $stat' if test "$lock_old_archive_extraction" = yes; then $opt_dry_run || rm -f "$lockfile" fi if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" fi } # func_extract_archives gentop oldlib ... func_extract_archives () { $opt_debug my_gentop="$1"; shift my_oldlibs=${1+"$@"} my_oldobjs="" my_xlib="" my_xabs="" my_xdir="" for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac func_basename "$my_xlib" my_xlib="$func_basename_result" my_xlib_u=$my_xlib while :; do case " $extracted_archives " in *" $my_xlib_u "*) func_arith $extracted_serial + 1 extracted_serial=$func_arith_result my_xlib_u=lt$extracted_serial-$my_xlib ;; *) break ;; esac done extracted_archives="$extracted_archives $my_xlib_u" my_xdir="$my_gentop/$my_xlib_u" func_mkdir_p "$my_xdir" case $host in *-darwin*) func_verbose "Extracting $my_xabs" # Do not bother doing anything if just a dry run $opt_dry_run || { darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` darwin_base_archive=`basename "$darwin_archive"` darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` if test -n "$darwin_arches"; then darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches ; do func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" func_extract_an_archive "`pwd`" "${darwin_base_archive}" cd "$darwin_curdir" $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" done # $darwin_arches ## Okay now we've a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` $LIPO -create -output "$darwin_file" $darwin_files done # $darwin_filelist $RM -rf unfat-$$ cd "$darwin_orig_dir" else cd $darwin_orig_dir func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches } # !$opt_dry_run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` done func_extract_archives_result="$my_oldobjs" } # func_emit_wrapper [arg=no] # # Emit a libtool wrapper script on stdout. # Don't directly open a file because we may want to # incorporate the script contents within a cygwin/mingw # wrapper executable. Must ONLY be called from within # func_mode_link because it depends on a number of variables # set therein. # # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR # variable will take. If 'yes', then the emitted script # will assume that the directory in which it is stored is # the $objdir directory. This is a cygwin/mingw-specific # behavior. func_emit_wrapper () { func_emit_wrapper_arg1=${1-no} $ECHO "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # 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. sed_quote_subst='$sed_quote_subst' # Be Bourne compatible if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs 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 BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variables: generated_by_libtool_version='$macro_version' 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 file=\"\$0\"" qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` $ECHO "\ # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } ECHO=\"$qECHO\" fi # Very basic option parsing. These options are (a) specific to # the libtool wrapper, (b) are identical between the wrapper # /script/ and the wrapper /executable/ which is used only on # windows platforms, and (c) all begin with the string "--lt-" # (application programs are unlikely to have options which match # this pattern). # # There are only two supported options: --lt-debug and # --lt-dump-script. There is, deliberately, no --lt-help. # # The first argument to this parsing function should be the # script's $0 value, followed by "$@". lt_option_debug= func_parse_lt_options () { lt_script_arg0=\$0 shift for lt_opt do case \"\$lt_opt\" in --lt-debug) lt_option_debug=1 ;; --lt-dump-script) lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` cat \"\$lt_dump_D/\$lt_dump_F\" exit 0 ;; --lt-*) \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 exit 1 ;; esac done # Print the debug banner immediately: if test -n \"\$lt_option_debug\"; then echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 fi } # Used when --lt-debug. Prints its arguments to stdout # (redirection is the responsibility of the caller) func_lt_dump_args () { lt_dump_args_N=1; for lt_arg do \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` done } # Core function for launching the target application func_exec_program_core () { " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2* | *-cegcc*) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $ECHO "\ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 exit 1 } # A function to encapsulate launching the target application # Strips options in the --lt-* namespace from \$@ and # launches target application with the remaining arguments. func_exec_program () { for lt_wr_arg do case \$lt_wr_arg in --lt-*) ;; *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; esac shift done func_exec_program_core \${1+\"\$@\"} } # Parse options func_parse_lt_options \"\$0\" \${1+\"\$@\"} # Find the directory that this script lives in. thisdir=\`\$ECHO \"\$file\" | $SED '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 \"\$file\" | $SED '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 \"\$file\" | $SED 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` done # Usually 'no', except on cygwin/mingw when embedded into # the cwrapper. WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then # special case for '.' if test \"\$thisdir\" = \".\"; then thisdir=\`pwd\` fi # remove .libs from thisdir case \"\$thisdir\" in *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; $objdir ) thisdir=. ;; esac fi # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test "$fast_install" = yes; then $ECHO "\ 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 "\ # 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 1 fi fi $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $RM \"\$progdir/\$program\"; $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } $RM \"\$progdir/\$file\" fi" else $ECHO "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $ECHO "\ if test -f \"\$progdir/\$program\"; then" # fixup the dll searchpath if we need to. # # Fix the DLL searchpath if we need to. Do this before prepending # to shlibpath, because on Windows, both are PATH and uninstalled # libraries must come first. if test -n "$dllsearchpath"; then $ECHO "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi # Export our shlibpath_var if we have one. if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $ECHO "\ # 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 \"\$$shlibpath_var\" | $SED 's/::*\$//'\` export $shlibpath_var " fi $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. func_exec_program \${1+\"\$@\"} 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 1 fi fi\ " } # func_emit_cwrapperexe_src # emit the source code for a wrapper executable on stdout # Must ONLY be called from within func_mode_link because # it depends on a number of variable set therein. func_emit_cwrapperexe_src () { cat < #include #ifdef _MSC_VER # include # include # include #else # include # include # ifdef __CYGWIN__ # include # endif #endif #include #include #include #include #include #include #include #include /* declarations of non-ANSI functions */ #if defined(__MINGW32__) # ifdef __STRICT_ANSI__ int _putenv (const char *); # endif #elif defined(__CYGWIN__) # ifdef __STRICT_ANSI__ char *realpath (const char *, char *); int putenv (char *); int setenv (const char *, const char *, int); # endif /* #elif defined (other platforms) ... */ #endif /* portability defines, excluding path handling macros */ #if defined(_MSC_VER) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv # define S_IXUSR _S_IEXEC # ifndef _INTPTR_T_DEFINED # define _INTPTR_T_DEFINED # define intptr_t int # endif #elif defined(__MINGW32__) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv #elif defined(__CYGWIN__) # define HAVE_SETENV # define FOPEN_WB "wb" /* #elif defined (other platforms) ... */ #endif #if defined(PATH_MAX) # define LT_PATHMAX PATH_MAX #elif defined(MAXPATHLEN) # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef S_IXOTH # define S_IXOTH 0 #endif #ifndef S_IXGRP # define S_IXGRP 0 #endif /* path handling portability macros */ #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ defined (__OS2__) # define HAVE_DOS_BASED_FILE_SYSTEM # define FOPEN_WB "wb" # ifndef DIR_SEPARATOR_2 # define DIR_SEPARATOR_2 '\\' # endif # ifndef PATH_SEPARATOR_2 # define PATH_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 */ #ifndef PATH_SEPARATOR_2 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) #else /* PATH_SEPARATOR_2 */ # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ #ifndef FOPEN_WB # define FOPEN_WB "w" #endif #ifndef _O_BINARY # define _O_BINARY 0 #endif #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free ((void *) stale); stale = 0; } \ } while (0) #if defined(LT_DEBUGWRAPPER) static int lt_debug = 1; #else static int lt_debug = 0; #endif const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ void *xmalloc (size_t num); char *xstrdup (const char *string); const char *base_name (const char *name); char *find_executable (const char *wrapper); char *chase_symlinks (const char *pathspec); int make_executable (const char *path); int check_executable (const char *path); char *strendzap (char *str, const char *pat); void lt_debugprintf (const char *file, int line, const char *fmt, ...); void lt_fatal (const char *file, int line, const char *message, ...); static const char *nonnull (const char *s); static const char *nonempty (const char *s); void lt_setenv (const char *name, const char *value); char *lt_extend_str (const char *orig_value, const char *add, int to_end); void lt_update_exe_path (const char *name, const char *value); void lt_update_lib_path (const char *name, const char *value); char **prepare_spawn (char **argv); void lt_dump_script (FILE *f); EOF cat <= 0) && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) return 1; else return 0; } int make_executable (const char *path) { int rval = 0; struct stat st; lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", nonempty (path)); if ((!path) || (!*path)) return 0; if (stat (path, &st) >= 0) { rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); } return rval; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise Does not chase symlinks, even on platforms that support them. */ char * find_executable (const char *wrapper) { int has_slash = 0; const char *p; const char *p_next; /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; int tmp_len; char *concat_name; lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", nonempty (wrapper)); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; /* Absolute path? */ #if defined (HAVE_DOS_BASED_FILE_SYSTEM) if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } else { #endif if (IS_DIR_SEPARATOR (wrapper[0])) { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } #if defined (HAVE_DOS_BASED_FILE_SYSTEM) } #endif for (p = wrapper; *p; p++) if (*p == '/') { has_slash = 1; break; } if (!has_slash) { /* no slashes; search PATH */ const char *path = getenv ("PATH"); if (path != NULL) { for (p = path; *p; p = p_next) { const char *q; size_t p_len; for (q = p; *q; q++) if (IS_PATH_SEPARATOR (*q)) break; p_len = q - p; p_next = (*q == '\0' ? q : q + 1); if (p_len == 0) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); } else { concat_name = XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, wrapper); } if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } } /* not found in PATH; assume curdir */ } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); return NULL; } char * chase_symlinks (const char *pathspec) { #ifndef S_ISLNK return xstrdup (pathspec); #else char buf[LT_PATHMAX]; struct stat s; char *tmp_pathspec = xstrdup (pathspec); char *p; int has_symlinks = 0; while (strlen (tmp_pathspec) && !has_symlinks) { lt_debugprintf (__FILE__, __LINE__, "checking path component for symlinks: %s\n", tmp_pathspec); if (lstat (tmp_pathspec, &s) == 0) { if (S_ISLNK (s.st_mode) != 0) { has_symlinks = 1; break; } /* search backwards for last DIR_SEPARATOR */ p = tmp_pathspec + strlen (tmp_pathspec) - 1; while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) p--; if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) { /* no more DIR_SEPARATORS left */ break; } *p = '\0'; } else { lt_fatal (__FILE__, __LINE__, "error accessing file \"%s\": %s", tmp_pathspec, nonnull (strerror (errno))); } } XFREE (tmp_pathspec); if (!has_symlinks) { return xstrdup (pathspec); } tmp_pathspec = realpath (pathspec, buf); if (tmp_pathspec == 0) { lt_fatal (__FILE__, __LINE__, "could not follow symlinks for %s", pathspec); } return xstrdup (tmp_pathspec); #endif } 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; } void lt_debugprintf (const char *file, int line, const char *fmt, ...) { va_list args; if (lt_debug) { (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); va_start (args, fmt); (void) vfprintf (stderr, fmt, args); va_end (args); } } static void lt_error_core (int exit_status, const char *file, int line, const char *mode, const char *message, va_list ap) { fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *file, int line, const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); va_end (ap); } static const char * nonnull (const char *s) { return s ? s : "(null)"; } static const char * nonempty (const char *s) { return (s && !*s) ? "(empty)" : nonnull (s); } void lt_setenv (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_setenv) setting '%s' to '%s'\n", nonnull (name), nonnull (value)); { #ifdef HAVE_SETENV /* always make a copy, for consistency with !HAVE_SETENV */ char *str = xstrdup (value); setenv (name, str, 1); #else int len = strlen (name) + 1 + strlen (value) + 1; char *str = XMALLOC (char, len); sprintf (str, "%s=%s", name, value); if (putenv (str) != EXIT_SUCCESS) { XFREE (str); } #endif } } char * lt_extend_str (const char *orig_value, const char *add, int to_end) { char *new_value; if (orig_value && *orig_value) { int orig_value_len = strlen (orig_value); int add_len = strlen (add); new_value = XMALLOC (char, add_len + orig_value_len + 1); if (to_end) { strcpy (new_value, orig_value); strcpy (new_value + orig_value_len, add); } else { strcpy (new_value, add); strcpy (new_value + add_len, orig_value); } } else { new_value = xstrdup (add); } return new_value; } void lt_update_exe_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); /* some systems can't cope with a ':'-terminated path #' */ int len = strlen (new_value); while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { new_value[len-1] = '\0'; } lt_setenv (name, new_value); XFREE (new_value); } } void lt_update_lib_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); lt_setenv (name, new_value); XFREE (new_value); } } EOF case $host_os in mingw*) cat <<"EOF" /* Prepares an argument vector before calling spawn(). Note that spawn() does not by itself call the command interpreter (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&v); v.dwPlatformId == VER_PLATFORM_WIN32_NT; }) ? "cmd.exe" : "command.com"). Instead it simply concatenates the arguments, separated by ' ', and calls CreateProcess(). We must quote the arguments since Win32 CreateProcess() interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a special way: - Space and tab are interpreted as delimiters. They are not treated as delimiters if they are surrounded by double quotes: "...". - Unescaped double quotes are removed from the input. Their only effect is that within double quotes, space and tab are treated like normal characters. - Backslashes not followed by double quotes are not special. - But 2*n+1 backslashes followed by a double quote become n backslashes followed by a double quote (n >= 0): \" -> " \\\" -> \" \\\\\" -> \\" */ #define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" #define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" char ** prepare_spawn (char **argv) { size_t argc; char **new_argv; size_t i; /* Count number of arguments. */ for (argc = 0; argv[argc] != NULL; argc++) ; /* Allocate new argument vector. */ new_argv = XMALLOC (char *, argc + 1); /* Put quoted arguments into the new argument vector. */ for (i = 0; i < argc; i++) { const char *string = argv[i]; if (string[0] == '\0') new_argv[i] = xstrdup ("\"\""); else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) { int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); size_t length; unsigned int backslashes; const char *s; char *quoted_string; char *p; length = 0; backslashes = 0; if (quote_around) length++; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') length += backslashes + 1; length++; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) length += backslashes + 1; quoted_string = XMALLOC (char, length + 1); p = quoted_string; backslashes = 0; if (quote_around) *p++ = '"'; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') { unsigned int j; for (j = backslashes + 1; j > 0; j--) *p++ = '\\'; } *p++ = c; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) { unsigned int j; for (j = backslashes; j > 0; j--) *p++ = '\\'; *p++ = '"'; } *p = '\0'; new_argv[i] = quoted_string; } else new_argv[i] = (char *) string; } new_argv[argc] = NULL; return new_argv; } EOF ;; esac cat <<"EOF" void lt_dump_script (FILE* f) { EOF func_emit_wrapper yes | $SED -e 's/\([\\"]\)/\\\1/g' \ -e 's/^/ fputs ("/' -e 's/$/\\n", f);/' cat <<"EOF" } EOF } # end: func_emit_cwrapperexe_src # func_emit_exe_manifest # emit a Win32 UAC manifest for executable on stdout # Must ONLY be called from within func_mode_link because # it depends on a number of variable set therein. func_emit_exe_manifest () { cat < EOF } # func_win32_import_lib_p ARG # True if ARG is an import lib, as indicated by $file_magic_cmd func_win32_import_lib_p () { $opt_debug case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in *import*) : ;; *) false ;; esac } # func_mode_link arg... func_mode_link () { $opt_debug case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out # which system we are compiling for in order to pass an extra # flag for every libtool invocation. # allow_undefined=no # FIXME: Unfortunately, there are problems with the above when trying # to make a dll which has undefined symbols, in which case not # even a static library is built. For now, we need to specify # -no-undefined on the libtool link line when we can be certain # that all symbols are satisfied, otherwise we get a static library. allow_undefined=yes ;; *) allow_undefined=yes ;; esac libtool_args=$nonopt base_compile="$nonopt $@" compile_command=$nonopt finalize_command=$nonopt compile_rpath= finalize_rpath= compile_shlibpath= finalize_shlibpath= convenience= old_convenience= deplibs= old_deplibs= compiler_flags= linker_flags= dllsearchpath= lib_search_path=`pwd` inst_prefix_dir= new_inherited_linker_flags= avoid_version=no bindir= dlfiles= dlprefiles= dlself=no export_dynamic=no export_symbols= export_symbols_regex= generated= libobjs= ltlibs= module=no no_install=no objs= non_pic_objects= precious_files_regex= prefer_static_libs=no preload=no prev= prevarg= release= rpath= xrpath= perm_rpath= temp_rpath= thread_safe=no vinfo= vinfo_number=no weak_libs= single_module="${wl}-single_module" func_infer_tag $base_compile # We need to know -static, to get the right output filenames. for arg do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no break ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then func_warning "complete static linking is impossible in this configuration" fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; -static) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built ;; -static-libtool-libs) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; esac build_libtool_libs=no build_old_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 func_quote_for_eval "$arg" qarg=$func_quote_for_eval_unquoted_result func_append libtool_args " $func_quote_for_eval_result" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) func_append compile_command " @OUTPUT@" func_append finalize_command " @OUTPUT@" ;; esac case $prev in bindir) bindir="$arg" prev= continue ;; dlfiles|dlprefiles) if test "$preload" = no; then # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append 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 func_append dlfiles " $arg" else func_append dlprefiles " $arg" fi prev= continue ;; esac ;; expsyms) export_symbols="$arg" test -f "$arg" \ || func_fatal_error "symbol file \`$arg' does not exist" prev= continue ;; expsyms_regex) export_symbols_regex="$arg" prev= continue ;; framework) case $host in *-*-darwin*) case "$deplibs " in *" $qarg.ltframework "*) ;; *) func_append deplibs " $qarg.ltframework" # this is fixed later ;; esac ;; esac prev= continue ;; inst_prefix) inst_prefix_dir="$arg" prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat "$save_arg"` do # func_append moreargs " $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" 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 func_append 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. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append 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 func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi done else func_fatal_error "link input file \`$arg' does not exist" fi arg=$save_arg prev= continue ;; precious_regex) precious_files_regex="$arg" prev= continue ;; release) release="-$arg" prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac if test "$prev" = rpath; then case "$rpath " in *" $arg "*) ;; *) func_append rpath " $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) func_append xrpath " $arg" ;; esac fi prev= continue ;; shrext) shrext_cmds="$arg" prev= continue ;; weak) func_append weak_libs " $arg" prev= continue ;; xcclinker) func_append linker_flags " $qarg" func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xcompiler) func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xlinker) func_append linker_flags " $qarg" func_append compiler_flags " $wl$qarg" prev= func_append compile_command " $wl$qarg" func_append finalize_command " $wl$qarg" 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 # See comment for -static flag below, for more details. func_append compile_command " $link_static_flag" func_append finalize_command " $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. func_fatal_error "\`-allow-undefined' must not be used because it is the default" ;; -avoid-version) avoid_version=yes continue ;; -bindir) prev=bindir 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 func_fatal_error "more than one -exported-symbols argument is not allowed" fi if test "X$arg" = "X-export-symbols"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework) prev=framework 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*) func_append compile_command " $arg" func_append finalize_command " $arg" ;; esac continue ;; -L*) func_stripname "-L" '' "$arg" if test -z "$func_stripname_result"; then if test "$#" -gt 0; then func_fatal_error "require no space between \`-L' and \`$1'" else func_fatal_error "need path for \`-L' option" fi fi func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` test -z "$absdir" && \ func_fatal_error "cannot determine absolute directory name of \`$dir'" dir="$absdir" ;; esac case "$deplibs " in *" -L$dir "* | *" $arg "*) # Will only happen for absolute or sysroot arguments ;; *) # Preserve sysroot, but never include relative directories case $dir in [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; *) func_append deplibs " -L$dir" ;; esac func_append lib_search_path " $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; ::) dllsearchpath=$dir;; *) func_append dllsearchpath ":$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac continue ;; -l*) if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) # These systems don't actually have a C or math library (as such) continue ;; *-*-os2*) # These systems don't actually have a C library (as such) test "X$arg" = "X-lc" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # 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 func_append deplibs " System.ltframework" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test "X$arg" = "X-lc" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test "X$arg" = "X-lc" && continue ;; esac elif test "X$arg" = "X-lc_r"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi func_append deplibs " $arg" continue ;; -module) module=yes continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. # Darwin uses the -arch flag to determine output architecture. -model|-arch|-isysroot|--sysroot) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" prev=xcompiler continue ;; -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case "$new_inherited_linker_flags " in *" $arg "*) ;; * ) func_append new_inherited_linker_flags " $arg" ;; esac continue ;; -multi_module) single_module="${wl}-multi_module" continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) # The PATH hackery in wrapper scripts is required on Windows # and Darwin in order for the loader to find any dlls it needs. func_warning "\`-no-install' is ignored for $host" func_warning "assuming \`-no-fast-install' instead" 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*) func_stripname '-R' '' "$arg" dir=$func_stripname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; =*) func_stripname '=' '' "$dir" dir=$lt_sysroot$func_stripname_result ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac continue ;; -shared) # The effects of -shared are defined in a previous loop. continue ;; -shrext) prev=shrext continue ;; -static | -static-libtool-libs) # 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 ;; -weak) prev=weak continue ;; -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $func_quote_for_eval_result" func_append compiler_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Wl,*) func_stripname '-Wl,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $wl$func_quote_for_eval_result" func_append compiler_flags " $wl$func_quote_for_eval_result" func_append linker_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # -msg_* for osf cc -msg_*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; # Flags to be passed through unchanged, with rationale: # -64, -mips[0-9] enable 64-bit mode for the SGI compiler # -r[0-9][0-9]* specify processor for the SGI compiler # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler # +DA*, +DD* enable 64-bit mode for the HP compiler # -q* compiler args for the IBM compiler # -m*, -t[45]*, -txscale* architecture-specific flags for GCC # -F/path path to uninstalled frameworks, gcc on darwin # -p, -pg, --coverage, -fprofile-* profiling flags for GCC # @file GCC response files # -tp=* Portland pgcc target processor selection # --sysroot=* for sysroot support # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization # -{shared,static}-libgcc, -static-{libgfortran|libstdc++} # link against specified runtime library # -fstack-protector* stack protector flags for GCC -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ -O*|-flto*|-fwhopr*|-fuse-linker-plugin| \ -shared-libgcc|-static-libgcc|-static-libgfortran|-static-libstdc++| \ -fstack-protector*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" func_append compile_command " $arg" func_append finalize_command " $arg" func_append compiler_flags " $arg" continue ;; # Some other compiler flag. -* | +*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; *.$objext) # A standard object. func_append objs " $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" 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 func_append 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. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append 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 func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi ;; *.$libext) # An archive. func_append deplibs " $arg" func_append old_deplibs " $arg" continue ;; *.la) # A libtool-controlled library. func_resolve_sysroot "$arg" if test "$prev" = dlfiles; then # This library was specified with -dlopen. func_append dlfiles " $func_resolve_sysroot_result" prev= elif test "$prev" = dlprefiles; then # The library was specified with -dlpreopen. func_append dlprefiles " $func_resolve_sysroot_result" prev= else func_append deplibs " $func_resolve_sysroot_result" 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. func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then func_append compile_command " $arg" func_append finalize_command " $arg" fi done # argument parsing loop test -n "$prev" && \ func_fatal_help "the \`$prevarg' option requires an argument" if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" func_append compile_command " $arg" func_append finalize_command " $arg" fi oldlibs= # calculate the name of the file, without its directory func_basename "$output" outputname="$func_basename_result" libobjs_save="$libobjs" if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'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\" func_dirname "$output" "/" "" output_objdir="$func_dirname_result$objdir" func_to_tool_file "$output_objdir/" tool_output_objdir=$func_to_tool_file_result # Create the object directory. func_mkdir_p "$output_objdir" # Determine the type of output case $output in "") func_fatal_help "you must specify an output file" ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. 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 $opt_preserve_dup_deps ; then case "$libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append 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 $opt_duplicate_compiler_generated_deps; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; esac func_append 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 dlpreopen link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" ;; 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 # The preopen pass in lib mode reverses $deplibs; put it back here # so that -L comes before libs that need it for instance... if test "$linkmode,$pass" = "lib,link"; then ## FIXME: Find the place where the list is rebuilt in the wrong ## order, and fix it there properly tmp_deplibs= for deplib in $deplibs; do tmp_deplibs="$deplib $tmp_deplibs" done deplibs="$tmp_deplibs" fi 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 "$linkmode,$pass" = "lib,dlpreopen"; then # Collect and forward deplibs of preopened libtool libs for lib in $dlprefiles; do # Ignore non-libtool-libs dependency_libs= func_resolve_sysroot "$lib" case $lib in *.la) func_source "$func_resolve_sysroot_result" ;; esac # Collect preopened libtool deplibs, except any this library # has declared as weak libs for deplib in $dependency_libs; do func_basename "$deplib" deplib_base=$func_basename_result case " $weak_libs " in *" $deplib_base "*) ;; *) func_append deplibs " $deplib" ;; esac done done libs="$dlprefiles" 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|-threads) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append compiler_flags " $deplib" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -l*) if test "$linkmode" != lib && test "$linkmode" != prog; then func_warning "\`-l' is ignored for archives/objects" continue fi func_stripname '-l' '' "$deplib" name=$func_stripname_result if test "$linkmode" = lib; then searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" else searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" fi for searchdir in $searchdirs; 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 func_lalib_p "$lib"; then library_names= old_library= func_source "$lib" 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 func_dirname "$lib" "" "." ladir="$func_dirname_result" 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 *.ltframework) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test "$pass" = conv && continue newdependency_libs="$deplib $newdependency_libs" func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; 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 func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; *) func_warning "\`-L' is ignored for archives/objects" ;; esac # linkmode continue ;; # -L -R*) if test "$pass" = link; then func_stripname '-R' '' "$deplib" func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) func_resolve_sysroot "$deplib" lib=$func_resolve_sysroot_result ;; *.$libext) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) # Linking convenience modules into shared libraries is allowed, # but linking other static libraries is non-portable. case " $dlpreconveniencelibs " in *" $deplib "*) ;; *) valid_a_lib=no case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=yes fi ;; pass_all) valid_a_lib=yes ;; esac if test "$valid_a_lib" != yes; 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 use here." else echo $ECHO "*** Warning: Linking the shared library $output against the" $ECHO "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" fi ;; esac 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. func_append newdlprefiles " $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append newdlfiles " $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=yes continue ;; esac # case $deplib if test "$found" = yes || test -f "$lib"; then : else func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" fi # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$lib" \ || func_fatal_error "\`$lib' is not a valid libtool archive" func_dirname "$lib" "" "." ladir="$func_dirname_result" dlname= dlopen= dlpreopen= libdir= library_names= old_library= inherited_linker_flags= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no avoidtemprpath= # Read the .la file func_source "$lib" # Convert "-framework foo" to "foo.ltframework" if test -n "$inherited_linker_flags"; then tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do case " $new_inherited_linker_flags " in *" $tmp_inherited_linker_flag "*) ;; *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; esac done fi dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan" || { test "$linkmode" != prog && test "$linkmode" != lib; }; then test -n "$dlopen" && func_append dlfiles " $dlopen" test -n "$dlpreopen" && func_append 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 func_fatal_error "cannot find name of link library for \`$lib'" fi # It is a libtool convenience library, so add in its objects. func_append convenience " $ladir/$objdir/$old_library" func_append old_convenience " $ladir/$objdir/$old_library" elif test "$linkmode" != prog && test "$linkmode" != lib; then func_fatal_error "\`$lib' is not a convenience library" fi tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done continue fi # $pass = conv # Get the name of the library we link against. linklib= if test -n "$old_library" && { test "$prefer_static_libs" = yes || test "$prefer_static_libs,$installed" = "built,no"; }; then linklib=$old_library else for l in $old_library $library_names; do linklib="$l" done fi if test -z "$linklib"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # This library was specified with -dlopen. if test "$pass" = dlopen; then if test -z "$libdir"; then func_fatal_error "cannot -dlopen a convenience library: \`$lib'" 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. func_append dlprefiles " $lib $dependency_libs" else func_append 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 func_warning "cannot determine absolute directory name of \`$ladir'" func_warning "passing it literally to the linker, although it might fail" abs_ladir="$ladir" fi ;; esac func_basename "$lib" laname="$func_basename_result" # Find the relevant object directory and library name. if test "X$installed" = Xyes; then if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then func_warning "library \`$lib' was moved." dir="$ladir" absdir="$abs_ladir" libdir="$abs_ladir" else dir="$lt_sysroot$libdir" absdir="$lt_sysroot$libdir" fi test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then dir="$ladir" absdir="$abs_ladir" # Remove this search path later func_append notinst_path " $abs_ladir" else dir="$ladir/$objdir" absdir="$abs_ladir/$objdir" # Remove this search path later func_append notinst_path " $abs_ladir" fi fi # $installed = yes func_stripname 'lib' '.la' "$laname" name=$func_stripname_result # This library was specified with -dlpreopen. if test "$pass" = dlpreopen; then if test -z "$libdir" && test "$linkmode" = prog; then func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" fi case "$host" in # special handling for platforms with PE-DLLs. *cygwin* | *mingw* | *cegcc* ) # Linker will automatically link against shared library if both # static and shared are present. Therefore, ensure we extract # symbols from the import library if a shared library is present # (otherwise, the dlopen module name will be incorrect). We do # this by putting the import library name into $newdlprefiles. # We recover the dlopen module name by 'saving' the la file # name in a special purpose variable, and (later) extracting the # dlname from the la file. if test -n "$dlname"; then func_tr_sh "$dir/$linklib" eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" func_append newdlprefiles " $dir/$linklib" else func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" fi ;; * ) # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then func_append newdlprefiles " $dir/$dlname" else func_append newdlprefiles " $dir/$linklib" fi ;; esac 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 func_append 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*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; 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 $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append 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 "$prefer_static_libs,$installed" = "built,yes"; } || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then # Make sure the rpath contains only unique directories. case "$temp_rpath:" in *"$absdir:"*) ;; *) func_append temp_rpath "$absdir:" ;; 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 "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append 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 use_static_libs=$prefer_static_libs if test "$use_static_libs" = built && test "$installed" = yes; then use_static_libs=no fi if test -n "$library_names" && { test "$use_static_libs" = no || test -z "$old_library"; }; then case $host in *cygwin* | *mingw* | *cegcc*) # No point in relinking DLLs because paths are not encoded func_append notinst_deplibs " $lib" need_relink=no ;; *) if test "$installed" = no; then func_append notinst_deplibs " $lib" need_relink=yes fi ;; esac # This is a shared library # Warn about portability, can't link against -module's on some # systems (darwin). Don't bleat about dlopened modules though! dlopenmodule="" for dlpremoduletest in $dlprefiles; do if test "X$dlpremoduletest" = "X$lib"; then dlopenmodule="$dlpremoduletest" break fi done if test -z "$dlopenmodule" && 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 "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names shift realname="$1" 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* | *cegcc*) func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; esac eval soname=\"$soname_spec\" else soname="$realname" fi # Make a new name for the extract_expsyms_cmds to use soroot="$soname" func_basename "$soroot" soname="$func_basename_result" func_stripname 'lib' '.dll' "$soname" newlib=libimp-$func_stripname_result.a # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else func_verbose "extracting exported symbol list from \`$soname'" func_execute_cmds "$extract_expsyms_cmds" 'exit $?' fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else func_verbose "generating import library for \`$soname'" func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' 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 "$opt_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.0.[024]*) add_dir="-L$dir" ;; *-*-sysv4*uw2*) add_dir="-L$dir" ;; *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ *-*-unixware7*) add_dir="-L$dir" ;; *-*-darwin* ) # if the lib is a (non-dlopened) module then we can not # link against it, someone is ignoring the earlier warnings if /usr/bin/file -L $add 2> /dev/null | $GREP ": [^:]* bundle" >/dev/null ; then if test "X$dlopenmodule" != "X$lib"; 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 elif test -n "$old_library"; then 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 && test "$hardcode_direct_absolute" = no; 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 [\\/]*) func_append 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 func_fatal_configuration "unsupported hardcode properties" fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) func_append 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:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac fi fi fi if test "$linkmode" = prog || test "$opt_mode" = relink; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; 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:"*) ;; *) func_append 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 [\\/]*) func_append 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 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*) func_stripname '-R' '' "$libdir" temp_xrpath=$func_stripname_result case " $xrpath " in *" $temp_xrpath "*) ;; *) func_append xrpath " $temp_xrpath";; esac;; *) func_append temp_deplibs " $libdir";; esac done dependency_libs="$temp_deplibs" fi func_append 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" case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result";; *) func_resolve_sysroot "$deplib" ;; esac if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $func_resolve_sysroot_result "*) func_append specialdeplibs " $func_resolve_sysroot_result" ;; esac fi func_append tmp_libs " $func_resolve_sysroot_result" done if test "$link_all_deplibs" != no; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do path= case $deplib in -L*) path="$deplib" ;; *.la) func_resolve_sysroot "$deplib" deplib=$func_resolve_sysroot_result func_dirname "$deplib" "" "." dir=$func_dirname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then func_warning "cannot determine absolute directory name of \`$dir'" absdir="$dir" fi ;; esac if $GREP "^installed=no" $deplib > /dev/null; then case $host in *-*-darwin*) depdepl= 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 "$absdir/$objdir/$depdepl" ; then depdepl="$absdir/$objdir/$depdepl" darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` if test -z "$darwin_install_name"; then darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` fi func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" path= fi fi ;; *) path="-L$absdir/$objdir" ;; esac else eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" test "$absdir" != "$libdir" && \ func_warning "\`$deplib' seems to be moved" path="-L$absdir" fi ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$path $deplibs" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs if test "$pass" = link; then if test "$linkmode" = "prog"; then compile_deplibs="$new_inherited_linker_flags $compile_deplibs" finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" else compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` fi fi 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 "*) ;; *) func_append 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 "*) ;; *) func_append tmp_libs " $deplib" ;; esac ;; *) func_append 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 func_append tmp_libs " $i" fi done dependency_libs=$tmp_libs done # for pass if test "$linkmode" = prog; then dlfiles="$newdlfiles" fi if test "$linkmode" = prog || test "$linkmode" = lib; then dlprefiles="$newdlprefiles" fi case $linkmode in oldlib) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for archives" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for archives" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for archives" test -n "$xrpath" && \ func_warning "\`-R' is ignored for archives" test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for archives" test -n "$release" && \ func_warning "\`-release' is ignored for archives" test -n "$export_symbols$export_symbols_regex" && \ func_warning "\`-export-symbols' is ignored for archives" # Now set the variables for building old libraries. build_libtool_libs=no oldlibs="$output" func_append objs "$old_deplibs" ;; lib) # Make sure we only generate libraries of the form `libNAME.la'. case $outputname in lib*) func_stripname 'lib' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) test "$module" = no && \ func_fatal_help "libtool library \`$output' must begin with \`lib'" if test "$need_lib_prefix" != no; then # Add the "lib" prefix for modules if required func_stripname '' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else func_stripname '' '.la' "$outputname" libname=$func_stripname_result fi ;; esac if test -n "$objs"; then if test "$deplibs_check_method" != pass_all; then func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" else echo $ECHO "*** Warning: Linking the shared library $output against the non-libtool" $ECHO "*** objects $objs is not portable!" func_append libobjs " $objs" fi fi test "$dlself" != no && \ func_warning "\`-dlopen self' is ignored for libtool libraries" set dummy $rpath shift test "$#" -gt 1 && \ func_warning "ignoring multiple \`-rpath's for a libtool library" install_libdir="$1" 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 test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for convenience libraries" test -n "$release" && \ func_warning "\`-release' is ignored for convenience libraries" else # Parse the version information argument. save_ifs="$IFS"; IFS=':' set dummy $vinfo 0 0 0 shift IFS="$save_ifs" test -n "$7" && \ func_fatal_help "too many parameters to \`-version-info'" # 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="$1" number_minor="$2" number_revision="$3" # # 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|none) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_revision" ;; freebsd-aout|freebsd-elf|qnx|sunos) current="$number_major" revision="$number_minor" age="0" ;; irix|nonstopux) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_minor" lt_irix_increment=no ;; esac ;; no) current="$1" revision="$2" age="$3" ;; esac # Check that each of the things are valid numbers. case $current in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "CURRENT \`$current' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $revision in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "REVISION \`$revision' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $age in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "AGE \`$age' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac if test "$age" -gt "$current"; then func_error "AGE \`$age' is greater than the current interface number \`$current'" func_fatal_error "\`$vinfo' is not valid version information" 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 func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" # Darwin ld doesn't like 0 for these options... func_arith $current + 1 minor_current=$func_arith_result xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" 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) if test "X$lt_irix_increment" = "Xno"; then func_arith $current - $age else func_arith $current - $age + 1 fi major=$func_arith_result 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 func_arith $revision - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring_prefix$major.$iface:$verstring" done # Before this point, $major must not contain `.'. major=.$major versuffix="$major.$revision" ;; linux) func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" ;; osf) func_arith $current - $age major=.$func_arith_result 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 func_arith $current - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring:${iface}.0" done # Make executables depend on our current version. func_append verstring ":${current}.0" ;; qnx) major=".$current" versuffix=".$current" ;; sunos) major=".$current" versuffix=".$current.$revision" ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 filesystems. func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; *) func_fatal_configuration "unknown library version type \`$version_type'" ;; 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 func_warning "undefined symbols not allowed in $host shared libraries" build_libtool_libs=no build_old_libs=yes fi else # Don't allow undefined symbols. allow_undefined_flag="$no_undefined_flag" fi fi func_generate_dlsyms "$libname" "$libname" "yes" func_append libobjs " $symfileobj" test "X$libobjs" = "X " && libobjs= if test "$opt_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 | *.gcno) ;; $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 func_append removelist " $p" ;; *) ;; esac done test -n "$removelist" && \ func_show_eval "${RM}r \$removelist" fi # Now set the variables for building old libraries. if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then func_append oldlibs " $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` # dependency_libs=`$ECHO "$dependency_libs " | $SED "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 func_replace_sysroot "$libdir" func_append temp_xrpath " -R$func_replace_sysroot_result" case "$finalize_rpath " in *" $libdir "*) ;; *) func_append 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 "*) ;; *) func_append 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 "*) ;; *) func_append dlprefiles " $lib" ;; esac done if test "$build_libtool_libs" = yes; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework func_append deplibs " System.ltframework" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work ;; *) # Add libc to deplibs on all other systems if necessary. if test "$build_libtool_need_lc" = "yes"; then func_append 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. $opt_dry_run || $RM conftest.c cat > conftest.c </dev/null` $nocaseglob else potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` fi 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 "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | $SED -e 10q | $EGREP "$file_magic_regex" > /dev/null; then func_append 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 ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` for a_deplib in $deplibs; do case $a_deplib in -l*) func_stripname -l '' "$a_deplib" name=$func_stripname_result if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $a_deplib "*) func_append 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 func_append 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 ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; none | unknown | *) newdeplibs="" tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; 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 " $tmp_deplibs" | $SED "s,$i,,"` done fi case $tmp_deplibs in *[!\ \ ]*) 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 ;; esac ;; 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 with the System framework newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` ;; 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 # Time to change all our "foo.ltframework" stuff back to "-framework foo" case $host in *-*-darwin*) newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done deplibs="$new_libs" # 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 "$opt_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 func_replace_sysroot "$libdir" libdir=$func_replace_sysroot_result 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"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append dep_rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_apped 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 func_append 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 "$opt_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 shift realname="$1" 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" linknames= for link do func_append linknames " $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` test "X$libobjs" = "X " && libobjs= delfiles= if test -n "$export_symbols" && test -n "$include_expsyms"; then $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" export_symbols="$output_objdir/$libname.uexp" func_append delfiles " $export_symbols" fi orig_export_symbols= case $host_os in cygwin* | mingw* | cegcc*) if test -n "$export_symbols" && test -z "$export_symbols_regex"; then # exporting using user supplied symfile if test "x`$SED 1q $export_symbols`" != xEXPORTS; then # and it's NOT already a .def file. Must figure out # which of the given symbols are data symbols and tag # them as such. So, trigger use of export_symbols_cmds. # export_symbols gets reassigned inside the "prepare # the list of exported symbols" if statement, so the # include_expsyms logic still works. orig_export_symbols="$export_symbols" export_symbols= always_export_symbols=yes fi fi ;; esac # Prepare the list of exported symbols if test -z "$export_symbols"; then if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols cmds=$export_symbols_cmds save_ifs="$IFS"; IFS='~' for cmd1 in $cmds; do IFS="$save_ifs" # Take the normal branch if the nm_file_list_spec branch # doesn't work or if tool conversion is not needed. case $nm_file_list_spec~$to_tool_file_cmd in *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) try_normal_branch=yes eval cmd=\"$cmd1\" func_len " $cmd" len=$func_len_result ;; *) try_normal_branch=no ;; esac if test "$try_normal_branch" = yes \ && { test "$len" -lt "$max_cmd_len" \ || test "$max_cmd_len" -le -1; } then func_show_eval "$cmd" 'exit $?' skipped_export=false elif test -n "$nm_file_list_spec"; then func_basename "$output" output_la=$func_basename_result save_libobjs=$libobjs save_output=$output output=${output_objdir}/${output_la}.nm func_to_tool_file "$output" libobjs=$nm_file_list_spec$func_to_tool_file_result func_append delfiles " $output" func_verbose "creating $NM input file list: $output" for obj in $save_libobjs; do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > "$output" eval cmd=\"$cmd1\" func_show_eval "$cmd" 'exit $?' output=$save_output libobjs=$save_libobjs skipped_export=false else # The command line is too long to execute in one step. func_verbose "using reloadable object file for export list..." skipped_export=: # Break out early, otherwise skipped_export may be # set to false by a later but shorter cmd. break fi done IFS="$save_ifs" if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) func_append tmp_deplibs " $test_deplib" ;; esac done deplibs="$tmp_deplibs" if test -n "$convenience"; then if test -n "$whole_archive_flag_spec" && test "$compiler_needs_object" = yes && test -z "$libobjs"; then # extract the archives, so we have objects to list. # TODO: could optimize this to just extract one archive. whole_archive_flag_spec= fi if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= else gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $convenience func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi fi if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" func_append linker_flags " $flag" fi # Make a backup of the uninstalled library when relinking if test "$opt_mode" = relink; then $opt_dry_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:" && func_len " $test_cmds" && len=$func_len_result && test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise # or, if using GNU ld and skipped_export is not :, use a linker # script. # 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 func_basename "$output" output_la=$func_basename_result # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= last_robj= k=1 if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then output=${output_objdir}/${output_la}.lnkscript func_verbose "creating GNU ld script: $output" echo 'INPUT (' > $output for obj in $save_libobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done echo ')' >> $output func_append delfiles " $output" func_to_tool_file "$output" output=$func_to_tool_file_result elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then output=${output_objdir}/${output_la}.lnk func_verbose "creating linker input file list: $output" : > $output set x $save_libobjs shift firstobj= if test "$compiler_needs_object" = yes; then firstobj="$1 " shift fi for obj do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done func_append delfiles " $output" func_to_tool_file "$output" output=$firstobj\"$file_list_spec$func_to_tool_file_result\" else if test -n "$save_libobjs"; then func_verbose "creating reloadable object files..." output=$output_objdir/$output_la-${k}.$objext eval test_cmds=\"$reload_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 # Loop over the list of objects to be linked. for obj in $save_libobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result if test "X$objlist" = X || test "$len" -lt "$max_cmd_len"; then func_append 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. reload_objs=$objlist eval concat_cmds=\"$reload_cmds\" else # All subsequent reloadable object files will link in # the last one created. reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" fi last_robj=$output_objdir/$output_la-${k}.$objext func_arith $k + 1 k=$func_arith_result output=$output_objdir/$output_la-${k}.$objext objlist=" $obj" func_len " $last_robj" func_arith $len0 + $func_len_result len=$func_arith_result 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~ reload_objs="$objlist $last_robj" eval concat_cmds=\"\${concat_cmds}$reload_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" fi func_append delfiles " $output" else output= fi if ${skipped_export-false}; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols libobjs=$output # Append the command to create the export file. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi fi test -n "$save_libobjs" && func_verbose "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" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" if test -n "$export_symbols_regex" && ${skipped_export-false}; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi if ${skipped_export-false}; then if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi fi 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\" test "X$libobjs" = "X " && libobjs= 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 fi if test -n "$delfiles"; then # Append the command to remove temporary files to $cmds. eval cmds=\"\$cmds~\$RM $delfiles\" fi # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" # Restore the uninstalled library and exit if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? if test -n "$convenience"; then if test -z "$whole_archive_flag_spec"; then func_show_eval '${RM}r "$gentop"' fi fi exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then func_show_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 "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for objects" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for objects" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for objects" test -n "$xrpath" && \ func_warning "\`-R' is ignored for objects" test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for objects" test -n "$release" && \ func_warning "\`-release' is ignored for objects" case $output in *.lo) test -n "$objs$old_deplibs" && \ func_fatal_error "cannot build library object \`$output' from non-libtool objects" libobj=$output func_lo2o "$libobj" obj=$func_lo2o_result ;; *) libobj= obj="$output" ;; esac # Delete the old objects. $opt_dry_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 and hope we can get by with # turning comma into space.. wl= if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` else gentop="$output_objdir/${obj}x" func_append generated " $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # If we're not building shared, we need to use non_pic_objs test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" # Create the old-style object. reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test output="$obj" func_execute_cmds "$reload_cmds" 'exit $?' # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS fi if test "$build_libtool_libs" != yes; then if test -n "$gentop"; then func_show_eval '${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" # $opt_dry_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" func_execute_cmds "$reload_cmds" 'exit $?' fi if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) func_stripname '' '.exe' "$output" output=$func_stripname_result.exe;; esac test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for programs" test -n "$release" && \ func_warning "\`-release' is ignored for programs" test "$preload" = yes \ && test "$dlopen_support" = unknown \ && test "$dlopen_self" = unknown \ && test "$dlopen_self_static" = unknown && \ func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac case $host in *-*-darwin*) # Don't allow lazy linking, it breaks C++ global constructors # But is supposedly fixed on 10.4 or later (yay!). if test "$tagname" = CXX ; then case ${MACOSX_DEPLOYMENT_TARGET-10.0} in 10.[0123]) func_append compile_command " ${wl}-bind_at_load" func_append finalize_command " ${wl}-bind_at_load" ;; esac fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $compile_deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $compile_deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done compile_deplibs="$new_libs" func_append compile_command " $compile_deplibs" func_append 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 "*) ;; *) func_append 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"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; ::) dllsearchpath=$libdir;; *) func_append dllsearchpath ":$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; 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"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) func_append 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 "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` fi func_generate_dlsyms "$outputname" "@PROGRAM@" "no" # template prelinking step if test -n "$prelink_cmds"; then func_execute_cmds "$prelink_cmds" 'exit $?' fi wrappers_required=yes case $host in *cegcc* | *mingw32ce*) # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. wrappers_required=no ;; *cygwin* | *mingw* ) if test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; *) if test "$need_relink" = no || test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; esac if test "$wrappers_required" = no; then # Replace the output file specification. compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` link_command="$compile_command$compile_rpath" # We have no uninstalled library dependencies, so finalize right now. exit_status=0 func_show_eval "$link_command" 'exit_status=$?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Delete the generated files. if test -f "$output_objdir/${outputname}S.${objext}"; then func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' fi exit $exit_status 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 func_append 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 func_append 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 "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $opt_dry_run || $RM $output # Link the executable and exit func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi 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" func_warning "this platform does not like uninstalled shared libraries" func_warning "\`$output' will be relinked during installation" else if test "$fast_install" != no; then link_command="$finalize_var$compile_command$finalize_rpath" if test "$fast_install" = yes; then relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED '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 "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output_objdir/$outputname" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Now create the wrapper script. func_verbose "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}\" || $lt_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 func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done relink_command="(cd `pwd`; $relink_command)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` fi # Only actually do things if not in dry run mode. $opt_dry_run || { # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) func_stripname '' '.exe' "$output" output=$func_stripname_result ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe func_stripname '' '.exe' "$outputname" outputname=$func_stripname_result ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) func_dirname_and_basename "$output" "" "." output_name=$func_basename_result output_path=$func_dirname_result cwrappersource="$output_path/$objdir/lt-$output_name.c" cwrapper="$output_path/$output_name.exe" $RM $cwrappersource $cwrapper trap "$RM $cwrappersource $cwrapper $cwrapper.manifest; exit $EXIT_FAILURE" 1 2 15 func_emit_cwrapperexe_src > $cwrappersource # The wrapper executable is built using the $host compiler, # because it contains $host paths and files. If cross- # compiling, it, like the target executable, must be # executed on the $host or under an emulation environment. $opt_dry_run || { $LTCC $LTCFLAGS -o $cwrapper $cwrappersource $STRIP $cwrapper } # Now, create the wrapper script for func_source use: func_ltwrapper_scriptname $cwrapper $RM $func_ltwrapper_scriptname_result trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 $opt_dry_run || { # note: this script will not be executed, so do not chmod. if test "x$build" = "x$host" ; then # Create the UAC manifests first if necessary (but the # manifest files must have executable permission regardless). case $output_name in *instal*|*patch*|*setup*|*update*) func_emit_exe_manifest > $cwrapper.manifest func_emit_exe_manifest > $output_path/$objdir/$output_name.exe.manifest chmod +x $cwrapper.manifest chmod +x $output_path/$objdir/$output_name.exe.manifest ;; esac $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result else func_emit_wrapper no > $func_ltwrapper_scriptname_result fi } ;; * ) $RM $output trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 func_emit_wrapper no > $output chmod +x $output ;; esac } 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 $symfileobj" 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" if test "$preload" = yes && test -f "$symfileobj"; then func_append oldobjs " $symfileobj" fi fi addlibs="$old_convenience" fi if test -n "$addlibs"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $addlibs func_append oldobjs " $func_extract_archives_result" 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 # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append oldobjs " $func_extract_archives_result" fi # POSIX demands no paths to be encoded in archives. We have # to avoid creating archives with duplicate basenames if we # might have to extract them afterwards, e.g., when creating a # static archive out of a convenience library, or when linking # the entirety of a libtool archive into another (currently # not supported by libtool). if (for obj in $oldobjs do func_basename "$obj" $ECHO "$func_basename_result" done | sort | sort -uc >/dev/null 2>&1); then : else echo "copying selected object files to avoid basename conflicts..." gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_mkdir_p "$gentop" save_oldobjs=$oldobjs oldobjs= counter=1 for obj in $save_oldobjs do func_basename "$obj" objbase="$func_basename_result" case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) while :; do # Make sure we don't pick an alternate name that also # overlaps. newobj=lt$counter-$objbase func_arith $counter + 1 counter=$func_arith_result case " $oldobjs " in *[\ /]"$newobj "*) ;; *) if test ! -f "$gentop/$newobj"; then break; fi ;; esac done func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" func_append oldobjs " $gentop/$newobj" ;; *) func_append oldobjs " $obj" ;; esac done fi eval cmds=\"$old_archive_cmds\" func_len " $cmds" len=$func_len_result if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds elif test -n "$archiver_list_spec"; then func_verbose "using command file archive linking..." for obj in $oldobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > $output_objdir/$libname.libcmd func_to_tool_file "$output_objdir/$libname.libcmd" oldobjs=" $archiver_list_spec$func_to_tool_file_result" cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts func_verbose "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs oldobjs= # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done eval test_cmds=\"$old_archive_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 for obj in $save_oldobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result func_append objlist " $obj" if test "$len" -lt "$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= len=$len0 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 func_execute_cmds "$cmds" 'exit $?' done test -n "$generated" && \ func_show_eval "${RM}r$generated" # Now create the libtool archive. case $output in *.la) old_library= test "$build_old_libs" = yes && old_library="$libname.$libext" func_verbose "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}\" || $lt_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 func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; 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 "$relink_command" | $SED "$sed_quote_subst"` if test "$hardcode_automatic" = yes ; then relink_command= fi # Only create the output if not a dry run. $opt_dry_run || { 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) func_basename "$deplib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" ;; -L*) func_stripname -L '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -L$func_replace_sysroot_result" ;; -R*) func_stripname -R '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -R$func_replace_sysroot_result" ;; *) func_append newdependency_libs " $deplib" ;; esac done dependency_libs="$newdependency_libs" newdlfiles= for lib in $dlfiles; do case $lib in *.la) func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" ;; *) func_append newdlfiles " $lib" ;; esac done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in *.la) # Only pass preopened files to the pseudo-archive (for # eventual linking with the app. that links it) if we # didn't already link the preopened objects directly into # the library: func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" ;; esac done dlprefiles="$newdlprefiles" else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlfiles " $abs" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlprefiles " $abs" done dlprefiles="$newdlprefiles" fi $RM $output # place dlname in correct position for cygwin # In fact, it would be nice if we could use this code for all target # systems that can't hard-code library paths into their executables # and that have no shared library path variable independent of PATH, # but it turns out we can't easily determine that from inspecting # libtool variables, so we have to hard-code the OSs to which it # applies here; at the moment, that means platforms that use the PE # object format with DLL files. See the long comment at the top of # tests/bindir.at for full details. tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) # If a -bindir argument was supplied, place the dll there. if test "x$bindir" != x ; then func_relative_path "$install_libdir" "$bindir" tdlname=$func_relative_path_result$dlname else # Otherwise fall back on heuristic. tdlname=../bin/$dlname fi ;; esac $ECHO > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # 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' # Linker flags that can not go in dependency_libs. inherited_linker_flags='$new_inherited_linker_flags' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Names of additional weak libraries provided by this library weak_library_names='$weak_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 } # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' ;; esac exit $EXIT_SUCCESS } { test "$opt_mode" = link || test "$opt_mode" = relink; } && func_mode_link ${1+"$@"} # func_mode_uninstall arg... func_mode_uninstall () { $opt_debug 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) func_append RM " $arg"; rmforce=yes ;; -*) func_append RM " $arg" ;; *) func_append files " $arg" ;; esac done test -z "$RM" && \ func_fatal_help "you must specify an RM program" rmdirs= for file in $files; do func_dirname "$file" "" "." dir="$func_dirname_result" if test "X$dir" = X.; then odir="$objdir" else odir="$dir/$objdir" fi func_basename "$file" name="$func_basename_result" test "$opt_mode" = uninstall && odir="$dir" # Remember odir for removal later, being careful to avoid duplicates if test "$opt_mode" = clean; then case " $rmdirs " in *" $odir "*) ;; *) func_append rmdirs " $odir" ;; 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 func_lalib_p "$file"; then func_source $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do func_append rmfiles " $odir/$n" done test -n "$old_library" && func_append rmfiles " $odir/$old_library" case "$opt_mode" in clean) case " $library_names " in *" $dlname "*) ;; *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; esac test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi # FIXME: should reinstall the best remaining shared library. ;; esac fi ;; *.lo) # Possibly a libtool object, so verify it. if func_lalib_p "$file"; then # Read the .lo file func_source $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" && test "$pic_object" != none; then func_append 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 func_append rmfiles " $dir/$non_pic_object" fi fi ;; *) if test "$opt_mode" = clean ; then noexename=$name case $file in *.exe) func_stripname '' '.exe' "$file" file=$func_stripname_result func_stripname '' '.exe' "$name" noexename=$func_stripname_result # $file with .exe has already been added to rmfiles, # add $file without .exe func_append rmfiles " $file" ;; esac # Do a test to see if this is a libtool program. if func_ltwrapper_p "$file"; then if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" relink_command= func_source $func_ltwrapper_scriptname_result func_append rmfiles " $func_ltwrapper_scriptname_result" else relink_command= func_source $dir/$noexename fi # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles func_append rmfiles " $odir/$name $odir/${name}S.${objext}" func_append rmfiles " ${name}.manifest $objdir/${name}.manifest" if test "$fast_install" = yes && test -n "$relink_command"; then func_append rmfiles " $odir/lt-$name $objdir/lt-${name}.manifest" fi if test "X$noexename" != "X$name" ; then func_append rmfiles " $odir/lt-${noexename}.c" fi fi fi ;; esac func_show_eval "$RM $rmfiles" 'exit_status=1' done # Try to remove the ${objdir}s in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then func_show_eval "rmdir $dir >/dev/null 2>&1" fi done exit $exit_status } { test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && func_mode_uninstall ${1+"$@"} test -z "$opt_mode" && { help="$generic_help" func_fatal_help "you must specify a MODE" } test -z "$exec_cmd" && \ func_fatal_help "invalid operation mode \`$opt_mode'" if test -n "$exec_cmd"; then eval exec "$exec_cmd" exit $EXIT_FAILURE fi exit $exit_status # 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: # vi:sw=2 glpk-5.0/m4/0000755000062000006210000000000013766346220012022 5ustar maomkpasswdglpk-5.0/m4/libtool.m40000644000062000006210000104472713766346220013747 0ustar maomkpasswd# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010 Free Software Foundation, # Inc. # Written by Gordon Matzigkeit, 1996 # # 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. m4_define([_LT_COPYING], [dnl # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010 Free Software Foundation, # Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ]) # serial 57 LT_INIT # LT_PREREQ(VERSION) # ------------------ # Complain and exit if this libtool version is less that VERSION. m4_defun([LT_PREREQ], [m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, [m4_default([$3], [m4_fatal([Libtool version $1 or higher is required], 63)])], [$2])]) # _LT_CHECK_BUILDDIR # ------------------ # Complain if the absolute build directory name contains unusual characters m4_defun([_LT_CHECK_BUILDDIR], [case `pwd` in *\ * | *\ *) AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; esac ]) # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], [AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl AC_BEFORE([$0], [LTDL_INIT])dnl m4_require([_LT_CHECK_BUILDDIR])dnl dnl Autoconf doesn't catch unexpanded LT_ macros by default: m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 dnl unless we require an AC_DEFUNed macro: AC_REQUIRE([LTOPTIONS_VERSION])dnl AC_REQUIRE([LTSUGAR_VERSION])dnl AC_REQUIRE([LTVERSION_VERSION])dnl AC_REQUIRE([LTOBSOLETE_VERSION])dnl m4_require([_LT_PROG_LTMAIN])dnl _LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl _LT_SETUP # Only expand once: m4_define([LT_INIT]) ])# LT_INIT # Old names: AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) # _LT_CC_BASENAME(CC) # ------------------- # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. m4_defun([_LT_CC_BASENAME], [for cc_temp in $1""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set # sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} ])# _LT_FILEUTILS_DEFAULTS # _LT_SETUP # --------- m4_defun([_LT_SETUP], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl dnl _LT_DECL([], [build_alias], [0], [The build system])dnl _LT_DECL([], [build], [0])dnl _LT_DECL([], [build_os], [0])dnl dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl dnl AC_REQUIRE([AC_PROG_LN_S])dnl test -z "$LN_S" && LN_S="ln -s" _LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl dnl AC_REQUIRE([LT_CMD_MAX_LEN])dnl _LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl m4_require([_LT_CMD_RELOAD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_WITH_SYSROOT])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi ]) if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi _LT_CHECK_OBJDIR m4_require([_LT_TAG_COMPILER])dnl 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 # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then _LT_PATH_MAGIC fi ;; esac # Use C for the default configuration in the libtool script LT_SUPPORTED_TAG([CC]) _LT_LANG_C_CONFIG _LT_LANG_DEFAULT_CONFIG _LT_CONFIG_COMMANDS ])# _LT_SETUP # _LT_PREPARE_SED_QUOTE_VARS # -------------------------- # Define a few sed substitution that help us do robust quoting. m4_defun([_LT_PREPARE_SED_QUOTE_VARS], [# Backslashify metacharacters that are still active within # double-quoted strings. 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 delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ]) # _LT_PROG_LTMAIN # --------------- # Note that this code is called both from `configure', and `config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, # `config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) ltmain="$ac_aux_dir/ltmain.sh" ])# _LT_PROG_LTMAIN ## ------------------------------------- ## ## Accumulate code for creating libtool. ## ## ------------------------------------- ## # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS # in macros and then make a single call at the end using the `libtool' # label. # _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) # ---------------------------------------- # Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL_INIT], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_INIT], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_INIT]) # _LT_CONFIG_LIBTOOL([COMMANDS]) # ------------------------------ # Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) # _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) # ----------------------------------------------------- m4_defun([_LT_CONFIG_SAVE_COMMANDS], [_LT_CONFIG_LIBTOOL([$1]) _LT_CONFIG_LIBTOOL_INIT([$2]) ]) # _LT_FORMAT_COMMENT([COMMENT]) # ----------------------------- # Add leading comment marks to the start of each line, and a trailing # full-stop to the whole comment if one is not present already. m4_define([_LT_FORMAT_COMMENT], [m4_ifval([$1], [ m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) )]) ## ------------------------ ## ## FIXME: Eliminate VARNAME ## ## ------------------------ ## # _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) # ------------------------------------------------------------------- # CONFIGNAME is the name given to the value in the libtool script. # VARNAME is the (base) name used in the configure script. # VALUE may be 0, 1 or 2 for a computed quote escaped value based on # VARNAME. Any other value will be used directly. m4_define([_LT_DECL], [lt_if_append_uniq([lt_decl_varnames], [$2], [, ], [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], [m4_ifval([$1], [$1], [$2])]) lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) m4_ifval([$4], [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) lt_dict_add_subkey([lt_decl_dict], [$2], [tagged?], [m4_ifval([$5], [yes], [no])])]) ]) # _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) # -------------------------------------------------------- m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) # lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_tag_varnames], [_lt_decl_filter([tagged?], [yes], $@)]) # _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) # --------------------------------------------------------- m4_define([_lt_decl_filter], [m4_case([$#], [0], [m4_fatal([$0: too few arguments: $#])], [1], [m4_fatal([$0: too few arguments: $#: $1])], [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], [lt_dict_filter([lt_decl_dict], $@)])[]dnl ]) # lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) # -------------------------------------------------- m4_define([lt_decl_quote_varnames], [_lt_decl_filter([value], [1], $@)]) # lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_dquote_varnames], [_lt_decl_filter([value], [2], $@)]) # lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_varnames_tagged], [m4_assert([$# <= 2])dnl _$0(m4_quote(m4_default([$1], [[, ]])), m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) m4_define([_lt_decl_varnames_tagged], [m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) # lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_all_varnames], [_$0(m4_quote(m4_default([$1], [[, ]])), m4_if([$2], [], m4_quote(lt_decl_varnames), m4_quote(m4_shift($@))))[]dnl ]) m4_define([_lt_decl_all_varnames], [lt_join($@, lt_decl_varnames_tagged([$1], lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl ]) # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ # Quote a variable value, and forward it to `config.status' so that its # declaration there will have the same value as in `configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) # _LT_CONFIG_STATUS_DECLARATIONS # ------------------------------ # We delimit libtool config variables with single quotes, so when # we write them to config.status, we have to be sure to quote all # embedded single quotes properly. In configure, this macro expands # each variable declared with _LT_DECL (and _LT_TAGDECL) into: # # ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAGS # ---------------- # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl available_tags="_LT_TAGS"dnl ]) # _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) # ----------------------------------- # Extract the dictionary values for VARNAME (optionally with TAG) and # expand to a commented shell variable setting: # # # Some comment about what VAR is for. # visible_name=$lt_internal_name m4_define([_LT_LIBTOOL_DECLARE], [_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [description])))[]dnl m4_pushdef([_libtool_name], m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), [0], [_libtool_name=[$]$1], [1], [_libtool_name=$lt_[]$1], [2], [_libtool_name=$lt_[]$1], [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl ]) # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables # suitable for insertion in the LIBTOOL CONFIG section of the `libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], [m4_foreach([_lt_var], m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAG_VARS(TAG) # ------------------------- m4_define([_LT_LIBTOOL_TAG_VARS], [m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) # _LT_TAGVAR(VARNAME, [TAGNAME]) # ------------------------------ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # _LT_CONFIG_COMMANDS # ------------------- # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations # into `config.status', and then the shell code to quote escape them in # for loops in `config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], dnl If the libtool generation code has been placed in $CONFIG_LT, dnl instead of duplicating it all over again into config.status, dnl then we will have config.status run $CONFIG_LT later, so it dnl needs to know what name is stored there: [AC_CONFIG_COMMANDS([libtool], [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], dnl If the libtool generation code is destined for config.status, dnl expand the accumulated commands and init code now: [AC_CONFIG_COMMANDS([libtool], [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) ])#_LT_CONFIG_COMMANDS # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], [ # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' _LT_CONFIG_STATUS_DECLARATIONS LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$[]1 _LTECHO_EOF' } # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done _LT_OUTPUT_LIBTOOL_INIT ]) # _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) # ------------------------------------ # Generate a child script FILE with all initialization necessary to # reuse the environment learned by the parent script, and make the # file executable. If COMMENT is supplied, it is inserted after the # `#!' sequence but before initialization text begins. After this # macro, additional text can be appended to FILE to form the body of # the child script. The macro ends with non-zero status if the # file could not be fully written (such as if the disk is full). m4_ifdef([AS_INIT_GENERATED], [m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], [m4_defun([_LT_GENERATED_FILE_INIT], [m4_require([AS_PREPARE])]dnl [m4_pushdef([AS_MESSAGE_LOG_FD])]dnl [lt_write_fail=0 cat >$1 <<_ASEOF || lt_write_fail=1 #! $SHELL # Generated by $as_me. $2 SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$1 <<\_ASEOF || lt_write_fail=1 AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 _ASEOF test $lt_write_fail = 0 && chmod +x $1[]dnl m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT # --------- # This macro allows early generation of the libtool script (before # AC_OUTPUT is called), incase it is used in configure for compilation # tests. AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} AC_MSG_NOTICE([creating $CONFIG_LT]) _LT_GENERATED_FILE_INIT(["$CONFIG_LT"], [# Run this file to recreate a libtool stub with the current configuration.]) cat >>"$CONFIG_LT" <<\_LTEOF lt_cl_silent=false exec AS_MESSAGE_LOG_FD>>config.log { echo AS_BOX([Running $as_me.]) } >&AS_MESSAGE_LOG_FD lt_cl_help="\ \`$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $[0] [[OPTIONS]] -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files Report bugs to ." lt_cl_version="\ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2010 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." while test $[#] != 0 do case $[1] in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] Try \`$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] Try \`$[0] --help' for more information.]) ;; esac shift done if $lt_cl_silent; then exec AS_MESSAGE_FD>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF _LT_OUTPUT_LIBTOOL_COMMANDS_INIT _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AC_MSG_NOTICE([creating $ofile]) _LT_OUTPUT_LIBTOOL_COMMANDS AS_EXIT(0) _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: test "$silent" = yes && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec AS_MESSAGE_LOG_FD>>config.log $lt_cl_success || AS_EXIT(1) ])# LT_OUTPUT # _LT_CONFIG(TAG) # --------------- # If TAG is the built-in tag, create an initial libtool script with a # default configuration from the untagged config vars. Otherwise add code # to config.status for appending the configuration named by TAG from the # matching tagged config vars. m4_defun([_LT_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ # 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 cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # _LT_COPYING _LT_LIBTOOL_TAGS # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_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 _LT_EOF ;; esac _LT_PROG_LTMAIN # 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) _LT_PROG_REPLACE_SHELLFNS mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ], [cat <<_LT_EOF >> "$ofile" dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded dnl in a comment (ie after a #). # ### BEGIN LIBTOOL TAG CONFIG: $1 _LT_LIBTOOL_TAG_VARS(_LT_TAG) # ### END LIBTOOL TAG CONFIG: $1 _LT_EOF ])dnl /m4_if ], [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS ])# _LT_CONFIG # LT_SUPPORTED_TAG(TAG) # --------------------- # Trace this macro to discover what tags are supported by the libtool # --tag option, using: # autoconf --trace 'LT_SUPPORTED_TAG:$1' AC_DEFUN([LT_SUPPORTED_TAG], []) # C support is built-in for now m4_define([_LT_LANG_C_enabled], []) m4_define([_LT_TAGS], []) # LT_LANG(LANG) # ------------- # Enable libtool support for the given language if not already enabled. AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], [Windows Resource], [_LT_LANG(RC)], [m4_ifdef([_LT_LANG_]$1[_CONFIG], [_LT_LANG($1)], [m4_fatal([$0: unsupported language: "$1"])])])dnl ])# LT_LANG # _LT_LANG(LANGNAME) # ------------------ m4_defun([_LT_LANG], [m4_ifdef([_LT_LANG_]$1[_enabled], [], [LT_SUPPORTED_TAG([$1])dnl m4_append([_LT_TAGS], [$1 ])dnl m4_define([_LT_LANG_]$1[_enabled], [])dnl _LT_LANG_$1_CONFIG($1)])dnl ])# _LT_LANG # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], [AC_PROVIDE_IFELSE([AC_PROG_CXX], [LT_LANG(CXX)], [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) AC_PROVIDE_IFELSE([AC_PROG_F77], [LT_LANG(F77)], [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) AC_PROVIDE_IFELSE([AC_PROG_FC], [LT_LANG(FC)], [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal dnl pulling things in needlessly. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([LT_PROG_GCJ], [LT_LANG(GCJ)], [m4_ifdef([AC_PROG_GCJ], [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([A][M_PROG_GCJ], [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) ])# _LT_LANG_DEFAULT_CONFIG # Obsolete macros: AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_CXX], []) dnl AC_DEFUN([AC_LIBTOOL_F77], []) dnl AC_DEFUN([AC_LIBTOOL_FC], []) dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) dnl AC_DEFUN([AC_LIBTOOL_RC], []) # _LT_TAG_COMPILER # ---------------- m4_defun([_LT_TAG_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl _LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl _LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl _LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_TAG_COMPILER # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. m4_defun([_LT_COMPILER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. m4_defun([_LT_LINKER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CHECK_TOOL([LIPO], [lipo], [:]) AC_CHECK_TOOL([OTOOL], [otool], [:]) AC_CHECK_TOOL([OTOOL64], [otool64], [:]) _LT_DECL([], [DSYMUTIL], [1], [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) _LT_DECL([], [NMEDIT], [1], [Tool to change global to local symbols on Mac OS X]) _LT_DECL([], [LIPO], [1], [Tool to manipulate fat objects and archives on Mac OS X]) _LT_DECL([], [OTOOL], [1], [ldd/readelf like tool for Mach-O binaries on Mac OS X]) _LT_DECL([], [OTOOL64], [1], [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -rf libconftest.dylib* rm -f conftest.* fi]) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS="$save_LDFLAGS" ]) AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], [lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -f conftest && test ! -s conftest.err && test $_lt_result = 0 && $GREP forced_load conftest 2>&1 >/dev/null; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM ]) case $host_os in rhapsody* | darwin1.[[012]]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[[012]]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ]) # _LT_DARWIN_LINKER_FEATURES # -------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ m4_require([_LT_REQUIRED_DARWIN_CHECKS]) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported if test "$lt_cv_ld_force_load" = "yes"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" m4_if([$1], [CXX], [ if test "$lt_cv_apple_cc_single_mod" != "yes"; then _LT_TAGVAR(archive_cmds, $1)="\$CC -r -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${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -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${_lt_dar_export_syms}${_lt_dsymutil}" fi ],[]) else _LT_TAGVAR(ld_shlibs, $1)=no fi ]) # _LT_SYS_MODULE_PATH_AIX([TAGNAME]) # ---------------------------------- # 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. # Store the results from the different compilers for each TAGNAME. # Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ lt_aix_libpath_sed='[ /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }]' _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" fi ]) aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], [m4_divert_text([M4SH-INIT], [$1 ])])# _LT_SHELL_INIT # _LT_PROG_ECHO_BACKSLASH # ----------------------- # Find how we can fake an echo command that does not interpret backslash. # In particular, with Autoconf 2.60 or later we add some code to the start # of the generated configure script which will find a shell with a builtin # printf (which we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO AC_MSG_CHECKING([how to print strings]) # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $[]1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } case "$ECHO" in printf*) AC_MSG_RESULT([printf]) ;; print*) AC_MSG_RESULT([print -r]) ;; *) AC_MSG_RESULT([cat]) ;; esac m4_ifdef([_AS_DETECT_SUGGESTED], [_AS_DETECT_SUGGESTED([ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test "X`printf %s $ECHO`" = "X$ECHO" \ || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) ])# _LT_PROG_ECHO_BACKSLASH # _LT_WITH_SYSROOT # ---------------- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], [ --with-sysroot[=DIR] Search for dependent libraries within DIR (or the compiler's sysroot if not specified).], [], [with_sysroot=no]) dnl lt_sysroot will always be passed unquoted. We quote it here dnl in case the user passed a directory name. lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) AC_MSG_RESULT([${with_sysroot}]) AC_MSG_ERROR([The sysroot must be an absolute path.]) ;; esac AC_MSG_RESULT([${lt_sysroot:-no}]) _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl [dependent libraries, and in which our libraries should be installed.])]) # _LT_ENABLE_LOCK # --------------- m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_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 '$LINENO' "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-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|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-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; 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-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) 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_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[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 ;; sparc*-*solaris*) # 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 *64-bit*) case $lt_cv_prog_gnu_ld in yes*) LD="${LD-ld} -m elf64_sparc" ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" ])# _LT_ENABLE_LOCK # _LT_PROG_AR # ----------- m4_defun([_LT_PROG_AR], [AC_CHECK_TOOLS(AR, [ar], false) : ${AR=ar} : ${AR_FLAGS=cru} _LT_DECL([], [AR], [1], [The archiver]) _LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [lt_cv_ar_at_file=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM], [echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a ]) ]) if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi _LT_DECL([], [archiver_list_spec], [1], [How to feed a file listing to the archiver]) ])# _LT_PROG_AR # _LT_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], [_LT_PROG_AR AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) AC_CHECK_TOOL(RANLIB, ranlib, :) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac _LT_DECL([], [old_postinstall_cmds], [2]) _LT_DECL([], [old_postuninstall_cmds], [2]) _LT_TAGDECL([], [old_archive_cmds], [2], [Commands used to build an old-style archive]) _LT_DECL([], [lock_old_archive_extraction], [0], [Whether to use a lock for old archive extraction]) ])# _LT_CMD_OLD_ARCHIVE # _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$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}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $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 other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $RM conftest* ]) if test x"[$]$2" = xyes; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) fi ])# _LT_COMPILER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) # _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------- # Check whether the given linker option works AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker 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 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" ]) if test x"[$]$2" = xyes; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) fi ])# _LT_LINKER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) # LT_CMD_MAX_LEN #--------------- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl # 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* | cegcc*) # 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; ;; mint*) # On MiNT this can take a long time and run out of memory. 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; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # 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"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` 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` fi ;; 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 max_cmd_len=$lt_cv_sys_max_cmd_len _LT_DECL([], [max_cmd_len], [0], [What is the maximum length of a command?]) ])# LT_CMD_MAX_LEN # Old name: AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) # _LT_HEADER_DLFCN # ---------------- m4_defun([_LT_HEADER_DLFCN], [AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl ])# _LT_HEADER_DLFCN # _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_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 <<_LT_EOF [#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #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 /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 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; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; }] _LT_EOF if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_TRY_DLOPEN_SELF # LT_SYS_DLOPEN_SELF # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_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* | cegcc*) 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="-ldld"], [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="-ldld"]) ]) ]) ]) ]) ]) ;; 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" wl=$lt_prog_compiler_wl 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_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 wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_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 _LT_DECL([dlopen_support], [enable_dlopen], [0], [Whether dlopen is supported]) _LT_DECL([dlopen_self], [enable_dlopen_self], [0], [Whether dlopen of programs is supported]) _LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], [Whether dlopen of statically linked programs is supported]) ])# LT_SYS_DLOPEN_SELF # Old name: AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) # _LT_COMPILER_C_O([TAGNAME]) # --------------------------- # Check to see if options -c and -o are simultaneously supported by compiler. # This macro does not hard code the compiler like AC_PROG_CC_C_O. m4_defun([_LT_COMPILER_C_O], [m4_require([_LT_DECL_SED])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$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}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $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:$LINENO: \$? = $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 $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $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 .. $RM -r conftest $RM conftest* ]) _LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], [Does compiler simultaneously support -c and -o options?]) ])# _LT_COMPILER_C_O # _LT_COMPILER_FILE_LOCKS([TAGNAME]) # ---------------------------------- # Check to see if we can do hard links to lock some files if needed m4_defun([_LT_COMPILER_FILE_LOCKS], [m4_require([_LT_ENABLE_LOCK])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) hard_links="nottested" if test "$_LT_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 _LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) ])# _LT_COMPILER_FILE_LOCKS # _LT_CHECK_OBJDIR # ---------------- m4_defun([_LT_CHECK_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 _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", [Define to the sub-directory in which libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR # _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) # -------------------------------------- # Check hardcoding attributes. m4_defun([_LT_LINKER_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then # We can hardcode non-existent directories. if test "$_LT_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_TAGVAR(hardcode_shlibpath_var, $1)" != no && test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; 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 _LT_TAGDECL([], [hardcode_action], [0], [How to hardcode a shared library path into an executable]) ])# _LT_LINKER_HARDCODE_LIBPATH # _LT_CMD_STRIPLIB # ---------------- m4_defun([_LT_CMD_STRIPLIB], [m4_require([_LT_DECL_EGREP]) 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" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics m4_defun([_LT_SYS_DYNAMIC_LINKER], [AC_REQUIRE([AC_CANONICAL_HOST])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # 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. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) 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" 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' ;; aix[[4-9]]*) 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*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) 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=`func_echo_all "$lib" | $SED '\''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' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) 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* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc 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~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' 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}' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; 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 dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH. 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 # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # 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 dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # 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}${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`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) 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 ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[123]]*) objformat=aout ;; *) objformat=elf ;; esac fi 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 ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes 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 ;; haiku*) version_type=linux need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" 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=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' 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' # or fails outright, so override atomically: install_override_mode=555 ;; interix[[3-9]]*) 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' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; 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* | k*bsd*-gnu | kopensolaris*-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' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], [lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], [lt_cv_shlibpath_overrides_runpath=yes])]) LDFLAGS=$save_LDFLAGS libdir=$save_libdir ]) shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # 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 # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $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' ;; 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=qnx 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='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac 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" ;; rdos*) dynamic_linker=no ;; 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.3*) 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 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 ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/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}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; 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 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 if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) _LT_DECL([], [need_lib_prefix], [0], [Do we need the "lib" prefix for modules?]) _LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) _LT_DECL([], [version_type], [0], [Library versioning type]) _LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) _LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) _LT_DECL([], [shlibpath_overrides_runpath], [0], [Is shlibpath searched before the hard-coded library search path?]) _LT_DECL([], [libname_spec], [1], [Format of library name prefix]) _LT_DECL([], [library_names_spec], [1], [[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]]) _LT_DECL([], [soname_spec], [1], [[The coded name of the library, if different from the real name]]) _LT_DECL([], [install_override_mode], [1], [Permission mode override for installation of shared libraries]) _LT_DECL([], [postinstall_cmds], [2], [Command to use after installation of a shared archive]) _LT_DECL([], [postuninstall_cmds], [2], [Command to use after uninstallation of a shared archive]) _LT_DECL([], [finish_cmds], [2], [Commands used to finish a libtool library installation in a directory]) _LT_DECL([], [finish_eval], [1], [[As "finish_cmds", except a single script fragment to be evaled but not shown]]) _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) _LT_DECL([], [sys_lib_dlsearch_path_spec], [2], [Run-time system search path for libraries]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program which can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_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="m4_if([$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 <<_LT_EOF 1>&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 _LT_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 _LT_DECL([], [MAGIC_CMD], [0], [Used to examine libraries when file_magic_cmd begins with "file"])dnl ])# _LT_PATH_TOOL_PREFIX # Old name: AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- # find a file program which can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_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 _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# _LT_PATH_MAGIC # LT_PATH_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_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])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 variants of GNU ld 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 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) 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|DragonFly)/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 ;; haiku*) 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])(-bit)?( [LM]SB)? 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 ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; 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* | k*bsd*-gnu | kopensolaris*-gnu) 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=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) 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 ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` fi ;; esac fi 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 _LT_DECL([], [deplibs_check_method], [1], [Method to check whether dependent libraries are shared objects]) _LT_DECL([], [file_magic_cmd], [1], [Command to use when deplibs_check_method = "file_magic"]) _LT_DECL([], [file_magic_glob], [1], [How to find potential files when deplibs_check_method = "file_magic"]) _LT_DECL([], [want_nocaseglob], [1], [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) ])# _LT_CHECK_MAGIC_METHOD # LT_PATH_NM # ---------- # find the pathname to a BSD- or MS-compatible name lister AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_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" done : ${lt_cv_path_NM=no} fi]) if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi AC_SUBST([DUMPBIN]) if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm AC_SUBST([NM]) _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], [lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) cat conftest.out >&AS_MESSAGE_LOG_FD if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest*]) ])# LT_PATH_NM # Old names: AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_PROG_NM], []) dnl AC_DEFUN([AC_PROG_NM], []) # _LT_CHECK_SHAREDLIB_FROM_LINKLIB # -------------------------------- # how to determine the name of the shared library # associated with a specific link library. # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) m4_require([_LT_DECL_DLLTOOL]) AC_CACHE_CHECK([how to associate runtime and link libraries], lt_cv_sharedlib_from_linklib_cmd, [lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac ]) sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO _LT_DECL([], [sharedlib_from_linklib_cmd], [1], [Command to associate shared and link libraries]) ])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB # _LT_PATH_MANIFEST_TOOL # ---------------------- # locate the manifest tool m4_defun([_LT_PATH_MANIFEST_TOOL], [AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], [lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&AS_MESSAGE_LOG_FD if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest*]) if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL # LT_LIB_M # -------- # check for math library AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-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_SUBST([LIBM]) ])# LT_LIB_M # Old name: AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_CHECK_LIBM], []) # _LT_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------- m4_defun([_LT_COMPILER_NO_RTTI], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test "$GCC" = yes; then case $cc_basename in nvcc*) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; *) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; esac _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], [Compiler flag to turn off builtin functions]) ])# _LT_COMPILER_NO_RTTI # _LT_CMD_GLOBAL_SYMBOLS # ---------------------- m4_defun([_LT_CMD_GLOBAL_SYMBOLS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([LT_PATH_NM])dnl AC_REQUIRE([LT_PATH_LD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_TAG_COMPILER])dnl # 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]]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[[ABCDEGRST]]' fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; 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 # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \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\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # 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 # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $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 <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT@&t@_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT@&t@_DLSYM_CONST #else # define LT@&t@_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT@&t@_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$_LT_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_globsym_save_LIBS CFLAGS=$lt_globsym_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 -rf 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 # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then nm_file_list_spec='@' fi _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) _LT_DECL([], [nm_file_list_spec], [1], [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS # _LT_COMPILER_PIC([TAGNAME]) # --------------------------- m4_defun([_LT_COMPILER_PIC], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_wl, $1)= _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)= m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_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_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # 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_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # 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). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_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_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_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 ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # 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). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; dgux*) case $cc_basename in ec++*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # KAI C++ Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL 8.0, 9.0 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_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_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test "$GCC" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_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_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # 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_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # 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). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_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_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Xcompiler -fPIC' ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # 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). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; hpux9* | hpux10* | hpux11*) _LT_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_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # Lahey Fortran 8.1. lf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' ;; nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ F* | *Sun*Fortran*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; esac ;; esac ;; newsos6) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" ;; esac AC_CACHE_CHECK([for $compiler option to produce PIC], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) _LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], [Additional compiler flags for building library objects]) _LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], [How to pass a linker flag through the compiler]) # # Check to make sure the static flag actually works. # wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], [Compiler flag to prevent dynamic linking]) ])# _LT_COMPILER_PIC # _LT_LINKER_SHLIBS([TAGNAME]) # ---------------------------- # See if the linker supports building shared libraries. m4_defun([_LT_LINKER_SHLIBS], [AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) m4_if([$1], [CXX], [ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] case $host_os in aix[[4-9]]*) # 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 # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_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_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] ;; esac ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ], [ runpath_var= _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_cmds, $1)= _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(old_archive_from_new_cmds, $1)= _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_TAGVAR(thread_safe_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_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_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # 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. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # 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 ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_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_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[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 # See if GNU ld supports shared libraries. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, 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 install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_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_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_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}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_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 '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_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~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&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. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_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_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_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_TAGVAR(hardcode_minus_L, $1)=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) 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 # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_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]].*|aix[[5-9]]*) 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_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' 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 : else # We have old collect2 _LT_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_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi 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 _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_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_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_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_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_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_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; bsdi[[45]]*) _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # 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. case $cc_basename in cl*) # Native MSVC _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # 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_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_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_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; freebsd1*) _LT_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_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${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_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_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_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_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) m4_if($1, [], [ # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) _LT_LINKER_OPTION([if $CC understands -b], _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) ;; esac fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_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_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], [lt_cv_irix_exported_symbol], [save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" AC_LINK_IFELSE( [AC_LANG_SOURCE( [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], [C++], [[int foo (void) { return 0; }]], [Fortran 77], [[ subroutine foo end]], [Fortran], [[ subroutine foo end]])])], [lt_cv_irix_exported_symbol=yes], [lt_cv_irix_exported_symbol=no]) LDFLAGS="$save_LDFLAGS"]) if test "$lt_cv_irix_exported_symbol" = yes; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' else case $host_os in openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ;; esac fi else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_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_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_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' ;; *) wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_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} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_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_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(ld_shlibs, $1)=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld _LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl _LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl _LT_DECL([], [extract_expsyms_cmds], [2], [The commands to extract the exported symbol list from a shared archive]) # # Do we need to explicitly link libc? # case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $_LT_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_CACHE_CHECK([whether -lc should be explicitly linked in], [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), [$RM conftest* echo "$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_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) _LT_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) then lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no else lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ]) _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) ;; esac fi ;; esac _LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], [Whether or not to add -lc for building shared libraries]) _LT_TAGDECL([allow_libtool_libs_with_static_runtimes], [enable_shared_with_static_runtimes], [0], [Whether or not to disallow shared libs when runtime libs are static]) _LT_TAGDECL([], [export_dynamic_flag_spec], [1], [Compiler flag to allow reflexive dlopens]) _LT_TAGDECL([], [whole_archive_flag_spec], [1], [Compiler flag to generate shared objects directly from archives]) _LT_TAGDECL([], [compiler_needs_object], [1], [Whether the compiler copes with passing no objects directly]) _LT_TAGDECL([], [old_archive_from_new_cmds], [2], [Create an old-style archive from a shared archive]) _LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], [Create a temporary old-style archive to link instead of a shared archive]) _LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) _LT_TAGDECL([], [archive_expsym_cmds], [2]) _LT_TAGDECL([], [module_cmds], [2], [Commands used to build a loadable module if different from building a shared archive.]) _LT_TAGDECL([], [module_expsym_cmds], [2]) _LT_TAGDECL([], [with_gnu_ld], [1], [Whether we are building with GNU ld or not]) _LT_TAGDECL([], [allow_undefined_flag], [1], [Flag that allows shared libraries with undefined symbols to be built]) _LT_TAGDECL([], [no_undefined_flag], [1], [Flag that enforces no undefined symbols]) _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) _LT_TAGDECL([], [hardcode_libdir_flag_spec_ld], [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]]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary and the resulting library dependency is "absolute", i.e impossible to change by setting ${shlibpath_var} if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_shlibpath_var], [0], [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_automatic], [0], [Set to "yes" if building a shared library automatically hardcodes DIR into the library and all subsequent libraries and executables linked against it]) _LT_TAGDECL([], [inherit_rpath], [0], [Set to yes if linker adds runtime paths of dependent libraries to runtime path list]) _LT_TAGDECL([], [link_all_deplibs], [0], [Whether libtool must link a program against all its dependency libraries]) _LT_TAGDECL([], [always_export_symbols], [0], [Set to "yes" if exported symbols are required]) _LT_TAGDECL([], [export_symbols_cmds], [2], [The commands to list exported symbols]) _LT_TAGDECL([], [exclude_expsyms], [1], [Symbols that should not be listed in the preloaded symbols]) _LT_TAGDECL([], [include_expsyms], [1], [Symbols that must always be exported]) _LT_TAGDECL([], [prelink_cmds], [2], [Commands necessary for linking programs (against libraries) with templates]) _LT_TAGDECL([], [postlink_cmds], [2], [Commands necessary for finishing linking programs]) _LT_TAGDECL([], [file_list_spec], [1], [Specify filename containing input files]) dnl FIXME: Not yet implemented dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], dnl [Compiler flag to generate thread safe objects]) ])# _LT_LINKER_SHLIBS # _LT_LANG_C_CONFIG([TAG]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl 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_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE ## 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... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB # Report which library types will 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 ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=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]) _LT_CONFIG($1) fi AC_LANG_POP CC="$lt_save_CC" ])# _LT_LANG_C_CONFIG # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes fi AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS 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 $as_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 $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration LT_PATH_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_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_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_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_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_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 -v "^Configured with:" | $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_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) 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]].*|aix[[5-9]]*) 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_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' 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 : else # We have old collect2 _LT_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_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi 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 _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_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_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_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_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared # libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # 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_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_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}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd[[12]]*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes ;; gnu*) ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; hpux9*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_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_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _LT_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) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${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_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_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_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_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; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${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_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_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_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_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) 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_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_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; func_echo_all "$list"' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_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_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_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' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_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_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_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=`func_echo_all "$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; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_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 -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # 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_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_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::"' ;; *nto* | *qnx*) _LT_TAGVAR(ld_shlibs, $1)=yes ;; openbsd2*) # C++ shared libraries are fairly broken _LT_TAGVAR(ld_shlibs, $1)=no ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; osf3* | 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_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_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; cxx*) case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_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 ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac _LT_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=`func_echo_all "$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; func_echo_all "$list"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) _LT_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" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_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 -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_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} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='func_echo_all' # 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_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_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_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_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -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 -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_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 -v "^Configured with:" | $GREP "\-L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ '"$_LT_TAGVAR(old_archive_cmds, $1)" _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(GCC, $1)="$GXX" _LT_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... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC 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 fi # test "$_lt_caught_CXX_error" != yes AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _LT_FUNC_STRIPNAME_CNF # ---------------------- # func_stripname_cnf prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # # This function is identical to the (non-XSI) version of func_stripname, # except this one can be used by m4 code that may be executed by configure, # rather than the libtool script. m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl AC_REQUIRE([_LT_DECL_SED]) AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF # _LT_SYS_HIDDEN_LIBDEPS([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. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= _LT_TAGVAR(predeps, $1)= _LT_TAGVAR(postdeps, $1)= _LT_TAGVAR(compiler_lib_search_path, $1)= 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... m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF int a; void foo (void) { a = 0; } _LT_EOF ], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF ], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer*4 a a=0 return end _LT_EOF ], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF public class foo { private int a; public void bar (void) { a = 0; } }; _LT_EOF ]) _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; esac dnl Parse the compiler output and extract the necessary dnl objects, libraries and library flags. if AC_TRY_EVAL(ac_compile); 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 for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${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 fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} 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 "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" else _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${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 "$_LT_TAGVAR(postdeps, $1)"; then _LT_TAGVAR(postdeps, $1)="${prev}${p}" else _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$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 "$_LT_TAGVAR(predep_objects, $1)"; then _LT_TAGVAR(predep_objects, $1)="$p" else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then _LT_TAGVAR(postdep_objects, $1)="$p" else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling $1 test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], [case $host_os in interix[[3-9]]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. _LT_TAGVAR(predep_objects,$1)= _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; esac ]) case " $_LT_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) _LT_TAGDECL([], [predep_objects], [1], [Dependencies to place before and after the objects being linked to create a shared library]) _LT_TAGDECL([], [postdep_objects], [1]) _LT_TAGDECL([], [predeps], [1]) _LT_TAGDECL([], [postdeps], [1]) _LT_TAGDECL([], [compiler_lib_search_path], [1], [The library search path used internally by the compiler when linking a shared library]) ])# _LT_SYS_HIDDEN_LIBDEPS # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_LANG_PUSH(Fortran 77) if test -z "$F77" || test "X$F77" = "Xno"; then _lt_disable_F77=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_F77" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) GCC=$G77 if test -n "$compiler"; then 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 ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=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]) _LT_TAGVAR(GCC, $1)="$G77" _LT_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... _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC="$lt_save_CC" CFLAGS="$lt_save_CFLAGS" fi # test "$_lt_disable_F77" != yes AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_LANG_PUSH(Fortran) if test -z "$FC" || test "X$FC" = "Xno"; then _lt_disable_FC=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_FC" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then 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 ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=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]) _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" _LT_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... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test "$_lt_disable_FC" != yes AC_LANG_POP ])# _LT_LANG_FC_CONFIG # _LT_LANG_GCJ_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## 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... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GCJ_CONFIG # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # 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. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= CC=${RC-"windres"} CFLAGS= compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes if test -n "$compiler"; then : _LT_CONFIG($1) fi GCC=$lt_save_GCC AC_LANG_RESTORE CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_RC_CONFIG # LT_PROG_GCJ # ----------- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) # Old name: AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) ]) # Old name: AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_RC], []) # _LT_DECL_EGREP # -------------- # If we don't have a new enough Autoconf to choose the best grep # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep _LT_DECL([], [GREP], [1], [A grep program that handles long lines]) _LT_DECL([], [EGREP], [1], [An ERE matcher]) _LT_DECL([], [FGREP], [1], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) # _LT_DECL_OBJDUMP # -------------- # If we don't have a new enough Autoconf to choose the best objdump # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_OBJDUMP], [AC_CHECK_TOOL(OBJDUMP, objdump, false) test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) # _LT_DECL_DLLTOOL # ---------------- # Ensure DLLTOOL variable is set. m4_defun([_LT_DECL_DLLTOOL], [AC_CHECK_TOOL(DLLTOOL, dlltool, false) test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program]) AC_SUBST([DLLTOOL]) ]) # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED m4_ifndef([AC_PROG_SED], [ ############################################################ # 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. # ############################################################ m4_defun([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 IFS=$as_save_IFS 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 && continue 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_SUBST([SED]) AC_MSG_RESULT([$SED]) ])#AC_PROG_SED ])#m4_ifndef # Old name: AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) # _LT_CHECK_SHELL_FEATURES # ------------------------ # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], [AC_MSG_CHECKING([whether the shell understands some XSI constructs]) # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes AC_MSG_RESULT([$xsi_shell]) _LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) AC_MSG_CHECKING([whether the shell understands "+="]) lt_shell_append=no ( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes AC_MSG_RESULT([$lt_shell_append]) _LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi _LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES # _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) # ------------------------------------------------------ # In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and # '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. m4_defun([_LT_PROG_FUNCTION_REPLACE], [dnl { sed -e '/^$1 ()$/,/^} # $1 /c\ $1 ()\ {\ m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) } # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: ]) # _LT_PROG_REPLACE_SHELLFNS # ------------------------- # Replace existing portable implementations of several shell functions with # equivalent extended shell implementations where those features are available.. m4_defun([_LT_PROG_REPLACE_SHELLFNS], [if test x"$xsi_shell" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary parameter first. func_stripname_result=${3} func_stripname_result=${func_stripname_result#"${1}"} func_stripname_result=${func_stripname_result%"${2}"}]) _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl func_split_long_opt_name=${1%%=*} func_split_long_opt_arg=${1#*=}]) _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl func_split_short_opt_arg=${1#??} func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl case ${1} in *.lo) func_lo2o_result=${1%.lo}.${objext} ;; *) func_lo2o_result=${1} ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) fi if test x"$lt_shell_append" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl func_quote_for_eval "${2}" dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) fi ]) # _LT_PATH_CONVERSION_FUNCTIONS # ----------------------------- # Determine which file name conversion functions should be used by # func_to_host_file (and, implicitly, by func_to_host_path). These are needed # for certain cross-compile configurations and native mingw. m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_MSG_CHECKING([how to convert $build file names to $host format]) AC_CACHE_VAL(lt_cv_to_host_file_cmd, [case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac ]) to_host_file_cmd=$lt_cv_to_host_file_cmd AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) _LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], [0], [convert $build file names to $host format])dnl AC_MSG_CHECKING([how to convert $build file names to toolchain format]) AC_CACHE_VAL(lt_cv_to_tool_file_cmd, [#assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac ]) to_tool_file_cmd=$lt_cv_to_tool_file_cmd AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], [0], [convert $build files to toolchain format])dnl ])# _LT_PATH_CONVERSION_FUNCTIONS glpk-5.0/m4/ltoptions.m40000644000062000006210000002725613766346220014333 0ustar maomkpasswd# Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, # Inc. # Written by Gary V. Vaughan, 2004 # # 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 7 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) # ------------------------------------------ m4_define([_LT_MANGLE_OPTION], [[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) # _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) # --------------------------------------- # Set option OPTION-NAME for macro MACRO-NAME, and if there is a # matching handler defined, dispatch to it. Other OPTION-NAMEs are # saved as a flag. m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), [m4_warning([Unknown $1 option `$2'])])[]dnl ]) # _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) # ------------------------------------------------------------ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. m4_define([_LT_IF_OPTION], [m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) # _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) # ------------------------------------------------------- # Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME # are set. m4_define([_LT_UNLESS_OPTIONS], [m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), [m4_define([$0_found])])])[]dnl m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 ])[]dnl ]) # _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) # ---------------------------------------- # OPTION-LIST is a space-separated list of Libtool options associated # with MACRO-NAME. If any OPTION has a matching handler declared with # LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about # the unknown option and exit. m4_defun([_LT_SET_OPTIONS], [# Set options m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [_LT_SET_OPTION([$1], _LT_Option)]) m4_if([$1],[LT_INIT],[ dnl dnl Simply set some default values (i.e off) if boolean options were not dnl specified: _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no ]) _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no ]) dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither dnl `shared' nor `disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], [_LT_ENABLE_FAST_INSTALL]) ]) ])# _LT_SET_OPTIONS ## --------------------------------- ## ## Macros to handle LT_INIT options. ## ## --------------------------------- ## # _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) # ----------------------------------------- m4_define([_LT_MANGLE_DEFUN], [[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) # LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) # ----------------------------------------------- m4_define([LT_OPTION_DEFINE], [m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl ])# LT_OPTION_DEFINE # dlopen # ------ LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes ]) AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) # win32-dll # --------- # Declare package support for building win32 dll's. LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; esac test -z "$AS" && AS=as _LT_DECL([], [AS], [1], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- # implement the --enable-shared flag, and supports the `shared' and # `disable-shared' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]_LT_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=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the `static' and # `disable-static' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_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=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the `fast-install' # and `disable-fast-install' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_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=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --with-pic flag, and support the `pic-only' and `no-pic' # LT_INIT options. # MODE is either `yes' or `no'. If omitted, it defaults to `both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_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=m4_default([$1], [default]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) ## ----------------- ## ## LTDL_INIT Options ## ## ----------------- ## m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) glpk-5.0/m4/ltsugar.m40000644000062000006210000001042413766346220013746 0ustar maomkpasswd# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # 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 ltsugar.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) # lt_join(SEP, ARG1, [ARG2...]) # ----------------------------- # Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their # associated separator. # Needed until we can rely on m4_join from Autoconf 2.62, since all earlier # versions in m4sugar had bugs. m4_define([lt_join], [m4_if([$#], [1], [], [$#], [2], [[$2]], [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) m4_define([_lt_join], [m4_if([$#$2], [2], [], [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) # lt_car(LIST) # lt_cdr(LIST) # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support # Autoconf-2.59 which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], [$#], 1, [], [m4_dquote(m4_shift($@))])]) m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ # Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different # than defined and empty). # # This macro is needed until we can rely on Autoconf 2.62, since earlier # versions of m4sugar mistakenly expanded SEPARATOR but not STRING. m4_define([lt_append], [m4_define([$1], m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) # lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) # ---------------------------------------------------------- # Produce a SEP delimited list of all paired combinations of elements of # PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list # has the form PREFIXmINFIXSUFFIXn. # Needed until we can rely on m4_combine added in Autoconf 2.62. m4_define([lt_combine], [m4_if(m4_eval([$# > 3]), [1], [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl [[m4_foreach([_Lt_prefix], [$2], [m4_foreach([_Lt_suffix], ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) # ----------------------------------------------------------------------- # Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited # by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. m4_define([lt_if_append_uniq], [m4_ifdef([$1], [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], [lt_append([$1], [$2], [$3])$4], [$5])], [lt_append([$1], [$2], [$3])$4])]) # lt_dict_add(DICT, KEY, VALUE) # ----------------------------- m4_define([lt_dict_add], [m4_define([$1($2)], [$3])]) # lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) # -------------------------------------------- m4_define([lt_dict_add_subkey], [m4_define([$1($2:$3)], [$4])]) # lt_dict_fetch(DICT, KEY, [SUBKEY]) # ---------------------------------- m4_define([lt_dict_fetch], [m4_ifval([$3], m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) # lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) # ----------------------------------------------------------------- m4_define([lt_if_dict_fetch], [m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], [$5], [$6])]) # lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) # -------------------------------------------------------------- m4_define([lt_dict_filter], [m4_if([$5], [], [], [lt_join(m4_quote(m4_default([$4], [[, ]])), lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl ]) glpk-5.0/m4/ltversion.m40000644000062000006210000000125613766346220014315 0ustar maomkpasswd# ltversion.m4 -- version numbers -*- Autoconf -*- # # Copyright (C) 2004 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004 # # 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. # @configure_input@ # serial 3294 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.4]) m4_define([LT_PACKAGE_REVISION], [1.3294]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4' macro_revision='1.3294' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) glpk-5.0/m4/lt~obsolete.m40000644000062000006210000001375613766346220014652 0ustar maomkpasswd# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004. # # 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 lt~obsolete.m4 # These exist entirely to fool aclocal when bootstrapping libtool. # # In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # # The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN # in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us # using a macro with the same name in our local m4/libtool.m4 it'll # pull the old libtool.m4 in (it doesn't see our shiny new m4_define # and doesn't know about Autoconf macros at all.) # # So we provide this file, which has a silly filename so it's always # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. # We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until # we give up compatibility with versions before 1.7, at which point # we need to keep only those names which we still refer to. # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) glpk-5.0/Makefile.am0000644000062000006210000000016713766346220013542 0ustar maomkpasswd## Process this file with automake to produce Makefile.in ## ACLOCAL_AMFLAGS=-I m4 SUBDIRS = src examples ## eof ## glpk-5.0/Makefile.in0000644000062000006210000005664513766346220013567 0ustar maomkpasswd# Makefile.in generated by automake 1.12.5 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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 $(srcdir)/config.h.in \ $(top_srcdir)/configure AUTHORS COPYING ChangeLog INSTALL NEWS \ THANKS config.guess config.sub install-sh ltmain.sh missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = 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__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ cscope distdir dist dist-all distcheck ETAGS = etags CTAGS = ctags CSCOPE = cscope DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ NOUNDEFINED = @NOUNDEFINED@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ 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@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ 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@ ACLOCAL_AMFLAGS = -I m4 SUBDIRS = src examples all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --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): config.h: stamp-h1 @if test ! -f $@; then rm -f stamp-h1; else :; fi @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool config.lt # 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) $(RECURSIVE_CLEAN_TARGETS): @fail= 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//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" 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 cscopelist-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) cscopelist); \ 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) config.h.in $(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) config.h.in $(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) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) config.h.in $(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" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist-recursive cscopelist cscopelist: cscopelist-recursive $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(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__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile config.h installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-hdr \ distclean-libtool distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \ cscopelist-recursive 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-cscope \ clean-generic clean-libtool cscope cscopelist \ cscopelist-recursive ctags ctags-recursive dist dist-all \ dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ dist-xz \ dist-zip distcheck distclean distclean-generic distclean-hdr \ 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-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 # 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: glpk-5.0/missing0000755000062000006210000002370313766346220013106 0ustar maomkpasswd#! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2012-01-06.18; # UTC # Copyright (C) 1996-2012 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, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try '$0 --help' for more information" exit 1 fi run=: sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' sed_minuso='s/.* -o \([^ ]*\).*/\1/p' # In the cases where this matters, 'missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case $1 in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle 'PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file 'aclocal.m4' autoconf touch file 'configure' autoheader touch file 'config.h.in' autom4te touch the output file, or create a stub one automake touch all 'Makefile.in' files bison create 'y.tab.[ch]', if possible, from existing .[ch] flex create 'lex.yy.c', if possible, from existing .c help2man touch the output file lex create 'lex.yy.c', if possible, from existing .c makeinfo touch the output file yacc create 'y.tab.[ch]', if possible, from existing .[ch] Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: Unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # normalize program name to check for. program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` # 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). This is about non-GNU programs, so use $1 not # $program. case $1 in lex*|yacc*) # Not GNU programs, they don't have --version. ;; *) 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 $program in aclocal*) echo 1>&2 "\ WARNING: '$1' is $msg. You should only need it if you modified 'acinclude.m4' or '${configure_ac}'. You might want to install the Automake and Perl packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf*) echo 1>&2 "\ WARNING: '$1' is $msg. You should only need it if you modified '${configure_ac}'. You might want to install the Autoconf and GNU m4 packages. Grab them from any GNU archive site." touch configure ;; autoheader*) echo 1>&2 "\ WARNING: '$1' is $msg. You should only need it if you modified 'acconfig.h' or '${configure_ac}'. You might want to install the Autoconf and GNU m4 packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case $f in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) echo 1>&2 "\ WARNING: '$1' is $msg. You should only need it if you modified 'Makefile.am', 'acinclude.m4' or '${configure_ac}'. You might want to install the Automake and Perl packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te*) echo 1>&2 "\ WARNING: '$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get '$1' as part of Autoconf from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison*|yacc*) echo 1>&2 "\ WARNING: '$1' $msg. You should only need it if you modified a '.y' file. You may need the Bison package in order for those modifications to take effect. You can get Bison from any GNU archive site." rm -f y.tab.c y.tab.h if test $# -ne 1; then eval LASTARG=\${$#} case $LASTARG in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.h fi ;; esac fi if test ! -f y.tab.h; then echo >y.tab.h fi if test ! -f y.tab.c; then echo 'main() { return 0; }' >y.tab.c fi ;; lex*|flex*) echo 1>&2 "\ WARNING: '$1' is $msg. You should only need it if you modified a '.l' file. You may need the Flex package in order for those modifications to take effect. You can get Flex from any GNU archive site." rm -f lex.yy.c if test $# -ne 1; then eval LASTARG=\${$#} case $LASTARG in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if test ! -f lex.yy.c; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man*) echo 1>&2 "\ WARNING: '$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the Help2man package in order for those modifications to take effect. You can get Help2man from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit $? fi ;; makeinfo*) echo 1>&2 "\ WARNING: '$1' is $msg. You should only need it if you modified a '.texi' or '.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy 'make' (AIX, DU, IRIX). You might want to install the Texinfo package or the GNU make package. Grab either from any GNU archive site." # The file to touch is that specified with -o ... file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n ' /^@setfilename/{ s/.* \([^ ]*\) *$/\1/ p q }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi # If the file does not exist, the user really needs makeinfo; # let's fail without touching anything. test -f $file || exit 1 touch $file ;; *) 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-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: glpk-5.0/NEWS0000644000062000006210000026546613766346220012224 0ustar maomkpasswdGLPK 5.0 (release date: Dec 16, 2020) The copyright was transferred to the Free Software Foundation. To fix some licensing problems the routines in the following files were disabled by replacing with dummy ones that print an error message: src/api/gridgen.c src/api/netgen.c src/api/rmfgen.c src/misc/qmd.c src/misc/relax4.c Note that this change does not affect the main faunctionality of the package. Some minor bugs were fixed. GLPK 4.65 (release date: Feb 16, 2018) The following new API routines for LP/MIP preprocessing were added: glp_npp_alloc_wksp allocate the preprocessor workspace glp_npp_load_prob load original problem instance glp_npp_preprocess1 perform basic LP/MIP preprocessing glp_npp_build_prob build resultant problem instance glp_npp_postprocess postprocess solution to resultant problem glp_npp_obtain_sol obtain solution to original problem glp_npp_free_wksp free the preprocessor workspace See doc/npp.txt for detailed description of these API routines. A new, more robust implementation of locally valid simple cover cuts was included in the MIP solver. The API routine glp_init_iocp was changed to enable long-step option of the dual simplex by default. GLPK 4.64 (release date: Dec 02, 2017) The dual simplex solver routine was changed to perform more aggressive perturbation to prevent dual degeneracy and avoid stalling even if the current dual basic solution is strongly feasible (mainly if the objective is zero). Thanks to David Monniaux for bug report and example model. The exact simplex solver routine was changed to perform terminal output according to the verbosity level (specified by the control parameter smcp.msg_lev). Thanks to Jeroen Demeyer for bug report. A minor bug (related to MS Windows version) was fixed. Thanks to Heinrich Schuchardt for bug report. An example model (Graceful Tree Labeling Problem) in MathProg was added. Thanks to Mike Appleby for contribution. Three example models (Power plant LP scheduler, Neumann CA grid emulator generator) in MathProg and one in Cplex LP format were added. Thanks to Peter Naszvadi for contribution. GLPK 4.63 (release date: Jul 25, 2017) A "smart" LP perturbation was implemented in the primal and dual simplex solvers. Now LP is perturbed only if it is necessary, and by default perturbation is not activated. The sum of primal infeasibilites that appears in the terminal output of the primal simplex solver (as "inf = ...") now corresponds to the original bounds of variables. This allows to see how much perturbed solution violates the original bounds. The long-step technique was implemented for phase I of the primal simplex solver. This feature can be enabled by specifying --flip option for glpsol or by specifying glp_smcp.r_test = GLP_RT_FLIP on api level. For many LP instances the long-step technique allows reducing the number of simplex iterations to 30-70%. Please note that unlike the dual simplex, where this technique can be used on both phase I and II, for the primal simplex it can be used only on phase I, where the sum of primal infeasibilities (which is a convex piecewise linear function) is minimized. An internal objective scaling was included in both primal and dual simplex solvers. For many LP/MIP instances this feature improves numerical stability (for the dual solver) and prevents cycling near the optimum (for the primal solver). The Posix version of glp_time (glpk/src/env/time.c) was changed to resolve time_t issue on msys2. Thanks to Rob Schroeder for bug report. Three new example models in MathProg were added: life_goe.mod (Conway's Game of Life garden of eden checker); tiling.mod (Rectifiable polyomino tilings generator); toto.mod (Covering code generator). Thanks to Peter Naszvadi for contribution. GLPK 4.62 (release date: Jun 14, 2017) The bound perturbation technique was included in the primal simplex solver to improve numerical stability and avoid cycling. Currently this feature is enabled by default. A range bug was fixed in the MPS reading routine. Thanks to Chris Matrakidis for bug report and patch. Changes were made to provide 64-bit portability of the Minisat solver. Thanks to Chris Matrakidis for patch. Calls to non-thread-safe functions gmtime, strerror, and strtok were replaced by calls to corresponding thread-safe equivalents (gmtime_r, strerror_r, and strtok_r for GNU/Linux). GLPK 4.61 (release date: Jan 22, 2017) An option was added to build a re-entrant version of the package suitable for running in a multi-threaded environment. This option is enabled by default on configuring the package if the compiler used supports the thread local storage class specifier (e.g. _Thread_local or __thread). Thanks to David Monniaux for suggestion and Chris Matrakidis for configure.ac patch. A re-entrant version of the package allows running multiple independent instances of glpk in different threads of a multi- threaded application. Note that glpk is not thread-safe by design, so if the application calls glpk routines from multiple threads, no thread may access glpk program objects (glp_prob, glp_tree, etc.) created by other threads; besides, each thread before termination should call the API routine glp_free_env to prevent memory leak. A DLL support was added. Thanks to Heinrich Schuchardt for contribution. Some changes were made to allow compiling the package using stdcall calling convention (this is needed only on compiling GLPK with MSVC to run under MS Windows). GLPK 4.60 (release date: Apr 01, 2016) Some improvements were made in the primal and dual simplex solvers to make the solution process more numerically stable. An experimental long-step ratio test feature was added to the dual simplex. On API level this feature is available thru the GLP_RT_FLIP option. For glpsol it is available thru the options --flip (for MIP) or --flip and --dual (for LP). This feature is not documented yet. Additional check was added to reject wrong solutions sometimes reported by the PROXY heuristic. A bug (memory leak) was fixed in the FPUMP heuristic routine. Thanks to for bug report. The header sql.h was renamed to avoid conflicts with standard ODBC headers. Thanks to Noli Sicad for bug report. GLPK 4.59 (release date: Mar 11, 2016) This is a maintainer release. Some bugs were fixed and some improvements were made in the MIP solver. Thanks to Chris Matrakidis for bug reports and patches. The data file format used by API routines glp_read_graph and glp_write_graph was changed. For more details please see the document "GLPK: Graph and Network Routines" included in the distribution. Translation of the document "Modeling Language GNU MathProg" to Brazilian Portuguese (pt-BR) was included (in LaTeX and pdf formats). Thanks to Joao Flavio de Freitas Almeida for contribution. GLPK 4.58 (release date: Feb 18, 2016) The solution file format used by API routines glp_read_sol, glp_write_sol, glp_read_ipt, glp_write_ipt, glp_read_mip, and glp_write_mip was changed. For more details please see the GLPK reference manual included in the distribution. The tan function (trigonometric tangent) was added to GNU MathProg modeling language. Thanks to Chris Matrakidis for contribution. A new version of the document "Modeling Language GNU MathProg" in Spanish was included (in LaTeX and pdf formats). Thanks to Pablo Yapura for contribution. A check to determine if libtool needs '-no-undefined' flag to build shared libraries on some platforms was added. Thanks to Marco Atzeri and Heinrich Schuchardt for suggestion. A script to regenerate the configure script and the Makefiles was added. Thanks to Heinrich Schuchardt . GLPK 4.57 (release date: Nov 08, 2015) A new, more efficient implementation of the dual simplex method was included in the package. This new implementation replaces the old one, which was removed. Option sr_heur was added to struct glp_iocp to enable/disable the simple rounding heuristic used by the MIP solver. Thanks to Chris Matrakidis for suggestion. New API routine glp_at_error was added and documented. Thanks to Jeroen Demeyer for suggestion. Some minor typos were corrected in the GLPK documentation. Thanks to Anton Voropaev for typo report. An example application program TSPSOL was added. It uses the GLPK MIP optimizer to solve the Symmetric Traveling Salesman Problem and illustrates "lazy" constraints generation. For more details please see glpk/examples/tsp/README. GLPK 4.56 (release date: Oct 01, 2015) A new, more efficient and more robust implementation of the primal simplex method was included in the package. This new implementation replaces the old one, which was removed. A bug was fixed in a basis factorization routine. (The bug appeared if the basis matrix was structurally singular having duplicate row and/or column singletons.) Thanks to Martin Jacob for bug report. Scripts to build GLPK with Microsoft Visual Studio 2015 were added. Thanks to Xypron for contribution and testing. GLPK 4.55 (release date: Aug 22, 2014) Some internal (non-API) routines to estimate the condition of the basis matrix were added. These routines are mainly intended to be used by the simplex-based solvers. Two open modes "a" and "ab" were added to GLPK I/O routines. Thanks to Pedro P. Wong for bug report. Minor bug was fixed in the solver glpsol (command-line options --btf, --cbg, and --cgr didn't work properly). A serious bug was fixed in a basis factorization routine used on the dense phase. (The bug might appear only if the number of rows exceeded sqrt(2**31) ~= 46,340 and caused access violation exception because of integer overflow.) Thanks to Mark Meketon for bug report. Two API routines glp_alloc and glp_realloc were documented. Thanks to Brian Gladman for suggestion. Translation of the document "Modeling Language GNU MathProg" to Spanish was included (in LaTeX and pdf formats). Thanks to Pablo Yapura for contribution. GLPK 4.54 (release date: Mar 28, 2014) Block-triangular LU-factorization was implemented to be used on computing an initial factorization of the basis matrix. A new version of the Schur-complement-based factorization module was included in the package. Now it can be used along with plain as well as with block-triangular LU-factorization. Currently the following flags can be used to specify the type of the basis matrix factorization (glp_bfcp.type): GLP_BF_LUF + GLP_BF_FT LUF, Forrest-Tomlin update (default) GLP_BF_LUF + GLP_BF_BG LUF, Schur complement, Bartels-Golub update GLP_BF_LUF + GLP_BF_GR LUF, Schur complement, Givens rotation update GLP_BF_BTF + GLP_BF_BG BTF, Schur complement, Bartels-Golub update GLP_BF_BTF + GLP_BF_GR BTF, Schur complement, Givens rotation update In case of GLP_BF_FT the update is applied to matrix U, while in cases of GLP_BF_BG and GLP_BF_GR the update is applied to the Schur complement. Corresponding new options --luf and --btf were added to glpsol. For more details please see a new edition of the GLPK reference manual included in the distribution. A minor bug (in reporting the mip solution status) was fixed. Thanks to Remy Roy for bug report. A call to "iodbc-config --cflags" was added in configure.ac to correctly detect iodbc flags. Thanks to Sebastien Villemot for patch. GLPK 4.53 (release date: Feb 13, 2014) The API routine glp_read_mps was changed to remove free rows. A bug was fixed in the API routine glp_read_lp. Thanks to Gabriel Hackebeil for bug report. The zlib compression library used by some GLPK routines and included in the package was downgraded from 1.2.7 to 1.2.5 (as in GLPK 4.50) because of addressability bugs on some 64-bit platforms. Thanks to Carlo Baldassi for bug report. A bug was fixed in a routine that reads gzipped files. Thanks to Achim Gaedke for bug report. Two API routines glp_get_it_cnt and glp_set_it_cnt were added. Thanks to Joey Rios for suggestion. All obsolete GLPK API routines (prefixed with lpx) were removed from the package. A set of routines that simulate the old GLPK API (as defined in 4.48) were added; see examples/oldapi/api/lpx.c. Thanks to Jan Engelhardt for suggestion. A namespace bug was fixed in the SQL table drive module. Thanks to Dennis Schridde for bug report. GLPK 4.52.1 (release date: Jul 28, 2013) This is a bug-fix release. A version information bug in Makefile.am was fixed. Thanks to Sebastien Villemot for bug report. GLPK 4.52 (release date: Jul 18, 2013) The clique cut generator was essentially reimplemented, and now it is able to process very large and/or dense conflict graphs. A simple rounding heuristic was added to the MIP optimizer. Some bugs were fixed in the proximity search heuristic routine. Thanks to Giorgio Sartor <0gioker0@gmail.com>. New command-line option '--proxy [nnn]' was added to glpsol to enable using the proximity search heuristic. A bug (incorrect processing of LI column indicator) was fixed in the mps format reading routine. Thanks to Charles Brixko for bug report. GLPK 4.51 (release date: Jun 19, 2013) Singleton and dense phases were implemented on computing LU-factorization with Gaussian elimination. The singleton phase is a feature that allows processing row and column singletons on initial elimination steps more efficiently. The dense phase is a feature used on final elimination steps when the active submatrix becomes relatively dense. It significantly reduces the time needed, especially if the active submatrix fits in CPU cache, and improves numerical accuracy due to full pivoting. The API routine glp_adv_basis that constructs advanced initial LP basis was replaced by an improved version, which (unlike the old version) takes into account numerical values of constraint coefficients. The proximity search heuristic for MIP was included in the GLPK integer optimizer glp_intopt. On API level the heuristic can be enabled by setting the parameter ps_heur in glp_iocp to GLP_ON. This feature is also available in the solver glpsol through command-line option '--proxy'. Many thanks to Giorgio Sartor <0gioker0@gmail.com> for contribution. A bug was fixed that caused numerical instability in the FPUMP heuristic. GLPK 4.50 (release date: May 24, 2013) A new version of LU-factorization routines were added. Currently this version provides the same functionality as the old one, however, the new version allows further improving. Old routines for FHV-factorization used to update the basis factorization were replaced by a new version conforming to the new version of LU-factorization. Some clarifications about using the name index routines were added. Thanks to Xypron for suggestion. Some typos were corrected in the MathProg language reference. Thanks to Jeffrey Kantor for report. A serious bug (out-of-range indexing error) was *tentatively* fixed in the routine glp_relax4. Unfortunatly, this bug is inherited from the original Fortran version of the RELAX-IV code (for details please see ChangeLog), and since the code is very intricate, the bug is still under investigation. Thanks to Sylvain Fournier for bug report. GLPK 4.49 (release date: Apr 16, 2013) The new API routine glp_mincost_relax4, which is a driver to relaxation method of Bertsekas and Tseng (RELAX-IV), was added to the package. RELAX-IV is a code for solving minimum cost flow problems. On large instances it is 100-1000 times faster than the standard primal simplex method. Prof. Bertsekas, the author of the original RELAX-IV Fortran code, kindly permitted to include a C translation of his code in GLPK under GPLv3. A bug (wrong dual feasibility test) was fixed in API routine glp_warm_up. Thanks to David T. Price for bug report. Obsolete API routine lpx_check_kkt was replaced by new routine glp_check_kkt. IMPORTANT: All old API routines whose names begin with 'lpx_' were removed from API level and NO MORE AVAILABLE. GLPK 4.48 (release date: Jan 28, 2013) This is a maintainer release. Some minor changes in API (glpk.h) were made. For details please see ChangeLog. Some bugs/typos were fixed. Thanks to Raniere Gaia Costa da Silva, Heinrich Schuchardt , and Robbie Morrison for reports. GLPK 4.47 (release date: Sep 09, 2011) The new API routine glp_intfeas1 was added to the package. This routine is a tentative implementation of the integer (0-1) feasibility solver based on the CNF-SAT solver (which currently is MiniSat). It may be used in the same way as glp_intopt to find either any integer feasible solution or a solution, for which the objective function is not worse than the specified value. Detailed description of this routine can be found in the document "CNF Satisfiability Problem", which is included in the distribution (see doc/cnfsat.pdf). The following two options were added to glpsol: --minisat translate 0-1 feasibility problem to CNF-SAT problem and solve it with glp_intfeas1/MiniSat (if the problem instance is already in CNF-SAT format, no translation is performed) --objbnd bound add inequality obj <= bound (minimization) or obj >= bound (maximization) to 0-1 feasibility problem (this option assumes --minisat) The paint-by-numbers puzzle model (pbn.mod) included in the distribution is a nice example of the 0-1 feasibility problem, which can be efficiently solved with glp_intfeas1/MiniSat. This model along with a brief instruction (pbn.pdf) and benchmark examples from encoded in GNU MathProg (*.dat) can be found in subdirectory examples/pbn/. The glpsol lp/mip solver was modified to bypass postprocessing of MathProg models if the solution reported is neither optimal nor feasible. A minor bug in examples/Makefile.am was fixed to correctly build glpk in a separate directory. Thanks to Marco Atzeri for bug report and patch. GLPK 4.46 (release date: Aug 09, 2011) The following new API routines were added: glp_read_cnfsat read CNF-SAT problem data in DIMACS format glp_check_cnfsat check for CNF-SAT problem instance glp_write_cnfsat write CNF-SAT problem data in DIMACS format glp_minisat1 solve CNF-SAT problem instance with MiniSat The routine glp_minisat1 is a driver to MiniSat, a CNF-SAT solver developed by Niklas Een and Niklas Sorensson, Chalmers University of Technology, Sweden. This routine is similar to the routine glp_intopt, however, it is intended to solve a 0-1 programming problem instance, which is the MIP translation of a CNF-SAT problem instance. Detailed description of these new API routines can be found in the document "CNF Satisfiability Problem", which is included in the distribution (see files doc/cnfsat.tex and doc/cnfsat.pdf). The following new glpsol command-line options were added: --cnf filename read CNF-SAT problem instance in DIMACS format from filename and translate it to MIP --wcnf filename write CNF-SAT problem instance in DIMACS format to filename --minisat solve CNF-SAT problem instance with MiniSat solver The zlib compression library (version 1.2.5) was ANSIfied, modified according to GLPK requirements and included in the distribution as an external software module. Thus, now this feature is platform independent. Some bugs were fixed in the SQL table driver. Thanks to Xypron . GLPK 4.45 (release date: Dec 05, 2010) This is a bug-fix release. Several bugs/typos were fixed. Thanks to Xypron , Robbie Morrison , and Ali Baharev for reports. Some glpk documents was re-formatted and merged into a single document. Now the glpk documentation consists of the following three main documents (all included in the distribution): GLPK: Reference Manual GLPK: Graph and Network Routines Modeling Language GNU MathProg: Language Reference GLPK 4.44 (release date: Jun 03, 2010) The following suffixes for variables and constraints were implemented in the MathProg language: .lb (lower bound), .ub (upper bound), .status (status in the solution), .val (primal value), and .dual (dual value). Thanks to Xypron for draft implementation and testing. Now the MathProg language allows comment records (marked by '#' in the very first position) in CSV data files read with the table statements. Note that the comment records may appear only in the beginning of a CSV data file. The API routine glp_cpp to solve the Critical Path Problem was added and documented. GLPK 4.43 (release date: Feb 20, 2010) This is a maintainer release. `configure.ac' was changed to allow building the package under Mac OS and Darwin with ODBC support. Thanks to Xypron for suggestions and Noli Sicad for testing. The SQL table driver was improved to process NULL data. Thanks to Xypron . Some bugs were fixed in the LP/MIP preprocessor. GLPK 4.42 (release date: Jan 13, 2010) The following new API routines were added: glp_check_dup check for duplicate elements in sparse matrix glp_sort_matrix sort elements of the constraint matrix glp_read_prob read problem data in GLPK format glp_write_prob write problem data in GLPK format glp_analyze_bound analyze active bound of non-basic variable glp_analyze_coef analyze objective coefficient at basic variable glp_print_ranges print sensitivity analysis report (this routine replaces lpx_print_sens_bnds and makes it deprecated) For description of these new routines and the GLPK LP/MIP format see a new edition of the reference manual included in the distribution. (Chapter "Graph and network API routines" was carried out from the main reference manual and included in the distribution as a separate document.) The following new command-line options were added to the stand- alone solver glpsol: --glp filename read problem data in GLPK format --wglp filename write problem data in GLPK format --ranges filename print sensitivity analysis report (this option replaces --bounds) Now all GLPK routines performing file I/O support special filenames "/dev/stdin", "/dev/stdout", and "/dev/stderr", which can be specified in the same way as regular filenames. This feature is plaform-independent. GLPK 4.41 (release date: Dec 21, 2009) The following new API routies were added: glp_transform_row transform explicitly specified row glp_transform_col transform explicitly specified column glp_prim_rtest perform primal ratio test glp_dual_rtest perform dual ratio test For description of these new routines see a new edition of the reference manual included in the distribution. The following API routines are deprecated: lpx_transform_row, lpx_transform_col, lpx_prim_ratio_test, lpx_dual_ratio_test. Some improvements were made in the MIP solver (glp_intopt). The SQL table driver used to read/write data in MathProg models was changed to allow multiple arguments separated by semicolon in SQL statements. Thanks to Xypron . Two new options were added to the glpsol stand-alone solver: --seed value (to initialize the pseudo-random number generator used in MathProg models with specified value), and --ini filename (to use a basis previously saved with -w option as an initial basis on solving similar LP's). Two new MathProg example models were included. Thanks to Nigel Galloway and Noli Sicad for contribution. Scripts to build GLPK with Microsoft Visual Studio 2010 for both 32-bit and 64-bit Windows were included. Thanks to Xypron for contribution and testing. GLPK 4.40 (release date: Nov 03, 2009) The following new API routines were added: glp_del_vertices remove vertices from graph glp_del_arc remove arc from graph glp_wclique_exact find maximum weight clique with the exact algorithm developed by Prof. P. Ostergard glp_read_ccdata read graph in DIMACS clique/coloring format glp_write_ccdata write graph in DIMACS clique/coloring format For description of these new routines see a new edition of the reference manual included in the distribution. The hybrid pseudocost branching heuristic was included in the MIP solver. It is available on API level (iocp.br_tech should be set to GLP_BR_PCH) and in the stand-alone solver glpsol (via the command-line option --pcost). This heuristic may be useful on solving hard MIP instances. The branching heuristic by Driebeck and Tomlin (used in the MIP solver by default) was changed to switch to branching on most fractional variable if an lower bound of degradation of the objective is close to zero for all branching candidates. A bug was fixed in the LP preprocessor (routine npp_empty_col). Thanks to Stefan Vigerske for the bug report. A bug was fixed and some improvements were made in the FPUMP heuristic module. Thanks to Xypron . A bug was fixed in the API routine glp_warm_up (dual feasibility test was incorrect in maximization case). Thanks to Uday Venkatadri for the bug report. GLPK 4.39 (release date: Jul 26, 2009) The following new API routines were added: glp_warm_up "warm up" LP basis glp_set_vertex_name assign (change) vertex name glp_create_v_index create vertex name index glp_find_vertex find vertex by its name glp_delete_v_index delete vertex name index glp_read_asnprob read assignment problem data in DIMACS format glp_write_asnprob write assignment problem data in DIMACS format glp_check_asnprob check correctness of assignment problem data glp_asnprob_lp convert assignment problem to LP glp_asnprob_okalg solve assignment problem with the out-of-kilter algorithm glp_asnprob_hall find bipartite matching of maxumum cardinality with Hall's algorithm Also were added some API routines to read plain data files. The API routines glp_read_lp and glp_write_lp to read/write files in CPLEX LP format were re-implemented. Now glp_write_lp correctly writes double-bounded (ranged) rows by introducing slack variables rather than by duplicating the rows. For description of these new routines see a new edition of the reference manual included in the distribution. The 'xfree(NULL)' bug was fixed in the AMD routines. Thanks to Niels Klitgord for bug report. The message "Crashing..." was changed to "Constructing initial basis..." due to suggestion by Thomas Kahle . Some typos were corrected in glpsol output messages. Thanks to Xypron for patch. GLPK 4.38 (release date: May 02, 2009) API routines glp_read_mps and glp_write_mps were improved. Some improvements were made in the dual simplex routines. Two external software modules AMD and COLAMD were included in the distribution (for more details please see src/amd/README and src/colamd/README). Now they are used in the interior-point solver to reorder the matrix prior to Cholesky factorization. API routine glp_ipt_status may return two new statuses due to changes in the routine glp_interior. For details please see the reference manual included in the distribution. A minor bug was fixed in the graph/network routines. Thanks to Nelson H. F. Beebe for bug report. GLPK 4.37 (release date: Mar 29, 2009) The 0-1 Feasibility Pump heuristic was included in the GLPK integer optimizer glp_intopt. On API level the heuristic can be enabled by setting the parameter fp_heur in glp_iocp to GLP_ON. This feature is also available in the solver glpsol through command-line option '--fpump'. For more details please see the reference manual included in the distribution. The following new API routines were added: glp_print_sol write basic solution in printable format glp_print_ipt write interior-point solution in printable format glp_print_mip write MIP solution in printable format glp_read_graph read (di)graph from plain text file glp_write_graph write (di)graph to plain text file glp_weak_comp find all weakly connected components glp_strong_comp find all strongly connected components The following API routines are deprecated: lpx_print_sol, lpx_print_ips, lpx_print_mip, lpx_print_prob (the latter is equivalent to glp_write_lp). A bug was fixed in the interior-point solver (glp_interior) to correctly compute dual solution components when the problem is scaled. The files configure.ac and Makefile.am were changed: (a) to allow using autoreconf/autoheader; (b) to allow building the package in a directory other than its source directory. Thanks to Marco Atzeri for bug report. An example model in the GNU MathProg language was added. Thanks to Larry D'Agostino for contribution. GLPK 4.36 (release date: Feb 06, 2009) The following new API routines were added to the package: glp_mincost_okalg find minimum-cost flow with out-of-kilter algorithm glp_maxflow_ffalg find maximal flow with Ford-Fulkerson algorithm For detailed description of these new routines and related data structures see chapter "Graph and Network API Routines" in a new edition of the reference manual included in the distribution. The following two new command-line options were added to the solver glpsol: --mincost read min-cost flow data in DIMACS format --maxflow read maximum flow data in DIMACS format Duplicate symbols in the header glpk.h were removed to allow using swig. Thanks to Kelly Westbrooks and Nigel Galloway for suggestion. A minor defect was fixed in the routine glp_write_lp. Thanks to Sebastien Briais for bug report. A minor bug was fixed in the SQL module. Thanks to Xypron for patch. Some new example models in the GNU MathProg modeling language were added. Thanks to Sebastian Nowozin and Nigel Galloway for contribution. GLPK 4.35 (release date: Jan 09, 2009) The following new API routines were added to the package: glp_create_graph create graph glp_set_graph_name assign (change) graph name glp_add_vertices add new vertices to graph glp_add_arc add new arc to graph glp_erase_graph erase graph content glp_delete_graph delete graph glp_read_mincost read minimum cost flow problem data in DIMACS format glp_write_mincost write minimum cost flow problem data in DIMACS format glp_mincost_lp convert minimum cost flow problem to LP glp_netgen Klingman's network problem generator glp_gridgen grid-like network problem generator glp_read_maxflow read maximum flow problem data in DIMACS format glp_write_maxflow write maximum flow problem data in DIMACS format glp_maxflow_lp convert maximum flow problem to LP glp_rmfgen Goldfarb's maximum flow problem generator For detailed description of these new routines and related data structures see chapter "Graph and Network API Routines" in a new edition of the reference manual included in the distribution. A minor change were made in the internal routine xputc. Thanks to Luiz Bettoni for suggestion. A minor bug was fixed in the internal routine mpl_fn_time2str. Thanks to Stefan Vigerske for bug report. GLPK 4.34 (release date: Dec 04, 2008) The GNU MathProg modeling language was supplemented with three new built-in functions: gmtime obtaining current calendar time str2time converting character string to calendar time time2str converting calendar time to character string (Thanks to Xypron .) For detailed description of these functions see Appendix A in the document "Modeling Language GNU MathProg", a new edition of which was included in the distribution. A bug was fixed in the MIP solver. Thanks to Nigel Galloway for bug report. A new makefile was added to build the GLPK DLL with Microsoft Visual Studio Express 2008 for 64-bit Windows. Thanks to Xypron for contribution and testing. GLPK 4.33 (release date: Oct 30, 2008) The following new API routines were added to the package: glp_copy_prob copy problem object content glp_exact solve LP in exact arithmetic (makes lpx_exact deprecated) glp_get_unbnd_ray determine variable causing unboundedness (makes lpx_get_ray_info deprecated) glp_interior solve LP with interior-point method (makes lpx_interior deprecated) The following new API routines for processing models written in the GNU Mathprog language were added to the package: glp_mpl_alloc_wksp allocate the translator workspace glp_mpl_read_model read and translate model section glp_mpl_read_data read and translate data section glp_mpl_generate generate the model glp_mpl_build_prob build LP/MIP instance from the model glp_mpl_postsolve postsolve the model glp_mpl_free_wksp deallocate the translator workspace (These routines make lpx_read_model deprecated.) For description of all these new API routines see the reference manual included in the distribution. A crude implementation of CPLEX-like interface to GLPK API was added to the package. Currently it allows using GLPK as a core LP solver for Concorde, a well known computer code for solving the symmetric TSP. For details see examples/cplex/README. Some bugs were fixed in the SQL table driver. Thanks to Xypron . GLPK 4.32 (release date: Oct 03, 2008) The following new features were included in the MIP solver (the API routine glp_intopt): * MIP presolver * mixed cover cut generator * clique cut generator * Euclidean reduction of the objective value Due to changes the routine glp_intopt may additionally return GLP_ENOPFS, GLP_ENODFS, and GLP_EMIPGAP. The API routines lpx_integer are lpx_intopt are deprecated, since they are completely superseded by glp_intopt. The following new branch-and-cut API routines were added: glp_ios_row_attr determine additional row attributes glp_ios_pool_size determine current size of the cut pool glp_ios_add_row add constraint to the cut pool glp_ios_del_row delete constraint from the cut pool glp_ios_clear_pool delete all constraints from the cut pool For description of these new routines see the reference manual included in the distribution. The stand-alone solver glpsol was changed to allow multiple data files. A new edition of the supplement "Using Data Tables in the GNU MathProg Modeling Language" was included. As usual, some bugs were fixed (in the MathProg translator). Thanks to Xypron . GLPK 4.31 (release date: Sep 02, 2008) The core LP solver based on the dual simplex method was re-implemented and now it provides both phases I and II. The following new API routines were added: glp_scale_prob automatic scaling of problem data glp_std_basis construct standard initial LP basis glp_adv_basis construct advanced initial LP basis glp_cpx_basis construct Bixby's initial LP basis For description of these new routines see the reference manual included in the distribution. The following API routines are deprecated: lpx_scale_prob, lpx_std_basis, lpx_adv_basis, lpx_cpx_basis. Necessary changes were made in memory allocation routines to resolve portability issues for 64-bit platforms. New version of the routine lpx_write_pb to write problem data in OPB (pseudo boolean format) was added to the package. Thanks to Oscar Gustafsson for the contribution. Two new makefiles were added to build the package for 32- and 64-bit Windows with Microsoft Visual Studio Express 2008. Thanks to Heinrich Schuchardt (aka Xypron) for the contribution and testing. Two new makefiles were added to build the package with Digital Mars C/C++ 8.50 and Open Watcom C/C++ 1.6 (for 32-bit Windows). GLPK 4.30 (release date: Aug 13, 2008) The core LP solver based on the primal simplex method was re-implemented to allow its further improvements. Currently the new version provides the same features as the old one, however, it is a bit faster and more numerically stable. Some changes were made in the MathProg translator to allow <, <=, >=, and > on comparing symbolic values. Thanks to Heinrich Schuchardt for patches. Internal routine set_d_eps in the exact LP solver was changed to prevent approximation errors in case of integral data. Thanks to Markus Pilz for bug report. GLPK 4.29 (release date: Jul 06, 2008) The configure script was changed to disable all optional features by default. For details please see file INSTALL. The following new API routines were added: glp_erase_prob erase problem object content glp_read_mps read problem data in MPS format glp_write_mps write problem data in MPS format glp_read_lp read problem data in CPLEX LP format glp_write_lp write problem data in CPLEX LP format For description of these new routines see the reference manual included in the distribution. The following API routines are deprecated: lpx_read_mps, lpx_read_freemps, lpx_write_mps, lpx_write_freemps, lpx_read_cpxlp, and lpx_write_cpxlp. Two bugs were fixed. Thanks to Anne-Laurence Putz and Xypron for bug report. GLPK 4.28 (release date: Mar 25, 2008) The iODBC and MySQL table drivers, which allows transmitting data between MathProg model objects and relational databases, were re-implemented to replace a static linking by a dynamic linking to corresponding shared libraries. Many thanks to Heinrich Schuchardt for the contribution, Rafael Laboissiere for useful advices concerning the shared library support under GNU/Linux, and Vijay Patil for testing this feature under Windows XP. A new optional feature was added to the package. This feature is based on the zlib data compression library and allows GLPK API routines and the stand-alone solver to read and write compressed data files performing compression/decompression "on the fly" (compressed data files are recognized by suffix `.gz' in the file name). It may be useful in case of large MPS files to save the disk space (up to ten times). The `configure' script was re-implemented. Now it supports the following specific options: --with-gmp Enable using the GNU MP bignum library --without-gmp Disable using the GNU MP bignum library --with-zlib Enable using the zlib data compression library --without-zlib Disable using the zlib data compression library --enable-dl Enable shared library support (auto check) --enable-dl=ltdl Enable shared library support (GNU) --enable-dl=dlfcn Enable shared library support (POSIX) --disable-dl Disable shared library support --enable-odbc Enable using ODBC table driver --disable-odbc Disable using ODBC table driver --enable-mysql Enable using MySQL table driver --disable-mysql Disable using MySQL table driver For more details please see file INSTALL. GLPK 4.27 (release date: Mar 02, 2008) Three new table drivers were added to the MathProg translator: xBASE built-in table driver, which allows reading and writing data in .dbf format (only C and N fields are supported); MySQL table driver, which provides connection to a MySQL database; iODBC table driver, which provides connection to a database through ODBC. The MySQL and iODBC table drivers were contributed to GLPK by Heinrich Schuchardt . The table driver is a program module which allows transmitting data between MathProg model objects and external data tables. For detailed description of the table statement and table drivers see the document "Using Data Tables in the GNU MathProg Modeling Language" (file doc/tables.txt) included in the distribution. Some examples which demonstrate using MySQL and iODBC table drivers can be found in subdirectory examples/sql. GLPK 4.26 (release date: Feb 17, 2008) The table statement was implemented in the GNU MathProg modeling language. This new feature allows reading data from external tables into model objects such as sets and parameters as well as writing results of computations to external tables. A table is a (unordered) set of records, where each record consists of the same number of fields, and each field is provided with a unique symbolic name called the field name. Currently the GLPK package has the only built-in table driver, which supports tables in the CSV (comma-separated values) file format. This format is very simple and supported by almost all spreadsheets and database management systems. Detailed description of the table statement and CSV format can be found in file doc/tables.txt, included in the distribution. GLPK 4.25 (release date: Dec 19, 2007) A tentative implementation of Gomory's mixed integer cuts was included in the branch-and-cut solver. To enable generating Gomory's cuts the control parameter gmi_cuts passed to the routine glp_intopt should be set to GLP_ON. This feature is also available in the solver glpsol through command-line option '--gomory'. For more details please see the reference manual included in the distribution. GLPK 4.24 (release date: Nov 21, 2007) A tentative implementation of MIR (mixed integer rounding) cuts was included in the MIP solver. To enable generating MIR cuts the control parameter mir_cuts passed to the routine glp_intopt should be set to GLP_ON. This feature is also available in the stand-alone solver glpsol via command-line option '--mir'. For more details please see the reference manual included in the distribution. The implementation is mainly based on the following two papers: 1. H. Marchand and L. A. Wolsey. Aggregation and mixed integer rounding to solve MIPs. CORE discussion paper 9839, CORE, Universite catholique de Louvain, June 1998. 2. G. Andreello, A. Caprara, and M. Fischetti. Embedding cuts in a Branch&Cut framework. Preliminary draft, October 2003. MIR cuts can be generated on any level of the search tree that makes the GLPK MIP solver to be a real branch-and-cut solver. A bug was fixed in the routine lpx_write_cpxlp. If a variable x has upper bound and no lower bound, it should appear in the bounds section as "-inf <= x <= u", not as "x <= u". Thanks to Enric Rodriguez for the bug report. GLPK 4.23 (release date: Oct 28, 2007) The following new API routines were added: glp_read_sol read basic solution from text file glp_write_sol write basic solution to text file glp_read_ipt read interior-point solution from text file glp_write_ipt write interior-point solution to text file glp_read_mip read MIP solution from text file glp_write_mip write MIP solution to text file For description of these routines and corresponding file formats see Chapter "API Routines", Section "Utility routines" in the reference manual included in the distribution. Advanced API routine glp_free_env was added. It may be used by the application program to free all resources allocated by GLPK routines. The following three new command-line options were added to the solver glpsol: --mipgap tol set relative MIP gap tolerance -r filename read solution from filename -w filename write solution to filename GLPK 4.22 (release date: Sep 19, 2007) This is a maintainer release. A bug was fixed in the MIP preprocessor (ios_preprocess_node). Thanks to Roberto Bagnara (Department of Mathematics, University of Parma, Italy) for the bug report. A bug was fixed in the MIP preprocessor (col_implied_bounds), due to which constraint coefficients with small magnitude could lead to wrong implied bounds of structural variables. A similar bug was fixed in the routine reduce_bounds. A bug was fixed in the routines glp_set_mat_row and glp_set_mat_col. (The bug appeared due to incorrect removing zero elements from the row/column lists.) A bug was fixed in the API routines lpx_read_mps and lpx_read_freemps, due to which bounds of type LI specified in BOUNDS section were incorrectly processed. A call to standard function vsprintf was replaced by a call to vsnprintf for security reasons. Many thanks to Peter T. Breuer and Rafael Laboissiere . GLPK 4.21 (release date: Aug 28, 2007) Additional reasons for calling the callback routine used in the MIP solver (glp_intopt) were introduced. Currently the following reasons are supported: * request for subproblem selection * request for preprocessing * request for row generation * request for heuristic solution * request for cut generation * request for branching * better integer solution found A basic preprocessing component used to improve subproblem formulations by tightening bounds of variables was included in the MIP solver. Depending on the control parameter pp_tech passed to the routine glp_intopt the preprocessing can be performed either on the root level or on all levels (default) or can be disabled. Backtracking heuristic used by default in the MIP solver was changed to the "best local bound". For more details see Chapter "Advanced API routines", Section "Branch-and-bound interface routines" in a new edition of the reference manual included in the distribution. GLPK 4.20 (release date: Jul 26, 2007) API routine lpx_integer was replaced by API routine glp_intopt, which provides equivalent functionality and additionally allows the application to control the solution process by means of the user-written callback routine, which is called by the solver at various points of the branch-and-bound algorithm. Besides, the new MIP solver allows generating "lazy" constraints and cutting planes on all levels of the branch-and-bound tree, not only on the root level. The routine lpx_integer is also still available for the backward compatibility. The following new advanced API routines, which may be called from the B&B callback routine, were included in the package: glp_ios_reason determine reason for calling callback routine glp_ios_get_prob access the problem object glp_ios_tree_size determine size of the branch-and-bound tree glp_ios_curr_node determine current active subproblem glp_ios_next_node determine next active subproblem glp_ios_prev_node determine previous active subproblem glp_ios_up_node determine parent subproblem glp_ios_node_level determine subproblem level glp_ios_node_bound determine subproblem local bound glp_ios_mip_gap compute relative MIP gap glp_ios_heur_sol provide solution found by heuristic glp_ios_terminate terminate the solution process For description of these routines see Chapter "Advanced API routines", Section "Branch-and-bound interface routines" in a new edition of the reference manual, which was included in the distribution. Old version of the integer optimization suite (IOS) as well as TSP solver tspsol based on it are no longer supported and were removed from the package. A minor error in the MIP presolver was fixed; thanks to Graham Rockwell for the bug report. GLPK 4.19 (release date: Jul 05, 2007) The principal change is upgrading to GPLv3. A serious bug in the routine glp_del_cols was fixed; thanks to Cedric[FR] for the bug report. The bug appeared because on deleting non-basic columns the basis header remained valid, however, contained invalid (old) column ordinal numbers. A new advanced API routine glp_mem_limit was added. The case GLP_EBOUND was added to the routine lpx_simplex. Thanks to Cameron Kellough for the bug report. An API routine lpx_write_pb to write the problem instance in OPB (pseudo boolean) format format was added. Thanks to Oscar Gustafsson for the contribution. Two new options --wpb and --wnpb were added to glpsol to write the problem instance in OPB format. GLPK 4.18 (release date: Jun 25, 2007) The following new API routines were added: glp_set_rii set (change) row scale factor glp_set_sjj set (change) column scale factor glp_get_rii retrieve row scale factor glp_get_sjj retrieve column scale factor glp_simplex solve LP problem with the simplex method (this routine replaces lpx_simplex, which is also available for backward compatibility) glp_init_smcp initialize simplex method control params glp_bf_exists check if the basis factorization exists glp_factorize compute the basis factorization glp_bf_updated check if the basis factorization has been updated glp_get_bfcp retrieve basis factorization control params glp_set_bfcp change basis factorization control params glp_get_bhead retrieve the basis header information glp_get_row_bind retrieve row index in the basis header glp_get_col_bind retrieve column index in the basis header glp_ftran perform forward transformation glp_btran perform backward transformation For description of all these routines see a new edition of the reference manual included in the distribution. Type names ulong_t and uldiv_t were changed to glp_ulong and glp_uldiv to avoid conflicts with standard type names on some platforms. Thanks to Boris Wirtz for the bug report. Some new examples in the MathProg language were added. Thanks to Sebastian Nowozin . GLPK 4.17 (release date: May 26, 2007) API routines glp_set_mat_row, glp_set_mat_col, and glp_load_mat were modified to allow zero constraint coefficients (which are not stored in the constraint matrix). Note that constraint coefficients with duplicate row/column indices are not allowed. Another form of LP basis factorization was implemented in the package. It is based on LU-factorization of an initial basis and Schur complement to reflect changes in the basis. Currently the implementation is incomplete and provides only updating the factorization on replacing a column of the basis matrix. On API level the user can set the control parameter LPX_K_BFTYPE to choose between the folloiwng forms of LP basis factorization to be used in the simplex method routines: 1) LU + Forrest-Tomlin update; 2) LU + Schur complement + Bartels-Golub update; 3) LU + Schur complement + Givens rotation update. The GLPK implementation is similar to LUSOL/LUMOD developed by Michael A. Saunders. The user can choose the form of LP basis factorzation used by the simplex method routines by specifying the folloiwng options of glpsol: --luf, --cbg, --cgr. GLPK 4.16 (release date: May 05, 2007) A number of basic GLPK API routines, which now are in the stable stable, were renamed to be prefixed with 'glp_'. Note that all these routines are available via their old names prefixed with 'lpx_' that keeps the downward compatibility with older versions of the package. Three new GLPK API routines were added to the package: glp_version, glp_term_hook, and glp_mem_usage; for more details see a new edition of the GLPK reference manual included in the distribution. The routine glp_version reports the actual version of the GLPK library and also can be used (along with the header glpk.h) in Autotools specification files to check if the GLPK library has been installed. The header glpk.h was changed to conform to C++ environment. GLPK 4.15 (release date: Feb 18, 2007) Autotools specification files (configure.ac, Makefile.am) were changed to use GNU Libtool. This allows building the static as well as shared GLPK library. GLPK 4.14 (release date: Feb 05, 2007) Now GLPK conforms to ILP32, LLP64, and LP64 programming models (the latter seems to be the ultimate choice regarding 64-bit architectures). Note that GLPK itself is a 32-bit application, and the conformity only means that the package works correctly on all these arenae. Nevertheless, on 64-bit platforms it is possible to use more than 4GB of memory, if necessary. GLPK 4.13 (release date: Nov 13, 2006) A tentative implementation of the "exact" simplex method based on bignum (rational) arithmetic was included in the package. On API level this new feature is available through the routine lpx_exact, which is similar to the routine lpx_simplex. In the solver glpsol this feature is available through two new command-line options: --exact and --xcheck. If the '--exact' option is specified, glpsol solves LP instance using the exact simplex method; in case of MIP it is used to obtain optimal solution of LP relaxation. If the --xcheck option is specified, LP instance (or LP relaxation) is solved using the standard (floating-point) simplex method, however, then glpsol calls the exact simplex routine to make sure that the final LP basis is exactly optimal, and if it is not, to perform some additional simplex iterations in exact arithmetic. GLPK 4.12 (release date: Nov 08, 2006) A tentative implementation of some simplex method routines based on exact (bignum) arithmetic was included in the package. Currently these routines provide computing LU-factorization of the basis matrix and computing components of basic solution. These routines were used to implement a routine, which checks primal and dual feasibility of basic solution exactly, i.e. in rational numbers, without round-off errors. In glpsol this feature is available through the command-line option --xcheck. GLPK has its own low-level routines implementing operations on integer and rational numbers that makes it independent on other software packages. However, to attain a much better performance it is highly recommended to install (before configuring GLPK) the GNU Multiple Precision Arithmetic Library (GMP). Using GMP makes computations 100-200 times faster. GLPK 4.11 (release date: Jul 25, 2006) Three new built-in functions in the modeling language were implemented: card (cardinality of set), length (length of character string), and substr (substring of character string). Another improvement concerns the printf statement which now allows redirecting its output to a specified file. These new features are illustrated in example models crypto.mod and graph.mod included in the distribution. For more details see the document "Modeling Language GNU MathProg". Four batch files (along with corresponding makefiles) were included in the distribution to simplify building GLPK under MS Windows; see them in subdirectory 'w32'. GLPK 4.10 (release date: May 11, 2006) Cutting planes of two new classes were implemented: mixed cover cuts and clique cuts. On API level this feature can be enabled by setting control parameter LPX_K_USECUTS passed to the routine lpx_intopt. In glpsol this feature is available through the command-line options --cover and --clique. For more details see the reference manual. Now the routines lpx_read_mps and lpx_read_freemps support LI bound type. It is similar to LO, however, indicates the column as of integer kind. GLPK 4.9 (release date: Jan 17, 2006) An advanced MIP solver was implemented. It includes: - basic presolving technique (removing free, singleton and redundant rows, improving bounds of columns, removing fixed columns, reducing constraint coefficents); - generating cutting planes to improve LP relaxation (currently only Gomory's mixed integer cuts are implemented); - using the branch-and-bound method to solve resultant MIP; - recovering solution of the original MIP. The solver is available on API level via the routine lpx_intopt (see the reference manual). It is similar to the routine lpx_integer, however, does not require initial solution of LP relaxation. The solver is also available in the command-line utility glpsol via two options: --intopt (only presolving) and --cuts (assumes --intopt plus generating cuts). Note that efficiency of the MIP solver strongly depends on the internal structure of the problem to be solved. For some hard instances it is very efficient, but for other instances it may be significantly worse than the standard branch-and-bound. For some comparative benchmarks see doc/bench1.txt. Well, what else... Three built-in functions were added to MathProg: sin, cos, and atan (the latter allows one or two arguments). Some bugs were fixed. Several new examples in MathProg were included: color.mod (graph coloring problem), tsp.mod (traveling salesman problem), and pbn.mod (paint-by-numbers puzzle). GLPK 4.8 (release date: Jan 12, 2005) Core simplex method and interior-point method routines were re-implemented and now they use a new, "storage-by-rows" sparse matrix format (unlike previous versions where linked lists were used to represent sparse matrices). For details see ChangeLog. Also a minor bug was fixed in API routine lpx_read_cpxlp. GLPK 4.7 (release date: Aug 23, 2004) Now GLPK supports free MPS format. Two new API routines lpx_read_freemps (to read problem data in free MPS format) and lpx_write_freemps (to write problem data in free MPS format) were added. This feature is also available in the solver glpsol via new command-line options --freemps and --wfreemps. For more details see the GLPK reference manual. API routines lpx_read_cpxlp and lpx_write_cpxlp for reading and writing problem data in CPLEX LP format were re-implemented to allow long symbolic names (up to 255 characters). The following three modules were temporarily removed from the GLPK distribution due to licensing problems: DELI (an interface module to Delphi), GLPKMEX (an interface module to Matlab), and JNI (an interface module to Java). GLPK 4.6 (release date: Aug 04, 2004) Three new statements were implemented in the GNU MathProg language: solve, printf, and for. Their detailed description can be found in the GLPK documentation included in the distribution. (See also a sample model, examples/queens.mod, which illustrates using these new statements.) Two new API routines were added to the package: lpx_read_prob and lpx_write_prob. They allow reading/writing problem data in GNU LP low-level text format. Three new command-line options were implemented in the LP/MIP solver glpsol: --glp (to read problem data in GNU LP format), --wglp (to write problem data in GNU LP format), and --name (to change problem name). Now glpsol also supports processing models where the new statements (see above) are used. A new version of GLPKMEX, a Matlab MEX interface to GLPK, was included. For more details see contrib/glpkmex/ChangeLog. GLPK 4.5 (release date: Jul 19, 2004) The branch-and-bound solver was completely re-implemented. Some modifications were made in memory allocation routines that allows using the package on 64-bit platforms. For more details see ChangeLog. GLPK 4.4 (release date: Jan 17, 2004) All API routines were re-implemented using new data structures. The new implementation provides the same specifications and functionality of API routines as the old one, however, it has some important advantages, in particular: * linked lists are used everywhere that allows creating and modifying the problem object as efficiently as possible * all data stored in the problem object are non-scaled (even if the internal scaling is used) that prevents distortion of the original problem data * solution components obtained by the solver remain available even if the problem object has been modified * no solver-specific data are used in the new data structures that allows attaching any external lp/mip solver using GLPK API as an uniform interface Note that some API routines became obsolete being replaced by new, more convenient routines. These obsolete routines are kept for backward compatibility, however, they will be removed in the future. For more details please see ChangeLog and the GLPK Reference Manual. New edition of the GLPK Reference Manual was included in the distribution. GLPKMEX, a Matlab MEX interface to GLPK package, contributed by Nicolo Giorgetti was included in the distribution. GLPK FAQ contributed by Harley Mackenzie was included in the distribution. GLPK 4.3 (release date: Dec 12, 2003) The bug, due to which the standard math library is not linked on building the package on some platforms, was fixed. The following new built-in functions were added to the MathProg language: round, trunc, Irand224, Uniform01, Uniform, Normal01, Normal. For details see the language description. The MathProg syntax was changed to allow writing 'subj to' that means 'subject to'. The new api routine lpx_get_ray_info was added. It is intended to determine which (non-basic) variable causes unboundness. For details see the reference manual. The module glpmps.c was changed to avoid compilation errors on building the package on Mac OS X. Several typos was fixed and some new material was added to the GLPK documentation. GLPK 4.2 (release date: Nov 14, 2003) A preliminary implementation of the Integer Optimization Suite (IOS) was included in the package. The Branch-and-Cut Framework being completely superseded by IOS was removed from the package. New API routine lpx_print_sens_bnds intended for bounds sensitivity analysis was contributed to GLPK by Brady Hunsaker . This function is also available in the solver glpsol (via command-line option --bounds). An improved version of GLPK JNI (Java Native Interface) was contributed by Chris Rosebrugh . GLPK DELI (Delphi Interface) was contributed by Ivo van Baren . Several makefiles were added to allow compiling GLPK on some non-GNU 32-bit platforms: * Windows single-threaded static library, Visual C++ 6.0 * Windows multi-threaded dynamic library, Visual C++ 6.0 * Windows single-threaded static library, Borland C++ 5.2 * DOS single-threaded static library, Digital Mars C++ 7.50 And, of course, some bugs were fixed. For more details see ChangeLog. GLPK 4.1 (release date: Aug 23, 2003) Some improvements were made in the lp/mip solver routines and several bugs were fixed in the model translator. For more details see ChangeLog. GLPK 4.0 (release date: May 06, 2003) Now GLPK supports the GNU MathProg modeling language, which is a subset of the AMPL modeling language. The document "GLPK: Modeling Language GNU MathProg" included in the distribution is a complete description of GNU MathProg. (See the files lang.latex, lang.dvi, and lang.ps in the subdirectory 'doc'. See also some examples in the subdirectory 'sample'.) New version of the solver glpsol, which supports models written in GNU MathProg, was implemented. (Brief instructions how to use glpsol can be found in the GNU MathProg documentation.) The GLPK/L modeling language is no more supported. The reason is that GNU MathProg being much more powerful completely supersedes all features of GLPK/L. GLPK 3.3 (release date: Mar 25, 2003) LP PRESOLVER ------------ Now the routine lpx_simplex (which is a driver to the simplex method for solving LP) is provided with the built-in LP presolver, which is a program that transforms the original LP problem to an equivalent LP problem, which may be easier for solving with the simplex method than the original one. Once the transformed LP has been solver, the presolver transforms its basic solution back to a corresponding basic solution of the original problem. For details about this feature please see the GLPK reference manual. Currently the LP presolver implements the following features: * removing empty rows; * removing empty columns; * removing free rows; * removing fixed columns; * removing row singletons, which have the form of equations; * removing row singletons, which have the form of inequalities; * removing column singletons, which are implied slack variables; * fixing and removing column singletons, which are implied free variables; * removing forcing rows that involves fixing and removing the corresponding columns; * checking for primal and dual infeasibilities. The LP presolver is also used by default in the stand-alone program glpsol. In order *not* to use it, the option --nopresol should be specified in the command-line. CHANGES IN GLPK/L ----------------- The syntax and semantics of the GLPK/L modeling language was changed to allow declaration of "interval" sets. This means that now the user can declare a set, for example, as: set task = [8:11]; that is exactly equivalent to the following declaration: set task = (task_8, task_9, task_10, task_11); For details see the language description. JAVA INTERFACE -------------- Now GLPK includes the package GLPK JNI (Java Native Interface) that implements Java binding for GLPK. It allows Java programs to utilize GLPK in solving LP and MIP problems. For details see a brief user's guide in the subdirectory contrib/java-binding. This package was developed and programmed by Yuri Victorovich , who contributed it to GLPK. GLPK 3.2.4 (release date: Feb 18, 2003) This is a bug-fix release. For details see ChangeLog. GLPK 3.2.3 (release date: Nov 11, 2002) A new implementation of the api routine lpx_integer which now is based on the b&b driver (which is based on the implicit enumeration suite) was included in the package. This new implementation has exactly the same functionality as the old version, so all changes are transparent to the api user. Four new api routines were included in the package: lpx_check_kkt checks Karush-Kuhn-Tucker optmality conditions; lpx_read_bas reads predifined basis in MPS format; lpx_write_bas writes current basis in MPS format; lpx_write_lpt writes problem data in CPLEX LP format. Also other minor improvements were made (for details see the file 'ChangeLog'). GLPK 3.2.2 (release date: Oct 14, 2002) The api routine lpx_read_lpt was included in the package. It is similar to the routine lpx_read_mps and intended to read LP/MIP data prepared in CPLEX LP format. Description of this format is given in the GLPK reference manual, a new edition of which was also included in the distribution (see the files 'refman.latex', 'refman.dvi', 'refman.ps' in the subdirectory 'doc'). In order to use data files in CPLEX LP format with the solver glpsol the option '--lpt' should be specified in the command line. Several bugs were fixed and some minor improvements were made (for details see the file 'ChangeLog'). GLPK 3.2.1 (release date: Aug 12, 2002) Now GLPK includes a preliminary implementation of the branch-and-cut framework, which is a set of data structures and routines intended for developing branch-and-cut methods for solving mixed-integer and combinatorial optimization problems. Detailed decsription of the branch-and-cut framework is given in the document "GLPK: A Preliminary Implementation of the Branch-And-Cut Framework" included in the distribution (see the file 'brcut.txt' in the subdirectory 'doc'). In order to illustrate how the GLPK branch-and-cut framework can be used for solving a particular optimization problem there is an example included in the package. This is a stand-alone program, TSPSOL, which is intended for solving to optimality the symmetric Traveling Salesman Problem (TSP), a classical problem of the combinatorial optimization (see the file 'tspsol.c' in the subdirectory 'sample'). GLPK 3.2 (release date: Jul 15, 2002) New edition of the document "GLPK: Reference Manual" was included (see the files 'refman.latex', 'refman.dvi', and 'refman.ps' in the subdirectory 'doc'). New edition of the document "GLPK: Modeling Language GLPK/L" was included (see the files 'lang.latex', 'lang.dvi', and 'lang.ps' in the subdirectory 'doc'). The following new API routines were added to the package: lpx_transform_row (transform explicitly specified row); lpx_transform_col (transform explicitly specified column); lpx_prim_ratio_test (perform primal ratio test); lpx_dual_ratio_test (perform dual ratio test); lpx_interior (solve LP problem using interior point method); lpx_get_ips_stat (query status of interior point solution); lpx_get_ips_row (obtain row interior point solution); lpx_get_ips_col (obtain column interior point solution); lpx_get_ips_obj (obtain interior point value of obj.func.); lpx_read_lpm (read LP/MIP model written in GLPK/L); lpx_write_mps (write problem data using MPS format); lpx_print_ips (print interior point solution). Detailed description of all these new API routines are given in the new edition of the reference manual. New version of the stand-alone solver glpsol (which is based on the new API) was implemented. So long as the new API (introduced in glpk 3.0) now provides all the functions, which were provided by the old API, the old API routines were removed from the package at all. GLPK 3.1 (release date: May 27, 2002) A preliminary implementation of new API routines was completed and included in the package. These new API routines provide much more flexible interaction between the application program, LP/MIP problem instances, and solver routines. Based on completely changed data structures they are, however, similar to the API routines and provide the same functionality. Please note that three routines, namely, solving LPs using interior point method, reading model written in the GLPK/L modeling language, and writing problem data in the MPS format, are not implemented in the new API, however, these routines are planned to be implemented in the next version of the package. A description of the new API routines is given in the document "GLPK Reference Manual", a draft edition of which is included in the package (see the files 'refman.latex', 'refman.dvi', and 'refman.ps' in the subdirectory 'doc'). Although the old API routines are kept in the package, they are no longer supported and will be removed in the future. GLPK 3.0.8 (release date: May 13, 2002) A preliminary implementation of new API routines was included in the package. These new API routines are intended to provide much more flexible interaction between the application program, LP/MIP problem and solver routines. See the document "New GLPK API Routines" (the file 'newapi.txt' in the subdirectory 'doc') also included in the package. The api routines glp_simplex2, glp_call_ipm1, glp_call_bbm1 were renamed, respectively, to glp_simplex, glp_interior, glp_integer in order to reflect changes in implementation. The api routines glp_call_rsm1, glp_simplex1, glp_pivot_in, glp_pivout_out were removed from the package since they are completely supreseded by the new API routines (however, these routines still can be found in the subdirectory 'oldsrc'). Please consult a new edition of the document "GLPK User's Guide" about all these changes in the existing api routines. The document "GLPK Library Reference" was removed from the package (into the subdirectory 'oldsrc') since it describes the obsolete library routines, most of which are no longer used. GLPK 3.0.7 (release date: Apr 22, 2002) A new, more efficient implementation of the primal/dual simplex method was included in the package. Due to some improvements the simplex-based solver allows solving many LP problems faster and provides more reliable results. Note that the new implementation is currently incomplete and available only via the api routine glp_simplex2. All the changes are transparent on API level. GLPK 3.0.6 (release date: Mar 28, 2002) New version of LU-factorization and basis maintenance routines (based on Forrest-Tomlin updating technique) was implemented. Since these new routines functionally supersede some routines (which implement other forms of the basis matrix) and make them obsolete, the latter were removed from the package (they still can be found in the subdirectory 'oldsrc'). All the changes are transparent on API level. GLPK 3.0.5 (release date: Jan 29, 2002) New edition of the document "GLPK User's Guide" was included in the distribution. Now it describes all additional API routines, which were recently added to the package. Structure of the package was re-organized in order to make its maintenance easier (all small files in the subdurectory 'source' were merged in bigger units). These changes are transparent for the user. GLPK 3.0.4 (release date: Dec 10, 2001) A new, more efficient implementation of the two-phase primal simplex method was included in the package. Due to some new features (an advanced initial basis, projected steepest edge, recursive updating values and reduced costs) the new LP solver is faster and numerically more stable than the old one. The new LP solver is available as API routine glp_simplex2 and has the same purpose as API routine glp_call_rsm1. For detailed specification see the file 'newapi.txt' in the directory 'doc'. Now the new LP solver is also used by default to solve an initial LP problem in the branch-and-bound routine glp_call_bbm1 instead the routine rsm1_driver. Note that the branch-and-bound procedure itself is still based on rsm1_driver. The new LP solver is also used as default solver in GLPSOL for solving LP and MIP problems. In order to choose the old solver the option '--old-sim' can be specified in the command line. GLPK 3.0.3 (release date: Oct 03, 2001) Some minor changes were made in the simplex method routines in order to improve numerical stability of the method. GLPK 3.0.2 (release date: Sep 24, 2001) A new implementation of the basis maintaining routines was included in the package. These routines, which are based on so called FHV-factorization (a variety of LU-factorization) of the basis matrix and Gustavson's data structures, allows performing the main operations faster at the expense of some worsening numerical accuracy. AFI (Advanced Form of the Inverse), which is the form of the basis matrix based on FHV-factorization, is available via the parameter form = 3 (on API level) or via the option --afi (in GLPSOL solver). GLPK 3.0.1 (release date: Aug 01, 2001) Old GLPK API routines have been removed from the package. New GLPK API routines were added: - scaling routines; - a routine for writing problem data in MPS format; - a comprehensive driver to the simplex method; - basis maintaining routines. A description of the new API routines is given in the document "Additional GLPK API Routines". This document is included into the distribution in plain text format (see the file 'newapi.txt' in the subdirectory 'doc'). Now the distribution includes a non-trivial example of using GLPK as a base LP solver for Concorde, a well known program that solves Traveling Salesman Problem (TSP). For further details see comments in the file 'sample/lpglpk30.c'. GLPK 3.0 (release date: Jul 19, 2001) Now GLPK is provided with new API, which being more flexible can be used in more complex algorithmic schemes. New edition of the document "GLPK User's Guide" is included in the distribution. Now it completely corresponds to the new GLPK API routines. Old API routines are not removed yet from the package, however they became obsolete and therefore should not be used. Since now the header glpk.h corresponds to new API, in order to compile existing programs that use old GLPK API routines the statement #define GLP_OLD_API should be inserted before the statement #include "glpk.h" GLPK 2.4.1 (release date: Jun 14, 2001) The document "Modeling language GLPK/L" is included into the distribution in texinfo format. New edition of the document "GLPK User's Guide" is included in the distribution. Now it describes all additional API routines which were recently added to the package. GLPK 2.4 (release date: May 10, 2001) Now GLPK includes an implementation of a preliminary version of the GLPK/L modeling language. This language is intended for writing mathematcal programming models. The name GLPK/L is derived from GNU Linear Programming Kit Language. A brief description of the GLPK/L language is given in the document "GLPK/L Modeling Language: A Brief Description". This document is included into the distribution in plain text format (see the file 'language.txt' in the subdirectory 'doc'). The language processor (which is a program that analyzes model description written in GLPK/L and translates it to internal data structures) is available as the GLPK API routine. The stand-alone solver GLPSOL now is able: a) to process model descriptions written in the GLPK/L language; b) to solve pure LP problems using the interior point method (therefore the program GLPIPM was removed from the package). GLPK 2.3 (release date: Apr 09, 2001) New edition of the document "GLPK User's Guide" is included in the distribution. Now it describes all additional API routines which were recently added to the package. The MIP solver was fully re-programmed in order to improve its robustness and performance. In particular, a basis recovering procedure was implemented (this procedure allows switching to the primal simplex method in case when the dual simplex method fails). GLPK 2.2 (release date: Mar 15, 2001) Now GLPK includes a tentative implementation of the branch-and-bound procedure based on the dual simplex method for mixed integer linear programming (MIP). Complete description of this new feature of the package is given in the preliminary document "Mixed Integer Linear Programming Using GLPK Version 2.2 (Supplement to GLPK User's Guide)". This document is included into the distribution in plain text format (see the file 'mip.txt' in the subdirectory 'doc'). The MIP solver (glp_integer) can be used as GLPK API routine in the same way as the pure LP solver (glp_simplex). The stand-alone program 'glpsol' is now able to solve LP as well as MIP problems. Note that the current version of GLPK MIP solver is based on easiest heuristics for branching and backtrackng. Therefore the solver is fit mainly for MIP problems which are not very hard and have few integer variables. GLPK 2.1 (release date: Feb 19, 2001) The document "GLPK Implementation of the Revised Simplex Method" is included into the distribution. This document describes most of routines related to the revised simplex method. GLPK 2.0 (release date: Jan 25, 2001) Now GLPK includes a tentative implementation of the primal-dual interior point method for large-scale linear programming. The interior point solver can be used as GLPK API routine in the same manner as the simplex method solver (glp_simplex): ret = glp_interior(); Note that currently the interior point solver implemented in GLPK doesn't include many important features, in particular: * it can't process dense columns; therefore if the problem has dense columns, the solving will be extremely inefficient; * it has no special features against numerical unstability; some problems may cause premature termination of the solving when the matrix A*D*A' becomes ill-conditioned; * it computes only values of primal (auxiliary and structural) variables and doesn't compute values of dual variables (i.e. reduced costs) which are just set to zero; * it doesn't identify optimal basis corresponding to the found interior point solution; all variables in the found solution are just marked as basic variables. GLPK also includes a stand-alone program 'glpipm' which is a demo based on the interior point method. It may be used in the same way as the program 'glpsol' that is based on the simplex method. glpk-5.0/README0000644000062000006210000000232213766346220012361 0ustar maomkpasswdGLPK (GNU Linear Programming Kit) Version 5.0 Copyright (C) 2000-2020 Free Software Foundation, Inc. GLPK is part of the GNU Project released under the aegis of GNU. GLPK is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. See the file COPYING for the GNU General Public License. See the file INSTALL for compilation and installation instructions. The GLPK package is a set of routines written in ANSI C and organized in the form of a callable library. This package is intended for solving large-scale linear programming (LP), mixed integer linear programming (MIP), and other related problems. The GLPK package includes the following main components: * primal simplex method; * dual simplex method; * exact simplex method based on rational arithmetic; * primal-dual interior-point method; * branch-and-cut method; * application program interface (API); * GNU MathProg modeling language (a subset of AMPL); * GLPSOL (stand-alone LP/MIP solver). See GLPK webpage . Please report bugs to . glpk-5.0/setup.job0000644000062000006210000001373413766346220013346 0ustar maomkpasswd// job setup //*--------------------------------------------------------------------- //* Compile and install GLPK for MPS. //*--------------------------------------------------------------------- //* MPS is an educational programming system. Its distribution can be //* found on https://sourceforge.net/projects/noumenon/files/mps/ . //*--------------------------------------------------------------------- // inc src // inc src/amd // inc src/api // inc src/bflib // inc src/colamd // inc src/draft // inc src/env // inc src/intopt // inc src/minisat // inc src/misc // inc src/mpl // inc src/npp // inc src/proxy // inc src/simplex // inc src/zlib // exec c src/amd/amd_1.c // exec c src/amd/amd_2.c // exec c src/amd/amd_aat.c // exec c src/amd/amd_control.c // exec c src/amd/amd_defaults.c // exec c src/amd/amd_info.c // exec c src/amd/amd_order.c // exec c src/amd/amd_post_tree.c // exec c src/amd/amd_postorder.c // exec c src/amd/amd_preprocess.c // exec c src/amd/amd_valid.c // exec c src/api/advbas.c // exec c src/api/asnhall.c // exec c src/api/asnlp.c // exec c src/api/asnokalg.c // exec c src/api/ckasn.c // exec c src/api/ckcnf.c // exec c src/api/cplex.c // exec c src/api/cpp.c // exec c src/api/cpxbas.c // exec c src/api/graph.c // exec c src/api/gridgen.c // exec c src/api/intfeas1.c // exec c src/api/maxffalg.c // exec c src/api/maxflp.c // exec c src/api/mcflp.c // exec c src/api/mcfokalg.c // exec c src/api/mcfrelax.c // exec c src/api/minisat1.c // exec c src/api/mpl.c // exec c src/api/mps.c // exec c src/api/netgen.c // exec c src/api/npp.c // exec c src/api/pript.c // exec c src/api/prmip.c // exec c src/api/prob1.c // exec c src/api/prob2.c // exec c src/api/prob3.c // exec c src/api/prob4.c // exec c src/api/prob5.c // exec c src/api/prrngs.c // exec c src/api/prsol.c // exec c src/api/rdasn.c // exec c src/api/rdcc.c // exec c src/api/rdcnf.c // exec c src/api/rdipt.c // exec c src/api/rdmaxf.c // exec c src/api/rdmcf.c // exec c src/api/rdmip.c // exec c src/api/rdprob.c // exec c src/api/rdsol.c // exec c src/api/rmfgen.c // exec c src/api/strong.c // exec c src/api/topsort.c // exec c src/api/weak.c // exec c src/api/wcliqex.c // exec c src/api/wrasn.c // exec c src/api/wrcc.c // exec c src/api/wrcnf.c // exec c src/api/wript.c // exec c src/api/wrmaxf.c // exec c src/api/wrmcf.c // exec c src/api/wrmip.c // exec c src/api/wrprob.c // exec c src/api/wrsol.c // exec c src/bflib/btf.c // exec c src/bflib/btfint.c // exec c src/bflib/fhv.c // exec c src/bflib/fhvint.c // exec c src/bflib/ifu.c // exec c src/bflib/luf.c // exec c src/bflib/lufint.c // exec c src/bflib/scf.c // exec c src/bflib/scfint.c // exec c src/bflib/sgf.c // exec c src/bflib/sva.c // exec c src/colamd/colamd.c // exec c src/draft/bfd.c // exec c src/draft/bfx.c // exec c src/draft/glpapi06.c // exec c src/draft/glpapi07.c // exec c src/draft/glpapi08.c // exec c src/draft/glpapi09.c // exec c src/draft/glpapi10.c // exec c src/draft/glpapi12.c // exec c src/draft/glpapi13.c // exec c src/draft/glpios01.c // exec c src/draft/glpios02.c // exec c src/draft/glpios03.c // exec c src/draft/glpios07.c // exec c src/draft/glpios09.c // exec c src/draft/glpios11.c // exec c src/draft/glpios12.c // exec c src/draft/glpipm.c // exec c src/draft/glpmat.c // exec c src/draft/glpscl.c // exec c src/draft/glpssx01.c // exec c src/draft/glpssx02.c // exec c src/draft/lux.c // exec c src/env/alloc.c // exec c src/env/dlsup.c // exec c src/env/env.c // exec c src/env/error.c // exec c src/env/stdc.c // exec c src/env/stdout.c // exec c src/env/stream.c // exec c src/env/time.c // exec c src/env/tls.c // exec c src/intopt/cfg.c // exec c src/intopt/cfg1.c // exec c src/intopt/cfg2.c // exec c src/intopt/clqcut.c // exec c src/intopt/covgen.c // exec c src/intopt/fpump.c // exec c src/intopt/gmicut.c // exec c src/intopt/gmigen.c // exec c src/intopt/mirgen.c // exec c src/intopt/spv.c // exec c src/minisat/minisat.c // exec c src/misc/avl.c // exec c src/misc/bignum.c // exec c src/misc/dimacs.c // exec c src/misc/dmp.c // exec c src/misc/ffalg.c // exec c src/misc/fp2rat.c // exec c src/misc/fvs.c // exec c src/misc/gcd.c // exec c src/misc/hbm.c // exec c src/misc/jd.c // exec c src/misc/keller.c // exec c src/misc/ks.c // exec c src/misc/mc13d.c // exec c src/misc/mc21a.c // exec c src/misc/mt1.c // exec c src/misc/mygmp.c // exec c src/misc/okalg.c // exec c src/misc/qmd.c // exec c src/misc/relax4.c // exec c src/misc/rgr.c // exec c src/misc/rng.c // exec c src/misc/rng1.c // exec c src/misc/round2n.c // exec c src/misc/spm.c // exec c src/misc/str2int.c // exec c src/misc/str2num.c // exec c src/misc/strspx.c // exec c src/misc/strtrim.c // exec c src/misc/triang.c // exec c src/misc/wclique.c // exec c src/misc/wclique1.c // exec c src/mpl/mpl1.c // exec c src/mpl/mpl2.c // exec c src/mpl/mpl3.c // exec c src/mpl/mpl4.c // exec c src/mpl/mpl5.c // exec c src/mpl/mpl6.c // exec c src/mpl/mplsql.c // exec c src/npp/npp1.c // exec c src/npp/npp2.c // exec c src/npp/npp3.c // exec c src/npp/npp4.c // exec c src/npp/npp5.c // exec c src/npp/npp6.c // exec c src/proxy/proxy.c // exec c src/proxy/proxy1.c // exec c src/simplex/spxat.c // exec c src/simplex/spxchuzc.c // exec c src/simplex/spxchuzr.c // exec c src/simplex/spxlp.c // exec c src/simplex/spxnt.c // exec c src/simplex/spxprim.c // exec c src/simplex/spxprob.c // exec c src/simplex/spychuzc.c // exec c src/simplex/spychuzr.c // exec c src/simplex/spydual.c // exec c src/zlib/adler32.c // exec c src/zlib/compress.c // exec c src/zlib/crc32.c // exec c src/zlib/deflate.c // exec c src/zlib/gzclose.c // exec c src/zlib/gzlib.c // exec c src/zlib/gzread.c // exec c src/zlib/gzwrite.c // exec c src/zlib/inffast.c // exec c src/zlib/inflate.c // exec c src/zlib/inftrees.c // exec c src/zlib/trees.c // exec c src/zlib/uncompr.c // exec c src/zlib/zio.c // exec c src/zlib/zutil.c // exec lib -o&sys/lib/glpk.lib // exec copy src/glpk.h &sys/include/glpk.h // exec c examples/glpsol.c // exec link -o&sys/bin/glpsol glpk.lib // exec * --max examples/murtagh.mps // end glpk-5.0/src/0000755000062000006210000000000013766346220012271 5ustar maomkpasswdglpk-5.0/src/amd/0000755000062000006210000000000013766346220013032 5ustar maomkpasswdglpk-5.0/src/amd/amd.h0000644000062000006210000000327613766346220013754 0ustar maomkpasswd/* amd.h */ /* Written by Andrew Makhorin . */ #ifndef GLPAMD_H #define GLPAMD_H #define AMD_DATE "May 31, 2007" #define AMD_VERSION_CODE(main, sub) ((main) * 1000 + (sub)) #define AMD_MAIN_VERSION 2 #define AMD_SUB_VERSION 2 #define AMD_SUBSUB_VERSION 0 #define AMD_VERSION AMD_VERSION_CODE(AMD_MAIN_VERSION, AMD_SUB_VERSION) #define AMD_CONTROL 5 #define AMD_INFO 20 #define AMD_DENSE 0 #define AMD_AGGRESSIVE 1 #define AMD_DEFAULT_DENSE 10.0 #define AMD_DEFAULT_AGGRESSIVE 1 #define AMD_STATUS 0 #define AMD_N 1 #define AMD_NZ 2 #define AMD_SYMMETRY 3 #define AMD_NZDIAG 4 #define AMD_NZ_A_PLUS_AT 5 #define AMD_NDENSE 6 #define AMD_MEMORY 7 #define AMD_NCMPA 8 #define AMD_LNZ 9 #define AMD_NDIV 10 #define AMD_NMULTSUBS_LDL 11 #define AMD_NMULTSUBS_LU 12 #define AMD_DMAX 13 #define AMD_OK 0 #define AMD_OUT_OF_MEMORY (-1) #define AMD_INVALID (-2) #define AMD_OK_BUT_JUMBLED 1 #define amd_order _glp_amd_order int amd_order(int n, const int Ap[], const int Ai[], int P[], double Control[], double Info[]); #define amd_2 _glp_amd_2 void amd_2(int n, int Pe[], int Iw[], int Len[], int iwlen, int pfree, int Nv[], int Next[], int Last[], int Head[], int Elen[], int Degree[], int W[], double Control[], double Info[]); #define amd_valid _glp_amd_valid int amd_valid(int n_row, int n_col, const int Ap[], const int Ai[]); #define amd_defaults _glp_amd_defaults void amd_defaults(double Control[]); #define amd_control _glp_amd_control void amd_control(double Control[]); #define amd_info _glp_amd_info void amd_info(double Info[]); #endif /* eof */ glpk-5.0/src/amd/amd_1.c0000644000062000006210000001504313766346220014162 0ustar maomkpasswd/* ========================================================================= */ /* === AMD_1 =============================================================== */ /* ========================================================================= */ /* ------------------------------------------------------------------------- */ /* AMD, Copyright (c) Timothy A. Davis, */ /* Patrick R. Amestoy, and Iain S. Duff. See ../README.txt for License. */ /* email: davis at cise.ufl.edu CISE Department, Univ. of Florida. */ /* web: http://www.cise.ufl.edu/research/sparse/amd */ /* ------------------------------------------------------------------------- */ /* AMD_1: Construct A+A' for a sparse matrix A and perform the AMD ordering. * * The n-by-n sparse matrix A can be unsymmetric. It is stored in MATLAB-style * compressed-column form, with sorted row indices in each column, and no * duplicate entries. Diagonal entries may be present, but they are ignored. * Row indices of column j of A are stored in Ai [Ap [j] ... Ap [j+1]-1]. * Ap [0] must be zero, and nz = Ap [n] is the number of entries in A. The * size of the matrix, n, must be greater than or equal to zero. * * This routine must be preceded by a call to AMD_aat, which computes the * number of entries in each row/column in A+A', excluding the diagonal. * Len [j], on input, is the number of entries in row/column j of A+A'. This * routine constructs the matrix A+A' and then calls AMD_2. No error checking * is performed (this was done in AMD_valid). */ #include "amd_internal.h" GLOBAL void AMD_1 ( Int n, /* n > 0 */ const Int Ap [ ], /* input of size n+1, not modified */ const Int Ai [ ], /* input of size nz = Ap [n], not modified */ Int P [ ], /* size n output permutation */ Int Pinv [ ], /* size n output inverse permutation */ Int Len [ ], /* size n input, undefined on output */ Int slen, /* slen >= sum (Len [0..n-1]) + 7n, * ideally slen = 1.2 * sum (Len) + 8n */ Int S [ ], /* size slen workspace */ double Control [ ], /* input array of size AMD_CONTROL */ double Info [ ] /* output array of size AMD_INFO */ ) { Int i, j, k, p, pfree, iwlen, pj, p1, p2, pj2, *Iw, *Pe, *Nv, *Head, *Elen, *Degree, *s, *W, *Sp, *Tp ; /* --------------------------------------------------------------------- */ /* construct the matrix for AMD_2 */ /* --------------------------------------------------------------------- */ ASSERT (n > 0) ; iwlen = slen - 6*n ; s = S ; Pe = s ; s += n ; Nv = s ; s += n ; Head = s ; s += n ; Elen = s ; s += n ; Degree = s ; s += n ; W = s ; s += n ; Iw = s ; s += iwlen ; ASSERT (AMD_valid (n, n, Ap, Ai) == AMD_OK) ; /* construct the pointers for A+A' */ Sp = Nv ; /* use Nv and W as workspace for Sp and Tp [ */ Tp = W ; pfree = 0 ; for (j = 0 ; j < n ; j++) { Pe [j] = pfree ; Sp [j] = pfree ; pfree += Len [j] ; } /* Note that this restriction on iwlen is slightly more restrictive than * what is strictly required in AMD_2. AMD_2 can operate with no elbow * room at all, but it will be very slow. For better performance, at * least size-n elbow room is enforced. */ ASSERT (iwlen >= pfree + n) ; #ifndef NDEBUG for (p = 0 ; p < iwlen ; p++) Iw [p] = EMPTY ; #endif for (k = 0 ; k < n ; k++) { AMD_DEBUG1 (("Construct row/column k= "ID" of A+A'\n", k)) ; p1 = Ap [k] ; p2 = Ap [k+1] ; /* construct A+A' */ for (p = p1 ; p < p2 ; ) { /* scan the upper triangular part of A */ j = Ai [p] ; ASSERT (j >= 0 && j < n) ; if (j < k) { /* entry A (j,k) in the strictly upper triangular part */ ASSERT (Sp [j] < (j == n-1 ? pfree : Pe [j+1])) ; ASSERT (Sp [k] < (k == n-1 ? pfree : Pe [k+1])) ; Iw [Sp [j]++] = k ; Iw [Sp [k]++] = j ; p++ ; } else if (j == k) { /* skip the diagonal */ p++ ; break ; } else /* j > k */ { /* first entry below the diagonal */ break ; } /* scan lower triangular part of A, in column j until reaching * row k. Start where last scan left off. */ ASSERT (Ap [j] <= Tp [j] && Tp [j] <= Ap [j+1]) ; pj2 = Ap [j+1] ; for (pj = Tp [j] ; pj < pj2 ; ) { i = Ai [pj] ; ASSERT (i >= 0 && i < n) ; if (i < k) { /* A (i,j) is only in the lower part, not in upper */ ASSERT (Sp [i] < (i == n-1 ? pfree : Pe [i+1])) ; ASSERT (Sp [j] < (j == n-1 ? pfree : Pe [j+1])) ; Iw [Sp [i]++] = j ; Iw [Sp [j]++] = i ; pj++ ; } else if (i == k) { /* entry A (k,j) in lower part and A (j,k) in upper */ pj++ ; break ; } else /* i > k */ { /* consider this entry later, when k advances to i */ break ; } } Tp [j] = pj ; } Tp [k] = p ; } /* clean up, for remaining mismatched entries */ for (j = 0 ; j < n ; j++) { for (pj = Tp [j] ; pj < Ap [j+1] ; pj++) { i = Ai [pj] ; ASSERT (i >= 0 && i < n) ; /* A (i,j) is only in the lower part, not in upper */ ASSERT (Sp [i] < (i == n-1 ? pfree : Pe [i+1])) ; ASSERT (Sp [j] < (j == n-1 ? pfree : Pe [j+1])) ; Iw [Sp [i]++] = j ; Iw [Sp [j]++] = i ; } } #ifndef NDEBUG for (j = 0 ; j < n-1 ; j++) ASSERT (Sp [j] == Pe [j+1]) ; ASSERT (Sp [n-1] == pfree) ; #endif /* Tp and Sp no longer needed ] */ /* --------------------------------------------------------------------- */ /* order the matrix */ /* --------------------------------------------------------------------- */ AMD_2 (n, Pe, Iw, Len, iwlen, pfree, Nv, Pinv, P, Head, Elen, Degree, W, Control, Info) ; } glpk-5.0/src/amd/amd_2.c0000644000062000006210000023046713766346220014174 0ustar maomkpasswd/* ========================================================================= */ /* === AMD_2 =============================================================== */ /* ========================================================================= */ /* ------------------------------------------------------------------------- */ /* AMD, Copyright (c) Timothy A. Davis, */ /* Patrick R. Amestoy, and Iain S. Duff. See ../README.txt for License. */ /* email: davis at cise.ufl.edu CISE Department, Univ. of Florida. */ /* web: http://www.cise.ufl.edu/research/sparse/amd */ /* ------------------------------------------------------------------------- */ /* AMD_2: performs the AMD ordering on a symmetric sparse matrix A, followed * by a postordering (via depth-first search) of the assembly tree using the * AMD_postorder routine. */ #include "amd_internal.h" /* ========================================================================= */ /* === clear_flag ========================================================== */ /* ========================================================================= */ static Int clear_flag (Int wflg, Int wbig, Int W [ ], Int n) { Int x ; if (wflg < 2 || wflg >= wbig) { for (x = 0 ; x < n ; x++) { if (W [x] != 0) W [x] = 1 ; } wflg = 2 ; } /* at this point, W [0..n-1] < wflg holds */ return (wflg) ; } /* ========================================================================= */ /* === AMD_2 =============================================================== */ /* ========================================================================= */ GLOBAL void AMD_2 ( Int n, /* A is n-by-n, where n > 0 */ Int Pe [ ], /* Pe [0..n-1]: index in Iw of row i on input */ Int Iw [ ], /* workspace of size iwlen. Iw [0..pfree-1] * holds the matrix on input */ Int Len [ ], /* Len [0..n-1]: length for row/column i on input */ Int iwlen, /* length of Iw. iwlen >= pfree + n */ Int pfree, /* Iw [pfree ... iwlen-1] is empty on input */ /* 7 size-n workspaces, not defined on input: */ Int Nv [ ], /* the size of each supernode on output */ Int Next [ ], /* the output inverse permutation */ Int Last [ ], /* the output permutation */ Int Head [ ], Int Elen [ ], /* the size columns of L for each supernode */ Int Degree [ ], Int W [ ], /* control parameters and output statistics */ double Control [ ], /* array of size AMD_CONTROL */ double Info [ ] /* array of size AMD_INFO */ ) { /* * Given a representation of the nonzero pattern of a symmetric matrix, A, * (excluding the diagonal) perform an approximate minimum (UMFPACK/MA38-style) * degree ordering to compute a pivot order such that the introduction of * nonzeros (fill-in) in the Cholesky factors A = LL' is kept low. At each * step, the pivot selected is the one with the minimum UMFAPACK/MA38-style * upper-bound on the external degree. This routine can optionally perform * aggresive absorption (as done by MC47B in the Harwell Subroutine * Library). * * The approximate degree algorithm implemented here is the symmetric analog of * the degree update algorithm in MA38 and UMFPACK (the Unsymmetric-pattern * MultiFrontal PACKage, both by Davis and Duff). The routine is based on the * MA27 minimum degree ordering algorithm by Iain Duff and John Reid. * * This routine is a translation of the original AMDBAR and MC47B routines, * in Fortran, with the following modifications: * * (1) dense rows/columns are removed prior to ordering the matrix, and placed * last in the output order. The presence of a dense row/column can * increase the ordering time by up to O(n^2), unless they are removed * prior to ordering. * * (2) the minimum degree ordering is followed by a postordering (depth-first * search) of the assembly tree. Note that mass elimination (discussed * below) combined with the approximate degree update can lead to the mass * elimination of nodes with lower exact degree than the current pivot * element. No additional fill-in is caused in the representation of the * Schur complement. The mass-eliminated nodes merge with the current * pivot element. They are ordered prior to the current pivot element. * Because they can have lower exact degree than the current element, the * merger of two or more of these nodes in the current pivot element can * lead to a single element that is not a "fundamental supernode". The * diagonal block can have zeros in it. Thus, the assembly tree used here * is not guaranteed to be the precise supernodal elemination tree (with * "funadmental" supernodes), and the postordering performed by this * routine is not guaranteed to be a precise postordering of the * elimination tree. * * (3) input parameters are added, to control aggressive absorption and the * detection of "dense" rows/columns of A. * * (4) additional statistical information is returned, such as the number of * nonzeros in L, and the flop counts for subsequent LDL' and LU * factorizations. These are slight upper bounds, because of the mass * elimination issue discussed above. * * (5) additional routines are added to interface this routine to MATLAB * to provide a simple C-callable user-interface, to check inputs for * errors, compute the symmetry of the pattern of A and the number of * nonzeros in each row/column of A+A', to compute the pattern of A+A', * to perform the assembly tree postordering, and to provide debugging * ouput. Many of these functions are also provided by the Fortran * Harwell Subroutine Library routine MC47A. * * (6) both int and UF_long versions are provided. In the descriptions below * and integer is and int or UF_long depending on which version is * being used. ********************************************************************** ***** CAUTION: ARGUMENTS ARE NOT CHECKED FOR ERRORS ON INPUT. ****** ********************************************************************** ** If you want error checking, a more versatile input format, and a ** ** simpler user interface, use amd_order or amd_l_order instead. ** ** This routine is not meant to be user-callable. ** ********************************************************************** * ---------------------------------------------------------------------------- * References: * ---------------------------------------------------------------------------- * * [1] Timothy A. Davis and Iain Duff, "An unsymmetric-pattern multifrontal * method for sparse LU factorization", SIAM J. Matrix Analysis and * Applications, vol. 18, no. 1, pp. 140-158. Discusses UMFPACK / MA38, * which first introduced the approximate minimum degree used by this * routine. * * [2] Patrick Amestoy, Timothy A. Davis, and Iain S. Duff, "An approximate * minimum degree ordering algorithm," SIAM J. Matrix Analysis and * Applications, vol. 17, no. 4, pp. 886-905, 1996. Discusses AMDBAR and * MC47B, which are the Fortran versions of this routine. * * [3] Alan George and Joseph Liu, "The evolution of the minimum degree * ordering algorithm," SIAM Review, vol. 31, no. 1, pp. 1-19, 1989. * We list below the features mentioned in that paper that this code * includes: * * mass elimination: * Yes. MA27 relied on supervariable detection for mass elimination. * * indistinguishable nodes: * Yes (we call these "supervariables"). This was also in the MA27 * code - although we modified the method of detecting them (the * previous hash was the true degree, which we no longer keep track * of). A supervariable is a set of rows with identical nonzero * pattern. All variables in a supervariable are eliminated together. * Each supervariable has as its numerical name that of one of its * variables (its principal variable). * * quotient graph representation: * Yes. We use the term "element" for the cliques formed during * elimination. This was also in the MA27 code. The algorithm can * operate in place, but it will work more efficiently if given some * "elbow room." * * element absorption: * Yes. This was also in the MA27 code. * * external degree: * Yes. The MA27 code was based on the true degree. * * incomplete degree update and multiple elimination: * No. This was not in MA27, either. Our method of degree update * within MC47B is element-based, not variable-based. It is thus * not well-suited for use with incomplete degree update or multiple * elimination. * * Authors, and Copyright (C) 2004 by: * Timothy A. Davis, Patrick Amestoy, Iain S. Duff, John K. Reid. * * Acknowledgements: This work (and the UMFPACK package) was supported by the * National Science Foundation (ASC-9111263, DMS-9223088, and CCR-0203270). * The UMFPACK/MA38 approximate degree update algorithm, the unsymmetric analog * which forms the basis of AMD, was developed while Tim Davis was supported by * CERFACS (Toulouse, France) in a post-doctoral position. This C version, and * the etree postorder, were written while Tim Davis was on sabbatical at * Stanford University and Lawrence Berkeley National Laboratory. * ---------------------------------------------------------------------------- * INPUT ARGUMENTS (unaltered): * ---------------------------------------------------------------------------- * n: The matrix order. Restriction: n >= 1. * * iwlen: The size of the Iw array. On input, the matrix is stored in * Iw [0..pfree-1]. However, Iw [0..iwlen-1] should be slightly larger * than what is required to hold the matrix, at least iwlen >= pfree + n. * Otherwise, excessive compressions will take place. The recommended * value of iwlen is 1.2 * pfree + n, which is the value used in the * user-callable interface to this routine (amd_order.c). The algorithm * will not run at all if iwlen < pfree. Restriction: iwlen >= pfree + n. * Note that this is slightly more restrictive than the actual minimum * (iwlen >= pfree), but AMD_2 will be very slow with no elbow room. * Thus, this routine enforces a bare minimum elbow room of size n. * * pfree: On input the tail end of the array, Iw [pfree..iwlen-1], is empty, * and the matrix is stored in Iw [0..pfree-1]. During execution, * additional data is placed in Iw, and pfree is modified so that * Iw [pfree..iwlen-1] is always the unused part of Iw. * * Control: A double array of size AMD_CONTROL containing input parameters * that affect how the ordering is computed. If NULL, then default * settings are used. * * Control [AMD_DENSE] is used to determine whether or not a given input * row is "dense". A row is "dense" if the number of entries in the row * exceeds Control [AMD_DENSE] times sqrt (n), except that rows with 16 or * fewer entries are never considered "dense". To turn off the detection * of dense rows, set Control [AMD_DENSE] to a negative number, or to a * number larger than sqrt (n). The default value of Control [AMD_DENSE] * is AMD_DEFAULT_DENSE, which is defined in amd.h as 10. * * Control [AMD_AGGRESSIVE] is used to determine whether or not aggressive * absorption is to be performed. If nonzero, then aggressive absorption * is performed (this is the default). * ---------------------------------------------------------------------------- * INPUT/OUPUT ARGUMENTS: * ---------------------------------------------------------------------------- * * Pe: An integer array of size n. On input, Pe [i] is the index in Iw of * the start of row i. Pe [i] is ignored if row i has no off-diagonal * entries. Thus Pe [i] must be in the range 0 to pfree-1 for non-empty * rows. * * During execution, it is used for both supervariables and elements: * * Principal supervariable i: index into Iw of the description of * supervariable i. A supervariable represents one or more rows of * the matrix with identical nonzero pattern. In this case, * Pe [i] >= 0. * * Non-principal supervariable i: if i has been absorbed into another * supervariable j, then Pe [i] = FLIP (j), where FLIP (j) is defined * as (-(j)-2). Row j has the same pattern as row i. Note that j * might later be absorbed into another supervariable j2, in which * case Pe [i] is still FLIP (j), and Pe [j] = FLIP (j2) which is * < EMPTY, where EMPTY is defined as (-1) in amd_internal.h. * * Unabsorbed element e: the index into Iw of the description of element * e, if e has not yet been absorbed by a subsequent element. Element * e is created when the supervariable of the same name is selected as * the pivot. In this case, Pe [i] >= 0. * * Absorbed element e: if element e is absorbed into element e2, then * Pe [e] = FLIP (e2). This occurs when the pattern of e (which we * refer to as Le) is found to be a subset of the pattern of e2 (that * is, Le2). In this case, Pe [i] < EMPTY. If element e is "null" * (it has no nonzeros outside its pivot block), then Pe [e] = EMPTY, * and e is the root of an assembly subtree (or the whole tree if * there is just one such root). * * Dense variable i: if i is "dense", then Pe [i] = EMPTY. * * On output, Pe holds the assembly tree/forest, which implicitly * represents a pivot order with identical fill-in as the actual order * (via a depth-first search of the tree), as follows. If Nv [i] > 0, * then i represents a node in the assembly tree, and the parent of i is * Pe [i], or EMPTY if i is a root. If Nv [i] = 0, then (i, Pe [i]) * represents an edge in a subtree, the root of which is a node in the * assembly tree. Note that i refers to a row/column in the original * matrix, not the permuted matrix. * * Info: A double array of size AMD_INFO. If present, (that is, not NULL), * then statistics about the ordering are returned in the Info array. * See amd.h for a description. * ---------------------------------------------------------------------------- * INPUT/MODIFIED (undefined on output): * ---------------------------------------------------------------------------- * * Len: An integer array of size n. On input, Len [i] holds the number of * entries in row i of the matrix, excluding the diagonal. The contents * of Len are undefined on output. * * Iw: An integer array of size iwlen. On input, Iw [0..pfree-1] holds the * description of each row i in the matrix. The matrix must be symmetric, * and both upper and lower triangular parts must be present. The * diagonal must not be present. Row i is held as follows: * * Len [i]: the length of the row i data structure in the Iw array. * Iw [Pe [i] ... Pe [i] + Len [i] - 1]: * the list of column indices for nonzeros in row i (simple * supervariables), excluding the diagonal. All supervariables * start with one row/column each (supervariable i is just row i). * If Len [i] is zero on input, then Pe [i] is ignored on input. * * Note that the rows need not be in any particular order, and there * may be empty space between the rows. * * During execution, the supervariable i experiences fill-in. This is * represented by placing in i a list of the elements that cause fill-in * in supervariable i: * * Len [i]: the length of supervariable i in the Iw array. * Iw [Pe [i] ... Pe [i] + Elen [i] - 1]: * the list of elements that contain i. This list is kept short * by removing absorbed elements. * Iw [Pe [i] + Elen [i] ... Pe [i] + Len [i] - 1]: * the list of supervariables in i. This list is kept short by * removing nonprincipal variables, and any entry j that is also * contained in at least one of the elements (j in Le) in the list * for i (e in row i). * * When supervariable i is selected as pivot, we create an element e of * the same name (e=i): * * Len [e]: the length of element e in the Iw array. * Iw [Pe [e] ... Pe [e] + Len [e] - 1]: * the list of supervariables in element e. * * An element represents the fill-in that occurs when supervariable i is * selected as pivot (which represents the selection of row i and all * non-principal variables whose principal variable is i). We use the * term Le to denote the set of all supervariables in element e. Absorbed * supervariables and elements are pruned from these lists when * computationally convenient. * * CAUTION: THE INPUT MATRIX IS OVERWRITTEN DURING COMPUTATION. * The contents of Iw are undefined on output. * ---------------------------------------------------------------------------- * OUTPUT (need not be set on input): * ---------------------------------------------------------------------------- * * Nv: An integer array of size n. During execution, ABS (Nv [i]) is equal to * the number of rows that are represented by the principal supervariable * i. If i is a nonprincipal or dense variable, then Nv [i] = 0. * Initially, Nv [i] = 1 for all i. Nv [i] < 0 signifies that i is a * principal variable in the pattern Lme of the current pivot element me. * After element me is constructed, Nv [i] is set back to a positive * value. * * On output, Nv [i] holds the number of pivots represented by super * row/column i of the original matrix, or Nv [i] = 0 for non-principal * rows/columns. Note that i refers to a row/column in the original * matrix, not the permuted matrix. * * Elen: An integer array of size n. See the description of Iw above. At the * start of execution, Elen [i] is set to zero for all rows i. During * execution, Elen [i] is the number of elements in the list for * supervariable i. When e becomes an element, Elen [e] = FLIP (esize) is * set, where esize is the size of the element (the number of pivots, plus * the number of nonpivotal entries). Thus Elen [e] < EMPTY. * Elen (i) = EMPTY set when variable i becomes nonprincipal. * * For variables, Elen (i) >= EMPTY holds until just before the * postordering and permutation vectors are computed. For elements, * Elen [e] < EMPTY holds. * * On output, Elen [i] is the degree of the row/column in the Cholesky * factorization of the permuted matrix, corresponding to the original row * i, if i is a super row/column. It is equal to EMPTY if i is * non-principal. Note that i refers to a row/column in the original * matrix, not the permuted matrix. * * Note that the contents of Elen on output differ from the Fortran * version (Elen holds the inverse permutation in the Fortran version, * which is instead returned in the Next array in this C version, * described below). * * Last: In a degree list, Last [i] is the supervariable preceding i, or EMPTY * if i is the head of the list. In a hash bucket, Last [i] is the hash * key for i. * * Last [Head [hash]] is also used as the head of a hash bucket if * Head [hash] contains a degree list (see the description of Head, * below). * * On output, Last [0..n-1] holds the permutation. That is, if * i = Last [k], then row i is the kth pivot row (where k ranges from 0 to * n-1). Row Last [k] of A is the kth row in the permuted matrix, PAP'. * * Next: Next [i] is the supervariable following i in a link list, or EMPTY if * i is the last in the list. Used for two kinds of lists: degree lists * and hash buckets (a supervariable can be in only one kind of list at a * time). * * On output Next [0..n-1] holds the inverse permutation. That is, if * k = Next [i], then row i is the kth pivot row. Row i of A appears as * the (Next[i])-th row in the permuted matrix, PAP'. * * Note that the contents of Next on output differ from the Fortran * version (Next is undefined on output in the Fortran version). * ---------------------------------------------------------------------------- * LOCAL WORKSPACE (not input or output - used only during execution): * ---------------------------------------------------------------------------- * * Degree: An integer array of size n. If i is a supervariable, then * Degree [i] holds the current approximation of the external degree of * row i (an upper bound). The external degree is the number of nonzeros * in row i, minus ABS (Nv [i]), the diagonal part. The bound is equal to * the exact external degree if Elen [i] is less than or equal to two. * * We also use the term "external degree" for elements e to refer to * |Le \ Lme|. If e is an element, then Degree [e] is |Le|, which is the * degree of the off-diagonal part of the element e (not including the * diagonal part). * * Head: An integer array of size n. Head is used for degree lists. * Head [deg] is the first supervariable in a degree list. All * supervariables i in a degree list Head [deg] have the same approximate * degree, namely, deg = Degree [i]. If the list Head [deg] is empty then * Head [deg] = EMPTY. * * During supervariable detection Head [hash] also serves as a pointer to * a hash bucket. If Head [hash] >= 0, there is a degree list of degree * hash. The hash bucket head pointer is Last [Head [hash]]. If * Head [hash] = EMPTY, then the degree list and hash bucket are both * empty. If Head [hash] < EMPTY, then the degree list is empty, and * FLIP (Head [hash]) is the head of the hash bucket. After supervariable * detection is complete, all hash buckets are empty, and the * (Last [Head [hash]] = EMPTY) condition is restored for the non-empty * degree lists. * * W: An integer array of size n. The flag array W determines the status of * elements and variables, and the external degree of elements. * * for elements: * if W [e] = 0, then the element e is absorbed. * if W [e] >= wflg, then W [e] - wflg is the size of the set * |Le \ Lme|, in terms of nonzeros (the sum of ABS (Nv [i]) for * each principal variable i that is both in the pattern of * element e and NOT in the pattern of the current pivot element, * me). * if wflg > W [e] > 0, then e is not absorbed and has not yet been * seen in the scan of the element lists in the computation of * |Le\Lme| in Scan 1 below. * * for variables: * during supervariable detection, if W [j] != wflg then j is * not in the pattern of variable i. * * The W array is initialized by setting W [i] = 1 for all i, and by * setting wflg = 2. It is reinitialized if wflg becomes too large (to * ensure that wflg+n does not cause integer overflow). * ---------------------------------------------------------------------------- * LOCAL INTEGERS: * ---------------------------------------------------------------------------- */ Int deg, degme, dext, lemax, e, elenme, eln, i, ilast, inext, j, jlast, jnext, k, knt1, knt2, knt3, lenj, ln, me, mindeg, nel, nleft, nvi, nvj, nvpiv, slenme, wbig, we, wflg, wnvi, ok, ndense, ncmpa, dense, aggressive ; unsigned Int hash ; /* unsigned, so that hash % n is well defined.*/ /* * deg: the degree of a variable or element * degme: size, |Lme|, of the current element, me (= Degree [me]) * dext: external degree, |Le \ Lme|, of some element e * lemax: largest |Le| seen so far (called dmax in Fortran version) * e: an element * elenme: the length, Elen [me], of element list of pivotal variable * eln: the length, Elen [...], of an element list * hash: the computed value of the hash function * i: a supervariable * ilast: the entry in a link list preceding i * inext: the entry in a link list following i * j: a supervariable * jlast: the entry in a link list preceding j * jnext: the entry in a link list, or path, following j * k: the pivot order of an element or variable * knt1: loop counter used during element construction * knt2: loop counter used during element construction * knt3: loop counter used during compression * lenj: Len [j] * ln: length of a supervariable list * me: current supervariable being eliminated, and the current * element created by eliminating that supervariable * mindeg: current minimum degree * nel: number of pivots selected so far * nleft: n - nel, the number of nonpivotal rows/columns remaining * nvi: the number of variables in a supervariable i (= Nv [i]) * nvj: the number of variables in a supervariable j (= Nv [j]) * nvpiv: number of pivots in current element * slenme: number of variables in variable list of pivotal variable * wbig: = INT_MAX - n for the int version, UF_long_max - n for the * UF_long version. wflg is not allowed to be >= wbig. * we: W [e] * wflg: used for flagging the W array. See description of Iw. * wnvi: wflg - Nv [i] * x: either a supervariable or an element * * ok: true if supervariable j can be absorbed into i * ndense: number of "dense" rows/columns * dense: rows/columns with initial degree > dense are considered "dense" * aggressive: true if aggressive absorption is being performed * ncmpa: number of garbage collections * ---------------------------------------------------------------------------- * LOCAL DOUBLES, used for statistical output only (except for alpha): * ---------------------------------------------------------------------------- */ double f, r, ndiv, s, nms_lu, nms_ldl, dmax, alpha, lnz, lnzme ; /* * f: nvpiv * r: degme + nvpiv * ndiv: number of divisions for LU or LDL' factorizations * s: number of multiply-subtract pairs for LU factorization, for the * current element me * nms_lu number of multiply-subtract pairs for LU factorization * nms_ldl number of multiply-subtract pairs for LDL' factorization * dmax: the largest number of entries in any column of L, including the * diagonal * alpha: "dense" degree ratio * lnz: the number of nonzeros in L (excluding the diagonal) * lnzme: the number of nonzeros in L (excl. the diagonal) for the * current element me * ---------------------------------------------------------------------------- * LOCAL "POINTERS" (indices into the Iw array) * ---------------------------------------------------------------------------- */ Int p, p1, p2, p3, p4, pdst, pend, pj, pme, pme1, pme2, pn, psrc ; /* * Any parameter (Pe [...] or pfree) or local variable starting with "p" (for * Pointer) is an index into Iw, and all indices into Iw use variables starting * with "p." The only exception to this rule is the iwlen input argument. * * p: pointer into lots of things * p1: Pe [i] for some variable i (start of element list) * p2: Pe [i] + Elen [i] - 1 for some variable i * p3: index of first supervariable in clean list * p4: * pdst: destination pointer, for compression * pend: end of memory to compress * pj: pointer into an element or variable * pme: pointer into the current element (pme1...pme2) * pme1: the current element, me, is stored in Iw [pme1...pme2] * pme2: the end of the current element * pn: pointer into a "clean" variable, also used to compress * psrc: source pointer, for compression */ /* ========================================================================= */ /* INITIALIZATIONS */ /* ========================================================================= */ /* Note that this restriction on iwlen is slightly more restrictive than * what is actually required in AMD_2. AMD_2 can operate with no elbow * room at all, but it will be slow. For better performance, at least * size-n elbow room is enforced. */ ASSERT (iwlen >= pfree + n) ; ASSERT (n > 0) ; /* initialize output statistics */ lnz = 0 ; ndiv = 0 ; nms_lu = 0 ; nms_ldl = 0 ; dmax = 1 ; me = EMPTY ; mindeg = 0 ; ncmpa = 0 ; nel = 0 ; lemax = 0 ; /* get control parameters */ if (Control != (double *) NULL) { alpha = Control [AMD_DENSE] ; aggressive = (Control [AMD_AGGRESSIVE] != 0) ; } else { alpha = AMD_DEFAULT_DENSE ; aggressive = AMD_DEFAULT_AGGRESSIVE ; } /* Note: if alpha is NaN, this is undefined: */ if (alpha < 0) { /* only remove completely dense rows/columns */ dense = n-2 ; } else { dense = alpha * sqrt ((double) n) ; } dense = MAX (16, dense) ; dense = MIN (n, dense) ; AMD_DEBUG1 (("\n\nAMD (debug), alpha %g, aggr. "ID"\n", alpha, aggressive)) ; for (i = 0 ; i < n ; i++) { Last [i] = EMPTY ; Head [i] = EMPTY ; Next [i] = EMPTY ; /* if separate Hhead array is used for hash buckets: * Hhead [i] = EMPTY ; */ Nv [i] = 1 ; W [i] = 1 ; Elen [i] = 0 ; Degree [i] = Len [i] ; } #ifndef NDEBUG AMD_DEBUG1 (("\n======Nel "ID" initial\n", nel)) ; AMD_dump (n, Pe, Iw, Len, iwlen, pfree, Nv, Next, Last, Head, Elen, Degree, W, -1) ; #endif /* initialize wflg */ wbig = Int_MAX - n ; wflg = clear_flag (0, wbig, W, n) ; /* --------------------------------------------------------------------- */ /* initialize degree lists and eliminate dense and empty rows */ /* --------------------------------------------------------------------- */ ndense = 0 ; for (i = 0 ; i < n ; i++) { deg = Degree [i] ; ASSERT (deg >= 0 && deg < n) ; if (deg == 0) { /* ------------------------------------------------------------- * we have a variable that can be eliminated at once because * there is no off-diagonal non-zero in its row. Note that * Nv [i] = 1 for an empty variable i. It is treated just * the same as an eliminated element i. * ------------------------------------------------------------- */ Elen [i] = FLIP (1) ; nel++ ; Pe [i] = EMPTY ; W [i] = 0 ; } else if (deg > dense) { /* ------------------------------------------------------------- * Dense variables are not treated as elements, but as unordered, * non-principal variables that have no parent. They do not take * part in the postorder, since Nv [i] = 0. Note that the Fortran * version does not have this option. * ------------------------------------------------------------- */ AMD_DEBUG1 (("Dense node "ID" degree "ID"\n", i, deg)) ; ndense++ ; Nv [i] = 0 ; /* do not postorder this node */ Elen [i] = EMPTY ; nel++ ; Pe [i] = EMPTY ; } else { /* ------------------------------------------------------------- * place i in the degree list corresponding to its degree * ------------------------------------------------------------- */ inext = Head [deg] ; ASSERT (inext >= EMPTY && inext < n) ; if (inext != EMPTY) Last [inext] = i ; Next [i] = inext ; Head [deg] = i ; } } /* ========================================================================= */ /* WHILE (selecting pivots) DO */ /* ========================================================================= */ while (nel < n) { #ifndef NDEBUG AMD_DEBUG1 (("\n======Nel "ID"\n", nel)) ; if (AMD_debug >= 2) { AMD_dump (n, Pe, Iw, Len, iwlen, pfree, Nv, Next, Last, Head, Elen, Degree, W, nel) ; } #endif /* ========================================================================= */ /* GET PIVOT OF MINIMUM DEGREE */ /* ========================================================================= */ /* ----------------------------------------------------------------- */ /* find next supervariable for elimination */ /* ----------------------------------------------------------------- */ ASSERT (mindeg >= 0 && mindeg < n) ; for (deg = mindeg ; deg < n ; deg++) { me = Head [deg] ; if (me != EMPTY) break ; } mindeg = deg ; ASSERT (me >= 0 && me < n) ; AMD_DEBUG1 (("=================me: "ID"\n", me)) ; /* ----------------------------------------------------------------- */ /* remove chosen variable from link list */ /* ----------------------------------------------------------------- */ inext = Next [me] ; ASSERT (inext >= EMPTY && inext < n) ; if (inext != EMPTY) Last [inext] = EMPTY ; Head [deg] = inext ; /* ----------------------------------------------------------------- */ /* me represents the elimination of pivots nel to nel+Nv[me]-1. */ /* place me itself as the first in this set. */ /* ----------------------------------------------------------------- */ elenme = Elen [me] ; nvpiv = Nv [me] ; ASSERT (nvpiv > 0) ; nel += nvpiv ; /* ========================================================================= */ /* CONSTRUCT NEW ELEMENT */ /* ========================================================================= */ /* ----------------------------------------------------------------- * At this point, me is the pivotal supervariable. It will be * converted into the current element. Scan list of the pivotal * supervariable, me, setting tree pointers and constructing new list * of supervariables for the new element, me. p is a pointer to the * current position in the old list. * ----------------------------------------------------------------- */ /* flag the variable "me" as being in Lme by negating Nv [me] */ Nv [me] = -nvpiv ; degme = 0 ; ASSERT (Pe [me] >= 0 && Pe [me] < iwlen) ; if (elenme == 0) { /* ------------------------------------------------------------- */ /* construct the new element in place */ /* ------------------------------------------------------------- */ pme1 = Pe [me] ; pme2 = pme1 - 1 ; for (p = pme1 ; p <= pme1 + Len [me] - 1 ; p++) { i = Iw [p] ; ASSERT (i >= 0 && i < n && Nv [i] >= 0) ; nvi = Nv [i] ; if (nvi > 0) { /* ----------------------------------------------------- */ /* i is a principal variable not yet placed in Lme. */ /* store i in new list */ /* ----------------------------------------------------- */ /* flag i as being in Lme by negating Nv [i] */ degme += nvi ; Nv [i] = -nvi ; Iw [++pme2] = i ; /* ----------------------------------------------------- */ /* remove variable i from degree list. */ /* ----------------------------------------------------- */ ilast = Last [i] ; inext = Next [i] ; ASSERT (ilast >= EMPTY && ilast < n) ; ASSERT (inext >= EMPTY && inext < n) ; if (inext != EMPTY) Last [inext] = ilast ; if (ilast != EMPTY) { Next [ilast] = inext ; } else { /* i is at the head of the degree list */ ASSERT (Degree [i] >= 0 && Degree [i] < n) ; Head [Degree [i]] = inext ; } } } } else { /* ------------------------------------------------------------- */ /* construct the new element in empty space, Iw [pfree ...] */ /* ------------------------------------------------------------- */ p = Pe [me] ; pme1 = pfree ; slenme = Len [me] - elenme ; for (knt1 = 1 ; knt1 <= elenme + 1 ; knt1++) { if (knt1 > elenme) { /* search the supervariables in me. */ e = me ; pj = p ; ln = slenme ; AMD_DEBUG2 (("Search sv: "ID" "ID" "ID"\n", me,pj,ln)) ; } else { /* search the elements in me. */ e = Iw [p++] ; ASSERT (e >= 0 && e < n) ; pj = Pe [e] ; ln = Len [e] ; AMD_DEBUG2 (("Search element e "ID" in me "ID"\n", e,me)) ; ASSERT (Elen [e] < EMPTY && W [e] > 0 && pj >= 0) ; } ASSERT (ln >= 0 && (ln == 0 || (pj >= 0 && pj < iwlen))) ; /* --------------------------------------------------------- * search for different supervariables and add them to the * new list, compressing when necessary. this loop is * executed once for each element in the list and once for * all the supervariables in the list. * --------------------------------------------------------- */ for (knt2 = 1 ; knt2 <= ln ; knt2++) { i = Iw [pj++] ; ASSERT (i >= 0 && i < n && (i == me || Elen [i] >= EMPTY)); nvi = Nv [i] ; AMD_DEBUG2 ((": "ID" "ID" "ID" "ID"\n", i, Elen [i], Nv [i], wflg)) ; if (nvi > 0) { /* ------------------------------------------------- */ /* compress Iw, if necessary */ /* ------------------------------------------------- */ if (pfree >= iwlen) { AMD_DEBUG1 (("GARBAGE COLLECTION\n")) ; /* prepare for compressing Iw by adjusting pointers * and lengths so that the lists being searched in * the inner and outer loops contain only the * remaining entries. */ Pe [me] = p ; Len [me] -= knt1 ; /* check if nothing left of supervariable me */ if (Len [me] == 0) Pe [me] = EMPTY ; Pe [e] = pj ; Len [e] = ln - knt2 ; /* nothing left of element e */ if (Len [e] == 0) Pe [e] = EMPTY ; ncmpa++ ; /* one more garbage collection */ /* store first entry of each object in Pe */ /* FLIP the first entry in each object */ for (j = 0 ; j < n ; j++) { pn = Pe [j] ; if (pn >= 0) { ASSERT (pn >= 0 && pn < iwlen) ; Pe [j] = Iw [pn] ; Iw [pn] = FLIP (j) ; } } /* psrc/pdst point to source/destination */ psrc = 0 ; pdst = 0 ; pend = pme1 - 1 ; while (psrc <= pend) { /* search for next FLIP'd entry */ j = FLIP (Iw [psrc++]) ; if (j >= 0) { AMD_DEBUG2 (("Got object j: "ID"\n", j)) ; Iw [pdst] = Pe [j] ; Pe [j] = pdst++ ; lenj = Len [j] ; /* copy from source to destination */ for (knt3 = 0 ; knt3 <= lenj - 2 ; knt3++) { Iw [pdst++] = Iw [psrc++] ; } } } /* move the new partially-constructed element */ p1 = pdst ; for (psrc = pme1 ; psrc <= pfree-1 ; psrc++) { Iw [pdst++] = Iw [psrc] ; } pme1 = p1 ; pfree = pdst ; pj = Pe [e] ; p = Pe [me] ; } /* ------------------------------------------------- */ /* i is a principal variable not yet placed in Lme */ /* store i in new list */ /* ------------------------------------------------- */ /* flag i as being in Lme by negating Nv [i] */ degme += nvi ; Nv [i] = -nvi ; Iw [pfree++] = i ; AMD_DEBUG2 ((" s: "ID" nv "ID"\n", i, Nv [i])); /* ------------------------------------------------- */ /* remove variable i from degree link list */ /* ------------------------------------------------- */ ilast = Last [i] ; inext = Next [i] ; ASSERT (ilast >= EMPTY && ilast < n) ; ASSERT (inext >= EMPTY && inext < n) ; if (inext != EMPTY) Last [inext] = ilast ; if (ilast != EMPTY) { Next [ilast] = inext ; } else { /* i is at the head of the degree list */ ASSERT (Degree [i] >= 0 && Degree [i] < n) ; Head [Degree [i]] = inext ; } } } if (e != me) { /* set tree pointer and flag to indicate element e is * absorbed into new element me (the parent of e is me) */ AMD_DEBUG1 ((" Element "ID" => "ID"\n", e, me)) ; Pe [e] = FLIP (me) ; W [e] = 0 ; } } pme2 = pfree - 1 ; } /* ----------------------------------------------------------------- */ /* me has now been converted into an element in Iw [pme1..pme2] */ /* ----------------------------------------------------------------- */ /* degme holds the external degree of new element */ Degree [me] = degme ; Pe [me] = pme1 ; Len [me] = pme2 - pme1 + 1 ; ASSERT (Pe [me] >= 0 && Pe [me] < iwlen) ; Elen [me] = FLIP (nvpiv + degme) ; /* FLIP (Elen (me)) is now the degree of pivot (including * diagonal part). */ #ifndef NDEBUG AMD_DEBUG2 (("New element structure: length= "ID"\n", pme2-pme1+1)) ; for (pme = pme1 ; pme <= pme2 ; pme++) AMD_DEBUG3 ((" "ID"", Iw[pme])); AMD_DEBUG3 (("\n")) ; #endif /* ----------------------------------------------------------------- */ /* make sure that wflg is not too large. */ /* ----------------------------------------------------------------- */ /* With the current value of wflg, wflg+n must not cause integer * overflow */ wflg = clear_flag (wflg, wbig, W, n) ; /* ========================================================================= */ /* COMPUTE (W [e] - wflg) = |Le\Lme| FOR ALL ELEMENTS */ /* ========================================================================= */ /* ----------------------------------------------------------------- * Scan 1: compute the external degrees of previous elements with * respect to the current element. That is: * (W [e] - wflg) = |Le \ Lme| * for each element e that appears in any supervariable in Lme. The * notation Le refers to the pattern (list of supervariables) of a * previous element e, where e is not yet absorbed, stored in * Iw [Pe [e] + 1 ... Pe [e] + Len [e]]. The notation Lme * refers to the pattern of the current element (stored in * Iw [pme1..pme2]). If aggressive absorption is enabled, and * (W [e] - wflg) becomes zero, then the element e will be absorbed * in Scan 2. * ----------------------------------------------------------------- */ AMD_DEBUG2 (("me: ")) ; for (pme = pme1 ; pme <= pme2 ; pme++) { i = Iw [pme] ; ASSERT (i >= 0 && i < n) ; eln = Elen [i] ; AMD_DEBUG3 ((""ID" Elen "ID": \n", i, eln)) ; if (eln > 0) { /* note that Nv [i] has been negated to denote i in Lme: */ nvi = -Nv [i] ; ASSERT (nvi > 0 && Pe [i] >= 0 && Pe [i] < iwlen) ; wnvi = wflg - nvi ; for (p = Pe [i] ; p <= Pe [i] + eln - 1 ; p++) { e = Iw [p] ; ASSERT (e >= 0 && e < n) ; we = W [e] ; AMD_DEBUG4 ((" e "ID" we "ID" ", e, we)) ; if (we >= wflg) { /* unabsorbed element e has been seen in this loop */ AMD_DEBUG4 ((" unabsorbed, first time seen")) ; we -= nvi ; } else if (we != 0) { /* e is an unabsorbed element */ /* this is the first we have seen e in all of Scan 1 */ AMD_DEBUG4 ((" unabsorbed")) ; we = Degree [e] + wnvi ; } AMD_DEBUG4 (("\n")) ; W [e] = we ; } } } AMD_DEBUG2 (("\n")) ; /* ========================================================================= */ /* DEGREE UPDATE AND ELEMENT ABSORPTION */ /* ========================================================================= */ /* ----------------------------------------------------------------- * Scan 2: for each i in Lme, sum up the degree of Lme (which is * degme), plus the sum of the external degrees of each Le for the * elements e appearing within i, plus the supervariables in i. * Place i in hash list. * ----------------------------------------------------------------- */ for (pme = pme1 ; pme <= pme2 ; pme++) { i = Iw [pme] ; ASSERT (i >= 0 && i < n && Nv [i] < 0 && Elen [i] >= 0) ; AMD_DEBUG2 (("Updating: i "ID" "ID" "ID"\n", i, Elen[i], Len [i])); p1 = Pe [i] ; p2 = p1 + Elen [i] - 1 ; pn = p1 ; hash = 0 ; deg = 0 ; ASSERT (p1 >= 0 && p1 < iwlen && p2 >= -1 && p2 < iwlen) ; /* ------------------------------------------------------------- */ /* scan the element list associated with supervariable i */ /* ------------------------------------------------------------- */ /* UMFPACK/MA38-style approximate degree: */ if (aggressive) { for (p = p1 ; p <= p2 ; p++) { e = Iw [p] ; ASSERT (e >= 0 && e < n) ; we = W [e] ; if (we != 0) { /* e is an unabsorbed element */ /* dext = | Le \ Lme | */ dext = we - wflg ; if (dext > 0) { deg += dext ; Iw [pn++] = e ; hash += e ; AMD_DEBUG4 ((" e: "ID" hash = "ID"\n",e,hash)) ; } else { /* external degree of e is zero, absorb e into me*/ AMD_DEBUG1 ((" Element "ID" =>"ID" (aggressive)\n", e, me)) ; ASSERT (dext == 0) ; Pe [e] = FLIP (me) ; W [e] = 0 ; } } } } else { for (p = p1 ; p <= p2 ; p++) { e = Iw [p] ; ASSERT (e >= 0 && e < n) ; we = W [e] ; if (we != 0) { /* e is an unabsorbed element */ dext = we - wflg ; ASSERT (dext >= 0) ; deg += dext ; Iw [pn++] = e ; hash += e ; AMD_DEBUG4 ((" e: "ID" hash = "ID"\n",e,hash)) ; } } } /* count the number of elements in i (including me): */ Elen [i] = pn - p1 + 1 ; /* ------------------------------------------------------------- */ /* scan the supervariables in the list associated with i */ /* ------------------------------------------------------------- */ /* The bulk of the AMD run time is typically spent in this loop, * particularly if the matrix has many dense rows that are not * removed prior to ordering. */ p3 = pn ; p4 = p1 + Len [i] ; for (p = p2 + 1 ; p < p4 ; p++) { j = Iw [p] ; ASSERT (j >= 0 && j < n) ; nvj = Nv [j] ; if (nvj > 0) { /* j is unabsorbed, and not in Lme. */ /* add to degree and add to new list */ deg += nvj ; Iw [pn++] = j ; hash += j ; AMD_DEBUG4 ((" s: "ID" hash "ID" Nv[j]= "ID"\n", j, hash, nvj)) ; } } /* ------------------------------------------------------------- */ /* update the degree and check for mass elimination */ /* ------------------------------------------------------------- */ /* with aggressive absorption, deg==0 is identical to the * Elen [i] == 1 && p3 == pn test, below. */ ASSERT (IMPLIES (aggressive, (deg==0) == (Elen[i]==1 && p3==pn))) ; if (Elen [i] == 1 && p3 == pn) { /* --------------------------------------------------------- */ /* mass elimination */ /* --------------------------------------------------------- */ /* There is nothing left of this node except for an edge to * the current pivot element. Elen [i] is 1, and there are * no variables adjacent to node i. Absorb i into the * current pivot element, me. Note that if there are two or * more mass eliminations, fillin due to mass elimination is * possible within the nvpiv-by-nvpiv pivot block. It is this * step that causes AMD's analysis to be an upper bound. * * The reason is that the selected pivot has a lower * approximate degree than the true degree of the two mass * eliminated nodes. There is no edge between the two mass * eliminated nodes. They are merged with the current pivot * anyway. * * No fillin occurs in the Schur complement, in any case, * and this effect does not decrease the quality of the * ordering itself, just the quality of the nonzero and * flop count analysis. It also means that the post-ordering * is not an exact elimination tree post-ordering. */ AMD_DEBUG1 ((" MASS i "ID" => parent e "ID"\n", i, me)) ; Pe [i] = FLIP (me) ; nvi = -Nv [i] ; degme -= nvi ; nvpiv += nvi ; nel += nvi ; Nv [i] = 0 ; Elen [i] = EMPTY ; } else { /* --------------------------------------------------------- */ /* update the upper-bound degree of i */ /* --------------------------------------------------------- */ /* the following degree does not yet include the size * of the current element, which is added later: */ Degree [i] = MIN (Degree [i], deg) ; /* --------------------------------------------------------- */ /* add me to the list for i */ /* --------------------------------------------------------- */ /* move first supervariable to end of list */ Iw [pn] = Iw [p3] ; /* move first element to end of element part of list */ Iw [p3] = Iw [p1] ; /* add new element, me, to front of list. */ Iw [p1] = me ; /* store the new length of the list in Len [i] */ Len [i] = pn - p1 + 1 ; /* --------------------------------------------------------- */ /* place in hash bucket. Save hash key of i in Last [i]. */ /* --------------------------------------------------------- */ /* NOTE: this can fail if hash is negative, because the ANSI C * standard does not define a % b when a and/or b are negative. * That's why hash is defined as an unsigned Int, to avoid this * problem. */ hash = hash % n ; ASSERT (((Int) hash) >= 0 && ((Int) hash) < n) ; /* if the Hhead array is not used: */ j = Head [hash] ; if (j <= EMPTY) { /* degree list is empty, hash head is FLIP (j) */ Next [i] = FLIP (j) ; Head [hash] = FLIP (i) ; } else { /* degree list is not empty, use Last [Head [hash]] as * hash head. */ Next [i] = Last [j] ; Last [j] = i ; } /* if a separate Hhead array is used: * Next [i] = Hhead [hash] ; Hhead [hash] = i ; */ Last [i] = hash ; } } Degree [me] = degme ; /* ----------------------------------------------------------------- */ /* Clear the counter array, W [...], by incrementing wflg. */ /* ----------------------------------------------------------------- */ /* make sure that wflg+n does not cause integer overflow */ lemax = MAX (lemax, degme) ; wflg += lemax ; wflg = clear_flag (wflg, wbig, W, n) ; /* at this point, W [0..n-1] < wflg holds */ /* ========================================================================= */ /* SUPERVARIABLE DETECTION */ /* ========================================================================= */ AMD_DEBUG1 (("Detecting supervariables:\n")) ; for (pme = pme1 ; pme <= pme2 ; pme++) { i = Iw [pme] ; ASSERT (i >= 0 && i < n) ; AMD_DEBUG2 (("Consider i "ID" nv "ID"\n", i, Nv [i])) ; if (Nv [i] < 0) { /* i is a principal variable in Lme */ /* --------------------------------------------------------- * examine all hash buckets with 2 or more variables. We do * this by examing all unique hash keys for supervariables in * the pattern Lme of the current element, me * --------------------------------------------------------- */ /* let i = head of hash bucket, and empty the hash bucket */ ASSERT (Last [i] >= 0 && Last [i] < n) ; hash = Last [i] ; /* if Hhead array is not used: */ j = Head [hash] ; if (j == EMPTY) { /* hash bucket and degree list are both empty */ i = EMPTY ; } else if (j < EMPTY) { /* degree list is empty */ i = FLIP (j) ; Head [hash] = EMPTY ; } else { /* degree list is not empty, restore Last [j] of head j */ i = Last [j] ; Last [j] = EMPTY ; } /* if separate Hhead array is used: * i = Hhead [hash] ; Hhead [hash] = EMPTY ; */ ASSERT (i >= EMPTY && i < n) ; AMD_DEBUG2 (("----i "ID" hash "ID"\n", i, hash)) ; while (i != EMPTY && Next [i] != EMPTY) { /* ----------------------------------------------------- * this bucket has one or more variables following i. * scan all of them to see if i can absorb any entries * that follow i in hash bucket. Scatter i into w. * ----------------------------------------------------- */ ln = Len [i] ; eln = Elen [i] ; ASSERT (ln >= 0 && eln >= 0) ; ASSERT (Pe [i] >= 0 && Pe [i] < iwlen) ; /* do not flag the first element in the list (me) */ for (p = Pe [i] + 1 ; p <= Pe [i] + ln - 1 ; p++) { ASSERT (Iw [p] >= 0 && Iw [p] < n) ; W [Iw [p]] = wflg ; } /* ----------------------------------------------------- */ /* scan every other entry j following i in bucket */ /* ----------------------------------------------------- */ jlast = i ; j = Next [i] ; ASSERT (j >= EMPTY && j < n) ; while (j != EMPTY) { /* ------------------------------------------------- */ /* check if j and i have identical nonzero pattern */ /* ------------------------------------------------- */ AMD_DEBUG3 (("compare i "ID" and j "ID"\n", i,j)) ; /* check if i and j have the same Len and Elen */ ASSERT (Len [j] >= 0 && Elen [j] >= 0) ; ASSERT (Pe [j] >= 0 && Pe [j] < iwlen) ; ok = (Len [j] == ln) && (Elen [j] == eln) ; /* skip the first element in the list (me) */ for (p = Pe [j] + 1 ; ok && p <= Pe [j] + ln - 1 ; p++) { ASSERT (Iw [p] >= 0 && Iw [p] < n) ; if (W [Iw [p]] != wflg) ok = 0 ; } if (ok) { /* --------------------------------------------- */ /* found it! j can be absorbed into i */ /* --------------------------------------------- */ AMD_DEBUG1 (("found it! j "ID" => i "ID"\n", j,i)); Pe [j] = FLIP (i) ; /* both Nv [i] and Nv [j] are negated since they */ /* are in Lme, and the absolute values of each */ /* are the number of variables in i and j: */ Nv [i] += Nv [j] ; Nv [j] = 0 ; Elen [j] = EMPTY ; /* delete j from hash bucket */ ASSERT (j != Next [j]) ; j = Next [j] ; Next [jlast] = j ; } else { /* j cannot be absorbed into i */ jlast = j ; ASSERT (j != Next [j]) ; j = Next [j] ; } ASSERT (j >= EMPTY && j < n) ; } /* ----------------------------------------------------- * no more variables can be absorbed into i * go to next i in bucket and clear flag array * ----------------------------------------------------- */ wflg++ ; i = Next [i] ; ASSERT (i >= EMPTY && i < n) ; } } } AMD_DEBUG2 (("detect done\n")) ; /* ========================================================================= */ /* RESTORE DEGREE LISTS AND REMOVE NONPRINCIPAL SUPERVARIABLES FROM ELEMENT */ /* ========================================================================= */ p = pme1 ; nleft = n - nel ; for (pme = pme1 ; pme <= pme2 ; pme++) { i = Iw [pme] ; ASSERT (i >= 0 && i < n) ; nvi = -Nv [i] ; AMD_DEBUG3 (("Restore i "ID" "ID"\n", i, nvi)) ; if (nvi > 0) { /* i is a principal variable in Lme */ /* restore Nv [i] to signify that i is principal */ Nv [i] = nvi ; /* --------------------------------------------------------- */ /* compute the external degree (add size of current element) */ /* --------------------------------------------------------- */ deg = Degree [i] + degme - nvi ; deg = MIN (deg, nleft - nvi) ; ASSERT (IMPLIES (aggressive, deg > 0) && deg >= 0 && deg < n) ; /* --------------------------------------------------------- */ /* place the supervariable at the head of the degree list */ /* --------------------------------------------------------- */ inext = Head [deg] ; ASSERT (inext >= EMPTY && inext < n) ; if (inext != EMPTY) Last [inext] = i ; Next [i] = inext ; Last [i] = EMPTY ; Head [deg] = i ; /* --------------------------------------------------------- */ /* save the new degree, and find the minimum degree */ /* --------------------------------------------------------- */ mindeg = MIN (mindeg, deg) ; Degree [i] = deg ; /* --------------------------------------------------------- */ /* place the supervariable in the element pattern */ /* --------------------------------------------------------- */ Iw [p++] = i ; } } AMD_DEBUG2 (("restore done\n")) ; /* ========================================================================= */ /* FINALIZE THE NEW ELEMENT */ /* ========================================================================= */ AMD_DEBUG2 (("ME = "ID" DONE\n", me)) ; Nv [me] = nvpiv ; /* save the length of the list for the new element me */ Len [me] = p - pme1 ; if (Len [me] == 0) { /* there is nothing left of the current pivot element */ /* it is a root of the assembly tree */ Pe [me] = EMPTY ; W [me] = 0 ; } if (elenme != 0) { /* element was not constructed in place: deallocate part of */ /* it since newly nonprincipal variables may have been removed */ pfree = p ; } /* The new element has nvpiv pivots and the size of the contribution * block for a multifrontal method is degme-by-degme, not including * the "dense" rows/columns. If the "dense" rows/columns are included, * the frontal matrix is no larger than * (degme+ndense)-by-(degme+ndense). */ if (Info != (double *) NULL) { f = nvpiv ; r = degme + ndense ; dmax = MAX (dmax, f + r) ; /* number of nonzeros in L (excluding the diagonal) */ lnzme = f*r + (f-1)*f/2 ; lnz += lnzme ; /* number of divide operations for LDL' and for LU */ ndiv += lnzme ; /* number of multiply-subtract pairs for LU */ s = f*r*r + r*(f-1)*f + (f-1)*f*(2*f-1)/6 ; nms_lu += s ; /* number of multiply-subtract pairs for LDL' */ nms_ldl += (s + lnzme)/2 ; } #ifndef NDEBUG AMD_DEBUG2 (("finalize done nel "ID" n "ID"\n ::::\n", nel, n)) ; for (pme = Pe [me] ; pme <= Pe [me] + Len [me] - 1 ; pme++) { AMD_DEBUG3 ((" "ID"", Iw [pme])) ; } AMD_DEBUG3 (("\n")) ; #endif } /* ========================================================================= */ /* DONE SELECTING PIVOTS */ /* ========================================================================= */ if (Info != (double *) NULL) { /* count the work to factorize the ndense-by-ndense submatrix */ f = ndense ; dmax = MAX (dmax, (double) ndense) ; /* number of nonzeros in L (excluding the diagonal) */ lnzme = (f-1)*f/2 ; lnz += lnzme ; /* number of divide operations for LDL' and for LU */ ndiv += lnzme ; /* number of multiply-subtract pairs for LU */ s = (f-1)*f*(2*f-1)/6 ; nms_lu += s ; /* number of multiply-subtract pairs for LDL' */ nms_ldl += (s + lnzme)/2 ; /* number of nz's in L (excl. diagonal) */ Info [AMD_LNZ] = lnz ; /* number of divide ops for LU and LDL' */ Info [AMD_NDIV] = ndiv ; /* number of multiply-subtract pairs for LDL' */ Info [AMD_NMULTSUBS_LDL] = nms_ldl ; /* number of multiply-subtract pairs for LU */ Info [AMD_NMULTSUBS_LU] = nms_lu ; /* number of "dense" rows/columns */ Info [AMD_NDENSE] = ndense ; /* largest front is dmax-by-dmax */ Info [AMD_DMAX] = dmax ; /* number of garbage collections in AMD */ Info [AMD_NCMPA] = ncmpa ; /* successful ordering */ Info [AMD_STATUS] = AMD_OK ; } /* ========================================================================= */ /* POST-ORDERING */ /* ========================================================================= */ /* ------------------------------------------------------------------------- * Variables at this point: * * Pe: holds the elimination tree. The parent of j is FLIP (Pe [j]), * or EMPTY if j is a root. The tree holds both elements and * non-principal (unordered) variables absorbed into them. * Dense variables are non-principal and unordered. * * Elen: holds the size of each element, including the diagonal part. * FLIP (Elen [e]) > 0 if e is an element. For unordered * variables i, Elen [i] is EMPTY. * * Nv: Nv [e] > 0 is the number of pivots represented by the element e. * For unordered variables i, Nv [i] is zero. * * Contents no longer needed: * W, Iw, Len, Degree, Head, Next, Last. * * The matrix itself has been destroyed. * * n: the size of the matrix. * No other scalars needed (pfree, iwlen, etc.) * ------------------------------------------------------------------------- */ /* restore Pe */ for (i = 0 ; i < n ; i++) { Pe [i] = FLIP (Pe [i]) ; } /* restore Elen, for output information, and for postordering */ for (i = 0 ; i < n ; i++) { Elen [i] = FLIP (Elen [i]) ; } /* Now the parent of j is Pe [j], or EMPTY if j is a root. Elen [e] > 0 * is the size of element e. Elen [i] is EMPTY for unordered variable i. */ #ifndef NDEBUG AMD_DEBUG2 (("\nTree:\n")) ; for (i = 0 ; i < n ; i++) { AMD_DEBUG2 ((" "ID" parent: "ID" ", i, Pe [i])) ; ASSERT (Pe [i] >= EMPTY && Pe [i] < n) ; if (Nv [i] > 0) { /* this is an element */ e = i ; AMD_DEBUG2 ((" element, size is "ID"\n", Elen [i])) ; ASSERT (Elen [e] > 0) ; } AMD_DEBUG2 (("\n")) ; } AMD_DEBUG2 (("\nelements:\n")) ; for (e = 0 ; e < n ; e++) { if (Nv [e] > 0) { AMD_DEBUG3 (("Element e= "ID" size "ID" nv "ID" \n", e, Elen [e], Nv [e])) ; } } AMD_DEBUG2 (("\nvariables:\n")) ; for (i = 0 ; i < n ; i++) { Int cnt ; if (Nv [i] == 0) { AMD_DEBUG3 (("i unordered: "ID"\n", i)) ; j = Pe [i] ; cnt = 0 ; AMD_DEBUG3 ((" j: "ID"\n", j)) ; if (j == EMPTY) { AMD_DEBUG3 ((" i is a dense variable\n")) ; } else { ASSERT (j >= 0 && j < n) ; while (Nv [j] == 0) { AMD_DEBUG3 ((" j : "ID"\n", j)) ; j = Pe [j] ; AMD_DEBUG3 ((" j:: "ID"\n", j)) ; cnt++ ; if (cnt > n) break ; } e = j ; AMD_DEBUG3 ((" got to e: "ID"\n", e)) ; } } } #endif /* ========================================================================= */ /* compress the paths of the variables */ /* ========================================================================= */ for (i = 0 ; i < n ; i++) { if (Nv [i] == 0) { /* ------------------------------------------------------------- * i is an un-ordered row. Traverse the tree from i until * reaching an element, e. The element, e, was the principal * supervariable of i and all nodes in the path from i to when e * was selected as pivot. * ------------------------------------------------------------- */ AMD_DEBUG1 (("Path compression, i unordered: "ID"\n", i)) ; j = Pe [i] ; ASSERT (j >= EMPTY && j < n) ; AMD_DEBUG3 ((" j: "ID"\n", j)) ; if (j == EMPTY) { /* Skip a dense variable. It has no parent. */ AMD_DEBUG3 ((" i is a dense variable\n")) ; continue ; } /* while (j is a variable) */ while (Nv [j] == 0) { AMD_DEBUG3 ((" j : "ID"\n", j)) ; j = Pe [j] ; AMD_DEBUG3 ((" j:: "ID"\n", j)) ; ASSERT (j >= 0 && j < n) ; } /* got to an element e */ e = j ; AMD_DEBUG3 (("got to e: "ID"\n", e)) ; /* ------------------------------------------------------------- * traverse the path again from i to e, and compress the path * (all nodes point to e). Path compression allows this code to * compute in O(n) time. * ------------------------------------------------------------- */ j = i ; /* while (j is a variable) */ while (Nv [j] == 0) { jnext = Pe [j] ; AMD_DEBUG3 (("j "ID" jnext "ID"\n", j, jnext)) ; Pe [j] = e ; j = jnext ; ASSERT (j >= 0 && j < n) ; } } } /* ========================================================================= */ /* postorder the assembly tree */ /* ========================================================================= */ AMD_postorder (n, Pe, Nv, Elen, W, /* output order */ Head, Next, Last) ; /* workspace */ /* ========================================================================= */ /* compute output permutation and inverse permutation */ /* ========================================================================= */ /* W [e] = k means that element e is the kth element in the new * order. e is in the range 0 to n-1, and k is in the range 0 to * the number of elements. Use Head for inverse order. */ for (k = 0 ; k < n ; k++) { Head [k] = EMPTY ; Next [k] = EMPTY ; } for (e = 0 ; e < n ; e++) { k = W [e] ; ASSERT ((k == EMPTY) == (Nv [e] == 0)) ; if (k != EMPTY) { ASSERT (k >= 0 && k < n) ; Head [k] = e ; } } /* construct output inverse permutation in Next, * and permutation in Last */ nel = 0 ; for (k = 0 ; k < n ; k++) { e = Head [k] ; if (e == EMPTY) break ; ASSERT (e >= 0 && e < n && Nv [e] > 0) ; Next [e] = nel ; nel += Nv [e] ; } ASSERT (nel == n - ndense) ; /* order non-principal variables (dense, & those merged into supervar's) */ for (i = 0 ; i < n ; i++) { if (Nv [i] == 0) { e = Pe [i] ; ASSERT (e >= EMPTY && e < n) ; if (e != EMPTY) { /* This is an unordered variable that was merged * into element e via supernode detection or mass * elimination of i when e became the pivot element. * Place i in order just before e. */ ASSERT (Next [i] == EMPTY && Nv [e] > 0) ; Next [i] = Next [e] ; Next [e]++ ; } else { /* This is a dense unordered variable, with no parent. * Place it last in the output order. */ Next [i] = nel++ ; } } } ASSERT (nel == n) ; AMD_DEBUG2 (("\n\nPerm:\n")) ; for (i = 0 ; i < n ; i++) { k = Next [i] ; ASSERT (k >= 0 && k < n) ; Last [k] = i ; AMD_DEBUG2 ((" perm ["ID"] = "ID"\n", k, i)) ; } } glpk-5.0/src/amd/amd_aat.c0000644000062000006210000001340113766346220014563 0ustar maomkpasswd/* ========================================================================= */ /* === AMD_aat ============================================================= */ /* ========================================================================= */ /* ------------------------------------------------------------------------- */ /* AMD, Copyright (c) Timothy A. Davis, */ /* Patrick R. Amestoy, and Iain S. Duff. See ../README.txt for License. */ /* email: davis at cise.ufl.edu CISE Department, Univ. of Florida. */ /* web: http://www.cise.ufl.edu/research/sparse/amd */ /* ------------------------------------------------------------------------- */ /* AMD_aat: compute the symmetry of the pattern of A, and count the number of * nonzeros each column of A+A' (excluding the diagonal). Assumes the input * matrix has no errors, with sorted columns and no duplicates * (AMD_valid (n, n, Ap, Ai) must be AMD_OK, but this condition is not * checked). */ #include "amd_internal.h" GLOBAL size_t AMD_aat /* returns nz in A+A' */ ( Int n, const Int Ap [ ], const Int Ai [ ], Int Len [ ], /* Len [j]: length of column j of A+A', excl diagonal*/ Int Tp [ ], /* workspace of size n */ double Info [ ] ) { Int p1, p2, p, i, j, pj, pj2, k, nzdiag, nzboth, nz ; double sym ; size_t nzaat ; #ifndef NDEBUG AMD_debug_init ("AMD AAT") ; for (k = 0 ; k < n ; k++) Tp [k] = EMPTY ; ASSERT (AMD_valid (n, n, Ap, Ai) == AMD_OK) ; #endif if (Info != (double *) NULL) { /* clear the Info array, if it exists */ for (i = 0 ; i < AMD_INFO ; i++) { Info [i] = EMPTY ; } Info [AMD_STATUS] = AMD_OK ; } for (k = 0 ; k < n ; k++) { Len [k] = 0 ; } nzdiag = 0 ; nzboth = 0 ; nz = Ap [n] ; for (k = 0 ; k < n ; k++) { p1 = Ap [k] ; p2 = Ap [k+1] ; AMD_DEBUG2 (("\nAAT Column: "ID" p1: "ID" p2: "ID"\n", k, p1, p2)) ; /* construct A+A' */ for (p = p1 ; p < p2 ; ) { /* scan the upper triangular part of A */ j = Ai [p] ; if (j < k) { /* entry A (j,k) is in the strictly upper triangular part, * add both A (j,k) and A (k,j) to the matrix A+A' */ Len [j]++ ; Len [k]++ ; AMD_DEBUG3 ((" upper ("ID","ID") ("ID","ID")\n", j,k, k,j)); p++ ; } else if (j == k) { /* skip the diagonal */ p++ ; nzdiag++ ; break ; } else /* j > k */ { /* first entry below the diagonal */ break ; } /* scan lower triangular part of A, in column j until reaching * row k. Start where last scan left off. */ ASSERT (Tp [j] != EMPTY) ; ASSERT (Ap [j] <= Tp [j] && Tp [j] <= Ap [j+1]) ; pj2 = Ap [j+1] ; for (pj = Tp [j] ; pj < pj2 ; ) { i = Ai [pj] ; if (i < k) { /* A (i,j) is only in the lower part, not in upper. * add both A (i,j) and A (j,i) to the matrix A+A' */ Len [i]++ ; Len [j]++ ; AMD_DEBUG3 ((" lower ("ID","ID") ("ID","ID")\n", i,j, j,i)) ; pj++ ; } else if (i == k) { /* entry A (k,j) in lower part and A (j,k) in upper */ pj++ ; nzboth++ ; break ; } else /* i > k */ { /* consider this entry later, when k advances to i */ break ; } } Tp [j] = pj ; } /* Tp [k] points to the entry just below the diagonal in column k */ Tp [k] = p ; } /* clean up, for remaining mismatched entries */ for (j = 0 ; j < n ; j++) { for (pj = Tp [j] ; pj < Ap [j+1] ; pj++) { i = Ai [pj] ; /* A (i,j) is only in the lower part, not in upper. * add both A (i,j) and A (j,i) to the matrix A+A' */ Len [i]++ ; Len [j]++ ; AMD_DEBUG3 ((" lower cleanup ("ID","ID") ("ID","ID")\n", i,j, j,i)) ; } } /* --------------------------------------------------------------------- */ /* compute the symmetry of the nonzero pattern of A */ /* --------------------------------------------------------------------- */ /* Given a matrix A, the symmetry of A is: * B = tril (spones (A), -1) + triu (spones (A), 1) ; * sym = nnz (B & B') / nnz (B) ; * or 1 if nnz (B) is zero. */ if (nz == nzdiag) { sym = 1 ; } else { sym = (2 * (double) nzboth) / ((double) (nz - nzdiag)) ; } nzaat = 0 ; for (k = 0 ; k < n ; k++) { nzaat += Len [k] ; } AMD_DEBUG1 (("AMD nz in A+A', excluding diagonal (nzaat) = %g\n", (double) nzaat)) ; AMD_DEBUG1 ((" nzboth: "ID" nz: "ID" nzdiag: "ID" symmetry: %g\n", nzboth, nz, nzdiag, sym)) ; if (Info != (double *) NULL) { Info [AMD_STATUS] = AMD_OK ; Info [AMD_N] = n ; Info [AMD_NZ] = nz ; Info [AMD_SYMMETRY] = sym ; /* symmetry of pattern of A */ Info [AMD_NZDIAG] = nzdiag ; /* nonzeros on diagonal of A */ Info [AMD_NZ_A_PLUS_AT] = nzaat ; /* nonzeros in A+A' */ } return (nzaat) ; } glpk-5.0/src/amd/amd_control.c0000644000062000006210000000370113766346220015500 0ustar maomkpasswd/* ========================================================================= */ /* === AMD_control ========================================================= */ /* ========================================================================= */ /* ------------------------------------------------------------------------- */ /* AMD, Copyright (c) Timothy A. Davis, */ /* Patrick R. Amestoy, and Iain S. Duff. See ../README.txt for License. */ /* email: davis at cise.ufl.edu CISE Department, Univ. of Florida. */ /* web: http://www.cise.ufl.edu/research/sparse/amd */ /* ------------------------------------------------------------------------- */ /* User-callable. Prints the control parameters for AMD. See amd.h * for details. If the Control array is not present, the defaults are * printed instead. */ #include "amd_internal.h" GLOBAL void AMD_control ( double Control [ ] ) { double alpha ; Int aggressive ; if (Control != (double *) NULL) { alpha = Control [AMD_DENSE] ; aggressive = Control [AMD_AGGRESSIVE] != 0 ; } else { alpha = AMD_DEFAULT_DENSE ; aggressive = AMD_DEFAULT_AGGRESSIVE ; } PRINTF (("\nAMD version %d.%d.%d, %s: approximate minimum degree ordering\n" " dense row parameter: %g\n", AMD_MAIN_VERSION, AMD_SUB_VERSION, AMD_SUBSUB_VERSION, AMD_DATE, alpha)) ; if (alpha < 0) { PRINTF ((" no rows treated as dense\n")) ; } else { PRINTF (( " (rows with more than max (%g * sqrt (n), 16) entries are\n" " considered \"dense\", and placed last in output permutation)\n", alpha)) ; } if (aggressive) { PRINTF ((" aggressive absorption: yes\n")) ; } else { PRINTF ((" aggressive absorption: no\n")) ; } PRINTF ((" size of AMD integer: %d\n\n", sizeof (Int))) ; } glpk-5.0/src/amd/amd_defaults.c0000644000062000006210000000257313766346220015635 0ustar maomkpasswd/* ========================================================================= */ /* === AMD_defaults ======================================================== */ /* ========================================================================= */ /* ------------------------------------------------------------------------- */ /* AMD, Copyright (c) Timothy A. Davis, */ /* Patrick R. Amestoy, and Iain S. Duff. See ../README.txt for License. */ /* email: davis at cise.ufl.edu CISE Department, Univ. of Florida. */ /* web: http://www.cise.ufl.edu/research/sparse/amd */ /* ------------------------------------------------------------------------- */ /* User-callable. Sets default control parameters for AMD. See amd.h * for details. */ #include "amd_internal.h" /* ========================================================================= */ /* === AMD defaults ======================================================== */ /* ========================================================================= */ GLOBAL void AMD_defaults ( double Control [ ] ) { Int i ; if (Control != (double *) NULL) { for (i = 0 ; i < AMD_CONTROL ; i++) { Control [i] = 0 ; } Control [AMD_DENSE] = AMD_DEFAULT_DENSE ; Control [AMD_AGGRESSIVE] = AMD_DEFAULT_AGGRESSIVE ; } } glpk-5.0/src/amd/amd_dump.c0000644000062000006210000001400113766346220014760 0ustar maomkpasswd/* ========================================================================= */ /* === AMD_dump ============================================================ */ /* ========================================================================= */ /* ------------------------------------------------------------------------- */ /* AMD, Copyright (c) Timothy A. Davis, */ /* Patrick R. Amestoy, and Iain S. Duff. See ../README.txt for License. */ /* email: davis at cise.ufl.edu CISE Department, Univ. of Florida. */ /* web: http://www.cise.ufl.edu/research/sparse/amd */ /* ------------------------------------------------------------------------- */ /* Debugging routines for AMD. Not used if NDEBUG is not defined at compile- * time (the default). See comments in amd_internal.h on how to enable * debugging. Not user-callable. */ #include "amd_internal.h" #ifndef NDEBUG /* This global variable is present only when debugging */ GLOBAL Int AMD_debug = -999 ; /* default is no debug printing */ /* ========================================================================= */ /* === AMD_debug_init ====================================================== */ /* ========================================================================= */ /* Sets the debug print level, by reading the file debug.amd (if it exists) */ GLOBAL void AMD_debug_init ( char *s ) { FILE *f ; f = fopen ("debug.amd", "r") ; if (f == (FILE *) NULL) { AMD_debug = -999 ; } else { fscanf (f, ID, &AMD_debug) ; fclose (f) ; } if (AMD_debug >= 0) { printf ("%s: AMD_debug_init, D= "ID"\n", s, AMD_debug) ; } } /* ========================================================================= */ /* === AMD_dump ============================================================ */ /* ========================================================================= */ /* Dump AMD's data structure, except for the hash buckets. This routine * cannot be called when the hash buckets are non-empty. */ GLOBAL void AMD_dump ( Int n, /* A is n-by-n */ Int Pe [ ], /* pe [0..n-1]: index in iw of start of row i */ Int Iw [ ], /* workspace of size iwlen, iwlen [0..pfree-1] * holds the matrix on input */ Int Len [ ], /* len [0..n-1]: length for row i */ Int iwlen, /* length of iw */ Int pfree, /* iw [pfree ... iwlen-1] is empty on input */ Int Nv [ ], /* nv [0..n-1] */ Int Next [ ], /* next [0..n-1] */ Int Last [ ], /* last [0..n-1] */ Int Head [ ], /* head [0..n-1] */ Int Elen [ ], /* size n */ Int Degree [ ], /* size n */ Int W [ ], /* size n */ Int nel ) { Int i, pe, elen, nv, len, e, p, k, j, deg, w, cnt, ilast ; if (AMD_debug < 0) return ; ASSERT (pfree <= iwlen) ; AMD_DEBUG3 (("\nAMD dump, pfree: "ID"\n", pfree)) ; for (i = 0 ; i < n ; i++) { pe = Pe [i] ; elen = Elen [i] ; nv = Nv [i] ; len = Len [i] ; w = W [i] ; if (elen >= EMPTY) { if (nv == 0) { AMD_DEBUG3 (("\nI "ID": nonprincipal: ", i)) ; ASSERT (elen == EMPTY) ; if (pe == EMPTY) { AMD_DEBUG3 ((" dense node\n")) ; ASSERT (w == 1) ; } else { ASSERT (pe < EMPTY) ; AMD_DEBUG3 ((" i "ID" -> parent "ID"\n", i, FLIP (Pe[i]))); } } else { AMD_DEBUG3 (("\nI "ID": active principal supervariable:\n",i)); AMD_DEBUG3 ((" nv(i): "ID" Flag: %d\n", nv, (nv < 0))) ; ASSERT (elen >= 0) ; ASSERT (nv > 0 && pe >= 0) ; p = pe ; AMD_DEBUG3 ((" e/s: ")) ; if (elen == 0) AMD_DEBUG3 ((" : ")) ; ASSERT (pe + len <= pfree) ; for (k = 0 ; k < len ; k++) { j = Iw [p] ; AMD_DEBUG3 ((" "ID"", j)) ; ASSERT (j >= 0 && j < n) ; if (k == elen-1) AMD_DEBUG3 ((" : ")) ; p++ ; } AMD_DEBUG3 (("\n")) ; } } else { e = i ; if (w == 0) { AMD_DEBUG3 (("\nE "ID": absorbed element: w "ID"\n", e, w)) ; ASSERT (nv > 0 && pe < 0) ; AMD_DEBUG3 ((" e "ID" -> parent "ID"\n", e, FLIP (Pe [e]))) ; } else { AMD_DEBUG3 (("\nE "ID": unabsorbed element: w "ID"\n", e, w)) ; ASSERT (nv > 0 && pe >= 0) ; p = pe ; AMD_DEBUG3 ((" : ")) ; ASSERT (pe + len <= pfree) ; for (k = 0 ; k < len ; k++) { j = Iw [p] ; AMD_DEBUG3 ((" "ID"", j)) ; ASSERT (j >= 0 && j < n) ; p++ ; } AMD_DEBUG3 (("\n")) ; } } } /* this routine cannot be called when the hash buckets are non-empty */ AMD_DEBUG3 (("\nDegree lists:\n")) ; if (nel >= 0) { cnt = 0 ; for (deg = 0 ; deg < n ; deg++) { if (Head [deg] == EMPTY) continue ; ilast = EMPTY ; AMD_DEBUG3 ((ID": \n", deg)) ; for (i = Head [deg] ; i != EMPTY ; i = Next [i]) { AMD_DEBUG3 ((" "ID" : next "ID" last "ID" deg "ID"\n", i, Next [i], Last [i], Degree [i])) ; ASSERT (i >= 0 && i < n && ilast == Last [i] && deg == Degree [i]) ; cnt += Nv [i] ; ilast = i ; } AMD_DEBUG3 (("\n")) ; } ASSERT (cnt == n - nel) ; } } #endif glpk-5.0/src/amd/amd_info.c0000644000062000006210000001065613766346220014762 0ustar maomkpasswd/* ========================================================================= */ /* === AMD_info ============================================================ */ /* ========================================================================= */ /* ------------------------------------------------------------------------- */ /* AMD, Copyright (c) Timothy A. Davis, */ /* Patrick R. Amestoy, and Iain S. Duff. See ../README.txt for License. */ /* email: davis at cise.ufl.edu CISE Department, Univ. of Florida. */ /* web: http://www.cise.ufl.edu/research/sparse/amd */ /* ------------------------------------------------------------------------- */ /* User-callable. Prints the output statistics for AMD. See amd.h * for details. If the Info array is not present, nothing is printed. */ #include "amd_internal.h" #define PRI(format,x) { if (x >= 0) { PRINTF ((format, x)) ; }} GLOBAL void AMD_info ( double Info [ ] ) { double n, ndiv, nmultsubs_ldl, nmultsubs_lu, lnz, lnzd ; PRINTF (("\nAMD version %d.%d.%d, %s, results:\n", AMD_MAIN_VERSION, AMD_SUB_VERSION, AMD_SUBSUB_VERSION, AMD_DATE)) ; if (!Info) { return ; } n = Info [AMD_N] ; ndiv = Info [AMD_NDIV] ; nmultsubs_ldl = Info [AMD_NMULTSUBS_LDL] ; nmultsubs_lu = Info [AMD_NMULTSUBS_LU] ; lnz = Info [AMD_LNZ] ; lnzd = (n >= 0 && lnz >= 0) ? (n + lnz) : (-1) ; /* AMD return status */ PRINTF ((" status: ")) ; if (Info [AMD_STATUS] == AMD_OK) { PRINTF (("OK\n")) ; } else if (Info [AMD_STATUS] == AMD_OUT_OF_MEMORY) { PRINTF (("out of memory\n")) ; } else if (Info [AMD_STATUS] == AMD_INVALID) { PRINTF (("invalid matrix\n")) ; } else if (Info [AMD_STATUS] == AMD_OK_BUT_JUMBLED) { PRINTF (("OK, but jumbled\n")) ; } else { PRINTF (("unknown\n")) ; } /* statistics about the input matrix */ PRI (" n, dimension of A: %.20g\n", n); PRI (" nz, number of nonzeros in A: %.20g\n", Info [AMD_NZ]) ; PRI (" symmetry of A: %.4f\n", Info [AMD_SYMMETRY]) ; PRI (" number of nonzeros on diagonal: %.20g\n", Info [AMD_NZDIAG]) ; PRI (" nonzeros in pattern of A+A' (excl. diagonal): %.20g\n", Info [AMD_NZ_A_PLUS_AT]) ; PRI (" # dense rows/columns of A+A': %.20g\n", Info [AMD_NDENSE]) ; /* statistics about AMD's behavior */ PRI (" memory used, in bytes: %.20g\n", Info [AMD_MEMORY]) ; PRI (" # of memory compactions: %.20g\n", Info [AMD_NCMPA]) ; /* statistics about the ordering quality */ PRINTF (("\n" " The following approximate statistics are for a subsequent\n" " factorization of A(P,P) + A(P,P)'. They are slight upper\n" " bounds if there are no dense rows/columns in A+A', and become\n" " looser if dense rows/columns exist.\n\n")) ; PRI (" nonzeros in L (excluding diagonal): %.20g\n", lnz) ; PRI (" nonzeros in L (including diagonal): %.20g\n", lnzd) ; PRI (" # divide operations for LDL' or LU: %.20g\n", ndiv) ; PRI (" # multiply-subtract operations for LDL': %.20g\n", nmultsubs_ldl) ; PRI (" # multiply-subtract operations for LU: %.20g\n", nmultsubs_lu) ; PRI (" max nz. in any column of L (incl. diagonal): %.20g\n", Info [AMD_DMAX]) ; /* total flop counts for various factorizations */ if (n >= 0 && ndiv >= 0 && nmultsubs_ldl >= 0 && nmultsubs_lu >= 0) { PRINTF (("\n" " chol flop count for real A, sqrt counted as 1 flop: %.20g\n" " LDL' flop count for real A: %.20g\n" " LDL' flop count for complex A: %.20g\n" " LU flop count for real A (with no pivoting): %.20g\n" " LU flop count for complex A (with no pivoting): %.20g\n\n", n + ndiv + 2*nmultsubs_ldl, ndiv + 2*nmultsubs_ldl, 9*ndiv + 8*nmultsubs_ldl, ndiv + 2*nmultsubs_lu, 9*ndiv + 8*nmultsubs_lu)) ; } } glpk-5.0/src/amd/amd_internal.h0000644000062000006210000000613613766346220015646 0ustar maomkpasswd/* amd_internal.h */ /* Written by Andrew Makhorin . */ #ifndef AMD_INTERNAL_H #define AMD_INTERNAL_H /* AMD will be exceedingly slow when running in debug mode. */ #if 1 #define NDEBUG #endif #include "amd.h" #include "env.h" #define Int int #define ID "%d" #define Int_MAX INT_MAX #if 0 /* 15/II-2012 */ /* now this macro is defined in glpenv.h; besides, the definiton below depends on implementation, because size_t is an unsigned type */ #define SIZE_T_MAX ((size_t)(-1)) #endif #define EMPTY (-1) #define FLIP(i) (-(i)-2) #define UNFLIP(i) ((i < EMPTY) ? FLIP (i) : (i)) #define MAX(a,b) (((a) > (b)) ? (a) : (b)) #define MIN(a,b) (((a) < (b)) ? (a) : (b)) #define IMPLIES(p, q) (!(p) || (q)) #define GLOBAL #define AMD_order amd_order #define AMD_defaults amd_defaults #define AMD_control amd_control #define AMD_info amd_info #define AMD_1 amd_1 #define AMD_2 amd_2 #define AMD_valid amd_valid #define AMD_aat amd_aat #define AMD_postorder amd_postorder #define AMD_post_tree amd_post_tree #define AMD_dump amd_dump #define AMD_debug amd_debug #define AMD_debug_init amd_debug_init #define AMD_preprocess amd_preprocess #define amd_malloc xmalloc #if 0 /* 24/V-2009 */ #define amd_free xfree #else #define amd_free(ptr) { if ((ptr) != NULL) xfree(ptr); } #endif #define amd_printf xprintf #define PRINTF(params) { amd_printf params; } #ifndef NDEBUG #define ASSERT(expr) xassert(expr) #define AMD_DEBUG0(params) { PRINTF(params); } #define AMD_DEBUG1(params) { if (AMD_debug >= 1) PRINTF(params); } #define AMD_DEBUG2(params) { if (AMD_debug >= 2) PRINTF(params); } #define AMD_DEBUG3(params) { if (AMD_debug >= 3) PRINTF(params); } #define AMD_DEBUG4(params) { if (AMD_debug >= 4) PRINTF(params); } #else #define ASSERT(expression) #define AMD_DEBUG0(params) #define AMD_DEBUG1(params) #define AMD_DEBUG2(params) #define AMD_DEBUG3(params) #define AMD_DEBUG4(params) #endif #define amd_aat _glp_amd_aat size_t AMD_aat(Int n, const Int Ap[], const Int Ai[], Int Len[], Int Tp[], double Info[]); #define amd_1 _glp_amd_1 void AMD_1(Int n, const Int Ap[], const Int Ai[], Int P[], Int Pinv[], Int Len[], Int slen, Int S[], double Control[], double Info[]); #define amd_postorder _glp_amd_postorder void AMD_postorder(Int nn, Int Parent[], Int Npiv[], Int Fsize[], Int Order[], Int Child[], Int Sibling[], Int Stack[]); #define amd_post_tree _glp_amd_post_tree #ifndef NDEBUG Int AMD_post_tree(Int root, Int k, Int Child[], const Int Sibling[], Int Order[], Int Stack[], Int nn); #else Int AMD_post_tree(Int root, Int k, Int Child[], const Int Sibling[], Int Order[], Int Stack[]); #endif #define amd_preprocess _glp_amd_preprocess void AMD_preprocess(Int n, const Int Ap[], const Int Ai[], Int Rp[], Int Ri[], Int W[], Int Flag[]); #define amd_debug _glp_amd_debug extern Int AMD_debug; #define amd_debug_init _glp_amd_debug_init void AMD_debug_init(char *s); #define amd_dump _glp_amd_dump void AMD_dump(Int n, Int Pe[], Int Iw[], Int Len[], Int iwlen, Int pfree, Int Nv[], Int Next[], Int Last[], Int Head[], Int Elen[], Int Degree[], Int W[], Int nel); #endif /* eof */ glpk-5.0/src/amd/amd_order.c0000644000062000006210000001451613766346220015141 0ustar maomkpasswd/* ========================================================================= */ /* === AMD_order =========================================================== */ /* ========================================================================= */ /* ------------------------------------------------------------------------- */ /* AMD, Copyright (c) Timothy A. Davis, */ /* Patrick R. Amestoy, and Iain S. Duff. See ../README.txt for License. */ /* email: davis at cise.ufl.edu CISE Department, Univ. of Florida. */ /* web: http://www.cise.ufl.edu/research/sparse/amd */ /* ------------------------------------------------------------------------- */ /* User-callable AMD minimum degree ordering routine. See amd.h for * documentation. */ #include "amd_internal.h" /* ========================================================================= */ /* === AMD_order =========================================================== */ /* ========================================================================= */ GLOBAL Int AMD_order ( Int n, const Int Ap [ ], const Int Ai [ ], Int P [ ], double Control [ ], double Info [ ] ) { Int *Len, *S, nz, i, *Pinv, info, status, *Rp, *Ri, *Cp, *Ci, ok ; size_t nzaat, slen ; double mem = 0 ; #ifndef NDEBUG AMD_debug_init ("amd") ; #endif /* clear the Info array, if it exists */ info = Info != (double *) NULL ; if (info) { for (i = 0 ; i < AMD_INFO ; i++) { Info [i] = EMPTY ; } Info [AMD_N] = n ; Info [AMD_STATUS] = AMD_OK ; } /* make sure inputs exist and n is >= 0 */ if (Ai == (Int *) NULL || Ap == (Int *) NULL || P == (Int *) NULL || n < 0) { if (info) Info [AMD_STATUS] = AMD_INVALID ; return (AMD_INVALID) ; /* arguments are invalid */ } if (n == 0) { return (AMD_OK) ; /* n is 0 so there's nothing to do */ } nz = Ap [n] ; if (info) { Info [AMD_NZ] = nz ; } if (nz < 0) { if (info) Info [AMD_STATUS] = AMD_INVALID ; return (AMD_INVALID) ; } /* check if n or nz will cause size_t overflow */ if (((size_t) n) >= SIZE_T_MAX / sizeof (Int) || ((size_t) nz) >= SIZE_T_MAX / sizeof (Int)) { if (info) Info [AMD_STATUS] = AMD_OUT_OF_MEMORY ; return (AMD_OUT_OF_MEMORY) ; /* problem too large */ } /* check the input matrix: AMD_OK, AMD_INVALID, or AMD_OK_BUT_JUMBLED */ status = AMD_valid (n, n, Ap, Ai) ; if (status == AMD_INVALID) { if (info) Info [AMD_STATUS] = AMD_INVALID ; return (AMD_INVALID) ; /* matrix is invalid */ } /* allocate two size-n integer workspaces */ Len = amd_malloc (n * sizeof (Int)) ; Pinv = amd_malloc (n * sizeof (Int)) ; mem += n ; mem += n ; if (!Len || !Pinv) { /* :: out of memory :: */ amd_free (Len) ; amd_free (Pinv) ; if (info) Info [AMD_STATUS] = AMD_OUT_OF_MEMORY ; return (AMD_OUT_OF_MEMORY) ; } if (status == AMD_OK_BUT_JUMBLED) { /* sort the input matrix and remove duplicate entries */ AMD_DEBUG1 (("Matrix is jumbled\n")) ; Rp = amd_malloc ((n+1) * sizeof (Int)) ; Ri = amd_malloc (MAX (nz,1) * sizeof (Int)) ; mem += (n+1) ; mem += MAX (nz,1) ; if (!Rp || !Ri) { /* :: out of memory :: */ amd_free (Rp) ; amd_free (Ri) ; amd_free (Len) ; amd_free (Pinv) ; if (info) Info [AMD_STATUS] = AMD_OUT_OF_MEMORY ; return (AMD_OUT_OF_MEMORY) ; } /* use Len and Pinv as workspace to create R = A' */ AMD_preprocess (n, Ap, Ai, Rp, Ri, Len, Pinv) ; Cp = Rp ; Ci = Ri ; } else { /* order the input matrix as-is. No need to compute R = A' first */ Rp = NULL ; Ri = NULL ; Cp = (Int *) Ap ; Ci = (Int *) Ai ; } /* --------------------------------------------------------------------- */ /* determine the symmetry and count off-diagonal nonzeros in A+A' */ /* --------------------------------------------------------------------- */ nzaat = AMD_aat (n, Cp, Ci, Len, P, Info) ; AMD_DEBUG1 (("nzaat: %g\n", (double) nzaat)) ; ASSERT ((MAX (nz-n, 0) <= nzaat) && (nzaat <= 2 * (size_t) nz)) ; /* --------------------------------------------------------------------- */ /* allocate workspace for matrix, elbow room, and 6 size-n vectors */ /* --------------------------------------------------------------------- */ S = NULL ; slen = nzaat ; /* space for matrix */ ok = ((slen + nzaat/5) >= slen) ; /* check for size_t overflow */ slen += nzaat/5 ; /* add elbow room */ for (i = 0 ; ok && i < 7 ; i++) { ok = ((slen + n) > slen) ; /* check for size_t overflow */ slen += n ; /* size-n elbow room, 6 size-n work */ } mem += slen ; ok = ok && (slen < SIZE_T_MAX / sizeof (Int)) ; /* check for overflow */ ok = ok && (slen < Int_MAX) ; /* S[i] for Int i must be OK */ if (ok) { S = amd_malloc (slen * sizeof (Int)) ; } AMD_DEBUG1 (("slen %g\n", (double) slen)) ; if (!S) { /* :: out of memory :: (or problem too large) */ amd_free (Rp) ; amd_free (Ri) ; amd_free (Len) ; amd_free (Pinv) ; if (info) Info [AMD_STATUS] = AMD_OUT_OF_MEMORY ; return (AMD_OUT_OF_MEMORY) ; } if (info) { /* memory usage, in bytes. */ Info [AMD_MEMORY] = mem * sizeof (Int) ; } /* --------------------------------------------------------------------- */ /* order the matrix */ /* --------------------------------------------------------------------- */ AMD_1 (n, Cp, Ci, P, Pinv, Len, slen, S, Control, Info) ; /* --------------------------------------------------------------------- */ /* free the workspace */ /* --------------------------------------------------------------------- */ amd_free (Rp) ; amd_free (Ri) ; amd_free (Len) ; amd_free (Pinv) ; amd_free (S) ; if (info) Info [AMD_STATUS] = status ; return (status) ; /* successful ordering */ } glpk-5.0/src/amd/amd_postorder.c0000644000062000006210000001543113766346220016044 0ustar maomkpasswd/* ========================================================================= */ /* === AMD_postorder ======================================================= */ /* ========================================================================= */ /* ------------------------------------------------------------------------- */ /* AMD, Copyright (c) Timothy A. Davis, */ /* Patrick R. Amestoy, and Iain S. Duff. See ../README.txt for License. */ /* email: davis at cise.ufl.edu CISE Department, Univ. of Florida. */ /* web: http://www.cise.ufl.edu/research/sparse/amd */ /* ------------------------------------------------------------------------- */ /* Perform a postordering (via depth-first search) of an assembly tree. */ #include "amd_internal.h" GLOBAL void AMD_postorder ( /* inputs, not modified on output: */ Int nn, /* nodes are in the range 0..nn-1 */ Int Parent [ ], /* Parent [j] is the parent of j, or EMPTY if root */ Int Nv [ ], /* Nv [j] > 0 number of pivots represented by node j, * or zero if j is not a node. */ Int Fsize [ ], /* Fsize [j]: size of node j */ /* output, not defined on input: */ Int Order [ ], /* output post-order */ /* workspaces of size nn: */ Int Child [ ], Int Sibling [ ], Int Stack [ ] ) { Int i, j, k, parent, frsize, f, fprev, maxfrsize, bigfprev, bigf, fnext ; for (j = 0 ; j < nn ; j++) { Child [j] = EMPTY ; Sibling [j] = EMPTY ; } /* --------------------------------------------------------------------- */ /* place the children in link lists - bigger elements tend to be last */ /* --------------------------------------------------------------------- */ for (j = nn-1 ; j >= 0 ; j--) { if (Nv [j] > 0) { /* this is an element */ parent = Parent [j] ; if (parent != EMPTY) { /* place the element in link list of the children its parent */ /* bigger elements will tend to be at the end of the list */ Sibling [j] = Child [parent] ; Child [parent] = j ; } } } #ifndef NDEBUG { Int nels, ff, nchild ; AMD_DEBUG1 (("\n\n================================ AMD_postorder:\n")); nels = 0 ; for (j = 0 ; j < nn ; j++) { if (Nv [j] > 0) { AMD_DEBUG1 (( ""ID" : nels "ID" npiv "ID" size "ID " parent "ID" maxfr "ID"\n", j, nels, Nv [j], Fsize [j], Parent [j], Fsize [j])) ; /* this is an element */ /* dump the link list of children */ nchild = 0 ; AMD_DEBUG1 ((" Children: ")) ; for (ff = Child [j] ; ff != EMPTY ; ff = Sibling [ff]) { AMD_DEBUG1 ((ID" ", ff)) ; ASSERT (Parent [ff] == j) ; nchild++ ; ASSERT (nchild < nn) ; } AMD_DEBUG1 (("\n")) ; parent = Parent [j] ; if (parent != EMPTY) { ASSERT (Nv [parent] > 0) ; } nels++ ; } } } AMD_DEBUG1 (("\n\nGo through the children of each node, and put\n" "the biggest child last in each list:\n")) ; #endif /* --------------------------------------------------------------------- */ /* place the largest child last in the list of children for each node */ /* --------------------------------------------------------------------- */ for (i = 0 ; i < nn ; i++) { if (Nv [i] > 0 && Child [i] != EMPTY) { #ifndef NDEBUG Int nchild ; AMD_DEBUG1 (("Before partial sort, element "ID"\n", i)) ; nchild = 0 ; for (f = Child [i] ; f != EMPTY ; f = Sibling [f]) { ASSERT (f >= 0 && f < nn) ; AMD_DEBUG1 ((" f: "ID" size: "ID"\n", f, Fsize [f])) ; nchild++ ; ASSERT (nchild <= nn) ; } #endif /* find the biggest element in the child list */ fprev = EMPTY ; maxfrsize = EMPTY ; bigfprev = EMPTY ; bigf = EMPTY ; for (f = Child [i] ; f != EMPTY ; f = Sibling [f]) { ASSERT (f >= 0 && f < nn) ; frsize = Fsize [f] ; if (frsize >= maxfrsize) { /* this is the biggest seen so far */ maxfrsize = frsize ; bigfprev = fprev ; bigf = f ; } fprev = f ; } ASSERT (bigf != EMPTY) ; fnext = Sibling [bigf] ; AMD_DEBUG1 (("bigf "ID" maxfrsize "ID" bigfprev "ID" fnext "ID " fprev " ID"\n", bigf, maxfrsize, bigfprev, fnext, fprev)) ; if (fnext != EMPTY) { /* if fnext is EMPTY then bigf is already at the end of list */ if (bigfprev == EMPTY) { /* delete bigf from the element of the list */ Child [i] = fnext ; } else { /* delete bigf from the middle of the list */ Sibling [bigfprev] = fnext ; } /* put bigf at the end of the list */ Sibling [bigf] = EMPTY ; ASSERT (Child [i] != EMPTY) ; ASSERT (fprev != bigf) ; ASSERT (fprev != EMPTY) ; Sibling [fprev] = bigf ; } #ifndef NDEBUG AMD_DEBUG1 (("After partial sort, element "ID"\n", i)) ; for (f = Child [i] ; f != EMPTY ; f = Sibling [f]) { ASSERT (f >= 0 && f < nn) ; AMD_DEBUG1 ((" "ID" "ID"\n", f, Fsize [f])) ; ASSERT (Nv [f] > 0) ; nchild-- ; } ASSERT (nchild == 0) ; #endif } } /* --------------------------------------------------------------------- */ /* postorder the assembly tree */ /* --------------------------------------------------------------------- */ for (i = 0 ; i < nn ; i++) { Order [i] = EMPTY ; } k = 0 ; for (i = 0 ; i < nn ; i++) { if (Parent [i] == EMPTY && Nv [i] > 0) { AMD_DEBUG1 (("Root of assembly tree "ID"\n", i)) ; k = AMD_post_tree (i, k, Child, Sibling, Order, Stack #ifndef NDEBUG , nn #endif ) ; } } } glpk-5.0/src/amd/amd_post_tree.c0000644000062000006210000001070513766346220016026 0ustar maomkpasswd/* ========================================================================= */ /* === AMD_post_tree ======================================================= */ /* ========================================================================= */ /* ------------------------------------------------------------------------- */ /* AMD, Copyright (c) Timothy A. Davis, */ /* Patrick R. Amestoy, and Iain S. Duff. See ../README.txt for License. */ /* email: davis at cise.ufl.edu CISE Department, Univ. of Florida. */ /* web: http://www.cise.ufl.edu/research/sparse/amd */ /* ------------------------------------------------------------------------- */ /* Post-ordering of a supernodal elimination tree. */ #include "amd_internal.h" GLOBAL Int AMD_post_tree ( Int root, /* root of the tree */ Int k, /* start numbering at k */ Int Child [ ], /* input argument of size nn, undefined on * output. Child [i] is the head of a link * list of all nodes that are children of node * i in the tree. */ const Int Sibling [ ], /* input argument of size nn, not modified. * If f is a node in the link list of the * children of node i, then Sibling [f] is the * next child of node i. */ Int Order [ ], /* output order, of size nn. Order [i] = k * if node i is the kth node of the reordered * tree. */ Int Stack [ ] /* workspace of size nn */ #ifndef NDEBUG , Int nn /* nodes are in the range 0..nn-1. */ #endif ) { Int f, head, h, i ; #if 0 /* --------------------------------------------------------------------- */ /* recursive version (Stack [ ] is not used): */ /* --------------------------------------------------------------------- */ /* this is simple, but can caouse stack overflow if nn is large */ i = root ; for (f = Child [i] ; f != EMPTY ; f = Sibling [f]) { k = AMD_post_tree (f, k, Child, Sibling, Order, Stack, nn) ; } Order [i] = k++ ; return (k) ; #endif /* --------------------------------------------------------------------- */ /* non-recursive version, using an explicit stack */ /* --------------------------------------------------------------------- */ /* push root on the stack */ head = 0 ; Stack [0] = root ; while (head >= 0) { /* get head of stack */ ASSERT (head < nn) ; i = Stack [head] ; AMD_DEBUG1 (("head of stack "ID" \n", i)) ; ASSERT (i >= 0 && i < nn) ; if (Child [i] != EMPTY) { /* the children of i are not yet ordered */ /* push each child onto the stack in reverse order */ /* so that small ones at the head of the list get popped first */ /* and the biggest one at the end of the list gets popped last */ for (f = Child [i] ; f != EMPTY ; f = Sibling [f]) { head++ ; ASSERT (head < nn) ; ASSERT (f >= 0 && f < nn) ; } h = head ; ASSERT (head < nn) ; for (f = Child [i] ; f != EMPTY ; f = Sibling [f]) { ASSERT (h > 0) ; Stack [h--] = f ; AMD_DEBUG1 (("push "ID" on stack\n", f)) ; ASSERT (f >= 0 && f < nn) ; } ASSERT (Stack [h] == i) ; /* delete child list so that i gets ordered next time we see it */ Child [i] = EMPTY ; } else { /* the children of i (if there were any) are already ordered */ /* remove i from the stack and order it. Front i is kth front */ head-- ; AMD_DEBUG1 (("pop "ID" order "ID"\n", i, k)) ; Order [i] = k++ ; ASSERT (k <= nn) ; } #ifndef NDEBUG AMD_DEBUG1 (("\nStack:")) ; for (h = head ; h >= 0 ; h--) { Int j = Stack [h] ; AMD_DEBUG1 ((" "ID, j)) ; ASSERT (j >= 0 && j < nn) ; } AMD_DEBUG1 (("\n\n")) ; ASSERT (head < nn) ; #endif } return (k) ; } glpk-5.0/src/amd/amd_preprocess.c0000644000062000006210000001017713766346220016212 0ustar maomkpasswd/* ========================================================================= */ /* === AMD_preprocess ====================================================== */ /* ========================================================================= */ /* ------------------------------------------------------------------------- */ /* AMD, Copyright (c) Timothy A. Davis, */ /* Patrick R. Amestoy, and Iain S. Duff. See ../README.txt for License. */ /* email: davis at cise.ufl.edu CISE Department, Univ. of Florida. */ /* web: http://www.cise.ufl.edu/research/sparse/amd */ /* ------------------------------------------------------------------------- */ /* Sorts, removes duplicate entries, and transposes from the nonzero pattern of * a column-form matrix A, to obtain the matrix R. The input matrix can have * duplicate entries and/or unsorted columns (AMD_valid (n,Ap,Ai) must not be * AMD_INVALID). * * This input condition is NOT checked. This routine is not user-callable. */ #include "amd_internal.h" /* ========================================================================= */ /* === AMD_preprocess ====================================================== */ /* ========================================================================= */ /* AMD_preprocess does not check its input for errors or allocate workspace. * On input, the condition (AMD_valid (n,n,Ap,Ai) != AMD_INVALID) must hold. */ GLOBAL void AMD_preprocess ( Int n, /* input matrix: A is n-by-n */ const Int Ap [ ], /* size n+1 */ const Int Ai [ ], /* size nz = Ap [n] */ /* output matrix R: */ Int Rp [ ], /* size n+1 */ Int Ri [ ], /* size nz (or less, if duplicates present) */ Int W [ ], /* workspace of size n */ Int Flag [ ] /* workspace of size n */ ) { /* --------------------------------------------------------------------- */ /* local variables */ /* --------------------------------------------------------------------- */ Int i, j, p, p2 ; ASSERT (AMD_valid (n, n, Ap, Ai) != AMD_INVALID) ; /* --------------------------------------------------------------------- */ /* count the entries in each row of A (excluding duplicates) */ /* --------------------------------------------------------------------- */ for (i = 0 ; i < n ; i++) { W [i] = 0 ; /* # of nonzeros in row i (excl duplicates) */ Flag [i] = EMPTY ; /* Flag [i] = j if i appears in column j */ } for (j = 0 ; j < n ; j++) { p2 = Ap [j+1] ; for (p = Ap [j] ; p < p2 ; p++) { i = Ai [p] ; if (Flag [i] != j) { /* row index i has not yet appeared in column j */ W [i]++ ; /* one more entry in row i */ Flag [i] = j ; /* flag row index i as appearing in col j*/ } } } /* --------------------------------------------------------------------- */ /* compute the row pointers for R */ /* --------------------------------------------------------------------- */ Rp [0] = 0 ; for (i = 0 ; i < n ; i++) { Rp [i+1] = Rp [i] + W [i] ; } for (i = 0 ; i < n ; i++) { W [i] = Rp [i] ; Flag [i] = EMPTY ; } /* --------------------------------------------------------------------- */ /* construct the row form matrix R */ /* --------------------------------------------------------------------- */ /* R = row form of pattern of A */ for (j = 0 ; j < n ; j++) { p2 = Ap [j+1] ; for (p = Ap [j] ; p < p2 ; p++) { i = Ai [p] ; if (Flag [i] != j) { /* row index i has not yet appeared in column j */ Ri [W [i]++] = j ; /* put col j in row i */ Flag [i] = j ; /* flag row index i as appearing in col j*/ } } } #ifndef NDEBUG ASSERT (AMD_valid (n, n, Rp, Ri) == AMD_OK) ; for (j = 0 ; j < n ; j++) { ASSERT (W [j] == Rp [j+1]) ; } #endif } glpk-5.0/src/amd/amd_valid.c0000644000062000006210000000651513766346220015125 0ustar maomkpasswd/* ========================================================================= */ /* === AMD_valid =========================================================== */ /* ========================================================================= */ /* ------------------------------------------------------------------------- */ /* AMD, Copyright (c) Timothy A. Davis, */ /* Patrick R. Amestoy, and Iain S. Duff. See ../README.txt for License. */ /* email: davis at cise.ufl.edu CISE Department, Univ. of Florida. */ /* web: http://www.cise.ufl.edu/research/sparse/amd */ /* ------------------------------------------------------------------------- */ /* Check if a column-form matrix is valid or not. The matrix A is * n_row-by-n_col. The row indices of entries in column j are in * Ai [Ap [j] ... Ap [j+1]-1]. Required conditions are: * * n_row >= 0 * n_col >= 0 * nz = Ap [n_col] >= 0 number of entries in the matrix * Ap [0] == 0 * Ap [j] <= Ap [j+1] for all j in the range 0 to n_col. * Ai [0 ... nz-1] must be in the range 0 to n_row-1. * * If any of the above conditions hold, AMD_INVALID is returned. If the * following condition holds, AMD_OK_BUT_JUMBLED is returned (a warning, * not an error): * * row indices in Ai [Ap [j] ... Ap [j+1]-1] are not sorted in ascending * order, and/or duplicate entries exist. * * Otherwise, AMD_OK is returned. * * In v1.2 and earlier, this function returned TRUE if the matrix was valid * (now returns AMD_OK), or FALSE otherwise (now returns AMD_INVALID or * AMD_OK_BUT_JUMBLED). */ #include "amd_internal.h" GLOBAL Int AMD_valid ( /* inputs, not modified on output: */ Int n_row, /* A is n_row-by-n_col */ Int n_col, const Int Ap [ ], /* column pointers of A, of size n_col+1 */ const Int Ai [ ] /* row indices of A, of size nz = Ap [n_col] */ ) { Int nz, j, p1, p2, ilast, i, p, result = AMD_OK ; if (n_row < 0 || n_col < 0 || Ap == NULL || Ai == NULL) { return (AMD_INVALID) ; } nz = Ap [n_col] ; if (Ap [0] != 0 || nz < 0) { /* column pointers must start at Ap [0] = 0, and Ap [n] must be >= 0 */ AMD_DEBUG0 (("column 0 pointer bad or nz < 0\n")) ; return (AMD_INVALID) ; } for (j = 0 ; j < n_col ; j++) { p1 = Ap [j] ; p2 = Ap [j+1] ; AMD_DEBUG2 (("\nColumn: "ID" p1: "ID" p2: "ID"\n", j, p1, p2)) ; if (p1 > p2) { /* column pointers must be ascending */ AMD_DEBUG0 (("column "ID" pointer bad\n", j)) ; return (AMD_INVALID) ; } ilast = EMPTY ; for (p = p1 ; p < p2 ; p++) { i = Ai [p] ; AMD_DEBUG3 (("row: "ID"\n", i)) ; if (i < 0 || i >= n_row) { /* row index out of range */ AMD_DEBUG0 (("index out of range, col "ID" row "ID"\n", j, i)); return (AMD_INVALID) ; } if (i <= ilast) { /* row index unsorted, or duplicate entry present */ AMD_DEBUG1 (("index unsorted/dupl col "ID" row "ID"\n", j, i)); result = AMD_OK_BUT_JUMBLED ; } ilast = i ; } } return (result) ; } glpk-5.0/src/amd/COPYING0000644000062000006210000006362513766346220014101 0ustar maomkpasswd GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, 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 and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, 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 library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete 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 distribute a copy of this License along with the Library. 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 Library or any portion of it, thus forming a work based on the Library, 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) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, 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 Library, 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 Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you 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. If distribution of 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 satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be 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. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library 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. 9. 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 Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library 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 with this License. 11. 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 Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library 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 Library. 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. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library 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. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser 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 Library 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 Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, 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 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "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 LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. 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 LIBRARY 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 LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), 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 Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. 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 library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! glpk-5.0/src/amd/README0000644000062000006210000000461713766346220013722 0ustar maomkpasswdNOTE: Files in this subdirectory are NOT part of the GLPK package, but are used with GLPK. The original code was modified according to GLPK requirements by Andrew Makhorin . ************************************************************************ AMD Version 2.2, Copyright (C) 2007 by Timothy A. Davis, Patrick R. Amestoy, and Iain S. Duff. All Rights Reserved. Description: AMD is a set of routines for pre-ordering sparse matrices prior to Cholesky or LU factorization, using the approximate minimum degree ordering algorithm. Written in ANSI/ISO C with a MATLAB interface, and in Fortran 77. Authors: Timothy A. Davis (davis at cise.ufl.edu), University of Florida. Patrick R. Amestoy, ENSEEIHT, Toulouse, France. Iain S. Duff, Rutherford Appleton Laboratory, UK. AMD License: Your use or distribution of AMD or any modified version of AMD implies that you agree to this License. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. Permission is hereby granted to use or copy this program under the terms of the GNU LGPL, provided that the Copyright, this License, and the Availability of the original version is retained on all copies. User documentation of any code that uses this code or any modified version of this code must cite the Copyright, this License, the Availability note, and "Used by permission." Permission to modify the code and to distribute modified code is granted, provided the Copyright, this License, and the Availability note are retained, and a notice that the code was modified is included. AMD is available under alternate licences; contact T. Davis for details. Availability: http://www.cise.ufl.edu/research/sparse/amd glpk-5.0/src/api/0000755000062000006210000000000013766346220013042 5ustar maomkpasswdglpk-5.0/src/api/advbas.c0000644000062000006210000001154713766346220014456 0ustar maomkpasswd/* advbas.c (construct advanced initial LP basis) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2008-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "prob.h" #include "triang.h" /*********************************************************************** * NAME * * glp_adv_basis - construct advanced initial LP basis * * SYNOPSIS * * void glp_adv_basis(glp_prob *P, int flags); * * DESCRIPTION * * The routine glp_adv_basis constructs an advanced initial LP basis * for the specified problem object. * * The parameter flag is reserved for use in the future and should be * specified as zero. * * NOTE * * The routine glp_adv_basis should be called after the constraint * matrix has been scaled (if scaling is used). */ static int mat(void *info, int k, int ind[], double val[]) { glp_prob *P = info; int m = P->m; int n = P->n; GLPROW **row = P->row; GLPCOL **col = P->col; GLPAIJ *aij; int i, j, len; if (k > 0) { /* retrieve scaled row of constraint matrix */ i = +k; xassert(1 <= i && i <= m); len = 0; if (row[i]->type == GLP_FX) { for (aij = row[i]->ptr; aij != NULL; aij = aij->r_next) { j = aij->col->j; if (col[j]->type != GLP_FX) { len++; ind[len] = j; val[len] = aij->row->rii * aij->val * aij->col->sjj; } } } } else { /* retrieve scaled column of constraint matrix */ j = -k; xassert(1 <= j && j <= n); len = 0; if (col[j]->type != GLP_FX) { for (aij = col[j]->ptr; aij != NULL; aij = aij->c_next) { i = aij->row->i; if (row[i]->type == GLP_FX) { len++; ind[len] = i; val[len] = aij->row->rii * aij->val * aij->col->sjj; } } } } return len; } void glp_adv_basis(glp_prob *P, int flags) { int i, j, k, m, n, min_mn, size, *rn, *cn; char *flag; if (flags != 0) xerror("glp_adv_basis: flags = %d; invalid flags\n", flags); m = P->m; /* number of rows */ n = P->n; /* number of columns */ if (m == 0 || n == 0) { /* trivial case */ glp_std_basis(P); goto done; } xprintf("Constructing initial basis...\n"); /* allocate working arrays */ min_mn = (m < n ? m : n); rn = talloc(1+min_mn, int); cn = talloc(1+min_mn, int); flag = talloc(1+m, char); /* make the basis empty */ for (i = 1; i <= m; i++) { flag[i] = 0; glp_set_row_stat(P, i, GLP_NS); } for (j = 1; j <= n; j++) glp_set_col_stat(P, j, GLP_NS); /* find maximal triangular part of the constraint matrix; to prevent including non-fixed rows and fixed columns in the triangular part, such rows and columns are temporarily made empty by the routine mat */ #if 1 /* FIXME: tolerance */ size = triang(m, n, mat, P, 0.001, rn, cn); #endif xassert(0 <= size && size <= min_mn); /* include in the basis non-fixed structural variables, whose columns constitute the triangular part */ for (k = 1; k <= size; k++) { i = rn[k]; xassert(1 <= i && i <= m); flag[i] = 1; j = cn[k]; xassert(1 <= j && j <= n); glp_set_col_stat(P, j, GLP_BS); } /* include in the basis appropriate auxiliary variables, whose unity columns preserve triangular form of the basis matrix */ for (i = 1; i <= m; i++) { if (flag[i] == 0) { glp_set_row_stat(P, i, GLP_BS); if (P->row[i]->type != GLP_FX) size++; } } /* size of triangular part = (number of rows) - (number of basic fixed auxiliary variables) */ xprintf("Size of triangular part is %d\n", size); /* deallocate working arrays */ tfree(rn); tfree(cn); tfree(flag); done: return; } /* eof */ glpk-5.0/src/api/asnhall.c0000644000062000006210000001302213766346220014626 0ustar maomkpasswd/* asnhall.c (find bipartite matching of maximum cardinality) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2009-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "glpk.h" #include "mc21a.h" /*********************************************************************** * NAME * * glp_asnprob_hall - find bipartite matching of maximum cardinality * * SYNOPSIS * * int glp_asnprob_hall(glp_graph *G, int v_set, int a_x); * * DESCRIPTION * * The routine glp_asnprob_hall finds a matching of maximal cardinality * in the specified bipartite graph G. It uses a version of the Fortran * routine MC21A developed by I.S.Duff [1], which implements Hall's * algorithm [2]. * * RETURNS * * The routine glp_asnprob_hall returns the cardinality of the matching * found. However, if the specified graph is incorrect (as detected by * the routine glp_check_asnprob), the routine returns negative value. * * REFERENCES * * 1. I.S.Duff, Algorithm 575: Permutations for zero-free diagonal, ACM * Trans. on Math. Softw. 7 (1981), 387-390. * * 2. M.Hall, "An Algorithm for distinct representatives," Amer. Math. * Monthly 63 (1956), 716-717. */ int glp_asnprob_hall(glp_graph *G, int v_set, int a_x) { glp_vertex *v; glp_arc *a; int card, i, k, loc, n, n1, n2, xij; int *num, *icn, *ip, *lenr, *iperm, *pr, *arp, *cv, *out; if (v_set >= 0 && v_set > G->v_size - (int)sizeof(int)) xerror("glp_asnprob_hall: v_set = %d; invalid offset\n", v_set); if (a_x >= 0 && a_x > G->a_size - (int)sizeof(int)) xerror("glp_asnprob_hall: a_x = %d; invalid offset\n", a_x); if (glp_check_asnprob(G, v_set)) return -1; /* determine the number of vertices in sets R and S and renumber vertices in S which correspond to columns of the matrix; skip all isolated vertices */ num = xcalloc(1+G->nv, sizeof(int)); n1 = n2 = 0; for (i = 1; i <= G->nv; i++) { v = G->v[i]; if (v->in == NULL && v->out != NULL) n1++, num[i] = 0; /* vertex in R */ else if (v->in != NULL && v->out == NULL) n2++, num[i] = n2; /* vertex in S */ else { xassert(v->in == NULL && v->out == NULL); num[i] = -1; /* isolated vertex */ } } /* the matrix must be square, thus, if it has more columns than rows, extra rows will be just empty, and vice versa */ n = (n1 >= n2 ? n1 : n2); /* allocate working arrays */ icn = xcalloc(1+G->na, sizeof(int)); ip = xcalloc(1+n, sizeof(int)); lenr = xcalloc(1+n, sizeof(int)); iperm = xcalloc(1+n, sizeof(int)); pr = xcalloc(1+n, sizeof(int)); arp = xcalloc(1+n, sizeof(int)); cv = xcalloc(1+n, sizeof(int)); out = xcalloc(1+n, sizeof(int)); /* build the adjacency matrix of the bipartite graph in row-wise format (rows are vertices in R, columns are vertices in S) */ k = 0, loc = 1; for (i = 1; i <= G->nv; i++) { if (num[i] != 0) continue; /* vertex i in R */ ip[++k] = loc; v = G->v[i]; for (a = v->out; a != NULL; a = a->t_next) { xassert(num[a->head->i] != 0); icn[loc++] = num[a->head->i]; } lenr[k] = loc - ip[k]; } xassert(loc-1 == G->na); /* make all extra rows empty (all extra columns are empty due to the row-wise format used) */ for (k++; k <= n; k++) ip[k] = loc, lenr[k] = 0; /* find a row permutation that maximizes the number of non-zeros on the main diagonal */ card = mc21a(n, icn, ip, lenr, iperm, pr, arp, cv, out); #if 1 /* 18/II-2010 */ /* FIXED: if card = n, arp remains clobbered on exit */ for (i = 1; i <= n; i++) arp[i] = 0; for (i = 1; i <= card; i++) { k = iperm[i]; xassert(1 <= k && k <= n); xassert(arp[k] == 0); arp[k] = i; } #endif /* store solution, if necessary */ if (a_x < 0) goto skip; k = 0; for (i = 1; i <= G->nv; i++) { if (num[i] != 0) continue; /* vertex i in R */ k++; v = G->v[i]; for (a = v->out; a != NULL; a = a->t_next) { /* arp[k] is the number of matched column or zero */ if (arp[k] == num[a->head->i]) { xassert(arp[k] != 0); xij = 1; } else xij = 0; memcpy((char *)a->data + a_x, &xij, sizeof(int)); } } skip: /* free working arrays */ xfree(num); xfree(icn); xfree(ip); xfree(lenr); xfree(iperm); xfree(pr); xfree(arp); xfree(cv); xfree(out); return card; } /* eof */ glpk-5.0/src/api/asnlp.c0000644000062000006210000000714013766346220014325 0ustar maomkpasswd/* asnlp.c (convert assignment problem to LP) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2009-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "glpk.h" /*********************************************************************** * NAME * * glp_asnprob_lp - convert assignment problem to LP * * SYNOPSIS * * int glp_asnprob_lp(glp_prob *P, int form, glp_graph *G, int names, * int v_set, int a_cost); * * DESCRIPTION * * The routine glp_asnprob_lp builds an LP problem, which corresponds * to the assignment problem on the specified graph G. * * RETURNS * * If the LP problem has been successfully built, the routine returns * zero, otherwise, non-zero. */ int glp_asnprob_lp(glp_prob *P, int form, glp_graph *G, int names, int v_set, int a_cost) { glp_vertex *v; glp_arc *a; int i, j, ret, ind[1+2]; double cost, val[1+2]; if (!(form == GLP_ASN_MIN || form == GLP_ASN_MAX || form == GLP_ASN_MMP)) xerror("glp_asnprob_lp: form = %d; invalid parameter\n", form); if (!(names == GLP_ON || names == GLP_OFF)) xerror("glp_asnprob_lp: names = %d; invalid parameter\n", names); if (v_set >= 0 && v_set > G->v_size - (int)sizeof(int)) xerror("glp_asnprob_lp: v_set = %d; invalid offset\n", v_set); if (a_cost >= 0 && a_cost > G->a_size - (int)sizeof(double)) xerror("glp_asnprob_lp: a_cost = %d; invalid offset\n", a_cost); ret = glp_check_asnprob(G, v_set); if (ret != 0) goto done; glp_erase_prob(P); if (names) glp_set_prob_name(P, G->name); glp_set_obj_dir(P, form == GLP_ASN_MIN ? GLP_MIN : GLP_MAX); if (G->nv > 0) glp_add_rows(P, G->nv); for (i = 1; i <= G->nv; i++) { v = G->v[i]; if (names) glp_set_row_name(P, i, v->name); glp_set_row_bnds(P, i, form == GLP_ASN_MMP ? GLP_UP : GLP_FX, 1.0, 1.0); } if (G->na > 0) glp_add_cols(P, G->na); for (i = 1, j = 0; i <= G->nv; i++) { v = G->v[i]; for (a = v->out; a != NULL; a = a->t_next) { j++; if (names) { char name[50+1]; sprintf(name, "x[%d,%d]", a->tail->i, a->head->i); xassert(strlen(name) < sizeof(name)); glp_set_col_name(P, j, name); } ind[1] = a->tail->i, val[1] = +1.0; ind[2] = a->head->i, val[2] = +1.0; glp_set_mat_col(P, j, 2, ind, val); glp_set_col_bnds(P, j, GLP_DB, 0.0, 1.0); if (a_cost >= 0) memcpy(&cost, (char *)a->data + a_cost, sizeof(double)); else cost = 1.0; glp_set_obj_coef(P, j, cost); } } xassert(j == G->na); done: return ret; } /* eof */ glpk-5.0/src/api/asnokalg.c0000644000062000006210000001210113766346220015000 0ustar maomkpasswd/* asnokalg.c (solve assignment problem with out-of-kilter alg.) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2009-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "glpk.h" #include "okalg.h" int glp_asnprob_okalg(int form, glp_graph *G, int v_set, int a_cost, double *sol, int a_x) { /* solve assignment problem with out-of-kilter algorithm */ glp_vertex *v; glp_arc *a; int nv, na, i, k, *tail, *head, *low, *cap, *cost, *x, *pi, ret; double temp; if (!(form == GLP_ASN_MIN || form == GLP_ASN_MAX || form == GLP_ASN_MMP)) xerror("glp_asnprob_okalg: form = %d; invalid parameter\n", form); if (v_set >= 0 && v_set > G->v_size - (int)sizeof(int)) xerror("glp_asnprob_okalg: v_set = %d; invalid offset\n", v_set); if (a_cost >= 0 && a_cost > G->a_size - (int)sizeof(double)) xerror("glp_asnprob_okalg: a_cost = %d; invalid offset\n", a_cost); if (a_x >= 0 && a_x > G->a_size - (int)sizeof(int)) xerror("glp_asnprob_okalg: a_x = %d; invalid offset\n", a_x); if (glp_check_asnprob(G, v_set)) return GLP_EDATA; /* nv is the total number of nodes in the resulting network */ nv = G->nv + 1; /* na is the total number of arcs in the resulting network */ na = G->na + G->nv; /* allocate working arrays */ tail = xcalloc(1+na, sizeof(int)); head = xcalloc(1+na, sizeof(int)); low = xcalloc(1+na, sizeof(int)); cap = xcalloc(1+na, sizeof(int)); cost = xcalloc(1+na, sizeof(int)); x = xcalloc(1+na, sizeof(int)); pi = xcalloc(1+nv, sizeof(int)); /* construct the resulting network */ k = 0; /* (original arcs) */ for (i = 1; i <= G->nv; i++) { v = G->v[i]; for (a = v->out; a != NULL; a = a->t_next) { k++; tail[k] = a->tail->i; head[k] = a->head->i; low[k] = 0; cap[k] = 1; if (a_cost >= 0) memcpy(&temp, (char *)a->data + a_cost, sizeof(double)); else temp = 1.0; if (!(fabs(temp) <= (double)INT_MAX && temp == floor(temp))) { ret = GLP_EDATA; goto done; } cost[k] = (int)temp; if (form != GLP_ASN_MIN) cost[k] = - cost[k]; } } /* (artificial arcs) */ for (i = 1; i <= G->nv; i++) { v = G->v[i]; k++; if (v->out == NULL) tail[k] = i, head[k] = nv; else if (v->in == NULL) tail[k] = nv, head[k] = i; else xassert(v != v); low[k] = (form == GLP_ASN_MMP ? 0 : 1); cap[k] = 1; cost[k] = 0; } xassert(k == na); /* find minimal-cost circulation in the resulting network */ ret = okalg(nv, na, tail, head, low, cap, cost, x, pi); switch (ret) { case 0: /* optimal circulation found */ ret = 0; break; case 1: /* no feasible circulation exists */ ret = GLP_ENOPFS; break; case 2: /* integer overflow occured */ ret = GLP_ERANGE; goto done; case 3: /* optimality test failed (logic error) */ ret = GLP_EFAIL; goto done; default: xassert(ret != ret); } /* store solution components */ /* (objective function = the total cost) */ if (sol != NULL) { temp = 0.0; for (k = 1; k <= na; k++) temp += (double)cost[k] * (double)x[k]; if (form != GLP_ASN_MIN) temp = - temp; *sol = temp; } /* (arc flows) */ if (a_x >= 0) { k = 0; for (i = 1; i <= G->nv; i++) { v = G->v[i]; for (a = v->out; a != NULL; a = a->t_next) { k++; if (ret == 0) xassert(x[k] == 0 || x[k] == 1); memcpy((char *)a->data + a_x, &x[k], sizeof(int)); } } } done: /* free working arrays */ xfree(tail); xfree(head); xfree(low); xfree(cap); xfree(cost); xfree(x); xfree(pi); return ret; } /* eof */ glpk-5.0/src/api/ckasn.c0000644000062000006210000000442413766346220014311 0ustar maomkpasswd/* ckasn.c (check correctness of assignment problem data) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2009-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "glpk.h" /*********************************************************************** * NAME * * glp_check_asnprob - check correctness of assignment problem data * * SYNOPSIS * * int glp_check_asnprob(glp_graph *G, int v_set); * * RETURNS * * If the specified assignment problem data are correct, the routine * glp_check_asnprob returns zero, otherwise, non-zero. */ int glp_check_asnprob(glp_graph *G, int v_set) { glp_vertex *v; int i, k, ret = 0; if (v_set >= 0 && v_set > G->v_size - (int)sizeof(int)) xerror("glp_check_asnprob: v_set = %d; invalid offset\n", v_set); for (i = 1; i <= G->nv; i++) { v = G->v[i]; if (v_set >= 0) { memcpy(&k, (char *)v->data + v_set, sizeof(int)); if (k == 0) { if (v->in != NULL) { ret = 1; break; } } else if (k == 1) { if (v->out != NULL) { ret = 2; break; } } else { ret = 3; break; } } else { if (v->in != NULL && v->out != NULL) { ret = 4; break; } } } return ret; } /* eof */ glpk-5.0/src/api/ckcnf.c0000644000062000006210000000517113766346220014276 0ustar maomkpasswd/* ckcnf.c (check for CNF-SAT problem instance) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2010-2016 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "prob.h" int glp_check_cnfsat(glp_prob *P) { /* check for CNF-SAT problem instance */ int m = P->m; int n = P->n; GLPROW *row; GLPCOL *col; GLPAIJ *aij; int i, j, neg; #if 0 /* 04/IV-2016 */ if (P == NULL || P->magic != GLP_PROB_MAGIC) xerror("glp_check_cnfsat: P = %p; invalid problem object\n", P); #endif /* check columns */ for (j = 1; j <= n; j++) { col = P->col[j]; /* the variable should be binary */ if (!(col->kind == GLP_IV && col->type == GLP_DB && col->lb == 0.0 && col->ub == 1.0)) return 1; } /* objective function should be zero */ if (P->c0 != 0.0) return 2; for (j = 1; j <= n; j++) { col = P->col[j]; if (col->coef != 0.0) return 3; } /* check rows */ for (i = 1; i <= m; i++) { row = P->row[i]; /* the row should be of ">=" type */ if (row->type != GLP_LO) return 4; /* check constraint coefficients */ neg = 0; for (aij = row->ptr; aij != NULL; aij = aij->r_next) { /* the constraint coefficient should be +1 or -1 */ if (aij->val == +1.0) ; else if (aij->val == -1.0) neg++; else return 5; } /* the right-hand side should be (1 - neg), where neg is the number of negative constraint coefficients in the row */ if (row->lb != (double)(1 - neg)) return 6; } /* congratulations; this is CNF-SAT */ return 0; } /* eof */ glpk-5.0/src/api/cplex.c0000644000062000006210000012715713766346220014336 0ustar maomkpasswd/* cplex.c (CPLEX LP format routines) */ /*********************************************************************** * This code is part of GLPK (GNU Linear Programming Kit). * Copyright (C) 2009-2018 Free Software Foundation, Inc. * Written by Andrew Makhorin . * * GLPK is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPK is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public License * along with GLPK. If not, see . ***********************************************************************/ #include "env.h" #include "misc.h" #include "prob.h" #define xfprintf glp_format /*********************************************************************** * NAME * * glp_init_cpxcp - initialize CPLEX LP format control parameters * * SYNOPSIS * * void glp_init_cpxcp(glp_cpxcp *parm): * * The routine glp_init_cpxcp initializes control parameters used by * the CPLEX LP input/output routines glp_read_lp and glp_write_lp with * default values. * * Default values of the control parameters are stored in the glp_cpxcp * structure, which the parameter parm points to. */ void glp_init_cpxcp(glp_cpxcp *parm) { xassert(parm != NULL); return; } static void check_parm(const char *func, const glp_cpxcp *parm) { /* check control parameters */ xassert(func != NULL); xassert(parm != NULL); return; } /*********************************************************************** * NAME * * glp_read_lp - read problem data in CPLEX LP format * * SYNOPSIS * * int glp_read_lp(glp_prob *P, const glp_cpxcp *parm, const char * *fname); * * DESCRIPTION * * The routine glp_read_lp reads problem data in CPLEX LP format from * a text file. * * The parameter parm is a pointer to the structure glp_cpxcp, which * specifies control parameters used by the routine. If parm is NULL, * the routine uses default settings. * * The character string fname specifies a name of the text file to be * read. * * Note that before reading data the current content of the problem * object is completely erased with the routine glp_erase_prob. * * RETURNS * * If the operation was successful, the routine glp_read_lp returns * zero. Otherwise, it prints an error message and returns non-zero. */ struct csa { /* common storage area */ glp_prob *P; /* LP/MIP problem object */ const glp_cpxcp *parm; /* pointer to control parameters */ const char *fname; /* name of input CPLEX LP file */ glp_file *fp; /* stream assigned to input CPLEX LP file */ jmp_buf jump; /* label for go to in case of error */ int count; /* line count */ int c; /* current character or EOF */ int token; /* current token: */ #define T_EOF 0x00 /* end of file */ #define T_MINIMIZE 0x01 /* keyword 'minimize' */ #define T_MAXIMIZE 0x02 /* keyword 'maximize' */ #define T_SUBJECT_TO 0x03 /* keyword 'subject to' */ #define T_BOUNDS 0x04 /* keyword 'bounds' */ #define T_GENERAL 0x05 /* keyword 'general' */ #define T_INTEGER 0x06 /* keyword 'integer' */ #define T_BINARY 0x07 /* keyword 'binary' */ #define T_END 0x08 /* keyword 'end' */ #define T_NAME 0x09 /* symbolic name */ #define T_NUMBER 0x0A /* numeric constant */ #define T_PLUS 0x0B /* delimiter '+' */ #define T_MINUS 0x0C /* delimiter '-' */ #define T_COLON 0x0D /* delimiter ':' */ #define T_LE 0x0E /* delimiter '<=' */ #define T_GE 0x0F /* delimiter '>=' */ #define T_EQ 0x10 /* delimiter '=' */ char image[255+1]; /* image of current token */ int imlen; /* length of token image */ double value; /* value of numeric constant */ int n_max; /* length of the following five arrays (enlarged automatically, if necessary) */ int *ind; /* int ind[1+n_max]; */ double *val; /* double val[1+n_max]; */ char *flag; /* char flag[1+n_max]; */ /* working arrays used to construct linear forms */ double *lb; /* double lb[1+n_max]; */ double *ub; /* double ub[1+n_max]; */ /* lower and upper bounds of variables (columns) */ #if 1 /* 27/VII-2013 */ int lb_warn, ub_warn; /* warning 'lower/upper bound redefined' already issued */ #endif }; #define CHAR_SET "!\"#$%&()/,.;?@_`'{}|~" /* characters that may appear in symbolic names */ static void error(struct csa *csa, const char *fmt, ...) { /* print error message and terminate processing */ va_list arg; xprintf("%s:%d: ", csa->fname, csa->count); va_start(arg, fmt); xvprintf(fmt, arg); va_end(arg); longjmp(csa->jump, 1); /* no return */ } static void warning(struct csa *csa, const char *fmt, ...) { /* print warning message and continue processing */ va_list arg; xprintf("%s:%d: warning: ", csa->fname, csa->count); va_start(arg, fmt); xvprintf(fmt, arg); va_end(arg); return; } static void read_char(struct csa *csa) { /* read next character from input file */ int c; xassert(csa->c != EOF); if (csa->c == '\n') csa->count++; c = glp_getc(csa->fp); if (c < 0) { if (glp_ioerr(csa->fp)) error(csa, "read error - %s\n", get_err_msg()); else if (csa->c == '\n') { csa->count--; c = EOF; } else { warning(csa, "missing final end of line\n"); c = '\n'; } } else if (c == '\n') ; else if (isspace(c)) c = ' '; else if (iscntrl(c)) error(csa, "invalid control character 0x%02X\n", c); csa->c = c; return; } static void add_char(struct csa *csa) { /* append current character to current token */ if (csa->imlen == sizeof(csa->image)-1) error(csa, "token '%.15s...' too long\n", csa->image); csa->image[csa->imlen++] = (char)csa->c; csa->image[csa->imlen] = '\0'; read_char(csa); return; } static int the_same(char *s1, char *s2) { /* compare two character strings ignoring case sensitivity */ for (; *s1 != '\0'; s1++, s2++) { if (tolower((unsigned char)*s1) != tolower((unsigned char)*s2)) return 0; } return 1; } static void scan_token(struct csa *csa) { /* scan next token */ int flag; csa->token = -1; csa->image[0] = '\0'; csa->imlen = 0; csa->value = 0.0; loop: flag = 0; /* skip non-significant characters */ while (csa->c == ' ') read_char(csa); /* recognize and scan current token */ if (csa->c == EOF) csa->token = T_EOF; else if (csa->c == '\n') { read_char(csa); /* if the next character is letter, it may begin a keyword */ if (isalpha(csa->c)) { flag = 1; goto name; } goto loop; } else if (csa->c == '\\') { /* comment; ignore everything until end-of-line */ while (csa->c != '\n') read_char(csa); goto loop; } else if (isalpha(csa->c) || csa->c != '.' && strchr(CHAR_SET, csa->c) != NULL) name: { /* symbolic name */ csa->token = T_NAME; while (isalnum(csa->c) || strchr(CHAR_SET, csa->c) != NULL) add_char(csa); if (flag) { /* check for keyword */ if (the_same(csa->image, "minimize")) csa->token = T_MINIMIZE; else if (the_same(csa->image, "minimum")) csa->token = T_MINIMIZE; else if (the_same(csa->image, "min")) csa->token = T_MINIMIZE; else if (the_same(csa->image, "maximize")) csa->token = T_MAXIMIZE; else if (the_same(csa->image, "maximum")) csa->token = T_MAXIMIZE; else if (the_same(csa->image, "max")) csa->token = T_MAXIMIZE; else if (the_same(csa->image, "subject")) { if (csa->c == ' ') { read_char(csa); if (tolower(csa->c) == 't') { csa->token = T_SUBJECT_TO; csa->image[csa->imlen++] = ' '; csa->image[csa->imlen] = '\0'; add_char(csa); if (tolower(csa->c) != 'o') error(csa, "keyword 'subject to' incomplete\n"); add_char(csa); if (isalpha(csa->c)) error(csa, "keyword '%s%c...' not recognized\n", csa->image, csa->c); } } } else if (the_same(csa->image, "such")) { if (csa->c == ' ') { read_char(csa); if (tolower(csa->c) == 't') { csa->token = T_SUBJECT_TO; csa->image[csa->imlen++] = ' '; csa->image[csa->imlen] = '\0'; add_char(csa); if (tolower(csa->c) != 'h') err: error(csa, "keyword 'such that' incomplete\n"); add_char(csa); if (tolower(csa->c) != 'a') goto err; add_char(csa); if (tolower(csa->c) != 't') goto err; add_char(csa); if (isalpha(csa->c)) error(csa, "keyword '%s%c...' not recognized\n", csa->image, csa->c); } } } else if (the_same(csa->image, "st")) csa->token = T_SUBJECT_TO; else if (the_same(csa->image, "s.t.")) csa->token = T_SUBJECT_TO; else if (the_same(csa->image, "st.")) csa->token = T_SUBJECT_TO; else if (the_same(csa->image, "bounds")) csa->token = T_BOUNDS; else if (the_same(csa->image, "bound")) csa->token = T_BOUNDS; else if (the_same(csa->image, "general")) csa->token = T_GENERAL; else if (the_same(csa->image, "generals")) csa->token = T_GENERAL; else if (the_same(csa->image, "gen")) csa->token = T_GENERAL; else if (the_same(csa->image, "integer")) csa->token = T_INTEGER; else if (the_same(csa->image, "integers")) csa->token = T_INTEGER; else if (the_same(csa->image, "int")) csa->token = T_INTEGER; else if (the_same(csa->image, "binary")) csa->token = T_BINARY; else if (the_same(csa->image, "binaries")) csa->token = T_BINARY; else if (the_same(csa->image, "bin")) csa->token = T_BINARY; else if (the_same(csa->image, "end")) csa->token = T_END; } } else if (isdigit(csa->c) || csa->c == '.') { /* numeric constant */ csa->token = T_NUMBER; /* scan integer part */ while (isdigit(csa->c)) add_char(csa); /* scan optional fractional part (it is mandatory, if there is no integer part) */ if (csa->c == '.') { add_char(csa); if (csa->imlen == 1 && !isdigit(csa->c)) error(csa, "invalid use of decimal point\n"); while (isdigit(csa->c)) add_char(csa); } /* scan optional decimal exponent */ if (csa->c == 'e' || csa->c == 'E') { add_char(csa); if (csa->c == '+' || csa->c == '-') add_char(csa); if (!isdigit(csa->c)) error(csa, "numeric constant '%s' incomplete\n", csa->image); while (isdigit(csa->c)) add_char(csa); } /* convert the numeric constant to floating-point */ if (str2num(csa->image, &csa->value)) error(csa, "numeric constant '%s' out of range\n", csa->image); } else if (csa->c == '+') csa->token = T_PLUS, add_char(csa); else if (csa->c == '-') csa->token = T_MINUS, add_char(csa); else if (csa->c == ':') csa->token = T_COLON, add_char(csa); else if (csa->c == '<') { csa->token = T_LE, add_char(csa); if (csa->c == '=') add_char(csa); } else if (csa->c == '>') { csa->token = T_GE, add_char(csa); if (csa->c == '=') add_char(csa); } else if (csa->c == '=') { csa->token = T_EQ, add_char(csa); if (csa->c == '<') csa->token = T_LE, add_char(csa); else if (csa->c == '>') csa->token = T_GE, add_char(csa); } else error(csa, "character '%c' not recognized\n", csa->c); /* skip non-significant characters */ while (csa->c == ' ') read_char(csa); return; } static int find_col(struct csa *csa, char *name) { /* find column by its symbolic name */ int j; j = glp_find_col(csa->P, name); if (j == 0) { /* not found; create new column */ j = glp_add_cols(csa->P, 1); glp_set_col_name(csa->P, j, name); /* enlarge working arrays, if necessary */ if (csa->n_max < j) { int n_max = csa->n_max; int *ind = csa->ind; double *val = csa->val; char *flag = csa->flag; double *lb = csa->lb; double *ub = csa->ub; csa->n_max += csa->n_max; csa->ind = xcalloc(1+csa->n_max, sizeof(int)); memcpy(&csa->ind[1], &ind[1], n_max * sizeof(int)); xfree(ind); csa->val = xcalloc(1+csa->n_max, sizeof(double)); memcpy(&csa->val[1], &val[1], n_max * sizeof(double)); xfree(val); csa->flag = xcalloc(1+csa->n_max, sizeof(char)); memset(&csa->flag[1], 0, csa->n_max * sizeof(char)); memcpy(&csa->flag[1], &flag[1], n_max * sizeof(char)); xfree(flag); csa->lb = xcalloc(1+csa->n_max, sizeof(double)); memcpy(&csa->lb[1], &lb[1], n_max * sizeof(double)); xfree(lb); csa->ub = xcalloc(1+csa->n_max, sizeof(double)); memcpy(&csa->ub[1], &ub[1], n_max * sizeof(double)); xfree(ub); } csa->lb[j] = +DBL_MAX, csa->ub[j] = -DBL_MAX; } return j; } /*********************************************************************** * parse_linear_form - parse linear form * * This routine parses the linear form using the following syntax: * * ::= * ::= * ::= | * ::= | + | - | * + | - * * The routine returns the number of terms in the linear form. */ static int parse_linear_form(struct csa *csa) { int j, k, len = 0, newlen; double s, coef; loop: /* parse an optional sign */ if (csa->token == T_PLUS) s = +1.0, scan_token(csa); else if (csa->token == T_MINUS) s = -1.0, scan_token(csa); else s = +1.0; /* parse an optional coefficient */ if (csa->token == T_NUMBER) coef = csa->value, scan_token(csa); else coef = 1.0; /* parse a variable name */ if (csa->token != T_NAME) error(csa, "missing variable name\n"); /* find the corresponding column */ j = find_col(csa, csa->image); /* check if the variable is already used in the linear form */ if (csa->flag[j]) error(csa, "multiple use of variable '%s' not allowed\n", csa->image); /* add new term to the linear form */ len++, csa->ind[len] = j, csa->val[len] = s * coef; /* and mark that the variable is used in the linear form */ csa->flag[j] = 1; scan_token(csa); /* if the next token is a sign, there is another term */ if (csa->token == T_PLUS || csa->token == T_MINUS) goto loop; /* clear marks of the variables used in the linear form */ for (k = 1; k <= len; k++) csa->flag[csa->ind[k]] = 0; /* remove zero coefficients */ newlen = 0; for (k = 1; k <= len; k++) { if (csa->val[k] != 0.0) { newlen++; csa->ind[newlen] = csa->ind[k]; csa->val[newlen] = csa->val[k]; } } return newlen; } /*********************************************************************** * parse_objective - parse objective function * * This routine parses definition of the objective function using the * following syntax: * * ::= minimize | minimum | min | maximize | maximum | max * ::= | : * ::= */ static void parse_objective(struct csa *csa) { /* parse objective sense */ int k, len; /* parse the keyword 'minimize' or 'maximize' */ if (csa->token == T_MINIMIZE) glp_set_obj_dir(csa->P, GLP_MIN); else if (csa->token == T_MAXIMIZE) glp_set_obj_dir(csa->P, GLP_MAX); else xassert(csa != csa); scan_token(csa); /* parse objective name */ if (csa->token == T_NAME && csa->c == ':') { /* objective name is followed by a colon */ glp_set_obj_name(csa->P, csa->image); scan_token(csa); xassert(csa->token == T_COLON); scan_token(csa); } else { /* objective name is not specified; use default */ glp_set_obj_name(csa->P, "obj"); } /* parse linear form */ len = parse_linear_form(csa); for (k = 1; k <= len; k++) glp_set_obj_coef(csa->P, csa->ind[k], csa->val[k]); return; } /*********************************************************************** * parse_constraints - parse constraints section * * This routine parses the constraints section using the following * syntax: * * ::= | : * ::= < | <= | =< | > | >= | => | = * ::= | + | * - * ::= * * ::= subject to | such that | st | s.t. | st. * ::= | * */ static void parse_constraints(struct csa *csa) { int i, len, type; double s; /* parse the keyword 'subject to' */ xassert(csa->token == T_SUBJECT_TO); scan_token(csa); loop: /* create new row (constraint) */ i = glp_add_rows(csa->P, 1); /* parse row name */ if (csa->token == T_NAME && csa->c == ':') { /* row name is followed by a colon */ if (glp_find_row(csa->P, csa->image) != 0) error(csa, "constraint '%s' multiply defined\n", csa->image); glp_set_row_name(csa->P, i, csa->image); scan_token(csa); xassert(csa->token == T_COLON); scan_token(csa); } else { /* row name is not specified; use default */ char name[50]; sprintf(name, "r.%d", csa->count); glp_set_row_name(csa->P, i, name); } /* parse linear form */ len = parse_linear_form(csa); glp_set_mat_row(csa->P, i, len, csa->ind, csa->val); /* parse constraint sense */ if (csa->token == T_LE) type = GLP_UP, scan_token(csa); else if (csa->token == T_GE) type = GLP_LO, scan_token(csa); else if (csa->token == T_EQ) type = GLP_FX, scan_token(csa); else error(csa, "missing constraint sense\n"); /* parse right-hand side */ if (csa->token == T_PLUS) s = +1.0, scan_token(csa); else if (csa->token == T_MINUS) s = -1.0, scan_token(csa); else s = +1.0; if (csa->token != T_NUMBER) error(csa, "missing right-hand side\n"); glp_set_row_bnds(csa->P, i, type, s * csa->value, s * csa->value); /* the rest of the current line must be empty */ if (!(csa->c == '\n' || csa->c == EOF)) error(csa, "invalid symbol(s) beyond right-hand side\n"); scan_token(csa); /* if the next token is a sign, numeric constant, or a symbolic name, here is another constraint */ if (csa->token == T_PLUS || csa->token == T_MINUS || csa->token == T_NUMBER || csa->token == T_NAME) goto loop; return; } static void set_lower_bound(struct csa *csa, int j, double lb) { /* set lower bound of j-th variable */ if (csa->lb[j] != +DBL_MAX && !csa->lb_warn) { warning(csa, "lower bound of variable '%s' redefined\n", glp_get_col_name(csa->P, j)); csa->lb_warn = 1; } csa->lb[j] = lb; return; } static void set_upper_bound(struct csa *csa, int j, double ub) { /* set upper bound of j-th variable */ if (csa->ub[j] != -DBL_MAX && !csa->ub_warn) { warning(csa, "upper bound of variable '%s' redefined\n", glp_get_col_name(csa->P, j)); csa->ub_warn = 1; } csa->ub[j] = ub; return; } /*********************************************************************** * parse_bounds - parse bounds section * * This routine parses the bounds section using the following syntax: * * ::= * ::= infinity | inf * ::= | + | * - | + | - * ::= < | <= | =< * ::= > | >= | => * ::= | * | | * | = | free * ::= bounds | bound * ::= | * */ static void parse_bounds(struct csa *csa) { int j, lb_flag; double lb, s; /* parse the keyword 'bounds' */ xassert(csa->token == T_BOUNDS); scan_token(csa); loop: /* bound definition can start with a sign, numeric constant, or a symbolic name */ if (!(csa->token == T_PLUS || csa->token == T_MINUS || csa->token == T_NUMBER || csa->token == T_NAME)) goto done; /* parse bound definition */ if (csa->token == T_PLUS || csa->token == T_MINUS) { /* parse signed lower bound */ lb_flag = 1; s = (csa->token == T_PLUS ? +1.0 : -1.0); scan_token(csa); if (csa->token == T_NUMBER) lb = s * csa->value, scan_token(csa); else if (the_same(csa->image, "infinity") || the_same(csa->image, "inf")) { if (s > 0.0) error(csa, "invalid use of '+inf' as lower bound\n"); lb = -DBL_MAX, scan_token(csa); } else error(csa, "missing lower bound\n"); } else if (csa->token == T_NUMBER) { /* parse unsigned lower bound */ lb_flag = 1; lb = csa->value, scan_token(csa); } else { /* lower bound is not specified */ lb_flag = 0; } /* parse the token that should follow the lower bound */ if (lb_flag) { if (csa->token != T_LE) error(csa, "missing '<', '<=', or '=<' after lower bound\n") ; scan_token(csa); } /* parse variable name */ if (csa->token != T_NAME) error(csa, "missing variable name\n"); j = find_col(csa, csa->image); /* set lower bound */ if (lb_flag) set_lower_bound(csa, j, lb); scan_token(csa); /* parse the context that follows the variable name */ if (csa->token == T_LE) { /* parse upper bound */ scan_token(csa); if (csa->token == T_PLUS || csa->token == T_MINUS) { /* parse signed upper bound */ s = (csa->token == T_PLUS ? +1.0 : -1.0); scan_token(csa); if (csa->token == T_NUMBER) { set_upper_bound(csa, j, s * csa->value); scan_token(csa); } else if (the_same(csa->image, "infinity") || the_same(csa->image, "inf")) { if (s < 0.0) error(csa, "invalid use of '-inf' as upper bound\n"); set_upper_bound(csa, j, +DBL_MAX); scan_token(csa); } else error(csa, "missing upper bound\n"); } else if (csa->token == T_NUMBER) { /* parse unsigned upper bound */ set_upper_bound(csa, j, csa->value); scan_token(csa); } else error(csa, "missing upper bound\n"); } else if (csa->token == T_GE) { /* parse lower bound */ if (lb_flag) { /* the context '... <= x >= ...' is invalid */ error(csa, "invalid bound definition\n"); } scan_token(csa); if (csa->token == T_PLUS || csa->token == T_MINUS) { /* parse signed lower bound */ s = (csa->token == T_PLUS ? +1.0 : -1.0); scan_token(csa); if (csa->token == T_NUMBER) { set_lower_bound(csa, j, s * csa->value); scan_token(csa); } else if (the_same(csa->image, "infinity") || the_same(csa->image, "inf") == 0) { if (s > 0.0) error(csa, "invalid use of '+inf' as lower bound\n"); set_lower_bound(csa, j, -DBL_MAX); scan_token(csa); } else error(csa, "missing lower bound\n"); } else if (csa->token == T_NUMBER) { /* parse unsigned lower bound */ set_lower_bound(csa, j, csa->value); scan_token(csa); } else error(csa, "missing lower bound\n"); } else if (csa->token == T_EQ) { /* parse fixed value */ if (lb_flag) { /* the context '... <= x = ...' is invalid */ error(csa, "invalid bound definition\n"); } scan_token(csa); if (csa->token == T_PLUS || csa->token == T_MINUS) { /* parse signed fixed value */ s = (csa->token == T_PLUS ? +1.0 : -1.0); scan_token(csa); if (csa->token == T_NUMBER) { set_lower_bound(csa, j, s * csa->value); set_upper_bound(csa, j, s * csa->value); scan_token(csa); } else error(csa, "missing fixed value\n"); } else if (csa->token == T_NUMBER) { /* parse unsigned fixed value */ set_lower_bound(csa, j, csa->value); set_upper_bound(csa, j, csa->value); scan_token(csa); } else error(csa, "missing fixed value\n"); } else if (the_same(csa->image, "free")) { /* parse the keyword 'free' */ if (lb_flag) { /* the context '... <= x free ...' is invalid */ error(csa, "invalid bound definition\n"); } set_lower_bound(csa, j, -DBL_MAX); set_upper_bound(csa, j, +DBL_MAX); scan_token(csa); } else if (!lb_flag) { /* neither lower nor upper bounds are specified */ error(csa, "invalid bound definition\n"); } goto loop; done: return; } /*********************************************************************** * parse_integer - parse general, integer, or binary section * * ::= * ::= general | generals | gen * ::= integer | integers | int * ::= binary | binaries | bin *